smoosic 1.0.20 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/smoosic.js CHANGED
@@ -357,7 +357,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
357
357
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
358
358
 
359
359
  "use strict";
360
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiScoreViewOperations: () => (/* binding */ SuiScoreViewOperations)\n/* harmony export */ });\n/* harmony import */ var _scoreView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scoreView */ \"./src/render/sui/scoreView.ts\");\n/* harmony import */ var _smo_data_score__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/score */ \"./src/smo/data/score.ts\");\n/* harmony import */ var _smo_data_systemStaff__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../smo/data/systemStaff */ \"./src/smo/data/systemStaff.ts\");\n/* harmony import */ var _smo_data_partInfo__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../smo/data/partInfo */ \"./src/smo/data/partInfo.ts\");\n/* harmony import */ var _smo_data_measure__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../smo/data/measure */ \"./src/smo/data/measure.ts\");\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/data/common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../smo/data/scoreModifiers */ \"./src/smo/data/scoreModifiers.ts\");\n/* harmony import */ var _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../smo/data/scoreText */ \"./src/smo/data/scoreText.ts\");\n/* harmony import */ var _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../smo/data/noteModifiers */ \"./src/smo/data/noteModifiers.ts\");\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../smo/xform/undo */ \"./src/smo/xform/undo.ts\");\n/* harmony import */ var _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../smo/xform/operations */ \"./src/smo/xform/operations.ts\");\n/* harmony import */ var _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../common/serializationHelpers */ \"./src/common/serializationHelpers.js\");\n/* harmony import */ var _smo_data_music__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../smo/data/music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _audio_oscillator__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../audio/oscillator */ \"./src/render/audio/oscillator.ts\");\n/* harmony import */ var _smo_mxml_xmlToSmo__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../smo/mxml/xmlToSmo */ \"./src/smo/mxml/xmlToSmo.ts\");\n/* harmony import */ var _audio_player__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../audio/player */ \"./src/render/audio/player.ts\");\n/* harmony import */ var _ui_fileio_xhrLoader__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../ui/fileio/xhrLoader */ \"./src/ui/fileio/xhrLoader.ts\");\n/* harmony import */ var _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../smo/xform/selections */ \"./src/smo/xform/selections.ts\");\n/* harmony import */ var _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../smo/data/staffModifiers */ \"./src/smo/data/staffModifiers.ts\");\n/* harmony import */ var _piano__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./piano */ \"./src/render/sui/piano.ts\");\n/* harmony import */ var _svgHelpers__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../common/promiseHelpers */ \"./src/common/promiseHelpers.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\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 * MVVM-like operations on the displayed score.\n *\n * All operations that can be performed on a 'live' score go through this\n * module. It maps the score view to the actual score and makes sure the\n * model and view stay in sync.\n *\n * Because this object operates on the current selections,\n * all operations return promise so applications can wait for the\n * operation to complete and update the selection list.\n * @category SuiRender\n */\nclass SuiScoreViewOperations extends _scoreView__WEBPACK_IMPORTED_MODULE_0__.SuiScoreView {\n /**\n * Add a new text group to the score\n * @param textGroup a new text group\n * @returns\n */\n addTextGroup(textGroup) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const altNew = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_7__.SmoTextGroup.deserializePreserveId(textGroup.serialize());\n const isPartExposed = this.isPartExposed();\n let selector = (_a = textGroup.selector) !== null && _a !== void 0 ? _a : _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelector.default;\n const partInfo = this.score.staves[0].partInfo;\n const bufType = isPartExposed && partInfo.preserveTextGroups\n ? _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.PART_MODIFIER : _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.SCORE_MODIFIER;\n if (bufType === _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.PART_MODIFIER) {\n selector.staff = this.staffMap[0];\n }\n this.storeUndo.addBuffer('remove text group', bufType, selector, textGroup, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.ADD);\n if (isPartExposed && partInfo.preserveTextGroups) {\n this.score.staves[0].partInfo.updateTextGroup(textGroup, true);\n const partInfo = this.storeScore.staves[this._getEquivalentStaff(0)].partInfo;\n partInfo.updateTextGroup(altNew, true);\n }\n else {\n this.score.updateTextGroup(textGroup, true);\n this.storeScore.updateTextGroup(altNew, true);\n }\n yield this.renderer.rerenderTextGroups();\n });\n }\n /**\n * Remove the text group from the score\n * @param textGroup\n * @returns\n */\n removeTextGroup(textGroup) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n let selector = (_a = textGroup.selector) !== null && _a !== void 0 ? _a : _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelector.default;\n const partInfo = this.score.staves[0].partInfo;\n const isPartExposed = this.isPartExposed();\n const bufType = isPartExposed && partInfo.preserveTextGroups\n ? _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.PART_MODIFIER : _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.SCORE_MODIFIER;\n let ogText = this.storeScore.textGroups.find((tg) => tg.attrs.id === textGroup.attrs.id);\n if (isPartExposed && partInfo.preserveTextGroups) {\n ogText = partInfo.textGroups.find((tg) => tg.attrs.id === textGroup.attrs.id);\n }\n if (bufType === _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.PART_MODIFIER) {\n selector.staff = this.staffMap[0];\n }\n else {\n selector.staff = this.staffMap[selector.staff];\n }\n if (!ogText) {\n return;\n }\n this.storeUndo.addBuffer('remove text group', bufType, selector, ogText, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.REMOVE);\n const altGroup = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_7__.SmoTextGroup.deserializePreserveId(textGroup.serialize());\n textGroup.elements.forEach((el) => (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_5__.RemoveElementLike)(el));\n textGroup.elements = [];\n if (isPartExposed && partInfo.preserveTextGroups) {\n partInfo.updateTextGroup(textGroup, false);\n this.storeScore.staves[this._getEquivalentStaff(0)].partInfo.updateTextGroup(altGroup, false);\n }\n else {\n this.score.updateTextGroup(textGroup, false);\n this.storeScore.updateTextGroup(altGroup, false);\n }\n yield this.renderer.rerenderTextGroups();\n });\n }\n /**\n * UPdate an existing text group. The original is passed in, because since TG not tied to a musical\n * element, we need to find the one we're updating.\n * @param oldVersion\n * @param newVersion\n * @returns\n */\n updateTextGroup(newVersion) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const selector = (_a = newVersion.selector) !== null && _a !== void 0 ? _a : _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelector.default;\n const isPartExposed = this.isPartExposed();\n const partInfo = this.score.staves[0].partInfo;\n // Back up the original score text\n let ogtg = this.storeScore.textGroups.find((tg) => tg.attrs.id === newVersion.attrs.id);\n if (isPartExposed && partInfo.preserveTextGroups) {\n ogtg = partInfo.textGroups.find((tg) => tg.attrs.id === newVersion.attrs.id);\n }\n if (!ogtg) {\n // there is nothing to update, return.\n return;\n }\n if (ogtg) {\n const bufType = isPartExposed && partInfo.preserveTextGroups\n ? _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.PART_MODIFIER : _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.SCORE_MODIFIER;\n // if this is part text, make sure the undo buffer is associated with the part stave\n // in the full score, so undo works properly\n if (bufType === _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.PART_MODIFIER) {\n selector.staff = this.staffMap[0];\n }\n else {\n selector.staff = this.staffMap[selector.staff];\n }\n this.storeUndo.addBuffer('modify text', bufType, selector, ogtg, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.UPDATE);\n }\n const altNew = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_7__.SmoTextGroup.deserializePreserveId(newVersion.serialize());\n this.score.updateTextGroup(newVersion, true);\n // If this is part text, don't store it in the score text, except for the displayed score\n if (!isPartExposed) {\n this.storeScore.updateTextGroup(altNew, true);\n }\n else {\n this.storeScore.staves[this._getEquivalentStaff(0)].partInfo.updateTextGroup(altNew, true);\n }\n // TODO: only render the one TG.\n yield this.renderer.rerenderTextGroups();\n // return this.renderer.updatePromise();\n });\n }\n /**\n * load an mxml score remotely, return a promise that\n * completes when the file is loaded\n * @param url where to find the xml file\n * @returns\n */\n loadRemoteXml(url) {\n return __awaiter(this, void 0, void 0, function* () {\n const req = new _ui_fileio_xhrLoader__WEBPACK_IMPORTED_MODULE_17__.SuiXhrLoader(url);\n const self = this;\n // Shouldn't we return promise of actually displaying the score?\n yield req.loadAsync();\n const parser = new DOMParser();\n const xml = parser.parseFromString(req.value, 'text/xml');\n const score = _smo_mxml_xmlToSmo__WEBPACK_IMPORTED_MODULE_15__.XmlToSmo.convert(xml);\n score.layoutManager.zoomToWidth($('body').width());\n yield self.changeScore(score);\n });\n }\n /**\n * load a remote score in SMO format\n * @param url url to find the score\n * @returns\n */\n loadRemoteJson(url) {\n return __awaiter(this, void 0, void 0, function* () {\n const req = new _ui_fileio_xhrLoader__WEBPACK_IMPORTED_MODULE_17__.SuiXhrLoader(url);\n yield req.loadAsync();\n const score = _smo_data_score__WEBPACK_IMPORTED_MODULE_1__.SmoScore.deserialize(req.value);\n yield this.changeScore(score);\n });\n }\n /**\n * Load a remote score, return promise when it's been loaded\n * from afar.\n * @param pref\n * @returns\n */\n loadRemoteScore(url) {\n return __awaiter(this, void 0, void 0, function* () {\n if (url.endsWith('xml') || url.endsWith('mxl')) {\n return this.loadRemoteXml(url);\n }\n else {\n return this.loadRemoteJson(url);\n }\n });\n }\n updateAudioSettings(pref) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScorePreferences('Update preferences');\n this.score.audioSettings = pref;\n this.storeScore.audioSettings = new _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoAudioPlayerSettings(pref);\n // No rendering to be done\n return this.renderer.updatePromise();\n });\n }\n /**\n * Global settings that control how the score editor behaves\n * @param pref\n * @returns\n */\n updateScorePreferences(pref) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScorePreferences('Update preferences');\n const oldXpose = this.score.preferences.transposingScore;\n const curXpose = pref.transposingScore;\n this.score.updateScorePreferences(new _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoScorePreferences(pref));\n this.storeScore.updateScorePreferences(new _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoScorePreferences(pref));\n if (curXpose === false && oldXpose === true) {\n this.score.setNonTransposing();\n }\n else if (curXpose === true && oldXpose === false) {\n this.score.setTransposing();\n }\n this.renderer.setDirty();\n return this.renderer.updatePromise();\n });\n }\n /**\n * Update information about the score, composer etc.\n * @param scoreInfo\n * @returns\n */\n updateScoreInfo(scoreInfo) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScorePreferences('Update preferences');\n this.score.scoreInfo = scoreInfo;\n this.storeScore.scoreInfo = JSON.parse(JSON.stringify(scoreInfo));\n return this.renderer.updatePromise();\n });\n }\n addRemoveArpeggio(code) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.modifyCurrentSelections('add/remove addRemoveArpeggio', (score, selections) => {\n selections.forEach((sel) => {\n if (sel.note) {\n if (code === 'none') {\n sel.note.arpeggio = undefined;\n }\n else {\n sel.note.arpeggio = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoArpeggio({ type: code });\n }\n }\n });\n });\n });\n }\n /**\n * A clef change mid-measure (clefNote)\n * @param clef\n */\n addRemoveClefChange(clef) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.modifyCurrentSelections('add/remove addRemoveClefChange', (score, selections) => {\n selections.forEach((sel) => {\n const measureClef = sel.measure.clef;\n if (sel.note) {\n if (measureClef === clef.clef) {\n sel.note.clefNote = null;\n }\n else {\n sel.note.clefNote = clef;\n }\n }\n });\n });\n });\n }\n /**\n * Modify the dynamics assoicated with the specific selection\n * @param selection\n * @param dynamic\n * @returns\n */\n addDynamic(selection, dynamic) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.modifySelection('add dynamic', selection, (score, selections) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addDynamic(selections[0], dynamic);\n });\n });\n }\n /**\n * Remove dynamics from the selection\n * @param selection\n * @param dynamic\n * @returns\n */\n _removeDynamic(selection, dynamic) {\n return __awaiter(this, void 0, void 0, function* () {\n const equiv = this._getEquivalentSelection(selection);\n if (equiv !== null && equiv.note !== null) {\n const altModifiers = equiv.note.getModifiers('SmoDynamicText');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeDynamic(selection, dynamic);\n if (altModifiers.length) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeDynamic(equiv, altModifiers[0]);\n }\n }\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Remove dynamics from the current selection\n * @param dynamic\n * @returns\n */\n removeDynamic(dynamic) {\n return __awaiter(this, void 0, void 0, function* () {\n const sel = this.tracker.modifierSelections[0];\n if (!sel.selection) {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n this.tracker.selections = [sel.selection];\n this._undoFirstMeasureSelection('remove dynamic');\n this._removeDynamic(sel.selection, dynamic);\n this.renderer.addToReplaceQueue(sel.selection);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * we never really delete a note, but we will convert it into a rest and if it's\n * already a rest we will try to hide it.\n * Operates on current selections\n * */\n deleteNote() {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('delete note');\n this.tracker.selections.forEach((sel) => {\n if (sel.note) {\n const altSel = this._getEquivalentSelection(sel);\n // set the pitch to be a good position for the rest\n const pitch = JSON.parse(JSON.stringify(_smo_data_measure__WEBPACK_IMPORTED_MODULE_4__.SmoMeasure.defaultPitchForClef[sel.measure.clef]));\n const altPitch = JSON.parse(JSON.stringify(_smo_data_measure__WEBPACK_IMPORTED_MODULE_4__.SmoMeasure.defaultPitchForClef[altSel.measure.clef]));\n sel.note.pitches = [pitch];\n altSel.note.pitches = [altPitch];\n // If the note is a note, make it into a rest. If the note is a rest already,\n // make it invisible. If it is invisible already, make it back into a rest.\n if (sel.note.isRest() && !sel.note.isHidden()) {\n sel.note.makeHidden(true);\n altSel.note.makeHidden(true);\n }\n else {\n sel.note.clearArticulations();\n sel.note.makeRest();\n altSel.note.makeRest();\n altSel.note.clearArticulations();\n sel.note.makeHidden(false);\n altSel.note.makeHidden(false);\n }\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * The lyric editor moves around, so we can't depend on the tracker for the\n * correct selection. We get it directly from the editor.\n *\n * @param selector - the selector of the note with the lyric to remove\n * @param lyric - a copy of the lyric to remove. We use the verse, parser to identify it\n * @returns render promise\n */\n removeLyric(selector, lyric) {\n return __awaiter(this, void 0, void 0, function* () {\n const selection = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, selector);\n if (selection === null) {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n this._undoSelection('remove lyric', selection);\n selection.note.removeLyric(lyric);\n const equiv = this._getEquivalentSelection(selection);\n const storeLyric = equiv.note.getLyricForVerse(lyric.verse, lyric.parser);\n if (typeof (storeLyric) !== 'undefined') {\n equiv.note.removeLyric(lyric);\n }\n this.renderer.addToReplaceQueue(selection);\n lyric.deleted = true;\n yield this.renderer.updatePromise();\n });\n }\n /**\n * @param selector where to add or update the lyric\n * @param lyric a copy of the lyric to remove\n * @returns\n */\n addOrUpdateLyric(selector, lyric) {\n return __awaiter(this, void 0, void 0, function* () {\n const selection = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, selector);\n if (selection === null) {\n return;\n }\n this._undoSelection('update lyric', selection);\n selection.note.addLyric(lyric);\n const equiv = this._getEquivalentSelection(selection);\n const altLyric = _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoNoteModifierBase.deserialize(lyric.serialize());\n equiv.note.addLyric(altLyric);\n this.renderer.addToReplaceQueue(selection);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Delete all the notes for the currently selected voice\n * @returns\n */\n depopulateVoice() {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('depopulate voice');\n measureSelections.forEach((selection) => {\n const ix = selection.measure.getActiveVoice();\n if (ix !== 0) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.depopulateVoice(selection, ix);\n const equiv = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.depopulateVoice(equiv, ix);\n }\n });\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setActiveVoice(this.score, 0);\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Change the active voice in a multi-voice measure.\n * @param index\n * @returns\n */\n _changeActiveVoice(index) {\n const measuresToAdd = [];\n const measureSelections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections);\n measureSelections.forEach((measureSelection) => {\n if (index === measureSelection.measure.voices.length) {\n measuresToAdd.push(measureSelection);\n }\n });\n return measuresToAdd;\n }\n /**\n * Populate a new voice with default notes\n * @param index the voice to populate\n * @returns\n */\n populateVoice(index) {\n return __awaiter(this, void 0, void 0, function* () {\n const measuresToAdd = this._changeActiveVoice(index);\n if (measuresToAdd.length === 0) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setActiveVoice(this.score, index);\n this.tracker.selectActiveVoice();\n return this.renderer.updatePromise();\n }\n measuresToAdd.forEach((selection) => {\n this._undoSelection('popualteVoice', selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.populateVoice(selection, index);\n const equiv = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.populateVoice(equiv, index);\n });\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setActiveVoice(this.score, index);\n this._renderChangedMeasures(measuresToAdd);\n yield this.renderer.updatePromise();\n });\n }\n swapVoices(voice1, voice2) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.getSelectedMeasures();\n const altSelections = this._getEquivalentSelections(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.swapVoice(selections, voice1, voice2);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.swapVoice(altSelections, voice1, voice2);\n this._renderChangedMeasures(selections);\n });\n }\n /**\n * Assign an instrument to a set of measures\n * @param instrument the instrument to assign to the selections\n * @param selections\n * @returns\n */\n changeInstrument(instrument, selections) {\n return __awaiter(this, void 0, void 0, function* () {\n if (typeof (selections) === 'undefined') {\n selections = this.tracker.selections;\n }\n this._undoSelections('change instrument', selections);\n const altSelections = this._getEquivalentSelections(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.changeInstrument(instrument, selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.changeInstrument(instrument, altSelections);\n this._renderChangedMeasures(selections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Set the time signature for a selection\n * @param timeSignature actual time signature\n */\n setTimeSignature(timeSignature) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Set time signature');\n const selections = this.tracker.selections;\n const altSelections = this._getEquivalentSelections(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setTimeSignature(this.score, selections, timeSignature);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setTimeSignature(this.storeScore, altSelections, timeSignature);\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections));\n return this.renderer.updatePromise();\n });\n }\n /**\n * Move selected staff up or down in the score.\n * @param index direction to move\n * @returns\n */\n moveStaffUpDown(index) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('re-order staves');\n // Get staff to move\n const selection = this._getEquivalentSelection(this.tracker.selections[0]);\n // Make the move in the model, and reset the view so we can see the new\n // arrangement\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.moveStaffUpDown(this.storeScore, selection, index);\n this.viewAll();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Update the staff group for a score, which determines how the staves\n * are justified and bracketed\n * @param staffGroup\n */\n addOrUpdateStaffGroup(staffGroup) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('group staves');\n // Assume that the view is now set to full score\n this.score.addOrReplaceSystemGroup(staffGroup);\n this.storeScore.addOrReplaceSystemGroup(staffGroup);\n this.renderer.setDirty();\n yield this.renderer.updatePromise();\n });\n }\n updateTabStave(tabStave) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasuresBetween(this.score, tabStave.startSelector, tabStave.endSelector);\n const altSelections = this._getEquivalentSelections(selections);\n if (selections.length === 0) {\n return;\n }\n this._undoSelections('updateTabStave', selections);\n const staff = selections[0].selector.staff;\n const altStaff = altSelections[0].selector.staff;\n const altTabStave = new _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__.SmoTabStave(tabStave.serialize());\n altTabStave.startSelector.staff = altStaff;\n altTabStave.endSelector.staff = altStaff;\n altTabStave.attrs.id = tabStave.attrs.id;\n this.score.staves[staff].updateTabStave(tabStave);\n this.storeScore.staves[altStaff].updateTabStave(altTabStave);\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections));\n yield this.renderer.updatePromise();\n });\n }\n removeTabStave() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const altSelections = this._getEquivalentSelections(selections);\n if (selections.length === 0) {\n return;\n }\n this._undoSelections('updateTabStave', selections);\n const stavesToRemove = [];\n const altStavesToRemove = [];\n const added = {};\n selections.forEach((sel, ix) => {\n const altSel = altSelections[ix];\n const tabStave = sel.staff.getTabStaveForMeasure(sel.selector);\n const altTabStave = altSel.staff.getTabStaveForMeasure(altSel.selector);\n if (tabStave && altTabStave) {\n if (!added[tabStave.attrs.id]) {\n added[tabStave.attrs.id] = tabStave;\n stavesToRemove.push(tabStave);\n altStavesToRemove.push(altTabStave);\n }\n }\n });\n selections[0].staff.removeTabStaves(stavesToRemove);\n altSelections[0].staff.removeTabStaves(altStavesToRemove);\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections));\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Update tempo for all or part of the score\n * @param measure the measure with the tempo. Tempo is measure-wide parameter\n * @param scoreMode if true, update whole score. Else selections\n * @returns\n */\n updateTempoScore(measure, tempo, scoreMode, selectionMode) {\n return __awaiter(this, void 0, void 0, function* () {\n let measureIndex = 0;\n const originalTempo = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoTempoText(measure.tempo);\n this._undoColumn('update tempo', measure.measureNumber.measureIndex);\n let startMeasure = measure.measureNumber.measureIndex;\n let endMeasure = this.score.staves[0].measures.length;\n let displayed = false;\n if (selectionMode) {\n const endSel = this.tracker.getExtremeSelection(1);\n if (endSel.selector.measure > startMeasure) {\n endMeasure = endSel.selector.measure;\n }\n }\n // If we are only changing the position of the text, it only affects the tempo measure.\n if (_smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoTempoText.eq(originalTempo, tempo) && tempo.yOffset !== originalTempo.yOffset && endMeasure > startMeasure) {\n endMeasure = startMeasure + 1;\n }\n for (measureIndex = startMeasure; measureIndex < endMeasure; ++measureIndex) {\n if (!scoreMode && !selectionMode) {\n // If not whole score or selections, change until the tempo doesn't match previous measure's tempo (next tempo change)\n const compMeasure = this.score.staves[0].measures[measureIndex];\n if (_smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoTempoText.eq(originalTempo, compMeasure.tempo) || displayed === false) {\n const sel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.measureSelection(this.score, 0, measureIndex);\n const altSel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.measureSelection(this.storeScore, 0, measureIndex);\n if (sel && sel.measure.tempo.display && !displayed) {\n this.renderer.addToReplaceQueue(sel);\n displayed = true;\n }\n if (sel) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addTempo(this.score, sel, tempo);\n }\n if (altSel) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addTempo(this.storeScore, altSel, tempo);\n }\n }\n else {\n break;\n }\n }\n else {\n const sel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.measureSelection(this.score, 0, measureIndex);\n const altSel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.measureSelection(this.storeScore, 0, measureIndex);\n if (sel) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addTempo(this.score, sel, tempo);\n if (!displayed) {\n this.renderer.addToReplaceQueue(sel);\n displayed = true;\n }\n }\n if (altSel) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addTempo(this.storeScore, altSel, tempo);\n }\n }\n }\n yield this.renderer.updatePromise();\n });\n }\n updateTabNote(tabNote) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasuresBetween(this.score, this.tracker.getExtremeSelection(-1).selector, this.tracker.getExtremeSelection(1).selector);\n const altSelections = this._getEquivalentSelections(selections);\n this._undoSelections('updateTabNote', selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.updateTabNote(selections, tabNote);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.updateTabNote(altSelections, tabNote);\n this.renderer.addToReplaceQueue(selections);\n yield this.renderer.updatePromise();\n });\n }\n removeTabNote() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasuresBetween(this.score, this.tracker.getExtremeSelection(-1).selector, this.tracker.getExtremeSelection(1).selector);\n const altSelections = this._getEquivalentSelections(selections);\n this._undoSelections('updateTabNote', selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeTabNote(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeTabNote(altSelections);\n this.renderer.addToReplaceQueue(selections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * 'remove' tempo, which means either setting the bars to the\n * default tempo, or the previously-set tempo.\n * @param scoreMode whether to reset entire score\n */\n removeTempo(measure, tempo, scoreMode, selectionMode) {\n return __awaiter(this, void 0, void 0, function* () {\n const startSelection = this.tracker.selections[0];\n if (startSelection.selector.measure > 0) {\n const measureIx = startSelection.selector.measure - 1;\n const target = startSelection.staff.measures[measureIx];\n const tempo = target.getTempo();\n const newTempo = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoTempoText(tempo);\n newTempo.display = false;\n this.updateTempoScore(measure, newTempo, scoreMode, selectionMode);\n }\n else {\n this.updateTempoScore(measure, new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoTempoText(_smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoTempoText.defaults), scoreMode, selectionMode);\n }\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Add a grace note to the selected real notes.\n */\n addGraceNote() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('add grace note');\n selections.forEach((selection) => {\n const index = selection.note.getGraceNotes().length;\n const pitches = JSON.parse(JSON.stringify(selection.note.pitches));\n const grace = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoGraceNote({\n pitches, ticks: { numerator: 2048, denominator: 1, remainder: 0 }\n });\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addGraceNote(selection, grace, index);\n const altPitches = JSON.parse(JSON.stringify(selection.note.pitches));\n const altGrace = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoGraceNote({\n pitches: altPitches, ticks: { numerator: 2048, denominator: 1, remainder: 0 }\n });\n altGrace.attrs.id = grace.attrs.id;\n const altSelection = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addGraceNote(altSelection, altGrace, index);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * remove selected grace note\n * @returns\n */\n removeGraceNote() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('remove grace note');\n selections.forEach((selection) => {\n // TODO: get the correct offset\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeGraceNote(selection, 0);\n const altSel = (this._getEquivalentSelection(selection));\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeGraceNote(altSel, 0);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Toggle slash in stem of grace note\n */\n slashGraceNotes() {\n return __awaiter(this, void 0, void 0, function* () {\n const grace = this.tracker.getSelectedGraceNotes();\n const measureSelections = this.undoTrackerMeasureSelections('slash grace note toggle');\n grace.forEach((gn) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.slashGraceNotes(gn);\n if (gn.selection !== null) {\n const altSelection = this._getEquivalentSelection(gn.selection);\n const altGn = this._getEquivalentGraceNote(altSelection, gn.modifier);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.slashGraceNotes({\n selection: altSelection, modifier: altGn,\n box: _smo_data_common__WEBPACK_IMPORTED_MODULE_5__.SvgBox.default, index: 0\n });\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n transposeScore(offset) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('transpose score');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transposeScore(this.score, offset);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transposeScore(this.storeScore, offset);\n this.renderer.rerenderAll();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * transpose selected notes\n * @param offset 1/2 steps\n * @returns\n */\n transposeSelections(offset) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('transpose');\n const grace = this.tracker.getSelectedGraceNotes();\n if (grace.length) {\n grace.forEach((artifact) => {\n if (artifact.selection !== null && artifact.selection.note !== null) {\n const gn1 = artifact.modifier;\n const index = artifact.selection.note.graceNotes.findIndex((x) => x.attrs.id === gn1.attrs.id);\n const altSelection = this._getEquivalentSelection(artifact.selection);\n if (altSelection && altSelection.note !== null) {\n const gn2 = altSelection.note.graceNotes[index];\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transposeGraceNotes(altSelection, [gn2], offset);\n }\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transposeGraceNotes(artifact.selection, [gn1], offset);\n }\n });\n }\n else {\n selections.forEach((selected) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transpose(selected, offset);\n const altSel = this._getEquivalentSelection(selected);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transpose(altSel, offset);\n });\n if (selections.length === 1 && this.score.preferences.autoPlay) {\n _audio_oscillator__WEBPACK_IMPORTED_MODULE_14__.SuiOscillator.playSelectionNow(selections[0], this.score, 1);\n }\n }\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * toggle the accidental spelling of the selected notes\n * @returns\n */\n toggleEnharmonic() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('toggle enharmonic');\n const grace = this.tracker.getSelectedGraceNotes();\n if (grace.length) {\n grace.forEach((artifact) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleGraceNoteEnharmonic(artifact.selection, [artifact.modifier]);\n const altSelection = this._getEquivalentSelection(artifact.selection);\n const altGr = this._getEquivalentGraceNote(altSelection, artifact.modifier);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleGraceNoteEnharmonic(altSelection, [altGr]);\n });\n }\n else {\n selections.forEach((selected) => {\n if (typeof (selected.selector.pitches) === 'undefined') {\n selected.selector.pitches = [];\n }\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleEnharmonic(selected);\n const altSel = this._getEquivalentSelection(selected);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleEnharmonic(altSel);\n });\n }\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Toggle cautionary/courtesy accidentals\n */\n toggleCourtesyAccidentals() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('toggle courtesy accidental');\n const grace = this.tracker.getSelectedGraceNotes();\n if (grace.length) {\n grace.forEach((artifact) => {\n const gn1 = [artifact.modifier];\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleGraceNoteCourtesy(artifact.selection, gn1);\n const altSel = this._getEquivalentSelection(artifact.selection);\n const gn2 = this._getEquivalentGraceNote(altSel, gn1[0]);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleGraceNoteCourtesy(altSel, [gn2]);\n });\n }\n else {\n selections.forEach((selection) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleCourtesyAccidental(selection);\n const altSel = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleCourtesyAccidental(altSel);\n });\n }\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * change the duration of notes for selected, creating more\n * or fewer notes.\n * After the change, reset the selection so it's as close as possible\n * to the original length\n * @param operation\n * @returns\n */\n batchDurationOperation(operation) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('change duration');\n const grace = this.tracker.getSelectedGraceNotes();\n const graceMap = {\n doubleDuration: 'doubleGraceNoteDuration',\n halveDuration: 'halveGraceNoteDuration'\n };\n if (grace.length && typeof (graceMap[operation]) !== 'undefined') {\n operation = graceMap[operation];\n grace.forEach((artifact) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation[operation](artifact.selection, artifact.modifier);\n const altSelection = this._getEquivalentSelection(artifact.selection);\n const gn2 = this._getEquivalentGraceNote(altSelection, artifact.modifier);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation[operation](altSelection, gn2);\n });\n }\n else {\n const altAr = this._getEquivalentSelections(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.batchSelectionOperation(this.score, selections, operation);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.batchSelectionOperation(this.storeScore, altAr, operation);\n }\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Toggle selected modifier on selected notes\n * @param modifier\n * @param ctor parent class constructor (e.g. SmoOrnament)\n * @returns\n */\n toggleArticulation(modifier, ctor) {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('toggle articulation');\n this.tracker.selections.forEach((sel) => {\n if (ctor === 'SmoArticulation') {\n const aa = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoArticulation({ articulation: modifier });\n const altAa = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoArticulation({ articulation: modifier });\n altAa.attrs.id = aa.attrs.id;\n if (sel.note) {\n sel.note.toggleArticulation(aa);\n }\n const altSelection = this._getEquivalentSelection(sel);\n if (altSelection && altSelection.note) {\n altSelection.note.toggleArticulation(altAa);\n }\n }\n else {\n const aa = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoOrnament({ ornament: modifier });\n const altAa = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoOrnament({ ornament: modifier });\n altAa.attrs.id = aa.attrs.id;\n const altSelection = this._getEquivalentSelection(sel);\n if (sel.note) {\n sel.note.toggleOrnament(aa);\n }\n if (altSelection && altSelection.note) {\n altSelection.note.toggleOrnament(altAa);\n }\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n setArticulation(modifier, set) {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('set articulation');\n this.tracker.selections.forEach((sel) => {\n const altAa = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoArticulation(modifier);\n if (sel.note) {\n sel.note.setArticulation(modifier, set);\n }\n const altSelection = this._getEquivalentSelection(sel);\n if (altSelection && altSelection.note) {\n altSelection.note.toggleArticulation(altAa);\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n setOrnament(modifier, set) {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('set articulation');\n this.tracker.selections.forEach((sel) => {\n const altAa = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoOrnament(modifier);\n if (sel.note) {\n sel.note.setOrnament(modifier, set);\n }\n const altSelection = this._getEquivalentSelection(sel);\n if (altSelection && altSelection.note) {\n altSelection.note.setOrnament(altAa, set);\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * convert non-tuplet not to a tuplet\n * @param params\n */\n makeTuplet(params) {\n return __awaiter(this, void 0, void 0, function* () {\n const selection = this.tracker.selections[0];\n const measureSelections = this.undoTrackerMeasureSelections('make tuplet');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.makeTuplet(selection, params);\n const altSelection = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.makeTuplet(altSelection, params);\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Convert selected tuplet to a single (if possible) non-tuplet\n */\n unmakeTuplet() {\n return __awaiter(this, void 0, void 0, function* () {\n const selection = this.tracker.selections[0];\n const measureSelections = this.undoTrackerMeasureSelections('unmake tuplet');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.unmakeTuplet(selection);\n const altSelection = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.unmakeTuplet(altSelection);\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Create a chord by adding an interval to selected note\n * @param interval 1/2 steps\n * @returns\n */\n setInterval(interval) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('set interval');\n selections.forEach((selected) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.interval(selected, interval);\n const altSelection = this._getEquivalentSelection(selected);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.interval(altSelection, interval);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * change the selected chord into a single note\n * @returns\n */\n collapseChord() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('collapse chord');\n selections.forEach((selected) => {\n const note = selected.note;\n if (note) {\n const pp = JSON.parse(JSON.stringify(note.pitches[0]));\n const altpp = JSON.parse(JSON.stringify(note.pitches[0]));\n // No operation for this?\n note.pitches = [pp];\n const altSelection = this._getEquivalentSelection(selected);\n altSelection.note.pitches = [altpp];\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Toggle chicken-scratches, for jazz improv, comping etc.\n */\n toggleSlash() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('make slash');\n selections.forEach((selection) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleSlash(selection);\n const altSel = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleSlash(altSel);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * make selected notes into a rest, or visa-versa\n * @returns\n */\n makeRest() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('make rest');\n selections.forEach((selection) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleRest(selection);\n const altSel = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleRest(altSel);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n clearAllBeams() {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('clearAllBeams');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.clearAllBeamGroups(this.score);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.clearAllBeamGroups(this.storeScore);\n yield this.awaitRender();\n });\n }\n clearSelectedBeams() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measures = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(selections);\n const altSelections = this._getEquivalentSelections(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.clearBeamGroups(this.score, selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.clearBeamGroups(this.storeScore, altSelections);\n this._renderChangedMeasures(measures);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * toggle the 'end beam' flag for selected notes\n * @returns\n */\n unbeamSelections() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('toggle beam group');\n selections.forEach((selection) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.unbeamSelections(selection);\n const altSel = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.unbeamSelections(altSel);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n toggleCue() {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('toggle note cue');\n this.tracker.selections.forEach((selection) => {\n const altSelection = this._getEquivalentSelection(selection);\n if (selection.note && selection.note.isRest() === false) {\n selection.note.isCue = !selection.note.isCue;\n if (altSelection && altSelection.note) {\n altSelection.note.isCue = selection.note.isCue;\n }\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * up or down\n * @returns\n */\n toggleBeamDirection() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n if (selections.length < 1) {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n const measureSelections = this.undoTrackerMeasureSelections('toggle beam direction');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleBeamDirection(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleBeamDirection(this._getEquivalentSelections(selections));\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Add the selected notes to a beam group\n */\n beamSelections() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('beam selections');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.beamSelections(this.score, selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.beamSelections(this.storeScore, this._getEquivalentSelections(selections));\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * change key signature for selected measures\n * @param keySignature vex key signature\n */\n addKeySignature(keySignature) {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('set key signature ' + keySignature);\n measureSelections.forEach((sel) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addKeySignature(this.score, sel, keySignature);\n const altSel = this._getEquivalentSelection(sel);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addKeySignature(this.storeScore, altSel, keySignature);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Sets a pitch from the piano widget.\n * @param pitch {Pitch}\n * @param chordPedal {boolean} - indicates we are adding to a chord\n */\n setPitchPiano(pitch, chordPedal) {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('setAbsolutePitch ' + pitch.letter + '/' + pitch.accidental);\n this.tracker.selections.forEach((selected) => {\n const npitch = {\n letter: pitch.letter,\n accidental: pitch.accidental, octave: pitch.octave\n };\n const octave = _smo_data_measure__WEBPACK_IMPORTED_MODULE_4__.SmoMeasure.defaultPitchForClef[selected.measure.clef].octave;\n npitch.octave += octave;\n const altSel = this._getEquivalentSelection(selected);\n if (chordPedal && selected.note) {\n selected.note.toggleAddPitch(npitch);\n altSel.note.toggleAddPitch(npitch);\n }\n else {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setPitch(selected, [npitch]);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setPitch(altSel, [npitch]);\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * show or hide the piano widget\n * @param value to show it\n */\n showPiano(value) {\n return __awaiter(this, void 0, void 0, function* () {\n this.score.preferences.showPiano = value;\n this.storeScore.preferences.showPiano = value;\n if (value) {\n _piano__WEBPACK_IMPORTED_MODULE_20__.SuiPiano.showPiano();\n }\n else {\n _piano__WEBPACK_IMPORTED_MODULE_20__.SuiPiano.hidePiano();\n }\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Render a pitch for each letter name-pitch in the string,\n * @param pitches letter names for pitches\n * @returns promise, resolved when all pitches rendered\n * @see setPitch\n */\n setPitchesPromise(pitches) {\n return __awaiter(this, void 0, void 0, function* () {\n const self = this;\n const promise = new Promise((resolve) => {\n const fc = (index) => __awaiter(this, void 0, void 0, function* () {\n if (index >= pitches.length) {\n resolve();\n }\n else {\n yield self.setPitch(pitches[index]);\n fc(index + 1);\n }\n });\n fc(0);\n });\n yield promise;\n });\n }\n /**\n * Add a pitch to the score at the cursor. This tries to find the best pitch\n * to match the letter key (F vs F# for instance) based on key and surrounding notes\n * @param letter string\n */\n setPitch(letter) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('set pitch ' + letter);\n selections.forEach((selected) => {\n const selector = selected.selector;\n let hintSel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.lastNoteSelectionNonRest(this.score, selector.staff, selector.measure, selector.voice, selector.tick);\n if (!hintSel) {\n hintSel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.nextNoteSelectionNonRest(this.score, selector.staff, selector.measure, selector.voice, selector.tick);\n }\n // The selection no longer exists, possibly deleted\n if (hintSel === null || hintSel.note === null) {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n const pitch = _smo_data_music__WEBPACK_IMPORTED_MODULE_13__.SmoMusic.getLetterNotePitch(hintSel.note.pitches[0], letter, hintSel.measure.keySignature);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setPitch(selected, [pitch]);\n const altSel = this._getEquivalentSelection(selected);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setPitch(altSel, [pitch]);\n if (this.score.preferences.autoAdvance) {\n // Don't play the next note and the added pitch at the same time.\n this.tracker.deferNextAutoPlay();\n this.tracker.moveSelectionRight();\n }\n });\n if (selections.length === 1 && this.score.preferences.autoPlay) {\n _audio_oscillator__WEBPACK_IMPORTED_MODULE_14__.SuiOscillator.playSelectionNow(selections[0], this.score, 1);\n }\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Generic clipboard copy action\n */\n copy() {\n return __awaiter(this, void 0, void 0, function* () {\n const altAr = [];\n this.tracker.selections.forEach((sel) => {\n const noteSelection = this._getEquivalentSelection(sel);\n if (noteSelection !== null) {\n altAr.push(noteSelection);\n }\n });\n this.storePaste.setSelections(this.storeScore, altAr);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * clipboard paste action\n * @returns\n */\n paste() {\n return __awaiter(this, void 0, void 0, function* () {\n // We undo the whole score on a paste, since we don't yet know the\n // extent of the overlap\n this.renderer.preserveScroll();\n const selections = this.getPasteMeasureList();\n const firstSelection = selections[0];\n const measureEnd = selections[selections.length - 1].selector.measure;\n const measureRange = [firstSelection.selector.measure, measureEnd];\n this.storeUndo.grouping = true;\n // Undo the paste by selecting all the affected measures\n for (let i = measureRange[0]; i <= measureRange[1]; ++i) {\n this._undoColumn('paste', i);\n this.renderer.unrenderColumn(this.score.staves[0].measures[i]);\n }\n this.storeUndo.grouping = false;\n const altSelection = this._getEquivalentSelection(firstSelection);\n const altTarget = altSelection.selector;\n altTarget.tick = this.tracker.selections[0].selector.tick;\n // paste the clipboard into the destination\n this.storePaste.pasteSelections(altTarget);\n // Refresh those measures.\n this.replaceMeasureView(measureRange);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Paste only the chords.\n */\n pasteChords() {\n return __awaiter(this, void 0, void 0, function* () {\n // We undo the whole score on a paste, since we don't yet know the\n // extent of the overlap\n this.renderer.preserveScroll();\n const selections = this.getPasteMeasureList();\n const firstSelection = selections[0];\n const measureEnd = selections[selections.length - 1].selector.measure;\n const measureRange = [firstSelection.selector.measure, measureEnd];\n this.storeUndo.grouping = true;\n // Undo the paste by selecting all the affected measures\n for (let i = measureRange[0]; i <= measureRange[1]; ++i) {\n this._undoColumn('paste', i);\n this.renderer.unrenderColumn(this.score.staves[0].measures[i]);\n }\n this.storeUndo.grouping = false;\n const altSelection = this._getEquivalentSelection(firstSelection);\n const altTarget = altSelection.selector;\n altTarget.tick = this.tracker.selections[0].selector.tick;\n this.storePaste.pasteChords(altTarget);\n // Refresh those measures.\n this.replaceMeasureView(measureRange);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * specify a note head other than the default for the duration\n * @param head\n */\n setNoteHead(head) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.modifyCurrentSelections('set note head', (score, selections) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setNoteHead(selections, head);\n });\n });\n }\n /**\n * Add a volta for selected measures\n */\n addEnding() {\n return __awaiter(this, void 0, void 0, function* () {\n // TODO: we should have undo for columns\n this._undoScore('Add Volta');\n const ft = this.tracker.getExtremeSelection(-1);\n const tt = this.tracker.getExtremeSelection(1);\n const params = _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoVolta.defaults;\n params.startBar = ft.selector.measure;\n params.endBar = tt.selector.measure;\n params.number = 1;\n const volta = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoVolta(params);\n const altVolta = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoVolta(params);\n this._renderChangedMeasures([ft, tt]);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addEnding(this.storeScore, altVolta);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addEnding(this.score, volta);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * @param ending volta settings\n * @returns\n */\n updateEnding(ending) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Change Volta');\n ending.elements.forEach((el) => {\n $(el).find('g.' + ending.attrs.id).remove();\n });\n ending.elements = [];\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeEnding(this.storeScore, ending);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeEnding(this.score, ending);\n const altVolta = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoVolta(ending);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addEnding(this.storeScore, altVolta);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addEnding(this.score, ending);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n *\n * @param ending volta to remove\n * @returns\n */\n removeEnding(ending) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Remove Volta');\n ending.elements.forEach((el) => {\n $(el).find('g.' + ending.attrs.id).remove();\n });\n ending.elements = [];\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeEnding(this.storeScore, ending);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeEnding(this.score, ending);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n *\n * @param position begin or end\n * @param barline barline type\n * @returns\n */\n setBarline(position, barline) {\n return __awaiter(this, void 0, void 0, function* () {\n const obj = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoBarline({ position, barline });\n const altObj = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoBarline({ position, barline });\n const selection = this.tracker.selections[0];\n this._undoColumn('set barline', selection.selector.measure);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureBarline(this.score, selection, obj);\n const altSel = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureBarline(this.storeScore, altSel, altObj);\n this._renderChangedMeasures([selection]);\n return this.renderer.updatePromise();\n });\n }\n /**\n *\n * @param position start or end\n * @param symbol coda, etc.\n */\n setRepeatSymbol(position, symbol) {\n return __awaiter(this, void 0, void 0, function* () {\n const params = _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRepeatSymbol.defaults;\n params.position = position;\n params.symbol = symbol;\n const obj = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRepeatSymbol(params);\n const altObj = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRepeatSymbol(params);\n const selection = this.tracker.selections[0];\n this._undoColumn('set repeat symbol', selection.selector.measure);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setRepeatSymbol(this.score, selection, obj);\n const altSel = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setRepeatSymbol(this.storeScore, altSel, altObj);\n this._renderChangedMeasures([selection]);\n return this.renderer.updatePromise();\n });\n }\n /**\n * toggle rehearsal mark on first selected measure\n * @returns\n */\n toggleRehearsalMark() {\n return __awaiter(this, void 0, void 0, function* () {\n const selection = this.tracker.getExtremeSelection(-1);\n const altSelection = this._getEquivalentSelection(selection);\n const cmd = selection.measure.getRehearsalMark() ? 'removeRehearsalMark' : 'addRehearsalMark';\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation[cmd](this.score, selection, new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRehearsalMark(_smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRehearsalMark.defaults));\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation[cmd](this.storeScore, altSelection, new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRehearsalMark(_smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRehearsalMark.defaults));\n this._renderChangedMeasures([selection]);\n return this.renderer.updatePromise();\n });\n }\n _removeStaffModifier(modifier) {\n this.score.staves[modifier.associatedStaff].removeStaffModifier(modifier);\n const altModifier = _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__.StaffModifierBase.deserialize(modifier.serialize());\n altModifier.attrs.id = modifier.attrs.id;\n altModifier.startSelector = this._getEquivalentSelector(altModifier.startSelector);\n altModifier.endSelector = this._getEquivalentSelector(altModifier.endSelector);\n this.storeScore.staves[this._getEquivalentStaff(modifier.associatedStaff)].removeStaffModifier(altModifier);\n }\n /**\n * Remove selected modifier\n * @param modifier slur, hairpin, etc.\n * @returns\n */\n removeStaffModifier(modifier) {\n return __awaiter(this, void 0, void 0, function* () {\n this.undoStaffModifier('Set measure proportion', modifier, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.REMOVE);\n this._removeStaffModifier(modifier);\n this._renderRectangle(modifier.startSelector, modifier.endSelector);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Change a staff modifier\n * @param original original version\n * @param modifier modified version\n * @returns\n */\n addOrUpdateStaffModifier(original, modifier) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!modifier) {\n if (original) {\n // Handle legacy API changed\n modifier = _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__.StaffModifierBase.deserialize(original);\n }\n else {\n console.warn('update modifier: bad modifier');\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n }\n const existing = this.score.staves[modifier.startSelector.staff]\n .getModifier(modifier);\n const subtype = existing === null ? _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.ADD :\n _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.UPDATE;\n this.undoStaffModifier('Set measure proportion', original, subtype);\n this._removeStaffModifier(modifier);\n const copy = _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__.StaffModifierBase.deserialize(modifier.serialize());\n copy.startSelector = this._getEquivalentSelector(copy.startSelector);\n copy.endSelector = this._getEquivalentSelector(copy.endSelector);\n const sel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, modifier.startSelector);\n if (sel !== null) {\n const altSel = this._getEquivalentSelection(sel);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addStaffModifier(sel, modifier);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addStaffModifier(altSel, copy);\n const modId = 'mod-' + sel.selector.staff + '-' + sel.selector.measure;\n const context = this.renderer.renderer.getRenderer(sel.measure.svg.logicalBox);\n if (context) {\n _svgHelpers__WEBPACK_IMPORTED_MODULE_21__.SvgHelpers.removeElementsByClass(context.svg, modId);\n }\n }\n this._renderRectangle(modifier.startSelector, modifier.endSelector);\n return this.renderer.updatePromise();\n });\n }\n lineOperation(op) {\n // if (this.tracker.selections.length < 2) {\n // return;\n // }\n const measureSelections = this.undoTrackerMeasureSelections('create staff modifier');\n const ft = this.tracker.getExtremeSelection(-1);\n const tt = this.tracker.getExtremeSelection(1);\n const ftAlt = this._getEquivalentSelection(ft);\n const ttAlt = this._getEquivalentSelection(tt);\n const modifier = op(ft, tt);\n const altModifier = op(ftAlt, ttAlt);\n altModifier.attrs.id = modifier.attrs.id;\n ft.staff.addStaffModifier(modifier);\n ftAlt === null || ftAlt === void 0 ? void 0 : ftAlt.staff.addStaffModifier(altModifier);\n this.undoStaffModifier('add ' + op, modifier, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.ADD);\n this._renderChangedMeasures(measureSelections);\n }\n /**\n * Add crescendo to selection\n */\n crescendo() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createCrescendo);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Add crescendo to selection\n */\n crescendoBracket() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createCrescendoBracket);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Add crescendo to selection\n */\n dimenuendo() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createDimenuendoBracket);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Add crescendo to selection\n */\n accelerando() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createAccelerandoBracket);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Add crescendo to selection\n */\n ritard() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createRitardBracket);\n return this.renderer.updatePromise();\n });\n }\n /**\n * diminuendo hairpin\n * @returns\n */\n decrescendo() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createDecrescendo);\n return this.renderer.updatePromise();\n });\n }\n removeTextBracket(bracket) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.removeStaffModifier(bracket);\n });\n }\n addOrReplaceStaffModifier(callback, modifier) {\n return __awaiter(this, void 0, void 0, function* () {\n const from1 = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, modifier.startSelector);\n const to1 = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, modifier.endSelector);\n if (from1 === null || to1 === null) {\n return;\n }\n const altFrom = this._getEquivalentSelection(from1);\n const altTo = this._getEquivalentSelection(to1);\n if (altFrom === null || altTo === null) {\n return;\n }\n callback(this.score, from1, to1);\n callback(this.storeScore, altFrom, altTo);\n const redraw = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasuresBetween(this.score, from1.selector, to1.selector);\n this.undoStaffModifier('add repl text bracket', modifier, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.ADD);\n this._renderChangedMeasures(redraw);\n return this.renderer.updatePromise();\n });\n }\n addOrReplaceTextBracket(modifier) {\n return __awaiter(this, void 0, void 0, function* () {\n const from1 = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, modifier.startSelector);\n const to1 = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, modifier.endSelector);\n if (from1 === null || to1 === null) {\n return;\n }\n const altFrom = this._getEquivalentSelection(from1);\n const altTo = this._getEquivalentSelection(to1);\n if (altFrom === null || altTo === null) {\n return;\n }\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addOrReplaceBracket(modifier, from1, to1);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addOrReplaceBracket(modifier, altFrom, altTo);\n const redraw = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasuresBetween(this.score, from1.selector, to1.selector);\n this.undoStaffModifier('add repl text bracket', modifier, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.ADD);\n this._renderChangedMeasures(redraw);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Slur selected notes\n * @returns\n */\n addSlur() {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections);\n const ft = this.tracker.getExtremeSelection(-1);\n const tt = this.tracker.getExtremeSelection(1);\n const ftAlt = this._getEquivalentSelection(ft);\n const ttAlt = this._getEquivalentSelection(tt);\n const modifier = _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createSlur(this.score, ft, tt);\n ft.staff.addStaffModifier(modifier);\n // make sure score and backup have same ID for undo.\n const altModifier = _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createSlur(this.storeScore, ftAlt, ttAlt);\n altModifier.attrs.id = modifier.attrs.id;\n ftAlt === null || ftAlt === void 0 ? void 0 : ftAlt.staff.addStaffModifier(altModifier);\n this.undoStaffModifier('add slur', modifier, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.ADD);\n this._renderChangedMeasures(measureSelections);\n return this.renderer.updatePromise();\n });\n }\n /**\n * tie selected notes\n * @returns\n */\n tie() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createTie);\n return this.renderer.updatePromise();\n });\n }\n updateZoom(zoomFactor) {\n return __awaiter(this, void 0, void 0, function* () {\n const original = this.score.layoutManager.getGlobalLayout();\n original.zoomScale = zoomFactor;\n this.score.layoutManager.globalLayout.zoomScale = zoomFactor;\n this.renderer.pageMap.updateZoom(zoomFactor);\n this.renderer.pageMap.updateContainerOffset(this.scroller.scrollState);\n });\n }\n /**\n * set global page for score, zoom etc.\n * @param layout global SVG settings\n * @returns\n */\n setGlobalLayout(layout) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Set Global Layout');\n const original = this.score.layoutManager.getGlobalLayout().svgScale;\n this.score.layoutManager.updateGlobalLayout(layout);\n this.score.scaleTextGroups(original / layout.svgScale);\n this.storeScore.layoutManager.updateGlobalLayout(layout);\n this.renderer.rerenderAll();\n return this.renderer.preserveScroll();\n });\n }\n /**\n * Set the layout of a single page\n * @param layout page layout\n * @param pageIndex which page to change\n * @returns\n */\n setPageLayout(layout, pageIndex) {\n return __awaiter(this, void 0, void 0, function* () {\n this.score.layoutManager.updatePage(layout, pageIndex);\n this.storeScore.layoutManager.updatePage(layout, pageIndex);\n // If we are in part mode, save the page layout in the part so it is there next time\n // the part is exposed.\n if (this.isPartExposed()) {\n this.score.staves.forEach((staff, staffIx) => {\n staff.partInfo.layoutManager.updatePage(layout, pageIndex);\n const altStaff = this.storeScore.staves[this.staffMap[staffIx]];\n altStaff.partInfo.layoutManager.updatePage(layout, pageIndex);\n });\n }\n yield this.refreshViewport();\n });\n }\n setPageLayouts(layout, startIndex, endIndex) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Set Page Layout');\n let i = 0;\n for (i = startIndex; i <= endIndex; ++i) {\n this.setPageLayout(layout, i);\n }\n this.renderer.rerenderAll();\n return this.renderer.updatePromise();\n });\n }\n /**\n * Update the music font\n * @param family\n * @returns\n */\n setEngravingFontFamily(family) {\n return __awaiter(this, void 0, void 0, function* () {\n this.score.engravingFont = family;\n this.storeScore.engravingFont = family;\n this.renderer.notifyFontChange();\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * Upate global font used for chord changes\n * @param fontInfo\n * @returns\n */\n setChordFont(fontInfo) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Set Chord Font');\n this.score.setChordFont(fontInfo);\n this.storeScore.setChordFont(fontInfo);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * Update font used for lyrics\n * @param fontInfo\n * @returns\n */\n setLyricFont(fontInfo) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Set Lyric Font');\n this.score.setLyricFont(fontInfo);\n this.storeScore.setLyricFont(fontInfo);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * @param value if false, lyric widths don't affect measure width\n * @returns\n */\n setLyricAdjustWidth(value) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Set Lyric Adj Width');\n this.score.setLyricAdjustWidth(value);\n this.storeScore.setLyricAdjustWidth(value);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * delete selected measures\n * @returns\n */\n deleteMeasure() {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Delete Measure');\n if (this.storeScore.staves[0].measures.length < 2) {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections);\n // THe measures get renumbered, so keep the index at 0\n const index = selections[0].selector.measure;\n for (var i = 0; i < selections.length; ++i) {\n // Unrender the deleted measure\n this.score.staves.forEach((staff) => {\n this.tracker.clearMeasureMap(staff.measures[index]);\n this.renderer.unrenderMeasure(staff.measures[index]);\n this.renderer.unrenderMeasure(staff.measures[staff.measures.length - 1]);\n // A little hacky - delete the modifiers if they start or end on\n // the measure\n staff.renderableModifiers.forEach((modifier) => {\n if (modifier.startSelector.measure === index || modifier.endSelector.measure === index) {\n if (modifier.logicalBox) {\n const context = this.renderer.renderer.getRenderer(modifier.logicalBox);\n if (context) {\n $(context.svg).find('g.' + modifier.attrs.id).remove();\n }\n }\n }\n });\n });\n // Remove the SVG artifacts mapped to this measure.\n this.score.deleteMeasure(index);\n this.storeScore.deleteMeasure(index);\n // Note: index doesn't increment since there are now 1 fewer measures\n }\n ;\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * add number of measures, with default notes selections\n * @param append\n * @param numberToAdd\n * @returns\n */\n addMeasures(append, numberToAdd) {\n return __awaiter(this, void 0, void 0, function* () {\n let pos = 0;\n let ix = 0;\n this._undoScore('Add Measure');\n for (ix = 0; ix < numberToAdd; ++ix) {\n const measure = this.tracker.getFirstMeasureOfSelection();\n if (measure) {\n const nmeasure = _smo_data_measure__WEBPACK_IMPORTED_MODULE_4__.SmoMeasure.getDefaultMeasureWithNotes(measure);\n pos = measure.measureNumber.measureIndex;\n if (append) {\n pos += 1;\n }\n nmeasure.measureNumber.measureIndex = pos;\n nmeasure.setActiveVoice(0);\n this.score.addMeasure(pos);\n this.storeScore.addMeasure(pos);\n }\n }\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * add a single measure before or after selection\n * @param append\n * @returns\n */\n addMeasure(append) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Add Measure');\n let pos = 0;\n const measure = this.tracker.getFirstMeasureOfSelection();\n if (!measure) {\n return;\n }\n const nmeasure = _smo_data_measure__WEBPACK_IMPORTED_MODULE_4__.SmoMeasure.getDefaultMeasureWithNotes(measure);\n pos = measure.measureNumber.measureIndex;\n if (append) {\n pos += 1;\n }\n nmeasure.measureNumber.measureIndex = pos;\n nmeasure.setActiveVoice(0);\n this.score.addMeasure(pos);\n this.storeScore.addMeasure(pos);\n this.renderer.clearLine(measure);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * remove an entire line of music\n * @returns\n */\n removeStaff() {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Remove Instrument');\n if (this.storeScore.staves.length < 2 || this.score.staves.length < 2) {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n // if we are looking at a subset of the score,\n // revert to the full score view before removing the staff.\n const sel = this.tracker.selections[0];\n const scoreSel = this._getEquivalentSelection(sel);\n const staffIndex = scoreSel.selector.staff;\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeStaff(this.storeScore, staffIndex);\n this.viewAll();\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n addStaff(instrument) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Add Instrument');\n // if we are looking at a subset of the score, we won't see the new staff. So\n // revert to the full view\n const staff = _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addStaff(this.storeScore, instrument);\n const instKeys = Object.keys(staff.measureInstrumentMap);\n // update the key signatures for the new part\n instKeys.forEach((key) => {\n const numKey = parseInt(key, 10);\n const inst = staff.measureInstrumentMap[numKey];\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.innerSelections(this.storeScore, inst.startSelector, inst.endSelector);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.changeInstrument(inst, selections);\n });\n if (instrument.staffId > 0) {\n const selection = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.measureSelection(this.storeScore, instrument.staffId - 1, 0);\n const sel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelector.default;\n sel.staff = instrument.staffId - 1;\n if (selection) {\n let grp = this.storeScore.getSystemGroupForStaff(selection);\n if (grp) {\n grp.endSelector.staff = instrument.staffId;\n }\n else {\n let grp = new _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoSystemGroup(_smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoSystemGroup.defaults);\n grp.startSelector.staff = instrument.staffId - 1;\n grp.endSelector.staff = instrument.staffId;\n this.storeScore.systemGroups.push(grp);\n }\n }\n }\n this.viewAll();\n return this.renderer.updatePromise();\n });\n }\n /**\n * Update part info assumes that the part is currently exposed - that\n * staff 0 is the first staff in the part prior to editing.\n * @param info\n */\n updatePartInfo(info) {\n return __awaiter(this, void 0, void 0, function* () {\n let i = 0;\n this._undoScore('Update part info');\n const storeStaff = this.staffMap[0] - info.stavesBefore;\n const partLength = info.stavesBefore + info.stavesAfter + 1;\n const resetView = !_smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoLayoutManager.areLayoutsEqual(info.layoutManager.getGlobalLayout(), this.score.layoutManager.getGlobalLayout());\n const restChange = this.score.staves[0].partInfo.expandMultimeasureRests != info.expandMultimeasureRests;\n const stavesChange = this.score.staves[0].partInfo.stavesAfter !== info.stavesAfter;\n for (i = 0; i < partLength; ++i) {\n const nStaffIndex = storeStaff + i;\n const nInfo = new _smo_data_partInfo__WEBPACK_IMPORTED_MODULE_3__.SmoPartInfo(info);\n nInfo.stavesBefore = i;\n nInfo.stavesAfter = partLength - i - 1;\n this.storeScore.staves[nStaffIndex].partInfo = nInfo;\n // If the staff index is currently displayed, \n const displayedIndex = this.staffMap.findIndex((x) => x === nStaffIndex);\n if (displayedIndex >= 0) {\n this.score.staves[displayedIndex].partInfo = new _smo_data_partInfo__WEBPACK_IMPORTED_MODULE_3__.SmoPartInfo(nInfo);\n this.score.layoutManager = nInfo.layoutManager;\n }\n }\n if (resetView || restChange || stavesChange) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.computeMultipartRest(this.score);\n // this.resetPartView();\n this.renderer.rerenderAll();\n }\n return this.renderer.updatePromise();\n });\n }\n /**\n * A simpler API for applications to add a new staff to the score.\n * @param params - the instrument, which determines clef, etc.\n * @returns\n */\n addStaffSimple(params) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const instrumentParams = _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__.SmoInstrument.defaults;\n instrumentParams.startSelector.staff = instrumentParams.endSelector.staff = this.score.staves.length;\n instrumentParams.clef = (_a = params.clef) !== null && _a !== void 0 ? _a : instrumentParams.clef;\n const staffParams = _smo_data_systemStaff__WEBPACK_IMPORTED_MODULE_2__.SmoSystemStaff.defaults;\n staffParams.staffId = this.storeScore.staves.length; // add a staff\n staffParams.measureInstrumentMap[0] = new _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__.SmoInstrument(instrumentParams);\n this.addStaff(staffParams);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Save the score to local storage.\n */\n quickSave() {\n const scoreStr = JSON.stringify(this.storeScore.serialize());\n localStorage.setItem(_common_serializationHelpers__WEBPACK_IMPORTED_MODULE_12__.smoSerialize.localScore, scoreStr);\n }\n updateRepeatCount(count) {\n const measureSelections = this.undoTrackerMeasureSelections('repeat bar');\n const symbol = count > 0 ? true : false;\n measureSelections.forEach((ms) => {\n const store = this._getEquivalentSelection(ms);\n ms.measure.repeatCount = count;\n ms.measure.repeatSymbol = symbol;\n if (store) {\n store.measure.repeatCount = count;\n store.measure.repeatSymbol = symbol;\n }\n });\n this._renderChangedMeasures(measureSelections);\n return this.updatePromise();\n }\n /**\n * Update the measure formatting parameters for the current selection\n * @param format generic measure formatting parameters\n * @returns\n */\n setMeasureFormat(format) {\n const label = 'set measure format';\n const fromSelector = this.tracker.getExtremeSelection(-1).selector;\n const toSelector = this.tracker.getExtremeSelection(1).selector;\n const measureSelections = this.tracker.getSelectedMeasures();\n // If the formatting is on a part, preserve it in the part's info\n const isPart = this.isPartExposed();\n measureSelections.forEach((m) => {\n this._undoColumn(label, m.selector.measure);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureFormat(this.score, m, format);\n if (isPart) {\n m.staff.partInfo.measureFormatting[m.measure.measureNumber.measureIndex] = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoMeasureFormat(format);\n }\n const alt = this._getEquivalentSelection(m);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureFormat(this.storeScore, alt, format);\n if (isPart) {\n alt.staff.partInfo.measureFormatting[m.measure.measureNumber.measureIndex] = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoMeasureFormat(format);\n }\n });\n this._renderRectangle(fromSelector, toSelector);\n return this.renderer.updatePromise();\n }\n /**\n * Remove system breaks from the measure formatting for selected measures\n * @returns\n */\n removeSystemBreaks() {\n const label = 'set measure format';\n const fromSelector = this.tracker.getExtremeSelection(-1).selector;\n const toSelector = this.tracker.getExtremeSelection(1).selector;\n const measureSelections = this.tracker.getSelectedMeasures();\n // If the formatting is on a part, preserve it in the part's info\n const isPart = this.isPartExposed();\n measureSelections.forEach((m) => {\n this._undoColumn(label, m.selector.measure);\n const format = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoMeasureFormat(m.measure.format);\n format.systemBreak = false;\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureFormat(this.score, m, format);\n if (isPart) {\n m.staff.partInfo.measureFormatting[m.measure.measureNumber.measureIndex] = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoMeasureFormat(format);\n }\n const alt = this._getEquivalentSelection(m);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureFormat(this.storeScore, alt, format);\n if (isPart) {\n alt.staff.partInfo.measureFormatting[m.measure.measureNumber.measureIndex] = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoMeasureFormat(format);\n }\n });\n this._renderRectangle(fromSelector, toSelector);\n return this.renderer.updatePromise();\n }\n renumberMeasures(measureIndex, localIndex) {\n this.score.updateRenumberingMap(measureIndex, localIndex);\n this.storeScore.updateRenumberingMap(measureIndex, localIndex);\n const mmsel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.measureSelection(this.score, 0, measureIndex);\n if (mmsel) {\n this._renderChangedMeasures([mmsel]);\n }\n return this.renderer.updatePromise();\n }\n /**\n * Play the music from the starting selection\n * @returns\n */\n playFromSelection() {\n var mm = this.tracker.getExtremeSelection(-1);\n if (_audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer.playingInstance && _audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer.playingInstance.paused) {\n _audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer.playingInstance.play();\n return;\n }\n if (_audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer.playing) {\n return;\n }\n new _audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer({ audioAnimation: this.audioAnimation, score: this.score, startIndex: mm.selector.measure, view: this }).play();\n }\n stopPlayer() {\n _audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer.stopPlayer();\n }\n pausePlayer() {\n _audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer.pausePlayer();\n }\n /**\n * Proxy calls to move the tracker parameters according to the\n * rules of the 'Home' key (depending on shift/ctrl/alt)\n * @param ev\n * @returns\n */\n moveHome(ev) {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveHome(ev);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Proxy calls to move the tracker parameters according to the\n * rules of the 'End' key (depending on shift/ctrl/alt)\n * @param ev\n * @returns\n */\n moveEnd(ev) {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveEnd(ev);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Grow the current selection by one to the left, if possible\n * @param ev\n * @returns\n */\n growSelectionLeft() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.growSelectionLeft();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Grow the current selection by one to the right, if possible\n * @param ev\n * @returns\n */\n growSelectionRight() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.growSelectionRight();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Select the next tabbable modifier near one of the selected notes\n * @param keyEv\n * @returns\n */\n advanceModifierSelection(keyEv) {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.advanceModifierSelection(keyEv);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Select the next entire measure, if possible\n * @returns\n */\n growSelectionRightMeasure() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.growSelectionRightMeasure();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Advance cursor forwards, if possible\n * @param ev\n * @returns\n */\n moveSelectionRight() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionRight();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Advance cursor backwards, if possible\n * @param ev\n * @returns\n */\n moveSelectionLeft() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionLeft();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Advance cursor back entire measure, if possible\n * @returns\n */\n moveSelectionLeftMeasure() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionLeftMeasure();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Advance cursor forward one measure, if possible\n * @returns\n */\n moveSelectionRightMeasure() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionRightMeasure();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Move cursor to a higher pitch in the current chord, with wrap\n * @returns\n */\n moveSelectionPitchUp() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionPitchUp();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Move cursor to a lower pitch in the current chord, with wrap\n */\n moveSelectionPitchDown() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionPitchDown();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Move cursor up a staff in the system, if possible\n * @returns\n */\n moveSelectionUp() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionUp();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Move cursor down a staff in the system, if possible\n * @returns\n */\n moveSelectionDown() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionDown();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Set the current suggestions (hover element) as the selection\n * @returns\n */\n selectSuggestion(evData) {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.selectSuggestion(evData);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Find an element at the given box, and make it the current selection\n * */\n intersectingArtifact(evData) {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.intersectingArtifact(evData);\n yield this.renderer.updatePromise();\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcmVuZGVyL3N1aS9zY29yZVZpZXdPcGVyYXRpb25zLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlEQUF5RDtBQUN6RCx5Q0FBeUM7QUFDMkI7QUFDRDtBQUNlO0FBQzVCO0FBQ0Y7QUFFeUQ7QUFHbEM7QUFDbkI7QUFHTjtBQUUyQztBQUMzQztBQUdkO0FBRTZCO0FBRWpCO0FBQ0k7QUFDRDtBQUNGO0FBQ1E7QUFDYztBQUV3QztBQUM1RTtBQUNPO0FBQ21CO0FBTTdEOzs7Ozs7Ozs7OztHQVdHO0FBQ0ksTUFBTSxzQkFBdUIsU0FBUSxvREFBWTtJQUN0RDs7OztPQUlHO0lBQ0csWUFBWSxDQUFDLFNBQXVCOzs7WUFDeEMsTUFBTSxNQUFNLEdBQUcsNkRBQVksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN6RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0MsSUFBSSxRQUFRLEdBQUcsZUFBUyxDQUFDLFFBQVEsbUNBQUksK0RBQVcsQ0FBQyxPQUFPLENBQUM7WUFDekQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQy9DLE1BQU0sT0FBTyxHQUFHLGFBQWEsSUFBSSxRQUFRLENBQUMsa0JBQWtCO2dCQUMxRCxDQUFDLENBQUMsd0RBQVUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyx3REFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUM7WUFDakYsSUFBSSxPQUFPLEtBQUssd0RBQVUsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3JELFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxT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Q0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0tBQUE7SUFDRDs7VUFFTTtJQUNBLG9CQUFvQixDQUFDLE1BQWM7O1lBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3RDLENBQUM7S0FBQTtDQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3JlbmRlci9zdWkvc2NvcmVWaWV3T3BlcmF0aW9ucy50cz9jZjQ3Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG5pbXBvcnQgeyBTdWlTY29yZVZpZXcsIHVwZGF0ZVN0YWZmTW9kaWZpZXJGdW5jIH0gZnJvbSAnLi9zY29yZVZpZXcnO1xyXG5pbXBvcnQgeyBTbW9TY29yZSwgZW5ncmF2aW5nRm9udFR5cGUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zY29yZSc7XHJcbmltcG9ydCB7IFNtb1N5c3RlbVN0YWZmUGFyYW1zLCBTbW9TeXN0ZW1TdGFmZiB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3N5c3RlbVN0YWZmJztcclxuaW1wb3J0IHsgU21vUGFydEluZm8gfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9wYXJ0SW5mbyc7XHJcbmltcG9ydCB7IFNtb01lYXN1cmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tZWFzdXJlJztcclxuaW1wb3J0IHsgU21vTm90ZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL25vdGUnO1xyXG5pbXBvcnQgeyBLZXlFdmVudCwgU3ZnQm94LCBQaXRjaCwgUGl0Y2hMZXR0ZXIsIFJlbW92ZUVsZW1lbnRMaWtlLCBFbGVtZW50TGlrZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL2NvbW1vbic7XHJcbmltcG9ydCB7IFNtb1JlbmRlckNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgeyBTbW9TeXN0ZW1Hcm91cCwgU21vUGFnZUxheW91dCwgU21vR2xvYmFsTGF5b3V0LCBTbW9MYXlvdXRNYW5hZ2VyLCBTbW9BdWRpb1BsYXllclNldHRpbmdzLFxyXG4gIFNtb1Njb3JlUHJlZmVyZW5jZXMsIFNtb1Njb3JlSW5mbyB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3Njb3JlTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgU21vVGV4dEdyb3VwIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc2NvcmVUZXh0JztcclxuaW1wb3J0IHsgU21vRHluYW1pY1RleHQsIFNtb05vdGVNb2RpZmllckJhc2UsIFNtb0dyYWNlTm90ZSwgU21vQXJ0aWN1bGF0aW9uLCBcclxuICBTbW9Pcm5hbWVudCwgU21vTHlyaWMsIFNtb01pY3JvdG9uZSwgU21vQXJwZWdnaW8sIFNtb0FycGVnZ2lvVHlwZSwgU21vQ2xlZkNoYW5nZSwgXHJcbiAgU21vVGFiTm90ZX0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbm90ZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb1RlbXBvVGV4dCwgU21vVm9sdGEsIFNtb0JhcmxpbmUsIFNtb1JlcGVhdFN5bWJvbCwgXHJcbiAgU21vUmVoZWFyc2FsTWFyaywgU21vTWVhc3VyZUZvcm1hdCwgVGltZVNpZ25hdHVyZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL21lYXN1cmVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBVbmRvQnVmZmVyIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL3VuZG8nO1xyXG5pbXBvcnQge1xyXG4gIFNtb09wZXJhdGlvbiwgY3JlYXRlU3RhZmZNb2RpZmllclR5cGUsIE1ha2VUdXBsZXRPcGVyYXRpb25cclxufSBmcm9tICcuLi8uLi9zbW8veGZvcm0vb3BlcmF0aW9ucyc7XHJcbmltcG9ydCB7IEJhdGNoU2VsZWN0aW9uT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL29wZXJhdGlvbnMnO1xyXG5pbXBvcnQgeyBzbW9TZXJpYWxpemUgfSBmcm9tICcuLi8uLi9jb21tb24vc2VyaWFsaXphdGlvbkhlbHBlcnMnO1xyXG5pbXBvcnQgeyBGb250SW5mbyB9IGZyb20gJy4uLy4uL2NvbW1vbi92ZXgnO1xyXG5pbXBvcnQgeyBTbW9NdXNpYyB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL211c2ljJztcclxuaW1wb3J0IHsgU3VpT3NjaWxsYXRvciB9IGZyb20gJy4uL2F1ZGlvL29zY2lsbGF0b3InO1xyXG5pbXBvcnQgeyBYbWxUb1NtbyB9IGZyb20gJy4uLy4uL3Ntby9teG1sL3htbFRvU21vJztcclxuaW1wb3J0IHsgU3VpQXVkaW9QbGF5ZXIgfSBmcm9tICcuLi9hdWRpby9wbGF5ZXInO1xyXG5pbXBvcnQgeyBTdWlYaHJMb2FkZXIgfSBmcm9tICcuLi8uLi91aS9maWxlaW8veGhyTG9hZGVyJztcclxuaW1wb3J0IHsgU21vU2VsZWN0aW9uLCBTbW9TZWxlY3RvciB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9zZWxlY3Rpb25zJztcclxuaW1wb3J0IHsgU3RhZmZNb2RpZmllckJhc2UsIFxyXG4gICBTbW9JbnN0cnVtZW50LCBTbW9JbnN0cnVtZW50UGFyYW1zLCBTbW9TdGFmZlRleHRCcmFja2V0LCBTbW9UYWJTdGF2ZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3N0YWZmTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgU3VpUGlhbm8gfSBmcm9tICcuL3BpYW5vJztcclxuaW1wb3J0IHsgU3ZnSGVscGVycyB9IGZyb20gJy4vc3ZnSGVscGVycyc7XHJcbmltcG9ydCB7IFByb21pc2VIZWxwZXJzIH0gZnJvbSAnLi4vLi4vY29tbW9uL3Byb21pc2VIZWxwZXJzJztcclxuaW1wb3J0IHsgcGFyc2VKc29uVGV4dCB9IGZyb20gJ3R5cGVzY3JpcHQnO1xyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcbmRlY2xhcmUgdmFyIFNtb0NvbmZpZzogU21vUmVuZGVyQ29uZmlndXJhdGlvbjtcclxuXHJcblxyXG4vKipcclxuICogTVZWTS1saWtlIG9wZXJhdGlvbnMgb24gdGhlIGRpc3BsYXllZCBzY29yZS5cclxuICogXHJcbiAqIEFsbCBvcGVyYXRpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiBhICdsaXZlJyBzY29yZSBnbyB0aHJvdWdoIHRoaXNcclxuICogbW9kdWxlLiAgSXQgbWFwcyB0aGUgc2NvcmUgdmlldyB0byB0aGUgYWN0dWFsIHNjb3JlIGFuZCBtYWtlcyBzdXJlIHRoZVxyXG4gKiBtb2RlbCBhbmQgdmlldyBzdGF5IGluIHN5bmMuICBcclxuICogXHJcbiAqIEJlY2F1c2UgdGhpcyBvYmplY3Qgb3BlcmF0ZXMgb24gdGhlIGN1cnJlbnQgc2VsZWN0aW9ucywgXHJcbiAqIGFsbCBvcGVyYXRpb25zIHJldHVybiBwcm9taXNlIHNvIGFwcGxpY2F0aW9ucyBjYW4gd2FpdCBmb3IgdGhlIFxyXG4gKiBvcGVyYXRpb24gdG8gY29tcGxldGUgYW5kIHVwZGF0ZSB0aGUgc2VsZWN0aW9uIGxpc3QuXHJcbiAqIEBjYXRlZ29yeSBTdWlSZW5kZXJcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdWlTY29yZVZpZXdPcGVyYXRpb25zIGV4dGVuZHMgU3VpU2NvcmVWaWV3IHtcclxuICAvKipcclxuICAgKiBBZGQgYSBuZXcgdGV4dCBncm91cCB0byB0aGUgc2NvcmUgXHJcbiAgICogQHBhcmFtIHRleHRHcm91cCBhIG5ldyB0ZXh0IGdyb3VwXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkVGV4dEdyb3VwKHRleHRHcm91cDogU21vVGV4dEdyb3VwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhbHROZXcgPSBTbW9UZXh0R3JvdXAuZGVzZXJpYWxpemVQcmVzZXJ2ZUlkKHRleHRHcm91cC5zZXJpYWxpemUoKSk7XHJcbiAgICBjb25zdCBpc1BhcnRFeHBvc2VkID0gdGhpcy5pc1BhcnRFeHBvc2VkKCk7XHJcbiAgICBsZXQgc2VsZWN0b3IgPSB0ZXh0R3JvdXAuc2VsZWN0b3IgPz8gU21vU2VsZWN0b3IuZGVmYXVsdDtcclxuICAgIGNvbnN0IHBhcnRJbmZvID0gdGhpcy5zY29yZS5zdGF2ZXNbMF0ucGFydEluZm87XHJcbiAgICBjb25zdCBidWZUeXBlID0gaXNQYXJ0RXhwb3NlZCAmJiBwYXJ0SW5mby5wcmVzZXJ2ZVRleHRHcm91cHNcclxuICAgICAgPyBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlBBUlRfTU9ESUZJRVIgOiBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlNDT1JFX01PRElGSUVSO1xyXG4gICAgaWYgKGJ1ZlR5cGUgPT09IFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuUEFSVF9NT0RJRklFUikge1xyXG4gICAgICBzZWxlY3Rvci5zdGFmZiA9IHRoaXMuc3RhZmZNYXBbMF07XHJcbiAgICB9ICBcclxuICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcigncmVtb3ZlIHRleHQgZ3JvdXAnLCBidWZUeXBlLFxyXG4gICAgICBzZWxlY3RvciwgdGV4dEdyb3VwLCBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLkFERCk7XHJcbiAgICBpZiAoaXNQYXJ0RXhwb3NlZCAmJiBwYXJ0SW5mby5wcmVzZXJ2ZVRleHRHcm91cHMpIHtcclxuICAgICAgdGhpcy5zY29yZS5zdGF2ZXNbMF0ucGFydEluZm8udXBkYXRlVGV4dEdyb3VwKHRleHRHcm91cCwgdHJ1ZSk7XHJcbiAgICAgIGNvbnN0IHBhcnRJbmZvID0gdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1t0aGlzLl9nZXRFcXVpdmFsZW50U3RhZmYoMCldLnBhcnRJbmZvO1xyXG4gICAgICBwYXJ0SW5mby51cGRhdGVUZXh0R3JvdXAoYWx0TmV3LCB0cnVlKTsgICAgICBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2NvcmUudXBkYXRlVGV4dEdyb3VwKHRleHRHcm91cCwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuc3RvcmVTY29yZS51cGRhdGVUZXh0R3JvdXAoYWx0TmV3LCB0cnVlKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIucmVyZW5kZXJUZXh0R3JvdXBzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgdGhlIHRleHQgZ3JvdXAgZnJvbSB0aGUgc2NvcmVcclxuICAgKiBAcGFyYW0gdGV4dEdyb3VwIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZVRleHRHcm91cCh0ZXh0R3JvdXA6IFNtb1RleHRHcm91cCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHNlbGVjdG9yID0gdGV4dEdyb3VwLnNlbGVjdG9yID8/IFNtb1NlbGVjdG9yLmRlZmF1bHQ7XHJcbiAgICBjb25zdCBwYXJ0SW5mbyA9IHRoaXMuc2NvcmUuc3RhdmVzWzBdLnBhcnRJbmZvO1xyXG4gICAgY29uc3QgaXNQYXJ0RXhwb3NlZCA9IHRoaXMuaXNQYXJ0RXhwb3NlZCgpO1xyXG4gICAgY29uc3QgYnVmVHlwZSA9IGlzUGFydEV4cG9zZWQgJiYgcGFydEluZm8ucHJlc2VydmVUZXh0R3JvdXBzIFxyXG4gICAgICA/IFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuUEFSVF9NT0RJRklFUiA6IFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuU0NPUkVfTU9ESUZJRVI7XHJcbiAgICBsZXQgb2dUZXh0ID0gdGhpcy5zdG9yZVNjb3JlLnRleHRHcm91cHMuZmluZCgodGcpID0+IHRnLmF0dHJzLmlkID09PSB0ZXh0R3JvdXAuYXR0cnMuaWQpO1xyXG4gICAgaWYgKGlzUGFydEV4cG9zZWQgJiYgcGFydEluZm8ucHJlc2VydmVUZXh0R3JvdXBzKSB7XHJcbiAgICAgIG9nVGV4dCA9IHBhcnRJbmZvLnRleHRHcm91cHMuZmluZCgodGcpID0+IHRnLmF0dHJzLmlkID09PSB0ZXh0R3JvdXAuYXR0cnMuaWQpO1xyXG4gICAgfVxyXG4gICAgaWYgKGJ1ZlR5cGUgPT09IFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuUEFSVF9NT0RJRklFUikge1xyXG4gICAgICBzZWxlY3Rvci5zdGFmZiA9IHRoaXMuc3RhZmZNYXBbMF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZWxlY3Rvci5zdGFmZiA9IHRoaXMuc3RhZmZNYXBbc2VsZWN0b3Iuc3RhZmZdO1xyXG4gICAgfVxyXG4gICAgaWYgKCFvZ1RleHQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKCdyZW1vdmUgdGV4dCBncm91cCcsIGJ1ZlR5cGUsXHJcbiAgICAgIHNlbGVjdG9yLCBvZ1RleHQsIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuUkVNT1ZFKTtcclxuICAgIGNvbnN0IGFsdEdyb3VwID0gU21vVGV4dEdyb3VwLmRlc2VyaWFsaXplUHJlc2VydmVJZCh0ZXh0R3JvdXAuc2VyaWFsaXplKCkpO1xyXG4gICAgdGV4dEdyb3VwLmVsZW1lbnRzLmZvckVhY2goKGVsOiBFbGVtZW50TGlrZSkgPT4gUmVtb3ZlRWxlbWVudExpa2UoZWwpKTtcclxuICAgIHRleHRHcm91cC5lbGVtZW50cyA9IFtdO1xyXG4gICAgaWYgKGlzUGFydEV4cG9zZWQgJiYgcGFydEluZm8ucHJlc2VydmVUZXh0R3JvdXBzKSB7XHJcbiAgICAgIHBhcnRJbmZvLnVwZGF0ZVRleHRHcm91cCh0ZXh0R3JvdXAsIGZhbHNlKTtcclxuICAgICAgdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1t0aGlzLl9nZXRFcXVpdmFsZW50U3RhZmYoMCldLnBhcnRJbmZvLnVwZGF0ZVRleHRHcm91cChhbHRHcm91cCwgZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY29yZS51cGRhdGVUZXh0R3JvdXAodGV4dEdyb3VwLCBmYWxzZSk7XHJcbiAgICAgIHRoaXMuc3RvcmVTY29yZS51cGRhdGVUZXh0R3JvdXAoYWx0R3JvdXAsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIucmVyZW5kZXJUZXh0R3JvdXBzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVUGRhdGUgYW4gZXhpc3RpbmcgdGV4dCBncm91cC4gIFRoZSBvcmlnaW5hbCBpcyBwYXNzZWQgaW4sIGJlY2F1c2Ugc2luY2UgVEcgbm90IHRpZWQgdG8gYSBtdXNpY2FsXHJcbiAgICogZWxlbWVudCwgd2UgbmVlZCB0byBmaW5kIHRoZSBvbmUgd2UncmUgdXBkYXRpbmcuXHJcbiAgICogQHBhcmFtIG9sZFZlcnNpb24gXHJcbiAgICogQHBhcmFtIG5ld1ZlcnNpb24gXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlVGV4dEdyb3VwKG5ld1ZlcnNpb246IFNtb1RleHRHcm91cCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBuZXdWZXJzaW9uLnNlbGVjdG9yID8/IFNtb1NlbGVjdG9yLmRlZmF1bHQ7XHJcbiAgICBjb25zdCBpc1BhcnRFeHBvc2VkID0gdGhpcy5pc1BhcnRFeHBvc2VkKCk7XHJcbiAgICBjb25zdCBwYXJ0SW5mbyA9IHRoaXMuc2NvcmUuc3RhdmVzWzBdLnBhcnRJbmZvO1xyXG4gICAgLy8gQmFjayB1cCB0aGUgb3JpZ2luYWwgc2NvcmUgdGV4dFxyXG4gICAgbGV0IG9ndGcgPSB0aGlzLnN0b3JlU2NvcmUudGV4dEdyb3Vwcy5maW5kKCh0ZykgPT4gdGcuYXR0cnMuaWQgPT09IG5ld1ZlcnNpb24uYXR0cnMuaWQpO1xyXG4gICAgaWYgKGlzUGFydEV4cG9zZWQgJiYgcGFydEluZm8ucHJlc2VydmVUZXh0R3JvdXBzKSB7XHJcbiAgICAgIG9ndGcgPSBwYXJ0SW5mby50ZXh0R3JvdXBzLmZpbmQoKHRnKSA9PiB0Zy5hdHRycy5pZCA9PT0gbmV3VmVyc2lvbi5hdHRycy5pZCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIW9ndGcpIHtcclxuICAgICAgLy8gdGhlcmUgaXMgbm90aGluZyB0byB1cGRhdGUsIHJldHVybi5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKG9ndGcpIHtcclxuICAgICAgY29uc3QgYnVmVHlwZSA9IGlzUGFydEV4cG9zZWQgJiYgcGFydEluZm8ucHJlc2VydmVUZXh0R3JvdXBzIFxyXG4gICAgICAgID8gVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5QQVJUX01PRElGSUVSIDogVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5TQ09SRV9NT0RJRklFUjtcclxuICAgICAgLy8gaWYgdGhpcyBpcyBwYXJ0IHRleHQsIG1ha2Ugc3VyZSB0aGUgdW5kbyBidWZmZXIgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJ0IHN0YXZlXHJcbiAgICAgIC8vIGluIHRoZSBmdWxsIHNjb3JlLCBzbyB1bmRvIHdvcmtzIHByb3Blcmx5XHJcbiAgICAgIGlmIChidWZUeXBlID09PSBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlBBUlRfTU9ESUZJRVIpIHtcclxuICAgICAgICBzZWxlY3Rvci5zdGFmZiA9IHRoaXMuc3RhZmZNYXBbMF07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0b3Iuc3RhZmYgPSB0aGlzLnN0YWZmTWFwW3NlbGVjdG9yLnN0YWZmXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnN0b3JlVW5kby5hZGRCdWZmZXIoJ21vZGlmeSB0ZXh0JyxcclxuICAgICAgICBidWZUeXBlLCBzZWxlY3Rvciwgb2d0ZywgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5VUERBVEUpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYWx0TmV3ID0gU21vVGV4dEdyb3VwLmRlc2VyaWFsaXplUHJlc2VydmVJZChuZXdWZXJzaW9uLnNlcmlhbGl6ZSgpKTtcclxuICAgIHRoaXMuc2NvcmUudXBkYXRlVGV4dEdyb3VwKG5ld1ZlcnNpb24sIHRydWUpO1xyXG4gICAgLy8gSWYgdGhpcyBpcyBwYXJ0IHRleHQsIGRvbid0IHN0b3JlIGl0IGluIHRoZSBzY29yZSB0ZXh0LCBleGNlcHQgZm9yIHRoZSBkaXNwbGF5ZWQgc2NvcmVcclxuICAgIGlmICghaXNQYXJ0RXhwb3NlZCkge1xyXG4gICAgICB0aGlzLnN0b3JlU2NvcmUudXBkYXRlVGV4dEdyb3VwKGFsdE5ldywgdHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuX2dldEVxdWl2YWxlbnRTdGFmZigwKV0ucGFydEluZm8udXBkYXRlVGV4dEdyb3VwKGFsdE5ldywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBUT0RPOiBvbmx5IHJlbmRlciB0aGUgb25lIFRHLlxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci5yZXJlbmRlclRleHRHcm91cHMoKTtcclxuICAgIC8vIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogbG9hZCBhbiBteG1sIHNjb3JlIHJlbW90ZWx5LCByZXR1cm4gYSBwcm9taXNlIHRoYXQgXHJcbiAgICogY29tcGxldGVzIHdoZW4gdGhlIGZpbGUgaXMgbG9hZGVkXHJcbiAgICogQHBhcmFtIHVybCB3aGVyZSB0byBmaW5kIHRoZSB4bWwgZmlsZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGxvYWRSZW1vdGVYbWwodXJsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgcmVxID0gbmV3IFN1aVhockxvYWRlcih1cmwpO1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAvLyBTaG91bGRuJ3Qgd2UgcmV0dXJuIHByb21pc2Ugb2YgYWN0dWFsbHkgZGlzcGxheWluZyB0aGUgc2NvcmU/XHJcbiAgICBhd2FpdCByZXEubG9hZEFzeW5jKCk7XHJcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICBjb25zdCB4bWwgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlcS52YWx1ZSwgJ3RleHQveG1sJyk7XHJcbiAgICBjb25zdCBzY29yZSA9IFhtbFRvU21vLmNvbnZlcnQoeG1sKTtcclxuICAgIHNjb3JlLmxheW91dE1hbmFnZXIhLnpvb21Ub1dpZHRoKCQoJ2JvZHknKS53aWR0aCgpKTtcclxuICAgIGF3YWl0IHNlbGYuY2hhbmdlU2NvcmUoc2NvcmUpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBsb2FkIGEgcmVtb3RlIHNjb3JlIGluIFNNTyBmb3JtYXRcclxuICAgKiBAcGFyYW0gdXJsIHVybCB0byBmaW5kIHRoZSBzY29yZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGxvYWRSZW1vdGVKc29uKHVybDogc3RyaW5nKSA6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCByZXEgPSBuZXcgU3VpWGhyTG9hZGVyKHVybCk7XHJcbiAgICBhd2FpdCByZXEubG9hZEFzeW5jKCk7XHJcbiAgICBjb25zdCBzY29yZSA9IFNtb1Njb3JlLmRlc2VyaWFsaXplKHJlcS52YWx1ZSk7XHJcbiAgICBhd2FpdCB0aGlzLmNoYW5nZVNjb3JlKHNjb3JlKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTG9hZCBhIHJlbW90ZSBzY29yZSwgcmV0dXJuIHByb21pc2Ugd2hlbiBpdCdzIGJlZW4gbG9hZGVkXHJcbiAgICogZnJvbSBhZmFyLlxyXG4gICAqIEBwYXJhbSBwcmVmIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGxvYWRSZW1vdGVTY29yZSh1cmw6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAodXJsLmVuZHNXaXRoKCd4bWwnKSB8fCB1cmwuZW5kc1dpdGgoJ214bCcpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWRSZW1vdGVYbWwodXJsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWRSZW1vdGVKc29uKHVybCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGFzeW5jIHVwZGF0ZUF1ZGlvU2V0dGluZ3MocHJlZjogU21vQXVkaW9QbGF5ZXJTZXR0aW5ncykge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlUHJlZmVyZW5jZXMoJ1VwZGF0ZSBwcmVmZXJlbmNlcycpO1xyXG4gICAgdGhpcy5zY29yZS5hdWRpb1NldHRpbmdzID0gcHJlZjtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5hdWRpb1NldHRpbmdzID0gbmV3IFNtb0F1ZGlvUGxheWVyU2V0dGluZ3MocHJlZik7XHJcbiAgICAvLyBObyByZW5kZXJpbmcgdG8gYmUgZG9uZVxyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHbG9iYWwgc2V0dGluZ3MgdGhhdCBjb250cm9sIGhvdyB0aGUgc2NvcmUgZWRpdG9yIGJlaGF2ZXNcclxuICAgKiBAcGFyYW0gcHJlZiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVTY29yZVByZWZlcmVuY2VzKHByZWY6IFNtb1Njb3JlUHJlZmVyZW5jZXMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZVByZWZlcmVuY2VzKCdVcGRhdGUgcHJlZmVyZW5jZXMnKTtcclxuICAgIGNvbnN0IG9sZFhwb3NlID0gdGhpcy5zY29yZS5wcmVmZXJlbmNlcy50cmFuc3Bvc2luZ1Njb3JlO1xyXG4gICAgY29uc3QgY3VyWHBvc2UgPSBwcmVmLnRyYW5zcG9zaW5nU2NvcmU7XHJcbiAgICB0aGlzLnNjb3JlLnVwZGF0ZVNjb3JlUHJlZmVyZW5jZXMobmV3IFNtb1Njb3JlUHJlZmVyZW5jZXMocHJlZikpO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnVwZGF0ZVNjb3JlUHJlZmVyZW5jZXMobmV3IFNtb1Njb3JlUHJlZmVyZW5jZXMocHJlZikpO1xyXG4gICAgaWYgKGN1clhwb3NlID09PSBmYWxzZSAmJiBvbGRYcG9zZSA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLnNjb3JlLnNldE5vblRyYW5zcG9zaW5nKCk7XHJcbiAgICB9IGVsc2UgaWYgKGN1clhwb3NlID09PSB0cnVlICYmIG9sZFhwb3NlID09PSBmYWxzZSkge1xyXG4gICAgICB0aGlzLnNjb3JlLnNldFRyYW5zcG9zaW5nKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldERpcnR5KCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2NvcmUsIGNvbXBvc2VyIGV0Yy5cclxuICAgKiBAcGFyYW0gc2NvcmVJbmZvIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZVNjb3JlSW5mbyhzY29yZUluZm86IFNtb1Njb3JlSW5mbyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlUHJlZmVyZW5jZXMoJ1VwZGF0ZSBwcmVmZXJlbmNlcycpO1xyXG4gICAgdGhpcy5zY29yZS5zY29yZUluZm8gPSBzY29yZUluZm87XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuc2NvcmVJbmZvID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzY29yZUluZm8pKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKVxyXG4gIH1cclxuICBhc3luYyBhZGRSZW1vdmVBcnBlZ2dpbyhjb2RlOiBTbW9BcnBlZ2dpb1R5cGUpIHtcclxuICAgIGF3YWl0IHRoaXMubW9kaWZ5Q3VycmVudFNlbGVjdGlvbnMoJ2FkZC9yZW1vdmUgYWRkUmVtb3ZlQXJwZWdnaW8nLFxyXG4gICAgICAoc2NvcmUsIHNlbGVjdGlvbnMpID0+IHtcclxuICAgICAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHNlbC5ub3RlKSB7XHJcbiAgICAgICAgICAgIGlmIChjb2RlID09PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgICBzZWwubm90ZS5hcnBlZ2dpbyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBzZWwubm90ZS5hcnBlZ2dpbyA9IG5ldyBTbW9BcnBlZ2dpbyh7IHR5cGU6IGNvZGUgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSBjbGVmIGNoYW5nZSBtaWQtbWVhc3VyZSAoY2xlZk5vdGUpXHJcbiAgICogQHBhcmFtIGNsZWYgXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkUmVtb3ZlQ2xlZkNoYW5nZShjbGVmOiBTbW9DbGVmQ2hhbmdlKSB7XHJcbiAgICBhd2FpdCB0aGlzLm1vZGlmeUN1cnJlbnRTZWxlY3Rpb25zKCdhZGQvcmVtb3ZlIGFkZFJlbW92ZUNsZWZDaGFuZ2UnLFxyXG4gICAgICAoc2NvcmUsIHNlbGVjdGlvbnMpID0+IHtcclxuICAgICAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbWVhc3VyZUNsZWYgPSBzZWwubWVhc3VyZS5jbGVmO1xyXG4gICAgICAgICAgaWYgKHNlbC5ub3RlKSB7XHJcbiAgICAgICAgICAgIGlmIChtZWFzdXJlQ2xlZiA9PT0gY2xlZi5jbGVmKSB7XHJcbiAgICAgICAgICAgICAgc2VsLm5vdGUuY2xlZk5vdGUgPSBudWxsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHNlbC5ub3RlLmNsZWZOb3RlID0gY2xlZjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pOyAgIFxyXG4gIH1cclxuICAvKipcclxuICAgKiBNb2RpZnkgdGhlIGR5bmFtaWNzIGFzc29pY2F0ZWQgd2l0aCB0aGUgc3BlY2lmaWMgc2VsZWN0aW9uXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbiBcclxuICAgKiBAcGFyYW0gZHluYW1pYyBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBhZGREeW5hbWljKHNlbGVjdGlvbjogU21vU2VsZWN0aW9uLCBkeW5hbWljOiBTbW9EeW5hbWljVGV4dCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5tb2RpZnlTZWxlY3Rpb24oJ2FkZCBkeW5hbWljJywgc2VsZWN0aW9uLCAoc2NvcmUsIHNlbGVjdGlvbnMpID0+IHtcclxuICAgICAgU21vT3BlcmF0aW9uLmFkZER5bmFtaWMoc2VsZWN0aW9uc1swXSwgZHluYW1pYyk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGR5bmFtaWNzIGZyb20gdGhlIHNlbGVjdGlvbiBcclxuICAgKiBAcGFyYW0gc2VsZWN0aW9uIFxyXG4gICAqIEBwYXJhbSBkeW5hbWljIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIF9yZW1vdmVEeW5hbWljKHNlbGVjdGlvbjogU21vU2VsZWN0aW9uLCBkeW5hbWljOiBTbW9EeW5hbWljVGV4dCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZXF1aXYgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICBpZiAoZXF1aXYgIT09IG51bGwgJiYgZXF1aXYubm90ZSAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBhbHRNb2RpZmllcnMgPSBlcXVpdi5ub3RlLmdldE1vZGlmaWVycygnU21vRHluYW1pY1RleHQnKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnJlbW92ZUR5bmFtaWMoc2VsZWN0aW9uLCBkeW5hbWljKTtcclxuICAgICAgaWYgKGFsdE1vZGlmaWVycy5sZW5ndGgpIHtcclxuICAgICAgICBTbW9PcGVyYXRpb24ucmVtb3ZlRHluYW1pYyhlcXVpdiwgYWx0TW9kaWZpZXJzWzBdIGFzIFNtb0R5bmFtaWNUZXh0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBkeW5hbWljcyBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGlvblxyXG4gICAqIEBwYXJhbSBkeW5hbWljXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgcmVtb3ZlRHluYW1pYyhkeW5hbWljOiBTbW9EeW5hbWljVGV4dCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsID0gdGhpcy50cmFja2VyLm1vZGlmaWVyU2VsZWN0aW9uc1swXTtcclxuICAgIGlmICghc2VsLnNlbGVjdGlvbikge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZUhlbHBlcnMuZW1wdHlQcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucyA9IFtzZWwuc2VsZWN0aW9uXTtcclxuICAgIHRoaXMuX3VuZG9GaXJzdE1lYXN1cmVTZWxlY3Rpb24oJ3JlbW92ZSBkeW5hbWljJyk7XHJcbiAgICB0aGlzLl9yZW1vdmVEeW5hbWljKHNlbC5zZWxlY3Rpb24sIGR5bmFtaWMpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRUb1JlcGxhY2VRdWV1ZShzZWwuc2VsZWN0aW9uKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpXHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHdlIG5ldmVyIHJlYWxseSBkZWxldGUgYSBub3RlLCBidXQgd2Ugd2lsbCBjb252ZXJ0IGl0IGludG8gYSByZXN0IGFuZCBpZiBpdCdzXHJcbiAgICogYWxyZWFkeSBhIHJlc3Qgd2Ugd2lsbCB0cnkgdG8gaGlkZSBpdC5cclxuICAgKiBPcGVyYXRlcyBvbiBjdXJyZW50IHNlbGVjdGlvbnNcclxuICAgKiAqL1xyXG4gIGFzeW5jIGRlbGV0ZU5vdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnZGVsZXRlIG5vdGUnKTtcclxuICAgIHRoaXMudHJhY2tlci5zZWxlY3Rpb25zLmZvckVhY2goKHNlbCkgPT4ge1xyXG4gICAgICBpZiAoc2VsLm5vdGUpIHtcclxuXHJcbiAgICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwpO1xyXG5cclxuICAgICAgICAvLyBzZXQgdGhlIHBpdGNoIHRvIGJlIGEgZ29vZCBwb3NpdGlvbiBmb3IgdGhlIHJlc3RcclxuICAgICAgICBjb25zdCBwaXRjaCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICBTbW9NZWFzdXJlLmRlZmF1bHRQaXRjaEZvckNsZWZbc2VsLm1lYXN1cmUuY2xlZl0pKTtcclxuICAgICAgICBjb25zdCBhbHRQaXRjaCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICBTbW9NZWFzdXJlLmRlZmF1bHRQaXRjaEZvckNsZWZbYWx0U2VsIS5tZWFzdXJlLmNsZWZdKSk7XHJcbiAgICAgICAgc2VsLm5vdGUucGl0Y2hlcyA9IFtwaXRjaF07XHJcbiAgICAgICAgYWx0U2VsIS5ub3RlIS5waXRjaGVzID0gW2FsdFBpdGNoXTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIG5vdGUgaXMgYSBub3RlLCBtYWtlIGl0IGludG8gYSByZXN0LiAgSWYgdGhlIG5vdGUgaXMgYSByZXN0IGFscmVhZHksXHJcbiAgICAgICAgLy8gbWFrZSBpdCBpbnZpc2libGUuICBJZiBpdCBpcyBpbnZpc2libGUgYWxyZWFkeSwgbWFrZSBpdCBiYWNrIGludG8gYSByZXN0LlxyXG4gICAgICAgIGlmIChzZWwubm90ZS5pc1Jlc3QoKSAmJiAhc2VsLm5vdGUuaXNIaWRkZW4oKSkge1xyXG4gICAgICAgICAgc2VsLm5vdGUubWFrZUhpZGRlbih0cnVlKTtcclxuICAgICAgICAgIGFsdFNlbCEubm90ZSEubWFrZUhpZGRlbih0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2VsLm5vdGUuY2xlYXJBcnRpY3VsYXRpb25zKCk7XHJcbiAgICAgICAgICBzZWwubm90ZS5tYWtlUmVzdCgpO1xyXG4gICAgICAgICAgYWx0U2VsIS5ub3RlIS5tYWtlUmVzdCgpO1xyXG4gICAgICAgICAgYWx0U2VsIS5ub3RlIS5jbGVhckFydGljdWxhdGlvbnMoKTtcclxuICAgICAgICAgIHNlbC5ub3RlLm1ha2VIaWRkZW4oZmFsc2UpO1xyXG4gICAgICAgICAgYWx0U2VsIS5ub3RlIS5tYWtlSGlkZGVuKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpXHJcbiAgfVxyXG4gIC8qKlxyXG4gICogVGhlIGx5cmljIGVkaXRvciBtb3ZlcyBhcm91bmQsIHNvIHdlIGNhbid0IGRlcGVuZCBvbiB0aGUgdHJhY2tlciBmb3IgdGhlXHJcbiAgKiBjb3JyZWN0IHNlbGVjdGlvbi4gIFdlIGdldCBpdCBkaXJlY3RseSBmcm9tIHRoZSBlZGl0b3IuXHJcbiAgKiBcclxuICAqIEBwYXJhbSBzZWxlY3RvciAtIHRoZSBzZWxlY3RvciBvZiB0aGUgbm90ZSB3aXRoIHRoZSBseXJpYyB0byByZW1vdmVcclxuICAqIEBwYXJhbSBseXJpYyAtIGEgY29weSBvZiB0aGUgbHlyaWMgdG8gcmVtb3ZlLiAgV2UgdXNlIHRoZSB2ZXJzZSwgcGFyc2VyIHRvIGlkZW50aWZ5IGl0XHJcbiAgKiBAcmV0dXJucyByZW5kZXIgcHJvbWlzZVxyXG4gICovXHJcbiAgYXN5bmMgcmVtb3ZlTHlyaWMoc2VsZWN0b3I6IFNtb1NlbGVjdG9yLCBseXJpYzogU21vTHlyaWMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IFNtb1NlbGVjdGlvbi5ub3RlRnJvbVNlbGVjdG9yKHRoaXMuc2NvcmUsIHNlbGVjdG9yKTtcclxuICAgIGlmIChzZWxlY3Rpb24gPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2VIZWxwZXJzLmVtcHR5UHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdW5kb1NlbGVjdGlvbigncmVtb3ZlIGx5cmljJywgc2VsZWN0aW9uKTtcclxuICAgIHNlbGVjdGlvbi5ub3RlIS5yZW1vdmVMeXJpYyhseXJpYyk7XHJcbiAgICBjb25zdCBlcXVpdiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIGNvbnN0IHN0b3JlTHlyaWMgPSBlcXVpdiEubm90ZSEuZ2V0THlyaWNGb3JWZXJzZShseXJpYy52ZXJzZSwgbHlyaWMucGFyc2VyKTtcclxuICAgIGlmICh0eXBlb2YgKHN0b3JlTHlyaWMpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBlcXVpdiEubm90ZSEucmVtb3ZlTHlyaWMobHlyaWMpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRUb1JlcGxhY2VRdWV1ZShzZWxlY3Rpb24pO1xyXG4gICAgbHlyaWMuZGVsZXRlZCA9IHRydWU7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBzZWxlY3RvciB3aGVyZSB0byBhZGQgb3IgdXBkYXRlIHRoZSBseXJpY1xyXG4gICAqIEBwYXJhbSBseXJpYyBhIGNvcHkgb2YgdGhlIGx5cmljIHRvIHJlbW92ZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZE9yVXBkYXRlTHlyaWMoc2VsZWN0b3I6IFNtb1NlbGVjdG9yLCBseXJpYzogU21vTHlyaWMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IFNtb1NlbGVjdGlvbi5ub3RlRnJvbVNlbGVjdG9yKHRoaXMuc2NvcmUsIHNlbGVjdG9yKTtcclxuICAgIGlmIChzZWxlY3Rpb24gPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdW5kb1NlbGVjdGlvbigndXBkYXRlIGx5cmljJywgc2VsZWN0aW9uKTtcclxuICAgIHNlbGVjdGlvbi5ub3RlIS5hZGRMeXJpYyhseXJpYyk7XHJcbiAgICBjb25zdCBlcXVpdiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIGNvbnN0IGFsdEx5cmljID0gU21vTm90ZU1vZGlmaWVyQmFzZS5kZXNlcmlhbGl6ZShseXJpYy5zZXJpYWxpemUoKSBhcyBhbnkpIGFzIFNtb0x5cmljO1xyXG4gICAgZXF1aXYhLm5vdGUhLmFkZEx5cmljKGFsdEx5cmljKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUoc2VsZWN0aW9uKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIGFsbCB0aGUgbm90ZXMgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdm9pY2VcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBkZXBvcHVsYXRlVm9pY2UoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnZGVwb3B1bGF0ZSB2b2ljZScpO1xyXG4gICAgbWVhc3VyZVNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IGl4ID0gc2VsZWN0aW9uLm1lYXN1cmUuZ2V0QWN0aXZlVm9pY2UoKTtcclxuICAgICAgaWYgKGl4ICE9PSAwKSB7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLmRlcG9wdWxhdGVWb2ljZShzZWxlY3Rpb24sIGl4KTtcclxuICAgICAgICBjb25zdCBlcXVpdiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgICBTbW9PcGVyYXRpb24uZGVwb3B1bGF0ZVZvaWNlKGVxdWl2ISwgaXgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIFNtb09wZXJhdGlvbi5zZXRBY3RpdmVWb2ljZSh0aGlzLnNjb3JlLCAwKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlIHRoZSBhY3RpdmUgdm9pY2UgaW4gYSBtdWx0aS12b2ljZSBtZWFzdXJlLlxyXG4gICAqIEBwYXJhbSBpbmRleCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBfY2hhbmdlQWN0aXZlVm9pY2UoaW5kZXg6IG51bWJlcik6IFNtb1NlbGVjdGlvbltdIHtcclxuICAgIGNvbnN0IG1lYXN1cmVzVG9BZGQ6IFNtb1NlbGVjdGlvbltdID0gW107XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdCh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucyk7XHJcbiAgICBtZWFzdXJlU2VsZWN0aW9ucy5mb3JFYWNoKChtZWFzdXJlU2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gbWVhc3VyZVNlbGVjdGlvbi5tZWFzdXJlLnZvaWNlcy5sZW5ndGgpIHtcclxuICAgICAgICBtZWFzdXJlc1RvQWRkLnB1c2gobWVhc3VyZVNlbGVjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG1lYXN1cmVzVG9BZGQ7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFBvcHVsYXRlIGEgbmV3IHZvaWNlIHdpdGggZGVmYXVsdCBub3Rlc1xyXG4gICAqIEBwYXJhbSBpbmRleCB0aGUgdm9pY2UgdG8gcG9wdWxhdGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBwb3B1bGF0ZVZvaWNlKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1lYXN1cmVzVG9BZGQgPSB0aGlzLl9jaGFuZ2VBY3RpdmVWb2ljZShpbmRleCk7XHJcbiAgICBpZiAobWVhc3VyZXNUb0FkZC5sZW5ndGggPT09IDApIHtcclxuICAgICAgU21vT3BlcmF0aW9uLnNldEFjdGl2ZVZvaWNlKHRoaXMuc2NvcmUsIGluZGV4KTtcclxuICAgICAgdGhpcy50cmFja2VyLnNlbGVjdEFjdGl2ZVZvaWNlKCk7XHJcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICAgIH1cclxuICAgIG1lYXN1cmVzVG9BZGQuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIHRoaXMuX3VuZG9TZWxlY3Rpb24oJ3BvcHVhbHRlVm9pY2UnLCBzZWxlY3Rpb24pO1xyXG4gICAgICBTbW9PcGVyYXRpb24ucG9wdWxhdGVWb2ljZShzZWxlY3Rpb24sIGluZGV4KTtcclxuICAgICAgY29uc3QgZXF1aXYgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5wb3B1bGF0ZVZvaWNlKGVxdWl2ISwgaW5kZXgpO1xyXG4gICAgfSk7XHJcbiAgICBTbW9PcGVyYXRpb24uc2V0QWN0aXZlVm9pY2UodGhpcy5zY29yZSwgaW5kZXgpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVzVG9BZGQpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHN3YXBWb2ljZXModm9pY2UxOiBudW1iZXIsIHZvaWNlMjogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkTWVhc3VyZXMoKTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi5zd2FwVm9pY2Uoc2VsZWN0aW9ucywgdm9pY2UxLCB2b2ljZTIpO1xyXG4gICAgU21vT3BlcmF0aW9uLnN3YXBWb2ljZShhbHRTZWxlY3Rpb25zLCB2b2ljZTEsIHZvaWNlMik7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMoc2VsZWN0aW9ucyk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFzc2lnbiBhbiBpbnN0cnVtZW50IHRvIGEgc2V0IG9mIG1lYXN1cmVzXHJcbiAgICogQHBhcmFtIGluc3RydW1lbnQgdGhlIGluc3RydW1lbnQgdG8gYXNzaWduIHRvIHRoZSBzZWxlY3Rpb25zXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbnMgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgY2hhbmdlSW5zdHJ1bWVudChpbnN0cnVtZW50OiBTbW9JbnN0cnVtZW50LCBzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHR5cGVvZiAoc2VsZWN0aW9ucykgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIH1cclxuICAgIHRoaXMuX3VuZG9TZWxlY3Rpb25zKCdjaGFuZ2UgaW5zdHJ1bWVudCcsIHNlbGVjdGlvbnMpO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9ucyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLmNoYW5nZUluc3RydW1lbnQoaW5zdHJ1bWVudCwgc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24uY2hhbmdlSW5zdHJ1bWVudChpbnN0cnVtZW50LCBhbHRTZWxlY3Rpb25zKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhzZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHRpbWUgc2lnbmF0dXJlIGZvciBhIHNlbGVjdGlvblxyXG4gICAqIEBwYXJhbSB0aW1lU2lnbmF0dXJlIGFjdHVhbCB0aW1lIHNpZ25hdHVyZVxyXG4gICAqL1xyXG4gIGFzeW5jIHNldFRpbWVTaWduYXR1cmUodGltZVNpZ25hdHVyZTogVGltZVNpZ25hdHVyZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdTZXQgdGltZSBzaWduYXR1cmUnKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi5zZXRUaW1lU2lnbmF0dXJlKHRoaXMuc2NvcmUsIHNlbGVjdGlvbnMsIHRpbWVTaWduYXR1cmUpO1xyXG4gICAgU21vT3BlcmF0aW9uLnNldFRpbWVTaWduYXR1cmUodGhpcy5zdG9yZVNjb3JlLCBhbHRTZWxlY3Rpb25zLCB0aW1lU2lnbmF0dXJlKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTW92ZSBzZWxlY3RlZCBzdGFmZiB1cCBvciBkb3duIGluIHRoZSBzY29yZS5cclxuICAgKiBAcGFyYW0gaW5kZXggZGlyZWN0aW9uIHRvIG1vdmVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU3RhZmZVcERvd24oaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdyZS1vcmRlciBzdGF2ZXMnKTtcclxuICAgIC8vIEdldCBzdGFmZiB0byBtb3ZlXHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdKTtcclxuICAgIC8vIE1ha2UgdGhlIG1vdmUgaW4gdGhlIG1vZGVsLCBhbmQgcmVzZXQgdGhlIHZpZXcgc28gd2UgY2FuIHNlZSB0aGUgbmV3XHJcbiAgICAvLyBhcnJhbmdlbWVudFxyXG4gICAgU21vT3BlcmF0aW9uLm1vdmVTdGFmZlVwRG93bih0aGlzLnN0b3JlU2NvcmUsIHNlbGVjdGlvbiEsIGluZGV4KTtcclxuICAgIHRoaXMudmlld0FsbCgpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgc3RhZmYgZ3JvdXAgZm9yIGEgc2NvcmUsIHdoaWNoIGRldGVybWluZXMgaG93IHRoZSBzdGF2ZXNcclxuICAgKiBhcmUganVzdGlmaWVkIGFuZCBicmFja2V0ZWRcclxuICAgKiBAcGFyYW0gc3RhZmZHcm91cCBcclxuICAgKi9cclxuICBhc3luYyBhZGRPclVwZGF0ZVN0YWZmR3JvdXAoc3RhZmZHcm91cDogU21vU3lzdGVtR3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnZ3JvdXAgc3RhdmVzJyk7XHJcbiAgICAvLyBBc3N1bWUgdGhhdCB0aGUgdmlldyBpcyBub3cgc2V0IHRvIGZ1bGwgc2NvcmVcclxuICAgIHRoaXMuc2NvcmUuYWRkT3JSZXBsYWNlU3lzdGVtR3JvdXAoc3RhZmZHcm91cCk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuYWRkT3JSZXBsYWNlU3lzdGVtR3JvdXAoc3RhZmZHcm91cCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldERpcnR5KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgdXBkYXRlVGFiU3RhdmUodGFiU3RhdmU6IFNtb1RhYlN0YXZlKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVzQmV0d2Vlbih0aGlzLnNjb3JlLCB0YWJTdGF2ZS5zdGFydFNlbGVjdG9yLCB0YWJTdGF2ZS5lbmRTZWxlY3Rvcik7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb25zID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICBpZiAoc2VsZWN0aW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdW5kb1NlbGVjdGlvbnMoJ3VwZGF0ZVRhYlN0YXZlJywgc2VsZWN0aW9ucyk7XHJcbiAgICBjb25zdCBzdGFmZjogbnVtYmVyID0gc2VsZWN0aW9uc1swXS5zZWxlY3Rvci5zdGFmZjtcclxuICAgIGNvbnN0IGFsdFN0YWZmID0gYWx0U2VsZWN0aW9uc1swXS5zZWxlY3Rvci5zdGFmZjtcclxuICAgIGNvbnN0IGFsdFRhYlN0YXZlID0gbmV3IFNtb1RhYlN0YXZlKHRhYlN0YXZlLnNlcmlhbGl6ZSgpKTtcclxuICAgIGFsdFRhYlN0YXZlLnN0YXJ0U2VsZWN0b3Iuc3RhZmYgPSBhbHRTdGFmZjtcclxuICAgIGFsdFRhYlN0YXZlLmVuZFNlbGVjdG9yLnN0YWZmID0gYWx0U3RhZmY7XHJcbiAgICBhbHRUYWJTdGF2ZS5hdHRycy5pZCA9IHRhYlN0YXZlLmF0dHJzLmlkO1xyXG4gICAgdGhpcy5zY29yZS5zdGF2ZXNbc3RhZmZdLnVwZGF0ZVRhYlN0YXZlKHRhYlN0YXZlKTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbYWx0U3RhZmZdLnVwZGF0ZVRhYlN0YXZlKGFsdFRhYlN0YXZlKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyByZW1vdmVUYWJTdGF2ZSgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIGlmIChzZWxlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl91bmRvU2VsZWN0aW9ucygndXBkYXRlVGFiU3RhdmUnLCBzZWxlY3Rpb25zKTtcclxuICAgIGNvbnN0IHN0YXZlc1RvUmVtb3ZlOiBTbW9UYWJTdGF2ZVtdID0gW107XHJcbiAgICBjb25zdCBhbHRTdGF2ZXNUb1JlbW92ZTogU21vVGFiU3RhdmVbXSA9IFtdO1xyXG4gICAgY29uc3QgYWRkZWQ6IFJlY29yZDxzdHJpbmcsIFNtb1RhYlN0YXZlPiA9IHt9O1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwsIGl4KSA9PiB7XHJcbiAgICAgIGNvbnN0IGFsdFNlbCA9IGFsdFNlbGVjdGlvbnNbaXhdO1xyXG4gICAgICBjb25zdCB0YWJTdGF2ZSA9IHNlbC5zdGFmZi5nZXRUYWJTdGF2ZUZvck1lYXN1cmUoc2VsLnNlbGVjdG9yKTtcclxuICAgICAgY29uc3QgYWx0VGFiU3RhdmUgPSBhbHRTZWwuc3RhZmYuZ2V0VGFiU3RhdmVGb3JNZWFzdXJlKGFsdFNlbC5zZWxlY3Rvcik7XHJcbiAgICAgIGlmICh0YWJTdGF2ZSAmJiBhbHRUYWJTdGF2ZSkge1xyXG4gICAgICAgIGlmICghYWRkZWRbdGFiU3RhdmUuYXR0cnMuaWRdKSB7XHJcbiAgICAgICAgICBhZGRlZFt0YWJTdGF2ZS5hdHRycy5pZF0gPSB0YWJTdGF2ZTtcclxuICAgICAgICAgIHN0YXZlc1RvUmVtb3ZlLnB1c2godGFiU3RhdmUpO1xyXG4gICAgICAgICAgYWx0U3RhdmVzVG9SZW1vdmUucHVzaChhbHRUYWJTdGF2ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHNlbGVjdGlvbnNbMF0uc3RhZmYucmVtb3ZlVGFiU3RhdmVzKHN0YXZlc1RvUmVtb3ZlKTtcclxuICAgIGFsdFNlbGVjdGlvbnNbMF0uc3RhZmYucmVtb3ZlVGFiU3RhdmVzKGFsdFN0YXZlc1RvUmVtb3ZlKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGVtcG8gZm9yIGFsbCBvciBwYXJ0IG9mIHRoZSBzY29yZVxyXG4gICAqIEBwYXJhbSBtZWFzdXJlIHRoZSBtZWFzdXJlIHdpdGggdGhlIHRlbXBvLiAgVGVtcG8gaXMgbWVhc3VyZS13aWRlIHBhcmFtZXRlclxyXG4gICAqIEBwYXJhbSBzY29yZU1vZGUgaWYgdHJ1ZSwgdXBkYXRlIHdob2xlIHNjb3JlLiAgRWxzZSBzZWxlY3Rpb25zXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlVGVtcG9TY29yZShtZWFzdXJlOiBTbW9NZWFzdXJlLCB0ZW1wbzogU21vVGVtcG9UZXh0LCBzY29yZU1vZGU6IGJvb2xlYW4sIHNlbGVjdGlvbk1vZGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtZWFzdXJlSW5kZXggPSAwOyAgICBcclxuICAgIGNvbnN0IG9yaWdpbmFsVGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KG1lYXN1cmUudGVtcG8pO1xyXG4gICAgdGhpcy5fdW5kb0NvbHVtbigndXBkYXRlIHRlbXBvJywgbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCk7XHJcbiAgICBsZXQgc3RhcnRNZWFzdXJlID0gbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleDtcclxuICAgIGxldCBlbmRNZWFzdXJlID0gdGhpcy5zY29yZS5zdGF2ZXNbMF0ubWVhc3VyZXMubGVuZ3RoO1xyXG4gICAgbGV0IGRpc3BsYXllZCA9IGZhbHNlO1xyXG4gICAgaWYgKHNlbGVjdGlvbk1vZGUpIHtcclxuICAgICAgY29uc3QgZW5kU2VsID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oMSk7XHJcbiAgICAgIGlmIChlbmRTZWwuc2VsZWN0b3IubWVhc3VyZSA+IHN0YXJ0TWVhc3VyZSkge1xyXG4gICAgICAgIGVuZE1lYXN1cmUgPSBlbmRTZWwuc2VsZWN0b3IubWVhc3VyZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gSWYgd2UgYXJlIG9ubHkgY2hhbmdpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSB0ZXh0LCBpdCBvbmx5IGFmZmVjdHMgdGhlIHRlbXBvIG1lYXN1cmUuXHJcbiAgICBpZiAoU21vVGVtcG9UZXh0LmVxKG9yaWdpbmFsVGVtcG8sIHRlbXBvKSAmJiB0ZW1wby55T2Zmc2V0ICE9PSBvcmlnaW5hbFRlbXBvLnlPZmZzZXQgJiYgZW5kTWVhc3VyZSA+IHN0YXJ0TWVhc3VyZSkge1xyXG4gICAgICBlbmRNZWFzdXJlID0gc3RhcnRNZWFzdXJlICsgMTsgICAgICAgICAgXHJcbiAgICB9XHJcbiAgICBmb3IgKG1lYXN1cmVJbmRleCA9IHN0YXJ0TWVhc3VyZTsgbWVhc3VyZUluZGV4IDwgZW5kTWVhc3VyZTsgKyttZWFzdXJlSW5kZXgpIHtcclxuICAgICAgaWYgKCFzY29yZU1vZGUgJiYgIXNlbGVjdGlvbk1vZGUpIHtcclxuICAgICAgICAvLyBJZiBub3Qgd2hvbGUgc2NvcmUgb3Igc2VsZWN0aW9ucywgY2hhbmdlIHVudGlsIHRoZSB0ZW1wbyBkb2Vzbid0IG1hdGNoIHByZXZpb3VzIG1lYXN1cmUncyB0ZW1wbyAobmV4dCB0ZW1wbyBjaGFuZ2UpXHJcbiAgICAgICAgY29uc3QgY29tcE1lYXN1cmUgPSB0aGlzLnNjb3JlLnN0YXZlc1swXS5tZWFzdXJlc1ttZWFzdXJlSW5kZXhdO1xyXG4gICAgICAgIGlmIChTbW9UZW1wb1RleHQuZXEob3JpZ2luYWxUZW1wbywgY29tcE1lYXN1cmUudGVtcG8pIHx8IGRpc3BsYXllZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgIGNvbnN0IHNlbCA9IFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc2NvcmUsIDAsIG1lYXN1cmVJbmRleCk7XHJcbiAgICAgICAgICBjb25zdCBhbHRTZWwgPSBTbW9TZWxlY3Rpb24ubWVhc3VyZVNlbGVjdGlvbih0aGlzLnN0b3JlU2NvcmUsIDAsIG1lYXN1cmVJbmRleCk7XHJcbiAgICAgICAgICBpZiAoc2VsICYmIHNlbC5tZWFzdXJlLnRlbXBvLmRpc3BsYXkgJiYgIWRpc3BsYXllZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZFRvUmVwbGFjZVF1ZXVlKHNlbCk7XHJcbiAgICAgICAgICAgIGRpc3BsYXllZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICAgIFNtb09wZXJhdGlvbi5hZGRUZW1wbyh0aGlzLnNjb3JlLCBzZWwsIHRlbXBvKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChhbHRTZWwpIHtcclxuICAgICAgICAgICAgU21vT3BlcmF0aW9uLmFkZFRlbXBvKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsLCB0ZW1wbyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBzZWwgPSBTbW9TZWxlY3Rpb24ubWVhc3VyZVNlbGVjdGlvbih0aGlzLnNjb3JlLCAwLCBtZWFzdXJlSW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbCA9IFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc3RvcmVTY29yZSwgMCwgbWVhc3VyZUluZGV4KTtcclxuICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICBTbW9PcGVyYXRpb24uYWRkVGVtcG8odGhpcy5zY29yZSwgc2VsLCB0ZW1wbyk7XHJcbiAgICAgICAgICBpZiAoIWRpc3BsYXllZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZFRvUmVwbGFjZVF1ZXVlKHNlbCk7XHJcbiAgICAgICAgICAgIGRpc3BsYXllZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhbHRTZWwpIHtcclxuICAgICAgICAgIFNtb09wZXJhdGlvbi5hZGRUZW1wbyh0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbCwgdGVtcG8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHVwZGF0ZVRhYk5vdGUodGFiTm90ZTogU21vVGFiTm90ZSkge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlc0JldHdlZW4odGhpcy5zY29yZSwgXHJcbiAgICAgIHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKS5zZWxlY3RvciwgdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oMSkuc2VsZWN0b3IpO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9ucyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpO1xyXG4gICAgdGhpcy5fdW5kb1NlbGVjdGlvbnMoJ3VwZGF0ZVRhYk5vdGUnLCBzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi51cGRhdGVUYWJOb3RlKHNlbGVjdGlvbnMsIHRhYk5vdGUpO1xyXG4gICAgU21vT3BlcmF0aW9uLnVwZGF0ZVRhYk5vdGUoYWx0U2VsZWN0aW9ucywgdGFiTm90ZSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZFRvUmVwbGFjZVF1ZXVlKHNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHJlbW92ZVRhYk5vdGUoKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVzQmV0d2Vlbih0aGlzLnNjb3JlLCBcclxuICAgICAgdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpLnNlbGVjdG9yLCB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKS5zZWxlY3Rvcik7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb25zID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICB0aGlzLl91bmRvU2VsZWN0aW9ucygndXBkYXRlVGFiTm90ZScsIHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLnJlbW92ZVRhYk5vdGUoc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24ucmVtb3ZlVGFiTm90ZShhbHRTZWxlY3Rpb25zKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUoc2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogJ3JlbW92ZScgdGVtcG8sIHdoaWNoIG1lYW5zIGVpdGhlciBzZXR0aW5nIHRoZSBiYXJzIHRvIHRoZSBcclxuICAgKiBkZWZhdWx0IHRlbXBvLCBvciB0aGUgcHJldmlvdXNseS1zZXQgdGVtcG8uXHJcbiAgICogQHBhcmFtIHNjb3JlTW9kZSB3aGV0aGVyIHRvIHJlc2V0IGVudGlyZSBzY29yZVxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZVRlbXBvKG1lYXN1cmU6IFNtb01lYXN1cmUsIHRlbXBvOiBTbW9UZW1wb1RleHQsIHNjb3JlTW9kZTogYm9vbGVhbiwgc2VsZWN0aW9uTW9kZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc3RhcnRTZWxlY3Rpb24gPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1swXTtcclxuICAgIGlmIChzdGFydFNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlID4gMCkge1xyXG4gICAgICBjb25zdCBtZWFzdXJlSXggPSBzdGFydFNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlIC0gMTtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gc3RhcnRTZWxlY3Rpb24uc3RhZmYubWVhc3VyZXNbbWVhc3VyZUl4XTtcclxuICAgICAgY29uc3QgdGVtcG8gPSB0YXJnZXQuZ2V0VGVtcG8oKTtcclxuICAgICAgY29uc3QgbmV3VGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KHRlbXBvKTtcclxuICAgICAgbmV3VGVtcG8uZGlzcGxheSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRlbXBvU2NvcmUobWVhc3VyZSwgbmV3VGVtcG8sIHNjb3JlTW9kZSwgc2VsZWN0aW9uTW9kZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVwZGF0ZVRlbXBvU2NvcmUobWVhc3VyZSwgbmV3IFNtb1RlbXBvVGV4dChTbW9UZW1wb1RleHQuZGVmYXVsdHMpLCBzY29yZU1vZGUsIHNlbGVjdGlvbk1vZGUpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCBhIGdyYWNlIG5vdGUgdG8gdGhlIHNlbGVjdGVkIHJlYWwgbm90ZXMuXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkR3JhY2VOb3RlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ2FkZCBncmFjZSBub3RlJyk7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbi5ub3RlIS5nZXRHcmFjZU5vdGVzKCkubGVuZ3RoO1xyXG4gICAgICBjb25zdCBwaXRjaGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWxlY3Rpb24ubm90ZSEucGl0Y2hlcykpO1xyXG4gICAgICBjb25zdCBncmFjZSA9IG5ldyBTbW9HcmFjZU5vdGUoe1xyXG4gICAgICAgIHBpdGNoZXMsIHRpY2tzOlxyXG4gICAgICAgICAgeyBudW1lcmF0b3I6IDIwNDgsIGRlbm9taW5hdG9yOiAxLCByZW1haW5kZXI6IDAgfVxyXG4gICAgICB9KTtcclxuICAgICAgU21vT3BlcmF0aW9uLmFkZEdyYWNlTm90ZShzZWxlY3Rpb24sIGdyYWNlLCBpbmRleCk7XHJcblxyXG4gICAgICBjb25zdCBhbHRQaXRjaGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWxlY3Rpb24ubm90ZSEucGl0Y2hlcykpO1xyXG4gICAgICBjb25zdCBhbHRHcmFjZSA9IG5ldyBTbW9HcmFjZU5vdGUoe1xyXG4gICAgICAgIHBpdGNoZXM6IGFsdFBpdGNoZXMsIHRpY2tzOlxyXG4gICAgICAgICAgeyBudW1lcmF0b3I6IDIwNDgsIGRlbm9taW5hdG9yOiAxLCByZW1haW5kZXI6IDAgfVxyXG4gICAgICB9KTtcclxuICAgICAgYWx0R3JhY2UuYXR0cnMuaWQgPSBncmFjZS5hdHRycy5pZDtcclxuICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICBTbW9PcGVyYXRpb24uYWRkR3JhY2VOb3RlKGFsdFNlbGVjdGlvbiEsIGFsdEdyYWNlLCBpbmRleCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHJlbW92ZSBzZWxlY3RlZCBncmFjZSBub3RlXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVHcmFjZU5vdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygncmVtb3ZlIGdyYWNlIG5vdGUnKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIC8vIFRPRE86IGdldCB0aGUgY29ycmVjdCBvZmZzZXRcclxuICAgICAgU21vT3BlcmF0aW9uLnJlbW92ZUdyYWNlTm90ZShzZWxlY3Rpb24sIDApO1xyXG4gICAgICBjb25zdCBhbHRTZWwgPSAodGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnJlbW92ZUdyYWNlTm90ZShhbHRTZWwhLCAwKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBUb2dnbGUgc2xhc2ggaW4gc3RlbSBvZiBncmFjZSBub3RlXHJcbiAgICovXHJcbiAgYXN5bmMgc2xhc2hHcmFjZU5vdGVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZ3JhY2UgPSB0aGlzLnRyYWNrZXIuZ2V0U2VsZWN0ZWRHcmFjZU5vdGVzKCk7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnc2xhc2ggZ3JhY2Ugbm90ZSB0b2dnbGUnKTtcclxuICAgIGdyYWNlLmZvckVhY2goKGduKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5zbGFzaEdyYWNlTm90ZXMoZ24pO1xyXG4gICAgICBpZiAoZ24uc2VsZWN0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihnbi5zZWxlY3Rpb24pO1xyXG4gICAgICAgIGNvbnN0IGFsdEduID0gdGhpcy5fZ2V0RXF1aXZhbGVudEdyYWNlTm90ZShhbHRTZWxlY3Rpb24hLCBnbi5tb2RpZmllciBhcyBTbW9HcmFjZU5vdGUpO1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi5zbGFzaEdyYWNlTm90ZXMoe1xyXG4gICAgICAgICAgc2VsZWN0aW9uOiBhbHRTZWxlY3Rpb24sIG1vZGlmaWVyOiBhbHRHbiBhcyBhbnksXHJcbiAgICAgICAgICBib3g6IFN2Z0JveC5kZWZhdWx0LCBpbmRleDogMFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgdHJhbnNwb3NlU2NvcmUob2Zmc2V0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgndHJhbnNwb3NlIHNjb3JlJyk7XHJcbiAgICBTbW9PcGVyYXRpb24udHJhbnNwb3NlU2NvcmUodGhpcy5zY29yZSwgb2Zmc2V0KTtcclxuICAgIFNtb09wZXJhdGlvbi50cmFuc3Bvc2VTY29yZSh0aGlzLnN0b3JlU2NvcmUsIG9mZnNldCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyQWxsKCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdHJhbnNwb3NlIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHBhcmFtIG9mZnNldCAxLzIgc3RlcHNcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB0cmFuc3Bvc2VTZWxlY3Rpb25zKG9mZnNldDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygndHJhbnNwb3NlJyk7XHJcbiAgICBjb25zdCBncmFjZSA9IHRoaXMudHJhY2tlci5nZXRTZWxlY3RlZEdyYWNlTm90ZXMoKTtcclxuICAgIGlmIChncmFjZS5sZW5ndGgpIHtcclxuICAgICAgZ3JhY2UuZm9yRWFjaCgoYXJ0aWZhY3QpID0+IHtcclxuICAgICAgICBpZiAoYXJ0aWZhY3Quc2VsZWN0aW9uICE9PSBudWxsICYmIGFydGlmYWN0LnNlbGVjdGlvbi5ub3RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBjb25zdCBnbjEgPSBhcnRpZmFjdC5tb2RpZmllciBhcyBTbW9HcmFjZU5vdGU7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGFydGlmYWN0LnNlbGVjdGlvbi5ub3RlLmdyYWNlTm90ZXMuZmluZEluZGV4KCh4KSA9PiB4LmF0dHJzLmlkID09PSBnbjEuYXR0cnMuaWQpO1xyXG4gICAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihhcnRpZmFjdC5zZWxlY3Rpb24pO1xyXG4gICAgICAgICAgaWYgKGFsdFNlbGVjdGlvbiAmJiBhbHRTZWxlY3Rpb24ubm90ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBnbjIgPSBhbHRTZWxlY3Rpb24ubm90ZS5ncmFjZU5vdGVzW2luZGV4XTtcclxuICAgICAgICAgICAgU21vT3BlcmF0aW9uLnRyYW5zcG9zZUdyYWNlTm90ZXMoYWx0U2VsZWN0aW9uISwgW2duMl0sIG9mZnNldCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBTbW9PcGVyYXRpb24udHJhbnNwb3NlR3JhY2VOb3RlcyhhcnRpZmFjdC5zZWxlY3Rpb24sIFtnbjFdLCBvZmZzZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3RlZCkgPT4ge1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi50cmFuc3Bvc2Uoc2VsZWN0ZWQsIG9mZnNldCk7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3RlZCk7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRyYW5zcG9zZShhbHRTZWwhLCBvZmZzZXQpO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKHNlbGVjdGlvbnMubGVuZ3RoID09PSAxICYmIHRoaXMuc2NvcmUucHJlZmVyZW5jZXMuYXV0b1BsYXkpIHtcclxuICAgICAgICBTdWlPc2NpbGxhdG9yLnBsYXlTZWxlY3Rpb25Ob3coc2VsZWN0aW9uc1swXSwgdGhpcy5zY29yZSwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdG9nZ2xlIHRoZSBhY2NpZGVudGFsIHNwZWxsaW5nIG9mIHRoZSBzZWxlY3RlZCBub3Rlc1xyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgYXN5bmMgdG9nZ2xlRW5oYXJtb25pYygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCd0b2dnbGUgZW5oYXJtb25pYycpO1xyXG4gICAgY29uc3QgZ3JhY2UgPSB0aGlzLnRyYWNrZXIuZ2V0U2VsZWN0ZWRHcmFjZU5vdGVzKCk7XHJcbiAgICBpZiAoZ3JhY2UubGVuZ3RoKSB7XHJcbiAgICAgIGdyYWNlLmZvckVhY2goKGFydGlmYWN0KSA9PiB7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZUdyYWNlTm90ZUVuaGFybW9uaWMoYXJ0aWZhY3Quc2VsZWN0aW9uISwgW2FydGlmYWN0Lm1vZGlmaWVyIGFzIFNtb0dyYWNlTm90ZV0pO1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oYXJ0aWZhY3Quc2VsZWN0aW9uISk7XHJcbiAgICAgICAgY29uc3QgYWx0R3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50R3JhY2VOb3RlKGFsdFNlbGVjdGlvbiEsIGFydGlmYWN0Lm1vZGlmaWVyIGFzIFNtb0dyYWNlTm90ZSk7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZUdyYWNlTm90ZUVuaGFybW9uaWMoYWx0U2VsZWN0aW9uISxcclxuICAgICAgICAgIFthbHRHcl0pO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0ZWQpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIChzZWxlY3RlZC5zZWxlY3Rvci5waXRjaGVzKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgIHNlbGVjdGVkLnNlbGVjdG9yLnBpdGNoZXMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZUVuaGFybW9uaWMoc2VsZWN0ZWQpO1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0ZWQpO1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVFbmhhcm1vbmljKGFsdFNlbCEpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSBjYXV0aW9uYXJ5L2NvdXJ0ZXN5IGFjY2lkZW50YWxzXHJcbiAgICovXHJcbiAgYXN5bmMgdG9nZ2xlQ291cnRlc3lBY2NpZGVudGFscygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCd0b2dnbGUgY291cnRlc3kgYWNjaWRlbnRhbCcpO1xyXG4gICAgY29uc3QgZ3JhY2UgPSB0aGlzLnRyYWNrZXIuZ2V0U2VsZWN0ZWRHcmFjZU5vdGVzKCk7XHJcbiAgICBpZiAoZ3JhY2UubGVuZ3RoKSB7XHJcbiAgICAgIGdyYWNlLmZvckVhY2goKGFydGlmYWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ24xID0gW2FydGlmYWN0Lm1vZGlmaWVyXSBhcyBTbW9HcmFjZU5vdGVbXTtcclxuICAgICAgICBTbW9PcGVyYXRpb24udG9nZ2xlR3JhY2VOb3RlQ291cnRlc3koYXJ0aWZhY3Quc2VsZWN0aW9uLCBnbjEpO1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oYXJ0aWZhY3Quc2VsZWN0aW9uISk7XHJcbiAgICAgICAgY29uc3QgZ24yID0gdGhpcy5fZ2V0RXF1aXZhbGVudEdyYWNlTm90ZShhbHRTZWwhLCBnbjFbMF0pO1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVHcmFjZU5vdGVDb3VydGVzeShhbHRTZWwhLCBbZ24yXSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgICBTbW9PcGVyYXRpb24udG9nZ2xlQ291cnRlc3lBY2NpZGVudGFsKHNlbGVjdGlvbik7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVDb3VydGVzeUFjY2lkZW50YWwoYWx0U2VsISk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogY2hhbmdlIHRoZSBkdXJhdGlvbiBvZiBub3RlcyBmb3Igc2VsZWN0ZWQsIGNyZWF0aW5nIG1vcmUgXHJcbiAgICogb3IgZmV3ZXIgbm90ZXMuIFxyXG4gICAqIEFmdGVyIHRoZSBjaGFuZ2UsIHJlc2V0IHRoZSBzZWxlY3Rpb24gc28gaXQncyBhcyBjbG9zZSBhcyBwb3NzaWJsZSBcclxuICAgKiB0byB0aGUgb3JpZ2luYWwgbGVuZ3RoXHJcbiAgICogQHBhcmFtIG9wZXJhdGlvbiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBiYXRjaER1cmF0aW9uT3BlcmF0aW9uKG9wZXJhdGlvbjogQmF0Y2hTZWxlY3Rpb25PcGVyYXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdjaGFuZ2UgZHVyYXRpb24nKTtcclxuICAgIGNvbnN0IGdyYWNlID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkR3JhY2VOb3RlcygpO1xyXG4gICAgY29uc3QgZ3JhY2VNYXA6IFJlY29yZDxzdHJpbmcsIEJhdGNoU2VsZWN0aW9uT3BlcmF0aW9uPiA9IHtcclxuICAgICAgZG91YmxlRHVyYXRpb246ICdkb3VibGVHcmFjZU5vdGVEdXJhdGlvbicsXHJcbiAgICAgIGhhbHZlRHVyYXRpb246ICdoYWx2ZUdyYWNlTm90ZUR1cmF0aW9uJ1xyXG4gICAgfTtcclxuICAgIGlmIChncmFjZS5sZW5ndGggJiYgdHlwZW9mIChncmFjZU1hcFtvcGVyYXRpb25dKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgb3BlcmF0aW9uID0gZ3JhY2VNYXBbb3BlcmF0aW9uXTtcclxuICAgICAgZ3JhY2UuZm9yRWFjaCgoYXJ0aWZhY3QpID0+IHtcclxuICAgICAgICAoU21vT3BlcmF0aW9uIGFzIGFueSlbb3BlcmF0aW9uXShhcnRpZmFjdC5zZWxlY3Rpb24sIGFydGlmYWN0Lm1vZGlmaWVyKTtcclxuICAgICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGFydGlmYWN0LnNlbGVjdGlvbiEpO1xyXG4gICAgICAgIGNvbnN0IGduMiA9IHRoaXMuX2dldEVxdWl2YWxlbnRHcmFjZU5vdGUoYWx0U2VsZWN0aW9uISwgYXJ0aWZhY3QubW9kaWZpZXIgYXMgU21vR3JhY2VOb3RlKTtcclxuICAgICAgICAoU21vT3BlcmF0aW9uIGFzIGFueSlbb3BlcmF0aW9uXShhbHRTZWxlY3Rpb24hLCBnbjIpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGFsdEFyID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5iYXRjaFNlbGVjdGlvbk9wZXJhdGlvbih0aGlzLnNjb3JlLCBzZWxlY3Rpb25zLCBvcGVyYXRpb24pO1xyXG4gICAgICBTbW9PcGVyYXRpb24uYmF0Y2hTZWxlY3Rpb25PcGVyYXRpb24odGhpcy5zdG9yZVNjb3JlLCBhbHRBciwgb3BlcmF0aW9uKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIHNlbGVjdGVkIG1vZGlmaWVyIG9uIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHBhcmFtIG1vZGlmaWVyIFxyXG4gICAqIEBwYXJhbSBjdG9yIHBhcmVudCBjbGFzcyBjb25zdHJ1Y3RvciAoZS5nLiBTbW9Pcm5hbWVudClcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB0b2dnbGVBcnRpY3VsYXRpb24obW9kaWZpZXI6IHN0cmluZywgY3Rvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygndG9nZ2xlIGFydGljdWxhdGlvbicpO1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsKSA9PiB7XHJcbiAgICAgIGlmIChjdG9yID09PSAnU21vQXJ0aWN1bGF0aW9uJykge1xyXG4gICAgICAgIGNvbnN0IGFhID0gbmV3IFNtb0FydGljdWxhdGlvbih7IGFydGljdWxhdGlvbjogbW9kaWZpZXIgfSk7XHJcbiAgICAgICAgY29uc3QgYWx0QWEgPSBuZXcgU21vQXJ0aWN1bGF0aW9uKHsgYXJ0aWN1bGF0aW9uOiBtb2RpZmllciB9KTtcclxuICAgICAgICBhbHRBYS5hdHRycy5pZCA9IGFhLmF0dHJzLmlkO1xyXG4gICAgICAgIGlmIChzZWwubm90ZSkge1xyXG4gICAgICAgICAgc2VsLm5vdGUudG9nZ2xlQXJ0aWN1bGF0aW9uKGFhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwpO1xyXG4gICAgICAgIGlmIChhbHRTZWxlY3Rpb24gJiYgYWx0U2VsZWN0aW9uLm5vdGUpIHtcclxuICAgICAgICAgIGFsdFNlbGVjdGlvbi5ub3RlLnRvZ2dsZUFydGljdWxhdGlvbihhbHRBYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGFhID0gbmV3IFNtb09ybmFtZW50KHsgb3JuYW1lbnQ6IG1vZGlmaWVyIH0pO1xyXG4gICAgICAgIGNvbnN0IGFsdEFhID0gbmV3IFNtb09ybmFtZW50KHsgb3JuYW1lbnQ6IG1vZGlmaWVyIH0pO1xyXG4gICAgICAgIGFsdEFhLmF0dHJzLmlkID0gYWEuYXR0cnMuaWQ7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwhKTtcclxuICAgICAgICBpZiAoc2VsLm5vdGUpIHtcclxuICAgICAgICAgIHNlbC5ub3RlLnRvZ2dsZU9ybmFtZW50KGFhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsdFNlbGVjdGlvbiAmJiBhbHRTZWxlY3Rpb24ubm90ZSkge1xyXG4gICAgICAgICAgYWx0U2VsZWN0aW9uLm5vdGUudG9nZ2xlT3JuYW1lbnQoYWx0QWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHNldEFydGljdWxhdGlvbihtb2RpZmllcjogU21vQXJ0aWN1bGF0aW9uLCBzZXQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdzZXQgYXJ0aWN1bGF0aW9uJyk7XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgY29uc3QgYWx0QWEgPSBuZXcgU21vQXJ0aWN1bGF0aW9uKG1vZGlmaWVyKTtcclxuICAgICAgaWYgKHNlbC5ub3RlKSB7XHJcbiAgICAgICAgc2VsLm5vdGUuc2V0QXJ0aWN1bGF0aW9uKG1vZGlmaWVyLCBzZXQpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuICAgICAgaWYgKGFsdFNlbGVjdGlvbiAmJiBhbHRTZWxlY3Rpb24ubm90ZSkge1xyXG4gICAgICAgIGFsdFNlbGVjdGlvbi5ub3RlLnRvZ2dsZUFydGljdWxhdGlvbihhbHRBYSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpOyAgICBcclxuICB9XHJcbiAgYXN5bmMgc2V0T3JuYW1lbnQobW9kaWZpZXI6IFNtb09ybmFtZW50LCBzZXQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdzZXQgYXJ0aWN1bGF0aW9uJyk7XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgY29uc3QgYWx0QWEgPSBuZXcgU21vT3JuYW1lbnQobW9kaWZpZXIpO1xyXG4gICAgICBpZiAoc2VsLm5vdGUpIHtcclxuICAgICAgICBzZWwubm90ZS5zZXRPcm5hbWVudChtb2RpZmllciwgc2V0KTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbCk7XHJcbiAgICAgIGlmIChhbHRTZWxlY3Rpb24gJiYgYWx0U2VsZWN0aW9uLm5vdGUpIHtcclxuICAgICAgICBhbHRTZWxlY3Rpb24ubm90ZS5zZXRPcm5hbWVudChhbHRBYSwgc2V0KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7ICAgIFxyXG4gIH1cclxuICAvKipcclxuICAgKiBjb252ZXJ0IG5vbi10dXBsZXQgbm90IHRvIGEgdHVwbGV0XHJcbiAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAqL1xyXG4gIGFzeW5jIG1ha2VUdXBsZXQocGFyYW1zOiBNYWtlVHVwbGV0T3BlcmF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1swXTtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdtYWtlIHR1cGxldCcpO1xyXG4gICAgU21vT3BlcmF0aW9uLm1ha2VUdXBsZXQoc2VsZWN0aW9uLCBwYXJhbXMpO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24hKTtcclxuICAgIFNtb09wZXJhdGlvbi5tYWtlVHVwbGV0KGFsdFNlbGVjdGlvbiEsIHBhcmFtcyk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgc2VsZWN0ZWQgdHVwbGV0IHRvIGEgc2luZ2xlIChpZiBwb3NzaWJsZSkgbm9uLXR1cGxldFxyXG4gICAqL1xyXG4gIGFzeW5jIHVubWFrZVR1cGxldCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3VubWFrZSB0dXBsZXQnKTtcclxuICAgIFNtb09wZXJhdGlvbi51bm1ha2VUdXBsZXQoc2VsZWN0aW9uKTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIFNtb09wZXJhdGlvbi51bm1ha2VUdXBsZXQoYWx0U2VsZWN0aW9uISk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBjaG9yZCBieSBhZGRpbmcgYW4gaW50ZXJ2YWwgdG8gc2VsZWN0ZWQgbm90ZVxyXG4gICAqIEBwYXJhbSBpbnRlcnZhbCAxLzIgc3RlcHNcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBzZXRJbnRlcnZhbChpbnRlcnZhbDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnc2V0IGludGVydmFsJyk7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGVkKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5pbnRlcnZhbChzZWxlY3RlZCwgaW50ZXJ2YWwpO1xyXG4gICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGVkKTtcclxuICAgICAgU21vT3BlcmF0aW9uLmludGVydmFsKGFsdFNlbGVjdGlvbiEsIGludGVydmFsKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogY2hhbmdlIHRoZSBzZWxlY3RlZCBjaG9yZCBpbnRvIGEgc2luZ2xlIG5vdGVcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGFzeW5jIGNvbGxhcHNlQ2hvcmQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnY29sbGFwc2UgY2hvcmQnKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0ZWQpID0+IHtcclxuICAgICAgY29uc3Qgbm90ZTogU21vTm90ZSB8IG51bGwgPSBzZWxlY3RlZC5ub3RlO1xyXG4gICAgICBpZiAobm90ZSkge1xyXG4gICAgICAgIGNvbnN0IHBwID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShub3RlLnBpdGNoZXNbMF0pKTtcclxuICAgICAgICBjb25zdCBhbHRwcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobm90ZS5waXRjaGVzWzBdKSk7XHJcbiAgICAgICAgLy8gTm8gb3BlcmF0aW9uIGZvciB0aGlzP1xyXG4gICAgICAgIG5vdGUucGl0Y2hlcyA9IFtwcF07XHJcbiAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3RlZCk7XHJcbiAgICAgICAgYWx0U2VsZWN0aW9uIS5ub3RlIS5waXRjaGVzID0gW2FsdHBwXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSBjaGlja2VuLXNjcmF0Y2hlcywgZm9yIGphenogaW1wcm92LCBjb21waW5nIGV0Yy5cclxuICAgKi9cclxuICBhc3luYyB0b2dnbGVTbGFzaCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdtYWtlIHNsYXNoJyk7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBTbW9PcGVyYXRpb24udG9nZ2xlU2xhc2goc2VsZWN0aW9uKTtcclxuICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICBTbW9PcGVyYXRpb24udG9nZ2xlU2xhc2goYWx0U2VsISk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogbWFrZSBzZWxlY3RlZCBub3RlcyBpbnRvIGEgcmVzdCwgb3IgdmlzYS12ZXJzYVxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgYXN5bmMgbWFrZVJlc3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnbWFrZSByZXN0Jyk7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBTbW9PcGVyYXRpb24udG9nZ2xlUmVzdChzZWxlY3Rpb24pO1xyXG4gICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVSZXN0KGFsdFNlbCEpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIGNsZWFyQWxsQmVhbXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ2NsZWFyQWxsQmVhbXMnKTtcclxuICAgIFNtb09wZXJhdGlvbi5jbGVhckFsbEJlYW1Hcm91cHModGhpcy5zY29yZSk7XHJcbiAgICBTbW9PcGVyYXRpb24uY2xlYXJBbGxCZWFtR3JvdXBzKHRoaXMuc3RvcmVTY29yZSk7XHJcbiAgICBhd2FpdCB0aGlzLmF3YWl0UmVuZGVyKCk7XHJcbiAgfVxyXG4gIGFzeW5jIGNsZWFyU2VsZWN0ZWRCZWFtcygpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVzID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KHNlbGVjdGlvbnMpO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9ucyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLmNsZWFyQmVhbUdyb3Vwcyh0aGlzLnNjb3JlLCBzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi5jbGVhckJlYW1Hcm91cHModGhpcy5zdG9yZVNjb3JlLCBhbHRTZWxlY3Rpb25zKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlcyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdG9nZ2xlIHRoZSAnZW5kIGJlYW0nIGZsYWcgZm9yIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdW5iZWFtU2VsZWN0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCd0b2dnbGUgYmVhbSBncm91cCcpO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgU21vT3BlcmF0aW9uLnVuYmVhbVNlbGVjdGlvbnMoc2VsZWN0aW9uKTtcclxuICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICBTbW9PcGVyYXRpb24udW5iZWFtU2VsZWN0aW9ucyhhbHRTZWwhKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyB0b2dnbGVDdWUoKSB7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygndG9nZ2xlIG5vdGUgY3VlJyk7XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uLm5vdGUgJiYgc2VsZWN0aW9uLm5vdGUuaXNSZXN0KCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgc2VsZWN0aW9uLm5vdGUuaXNDdWUgPSAhc2VsZWN0aW9uLm5vdGUuaXNDdWU7XHJcbiAgICAgICAgaWYgKGFsdFNlbGVjdGlvbiAmJiBhbHRTZWxlY3Rpb24ubm90ZSkge1xyXG4gICAgICAgICAgYWx0U2VsZWN0aW9uLm5vdGUuaXNDdWUgPSBzZWxlY3Rpb24ubm90ZS5pc0N1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAqIHVwIG9yIGRvd25cclxuICAqIEByZXR1cm5zIFxyXG4gICovXHJcbiAgYXN5bmMgdG9nZ2xlQmVhbURpcmVjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGlmIChzZWxlY3Rpb25zLmxlbmd0aCA8IDEpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2VIZWxwZXJzLmVtcHR5UHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3RvZ2dsZSBiZWFtIGRpcmVjdGlvbicpO1xyXG4gICAgU21vT3BlcmF0aW9uLnRvZ2dsZUJlYW1EaXJlY3Rpb24oc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24udG9nZ2xlQmVhbURpcmVjdGlvbih0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCB0aGUgc2VsZWN0ZWQgbm90ZXMgdG8gYSBiZWFtIGdyb3VwXHJcbiAgICovXHJcbiAgYXN5bmMgYmVhbVNlbGVjdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnYmVhbSBzZWxlY3Rpb25zJyk7XHJcbiAgICBTbW9PcGVyYXRpb24uYmVhbVNlbGVjdGlvbnModGhpcy5zY29yZSwgc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24uYmVhbVNlbGVjdGlvbnModGhpcy5zdG9yZVNjb3JlLCB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGNoYW5nZSBrZXkgc2lnbmF0dXJlIGZvciBzZWxlY3RlZCBtZWFzdXJlc1xyXG4gICAqIEBwYXJhbSBrZXlTaWduYXR1cmUgdmV4IGtleSBzaWduYXR1cmVcclxuICAgKi9cclxuICBhc3luYyBhZGRLZXlTaWduYXR1cmUoa2V5U2lnbmF0dXJlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdzZXQga2V5IHNpZ25hdHVyZSAnICsga2V5U2lnbmF0dXJlKTtcclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKHNlbCkgPT4ge1xyXG4gICAgICBTbW9PcGVyYXRpb24uYWRkS2V5U2lnbmF0dXJlKHRoaXMuc2NvcmUsIHNlbCwga2V5U2lnbmF0dXJlKTtcclxuICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwpO1xyXG4gICAgICBTbW9PcGVyYXRpb24uYWRkS2V5U2lnbmF0dXJlKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsISwga2V5U2lnbmF0dXJlKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXRzIGEgcGl0Y2ggZnJvbSB0aGUgcGlhbm8gd2lkZ2V0LlxyXG4gICAqIEBwYXJhbSBwaXRjaCB7UGl0Y2h9XHJcbiAgICogQHBhcmFtIGNob3JkUGVkYWwge2Jvb2xlYW59IC0gaW5kaWNhdGVzIHdlIGFyZSBhZGRpbmcgdG8gYSBjaG9yZFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldFBpdGNoUGlhbm8ocGl0Y2g6IFBpdGNoLCBjaG9yZFBlZGFsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucyhcclxuICAgICAgJ3NldEFic29sdXRlUGl0Y2ggJyArIHBpdGNoLmxldHRlciArICcvJyArIHBpdGNoLmFjY2lkZW50YWwpO1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0ZWQpID0+IHtcclxuICAgICAgY29uc3QgbnBpdGNoOiBQaXRjaCA9IHtcclxuICAgICAgICBsZXR0ZXI6IHBpdGNoLmxldHRlcixcclxuICAgICAgICBhY2NpZGVudGFsOiBwaXRjaC5hY2NpZGVudGFsLCBvY3RhdmU6IHBpdGNoLm9jdGF2ZVxyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCBvY3RhdmUgPSBTbW9NZWFzdXJlLmRlZmF1bHRQaXRjaEZvckNsZWZbc2VsZWN0ZWQubWVhc3VyZS5jbGVmXS5vY3RhdmU7XHJcbiAgICAgIG5waXRjaC5vY3RhdmUgKz0gb2N0YXZlO1xyXG4gICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGVkKTtcclxuICAgICAgaWYgKGNob3JkUGVkYWwgJiYgc2VsZWN0ZWQubm90ZSkge1xyXG4gICAgICAgIHNlbGVjdGVkLm5vdGUudG9nZ2xlQWRkUGl0Y2gobnBpdGNoKTtcclxuICAgICAgICBhbHRTZWwhLm5vdGUhLnRvZ2dsZUFkZFBpdGNoKG5waXRjaCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnNldFBpdGNoKHNlbGVjdGVkLCBbbnBpdGNoXSk7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnNldFBpdGNoKGFsdFNlbCEsIFtucGl0Y2hdKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHNob3cgb3IgaGlkZSB0aGUgcGlhbm8gd2lkZ2V0XHJcbiAgICogQHBhcmFtIHZhbHVlIHRvIHNob3cgaXRcclxuICAgKi9cclxuICBhc3luYyBzaG93UGlhbm8odmFsdWU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuc2NvcmUucHJlZmVyZW5jZXMuc2hvd1BpYW5vID0gdmFsdWU7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUucHJlZmVyZW5jZXMuc2hvd1BpYW5vID0gdmFsdWU7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgU3VpUGlhbm8uc2hvd1BpYW5vKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBTdWlQaWFuby5oaWRlUGlhbm8oKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZW5kZXIgYSBwaXRjaCBmb3IgZWFjaCBsZXR0ZXIgbmFtZS1waXRjaCBpbiB0aGUgc3RyaW5nLFxyXG4gICAqIEBwYXJhbSBwaXRjaGVzIGxldHRlciBuYW1lcyBmb3IgcGl0Y2hlc1xyXG4gICAqIEByZXR1cm5zIHByb21pc2UsIHJlc29sdmVkIHdoZW4gYWxsIHBpdGNoZXMgcmVuZGVyZWRcclxuICAgKiBAc2VlIHNldFBpdGNoXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0UGl0Y2hlc1Byb21pc2UocGl0Y2hlczogUGl0Y2hMZXR0ZXJbXSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZjID0gYXN5bmMgKGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICBpZiAoaW5kZXggPj0gcGl0Y2hlcy5sZW5ndGgpIHtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYXdhaXQgc2VsZi5zZXRQaXRjaChwaXRjaGVzW2luZGV4XSk7XHJcbiAgICAgICAgICBmYyhpbmRleCArIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgZmMoMCk7XHJcbiAgICB9KTtcclxuICAgIGF3YWl0IHByb21pc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgYSBwaXRjaCB0byB0aGUgc2NvcmUgYXQgdGhlIGN1cnNvci4gIFRoaXMgdHJpZXMgdG8gZmluZCB0aGUgYmVzdCBwaXRjaFxyXG4gICAqIHRvIG1hdGNoIHRoZSBsZXR0ZXIga2V5IChGIHZzIEYjIGZvciBpbnN0YW5jZSkgYmFzZWQgb24ga2V5IGFuZCBzdXJyb3VuZGluZyBub3Rlc1xyXG4gICAqIEBwYXJhbSBsZXR0ZXIgc3RyaW5nXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0UGl0Y2gobGV0dGVyOiBQaXRjaExldHRlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3NldCBwaXRjaCAnICsgbGV0dGVyKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0ZWQpID0+IHtcclxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3RlZC5zZWxlY3RvcjtcclxuICAgICAgbGV0IGhpbnRTZWwgPSBTbW9TZWxlY3Rpb24ubGFzdE5vdGVTZWxlY3Rpb25Ob25SZXN0KHRoaXMuc2NvcmUsXHJcbiAgICAgICAgc2VsZWN0b3Iuc3RhZmYsIHNlbGVjdG9yLm1lYXN1cmUsIHNlbGVjdG9yLnZvaWNlLCBzZWxlY3Rvci50aWNrKTtcclxuICAgICAgaWYgKCFoaW50U2VsKSB7XHJcbiAgICAgICAgaGludFNlbCA9IFNtb1NlbGVjdGlvbi5uZXh0Tm90ZVNlbGVjdGlvbk5vblJlc3QodGhpcy5zY29yZSxcclxuICAgICAgICAgIHNlbGVjdG9yLnN0YWZmLCBzZWxlY3Rvci5tZWFzdXJlLCBzZWxlY3Rvci52b2ljZSwgc2VsZWN0b3IudGljayk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gVGhlIHNlbGVjdGlvbiBubyBsb25nZXIgZXhpc3RzLCBwb3NzaWJseSBkZWxldGVkXHJcbiAgICAgIGlmIChoaW50U2VsID09PSBudWxsIHx8IGhpbnRTZWwubm90ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlSGVscGVycy5lbXB0eVByb21pc2UoKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwaXRjaCA9IFNtb011c2ljLmdldExldHRlck5vdGVQaXRjaChoaW50U2VsLm5vdGUucGl0Y2hlc1swXSxcclxuICAgICAgICBsZXR0ZXIsIGhpbnRTZWwubWVhc3VyZS5rZXlTaWduYXR1cmUpO1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0UGl0Y2goc2VsZWN0ZWQsIFtwaXRjaF0pO1xyXG4gICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGVkKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnNldFBpdGNoKGFsdFNlbCEsIFtwaXRjaF0pO1xyXG4gICAgICBpZiAodGhpcy5zY29yZS5wcmVmZXJlbmNlcy5hdXRvQWR2YW5jZSkge1xyXG4gICAgICAgIC8vIERvbid0IHBsYXkgdGhlIG5leHQgbm90ZSBhbmQgdGhlIGFkZGVkIHBpdGNoIGF0IHRoZSBzYW1lIHRpbWUuXHJcbiAgICAgICAgdGhpcy50cmFja2VyLmRlZmVyTmV4dEF1dG9QbGF5KCk7XHJcbiAgICAgICAgdGhpcy50cmFja2VyLm1vdmVTZWxlY3Rpb25SaWdodCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChzZWxlY3Rpb25zLmxlbmd0aCA9PT0gMSAmJiB0aGlzLnNjb3JlLnByZWZlcmVuY2VzLmF1dG9QbGF5KSB7XHJcbiAgICAgIFN1aU9zY2lsbGF0b3IucGxheVNlbGVjdGlvbk5vdyhzZWxlY3Rpb25zWzBdLCB0aGlzLnNjb3JlLCAxKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2VuZXJpYyBjbGlwYm9hcmQgY29weSBhY3Rpb25cclxuICAgKi9cclxuICBhc3luYyBjb3B5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWx0QXI6IFNtb1NlbGVjdGlvbltdID0gW107XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgY29uc3Qgbm90ZVNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuICAgICAgaWYgKG5vdGVTZWxlY3Rpb24gIT09IG51bGwpIHtcclxuICAgICAgICBhbHRBci5wdXNoKG5vdGVTZWxlY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc3RvcmVQYXN0ZS5zZXRTZWxlY3Rpb25zKHRoaXMuc3RvcmVTY29yZSwgYWx0QXIpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGNsaXBib2FyZCBwYXN0ZSBhY3Rpb25cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBwYXN0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFdlIHVuZG8gdGhlIHdob2xlIHNjb3JlIG9uIGEgcGFzdGUsIHNpbmNlIHdlIGRvbid0IHlldCBrbm93IHRoZVxyXG4gICAgLy8gZXh0ZW50IG9mIHRoZSBvdmVybGFwXHJcbiAgICB0aGlzLnJlbmRlcmVyLnByZXNlcnZlU2Nyb2xsKCk7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSAgPSB0aGlzLmdldFBhc3RlTWVhc3VyZUxpc3QoKTtcclxuICAgIGNvbnN0IGZpcnN0U2VsZWN0aW9uID0gc2VsZWN0aW9uc1swXTtcclxuICAgIGNvbnN0IG1lYXN1cmVFbmQgPSBzZWxlY3Rpb25zW3NlbGVjdGlvbnMubGVuZ3RoIC0gMV0uc2VsZWN0b3IubWVhc3VyZTtcclxuICAgIGNvbnN0IG1lYXN1cmVSYW5nZSA9IFtmaXJzdFNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlLCBtZWFzdXJlRW5kXTtcclxuICAgIHRoaXMuc3RvcmVVbmRvLmdyb3VwaW5nID0gdHJ1ZTtcclxuICAgIC8vIFVuZG8gdGhlIHBhc3RlIGJ5IHNlbGVjdGluZyBhbGwgdGhlIGFmZmVjdGVkIG1lYXN1cmVzXHJcbiAgICBmb3IgKGxldCBpID0gbWVhc3VyZVJhbmdlWzBdOyBpIDw9IG1lYXN1cmVSYW5nZVsxXTsgKytpKSB7XHJcbiAgICAgIHRoaXMuX3VuZG9Db2x1bW4oJ3Bhc3RlJywgaSk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIudW5yZW5kZXJDb2x1bW4odGhpcy5zY29yZS5zdGF2ZXNbMF0ubWVhc3VyZXNbaV0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdG9yZVVuZG8uZ3JvdXBpbmcgPSBmYWxzZTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oZmlyc3RTZWxlY3Rpb24pO1xyXG4gICAgY29uc3QgYWx0VGFyZ2V0ID0gYWx0U2VsZWN0aW9uIS5zZWxlY3RvcjtcclxuICAgIGFsdFRhcmdldC50aWNrID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnNbMF0uc2VsZWN0b3IudGljaztcclxuICAgIC8vIHBhc3RlIHRoZSBjbGlwYm9hcmQgaW50byB0aGUgZGVzdGluYXRpb25cclxuICAgIHRoaXMuc3RvcmVQYXN0ZS5wYXN0ZVNlbGVjdGlvbnMoYWx0VGFyZ2V0KTtcclxuICAgIC8vIFJlZnJlc2ggdGhvc2UgbWVhc3VyZXMuXHJcbiAgICB0aGlzLnJlcGxhY2VNZWFzdXJlVmlldyhtZWFzdXJlUmFuZ2UpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFBhc3RlIG9ubHkgdGhlIGNob3Jkcy5cclxuICAgKi9cclxuICBhc3luYyBwYXN0ZUNob3JkcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICAvLyBXZSB1bmRvIHRoZSB3aG9sZSBzY29yZSBvbiBhIHBhc3RlLCBzaW5jZSB3ZSBkb24ndCB5ZXQga25vdyB0aGVcclxuICAgIC8vIGV4dGVudCBvZiB0aGUgb3ZlcmxhcFxyXG4gICAgdGhpcy5yZW5kZXJlci5wcmVzZXJ2ZVNjcm9sbCgpO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uczogU21vU2VsZWN0aW9uW10gID0gdGhpcy5nZXRQYXN0ZU1lYXN1cmVMaXN0KCk7XHJcbiAgICBjb25zdCBmaXJzdFNlbGVjdGlvbiA9IHNlbGVjdGlvbnNbMF07XHJcbiAgICBjb25zdCBtZWFzdXJlRW5kID0gc2VsZWN0aW9uc1tzZWxlY3Rpb25zLmxlbmd0aCAtIDFdLnNlbGVjdG9yLm1lYXN1cmU7XHJcbiAgICBjb25zdCBtZWFzdXJlUmFuZ2UgPSBbZmlyc3RTZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSwgbWVhc3VyZUVuZF07XHJcbiAgICB0aGlzLnN0b3JlVW5kby5ncm91cGluZyA9IHRydWU7XHJcbiAgICAvLyBVbmRvIHRoZSBwYXN0ZSBieSBzZWxlY3RpbmcgYWxsIHRoZSBhZmZlY3RlZCBtZWFzdXJlc1xyXG4gICAgZm9yIChsZXQgaSA9IG1lYXN1cmVSYW5nZVswXTsgaSA8PSBtZWFzdXJlUmFuZ2VbMV07ICsraSkge1xyXG4gICAgICB0aGlzLl91bmRvQ29sdW1uKCdwYXN0ZScsIGkpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnVucmVuZGVyQ29sdW1uKHRoaXMuc2NvcmUuc3RhdmVzWzBdLm1lYXN1cmVzW2ldKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmVVbmRvLmdyb3VwaW5nID0gZmFsc2U7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGZpcnN0U2VsZWN0aW9uKTtcclxuICAgIGNvbnN0IGFsdFRhcmdldCA9IGFsdFNlbGVjdGlvbiEuc2VsZWN0b3I7XHJcbiAgICBhbHRUYXJnZXQudGljayA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdLnNlbGVjdG9yLnRpY2s7XHJcbiAgICB0aGlzLnN0b3JlUGFzdGUucGFzdGVDaG9yZHMoYWx0VGFyZ2V0KTtcclxuICAgIC8vIFJlZnJlc2ggdGhvc2UgbWVhc3VyZXMuXHJcbiAgICB0aGlzLnJlcGxhY2VNZWFzdXJlVmlldyhtZWFzdXJlUmFuZ2UpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHNwZWNpZnkgYSBub3RlIGhlYWQgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBmb3IgdGhlIGR1cmF0aW9uXHJcbiAgICogQHBhcmFtIGhlYWQgXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0Tm90ZUhlYWQoaGVhZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLm1vZGlmeUN1cnJlbnRTZWxlY3Rpb25zKCdzZXQgbm90ZSBoZWFkJywgKHNjb3JlLCBzZWxlY3Rpb25zKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5zZXROb3RlSGVhZChzZWxlY3Rpb25zLCBoZWFkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIGEgdm9sdGEgZm9yIHNlbGVjdGVkIG1lYXN1cmVzXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkRW5kaW5nKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gVE9ETzogd2Ugc2hvdWxkIGhhdmUgdW5kbyBmb3IgY29sdW1uc1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdBZGQgVm9sdGEnKTtcclxuICAgIGNvbnN0IGZ0ID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpO1xyXG4gICAgY29uc3QgdHQgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IFNtb1ZvbHRhLmRlZmF1bHRzO1xyXG4gICAgcGFyYW1zLnN0YXJ0QmFyID0gZnQuc2VsZWN0b3IubWVhc3VyZTtcclxuICAgIHBhcmFtcy5lbmRCYXIgPSB0dC5zZWxlY3Rvci5tZWFzdXJlO1xyXG4gICAgcGFyYW1zLm51bWJlciA9IDE7XHJcbiAgICBjb25zdCB2b2x0YSA9IG5ldyBTbW9Wb2x0YShwYXJhbXMpO1xyXG4gICAgY29uc3QgYWx0Vm9sdGEgPSBuZXcgU21vVm9sdGEocGFyYW1zKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbZnQsIHR0XSk7XHJcbiAgICBTbW9PcGVyYXRpb24uYWRkRW5kaW5nKHRoaXMuc3RvcmVTY29yZSwgYWx0Vm9sdGEpO1xyXG4gICAgU21vT3BlcmF0aW9uLmFkZEVuZGluZyh0aGlzLnNjb3JlLCB2b2x0YSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIGVuZGluZyB2b2x0YSBzZXR0aW5nc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZUVuZGluZyhlbmRpbmc6IFNtb1ZvbHRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ0NoYW5nZSBWb2x0YScpO1xyXG4gICAgZW5kaW5nLmVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICQoZWwpLmZpbmQoJ2cuJyArIGVuZGluZy5hdHRycy5pZCkucmVtb3ZlKCk7XHJcbiAgICB9KTtcclxuICAgIGVuZGluZy5lbGVtZW50cyA9IFtdO1xyXG4gICAgU21vT3BlcmF0aW9uLnJlbW92ZUVuZGluZyh0aGlzLnN0b3JlU2NvcmUsIGVuZGluZyk7XHJcbiAgICBTbW9PcGVyYXRpb24ucmVtb3ZlRW5kaW5nKHRoaXMuc2NvcmUsIGVuZGluZyk7XHJcbiAgICBjb25zdCBhbHRWb2x0YSA9IG5ldyBTbW9Wb2x0YShlbmRpbmcpO1xyXG4gICAgU21vT3BlcmF0aW9uLmFkZEVuZGluZyh0aGlzLnN0b3JlU2NvcmUsIGFsdFZvbHRhKTtcclxuICAgIFNtb09wZXJhdGlvbi5hZGRFbmRpbmcodGhpcy5zY29yZSwgZW5kaW5nKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVmcmVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gZW5kaW5nIHZvbHRhIHRvIHJlbW92ZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZUVuZGluZyhlbmRpbmc6IFNtb1ZvbHRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ1JlbW92ZSBWb2x0YScpO1xyXG4gICAgZW5kaW5nLmVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICQoZWwpLmZpbmQoJ2cuJyArIGVuZGluZy5hdHRycy5pZCkucmVtb3ZlKCk7XHJcbiAgICB9KTtcclxuICAgIGVuZGluZy5lbGVtZW50cyA9IFtdO1xyXG4gICAgU21vT3BlcmF0aW9uLnJlbW92ZUVuZGluZyh0aGlzLnN0b3JlU2NvcmUsIGVuZGluZyk7XHJcbiAgICBTbW9PcGVyYXRpb24ucmVtb3ZlRW5kaW5nKHRoaXMuc2NvcmUsIGVuZGluZyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHBvc2l0aW9uIGJlZ2luIG9yIGVuZFxyXG4gICAqIEBwYXJhbSBiYXJsaW5lIGJhcmxpbmUgdHlwZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldEJhcmxpbmUocG9zaXRpb246IG51bWJlciwgYmFybGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBvYmogPSBuZXcgU21vQmFybGluZSh7IHBvc2l0aW9uLCBiYXJsaW5lIH0pO1xyXG4gICAgY29uc3QgYWx0T2JqID0gbmV3IFNtb0JhcmxpbmUoeyBwb3NpdGlvbiwgYmFybGluZSB9KTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdO1xyXG4gICAgdGhpcy5fdW5kb0NvbHVtbignc2V0IGJhcmxpbmUnLCBzZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSk7XHJcbiAgICBTbW9PcGVyYXRpb24uc2V0TWVhc3VyZUJhcmxpbmUodGhpcy5zY29yZSwgc2VsZWN0aW9uLCBvYmopO1xyXG4gICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVCYXJsaW5lKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsISwgYWx0T2JqKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbc2VsZWN0aW9uXSk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBzdGFydCBvciBlbmRcclxuICAgKiBAcGFyYW0gc3ltYm9sIGNvZGEsIGV0Yy5cclxuICAgKi9cclxuICBhc3luYyBzZXRSZXBlYXRTeW1ib2wocG9zaXRpb246IG51bWJlciwgc3ltYm9sOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IFNtb1JlcGVhdFN5bWJvbC5kZWZhdWx0cztcclxuICAgIHBhcmFtcy5wb3NpdGlvbiA9IHBvc2l0aW9uO1xyXG4gICAgcGFyYW1zLnN5bWJvbCA9IHN5bWJvbDtcclxuICAgIGNvbnN0IG9iaiA9IG5ldyBTbW9SZXBlYXRTeW1ib2wocGFyYW1zKTtcclxuICAgIGNvbnN0IGFsdE9iaiA9IG5ldyBTbW9SZXBlYXRTeW1ib2wocGFyYW1zKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdO1xyXG4gICAgdGhpcy5fdW5kb0NvbHVtbignc2V0IHJlcGVhdCBzeW1ib2wnLCBzZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSk7XHJcbiAgICBTbW9PcGVyYXRpb24uc2V0UmVwZWF0U3ltYm9sKHRoaXMuc2NvcmUsIHNlbGVjdGlvbiwgb2JqKTtcclxuICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIFNtb09wZXJhdGlvbi5zZXRSZXBlYXRTeW1ib2wodGhpcy5zdG9yZVNjb3JlLCBhbHRTZWwhLCBhbHRPYmopO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKFtzZWxlY3Rpb25dKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogIHRvZ2dsZSByZWhlYXJzYWwgbWFyayBvbiBmaXJzdCBzZWxlY3RlZCBtZWFzdXJlXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyB0b2dnbGVSZWhlYXJzYWxNYXJrKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgY29uc3QgY21kID0gc2VsZWN0aW9uLm1lYXN1cmUuZ2V0UmVoZWFyc2FsTWFyaygpID8gJ3JlbW92ZVJlaGVhcnNhbE1hcmsnIDogJ2FkZFJlaGVhcnNhbE1hcmsnO1xyXG4gICAgU21vT3BlcmF0aW9uW2NtZF0odGhpcy5zY29yZSwgc2VsZWN0aW9uLCBuZXcgU21vUmVoZWFyc2FsTWFyayhTbW9SZWhlYXJzYWxNYXJrLmRlZmF1bHRzKSk7XHJcbiAgICBTbW9PcGVyYXRpb25bY21kXSh0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbGVjdGlvbiEsIG5ldyBTbW9SZWhlYXJzYWxNYXJrKFNtb1JlaGVhcnNhbE1hcmsuZGVmYXVsdHMpKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbc2VsZWN0aW9uXSk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIF9yZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyOiBTdGFmZk1vZGlmaWVyQmFzZSkge1xyXG4gICAgdGhpcy5zY29yZS5zdGF2ZXNbbW9kaWZpZXIuYXNzb2NpYXRlZFN0YWZmXS5yZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyKTtcclxuICAgIGNvbnN0IGFsdE1vZGlmaWVyID0gU3RhZmZNb2RpZmllckJhc2UuZGVzZXJpYWxpemUobW9kaWZpZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgYWx0TW9kaWZpZXIuYXR0cnMuaWQgPSBtb2RpZmllci5hdHRycy5pZDtcclxuICAgIGFsdE1vZGlmaWVyLnN0YXJ0U2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoYWx0TW9kaWZpZXIuc3RhcnRTZWxlY3Rvcik7XHJcbiAgICBhbHRNb2RpZmllci5lbmRTZWxlY3RvciA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3RvcihhbHRNb2RpZmllci5lbmRTZWxlY3Rvcik7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuX2dldEVxdWl2YWxlbnRTdGFmZihtb2RpZmllci5hc3NvY2lhdGVkU3RhZmYpXS5yZW1vdmVTdGFmZk1vZGlmaWVyKGFsdE1vZGlmaWVyKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHNlbGVjdGVkIG1vZGlmaWVyXHJcbiAgICogQHBhcmFtIG1vZGlmaWVyIHNsdXIsIGhhaXJwaW4sIGV0Yy5cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyOiBTdGFmZk1vZGlmaWVyQmFzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy51bmRvU3RhZmZNb2RpZmllcignU2V0IG1lYXN1cmUgcHJvcG9ydGlvbicsIG1vZGlmaWVyLFxyXG4gICAgICBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLlJFTU9WRSk7XHJcbiAgICB0aGlzLl9yZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyKTtcclxuICAgIHRoaXMuX3JlbmRlclJlY3RhbmdsZShtb2RpZmllci5zdGFydFNlbGVjdG9yLCBtb2RpZmllci5lbmRTZWxlY3Rvcik7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSBhIHN0YWZmIG1vZGlmaWVyXHJcbiAgICogQHBhcmFtIG9yaWdpbmFsIG9yaWdpbmFsIHZlcnNpb25cclxuICAgKiBAcGFyYW0gbW9kaWZpZXIgbW9kaWZpZWQgdmVyc2lvblxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZE9yVXBkYXRlU3RhZmZNb2RpZmllcihvcmlnaW5hbDogU3RhZmZNb2RpZmllckJhc2UsIG1vZGlmaWVyOiBTdGFmZk1vZGlmaWVyQmFzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFtb2RpZmllcikge1xyXG4gICAgICBpZiAob3JpZ2luYWwpIHtcclxuICAgICAgICAvLyBIYW5kbGUgbGVnYWN5IEFQSSBjaGFuZ2VkXHJcbiAgICAgICAgbW9kaWZpZXIgPSBTdGFmZk1vZGlmaWVyQmFzZS5kZXNlcmlhbGl6ZShvcmlnaW5hbCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCd1cGRhdGUgbW9kaWZpZXI6IGJhZCBtb2RpZmllcicpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlSGVscGVycy5lbXB0eVByb21pc2UoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnNjb3JlLnN0YXZlc1ttb2RpZmllci5zdGFydFNlbGVjdG9yLnN0YWZmXVxyXG4gICAgICAuZ2V0TW9kaWZpZXIobW9kaWZpZXIpO1xyXG4gICAgY29uc3Qgc3VidHlwZSA9IGV4aXN0aW5nID09PSBudWxsID8gVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQgOlxyXG4gICAgICBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLlVQREFURTtcclxuICAgIHRoaXMudW5kb1N0YWZmTW9kaWZpZXIoJ1NldCBtZWFzdXJlIHByb3BvcnRpb24nLCBvcmlnaW5hbCxcclxuICAgICAgc3VidHlwZSk7XHJcbiAgICB0aGlzLl9yZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyKTtcclxuICAgIGNvbnN0IGNvcHkgPSBTdGFmZk1vZGlmaWVyQmFzZS5kZXNlcmlhbGl6ZShtb2RpZmllci5zZXJpYWxpemUoKSk7XHJcbiAgICBjb3B5LnN0YXJ0U2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoY29weS5zdGFydFNlbGVjdG9yKTtcclxuICAgIGNvcHkuZW5kU2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoY29weS5lbmRTZWxlY3Rvcik7XHJcbiAgICBjb25zdCBzZWwgPSBTbW9TZWxlY3Rpb24ubm90ZUZyb21TZWxlY3Rvcih0aGlzLnNjb3JlLCBtb2RpZmllci5zdGFydFNlbGVjdG9yKTtcclxuICAgIGlmIChzZWwgIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwpO1xyXG4gICAgICBTbW9PcGVyYXRpb24uYWRkU3RhZmZNb2RpZmllcihzZWwsIG1vZGlmaWVyKTtcclxuICAgICAgU21vT3BlcmF0aW9uLmFkZFN0YWZmTW9kaWZpZXIoYWx0U2VsISwgY29weSk7XHJcbiAgICAgIGNvbnN0IG1vZElkID0gJ21vZC0nICsgc2VsLnNlbGVjdG9yLnN0YWZmICsgJy0nICsgc2VsLnNlbGVjdG9yLm1lYXN1cmU7XHJcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnJlbmRlcmVyLnJlbmRlcmVyLmdldFJlbmRlcmVyKHNlbC5tZWFzdXJlLnN2Zy5sb2dpY2FsQm94KTtcclxuICAgICAgaWYgKGNvbnRleHQpIHtcclxuICAgICAgICBTdmdIZWxwZXJzLnJlbW92ZUVsZW1lbnRzQnlDbGFzcyhjb250ZXh0LnN2ZywgbW9kSWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZW5kZXJSZWN0YW5nbGUobW9kaWZpZXIuc3RhcnRTZWxlY3RvciwgbW9kaWZpZXIuZW5kU2VsZWN0b3IpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBsaW5lT3BlcmF0aW9uKG9wOiBjcmVhdGVTdGFmZk1vZGlmaWVyVHlwZTxTdGFmZk1vZGlmaWVyQmFzZT4pIHtcclxuICAgIC8vIGlmICh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5sZW5ndGggPCAyKSB7XHJcbiAgICAvLyAgIHJldHVybjtcclxuICAgIC8vIH1cclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdjcmVhdGUgc3RhZmYgbW9kaWZpZXInKTtcclxuICAgIGNvbnN0IGZ0ID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpO1xyXG4gICAgY29uc3QgdHQgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKTtcclxuICAgIGNvbnN0IGZ0QWx0ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihmdCk7XHJcbiAgICBjb25zdCB0dEFsdCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24odHQpO1xyXG4gICAgY29uc3QgbW9kaWZpZXIgPSBvcChmdCwgdHQpO1xyXG4gICAgY29uc3QgYWx0TW9kaWZpZXIgPSBvcChmdEFsdCEsIHR0QWx0ISk7XHJcbiAgICBhbHRNb2RpZmllci5hdHRycy5pZCA9IG1vZGlmaWVyLmF0dHJzLmlkO1xyXG4gICAgZnQuc3RhZmYuYWRkU3RhZmZNb2RpZmllcihtb2RpZmllcik7XHJcbiAgICBmdEFsdD8uc3RhZmYuYWRkU3RhZmZNb2RpZmllcihhbHRNb2RpZmllcik7XHJcbiAgICB0aGlzLnVuZG9TdGFmZk1vZGlmaWVyKCdhZGQgJyArIG9wLCBtb2RpZmllciwgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWRkIGNyZXNjZW5kbyB0byBzZWxlY3Rpb25cclxuICAgKi9cclxuICBhc3luYyBjcmVzY2VuZG8oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmxpbmVPcGVyYXRpb24oU21vT3BlcmF0aW9uLmNyZWF0ZUNyZXNjZW5kbyk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCBjcmVzY2VuZG8gdG8gc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgY3Jlc2NlbmRvQnJhY2tldCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubGluZU9wZXJhdGlvbihTbW9PcGVyYXRpb24uY3JlYXRlQ3Jlc2NlbmRvQnJhY2tldCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCBjcmVzY2VuZG8gdG8gc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgZGltZW51ZW5kbygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubGluZU9wZXJhdGlvbihTbW9PcGVyYXRpb24uY3JlYXRlRGltZW51ZW5kb0JyYWNrZXQpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgY3Jlc2NlbmRvIHRvIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGFzeW5jIGFjY2VsZXJhbmRvKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5saW5lT3BlcmF0aW9uKFNtb09wZXJhdGlvbi5jcmVhdGVBY2NlbGVyYW5kb0JyYWNrZXQpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgY3Jlc2NlbmRvIHRvIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGFzeW5jIHJpdGFyZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubGluZU9wZXJhdGlvbihTbW9PcGVyYXRpb24uY3JlYXRlUml0YXJkQnJhY2tldCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGRpbWludWVuZG8gaGFpcnBpblxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGRlY3Jlc2NlbmRvKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5saW5lT3BlcmF0aW9uKFNtb09wZXJhdGlvbi5jcmVhdGVEZWNyZXNjZW5kbyk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHJlbW92ZVRleHRCcmFja2V0KGJyYWNrZXQ6IFNtb1N0YWZmVGV4dEJyYWNrZXQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnJlbW92ZVN0YWZmTW9kaWZpZXIoYnJhY2tldCk7XHJcbiAgfVxyXG4gIGFzeW5jIGFkZE9yUmVwbGFjZVN0YWZmTW9kaWZpZXIoY2FsbGJhY2s6IHVwZGF0ZVN0YWZmTW9kaWZpZXJGdW5jLCBtb2RpZmllcjogU3RhZmZNb2RpZmllckJhc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGZyb20xID0gU21vU2VsZWN0aW9uLm5vdGVGcm9tU2VsZWN0b3IodGhpcy5zY29yZSwgbW9kaWZpZXIuc3RhcnRTZWxlY3Rvcik7XHJcbiAgICBjb25zdCB0bzEgPSBTbW9TZWxlY3Rpb24ubm90ZUZyb21TZWxlY3Rvcih0aGlzLnNjb3JlLCBtb2RpZmllci5lbmRTZWxlY3Rvcik7XHJcbiAgICBpZiAoZnJvbTEgPT09IG51bGwgfHwgdG8xID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGFsdEZyb20gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGZyb20xKTtcclxuICAgIGNvbnN0IGFsdFRvID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbih0bzEpO1xyXG4gICAgaWYgKGFsdEZyb20gPT09IG51bGwgfHwgYWx0VG8gPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY2FsbGJhY2sodGhpcy5zY29yZSwgZnJvbTEsIHRvMSk7XHJcbiAgICBjYWxsYmFjayh0aGlzLnN0b3JlU2NvcmUsIGFsdEZyb20sIGFsdFRvKTtcclxuICAgIGNvbnN0IHJlZHJhdyA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlc0JldHdlZW4odGhpcy5zY29yZSwgZnJvbTEuc2VsZWN0b3IsIHRvMS5zZWxlY3Rvcik7XHJcbiAgICB0aGlzLnVuZG9TdGFmZk1vZGlmaWVyKCdhZGQgcmVwbCB0ZXh0IGJyYWNrZXQnLCBtb2RpZmllciwgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKHJlZHJhdyk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIGFkZE9yUmVwbGFjZVRleHRCcmFja2V0KG1vZGlmaWVyOiBTbW9TdGFmZlRleHRCcmFja2V0KSB7XHJcbiAgICBjb25zdCBmcm9tMSA9IFNtb1NlbGVjdGlvbi5ub3RlRnJvbVNlbGVjdG9yKHRoaXMuc2NvcmUsIG1vZGlmaWVyLnN0YXJ0U2VsZWN0b3IpO1xyXG4gICAgY29uc3QgdG8xID0gU21vU2VsZWN0aW9uLm5vdGVGcm9tU2VsZWN0b3IodGhpcy5zY29yZSwgbW9kaWZpZXIuZW5kU2VsZWN0b3IpO1xyXG4gICAgaWYgKGZyb20xID09PSBudWxsIHx8IHRvMSA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBhbHRGcm9tID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihmcm9tMSk7XHJcbiAgICBjb25zdCBhbHRUbyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24odG8xKTtcclxuICAgIGlmIChhbHRGcm9tID09PSBudWxsIHx8IGFsdFRvID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFNtb09wZXJhdGlvbi5hZGRPclJlcGxhY2VCcmFja2V0KG1vZGlmaWVyLCBmcm9tMSwgdG8xKTtcclxuICAgIFNtb09wZXJhdGlvbi5hZGRPclJlcGxhY2VCcmFja2V0KG1vZGlmaWVyLCBhbHRGcm9tLCBhbHRUbyk7XHJcbiAgICBjb25zdCByZWRyYXcgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZXNCZXR3ZWVuKHRoaXMuc2NvcmUsIGZyb20xLnNlbGVjdG9yLCB0bzEuc2VsZWN0b3IpO1xyXG4gICAgdGhpcy51bmRvU3RhZmZNb2RpZmllcignYWRkIHJlcGwgdGV4dCBicmFja2V0JywgbW9kaWZpZXIsIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuQUREKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhyZWRyYXcpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTbHVyIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyBhZGRTbHVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpO1xyXG4gICAgY29uc3QgZnQgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigtMSk7XHJcbiAgICBjb25zdCB0dCA9IHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKDEpO1xyXG4gICAgY29uc3QgZnRBbHQgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGZ0KTtcclxuICAgIGNvbnN0IHR0QWx0ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbih0dCk7XHJcbiAgICBjb25zdCBtb2RpZmllciA9IFNtb09wZXJhdGlvbi5jcmVhdGVTbHVyKHRoaXMuc2NvcmUsIGZ0LCB0dCk7XHJcbiAgICBmdC5zdGFmZi5hZGRTdGFmZk1vZGlmaWVyKG1vZGlmaWVyKTtcclxuICAgIC8vIG1ha2Ugc3VyZSBzY29yZSBhbmQgYmFja3VwIGhhdmUgc2FtZSBJRCBmb3IgdW5kby5cclxuICAgIGNvbnN0IGFsdE1vZGlmaWVyID0gU21vT3BlcmF0aW9uLmNyZWF0ZVNsdXIodGhpcy5zdG9yZVNjb3JlLCBmdEFsdCEsIHR0QWx0ISk7XHJcbiAgICBhbHRNb2RpZmllci5hdHRycy5pZCA9IG1vZGlmaWVyLmF0dHJzLmlkO1xyXG4gICAgZnRBbHQ/LnN0YWZmLmFkZFN0YWZmTW9kaWZpZXIoYWx0TW9kaWZpZXIpO1xyXG4gICAgdGhpcy51bmRvU3RhZmZNb2RpZmllcignYWRkIHNsdXInLCBtb2RpZmllciwgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdGllIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdGllKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5saW5lT3BlcmF0aW9uKFNtb09wZXJhdGlvbi5jcmVhdGVUaWUpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyB1cGRhdGVab29tKHpvb21GYWN0b3I6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgb3JpZ2luYWwgPSB0aGlzLnNjb3JlLmxheW91dE1hbmFnZXIhLmdldEdsb2JhbExheW91dCgpO1xyXG4gICAgb3JpZ2luYWwuem9vbVNjYWxlID0gem9vbUZhY3RvcjtcclxuICAgIHRoaXMuc2NvcmUubGF5b3V0TWFuYWdlciEuZ2xvYmFsTGF5b3V0Lnpvb21TY2FsZSA9IHpvb21GYWN0b3I7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnBhZ2VNYXAudXBkYXRlWm9vbSh6b29tRmFjdG9yKTtcclxuICAgIHRoaXMucmVuZGVyZXIucGFnZU1hcC51cGRhdGVDb250YWluZXJPZmZzZXQodGhpcy5zY3JvbGxlci5zY3JvbGxTdGF0ZSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHNldCBnbG9iYWwgcGFnZSBmb3Igc2NvcmUsIHpvb20gZXRjLlxyXG4gICAqIEBwYXJhbSBsYXlvdXQgZ2xvYmFsIFNWRyBzZXR0aW5nc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldEdsb2JhbExheW91dChsYXlvdXQ6IFNtb0dsb2JhbExheW91dCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdTZXQgR2xvYmFsIExheW91dCcpO1xyXG4gICAgY29uc3Qgb3JpZ2luYWwgPSB0aGlzLnNjb3JlLmxheW91dE1hbmFnZXIhLmdldEdsb2JhbExheW91dCgpLnN2Z1NjYWxlO1xyXG4gICAgdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyIS51cGRhdGVHbG9iYWxMYXlvdXQobGF5b3V0KTtcclxuICAgIHRoaXMuc2NvcmUuc2NhbGVUZXh0R3JvdXBzKG9yaWdpbmFsIC8gbGF5b3V0LnN2Z1NjYWxlKTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5sYXlvdXRNYW5hZ2VyIS51cGRhdGVHbG9iYWxMYXlvdXQobGF5b3V0KTtcclxuICAgIHRoaXMucmVuZGVyZXIucmVyZW5kZXJBbGwoKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnByZXNlcnZlU2Nyb2xsKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgbGF5b3V0IG9mIGEgc2luZ2xlIHBhZ2VcclxuICAgKiBAcGFyYW0gbGF5b3V0IHBhZ2UgbGF5b3V0XHJcbiAgICogQHBhcmFtIHBhZ2VJbmRleCB3aGljaCBwYWdlIHRvIGNoYW5nZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldFBhZ2VMYXlvdXQobGF5b3V0OiBTbW9QYWdlTGF5b3V0LCBwYWdlSW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyIS51cGRhdGVQYWdlKGxheW91dCwgcGFnZUluZGV4KTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5sYXlvdXRNYW5hZ2VyIS51cGRhdGVQYWdlKGxheW91dCwgcGFnZUluZGV4KTtcclxuICAgIC8vIElmIHdlIGFyZSBpbiBwYXJ0IG1vZGUsIHNhdmUgdGhlIHBhZ2UgbGF5b3V0IGluIHRoZSBwYXJ0IHNvIGl0IGlzIHRoZXJlIG5leHQgdGltZVxyXG4gICAgLy8gdGhlIHBhcnQgaXMgZXhwb3NlZC5cclxuICAgIGlmICh0aGlzLmlzUGFydEV4cG9zZWQoKSkge1xyXG4gICAgICB0aGlzLnNjb3JlLnN0YXZlcy5mb3JFYWNoKChzdGFmZiwgc3RhZmZJeCkgPT4ge1xyXG4gICAgICAgIHN0YWZmLnBhcnRJbmZvLmxheW91dE1hbmFnZXIudXBkYXRlUGFnZShsYXlvdXQsIHBhZ2VJbmRleCk7XHJcbiAgICAgICAgY29uc3QgYWx0U3RhZmYgPSB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuc3RhZmZNYXBbc3RhZmZJeF1dO1xyXG4gICAgICAgIGFsdFN0YWZmLnBhcnRJbmZvLmxheW91dE1hbmFnZXIudXBkYXRlUGFnZShsYXlvdXQsIHBhZ2VJbmRleCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoVmlld3BvcnQoKTtcclxuICB9XHJcbiAgYXN5bmMgc2V0UGFnZUxheW91dHMobGF5b3V0OiBTbW9QYWdlTGF5b3V0LCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnU2V0IFBhZ2UgTGF5b3V0Jyk7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBmb3IgKGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyArK2kpIHtcclxuICAgICAgdGhpcy5zZXRQYWdlTGF5b3V0KGxheW91dCwgaSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyQWxsKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgbXVzaWMgZm9udFxyXG4gICAqIEBwYXJhbSBmYW1pbHkgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0RW5ncmF2aW5nRm9udEZhbWlseShmYW1pbHk6IGVuZ3JhdmluZ0ZvbnRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnNjb3JlLmVuZ3JhdmluZ0ZvbnQgPSBmYW1pbHk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuZW5ncmF2aW5nRm9udCA9IGZhbWlseTtcclxuICAgIHRoaXMucmVuZGVyZXIubm90aWZ5Rm9udENoYW5nZSgpOyAgIFxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwYXRlIGdsb2JhbCBmb250IHVzZWQgZm9yIGNob3JkIGNoYW5nZXNcclxuICAgKiBAcGFyYW0gZm9udEluZm9cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBzZXRDaG9yZEZvbnQoZm9udEluZm86IEZvbnRJbmZvKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ1NldCBDaG9yZCBGb250Jyk7XHJcbiAgICB0aGlzLnNjb3JlLnNldENob3JkRm9udChmb250SW5mbyk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuc2V0Q2hvcmRGb250KGZvbnRJbmZvKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVmcmVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgZm9udCB1c2VkIGZvciBseXJpY3NcclxuICAgKiBAcGFyYW0gZm9udEluZm8gXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0THlyaWNGb250KGZvbnRJbmZvOiBGb250SW5mbyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdTZXQgTHlyaWMgRm9udCcpO1xyXG4gICAgdGhpcy5zY29yZS5zZXRMeXJpY0ZvbnQoZm9udEluZm8pO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnNldEx5cmljRm9udChmb250SW5mbyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIHZhbHVlIGlmIGZhbHNlLCBseXJpYyB3aWR0aHMgZG9uJ3QgYWZmZWN0IG1lYXN1cmUgd2lkdGhcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBzZXRMeXJpY0FkanVzdFdpZHRoKHZhbHVlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ1NldCBMeXJpYyBBZGogV2lkdGgnKTtcclxuICAgIHRoaXMuc2NvcmUuc2V0THlyaWNBZGp1c3RXaWR0aCh2YWx1ZSk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuc2V0THlyaWNBZGp1c3RXaWR0aCh2YWx1ZSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogZGVsZXRlIHNlbGVjdGVkIG1lYXN1cmVzXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlTWVhc3VyZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnRGVsZXRlIE1lYXN1cmUnKTtcclxuICAgIGlmICh0aGlzLnN0b3JlU2NvcmUuc3RhdmVzWzBdLm1lYXN1cmVzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2VIZWxwZXJzLmVtcHR5UHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdCh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucyk7XHJcbiAgICAvLyBUSGUgbWVhc3VyZXMgZ2V0IHJlbnVtYmVyZWQsIHNvIGtlZXAgdGhlIGluZGV4IGF0IDBcclxuICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0aW9uc1swXS5zZWxlY3Rvci5tZWFzdXJlO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIC8vIFVucmVuZGVyIHRoZSBkZWxldGVkIG1lYXN1cmVcclxuICAgICAgdGhpcy5zY29yZS5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgICB0aGlzLnRyYWNrZXIuY2xlYXJNZWFzdXJlTWFwKHN0YWZmLm1lYXN1cmVzW2luZGV4XSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci51bnJlbmRlck1lYXN1cmUoc3RhZmYubWVhc3VyZXNbaW5kZXhdKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnVucmVuZGVyTWVhc3VyZShzdGFmZi5tZWFzdXJlc1tzdGFmZi5tZWFzdXJlcy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgLy8gQSBsaXR0bGUgaGFja3kgLSBkZWxldGUgdGhlIG1vZGlmaWVycyBpZiB0aGV5IHN0YXJ0IG9yIGVuZCBvblxyXG4gICAgICAgIC8vIHRoZSBtZWFzdXJlXHJcbiAgICAgICAgc3RhZmYucmVuZGVyYWJsZU1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xyXG4gICAgICAgICAgaWYgKG1vZGlmaWVyLnN0YXJ0U2VsZWN0b3IubWVhc3VyZSA9PT0gaW5kZXggfHwgbW9kaWZpZXIuZW5kU2VsZWN0b3IubWVhc3VyZSA9PT0gaW5kZXgpIHtcclxuICAgICAgICAgICAgaWYgKG1vZGlmaWVyLmxvZ2ljYWxCb3gpIHtcclxuICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5yZW5kZXJlci5yZW5kZXJlci5nZXRSZW5kZXJlcihtb2RpZmllci5sb2dpY2FsQm94KTtcclxuICAgICAgICAgICAgICBpZiAoY29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgJChjb250ZXh0LnN2ZykuZmluZCgnZy4nICsgbW9kaWZpZXIuYXR0cnMuaWQpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgLy8gUmVtb3ZlIHRoZSBTVkcgYXJ0aWZhY3RzIG1hcHBlZCB0byB0aGlzIG1lYXN1cmUuXHJcbiAgICAgIHRoaXMuc2NvcmUuZGVsZXRlTWVhc3VyZShpbmRleCk7XHJcbiAgICAgIHRoaXMuc3RvcmVTY29yZS5kZWxldGVNZWFzdXJlKGluZGV4KTtcclxuICAgICAgLy8gTm90ZTogaW5kZXggZG9lc24ndCBpbmNyZW1lbnQgc2luY2UgdGhlcmUgYXJlIG5vdyAxIGZld2VyIG1lYXN1cmVzXHJcbiAgICB9O1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGFkZCBudW1iZXIgb2YgbWVhc3VyZXMsIHdpdGggZGVmYXVsdCBub3RlcyBzZWxlY3Rpb25zXHJcbiAgICogQHBhcmFtIGFwcGVuZCBcclxuICAgKiBAcGFyYW0gbnVtYmVyVG9BZGQgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkTWVhc3VyZXMoYXBwZW5kOiBib29sZWFuLCBudW1iZXJUb0FkZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcG9zID0gMDtcclxuICAgIGxldCBpeCA9IDA7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ0FkZCBNZWFzdXJlJyk7XHJcbiAgICBmb3IgKGl4ID0gMDsgaXggPCBudW1iZXJUb0FkZDsgKytpeCkge1xyXG4gICAgICBjb25zdCBtZWFzdXJlID0gdGhpcy50cmFja2VyLmdldEZpcnN0TWVhc3VyZU9mU2VsZWN0aW9uKCk7XHJcbiAgICAgIGlmIChtZWFzdXJlKSB7XHJcbiAgICAgICAgY29uc3Qgbm1lYXN1cmUgPSBTbW9NZWFzdXJlLmdldERlZmF1bHRNZWFzdXJlV2l0aE5vdGVzKG1lYXN1cmUpO1xyXG4gICAgICAgIHBvcyA9IG1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXg7XHJcbiAgICAgICAgaWYgKGFwcGVuZCkge1xyXG4gICAgICAgICAgcG9zICs9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5tZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4ID0gcG9zO1xyXG4gICAgICAgIG5tZWFzdXJlLnNldEFjdGl2ZVZvaWNlKDApO1xyXG4gICAgICAgIHRoaXMuc2NvcmUuYWRkTWVhc3VyZShwb3MpO1xyXG4gICAgICAgIHRoaXMuc3RvcmVTY29yZS5hZGRNZWFzdXJlKHBvcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVmcmVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBhZGQgYSBzaW5nbGUgbWVhc3VyZSBiZWZvcmUgb3IgYWZ0ZXIgc2VsZWN0aW9uXHJcbiAgICogQHBhcmFtIGFwcGVuZCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBhZGRNZWFzdXJlKGFwcGVuZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdBZGQgTWVhc3VyZScpO1xyXG4gICAgbGV0IHBvcyA9IDA7XHJcbiAgICBjb25zdCBtZWFzdXJlID0gdGhpcy50cmFja2VyLmdldEZpcnN0TWVhc3VyZU9mU2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoIW1lYXN1cmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm1lYXN1cmUgPSBTbW9NZWFzdXJlLmdldERlZmF1bHRNZWFzdXJlV2l0aE5vdGVzKG1lYXN1cmUpO1xyXG4gICAgcG9zID0gbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleDtcclxuICAgIGlmIChhcHBlbmQpIHtcclxuICAgICAgcG9zICs9IDE7XHJcbiAgICB9XHJcbiAgICBubWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCA9IHBvcztcclxuICAgIG5tZWFzdXJlLnNldEFjdGl2ZVZvaWNlKDApO1xyXG4gICAgdGhpcy5zY29yZS5hZGRNZWFzdXJlKHBvcyk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuYWRkTWVhc3VyZShwb3MpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5jbGVhckxpbmUobWVhc3VyZSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogcmVtb3ZlIGFuIGVudGlyZSBsaW5lIG9mIG11c2ljXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVTdGFmZigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnUmVtb3ZlIEluc3RydW1lbnQnKTtcclxuICAgIGlmICh0aGlzLnN0b3JlU2NvcmUuc3RhdmVzLmxlbmd0aCA8IDIgfHwgdGhpcy5zY29yZS5zdGF2ZXMubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZUhlbHBlcnMuZW1wdHlQcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICAvLyBpZiB3ZSBhcmUgbG9va2luZyBhdCBhIHN1YnNldCBvZiB0aGUgc2NvcmUsXHJcbiAgICAvLyByZXZlcnQgdG8gdGhlIGZ1bGwgc2NvcmUgdmlldyBiZWZvcmUgcmVtb3ZpbmcgdGhlIHN0YWZmLlxyXG4gICAgY29uc3Qgc2VsID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnNbMF07XHJcbiAgICBjb25zdCBzY29yZVNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuICAgIGNvbnN0IHN0YWZmSW5kZXggPSBzY29yZVNlbCEuc2VsZWN0b3Iuc3RhZmY7XHJcbiAgICBTbW9PcGVyYXRpb24ucmVtb3ZlU3RhZmYodGhpcy5zdG9yZVNjb3JlLCBzdGFmZkluZGV4KTtcclxuICAgIHRoaXMudmlld0FsbCgpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIGFkZFN0YWZmKGluc3RydW1lbnQ6IFNtb1N5c3RlbVN0YWZmUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ0FkZCBJbnN0cnVtZW50Jyk7XHJcbiAgICAvLyBpZiB3ZSBhcmUgbG9va2luZyBhdCBhIHN1YnNldCBvZiB0aGUgc2NvcmUsIHdlIHdvbid0IHNlZSB0aGUgbmV3IHN0YWZmLiAgU29cclxuICAgIC8vIHJldmVydCB0byB0aGUgZnVsbCB2aWV3XHJcbiAgICBjb25zdCBzdGFmZiA9IFNtb09wZXJhdGlvbi5hZGRTdGFmZih0aGlzLnN0b3JlU2NvcmUsIGluc3RydW1lbnQpO1xyXG4gICAgY29uc3QgaW5zdEtleXMgPSBPYmplY3Qua2V5cyhzdGFmZi5tZWFzdXJlSW5zdHJ1bWVudE1hcCk7XHJcbiAgICAvLyB1cGRhdGUgdGhlIGtleSBzaWduYXR1cmVzIGZvciB0aGUgbmV3IHBhcnRcclxuICAgIGluc3RLZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBudW1LZXkgPSBwYXJzZUludChrZXksIDEwKTtcclxuICAgICAgY29uc3QgaW5zdCA9IHN0YWZmLm1lYXN1cmVJbnN0cnVtZW50TWFwW251bUtleV07XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uaW5uZXJTZWxlY3Rpb25zKHRoaXMuc3RvcmVTY29yZSwgaW5zdC5zdGFydFNlbGVjdG9yLCBpbnN0LmVuZFNlbGVjdG9yKTtcclxuICAgICAgU21vT3BlcmF0aW9uLmNoYW5nZUluc3RydW1lbnQoaW5zdCwgc2VsZWN0aW9ucyk7XHJcbiAgICB9KVxyXG4gICAgaWYgKGluc3RydW1lbnQuc3RhZmZJZCA+IDApIHtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zdG9yZVNjb3JlLCBpbnN0cnVtZW50LnN0YWZmSWQgLSAxLCAwKTtcclxuICAgICAgY29uc3Qgc2VsID0gU21vU2VsZWN0b3IuZGVmYXVsdDtcclxuICAgICAgc2VsLnN0YWZmID0gaW5zdHJ1bWVudC5zdGFmZklkIC0gMTtcclxuICAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICAgIGxldCBncnAgPSB0aGlzLnN0b3JlU2NvcmUuZ2V0U3lzdGVtR3JvdXBGb3JTdGFmZihzZWxlY3Rpb24pO1xyXG4gICAgICAgIGlmIChncnApIHtcclxuICAgICAgICAgIGdycC5lbmRTZWxlY3Rvci5zdGFmZiA9IGluc3RydW1lbnQuc3RhZmZJZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGdycCA9IG5ldyBTbW9TeXN0ZW1Hcm91cChTbW9TeXN0ZW1Hcm91cC5kZWZhdWx0cyk7XHJcbiAgICAgICAgICBncnAuc3RhcnRTZWxlY3Rvci5zdGFmZiA9IGluc3RydW1lbnQuc3RhZmZJZCAtIDE7XHJcbiAgICAgICAgICBncnAuZW5kU2VsZWN0b3Iuc3RhZmYgPSBpbnN0cnVtZW50LnN0YWZmSWQ7XHJcbiAgICAgICAgICB0aGlzLnN0b3JlU2NvcmUuc3lzdGVtR3JvdXBzLnB1c2goZ3JwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMudmlld0FsbCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgcGFydCBpbmZvIGFzc3VtZXMgdGhhdCB0aGUgcGFydCBpcyBjdXJyZW50bHkgZXhwb3NlZCAtIHRoYXRcclxuICAgKiBzdGFmZiAwIGlzIHRoZSBmaXJzdCBzdGFmZiBpbiB0aGUgcGFydCBwcmlvciB0byBlZGl0aW5nLlxyXG4gICAqIEBwYXJhbSBpbmZvXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlUGFydEluZm8oaW5mbzogU21vUGFydEluZm8pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdVcGRhdGUgcGFydCBpbmZvJyk7XHJcbiAgICBjb25zdCBzdG9yZVN0YWZmID0gdGhpcy5zdGFmZk1hcFswXSAtIGluZm8uc3RhdmVzQmVmb3JlO1xyXG4gICAgY29uc3QgcGFydExlbmd0aCA9IGluZm8uc3RhdmVzQmVmb3JlICsgaW5mby5zdGF2ZXNBZnRlciArIDE7XHJcbiAgICBjb25zdCByZXNldFZpZXcgPSAhU21vTGF5b3V0TWFuYWdlci5hcmVMYXlvdXRzRXF1YWwoaW5mby5sYXlvdXRNYW5hZ2VyLmdldEdsb2JhbExheW91dCgpLCB0aGlzLnNjb3JlLmxheW91dE1hbmFnZXIhLmdldEdsb2JhbExheW91dCgpKTtcclxuICAgIGNvbnN0IHJlc3RDaGFuZ2UgPSB0aGlzLnNjb3JlLnN0YXZlc1swXS5wYXJ0SW5mby5leHBhbmRNdWx0aW1lYXN1cmVSZXN0cyAhPSBpbmZvLmV4cGFuZE11bHRpbWVhc3VyZVJlc3RzO1xyXG4gICAgY29uc3Qgc3RhdmVzQ2hhbmdlID0gdGhpcy5zY29yZS5zdGF2ZXNbMF0ucGFydEluZm8uc3RhdmVzQWZ0ZXIgIT09IGluZm8uc3RhdmVzQWZ0ZXI7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgcGFydExlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG5TdGFmZkluZGV4ID0gc3RvcmVTdGFmZiArIGk7XHJcbiAgICAgIGNvbnN0IG5JbmZvID0gbmV3IFNtb1BhcnRJbmZvKGluZm8pO1xyXG4gICAgICBuSW5mby5zdGF2ZXNCZWZvcmUgPSBpO1xyXG4gICAgICBuSW5mby5zdGF2ZXNBZnRlciA9IHBhcnRMZW5ndGggLSBpIC0gMTtcclxuICAgICAgdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1tuU3RhZmZJbmRleF0ucGFydEluZm8gPSBuSW5mbztcclxuICAgICAgLy8gSWYgdGhlIHN0YWZmIGluZGV4IGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQsIFxyXG4gICAgICBjb25zdCBkaXNwbGF5ZWRJbmRleCA9IHRoaXMuc3RhZmZNYXAuZmluZEluZGV4KCh4KSA9PiB4ID09PSBuU3RhZmZJbmRleCk7XHJcbiAgICAgIGlmIChkaXNwbGF5ZWRJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgdGhpcy5zY29yZS5zdGF2ZXNbZGlzcGxheWVkSW5kZXhdLnBhcnRJbmZvID0gbmV3IFNtb1BhcnRJbmZvKG5JbmZvKTtcclxuICAgICAgICB0aGlzLnNjb3JlLmxheW91dE1hbmFnZXIgPSBuSW5mby5sYXlvdXRNYW5hZ2VyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocmVzZXRWaWV3IHx8IHJlc3RDaGFuZ2UgfHwgc3RhdmVzQ2hhbmdlKSB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5jb21wdXRlTXVsdGlwYXJ0UmVzdCh0aGlzLnNjb3JlKTtcclxuICAgICAgLy8gdGhpcy5yZXNldFBhcnRWaWV3KCk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIucmVyZW5kZXJBbGwoKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIHNpbXBsZXIgQVBJIGZvciBhcHBsaWNhdGlvbnMgdG8gYWRkIGEgbmV3IHN0YWZmIHRvIHRoZSBzY29yZS5cclxuICAgKiBAcGFyYW0gcGFyYW1zIC0gdGhlIGluc3RydW1lbnQsIHdoaWNoIGRldGVybWluZXMgY2xlZiwgZXRjLlxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZFN0YWZmU2ltcGxlKHBhcmFtczogUGFydGlhbDxTbW9JbnN0cnVtZW50UGFyYW1zPik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgaW5zdHJ1bWVudFBhcmFtcyA9IFNtb0luc3RydW1lbnQuZGVmYXVsdHM7XHJcbiAgICBpbnN0cnVtZW50UGFyYW1zLnN0YXJ0U2VsZWN0b3Iuc3RhZmYgPSBpbnN0cnVtZW50UGFyYW1zLmVuZFNlbGVjdG9yLnN0YWZmID0gdGhpcy5zY29yZS5zdGF2ZXMubGVuZ3RoO1xyXG4gICAgaW5zdHJ1bWVudFBhcmFtcy5jbGVmID0gcGFyYW1zLmNsZWYgPz8gaW5zdHJ1bWVudFBhcmFtcy5jbGVmO1xyXG5cclxuICAgIGNvbnN0IHN0YWZmUGFyYW1zID0gU21vU3lzdGVtU3RhZmYuZGVmYXVsdHM7XHJcbiAgICBzdGFmZlBhcmFtcy5zdGFmZklkID0gdGhpcy5zdG9yZVNjb3JlLnN0YXZlcy5sZW5ndGg7IC8vIGFkZCBhIHN0YWZmXHJcbiAgICBzdGFmZlBhcmFtcy5tZWFzdXJlSW5zdHJ1bWVudE1hcFswXSA9IG5ldyBTbW9JbnN0cnVtZW50KGluc3RydW1lbnRQYXJhbXMpO1xyXG4gICAgdGhpcy5hZGRTdGFmZihzdGFmZlBhcmFtcyk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNhdmUgdGhlIHNjb3JlIHRvIGxvY2FsIHN0b3JhZ2UuXHJcbiAgICovXHJcbiAgcXVpY2tTYXZlKCkge1xyXG4gICAgY29uc3Qgc2NvcmVTdHIgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlU2NvcmUuc2VyaWFsaXplKCkpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oc21vU2VyaWFsaXplLmxvY2FsU2NvcmUsIHNjb3JlU3RyKTtcclxuICB9XHJcbiAgdXBkYXRlUmVwZWF0Q291bnQoY291bnQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3JlcGVhdCBiYXInKTtcclxuICAgIGNvbnN0IHN5bWJvbCA9IGNvdW50ID4gMCA/IHRydWUgOiBmYWxzZTsgICAgXHJcbiAgICBtZWFzdXJlU2VsZWN0aW9ucy5mb3JFYWNoKChtcykgPT4ge1xyXG4gICAgICBjb25zdCBzdG9yZSA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24obXMpO1xyXG4gICAgICBtcy5tZWFzdXJlLnJlcGVhdENvdW50ID0gY291bnQ7XHJcbiAgICAgIG1zLm1lYXN1cmUucmVwZWF0U3ltYm9sID0gc3ltYm9sO1xyXG4gICAgICBpZiAoc3RvcmUpIHtcclxuICAgICAgICBzdG9yZS5tZWFzdXJlLnJlcGVhdENvdW50ID0gY291bnQ7XHJcbiAgICAgICAgc3RvcmUubWVhc3VyZS5yZXBlYXRTeW1ib2wgPSBzeW1ib2w7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBtZWFzdXJlIGZvcm1hdHRpbmcgcGFyYW1ldGVycyBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXHJcbiAgICogQHBhcmFtIGZvcm1hdCBnZW5lcmljIG1lYXN1cmUgZm9ybWF0dGluZyBwYXJhbWV0ZXJzXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgc2V0TWVhc3VyZUZvcm1hdChmb3JtYXQ6IFNtb01lYXN1cmVGb3JtYXQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgbGFiZWwgPSAnc2V0IG1lYXN1cmUgZm9ybWF0JztcclxuICAgIGNvbnN0IGZyb21TZWxlY3RvciA9IHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKS5zZWxlY3RvcjtcclxuICAgIGNvbnN0IHRvU2VsZWN0b3IgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKS5zZWxlY3RvcjtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkTWVhc3VyZXMoKTtcclxuICAgIC8vIElmIHRoZSBmb3JtYXR0aW5nIGlzIG9uIGEgcGFydCwgcHJlc2VydmUgaXQgaW4gdGhlIHBhcnQncyBpbmZvXHJcbiAgICBjb25zdCBpc1BhcnQgPSB0aGlzLmlzUGFydEV4cG9zZWQoKTtcclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKG0pID0+IHtcclxuICAgICAgdGhpcy5fdW5kb0NvbHVtbihsYWJlbCwgbS5zZWxlY3Rvci5tZWFzdXJlKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVGb3JtYXQodGhpcy5zY29yZSwgbSwgZm9ybWF0KTtcclxuICAgICAgaWYgKGlzUGFydCkge1xyXG4gICAgICAgIG0uc3RhZmYucGFydEluZm8ubWVhc3VyZUZvcm1hdHRpbmdbbS5tZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4XSA9IG5ldyBTbW9NZWFzdXJlRm9ybWF0KGZvcm1hdCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYWx0ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihtKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVGb3JtYXQodGhpcy5zdG9yZVNjb3JlLCBhbHQhLCBmb3JtYXQpO1xyXG4gICAgICBpZiAoaXNQYXJ0KSB7XHJcbiAgICAgICAgYWx0IS5zdGFmZi5wYXJ0SW5mby5tZWFzdXJlRm9ybWF0dGluZ1ttLm1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXhdID0gbmV3IFNtb01lYXN1cmVGb3JtYXQoZm9ybWF0KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJSZWN0YW5nbGUoZnJvbVNlbGVjdG9yLCB0b1NlbGVjdG9yKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHN5c3RlbSBicmVha3MgZnJvbSB0aGUgbWVhc3VyZSBmb3JtYXR0aW5nIGZvciBzZWxlY3RlZCBtZWFzdXJlc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHJlbW92ZVN5c3RlbUJyZWFrcygpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgbGFiZWwgPSAnc2V0IG1lYXN1cmUgZm9ybWF0JztcclxuICAgIGNvbnN0IGZyb21TZWxlY3RvciA9IHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKS5zZWxlY3RvcjtcclxuICAgIGNvbnN0IHRvU2VsZWN0b3IgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKS5zZWxlY3RvcjtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkTWVhc3VyZXMoKTtcclxuICAgIC8vIElmIHRoZSBmb3JtYXR0aW5nIGlzIG9uIGEgcGFydCwgcHJlc2VydmUgaXQgaW4gdGhlIHBhcnQncyBpbmZvXHJcbiAgICBjb25zdCBpc1BhcnQgPSB0aGlzLmlzUGFydEV4cG9zZWQoKTtcclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKG0pID0+IHtcclxuICAgICAgdGhpcy5fdW5kb0NvbHVtbihsYWJlbCwgbS5zZWxlY3Rvci5tZWFzdXJlKTtcclxuICAgICAgY29uc3QgZm9ybWF0ID0gbmV3IFNtb01lYXN1cmVGb3JtYXQobS5tZWFzdXJlLmZvcm1hdCk7XHJcbiAgICAgIGZvcm1hdC5zeXN0ZW1CcmVhayA9IGZhbHNlO1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0TWVhc3VyZUZvcm1hdCh0aGlzLnNjb3JlLCBtLCBmb3JtYXQpO1xyXG4gICAgICBpZiAoaXNQYXJ0KSB7XHJcbiAgICAgICAgbS5zdGFmZi5wYXJ0SW5mby5tZWFzdXJlRm9ybWF0dGluZ1ttLm1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXhdID0gbmV3IFNtb01lYXN1cmVGb3JtYXQoZm9ybWF0KTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhbHQgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKG0pO1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0TWVhc3VyZUZvcm1hdCh0aGlzLnN0b3JlU2NvcmUsIGFsdCEsIGZvcm1hdCk7XHJcbiAgICAgIGlmIChpc1BhcnQpIHtcclxuICAgICAgICBhbHQhLnN0YWZmLnBhcnRJbmZvLm1lYXN1cmVGb3JtYXR0aW5nW20ubWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleF0gPSBuZXcgU21vTWVhc3VyZUZvcm1hdChmb3JtYXQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlclJlY3RhbmdsZShmcm9tU2VsZWN0b3IsIHRvU2VsZWN0b3IpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICByZW51bWJlck1lYXN1cmVzKG1lYXN1cmVJbmRleDogbnVtYmVyLCBsb2NhbEluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2NvcmUudXBkYXRlUmVudW1iZXJpbmdNYXAobWVhc3VyZUluZGV4LCBsb2NhbEluZGV4KTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS51cGRhdGVSZW51bWJlcmluZ01hcChtZWFzdXJlSW5kZXgsIGxvY2FsSW5kZXgpO1xyXG4gICAgY29uc3QgbW1zZWwgPSBTbW9TZWxlY3Rpb24ubWVhc3VyZVNlbGVjdGlvbih0aGlzLnNjb3JlLCAwLCBtZWFzdXJlSW5kZXgpO1xyXG4gICAgaWYgKG1tc2VsKSB7XHJcbiAgICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbbW1zZWxdKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUGxheSB0aGUgbXVzaWMgZnJvbSB0aGUgc3RhcnRpbmcgc2VsZWN0aW9uXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgcGxheUZyb21TZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICB2YXIgbW0gPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigtMSk7XHJcbiAgICBpZiAoU3VpQXVkaW9QbGF5ZXIucGxheWluZ0luc3RhbmNlICYmIFN1aUF1ZGlvUGxheWVyLnBsYXlpbmdJbnN0YW5jZS5wYXVzZWQpIHtcclxuICAgICAgU3VpQXVkaW9QbGF5ZXIucGxheWluZ0luc3RhbmNlLnBsYXkoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKFN1aUF1ZGlvUGxheWVyLnBsYXlpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbmV3IFN1aUF1ZGlvUGxheWVyKHsgYXVkaW9BbmltYXRpb246IHRoaXMuYXVkaW9BbmltYXRpb24sIHNjb3JlOiB0aGlzLnNjb3JlLCBzdGFydEluZGV4OiBtbS5zZWxlY3Rvci5tZWFzdXJlLCB2aWV3OiB0aGlzIH0pLnBsYXkoKTtcclxuICB9XHJcbiAgc3RvcFBsYXllcigpIHtcclxuICAgIFN1aUF1ZGlvUGxheWVyLnN0b3BQbGF5ZXIoKTtcclxuICB9XHJcbiAgcGF1c2VQbGF5ZXIoKSB7XHJcbiAgICBTdWlBdWRpb1BsYXllci5wYXVzZVBsYXllcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJveHkgY2FsbHMgdG8gbW92ZSB0aGUgdHJhY2tlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byB0aGVcclxuICAgKiBydWxlcyBvZiB0aGUgJ0hvbWUnIGtleSAoZGVwZW5kaW5nIG9uIHNoaWZ0L2N0cmwvYWx0KVxyXG4gICAqIEBwYXJhbSBldiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlSG9tZShldjogS2V5RXZlbnQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLm1vdmVIb21lKGV2KTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQcm94eSBjYWxscyB0byBtb3ZlIHRoZSB0cmFja2VyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHRoZVxyXG4gICAqIHJ1bGVzIG9mIHRoZSAnRW5kJyBrZXkgKGRlcGVuZGluZyBvbiBzaGlmdC9jdHJsL2FsdClcclxuICAgKiBAcGFyYW0gZXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgIGFzeW5jIG1vdmVFbmQoZXY6IEtleUV2ZW50KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlRW5kKGV2KTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHcm93IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSBvbmUgdG8gdGhlIGxlZnQsIGlmIHBvc3NpYmxlXHJcbiAgICogQHBhcmFtIGV2IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gICBhc3luYyBncm93U2VsZWN0aW9uTGVmdCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmdyb3dTZWxlY3Rpb25MZWZ0KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR3JvdyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgb25lIHRvIHRoZSByaWdodCwgaWYgcG9zc2libGVcclxuICAgKiBAcGFyYW0gZXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgIGFzeW5jIGdyb3dTZWxlY3Rpb25SaWdodCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmdyb3dTZWxlY3Rpb25SaWdodCgpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNlbGVjdCB0aGUgbmV4dCB0YWJiYWJsZSBtb2RpZmllciBuZWFyIG9uZSBvZiB0aGUgc2VsZWN0ZWQgbm90ZXNcclxuICAgKiBAcGFyYW0ga2V5RXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgYWR2YW5jZU1vZGlmaWVyU2VsZWN0aW9uKGtleUV2OiBLZXlFdmVudCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIuYWR2YW5jZU1vZGlmaWVyU2VsZWN0aW9uKGtleUV2KTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZWxlY3QgdGhlIG5leHQgZW50aXJlIG1lYXN1cmUsIGlmIHBvc3NpYmxlXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgZ3Jvd1NlbGVjdGlvblJpZ2h0TWVhc3VyZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmdyb3dTZWxlY3Rpb25SaWdodE1lYXN1cmUoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZHZhbmNlIGN1cnNvciBmb3J3YXJkcywgaWYgcG9zc2libGVcclxuICAgKiBAcGFyYW0gZXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgbW92ZVNlbGVjdGlvblJpZ2h0KCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIubW92ZVNlbGVjdGlvblJpZ2h0KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWR2YW5jZSBjdXJzb3IgYmFja3dhcmRzLCBpZiBwb3NzaWJsZVxyXG4gICAqIEBwYXJhbSBldiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uTGVmdCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLm1vdmVTZWxlY3Rpb25MZWZ0KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWR2YW5jZSBjdXJzb3IgYmFjayBlbnRpcmUgbWVhc3VyZSwgaWYgcG9zc2libGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uTGVmdE1lYXN1cmUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uTGVmdE1lYXN1cmUoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZHZhbmNlIGN1cnNvciBmb3J3YXJkIG9uZSBtZWFzdXJlLCBpZiBwb3NzaWJsZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIG1vdmVTZWxlY3Rpb25SaWdodE1lYXN1cmUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uUmlnaHRNZWFzdXJlKCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTW92ZSBjdXJzb3IgdG8gYSBoaWdoZXIgcGl0Y2ggaW4gdGhlIGN1cnJlbnQgY2hvcmQsIHdpdGggd3JhcFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIG1vdmVTZWxlY3Rpb25QaXRjaFVwKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIubW92ZVNlbGVjdGlvblBpdGNoVXAoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBNb3ZlIGN1cnNvciB0byBhIGxvd2VyIHBpdGNoIGluIHRoZSBjdXJyZW50IGNob3JkLCB3aXRoIHdyYXBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uUGl0Y2hEb3duKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIubW92ZVNlbGVjdGlvblBpdGNoRG93bigpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE1vdmUgY3Vyc29yIHVwIGEgc3RhZmYgaW4gdGhlIHN5c3RlbSwgaWYgcG9zc2libGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uVXAoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uVXAoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBNb3ZlIGN1cnNvciBkb3duIGEgc3RhZmYgaW4gdGhlIHN5c3RlbSwgaWYgcG9zc2libGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICAgYXN5bmMgbW92ZVNlbGVjdGlvbkRvd24oKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uRG93bigpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgY3VycmVudCBzdWdnZXN0aW9ucyAoaG92ZXIgZWxlbWVudCkgYXMgdGhlIHNlbGVjdGlvblxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gICBhc3luYyBzZWxlY3RTdWdnZXN0aW9uKGV2RGF0YTogS2V5RXZlbnQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdFN1Z2dlc3Rpb24oZXZEYXRhKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGJveCwgYW5kIG1ha2UgaXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXHJcbiAgICogICovXHJcbiAgYXN5bmMgaW50ZXJzZWN0aW5nQXJ0aWZhY3QoZXZEYXRhOiBTdmdCb3gpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmludGVyc2VjdGluZ0FydGlmYWN0KGV2RGF0YSk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9ICBcclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/render/sui/scoreViewOperations.ts\n\n}");
360
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiScoreViewOperations: () => (/* binding */ SuiScoreViewOperations)\n/* harmony export */ });\n/* harmony import */ var _scoreView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scoreView */ \"./src/render/sui/scoreView.ts\");\n/* harmony import */ var _smo_data_score__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/score */ \"./src/smo/data/score.ts\");\n/* harmony import */ var _smo_data_systemStaff__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../smo/data/systemStaff */ \"./src/smo/data/systemStaff.ts\");\n/* harmony import */ var _smo_data_partInfo__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../smo/data/partInfo */ \"./src/smo/data/partInfo.ts\");\n/* harmony import */ var _smo_data_measure__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../smo/data/measure */ \"./src/smo/data/measure.ts\");\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/data/common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../smo/data/scoreModifiers */ \"./src/smo/data/scoreModifiers.ts\");\n/* harmony import */ var _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../smo/data/scoreText */ \"./src/smo/data/scoreText.ts\");\n/* harmony import */ var _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../smo/data/noteModifiers */ \"./src/smo/data/noteModifiers.ts\");\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../smo/xform/undo */ \"./src/smo/xform/undo.ts\");\n/* harmony import */ var _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../smo/xform/operations */ \"./src/smo/xform/operations.ts\");\n/* harmony import */ var _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../common/serializationHelpers */ \"./src/common/serializationHelpers.js\");\n/* harmony import */ var _smo_data_music__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../smo/data/music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _audio_oscillator__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../audio/oscillator */ \"./src/render/audio/oscillator.ts\");\n/* harmony import */ var _smo_mxml_xmlToSmo__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../smo/mxml/xmlToSmo */ \"./src/smo/mxml/xmlToSmo.ts\");\n/* harmony import */ var _audio_player__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../audio/player */ \"./src/render/audio/player.ts\");\n/* harmony import */ var _ui_fileio_xhrLoader__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../ui/fileio/xhrLoader */ \"./src/ui/fileio/xhrLoader.ts\");\n/* harmony import */ var _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../smo/xform/selections */ \"./src/smo/xform/selections.ts\");\n/* harmony import */ var _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../smo/data/staffModifiers */ \"./src/smo/data/staffModifiers.ts\");\n/* harmony import */ var _piano__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./piano */ \"./src/render/sui/piano.ts\");\n/* harmony import */ var _svgHelpers__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../common/promiseHelpers */ \"./src/common/promiseHelpers.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\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 * MVVM-like operations on the displayed score.\n *\n * All operations that can be performed on a 'live' score go through this\n * module. It maps the score view to the actual score and makes sure the\n * model and view stay in sync.\n *\n * Because this object operates on the current selections,\n * all operations return promise so applications can wait for the\n * operation to complete and update the selection list.\n * @category SuiRender\n */\nclass SuiScoreViewOperations extends _scoreView__WEBPACK_IMPORTED_MODULE_0__.SuiScoreView {\n /**\n * Add a new text group to the score\n * @param textGroup a new text group\n * @returns\n */\n addTextGroup(textGroup) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const altNew = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_7__.SmoTextGroup.deserializePreserveId(textGroup.serialize());\n const isPartExposed = this.isPartExposed();\n let selector = (_a = textGroup.selector) !== null && _a !== void 0 ? _a : _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelector.default;\n const partInfo = this.score.staves[0].partInfo;\n const bufType = isPartExposed && partInfo.preserveTextGroups\n ? _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.PART_MODIFIER : _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.SCORE_MODIFIER;\n if (bufType === _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.PART_MODIFIER) {\n selector.staff = this.staffMap[0];\n }\n this.storeUndo.addBuffer('remove text group', bufType, selector, textGroup, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.ADD);\n if (isPartExposed && partInfo.preserveTextGroups) {\n this.score.staves[0].partInfo.updateTextGroup(textGroup, true);\n const partInfo = this.storeScore.staves[this._getEquivalentStaff(0)].partInfo;\n partInfo.updateTextGroup(altNew, true);\n }\n else {\n this.score.updateTextGroup(textGroup, true);\n this.storeScore.updateTextGroup(altNew, true);\n }\n yield this.renderer.rerenderTextGroups();\n });\n }\n /**\n * Remove the text group from the score\n * @param textGroup\n * @returns\n */\n removeTextGroup(textGroup) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n let selector = (_a = textGroup.selector) !== null && _a !== void 0 ? _a : _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelector.default;\n const partInfo = this.score.staves[0].partInfo;\n const isPartExposed = this.isPartExposed();\n const bufType = isPartExposed && partInfo.preserveTextGroups\n ? _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.PART_MODIFIER : _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.SCORE_MODIFIER;\n let ogText = this.storeScore.textGroups.find((tg) => tg.attrs.id === textGroup.attrs.id);\n if (isPartExposed && partInfo.preserveTextGroups) {\n ogText = partInfo.textGroups.find((tg) => tg.attrs.id === textGroup.attrs.id);\n }\n if (bufType === _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.PART_MODIFIER) {\n selector.staff = this.staffMap[0];\n }\n else {\n selector.staff = this.staffMap[selector.staff];\n }\n if (!ogText) {\n return;\n }\n this.storeUndo.addBuffer('remove text group', bufType, selector, ogText, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.REMOVE);\n const altGroup = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_7__.SmoTextGroup.deserializePreserveId(textGroup.serialize());\n textGroup.elements.forEach((el) => (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_5__.RemoveElementLike)(el));\n textGroup.elements = [];\n if (isPartExposed && partInfo.preserveTextGroups) {\n partInfo.updateTextGroup(textGroup, false);\n this.storeScore.staves[this._getEquivalentStaff(0)].partInfo.updateTextGroup(altGroup, false);\n }\n else {\n this.score.updateTextGroup(textGroup, false);\n this.storeScore.updateTextGroup(altGroup, false);\n }\n yield this.renderer.rerenderTextGroups();\n });\n }\n /**\n * UPdate an existing text group. The original is passed in, because since TG not tied to a musical\n * element, we need to find the one we're updating.\n * @param oldVersion\n * @param newVersion\n * @returns\n */\n updateTextGroup(newVersion) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const selector = (_a = newVersion.selector) !== null && _a !== void 0 ? _a : _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelector.default;\n const isPartExposed = this.isPartExposed();\n const partInfo = this.score.staves[0].partInfo;\n // Back up the original score text\n let ogtg = this.storeScore.textGroups.find((tg) => tg.attrs.id === newVersion.attrs.id);\n if (isPartExposed && partInfo.preserveTextGroups) {\n ogtg = partInfo.textGroups.find((tg) => tg.attrs.id === newVersion.attrs.id);\n }\n if (!ogtg) {\n // there is nothing to update, return.\n return;\n }\n if (ogtg) {\n const bufType = isPartExposed && partInfo.preserveTextGroups\n ? _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.PART_MODIFIER : _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.SCORE_MODIFIER;\n // if this is part text, make sure the undo buffer is associated with the part stave\n // in the full score, so undo works properly\n if (bufType === _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferTypes.PART_MODIFIER) {\n selector.staff = this.staffMap[0];\n }\n else {\n selector.staff = this.staffMap[selector.staff];\n }\n this.storeUndo.addBuffer('modify text', bufType, selector, ogtg, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.UPDATE);\n }\n const altNew = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_7__.SmoTextGroup.deserializePreserveId(newVersion.serialize());\n this.score.updateTextGroup(newVersion, true);\n // If this is part text, don't store it in the score text, except for the displayed score\n if (!isPartExposed) {\n this.storeScore.updateTextGroup(altNew, true);\n }\n else {\n this.storeScore.staves[this._getEquivalentStaff(0)].partInfo.updateTextGroup(altNew, true);\n }\n // TODO: only render the one TG.\n yield this.renderer.rerenderTextGroups();\n // return this.renderer.updatePromise();\n });\n }\n /**\n * load an mxml score remotely, return a promise that\n * completes when the file is loaded\n * @param url where to find the xml file\n * @returns\n */\n loadRemoteXml(url) {\n return __awaiter(this, void 0, void 0, function* () {\n const req = new _ui_fileio_xhrLoader__WEBPACK_IMPORTED_MODULE_17__.SuiXhrLoader(url);\n const self = this;\n // Shouldn't we return promise of actually displaying the score?\n yield req.loadAsync();\n const parser = new DOMParser();\n const xml = parser.parseFromString(req.value, 'text/xml');\n const score = _smo_mxml_xmlToSmo__WEBPACK_IMPORTED_MODULE_15__.XmlToSmo.convert(xml);\n score.layoutManager.zoomToWidth($('body').width());\n yield self.changeScore(score);\n });\n }\n /**\n * load a remote score in SMO format\n * @param url url to find the score\n * @returns\n */\n loadRemoteJson(url) {\n return __awaiter(this, void 0, void 0, function* () {\n const req = new _ui_fileio_xhrLoader__WEBPACK_IMPORTED_MODULE_17__.SuiXhrLoader(url);\n yield req.loadAsync();\n const score = _smo_data_score__WEBPACK_IMPORTED_MODULE_1__.SmoScore.deserialize(req.value);\n yield this.changeScore(score);\n });\n }\n /**\n * Load a remote score, return promise when it's been loaded\n * from afar.\n * @param pref\n * @returns\n */\n loadRemoteScore(url) {\n return __awaiter(this, void 0, void 0, function* () {\n if (url.endsWith('xml') || url.endsWith('mxl')) {\n return this.loadRemoteXml(url);\n }\n else {\n return this.loadRemoteJson(url);\n }\n });\n }\n updateAudioSettings(pref) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScorePreferences('Update preferences');\n this.score.audioSettings = pref;\n this.storeScore.audioSettings = new _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoAudioPlayerSettings(pref);\n // No rendering to be done\n return this.renderer.updatePromise();\n });\n }\n /**\n * Global settings that control how the score editor behaves\n * @param pref\n * @returns\n */\n updateScorePreferences(pref) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScorePreferences('Update preferences');\n const oldXpose = this.score.preferences.transposingScore;\n const curXpose = pref.transposingScore;\n this.score.updateScorePreferences(new _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoScorePreferences(pref));\n this.storeScore.updateScorePreferences(new _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoScorePreferences(pref));\n if (curXpose === false && oldXpose === true) {\n this.score.setNonTransposing();\n }\n else if (curXpose === true && oldXpose === false) {\n this.score.setTransposing();\n }\n this.renderer.setDirty();\n return this.renderer.updatePromise();\n });\n }\n /**\n * Update information about the score, composer etc.\n * @param scoreInfo\n * @returns\n */\n updateScoreInfo(scoreInfo) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScorePreferences('Update preferences');\n this.score.scoreInfo = scoreInfo;\n this.storeScore.scoreInfo = JSON.parse(JSON.stringify(scoreInfo));\n return this.renderer.updatePromise();\n });\n }\n addRemoveArpeggio(code) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.modifyCurrentSelections('add/remove addRemoveArpeggio', (score, selections) => {\n selections.forEach((sel) => {\n if (sel.note) {\n if (code === 'none') {\n sel.note.arpeggio = undefined;\n }\n else {\n sel.note.arpeggio = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoArpeggio({ type: code });\n }\n }\n });\n });\n });\n }\n /**\n * A clef change mid-measure (clefNote)\n * @param clef\n */\n addRemoveClefChange(clef) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.modifyCurrentSelections('add/remove addRemoveClefChange', (score, selections) => {\n selections.forEach((sel) => {\n const measureClef = sel.measure.clef;\n if (sel.note) {\n if (measureClef === clef.clef) {\n sel.note.clefNote = null;\n }\n else {\n sel.note.clefNote = clef;\n }\n }\n });\n });\n });\n }\n /**\n * Modify the dynamics assoicated with the specific selection\n * @param selection\n * @param dynamic\n * @returns\n */\n addDynamic(selection, dynamic) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.modifySelection('add dynamic', selection, (score, selections) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addDynamic(selections[0], dynamic);\n });\n });\n }\n /**\n * Remove dynamics from the selection\n * @param selection\n * @param dynamic\n * @returns\n */\n _removeDynamic(selection, dynamic) {\n return __awaiter(this, void 0, void 0, function* () {\n const equiv = this._getEquivalentSelection(selection);\n if (equiv !== null && equiv.note !== null) {\n const altModifiers = equiv.note.getModifiers('SmoDynamicText');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeDynamic(selection, dynamic);\n if (altModifiers.length) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeDynamic(equiv, altModifiers[0]);\n }\n }\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Remove dynamics from the current selection\n * @param dynamic\n * @returns\n */\n removeDynamic(dynamic) {\n return __awaiter(this, void 0, void 0, function* () {\n const sel = this.tracker.modifierSelections[0];\n if (!sel.selection) {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n this.tracker.selections = [sel.selection];\n this._undoFirstMeasureSelection('remove dynamic');\n this._removeDynamic(sel.selection, dynamic);\n this.renderer.addToReplaceQueue(sel.selection);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * we never really delete a note, but we will convert it into a rest and if it's\n * already a rest we will try to hide it.\n * Operates on current selections\n * */\n deleteNote() {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('delete note');\n this.tracker.selections.forEach((sel) => {\n if (sel.note) {\n const altSel = this._getEquivalentSelection(sel);\n // set the pitch to be a good position for the rest\n const pitch = JSON.parse(JSON.stringify(_smo_data_measure__WEBPACK_IMPORTED_MODULE_4__.SmoMeasure.defaultPitchForClef[sel.measure.clef]));\n const altPitch = JSON.parse(JSON.stringify(_smo_data_measure__WEBPACK_IMPORTED_MODULE_4__.SmoMeasure.defaultPitchForClef[altSel.measure.clef]));\n sel.note.pitches = [pitch];\n altSel.note.pitches = [altPitch];\n // If the note is a note, make it into a rest. If the note is a rest already,\n // make it invisible. If it is invisible already, make it back into a rest.\n if (sel.note.isRest() && !sel.note.isHidden()) {\n sel.note.makeHidden(true);\n altSel.note.makeHidden(true);\n }\n else {\n sel.note.clearArticulations();\n sel.note.makeRest();\n altSel.note.makeRest();\n altSel.note.clearArticulations();\n sel.note.makeHidden(false);\n altSel.note.makeHidden(false);\n }\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * The lyric editor moves around, so we can't depend on the tracker for the\n * correct selection. We get it directly from the editor.\n *\n * @param selector - the selector of the note with the lyric to remove\n * @param lyric - a copy of the lyric to remove. We use the verse, parser to identify it\n * @returns render promise\n */\n removeLyric(selector, lyric) {\n return __awaiter(this, void 0, void 0, function* () {\n const selection = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, selector);\n if (selection === null) {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n this._undoSelection('remove lyric', selection);\n selection.note.removeLyric(lyric);\n const equiv = this._getEquivalentSelection(selection);\n const storeLyric = equiv.note.getLyricForVerse(lyric.verse, lyric.parser);\n if (typeof (storeLyric) !== 'undefined') {\n equiv.note.removeLyric(lyric);\n }\n this.renderer.addToReplaceQueue(selection);\n lyric.deleted = true;\n yield this.renderer.updatePromise();\n });\n }\n /**\n * @param selector where to add or update the lyric\n * @param lyric a copy of the lyric to remove\n * @returns\n */\n addOrUpdateLyric(selector, lyric) {\n return __awaiter(this, void 0, void 0, function* () {\n const selection = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, selector);\n if (selection === null) {\n return;\n }\n this._undoSelection('update lyric', selection);\n selection.note.addLyric(lyric);\n const equiv = this._getEquivalentSelection(selection);\n const altLyric = _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoNoteModifierBase.deserialize(lyric.serialize());\n equiv.note.addLyric(altLyric);\n this.renderer.addToReplaceQueue(selection);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Delete all the notes for the currently selected voice\n * @returns\n */\n depopulateVoice() {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('depopulate voice');\n measureSelections.forEach((selection) => {\n const ix = selection.measure.getActiveVoice();\n if (ix !== 0) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.depopulateVoice(selection, ix);\n const equiv = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.depopulateVoice(equiv, ix);\n }\n });\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setActiveVoice(this.score, 0);\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Change the active voice in a multi-voice measure.\n * @param index\n * @returns\n */\n _changeActiveVoice(index) {\n const measuresToAdd = [];\n const measureSelections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections);\n measureSelections.forEach((measureSelection) => {\n if (index === measureSelection.measure.voices.length) {\n measuresToAdd.push(measureSelection);\n }\n });\n return measuresToAdd;\n }\n /**\n * Populate a new voice with default notes\n * @param index the voice to populate\n * @returns\n */\n populateVoice(index) {\n return __awaiter(this, void 0, void 0, function* () {\n const measuresToAdd = this._changeActiveVoice(index);\n if (measuresToAdd.length === 0) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setActiveVoice(this.score, index);\n this.tracker.selectActiveVoice();\n return this.renderer.updatePromise();\n }\n measuresToAdd.forEach((selection) => {\n this._undoSelection('popualteVoice', selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.populateVoice(selection, index);\n const equiv = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.populateVoice(equiv, index);\n });\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setActiveVoice(this.score, index);\n this._renderChangedMeasures(measuresToAdd);\n yield this.renderer.updatePromise();\n this.tracker.selectActiveVoice();\n });\n }\n swapVoices(voice1, voice2) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.getSelectedMeasures();\n const altSelections = this._getEquivalentSelections(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.swapVoice(selections, voice1, voice2);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.swapVoice(altSelections, voice1, voice2);\n this._renderChangedMeasures(selections);\n });\n }\n /**\n * Assign an instrument to a set of measures\n * @param instrument the instrument to assign to the selections\n * @param selections\n * @returns\n */\n changeInstrument(instrument, selections) {\n return __awaiter(this, void 0, void 0, function* () {\n if (typeof (selections) === 'undefined') {\n selections = this.tracker.selections;\n }\n this._undoSelections('change instrument', selections);\n const altSelections = this._getEquivalentSelections(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.changeInstrument(instrument, selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.changeInstrument(instrument, altSelections);\n this._renderChangedMeasures(selections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Set the time signature for a selection\n * @param timeSignature actual time signature\n */\n setTimeSignature(timeSignature) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Set time signature');\n const selections = this.tracker.selections;\n const altSelections = this._getEquivalentSelections(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setTimeSignature(this.score, selections, timeSignature);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setTimeSignature(this.storeScore, altSelections, timeSignature);\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections));\n return this.renderer.updatePromise();\n });\n }\n /**\n * Move selected staff up or down in the score.\n * @param index direction to move\n * @returns\n */\n moveStaffUpDown(index) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('re-order staves');\n // Get staff to move\n const selection = this._getEquivalentSelection(this.tracker.selections[0]);\n // Make the move in the model, and reset the view so we can see the new\n // arrangement\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.moveStaffUpDown(this.storeScore, selection, index);\n this.viewAll();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Update the staff group for a score, which determines how the staves\n * are justified and bracketed\n * @param staffGroup\n */\n addOrUpdateStaffGroup(staffGroup) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('group staves');\n // Assume that the view is now set to full score\n this.score.addOrReplaceSystemGroup(staffGroup);\n this.storeScore.addOrReplaceSystemGroup(staffGroup);\n this.renderer.setDirty();\n yield this.renderer.updatePromise();\n });\n }\n updateTabStave(tabStave) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasuresBetween(this.score, tabStave.startSelector, tabStave.endSelector);\n const altSelections = this._getEquivalentSelections(selections);\n if (selections.length === 0) {\n return;\n }\n this._undoSelections('updateTabStave', selections);\n const staff = selections[0].selector.staff;\n const altStaff = altSelections[0].selector.staff;\n const altTabStave = new _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__.SmoTabStave(tabStave.serialize());\n altTabStave.startSelector.staff = altStaff;\n altTabStave.endSelector.staff = altStaff;\n altTabStave.attrs.id = tabStave.attrs.id;\n this.score.staves[staff].updateTabStave(tabStave);\n this.storeScore.staves[altStaff].updateTabStave(altTabStave);\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections));\n yield this.renderer.updatePromise();\n });\n }\n removeTabStave() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const altSelections = this._getEquivalentSelections(selections);\n if (selections.length === 0) {\n return;\n }\n this._undoSelections('updateTabStave', selections);\n const stavesToRemove = [];\n const altStavesToRemove = [];\n const added = {};\n selections.forEach((sel, ix) => {\n const altSel = altSelections[ix];\n const tabStave = sel.staff.getTabStaveForMeasure(sel.selector);\n const altTabStave = altSel.staff.getTabStaveForMeasure(altSel.selector);\n if (tabStave && altTabStave) {\n if (!added[tabStave.attrs.id]) {\n added[tabStave.attrs.id] = tabStave;\n stavesToRemove.push(tabStave);\n altStavesToRemove.push(altTabStave);\n }\n }\n });\n selections[0].staff.removeTabStaves(stavesToRemove);\n altSelections[0].staff.removeTabStaves(altStavesToRemove);\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections));\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Update tempo for all or part of the score\n * @param measure the measure with the tempo. Tempo is measure-wide parameter\n * @param scoreMode if true, update whole score. Else selections\n * @returns\n */\n updateTempoScore(measure, tempo, scoreMode, selectionMode) {\n return __awaiter(this, void 0, void 0, function* () {\n let measureIndex = 0;\n const originalTempo = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoTempoText(measure.tempo);\n this._undoColumn('update tempo', measure.measureNumber.measureIndex);\n let startMeasure = measure.measureNumber.measureIndex;\n let endMeasure = this.score.staves[0].measures.length;\n let displayed = false;\n if (selectionMode) {\n const endSel = this.tracker.getExtremeSelection(1);\n if (endSel.selector.measure > startMeasure) {\n endMeasure = endSel.selector.measure;\n }\n }\n // If we are only changing the position of the text, it only affects the tempo measure.\n if (_smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoTempoText.eq(originalTempo, tempo) && tempo.yOffset !== originalTempo.yOffset && endMeasure > startMeasure) {\n endMeasure = startMeasure + 1;\n }\n for (measureIndex = startMeasure; measureIndex < endMeasure; ++measureIndex) {\n if (!scoreMode && !selectionMode) {\n // If not whole score or selections, change until the tempo doesn't match previous measure's tempo (next tempo change)\n const compMeasure = this.score.staves[0].measures[measureIndex];\n if (_smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoTempoText.eq(originalTempo, compMeasure.tempo) || displayed === false) {\n const sel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.measureSelection(this.score, 0, measureIndex);\n const altSel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.measureSelection(this.storeScore, 0, measureIndex);\n if (sel && sel.measure.tempo.display && !displayed) {\n this.renderer.addToReplaceQueue(sel);\n displayed = true;\n }\n if (sel) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addTempo(this.score, sel, tempo);\n }\n if (altSel) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addTempo(this.storeScore, altSel, tempo);\n }\n }\n else {\n break;\n }\n }\n else {\n const sel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.measureSelection(this.score, 0, measureIndex);\n const altSel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.measureSelection(this.storeScore, 0, measureIndex);\n if (sel) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addTempo(this.score, sel, tempo);\n if (!displayed) {\n this.renderer.addToReplaceQueue(sel);\n displayed = true;\n }\n }\n if (altSel) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addTempo(this.storeScore, altSel, tempo);\n }\n }\n }\n yield this.renderer.updatePromise();\n });\n }\n updateTabNote(tabNote) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasuresBetween(this.score, this.tracker.getExtremeSelection(-1).selector, this.tracker.getExtremeSelection(1).selector);\n const altSelections = this._getEquivalentSelections(selections);\n this._undoSelections('updateTabNote', selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.updateTabNote(selections, tabNote);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.updateTabNote(altSelections, tabNote);\n this.renderer.addToReplaceQueue(selections);\n yield this.renderer.updatePromise();\n });\n }\n removeTabNote() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasuresBetween(this.score, this.tracker.getExtremeSelection(-1).selector, this.tracker.getExtremeSelection(1).selector);\n const altSelections = this._getEquivalentSelections(selections);\n this._undoSelections('updateTabNote', selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeTabNote(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeTabNote(altSelections);\n this.renderer.addToReplaceQueue(selections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * 'remove' tempo, which means either setting the bars to the\n * default tempo, or the previously-set tempo.\n * @param scoreMode whether to reset entire score\n */\n removeTempo(measure, tempo, scoreMode, selectionMode) {\n return __awaiter(this, void 0, void 0, function* () {\n const startSelection = this.tracker.selections[0];\n if (startSelection.selector.measure > 0) {\n const measureIx = startSelection.selector.measure - 1;\n const target = startSelection.staff.measures[measureIx];\n const tempo = target.getTempo();\n const newTempo = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoTempoText(tempo);\n newTempo.display = false;\n this.updateTempoScore(measure, newTempo, scoreMode, selectionMode);\n }\n else {\n this.updateTempoScore(measure, new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoTempoText(_smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoTempoText.defaults), scoreMode, selectionMode);\n }\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Add a grace note to the selected real notes.\n */\n addGraceNote() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('add grace note');\n selections.forEach((selection) => {\n const index = selection.note.getGraceNotes().length;\n const pitches = JSON.parse(JSON.stringify(selection.note.pitches));\n const grace = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoGraceNote({\n pitches, ticks: { numerator: 2048, denominator: 1, remainder: 0 }\n });\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addGraceNote(selection, grace, index);\n const altPitches = JSON.parse(JSON.stringify(selection.note.pitches));\n const altGrace = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoGraceNote({\n pitches: altPitches, ticks: { numerator: 2048, denominator: 1, remainder: 0 }\n });\n altGrace.attrs.id = grace.attrs.id;\n const altSelection = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addGraceNote(altSelection, altGrace, index);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * remove selected grace note\n * @returns\n */\n removeGraceNote() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('remove grace note');\n selections.forEach((selection) => {\n // TODO: get the correct offset\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeGraceNote(selection, 0);\n const altSel = (this._getEquivalentSelection(selection));\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeGraceNote(altSel, 0);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Toggle slash in stem of grace note\n */\n slashGraceNotes() {\n return __awaiter(this, void 0, void 0, function* () {\n const grace = this.tracker.getSelectedGraceNotes();\n const measureSelections = this.undoTrackerMeasureSelections('slash grace note toggle');\n grace.forEach((gn) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.slashGraceNotes(gn);\n if (gn.selection !== null) {\n const altSelection = this._getEquivalentSelection(gn.selection);\n const altGn = this._getEquivalentGraceNote(altSelection, gn.modifier);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.slashGraceNotes({\n selection: altSelection, modifier: altGn,\n box: _smo_data_common__WEBPACK_IMPORTED_MODULE_5__.SvgBox.default, index: 0\n });\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n transposeScore(offset) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('transpose score');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transposeScore(this.score, offset);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transposeScore(this.storeScore, offset);\n this.renderer.rerenderAll();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * transpose selected notes\n * @param offset 1/2 steps\n * @returns\n */\n transposeSelections(offset) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('transpose');\n const grace = this.tracker.getSelectedGraceNotes();\n if (grace.length) {\n grace.forEach((artifact) => {\n if (artifact.selection !== null && artifact.selection.note !== null) {\n const gn1 = artifact.modifier;\n const index = artifact.selection.note.graceNotes.findIndex((x) => x.attrs.id === gn1.attrs.id);\n const altSelection = this._getEquivalentSelection(artifact.selection);\n if (altSelection && altSelection.note !== null) {\n const gn2 = altSelection.note.graceNotes[index];\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transposeGraceNotes(altSelection, [gn2], offset);\n }\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transposeGraceNotes(artifact.selection, [gn1], offset);\n }\n });\n }\n else {\n selections.forEach((selected) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transpose(selected, offset);\n const altSel = this._getEquivalentSelection(selected);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transpose(altSel, offset);\n });\n if (selections.length === 1 && this.score.preferences.autoPlay) {\n _audio_oscillator__WEBPACK_IMPORTED_MODULE_14__.SuiOscillator.playSelectionNow(selections[0], this.score, 1);\n }\n }\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * toggle the accidental spelling of the selected notes\n * @returns\n */\n toggleEnharmonic() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('toggle enharmonic');\n const grace = this.tracker.getSelectedGraceNotes();\n if (grace.length) {\n grace.forEach((artifact) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleGraceNoteEnharmonic(artifact.selection, [artifact.modifier]);\n const altSelection = this._getEquivalentSelection(artifact.selection);\n const altGr = this._getEquivalentGraceNote(altSelection, artifact.modifier);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleGraceNoteEnharmonic(altSelection, [altGr]);\n });\n }\n else {\n selections.forEach((selected) => {\n if (typeof (selected.selector.pitches) === 'undefined') {\n selected.selector.pitches = [];\n }\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleEnharmonic(selected);\n const altSel = this._getEquivalentSelection(selected);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleEnharmonic(altSel);\n });\n }\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Toggle cautionary/courtesy accidentals\n */\n toggleCourtesyAccidentals() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('toggle courtesy accidental');\n const grace = this.tracker.getSelectedGraceNotes();\n if (grace.length) {\n grace.forEach((artifact) => {\n const gn1 = [artifact.modifier];\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleGraceNoteCourtesy(artifact.selection, gn1);\n const altSel = this._getEquivalentSelection(artifact.selection);\n const gn2 = this._getEquivalentGraceNote(altSel, gn1[0]);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleGraceNoteCourtesy(altSel, [gn2]);\n });\n }\n else {\n selections.forEach((selection) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleCourtesyAccidental(selection);\n const altSel = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleCourtesyAccidental(altSel);\n });\n }\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * change the duration of notes for selected, creating more\n * or fewer notes.\n * After the change, reset the selection so it's as close as possible\n * to the original length\n * @param operation\n * @returns\n */\n batchDurationOperation(operation) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('change duration');\n const grace = this.tracker.getSelectedGraceNotes();\n const graceMap = {\n doubleDuration: 'doubleGraceNoteDuration',\n halveDuration: 'halveGraceNoteDuration'\n };\n if (grace.length && typeof (graceMap[operation]) !== 'undefined') {\n operation = graceMap[operation];\n grace.forEach((artifact) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation[operation](artifact.selection, artifact.modifier);\n const altSelection = this._getEquivalentSelection(artifact.selection);\n const gn2 = this._getEquivalentGraceNote(altSelection, artifact.modifier);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation[operation](altSelection, gn2);\n });\n }\n else {\n const altAr = this._getEquivalentSelections(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.batchSelectionOperation(this.score, selections, operation);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.batchSelectionOperation(this.storeScore, altAr, operation);\n }\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Toggle selected modifier on selected notes\n * @param modifier\n * @param ctor parent class constructor (e.g. SmoOrnament)\n * @returns\n */\n toggleArticulation(modifier, ctor) {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('toggle articulation');\n this.tracker.selections.forEach((sel) => {\n if (ctor === 'SmoArticulation') {\n const aa = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoArticulation({ articulation: modifier });\n const altAa = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoArticulation({ articulation: modifier });\n altAa.attrs.id = aa.attrs.id;\n if (sel.note) {\n sel.note.toggleArticulation(aa);\n }\n const altSelection = this._getEquivalentSelection(sel);\n if (altSelection && altSelection.note) {\n altSelection.note.toggleArticulation(altAa);\n }\n }\n else {\n const aa = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoOrnament({ ornament: modifier });\n const altAa = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoOrnament({ ornament: modifier });\n altAa.attrs.id = aa.attrs.id;\n const altSelection = this._getEquivalentSelection(sel);\n if (sel.note) {\n sel.note.toggleOrnament(aa);\n }\n if (altSelection && altSelection.note) {\n altSelection.note.toggleOrnament(altAa);\n }\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n setArticulation(modifier, set) {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('set articulation');\n this.tracker.selections.forEach((sel) => {\n const altAa = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoArticulation(modifier);\n if (sel.note) {\n sel.note.setArticulation(modifier, set);\n }\n const altSelection = this._getEquivalentSelection(sel);\n if (altSelection && altSelection.note) {\n altSelection.note.toggleArticulation(altAa);\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n setOrnament(modifier, set) {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('set articulation');\n this.tracker.selections.forEach((sel) => {\n const altAa = new _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_8__.SmoOrnament(modifier);\n if (sel.note) {\n sel.note.setOrnament(modifier, set);\n }\n const altSelection = this._getEquivalentSelection(sel);\n if (altSelection && altSelection.note) {\n altSelection.note.setOrnament(altAa, set);\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * convert non-tuplet not to a tuplet\n * @param params\n */\n makeTuplet(params) {\n return __awaiter(this, void 0, void 0, function* () {\n const selection = this.tracker.selections[0];\n const measureSelections = this.undoTrackerMeasureSelections('make tuplet');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.makeTuplet(selection, params);\n const altSelection = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.makeTuplet(altSelection, params);\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Convert selected tuplet to a single (if possible) non-tuplet\n */\n unmakeTuplet() {\n return __awaiter(this, void 0, void 0, function* () {\n const selection = this.tracker.selections[0];\n const measureSelections = this.undoTrackerMeasureSelections('unmake tuplet');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.unmakeTuplet(selection);\n const altSelection = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.unmakeTuplet(altSelection);\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Create a chord by adding an interval to selected note\n * @param interval 1/2 steps\n * @returns\n */\n setInterval(interval) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('set interval');\n selections.forEach((selected) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.interval(selected, interval);\n const altSelection = this._getEquivalentSelection(selected);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.interval(altSelection, interval);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * change the selected chord into a single note\n * @returns\n */\n collapseChord() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('collapse chord');\n selections.forEach((selected) => {\n const note = selected.note;\n if (note) {\n const pp = JSON.parse(JSON.stringify(note.pitches[0]));\n const altpp = JSON.parse(JSON.stringify(note.pitches[0]));\n // No operation for this?\n note.pitches = [pp];\n const altSelection = this._getEquivalentSelection(selected);\n altSelection.note.pitches = [altpp];\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Toggle chicken-scratches, for jazz improv, comping etc.\n */\n toggleSlash() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('make slash');\n selections.forEach((selection) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleSlash(selection);\n const altSel = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleSlash(altSel);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * make selected notes into a rest, or visa-versa\n * @returns\n */\n makeRest() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('make rest');\n selections.forEach((selection) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleRest(selection);\n const altSel = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleRest(altSel);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n clearAllBeams() {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('clearAllBeams');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.clearAllBeamGroups(this.score);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.clearAllBeamGroups(this.storeScore);\n yield this.awaitRender();\n });\n }\n clearSelectedBeams() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measures = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(selections);\n const altSelections = this._getEquivalentSelections(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.clearBeamGroups(this.score, selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.clearBeamGroups(this.storeScore, altSelections);\n this._renderChangedMeasures(measures);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * toggle the 'end beam' flag for selected notes\n * @returns\n */\n unbeamSelections() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('toggle beam group');\n selections.forEach((selection) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.unbeamSelections(selection);\n const altSel = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.unbeamSelections(altSel);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n toggleCue() {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('toggle note cue');\n this.tracker.selections.forEach((selection) => {\n const altSelection = this._getEquivalentSelection(selection);\n if (selection.note && selection.note.isRest() === false) {\n selection.note.isCue = !selection.note.isCue;\n if (altSelection && altSelection.note) {\n altSelection.note.isCue = selection.note.isCue;\n }\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * up or down\n * @returns\n */\n toggleBeamDirection() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n if (selections.length < 1) {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n const measureSelections = this.undoTrackerMeasureSelections('toggle beam direction');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleBeamDirection(selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.toggleBeamDirection(this._getEquivalentSelections(selections));\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Add the selected notes to a beam group\n */\n beamSelections() {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('beam selections');\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.beamSelections(this.score, selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.beamSelections(this.storeScore, this._getEquivalentSelections(selections));\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * change key signature for selected measures\n * @param keySignature vex key signature\n */\n addKeySignature(keySignature) {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('set key signature ' + keySignature);\n measureSelections.forEach((sel) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addKeySignature(this.score, sel, keySignature);\n const altSel = this._getEquivalentSelection(sel);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addKeySignature(this.storeScore, altSel, keySignature);\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Sets a pitch from the piano widget.\n * @param pitch {Pitch}\n * @param chordPedal {boolean} - indicates we are adding to a chord\n */\n setPitchPiano(pitch, chordPedal) {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = this.undoTrackerMeasureSelections('setAbsolutePitch ' + pitch.letter + '/' + pitch.accidental);\n this.tracker.selections.forEach((selected) => {\n const npitch = {\n letter: pitch.letter,\n accidental: pitch.accidental, octave: pitch.octave\n };\n const octave = _smo_data_measure__WEBPACK_IMPORTED_MODULE_4__.SmoMeasure.defaultPitchForClef[selected.measure.clef].octave;\n npitch.octave += octave;\n const altSel = this._getEquivalentSelection(selected);\n if (chordPedal && selected.note) {\n selected.note.toggleAddPitch(npitch);\n altSel.note.toggleAddPitch(npitch);\n }\n else {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setPitch(selected, [npitch]);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setPitch(altSel, [npitch]);\n }\n });\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * show or hide the piano widget\n * @param value to show it\n */\n showPiano(value) {\n return __awaiter(this, void 0, void 0, function* () {\n this.score.preferences.showPiano = value;\n this.storeScore.preferences.showPiano = value;\n if (value) {\n _piano__WEBPACK_IMPORTED_MODULE_20__.SuiPiano.showPiano();\n }\n else {\n _piano__WEBPACK_IMPORTED_MODULE_20__.SuiPiano.hidePiano();\n }\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Render a pitch for each letter name-pitch in the string,\n * @param pitches letter names for pitches\n * @returns promise, resolved when all pitches rendered\n * @see setPitch\n */\n setPitchesPromise(pitches) {\n return __awaiter(this, void 0, void 0, function* () {\n const self = this;\n const promise = new Promise((resolve) => {\n const fc = (index) => __awaiter(this, void 0, void 0, function* () {\n if (index >= pitches.length) {\n resolve();\n }\n else {\n yield self.setPitch(pitches[index]);\n fc(index + 1);\n }\n });\n fc(0);\n });\n yield promise;\n });\n }\n /**\n * Add a pitch to the score at the cursor. This tries to find the best pitch\n * to match the letter key (F vs F# for instance) based on key and surrounding notes\n * @param letter string\n */\n setPitch(letter) {\n return __awaiter(this, void 0, void 0, function* () {\n const selections = this.tracker.selections;\n const measureSelections = this.undoTrackerMeasureSelections('set pitch ' + letter);\n selections.forEach((selected) => {\n const selector = selected.selector;\n let hintSel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.lastNoteSelectionNonRest(this.score, selector.staff, selector.measure, selector.voice, selector.tick);\n if (!hintSel) {\n hintSel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.nextNoteSelectionNonRest(this.score, selector.staff, selector.measure, selector.voice, selector.tick);\n }\n // The selection no longer exists, possibly deleted\n if (hintSel === null || hintSel.note === null) {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n const pitch = _smo_data_music__WEBPACK_IMPORTED_MODULE_13__.SmoMusic.getLetterNotePitch(hintSel.note.pitches[0], letter, hintSel.measure.keySignature);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setPitch(selected, [pitch]);\n const altSel = this._getEquivalentSelection(selected);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setPitch(altSel, [pitch]);\n if (this.score.preferences.autoAdvance) {\n // Don't play the next note and the added pitch at the same time.\n this.tracker.deferNextAutoPlay();\n this.tracker.moveSelectionRight();\n }\n });\n if (selections.length === 1 && this.score.preferences.autoPlay) {\n _audio_oscillator__WEBPACK_IMPORTED_MODULE_14__.SuiOscillator.playSelectionNow(selections[0], this.score, 1);\n }\n this._renderChangedMeasures(measureSelections);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Generic clipboard copy action\n */\n copy() {\n return __awaiter(this, void 0, void 0, function* () {\n const altAr = [];\n this.tracker.selections.forEach((sel) => {\n const noteSelection = this._getEquivalentSelection(sel);\n if (noteSelection !== null) {\n altAr.push(noteSelection);\n }\n });\n this.storePaste.setSelections(this.storeScore, altAr);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * clipboard paste action\n * @returns\n */\n paste() {\n return __awaiter(this, void 0, void 0, function* () {\n // We undo the whole score on a paste, since we don't yet know the\n // extent of the overlap\n this.renderer.preserveScroll();\n const selections = this.getPasteMeasureList();\n const firstSelection = selections[0];\n const measureEnd = selections[selections.length - 1].selector.measure;\n const measureRange = [firstSelection.selector.measure, measureEnd];\n this.storeUndo.grouping = true;\n // Undo the paste by selecting all the affected measures\n for (let i = measureRange[0]; i <= measureRange[1]; ++i) {\n this._undoColumn('paste', i);\n this.renderer.unrenderColumn(this.score.staves[0].measures[i]);\n }\n this.storeUndo.grouping = false;\n const altSelection = this._getEquivalentSelection(firstSelection);\n const altTarget = altSelection.selector;\n altTarget.tick = this.tracker.selections[0].selector.tick;\n // paste the clipboard into the destination\n this.storePaste.pasteSelections(altTarget);\n // Refresh those measures.\n this.replaceMeasureView(measureRange);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Paste only the chords.\n */\n pasteChords() {\n return __awaiter(this, void 0, void 0, function* () {\n // We undo the whole score on a paste, since we don't yet know the\n // extent of the overlap\n this.renderer.preserveScroll();\n const selections = this.getPasteMeasureList();\n const firstSelection = selections[0];\n const measureEnd = selections[selections.length - 1].selector.measure;\n const measureRange = [firstSelection.selector.measure, measureEnd];\n this.storeUndo.grouping = true;\n // Undo the paste by selecting all the affected measures\n for (let i = measureRange[0]; i <= measureRange[1]; ++i) {\n this._undoColumn('paste', i);\n this.renderer.unrenderColumn(this.score.staves[0].measures[i]);\n }\n this.storeUndo.grouping = false;\n const altSelection = this._getEquivalentSelection(firstSelection);\n const altTarget = altSelection.selector;\n altTarget.tick = this.tracker.selections[0].selector.tick;\n this.storePaste.pasteChords(altTarget);\n // Refresh those measures.\n this.replaceMeasureView(measureRange);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * specify a note head other than the default for the duration\n * @param head\n */\n setNoteHead(head) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.modifyCurrentSelections('set note head', (score, selections) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setNoteHead(selections, head);\n });\n });\n }\n /**\n * Add a volta for selected measures\n */\n addEnding() {\n return __awaiter(this, void 0, void 0, function* () {\n // TODO: we should have undo for columns\n this._undoScore('Add Volta');\n const ft = this.tracker.getExtremeSelection(-1);\n const tt = this.tracker.getExtremeSelection(1);\n const params = _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoVolta.defaults;\n params.startBar = ft.selector.measure;\n params.endBar = tt.selector.measure;\n params.number = 1;\n const volta = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoVolta(params);\n const altVolta = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoVolta(params);\n this._renderChangedMeasures([ft, tt]);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addEnding(this.storeScore, altVolta);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addEnding(this.score, volta);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * @param ending volta settings\n * @returns\n */\n updateEnding(ending) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Change Volta');\n ending.elements.forEach((el) => {\n $(el).find('g.' + ending.attrs.id).remove();\n });\n ending.elements = [];\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeEnding(this.storeScore, ending);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeEnding(this.score, ending);\n const altVolta = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoVolta(ending);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addEnding(this.storeScore, altVolta);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addEnding(this.score, ending);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n *\n * @param ending volta to remove\n * @returns\n */\n removeEnding(ending) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Remove Volta');\n ending.elements.forEach((el) => {\n $(el).find('g.' + ending.attrs.id).remove();\n });\n ending.elements = [];\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeEnding(this.storeScore, ending);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeEnding(this.score, ending);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n *\n * @param position begin or end\n * @param barline barline type\n * @returns\n */\n setBarline(position, barline) {\n return __awaiter(this, void 0, void 0, function* () {\n const obj = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoBarline({ position, barline });\n const altObj = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoBarline({ position, barline });\n const selection = this.tracker.selections[0];\n this._undoColumn('set barline', selection.selector.measure);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureBarline(this.score, selection, obj);\n const altSel = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureBarline(this.storeScore, altSel, altObj);\n this._renderChangedMeasures([selection]);\n return this.renderer.updatePromise();\n });\n }\n /**\n *\n * @param position start or end\n * @param symbol coda, etc.\n */\n setRepeatSymbol(position, symbol) {\n return __awaiter(this, void 0, void 0, function* () {\n const params = _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRepeatSymbol.defaults;\n params.position = position;\n params.symbol = symbol;\n const obj = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRepeatSymbol(params);\n const altObj = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRepeatSymbol(params);\n const selection = this.tracker.selections[0];\n this._undoColumn('set repeat symbol', selection.selector.measure);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setRepeatSymbol(this.score, selection, obj);\n const altSel = this._getEquivalentSelection(selection);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setRepeatSymbol(this.storeScore, altSel, altObj);\n this._renderChangedMeasures([selection]);\n return this.renderer.updatePromise();\n });\n }\n /**\n * toggle rehearsal mark on first selected measure\n * @returns\n */\n toggleRehearsalMark() {\n return __awaiter(this, void 0, void 0, function* () {\n const selection = this.tracker.getExtremeSelection(-1);\n const altSelection = this._getEquivalentSelection(selection);\n const cmd = selection.measure.getRehearsalMark() ? 'removeRehearsalMark' : 'addRehearsalMark';\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation[cmd](this.score, selection, new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRehearsalMark(_smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRehearsalMark.defaults));\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation[cmd](this.storeScore, altSelection, new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRehearsalMark(_smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoRehearsalMark.defaults));\n this._renderChangedMeasures([selection]);\n return this.renderer.updatePromise();\n });\n }\n _removeStaffModifier(modifier) {\n this.score.staves[modifier.associatedStaff].removeStaffModifier(modifier);\n const altModifier = _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__.StaffModifierBase.deserialize(modifier.serialize());\n altModifier.attrs.id = modifier.attrs.id;\n altModifier.startSelector = this._getEquivalentSelector(altModifier.startSelector);\n altModifier.endSelector = this._getEquivalentSelector(altModifier.endSelector);\n this.storeScore.staves[this._getEquivalentStaff(modifier.associatedStaff)].removeStaffModifier(altModifier);\n }\n /**\n * Remove selected modifier\n * @param modifier slur, hairpin, etc.\n * @returns\n */\n removeStaffModifier(modifier) {\n return __awaiter(this, void 0, void 0, function* () {\n this.undoStaffModifier('Set measure proportion', modifier, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.REMOVE);\n this._removeStaffModifier(modifier);\n this._renderRectangle(modifier.startSelector, modifier.endSelector);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Change a staff modifier\n * @param original original version\n * @param modifier modified version\n * @returns\n */\n addOrUpdateStaffModifier(original, modifier) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!modifier) {\n if (original) {\n // Handle legacy API changed\n modifier = _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__.StaffModifierBase.deserialize(original);\n }\n else {\n console.warn('update modifier: bad modifier');\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n }\n const existing = this.score.staves[modifier.startSelector.staff]\n .getModifier(modifier);\n const subtype = existing === null ? _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.ADD :\n _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.UPDATE;\n this.undoStaffModifier('Set measure proportion', original, subtype);\n this._removeStaffModifier(modifier);\n const copy = _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__.StaffModifierBase.deserialize(modifier.serialize());\n copy.startSelector = this._getEquivalentSelector(copy.startSelector);\n copy.endSelector = this._getEquivalentSelector(copy.endSelector);\n const sel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, modifier.startSelector);\n if (sel !== null) {\n const altSel = this._getEquivalentSelection(sel);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addStaffModifier(sel, modifier);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addStaffModifier(altSel, copy);\n const modId = 'mod-' + sel.selector.staff + '-' + sel.selector.measure;\n const context = this.renderer.renderer.getRenderer(sel.measure.svg.logicalBox);\n if (context) {\n _svgHelpers__WEBPACK_IMPORTED_MODULE_21__.SvgHelpers.removeElementsByClass(context.svg, modId);\n }\n }\n this._renderRectangle(modifier.startSelector, modifier.endSelector);\n return this.renderer.updatePromise();\n });\n }\n lineOperation(op) {\n // if (this.tracker.selections.length < 2) {\n // return;\n // }\n const measureSelections = this.undoTrackerMeasureSelections('create staff modifier');\n const ft = this.tracker.getExtremeSelection(-1);\n const tt = this.tracker.getExtremeSelection(1);\n const ftAlt = this._getEquivalentSelection(ft);\n const ttAlt = this._getEquivalentSelection(tt);\n const modifier = op(ft, tt);\n const altModifier = op(ftAlt, ttAlt);\n altModifier.attrs.id = modifier.attrs.id;\n ft.staff.addStaffModifier(modifier);\n ftAlt === null || ftAlt === void 0 ? void 0 : ftAlt.staff.addStaffModifier(altModifier);\n this.undoStaffModifier('add ' + op, modifier, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.ADD);\n this._renderChangedMeasures(measureSelections);\n }\n /**\n * Add crescendo to selection\n */\n crescendo() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createCrescendo);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Add crescendo to selection\n */\n crescendoBracket() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createCrescendoBracket);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Add crescendo to selection\n */\n dimenuendo() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createDimenuendoBracket);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Add crescendo to selection\n */\n accelerando() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createAccelerandoBracket);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Add crescendo to selection\n */\n ritard() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createRitardBracket);\n return this.renderer.updatePromise();\n });\n }\n /**\n * diminuendo hairpin\n * @returns\n */\n decrescendo() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createDecrescendo);\n return this.renderer.updatePromise();\n });\n }\n removeTextBracket(bracket) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.removeStaffModifier(bracket);\n });\n }\n addOrReplaceStaffModifier(callback, modifier) {\n return __awaiter(this, void 0, void 0, function* () {\n const from1 = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, modifier.startSelector);\n const to1 = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, modifier.endSelector);\n if (from1 === null || to1 === null) {\n return;\n }\n const altFrom = this._getEquivalentSelection(from1);\n const altTo = this._getEquivalentSelection(to1);\n if (altFrom === null || altTo === null) {\n return;\n }\n callback(this.score, from1, to1);\n callback(this.storeScore, altFrom, altTo);\n const redraw = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasuresBetween(this.score, from1.selector, to1.selector);\n this.undoStaffModifier('add repl text bracket', modifier, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.ADD);\n this._renderChangedMeasures(redraw);\n return this.renderer.updatePromise();\n });\n }\n addOrReplaceTextBracket(modifier) {\n return __awaiter(this, void 0, void 0, function* () {\n const from1 = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, modifier.startSelector);\n const to1 = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.noteFromSelector(this.score, modifier.endSelector);\n if (from1 === null || to1 === null) {\n return;\n }\n const altFrom = this._getEquivalentSelection(from1);\n const altTo = this._getEquivalentSelection(to1);\n if (altFrom === null || altTo === null) {\n return;\n }\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addOrReplaceBracket(modifier, from1, to1);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addOrReplaceBracket(modifier, altFrom, altTo);\n const redraw = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasuresBetween(this.score, from1.selector, to1.selector);\n this.undoStaffModifier('add repl text bracket', modifier, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.ADD);\n this._renderChangedMeasures(redraw);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Slur selected notes\n * @returns\n */\n addSlur() {\n return __awaiter(this, void 0, void 0, function* () {\n const measureSelections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections);\n const ft = this.tracker.getExtremeSelection(-1);\n const tt = this.tracker.getExtremeSelection(1);\n const ftAlt = this._getEquivalentSelection(ft);\n const ttAlt = this._getEquivalentSelection(tt);\n const modifier = _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createSlur(this.score, ft, tt);\n ft.staff.addStaffModifier(modifier);\n // make sure score and backup have same ID for undo.\n const altModifier = _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createSlur(this.storeScore, ftAlt, ttAlt);\n altModifier.attrs.id = modifier.attrs.id;\n ftAlt === null || ftAlt === void 0 ? void 0 : ftAlt.staff.addStaffModifier(altModifier);\n this.undoStaffModifier('add slur', modifier, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_10__.UndoBuffer.bufferSubtypes.ADD);\n this._renderChangedMeasures(measureSelections);\n return this.renderer.updatePromise();\n });\n }\n /**\n * tie selected notes\n * @returns\n */\n tie() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lineOperation(_smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.createTie);\n return this.renderer.updatePromise();\n });\n }\n updateZoom(zoomFactor) {\n return __awaiter(this, void 0, void 0, function* () {\n const original = this.score.layoutManager.getGlobalLayout();\n original.zoomScale = zoomFactor;\n this.score.layoutManager.globalLayout.zoomScale = zoomFactor;\n this.renderer.pageMap.updateZoom(zoomFactor);\n this.renderer.pageMap.updateContainerOffset(this.scroller.scrollState);\n });\n }\n /**\n * set global page for score, zoom etc.\n * @param layout global SVG settings\n * @returns\n */\n setGlobalLayout(layout) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Set Global Layout');\n const original = this.score.layoutManager.getGlobalLayout().svgScale;\n this.score.layoutManager.updateGlobalLayout(layout);\n this.score.scaleTextGroups(original / layout.svgScale);\n this.storeScore.layoutManager.updateGlobalLayout(layout);\n this.renderer.rerenderAll();\n return this.renderer.preserveScroll();\n });\n }\n /**\n * Set the layout of a single page\n * @param layout page layout\n * @param pageIndex which page to change\n * @returns\n */\n setPageLayout(layout, pageIndex) {\n return __awaiter(this, void 0, void 0, function* () {\n this.score.layoutManager.updatePage(layout, pageIndex);\n this.storeScore.layoutManager.updatePage(layout, pageIndex);\n // If we are in part mode, save the page layout in the part so it is there next time\n // the part is exposed.\n if (this.isPartExposed()) {\n this.score.staves.forEach((staff, staffIx) => {\n staff.partInfo.layoutManager.updatePage(layout, pageIndex);\n const altStaff = this.storeScore.staves[this.staffMap[staffIx]];\n altStaff.partInfo.layoutManager.updatePage(layout, pageIndex);\n });\n }\n yield this.refreshViewport();\n });\n }\n setPageLayouts(layout, startIndex, endIndex) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Set Page Layout');\n let i = 0;\n for (i = startIndex; i <= endIndex; ++i) {\n this.setPageLayout(layout, i);\n }\n this.renderer.rerenderAll();\n return this.renderer.updatePromise();\n });\n }\n /**\n * Update the music font\n * @param family\n * @returns\n */\n setEngravingFontFamily(family) {\n return __awaiter(this, void 0, void 0, function* () {\n this.score.engravingFont = family;\n this.storeScore.engravingFont = family;\n this.renderer.notifyFontChange();\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * Upate global font used for chord changes\n * @param fontInfo\n * @returns\n */\n setChordFont(fontInfo) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Set Chord Font');\n this.score.setChordFont(fontInfo);\n this.storeScore.setChordFont(fontInfo);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * Update font used for lyrics\n * @param fontInfo\n * @returns\n */\n setLyricFont(fontInfo) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Set Lyric Font');\n this.score.setLyricFont(fontInfo);\n this.storeScore.setLyricFont(fontInfo);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * @param value if false, lyric widths don't affect measure width\n * @returns\n */\n setLyricAdjustWidth(value) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Set Lyric Adj Width');\n this.score.setLyricAdjustWidth(value);\n this.storeScore.setLyricAdjustWidth(value);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * delete selected measures\n * @returns\n */\n deleteMeasure() {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Delete Measure');\n if (this.storeScore.staves[0].measures.length < 2) {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections);\n // THe measures get renumbered, so keep the index at 0\n const index = selections[0].selector.measure;\n for (var i = 0; i < selections.length; ++i) {\n // Unrender the deleted measure\n this.score.staves.forEach((staff) => {\n this.tracker.clearMeasureMap(staff.measures[index]);\n this.renderer.unrenderMeasure(staff.measures[index]);\n this.renderer.unrenderMeasure(staff.measures[staff.measures.length - 1]);\n // A little hacky - delete the modifiers if they start or end on\n // the measure\n staff.renderableModifiers.forEach((modifier) => {\n if (modifier.startSelector.measure === index || modifier.endSelector.measure === index) {\n if (modifier.logicalBox) {\n const context = this.renderer.renderer.getRenderer(modifier.logicalBox);\n if (context) {\n $(context.svg).find('g.' + modifier.attrs.id).remove();\n }\n }\n }\n });\n });\n // Remove the SVG artifacts mapped to this measure.\n this.score.deleteMeasure(index);\n this.storeScore.deleteMeasure(index);\n // Note: index doesn't increment since there are now 1 fewer measures\n }\n ;\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * add number of measures, with default notes selections\n * @param append\n * @param numberToAdd\n * @returns\n */\n addMeasures(append, numberToAdd) {\n return __awaiter(this, void 0, void 0, function* () {\n let pos = 0;\n let ix = 0;\n this._undoScore('Add Measure');\n for (ix = 0; ix < numberToAdd; ++ix) {\n const measure = this.tracker.getFirstMeasureOfSelection();\n if (measure) {\n const nmeasure = _smo_data_measure__WEBPACK_IMPORTED_MODULE_4__.SmoMeasure.getDefaultMeasureWithNotes(measure);\n pos = measure.measureNumber.measureIndex;\n if (append) {\n pos += 1;\n }\n nmeasure.measureNumber.measureIndex = pos;\n nmeasure.setActiveVoice(0);\n this.score.addMeasure(pos);\n this.storeScore.addMeasure(pos);\n }\n }\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * add a single measure before or after selection\n * @param append\n * @returns\n */\n addMeasure(append) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Add Measure');\n let pos = 0;\n const measure = this.tracker.getFirstMeasureOfSelection();\n if (!measure) {\n return;\n }\n const nmeasure = _smo_data_measure__WEBPACK_IMPORTED_MODULE_4__.SmoMeasure.getDefaultMeasureWithNotes(measure);\n pos = measure.measureNumber.measureIndex;\n if (append) {\n pos += 1;\n }\n nmeasure.measureNumber.measureIndex = pos;\n nmeasure.setActiveVoice(0);\n this.score.addMeasure(pos);\n this.storeScore.addMeasure(pos);\n this.renderer.clearLine(measure);\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n /**\n * remove an entire line of music\n * @returns\n */\n removeStaff() {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Remove Instrument');\n if (this.storeScore.staves.length < 2 || this.score.staves.length < 2) {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_22__.PromiseHelpers.emptyPromise();\n }\n // if we are looking at a subset of the score,\n // revert to the full score view before removing the staff.\n const sel = this.tracker.selections[0];\n const scoreSel = this._getEquivalentSelection(sel);\n const staffIndex = scoreSel.selector.staff;\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeStaff(this.storeScore, staffIndex);\n this.viewAll();\n this.renderer.setRefresh();\n return this.renderer.updatePromise();\n });\n }\n addStaff(instrument) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('Add Instrument');\n // if we are looking at a subset of the score, we won't see the new staff. So\n // revert to the full view\n const staff = _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.addStaff(this.storeScore, instrument);\n const instKeys = Object.keys(staff.measureInstrumentMap);\n // update the key signatures for the new part\n instKeys.forEach((key) => {\n const numKey = parseInt(key, 10);\n const inst = staff.measureInstrumentMap[numKey];\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.innerSelections(this.storeScore, inst.startSelector, inst.endSelector);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.changeInstrument(inst, selections);\n });\n if (instrument.staffId > 0) {\n const selection = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.measureSelection(this.storeScore, instrument.staffId - 1, 0);\n const sel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelector.default;\n sel.staff = instrument.staffId - 1;\n if (selection) {\n let grp = this.storeScore.getSystemGroupForStaff(selection);\n if (grp) {\n grp.endSelector.staff = instrument.staffId;\n }\n else {\n let grp = new _smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoSystemGroup(_smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoSystemGroup.defaults);\n grp.startSelector.staff = instrument.staffId - 1;\n grp.endSelector.staff = instrument.staffId;\n this.storeScore.systemGroups.push(grp);\n }\n }\n }\n this.viewAll();\n return this.renderer.updatePromise();\n });\n }\n /**\n * Update part info assumes that the part is currently exposed - that\n * staff 0 is the first staff in the part prior to editing.\n * @param info\n */\n updatePartInfo(info) {\n return __awaiter(this, void 0, void 0, function* () {\n let i = 0;\n this._undoScore('Update part info');\n const storeStaff = this.staffMap[0] - info.stavesBefore;\n const partLength = info.stavesBefore + info.stavesAfter + 1;\n const resetView = !_smo_data_scoreModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoLayoutManager.areLayoutsEqual(info.layoutManager.getGlobalLayout(), this.score.layoutManager.getGlobalLayout());\n const restChange = this.score.staves[0].partInfo.expandMultimeasureRests != info.expandMultimeasureRests;\n const stavesChange = this.score.staves[0].partInfo.stavesAfter !== info.stavesAfter;\n for (i = 0; i < partLength; ++i) {\n const nStaffIndex = storeStaff + i;\n const nInfo = new _smo_data_partInfo__WEBPACK_IMPORTED_MODULE_3__.SmoPartInfo(info);\n nInfo.stavesBefore = i;\n nInfo.stavesAfter = partLength - i - 1;\n this.storeScore.staves[nStaffIndex].partInfo = nInfo;\n // If the staff index is currently displayed, \n const displayedIndex = this.staffMap.findIndex((x) => x === nStaffIndex);\n if (displayedIndex >= 0) {\n this.score.staves[displayedIndex].partInfo = new _smo_data_partInfo__WEBPACK_IMPORTED_MODULE_3__.SmoPartInfo(nInfo);\n this.score.layoutManager = nInfo.layoutManager;\n }\n }\n if (resetView || restChange || stavesChange) {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.computeMultipartRest(this.score);\n // this.resetPartView();\n this.renderer.rerenderAll();\n }\n return this.renderer.updatePromise();\n });\n }\n /**\n * A simpler API for applications to add a new staff to the score.\n * @param params - the instrument, which determines clef, etc.\n * @returns\n */\n addStaffSimple(params) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const instrumentParams = _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__.SmoInstrument.defaults;\n instrumentParams.startSelector.staff = instrumentParams.endSelector.staff = this.score.staves.length;\n instrumentParams.clef = (_a = params.clef) !== null && _a !== void 0 ? _a : instrumentParams.clef;\n const staffParams = _smo_data_systemStaff__WEBPACK_IMPORTED_MODULE_2__.SmoSystemStaff.defaults;\n staffParams.staffId = this.storeScore.staves.length; // add a staff\n staffParams.measureInstrumentMap[0] = new _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_19__.SmoInstrument(instrumentParams);\n this.addStaff(staffParams);\n return this.renderer.updatePromise();\n });\n }\n /**\n * Save the score to local storage.\n */\n quickSave() {\n const scoreStr = JSON.stringify(this.storeScore.serialize());\n localStorage.setItem(_common_serializationHelpers__WEBPACK_IMPORTED_MODULE_12__.smoSerialize.localScore, scoreStr);\n }\n updateRepeatCount(count) {\n const measureSelections = this.undoTrackerMeasureSelections('repeat bar');\n const symbol = count > 0 ? true : false;\n measureSelections.forEach((ms) => {\n const store = this._getEquivalentSelection(ms);\n ms.measure.repeatCount = count;\n ms.measure.repeatSymbol = symbol;\n if (store) {\n store.measure.repeatCount = count;\n store.measure.repeatSymbol = symbol;\n }\n });\n this._renderChangedMeasures(measureSelections);\n return this.updatePromise();\n }\n /**\n * Update the measure formatting parameters for the current selection\n * @param format generic measure formatting parameters\n * @returns\n */\n setMeasureFormat(format) {\n const label = 'set measure format';\n const fromSelector = this.tracker.getExtremeSelection(-1).selector;\n const toSelector = this.tracker.getExtremeSelection(1).selector;\n const measureSelections = this.tracker.getSelectedMeasures();\n // If the formatting is on a part, preserve it in the part's info\n const isPart = this.isPartExposed();\n measureSelections.forEach((m) => {\n this._undoColumn(label, m.selector.measure);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureFormat(this.score, m, format);\n if (isPart) {\n m.staff.partInfo.measureFormatting[m.measure.measureNumber.measureIndex] = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoMeasureFormat(format);\n }\n const alt = this._getEquivalentSelection(m);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureFormat(this.storeScore, alt, format);\n if (isPart) {\n alt.staff.partInfo.measureFormatting[m.measure.measureNumber.measureIndex] = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoMeasureFormat(format);\n }\n });\n this._renderRectangle(fromSelector, toSelector);\n return this.renderer.updatePromise();\n }\n /**\n * Remove system breaks from the measure formatting for selected measures\n * @returns\n */\n removeSystemBreaks() {\n const label = 'set measure format';\n const fromSelector = this.tracker.getExtremeSelection(-1).selector;\n const toSelector = this.tracker.getExtremeSelection(1).selector;\n const measureSelections = this.tracker.getSelectedMeasures();\n // If the formatting is on a part, preserve it in the part's info\n const isPart = this.isPartExposed();\n measureSelections.forEach((m) => {\n this._undoColumn(label, m.selector.measure);\n const format = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoMeasureFormat(m.measure.format);\n format.systemBreak = false;\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureFormat(this.score, m, format);\n if (isPart) {\n m.staff.partInfo.measureFormatting[m.measure.measureNumber.measureIndex] = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoMeasureFormat(format);\n }\n const alt = this._getEquivalentSelection(m);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureFormat(this.storeScore, alt, format);\n if (isPart) {\n alt.staff.partInfo.measureFormatting[m.measure.measureNumber.measureIndex] = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_9__.SmoMeasureFormat(format);\n }\n });\n this._renderRectangle(fromSelector, toSelector);\n return this.renderer.updatePromise();\n }\n renumberMeasures(measureIndex, localIndex) {\n this.score.updateRenumberingMap(measureIndex, localIndex);\n this.storeScore.updateRenumberingMap(measureIndex, localIndex);\n const mmsel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.measureSelection(this.score, 0, measureIndex);\n if (mmsel) {\n this._renderChangedMeasures([mmsel]);\n }\n return this.renderer.updatePromise();\n }\n /**\n * Play the music from the starting selection\n * @returns\n */\n playFromSelection() {\n var mm = this.tracker.getExtremeSelection(-1);\n if (_audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer.playingInstance && _audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer.playingInstance.paused) {\n _audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer.playingInstance.play();\n return;\n }\n if (_audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer.playing) {\n return;\n }\n new _audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer({ audioAnimation: this.audioAnimation, score: this.score, startIndex: mm.selector.measure, view: this }).play();\n }\n stopPlayer() {\n _audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer.stopPlayer();\n }\n pausePlayer() {\n _audio_player__WEBPACK_IMPORTED_MODULE_16__.SuiAudioPlayer.pausePlayer();\n }\n /**\n * Proxy calls to move the tracker parameters according to the\n * rules of the 'Home' key (depending on shift/ctrl/alt)\n * @param ev\n * @returns\n */\n moveHome(ev) {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveHome(ev);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Proxy calls to move the tracker parameters according to the\n * rules of the 'End' key (depending on shift/ctrl/alt)\n * @param ev\n * @returns\n */\n moveEnd(ev) {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveEnd(ev);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Grow the current selection by one to the left, if possible\n * @param ev\n * @returns\n */\n growSelectionLeft() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.growSelectionLeft();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Grow the current selection by one to the right, if possible\n * @param ev\n * @returns\n */\n growSelectionRight() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.growSelectionRight();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Select the next tabbable modifier near one of the selected notes\n * @param keyEv\n * @returns\n */\n advanceModifierSelection(keyEv) {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.advanceModifierSelection(keyEv);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Select the next entire measure, if possible\n * @returns\n */\n growSelectionRightMeasure() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.growSelectionRightMeasure();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Advance cursor forwards, if possible\n * @param ev\n * @returns\n */\n moveSelectionRight() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionRight();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Advance cursor backwards, if possible\n * @param ev\n * @returns\n */\n moveSelectionLeft() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionLeft();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Advance cursor back entire measure, if possible\n * @returns\n */\n moveSelectionLeftMeasure() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionLeftMeasure();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Advance cursor forward one measure, if possible\n * @returns\n */\n moveSelectionRightMeasure() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionRightMeasure();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Move cursor to a higher pitch in the current chord, with wrap\n * @returns\n */\n moveSelectionPitchUp() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionPitchUp();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Move cursor to a lower pitch in the current chord, with wrap\n */\n moveSelectionPitchDown() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionPitchDown();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Move cursor up a staff in the system, if possible\n * @returns\n */\n moveSelectionUp() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionUp();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Move cursor down a staff in the system, if possible\n * @returns\n */\n moveSelectionDown() {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.moveSelectionDown();\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Set the current suggestions (hover element) as the selection\n * @returns\n */\n selectSuggestion(evData) {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.selectSuggestion(evData);\n yield this.renderer.updatePromise();\n });\n }\n /**\n * Find an element at the given box, and make it the current selection\n * */\n intersectingArtifact(evData) {\n return __awaiter(this, void 0, void 0, function* () {\n this.tracker.intersectingArtifact(evData);\n yield this.renderer.updatePromise();\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcmVuZGVyL3N1aS9zY29yZVZpZXdPcGVyYXRpb25zLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlEQUF5RDtBQUN6RCx5Q0FBeUM7QUFDMkI7QUFDRDtBQUNlO0FBQzVCO0FBQ0Y7QUFFeUQ7QUFHbEM7QUFDbkI7QUFHTjtBQUUyQztBQUMzQztBQUdkO0FBRTZCO0FBRWpCO0FBQ0k7QUFDRDtBQUNGO0FBQ1E7QUFDYztBQUV3QztBQUM1RTtBQUNPO0FBQ21CO0FBTTdEOzs7Ozs7Ozs7OztHQVdHO0FBQ0ksTUFBTSxzQkFBdUIsU0FBUSxvREFBWTtJQUN0RDs7OztPQUlHO0lBQ0csWUFBWSxDQUFDLFNBQXVCOzs7WUFDeEMsTUFBTSxNQUFNLEdBQUcsNkRBQVksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN6RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0MsSUFBSSxRQUFRLEdBQUcsZUFBUyxDQUFDLFFBQVEsbUNBQUksK0RBQVcsQ0FBQyxPQUFPLENBQUM7WUFDekQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQy9DLE1BQU0sT0FBTyxHQUFHLGFBQWEsSUFBSSxRQUFRLENBQUMsa0JBQWtCO2dCQUMxRCxDQUFDLENBQUMsd0RBQVUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyx3REFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUM7WUFDakYsSUFBSSxPQUFPLEtBQUssd0RBQVUsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3JELFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxT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QyxNQUFNLENBQUMsQ0FBQztZQUN0QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEMsQ0FBQztLQUFBO0lBQ0Q7O1VBRU07SUFDQSxvQkFBb0IsQ0FBQyxNQUFjOztZQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0tBQUE7Q0FDRiIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy9yZW5kZXIvc3VpL3Njb3JlVmlld09wZXJhdGlvbnMudHM/Y2Y0NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuaW1wb3J0IHsgU3VpU2NvcmVWaWV3LCB1cGRhdGVTdGFmZk1vZGlmaWVyRnVuYyB9IGZyb20gJy4vc2NvcmVWaWV3JztcclxuaW1wb3J0IHsgU21vU2NvcmUsIGVuZ3JhdmluZ0ZvbnRUeXBlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc2NvcmUnO1xyXG5pbXBvcnQgeyBTbW9TeXN0ZW1TdGFmZlBhcmFtcywgU21vU3lzdGVtU3RhZmYgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zeXN0ZW1TdGFmZic7XHJcbmltcG9ydCB7IFNtb1BhcnRJbmZvIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvcGFydEluZm8nO1xyXG5pbXBvcnQgeyBTbW9NZWFzdXJlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZSc7XHJcbmltcG9ydCB7IFNtb05vdGUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9ub3RlJztcclxuaW1wb3J0IHsgS2V5RXZlbnQsIFN2Z0JveCwgUGl0Y2gsIFBpdGNoTGV0dGVyLCBSZW1vdmVFbGVtZW50TGlrZSwgRWxlbWVudExpa2UgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTbW9SZW5kZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgU21vU3lzdGVtR3JvdXAsIFNtb1BhZ2VMYXlvdXQsIFNtb0dsb2JhbExheW91dCwgU21vTGF5b3V0TWFuYWdlciwgU21vQXVkaW9QbGF5ZXJTZXR0aW5ncyxcclxuICBTbW9TY29yZVByZWZlcmVuY2VzLCBTbW9TY29yZUluZm8gfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zY29yZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb1RleHRHcm91cCB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3Njb3JlVGV4dCc7XHJcbmltcG9ydCB7IFNtb0R5bmFtaWNUZXh0LCBTbW9Ob3RlTW9kaWZpZXJCYXNlLCBTbW9HcmFjZU5vdGUsIFNtb0FydGljdWxhdGlvbiwgXHJcbiAgU21vT3JuYW1lbnQsIFNtb0x5cmljLCBTbW9NaWNyb3RvbmUsIFNtb0FycGVnZ2lvLCBTbW9BcnBlZ2dpb1R5cGUsIFNtb0NsZWZDaGFuZ2UsIFxyXG4gIFNtb1RhYk5vdGV9IGZyb20gJy4uLy4uL3Ntby9kYXRhL25vdGVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9UZW1wb1RleHQsIFNtb1ZvbHRhLCBTbW9CYXJsaW5lLCBTbW9SZXBlYXRTeW1ib2wsIFxyXG4gIFNtb1JlaGVhcnNhbE1hcmssIFNtb01lYXN1cmVGb3JtYXQsIFRpbWVTaWduYXR1cmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tZWFzdXJlTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgVW5kb0J1ZmZlciB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS91bmRvJztcclxuaW1wb3J0IHtcclxuICBTbW9PcGVyYXRpb24sIGNyZWF0ZVN0YWZmTW9kaWZpZXJUeXBlLCBNYWtlVHVwbGV0T3BlcmF0aW9uXHJcbn0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL29wZXJhdGlvbnMnO1xyXG5pbXBvcnQgeyBCYXRjaFNlbGVjdGlvbk9wZXJhdGlvbiB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9vcGVyYXRpb25zJztcclxuaW1wb3J0IHsgc21vU2VyaWFsaXplIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcmlhbGl6YXRpb25IZWxwZXJzJztcclxuaW1wb3J0IHsgRm9udEluZm8gfSBmcm9tICcuLi8uLi9jb21tb24vdmV4JztcclxuaW1wb3J0IHsgU21vTXVzaWMgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tdXNpYyc7XHJcbmltcG9ydCB7IFN1aU9zY2lsbGF0b3IgfSBmcm9tICcuLi9hdWRpby9vc2NpbGxhdG9yJztcclxuaW1wb3J0IHsgWG1sVG9TbW8gfSBmcm9tICcuLi8uLi9zbW8vbXhtbC94bWxUb1Ntbyc7XHJcbmltcG9ydCB7IFN1aUF1ZGlvUGxheWVyIH0gZnJvbSAnLi4vYXVkaW8vcGxheWVyJztcclxuaW1wb3J0IHsgU3VpWGhyTG9hZGVyIH0gZnJvbSAnLi4vLi4vdWkvZmlsZWlvL3hockxvYWRlcic7XHJcbmltcG9ydCB7IFNtb1NlbGVjdGlvbiwgU21vU2VsZWN0b3IgfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vc2VsZWN0aW9ucyc7XHJcbmltcG9ydCB7IFN0YWZmTW9kaWZpZXJCYXNlLCBcclxuICAgU21vSW5zdHJ1bWVudCwgU21vSW5zdHJ1bWVudFBhcmFtcywgU21vU3RhZmZUZXh0QnJhY2tldCwgU21vVGFiU3RhdmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zdGFmZk1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFN1aVBpYW5vIH0gZnJvbSAnLi9waWFubyc7XHJcbmltcG9ydCB7IFN2Z0hlbHBlcnMgfSBmcm9tICcuL3N2Z0hlbHBlcnMnO1xyXG5pbXBvcnQgeyBQcm9taXNlSGVscGVycyB9IGZyb20gJy4uLy4uL2NvbW1vbi9wcm9taXNlSGVscGVycyc7XHJcbmltcG9ydCB7IHBhcnNlSnNvblRleHQgfSBmcm9tICd0eXBlc2NyaXB0JztcclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5kZWNsYXJlIHZhciBTbW9Db25maWc6IFNtb1JlbmRlckNvbmZpZ3VyYXRpb247XHJcblxyXG5cclxuLyoqXHJcbiAqIE1WVk0tbGlrZSBvcGVyYXRpb25zIG9uIHRoZSBkaXNwbGF5ZWQgc2NvcmUuXHJcbiAqIFxyXG4gKiBBbGwgb3BlcmF0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gYSAnbGl2ZScgc2NvcmUgZ28gdGhyb3VnaCB0aGlzXHJcbiAqIG1vZHVsZS4gIEl0IG1hcHMgdGhlIHNjb3JlIHZpZXcgdG8gdGhlIGFjdHVhbCBzY29yZSBhbmQgbWFrZXMgc3VyZSB0aGVcclxuICogbW9kZWwgYW5kIHZpZXcgc3RheSBpbiBzeW5jLiAgXHJcbiAqIFxyXG4gKiBCZWNhdXNlIHRoaXMgb2JqZWN0IG9wZXJhdGVzIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbnMsIFxyXG4gKiBhbGwgb3BlcmF0aW9ucyByZXR1cm4gcHJvbWlzZSBzbyBhcHBsaWNhdGlvbnMgY2FuIHdhaXQgZm9yIHRoZSBcclxuICogb3BlcmF0aW9uIHRvIGNvbXBsZXRlIGFuZCB1cGRhdGUgdGhlIHNlbGVjdGlvbiBsaXN0LlxyXG4gKiBAY2F0ZWdvcnkgU3VpUmVuZGVyXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpU2NvcmVWaWV3T3BlcmF0aW9ucyBleHRlbmRzIFN1aVNjb3JlVmlldyB7XHJcbiAgLyoqXHJcbiAgICogQWRkIGEgbmV3IHRleHQgZ3JvdXAgdG8gdGhlIHNjb3JlIFxyXG4gICAqIEBwYXJhbSB0ZXh0R3JvdXAgYSBuZXcgdGV4dCBncm91cFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZFRleHRHcm91cCh0ZXh0R3JvdXA6IFNtb1RleHRHcm91cCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWx0TmV3ID0gU21vVGV4dEdyb3VwLmRlc2VyaWFsaXplUHJlc2VydmVJZCh0ZXh0R3JvdXAuc2VyaWFsaXplKCkpO1xyXG4gICAgY29uc3QgaXNQYXJ0RXhwb3NlZCA9IHRoaXMuaXNQYXJ0RXhwb3NlZCgpO1xyXG4gICAgbGV0IHNlbGVjdG9yID0gdGV4dEdyb3VwLnNlbGVjdG9yID8/IFNtb1NlbGVjdG9yLmRlZmF1bHQ7XHJcbiAgICBjb25zdCBwYXJ0SW5mbyA9IHRoaXMuc2NvcmUuc3RhdmVzWzBdLnBhcnRJbmZvO1xyXG4gICAgY29uc3QgYnVmVHlwZSA9IGlzUGFydEV4cG9zZWQgJiYgcGFydEluZm8ucHJlc2VydmVUZXh0R3JvdXBzXHJcbiAgICAgID8gVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5QQVJUX01PRElGSUVSIDogVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5TQ09SRV9NT0RJRklFUjtcclxuICAgIGlmIChidWZUeXBlID09PSBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlBBUlRfTU9ESUZJRVIpIHtcclxuICAgICAgc2VsZWN0b3Iuc3RhZmYgPSB0aGlzLnN0YWZmTWFwWzBdO1xyXG4gICAgfSAgXHJcbiAgICB0aGlzLnN0b3JlVW5kby5hZGRCdWZmZXIoJ3JlbW92ZSB0ZXh0IGdyb3VwJywgYnVmVHlwZSxcclxuICAgICAgc2VsZWN0b3IsIHRleHRHcm91cCwgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQpO1xyXG4gICAgaWYgKGlzUGFydEV4cG9zZWQgJiYgcGFydEluZm8ucHJlc2VydmVUZXh0R3JvdXBzKSB7XHJcbiAgICAgIHRoaXMuc2NvcmUuc3RhdmVzWzBdLnBhcnRJbmZvLnVwZGF0ZVRleHRHcm91cCh0ZXh0R3JvdXAsIHRydWUpO1xyXG4gICAgICBjb25zdCBwYXJ0SW5mbyA9IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbdGhpcy5fZ2V0RXF1aXZhbGVudFN0YWZmKDApXS5wYXJ0SW5mbztcclxuICAgICAgcGFydEluZm8udXBkYXRlVGV4dEdyb3VwKGFsdE5ldywgdHJ1ZSk7ICAgICAgXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNjb3JlLnVwZGF0ZVRleHRHcm91cCh0ZXh0R3JvdXAsIHRydWUpO1xyXG4gICAgICB0aGlzLnN0b3JlU2NvcmUudXBkYXRlVGV4dEdyb3VwKGFsdE5ldywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyVGV4dEdyb3VwcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHRoZSB0ZXh0IGdyb3VwIGZyb20gdGhlIHNjb3JlXHJcbiAgICogQHBhcmFtIHRleHRHcm91cCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVUZXh0R3JvdXAodGV4dEdyb3VwOiBTbW9UZXh0R3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzZWxlY3RvciA9IHRleHRHcm91cC5zZWxlY3RvciA/PyBTbW9TZWxlY3Rvci5kZWZhdWx0O1xyXG4gICAgY29uc3QgcGFydEluZm8gPSB0aGlzLnNjb3JlLnN0YXZlc1swXS5wYXJ0SW5mbztcclxuICAgIGNvbnN0IGlzUGFydEV4cG9zZWQgPSB0aGlzLmlzUGFydEV4cG9zZWQoKTtcclxuICAgIGNvbnN0IGJ1ZlR5cGUgPSBpc1BhcnRFeHBvc2VkICYmIHBhcnRJbmZvLnByZXNlcnZlVGV4dEdyb3VwcyBcclxuICAgICAgPyBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlBBUlRfTU9ESUZJRVIgOiBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlNDT1JFX01PRElGSUVSO1xyXG4gICAgbGV0IG9nVGV4dCA9IHRoaXMuc3RvcmVTY29yZS50ZXh0R3JvdXBzLmZpbmQoKHRnKSA9PiB0Zy5hdHRycy5pZCA9PT0gdGV4dEdyb3VwLmF0dHJzLmlkKTtcclxuICAgIGlmIChpc1BhcnRFeHBvc2VkICYmIHBhcnRJbmZvLnByZXNlcnZlVGV4dEdyb3Vwcykge1xyXG4gICAgICBvZ1RleHQgPSBwYXJ0SW5mby50ZXh0R3JvdXBzLmZpbmQoKHRnKSA9PiB0Zy5hdHRycy5pZCA9PT0gdGV4dEdyb3VwLmF0dHJzLmlkKTtcclxuICAgIH1cclxuICAgIGlmIChidWZUeXBlID09PSBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlBBUlRfTU9ESUZJRVIpIHtcclxuICAgICAgc2VsZWN0b3Iuc3RhZmYgPSB0aGlzLnN0YWZmTWFwWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0b3Iuc3RhZmYgPSB0aGlzLnN0YWZmTWFwW3NlbGVjdG9yLnN0YWZmXTtcclxuICAgIH1cclxuICAgIGlmICghb2dUZXh0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcigncmVtb3ZlIHRleHQgZ3JvdXAnLCBidWZUeXBlLFxyXG4gICAgICBzZWxlY3Rvciwgb2dUZXh0LCBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLlJFTU9WRSk7XHJcbiAgICBjb25zdCBhbHRHcm91cCA9IFNtb1RleHRHcm91cC5kZXNlcmlhbGl6ZVByZXNlcnZlSWQodGV4dEdyb3VwLnNlcmlhbGl6ZSgpKTtcclxuICAgIHRleHRHcm91cC5lbGVtZW50cy5mb3JFYWNoKChlbDogRWxlbWVudExpa2UpID0+IFJlbW92ZUVsZW1lbnRMaWtlKGVsKSk7XHJcbiAgICB0ZXh0R3JvdXAuZWxlbWVudHMgPSBbXTtcclxuICAgIGlmIChpc1BhcnRFeHBvc2VkICYmIHBhcnRJbmZvLnByZXNlcnZlVGV4dEdyb3Vwcykge1xyXG4gICAgICBwYXJ0SW5mby51cGRhdGVUZXh0R3JvdXAodGV4dEdyb3VwLCBmYWxzZSk7XHJcbiAgICAgIHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbdGhpcy5fZ2V0RXF1aXZhbGVudFN0YWZmKDApXS5wYXJ0SW5mby51cGRhdGVUZXh0R3JvdXAoYWx0R3JvdXAsIGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2NvcmUudXBkYXRlVGV4dEdyb3VwKHRleHRHcm91cCwgZmFsc2UpO1xyXG4gICAgICB0aGlzLnN0b3JlU2NvcmUudXBkYXRlVGV4dEdyb3VwKGFsdEdyb3VwLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyVGV4dEdyb3VwcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVVBkYXRlIGFuIGV4aXN0aW5nIHRleHQgZ3JvdXAuICBUaGUgb3JpZ2luYWwgaXMgcGFzc2VkIGluLCBiZWNhdXNlIHNpbmNlIFRHIG5vdCB0aWVkIHRvIGEgbXVzaWNhbFxyXG4gICAqIGVsZW1lbnQsIHdlIG5lZWQgdG8gZmluZCB0aGUgb25lIHdlJ3JlIHVwZGF0aW5nLlxyXG4gICAqIEBwYXJhbSBvbGRWZXJzaW9uIFxyXG4gICAqIEBwYXJhbSBuZXdWZXJzaW9uIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZVRleHRHcm91cChuZXdWZXJzaW9uOiBTbW9UZXh0R3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdG9yID0gbmV3VmVyc2lvbi5zZWxlY3RvciA/PyBTbW9TZWxlY3Rvci5kZWZhdWx0O1xyXG4gICAgY29uc3QgaXNQYXJ0RXhwb3NlZCA9IHRoaXMuaXNQYXJ0RXhwb3NlZCgpO1xyXG4gICAgY29uc3QgcGFydEluZm8gPSB0aGlzLnNjb3JlLnN0YXZlc1swXS5wYXJ0SW5mbztcclxuICAgIC8vIEJhY2sgdXAgdGhlIG9yaWdpbmFsIHNjb3JlIHRleHRcclxuICAgIGxldCBvZ3RnID0gdGhpcy5zdG9yZVNjb3JlLnRleHRHcm91cHMuZmluZCgodGcpID0+IHRnLmF0dHJzLmlkID09PSBuZXdWZXJzaW9uLmF0dHJzLmlkKTtcclxuICAgIGlmIChpc1BhcnRFeHBvc2VkICYmIHBhcnRJbmZvLnByZXNlcnZlVGV4dEdyb3Vwcykge1xyXG4gICAgICBvZ3RnID0gcGFydEluZm8udGV4dEdyb3Vwcy5maW5kKCh0ZykgPT4gdGcuYXR0cnMuaWQgPT09IG5ld1ZlcnNpb24uYXR0cnMuaWQpO1xyXG4gICAgfVxyXG4gICAgaWYgKCFvZ3RnKSB7XHJcbiAgICAgIC8vIHRoZXJlIGlzIG5vdGhpbmcgdG8gdXBkYXRlLCByZXR1cm4uXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChvZ3RnKSB7XHJcbiAgICAgIGNvbnN0IGJ1ZlR5cGUgPSBpc1BhcnRFeHBvc2VkICYmIHBhcnRJbmZvLnByZXNlcnZlVGV4dEdyb3VwcyBcclxuICAgICAgICA/IFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuUEFSVF9NT0RJRklFUiA6IFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuU0NPUkVfTU9ESUZJRVI7XHJcbiAgICAgIC8vIGlmIHRoaXMgaXMgcGFydCB0ZXh0LCBtYWtlIHN1cmUgdGhlIHVuZG8gYnVmZmVyIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFydCBzdGF2ZVxyXG4gICAgICAvLyBpbiB0aGUgZnVsbCBzY29yZSwgc28gdW5kbyB3b3JrcyBwcm9wZXJseVxyXG4gICAgICBpZiAoYnVmVHlwZSA9PT0gVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5QQVJUX01PRElGSUVSKSB7XHJcbiAgICAgICAgc2VsZWN0b3Iuc3RhZmYgPSB0aGlzLnN0YWZmTWFwWzBdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdG9yLnN0YWZmID0gdGhpcy5zdGFmZk1hcFtzZWxlY3Rvci5zdGFmZl07XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKCdtb2RpZnkgdGV4dCcsXHJcbiAgICAgICAgYnVmVHlwZSwgc2VsZWN0b3IsIG9ndGcsIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuVVBEQVRFKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGFsdE5ldyA9IFNtb1RleHRHcm91cC5kZXNlcmlhbGl6ZVByZXNlcnZlSWQobmV3VmVyc2lvbi5zZXJpYWxpemUoKSk7XHJcbiAgICB0aGlzLnNjb3JlLnVwZGF0ZVRleHRHcm91cChuZXdWZXJzaW9uLCB0cnVlKTtcclxuICAgIC8vIElmIHRoaXMgaXMgcGFydCB0ZXh0LCBkb24ndCBzdG9yZSBpdCBpbiB0aGUgc2NvcmUgdGV4dCwgZXhjZXB0IGZvciB0aGUgZGlzcGxheWVkIHNjb3JlXHJcbiAgICBpZiAoIWlzUGFydEV4cG9zZWQpIHtcclxuICAgICAgdGhpcy5zdG9yZVNjb3JlLnVwZGF0ZVRleHRHcm91cChhbHROZXcsIHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1t0aGlzLl9nZXRFcXVpdmFsZW50U3RhZmYoMCldLnBhcnRJbmZvLnVwZGF0ZVRleHRHcm91cChhbHROZXcsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgLy8gVE9ETzogb25seSByZW5kZXIgdGhlIG9uZSBURy5cclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIucmVyZW5kZXJUZXh0R3JvdXBzKCk7XHJcbiAgICAvLyByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGxvYWQgYW4gbXhtbCBzY29yZSByZW1vdGVseSwgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IFxyXG4gICAqIGNvbXBsZXRlcyB3aGVuIHRoZSBmaWxlIGlzIGxvYWRlZFxyXG4gICAqIEBwYXJhbSB1cmwgd2hlcmUgdG8gZmluZCB0aGUgeG1sIGZpbGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBsb2FkUmVtb3RlWG1sKHVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IHJlcSA9IG5ldyBTdWlYaHJMb2FkZXIodXJsKTtcclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgLy8gU2hvdWxkbid0IHdlIHJldHVybiBwcm9taXNlIG9mIGFjdHVhbGx5IGRpc3BsYXlpbmcgdGhlIHNjb3JlP1xyXG4gICAgYXdhaXQgcmVxLmxvYWRBc3luYygpO1xyXG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgY29uc3QgeG1sID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXEudmFsdWUsICd0ZXh0L3htbCcpO1xyXG4gICAgY29uc3Qgc2NvcmUgPSBYbWxUb1Ntby5jb252ZXJ0KHhtbCk7XHJcbiAgICBzY29yZS5sYXlvdXRNYW5hZ2VyIS56b29tVG9XaWR0aCgkKCdib2R5Jykud2lkdGgoKSk7XHJcbiAgICBhd2FpdCBzZWxmLmNoYW5nZVNjb3JlKHNjb3JlKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogbG9hZCBhIHJlbW90ZSBzY29yZSBpbiBTTU8gZm9ybWF0XHJcbiAgICogQHBhcmFtIHVybCB1cmwgdG8gZmluZCB0aGUgc2NvcmVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBsb2FkUmVtb3RlSnNvbih1cmw6IHN0cmluZykgOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgcmVxID0gbmV3IFN1aVhockxvYWRlcih1cmwpO1xyXG4gICAgYXdhaXQgcmVxLmxvYWRBc3luYygpO1xyXG4gICAgY29uc3Qgc2NvcmUgPSBTbW9TY29yZS5kZXNlcmlhbGl6ZShyZXEudmFsdWUpO1xyXG4gICAgYXdhaXQgdGhpcy5jaGFuZ2VTY29yZShzY29yZSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIExvYWQgYSByZW1vdGUgc2NvcmUsIHJldHVybiBwcm9taXNlIHdoZW4gaXQncyBiZWVuIGxvYWRlZFxyXG4gICAqIGZyb20gYWZhci5cclxuICAgKiBAcGFyYW0gcHJlZiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBsb2FkUmVtb3RlU2NvcmUodXJsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKHVybC5lbmRzV2l0aCgneG1sJykgfHwgdXJsLmVuZHNXaXRoKCdteGwnKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5sb2FkUmVtb3RlWG1sKHVybCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5sb2FkUmVtb3RlSnNvbih1cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuICBhc3luYyB1cGRhdGVBdWRpb1NldHRpbmdzKHByZWY6IFNtb0F1ZGlvUGxheWVyU2V0dGluZ3MpIHtcclxuICAgIHRoaXMuX3VuZG9TY29yZVByZWZlcmVuY2VzKCdVcGRhdGUgcHJlZmVyZW5jZXMnKTtcclxuICAgIHRoaXMuc2NvcmUuYXVkaW9TZXR0aW5ncyA9IHByZWY7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuYXVkaW9TZXR0aW5ncyA9IG5ldyBTbW9BdWRpb1BsYXllclNldHRpbmdzKHByZWYpO1xyXG4gICAgLy8gTm8gcmVuZGVyaW5nIHRvIGJlIGRvbmVcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2xvYmFsIHNldHRpbmdzIHRoYXQgY29udHJvbCBob3cgdGhlIHNjb3JlIGVkaXRvciBiZWhhdmVzXHJcbiAgICogQHBhcmFtIHByZWYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlU2NvcmVQcmVmZXJlbmNlcyhwcmVmOiBTbW9TY29yZVByZWZlcmVuY2VzKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmVQcmVmZXJlbmNlcygnVXBkYXRlIHByZWZlcmVuY2VzJyk7XHJcbiAgICBjb25zdCBvbGRYcG9zZSA9IHRoaXMuc2NvcmUucHJlZmVyZW5jZXMudHJhbnNwb3NpbmdTY29yZTtcclxuICAgIGNvbnN0IGN1clhwb3NlID0gcHJlZi50cmFuc3Bvc2luZ1Njb3JlO1xyXG4gICAgdGhpcy5zY29yZS51cGRhdGVTY29yZVByZWZlcmVuY2VzKG5ldyBTbW9TY29yZVByZWZlcmVuY2VzKHByZWYpKTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS51cGRhdGVTY29yZVByZWZlcmVuY2VzKG5ldyBTbW9TY29yZVByZWZlcmVuY2VzKHByZWYpKTtcclxuICAgIGlmIChjdXJYcG9zZSA9PT0gZmFsc2UgJiYgb2xkWHBvc2UgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5zY29yZS5zZXROb25UcmFuc3Bvc2luZygpO1xyXG4gICAgfSBlbHNlIGlmIChjdXJYcG9zZSA9PT0gdHJ1ZSAmJiBvbGRYcG9zZSA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5zY29yZS5zZXRUcmFuc3Bvc2luZygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXREaXJ0eSgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjb3JlLCBjb21wb3NlciBldGMuXHJcbiAgICogQHBhcmFtIHNjb3JlSW5mbyBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVTY29yZUluZm8oc2NvcmVJbmZvOiBTbW9TY29yZUluZm8pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZVByZWZlcmVuY2VzKCdVcGRhdGUgcHJlZmVyZW5jZXMnKTtcclxuICAgIHRoaXMuc2NvcmUuc2NvcmVJbmZvID0gc2NvcmVJbmZvO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnNjb3JlSW5mbyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc2NvcmVJbmZvKSk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKClcclxuICB9XHJcbiAgYXN5bmMgYWRkUmVtb3ZlQXJwZWdnaW8oY29kZTogU21vQXJwZWdnaW9UeXBlKSB7XHJcbiAgICBhd2FpdCB0aGlzLm1vZGlmeUN1cnJlbnRTZWxlY3Rpb25zKCdhZGQvcmVtb3ZlIGFkZFJlbW92ZUFycGVnZ2lvJyxcclxuICAgICAgKHNjb3JlLCBzZWxlY3Rpb25zKSA9PiB7XHJcbiAgICAgICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgICAgIGlmIChzZWwubm90ZSkge1xyXG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgICAgc2VsLm5vdGUuYXJwZWdnaW8gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgc2VsLm5vdGUuYXJwZWdnaW8gPSBuZXcgU21vQXJwZWdnaW8oeyB0eXBlOiBjb2RlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgY2xlZiBjaGFuZ2UgbWlkLW1lYXN1cmUgKGNsZWZOb3RlKVxyXG4gICAqIEBwYXJhbSBjbGVmIFxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZFJlbW92ZUNsZWZDaGFuZ2UoY2xlZjogU21vQ2xlZkNoYW5nZSkge1xyXG4gICAgYXdhaXQgdGhpcy5tb2RpZnlDdXJyZW50U2VsZWN0aW9ucygnYWRkL3JlbW92ZSBhZGRSZW1vdmVDbGVmQ2hhbmdlJyxcclxuICAgICAgKHNjb3JlLCBzZWxlY3Rpb25zKSA9PiB7XHJcbiAgICAgICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG1lYXN1cmVDbGVmID0gc2VsLm1lYXN1cmUuY2xlZjtcclxuICAgICAgICAgIGlmIChzZWwubm90ZSkge1xyXG4gICAgICAgICAgICBpZiAobWVhc3VyZUNsZWYgPT09IGNsZWYuY2xlZikge1xyXG4gICAgICAgICAgICAgIHNlbC5ub3RlLmNsZWZOb3RlID0gbnVsbDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBzZWwubm90ZS5jbGVmTm90ZSA9IGNsZWY7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTsgICBcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTW9kaWZ5IHRoZSBkeW5hbWljcyBhc3NvaWNhdGVkIHdpdGggdGhlIHNwZWNpZmljIHNlbGVjdGlvblxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb24gXHJcbiAgICogQHBhcmFtIGR5bmFtaWMgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkRHluYW1pYyhzZWxlY3Rpb246IFNtb1NlbGVjdGlvbiwgZHluYW1pYzogU21vRHluYW1pY1RleHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMubW9kaWZ5U2VsZWN0aW9uKCdhZGQgZHluYW1pYycsIHNlbGVjdGlvbiwgKHNjb3JlLCBzZWxlY3Rpb25zKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5hZGREeW5hbWljKHNlbGVjdGlvbnNbMF0sIGR5bmFtaWMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBkeW5hbWljcyBmcm9tIHRoZSBzZWxlY3Rpb24gXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbiBcclxuICAgKiBAcGFyYW0gZHluYW1pYyBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBfcmVtb3ZlRHluYW1pYyhzZWxlY3Rpb246IFNtb1NlbGVjdGlvbiwgZHluYW1pYzogU21vRHluYW1pY1RleHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGVxdWl2ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgaWYgKGVxdWl2ICE9PSBudWxsICYmIGVxdWl2Lm5vdGUgIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgYWx0TW9kaWZpZXJzID0gZXF1aXYubm90ZS5nZXRNb2RpZmllcnMoJ1Ntb0R5bmFtaWNUZXh0Jyk7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5yZW1vdmVEeW5hbWljKHNlbGVjdGlvbiwgZHluYW1pYyk7XHJcbiAgICAgIGlmIChhbHRNb2RpZmllcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnJlbW92ZUR5bmFtaWMoZXF1aXYsIGFsdE1vZGlmaWVyc1swXSBhcyBTbW9EeW5hbWljVGV4dCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZW1vdmUgZHluYW1pY3MgZnJvbSB0aGUgY3VycmVudCBzZWxlY3Rpb25cclxuICAgKiBAcGFyYW0gZHluYW1pY1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZUR5bmFtaWMoZHluYW1pYzogU21vRHluYW1pY1RleHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbCA9IHRoaXMudHJhY2tlci5tb2RpZmllclNlbGVjdGlvbnNbMF07XHJcbiAgICBpZiAoIXNlbC5zZWxlY3Rpb24pIHtcclxuICAgICAgcmV0dXJuIFByb21pc2VIZWxwZXJzLmVtcHR5UHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdGlvbnMgPSBbc2VsLnNlbGVjdGlvbl07XHJcbiAgICB0aGlzLl91bmRvRmlyc3RNZWFzdXJlU2VsZWN0aW9uKCdyZW1vdmUgZHluYW1pYycpO1xyXG4gICAgdGhpcy5fcmVtb3ZlRHluYW1pYyhzZWwuc2VsZWN0aW9uLCBkeW5hbWljKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUoc2VsLnNlbGVjdGlvbik7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKVxyXG4gIH1cclxuICAvKipcclxuICAgKiB3ZSBuZXZlciByZWFsbHkgZGVsZXRlIGEgbm90ZSwgYnV0IHdlIHdpbGwgY29udmVydCBpdCBpbnRvIGEgcmVzdCBhbmQgaWYgaXQnc1xyXG4gICAqIGFscmVhZHkgYSByZXN0IHdlIHdpbGwgdHJ5IHRvIGhpZGUgaXQuXHJcbiAgICogT3BlcmF0ZXMgb24gY3VycmVudCBzZWxlY3Rpb25zXHJcbiAgICogKi9cclxuICBhc3luYyBkZWxldGVOb3RlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ2RlbGV0ZSBub3RlJyk7XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgaWYgKHNlbC5ub3RlKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuXHJcbiAgICAgICAgLy8gc2V0IHRoZSBwaXRjaCB0byBiZSBhIGdvb2QgcG9zaXRpb24gZm9yIHRoZSByZXN0XHJcbiAgICAgICAgY29uc3QgcGl0Y2ggPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgU21vTWVhc3VyZS5kZWZhdWx0UGl0Y2hGb3JDbGVmW3NlbC5tZWFzdXJlLmNsZWZdKSk7XHJcbiAgICAgICAgY29uc3QgYWx0UGl0Y2ggPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgU21vTWVhc3VyZS5kZWZhdWx0UGl0Y2hGb3JDbGVmW2FsdFNlbCEubWVhc3VyZS5jbGVmXSkpO1xyXG4gICAgICAgIHNlbC5ub3RlLnBpdGNoZXMgPSBbcGl0Y2hdO1xyXG4gICAgICAgIGFsdFNlbCEubm90ZSEucGl0Y2hlcyA9IFthbHRQaXRjaF07XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBub3RlIGlzIGEgbm90ZSwgbWFrZSBpdCBpbnRvIGEgcmVzdC4gIElmIHRoZSBub3RlIGlzIGEgcmVzdCBhbHJlYWR5LFxyXG4gICAgICAgIC8vIG1ha2UgaXQgaW52aXNpYmxlLiAgSWYgaXQgaXMgaW52aXNpYmxlIGFscmVhZHksIG1ha2UgaXQgYmFjayBpbnRvIGEgcmVzdC5cclxuICAgICAgICBpZiAoc2VsLm5vdGUuaXNSZXN0KCkgJiYgIXNlbC5ub3RlLmlzSGlkZGVuKCkpIHtcclxuICAgICAgICAgIHNlbC5ub3RlLm1ha2VIaWRkZW4odHJ1ZSk7XHJcbiAgICAgICAgICBhbHRTZWwhLm5vdGUhLm1ha2VIaWRkZW4odHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNlbC5ub3RlLmNsZWFyQXJ0aWN1bGF0aW9ucygpO1xyXG4gICAgICAgICAgc2VsLm5vdGUubWFrZVJlc3QoKTtcclxuICAgICAgICAgIGFsdFNlbCEubm90ZSEubWFrZVJlc3QoKTtcclxuICAgICAgICAgIGFsdFNlbCEubm90ZSEuY2xlYXJBcnRpY3VsYXRpb25zKCk7XHJcbiAgICAgICAgICBzZWwubm90ZS5tYWtlSGlkZGVuKGZhbHNlKTtcclxuICAgICAgICAgIGFsdFNlbCEubm90ZSEubWFrZUhpZGRlbihmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKVxyXG4gIH1cclxuICAvKipcclxuICAqIFRoZSBseXJpYyBlZGl0b3IgbW92ZXMgYXJvdW5kLCBzbyB3ZSBjYW4ndCBkZXBlbmQgb24gdGhlIHRyYWNrZXIgZm9yIHRoZVxyXG4gICogY29ycmVjdCBzZWxlY3Rpb24uICBXZSBnZXQgaXQgZGlyZWN0bHkgZnJvbSB0aGUgZWRpdG9yLlxyXG4gICogXHJcbiAgKiBAcGFyYW0gc2VsZWN0b3IgLSB0aGUgc2VsZWN0b3Igb2YgdGhlIG5vdGUgd2l0aCB0aGUgbHlyaWMgdG8gcmVtb3ZlXHJcbiAgKiBAcGFyYW0gbHlyaWMgLSBhIGNvcHkgb2YgdGhlIGx5cmljIHRvIHJlbW92ZS4gIFdlIHVzZSB0aGUgdmVyc2UsIHBhcnNlciB0byBpZGVudGlmeSBpdFxyXG4gICogQHJldHVybnMgcmVuZGVyIHByb21pc2VcclxuICAqL1xyXG4gIGFzeW5jIHJlbW92ZUx5cmljKHNlbGVjdG9yOiBTbW9TZWxlY3RvciwgbHlyaWM6IFNtb0x5cmljKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBTbW9TZWxlY3Rpb24ubm90ZUZyb21TZWxlY3Rvcih0aGlzLnNjb3JlLCBzZWxlY3Rvcik7XHJcbiAgICBpZiAoc2VsZWN0aW9uID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlSGVscGVycy5lbXB0eVByb21pc2UoKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3VuZG9TZWxlY3Rpb24oJ3JlbW92ZSBseXJpYycsIHNlbGVjdGlvbik7XHJcbiAgICBzZWxlY3Rpb24ubm90ZSEucmVtb3ZlTHlyaWMobHlyaWMpO1xyXG4gICAgY29uc3QgZXF1aXYgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICBjb25zdCBzdG9yZUx5cmljID0gZXF1aXYhLm5vdGUhLmdldEx5cmljRm9yVmVyc2UobHlyaWMudmVyc2UsIGx5cmljLnBhcnNlcik7XHJcbiAgICBpZiAodHlwZW9mIChzdG9yZUx5cmljKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgZXF1aXYhLm5vdGUhLnJlbW92ZUx5cmljKGx5cmljKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUoc2VsZWN0aW9uKTtcclxuICAgIGx5cmljLmRlbGV0ZWQgPSB0cnVlO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0gc2VsZWN0b3Igd2hlcmUgdG8gYWRkIG9yIHVwZGF0ZSB0aGUgbHlyaWNcclxuICAgKiBAcGFyYW0gbHlyaWMgYSBjb3B5IG9mIHRoZSBseXJpYyB0byByZW1vdmVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBhZGRPclVwZGF0ZUx5cmljKHNlbGVjdG9yOiBTbW9TZWxlY3RvciwgbHlyaWM6IFNtb0x5cmljKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBTbW9TZWxlY3Rpb24ubm90ZUZyb21TZWxlY3Rvcih0aGlzLnNjb3JlLCBzZWxlY3Rvcik7XHJcbiAgICBpZiAoc2VsZWN0aW9uID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3VuZG9TZWxlY3Rpb24oJ3VwZGF0ZSBseXJpYycsIHNlbGVjdGlvbik7XHJcbiAgICBzZWxlY3Rpb24ubm90ZSEuYWRkTHlyaWMobHlyaWMpO1xyXG4gICAgY29uc3QgZXF1aXYgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICBjb25zdCBhbHRMeXJpYyA9IFNtb05vdGVNb2RpZmllckJhc2UuZGVzZXJpYWxpemUobHlyaWMuc2VyaWFsaXplKCkgYXMgYW55KSBhcyBTbW9MeXJpYztcclxuICAgIGVxdWl2IS5ub3RlIS5hZGRMeXJpYyhhbHRMeXJpYyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZFRvUmVwbGFjZVF1ZXVlKHNlbGVjdGlvbik7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBhbGwgdGhlIG5vdGVzIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZvaWNlXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgZGVwb3B1bGF0ZVZvaWNlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ2RlcG9wdWxhdGUgdm9pY2UnKTtcclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBpeCA9IHNlbGVjdGlvbi5tZWFzdXJlLmdldEFjdGl2ZVZvaWNlKCk7XHJcbiAgICAgIGlmIChpeCAhPT0gMCkge1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi5kZXBvcHVsYXRlVm9pY2Uoc2VsZWN0aW9uLCBpeCk7XHJcbiAgICAgICAgY29uc3QgZXF1aXYgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLmRlcG9wdWxhdGVWb2ljZShlcXVpdiEsIGl4KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBTbW9PcGVyYXRpb24uc2V0QWN0aXZlVm9pY2UodGhpcy5zY29yZSwgMCk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSB0aGUgYWN0aXZlIHZvaWNlIGluIGEgbXVsdGktdm9pY2UgbWVhc3VyZS5cclxuICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgX2NoYW5nZUFjdGl2ZVZvaWNlKGluZGV4OiBudW1iZXIpOiBTbW9TZWxlY3Rpb25bXSB7XHJcbiAgICBjb25zdCBtZWFzdXJlc1RvQWRkOiBTbW9TZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpO1xyXG4gICAgbWVhc3VyZVNlbGVjdGlvbnMuZm9yRWFjaCgobWVhc3VyZVNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBpZiAoaW5kZXggPT09IG1lYXN1cmVTZWxlY3Rpb24ubWVhc3VyZS52b2ljZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgbWVhc3VyZXNUb0FkZC5wdXNoKG1lYXN1cmVTZWxlY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBtZWFzdXJlc1RvQWRkO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQb3B1bGF0ZSBhIG5ldyB2b2ljZSB3aXRoIGRlZmF1bHQgbm90ZXNcclxuICAgKiBAcGFyYW0gaW5kZXggdGhlIHZvaWNlIHRvIHBvcHVsYXRlXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgcG9wdWxhdGVWb2ljZShpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtZWFzdXJlc1RvQWRkID0gdGhpcy5fY2hhbmdlQWN0aXZlVm9pY2UoaW5kZXgpO1xyXG4gICAgaWYgKG1lYXN1cmVzVG9BZGQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5zZXRBY3RpdmVWb2ljZSh0aGlzLnNjb3JlLCBpbmRleCk7XHJcbiAgICAgIHRoaXMudHJhY2tlci5zZWxlY3RBY3RpdmVWb2ljZSgpO1xyXG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICBtZWFzdXJlc1RvQWRkLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICB0aGlzLl91bmRvU2VsZWN0aW9uKCdwb3B1YWx0ZVZvaWNlJywgc2VsZWN0aW9uKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnBvcHVsYXRlVm9pY2Uoc2VsZWN0aW9uLCBpbmRleCk7XHJcbiAgICAgIGNvbnN0IGVxdWl2ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICBTbW9PcGVyYXRpb24ucG9wdWxhdGVWb2ljZShlcXVpdiEsIGluZGV4KTtcclxuICAgIH0pO1xyXG4gICAgU21vT3BlcmF0aW9uLnNldEFjdGl2ZVZvaWNlKHRoaXMuc2NvcmUsIGluZGV4KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlc1RvQWRkKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdEFjdGl2ZVZvaWNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHN3YXBWb2ljZXModm9pY2UxOiBudW1iZXIsIHZvaWNlMjogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkTWVhc3VyZXMoKTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi5zd2FwVm9pY2Uoc2VsZWN0aW9ucywgdm9pY2UxLCB2b2ljZTIpO1xyXG4gICAgU21vT3BlcmF0aW9uLnN3YXBWb2ljZShhbHRTZWxlY3Rpb25zLCB2b2ljZTEsIHZvaWNlMik7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMoc2VsZWN0aW9ucyk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFzc2lnbiBhbiBpbnN0cnVtZW50IHRvIGEgc2V0IG9mIG1lYXN1cmVzXHJcbiAgICogQHBhcmFtIGluc3RydW1lbnQgdGhlIGluc3RydW1lbnQgdG8gYXNzaWduIHRvIHRoZSBzZWxlY3Rpb25zXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbnMgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgY2hhbmdlSW5zdHJ1bWVudChpbnN0cnVtZW50OiBTbW9JbnN0cnVtZW50LCBzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHR5cGVvZiAoc2VsZWN0aW9ucykgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIH1cclxuICAgIHRoaXMuX3VuZG9TZWxlY3Rpb25zKCdjaGFuZ2UgaW5zdHJ1bWVudCcsIHNlbGVjdGlvbnMpO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9ucyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLmNoYW5nZUluc3RydW1lbnQoaW5zdHJ1bWVudCwgc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24uY2hhbmdlSW5zdHJ1bWVudChpbnN0cnVtZW50LCBhbHRTZWxlY3Rpb25zKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhzZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHRpbWUgc2lnbmF0dXJlIGZvciBhIHNlbGVjdGlvblxyXG4gICAqIEBwYXJhbSB0aW1lU2lnbmF0dXJlIGFjdHVhbCB0aW1lIHNpZ25hdHVyZVxyXG4gICAqL1xyXG4gIGFzeW5jIHNldFRpbWVTaWduYXR1cmUodGltZVNpZ25hdHVyZTogVGltZVNpZ25hdHVyZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdTZXQgdGltZSBzaWduYXR1cmUnKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi5zZXRUaW1lU2lnbmF0dXJlKHRoaXMuc2NvcmUsIHNlbGVjdGlvbnMsIHRpbWVTaWduYXR1cmUpO1xyXG4gICAgU21vT3BlcmF0aW9uLnNldFRpbWVTaWduYXR1cmUodGhpcy5zdG9yZVNjb3JlLCBhbHRTZWxlY3Rpb25zLCB0aW1lU2lnbmF0dXJlKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTW92ZSBzZWxlY3RlZCBzdGFmZiB1cCBvciBkb3duIGluIHRoZSBzY29yZS5cclxuICAgKiBAcGFyYW0gaW5kZXggZGlyZWN0aW9uIHRvIG1vdmVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU3RhZmZVcERvd24oaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdyZS1vcmRlciBzdGF2ZXMnKTtcclxuICAgIC8vIEdldCBzdGFmZiB0byBtb3ZlXHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdKTtcclxuICAgIC8vIE1ha2UgdGhlIG1vdmUgaW4gdGhlIG1vZGVsLCBhbmQgcmVzZXQgdGhlIHZpZXcgc28gd2UgY2FuIHNlZSB0aGUgbmV3XHJcbiAgICAvLyBhcnJhbmdlbWVudFxyXG4gICAgU21vT3BlcmF0aW9uLm1vdmVTdGFmZlVwRG93bih0aGlzLnN0b3JlU2NvcmUsIHNlbGVjdGlvbiEsIGluZGV4KTtcclxuICAgIHRoaXMudmlld0FsbCgpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgc3RhZmYgZ3JvdXAgZm9yIGEgc2NvcmUsIHdoaWNoIGRldGVybWluZXMgaG93IHRoZSBzdGF2ZXNcclxuICAgKiBhcmUganVzdGlmaWVkIGFuZCBicmFja2V0ZWRcclxuICAgKiBAcGFyYW0gc3RhZmZHcm91cCBcclxuICAgKi9cclxuICBhc3luYyBhZGRPclVwZGF0ZVN0YWZmR3JvdXAoc3RhZmZHcm91cDogU21vU3lzdGVtR3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnZ3JvdXAgc3RhdmVzJyk7XHJcbiAgICAvLyBBc3N1bWUgdGhhdCB0aGUgdmlldyBpcyBub3cgc2V0IHRvIGZ1bGwgc2NvcmVcclxuICAgIHRoaXMuc2NvcmUuYWRkT3JSZXBsYWNlU3lzdGVtR3JvdXAoc3RhZmZHcm91cCk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuYWRkT3JSZXBsYWNlU3lzdGVtR3JvdXAoc3RhZmZHcm91cCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldERpcnR5KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgdXBkYXRlVGFiU3RhdmUodGFiU3RhdmU6IFNtb1RhYlN0YXZlKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVzQmV0d2Vlbih0aGlzLnNjb3JlLCB0YWJTdGF2ZS5zdGFydFNlbGVjdG9yLCB0YWJTdGF2ZS5lbmRTZWxlY3Rvcik7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb25zID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICBpZiAoc2VsZWN0aW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdW5kb1NlbGVjdGlvbnMoJ3VwZGF0ZVRhYlN0YXZlJywgc2VsZWN0aW9ucyk7XHJcbiAgICBjb25zdCBzdGFmZjogbnVtYmVyID0gc2VsZWN0aW9uc1swXS5zZWxlY3Rvci5zdGFmZjtcclxuICAgIGNvbnN0IGFsdFN0YWZmID0gYWx0U2VsZWN0aW9uc1swXS5zZWxlY3Rvci5zdGFmZjtcclxuICAgIGNvbnN0IGFsdFRhYlN0YXZlID0gbmV3IFNtb1RhYlN0YXZlKHRhYlN0YXZlLnNlcmlhbGl6ZSgpKTtcclxuICAgIGFsdFRhYlN0YXZlLnN0YXJ0U2VsZWN0b3Iuc3RhZmYgPSBhbHRTdGFmZjtcclxuICAgIGFsdFRhYlN0YXZlLmVuZFNlbGVjdG9yLnN0YWZmID0gYWx0U3RhZmY7XHJcbiAgICBhbHRUYWJTdGF2ZS5hdHRycy5pZCA9IHRhYlN0YXZlLmF0dHJzLmlkO1xyXG4gICAgdGhpcy5zY29yZS5zdGF2ZXNbc3RhZmZdLnVwZGF0ZVRhYlN0YXZlKHRhYlN0YXZlKTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbYWx0U3RhZmZdLnVwZGF0ZVRhYlN0YXZlKGFsdFRhYlN0YXZlKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyByZW1vdmVUYWJTdGF2ZSgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIGlmIChzZWxlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl91bmRvU2VsZWN0aW9ucygndXBkYXRlVGFiU3RhdmUnLCBzZWxlY3Rpb25zKTtcclxuICAgIGNvbnN0IHN0YXZlc1RvUmVtb3ZlOiBTbW9UYWJTdGF2ZVtdID0gW107XHJcbiAgICBjb25zdCBhbHRTdGF2ZXNUb1JlbW92ZTogU21vVGFiU3RhdmVbXSA9IFtdO1xyXG4gICAgY29uc3QgYWRkZWQ6IFJlY29yZDxzdHJpbmcsIFNtb1RhYlN0YXZlPiA9IHt9O1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwsIGl4KSA9PiB7XHJcbiAgICAgIGNvbnN0IGFsdFNlbCA9IGFsdFNlbGVjdGlvbnNbaXhdO1xyXG4gICAgICBjb25zdCB0YWJTdGF2ZSA9IHNlbC5zdGFmZi5nZXRUYWJTdGF2ZUZvck1lYXN1cmUoc2VsLnNlbGVjdG9yKTtcclxuICAgICAgY29uc3QgYWx0VGFiU3RhdmUgPSBhbHRTZWwuc3RhZmYuZ2V0VGFiU3RhdmVGb3JNZWFzdXJlKGFsdFNlbC5zZWxlY3Rvcik7XHJcbiAgICAgIGlmICh0YWJTdGF2ZSAmJiBhbHRUYWJTdGF2ZSkge1xyXG4gICAgICAgIGlmICghYWRkZWRbdGFiU3RhdmUuYXR0cnMuaWRdKSB7XHJcbiAgICAgICAgICBhZGRlZFt0YWJTdGF2ZS5hdHRycy5pZF0gPSB0YWJTdGF2ZTtcclxuICAgICAgICAgIHN0YXZlc1RvUmVtb3ZlLnB1c2godGFiU3RhdmUpO1xyXG4gICAgICAgICAgYWx0U3RhdmVzVG9SZW1vdmUucHVzaChhbHRUYWJTdGF2ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHNlbGVjdGlvbnNbMF0uc3RhZmYucmVtb3ZlVGFiU3RhdmVzKHN0YXZlc1RvUmVtb3ZlKTtcclxuICAgIGFsdFNlbGVjdGlvbnNbMF0uc3RhZmYucmVtb3ZlVGFiU3RhdmVzKGFsdFN0YXZlc1RvUmVtb3ZlKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGVtcG8gZm9yIGFsbCBvciBwYXJ0IG9mIHRoZSBzY29yZVxyXG4gICAqIEBwYXJhbSBtZWFzdXJlIHRoZSBtZWFzdXJlIHdpdGggdGhlIHRlbXBvLiAgVGVtcG8gaXMgbWVhc3VyZS13aWRlIHBhcmFtZXRlclxyXG4gICAqIEBwYXJhbSBzY29yZU1vZGUgaWYgdHJ1ZSwgdXBkYXRlIHdob2xlIHNjb3JlLiAgRWxzZSBzZWxlY3Rpb25zXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlVGVtcG9TY29yZShtZWFzdXJlOiBTbW9NZWFzdXJlLCB0ZW1wbzogU21vVGVtcG9UZXh0LCBzY29yZU1vZGU6IGJvb2xlYW4sIHNlbGVjdGlvbk1vZGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtZWFzdXJlSW5kZXggPSAwOyAgICBcclxuICAgIGNvbnN0IG9yaWdpbmFsVGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KG1lYXN1cmUudGVtcG8pO1xyXG4gICAgdGhpcy5fdW5kb0NvbHVtbigndXBkYXRlIHRlbXBvJywgbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCk7XHJcbiAgICBsZXQgc3RhcnRNZWFzdXJlID0gbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleDtcclxuICAgIGxldCBlbmRNZWFzdXJlID0gdGhpcy5zY29yZS5zdGF2ZXNbMF0ubWVhc3VyZXMubGVuZ3RoO1xyXG4gICAgbGV0IGRpc3BsYXllZCA9IGZhbHNlO1xyXG4gICAgaWYgKHNlbGVjdGlvbk1vZGUpIHtcclxuICAgICAgY29uc3QgZW5kU2VsID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oMSk7XHJcbiAgICAgIGlmIChlbmRTZWwuc2VsZWN0b3IubWVhc3VyZSA+IHN0YXJ0TWVhc3VyZSkge1xyXG4gICAgICAgIGVuZE1lYXN1cmUgPSBlbmRTZWwuc2VsZWN0b3IubWVhc3VyZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gSWYgd2UgYXJlIG9ubHkgY2hhbmdpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSB0ZXh0LCBpdCBvbmx5IGFmZmVjdHMgdGhlIHRlbXBvIG1lYXN1cmUuXHJcbiAgICBpZiAoU21vVGVtcG9UZXh0LmVxKG9yaWdpbmFsVGVtcG8sIHRlbXBvKSAmJiB0ZW1wby55T2Zmc2V0ICE9PSBvcmlnaW5hbFRlbXBvLnlPZmZzZXQgJiYgZW5kTWVhc3VyZSA+IHN0YXJ0TWVhc3VyZSkge1xyXG4gICAgICBlbmRNZWFzdXJlID0gc3RhcnRNZWFzdXJlICsgMTsgICAgICAgICAgXHJcbiAgICB9XHJcbiAgICBmb3IgKG1lYXN1cmVJbmRleCA9IHN0YXJ0TWVhc3VyZTsgbWVhc3VyZUluZGV4IDwgZW5kTWVhc3VyZTsgKyttZWFzdXJlSW5kZXgpIHtcclxuICAgICAgaWYgKCFzY29yZU1vZGUgJiYgIXNlbGVjdGlvbk1vZGUpIHtcclxuICAgICAgICAvLyBJZiBub3Qgd2hvbGUgc2NvcmUgb3Igc2VsZWN0aW9ucywgY2hhbmdlIHVudGlsIHRoZSB0ZW1wbyBkb2Vzbid0IG1hdGNoIHByZXZpb3VzIG1lYXN1cmUncyB0ZW1wbyAobmV4dCB0ZW1wbyBjaGFuZ2UpXHJcbiAgICAgICAgY29uc3QgY29tcE1lYXN1cmUgPSB0aGlzLnNjb3JlLnN0YXZlc1swXS5tZWFzdXJlc1ttZWFzdXJlSW5kZXhdO1xyXG4gICAgICAgIGlmIChTbW9UZW1wb1RleHQuZXEob3JpZ2luYWxUZW1wbywgY29tcE1lYXN1cmUudGVtcG8pIHx8IGRpc3BsYXllZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgIGNvbnN0IHNlbCA9IFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc2NvcmUsIDAsIG1lYXN1cmVJbmRleCk7XHJcbiAgICAgICAgICBjb25zdCBhbHRTZWwgPSBTbW9TZWxlY3Rpb24ubWVhc3VyZVNlbGVjdGlvbih0aGlzLnN0b3JlU2NvcmUsIDAsIG1lYXN1cmVJbmRleCk7XHJcbiAgICAgICAgICBpZiAoc2VsICYmIHNlbC5tZWFzdXJlLnRlbXBvLmRpc3BsYXkgJiYgIWRpc3BsYXllZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZFRvUmVwbGFjZVF1ZXVlKHNlbCk7XHJcbiAgICAgICAgICAgIGRpc3BsYXllZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICAgIFNtb09wZXJhdGlvbi5hZGRUZW1wbyh0aGlzLnNjb3JlLCBzZWwsIHRlbXBvKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChhbHRTZWwpIHtcclxuICAgICAgICAgICAgU21vT3BlcmF0aW9uLmFkZFRlbXBvKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsLCB0ZW1wbyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBzZWwgPSBTbW9TZWxlY3Rpb24ubWVhc3VyZVNlbGVjdGlvbih0aGlzLnNjb3JlLCAwLCBtZWFzdXJlSW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbCA9IFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc3RvcmVTY29yZSwgMCwgbWVhc3VyZUluZGV4KTtcclxuICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICBTbW9PcGVyYXRpb24uYWRkVGVtcG8odGhpcy5zY29yZSwgc2VsLCB0ZW1wbyk7XHJcbiAgICAgICAgICBpZiAoIWRpc3BsYXllZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZFRvUmVwbGFjZVF1ZXVlKHNlbCk7XHJcbiAgICAgICAgICAgIGRpc3BsYXllZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhbHRTZWwpIHtcclxuICAgICAgICAgIFNtb09wZXJhdGlvbi5hZGRUZW1wbyh0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbCwgdGVtcG8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHVwZGF0ZVRhYk5vdGUodGFiTm90ZTogU21vVGFiTm90ZSkge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlc0JldHdlZW4odGhpcy5zY29yZSwgXHJcbiAgICAgIHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKS5zZWxlY3RvciwgdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oMSkuc2VsZWN0b3IpO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9ucyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpO1xyXG4gICAgdGhpcy5fdW5kb1NlbGVjdGlvbnMoJ3VwZGF0ZVRhYk5vdGUnLCBzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi51cGRhdGVUYWJOb3RlKHNlbGVjdGlvbnMsIHRhYk5vdGUpO1xyXG4gICAgU21vT3BlcmF0aW9uLnVwZGF0ZVRhYk5vdGUoYWx0U2VsZWN0aW9ucywgdGFiTm90ZSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZFRvUmVwbGFjZVF1ZXVlKHNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHJlbW92ZVRhYk5vdGUoKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVzQmV0d2Vlbih0aGlzLnNjb3JlLCBcclxuICAgICAgdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpLnNlbGVjdG9yLCB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKS5zZWxlY3Rvcik7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb25zID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICB0aGlzLl91bmRvU2VsZWN0aW9ucygndXBkYXRlVGFiTm90ZScsIHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLnJlbW92ZVRhYk5vdGUoc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24ucmVtb3ZlVGFiTm90ZShhbHRTZWxlY3Rpb25zKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUoc2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogJ3JlbW92ZScgdGVtcG8sIHdoaWNoIG1lYW5zIGVpdGhlciBzZXR0aW5nIHRoZSBiYXJzIHRvIHRoZSBcclxuICAgKiBkZWZhdWx0IHRlbXBvLCBvciB0aGUgcHJldmlvdXNseS1zZXQgdGVtcG8uXHJcbiAgICogQHBhcmFtIHNjb3JlTW9kZSB3aGV0aGVyIHRvIHJlc2V0IGVudGlyZSBzY29yZVxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZVRlbXBvKG1lYXN1cmU6IFNtb01lYXN1cmUsIHRlbXBvOiBTbW9UZW1wb1RleHQsIHNjb3JlTW9kZTogYm9vbGVhbiwgc2VsZWN0aW9uTW9kZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc3RhcnRTZWxlY3Rpb24gPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1swXTtcclxuICAgIGlmIChzdGFydFNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlID4gMCkge1xyXG4gICAgICBjb25zdCBtZWFzdXJlSXggPSBzdGFydFNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlIC0gMTtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gc3RhcnRTZWxlY3Rpb24uc3RhZmYubWVhc3VyZXNbbWVhc3VyZUl4XTtcclxuICAgICAgY29uc3QgdGVtcG8gPSB0YXJnZXQuZ2V0VGVtcG8oKTtcclxuICAgICAgY29uc3QgbmV3VGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KHRlbXBvKTtcclxuICAgICAgbmV3VGVtcG8uZGlzcGxheSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRlbXBvU2NvcmUobWVhc3VyZSwgbmV3VGVtcG8sIHNjb3JlTW9kZSwgc2VsZWN0aW9uTW9kZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVwZGF0ZVRlbXBvU2NvcmUobWVhc3VyZSwgbmV3IFNtb1RlbXBvVGV4dChTbW9UZW1wb1RleHQuZGVmYXVsdHMpLCBzY29yZU1vZGUsIHNlbGVjdGlvbk1vZGUpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCBhIGdyYWNlIG5vdGUgdG8gdGhlIHNlbGVjdGVkIHJlYWwgbm90ZXMuXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkR3JhY2VOb3RlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ2FkZCBncmFjZSBub3RlJyk7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbi5ub3RlIS5nZXRHcmFjZU5vdGVzKCkubGVuZ3RoO1xyXG4gICAgICBjb25zdCBwaXRjaGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWxlY3Rpb24ubm90ZSEucGl0Y2hlcykpO1xyXG4gICAgICBjb25zdCBncmFjZSA9IG5ldyBTbW9HcmFjZU5vdGUoe1xyXG4gICAgICAgIHBpdGNoZXMsIHRpY2tzOlxyXG4gICAgICAgICAgeyBudW1lcmF0b3I6IDIwNDgsIGRlbm9taW5hdG9yOiAxLCByZW1haW5kZXI6IDAgfVxyXG4gICAgICB9KTtcclxuICAgICAgU21vT3BlcmF0aW9uLmFkZEdyYWNlTm90ZShzZWxlY3Rpb24sIGdyYWNlLCBpbmRleCk7XHJcblxyXG4gICAgICBjb25zdCBhbHRQaXRjaGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWxlY3Rpb24ubm90ZSEucGl0Y2hlcykpO1xyXG4gICAgICBjb25zdCBhbHRHcmFjZSA9IG5ldyBTbW9HcmFjZU5vdGUoe1xyXG4gICAgICAgIHBpdGNoZXM6IGFsdFBpdGNoZXMsIHRpY2tzOlxyXG4gICAgICAgICAgeyBudW1lcmF0b3I6IDIwNDgsIGRlbm9taW5hdG9yOiAxLCByZW1haW5kZXI6IDAgfVxyXG4gICAgICB9KTtcclxuICAgICAgYWx0R3JhY2UuYXR0cnMuaWQgPSBncmFjZS5hdHRycy5pZDtcclxuICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICBTbW9PcGVyYXRpb24uYWRkR3JhY2VOb3RlKGFsdFNlbGVjdGlvbiEsIGFsdEdyYWNlLCBpbmRleCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHJlbW92ZSBzZWxlY3RlZCBncmFjZSBub3RlXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVHcmFjZU5vdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygncmVtb3ZlIGdyYWNlIG5vdGUnKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIC8vIFRPRE86IGdldCB0aGUgY29ycmVjdCBvZmZzZXRcclxuICAgICAgU21vT3BlcmF0aW9uLnJlbW92ZUdyYWNlTm90ZShzZWxlY3Rpb24sIDApO1xyXG4gICAgICBjb25zdCBhbHRTZWwgPSAodGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnJlbW92ZUdyYWNlTm90ZShhbHRTZWwhLCAwKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBUb2dnbGUgc2xhc2ggaW4gc3RlbSBvZiBncmFjZSBub3RlXHJcbiAgICovXHJcbiAgYXN5bmMgc2xhc2hHcmFjZU5vdGVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZ3JhY2UgPSB0aGlzLnRyYWNrZXIuZ2V0U2VsZWN0ZWRHcmFjZU5vdGVzKCk7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnc2xhc2ggZ3JhY2Ugbm90ZSB0b2dnbGUnKTtcclxuICAgIGdyYWNlLmZvckVhY2goKGduKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5zbGFzaEdyYWNlTm90ZXMoZ24pO1xyXG4gICAgICBpZiAoZ24uc2VsZWN0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihnbi5zZWxlY3Rpb24pO1xyXG4gICAgICAgIGNvbnN0IGFsdEduID0gdGhpcy5fZ2V0RXF1aXZhbGVudEdyYWNlTm90ZShhbHRTZWxlY3Rpb24hLCBnbi5tb2RpZmllciBhcyBTbW9HcmFjZU5vdGUpO1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi5zbGFzaEdyYWNlTm90ZXMoe1xyXG4gICAgICAgICAgc2VsZWN0aW9uOiBhbHRTZWxlY3Rpb24sIG1vZGlmaWVyOiBhbHRHbiBhcyBhbnksXHJcbiAgICAgICAgICBib3g6IFN2Z0JveC5kZWZhdWx0LCBpbmRleDogMFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgdHJhbnNwb3NlU2NvcmUob2Zmc2V0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgndHJhbnNwb3NlIHNjb3JlJyk7XHJcbiAgICBTbW9PcGVyYXRpb24udHJhbnNwb3NlU2NvcmUodGhpcy5zY29yZSwgb2Zmc2V0KTtcclxuICAgIFNtb09wZXJhdGlvbi50cmFuc3Bvc2VTY29yZSh0aGlzLnN0b3JlU2NvcmUsIG9mZnNldCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyQWxsKCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdHJhbnNwb3NlIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHBhcmFtIG9mZnNldCAxLzIgc3RlcHNcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB0cmFuc3Bvc2VTZWxlY3Rpb25zKG9mZnNldDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygndHJhbnNwb3NlJyk7XHJcbiAgICBjb25zdCBncmFjZSA9IHRoaXMudHJhY2tlci5nZXRTZWxlY3RlZEdyYWNlTm90ZXMoKTtcclxuICAgIGlmIChncmFjZS5sZW5ndGgpIHtcclxuICAgICAgZ3JhY2UuZm9yRWFjaCgoYXJ0aWZhY3QpID0+IHtcclxuICAgICAgICBpZiAoYXJ0aWZhY3Quc2VsZWN0aW9uICE9PSBudWxsICYmIGFydGlmYWN0LnNlbGVjdGlvbi5ub3RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBjb25zdCBnbjEgPSBhcnRpZmFjdC5tb2RpZmllciBhcyBTbW9HcmFjZU5vdGU7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGFydGlmYWN0LnNlbGVjdGlvbi5ub3RlLmdyYWNlTm90ZXMuZmluZEluZGV4KCh4KSA9PiB4LmF0dHJzLmlkID09PSBnbjEuYXR0cnMuaWQpO1xyXG4gICAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihhcnRpZmFjdC5zZWxlY3Rpb24pO1xyXG4gICAgICAgICAgaWYgKGFsdFNlbGVjdGlvbiAmJiBhbHRTZWxlY3Rpb24ubm90ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBnbjIgPSBhbHRTZWxlY3Rpb24ubm90ZS5ncmFjZU5vdGVzW2luZGV4XTtcclxuICAgICAgICAgICAgU21vT3BlcmF0aW9uLnRyYW5zcG9zZUdyYWNlTm90ZXMoYWx0U2VsZWN0aW9uISwgW2duMl0sIG9mZnNldCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBTbW9PcGVyYXRpb24udHJhbnNwb3NlR3JhY2VOb3RlcyhhcnRpZmFjdC5zZWxlY3Rpb24sIFtnbjFdLCBvZmZzZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3RlZCkgPT4ge1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi50cmFuc3Bvc2Uoc2VsZWN0ZWQsIG9mZnNldCk7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3RlZCk7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRyYW5zcG9zZShhbHRTZWwhLCBvZmZzZXQpO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKHNlbGVjdGlvbnMubGVuZ3RoID09PSAxICYmIHRoaXMuc2NvcmUucHJlZmVyZW5jZXMuYXV0b1BsYXkpIHtcclxuICAgICAgICBTdWlPc2NpbGxhdG9yLnBsYXlTZWxlY3Rpb25Ob3coc2VsZWN0aW9uc1swXSwgdGhpcy5zY29yZSwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdG9nZ2xlIHRoZSBhY2NpZGVudGFsIHNwZWxsaW5nIG9mIHRoZSBzZWxlY3RlZCBub3Rlc1xyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgYXN5bmMgdG9nZ2xlRW5oYXJtb25pYygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCd0b2dnbGUgZW5oYXJtb25pYycpO1xyXG4gICAgY29uc3QgZ3JhY2UgPSB0aGlzLnRyYWNrZXIuZ2V0U2VsZWN0ZWRHcmFjZU5vdGVzKCk7XHJcbiAgICBpZiAoZ3JhY2UubGVuZ3RoKSB7XHJcbiAgICAgIGdyYWNlLmZvckVhY2goKGFydGlmYWN0KSA9PiB7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZUdyYWNlTm90ZUVuaGFybW9uaWMoYXJ0aWZhY3Quc2VsZWN0aW9uISwgW2FydGlmYWN0Lm1vZGlmaWVyIGFzIFNtb0dyYWNlTm90ZV0pO1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oYXJ0aWZhY3Quc2VsZWN0aW9uISk7XHJcbiAgICAgICAgY29uc3QgYWx0R3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50R3JhY2VOb3RlKGFsdFNlbGVjdGlvbiEsIGFydGlmYWN0Lm1vZGlmaWVyIGFzIFNtb0dyYWNlTm90ZSk7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZUdyYWNlTm90ZUVuaGFybW9uaWMoYWx0U2VsZWN0aW9uISxcclxuICAgICAgICAgIFthbHRHcl0pO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0ZWQpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIChzZWxlY3RlZC5zZWxlY3Rvci5waXRjaGVzKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgIHNlbGVjdGVkLnNlbGVjdG9yLnBpdGNoZXMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZUVuaGFybW9uaWMoc2VsZWN0ZWQpO1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0ZWQpO1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVFbmhhcm1vbmljKGFsdFNlbCEpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSBjYXV0aW9uYXJ5L2NvdXJ0ZXN5IGFjY2lkZW50YWxzXHJcbiAgICovXHJcbiAgYXN5bmMgdG9nZ2xlQ291cnRlc3lBY2NpZGVudGFscygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCd0b2dnbGUgY291cnRlc3kgYWNjaWRlbnRhbCcpO1xyXG4gICAgY29uc3QgZ3JhY2UgPSB0aGlzLnRyYWNrZXIuZ2V0U2VsZWN0ZWRHcmFjZU5vdGVzKCk7XHJcbiAgICBpZiAoZ3JhY2UubGVuZ3RoKSB7XHJcbiAgICAgIGdyYWNlLmZvckVhY2goKGFydGlmYWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ24xID0gW2FydGlmYWN0Lm1vZGlmaWVyXSBhcyBTbW9HcmFjZU5vdGVbXTtcclxuICAgICAgICBTbW9PcGVyYXRpb24udG9nZ2xlR3JhY2VOb3RlQ291cnRlc3koYXJ0aWZhY3Quc2VsZWN0aW9uLCBnbjEpO1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oYXJ0aWZhY3Quc2VsZWN0aW9uISk7XHJcbiAgICAgICAgY29uc3QgZ24yID0gdGhpcy5fZ2V0RXF1aXZhbGVudEdyYWNlTm90ZShhbHRTZWwhLCBnbjFbMF0pO1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVHcmFjZU5vdGVDb3VydGVzeShhbHRTZWwhLCBbZ24yXSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgICBTbW9PcGVyYXRpb24udG9nZ2xlQ291cnRlc3lBY2NpZGVudGFsKHNlbGVjdGlvbik7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVDb3VydGVzeUFjY2lkZW50YWwoYWx0U2VsISk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogY2hhbmdlIHRoZSBkdXJhdGlvbiBvZiBub3RlcyBmb3Igc2VsZWN0ZWQsIGNyZWF0aW5nIG1vcmUgXHJcbiAgICogb3IgZmV3ZXIgbm90ZXMuIFxyXG4gICAqIEFmdGVyIHRoZSBjaGFuZ2UsIHJlc2V0IHRoZSBzZWxlY3Rpb24gc28gaXQncyBhcyBjbG9zZSBhcyBwb3NzaWJsZSBcclxuICAgKiB0byB0aGUgb3JpZ2luYWwgbGVuZ3RoXHJcbiAgICogQHBhcmFtIG9wZXJhdGlvbiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBiYXRjaER1cmF0aW9uT3BlcmF0aW9uKG9wZXJhdGlvbjogQmF0Y2hTZWxlY3Rpb25PcGVyYXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdjaGFuZ2UgZHVyYXRpb24nKTtcclxuICAgIGNvbnN0IGdyYWNlID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkR3JhY2VOb3RlcygpO1xyXG4gICAgY29uc3QgZ3JhY2VNYXA6IFJlY29yZDxzdHJpbmcsIEJhdGNoU2VsZWN0aW9uT3BlcmF0aW9uPiA9IHtcclxuICAgICAgZG91YmxlRHVyYXRpb246ICdkb3VibGVHcmFjZU5vdGVEdXJhdGlvbicsXHJcbiAgICAgIGhhbHZlRHVyYXRpb246ICdoYWx2ZUdyYWNlTm90ZUR1cmF0aW9uJ1xyXG4gICAgfTtcclxuICAgIGlmIChncmFjZS5sZW5ndGggJiYgdHlwZW9mIChncmFjZU1hcFtvcGVyYXRpb25dKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgb3BlcmF0aW9uID0gZ3JhY2VNYXBbb3BlcmF0aW9uXTtcclxuICAgICAgZ3JhY2UuZm9yRWFjaCgoYXJ0aWZhY3QpID0+IHtcclxuICAgICAgICAoU21vT3BlcmF0aW9uIGFzIGFueSlbb3BlcmF0aW9uXShhcnRpZmFjdC5zZWxlY3Rpb24sIGFydGlmYWN0Lm1vZGlmaWVyKTtcclxuICAgICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGFydGlmYWN0LnNlbGVjdGlvbiEpO1xyXG4gICAgICAgIGNvbnN0IGduMiA9IHRoaXMuX2dldEVxdWl2YWxlbnRHcmFjZU5vdGUoYWx0U2VsZWN0aW9uISwgYXJ0aWZhY3QubW9kaWZpZXIgYXMgU21vR3JhY2VOb3RlKTtcclxuICAgICAgICAoU21vT3BlcmF0aW9uIGFzIGFueSlbb3BlcmF0aW9uXShhbHRTZWxlY3Rpb24hLCBnbjIpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGFsdEFyID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5iYXRjaFNlbGVjdGlvbk9wZXJhdGlvbih0aGlzLnNjb3JlLCBzZWxlY3Rpb25zLCBvcGVyYXRpb24pO1xyXG4gICAgICBTbW9PcGVyYXRpb24uYmF0Y2hTZWxlY3Rpb25PcGVyYXRpb24odGhpcy5zdG9yZVNjb3JlLCBhbHRBciwgb3BlcmF0aW9uKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIHNlbGVjdGVkIG1vZGlmaWVyIG9uIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHBhcmFtIG1vZGlmaWVyIFxyXG4gICAqIEBwYXJhbSBjdG9yIHBhcmVudCBjbGFzcyBjb25zdHJ1Y3RvciAoZS5nLiBTbW9Pcm5hbWVudClcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB0b2dnbGVBcnRpY3VsYXRpb24obW9kaWZpZXI6IHN0cmluZywgY3Rvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygndG9nZ2xlIGFydGljdWxhdGlvbicpO1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsKSA9PiB7XHJcbiAgICAgIGlmIChjdG9yID09PSAnU21vQXJ0aWN1bGF0aW9uJykge1xyXG4gICAgICAgIGNvbnN0IGFhID0gbmV3IFNtb0FydGljdWxhdGlvbih7IGFydGljdWxhdGlvbjogbW9kaWZpZXIgfSk7XHJcbiAgICAgICAgY29uc3QgYWx0QWEgPSBuZXcgU21vQXJ0aWN1bGF0aW9uKHsgYXJ0aWN1bGF0aW9uOiBtb2RpZmllciB9KTtcclxuICAgICAgICBhbHRBYS5hdHRycy5pZCA9IGFhLmF0dHJzLmlkO1xyXG4gICAgICAgIGlmIChzZWwubm90ZSkge1xyXG4gICAgICAgICAgc2VsLm5vdGUudG9nZ2xlQXJ0aWN1bGF0aW9uKGFhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwpO1xyXG4gICAgICAgIGlmIChhbHRTZWxlY3Rpb24gJiYgYWx0U2VsZWN0aW9uLm5vdGUpIHtcclxuICAgICAgICAgIGFsdFNlbGVjdGlvbi5ub3RlLnRvZ2dsZUFydGljdWxhdGlvbihhbHRBYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGFhID0gbmV3IFNtb09ybmFtZW50KHsgb3JuYW1lbnQ6IG1vZGlmaWVyIH0pO1xyXG4gICAgICAgIGNvbnN0IGFsdEFhID0gbmV3IFNtb09ybmFtZW50KHsgb3JuYW1lbnQ6IG1vZGlmaWVyIH0pO1xyXG4gICAgICAgIGFsdEFhLmF0dHJzLmlkID0gYWEuYXR0cnMuaWQ7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwhKTtcclxuICAgICAgICBpZiAoc2VsLm5vdGUpIHtcclxuICAgICAgICAgIHNlbC5ub3RlLnRvZ2dsZU9ybmFtZW50KGFhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsdFNlbGVjdGlvbiAmJiBhbHRTZWxlY3Rpb24ubm90ZSkge1xyXG4gICAgICAgICAgYWx0U2VsZWN0aW9uLm5vdGUudG9nZ2xlT3JuYW1lbnQoYWx0QWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHNldEFydGljdWxhdGlvbihtb2RpZmllcjogU21vQXJ0aWN1bGF0aW9uLCBzZXQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdzZXQgYXJ0aWN1bGF0aW9uJyk7XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgY29uc3QgYWx0QWEgPSBuZXcgU21vQXJ0aWN1bGF0aW9uKG1vZGlmaWVyKTtcclxuICAgICAgaWYgKHNlbC5ub3RlKSB7XHJcbiAgICAgICAgc2VsLm5vdGUuc2V0QXJ0aWN1bGF0aW9uKG1vZGlmaWVyLCBzZXQpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuICAgICAgaWYgKGFsdFNlbGVjdGlvbiAmJiBhbHRTZWxlY3Rpb24ubm90ZSkge1xyXG4gICAgICAgIGFsdFNlbGVjdGlvbi5ub3RlLnRvZ2dsZUFydGljdWxhdGlvbihhbHRBYSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpOyAgICBcclxuICB9XHJcbiAgYXN5bmMgc2V0T3JuYW1lbnQobW9kaWZpZXI6IFNtb09ybmFtZW50LCBzZXQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdzZXQgYXJ0aWN1bGF0aW9uJyk7XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgY29uc3QgYWx0QWEgPSBuZXcgU21vT3JuYW1lbnQobW9kaWZpZXIpO1xyXG4gICAgICBpZiAoc2VsLm5vdGUpIHtcclxuICAgICAgICBzZWwubm90ZS5zZXRPcm5hbWVudChtb2RpZmllciwgc2V0KTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbCk7XHJcbiAgICAgIGlmIChhbHRTZWxlY3Rpb24gJiYgYWx0U2VsZWN0aW9uLm5vdGUpIHtcclxuICAgICAgICBhbHRTZWxlY3Rpb24ubm90ZS5zZXRPcm5hbWVudChhbHRBYSwgc2V0KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7ICAgIFxyXG4gIH1cclxuICAvKipcclxuICAgKiBjb252ZXJ0IG5vbi10dXBsZXQgbm90IHRvIGEgdHVwbGV0XHJcbiAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAqL1xyXG4gIGFzeW5jIG1ha2VUdXBsZXQocGFyYW1zOiBNYWtlVHVwbGV0T3BlcmF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1swXTtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdtYWtlIHR1cGxldCcpO1xyXG4gICAgU21vT3BlcmF0aW9uLm1ha2VUdXBsZXQoc2VsZWN0aW9uLCBwYXJhbXMpO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24hKTtcclxuICAgIFNtb09wZXJhdGlvbi5tYWtlVHVwbGV0KGFsdFNlbGVjdGlvbiEsIHBhcmFtcyk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgc2VsZWN0ZWQgdHVwbGV0IHRvIGEgc2luZ2xlIChpZiBwb3NzaWJsZSkgbm9uLXR1cGxldFxyXG4gICAqL1xyXG4gIGFzeW5jIHVubWFrZVR1cGxldCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3VubWFrZSB0dXBsZXQnKTtcclxuICAgIFNtb09wZXJhdGlvbi51bm1ha2VUdXBsZXQoc2VsZWN0aW9uKTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIFNtb09wZXJhdGlvbi51bm1ha2VUdXBsZXQoYWx0U2VsZWN0aW9uISk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBjaG9yZCBieSBhZGRpbmcgYW4gaW50ZXJ2YWwgdG8gc2VsZWN0ZWQgbm90ZVxyXG4gICAqIEBwYXJhbSBpbnRlcnZhbCAxLzIgc3RlcHNcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBzZXRJbnRlcnZhbChpbnRlcnZhbDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnc2V0IGludGVydmFsJyk7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGVkKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5pbnRlcnZhbChzZWxlY3RlZCwgaW50ZXJ2YWwpO1xyXG4gICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGVkKTtcclxuICAgICAgU21vT3BlcmF0aW9uLmludGVydmFsKGFsdFNlbGVjdGlvbiEsIGludGVydmFsKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogY2hhbmdlIHRoZSBzZWxlY3RlZCBjaG9yZCBpbnRvIGEgc2luZ2xlIG5vdGVcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGFzeW5jIGNvbGxhcHNlQ2hvcmQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnY29sbGFwc2UgY2hvcmQnKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0ZWQpID0+IHtcclxuICAgICAgY29uc3Qgbm90ZTogU21vTm90ZSB8IG51bGwgPSBzZWxlY3RlZC5ub3RlO1xyXG4gICAgICBpZiAobm90ZSkge1xyXG4gICAgICAgIGNvbnN0IHBwID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShub3RlLnBpdGNoZXNbMF0pKTtcclxuICAgICAgICBjb25zdCBhbHRwcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobm90ZS5waXRjaGVzWzBdKSk7XHJcbiAgICAgICAgLy8gTm8gb3BlcmF0aW9uIGZvciB0aGlzP1xyXG4gICAgICAgIG5vdGUucGl0Y2hlcyA9IFtwcF07XHJcbiAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3RlZCk7XHJcbiAgICAgICAgYWx0U2VsZWN0aW9uIS5ub3RlIS5waXRjaGVzID0gW2FsdHBwXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSBjaGlja2VuLXNjcmF0Y2hlcywgZm9yIGphenogaW1wcm92LCBjb21waW5nIGV0Yy5cclxuICAgKi9cclxuICBhc3luYyB0b2dnbGVTbGFzaCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdtYWtlIHNsYXNoJyk7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBTbW9PcGVyYXRpb24udG9nZ2xlU2xhc2goc2VsZWN0aW9uKTtcclxuICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICBTbW9PcGVyYXRpb24udG9nZ2xlU2xhc2goYWx0U2VsISk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogbWFrZSBzZWxlY3RlZCBub3RlcyBpbnRvIGEgcmVzdCwgb3IgdmlzYS12ZXJzYVxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgYXN5bmMgbWFrZVJlc3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnbWFrZSByZXN0Jyk7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBTbW9PcGVyYXRpb24udG9nZ2xlUmVzdChzZWxlY3Rpb24pO1xyXG4gICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVSZXN0KGFsdFNlbCEpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIGNsZWFyQWxsQmVhbXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ2NsZWFyQWxsQmVhbXMnKTtcclxuICAgIFNtb09wZXJhdGlvbi5jbGVhckFsbEJlYW1Hcm91cHModGhpcy5zY29yZSk7XHJcbiAgICBTbW9PcGVyYXRpb24uY2xlYXJBbGxCZWFtR3JvdXBzKHRoaXMuc3RvcmVTY29yZSk7XHJcbiAgICBhd2FpdCB0aGlzLmF3YWl0UmVuZGVyKCk7XHJcbiAgfVxyXG4gIGFzeW5jIGNsZWFyU2VsZWN0ZWRCZWFtcygpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVzID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KHNlbGVjdGlvbnMpO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9ucyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLmNsZWFyQmVhbUdyb3Vwcyh0aGlzLnNjb3JlLCBzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi5jbGVhckJlYW1Hcm91cHModGhpcy5zdG9yZVNjb3JlLCBhbHRTZWxlY3Rpb25zKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlcyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdG9nZ2xlIHRoZSAnZW5kIGJlYW0nIGZsYWcgZm9yIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdW5iZWFtU2VsZWN0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCd0b2dnbGUgYmVhbSBncm91cCcpO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgU21vT3BlcmF0aW9uLnVuYmVhbVNlbGVjdGlvbnMoc2VsZWN0aW9uKTtcclxuICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICBTbW9PcGVyYXRpb24udW5iZWFtU2VsZWN0aW9ucyhhbHRTZWwhKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyB0b2dnbGVDdWUoKSB7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygndG9nZ2xlIG5vdGUgY3VlJyk7XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uLm5vdGUgJiYgc2VsZWN0aW9uLm5vdGUuaXNSZXN0KCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgc2VsZWN0aW9uLm5vdGUuaXNDdWUgPSAhc2VsZWN0aW9uLm5vdGUuaXNDdWU7XHJcbiAgICAgICAgaWYgKGFsdFNlbGVjdGlvbiAmJiBhbHRTZWxlY3Rpb24ubm90ZSkge1xyXG4gICAgICAgICAgYWx0U2VsZWN0aW9uLm5vdGUuaXNDdWUgPSBzZWxlY3Rpb24ubm90ZS5pc0N1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAqIHVwIG9yIGRvd25cclxuICAqIEByZXR1cm5zIFxyXG4gICovXHJcbiAgYXN5bmMgdG9nZ2xlQmVhbURpcmVjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGlmIChzZWxlY3Rpb25zLmxlbmd0aCA8IDEpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2VIZWxwZXJzLmVtcHR5UHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3RvZ2dsZSBiZWFtIGRpcmVjdGlvbicpO1xyXG4gICAgU21vT3BlcmF0aW9uLnRvZ2dsZUJlYW1EaXJlY3Rpb24oc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24udG9nZ2xlQmVhbURpcmVjdGlvbih0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCB0aGUgc2VsZWN0ZWQgbm90ZXMgdG8gYSBiZWFtIGdyb3VwXHJcbiAgICovXHJcbiAgYXN5bmMgYmVhbVNlbGVjdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnYmVhbSBzZWxlY3Rpb25zJyk7XHJcbiAgICBTbW9PcGVyYXRpb24uYmVhbVNlbGVjdGlvbnModGhpcy5zY29yZSwgc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24uYmVhbVNlbGVjdGlvbnModGhpcy5zdG9yZVNjb3JlLCB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGNoYW5nZSBrZXkgc2lnbmF0dXJlIGZvciBzZWxlY3RlZCBtZWFzdXJlc1xyXG4gICAqIEBwYXJhbSBrZXlTaWduYXR1cmUgdmV4IGtleSBzaWduYXR1cmVcclxuICAgKi9cclxuICBhc3luYyBhZGRLZXlTaWduYXR1cmUoa2V5U2lnbmF0dXJlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdzZXQga2V5IHNpZ25hdHVyZSAnICsga2V5U2lnbmF0dXJlKTtcclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKHNlbCkgPT4ge1xyXG4gICAgICBTbW9PcGVyYXRpb24uYWRkS2V5U2lnbmF0dXJlKHRoaXMuc2NvcmUsIHNlbCwga2V5U2lnbmF0dXJlKTtcclxuICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwpO1xyXG4gICAgICBTbW9PcGVyYXRpb24uYWRkS2V5U2lnbmF0dXJlKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsISwga2V5U2lnbmF0dXJlKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXRzIGEgcGl0Y2ggZnJvbSB0aGUgcGlhbm8gd2lkZ2V0LlxyXG4gICAqIEBwYXJhbSBwaXRjaCB7UGl0Y2h9XHJcbiAgICogQHBhcmFtIGNob3JkUGVkYWwge2Jvb2xlYW59IC0gaW5kaWNhdGVzIHdlIGFyZSBhZGRpbmcgdG8gYSBjaG9yZFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldFBpdGNoUGlhbm8ocGl0Y2g6IFBpdGNoLCBjaG9yZFBlZGFsOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucyhcclxuICAgICAgJ3NldEFic29sdXRlUGl0Y2ggJyArIHBpdGNoLmxldHRlciArICcvJyArIHBpdGNoLmFjY2lkZW50YWwpO1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0ZWQpID0+IHtcclxuICAgICAgY29uc3QgbnBpdGNoOiBQaXRjaCA9IHtcclxuICAgICAgICBsZXR0ZXI6IHBpdGNoLmxldHRlcixcclxuICAgICAgICBhY2NpZGVudGFsOiBwaXRjaC5hY2NpZGVudGFsLCBvY3RhdmU6IHBpdGNoLm9jdGF2ZVxyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCBvY3RhdmUgPSBTbW9NZWFzdXJlLmRlZmF1bHRQaXRjaEZvckNsZWZbc2VsZWN0ZWQubWVhc3VyZS5jbGVmXS5vY3RhdmU7XHJcbiAgICAgIG5waXRjaC5vY3RhdmUgKz0gb2N0YXZlO1xyXG4gICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGVkKTtcclxuICAgICAgaWYgKGNob3JkUGVkYWwgJiYgc2VsZWN0ZWQubm90ZSkge1xyXG4gICAgICAgIHNlbGVjdGVkLm5vdGUudG9nZ2xlQWRkUGl0Y2gobnBpdGNoKTtcclxuICAgICAgICBhbHRTZWwhLm5vdGUhLnRvZ2dsZUFkZFBpdGNoKG5waXRjaCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnNldFBpdGNoKHNlbGVjdGVkLCBbbnBpdGNoXSk7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnNldFBpdGNoKGFsdFNlbCEsIFtucGl0Y2hdKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHNob3cgb3IgaGlkZSB0aGUgcGlhbm8gd2lkZ2V0XHJcbiAgICogQHBhcmFtIHZhbHVlIHRvIHNob3cgaXRcclxuICAgKi9cclxuICBhc3luYyBzaG93UGlhbm8odmFsdWU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuc2NvcmUucHJlZmVyZW5jZXMuc2hvd1BpYW5vID0gdmFsdWU7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUucHJlZmVyZW5jZXMuc2hvd1BpYW5vID0gdmFsdWU7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgU3VpUGlhbm8uc2hvd1BpYW5vKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBTdWlQaWFuby5oaWRlUGlhbm8oKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZW5kZXIgYSBwaXRjaCBmb3IgZWFjaCBsZXR0ZXIgbmFtZS1waXRjaCBpbiB0aGUgc3RyaW5nLFxyXG4gICAqIEBwYXJhbSBwaXRjaGVzIGxldHRlciBuYW1lcyBmb3IgcGl0Y2hlc1xyXG4gICAqIEByZXR1cm5zIHByb21pc2UsIHJlc29sdmVkIHdoZW4gYWxsIHBpdGNoZXMgcmVuZGVyZWRcclxuICAgKiBAc2VlIHNldFBpdGNoXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0UGl0Y2hlc1Byb21pc2UocGl0Y2hlczogUGl0Y2hMZXR0ZXJbXSk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZjID0gYXN5bmMgKGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICBpZiAoaW5kZXggPj0gcGl0Y2hlcy5sZW5ndGgpIHtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYXdhaXQgc2VsZi5zZXRQaXRjaChwaXRjaGVzW2luZGV4XSk7XHJcbiAgICAgICAgICBmYyhpbmRleCArIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgZmMoMCk7XHJcbiAgICB9KTtcclxuICAgIGF3YWl0IHByb21pc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgYSBwaXRjaCB0byB0aGUgc2NvcmUgYXQgdGhlIGN1cnNvci4gIFRoaXMgdHJpZXMgdG8gZmluZCB0aGUgYmVzdCBwaXRjaFxyXG4gICAqIHRvIG1hdGNoIHRoZSBsZXR0ZXIga2V5IChGIHZzIEYjIGZvciBpbnN0YW5jZSkgYmFzZWQgb24ga2V5IGFuZCBzdXJyb3VuZGluZyBub3Rlc1xyXG4gICAqIEBwYXJhbSBsZXR0ZXIgc3RyaW5nXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0UGl0Y2gobGV0dGVyOiBQaXRjaExldHRlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3NldCBwaXRjaCAnICsgbGV0dGVyKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0ZWQpID0+IHtcclxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3RlZC5zZWxlY3RvcjtcclxuICAgICAgbGV0IGhpbnRTZWwgPSBTbW9TZWxlY3Rpb24ubGFzdE5vdGVTZWxlY3Rpb25Ob25SZXN0KHRoaXMuc2NvcmUsXHJcbiAgICAgICAgc2VsZWN0b3Iuc3RhZmYsIHNlbGVjdG9yLm1lYXN1cmUsIHNlbGVjdG9yLnZvaWNlLCBzZWxlY3Rvci50aWNrKTtcclxuICAgICAgaWYgKCFoaW50U2VsKSB7XHJcbiAgICAgICAgaGludFNlbCA9IFNtb1NlbGVjdGlvbi5uZXh0Tm90ZVNlbGVjdGlvbk5vblJlc3QodGhpcy5zY29yZSxcclxuICAgICAgICAgIHNlbGVjdG9yLnN0YWZmLCBzZWxlY3Rvci5tZWFzdXJlLCBzZWxlY3Rvci52b2ljZSwgc2VsZWN0b3IudGljayk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gVGhlIHNlbGVjdGlvbiBubyBsb25nZXIgZXhpc3RzLCBwb3NzaWJseSBkZWxldGVkXHJcbiAgICAgIGlmIChoaW50U2VsID09PSBudWxsIHx8IGhpbnRTZWwubm90ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlSGVscGVycy5lbXB0eVByb21pc2UoKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwaXRjaCA9IFNtb011c2ljLmdldExldHRlck5vdGVQaXRjaChoaW50U2VsLm5vdGUucGl0Y2hlc1swXSxcclxuICAgICAgICBsZXR0ZXIsIGhpbnRTZWwubWVhc3VyZS5rZXlTaWduYXR1cmUpO1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0UGl0Y2goc2VsZWN0ZWQsIFtwaXRjaF0pO1xyXG4gICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGVkKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnNldFBpdGNoKGFsdFNlbCEsIFtwaXRjaF0pO1xyXG4gICAgICBpZiAodGhpcy5zY29yZS5wcmVmZXJlbmNlcy5hdXRvQWR2YW5jZSkge1xyXG4gICAgICAgIC8vIERvbid0IHBsYXkgdGhlIG5leHQgbm90ZSBhbmQgdGhlIGFkZGVkIHBpdGNoIGF0IHRoZSBzYW1lIHRpbWUuXHJcbiAgICAgICAgdGhpcy50cmFja2VyLmRlZmVyTmV4dEF1dG9QbGF5KCk7XHJcbiAgICAgICAgdGhpcy50cmFja2VyLm1vdmVTZWxlY3Rpb25SaWdodCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChzZWxlY3Rpb25zLmxlbmd0aCA9PT0gMSAmJiB0aGlzLnNjb3JlLnByZWZlcmVuY2VzLmF1dG9QbGF5KSB7XHJcbiAgICAgIFN1aU9zY2lsbGF0b3IucGxheVNlbGVjdGlvbk5vdyhzZWxlY3Rpb25zWzBdLCB0aGlzLnNjb3JlLCAxKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2VuZXJpYyBjbGlwYm9hcmQgY29weSBhY3Rpb25cclxuICAgKi9cclxuICBhc3luYyBjb3B5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWx0QXI6IFNtb1NlbGVjdGlvbltdID0gW107XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgY29uc3Qgbm90ZVNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuICAgICAgaWYgKG5vdGVTZWxlY3Rpb24gIT09IG51bGwpIHtcclxuICAgICAgICBhbHRBci5wdXNoKG5vdGVTZWxlY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc3RvcmVQYXN0ZS5zZXRTZWxlY3Rpb25zKHRoaXMuc3RvcmVTY29yZSwgYWx0QXIpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGNsaXBib2FyZCBwYXN0ZSBhY3Rpb25cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBwYXN0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFdlIHVuZG8gdGhlIHdob2xlIHNjb3JlIG9uIGEgcGFzdGUsIHNpbmNlIHdlIGRvbid0IHlldCBrbm93IHRoZVxyXG4gICAgLy8gZXh0ZW50IG9mIHRoZSBvdmVybGFwXHJcbiAgICB0aGlzLnJlbmRlcmVyLnByZXNlcnZlU2Nyb2xsKCk7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSAgPSB0aGlzLmdldFBhc3RlTWVhc3VyZUxpc3QoKTtcclxuICAgIGNvbnN0IGZpcnN0U2VsZWN0aW9uID0gc2VsZWN0aW9uc1swXTtcclxuICAgIGNvbnN0IG1lYXN1cmVFbmQgPSBzZWxlY3Rpb25zW3NlbGVjdGlvbnMubGVuZ3RoIC0gMV0uc2VsZWN0b3IubWVhc3VyZTtcclxuICAgIGNvbnN0IG1lYXN1cmVSYW5nZSA9IFtmaXJzdFNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlLCBtZWFzdXJlRW5kXTtcclxuICAgIHRoaXMuc3RvcmVVbmRvLmdyb3VwaW5nID0gdHJ1ZTtcclxuICAgIC8vIFVuZG8gdGhlIHBhc3RlIGJ5IHNlbGVjdGluZyBhbGwgdGhlIGFmZmVjdGVkIG1lYXN1cmVzXHJcbiAgICBmb3IgKGxldCBpID0gbWVhc3VyZVJhbmdlWzBdOyBpIDw9IG1lYXN1cmVSYW5nZVsxXTsgKytpKSB7XHJcbiAgICAgIHRoaXMuX3VuZG9Db2x1bW4oJ3Bhc3RlJywgaSk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIudW5yZW5kZXJDb2x1bW4odGhpcy5zY29yZS5zdGF2ZXNbMF0ubWVhc3VyZXNbaV0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdG9yZVVuZG8uZ3JvdXBpbmcgPSBmYWxzZTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oZmlyc3RTZWxlY3Rpb24pO1xyXG4gICAgY29uc3QgYWx0VGFyZ2V0ID0gYWx0U2VsZWN0aW9uIS5zZWxlY3RvcjtcclxuICAgIGFsdFRhcmdldC50aWNrID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnNbMF0uc2VsZWN0b3IudGljaztcclxuICAgIC8vIHBhc3RlIHRoZSBjbGlwYm9hcmQgaW50byB0aGUgZGVzdGluYXRpb25cclxuICAgIHRoaXMuc3RvcmVQYXN0ZS5wYXN0ZVNlbGVjdGlvbnMoYWx0VGFyZ2V0KTtcclxuICAgIC8vIFJlZnJlc2ggdGhvc2UgbWVhc3VyZXMuXHJcbiAgICB0aGlzLnJlcGxhY2VNZWFzdXJlVmlldyhtZWFzdXJlUmFuZ2UpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFBhc3RlIG9ubHkgdGhlIGNob3Jkcy5cclxuICAgKi9cclxuICBhc3luYyBwYXN0ZUNob3JkcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICAvLyBXZSB1bmRvIHRoZSB3aG9sZSBzY29yZSBvbiBhIHBhc3RlLCBzaW5jZSB3ZSBkb24ndCB5ZXQga25vdyB0aGVcclxuICAgIC8vIGV4dGVudCBvZiB0aGUgb3ZlcmxhcFxyXG4gICAgdGhpcy5yZW5kZXJlci5wcmVzZXJ2ZVNjcm9sbCgpO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uczogU21vU2VsZWN0aW9uW10gID0gdGhpcy5nZXRQYXN0ZU1lYXN1cmVMaXN0KCk7XHJcbiAgICBjb25zdCBmaXJzdFNlbGVjdGlvbiA9IHNlbGVjdGlvbnNbMF07XHJcbiAgICBjb25zdCBtZWFzdXJlRW5kID0gc2VsZWN0aW9uc1tzZWxlY3Rpb25zLmxlbmd0aCAtIDFdLnNlbGVjdG9yLm1lYXN1cmU7XHJcbiAgICBjb25zdCBtZWFzdXJlUmFuZ2UgPSBbZmlyc3RTZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSwgbWVhc3VyZUVuZF07XHJcbiAgICB0aGlzLnN0b3JlVW5kby5ncm91cGluZyA9IHRydWU7XHJcbiAgICAvLyBVbmRvIHRoZSBwYXN0ZSBieSBzZWxlY3RpbmcgYWxsIHRoZSBhZmZlY3RlZCBtZWFzdXJlc1xyXG4gICAgZm9yIChsZXQgaSA9IG1lYXN1cmVSYW5nZVswXTsgaSA8PSBtZWFzdXJlUmFuZ2VbMV07ICsraSkge1xyXG4gICAgICB0aGlzLl91bmRvQ29sdW1uKCdwYXN0ZScsIGkpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnVucmVuZGVyQ29sdW1uKHRoaXMuc2NvcmUuc3RhdmVzWzBdLm1lYXN1cmVzW2ldKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmVVbmRvLmdyb3VwaW5nID0gZmFsc2U7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGZpcnN0U2VsZWN0aW9uKTtcclxuICAgIGNvbnN0IGFsdFRhcmdldCA9IGFsdFNlbGVjdGlvbiEuc2VsZWN0b3I7XHJcbiAgICBhbHRUYXJnZXQudGljayA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdLnNlbGVjdG9yLnRpY2s7XHJcbiAgICB0aGlzLnN0b3JlUGFzdGUucGFzdGVDaG9yZHMoYWx0VGFyZ2V0KTtcclxuICAgIC8vIFJlZnJlc2ggdGhvc2UgbWVhc3VyZXMuXHJcbiAgICB0aGlzLnJlcGxhY2VNZWFzdXJlVmlldyhtZWFzdXJlUmFuZ2UpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHNwZWNpZnkgYSBub3RlIGhlYWQgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBmb3IgdGhlIGR1cmF0aW9uXHJcbiAgICogQHBhcmFtIGhlYWQgXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0Tm90ZUhlYWQoaGVhZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLm1vZGlmeUN1cnJlbnRTZWxlY3Rpb25zKCdzZXQgbm90ZSBoZWFkJywgKHNjb3JlLCBzZWxlY3Rpb25zKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5zZXROb3RlSGVhZChzZWxlY3Rpb25zLCBoZWFkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIGEgdm9sdGEgZm9yIHNlbGVjdGVkIG1lYXN1cmVzXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkRW5kaW5nKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gVE9ETzogd2Ugc2hvdWxkIGhhdmUgdW5kbyBmb3IgY29sdW1uc1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdBZGQgVm9sdGEnKTtcclxuICAgIGNvbnN0IGZ0ID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpO1xyXG4gICAgY29uc3QgdHQgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IFNtb1ZvbHRhLmRlZmF1bHRzO1xyXG4gICAgcGFyYW1zLnN0YXJ0QmFyID0gZnQuc2VsZWN0b3IubWVhc3VyZTtcclxuICAgIHBhcmFtcy5lbmRCYXIgPSB0dC5zZWxlY3Rvci5tZWFzdXJlO1xyXG4gICAgcGFyYW1zLm51bWJlciA9IDE7XHJcbiAgICBjb25zdCB2b2x0YSA9IG5ldyBTbW9Wb2x0YShwYXJhbXMpO1xyXG4gICAgY29uc3QgYWx0Vm9sdGEgPSBuZXcgU21vVm9sdGEocGFyYW1zKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbZnQsIHR0XSk7XHJcbiAgICBTbW9PcGVyYXRpb24uYWRkRW5kaW5nKHRoaXMuc3RvcmVTY29yZSwgYWx0Vm9sdGEpO1xyXG4gICAgU21vT3BlcmF0aW9uLmFkZEVuZGluZyh0aGlzLnNjb3JlLCB2b2x0YSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIGVuZGluZyB2b2x0YSBzZXR0aW5nc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZUVuZGluZyhlbmRpbmc6IFNtb1ZvbHRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ0NoYW5nZSBWb2x0YScpO1xyXG4gICAgZW5kaW5nLmVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICQoZWwpLmZpbmQoJ2cuJyArIGVuZGluZy5hdHRycy5pZCkucmVtb3ZlKCk7XHJcbiAgICB9KTtcclxuICAgIGVuZGluZy5lbGVtZW50cyA9IFtdO1xyXG4gICAgU21vT3BlcmF0aW9uLnJlbW92ZUVuZGluZyh0aGlzLnN0b3JlU2NvcmUsIGVuZGluZyk7XHJcbiAgICBTbW9PcGVyYXRpb24ucmVtb3ZlRW5kaW5nKHRoaXMuc2NvcmUsIGVuZGluZyk7XHJcbiAgICBjb25zdCBhbHRWb2x0YSA9IG5ldyBTbW9Wb2x0YShlbmRpbmcpO1xyXG4gICAgU21vT3BlcmF0aW9uLmFkZEVuZGluZyh0aGlzLnN0b3JlU2NvcmUsIGFsdFZvbHRhKTtcclxuICAgIFNtb09wZXJhdGlvbi5hZGRFbmRpbmcodGhpcy5zY29yZSwgZW5kaW5nKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVmcmVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gZW5kaW5nIHZvbHRhIHRvIHJlbW92ZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZUVuZGluZyhlbmRpbmc6IFNtb1ZvbHRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ1JlbW92ZSBWb2x0YScpO1xyXG4gICAgZW5kaW5nLmVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICQoZWwpLmZpbmQoJ2cuJyArIGVuZGluZy5hdHRycy5pZCkucmVtb3ZlKCk7XHJcbiAgICB9KTtcclxuICAgIGVuZGluZy5lbGVtZW50cyA9IFtdO1xyXG4gICAgU21vT3BlcmF0aW9uLnJlbW92ZUVuZGluZyh0aGlzLnN0b3JlU2NvcmUsIGVuZGluZyk7XHJcbiAgICBTbW9PcGVyYXRpb24ucmVtb3ZlRW5kaW5nKHRoaXMuc2NvcmUsIGVuZGluZyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHBvc2l0aW9uIGJlZ2luIG9yIGVuZFxyXG4gICAqIEBwYXJhbSBiYXJsaW5lIGJhcmxpbmUgdHlwZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldEJhcmxpbmUocG9zaXRpb246IG51bWJlciwgYmFybGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBvYmogPSBuZXcgU21vQmFybGluZSh7IHBvc2l0aW9uLCBiYXJsaW5lIH0pO1xyXG4gICAgY29uc3QgYWx0T2JqID0gbmV3IFNtb0JhcmxpbmUoeyBwb3NpdGlvbiwgYmFybGluZSB9KTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdO1xyXG4gICAgdGhpcy5fdW5kb0NvbHVtbignc2V0IGJhcmxpbmUnLCBzZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSk7XHJcbiAgICBTbW9PcGVyYXRpb24uc2V0TWVhc3VyZUJhcmxpbmUodGhpcy5zY29yZSwgc2VsZWN0aW9uLCBvYmopO1xyXG4gICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVCYXJsaW5lKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsISwgYWx0T2JqKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbc2VsZWN0aW9uXSk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBzdGFydCBvciBlbmRcclxuICAgKiBAcGFyYW0gc3ltYm9sIGNvZGEsIGV0Yy5cclxuICAgKi9cclxuICBhc3luYyBzZXRSZXBlYXRTeW1ib2wocG9zaXRpb246IG51bWJlciwgc3ltYm9sOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IFNtb1JlcGVhdFN5bWJvbC5kZWZhdWx0cztcclxuICAgIHBhcmFtcy5wb3NpdGlvbiA9IHBvc2l0aW9uO1xyXG4gICAgcGFyYW1zLnN5bWJvbCA9IHN5bWJvbDtcclxuICAgIGNvbnN0IG9iaiA9IG5ldyBTbW9SZXBlYXRTeW1ib2wocGFyYW1zKTtcclxuICAgIGNvbnN0IGFsdE9iaiA9IG5ldyBTbW9SZXBlYXRTeW1ib2wocGFyYW1zKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdO1xyXG4gICAgdGhpcy5fdW5kb0NvbHVtbignc2V0IHJlcGVhdCBzeW1ib2wnLCBzZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSk7XHJcbiAgICBTbW9PcGVyYXRpb24uc2V0UmVwZWF0U3ltYm9sKHRoaXMuc2NvcmUsIHNlbGVjdGlvbiwgb2JqKTtcclxuICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIFNtb09wZXJhdGlvbi5zZXRSZXBlYXRTeW1ib2wodGhpcy5zdG9yZVNjb3JlLCBhbHRTZWwhLCBhbHRPYmopO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKFtzZWxlY3Rpb25dKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogIHRvZ2dsZSByZWhlYXJzYWwgbWFyayBvbiBmaXJzdCBzZWxlY3RlZCBtZWFzdXJlXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyB0b2dnbGVSZWhlYXJzYWxNYXJrKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgY29uc3QgY21kID0gc2VsZWN0aW9uLm1lYXN1cmUuZ2V0UmVoZWFyc2FsTWFyaygpID8gJ3JlbW92ZVJlaGVhcnNhbE1hcmsnIDogJ2FkZFJlaGVhcnNhbE1hcmsnO1xyXG4gICAgU21vT3BlcmF0aW9uW2NtZF0odGhpcy5zY29yZSwgc2VsZWN0aW9uLCBuZXcgU21vUmVoZWFyc2FsTWFyayhTbW9SZWhlYXJzYWxNYXJrLmRlZmF1bHRzKSk7XHJcbiAgICBTbW9PcGVyYXRpb25bY21kXSh0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbGVjdGlvbiEsIG5ldyBTbW9SZWhlYXJzYWxNYXJrKFNtb1JlaGVhcnNhbE1hcmsuZGVmYXVsdHMpKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbc2VsZWN0aW9uXSk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIF9yZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyOiBTdGFmZk1vZGlmaWVyQmFzZSkge1xyXG4gICAgdGhpcy5zY29yZS5zdGF2ZXNbbW9kaWZpZXIuYXNzb2NpYXRlZFN0YWZmXS5yZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyKTtcclxuICAgIGNvbnN0IGFsdE1vZGlmaWVyID0gU3RhZmZNb2RpZmllckJhc2UuZGVzZXJpYWxpemUobW9kaWZpZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgYWx0TW9kaWZpZXIuYXR0cnMuaWQgPSBtb2RpZmllci5hdHRycy5pZDtcclxuICAgIGFsdE1vZGlmaWVyLnN0YXJ0U2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoYWx0TW9kaWZpZXIuc3RhcnRTZWxlY3Rvcik7XHJcbiAgICBhbHRNb2RpZmllci5lbmRTZWxlY3RvciA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3RvcihhbHRNb2RpZmllci5lbmRTZWxlY3Rvcik7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuX2dldEVxdWl2YWxlbnRTdGFmZihtb2RpZmllci5hc3NvY2lhdGVkU3RhZmYpXS5yZW1vdmVTdGFmZk1vZGlmaWVyKGFsdE1vZGlmaWVyKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHNlbGVjdGVkIG1vZGlmaWVyXHJcbiAgICogQHBhcmFtIG1vZGlmaWVyIHNsdXIsIGhhaXJwaW4sIGV0Yy5cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyOiBTdGFmZk1vZGlmaWVyQmFzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy51bmRvU3RhZmZNb2RpZmllcignU2V0IG1lYXN1cmUgcHJvcG9ydGlvbicsIG1vZGlmaWVyLFxyXG4gICAgICBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLlJFTU9WRSk7XHJcbiAgICB0aGlzLl9yZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyKTtcclxuICAgIHRoaXMuX3JlbmRlclJlY3RhbmdsZShtb2RpZmllci5zdGFydFNlbGVjdG9yLCBtb2RpZmllci5lbmRTZWxlY3Rvcik7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSBhIHN0YWZmIG1vZGlmaWVyXHJcbiAgICogQHBhcmFtIG9yaWdpbmFsIG9yaWdpbmFsIHZlcnNpb25cclxuICAgKiBAcGFyYW0gbW9kaWZpZXIgbW9kaWZpZWQgdmVyc2lvblxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZE9yVXBkYXRlU3RhZmZNb2RpZmllcihvcmlnaW5hbDogU3RhZmZNb2RpZmllckJhc2UsIG1vZGlmaWVyOiBTdGFmZk1vZGlmaWVyQmFzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFtb2RpZmllcikge1xyXG4gICAgICBpZiAob3JpZ2luYWwpIHtcclxuICAgICAgICAvLyBIYW5kbGUgbGVnYWN5IEFQSSBjaGFuZ2VkXHJcbiAgICAgICAgbW9kaWZpZXIgPSBTdGFmZk1vZGlmaWVyQmFzZS5kZXNlcmlhbGl6ZShvcmlnaW5hbCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCd1cGRhdGUgbW9kaWZpZXI6IGJhZCBtb2RpZmllcicpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlSGVscGVycy5lbXB0eVByb21pc2UoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnNjb3JlLnN0YXZlc1ttb2RpZmllci5zdGFydFNlbGVjdG9yLnN0YWZmXVxyXG4gICAgICAuZ2V0TW9kaWZpZXIobW9kaWZpZXIpO1xyXG4gICAgY29uc3Qgc3VidHlwZSA9IGV4aXN0aW5nID09PSBudWxsID8gVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQgOlxyXG4gICAgICBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLlVQREFURTtcclxuICAgIHRoaXMudW5kb1N0YWZmTW9kaWZpZXIoJ1NldCBtZWFzdXJlIHByb3BvcnRpb24nLCBvcmlnaW5hbCxcclxuICAgICAgc3VidHlwZSk7XHJcbiAgICB0aGlzLl9yZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyKTtcclxuICAgIGNvbnN0IGNvcHkgPSBTdGFmZk1vZGlmaWVyQmFzZS5kZXNlcmlhbGl6ZShtb2RpZmllci5zZXJpYWxpemUoKSk7XHJcbiAgICBjb3B5LnN0YXJ0U2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoY29weS5zdGFydFNlbGVjdG9yKTtcclxuICAgIGNvcHkuZW5kU2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoY29weS5lbmRTZWxlY3Rvcik7XHJcbiAgICBjb25zdCBzZWwgPSBTbW9TZWxlY3Rpb24ubm90ZUZyb21TZWxlY3Rvcih0aGlzLnNjb3JlLCBtb2RpZmllci5zdGFydFNlbGVjdG9yKTtcclxuICAgIGlmIChzZWwgIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwpO1xyXG4gICAgICBTbW9PcGVyYXRpb24uYWRkU3RhZmZNb2RpZmllcihzZWwsIG1vZGlmaWVyKTtcclxuICAgICAgU21vT3BlcmF0aW9uLmFkZFN0YWZmTW9kaWZpZXIoYWx0U2VsISwgY29weSk7XHJcbiAgICAgIGNvbnN0IG1vZElkID0gJ21vZC0nICsgc2VsLnNlbGVjdG9yLnN0YWZmICsgJy0nICsgc2VsLnNlbGVjdG9yLm1lYXN1cmU7XHJcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnJlbmRlcmVyLnJlbmRlcmVyLmdldFJlbmRlcmVyKHNlbC5tZWFzdXJlLnN2Zy5sb2dpY2FsQm94KTtcclxuICAgICAgaWYgKGNvbnRleHQpIHtcclxuICAgICAgICBTdmdIZWxwZXJzLnJlbW92ZUVsZW1lbnRzQnlDbGFzcyhjb250ZXh0LnN2ZywgbW9kSWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZW5kZXJSZWN0YW5nbGUobW9kaWZpZXIuc3RhcnRTZWxlY3RvciwgbW9kaWZpZXIuZW5kU2VsZWN0b3IpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBsaW5lT3BlcmF0aW9uKG9wOiBjcmVhdGVTdGFmZk1vZGlmaWVyVHlwZTxTdGFmZk1vZGlmaWVyQmFzZT4pIHtcclxuICAgIC8vIGlmICh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5sZW5ndGggPCAyKSB7XHJcbiAgICAvLyAgIHJldHVybjtcclxuICAgIC8vIH1cclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdjcmVhdGUgc3RhZmYgbW9kaWZpZXInKTtcclxuICAgIGNvbnN0IGZ0ID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpO1xyXG4gICAgY29uc3QgdHQgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKTtcclxuICAgIGNvbnN0IGZ0QWx0ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihmdCk7XHJcbiAgICBjb25zdCB0dEFsdCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24odHQpO1xyXG4gICAgY29uc3QgbW9kaWZpZXIgPSBvcChmdCwgdHQpO1xyXG4gICAgY29uc3QgYWx0TW9kaWZpZXIgPSBvcChmdEFsdCEsIHR0QWx0ISk7XHJcbiAgICBhbHRNb2RpZmllci5hdHRycy5pZCA9IG1vZGlmaWVyLmF0dHJzLmlkO1xyXG4gICAgZnQuc3RhZmYuYWRkU3RhZmZNb2RpZmllcihtb2RpZmllcik7XHJcbiAgICBmdEFsdD8uc3RhZmYuYWRkU3RhZmZNb2RpZmllcihhbHRNb2RpZmllcik7XHJcbiAgICB0aGlzLnVuZG9TdGFmZk1vZGlmaWVyKCdhZGQgJyArIG9wLCBtb2RpZmllciwgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWRkIGNyZXNjZW5kbyB0byBzZWxlY3Rpb25cclxuICAgKi9cclxuICBhc3luYyBjcmVzY2VuZG8oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmxpbmVPcGVyYXRpb24oU21vT3BlcmF0aW9uLmNyZWF0ZUNyZXNjZW5kbyk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCBjcmVzY2VuZG8gdG8gc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgY3Jlc2NlbmRvQnJhY2tldCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubGluZU9wZXJhdGlvbihTbW9PcGVyYXRpb24uY3JlYXRlQ3Jlc2NlbmRvQnJhY2tldCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCBjcmVzY2VuZG8gdG8gc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgZGltZW51ZW5kbygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubGluZU9wZXJhdGlvbihTbW9PcGVyYXRpb24uY3JlYXRlRGltZW51ZW5kb0JyYWNrZXQpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgY3Jlc2NlbmRvIHRvIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGFzeW5jIGFjY2VsZXJhbmRvKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5saW5lT3BlcmF0aW9uKFNtb09wZXJhdGlvbi5jcmVhdGVBY2NlbGVyYW5kb0JyYWNrZXQpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgY3Jlc2NlbmRvIHRvIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGFzeW5jIHJpdGFyZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubGluZU9wZXJhdGlvbihTbW9PcGVyYXRpb24uY3JlYXRlUml0YXJkQnJhY2tldCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGRpbWludWVuZG8gaGFpcnBpblxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGRlY3Jlc2NlbmRvKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5saW5lT3BlcmF0aW9uKFNtb09wZXJhdGlvbi5jcmVhdGVEZWNyZXNjZW5kbyk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHJlbW92ZVRleHRCcmFja2V0KGJyYWNrZXQ6IFNtb1N0YWZmVGV4dEJyYWNrZXQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnJlbW92ZVN0YWZmTW9kaWZpZXIoYnJhY2tldCk7XHJcbiAgfVxyXG4gIGFzeW5jIGFkZE9yUmVwbGFjZVN0YWZmTW9kaWZpZXIoY2FsbGJhY2s6IHVwZGF0ZVN0YWZmTW9kaWZpZXJGdW5jLCBtb2RpZmllcjogU3RhZmZNb2RpZmllckJhc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGZyb20xID0gU21vU2VsZWN0aW9uLm5vdGVGcm9tU2VsZWN0b3IodGhpcy5zY29yZSwgbW9kaWZpZXIuc3RhcnRTZWxlY3Rvcik7XHJcbiAgICBjb25zdCB0bzEgPSBTbW9TZWxlY3Rpb24ubm90ZUZyb21TZWxlY3Rvcih0aGlzLnNjb3JlLCBtb2RpZmllci5lbmRTZWxlY3Rvcik7XHJcbiAgICBpZiAoZnJvbTEgPT09IG51bGwgfHwgdG8xID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGFsdEZyb20gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGZyb20xKTtcclxuICAgIGNvbnN0IGFsdFRvID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbih0bzEpO1xyXG4gICAgaWYgKGFsdEZyb20gPT09IG51bGwgfHwgYWx0VG8gPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY2FsbGJhY2sodGhpcy5zY29yZSwgZnJvbTEsIHRvMSk7XHJcbiAgICBjYWxsYmFjayh0aGlzLnN0b3JlU2NvcmUsIGFsdEZyb20sIGFsdFRvKTtcclxuICAgIGNvbnN0IHJlZHJhdyA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlc0JldHdlZW4odGhpcy5zY29yZSwgZnJvbTEuc2VsZWN0b3IsIHRvMS5zZWxlY3Rvcik7XHJcbiAgICB0aGlzLnVuZG9TdGFmZk1vZGlmaWVyKCdhZGQgcmVwbCB0ZXh0IGJyYWNrZXQnLCBtb2RpZmllciwgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKHJlZHJhdyk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIGFkZE9yUmVwbGFjZVRleHRCcmFja2V0KG1vZGlmaWVyOiBTbW9TdGFmZlRleHRCcmFja2V0KSB7XHJcbiAgICBjb25zdCBmcm9tMSA9IFNtb1NlbGVjdGlvbi5ub3RlRnJvbVNlbGVjdG9yKHRoaXMuc2NvcmUsIG1vZGlmaWVyLnN0YXJ0U2VsZWN0b3IpO1xyXG4gICAgY29uc3QgdG8xID0gU21vU2VsZWN0aW9uLm5vdGVGcm9tU2VsZWN0b3IodGhpcy5zY29yZSwgbW9kaWZpZXIuZW5kU2VsZWN0b3IpO1xyXG4gICAgaWYgKGZyb20xID09PSBudWxsIHx8IHRvMSA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBhbHRGcm9tID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihmcm9tMSk7XHJcbiAgICBjb25zdCBhbHRUbyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24odG8xKTtcclxuICAgIGlmIChhbHRGcm9tID09PSBudWxsIHx8IGFsdFRvID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFNtb09wZXJhdGlvbi5hZGRPclJlcGxhY2VCcmFja2V0KG1vZGlmaWVyLCBmcm9tMSwgdG8xKTtcclxuICAgIFNtb09wZXJhdGlvbi5hZGRPclJlcGxhY2VCcmFja2V0KG1vZGlmaWVyLCBhbHRGcm9tLCBhbHRUbyk7XHJcbiAgICBjb25zdCByZWRyYXcgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZXNCZXR3ZWVuKHRoaXMuc2NvcmUsIGZyb20xLnNlbGVjdG9yLCB0bzEuc2VsZWN0b3IpO1xyXG4gICAgdGhpcy51bmRvU3RhZmZNb2RpZmllcignYWRkIHJlcGwgdGV4dCBicmFja2V0JywgbW9kaWZpZXIsIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuQUREKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhyZWRyYXcpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTbHVyIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyBhZGRTbHVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpO1xyXG4gICAgY29uc3QgZnQgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigtMSk7XHJcbiAgICBjb25zdCB0dCA9IHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKDEpO1xyXG4gICAgY29uc3QgZnRBbHQgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGZ0KTtcclxuICAgIGNvbnN0IHR0QWx0ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbih0dCk7XHJcbiAgICBjb25zdCBtb2RpZmllciA9IFNtb09wZXJhdGlvbi5jcmVhdGVTbHVyKHRoaXMuc2NvcmUsIGZ0LCB0dCk7XHJcbiAgICBmdC5zdGFmZi5hZGRTdGFmZk1vZGlmaWVyKG1vZGlmaWVyKTtcclxuICAgIC8vIG1ha2Ugc3VyZSBzY29yZSBhbmQgYmFja3VwIGhhdmUgc2FtZSBJRCBmb3IgdW5kby5cclxuICAgIGNvbnN0IGFsdE1vZGlmaWVyID0gU21vT3BlcmF0aW9uLmNyZWF0ZVNsdXIodGhpcy5zdG9yZVNjb3JlLCBmdEFsdCEsIHR0QWx0ISk7XHJcbiAgICBhbHRNb2RpZmllci5hdHRycy5pZCA9IG1vZGlmaWVyLmF0dHJzLmlkO1xyXG4gICAgZnRBbHQ/LnN0YWZmLmFkZFN0YWZmTW9kaWZpZXIoYWx0TW9kaWZpZXIpO1xyXG4gICAgdGhpcy51bmRvU3RhZmZNb2RpZmllcignYWRkIHNsdXInLCBtb2RpZmllciwgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdGllIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdGllKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5saW5lT3BlcmF0aW9uKFNtb09wZXJhdGlvbi5jcmVhdGVUaWUpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyB1cGRhdGVab29tKHpvb21GYWN0b3I6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgb3JpZ2luYWwgPSB0aGlzLnNjb3JlLmxheW91dE1hbmFnZXIhLmdldEdsb2JhbExheW91dCgpO1xyXG4gICAgb3JpZ2luYWwuem9vbVNjYWxlID0gem9vbUZhY3RvcjtcclxuICAgIHRoaXMuc2NvcmUubGF5b3V0TWFuYWdlciEuZ2xvYmFsTGF5b3V0Lnpvb21TY2FsZSA9IHpvb21GYWN0b3I7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnBhZ2VNYXAudXBkYXRlWm9vbSh6b29tRmFjdG9yKTtcclxuICAgIHRoaXMucmVuZGVyZXIucGFnZU1hcC51cGRhdGVDb250YWluZXJPZmZzZXQodGhpcy5zY3JvbGxlci5zY3JvbGxTdGF0ZSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHNldCBnbG9iYWwgcGFnZSBmb3Igc2NvcmUsIHpvb20gZXRjLlxyXG4gICAqIEBwYXJhbSBsYXlvdXQgZ2xvYmFsIFNWRyBzZXR0aW5nc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldEdsb2JhbExheW91dChsYXlvdXQ6IFNtb0dsb2JhbExheW91dCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdTZXQgR2xvYmFsIExheW91dCcpO1xyXG4gICAgY29uc3Qgb3JpZ2luYWwgPSB0aGlzLnNjb3JlLmxheW91dE1hbmFnZXIhLmdldEdsb2JhbExheW91dCgpLnN2Z1NjYWxlO1xyXG4gICAgdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyIS51cGRhdGVHbG9iYWxMYXlvdXQobGF5b3V0KTtcclxuICAgIHRoaXMuc2NvcmUuc2NhbGVUZXh0R3JvdXBzKG9yaWdpbmFsIC8gbGF5b3V0LnN2Z1NjYWxlKTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5sYXlvdXRNYW5hZ2VyIS51cGRhdGVHbG9iYWxMYXlvdXQobGF5b3V0KTtcclxuICAgIHRoaXMucmVuZGVyZXIucmVyZW5kZXJBbGwoKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnByZXNlcnZlU2Nyb2xsKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgbGF5b3V0IG9mIGEgc2luZ2xlIHBhZ2VcclxuICAgKiBAcGFyYW0gbGF5b3V0IHBhZ2UgbGF5b3V0XHJcbiAgICogQHBhcmFtIHBhZ2VJbmRleCB3aGljaCBwYWdlIHRvIGNoYW5nZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldFBhZ2VMYXlvdXQobGF5b3V0OiBTbW9QYWdlTGF5b3V0LCBwYWdlSW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyIS51cGRhdGVQYWdlKGxheW91dCwgcGFnZUluZGV4KTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5sYXlvdXRNYW5hZ2VyIS51cGRhdGVQYWdlKGxheW91dCwgcGFnZUluZGV4KTtcclxuICAgIC8vIElmIHdlIGFyZSBpbiBwYXJ0IG1vZGUsIHNhdmUgdGhlIHBhZ2UgbGF5b3V0IGluIHRoZSBwYXJ0IHNvIGl0IGlzIHRoZXJlIG5leHQgdGltZVxyXG4gICAgLy8gdGhlIHBhcnQgaXMgZXhwb3NlZC5cclxuICAgIGlmICh0aGlzLmlzUGFydEV4cG9zZWQoKSkge1xyXG4gICAgICB0aGlzLnNjb3JlLnN0YXZlcy5mb3JFYWNoKChzdGFmZiwgc3RhZmZJeCkgPT4ge1xyXG4gICAgICAgIHN0YWZmLnBhcnRJbmZvLmxheW91dE1hbmFnZXIudXBkYXRlUGFnZShsYXlvdXQsIHBhZ2VJbmRleCk7XHJcbiAgICAgICAgY29uc3QgYWx0U3RhZmYgPSB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuc3RhZmZNYXBbc3RhZmZJeF1dO1xyXG4gICAgICAgIGFsdFN0YWZmLnBhcnRJbmZvLmxheW91dE1hbmFnZXIudXBkYXRlUGFnZShsYXlvdXQsIHBhZ2VJbmRleCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoVmlld3BvcnQoKTtcclxuICB9XHJcbiAgYXN5bmMgc2V0UGFnZUxheW91dHMobGF5b3V0OiBTbW9QYWdlTGF5b3V0LCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnU2V0IFBhZ2UgTGF5b3V0Jyk7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBmb3IgKGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyArK2kpIHtcclxuICAgICAgdGhpcy5zZXRQYWdlTGF5b3V0KGxheW91dCwgaSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyQWxsKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgbXVzaWMgZm9udFxyXG4gICAqIEBwYXJhbSBmYW1pbHkgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0RW5ncmF2aW5nRm9udEZhbWlseShmYW1pbHk6IGVuZ3JhdmluZ0ZvbnRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnNjb3JlLmVuZ3JhdmluZ0ZvbnQgPSBmYW1pbHk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuZW5ncmF2aW5nRm9udCA9IGZhbWlseTtcclxuICAgIHRoaXMucmVuZGVyZXIubm90aWZ5Rm9udENoYW5nZSgpOyAgIFxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwYXRlIGdsb2JhbCBmb250IHVzZWQgZm9yIGNob3JkIGNoYW5nZXNcclxuICAgKiBAcGFyYW0gZm9udEluZm9cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBzZXRDaG9yZEZvbnQoZm9udEluZm86IEZvbnRJbmZvKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ1NldCBDaG9yZCBGb250Jyk7XHJcbiAgICB0aGlzLnNjb3JlLnNldENob3JkRm9udChmb250SW5mbyk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuc2V0Q2hvcmRGb250KGZvbnRJbmZvKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVmcmVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgZm9udCB1c2VkIGZvciBseXJpY3NcclxuICAgKiBAcGFyYW0gZm9udEluZm8gXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0THlyaWNGb250KGZvbnRJbmZvOiBGb250SW5mbyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdTZXQgTHlyaWMgRm9udCcpO1xyXG4gICAgdGhpcy5zY29yZS5zZXRMeXJpY0ZvbnQoZm9udEluZm8pO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnNldEx5cmljRm9udChmb250SW5mbyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIHZhbHVlIGlmIGZhbHNlLCBseXJpYyB3aWR0aHMgZG9uJ3QgYWZmZWN0IG1lYXN1cmUgd2lkdGhcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBzZXRMeXJpY0FkanVzdFdpZHRoKHZhbHVlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ1NldCBMeXJpYyBBZGogV2lkdGgnKTtcclxuICAgIHRoaXMuc2NvcmUuc2V0THlyaWNBZGp1c3RXaWR0aCh2YWx1ZSk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuc2V0THlyaWNBZGp1c3RXaWR0aCh2YWx1ZSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogZGVsZXRlIHNlbGVjdGVkIG1lYXN1cmVzXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlTWVhc3VyZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnRGVsZXRlIE1lYXN1cmUnKTtcclxuICAgIGlmICh0aGlzLnN0b3JlU2NvcmUuc3RhdmVzWzBdLm1lYXN1cmVzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2VIZWxwZXJzLmVtcHR5UHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdCh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucyk7XHJcbiAgICAvLyBUSGUgbWVhc3VyZXMgZ2V0IHJlbnVtYmVyZWQsIHNvIGtlZXAgdGhlIGluZGV4IGF0IDBcclxuICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0aW9uc1swXS5zZWxlY3Rvci5tZWFzdXJlO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIC8vIFVucmVuZGVyIHRoZSBkZWxldGVkIG1lYXN1cmVcclxuICAgICAgdGhpcy5zY29yZS5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgICB0aGlzLnRyYWNrZXIuY2xlYXJNZWFzdXJlTWFwKHN0YWZmLm1lYXN1cmVzW2luZGV4XSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci51bnJlbmRlck1lYXN1cmUoc3RhZmYubWVhc3VyZXNbaW5kZXhdKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnVucmVuZGVyTWVhc3VyZShzdGFmZi5tZWFzdXJlc1tzdGFmZi5tZWFzdXJlcy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgLy8gQSBsaXR0bGUgaGFja3kgLSBkZWxldGUgdGhlIG1vZGlmaWVycyBpZiB0aGV5IHN0YXJ0IG9yIGVuZCBvblxyXG4gICAgICAgIC8vIHRoZSBtZWFzdXJlXHJcbiAgICAgICAgc3RhZmYucmVuZGVyYWJsZU1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xyXG4gICAgICAgICAgaWYgKG1vZGlmaWVyLnN0YXJ0U2VsZWN0b3IubWVhc3VyZSA9PT0gaW5kZXggfHwgbW9kaWZpZXIuZW5kU2VsZWN0b3IubWVhc3VyZSA9PT0gaW5kZXgpIHtcclxuICAgICAgICAgICAgaWYgKG1vZGlmaWVyLmxvZ2ljYWxCb3gpIHtcclxuICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5yZW5kZXJlci5yZW5kZXJlci5nZXRSZW5kZXJlcihtb2RpZmllci5sb2dpY2FsQm94KTtcclxuICAgICAgICAgICAgICBpZiAoY29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgJChjb250ZXh0LnN2ZykuZmluZCgnZy4nICsgbW9kaWZpZXIuYXR0cnMuaWQpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgLy8gUmVtb3ZlIHRoZSBTVkcgYXJ0aWZhY3RzIG1hcHBlZCB0byB0aGlzIG1lYXN1cmUuXHJcbiAgICAgIHRoaXMuc2NvcmUuZGVsZXRlTWVhc3VyZShpbmRleCk7XHJcbiAgICAgIHRoaXMuc3RvcmVTY29yZS5kZWxldGVNZWFzdXJlKGluZGV4KTtcclxuICAgICAgLy8gTm90ZTogaW5kZXggZG9lc24ndCBpbmNyZW1lbnQgc2luY2UgdGhlcmUgYXJlIG5vdyAxIGZld2VyIG1lYXN1cmVzXHJcbiAgICB9O1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGFkZCBudW1iZXIgb2YgbWVhc3VyZXMsIHdpdGggZGVmYXVsdCBub3RlcyBzZWxlY3Rpb25zXHJcbiAgICogQHBhcmFtIGFwcGVuZCBcclxuICAgKiBAcGFyYW0gbnVtYmVyVG9BZGQgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkTWVhc3VyZXMoYXBwZW5kOiBib29sZWFuLCBudW1iZXJUb0FkZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcG9zID0gMDtcclxuICAgIGxldCBpeCA9IDA7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ0FkZCBNZWFzdXJlJyk7XHJcbiAgICBmb3IgKGl4ID0gMDsgaXggPCBudW1iZXJUb0FkZDsgKytpeCkge1xyXG4gICAgICBjb25zdCBtZWFzdXJlID0gdGhpcy50cmFja2VyLmdldEZpcnN0TWVhc3VyZU9mU2VsZWN0aW9uKCk7XHJcbiAgICAgIGlmIChtZWFzdXJlKSB7XHJcbiAgICAgICAgY29uc3Qgbm1lYXN1cmUgPSBTbW9NZWFzdXJlLmdldERlZmF1bHRNZWFzdXJlV2l0aE5vdGVzKG1lYXN1cmUpO1xyXG4gICAgICAgIHBvcyA9IG1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXg7XHJcbiAgICAgICAgaWYgKGFwcGVuZCkge1xyXG4gICAgICAgICAgcG9zICs9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5tZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4ID0gcG9zO1xyXG4gICAgICAgIG5tZWFzdXJlLnNldEFjdGl2ZVZvaWNlKDApO1xyXG4gICAgICAgIHRoaXMuc2NvcmUuYWRkTWVhc3VyZShwb3MpO1xyXG4gICAgICAgIHRoaXMuc3RvcmVTY29yZS5hZGRNZWFzdXJlKHBvcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVmcmVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBhZGQgYSBzaW5nbGUgbWVhc3VyZSBiZWZvcmUgb3IgYWZ0ZXIgc2VsZWN0aW9uXHJcbiAgICogQHBhcmFtIGFwcGVuZCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBhZGRNZWFzdXJlKGFwcGVuZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdBZGQgTWVhc3VyZScpO1xyXG4gICAgbGV0IHBvcyA9IDA7XHJcbiAgICBjb25zdCBtZWFzdXJlID0gdGhpcy50cmFja2VyLmdldEZpcnN0TWVhc3VyZU9mU2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoIW1lYXN1cmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm1lYXN1cmUgPSBTbW9NZWFzdXJlLmdldERlZmF1bHRNZWFzdXJlV2l0aE5vdGVzKG1lYXN1cmUpO1xyXG4gICAgcG9zID0gbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleDtcclxuICAgIGlmIChhcHBlbmQpIHtcclxuICAgICAgcG9zICs9IDE7XHJcbiAgICB9XHJcbiAgICBubWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCA9IHBvcztcclxuICAgIG5tZWFzdXJlLnNldEFjdGl2ZVZvaWNlKDApO1xyXG4gICAgdGhpcy5zY29yZS5hZGRNZWFzdXJlKHBvcyk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuYWRkTWVhc3VyZShwb3MpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5jbGVhckxpbmUobWVhc3VyZSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogcmVtb3ZlIGFuIGVudGlyZSBsaW5lIG9mIG11c2ljXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVTdGFmZigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnUmVtb3ZlIEluc3RydW1lbnQnKTtcclxuICAgIGlmICh0aGlzLnN0b3JlU2NvcmUuc3RhdmVzLmxlbmd0aCA8IDIgfHwgdGhpcy5zY29yZS5zdGF2ZXMubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZUhlbHBlcnMuZW1wdHlQcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICAvLyBpZiB3ZSBhcmUgbG9va2luZyBhdCBhIHN1YnNldCBvZiB0aGUgc2NvcmUsXHJcbiAgICAvLyByZXZlcnQgdG8gdGhlIGZ1bGwgc2NvcmUgdmlldyBiZWZvcmUgcmVtb3ZpbmcgdGhlIHN0YWZmLlxyXG4gICAgY29uc3Qgc2VsID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnNbMF07XHJcbiAgICBjb25zdCBzY29yZVNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuICAgIGNvbnN0IHN0YWZmSW5kZXggPSBzY29yZVNlbCEuc2VsZWN0b3Iuc3RhZmY7XHJcbiAgICBTbW9PcGVyYXRpb24ucmVtb3ZlU3RhZmYodGhpcy5zdG9yZVNjb3JlLCBzdGFmZkluZGV4KTtcclxuICAgIHRoaXMudmlld0FsbCgpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIGFkZFN0YWZmKGluc3RydW1lbnQ6IFNtb1N5c3RlbVN0YWZmUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ0FkZCBJbnN0cnVtZW50Jyk7XHJcbiAgICAvLyBpZiB3ZSBhcmUgbG9va2luZyBhdCBhIHN1YnNldCBvZiB0aGUgc2NvcmUsIHdlIHdvbid0IHNlZSB0aGUgbmV3IHN0YWZmLiAgU29cclxuICAgIC8vIHJldmVydCB0byB0aGUgZnVsbCB2aWV3XHJcbiAgICBjb25zdCBzdGFmZiA9IFNtb09wZXJhdGlvbi5hZGRTdGFmZih0aGlzLnN0b3JlU2NvcmUsIGluc3RydW1lbnQpO1xyXG4gICAgY29uc3QgaW5zdEtleXMgPSBPYmplY3Qua2V5cyhzdGFmZi5tZWFzdXJlSW5zdHJ1bWVudE1hcCk7XHJcbiAgICAvLyB1cGRhdGUgdGhlIGtleSBzaWduYXR1cmVzIGZvciB0aGUgbmV3IHBhcnRcclxuICAgIGluc3RLZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBudW1LZXkgPSBwYXJzZUludChrZXksIDEwKTtcclxuICAgICAgY29uc3QgaW5zdCA9IHN0YWZmLm1lYXN1cmVJbnN0cnVtZW50TWFwW251bUtleV07XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uaW5uZXJTZWxlY3Rpb25zKHRoaXMuc3RvcmVTY29yZSwgaW5zdC5zdGFydFNlbGVjdG9yLCBpbnN0LmVuZFNlbGVjdG9yKTtcclxuICAgICAgU21vT3BlcmF0aW9uLmNoYW5nZUluc3RydW1lbnQoaW5zdCwgc2VsZWN0aW9ucyk7XHJcbiAgICB9KVxyXG4gICAgaWYgKGluc3RydW1lbnQuc3RhZmZJZCA+IDApIHtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zdG9yZVNjb3JlLCBpbnN0cnVtZW50LnN0YWZmSWQgLSAxLCAwKTtcclxuICAgICAgY29uc3Qgc2VsID0gU21vU2VsZWN0b3IuZGVmYXVsdDtcclxuICAgICAgc2VsLnN0YWZmID0gaW5zdHJ1bWVudC5zdGFmZklkIC0gMTtcclxuICAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICAgIGxldCBncnAgPSB0aGlzLnN0b3JlU2NvcmUuZ2V0U3lzdGVtR3JvdXBGb3JTdGFmZihzZWxlY3Rpb24pO1xyXG4gICAgICAgIGlmIChncnApIHtcclxuICAgICAgICAgIGdycC5lbmRTZWxlY3Rvci5zdGFmZiA9IGluc3RydW1lbnQuc3RhZmZJZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGdycCA9IG5ldyBTbW9TeXN0ZW1Hcm91cChTbW9TeXN0ZW1Hcm91cC5kZWZhdWx0cyk7XHJcbiAgICAgICAgICBncnAuc3RhcnRTZWxlY3Rvci5zdGFmZiA9IGluc3RydW1lbnQuc3RhZmZJZCAtIDE7XHJcbiAgICAgICAgICBncnAuZW5kU2VsZWN0b3Iuc3RhZmYgPSBpbnN0cnVtZW50LnN0YWZmSWQ7XHJcbiAgICAgICAgICB0aGlzLnN0b3JlU2NvcmUuc3lzdGVtR3JvdXBzLnB1c2goZ3JwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMudmlld0FsbCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgcGFydCBpbmZvIGFzc3VtZXMgdGhhdCB0aGUgcGFydCBpcyBjdXJyZW50bHkgZXhwb3NlZCAtIHRoYXRcclxuICAgKiBzdGFmZiAwIGlzIHRoZSBmaXJzdCBzdGFmZiBpbiB0aGUgcGFydCBwcmlvciB0byBlZGl0aW5nLlxyXG4gICAqIEBwYXJhbSBpbmZvXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlUGFydEluZm8oaW5mbzogU21vUGFydEluZm8pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdVcGRhdGUgcGFydCBpbmZvJyk7XHJcbiAgICBjb25zdCBzdG9yZVN0YWZmID0gdGhpcy5zdGFmZk1hcFswXSAtIGluZm8uc3RhdmVzQmVmb3JlO1xyXG4gICAgY29uc3QgcGFydExlbmd0aCA9IGluZm8uc3RhdmVzQmVmb3JlICsgaW5mby5zdGF2ZXNBZnRlciArIDE7XHJcbiAgICBjb25zdCByZXNldFZpZXcgPSAhU21vTGF5b3V0TWFuYWdlci5hcmVMYXlvdXRzRXF1YWwoaW5mby5sYXlvdXRNYW5hZ2VyLmdldEdsb2JhbExheW91dCgpLCB0aGlzLnNjb3JlLmxheW91dE1hbmFnZXIhLmdldEdsb2JhbExheW91dCgpKTtcclxuICAgIGNvbnN0IHJlc3RDaGFuZ2UgPSB0aGlzLnNjb3JlLnN0YXZlc1swXS5wYXJ0SW5mby5leHBhbmRNdWx0aW1lYXN1cmVSZXN0cyAhPSBpbmZvLmV4cGFuZE11bHRpbWVhc3VyZVJlc3RzO1xyXG4gICAgY29uc3Qgc3RhdmVzQ2hhbmdlID0gdGhpcy5zY29yZS5zdGF2ZXNbMF0ucGFydEluZm8uc3RhdmVzQWZ0ZXIgIT09IGluZm8uc3RhdmVzQWZ0ZXI7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgcGFydExlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG5TdGFmZkluZGV4ID0gc3RvcmVTdGFmZiArIGk7XHJcbiAgICAgIGNvbnN0IG5JbmZvID0gbmV3IFNtb1BhcnRJbmZvKGluZm8pO1xyXG4gICAgICBuSW5mby5zdGF2ZXNCZWZvcmUgPSBpO1xyXG4gICAgICBuSW5mby5zdGF2ZXNBZnRlciA9IHBhcnRMZW5ndGggLSBpIC0gMTtcclxuICAgICAgdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1tuU3RhZmZJbmRleF0ucGFydEluZm8gPSBuSW5mbztcclxuICAgICAgLy8gSWYgdGhlIHN0YWZmIGluZGV4IGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQsIFxyXG4gICAgICBjb25zdCBkaXNwbGF5ZWRJbmRleCA9IHRoaXMuc3RhZmZNYXAuZmluZEluZGV4KCh4KSA9PiB4ID09PSBuU3RhZmZJbmRleCk7XHJcbiAgICAgIGlmIChkaXNwbGF5ZWRJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgdGhpcy5zY29yZS5zdGF2ZXNbZGlzcGxheWVkSW5kZXhdLnBhcnRJbmZvID0gbmV3IFNtb1BhcnRJbmZvKG5JbmZvKTtcclxuICAgICAgICB0aGlzLnNjb3JlLmxheW91dE1hbmFnZXIgPSBuSW5mby5sYXlvdXRNYW5hZ2VyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocmVzZXRWaWV3IHx8IHJlc3RDaGFuZ2UgfHwgc3RhdmVzQ2hhbmdlKSB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5jb21wdXRlTXVsdGlwYXJ0UmVzdCh0aGlzLnNjb3JlKTtcclxuICAgICAgLy8gdGhpcy5yZXNldFBhcnRWaWV3KCk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIucmVyZW5kZXJBbGwoKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIHNpbXBsZXIgQVBJIGZvciBhcHBsaWNhdGlvbnMgdG8gYWRkIGEgbmV3IHN0YWZmIHRvIHRoZSBzY29yZS5cclxuICAgKiBAcGFyYW0gcGFyYW1zIC0gdGhlIGluc3RydW1lbnQsIHdoaWNoIGRldGVybWluZXMgY2xlZiwgZXRjLlxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZFN0YWZmU2ltcGxlKHBhcmFtczogUGFydGlhbDxTbW9JbnN0cnVtZW50UGFyYW1zPik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgaW5zdHJ1bWVudFBhcmFtcyA9IFNtb0luc3RydW1lbnQuZGVmYXVsdHM7XHJcbiAgICBpbnN0cnVtZW50UGFyYW1zLnN0YXJ0U2VsZWN0b3Iuc3RhZmYgPSBpbnN0cnVtZW50UGFyYW1zLmVuZFNlbGVjdG9yLnN0YWZmID0gdGhpcy5zY29yZS5zdGF2ZXMubGVuZ3RoO1xyXG4gICAgaW5zdHJ1bWVudFBhcmFtcy5jbGVmID0gcGFyYW1zLmNsZWYgPz8gaW5zdHJ1bWVudFBhcmFtcy5jbGVmO1xyXG5cclxuICAgIGNvbnN0IHN0YWZmUGFyYW1zID0gU21vU3lzdGVtU3RhZmYuZGVmYXVsdHM7XHJcbiAgICBzdGFmZlBhcmFtcy5zdGFmZklkID0gdGhpcy5zdG9yZVNjb3JlLnN0YXZlcy5sZW5ndGg7IC8vIGFkZCBhIHN0YWZmXHJcbiAgICBzdGFmZlBhcmFtcy5tZWFzdXJlSW5zdHJ1bWVudE1hcFswXSA9IG5ldyBTbW9JbnN0cnVtZW50KGluc3RydW1lbnRQYXJhbXMpO1xyXG4gICAgdGhpcy5hZGRTdGFmZihzdGFmZlBhcmFtcyk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNhdmUgdGhlIHNjb3JlIHRvIGxvY2FsIHN0b3JhZ2UuXHJcbiAgICovXHJcbiAgcXVpY2tTYXZlKCkge1xyXG4gICAgY29uc3Qgc2NvcmVTdHIgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlU2NvcmUuc2VyaWFsaXplKCkpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oc21vU2VyaWFsaXplLmxvY2FsU2NvcmUsIHNjb3JlU3RyKTtcclxuICB9XHJcbiAgdXBkYXRlUmVwZWF0Q291bnQoY291bnQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3JlcGVhdCBiYXInKTtcclxuICAgIGNvbnN0IHN5bWJvbCA9IGNvdW50ID4gMCA/IHRydWUgOiBmYWxzZTsgICAgXHJcbiAgICBtZWFzdXJlU2VsZWN0aW9ucy5mb3JFYWNoKChtcykgPT4ge1xyXG4gICAgICBjb25zdCBzdG9yZSA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24obXMpO1xyXG4gICAgICBtcy5tZWFzdXJlLnJlcGVhdENvdW50ID0gY291bnQ7XHJcbiAgICAgIG1zLm1lYXN1cmUucmVwZWF0U3ltYm9sID0gc3ltYm9sO1xyXG4gICAgICBpZiAoc3RvcmUpIHtcclxuICAgICAgICBzdG9yZS5tZWFzdXJlLnJlcGVhdENvdW50ID0gY291bnQ7XHJcbiAgICAgICAgc3RvcmUubWVhc3VyZS5yZXBlYXRTeW1ib2wgPSBzeW1ib2w7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBtZWFzdXJlIGZvcm1hdHRpbmcgcGFyYW1ldGVycyBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXHJcbiAgICogQHBhcmFtIGZvcm1hdCBnZW5lcmljIG1lYXN1cmUgZm9ybWF0dGluZyBwYXJhbWV0ZXJzXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgc2V0TWVhc3VyZUZvcm1hdChmb3JtYXQ6IFNtb01lYXN1cmVGb3JtYXQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgbGFiZWwgPSAnc2V0IG1lYXN1cmUgZm9ybWF0JztcclxuICAgIGNvbnN0IGZyb21TZWxlY3RvciA9IHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKS5zZWxlY3RvcjtcclxuICAgIGNvbnN0IHRvU2VsZWN0b3IgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKS5zZWxlY3RvcjtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkTWVhc3VyZXMoKTtcclxuICAgIC8vIElmIHRoZSBmb3JtYXR0aW5nIGlzIG9uIGEgcGFydCwgcHJlc2VydmUgaXQgaW4gdGhlIHBhcnQncyBpbmZvXHJcbiAgICBjb25zdCBpc1BhcnQgPSB0aGlzLmlzUGFydEV4cG9zZWQoKTtcclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKG0pID0+IHtcclxuICAgICAgdGhpcy5fdW5kb0NvbHVtbihsYWJlbCwgbS5zZWxlY3Rvci5tZWFzdXJlKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVGb3JtYXQodGhpcy5zY29yZSwgbSwgZm9ybWF0KTtcclxuICAgICAgaWYgKGlzUGFydCkge1xyXG4gICAgICAgIG0uc3RhZmYucGFydEluZm8ubWVhc3VyZUZvcm1hdHRpbmdbbS5tZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4XSA9IG5ldyBTbW9NZWFzdXJlRm9ybWF0KGZvcm1hdCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYWx0ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihtKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVGb3JtYXQodGhpcy5zdG9yZVNjb3JlLCBhbHQhLCBmb3JtYXQpO1xyXG4gICAgICBpZiAoaXNQYXJ0KSB7XHJcbiAgICAgICAgYWx0IS5zdGFmZi5wYXJ0SW5mby5tZWFzdXJlRm9ybWF0dGluZ1ttLm1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXhdID0gbmV3IFNtb01lYXN1cmVGb3JtYXQoZm9ybWF0KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJSZWN0YW5nbGUoZnJvbVNlbGVjdG9yLCB0b1NlbGVjdG9yKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHN5c3RlbSBicmVha3MgZnJvbSB0aGUgbWVhc3VyZSBmb3JtYXR0aW5nIGZvciBzZWxlY3RlZCBtZWFzdXJlc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHJlbW92ZVN5c3RlbUJyZWFrcygpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgbGFiZWwgPSAnc2V0IG1lYXN1cmUgZm9ybWF0JztcclxuICAgIGNvbnN0IGZyb21TZWxlY3RvciA9IHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKS5zZWxlY3RvcjtcclxuICAgIGNvbnN0IHRvU2VsZWN0b3IgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKS5zZWxlY3RvcjtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkTWVhc3VyZXMoKTtcclxuICAgIC8vIElmIHRoZSBmb3JtYXR0aW5nIGlzIG9uIGEgcGFydCwgcHJlc2VydmUgaXQgaW4gdGhlIHBhcnQncyBpbmZvXHJcbiAgICBjb25zdCBpc1BhcnQgPSB0aGlzLmlzUGFydEV4cG9zZWQoKTtcclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKG0pID0+IHtcclxuICAgICAgdGhpcy5fdW5kb0NvbHVtbihsYWJlbCwgbS5zZWxlY3Rvci5tZWFzdXJlKTtcclxuICAgICAgY29uc3QgZm9ybWF0ID0gbmV3IFNtb01lYXN1cmVGb3JtYXQobS5tZWFzdXJlLmZvcm1hdCk7XHJcbiAgICAgIGZvcm1hdC5zeXN0ZW1CcmVhayA9IGZhbHNlO1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0TWVhc3VyZUZvcm1hdCh0aGlzLnNjb3JlLCBtLCBmb3JtYXQpO1xyXG4gICAgICBpZiAoaXNQYXJ0KSB7XHJcbiAgICAgICAgbS5zdGFmZi5wYXJ0SW5mby5tZWFzdXJlRm9ybWF0dGluZ1ttLm1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXhdID0gbmV3IFNtb01lYXN1cmVGb3JtYXQoZm9ybWF0KTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhbHQgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKG0pO1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0TWVhc3VyZUZvcm1hdCh0aGlzLnN0b3JlU2NvcmUsIGFsdCEsIGZvcm1hdCk7XHJcbiAgICAgIGlmIChpc1BhcnQpIHtcclxuICAgICAgICBhbHQhLnN0YWZmLnBhcnRJbmZvLm1lYXN1cmVGb3JtYXR0aW5nW20ubWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleF0gPSBuZXcgU21vTWVhc3VyZUZvcm1hdChmb3JtYXQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlclJlY3RhbmdsZShmcm9tU2VsZWN0b3IsIHRvU2VsZWN0b3IpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICByZW51bWJlck1lYXN1cmVzKG1lYXN1cmVJbmRleDogbnVtYmVyLCBsb2NhbEluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2NvcmUudXBkYXRlUmVudW1iZXJpbmdNYXAobWVhc3VyZUluZGV4LCBsb2NhbEluZGV4KTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS51cGRhdGVSZW51bWJlcmluZ01hcChtZWFzdXJlSW5kZXgsIGxvY2FsSW5kZXgpO1xyXG4gICAgY29uc3QgbW1zZWwgPSBTbW9TZWxlY3Rpb24ubWVhc3VyZVNlbGVjdGlvbih0aGlzLnNjb3JlLCAwLCBtZWFzdXJlSW5kZXgpO1xyXG4gICAgaWYgKG1tc2VsKSB7XHJcbiAgICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbbW1zZWxdKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUGxheSB0aGUgbXVzaWMgZnJvbSB0aGUgc3RhcnRpbmcgc2VsZWN0aW9uXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgcGxheUZyb21TZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICB2YXIgbW0gPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigtMSk7XHJcbiAgICBpZiAoU3VpQXVkaW9QbGF5ZXIucGxheWluZ0luc3RhbmNlICYmIFN1aUF1ZGlvUGxheWVyLnBsYXlpbmdJbnN0YW5jZS5wYXVzZWQpIHtcclxuICAgICAgU3VpQXVkaW9QbGF5ZXIucGxheWluZ0luc3RhbmNlLnBsYXkoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKFN1aUF1ZGlvUGxheWVyLnBsYXlpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbmV3IFN1aUF1ZGlvUGxheWVyKHsgYXVkaW9BbmltYXRpb246IHRoaXMuYXVkaW9BbmltYXRpb24sIHNjb3JlOiB0aGlzLnNjb3JlLCBzdGFydEluZGV4OiBtbS5zZWxlY3Rvci5tZWFzdXJlLCB2aWV3OiB0aGlzIH0pLnBsYXkoKTtcclxuICB9XHJcbiAgc3RvcFBsYXllcigpIHtcclxuICAgIFN1aUF1ZGlvUGxheWVyLnN0b3BQbGF5ZXIoKTtcclxuICB9XHJcbiAgcGF1c2VQbGF5ZXIoKSB7XHJcbiAgICBTdWlBdWRpb1BsYXllci5wYXVzZVBsYXllcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJveHkgY2FsbHMgdG8gbW92ZSB0aGUgdHJhY2tlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byB0aGVcclxuICAgKiBydWxlcyBvZiB0aGUgJ0hvbWUnIGtleSAoZGVwZW5kaW5nIG9uIHNoaWZ0L2N0cmwvYWx0KVxyXG4gICAqIEBwYXJhbSBldiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlSG9tZShldjogS2V5RXZlbnQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLm1vdmVIb21lKGV2KTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQcm94eSBjYWxscyB0byBtb3ZlIHRoZSB0cmFja2VyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHRoZVxyXG4gICAqIHJ1bGVzIG9mIHRoZSAnRW5kJyBrZXkgKGRlcGVuZGluZyBvbiBzaGlmdC9jdHJsL2FsdClcclxuICAgKiBAcGFyYW0gZXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgIGFzeW5jIG1vdmVFbmQoZXY6IEtleUV2ZW50KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlRW5kKGV2KTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHcm93IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSBvbmUgdG8gdGhlIGxlZnQsIGlmIHBvc3NpYmxlXHJcbiAgICogQHBhcmFtIGV2IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gICBhc3luYyBncm93U2VsZWN0aW9uTGVmdCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmdyb3dTZWxlY3Rpb25MZWZ0KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR3JvdyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgb25lIHRvIHRoZSByaWdodCwgaWYgcG9zc2libGVcclxuICAgKiBAcGFyYW0gZXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgIGFzeW5jIGdyb3dTZWxlY3Rpb25SaWdodCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmdyb3dTZWxlY3Rpb25SaWdodCgpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNlbGVjdCB0aGUgbmV4dCB0YWJiYWJsZSBtb2RpZmllciBuZWFyIG9uZSBvZiB0aGUgc2VsZWN0ZWQgbm90ZXNcclxuICAgKiBAcGFyYW0ga2V5RXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgYWR2YW5jZU1vZGlmaWVyU2VsZWN0aW9uKGtleUV2OiBLZXlFdmVudCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIuYWR2YW5jZU1vZGlmaWVyU2VsZWN0aW9uKGtleUV2KTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZWxlY3QgdGhlIG5leHQgZW50aXJlIG1lYXN1cmUsIGlmIHBvc3NpYmxlXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgZ3Jvd1NlbGVjdGlvblJpZ2h0TWVhc3VyZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmdyb3dTZWxlY3Rpb25SaWdodE1lYXN1cmUoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZHZhbmNlIGN1cnNvciBmb3J3YXJkcywgaWYgcG9zc2libGVcclxuICAgKiBAcGFyYW0gZXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgbW92ZVNlbGVjdGlvblJpZ2h0KCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIubW92ZVNlbGVjdGlvblJpZ2h0KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWR2YW5jZSBjdXJzb3IgYmFja3dhcmRzLCBpZiBwb3NzaWJsZVxyXG4gICAqIEBwYXJhbSBldiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uTGVmdCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLm1vdmVTZWxlY3Rpb25MZWZ0KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWR2YW5jZSBjdXJzb3IgYmFjayBlbnRpcmUgbWVhc3VyZSwgaWYgcG9zc2libGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uTGVmdE1lYXN1cmUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uTGVmdE1lYXN1cmUoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZHZhbmNlIGN1cnNvciBmb3J3YXJkIG9uZSBtZWFzdXJlLCBpZiBwb3NzaWJsZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIG1vdmVTZWxlY3Rpb25SaWdodE1lYXN1cmUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uUmlnaHRNZWFzdXJlKCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTW92ZSBjdXJzb3IgdG8gYSBoaWdoZXIgcGl0Y2ggaW4gdGhlIGN1cnJlbnQgY2hvcmQsIHdpdGggd3JhcFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIG1vdmVTZWxlY3Rpb25QaXRjaFVwKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIubW92ZVNlbGVjdGlvblBpdGNoVXAoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBNb3ZlIGN1cnNvciB0byBhIGxvd2VyIHBpdGNoIGluIHRoZSBjdXJyZW50IGNob3JkLCB3aXRoIHdyYXBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uUGl0Y2hEb3duKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIubW92ZVNlbGVjdGlvblBpdGNoRG93bigpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE1vdmUgY3Vyc29yIHVwIGEgc3RhZmYgaW4gdGhlIHN5c3RlbSwgaWYgcG9zc2libGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uVXAoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uVXAoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBNb3ZlIGN1cnNvciBkb3duIGEgc3RhZmYgaW4gdGhlIHN5c3RlbSwgaWYgcG9zc2libGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICAgYXN5bmMgbW92ZVNlbGVjdGlvbkRvd24oKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uRG93bigpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgY3VycmVudCBzdWdnZXN0aW9ucyAoaG92ZXIgZWxlbWVudCkgYXMgdGhlIHNlbGVjdGlvblxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gICBhc3luYyBzZWxlY3RTdWdnZXN0aW9uKGV2RGF0YTogS2V5RXZlbnQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdFN1Z2dlc3Rpb24oZXZEYXRhKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGJveCwgYW5kIG1ha2UgaXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXHJcbiAgICogICovXHJcbiAgYXN5bmMgaW50ZXJzZWN0aW5nQXJ0aWZhY3QoZXZEYXRhOiBTdmdCb3gpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmludGVyc2VjdGluZ0FydGlmYWN0KGV2RGF0YSk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9ICBcclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/render/sui/scoreViewOperations.ts\n\n}");
361
361
 
362
362
  /***/ }),
363
363
 
@@ -423,7 +423,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
423
423
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
424
424
 
425
425
  "use strict";
426
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiTracker: () => (/* binding */ SuiTracker)\n/* harmony export */ });\n/* harmony import */ var _mapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mapper */ \"./src/render/sui/mapper.ts\");\n/* harmony import */ var _svgHelpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../smo/xform/selections */ \"./src/smo/xform/selections.ts\");\n/* harmony import */ var _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../common/serializationHelpers */ \"./src/common/serializationHelpers.js\");\n/* harmony import */ var _audio_oscillator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../audio/oscillator */ \"./src/render/audio/oscillator.ts\");\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/data/common */ \"./src/smo/data/common.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n\n\n\n\n\n\n/**\n * SuiTracker\n * A tracker maps the UI elements to the logical elements ,and allows the user to\n * move through the score and make selections, for navigation and editing.\n * @category SuiRender\n */\nclass SuiTracker extends _mapper__WEBPACK_IMPORTED_MODULE_0__.SuiMapper {\n static get strokes() {\n return {\n suggestion: {\n strokeName: 'suggestion',\n stroke: '#fc9',\n strokeWidth: 3,\n strokeDasharray: '4,1',\n fill: 'none',\n opacity: 1.0\n },\n selection: {\n strokeName: 'selection',\n stroke: '#99d',\n strokeWidth: 3,\n strokeDasharray: 2,\n fill: 'none',\n opacity: 1.0\n },\n staffModifier: {\n strokeName: 'staffModifier',\n stroke: '#933',\n strokeWidth: 3,\n fill: 'none',\n strokeDasharray: 0,\n opacity: 1.0\n }, pitchSelection: {\n strokeName: 'pitchSelection',\n stroke: '#933',\n strokeWidth: 3,\n fill: 'none',\n strokeDasharray: 0,\n opacity: 1.0\n }\n };\n }\n constructor(renderer, scroller) {\n super(renderer, scroller);\n this.idleTimer = Date.now();\n this.musicCursorGlyph = null;\n this.deferPlayAdvance = false;\n }\n // ### renderElement\n // the element the score is rendered on\n get renderElement() {\n return this.renderer.renderElement;\n }\n get score() {\n return this.renderer.score;\n }\n getIdleTime() {\n return this.idleTimer;\n }\n playSelection(artifact) {\n if (!this.deferPlayAdvance && this.score) {\n _audio_oscillator__WEBPACK_IMPORTED_MODULE_4__.SuiOscillator.playSelectionNow(artifact, this.score, 1);\n }\n else {\n this.deferPlayAdvance = false;\n }\n }\n deferNextAutoPlay() {\n if (this.score) {\n // don't play on advance if we've just added a note and played it because they overlap\n if (this.score.preferences.autoAdvance && this.score.preferences.autoPlay) {\n this.deferPlayAdvance = true;\n }\n }\n }\n getSelectedModifier() {\n if (this.modifierSelections.length) {\n return this.modifierSelections[0];\n }\n return null;\n }\n getSelectedModifiers() {\n return this.modifierSelections;\n }\n static serializeEvent(evKey) {\n if (!evKey) {\n return [];\n }\n const rv = {};\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_3__.smoSerialize.serializedMerge(['type', 'shiftKey', 'ctrlKey', 'altKey', 'key', 'keyCode'], evKey, rv);\n return rv;\n }\n advanceModifierSelection(keyEv) {\n if (!keyEv) {\n return;\n }\n this.idleTimer = Date.now();\n const offset = keyEv.key === 'ArrowLeft' ? -1 : 1;\n this.modifierIndex = this.modifierIndex + offset;\n this.modifierIndex = (this.modifierIndex === -2 && this.localModifiers.length) ?\n this.localModifiers.length - 1 : this.modifierIndex;\n if (this.modifierIndex >= this.localModifiers.length || this.modifierIndex < 0) {\n this.modifierIndex = -1;\n this.modifierSelections = [];\n $('.vf-staffModifier').remove();\n return;\n }\n const local = this.localModifiers[this.modifierIndex];\n const box = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.smoBox(local.box);\n this.modifierSelections = [{ index: 0, box, modifier: local.modifier, selection: local.selection }];\n this._highlightModifier();\n }\n static stringifyBox(box) {\n return '{x:' + box.x + ',y:' + box.y + ',width:' + box.width + ',height:' + box.height + '}';\n }\n // ### _getOffsetSelection\n // Get the selector that is the offset of the first existing selection\n _getOffsetSelection(offset) {\n if (!this.score) {\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.default;\n }\n let testSelection = this.getExtremeSelection(Math.sign(offset));\n const scopyTick = JSON.parse(JSON.stringify(testSelection.selector));\n const scopyMeasure = JSON.parse(JSON.stringify(testSelection.selector));\n scopyTick.tick += offset;\n scopyMeasure.measure += offset;\n const targetMeasure = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.measureSelection(this.score, testSelection.selector.staff, scopyMeasure.measure);\n if (targetMeasure && targetMeasure.measure && targetMeasure.measure.voices.length <= scopyMeasure.voice) {\n scopyMeasure.voice = 0;\n }\n if (targetMeasure && targetMeasure.measure) {\n scopyMeasure.tick = (offset < 0) ? targetMeasure.measure.voices[scopyMeasure.voice].notes.length - 1 : 0;\n }\n if (testSelection.measure.voices.length > scopyTick.voice &&\n testSelection.measure.voices[scopyTick.voice].notes.length > scopyTick.tick && scopyTick.tick >= 0) {\n if (testSelection.selector.voice !== testSelection.measure.getActiveVoice()) {\n scopyTick.voice = testSelection.measure.getActiveVoice();\n testSelection = this._getClosestTick(scopyTick);\n return testSelection.selector;\n }\n return scopyTick;\n }\n else if (targetMeasure &&\n scopyMeasure.measure < testSelection.staff.measures.length && scopyMeasure.measure >= 0) {\n return scopyMeasure;\n }\n return testSelection.selector;\n }\n getSelectedGraceNotes() {\n if (!this.modifierSelections.length) {\n return [];\n }\n const ff = this.modifierSelections.filter((mm) => { var _a, _b; return ((_b = (_a = mm.modifier) === null || _a === void 0 ? void 0 : _a.attrs) === null || _b === void 0 ? void 0 : _b.type) === 'SmoGraceNote'; });\n return ff;\n }\n isGraceNoteSelected() {\n if (this.modifierSelections.length) {\n const ff = this.modifierSelections.findIndex((mm) => mm.modifier.attrs.type === 'SmoGraceNote');\n return ff >= 0;\n }\n return false;\n }\n _growGraceNoteSelections(offset) {\n var _a;\n this.idleTimer = Date.now();\n const far = this.modifierSelections.filter((mm) => mm.modifier.attrs.type === 'SmoGraceNote');\n if (!far.length) {\n return;\n }\n const ix = (offset < 0) ? 0 : far.length - 1;\n const sel = far[ix];\n const left = this.localModifiers.filter((mt) => {\n var _a, _b;\n return ((_b = (_a = mt.modifier) === null || _a === void 0 ? void 0 : _a.attrs) === null || _b === void 0 ? void 0 : _b.type) === 'SmoGraceNote' && sel.selection && mt.selection &&\n _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(mt.selection.selector, sel.selection.selector);\n });\n if (ix + offset < 0 || ix + offset >= left.length) {\n return;\n }\n const leftSel = left[ix + offset];\n if (!leftSel) {\n console.warn('bad selector in _growGraceNoteSelections');\n }\n leftSel.box = (_a = leftSel.box) !== null && _a !== void 0 ? _a : _smo_data_common__WEBPACK_IMPORTED_MODULE_5__.SvgBox.default;\n this.modifierSelections.push(leftSel);\n this._highlightModifier();\n }\n get autoPlay() {\n return this.renderer.score ? this.renderer.score.preferences.autoPlay : false;\n }\n growSelectionRight() {\n this._growSelectionRight(false);\n }\n _growSelectionRight(skipPlay) {\n this.idleTimer = Date.now();\n if (this.isGraceNoteSelected()) {\n this._growGraceNoteSelections(1);\n return 0;\n }\n const nselect = this._getOffsetSelection(1);\n // already selected\n const artifact = this._getClosestTick(nselect);\n if (!artifact) {\n return 0;\n }\n if (this.selections.find((sel) => _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(sel.selector, artifact.selector))) {\n return 0;\n }\n if (!this.mapping && this.autoPlay && skipPlay === false && this.score) {\n this.playSelection(artifact);\n }\n this.selections.push(artifact);\n this.deferHighlight();\n this._createLocalModifiersList();\n return artifact.note.tickCount;\n }\n moveHome(keyEvent) {\n var _a, _b;\n const evKey = keyEvent !== null && keyEvent !== void 0 ? keyEvent : (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_5__.defaultKeyEvent)();\n this.idleTimer = Date.now();\n const ls = this.selections[0].staff;\n if (evKey.ctrlKey) {\n const mm = ls.measures[0];\n const homeSel = this._getClosestTick({ staff: ls.staffId,\n measure: 0, voice: mm.getActiveVoice(), tick: 0, pitches: [] });\n if (evKey.shiftKey) {\n this._selectBetweenSelections(this.selections[0], homeSel);\n }\n else {\n this.selections = [homeSel];\n this.deferHighlight();\n this._createLocalModifiersList();\n if (homeSel.measure.svg.logicalBox) {\n this.scroller.scrollVisibleBox(homeSel.measure.svg.logicalBox);\n }\n }\n }\n else {\n const system = this.selections[0].measure.svg.lineIndex;\n const lm = ls.measures.find((mm) => mm.svg.lineIndex === system && mm.measureNumber.systemIndex === 0);\n const mm = lm;\n const homeSel = this._getClosestTick({ staff: ls.staffId,\n measure: mm.measureNumber.measureIndex, voice: mm.getActiveVoice(),\n tick: 0, pitches: [] });\n if (evKey.shiftKey) {\n this._selectBetweenSelections(this.selections[0], homeSel);\n }\n else if ((_b = (_a = homeSel === null || homeSel === void 0 ? void 0 : homeSel.measure) === null || _a === void 0 ? void 0 : _a.svg) === null || _b === void 0 ? void 0 : _b.logicalBox) {\n this.selections = [homeSel];\n this.scroller.scrollVisibleBox(homeSel.measure.svg.logicalBox);\n this.deferHighlight();\n this._createLocalModifiersList();\n }\n }\n }\n moveEnd(keyEvent) {\n this.idleTimer = Date.now();\n const ls = this.selections[0].staff;\n const evKey = keyEvent !== null && keyEvent !== void 0 ? keyEvent : (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_5__.defaultKeyEvent)();\n if (evKey.ctrlKey) {\n const lm = ls.measures[ls.measures.length - 1];\n const voiceIx = lm.getActiveVoice();\n const voice = lm.voices[voiceIx];\n const endSel = this._getClosestTick({ staff: ls.staffId,\n measure: ls.measures.length - 1, voice: voiceIx, tick: voice.notes.length - 1, pitches: [] });\n if (evKey.shiftKey) {\n this._selectBetweenSelections(this.selections[0], endSel);\n }\n else {\n this.selections = [endSel];\n this.deferHighlight();\n this._createLocalModifiersList();\n if (endSel.measure.svg.logicalBox) {\n this.scroller.scrollVisibleBox(endSel.measure.svg.logicalBox);\n }\n }\n }\n else {\n const system = this.selections[0].measure.svg.lineIndex;\n // find the largest measure index on this staff in this system\n const measures = ls.measures.filter((mm) => mm.svg.lineIndex === system);\n const lm = measures.reduce((a, b) => b.measureNumber.measureIndex > a.measureNumber.measureIndex ? b : a);\n const ticks = lm.voices[lm.getActiveVoice()].notes.length;\n const endSel = this._getClosestTick({ staff: ls.staffId,\n measure: lm.measureNumber.measureIndex, voice: lm.getActiveVoice(), tick: ticks - 1, pitches: [] });\n if (evKey.shiftKey) {\n this._selectBetweenSelections(this.selections[0], endSel);\n }\n else {\n this.selections = [endSel];\n this.deferHighlight();\n this._createLocalModifiersList();\n if (endSel.measure.svg.logicalBox) {\n this.scroller.scrollVisibleBox(endSel.measure.svg.logicalBox);\n }\n }\n }\n }\n growSelectionRightMeasure() {\n let toSelect = 0;\n const rightmost = this.getExtremeSelection(1);\n const ticksLeft = rightmost.measure.voices[rightmost.measure.activeVoice]\n .notes.length - rightmost.selector.tick;\n if (ticksLeft === 0) {\n if (rightmost.selector.measure < rightmost.staff.measures.length) {\n const mix = rightmost.selector.measure + 1;\n rightmost.staff.measures[mix].setActiveVoice(rightmost.selector.voice);\n toSelect = rightmost.staff.measures[mix]\n .voices[rightmost.staff.measures[mix].activeVoice].notes.length;\n }\n }\n else {\n toSelect = ticksLeft;\n }\n while (toSelect > 0) {\n this._growSelectionRight(true);\n toSelect -= 1;\n }\n }\n growSelectionLeft() {\n if (this.isGraceNoteSelected()) {\n this._growGraceNoteSelections(-1);\n return 0;\n }\n this.idleTimer = Date.now();\n const nselect = this._getOffsetSelection(-1);\n // already selected\n const artifact = this._getClosestTick(nselect);\n if (!artifact) {\n return 0;\n }\n if (this.selections.find((sel) => _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(sel.selector, artifact.selector))) {\n return 0;\n }\n artifact.measure.setActiveVoice(nselect.voice);\n this.selections.push(artifact);\n if (this.autoPlay && this.score) {\n this.playSelection(artifact);\n }\n this.deferHighlight();\n this._createLocalModifiersList();\n return artifact.note.tickCount;\n }\n // if we are being moved right programmatically, avoid playing the selected note.\n moveSelectionRight() {\n if (this.selections.length === 0 || this.score === null) {\n return;\n }\n const skipPlay = !this.score.preferences.autoPlay;\n // const original = JSON.parse(JSON.stringify(this.getExtremeSelection(-1).selector));\n const nselect = this._getOffsetSelection(1);\n // skip any measures that are not displayed due to rest or repetition\n const mselect = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.measureSelection(this.score, nselect.staff, nselect.measure);\n if (mselect === null || mselect === void 0 ? void 0 : mselect.measure.svg.multimeasureLength) {\n nselect.measure += mselect === null || mselect === void 0 ? void 0 : mselect.measure.svg.multimeasureLength;\n }\n if (mselect) {\n mselect.measure.setActiveVoice(nselect.voice);\n }\n this._replaceSelection(nselect, skipPlay);\n }\n moveSelectionLeft() {\n if (this.selections.length === 0 || this.score === null) {\n return;\n }\n const nselect = this._getOffsetSelection(-1);\n // Skip multimeasure rests in parts\n const mselect = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.measureSelection(this.score, nselect.staff, nselect.measure);\n while (nselect.measure > 0 && mselect && (mselect.measure.svg.hideMultimeasure || mselect.measure.svg.multimeasureLength > 0)) {\n nselect.measure -= 1;\n }\n if (mselect) {\n mselect.measure.setActiveVoice(nselect.voice);\n }\n this._replaceSelection(nselect, false);\n }\n moveSelectionLeftMeasure() {\n this._moveSelectionMeasure(-1);\n }\n moveSelectionRightMeasure() {\n this._moveSelectionMeasure(1);\n }\n _moveSelectionMeasure(offset) {\n const selection = this.getExtremeSelection(Math.sign(offset));\n this.idleTimer = Date.now();\n const selector = JSON.parse(JSON.stringify(selection.selector));\n selector.measure += offset;\n selector.tick = 0;\n const selObj = this._getClosestTick(selector);\n if (selObj) {\n this.selections = [selObj];\n }\n this.deferHighlight();\n this._createLocalModifiersList();\n }\n _moveStaffOffset(offset) {\n if (this.selections.length === 0 || this.score === null) {\n return;\n }\n this.idleTimer = Date.now();\n const nselector = JSON.parse(JSON.stringify(this.selections[0].selector));\n nselector.staff = this.score.incrementActiveStaff(offset);\n this.selections = [this._getClosestTick(nselector)];\n this.deferHighlight();\n this._createLocalModifiersList();\n }\n removePitchSelection() {\n if (this.outlines['pitchSelection']) {\n if (this.outlines['pitchSelection'].element) {\n this.outlines['pitchSelection'].element.remove();\n }\n delete this.outlines['pitchSelection'];\n }\n }\n // ### _moveSelectionPitch\n // Suggest a specific pitch in a chord, so we can transpose just the one note vs. the whole chord.\n _moveSelectionPitch(index) {\n this.idleTimer = Date.now();\n if (!this.selections.length) {\n return;\n }\n const sel = this.selections[0];\n const note = sel.note;\n if (note.pitches.length < 2) {\n this.pitchIndex = -1;\n this.removePitchSelection();\n return;\n }\n this.pitchIndex = (this.pitchIndex + index) % note.pitches.length;\n sel.selector.pitches = [];\n sel.selector.pitches.push(this.pitchIndex);\n this._highlightPitchSelection(note, this.pitchIndex);\n }\n moveSelectionPitchUp() {\n this._moveSelectionPitch(1);\n }\n moveSelectionPitchDown() {\n if (!this.selections.length) {\n return;\n }\n this._moveSelectionPitch(this.selections[0].note.pitches.length - 1);\n }\n moveSelectionUp() {\n this._moveStaffOffset(-1);\n }\n moveSelectionDown() {\n this._moveStaffOffset(1);\n }\n containsArtifact() {\n return this.selections.length > 0;\n }\n _replaceSelection(nselector, skipPlay) {\n if (this.score === null) {\n return;\n }\n var artifact = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.noteSelection(this.score, nselector.staff, nselector.measure, nselector.voice, nselector.tick);\n if (!artifact) {\n artifact = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.noteSelection(this.score, nselector.staff, nselector.measure, 0, nselector.tick);\n }\n if (!artifact) {\n artifact = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.noteSelection(this.score, nselector.staff, nselector.measure, 0, 0);\n }\n if (!artifact) {\n // disappeared - default to start\n artifact = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.noteSelection(this.score, 0, 0, 0, 0);\n }\n if (!skipPlay && this.autoPlay && artifact) {\n this.playSelection(artifact);\n }\n if (!artifact) {\n return;\n }\n artifact.measure.setActiveVoice(nselector.voice);\n // clear modifier selections\n this.clearModifierSelections();\n this.score.setActiveStaff(nselector.staff);\n const mapKey = Object.keys(this.measureNoteMap).find((k) => artifact && _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(this.measureNoteMap[k].selector, artifact.selector));\n if (!mapKey) {\n return;\n }\n const mapped = this.measureNoteMap[mapKey];\n // If this is a new selection, remove pitch-specific and replace with note-specific\n if (!nselector.pitches || nselector.pitches.length === 0) {\n this.pitchIndex = -1;\n }\n this.selections = [mapped];\n this.deferHighlight();\n this._createLocalModifiersList();\n }\n getFirstMeasureOfSelection() {\n if (this.selections.length) {\n return this.selections[0].measure;\n }\n return null;\n }\n // ## measureIterator\n // Description: iterate over the any measures that are part of the selection\n getSelectedMeasures() {\n const set = [];\n const rv = [];\n if (!this.score) {\n return [];\n }\n this.selections.forEach((sel) => {\n const measure = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.measureSelection(this.score, sel.selector.staff, sel.selector.measure);\n if (measure) {\n const ix = measure.selector.measure;\n if (set.indexOf(ix) === -1) {\n set.push(ix);\n rv.push(measure);\n }\n }\n });\n return rv;\n }\n _addSelection(selection) {\n const ar = this.selections.filter((sel) => _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.neq(sel.selector, selection.selector));\n if (this.autoPlay && this.score) {\n this.playSelection(selection);\n }\n ar.push(selection);\n this.selections = ar;\n }\n _selectFromToInStaff(score, sel1, sel2) {\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.innerSelections(score, sel1.selector, sel2.selector);\n /* .filter((ff) =>\n ff.selector.voice === sel1.measure.activeVoice\n ); */\n this.selections = [];\n // Get the actual selections from our map, since the client bounding boxes are already computed\n selections.forEach((sel) => {\n const key = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.getNoteKey(sel.selector);\n sel.measure.setActiveVoice(sel.selector.voice);\n // Skip measures that are not rendered because they are part of a multi-rest\n if (this.measureNoteMap && this.measureNoteMap[key]) {\n this.selections.push(this.measureNoteMap[key]);\n }\n });\n if (this.selections.length === 0) {\n this.selections = [sel1];\n }\n this.idleTimer = Date.now();\n }\n _selectBetweenSelections(s1, s2) {\n var _a;\n const score = (_a = this.renderer.score) !== null && _a !== void 0 ? _a : null;\n if (!score) {\n return;\n }\n const min = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.gt(s1.selector, s2.selector) ? s2 : s1;\n const max = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.lt(min.selector, s2.selector) ? s2 : s1;\n this._selectFromToInStaff(score, min, max);\n this._createLocalModifiersList();\n this.highlightQueue.selectionCount = this.selections.length;\n this.deferHighlight();\n }\n selectSuggestion(ev) {\n if (!this.suggestion || !this.suggestion.measure || this.score === null) {\n return;\n }\n this.idleTimer = Date.now();\n if (this.modifierSuggestion) {\n this.modifierIndex = -1;\n this.modifierSelections = [this.modifierSuggestion];\n this.modifierSuggestion = null;\n this.createLocalModifiersFromModifierTabs(this.modifierSelections);\n // If we selected due to a mouse click, move the selection to the\n // selected modifier\n this._highlightModifier();\n return;\n }\n else if (ev.type === 'click') {\n this.clearModifierSelections(); // if we click on a non-modifier, clear the\n // modifier selections\n }\n if (ev.shiftKey) {\n const sel1 = this.getExtremeSelection(-1);\n if (sel1.selector.staff === this.suggestion.selector.staff) {\n this._selectBetweenSelections(sel1, this.suggestion);\n return;\n }\n }\n if (ev.ctrlKey) {\n this._addSelection(this.suggestion);\n this._createLocalModifiersList();\n this.deferHighlight();\n return;\n }\n if (this.autoPlay) {\n this.playSelection(this.suggestion);\n }\n const preselected = this.selections[0] ?\n _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(this.suggestion.selector, this.selections[0].selector) && this.selections.length === 1 : false;\n if (this.selections.length === 0) {\n this.selections.push(this.suggestion);\n }\n const note = this.selections[0].note;\n if (preselected && note.pitches.length > 1) {\n this.pitchIndex = (this.pitchIndex + 1) % note.pitches.length;\n this.selections[0].selector.pitches = [this.pitchIndex];\n }\n else {\n const selection = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.noteFromSelector(this.score, this.suggestion.selector);\n if (selection) {\n selection.box = JSON.parse(JSON.stringify(this.suggestion.box));\n selection.scrollBox = JSON.parse(JSON.stringify(this.suggestion.scrollBox));\n this.selections = [selection];\n }\n }\n if (preselected && this.modifierSelections.length) {\n const mods = this.modifierSelections.filter((mm) => mm.selection && _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(mm.selection.selector, this.selections[0].selector));\n if (mods.length) {\n const modToAdd = mods[0];\n if (!modToAdd) {\n console.warn('bad modifier selection in selectSuggestion 2');\n }\n this.modifierSelections[0] = modToAdd;\n this.modifierIndex = mods[0].index;\n this._highlightModifier();\n return;\n }\n }\n this.score.setActiveStaff(this.selections[0].selector.staff);\n this.deferHighlight();\n this._createLocalModifiersList();\n }\n _setModifierAsSuggestion(artifact) {\n if (!artifact.box) {\n return;\n }\n this.modifierSuggestion = artifact;\n this._drawRect(artifact.box, 'suggestion');\n }\n _setArtifactAsSuggestion(artifact) {\n let sameSel = null;\n let i = 0;\n for (i = 0; i < this.selections.length; ++i) {\n const ss = this.selections[i];\n if (ss && _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(ss.selector, artifact.selector)) {\n sameSel = ss;\n break;\n }\n }\n if (sameSel || !artifact.box) {\n return;\n }\n this.modifierSuggestion = null;\n this.suggestion = artifact;\n this._drawRect(artifact.box, 'suggestion');\n }\n _highlightModifier() {\n let box = null;\n if (!this.modifierSelections.length) {\n return;\n }\n this.removeModifierSelectionBox();\n this.modifierSelections.forEach((artifact) => {\n var _a;\n if (box === null) {\n box = (_a = artifact.modifier.logicalBox) !== null && _a !== void 0 ? _a : null;\n }\n else {\n box = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.unionRect(box, _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.smoBox(artifact.modifier.logicalBox));\n }\n });\n if (box === null) {\n return;\n }\n this._drawRect(box, 'staffModifier');\n }\n _highlightPitchSelection(note, index) {\n const noteDiv = $(this.renderElement).find('#' + note.renderId);\n const heads = noteDiv.find('.vf-notehead');\n if (!heads.length) {\n return;\n }\n const headEl = heads[index];\n const pageContext = this.renderer.pageMap.getRendererFromModifier(note);\n $(pageContext.svg).find('.vf-pitchSelection').remove();\n const box = pageContext.offsetBbox(headEl);\n this._drawRect(box, 'pitchSelection');\n }\n _highlightActiveVoice(selection) {\n let i = 0;\n const selector = selection.selector;\n for (i = 1; i <= 4; ++i) {\n const cl = 'v' + i.toString() + '-active';\n $('body').removeClass(cl);\n }\n const c2 = 'v' + (selector.voice + 1).toString() + '-active';\n $('body').addClass(c2);\n }\n // The user has just switched voices, select the active voice\n selectActiveVoice() {\n const selection = this.selections[0];\n const selector = JSON.parse(JSON.stringify(selection.selector));\n selector.voice = selection.measure.activeVoice;\n this.selections = [this._getClosestTick(selector)];\n this.deferHighlight();\n }\n highlightSelection() {\n let i = 0;\n let prevSel = null;\n let curBox = _smo_data_common__WEBPACK_IMPORTED_MODULE_5__.SvgBox.default;\n this.idleTimer = Date.now();\n const grace = this.getSelectedGraceNotes();\n // If this is not a note with grace notes, logically unselect the grace notes\n if (grace && grace.length && grace[0].selection && this.selections.length) {\n if (!_smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(grace[0].selection.selector, this.selections[0].selector)) {\n this.clearModifierSelections();\n }\n else {\n this._highlightModifier();\n return;\n }\n }\n // If there is a race condition with a change, avoid referencing null note\n if (!this.selections[0].note) {\n return;\n }\n const note = this.selections[0].note;\n if (this.pitchIndex >= 0 && this.selections.length === 1 &&\n this.pitchIndex < note.pitches.length) {\n this._highlightPitchSelection(note, this.pitchIndex);\n this._highlightActiveVoice(this.selections[0]);\n return;\n }\n this.removePitchSelection();\n this.pitchIndex = -1;\n if (this.selections.length === 1 && note.logicalBox) {\n this._drawRect(note.logicalBox, 'selection');\n this._highlightActiveVoice(this.selections[0]);\n return;\n }\n const sorted = this.selections.sort((a, b) => _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.gt(a.selector, b.selector) ? 1 : -1);\n prevSel = sorted[0];\n // rendered yet?\n if (!prevSel || !prevSel.box) {\n return;\n }\n curBox = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.smoBox(prevSel.box);\n const boxes = [];\n for (i = 1; i < sorted.length; ++i) {\n const sel = sorted[i];\n if (!sel.box || !prevSel.box) {\n continue;\n }\n // const ydiff = Math.abs(prevSel.box.y - sel.box.y);\n if (sel.selector.staff === prevSel.selector.staff && sel.measure.svg.lineIndex === prevSel.measure.svg.lineIndex) {\n curBox = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.unionRect(curBox, sel.box);\n }\n else if (curBox) {\n boxes.push(curBox);\n curBox = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.smoBox(sel.box);\n }\n this._highlightActiveVoice(sel);\n prevSel = sel;\n }\n boxes.push(curBox);\n if (this.modifierSelections.length) {\n boxes.push(this.modifierSelections[0].box);\n }\n this._drawRect(boxes, 'selection');\n }\n /**\n * Boxes are divided up into lines/systems already. But we need\n * to put the correct box on the correct page.\n * @param boxes\n */\n drawSelectionRects(boxes) {\n const keys = Object.keys(this.selectionRects);\n // erase any old selections\n keys.forEach((key) => {\n const oon = this.selectionRects[parseInt(key)];\n oon.forEach((outline) => {\n if (outline.element) {\n outline.element.remove();\n outline.element = undefined;\n }\n });\n });\n this.selectionRects = {};\n // Create an OutlineInfo for each page\n const pages = [];\n const stroke = SuiTracker.strokes['selection'];\n boxes.forEach((box) => {\n let testBox = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.smoBox(box);\n let context = this.renderer.pageMap.getRenderer(testBox);\n testBox.y -= context.box.y;\n if (!this.selectionRects[context.pageNumber]) {\n this.selectionRects[context.pageNumber] = [];\n pages.push(context.pageNumber);\n }\n this.selectionRects[context.pageNumber].push({\n context: context, box: testBox, classes: '',\n stroke, scroll: this.scroller.scrollState,\n timeOff: 0\n });\n });\n pages.forEach((pageNo) => {\n const outlineInfos = this.selectionRects[pageNo];\n outlineInfos.forEach((info) => {\n _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.outlineRect(info);\n });\n });\n }\n _drawRect(pBox, strokeName) {\n const stroke = SuiTracker.strokes[strokeName];\n const boxes = Array.isArray(pBox) ? pBox : [pBox];\n if (strokeName === 'selection') {\n this.drawSelectionRects(boxes);\n return;\n }\n boxes.forEach((box) => {\n let testBox = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.smoBox(box);\n let context = this.renderer.pageMap.getRenderer(testBox);\n const timeOff = strokeName === 'suggestion' ? 1000 : 0;\n if (context) {\n testBox.y -= context.box.y;\n if (!this.outlines[strokeName]) {\n this.outlines[strokeName] = {\n context: context, box: testBox, classes: '',\n stroke, scroll: this.scroller.scrollState,\n timeOff\n };\n }\n this.outlines[strokeName].box = testBox;\n this.outlines[strokeName].context = context;\n _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.outlineRect(this.outlines[strokeName]);\n }\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFVBQVUsQ0FBQyxHQUFHO3dCQUMxQixPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUU7d0JBQzNDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXO3dCQUN6QyxPQUFPO3FCQUNSLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztnQkFDNUMsbURBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3BELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy9yZW5kZXIvc3VpL3RyYWNrZXIudHM/ZjI4OCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuaW1wb3J0IHsgU3VpTWFwcGVyLCBTdWlSZW5kZXJlckJhc2UgfSBmcm9tICcuL21hcHBlcic7XHJcbmltcG9ydCB7IFN2Z0hlbHBlcnMsIFN0cm9rZUluZm8sIE91dGxpbmVJbmZvIH0gZnJvbSAnLi9zdmdIZWxwZXJzJztcclxuaW1wb3J0IHsgU21vU2VsZWN0aW9uLCBTbW9TZWxlY3RvciwgTW9kaWZpZXJUYWIgfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vc2VsZWN0aW9ucyc7XHJcbmltcG9ydCB7IHNtb1NlcmlhbGl6ZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZXJpYWxpemF0aW9uSGVscGVycyc7XHJcbmltcG9ydCB7IFN1aU9zY2lsbGF0b3IgfSBmcm9tICcuLi9hdWRpby9vc2NpbGxhdG9yJztcclxuaW1wb3J0IHsgU21vU2NvcmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zY29yZSc7XHJcbmltcG9ydCB7IFN2Z0JveCwgS2V5RXZlbnQsIGRlZmF1bHRLZXlFdmVudCwga2V5SGFuZGxlciB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL2NvbW1vbic7XHJcbmltcG9ydCB7IFN1aVNjcm9sbGVyIH0gZnJvbSAnLi9zY3JvbGxlcic7XHJcbmltcG9ydCB7IFBhc3RlQnVmZmVyIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL2NvcHlwYXN0ZSc7XHJcbmltcG9ydCB7IFNtb05vdGUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9ub3RlJztcclxuaW1wb3J0IHsgU21vTWVhc3VyZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL21lYXN1cmUnO1xyXG5pbXBvcnQgeyBsYXlvdXREZWJ1ZyB9IGZyb20gJy4vbGF5b3V0RGVidWcnO1xyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrZXJLZXlIYW5kbGVyIHtcclxuICBtb3ZlSG9tZSA6IGtleUhhbmRsZXIsIFxyXG4gIG1vdmVFbmQgOiBrZXlIYW5kbGVyLCBcclxuICBtb3ZlU2VsZWN0aW9uUmlnaHQgOiBrZXlIYW5kbGVyLFxyXG4gIG1vdmVTZWxlY3Rpb25MZWZ0IDoga2V5SGFuZGxlciwgXHJcbiAgbW92ZVNlbGVjdGlvblVwIDoga2V5SGFuZGxlcixcclxuICBtb3ZlU2VsZWN0aW9uRG93biA6IGtleUhhbmRsZXIsXHJcbiAgbW92ZVNlbGVjdGlvblJpZ2h0TWVhc3VyZSA6IGtleUhhbmRsZXIsXHJcbiAgbW92ZVNlbGVjdGlvbkxlZnRNZWFzdXJlIDoga2V5SGFuZGxlcixcclxuICBhZHZhbmNlTW9kaWZpZXJTZWxlY3Rpb24gOiBrZXlIYW5kbGVyLFxyXG4gIGdyb3dTZWxlY3Rpb25SaWdodCA6IGtleUhhbmRsZXIsXHJcbiAgZ3Jvd1NlbGVjdGlvbkxlZnQgOiBrZXlIYW5kbGVyLCBcclxuICBtb3ZlU2VsZWN0aW9uUGl0Y2hVcCA6IGtleUhhbmRsZXIsXHJcbiAgbW92ZVNlbGVjdGlvblBpdGNoRG93bjoga2V5SGFuZGxlclxyXG59XHJcbi8qKlxyXG4gKiBTdWlUcmFja2VyXHJcbiAqIEEgdHJhY2tlciBtYXBzIHRoZSBVSSBlbGVtZW50cyB0byB0aGUgbG9naWNhbCBlbGVtZW50cyAsYW5kIGFsbG93cyB0aGUgdXNlciB0b1xyXG4gKiAgbW92ZSB0aHJvdWdoIHRoZSBzY29yZSBhbmQgbWFrZSBzZWxlY3Rpb25zLCBmb3IgbmF2aWdhdGlvbiBhbmQgZWRpdGluZy5cclxuICogQGNhdGVnb3J5IFN1aVJlbmRlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVRyYWNrZXIgZXh0ZW5kcyBTdWlNYXBwZXIgaW1wbGVtZW50cyBUcmFja2VyS2V5SGFuZGxlciB7XHJcbiAgaWRsZVRpbWVyOiBudW1iZXIgPSBEYXRlLm5vdygpO1xyXG4gIG11c2ljQ3Vyc29yR2x5cGg6IFNWR1NWR0VsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuICBkZWZlclBsYXlBZHZhbmNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc3RhdGljIGdldCBzdHJva2VzKCk6IFJlY29yZDxzdHJpbmcsIFN0cm9rZUluZm8+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN1Z2dlc3Rpb246IHtcclxuICAgICAgICBzdHJva2VOYW1lOiAnc3VnZ2VzdGlvbicsXHJcbiAgICAgICAgc3Ryb2tlOiAnI2ZjOScsXHJcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDMsXHJcbiAgICAgICAgc3Ryb2tlRGFzaGFycmF5OiAnNCwxJyxcclxuICAgICAgICBmaWxsOiAnbm9uZScsXHJcbiAgICAgICAgb3BhY2l0eTogMS4wXHJcbiAgICAgIH0sXHJcbiAgICAgIHNlbGVjdGlvbjoge1xyXG4gICAgICAgIHN0cm9rZU5hbWU6ICdzZWxlY3Rpb24nLFxyXG4gICAgICAgIHN0cm9rZTogJyM5OWQnLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAzLFxyXG4gICAgICAgIHN0cm9rZURhc2hhcnJheTogMixcclxuICAgICAgICBmaWxsOiAnbm9uZScsXHJcbiAgICAgICAgb3BhY2l0eTogMS4wXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YWZmTW9kaWZpZXI6IHtcclxuICAgICAgICBzdHJva2VOYW1lOiAnc3RhZmZNb2RpZmllcicsXHJcbiAgICAgICAgc3Ryb2tlOiAnIzkzMycsXHJcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDMsXHJcbiAgICAgICAgZmlsbDogJ25vbmUnLFxyXG4gICAgICAgIHN0cm9rZURhc2hhcnJheTogMCxcclxuICAgICAgICBvcGFjaXR5OiAxLjBcclxuICAgICAgfSwgcGl0Y2hTZWxlY3Rpb246IHtcclxuICAgICAgICBzdHJva2VOYW1lOiAncGl0Y2hTZWxlY3Rpb24nLFxyXG4gICAgICAgIHN0cm9rZTogJyM5MzMnLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAzLFxyXG4gICAgICAgIGZpbGw6ICdub25lJyxcclxuICAgICAgICBzdHJva2VEYXNoYXJyYXk6IDAsXHJcbiAgICAgICAgb3BhY2l0eTogMS4wXHJcbiAgICAgIH1cclxuXHJcbiAgICB9O1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihyZW5kZXJlcjogU3VpUmVuZGVyZXJCYXNlLCBzY3JvbGxlcjogU3VpU2Nyb2xsZXIpIHtcclxuICAgIHN1cGVyKHJlbmRlcmVyLCBzY3JvbGxlcik7XHJcbiAgfVxyXG4gIC8vICMjIyByZW5kZXJFbGVtZW50XHJcbiAgLy8gdGhlIGVsZW1lbnQgdGhlIHNjb3JlIGlzIHJlbmRlcmVkIG9uXHJcbiAgZ2V0IHJlbmRlckVsZW1lbnQoKTogRWxlbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5yZW5kZXJFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNjb3JlKCk6IFNtb1Njb3JlIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5zY29yZTtcclxuICB9XHJcblxyXG4gIGdldElkbGVUaW1lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5pZGxlVGltZXI7XHJcbiAgfVxyXG4gIHBsYXlTZWxlY3Rpb24oYXJ0aWZhY3Q6IFNtb1NlbGVjdGlvbikge1xyXG4gICAgaWYgKCF0aGlzLmRlZmVyUGxheUFkdmFuY2UgJiYgdGhpcy5zY29yZSkge1xyXG4gICAgICBTdWlPc2NpbGxhdG9yLnBsYXlTZWxlY3Rpb25Ob3coYXJ0aWZhY3QsIHRoaXMuc2NvcmUsIDEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kZWZlclBsYXlBZHZhbmNlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGRlZmVyTmV4dEF1dG9QbGF5KCkge1xyXG4gICAgaWYgKHRoaXMuc2NvcmUpIHtcclxuICAgICAgLy8gZG9uJ3QgcGxheSBvbiBhZHZhbmNlIGlmIHdlJ3ZlIGp1c3QgYWRkZWQgYSBub3RlIGFuZCBwbGF5ZWQgaXQgYmVjYXVzZSB0aGV5IG92ZXJsYXBcclxuICAgICAgaWYgKHRoaXMuc2NvcmUucHJlZmVyZW5jZXMuYXV0b0FkdmFuY2UgJiYgdGhpcy5zY29yZS5wcmVmZXJlbmNlcy5hdXRvUGxheSkge1xyXG4gICAgICAgIHRoaXMuZGVmZXJQbGF5QWR2YW5jZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNlbGVjdGVkTW9kaWZpZXIoKSB7XHJcbiAgICBpZiAodGhpcy5tb2RpZmllclNlbGVjdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm1vZGlmaWVyU2VsZWN0aW9uc1swXTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRNb2RpZmllcnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RpZmllclNlbGVjdGlvbnM7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc2VyaWFsaXplRXZlbnQoZXZLZXk6IEtleUV2ZW50IHwgbnVsbCk6IGFueSB7XHJcbiAgICBpZiAoIWV2S2V5KSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJ2ID0ge307XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlKFsndHlwZScsICdzaGlmdEtleScsICdjdHJsS2V5JywgJ2FsdEtleScsICdrZXknLCAna2V5Q29kZSddLCBldktleSwgcnYpO1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgYWR2YW5jZU1vZGlmaWVyU2VsZWN0aW9uKGtleUV2PzogS2V5RXZlbnQpIHtcclxuICAgIGlmICgha2V5RXYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pZGxlVGltZXIgPSBEYXRlLm5vdygpO1xyXG4gICAgY29uc3Qgb2Zmc2V0ID0ga2V5RXYua2V5ID09PSAnQXJyb3dMZWZ0JyA/IC0xIDogMTtcclxuICAgIHRoaXMubW9kaWZpZXJJbmRleCA9IHRoaXMubW9kaWZpZXJJbmRleCArIG9mZnNldDtcclxuICAgIHRoaXMubW9kaWZpZXJJbmRleCA9ICh0aGlzLm1vZGlmaWVySW5kZXggPT09IC0yICYmIHRoaXMubG9jYWxNb2RpZmllcnMubGVuZ3RoKSA/XHJcbiAgICAgIHRoaXMubG9jYWxNb2RpZmllcnMubGVuZ3RoIC0gMSA6IHRoaXMubW9kaWZpZXJJbmRleDtcclxuICAgIGlmICh0aGlzLm1vZGlmaWVySW5kZXggPj0gdGhpcy5sb2NhbE1vZGlmaWVycy5sZW5ndGggfHwgdGhpcy5tb2RpZmllckluZGV4IDwgMCkge1xyXG4gICAgICB0aGlzLm1vZGlmaWVySW5kZXggPSAtMTtcclxuICAgICAgdGhpcy5tb2RpZmllclNlbGVjdGlvbnMgPSBbXTtcclxuICAgICAgJCgnLnZmLXN0YWZmTW9kaWZpZXInKS5yZW1vdmUoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbG9jYWw6IE1vZGlmaWVyVGFiID0gdGhpcy5sb2NhbE1vZGlmaWVyc1t0aGlzLm1vZGlmaWVySW5kZXhdO1xyXG4gICAgY29uc3QgYm94OiBTdmdCb3ggPSBTdmdIZWxwZXJzLnNtb0JveChsb2NhbC5ib3gpIGFzIFN2Z0JveDtcclxuICAgIHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zID0gW3sgaW5kZXg6IDAsIGJveCwgbW9kaWZpZXI6IGxvY2FsLm1vZGlmaWVyLCBzZWxlY3Rpb246IGxvY2FsLnNlbGVjdGlvbiB9XTtcclxuICAgIHRoaXMuX2hpZ2hsaWdodE1vZGlmaWVyKCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc3RyaW5naWZ5Qm94KGJveDogU3ZnQm94KTogc3RyaW5nIHtcclxuICAgIHJldHVybiAne3g6JyArIGJveC54ICsgJyx5OicgKyBib3gueSArICcsd2lkdGg6JyArIGJveC53aWR0aCArICcsaGVpZ2h0OicgKyBib3guaGVpZ2h0ICsgJ30nO1xyXG4gIH1cclxuXHJcbiAgLy8gIyMjIF9nZXRPZmZzZXRTZWxlY3Rpb25cclxuICAvLyBHZXQgdGhlIHNlbGVjdG9yIHRoYXQgaXMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgZXhpc3Rpbmcgc2VsZWN0aW9uXHJcbiAgX2dldE9mZnNldFNlbGVjdGlvbihvZmZzZXQ6IG51bWJlcik6IFNtb1NlbGVjdG9yIHtcclxuICAgIGlmICghdGhpcy5zY29yZSkge1xyXG4gICAgICByZXR1cm4gU21vU2VsZWN0b3IuZGVmYXVsdDtcclxuICAgIH1cclxuICAgIGxldCB0ZXN0U2VsZWN0aW9uID0gdGhpcy5nZXRFeHRyZW1lU2VsZWN0aW9uKE1hdGguc2lnbihvZmZzZXQpKTtcclxuICAgIGNvbnN0IHNjb3B5VGljayA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGVzdFNlbGVjdGlvbi5zZWxlY3RvcikpO1xyXG4gICAgY29uc3Qgc2NvcHlNZWFzdXJlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0ZXN0U2VsZWN0aW9uLnNlbGVjdG9yKSk7XHJcbiAgICBzY29weVRpY2sudGljayArPSBvZmZzZXQ7XHJcbiAgICBzY29weU1lYXN1cmUubWVhc3VyZSArPSBvZmZzZXQ7XHJcbiAgICBjb25zdCB0YXJnZXRNZWFzdXJlID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zY29yZSwgdGVzdFNlbGVjdGlvbi5zZWxlY3Rvci5zdGFmZixcclxuICAgICAgc2NvcHlNZWFzdXJlLm1lYXN1cmUpO1xyXG4gICAgaWYgKHRhcmdldE1lYXN1cmUgJiYgdGFyZ2V0TWVhc3VyZS5tZWFzdXJlICYmIHRhcmdldE1lYXN1cmUubWVhc3VyZS52b2ljZXMubGVuZ3RoIDw9IHNjb3B5TWVhc3VyZS52b2ljZSkge1xyXG4gICAgICBzY29weU1lYXN1cmUudm9pY2UgPSAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRhcmdldE1lYXN1cmUgJiYgdGFyZ2V0TWVhc3VyZS5tZWFzdXJlKSB7XHJcbiAgICAgIHNjb3B5TWVhc3VyZS50aWNrID0gKG9mZnNldCA8IDApID8gdGFyZ2V0TWVhc3VyZS5tZWFzdXJlLnZvaWNlc1tzY29weU1lYXN1cmUudm9pY2VdLm5vdGVzLmxlbmd0aCAtIDEgOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0ZXN0U2VsZWN0aW9uLm1lYXN1cmUudm9pY2VzLmxlbmd0aCA+IHNjb3B5VGljay52b2ljZSAmJlxyXG4gICAgICB0ZXN0U2VsZWN0aW9uLm1lYXN1cmUudm9pY2VzW3Njb3B5VGljay52b2ljZV0ubm90ZXMubGVuZ3RoID4gc2NvcHlUaWNrLnRpY2sgJiYgc2NvcHlUaWNrLnRpY2sgPj0gMCkge1xyXG4gICAgICBpZiAodGVzdFNlbGVjdGlvbi5zZWxlY3Rvci52b2ljZSAhPT0gdGVzdFNlbGVjdGlvbi5tZWFzdXJlLmdldEFjdGl2ZVZvaWNlKCkpIHtcclxuICAgICAgICBzY29weVRpY2sudm9pY2UgPSB0ZXN0U2VsZWN0aW9uLm1lYXN1cmUuZ2V0QWN0aXZlVm9pY2UoKTtcclxuICAgICAgICB0ZXN0U2VsZWN0aW9uID0gdGhpcy5fZ2V0Q2xvc2VzdFRpY2soc2NvcHlUaWNrKTtcclxuICAgICAgICByZXR1cm4gdGVzdFNlbGVjdGlvbi5zZWxlY3RvcjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gc2NvcHlUaWNrO1xyXG4gICAgfSBlbHNlIGlmICh0YXJnZXRNZWFzdXJlICYmXHJcbiAgICAgIHNjb3B5TWVhc3VyZS5tZWFzdXJlIDwgdGVzdFNlbGVjdGlvbi5zdGFmZi5tZWFzdXJlcy5sZW5ndGggJiYgc2NvcHlNZWFzdXJlLm1lYXN1cmUgPj0gMCkge1xyXG4gICAgICByZXR1cm4gc2NvcHlNZWFzdXJlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRlc3RTZWxlY3Rpb24uc2VsZWN0b3I7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZEdyYWNlTm90ZXMoKTogTW9kaWZpZXJUYWJbXSB7XHJcbiAgICBpZiAoIXRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBjb25zdCBmZiA9IHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmZpbHRlcigobW0pID0+XHJcbiAgICAgIG1tLm1vZGlmaWVyPy5hdHRycz8udHlwZSA9PT0gJ1Ntb0dyYWNlTm90ZSdcclxuICAgICk7XHJcbiAgICByZXR1cm4gZmY7XHJcbiAgfVxyXG5cclxuICBpc0dyYWNlTm90ZVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBmZiA9IHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmZpbmRJbmRleCgobW0pID0+IG1tLm1vZGlmaWVyLmF0dHJzLnR5cGUgPT09ICdTbW9HcmFjZU5vdGUnKTtcclxuICAgICAgcmV0dXJuIGZmID49IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBfZ3Jvd0dyYWNlTm90ZVNlbGVjdGlvbnMob2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuaWRsZVRpbWVyID0gRGF0ZS5ub3coKTtcclxuICAgIGNvbnN0IGZhciA9IHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmZpbHRlcigobW0pID0+IG1tLm1vZGlmaWVyLmF0dHJzLnR5cGUgPT09ICdTbW9HcmFjZU5vdGUnKTtcclxuICAgIGlmICghZmFyLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpeCA9IChvZmZzZXQgPCAwKSA/IDAgOiBmYXIubGVuZ3RoIC0gMTtcclxuICAgIGNvbnN0IHNlbDogTW9kaWZpZXJUYWIgPSBmYXJbaXhdIGFzIE1vZGlmaWVyVGFiO1xyXG4gICAgY29uc3QgbGVmdCA9IHRoaXMubG9jYWxNb2RpZmllcnMuZmlsdGVyKChtdCkgPT5cclxuICAgICAgbXQubW9kaWZpZXI/LmF0dHJzPy50eXBlID09PSAnU21vR3JhY2VOb3RlJyAmJiBzZWwuc2VsZWN0aW9uICYmIG10LnNlbGVjdGlvbiAmJlxyXG4gICAgICBTbW9TZWxlY3Rvci5zYW1lTm90ZShtdC5zZWxlY3Rpb24uc2VsZWN0b3IsIHNlbC5zZWxlY3Rpb24uc2VsZWN0b3IpXHJcbiAgICApO1xyXG4gICAgaWYgKGl4ICsgb2Zmc2V0IDwgMCB8fCBpeCArIG9mZnNldCA+PSBsZWZ0Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBsZWZ0U2VsID0gbGVmdFtpeCArIG9mZnNldF07XHJcbiAgICBpZiAoIWxlZnRTZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdiYWQgc2VsZWN0b3IgaW4gX2dyb3dHcmFjZU5vdGVTZWxlY3Rpb25zJyk7XHJcbiAgICB9XHJcbiAgICBsZWZ0U2VsLmJveCA9IGxlZnRTZWwuYm94ID8/IFN2Z0JveC5kZWZhdWx0O1xyXG4gICAgdGhpcy5tb2RpZmllclNlbGVjdGlvbnMucHVzaChsZWZ0U2VsKTtcclxuICAgIHRoaXMuX2hpZ2hsaWdodE1vZGlmaWVyKCk7XHJcbiAgfVxyXG4gIGdldCBhdXRvUGxheSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnNjb3JlID8gdGhpcy5yZW5kZXJlci5zY29yZS5wcmVmZXJlbmNlcy5hdXRvUGxheSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ3Jvd1NlbGVjdGlvblJpZ2h0KCkge1xyXG4gICAgdGhpcy5fZ3Jvd1NlbGVjdGlvblJpZ2h0KGZhbHNlKTtcclxuICB9XHJcbiAgX2dyb3dTZWxlY3Rpb25SaWdodChza2lwUGxheTogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICB0aGlzLmlkbGVUaW1lciA9IERhdGUubm93KCk7XHJcbiAgICBpZiAodGhpcy5pc0dyYWNlTm90ZVNlbGVjdGVkKCkpIHtcclxuICAgICAgdGhpcy5fZ3Jvd0dyYWNlTm90ZVNlbGVjdGlvbnMoMSk7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbnNlbGVjdCA9IHRoaXMuX2dldE9mZnNldFNlbGVjdGlvbigxKTtcclxuICAgIC8vIGFscmVhZHkgc2VsZWN0ZWRcclxuICAgIGNvbnN0IGFydGlmYWN0ID0gdGhpcy5fZ2V0Q2xvc2VzdFRpY2sobnNlbGVjdCk7XHJcbiAgICBpZiAoIWFydGlmYWN0KSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9ucy5maW5kKChzZWwpID0+IFNtb1NlbGVjdG9yLnNhbWVOb3RlKHNlbC5zZWxlY3RvciwgYXJ0aWZhY3Quc2VsZWN0b3IpKSkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5tYXBwaW5nICYmIHRoaXMuYXV0b1BsYXkgJiYgc2tpcFBsYXkgPT09IGZhbHNlICYmIHRoaXMuc2NvcmUpIHtcclxuICAgICAgdGhpcy5wbGF5U2VsZWN0aW9uKGFydGlmYWN0KTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0aW9ucy5wdXNoKGFydGlmYWN0KTtcclxuICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICAgIHRoaXMuX2NyZWF0ZUxvY2FsTW9kaWZpZXJzTGlzdCgpO1xyXG4gICAgcmV0dXJuIChhcnRpZmFjdC5ub3RlIGFzIFNtb05vdGUpLnRpY2tDb3VudDtcclxuICB9XHJcbiAgbW92ZUhvbWUoa2V5RXZlbnQ/OiBLZXlFdmVudCkge1xyXG4gICAgY29uc3QgZXZLZXkgPSBrZXlFdmVudCA/PyBkZWZhdWx0S2V5RXZlbnQoKTtcclxuICAgIHRoaXMuaWRsZVRpbWVyID0gRGF0ZS5ub3coKTtcclxuICAgIGNvbnN0IGxzID0gdGhpcy5zZWxlY3Rpb25zWzBdLnN0YWZmO1xyXG4gICAgaWYgKGV2S2V5LmN0cmxLZXkpIHtcclxuICAgICAgY29uc3QgbW0gPSBscy5tZWFzdXJlc1swXTtcclxuICAgICAgY29uc3QgaG9tZVNlbCA9IHRoaXMuX2dldENsb3Nlc3RUaWNrKHsgc3RhZmY6IGxzLnN0YWZmSWQsXHJcbiAgICAgICAgbWVhc3VyZTogMCwgdm9pY2U6IG1tLmdldEFjdGl2ZVZvaWNlKCksIHRpY2s6IDAsIHBpdGNoZXM6IFtdIH0pO1xyXG4gICAgICBpZiAoZXZLZXkuc2hpZnRLZXkpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RCZXR3ZWVuU2VsZWN0aW9ucyh0aGlzLnNlbGVjdGlvbnNbMF0sIGhvbWVTZWwpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9ucyA9IFtob21lU2VsXTtcclxuICAgICAgICB0aGlzLmRlZmVySGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlTG9jYWxNb2RpZmllcnNMaXN0KCk7XHJcbiAgICAgICAgaWYgKGhvbWVTZWwubWVhc3VyZS5zdmcubG9naWNhbEJveCkge1xyXG4gICAgICAgICAgdGhpcy5zY3JvbGxlci5zY3JvbGxWaXNpYmxlQm94KGhvbWVTZWwubWVhc3VyZS5zdmcubG9naWNhbEJveCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBzeXN0ZW0gPSB0aGlzLnNlbGVjdGlvbnNbMF0ubWVhc3VyZS5zdmcubGluZUluZGV4O1xyXG4gICAgICBjb25zdCBsbSA9IGxzLm1lYXN1cmVzLmZpbmQoKG1tKSA9PlxyXG4gICAgICAgIG1tLnN2Zy5saW5lSW5kZXggPT09IHN5c3RlbSAmJiBtbS5tZWFzdXJlTnVtYmVyLnN5c3RlbUluZGV4ID09PSAwKTtcclxuICAgICAgY29uc3QgbW0gPSBsbSBhcyBTbW9NZWFzdXJlO1xyXG4gICAgICBjb25zdCBob21lU2VsID0gdGhpcy5fZ2V0Q2xvc2VzdFRpY2soeyBzdGFmZjogbHMuc3RhZmZJZCxcclxuICAgICAgICBtZWFzdXJlOiBtbS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCwgdm9pY2U6IG1tLmdldEFjdGl2ZVZvaWNlKCksXHJcbiAgICAgICAgdGljazogMCwgcGl0Y2hlczogW10gfSk7XHJcbiAgICAgIGlmIChldktleS5zaGlmdEtleSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdEJldHdlZW5TZWxlY3Rpb25zKHRoaXMuc2VsZWN0aW9uc1swXSwgaG9tZVNlbCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoaG9tZVNlbD8ubWVhc3VyZT8uc3ZnPy5sb2dpY2FsQm94KSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25zID0gW2hvbWVTZWxdO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsZXIuc2Nyb2xsVmlzaWJsZUJveChob21lU2VsLm1lYXN1cmUuc3ZnLmxvZ2ljYWxCb3gpO1xyXG4gICAgICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICAgICAgICB0aGlzLl9jcmVhdGVMb2NhbE1vZGlmaWVyc0xpc3QoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBtb3ZlRW5kKGtleUV2ZW50PzogS2V5RXZlbnQpIHtcclxuICAgIHRoaXMuaWRsZVRpbWVyID0gRGF0ZS5ub3coKTtcclxuICAgIGNvbnN0IGxzID0gdGhpcy5zZWxlY3Rpb25zWzBdLnN0YWZmO1xyXG4gICAgY29uc3QgZXZLZXkgPSBrZXlFdmVudCA/PyBkZWZhdWx0S2V5RXZlbnQoKTtcclxuICAgIGlmIChldktleS5jdHJsS2V5KSB7XHJcbiAgICAgIGNvbnN0IGxtID0gbHMubWVhc3VyZXNbbHMubWVhc3VyZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgIGNvbnN0IHZvaWNlSXggPSBsbS5nZXRBY3RpdmVWb2ljZSgpO1xyXG4gICAgICBjb25zdCB2b2ljZSA9IGxtLnZvaWNlc1t2b2ljZUl4XTtcclxuICAgICAgY29uc3QgZW5kU2VsID0gdGhpcy5fZ2V0Q2xvc2VzdFRpY2soeyBzdGFmZjogbHMuc3RhZmZJZCxcclxuICAgICAgICBtZWFzdXJlOiBscy5tZWFzdXJlcy5sZW5ndGggLSAxLCB2b2ljZTogdm9pY2VJeCwgdGljazogdm9pY2Uubm90ZXMubGVuZ3RoIC0gMSwgcGl0Y2hlczogW10gfSk7XHJcbiAgICAgIGlmIChldktleS5zaGlmdEtleSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdEJldHdlZW5TZWxlY3Rpb25zKHRoaXMuc2VsZWN0aW9uc1swXSwgZW5kU2VsKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbnMgPSBbZW5kU2VsXTtcclxuICAgICAgICB0aGlzLmRlZmVySGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlTG9jYWxNb2RpZmllcnNMaXN0KCk7XHJcbiAgICAgICAgaWYgKGVuZFNlbC5tZWFzdXJlLnN2Zy5sb2dpY2FsQm94KSB7XHJcbiAgICAgICAgICB0aGlzLnNjcm9sbGVyLnNjcm9sbFZpc2libGVCb3goZW5kU2VsLm1lYXN1cmUuc3ZnLmxvZ2ljYWxCb3gpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3Qgc3lzdGVtID0gdGhpcy5zZWxlY3Rpb25zWzBdLm1lYXN1cmUuc3ZnLmxpbmVJbmRleDtcclxuICAgICAgLy8gZmluZCB0aGUgbGFyZ2VzdCBtZWFzdXJlIGluZGV4IG9uIHRoaXMgc3RhZmYgaW4gdGhpcyBzeXN0ZW1cclxuICAgICAgY29uc3QgbWVhc3VyZXMgPSBscy5tZWFzdXJlcy5maWx0ZXIoKG1tKSA9PlxyXG4gICAgICAgIG1tLnN2Zy5saW5lSW5kZXggPT09IHN5c3RlbSk7XHJcbiAgICAgIGNvbnN0IGxtID0gbWVhc3VyZXMucmVkdWNlKChhLCBiKSA9PlxyXG4gICAgICAgIGIubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXggPiBhLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4ID8gYiA6IGEpO1xyXG4gICAgICBjb25zdCB0aWNrcyA9IGxtLnZvaWNlc1tsbS5nZXRBY3RpdmVWb2ljZSgpXS5ub3Rlcy5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGVuZFNlbCA9IHRoaXMuX2dldENsb3Nlc3RUaWNrKHsgc3RhZmY6IGxzLnN0YWZmSWQsXHJcbiAgICAgICAgbWVhc3VyZTogbG0ubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXgsIHZvaWNlOiBsbS5nZXRBY3RpdmVWb2ljZSgpLCB0aWNrOiB0aWNrcyAtIDEsIHBpdGNoZXM6IFtdIH0pO1xyXG4gICAgICBpZiAoZXZLZXkuc2hpZnRLZXkpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RCZXR3ZWVuU2VsZWN0aW9ucyh0aGlzLnNlbGVjdGlvbnNbMF0sIGVuZFNlbCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25zID0gW2VuZFNlbF07XHJcbiAgICAgICAgdGhpcy5kZWZlckhpZ2hsaWdodCgpO1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZUxvY2FsTW9kaWZpZXJzTGlzdCgpO1xyXG4gICAgICAgIGlmIChlbmRTZWwubWVhc3VyZS5zdmcubG9naWNhbEJveCkge1xyXG4gICAgICAgICAgdGhpcy5zY3JvbGxlci5zY3JvbGxWaXNpYmxlQm94KGVuZFNlbC5tZWFzdXJlLnN2Zy5sb2dpY2FsQm94KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgZ3Jvd1NlbGVjdGlvblJpZ2h0TWVhc3VyZSgpIHtcclxuICAgIGxldCB0b1NlbGVjdCA9IDA7XHJcbiAgICBjb25zdCByaWdodG1vc3QgPSB0aGlzLmdldEV4dHJlbWVTZWxlY3Rpb24oMSk7XHJcbiAgICBjb25zdCB0aWNrc0xlZnQgPSByaWdodG1vc3QubWVhc3VyZS52b2ljZXNbcmlnaHRtb3N0Lm1lYXN1cmUuYWN0aXZlVm9pY2VdXHJcbiAgICAgIC5ub3Rlcy5sZW5ndGggLSByaWdodG1vc3Quc2VsZWN0b3IudGljaztcclxuICAgIGlmICh0aWNrc0xlZnQgPT09IDApIHtcclxuICAgICAgaWYgKHJpZ2h0bW9zdC5zZWxlY3Rvci5tZWFzdXJlIDwgcmlnaHRtb3N0LnN0YWZmLm1lYXN1cmVzLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IG1peCA9IHJpZ2h0bW9zdC5zZWxlY3Rvci5tZWFzdXJlICsgMTtcclxuICAgICAgICByaWdodG1vc3Quc3RhZmYubWVhc3VyZXNbbWl4XS5zZXRBY3RpdmVWb2ljZShyaWdodG1vc3Quc2VsZWN0b3Iudm9pY2UpO1xyXG4gICAgICAgIHRvU2VsZWN0ID0gcmlnaHRtb3N0LnN0YWZmLm1lYXN1cmVzW21peF1cclxuICAgICAgICAgIC52b2ljZXNbcmlnaHRtb3N0LnN0YWZmLm1lYXN1cmVzW21peF0uYWN0aXZlVm9pY2VdLm5vdGVzLmxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdG9TZWxlY3QgPSB0aWNrc0xlZnQ7XHJcbiAgICB9XHJcbiAgICB3aGlsZSAodG9TZWxlY3QgPiAwKSB7XHJcbiAgICAgIHRoaXMuX2dyb3dTZWxlY3Rpb25SaWdodCh0cnVlKTtcclxuICAgICAgdG9TZWxlY3QgLT0gMTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdyb3dTZWxlY3Rpb25MZWZ0KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5pc0dyYWNlTm90ZVNlbGVjdGVkKCkpIHtcclxuICAgICAgdGhpcy5fZ3Jvd0dyYWNlTm90ZVNlbGVjdGlvbnMoLTEpO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIHRoaXMuaWRsZVRpbWVyID0gRGF0ZS5ub3coKTtcclxuICAgIGNvbnN0IG5zZWxlY3QgPSB0aGlzLl9nZXRPZmZzZXRTZWxlY3Rpb24oLTEpO1xyXG4gICAgLy8gYWxyZWFkeSBzZWxlY3RlZFxyXG4gICAgY29uc3QgYXJ0aWZhY3QgPSB0aGlzLl9nZXRDbG9zZXN0VGljayhuc2VsZWN0KTtcclxuICAgIGlmICghYXJ0aWZhY3QpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25zLmZpbmQoKHNlbCkgPT4gU21vU2VsZWN0b3Iuc2FtZU5vdGUoc2VsLnNlbGVjdG9yLCBhcnRpZmFjdC5zZWxlY3RvcikpKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgYXJ0aWZhY3QubWVhc3VyZS5zZXRBY3RpdmVWb2ljZShuc2VsZWN0LnZvaWNlKTtcclxuICAgIHRoaXMuc2VsZWN0aW9ucy5wdXNoKGFydGlmYWN0KTtcclxuICAgIGlmICh0aGlzLmF1dG9QbGF5ICYmIHRoaXMuc2NvcmUpIHtcclxuICAgICAgdGhpcy5wbGF5U2VsZWN0aW9uKGFydGlmYWN0KTtcclxuICAgIH1cclxuICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICAgIHRoaXMuX2NyZWF0ZUxvY2FsTW9kaWZpZXJzTGlzdCgpO1xyXG4gICAgcmV0dXJuIChhcnRpZmFjdC5ub3RlIGFzIFNtb05vdGUpLnRpY2tDb3VudDtcclxuICB9XHJcblxyXG4gIC8vIGlmIHdlIGFyZSBiZWluZyBtb3ZlZCByaWdodCBwcm9ncmFtbWF0aWNhbGx5LCBhdm9pZCBwbGF5aW5nIHRoZSBzZWxlY3RlZCBub3RlLlxyXG4gIG1vdmVTZWxlY3Rpb25SaWdodCgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbnMubGVuZ3RoID09PSAwIHx8IHRoaXMuc2NvcmUgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2tpcFBsYXkgPSAhdGhpcy5zY29yZS5wcmVmZXJlbmNlcy5hdXRvUGxheTtcclxuICAgIC8vIGNvbnN0IG9yaWdpbmFsID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpLnNlbGVjdG9yKSk7XHJcbiAgICBjb25zdCBuc2VsZWN0ID0gdGhpcy5fZ2V0T2Zmc2V0U2VsZWN0aW9uKDEpO1xyXG4gICAgLy8gc2tpcCBhbnkgbWVhc3VyZXMgdGhhdCBhcmUgbm90IGRpc3BsYXllZCBkdWUgdG8gcmVzdCBvciByZXBldGl0aW9uXHJcbiAgICBjb25zdCBtc2VsZWN0ID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zY29yZSwgbnNlbGVjdC5zdGFmZiwgbnNlbGVjdC5tZWFzdXJlKTsgICAgXHJcbiAgICBpZiAobXNlbGVjdD8ubWVhc3VyZS5zdmcubXVsdGltZWFzdXJlTGVuZ3RoKSB7XHJcbiAgICAgIG5zZWxlY3QubWVhc3VyZSArPSBtc2VsZWN0Py5tZWFzdXJlLnN2Zy5tdWx0aW1lYXN1cmVMZW5ndGg7XHJcbiAgICB9XHJcbiAgICBpZiAobXNlbGVjdCkge1xyXG4gICAgICBtc2VsZWN0Lm1lYXN1cmUuc2V0QWN0aXZlVm9pY2UobnNlbGVjdC52b2ljZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZXBsYWNlU2VsZWN0aW9uKG5zZWxlY3QsIHNraXBQbGF5KTtcclxuICB9XHJcblxyXG4gIG1vdmVTZWxlY3Rpb25MZWZ0KCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPT09IDAgfHwgdGhpcy5zY29yZSA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBuc2VsZWN0ID0gdGhpcy5fZ2V0T2Zmc2V0U2VsZWN0aW9uKC0xKTtcclxuICAgIC8vIFNraXAgbXVsdGltZWFzdXJlIHJlc3RzIGluIHBhcnRzXHJcbiAgICBjb25zdCBtc2VsZWN0ID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zY29yZSwgbnNlbGVjdC5zdGFmZiwgbnNlbGVjdC5tZWFzdXJlKTtcclxuICAgIHdoaWxlIChuc2VsZWN0Lm1lYXN1cmUgPiAwICYmIG1zZWxlY3QgJiYgKG1zZWxlY3QubWVhc3VyZS5zdmcuaGlkZU11bHRpbWVhc3VyZSB8fCBtc2VsZWN0Lm1lYXN1cmUuc3ZnLm11bHRpbWVhc3VyZUxlbmd0aCA+IDApKSB7XHJcbiAgICAgIG5zZWxlY3QubWVhc3VyZSAtPSAxO1xyXG4gICAgfVxyXG4gICAgaWYgKG1zZWxlY3QpIHtcclxuICAgICAgbXNlbGVjdC5tZWFzdXJlLnNldEFjdGl2ZVZvaWNlKG5zZWxlY3Qudm9pY2UpO1xyXG4gICAgfSAgICBcclxuICAgIHRoaXMuX3JlcGxhY2VTZWxlY3Rpb24obnNlbGVjdCwgZmFsc2UpO1xyXG4gIH1cclxuICBtb3ZlU2VsZWN0aW9uTGVmdE1lYXN1cmUoKSB7XHJcbiAgICB0aGlzLl9tb3ZlU2VsZWN0aW9uTWVhc3VyZSgtMSk7XHJcbiAgfVxyXG4gIG1vdmVTZWxlY3Rpb25SaWdodE1lYXN1cmUoKSB7XHJcbiAgICB0aGlzLl9tb3ZlU2VsZWN0aW9uTWVhc3VyZSgxKTtcclxuICB9XHJcbiAgX21vdmVTZWxlY3Rpb25NZWFzdXJlKG9mZnNldDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmdldEV4dHJlbWVTZWxlY3Rpb24oTWF0aC5zaWduKG9mZnNldCkpO1xyXG4gICAgdGhpcy5pZGxlVGltZXIgPSBEYXRlLm5vdygpO1xyXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNlbGVjdGlvbi5zZWxlY3RvcikpO1xyXG4gICAgc2VsZWN0b3IubWVhc3VyZSArPSBvZmZzZXQ7XHJcbiAgICBzZWxlY3Rvci50aWNrID0gMDtcclxuICAgIGNvbnN0IHNlbE9iaiA9IHRoaXMuX2dldENsb3Nlc3RUaWNrKHNlbGVjdG9yKTtcclxuICAgIGlmIChzZWxPYmopIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb25zID0gW3NlbE9ial07XHJcbiAgICB9XHJcbiAgICB0aGlzLmRlZmVySGlnaGxpZ2h0KCk7XHJcbiAgICB0aGlzLl9jcmVhdGVMb2NhbE1vZGlmaWVyc0xpc3QoKTtcclxuICB9XHJcblxyXG4gIF9tb3ZlU3RhZmZPZmZzZXQob2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbnMubGVuZ3RoID09PSAwIHx8IHRoaXMuc2NvcmUgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pZGxlVGltZXIgPSBEYXRlLm5vdygpO1xyXG4gICAgY29uc3QgbnNlbGVjdG9yID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGlvbnNbMF0uc2VsZWN0b3IpKTtcclxuICAgIG5zZWxlY3Rvci5zdGFmZiA9IHRoaXMuc2NvcmUuaW5jcmVtZW50QWN0aXZlU3RhZmYob2Zmc2V0KTtcclxuICAgIFxyXG4gICAgdGhpcy5zZWxlY3Rpb25zID0gW3RoaXMuX2dldENsb3Nlc3RUaWNrKG5zZWxlY3RvcildO1xyXG4gICAgdGhpcy5kZWZlckhpZ2hsaWdodCgpO1xyXG4gICAgdGhpcy5fY3JlYXRlTG9jYWxNb2RpZmllcnNMaXN0KCk7XHJcbiAgfVxyXG4gIHJlbW92ZVBpdGNoU2VsZWN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMub3V0bGluZXNbJ3BpdGNoU2VsZWN0aW9uJ10pIHtcclxuICAgICAgaWYgKHRoaXMub3V0bGluZXNbJ3BpdGNoU2VsZWN0aW9uJ10uZWxlbWVudCkge1xyXG4gICAgICAgIHRoaXMub3V0bGluZXNbJ3BpdGNoU2VsZWN0aW9uJ10uZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgfVxyXG4gICAgICBkZWxldGUgdGhpcy5vdXRsaW5lc1sncGl0Y2hTZWxlY3Rpb24nXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vICMjIyBfbW92ZVNlbGVjdGlvblBpdGNoXHJcbiAgLy8gU3VnZ2VzdCBhIHNwZWNpZmljIHBpdGNoIGluIGEgY2hvcmQsIHNvIHdlIGNhbiB0cmFuc3Bvc2UganVzdCB0aGUgb25lIG5vdGUgdnMuIHRoZSB3aG9sZSBjaG9yZC5cclxuICBfbW92ZVNlbGVjdGlvblBpdGNoKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuaWRsZVRpbWVyID0gRGF0ZS5ub3coKTtcclxuICAgIGlmICghdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZWwgPSB0aGlzLnNlbGVjdGlvbnNbMF07XHJcbiAgICBjb25zdCBub3RlID0gc2VsLm5vdGUgYXMgU21vTm90ZTtcclxuICAgIGlmIChub3RlLnBpdGNoZXMubGVuZ3RoIDwgMikge1xyXG4gICAgICB0aGlzLnBpdGNoSW5kZXggPSAtMTtcclxuICAgICAgdGhpcy5yZW1vdmVQaXRjaFNlbGVjdGlvbigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnBpdGNoSW5kZXggPSAodGhpcy5waXRjaEluZGV4ICsgaW5kZXgpICUgbm90ZS5waXRjaGVzLmxlbmd0aDtcclxuICAgIHNlbC5zZWxlY3Rvci5waXRjaGVzID0gW107XHJcbiAgICBzZWwuc2VsZWN0b3IucGl0Y2hlcy5wdXNoKHRoaXMucGl0Y2hJbmRleCk7XHJcbiAgICB0aGlzLl9oaWdobGlnaHRQaXRjaFNlbGVjdGlvbihub3RlLCB0aGlzLnBpdGNoSW5kZXgpO1xyXG4gIH1cclxuICBtb3ZlU2VsZWN0aW9uUGl0Y2hVcCgpIHtcclxuICAgIHRoaXMuX21vdmVTZWxlY3Rpb25QaXRjaCgxKTtcclxuICB9XHJcbiAgbW92ZVNlbGVjdGlvblBpdGNoRG93bigpIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9tb3ZlU2VsZWN0aW9uUGl0Y2goKHRoaXMuc2VsZWN0aW9uc1swXS5ub3RlIGFzIFNtb05vdGUpLnBpdGNoZXMubGVuZ3RoIC0gMSk7XHJcbiAgfVxyXG5cclxuICBtb3ZlU2VsZWN0aW9uVXAoKSB7XHJcbiAgICB0aGlzLl9tb3ZlU3RhZmZPZmZzZXQoLTEpO1xyXG4gIH1cclxuICBtb3ZlU2VsZWN0aW9uRG93bigpIHtcclxuICAgIHRoaXMuX21vdmVTdGFmZk9mZnNldCgxKTtcclxuICB9XHJcblxyXG4gIGNvbnRhaW5zQXJ0aWZhY3QoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICBfcmVwbGFjZVNlbGVjdGlvbihuc2VsZWN0b3I6IFNtb1NlbGVjdG9yLCBza2lwUGxheTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuc2NvcmUgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIGFydGlmYWN0ID0gU21vU2VsZWN0aW9uLm5vdGVTZWxlY3Rpb24odGhpcy5zY29yZSwgbnNlbGVjdG9yLnN0YWZmLCBuc2VsZWN0b3IubWVhc3VyZSwgbnNlbGVjdG9yLnZvaWNlLCBuc2VsZWN0b3IudGljayk7XHJcbiAgICBpZiAoIWFydGlmYWN0KSB7XHJcbiAgICAgIGFydGlmYWN0ID0gU21vU2VsZWN0aW9uLm5vdGVTZWxlY3Rpb24odGhpcy5zY29yZSwgbnNlbGVjdG9yLnN0YWZmLCBuc2VsZWN0b3IubWVhc3VyZSwgMCwgbnNlbGVjdG9yLnRpY2spO1xyXG4gICAgfVxyXG4gICAgaWYgKCFhcnRpZmFjdCkge1xyXG4gICAgICBhcnRpZmFjdCA9IFNtb1NlbGVjdGlvbi5ub3RlU2VsZWN0aW9uKHRoaXMuc2NvcmUsIG5zZWxlY3Rvci5zdGFmZiwgbnNlbGVjdG9yLm1lYXN1cmUsIDAsIDApO1xyXG4gICAgfVxyXG4gICAgaWYgKCFhcnRpZmFjdCkge1xyXG4gICAgICAvLyBkaXNhcHBlYXJlZCAtIGRlZmF1bHQgdG8gc3RhcnRcclxuICAgICAgYXJ0aWZhY3QgPSBTbW9TZWxlY3Rpb24ubm90ZVNlbGVjdGlvbih0aGlzLnNjb3JlLCAwLCAwLCAwLCAwKTtcclxuICAgIH1cclxuICAgIGlmICghc2tpcFBsYXkgJiYgdGhpcy5hdXRvUGxheSAmJiBhcnRpZmFjdCkge1xyXG4gICAgICB0aGlzLnBsYXlTZWxlY3Rpb24oYXJ0aWZhY3QpO1xyXG5cclxuICAgIH1cclxuICAgIGlmICghYXJ0aWZhY3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgYXJ0aWZhY3QubWVhc3VyZS5zZXRBY3RpdmVWb2ljZShuc2VsZWN0b3Iudm9pY2UpO1xyXG5cclxuICAgIC8vIGNsZWFyIG1vZGlmaWVyIHNlbGVjdGlvbnNcclxuICAgIHRoaXMuY2xlYXJNb2RpZmllclNlbGVjdGlvbnMoKTtcclxuICAgIHRoaXMuc2NvcmUuc2V0QWN0aXZlU3RhZmYobnNlbGVjdG9yLnN0YWZmKTtcclxuICAgIGNvbnN0IG1hcEtleSA9IE9iamVjdC5rZXlzKHRoaXMubWVhc3VyZU5vdGVNYXApLmZpbmQoKGspID0+XHJcbiAgICAgIGFydGlmYWN0ICYmIFNtb1NlbGVjdG9yLnNhbWVOb3RlKHRoaXMubWVhc3VyZU5vdGVNYXBba10uc2VsZWN0b3IsIGFydGlmYWN0LnNlbGVjdG9yKVxyXG4gICAgKTtcclxuICAgIGlmICghbWFwS2V5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1hcHBlZCA9IHRoaXMubWVhc3VyZU5vdGVNYXBbbWFwS2V5XTtcclxuICAgIC8vIElmIHRoaXMgaXMgYSBuZXcgc2VsZWN0aW9uLCByZW1vdmUgcGl0Y2gtc3BlY2lmaWMgYW5kIHJlcGxhY2Ugd2l0aCBub3RlLXNwZWNpZmljXHJcbiAgICBpZiAoIW5zZWxlY3Rvci5waXRjaGVzIHx8IG5zZWxlY3Rvci5waXRjaGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnBpdGNoSW5kZXggPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbnMgPSBbbWFwcGVkXTtcclxuICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICAgIHRoaXMuX2NyZWF0ZUxvY2FsTW9kaWZpZXJzTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rmlyc3RNZWFzdXJlT2ZTZWxlY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25zWzBdLm1lYXN1cmU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgLy8gIyMgbWVhc3VyZUl0ZXJhdG9yXHJcbiAgLy8gRGVzY3JpcHRpb246IGl0ZXJhdGUgb3ZlciB0aGUgYW55IG1lYXN1cmVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHNlbGVjdGlvblxyXG4gIGdldFNlbGVjdGVkTWVhc3VyZXMoKTogU21vU2VsZWN0aW9uW10ge1xyXG4gICAgY29uc3Qgc2V0OiBudW1iZXJbXSA9IFtdO1xyXG4gICAgY29uc3QgcnY6IFNtb1NlbGVjdGlvbltdID0gW107XHJcbiAgICBpZiAoIXRoaXMuc2NvcmUpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3Rpb25zLmZvckVhY2goKHNlbCkgPT4ge1xyXG4gICAgICBjb25zdCBtZWFzdXJlID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zY29yZSEsIHNlbC5zZWxlY3Rvci5zdGFmZiwgc2VsLnNlbGVjdG9yLm1lYXN1cmUpO1xyXG4gICAgICBpZiAobWVhc3VyZSkge1xyXG4gICAgICAgIGNvbnN0IGl4ID0gbWVhc3VyZS5zZWxlY3Rvci5tZWFzdXJlO1xyXG4gICAgICAgIGlmIChzZXQuaW5kZXhPZihpeCkgPT09IC0xKSB7XHJcbiAgICAgICAgICBzZXQucHVzaChpeCk7XHJcbiAgICAgICAgICBydi5wdXNoKG1lYXN1cmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG5cclxuICBfYWRkU2VsZWN0aW9uKHNlbGVjdGlvbjogU21vU2VsZWN0aW9uKSB7XHJcbiAgICBjb25zdCBhcjogU21vU2VsZWN0aW9uW10gPSB0aGlzLnNlbGVjdGlvbnMuZmlsdGVyKChzZWwpID0+XHJcbiAgICAgIFNtb1NlbGVjdG9yLm5lcShzZWwuc2VsZWN0b3IsIHNlbGVjdGlvbi5zZWxlY3RvcilcclxuICAgICk7XHJcbiAgICBpZiAodGhpcy5hdXRvUGxheSAmJiB0aGlzLnNjb3JlKSB7XHJcbiAgICAgIHRoaXMucGxheVNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgfVxyXG4gICAgYXIucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25zID0gYXI7XHJcbiAgfVxyXG5cclxuICBfc2VsZWN0RnJvbVRvSW5TdGFmZihzY29yZTogU21vU2NvcmUsIHNlbDE6IFNtb1NlbGVjdGlvbiwgc2VsMjogU21vU2VsZWN0aW9uKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gU21vU2VsZWN0aW9uLmlubmVyU2VsZWN0aW9ucyhzY29yZSwgc2VsMS5zZWxlY3Rvciwgc2VsMi5zZWxlY3Rvcik7XHJcbiAgICAvKiAuZmlsdGVyKChmZikgPT4gXHJcbiAgICAgIGZmLnNlbGVjdG9yLnZvaWNlID09PSBzZWwxLm1lYXN1cmUuYWN0aXZlVm9pY2VcclxuICAgICk7ICovXHJcbiAgICB0aGlzLnNlbGVjdGlvbnMgPSBbXTtcclxuICAgIC8vIEdldCB0aGUgYWN0dWFsIHNlbGVjdGlvbnMgZnJvbSBvdXIgbWFwLCBzaW5jZSB0aGUgY2xpZW50IGJvdW5kaW5nIGJveGVzIGFyZSBhbHJlYWR5IGNvbXB1dGVkXHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbCkgPT4ge1xyXG4gICAgICBjb25zdCBrZXkgPSBTbW9TZWxlY3Rvci5nZXROb3RlS2V5KHNlbC5zZWxlY3Rvcik7XHJcbiAgICAgIHNlbC5tZWFzdXJlLnNldEFjdGl2ZVZvaWNlKHNlbC5zZWxlY3Rvci52b2ljZSk7XHJcbiAgICAgIC8vIFNraXAgbWVhc3VyZXMgdGhhdCBhcmUgbm90IHJlbmRlcmVkIGJlY2F1c2UgdGhleSBhcmUgcGFydCBvZiBhIG11bHRpLXJlc3RcclxuICAgICAgaWYgKHRoaXMubWVhc3VyZU5vdGVNYXAgJiYgdGhpcy5tZWFzdXJlTm90ZU1hcFtrZXldKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25zLnB1c2godGhpcy5tZWFzdXJlTm90ZU1hcFtrZXldKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb25zID0gW3NlbDFdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pZGxlVGltZXIgPSBEYXRlLm5vdygpO1xyXG4gIH1cclxuICBfc2VsZWN0QmV0d2VlblNlbGVjdGlvbnMoczE6IFNtb1NlbGVjdGlvbiwgczI6IFNtb1NlbGVjdGlvbikge1xyXG4gICAgY29uc3Qgc2NvcmUgPSB0aGlzLnJlbmRlcmVyLnNjb3JlID8/IG51bGw7XHJcbiAgICBpZiAoIXNjb3JlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1pbiA9IFNtb1NlbGVjdG9yLmd0KHMxLnNlbGVjdG9yLCBzMi5zZWxlY3RvcikgPyBzMiA6IHMxO1xyXG4gICAgY29uc3QgbWF4ID0gU21vU2VsZWN0b3IubHQobWluLnNlbGVjdG9yLCBzMi5zZWxlY3RvcikgPyBzMiA6IHMxO1xyXG4gICAgdGhpcy5fc2VsZWN0RnJvbVRvSW5TdGFmZihzY29yZSwgbWluLCBtYXgpO1xyXG4gICAgdGhpcy5fY3JlYXRlTG9jYWxNb2RpZmllcnNMaXN0KCk7XHJcbiAgICB0aGlzLmhpZ2hsaWdodFF1ZXVlLnNlbGVjdGlvbkNvdW50ID0gdGhpcy5zZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICB9XHJcbiAgc2VsZWN0U3VnZ2VzdGlvbihldjogS2V5RXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5zdWdnZXN0aW9uIHx8ICF0aGlzLnN1Z2dlc3Rpb24ubWVhc3VyZSB8fCB0aGlzLnNjb3JlID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaWRsZVRpbWVyID0gRGF0ZS5ub3coKTtcclxuXHJcbiAgICBpZiAodGhpcy5tb2RpZmllclN1Z2dlc3Rpb24pIHtcclxuICAgICAgdGhpcy5tb2RpZmllckluZGV4ID0gLTE7XHJcbiAgICAgIHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zID0gW3RoaXMubW9kaWZpZXJTdWdnZXN0aW9uXTtcclxuICAgICAgdGhpcy5tb2RpZmllclN1Z2dlc3Rpb24gPSBudWxsO1xyXG4gICAgICB0aGlzLmNyZWF0ZUxvY2FsTW9kaWZpZXJzRnJvbU1vZGlmaWVyVGFicyh0aGlzLm1vZGlmaWVyU2VsZWN0aW9ucyk7XHJcbiAgICAgIC8vIElmIHdlIHNlbGVjdGVkIGR1ZSB0byBhIG1vdXNlIGNsaWNrLCBtb3ZlIHRoZSBzZWxlY3Rpb24gdG8gdGhlXHJcbiAgICAgIC8vIHNlbGVjdGVkIG1vZGlmaWVyXHJcbiAgICAgIHRoaXMuX2hpZ2hsaWdodE1vZGlmaWVyKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAoZXYudHlwZSA9PT0gJ2NsaWNrJykge1xyXG4gICAgICB0aGlzLmNsZWFyTW9kaWZpZXJTZWxlY3Rpb25zKCk7IC8vIGlmIHdlIGNsaWNrIG9uIGEgbm9uLW1vZGlmaWVyLCBjbGVhciB0aGVcclxuICAgICAgLy8gbW9kaWZpZXIgc2VsZWN0aW9uc1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChldi5zaGlmdEtleSkge1xyXG4gICAgICBjb25zdCBzZWwxID0gdGhpcy5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKTtcclxuICAgICAgaWYgKHNlbDEuc2VsZWN0b3Iuc3RhZmYgPT09IHRoaXMuc3VnZ2VzdGlvbi5zZWxlY3Rvci5zdGFmZikge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdEJldHdlZW5TZWxlY3Rpb25zKHNlbDEsIHRoaXMuc3VnZ2VzdGlvbik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2LmN0cmxLZXkpIHtcclxuICAgICAgdGhpcy5fYWRkU2VsZWN0aW9uKHRoaXMuc3VnZ2VzdGlvbik7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvY2FsTW9kaWZpZXJzTGlzdCgpO1xyXG4gICAgICB0aGlzLmRlZmVySGlnaGxpZ2h0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmF1dG9QbGF5KSB7XHJcbiAgICAgIHRoaXMucGxheVNlbGVjdGlvbih0aGlzLnN1Z2dlc3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZXNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb25zWzBdID9cclxuICAgICAgU21vU2VsZWN0b3Iuc2FtZU5vdGUodGhpcy5zdWdnZXN0aW9uLnNlbGVjdG9yLCB0aGlzLnNlbGVjdGlvbnNbMF0uc2VsZWN0b3IpICYmIHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPT09IDEgOiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbnMucHVzaCh0aGlzLnN1Z2dlc3Rpb24pO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm90ZSA9IHRoaXMuc2VsZWN0aW9uc1swXS5ub3RlIGFzIFNtb05vdGU7XHJcbiAgICBpZiAocHJlc2VsZWN0ZWQgJiYgbm90ZS5waXRjaGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5waXRjaEluZGV4ID0gICh0aGlzLnBpdGNoSW5kZXggKyAxKSAlIG5vdGUucGl0Y2hlcy5sZW5ndGg7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uc1swXS5zZWxlY3Rvci5waXRjaGVzID0gW3RoaXMucGl0Y2hJbmRleF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBTbW9TZWxlY3Rpb24ubm90ZUZyb21TZWxlY3Rvcih0aGlzLnNjb3JlLCB0aGlzLnN1Z2dlc3Rpb24uc2VsZWN0b3IpO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgc2VsZWN0aW9uLmJveCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zdWdnZXN0aW9uLmJveCkpO1xyXG4gICAgICAgIHNlbGVjdGlvbi5zY3JvbGxCb3ggPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc3VnZ2VzdGlvbi5zY3JvbGxCb3gpKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbnMgPSBbc2VsZWN0aW9uXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHByZXNlbGVjdGVkICYmIHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBtb2RzICA9IHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmZpbHRlcigobW0pID0+IG1tLnNlbGVjdGlvbiAmJiBTbW9TZWxlY3Rvci5zYW1lTm90ZShtbS5zZWxlY3Rpb24uc2VsZWN0b3IsIHRoaXMuc2VsZWN0aW9uc1swXS5zZWxlY3RvcikpO1xyXG4gICAgICBpZiAobW9kcy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBtb2RUb0FkZCA9IG1vZHNbMF07XHJcbiAgICAgICAgaWYgKCFtb2RUb0FkZCkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKCdiYWQgbW9kaWZpZXIgc2VsZWN0aW9uIGluIHNlbGVjdFN1Z2dlc3Rpb24gMicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1vZGlmaWVyU2VsZWN0aW9uc1swXSA9IG1vZFRvQWRkO1xyXG4gICAgICAgIHRoaXMubW9kaWZpZXJJbmRleCA9IG1vZHNbMF0uaW5kZXg7XHJcbiAgICAgICAgdGhpcy5faGlnaGxpZ2h0TW9kaWZpZXIoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2NvcmUuc2V0QWN0aXZlU3RhZmYodGhpcy5zZWxlY3Rpb25zWzBdLnNlbGVjdG9yLnN0YWZmKTtcclxuICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICAgIHRoaXMuX2NyZWF0ZUxvY2FsTW9kaWZpZXJzTGlzdCgpO1xyXG4gIH1cclxuICBfc2V0TW9kaWZpZXJBc1N1Z2dlc3Rpb24oYXJ0aWZhY3Q6IE1vZGlmaWVyVGFiKTogdm9pZCB7XHJcbiAgICBpZiAoIWFydGlmYWN0LmJveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm1vZGlmaWVyU3VnZ2VzdGlvbiA9IGFydGlmYWN0O1xyXG4gICAgdGhpcy5fZHJhd1JlY3QoYXJ0aWZhY3QuYm94LCAnc3VnZ2VzdGlvbicpO1xyXG4gIH1cclxuXHJcbiAgX3NldEFydGlmYWN0QXNTdWdnZXN0aW9uKGFydGlmYWN0OiBTbW9TZWxlY3Rpb24pIHtcclxuICAgIGxldCBzYW1lU2VsOiBTbW9TZWxlY3Rpb24gfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGlvbnMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgc3MgPSB0aGlzLnNlbGVjdGlvbnNbaV07XHJcbiAgICAgIGlmIChzcyAmJiBTbW9TZWxlY3Rvci5zYW1lTm90ZShzcy5zZWxlY3RvciwgYXJ0aWZhY3Quc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgc2FtZVNlbCA9IHNzO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoc2FtZVNlbCB8fCAhYXJ0aWZhY3QuYm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubW9kaWZpZXJTdWdnZXN0aW9uID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLnN1Z2dlc3Rpb24gPSBhcnRpZmFjdDtcclxuICAgIHRoaXMuX2RyYXdSZWN0KGFydGlmYWN0LmJveCwgJ3N1Z2dlc3Rpb24nKTtcclxuICB9XHJcbiAgX2hpZ2hsaWdodE1vZGlmaWVyKCkge1xyXG4gICAgbGV0IGJveDogU3ZnQm94IHwgbnVsbCA9IG51bGw7XHJcbiAgICBpZiAoIXRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbW92ZU1vZGlmaWVyU2VsZWN0aW9uQm94KCk7XHJcbiAgICB0aGlzLm1vZGlmaWVyU2VsZWN0aW9ucy5mb3JFYWNoKChhcnRpZmFjdCkgPT4ge1xyXG4gICAgICBpZiAoYm94ID09PSBudWxsKSB7XHJcbiAgICAgICAgYm94ID0gYXJ0aWZhY3QubW9kaWZpZXIubG9naWNhbEJveCA/PyBudWxsO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGJveCA9IFN2Z0hlbHBlcnMudW5pb25SZWN0KGJveCwgU3ZnSGVscGVycy5zbW9Cb3goYXJ0aWZhY3QubW9kaWZpZXIubG9naWNhbEJveCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChib3ggPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZHJhd1JlY3QoYm94LCAnc3RhZmZNb2RpZmllcicpO1xyXG4gIH1cclxuXHJcbiAgX2hpZ2hsaWdodFBpdGNoU2VsZWN0aW9uKG5vdGU6IFNtb05vdGUsIGluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG5vdGVEaXYgPSAkKHRoaXMucmVuZGVyRWxlbWVudCkuZmluZCgnIycgKyBub3RlLnJlbmRlcklkKTtcclxuICAgIGNvbnN0IGhlYWRzID0gbm90ZURpdi5maW5kKCcudmYtbm90ZWhlYWQnKTtcclxuICAgIGlmICghaGVhZHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGhlYWRFbCA9IGhlYWRzW2luZGV4XTtcclxuICAgIGNvbnN0IHBhZ2VDb250ZXh0ID0gdGhpcy5yZW5kZXJlci5wYWdlTWFwLmdldFJlbmRlcmVyRnJvbU1vZGlmaWVyKG5vdGUpO1xyXG4gICAgJChwYWdlQ29udGV4dC5zdmcpLmZpbmQoJy52Zi1waXRjaFNlbGVjdGlvbicpLnJlbW92ZSgpO1xyXG4gICAgY29uc3QgYm94ID0gcGFnZUNvbnRleHQub2Zmc2V0QmJveChoZWFkRWwpO1xyXG4gICAgdGhpcy5fZHJhd1JlY3QoYm94LCAncGl0Y2hTZWxlY3Rpb24nKTtcclxuICB9XHJcblxyXG4gIF9oaWdobGlnaHRBY3RpdmVWb2ljZShzZWxlY3Rpb246IFNtb1NlbGVjdGlvbikge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3Rpb24uc2VsZWN0b3I7XHJcbiAgICBmb3IgKGkgPSAxOyBpIDw9IDQ7ICsraSkge1xyXG4gICAgICBjb25zdCBjbCA9ICd2JyArIGkudG9TdHJpbmcoKSArICctYWN0aXZlJztcclxuICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKGNsKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGMyID0gJ3YnICsgKHNlbGVjdG9yLnZvaWNlICsgMSkudG9TdHJpbmcoKSArICctYWN0aXZlJztcclxuICAgICQoJ2JvZHknKS5hZGRDbGFzcyhjMik7XHJcbiAgfVxyXG4gIC8vIFRoZSB1c2VyIGhhcyBqdXN0IHN3aXRjaGVkIHZvaWNlcywgc2VsZWN0IHRoZSBhY3RpdmUgdm9pY2VcclxuICBzZWxlY3RBY3RpdmVWb2ljZSgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uc1swXTtcclxuICAgIGNvbnN0IHNlbGVjdG9yID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWxlY3Rpb24uc2VsZWN0b3IpKTtcclxuICAgIHNlbGVjdG9yLnZvaWNlID0gc2VsZWN0aW9uLm1lYXN1cmUuYWN0aXZlVm9pY2U7XHJcbiAgICB0aGlzLnNlbGVjdGlvbnMgPSBbdGhpcy5fZ2V0Q2xvc2VzdFRpY2soc2VsZWN0b3IpXTtcclxuICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICB9XHJcblxyXG4gIGhpZ2hsaWdodFNlbGVjdGlvbigpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBwcmV2U2VsOiBTbW9TZWxlY3Rpb24gfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBjdXJCb3g6IFN2Z0JveCA9IFN2Z0JveC5kZWZhdWx0O1xyXG4gICAgdGhpcy5pZGxlVGltZXIgPSBEYXRlLm5vdygpO1xyXG4gICAgY29uc3QgZ3JhY2UgPSB0aGlzLmdldFNlbGVjdGVkR3JhY2VOb3RlcygpO1xyXG4gICAgLy8gSWYgdGhpcyBpcyBub3QgYSBub3RlIHdpdGggZ3JhY2Ugbm90ZXMsIGxvZ2ljYWxseSB1bnNlbGVjdCB0aGUgZ3JhY2Ugbm90ZXNcclxuICAgIGlmIChncmFjZSAmJiBncmFjZS5sZW5ndGggJiYgZ3JhY2VbMF0uc2VsZWN0aW9uICYmIHRoaXMuc2VsZWN0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgaWYgKCFTbW9TZWxlY3Rvci5zYW1lTm90ZShncmFjZVswXS5zZWxlY3Rpb24uc2VsZWN0b3IsIHRoaXMuc2VsZWN0aW9uc1swXS5zZWxlY3RvcikpIHtcclxuICAgICAgICB0aGlzLmNsZWFyTW9kaWZpZXJTZWxlY3Rpb25zKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5faGlnaGxpZ2h0TW9kaWZpZXIoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIElmIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gd2l0aCBhIGNoYW5nZSwgYXZvaWQgcmVmZXJlbmNpbmcgbnVsbCBub3RlXHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0aW9uc1swXS5ub3RlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG5vdGUgPSB0aGlzLnNlbGVjdGlvbnNbMF0ubm90ZSBhcyBTbW9Ob3RlO1xyXG4gICAgaWYgKHRoaXMucGl0Y2hJbmRleCA+PSAwICYmIHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPT09IDEgJiZcclxuICAgICAgdGhpcy5waXRjaEluZGV4IDwgbm90ZS5waXRjaGVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLl9oaWdobGlnaHRQaXRjaFNlbGVjdGlvbihub3RlLCB0aGlzLnBpdGNoSW5kZXgpO1xyXG4gICAgICB0aGlzLl9oaWdobGlnaHRBY3RpdmVWb2ljZSh0aGlzLnNlbGVjdGlvbnNbMF0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbW92ZVBpdGNoU2VsZWN0aW9uKCk7XHJcbiAgICB0aGlzLnBpdGNoSW5kZXggPSAtMTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbnMubGVuZ3RoID09PSAxICYmIG5vdGUubG9naWNhbEJveCkge1xyXG4gICAgICB0aGlzLl9kcmF3UmVjdChub3RlLmxvZ2ljYWxCb3gsICdzZWxlY3Rpb24nKTtcclxuICAgICAgdGhpcy5faGlnaGxpZ2h0QWN0aXZlVm9pY2UodGhpcy5zZWxlY3Rpb25zWzBdKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc29ydGVkID0gdGhpcy5zZWxlY3Rpb25zLnNvcnQoKGEsIGIpID0+IFNtb1NlbGVjdG9yLmd0KGEuc2VsZWN0b3IsIGIuc2VsZWN0b3IpID8gMSA6IC0xKTtcclxuICAgIHByZXZTZWwgPSBzb3J0ZWRbMF07XHJcbiAgICAvLyByZW5kZXJlZCB5ZXQ/XHJcbiAgICBpZiAoIXByZXZTZWwgfHwgIXByZXZTZWwuYm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGN1ckJveCA9IFN2Z0hlbHBlcnMuc21vQm94KHByZXZTZWwuYm94KTtcclxuICAgIGNvbnN0IGJveGVzOiBTdmdCb3hbXSA9IFtdO1xyXG4gICAgZm9yIChpID0gMTsgaSA8IHNvcnRlZC5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBzZWwgPSBzb3J0ZWRbaV07XHJcbiAgICAgIGlmICghc2VsLmJveCB8fCAhcHJldlNlbC5ib3gpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBjb25zdCB5ZGlmZiA9IE1hdGguYWJzKHByZXZTZWwuYm94LnkgLSBzZWwuYm94LnkpO1xyXG4gICAgICBpZiAoc2VsLnNlbGVjdG9yLnN0YWZmID09PSBwcmV2U2VsLnNlbGVjdG9yLnN0YWZmICYmIHNlbC5tZWFzdXJlLnN2Zy5saW5lSW5kZXggPT09IHByZXZTZWwubWVhc3VyZS5zdmcubGluZUluZGV4KSB7XHJcbiAgICAgICAgY3VyQm94ID0gU3ZnSGVscGVycy51bmlvblJlY3QoY3VyQm94LCBzZWwuYm94KTtcclxuICAgICAgfSBlbHNlIGlmIChjdXJCb3gpIHtcclxuICAgICAgICBib3hlcy5wdXNoKGN1ckJveCk7XHJcbiAgICAgICAgY3VyQm94ID0gU3ZnSGVscGVycy5zbW9Cb3goc2VsLmJveCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5faGlnaGxpZ2h0QWN0aXZlVm9pY2Uoc2VsKTtcclxuICAgICAgcHJldlNlbCA9IHNlbDtcclxuICAgIH1cclxuICAgIGJveGVzLnB1c2goY3VyQm94KTtcclxuICAgIGlmICh0aGlzLm1vZGlmaWVyU2VsZWN0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgYm94ZXMucHVzaCh0aGlzLm1vZGlmaWVyU2VsZWN0aW9uc1swXS5ib3gpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZHJhd1JlY3QoYm94ZXMsICdzZWxlY3Rpb24nKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQm94ZXMgYXJlIGRpdmlkZWQgdXAgaW50byBsaW5lcy9zeXN0ZW1zIGFscmVhZHkuICBCdXQgd2UgbmVlZFxyXG4gICAqIHRvIHB1dCB0aGUgY29ycmVjdCBib3ggb24gdGhlIGNvcnJlY3QgcGFnZS5cclxuICAgKiBAcGFyYW0gYm94ZXMgXHJcbiAgICovXHJcbiAgZHJhd1NlbGVjdGlvblJlY3RzKGJveGVzOiBTdmdCb3hbXSkge1xyXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0aW9uUmVjdHMpO1xyXG4gICAgLy8gZXJhc2UgYW55IG9sZCBzZWxlY3Rpb25zXHJcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBvb24gPSB0aGlzLnNlbGVjdGlvblJlY3RzW3BhcnNlSW50KGtleSldO1xyXG4gICAgICBvb24uZm9yRWFjaCgob3V0bGluZSkgPT4ge1xyXG4gICAgICAgIGlmIChvdXRsaW5lLmVsZW1lbnQpIHtcclxuICAgICAgICAgIG91dGxpbmUuZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICAgIG91dGxpbmUuZWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICBcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VsZWN0aW9uUmVjdHMgPSB7fTtcclxuICAgIC8vIENyZWF0ZSBhbiBPdXRsaW5lSW5mbyBmb3IgZWFjaCBwYWdlXHJcbiAgICBjb25zdCBwYWdlczogbnVtYmVyW10gPSBbXTtcclxuICAgIGNvbnN0IHN0cm9rZTogU3Ryb2tlSW5mbyA9IChTdWlUcmFja2VyLnN0cm9rZXMgYXMgYW55KVsnc2VsZWN0aW9uJ107XHJcbiAgICBib3hlcy5mb3JFYWNoKChib3gpID0+IHtcclxuICAgICAgbGV0IHRlc3RCb3g6IFN2Z0JveCA9IFN2Z0hlbHBlcnMuc21vQm94KGJveCk7XHJcbiAgICAgIGxldCBjb250ZXh0ID0gdGhpcy5yZW5kZXJlci5wYWdlTWFwLmdldFJlbmRlcmVyKHRlc3RCb3gpO1xyXG4gICAgICB0ZXN0Qm94LnkgLT0gY29udGV4dC5ib3gueTtcclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvblJlY3RzW2NvbnRleHQucGFnZU51bWJlcl0pIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvblJlY3RzW2NvbnRleHQucGFnZU51bWJlcl0gPSBbXTtcclxuICAgICAgICBwYWdlcy5wdXNoKGNvbnRleHQucGFnZU51bWJlcik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZWxlY3Rpb25SZWN0c1tjb250ZXh0LnBhZ2VOdW1iZXJdLnB1c2goe1xyXG4gICAgICAgIGNvbnRleHQ6IGNvbnRleHQsIGJveDogdGVzdEJveCwgY2xhc3NlczogJycsXHJcbiAgICAgICAgc3Ryb2tlLCBzY3JvbGw6IHRoaXMuc2Nyb2xsZXIuc2Nyb2xsU3RhdGUsXHJcbiAgICAgICAgdGltZU9mZjogMFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcGFnZXMuZm9yRWFjaCgocGFnZU5vKSA9PiB7XHJcbiAgICAgIGNvbnN0IG91dGxpbmVJbmZvcyA9IHRoaXMuc2VsZWN0aW9uUmVjdHNbcGFnZU5vXTtcclxuICAgICAgb3V0bGluZUluZm9zLmZvckVhY2goKGluZm8pID0+IHtcclxuICAgICAgICBTdmdIZWxwZXJzLm91dGxpbmVSZWN0KGluZm8pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBfZHJhd1JlY3QocEJveDogU3ZnQm94IHwgU3ZnQm94W10sIHN0cm9rZU5hbWU6IHN0cmluZykgeyAgICBcclxuICAgIGNvbnN0IHN0cm9rZTogU3Ryb2tlSW5mbyA9IChTdWlUcmFja2VyLnN0cm9rZXMgYXMgYW55KVtzdHJva2VOYW1lXTtcclxuICAgIGNvbnN0IGJveGVzID0gQXJyYXkuaXNBcnJheShwQm94KSA/IHBCb3ggOiBbcEJveF07XHJcbiAgICBpZiAoc3Ryb2tlTmFtZSA9PT0gJ3NlbGVjdGlvbicpIHtcclxuICAgICAgdGhpcy5kcmF3U2VsZWN0aW9uUmVjdHMoYm94ZXMpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBib3hlcy5mb3JFYWNoKChib3gpID0+IHtcclxuICAgICAgbGV0IHRlc3RCb3g6IFN2Z0JveCA9IFN2Z0hlbHBlcnMuc21vQm94KGJveCk7XHJcbiAgICAgIGxldCBjb250ZXh0ID0gdGhpcy5yZW5kZXJlci5wYWdlTWFwLmdldFJlbmRlcmVyKHRlc3RCb3gpO1xyXG4gICAgICBjb25zdCB0aW1lT2ZmID0gc3Ryb2tlTmFtZSA9PT0gJ3N1Z2dlc3Rpb24nID8gMTAwMCA6IDA7ICAgIFxyXG4gICAgICBpZiAoY29udGV4dCkge1xyXG4gICAgICAgIHRlc3RCb3gueSAtPSBjb250ZXh0LmJveC55O1xyXG4gICAgICAgIGlmICghdGhpcy5vdXRsaW5lc1tzdHJva2VOYW1lXSkge1xyXG4gICAgICAgICAgdGhpcy5vdXRsaW5lc1tzdHJva2VOYW1lXSA9IHtcclxuICAgICAgICAgICAgY29udGV4dDogY29udGV4dCwgYm94OiB0ZXN0Qm94LCBjbGFzc2VzOiAnJyxcclxuICAgICAgICAgICAgc3Ryb2tlLCBzY3JvbGw6IHRoaXMuc2Nyb2xsZXIuc2Nyb2xsU3RhdGUsXHJcbiAgICAgICAgICAgIHRpbWVPZmZcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub3V0bGluZXNbc3Ryb2tlTmFtZV0uYm94ID0gdGVzdEJveDtcclxuICAgICAgICB0aGlzLm91dGxpbmVzW3N0cm9rZU5hbWVdLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgICAgIFN2Z0hlbHBlcnMub3V0bGluZVJlY3QodGhpcy5vdXRsaW5lc1tzdHJva2VOYW1lXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/render/sui/tracker.ts\n\n}");
426
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiTracker: () => (/* binding */ SuiTracker)\n/* harmony export */ });\n/* harmony import */ var _mapper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mapper */ \"./src/render/sui/mapper.ts\");\n/* harmony import */ var _svgHelpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../smo/xform/selections */ \"./src/smo/xform/selections.ts\");\n/* harmony import */ var _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../common/serializationHelpers */ \"./src/common/serializationHelpers.js\");\n/* harmony import */ var _audio_oscillator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../audio/oscillator */ \"./src/render/audio/oscillator.ts\");\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/data/common */ \"./src/smo/data/common.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n\n\n\n\n\n\n/**\n * SuiTracker\n * A tracker maps the UI elements to the logical elements ,and allows the user to\n * move through the score and make selections, for navigation and editing.\n * @category SuiRender\n */\nclass SuiTracker extends _mapper__WEBPACK_IMPORTED_MODULE_0__.SuiMapper {\n static get strokes() {\n return {\n suggestion: {\n strokeName: 'suggestion',\n stroke: '#fc9',\n strokeWidth: 3,\n strokeDasharray: '4,1',\n fill: 'none',\n opacity: 1.0\n },\n selection: {\n strokeName: 'selection',\n stroke: '#99d',\n strokeWidth: 3,\n strokeDasharray: 2,\n fill: 'none',\n opacity: 1.0\n },\n staffModifier: {\n strokeName: 'staffModifier',\n stroke: '#933',\n strokeWidth: 3,\n fill: 'none',\n strokeDasharray: 0,\n opacity: 1.0\n }, pitchSelection: {\n strokeName: 'pitchSelection',\n stroke: '#933',\n strokeWidth: 3,\n fill: 'none',\n strokeDasharray: 0,\n opacity: 1.0\n }\n };\n }\n constructor(renderer, scroller) {\n super(renderer, scroller);\n this.idleTimer = Date.now();\n this.musicCursorGlyph = null;\n this.deferPlayAdvance = false;\n }\n // ### renderElement\n // the element the score is rendered on\n get renderElement() {\n return this.renderer.renderElement;\n }\n get score() {\n return this.renderer.score;\n }\n getIdleTime() {\n return this.idleTimer;\n }\n playSelection(artifact) {\n if (!this.deferPlayAdvance && this.score) {\n _audio_oscillator__WEBPACK_IMPORTED_MODULE_4__.SuiOscillator.playSelectionNow(artifact, this.score, 1);\n }\n else {\n this.deferPlayAdvance = false;\n }\n }\n deferNextAutoPlay() {\n if (this.score) {\n // don't play on advance if we've just added a note and played it because they overlap\n if (this.score.preferences.autoAdvance && this.score.preferences.autoPlay) {\n this.deferPlayAdvance = true;\n }\n }\n }\n getSelectedModifier() {\n if (this.modifierSelections.length) {\n return this.modifierSelections[0];\n }\n return null;\n }\n getSelectedModifiers() {\n return this.modifierSelections;\n }\n static serializeEvent(evKey) {\n if (!evKey) {\n return [];\n }\n const rv = {};\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_3__.smoSerialize.serializedMerge(['type', 'shiftKey', 'ctrlKey', 'altKey', 'key', 'keyCode'], evKey, rv);\n return rv;\n }\n advanceModifierSelection(keyEv) {\n if (!keyEv) {\n return;\n }\n this.idleTimer = Date.now();\n const offset = keyEv.key === 'ArrowLeft' ? -1 : 1;\n this.modifierIndex = this.modifierIndex + offset;\n this.modifierIndex = (this.modifierIndex === -2 && this.localModifiers.length) ?\n this.localModifiers.length - 1 : this.modifierIndex;\n if (this.modifierIndex >= this.localModifiers.length || this.modifierIndex < 0) {\n this.modifierIndex = -1;\n this.modifierSelections = [];\n $('.vf-staffModifier').remove();\n return;\n }\n const local = this.localModifiers[this.modifierIndex];\n const box = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.smoBox(local.box);\n this.modifierSelections = [{ index: 0, box, modifier: local.modifier, selection: local.selection }];\n this._highlightModifier();\n }\n static stringifyBox(box) {\n return '{x:' + box.x + ',y:' + box.y + ',width:' + box.width + ',height:' + box.height + '}';\n }\n // ### _getOffsetSelection\n // Get the selector that is the offset of the first existing selection\n _getOffsetSelection(offset) {\n if (!this.score) {\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.default;\n }\n let testSelection = this.getExtremeSelection(Math.sign(offset));\n const scopyTick = JSON.parse(JSON.stringify(testSelection.selector));\n const scopyMeasure = JSON.parse(JSON.stringify(testSelection.selector));\n scopyTick.tick += offset;\n scopyMeasure.measure += offset;\n const targetMeasure = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.measureSelection(this.score, testSelection.selector.staff, scopyMeasure.measure);\n if (targetMeasure && targetMeasure.measure && targetMeasure.measure.voices.length <= scopyMeasure.voice) {\n scopyMeasure.voice = 0;\n }\n if (targetMeasure && targetMeasure.measure) {\n scopyMeasure.tick = (offset < 0) ? targetMeasure.measure.voices[scopyMeasure.voice].notes.length - 1 : 0;\n }\n if (testSelection.measure.voices.length > scopyTick.voice &&\n testSelection.measure.voices[scopyTick.voice].notes.length > scopyTick.tick && scopyTick.tick >= 0) {\n if (testSelection.selector.voice !== testSelection.measure.getActiveVoice()) {\n scopyTick.voice = testSelection.measure.getActiveVoice();\n testSelection = this._getClosestTick(scopyTick);\n return testSelection.selector;\n }\n return scopyTick;\n }\n else if (targetMeasure &&\n scopyMeasure.measure < testSelection.staff.measures.length && scopyMeasure.measure >= 0) {\n return scopyMeasure;\n }\n return testSelection.selector;\n }\n getSelectedGraceNotes() {\n if (!this.modifierSelections.length) {\n return [];\n }\n const ff = this.modifierSelections.filter((mm) => { var _a, _b; return ((_b = (_a = mm.modifier) === null || _a === void 0 ? void 0 : _a.attrs) === null || _b === void 0 ? void 0 : _b.type) === 'SmoGraceNote'; });\n return ff;\n }\n isGraceNoteSelected() {\n if (this.modifierSelections.length) {\n const ff = this.modifierSelections.findIndex((mm) => mm.modifier.attrs.type === 'SmoGraceNote');\n return ff >= 0;\n }\n return false;\n }\n _growGraceNoteSelections(offset) {\n var _a;\n this.idleTimer = Date.now();\n const far = this.modifierSelections.filter((mm) => mm.modifier.attrs.type === 'SmoGraceNote');\n if (!far.length) {\n return;\n }\n const ix = (offset < 0) ? 0 : far.length - 1;\n const sel = far[ix];\n const left = this.localModifiers.filter((mt) => {\n var _a, _b;\n return ((_b = (_a = mt.modifier) === null || _a === void 0 ? void 0 : _a.attrs) === null || _b === void 0 ? void 0 : _b.type) === 'SmoGraceNote' && sel.selection && mt.selection &&\n _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(mt.selection.selector, sel.selection.selector);\n });\n if (ix + offset < 0 || ix + offset >= left.length) {\n return;\n }\n const leftSel = left[ix + offset];\n if (!leftSel) {\n console.warn('bad selector in _growGraceNoteSelections');\n }\n leftSel.box = (_a = leftSel.box) !== null && _a !== void 0 ? _a : _smo_data_common__WEBPACK_IMPORTED_MODULE_5__.SvgBox.default;\n this.modifierSelections.push(leftSel);\n this._highlightModifier();\n }\n get autoPlay() {\n return this.renderer.score ? this.renderer.score.preferences.autoPlay : false;\n }\n growSelectionRight() {\n this._growSelectionRight(false);\n }\n _growSelectionRight(skipPlay) {\n this.idleTimer = Date.now();\n if (this.isGraceNoteSelected()) {\n this._growGraceNoteSelections(1);\n return 0;\n }\n const nselect = this._getOffsetSelection(1);\n // already selected\n const artifact = this._getClosestTick(nselect);\n if (!artifact) {\n return 0;\n }\n if (this.selections.find((sel) => _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(sel.selector, artifact.selector))) {\n return 0;\n }\n if (!this.mapping && this.autoPlay && skipPlay === false && this.score) {\n this.playSelection(artifact);\n }\n this.selections.push(artifact);\n this.deferHighlight();\n this._createLocalModifiersList();\n return artifact.note.tickCount;\n }\n moveHome(keyEvent) {\n var _a, _b;\n const evKey = keyEvent !== null && keyEvent !== void 0 ? keyEvent : (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_5__.defaultKeyEvent)();\n this.idleTimer = Date.now();\n const ls = this.selections[0].staff;\n if (evKey.ctrlKey) {\n const mm = ls.measures[0];\n const homeSel = this._getClosestTick({ staff: ls.staffId,\n measure: 0, voice: mm.getActiveVoice(), tick: 0, pitches: [] });\n if (evKey.shiftKey) {\n this._selectBetweenSelections(this.selections[0], homeSel);\n }\n else {\n this.selections = [homeSel];\n this.deferHighlight();\n this._createLocalModifiersList();\n if (homeSel.measure.svg.logicalBox) {\n this.scroller.scrollVisibleBox(homeSel.measure.svg.logicalBox);\n }\n }\n }\n else {\n const system = this.selections[0].measure.svg.lineIndex;\n const lm = ls.measures.find((mm) => mm.svg.lineIndex === system && mm.measureNumber.systemIndex === 0);\n const mm = lm;\n const homeSel = this._getClosestTick({ staff: ls.staffId,\n measure: mm.measureNumber.measureIndex, voice: mm.getActiveVoice(),\n tick: 0, pitches: [] });\n if (evKey.shiftKey) {\n this._selectBetweenSelections(this.selections[0], homeSel);\n }\n else if ((_b = (_a = homeSel === null || homeSel === void 0 ? void 0 : homeSel.measure) === null || _a === void 0 ? void 0 : _a.svg) === null || _b === void 0 ? void 0 : _b.logicalBox) {\n this.selections = [homeSel];\n this.scroller.scrollVisibleBox(homeSel.measure.svg.logicalBox);\n this.deferHighlight();\n this._createLocalModifiersList();\n }\n }\n }\n moveEnd(keyEvent) {\n this.idleTimer = Date.now();\n const ls = this.selections[0].staff;\n const evKey = keyEvent !== null && keyEvent !== void 0 ? keyEvent : (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_5__.defaultKeyEvent)();\n if (evKey.ctrlKey) {\n const lm = ls.measures[ls.measures.length - 1];\n const voiceIx = lm.getActiveVoice();\n const voice = lm.voices[voiceIx];\n const endSel = this._getClosestTick({ staff: ls.staffId,\n measure: ls.measures.length - 1, voice: voiceIx, tick: voice.notes.length - 1, pitches: [] });\n if (evKey.shiftKey) {\n this._selectBetweenSelections(this.selections[0], endSel);\n }\n else {\n this.selections = [endSel];\n this.deferHighlight();\n this._createLocalModifiersList();\n if (endSel.measure.svg.logicalBox) {\n this.scroller.scrollVisibleBox(endSel.measure.svg.logicalBox);\n }\n }\n }\n else {\n const system = this.selections[0].measure.svg.lineIndex;\n // find the largest measure index on this staff in this system\n const measures = ls.measures.filter((mm) => mm.svg.lineIndex === system);\n const lm = measures.reduce((a, b) => b.measureNumber.measureIndex > a.measureNumber.measureIndex ? b : a);\n const ticks = lm.voices[lm.getActiveVoice()].notes.length;\n const endSel = this._getClosestTick({ staff: ls.staffId,\n measure: lm.measureNumber.measureIndex, voice: lm.getActiveVoice(), tick: ticks - 1, pitches: [] });\n if (evKey.shiftKey) {\n this._selectBetweenSelections(this.selections[0], endSel);\n }\n else {\n this.selections = [endSel];\n this.deferHighlight();\n this._createLocalModifiersList();\n if (endSel.measure.svg.logicalBox) {\n this.scroller.scrollVisibleBox(endSel.measure.svg.logicalBox);\n }\n }\n }\n }\n growSelectionRightMeasure() {\n let toSelect = 0;\n const rightmost = this.getExtremeSelection(1);\n const ticksLeft = rightmost.measure.voices[rightmost.measure.activeVoice]\n .notes.length - rightmost.selector.tick;\n if (ticksLeft === 0) {\n if (rightmost.selector.measure < rightmost.staff.measures.length) {\n const mix = rightmost.selector.measure + 1;\n rightmost.staff.measures[mix].setActiveVoice(rightmost.selector.voice);\n toSelect = rightmost.staff.measures[mix]\n .voices[rightmost.staff.measures[mix].activeVoice].notes.length;\n }\n }\n else {\n toSelect = ticksLeft;\n }\n while (toSelect > 0) {\n this._growSelectionRight(true);\n toSelect -= 1;\n }\n }\n growSelectionLeft() {\n if (this.isGraceNoteSelected()) {\n this._growGraceNoteSelections(-1);\n return 0;\n }\n this.idleTimer = Date.now();\n const nselect = this._getOffsetSelection(-1);\n // already selected\n const artifact = this._getClosestTick(nselect);\n if (!artifact) {\n return 0;\n }\n if (this.selections.find((sel) => _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(sel.selector, artifact.selector))) {\n return 0;\n }\n artifact.measure.setActiveVoice(nselect.voice);\n this.selections.push(artifact);\n if (this.autoPlay && this.score) {\n this.playSelection(artifact);\n }\n this.deferHighlight();\n this._createLocalModifiersList();\n return artifact.note.tickCount;\n }\n // if we are being moved right programmatically, avoid playing the selected note.\n moveSelectionRight() {\n if (this.selections.length === 0 || this.score === null) {\n return;\n }\n const skipPlay = !this.score.preferences.autoPlay;\n // const original = JSON.parse(JSON.stringify(this.getExtremeSelection(-1).selector));\n const nselect = this._getOffsetSelection(1);\n // skip any measures that are not displayed due to rest or repetition\n const mselect = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.measureSelection(this.score, nselect.staff, nselect.measure);\n if (mselect === null || mselect === void 0 ? void 0 : mselect.measure.svg.multimeasureLength) {\n nselect.measure += mselect === null || mselect === void 0 ? void 0 : mselect.measure.svg.multimeasureLength;\n }\n if (mselect) {\n mselect.measure.setActiveVoice(nselect.voice);\n }\n this._replaceSelection(nselect, skipPlay);\n }\n moveSelectionLeft() {\n if (this.selections.length === 0 || this.score === null) {\n return;\n }\n const nselect = this._getOffsetSelection(-1);\n // Skip multimeasure rests in parts\n const mselect = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.measureSelection(this.score, nselect.staff, nselect.measure);\n while (nselect.measure > 0 && mselect && (mselect.measure.svg.hideMultimeasure || mselect.measure.svg.multimeasureLength > 0)) {\n nselect.measure -= 1;\n }\n if (mselect) {\n mselect.measure.setActiveVoice(nselect.voice);\n }\n this._replaceSelection(nselect, false);\n }\n moveSelectionLeftMeasure() {\n this._moveSelectionMeasure(-1);\n }\n moveSelectionRightMeasure() {\n this._moveSelectionMeasure(1);\n }\n _moveSelectionMeasure(offset) {\n const selection = this.getExtremeSelection(Math.sign(offset));\n this.idleTimer = Date.now();\n const selector = JSON.parse(JSON.stringify(selection.selector));\n selector.measure += offset;\n selector.tick = 0;\n const selObj = this._getClosestTick(selector);\n if (selObj) {\n this.selections = [selObj];\n }\n this.deferHighlight();\n this._createLocalModifiersList();\n }\n _moveStaffOffset(offset) {\n if (this.selections.length === 0 || this.score === null) {\n return;\n }\n this.idleTimer = Date.now();\n const nselector = JSON.parse(JSON.stringify(this.selections[0].selector));\n nselector.staff = this.score.incrementActiveStaff(offset);\n this.selections = [this._getClosestTick(nselector)];\n this.deferHighlight();\n this._createLocalModifiersList();\n }\n removePitchSelection() {\n if (this.outlines['pitchSelection']) {\n if (this.outlines['pitchSelection'].element) {\n this.outlines['pitchSelection'].element.remove();\n }\n delete this.outlines['pitchSelection'];\n }\n }\n // ### _moveSelectionPitch\n // Suggest a specific pitch in a chord, so we can transpose just the one note vs. the whole chord.\n _moveSelectionPitch(index) {\n this.idleTimer = Date.now();\n if (!this.selections.length) {\n return;\n }\n const sel = this.selections[0];\n const note = sel.note;\n if (note.pitches.length < 2) {\n this.pitchIndex = -1;\n this.removePitchSelection();\n return;\n }\n this.pitchIndex = (this.pitchIndex + index) % note.pitches.length;\n sel.selector.pitches = [];\n sel.selector.pitches.push(this.pitchIndex);\n this._highlightPitchSelection(note, this.pitchIndex);\n }\n moveSelectionPitchUp() {\n this._moveSelectionPitch(1);\n }\n moveSelectionPitchDown() {\n if (!this.selections.length) {\n return;\n }\n this._moveSelectionPitch(this.selections[0].note.pitches.length - 1);\n }\n moveSelectionUp() {\n this._moveStaffOffset(-1);\n }\n moveSelectionDown() {\n this._moveStaffOffset(1);\n }\n containsArtifact() {\n return this.selections.length > 0;\n }\n _replaceSelection(nselector, skipPlay) {\n if (this.score === null) {\n return;\n }\n var artifact = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.noteSelection(this.score, nselector.staff, nselector.measure, nselector.voice, nselector.tick);\n if (!artifact) {\n artifact = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.noteSelection(this.score, nselector.staff, nselector.measure, 0, nselector.tick);\n }\n if (!artifact) {\n artifact = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.noteSelection(this.score, nselector.staff, nselector.measure, 0, 0);\n }\n if (!artifact) {\n // disappeared - default to start\n artifact = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.noteSelection(this.score, 0, 0, 0, 0);\n }\n if (!skipPlay && this.autoPlay && artifact) {\n this.playSelection(artifact);\n }\n if (!artifact) {\n return;\n }\n artifact.measure.setActiveVoice(nselector.voice);\n // clear modifier selections\n this.clearModifierSelections();\n this.score.setActiveStaff(nselector.staff);\n const mapKey = Object.keys(this.measureNoteMap).find((k) => artifact && _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(this.measureNoteMap[k].selector, artifact.selector));\n if (!mapKey) {\n return;\n }\n const mapped = this.measureNoteMap[mapKey];\n // If this is a new selection, remove pitch-specific and replace with note-specific\n if (!nselector.pitches || nselector.pitches.length === 0) {\n this.pitchIndex = -1;\n }\n this.selections = [mapped];\n this.deferHighlight();\n this._createLocalModifiersList();\n }\n getFirstMeasureOfSelection() {\n if (this.selections.length) {\n return this.selections[0].measure;\n }\n return null;\n }\n // ## measureIterator\n // Description: iterate over the any measures that are part of the selection\n getSelectedMeasures() {\n const set = [];\n const rv = [];\n if (!this.score) {\n return [];\n }\n this.selections.forEach((sel) => {\n const measure = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.measureSelection(this.score, sel.selector.staff, sel.selector.measure);\n if (measure) {\n const ix = measure.selector.measure;\n if (set.indexOf(ix) === -1) {\n set.push(ix);\n rv.push(measure);\n }\n }\n });\n return rv;\n }\n _addSelection(selection) {\n const ar = this.selections.filter((sel) => _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.neq(sel.selector, selection.selector));\n if (this.autoPlay && this.score) {\n this.playSelection(selection);\n }\n ar.push(selection);\n this.selections = ar;\n }\n _selectFromToInStaff(score, sel1, sel2) {\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.innerSelections(score, sel1.selector, sel2.selector);\n /* .filter((ff) =>\n ff.selector.voice === sel1.measure.activeVoice\n ); */\n this.selections = [];\n // Get the actual selections from our map, since the client bounding boxes are already computed\n selections.forEach((sel) => {\n const key = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.getNoteKey(sel.selector);\n sel.measure.setActiveVoice(sel.selector.voice);\n // Skip measures that are not rendered because they are part of a multi-rest\n if (this.measureNoteMap && this.measureNoteMap[key]) {\n this.selections.push(this.measureNoteMap[key]);\n }\n });\n if (this.selections.length === 0) {\n this.selections = [sel1];\n }\n this.idleTimer = Date.now();\n }\n _selectBetweenSelections(s1, s2) {\n var _a;\n const score = (_a = this.renderer.score) !== null && _a !== void 0 ? _a : null;\n if (!score) {\n return;\n }\n const min = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.gt(s1.selector, s2.selector) ? s2 : s1;\n const max = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.lt(min.selector, s2.selector) ? s2 : s1;\n this._selectFromToInStaff(score, min, max);\n this._createLocalModifiersList();\n this.highlightQueue.selectionCount = this.selections.length;\n this.deferHighlight();\n }\n selectSuggestion(ev) {\n if (!this.suggestion || !this.suggestion.measure || this.score === null) {\n return;\n }\n this.idleTimer = Date.now();\n if (this.modifierSuggestion) {\n this.modifierIndex = -1;\n this.modifierSelections = [this.modifierSuggestion];\n this.modifierSuggestion = null;\n this.createLocalModifiersFromModifierTabs(this.modifierSelections);\n // If we selected due to a mouse click, move the selection to the\n // selected modifier\n this._highlightModifier();\n return;\n }\n else if (ev.type === 'click') {\n this.clearModifierSelections(); // if we click on a non-modifier, clear the\n // modifier selections\n }\n if (ev.shiftKey) {\n const sel1 = this.getExtremeSelection(-1);\n if (sel1.selector.staff === this.suggestion.selector.staff) {\n this._selectBetweenSelections(sel1, this.suggestion);\n return;\n }\n }\n if (ev.ctrlKey) {\n this._addSelection(this.suggestion);\n this._createLocalModifiersList();\n this.deferHighlight();\n return;\n }\n if (this.autoPlay) {\n this.playSelection(this.suggestion);\n }\n const preselected = this.selections[0] ?\n _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(this.suggestion.selector, this.selections[0].selector) && this.selections.length === 1 : false;\n if (this.selections.length === 0) {\n this.selections.push(this.suggestion);\n }\n const note = this.selections[0].note;\n if (preselected && note.pitches.length > 1) {\n this.pitchIndex = (this.pitchIndex + 1) % note.pitches.length;\n this.selections[0].selector.pitches = [this.pitchIndex];\n }\n else {\n const selection = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelection.noteFromSelector(this.score, this.suggestion.selector);\n if (selection) {\n selection.box = JSON.parse(JSON.stringify(this.suggestion.box));\n selection.scrollBox = JSON.parse(JSON.stringify(this.suggestion.scrollBox));\n this.selections = [selection];\n // There is a single selection, make sure the active voice is set to it.\n selection.measure.setActiveVoice(selection.selector.voice);\n this.selectActiveVoice();\n }\n }\n if (preselected && this.modifierSelections.length) {\n const mods = this.modifierSelections.filter((mm) => mm.selection && _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(mm.selection.selector, this.selections[0].selector));\n if (mods.length) {\n const modToAdd = mods[0];\n if (!modToAdd) {\n console.warn('bad modifier selection in selectSuggestion 2');\n }\n this.modifierSelections[0] = modToAdd;\n this.modifierIndex = mods[0].index;\n this._highlightModifier();\n return;\n }\n }\n this.score.setActiveStaff(this.selections[0].selector.staff);\n this.deferHighlight();\n this._createLocalModifiersList();\n }\n _setModifierAsSuggestion(artifact) {\n if (!artifact.box) {\n return;\n }\n this.modifierSuggestion = artifact;\n this._drawRect(artifact.box, 'suggestion');\n }\n _setArtifactAsSuggestion(artifact) {\n let sameSel = null;\n let i = 0;\n for (i = 0; i < this.selections.length; ++i) {\n const ss = this.selections[i];\n if (ss && _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(ss.selector, artifact.selector)) {\n sameSel = ss;\n break;\n }\n }\n if (sameSel || !artifact.box) {\n return;\n }\n this.modifierSuggestion = null;\n this.suggestion = artifact;\n this._drawRect(artifact.box, 'suggestion');\n }\n _highlightModifier() {\n let box = null;\n if (!this.modifierSelections.length) {\n return;\n }\n this.removeModifierSelectionBox();\n this.modifierSelections.forEach((artifact) => {\n var _a;\n if (box === null) {\n box = (_a = artifact.modifier.logicalBox) !== null && _a !== void 0 ? _a : null;\n }\n else {\n box = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.unionRect(box, _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.smoBox(artifact.modifier.logicalBox));\n }\n });\n if (box === null) {\n return;\n }\n this._drawRect(box, 'staffModifier');\n }\n _highlightPitchSelection(note, index) {\n const noteDiv = $(this.renderElement).find('#' + note.renderId);\n const heads = noteDiv.find('.vf-notehead');\n if (!heads.length) {\n return;\n }\n const headEl = heads[index];\n const pageContext = this.renderer.pageMap.getRendererFromModifier(note);\n $(pageContext.svg).find('.vf-pitchSelection').remove();\n const box = pageContext.offsetBbox(headEl);\n this._drawRect(box, 'pitchSelection');\n }\n _highlightActiveVoice(selection) {\n let i = 0;\n const selector = selection.selector;\n for (i = 1; i <= 4; ++i) {\n const cl = 'v' + i.toString() + '-active';\n $('body').removeClass(cl);\n }\n const c2 = 'v' + (selector.voice + 1).toString() + '-active';\n $('body').addClass(c2);\n }\n // The user has just switched voices, select the active voice\n selectActiveVoice() {\n const selection = this.selections[0];\n const selector = JSON.parse(JSON.stringify(selection.selector));\n selector.voice = selection.measure.activeVoice;\n this.selections = [this._getClosestTick(selector)];\n this.deferHighlight();\n }\n highlightSelection() {\n let i = 0;\n let prevSel = null;\n let curBox = _smo_data_common__WEBPACK_IMPORTED_MODULE_5__.SvgBox.default;\n this.idleTimer = Date.now();\n const grace = this.getSelectedGraceNotes();\n // If this is not a note with grace notes, logically unselect the grace notes\n if (grace && grace.length && grace[0].selection && this.selections.length) {\n if (!_smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.sameNote(grace[0].selection.selector, this.selections[0].selector)) {\n this.clearModifierSelections();\n }\n else {\n this._highlightModifier();\n return;\n }\n }\n // If there is a race condition with a change, avoid referencing null note\n if (!this.selections[0].note) {\n return;\n }\n const note = this.selections[0].note;\n if (this.pitchIndex >= 0 && this.selections.length === 1 &&\n this.pitchIndex < note.pitches.length) {\n this._highlightPitchSelection(note, this.pitchIndex);\n this._highlightActiveVoice(this.selections[0]);\n return;\n }\n this.removePitchSelection();\n this.pitchIndex = -1;\n if (this.selections.length === 1 && note.logicalBox) {\n this._drawRect(note.logicalBox, 'selection');\n this._highlightActiveVoice(this.selections[0]);\n return;\n }\n const sorted = this.selections.sort((a, b) => _smo_xform_selections__WEBPACK_IMPORTED_MODULE_2__.SmoSelector.gt(a.selector, b.selector) ? 1 : -1);\n prevSel = sorted[0];\n // rendered yet?\n if (!prevSel || !prevSel.box) {\n return;\n }\n curBox = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.smoBox(prevSel.box);\n const boxes = [];\n for (i = 1; i < sorted.length; ++i) {\n const sel = sorted[i];\n if (!sel.box || !prevSel.box) {\n continue;\n }\n // const ydiff = Math.abs(prevSel.box.y - sel.box.y);\n if (sel.selector.staff === prevSel.selector.staff && sel.measure.svg.lineIndex === prevSel.measure.svg.lineIndex) {\n curBox = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.unionRect(curBox, sel.box);\n }\n else if (curBox) {\n boxes.push(curBox);\n curBox = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.smoBox(sel.box);\n }\n this._highlightActiveVoice(sel);\n prevSel = sel;\n }\n boxes.push(curBox);\n if (this.modifierSelections.length) {\n boxes.push(this.modifierSelections[0].box);\n }\n this._drawRect(boxes, 'selection');\n }\n /**\n * Boxes are divided up into lines/systems already. But we need\n * to put the correct box on the correct page.\n * @param boxes\n */\n drawSelectionRects(boxes) {\n const keys = Object.keys(this.selectionRects);\n // erase any old selections\n keys.forEach((key) => {\n const oon = this.selectionRects[parseInt(key)];\n oon.forEach((outline) => {\n if (outline.element) {\n outline.element.remove();\n outline.element = undefined;\n }\n });\n });\n this.selectionRects = {};\n // Create an OutlineInfo for each page\n const pages = [];\n const stroke = SuiTracker.strokes['selection'];\n boxes.forEach((box) => {\n let testBox = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.smoBox(box);\n let context = this.renderer.pageMap.getRenderer(testBox);\n testBox.y -= context.box.y;\n if (!this.selectionRects[context.pageNumber]) {\n this.selectionRects[context.pageNumber] = [];\n pages.push(context.pageNumber);\n }\n this.selectionRects[context.pageNumber].push({\n context: context, box: testBox, classes: '',\n stroke, scroll: this.scroller.scrollState,\n timeOff: 0\n });\n });\n pages.forEach((pageNo) => {\n const outlineInfos = this.selectionRects[pageNo];\n outlineInfos.forEach((info) => {\n _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.outlineRect(info);\n });\n });\n }\n _drawRect(pBox, strokeName) {\n const stroke = SuiTracker.strokes[strokeName];\n const boxes = Array.isArray(pBox) ? pBox : [pBox];\n if (strokeName === 'selection') {\n this.drawSelectionRects(boxes);\n return;\n }\n boxes.forEach((box) => {\n let testBox = _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.smoBox(box);\n let context = this.renderer.pageMap.getRenderer(testBox);\n const timeOff = strokeName === 'suggestion' ? 1000 : 0;\n if (context) {\n testBox.y -= context.box.y;\n if (!this.outlines[strokeName]) {\n this.outlines[strokeName] = {\n context: context, box: testBox, classes: '',\n stroke, scroll: this.scroller.scrollState,\n timeOff\n };\n }\n this.outlines[strokeName].box = testBox;\n this.outlines[strokeName].context = context;\n _svgHelpers__WEBPACK_IMPORTED_MODULE_1__.SvgHelpers.outlineRect(this.outlines[strokeName]);\n }\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO29CQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHO3dCQUMxQixPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUU7d0JBQzNDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXO3dCQUN6QyxPQUFPO3FCQUNSLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztnQkFDNUMsbURBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3BELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy9yZW5kZXIvc3VpL3RyYWNrZXIudHM/ZjI4OCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuaW1wb3J0IHsgU3VpTWFwcGVyLCBTdWlSZW5kZXJlckJhc2UgfSBmcm9tICcuL21hcHBlcic7XHJcbmltcG9ydCB7IFN2Z0hlbHBlcnMsIFN0cm9rZUluZm8sIE91dGxpbmVJbmZvIH0gZnJvbSAnLi9zdmdIZWxwZXJzJztcclxuaW1wb3J0IHsgU21vU2VsZWN0aW9uLCBTbW9TZWxlY3RvciwgTW9kaWZpZXJUYWIgfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vc2VsZWN0aW9ucyc7XHJcbmltcG9ydCB7IHNtb1NlcmlhbGl6ZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZXJpYWxpemF0aW9uSGVscGVycyc7XHJcbmltcG9ydCB7IFN1aU9zY2lsbGF0b3IgfSBmcm9tICcuLi9hdWRpby9vc2NpbGxhdG9yJztcclxuaW1wb3J0IHsgU21vU2NvcmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zY29yZSc7XHJcbmltcG9ydCB7IFN2Z0JveCwgS2V5RXZlbnQsIGRlZmF1bHRLZXlFdmVudCwga2V5SGFuZGxlciB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL2NvbW1vbic7XHJcbmltcG9ydCB7IFN1aVNjcm9sbGVyIH0gZnJvbSAnLi9zY3JvbGxlcic7XHJcbmltcG9ydCB7IFBhc3RlQnVmZmVyIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL2NvcHlwYXN0ZSc7XHJcbmltcG9ydCB7IFNtb05vdGUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9ub3RlJztcclxuaW1wb3J0IHsgU21vTWVhc3VyZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL21lYXN1cmUnO1xyXG5pbXBvcnQgeyBsYXlvdXREZWJ1ZyB9IGZyb20gJy4vbGF5b3V0RGVidWcnO1xyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrZXJLZXlIYW5kbGVyIHtcclxuICBtb3ZlSG9tZSA6IGtleUhhbmRsZXIsIFxyXG4gIG1vdmVFbmQgOiBrZXlIYW5kbGVyLCBcclxuICBtb3ZlU2VsZWN0aW9uUmlnaHQgOiBrZXlIYW5kbGVyLFxyXG4gIG1vdmVTZWxlY3Rpb25MZWZ0IDoga2V5SGFuZGxlciwgXHJcbiAgbW92ZVNlbGVjdGlvblVwIDoga2V5SGFuZGxlcixcclxuICBtb3ZlU2VsZWN0aW9uRG93biA6IGtleUhhbmRsZXIsXHJcbiAgbW92ZVNlbGVjdGlvblJpZ2h0TWVhc3VyZSA6IGtleUhhbmRsZXIsXHJcbiAgbW92ZVNlbGVjdGlvbkxlZnRNZWFzdXJlIDoga2V5SGFuZGxlcixcclxuICBhZHZhbmNlTW9kaWZpZXJTZWxlY3Rpb24gOiBrZXlIYW5kbGVyLFxyXG4gIGdyb3dTZWxlY3Rpb25SaWdodCA6IGtleUhhbmRsZXIsXHJcbiAgZ3Jvd1NlbGVjdGlvbkxlZnQgOiBrZXlIYW5kbGVyLCBcclxuICBtb3ZlU2VsZWN0aW9uUGl0Y2hVcCA6IGtleUhhbmRsZXIsXHJcbiAgbW92ZVNlbGVjdGlvblBpdGNoRG93bjoga2V5SGFuZGxlclxyXG59XHJcbi8qKlxyXG4gKiBTdWlUcmFja2VyXHJcbiAqIEEgdHJhY2tlciBtYXBzIHRoZSBVSSBlbGVtZW50cyB0byB0aGUgbG9naWNhbCBlbGVtZW50cyAsYW5kIGFsbG93cyB0aGUgdXNlciB0b1xyXG4gKiAgbW92ZSB0aHJvdWdoIHRoZSBzY29yZSBhbmQgbWFrZSBzZWxlY3Rpb25zLCBmb3IgbmF2aWdhdGlvbiBhbmQgZWRpdGluZy5cclxuICogQGNhdGVnb3J5IFN1aVJlbmRlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVRyYWNrZXIgZXh0ZW5kcyBTdWlNYXBwZXIgaW1wbGVtZW50cyBUcmFja2VyS2V5SGFuZGxlciB7XHJcbiAgaWRsZVRpbWVyOiBudW1iZXIgPSBEYXRlLm5vdygpO1xyXG4gIG11c2ljQ3Vyc29yR2x5cGg6IFNWR1NWR0VsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuICBkZWZlclBsYXlBZHZhbmNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc3RhdGljIGdldCBzdHJva2VzKCk6IFJlY29yZDxzdHJpbmcsIFN0cm9rZUluZm8+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN1Z2dlc3Rpb246IHtcclxuICAgICAgICBzdHJva2VOYW1lOiAnc3VnZ2VzdGlvbicsXHJcbiAgICAgICAgc3Ryb2tlOiAnI2ZjOScsXHJcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDMsXHJcbiAgICAgICAgc3Ryb2tlRGFzaGFycmF5OiAnNCwxJyxcclxuICAgICAgICBmaWxsOiAnbm9uZScsXHJcbiAgICAgICAgb3BhY2l0eTogMS4wXHJcbiAgICAgIH0sXHJcbiAgICAgIHNlbGVjdGlvbjoge1xyXG4gICAgICAgIHN0cm9rZU5hbWU6ICdzZWxlY3Rpb24nLFxyXG4gICAgICAgIHN0cm9rZTogJyM5OWQnLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAzLFxyXG4gICAgICAgIHN0cm9rZURhc2hhcnJheTogMixcclxuICAgICAgICBmaWxsOiAnbm9uZScsXHJcbiAgICAgICAgb3BhY2l0eTogMS4wXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YWZmTW9kaWZpZXI6IHtcclxuICAgICAgICBzdHJva2VOYW1lOiAnc3RhZmZNb2RpZmllcicsXHJcbiAgICAgICAgc3Ryb2tlOiAnIzkzMycsXHJcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDMsXHJcbiAgICAgICAgZmlsbDogJ25vbmUnLFxyXG4gICAgICAgIHN0cm9rZURhc2hhcnJheTogMCxcclxuICAgICAgICBvcGFjaXR5OiAxLjBcclxuICAgICAgfSwgcGl0Y2hTZWxlY3Rpb246IHtcclxuICAgICAgICBzdHJva2VOYW1lOiAncGl0Y2hTZWxlY3Rpb24nLFxyXG4gICAgICAgIHN0cm9rZTogJyM5MzMnLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAzLFxyXG4gICAgICAgIGZpbGw6ICdub25lJyxcclxuICAgICAgICBzdHJva2VEYXNoYXJyYXk6IDAsXHJcbiAgICAgICAgb3BhY2l0eTogMS4wXHJcbiAgICAgIH1cclxuXHJcbiAgICB9O1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihyZW5kZXJlcjogU3VpUmVuZGVyZXJCYXNlLCBzY3JvbGxlcjogU3VpU2Nyb2xsZXIpIHtcclxuICAgIHN1cGVyKHJlbmRlcmVyLCBzY3JvbGxlcik7XHJcbiAgfVxyXG4gIC8vICMjIyByZW5kZXJFbGVtZW50XHJcbiAgLy8gdGhlIGVsZW1lbnQgdGhlIHNjb3JlIGlzIHJlbmRlcmVkIG9uXHJcbiAgZ2V0IHJlbmRlckVsZW1lbnQoKTogRWxlbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5yZW5kZXJFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNjb3JlKCk6IFNtb1Njb3JlIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5zY29yZTtcclxuICB9XHJcblxyXG4gIGdldElkbGVUaW1lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5pZGxlVGltZXI7XHJcbiAgfVxyXG4gIHBsYXlTZWxlY3Rpb24oYXJ0aWZhY3Q6IFNtb1NlbGVjdGlvbikge1xyXG4gICAgaWYgKCF0aGlzLmRlZmVyUGxheUFkdmFuY2UgJiYgdGhpcy5zY29yZSkge1xyXG4gICAgICBTdWlPc2NpbGxhdG9yLnBsYXlTZWxlY3Rpb25Ob3coYXJ0aWZhY3QsIHRoaXMuc2NvcmUsIDEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kZWZlclBsYXlBZHZhbmNlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGRlZmVyTmV4dEF1dG9QbGF5KCkge1xyXG4gICAgaWYgKHRoaXMuc2NvcmUpIHtcclxuICAgICAgLy8gZG9uJ3QgcGxheSBvbiBhZHZhbmNlIGlmIHdlJ3ZlIGp1c3QgYWRkZWQgYSBub3RlIGFuZCBwbGF5ZWQgaXQgYmVjYXVzZSB0aGV5IG92ZXJsYXBcclxuICAgICAgaWYgKHRoaXMuc2NvcmUucHJlZmVyZW5jZXMuYXV0b0FkdmFuY2UgJiYgdGhpcy5zY29yZS5wcmVmZXJlbmNlcy5hdXRvUGxheSkge1xyXG4gICAgICAgIHRoaXMuZGVmZXJQbGF5QWR2YW5jZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNlbGVjdGVkTW9kaWZpZXIoKSB7XHJcbiAgICBpZiAodGhpcy5tb2RpZmllclNlbGVjdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm1vZGlmaWVyU2VsZWN0aW9uc1swXTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRNb2RpZmllcnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RpZmllclNlbGVjdGlvbnM7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc2VyaWFsaXplRXZlbnQoZXZLZXk6IEtleUV2ZW50IHwgbnVsbCk6IGFueSB7XHJcbiAgICBpZiAoIWV2S2V5KSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJ2ID0ge307XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlKFsndHlwZScsICdzaGlmdEtleScsICdjdHJsS2V5JywgJ2FsdEtleScsICdrZXknLCAna2V5Q29kZSddLCBldktleSwgcnYpO1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgYWR2YW5jZU1vZGlmaWVyU2VsZWN0aW9uKGtleUV2PzogS2V5RXZlbnQpIHtcclxuICAgIGlmICgha2V5RXYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pZGxlVGltZXIgPSBEYXRlLm5vdygpO1xyXG4gICAgY29uc3Qgb2Zmc2V0ID0ga2V5RXYua2V5ID09PSAnQXJyb3dMZWZ0JyA/IC0xIDogMTtcclxuICAgIHRoaXMubW9kaWZpZXJJbmRleCA9IHRoaXMubW9kaWZpZXJJbmRleCArIG9mZnNldDtcclxuICAgIHRoaXMubW9kaWZpZXJJbmRleCA9ICh0aGlzLm1vZGlmaWVySW5kZXggPT09IC0yICYmIHRoaXMubG9jYWxNb2RpZmllcnMubGVuZ3RoKSA/XHJcbiAgICAgIHRoaXMubG9jYWxNb2RpZmllcnMubGVuZ3RoIC0gMSA6IHRoaXMubW9kaWZpZXJJbmRleDtcclxuICAgIGlmICh0aGlzLm1vZGlmaWVySW5kZXggPj0gdGhpcy5sb2NhbE1vZGlmaWVycy5sZW5ndGggfHwgdGhpcy5tb2RpZmllckluZGV4IDwgMCkge1xyXG4gICAgICB0aGlzLm1vZGlmaWVySW5kZXggPSAtMTtcclxuICAgICAgdGhpcy5tb2RpZmllclNlbGVjdGlvbnMgPSBbXTtcclxuICAgICAgJCgnLnZmLXN0YWZmTW9kaWZpZXInKS5yZW1vdmUoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbG9jYWw6IE1vZGlmaWVyVGFiID0gdGhpcy5sb2NhbE1vZGlmaWVyc1t0aGlzLm1vZGlmaWVySW5kZXhdO1xyXG4gICAgY29uc3QgYm94OiBTdmdCb3ggPSBTdmdIZWxwZXJzLnNtb0JveChsb2NhbC5ib3gpIGFzIFN2Z0JveDtcclxuICAgIHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zID0gW3sgaW5kZXg6IDAsIGJveCwgbW9kaWZpZXI6IGxvY2FsLm1vZGlmaWVyLCBzZWxlY3Rpb246IGxvY2FsLnNlbGVjdGlvbiB9XTtcclxuICAgIHRoaXMuX2hpZ2hsaWdodE1vZGlmaWVyKCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc3RyaW5naWZ5Qm94KGJveDogU3ZnQm94KTogc3RyaW5nIHtcclxuICAgIHJldHVybiAne3g6JyArIGJveC54ICsgJyx5OicgKyBib3gueSArICcsd2lkdGg6JyArIGJveC53aWR0aCArICcsaGVpZ2h0OicgKyBib3guaGVpZ2h0ICsgJ30nO1xyXG4gIH1cclxuXHJcbiAgLy8gIyMjIF9nZXRPZmZzZXRTZWxlY3Rpb25cclxuICAvLyBHZXQgdGhlIHNlbGVjdG9yIHRoYXQgaXMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgZXhpc3Rpbmcgc2VsZWN0aW9uXHJcbiAgX2dldE9mZnNldFNlbGVjdGlvbihvZmZzZXQ6IG51bWJlcik6IFNtb1NlbGVjdG9yIHtcclxuICAgIGlmICghdGhpcy5zY29yZSkge1xyXG4gICAgICByZXR1cm4gU21vU2VsZWN0b3IuZGVmYXVsdDtcclxuICAgIH1cclxuICAgIGxldCB0ZXN0U2VsZWN0aW9uID0gdGhpcy5nZXRFeHRyZW1lU2VsZWN0aW9uKE1hdGguc2lnbihvZmZzZXQpKTtcclxuICAgIGNvbnN0IHNjb3B5VGljayA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGVzdFNlbGVjdGlvbi5zZWxlY3RvcikpO1xyXG4gICAgY29uc3Qgc2NvcHlNZWFzdXJlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0ZXN0U2VsZWN0aW9uLnNlbGVjdG9yKSk7XHJcbiAgICBzY29weVRpY2sudGljayArPSBvZmZzZXQ7XHJcbiAgICBzY29weU1lYXN1cmUubWVhc3VyZSArPSBvZmZzZXQ7XHJcbiAgICBjb25zdCB0YXJnZXRNZWFzdXJlID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zY29yZSwgdGVzdFNlbGVjdGlvbi5zZWxlY3Rvci5zdGFmZixcclxuICAgICAgc2NvcHlNZWFzdXJlLm1lYXN1cmUpO1xyXG4gICAgaWYgKHRhcmdldE1lYXN1cmUgJiYgdGFyZ2V0TWVhc3VyZS5tZWFzdXJlICYmIHRhcmdldE1lYXN1cmUubWVhc3VyZS52b2ljZXMubGVuZ3RoIDw9IHNjb3B5TWVhc3VyZS52b2ljZSkge1xyXG4gICAgICBzY29weU1lYXN1cmUudm9pY2UgPSAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRhcmdldE1lYXN1cmUgJiYgdGFyZ2V0TWVhc3VyZS5tZWFzdXJlKSB7XHJcbiAgICAgIHNjb3B5TWVhc3VyZS50aWNrID0gKG9mZnNldCA8IDApID8gdGFyZ2V0TWVhc3VyZS5tZWFzdXJlLnZvaWNlc1tzY29weU1lYXN1cmUudm9pY2VdLm5vdGVzLmxlbmd0aCAtIDEgOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0ZXN0U2VsZWN0aW9uLm1lYXN1cmUudm9pY2VzLmxlbmd0aCA+IHNjb3B5VGljay52b2ljZSAmJlxyXG4gICAgICB0ZXN0U2VsZWN0aW9uLm1lYXN1cmUudm9pY2VzW3Njb3B5VGljay52b2ljZV0ubm90ZXMubGVuZ3RoID4gc2NvcHlUaWNrLnRpY2sgJiYgc2NvcHlUaWNrLnRpY2sgPj0gMCkge1xyXG4gICAgICBpZiAodGVzdFNlbGVjdGlvbi5zZWxlY3Rvci52b2ljZSAhPT0gdGVzdFNlbGVjdGlvbi5tZWFzdXJlLmdldEFjdGl2ZVZvaWNlKCkpIHtcclxuICAgICAgICBzY29weVRpY2sudm9pY2UgPSB0ZXN0U2VsZWN0aW9uLm1lYXN1cmUuZ2V0QWN0aXZlVm9pY2UoKTtcclxuICAgICAgICB0ZXN0U2VsZWN0aW9uID0gdGhpcy5fZ2V0Q2xvc2VzdFRpY2soc2NvcHlUaWNrKTtcclxuICAgICAgICByZXR1cm4gdGVzdFNlbGVjdGlvbi5zZWxlY3RvcjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gc2NvcHlUaWNrO1xyXG4gICAgfSBlbHNlIGlmICh0YXJnZXRNZWFzdXJlICYmXHJcbiAgICAgIHNjb3B5TWVhc3VyZS5tZWFzdXJlIDwgdGVzdFNlbGVjdGlvbi5zdGFmZi5tZWFzdXJlcy5sZW5ndGggJiYgc2NvcHlNZWFzdXJlLm1lYXN1cmUgPj0gMCkge1xyXG4gICAgICByZXR1cm4gc2NvcHlNZWFzdXJlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRlc3RTZWxlY3Rpb24uc2VsZWN0b3I7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZEdyYWNlTm90ZXMoKTogTW9kaWZpZXJUYWJbXSB7XHJcbiAgICBpZiAoIXRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBjb25zdCBmZiA9IHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmZpbHRlcigobW0pID0+XHJcbiAgICAgIG1tLm1vZGlmaWVyPy5hdHRycz8udHlwZSA9PT0gJ1Ntb0dyYWNlTm90ZSdcclxuICAgICk7XHJcbiAgICByZXR1cm4gZmY7XHJcbiAgfVxyXG5cclxuICBpc0dyYWNlTm90ZVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBmZiA9IHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmZpbmRJbmRleCgobW0pID0+IG1tLm1vZGlmaWVyLmF0dHJzLnR5cGUgPT09ICdTbW9HcmFjZU5vdGUnKTtcclxuICAgICAgcmV0dXJuIGZmID49IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBfZ3Jvd0dyYWNlTm90ZVNlbGVjdGlvbnMob2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuaWRsZVRpbWVyID0gRGF0ZS5ub3coKTtcclxuICAgIGNvbnN0IGZhciA9IHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmZpbHRlcigobW0pID0+IG1tLm1vZGlmaWVyLmF0dHJzLnR5cGUgPT09ICdTbW9HcmFjZU5vdGUnKTtcclxuICAgIGlmICghZmFyLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpeCA9IChvZmZzZXQgPCAwKSA/IDAgOiBmYXIubGVuZ3RoIC0gMTtcclxuICAgIGNvbnN0IHNlbDogTW9kaWZpZXJUYWIgPSBmYXJbaXhdIGFzIE1vZGlmaWVyVGFiO1xyXG4gICAgY29uc3QgbGVmdCA9IHRoaXMubG9jYWxNb2RpZmllcnMuZmlsdGVyKChtdCkgPT5cclxuICAgICAgbXQubW9kaWZpZXI/LmF0dHJzPy50eXBlID09PSAnU21vR3JhY2VOb3RlJyAmJiBzZWwuc2VsZWN0aW9uICYmIG10LnNlbGVjdGlvbiAmJlxyXG4gICAgICBTbW9TZWxlY3Rvci5zYW1lTm90ZShtdC5zZWxlY3Rpb24uc2VsZWN0b3IsIHNlbC5zZWxlY3Rpb24uc2VsZWN0b3IpXHJcbiAgICApO1xyXG4gICAgaWYgKGl4ICsgb2Zmc2V0IDwgMCB8fCBpeCArIG9mZnNldCA+PSBsZWZ0Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBsZWZ0U2VsID0gbGVmdFtpeCArIG9mZnNldF07XHJcbiAgICBpZiAoIWxlZnRTZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdiYWQgc2VsZWN0b3IgaW4gX2dyb3dHcmFjZU5vdGVTZWxlY3Rpb25zJyk7XHJcbiAgICB9XHJcbiAgICBsZWZ0U2VsLmJveCA9IGxlZnRTZWwuYm94ID8/IFN2Z0JveC5kZWZhdWx0O1xyXG4gICAgdGhpcy5tb2RpZmllclNlbGVjdGlvbnMucHVzaChsZWZ0U2VsKTtcclxuICAgIHRoaXMuX2hpZ2hsaWdodE1vZGlmaWVyKCk7XHJcbiAgfVxyXG4gIGdldCBhdXRvUGxheSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnNjb3JlID8gdGhpcy5yZW5kZXJlci5zY29yZS5wcmVmZXJlbmNlcy5hdXRvUGxheSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ3Jvd1NlbGVjdGlvblJpZ2h0KCkge1xyXG4gICAgdGhpcy5fZ3Jvd1NlbGVjdGlvblJpZ2h0KGZhbHNlKTtcclxuICB9XHJcbiAgX2dyb3dTZWxlY3Rpb25SaWdodChza2lwUGxheTogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICB0aGlzLmlkbGVUaW1lciA9IERhdGUubm93KCk7XHJcbiAgICBpZiAodGhpcy5pc0dyYWNlTm90ZVNlbGVjdGVkKCkpIHtcclxuICAgICAgdGhpcy5fZ3Jvd0dyYWNlTm90ZVNlbGVjdGlvbnMoMSk7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbnNlbGVjdCA9IHRoaXMuX2dldE9mZnNldFNlbGVjdGlvbigxKTtcclxuICAgIC8vIGFscmVhZHkgc2VsZWN0ZWRcclxuICAgIGNvbnN0IGFydGlmYWN0ID0gdGhpcy5fZ2V0Q2xvc2VzdFRpY2sobnNlbGVjdCk7XHJcbiAgICBpZiAoIWFydGlmYWN0KSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9ucy5maW5kKChzZWwpID0+IFNtb1NlbGVjdG9yLnNhbWVOb3RlKHNlbC5zZWxlY3RvciwgYXJ0aWZhY3Quc2VsZWN0b3IpKSkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5tYXBwaW5nICYmIHRoaXMuYXV0b1BsYXkgJiYgc2tpcFBsYXkgPT09IGZhbHNlICYmIHRoaXMuc2NvcmUpIHtcclxuICAgICAgdGhpcy5wbGF5U2VsZWN0aW9uKGFydGlmYWN0KTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0aW9ucy5wdXNoKGFydGlmYWN0KTtcclxuICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICAgIHRoaXMuX2NyZWF0ZUxvY2FsTW9kaWZpZXJzTGlzdCgpO1xyXG4gICAgcmV0dXJuIChhcnRpZmFjdC5ub3RlIGFzIFNtb05vdGUpLnRpY2tDb3VudDtcclxuICB9XHJcbiAgbW92ZUhvbWUoa2V5RXZlbnQ/OiBLZXlFdmVudCkge1xyXG4gICAgY29uc3QgZXZLZXkgPSBrZXlFdmVudCA/PyBkZWZhdWx0S2V5RXZlbnQoKTtcclxuICAgIHRoaXMuaWRsZVRpbWVyID0gRGF0ZS5ub3coKTtcclxuICAgIGNvbnN0IGxzID0gdGhpcy5zZWxlY3Rpb25zWzBdLnN0YWZmO1xyXG4gICAgaWYgKGV2S2V5LmN0cmxLZXkpIHtcclxuICAgICAgY29uc3QgbW0gPSBscy5tZWFzdXJlc1swXTtcclxuICAgICAgY29uc3QgaG9tZVNlbCA9IHRoaXMuX2dldENsb3Nlc3RUaWNrKHsgc3RhZmY6IGxzLnN0YWZmSWQsXHJcbiAgICAgICAgbWVhc3VyZTogMCwgdm9pY2U6IG1tLmdldEFjdGl2ZVZvaWNlKCksIHRpY2s6IDAsIHBpdGNoZXM6IFtdIH0pO1xyXG4gICAgICBpZiAoZXZLZXkuc2hpZnRLZXkpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RCZXR3ZWVuU2VsZWN0aW9ucyh0aGlzLnNlbGVjdGlvbnNbMF0sIGhvbWVTZWwpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9ucyA9IFtob21lU2VsXTtcclxuICAgICAgICB0aGlzLmRlZmVySGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlTG9jYWxNb2RpZmllcnNMaXN0KCk7XHJcbiAgICAgICAgaWYgKGhvbWVTZWwubWVhc3VyZS5zdmcubG9naWNhbEJveCkge1xyXG4gICAgICAgICAgdGhpcy5zY3JvbGxlci5zY3JvbGxWaXNpYmxlQm94KGhvbWVTZWwubWVhc3VyZS5zdmcubG9naWNhbEJveCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBzeXN0ZW0gPSB0aGlzLnNlbGVjdGlvbnNbMF0ubWVhc3VyZS5zdmcubGluZUluZGV4O1xyXG4gICAgICBjb25zdCBsbSA9IGxzLm1lYXN1cmVzLmZpbmQoKG1tKSA9PlxyXG4gICAgICAgIG1tLnN2Zy5saW5lSW5kZXggPT09IHN5c3RlbSAmJiBtbS5tZWFzdXJlTnVtYmVyLnN5c3RlbUluZGV4ID09PSAwKTtcclxuICAgICAgY29uc3QgbW0gPSBsbSBhcyBTbW9NZWFzdXJlO1xyXG4gICAgICBjb25zdCBob21lU2VsID0gdGhpcy5fZ2V0Q2xvc2VzdFRpY2soeyBzdGFmZjogbHMuc3RhZmZJZCxcclxuICAgICAgICBtZWFzdXJlOiBtbS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCwgdm9pY2U6IG1tLmdldEFjdGl2ZVZvaWNlKCksXHJcbiAgICAgICAgdGljazogMCwgcGl0Y2hlczogW10gfSk7XHJcbiAgICAgIGlmIChldktleS5zaGlmdEtleSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdEJldHdlZW5TZWxlY3Rpb25zKHRoaXMuc2VsZWN0aW9uc1swXSwgaG9tZVNlbCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoaG9tZVNlbD8ubWVhc3VyZT8uc3ZnPy5sb2dpY2FsQm94KSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25zID0gW2hvbWVTZWxdO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsZXIuc2Nyb2xsVmlzaWJsZUJveChob21lU2VsLm1lYXN1cmUuc3ZnLmxvZ2ljYWxCb3gpO1xyXG4gICAgICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICAgICAgICB0aGlzLl9jcmVhdGVMb2NhbE1vZGlmaWVyc0xpc3QoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBtb3ZlRW5kKGtleUV2ZW50PzogS2V5RXZlbnQpIHtcclxuICAgIHRoaXMuaWRsZVRpbWVyID0gRGF0ZS5ub3coKTtcclxuICAgIGNvbnN0IGxzID0gdGhpcy5zZWxlY3Rpb25zWzBdLnN0YWZmO1xyXG4gICAgY29uc3QgZXZLZXkgPSBrZXlFdmVudCA/PyBkZWZhdWx0S2V5RXZlbnQoKTtcclxuICAgIGlmIChldktleS5jdHJsS2V5KSB7XHJcbiAgICAgIGNvbnN0IGxtID0gbHMubWVhc3VyZXNbbHMubWVhc3VyZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgIGNvbnN0IHZvaWNlSXggPSBsbS5nZXRBY3RpdmVWb2ljZSgpO1xyXG4gICAgICBjb25zdCB2b2ljZSA9IGxtLnZvaWNlc1t2b2ljZUl4XTtcclxuICAgICAgY29uc3QgZW5kU2VsID0gdGhpcy5fZ2V0Q2xvc2VzdFRpY2soeyBzdGFmZjogbHMuc3RhZmZJZCxcclxuICAgICAgICBtZWFzdXJlOiBscy5tZWFzdXJlcy5sZW5ndGggLSAxLCB2b2ljZTogdm9pY2VJeCwgdGljazogdm9pY2Uubm90ZXMubGVuZ3RoIC0gMSwgcGl0Y2hlczogW10gfSk7XHJcbiAgICAgIGlmIChldktleS5zaGlmdEtleSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdEJldHdlZW5TZWxlY3Rpb25zKHRoaXMuc2VsZWN0aW9uc1swXSwgZW5kU2VsKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbnMgPSBbZW5kU2VsXTtcclxuICAgICAgICB0aGlzLmRlZmVySGlnaGxpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlTG9jYWxNb2RpZmllcnNMaXN0KCk7XHJcbiAgICAgICAgaWYgKGVuZFNlbC5tZWFzdXJlLnN2Zy5sb2dpY2FsQm94KSB7XHJcbiAgICAgICAgICB0aGlzLnNjcm9sbGVyLnNjcm9sbFZpc2libGVCb3goZW5kU2VsLm1lYXN1cmUuc3ZnLmxvZ2ljYWxCb3gpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3Qgc3lzdGVtID0gdGhpcy5zZWxlY3Rpb25zWzBdLm1lYXN1cmUuc3ZnLmxpbmVJbmRleDtcclxuICAgICAgLy8gZmluZCB0aGUgbGFyZ2VzdCBtZWFzdXJlIGluZGV4IG9uIHRoaXMgc3RhZmYgaW4gdGhpcyBzeXN0ZW1cclxuICAgICAgY29uc3QgbWVhc3VyZXMgPSBscy5tZWFzdXJlcy5maWx0ZXIoKG1tKSA9PlxyXG4gICAgICAgIG1tLnN2Zy5saW5lSW5kZXggPT09IHN5c3RlbSk7XHJcbiAgICAgIGNvbnN0IGxtID0gbWVhc3VyZXMucmVkdWNlKChhLCBiKSA9PlxyXG4gICAgICAgIGIubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXggPiBhLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4ID8gYiA6IGEpO1xyXG4gICAgICBjb25zdCB0aWNrcyA9IGxtLnZvaWNlc1tsbS5nZXRBY3RpdmVWb2ljZSgpXS5ub3Rlcy5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGVuZFNlbCA9IHRoaXMuX2dldENsb3Nlc3RUaWNrKHsgc3RhZmY6IGxzLnN0YWZmSWQsXHJcbiAgICAgICAgbWVhc3VyZTogbG0ubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXgsIHZvaWNlOiBsbS5nZXRBY3RpdmVWb2ljZSgpLCB0aWNrOiB0aWNrcyAtIDEsIHBpdGNoZXM6IFtdIH0pO1xyXG4gICAgICBpZiAoZXZLZXkuc2hpZnRLZXkpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RCZXR3ZWVuU2VsZWN0aW9ucyh0aGlzLnNlbGVjdGlvbnNbMF0sIGVuZFNlbCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25zID0gW2VuZFNlbF07XHJcbiAgICAgICAgdGhpcy5kZWZlckhpZ2hsaWdodCgpO1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZUxvY2FsTW9kaWZpZXJzTGlzdCgpO1xyXG4gICAgICAgIGlmIChlbmRTZWwubWVhc3VyZS5zdmcubG9naWNhbEJveCkge1xyXG4gICAgICAgICAgdGhpcy5zY3JvbGxlci5zY3JvbGxWaXNpYmxlQm94KGVuZFNlbC5tZWFzdXJlLnN2Zy5sb2dpY2FsQm94KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgZ3Jvd1NlbGVjdGlvblJpZ2h0TWVhc3VyZSgpIHtcclxuICAgIGxldCB0b1NlbGVjdCA9IDA7XHJcbiAgICBjb25zdCByaWdodG1vc3QgPSB0aGlzLmdldEV4dHJlbWVTZWxlY3Rpb24oMSk7XHJcbiAgICBjb25zdCB0aWNrc0xlZnQgPSByaWdodG1vc3QubWVhc3VyZS52b2ljZXNbcmlnaHRtb3N0Lm1lYXN1cmUuYWN0aXZlVm9pY2VdXHJcbiAgICAgIC5ub3Rlcy5sZW5ndGggLSByaWdodG1vc3Quc2VsZWN0b3IudGljaztcclxuICAgIGlmICh0aWNrc0xlZnQgPT09IDApIHtcclxuICAgICAgaWYgKHJpZ2h0bW9zdC5zZWxlY3Rvci5tZWFzdXJlIDwgcmlnaHRtb3N0LnN0YWZmLm1lYXN1cmVzLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IG1peCA9IHJpZ2h0bW9zdC5zZWxlY3Rvci5tZWFzdXJlICsgMTtcclxuICAgICAgICByaWdodG1vc3Quc3RhZmYubWVhc3VyZXNbbWl4XS5zZXRBY3RpdmVWb2ljZShyaWdodG1vc3Quc2VsZWN0b3Iudm9pY2UpO1xyXG4gICAgICAgIHRvU2VsZWN0ID0gcmlnaHRtb3N0LnN0YWZmLm1lYXN1cmVzW21peF1cclxuICAgICAgICAgIC52b2ljZXNbcmlnaHRtb3N0LnN0YWZmLm1lYXN1cmVzW21peF0uYWN0aXZlVm9pY2VdLm5vdGVzLmxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdG9TZWxlY3QgPSB0aWNrc0xlZnQ7XHJcbiAgICB9XHJcbiAgICB3aGlsZSAodG9TZWxlY3QgPiAwKSB7XHJcbiAgICAgIHRoaXMuX2dyb3dTZWxlY3Rpb25SaWdodCh0cnVlKTtcclxuICAgICAgdG9TZWxlY3QgLT0gMTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdyb3dTZWxlY3Rpb25MZWZ0KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5pc0dyYWNlTm90ZVNlbGVjdGVkKCkpIHtcclxuICAgICAgdGhpcy5fZ3Jvd0dyYWNlTm90ZVNlbGVjdGlvbnMoLTEpO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIHRoaXMuaWRsZVRpbWVyID0gRGF0ZS5ub3coKTtcclxuICAgIGNvbnN0IG5zZWxlY3QgPSB0aGlzLl9nZXRPZmZzZXRTZWxlY3Rpb24oLTEpO1xyXG4gICAgLy8gYWxyZWFkeSBzZWxlY3RlZFxyXG4gICAgY29uc3QgYXJ0aWZhY3QgPSB0aGlzLl9nZXRDbG9zZXN0VGljayhuc2VsZWN0KTtcclxuICAgIGlmICghYXJ0aWZhY3QpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25zLmZpbmQoKHNlbCkgPT4gU21vU2VsZWN0b3Iuc2FtZU5vdGUoc2VsLnNlbGVjdG9yLCBhcnRpZmFjdC5zZWxlY3RvcikpKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgYXJ0aWZhY3QubWVhc3VyZS5zZXRBY3RpdmVWb2ljZShuc2VsZWN0LnZvaWNlKTtcclxuICAgIHRoaXMuc2VsZWN0aW9ucy5wdXNoKGFydGlmYWN0KTtcclxuICAgIGlmICh0aGlzLmF1dG9QbGF5ICYmIHRoaXMuc2NvcmUpIHtcclxuICAgICAgdGhpcy5wbGF5U2VsZWN0aW9uKGFydGlmYWN0KTtcclxuICAgIH1cclxuICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICAgIHRoaXMuX2NyZWF0ZUxvY2FsTW9kaWZpZXJzTGlzdCgpO1xyXG4gICAgcmV0dXJuIChhcnRpZmFjdC5ub3RlIGFzIFNtb05vdGUpLnRpY2tDb3VudDtcclxuICB9XHJcblxyXG4gIC8vIGlmIHdlIGFyZSBiZWluZyBtb3ZlZCByaWdodCBwcm9ncmFtbWF0aWNhbGx5LCBhdm9pZCBwbGF5aW5nIHRoZSBzZWxlY3RlZCBub3RlLlxyXG4gIG1vdmVTZWxlY3Rpb25SaWdodCgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbnMubGVuZ3RoID09PSAwIHx8IHRoaXMuc2NvcmUgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2tpcFBsYXkgPSAhdGhpcy5zY29yZS5wcmVmZXJlbmNlcy5hdXRvUGxheTtcclxuICAgIC8vIGNvbnN0IG9yaWdpbmFsID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpLnNlbGVjdG9yKSk7XHJcbiAgICBjb25zdCBuc2VsZWN0ID0gdGhpcy5fZ2V0T2Zmc2V0U2VsZWN0aW9uKDEpO1xyXG4gICAgLy8gc2tpcCBhbnkgbWVhc3VyZXMgdGhhdCBhcmUgbm90IGRpc3BsYXllZCBkdWUgdG8gcmVzdCBvciByZXBldGl0aW9uXHJcbiAgICBjb25zdCBtc2VsZWN0ID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zY29yZSwgbnNlbGVjdC5zdGFmZiwgbnNlbGVjdC5tZWFzdXJlKTsgICAgXHJcbiAgICBpZiAobXNlbGVjdD8ubWVhc3VyZS5zdmcubXVsdGltZWFzdXJlTGVuZ3RoKSB7XHJcbiAgICAgIG5zZWxlY3QubWVhc3VyZSArPSBtc2VsZWN0Py5tZWFzdXJlLnN2Zy5tdWx0aW1lYXN1cmVMZW5ndGg7XHJcbiAgICB9XHJcbiAgICBpZiAobXNlbGVjdCkge1xyXG4gICAgICBtc2VsZWN0Lm1lYXN1cmUuc2V0QWN0aXZlVm9pY2UobnNlbGVjdC52b2ljZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZXBsYWNlU2VsZWN0aW9uKG5zZWxlY3QsIHNraXBQbGF5KTtcclxuICB9XHJcblxyXG4gIG1vdmVTZWxlY3Rpb25MZWZ0KCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPT09IDAgfHwgdGhpcy5zY29yZSA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBuc2VsZWN0ID0gdGhpcy5fZ2V0T2Zmc2V0U2VsZWN0aW9uKC0xKTtcclxuICAgIC8vIFNraXAgbXVsdGltZWFzdXJlIHJlc3RzIGluIHBhcnRzXHJcbiAgICBjb25zdCBtc2VsZWN0ID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zY29yZSwgbnNlbGVjdC5zdGFmZiwgbnNlbGVjdC5tZWFzdXJlKTtcclxuICAgIHdoaWxlIChuc2VsZWN0Lm1lYXN1cmUgPiAwICYmIG1zZWxlY3QgJiYgKG1zZWxlY3QubWVhc3VyZS5zdmcuaGlkZU11bHRpbWVhc3VyZSB8fCBtc2VsZWN0Lm1lYXN1cmUuc3ZnLm11bHRpbWVhc3VyZUxlbmd0aCA+IDApKSB7XHJcbiAgICAgIG5zZWxlY3QubWVhc3VyZSAtPSAxO1xyXG4gICAgfVxyXG4gICAgaWYgKG1zZWxlY3QpIHtcclxuICAgICAgbXNlbGVjdC5tZWFzdXJlLnNldEFjdGl2ZVZvaWNlKG5zZWxlY3Qudm9pY2UpO1xyXG4gICAgfSAgICBcclxuICAgIHRoaXMuX3JlcGxhY2VTZWxlY3Rpb24obnNlbGVjdCwgZmFsc2UpO1xyXG4gIH1cclxuICBtb3ZlU2VsZWN0aW9uTGVmdE1lYXN1cmUoKSB7XHJcbiAgICB0aGlzLl9tb3ZlU2VsZWN0aW9uTWVhc3VyZSgtMSk7XHJcbiAgfVxyXG4gIG1vdmVTZWxlY3Rpb25SaWdodE1lYXN1cmUoKSB7XHJcbiAgICB0aGlzLl9tb3ZlU2VsZWN0aW9uTWVhc3VyZSgxKTtcclxuICB9XHJcbiAgX21vdmVTZWxlY3Rpb25NZWFzdXJlKG9mZnNldDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmdldEV4dHJlbWVTZWxlY3Rpb24oTWF0aC5zaWduKG9mZnNldCkpO1xyXG4gICAgdGhpcy5pZGxlVGltZXIgPSBEYXRlLm5vdygpO1xyXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNlbGVjdGlvbi5zZWxlY3RvcikpO1xyXG4gICAgc2VsZWN0b3IubWVhc3VyZSArPSBvZmZzZXQ7XHJcbiAgICBzZWxlY3Rvci50aWNrID0gMDtcclxuICAgIGNvbnN0IHNlbE9iaiA9IHRoaXMuX2dldENsb3Nlc3RUaWNrKHNlbGVjdG9yKTtcclxuICAgIGlmIChzZWxPYmopIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb25zID0gW3NlbE9ial07XHJcbiAgICB9XHJcbiAgICB0aGlzLmRlZmVySGlnaGxpZ2h0KCk7XHJcbiAgICB0aGlzLl9jcmVhdGVMb2NhbE1vZGlmaWVyc0xpc3QoKTtcclxuICB9XHJcblxyXG4gIF9tb3ZlU3RhZmZPZmZzZXQob2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbnMubGVuZ3RoID09PSAwIHx8IHRoaXMuc2NvcmUgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pZGxlVGltZXIgPSBEYXRlLm5vdygpO1xyXG4gICAgY29uc3QgbnNlbGVjdG9yID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGlvbnNbMF0uc2VsZWN0b3IpKTtcclxuICAgIG5zZWxlY3Rvci5zdGFmZiA9IHRoaXMuc2NvcmUuaW5jcmVtZW50QWN0aXZlU3RhZmYob2Zmc2V0KTtcclxuICAgIFxyXG4gICAgdGhpcy5zZWxlY3Rpb25zID0gW3RoaXMuX2dldENsb3Nlc3RUaWNrKG5zZWxlY3RvcildO1xyXG4gICAgdGhpcy5kZWZlckhpZ2hsaWdodCgpO1xyXG4gICAgdGhpcy5fY3JlYXRlTG9jYWxNb2RpZmllcnNMaXN0KCk7XHJcbiAgfVxyXG4gIHJlbW92ZVBpdGNoU2VsZWN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMub3V0bGluZXNbJ3BpdGNoU2VsZWN0aW9uJ10pIHtcclxuICAgICAgaWYgKHRoaXMub3V0bGluZXNbJ3BpdGNoU2VsZWN0aW9uJ10uZWxlbWVudCkge1xyXG4gICAgICAgIHRoaXMub3V0bGluZXNbJ3BpdGNoU2VsZWN0aW9uJ10uZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgfVxyXG4gICAgICBkZWxldGUgdGhpcy5vdXRsaW5lc1sncGl0Y2hTZWxlY3Rpb24nXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vICMjIyBfbW92ZVNlbGVjdGlvblBpdGNoXHJcbiAgLy8gU3VnZ2VzdCBhIHNwZWNpZmljIHBpdGNoIGluIGEgY2hvcmQsIHNvIHdlIGNhbiB0cmFuc3Bvc2UganVzdCB0aGUgb25lIG5vdGUgdnMuIHRoZSB3aG9sZSBjaG9yZC5cclxuICBfbW92ZVNlbGVjdGlvblBpdGNoKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuaWRsZVRpbWVyID0gRGF0ZS5ub3coKTtcclxuICAgIGlmICghdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZWwgPSB0aGlzLnNlbGVjdGlvbnNbMF07XHJcbiAgICBjb25zdCBub3RlID0gc2VsLm5vdGUgYXMgU21vTm90ZTtcclxuICAgIGlmIChub3RlLnBpdGNoZXMubGVuZ3RoIDwgMikge1xyXG4gICAgICB0aGlzLnBpdGNoSW5kZXggPSAtMTtcclxuICAgICAgdGhpcy5yZW1vdmVQaXRjaFNlbGVjdGlvbigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnBpdGNoSW5kZXggPSAodGhpcy5waXRjaEluZGV4ICsgaW5kZXgpICUgbm90ZS5waXRjaGVzLmxlbmd0aDtcclxuICAgIHNlbC5zZWxlY3Rvci5waXRjaGVzID0gW107XHJcbiAgICBzZWwuc2VsZWN0b3IucGl0Y2hlcy5wdXNoKHRoaXMucGl0Y2hJbmRleCk7XHJcbiAgICB0aGlzLl9oaWdobGlnaHRQaXRjaFNlbGVjdGlvbihub3RlLCB0aGlzLnBpdGNoSW5kZXgpO1xyXG4gIH1cclxuICBtb3ZlU2VsZWN0aW9uUGl0Y2hVcCgpIHtcclxuICAgIHRoaXMuX21vdmVTZWxlY3Rpb25QaXRjaCgxKTtcclxuICB9XHJcbiAgbW92ZVNlbGVjdGlvblBpdGNoRG93bigpIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9tb3ZlU2VsZWN0aW9uUGl0Y2goKHRoaXMuc2VsZWN0aW9uc1swXS5ub3RlIGFzIFNtb05vdGUpLnBpdGNoZXMubGVuZ3RoIC0gMSk7XHJcbiAgfVxyXG5cclxuICBtb3ZlU2VsZWN0aW9uVXAoKSB7XHJcbiAgICB0aGlzLl9tb3ZlU3RhZmZPZmZzZXQoLTEpO1xyXG4gIH1cclxuICBtb3ZlU2VsZWN0aW9uRG93bigpIHtcclxuICAgIHRoaXMuX21vdmVTdGFmZk9mZnNldCgxKTtcclxuICB9XHJcblxyXG4gIGNvbnRhaW5zQXJ0aWZhY3QoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICBfcmVwbGFjZVNlbGVjdGlvbihuc2VsZWN0b3I6IFNtb1NlbGVjdG9yLCBza2lwUGxheTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuc2NvcmUgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIGFydGlmYWN0ID0gU21vU2VsZWN0aW9uLm5vdGVTZWxlY3Rpb24odGhpcy5zY29yZSwgbnNlbGVjdG9yLnN0YWZmLCBuc2VsZWN0b3IubWVhc3VyZSwgbnNlbGVjdG9yLnZvaWNlLCBuc2VsZWN0b3IudGljayk7XHJcbiAgICBpZiAoIWFydGlmYWN0KSB7XHJcbiAgICAgIGFydGlmYWN0ID0gU21vU2VsZWN0aW9uLm5vdGVTZWxlY3Rpb24odGhpcy5zY29yZSwgbnNlbGVjdG9yLnN0YWZmLCBuc2VsZWN0b3IubWVhc3VyZSwgMCwgbnNlbGVjdG9yLnRpY2spO1xyXG4gICAgfVxyXG4gICAgaWYgKCFhcnRpZmFjdCkge1xyXG4gICAgICBhcnRpZmFjdCA9IFNtb1NlbGVjdGlvbi5ub3RlU2VsZWN0aW9uKHRoaXMuc2NvcmUsIG5zZWxlY3Rvci5zdGFmZiwgbnNlbGVjdG9yLm1lYXN1cmUsIDAsIDApO1xyXG4gICAgfVxyXG4gICAgaWYgKCFhcnRpZmFjdCkge1xyXG4gICAgICAvLyBkaXNhcHBlYXJlZCAtIGRlZmF1bHQgdG8gc3RhcnRcclxuICAgICAgYXJ0aWZhY3QgPSBTbW9TZWxlY3Rpb24ubm90ZVNlbGVjdGlvbih0aGlzLnNjb3JlLCAwLCAwLCAwLCAwKTtcclxuICAgIH1cclxuICAgIGlmICghc2tpcFBsYXkgJiYgdGhpcy5hdXRvUGxheSAmJiBhcnRpZmFjdCkge1xyXG4gICAgICB0aGlzLnBsYXlTZWxlY3Rpb24oYXJ0aWZhY3QpO1xyXG5cclxuICAgIH1cclxuICAgIGlmICghYXJ0aWZhY3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgYXJ0aWZhY3QubWVhc3VyZS5zZXRBY3RpdmVWb2ljZShuc2VsZWN0b3Iudm9pY2UpO1xyXG5cclxuICAgIC8vIGNsZWFyIG1vZGlmaWVyIHNlbGVjdGlvbnNcclxuICAgIHRoaXMuY2xlYXJNb2RpZmllclNlbGVjdGlvbnMoKTtcclxuICAgIHRoaXMuc2NvcmUuc2V0QWN0aXZlU3RhZmYobnNlbGVjdG9yLnN0YWZmKTtcclxuICAgIGNvbnN0IG1hcEtleSA9IE9iamVjdC5rZXlzKHRoaXMubWVhc3VyZU5vdGVNYXApLmZpbmQoKGspID0+XHJcbiAgICAgIGFydGlmYWN0ICYmIFNtb1NlbGVjdG9yLnNhbWVOb3RlKHRoaXMubWVhc3VyZU5vdGVNYXBba10uc2VsZWN0b3IsIGFydGlmYWN0LnNlbGVjdG9yKVxyXG4gICAgKTtcclxuICAgIGlmICghbWFwS2V5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1hcHBlZCA9IHRoaXMubWVhc3VyZU5vdGVNYXBbbWFwS2V5XTtcclxuICAgIC8vIElmIHRoaXMgaXMgYSBuZXcgc2VsZWN0aW9uLCByZW1vdmUgcGl0Y2gtc3BlY2lmaWMgYW5kIHJlcGxhY2Ugd2l0aCBub3RlLXNwZWNpZmljXHJcbiAgICBpZiAoIW5zZWxlY3Rvci5waXRjaGVzIHx8IG5zZWxlY3Rvci5waXRjaGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnBpdGNoSW5kZXggPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbnMgPSBbbWFwcGVkXTtcclxuICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICAgIHRoaXMuX2NyZWF0ZUxvY2FsTW9kaWZpZXJzTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rmlyc3RNZWFzdXJlT2ZTZWxlY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25zWzBdLm1lYXN1cmU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgLy8gIyMgbWVhc3VyZUl0ZXJhdG9yXHJcbiAgLy8gRGVzY3JpcHRpb246IGl0ZXJhdGUgb3ZlciB0aGUgYW55IG1lYXN1cmVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHNlbGVjdGlvblxyXG4gIGdldFNlbGVjdGVkTWVhc3VyZXMoKTogU21vU2VsZWN0aW9uW10ge1xyXG4gICAgY29uc3Qgc2V0OiBudW1iZXJbXSA9IFtdO1xyXG4gICAgY29uc3QgcnY6IFNtb1NlbGVjdGlvbltdID0gW107XHJcbiAgICBpZiAoIXRoaXMuc2NvcmUpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3Rpb25zLmZvckVhY2goKHNlbCkgPT4ge1xyXG4gICAgICBjb25zdCBtZWFzdXJlID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zY29yZSEsIHNlbC5zZWxlY3Rvci5zdGFmZiwgc2VsLnNlbGVjdG9yLm1lYXN1cmUpO1xyXG4gICAgICBpZiAobWVhc3VyZSkge1xyXG4gICAgICAgIGNvbnN0IGl4ID0gbWVhc3VyZS5zZWxlY3Rvci5tZWFzdXJlO1xyXG4gICAgICAgIGlmIChzZXQuaW5kZXhPZihpeCkgPT09IC0xKSB7XHJcbiAgICAgICAgICBzZXQucHVzaChpeCk7XHJcbiAgICAgICAgICBydi5wdXNoKG1lYXN1cmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG5cclxuICBfYWRkU2VsZWN0aW9uKHNlbGVjdGlvbjogU21vU2VsZWN0aW9uKSB7XHJcbiAgICBjb25zdCBhcjogU21vU2VsZWN0aW9uW10gPSB0aGlzLnNlbGVjdGlvbnMuZmlsdGVyKChzZWwpID0+XHJcbiAgICAgIFNtb1NlbGVjdG9yLm5lcShzZWwuc2VsZWN0b3IsIHNlbGVjdGlvbi5zZWxlY3RvcilcclxuICAgICk7XHJcbiAgICBpZiAodGhpcy5hdXRvUGxheSAmJiB0aGlzLnNjb3JlKSB7XHJcbiAgICAgIHRoaXMucGxheVNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgfVxyXG4gICAgYXIucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25zID0gYXI7XHJcbiAgfVxyXG5cclxuICBfc2VsZWN0RnJvbVRvSW5TdGFmZihzY29yZTogU21vU2NvcmUsIHNlbDE6IFNtb1NlbGVjdGlvbiwgc2VsMjogU21vU2VsZWN0aW9uKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gU21vU2VsZWN0aW9uLmlubmVyU2VsZWN0aW9ucyhzY29yZSwgc2VsMS5zZWxlY3Rvciwgc2VsMi5zZWxlY3Rvcik7XHJcbiAgICAvKiAuZmlsdGVyKChmZikgPT4gXHJcbiAgICAgIGZmLnNlbGVjdG9yLnZvaWNlID09PSBzZWwxLm1lYXN1cmUuYWN0aXZlVm9pY2VcclxuICAgICk7ICovXHJcbiAgICB0aGlzLnNlbGVjdGlvbnMgPSBbXTtcclxuICAgIC8vIEdldCB0aGUgYWN0dWFsIHNlbGVjdGlvbnMgZnJvbSBvdXIgbWFwLCBzaW5jZSB0aGUgY2xpZW50IGJvdW5kaW5nIGJveGVzIGFyZSBhbHJlYWR5IGNvbXB1dGVkXHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbCkgPT4ge1xyXG4gICAgICBjb25zdCBrZXkgPSBTbW9TZWxlY3Rvci5nZXROb3RlS2V5KHNlbC5zZWxlY3Rvcik7XHJcbiAgICAgIHNlbC5tZWFzdXJlLnNldEFjdGl2ZVZvaWNlKHNlbC5zZWxlY3Rvci52b2ljZSk7XHJcbiAgICAgIC8vIFNraXAgbWVhc3VyZXMgdGhhdCBhcmUgbm90IHJlbmRlcmVkIGJlY2F1c2UgdGhleSBhcmUgcGFydCBvZiBhIG11bHRpLXJlc3RcclxuICAgICAgaWYgKHRoaXMubWVhc3VyZU5vdGVNYXAgJiYgdGhpcy5tZWFzdXJlTm90ZU1hcFtrZXldKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25zLnB1c2godGhpcy5tZWFzdXJlTm90ZU1hcFtrZXldKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb25zID0gW3NlbDFdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pZGxlVGltZXIgPSBEYXRlLm5vdygpO1xyXG4gIH1cclxuICBfc2VsZWN0QmV0d2VlblNlbGVjdGlvbnMoczE6IFNtb1NlbGVjdGlvbiwgczI6IFNtb1NlbGVjdGlvbikge1xyXG4gICAgY29uc3Qgc2NvcmUgPSB0aGlzLnJlbmRlcmVyLnNjb3JlID8/IG51bGw7XHJcbiAgICBpZiAoIXNjb3JlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1pbiA9IFNtb1NlbGVjdG9yLmd0KHMxLnNlbGVjdG9yLCBzMi5zZWxlY3RvcikgPyBzMiA6IHMxO1xyXG4gICAgY29uc3QgbWF4ID0gU21vU2VsZWN0b3IubHQobWluLnNlbGVjdG9yLCBzMi5zZWxlY3RvcikgPyBzMiA6IHMxO1xyXG4gICAgdGhpcy5fc2VsZWN0RnJvbVRvSW5TdGFmZihzY29yZSwgbWluLCBtYXgpO1xyXG4gICAgdGhpcy5fY3JlYXRlTG9jYWxNb2RpZmllcnNMaXN0KCk7XHJcbiAgICB0aGlzLmhpZ2hsaWdodFF1ZXVlLnNlbGVjdGlvbkNvdW50ID0gdGhpcy5zZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICB9XHJcbiAgc2VsZWN0U3VnZ2VzdGlvbihldjogS2V5RXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5zdWdnZXN0aW9uIHx8ICF0aGlzLnN1Z2dlc3Rpb24ubWVhc3VyZSB8fCB0aGlzLnNjb3JlID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaWRsZVRpbWVyID0gRGF0ZS5ub3coKTtcclxuXHJcbiAgICBpZiAodGhpcy5tb2RpZmllclN1Z2dlc3Rpb24pIHtcclxuICAgICAgdGhpcy5tb2RpZmllckluZGV4ID0gLTE7XHJcbiAgICAgIHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zID0gW3RoaXMubW9kaWZpZXJTdWdnZXN0aW9uXTtcclxuICAgICAgdGhpcy5tb2RpZmllclN1Z2dlc3Rpb24gPSBudWxsO1xyXG4gICAgICB0aGlzLmNyZWF0ZUxvY2FsTW9kaWZpZXJzRnJvbU1vZGlmaWVyVGFicyh0aGlzLm1vZGlmaWVyU2VsZWN0aW9ucyk7XHJcbiAgICAgIC8vIElmIHdlIHNlbGVjdGVkIGR1ZSB0byBhIG1vdXNlIGNsaWNrLCBtb3ZlIHRoZSBzZWxlY3Rpb24gdG8gdGhlXHJcbiAgICAgIC8vIHNlbGVjdGVkIG1vZGlmaWVyXHJcbiAgICAgIHRoaXMuX2hpZ2hsaWdodE1vZGlmaWVyKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAoZXYudHlwZSA9PT0gJ2NsaWNrJykge1xyXG4gICAgICB0aGlzLmNsZWFyTW9kaWZpZXJTZWxlY3Rpb25zKCk7IC8vIGlmIHdlIGNsaWNrIG9uIGEgbm9uLW1vZGlmaWVyLCBjbGVhciB0aGVcclxuICAgICAgLy8gbW9kaWZpZXIgc2VsZWN0aW9uc1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChldi5zaGlmdEtleSkge1xyXG4gICAgICBjb25zdCBzZWwxID0gdGhpcy5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKTtcclxuICAgICAgaWYgKHNlbDEuc2VsZWN0b3Iuc3RhZmYgPT09IHRoaXMuc3VnZ2VzdGlvbi5zZWxlY3Rvci5zdGFmZikge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdEJldHdlZW5TZWxlY3Rpb25zKHNlbDEsIHRoaXMuc3VnZ2VzdGlvbik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2LmN0cmxLZXkpIHtcclxuICAgICAgdGhpcy5fYWRkU2VsZWN0aW9uKHRoaXMuc3VnZ2VzdGlvbik7XHJcbiAgICAgIHRoaXMuX2NyZWF0ZUxvY2FsTW9kaWZpZXJzTGlzdCgpO1xyXG4gICAgICB0aGlzLmRlZmVySGlnaGxpZ2h0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmF1dG9QbGF5KSB7XHJcbiAgICAgIHRoaXMucGxheVNlbGVjdGlvbih0aGlzLnN1Z2dlc3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZXNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb25zWzBdID9cclxuICAgICAgU21vU2VsZWN0b3Iuc2FtZU5vdGUodGhpcy5zdWdnZXN0aW9uLnNlbGVjdG9yLCB0aGlzLnNlbGVjdGlvbnNbMF0uc2VsZWN0b3IpICYmIHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPT09IDEgOiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbnMucHVzaCh0aGlzLnN1Z2dlc3Rpb24pO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm90ZSA9IHRoaXMuc2VsZWN0aW9uc1swXS5ub3RlIGFzIFNtb05vdGU7XHJcbiAgICBpZiAocHJlc2VsZWN0ZWQgJiYgbm90ZS5waXRjaGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5waXRjaEluZGV4ID0gICh0aGlzLnBpdGNoSW5kZXggKyAxKSAlIG5vdGUucGl0Y2hlcy5sZW5ndGg7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uc1swXS5zZWxlY3Rvci5waXRjaGVzID0gW3RoaXMucGl0Y2hJbmRleF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBTbW9TZWxlY3Rpb24ubm90ZUZyb21TZWxlY3Rvcih0aGlzLnNjb3JlLCB0aGlzLnN1Z2dlc3Rpb24uc2VsZWN0b3IpO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgc2VsZWN0aW9uLmJveCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zdWdnZXN0aW9uLmJveCkpO1xyXG4gICAgICAgIHNlbGVjdGlvbi5zY3JvbGxCb3ggPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc3VnZ2VzdGlvbi5zY3JvbGxCb3gpKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbnMgPSBbc2VsZWN0aW9uXTtcclxuICAgICAgICAvLyBUaGVyZSBpcyBhIHNpbmdsZSBzZWxlY3Rpb24sIG1ha2Ugc3VyZSB0aGUgYWN0aXZlIHZvaWNlIGlzIHNldCB0byBpdC5cclxuICAgICAgICBzZWxlY3Rpb24ubWVhc3VyZS5zZXRBY3RpdmVWb2ljZShzZWxlY3Rpb24uc2VsZWN0b3Iudm9pY2UpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlVm9pY2UoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHByZXNlbGVjdGVkICYmIHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBtb2RzICA9IHRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmZpbHRlcigobW0pID0+IG1tLnNlbGVjdGlvbiAmJiBTbW9TZWxlY3Rvci5zYW1lTm90ZShtbS5zZWxlY3Rpb24uc2VsZWN0b3IsIHRoaXMuc2VsZWN0aW9uc1swXS5zZWxlY3RvcikpO1xyXG4gICAgICBpZiAobW9kcy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBtb2RUb0FkZCA9IG1vZHNbMF07XHJcbiAgICAgICAgaWYgKCFtb2RUb0FkZCkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKCdiYWQgbW9kaWZpZXIgc2VsZWN0aW9uIGluIHNlbGVjdFN1Z2dlc3Rpb24gMicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1vZGlmaWVyU2VsZWN0aW9uc1swXSA9IG1vZFRvQWRkO1xyXG4gICAgICAgIHRoaXMubW9kaWZpZXJJbmRleCA9IG1vZHNbMF0uaW5kZXg7XHJcbiAgICAgICAgdGhpcy5faGlnaGxpZ2h0TW9kaWZpZXIoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2NvcmUuc2V0QWN0aXZlU3RhZmYodGhpcy5zZWxlY3Rpb25zWzBdLnNlbGVjdG9yLnN0YWZmKTtcclxuICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICAgIHRoaXMuX2NyZWF0ZUxvY2FsTW9kaWZpZXJzTGlzdCgpO1xyXG4gIH1cclxuICBfc2V0TW9kaWZpZXJBc1N1Z2dlc3Rpb24oYXJ0aWZhY3Q6IE1vZGlmaWVyVGFiKTogdm9pZCB7XHJcbiAgICBpZiAoIWFydGlmYWN0LmJveCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm1vZGlmaWVyU3VnZ2VzdGlvbiA9IGFydGlmYWN0O1xyXG4gICAgdGhpcy5fZHJhd1JlY3QoYXJ0aWZhY3QuYm94LCAnc3VnZ2VzdGlvbicpO1xyXG4gIH1cclxuXHJcbiAgX3NldEFydGlmYWN0QXNTdWdnZXN0aW9uKGFydGlmYWN0OiBTbW9TZWxlY3Rpb24pIHtcclxuICAgIGxldCBzYW1lU2VsOiBTbW9TZWxlY3Rpb24gfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGlvbnMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgc3MgPSB0aGlzLnNlbGVjdGlvbnNbaV07XHJcbiAgICAgIGlmIChzcyAmJiBTbW9TZWxlY3Rvci5zYW1lTm90ZShzcy5zZWxlY3RvciwgYXJ0aWZhY3Quc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgc2FtZVNlbCA9IHNzO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoc2FtZVNlbCB8fCAhYXJ0aWZhY3QuYm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubW9kaWZpZXJTdWdnZXN0aW9uID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLnN1Z2dlc3Rpb24gPSBhcnRpZmFjdDtcclxuICAgIHRoaXMuX2RyYXdSZWN0KGFydGlmYWN0LmJveCwgJ3N1Z2dlc3Rpb24nKTtcclxuICB9XHJcbiAgX2hpZ2hsaWdodE1vZGlmaWVyKCkge1xyXG4gICAgbGV0IGJveDogU3ZnQm94IHwgbnVsbCA9IG51bGw7XHJcbiAgICBpZiAoIXRoaXMubW9kaWZpZXJTZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbW92ZU1vZGlmaWVyU2VsZWN0aW9uQm94KCk7XHJcbiAgICB0aGlzLm1vZGlmaWVyU2VsZWN0aW9ucy5mb3JFYWNoKChhcnRpZmFjdCkgPT4ge1xyXG4gICAgICBpZiAoYm94ID09PSBudWxsKSB7XHJcbiAgICAgICAgYm94ID0gYXJ0aWZhY3QubW9kaWZpZXIubG9naWNhbEJveCA/PyBudWxsO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGJveCA9IFN2Z0hlbHBlcnMudW5pb25SZWN0KGJveCwgU3ZnSGVscGVycy5zbW9Cb3goYXJ0aWZhY3QubW9kaWZpZXIubG9naWNhbEJveCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChib3ggPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZHJhd1JlY3QoYm94LCAnc3RhZmZNb2RpZmllcicpO1xyXG4gIH1cclxuXHJcbiAgX2hpZ2hsaWdodFBpdGNoU2VsZWN0aW9uKG5vdGU6IFNtb05vdGUsIGluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG5vdGVEaXYgPSAkKHRoaXMucmVuZGVyRWxlbWVudCkuZmluZCgnIycgKyBub3RlLnJlbmRlcklkKTtcclxuICAgIGNvbnN0IGhlYWRzID0gbm90ZURpdi5maW5kKCcudmYtbm90ZWhlYWQnKTtcclxuICAgIGlmICghaGVhZHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGhlYWRFbCA9IGhlYWRzW2luZGV4XTtcclxuICAgIGNvbnN0IHBhZ2VDb250ZXh0ID0gdGhpcy5yZW5kZXJlci5wYWdlTWFwLmdldFJlbmRlcmVyRnJvbU1vZGlmaWVyKG5vdGUpO1xyXG4gICAgJChwYWdlQ29udGV4dC5zdmcpLmZpbmQoJy52Zi1waXRjaFNlbGVjdGlvbicpLnJlbW92ZSgpO1xyXG4gICAgY29uc3QgYm94ID0gcGFnZUNvbnRleHQub2Zmc2V0QmJveChoZWFkRWwpO1xyXG4gICAgdGhpcy5fZHJhd1JlY3QoYm94LCAncGl0Y2hTZWxlY3Rpb24nKTtcclxuICB9XHJcblxyXG4gIF9oaWdobGlnaHRBY3RpdmVWb2ljZShzZWxlY3Rpb246IFNtb1NlbGVjdGlvbikge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3Rpb24uc2VsZWN0b3I7XHJcbiAgICBmb3IgKGkgPSAxOyBpIDw9IDQ7ICsraSkge1xyXG4gICAgICBjb25zdCBjbCA9ICd2JyArIGkudG9TdHJpbmcoKSArICctYWN0aXZlJztcclxuICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKGNsKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGMyID0gJ3YnICsgKHNlbGVjdG9yLnZvaWNlICsgMSkudG9TdHJpbmcoKSArICctYWN0aXZlJztcclxuICAgICQoJ2JvZHknKS5hZGRDbGFzcyhjMik7XHJcbiAgfVxyXG4gIC8vIFRoZSB1c2VyIGhhcyBqdXN0IHN3aXRjaGVkIHZvaWNlcywgc2VsZWN0IHRoZSBhY3RpdmUgdm9pY2VcclxuICBzZWxlY3RBY3RpdmVWb2ljZSgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uc1swXTtcclxuICAgIGNvbnN0IHNlbGVjdG9yID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWxlY3Rpb24uc2VsZWN0b3IpKTtcclxuICAgIHNlbGVjdG9yLnZvaWNlID0gc2VsZWN0aW9uLm1lYXN1cmUuYWN0aXZlVm9pY2U7XHJcbiAgICB0aGlzLnNlbGVjdGlvbnMgPSBbdGhpcy5fZ2V0Q2xvc2VzdFRpY2soc2VsZWN0b3IpXTtcclxuICAgIHRoaXMuZGVmZXJIaWdobGlnaHQoKTtcclxuICB9XHJcblxyXG4gIGhpZ2hsaWdodFNlbGVjdGlvbigpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBwcmV2U2VsOiBTbW9TZWxlY3Rpb24gfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBjdXJCb3g6IFN2Z0JveCA9IFN2Z0JveC5kZWZhdWx0O1xyXG4gICAgdGhpcy5pZGxlVGltZXIgPSBEYXRlLm5vdygpO1xyXG4gICAgY29uc3QgZ3JhY2UgPSB0aGlzLmdldFNlbGVjdGVkR3JhY2VOb3RlcygpO1xyXG4gICAgLy8gSWYgdGhpcyBpcyBub3QgYSBub3RlIHdpdGggZ3JhY2Ugbm90ZXMsIGxvZ2ljYWxseSB1bnNlbGVjdCB0aGUgZ3JhY2Ugbm90ZXNcclxuICAgIGlmIChncmFjZSAmJiBncmFjZS5sZW5ndGggJiYgZ3JhY2VbMF0uc2VsZWN0aW9uICYmIHRoaXMuc2VsZWN0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgaWYgKCFTbW9TZWxlY3Rvci5zYW1lTm90ZShncmFjZVswXS5zZWxlY3Rpb24uc2VsZWN0b3IsIHRoaXMuc2VsZWN0aW9uc1swXS5zZWxlY3RvcikpIHtcclxuICAgICAgICB0aGlzLmNsZWFyTW9kaWZpZXJTZWxlY3Rpb25zKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5faGlnaGxpZ2h0TW9kaWZpZXIoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIElmIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gd2l0aCBhIGNoYW5nZSwgYXZvaWQgcmVmZXJlbmNpbmcgbnVsbCBub3RlXHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0aW9uc1swXS5ub3RlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG5vdGUgPSB0aGlzLnNlbGVjdGlvbnNbMF0ubm90ZSBhcyBTbW9Ob3RlO1xyXG4gICAgaWYgKHRoaXMucGl0Y2hJbmRleCA+PSAwICYmIHRoaXMuc2VsZWN0aW9ucy5sZW5ndGggPT09IDEgJiZcclxuICAgICAgdGhpcy5waXRjaEluZGV4IDwgbm90ZS5waXRjaGVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLl9oaWdobGlnaHRQaXRjaFNlbGVjdGlvbihub3RlLCB0aGlzLnBpdGNoSW5kZXgpO1xyXG4gICAgICB0aGlzLl9oaWdobGlnaHRBY3RpdmVWb2ljZSh0aGlzLnNlbGVjdGlvbnNbMF0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbW92ZVBpdGNoU2VsZWN0aW9uKCk7XHJcbiAgICB0aGlzLnBpdGNoSW5kZXggPSAtMTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbnMubGVuZ3RoID09PSAxICYmIG5vdGUubG9naWNhbEJveCkge1xyXG4gICAgICB0aGlzLl9kcmF3UmVjdChub3RlLmxvZ2ljYWxCb3gsICdzZWxlY3Rpb24nKTtcclxuICAgICAgdGhpcy5faGlnaGxpZ2h0QWN0aXZlVm9pY2UodGhpcy5zZWxlY3Rpb25zWzBdKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc29ydGVkID0gdGhpcy5zZWxlY3Rpb25zLnNvcnQoKGEsIGIpID0+IFNtb1NlbGVjdG9yLmd0KGEuc2VsZWN0b3IsIGIuc2VsZWN0b3IpID8gMSA6IC0xKTtcclxuICAgIHByZXZTZWwgPSBzb3J0ZWRbMF07XHJcbiAgICAvLyByZW5kZXJlZCB5ZXQ/XHJcbiAgICBpZiAoIXByZXZTZWwgfHwgIXByZXZTZWwuYm94KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGN1ckJveCA9IFN2Z0hlbHBlcnMuc21vQm94KHByZXZTZWwuYm94KTtcclxuICAgIGNvbnN0IGJveGVzOiBTdmdCb3hbXSA9IFtdO1xyXG4gICAgZm9yIChpID0gMTsgaSA8IHNvcnRlZC5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBzZWwgPSBzb3J0ZWRbaV07XHJcbiAgICAgIGlmICghc2VsLmJveCB8fCAhcHJldlNlbC5ib3gpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBjb25zdCB5ZGlmZiA9IE1hdGguYWJzKHByZXZTZWwuYm94LnkgLSBzZWwuYm94LnkpO1xyXG4gICAgICBpZiAoc2VsLnNlbGVjdG9yLnN0YWZmID09PSBwcmV2U2VsLnNlbGVjdG9yLnN0YWZmICYmIHNlbC5tZWFzdXJlLnN2Zy5saW5lSW5kZXggPT09IHByZXZTZWwubWVhc3VyZS5zdmcubGluZUluZGV4KSB7XHJcbiAgICAgICAgY3VyQm94ID0gU3ZnSGVscGVycy51bmlvblJlY3QoY3VyQm94LCBzZWwuYm94KTtcclxuICAgICAgfSBlbHNlIGlmIChjdXJCb3gpIHtcclxuICAgICAgICBib3hlcy5wdXNoKGN1ckJveCk7XHJcbiAgICAgICAgY3VyQm94ID0gU3ZnSGVscGVycy5zbW9Cb3goc2VsLmJveCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5faGlnaGxpZ2h0QWN0aXZlVm9pY2Uoc2VsKTtcclxuICAgICAgcHJldlNlbCA9IHNlbDtcclxuICAgIH1cclxuICAgIGJveGVzLnB1c2goY3VyQm94KTtcclxuICAgIGlmICh0aGlzLm1vZGlmaWVyU2VsZWN0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgYm94ZXMucHVzaCh0aGlzLm1vZGlmaWVyU2VsZWN0aW9uc1swXS5ib3gpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZHJhd1JlY3QoYm94ZXMsICdzZWxlY3Rpb24nKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQm94ZXMgYXJlIGRpdmlkZWQgdXAgaW50byBsaW5lcy9zeXN0ZW1zIGFscmVhZHkuICBCdXQgd2UgbmVlZFxyXG4gICAqIHRvIHB1dCB0aGUgY29ycmVjdCBib3ggb24gdGhlIGNvcnJlY3QgcGFnZS5cclxuICAgKiBAcGFyYW0gYm94ZXMgXHJcbiAgICovXHJcbiAgZHJhd1NlbGVjdGlvblJlY3RzKGJveGVzOiBTdmdCb3hbXSkge1xyXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0aW9uUmVjdHMpO1xyXG4gICAgLy8gZXJhc2UgYW55IG9sZCBzZWxlY3Rpb25zXHJcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBvb24gPSB0aGlzLnNlbGVjdGlvblJlY3RzW3BhcnNlSW50KGtleSldO1xyXG4gICAgICBvb24uZm9yRWFjaCgob3V0bGluZSkgPT4ge1xyXG4gICAgICAgIGlmIChvdXRsaW5lLmVsZW1lbnQpIHtcclxuICAgICAgICAgIG91dGxpbmUuZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICAgIG91dGxpbmUuZWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICBcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VsZWN0aW9uUmVjdHMgPSB7fTtcclxuICAgIC8vIENyZWF0ZSBhbiBPdXRsaW5lSW5mbyBmb3IgZWFjaCBwYWdlXHJcbiAgICBjb25zdCBwYWdlczogbnVtYmVyW10gPSBbXTtcclxuICAgIGNvbnN0IHN0cm9rZTogU3Ryb2tlSW5mbyA9IChTdWlUcmFja2VyLnN0cm9rZXMgYXMgYW55KVsnc2VsZWN0aW9uJ107XHJcbiAgICBib3hlcy5mb3JFYWNoKChib3gpID0+IHtcclxuICAgICAgbGV0IHRlc3RCb3g6IFN2Z0JveCA9IFN2Z0hlbHBlcnMuc21vQm94KGJveCk7XHJcbiAgICAgIGxldCBjb250ZXh0ID0gdGhpcy5yZW5kZXJlci5wYWdlTWFwLmdldFJlbmRlcmVyKHRlc3RCb3gpO1xyXG4gICAgICB0ZXN0Qm94LnkgLT0gY29udGV4dC5ib3gueTtcclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvblJlY3RzW2NvbnRleHQucGFnZU51bWJlcl0pIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvblJlY3RzW2NvbnRleHQucGFnZU51bWJlcl0gPSBbXTtcclxuICAgICAgICBwYWdlcy5wdXNoKGNvbnRleHQucGFnZU51bWJlcik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZWxlY3Rpb25SZWN0c1tjb250ZXh0LnBhZ2VOdW1iZXJdLnB1c2goe1xyXG4gICAgICAgIGNvbnRleHQ6IGNvbnRleHQsIGJveDogdGVzdEJveCwgY2xhc3NlczogJycsXHJcbiAgICAgICAgc3Ryb2tlLCBzY3JvbGw6IHRoaXMuc2Nyb2xsZXIuc2Nyb2xsU3RhdGUsXHJcbiAgICAgICAgdGltZU9mZjogMFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcGFnZXMuZm9yRWFjaCgocGFnZU5vKSA9PiB7XHJcbiAgICAgIGNvbnN0IG91dGxpbmVJbmZvcyA9IHRoaXMuc2VsZWN0aW9uUmVjdHNbcGFnZU5vXTtcclxuICAgICAgb3V0bGluZUluZm9zLmZvckVhY2goKGluZm8pID0+IHtcclxuICAgICAgICBTdmdIZWxwZXJzLm91dGxpbmVSZWN0KGluZm8pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBfZHJhd1JlY3QocEJveDogU3ZnQm94IHwgU3ZnQm94W10sIHN0cm9rZU5hbWU6IHN0cmluZykgeyAgICBcclxuICAgIGNvbnN0IHN0cm9rZTogU3Ryb2tlSW5mbyA9IChTdWlUcmFja2VyLnN0cm9rZXMgYXMgYW55KVtzdHJva2VOYW1lXTtcclxuICAgIGNvbnN0IGJveGVzID0gQXJyYXkuaXNBcnJheShwQm94KSA/IHBCb3ggOiBbcEJveF07XHJcbiAgICBpZiAoc3Ryb2tlTmFtZSA9PT0gJ3NlbGVjdGlvbicpIHtcclxuICAgICAgdGhpcy5kcmF3U2VsZWN0aW9uUmVjdHMoYm94ZXMpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBib3hlcy5mb3JFYWNoKChib3gpID0+IHtcclxuICAgICAgbGV0IHRlc3RCb3g6IFN2Z0JveCA9IFN2Z0hlbHBlcnMuc21vQm94KGJveCk7XHJcbiAgICAgIGxldCBjb250ZXh0ID0gdGhpcy5yZW5kZXJlci5wYWdlTWFwLmdldFJlbmRlcmVyKHRlc3RCb3gpO1xyXG4gICAgICBjb25zdCB0aW1lT2ZmID0gc3Ryb2tlTmFtZSA9PT0gJ3N1Z2dlc3Rpb24nID8gMTAwMCA6IDA7ICAgIFxyXG4gICAgICBpZiAoY29udGV4dCkge1xyXG4gICAgICAgIHRlc3RCb3gueSAtPSBjb250ZXh0LmJveC55O1xyXG4gICAgICAgIGlmICghdGhpcy5vdXRsaW5lc1tzdHJva2VOYW1lXSkge1xyXG4gICAgICAgICAgdGhpcy5vdXRsaW5lc1tzdHJva2VOYW1lXSA9IHtcclxuICAgICAgICAgICAgY29udGV4dDogY29udGV4dCwgYm94OiB0ZXN0Qm94LCBjbGFzc2VzOiAnJyxcclxuICAgICAgICAgICAgc3Ryb2tlLCBzY3JvbGw6IHRoaXMuc2Nyb2xsZXIuc2Nyb2xsU3RhdGUsXHJcbiAgICAgICAgICAgIHRpbWVPZmZcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub3V0bGluZXNbc3Ryb2tlTmFtZV0uYm94ID0gdGVzdEJveDtcclxuICAgICAgICB0aGlzLm91dGxpbmVzW3N0cm9rZU5hbWVdLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgICAgIFN2Z0hlbHBlcnMub3V0bGluZVJlY3QodGhpcy5vdXRsaW5lc1tzdHJva2VOYW1lXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/render/sui/tracker.ts\n\n}");
427
427
 
428
428
  /***/ }),
429
429
 
@@ -467,7 +467,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
467
467
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
468
468
 
469
469
  "use strict";
470
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VxMeasure: () => (/* binding */ VxMeasure)\n/* harmony export */ });\n/* harmony import */ var _smo_data_note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/note */ \"./src/smo/data/note.ts\");\n/* harmony import */ var _smo_data_music__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../sui/layoutDebug */ \"./src/render/sui/layoutDebug.ts\");\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _styles_font_metrics_ssp_serif_metrics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../styles/font_metrics/ssp-serif-metrics */ \"./src/styles/font_metrics/ssp-serif-metrics.js\");\n/* harmony import */ var _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/data/noteModifiers */ \"./src/smo/data/noteModifiers.ts\");\n/* harmony import */ var _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../smo/data/common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _smoAdapter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./smoAdapter */ \"./src/render/vex/smoAdapter.ts\");\n/* harmony import */ var _common_vex__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../common/vex */ \"./src/common/vex.ts\");\n/* harmony import */ var _vxNote__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./vxNote */ \"./src/render/vex/vxNote.ts\");\n/* harmony import */ var _glyphDimensions__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./glyphDimensions */ \"./src/render/vex/glyphDimensions.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n// ## Description:\n// This file calls the vexflow routines that actually render a\n// measure of music. If multiple measures are justified in a\n// column, the rendering is deferred until all the measures have been\n// preformatted.\n\n\n\n\n\n\n\n\n\n\n\n\nconst VF = _common_vex__WEBPACK_IMPORTED_MODULE_9__.VexFlow;\n// const VF = eval('Vex.Flow');\n/**\n * This is the interface for VexFlow library that actually does the engraving.\n * @category SuiRender\n */\nclass VxMeasure {\n constructor(context, selection, printing, softmax) {\n this.rendered = false;\n this.noteToVexMap = {};\n this.beamToVexMap = {};\n this.tupletToVexMap = {};\n this.multimeasureRest = null;\n this.vexNotes = [];\n this.vexBeamGroups = [];\n this.vexTuplets = [];\n this.tickmapObject = null;\n this.stave = null; // vex stave\n this.voiceNotes = []; // notes for current voice, as rendering\n this.tabNotes = [];\n this.voiceAr = [];\n this.tabVoice = null;\n this.formatter = null;\n this.allCues = false;\n this.modifiersToBox = [];\n this.collisionMap = {};\n this.dbgLeftX = 0;\n this.dbgWidth = 0;\n this.context = context;\n this.rendered = false;\n this.selection = selection;\n this.smoMeasure = this.selection.measure;\n this.printing = printing;\n this.allCues = selection.staff.partInfo.displayCues;\n this.tupletToVexMap = {};\n this.vexNotes = [];\n this.vexBeamGroups = [];\n this.vexBeamGroups = [];\n this.beamToVexMap = {};\n this.softmax = softmax;\n this.smoTabStave = selection.staff.getTabStaveForMeasure(selection.selector);\n }\n static get fillStyle() {\n return '#000';\n }\n // Treat a rest like a whole rest if there is only a single rest in the measure\n // and the measure length is not a pickup\n isWholeRest() {\n return (this.smoMeasure.voices.length === 1 &&\n this.smoMeasure.voices[0].notes.length === 1 &&\n this.smoMeasure.voices[0].notes[0].isRest() &&\n this.smoMeasure.getMaxTicksVoice() > 4096);\n }\n createCollisionTickmap() {\n let i = 0;\n let j = 0;\n if (!this.tickmapObject) {\n return;\n }\n for (i = 0; i < this.smoMeasure.voices.length; ++i) {\n const tm = this.tickmapObject.tickmaps[i];\n for (j = 0; j < tm.durationMap.length; ++j) {\n if (typeof (this.collisionMap[tm.durationMap[j]]) === 'undefined') {\n this.collisionMap[tm.durationMap[j]] = [];\n }\n this.collisionMap[tm.durationMap[j]].push(this.smoMeasure.voices[i].notes[j]);\n }\n }\n }\n isCollision(voiceIx, tickIx) {\n let i = 0;\n let j = 0;\n let k = 0;\n let staffLines = [];\n if (!this.tickmapObject) {\n return false;\n }\n const tick = this.tickmapObject.tickmaps[voiceIx].durationMap[tickIx];\n // Just one note, no collision\n if (this.collisionMap[tick].length < 2) {\n return false;\n }\n for (i = 0; i < this.collisionMap[tick].length; ++i) {\n const note = this.collisionMap[tick][i];\n for (j = 0; j < note.pitches.length; ++j) {\n const clef = (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_7__.IsClef)(note.clef) ? note.clef : 'treble';\n const pitch = note.pitches[j];\n const curLine = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.pitchToStaffLine(clef, pitch);\n for (k = 0; k < staffLines.length; ++k) {\n if (Math.abs(curLine - staffLines[k]) < 1) {\n return true;\n }\n }\n staffLines.push(curLine);\n }\n }\n return false;\n }\n /**\n * convert a smoNote into a vxNote so it can be rasterized\n * @param smoNote\n * @param tickIndex - used to calculate accidental\n * @param voiceIx\n * @returns\n */\n createVexNote(smoNote, tickIndex, voiceIx) {\n let vexNote = null;\n let smoTabNote = null;\n let timestamp = new Date().valueOf();\n const stemTicks = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.ticksToDuration[smoNote.stemTicks];\n let tabNote = null;\n const noteHead = smoNote.isRest() ? 'r' : smoNote.noteHead;\n const keys = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.smoPitchesToVexKeys(smoNote.pitches, 0, noteHead);\n const smoNoteParams = {\n isTuplet: smoNote.isTuplet,\n measureIndex: this.smoMeasure.measureNumber.measureIndex,\n clef: smoNote.clef,\n stemTicks,\n keys,\n noteType: smoNote.noteType,\n isCue: smoNote.isCue\n };\n const { noteParams, duration } = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getVexNoteParameters)(smoNoteParams);\n if (this.tabStave && this.smoTabStave) {\n smoTabNote = this.smoTabStave.getTabNoteFromNote(smoNote, this.smoMeasure.transposeIndex);\n if (smoTabNote) {\n const positions = (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.VexTabNotePositions)(this.smoTabStave, smoTabNote, smoNote);\n if (positions.length) {\n if (!smoNote.isRest()) {\n tabNote = new VF.TabNote({ positions, duration: duration });\n if (this.smoTabStave.showStems) {\n tabNote.render_options.draw_stem = true;\n tabNote.render_options.draw_dots = true;\n tabNote.render_options.draw_stem_through_stave = smoTabNote.flagThrough;\n }\n }\n else {\n tabNote = new VF.StaveNote(noteParams);\n }\n }\n }\n }\n if (smoNote.noteType === '/') {\n // vexNote = new VF.GlyphNote('\\uE504', { duration });\n vexNote = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getSlashGlyph)();\n smoNote.renderId = 'vf-' + vexNote.getAttribute('id'); // where does 'vf' come from?\n }\n else {\n const smoVexStemParams = {\n voiceCount: this.smoMeasure.voices.length,\n voiceIx,\n isAuto: smoNote.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.auto,\n isUp: smoNote.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.up\n };\n (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.applyStemDirection)(smoVexStemParams, noteParams);\n if (smoTabNote && tabNote) {\n tabNote.setStemDirection(noteParams.stem_direction);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATA, new Date().valueOf() - timestamp);\n timestamp = new Date().valueOf();\n vexNote = new VF.StaveNote(noteParams);\n if (voiceIx > 0 && this.isCollision(voiceIx, tickIndex)) {\n vexNote.setXShift(-10);\n }\n if (this.isWholeRest()) {\n noteParams.duration = 'wr';\n vexNote = new VF.StaveNote(noteParams);\n vexNote.setCenterAlignment(true);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATB, new Date().valueOf() - timestamp);\n timestamp = new Date().valueOf();\n if (smoNote.fillStyle && !this.printing) {\n vexNote.setStyle({ fillStyle: smoNote.fillStyle });\n }\n else if (voiceIx > 0 && !this.printing) {\n vexNote.setStyle({ fillStyle: \"#115511\" });\n }\n else if (smoNote.isHidden() && this.printing) {\n vexNote.setStyle({ fillStyle: \"#ffffff00\" });\n }\n smoNote.renderId = 'vf-' + vexNote.getAttribute('id'); // where does 'vf' come from?\n if (this.stave) {\n vexNote.setStave(this.stave);\n }\n }\n const noteData = {\n smoMeasure: this.smoMeasure,\n vxMeasure: this,\n smoNote: smoNote,\n staveNote: vexNote,\n voiceIndex: voiceIx,\n tickIndex: tickIndex\n };\n if (tabNote) {\n noteData.tabNote = tabNote;\n this.tabNotes.push(tabNote);\n }\n const modObj = new _vxNote__WEBPACK_IMPORTED_MODULE_10__.VxNote(noteData);\n modObj.addModifiers();\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATC, new Date().valueOf() - timestamp);\n return modObj;\n }\n renderNoteGlyph(smoNote, textObj) {\n var x = this.noteToVexMap[smoNote.attrs.id].getAbsoluteX() + textObj.xOffset;\n // the -3 is copied from vexflow textDynamics\n var y = this.stave.getYForLine(textObj.yOffsetLine - 3) + textObj.yOffsetPixels;\n let maxh = 0;\n const minx = x;\n var group = this.context.getContext().openGroup();\n group.classList.add(textObj.attrs.id + '-' + smoNote.attrs.id);\n group.classList.add(textObj.attrs.id);\n // const duration = SmoMusic.closestVexDuration(smoNote.tickCount);\n for (var i = 0; i < textObj.text.length; i += 1) {\n const { width, height } = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.renderDynamics)(this.context.getContext(), VF.TextDynamics.GLYPHS[textObj.text[i]].code, textObj.fontSize, x, y);\n /* const { width , height } = renderDynamics(this.context.getContext(), VF.TextDynamics.GLYPHS[textObj.text[i]],\n textObj.fontSize, x, y); */\n x += width;\n maxh = Math.max(height, maxh);\n }\n textObj.logicalBox = _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.boxPoints(minx, y + this.context.box.y, x - minx, maxh);\n textObj.element = group;\n this.modifiersToBox.push(textObj);\n this.context.getContext().closeGroup();\n }\n renderDynamics() {\n this.smoMeasure.voices.forEach((voice) => {\n voice.notes.forEach((smoNote) => {\n const mods = smoNote.textModifiers.filter((mod) => mod.attrs.type === 'SmoDynamicText');\n mods.forEach((btm) => {\n const tm = btm;\n this.renderNoteGlyph(smoNote, tm);\n });\n });\n });\n }\n createRepeatSymbol() {\n this.voiceNotes = [];\n // const vexNote = new VF.GlyphNote('\\uE500', { duration: 'w' }, { line: 2 });\n const vexNote = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getRepeatBar)();\n vexNote.setCenterAlignment(true);\n this.vexNotes.push(vexNote);\n this.voiceNotes.push(vexNote);\n }\n /**\n * create an a array of VF.StaveNote objects to render the active voice.\n * @param voiceIx\n */\n createVexNotes(voiceIx) {\n let i = 0;\n this.voiceNotes = [];\n const voice = this.smoMeasure.voices[voiceIx];\n let clefNoteAdded = false;\n for (i = 0; i < voice.notes.length; ++i) {\n const smoNote = voice.notes[i];\n const textNotes = smoNote.getTextOrnaments();\n const vexNote = this.createVexNote(smoNote, i, voiceIx);\n this.noteToVexMap[smoNote.attrs.id] = vexNote.noteData.staveNote;\n this.vexNotes.push(vexNote.noteData.staveNote);\n if (vexNote.noteData.smoNote.clefNote && !clefNoteAdded) {\n const cf = new VF.ClefNote(vexNote.noteData.smoNote.clefNote.clef, 'small');\n this.voiceNotes.push(cf);\n clefNoteAdded = true; // ignore 2nd in a measure\n }\n this.voiceNotes.push(vexNote.noteData.staveNote);\n textNotes.forEach((tn) => {\n this.voiceNotes.push((0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createTextNote)(_smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_5__.SmoOrnament.textNoteOrnaments[tn.ornament]));\n });\n if (isNaN(smoNote.ticks.numerator) || isNaN(smoNote.ticks.denominator)\n || isNaN(smoNote.ticks.remainder)) {\n throw ('vxMeasure: NaN in ticks');\n }\n }\n }\n /**\n * Group the notes for beaming and create Vex beam objects\n * @param vix - voice index\n * @returns\n */\n createVexBeamGroups(vix) {\n let keyNoteIx = -1;\n let i = 0;\n let j = 0;\n let stemDirection = VF.Stem.DOWN;\n for (i = 0; i < this.smoMeasure.beamGroups.length; ++i) {\n const bg = this.smoMeasure.beamGroups[i];\n if (bg.voice !== vix) {\n continue;\n }\n const vexNotes = [];\n keyNoteIx = bg.notes.findIndex((nn) => nn.noteType === 'n');\n // Fix stem bug: key off first non-rest note.\n keyNoteIx = (keyNoteIx >= 0) ? keyNoteIx : 0;\n for (j = 0; j < bg.notes.length; ++j) {\n const note = bg.notes[j];\n if (note.noteType === '/') {\n continue;\n }\n const vexNote = this.noteToVexMap[note.attrs.id];\n // some type of redraw condition?\n if (!(vexNote instanceof VF.StaveNote || vexNote instanceof VF.GraceNote)) {\n return;\n }\n if (note.tickCount >= 4096 || vexNote.getIntrinsicTicks() >= 4096) {\n console.warn('bad length in beam group');\n return;\n }\n if (keyNoteIx === j) {\n stemDirection = note.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.auto ?\n vexNote.getStemDirection() : (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexStemDirection)(note);\n }\n vexNote.setStemDirection(stemDirection);\n vexNotes.push(vexNote);\n }\n const vexBeam = new VF.Beam(vexNotes);\n vexBeam.breakSecondaryAt(bg.secondaryBeamBreaks);\n this.beamToVexMap[bg.attrs.id] = vexBeam;\n this.vexBeamGroups.push(vexBeam);\n }\n }\n createVexTuplets(vix) {\n this.vexTuplets = [];\n this.tupletToVexMap = {};\n for (let i = 0; i < this.smoMeasure.tupletTrees.length; ++i) {\n const tupletTree = this.smoMeasure.tupletTrees[i];\n if (tupletTree.voice !== vix) {\n continue;\n }\n const traverseTupletTree = (parentTuplet) => {\n const vexNotes = [];\n for (let smoNote of this.smoMeasure.tupletNotes(parentTuplet)) {\n vexNotes.push(this.noteToVexMap[smoNote.attrs.id]);\n }\n // If the tuplet has been deleted, the measure might not be updated.\n if (vexNotes.length < 2) {\n return;\n }\n const location = this.smoMeasure.getStemDirectionForTuplet(parentTuplet) === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.up ?\n VF.Tuplet.LOCATION_TOP : VF.Tuplet.LOCATION_BOTTOM;\n const smoTupletParams = {\n vexNotes,\n numNotes: parentTuplet.numNotes,\n notesOccupied: parentTuplet.notesOccupied,\n ratioed: parentTuplet.ratioed,\n bracketed: parentTuplet.bracketed,\n location\n };\n const vexTuplet = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getVexTuplets)(smoTupletParams);\n this.tupletToVexMap[parentTuplet.attrs.id] = vexTuplet;\n this.vexTuplets.push(vexTuplet);\n for (let i = 0; i < parentTuplet.childrenTuplets.length; i++) {\n const tuplet = parentTuplet.childrenTuplets[i];\n traverseTupletTree(tuplet);\n }\n };\n traverseTupletTree(tupletTree.tuplet);\n }\n }\n /**\n * create the modifiers for the stave itself, bar lines etc.\n */\n createMeasureModifiers() {\n const sb = this.smoMeasure.getStartBarline();\n const eb = this.smoMeasure.getEndBarline();\n const sym = this.smoMeasure.getRepeatSymbol();\n if (!this.stave) {\n return;\n }\n // don't create a begin bar for any but the 1st measure.\n if (this.smoMeasure.measureNumber.systemIndex !== 0 && sb.barline === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoBarline.barlines.singleBar\n && this.smoMeasure.format.padLeft === 0) {\n this.stave.setBegBarType(VF.Barline.type.NONE);\n }\n else {\n this.stave.setBegBarType((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexBarlineType)(sb));\n }\n if (this.smoMeasure.svg.multimeasureLength > 0 && !this.smoMeasure.svg.hideMultimeasure) {\n this.stave.setEndBarType(_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.vexBarlineType[this.smoMeasure.svg.multimeasureEndBarline]);\n }\n else if (eb.barline !== _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoBarline.barlines.singleBar) {\n this.stave.setEndBarType((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexBarlineType)(eb));\n }\n if (sym && sym.symbol !== _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoRepeatSymbol.symbols.None) {\n const rep = new VF.Repetition((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexSymbol)(sym), sym.xOffset + this.smoMeasure.staffX, sym.yOffset);\n this.stave.getModifiers().push(rep);\n }\n const tms = this.smoMeasure.getMeasureText();\n // TODO: set font\n tms.forEach((tmb) => {\n var _a;\n const tm = tmb;\n const offset = tm.position === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoMeasureText.positions.left ? this.smoMeasure.format.padLeft : 0;\n const staveText = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createStaveText)(tm.text, (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexTextPosition)(tm), {\n shiftX: tm.adjustX + offset, shiftY: tm.adjustY, justification: (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexTextJustification)(tm)\n });\n (_a = this.stave) === null || _a === void 0 ? void 0 : _a.addModifier(staveText);\n // hack - we can't create staveText directly so this is the only way I could set the font\n const ar = this.stave.getModifiers();\n const vm = ar[ar.length - 1];\n vm.setFont(tm.fontInfo);\n });\n if (this.smoMeasure.svg.rowInSystem === 0) {\n const rmb = this.smoMeasure.getRehearsalMark();\n const rm = rmb;\n if (rm) {\n this.stave.setSection(rm.symbol, 0);\n }\n }\n const tempo = this.smoMeasure.getTempo();\n if (tempo && this.smoMeasure.svg.forceTempo) {\n this.stave.setTempo(tempo.toVexTempo(), -1 * tempo.yOffset);\n const vexTempo = this.stave.getModifiers().find((mod) => mod.getAttribute('type') === 'StaveTempo');\n if (vexTempo) {\n vexTempo.setFont({ family: _styles_font_metrics_ssp_serif_metrics__WEBPACK_IMPORTED_MODULE_4__.SourceSerifProFont.fontFamily, size: 13, weight: 'bold' });\n }\n }\n }\n /**\n * Create all Vex notes and modifiers. We defer the format and rendering so\n * we can align across multiple staves\n */\n preFormat() {\n var _a;\n var j = 0;\n if (this.smoMeasure.svg.element !== null) {\n this.smoMeasure.svg.element.remove();\n this.smoMeasure.svg.element = null;\n if (this.smoMeasure.svg.tabElement) {\n this.smoMeasure.svg.tabElement.remove();\n this.smoMeasure.svg.tabElement = undefined;\n }\n }\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n // Note: need to do this to get it into VEX KS format\n const staffX = this.smoMeasure.staffX + this.smoMeasure.format.padLeft;\n const staffY = this.smoMeasure.staffY - this.context.box.y;\n const key = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySignatureTranspose(this.smoMeasure.keySignature, 0);\n const canceledKey = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySignatureTranspose(this.smoMeasure.canceledKeySignature, 0);\n const smoVexStaveParams = {\n x: staffX,\n y: staffY,\n padLeft: this.smoMeasure.format.padLeft,\n id: this.smoMeasure.id,\n staffX: this.smoMeasure.staffX,\n staffY: this.smoMeasure.staffY,\n staffWidth: this.smoMeasure.staffWidth,\n forceClef: this.smoMeasure.svg.forceClef,\n clef: this.smoMeasure.clef,\n forceKey: this.smoMeasure.svg.forceKeySignature,\n key,\n canceledKey,\n startX: this.smoMeasure.svg.maxColumnStartX,\n adjX: this.smoMeasure.svg.adjX,\n lines: this.smoMeasure.lines,\n context: this.context.getContext()\n };\n this.stave = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createStave)(smoVexStaveParams);\n if (this.smoMeasure.svg.forceTimeSignature) {\n const ts = this.smoMeasure.timeSignature;\n let tsString = ts.timeSignature;\n if (this.smoMeasure.timeSignature.useSymbol && ts.actualBeats === 4 && ts.beatDuration === 4) {\n tsString = 'C';\n }\n else if (this.smoMeasure.timeSignature.useSymbol && ts.actualBeats === 2 && ts.beatDuration === 4) {\n tsString = 'C|';\n }\n else if (this.smoMeasure.timeSignature.displayString.length) {\n tsString = this.smoMeasure.timeSignature.displayString;\n }\n this.stave.addTimeSignature(tsString);\n }\n // Connect it to the rendering context and draw!\n this.stave.setContext(this.context.getContext());\n if (this.smoTabStave && ((_a = this.smoMeasure.svg.tabStaveBox) === null || _a === void 0 ? void 0 : _a.width)) {\n const box = this.smoMeasure.svg.tabStaveBox;\n let tabWidth = 0;\n box.y -= this.context.box.y;\n box.x = staffX - this.context.box.x;\n box.width = this.smoMeasure.staffWidth;\n this.tabStave = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createTabStave)(box, this.smoTabStave.spacing, this.smoTabStave.numLines);\n if (this.smoMeasure.svg.forceClef) {\n this.tabStave.addTabGlyph();\n tabWidth = _glyphDimensions__WEBPACK_IMPORTED_MODULE_11__.vexGlyph.dimensions['tab'].width;\n }\n this.tabStave.setNoteStartX(this.tabStave.getNoteStartX() + this.smoMeasure.svg.adjX - tabWidth);\n this.tabStave.setContext(this.context.getContext());\n }\n this.createMeasureModifiers();\n this.tickmapObject = this.smoMeasure.createMeasureTickmaps();\n this.createCollisionTickmap();\n this.voiceAr = [];\n this.vexNotes = [];\n this.noteToVexMap = {};\n // If there are multiple voices, add them all to the formatter at the same time so they don't collide\n for (j = 0; j < this.smoMeasure.voices.length; ++j) {\n const smoVexVoiceParams = {\n actualBeats: this.smoMeasure.timeSignature.actualBeats,\n beatDuration: this.smoMeasure.timeSignature.beatDuration,\n notes: this.vexNotes\n };\n if (!this.smoMeasure.svg.multimeasureLength && !this.smoMeasure.repeatSymbol) {\n this.createVexNotes(j);\n smoVexVoiceParams.notes = this.voiceNotes;\n this.createVexTuplets(j);\n this.createVexBeamGroups(j);\n // Create a voice in 4/4 and add above notes\n const voice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)(smoVexVoiceParams);\n this.voiceAr.push(voice);\n }\n if (this.smoMeasure.repeatSymbol) {\n this.createRepeatSymbol();\n // Create a voice in 4/4 and add above notes\n const voice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)(smoVexVoiceParams);\n this.voiceAr.push(voice);\n }\n }\n // Need to format for x position, then set y position before drawing dynamics.\n this.formatter = new VF.Formatter({ softmaxFactor: this.softmax, globalSoftmax: false });\n this.formatter.joinVoices(this.voiceAr);\n if (this.tabStave) {\n this.tabVoice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)({\n actualBeats: this.smoMeasure.timeSignature.actualBeats,\n beatDuration: this.smoMeasure.timeSignature.beatDuration,\n notes: this.tabNotes\n });\n this.formatter.joinVoices([this.tabVoice]);\n }\n }\n /**\n * Create the Vex formatter that calculates the X and Y positions of the notes. A formatter\n * may actually span multiple staves for justified staves. The notes are drawn in their\n * individual vxMeasure objects but formatting is done once for all justified staves\n * @param voices Voice objects from VexFlow\n * @returns\n */\n format(voices) {\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n if (this.smoMeasure.svg.multimeasureLength > 0) {\n this.multimeasureRest = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getMultimeasureRest)(this.smoMeasure.svg.multimeasureLength);\n this.multimeasureRest.setContext(this.context.getContext());\n this.multimeasureRest.setStave(this.stave);\n return;\n }\n if (!this.formatter) {\n return;\n }\n const timestamp = new Date().valueOf();\n const staffWidth = this.smoMeasure.staffWidth -\n (this.smoMeasure.svg.maxColumnStartX + this.smoMeasure.svg.adjRight + this.smoMeasure.format.padLeft) - 10;\n this.dbgLeftX = this.smoMeasure.staffX + this.smoMeasure.format.padLeft + this.smoMeasure.svg.adjX;\n this.dbgWidth = staffWidth;\n this.formatter.format(voices, staffWidth);\n if (this.tabVoice && this.tabNotes.length) {\n this.formatter.format([this.tabVoice], staffWidth);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.FORMAT, new Date().valueOf() - timestamp);\n }\n /**\n * render is called after format. Actually draw the things.\n */\n render() {\n var _a;\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n var group = this.context.getContext().openGroup();\n var mmClass = this.smoMeasure.getClassId();\n var j = 0;\n try {\n // bound each measure in its own SVG group for easy deletion and mapping to screen coordinate\n group.classList.add(this.smoMeasure.id);\n group.classList.add(mmClass);\n group.id = this.smoMeasure.id;\n this.stave.draw();\n this.smoMeasure.svg.element = group;\n for (j = 0; j < this.voiceAr.length; ++j) {\n this.voiceAr[j].draw(this.context.getContext(), this.stave);\n }\n this.vexBeamGroups.forEach((b) => {\n b.setContext(this.context.getContext()).draw();\n });\n this.vexTuplets.forEach((tuplet) => {\n tuplet.setContext(this.context.getContext()).draw();\n });\n if (this.multimeasureRest) {\n this.multimeasureRest.draw();\n }\n // this._updateLyricDomSelectors();\n this.renderDynamics();\n // this.smoMeasure.adjX = this.stave.start_x - (this.smoMeasure.staffX);\n this.context.getContext().closeGroup();\n if (this.tabStave) {\n const tabStaveId = `${this.smoMeasure.id}-tab`;\n const tabGroup = this.context.getContext().openGroup();\n tabGroup.classList.add(tabStaveId);\n this.tabStave.draw();\n (_a = this.tabVoice) === null || _a === void 0 ? void 0 : _a.draw(this.context.getContext(), this.tabStave);\n this.context.getContext().closeGroup();\n this.smoMeasure.svg.tabElement = tabGroup;\n }\n // layoutDebug.setTimestamp(layoutDebug.codeRegions.RENDER, new Date().valueOf() - timestamp);\n this.rendered = true;\n if (_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.mask & _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.values['adjust']) {\n _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.debugBoxNoText(this.context.getContext().svg, _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.boxPoints(this.dbgLeftX, this.smoMeasure.svg.staffY, this.dbgWidth, 40), 'render-x-dbg', 0);\n }\n }\n catch (exc) {\n console.warn('unable to render measure ' + this.smoMeasure.measureNumber.measureIndex);\n this.context.getContext().closeGroup();\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxFQUFFLENBQUM7Z0JBQ3BELHVEQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUN2RCx1REFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkUsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2RixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvcmVuZGVyL3ZleC92eE1lYXN1cmUudHM/Y2MxMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuLy8gIyMgRGVzY3JpcHRpb246XHJcbi8vIFRoaXMgZmlsZSBjYWxscyB0aGUgdmV4ZmxvdyByb3V0aW5lcyB0aGF0IGFjdHVhbGx5IHJlbmRlciBhXHJcbi8vIG1lYXN1cmUgb2YgbXVzaWMuICBJZiBtdWx0aXBsZSBtZWFzdXJlcyBhcmUganVzdGlmaWVkIGluIGFcclxuLy8gY29sdW1uLCB0aGUgcmVuZGVyaW5nIGlzIGRlZmVycmVkIHVudGlsIGFsbCB0aGUgbWVhc3VyZXMgaGF2ZSBiZWVuXHJcbi8vIHByZWZvcm1hdHRlZC5cclxuaW1wb3J0IHsgU21vTm90ZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL25vdGUnO1xyXG5pbXBvcnQgeyBTbW9NdXNpYyB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL211c2ljJztcclxuaW1wb3J0IHsgbGF5b3V0RGVidWcgfSBmcm9tICcuLi9zdWkvbGF5b3V0RGVidWcnO1xyXG5pbXBvcnQgeyBTbW9SZXBlYXRTeW1ib2wsIFNtb01lYXN1cmVUZXh0LCBTbW9CYXJsaW5lLCBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlLCBTbW9SZWhlYXJzYWxNYXJrIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNvdXJjZVNlcmlmUHJvRm9udCB9IGZyb20gJy4uLy4uL3N0eWxlcy9mb250X21ldHJpY3Mvc3NwLXNlcmlmLW1ldHJpY3MnO1xyXG5pbXBvcnQgeyBTbW9Pcm5hbWVudCwgU21vRHluYW1pY1RleHQsIFxyXG4gIFNtb05vdGVNb2RpZmllckJhc2UsIFNtb1RhYk5vdGUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9ub3RlTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgU21vU2VsZWN0aW9uIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL3NlbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBTbW9NZWFzdXJlLCBNZWFzdXJlVGlja21hcHMgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tZWFzdXJlJztcclxuaW1wb3J0IHsgU3ZnSGVscGVycyB9IGZyb20gJy4uL3N1aS9zdmdIZWxwZXJzJztcclxuaW1wb3J0IHsgQ2xlZiwgSXNDbGVmLCBFbGVtZW50TGlrZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL2NvbW1vbic7XHJcbmltcG9ydCB7IFN2Z1BhZ2UgfSBmcm9tICcuLi9zdWkvc3ZnUGFnZU1hcCc7XHJcbmltcG9ydCB7IFNtb1RhYlN0YXZlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc3RhZmZNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyB0b1ZleEJhcmxpbmVUeXBlLCB2ZXhCYXJsaW5lVHlwZSwgdmV4QmFybGluZVBvc2l0aW9uLCB0b1ZleEJhcmxpbmVQb3NpdGlvbiwgdG9WZXhTeW1ib2wsXHJcbiAgdG9WZXhUZXh0SnVzdGlmaWNhdGlvbiwgdG9WZXhUZXh0UG9zaXRpb24sIGdldFZleENob3JkQmxvY2tzLCB0b1ZleFN0ZW1EaXJlY3Rpb24sXHJcbiAgVmV4VGFiTm90ZVBvc2l0aW9ucyB9IGZyb20gJy4vc21vQWRhcHRlcic7XHJcbmltcG9ydCB7IFZleEZsb3csIFN0YXZlLFN0ZW1tYWJsZU5vdGUsIE5vdGUsIEJlYW0sIFR1cGxldCwgVm9pY2UsXHJcbiAgRm9ybWF0dGVyLCBBY2NpZGVudGFsLCBBbm5vdGF0aW9uLCBTdGF2ZU5vdGVTdHJ1Y3QsIFN0YXZlVGV4dCwgU3RhdmVNb2RpZmllcixcclxuICBjcmVhdGVTdGF2ZVRleHQsIHJlbmRlckR5bmFtaWNzLCBhcHBseVN0ZW1EaXJlY3Rpb24sXHJcbiAgZ2V0VmV4Tm90ZVBhcmFtZXRlcnMsIGRlZmF1bHROb3RlU2NhbGUsIGRlZmF1bHRDdWVTY2FsZSwgZ2V0VmV4VHVwbGV0cyxcclxuICBjcmVhdGVTdGF2ZSwgY3JlYXRlVm9pY2UsIGdldE9ybmFtZW50R2x5cGgsIGdldFNsYXNoR2x5cGgsIGdldFJlcGVhdEJhciwgZ2V0TXVsdGltZWFzdXJlUmVzdCxcclxuICBjcmVhdGVUZXh0Tm90ZSwgVGFiU3RhdmUsIGNyZWF0ZVRhYlN0YXZlLCBUYWJOb3RlUG9zaXRpb24sIFRhYk5vdGVTdHJ1Y3QsXHJcbiAgQ3JlYXRlVmV4Tm90ZVBhcmFtcywgVGFiTm90ZSwgUGVkYWxNYXJraW5nXHJcbiAgIH0gZnJvbSAnLi4vLi4vY29tbW9uL3ZleCc7XHJcblxyXG5pbXBvcnQgeyBWeE1lYXN1cmVJZiwgVmV4Tm90ZU1vZGlmaWVySWYsIFZ4Tm90ZSB9IGZyb20gJy4vdnhOb3RlJztcclxuaW1wb3J0IHsgU21vVHVwbGV0IH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvdHVwbGV0JztcclxuaW1wb3J0IHsgdmV4R2x5cGggfSBmcm9tICcuL2dseXBoRGltZW5zaW9ucyc7XHJcbmNvbnN0IFZGID0gVmV4RmxvdztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuLy8gY29uc3QgVkYgPSBldmFsKCdWZXguRmxvdycpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgVmV4RmxvdyBsaWJyYXJ5IHRoYXQgYWN0dWFsbHkgZG9lcyB0aGUgZW5ncmF2aW5nLlxyXG4gKiBAY2F0ZWdvcnkgU3VpUmVuZGVyXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVnhNZWFzdXJlIGltcGxlbWVudHMgVnhNZWFzdXJlSWYge1xyXG4gIGNvbnRleHQ6IFN2Z1BhZ2U7XHJcbiAgcHJpbnRpbmc6IGJvb2xlYW47XHJcbiAgc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb247XHJcbiAgc29mdG1heDogbnVtYmVyO1xyXG4gIHNtb01lYXN1cmU6IFNtb01lYXN1cmU7XHJcbiAgc21vVGFiU3RhdmU/OiBTbW9UYWJTdGF2ZTtcclxuICB0YWJTdGF2ZT86IFRhYlN0YXZlO1xyXG4gIHJlbmRlcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbm90ZVRvVmV4TWFwOiBSZWNvcmQ8c3RyaW5nLCBOb3RlPiA9IHt9O1xyXG4gIGJlYW1Ub1ZleE1hcDogUmVjb3JkPHN0cmluZywgQmVhbT4gPSB7fTtcclxuICB0dXBsZXRUb1ZleE1hcDogUmVjb3JkPHN0cmluZywgVHVwbGV0PiA9IHt9O1xyXG4gIG11bHRpbWVhc3VyZVJlc3Q6IGFueSB8IG51bGwgPSBudWxsO1xyXG4gIHZleE5vdGVzOiBOb3RlW10gPSBbXTtcclxuICB2ZXhCZWFtR3JvdXBzOiBCZWFtW10gPSBbXTtcclxuICB2ZXhUdXBsZXRzOiBUdXBsZXRbXSA9IFtdO1xyXG4gIHRpY2ttYXBPYmplY3Q6IE1lYXN1cmVUaWNrbWFwcyB8IG51bGwgPSBudWxsO1xyXG4gIHN0YXZlOiBTdGF2ZSB8IG51bGwgPSBudWxsOyAvLyB2ZXggc3RhdmVcclxuICB2b2ljZU5vdGVzOiBOb3RlW10gPSBbXTsgLy8gbm90ZXMgZm9yIGN1cnJlbnQgdm9pY2UsIGFzIHJlbmRlcmluZ1xyXG4gIHRhYk5vdGVzOiBOb3RlW10gPSBbXTtcclxuICB2b2ljZUFyOiBWb2ljZVtdID0gW107XHJcbiAgdGFiVm9pY2U6IFZvaWNlIHwgbnVsbCA9IG51bGw7XHJcbiAgZm9ybWF0dGVyOiBGb3JtYXR0ZXIgfCBudWxsID0gbnVsbDtcclxuICBhbGxDdWVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbW9kaWZpZXJzVG9Cb3g6IFNtb05vdGVNb2RpZmllckJhc2VbXSA9IFtdO1xyXG4gIGNvbGxpc2lvbk1hcDogUmVjb3JkPG51bWJlciwgU21vTm90ZVtdPiA9IHt9O1xyXG4gIGRiZ0xlZnRYOiBudW1iZXIgPSAwO1xyXG4gIGRiZ1dpZHRoOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBTdmdQYWdlLCBzZWxlY3Rpb246IFNtb1NlbGVjdGlvbiwgcHJpbnRpbmc6IGJvb2xlYW4sIHNvZnRtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMucmVuZGVyZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xyXG4gICAgdGhpcy5zbW9NZWFzdXJlID0gdGhpcy5zZWxlY3Rpb24ubWVhc3VyZTtcclxuICAgIHRoaXMucHJpbnRpbmcgPSBwcmludGluZztcclxuICAgIHRoaXMuYWxsQ3VlcyA9IHNlbGVjdGlvbi5zdGFmZi5wYXJ0SW5mby5kaXNwbGF5Q3VlcztcclxuICAgIHRoaXMudHVwbGV0VG9WZXhNYXAgPSB7fTtcclxuICAgIHRoaXMudmV4Tm90ZXMgPSBbXTtcclxuICAgIHRoaXMudmV4QmVhbUdyb3VwcyA9IFtdO1xyXG4gICAgdGhpcy52ZXhCZWFtR3JvdXBzID0gW107XHJcbiAgICB0aGlzLmJlYW1Ub1ZleE1hcCA9IHt9O1xyXG4gICAgdGhpcy5zb2Z0bWF4ID0gc29mdG1heDtcclxuICAgIHRoaXMuc21vVGFiU3RhdmUgPSBzZWxlY3Rpb24uc3RhZmYuZ2V0VGFiU3RhdmVGb3JNZWFzdXJlKHNlbGVjdGlvbi5zZWxlY3Rvcik7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IGZpbGxTdHlsZSgpIHtcclxuICAgIHJldHVybiAnIzAwMCc7XHJcbiAgfVxyXG4gIC8vIFRyZWF0IGEgcmVzdCBsaWtlIGEgd2hvbGUgcmVzdCBpZiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHJlc3QgaW4gdGhlIG1lYXN1cmVcclxuICAvLyBhbmQgdGhlIG1lYXN1cmUgbGVuZ3RoIGlzIG5vdCBhIHBpY2t1cFxyXG4gIGlzV2hvbGVSZXN0KCkge1xyXG4gICAgcmV0dXJuICh0aGlzLnNtb01lYXN1cmUudm9pY2VzLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICB0aGlzLnNtb01lYXN1cmUudm9pY2VzWzBdLm5vdGVzLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICB0aGlzLnNtb01lYXN1cmUudm9pY2VzWzBdLm5vdGVzWzBdLmlzUmVzdCgpICYmXHJcbiAgICAgIHRoaXMuc21vTWVhc3VyZS5nZXRNYXhUaWNrc1ZvaWNlKCkgPiA0MDk2XHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIGNyZWF0ZUNvbGxpc2lvblRpY2ttYXAoKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBpZiAoIXRoaXMudGlja21hcE9iamVjdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zbW9NZWFzdXJlLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB0bSA9IHRoaXMudGlja21hcE9iamVjdC50aWNrbWFwc1tpXTtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IHRtLmR1cmF0aW9uTWFwLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0aGlzLmNvbGxpc2lvbk1hcFt0bS5kdXJhdGlvbk1hcFtqXV0pID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgdGhpcy5jb2xsaXNpb25NYXBbdG0uZHVyYXRpb25NYXBbal1dID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29sbGlzaW9uTWFwW3RtLmR1cmF0aW9uTWFwW2pdXS5wdXNoKHRoaXMuc21vTWVhc3VyZS52b2ljZXNbaV0ubm90ZXNbal0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlzQ29sbGlzaW9uKHZvaWNlSXg6IG51bWJlciwgdGlja0l4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBqID0gMDtcclxuICAgIGxldCBrID0gMDtcclxuICAgIGxldCBzdGFmZkxpbmVzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgaWYgKCF0aGlzLnRpY2ttYXBPYmplY3QpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGljayA9IHRoaXMudGlja21hcE9iamVjdC50aWNrbWFwc1t2b2ljZUl4XS5kdXJhdGlvbk1hcFt0aWNrSXhdO1xyXG4gICAgLy8gSnVzdCBvbmUgbm90ZSwgbm8gY29sbGlzaW9uXHJcbiAgICBpZiAodGhpcy5jb2xsaXNpb25NYXBbdGlja10ubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jb2xsaXNpb25NYXBbdGlja10ubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgbm90ZSA9IHRoaXMuY29sbGlzaW9uTWFwW3RpY2tdW2ldO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgbm90ZS5waXRjaGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3QgY2xlZjogQ2xlZiA9IElzQ2xlZihub3RlLmNsZWYpID8gbm90ZS5jbGVmIDogJ3RyZWJsZSc7XHJcbiAgICAgICAgY29uc3QgcGl0Y2ggPSBub3RlLnBpdGNoZXNbal07XHJcbiAgICAgICAgY29uc3QgY3VyTGluZSA9IFNtb011c2ljLnBpdGNoVG9TdGFmZkxpbmUoY2xlZiwgcGl0Y2gpO1xyXG4gICAgICAgIGZvciAoayA9IDA7ayA8IHN0YWZmTGluZXMubGVuZ3RoOyArK2spIHtcclxuICAgICAgICAgIGlmIChNYXRoLmFicyhjdXJMaW5lIC0gc3RhZmZMaW5lc1trXSkgPCAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzdGFmZkxpbmVzLnB1c2goY3VyTGluZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNvbnZlcnQgYSBzbW9Ob3RlIGludG8gYSB2eE5vdGUgc28gaXQgY2FuIGJlIHJhc3Rlcml6ZWRcclxuICAgKiBAcGFyYW0gc21vTm90ZSBcclxuICAgKiBAcGFyYW0gdGlja0luZGV4IC0gdXNlZCB0byBjYWxjdWxhdGUgYWNjaWRlbnRhbFxyXG4gICAqIEBwYXJhbSB2b2ljZUl4IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGNyZWF0ZVZleE5vdGUoc21vTm90ZTogU21vTm90ZSwgdGlja0luZGV4OiBudW1iZXIsIHZvaWNlSXg6IG51bWJlcikge1xyXG4gICAgbGV0IHZleE5vdGU6IE5vdGUgfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBzbW9UYWJOb3RlOiBTbW9UYWJOb3RlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBsZXQgdGltZXN0YW1wID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XHJcbiAgICBjb25zdCBzdGVtVGlja3MgPSBTbW9NdXNpYy50aWNrc1RvRHVyYXRpb25bc21vTm90ZS5zdGVtVGlja3NdO1xyXG4gICAgbGV0IHRhYk5vdGU6IFN0ZW1tYWJsZU5vdGUgfCBudWxsID0gbnVsbDtcclxuICAgIGNvbnN0IG5vdGVIZWFkID0gc21vTm90ZS5pc1Jlc3QoKSA/ICdyJyA6IHNtb05vdGUubm90ZUhlYWQ7XHJcbiAgICBjb25zdCBrZXlzID0gU21vTXVzaWMuc21vUGl0Y2hlc1RvVmV4S2V5cyhzbW9Ob3RlLnBpdGNoZXMsIDAsIG5vdGVIZWFkKTtcclxuICAgIGNvbnN0IHNtb05vdGVQYXJhbXMgPSB7XHJcbiAgICAgIGlzVHVwbGV0OiBzbW9Ob3RlLmlzVHVwbGV0LFxyXG4gICAgICBtZWFzdXJlSW5kZXg6IHRoaXMuc21vTWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCxcclxuICAgICAgY2xlZjogc21vTm90ZS5jbGVmLFxyXG4gICAgICBzdGVtVGlja3MsXHJcbiAgICAgIGtleXMsXHJcbiAgICAgIG5vdGVUeXBlOiBzbW9Ob3RlLm5vdGVUeXBlLFxyXG4gICAgICBpc0N1ZTogc21vTm90ZS5pc0N1ZVxyXG4gICAgfTtcclxuICAgIGNvbnN0IHsgbm90ZVBhcmFtcywgZHVyYXRpb24gfSA9IGdldFZleE5vdGVQYXJhbWV0ZXJzKHNtb05vdGVQYXJhbXMpO1xyXG4gICAgaWYgKHRoaXMudGFiU3RhdmUgJiYgdGhpcy5zbW9UYWJTdGF2ZSkge1xyXG4gICAgICBzbW9UYWJOb3RlID0gdGhpcy5zbW9UYWJTdGF2ZS5nZXRUYWJOb3RlRnJvbU5vdGUoc21vTm90ZSwgdGhpcy5zbW9NZWFzdXJlLnRyYW5zcG9zZUluZGV4KTtcclxuICAgICAgaWYgKHNtb1RhYk5vdGUpIHtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbnM6IFRhYk5vdGVQb3NpdGlvbltdID0gVmV4VGFiTm90ZVBvc2l0aW9ucyh0aGlzLnNtb1RhYlN0YXZlLCBzbW9UYWJOb3RlLCBzbW9Ob3RlKTtcclxuICAgICAgICBpZiAocG9zaXRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgaWYgKCFzbW9Ob3RlLmlzUmVzdCgpKSB7XHJcbiAgICAgICAgICAgIHRhYk5vdGUgPSBuZXcgVkYuVGFiTm90ZSh7IHBvc2l0aW9ucywgZHVyYXRpb246IGR1cmF0aW9uIH0pO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zbW9UYWJTdGF2ZS5zaG93U3RlbXMpIHtcclxuICAgICAgICAgICAgICB0YWJOb3RlLnJlbmRlcl9vcHRpb25zLmRyYXdfc3RlbSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGFiTm90ZS5yZW5kZXJfb3B0aW9ucy5kcmF3X2RvdHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRhYk5vdGUucmVuZGVyX29wdGlvbnMuZHJhd19zdGVtX3Rocm91Z2hfc3RhdmUgPSBzbW9UYWJOb3RlLmZsYWdUaHJvdWdoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0YWJOb3RlID0gbmV3IFZGLlN0YXZlTm90ZShub3RlUGFyYW1zKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChzbW9Ob3RlLm5vdGVUeXBlID09PSAnLycpIHtcclxuICAgICAgLy8gdmV4Tm90ZSA9IG5ldyBWRi5HbHlwaE5vdGUoJ1xcdUU1MDQnLCB7IGR1cmF0aW9uIH0pO1xyXG4gICAgICB2ZXhOb3RlID0gZ2V0U2xhc2hHbHlwaCgpO1xyXG4gICAgICBzbW9Ob3RlLnJlbmRlcklkID0gJ3ZmLScgKyB2ZXhOb3RlLmdldEF0dHJpYnV0ZSgnaWQnKTsgLy8gd2hlcmUgZG9lcyAndmYnIGNvbWUgZnJvbT9cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHNtb1ZleFN0ZW1QYXJhbXMgPSB7XHJcbiAgICAgICAgdm9pY2VDb3VudDogdGhpcy5zbW9NZWFzdXJlLnZvaWNlcy5sZW5ndGgsXHJcbiAgICAgICAgdm9pY2VJeCxcclxuICAgICAgICBpc0F1dG86IHNtb05vdGUuZmxhZ1N0YXRlID09PSBTbW9Ob3RlLmZsYWdTdGF0ZXMuYXV0byxcclxuICAgICAgICBpc1VwOiBzbW9Ob3RlLmZsYWdTdGF0ZSA9PT0gU21vTm90ZS5mbGFnU3RhdGVzLnVwXHJcbiAgICAgIH1cclxuICAgICAgYXBwbHlTdGVtRGlyZWN0aW9uKHNtb1ZleFN0ZW1QYXJhbXMsIG5vdGVQYXJhbXMpO1xyXG4gICAgICBpZiAoc21vVGFiTm90ZSAmJiB0YWJOb3RlKSB7XHJcbiAgICAgICAgdGFiTm90ZS5zZXRTdGVtRGlyZWN0aW9uKG5vdGVQYXJhbXMuc3RlbV9kaXJlY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICAgIGxheW91dERlYnVnLnNldFRpbWVzdGFtcChsYXlvdXREZWJ1Zy5jb2RlUmVnaW9ucy5QUkVGT1JNQVRBLCBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHRpbWVzdGFtcCk7XHJcbiAgICAgIHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudmFsdWVPZigpO1xyXG4gICAgICB2ZXhOb3RlID0gbmV3IFZGLlN0YXZlTm90ZShub3RlUGFyYW1zKTtcclxuICAgICAgaWYgKHZvaWNlSXggPiAwICYmIHRoaXMuaXNDb2xsaXNpb24odm9pY2VJeCwgdGlja0luZGV4KSkge1xyXG4gICAgICAgIHZleE5vdGUuc2V0WFNoaWZ0KC0xMCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuaXNXaG9sZVJlc3QoKSkge1xyXG4gICAgICAgIG5vdGVQYXJhbXMuZHVyYXRpb24gPSAnd3InO1xyXG4gICAgICAgIHZleE5vdGUgPSBuZXcgVkYuU3RhdmVOb3RlKG5vdGVQYXJhbXMpO1xyXG4gICAgICAgIHZleE5vdGUuc2V0Q2VudGVyQWxpZ25tZW50KHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGxheW91dERlYnVnLnNldFRpbWVzdGFtcChsYXlvdXREZWJ1Zy5jb2RlUmVnaW9ucy5QUkVGT1JNQVRCLCBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHRpbWVzdGFtcCk7XHJcbiAgICAgIHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudmFsdWVPZigpO1xyXG4gICAgICBpZiAoc21vTm90ZS5maWxsU3R5bGUgJiYgIXRoaXMucHJpbnRpbmcpIHtcclxuICAgICAgICB2ZXhOb3RlLnNldFN0eWxlKHsgZmlsbFN0eWxlOiBzbW9Ob3RlLmZpbGxTdHlsZSB9KTtcclxuICAgICAgfSBlbHNlIGlmICh2b2ljZUl4ID4gMCAmJiAhdGhpcy5wcmludGluZykge1xyXG4gICAgICAgIHZleE5vdGUuc2V0U3R5bGUoeyBmaWxsU3R5bGU6IFwiIzExNTUxMVwiIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKHNtb05vdGUuaXNIaWRkZW4oKSAmJiB0aGlzLnByaW50aW5nKSB7XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRTdHlsZSh7IGZpbGxTdHlsZTogXCIjZmZmZmZmMDBcIiB9KTtcclxuICAgICAgfVxyXG4gICAgICBzbW9Ob3RlLnJlbmRlcklkID0gJ3ZmLScgKyB2ZXhOb3RlLmdldEF0dHJpYnV0ZSgnaWQnKTsgLy8gd2hlcmUgZG9lcyAndmYnIGNvbWUgZnJvbT9cclxuICAgICAgaWYgKHRoaXMuc3RhdmUpIHtcclxuICAgICAgICB2ZXhOb3RlLnNldFN0YXZlKHRoaXMuc3RhdmUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBub3RlRGF0YTogVmV4Tm90ZU1vZGlmaWVySWYgPSB7XHJcbiAgICAgIHNtb01lYXN1cmU6IHRoaXMuc21vTWVhc3VyZSxcclxuICAgICAgdnhNZWFzdXJlOiB0aGlzLFxyXG4gICAgICBzbW9Ob3RlOiBzbW9Ob3RlLFxyXG4gICAgICBzdGF2ZU5vdGU6IHZleE5vdGUsXHJcbiAgICAgIHZvaWNlSW5kZXg6IHZvaWNlSXgsXHJcbiAgICAgIHRpY2tJbmRleDogdGlja0luZGV4XHJcbiAgICB9XHJcbiAgICBpZiAodGFiTm90ZSkge1xyXG4gICAgICBub3RlRGF0YS50YWJOb3RlID0gdGFiTm90ZTtcclxuICAgICAgdGhpcy50YWJOb3Rlcy5wdXNoKHRhYk5vdGUpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbW9kT2JqID0gbmV3IFZ4Tm90ZShub3RlRGF0YSk7XHJcbiAgICBtb2RPYmouYWRkTW9kaWZpZXJzKCk7XHJcbiAgICBsYXlvdXREZWJ1Zy5zZXRUaW1lc3RhbXAobGF5b3V0RGVidWcuY29kZVJlZ2lvbnMuUFJFRk9STUFUQywgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSB0aW1lc3RhbXApO1xyXG5cclxuICAgIHJldHVybiBtb2RPYmo7XHJcbiAgfVxyXG5cclxuICByZW5kZXJOb3RlR2x5cGgoc21vTm90ZTogU21vTm90ZSwgdGV4dE9iajogU21vRHluYW1pY1RleHQpIHtcclxuICAgIHZhciB4ID0gdGhpcy5ub3RlVG9WZXhNYXBbc21vTm90ZS5hdHRycy5pZF0uZ2V0QWJzb2x1dGVYKCkgKyB0ZXh0T2JqLnhPZmZzZXQ7XHJcbiAgICAvLyB0aGUgLTMgaXMgY29waWVkIGZyb20gdmV4ZmxvdyB0ZXh0RHluYW1pY3NcclxuICAgIHZhciB5ID0gdGhpcy5zdGF2ZSEuZ2V0WUZvckxpbmUodGV4dE9iai55T2Zmc2V0TGluZSAtIDMpICsgdGV4dE9iai55T2Zmc2V0UGl4ZWxzO1xyXG4gICAgbGV0IG1heGggPSAwO1xyXG4gICAgY29uc3QgbWlueCA9IHg7XHJcbiAgICB2YXIgZ3JvdXA6IEVsZW1lbnRMaWtlID0gdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5vcGVuR3JvdXAoKTtcclxuICAgIGdyb3VwLmNsYXNzTGlzdC5hZGQodGV4dE9iai5hdHRycy5pZCArICctJyArIHNtb05vdGUuYXR0cnMuaWQpO1xyXG4gICAgZ3JvdXAuY2xhc3NMaXN0LmFkZCh0ZXh0T2JqLmF0dHJzLmlkKTtcclxuICAgIC8vIGNvbnN0IGR1cmF0aW9uID0gU21vTXVzaWMuY2xvc2VzdFZleER1cmF0aW9uKHNtb05vdGUudGlja0NvdW50KTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dE9iai50ZXh0Lmxlbmd0aDsgaSArPSAxICkge1xyXG4gICAgICBjb25zdCB7IHdpZHRoICwgaGVpZ2h0IH0gPSByZW5kZXJEeW5hbWljcyh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLCBWRi5UZXh0RHluYW1pY3MuR0xZUEhTW3RleHRPYmoudGV4dFtpXV0uY29kZSxcclxuICAgICAgICB0ZXh0T2JqLmZvbnRTaXplLCB4LCB5KTtcclxuICAgICAgLyogY29uc3QgeyB3aWR0aCAsIGhlaWdodCB9ID0gcmVuZGVyRHluYW1pY3ModGhpcy5jb250ZXh0LmdldENvbnRleHQoKSwgVkYuVGV4dER5bmFtaWNzLkdMWVBIU1t0ZXh0T2JqLnRleHRbaV1dLFxyXG4gICAgICAgIHRleHRPYmouZm9udFNpemUsIHgsIHkpOyAqL1xyXG4gICAgICB4ICs9IHdpZHRoO1xyXG4gICAgICBtYXhoID0gTWF0aC5tYXgoaGVpZ2h0LCBtYXhoKTsgICAgICBcclxuICAgIH1cclxuICAgIHRleHRPYmoubG9naWNhbEJveCA9IFN2Z0hlbHBlcnMuYm94UG9pbnRzKG1pbngsIHkgKyB0aGlzLmNvbnRleHQuYm94LnksIHggLSBtaW54LCBtYXhoKTtcclxuICAgIHRleHRPYmouZWxlbWVudCA9IGdyb3VwO1xyXG4gICAgdGhpcy5tb2RpZmllcnNUb0JveC5wdXNoKHRleHRPYmopO1xyXG4gICAgdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5jbG9zZUdyb3VwKCk7XHJcbiAgfVxyXG5cclxuICByZW5kZXJEeW5hbWljcygpIHtcclxuICAgIHRoaXMuc21vTWVhc3VyZS52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgoc21vTm90ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1vZHMgPSBzbW9Ob3RlLnRleHRNb2RpZmllcnMuZmlsdGVyKChtb2QpID0+XHJcbiAgICAgICAgICBtb2QuYXR0cnMudHlwZSA9PT0gJ1Ntb0R5bmFtaWNUZXh0J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgbW9kcy5mb3JFYWNoKChidG0pID0+IHtcclxuICAgICAgICAgIGNvbnN0IHRtID0gYnRtIGFzIFNtb0R5bmFtaWNUZXh0O1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJOb3RlR2x5cGgoc21vTm90ZSwgdG0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBjcmVhdGVSZXBlYXRTeW1ib2woKSB7XHJcbiAgICB0aGlzLnZvaWNlTm90ZXMgPSBbXTtcclxuICAgIC8vIGNvbnN0IHZleE5vdGUgPSBuZXcgVkYuR2x5cGhOb3RlKCdcXHVFNTAwJywgeyBkdXJhdGlvbjogJ3cnIH0sIHsgbGluZTogMiB9KTtcclxuICAgIGNvbnN0IHZleE5vdGUgPSBnZXRSZXBlYXRCYXIoKTtcclxuICAgIHZleE5vdGUuc2V0Q2VudGVyQWxpZ25tZW50KHRydWUpO1xyXG4gICAgdGhpcy52ZXhOb3Rlcy5wdXNoKHZleE5vdGUpO1xyXG4gICAgdGhpcy52b2ljZU5vdGVzLnB1c2godmV4Tm90ZSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGNyZWF0ZSBhbiBhIGFycmF5IG9mIFZGLlN0YXZlTm90ZSBvYmplY3RzIHRvIHJlbmRlciB0aGUgYWN0aXZlIHZvaWNlLlxyXG4gICAqIEBwYXJhbSB2b2ljZUl4IFxyXG4gICAqL1xyXG4gIGNyZWF0ZVZleE5vdGVzKHZvaWNlSXg6IG51bWJlcikge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgdGhpcy52b2ljZU5vdGVzID0gW107XHJcbiAgICBjb25zdCB2b2ljZSA9IHRoaXMuc21vTWVhc3VyZS52b2ljZXNbdm9pY2VJeF07XHJcbiAgICBsZXQgY2xlZk5vdGVBZGRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGZvciAoaSA9IDA7XHJcbiAgICAgIGkgPCB2b2ljZS5ub3Rlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBzbW9Ob3RlID0gdm9pY2Uubm90ZXNbaV07XHJcbiAgICAgIGNvbnN0IHRleHROb3RlcyA9IHNtb05vdGUuZ2V0VGV4dE9ybmFtZW50cygpO1xyXG4gICAgICBjb25zdCB2ZXhOb3RlID0gdGhpcy5jcmVhdGVWZXhOb3RlKHNtb05vdGUsIGksIHZvaWNlSXgpO1xyXG4gICAgICB0aGlzLm5vdGVUb1ZleE1hcFtzbW9Ob3RlLmF0dHJzLmlkXSA9IHZleE5vdGUubm90ZURhdGEuc3RhdmVOb3RlO1xyXG4gICAgICB0aGlzLnZleE5vdGVzLnB1c2godmV4Tm90ZS5ub3RlRGF0YS5zdGF2ZU5vdGUpO1xyXG5cclxuICAgICAgaWYgKHZleE5vdGUubm90ZURhdGEuc21vTm90ZS5jbGVmTm90ZSAmJiAhY2xlZk5vdGVBZGRlZCkge1xyXG4gICAgICAgIGNvbnN0IGNmID0gbmV3IFZGLkNsZWZOb3RlKHZleE5vdGUubm90ZURhdGEuc21vTm90ZS5jbGVmTm90ZS5jbGVmLCAnc21hbGwnKTtcclxuICAgICAgICB0aGlzLnZvaWNlTm90ZXMucHVzaChjZik7XHJcbiAgICAgICAgY2xlZk5vdGVBZGRlZCA9IHRydWU7IC8vIGlnbm9yZSAybmQgaW4gYSBtZWFzdXJlXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy52b2ljZU5vdGVzLnB1c2godmV4Tm90ZS5ub3RlRGF0YS5zdGF2ZU5vdGUpO1xyXG4gICAgICB0ZXh0Tm90ZXMuZm9yRWFjaCgodG4pID0+IHtcclxuICAgICAgICB0aGlzLnZvaWNlTm90ZXMucHVzaChjcmVhdGVUZXh0Tm90ZShTbW9Pcm5hbWVudC50ZXh0Tm90ZU9ybmFtZW50c1t0bi5vcm5hbWVudF0pKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChpc05hTihzbW9Ob3RlLnRpY2tzLm51bWVyYXRvcikgfHwgaXNOYU4oc21vTm90ZS50aWNrcy5kZW5vbWluYXRvcilcclxuICAgICAgICB8fCBpc05hTihzbW9Ob3RlLnRpY2tzLnJlbWFpbmRlcikpIHtcclxuICAgICAgICB0aHJvdyAoJ3Z4TWVhc3VyZTogTmFOIGluIHRpY2tzJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdyb3VwIHRoZSBub3RlcyBmb3IgYmVhbWluZyBhbmQgY3JlYXRlIFZleCBiZWFtIG9iamVjdHNcclxuICAgKiBAcGFyYW0gdml4IC0gdm9pY2UgaW5kZXhcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBjcmVhdGVWZXhCZWFtR3JvdXBzKHZpeDogbnVtYmVyKSB7XHJcbiAgICBsZXQga2V5Tm90ZUl4ID0gLTE7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBsZXQgc3RlbURpcmVjdGlvbiA9IFZGLlN0ZW0uRE9XTjtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNtb01lYXN1cmUuYmVhbUdyb3Vwcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBiZyA9IHRoaXMuc21vTWVhc3VyZS5iZWFtR3JvdXBzW2ldO1xyXG4gICAgICBpZiAoYmcudm9pY2UgIT09IHZpeCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZleE5vdGVzOiBTdGVtbWFibGVOb3RlW10gPSBbXTtcclxuICAgICAga2V5Tm90ZUl4ID0gYmcubm90ZXMuZmluZEluZGV4KChubikgPT4gbm4ubm90ZVR5cGUgPT09ICduJyk7XHJcblxyXG4gICAgICAvLyBGaXggc3RlbSBidWc6IGtleSBvZmYgZmlyc3Qgbm9uLXJlc3Qgbm90ZS5cclxuICAgICAga2V5Tm90ZUl4ID0gKGtleU5vdGVJeCA+PSAwKSA/IGtleU5vdGVJeCA6IDA7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBiZy5ub3Rlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGNvbnN0IG5vdGUgPSBiZy5ub3Rlc1tqXTtcclxuICAgICAgICBpZiAobm90ZS5ub3RlVHlwZSA9PT0gJy8nKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmV4Tm90ZSA9IHRoaXMubm90ZVRvVmV4TWFwW25vdGUuYXR0cnMuaWRdO1xyXG4gICAgICAgIC8vIHNvbWUgdHlwZSBvZiByZWRyYXcgY29uZGl0aW9uP1xyXG4gICAgICAgIGlmICghKHZleE5vdGUgaW5zdGFuY2VvZiBWRi5TdGF2ZU5vdGUgfHwgdmV4Tm90ZSBpbnN0YW5jZW9mIFZGLkdyYWNlTm90ZSkpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5vdGUudGlja0NvdW50ID49IDQwOTYgfHwgdmV4Tm90ZS5nZXRJbnRyaW5zaWNUaWNrcygpID49IDQwOTYpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybignYmFkIGxlbmd0aCBpbiBiZWFtIGdyb3VwJyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChrZXlOb3RlSXggPT09IGopIHtcclxuICAgICAgICAgIHN0ZW1EaXJlY3Rpb24gPSBub3RlLmZsYWdTdGF0ZSA9PT0gU21vTm90ZS5mbGFnU3RhdGVzLmF1dG8gP1xyXG4gICAgICAgICAgICB2ZXhOb3RlLmdldFN0ZW1EaXJlY3Rpb24oKSA6IHRvVmV4U3RlbURpcmVjdGlvbihub3RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRTdGVtRGlyZWN0aW9uKHN0ZW1EaXJlY3Rpb24pO1xyXG4gICAgICAgIHZleE5vdGVzLnB1c2godmV4Tm90ZSk7ICBcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB2ZXhCZWFtID0gbmV3IFZGLkJlYW0odmV4Tm90ZXMpO1xyXG4gICAgICB2ZXhCZWFtLmJyZWFrU2Vjb25kYXJ5QXQoYmcuc2Vjb25kYXJ5QmVhbUJyZWFrcyk7XHJcbiAgICAgIHRoaXMuYmVhbVRvVmV4TWFwW2JnLmF0dHJzLmlkXSA9IHZleEJlYW07XHJcbiAgICAgIHRoaXMudmV4QmVhbUdyb3Vwcy5wdXNoKHZleEJlYW0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlVmV4VHVwbGV0cyh2aXg6IG51bWJlcikge1xyXG4gICAgdGhpcy52ZXhUdXBsZXRzID0gW107XHJcbiAgICB0aGlzLnR1cGxldFRvVmV4TWFwID0ge307XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc21vTWVhc3VyZS50dXBsZXRUcmVlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB0dXBsZXRUcmVlID0gdGhpcy5zbW9NZWFzdXJlLnR1cGxldFRyZWVzW2ldO1xyXG4gICAgICBpZiAodHVwbGV0VHJlZS52b2ljZSAhPT0gdml4KSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdHJhdmVyc2VUdXBsZXRUcmVlID0gKCBwYXJlbnRUdXBsZXQ6IFNtb1R1cGxldCk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZleE5vdGVzOiBOb3RlW10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBzbW9Ob3RlIG9mIHRoaXMuc21vTWVhc3VyZS50dXBsZXROb3RlcyhwYXJlbnRUdXBsZXQpKSB7XHJcbiAgICAgICAgICB2ZXhOb3Rlcy5wdXNoKHRoaXMubm90ZVRvVmV4TWFwW3Ntb05vdGUuYXR0cnMuaWRdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgdGhlIHR1cGxldCBoYXMgYmVlbiBkZWxldGVkLCB0aGUgbWVhc3VyZSBtaWdodCBub3QgYmUgdXBkYXRlZC5cclxuICAgICAgICBpZiAodmV4Tm90ZXMubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuc21vTWVhc3VyZS5nZXRTdGVtRGlyZWN0aW9uRm9yVHVwbGV0KHBhcmVudFR1cGxldCkgPT09IFNtb05vdGUuZmxhZ1N0YXRlcy51cCA/XHJcbiAgICAgICAgICBWRi5UdXBsZXQuTE9DQVRJT05fVE9QIDogVkYuVHVwbGV0LkxPQ0FUSU9OX0JPVFRPTTtcclxuICAgICAgICBjb25zdCBzbW9UdXBsZXRQYXJhbXMgPSB7XHJcbiAgICAgICAgICB2ZXhOb3RlcyxcclxuICAgICAgICAgIG51bU5vdGVzOiBwYXJlbnRUdXBsZXQubnVtTm90ZXMsXHJcbiAgICAgICAgICBub3Rlc09jY3VwaWVkOiBwYXJlbnRUdXBsZXQubm90ZXNPY2N1cGllZCxcclxuICAgICAgICAgIHJhdGlvZWQ6IHBhcmVudFR1cGxldC5yYXRpb2VkLFxyXG4gICAgICAgICAgYnJhY2tldGVkOiBwYXJlbnRUdXBsZXQuYnJhY2tldGVkLFxyXG4gICAgICAgICAgbG9jYXRpb25cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmV4VHVwbGV0ID0gZ2V0VmV4VHVwbGV0cyhzbW9UdXBsZXRQYXJhbXMpO1xyXG5cclxuICAgICAgICB0aGlzLnR1cGxldFRvVmV4TWFwW3BhcmVudFR1cGxldC5hdHRycy5pZF0gPSB2ZXhUdXBsZXQ7XHJcbiAgICAgICAgdGhpcy52ZXhUdXBsZXRzLnB1c2godmV4VHVwbGV0KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmVudFR1cGxldC5jaGlsZHJlblR1cGxldHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHR1cGxldCA9IHBhcmVudFR1cGxldC5jaGlsZHJlblR1cGxldHNbaV07XHJcbiAgICAgICAgICB0cmF2ZXJzZVR1cGxldFRyZWUodHVwbGV0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdHJhdmVyc2VUdXBsZXRUcmVlKHR1cGxldFRyZWUudHVwbGV0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNyZWF0ZSB0aGUgbW9kaWZpZXJzIGZvciB0aGUgc3RhdmUgaXRzZWxmLCBiYXIgbGluZXMgZXRjLlxyXG4gICAqL1xyXG4gIGNyZWF0ZU1lYXN1cmVNb2RpZmllcnMoKSB7XHJcbiAgICBjb25zdCBzYiA9IHRoaXMuc21vTWVhc3VyZS5nZXRTdGFydEJhcmxpbmUoKTtcclxuICAgIGNvbnN0IGViID0gdGhpcy5zbW9NZWFzdXJlLmdldEVuZEJhcmxpbmUoKTtcclxuICAgIGNvbnN0IHN5bSA9IHRoaXMuc21vTWVhc3VyZS5nZXRSZXBlYXRTeW1ib2woKTtcclxuICAgIGlmICghdGhpcy5zdGF2ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZG9uJ3QgY3JlYXRlIGEgYmVnaW4gYmFyIGZvciBhbnkgYnV0IHRoZSAxc3QgbWVhc3VyZS5cclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUubWVhc3VyZU51bWJlci5zeXN0ZW1JbmRleCAhPT0gMCAmJiBzYi5iYXJsaW5lID09PSBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhclxyXG4gICAgICAmJiB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQgPT09IDApIHtcclxuICAgICAgdGhpcy5zdGF2ZS5zZXRCZWdCYXJUeXBlKFZGLkJhcmxpbmUudHlwZS5OT05FKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhdmUuc2V0QmVnQmFyVHlwZSh0b1ZleEJhcmxpbmVUeXBlKHNiKSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5tdWx0aW1lYXN1cmVMZW5ndGggPiAwICYmICF0aGlzLnNtb01lYXN1cmUuc3ZnLmhpZGVNdWx0aW1lYXN1cmUpIHtcclxuICAgICAgdGhpcy5zdGF2ZS5zZXRFbmRCYXJUeXBlKHZleEJhcmxpbmVUeXBlW3RoaXMuc21vTWVhc3VyZS5zdmcubXVsdGltZWFzdXJlRW5kQmFybGluZV0pO1xyXG4gICAgfSBlbHNlIGlmIChlYi5iYXJsaW5lICE9PSBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhcikge1xyXG4gICAgICB0aGlzLnN0YXZlLnNldEVuZEJhclR5cGUodG9WZXhCYXJsaW5lVHlwZShlYikpO1xyXG4gICAgfVxyXG4gICAgaWYgKHN5bSAmJiBzeW0uc3ltYm9sICE9PSBTbW9SZXBlYXRTeW1ib2wuc3ltYm9scy5Ob25lKSB7XHJcbiAgICAgIGNvbnN0IHJlcCA9IG5ldyBWRi5SZXBldGl0aW9uKHRvVmV4U3ltYm9sKHN5bSksIHN5bS54T2Zmc2V0ICsgdGhpcy5zbW9NZWFzdXJlLnN0YWZmWCwgc3ltLnlPZmZzZXQpO1xyXG4gICAgICB0aGlzLnN0YXZlLmdldE1vZGlmaWVycygpLnB1c2gocmVwKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRtcyA9IHRoaXMuc21vTWVhc3VyZS5nZXRNZWFzdXJlVGV4dCgpO1xyXG4gICAgLy8gVE9ETzogc2V0IGZvbnRcclxuICAgIHRtcy5mb3JFYWNoKCh0bWI6IFNtb01lYXN1cmVNb2RpZmllckJhc2UpID0+IHtcclxuICAgICAgY29uc3QgdG0gPSB0bWIgYXMgU21vTWVhc3VyZVRleHQ7XHJcbiAgICAgIGNvbnN0IG9mZnNldCA9IHRtLnBvc2l0aW9uID09PSBTbW9NZWFzdXJlVGV4dC5wb3NpdGlvbnMubGVmdCA/IHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdCA6IDA7XHJcbiAgICAgIGNvbnN0IHN0YXZlVGV4dCA9IGNyZWF0ZVN0YXZlVGV4dCh0bS50ZXh0LCB0b1ZleFRleHRQb3NpdGlvbih0bSksIFxyXG4gICAgICB7XHJcbiAgICAgICAgc2hpZnRYOiB0bS5hZGp1c3RYICsgb2Zmc2V0LCBzaGlmdFk6IHRtLmFkanVzdFksIGp1c3RpZmljYXRpb246IHRvVmV4VGV4dEp1c3RpZmljYXRpb24odG0pXHJcbiAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdGF2ZT8uYWRkTW9kaWZpZXIoc3RhdmVUZXh0KTtcclxuXHJcbiAgICAgIC8vIGhhY2sgLSB3ZSBjYW4ndCBjcmVhdGUgc3RhdmVUZXh0IGRpcmVjdGx5IHNvIHRoaXMgaXMgdGhlIG9ubHkgd2F5IEkgY291bGQgc2V0IHRoZSBmb250XHJcbiAgICAgIGNvbnN0IGFyID0gdGhpcy5zdGF2ZSEuZ2V0TW9kaWZpZXJzKCk7XHJcbiAgICAgIGNvbnN0IHZtID0gYXJbYXIubGVuZ3RoIC0gMV07XHJcbiAgICAgIHZtLnNldEZvbnQodG0uZm9udEluZm8pO1xyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5yb3dJblN5c3RlbSA9PT0gMCkge1xyXG4gICAgICBjb25zdCBybWIgPSB0aGlzLnNtb01lYXN1cmUuZ2V0UmVoZWFyc2FsTWFyaygpO1xyXG4gICAgICBjb25zdCBybSA9IHJtYiBhcyBTbW9SZWhlYXJzYWxNYXJrO1xyXG4gICAgICBpZiAocm0pIHtcclxuICAgICAgICB0aGlzLnN0YXZlLnNldFNlY3Rpb24ocm0uc3ltYm9sLCAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRlbXBvID0gdGhpcy5zbW9NZWFzdXJlLmdldFRlbXBvKCk7XHJcbiAgICBpZiAodGVtcG8gJiYgdGhpcy5zbW9NZWFzdXJlLnN2Zy5mb3JjZVRlbXBvKSB7XHJcbiAgICAgIHRoaXMuc3RhdmUuc2V0VGVtcG8odGVtcG8udG9WZXhUZW1wbygpLCAtMSAqIHRlbXBvLnlPZmZzZXQpO1xyXG4gICAgICBjb25zdCB2ZXhUZW1wbyA9IHRoaXMuc3RhdmUuZ2V0TW9kaWZpZXJzKCkuZmluZCgobW9kOiBTdGF2ZU1vZGlmaWVyKSA9PiBtb2QuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdTdGF2ZVRlbXBvJyk7XHJcbiAgICAgIGlmICh2ZXhUZW1wbykge1xyXG4gICAgICAgIHZleFRlbXBvLnNldEZvbnQoeyBmYW1pbHk6IFNvdXJjZVNlcmlmUHJvRm9udC5mb250RmFtaWx5LCBzaXplOiAxMywgd2VpZ2h0OiAnYm9sZCcgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbGwgVmV4IG5vdGVzIGFuZCBtb2RpZmllcnMuICBXZSBkZWZlciB0aGUgZm9ybWF0IGFuZCByZW5kZXJpbmcgc29cclxuICAgKiB3ZSBjYW4gYWxpZ24gYWNyb3NzIG11bHRpcGxlIHN0YXZlc1xyXG4gICAqL1xyXG4gIHByZUZvcm1hdCgpIHtcclxuICAgIHZhciBqID0gMDtcclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLmVsZW1lbnQgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy5lbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgICB0aGlzLnNtb01lYXN1cmUuc3ZnLmVsZW1lbnQgPSBudWxsO1xyXG4gICAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy50YWJFbGVtZW50KSB7XHJcbiAgICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy50YWJFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcudGFiRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcuaGlkZUVtcHR5TWVhc3VyZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBOb3RlOiBuZWVkIHRvIGRvIHRoaXMgdG8gZ2V0IGl0IGludG8gVkVYIEtTIGZvcm1hdFxyXG4gICAgY29uc3Qgc3RhZmZYID0gdGhpcy5zbW9NZWFzdXJlLnN0YWZmWCArIHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdDtcclxuICAgIGNvbnN0IHN0YWZmWSA9IHRoaXMuc21vTWVhc3VyZS5zdGFmZlkgLSB0aGlzLmNvbnRleHQuYm94Lnk7XHJcbiAgICBjb25zdCBrZXkgPSBTbW9NdXNpYy52ZXhLZXlTaWduYXR1cmVUcmFuc3Bvc2UodGhpcy5zbW9NZWFzdXJlLmtleVNpZ25hdHVyZSwgMCk7XHJcbiAgICBjb25zdCBjYW5jZWxlZEtleSA9IFNtb011c2ljLnZleEtleVNpZ25hdHVyZVRyYW5zcG9zZSh0aGlzLnNtb01lYXN1cmUuY2FuY2VsZWRLZXlTaWduYXR1cmUsIDApO1xyXG4gICAgY29uc3Qgc21vVmV4U3RhdmVQYXJhbXMgPSB7XHJcbiAgICAgIHg6IHN0YWZmWCxcclxuICAgICAgeTogc3RhZmZZLFxyXG4gICAgICBwYWRMZWZ0OiB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQsXHJcbiAgICAgIGlkOiB0aGlzLnNtb01lYXN1cmUuaWQsXHJcbiAgICAgIHN0YWZmWDogdGhpcy5zbW9NZWFzdXJlLnN0YWZmWCxcclxuICAgICAgc3RhZmZZOiB0aGlzLnNtb01lYXN1cmUuc3RhZmZZLFxyXG4gICAgICBzdGFmZldpZHRoOiB0aGlzLnNtb01lYXN1cmUuc3RhZmZXaWR0aCxcclxuICAgICAgZm9yY2VDbGVmOiB0aGlzLnNtb01lYXN1cmUuc3ZnLmZvcmNlQ2xlZixcclxuICAgICAgY2xlZjogdGhpcy5zbW9NZWFzdXJlLmNsZWYsXHJcbiAgICAgIGZvcmNlS2V5OiB0aGlzLnNtb01lYXN1cmUuc3ZnLmZvcmNlS2V5U2lnbmF0dXJlLFxyXG4gICAgICBrZXksXHJcbiAgICAgIGNhbmNlbGVkS2V5LFxyXG4gICAgICBzdGFydFg6IHRoaXMuc21vTWVhc3VyZS5zdmcubWF4Q29sdW1uU3RhcnRYLFxyXG4gICAgICBhZGpYOiB0aGlzLnNtb01lYXN1cmUuc3ZnLmFkalgsXHJcbiAgICAgIGxpbmVzOiB0aGlzLnNtb01lYXN1cmUubGluZXMsXHJcbiAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dC5nZXRDb250ZXh0KClcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdmUgPSBjcmVhdGVTdGF2ZShzbW9WZXhTdGF2ZVBhcmFtcyk7XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5mb3JjZVRpbWVTaWduYXR1cmUpIHtcclxuICAgICAgY29uc3QgdHMgPSB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZTtcclxuICAgICAgbGV0IHRzU3RyaW5nID0gdHMudGltZVNpZ25hdHVyZTtcclxuICAgICAgaWYgKHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLnVzZVN5bWJvbCAmJiB0cy5hY3R1YWxCZWF0cyA9PT0gNCAmJiB0cy5iZWF0RHVyYXRpb24gPT09IDQpIHtcclxuICAgICAgICB0c1N0cmluZyA9ICdDJztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS51c2VTeW1ib2wgJiYgdHMuYWN0dWFsQmVhdHMgPT09IDIgJiYgdHMuYmVhdER1cmF0aW9uID09PSA0KSB7XHJcbiAgICAgICAgdHNTdHJpbmcgPSAnQ3wnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLmRpc3BsYXlTdHJpbmcubGVuZ3RoKSB7XHJcbiAgICAgICAgdHNTdHJpbmcgPSB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS5kaXNwbGF5U3RyaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RhdmUuYWRkVGltZVNpZ25hdHVyZSh0c1N0cmluZyk7XHJcbiAgICB9XHJcbiAgICAvLyBDb25uZWN0IGl0IHRvIHRoZSByZW5kZXJpbmcgY29udGV4dCBhbmQgZHJhdyFcclxuICAgIHRoaXMuc3RhdmUuc2V0Q29udGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpKTtcclxuICAgIGlmICh0aGlzLnNtb1RhYlN0YXZlICYmIHRoaXMuc21vTWVhc3VyZS5zdmcudGFiU3RhdmVCb3g/LndpZHRoKSB7XHJcbiAgICAgIGNvbnN0IGJveCA9IHRoaXMuc21vTWVhc3VyZS5zdmcudGFiU3RhdmVCb3g7XHJcbiAgICAgIGxldCB0YWJXaWR0aCA9IDA7XHJcbiAgICAgIGJveC55IC09IHRoaXMuY29udGV4dC5ib3gueTtcclxuICAgICAgYm94LnggPSBzdGFmZlggLSB0aGlzLmNvbnRleHQuYm94Lng7XHJcbiAgICAgIGJveC53aWR0aCA9IHRoaXMuc21vTWVhc3VyZS5zdGFmZldpZHRoO1xyXG4gICAgICB0aGlzLnRhYlN0YXZlID0gY3JlYXRlVGFiU3RhdmUoYm94LCB0aGlzLnNtb1RhYlN0YXZlLnNwYWNpbmcsIHRoaXMuc21vVGFiU3RhdmUubnVtTGluZXMpO1xyXG4gICAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5mb3JjZUNsZWYpIHtcclxuICAgICAgICB0aGlzLnRhYlN0YXZlLmFkZFRhYkdseXBoKCk7XHJcbiAgICAgICAgdGFiV2lkdGggPSB2ZXhHbHlwaC5kaW1lbnNpb25zWyd0YWInXS53aWR0aDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRhYlN0YXZlLnNldE5vdGVTdGFydFgodGhpcy50YWJTdGF2ZS5nZXROb3RlU3RhcnRYKCkgKyB0aGlzLnNtb01lYXN1cmUuc3ZnLmFkalggLSB0YWJXaWR0aCk7XHJcbiAgICAgIHRoaXMudGFiU3RhdmUuc2V0Q29udGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNyZWF0ZU1lYXN1cmVNb2RpZmllcnMoKTtcclxuXHJcbiAgICB0aGlzLnRpY2ttYXBPYmplY3QgPSB0aGlzLnNtb01lYXN1cmUuY3JlYXRlTWVhc3VyZVRpY2ttYXBzKCk7XHJcbiAgICB0aGlzLmNyZWF0ZUNvbGxpc2lvblRpY2ttYXAoKTtcclxuXHJcbiAgICB0aGlzLnZvaWNlQXIgPSBbXTtcclxuICAgIHRoaXMudmV4Tm90ZXMgPSBbXTtcclxuICAgIHRoaXMubm90ZVRvVmV4TWFwID0ge307XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIHZvaWNlcywgYWRkIHRoZW0gYWxsIHRvIHRoZSBmb3JtYXR0ZXIgYXQgdGhlIHNhbWUgdGltZSBzbyB0aGV5IGRvbid0IGNvbGxpZGVcclxuICAgIGZvciAoaiA9IDA7IGogPCB0aGlzLnNtb01lYXN1cmUudm9pY2VzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIGNvbnN0IHNtb1ZleFZvaWNlUGFyYW1zID0ge1xyXG4gICAgICAgIGFjdHVhbEJlYXRzOiB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS5hY3R1YWxCZWF0cyxcclxuICAgICAgICBiZWF0RHVyYXRpb246IHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLmJlYXREdXJhdGlvbixcclxuICAgICAgICBub3RlczogdGhpcy52ZXhOb3Rlc1xyXG4gICAgICB9XHJcbiAgICBpZiAoIXRoaXMuc21vTWVhc3VyZS5zdmcubXVsdGltZWFzdXJlTGVuZ3RoICYmICF0aGlzLnNtb01lYXN1cmUucmVwZWF0U3ltYm9sKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVWZXhOb3RlcyhqKTtcclxuICAgICAgICBzbW9WZXhWb2ljZVBhcmFtcy5ub3RlcyA9IHRoaXMudm9pY2VOb3RlcztcclxuICAgICAgICB0aGlzLmNyZWF0ZVZleFR1cGxldHMoaik7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVWZXhCZWFtR3JvdXBzKGopO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgYSB2b2ljZSBpbiA0LzQgYW5kIGFkZCBhYm92ZSBub3Rlc1xyXG4gICAgICAgIGNvbnN0IHZvaWNlID0gY3JlYXRlVm9pY2Uoc21vVmV4Vm9pY2VQYXJhbXMpO1xyXG4gICAgICAgIHRoaXMudm9pY2VBci5wdXNoKHZvaWNlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnJlcGVhdFN5bWJvbCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlUmVwZWF0U3ltYm9sKCk7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgdm9pY2UgaW4gNC80IGFuZCBhZGQgYWJvdmUgbm90ZXNcclxuICAgICAgICBjb25zdCB2b2ljZSA9IGNyZWF0ZVZvaWNlKHNtb1ZleFZvaWNlUGFyYW1zKTtcclxuICAgICAgICB0aGlzLnZvaWNlQXIucHVzaCh2b2ljZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIE5lZWQgdG8gZm9ybWF0IGZvciB4IHBvc2l0aW9uLCB0aGVuIHNldCB5IHBvc2l0aW9uIGJlZm9yZSBkcmF3aW5nIGR5bmFtaWNzLlxyXG4gICAgdGhpcy5mb3JtYXR0ZXIgPSBuZXcgVkYuRm9ybWF0dGVyKHsgc29mdG1heEZhY3RvcjogdGhpcy5zb2Z0bWF4LCBnbG9iYWxTb2Z0bWF4OiBmYWxzZSB9KTtcclxuICAgIHRoaXMuZm9ybWF0dGVyLmpvaW5Wb2ljZXModGhpcy52b2ljZUFyKTtcclxuICAgIGlmICh0aGlzLnRhYlN0YXZlKSB7XHJcbiAgICAgIHRoaXMudGFiVm9pY2UgPSBjcmVhdGVWb2ljZSh7XHJcbiAgICAgICAgYWN0dWFsQmVhdHM6IHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLmFjdHVhbEJlYXRzLFxyXG4gICAgICAgIGJlYXREdXJhdGlvbjogdGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmUuYmVhdER1cmF0aW9uLFxyXG4gICAgICAgIG5vdGVzOiB0aGlzLnRhYk5vdGVzXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmZvcm1hdHRlci5qb2luVm9pY2VzKFt0aGlzLnRhYlZvaWNlXSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0aGUgVmV4IGZvcm1hdHRlciB0aGF0IGNhbGN1bGF0ZXMgdGhlIFggYW5kIFkgcG9zaXRpb25zIG9mIHRoZSBub3Rlcy4gIEEgZm9ybWF0dGVyXHJcbiAgICogbWF5IGFjdHVhbGx5IHNwYW4gbXVsdGlwbGUgc3RhdmVzIGZvciBqdXN0aWZpZWQgc3RhdmVzLiAgVGhlIG5vdGVzIGFyZSBkcmF3biBpbiB0aGVpclxyXG4gICAqIGluZGl2aWR1YWwgdnhNZWFzdXJlIG9iamVjdHMgYnV0IGZvcm1hdHRpbmcgaXMgZG9uZSBvbmNlIGZvciBhbGwganVzdGlmaWVkIHN0YXZlc1xyXG4gICAqIEBwYXJhbSB2b2ljZXMgVm9pY2Ugb2JqZWN0cyBmcm9tIFZleEZsb3dcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBmb3JtYXQodm9pY2VzOiBWb2ljZVtdKSB7XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5oaWRlRW1wdHlNZWFzdXJlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5tdWx0aW1lYXN1cmVMZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMubXVsdGltZWFzdXJlUmVzdCA9IGdldE11bHRpbWVhc3VyZVJlc3QodGhpcy5zbW9NZWFzdXJlLnN2Zy5tdWx0aW1lYXN1cmVMZW5ndGgpO1xyXG4gICAgICB0aGlzLm11bHRpbWVhc3VyZVJlc3Quc2V0Q29udGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpKTtcclxuICAgICAgdGhpcy5tdWx0aW1lYXN1cmVSZXN0LnNldFN0YXZlKHRoaXMuc3RhdmUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZm9ybWF0dGVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudmFsdWVPZigpO1xyXG4gICAgY29uc3Qgc3RhZmZXaWR0aCA9IHRoaXMuc21vTWVhc3VyZS5zdGFmZldpZHRoIC1cclxuICAgICAgKHRoaXMuc21vTWVhc3VyZS5zdmcubWF4Q29sdW1uU3RhcnRYICsgdGhpcy5zbW9NZWFzdXJlLnN2Zy5hZGpSaWdodCArIHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdCkgLSAxMDtcclxuICAgIHRoaXMuZGJnTGVmdFggPSB0aGlzLnNtb01lYXN1cmUuc3RhZmZYICsgIHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdCArIHRoaXMuc21vTWVhc3VyZS5zdmcuYWRqWDtcclxuICAgIHRoaXMuZGJnV2lkdGggPSBzdGFmZldpZHRoO1xyXG4gICAgdGhpcy5mb3JtYXR0ZXIuZm9ybWF0KHZvaWNlcywgc3RhZmZXaWR0aCk7XHJcbiAgICBpZiAodGhpcy50YWJWb2ljZSAmJiB0aGlzLnRhYk5vdGVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmZvcm1hdHRlci5mb3JtYXQoW3RoaXMudGFiVm9pY2VdLCBzdGFmZldpZHRoKTtcclxuICAgIH1cclxuICAgIGxheW91dERlYnVnLnNldFRpbWVzdGFtcChsYXlvdXREZWJ1Zy5jb2RlUmVnaW9ucy5GT1JNQVQsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGltZXN0YW1wKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogcmVuZGVyIGlzIGNhbGxlZCBhZnRlciBmb3JtYXQuICBBY3R1YWxseSBkcmF3IHRoZSB0aGluZ3MuXHJcbiAgICovXHJcbiAgcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcuaGlkZUVtcHR5TWVhc3VyZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGdyb3VwID0gdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5vcGVuR3JvdXAoKSBhcyBTVkdTVkdFbGVtZW50O1xyXG4gICAgdmFyIG1tQ2xhc3MgPSB0aGlzLnNtb01lYXN1cmUuZ2V0Q2xhc3NJZCgpO1xyXG4gICAgdmFyIGogPSAwO1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gYm91bmQgZWFjaCBtZWFzdXJlIGluIGl0cyBvd24gU1ZHIGdyb3VwIGZvciBlYXN5IGRlbGV0aW9uIGFuZCBtYXBwaW5nIHRvIHNjcmVlbiBjb29yZGluYXRlXHJcbiAgICAgIGdyb3VwLmNsYXNzTGlzdC5hZGQodGhpcy5zbW9NZWFzdXJlLmlkKTtcclxuICAgICAgZ3JvdXAuY2xhc3NMaXN0LmFkZChtbUNsYXNzKTtcclxuICAgICAgZ3JvdXAuaWQgPSB0aGlzLnNtb01lYXN1cmUuaWQ7XHJcbiAgICAgIHRoaXMuc3RhdmUhLmRyYXcoKTtcclxuICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy5lbGVtZW50ID0gZ3JvdXA7XHJcblxyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgdGhpcy52b2ljZUFyLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgdGhpcy52b2ljZUFyW2pdLmRyYXcodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSwgdGhpcy5zdGF2ZSEpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudmV4QmVhbUdyb3Vwcy5mb3JFYWNoKChiKSA9PiB7XHJcbiAgICAgICAgYi5zZXRDb250ZXh0KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkpLmRyYXcoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnZleFR1cGxldHMuZm9yRWFjaCgodHVwbGV0KSA9PiB7XHJcbiAgICAgICAgdHVwbGV0LnNldENvbnRleHQodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSkuZHJhdygpO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKHRoaXMubXVsdGltZWFzdXJlUmVzdCkge1xyXG4gICAgICAgIHRoaXMubXVsdGltZWFzdXJlUmVzdC5kcmF3KCk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5fdXBkYXRlTHlyaWNEb21TZWxlY3RvcnMoKTtcclxuICAgICAgdGhpcy5yZW5kZXJEeW5hbWljcygpO1xyXG4gICAgICAvLyB0aGlzLnNtb01lYXN1cmUuYWRqWCA9IHRoaXMuc3RhdmUuc3RhcnRfeCAtICh0aGlzLnNtb01lYXN1cmUuc3RhZmZYKTtcclxuXHJcbiAgICAgIHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuY2xvc2VHcm91cCgpO1xyXG4gICAgICBpZiAodGhpcy50YWJTdGF2ZSkge1xyXG4gICAgICAgIGNvbnN0IHRhYlN0YXZlSWQgPSBgJHt0aGlzLnNtb01lYXN1cmUuaWR9LXRhYmA7XHJcbiAgICAgICAgY29uc3QgdGFiR3JvdXAgPSB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLm9wZW5Hcm91cCgpIGFzIFNWR1NWR0VsZW1lbnQ7XHJcbiAgICAgICAgdGFiR3JvdXAuY2xhc3NMaXN0LmFkZCh0YWJTdGF2ZUlkKTtcclxuICAgICAgICB0aGlzLnRhYlN0YXZlLmRyYXcoKTtcclxuICAgICAgICB0aGlzLnRhYlZvaWNlPy5kcmF3KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCksIHRoaXMudGFiU3RhdmUpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuY2xvc2VHcm91cCgpO1xyXG4gICAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcudGFiRWxlbWVudCA9IHRhYkdyb3VwO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGxheW91dERlYnVnLnNldFRpbWVzdGFtcChsYXlvdXREZWJ1Zy5jb2RlUmVnaW9ucy5SRU5ERVIsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGltZXN0YW1wKTtcclxuXHJcbiAgICAgIHRoaXMucmVuZGVyZWQgPSB0cnVlO1xyXG4gICAgICBpZiAobGF5b3V0RGVidWcubWFzayAmIGxheW91dERlYnVnLnZhbHVlc1snYWRqdXN0J10pIHtcclxuICAgICAgICBTdmdIZWxwZXJzLmRlYnVnQm94Tm9UZXh0KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuc3ZnLFxyXG4gICAgICAgIFN2Z0hlbHBlcnMuYm94UG9pbnRzKHRoaXMuZGJnTGVmdFgsIFxyXG4gICAgICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy5zdGFmZlksIHRoaXMuZGJnV2lkdGgsIDQwKSwgJ3JlbmRlci14LWRiZycsIDApO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChleGMpIHtcclxuICAgICAgY29uc29sZS53YXJuKCd1bmFibGUgdG8gcmVuZGVyIG1lYXN1cmUgJyArIHRoaXMuc21vTWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCk7XHJcbiAgICAgIHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuY2xvc2VHcm91cCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/render/vex/vxMeasure.ts\n\n}");
470
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VxMeasure: () => (/* binding */ VxMeasure)\n/* harmony export */ });\n/* harmony import */ var _smo_data_note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/note */ \"./src/smo/data/note.ts\");\n/* harmony import */ var _smo_data_music__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../sui/layoutDebug */ \"./src/render/sui/layoutDebug.ts\");\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _styles_font_metrics_ssp_serif_metrics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../styles/font_metrics/ssp-serif-metrics */ \"./src/styles/font_metrics/ssp-serif-metrics.js\");\n/* harmony import */ var _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/data/noteModifiers */ \"./src/smo/data/noteModifiers.ts\");\n/* harmony import */ var _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../smo/data/common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _smoAdapter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./smoAdapter */ \"./src/render/vex/smoAdapter.ts\");\n/* harmony import */ var _common_vex__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../common/vex */ \"./src/common/vex.ts\");\n/* harmony import */ var _vxNote__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./vxNote */ \"./src/render/vex/vxNote.ts\");\n/* harmony import */ var _glyphDimensions__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./glyphDimensions */ \"./src/render/vex/glyphDimensions.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n// ## Description:\n// This file calls the vexflow routines that actually render a\n// measure of music. If multiple measures are justified in a\n// column, the rendering is deferred until all the measures have been\n// preformatted.\n\n\n\n\n\n\n\n\n\n\n\n\nconst VF = _common_vex__WEBPACK_IMPORTED_MODULE_9__.VexFlow;\n// const VF = eval('Vex.Flow');\n/**\n * This is the interface for VexFlow library that actually does the engraving.\n * @category SuiRender\n */\nclass VxMeasure {\n constructor(context, selection, printing, softmax) {\n this.rendered = false;\n this.noteToVexMap = {};\n this.beamToVexMap = {};\n this.tupletToVexMap = {};\n this.multimeasureRest = null;\n this.vexNotes = [];\n this.vexBeamGroups = [];\n this.vexTuplets = [];\n this.tickmapObject = null;\n this.stave = null; // vex stave\n this.voiceNotes = []; // notes for current voice, as rendering\n this.tabNotes = [];\n this.voiceAr = [];\n this.tabVoice = null;\n this.formatter = null;\n this.allCues = false;\n this.modifiersToBox = [];\n this.collisionMap = {};\n this.dbgLeftX = 0;\n this.dbgWidth = 0;\n this.context = context;\n this.rendered = false;\n this.selection = selection;\n this.smoMeasure = this.selection.measure;\n this.printing = printing;\n this.allCues = selection.staff.partInfo.displayCues;\n this.tupletToVexMap = {};\n this.vexNotes = [];\n this.vexBeamGroups = [];\n this.vexBeamGroups = [];\n this.beamToVexMap = {};\n this.softmax = softmax;\n this.smoTabStave = selection.staff.getTabStaveForMeasure(selection.selector);\n }\n static get fillStyle() {\n return '#000';\n }\n // Treat a rest like a whole rest if there is only a single rest in the measure\n // and the measure length is not a pickup\n isWholeRest() {\n return (this.smoMeasure.voices.length === 1 &&\n this.smoMeasure.voices[0].notes.length === 1 &&\n this.smoMeasure.voices[0].notes[0].isRest() &&\n this.smoMeasure.getMaxTicksVoice() > 4096);\n }\n createCollisionTickmap() {\n let i = 0;\n let j = 0;\n if (!this.tickmapObject) {\n return;\n }\n for (i = 0; i < this.smoMeasure.voices.length; ++i) {\n const tm = this.tickmapObject.tickmaps[i];\n for (j = 0; j < tm.durationMap.length; ++j) {\n if (typeof (this.collisionMap[tm.durationMap[j]]) === 'undefined') {\n this.collisionMap[tm.durationMap[j]] = [];\n }\n this.collisionMap[tm.durationMap[j]].push(this.smoMeasure.voices[i].notes[j]);\n }\n }\n }\n isCollision(voiceIx, tickIx) {\n let i = 0;\n let j = 0;\n let k = 0;\n let staffLines = [];\n if (!this.tickmapObject) {\n return false;\n }\n const tick = this.tickmapObject.tickmaps[voiceIx].durationMap[tickIx];\n // Just one note, no collision\n if (this.collisionMap[tick].length < 2) {\n return false;\n }\n for (i = 0; i < this.collisionMap[tick].length; ++i) {\n const note = this.collisionMap[tick][i];\n for (j = 0; j < note.pitches.length; ++j) {\n const clef = (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_7__.IsClef)(note.clef) ? note.clef : 'treble';\n const pitch = note.pitches[j];\n const curLine = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.pitchToStaffLine(clef, pitch);\n for (k = 0; k < staffLines.length; ++k) {\n if (Math.abs(curLine - staffLines[k]) < 1) {\n return true;\n }\n }\n staffLines.push(curLine);\n }\n }\n return false;\n }\n /**\n * convert a smoNote into a vxNote so it can be rasterized\n * @param smoNote\n * @param tickIndex - used to calculate accidental\n * @param voiceIx\n * @returns\n */\n createVexNote(smoNote, tickIndex, voiceIx) {\n let vexNote = null;\n let smoTabNote = null;\n let timestamp = new Date().valueOf();\n const stemTicks = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.ticksToDuration[smoNote.stemTicks];\n let tabNote = null;\n const noteHead = smoNote.isRest() ? 'r' : smoNote.noteHead;\n const keys = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.smoPitchesToVexKeys(smoNote.pitches, 0, noteHead);\n const smoNoteParams = {\n isTuplet: smoNote.isTuplet,\n measureIndex: this.smoMeasure.measureNumber.measureIndex,\n clef: smoNote.clef,\n stemTicks,\n keys,\n noteType: smoNote.noteType,\n isCue: smoNote.isCue\n };\n const { noteParams, duration } = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getVexNoteParameters)(smoNoteParams);\n if (this.tabStave && this.smoTabStave) {\n smoTabNote = this.smoTabStave.getTabNoteFromNote(smoNote, this.smoMeasure.transposeIndex);\n if (smoTabNote) {\n const positions = (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.VexTabNotePositions)(this.smoTabStave, smoTabNote, smoNote);\n if (positions.length) {\n if (!smoNote.isRest()) {\n tabNote = new VF.TabNote({ positions, duration: duration });\n if (this.smoTabStave.showStems) {\n tabNote.render_options.draw_stem = true;\n tabNote.render_options.draw_dots = true;\n tabNote.render_options.draw_stem_through_stave = smoTabNote.flagThrough;\n }\n }\n else {\n tabNote = new VF.StaveNote(noteParams);\n }\n }\n }\n }\n if (smoNote.noteType === '/') {\n // vexNote = new VF.GlyphNote('\\uE504', { duration });\n vexNote = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getSlashGlyph)();\n smoNote.renderId = 'vf-' + vexNote.getAttribute('id'); // where does 'vf' come from?\n }\n else {\n const smoVexStemParams = {\n voiceCount: this.smoMeasure.voices.length,\n voiceIx,\n isAuto: smoNote.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.auto,\n isUp: smoNote.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.up\n };\n (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.applyStemDirection)(smoVexStemParams, noteParams);\n if (smoTabNote && tabNote) {\n tabNote.setStemDirection(noteParams.stem_direction);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATA, new Date().valueOf() - timestamp);\n timestamp = new Date().valueOf();\n vexNote = new VF.StaveNote(noteParams);\n if (voiceIx > 0 && this.isCollision(voiceIx, tickIndex)) {\n vexNote.setXShift(-10);\n }\n if (this.isWholeRest()) {\n noteParams.duration = 'wr';\n vexNote = new VF.StaveNote(noteParams);\n vexNote.setCenterAlignment(true);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATB, new Date().valueOf() - timestamp);\n timestamp = new Date().valueOf();\n if (smoNote.fillStyle && !this.printing) {\n vexNote.setStyle({ fillStyle: smoNote.fillStyle });\n }\n else if (voiceIx > 0 && !this.printing) {\n const voiceFill = ['#115511', '#555511', '#883344'];\n vexNote.setStyle({ fillStyle: voiceFill[voiceIx - 1] });\n }\n else if (smoNote.isHidden() && this.printing) {\n vexNote.setStyle({ fillStyle: \"#ffffff00\" });\n }\n smoNote.renderId = 'vf-' + vexNote.getAttribute('id'); // where does 'vf' come from?\n if (this.stave) {\n vexNote.setStave(this.stave);\n }\n }\n const noteData = {\n smoMeasure: this.smoMeasure,\n vxMeasure: this,\n smoNote: smoNote,\n staveNote: vexNote,\n voiceIndex: voiceIx,\n tickIndex: tickIndex\n };\n if (tabNote) {\n noteData.tabNote = tabNote;\n this.tabNotes.push(tabNote);\n }\n const modObj = new _vxNote__WEBPACK_IMPORTED_MODULE_10__.VxNote(noteData);\n modObj.addModifiers();\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATC, new Date().valueOf() - timestamp);\n return modObj;\n }\n renderNoteGlyph(smoNote, textObj) {\n var x = this.noteToVexMap[smoNote.attrs.id].getAbsoluteX() + textObj.xOffset;\n // the -3 is copied from vexflow textDynamics\n var y = this.stave.getYForLine(textObj.yOffsetLine - 3) + textObj.yOffsetPixels;\n let maxh = 0;\n const minx = x;\n var group = this.context.getContext().openGroup();\n group.classList.add(textObj.attrs.id + '-' + smoNote.attrs.id);\n group.classList.add(textObj.attrs.id);\n // const duration = SmoMusic.closestVexDuration(smoNote.tickCount);\n for (var i = 0; i < textObj.text.length; i += 1) {\n const { width, height } = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.renderDynamics)(this.context.getContext(), VF.TextDynamics.GLYPHS[textObj.text[i]].code, textObj.fontSize, x, y);\n /* const { width , height } = renderDynamics(this.context.getContext(), VF.TextDynamics.GLYPHS[textObj.text[i]],\n textObj.fontSize, x, y); */\n x += width;\n maxh = Math.max(height, maxh);\n }\n textObj.logicalBox = _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.boxPoints(minx, y + this.context.box.y, x - minx, maxh);\n textObj.element = group;\n this.modifiersToBox.push(textObj);\n this.context.getContext().closeGroup();\n }\n renderDynamics() {\n this.smoMeasure.voices.forEach((voice) => {\n voice.notes.forEach((smoNote) => {\n const mods = smoNote.textModifiers.filter((mod) => mod.attrs.type === 'SmoDynamicText');\n mods.forEach((btm) => {\n const tm = btm;\n this.renderNoteGlyph(smoNote, tm);\n });\n });\n });\n }\n createRepeatSymbol() {\n this.voiceNotes = [];\n // const vexNote = new VF.GlyphNote('\\uE500', { duration: 'w' }, { line: 2 });\n const vexNote = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getRepeatBar)();\n vexNote.setCenterAlignment(true);\n this.vexNotes.push(vexNote);\n this.voiceNotes.push(vexNote);\n }\n /**\n * create an a array of VF.StaveNote objects to render the active voice.\n * @param voiceIx\n */\n createVexNotes(voiceIx) {\n let i = 0;\n this.voiceNotes = [];\n const voice = this.smoMeasure.voices[voiceIx];\n let clefNoteAdded = false;\n for (i = 0; i < voice.notes.length; ++i) {\n const smoNote = voice.notes[i];\n const textNotes = smoNote.getTextOrnaments();\n const vexNote = this.createVexNote(smoNote, i, voiceIx);\n this.noteToVexMap[smoNote.attrs.id] = vexNote.noteData.staveNote;\n this.vexNotes.push(vexNote.noteData.staveNote);\n if (vexNote.noteData.smoNote.clefNote && !clefNoteAdded) {\n const cf = new VF.ClefNote(vexNote.noteData.smoNote.clefNote.clef, 'small');\n this.voiceNotes.push(cf);\n clefNoteAdded = true; // ignore 2nd in a measure\n }\n this.voiceNotes.push(vexNote.noteData.staveNote);\n textNotes.forEach((tn) => {\n this.voiceNotes.push((0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createTextNote)(_smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_5__.SmoOrnament.textNoteOrnaments[tn.ornament]));\n });\n if (isNaN(smoNote.ticks.numerator) || isNaN(smoNote.ticks.denominator)\n || isNaN(smoNote.ticks.remainder)) {\n throw ('vxMeasure: NaN in ticks');\n }\n }\n }\n /**\n * Group the notes for beaming and create Vex beam objects\n * @param vix - voice index\n * @returns\n */\n createVexBeamGroups(vix) {\n let keyNoteIx = -1;\n let i = 0;\n let j = 0;\n let stemDirection = VF.Stem.DOWN;\n for (i = 0; i < this.smoMeasure.beamGroups.length; ++i) {\n const bg = this.smoMeasure.beamGroups[i];\n if (bg.voice !== vix) {\n continue;\n }\n const vexNotes = [];\n keyNoteIx = bg.notes.findIndex((nn) => nn.noteType === 'n');\n // Fix stem bug: key off first non-rest note.\n keyNoteIx = (keyNoteIx >= 0) ? keyNoteIx : 0;\n for (j = 0; j < bg.notes.length; ++j) {\n const note = bg.notes[j];\n if (note.noteType === '/') {\n continue;\n }\n const vexNote = this.noteToVexMap[note.attrs.id];\n // some type of redraw condition?\n if (!(vexNote instanceof VF.StaveNote || vexNote instanceof VF.GraceNote)) {\n return;\n }\n if (note.tickCount >= 4096 || vexNote.getIntrinsicTicks() >= 4096) {\n console.warn('bad length in beam group');\n return;\n }\n if (keyNoteIx === j) {\n stemDirection = note.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.auto ?\n vexNote.getStemDirection() : (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexStemDirection)(note);\n }\n vexNote.setStemDirection(stemDirection);\n vexNotes.push(vexNote);\n }\n const vexBeam = new VF.Beam(vexNotes);\n vexBeam.breakSecondaryAt(bg.secondaryBeamBreaks);\n this.beamToVexMap[bg.attrs.id] = vexBeam;\n this.vexBeamGroups.push(vexBeam);\n }\n }\n createVexTuplets(vix) {\n this.vexTuplets = [];\n this.tupletToVexMap = {};\n for (let i = 0; i < this.smoMeasure.tupletTrees.length; ++i) {\n const tupletTree = this.smoMeasure.tupletTrees[i];\n if (tupletTree.voice !== vix) {\n continue;\n }\n const traverseTupletTree = (parentTuplet) => {\n const vexNotes = [];\n for (let smoNote of this.smoMeasure.tupletNotes(parentTuplet)) {\n vexNotes.push(this.noteToVexMap[smoNote.attrs.id]);\n }\n // If the tuplet has been deleted, the measure might not be updated.\n if (vexNotes.length < 2) {\n return;\n }\n const location = this.smoMeasure.getStemDirectionForTuplet(parentTuplet) === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.up ?\n VF.Tuplet.LOCATION_TOP : VF.Tuplet.LOCATION_BOTTOM;\n const smoTupletParams = {\n vexNotes,\n numNotes: parentTuplet.numNotes,\n notesOccupied: parentTuplet.notesOccupied,\n ratioed: parentTuplet.ratioed,\n bracketed: parentTuplet.bracketed,\n location\n };\n const vexTuplet = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getVexTuplets)(smoTupletParams);\n this.tupletToVexMap[parentTuplet.attrs.id] = vexTuplet;\n this.vexTuplets.push(vexTuplet);\n for (let i = 0; i < parentTuplet.childrenTuplets.length; i++) {\n const tuplet = parentTuplet.childrenTuplets[i];\n traverseTupletTree(tuplet);\n }\n };\n traverseTupletTree(tupletTree.tuplet);\n }\n }\n /**\n * create the modifiers for the stave itself, bar lines etc.\n */\n createMeasureModifiers() {\n const sb = this.smoMeasure.getStartBarline();\n const eb = this.smoMeasure.getEndBarline();\n const sym = this.smoMeasure.getRepeatSymbol();\n if (!this.stave) {\n return;\n }\n // don't create a begin bar for any but the 1st measure.\n if (this.smoMeasure.measureNumber.systemIndex !== 0 && sb.barline === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoBarline.barlines.singleBar\n && this.smoMeasure.format.padLeft === 0) {\n this.stave.setBegBarType(VF.Barline.type.NONE);\n }\n else {\n this.stave.setBegBarType((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexBarlineType)(sb));\n }\n if (this.smoMeasure.svg.multimeasureLength > 0 && !this.smoMeasure.svg.hideMultimeasure) {\n this.stave.setEndBarType(_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.vexBarlineType[this.smoMeasure.svg.multimeasureEndBarline]);\n }\n else if (eb.barline !== _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoBarline.barlines.singleBar) {\n this.stave.setEndBarType((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexBarlineType)(eb));\n }\n if (sym && sym.symbol !== _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoRepeatSymbol.symbols.None) {\n const rep = new VF.Repetition((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexSymbol)(sym), sym.xOffset + this.smoMeasure.staffX, sym.yOffset);\n this.stave.getModifiers().push(rep);\n }\n const tms = this.smoMeasure.getMeasureText();\n // TODO: set font\n tms.forEach((tmb) => {\n var _a;\n const tm = tmb;\n const offset = tm.position === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoMeasureText.positions.left ? this.smoMeasure.format.padLeft : 0;\n const staveText = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createStaveText)(tm.text, (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexTextPosition)(tm), {\n shiftX: tm.adjustX + offset, shiftY: tm.adjustY, justification: (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexTextJustification)(tm)\n });\n (_a = this.stave) === null || _a === void 0 ? void 0 : _a.addModifier(staveText);\n // hack - we can't create staveText directly so this is the only way I could set the font\n const ar = this.stave.getModifiers();\n const vm = ar[ar.length - 1];\n vm.setFont(tm.fontInfo);\n });\n if (this.smoMeasure.svg.rowInSystem === 0) {\n const rmb = this.smoMeasure.getRehearsalMark();\n const rm = rmb;\n if (rm) {\n this.stave.setSection(rm.symbol, 0);\n }\n }\n const tempo = this.smoMeasure.getTempo();\n if (tempo && this.smoMeasure.svg.forceTempo) {\n this.stave.setTempo(tempo.toVexTempo(), -1 * tempo.yOffset);\n const vexTempo = this.stave.getModifiers().find((mod) => mod.getAttribute('type') === 'StaveTempo');\n if (vexTempo) {\n vexTempo.setFont({ family: _styles_font_metrics_ssp_serif_metrics__WEBPACK_IMPORTED_MODULE_4__.SourceSerifProFont.fontFamily, size: 13, weight: 'bold' });\n }\n }\n }\n /**\n * Create all Vex notes and modifiers. We defer the format and rendering so\n * we can align across multiple staves\n */\n preFormat() {\n var _a;\n var j = 0;\n if (this.smoMeasure.svg.element !== null) {\n this.smoMeasure.svg.element.remove();\n this.smoMeasure.svg.element = null;\n if (this.smoMeasure.svg.tabElement) {\n this.smoMeasure.svg.tabElement.remove();\n this.smoMeasure.svg.tabElement = undefined;\n }\n }\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n // Note: need to do this to get it into VEX KS format\n const staffX = this.smoMeasure.staffX + this.smoMeasure.format.padLeft;\n const staffY = this.smoMeasure.staffY - this.context.box.y;\n const key = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySignatureTranspose(this.smoMeasure.keySignature, 0);\n const canceledKey = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySignatureTranspose(this.smoMeasure.canceledKeySignature, 0);\n const smoVexStaveParams = {\n x: staffX,\n y: staffY,\n padLeft: this.smoMeasure.format.padLeft,\n id: this.smoMeasure.id,\n staffX: this.smoMeasure.staffX,\n staffY: this.smoMeasure.staffY,\n staffWidth: this.smoMeasure.staffWidth,\n forceClef: this.smoMeasure.svg.forceClef,\n clef: this.smoMeasure.clef,\n forceKey: this.smoMeasure.svg.forceKeySignature,\n key,\n canceledKey,\n startX: this.smoMeasure.svg.maxColumnStartX,\n adjX: this.smoMeasure.svg.adjX,\n lines: this.smoMeasure.lines,\n context: this.context.getContext()\n };\n this.stave = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createStave)(smoVexStaveParams);\n if (this.smoMeasure.svg.forceTimeSignature) {\n const ts = this.smoMeasure.timeSignature;\n let tsString = ts.timeSignature;\n if (this.smoMeasure.timeSignature.useSymbol && ts.actualBeats === 4 && ts.beatDuration === 4) {\n tsString = 'C';\n }\n else if (this.smoMeasure.timeSignature.useSymbol && ts.actualBeats === 2 && ts.beatDuration === 4) {\n tsString = 'C|';\n }\n else if (this.smoMeasure.timeSignature.displayString.length) {\n tsString = this.smoMeasure.timeSignature.displayString;\n }\n this.stave.addTimeSignature(tsString);\n }\n // Connect it to the rendering context and draw!\n this.stave.setContext(this.context.getContext());\n if (this.smoTabStave && ((_a = this.smoMeasure.svg.tabStaveBox) === null || _a === void 0 ? void 0 : _a.width)) {\n const box = this.smoMeasure.svg.tabStaveBox;\n let tabWidth = 0;\n box.y -= this.context.box.y;\n box.x = staffX - this.context.box.x;\n box.width = this.smoMeasure.staffWidth;\n this.tabStave = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createTabStave)(box, this.smoTabStave.spacing, this.smoTabStave.numLines);\n if (this.smoMeasure.svg.forceClef) {\n this.tabStave.addTabGlyph();\n tabWidth = _glyphDimensions__WEBPACK_IMPORTED_MODULE_11__.vexGlyph.dimensions['tab'].width;\n }\n this.tabStave.setNoteStartX(this.tabStave.getNoteStartX() + this.smoMeasure.svg.adjX - tabWidth);\n this.tabStave.setContext(this.context.getContext());\n }\n this.createMeasureModifiers();\n this.tickmapObject = this.smoMeasure.createMeasureTickmaps();\n this.createCollisionTickmap();\n this.voiceAr = [];\n this.vexNotes = [];\n this.noteToVexMap = {};\n // If there are multiple voices, add them all to the formatter at the same time so they don't collide\n for (j = 0; j < this.smoMeasure.voices.length; ++j) {\n const smoVexVoiceParams = {\n actualBeats: this.smoMeasure.timeSignature.actualBeats,\n beatDuration: this.smoMeasure.timeSignature.beatDuration,\n notes: this.vexNotes\n };\n if (!this.smoMeasure.svg.multimeasureLength && !this.smoMeasure.repeatSymbol) {\n this.createVexNotes(j);\n smoVexVoiceParams.notes = this.voiceNotes;\n this.createVexTuplets(j);\n this.createVexBeamGroups(j);\n // Create a voice in 4/4 and add above notes\n const voice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)(smoVexVoiceParams);\n this.voiceAr.push(voice);\n }\n if (this.smoMeasure.repeatSymbol) {\n this.createRepeatSymbol();\n // Create a voice in 4/4 and add above notes\n const voice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)(smoVexVoiceParams);\n this.voiceAr.push(voice);\n }\n }\n // Need to format for x position, then set y position before drawing dynamics.\n this.formatter = new VF.Formatter({ softmaxFactor: this.softmax, globalSoftmax: false });\n this.formatter.joinVoices(this.voiceAr);\n if (this.tabStave) {\n this.tabVoice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)({\n actualBeats: this.smoMeasure.timeSignature.actualBeats,\n beatDuration: this.smoMeasure.timeSignature.beatDuration,\n notes: this.tabNotes\n });\n this.formatter.joinVoices([this.tabVoice]);\n }\n }\n /**\n * Create the Vex formatter that calculates the X and Y positions of the notes. A formatter\n * may actually span multiple staves for justified staves. The notes are drawn in their\n * individual vxMeasure objects but formatting is done once for all justified staves\n * @param voices Voice objects from VexFlow\n * @returns\n */\n format(voices) {\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n if (this.smoMeasure.svg.multimeasureLength > 0) {\n this.multimeasureRest = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getMultimeasureRest)(this.smoMeasure.svg.multimeasureLength);\n this.multimeasureRest.setContext(this.context.getContext());\n this.multimeasureRest.setStave(this.stave);\n return;\n }\n if (!this.formatter) {\n return;\n }\n const timestamp = new Date().valueOf();\n const staffWidth = this.smoMeasure.staffWidth -\n (this.smoMeasure.svg.maxColumnStartX + this.smoMeasure.svg.adjRight + this.smoMeasure.format.padLeft) - 10;\n this.dbgLeftX = this.smoMeasure.staffX + this.smoMeasure.format.padLeft + this.smoMeasure.svg.adjX;\n this.dbgWidth = staffWidth;\n this.formatter.format(voices, staffWidth);\n if (this.tabVoice && this.tabNotes.length) {\n this.formatter.format([this.tabVoice], staffWidth);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.FORMAT, new Date().valueOf() - timestamp);\n }\n /**\n * render is called after format. Actually draw the things.\n */\n render() {\n var _a;\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n var group = this.context.getContext().openGroup();\n var mmClass = this.smoMeasure.getClassId();\n var j = 0;\n try {\n // bound each measure in its own SVG group for easy deletion and mapping to screen coordinate\n group.classList.add(this.smoMeasure.id);\n group.classList.add(mmClass);\n group.id = this.smoMeasure.id;\n this.stave.draw();\n this.smoMeasure.svg.element = group;\n for (j = 0; j < this.voiceAr.length; ++j) {\n this.voiceAr[j].draw(this.context.getContext(), this.stave);\n }\n this.vexBeamGroups.forEach((b) => {\n b.setContext(this.context.getContext()).draw();\n });\n this.vexTuplets.forEach((tuplet) => {\n tuplet.setContext(this.context.getContext()).draw();\n });\n if (this.multimeasureRest) {\n this.multimeasureRest.draw();\n }\n // this._updateLyricDomSelectors();\n this.renderDynamics();\n // this.smoMeasure.adjX = this.stave.start_x - (this.smoMeasure.staffX);\n this.context.getContext().closeGroup();\n if (this.tabStave) {\n const tabStaveId = `${this.smoMeasure.id}-tab`;\n const tabGroup = this.context.getContext().openGroup();\n tabGroup.classList.add(tabStaveId);\n this.tabStave.draw();\n (_a = this.tabVoice) === null || _a === void 0 ? void 0 : _a.draw(this.context.getContext(), this.tabStave);\n this.context.getContext().closeGroup();\n this.smoMeasure.svg.tabElement = tabGroup;\n }\n // layoutDebug.setTimestamp(layoutDebug.codeRegions.RENDER, new Date().valueOf() - timestamp);\n this.rendered = true;\n if (_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.mask & _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.values['adjust']) {\n _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.debugBoxNoText(this.context.getContext().svg, _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.boxPoints(this.dbgLeftX, this.smoMeasure.svg.staffY, this.dbgWidth, 40), 'render-x-dbg', 0);\n }\n }\n catch (exc) {\n console.warn('unable to render measure ' + this.smoMeasure.measureNumber.measureIndex);\n this.context.getContext().closeGroup();\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSx5REFBVyxDQUFDLElBQUksR0FBRyx5REFBVyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNwRCx1REFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsRUFDdkQsdURBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3JlbmRlci92ZXgvdnhNZWFzdXJlLnRzP2NjMTEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gW1Ntb29zaWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BYXJvbkRhdmlkTmV3bWFuL1Ntb29zaWMpXHJcbi8vIENvcHlyaWdodCAoYykgQWFyb24gRGF2aWQgTmV3bWFuIDIwMjEuXHJcbi8vICMjIERlc2NyaXB0aW9uOlxyXG4vLyBUaGlzIGZpbGUgY2FsbHMgdGhlIHZleGZsb3cgcm91dGluZXMgdGhhdCBhY3R1YWxseSByZW5kZXIgYVxyXG4vLyBtZWFzdXJlIG9mIG11c2ljLiAgSWYgbXVsdGlwbGUgbWVhc3VyZXMgYXJlIGp1c3RpZmllZCBpbiBhXHJcbi8vIGNvbHVtbiwgdGhlIHJlbmRlcmluZyBpcyBkZWZlcnJlZCB1bnRpbCBhbGwgdGhlIG1lYXN1cmVzIGhhdmUgYmVlblxyXG4vLyBwcmVmb3JtYXR0ZWQuXHJcbmltcG9ydCB7IFNtb05vdGUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9ub3RlJztcclxuaW1wb3J0IHsgU21vTXVzaWMgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tdXNpYyc7XHJcbmltcG9ydCB7IGxheW91dERlYnVnIH0gZnJvbSAnLi4vc3VpL2xheW91dERlYnVnJztcclxuaW1wb3J0IHsgU21vUmVwZWF0U3ltYm9sLCBTbW9NZWFzdXJlVGV4dCwgU21vQmFybGluZSwgU21vTWVhc3VyZU1vZGlmaWVyQmFzZSwgU21vUmVoZWFyc2FsTWFyayB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL21lYXN1cmVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTb3VyY2VTZXJpZlByb0ZvbnQgfSBmcm9tICcuLi8uLi9zdHlsZXMvZm9udF9tZXRyaWNzL3NzcC1zZXJpZi1tZXRyaWNzJztcclxuaW1wb3J0IHsgU21vT3JuYW1lbnQsIFNtb0R5bmFtaWNUZXh0LCBcclxuICBTbW9Ob3RlTW9kaWZpZXJCYXNlLCBTbW9UYWJOb3RlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbm90ZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb1NlbGVjdGlvbiB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9zZWxlY3Rpb25zJztcclxuaW1wb3J0IHsgU21vTWVhc3VyZSwgTWVhc3VyZVRpY2ttYXBzIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZSc7XHJcbmltcG9ydCB7IFN2Z0hlbHBlcnMgfSBmcm9tICcuLi9zdWkvc3ZnSGVscGVycyc7XHJcbmltcG9ydCB7IENsZWYsIElzQ2xlZiwgRWxlbWVudExpa2UgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTdmdQYWdlIH0gZnJvbSAnLi4vc3VpL3N2Z1BhZ2VNYXAnO1xyXG5pbXBvcnQgeyBTbW9UYWJTdGF2ZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3N0YWZmTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgdG9WZXhCYXJsaW5lVHlwZSwgdmV4QmFybGluZVR5cGUsIHZleEJhcmxpbmVQb3NpdGlvbiwgdG9WZXhCYXJsaW5lUG9zaXRpb24sIHRvVmV4U3ltYm9sLFxyXG4gIHRvVmV4VGV4dEp1c3RpZmljYXRpb24sIHRvVmV4VGV4dFBvc2l0aW9uLCBnZXRWZXhDaG9yZEJsb2NrcywgdG9WZXhTdGVtRGlyZWN0aW9uLFxyXG4gIFZleFRhYk5vdGVQb3NpdGlvbnMgfSBmcm9tICcuL3Ntb0FkYXB0ZXInO1xyXG5pbXBvcnQgeyBWZXhGbG93LCBTdGF2ZSxTdGVtbWFibGVOb3RlLCBOb3RlLCBCZWFtLCBUdXBsZXQsIFZvaWNlLFxyXG4gIEZvcm1hdHRlciwgQWNjaWRlbnRhbCwgQW5ub3RhdGlvbiwgU3RhdmVOb3RlU3RydWN0LCBTdGF2ZVRleHQsIFN0YXZlTW9kaWZpZXIsXHJcbiAgY3JlYXRlU3RhdmVUZXh0LCByZW5kZXJEeW5hbWljcywgYXBwbHlTdGVtRGlyZWN0aW9uLFxyXG4gIGdldFZleE5vdGVQYXJhbWV0ZXJzLCBkZWZhdWx0Tm90ZVNjYWxlLCBkZWZhdWx0Q3VlU2NhbGUsIGdldFZleFR1cGxldHMsXHJcbiAgY3JlYXRlU3RhdmUsIGNyZWF0ZVZvaWNlLCBnZXRPcm5hbWVudEdseXBoLCBnZXRTbGFzaEdseXBoLCBnZXRSZXBlYXRCYXIsIGdldE11bHRpbWVhc3VyZVJlc3QsXHJcbiAgY3JlYXRlVGV4dE5vdGUsIFRhYlN0YXZlLCBjcmVhdGVUYWJTdGF2ZSwgVGFiTm90ZVBvc2l0aW9uLCBUYWJOb3RlU3RydWN0LFxyXG4gIENyZWF0ZVZleE5vdGVQYXJhbXMsIFRhYk5vdGUsIFBlZGFsTWFya2luZ1xyXG4gICB9IGZyb20gJy4uLy4uL2NvbW1vbi92ZXgnO1xyXG5cclxuaW1wb3J0IHsgVnhNZWFzdXJlSWYsIFZleE5vdGVNb2RpZmllcklmLCBWeE5vdGUgfSBmcm9tICcuL3Z4Tm90ZSc7XHJcbmltcG9ydCB7IFNtb1R1cGxldCB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3R1cGxldCc7XHJcbmltcG9ydCB7IHZleEdseXBoIH0gZnJvbSAnLi9nbHlwaERpbWVuc2lvbnMnO1xyXG5jb25zdCBWRiA9IFZleEZsb3c7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcbi8vIGNvbnN0IFZGID0gZXZhbCgnVmV4LkZsb3cnKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIFZleEZsb3cgbGlicmFyeSB0aGF0IGFjdHVhbGx5IGRvZXMgdGhlIGVuZ3JhdmluZy5cclxuICogQGNhdGVnb3J5IFN1aVJlbmRlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFZ4TWVhc3VyZSBpbXBsZW1lbnRzIFZ4TWVhc3VyZUlmIHtcclxuICBjb250ZXh0OiBTdmdQYWdlO1xyXG4gIHByaW50aW5nOiBib29sZWFuO1xyXG4gIHNlbGVjdGlvbjogU21vU2VsZWN0aW9uO1xyXG4gIHNvZnRtYXg6IG51bWJlcjtcclxuICBzbW9NZWFzdXJlOiBTbW9NZWFzdXJlO1xyXG4gIHNtb1RhYlN0YXZlPzogU21vVGFiU3RhdmU7XHJcbiAgdGFiU3RhdmU/OiBUYWJTdGF2ZTtcclxuICByZW5kZXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG5vdGVUb1ZleE1hcDogUmVjb3JkPHN0cmluZywgTm90ZT4gPSB7fTtcclxuICBiZWFtVG9WZXhNYXA6IFJlY29yZDxzdHJpbmcsIEJlYW0+ID0ge307XHJcbiAgdHVwbGV0VG9WZXhNYXA6IFJlY29yZDxzdHJpbmcsIFR1cGxldD4gPSB7fTtcclxuICBtdWx0aW1lYXN1cmVSZXN0OiBhbnkgfCBudWxsID0gbnVsbDtcclxuICB2ZXhOb3RlczogTm90ZVtdID0gW107XHJcbiAgdmV4QmVhbUdyb3VwczogQmVhbVtdID0gW107XHJcbiAgdmV4VHVwbGV0czogVHVwbGV0W10gPSBbXTtcclxuICB0aWNrbWFwT2JqZWN0OiBNZWFzdXJlVGlja21hcHMgfCBudWxsID0gbnVsbDtcclxuICBzdGF2ZTogU3RhdmUgfCBudWxsID0gbnVsbDsgLy8gdmV4IHN0YXZlXHJcbiAgdm9pY2VOb3RlczogTm90ZVtdID0gW107IC8vIG5vdGVzIGZvciBjdXJyZW50IHZvaWNlLCBhcyByZW5kZXJpbmdcclxuICB0YWJOb3RlczogTm90ZVtdID0gW107XHJcbiAgdm9pY2VBcjogVm9pY2VbXSA9IFtdO1xyXG4gIHRhYlZvaWNlOiBWb2ljZSB8IG51bGwgPSBudWxsO1xyXG4gIGZvcm1hdHRlcjogRm9ybWF0dGVyIHwgbnVsbCA9IG51bGw7XHJcbiAgYWxsQ3VlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1vZGlmaWVyc1RvQm94OiBTbW9Ob3RlTW9kaWZpZXJCYXNlW10gPSBbXTtcclxuICBjb2xsaXNpb25NYXA6IFJlY29yZDxudW1iZXIsIFNtb05vdGVbXT4gPSB7fTtcclxuICBkYmdMZWZ0WDogbnVtYmVyID0gMDtcclxuICBkYmdXaWR0aDogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dDogU3ZnUGFnZSwgc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24sIHByaW50aW5nOiBib29sZWFuLCBzb2Z0bWF4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICB0aGlzLnJlbmRlcmVkID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjtcclxuICAgIHRoaXMuc21vTWVhc3VyZSA9IHRoaXMuc2VsZWN0aW9uLm1lYXN1cmU7XHJcbiAgICB0aGlzLnByaW50aW5nID0gcHJpbnRpbmc7XHJcbiAgICB0aGlzLmFsbEN1ZXMgPSBzZWxlY3Rpb24uc3RhZmYucGFydEluZm8uZGlzcGxheUN1ZXM7XHJcbiAgICB0aGlzLnR1cGxldFRvVmV4TWFwID0ge307XHJcbiAgICB0aGlzLnZleE5vdGVzID0gW107XHJcbiAgICB0aGlzLnZleEJlYW1Hcm91cHMgPSBbXTtcclxuICAgIHRoaXMudmV4QmVhbUdyb3VwcyA9IFtdO1xyXG4gICAgdGhpcy5iZWFtVG9WZXhNYXAgPSB7fTtcclxuICAgIHRoaXMuc29mdG1heCA9IHNvZnRtYXg7XHJcbiAgICB0aGlzLnNtb1RhYlN0YXZlID0gc2VsZWN0aW9uLnN0YWZmLmdldFRhYlN0YXZlRm9yTWVhc3VyZShzZWxlY3Rpb24uc2VsZWN0b3IpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldCBmaWxsU3R5bGUoKSB7XHJcbiAgICByZXR1cm4gJyMwMDAnO1xyXG4gIH1cclxuICAvLyBUcmVhdCBhIHJlc3QgbGlrZSBhIHdob2xlIHJlc3QgaWYgdGhlcmUgaXMgb25seSBhIHNpbmdsZSByZXN0IGluIHRoZSBtZWFzdXJlXHJcbiAgLy8gYW5kIHRoZSBtZWFzdXJlIGxlbmd0aCBpcyBub3QgYSBwaWNrdXBcclxuICBpc1dob2xlUmVzdCgpIHtcclxuICAgIHJldHVybiAodGhpcy5zbW9NZWFzdXJlLnZvaWNlcy5sZW5ndGggPT09IDEgJiZcclxuICAgICAgdGhpcy5zbW9NZWFzdXJlLnZvaWNlc1swXS5ub3Rlcy5sZW5ndGggPT09IDEgJiZcclxuICAgICAgdGhpcy5zbW9NZWFzdXJlLnZvaWNlc1swXS5ub3Rlc1swXS5pc1Jlc3QoKSAmJlxyXG4gICAgICB0aGlzLnNtb01lYXN1cmUuZ2V0TWF4VGlja3NWb2ljZSgpID4gNDA5NlxyXG4gICAgICApO1xyXG4gIH1cclxuICBjcmVhdGVDb2xsaXNpb25UaWNrbWFwKCkge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IGogPSAwO1xyXG4gICAgaWYgKCF0aGlzLnRpY2ttYXBPYmplY3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc21vTWVhc3VyZS52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgdG0gPSB0aGlzLnRpY2ttYXBPYmplY3QudGlja21hcHNbaV07XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCB0bS5kdXJhdGlvbk1hcC5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGlmICh0eXBlb2YodGhpcy5jb2xsaXNpb25NYXBbdG0uZHVyYXRpb25NYXBbal1dKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgIHRoaXMuY29sbGlzaW9uTWFwW3RtLmR1cmF0aW9uTWFwW2pdXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbGxpc2lvbk1hcFt0bS5kdXJhdGlvbk1hcFtqXV0ucHVzaCh0aGlzLnNtb01lYXN1cmUudm9pY2VzW2ldLm5vdGVzW2pdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBpc0NvbGxpc2lvbih2b2ljZUl4OiBudW1iZXIsIHRpY2tJeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBsZXQgayA9IDA7XHJcbiAgICBsZXQgc3RhZmZMaW5lczogbnVtYmVyW10gPSBbXTtcclxuICAgIGlmICghdGhpcy50aWNrbWFwT2JqZWN0KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRpY2sgPSB0aGlzLnRpY2ttYXBPYmplY3QudGlja21hcHNbdm9pY2VJeF0uZHVyYXRpb25NYXBbdGlja0l4XTtcclxuICAgIC8vIEp1c3Qgb25lIG5vdGUsIG5vIGNvbGxpc2lvblxyXG4gICAgaWYgKHRoaXMuY29sbGlzaW9uTWFwW3RpY2tdLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuY29sbGlzaW9uTWFwW3RpY2tdLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG5vdGUgPSB0aGlzLmNvbGxpc2lvbk1hcFt0aWNrXVtpXTtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IG5vdGUucGl0Y2hlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGNvbnN0IGNsZWY6IENsZWYgPSBJc0NsZWYobm90ZS5jbGVmKSA/IG5vdGUuY2xlZiA6ICd0cmVibGUnO1xyXG4gICAgICAgIGNvbnN0IHBpdGNoID0gbm90ZS5waXRjaGVzW2pdO1xyXG4gICAgICAgIGNvbnN0IGN1ckxpbmUgPSBTbW9NdXNpYy5waXRjaFRvU3RhZmZMaW5lKGNsZWYsIHBpdGNoKTtcclxuICAgICAgICBmb3IgKGsgPSAwO2sgPCBzdGFmZkxpbmVzLmxlbmd0aDsgKytrKSB7XHJcbiAgICAgICAgICBpZiAoTWF0aC5hYnMoY3VyTGluZSAtIHN0YWZmTGluZXNba10pIDwgMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgc3RhZmZMaW5lcy5wdXNoKGN1ckxpbmUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBjb252ZXJ0IGEgc21vTm90ZSBpbnRvIGEgdnhOb3RlIHNvIGl0IGNhbiBiZSByYXN0ZXJpemVkXHJcbiAgICogQHBhcmFtIHNtb05vdGUgXHJcbiAgICogQHBhcmFtIHRpY2tJbmRleCAtIHVzZWQgdG8gY2FsY3VsYXRlIGFjY2lkZW50YWxcclxuICAgKiBAcGFyYW0gdm9pY2VJeCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBjcmVhdGVWZXhOb3RlKHNtb05vdGU6IFNtb05vdGUsIHRpY2tJbmRleDogbnVtYmVyLCB2b2ljZUl4OiBudW1iZXIpIHtcclxuICAgIGxldCB2ZXhOb3RlOiBOb3RlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBsZXQgc21vVGFiTm90ZTogU21vVGFiTm90ZSB8IG51bGwgPSBudWxsO1xyXG4gICAgbGV0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudmFsdWVPZigpO1xyXG4gICAgY29uc3Qgc3RlbVRpY2tzID0gU21vTXVzaWMudGlja3NUb0R1cmF0aW9uW3Ntb05vdGUuc3RlbVRpY2tzXTtcclxuICAgIGxldCB0YWJOb3RlOiBTdGVtbWFibGVOb3RlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBjb25zdCBub3RlSGVhZCA9IHNtb05vdGUuaXNSZXN0KCkgPyAncicgOiBzbW9Ob3RlLm5vdGVIZWFkO1xyXG4gICAgY29uc3Qga2V5cyA9IFNtb011c2ljLnNtb1BpdGNoZXNUb1ZleEtleXMoc21vTm90ZS5waXRjaGVzLCAwLCBub3RlSGVhZCk7XHJcbiAgICBjb25zdCBzbW9Ob3RlUGFyYW1zID0ge1xyXG4gICAgICBpc1R1cGxldDogc21vTm90ZS5pc1R1cGxldCxcclxuICAgICAgbWVhc3VyZUluZGV4OiB0aGlzLnNtb01lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXgsXHJcbiAgICAgIGNsZWY6IHNtb05vdGUuY2xlZixcclxuICAgICAgc3RlbVRpY2tzLFxyXG4gICAgICBrZXlzLFxyXG4gICAgICBub3RlVHlwZTogc21vTm90ZS5ub3RlVHlwZSxcclxuICAgICAgaXNDdWU6IHNtb05vdGUuaXNDdWVcclxuICAgIH07XHJcbiAgICBjb25zdCB7IG5vdGVQYXJhbXMsIGR1cmF0aW9uIH0gPSBnZXRWZXhOb3RlUGFyYW1ldGVycyhzbW9Ob3RlUGFyYW1zKTtcclxuICAgIGlmICh0aGlzLnRhYlN0YXZlICYmIHRoaXMuc21vVGFiU3RhdmUpIHtcclxuICAgICAgc21vVGFiTm90ZSA9IHRoaXMuc21vVGFiU3RhdmUuZ2V0VGFiTm90ZUZyb21Ob3RlKHNtb05vdGUsIHRoaXMuc21vTWVhc3VyZS50cmFuc3Bvc2VJbmRleCk7XHJcbiAgICAgIGlmIChzbW9UYWJOb3RlKSB7XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25zOiBUYWJOb3RlUG9zaXRpb25bXSA9IFZleFRhYk5vdGVQb3NpdGlvbnModGhpcy5zbW9UYWJTdGF2ZSwgc21vVGFiTm90ZSwgc21vTm90ZSk7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgIGlmICghc21vTm90ZS5pc1Jlc3QoKSkge1xyXG4gICAgICAgICAgICB0YWJOb3RlID0gbmV3IFZGLlRhYk5vdGUoeyBwb3NpdGlvbnMsIGR1cmF0aW9uOiBkdXJhdGlvbiB9KTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc21vVGFiU3RhdmUuc2hvd1N0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgdGFiTm90ZS5yZW5kZXJfb3B0aW9ucy5kcmF3X3N0ZW0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRhYk5vdGUucmVuZGVyX29wdGlvbnMuZHJhd19kb3RzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0YWJOb3RlLnJlbmRlcl9vcHRpb25zLmRyYXdfc3RlbV90aHJvdWdoX3N0YXZlID0gc21vVGFiTm90ZS5mbGFnVGhyb3VnaDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGFiTm90ZSA9IG5ldyBWRi5TdGF2ZU5vdGUobm90ZVBhcmFtcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoc21vTm90ZS5ub3RlVHlwZSA9PT0gJy8nKSB7XHJcbiAgICAgIC8vIHZleE5vdGUgPSBuZXcgVkYuR2x5cGhOb3RlKCdcXHVFNTA0JywgeyBkdXJhdGlvbiB9KTtcclxuICAgICAgdmV4Tm90ZSA9IGdldFNsYXNoR2x5cGgoKTtcclxuICAgICAgc21vTm90ZS5yZW5kZXJJZCA9ICd2Zi0nICsgdmV4Tm90ZS5nZXRBdHRyaWJ1dGUoJ2lkJyk7IC8vIHdoZXJlIGRvZXMgJ3ZmJyBjb21lIGZyb20/XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBzbW9WZXhTdGVtUGFyYW1zID0ge1xyXG4gICAgICAgIHZvaWNlQ291bnQ6IHRoaXMuc21vTWVhc3VyZS52b2ljZXMubGVuZ3RoLFxyXG4gICAgICAgIHZvaWNlSXgsXHJcbiAgICAgICAgaXNBdXRvOiBzbW9Ob3RlLmZsYWdTdGF0ZSA9PT0gU21vTm90ZS5mbGFnU3RhdGVzLmF1dG8sXHJcbiAgICAgICAgaXNVcDogc21vTm90ZS5mbGFnU3RhdGUgPT09IFNtb05vdGUuZmxhZ1N0YXRlcy51cFxyXG4gICAgICB9XHJcbiAgICAgIGFwcGx5U3RlbURpcmVjdGlvbihzbW9WZXhTdGVtUGFyYW1zLCBub3RlUGFyYW1zKTtcclxuICAgICAgaWYgKHNtb1RhYk5vdGUgJiYgdGFiTm90ZSkge1xyXG4gICAgICAgIHRhYk5vdGUuc2V0U3RlbURpcmVjdGlvbihub3RlUGFyYW1zLnN0ZW1fZGlyZWN0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICBsYXlvdXREZWJ1Zy5zZXRUaW1lc3RhbXAobGF5b3V0RGVidWcuY29kZVJlZ2lvbnMuUFJFRk9STUFUQSwgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSB0aW1lc3RhbXApO1xyXG4gICAgICB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnZhbHVlT2YoKTtcclxuICAgICAgdmV4Tm90ZSA9IG5ldyBWRi5TdGF2ZU5vdGUobm90ZVBhcmFtcyk7XHJcbiAgICAgIGlmICh2b2ljZUl4ID4gMCAmJiB0aGlzLmlzQ29sbGlzaW9uKHZvaWNlSXgsIHRpY2tJbmRleCkpIHtcclxuICAgICAgICB2ZXhOb3RlLnNldFhTaGlmdCgtMTApO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmlzV2hvbGVSZXN0KCkpIHtcclxuICAgICAgICBub3RlUGFyYW1zLmR1cmF0aW9uID0gJ3dyJztcclxuICAgICAgICB2ZXhOb3RlID0gbmV3IFZGLlN0YXZlTm90ZShub3RlUGFyYW1zKTtcclxuICAgICAgICB2ZXhOb3RlLnNldENlbnRlckFsaWdubWVudCh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICBsYXlvdXREZWJ1Zy5zZXRUaW1lc3RhbXAobGF5b3V0RGVidWcuY29kZVJlZ2lvbnMuUFJFRk9STUFUQiwgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSB0aW1lc3RhbXApO1xyXG4gICAgICB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnZhbHVlT2YoKTtcclxuICAgICAgaWYgKHNtb05vdGUuZmlsbFN0eWxlICYmICF0aGlzLnByaW50aW5nKSB7XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRTdHlsZSh7IGZpbGxTdHlsZTogc21vTm90ZS5maWxsU3R5bGUgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodm9pY2VJeCA+IDAgJiYgIXRoaXMucHJpbnRpbmcpIHtcclxuICAgICAgICBjb25zdCB2b2ljZUZpbGwgPSBbJyMxMTU1MTEnLCcjNTU1NTExJywnIzg4MzM0NCddXHJcbiAgICAgICAgdmV4Tm90ZS5zZXRTdHlsZSh7IGZpbGxTdHlsZTogdm9pY2VGaWxsW3ZvaWNlSXggLSAxXSB9KTtcclxuICAgICAgfSBlbHNlIGlmIChzbW9Ob3RlLmlzSGlkZGVuKCkgJiYgdGhpcy5wcmludGluZykge1xyXG4gICAgICAgIHZleE5vdGUuc2V0U3R5bGUoeyBmaWxsU3R5bGU6IFwiI2ZmZmZmZjAwXCIgfSk7XHJcbiAgICAgIH1cclxuICAgICAgc21vTm90ZS5yZW5kZXJJZCA9ICd2Zi0nICsgdmV4Tm90ZS5nZXRBdHRyaWJ1dGUoJ2lkJyk7IC8vIHdoZXJlIGRvZXMgJ3ZmJyBjb21lIGZyb20/XHJcbiAgICAgIGlmICh0aGlzLnN0YXZlKSB7XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRTdGF2ZSh0aGlzLnN0YXZlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3Qgbm90ZURhdGE6IFZleE5vdGVNb2RpZmllcklmID0ge1xyXG4gICAgICBzbW9NZWFzdXJlOiB0aGlzLnNtb01lYXN1cmUsXHJcbiAgICAgIHZ4TWVhc3VyZTogdGhpcyxcclxuICAgICAgc21vTm90ZTogc21vTm90ZSxcclxuICAgICAgc3RhdmVOb3RlOiB2ZXhOb3RlLFxyXG4gICAgICB2b2ljZUluZGV4OiB2b2ljZUl4LFxyXG4gICAgICB0aWNrSW5kZXg6IHRpY2tJbmRleFxyXG4gICAgfVxyXG4gICAgaWYgKHRhYk5vdGUpIHtcclxuICAgICAgbm90ZURhdGEudGFiTm90ZSA9IHRhYk5vdGU7XHJcbiAgICAgIHRoaXMudGFiTm90ZXMucHVzaCh0YWJOb3RlKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1vZE9iaiA9IG5ldyBWeE5vdGUobm90ZURhdGEpO1xyXG4gICAgbW9kT2JqLmFkZE1vZGlmaWVycygpO1xyXG4gICAgbGF5b3V0RGVidWcuc2V0VGltZXN0YW1wKGxheW91dERlYnVnLmNvZGVSZWdpb25zLlBSRUZPUk1BVEMsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGltZXN0YW1wKTtcclxuXHJcbiAgICByZXR1cm4gbW9kT2JqO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyTm90ZUdseXBoKHNtb05vdGU6IFNtb05vdGUsIHRleHRPYmo6IFNtb0R5bmFtaWNUZXh0KSB7XHJcbiAgICB2YXIgeCA9IHRoaXMubm90ZVRvVmV4TWFwW3Ntb05vdGUuYXR0cnMuaWRdLmdldEFic29sdXRlWCgpICsgdGV4dE9iai54T2Zmc2V0O1xyXG4gICAgLy8gdGhlIC0zIGlzIGNvcGllZCBmcm9tIHZleGZsb3cgdGV4dER5bmFtaWNzXHJcbiAgICB2YXIgeSA9IHRoaXMuc3RhdmUhLmdldFlGb3JMaW5lKHRleHRPYmoueU9mZnNldExpbmUgLSAzKSArIHRleHRPYmoueU9mZnNldFBpeGVscztcclxuICAgIGxldCBtYXhoID0gMDtcclxuICAgIGNvbnN0IG1pbnggPSB4O1xyXG4gICAgdmFyIGdyb3VwOiBFbGVtZW50TGlrZSA9IHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkub3Blbkdyb3VwKCk7XHJcbiAgICBncm91cC5jbGFzc0xpc3QuYWRkKHRleHRPYmouYXR0cnMuaWQgKyAnLScgKyBzbW9Ob3RlLmF0dHJzLmlkKTtcclxuICAgIGdyb3VwLmNsYXNzTGlzdC5hZGQodGV4dE9iai5hdHRycy5pZCk7XHJcbiAgICAvLyBjb25zdCBkdXJhdGlvbiA9IFNtb011c2ljLmNsb3Nlc3RWZXhEdXJhdGlvbihzbW9Ob3RlLnRpY2tDb3VudCk7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHRPYmoudGV4dC5sZW5ndGg7IGkgKz0gMSApIHtcclxuICAgICAgY29uc3QgeyB3aWR0aCAsIGhlaWdodCB9ID0gcmVuZGVyRHluYW1pY3ModGhpcy5jb250ZXh0LmdldENvbnRleHQoKSwgVkYuVGV4dER5bmFtaWNzLkdMWVBIU1t0ZXh0T2JqLnRleHRbaV1dLmNvZGUsXHJcbiAgICAgICAgdGV4dE9iai5mb250U2l6ZSwgeCwgeSk7XHJcbiAgICAgIC8qIGNvbnN0IHsgd2lkdGggLCBoZWlnaHQgfSA9IHJlbmRlckR5bmFtaWNzKHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCksIFZGLlRleHREeW5hbWljcy5HTFlQSFNbdGV4dE9iai50ZXh0W2ldXSxcclxuICAgICAgICB0ZXh0T2JqLmZvbnRTaXplLCB4LCB5KTsgKi9cclxuICAgICAgeCArPSB3aWR0aDtcclxuICAgICAgbWF4aCA9IE1hdGgubWF4KGhlaWdodCwgbWF4aCk7ICAgICAgXHJcbiAgICB9XHJcbiAgICB0ZXh0T2JqLmxvZ2ljYWxCb3ggPSBTdmdIZWxwZXJzLmJveFBvaW50cyhtaW54LCB5ICsgdGhpcy5jb250ZXh0LmJveC55LCB4IC0gbWlueCwgbWF4aCk7XHJcbiAgICB0ZXh0T2JqLmVsZW1lbnQgPSBncm91cDtcclxuICAgIHRoaXMubW9kaWZpZXJzVG9Cb3gucHVzaCh0ZXh0T2JqKTtcclxuICAgIHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuY2xvc2VHcm91cCgpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyRHluYW1pY3MoKSB7XHJcbiAgICB0aGlzLnNtb01lYXN1cmUudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKHNtb05vdGUpID0+IHtcclxuICAgICAgICBjb25zdCBtb2RzID0gc21vTm90ZS50ZXh0TW9kaWZpZXJzLmZpbHRlcigobW9kKSA9PlxyXG4gICAgICAgICAgbW9kLmF0dHJzLnR5cGUgPT09ICdTbW9EeW5hbWljVGV4dCdcclxuICAgICAgICApO1xyXG4gICAgICAgIG1vZHMuZm9yRWFjaCgoYnRtKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB0bSA9IGJ0bSBhcyBTbW9EeW5hbWljVGV4dDtcclxuICAgICAgICAgIHRoaXMucmVuZGVyTm90ZUdseXBoKHNtb05vdGUsIHRtKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgY3JlYXRlUmVwZWF0U3ltYm9sKCkge1xyXG4gICAgdGhpcy52b2ljZU5vdGVzID0gW107XHJcbiAgICAvLyBjb25zdCB2ZXhOb3RlID0gbmV3IFZGLkdseXBoTm90ZSgnXFx1RTUwMCcsIHsgZHVyYXRpb246ICd3JyB9LCB7IGxpbmU6IDIgfSk7XHJcbiAgICBjb25zdCB2ZXhOb3RlID0gZ2V0UmVwZWF0QmFyKCk7XHJcbiAgICB2ZXhOb3RlLnNldENlbnRlckFsaWdubWVudCh0cnVlKTtcclxuICAgIHRoaXMudmV4Tm90ZXMucHVzaCh2ZXhOb3RlKTtcclxuICAgIHRoaXMudm9pY2VOb3Rlcy5wdXNoKHZleE5vdGUpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBjcmVhdGUgYW4gYSBhcnJheSBvZiBWRi5TdGF2ZU5vdGUgb2JqZWN0cyB0byByZW5kZXIgdGhlIGFjdGl2ZSB2b2ljZS5cclxuICAgKiBAcGFyYW0gdm9pY2VJeCBcclxuICAgKi9cclxuICBjcmVhdGVWZXhOb3Rlcyh2b2ljZUl4OiBudW1iZXIpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIHRoaXMudm9pY2VOb3RlcyA9IFtdO1xyXG4gICAgY29uc3Qgdm9pY2UgPSB0aGlzLnNtb01lYXN1cmUudm9pY2VzW3ZvaWNlSXhdO1xyXG4gICAgbGV0IGNsZWZOb3RlQWRkZWQgPSBmYWxzZTtcclxuXHJcbiAgICBmb3IgKGkgPSAwO1xyXG4gICAgICBpIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgc21vTm90ZSA9IHZvaWNlLm5vdGVzW2ldO1xyXG4gICAgICBjb25zdCB0ZXh0Tm90ZXMgPSBzbW9Ob3RlLmdldFRleHRPcm5hbWVudHMoKTtcclxuICAgICAgY29uc3QgdmV4Tm90ZSA9IHRoaXMuY3JlYXRlVmV4Tm90ZShzbW9Ob3RlLCBpLCB2b2ljZUl4KTtcclxuICAgICAgdGhpcy5ub3RlVG9WZXhNYXBbc21vTm90ZS5hdHRycy5pZF0gPSB2ZXhOb3RlLm5vdGVEYXRhLnN0YXZlTm90ZTtcclxuICAgICAgdGhpcy52ZXhOb3Rlcy5wdXNoKHZleE5vdGUubm90ZURhdGEuc3RhdmVOb3RlKTtcclxuXHJcbiAgICAgIGlmICh2ZXhOb3RlLm5vdGVEYXRhLnNtb05vdGUuY2xlZk5vdGUgJiYgIWNsZWZOb3RlQWRkZWQpIHtcclxuICAgICAgICBjb25zdCBjZiA9IG5ldyBWRi5DbGVmTm90ZSh2ZXhOb3RlLm5vdGVEYXRhLnNtb05vdGUuY2xlZk5vdGUuY2xlZiwgJ3NtYWxsJyk7XHJcbiAgICAgICAgdGhpcy52b2ljZU5vdGVzLnB1c2goY2YpO1xyXG4gICAgICAgIGNsZWZOb3RlQWRkZWQgPSB0cnVlOyAvLyBpZ25vcmUgMm5kIGluIGEgbWVhc3VyZVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudm9pY2VOb3Rlcy5wdXNoKHZleE5vdGUubm90ZURhdGEuc3RhdmVOb3RlKTtcclxuICAgICAgdGV4dE5vdGVzLmZvckVhY2goKHRuKSA9PiB7XHJcbiAgICAgICAgdGhpcy52b2ljZU5vdGVzLnB1c2goY3JlYXRlVGV4dE5vdGUoU21vT3JuYW1lbnQudGV4dE5vdGVPcm5hbWVudHNbdG4ub3JuYW1lbnRdKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoaXNOYU4oc21vTm90ZS50aWNrcy5udW1lcmF0b3IpIHx8IGlzTmFOKHNtb05vdGUudGlja3MuZGVub21pbmF0b3IpXHJcbiAgICAgICAgfHwgaXNOYU4oc21vTm90ZS50aWNrcy5yZW1haW5kZXIpKSB7XHJcbiAgICAgICAgdGhyb3cgKCd2eE1lYXN1cmU6IE5hTiBpbiB0aWNrcycpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHcm91cCB0aGUgbm90ZXMgZm9yIGJlYW1pbmcgYW5kIGNyZWF0ZSBWZXggYmVhbSBvYmplY3RzXHJcbiAgICogQHBhcmFtIHZpeCAtIHZvaWNlIGluZGV4XHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgY3JlYXRlVmV4QmVhbUdyb3Vwcyh2aXg6IG51bWJlcikge1xyXG4gICAgbGV0IGtleU5vdGVJeCA9IC0xO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IGogPSAwO1xyXG4gICAgbGV0IHN0ZW1EaXJlY3Rpb24gPSBWRi5TdGVtLkRPV047XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zbW9NZWFzdXJlLmJlYW1Hcm91cHMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgYmcgPSB0aGlzLnNtb01lYXN1cmUuYmVhbUdyb3Vwc1tpXTtcclxuICAgICAgaWYgKGJnLnZvaWNlICE9PSB2aXgpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB2ZXhOb3RlczogU3RlbW1hYmxlTm90ZVtdID0gW107XHJcbiAgICAgIGtleU5vdGVJeCA9IGJnLm5vdGVzLmZpbmRJbmRleCgobm4pID0+IG5uLm5vdGVUeXBlID09PSAnbicpO1xyXG5cclxuICAgICAgLy8gRml4IHN0ZW0gYnVnOiBrZXkgb2ZmIGZpcnN0IG5vbi1yZXN0IG5vdGUuXHJcbiAgICAgIGtleU5vdGVJeCA9IChrZXlOb3RlSXggPj0gMCkgPyBrZXlOb3RlSXggOiAwO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgYmcubm90ZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBjb25zdCBub3RlID0gYmcubm90ZXNbal07XHJcbiAgICAgICAgaWYgKG5vdGUubm90ZVR5cGUgPT09ICcvJykge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHZleE5vdGUgPSB0aGlzLm5vdGVUb1ZleE1hcFtub3RlLmF0dHJzLmlkXTtcclxuICAgICAgICAvLyBzb21lIHR5cGUgb2YgcmVkcmF3IGNvbmRpdGlvbj9cclxuICAgICAgICBpZiAoISh2ZXhOb3RlIGluc3RhbmNlb2YgVkYuU3RhdmVOb3RlIHx8IHZleE5vdGUgaW5zdGFuY2VvZiBWRi5HcmFjZU5vdGUpKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChub3RlLnRpY2tDb3VudCA+PSA0MDk2IHx8IHZleE5vdGUuZ2V0SW50cmluc2ljVGlja3MoKSA+PSA0MDk2KSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ2JhZCBsZW5ndGggaW4gYmVhbSBncm91cCcpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoa2V5Tm90ZUl4ID09PSBqKSB7XHJcbiAgICAgICAgICBzdGVtRGlyZWN0aW9uID0gbm90ZS5mbGFnU3RhdGUgPT09IFNtb05vdGUuZmxhZ1N0YXRlcy5hdXRvID9cclxuICAgICAgICAgICAgdmV4Tm90ZS5nZXRTdGVtRGlyZWN0aW9uKCkgOiB0b1ZleFN0ZW1EaXJlY3Rpb24obm90ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZleE5vdGUuc2V0U3RlbURpcmVjdGlvbihzdGVtRGlyZWN0aW9uKTtcclxuICAgICAgICB2ZXhOb3Rlcy5wdXNoKHZleE5vdGUpOyAgXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdmV4QmVhbSA9IG5ldyBWRi5CZWFtKHZleE5vdGVzKTtcclxuICAgICAgdmV4QmVhbS5icmVha1NlY29uZGFyeUF0KGJnLnNlY29uZGFyeUJlYW1CcmVha3MpO1xyXG4gICAgICB0aGlzLmJlYW1Ub1ZleE1hcFtiZy5hdHRycy5pZF0gPSB2ZXhCZWFtO1xyXG4gICAgICB0aGlzLnZleEJlYW1Hcm91cHMucHVzaCh2ZXhCZWFtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNyZWF0ZVZleFR1cGxldHModml4OiBudW1iZXIpIHtcclxuICAgIHRoaXMudmV4VHVwbGV0cyA9IFtdO1xyXG4gICAgdGhpcy50dXBsZXRUb1ZleE1hcCA9IHt9O1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNtb01lYXN1cmUudHVwbGV0VHJlZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgdHVwbGV0VHJlZSA9IHRoaXMuc21vTWVhc3VyZS50dXBsZXRUcmVlc1tpXTtcclxuICAgICAgaWYgKHR1cGxldFRyZWUudm9pY2UgIT09IHZpeCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRyYXZlcnNlVHVwbGV0VHJlZSA9ICggcGFyZW50VHVwbGV0OiBTbW9UdXBsZXQpOiB2b2lkID0+IHtcclxuICAgICAgICBjb25zdCB2ZXhOb3RlczogTm90ZVtdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgc21vTm90ZSBvZiB0aGlzLnNtb01lYXN1cmUudHVwbGV0Tm90ZXMocGFyZW50VHVwbGV0KSkge1xyXG4gICAgICAgICAgdmV4Tm90ZXMucHVzaCh0aGlzLm5vdGVUb1ZleE1hcFtzbW9Ob3RlLmF0dHJzLmlkXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIElmIHRoZSB0dXBsZXQgaGFzIGJlZW4gZGVsZXRlZCwgdGhlIG1lYXN1cmUgbWlnaHQgbm90IGJlIHVwZGF0ZWQuXHJcbiAgICAgICAgaWYgKHZleE5vdGVzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLnNtb01lYXN1cmUuZ2V0U3RlbURpcmVjdGlvbkZvclR1cGxldChwYXJlbnRUdXBsZXQpID09PSBTbW9Ob3RlLmZsYWdTdGF0ZXMudXAgP1xyXG4gICAgICAgICAgVkYuVHVwbGV0LkxPQ0FUSU9OX1RPUCA6IFZGLlR1cGxldC5MT0NBVElPTl9CT1RUT007XHJcbiAgICAgICAgY29uc3Qgc21vVHVwbGV0UGFyYW1zID0ge1xyXG4gICAgICAgICAgdmV4Tm90ZXMsXHJcbiAgICAgICAgICBudW1Ob3RlczogcGFyZW50VHVwbGV0Lm51bU5vdGVzLFxyXG4gICAgICAgICAgbm90ZXNPY2N1cGllZDogcGFyZW50VHVwbGV0Lm5vdGVzT2NjdXBpZWQsXHJcbiAgICAgICAgICByYXRpb2VkOiBwYXJlbnRUdXBsZXQucmF0aW9lZCxcclxuICAgICAgICAgIGJyYWNrZXRlZDogcGFyZW50VHVwbGV0LmJyYWNrZXRlZCxcclxuICAgICAgICAgIGxvY2F0aW9uXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHZleFR1cGxldCA9IGdldFZleFR1cGxldHMoc21vVHVwbGV0UGFyYW1zKTtcclxuXHJcbiAgICAgICAgdGhpcy50dXBsZXRUb1ZleE1hcFtwYXJlbnRUdXBsZXQuYXR0cnMuaWRdID0gdmV4VHVwbGV0O1xyXG4gICAgICAgIHRoaXMudmV4VHVwbGV0cy5wdXNoKHZleFR1cGxldCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRUdXBsZXQuY2hpbGRyZW5UdXBsZXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCB0dXBsZXQgPSBwYXJlbnRUdXBsZXQuY2hpbGRyZW5UdXBsZXRzW2ldO1xyXG4gICAgICAgICAgdHJhdmVyc2VUdXBsZXRUcmVlKHR1cGxldCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRyYXZlcnNlVHVwbGV0VHJlZSh0dXBsZXRUcmVlLnR1cGxldCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBjcmVhdGUgdGhlIG1vZGlmaWVycyBmb3IgdGhlIHN0YXZlIGl0c2VsZiwgYmFyIGxpbmVzIGV0Yy5cclxuICAgKi9cclxuICBjcmVhdGVNZWFzdXJlTW9kaWZpZXJzKCkge1xyXG4gICAgY29uc3Qgc2IgPSB0aGlzLnNtb01lYXN1cmUuZ2V0U3RhcnRCYXJsaW5lKCk7XHJcbiAgICBjb25zdCBlYiA9IHRoaXMuc21vTWVhc3VyZS5nZXRFbmRCYXJsaW5lKCk7XHJcbiAgICBjb25zdCBzeW0gPSB0aGlzLnNtb01lYXN1cmUuZ2V0UmVwZWF0U3ltYm9sKCk7XHJcbiAgICBpZiAoIXRoaXMuc3RhdmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRvbid0IGNyZWF0ZSBhIGJlZ2luIGJhciBmb3IgYW55IGJ1dCB0aGUgMXN0IG1lYXN1cmUuXHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLm1lYXN1cmVOdW1iZXIuc3lzdGVtSW5kZXggIT09IDAgJiYgc2IuYmFybGluZSA9PT0gU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXJcclxuICAgICAgJiYgdGhpcy5zbW9NZWFzdXJlLmZvcm1hdC5wYWRMZWZ0ID09PSAwKSB7XHJcbiAgICAgIHRoaXMuc3RhdmUuc2V0QmVnQmFyVHlwZShWRi5CYXJsaW5lLnR5cGUuTk9ORSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0YXZlLnNldEJlZ0JhclR5cGUodG9WZXhCYXJsaW5lVHlwZShzYikpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcubXVsdGltZWFzdXJlTGVuZ3RoID4gMCAmJiAhdGhpcy5zbW9NZWFzdXJlLnN2Zy5oaWRlTXVsdGltZWFzdXJlKSB7XHJcbiAgICAgIHRoaXMuc3RhdmUuc2V0RW5kQmFyVHlwZSh2ZXhCYXJsaW5lVHlwZVt0aGlzLnNtb01lYXN1cmUuc3ZnLm11bHRpbWVhc3VyZUVuZEJhcmxpbmVdKTtcclxuICAgIH0gZWxzZSBpZiAoZWIuYmFybGluZSAhPT0gU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXIpIHtcclxuICAgICAgdGhpcy5zdGF2ZS5zZXRFbmRCYXJUeXBlKHRvVmV4QmFybGluZVR5cGUoZWIpKTtcclxuICAgIH1cclxuICAgIGlmIChzeW0gJiYgc3ltLnN5bWJvbCAhPT0gU21vUmVwZWF0U3ltYm9sLnN5bWJvbHMuTm9uZSkge1xyXG4gICAgICBjb25zdCByZXAgPSBuZXcgVkYuUmVwZXRpdGlvbih0b1ZleFN5bWJvbChzeW0pLCBzeW0ueE9mZnNldCArIHRoaXMuc21vTWVhc3VyZS5zdGFmZlgsIHN5bS55T2Zmc2V0KTtcclxuICAgICAgdGhpcy5zdGF2ZS5nZXRNb2RpZmllcnMoKS5wdXNoKHJlcCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0bXMgPSB0aGlzLnNtb01lYXN1cmUuZ2V0TWVhc3VyZVRleHQoKTtcclxuICAgIC8vIFRPRE86IHNldCBmb250XHJcbiAgICB0bXMuZm9yRWFjaCgodG1iOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRtID0gdG1iIGFzIFNtb01lYXN1cmVUZXh0O1xyXG4gICAgICBjb25zdCBvZmZzZXQgPSB0bS5wb3NpdGlvbiA9PT0gU21vTWVhc3VyZVRleHQucG9zaXRpb25zLmxlZnQgPyB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQgOiAwO1xyXG4gICAgICBjb25zdCBzdGF2ZVRleHQgPSBjcmVhdGVTdGF2ZVRleHQodG0udGV4dCwgdG9WZXhUZXh0UG9zaXRpb24odG0pLCBcclxuICAgICAge1xyXG4gICAgICAgIHNoaWZ0WDogdG0uYWRqdXN0WCArIG9mZnNldCwgc2hpZnRZOiB0bS5hZGp1c3RZLCBqdXN0aWZpY2F0aW9uOiB0b1ZleFRleHRKdXN0aWZpY2F0aW9uKHRtKVxyXG4gICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc3RhdmU/LmFkZE1vZGlmaWVyKHN0YXZlVGV4dCk7XHJcblxyXG4gICAgICAvLyBoYWNrIC0gd2UgY2FuJ3QgY3JlYXRlIHN0YXZlVGV4dCBkaXJlY3RseSBzbyB0aGlzIGlzIHRoZSBvbmx5IHdheSBJIGNvdWxkIHNldCB0aGUgZm9udFxyXG4gICAgICBjb25zdCBhciA9IHRoaXMuc3RhdmUhLmdldE1vZGlmaWVycygpO1xyXG4gICAgICBjb25zdCB2bSA9IGFyW2FyLmxlbmd0aCAtIDFdO1xyXG4gICAgICB2bS5zZXRGb250KHRtLmZvbnRJbmZvKTtcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcucm93SW5TeXN0ZW0gPT09IDApIHtcclxuICAgICAgY29uc3Qgcm1iID0gdGhpcy5zbW9NZWFzdXJlLmdldFJlaGVhcnNhbE1hcmsoKTtcclxuICAgICAgY29uc3Qgcm0gPSBybWIgYXMgU21vUmVoZWFyc2FsTWFyaztcclxuICAgICAgaWYgKHJtKSB7XHJcbiAgICAgICAgdGhpcy5zdGF2ZS5zZXRTZWN0aW9uKHJtLnN5bWJvbCwgMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0ZW1wbyA9IHRoaXMuc21vTWVhc3VyZS5nZXRUZW1wbygpO1xyXG4gICAgaWYgKHRlbXBvICYmIHRoaXMuc21vTWVhc3VyZS5zdmcuZm9yY2VUZW1wbykge1xyXG4gICAgICB0aGlzLnN0YXZlLnNldFRlbXBvKHRlbXBvLnRvVmV4VGVtcG8oKSwgLTEgKiB0ZW1wby55T2Zmc2V0KTtcclxuICAgICAgY29uc3QgdmV4VGVtcG8gPSB0aGlzLnN0YXZlLmdldE1vZGlmaWVycygpLmZpbmQoKG1vZDogU3RhdmVNb2RpZmllcikgPT4gbW9kLmdldEF0dHJpYnV0ZSgndHlwZScpID09PSAnU3RhdmVUZW1wbycpO1xyXG4gICAgICBpZiAodmV4VGVtcG8pIHtcclxuICAgICAgICB2ZXhUZW1wby5zZXRGb250KHsgZmFtaWx5OiBTb3VyY2VTZXJpZlByb0ZvbnQuZm9udEZhbWlseSwgc2l6ZTogMTMsIHdlaWdodDogJ2JvbGQnIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYWxsIFZleCBub3RlcyBhbmQgbW9kaWZpZXJzLiAgV2UgZGVmZXIgdGhlIGZvcm1hdCBhbmQgcmVuZGVyaW5nIHNvXHJcbiAgICogd2UgY2FuIGFsaWduIGFjcm9zcyBtdWx0aXBsZSBzdGF2ZXNcclxuICAgKi9cclxuICBwcmVGb3JtYXQoKSB7XHJcbiAgICB2YXIgaiA9IDA7XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5lbGVtZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcuZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy5lbGVtZW50ID0gbnVsbDtcclxuICAgICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcudGFiRWxlbWVudCkge1xyXG4gICAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcudGFiRWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLnNtb01lYXN1cmUuc3ZnLnRhYkVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLmhpZGVFbXB0eU1lYXN1cmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gTm90ZTogbmVlZCB0byBkbyB0aGlzIHRvIGdldCBpdCBpbnRvIFZFWCBLUyBmb3JtYXRcclxuICAgIGNvbnN0IHN0YWZmWCA9IHRoaXMuc21vTWVhc3VyZS5zdGFmZlggKyB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQ7XHJcbiAgICBjb25zdCBzdGFmZlkgPSB0aGlzLnNtb01lYXN1cmUuc3RhZmZZIC0gdGhpcy5jb250ZXh0LmJveC55O1xyXG4gICAgY29uc3Qga2V5ID0gU21vTXVzaWMudmV4S2V5U2lnbmF0dXJlVHJhbnNwb3NlKHRoaXMuc21vTWVhc3VyZS5rZXlTaWduYXR1cmUsIDApO1xyXG4gICAgY29uc3QgY2FuY2VsZWRLZXkgPSBTbW9NdXNpYy52ZXhLZXlTaWduYXR1cmVUcmFuc3Bvc2UodGhpcy5zbW9NZWFzdXJlLmNhbmNlbGVkS2V5U2lnbmF0dXJlLCAwKTtcclxuICAgIGNvbnN0IHNtb1ZleFN0YXZlUGFyYW1zID0ge1xyXG4gICAgICB4OiBzdGFmZlgsXHJcbiAgICAgIHk6IHN0YWZmWSxcclxuICAgICAgcGFkTGVmdDogdGhpcy5zbW9NZWFzdXJlLmZvcm1hdC5wYWRMZWZ0LFxyXG4gICAgICBpZDogdGhpcy5zbW9NZWFzdXJlLmlkLFxyXG4gICAgICBzdGFmZlg6IHRoaXMuc21vTWVhc3VyZS5zdGFmZlgsXHJcbiAgICAgIHN0YWZmWTogdGhpcy5zbW9NZWFzdXJlLnN0YWZmWSxcclxuICAgICAgc3RhZmZXaWR0aDogdGhpcy5zbW9NZWFzdXJlLnN0YWZmV2lkdGgsXHJcbiAgICAgIGZvcmNlQ2xlZjogdGhpcy5zbW9NZWFzdXJlLnN2Zy5mb3JjZUNsZWYsXHJcbiAgICAgIGNsZWY6IHRoaXMuc21vTWVhc3VyZS5jbGVmLFxyXG4gICAgICBmb3JjZUtleTogdGhpcy5zbW9NZWFzdXJlLnN2Zy5mb3JjZUtleVNpZ25hdHVyZSxcclxuICAgICAga2V5LFxyXG4gICAgICBjYW5jZWxlZEtleSxcclxuICAgICAgc3RhcnRYOiB0aGlzLnNtb01lYXN1cmUuc3ZnLm1heENvbHVtblN0YXJ0WCxcclxuICAgICAgYWRqWDogdGhpcy5zbW9NZWFzdXJlLnN2Zy5hZGpYLFxyXG4gICAgICBsaW5lczogdGhpcy5zbW9NZWFzdXJlLmxpbmVzLFxyXG4gICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpXHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXZlID0gY3JlYXRlU3RhdmUoc21vVmV4U3RhdmVQYXJhbXMpO1xyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcuZm9yY2VUaW1lU2lnbmF0dXJlKSB7XHJcbiAgICAgIGNvbnN0IHRzID0gdGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmU7XHJcbiAgICAgIGxldCB0c1N0cmluZyA9IHRzLnRpbWVTaWduYXR1cmU7XHJcbiAgICAgIGlmICh0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS51c2VTeW1ib2wgJiYgdHMuYWN0dWFsQmVhdHMgPT09IDQgJiYgdHMuYmVhdER1cmF0aW9uID09PSA0KSB7XHJcbiAgICAgICAgdHNTdHJpbmcgPSAnQyc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmUudXNlU3ltYm9sICYmIHRzLmFjdHVhbEJlYXRzID09PSAyICYmIHRzLmJlYXREdXJhdGlvbiA9PT0gNCkge1xyXG4gICAgICAgIHRzU3RyaW5nID0gJ0N8JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS5kaXNwbGF5U3RyaW5nLmxlbmd0aCkge1xyXG4gICAgICAgIHRzU3RyaW5nID0gdGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmUuZGlzcGxheVN0cmluZztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnN0YXZlLmFkZFRpbWVTaWduYXR1cmUodHNTdHJpbmcpO1xyXG4gICAgfVxyXG4gICAgLy8gQ29ubmVjdCBpdCB0byB0aGUgcmVuZGVyaW5nIGNvbnRleHQgYW5kIGRyYXchXHJcbiAgICB0aGlzLnN0YXZlLnNldENvbnRleHQodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSk7XHJcbiAgICBpZiAodGhpcy5zbW9UYWJTdGF2ZSAmJiB0aGlzLnNtb01lYXN1cmUuc3ZnLnRhYlN0YXZlQm94Py53aWR0aCkge1xyXG4gICAgICBjb25zdCBib3ggPSB0aGlzLnNtb01lYXN1cmUuc3ZnLnRhYlN0YXZlQm94O1xyXG4gICAgICBsZXQgdGFiV2lkdGggPSAwO1xyXG4gICAgICBib3gueSAtPSB0aGlzLmNvbnRleHQuYm94Lnk7XHJcbiAgICAgIGJveC54ID0gc3RhZmZYIC0gdGhpcy5jb250ZXh0LmJveC54O1xyXG4gICAgICBib3gud2lkdGggPSB0aGlzLnNtb01lYXN1cmUuc3RhZmZXaWR0aDtcclxuICAgICAgdGhpcy50YWJTdGF2ZSA9IGNyZWF0ZVRhYlN0YXZlKGJveCwgdGhpcy5zbW9UYWJTdGF2ZS5zcGFjaW5nLCB0aGlzLnNtb1RhYlN0YXZlLm51bUxpbmVzKTtcclxuICAgICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcuZm9yY2VDbGVmKSB7XHJcbiAgICAgICAgdGhpcy50YWJTdGF2ZS5hZGRUYWJHbHlwaCgpO1xyXG4gICAgICAgIHRhYldpZHRoID0gdmV4R2x5cGguZGltZW5zaW9uc1sndGFiJ10ud2lkdGg7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50YWJTdGF2ZS5zZXROb3RlU3RhcnRYKHRoaXMudGFiU3RhdmUuZ2V0Tm90ZVN0YXJ0WCgpICsgdGhpcy5zbW9NZWFzdXJlLnN2Zy5hZGpYIC0gdGFiV2lkdGgpO1xyXG4gICAgICB0aGlzLnRhYlN0YXZlLnNldENvbnRleHQodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jcmVhdGVNZWFzdXJlTW9kaWZpZXJzKCk7XHJcblxyXG4gICAgdGhpcy50aWNrbWFwT2JqZWN0ID0gdGhpcy5zbW9NZWFzdXJlLmNyZWF0ZU1lYXN1cmVUaWNrbWFwcygpO1xyXG4gICAgdGhpcy5jcmVhdGVDb2xsaXNpb25UaWNrbWFwKCk7XHJcblxyXG4gICAgdGhpcy52b2ljZUFyID0gW107XHJcbiAgICB0aGlzLnZleE5vdGVzID0gW107XHJcbiAgICB0aGlzLm5vdGVUb1ZleE1hcCA9IHt9O1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSB2b2ljZXMsIGFkZCB0aGVtIGFsbCB0byB0aGUgZm9ybWF0dGVyIGF0IHRoZSBzYW1lIHRpbWUgc28gdGhleSBkb24ndCBjb2xsaWRlXHJcbiAgICBmb3IgKGogPSAwOyBqIDwgdGhpcy5zbW9NZWFzdXJlLnZvaWNlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICBjb25zdCBzbW9WZXhWb2ljZVBhcmFtcyA9IHtcclxuICAgICAgICBhY3R1YWxCZWF0czogdGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmUuYWN0dWFsQmVhdHMsXHJcbiAgICAgICAgYmVhdER1cmF0aW9uOiB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS5iZWF0RHVyYXRpb24sXHJcbiAgICAgICAgbm90ZXM6IHRoaXMudmV4Tm90ZXNcclxuICAgICAgfVxyXG4gICAgaWYgKCF0aGlzLnNtb01lYXN1cmUuc3ZnLm11bHRpbWVhc3VyZUxlbmd0aCAmJiAhdGhpcy5zbW9NZWFzdXJlLnJlcGVhdFN5bWJvbCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlVmV4Tm90ZXMoaik7XHJcbiAgICAgICAgc21vVmV4Vm9pY2VQYXJhbXMubm90ZXMgPSB0aGlzLnZvaWNlTm90ZXM7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVWZXhUdXBsZXRzKGopO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlVmV4QmVhbUdyb3VwcyhqKTtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgdm9pY2UgaW4gNC80IGFuZCBhZGQgYWJvdmUgbm90ZXNcclxuICAgICAgICBjb25zdCB2b2ljZSA9IGNyZWF0ZVZvaWNlKHNtb1ZleFZvaWNlUGFyYW1zKTtcclxuICAgICAgICB0aGlzLnZvaWNlQXIucHVzaCh2b2ljZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuc21vTWVhc3VyZS5yZXBlYXRTeW1ib2wpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZVJlcGVhdFN5bWJvbCgpO1xyXG4gICAgICAgIC8vIENyZWF0ZSBhIHZvaWNlIGluIDQvNCBhbmQgYWRkIGFib3ZlIG5vdGVzXHJcbiAgICAgICAgY29uc3Qgdm9pY2UgPSBjcmVhdGVWb2ljZShzbW9WZXhWb2ljZVBhcmFtcyk7XHJcbiAgICAgICAgdGhpcy52b2ljZUFyLnB1c2godm9pY2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBOZWVkIHRvIGZvcm1hdCBmb3IgeCBwb3NpdGlvbiwgdGhlbiBzZXQgeSBwb3NpdGlvbiBiZWZvcmUgZHJhd2luZyBkeW5hbWljcy5cclxuICAgIHRoaXMuZm9ybWF0dGVyID0gbmV3IFZGLkZvcm1hdHRlcih7IHNvZnRtYXhGYWN0b3I6IHRoaXMuc29mdG1heCwgZ2xvYmFsU29mdG1heDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLmZvcm1hdHRlci5qb2luVm9pY2VzKHRoaXMudm9pY2VBcik7XHJcbiAgICBpZiAodGhpcy50YWJTdGF2ZSkge1xyXG4gICAgICB0aGlzLnRhYlZvaWNlID0gY3JlYXRlVm9pY2Uoe1xyXG4gICAgICAgIGFjdHVhbEJlYXRzOiB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS5hY3R1YWxCZWF0cyxcclxuICAgICAgICBiZWF0RHVyYXRpb246IHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLmJlYXREdXJhdGlvbixcclxuICAgICAgICBub3RlczogdGhpcy50YWJOb3Rlc1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5mb3JtYXR0ZXIuam9pblZvaWNlcyhbdGhpcy50YWJWb2ljZV0pO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBDcmVhdGUgdGhlIFZleCBmb3JtYXR0ZXIgdGhhdCBjYWxjdWxhdGVzIHRoZSBYIGFuZCBZIHBvc2l0aW9ucyBvZiB0aGUgbm90ZXMuICBBIGZvcm1hdHRlclxyXG4gICAqIG1heSBhY3R1YWxseSBzcGFuIG11bHRpcGxlIHN0YXZlcyBmb3IganVzdGlmaWVkIHN0YXZlcy4gIFRoZSBub3RlcyBhcmUgZHJhd24gaW4gdGhlaXJcclxuICAgKiBpbmRpdmlkdWFsIHZ4TWVhc3VyZSBvYmplY3RzIGJ1dCBmb3JtYXR0aW5nIGlzIGRvbmUgb25jZSBmb3IgYWxsIGp1c3RpZmllZCBzdGF2ZXNcclxuICAgKiBAcGFyYW0gdm9pY2VzIFZvaWNlIG9iamVjdHMgZnJvbSBWZXhGbG93XHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZm9ybWF0KHZvaWNlczogVm9pY2VbXSkge1xyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcuaGlkZUVtcHR5TWVhc3VyZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcubXVsdGltZWFzdXJlTGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLm11bHRpbWVhc3VyZVJlc3QgPSBnZXRNdWx0aW1lYXN1cmVSZXN0KHRoaXMuc21vTWVhc3VyZS5zdmcubXVsdGltZWFzdXJlTGVuZ3RoKTtcclxuICAgICAgdGhpcy5tdWx0aW1lYXN1cmVSZXN0LnNldENvbnRleHQodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSk7XHJcbiAgICAgIHRoaXMubXVsdGltZWFzdXJlUmVzdC5zZXRTdGF2ZSh0aGlzLnN0YXZlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmZvcm1hdHRlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnZhbHVlT2YoKTtcclxuICAgIGNvbnN0IHN0YWZmV2lkdGggPSB0aGlzLnNtb01lYXN1cmUuc3RhZmZXaWR0aCAtXHJcbiAgICAgICh0aGlzLnNtb01lYXN1cmUuc3ZnLm1heENvbHVtblN0YXJ0WCArIHRoaXMuc21vTWVhc3VyZS5zdmcuYWRqUmlnaHQgKyB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQpIC0gMTA7XHJcbiAgICB0aGlzLmRiZ0xlZnRYID0gdGhpcy5zbW9NZWFzdXJlLnN0YWZmWCArICB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQgKyB0aGlzLnNtb01lYXN1cmUuc3ZnLmFkalg7XHJcbiAgICB0aGlzLmRiZ1dpZHRoID0gc3RhZmZXaWR0aDtcclxuICAgIHRoaXMuZm9ybWF0dGVyLmZvcm1hdCh2b2ljZXMsIHN0YWZmV2lkdGgpO1xyXG4gICAgaWYgKHRoaXMudGFiVm9pY2UgJiYgdGhpcy50YWJOb3Rlcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5mb3JtYXR0ZXIuZm9ybWF0KFt0aGlzLnRhYlZvaWNlXSwgc3RhZmZXaWR0aCk7XHJcbiAgICB9XHJcbiAgICBsYXlvdXREZWJ1Zy5zZXRUaW1lc3RhbXAobGF5b3V0RGVidWcuY29kZVJlZ2lvbnMuRk9STUFULCBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHRpbWVzdGFtcCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHJlbmRlciBpcyBjYWxsZWQgYWZ0ZXIgZm9ybWF0LiAgQWN0dWFsbHkgZHJhdyB0aGUgdGhpbmdzLlxyXG4gICAqL1xyXG4gIHJlbmRlcigpIHtcclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLmhpZGVFbXB0eU1lYXN1cmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBncm91cCA9IHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkub3Blbkdyb3VwKCkgYXMgU1ZHU1ZHRWxlbWVudDtcclxuICAgIHZhciBtbUNsYXNzID0gdGhpcy5zbW9NZWFzdXJlLmdldENsYXNzSWQoKTtcclxuICAgIHZhciBqID0gMDtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGJvdW5kIGVhY2ggbWVhc3VyZSBpbiBpdHMgb3duIFNWRyBncm91cCBmb3IgZWFzeSBkZWxldGlvbiBhbmQgbWFwcGluZyB0byBzY3JlZW4gY29vcmRpbmF0ZVxyXG4gICAgICBncm91cC5jbGFzc0xpc3QuYWRkKHRoaXMuc21vTWVhc3VyZS5pZCk7XHJcbiAgICAgIGdyb3VwLmNsYXNzTGlzdC5hZGQobW1DbGFzcyk7XHJcbiAgICAgIGdyb3VwLmlkID0gdGhpcy5zbW9NZWFzdXJlLmlkO1xyXG4gICAgICB0aGlzLnN0YXZlIS5kcmF3KCk7XHJcbiAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcuZWxlbWVudCA9IGdyb3VwO1xyXG5cclxuICAgICAgZm9yIChqID0gMDsgaiA8IHRoaXMudm9pY2VBci5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIHRoaXMudm9pY2VBcltqXS5kcmF3KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCksIHRoaXMuc3RhdmUhKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnZleEJlYW1Hcm91cHMuZm9yRWFjaCgoYikgPT4ge1xyXG4gICAgICAgIGIuc2V0Q29udGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpKS5kcmF3KCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy52ZXhUdXBsZXRzLmZvckVhY2goKHR1cGxldCkgPT4ge1xyXG4gICAgICAgIHR1cGxldC5zZXRDb250ZXh0KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkpLmRyYXcoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmICh0aGlzLm11bHRpbWVhc3VyZVJlc3QpIHtcclxuICAgICAgICB0aGlzLm11bHRpbWVhc3VyZVJlc3QuZHJhdygpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHRoaXMuX3VwZGF0ZUx5cmljRG9tU2VsZWN0b3JzKCk7XHJcbiAgICAgIHRoaXMucmVuZGVyRHluYW1pY3MoKTtcclxuICAgICAgLy8gdGhpcy5zbW9NZWFzdXJlLmFkalggPSB0aGlzLnN0YXZlLnN0YXJ0X3ggLSAodGhpcy5zbW9NZWFzdXJlLnN0YWZmWCk7XHJcblxyXG4gICAgICB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLmNsb3NlR3JvdXAoKTtcclxuICAgICAgaWYgKHRoaXMudGFiU3RhdmUpIHtcclxuICAgICAgICBjb25zdCB0YWJTdGF2ZUlkID0gYCR7dGhpcy5zbW9NZWFzdXJlLmlkfS10YWJgO1xyXG4gICAgICAgIGNvbnN0IHRhYkdyb3VwID0gdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5vcGVuR3JvdXAoKSBhcyBTVkdTVkdFbGVtZW50O1xyXG4gICAgICAgIHRhYkdyb3VwLmNsYXNzTGlzdC5hZGQodGFiU3RhdmVJZCk7XHJcbiAgICAgICAgdGhpcy50YWJTdGF2ZS5kcmF3KCk7XHJcbiAgICAgICAgdGhpcy50YWJWb2ljZT8uZHJhdyh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLCB0aGlzLnRhYlN0YXZlKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLmNsb3NlR3JvdXAoKTtcclxuICAgICAgICB0aGlzLnNtb01lYXN1cmUuc3ZnLnRhYkVsZW1lbnQgPSB0YWJHcm91cDtcclxuICAgICAgfVxyXG4gICAgICAvLyBsYXlvdXREZWJ1Zy5zZXRUaW1lc3RhbXAobGF5b3V0RGVidWcuY29kZVJlZ2lvbnMuUkVOREVSLCBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHRpbWVzdGFtcCk7XHJcblxyXG4gICAgICB0aGlzLnJlbmRlcmVkID0gdHJ1ZTtcclxuICAgICAgaWYgKGxheW91dERlYnVnLm1hc2sgJiBsYXlvdXREZWJ1Zy52YWx1ZXNbJ2FkanVzdCddKSB7XHJcbiAgICAgICAgU3ZnSGVscGVycy5kZWJ1Z0JveE5vVGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLnN2ZyxcclxuICAgICAgICBTdmdIZWxwZXJzLmJveFBvaW50cyh0aGlzLmRiZ0xlZnRYLCBcclxuICAgICAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcuc3RhZmZZLCB0aGlzLmRiZ1dpZHRoLCA0MCksICdyZW5kZXIteC1kYmcnLCAwKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXhjKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybigndW5hYmxlIHRvIHJlbmRlciBtZWFzdXJlICcgKyB0aGlzLnNtb01lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXgpO1xyXG4gICAgICB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLmNsb3NlR3JvdXAoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/render/vex/vxMeasure.ts\n\n}");
471
471
 
472
472
  /***/ }),
473
473
 
@@ -511,7 +511,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
511
511
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
512
512
 
513
513
  "use strict";
514
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SmoMeasure: () => (/* binding */ SmoMeasure),\n/* harmony export */ SmoMeasureNumberParams: () => (/* binding */ SmoMeasureNumberParams),\n/* harmony export */ SmoMeasureStringParams: () => (/* binding */ SmoMeasureStringParams)\n/* harmony export */ });\n/* harmony import */ var _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../common/serializationHelpers */ \"./src/common/serializationHelpers.js\");\n/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _measureModifiers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./note */ \"./src/smo/data/note.ts\");\n/* harmony import */ var _tuplet__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tuplet */ \"./src/smo/data/tuplet.ts\");\n/* harmony import */ var _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../render/sui/layoutDebug */ \"./src/render/sui/layoutDebug.ts\");\n/* harmony import */ var _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../render/sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _xform_tickMap__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../xform/tickMap */ \"./src/smo/xform/tickMap.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _xform_selections__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../xform/selections */ \"./src/smo/xform/selections.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * Contains definition and supporting classes for {@link SmoMeasure}.\n * Most of the engraving is done at the measure level. Measure contains multiple (at least 1)\n * voices, which in turn contain notes. Each measure also contains formatting information. This\n * is mostly serialized outside of measure (in score), since columns and often an entire region\n * share measure formatting. Measures also contain modifiers like barlines. Tuplets and beam groups\n * are contained at the measure level.\n * @module /smo/data/measure\n */\n\n\n\n\n\n\n\n\n\n\n// @internal\nconst SmoMeasureNumberParams = ['transposeIndex', 'activeVoice', 'lines', 'repeatCount'];\n// @internal\nconst SmoMeasureStringParams = ['keySignature'];\n/**\n * Only arrays and measure numbers are serilialized with default values.\n * @param params - result of serialization\n * @returns\n */\nfunction isSmoMeasureParamsSer(params) {\n var _a;\n if (!Array.isArray(params.voices) ||\n !Array.isArray(params.tupletTrees) || !Array.isArray(params.modifiers) ||\n typeof ((_a = params === null || params === void 0 ? void 0 : params.measureNumber) === null || _a === void 0 ? void 0 : _a.measureIndex) !== 'number') {\n return false;\n }\n return true;\n}\n/**\n * Data for a measure of music. Many rules of musical engraving are\n * enforced at a measure level: the duration of notes, accidentals, etc.\n *\n * Measures contain {@link SmoNote}, {@link SmoTuplet}, and {@link SmoBeamGroup}\n * Measures are contained in {@link SmoSystemStaff}\n * @category SmoObject\n */\nclass SmoMeasure {\n static get timeSignatureDefault() {\n return new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults);\n }\n /**\n * Default constructor parameters. Defaults are always copied so the\n * caller can modify them to create a new measure.\n * @returns constructor params for a new measure\n */\n static get defaults() {\n const proto = JSON.parse(JSON.stringify(SmoMeasure._defaults));\n proto.format = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults);\n proto.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n proto.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n proto.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n return proto;\n }\n // @ignore\n static convertLegacyTimeSignature(ts) {\n const rv = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults);\n rv.timeSignature = ts;\n return rv;\n }\n /**\n * Fill in components. We assume the modifiers are already constructed,\n * e.g. by deserialize or the calling function.\n * @param params\n */\n constructor(params) {\n this.timeSignature = SmoMeasure.timeSignatureDefault;\n /**\n * Overrides display of actual time signature, in the case of\n * pick-up notes where the actual and displayed durations are different\n */\n this.keySignature = '';\n this.canceledKeySignature = '';\n this.tupletTrees = [];\n this.repeatSymbol = false;\n this.repeatCount = 0;\n this.ctor = 'SmoMeasure';\n /**\n * Adjust for non-concert pitch intstruments\n */\n this.transposeIndex = 0;\n this.modifiers = [];\n /**\n * Row, column, and custom numbering information about this measure.\n */\n this.measureNumber = {\n localIndex: 0,\n systemIndex: 0,\n measureIndex: 0,\n staffId: 0\n };\n this.clef = 'treble';\n this.voices = [];\n /**\n * the active voice in the editor, if there are multiple voices\n * */\n this.activeVoice = 0;\n this.beamGroups = [];\n this.lines = 5;\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n this.svg = {\n staffWidth: 0,\n unjustifiedWidth: 0,\n staffX: 0,\n staffY: 0,\n logicalBox: {\n x: 0, y: 0, width: 0, height: 0\n },\n yTop: 0,\n adjX: 0,\n maxColumnStartX: 0,\n adjRight: 0,\n history: [],\n lineIndex: 0,\n pageIndex: 0,\n rowInSystem: 0,\n forceClef: false,\n forceKeySignature: false,\n forceTimeSignature: false,\n forceTempo: false,\n hideEmptyMeasure: false,\n hideMultimeasure: false,\n multimeasureLength: 0,\n multimeasureEndBarline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines['singleBar'],\n element: null\n };\n const defaults = SmoMeasure.defaults;\n SmoMeasureNumberParams.forEach((param) => {\n if (typeof (params[param]) !== 'undefined') {\n this[param] = params[param];\n }\n });\n SmoMeasureStringParams.forEach((param) => {\n this[param] = params[param] ? params[param] : defaults[param];\n });\n this.clef = params.clef;\n this.repeatSymbol = params.repeatSymbol;\n this.measureNumber = JSON.parse(JSON.stringify(params.measureNumber));\n if (params.tempo) {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(params.tempo);\n }\n // Handle legacy time signature format\n if (params.timeSignature) {\n const tsAny = params.timeSignature;\n if (typeof (tsAny) === 'string') {\n this.timeSignature = SmoMeasure.convertLegacyTimeSignature(tsAny);\n }\n else {\n this.timeSignature = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.createFromPartial(tsAny);\n }\n }\n this.voices = params.voices ? params.voices : [];\n this.tupletTrees = params.tupletTrees ? params.tupletTrees : [];\n this.modifiers = params.modifiers ? params.modifiers : defaults.modifiers;\n this.setDefaultBarlines();\n this.keySignature = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySigWithOffset(this.keySignature, this.transposeIndex);\n if (!(params.format)) {\n this.format = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults);\n this.format.measureIndex = this.measureNumber.measureIndex;\n }\n else {\n this.format = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(params.format);\n }\n this.id = (0,_common__WEBPACK_IMPORTED_MODULE_8__.getId)().toString();\n this.updateClefChangeNotes();\n }\n // @internal\n // used for serialization\n static get defaultAttributes() {\n return [\n 'keySignature',\n 'measureNumber',\n 'activeVoice', 'clef', 'transposeIndex',\n 'format', 'rightMargin', 'lines', 'repeatSymbol', 'repeatCount'\n ];\n }\n // @internal\n // used for serialization\n static get formattingOptions() {\n return ['customStretch', 'customProportion', 'autoJustify', 'systemBreak',\n 'pageBreak', 'padLeft'];\n }\n // @internal\n // used for serialization\n static get columnMappedAttributes() {\n return ['timeSignature', 'keySignature', 'tempo'];\n }\n static get serializableAttributes() {\n const rv = [];\n SmoMeasure.defaultAttributes.forEach((attr) => {\n if (SmoMeasure.columnMappedAttributes.indexOf(attr) < 0 && attr !== 'format') {\n rv.push(attr);\n }\n });\n return rv;\n }\n /**\n // Return true if the time signatures are the same, for display purposes (e.g. if a time sig change\n // is required)\n */\n static timeSigEqual(o1, o2) {\n return o1.timeSignature === o2.timeSignature && o1.useSymbol === o2.useSymbol;\n }\n /**\n * If there is a clef change mid-measure, update the actual clefs of the notes\n * so they display correctly.\n */\n updateClefChangeNotes() {\n let changed = false;\n let curTick = 0;\n let clefChange = this.clef;\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n curTick = 0;\n for (var j = 0; j < voice.notes.length; ++j) {\n const smoNote = voice.notes[j];\n smoNote.clef = this.clef;\n if (smoNote.clefNote && smoNote.clefNote.clef !== this.clef) {\n clefChange = smoNote.clefNote.clef;\n curTick += smoNote.tickCount;\n changed = true;\n break;\n }\n curTick += smoNote.tickCount;\n }\n if (changed) {\n break;\n }\n }\n if (!changed) {\n return;\n }\n // clefChangeTick is where the change goes. We only support\n // one per measure, others are ignored.\n const clefChangeTick = curTick;\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n curTick = 0;\n for (var j = 0; j < voice.notes.length; ++j) {\n const smoNote = voice.notes[j];\n const noteTicks = smoNote.tickCount;\n if (curTick + noteTicks >= clefChangeTick) {\n smoNote.clef = clefChange;\n }\n // Remove any redundant clef changes later in the measure\n if (curTick + noteTicks > clefChangeTick) {\n if (smoNote.clefNote && smoNote.clefNote.clef === clefChange) {\n smoNote.clefNote = null;\n }\n }\n curTick += noteTicks;\n }\n }\n }\n /**\n * @internal\n * @returns column mapped parameters, serialized. caller will\n * decide if the parameters need to be persisted\n */\n serializeColumnMapped() {\n //\n return {\n timeSignature: this.timeSignature.serialize(),\n keySignature: this.keySignature,\n tempo: this.tempo.serialize()\n };\n }\n getColumnMapped() {\n return {\n timeSignature: this.timeSignature,\n keySignature: this.keySignature,\n tempo: this.tempo\n };\n }\n /**\n * Convert this measure object to a JSON object, recursively serializing all the notes,\n * note modifiers, etc.\n */\n serialize() {\n const params = { \"ctor\": \"SmoMeasure\" };\n let ser = true;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMergeNonDefault(SmoMeasure.defaults, SmoMeasure.serializableAttributes, this, params);\n // Don't serialize default things\n const fmt = this.format.serialize();\n // measure number can't be defaulted b/c tempos etc. can map to default measure\n params.measureNumber = JSON.parse(JSON.stringify(this.measureNumber));\n params.tupletTrees = [];\n params.voices = [];\n params.modifiers = [];\n this.tupletTrees.forEach((tupletTree) => {\n params.tupletTrees.push(tupletTree.serialize());\n });\n this.voices.forEach((voice) => {\n const obj = {\n notes: []\n };\n voice.notes.forEach((note) => {\n obj.notes.push(note.serialize());\n });\n params.voices.push(obj);\n });\n this.modifiers.forEach((modifier) => {\n ser = true;\n /* don't serialize default modifiers */\n if (modifier.ctor === 'SmoBarline' && modifier.position === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start &&\n modifier.barline === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar) {\n ser = false;\n }\n else if (modifier.ctor === 'SmoBarline' && modifier.position === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end\n && modifier.barline === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar) {\n ser = false;\n }\n else if (modifier.ctor === 'SmoTempoText') {\n // we don't save tempo text as a modifier anymore\n ser = false;\n }\n else if (modifier.ctor === 'SmoRepeatSymbol' && modifier.position === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.positions.start\n && modifier.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols.None) {\n ser = false;\n }\n if (ser) {\n params.modifiers.push(modifier.serialize());\n }\n });\n // ['timeSignature', 'keySignature', 'tempo']\n if (!isSmoMeasureParamsSer(params)) {\n throw 'invalid measure';\n }\n return params;\n }\n /**\n * Due to a bug, some tuplets have incorrect ticks. Fix it when we are deserializing the measure\n * @param voices\n * @param tupletTree\n */\n static fixTupletLengths(voices, tupletTree) {\n const voice = voices[tupletTree.voice];\n const notear = [];\n for (let i = tupletTree.startIndex; i <= tupletTree.endIndex; ++i) {\n if (voice.notes.length > i) {\n notear.push(voice.notes[i]);\n }\n }\n if (notear.length === (tupletTree.endIndex - tupletTree.startIndex + 1)) {\n const tickSum = notear.map((x) => x.tickCount).reduce((a, b) => a + b);\n if (tupletTree.totalTicks > tickSum) {\n notear[0].ticks.numerator += tupletTree.totalTicks - tickSum;\n }\n }\n }\n /**\n * restore a serialized measure object. Usually called as part of deserializing a score,\n * but can also be used to restore a measure due to an undo operation. Recursively\n * deserialize all the notes and modifiers to construct a new measure.\n * @param jsonObj the serialized SmoMeasure\n * @returns\n */\n static deserialize(jsonObj) {\n var _a;\n let j = 0;\n let i = 0;\n const voices = [];\n for (j = 0; j < jsonObj.voices.length; ++j) {\n const voice = jsonObj.voices[j];\n const notes = [];\n voices.push({\n notes\n });\n for (i = 0; i < voice.notes.length; ++i) {\n const noteParams = voice.notes[i];\n const smoNote = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.deserialize(noteParams);\n notes.push(smoNote);\n }\n }\n const modifiers = [];\n jsonObj.modifiers.forEach((modParams) => {\n const modifier = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureModifierBase.deserialize(modParams);\n modifiers.push(modifier);\n });\n const params = SmoMeasure.defaults;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.defaultAttributes, jsonObj, params);\n // explode column-mapped\n if (jsonObj.tempo) {\n params.tempo = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.deserialize(jsonObj.tempo);\n }\n else {\n params.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n // timeSignatureString is now part of timeSignature. upconvert old scores\n let timeSignatureString = '';\n const jsonLegacy = jsonObj;\n if (typeof (jsonLegacy.timeSignatureString) === 'string' && jsonLegacy.timeSignatureString.length > 0) {\n timeSignatureString = jsonLegacy.timeSignatureString;\n }\n if (jsonObj.timeSignature) {\n if (timeSignatureString.length) {\n jsonObj.timeSignature.displayString = timeSignatureString;\n }\n params.timeSignature = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.deserialize(jsonObj.timeSignature);\n }\n else {\n const tparams = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults;\n if (timeSignatureString.length) {\n tparams.displayString = timeSignatureString;\n }\n params.timeSignature = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(tparams);\n }\n params.keySignature = (_a = jsonObj.keySignature) !== null && _a !== void 0 ? _a : 'C';\n params.voices = voices;\n if (jsonObj.tupletTrees !== undefined) {\n for (j = 0; j < jsonObj.tupletTrees.length; ++j) {\n const tupletTreeJson = jsonObj.tupletTrees[j];\n const tupletTree = _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.deserialize(tupletTreeJson);\n params.tupletTrees.push(tupletTree);\n SmoMeasure.fixTupletLengths(voices, tupletTree);\n }\n }\n //deserialization of a legacy tuplets\n //legacy schema had measure.tuplets, it is measure.tupletTrees now\n if (jsonObj.tuplets !== undefined) {\n for (j = 0; j < jsonObj.tuplets.length; ++j) {\n const tupJson = jsonObj.tuplets[j];\n // Legacy schema had attrs.id, now it is just id\n if (tupJson.attrs && tupJson.attrs.id) {\n tupJson.id = tupJson.attrs.id;\n }\n const tupletNotes = [];\n let startIndex = null;\n params.voices.forEach((voice) => {\n voice.notes.forEach((note, index) => {\n // backwards-compatibiliity, some scores don't have attrs on tuplet\n if (typeof (tupJson.id) === 'string') {\n tupJson.attrs = { type: 'SmoTuplet', id: tupJson.id };\n }\n const id = tupJson.attrs.id;\n if (note.isTuplet && note.tupletId === id) {\n tupletNotes.push(note);\n //we cannot trust startIndex coming from legacy json\n //we need to count index of the first note in the tuplet\n if (startIndex === null) {\n startIndex = index;\n }\n }\n });\n });\n // Bug fix: A tuplet with no notes may be been overwritten\n // in a copy/paste operation\n if (tupletNotes.length > 0) {\n tupJson.notes = tupletNotes;\n tupJson.startIndex = startIndex;\n tupJson.endIndex = tupJson.startIndex + tupletNotes.length - 1;\n }\n const tuplet = _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTuplet.deserialize(tupJson);\n const tupletTree = new _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree({ tuplet: tuplet });\n params.tupletTrees.push(tupletTree);\n }\n }\n if (params.tupletTrees.length) {\n _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.syncTupletIds(params.tupletTrees, voices);\n }\n params.modifiers = modifiers;\n const measure = new SmoMeasure(params);\n // Handle migration for measure-mapped parameters\n measure.modifiers.forEach((mod) => {\n if (mod.ctor === 'SmoTempoText') {\n measure.tempo = mod;\n }\n });\n if (!measure.tempo) {\n measure.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n return measure;\n }\n static clone(measure) {\n return SmoMeasure.deserialize(measure.serialize());\n }\n static cloneForPasteOrUndo(measure) {\n const clonedMeasure = SmoMeasure.clone(measure);\n clonedMeasure.svg = measure.svg;\n // Ordinarily, the key/tempo/time is mapped to the stave, but since we are pasting measure-by\n // measure here, we want to preserve it.\n clonedMeasure.keySignature = measure.keySignature;\n clonedMeasure.timeSignature = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(measure.timeSignature);\n clonedMeasure.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(measure.tempo);\n return clonedMeasure;\n }\n /**\n * When creating a new measure, the 'default' settings can vary depending on\n * what comes before/after the measure. This determines the default pitch\n * for a clef (appears on 3rd line)\n */\n static get defaultPitchForClef() {\n return {\n 'treble': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'bass': {\n letter: 'd',\n accidental: 'n',\n octave: 3\n },\n 'tenor': {\n letter: 'a',\n accidental: 'n',\n octave: 3\n },\n 'alto': {\n letter: 'c',\n accidental: 'n',\n octave: 4\n },\n 'soprano': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'percussion': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'mezzo-soprano': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'baritone-c': {\n letter: 'b',\n accidental: 'n',\n octave: 3\n },\n 'baritone-f': {\n letter: 'e',\n accidental: 'n',\n octave: 3\n },\n 'subbass': {\n letter: 'd',\n accidental: '',\n octave: 2\n },\n 'french': {\n letter: 'b',\n accidental: '',\n octave: 4\n } // no idea\n };\n }\n static set emptyMeasureNoteType(tt) {\n SmoMeasure._emptyMeasureNoteType = tt;\n }\n static get emptyMeasureNoteType() {\n return SmoMeasure._emptyMeasureNoteType;\n }\n static timeSignatureNotes(timeSignature, clef) {\n const pitch = SmoMeasure.defaultPitchForClef[clef];\n const maxTicks = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.timeSignatureToTicks(timeSignature.timeSignature);\n const noteTick = 8192 / (timeSignature.beatDuration / 2);\n let ticks = 0;\n const pnotes = [];\n while (ticks < maxTicks) {\n const nextNote = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults;\n nextNote.pitches = [JSON.parse(JSON.stringify(pitch))];\n nextNote.noteType = 'r';\n nextNote.clef = clef;\n nextNote.ticks.numerator = noteTick;\n nextNote.stemTicks = noteTick;\n pnotes.push(new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(nextNote));\n ticks += noteTick;\n }\n if (timeSignature.beatDuration === 8 && (timeSignature.actualBeats % 3 === 0 || timeSignature.actualBeats % 2 !== 0)) {\n let ix = 0;\n pnotes.forEach((pnote) => {\n if ((ix + 1) % 3 === 0) {\n pnote.beamState = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.beamStates.end;\n }\n pnote.beamBeats = 2048 * 3;\n ix += 1;\n });\n }\n return pnotes;\n }\n /**\n * Get a measure full of default notes for a given timeSignature/clef.\n * returns 8th notes for triple-time meters, etc.\n * @param params\n * @returns\n */\n static getDefaultNotes(params) {\n return SmoMeasure.timeSignatureNotes(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(params.timeSignature), params.clef);\n }\n /**\n * When creating a new measure, the 'default' settings can vary depending on\n * what comes before/after the measure. This determines the defaults from the\n * parameters that are passed in, which could be another measure in the score.\n * This version returns params with no notes, for callers that want to use their own notes.\n * If you want the default notes, see {@link getDefaultMeasureWithNotes}\n *\n * @param params\n * @returns\n */\n static getDefaultMeasure(params) {\n const obj = {};\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.defaultAttributes, SmoMeasure.defaults, obj);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.defaultAttributes, params, obj);\n // Don't copy column-formatting options to new measure in new column\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.formattingOptions, SmoMeasure.defaults, obj);\n obj.timeSignature = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(params.timeSignature);\n // The measure expects to get concert KS in constructor and adjust for instrument. So do the\n // opposite.\n obj.keySignature = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySigWithOffset(obj.keySignature, -1 * obj.transposeIndex);\n obj.lines = params.lines;\n // Don't redisplay tempo for a new measure\n const rv = new SmoMeasure(obj);\n if (rv.tempo && rv.tempo.display) {\n rv.tempo.display = false;\n }\n return rv;\n }\n /**\n * When creating a new measure, the 'default' settings can vary depending on\n * what comes before/after the measure. This determines the defaults from the\n * parameters that are passed in, which could be another measure in the score.\n *\n * @param params\n * @returns\n */\n static getDefaultMeasureWithNotes(params) {\n var measure = SmoMeasure.getDefaultMeasure(params);\n measure.voices.push({\n notes: SmoMeasure.getDefaultNotes(params)\n });\n // fix a bug.\n // new measures only have 1 voice, make sure active voice is 0\n measure.activeVoice = 0;\n return measure;\n }\n /**\n * used by xml export\n * @internal\n * @param val\n */\n getForceSystemBreak() {\n return this.format.systemBreak;\n }\n // @internal\n setDefaultBarlines() {\n if (!this.getStartBarline()) {\n this.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n }\n if (!this.getEndBarline()) {\n this.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n }\n }\n get containsSound() {\n let i = 0;\n for (i = 0; i < this.voices.length; ++i) {\n let j = 0;\n const voice = this.voices[i];\n for (j = 0; j < this.voices.length; ++j) {\n if (voice.notes[j].noteType === 'n') {\n return true;\n }\n }\n }\n return false;\n }\n /**\n * The rendered width of the measure, or estimate of same\n */\n get staffWidth() {\n return this.svg.staffWidth;\n }\n /**\n * set the rendered width of the measure, or estimate of same\n */\n setWidth(width, description) {\n if (_render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.flagSet(_render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.values.measureHistory)) {\n this.svg.history.push('setWidth ' + this.staffWidth + '=> ' + width + ' ' + description);\n }\n if (isNaN(width)) {\n throw ('NAN in setWidth');\n }\n this.svg.staffWidth = width;\n }\n /**\n * Get rendered or estimated start x\n */\n get staffX() {\n return this.svg.staffX;\n }\n /**\n * Set rendered or estimated start x\n */\n setX(x, description) {\n if (isNaN(x)) {\n throw ('NAN in setX');\n }\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'staffX', x, description);\n this.svg.staffX = Math.round(x);\n }\n /**\n * A time signature has possibly changed. add/remove notes to\n * match the new length\n */\n alignNotesWithTimeSignature() {\n const tsTicks = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.timeSignatureToTicks(this.timeSignature.timeSignature);\n if (tsTicks === this.getMaxTicksVoice()) {\n return;\n }\n const replaceNoteWithDuration = (target, ar, note) => {\n const fitNote = new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(_note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults);\n const duration = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.closestDurationTickLtEq(target);\n if (duration > 128) {\n fitNote.ticks = { numerator: duration, denominator: 1, remainder: 0 };\n fitNote.stemTicks = duration;\n fitNote.pitches = note.pitches;\n fitNote.noteType = note.noteType;\n fitNote.clef = note.clef;\n ar.push(fitNote);\n }\n };\n const voices = [];\n const tuplets = [];\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n const newNotes = [];\n let voiceTicks = 0;\n for (var j = 0; j < voice.notes.length; ++j) {\n const note = voice.notes[j];\n // if a tuplet, make sure the whole tuplet fits.\n if (note.isTuplet) {\n const tupletTree = _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.getTupletTreeForNoteIndex(this.tupletTrees, i, j);\n if (tupletTree) {\n // remaining notes of an approved tuplet, just add them\n if (tupletTree.startIndex !== j) {\n newNotes.push(note);\n continue;\n }\n else if (tupletTree.totalTicks + voiceTicks <= tsTicks) {\n // first note of the tuplet, it fits, add it\n voiceTicks += tupletTree.totalTicks;\n newNotes.push(note);\n }\n else {\n // tuplet will not fit. Replace tuplet with a note as close to remainder as possible and add it\n // remove tuplet\n note.tupletId = null;\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, note);\n voiceTicks = tsTicks;\n _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.removeTupletForNoteIndex(this, i, j);\n break;\n }\n }\n else { // missing tuplet, now what?\n console.warn('missing tuplet info');\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, note);\n voiceTicks = tsTicks;\n }\n }\n else {\n if (note.tickCount + voiceTicks <= tsTicks) {\n newNotes.push(note);\n voiceTicks += note.tickCount;\n }\n else {\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, note);\n voiceTicks = tsTicks;\n break;\n }\n }\n }\n if (tsTicks - voiceTicks > 128) {\n const np = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults;\n np.clef = this.clef;\n const nnote = new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(np);\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, nnote);\n }\n voices.push({ notes: newNotes });\n }\n this.voices = voices;\n }\n get measureNumberDbg() {\n return `${this.measureNumber.measureIndex}/${this.measureNumber.systemIndex}/${this.measureNumber.staffId}`;\n }\n /**\n * Get rendered or estimated start y\n */\n get staffY() {\n return this.svg.staffY;\n }\n /**\n * Set rendered or estimated start y\n */\n setY(y, description) {\n if (isNaN(y)) {\n throw ('NAN in setY');\n }\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'staffY', y, description);\n this.svg.staffY = Math.round(y);\n }\n /**\n * Return actual or estimated highest point in score\n */\n get yTop() {\n return this.svg.yTop;\n }\n /**\n * return the lowest y (highest value) in this measure svg\n *\n * @readonly\n */\n get lowestY() {\n if (this.svg.tabStaveBox) {\n return this.svg.tabStaveBox.y + this.svg.tabStaveBox.height;\n }\n else {\n return this.svg.logicalBox.y + this.svg.logicalBox.height;\n }\n }\n /**\n * adjust the y for the render boxes to account for the page and margins\n */\n adjustY(yOffset) {\n this.svg.logicalBox.y += yOffset;\n if (this.svg.tabStaveBox) {\n this.svg.tabStaveBox.y += yOffset;\n }\n }\n /**\n * WHen setting an instrument, offset the pitches to match the instrument key\n * @param offset\n * @param newClef\n */\n transposeToOffset(offset, targetKey, newClef) {\n const diff = offset - this.transposeIndex;\n newClef = newClef !== null && newClef !== void 0 ? newClef : this.clef;\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n const pitches = [...Array(note.pitches.length).keys()];\n // when the note is a rest, preserve the rest but match the new clef.\n if (newClef !== this.clef && note.noteType === 'r') {\n // @ts-ignore\n const defp = JSON.parse(JSON.stringify(SmoMeasure.defaultPitchForClef[newClef]));\n note.pitches = [defp];\n }\n else {\n note.transpose(pitches, diff, this.keySignature, targetKey);\n note.getGraceNotes().forEach((gn) => {\n const gpitch = [...Array(gn.pitches.length).keys()];\n const xpose = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.transpose(gn, gpitch, diff, this.keySignature, targetKey);\n gn.pitches = xpose.pitches;\n });\n }\n });\n });\n }\n /**\n * Return actual or estimated highest point in score\n */\n setYTop(y, description) {\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'yTop', y, description);\n this.svg.yTop = y;\n }\n /**\n * Return actual or estimated bounding box\n */\n setBox(box, description) {\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'logicalBox', box, description);\n this.svg.logicalBox = _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.smoBox(box);\n }\n /**\n * @returns the DOM identifier for this measure when rendered\n */\n getClassId() {\n return 'mm-' + this.measureNumber.staffId + '-' + this.measureNumber.measureIndex;\n }\n /**\n *\n * @param id\n * @returns\n */\n getRenderedNote(id) {\n let j = 0;\n let i = 0;\n for (j = 0; j < this.voices.length; ++j) {\n const voice = this.voices[j];\n for (i = 0; i < voice.notes.length; ++i) {\n const note = voice.notes[i];\n if (note.renderId === id) {\n return {\n smoNote: note,\n voice: j,\n tick: i\n };\n }\n }\n }\n return null;\n }\n getNotes() {\n return this.voices[this.activeVoice].notes;\n }\n getActiveVoice() {\n return this.activeVoice;\n }\n setActiveVoice(vix) {\n if (vix >= 0 && vix < this.voices.length) {\n this.activeVoice = vix;\n }\n }\n getSwapVoicePairs() {\n const rv = [];\n for (let i = 0; i < this.voices.length; ++i) {\n for (let j = i + 1; j < this.voices.length; ++j) {\n rv.push([i, j]);\n }\n }\n return rv;\n }\n swapVoices(voice1, voice2) {\n if (this.voices.length > voice1 && this.voices.length > voice2) {\n const v1 = this.voices[voice1];\n const v2 = this.voices[voice2];\n const nvoices = [];\n for (let i = 0; i < this.voices.length; ++i) {\n if (i === voice1) {\n nvoices.push(v2);\n }\n else if (i === voice2) {\n nvoices.push(v1);\n }\n else {\n nvoices.push(this.voices[i]);\n }\n }\n this.voices = nvoices;\n }\n }\n tickmapForVoice(voiceIx) {\n return new _xform_tickMap__WEBPACK_IMPORTED_MODULE_7__.TickMap(this, voiceIx);\n }\n // ### createMeasureTickmaps\n // A tickmap is a map of notes to ticks for the measure. It is speciifc per-voice\n // since each voice may have different numbers of ticks. The accidental map is\n // overall since accidentals in one voice apply to accidentals in the other\n // voices. So we return the tickmaps and the overall accidental map.\n createMeasureTickmaps() {\n let i = 0;\n const tickmapArray = [];\n const accidentalMap = {};\n for (i = 0; i < this.voices.length; ++i) {\n tickmapArray.push(this.tickmapForVoice(i));\n }\n for (i = 0; i < this.voices.length; ++i) {\n const tickmap = tickmapArray[i];\n const durationKeys = Object.keys((tickmap.durationAccidentalMap));\n durationKeys.forEach((durationKey) => {\n if (!accidentalMap[durationKey]) {\n accidentalMap[durationKey] = tickmap.durationAccidentalMap[durationKey];\n }\n else {\n const amap = accidentalMap[durationKey];\n const tickable = tickmap.durationAccidentalMap[durationKey];\n const letterKeys = Object.keys(tickable);\n letterKeys.forEach((pitchKey) => {\n if (!amap[pitchKey]) {\n amap[pitchKey] = tickmap.durationAccidentalMap[durationKey][pitchKey];\n }\n });\n }\n });\n }\n // duration: duration, pitches: Record<PitchLetter,TickAccidental>\n const accidentalArray = [];\n Object.keys(accidentalMap).forEach((durationKey) => {\n accidentalArray.push({ duration: durationKey, pitches: accidentalMap[durationKey] });\n });\n return {\n tickmaps: tickmapArray,\n accidentalMap,\n accidentalArray\n };\n }\n // ### createRestNoteWithDuration\n // pad some duration of music with rests.\n static createRestNoteWithDuration(duration, clef) {\n const pitch = JSON.parse(JSON.stringify(SmoMeasure.defaultPitchForClef[clef]));\n const note = new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(_note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults);\n note.pitches = [pitch];\n note.noteType = 'r';\n note.hidden = true;\n note.ticks = { numerator: duration, denominator: 1, remainder: 0 };\n return note;\n }\n /**\n * Count the number of ticks in each voice and return max\n * @returns\n */\n getMaxTicksVoice() {\n let i = 0;\n let max = 0;\n for (i = 0; i < this.voices.length; ++i) {\n const voiceTicks = this.getTicksFromVoice(i);\n max = Math.max(voiceTicks, max);\n }\n return max;\n }\n /**\n * For pasting, paste into the target measure if the voice exists, else paste into\n * voice 0\n * @param voiceIndex\n * @returns\n */\n getTicksFromThisOrAnyVoice(voiceIndex) {\n if (this.voices.length > voiceIndex) {\n return this.getTicksFromVoice(voiceIndex);\n }\n else {\n return this.getTicksFromVoice(0);\n }\n }\n /**\n * Count the number of ticks in a specific voice\n * @param voiceIndex\n * @returns\n */\n getTicksFromVoice(voiceIndex) {\n let ticks = 0;\n this.voices[voiceIndex].notes.forEach((note) => {\n ticks += note.tickCount;\n });\n return ticks;\n }\n /**\n * Count all the ticks up to the provided tickIndex\n * @param voiceIndex\n * @param tickIndex\n */\n getNotePositionInTicks(voiceIndex, tickIndex) {\n let rv = 0;\n for (let i = 0; i < tickIndex; i++) {\n const note = this.voices[voiceIndex].notes[i];\n rv += note.tickCount;\n }\n return rv;\n }\n /**\n * Count all the ticks up to the provided tickIndex\n * @param voiceIndex\n * @param tickIndex\n */\n getTickCountForNote(voiceIndex, note) {\n let rv = 0;\n for (let i = 0; i < this.voices[voiceIndex].notes.length; i++) {\n const currentNote = this.voices[voiceIndex].notes[i];\n rv += note.tickCount;\n }\n return rv;\n }\n getClosestIndexFromTickCount(voiceIndex, tickCount) {\n let i = 0;\n let rv = 0;\n for (i = 0; i < this.voices[voiceIndex].notes.length; ++i) {\n const note = this.voices[voiceIndex].notes[i];\n if (note.tickCount + rv >= tickCount) {\n return i;\n }\n rv += note.tickCount;\n }\n return i;\n }\n isPickup() {\n const ticks = this.getTicksFromVoice(0);\n const goal = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.timeSignatureToTicks(this.timeSignature.timeSignature);\n return (ticks < goal);\n }\n clearBeamGroups() {\n this.beamGroups = [];\n }\n // ### updateLyricFont\n // Update the lyric font, which is the same for all lyrics.\n setLyricFont(fontInfo) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setLyricFont(fontInfo);\n });\n });\n }\n setLyricAdjustWidth(adjustNoteWidth) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setLyricAdjustWidth(adjustNoteWidth);\n });\n });\n }\n setChordAdjustWidth(adjustNoteWidth) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setChordAdjustWidth(adjustNoteWidth);\n });\n });\n }\n // ### updateLyricFont\n // Update the lyric font, which is the same for all lyrics.\n setChordFont(fontInfo) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setChordFont(fontInfo);\n });\n });\n }\n tupletNotes(smoTuplet) {\n let tupletNotes = [];\n for (let i = smoTuplet.startIndex; i <= smoTuplet.endIndex; i++) {\n const note = this.voices[smoTuplet.voice].notes[i];\n tupletNotes.push(note);\n }\n return tupletNotes;\n }\n getStemDirectionForTuplet(smoTuplet) {\n let note = null;\n for (let currentNote of this.tupletNotes(smoTuplet)) {\n if (currentNote.noteType === 'n') {\n note = currentNote;\n break;\n }\n }\n if (!note) {\n return _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.down;\n }\n if (note.flagState !== _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.auto) {\n return note.flagState;\n }\n return _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.pitchToLedgerLine(this.clef, note.pitches[0])\n >= 2 ? _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.up : _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.down;\n }\n getNoteById(id) {\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n for (var j = 0; j < voice.notes.length; ++j) {\n const note = voice.notes[j];\n if (note.attrs.id === id) {\n return note;\n }\n }\n }\n return null;\n }\n setClef(clef) {\n const oldClef = this.clef;\n this.clef = clef;\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.clef = clef;\n });\n });\n }\n /**\n * Get the clef that this measure ends with.\n * @returns\n */\n getLastClef() {\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n for (var j = 0; j < voice.notes.length; ++j) {\n const note = voice.notes[j];\n if (note.clefNote && note.clefNote.clef !== this.clef) {\n return note.clefNote.clef;\n }\n }\n }\n return this.clef;\n }\n isRest() {\n let i = 0;\n for (i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n for (var j = 0; j < voice.notes.length; ++j) {\n if (!voice.notes[j].isRest()) {\n return false;\n }\n }\n }\n return true;\n }\n // ### populateVoice\n // Create a new voice in this measure, and populate it with the default note\n // for this measure/key/clef\n populateVoice(index) {\n if (index !== this.voices.length) {\n return;\n }\n this.voices.push({ notes: SmoMeasure.getDefaultNotes(this) });\n this.activeVoice = index;\n }\n _removeSingletonModifier(name) {\n const ar = this.modifiers.filter(obj => obj.attrs.type !== name);\n this.modifiers = ar;\n }\n addRehearsalMark(parameters) {\n this._removeSingletonModifier('SmoRehearsalMark');\n this.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRehearsalMark(parameters));\n }\n removeRehearsalMark() {\n this._removeSingletonModifier('SmoRehearsalMark');\n }\n getRehearsalMark() {\n return this.modifiers.find(obj => obj.attrs.type === 'SmoRehearsalMark');\n }\n getModifiersByType(type) {\n return this.modifiers.filter((mm) => type === mm.attrs.type);\n }\n setTempo(params) {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(params);\n }\n /**\n * Set measure tempo to the default {@link SmoTempoText}\n */\n resetTempo() {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n getTempo() {\n if (typeof (this.tempo) === 'undefined') {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n return this.tempo;\n }\n /**\n * Measure text is deprecated, and may not be supported in the future.\n * Better to use SmoTextGroup and attach to the measure.\n * @param mod\n * @returns\n */\n addMeasureText(mod) {\n var exist = this.modifiers.filter((mm) => mm.attrs.id === mod.attrs.id);\n if (exist.length) {\n return;\n }\n this.modifiers.push(mod);\n }\n getMeasureText() {\n return this.modifiers.filter(obj => obj.ctor === 'SmoMeasureText');\n }\n removeMeasureText(id) {\n var ar = this.modifiers.filter(obj => obj.attrs.id !== id);\n this.modifiers = ar;\n }\n setRepeatSymbol(rs) {\n const ar = [];\n let toAdd = true;\n const exSymbol = this.getRepeatSymbol();\n if (exSymbol && exSymbol.symbol === rs.symbol) {\n toAdd = false;\n }\n // Adding 'None' means remove\n if (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['None']) {\n toAdd = false;\n }\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor !== 'SmoRepeatSymbol') {\n ar.push(modifier);\n }\n });\n this.modifiers = ar;\n if (toAdd) {\n ar.push(rs);\n }\n }\n getRepeatSymbol() {\n const rv = this.modifiers.filter(obj => obj.ctor === 'SmoRepeatSymbol');\n if (rv.length > 0) {\n return rv[0];\n }\n return null;\n }\n get isToDc() {\n const rs = this.getRepeatSymbol();\n if (rs &&\n (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['DcAlCoda'] ||\n rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['DcAlFine'])) {\n return true;\n }\n return false;\n }\n get isToDs() {\n const rs = this.getRepeatSymbol();\n if (rs &&\n (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['DsAlFine'] ||\n rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['DsAlCoda'])) {\n return true;\n }\n return false;\n }\n get isSegno() {\n const rs = this.getRepeatSymbol();\n if (rs &&\n (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['Segno'])) {\n return true;\n }\n return false;\n }\n get isCoda() {\n const rs = this.getRepeatSymbol();\n if (rs &&\n (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['Coda'])) {\n return true;\n }\n return false;\n }\n get isToCoda() {\n const rs = this.getRepeatSymbol();\n if (rs &&\n (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['toCoda'])) {\n return true;\n }\n return false;\n }\n get isFine() {\n const rs = this.getRepeatSymbol();\n if (rs &&\n (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['Fine'])) {\n return true;\n }\n return false;\n }\n clearRepeatSymbols() {\n const ar = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor !== 'SmoRepeatSymbol') {\n ar.push(modifier);\n }\n });\n this.modifiers = ar;\n }\n setBarline(barline) {\n var ar = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoBarline') {\n const o = modifier;\n if (o.position !== barline.position) {\n ar.push(o);\n }\n }\n else {\n ar.push(modifier);\n }\n });\n this.modifiers = ar;\n ar.push(barline);\n }\n _getBarline(pos) {\n let rv = null;\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoBarline' && modifier.position === pos) {\n rv = modifier;\n }\n });\n if (rv === null) {\n return new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.defaults);\n }\n return rv;\n }\n getEndBarline() {\n return this._getBarline(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end);\n }\n getStartBarline() {\n return this._getBarline(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start);\n }\n addNthEnding(ending) {\n const mods = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor !== 'SmoVolta' || modifier.startBar !== ending.startBar ||\n modifier.endBar !== ending.endBar) {\n mods.push(modifier);\n }\n });\n mods.push(ending);\n this.modifiers = mods;\n }\n removeNthEnding(ending) {\n const mods = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoVolta') {\n const volta = modifier;\n if (ending.startSelector === null || ending.endSelector === null || volta.startSelector === null || volta.endSelector === null) {\n return;\n }\n if (!_xform_selections__WEBPACK_IMPORTED_MODULE_9__.SmoSelector.sameMeasure(ending.startSelector, volta.startSelector) || !_xform_selections__WEBPACK_IMPORTED_MODULE_9__.SmoSelector.sameMeasure(ending.endSelector, volta.endSelector)\n && ending.number !== volta.number) {\n mods.push(modifier);\n }\n }\n else {\n mods.push(modifier);\n }\n });\n this.modifiers = mods;\n }\n getNthEndings() {\n const rv = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoVolta') {\n rv.push(modifier);\n }\n });\n return rv;\n }\n setKeySignature(sig) {\n this.keySignature = sig;\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.keySignature = sig;\n });\n });\n }\n setMeasureNumber(num) {\n this.measureNumber = num;\n }\n getBeamGroupForNote(note) {\n let i = 0;\n let j = 0;\n for (i = 0; i < this.beamGroups.length; ++i) {\n const bg = this.beamGroups[i];\n for (j = 0; j < bg.notes.length; ++j) {\n if (bg.notes[j].attrs.id === note.attrs.id) {\n return bg;\n }\n }\n }\n return null;\n }\n}\nSmoMeasure.defaultDupleDuration = 4096;\nSmoMeasure.defaultTripleDuration = 2048 * 3;\n// @internal\nSmoMeasure._defaults = {\n timeSignature: SmoMeasure.timeSignatureDefault,\n keySignature: 'C',\n tupletTrees: [],\n transposeIndex: 0,\n modifiers: [],\n // bars: [1, 1], // follows enumeration in VF.Barline\n measureNumber: {\n localIndex: 0,\n systemIndex: 0,\n measureIndex: 0,\n staffId: 0\n },\n clef: 'treble',\n lines: 5,\n voices: [],\n format: new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults),\n activeVoice: 0,\n tempo: new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults),\n repeatSymbol: false,\n repeatCount: 0\n};\nSmoMeasure._emptyMeasureNoteType = 'r';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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cmNlc0NvbnRlbnQiOlsiLy8gW1Ntb29zaWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BYXJvbkRhdmlkTmV3bWFuL1Ntb29zaWMpXHJcbi8vIENvcHlyaWdodCAoYykgQWFyb24gRGF2aWQgTmV3bWFuIDIwMjEuXHJcbi8qKlxyXG4gKiBDb250YWlucyBkZWZpbml0aW9uIGFuZCBzdXBwb3J0aW5nIGNsYXNzZXMgZm9yIHtAbGluayBTbW9NZWFzdXJlfS5cclxuICogTW9zdCBvZiB0aGUgZW5ncmF2aW5nIGlzIGRvbmUgYXQgdGhlIG1lYXN1cmUgbGV2ZWwuICBNZWFzdXJlIGNvbnRhaW5zIG11bHRpcGxlIChhdCBsZWFzdCAxKVxyXG4gKiB2b2ljZXMsIHdoaWNoIGluIHR1cm4gY29udGFpbiBub3Rlcy4gIEVhY2ggbWVhc3VyZSBhbHNvIGNvbnRhaW5zIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24uICBUaGlzXHJcbiAqIGlzIG1vc3RseSBzZXJpYWxpemVkIG91dHNpZGUgb2YgbWVhc3VyZSAoaW4gc2NvcmUpLCBzaW5jZSBjb2x1bW5zIGFuZCBvZnRlbiBhbiBlbnRpcmUgcmVnaW9uXHJcbiAqIHNoYXJlIG1lYXN1cmUgZm9ybWF0dGluZy4gIE1lYXN1cmVzIGFsc28gY29udGFpbiBtb2RpZmllcnMgbGlrZSBiYXJsaW5lcy4gIFR1cGxldHMgYW5kIGJlYW0gZ3JvdXBzXHJcbiAqIGFyZSBjb250YWluZWQgYXQgdGhlIG1lYXN1cmUgbGV2ZWwuXHJcbiAqIEBtb2R1bGUgL3Ntby9kYXRhL21lYXN1cmVcclxuICovXHJcbmltcG9ydCB7IHNtb1NlcmlhbGl6ZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZXJpYWxpemF0aW9uSGVscGVycyc7XHJcbmltcG9ydCB7IFNtb011c2ljIH0gZnJvbSAnLi9tdXNpYyc7XHJcbmltcG9ydCB7XHJcbiAgU21vQmFybGluZSwgU21vTWVhc3VyZU1vZGlmaWVyQmFzZSwgU21vUmVwZWF0U3ltYm9sLCBTbW9UZW1wb1RleHQsIFNtb01lYXN1cmVGb3JtYXQsXHJcbiAgU21vVm9sdGEsIFNtb1JlaGVhcnNhbE1hcmtQYXJhbXMsIFNtb1JlaGVhcnNhbE1hcmssIFNtb1RlbXBvVGV4dFBhcmFtcywgVGltZVNpZ25hdHVyZSxcclxuICBUaW1lU2lnbmF0dXJlUGFyYW1ldGVyc1NlciwgU21vTWVhc3VyZUZvcm1hdFBhcmFtc1NlciwgU21vVGVtcG9UZXh0UGFyYW1zU2VyXHJcbn0gZnJvbSAnLi9tZWFzdXJlTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgU21vTm90ZSwgTm90ZVR5cGUsIFNtb05vdGVQYXJhbXNTZXIgfSBmcm9tICcuL25vdGUnO1xyXG5pbXBvcnQgeyBTbW9UdXBsZXQsIFNtb1R1cGxldFBhcmFtc1NlciwgU21vVHVwbGV0UGFyYW1zLCBTbW9UdXBsZXRUcmVlUGFyYW1zU2VyLCBTbW9UdXBsZXRUcmVlIH0gZnJvbSAnLi90dXBsZXQnO1xyXG5pbXBvcnQgeyBsYXlvdXREZWJ1ZyB9IGZyb20gJy4uLy4uL3JlbmRlci9zdWkvbGF5b3V0RGVidWcnO1xyXG5pbXBvcnQgeyBTdmdIZWxwZXJzIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS9zdmdIZWxwZXJzJztcclxuaW1wb3J0IHsgVGlja01hcCB9IGZyb20gJy4uL3hmb3JtL3RpY2tNYXAnO1xyXG5pbXBvcnQgeyBNZWFzdXJlTnVtYmVyLCBTdmdCb3gsIFNtb0F0dHJzLCBQaXRjaCwgUGl0Y2hMZXR0ZXIsIENsZWYsIFxyXG4gIFRpY2tBY2NpZGVudGFsLCBBY2NpZGVudGFsQXJyYXksIGdldElkIH0gZnJvbSAnLi9jb21tb24nO1xyXG5pbXBvcnQgeyBTbW9TZWxlY3RvciB9IGZyb20gJy4uL3hmb3JtL3NlbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBGb250SW5mbyB9IGZyb20gJy4uLy4uL2NvbW1vbi92ZXgnO1xyXG5pbXBvcnQgeyBTbW9UYWJTdGF2ZSB9IGZyb20gJy4vc3RhZmZNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9GcmV0UG9zaXRpb24gfSBmcm9tICcuL25vdGVNb2RpZmllcnMnO1xyXG4vKipcclxuICogVm9pY2UgaXMganVzdCBhIGNvbnRhaW5lciBmb3Ige0BsaW5rIFNtb05vdGV9XHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vVm9pY2Uge1xyXG4gIG5vdGVzOiBTbW9Ob3RlW11cclxufVxyXG5cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vVm9pY2VTZXIge1xyXG4gIG5vdGVzOiBTbW9Ob3RlUGFyYW1zU2VyW11cclxufVxyXG4vKipcclxuICogVGlja01hcHBhYmxlIGJyZWFrcyB1cCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgb24gbW9kaWZpZXJzXHJcbiAqIGxpa2UgQFNtb0R1cmF0aW9uXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGlja01hcHBhYmxlIHtcclxuICB2b2ljZXM6IFNtb1ZvaWNlW10sXHJcbiAga2V5U2lnbmF0dXJlOiBzdHJpbmdcclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBNZWFzdXJlVGljayB7XHJcbiAgdm9pY2VJbmRleDogbnVtYmVyLFxyXG4gIHRpY2tJbmRleDogbnVtYmVyXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCcmVhayB1cCBhIGNpcmNsYXIgZGVwZW5kZW5jeSB3aXRoIHtAbGluayBTbW9CZWFtR3JvdXB9XHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVNtb0JlYW1Hcm91cCB7XHJcbiAgbm90ZXM6IFNtb05vdGVbXSxcclxuICBzZWNvbmRhcnlCZWFtQnJlYWtzOiBudW1iZXJbXSxcclxuICB2b2ljZTogbnVtYmVyLFxyXG4gIGF0dHJzOiBTbW9BdHRyc1xyXG59XHJcbi8qKlxyXG4gKiBnZW9tZXRyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBtZWFzdXJlIGZvciByZW5kZXJpbmcgYW5kXHJcbiAqIHNjb3JlIGxheW91dC5cclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE1lYXN1cmVTdmcge1xyXG4gIHN0YWZmV2lkdGg6IG51bWJlcixcclxuICB1bmp1c3RpZmllZFdpZHRoOiBudW1iZXIsXHJcbiAgYWRqWDogbnVtYmVyLCAvLyBUaGUgc3RhcnQgcG9pbnQgb2YgdGhlIG11c2ljIGluIHRoZSBzdGF2ZSAoYWZ0ZXIgdGltZSBzaWcsIGV0YylcclxuICBtYXhDb2x1bW5TdGFydFg6IG51bWJlcixcclxuICBzdGFmZlg6IG51bWJlciwgLy8gVGhlIGxlZnQtbW9zdCB4IHBvc2l0aW9uIG9mIHRoZSBzdGFmZlxyXG4gIHN0YWZmWTogbnVtYmVyLFxyXG4gIGxvZ2ljYWxCb3g6IFN2Z0JveCxcclxuICB5VG9wOiBudW1iZXIsXHJcbiAgYWRqUmlnaHQ6IG51bWJlcixcclxuICBoaXN0b3J5OiBzdHJpbmdbXSxcclxuICBsaW5lSW5kZXg6IG51bWJlcixcclxuICBwYWdlSW5kZXg6IG51bWJlcixcclxuICByb3dJblN5c3RlbTogbnVtYmVyLFxyXG4gIGZvcmNlQ2xlZjogYm9vbGVhbixcclxuICBmb3JjZUtleVNpZ25hdHVyZTogYm9vbGVhbixcclxuICBmb3JjZVRpbWVTaWduYXR1cmU6IGJvb2xlYW4sXHJcbiAgZm9yY2VUZW1wbzogYm9vbGVhbixcclxuICBoaWRlRW1wdHlNZWFzdXJlOiBib29sZWFuLFxyXG4gIGhpZGVNdWx0aW1lYXN1cmU6IGJvb2xlYW4sXHJcbiAgbXVsdGltZWFzdXJlTGVuZ3RoOiBudW1iZXIsXHJcbiAgbXVsdGltZWFzdXJlRW5kQmFybGluZTogbnVtYmVyLFxyXG4gIGVsZW1lbnQ6IFNWR1NWR0VsZW1lbnQgfCBudWxsLFxyXG4gIHRhYlN0YXZlQm94PzogU3ZnQm94LFxyXG4gIHRhYkVsZW1lbnQ/OiBTVkdTVkdFbGVtZW50XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcmZhY2UgZm9yIGEgIHtAbGluayBUaWNrTWFwfSBmb3IgZWFjaCB2b2ljZVxyXG4gKiBmb3IgZm9ybWF0dGluZ1xyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE1lYXN1cmVUaWNrbWFwcyB7XHJcbiAgdGlja21hcHM6IFRpY2tNYXBbXSxcclxuICBhY2NpZGVudGFsTWFwOiBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBSZWNvcmQ8c3RyaW5nLCBUaWNrQWNjaWRlbnRhbD4+LFxyXG4gIGFjY2lkZW50YWxBcnJheTogQWNjaWRlbnRhbEFycmF5W11cclxufVxyXG4vKipcclxuICogQ29sdW1uLW1hcHBlZCBtb2RpZmllcnMsIG1hbmFnZWQgYnkgdGhlIHtAbGluayBTbW9TY29yZX1cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5NYXBwZWRQYXJhbXMge1xyXG4gIC8vIFsndGltZVNpZ25hdHVyZScsICdrZXlTaWduYXR1cmUnLCAndGVtcG8nXVxyXG4gIHRpbWVTaWduYXR1cmU6IGFueSxcclxuICBrZXlTaWduYXR1cmU6IHN0cmluZyxcclxuICB0ZW1wbzogYW55XHJcbn1cclxuLy8gQGludGVybmFsXHJcbmV4cG9ydCB0eXBlIFNtb01lYXN1cmVOdW1iZXJQYXJhbSA9ICd0cmFuc3Bvc2VJbmRleCcgfCAnYWN0aXZlVm9pY2UnIHwgJ2xpbmVzJyB8ICdyZXBlYXRDb3VudCc7XHJcbi8vIEBpbnRlcm5hbFxyXG5leHBvcnQgY29uc3QgU21vTWVhc3VyZU51bWJlclBhcmFtczogU21vTWVhc3VyZU51bWJlclBhcmFtW10gPSBbJ3RyYW5zcG9zZUluZGV4JywgJ2FjdGl2ZVZvaWNlJywgJ2xpbmVzJywgJ3JlcGVhdENvdW50J107XHJcbi8vIEBpbnRlcm5hbFxyXG5leHBvcnQgdHlwZSBTbW9NZWFzdXJlU3RyaW5nUGFyYW0gPSAna2V5U2lnbmF0dXJlJztcclxuLy8gQGludGVybmFsXHJcbmV4cG9ydCBjb25zdCBTbW9NZWFzdXJlU3RyaW5nUGFyYW1zOiBTbW9NZWFzdXJlU3RyaW5nUGFyYW1bXSA9IFsna2V5U2lnbmF0dXJlJ107XHJcbi8qKlxyXG4gKiBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGZvciBhIHtAbGluayBTbW9NZWFzdXJlfS4gIFVzdWFsbHkgeW91IHdpbGwgY2FsbFxyXG4gKiB7QGxpbmsgU21vTWVhc3VyZS5kZWZhdWx0c30sIGFuZCBtb2RpZnkgdGhlIHBhcmFtZXRlcnMgeW91IG5lZWQgdG8gY2hhbmdlLlxyXG4gKlxyXG4gKiBAcGFyYW0gdGltZVNpZ25hdHVyZVxyXG4gKiBAcGFyYW0ga2V5U2lnbmF0dXJlXHJcbiAqIEBwYXJhbSB0dXBsZXRzXHJcbiAqIEBwYXJhbSB0cmFuc3Bvc2VJbmRleCBjYWxjdWxhdGVkIGZyb20ge0BsaW5rIFNtb1BhcnRJbmZvfSBmb3Igbm9uLWNvbmNlcnQta2V5IGluc3RydW1lbnRzXHJcbiAqIEBwYXJhbSBsaW5lcyBudW1iZXIgb2YgbGluZXMgaW4gdGhlIHN0YXZlXHJcbiAqIEBwYXJhbSBzdGFmZlkgWSBjb29yZGluYXRlIChVTCBjb3JuZXIpIG9mIHRoZSBtZWFzdXJlIHN0YXZlXHJcbiAqIEBwYXJhbSBtZWFzdXJlTnVtYmVyIGNvbWJpbmF0aW9uIGNvbmZpZ3VyZWQvY2FsY3VsYXRlZCBtZWFzdXJlIG51bWJlclxyXG4gKiBAcGFyYW0gY2xlZlxyXG4gKiBAcGFyYW0gdm9pY2VzXHJcbiAqIEBwYXJhbSBhY3RpdmVWb2ljZSB0aGUgYWN0aXZlIHZvaWNlIGluIHRoZSBlZGl0b3JcclxuICogQHBhcmFtIHRlbXBvXHJcbiAqIEBwYXJhbSBmb3JtYXQgbWVhc3VyZSBmb3JtYXQsIGlzIG1hbmFnZWQgYnkgdGhlIHNjb3JlXHJcbiAqIEBwYXJhbSBtb2RpZmllcnMgQWxsIG1lYXN1cmUgbW9kaWZpZXJzIHRoYXQ1IGFyZW4ndCBmb3JtYXQsIHRpbWVTaWduYXR1cmUgb3IgdGVtcG9cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9NZWFzdXJlUGFyYW1zIHtcclxuICB0aW1lU2lnbmF0dXJlOiBUaW1lU2lnbmF0dXJlLFxyXG4gIGtleVNpZ25hdHVyZTogc3RyaW5nLFxyXG4gIHR1cGxldFRyZWVzOiBTbW9UdXBsZXRUcmVlW10sXHJcbiAgdHJhbnNwb3NlSW5kZXg6IG51bWJlcixcclxuICBsaW5lczogbnVtYmVyLFxyXG4gIC8vIGJhcnM6IFsxLCAxXSwgLy8gZm9sbG93cyBlbnVtZXJhdGlvbiBpbiBWRi5CYXJsaW5lXHJcbiAgbWVhc3VyZU51bWJlcjogTWVhc3VyZU51bWJlcixcclxuICBjbGVmOiBDbGVmLFxyXG4gIHZvaWNlczogU21vVm9pY2VbXSxcclxuICBhY3RpdmVWb2ljZTogbnVtYmVyLFxyXG4gIHRlbXBvOiBTbW9UZW1wb1RleHQsXHJcbiAgZm9ybWF0OiBTbW9NZWFzdXJlRm9ybWF0IHwgbnVsbCxcclxuICBtb2RpZmllcnM6IFNtb01lYXN1cmVNb2RpZmllckJhc2VbXSxcclxuICByZXBlYXRTeW1ib2w6IGJvb2xlYW4sXHJcbiAgcmVwZWF0Q291bnQ6IG51bWJlclxyXG59XHJcblxyXG4vKipcclxuICogVGhlIHNlcmlhbGl6ZWFibGUgYml0cyBvZiBTbW9NZWFzdXJlLiAgU29tZSBwYXJhbWV0ZXJzIGFyZSBcclxuICogbWFwcGVkIGJ5IHRoZSBzdGF2ZSBpZiB0aGUgZG9uJ3QgY2hhbmdlIGV2ZXJ5IG1lYXN1cmUsIGUuZy5cclxuICogdGltZSBzaWduYXR1cmUuXHJcbiAqIEBjYXRlZ29yeSBzZXJpYWxpemF0aW9uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb01lYXN1cmVQYXJhbXNTZXIge1xyXG4gIC8qKlxyXG4gICAqIGNvbnN0cnVjdG9yXHJcbiAgICovXHJcbiAgY3Rvcjogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIGEgbGlzdCBvZiB0dXBsZXRzIChzZXJpYWxpemVkKVxyXG4gICAqL1xyXG4gIHR1cGxldFRyZWVzOiBTbW9UdXBsZXRUcmVlUGFyYW1zU2VyW10sXHJcbiAgLyoqXHJcbiAgICogdHJhbnNwb3NlIHRoZSBub3RlcyB1cC9kb3duLiAgVE9ETzogdGhpcyBzaG91bGQgbm90IGJlIHNlcmlhbGl6ZWRcclxuICAgKiBhcyBpdHMgcGFydCBvZiB0aGUgaW5zdHJ1bWVudCBwYXJhbWV0ZXJzXHJcbiAgICovXHJcbiAgdHJhbnNwb3NlSW5kZXg6IG51bWJlcixcclxuICAvKipcclxuICAgKiBsaW5lcyBpbiB0aGUgc3RhZmYgKGUuZy4gcGVyY3Vzc2lvbilcclxuICAgKi9cclxuICBsaW5lczogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIG1lYXN1cmUgbnVtYmVyLCBhYnNvbHV0ZSBhbmQgcmVsYXRpdmUvcmVtYXBwZWRcclxuICAgKi9cclxuICBtZWFzdXJlTnVtYmVyOiBNZWFzdXJlTnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIHN0YXJ0IGNsZWZcclxuICAgKi9cclxuICBjbGVmOiBDbGVmLFxyXG4gIC8qKlxyXG4gICAqIHZvaWNlcyBjb250YWluIG5vdGVzXHJcbiAgICovXHJcbiAgdm9pY2VzOiBTbW9Wb2ljZVNlcltdLFxyXG4gIC8qKlxyXG4gICAqIGFsbCBvdGhlciBtb2RpZmllcnMgKGJhcmxpbmVzLCBldGMpXHJcbiAgICovXHJcbiAgbW9kaWZpZXJzOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlW10sXHJcbiAgLy8gdGhlIG5leHQgMyBhcmUgbm90IHNlcmlhbGl6ZWQgYXMgcGFydCBvZiB0aGUgbWVhc3VyZSBpbiBtb3N0IGNhc2VzLCBzaW5jZSB0aGV5IGFyZVxyXG4gIC8vIG1hcHBlZCB0byBzcGVjaWZpYyBtZWFzdXJlcyBpbiB0aGUgc2NvcmUvc3lzdGVtXHJcbiAgLyoqXHJcbiAgICoga2V5IHNpZ25hdHVyZVxyXG4gICAqL1xyXG4gIGtleVNpZ25hdHVyZT86IHN0cmluZyxcclxuICAvKipcclxuICAqIHRpbWUgc2lnbmF0dXJlIHNlcmlhbGl6YXRpb25cclxuICAqL1xyXG4gIHRpbWVTaWduYXR1cmU/OiBUaW1lU2lnbmF0dXJlUGFyYW1ldGVyc1NlcixcclxuICAvKipcclxuICAgKiB0ZW1wbyBhdCB0aGlzIHBvaW50XHJcbiAgICovXHJcbiAgdGVtcG86IFNtb1RlbXBvVGV4dFBhcmFtc1NlclxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIE9ubHkgYXJyYXlzIGFuZCBtZWFzdXJlIG51bWJlcnMgYXJlIHNlcmlsaWFsaXplZCB3aXRoIGRlZmF1bHQgdmFsdWVzLlxyXG4gKiBAcGFyYW0gcGFyYW1zIC0gcmVzdWx0IG9mIHNlcmlhbGl6YXRpb25cclxuICogQHJldHVybnMgXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1Ntb01lYXN1cmVQYXJhbXNTZXIocGFyYW1zOiBQYXJ0aWFsPFNtb01lYXN1cmVQYXJhbXNTZXI+KTpwYXJhbXMgaXMgU21vTWVhc3VyZVBhcmFtc1NlciB7XHJcbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy52b2ljZXMpIHx8IFxyXG4gICAgICAhQXJyYXkuaXNBcnJheShwYXJhbXMudHVwbGV0VHJlZXMpIHx8ICFBcnJheS5pc0FycmF5KHBhcmFtcy5tb2RpZmllcnMpIHx8XHJcbiAgICAgIHR5cGVvZihwYXJhbXM/Lm1lYXN1cmVOdW1iZXI/Lm1lYXN1cmVJbmRleCkgIT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG4vKipcclxuICogRGF0YSBmb3IgYSBtZWFzdXJlIG9mIG11c2ljLiAgTWFueSBydWxlcyBvZiBtdXNpY2FsIGVuZ3JhdmluZyBhcmVcclxuICogZW5mb3JjZWQgYXQgYSBtZWFzdXJlIGxldmVsOiB0aGUgZHVyYXRpb24gb2Ygbm90ZXMsIGFjY2lkZW50YWxzLCBldGMuXHJcbiAqIFxyXG4gKiBNZWFzdXJlcyBjb250YWluIHtAbGluayBTbW9Ob3RlfSwge0BsaW5rIFNtb1R1cGxldH0sIGFuZCB7QGxpbmsgU21vQmVhbUdyb3VwfVxyXG4gKiBNZWFzdXJlcyBhcmUgY29udGFpbmVkIGluIHtAbGluayBTbW9TeXN0ZW1TdGFmZn1cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNtb01lYXN1cmUgaW1wbGVtZW50cyBTbW9NZWFzdXJlUGFyYW1zLCBUaWNrTWFwcGFibGUge1xyXG4gIHN0YXRpYyBnZXQgdGltZVNpZ25hdHVyZURlZmF1bHQoKTogVGltZVNpZ25hdHVyZSB7XHJcbiAgICByZXR1cm4gbmV3IFRpbWVTaWduYXR1cmUoVGltZVNpZ25hdHVyZS5kZWZhdWx0cyk7XHJcbiAgfVxyXG4gIHN0YXRpYyBkZWZhdWx0RHVwbGVEdXJhdGlvbjogbnVtYmVyID0gNDA5NjtcclxuICBzdGF0aWMgZGVmYXVsdFRyaXBsZUR1cmF0aW9uOiBudW1iZXIgPSAyMDQ4ICogMztcclxuICAvLyBAaW50ZXJuYWxcclxuICBzdGF0aWMgcmVhZG9ubHkgX2RlZmF1bHRzOiBTbW9NZWFzdXJlUGFyYW1zID0ge1xyXG4gICAgdGltZVNpZ25hdHVyZTogU21vTWVhc3VyZS50aW1lU2lnbmF0dXJlRGVmYXVsdCxcclxuICAgIGtleVNpZ25hdHVyZTogJ0MnLFxyXG4gICAgdHVwbGV0VHJlZXM6IFtdLFxyXG4gICAgdHJhbnNwb3NlSW5kZXg6IDAsXHJcbiAgICBtb2RpZmllcnM6IFtdLFxyXG4gICAgLy8gYmFyczogWzEsIDFdLCAvLyBmb2xsb3dzIGVudW1lcmF0aW9uIGluIFZGLkJhcmxpbmVcclxuICAgIG1lYXN1cmVOdW1iZXI6IHtcclxuICAgICAgbG9jYWxJbmRleDogMCxcclxuICAgICAgc3lzdGVtSW5kZXg6IDAsXHJcbiAgICAgIG1lYXN1cmVJbmRleDogMCxcclxuICAgICAgc3RhZmZJZDogMFxyXG4gICAgfSxcclxuICAgIGNsZWY6ICd0cmVibGUnLFxyXG4gICAgbGluZXM6IDUsXHJcbiAgICB2b2ljZXM6IFtdLFxyXG4gICAgZm9ybWF0OiBuZXcgU21vTWVhc3VyZUZvcm1hdChTbW9NZWFzdXJlRm9ybWF0LmRlZmF1bHRzKSxcclxuICAgIGFjdGl2ZVZvaWNlOiAwLFxyXG4gICAgdGVtcG86IG5ldyBTbW9UZW1wb1RleHQoU21vVGVtcG9UZXh0LmRlZmF1bHRzKSxcclxuICAgIHJlcGVhdFN5bWJvbDogZmFsc2UsXHJcbiAgICByZXBlYXRDb3VudDogMCAgXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuICBEZWZhdWx0cyBhcmUgYWx3YXlzIGNvcGllZCBzbyB0aGVcclxuICAgKiBjYWxsZXIgY2FuIG1vZGlmeSB0aGVtIHRvIGNyZWF0ZSBhIG5ldyBtZWFzdXJlLlxyXG4gICAqIEByZXR1cm5zIGNvbnN0cnVjdG9yIHBhcmFtcyBmb3IgYSBuZXcgbWVhc3VyZVxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXQgZGVmYXVsdHMoKTogU21vTWVhc3VyZVBhcmFtcyB7XHJcbiAgICBjb25zdCBwcm90bzogYW55ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShTbW9NZWFzdXJlLl9kZWZhdWx0cykpO1xyXG4gICAgcHJvdG8uZm9ybWF0ID0gbmV3IFNtb01lYXN1cmVGb3JtYXQoU21vTWVhc3VyZUZvcm1hdC5kZWZhdWx0cyk7XHJcbiAgICBwcm90by50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQoU21vVGVtcG9UZXh0LmRlZmF1bHRzKTtcclxuICAgIHByb3RvLm1vZGlmaWVycy5wdXNoKG5ldyBTbW9CYXJsaW5lKHtcclxuICAgICAgcG9zaXRpb246IFNtb0JhcmxpbmUucG9zaXRpb25zLnN0YXJ0LFxyXG4gICAgICBiYXJsaW5lOiBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhclxyXG4gICAgfSkpO1xyXG4gICAgcHJvdG8ubW9kaWZpZXJzLnB1c2gobmV3IFNtb0JhcmxpbmUoe1xyXG4gICAgICBwb3NpdGlvbjogU21vQmFybGluZS5wb3NpdGlvbnMuZW5kLFxyXG4gICAgICBiYXJsaW5lOiBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhclxyXG4gICAgfSkpO1xyXG4gICAgcmV0dXJuIHByb3RvO1xyXG4gIH1cclxuICAvLyBAaWdub3JlXHJcbiAgc3RhdGljIGNvbnZlcnRMZWdhY3lUaW1lU2lnbmF0dXJlKHRzOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJ2ID0gbmV3IFRpbWVTaWduYXR1cmUoVGltZVNpZ25hdHVyZS5kZWZhdWx0cyk7XHJcbiAgICBydi50aW1lU2lnbmF0dXJlID0gdHM7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIHRpbWVTaWduYXR1cmU6IFRpbWVTaWduYXR1cmUgPSBTbW9NZWFzdXJlLnRpbWVTaWduYXR1cmVEZWZhdWx0O1xyXG4gIC8qKlxyXG4gICAqIE92ZXJyaWRlcyBkaXNwbGF5IG9mIGFjdHVhbCB0aW1lIHNpZ25hdHVyZSwgaW4gdGhlIGNhc2Ugb2ZcclxuICAgKiBwaWNrLXVwIG5vdGVzIHdoZXJlIHRoZSBhY3R1YWwgYW5kIGRpc3BsYXllZCBkdXJhdGlvbnMgYXJlIGRpZmZlcmVudFxyXG4gICAqL1xyXG4gIGtleVNpZ25hdHVyZTogc3RyaW5nID0gJyc7XHJcbiAgY2FuY2VsZWRLZXlTaWduYXR1cmU6IHN0cmluZyA9ICcnO1xyXG4gIHR1cGxldFRyZWVzOiBTbW9UdXBsZXRUcmVlW10gPSBbXTtcclxuICByZXBlYXRTeW1ib2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICByZXBlYXRDb3VudDogbnVtYmVyID0gMDtcclxuICBjdG9yOiBzdHJpbmc9J1Ntb01lYXN1cmUnO1xyXG4gIC8qKlxyXG4gICAqIEFkanVzdCBmb3Igbm9uLWNvbmNlcnQgcGl0Y2ggaW50c3RydW1lbnRzXHJcbiAgICovXHJcbiAgdHJhbnNwb3NlSW5kZXg6IG51bWJlciA9IDA7XHJcbiAgbW9kaWZpZXJzOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlW10gPSBbXTtcclxuICAvKipcclxuICAgKiBSb3csIGNvbHVtbiwgYW5kIGN1c3RvbSBudW1iZXJpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtZWFzdXJlLlxyXG4gICAqL1xyXG4gIG1lYXN1cmVOdW1iZXI6IE1lYXN1cmVOdW1iZXIgPSB7XHJcbiAgICBsb2NhbEluZGV4OiAwLFxyXG4gICAgc3lzdGVtSW5kZXg6IDAsXHJcbiAgICBtZWFzdXJlSW5kZXg6IDAsXHJcbiAgICBzdGFmZklkOiAwXHJcbiAgfTtcclxuICBjbGVmOiBDbGVmID0gJ3RyZWJsZSc7XHJcbiAgdm9pY2VzOiBTbW9Wb2ljZVtdID0gW107XHJcbiAgLyoqXHJcbiAgICogdGhlIGFjdGl2ZSB2b2ljZSBpbiB0aGUgZWRpdG9yLCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgdm9pY2VzXHJcbiAgICogICovXHJcbiAgYWN0aXZlVm9pY2U6IG51bWJlciA9IDA7XHJcbiAgdGVtcG86IFNtb1RlbXBvVGV4dDtcclxuICBiZWFtR3JvdXBzOiBJU21vQmVhbUdyb3VwW10gPSBbXTtcclxuICBsaW5lczogbnVtYmVyID0gNTtcclxuICAvKipcclxuICAgKiBSdW50aW1lIGluZm9ybWF0aW9uIGFib3V0IHJlbmRlcmluZ1xyXG4gICAqL1xyXG4gIHN2ZzogTWVhc3VyZVN2ZztcclxuICAvKipcclxuICAgKiBNZWFzdXJlLXNwZWNpZmljIGZvcm1hdHRpbmcgcGFyYW1ldGVycy5cclxuICAgKi9cclxuICBmb3JtYXQ6IFNtb01lYXN1cmVGb3JtYXQ7XHJcbiAgLyoqXHJcbiAgICogSW5mb3JtYXRpb24gZm9yIGlkZW50aWZ5aW5nIHRoaXMgb2JqZWN0XHJcbiAgICovXHJcbiAgaWQ6IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogRmlsbCBpbiBjb21wb25lbnRzLiAgV2UgYXNzdW1lIHRoZSBtb2RpZmllcnMgYXJlIGFscmVhZHkgY29uc3RydWN0ZWQsXHJcbiAgICogZS5nLiBieSBkZXNlcmlhbGl6ZSBvciB0aGUgY2FsbGluZyBmdW5jdGlvbi5cclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IocGFyYW1zOiBTbW9NZWFzdXJlUGFyYW1zKSB7XHJcbiAgICB0aGlzLnRlbXBvID0gbmV3IFNtb1RlbXBvVGV4dChTbW9UZW1wb1RleHQuZGVmYXVsdHMpO1xyXG4gICAgdGhpcy5zdmcgPSB7XHJcbiAgICAgIHN0YWZmV2lkdGg6IDAsXHJcbiAgICAgIHVuanVzdGlmaWVkV2lkdGg6IDAsXHJcbiAgICAgIHN0YWZmWDogMCxcclxuICAgICAgc3RhZmZZOiAwLFxyXG4gICAgICBsb2dpY2FsQm94OiB7XHJcbiAgICAgICAgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMFxyXG4gICAgICB9LFxyXG4gICAgICB5VG9wOiAwLFxyXG4gICAgICBhZGpYOiAwLFxyXG4gICAgICBtYXhDb2x1bW5TdGFydFg6IDAsXHJcbiAgICAgIGFkalJpZ2h0OiAwLFxyXG4gICAgICBoaXN0b3J5OiBbXSxcclxuICAgICAgbGluZUluZGV4OiAwLFxyXG4gICAgICBwYWdlSW5kZXg6IDAsXHJcbiAgICAgIHJvd0luU3lzdGVtOiAwLFxyXG4gICAgICBmb3JjZUNsZWY6IGZhbHNlLFxyXG4gICAgICBmb3JjZUtleVNpZ25hdHVyZTogZmFsc2UsXHJcbiAgICAgIGZvcmNlVGltZVNpZ25hdHVyZTogZmFsc2UsXHJcbiAgICAgIGZvcmNlVGVtcG86IGZhbHNlLFxyXG4gICAgICBoaWRlRW1wdHlNZWFzdXJlOiBmYWxzZSxcclxuICAgICAgaGlkZU11bHRpbWVhc3VyZTogZmFsc2UsXHJcbiAgICAgIG11bHRpbWVhc3VyZUxlbmd0aDogMCxcclxuICAgICAgbXVsdGltZWFzdXJlRW5kQmFybGluZTogU21vQmFybGluZS5iYXJsaW5lc1snc2luZ2xlQmFyJ10sXHJcbiAgICAgIGVsZW1lbnQ6IG51bGxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZGVmYXVsdHMgPSBTbW9NZWFzdXJlLmRlZmF1bHRzO1xyXG4gICAgU21vTWVhc3VyZU51bWJlclBhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIChwYXJhbXNbcGFyYW1dKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICB0aGlzW3BhcmFtXSA9IHBhcmFtc1twYXJhbV07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgU21vTWVhc3VyZVN0cmluZ1BhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xyXG4gICAgICB0aGlzW3BhcmFtXSA9IHBhcmFtc1twYXJhbV0gPyBwYXJhbXNbcGFyYW1dIDogZGVmYXVsdHNbcGFyYW1dO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNsZWYgPSBwYXJhbXMuY2xlZjtcclxuICAgIHRoaXMucmVwZWF0U3ltYm9sID0gcGFyYW1zLnJlcGVhdFN5bWJvbDtcclxuICAgIHRoaXMubWVhc3VyZU51bWJlciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocGFyYW1zLm1lYXN1cmVOdW1iZXIpKTtcclxuICAgIGlmIChwYXJhbXMudGVtcG8pIHtcclxuICAgICAgdGhpcy50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQocGFyYW1zLnRlbXBvKTtcclxuICAgIH1cclxuICAgIC8vIEhhbmRsZSBsZWdhY3kgdGltZSBzaWduYXR1cmUgZm9ybWF0XHJcbiAgICBpZiAocGFyYW1zLnRpbWVTaWduYXR1cmUpIHtcclxuICAgICAgY29uc3QgdHNBbnkgPSBwYXJhbXMudGltZVNpZ25hdHVyZSBhcyBhbnk7XHJcbiAgICAgIGlmICh0eXBlb2YgKHRzQW55KSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0aGlzLnRpbWVTaWduYXR1cmUgPSBTbW9NZWFzdXJlLmNvbnZlcnRMZWdhY3lUaW1lU2lnbmF0dXJlKHRzQW55KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRpbWVTaWduYXR1cmUgPSBUaW1lU2lnbmF0dXJlLmNyZWF0ZUZyb21QYXJ0aWFsKHRzQW55KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy52b2ljZXMgPSBwYXJhbXMudm9pY2VzID8gcGFyYW1zLnZvaWNlcyA6IFtdO1xyXG4gICAgdGhpcy50dXBsZXRUcmVlcyA9IHBhcmFtcy50dXBsZXRUcmVlcyA/IHBhcmFtcy50dXBsZXRUcmVlcyA6IFtdO1xyXG4gICAgdGhpcy5tb2RpZmllcnMgPSBwYXJhbXMubW9kaWZpZXJzID8gcGFyYW1zLm1vZGlmaWVycyA6IGRlZmF1bHRzLm1vZGlmaWVycztcclxuICAgIHRoaXMuc2V0RGVmYXVsdEJhcmxpbmVzKCk7XHJcbiAgICB0aGlzLmtleVNpZ25hdHVyZSA9IFNtb011c2ljLnZleEtleVNpZ1dpdGhPZmZzZXQodGhpcy5rZXlTaWduYXR1cmUsIHRoaXMudHJhbnNwb3NlSW5kZXgpO1xyXG5cclxuICAgIGlmICghKHBhcmFtcy5mb3JtYXQpKSB7XHJcbiAgICAgIHRoaXMuZm9ybWF0ID0gbmV3IFNtb01lYXN1cmVGb3JtYXQoU21vTWVhc3VyZUZvcm1hdC5kZWZhdWx0cyk7XHJcbiAgICAgIHRoaXMuZm9ybWF0Lm1lYXN1cmVJbmRleCA9IHRoaXMubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXg7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm1hdCA9IG5ldyBTbW9NZWFzdXJlRm9ybWF0KHBhcmFtcy5mb3JtYXQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pZCA9IGdldElkKCkudG9TdHJpbmcoKTtcclxuICAgIHRoaXMudXBkYXRlQ2xlZkNoYW5nZU5vdGVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyBAaW50ZXJuYWxcclxuICAvLyB1c2VkIGZvciBzZXJpYWxpemF0aW9uXHJcbiAgc3RhdGljIGdldCBkZWZhdWx0QXR0cmlidXRlcygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICdrZXlTaWduYXR1cmUnLCBcclxuICAgICAgJ21lYXN1cmVOdW1iZXInLFxyXG4gICAgICAnYWN0aXZlVm9pY2UnLCAnY2xlZicsICd0cmFuc3Bvc2VJbmRleCcsXHJcbiAgICAgICdmb3JtYXQnLCAncmlnaHRNYXJnaW4nLCAnbGluZXMnLCAncmVwZWF0U3ltYm9sJywgJ3JlcGVhdENvdW50J1xyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIC8vIEBpbnRlcm5hbFxyXG4gIC8vIHVzZWQgZm9yIHNlcmlhbGl6YXRpb25cclxuICBzdGF0aWMgZ2V0IGZvcm1hdHRpbmdPcHRpb25zKCkge1xyXG4gICAgcmV0dXJuIFsnY3VzdG9tU3RyZXRjaCcsICdjdXN0b21Qcm9wb3J0aW9uJywgJ2F1dG9KdXN0aWZ5JywgJ3N5c3RlbUJyZWFrJyxcclxuICAgICAgJ3BhZ2VCcmVhaycsICdwYWRMZWZ0J107XHJcbiAgfVxyXG4gIC8vIEBpbnRlcm5hbFxyXG4gIC8vIHVzZWQgZm9yIHNlcmlhbGl6YXRpb25cclxuICBzdGF0aWMgZ2V0IGNvbHVtbk1hcHBlZEF0dHJpYnV0ZXMoKSB7XHJcbiAgICByZXR1cm4gWyd0aW1lU2lnbmF0dXJlJywgJ2tleVNpZ25hdHVyZScsICd0ZW1wbyddO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IHNlcmlhbGl6YWJsZUF0dHJpYnV0ZXMoKSB7XHJcbiAgICBjb25zdCBydjogYW55ID0gW107XHJcbiAgICBTbW9NZWFzdXJlLmRlZmF1bHRBdHRyaWJ1dGVzLmZvckVhY2goKGF0dHIpID0+IHtcclxuICAgICAgaWYgKFNtb01lYXN1cmUuY29sdW1uTWFwcGVkQXR0cmlidXRlcy5pbmRleE9mKGF0dHIpIDwgMCAmJiBhdHRyICE9PSAnZm9ybWF0Jykge1xyXG4gICAgICAgIHJ2LnB1c2goYXR0cik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICAvKipcclxuICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGltZSBzaWduYXR1cmVzIGFyZSB0aGUgc2FtZSwgZm9yIGRpc3BsYXkgcHVycG9zZXMgKGUuZy4gaWYgYSB0aW1lIHNpZyBjaGFuZ2VcclxuICAvLyBpcyByZXF1aXJlZClcclxuICAqL1xyXG4gIHN0YXRpYyB0aW1lU2lnRXF1YWwobzE6IFRpbWVTaWduYXR1cmUsIG8yOiBUaW1lU2lnbmF0dXJlKSB7XHJcbiAgICByZXR1cm4gbzEudGltZVNpZ25hdHVyZSA9PT0gbzIudGltZVNpZ25hdHVyZSAmJiBvMS51c2VTeW1ib2wgPT09IG8yLnVzZVN5bWJvbDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSWYgdGhlcmUgaXMgYSBjbGVmIGNoYW5nZSBtaWQtbWVhc3VyZSwgdXBkYXRlIHRoZSBhY3R1YWwgY2xlZnMgb2YgdGhlIG5vdGVzXHJcbiAgICogc28gdGhleSBkaXNwbGF5IGNvcnJlY3RseS5cclxuICAgKi9cclxuICB1cGRhdGVDbGVmQ2hhbmdlTm90ZXMoKSB7XHJcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgbGV0IGN1clRpY2sgPSAwO1xyXG4gICAgbGV0IGNsZWZDaGFuZ2UgPSB0aGlzLmNsZWY7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0gdGhpcy52b2ljZXNbaV07XHJcbiAgICAgIGN1clRpY2sgID0gMDtcclxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2b2ljZS5ub3Rlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGNvbnN0IHNtb05vdGUgPSB2b2ljZS5ub3Rlc1tqXTtcclxuICAgICAgICBzbW9Ob3RlLmNsZWYgPSB0aGlzLmNsZWY7XHJcbiAgICAgICAgaWYgKHNtb05vdGUuY2xlZk5vdGUgJiYgc21vTm90ZS5jbGVmTm90ZS5jbGVmICE9PSB0aGlzLmNsZWYpIHtcclxuICAgICAgICAgIGNsZWZDaGFuZ2UgPSBzbW9Ob3RlLmNsZWZOb3RlLmNsZWY7XHJcbiAgICAgICAgICBjdXJUaWNrICs9IHNtb05vdGUudGlja0NvdW50O1xyXG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY3VyVGljayAgKz0gc21vTm90ZS50aWNrQ291bnQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNoYW5nZWQpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCFjaGFuZ2VkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIGNsZWZDaGFuZ2VUaWNrIGlzIHdoZXJlIHRoZSBjaGFuZ2UgZ29lcy4gIFdlIG9ubHkgc3VwcG9ydFxyXG4gICAgLy8gb25lIHBlciBtZWFzdXJlLCBvdGhlcnMgYXJlIGlnbm9yZWQuXHJcbiAgICBjb25zdCBjbGVmQ2hhbmdlVGljayA9IGN1clRpY2s7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB2b2ljZSA9IHRoaXMudm9pY2VzW2ldO1xyXG4gICAgICBjdXJUaWNrICA9IDA7XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBjb25zdCBzbW9Ob3RlID0gdm9pY2Uubm90ZXNbal07XHJcbiAgICAgICAgY29uc3Qgbm90ZVRpY2tzID0gc21vTm90ZS50aWNrQ291bnQ7XHJcbiAgICAgICAgaWYgKGN1clRpY2sgKyBub3RlVGlja3MgPj0gY2xlZkNoYW5nZVRpY2spIHtcclxuICAgICAgICAgIHNtb05vdGUuY2xlZiA9IGNsZWZDaGFuZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJlbW92ZSBhbnkgcmVkdW5kYW50IGNsZWYgY2hhbmdlcyBsYXRlciBpbiB0aGUgbWVhc3VyZVxyXG4gICAgICAgIGlmIChjdXJUaWNrICsgbm90ZVRpY2tzID4gY2xlZkNoYW5nZVRpY2spIHtcclxuICAgICAgICAgIGlmIChzbW9Ob3RlLmNsZWZOb3RlICYmIHNtb05vdGUuY2xlZk5vdGUuY2xlZiA9PT0gY2xlZkNoYW5nZSkge1xyXG4gICAgICAgICAgICBzbW9Ob3RlLmNsZWZOb3RlID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY3VyVGljayArPSBub3RlVGlja3M7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogQGludGVybmFsXHJcbiAgICogQHJldHVybnMgY29sdW1uIG1hcHBlZCBwYXJhbWV0ZXJzLCBzZXJpYWxpemVkLiAgY2FsbGVyIHdpbGxcclxuICAgKiBkZWNpZGUgaWYgdGhlIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBwZXJzaXN0ZWRcclxuICAgKi9cclxuICBzZXJpYWxpemVDb2x1bW5NYXBwZWQoKTogQ29sdW1uTWFwcGVkUGFyYW1zIHtcclxuICAgIC8vXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0aW1lU2lnbmF0dXJlOiB0aGlzLnRpbWVTaWduYXR1cmUuc2VyaWFsaXplKCksXHJcbiAgICAgIGtleVNpZ25hdHVyZTogdGhpcy5rZXlTaWduYXR1cmUsXHJcbiAgICAgIHRlbXBvOiB0aGlzLnRlbXBvLnNlcmlhbGl6ZSgpXHJcbiAgICB9O1xyXG4gIH1cclxuICBnZXRDb2x1bW5NYXBwZWQoKTogQ29sdW1uTWFwcGVkUGFyYW1zIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRpbWVTaWduYXR1cmU6IHRoaXMudGltZVNpZ25hdHVyZSxcclxuICAgICAga2V5U2lnbmF0dXJlOiB0aGlzLmtleVNpZ25hdHVyZSxcclxuICAgICAgdGVtcG86IHRoaXMudGVtcG9cclxuICAgIH07XHJcbiAgfSAgXHJcbiAgLyoqXHJcbiAgICogQ29udmVydCB0aGlzIG1lYXN1cmUgb2JqZWN0IHRvIGEgSlNPTiBvYmplY3QsIHJlY3Vyc2l2ZWx5IHNlcmlhbGl6aW5nIGFsbCB0aGUgbm90ZXMsXHJcbiAgICogbm90ZSBtb2RpZmllcnMsIGV0Yy5cclxuICAgKi9cclxuICBzZXJpYWxpemUoKTogU21vTWVhc3VyZVBhcmFtc1NlciB7XHJcbiAgICBjb25zdCBwYXJhbXM6IFBhcnRpYWw8U21vTWVhc3VyZVBhcmFtc1Nlcj4gPSB7IFwiY3RvclwiOiBcIlNtb01lYXN1cmVcIiB9O1xyXG4gICAgbGV0IHNlciA9IHRydWU7XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlTm9uRGVmYXVsdChTbW9NZWFzdXJlLmRlZmF1bHRzLCBTbW9NZWFzdXJlLnNlcmlhbGl6YWJsZUF0dHJpYnV0ZXMsIHRoaXMsIHBhcmFtcyk7XHJcbiAgICAvLyBEb24ndCBzZXJpYWxpemUgZGVmYXVsdCB0aGluZ3NcclxuICAgIGNvbnN0IGZtdCA9IHRoaXMuZm9ybWF0LnNlcmlhbGl6ZSgpO1xyXG4gICAgLy8gbWVhc3VyZSBudW1iZXIgY2FuJ3QgYmUgZGVmYXVsdGVkIGIvYyB0ZW1wb3MgZXRjLiBjYW4gbWFwIHRvIGRlZmF1bHQgbWVhc3VyZVxyXG4gICAgcGFyYW1zLm1lYXN1cmVOdW1iZXIgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMubWVhc3VyZU51bWJlcikpO1xyXG4gICAgcGFyYW1zLnR1cGxldFRyZWVzID0gW107XHJcbiAgICBwYXJhbXMudm9pY2VzID0gW107XHJcbiAgICBwYXJhbXMubW9kaWZpZXJzID0gW107XHJcblxyXG4gICAgdGhpcy50dXBsZXRUcmVlcy5mb3JFYWNoKCh0dXBsZXRUcmVlKSA9PiB7XHJcbiAgICAgIHBhcmFtcy50dXBsZXRUcmVlcyEucHVzaCh0dXBsZXRUcmVlLnNlcmlhbGl6ZSgpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG9iajogYW55ID0ge1xyXG5cclxuICAgICAgICBub3RlczogW11cclxuICAgICAgfTtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgobm90ZSkgPT4ge1xyXG4gICAgICAgIG9iai5ub3Rlcy5wdXNoKG5vdGUuc2VyaWFsaXplKCkpO1xyXG4gICAgICB9KTtcclxuICAgICAgcGFyYW1zLnZvaWNlcyEucHVzaChvYmopO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5tb2RpZmllcnMuZm9yRWFjaCgobW9kaWZpZXIpID0+IHtcclxuICAgICAgc2VyID0gdHJ1ZTtcclxuICAgICAgLyogZG9uJ3Qgc2VyaWFsaXplIGRlZmF1bHQgbW9kaWZpZXJzICovXHJcbiAgICAgIGlmIChtb2RpZmllci5jdG9yID09PSAnU21vQmFybGluZScgJiYgKG1vZGlmaWVyIGFzIFNtb0JhcmxpbmUpLnBvc2l0aW9uID09PSBTbW9CYXJsaW5lLnBvc2l0aW9ucy5zdGFydCAmJlxyXG4gICAgICAgIChtb2RpZmllciBhcyBTbW9CYXJsaW5lKS5iYXJsaW5lID09PSBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhcikge1xyXG4gICAgICAgIHNlciA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKG1vZGlmaWVyLmN0b3IgPT09ICdTbW9CYXJsaW5lJyAmJiAobW9kaWZpZXIgYXMgU21vQmFybGluZSkucG9zaXRpb24gPT09IFNtb0JhcmxpbmUucG9zaXRpb25zLmVuZFxyXG4gICAgICAgICYmIChtb2RpZmllciBhcyBTbW9CYXJsaW5lKS5iYXJsaW5lID09PSBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhcikge1xyXG4gICAgICAgIHNlciA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKG1vZGlmaWVyLmN0b3IgPT09ICdTbW9UZW1wb1RleHQnKSB7XHJcbiAgICAgICAgLy8gd2UgZG9uJ3Qgc2F2ZSB0ZW1wbyB0ZXh0IGFzIGEgbW9kaWZpZXIgYW55bW9yZVxyXG4gICAgICAgIHNlciA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKChtb2RpZmllciBhcyBTbW9SZXBlYXRTeW1ib2wpLmN0b3IgPT09ICdTbW9SZXBlYXRTeW1ib2wnICYmIChtb2RpZmllciBhcyBTbW9SZXBlYXRTeW1ib2wpLnBvc2l0aW9uID09PSBTbW9SZXBlYXRTeW1ib2wucG9zaXRpb25zLnN0YXJ0XHJcbiAgICAgICAgJiYgKG1vZGlmaWVyIGFzIFNtb1JlcGVhdFN5bWJvbCkuc3ltYm9sID09PSBTbW9SZXBlYXRTeW1ib2wuc3ltYm9scy5Ob25lKSB7XHJcbiAgICAgICAgc2VyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNlcikge1xyXG4gICAgICAgIHBhcmFtcy5tb2RpZmllcnMhLnB1c2gobW9kaWZpZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIFsndGltZVNpZ25hdHVyZScsICdrZXlTaWduYXR1cmUnLCAndGVtcG8nXVxyXG4gICAgaWYgKCFpc1Ntb01lYXN1cmVQYXJhbXNTZXIocGFyYW1zKSkge1xyXG4gICAgICB0aHJvdyAnaW52YWxpZCBtZWFzdXJlJztcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIER1ZSB0byBhIGJ1Zywgc29tZSB0dXBsZXRzIGhhdmUgaW5jb3JyZWN0IHRpY2tzLiAgRml4IGl0IHdoZW4gd2UgYXJlIGRlc2VyaWFsaXppbmcgdGhlIG1lYXN1cmVcclxuICAgKiBAcGFyYW0gdm9pY2VzIFxyXG4gICAqIEBwYXJhbSB0dXBsZXRUcmVlIFxyXG4gICAqL1xyXG4gIHN0YXRpYyBmaXhUdXBsZXRMZW5ndGhzKHZvaWNlczogU21vVm9pY2VbXSwgdHVwbGV0VHJlZTogU21vVHVwbGV0VHJlZSkge1xyXG4gICAgY29uc3Qgdm9pY2UgPSB2b2ljZXNbdHVwbGV0VHJlZS52b2ljZV07XHJcbiAgICBjb25zdCBub3RlYXIgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSB0dXBsZXRUcmVlLnN0YXJ0SW5kZXg7IGkgPD0gdHVwbGV0VHJlZS5lbmRJbmRleDsgKytpKSB7XHJcbiAgICAgIGlmICh2b2ljZS5ub3Rlcy5sZW5ndGggPiBpKSB7XHJcbiAgICAgICAgbm90ZWFyLnB1c2godm9pY2Uubm90ZXNbaV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAobm90ZWFyLmxlbmd0aCA9PT0gKHR1cGxldFRyZWUuZW5kSW5kZXggLSB0dXBsZXRUcmVlLnN0YXJ0SW5kZXggKyAxKSkge1xyXG4gICAgICBjb25zdCB0aWNrU3VtID0gbm90ZWFyLm1hcCgoeCkgPT4geC50aWNrQ291bnQpLnJlZHVjZSgoYSxiKSA9PiBhICsgYik7XHJcbiAgICAgIGlmICh0dXBsZXRUcmVlLnRvdGFsVGlja3MgPiB0aWNrU3VtKSB7XHJcbiAgICAgICAgbm90ZWFyWzBdLnRpY2tzLm51bWVyYXRvciArPSB0dXBsZXRUcmVlLnRvdGFsVGlja3MgLSB0aWNrU3VtO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHJlc3RvcmUgYSBzZXJpYWxpemVkIG1lYXN1cmUgb2JqZWN0LiAgVXN1YWxseSBjYWxsZWQgYXMgcGFydCBvZiBkZXNlcmlhbGl6aW5nIGEgc2NvcmUsXHJcbiAgICogYnV0IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVzdG9yZSBhIG1lYXN1cmUgZHVlIHRvIGFuIHVuZG8gb3BlcmF0aW9uLiAgUmVjdXJzaXZlbHlcclxuICAgKiBkZXNlcmlhbGl6ZSBhbGwgdGhlIG5vdGVzIGFuZCBtb2RpZmllcnMgdG8gY29uc3RydWN0IGEgbmV3IG1lYXN1cmUuXHJcbiAgICogQHBhcmFtIGpzb25PYmogdGhlIHNlcmlhbGl6ZWQgU21vTWVhc3VyZVxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgc3RhdGljIGRlc2VyaWFsaXplKGpzb25PYmo6IFNtb01lYXN1cmVQYXJhbXNTZXIpOiBTbW9NZWFzdXJlIHtcclxuICAgIGxldCBqID0gMDtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IHZvaWNlczogU21vVm9pY2VbXSA9IFtdO1xyXG4gICAgZm9yIChqID0gMDsgaiA8IGpzb25PYmoudm9pY2VzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0ganNvbk9iai52b2ljZXNbal07XHJcbiAgICAgIGNvbnN0IG5vdGVzOiBTbW9Ob3RlW10gPSBbXTtcclxuICAgICAgdm9pY2VzLnB1c2goe1xyXG4gICAgICAgIG5vdGVzXHJcbiAgICAgIH0pO1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgICBjb25zdCBub3RlUGFyYW1zID0gdm9pY2Uubm90ZXNbaV07XHJcbiAgICAgICAgY29uc3Qgc21vTm90ZSA9IFNtb05vdGUuZGVzZXJpYWxpemUobm90ZVBhcmFtcyk7XHJcbiAgICAgICAgbm90ZXMucHVzaChzbW9Ob3RlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1vZGlmaWVyczogU21vTWVhc3VyZU1vZGlmaWVyQmFzZVtdID0gW107XHJcbiAgICBqc29uT2JqLm1vZGlmaWVycy5mb3JFYWNoKChtb2RQYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBtb2RpZmllcjogU21vTWVhc3VyZU1vZGlmaWVyQmFzZSA9IFNtb01lYXN1cmVNb2RpZmllckJhc2UuZGVzZXJpYWxpemUobW9kUGFyYW1zKTtcclxuICAgICAgbW9kaWZpZXJzLnB1c2gobW9kaWZpZXIpO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBwYXJhbXM6IFNtb01lYXN1cmVQYXJhbXMgPSBTbW9NZWFzdXJlLmRlZmF1bHRzO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9NZWFzdXJlLmRlZmF1bHRBdHRyaWJ1dGVzLCBqc29uT2JqLCBwYXJhbXMpO1xyXG5cclxuICAgIC8vIGV4cGxvZGUgY29sdW1uLW1hcHBlZFxyXG4gICAgaWYgKGpzb25PYmoudGVtcG8pIHtcclxuICAgICAgcGFyYW1zLnRlbXBvID0gU21vVGVtcG9UZXh0LmRlc2VyaWFsaXplKGpzb25PYmoudGVtcG8pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcGFyYW1zLnRlbXBvID0gbmV3IFNtb1RlbXBvVGV4dChTbW9UZW1wb1RleHQuZGVmYXVsdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRpbWVTaWduYXR1cmVTdHJpbmcgaXMgbm93IHBhcnQgb2YgdGltZVNpZ25hdHVyZS4gIHVwY29udmVydCBvbGQgc2NvcmVzXHJcbiAgICBsZXQgdGltZVNpZ25hdHVyZVN0cmluZyA9ICcnO1xyXG4gICAgY29uc3QganNvbkxlZ2FjeSA9IChqc29uT2JqIGFzIGFueSk7XHJcbiAgICBpZiAodHlwZW9mKGpzb25MZWdhY3kudGltZVNpZ25hdHVyZVN0cmluZykgPT09ICdzdHJpbmcnICYmIGpzb25MZWdhY3kudGltZVNpZ25hdHVyZVN0cmluZy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRpbWVTaWduYXR1cmVTdHJpbmcgPSBqc29uTGVnYWN5LnRpbWVTaWduYXR1cmVTdHJpbmc7XHJcbiAgICB9XHJcbiAgICBpZiAoanNvbk9iai50aW1lU2lnbmF0dXJlKSB7XHJcbiAgICAgIGlmICh0aW1lU2lnbmF0dXJlU3RyaW5nLmxlbmd0aCkge1xyXG4gICAgICAgIGpzb25PYmoudGltZVNpZ25hdHVyZS5kaXNwbGF5U3RyaW5nID0gdGltZVNpZ25hdHVyZVN0cmluZzsgIFxyXG4gICAgICB9XHJcbiAgICAgIHBhcmFtcy50aW1lU2lnbmF0dXJlID0gVGltZVNpZ25hdHVyZS5kZXNlcmlhbGl6ZShqc29uT2JqLnRpbWVTaWduYXR1cmUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgdHBhcmFtcyA9IFRpbWVTaWduYXR1cmUuZGVmYXVsdHM7XHJcbiAgICAgIGlmICh0aW1lU2lnbmF0dXJlU3RyaW5nLmxlbmd0aCkge1xyXG4gICAgICAgIHRwYXJhbXMuZGlzcGxheVN0cmluZyA9IHRpbWVTaWduYXR1cmVTdHJpbmc7XHJcbiAgICAgIH1cclxuICAgICAgcGFyYW1zLnRpbWVTaWduYXR1cmUgPSBuZXcgVGltZVNpZ25hdHVyZSh0cGFyYW1zKTtcclxuICAgIH1cclxuICAgIHBhcmFtcy5rZXlTaWduYXR1cmUgPSBqc29uT2JqLmtleVNpZ25hdHVyZSA/PyAnQyc7XHJcbiAgICBwYXJhbXMudm9pY2VzID0gdm9pY2VzO1xyXG5cclxuICAgIGlmICgoanNvbk9iaiBhcyBhbnkpLnR1cGxldFRyZWVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IGpzb25PYmoudHVwbGV0VHJlZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBjb25zdCB0dXBsZXRUcmVlSnNvbiA9IGpzb25PYmoudHVwbGV0VHJlZXNbal07XHJcbiAgICAgICAgY29uc3QgdHVwbGV0VHJlZSA9IFNtb1R1cGxldFRyZWUuZGVzZXJpYWxpemUodHVwbGV0VHJlZUpzb24pO1xyXG4gICAgICAgIHBhcmFtcy50dXBsZXRUcmVlcy5wdXNoKHR1cGxldFRyZWUpO1xyXG4gICAgICAgIFNtb01lYXN1cmUuZml4VHVwbGV0TGVuZ3Rocyh2b2ljZXMsIHR1cGxldFRyZWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvL2Rlc2VyaWFsaXphdGlvbiBvZiBhIGxlZ2FjeSB0dXBsZXRzXHJcbiAgICAvL2xlZ2FjeSBzY2hlbWEgaGFkIG1lYXN1cmUudHVwbGV0cywgaXQgaXMgbWVhc3VyZS50dXBsZXRUcmVlcyBub3dcclxuICAgIGlmICgoanNvbk9iaiBhcyBhbnkpLnR1cGxldHMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgKGpzb25PYmogYXMgYW55KS50dXBsZXRzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3QgdHVwSnNvbiA9IChqc29uT2JqIGFzIGFueSkudHVwbGV0c1tqXTtcclxuXHJcbiAgICAgICAgLy8gTGVnYWN5IHNjaGVtYSBoYWQgYXR0cnMuaWQsIG5vdyBpdCBpcyBqdXN0IGlkXHJcbiAgICAgICAgaWYgKCh0dXBKc29uIGFzIGFueSkuYXR0cnMgJiYgKHR1cEpzb24gYXMgYW55KS5hdHRycy5pZCkge1xyXG4gICAgICAgICAgdHVwSnNvbi5pZCA9ICh0dXBKc29uIGFzIGFueSkuYXR0cnMuaWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0dXBsZXROb3RlczogU21vTm90ZVtdID0gW107XHJcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIHBhcmFtcy52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKG5vdGUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGJhY2t3YXJkcy1jb21wYXRpYmlsaWl0eSwgc29tZSBzY29yZXMgZG9uJ3QgaGF2ZSBhdHRycyBvbiB0dXBsZXRcclxuICAgICAgICAgICAgaWYgKHR5cGVvZih0dXBKc29uLmlkKSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICB0dXBKc29uLmF0dHJzID0geyB0eXBlOiAnU21vVHVwbGV0JywgaWQ6IHR1cEpzb24uaWQgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBpZCA9IHR1cEpzb24uYXR0cnMuaWQ7XHJcbiAgICAgICAgICAgIGlmIChub3RlLmlzVHVwbGV0ICYmIG5vdGUudHVwbGV0SWQgPT09IGlkKSB7XHJcbiAgICAgICAgICAgICAgdHVwbGV0Tm90ZXMucHVzaChub3RlKTtcclxuICAgICAgICAgICAgICAvL3dlIGNhbm5vdCB0cnVzdCBzdGFydEluZGV4IGNvbWluZyBmcm9tIGxlZ2FjeSBqc29uXHJcbiAgICAgICAgICAgICAgLy93ZSBuZWVkIHRvIGNvdW50IGluZGV4IG9mIHRoZSBmaXJzdCBub3RlIGluIHRoZSB0dXBsZXRcclxuICAgICAgICAgICAgICBpZiAoc3RhcnRJbmRleCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEJ1ZyBmaXg6ICBBIHR1cGxldCB3aXRoIG5vIG5vdGVzIG1heSBiZSBiZWVuIG92ZXJ3cml0dGVuXHJcbiAgICAgICAgLy8gaW4gYSBjb3B5L3Bhc3RlIG9wZXJhdGlvblxyXG4gICAgICAgIGlmICh0dXBsZXROb3Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0dXBKc29uLm5vdGVzID0gdHVwbGV0Tm90ZXM7XHJcbiAgICAgICAgICB0dXBKc29uLnN0YXJ0SW5kZXggPSBzdGFydEluZGV4O1xyXG4gICAgICAgICAgdHVwSnNvbi5lbmRJbmRleCA9IHR1cEpzb24uc3RhcnRJbmRleCArIHR1cGxldE5vdGVzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0dXBsZXQ6IFNtb1R1cGxldCA9IFNtb1R1cGxldC5kZXNlcmlhbGl6ZSh0dXBKc29uKTtcclxuICAgICAgICBjb25zdCB0dXBsZXRUcmVlOiBTbW9UdXBsZXRUcmVlID0gbmV3IFNtb1R1cGxldFRyZWUoe3R1cGxldDogdHVwbGV0fSk7XHJcbiAgICAgICAgcGFyYW1zLnR1cGxldFRyZWVzLnB1c2godHVwbGV0VHJlZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChwYXJhbXMudHVwbGV0VHJlZXMubGVuZ3RoKSB7XHJcbiAgICAgIFNtb1R1cGxldFRyZWUuc3luY1R1cGxldElkcyhwYXJhbXMudHVwbGV0VHJlZXMsIHZvaWNlcylcclxuICAgIH1cclxuXHJcbiAgICBwYXJhbXMubW9kaWZpZXJzID0gbW9kaWZpZXJzO1xyXG4gICAgY29uc3QgbWVhc3VyZSA9IG5ldyBTbW9NZWFzdXJlKHBhcmFtcyk7XHJcbiAgICAvLyBIYW5kbGUgbWlncmF0aW9uIGZvciBtZWFzdXJlLW1hcHBlZCBwYXJhbWV0ZXJzXHJcbiAgICBtZWFzdXJlLm1vZGlmaWVycy5mb3JFYWNoKChtb2QpID0+IHtcclxuICAgICAgaWYgKG1vZC5jdG9yID09PSAnU21vVGVtcG9UZXh0Jykge1xyXG4gICAgICAgIG1lYXN1cmUudGVtcG8gPSAobW9kIGFzIFNtb1RlbXBvVGV4dCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKCFtZWFzdXJlLnRlbXBvKSB7XHJcbiAgICAgIG1lYXN1cmUudGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KFNtb1RlbXBvVGV4dC5kZWZhdWx0cyk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICByZXR1cm4gbWVhc3VyZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjbG9uZShtZWFzdXJlOiBTbW9NZWFzdXJlKTogU21vTWVhc3VyZSB7XHJcbiAgICByZXR1cm4gU21vTWVhc3VyZS5kZXNlcmlhbGl6ZShtZWFzdXJlLnNlcmlhbGl6ZSgpKTtcclxuICB9XHJcbiAgc3RhdGljIGNsb25lRm9yUGFzdGVPclVuZG8obWVhc3VyZTogU21vTWVhc3VyZSkge1xyXG4gICAgY29uc3QgY2xvbmVkTWVhc3VyZSA9IFNtb01lYXN1cmUuY2xvbmUobWVhc3VyZSk7XHJcbiAgICBjbG9uZWRNZWFzdXJlLnN2ZyA9IG1lYXN1cmUuc3ZnO1xyXG4gICAgLy8gT3JkaW5hcmlseSwgdGhlIGtleS90ZW1wby90aW1lIGlzIG1hcHBlZCB0byB0aGUgc3RhdmUsIGJ1dCBzaW5jZSB3ZSBhcmUgcGFzdGluZyBtZWFzdXJlLWJ5XHJcbiAgICAvLyBtZWFzdXJlIGhlcmUsIHdlIHdhbnQgdG8gcHJlc2VydmUgaXQuXHJcbiAgICBjbG9uZWRNZWFzdXJlLmtleVNpZ25hdHVyZSA9IG1lYXN1cmUua2V5U2lnbmF0dXJlO1xyXG4gICAgY2xvbmVkTWVhc3VyZS50aW1lU2lnbmF0dXJlID0gbmV3IFRpbWVTaWduYXR1cmUobWVhc3VyZS50aW1lU2lnbmF0dXJlKTtcclxuICAgIGNsb25lZE1lYXN1cmUudGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KG1lYXN1cmUudGVtcG8pO1xyXG4gICAgcmV0dXJuIGNsb25lZE1lYXN1cmU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIGNyZWF0aW5nIGEgbmV3IG1lYXN1cmUsIHRoZSAnZGVmYXVsdCcgc2V0dGluZ3MgY2FuIHZhcnkgZGVwZW5kaW5nIG9uXHJcbiAgICogd2hhdCBjb21lcyBiZWZvcmUvYWZ0ZXIgdGhlIG1lYXN1cmUuICBUaGlzIGRldGVybWluZXMgdGhlIGRlZmF1bHQgcGl0Y2hcclxuICAgKiBmb3IgYSBjbGVmIChhcHBlYXJzIG9uIDNyZCBsaW5lKVxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXQgZGVmYXVsdFBpdGNoRm9yQ2xlZigpOiBSZWNvcmQ8Q2xlZiwgUGl0Y2g+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICd0cmVibGUnOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnYicsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJ24nLFxyXG4gICAgICAgIG9jdGF2ZTogNFxyXG4gICAgICB9LFxyXG4gICAgICAnYmFzcyc6IHtcclxuICAgICAgICBsZXR0ZXI6ICdkJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnbicsXHJcbiAgICAgICAgb2N0YXZlOiAzXHJcbiAgICAgIH0sXHJcbiAgICAgICd0ZW5vcic6IHtcclxuICAgICAgICBsZXR0ZXI6ICdhJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnbicsXHJcbiAgICAgICAgb2N0YXZlOiAzXHJcbiAgICAgIH0sXHJcbiAgICAgICdhbHRvJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2MnLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICduJyxcclxuICAgICAgICBvY3RhdmU6IDRcclxuICAgICAgfSxcclxuICAgICAgJ3NvcHJhbm8nOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnYicsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJ24nLFxyXG4gICAgICAgIG9jdGF2ZTogNFxyXG4gICAgICB9LFxyXG4gICAgICAncGVyY3Vzc2lvbic6IHtcclxuICAgICAgICBsZXR0ZXI6ICdiJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnbicsXHJcbiAgICAgICAgb2N0YXZlOiA0XHJcbiAgICAgIH0sXHJcbiAgICAgICdtZXp6by1zb3ByYW5vJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2InLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICduJyxcclxuICAgICAgICBvY3RhdmU6IDRcclxuICAgICAgfSxcclxuICAgICAgJ2Jhcml0b25lLWMnOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnYicsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJ24nLFxyXG4gICAgICAgIG9jdGF2ZTogM1xyXG4gICAgICB9LFxyXG4gICAgICAnYmFyaXRvbmUtZic6IHtcclxuICAgICAgICBsZXR0ZXI6ICdlJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnbicsXHJcbiAgICAgICAgb2N0YXZlOiAzXHJcbiAgICAgIH0sXHJcbiAgICAgICdzdWJiYXNzJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2QnLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICcnLFxyXG4gICAgICAgIG9jdGF2ZTogMlxyXG4gICAgICB9LFxyXG4gICAgICAnZnJlbmNoJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2InLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICcnLFxyXG4gICAgICAgIG9jdGF2ZTogNFxyXG4gICAgICB9IC8vIG5vIGlkZWFcclxuICAgIH07XHJcbiAgfVxyXG4gIHN0YXRpYyBfZW1wdHlNZWFzdXJlTm90ZVR5cGU6IE5vdGVUeXBlID0gJ3InO1xyXG4gIHN0YXRpYyBzZXQgZW1wdHlNZWFzdXJlTm90ZVR5cGUodHQ6IE5vdGVUeXBlKSB7XHJcbiAgICBTbW9NZWFzdXJlLl9lbXB0eU1lYXN1cmVOb3RlVHlwZSA9IHR0O1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IGVtcHR5TWVhc3VyZU5vdGVUeXBlKCk6IE5vdGVUeXBlIHtcclxuICAgIHJldHVybiBTbW9NZWFzdXJlLl9lbXB0eU1lYXN1cmVOb3RlVHlwZTtcclxuICB9XHJcbiAgc3RhdGljIHRpbWVTaWduYXR1cmVOb3Rlcyh0aW1lU2lnbmF0dXJlOiBUaW1lU2lnbmF0dXJlLCBjbGVmOiBDbGVmKSB7XHJcbiAgICBjb25zdCBwaXRjaCA9IFNtb01lYXN1cmUuZGVmYXVsdFBpdGNoRm9yQ2xlZltjbGVmXTtcclxuICAgIGNvbnN0IG1heFRpY2tzID0gU21vTXVzaWMudGltZVNpZ25hdHVyZVRvVGlja3ModGltZVNpZ25hdHVyZS50aW1lU2lnbmF0dXJlKTtcclxuICAgIGNvbnN0IG5vdGVUaWNrID0gODE5MiAvICh0aW1lU2lnbmF0dXJlLmJlYXREdXJhdGlvbiAvIDIpO1xyXG4gICAgbGV0IHRpY2tzID0gMDtcclxuICAgIGNvbnN0IHBub3RlczogU21vTm90ZVtdID0gW107XHJcbiAgICB3aGlsZSAodGlja3MgPCBtYXhUaWNrcykge1xyXG4gICAgICBjb25zdCBuZXh0Tm90ZSA9IFNtb05vdGUuZGVmYXVsdHM7XHJcbiAgICAgIG5leHROb3RlLnBpdGNoZXMgPSBbSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwaXRjaCkpXTtcclxuICAgICAgbmV4dE5vdGUubm90ZVR5cGUgPSAncic7XHJcbiAgICAgIG5leHROb3RlLmNsZWYgPSBjbGVmO1xyXG4gICAgICBuZXh0Tm90ZS50aWNrcy5udW1lcmF0b3IgPSBub3RlVGljaztcclxuICAgICAgbmV4dE5vdGUuc3RlbVRpY2tzID0gbm90ZVRpY2s7XHJcbiAgICAgIHBub3Rlcy5wdXNoKG5ldyBTbW9Ob3RlKG5leHROb3RlKSk7XHJcbiAgICAgIHRpY2tzICs9IG5vdGVUaWNrO1xyXG4gICAgfVxyXG4gICAgaWYgKHRpbWVTaWduYXR1cmUuYmVhdER1cmF0aW9uID09PSA4ICYmICh0aW1lU2lnbmF0dXJlLmFjdHVhbEJlYXRzICUgMyA9PT0gMCB8fCB0aW1lU2lnbmF0dXJlLmFjdHVhbEJlYXRzICUgMiAhPT0gMCkpIHtcclxuICAgICAgbGV0IGl4ID0gMDtcclxuICAgICAgcG5vdGVzLmZvckVhY2goKHBub3RlKSA9PiB7XHJcbiAgICAgICAgaWYgKChpeCArIDEpICUgMyA9PT0gMCkge1xyXG4gICAgICAgICAgcG5vdGUuYmVhbVN0YXRlID0gU21vTm90ZS5iZWFtU3RhdGVzLmVuZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcG5vdGUuYmVhbUJlYXRzID0gMjA0OCAqIDM7XHJcbiAgICAgICAgaXggKz0gMTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcG5vdGVzO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXQgYSBtZWFzdXJlIGZ1bGwgb2YgZGVmYXVsdCBub3RlcyBmb3IgYSBnaXZlbiB0aW1lU2lnbmF0dXJlL2NsZWYuXHJcbiAgICogcmV0dXJucyA4dGggbm90ZXMgZm9yIHRyaXBsZS10aW1lIG1ldGVycywgZXRjLlxyXG4gICAqIEBwYXJhbSBwYXJhbXMgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgc3RhdGljIGdldERlZmF1bHROb3RlcyhwYXJhbXM6IFNtb01lYXN1cmVQYXJhbXMpOiBTbW9Ob3RlW10ge1xyXG4gICAgcmV0dXJuIFNtb01lYXN1cmUudGltZVNpZ25hdHVyZU5vdGVzKG5ldyBUaW1lU2lnbmF0dXJlKHBhcmFtcy50aW1lU2lnbmF0dXJlKSwgcGFyYW1zLmNsZWYpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBjcmVhdGluZyBhIG5ldyBtZWFzdXJlLCB0aGUgJ2RlZmF1bHQnIHNldHRpbmdzIGNhbiB2YXJ5IGRlcGVuZGluZyBvblxyXG4gICAqIHdoYXQgY29tZXMgYmVmb3JlL2FmdGVyIHRoZSBtZWFzdXJlLiAgVGhpcyBkZXRlcm1pbmVzIHRoZSBkZWZhdWx0cyBmcm9tIHRoZVxyXG4gICAqIHBhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIGluLCB3aGljaCBjb3VsZCBiZSBhbm90aGVyIG1lYXN1cmUgaW4gdGhlIHNjb3JlLlxyXG4gICAqIFRoaXMgdmVyc2lvbiByZXR1cm5zIHBhcmFtcyB3aXRoIG5vIG5vdGVzLCBmb3IgY2FsbGVycyB0aGF0IHdhbnQgdG8gdXNlIHRoZWlyIG93biBub3Rlcy5cclxuICAgKiBJZiB5b3Ugd2FudCB0aGUgZGVmYXVsdCBub3Rlcywgc2VlIHtAbGluayBnZXREZWZhdWx0TWVhc3VyZVdpdGhOb3Rlc31cclxuICAgKiBcclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgc3RhdGljIGdldERlZmF1bHRNZWFzdXJlKHBhcmFtczogU21vTWVhc3VyZVBhcmFtcyk6IFNtb01lYXN1cmUge1xyXG4gICAgY29uc3Qgb2JqOiBhbnkgPSB7fTtcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vTWVhc3VyZS5kZWZhdWx0QXR0cmlidXRlcywgU21vTWVhc3VyZS5kZWZhdWx0cywgb2JqKTtcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vTWVhc3VyZS5kZWZhdWx0QXR0cmlidXRlcywgcGFyYW1zLCBvYmopO1xyXG4gICAgLy8gRG9uJ3QgY29weSBjb2x1bW4tZm9ybWF0dGluZyBvcHRpb25zIHRvIG5ldyBtZWFzdXJlIGluIG5ldyBjb2x1bW5cclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vTWVhc3VyZS5mb3JtYXR0aW5nT3B0aW9ucywgU21vTWVhc3VyZS5kZWZhdWx0cywgb2JqKTtcclxuICAgIG9iai50aW1lU2lnbmF0dXJlID0gbmV3IFRpbWVTaWduYXR1cmUocGFyYW1zLnRpbWVTaWduYXR1cmUpO1xyXG4gICAgLy8gVGhlIG1lYXN1cmUgZXhwZWN0cyB0byBnZXQgY29uY2VydCBLUyBpbiBjb25zdHJ1Y3RvciBhbmQgYWRqdXN0IGZvciBpbnN0cnVtZW50LiAgU28gZG8gdGhlXHJcbiAgICAvLyBvcHBvc2l0ZS5cclxuICAgIG9iai5rZXlTaWduYXR1cmUgPSBTbW9NdXNpYy52ZXhLZXlTaWdXaXRoT2Zmc2V0KG9iai5rZXlTaWduYXR1cmUsIC0xICogb2JqLnRyYW5zcG9zZUluZGV4KTtcclxuICAgIG9iai5saW5lcyA9IHBhcmFtcy5saW5lcztcclxuICAgIC8vIERvbid0IHJlZGlzcGxheSB0ZW1wbyBmb3IgYSBuZXcgbWVhc3VyZVxyXG4gICAgY29uc3QgcnYgPSBuZXcgU21vTWVhc3VyZShvYmopO1xyXG4gICAgaWYgKHJ2LnRlbXBvICYmIHJ2LnRlbXBvLmRpc3BsYXkpIHtcclxuICAgICAgcnYudGVtcG8uZGlzcGxheSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBjcmVhdGluZyBhIG5ldyBtZWFzdXJlLCB0aGUgJ2RlZmF1bHQnIHNldHRpbmdzIGNhbiB2YXJ5IGRlcGVuZGluZyBvblxyXG4gICAqIHdoYXQgY29tZXMgYmVmb3JlL2FmdGVyIHRoZSBtZWFzdXJlLiAgVGhpcyBkZXRlcm1pbmVzIHRoZSBkZWZhdWx0cyBmcm9tIHRoZVxyXG4gICAqIHBhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIGluLCB3aGljaCBjb3VsZCBiZSBhbm90aGVyIG1lYXN1cmUgaW4gdGhlIHNjb3JlLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwYXJhbXMgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgc3RhdGljIGdldERlZmF1bHRNZWFzdXJlV2l0aE5vdGVzKHBhcmFtczogU21vTWVhc3VyZVBhcmFtcyk6IFNtb01lYXN1cmUge1xyXG4gICAgdmFyIG1lYXN1cmUgPSBTbW9NZWFzdXJlLmdldERlZmF1bHRNZWFzdXJlKHBhcmFtcyk7XHJcbiAgICBtZWFzdXJlLnZvaWNlcy5wdXNoKHtcclxuICAgICAgbm90ZXM6IFNtb01lYXN1cmUuZ2V0RGVmYXVsdE5vdGVzKHBhcmFtcylcclxuICAgIH0pO1xyXG4gICAgLy8gZml4IGEgYnVnLlxyXG4gICAgLy8gbmV3IG1lYXN1cmVzIG9ubHkgaGF2ZSAxIHZvaWNlLCBtYWtlIHN1cmUgYWN0aXZlIHZvaWNlIGlzIDBcclxuICAgIG1lYXN1cmUuYWN0aXZlVm9pY2UgPSAwO1xyXG4gICAgcmV0dXJuIG1lYXN1cmU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHVzZWQgYnkgeG1sIGV4cG9ydCBcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKiBAcGFyYW0gdmFsIFxyXG4gICAqL1xyXG4gIGdldEZvcmNlU3lzdGVtQnJlYWsoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtYXQuc3lzdGVtQnJlYWs7XHJcbiAgfVxyXG4gIC8vIEBpbnRlcm5hbFxyXG4gIHNldERlZmF1bHRCYXJsaW5lcygpIHtcclxuICAgIGlmICghdGhpcy5nZXRTdGFydEJhcmxpbmUoKSkge1xyXG4gICAgICB0aGlzLm1vZGlmaWVycy5wdXNoKG5ldyBTbW9CYXJsaW5lKHtcclxuICAgICAgICBwb3NpdGlvbjogU21vQmFybGluZS5wb3NpdGlvbnMuc3RhcnQsXHJcbiAgICAgICAgYmFybGluZTogU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXJcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmdldEVuZEJhcmxpbmUoKSkge1xyXG4gICAgICB0aGlzLm1vZGlmaWVycy5wdXNoKG5ldyBTbW9CYXJsaW5lKHtcclxuICAgICAgICBwb3NpdGlvbjogU21vQmFybGluZS5wb3NpdGlvbnMuZW5kLFxyXG4gICAgICAgIGJhcmxpbmU6IFNtb0JhcmxpbmUuYmFybGluZXMuc2luZ2xlQmFyXHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBjb250YWluc1NvdW5kKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGxldCBqID0gMDtcclxuICAgICAgY29uc3Qgdm9pY2UgPSB0aGlzLnZvaWNlc1tpXTtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgaWYgKHZvaWNlLm5vdGVzW2pdLm5vdGVUeXBlID09PSAnbicpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBUaGUgcmVuZGVyZWQgd2lkdGggb2YgdGhlIG1lYXN1cmUsIG9yIGVzdGltYXRlIG9mIHNhbWVcclxuICAgKi9cclxuICBnZXQgc3RhZmZXaWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLnN2Zy5zdGFmZldpZHRoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogc2V0IHRoZSByZW5kZXJlZCB3aWR0aCBvZiB0aGUgbWVhc3VyZSwgb3IgZXN0aW1hdGUgb2Ygc2FtZVxyXG4gICAqL1xyXG4gIHNldFdpZHRoKHdpZHRoOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcclxuICAgIGlmIChsYXlvdXREZWJ1Zy5mbGFnU2V0KGxheW91dERlYnVnLnZhbHVlcy5tZWFzdXJlSGlzdG9yeSkpIHtcclxuICAgICAgdGhpcy5zdmcuaGlzdG9yeS5wdXNoKCdzZXRXaWR0aCAnICsgdGhpcy5zdGFmZldpZHRoICsgJz0+ICcgKyB3aWR0aCArICcgJyArIGRlc2NyaXB0aW9uKTtcclxuICAgIH1cclxuICAgIGlmIChpc05hTih3aWR0aCkpIHtcclxuICAgICAgdGhyb3cgKCdOQU4gaW4gc2V0V2lkdGgnKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3ZnLnN0YWZmV2lkdGggPSB3aWR0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCByZW5kZXJlZCBvciBlc3RpbWF0ZWQgc3RhcnQgeFxyXG4gICAqL1xyXG4gIGdldCBzdGFmZlgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnN2Zy5zdGFmZlg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgcmVuZGVyZWQgb3IgZXN0aW1hdGVkIHN0YXJ0IHhcclxuICAgKi9cclxuICBzZXRYKHg6IG51bWJlciwgZGVzY3JpcHRpb246IHN0cmluZykge1xyXG4gICAgaWYgKGlzTmFOKHgpKSB7XHJcbiAgICAgIHRocm93ICgnTkFOIGluIHNldFgnKTtcclxuICAgIH1cclxuICAgIGxheW91dERlYnVnLm1lYXN1cmVIaXN0b3J5KHRoaXMsICdzdGFmZlgnLCB4LCBkZXNjcmlwdGlvbik7XHJcbiAgICB0aGlzLnN2Zy5zdGFmZlggPSBNYXRoLnJvdW5kKHgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIHRpbWUgc2lnbmF0dXJlIGhhcyBwb3NzaWJseSBjaGFuZ2VkLiAgYWRkL3JlbW92ZSBub3RlcyB0b1xyXG4gICAqIG1hdGNoIHRoZSBuZXcgbGVuZ3RoXHJcbiAgICovXHJcbiAgYWxpZ25Ob3Rlc1dpdGhUaW1lU2lnbmF0dXJlKCkge1xyXG4gICAgY29uc3QgdHNUaWNrcyA9IFNtb011c2ljLnRpbWVTaWduYXR1cmVUb1RpY2tzKHRoaXMudGltZVNpZ25hdHVyZS50aW1lU2lnbmF0dXJlKTtcclxuICAgIGlmICh0c1RpY2tzID09PSB0aGlzLmdldE1heFRpY2tzVm9pY2UoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXBsYWNlTm90ZVdpdGhEdXJhdGlvbiA9ICh0YXJnZXQ6IG51bWJlciwgYXI6IFNtb05vdGVbXSwgbm90ZTogU21vTm90ZSkgPT4ge1xyXG4gICAgICBjb25zdCBmaXROb3RlID0gbmV3IFNtb05vdGUoU21vTm90ZS5kZWZhdWx0cyk7XHJcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gU21vTXVzaWMuY2xvc2VzdER1cmF0aW9uVGlja0x0RXEodGFyZ2V0KTtcclxuICAgICAgaWYgKGR1cmF0aW9uID4gMTI4KSB7XHJcbiAgICAgICAgZml0Tm90ZS50aWNrcyA9IHsgbnVtZXJhdG9yOiBkdXJhdGlvbiwgZGVub21pbmF0b3I6IDEsIHJlbWFpbmRlcjogMCB9O1xyXG4gICAgICAgIGZpdE5vdGUuc3RlbVRpY2tzID0gZHVyYXRpb247XHJcbiAgICAgICAgZml0Tm90ZS5waXRjaGVzID0gbm90ZS5waXRjaGVzO1xyXG4gICAgICAgIGZpdE5vdGUubm90ZVR5cGUgPSBub3RlLm5vdGVUeXBlO1xyXG4gICAgICAgIGZpdE5vdGUuY2xlZiA9IG5vdGUuY2xlZjtcclxuICAgICAgICBhci5wdXNoKGZpdE5vdGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCB2b2ljZXM6IFNtb1ZvaWNlW10gPSBbXTtcclxuICAgIGNvbnN0IHR1cGxldHM6IFNtb1R1cGxldFtdID0gW107XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0gdGhpcy52b2ljZXNbaV07XHJcbiAgICAgIGNvbnN0IG5ld05vdGVzOiBTbW9Ob3RlW10gPSBbXTtcclxuICAgICAgbGV0IHZvaWNlVGlja3MgPSAwO1xyXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3Qgbm90ZSA9IHZvaWNlLm5vdGVzW2pdO1xyXG4gICAgICAgIC8vIGlmIGEgdHVwbGV0LCBtYWtlIHN1cmUgdGhlIHdob2xlIHR1cGxldCBmaXRzLlxyXG4gICAgICAgIGlmIChub3RlLmlzVHVwbGV0KSB7XHJcbiAgICAgICAgICBjb25zdCB0dXBsZXRUcmVlID0gU21vVHVwbGV0VHJlZS5nZXRUdXBsZXRUcmVlRm9yTm90ZUluZGV4KHRoaXMudHVwbGV0VHJlZXMsIGksIGopO1xyXG4gICAgICAgICAgaWYgKHR1cGxldFRyZWUpIHtcclxuICAgICAgICAgICAgLy8gcmVtYWluaW5nIG5vdGVzIG9mIGFuIGFwcHJvdmVkIHR1cGxldCwganVzdCBhZGQgdGhlbVxyXG4gICAgICAgICAgICBpZiAodHVwbGV0VHJlZS5zdGFydEluZGV4ICE9PSBqKSB7XHJcbiAgICAgICAgICAgICAgbmV3Tm90ZXMucHVzaChub3RlKTtcclxuICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0dXBsZXRUcmVlLnRvdGFsVGlja3MgKyB2b2ljZVRpY2tzIDw9IHRzVGlja3MpIHtcclxuICAgICAgICAgICAgICAvLyBmaXJzdCBub3RlIG9mIHRoZSB0dXBsZXQsIGl0IGZpdHMsIGFkZCBpdFxyXG4gICAgICAgICAgICAgIHZvaWNlVGlja3MgKz0gdHVwbGV0VHJlZS50b3RhbFRpY2tzO1xyXG4gICAgICAgICAgICAgIG5ld05vdGVzLnB1c2gobm90ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gdHVwbGV0IHdpbGwgbm90IGZpdC4gIFJlcGxhY2UgdHVwbGV0IHdpdGggYSBub3RlIGFzIGNsb3NlIHRvIHJlbWFpbmRlciBhcyBwb3NzaWJsZSBhbmQgYWRkIGl0XHJcbiAgICAgICAgICAgICAgLy8gcmVtb3ZlIHR1cGxldFxyXG4gICAgICAgICAgICAgIG5vdGUudHVwbGV0SWQgPSBudWxsXHJcbiAgICAgICAgICAgICAgcmVwbGFjZU5vdGVXaXRoRHVyYXRpb24odHNUaWNrcyAtIHZvaWNlVGlja3MsIG5ld05vdGVzLCBub3RlKTtcclxuICAgICAgICAgICAgICB2b2ljZVRpY2tzID0gdHNUaWNrcztcclxuICAgICAgICAgICAgICBTbW9UdXBsZXRUcmVlLnJlbW92ZVR1cGxldEZvck5vdGVJbmRleCh0aGlzLCBpLCBqKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHsgLy8gbWlzc2luZyB0dXBsZXQsIG5vdyB3aGF0P1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ21pc3NpbmcgdHVwbGV0IGluZm8nKTtcclxuICAgICAgICAgICAgcmVwbGFjZU5vdGVXaXRoRHVyYXRpb24odHNUaWNrcyAtIHZvaWNlVGlja3MsIG5ld05vdGVzLCBub3RlKTtcclxuICAgICAgICAgICAgdm9pY2VUaWNrcyA9IHRzVGlja3M7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChub3RlLnRpY2tDb3VudCArIHZvaWNlVGlja3MgPD0gdHNUaWNrcykge1xyXG4gICAgICAgICAgICBuZXdOb3Rlcy5wdXNoKG5vdGUpO1xyXG4gICAgICAgICAgICB2b2ljZVRpY2tzICs9IG5vdGUudGlja0NvdW50O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVwbGFjZU5vdGVXaXRoRHVyYXRpb24odHNUaWNrcyAtIHZvaWNlVGlja3MsIG5ld05vdGVzLCBub3RlKTtcclxuICAgICAgICAgICAgdm9pY2VUaWNrcyA9IHRzVGlja3M7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodHNUaWNrcyAtIHZvaWNlVGlja3MgPiAxMjgpIHtcclxuICAgICAgICBjb25zdCBucCA9IFNtb05vdGUuZGVmYXVsdHM7XHJcbiAgICAgICAgbnAuY2xlZiA9IHRoaXMuY2xlZjtcclxuICAgICAgICBjb25zdCBubm90ZSA9IG5ldyBTbW9Ob3RlKG5wKTtcclxuICAgICAgICByZXBsYWNlTm90ZVdpdGhEdXJhdGlvbih0c1RpY2tzIC0gdm9pY2VUaWNrcywgbmV3Tm90ZXMsIG5ub3RlKTtcclxuICAgICAgfVxyXG4gICAgICB2b2ljZXMucHVzaCh7IG5vdGVzOiBuZXdOb3RlcyB9KTtcclxuICAgIH1cclxuICAgIHRoaXMudm9pY2VzID0gdm9pY2VzO1xyXG4gIH1cclxuICBnZXQgbWVhc3VyZU51bWJlckRiZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3RoaXMubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXh9LyR7dGhpcy5tZWFzdXJlTnVtYmVyLnN5c3RlbUluZGV4fS8ke3RoaXMubWVhc3VyZU51bWJlci5zdGFmZklkfWA7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldCByZW5kZXJlZCBvciBlc3RpbWF0ZWQgc3RhcnQgeVxyXG4gICAqL1xyXG4gIGdldCBzdGFmZlkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnN2Zy5zdGFmZlk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgcmVuZGVyZWQgb3IgZXN0aW1hdGVkIHN0YXJ0IHlcclxuICAgKi9cclxuICBzZXRZKHk6IG51bWJlciwgZGVzY3JpcHRpb246IHN0cmluZykge1xyXG4gICAgaWYgKGlzTmFOKHkpKSB7XHJcbiAgICAgIHRocm93ICgnTkFOIGluIHNldFknKTtcclxuICAgIH1cclxuICAgIGxheW91dERlYnVnLm1lYXN1cmVIaXN0b3J5KHRoaXMsICdzdGFmZlknLCB5LCBkZXNjcmlwdGlvbik7XHJcbiAgICB0aGlzLnN2Zy5zdGFmZlkgPSBNYXRoLnJvdW5kKHkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFjdHVhbCBvciBlc3RpbWF0ZWQgaGlnaGVzdCBwb2ludCBpbiBzY29yZVxyXG4gICAqL1xyXG4gIGdldCB5VG9wKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5zdmcueVRvcDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogcmV0dXJuIHRoZSBsb3dlc3QgeSAoaGlnaGVzdCB2YWx1ZSkgaW4gdGhpcyBtZWFzdXJlIHN2Z1xyXG4gICAqXHJcbiAgICogQHJlYWRvbmx5XHJcbiAgICovXHJcbiAgZ2V0IGxvd2VzdFkoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLnN2Zy50YWJTdGF2ZUJveCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zdmcudGFiU3RhdmVCb3gueSArIHRoaXMuc3ZnLnRhYlN0YXZlQm94LmhlaWdodDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnN2Zy5sb2dpY2FsQm94LnkgKyB0aGlzLnN2Zy5sb2dpY2FsQm94LmhlaWdodDtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogYWRqdXN0IHRoZSB5IGZvciB0aGUgcmVuZGVyIGJveGVzIHRvIGFjY291bnQgZm9yIHRoZSBwYWdlIGFuZCBtYXJnaW5zXHJcbiAgICovXHJcbiAgYWRqdXN0WSh5T2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc3ZnLmxvZ2ljYWxCb3gueSArPSB5T2Zmc2V0O1xyXG4gICAgaWYgKHRoaXMuc3ZnLnRhYlN0YXZlQm94KSB7XHJcbiAgICAgIHRoaXMuc3ZnLnRhYlN0YXZlQm94LnkgKz0geU9mZnNldDtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogV0hlbiBzZXR0aW5nIGFuIGluc3RydW1lbnQsIG9mZnNldCB0aGUgcGl0Y2hlcyB0byBtYXRjaCB0aGUgaW5zdHJ1bWVudCBrZXlcclxuICAgKiBAcGFyYW0gb2Zmc2V0IFxyXG4gICAqIEBwYXJhbSBuZXdDbGVmIFxyXG4gICAqL1xyXG4gIHRyYW5zcG9zZVRvT2Zmc2V0KG9mZnNldDogbnVtYmVyLCB0YXJnZXRLZXk6IHN0cmluZywgbmV3Q2xlZj86IENsZWYpIHtcclxuICAgIGNvbnN0IGRpZmYgPSBvZmZzZXQgLSB0aGlzLnRyYW5zcG9zZUluZGV4O1xyXG4gICAgbmV3Q2xlZiA9IG5ld0NsZWYgPz8gdGhpcy5jbGVmO1xyXG4gICAgdGhpcy52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgobm90ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBpdGNoZXM6IG51bWJlcltdID0gWy4uLkFycmF5KG5vdGUucGl0Y2hlcy5sZW5ndGgpLmtleXMoKV07XHJcbiAgICAgICAgLy8gd2hlbiB0aGUgbm90ZSBpcyBhIHJlc3QsIHByZXNlcnZlIHRoZSByZXN0IGJ1dCBtYXRjaCB0aGUgbmV3IGNsZWYuXHJcbiAgICAgICAgaWYgKG5ld0NsZWYgIT09IHRoaXMuY2xlZiAmJiBub3RlLm5vdGVUeXBlID09PSAncicpIHtcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgIGNvbnN0IGRlZnAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFNtb01lYXN1cmUuZGVmYXVsdFBpdGNoRm9yQ2xlZltuZXdDbGVmXSkpO1xyXG4gICAgICAgICAgbm90ZS5waXRjaGVzID0gW2RlZnBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBub3RlLnRyYW5zcG9zZShwaXRjaGVzLCBkaWZmLCB0aGlzLmtleVNpZ25hdHVyZSwgdGFyZ2V0S2V5KTtcclxuICAgICAgICAgIG5vdGUuZ2V0R3JhY2VOb3RlcygpLmZvckVhY2goKGduKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdwaXRjaDogbnVtYmVyW10gPSBbLi4uQXJyYXkoZ24ucGl0Y2hlcy5sZW5ndGgpLmtleXMoKV07XHJcbiAgICAgICAgICAgIGNvbnN0IHhwb3NlID0gU21vTm90ZS50cmFuc3Bvc2UoZ24sIGdwaXRjaCwgZGlmZiwgdGhpcy5rZXlTaWduYXR1cmUsIHRhcmdldEtleSk7XHJcbiAgICAgICAgICAgIGduLnBpdGNoZXMgPSB4cG9zZS5waXRjaGVzO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm4gYWN0dWFsIG9yIGVzdGltYXRlZCBoaWdoZXN0IHBvaW50IGluIHNjb3JlXHJcbiAgICovXHJcbiAgc2V0WVRvcCh5OiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcclxuICAgIGxheW91dERlYnVnLm1lYXN1cmVIaXN0b3J5KHRoaXMsICd5VG9wJywgeSwgZGVzY3JpcHRpb24pO1xyXG4gICAgdGhpcy5zdmcueVRvcCA9IHk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gYWN0dWFsIG9yIGVzdGltYXRlZCBib3VuZGluZyBib3hcclxuICAgKi9cclxuICBzZXRCb3goYm94OiBTdmdCb3gsIGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcclxuICAgIGxheW91dERlYnVnLm1lYXN1cmVIaXN0b3J5KHRoaXMsICdsb2dpY2FsQm94JywgYm94LCBkZXNjcmlwdGlvbik7XHJcbiAgICB0aGlzLnN2Zy5sb2dpY2FsQm94ID0gU3ZnSGVscGVycy5zbW9Cb3goYm94KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQHJldHVybnMgdGhlIERPTSBpZGVudGlmaWVyIGZvciB0aGlzIG1lYXN1cmUgd2hlbiByZW5kZXJlZFxyXG4gICAqL1xyXG4gIGdldENsYXNzSWQoKSB7XHJcbiAgICByZXR1cm4gJ21tLScgKyB0aGlzLm1lYXN1cmVOdW1iZXIuc3RhZmZJZCArICctJyArIHRoaXMubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXg7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBpZCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBnZXRSZW5kZXJlZE5vdGUoaWQ6IHN0cmluZykge1xyXG4gICAgbGV0IGogPSAwO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChqID0gMDsgaiA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0gdGhpcy52b2ljZXNbal07XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB2b2ljZS5ub3Rlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIGNvbnN0IG5vdGUgPSB2b2ljZS5ub3Rlc1tpXTtcclxuICAgICAgICBpZiAobm90ZS5yZW5kZXJJZCA9PT0gaWQpIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNtb05vdGU6IG5vdGUsXHJcbiAgICAgICAgICAgIHZvaWNlOiBqLFxyXG4gICAgICAgICAgICB0aWNrOiBpXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXROb3RlcygpIHtcclxuICAgIHJldHVybiB0aGlzLnZvaWNlc1t0aGlzLmFjdGl2ZVZvaWNlXS5ub3RlcztcclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZVZvaWNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlVm9pY2U7XHJcbiAgfVxyXG5cclxuICBzZXRBY3RpdmVWb2ljZSh2aXg6IG51bWJlcikge1xyXG4gICAgaWYgKHZpeCA+PSAwICYmIHZpeCA8IHRoaXMudm9pY2VzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVZvaWNlID0gdml4O1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXRTd2FwVm9pY2VQYWlycygpIHtcclxuICAgIGNvbnN0IHJ2ID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgcnYucHVzaChbaSwgal0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIHN3YXBWb2ljZXModm9pY2UxOiBudW1iZXIsIHZvaWNlMjogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy52b2ljZXMubGVuZ3RoID4gdm9pY2UxICYmIHRoaXMudm9pY2VzLmxlbmd0aCA+IHZvaWNlMikge1xyXG4gICAgICBjb25zdCB2MSA9IHRoaXMudm9pY2VzW3ZvaWNlMV07XHJcbiAgICAgIGNvbnN0IHYyID0gdGhpcy52b2ljZXNbdm9pY2UyXTtcclxuICAgICAgY29uc3QgbnZvaWNlczogU21vVm9pY2VbXSA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgaWYgKGkgPT09IHZvaWNlMSkge1xyXG4gICAgICAgICAgbnZvaWNlcy5wdXNoKHYyKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGkgPT09IHZvaWNlMikge1xyXG4gICAgICAgICAgbnZvaWNlcy5wdXNoKHYxKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbnZvaWNlcy5wdXNoKHRoaXMudm9pY2VzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy52b2ljZXMgPSBudm9pY2VzO1xyXG4gICAgfVxyXG4gIH1cclxuICB0aWNrbWFwRm9yVm9pY2Uodm9pY2VJeDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gbmV3IFRpY2tNYXAodGhpcywgdm9pY2VJeCk7XHJcbiAgfVxyXG5cclxuICAvLyAjIyMgY3JlYXRlTWVhc3VyZVRpY2ttYXBzXHJcbiAgLy8gQSB0aWNrbWFwIGlzIGEgbWFwIG9mIG5vdGVzIHRvIHRpY2tzIGZvciB0aGUgbWVhc3VyZS4gIEl0IGlzIHNwZWNpaWZjIHBlci12b2ljZVxyXG4gIC8vIHNpbmNlIGVhY2ggdm9pY2UgbWF5IGhhdmUgZGlmZmVyZW50IG51bWJlcnMgb2YgdGlja3MuICBUaGUgYWNjaWRlbnRhbCBtYXAgaXNcclxuICAvLyBvdmVyYWxsIHNpbmNlIGFjY2lkZW50YWxzIGluIG9uZSB2b2ljZSBhcHBseSB0byBhY2NpZGVudGFscyBpbiB0aGUgb3RoZXJcclxuICAvLyB2b2ljZXMuICBTbyB3ZSByZXR1cm4gdGhlIHRpY2ttYXBzIGFuZCB0aGUgb3ZlcmFsbCBhY2NpZGVudGFsIG1hcC5cclxuICBjcmVhdGVNZWFzdXJlVGlja21hcHMoKTogTWVhc3VyZVRpY2ttYXBzIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IHRpY2ttYXBBcnJheTogVGlja01hcFtdID0gW107XHJcbiAgICBjb25zdCBhY2NpZGVudGFsTWFwOiBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBSZWNvcmQ8c3RyaW5nLCBUaWNrQWNjaWRlbnRhbD4+ID1cclxuICAgICAge30gYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgUmVjb3JkPFBpdGNoTGV0dGVyLCBUaWNrQWNjaWRlbnRhbD4+O1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIHRpY2ttYXBBcnJheS5wdXNoKHRoaXMudGlja21hcEZvclZvaWNlKGkpKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgdGlja21hcDogVGlja01hcCA9IHRpY2ttYXBBcnJheVtpXTtcclxuICAgICAgY29uc3QgZHVyYXRpb25LZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKCh0aWNrbWFwLmR1cmF0aW9uQWNjaWRlbnRhbE1hcCkpO1xyXG5cclxuICAgICAgZHVyYXRpb25LZXlzLmZvckVhY2goKGR1cmF0aW9uS2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoIWFjY2lkZW50YWxNYXBbZHVyYXRpb25LZXldKSB7XHJcbiAgICAgICAgICBhY2NpZGVudGFsTWFwW2R1cmF0aW9uS2V5XSA9IHRpY2ttYXAuZHVyYXRpb25BY2NpZGVudGFsTWFwW2R1cmF0aW9uS2V5XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgYW1hcCA9IGFjY2lkZW50YWxNYXBbZHVyYXRpb25LZXldO1xyXG4gICAgICAgICAgY29uc3QgdGlja2FibGU6IFJlY29yZDxQaXRjaExldHRlciwgVGlja0FjY2lkZW50YWw+ID0gdGlja21hcC5kdXJhdGlvbkFjY2lkZW50YWxNYXBbZHVyYXRpb25LZXldO1xyXG4gICAgICAgICAgY29uc3QgbGV0dGVyS2V5czogUGl0Y2hMZXR0ZXJbXSA9IE9iamVjdC5rZXlzKHRpY2thYmxlKSBhcyBBcnJheTxQaXRjaExldHRlcj47XHJcbiAgICAgICAgICBsZXR0ZXJLZXlzLmZvckVhY2goKHBpdGNoS2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghYW1hcFtwaXRjaEtleV0pIHtcclxuICAgICAgICAgICAgICBhbWFwW3BpdGNoS2V5XSA9IHRpY2ttYXAuZHVyYXRpb25BY2NpZGVudGFsTWFwW2R1cmF0aW9uS2V5XVtwaXRjaEtleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBkdXJhdGlvbjogZHVyYXRpb24sIHBpdGNoZXM6IFJlY29yZDxQaXRjaExldHRlcixUaWNrQWNjaWRlbnRhbD5cclxuICAgIGNvbnN0IGFjY2lkZW50YWxBcnJheTogQWNjaWRlbnRhbEFycmF5W10gPSBbXTtcclxuICAgIE9iamVjdC5rZXlzKGFjY2lkZW50YWxNYXApLmZvckVhY2goKGR1cmF0aW9uS2V5KSA9PiB7XHJcbiAgICAgIGFjY2lkZW50YWxBcnJheS5wdXNoKHsgZHVyYXRpb246IGR1cmF0aW9uS2V5LCBwaXRjaGVzOiBhY2NpZGVudGFsTWFwW2R1cmF0aW9uS2V5XSB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdGlja21hcHM6IHRpY2ttYXBBcnJheSxcclxuICAgICAgYWNjaWRlbnRhbE1hcCxcclxuICAgICAgYWNjaWRlbnRhbEFycmF5XHJcbiAgICB9O1xyXG4gIH1cclxuICAvLyAjIyMgY3JlYXRlUmVzdE5vdGVXaXRoRHVyYXRpb25cclxuICAvLyBwYWQgc29tZSBkdXJhdGlvbiBvZiBtdXNpYyB3aXRoIHJlc3RzLlxyXG4gIHN0YXRpYyBjcmVhdGVSZXN0Tm90ZVdpdGhEdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyLCBjbGVmOiBDbGVmKTogU21vTm90ZSB7XHJcbiAgICBjb25zdCBwaXRjaDogUGl0Y2ggPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICBTbW9NZWFzdXJlLmRlZmF1bHRQaXRjaEZvckNsZWZbY2xlZl0pKTtcclxuICAgIGNvbnN0IG5vdGUgPSBuZXcgU21vTm90ZShTbW9Ob3RlLmRlZmF1bHRzKTtcclxuICAgIG5vdGUucGl0Y2hlcyA9IFtwaXRjaF07XHJcbiAgICBub3RlLm5vdGVUeXBlID0gJ3InO1xyXG4gICAgbm90ZS5oaWRkZW4gPSB0cnVlO1xyXG4gICAgbm90ZS50aWNrcyA9IHsgbnVtZXJhdG9yOiBkdXJhdGlvbiwgZGVub21pbmF0b3I6IDEsIHJlbWFpbmRlcjogMCB9O1xyXG4gICAgcmV0dXJuIG5vdGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIHRpY2tzIGluIGVhY2ggdm9pY2UgYW5kIHJldHVybiBtYXhcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBnZXRNYXhUaWNrc1ZvaWNlKCkge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IG1heCA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgdm9pY2VUaWNrcyA9IHRoaXMuZ2V0VGlja3NGcm9tVm9pY2UoaSk7XHJcbiAgICAgIG1heCA9IE1hdGgubWF4KHZvaWNlVGlja3MsIG1heCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWF4O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9yIHBhc3RpbmcsIHBhc3RlIGludG8gdGhlIHRhcmdldCBtZWFzdXJlIGlmIHRoZSB2b2ljZSBleGlzdHMsIGVsc2UgcGFzdGUgaW50b1xyXG4gICAqIHZvaWNlIDBcclxuICAgKiBAcGFyYW0gdm9pY2VJbmRleCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBnZXRUaWNrc0Zyb21UaGlzT3JBbnlWb2ljZSh2b2ljZUluZGV4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMudm9pY2VzLmxlbmd0aCA+IHZvaWNlSW5kZXgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGlja3NGcm9tVm9pY2Uodm9pY2VJbmRleCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRUaWNrc0Zyb21Wb2ljZSgwKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ291bnQgdGhlIG51bWJlciBvZiB0aWNrcyBpbiBhIHNwZWNpZmljIHZvaWNlXHJcbiAgICogQHBhcmFtIHZvaWNlSW5kZXggXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZ2V0VGlja3NGcm9tVm9pY2Uodm9pY2VJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCB0aWNrcyA9IDA7XHJcbiAgICB0aGlzLnZvaWNlc1t2b2ljZUluZGV4XS5ub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XHJcbiAgICAgIHRpY2tzICs9IG5vdGUudGlja0NvdW50O1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGlja3M7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb3VudCBhbGwgdGhlIHRpY2tzIHVwIHRvIHRoZSBwcm92aWRlZCB0aWNrSW5kZXhcclxuICAgKiBAcGFyYW0gdm9pY2VJbmRleFxyXG4gICAqIEBwYXJhbSB0aWNrSW5kZXhcclxuICAgKi9cclxuICBnZXROb3RlUG9zaXRpb25JblRpY2tzKHZvaWNlSW5kZXg6IG51bWJlciwgdGlja0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHJ2ID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGlja0luZGV4OyBpKyspIHtcclxuICAgICAgY29uc3Qgbm90ZSA9IHRoaXMudm9pY2VzW3ZvaWNlSW5kZXhdLm5vdGVzW2ldO1xyXG4gICAgICBydiArPSBub3RlLnRpY2tDb3VudDtcclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvdW50IGFsbCB0aGUgdGlja3MgdXAgdG8gdGhlIHByb3ZpZGVkIHRpY2tJbmRleFxyXG4gICAqIEBwYXJhbSB2b2ljZUluZGV4XHJcbiAgICogQHBhcmFtIHRpY2tJbmRleFxyXG4gICAqL1xyXG4gIGdldFRpY2tDb3VudEZvck5vdGUodm9pY2VJbmRleDogbnVtYmVyLCBub3RlOiBTbW9Ob3RlKTogbnVtYmVyIHtcclxuICAgIGxldCBydiA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudm9pY2VzW3ZvaWNlSW5kZXhdLm5vdGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnROb3RlID0gdGhpcy52b2ljZXNbdm9pY2VJbmRleF0ubm90ZXNbaV07XHJcbiAgICAgIHJ2ICs9IG5vdGUudGlja0NvdW50O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xvc2VzdEluZGV4RnJvbVRpY2tDb3VudCh2b2ljZUluZGV4OiBudW1iZXIsIHRpY2tDb3VudDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBydiA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy52b2ljZXNbdm9pY2VJbmRleF0ubm90ZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgbm90ZSA9IHRoaXMudm9pY2VzW3ZvaWNlSW5kZXhdLm5vdGVzW2ldO1xyXG4gICAgICBpZiAobm90ZS50aWNrQ291bnQgKyBydiA+PSB0aWNrQ291bnQpIHtcclxuICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gICAgICBydiArPSBub3RlLnRpY2tDb3VudDtcclxuICAgIH1cclxuICAgIHJldHVybiBpO1xyXG4gIH1cclxuXHJcbiAgaXNQaWNrdXAoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0aWNrcyA9IHRoaXMuZ2V0VGlja3NGcm9tVm9pY2UoMCk7XHJcbiAgICBjb25zdCBnb2FsID0gU21vTXVzaWMudGltZVNpZ25hdHVyZVRvVGlja3ModGhpcy50aW1lU2lnbmF0dXJlLnRpbWVTaWduYXR1cmUpO1xyXG4gICAgcmV0dXJuICh0aWNrcyA8IGdvYWwpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJCZWFtR3JvdXBzKCkge1xyXG4gICAgdGhpcy5iZWFtR3JvdXBzID0gW107XHJcbiAgfVxyXG5cclxuICAvLyAjIyMgdXBkYXRlTHlyaWNGb250XHJcbiAgLy8gVXBkYXRlIHRoZSBseXJpYyBmb250LCB3aGljaCBpcyB0aGUgc2FtZSBmb3IgYWxsIGx5cmljcy5cclxuICBzZXRMeXJpY0ZvbnQoZm9udEluZm86IEZvbnRJbmZvKSB7XHJcbiAgICB0aGlzLnZvaWNlcy5mb3JFYWNoKCh2b2ljZSkgPT4ge1xyXG4gICAgICB2b2ljZS5ub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XHJcbiAgICAgICAgbm90ZS5zZXRMeXJpY0ZvbnQoZm9udEluZm8pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBzZXRMeXJpY0FkanVzdFdpZHRoKGFkanVzdE5vdGVXaWR0aDogYm9vbGVhbikge1xyXG4gICAgdGhpcy52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgobm90ZSkgPT4ge1xyXG4gICAgICAgIG5vdGUuc2V0THlyaWNBZGp1c3RXaWR0aChhZGp1c3ROb3RlV2lkdGgpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2hvcmRBZGp1c3RXaWR0aChhZGp1c3ROb3RlV2lkdGg6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKG5vdGUpID0+IHtcclxuICAgICAgICBub3RlLnNldENob3JkQWRqdXN0V2lkdGgoYWRqdXN0Tm90ZVdpZHRoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vICMjIyB1cGRhdGVMeXJpY0ZvbnRcclxuICAvLyBVcGRhdGUgdGhlIGx5cmljIGZvbnQsIHdoaWNoIGlzIHRoZSBzYW1lIGZvciBhbGwgbHlyaWNzLlxyXG4gIHNldENob3JkRm9udChmb250SW5mbzogRm9udEluZm8pIHtcclxuICAgIHRoaXMudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKG5vdGUpID0+IHtcclxuICAgICAgICBub3RlLnNldENob3JkRm9udChmb250SW5mbyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0dXBsZXROb3RlcyhzbW9UdXBsZXQ6IFNtb1R1cGxldCk6IFNtb05vdGVbXSB7XHJcbiAgICBsZXQgdHVwbGV0Tm90ZXM6IFNtb05vdGVbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IHNtb1R1cGxldC5zdGFydEluZGV4OyBpIDw9IHNtb1R1cGxldC5lbmRJbmRleDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG5vdGUgPSB0aGlzLnZvaWNlc1tzbW9UdXBsZXQudm9pY2VdLm5vdGVzW2ldO1xyXG4gICAgICB0dXBsZXROb3Rlcy5wdXNoKG5vdGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHR1cGxldE5vdGVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RlbURpcmVjdGlvbkZvclR1cGxldChzbW9UdXBsZXQ6IFNtb1R1cGxldCkge1xyXG4gICAgbGV0IG5vdGU6IFNtb05vdGUgfCBudWxsID0gbnVsbDtcclxuICAgIGZvciAobGV0IGN1cnJlbnROb3RlIG9mIHRoaXMudHVwbGV0Tm90ZXMoc21vVHVwbGV0KSkge1xyXG4gICAgICBpZiAoY3VycmVudE5vdGUubm90ZVR5cGUgPT09ICduJykge1xyXG4gICAgICAgIG5vdGUgPSBjdXJyZW50Tm90ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghbm90ZSkge1xyXG4gICAgICByZXR1cm4gU21vTm90ZS5mbGFnU3RhdGVzLmRvd247XHJcbiAgICB9XHJcbiAgICBpZiAobm90ZS5mbGFnU3RhdGUgIT09IFNtb05vdGUuZmxhZ1N0YXRlcy5hdXRvKSB7XHJcbiAgICAgIHJldHVybiBub3RlLmZsYWdTdGF0ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBTbW9NdXNpYy5waXRjaFRvTGVkZ2VyTGluZSh0aGlzLmNsZWYsIG5vdGUucGl0Y2hlc1swXSlcclxuICAgICAgPj0gMiA/IFNtb05vdGUuZmxhZ1N0YXRlcy51cCA6IFNtb05vdGUuZmxhZ1N0YXRlcy5kb3duO1xyXG4gIH1cclxuICBnZXROb3RlQnlJZChpZDogc3RyaW5nKTogU21vTm90ZSB8IG51bGwge1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB2b2ljZSA9IHRoaXMudm9pY2VzW2ldO1xyXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3Qgbm90ZSA9IHZvaWNlLm5vdGVzW2pdO1xyXG4gICAgICAgIGlmIChub3RlLmF0dHJzLmlkID09PSBpZCkge1xyXG4gICAgICAgICAgcmV0dXJuIG5vdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgc2V0Q2xlZihjbGVmOiBDbGVmKSB7XHJcbiAgICBjb25zdCBvbGRDbGVmID0gdGhpcy5jbGVmO1xyXG4gICAgdGhpcy5jbGVmID0gY2xlZjtcclxuICAgIHRoaXMudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKG5vdGUpID0+IHtcclxuICAgICAgICBub3RlLmNsZWYgPSBjbGVmO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGNsZWYgdGhhdCB0aGlzIG1lYXN1cmUgZW5kcyB3aXRoLlxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGdldExhc3RDbGVmKCkge1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB2b2ljZSA9IHRoaXMudm9pY2VzW2ldO1xyXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3Qgbm90ZSA9IHZvaWNlLm5vdGVzW2pdO1xyXG4gICAgICAgIGlmIChub3RlLmNsZWZOb3RlICYmIG5vdGUuY2xlZk5vdGUuY2xlZiAhPT0gdGhpcy5jbGVmKSB7XHJcbiAgICAgICAgICByZXR1cm4gbm90ZS5jbGVmTm90ZS5jbGVmO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY2xlZjtcclxuICB9XHJcbiAgaXNSZXN0KCkge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0gdGhpcy52b2ljZXNbaV07XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBpZiAoIXZvaWNlLm5vdGVzW2pdLmlzUmVzdCgpKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgLy8gIyMjIHBvcHVsYXRlVm9pY2VcclxuICAvLyBDcmVhdGUgYSBuZXcgdm9pY2UgaW4gdGhpcyBtZWFzdXJlLCBhbmQgcG9wdWxhdGUgaXQgd2l0aCB0aGUgZGVmYXVsdCBub3RlXHJcbiAgLy8gZm9yIHRoaXMgbWVhc3VyZS9rZXkvY2xlZlxyXG4gIHBvcHVsYXRlVm9pY2UoaW5kZXg6IG51bWJlcikge1xyXG4gICAgaWYgKGluZGV4ICE9PSB0aGlzLnZvaWNlcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy52b2ljZXMucHVzaCh7IG5vdGVzOiBTbW9NZWFzdXJlLmdldERlZmF1bHROb3Rlcyh0aGlzKSB9KTtcclxuICAgIHRoaXMuYWN0aXZlVm9pY2UgPSBpbmRleDtcclxuICB9XHJcbiAgcHJpdmF0ZSBfcmVtb3ZlU2luZ2xldG9uTW9kaWZpZXIobmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBhciA9IHRoaXMubW9kaWZpZXJzLmZpbHRlcihvYmogPT4gb2JqLmF0dHJzLnR5cGUgIT09IG5hbWUpO1xyXG4gICAgdGhpcy5tb2RpZmllcnMgPSBhcjtcclxuICB9XHJcblxyXG4gIGFkZFJlaGVhcnNhbE1hcmsocGFyYW1ldGVyczogU21vUmVoZWFyc2FsTWFya1BhcmFtcykge1xyXG4gICAgdGhpcy5fcmVtb3ZlU2luZ2xldG9uTW9kaWZpZXIoJ1Ntb1JlaGVhcnNhbE1hcmsnKTtcclxuICAgIHRoaXMubW9kaWZpZXJzLnB1c2gobmV3IFNtb1JlaGVhcnNhbE1hcmsocGFyYW1ldGVycykpO1xyXG4gIH1cclxuICByZW1vdmVSZWhlYXJzYWxNYXJrKCkge1xyXG4gICAgdGhpcy5fcmVtb3ZlU2luZ2xldG9uTW9kaWZpZXIoJ1Ntb1JlaGVhcnNhbE1hcmsnKTtcclxuICB9XHJcbiAgZ2V0UmVoZWFyc2FsTWFyaygpOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGlmaWVycy5maW5kKG9iaiA9PiBvYmouYXR0cnMudHlwZSA9PT0gJ1Ntb1JlaGVhcnNhbE1hcmsnKTtcclxuICB9XHJcbiAgZ2V0TW9kaWZpZXJzQnlUeXBlKHR5cGU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kaWZpZXJzLmZpbHRlcigobW0pID0+IHR5cGUgPT09IG1tLmF0dHJzLnR5cGUpO1xyXG4gIH1cclxuXHJcbiAgc2V0VGVtcG8ocGFyYW1zOiBTbW9UZW1wb1RleHRQYXJhbXMpIHtcclxuICAgIHRoaXMudGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KHBhcmFtcyk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldCBtZWFzdXJlIHRlbXBvIHRvIHRoZSBkZWZhdWx0IHtAbGluayBTbW9UZW1wb1RleHR9XHJcbiAgICovXHJcbiAgcmVzZXRUZW1wbygpIHtcclxuICAgIHRoaXMudGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KFNtb1RlbXBvVGV4dC5kZWZhdWx0cyk7XHJcbiAgfVxyXG4gIGdldFRlbXBvKCkge1xyXG4gICAgaWYgKHR5cGVvZiAodGhpcy50ZW1wbykgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHRoaXMudGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KFNtb1RlbXBvVGV4dC5kZWZhdWx0cyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTWVhc3VyZSB0ZXh0IGlzIGRlcHJlY2F0ZWQsIGFuZCBtYXkgbm90IGJlIHN1cHBvcnRlZCBpbiB0aGUgZnV0dXJlLlxyXG4gICAqIEJldHRlciB0byB1c2UgU21vVGV4dEdyb3VwIGFuZCBhdHRhY2ggdG8gdGhlIG1lYXN1cmUuXHJcbiAgICogQHBhcmFtIG1vZCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhZGRNZWFzdXJlVGV4dChtb2Q6IFNtb01lYXN1cmVNb2RpZmllckJhc2UpIHtcclxuICAgIHZhciBleGlzdCA9IHRoaXMubW9kaWZpZXJzLmZpbHRlcigobW0pID0+XHJcbiAgICAgIG1tLmF0dHJzLmlkID09PSBtb2QuYXR0cnMuaWRcclxuICAgICk7XHJcbiAgICBpZiAoZXhpc3QubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubW9kaWZpZXJzLnB1c2gobW9kKTtcclxuICB9XHJcblxyXG4gIGdldE1lYXN1cmVUZXh0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kaWZpZXJzLmZpbHRlcihvYmogPT4gb2JqLmN0b3IgPT09ICdTbW9NZWFzdXJlVGV4dCcpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTWVhc3VyZVRleHQoaWQ6IHN0cmluZykge1xyXG4gICAgdmFyIGFyID0gdGhpcy5tb2RpZmllcnMuZmlsdGVyKG9iaiA9PiBvYmouYXR0cnMuaWQgIT09IGlkKTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gYXI7XHJcbiAgfVxyXG5cclxuICBzZXRSZXBlYXRTeW1ib2wocnM6IFNtb1JlcGVhdFN5bWJvbCkge1xyXG4gICAgY29uc3QgYXI6IFNtb01lYXN1cmVNb2RpZmllckJhc2VbXSA9IFtdO1xyXG4gICAgbGV0IHRvQWRkID0gdHJ1ZTtcclxuICAgIGNvbnN0IGV4U3ltYm9sID0gdGhpcy5nZXRSZXBlYXRTeW1ib2woKTtcclxuICAgIGlmIChleFN5bWJvbCAmJiBleFN5bWJvbC5zeW1ib2wgPT09IHJzLnN5bWJvbCkge1xyXG4gICAgICB0b0FkZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gQWRkaW5nICdOb25lJyBtZWFucyByZW1vdmVcclxuICAgIGlmIChycy5zeW1ib2wgPT09IFNtb1JlcGVhdFN5bWJvbC5zeW1ib2xzWydOb25lJ10pIHtcclxuICAgICAgdG9BZGQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyKSA9PiB7XHJcbiAgICAgIGlmIChtb2RpZmllci5jdG9yICE9PSAnU21vUmVwZWF0U3ltYm9sJykge1xyXG4gICAgICAgIGFyLnB1c2gobW9kaWZpZXIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gYXI7XHJcbiAgICBpZiAodG9BZGQpIHtcclxuICAgICAgYXIucHVzaChycyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldFJlcGVhdFN5bWJvbCgpOiBTbW9SZXBlYXRTeW1ib2wgfCBudWxsIHtcclxuICAgIGNvbnN0IHJ2ID0gdGhpcy5tb2RpZmllcnMuZmlsdGVyKG9iaiA9PiBvYmouY3RvciA9PT0gJ1Ntb1JlcGVhdFN5bWJvbCcpO1xyXG4gICAgaWYgKHJ2Lmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIHJ2WzBdIGFzIFNtb1JlcGVhdFN5bWJvbDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBnZXQgaXNUb0RjKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcnMgPSB0aGlzLmdldFJlcGVhdFN5bWJvbCgpO1xyXG4gICAgaWYgKHJzICYmIFxyXG4gICAgICAocnMuc3ltYm9sID09PSBTbW9SZXBlYXRTeW1ib2wuc3ltYm9sc1snRGNBbENvZGEnXSB8fFxyXG4gICAgICAgcnMuc3ltYm9sID09PSBTbW9SZXBlYXRTeW1ib2wuc3ltYm9sc1snRGNBbEZpbmUnXSkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIGdldCBpc1RvRHMoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBycyA9IHRoaXMuZ2V0UmVwZWF0U3ltYm9sKCk7XHJcbiAgICBpZiAocnMgJiYgXHJcbiAgICAgIChycy5zeW1ib2wgPT09IFNtb1JlcGVhdFN5bWJvbC5zeW1ib2xzWydEc0FsRmluZSddIHx8XHJcbiAgICAgICBycy5zeW1ib2wgPT09IFNtb1JlcGVhdFN5bWJvbC5zeW1ib2xzWydEc0FsQ29kYSddKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgZ2V0IGlzU2Vnbm8oKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBycyA9IHRoaXMuZ2V0UmVwZWF0U3ltYm9sKCk7XHJcbiAgICBpZiAocnMgJiYgXHJcbiAgICAgIChycy5zeW1ib2wgPT09IFNtb1JlcGVhdFN5bWJvbC5zeW1ib2xzWydTZWdubyddKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgZ2V0IGlzQ29kYSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJzID0gdGhpcy5nZXRSZXBlYXRTeW1ib2woKTtcclxuICAgIGlmIChycyAmJiBcclxuICAgICAgKHJzLnN5bWJvbCA9PT0gU21vUmVwZWF0U3ltYm9sLnN5bWJvbHNbJ0NvZGEnXSkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIGdldCBpc1RvQ29kYSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJzID0gdGhpcy5nZXRSZXBlYXRTeW1ib2woKTtcclxuICAgIGlmIChycyAmJiBcclxuICAgICAgKHJzLnN5bWJvbCA9PT0gU21vUmVwZWF0U3ltYm9sLnN5bWJvbHNbJ3RvQ29kYSddKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgIGdldCBpc0ZpbmUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBycyA9IHRoaXMuZ2V0UmVwZWF0U3ltYm9sKCk7XHJcbiAgICBpZiAocnMgJiYgXHJcbiAgICAgIChycy5zeW1ib2wgPT09IFNtb1JlcGVhdFN5bWJvbC5zeW1ib2xzWydGaW5lJ10pKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBjbGVhclJlcGVhdFN5bWJvbHMoKSB7XHJcbiAgICBjb25zdCBhcjogU21vTWVhc3VyZU1vZGlmaWVyQmFzZVtdID0gW107XHJcbiAgICB0aGlzLm1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xyXG4gICAgICBpZiAobW9kaWZpZXIuY3RvciAhPT0gJ1Ntb1JlcGVhdFN5bWJvbCcpIHtcclxuICAgICAgICBhci5wdXNoKG1vZGlmaWVyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1vZGlmaWVycyA9IGFyO1xyXG4gIH1cclxuXHJcbiAgc2V0QmFybGluZShiYXJsaW5lOiBTbW9CYXJsaW5lKSB7XHJcbiAgICB2YXIgYXI6IFNtb01lYXN1cmVNb2RpZmllckJhc2VbXSA9IFtdO1xyXG4gICAgdGhpcy5tb2RpZmllcnMuZm9yRWFjaCgobW9kaWZpZXIpID0+IHtcclxuICAgICAgaWYgKG1vZGlmaWVyLmN0b3IgPT09ICdTbW9CYXJsaW5lJykge1xyXG4gICAgICAgIGNvbnN0IG8gPSBtb2RpZmllciBhcyBTbW9CYXJsaW5lO1xyXG4gICAgICAgIGlmIChvLnBvc2l0aW9uICE9PSBiYXJsaW5lLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgICBhci5wdXNoKG8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhci5wdXNoKG1vZGlmaWVyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1vZGlmaWVycyA9IGFyO1xyXG4gICAgYXIucHVzaChiYXJsaW5lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEJhcmxpbmUocG9zOiBudW1iZXIpOiBTbW9CYXJsaW5lIHtcclxuICAgIGxldCBydiA9IG51bGw7XHJcbiAgICB0aGlzLm1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xyXG4gICAgICBpZiAobW9kaWZpZXIuY3RvciA9PT0gJ1Ntb0JhcmxpbmUnICYmIChtb2RpZmllciBhcyBTbW9CYXJsaW5lKS5wb3NpdGlvbiA9PT0gcG9zKSB7XHJcbiAgICAgICAgcnYgPSBtb2RpZmllcjtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAocnYgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIG5ldyBTbW9CYXJsaW5lKFNtb0JhcmxpbmUuZGVmYXVsdHMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgZ2V0RW5kQmFybGluZSgpOiBTbW9CYXJsaW5lIHsgICAgXHJcbiAgICByZXR1cm4gdGhpcy5fZ2V0QmFybGluZShTbW9CYXJsaW5lLnBvc2l0aW9ucy5lbmQpO1xyXG4gIH1cclxuICBnZXRTdGFydEJhcmxpbmUoKTogU21vQmFybGluZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZ2V0QmFybGluZShTbW9CYXJsaW5lLnBvc2l0aW9ucy5zdGFydCk7XHJcbiAgfVxyXG5cclxuICBhZGROdGhFbmRpbmcoZW5kaW5nOiBTbW9Wb2x0YSkge1xyXG4gICAgY29uc3QgbW9kczogU21vTWVhc3VyZU1vZGlmaWVyQmFzZVtdID0gW107XHJcbiAgICB0aGlzLm1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcjogU21vTWVhc3VyZU1vZGlmaWVyQmFzZSkgPT4ge1xyXG4gICAgICBpZiAobW9kaWZpZXIuY3RvciAhPT0gJ1Ntb1ZvbHRhJyB8fCAobW9kaWZpZXIgYXMgU21vVm9sdGEpLnN0YXJ0QmFyICE9PSBlbmRpbmcuc3RhcnRCYXIgfHxcclxuICAgICAgICAobW9kaWZpZXIgYXMgU21vVm9sdGEpLmVuZEJhciAhPT0gZW5kaW5nLmVuZEJhcikge1xyXG4gICAgICAgIG1vZHMucHVzaChtb2RpZmllcik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbW9kcy5wdXNoKGVuZGluZyk7XHJcbiAgICB0aGlzLm1vZGlmaWVycyA9IG1vZHM7XHJcbiAgfVxyXG5cclxuICByZW1vdmVOdGhFbmRpbmcoZW5kaW5nOiBTbW9Wb2x0YSkge1xyXG4gICAgY29uc3QgbW9kczogU21vTWVhc3VyZU1vZGlmaWVyQmFzZVtdID0gW107XHJcbiAgICB0aGlzLm1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xyXG4gICAgICBpZiAobW9kaWZpZXIuY3RvciA9PT0gJ1Ntb1ZvbHRhJykge1xyXG4gICAgICAgIGNvbnN0IHZvbHRhID0gbW9kaWZpZXIgYXMgU21vVm9sdGE7XHJcbiAgICAgICAgaWYgKGVuZGluZy5zdGFydFNlbGVjdG9yID09PSBudWxsIHx8IGVuZGluZy5lbmRTZWxlY3RvciA9PT0gbnVsbCB8fCB2b2x0YS5zdGFydFNlbGVjdG9yID09PSBudWxsIHx8IHZvbHRhLmVuZFNlbGVjdG9yID09PSBudWxsKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghU21vU2VsZWN0b3Iuc2FtZU1lYXN1cmUoZW5kaW5nLnN0YXJ0U2VsZWN0b3IsIHZvbHRhLnN0YXJ0U2VsZWN0b3IpIHx8ICFTbW9TZWxlY3Rvci5zYW1lTWVhc3VyZShlbmRpbmcuZW5kU2VsZWN0b3IsIHZvbHRhLmVuZFNlbGVjdG9yKVxyXG4gICAgICAgICYmIGVuZGluZy5udW1iZXIgIT09IHZvbHRhLm51bWJlcikge1xyXG4gICAgICAgICAgbW9kcy5wdXNoKG1vZGlmaWVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbW9kcy5wdXNoKG1vZGlmaWVyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1vZGlmaWVycyA9IG1vZHM7XHJcbiAgfVxyXG5cclxuICBnZXROdGhFbmRpbmdzKCk6IFNtb1ZvbHRhW10ge1xyXG4gICAgY29uc3QgcnY6IFNtb1ZvbHRhW10gPSBbXTtcclxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlKSA9PiB7XHJcbiAgICAgIGlmIChtb2RpZmllci5jdG9yID09PSAnU21vVm9sdGEnKSB7XHJcbiAgICAgICAgcnYucHVzaChtb2RpZmllciBhcyBTbW9Wb2x0YSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICBzZXRLZXlTaWduYXR1cmUoc2lnOiBzdHJpbmcpIHtcclxuICAgIHRoaXMua2V5U2lnbmF0dXJlID0gc2lnO1xyXG4gICAgdGhpcy52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgobm90ZSkgPT4ge1xyXG4gICAgICAgIG5vdGUua2V5U2lnbmF0dXJlID0gc2lnO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBzZXRNZWFzdXJlTnVtYmVyKG51bTogTWVhc3VyZU51bWJlcikge1xyXG4gICAgdGhpcy5tZWFzdXJlTnVtYmVyID0gbnVtO1xyXG4gIH1cclxuICBnZXRCZWFtR3JvdXBGb3JOb3RlKG5vdGU6IFNtb05vdGUpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBqID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmJlYW1Hcm91cHMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgYmcgPSB0aGlzLmJlYW1Hcm91cHNbaV07XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBiZy5ub3Rlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGlmIChiZy5ub3Rlc1tqXS5hdHRycy5pZCA9PT0gbm90ZS5hdHRycy5pZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGJnO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/smo/data/measure.ts\n\n}");
514
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SmoMeasure: () => (/* binding */ SmoMeasure),\n/* harmony export */ SmoMeasureNumberParams: () => (/* binding */ SmoMeasureNumberParams),\n/* harmony export */ SmoMeasureStringParams: () => (/* binding */ SmoMeasureStringParams)\n/* harmony export */ });\n/* harmony import */ var _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../common/serializationHelpers */ \"./src/common/serializationHelpers.js\");\n/* harmony import */ var _music__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _measureModifiers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _note__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./note */ \"./src/smo/data/note.ts\");\n/* harmony import */ var _tuplet__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tuplet */ \"./src/smo/data/tuplet.ts\");\n/* harmony import */ var _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../render/sui/layoutDebug */ \"./src/render/sui/layoutDebug.ts\");\n/* harmony import */ var _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../render/sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _xform_tickMap__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../xform/tickMap */ \"./src/smo/xform/tickMap.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _xform_selections__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../xform/selections */ \"./src/smo/xform/selections.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * Contains definition and supporting classes for {@link SmoMeasure}.\n * Most of the engraving is done at the measure level. Measure contains multiple (at least 1)\n * voices, which in turn contain notes. Each measure also contains formatting information. This\n * is mostly serialized outside of measure (in score), since columns and often an entire region\n * share measure formatting. Measures also contain modifiers like barlines. Tuplets and beam groups\n * are contained at the measure level.\n * @module /smo/data/measure\n */\n\n\n\n\n\n\n\n\n\n\n// @internal\nconst SmoMeasureNumberParams = ['transposeIndex', 'activeVoice', 'lines', 'repeatCount'];\n// @internal\nconst SmoMeasureStringParams = ['keySignature'];\n/**\n * Only arrays and measure numbers are serilialized with default values.\n * @param params - result of serialization\n * @returns\n */\nfunction isSmoMeasureParamsSer(params) {\n var _a;\n if (!Array.isArray(params.voices) ||\n !Array.isArray(params.tupletTrees) || !Array.isArray(params.modifiers) ||\n typeof ((_a = params === null || params === void 0 ? void 0 : params.measureNumber) === null || _a === void 0 ? void 0 : _a.measureIndex) !== 'number') {\n return false;\n }\n return true;\n}\n/**\n * Data for a measure of music. Many rules of musical engraving are\n * enforced at a measure level: the duration of notes, accidentals, etc.\n *\n * Measures contain {@link SmoNote}, {@link SmoTuplet}, and {@link SmoBeamGroup}\n * Measures are contained in {@link SmoSystemStaff}\n * @category SmoObject\n */\nclass SmoMeasure {\n static get timeSignatureDefault() {\n return new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults);\n }\n /**\n * Default constructor parameters. Defaults are always copied so the\n * caller can modify them to create a new measure.\n * @returns constructor params for a new measure\n */\n static get defaults() {\n const proto = JSON.parse(JSON.stringify(SmoMeasure._defaults));\n proto.format = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults);\n proto.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n proto.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n proto.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n return proto;\n }\n // @ignore\n static convertLegacyTimeSignature(ts) {\n const rv = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults);\n rv.timeSignature = ts;\n return rv;\n }\n /**\n * Fill in components. We assume the modifiers are already constructed,\n * e.g. by deserialize or the calling function.\n * @param params\n */\n constructor(params) {\n this.timeSignature = SmoMeasure.timeSignatureDefault;\n /**\n * Overrides display of actual time signature, in the case of\n * pick-up notes where the actual and displayed durations are different\n */\n this.keySignature = '';\n this.canceledKeySignature = '';\n this.tupletTrees = [];\n this.repeatSymbol = false;\n this.repeatCount = 0;\n this.ctor = 'SmoMeasure';\n /**\n * Adjust for non-concert pitch intstruments\n */\n this.transposeIndex = 0;\n this.modifiers = [];\n /**\n * Row, column, and custom numbering information about this measure.\n */\n this.measureNumber = {\n localIndex: 0,\n systemIndex: 0,\n measureIndex: 0,\n staffId: 0\n };\n this.clef = 'treble';\n this.voices = [];\n /**\n * the active voice in the editor, if there are multiple voices\n * */\n this.activeVoice = 0;\n this.beamGroups = [];\n this.lines = 5;\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n this.svg = {\n staffWidth: 0,\n unjustifiedWidth: 0,\n staffX: 0,\n staffY: 0,\n logicalBox: {\n x: 0, y: 0, width: 0, height: 0\n },\n yTop: 0,\n adjX: 0,\n maxColumnStartX: 0,\n adjRight: 0,\n history: [],\n lineIndex: 0,\n pageIndex: 0,\n rowInSystem: 0,\n forceClef: false,\n forceKeySignature: false,\n forceTimeSignature: false,\n forceTempo: false,\n hideEmptyMeasure: false,\n hideMultimeasure: false,\n multimeasureLength: 0,\n multimeasureEndBarline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines['singleBar'],\n element: null\n };\n const defaults = SmoMeasure.defaults;\n SmoMeasureNumberParams.forEach((param) => {\n if (typeof (params[param]) !== 'undefined') {\n this[param] = params[param];\n }\n });\n SmoMeasureStringParams.forEach((param) => {\n this[param] = params[param] ? params[param] : defaults[param];\n });\n this.clef = params.clef;\n this.repeatSymbol = params.repeatSymbol;\n this.measureNumber = JSON.parse(JSON.stringify(params.measureNumber));\n if (params.tempo) {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(params.tempo);\n }\n // Handle legacy time signature format\n if (params.timeSignature) {\n const tsAny = params.timeSignature;\n if (typeof (tsAny) === 'string') {\n this.timeSignature = SmoMeasure.convertLegacyTimeSignature(tsAny);\n }\n else {\n this.timeSignature = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.createFromPartial(tsAny);\n }\n }\n this.voices = params.voices ? params.voices : [];\n this.tupletTrees = params.tupletTrees ? params.tupletTrees : [];\n this.modifiers = params.modifiers ? params.modifiers : defaults.modifiers;\n this.setDefaultBarlines();\n this.keySignature = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySigWithOffset(this.keySignature, this.transposeIndex);\n if (!(params.format)) {\n this.format = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults);\n this.format.measureIndex = this.measureNumber.measureIndex;\n }\n else {\n this.format = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(params.format);\n }\n this.id = (0,_common__WEBPACK_IMPORTED_MODULE_8__.getId)().toString();\n this.updateClefChangeNotes();\n }\n // @internal\n // used for serialization\n static get defaultAttributes() {\n return [\n 'keySignature',\n 'measureNumber',\n 'activeVoice', 'clef', 'transposeIndex',\n 'format', 'rightMargin', 'lines', 'repeatSymbol', 'repeatCount'\n ];\n }\n // @internal\n // used for serialization\n static get formattingOptions() {\n return ['customStretch', 'customProportion', 'autoJustify', 'systemBreak',\n 'pageBreak', 'padLeft'];\n }\n // @internal\n // used for serialization\n static get columnMappedAttributes() {\n return ['timeSignature', 'keySignature', 'tempo'];\n }\n static get serializableAttributes() {\n const rv = [];\n SmoMeasure.defaultAttributes.forEach((attr) => {\n if (SmoMeasure.columnMappedAttributes.indexOf(attr) < 0 && attr !== 'format') {\n rv.push(attr);\n }\n });\n return rv;\n }\n /**\n // Return true if the time signatures are the same, for display purposes (e.g. if a time sig change\n // is required)\n */\n static timeSigEqual(o1, o2) {\n return o1.timeSignature === o2.timeSignature && o1.useSymbol === o2.useSymbol;\n }\n /**\n * If there is a clef change mid-measure, update the actual clefs of the notes\n * so they display correctly.\n */\n updateClefChangeNotes() {\n let changed = false;\n let curTick = 0;\n let clefChange = this.clef;\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n curTick = 0;\n for (var j = 0; j < voice.notes.length; ++j) {\n const smoNote = voice.notes[j];\n smoNote.clef = this.clef;\n if (smoNote.clefNote && smoNote.clefNote.clef !== this.clef) {\n clefChange = smoNote.clefNote.clef;\n curTick += smoNote.tickCount;\n changed = true;\n break;\n }\n curTick += smoNote.tickCount;\n }\n if (changed) {\n break;\n }\n }\n if (!changed) {\n return;\n }\n // clefChangeTick is where the change goes. We only support\n // one per measure, others are ignored.\n const clefChangeTick = curTick;\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n curTick = 0;\n for (var j = 0; j < voice.notes.length; ++j) {\n const smoNote = voice.notes[j];\n const noteTicks = smoNote.tickCount;\n if (curTick + noteTicks >= clefChangeTick) {\n smoNote.clef = clefChange;\n }\n // Remove any redundant clef changes later in the measure\n if (curTick + noteTicks > clefChangeTick) {\n if (smoNote.clefNote && smoNote.clefNote.clef === clefChange) {\n smoNote.clefNote = null;\n }\n }\n curTick += noteTicks;\n }\n }\n }\n /**\n * @internal\n * @returns column mapped parameters, serialized. caller will\n * decide if the parameters need to be persisted\n */\n serializeColumnMapped() {\n //\n return {\n timeSignature: this.timeSignature.serialize(),\n keySignature: this.keySignature,\n tempo: this.tempo.serialize()\n };\n }\n getColumnMapped() {\n return {\n timeSignature: this.timeSignature,\n keySignature: this.keySignature,\n tempo: this.tempo\n };\n }\n /**\n * Convert this measure object to a JSON object, recursively serializing all the notes,\n * note modifiers, etc.\n */\n serialize() {\n const params = { \"ctor\": \"SmoMeasure\" };\n let ser = true;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMergeNonDefault(SmoMeasure.defaults, SmoMeasure.serializableAttributes, this, params);\n // Don't serialize default things\n const fmt = this.format.serialize();\n // measure number can't be defaulted b/c tempos etc. can map to default measure\n params.measureNumber = JSON.parse(JSON.stringify(this.measureNumber));\n params.tupletTrees = [];\n params.voices = [];\n params.modifiers = [];\n this.tupletTrees.forEach((tupletTree) => {\n params.tupletTrees.push(tupletTree.serialize());\n });\n this.voices.forEach((voice) => {\n const obj = {\n notes: []\n };\n voice.notes.forEach((note) => {\n obj.notes.push(note.serialize());\n });\n params.voices.push(obj);\n });\n this.modifiers.forEach((modifier) => {\n ser = true;\n /* don't serialize default modifiers */\n if (modifier.ctor === 'SmoBarline' && modifier.position === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start &&\n modifier.barline === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar) {\n ser = false;\n }\n else if (modifier.ctor === 'SmoBarline' && modifier.position === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end\n && modifier.barline === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar) {\n ser = false;\n }\n else if (modifier.ctor === 'SmoTempoText') {\n // we don't save tempo text as a modifier anymore\n ser = false;\n }\n else if (modifier.ctor === 'SmoRepeatSymbol' && modifier.position === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.positions.start\n && modifier.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols.None) {\n ser = false;\n }\n if (ser) {\n params.modifiers.push(modifier.serialize());\n }\n });\n // ['timeSignature', 'keySignature', 'tempo']\n if (!isSmoMeasureParamsSer(params)) {\n throw 'invalid measure';\n }\n return params;\n }\n /**\n * Due to a bug, some tuplets have incorrect ticks. Fix it when we are deserializing the measure\n * @param voices\n * @param tupletTree\n */\n static fixTupletLengths(voices, tupletTree) {\n const voice = voices[tupletTree.voice];\n const notear = [];\n for (let i = tupletTree.startIndex; i <= tupletTree.endIndex; ++i) {\n if (voice.notes.length > i) {\n notear.push(voice.notes[i]);\n }\n }\n if (notear.length === (tupletTree.endIndex - tupletTree.startIndex + 1)) {\n const tickSum = notear.map((x) => x.tickCount).reduce((a, b) => a + b);\n if (tupletTree.totalTicks > tickSum) {\n notear[0].ticks.numerator += tupletTree.totalTicks - tickSum;\n }\n }\n }\n /**\n * restore a serialized measure object. Usually called as part of deserializing a score,\n * but can also be used to restore a measure due to an undo operation. Recursively\n * deserialize all the notes and modifiers to construct a new measure.\n * @param jsonObj the serialized SmoMeasure\n * @returns\n */\n static deserialize(jsonObj) {\n var _a;\n let j = 0;\n let i = 0;\n const voices = [];\n for (j = 0; j < jsonObj.voices.length; ++j) {\n const voice = jsonObj.voices[j];\n const notes = [];\n voices.push({\n notes\n });\n for (i = 0; i < voice.notes.length; ++i) {\n const noteParams = voice.notes[i];\n const smoNote = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.deserialize(noteParams);\n notes.push(smoNote);\n }\n }\n const modifiers = [];\n jsonObj.modifiers.forEach((modParams) => {\n const modifier = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureModifierBase.deserialize(modParams);\n modifiers.push(modifier);\n });\n const params = SmoMeasure.defaults;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.defaultAttributes, jsonObj, params);\n // explode column-mapped\n if (jsonObj.tempo) {\n params.tempo = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.deserialize(jsonObj.tempo);\n }\n else {\n params.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n // timeSignatureString is now part of timeSignature. upconvert old scores\n let timeSignatureString = '';\n const jsonLegacy = jsonObj;\n if (typeof (jsonLegacy.timeSignatureString) === 'string' && jsonLegacy.timeSignatureString.length > 0) {\n timeSignatureString = jsonLegacy.timeSignatureString;\n }\n if (jsonObj.timeSignature) {\n if (timeSignatureString.length) {\n jsonObj.timeSignature.displayString = timeSignatureString;\n }\n params.timeSignature = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.deserialize(jsonObj.timeSignature);\n }\n else {\n const tparams = _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature.defaults;\n if (timeSignatureString.length) {\n tparams.displayString = timeSignatureString;\n }\n params.timeSignature = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(tparams);\n }\n params.keySignature = (_a = jsonObj.keySignature) !== null && _a !== void 0 ? _a : 'C';\n params.voices = voices;\n if (jsonObj.tupletTrees !== undefined) {\n for (j = 0; j < jsonObj.tupletTrees.length; ++j) {\n const tupletTreeJson = jsonObj.tupletTrees[j];\n const tupletTree = _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.deserialize(tupletTreeJson);\n params.tupletTrees.push(tupletTree);\n SmoMeasure.fixTupletLengths(voices, tupletTree);\n }\n }\n //deserialization of a legacy tuplets\n //legacy schema had measure.tuplets, it is measure.tupletTrees now\n if (jsonObj.tuplets !== undefined) {\n for (j = 0; j < jsonObj.tuplets.length; ++j) {\n const tupJson = jsonObj.tuplets[j];\n // Legacy schema had attrs.id, now it is just id\n if (tupJson.attrs && tupJson.attrs.id) {\n tupJson.id = tupJson.attrs.id;\n }\n const tupletNotes = [];\n let startIndex = null;\n params.voices.forEach((voice) => {\n voice.notes.forEach((note, index) => {\n // backwards-compatibiliity, some scores don't have attrs on tuplet\n if (typeof (tupJson.id) === 'string') {\n tupJson.attrs = { type: 'SmoTuplet', id: tupJson.id };\n }\n const id = tupJson.attrs.id;\n if (note.isTuplet && note.tupletId === id) {\n tupletNotes.push(note);\n //we cannot trust startIndex coming from legacy json\n //we need to count index of the first note in the tuplet\n if (startIndex === null) {\n startIndex = index;\n }\n }\n });\n });\n // Bug fix: A tuplet with no notes may be been overwritten\n // in a copy/paste operation\n if (tupletNotes.length > 0) {\n tupJson.notes = tupletNotes;\n tupJson.startIndex = startIndex;\n tupJson.endIndex = tupJson.startIndex + tupletNotes.length - 1;\n }\n const tuplet = _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTuplet.deserialize(tupJson);\n const tupletTree = new _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree({ tuplet: tuplet });\n params.tupletTrees.push(tupletTree);\n }\n }\n if (params.tupletTrees.length) {\n _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.syncTupletIds(params.tupletTrees, voices);\n }\n params.modifiers = modifiers;\n const measure = new SmoMeasure(params);\n // Handle migration for measure-mapped parameters\n measure.modifiers.forEach((mod) => {\n if (mod.ctor === 'SmoTempoText') {\n measure.tempo = mod;\n }\n });\n if (!measure.tempo) {\n measure.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n return measure;\n }\n static clone(measure) {\n return SmoMeasure.deserialize(measure.serialize());\n }\n static cloneForPasteOrUndo(measure) {\n const clonedMeasure = SmoMeasure.clone(measure);\n clonedMeasure.svg = measure.svg;\n // Ordinarily, the key/tempo/time is mapped to the stave, but since we are pasting measure-by\n // measure here, we want to preserve it.\n clonedMeasure.keySignature = measure.keySignature;\n clonedMeasure.timeSignature = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(measure.timeSignature);\n clonedMeasure.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(measure.tempo);\n return clonedMeasure;\n }\n /**\n * When creating a new measure, the 'default' settings can vary depending on\n * what comes before/after the measure. This determines the default pitch\n * for a clef (appears on 3rd line)\n */\n static get defaultPitchForClef() {\n return {\n 'treble': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'bass': {\n letter: 'd',\n accidental: 'n',\n octave: 3\n },\n 'tenor': {\n letter: 'a',\n accidental: 'n',\n octave: 3\n },\n 'alto': {\n letter: 'c',\n accidental: 'n',\n octave: 4\n },\n 'soprano': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'percussion': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'mezzo-soprano': {\n letter: 'b',\n accidental: 'n',\n octave: 4\n },\n 'baritone-c': {\n letter: 'b',\n accidental: 'n',\n octave: 3\n },\n 'baritone-f': {\n letter: 'e',\n accidental: 'n',\n octave: 3\n },\n 'subbass': {\n letter: 'd',\n accidental: '',\n octave: 2\n },\n 'french': {\n letter: 'b',\n accidental: '',\n octave: 4\n } // no idea\n };\n }\n static set emptyMeasureNoteType(tt) {\n SmoMeasure._emptyMeasureNoteType = tt;\n }\n static get emptyMeasureNoteType() {\n return SmoMeasure._emptyMeasureNoteType;\n }\n static timeSignatureNotes(timeSignature, clef) {\n const pitch = SmoMeasure.defaultPitchForClef[clef];\n const maxTicks = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.timeSignatureToTicks(timeSignature.timeSignature);\n const noteTick = 8192 / (timeSignature.beatDuration / 2);\n let ticks = 0;\n const pnotes = [];\n while (ticks < maxTicks) {\n const nextNote = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults;\n nextNote.pitches = [JSON.parse(JSON.stringify(pitch))];\n nextNote.noteType = 'r';\n nextNote.clef = clef;\n nextNote.ticks.numerator = noteTick;\n nextNote.stemTicks = noteTick;\n pnotes.push(new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(nextNote));\n ticks += noteTick;\n }\n if (timeSignature.beatDuration === 8 && (timeSignature.actualBeats % 3 === 0 || timeSignature.actualBeats % 2 !== 0)) {\n let ix = 0;\n pnotes.forEach((pnote) => {\n if ((ix + 1) % 3 === 0) {\n pnote.beamState = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.beamStates.end;\n }\n pnote.beamBeats = 2048 * 3;\n ix += 1;\n });\n }\n return pnotes;\n }\n /**\n * Get a measure full of default notes for a given timeSignature/clef.\n * returns 8th notes for triple-time meters, etc.\n * @param params\n * @returns\n */\n static getDefaultNotes(params) {\n return SmoMeasure.timeSignatureNotes(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(params.timeSignature), params.clef);\n }\n /**\n * When creating a new measure, the 'default' settings can vary depending on\n * what comes before/after the measure. This determines the defaults from the\n * parameters that are passed in, which could be another measure in the score.\n * This version returns params with no notes, for callers that want to use their own notes.\n * If you want the default notes, see {@link getDefaultMeasureWithNotes}\n *\n * @param params\n * @returns\n */\n static getDefaultMeasure(params) {\n const obj = {};\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.defaultAttributes, SmoMeasure.defaults, obj);\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.defaultAttributes, params, obj);\n // Don't copy column-formatting options to new measure in new column\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoMeasure.formattingOptions, SmoMeasure.defaults, obj);\n obj.timeSignature = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.TimeSignature(params.timeSignature);\n // The measure expects to get concert KS in constructor and adjust for instrument. So do the\n // opposite.\n obj.keySignature = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySigWithOffset(obj.keySignature, -1 * obj.transposeIndex);\n obj.lines = params.lines;\n // Don't redisplay tempo for a new measure\n const rv = new SmoMeasure(obj);\n if (rv.tempo && rv.tempo.display) {\n rv.tempo.display = false;\n }\n return rv;\n }\n /**\n * When creating a new measure, the 'default' settings can vary depending on\n * what comes before/after the measure. This determines the defaults from the\n * parameters that are passed in, which could be another measure in the score.\n *\n * @param params\n * @returns\n */\n static getDefaultMeasureWithNotes(params) {\n var measure = SmoMeasure.getDefaultMeasure(params);\n measure.voices.push({\n notes: SmoMeasure.getDefaultNotes(params)\n });\n // fix a bug.\n // new measures only have 1 voice, make sure active voice is 0\n measure.activeVoice = 0;\n return measure;\n }\n /**\n * used by xml export\n * @internal\n * @param val\n */\n getForceSystemBreak() {\n return this.format.systemBreak;\n }\n // @internal\n setDefaultBarlines() {\n if (!this.getStartBarline()) {\n this.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n }\n if (!this.getEndBarline()) {\n this.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline({\n position: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end,\n barline: _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.barlines.singleBar\n }));\n }\n }\n get containsSound() {\n let i = 0;\n for (i = 0; i < this.voices.length; ++i) {\n let j = 0;\n const voice = this.voices[i];\n for (j = 0; j < this.voices.length; ++j) {\n if (voice.notes[j].noteType === 'n') {\n return true;\n }\n }\n }\n return false;\n }\n /**\n * The rendered width of the measure, or estimate of same\n */\n get staffWidth() {\n return this.svg.staffWidth;\n }\n /**\n * set the rendered width of the measure, or estimate of same\n */\n setWidth(width, description) {\n if (_render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.flagSet(_render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.values.measureHistory)) {\n this.svg.history.push('setWidth ' + this.staffWidth + '=> ' + width + ' ' + description);\n }\n if (isNaN(width)) {\n throw ('NAN in setWidth');\n }\n this.svg.staffWidth = width;\n }\n /**\n * Get rendered or estimated start x\n */\n get staffX() {\n return this.svg.staffX;\n }\n /**\n * Set rendered or estimated start x\n */\n setX(x, description) {\n if (isNaN(x)) {\n throw ('NAN in setX');\n }\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'staffX', x, description);\n this.svg.staffX = Math.round(x);\n }\n /**\n * A time signature has possibly changed. add/remove notes to\n * match the new length\n */\n alignNotesWithTimeSignature() {\n const tsTicks = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.timeSignatureToTicks(this.timeSignature.timeSignature);\n let aligned = true;\n for (let i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n if (this.getTicksFromVoice(i) !== tsTicks) {\n aligned = false;\n break;\n }\n }\n if (aligned) {\n return true;\n }\n const replaceNoteWithDuration = (target, ar, note) => {\n const fitNote = new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(_note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults);\n const duration = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.closestDurationTickLtEq(target);\n if (duration > 128) {\n fitNote.ticks = { numerator: duration, denominator: 1, remainder: 0 };\n fitNote.stemTicks = duration;\n fitNote.pitches = note.pitches;\n fitNote.noteType = note.noteType;\n fitNote.clef = note.clef;\n ar.push(fitNote);\n }\n };\n const voices = [];\n const tuplets = [];\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n const newNotes = [];\n let voiceTicks = 0;\n for (var j = 0; j < voice.notes.length; ++j) {\n const note = voice.notes[j];\n // if a tuplet, make sure the whole tuplet fits.\n if (note.isTuplet) {\n const tupletTree = _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.getTupletTreeForNoteIndex(this.tupletTrees, i, j);\n if (tupletTree) {\n // remaining notes of an approved tuplet, just add them\n if (tupletTree.startIndex !== j) {\n newNotes.push(note);\n continue;\n }\n else if (tupletTree.totalTicks + voiceTicks <= tsTicks) {\n // first note of the tuplet, it fits, add it\n voiceTicks += tupletTree.totalTicks;\n newNotes.push(note);\n }\n else {\n // tuplet will not fit. Replace tuplet with a note as close to remainder as possible and add it\n // remove tuplet\n note.tupletId = null;\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, note);\n voiceTicks = tsTicks;\n _tuplet__WEBPACK_IMPORTED_MODULE_4__.SmoTupletTree.removeTupletForNoteIndex(this, i, j);\n break;\n }\n }\n else { // missing tuplet, now what?\n console.warn('missing tuplet info');\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, note);\n voiceTicks = tsTicks;\n }\n }\n else {\n if (note.tickCount + voiceTicks <= tsTicks) {\n newNotes.push(note);\n voiceTicks += note.tickCount;\n }\n else {\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, note);\n voiceTicks = tsTicks;\n break;\n }\n }\n }\n if (tsTicks - voiceTicks > 128) {\n const np = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults;\n np.clef = this.clef;\n const nnote = new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(np);\n replaceNoteWithDuration(tsTicks - voiceTicks, newNotes, nnote);\n }\n voices.push({ notes: newNotes });\n }\n this.voices = voices;\n }\n get measureNumberDbg() {\n return `${this.measureNumber.measureIndex}/${this.measureNumber.systemIndex}/${this.measureNumber.staffId}`;\n }\n /**\n * Get rendered or estimated start y\n */\n get staffY() {\n return this.svg.staffY;\n }\n /**\n * Set rendered or estimated start y\n */\n setY(y, description) {\n if (isNaN(y)) {\n throw ('NAN in setY');\n }\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'staffY', y, description);\n this.svg.staffY = Math.round(y);\n }\n /**\n * Return actual or estimated highest point in score\n */\n get yTop() {\n return this.svg.yTop;\n }\n /**\n * return the lowest y (highest value) in this measure svg\n *\n * @readonly\n */\n get lowestY() {\n if (this.svg.tabStaveBox) {\n return this.svg.tabStaveBox.y + this.svg.tabStaveBox.height;\n }\n else {\n return this.svg.logicalBox.y + this.svg.logicalBox.height;\n }\n }\n /**\n * adjust the y for the render boxes to account for the page and margins\n */\n adjustY(yOffset) {\n this.svg.logicalBox.y += yOffset;\n if (this.svg.tabStaveBox) {\n this.svg.tabStaveBox.y += yOffset;\n }\n }\n /**\n * WHen setting an instrument, offset the pitches to match the instrument key\n * @param offset\n * @param newClef\n */\n transposeToOffset(offset, targetKey, newClef) {\n const diff = offset - this.transposeIndex;\n newClef = newClef !== null && newClef !== void 0 ? newClef : this.clef;\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n const pitches = [...Array(note.pitches.length).keys()];\n // when the note is a rest, preserve the rest but match the new clef.\n if (newClef !== this.clef && note.noteType === 'r') {\n // @ts-ignore\n const defp = JSON.parse(JSON.stringify(SmoMeasure.defaultPitchForClef[newClef]));\n note.pitches = [defp];\n }\n else {\n note.transpose(pitches, diff, this.keySignature, targetKey);\n note.getGraceNotes().forEach((gn) => {\n const gpitch = [...Array(gn.pitches.length).keys()];\n const xpose = _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.transpose(gn, gpitch, diff, this.keySignature, targetKey);\n gn.pitches = xpose.pitches;\n });\n }\n });\n });\n }\n /**\n * Return actual or estimated highest point in score\n */\n setYTop(y, description) {\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'yTop', y, description);\n this.svg.yTop = y;\n }\n /**\n * Return actual or estimated bounding box\n */\n setBox(box, description) {\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_5__.layoutDebug.measureHistory(this, 'logicalBox', box, description);\n this.svg.logicalBox = _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.smoBox(box);\n }\n /**\n * @returns the DOM identifier for this measure when rendered\n */\n getClassId() {\n return 'mm-' + this.measureNumber.staffId + '-' + this.measureNumber.measureIndex;\n }\n /**\n *\n * @param id\n * @returns\n */\n getRenderedNote(id) {\n let j = 0;\n let i = 0;\n for (j = 0; j < this.voices.length; ++j) {\n const voice = this.voices[j];\n for (i = 0; i < voice.notes.length; ++i) {\n const note = voice.notes[i];\n if (note.renderId === id) {\n return {\n smoNote: note,\n voice: j,\n tick: i\n };\n }\n }\n }\n return null;\n }\n getNotes() {\n return this.voices[this.activeVoice].notes;\n }\n getActiveVoice() {\n return this.activeVoice;\n }\n setActiveVoice(vix) {\n if (vix >= 0 && vix < this.voices.length) {\n this.activeVoice = vix;\n }\n }\n getSwapVoicePairs() {\n const rv = [];\n for (let i = 0; i < this.voices.length; ++i) {\n for (let j = i + 1; j < this.voices.length; ++j) {\n rv.push([i, j]);\n }\n }\n return rv;\n }\n swapVoices(voice1, voice2) {\n if (this.voices.length > voice1 && this.voices.length > voice2) {\n const v1 = this.voices[voice1];\n const v2 = this.voices[voice2];\n const nvoices = [];\n for (let i = 0; i < this.voices.length; ++i) {\n if (i === voice1) {\n nvoices.push(v2);\n }\n else if (i === voice2) {\n nvoices.push(v1);\n }\n else {\n nvoices.push(this.voices[i]);\n }\n }\n this.voices = nvoices;\n }\n }\n tickmapForVoice(voiceIx) {\n return new _xform_tickMap__WEBPACK_IMPORTED_MODULE_7__.TickMap(this, voiceIx);\n }\n // ### createMeasureTickmaps\n // A tickmap is a map of notes to ticks for the measure. It is speciifc per-voice\n // since each voice may have different numbers of ticks. The accidental map is\n // overall since accidentals in one voice apply to accidentals in the other\n // voices. So we return the tickmaps and the overall accidental map.\n createMeasureTickmaps() {\n let i = 0;\n const tickmapArray = [];\n const accidentalMap = {};\n for (i = 0; i < this.voices.length; ++i) {\n tickmapArray.push(this.tickmapForVoice(i));\n }\n for (i = 0; i < this.voices.length; ++i) {\n const tickmap = tickmapArray[i];\n const durationKeys = Object.keys((tickmap.durationAccidentalMap));\n durationKeys.forEach((durationKey) => {\n if (!accidentalMap[durationKey]) {\n accidentalMap[durationKey] = tickmap.durationAccidentalMap[durationKey];\n }\n else {\n const amap = accidentalMap[durationKey];\n const tickable = tickmap.durationAccidentalMap[durationKey];\n const letterKeys = Object.keys(tickable);\n letterKeys.forEach((pitchKey) => {\n if (!amap[pitchKey]) {\n amap[pitchKey] = tickmap.durationAccidentalMap[durationKey][pitchKey];\n }\n });\n }\n });\n }\n // duration: duration, pitches: Record<PitchLetter,TickAccidental>\n const accidentalArray = [];\n Object.keys(accidentalMap).forEach((durationKey) => {\n accidentalArray.push({ duration: durationKey, pitches: accidentalMap[durationKey] });\n });\n return {\n tickmaps: tickmapArray,\n accidentalMap,\n accidentalArray\n };\n }\n // ### createRestNoteWithDuration\n // pad some duration of music with rests.\n static createRestNoteWithDuration(duration, clef) {\n const pitch = JSON.parse(JSON.stringify(SmoMeasure.defaultPitchForClef[clef]));\n const note = new _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote(_note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.defaults);\n note.pitches = [pitch];\n note.noteType = 'r';\n note.hidden = true;\n note.ticks = { numerator: duration, denominator: 1, remainder: 0 };\n return note;\n }\n /**\n * Count the number of ticks in each voice and return max\n * @returns\n */\n getMaxTicksVoice() {\n let i = 0;\n let max = 0;\n for (i = 0; i < this.voices.length; ++i) {\n const voiceTicks = this.getTicksFromVoice(i);\n max = Math.max(voiceTicks, max);\n }\n return max;\n }\n /**\n * For pasting, paste into the target measure if the voice exists, else paste into\n * voice 0\n * @param voiceIndex\n * @returns\n */\n getTicksFromThisOrAnyVoice(voiceIndex) {\n if (this.voices.length > voiceIndex) {\n return this.getTicksFromVoice(voiceIndex);\n }\n else {\n return this.getTicksFromVoice(0);\n }\n }\n /**\n * Count the number of ticks in a specific voice\n * @param voiceIndex\n * @returns\n */\n getTicksFromVoice(voiceIndex) {\n let ticks = 0;\n this.voices[voiceIndex].notes.forEach((note) => {\n ticks += note.tickCount;\n });\n return ticks;\n }\n /**\n * Count all the ticks up to the provided tickIndex\n * @param voiceIndex\n * @param tickIndex\n */\n getNotePositionInTicks(voiceIndex, tickIndex) {\n let rv = 0;\n for (let i = 0; i < tickIndex; i++) {\n const note = this.voices[voiceIndex].notes[i];\n rv += note.tickCount;\n }\n return rv;\n }\n /**\n * Count all the ticks up to the provided tickIndex\n * @param voiceIndex\n * @param tickIndex\n */\n getTickCountForNote(voiceIndex, note) {\n let rv = 0;\n for (let i = 0; i < this.voices[voiceIndex].notes.length; i++) {\n const currentNote = this.voices[voiceIndex].notes[i];\n rv += note.tickCount;\n }\n return rv;\n }\n getClosestIndexFromTickCount(voiceIndex, tickCount) {\n let i = 0;\n let rv = 0;\n for (i = 0; i < this.voices[voiceIndex].notes.length; ++i) {\n const note = this.voices[voiceIndex].notes[i];\n if (note.tickCount + rv >= tickCount) {\n return i;\n }\n rv += note.tickCount;\n }\n return i;\n }\n isPickup() {\n const ticks = this.getTicksFromVoice(0);\n const goal = _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.timeSignatureToTicks(this.timeSignature.timeSignature);\n return (ticks < goal);\n }\n clearBeamGroups() {\n this.beamGroups = [];\n }\n // ### updateLyricFont\n // Update the lyric font, which is the same for all lyrics.\n setLyricFont(fontInfo) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setLyricFont(fontInfo);\n });\n });\n }\n setLyricAdjustWidth(adjustNoteWidth) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setLyricAdjustWidth(adjustNoteWidth);\n });\n });\n }\n setChordAdjustWidth(adjustNoteWidth) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setChordAdjustWidth(adjustNoteWidth);\n });\n });\n }\n // ### updateLyricFont\n // Update the lyric font, which is the same for all lyrics.\n setChordFont(fontInfo) {\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.setChordFont(fontInfo);\n });\n });\n }\n tupletNotes(smoTuplet) {\n let tupletNotes = [];\n for (let i = smoTuplet.startIndex; i <= smoTuplet.endIndex; i++) {\n const note = this.voices[smoTuplet.voice].notes[i];\n tupletNotes.push(note);\n }\n return tupletNotes;\n }\n getStemDirectionForTuplet(smoTuplet) {\n let note = null;\n for (let currentNote of this.tupletNotes(smoTuplet)) {\n if (currentNote.noteType === 'n') {\n note = currentNote;\n break;\n }\n }\n if (!note) {\n return _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.down;\n }\n if (note.flagState !== _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.auto) {\n return note.flagState;\n }\n return _music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.pitchToLedgerLine(this.clef, note.pitches[0])\n >= 2 ? _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.up : _note__WEBPACK_IMPORTED_MODULE_3__.SmoNote.flagStates.down;\n }\n getNoteById(id) {\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n for (var j = 0; j < voice.notes.length; ++j) {\n const note = voice.notes[j];\n if (note.attrs.id === id) {\n return note;\n }\n }\n }\n return null;\n }\n setClef(clef) {\n const oldClef = this.clef;\n this.clef = clef;\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.clef = clef;\n });\n });\n }\n /**\n * Get the clef that this measure ends with.\n * @returns\n */\n getLastClef() {\n for (var i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n for (var j = 0; j < voice.notes.length; ++j) {\n const note = voice.notes[j];\n if (note.clefNote && note.clefNote.clef !== this.clef) {\n return note.clefNote.clef;\n }\n }\n }\n return this.clef;\n }\n isRest() {\n let i = 0;\n for (i = 0; i < this.voices.length; ++i) {\n const voice = this.voices[i];\n for (var j = 0; j < voice.notes.length; ++j) {\n if (!voice.notes[j].isRest()) {\n return false;\n }\n }\n }\n return true;\n }\n // ### populateVoice\n // Create a new voice in this measure, and populate it with the default note\n // for this measure/key/clef\n populateVoice(index) {\n if (index !== this.voices.length) {\n return;\n }\n this.voices.push({ notes: SmoMeasure.getDefaultNotes(this) });\n this.activeVoice = index;\n }\n _removeSingletonModifier(name) {\n const ar = this.modifiers.filter(obj => obj.attrs.type !== name);\n this.modifiers = ar;\n }\n addRehearsalMark(parameters) {\n this._removeSingletonModifier('SmoRehearsalMark');\n this.modifiers.push(new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRehearsalMark(parameters));\n }\n removeRehearsalMark() {\n this._removeSingletonModifier('SmoRehearsalMark');\n }\n getRehearsalMark() {\n return this.modifiers.find(obj => obj.attrs.type === 'SmoRehearsalMark');\n }\n getModifiersByType(type) {\n return this.modifiers.filter((mm) => type === mm.attrs.type);\n }\n setTempo(params) {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(params);\n }\n /**\n * Set measure tempo to the default {@link SmoTempoText}\n */\n resetTempo() {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n getTempo() {\n if (typeof (this.tempo) === 'undefined') {\n this.tempo = new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults);\n }\n return this.tempo;\n }\n /**\n * Measure text is deprecated, and may not be supported in the future.\n * Better to use SmoTextGroup and attach to the measure.\n * @param mod\n * @returns\n */\n addMeasureText(mod) {\n var exist = this.modifiers.filter((mm) => mm.attrs.id === mod.attrs.id);\n if (exist.length) {\n return;\n }\n this.modifiers.push(mod);\n }\n getMeasureText() {\n return this.modifiers.filter(obj => obj.ctor === 'SmoMeasureText');\n }\n removeMeasureText(id) {\n var ar = this.modifiers.filter(obj => obj.attrs.id !== id);\n this.modifiers = ar;\n }\n setRepeatSymbol(rs) {\n const ar = [];\n let toAdd = true;\n const exSymbol = this.getRepeatSymbol();\n if (exSymbol && exSymbol.symbol === rs.symbol) {\n toAdd = false;\n }\n // Adding 'None' means remove\n if (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['None']) {\n toAdd = false;\n }\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor !== 'SmoRepeatSymbol') {\n ar.push(modifier);\n }\n });\n this.modifiers = ar;\n if (toAdd) {\n ar.push(rs);\n }\n }\n getRepeatSymbol() {\n const rv = this.modifiers.filter(obj => obj.ctor === 'SmoRepeatSymbol');\n if (rv.length > 0) {\n return rv[0];\n }\n return null;\n }\n get isToDc() {\n const rs = this.getRepeatSymbol();\n if (rs &&\n (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['DcAlCoda'] ||\n rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['DcAlFine'])) {\n return true;\n }\n return false;\n }\n get isToDs() {\n const rs = this.getRepeatSymbol();\n if (rs &&\n (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['DsAlFine'] ||\n rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['DsAlCoda'])) {\n return true;\n }\n return false;\n }\n get isSegno() {\n const rs = this.getRepeatSymbol();\n if (rs &&\n (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['Segno'])) {\n return true;\n }\n return false;\n }\n get isCoda() {\n const rs = this.getRepeatSymbol();\n if (rs &&\n (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['Coda'])) {\n return true;\n }\n return false;\n }\n get isToCoda() {\n const rs = this.getRepeatSymbol();\n if (rs &&\n (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['toCoda'])) {\n return true;\n }\n return false;\n }\n get isFine() {\n const rs = this.getRepeatSymbol();\n if (rs &&\n (rs.symbol === _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoRepeatSymbol.symbols['Fine'])) {\n return true;\n }\n return false;\n }\n clearRepeatSymbols() {\n const ar = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor !== 'SmoRepeatSymbol') {\n ar.push(modifier);\n }\n });\n this.modifiers = ar;\n }\n setBarline(barline) {\n var ar = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoBarline') {\n const o = modifier;\n if (o.position !== barline.position) {\n ar.push(o);\n }\n }\n else {\n ar.push(modifier);\n }\n });\n this.modifiers = ar;\n ar.push(barline);\n }\n _getBarline(pos) {\n let rv = null;\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoBarline' && modifier.position === pos) {\n rv = modifier;\n }\n });\n if (rv === null) {\n return new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.defaults);\n }\n return rv;\n }\n getEndBarline() {\n return this._getBarline(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.end);\n }\n getStartBarline() {\n return this._getBarline(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoBarline.positions.start);\n }\n addNthEnding(ending) {\n const mods = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor !== 'SmoVolta' || modifier.startBar !== ending.startBar ||\n modifier.endBar !== ending.endBar) {\n mods.push(modifier);\n }\n });\n mods.push(ending);\n this.modifiers = mods;\n }\n removeNthEnding(ending) {\n const mods = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoVolta') {\n const volta = modifier;\n if (ending.startSelector === null || ending.endSelector === null || volta.startSelector === null || volta.endSelector === null) {\n return;\n }\n if (!_xform_selections__WEBPACK_IMPORTED_MODULE_9__.SmoSelector.sameMeasure(ending.startSelector, volta.startSelector) || !_xform_selections__WEBPACK_IMPORTED_MODULE_9__.SmoSelector.sameMeasure(ending.endSelector, volta.endSelector)\n && ending.number !== volta.number) {\n mods.push(modifier);\n }\n }\n else {\n mods.push(modifier);\n }\n });\n this.modifiers = mods;\n }\n getNthEndings() {\n const rv = [];\n this.modifiers.forEach((modifier) => {\n if (modifier.ctor === 'SmoVolta') {\n rv.push(modifier);\n }\n });\n return rv;\n }\n setKeySignature(sig) {\n this.keySignature = sig;\n this.voices.forEach((voice) => {\n voice.notes.forEach((note) => {\n note.keySignature = sig;\n });\n });\n }\n setMeasureNumber(num) {\n this.measureNumber = num;\n }\n getBeamGroupForNote(note) {\n let i = 0;\n let j = 0;\n for (i = 0; i < this.beamGroups.length; ++i) {\n const bg = this.beamGroups[i];\n for (j = 0; j < bg.notes.length; ++j) {\n if (bg.notes[j].attrs.id === note.attrs.id) {\n return bg;\n }\n }\n }\n return null;\n }\n}\nSmoMeasure.defaultDupleDuration = 4096;\nSmoMeasure.defaultTripleDuration = 2048 * 3;\n// @internal\nSmoMeasure._defaults = {\n timeSignature: SmoMeasure.timeSignatureDefault,\n keySignature: 'C',\n tupletTrees: [],\n transposeIndex: 0,\n modifiers: [],\n // bars: [1, 1], // follows enumeration in VF.Barline\n measureNumber: {\n localIndex: 0,\n systemIndex: 0,\n measureIndex: 0,\n staffId: 0\n },\n clef: 'treble',\n lines: 5,\n voices: [],\n format: new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoMeasureFormat.defaults),\n activeVoice: 0,\n tempo: new _measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText(_measureModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoTempoText.defaults),\n repeatSymbol: false,\n repeatCount: 0\n};\nSmoMeasure._emptyMeasureNoteType = 'r';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNSLE1BQU0sRUFBRSxFQUFFO0lBQ1YsTUFBTSxFQUFFLElBQUksK0RBQWdCLENBQUMsK0RBQWdCLENBQUMsUUFBUSxDQUFDO0lBQ3ZELFdBQVcsRUFBRSxDQUFDO0lBQ2QsS0FBSyxFQUFFLElBQUksMkRBQVksQ0FBQywyREFBWSxDQUFDLFFBQVEsQ0FBQztJQUM5QyxZQUFZLEVBQUUsS0FBSztJQUNuQixXQUFXLEVBQUUsQ0FBQztDQUNmO0FBa2lCTSxnQ0FBcUIsR0FBYSxHQUFHLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvc21vL2RhdGEvbWVhc3VyZS50cz9mOWNjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG4vKipcclxuICogQ29udGFpbnMgZGVmaW5pdGlvbiBhbmQgc3VwcG9ydGluZyBjbGFzc2VzIGZvciB7QGxpbmsgU21vTWVhc3VyZX0uXHJcbiAqIE1vc3Qgb2YgdGhlIGVuZ3JhdmluZyBpcyBkb25lIGF0IHRoZSBtZWFzdXJlIGxldmVsLiAgTWVhc3VyZSBjb250YWlucyBtdWx0aXBsZSAoYXQgbGVhc3QgMSlcclxuICogdm9pY2VzLCB3aGljaCBpbiB0dXJuIGNvbnRhaW4gbm90ZXMuICBFYWNoIG1lYXN1cmUgYWxzbyBjb250YWlucyBmb3JtYXR0aW5nIGluZm9ybWF0aW9uLiAgVGhpc1xyXG4gKiBpcyBtb3N0bHkgc2VyaWFsaXplZCBvdXRzaWRlIG9mIG1lYXN1cmUgKGluIHNjb3JlKSwgc2luY2UgY29sdW1ucyBhbmQgb2Z0ZW4gYW4gZW50aXJlIHJlZ2lvblxyXG4gKiBzaGFyZSBtZWFzdXJlIGZvcm1hdHRpbmcuICBNZWFzdXJlcyBhbHNvIGNvbnRhaW4gbW9kaWZpZXJzIGxpa2UgYmFybGluZXMuICBUdXBsZXRzIGFuZCBiZWFtIGdyb3Vwc1xyXG4gKiBhcmUgY29udGFpbmVkIGF0IHRoZSBtZWFzdXJlIGxldmVsLlxyXG4gKiBAbW9kdWxlIC9zbW8vZGF0YS9tZWFzdXJlXHJcbiAqL1xyXG5pbXBvcnQgeyBzbW9TZXJpYWxpemUgfSBmcm9tICcuLi8uLi9jb21tb24vc2VyaWFsaXphdGlvbkhlbHBlcnMnO1xyXG5pbXBvcnQgeyBTbW9NdXNpYyB9IGZyb20gJy4vbXVzaWMnO1xyXG5pbXBvcnQge1xyXG4gIFNtb0JhcmxpbmUsIFNtb01lYXN1cmVNb2RpZmllckJhc2UsIFNtb1JlcGVhdFN5bWJvbCwgU21vVGVtcG9UZXh0LCBTbW9NZWFzdXJlRm9ybWF0LFxyXG4gIFNtb1ZvbHRhLCBTbW9SZWhlYXJzYWxNYXJrUGFyYW1zLCBTbW9SZWhlYXJzYWxNYXJrLCBTbW9UZW1wb1RleHRQYXJhbXMsIFRpbWVTaWduYXR1cmUsXHJcbiAgVGltZVNpZ25hdHVyZVBhcmFtZXRlcnNTZXIsIFNtb01lYXN1cmVGb3JtYXRQYXJhbXNTZXIsIFNtb1RlbXBvVGV4dFBhcmFtc1NlclxyXG59IGZyb20gJy4vbWVhc3VyZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb05vdGUsIE5vdGVUeXBlLCBTbW9Ob3RlUGFyYW1zU2VyIH0gZnJvbSAnLi9ub3RlJztcclxuaW1wb3J0IHsgU21vVHVwbGV0LCBTbW9UdXBsZXRQYXJhbXNTZXIsIFNtb1R1cGxldFBhcmFtcywgU21vVHVwbGV0VHJlZVBhcmFtc1NlciwgU21vVHVwbGV0VHJlZSB9IGZyb20gJy4vdHVwbGV0JztcclxuaW1wb3J0IHsgbGF5b3V0RGVidWcgfSBmcm9tICcuLi8uLi9yZW5kZXIvc3VpL2xheW91dERlYnVnJztcclxuaW1wb3J0IHsgU3ZnSGVscGVycyB9IGZyb20gJy4uLy4uL3JlbmRlci9zdWkvc3ZnSGVscGVycyc7XHJcbmltcG9ydCB7IFRpY2tNYXAgfSBmcm9tICcuLi94Zm9ybS90aWNrTWFwJztcclxuaW1wb3J0IHsgTWVhc3VyZU51bWJlciwgU3ZnQm94LCBTbW9BdHRycywgUGl0Y2gsIFBpdGNoTGV0dGVyLCBDbGVmLCBcclxuICBUaWNrQWNjaWRlbnRhbCwgQWNjaWRlbnRhbEFycmF5LCBnZXRJZCB9IGZyb20gJy4vY29tbW9uJztcclxuaW1wb3J0IHsgU21vU2VsZWN0b3IgfSBmcm9tICcuLi94Zm9ybS9zZWxlY3Rpb25zJztcclxuaW1wb3J0IHsgRm9udEluZm8gfSBmcm9tICcuLi8uLi9jb21tb24vdmV4JztcclxuaW1wb3J0IHsgU21vVGFiU3RhdmUgfSBmcm9tICcuL3N0YWZmTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgU21vRnJldFBvc2l0aW9uIH0gZnJvbSAnLi9ub3RlTW9kaWZpZXJzJztcclxuLyoqXHJcbiAqIFZvaWNlIGlzIGp1c3QgYSBjb250YWluZXIgZm9yIHtAbGluayBTbW9Ob3RlfVxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb1ZvaWNlIHtcclxuICBub3RlczogU21vTm90ZVtdXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb1ZvaWNlU2VyIHtcclxuICBub3RlczogU21vTm90ZVBhcmFtc1NlcltdXHJcbn1cclxuLyoqXHJcbiAqIFRpY2tNYXBwYWJsZSBicmVha3MgdXAgYSBjaXJjdWxhciBkZXBlbmRlbmN5IG9uIG1vZGlmaWVyc1xyXG4gKiBsaWtlIEBTbW9EdXJhdGlvblxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRpY2tNYXBwYWJsZSB7XHJcbiAgdm9pY2VzOiBTbW9Wb2ljZVtdLFxyXG4gIGtleVNpZ25hdHVyZTogc3RyaW5nXHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVhc3VyZVRpY2sge1xyXG4gIHZvaWNlSW5kZXg6IG51bWJlcixcclxuICB0aWNrSW5kZXg6IG51bWJlclxyXG59XHJcblxyXG4vKipcclxuICogQnJlYWsgdXAgYSBjaXJjbGFyIGRlcGVuZGVuY3kgd2l0aCB7QGxpbmsgU21vQmVhbUdyb3VwfVxyXG4gKiBAY2F0ZWdvcnkgU21vT2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElTbW9CZWFtR3JvdXAge1xyXG4gIG5vdGVzOiBTbW9Ob3RlW10sXHJcbiAgc2Vjb25kYXJ5QmVhbUJyZWFrczogbnVtYmVyW10sXHJcbiAgdm9pY2U6IG51bWJlcixcclxuICBhdHRyczogU21vQXR0cnNcclxufVxyXG4vKipcclxuICogZ2VvbWV0cnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgbWVhc3VyZSBmb3IgcmVuZGVyaW5nIGFuZFxyXG4gKiBzY29yZSBsYXlvdXQuXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBNZWFzdXJlU3ZnIHtcclxuICBzdGFmZldpZHRoOiBudW1iZXIsXHJcbiAgdW5qdXN0aWZpZWRXaWR0aDogbnVtYmVyLFxyXG4gIGFkalg6IG51bWJlciwgLy8gVGhlIHN0YXJ0IHBvaW50IG9mIHRoZSBtdXNpYyBpbiB0aGUgc3RhdmUgKGFmdGVyIHRpbWUgc2lnLCBldGMpXHJcbiAgbWF4Q29sdW1uU3RhcnRYOiBudW1iZXIsXHJcbiAgc3RhZmZYOiBudW1iZXIsIC8vIFRoZSBsZWZ0LW1vc3QgeCBwb3NpdGlvbiBvZiB0aGUgc3RhZmZcclxuICBzdGFmZlk6IG51bWJlcixcclxuICBsb2dpY2FsQm94OiBTdmdCb3gsXHJcbiAgeVRvcDogbnVtYmVyLFxyXG4gIGFkalJpZ2h0OiBudW1iZXIsXHJcbiAgaGlzdG9yeTogc3RyaW5nW10sXHJcbiAgbGluZUluZGV4OiBudW1iZXIsXHJcbiAgcGFnZUluZGV4OiBudW1iZXIsXHJcbiAgcm93SW5TeXN0ZW06IG51bWJlcixcclxuICBmb3JjZUNsZWY6IGJvb2xlYW4sXHJcbiAgZm9yY2VLZXlTaWduYXR1cmU6IGJvb2xlYW4sXHJcbiAgZm9yY2VUaW1lU2lnbmF0dXJlOiBib29sZWFuLFxyXG4gIGZvcmNlVGVtcG86IGJvb2xlYW4sXHJcbiAgaGlkZUVtcHR5TWVhc3VyZTogYm9vbGVhbixcclxuICBoaWRlTXVsdGltZWFzdXJlOiBib29sZWFuLFxyXG4gIG11bHRpbWVhc3VyZUxlbmd0aDogbnVtYmVyLFxyXG4gIG11bHRpbWVhc3VyZUVuZEJhcmxpbmU6IG51bWJlcixcclxuICBlbGVtZW50OiBTVkdTVkdFbGVtZW50IHwgbnVsbCxcclxuICB0YWJTdGF2ZUJveD86IFN2Z0JveCxcclxuICB0YWJFbGVtZW50PzogU1ZHU1ZHRWxlbWVudFxyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciBhICB7QGxpbmsgVGlja01hcH0gZm9yIGVhY2ggdm9pY2VcclxuICogZm9yIGZvcm1hdHRpbmdcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBNZWFzdXJlVGlja21hcHMge1xyXG4gIHRpY2ttYXBzOiBUaWNrTWFwW10sXHJcbiAgYWNjaWRlbnRhbE1hcDogUmVjb3JkPHN0cmluZyB8IG51bWJlciwgUmVjb3JkPHN0cmluZywgVGlja0FjY2lkZW50YWw+PixcclxuICBhY2NpZGVudGFsQXJyYXk6IEFjY2lkZW50YWxBcnJheVtdXHJcbn1cclxuLyoqXHJcbiAqIENvbHVtbi1tYXBwZWQgbW9kaWZpZXJzLCBtYW5hZ2VkIGJ5IHRoZSB7QGxpbmsgU21vU2NvcmV9XHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uTWFwcGVkUGFyYW1zIHtcclxuICAvLyBbJ3RpbWVTaWduYXR1cmUnLCAna2V5U2lnbmF0dXJlJywgJ3RlbXBvJ11cclxuICB0aW1lU2lnbmF0dXJlOiBhbnksXHJcbiAga2V5U2lnbmF0dXJlOiBzdHJpbmcsXHJcbiAgdGVtcG86IGFueVxyXG59XHJcbi8vIEBpbnRlcm5hbFxyXG5leHBvcnQgdHlwZSBTbW9NZWFzdXJlTnVtYmVyUGFyYW0gPSAndHJhbnNwb3NlSW5kZXgnIHwgJ2FjdGl2ZVZvaWNlJyB8ICdsaW5lcycgfCAncmVwZWF0Q291bnQnO1xyXG4vLyBAaW50ZXJuYWxcclxuZXhwb3J0IGNvbnN0IFNtb01lYXN1cmVOdW1iZXJQYXJhbXM6IFNtb01lYXN1cmVOdW1iZXJQYXJhbVtdID0gWyd0cmFuc3Bvc2VJbmRleCcsICdhY3RpdmVWb2ljZScsICdsaW5lcycsICdyZXBlYXRDb3VudCddO1xyXG4vLyBAaW50ZXJuYWxcclxuZXhwb3J0IHR5cGUgU21vTWVhc3VyZVN0cmluZ1BhcmFtID0gJ2tleVNpZ25hdHVyZSc7XHJcbi8vIEBpbnRlcm5hbFxyXG5leHBvcnQgY29uc3QgU21vTWVhc3VyZVN0cmluZ1BhcmFtczogU21vTWVhc3VyZVN0cmluZ1BhcmFtW10gPSBbJ2tleVNpZ25hdHVyZSddO1xyXG4vKipcclxuICogY29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3IgYSB7QGxpbmsgU21vTWVhc3VyZX0uICBVc3VhbGx5IHlvdSB3aWxsIGNhbGxcclxuICoge0BsaW5rIFNtb01lYXN1cmUuZGVmYXVsdHN9LCBhbmQgbW9kaWZ5IHRoZSBwYXJhbWV0ZXJzIHlvdSBuZWVkIHRvIGNoYW5nZS5cclxuICpcclxuICogQHBhcmFtIHRpbWVTaWduYXR1cmVcclxuICogQHBhcmFtIGtleVNpZ25hdHVyZVxyXG4gKiBAcGFyYW0gdHVwbGV0c1xyXG4gKiBAcGFyYW0gdHJhbnNwb3NlSW5kZXggY2FsY3VsYXRlZCBmcm9tIHtAbGluayBTbW9QYXJ0SW5mb30gZm9yIG5vbi1jb25jZXJ0LWtleSBpbnN0cnVtZW50c1xyXG4gKiBAcGFyYW0gbGluZXMgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBzdGF2ZVxyXG4gKiBAcGFyYW0gc3RhZmZZIFkgY29vcmRpbmF0ZSAoVUwgY29ybmVyKSBvZiB0aGUgbWVhc3VyZSBzdGF2ZVxyXG4gKiBAcGFyYW0gbWVhc3VyZU51bWJlciBjb21iaW5hdGlvbiBjb25maWd1cmVkL2NhbGN1bGF0ZWQgbWVhc3VyZSBudW1iZXJcclxuICogQHBhcmFtIGNsZWZcclxuICogQHBhcmFtIHZvaWNlc1xyXG4gKiBAcGFyYW0gYWN0aXZlVm9pY2UgdGhlIGFjdGl2ZSB2b2ljZSBpbiB0aGUgZWRpdG9yXHJcbiAqIEBwYXJhbSB0ZW1wb1xyXG4gKiBAcGFyYW0gZm9ybWF0IG1lYXN1cmUgZm9ybWF0LCBpcyBtYW5hZ2VkIGJ5IHRoZSBzY29yZVxyXG4gKiBAcGFyYW0gbW9kaWZpZXJzIEFsbCBtZWFzdXJlIG1vZGlmaWVycyB0aGF0NSBhcmVuJ3QgZm9ybWF0LCB0aW1lU2lnbmF0dXJlIG9yIHRlbXBvXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vTWVhc3VyZVBhcmFtcyB7XHJcbiAgdGltZVNpZ25hdHVyZTogVGltZVNpZ25hdHVyZSxcclxuICBrZXlTaWduYXR1cmU6IHN0cmluZyxcclxuICB0dXBsZXRUcmVlczogU21vVHVwbGV0VHJlZVtdLFxyXG4gIHRyYW5zcG9zZUluZGV4OiBudW1iZXIsXHJcbiAgbGluZXM6IG51bWJlcixcclxuICAvLyBiYXJzOiBbMSwgMV0sIC8vIGZvbGxvd3MgZW51bWVyYXRpb24gaW4gVkYuQmFybGluZVxyXG4gIG1lYXN1cmVOdW1iZXI6IE1lYXN1cmVOdW1iZXIsXHJcbiAgY2xlZjogQ2xlZixcclxuICB2b2ljZXM6IFNtb1ZvaWNlW10sXHJcbiAgYWN0aXZlVm9pY2U6IG51bWJlcixcclxuICB0ZW1wbzogU21vVGVtcG9UZXh0LFxyXG4gIGZvcm1hdDogU21vTWVhc3VyZUZvcm1hdCB8IG51bGwsXHJcbiAgbW9kaWZpZXJzOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlW10sXHJcbiAgcmVwZWF0U3ltYm9sOiBib29sZWFuLFxyXG4gIHJlcGVhdENvdW50OiBudW1iZXJcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBzZXJpYWxpemVhYmxlIGJpdHMgb2YgU21vTWVhc3VyZS4gIFNvbWUgcGFyYW1ldGVycyBhcmUgXHJcbiAqIG1hcHBlZCBieSB0aGUgc3RhdmUgaWYgdGhlIGRvbid0IGNoYW5nZSBldmVyeSBtZWFzdXJlLCBlLmcuXHJcbiAqIHRpbWUgc2lnbmF0dXJlLlxyXG4gKiBAY2F0ZWdvcnkgc2VyaWFsaXphdGlvblxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9NZWFzdXJlUGFyYW1zU2VyIHtcclxuICAvKipcclxuICAgKiBjb25zdHJ1Y3RvclxyXG4gICAqL1xyXG4gIGN0b3I6IHN0cmluZyxcclxuICAvKipcclxuICAgKiBhIGxpc3Qgb2YgdHVwbGV0cyAoc2VyaWFsaXplZClcclxuICAgKi9cclxuICB0dXBsZXRUcmVlczogU21vVHVwbGV0VHJlZVBhcmFtc1NlcltdLFxyXG4gIC8qKlxyXG4gICAqIHRyYW5zcG9zZSB0aGUgbm90ZXMgdXAvZG93bi4gIFRPRE86IHRoaXMgc2hvdWxkIG5vdCBiZSBzZXJpYWxpemVkXHJcbiAgICogYXMgaXRzIHBhcnQgb2YgdGhlIGluc3RydW1lbnQgcGFyYW1ldGVyc1xyXG4gICAqL1xyXG4gIHRyYW5zcG9zZUluZGV4OiBudW1iZXIsXHJcbiAgLyoqXHJcbiAgICogbGluZXMgaW4gdGhlIHN0YWZmIChlLmcuIHBlcmN1c3Npb24pXHJcbiAgICovXHJcbiAgbGluZXM6IG51bWJlcixcclxuICAvKipcclxuICAgKiBtZWFzdXJlIG51bWJlciwgYWJzb2x1dGUgYW5kIHJlbGF0aXZlL3JlbWFwcGVkXHJcbiAgICovXHJcbiAgbWVhc3VyZU51bWJlcjogTWVhc3VyZU51bWJlcixcclxuICAvKipcclxuICAgKiBzdGFydCBjbGVmXHJcbiAgICovXHJcbiAgY2xlZjogQ2xlZixcclxuICAvKipcclxuICAgKiB2b2ljZXMgY29udGFpbiBub3Rlc1xyXG4gICAqL1xyXG4gIHZvaWNlczogU21vVm9pY2VTZXJbXSxcclxuICAvKipcclxuICAgKiBhbGwgb3RoZXIgbW9kaWZpZXJzIChiYXJsaW5lcywgZXRjKVxyXG4gICAqL1xyXG4gIG1vZGlmaWVyczogU21vTWVhc3VyZU1vZGlmaWVyQmFzZVtdLFxyXG4gIC8vIHRoZSBuZXh0IDMgYXJlIG5vdCBzZXJpYWxpemVkIGFzIHBhcnQgb2YgdGhlIG1lYXN1cmUgaW4gbW9zdCBjYXNlcywgc2luY2UgdGhleSBhcmVcclxuICAvLyBtYXBwZWQgdG8gc3BlY2lmaWMgbWVhc3VyZXMgaW4gdGhlIHNjb3JlL3N5c3RlbVxyXG4gIC8qKlxyXG4gICAqIGtleSBzaWduYXR1cmVcclxuICAgKi9cclxuICBrZXlTaWduYXR1cmU/OiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgKiB0aW1lIHNpZ25hdHVyZSBzZXJpYWxpemF0aW9uXHJcbiAgKi9cclxuICB0aW1lU2lnbmF0dXJlPzogVGltZVNpZ25hdHVyZVBhcmFtZXRlcnNTZXIsXHJcbiAgLyoqXHJcbiAgICogdGVtcG8gYXQgdGhpcyBwb2ludFxyXG4gICAqL1xyXG4gIHRlbXBvOiBTbW9UZW1wb1RleHRQYXJhbXNTZXJcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPbmx5IGFycmF5cyBhbmQgbWVhc3VyZSBudW1iZXJzIGFyZSBzZXJpbGlhbGl6ZWQgd2l0aCBkZWZhdWx0IHZhbHVlcy5cclxuICogQHBhcmFtIHBhcmFtcyAtIHJlc3VsdCBvZiBzZXJpYWxpemF0aW9uXHJcbiAqIEByZXR1cm5zIFxyXG4gKi9cclxuZnVuY3Rpb24gaXNTbW9NZWFzdXJlUGFyYW1zU2VyKHBhcmFtczogUGFydGlhbDxTbW9NZWFzdXJlUGFyYW1zU2VyPik6cGFyYW1zIGlzIFNtb01lYXN1cmVQYXJhbXNTZXIge1xyXG4gIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMudm9pY2VzKSB8fCBcclxuICAgICAgIUFycmF5LmlzQXJyYXkocGFyYW1zLnR1cGxldFRyZWVzKSB8fCAhQXJyYXkuaXNBcnJheShwYXJhbXMubW9kaWZpZXJzKSB8fFxyXG4gICAgICB0eXBlb2YocGFyYW1zPy5tZWFzdXJlTnVtYmVyPy5tZWFzdXJlSW5kZXgpICE9PSAnbnVtYmVyJykge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgcmV0dXJuIHRydWU7XHJcbn1cclxuLyoqXHJcbiAqIERhdGEgZm9yIGEgbWVhc3VyZSBvZiBtdXNpYy4gIE1hbnkgcnVsZXMgb2YgbXVzaWNhbCBlbmdyYXZpbmcgYXJlXHJcbiAqIGVuZm9yY2VkIGF0IGEgbWVhc3VyZSBsZXZlbDogdGhlIGR1cmF0aW9uIG9mIG5vdGVzLCBhY2NpZGVudGFscywgZXRjLlxyXG4gKiBcclxuICogTWVhc3VyZXMgY29udGFpbiB7QGxpbmsgU21vTm90ZX0sIHtAbGluayBTbW9UdXBsZXR9LCBhbmQge0BsaW5rIFNtb0JlYW1Hcm91cH1cclxuICogTWVhc3VyZXMgYXJlIGNvbnRhaW5lZCBpbiB7QGxpbmsgU21vU3lzdGVtU3RhZmZ9XHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTbW9NZWFzdXJlIGltcGxlbWVudHMgU21vTWVhc3VyZVBhcmFtcywgVGlja01hcHBhYmxlIHtcclxuICBzdGF0aWMgZ2V0IHRpbWVTaWduYXR1cmVEZWZhdWx0KCk6IFRpbWVTaWduYXR1cmUge1xyXG4gICAgcmV0dXJuIG5ldyBUaW1lU2lnbmF0dXJlKFRpbWVTaWduYXR1cmUuZGVmYXVsdHMpO1xyXG4gIH1cclxuICBzdGF0aWMgZGVmYXVsdER1cGxlRHVyYXRpb246IG51bWJlciA9IDQwOTY7XHJcbiAgc3RhdGljIGRlZmF1bHRUcmlwbGVEdXJhdGlvbjogbnVtYmVyID0gMjA0OCAqIDM7XHJcbiAgLy8gQGludGVybmFsXHJcbiAgc3RhdGljIHJlYWRvbmx5IF9kZWZhdWx0czogU21vTWVhc3VyZVBhcmFtcyA9IHtcclxuICAgIHRpbWVTaWduYXR1cmU6IFNtb01lYXN1cmUudGltZVNpZ25hdHVyZURlZmF1bHQsXHJcbiAgICBrZXlTaWduYXR1cmU6ICdDJyxcclxuICAgIHR1cGxldFRyZWVzOiBbXSxcclxuICAgIHRyYW5zcG9zZUluZGV4OiAwLFxyXG4gICAgbW9kaWZpZXJzOiBbXSxcclxuICAgIC8vIGJhcnM6IFsxLCAxXSwgLy8gZm9sbG93cyBlbnVtZXJhdGlvbiBpbiBWRi5CYXJsaW5lXHJcbiAgICBtZWFzdXJlTnVtYmVyOiB7XHJcbiAgICAgIGxvY2FsSW5kZXg6IDAsXHJcbiAgICAgIHN5c3RlbUluZGV4OiAwLFxyXG4gICAgICBtZWFzdXJlSW5kZXg6IDAsXHJcbiAgICAgIHN0YWZmSWQ6IDBcclxuICAgIH0sXHJcbiAgICBjbGVmOiAndHJlYmxlJyxcclxuICAgIGxpbmVzOiA1LFxyXG4gICAgdm9pY2VzOiBbXSxcclxuICAgIGZvcm1hdDogbmV3IFNtb01lYXN1cmVGb3JtYXQoU21vTWVhc3VyZUZvcm1hdC5kZWZhdWx0cyksXHJcbiAgICBhY3RpdmVWb2ljZTogMCxcclxuICAgIHRlbXBvOiBuZXcgU21vVGVtcG9UZXh0KFNtb1RlbXBvVGV4dC5kZWZhdWx0cyksXHJcbiAgICByZXBlYXRTeW1ib2w6IGZhbHNlLFxyXG4gICAgcmVwZWF0Q291bnQ6IDAgIFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLiAgRGVmYXVsdHMgYXJlIGFsd2F5cyBjb3BpZWQgc28gdGhlXHJcbiAgICogY2FsbGVyIGNhbiBtb2RpZnkgdGhlbSB0byBjcmVhdGUgYSBuZXcgbWVhc3VyZS5cclxuICAgKiBAcmV0dXJucyBjb25zdHJ1Y3RvciBwYXJhbXMgZm9yIGEgbmV3IG1lYXN1cmVcclxuICAgKi9cclxuICBzdGF0aWMgZ2V0IGRlZmF1bHRzKCk6IFNtb01lYXN1cmVQYXJhbXMge1xyXG4gICAgY29uc3QgcHJvdG86IGFueSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoU21vTWVhc3VyZS5fZGVmYXVsdHMpKTtcclxuICAgIHByb3RvLmZvcm1hdCA9IG5ldyBTbW9NZWFzdXJlRm9ybWF0KFNtb01lYXN1cmVGb3JtYXQuZGVmYXVsdHMpO1xyXG4gICAgcHJvdG8udGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KFNtb1RlbXBvVGV4dC5kZWZhdWx0cyk7XHJcbiAgICBwcm90by5tb2RpZmllcnMucHVzaChuZXcgU21vQmFybGluZSh7XHJcbiAgICAgIHBvc2l0aW9uOiBTbW9CYXJsaW5lLnBvc2l0aW9ucy5zdGFydCxcclxuICAgICAgYmFybGluZTogU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXJcclxuICAgIH0pKTtcclxuICAgIHByb3RvLm1vZGlmaWVycy5wdXNoKG5ldyBTbW9CYXJsaW5lKHtcclxuICAgICAgcG9zaXRpb246IFNtb0JhcmxpbmUucG9zaXRpb25zLmVuZCxcclxuICAgICAgYmFybGluZTogU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXJcclxuICAgIH0pKTtcclxuICAgIHJldHVybiBwcm90bztcclxuICB9XHJcbiAgLy8gQGlnbm9yZVxyXG4gIHN0YXRpYyBjb252ZXJ0TGVnYWN5VGltZVNpZ25hdHVyZSh0czogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBydiA9IG5ldyBUaW1lU2lnbmF0dXJlKFRpbWVTaWduYXR1cmUuZGVmYXVsdHMpO1xyXG4gICAgcnYudGltZVNpZ25hdHVyZSA9IHRzO1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICB0aW1lU2lnbmF0dXJlOiBUaW1lU2lnbmF0dXJlID0gU21vTWVhc3VyZS50aW1lU2lnbmF0dXJlRGVmYXVsdDtcclxuICAvKipcclxuICAgKiBPdmVycmlkZXMgZGlzcGxheSBvZiBhY3R1YWwgdGltZSBzaWduYXR1cmUsIGluIHRoZSBjYXNlIG9mXHJcbiAgICogcGljay11cCBub3RlcyB3aGVyZSB0aGUgYWN0dWFsIGFuZCBkaXNwbGF5ZWQgZHVyYXRpb25zIGFyZSBkaWZmZXJlbnRcclxuICAgKi9cclxuICBrZXlTaWduYXR1cmU6IHN0cmluZyA9ICcnO1xyXG4gIGNhbmNlbGVkS2V5U2lnbmF0dXJlOiBzdHJpbmcgPSAnJztcclxuICB0dXBsZXRUcmVlczogU21vVHVwbGV0VHJlZVtdID0gW107XHJcbiAgcmVwZWF0U3ltYm9sOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcmVwZWF0Q291bnQ6IG51bWJlciA9IDA7XHJcbiAgY3Rvcjogc3RyaW5nPSdTbW9NZWFzdXJlJztcclxuICAvKipcclxuICAgKiBBZGp1c3QgZm9yIG5vbi1jb25jZXJ0IHBpdGNoIGludHN0cnVtZW50c1xyXG4gICAqL1xyXG4gIHRyYW5zcG9zZUluZGV4OiBudW1iZXIgPSAwO1xyXG4gIG1vZGlmaWVyczogU21vTWVhc3VyZU1vZGlmaWVyQmFzZVtdID0gW107XHJcbiAgLyoqXHJcbiAgICogUm93LCBjb2x1bW4sIGFuZCBjdXN0b20gbnVtYmVyaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWVhc3VyZS5cclxuICAgKi9cclxuICBtZWFzdXJlTnVtYmVyOiBNZWFzdXJlTnVtYmVyID0ge1xyXG4gICAgbG9jYWxJbmRleDogMCxcclxuICAgIHN5c3RlbUluZGV4OiAwLFxyXG4gICAgbWVhc3VyZUluZGV4OiAwLFxyXG4gICAgc3RhZmZJZDogMFxyXG4gIH07XHJcbiAgY2xlZjogQ2xlZiA9ICd0cmVibGUnO1xyXG4gIHZvaWNlczogU21vVm9pY2VbXSA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIHRoZSBhY3RpdmUgdm9pY2UgaW4gdGhlIGVkaXRvciwgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHZvaWNlc1xyXG4gICAqICAqL1xyXG4gIGFjdGl2ZVZvaWNlOiBudW1iZXIgPSAwO1xyXG4gIHRlbXBvOiBTbW9UZW1wb1RleHQ7XHJcbiAgYmVhbUdyb3VwczogSVNtb0JlYW1Hcm91cFtdID0gW107XHJcbiAgbGluZXM6IG51bWJlciA9IDU7XHJcbiAgLyoqXHJcbiAgICogUnVudGltZSBpbmZvcm1hdGlvbiBhYm91dCByZW5kZXJpbmdcclxuICAgKi9cclxuICBzdmc6IE1lYXN1cmVTdmc7XHJcbiAgLyoqXHJcbiAgICogTWVhc3VyZS1zcGVjaWZpYyBmb3JtYXR0aW5nIHBhcmFtZXRlcnMuXHJcbiAgICovXHJcbiAgZm9ybWF0OiBTbW9NZWFzdXJlRm9ybWF0O1xyXG4gIC8qKlxyXG4gICAqIEluZm9ybWF0aW9uIGZvciBpZGVudGlmeWluZyB0aGlzIG9iamVjdFxyXG4gICAqL1xyXG4gIGlkOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbGwgaW4gY29tcG9uZW50cy4gIFdlIGFzc3VtZSB0aGUgbW9kaWZpZXJzIGFyZSBhbHJlYWR5IGNvbnN0cnVjdGVkLFxyXG4gICAqIGUuZy4gYnkgZGVzZXJpYWxpemUgb3IgdGhlIGNhbGxpbmcgZnVuY3Rpb24uXHJcbiAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHBhcmFtczogU21vTWVhc3VyZVBhcmFtcykge1xyXG4gICAgdGhpcy50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQoU21vVGVtcG9UZXh0LmRlZmF1bHRzKTtcclxuICAgIHRoaXMuc3ZnID0ge1xyXG4gICAgICBzdGFmZldpZHRoOiAwLFxyXG4gICAgICB1bmp1c3RpZmllZFdpZHRoOiAwLFxyXG4gICAgICBzdGFmZlg6IDAsXHJcbiAgICAgIHN0YWZmWTogMCxcclxuICAgICAgbG9naWNhbEJveDoge1xyXG4gICAgICAgIHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDBcclxuICAgICAgfSxcclxuICAgICAgeVRvcDogMCxcclxuICAgICAgYWRqWDogMCxcclxuICAgICAgbWF4Q29sdW1uU3RhcnRYOiAwLFxyXG4gICAgICBhZGpSaWdodDogMCxcclxuICAgICAgaGlzdG9yeTogW10sXHJcbiAgICAgIGxpbmVJbmRleDogMCxcclxuICAgICAgcGFnZUluZGV4OiAwLFxyXG4gICAgICByb3dJblN5c3RlbTogMCxcclxuICAgICAgZm9yY2VDbGVmOiBmYWxzZSxcclxuICAgICAgZm9yY2VLZXlTaWduYXR1cmU6IGZhbHNlLFxyXG4gICAgICBmb3JjZVRpbWVTaWduYXR1cmU6IGZhbHNlLFxyXG4gICAgICBmb3JjZVRlbXBvOiBmYWxzZSxcclxuICAgICAgaGlkZUVtcHR5TWVhc3VyZTogZmFsc2UsXHJcbiAgICAgIGhpZGVNdWx0aW1lYXN1cmU6IGZhbHNlLFxyXG4gICAgICBtdWx0aW1lYXN1cmVMZW5ndGg6IDAsXHJcbiAgICAgIG11bHRpbWVhc3VyZUVuZEJhcmxpbmU6IFNtb0JhcmxpbmUuYmFybGluZXNbJ3NpbmdsZUJhciddLFxyXG4gICAgICBlbGVtZW50OiBudWxsXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGRlZmF1bHRzID0gU21vTWVhc3VyZS5kZWZhdWx0cztcclxuICAgIFNtb01lYXN1cmVOdW1iZXJQYXJhbXMuZm9yRWFjaCgocGFyYW0pID0+IHtcclxuICAgICAgaWYgKHR5cGVvZiAocGFyYW1zW3BhcmFtXSkgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdGhpc1twYXJhbV0gPSBwYXJhbXNbcGFyYW1dO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIFNtb01lYXN1cmVTdHJpbmdQYXJhbXMuZm9yRWFjaCgocGFyYW0pID0+IHtcclxuICAgICAgdGhpc1twYXJhbV0gPSBwYXJhbXNbcGFyYW1dID8gcGFyYW1zW3BhcmFtXSA6IGRlZmF1bHRzW3BhcmFtXTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5jbGVmID0gcGFyYW1zLmNsZWY7XHJcbiAgICB0aGlzLnJlcGVhdFN5bWJvbCA9IHBhcmFtcy5yZXBlYXRTeW1ib2w7XHJcbiAgICB0aGlzLm1lYXN1cmVOdW1iZXIgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBhcmFtcy5tZWFzdXJlTnVtYmVyKSk7XHJcbiAgICBpZiAocGFyYW1zLnRlbXBvKSB7XHJcbiAgICAgIHRoaXMudGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KHBhcmFtcy50ZW1wbyk7XHJcbiAgICB9XHJcbiAgICAvLyBIYW5kbGUgbGVnYWN5IHRpbWUgc2lnbmF0dXJlIGZvcm1hdFxyXG4gICAgaWYgKHBhcmFtcy50aW1lU2lnbmF0dXJlKSB7XHJcbiAgICAgIGNvbnN0IHRzQW55ID0gcGFyYW1zLnRpbWVTaWduYXR1cmUgYXMgYW55O1xyXG4gICAgICBpZiAodHlwZW9mICh0c0FueSkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgdGhpcy50aW1lU2lnbmF0dXJlID0gU21vTWVhc3VyZS5jb252ZXJ0TGVnYWN5VGltZVNpZ25hdHVyZSh0c0FueSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50aW1lU2lnbmF0dXJlID0gVGltZVNpZ25hdHVyZS5jcmVhdGVGcm9tUGFydGlhbCh0c0FueSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMudm9pY2VzID0gcGFyYW1zLnZvaWNlcyA/IHBhcmFtcy52b2ljZXMgOiBbXTtcclxuICAgIHRoaXMudHVwbGV0VHJlZXMgPSBwYXJhbXMudHVwbGV0VHJlZXMgPyBwYXJhbXMudHVwbGV0VHJlZXMgOiBbXTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gcGFyYW1zLm1vZGlmaWVycyA/IHBhcmFtcy5tb2RpZmllcnMgOiBkZWZhdWx0cy5tb2RpZmllcnM7XHJcbiAgICB0aGlzLnNldERlZmF1bHRCYXJsaW5lcygpO1xyXG4gICAgdGhpcy5rZXlTaWduYXR1cmUgPSBTbW9NdXNpYy52ZXhLZXlTaWdXaXRoT2Zmc2V0KHRoaXMua2V5U2lnbmF0dXJlLCB0aGlzLnRyYW5zcG9zZUluZGV4KTtcclxuXHJcbiAgICBpZiAoIShwYXJhbXMuZm9ybWF0KSkge1xyXG4gICAgICB0aGlzLmZvcm1hdCA9IG5ldyBTbW9NZWFzdXJlRm9ybWF0KFNtb01lYXN1cmVGb3JtYXQuZGVmYXVsdHMpO1xyXG4gICAgICB0aGlzLmZvcm1hdC5tZWFzdXJlSW5kZXggPSB0aGlzLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtYXQgPSBuZXcgU21vTWVhc3VyZUZvcm1hdChwYXJhbXMuZm9ybWF0KTtcclxuICAgIH1cclxuICAgIHRoaXMuaWQgPSBnZXRJZCgpLnRvU3RyaW5nKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUNsZWZDaGFuZ2VOb3RlcygpO1xyXG4gIH1cclxuXHJcbiAgLy8gQGludGVybmFsXHJcbiAgLy8gdXNlZCBmb3Igc2VyaWFsaXphdGlvblxyXG4gIHN0YXRpYyBnZXQgZGVmYXVsdEF0dHJpYnV0ZXMoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAna2V5U2lnbmF0dXJlJywgXHJcbiAgICAgICdtZWFzdXJlTnVtYmVyJyxcclxuICAgICAgJ2FjdGl2ZVZvaWNlJywgJ2NsZWYnLCAndHJhbnNwb3NlSW5kZXgnLFxyXG4gICAgICAnZm9ybWF0JywgJ3JpZ2h0TWFyZ2luJywgJ2xpbmVzJywgJ3JlcGVhdFN5bWJvbCcsICdyZXBlYXRDb3VudCdcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICAvLyBAaW50ZXJuYWxcclxuICAvLyB1c2VkIGZvciBzZXJpYWxpemF0aW9uXHJcbiAgc3RhdGljIGdldCBmb3JtYXR0aW5nT3B0aW9ucygpIHtcclxuICAgIHJldHVybiBbJ2N1c3RvbVN0cmV0Y2gnLCAnY3VzdG9tUHJvcG9ydGlvbicsICdhdXRvSnVzdGlmeScsICdzeXN0ZW1CcmVhaycsXHJcbiAgICAgICdwYWdlQnJlYWsnLCAncGFkTGVmdCddO1xyXG4gIH1cclxuICAvLyBAaW50ZXJuYWxcclxuICAvLyB1c2VkIGZvciBzZXJpYWxpemF0aW9uXHJcbiAgc3RhdGljIGdldCBjb2x1bW5NYXBwZWRBdHRyaWJ1dGVzKCkge1xyXG4gICAgcmV0dXJuIFsndGltZVNpZ25hdHVyZScsICdrZXlTaWduYXR1cmUnLCAndGVtcG8nXTtcclxuICB9XHJcbiAgc3RhdGljIGdldCBzZXJpYWxpemFibGVBdHRyaWJ1dGVzKCkge1xyXG4gICAgY29uc3QgcnY6IGFueSA9IFtdO1xyXG4gICAgU21vTWVhc3VyZS5kZWZhdWx0QXR0cmlidXRlcy5mb3JFYWNoKChhdHRyKSA9PiB7XHJcbiAgICAgIGlmIChTbW9NZWFzdXJlLmNvbHVtbk1hcHBlZEF0dHJpYnV0ZXMuaW5kZXhPZihhdHRyKSA8IDAgJiYgYXR0ciAhPT0gJ2Zvcm1hdCcpIHtcclxuICAgICAgICBydi5wdXNoKGF0dHIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgLyoqXHJcbiAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIHRpbWUgc2lnbmF0dXJlcyBhcmUgdGhlIHNhbWUsIGZvciBkaXNwbGF5IHB1cnBvc2VzIChlLmcuIGlmIGEgdGltZSBzaWcgY2hhbmdlXHJcbiAgLy8gaXMgcmVxdWlyZWQpXHJcbiAgKi9cclxuICBzdGF0aWMgdGltZVNpZ0VxdWFsKG8xOiBUaW1lU2lnbmF0dXJlLCBvMjogVGltZVNpZ25hdHVyZSkge1xyXG4gICAgcmV0dXJuIG8xLnRpbWVTaWduYXR1cmUgPT09IG8yLnRpbWVTaWduYXR1cmUgJiYgbzEudXNlU3ltYm9sID09PSBvMi51c2VTeW1ib2w7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIElmIHRoZXJlIGlzIGEgY2xlZiBjaGFuZ2UgbWlkLW1lYXN1cmUsIHVwZGF0ZSB0aGUgYWN0dWFsIGNsZWZzIG9mIHRoZSBub3Rlc1xyXG4gICAqIHNvIHRoZXkgZGlzcGxheSBjb3JyZWN0bHkuXHJcbiAgICovXHJcbiAgdXBkYXRlQ2xlZkNoYW5nZU5vdGVzKCkge1xyXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcclxuICAgIGxldCBjdXJUaWNrID0gMDtcclxuICAgIGxldCBjbGVmQ2hhbmdlID0gdGhpcy5jbGVmO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB2b2ljZSA9IHRoaXMudm9pY2VzW2ldO1xyXG4gICAgICBjdXJUaWNrICA9IDA7XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBjb25zdCBzbW9Ob3RlID0gdm9pY2Uubm90ZXNbal07XHJcbiAgICAgICAgc21vTm90ZS5jbGVmID0gdGhpcy5jbGVmO1xyXG4gICAgICAgIGlmIChzbW9Ob3RlLmNsZWZOb3RlICYmIHNtb05vdGUuY2xlZk5vdGUuY2xlZiAhPT0gdGhpcy5jbGVmKSB7XHJcbiAgICAgICAgICBjbGVmQ2hhbmdlID0gc21vTm90ZS5jbGVmTm90ZS5jbGVmO1xyXG4gICAgICAgICAgY3VyVGljayArPSBzbW9Ob3RlLnRpY2tDb3VudDtcclxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN1clRpY2sgICs9IHNtb05vdGUudGlja0NvdW50O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjaGFuZ2VkKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghY2hhbmdlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBjbGVmQ2hhbmdlVGljayBpcyB3aGVyZSB0aGUgY2hhbmdlIGdvZXMuICBXZSBvbmx5IHN1cHBvcnRcclxuICAgIC8vIG9uZSBwZXIgbWVhc3VyZSwgb3RoZXJzIGFyZSBpZ25vcmVkLlxyXG4gICAgY29uc3QgY2xlZkNoYW5nZVRpY2sgPSBjdXJUaWNrO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgdm9pY2UgPSB0aGlzLnZvaWNlc1tpXTtcclxuICAgICAgY3VyVGljayAgPSAwO1xyXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3Qgc21vTm90ZSA9IHZvaWNlLm5vdGVzW2pdO1xyXG4gICAgICAgIGNvbnN0IG5vdGVUaWNrcyA9IHNtb05vdGUudGlja0NvdW50O1xyXG4gICAgICAgIGlmIChjdXJUaWNrICsgbm90ZVRpY2tzID49IGNsZWZDaGFuZ2VUaWNrKSB7XHJcbiAgICAgICAgICBzbW9Ob3RlLmNsZWYgPSBjbGVmQ2hhbmdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBSZW1vdmUgYW55IHJlZHVuZGFudCBjbGVmIGNoYW5nZXMgbGF0ZXIgaW4gdGhlIG1lYXN1cmVcclxuICAgICAgICBpZiAoY3VyVGljayArIG5vdGVUaWNrcyA+IGNsZWZDaGFuZ2VUaWNrKSB7XHJcbiAgICAgICAgICBpZiAoc21vTm90ZS5jbGVmTm90ZSAmJiBzbW9Ob3RlLmNsZWZOb3RlLmNsZWYgPT09IGNsZWZDaGFuZ2UpIHtcclxuICAgICAgICAgICAgc21vTm90ZS5jbGVmTm90ZSA9IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN1clRpY2sgKz0gbm90ZVRpY2tzO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqIEByZXR1cm5zIGNvbHVtbiBtYXBwZWQgcGFyYW1ldGVycywgc2VyaWFsaXplZC4gIGNhbGxlciB3aWxsXHJcbiAgICogZGVjaWRlIGlmIHRoZSBwYXJhbWV0ZXJzIG5lZWQgdG8gYmUgcGVyc2lzdGVkXHJcbiAgICovXHJcbiAgc2VyaWFsaXplQ29sdW1uTWFwcGVkKCk6IENvbHVtbk1hcHBlZFBhcmFtcyB7XHJcbiAgICAvL1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdGltZVNpZ25hdHVyZTogdGhpcy50aW1lU2lnbmF0dXJlLnNlcmlhbGl6ZSgpLFxyXG4gICAgICBrZXlTaWduYXR1cmU6IHRoaXMua2V5U2lnbmF0dXJlLFxyXG4gICAgICB0ZW1wbzogdGhpcy50ZW1wby5zZXJpYWxpemUoKVxyXG4gICAgfTtcclxuICB9XHJcbiAgZ2V0Q29sdW1uTWFwcGVkKCk6IENvbHVtbk1hcHBlZFBhcmFtcyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0aW1lU2lnbmF0dXJlOiB0aGlzLnRpbWVTaWduYXR1cmUsXHJcbiAgICAgIGtleVNpZ25hdHVyZTogdGhpcy5rZXlTaWduYXR1cmUsXHJcbiAgICAgIHRlbXBvOiB0aGlzLnRlbXBvXHJcbiAgICB9O1xyXG4gIH0gIFxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgdGhpcyBtZWFzdXJlIG9iamVjdCB0byBhIEpTT04gb2JqZWN0LCByZWN1cnNpdmVseSBzZXJpYWxpemluZyBhbGwgdGhlIG5vdGVzLFxyXG4gICAqIG5vdGUgbW9kaWZpZXJzLCBldGMuXHJcbiAgICovXHJcbiAgc2VyaWFsaXplKCk6IFNtb01lYXN1cmVQYXJhbXNTZXIge1xyXG4gICAgY29uc3QgcGFyYW1zOiBQYXJ0aWFsPFNtb01lYXN1cmVQYXJhbXNTZXI+ID0geyBcImN0b3JcIjogXCJTbW9NZWFzdXJlXCIgfTtcclxuICAgIGxldCBzZXIgPSB0cnVlO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZU5vbkRlZmF1bHQoU21vTWVhc3VyZS5kZWZhdWx0cywgU21vTWVhc3VyZS5zZXJpYWxpemFibGVBdHRyaWJ1dGVzLCB0aGlzLCBwYXJhbXMpO1xyXG4gICAgLy8gRG9uJ3Qgc2VyaWFsaXplIGRlZmF1bHQgdGhpbmdzXHJcbiAgICBjb25zdCBmbXQgPSB0aGlzLmZvcm1hdC5zZXJpYWxpemUoKTtcclxuICAgIC8vIG1lYXN1cmUgbnVtYmVyIGNhbid0IGJlIGRlZmF1bHRlZCBiL2MgdGVtcG9zIGV0Yy4gY2FuIG1hcCB0byBkZWZhdWx0IG1lYXN1cmVcclxuICAgIHBhcmFtcy5tZWFzdXJlTnVtYmVyID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm1lYXN1cmVOdW1iZXIpKTtcclxuICAgIHBhcmFtcy50dXBsZXRUcmVlcyA9IFtdO1xyXG4gICAgcGFyYW1zLnZvaWNlcyA9IFtdO1xyXG4gICAgcGFyYW1zLm1vZGlmaWVycyA9IFtdO1xyXG5cclxuICAgIHRoaXMudHVwbGV0VHJlZXMuZm9yRWFjaCgodHVwbGV0VHJlZSkgPT4ge1xyXG4gICAgICBwYXJhbXMudHVwbGV0VHJlZXMhLnB1c2godHVwbGV0VHJlZS5zZXJpYWxpemUoKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnZvaWNlcy5mb3JFYWNoKCh2b2ljZSkgPT4ge1xyXG4gICAgICBjb25zdCBvYmo6IGFueSA9IHtcclxuXHJcbiAgICAgICAgbm90ZXM6IFtdXHJcbiAgICAgIH07XHJcbiAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKG5vdGUpID0+IHtcclxuICAgICAgICBvYmoubm90ZXMucHVzaChub3RlLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHBhcmFtcy52b2ljZXMhLnB1c2gob2JqKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyKSA9PiB7XHJcbiAgICAgIHNlciA9IHRydWU7XHJcbiAgICAgIC8qIGRvbid0IHNlcmlhbGl6ZSBkZWZhdWx0IG1vZGlmaWVycyAqL1xyXG4gICAgICBpZiAobW9kaWZpZXIuY3RvciA9PT0gJ1Ntb0JhcmxpbmUnICYmIChtb2RpZmllciBhcyBTbW9CYXJsaW5lKS5wb3NpdGlvbiA9PT0gU21vQmFybGluZS5wb3NpdGlvbnMuc3RhcnQgJiZcclxuICAgICAgICAobW9kaWZpZXIgYXMgU21vQmFybGluZSkuYmFybGluZSA9PT0gU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXIpIHtcclxuICAgICAgICBzZXIgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIGlmIChtb2RpZmllci5jdG9yID09PSAnU21vQmFybGluZScgJiYgKG1vZGlmaWVyIGFzIFNtb0JhcmxpbmUpLnBvc2l0aW9uID09PSBTbW9CYXJsaW5lLnBvc2l0aW9ucy5lbmRcclxuICAgICAgICAmJiAobW9kaWZpZXIgYXMgU21vQmFybGluZSkuYmFybGluZSA9PT0gU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXIpIHtcclxuICAgICAgICBzZXIgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIGlmIChtb2RpZmllci5jdG9yID09PSAnU21vVGVtcG9UZXh0Jykge1xyXG4gICAgICAgIC8vIHdlIGRvbid0IHNhdmUgdGVtcG8gdGV4dCBhcyBhIG1vZGlmaWVyIGFueW1vcmVcclxuICAgICAgICBzZXIgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIGlmICgobW9kaWZpZXIgYXMgU21vUmVwZWF0U3ltYm9sKS5jdG9yID09PSAnU21vUmVwZWF0U3ltYm9sJyAmJiAobW9kaWZpZXIgYXMgU21vUmVwZWF0U3ltYm9sKS5wb3NpdGlvbiA9PT0gU21vUmVwZWF0U3ltYm9sLnBvc2l0aW9ucy5zdGFydFxyXG4gICAgICAgICYmIChtb2RpZmllciBhcyBTbW9SZXBlYXRTeW1ib2wpLnN5bWJvbCA9PT0gU21vUmVwZWF0U3ltYm9sLnN5bWJvbHMuTm9uZSkge1xyXG4gICAgICAgIHNlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZXIpIHtcclxuICAgICAgICBwYXJhbXMubW9kaWZpZXJzIS5wdXNoKG1vZGlmaWVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBbJ3RpbWVTaWduYXR1cmUnLCAna2V5U2lnbmF0dXJlJywgJ3RlbXBvJ11cclxuICAgIGlmICghaXNTbW9NZWFzdXJlUGFyYW1zU2VyKHBhcmFtcykpIHtcclxuICAgICAgdGhyb3cgJ2ludmFsaWQgbWVhc3VyZSc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFyYW1zO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBEdWUgdG8gYSBidWcsIHNvbWUgdHVwbGV0cyBoYXZlIGluY29ycmVjdCB0aWNrcy4gIEZpeCBpdCB3aGVuIHdlIGFyZSBkZXNlcmlhbGl6aW5nIHRoZSBtZWFzdXJlXHJcbiAgICogQHBhcmFtIHZvaWNlcyBcclxuICAgKiBAcGFyYW0gdHVwbGV0VHJlZSBcclxuICAgKi9cclxuICBzdGF0aWMgZml4VHVwbGV0TGVuZ3Rocyh2b2ljZXM6IFNtb1ZvaWNlW10sIHR1cGxldFRyZWU6IFNtb1R1cGxldFRyZWUpIHtcclxuICAgIGNvbnN0IHZvaWNlID0gdm9pY2VzW3R1cGxldFRyZWUudm9pY2VdO1xyXG4gICAgY29uc3Qgbm90ZWFyID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gdHVwbGV0VHJlZS5zdGFydEluZGV4OyBpIDw9IHR1cGxldFRyZWUuZW5kSW5kZXg7ICsraSkge1xyXG4gICAgICBpZiAodm9pY2Uubm90ZXMubGVuZ3RoID4gaSkge1xyXG4gICAgICAgIG5vdGVhci5wdXNoKHZvaWNlLm5vdGVzW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKG5vdGVhci5sZW5ndGggPT09ICh0dXBsZXRUcmVlLmVuZEluZGV4IC0gdHVwbGV0VHJlZS5zdGFydEluZGV4ICsgMSkpIHtcclxuICAgICAgY29uc3QgdGlja1N1bSA9IG5vdGVhci5tYXAoKHgpID0+IHgudGlja0NvdW50KS5yZWR1Y2UoKGEsYikgPT4gYSArIGIpO1xyXG4gICAgICBpZiAodHVwbGV0VHJlZS50b3RhbFRpY2tzID4gdGlja1N1bSkge1xyXG4gICAgICAgIG5vdGVhclswXS50aWNrcy5udW1lcmF0b3IgKz0gdHVwbGV0VHJlZS50b3RhbFRpY2tzIC0gdGlja1N1bTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiByZXN0b3JlIGEgc2VyaWFsaXplZCBtZWFzdXJlIG9iamVjdC4gIFVzdWFsbHkgY2FsbGVkIGFzIHBhcnQgb2YgZGVzZXJpYWxpemluZyBhIHNjb3JlLFxyXG4gICAqIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlc3RvcmUgYSBtZWFzdXJlIGR1ZSB0byBhbiB1bmRvIG9wZXJhdGlvbi4gIFJlY3Vyc2l2ZWx5XHJcbiAgICogZGVzZXJpYWxpemUgYWxsIHRoZSBub3RlcyBhbmQgbW9kaWZpZXJzIHRvIGNvbnN0cnVjdCBhIG5ldyBtZWFzdXJlLlxyXG4gICAqIEBwYXJhbSBqc29uT2JqIHRoZSBzZXJpYWxpemVkIFNtb01lYXN1cmVcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uT2JqOiBTbW9NZWFzdXJlUGFyYW1zU2VyKTogU21vTWVhc3VyZSB7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBjb25zdCB2b2ljZXM6IFNtb1ZvaWNlW10gPSBbXTtcclxuICAgIGZvciAoaiA9IDA7IGogPCBqc29uT2JqLnZvaWNlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICBjb25zdCB2b2ljZSA9IGpzb25PYmoudm9pY2VzW2pdO1xyXG4gICAgICBjb25zdCBub3RlczogU21vTm90ZVtdID0gW107XHJcbiAgICAgIHZvaWNlcy5wdXNoKHtcclxuICAgICAgICBub3Rlc1xyXG4gICAgICB9KTtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgY29uc3Qgbm90ZVBhcmFtcyA9IHZvaWNlLm5vdGVzW2ldO1xyXG4gICAgICAgIGNvbnN0IHNtb05vdGUgPSBTbW9Ob3RlLmRlc2VyaWFsaXplKG5vdGVQYXJhbXMpO1xyXG4gICAgICAgIG5vdGVzLnB1c2goc21vTm90ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtb2RpZmllcnM6IFNtb01lYXN1cmVNb2RpZmllckJhc2VbXSA9IFtdO1xyXG4gICAganNvbk9iai5tb2RpZmllcnMuZm9yRWFjaCgobW9kUGFyYW1zOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgbW9kaWZpZXI6IFNtb01lYXN1cmVNb2RpZmllckJhc2UgPSBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlLmRlc2VyaWFsaXplKG1vZFBhcmFtcyk7XHJcbiAgICAgIG1vZGlmaWVycy5wdXNoKG1vZGlmaWVyKTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgcGFyYW1zOiBTbW9NZWFzdXJlUGFyYW1zID0gU21vTWVhc3VyZS5kZWZhdWx0cztcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vTWVhc3VyZS5kZWZhdWx0QXR0cmlidXRlcywganNvbk9iaiwgcGFyYW1zKTtcclxuXHJcbiAgICAvLyBleHBsb2RlIGNvbHVtbi1tYXBwZWRcclxuICAgIGlmIChqc29uT2JqLnRlbXBvKSB7XHJcbiAgICAgIHBhcmFtcy50ZW1wbyA9IFNtb1RlbXBvVGV4dC5kZXNlcmlhbGl6ZShqc29uT2JqLnRlbXBvKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBhcmFtcy50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQoU21vVGVtcG9UZXh0LmRlZmF1bHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0aW1lU2lnbmF0dXJlU3RyaW5nIGlzIG5vdyBwYXJ0IG9mIHRpbWVTaWduYXR1cmUuICB1cGNvbnZlcnQgb2xkIHNjb3Jlc1xyXG4gICAgbGV0IHRpbWVTaWduYXR1cmVTdHJpbmcgPSAnJztcclxuICAgIGNvbnN0IGpzb25MZWdhY3kgPSAoanNvbk9iaiBhcyBhbnkpO1xyXG4gICAgaWYgKHR5cGVvZihqc29uTGVnYWN5LnRpbWVTaWduYXR1cmVTdHJpbmcpID09PSAnc3RyaW5nJyAmJiBqc29uTGVnYWN5LnRpbWVTaWduYXR1cmVTdHJpbmcubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aW1lU2lnbmF0dXJlU3RyaW5nID0ganNvbkxlZ2FjeS50aW1lU2lnbmF0dXJlU3RyaW5nO1xyXG4gICAgfVxyXG4gICAgaWYgKGpzb25PYmoudGltZVNpZ25hdHVyZSkge1xyXG4gICAgICBpZiAodGltZVNpZ25hdHVyZVN0cmluZy5sZW5ndGgpIHtcclxuICAgICAgICBqc29uT2JqLnRpbWVTaWduYXR1cmUuZGlzcGxheVN0cmluZyA9IHRpbWVTaWduYXR1cmVTdHJpbmc7ICBcclxuICAgICAgfVxyXG4gICAgICBwYXJhbXMudGltZVNpZ25hdHVyZSA9IFRpbWVTaWduYXR1cmUuZGVzZXJpYWxpemUoanNvbk9iai50aW1lU2lnbmF0dXJlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRwYXJhbXMgPSBUaW1lU2lnbmF0dXJlLmRlZmF1bHRzO1xyXG4gICAgICBpZiAodGltZVNpZ25hdHVyZVN0cmluZy5sZW5ndGgpIHtcclxuICAgICAgICB0cGFyYW1zLmRpc3BsYXlTdHJpbmcgPSB0aW1lU2lnbmF0dXJlU3RyaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIHBhcmFtcy50aW1lU2lnbmF0dXJlID0gbmV3IFRpbWVTaWduYXR1cmUodHBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICBwYXJhbXMua2V5U2lnbmF0dXJlID0ganNvbk9iai5rZXlTaWduYXR1cmUgPz8gJ0MnO1xyXG4gICAgcGFyYW1zLnZvaWNlcyA9IHZvaWNlcztcclxuXHJcbiAgICBpZiAoKGpzb25PYmogYXMgYW55KS50dXBsZXRUcmVlcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBqc29uT2JqLnR1cGxldFRyZWVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3QgdHVwbGV0VHJlZUpzb24gPSBqc29uT2JqLnR1cGxldFRyZWVzW2pdO1xyXG4gICAgICAgIGNvbnN0IHR1cGxldFRyZWUgPSBTbW9UdXBsZXRUcmVlLmRlc2VyaWFsaXplKHR1cGxldFRyZWVKc29uKTtcclxuICAgICAgICBwYXJhbXMudHVwbGV0VHJlZXMucHVzaCh0dXBsZXRUcmVlKTtcclxuICAgICAgICBTbW9NZWFzdXJlLmZpeFR1cGxldExlbmd0aHModm9pY2VzLCB0dXBsZXRUcmVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9kZXNlcmlhbGl6YXRpb24gb2YgYSBsZWdhY3kgdHVwbGV0c1xyXG4gICAgLy9sZWdhY3kgc2NoZW1hIGhhZCBtZWFzdXJlLnR1cGxldHMsIGl0IGlzIG1lYXN1cmUudHVwbGV0VHJlZXMgbm93XHJcbiAgICBpZiAoKGpzb25PYmogYXMgYW55KS50dXBsZXRzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IChqc29uT2JqIGFzIGFueSkudHVwbGV0cy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGNvbnN0IHR1cEpzb24gPSAoanNvbk9iaiBhcyBhbnkpLnR1cGxldHNbal07XHJcblxyXG4gICAgICAgIC8vIExlZ2FjeSBzY2hlbWEgaGFkIGF0dHJzLmlkLCBub3cgaXQgaXMganVzdCBpZFxyXG4gICAgICAgIGlmICgodHVwSnNvbiBhcyBhbnkpLmF0dHJzICYmICh0dXBKc29uIGFzIGFueSkuYXR0cnMuaWQpIHtcclxuICAgICAgICAgIHR1cEpzb24uaWQgPSAodHVwSnNvbiBhcyBhbnkpLmF0dHJzLmlkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdHVwbGV0Tm90ZXM6IFNtb05vdGVbXSA9IFtdO1xyXG4gICAgICAgIGxldCBzdGFydEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBwYXJhbXMudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgICAgICB2b2ljZS5ub3Rlcy5mb3JFYWNoKChub3RlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBiYWNrd2FyZHMtY29tcGF0aWJpbGlpdHksIHNvbWUgc2NvcmVzIGRvbid0IGhhdmUgYXR0cnMgb24gdHVwbGV0XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YodHVwSnNvbi5pZCkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgdHVwSnNvbi5hdHRycyA9IHsgdHlwZTogJ1Ntb1R1cGxldCcsIGlkOiB0dXBKc29uLmlkIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgaWQgPSB0dXBKc29uLmF0dHJzLmlkO1xyXG4gICAgICAgICAgICBpZiAobm90ZS5pc1R1cGxldCAmJiBub3RlLnR1cGxldElkID09PSBpZCkge1xyXG4gICAgICAgICAgICAgIHR1cGxldE5vdGVzLnB1c2gobm90ZSk7XHJcbiAgICAgICAgICAgICAgLy93ZSBjYW5ub3QgdHJ1c3Qgc3RhcnRJbmRleCBjb21pbmcgZnJvbSBsZWdhY3kganNvblxyXG4gICAgICAgICAgICAgIC8vd2UgbmVlZCB0byBjb3VudCBpbmRleCBvZiB0aGUgZmlyc3Qgbm90ZSBpbiB0aGUgdHVwbGV0XHJcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBCdWcgZml4OiAgQSB0dXBsZXQgd2l0aCBubyBub3RlcyBtYXkgYmUgYmVlbiBvdmVyd3JpdHRlblxyXG4gICAgICAgIC8vIGluIGEgY29weS9wYXN0ZSBvcGVyYXRpb25cclxuICAgICAgICBpZiAodHVwbGV0Tm90ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdHVwSnNvbi5ub3RlcyA9IHR1cGxldE5vdGVzO1xyXG4gICAgICAgICAgdHVwSnNvbi5zdGFydEluZGV4ID0gc3RhcnRJbmRleDtcclxuICAgICAgICAgIHR1cEpzb24uZW5kSW5kZXggPSB0dXBKc29uLnN0YXJ0SW5kZXggKyB0dXBsZXROb3Rlcy5sZW5ndGggLSAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdHVwbGV0OiBTbW9UdXBsZXQgPSBTbW9UdXBsZXQuZGVzZXJpYWxpemUodHVwSnNvbik7XHJcbiAgICAgICAgY29uc3QgdHVwbGV0VHJlZTogU21vVHVwbGV0VHJlZSA9IG5ldyBTbW9UdXBsZXRUcmVlKHt0dXBsZXQ6IHR1cGxldH0pO1xyXG4gICAgICAgIHBhcmFtcy50dXBsZXRUcmVlcy5wdXNoKHR1cGxldFRyZWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocGFyYW1zLnR1cGxldFRyZWVzLmxlbmd0aCkge1xyXG4gICAgICBTbW9UdXBsZXRUcmVlLnN5bmNUdXBsZXRJZHMocGFyYW1zLnR1cGxldFRyZWVzLCB2b2ljZXMpXHJcbiAgICB9XHJcblxyXG4gICAgcGFyYW1zLm1vZGlmaWVycyA9IG1vZGlmaWVycztcclxuICAgIGNvbnN0IG1lYXN1cmUgPSBuZXcgU21vTWVhc3VyZShwYXJhbXMpO1xyXG4gICAgLy8gSGFuZGxlIG1pZ3JhdGlvbiBmb3IgbWVhc3VyZS1tYXBwZWQgcGFyYW1ldGVyc1xyXG4gICAgbWVhc3VyZS5tb2RpZmllcnMuZm9yRWFjaCgobW9kKSA9PiB7XHJcbiAgICAgIGlmIChtb2QuY3RvciA9PT0gJ1Ntb1RlbXBvVGV4dCcpIHtcclxuICAgICAgICBtZWFzdXJlLnRlbXBvID0gKG1vZCBhcyBTbW9UZW1wb1RleHQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmICghbWVhc3VyZS50ZW1wbykge1xyXG4gICAgICBtZWFzdXJlLnRlbXBvID0gbmV3IFNtb1RlbXBvVGV4dChTbW9UZW1wb1RleHQuZGVmYXVsdHMpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcmV0dXJuIG1lYXN1cmU7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY2xvbmUobWVhc3VyZTogU21vTWVhc3VyZSk6IFNtb01lYXN1cmUge1xyXG4gICAgcmV0dXJuIFNtb01lYXN1cmUuZGVzZXJpYWxpemUobWVhc3VyZS5zZXJpYWxpemUoKSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBjbG9uZUZvclBhc3RlT3JVbmRvKG1lYXN1cmU6IFNtb01lYXN1cmUpIHtcclxuICAgIGNvbnN0IGNsb25lZE1lYXN1cmUgPSBTbW9NZWFzdXJlLmNsb25lKG1lYXN1cmUpO1xyXG4gICAgY2xvbmVkTWVhc3VyZS5zdmcgPSBtZWFzdXJlLnN2ZztcclxuICAgIC8vIE9yZGluYXJpbHksIHRoZSBrZXkvdGVtcG8vdGltZSBpcyBtYXBwZWQgdG8gdGhlIHN0YXZlLCBidXQgc2luY2Ugd2UgYXJlIHBhc3RpbmcgbWVhc3VyZS1ieVxyXG4gICAgLy8gbWVhc3VyZSBoZXJlLCB3ZSB3YW50IHRvIHByZXNlcnZlIGl0LlxyXG4gICAgY2xvbmVkTWVhc3VyZS5rZXlTaWduYXR1cmUgPSBtZWFzdXJlLmtleVNpZ25hdHVyZTtcclxuICAgIGNsb25lZE1lYXN1cmUudGltZVNpZ25hdHVyZSA9IG5ldyBUaW1lU2lnbmF0dXJlKG1lYXN1cmUudGltZVNpZ25hdHVyZSk7XHJcbiAgICBjbG9uZWRNZWFzdXJlLnRlbXBvID0gbmV3IFNtb1RlbXBvVGV4dChtZWFzdXJlLnRlbXBvKTtcclxuICAgIHJldHVybiBjbG9uZWRNZWFzdXJlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBjcmVhdGluZyBhIG5ldyBtZWFzdXJlLCB0aGUgJ2RlZmF1bHQnIHNldHRpbmdzIGNhbiB2YXJ5IGRlcGVuZGluZyBvblxyXG4gICAqIHdoYXQgY29tZXMgYmVmb3JlL2FmdGVyIHRoZSBtZWFzdXJlLiAgVGhpcyBkZXRlcm1pbmVzIHRoZSBkZWZhdWx0IHBpdGNoXHJcbiAgICogZm9yIGEgY2xlZiAoYXBwZWFycyBvbiAzcmQgbGluZSlcclxuICAgKi9cclxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQaXRjaEZvckNsZWYoKTogUmVjb3JkPENsZWYsIFBpdGNoPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAndHJlYmxlJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2InLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICduJyxcclxuICAgICAgICBvY3RhdmU6IDRcclxuICAgICAgfSxcclxuICAgICAgJ2Jhc3MnOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnZCcsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJ24nLFxyXG4gICAgICAgIG9jdGF2ZTogM1xyXG4gICAgICB9LFxyXG4gICAgICAndGVub3InOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnYScsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJ24nLFxyXG4gICAgICAgIG9jdGF2ZTogM1xyXG4gICAgICB9LFxyXG4gICAgICAnYWx0byc6IHtcclxuICAgICAgICBsZXR0ZXI6ICdjJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnbicsXHJcbiAgICAgICAgb2N0YXZlOiA0XHJcbiAgICAgIH0sXHJcbiAgICAgICdzb3ByYW5vJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2InLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICduJyxcclxuICAgICAgICBvY3RhdmU6IDRcclxuICAgICAgfSxcclxuICAgICAgJ3BlcmN1c3Npb24nOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnYicsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJ24nLFxyXG4gICAgICAgIG9jdGF2ZTogNFxyXG4gICAgICB9LFxyXG4gICAgICAnbWV6em8tc29wcmFubyc6IHtcclxuICAgICAgICBsZXR0ZXI6ICdiJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnbicsXHJcbiAgICAgICAgb2N0YXZlOiA0XHJcbiAgICAgIH0sXHJcbiAgICAgICdiYXJpdG9uZS1jJzoge1xyXG4gICAgICAgIGxldHRlcjogJ2InLFxyXG4gICAgICAgIGFjY2lkZW50YWw6ICduJyxcclxuICAgICAgICBvY3RhdmU6IDNcclxuICAgICAgfSxcclxuICAgICAgJ2Jhcml0b25lLWYnOiB7XHJcbiAgICAgICAgbGV0dGVyOiAnZScsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogJ24nLFxyXG4gICAgICAgIG9jdGF2ZTogM1xyXG4gICAgICB9LFxyXG4gICAgICAnc3ViYmFzcyc6IHtcclxuICAgICAgICBsZXR0ZXI6ICdkJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnJyxcclxuICAgICAgICBvY3RhdmU6IDJcclxuICAgICAgfSxcclxuICAgICAgJ2ZyZW5jaCc6IHtcclxuICAgICAgICBsZXR0ZXI6ICdiJyxcclxuICAgICAgICBhY2NpZGVudGFsOiAnJyxcclxuICAgICAgICBvY3RhdmU6IDRcclxuICAgICAgfSAvLyBubyBpZGVhXHJcbiAgICB9O1xyXG4gIH1cclxuICBzdGF0aWMgX2VtcHR5TWVhc3VyZU5vdGVUeXBlOiBOb3RlVHlwZSA9ICdyJztcclxuICBzdGF0aWMgc2V0IGVtcHR5TWVhc3VyZU5vdGVUeXBlKHR0OiBOb3RlVHlwZSkge1xyXG4gICAgU21vTWVhc3VyZS5fZW1wdHlNZWFzdXJlTm90ZVR5cGUgPSB0dDtcclxuICB9XHJcbiAgc3RhdGljIGdldCBlbXB0eU1lYXN1cmVOb3RlVHlwZSgpOiBOb3RlVHlwZSB7XHJcbiAgICByZXR1cm4gU21vTWVhc3VyZS5fZW1wdHlNZWFzdXJlTm90ZVR5cGU7XHJcbiAgfVxyXG4gIHN0YXRpYyB0aW1lU2lnbmF0dXJlTm90ZXModGltZVNpZ25hdHVyZTogVGltZVNpZ25hdHVyZSwgY2xlZjogQ2xlZikge1xyXG4gICAgY29uc3QgcGl0Y2ggPSBTbW9NZWFzdXJlLmRlZmF1bHRQaXRjaEZvckNsZWZbY2xlZl07XHJcbiAgICBjb25zdCBtYXhUaWNrcyA9IFNtb011c2ljLnRpbWVTaWduYXR1cmVUb1RpY2tzKHRpbWVTaWduYXR1cmUudGltZVNpZ25hdHVyZSk7XHJcbiAgICBjb25zdCBub3RlVGljayA9IDgxOTIgLyAodGltZVNpZ25hdHVyZS5iZWF0RHVyYXRpb24gLyAyKTtcclxuICAgIGxldCB0aWNrcyA9IDA7XHJcbiAgICBjb25zdCBwbm90ZXM6IFNtb05vdGVbXSA9IFtdO1xyXG4gICAgd2hpbGUgKHRpY2tzIDwgbWF4VGlja3MpIHtcclxuICAgICAgY29uc3QgbmV4dE5vdGUgPSBTbW9Ob3RlLmRlZmF1bHRzO1xyXG4gICAgICBuZXh0Tm90ZS5waXRjaGVzID0gW0pTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocGl0Y2gpKV07XHJcbiAgICAgIG5leHROb3RlLm5vdGVUeXBlID0gJ3InO1xyXG4gICAgICBuZXh0Tm90ZS5jbGVmID0gY2xlZjtcclxuICAgICAgbmV4dE5vdGUudGlja3MubnVtZXJhdG9yID0gbm90ZVRpY2s7XHJcbiAgICAgIG5leHROb3RlLnN0ZW1UaWNrcyA9IG5vdGVUaWNrO1xyXG4gICAgICBwbm90ZXMucHVzaChuZXcgU21vTm90ZShuZXh0Tm90ZSkpO1xyXG4gICAgICB0aWNrcyArPSBub3RlVGljaztcclxuICAgIH1cclxuICAgIGlmICh0aW1lU2lnbmF0dXJlLmJlYXREdXJhdGlvbiA9PT0gOCAmJiAodGltZVNpZ25hdHVyZS5hY3R1YWxCZWF0cyAlIDMgPT09IDAgfHwgdGltZVNpZ25hdHVyZS5hY3R1YWxCZWF0cyAlIDIgIT09IDApKSB7XHJcbiAgICAgIGxldCBpeCA9IDA7XHJcbiAgICAgIHBub3Rlcy5mb3JFYWNoKChwbm90ZSkgPT4ge1xyXG4gICAgICAgIGlmICgoaXggKyAxKSAlIDMgPT09IDApIHtcclxuICAgICAgICAgIHBub3RlLmJlYW1TdGF0ZSA9IFNtb05vdGUuYmVhbVN0YXRlcy5lbmQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBub3RlLmJlYW1CZWF0cyA9IDIwNDggKiAzO1xyXG4gICAgICAgIGl4ICs9IDE7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBub3RlcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0IGEgbWVhc3VyZSBmdWxsIG9mIGRlZmF1bHQgbm90ZXMgZm9yIGEgZ2l2ZW4gdGltZVNpZ25hdHVyZS9jbGVmLlxyXG4gICAqIHJldHVybnMgOHRoIG5vdGVzIGZvciB0cmlwbGUtdGltZSBtZXRlcnMsIGV0Yy5cclxuICAgKiBAcGFyYW0gcGFyYW1zIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXREZWZhdWx0Tm90ZXMocGFyYW1zOiBTbW9NZWFzdXJlUGFyYW1zKTogU21vTm90ZVtdIHtcclxuICAgIHJldHVybiBTbW9NZWFzdXJlLnRpbWVTaWduYXR1cmVOb3RlcyhuZXcgVGltZVNpZ25hdHVyZShwYXJhbXMudGltZVNpZ25hdHVyZSksIHBhcmFtcy5jbGVmKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gY3JlYXRpbmcgYSBuZXcgbWVhc3VyZSwgdGhlICdkZWZhdWx0JyBzZXR0aW5ncyBjYW4gdmFyeSBkZXBlbmRpbmcgb25cclxuICAgKiB3aGF0IGNvbWVzIGJlZm9yZS9hZnRlciB0aGUgbWVhc3VyZS4gIFRoaXMgZGV0ZXJtaW5lcyB0aGUgZGVmYXVsdHMgZnJvbSB0aGVcclxuICAgKiBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCBpbiwgd2hpY2ggY291bGQgYmUgYW5vdGhlciBtZWFzdXJlIGluIHRoZSBzY29yZS5cclxuICAgKiBUaGlzIHZlcnNpb24gcmV0dXJucyBwYXJhbXMgd2l0aCBubyBub3RlcywgZm9yIGNhbGxlcnMgdGhhdCB3YW50IHRvIHVzZSB0aGVpciBvd24gbm90ZXMuXHJcbiAgICogSWYgeW91IHdhbnQgdGhlIGRlZmF1bHQgbm90ZXMsIHNlZSB7QGxpbmsgZ2V0RGVmYXVsdE1lYXN1cmVXaXRoTm90ZXN9XHJcbiAgICogXHJcbiAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXREZWZhdWx0TWVhc3VyZShwYXJhbXM6IFNtb01lYXN1cmVQYXJhbXMpOiBTbW9NZWFzdXJlIHtcclxuICAgIGNvbnN0IG9iajogYW55ID0ge307XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlKFNtb01lYXN1cmUuZGVmYXVsdEF0dHJpYnV0ZXMsIFNtb01lYXN1cmUuZGVmYXVsdHMsIG9iaik7XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlKFNtb01lYXN1cmUuZGVmYXVsdEF0dHJpYnV0ZXMsIHBhcmFtcywgb2JqKTtcclxuICAgIC8vIERvbid0IGNvcHkgY29sdW1uLWZvcm1hdHRpbmcgb3B0aW9ucyB0byBuZXcgbWVhc3VyZSBpbiBuZXcgY29sdW1uXHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlKFNtb01lYXN1cmUuZm9ybWF0dGluZ09wdGlvbnMsIFNtb01lYXN1cmUuZGVmYXVsdHMsIG9iaik7XHJcbiAgICBvYmoudGltZVNpZ25hdHVyZSA9IG5ldyBUaW1lU2lnbmF0dXJlKHBhcmFtcy50aW1lU2lnbmF0dXJlKTtcclxuICAgIC8vIFRoZSBtZWFzdXJlIGV4cGVjdHMgdG8gZ2V0IGNvbmNlcnQgS1MgaW4gY29uc3RydWN0b3IgYW5kIGFkanVzdCBmb3IgaW5zdHJ1bWVudC4gIFNvIGRvIHRoZVxyXG4gICAgLy8gb3Bwb3NpdGUuXHJcbiAgICBvYmoua2V5U2lnbmF0dXJlID0gU21vTXVzaWMudmV4S2V5U2lnV2l0aE9mZnNldChvYmoua2V5U2lnbmF0dXJlLCAtMSAqIG9iai50cmFuc3Bvc2VJbmRleCk7XHJcbiAgICBvYmoubGluZXMgPSBwYXJhbXMubGluZXM7XHJcbiAgICAvLyBEb24ndCByZWRpc3BsYXkgdGVtcG8gZm9yIGEgbmV3IG1lYXN1cmVcclxuICAgIGNvbnN0IHJ2ID0gbmV3IFNtb01lYXN1cmUob2JqKTtcclxuICAgIGlmIChydi50ZW1wbyAmJiBydi50ZW1wby5kaXNwbGF5KSB7XHJcbiAgICAgIHJ2LnRlbXBvLmRpc3BsYXkgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gY3JlYXRpbmcgYSBuZXcgbWVhc3VyZSwgdGhlICdkZWZhdWx0JyBzZXR0aW5ncyBjYW4gdmFyeSBkZXBlbmRpbmcgb25cclxuICAgKiB3aGF0IGNvbWVzIGJlZm9yZS9hZnRlciB0aGUgbWVhc3VyZS4gIFRoaXMgZGV0ZXJtaW5lcyB0aGUgZGVmYXVsdHMgZnJvbSB0aGVcclxuICAgKiBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCBpbiwgd2hpY2ggY291bGQgYmUgYW5vdGhlciBtZWFzdXJlIGluIHRoZSBzY29yZS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gcGFyYW1zIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXREZWZhdWx0TWVhc3VyZVdpdGhOb3RlcyhwYXJhbXM6IFNtb01lYXN1cmVQYXJhbXMpOiBTbW9NZWFzdXJlIHtcclxuICAgIHZhciBtZWFzdXJlID0gU21vTWVhc3VyZS5nZXREZWZhdWx0TWVhc3VyZShwYXJhbXMpO1xyXG4gICAgbWVhc3VyZS52b2ljZXMucHVzaCh7XHJcbiAgICAgIG5vdGVzOiBTbW9NZWFzdXJlLmdldERlZmF1bHROb3RlcyhwYXJhbXMpXHJcbiAgICB9KTtcclxuICAgIC8vIGZpeCBhIGJ1Zy5cclxuICAgIC8vIG5ldyBtZWFzdXJlcyBvbmx5IGhhdmUgMSB2b2ljZSwgbWFrZSBzdXJlIGFjdGl2ZSB2b2ljZSBpcyAwXHJcbiAgICBtZWFzdXJlLmFjdGl2ZVZvaWNlID0gMDtcclxuICAgIHJldHVybiBtZWFzdXJlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiB1c2VkIGJ5IHhtbCBleHBvcnQgXHJcbiAgICogQGludGVybmFsXHJcbiAgICogQHBhcmFtIHZhbCBcclxuICAgKi9cclxuICBnZXRGb3JjZVN5c3RlbUJyZWFrKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0LnN5c3RlbUJyZWFrO1xyXG4gIH1cclxuICAvLyBAaW50ZXJuYWxcclxuICBzZXREZWZhdWx0QmFybGluZXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuZ2V0U3RhcnRCYXJsaW5lKCkpIHtcclxuICAgICAgdGhpcy5tb2RpZmllcnMucHVzaChuZXcgU21vQmFybGluZSh7XHJcbiAgICAgICAgcG9zaXRpb246IFNtb0JhcmxpbmUucG9zaXRpb25zLnN0YXJ0LFxyXG4gICAgICAgIGJhcmxpbmU6IFNtb0JhcmxpbmUuYmFybGluZXMuc2luZ2xlQmFyXHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5nZXRFbmRCYXJsaW5lKCkpIHtcclxuICAgICAgdGhpcy5tb2RpZmllcnMucHVzaChuZXcgU21vQmFybGluZSh7XHJcbiAgICAgICAgcG9zaXRpb246IFNtb0JhcmxpbmUucG9zaXRpb25zLmVuZCxcclxuICAgICAgICBiYXJsaW5lOiBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhclxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgY29udGFpbnNTb3VuZCgpOiBib29sZWFuIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBsZXQgaiA9IDA7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0gdGhpcy52b2ljZXNbaV07XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGlmICh2b2ljZS5ub3Rlc1tqXS5ub3RlVHlwZSA9PT0gJ24nKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGhlIHJlbmRlcmVkIHdpZHRoIG9mIHRoZSBtZWFzdXJlLCBvciBlc3RpbWF0ZSBvZiBzYW1lXHJcbiAgICovXHJcbiAgZ2V0IHN0YWZmV2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdmcuc3RhZmZXaWR0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHNldCB0aGUgcmVuZGVyZWQgd2lkdGggb2YgdGhlIG1lYXN1cmUsIG9yIGVzdGltYXRlIG9mIHNhbWVcclxuICAgKi9cclxuICBzZXRXaWR0aCh3aWR0aDogbnVtYmVyLCBkZXNjcmlwdGlvbjogc3RyaW5nKSB7XHJcbiAgICBpZiAobGF5b3V0RGVidWcuZmxhZ1NldChsYXlvdXREZWJ1Zy52YWx1ZXMubWVhc3VyZUhpc3RvcnkpKSB7XHJcbiAgICAgIHRoaXMuc3ZnLmhpc3RvcnkucHVzaCgnc2V0V2lkdGggJyArIHRoaXMuc3RhZmZXaWR0aCArICc9PiAnICsgd2lkdGggKyAnICcgKyBkZXNjcmlwdGlvbik7XHJcbiAgICB9XHJcbiAgICBpZiAoaXNOYU4od2lkdGgpKSB7XHJcbiAgICAgIHRocm93ICgnTkFOIGluIHNldFdpZHRoJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN2Zy5zdGFmZldpZHRoID0gd2lkdGg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgcmVuZGVyZWQgb3IgZXN0aW1hdGVkIHN0YXJ0IHhcclxuICAgKi9cclxuICBnZXQgc3RhZmZYKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5zdmcuc3RhZmZYO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHJlbmRlcmVkIG9yIGVzdGltYXRlZCBzdGFydCB4XHJcbiAgICovXHJcbiAgc2V0WCh4OiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcclxuICAgIGlmIChpc05hTih4KSkge1xyXG4gICAgICB0aHJvdyAoJ05BTiBpbiBzZXRYJyk7XHJcbiAgICB9XHJcbiAgICBsYXlvdXREZWJ1Zy5tZWFzdXJlSGlzdG9yeSh0aGlzLCAnc3RhZmZYJywgeCwgZGVzY3JpcHRpb24pO1xyXG4gICAgdGhpcy5zdmcuc3RhZmZYID0gTWF0aC5yb3VuZCh4KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSB0aW1lIHNpZ25hdHVyZSBoYXMgcG9zc2libHkgY2hhbmdlZC4gIGFkZC9yZW1vdmUgbm90ZXMgdG9cclxuICAgKiBtYXRjaCB0aGUgbmV3IGxlbmd0aFxyXG4gICAqL1xyXG4gIGFsaWduTm90ZXNXaXRoVGltZVNpZ25hdHVyZSgpIHtcclxuICAgIGNvbnN0IHRzVGlja3MgPSBTbW9NdXNpYy50aW1lU2lnbmF0dXJlVG9UaWNrcyh0aGlzLnRpbWVTaWduYXR1cmUudGltZVNpZ25hdHVyZSk7XHJcbiAgICBsZXQgYWxpZ25lZCA9IHRydWU7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0gdGhpcy52b2ljZXNbaV07XHJcbiAgICAgIGlmICh0aGlzLmdldFRpY2tzRnJvbVZvaWNlKGkpICE9PSB0c1RpY2tzKSB7XHJcbiAgICAgICAgYWxpZ25lZCA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoYWxpZ25lZCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlcGxhY2VOb3RlV2l0aER1cmF0aW9uID0gKHRhcmdldDogbnVtYmVyLCBhcjogU21vTm90ZVtdLCBub3RlOiBTbW9Ob3RlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpdE5vdGUgPSBuZXcgU21vTm90ZShTbW9Ob3RlLmRlZmF1bHRzKTtcclxuICAgICAgY29uc3QgZHVyYXRpb24gPSBTbW9NdXNpYy5jbG9zZXN0RHVyYXRpb25UaWNrTHRFcSh0YXJnZXQpO1xyXG4gICAgICBpZiAoZHVyYXRpb24gPiAxMjgpIHtcclxuICAgICAgICBmaXROb3RlLnRpY2tzID0geyBudW1lcmF0b3I6IGR1cmF0aW9uLCBkZW5vbWluYXRvcjogMSwgcmVtYWluZGVyOiAwIH07XHJcbiAgICAgICAgZml0Tm90ZS5zdGVtVGlja3MgPSBkdXJhdGlvbjtcclxuICAgICAgICBmaXROb3RlLnBpdGNoZXMgPSBub3RlLnBpdGNoZXM7XHJcbiAgICAgICAgZml0Tm90ZS5ub3RlVHlwZSA9IG5vdGUubm90ZVR5cGU7XHJcbiAgICAgICAgZml0Tm90ZS5jbGVmID0gbm90ZS5jbGVmO1xyXG4gICAgICAgIGFyLnB1c2goZml0Tm90ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IHZvaWNlczogU21vVm9pY2VbXSA9IFtdO1xyXG4gICAgY29uc3QgdHVwbGV0czogU21vVHVwbGV0W10gPSBbXTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgdm9pY2UgPSB0aGlzLnZvaWNlc1tpXTtcclxuICAgICAgY29uc3QgbmV3Tm90ZXM6IFNtb05vdGVbXSA9IFtdO1xyXG4gICAgICBsZXQgdm9pY2VUaWNrcyA9IDA7XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBjb25zdCBub3RlID0gdm9pY2Uubm90ZXNbal07XHJcbiAgICAgICAgLy8gaWYgYSB0dXBsZXQsIG1ha2Ugc3VyZSB0aGUgd2hvbGUgdHVwbGV0IGZpdHMuXHJcbiAgICAgICAgaWYgKG5vdGUuaXNUdXBsZXQpIHtcclxuICAgICAgICAgIGNvbnN0IHR1cGxldFRyZWUgPSBTbW9UdXBsZXRUcmVlLmdldFR1cGxldFRyZWVGb3JOb3RlSW5kZXgodGhpcy50dXBsZXRUcmVlcywgaSwgaik7XHJcbiAgICAgICAgICBpZiAodHVwbGV0VHJlZSkge1xyXG4gICAgICAgICAgICAvLyByZW1haW5pbmcgbm90ZXMgb2YgYW4gYXBwcm92ZWQgdHVwbGV0LCBqdXN0IGFkZCB0aGVtXHJcbiAgICAgICAgICAgIGlmICh0dXBsZXRUcmVlLnN0YXJ0SW5kZXggIT09IGopIHtcclxuICAgICAgICAgICAgICBuZXdOb3Rlcy5wdXNoKG5vdGUpO1xyXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHR1cGxldFRyZWUudG90YWxUaWNrcyArIHZvaWNlVGlja3MgPD0gdHNUaWNrcykge1xyXG4gICAgICAgICAgICAgIC8vIGZpcnN0IG5vdGUgb2YgdGhlIHR1cGxldCwgaXQgZml0cywgYWRkIGl0XHJcbiAgICAgICAgICAgICAgdm9pY2VUaWNrcyArPSB0dXBsZXRUcmVlLnRvdGFsVGlja3M7XHJcbiAgICAgICAgICAgICAgbmV3Tm90ZXMucHVzaChub3RlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyB0dXBsZXQgd2lsbCBub3QgZml0LiAgUmVwbGFjZSB0dXBsZXQgd2l0aCBhIG5vdGUgYXMgY2xvc2UgdG8gcmVtYWluZGVyIGFzIHBvc3NpYmxlIGFuZCBhZGQgaXRcclxuICAgICAgICAgICAgICAvLyByZW1vdmUgdHVwbGV0XHJcbiAgICAgICAgICAgICAgbm90ZS50dXBsZXRJZCA9IG51bGxcclxuICAgICAgICAgICAgICByZXBsYWNlTm90ZVdpdGhEdXJhdGlvbih0c1RpY2tzIC0gdm9pY2VUaWNrcywgbmV3Tm90ZXMsIG5vdGUpO1xyXG4gICAgICAgICAgICAgIHZvaWNlVGlja3MgPSB0c1RpY2tzO1xyXG4gICAgICAgICAgICAgIFNtb1R1cGxldFRyZWUucmVtb3ZlVHVwbGV0Rm9yTm90ZUluZGV4KHRoaXMsIGksIGopO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgeyAvLyBtaXNzaW5nIHR1cGxldCwgbm93IHdoYXQ/XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignbWlzc2luZyB0dXBsZXQgaW5mbycpO1xyXG4gICAgICAgICAgICByZXBsYWNlTm90ZVdpdGhEdXJhdGlvbih0c1RpY2tzIC0gdm9pY2VUaWNrcywgbmV3Tm90ZXMsIG5vdGUpO1xyXG4gICAgICAgICAgICB2b2ljZVRpY2tzID0gdHNUaWNrcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKG5vdGUudGlja0NvdW50ICsgdm9pY2VUaWNrcyA8PSB0c1RpY2tzKSB7XHJcbiAgICAgICAgICAgIG5ld05vdGVzLnB1c2gobm90ZSk7XHJcbiAgICAgICAgICAgIHZvaWNlVGlja3MgKz0gbm90ZS50aWNrQ291bnQ7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXBsYWNlTm90ZVdpdGhEdXJhdGlvbih0c1RpY2tzIC0gdm9pY2VUaWNrcywgbmV3Tm90ZXMsIG5vdGUpO1xyXG4gICAgICAgICAgICB2b2ljZVRpY2tzID0gdHNUaWNrcztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0c1RpY2tzIC0gdm9pY2VUaWNrcyA+IDEyOCkge1xyXG4gICAgICAgIGNvbnN0IG5wID0gU21vTm90ZS5kZWZhdWx0cztcclxuICAgICAgICBucC5jbGVmID0gdGhpcy5jbGVmO1xyXG4gICAgICAgIGNvbnN0IG5ub3RlID0gbmV3IFNtb05vdGUobnApO1xyXG4gICAgICAgIHJlcGxhY2VOb3RlV2l0aER1cmF0aW9uKHRzVGlja3MgLSB2b2ljZVRpY2tzLCBuZXdOb3Rlcywgbm5vdGUpO1xyXG4gICAgICB9XHJcbiAgICAgIHZvaWNlcy5wdXNoKHsgbm90ZXM6IG5ld05vdGVzIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy52b2ljZXMgPSB2b2ljZXM7XHJcbiAgfVxyXG4gIGdldCBtZWFzdXJlTnVtYmVyRGJnKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleH0vJHt0aGlzLm1lYXN1cmVOdW1iZXIuc3lzdGVtSW5kZXh9LyR7dGhpcy5tZWFzdXJlTnVtYmVyLnN0YWZmSWR9YDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0IHJlbmRlcmVkIG9yIGVzdGltYXRlZCBzdGFydCB5XHJcbiAgICovXHJcbiAgZ2V0IHN0YWZmWSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc3ZnLnN0YWZmWTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCByZW5kZXJlZCBvciBlc3RpbWF0ZWQgc3RhcnQgeVxyXG4gICAqL1xyXG4gIHNldFkoeTogbnVtYmVyLCBkZXNjcmlwdGlvbjogc3RyaW5nKSB7XHJcbiAgICBpZiAoaXNOYU4oeSkpIHtcclxuICAgICAgdGhyb3cgKCdOQU4gaW4gc2V0WScpO1xyXG4gICAgfVxyXG4gICAgbGF5b3V0RGVidWcubWVhc3VyZUhpc3RvcnkodGhpcywgJ3N0YWZmWScsIHksIGRlc2NyaXB0aW9uKTtcclxuICAgIHRoaXMuc3ZnLnN0YWZmWSA9IE1hdGgucm91bmQoeSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gYWN0dWFsIG9yIGVzdGltYXRlZCBoaWdoZXN0IHBvaW50IGluIHNjb3JlXHJcbiAgICovXHJcbiAgZ2V0IHlUb3AoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnN2Zy55VG9wO1xyXG4gIH1cclxuICAvKipcclxuICAgKiByZXR1cm4gdGhlIGxvd2VzdCB5IChoaWdoZXN0IHZhbHVlKSBpbiB0aGlzIG1lYXN1cmUgc3ZnXHJcbiAgICpcclxuICAgKiBAcmVhZG9ubHlcclxuICAgKi9cclxuICBnZXQgbG93ZXN0WSgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuc3ZnLnRhYlN0YXZlQm94KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnN2Zy50YWJTdGF2ZUJveC55ICsgdGhpcy5zdmcudGFiU3RhdmVCb3guaGVpZ2h0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc3ZnLmxvZ2ljYWxCb3gueSArIHRoaXMuc3ZnLmxvZ2ljYWxCb3guaGVpZ2h0O1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBhZGp1c3QgdGhlIHkgZm9yIHRoZSByZW5kZXIgYm94ZXMgdG8gYWNjb3VudCBmb3IgdGhlIHBhZ2UgYW5kIG1hcmdpbnNcclxuICAgKi9cclxuICBhZGp1c3RZKHlPZmZzZXQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5zdmcubG9naWNhbEJveC55ICs9IHlPZmZzZXQ7XHJcbiAgICBpZiAodGhpcy5zdmcudGFiU3RhdmVCb3gpIHtcclxuICAgICAgdGhpcy5zdmcudGFiU3RhdmVCb3gueSArPSB5T2Zmc2V0O1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBXSGVuIHNldHRpbmcgYW4gaW5zdHJ1bWVudCwgb2Zmc2V0IHRoZSBwaXRjaGVzIHRvIG1hdGNoIHRoZSBpbnN0cnVtZW50IGtleVxyXG4gICAqIEBwYXJhbSBvZmZzZXQgXHJcbiAgICogQHBhcmFtIG5ld0NsZWYgXHJcbiAgICovXHJcbiAgdHJhbnNwb3NlVG9PZmZzZXQob2Zmc2V0OiBudW1iZXIsIHRhcmdldEtleTogc3RyaW5nLCBuZXdDbGVmPzogQ2xlZikge1xyXG4gICAgY29uc3QgZGlmZiA9IG9mZnNldCAtIHRoaXMudHJhbnNwb3NlSW5kZXg7XHJcbiAgICBuZXdDbGVmID0gbmV3Q2xlZiA/PyB0aGlzLmNsZWY7XHJcbiAgICB0aGlzLnZvaWNlcy5mb3JFYWNoKCh2b2ljZSkgPT4ge1xyXG4gICAgICB2b2ljZS5ub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGl0Y2hlczogbnVtYmVyW10gPSBbLi4uQXJyYXkobm90ZS5waXRjaGVzLmxlbmd0aCkua2V5cygpXTtcclxuICAgICAgICAvLyB3aGVuIHRoZSBub3RlIGlzIGEgcmVzdCwgcHJlc2VydmUgdGhlIHJlc3QgYnV0IG1hdGNoIHRoZSBuZXcgY2xlZi5cclxuICAgICAgICBpZiAobmV3Q2xlZiAhPT0gdGhpcy5jbGVmICYmIG5vdGUubm90ZVR5cGUgPT09ICdyJykge1xyXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgY29uc3QgZGVmcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoU21vTWVhc3VyZS5kZWZhdWx0UGl0Y2hGb3JDbGVmW25ld0NsZWZdKSk7XHJcbiAgICAgICAgICBub3RlLnBpdGNoZXMgPSBbZGVmcF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5vdGUudHJhbnNwb3NlKHBpdGNoZXMsIGRpZmYsIHRoaXMua2V5U2lnbmF0dXJlLCB0YXJnZXRLZXkpO1xyXG4gICAgICAgICAgbm90ZS5nZXRHcmFjZU5vdGVzKCkuZm9yRWFjaCgoZ24pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZ3BpdGNoOiBudW1iZXJbXSA9IFsuLi5BcnJheShnbi5waXRjaGVzLmxlbmd0aCkua2V5cygpXTtcclxuICAgICAgICAgICAgY29uc3QgeHBvc2UgPSBTbW9Ob3RlLnRyYW5zcG9zZShnbiwgZ3BpdGNoLCBkaWZmLCB0aGlzLmtleVNpZ25hdHVyZSwgdGFyZ2V0S2V5KTtcclxuICAgICAgICAgICAgZ24ucGl0Y2hlcyA9IHhwb3NlLnBpdGNoZXM7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybiBhY3R1YWwgb3IgZXN0aW1hdGVkIGhpZ2hlc3QgcG9pbnQgaW4gc2NvcmVcclxuICAgKi9cclxuICBzZXRZVG9wKHk6IG51bWJlciwgZGVzY3JpcHRpb246IHN0cmluZykge1xyXG4gICAgbGF5b3V0RGVidWcubWVhc3VyZUhpc3RvcnkodGhpcywgJ3lUb3AnLCB5LCBkZXNjcmlwdGlvbik7XHJcbiAgICB0aGlzLnN2Zy55VG9wID0geTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiBhY3R1YWwgb3IgZXN0aW1hdGVkIGJvdW5kaW5nIGJveFxyXG4gICAqL1xyXG4gIHNldEJveChib3g6IFN2Z0JveCwgZGVzY3JpcHRpb246IHN0cmluZykge1xyXG4gICAgbGF5b3V0RGVidWcubWVhc3VyZUhpc3RvcnkodGhpcywgJ2xvZ2ljYWxCb3gnLCBib3gsIGRlc2NyaXB0aW9uKTtcclxuICAgIHRoaXMuc3ZnLmxvZ2ljYWxCb3ggPSBTdmdIZWxwZXJzLnNtb0JveChib3gpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBAcmV0dXJucyB0aGUgRE9NIGlkZW50aWZpZXIgZm9yIHRoaXMgbWVhc3VyZSB3aGVuIHJlbmRlcmVkXHJcbiAgICovXHJcbiAgZ2V0Q2xhc3NJZCgpIHtcclxuICAgIHJldHVybiAnbW0tJyArIHRoaXMubWVhc3VyZU51bWJlci5zdGFmZklkICsgJy0nICsgdGhpcy5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGlkIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGdldFJlbmRlcmVkTm90ZShpZDogc3RyaW5nKSB7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBmb3IgKGogPSAwOyBqIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgY29uc3Qgdm9pY2UgPSB0aGlzLnZvaWNlc1tqXTtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgY29uc3Qgbm90ZSA9IHZvaWNlLm5vdGVzW2ldO1xyXG4gICAgICAgIGlmIChub3RlLnJlbmRlcklkID09PSBpZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc21vTm90ZTogbm90ZSxcclxuICAgICAgICAgICAgdm9pY2U6IGosXHJcbiAgICAgICAgICAgIHRpY2s6IGlcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldE5vdGVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudm9pY2VzW3RoaXMuYWN0aXZlVm9pY2VdLm5vdGVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWN0aXZlVm9pY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVWb2ljZTtcclxuICB9XHJcblxyXG4gIHNldEFjdGl2ZVZvaWNlKHZpeDogbnVtYmVyKSB7XHJcbiAgICBpZiAodml4ID49IDAgJiYgdml4IDwgdGhpcy52b2ljZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVm9pY2UgPSB2aXg7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldFN3YXBWb2ljZVBhaXJzKCkge1xyXG4gICAgY29uc3QgcnYgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBydi5wdXNoKFtpLCBqXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgc3dhcFZvaWNlcyh2b2ljZTE6IG51bWJlciwgdm9pY2UyOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLnZvaWNlcy5sZW5ndGggPiB2b2ljZTEgJiYgdGhpcy52b2ljZXMubGVuZ3RoID4gdm9pY2UyKSB7XHJcbiAgICAgIGNvbnN0IHYxID0gdGhpcy52b2ljZXNbdm9pY2UxXTtcclxuICAgICAgY29uc3QgdjIgPSB0aGlzLnZvaWNlc1t2b2ljZTJdO1xyXG4gICAgICBjb25zdCBudm9pY2VzOiBTbW9Wb2ljZVtdID0gW107XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgICBpZiAoaSA9PT0gdm9pY2UxKSB7XHJcbiAgICAgICAgICBudm9pY2VzLnB1c2godjIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gdm9pY2UyKSB7XHJcbiAgICAgICAgICBudm9pY2VzLnB1c2godjEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBudm9pY2VzLnB1c2godGhpcy52b2ljZXNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnZvaWNlcyA9IG52b2ljZXM7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHRpY2ttYXBGb3JWb2ljZSh2b2ljZUl4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiBuZXcgVGlja01hcCh0aGlzLCB2b2ljZUl4KTtcclxuICB9XHJcblxyXG4gIC8vICMjIyBjcmVhdGVNZWFzdXJlVGlja21hcHNcclxuICAvLyBBIHRpY2ttYXAgaXMgYSBtYXAgb2Ygbm90ZXMgdG8gdGlja3MgZm9yIHRoZSBtZWFzdXJlLiAgSXQgaXMgc3BlY2lpZmMgcGVyLXZvaWNlXHJcbiAgLy8gc2luY2UgZWFjaCB2b2ljZSBtYXkgaGF2ZSBkaWZmZXJlbnQgbnVtYmVycyBvZiB0aWNrcy4gIFRoZSBhY2NpZGVudGFsIG1hcCBpc1xyXG4gIC8vIG92ZXJhbGwgc2luY2UgYWNjaWRlbnRhbHMgaW4gb25lIHZvaWNlIGFwcGx5IHRvIGFjY2lkZW50YWxzIGluIHRoZSBvdGhlclxyXG4gIC8vIHZvaWNlcy4gIFNvIHdlIHJldHVybiB0aGUgdGlja21hcHMgYW5kIHRoZSBvdmVyYWxsIGFjY2lkZW50YWwgbWFwLlxyXG4gIGNyZWF0ZU1lYXN1cmVUaWNrbWFwcygpOiBNZWFzdXJlVGlja21hcHMge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3QgdGlja21hcEFycmF5OiBUaWNrTWFwW10gPSBbXTtcclxuICAgIGNvbnN0IGFjY2lkZW50YWxNYXA6IFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIFJlY29yZDxzdHJpbmcsIFRpY2tBY2NpZGVudGFsPj4gPVxyXG4gICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBSZWNvcmQ8UGl0Y2hMZXR0ZXIsIFRpY2tBY2NpZGVudGFsPj47XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgdGlja21hcEFycmF5LnB1c2godGhpcy50aWNrbWFwRm9yVm9pY2UoaSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB0aWNrbWFwOiBUaWNrTWFwID0gdGlja21hcEFycmF5W2ldO1xyXG4gICAgICBjb25zdCBkdXJhdGlvbktleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMoKHRpY2ttYXAuZHVyYXRpb25BY2NpZGVudGFsTWFwKSk7XHJcblxyXG4gICAgICBkdXJhdGlvbktleXMuZm9yRWFjaCgoZHVyYXRpb25LZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmICghYWNjaWRlbnRhbE1hcFtkdXJhdGlvbktleV0pIHtcclxuICAgICAgICAgIGFjY2lkZW50YWxNYXBbZHVyYXRpb25LZXldID0gdGlja21hcC5kdXJhdGlvbkFjY2lkZW50YWxNYXBbZHVyYXRpb25LZXldO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBhbWFwID0gYWNjaWRlbnRhbE1hcFtkdXJhdGlvbktleV07XHJcbiAgICAgICAgICBjb25zdCB0aWNrYWJsZTogUmVjb3JkPFBpdGNoTGV0dGVyLCBUaWNrQWNjaWRlbnRhbD4gPSB0aWNrbWFwLmR1cmF0aW9uQWNjaWRlbnRhbE1hcFtkdXJhdGlvbktleV07XHJcbiAgICAgICAgICBjb25zdCBsZXR0ZXJLZXlzOiBQaXRjaExldHRlcltdID0gT2JqZWN0LmtleXModGlja2FibGUpIGFzIEFycmF5PFBpdGNoTGV0dGVyPjtcclxuICAgICAgICAgIGxldHRlcktleXMuZm9yRWFjaCgocGl0Y2hLZXkpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFhbWFwW3BpdGNoS2V5XSkge1xyXG4gICAgICAgICAgICAgIGFtYXBbcGl0Y2hLZXldID0gdGlja21hcC5kdXJhdGlvbkFjY2lkZW50YWxNYXBbZHVyYXRpb25LZXldW3BpdGNoS2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vIGR1cmF0aW9uOiBkdXJhdGlvbiwgcGl0Y2hlczogUmVjb3JkPFBpdGNoTGV0dGVyLFRpY2tBY2NpZGVudGFsPlxyXG4gICAgY29uc3QgYWNjaWRlbnRhbEFycmF5OiBBY2NpZGVudGFsQXJyYXlbXSA9IFtdO1xyXG4gICAgT2JqZWN0LmtleXMoYWNjaWRlbnRhbE1hcCkuZm9yRWFjaCgoZHVyYXRpb25LZXkpID0+IHtcclxuICAgICAgYWNjaWRlbnRhbEFycmF5LnB1c2goeyBkdXJhdGlvbjogZHVyYXRpb25LZXksIHBpdGNoZXM6IGFjY2lkZW50YWxNYXBbZHVyYXRpb25LZXldIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0aWNrbWFwczogdGlja21hcEFycmF5LFxyXG4gICAgICBhY2NpZGVudGFsTWFwLFxyXG4gICAgICBhY2NpZGVudGFsQXJyYXlcclxuICAgIH07XHJcbiAgfVxyXG4gIC8vICMjIyBjcmVhdGVSZXN0Tm90ZVdpdGhEdXJhdGlvblxyXG4gIC8vIHBhZCBzb21lIGR1cmF0aW9uIG9mIG11c2ljIHdpdGggcmVzdHMuXHJcbiAgc3RhdGljIGNyZWF0ZVJlc3ROb3RlV2l0aER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIsIGNsZWY6IENsZWYpOiBTbW9Ob3RlIHtcclxuICAgIGNvbnN0IHBpdGNoOiBQaXRjaCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgIFNtb01lYXN1cmUuZGVmYXVsdFBpdGNoRm9yQ2xlZltjbGVmXSkpO1xyXG4gICAgY29uc3Qgbm90ZSA9IG5ldyBTbW9Ob3RlKFNtb05vdGUuZGVmYXVsdHMpO1xyXG4gICAgbm90ZS5waXRjaGVzID0gW3BpdGNoXTtcclxuICAgIG5vdGUubm90ZVR5cGUgPSAncic7XHJcbiAgICBub3RlLmhpZGRlbiA9IHRydWU7XHJcbiAgICBub3RlLnRpY2tzID0geyBudW1lcmF0b3I6IGR1cmF0aW9uLCBkZW5vbWluYXRvcjogMSwgcmVtYWluZGVyOiAwIH07XHJcbiAgICByZXR1cm4gbm90ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvdW50IHRoZSBudW1iZXIgb2YgdGlja3MgaW4gZWFjaCB2b2ljZSBhbmQgcmV0dXJuIG1heFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGdldE1heFRpY2tzVm9pY2UoKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgbWF4ID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB2b2ljZVRpY2tzID0gdGhpcy5nZXRUaWNrc0Zyb21Wb2ljZShpKTtcclxuICAgICAgbWF4ID0gTWF0aC5tYXgodm9pY2VUaWNrcywgbWF4KTtcclxuICAgIH1cclxuICAgIHJldHVybiBtYXg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3IgcGFzdGluZywgcGFzdGUgaW50byB0aGUgdGFyZ2V0IG1lYXN1cmUgaWYgdGhlIHZvaWNlIGV4aXN0cywgZWxzZSBwYXN0ZSBpbnRvXHJcbiAgICogdm9pY2UgMFxyXG4gICAqIEBwYXJhbSB2b2ljZUluZGV4IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGdldFRpY2tzRnJvbVRoaXNPckFueVZvaWNlKHZvaWNlSW5kZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy52b2ljZXMubGVuZ3RoID4gdm9pY2VJbmRleCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRUaWNrc0Zyb21Wb2ljZSh2b2ljZUluZGV4KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldFRpY2tzRnJvbVZvaWNlKDApO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIHRpY2tzIGluIGEgc3BlY2lmaWMgdm9pY2VcclxuICAgKiBAcGFyYW0gdm9pY2VJbmRleCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBnZXRUaWNrc0Zyb21Wb2ljZSh2b2ljZUluZGV4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHRpY2tzID0gMDtcclxuICAgIHRoaXMudm9pY2VzW3ZvaWNlSW5kZXhdLm5vdGVzLmZvckVhY2goKG5vdGUpID0+IHtcclxuICAgICAgdGlja3MgKz0gbm90ZS50aWNrQ291bnQ7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aWNrcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvdW50IGFsbCB0aGUgdGlja3MgdXAgdG8gdGhlIHByb3ZpZGVkIHRpY2tJbmRleFxyXG4gICAqIEBwYXJhbSB2b2ljZUluZGV4XHJcbiAgICogQHBhcmFtIHRpY2tJbmRleFxyXG4gICAqL1xyXG4gIGdldE5vdGVQb3NpdGlvbkluVGlja3Modm9pY2VJbmRleDogbnVtYmVyLCB0aWNrSW5kZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcnYgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aWNrSW5kZXg7IGkrKykge1xyXG4gICAgICBjb25zdCBub3RlID0gdGhpcy52b2ljZXNbdm9pY2VJbmRleF0ubm90ZXNbaV07XHJcbiAgICAgIHJ2ICs9IG5vdGUudGlja0NvdW50O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ291bnQgYWxsIHRoZSB0aWNrcyB1cCB0byB0aGUgcHJvdmlkZWQgdGlja0luZGV4XHJcbiAgICogQHBhcmFtIHZvaWNlSW5kZXhcclxuICAgKiBAcGFyYW0gdGlja0luZGV4XHJcbiAgICovXHJcbiAgZ2V0VGlja0NvdW50Rm9yTm90ZSh2b2ljZUluZGV4OiBudW1iZXIsIG5vdGU6IFNtb05vdGUpOiBudW1iZXIge1xyXG4gICAgbGV0IHJ2ID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52b2ljZXNbdm9pY2VJbmRleF0ubm90ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY3VycmVudE5vdGUgPSB0aGlzLnZvaWNlc1t2b2ljZUluZGV4XS5ub3Rlc1tpXTtcclxuICAgICAgcnYgKz0gbm90ZS50aWNrQ291bnQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG5cclxuICBnZXRDbG9zZXN0SW5kZXhGcm9tVGlja0NvdW50KHZvaWNlSW5kZXg6IG51bWJlciwgdGlja0NvdW50OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IHJ2ID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnZvaWNlc1t2b2ljZUluZGV4XS5ub3Rlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBub3RlID0gdGhpcy52b2ljZXNbdm9pY2VJbmRleF0ubm90ZXNbaV07XHJcbiAgICAgIGlmIChub3RlLnRpY2tDb3VudCArIHJ2ID49IHRpY2tDb3VudCkge1xyXG4gICAgICAgIHJldHVybiBpO1xyXG4gICAgICB9XHJcbiAgICAgIHJ2ICs9IG5vdGUudGlja0NvdW50O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGk7XHJcbiAgfVxyXG5cclxuICBpc1BpY2t1cCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHRpY2tzID0gdGhpcy5nZXRUaWNrc0Zyb21Wb2ljZSgwKTtcclxuICAgIGNvbnN0IGdvYWwgPSBTbW9NdXNpYy50aW1lU2lnbmF0dXJlVG9UaWNrcyh0aGlzLnRpbWVTaWduYXR1cmUudGltZVNpZ25hdHVyZSk7XHJcbiAgICByZXR1cm4gKHRpY2tzIDwgZ29hbCk7XHJcbiAgfVxyXG5cclxuICBjbGVhckJlYW1Hcm91cHMoKSB7XHJcbiAgICB0aGlzLmJlYW1Hcm91cHMgPSBbXTtcclxuICB9XHJcblxyXG4gIC8vICMjIyB1cGRhdGVMeXJpY0ZvbnRcclxuICAvLyBVcGRhdGUgdGhlIGx5cmljIGZvbnQsIHdoaWNoIGlzIHRoZSBzYW1lIGZvciBhbGwgbHlyaWNzLlxyXG4gIHNldEx5cmljRm9udChmb250SW5mbzogRm9udEluZm8pIHtcclxuICAgIHRoaXMudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKG5vdGUpID0+IHtcclxuICAgICAgICBub3RlLnNldEx5cmljRm9udChmb250SW5mbyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHNldEx5cmljQWRqdXN0V2lkdGgoYWRqdXN0Tm90ZVdpZHRoOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnZvaWNlcy5mb3JFYWNoKCh2b2ljZSkgPT4ge1xyXG4gICAgICB2b2ljZS5ub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XHJcbiAgICAgICAgbm90ZS5zZXRMeXJpY0FkanVzdFdpZHRoKGFkanVzdE5vdGVXaWR0aCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRDaG9yZEFkanVzdFdpZHRoKGFkanVzdE5vdGVXaWR0aDogYm9vbGVhbikge1xyXG4gICAgdGhpcy52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgobm90ZSkgPT4ge1xyXG4gICAgICAgIG5vdGUuc2V0Q2hvcmRBZGp1c3RXaWR0aChhZGp1c3ROb3RlV2lkdGgpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gIyMjIHVwZGF0ZUx5cmljRm9udFxyXG4gIC8vIFVwZGF0ZSB0aGUgbHlyaWMgZm9udCwgd2hpY2ggaXMgdGhlIHNhbWUgZm9yIGFsbCBseXJpY3MuXHJcbiAgc2V0Q2hvcmRGb250KGZvbnRJbmZvOiBGb250SW5mbykge1xyXG4gICAgdGhpcy52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgobm90ZSkgPT4ge1xyXG4gICAgICAgIG5vdGUuc2V0Q2hvcmRGb250KGZvbnRJbmZvKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHR1cGxldE5vdGVzKHNtb1R1cGxldDogU21vVHVwbGV0KTogU21vTm90ZVtdIHtcclxuICAgIGxldCB0dXBsZXROb3RlczogU21vTm90ZVtdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gc21vVHVwbGV0LnN0YXJ0SW5kZXg7IGkgPD0gc21vVHVwbGV0LmVuZEluZGV4OyBpKyspIHtcclxuICAgICAgY29uc3Qgbm90ZSA9IHRoaXMudm9pY2VzW3Ntb1R1cGxldC52b2ljZV0ubm90ZXNbaV07XHJcbiAgICAgIHR1cGxldE5vdGVzLnB1c2gobm90ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHVwbGV0Tm90ZXM7XHJcbiAgfVxyXG5cclxuICBnZXRTdGVtRGlyZWN0aW9uRm9yVHVwbGV0KHNtb1R1cGxldDogU21vVHVwbGV0KSB7XHJcbiAgICBsZXQgbm90ZTogU21vTm90ZSB8IG51bGwgPSBudWxsO1xyXG4gICAgZm9yIChsZXQgY3VycmVudE5vdGUgb2YgdGhpcy50dXBsZXROb3RlcyhzbW9UdXBsZXQpKSB7XHJcbiAgICAgIGlmIChjdXJyZW50Tm90ZS5ub3RlVHlwZSA9PT0gJ24nKSB7XHJcbiAgICAgICAgbm90ZSA9IGN1cnJlbnROb3RlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFub3RlKSB7XHJcbiAgICAgIHJldHVybiBTbW9Ob3RlLmZsYWdTdGF0ZXMuZG93bjtcclxuICAgIH1cclxuICAgIGlmIChub3RlLmZsYWdTdGF0ZSAhPT0gU21vTm90ZS5mbGFnU3RhdGVzLmF1dG8pIHtcclxuICAgICAgcmV0dXJuIG5vdGUuZmxhZ1N0YXRlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFNtb011c2ljLnBpdGNoVG9MZWRnZXJMaW5lKHRoaXMuY2xlZiwgbm90ZS5waXRjaGVzWzBdKVxyXG4gICAgICA+PSAyID8gU21vTm90ZS5mbGFnU3RhdGVzLnVwIDogU21vTm90ZS5mbGFnU3RhdGVzLmRvd247XHJcbiAgfVxyXG4gIGdldE5vdGVCeUlkKGlkOiBzdHJpbmcpOiBTbW9Ob3RlIHwgbnVsbCB7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0gdGhpcy52b2ljZXNbaV07XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBjb25zdCBub3RlID0gdm9pY2Uubm90ZXNbal07XHJcbiAgICAgICAgaWYgKG5vdGUuYXR0cnMuaWQgPT09IGlkKSB7XHJcbiAgICAgICAgICByZXR1cm4gbm90ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICBzZXRDbGVmKGNsZWY6IENsZWYpIHtcclxuICAgIGNvbnN0IG9sZENsZWYgPSB0aGlzLmNsZWY7XHJcbiAgICB0aGlzLmNsZWYgPSBjbGVmO1xyXG4gICAgdGhpcy52b2ljZXMuZm9yRWFjaCgodm9pY2UpID0+IHtcclxuICAgICAgdm9pY2Uubm90ZXMuZm9yRWFjaCgobm90ZSkgPT4ge1xyXG4gICAgICAgIG5vdGUuY2xlZiA9IGNsZWY7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY2xlZiB0aGF0IHRoaXMgbWVhc3VyZSBlbmRzIHdpdGguXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZ2V0TGFzdENsZWYoKSB7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudm9pY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHZvaWNlID0gdGhpcy52b2ljZXNbaV07XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBjb25zdCBub3RlID0gdm9pY2Uubm90ZXNbal07XHJcbiAgICAgICAgaWYgKG5vdGUuY2xlZk5vdGUgJiYgbm90ZS5jbGVmTm90ZS5jbGVmICE9PSB0aGlzLmNsZWYpIHtcclxuICAgICAgICAgIHJldHVybiBub3RlLmNsZWZOb3RlLmNsZWY7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jbGVmO1xyXG4gIH1cclxuICBpc1Jlc3QoKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgdm9pY2UgPSB0aGlzLnZvaWNlc1tpXTtcclxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2b2ljZS5ub3Rlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGlmICghdm9pY2Uubm90ZXNbal0uaXNSZXN0KCkpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuICAvLyAjIyMgcG9wdWxhdGVWb2ljZVxyXG4gIC8vIENyZWF0ZSBhIG5ldyB2b2ljZSBpbiB0aGlzIG1lYXN1cmUsIGFuZCBwb3B1bGF0ZSBpdCB3aXRoIHRoZSBkZWZhdWx0IG5vdGVcclxuICAvLyBmb3IgdGhpcyBtZWFzdXJlL2tleS9jbGVmXHJcbiAgcG9wdWxhdGVWb2ljZShpbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAoaW5kZXggIT09IHRoaXMudm9pY2VzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnZvaWNlcy5wdXNoKHsgbm90ZXM6IFNtb01lYXN1cmUuZ2V0RGVmYXVsdE5vdGVzKHRoaXMpIH0pO1xyXG4gICAgdGhpcy5hY3RpdmVWb2ljZSA9IGluZGV4O1xyXG4gIH1cclxuICBwcml2YXRlIF9yZW1vdmVTaW5nbGV0b25Nb2RpZmllcihuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGFyID0gdGhpcy5tb2RpZmllcnMuZmlsdGVyKG9iaiA9PiBvYmouYXR0cnMudHlwZSAhPT0gbmFtZSk7XHJcbiAgICB0aGlzLm1vZGlmaWVycyA9IGFyO1xyXG4gIH1cclxuXHJcbiAgYWRkUmVoZWFyc2FsTWFyayhwYXJhbWV0ZXJzOiBTbW9SZWhlYXJzYWxNYXJrUGFyYW1zKSB7XHJcbiAgICB0aGlzLl9yZW1vdmVTaW5nbGV0b25Nb2RpZmllcignU21vUmVoZWFyc2FsTWFyaycpO1xyXG4gICAgdGhpcy5tb2RpZmllcnMucHVzaChuZXcgU21vUmVoZWFyc2FsTWFyayhwYXJhbWV0ZXJzKSk7XHJcbiAgfVxyXG4gIHJlbW92ZVJlaGVhcnNhbE1hcmsoKSB7XHJcbiAgICB0aGlzLl9yZW1vdmVTaW5nbGV0b25Nb2RpZmllcignU21vUmVoZWFyc2FsTWFyaycpO1xyXG4gIH1cclxuICBnZXRSZWhlYXJzYWxNYXJrKCk6IFNtb01lYXN1cmVNb2RpZmllckJhc2UgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kaWZpZXJzLmZpbmQob2JqID0+IG9iai5hdHRycy50eXBlID09PSAnU21vUmVoZWFyc2FsTWFyaycpO1xyXG4gIH1cclxuICBnZXRNb2RpZmllcnNCeVR5cGUodHlwZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RpZmllcnMuZmlsdGVyKChtbSkgPT4gdHlwZSA9PT0gbW0uYXR0cnMudHlwZSk7XHJcbiAgfVxyXG5cclxuICBzZXRUZW1wbyhwYXJhbXM6IFNtb1RlbXBvVGV4dFBhcmFtcykge1xyXG4gICAgdGhpcy50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQocGFyYW1zKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0IG1lYXN1cmUgdGVtcG8gdG8gdGhlIGRlZmF1bHQge0BsaW5rIFNtb1RlbXBvVGV4dH1cclxuICAgKi9cclxuICByZXNldFRlbXBvKCkge1xyXG4gICAgdGhpcy50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQoU21vVGVtcG9UZXh0LmRlZmF1bHRzKTtcclxuICB9XHJcbiAgZ2V0VGVtcG8oKSB7XHJcbiAgICBpZiAodHlwZW9mICh0aGlzLnRlbXBvKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgdGhpcy50ZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQoU21vVGVtcG9UZXh0LmRlZmF1bHRzKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnRlbXBvO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBNZWFzdXJlIHRleHQgaXMgZGVwcmVjYXRlZCwgYW5kIG1heSBub3QgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuXHJcbiAgICogQmV0dGVyIHRvIHVzZSBTbW9UZXh0R3JvdXAgYW5kIGF0dGFjaCB0byB0aGUgbWVhc3VyZS5cclxuICAgKiBAcGFyYW0gbW9kIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFkZE1lYXN1cmVUZXh0KG1vZDogU21vTWVhc3VyZU1vZGlmaWVyQmFzZSkge1xyXG4gICAgdmFyIGV4aXN0ID0gdGhpcy5tb2RpZmllcnMuZmlsdGVyKChtbSkgPT5cclxuICAgICAgbW0uYXR0cnMuaWQgPT09IG1vZC5hdHRycy5pZFxyXG4gICAgKTtcclxuICAgIGlmIChleGlzdC5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb2RpZmllcnMucHVzaChtb2QpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWVhc3VyZVRleHQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RpZmllcnMuZmlsdGVyKG9iaiA9PiBvYmouY3RvciA9PT0gJ1Ntb01lYXN1cmVUZXh0Jyk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVNZWFzdXJlVGV4dChpZDogc3RyaW5nKSB7XHJcbiAgICB2YXIgYXIgPSB0aGlzLm1vZGlmaWVycy5maWx0ZXIob2JqID0+IG9iai5hdHRycy5pZCAhPT0gaWQpO1xyXG4gICAgdGhpcy5tb2RpZmllcnMgPSBhcjtcclxuICB9XHJcblxyXG4gIHNldFJlcGVhdFN5bWJvbChyczogU21vUmVwZWF0U3ltYm9sKSB7XHJcbiAgICBjb25zdCBhcjogU21vTWVhc3VyZU1vZGlmaWVyQmFzZVtdID0gW107XHJcbiAgICBsZXQgdG9BZGQgPSB0cnVlO1xyXG4gICAgY29uc3QgZXhTeW1ib2wgPSB0aGlzLmdldFJlcGVhdFN5bWJvbCgpO1xyXG4gICAgaWYgKGV4U3ltYm9sICYmIGV4U3ltYm9sLnN5bWJvbCA9PT0gcnMuc3ltYm9sKSB7XHJcbiAgICAgIHRvQWRkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBBZGRpbmcgJ05vbmUnIG1lYW5zIHJlbW92ZVxyXG4gICAgaWYgKHJzLnN5bWJvbCA9PT0gU21vUmVwZWF0U3ltYm9sLnN5bWJvbHNbJ05vbmUnXSkge1xyXG4gICAgICB0b0FkZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb2RpZmllcnMuZm9yRWFjaCgobW9kaWZpZXIpID0+IHtcclxuICAgICAgaWYgKG1vZGlmaWVyLmN0b3IgIT09ICdTbW9SZXBlYXRTeW1ib2wnKSB7XHJcbiAgICAgICAgYXIucHVzaChtb2RpZmllcik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5tb2RpZmllcnMgPSBhcjtcclxuICAgIGlmICh0b0FkZCkge1xyXG4gICAgICBhci5wdXNoKHJzKTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0UmVwZWF0U3ltYm9sKCk6IFNtb1JlcGVhdFN5bWJvbCB8IG51bGwge1xyXG4gICAgY29uc3QgcnYgPSB0aGlzLm1vZGlmaWVycy5maWx0ZXIob2JqID0+IG9iai5jdG9yID09PSAnU21vUmVwZWF0U3ltYm9sJyk7XHJcbiAgICBpZiAocnYubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gcnZbMF0gYXMgU21vUmVwZWF0U3ltYm9sO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIGdldCBpc1RvRGMoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBycyA9IHRoaXMuZ2V0UmVwZWF0U3ltYm9sKCk7XHJcbiAgICBpZiAocnMgJiYgXHJcbiAgICAgIChycy5zeW1ib2wgPT09IFNtb1JlcGVhdFN5bWJvbC5zeW1ib2xzWydEY0FsQ29kYSddIHx8XHJcbiAgICAgICBycy5zeW1ib2wgPT09IFNtb1JlcGVhdFN5bWJvbC5zeW1ib2xzWydEY0FsRmluZSddKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgZ2V0IGlzVG9EcygpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJzID0gdGhpcy5nZXRSZXBlYXRTeW1ib2woKTtcclxuICAgIGlmIChycyAmJiBcclxuICAgICAgKHJzLnN5bWJvbCA9PT0gU21vUmVwZWF0U3ltYm9sLnN5bWJvbHNbJ0RzQWxGaW5lJ10gfHxcclxuICAgICAgIHJzLnN5bWJvbCA9PT0gU21vUmVwZWF0U3ltYm9sLnN5bWJvbHNbJ0RzQWxDb2RhJ10pKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBnZXQgaXNTZWdubygpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJzID0gdGhpcy5nZXRSZXBlYXRTeW1ib2woKTtcclxuICAgIGlmIChycyAmJiBcclxuICAgICAgKHJzLnN5bWJvbCA9PT0gU21vUmVwZWF0U3ltYm9sLnN5bWJvbHNbJ1NlZ25vJ10pKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBnZXQgaXNDb2RhKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcnMgPSB0aGlzLmdldFJlcGVhdFN5bWJvbCgpO1xyXG4gICAgaWYgKHJzICYmIFxyXG4gICAgICAocnMuc3ltYm9sID09PSBTbW9SZXBlYXRTeW1ib2wuc3ltYm9sc1snQ29kYSddKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgZ2V0IGlzVG9Db2RhKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcnMgPSB0aGlzLmdldFJlcGVhdFN5bWJvbCgpO1xyXG4gICAgaWYgKHJzICYmIFxyXG4gICAgICAocnMuc3ltYm9sID09PSBTbW9SZXBlYXRTeW1ib2wuc3ltYm9sc1sndG9Db2RhJ10pKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAgZ2V0IGlzRmluZSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJzID0gdGhpcy5nZXRSZXBlYXRTeW1ib2woKTtcclxuICAgIGlmIChycyAmJiBcclxuICAgICAgKHJzLnN5bWJvbCA9PT0gU21vUmVwZWF0U3ltYm9sLnN5bWJvbHNbJ0ZpbmUnXSkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIGNsZWFyUmVwZWF0U3ltYm9scygpIHtcclxuICAgIGNvbnN0IGFyOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlW10gPSBbXTtcclxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyKSA9PiB7XHJcbiAgICAgIGlmIChtb2RpZmllci5jdG9yICE9PSAnU21vUmVwZWF0U3ltYm9sJykge1xyXG4gICAgICAgIGFyLnB1c2gobW9kaWZpZXIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gYXI7XHJcbiAgfVxyXG5cclxuICBzZXRCYXJsaW5lKGJhcmxpbmU6IFNtb0JhcmxpbmUpIHtcclxuICAgIHZhciBhcjogU21vTWVhc3VyZU1vZGlmaWVyQmFzZVtdID0gW107XHJcbiAgICB0aGlzLm1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xyXG4gICAgICBpZiAobW9kaWZpZXIuY3RvciA9PT0gJ1Ntb0JhcmxpbmUnKSB7XHJcbiAgICAgICAgY29uc3QgbyA9IG1vZGlmaWVyIGFzIFNtb0JhcmxpbmU7XHJcbiAgICAgICAgaWYgKG8ucG9zaXRpb24gIT09IGJhcmxpbmUucG9zaXRpb24pIHtcclxuICAgICAgICAgIGFyLnB1c2gobyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGFyLnB1c2gobW9kaWZpZXIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gYXI7XHJcbiAgICBhci5wdXNoKGJhcmxpbmUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0QmFybGluZShwb3M6IG51bWJlcik6IFNtb0JhcmxpbmUge1xyXG4gICAgbGV0IHJ2ID0gbnVsbDtcclxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyKSA9PiB7XHJcbiAgICAgIGlmIChtb2RpZmllci5jdG9yID09PSAnU21vQmFybGluZScgJiYgKG1vZGlmaWVyIGFzIFNtb0JhcmxpbmUpLnBvc2l0aW9uID09PSBwb3MpIHtcclxuICAgICAgICBydiA9IG1vZGlmaWVyO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChydiA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gbmV3IFNtb0JhcmxpbmUoU21vQmFybGluZS5kZWZhdWx0cyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG5cclxuICBnZXRFbmRCYXJsaW5lKCk6IFNtb0JhcmxpbmUgeyAgICBcclxuICAgIHJldHVybiB0aGlzLl9nZXRCYXJsaW5lKFNtb0JhcmxpbmUucG9zaXRpb25zLmVuZCk7XHJcbiAgfVxyXG4gIGdldFN0YXJ0QmFybGluZSgpOiBTbW9CYXJsaW5lIHtcclxuICAgIHJldHVybiB0aGlzLl9nZXRCYXJsaW5lKFNtb0JhcmxpbmUucG9zaXRpb25zLnN0YXJ0KTtcclxuICB9XHJcblxyXG4gIGFkZE50aEVuZGluZyhlbmRpbmc6IFNtb1ZvbHRhKSB7XHJcbiAgICBjb25zdCBtb2RzOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlW10gPSBbXTtcclxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlKSA9PiB7XHJcbiAgICAgIGlmIChtb2RpZmllci5jdG9yICE9PSAnU21vVm9sdGEnIHx8IChtb2RpZmllciBhcyBTbW9Wb2x0YSkuc3RhcnRCYXIgIT09IGVuZGluZy5zdGFydEJhciB8fFxyXG4gICAgICAgIChtb2RpZmllciBhcyBTbW9Wb2x0YSkuZW5kQmFyICE9PSBlbmRpbmcuZW5kQmFyKSB7XHJcbiAgICAgICAgbW9kcy5wdXNoKG1vZGlmaWVyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBtb2RzLnB1c2goZW5kaW5nKTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gbW9kcztcclxuICB9XHJcblxyXG4gIHJlbW92ZU50aEVuZGluZyhlbmRpbmc6IFNtb1ZvbHRhKSB7XHJcbiAgICBjb25zdCBtb2RzOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlW10gPSBbXTtcclxuICAgIHRoaXMubW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyKSA9PiB7XHJcbiAgICAgIGlmIChtb2RpZmllci5jdG9yID09PSAnU21vVm9sdGEnKSB7XHJcbiAgICAgICAgY29uc3Qgdm9sdGEgPSBtb2RpZmllciBhcyBTbW9Wb2x0YTtcclxuICAgICAgICBpZiAoZW5kaW5nLnN0YXJ0U2VsZWN0b3IgPT09IG51bGwgfHwgZW5kaW5nLmVuZFNlbGVjdG9yID09PSBudWxsIHx8IHZvbHRhLnN0YXJ0U2VsZWN0b3IgPT09IG51bGwgfHwgdm9sdGEuZW5kU2VsZWN0b3IgPT09IG51bGwpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFTbW9TZWxlY3Rvci5zYW1lTWVhc3VyZShlbmRpbmcuc3RhcnRTZWxlY3Rvciwgdm9sdGEuc3RhcnRTZWxlY3RvcikgfHwgIVNtb1NlbGVjdG9yLnNhbWVNZWFzdXJlKGVuZGluZy5lbmRTZWxlY3Rvciwgdm9sdGEuZW5kU2VsZWN0b3IpXHJcbiAgICAgICAgJiYgZW5kaW5nLm51bWJlciAhPT0gdm9sdGEubnVtYmVyKSB7XHJcbiAgICAgICAgICBtb2RzLnB1c2gobW9kaWZpZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtb2RzLnB1c2gobW9kaWZpZXIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMubW9kaWZpZXJzID0gbW9kcztcclxuICB9XHJcblxyXG4gIGdldE50aEVuZGluZ3MoKTogU21vVm9sdGFbXSB7XHJcbiAgICBjb25zdCBydjogU21vVm9sdGFbXSA9IFtdO1xyXG4gICAgdGhpcy5tb2RpZmllcnMuZm9yRWFjaCgobW9kaWZpZXI6IFNtb01lYXN1cmVNb2RpZmllckJhc2UpID0+IHtcclxuICAgICAgaWYgKG1vZGlmaWVyLmN0b3IgPT09ICdTbW9Wb2x0YScpIHtcclxuICAgICAgICBydi5wdXNoKG1vZGlmaWVyIGFzIFNtb1ZvbHRhKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIHNldEtleVNpZ25hdHVyZShzaWc6IHN0cmluZykge1xyXG4gICAgdGhpcy5rZXlTaWduYXR1cmUgPSBzaWc7XHJcbiAgICB0aGlzLnZvaWNlcy5mb3JFYWNoKCh2b2ljZSkgPT4ge1xyXG4gICAgICB2b2ljZS5ub3Rlcy5mb3JFYWNoKChub3RlKSA9PiB7XHJcbiAgICAgICAgbm90ZS5rZXlTaWduYXR1cmUgPSBzaWc7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHNldE1lYXN1cmVOdW1iZXIobnVtOiBNZWFzdXJlTnVtYmVyKSB7XHJcbiAgICB0aGlzLm1lYXN1cmVOdW1iZXIgPSBudW07XHJcbiAgfVxyXG4gIGdldEJlYW1Hcm91cEZvck5vdGUobm90ZTogU21vTm90ZSkge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IGogPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYmVhbUdyb3Vwcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBiZyA9IHRoaXMuYmVhbUdyb3Vwc1tpXTtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IGJnLm5vdGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgaWYgKGJnLm5vdGVzW2pdLmF0dHJzLmlkID09PSBub3RlLmF0dHJzLmlkKSB7XHJcbiAgICAgICAgICByZXR1cm4gYmc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/smo/data/measure.ts\n\n}");
515
515
 
516
516
  /***/ }),
517
517
 
@@ -1965,7 +1965,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
1965
1965
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1966
1966
 
1967
1967
  "use strict";
1968
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiVoiceMenu: () => (/* binding */ SuiVoiceMenu)\n/* harmony export */ });\n/* harmony import */ var _menu__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./menu */ \"./src/ui/menus/menu.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n/**\n * Add, select, delete and change voices\n * @category SuiMenu\n */\nclass SuiVoiceMenu extends _menu__WEBPACK_IMPORTED_MODULE_0__.SuiConfiguredMenu {\n constructor(params) {\n super(params, 'Voices', SuiVoiceMenuOptions);\n const measures = this.view.tracker.getSelectedMeasures();\n if (measures.length > 0) {\n const sel = measures[0];\n const swaps = sel.measure.getSwapVoicePairs();\n swaps.forEach((pair) => {\n this.menuOptions.push(new voiceSwapperMenuOption(pair[0], pair[1]));\n });\n }\n }\n}\nclass voiceSwapperMenuOption {\n get menuChoice() {\n return {\n icon: '',\n text: this.label,\n value: this.cmd\n };\n }\n constructor(voice1, voice2) {\n this.voice1 = voice1;\n this.voice2 = voice2;\n this.label = `Swap ${voice1} and ${voice2}`;\n this.cmd = `${voice1}To${voice2}`;\n }\n handler(menu) {\n return __awaiter(this, void 0, void 0, function* () {\n menu.view.swapVoices(this.voice1, this.voice2);\n });\n }\n display() {\n return true;\n }\n}\n/**\n * @category SuiMenu\n */\nconst selectVoiceOneMenuOption = {\n handler: (menu) => __awaiter(void 0, void 0, void 0, function* () {\n menu.view.populateVoice(0);\n }), display: (menu) => {\n for (let i = 0; i < menu.view.tracker.selections.length; ++i) {\n const mm = menu.view.tracker.selections[i].measure;\n if (mm.voices.length > 1) {\n return true;\n }\n }\n return false;\n },\n menuChoice: {\n icon: '',\n text: 'Voice 1',\n value: 'voiceOne'\n }\n};\n/**\n * @category SuiMenu\n */\nconst selectVoiceTwoMenuOption = {\n handler: (menu) => __awaiter(void 0, void 0, void 0, function* () {\n menu.view.populateVoice(1);\n }), display: (menu) => {\n for (let i = 0; i < menu.view.tracker.selections.length; ++i) {\n const mm = menu.view.tracker.selections[i].measure;\n if (mm.voices.length < 4) {\n return true;\n }\n }\n return false;\n },\n menuChoice: {\n icon: '',\n text: 'Voice 2',\n value: 'voiceTwo'\n }\n};\n/**\n * @category SuiMenu\n */\nconst selectVoiceThreeMenuOption = {\n handler: (menu) => __awaiter(void 0, void 0, void 0, function* () {\n menu.view.populateVoice(2);\n }), display: (menu) => {\n for (let i = 0; i < menu.view.tracker.selections.length; ++i) {\n const mm = menu.view.tracker.selections[i].measure;\n if (mm.voices.length < 4 && mm.voices.length > 1) {\n return true;\n }\n }\n return false;\n },\n menuChoice: {\n icon: '',\n text: 'Voice 3',\n value: 'voiceThree'\n }\n};\n/**\n * @category SuiMenu\n */\nconst selectVoiceFourMenuOption = {\n handler: (menu) => __awaiter(void 0, void 0, void 0, function* () {\n menu.view.populateVoice(3);\n }), display: (menu) => {\n for (let i = 0; i < menu.view.tracker.selections.length; ++i) {\n const mm = menu.view.tracker.selections[i].measure;\n if (mm.voices.length < 4 && mm.voices.length > 2) {\n return true;\n }\n }\n return false;\n },\n menuChoice: {\n icon: '',\n text: 'Voice 4',\n value: 'voiceFour'\n }\n};\n/**\n * @category SuiMenu\n */\nconst removeVoiceMenuOption = {\n handler: (menu) => __awaiter(void 0, void 0, void 0, function* () {\n menu.view.depopulateVoice();\n }), display: (menu) => {\n for (let i = 0; i < menu.view.tracker.selections.length; ++i) {\n const mm = menu.view.tracker.selections[i].measure;\n if (mm.activeVoice > 0) {\n return true;\n }\n }\n return false;\n },\n menuChoice: {\n icon: '',\n text: 'Remove Voice',\n value: 'removeVoice'\n }\n};\n/**\n * voice editing options (parallel voices in same stave)\n * @category SuiMenu\n */\nconst SuiVoiceMenuOptions = [\n selectVoiceOneMenuOption, selectVoiceTwoMenuOption, selectVoiceThreeMenuOption, selectVoiceFourMenuOption,\n removeVoiceMenuOption\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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TyxFQUFFLENBQU8sSUFBaUIsRUFBRSxFQUFFO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDOUIsQ0FBQyxHQUFFLE9BQU8sRUFBRSxDQUFDLElBQWlCLEVBQUUsRUFBRTtRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzdELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbkQsSUFBSSxFQUFFLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2QixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsSUFBSSxFQUFFLEVBQUU7UUFDUixJQUFJLEVBQUUsY0FBYztRQUNwQixLQUFLLEVBQUUsYUFBYTtLQUNyQjtDQUNGO0FBQ0Q7OztHQUdHO0FBQ0gsTUFBTSxtQkFBbUIsR0FBOEI7SUFDckQsd0JBQXdCLEVBQUUsd0JBQXdCLEVBQUUsMEJBQTBCLEVBQUUseUJBQXlCO0lBQ3pHLHFCQUFxQjtDQUN0QixDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3VpL21lbnVzL3ZvaWNlcy50cz8xYTcyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1aU1lbnVCYXNlLCBTdWlNZW51UGFyYW1zLCBNZW51RGVmaW5pdGlvbiwgU3VpTWVudUhhbmRsZXIsIFN1aU1lbnVTaG93T3B0aW9uLCBcclxuICBTdWlDb25maWd1cmVkTWVudU9wdGlvbiwgU3VpQ29uZmlndXJlZE1lbnUsIE1lbnVDaG9pY2VEZWZpbml0aW9uIH0gZnJvbSAnLi9tZW51JztcclxuaW1wb3J0IHsgY3JlYXRlQW5kRGlzcGxheURpYWxvZyB9IGZyb20gJy4uL2RpYWxvZ3MvZGlhbG9nJztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuLyoqXHJcbiAqIEFkZCwgc2VsZWN0LCBkZWxldGUgYW5kIGNoYW5nZSB2b2ljZXNcclxuICogQGNhdGVnb3J5IFN1aU1lbnVcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdWlWb2ljZU1lbnUgZXh0ZW5kcyBTdWlDb25maWd1cmVkTWVudSB7XHJcbiAgY29uc3RydWN0b3IocGFyYW1zOiBTdWlNZW51UGFyYW1zKSB7XHJcbiAgICBzdXBlcihwYXJhbXMsICdWb2ljZXMnLCBTdWlWb2ljZU1lbnVPcHRpb25zKTtcclxuICAgIGNvbnN0IG1lYXN1cmVzID0gdGhpcy52aWV3LnRyYWNrZXIuZ2V0U2VsZWN0ZWRNZWFzdXJlcygpO1xyXG4gICAgaWYgKG1lYXN1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3Qgc2VsID0gbWVhc3VyZXNbMF07XHJcbiAgICAgIGNvbnN0IHN3YXBzID0gc2VsLm1lYXN1cmUuZ2V0U3dhcFZvaWNlUGFpcnMoKTtcclxuICAgICAgc3dhcHMuZm9yRWFjaCgocGFpcjogbnVtYmVyW10pID0+IHtcclxuICAgICAgICB0aGlzLm1lbnVPcHRpb25zLnB1c2gobmV3IHZvaWNlU3dhcHBlck1lbnVPcHRpb24ocGFpclswXSwgcGFpclsxXSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuY2xhc3Mgdm9pY2VTd2FwcGVyTWVudU9wdGlvbiBpbXBsZW1lbnRzIFN1aUNvbmZpZ3VyZWRNZW51T3B0aW9uIHtcclxuICB2b2ljZTE6IG51bWJlcjtcclxuICB2b2ljZTI6IG51bWJlcjtcclxuICBjbWQ6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIGdldCBtZW51Q2hvaWNlKCk6IE1lbnVDaG9pY2VEZWZpbml0aW9uICB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpY29uOiAnJyxcclxuICAgICAgdGV4dDogdGhpcy5sYWJlbCxcclxuICAgICAgdmFsdWU6IHRoaXMuY21kXHJcbiAgICB9XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKHZvaWNlMTogbnVtYmVyLCB2b2ljZTI6IG51bWJlcikge1xyXG4gICAgdGhpcy52b2ljZTEgPSB2b2ljZTE7XHJcbiAgICB0aGlzLnZvaWNlMiA9IHZvaWNlMjtcclxuICAgIHRoaXMubGFiZWwgPSBgU3dhcCAke3ZvaWNlMX0gYW5kICR7dm9pY2UyfWA7XHJcbiAgICB0aGlzLmNtZCA9IGAke3ZvaWNlMX1UbyR7dm9pY2UyfWA7XHJcbiAgfVxyXG4gIGFzeW5jIGhhbmRsZXIobWVudTogU3VpTWVudUJhc2UpIHtcclxuICAgIG1lbnUudmlldy5zd2FwVm9pY2VzKHRoaXMudm9pY2UxLCB0aGlzLnZvaWNlMik7XHJcbiAgfVxyXG4gIGRpc3BsYXkoKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTdWlNZW51XHJcbiAqL1xyXG5jb25zdCBzZWxlY3RWb2ljZU9uZU1lbnVPcHRpb246IFN1aUNvbmZpZ3VyZWRNZW51T3B0aW9uID0ge1xyXG4gIGhhbmRsZXI6IGFzeW5jIChtZW51OiBTdWlNZW51QmFzZSkgPT4ge1xyXG4gICAgbWVudS52aWV3LnBvcHVsYXRlVm9pY2UoMCk7XHJcbiAgfSwgZGlzcGxheTogKG1lbnU6IFN1aU1lbnVCYXNlKSA9PiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lbnUudmlldy50cmFja2VyLnNlbGVjdGlvbnMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgbW0gPSBtZW51LnZpZXcudHJhY2tlci5zZWxlY3Rpb25zW2ldLm1lYXN1cmU7XHJcbiAgICAgIGlmIChtbS52b2ljZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfSxcclxuICBtZW51Q2hvaWNlOiB7XHJcbiAgICBpY29uOiAnJyxcclxuICAgIHRleHQ6ICdWb2ljZSAxJyxcclxuICAgIHZhbHVlOiAndm9pY2VPbmUnXHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpTWVudVxyXG4gKi9cclxuY29uc3Qgc2VsZWN0Vm9pY2VUd29NZW51T3B0aW9uOiBTdWlDb25maWd1cmVkTWVudU9wdGlvbiA9IHtcclxuICBoYW5kbGVyOiBhc3luYyAobWVudTogU3VpTWVudUJhc2UpID0+IHtcclxuICAgIG1lbnUudmlldy5wb3B1bGF0ZVZvaWNlKDEpO1xyXG4gIH0sIGRpc3BsYXk6IChtZW51OiBTdWlNZW51QmFzZSkgPT4ge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZW51LnZpZXcudHJhY2tlci5zZWxlY3Rpb25zLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG1tID0gbWVudS52aWV3LnRyYWNrZXIuc2VsZWN0aW9uc1tpXS5tZWFzdXJlO1xyXG4gICAgICBpZiAobW0udm9pY2VzLmxlbmd0aCA8IDQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH0sXHJcbiAgbWVudUNob2ljZToge1xyXG4gICAgaWNvbjogJycsXHJcbiAgICB0ZXh0OiAnVm9pY2UgMicsXHJcbiAgICB2YWx1ZTogJ3ZvaWNlVHdvJ1xyXG4gIH1cclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFN1aU1lbnVcclxuICovXHJcbmNvbnN0IHNlbGVjdFZvaWNlVGhyZWVNZW51T3B0aW9uOiBTdWlDb25maWd1cmVkTWVudU9wdGlvbiA9IHtcclxuICBoYW5kbGVyOiBhc3luYyAobWVudTogU3VpTWVudUJhc2UpID0+IHtcclxuICAgIG1lbnUudmlldy5wb3B1bGF0ZVZvaWNlKDIpO1xyXG4gIH0sIGRpc3BsYXk6IChtZW51OiBTdWlNZW51QmFzZSkgPT4ge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZW51LnZpZXcudHJhY2tlci5zZWxlY3Rpb25zLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG1tID0gbWVudS52aWV3LnRyYWNrZXIuc2VsZWN0aW9uc1tpXS5tZWFzdXJlO1xyXG4gICAgICBpZiAobW0udm9pY2VzLmxlbmd0aCA8IDQgJiYgbW0udm9pY2VzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH0sXHJcbiAgbWVudUNob2ljZToge1xyXG4gICAgaWNvbjogJycsXHJcbiAgICB0ZXh0OiAnVm9pY2UgMycsXHJcbiAgICB2YWx1ZTogJ3ZvaWNlVGhyZWUnXHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpTWVudVxyXG4gKi9cclxuY29uc3Qgc2VsZWN0Vm9pY2VGb3VyTWVudU9wdGlvbjogU3VpQ29uZmlndXJlZE1lbnVPcHRpb24gPSB7XHJcbiAgaGFuZGxlcjogYXN5bmMgKG1lbnU6IFN1aU1lbnVCYXNlKSA9PiB7XHJcbiAgICBtZW51LnZpZXcucG9wdWxhdGVWb2ljZSgzKTtcclxuICB9LCBkaXNwbGF5OiAobWVudTogU3VpTWVudUJhc2UpID0+IHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVudS52aWV3LnRyYWNrZXIuc2VsZWN0aW9ucy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBtbSA9IG1lbnUudmlldy50cmFja2VyLnNlbGVjdGlvbnNbaV0ubWVhc3VyZTtcclxuICAgICAgaWYgKG1tLnZvaWNlcy5sZW5ndGggPCA0ICYmIG1tLnZvaWNlcy5sZW5ndGggPiAyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9LFxyXG4gIG1lbnVDaG9pY2U6IHtcclxuICAgIGljb246ICcnLFxyXG4gICAgdGV4dDogJ1ZvaWNlIDQnLFxyXG4gICAgdmFsdWU6ICd2b2ljZUZvdXInXHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpTWVudVxyXG4gKi9cclxuY29uc3QgcmVtb3ZlVm9pY2VNZW51T3B0aW9uOiBTdWlDb25maWd1cmVkTWVudU9wdGlvbiA9IHtcclxuICBoYW5kbGVyOiBhc3luYyAobWVudTogU3VpTWVudUJhc2UpID0+IHtcclxuICAgIG1lbnUudmlldy5kZXBvcHVsYXRlVm9pY2UoKTtcclxuICB9LCBkaXNwbGF5OiAobWVudTogU3VpTWVudUJhc2UpID0+IHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVudS52aWV3LnRyYWNrZXIuc2VsZWN0aW9ucy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBtbSA9IG1lbnUudmlldy50cmFja2VyLnNlbGVjdGlvbnNbaV0ubWVhc3VyZTtcclxuICAgICAgaWYgKG1tLmFjdGl2ZVZvaWNlID4gMCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfSxcclxuICBtZW51Q2hvaWNlOiB7XHJcbiAgICBpY29uOiAnJyxcclxuICAgIHRleHQ6ICdSZW1vdmUgVm9pY2UnLFxyXG4gICAgdmFsdWU6ICdyZW1vdmVWb2ljZSdcclxuICB9XHJcbn1cclxuLyoqXHJcbiAqIHZvaWNlIGVkaXRpbmcgb3B0aW9ucyAocGFyYWxsZWwgdm9pY2VzIGluIHNhbWUgc3RhdmUpXHJcbiAqIEBjYXRlZ29yeSBTdWlNZW51XHJcbiAqL1xyXG5jb25zdCBTdWlWb2ljZU1lbnVPcHRpb25zOiBTdWlDb25maWd1cmVkTWVudU9wdGlvbltdID0gW1xyXG4gIHNlbGVjdFZvaWNlT25lTWVudU9wdGlvbiwgc2VsZWN0Vm9pY2VUd29NZW51T3B0aW9uLCBzZWxlY3RWb2ljZVRocmVlTWVudU9wdGlvbiwgc2VsZWN0Vm9pY2VGb3VyTWVudU9wdGlvbixcclxuICByZW1vdmVWb2ljZU1lbnVPcHRpb25cclxuXTtcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/ui/menus/voices.ts\n\n}");
1968
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiVoiceMenu: () => (/* binding */ SuiVoiceMenu)\n/* harmony export */ });\n/* harmony import */ var _menu__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./menu */ \"./src/ui/menus/menu.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n/**\n * Add, select, delete and change voices\n * @category SuiMenu\n */\nclass SuiVoiceMenu extends _menu__WEBPACK_IMPORTED_MODULE_0__.SuiConfiguredMenu {\n constructor(params) {\n super(params, 'Voices', SuiVoiceMenuOptions);\n }\n}\nclass voiceSwapperMenuOption {\n get menuChoice() {\n return {\n icon: '',\n text: this.label,\n value: this.cmd\n };\n }\n constructor(voice1, voice2) {\n this.voice1 = voice1;\n this.voice2 = voice2;\n this.label = `Swap ${voice1 + 1} and ${voice2 + 1}`;\n this.cmd = `${voice1}To${voice2}`;\n }\n handler(menu) {\n return __awaiter(this, void 0, void 0, function* () {\n menu.view.swapVoices(this.voice1, this.voice2);\n });\n }\n display(menu) {\n const measures = menu.view.tracker.getSelectedMeasures();\n if (measures.length > 0) {\n const sel = measures[0];\n const swaps = sel.measure.getSwapVoicePairs();\n for (let i = 0; i < swaps.length; ++i) {\n const pair = swaps[i];\n if (this.voice1 == pair[0] && this.voice2 == pair[1]) {\n return true;\n }\n }\n }\n return false;\n }\n}\nclass selectVoiceMenuOption {\n constructor(voice) {\n this.voice = voice;\n }\n handler(menu) {\n return __awaiter(this, void 0, void 0, function* () {\n yield menu.view.populateVoice(this.voice);\n });\n }\n display(menu) {\n for (let i = 0; i < menu.view.tracker.selections.length; ++i) {\n const mm = menu.view.tracker.selections[i].measure;\n if (mm.voices.length === 1) {\n return this.voice === 1;\n }\n // If there are n voices, and I am n+1, show option\n if (mm.voices.length === this.voice) {\n return true;\n }\n if (mm.voices.length > this.voice && mm.getActiveVoice() !== this.voice) {\n return true;\n }\n }\n return false;\n }\n get menuChoice() {\n return {\n icon: '',\n text: `Voice ${this.voice + 1}`,\n value: `voice${this.voice.toString()}`\n };\n }\n}\n/**\n * @category SuiMenu\n */\nconst selectVoiceOneMenuOption = {\n handler: (menu) => __awaiter(void 0, void 0, void 0, function* () {\n yield menu.view.populateVoice(0);\n }), display: (menu) => {\n for (let i = 0; i < menu.view.tracker.selections.length; ++i) {\n const mm = menu.view.tracker.selections[i].measure;\n if (mm.voices.length > 1) {\n return true;\n }\n }\n return false;\n },\n menuChoice: {\n icon: '',\n text: 'Voice 1',\n value: 'voiceOne'\n }\n};\n/**\n * @category SuiMenu\n */\nconst selectVoiceTwoMenuOption = {\n handler: (menu) => __awaiter(void 0, void 0, void 0, function* () {\n yield menu.view.populateVoice(1);\n }), display: (menu) => {\n for (let i = 0; i < menu.view.tracker.selections.length; ++i) {\n const mm = menu.view.tracker.selections[i].measure;\n if (mm.voices.length <= 4 && mm.voices.length > 1) {\n return true;\n }\n }\n return false;\n },\n menuChoice: {\n icon: '',\n text: 'Voice 2',\n value: 'voiceTwo'\n }\n};\n/**\n * @category SuiMenu\n */\nconst selectVoiceThreeMenuOption = {\n handler: (menu) => __awaiter(void 0, void 0, void 0, function* () {\n yield menu.view.populateVoice(2);\n }), display: (menu) => {\n for (let i = 0; i < menu.view.tracker.selections.length; ++i) {\n const mm = menu.view.tracker.selections[i].measure;\n if (mm.voices.length < 4 && mm.voices.length > 1) {\n return true;\n }\n }\n return false;\n },\n menuChoice: {\n icon: '',\n text: 'Voice 3',\n value: 'voiceThree'\n }\n};\n/**\n * @category SuiMenu\n */\nconst selectVoiceFourMenuOption = {\n handler: (menu) => __awaiter(void 0, void 0, void 0, function* () {\n yield menu.view.populateVoice(3);\n }), display: (menu) => {\n for (let i = 0; i < menu.view.tracker.selections.length; ++i) {\n const mm = menu.view.tracker.selections[i].measure;\n if (mm.voices.length < 4 && mm.voices.length > 2) {\n return true;\n }\n }\n return false;\n },\n menuChoice: {\n icon: '',\n text: 'Voice 4',\n value: 'voiceFour'\n }\n};\n/**\n * @category SuiMenu\n */\nconst removeVoiceMenuOption = {\n handler: (menu) => __awaiter(void 0, void 0, void 0, function* () {\n yield menu.view.depopulateVoice();\n }), display: (menu) => {\n for (let i = 0; i < menu.view.tracker.selections.length; ++i) {\n const mm = menu.view.tracker.selections[i].measure;\n if (mm.activeVoice > 0) {\n return true;\n }\n }\n return false;\n },\n menuChoice: {\n icon: '',\n text: 'Remove Voice',\n value: 'removeVoice'\n }\n};\n/**\n * voice editing options (parallel voices in same stave)\n * @category SuiMenu\n */\nconst SuiVoiceMenuOptions = [\n new selectVoiceMenuOption(0),\n new selectVoiceMenuOption(1),\n new selectVoiceMenuOption(2),\n new selectVoiceMenuOption(3),\n new voiceSwapperMenuOption(0, 1),\n new voiceSwapperMenuOption(0, 2),\n new voiceSwapperMenuOption(0, 3),\n new voiceSwapperMenuOption(1, 2),\n new voiceSwapperMenuOption(1, 3),\n new voiceSwapperMenuOption(2, 3),\n removeVoiceMenuOption\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMsQ0FBQztJQUM1QixJQUFJLHFCQUFxQixDQUFDLENBQUMsQ0FBQztJQUM1QixJQUFJLHFCQUFxQixDQUFDLENBQUMsQ0FBQztJQUMzQixJQUFJLHNCQUFzQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEMsSUFBSSxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLElBQUksc0JBQXNCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQyxJQUFJLHNCQUFzQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEMsSUFBSSxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLElBQUksc0JBQXNCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQyxxQkFBcUI7Q0FDdEIsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy91aS9tZW51cy92b2ljZXMudHM/MWE3MiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWlNZW51QmFzZSwgU3VpTWVudVBhcmFtcywgTWVudURlZmluaXRpb24sIFN1aU1lbnVIYW5kbGVyLCBTdWlNZW51U2hvd09wdGlvbiwgXHJcbiAgU3VpQ29uZmlndXJlZE1lbnVPcHRpb24sIFN1aUNvbmZpZ3VyZWRNZW51LCBNZW51Q2hvaWNlRGVmaW5pdGlvbiB9IGZyb20gJy4vbWVudSc7XHJcbmltcG9ydCB7IGNyZWF0ZUFuZERpc3BsYXlEaWFsb2cgfSBmcm9tICcuLi9kaWFsb2dzL2RpYWxvZyc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcbi8qKlxyXG4gKiBBZGQsIHNlbGVjdCwgZGVsZXRlIGFuZCBjaGFuZ2Ugdm9pY2VzXHJcbiAqIEBjYXRlZ29yeSBTdWlNZW51XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpVm9pY2VNZW51IGV4dGVuZHMgU3VpQ29uZmlndXJlZE1lbnUge1xyXG4gIGNvbnN0cnVjdG9yKHBhcmFtczogU3VpTWVudVBhcmFtcykge1xyXG4gICAgc3VwZXIocGFyYW1zLCAnVm9pY2VzJywgU3VpVm9pY2VNZW51T3B0aW9ucyk7XHJcbiAgfVxyXG59XHJcbmNsYXNzIHZvaWNlU3dhcHBlck1lbnVPcHRpb24gaW1wbGVtZW50cyBTdWlDb25maWd1cmVkTWVudU9wdGlvbiB7XHJcbiAgdm9pY2UxOiBudW1iZXI7XHJcbiAgdm9pY2UyOiBudW1iZXI7XHJcbiAgY21kOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBnZXQgbWVudUNob2ljZSgpOiBNZW51Q2hvaWNlRGVmaW5pdGlvbiAge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWNvbjogJycsXHJcbiAgICAgIHRleHQ6IHRoaXMubGFiZWwsXHJcbiAgICAgIHZhbHVlOiB0aGlzLmNtZFxyXG4gICAgfVxyXG4gIH1cclxuICBjb25zdHJ1Y3Rvcih2b2ljZTE6IG51bWJlciwgdm9pY2UyOiBudW1iZXIpIHtcclxuICAgIHRoaXMudm9pY2UxID0gdm9pY2UxO1xyXG4gICAgdGhpcy52b2ljZTIgPSB2b2ljZTI7XHJcbiAgICB0aGlzLmxhYmVsID0gYFN3YXAgJHt2b2ljZTEgKyAxfSBhbmQgJHt2b2ljZTIgKyAxfWA7XHJcbiAgICB0aGlzLmNtZCA9IGAke3ZvaWNlMX1UbyR7dm9pY2UyfWA7XHJcbiAgfVxyXG4gIGFzeW5jIGhhbmRsZXIobWVudTogU3VpTWVudUJhc2UpIHtcclxuICAgIG1lbnUudmlldy5zd2FwVm9pY2VzKHRoaXMudm9pY2UxLCB0aGlzLnZvaWNlMik7XHJcbiAgfVxyXG4gIGRpc3BsYXkobWVudTogU3VpTWVudUJhc2UpIHtcclxuICAgIGNvbnN0IG1lYXN1cmVzID0gbWVudS52aWV3LnRyYWNrZXIuZ2V0U2VsZWN0ZWRNZWFzdXJlcygpO1xyXG4gICAgaWYgKG1lYXN1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBzZWwgPSBtZWFzdXJlc1swXTtcclxuICAgICAgICBjb25zdCBzd2FwcyA9IHNlbC5tZWFzdXJlLmdldFN3YXBWb2ljZVBhaXJzKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzd2Fwcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgY29uc3QgcGFpciA9IHN3YXBzW2ldO1xyXG4gICAgICAgICAgaWYgKHRoaXMudm9pY2UxID09IHBhaXJbMF0gJiYgdGhpcy52b2ljZTIgPT0gcGFpclsxXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG5jbGFzcyBzZWxlY3RWb2ljZU1lbnVPcHRpb24gaW1wbGVtZW50cyBTdWlDb25maWd1cmVkTWVudU9wdGlvbiB7XHJcbiAgdm9pY2U6IG51bWJlcjtcclxuICBjb25zdHJ1Y3Rvcih2b2ljZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnZvaWNlID0gdm9pY2U7XHJcbiAgfVxyXG4gIGFzeW5jIGhhbmRsZXIgKG1lbnU6IFN1aU1lbnVCYXNlKSAge1xyXG4gICAgYXdhaXQgbWVudS52aWV3LnBvcHVsYXRlVm9pY2UodGhpcy52b2ljZSk7XHJcbiAgfVxyXG4gIGRpc3BsYXkgKG1lbnU6IFN1aU1lbnVCYXNlKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lbnUudmlldy50cmFja2VyLnNlbGVjdGlvbnMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgbW0gPSBtZW51LnZpZXcudHJhY2tlci5zZWxlY3Rpb25zW2ldLm1lYXN1cmU7XHJcbiAgICAgIGlmIChtbS52b2ljZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2UgPT09IDE7XHJcbiAgICAgIH1cclxuICAgICAgLy8gSWYgdGhlcmUgYXJlIG4gdm9pY2VzLCBhbmQgSSBhbSBuKzEsIHNob3cgb3B0aW9uXHJcbiAgICAgIGlmIChtbS52b2ljZXMubGVuZ3RoID09PSB0aGlzLnZvaWNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG1tLnZvaWNlcy5sZW5ndGggPiB0aGlzLnZvaWNlICYmIG1tLmdldEFjdGl2ZVZvaWNlKCkgIT09IHRoaXMudm9pY2UpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBnZXQgbWVudUNob2ljZSgpICB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpY29uOiAnJyxcclxuICAgICAgdGV4dDogYFZvaWNlICR7dGhpcy52b2ljZSArIDF9YCxcclxuICAgICAgdmFsdWU6IGB2b2ljZSR7dGhpcy52b2ljZS50b1N0cmluZygpfWBcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpTWVudVxyXG4gKi9cclxuY29uc3Qgc2VsZWN0Vm9pY2VPbmVNZW51T3B0aW9uOiBTdWlDb25maWd1cmVkTWVudU9wdGlvbiA9IHtcclxuICBoYW5kbGVyOiBhc3luYyAobWVudTogU3VpTWVudUJhc2UpID0+IHtcclxuICAgIGF3YWl0IG1lbnUudmlldy5wb3B1bGF0ZVZvaWNlKDApO1xyXG4gIH0sIGRpc3BsYXk6IChtZW51OiBTdWlNZW51QmFzZSkgPT4ge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZW51LnZpZXcudHJhY2tlci5zZWxlY3Rpb25zLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG1tID0gbWVudS52aWV3LnRyYWNrZXIuc2VsZWN0aW9uc1tpXS5tZWFzdXJlO1xyXG4gICAgICBpZiAobW0udm9pY2VzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH0sXHJcbiAgbWVudUNob2ljZToge1xyXG4gICAgaWNvbjogJycsXHJcbiAgICB0ZXh0OiAnVm9pY2UgMScsXHJcbiAgICB2YWx1ZTogJ3ZvaWNlT25lJ1xyXG4gIH1cclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFN1aU1lbnVcclxuICovXHJcbmNvbnN0IHNlbGVjdFZvaWNlVHdvTWVudU9wdGlvbjogU3VpQ29uZmlndXJlZE1lbnVPcHRpb24gPSB7XHJcbiAgaGFuZGxlcjogYXN5bmMgKG1lbnU6IFN1aU1lbnVCYXNlKSA9PiB7XHJcbiAgICBhd2FpdCBtZW51LnZpZXcucG9wdWxhdGVWb2ljZSgxKTtcclxuICB9LCBkaXNwbGF5OiAobWVudTogU3VpTWVudUJhc2UpID0+IHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVudS52aWV3LnRyYWNrZXIuc2VsZWN0aW9ucy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBtbSA9IG1lbnUudmlldy50cmFja2VyLnNlbGVjdGlvbnNbaV0ubWVhc3VyZTtcclxuICAgICAgaWYgKG1tLnZvaWNlcy5sZW5ndGggPD0gNCAmJiBtbS52b2ljZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfSxcclxuICBtZW51Q2hvaWNlOiB7XHJcbiAgICBpY29uOiAnJyxcclxuICAgIHRleHQ6ICdWb2ljZSAyJyxcclxuICAgIHZhbHVlOiAndm9pY2VUd28nXHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpTWVudVxyXG4gKi9cclxuY29uc3Qgc2VsZWN0Vm9pY2VUaHJlZU1lbnVPcHRpb246IFN1aUNvbmZpZ3VyZWRNZW51T3B0aW9uID0ge1xyXG4gIGhhbmRsZXI6IGFzeW5jIChtZW51OiBTdWlNZW51QmFzZSkgPT4ge1xyXG4gICAgYXdhaXQgbWVudS52aWV3LnBvcHVsYXRlVm9pY2UoMik7XHJcbiAgfSwgZGlzcGxheTogKG1lbnU6IFN1aU1lbnVCYXNlKSA9PiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lbnUudmlldy50cmFja2VyLnNlbGVjdGlvbnMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgbW0gPSBtZW51LnZpZXcudHJhY2tlci5zZWxlY3Rpb25zW2ldLm1lYXN1cmU7XHJcbiAgICAgIGlmIChtbS52b2ljZXMubGVuZ3RoIDwgNCAmJiBtbS52b2ljZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfSxcclxuICBtZW51Q2hvaWNlOiB7XHJcbiAgICBpY29uOiAnJyxcclxuICAgIHRleHQ6ICdWb2ljZSAzJyxcclxuICAgIHZhbHVlOiAndm9pY2VUaHJlZSdcclxuICB9XHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTdWlNZW51XHJcbiAqL1xyXG5jb25zdCBzZWxlY3RWb2ljZUZvdXJNZW51T3B0aW9uOiBTdWlDb25maWd1cmVkTWVudU9wdGlvbiA9IHtcclxuICBoYW5kbGVyOiBhc3luYyAobWVudTogU3VpTWVudUJhc2UpID0+IHtcclxuICAgIGF3YWl0IG1lbnUudmlldy5wb3B1bGF0ZVZvaWNlKDMpO1xyXG4gIH0sIGRpc3BsYXk6IChtZW51OiBTdWlNZW51QmFzZSkgPT4ge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZW51LnZpZXcudHJhY2tlci5zZWxlY3Rpb25zLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG1tID0gbWVudS52aWV3LnRyYWNrZXIuc2VsZWN0aW9uc1tpXS5tZWFzdXJlO1xyXG4gICAgICBpZiAobW0udm9pY2VzLmxlbmd0aCA8IDQgJiYgbW0udm9pY2VzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH0sXHJcbiAgbWVudUNob2ljZToge1xyXG4gICAgaWNvbjogJycsXHJcbiAgICB0ZXh0OiAnVm9pY2UgNCcsXHJcbiAgICB2YWx1ZTogJ3ZvaWNlRm91cidcclxuICB9XHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTdWlNZW51XHJcbiAqL1xyXG5jb25zdCByZW1vdmVWb2ljZU1lbnVPcHRpb246IFN1aUNvbmZpZ3VyZWRNZW51T3B0aW9uID0ge1xyXG4gIGhhbmRsZXI6IGFzeW5jIChtZW51OiBTdWlNZW51QmFzZSkgPT4ge1xyXG4gICAgYXdhaXQgbWVudS52aWV3LmRlcG9wdWxhdGVWb2ljZSgpO1xyXG4gIH0sIGRpc3BsYXk6IChtZW51OiBTdWlNZW51QmFzZSkgPT4ge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZW51LnZpZXcudHJhY2tlci5zZWxlY3Rpb25zLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG1tID0gbWVudS52aWV3LnRyYWNrZXIuc2VsZWN0aW9uc1tpXS5tZWFzdXJlO1xyXG4gICAgICBpZiAobW0uYWN0aXZlVm9pY2UgPiAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9LFxyXG4gIG1lbnVDaG9pY2U6IHtcclxuICAgIGljb246ICcnLFxyXG4gICAgdGV4dDogJ1JlbW92ZSBWb2ljZScsXHJcbiAgICB2YWx1ZTogJ3JlbW92ZVZvaWNlJ1xyXG4gIH1cclxufVxyXG4vKipcclxuICogdm9pY2UgZWRpdGluZyBvcHRpb25zIChwYXJhbGxlbCB2b2ljZXMgaW4gc2FtZSBzdGF2ZSlcclxuICogQGNhdGVnb3J5IFN1aU1lbnVcclxuICovXHJcbmNvbnN0IFN1aVZvaWNlTWVudU9wdGlvbnM6IFN1aUNvbmZpZ3VyZWRNZW51T3B0aW9uW10gPSBbXHJcbiAgbmV3IHNlbGVjdFZvaWNlTWVudU9wdGlvbigwKSxcclxuICBuZXcgc2VsZWN0Vm9pY2VNZW51T3B0aW9uKDEpLFxyXG4gIG5ldyBzZWxlY3RWb2ljZU1lbnVPcHRpb24oMiksXHJcbiAgbmV3IHNlbGVjdFZvaWNlTWVudU9wdGlvbigzKSxcclxuICAgbmV3IHZvaWNlU3dhcHBlck1lbnVPcHRpb24oMCwgMSksICBcclxuICAgbmV3IHZvaWNlU3dhcHBlck1lbnVPcHRpb24oMCwgMiksXHJcbiAgIG5ldyB2b2ljZVN3YXBwZXJNZW51T3B0aW9uKDAsIDMpLFxyXG4gICBuZXcgdm9pY2VTd2FwcGVyTWVudU9wdGlvbigxLCAyKSxcclxuICAgbmV3IHZvaWNlU3dhcHBlck1lbnVPcHRpb24oMSwgMyksXHJcbiAgIG5ldyB2b2ljZVN3YXBwZXJNZW51T3B0aW9uKDIsIDMpLFxyXG4gIHJlbW92ZVZvaWNlTWVudU9wdGlvblxyXG5dO1xyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/menus/voices.ts\n\n}");
1969
1969
 
1970
1970
  /***/ }),
1971
1971