smoosic 1.0.32 → 1.0.33

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
@@ -1336,7 +1336,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
1336
1336
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1337
1337
 
1338
1338
  "use strict";
1339
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiScoreView: () => (/* binding */ SuiScoreView)\n/* harmony export */ });\n/* harmony import */ var _smo_data_score__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/score */ \"./src/smo/data/score.ts\");\n/* harmony import */ var _smo_data_measure__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/measure */ \"./src/smo/data/measure.ts\");\n/* harmony import */ var _smo_data_music__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../smo/data/music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _smo_data_systemStaff__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../smo/data/systemStaff */ \"./src/smo/data/systemStaff.ts\");\n/* harmony import */ var _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../smo/data/staffModifiers */ \"./src/smo/data/staffModifiers.ts\");\n/* harmony import */ var _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/xform/selections */ \"./src/smo/xform/selections.ts\");\n/* harmony import */ var _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../smo/xform/undo */ \"./src/smo/xform/undo.ts\");\n/* harmony import */ var _smo_xform_copypaste__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../smo/xform/copypaste */ \"./src/smo/xform/copypaste.ts\");\n/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./scroller */ \"./src/render/sui/scroller.ts\");\n/* harmony import */ var _svgHelpers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _tracker__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./tracker */ \"./src/render/sui/tracker.ts\");\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _renderState__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./renderState */ \"./src/render/sui/renderState.ts\");\n/* harmony import */ var _smo_xform_operations__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../smo/xform/operations */ \"./src/smo/xform/operations.ts\");\n/* harmony import */ var _audio_player__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../audio/player */ \"./src/render/audio/player.ts\");\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.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 * Base class for all operations on the rendered score. The base class handles the following:\n * 1. Undo and recording actions for the operation\n * 2. Maintain/change which staves in the score are displayed (staff map)\n * 3. Mapping between the displayed score and the data representation\n * @category SuiRender\n */\nclass SuiScoreView {\n constructor(config, svgContainer, score, scrollSelector, undoBuffer) {\n this.score = score;\n const renderParams = {\n elementId: svgContainer,\n score,\n config,\n undoBuffer\n };\n this.audioAnimation = config.audioAnimation;\n this.renderer = new _renderState__WEBPACK_IMPORTED_MODULE_12__.SuiRenderState(renderParams);\n this.config = config;\n const scoreJson = score.serialize({ skipStaves: false, useDictionary: false, preserveStaffIds: true });\n this.scroller = new _scroller__WEBPACK_IMPORTED_MODULE_8__.SuiScroller(scrollSelector, this.renderer.renderer.vexContainers);\n this.storePaste = new _smo_xform_copypaste__WEBPACK_IMPORTED_MODULE_7__.PasteBuffer();\n this.tracker = new _tracker__WEBPACK_IMPORTED_MODULE_10__.SuiTracker(this.renderer, this.scroller);\n this.renderer.setMeasureMapper(this.tracker);\n this.storeScore = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(scoreJson));\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n this.storeUndo = new _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer();\n this.staffMap = this.defaultStaffMap;\n SuiScoreView.Instance = this; // for debugging\n this.setMappedStaffIds();\n (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_11__.createTopDomContainer)('.saveLink'); // for file upload\n }\n /**\n * Await on the full update of the score\n * @returns\n */\n renderPromise() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.renderer.renderPromise();\n });\n }\n /**\n * Await on the partial update of the score in the view\n * @returns\n */\n updatePromise() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.renderer.updatePromise();\n });\n }\n awaitRender() {\n return __awaiter(this, void 0, void 0, function* () {\n this.renderer.rerenderAll();\n return this.renderer.updatePromise();\n });\n }\n /**\n * await on the full update of the score, also resetting the viewport (to reflect layout changes)\n * @returns\n */\n refreshViewport() {\n return __awaiter(this, void 0, void 0, function* () {\n this.renderer.preserveScroll();\n this.renderer.setViewport();\n this.renderer.setRefresh();\n yield this.renderer.renderPromise();\n });\n }\n handleScrollEvent(scrollLeft, scrollTop) {\n this.tracker.scroller.handleScroll(scrollLeft, scrollTop);\n }\n getPartMap() {\n let keepNext = false;\n let partCount = 0;\n let partMap = {};\n const keys = [];\n this.storeScore.staves.forEach((staff) => {\n const partInfo = staff.partInfo;\n partInfo.associatedStaff = staff.staffId;\n if (!keepNext) {\n partMap[partCount] = partInfo;\n keys.push(partCount);\n partCount += 1;\n if (partInfo.stavesAfter > 0) {\n keepNext = true;\n }\n }\n else {\n keepNext = false;\n }\n });\n return { keys, partMap };\n }\n /**\n * Any method that modifies a set of selections can call this to update\n * the score view and the backing score.\n * @param actor\n * @param selections\n */\n modifyCurrentSelections(label, actor) {\n return __awaiter(this, void 0, void 0, function* () {\n const altSelections = this._getEquivalentSelections(this.tracker.selections);\n this.undoTrackerMeasureSelections(label);\n actor(this.score, this.tracker.selections);\n actor(this.storeScore, altSelections);\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList(this.tracker.selections));\n yield this.updatePromise();\n });\n }\n /**\n * Any method that modifies a set of selections can call this to update\n * the score view and the backing score.\n * @param actor\n * @param selections\n */\n modifySelection(label, selection, actor) {\n return __awaiter(this, void 0, void 0, function* () {\n const altSelection = this._getEquivalentSelection(selection);\n this.undoTrackerMeasureSelections(label);\n actor(this.score, [selection]);\n if (altSelection) {\n actor(this.storeScore, [altSelection]);\n }\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList([selection]));\n yield this.updatePromise();\n });\n }\n /**\n * Any method that modifies a set of selections can call this to update\n * the score view and the backing score.\n * @param actor\n * @param selections\n */\n modifySelectionNoWait(label, selection, actor) {\n return __awaiter(this, void 0, void 0, function* () {\n const altSelection = this._getEquivalentSelection(selection);\n this.undoTrackerMeasureSelections(label);\n actor(this.score, selection);\n if (altSelection) {\n actor(this.storeScore, altSelection);\n }\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList([selection]));\n });\n }\n /**\n * Modifiy a set of columns, e.g. tempo, time, key. This has different undo behavior, don't\n * pend on the result because there may be a combination of operations.\n * @param label\n * @param selections\n * @param actor\n */\n modifyColumnsSelectionsNoWait(label, selections, actor) {\n this.undoColumnRange(label, selections);\n selections.forEach((selection) => {\n const altSelection = this._getEquivalentSelection(selection);\n actor(this.score, selection);\n if (altSelection) {\n actor(this.storeScore, altSelection);\n }\n });\n this._renderChangedMeasures(selections);\n }\n /**\n * This is used in some Smoosic demos and pens.\n * @param action any action, but most usefully a SuiScoreView method\n * @param repetition number of times to repeat, waiting on render promise between\n * if not specified, defaults to 1\n * @returns promise, resolved action has been completed and score is updated.\n */\n waitableAction(action, repetition) {\n return __awaiter(this, void 0, void 0, function* () {\n const rep = repetition !== null && repetition !== void 0 ? repetition : 1;\n const self = this;\n const promise = new Promise((resolve) => {\n const fc = (count) => __awaiter(this, void 0, void 0, function* () {\n if (count > 0) {\n action();\n yield self.renderer.updatePromise();\n fc(count - 1);\n }\n else {\n resolve();\n }\n });\n fc(rep);\n });\n return promise;\n });\n }\n /**\n * The plural form of _getEquivalentSelection\n * @param selections\n * @returns\n */\n _getEquivalentSelections(selections) {\n const rv = [];\n selections.forEach((selection) => {\n const sel = this._getEquivalentSelection(selection);\n if (sel !== null) {\n rv.push(sel);\n }\n });\n return rv;\n }\n // Get a long enough list of measures to paste into\n getPasteMeasureList() {\n // The length of the paste buffer, in ticks\n const ticksToPaste = this.storePaste.getCopyBufferTickCount();\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList(this.tracker.selections);\n if (!selections.length) {\n return [];\n }\n const destination = selections[0];\n selections.splice(0);\n selections.push(destination);\n const voice = destination.selector.voice;\n const tm = destination.measure.tickmapForVoice(voice);\n // length of first selected measure, in ticks\n const measureTicks = destination.measure.getTicksFromVoice(voice);\n // remaining ticks after first selection. This is our starting point.\n let startTick = measureTicks - tm.durationMap[this.tracker.selections[0].selector.tick];\n let currentMeasure = destination.selector.measure + 1;\n // if we are short, and there are measures left, add them to the selection list\n while (startTick < ticksToPaste && destination.staff.measures.length > currentMeasure) {\n const newSel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.measureSelection(this.score, destination.selector.staff, currentMeasure);\n if (newSel) {\n selections.push(newSel);\n startTick += newSel.measure.getTicksFromThisOrAnyVoice(voice);\n }\n currentMeasure += 1;\n }\n return selections;\n }\n /**\n * A staff modifier has changed, create undo operations for the measures affected\n * @param label\n * @param staffModifier\n * @param subtype\n */\n undoStaffModifier(label, staffModifier, subtype) {\n const copy = _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_4__.StaffModifierBase.deserialize(staffModifier.serialize());\n copy.startSelector = this._getEquivalentSelector(copy.startSelector);\n copy.endSelector = this._getEquivalentSelector(copy.endSelector);\n const copySer = copy.serialize();\n // Copy ID so we can undo properly\n copySer.attrs = JSON.parse(JSON.stringify(staffModifier.attrs));\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.STAFF_MODIFIER, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, copySer, subtype);\n }\n /**\n * Return the index of the page that is in the center of the client screen.\n */\n getFocusedPage() {\n if (this.score.layoutManager === undefined) {\n return 0;\n }\n const scrollAvg = this.tracker.scroller.netScroll.y + (this.tracker.scroller.viewport.height / 2);\n const midY = scrollAvg;\n const layoutManager = this.score.layoutManager.getGlobalLayout();\n const lh = layoutManager.pageHeight / layoutManager.svgScale;\n const lw = layoutManager.pageWidth / layoutManager.svgScale;\n const pt = this.renderer.pageMap.svgToClient(_svgHelpers__WEBPACK_IMPORTED_MODULE_9__.SvgHelpers.smoBox({ x: lw, y: lh }));\n return Math.round(midY / pt.y);\n }\n /**\n * Create a rectangle undo, like a multiple columns but not necessarily the whole\n * score.\n */\n _undoColumn(label, measureIndex) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.COLUMN, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, { score: this.storeScore, measureIndex }, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n /**\n * Score preferences don't affect the display, but they do have an undo\n * @param label\n */\n _undoScorePreferences(label) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.SCORE_ATTRIBUTES, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, this.storeScore, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n undoColumnRange(label, measureSelections) {\n const checked = {};\n measureSelections.forEach((measureSelection) => {\n if (!checked[measureSelection.selector.measure]) {\n checked[measureSelection.selector.measure] = true;\n this._undoColumn(label, measureSelection.selector.measure);\n }\n });\n }\n undoMeasureRange(label, measureSelections) {\n measureSelections.forEach((measureSelection) => {\n const equiv = this._getEquivalentSelection(measureSelection);\n if (equiv !== null) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.MEASURE, equiv.selector, equiv.measure, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n });\n return measureSelections;\n }\n /**\n * Add to the undo buffer the current set of measures selected.\n * @param label\n * @returns\n */\n undoTrackerMeasureSelections(label) {\n const measureSelections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList(this.tracker.selections);\n return this.undoMeasureRange(label, measureSelections);\n }\n /**\n * operation that only affects the first selection. Setup undo for the measure\n */\n _undoFirstMeasureSelection(label) {\n const sel = this.tracker.selections[0];\n const equiv = this._getEquivalentSelection(sel);\n if (equiv !== null) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.MEASURE, equiv.selector, equiv.measure, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n return sel;\n }\n /**\n * Add the selection to the undo buffer\n * @param label\n * @param selection\n */\n _undoSelection(label, selection) {\n const equiv = this._getEquivalentSelection(selection);\n if (equiv !== null) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.MEASURE, equiv.selector, equiv.measure, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n }\n /**\n * Add multiple selections to the undo buffer as a group\n * @param label\n * @param selections\n */\n _undoSelections(label, selections) {\n this.storeUndo.grouping = true;\n selections.forEach((selection) => {\n this._undoSelection(label, selection);\n });\n this.storeUndo.grouping = false;\n }\n /**\n * Update renderer for measures that have changed\n */\n _renderChangedMeasures(measureSelections) {\n if (!Array.isArray(measureSelections)) {\n measureSelections = [measureSelections];\n }\n measureSelections.forEach((measureSelection) => {\n this.renderer.addToReplaceQueue(measureSelection);\n });\n }\n /**\n * Update renderer for some columns\n * @param fromSelector\n * @param toSelector\n */\n _renderRectangle(fromSelector, toSelector) {\n this._getRectangleSelections(fromSelector, toSelector).forEach((s) => {\n this.renderer.addToReplaceQueue(s);\n });\n }\n /**\n * Setup undo for operation that affects the whole score\n * @param label\n */\n _undoScore(label) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.SCORE, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, this.storeScore, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n /**\n * Get the selector from this.storeScore that maps to the displayed selector from this.score\n * @param selector\n * @returns\n */\n _getEquivalentSelector(selector) {\n const rv = JSON.parse(JSON.stringify(selector));\n rv.staff = this.staffMap[selector.staff];\n return rv;\n }\n /**\n * Get the equivalent staff id from this.storeScore that maps to the displayed selector from this.score\n * @param staffId\n * @returns\n */\n _getEquivalentStaff(staffId) {\n return this.staffMap[staffId];\n }\n /**\n * Get the equivalent selection from this.storeScore that maps to the displayed selection from this.score\n * @param selection\n * @returns\n */\n _getEquivalentSelection(selection) {\n try {\n if (typeof (selection.selector.tick) === 'undefined') {\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.measureSelection(this.storeScore, this.staffMap[selection.selector.staff], selection.selector.measure);\n }\n if (typeof (selection.selector.pitches) === 'undefined') {\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.noteSelection(this.storeScore, this.staffMap[selection.selector.staff], selection.selector.measure, selection.selector.voice, selection.selector.tick);\n }\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.pitchSelection(this.storeScore, this.staffMap[selection.selector.staff], selection.selector.measure, selection.selector.voice, selection.selector.tick, selection.selector.pitches);\n }\n catch (ex) {\n console.warn(ex);\n return null;\n }\n }\n /**\n * Get the equivalent selection from this.storeScore that maps to the displayed selection from this.score\n * @param selection\n * @returns\n */\n _getEquivalentGraceNote(selection, gn) {\n if (selection.note !== null) {\n const rv = selection.note.getGraceNotes().find((gg) => gg.attrs.id === gn.attrs.id);\n if (rv) {\n return rv;\n }\n }\n return gn;\n }\n /**\n * Get the rectangle of selections indicated by the parameters from the score\n * @param startSelector\n * @param endSelector\n * @param score\n * @returns\n */\n _getRectangleSelections(startSelector, endSelector) {\n const rv = [];\n let i = 0;\n let j = 0;\n for (i = startSelector.staff; i <= endSelector.staff; i++) {\n for (j = startSelector.measure; j <= endSelector.measure; j++) {\n const target = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.measureSelection(this.score, i, j);\n if (target !== null) {\n rv.push(target);\n }\n }\n }\n return rv;\n }\n /**\n * set the grouping flag for undo operations\n * @param val\n */\n groupUndo(val) {\n this.storeUndo.grouping = val;\n }\n /**\n * Show all staves, 1:1 mapping of view score staff to stored score staff\n */\n get defaultStaffMap() {\n let i = 0;\n const rv = [];\n for (i = 0; i < this.storeScore.staves.length; ++i) {\n rv.push(i);\n }\n return rv;\n }\n /**\n * Bootstrapping function, creates the renderer and associated timers\n */\n startRenderingEngine() {\n if (!this.renderer.score) {\n // If there is only one part, display the part.\n if (this.storeScore.isPartExposed()) {\n this.exposePart(this.score.staves[0]);\n }\n // If the score is transposing, hide the instrument xpose settings\n this._setTransposing();\n this.renderer.score = this.score;\n this.renderer.setViewport();\n }\n this.renderer.startDemon();\n }\n /**\n * Gets the current mapping of displayed staves to score staves (this.storeScore)\n * @returns\n */\n getView() {\n const rv = [];\n let i = 0;\n for (i = 0; i < this.storeScore.staves.length; ++i) {\n const show = this.staffMap.indexOf(i) >= 0;\n rv.push({ show });\n }\n return rv;\n }\n /**\n * Update the staff ID when the view changes\n */\n setMappedStaffIds() {\n this.score.staves.forEach((staff) => {\n if (!this.isPartExposed()) {\n staff.partInfo.displayCues = staff.partInfo.cueInScore;\n }\n else {\n staff.partInfo.displayCues = false;\n }\n staff.setMappedStaffId(this.staffMap[staff.staffId]);\n });\n }\n resetPartView() {\n if (this.staffMap.length === 1) {\n const staff = this.storeScore.staves[this.staffMap[0]];\n this.exposePart(staff);\n }\n }\n /**\n * Exposes a part: hides non-part staves, shows part staves.\n * Note this will reset the view. After this operation, staff 0 will\n * be the selected part.\n * @param staff\n */\n exposePart(staff) {\n let i = 0;\n const exposeMap = [];\n let pushNext = false;\n for (i = 0; i < this.storeScore.staves.length; ++i) {\n const tS = this.storeScore.staves[i];\n const show = tS.staffId === staff.staffId;\n if (pushNext) {\n exposeMap.push({ show: true });\n pushNext = false;\n }\n else {\n exposeMap.push({ show });\n if (tS.partInfo.stavesAfter > 0 && show) {\n pushNext = true;\n }\n }\n }\n this.setView(exposeMap);\n }\n /**\n * Indicates if the score is displaying in part-mode vs. score mode.\n * @returns\n */\n isPartExposed() {\n return this.score.isPartExposed();\n }\n /**\n * Parts have different formatting options from the parent score, indluding layout. Reset\n * them when exposing a part.\n */\n _mapPartFormatting() {\n this.score.layoutManager = this.score.staves[0].partInfo.layoutManager;\n let replacedText = false;\n this.score.staves.forEach((staff) => {\n staff.updateMeasureFormatsForPart();\n if (staff.partInfo.preserveTextGroups && !replacedText) {\n const tga = [];\n replacedText = true;\n staff.partInfo.textGroups.forEach((tg) => {\n tga.push(tg);\n });\n this.score.textGroups = tga;\n }\n });\n }\n /**\n * Update the list of staves in the score that are displayed.\n */\n setView(rows) {\n let i = 0;\n const any = rows.find((row) => row.show === true);\n if (!any) {\n return;\n }\n const nscore = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(this.storeScore.serialize({ skipStaves: true, useDictionary: false, preserveStaffIds: false })));\n const staffMap = [];\n for (i = 0; i < rows.length; ++i) {\n const row = rows[i];\n if (row.show) {\n const srcStave = this.storeScore.staves[i];\n const jsonObj = srcStave.serialize({ skipMaps: false, preserveIds: true,\n transposeInstruments: !this.storeScore.preferences.transposingScore\n });\n jsonObj.staffId = staffMap.length;\n const nStave = _smo_data_systemStaff__WEBPACK_IMPORTED_MODULE_3__.SmoSystemStaff.deserialize(jsonObj, !this.storeScore.preferences.transposingScore);\n nStave.mapStaffFromTo(i, nscore.staves.length);\n // Remap score text groups attached to music in this staff\n const localText = nscore.textGroups.filter((tt) => (tt.attachToSelector && tt.selector && tt.selector.staff === i));\n localText.forEach((tt) => {\n if (tt.selector) {\n tt.selector.staff = nscore.staves.length;\n }\n });\n nscore.staves.push(nStave);\n if (srcStave.keySignatureMap) {\n nStave.keySignatureMap = JSON.parse(JSON.stringify(srcStave.keySignatureMap));\n }\n nStave.measures.forEach((measure, ix) => {\n const srcMeasure = srcStave.measures[ix];\n measure.tempo = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_15__.SmoTempoText(srcMeasure.tempo.serialize());\n measure.timeSignature = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_15__.TimeSignature(srcMeasure.timeSignature);\n measure.keySignature = srcMeasure.keySignature;\n });\n staffMap.push(i);\n }\n }\n nscore.numberStaves();\n this.staffMap = staffMap;\n this.score = nscore;\n // Indicate which score staff view staves are mapped to, to decide to display\n // modifiers.\n this.setMappedStaffIds();\n // TODO: add part-specific measure formatting, etc.\n this._setTransposing();\n this.renderer.score = nscore;\n // If this current view is a part, show the part layout\n if (this.isPartExposed()) {\n this._mapPartFormatting();\n this.score.staves.forEach((staff) => {\n staff.partInfo.displayCues = false;\n });\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_13__.SmoOperation.computeMultipartRest(nscore);\n }\n else {\n this.score.staves.forEach((staff) => {\n staff.partInfo.displayCues = staff.partInfo.cueInScore;\n });\n }\n window.dispatchEvent(new CustomEvent(_renderState__WEBPACK_IMPORTED_MODULE_12__.scoreChangeEvent, { detail: { view: this } }));\n this.renderer.setViewport();\n }\n /**\n * view all the staffs in score mode.\n */\n viewAll() {\n this.score = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(this.storeScore.serialize({ skipStaves: false, useDictionary: false, preserveStaffIds: true })));\n this.staffMap = this.defaultStaffMap;\n this.setMappedStaffIds();\n this._setTransposing();\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n this.renderer.score = this.score;\n window.dispatchEvent(new CustomEvent(_renderState__WEBPACK_IMPORTED_MODULE_12__.scoreChangeEvent, { detail: { view: this } }));\n this.renderer.setViewport();\n }\n /**\n * If the score is non-transposed, transpose the part so it is in the\n * correct key.\n */\n _setTransposing() {\n var _a;\n if (this.isPartExposed()) {\n const xpose = (_a = this.score.preferences) === null || _a === void 0 ? void 0 : _a.transposingScore;\n if (xpose) {\n this.score.setNonTransposing();\n }\n }\n }\n /**\n * Update the view after loading or restoring a completely new score\n * @param score\n * @returns\n */\n changeScore(score) {\n return __awaiter(this, void 0, void 0, function* () {\n this.storeUndo.reset();\n _audio_player__WEBPACK_IMPORTED_MODULE_14__.SuiAudioPlayer.stopPlayer();\n this.renderer.score = score;\n this.renderer.setViewport();\n this.storeScore = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(score.serialize({ skipStaves: false, useDictionary: false, preserveStaffIds: true })));\n this.score = score;\n // If the score is non-transposing, hide the instrument xpose settings\n this._setTransposing();\n this.staffMap = this.defaultStaffMap;\n this.setMappedStaffIds();\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n if (this.storeScore.isPartExposed()) {\n this.exposePart(this.score.staves[0]);\n }\n const rv = yield this.awaitRender();\n window.dispatchEvent(new CustomEvent(_renderState__WEBPACK_IMPORTED_MODULE_12__.scoreChangeEvent, { detail: { view: this } }));\n return rv;\n });\n }\n replaceMeasureView(measureRange) {\n for (let i = measureRange[0]; i <= measureRange[1]; ++i) {\n this.score.staves.forEach((staff) => {\n var _a, _b;\n const staffId = staff.staffId;\n const altStaff = this.storeScore.staves[this._getEquivalentStaff(staffId)];\n if (altStaff) {\n staff.syncStaffModifiers(i, altStaff);\n }\n // Get a copy of the backing score, and map it to the score stave. this.score may have fewer staves\n // than this.storeScore\n const svg = JSON.parse(JSON.stringify(staff.measures[i].svg));\n const serialized = _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.serializeMeasure(this.storeScore.staves[this.staffMap[staffId]].measures[i]);\n serialized.measureNumber.staffId = staffId;\n const xpose = (_a = serialized.transposeIndex) !== null && _a !== void 0 ? _a : 0;\n const concertKey = _smo_data_music__WEBPACK_IMPORTED_MODULE_2__.SmoMusic.vexKeySigWithOffset((_b = serialized.keySignature) !== null && _b !== void 0 ? _b : 'c', -1 * xpose);\n serialized.keySignature = concertKey;\n const rmeasure = _smo_data_measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.deserialize(serialized);\n rmeasure.svg = svg;\n // We used to force a tranposing score stff into 'c' but now we keep the \n // measures in the concert key, and the transpose offset to 0, so no need to do anything\n // special here.\n const selector = { staff: staffId, measure: i, voice: 0, tick: 0, pitches: [] };\n this.score.replaceMeasure(selector, rmeasure);\n });\n this.renderer.addColumnToReplaceQueue(i);\n }\n }\n /**\n * for the view score, the renderer decides what to render\n * depending on what is undone.\n * @returns\n */\n undo() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.renderer.score) {\n return;\n }\n if (!this.storeUndo.buffersAvailable()) {\n return;\n }\n const staffMap = {};\n const identityMap = {};\n this.defaultStaffMap.forEach((nn) => identityMap[nn] = nn);\n this.staffMap.forEach((mm, ix) => staffMap[mm] = ix);\n // A score-level undo might have changed the score.\n const fullScore = this.storeUndo.undoScorePeek();\n // text undo is handled differently since there is usually not\n // an associated measure.\n const scoreText = this.storeUndo.undoScoreTextGroupPeek();\n const partText = this.storeUndo.undoPartTextGroupPeek();\n if (scoreText || partText) {\n yield this.renderer.unrenderTextGroups();\n }\n const measureRange = this.storeUndo.getMeasureRange();\n if (!(fullScore || scoreText || partText)) {\n for (let i = measureRange[0]; i <= measureRange[1]; ++i) {\n this.renderer.unrenderColumn(this.score.staves[0].measures[i]);\n }\n }\n this.storeScore = this.storeUndo.undo(this.storeScore, identityMap, true);\n if (fullScore) {\n this.viewAll();\n this.renderer.setRefresh();\n }\n else if (partText) {\n this.setView(this.getView());\n }\n else if (scoreText) {\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n this.renderer.rerenderTextGroups();\n }\n else {\n this.replaceMeasureView(measureRange);\n }\n yield this.renderer.updatePromise();\n });\n }\n}\nSuiScoreView.Instance = null;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNyQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3hDLENBQUM7WUFDRCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEMsQ0FBQztLQUFBOztBQTN1Qk0scUJBQVEsR0FBd0IsSUFBSSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3JlbmRlci9zdWkvc2NvcmVWaWV3LnRzPzA5N2IiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gW1Ntb29zaWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BYXJvbkRhdmlkTmV3bWFuL1Ntb29zaWMpXHJcbi8vIENvcHlyaWdodCAoYykgQWFyb24gRGF2aWQgTmV3bWFuIDIwMjEuXHJcbmltcG9ydCB7IFNtb1Njb3JlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc2NvcmUnO1xyXG5pbXBvcnQgeyBTbW9NZWFzdXJlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZSc7XHJcbmltcG9ydCB7IFNtb1RleHRHcm91cCB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3Njb3JlVGV4dCc7XHJcbmltcG9ydCB7IFNtb0dyYWNlTm90ZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL25vdGVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9NdXNpYyB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL211c2ljJztcclxuaW1wb3J0IHsgU21vU3lzdGVtU3RhZmYgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zeXN0ZW1TdGFmZic7XHJcbmltcG9ydCB7IFNtb1BhcnRJbmZvIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvcGFydEluZm8nO1xyXG5pbXBvcnQgeyBTdGFmZk1vZGlmaWVyQmFzZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3N0YWZmTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgU21vU2VsZWN0aW9uLCBTbW9TZWxlY3RvciB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9zZWxlY3Rpb25zJztcclxuaW1wb3J0IHsgVW5kb0J1ZmZlciwgY29weVVuZG8gfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vdW5kbyc7XHJcbmltcG9ydCB7IFBhc3RlQnVmZmVyIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL2NvcHlwYXN0ZSc7XHJcbmltcG9ydCB7IFN1aVNjcm9sbGVyIH0gZnJvbSAnLi9zY3JvbGxlcic7XHJcbmltcG9ydCB7IFN2Z0hlbHBlcnMgfSBmcm9tICcuL3N2Z0hlbHBlcnMnO1xyXG5pbXBvcnQgeyBTdWlUcmFja2VyIH0gZnJvbSAnLi90cmFja2VyJztcclxuaW1wb3J0IHsgY3JlYXRlVG9wRG9tQ29udGFpbmVyIH0gZnJvbSAnLi4vLi4vY29tbW9uL2h0bWxIZWxwZXJzJztcclxuaW1wb3J0IHsgU21vUmVuZGVyQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IFN1aVJlbmRlclN0YXRlLCBzY29yZUNoYW5nZUV2ZW50IH0gZnJvbSAnLi9yZW5kZXJTdGF0ZSc7XHJcbmltcG9ydCB7IFNjb3JlUmVuZGVyUGFyYW1zIH0gZnJvbSAnLi9zY29yZVJlbmRlcic7XHJcbmltcG9ydCB7IFNtb09wZXJhdGlvbiB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9vcGVyYXRpb25zJztcclxuaW1wb3J0IHsgU3VpQXVkaW9QbGF5ZXIgfSBmcm9tICcuLi9hdWRpby9wbGF5ZXInO1xyXG5pbXBvcnQgeyBTdWlBdWRpb0FuaW1hdGlvblBhcmFtcyB9IGZyb20gJy4uL2F1ZGlvL211c2ljQ3Vyc29yJztcclxuaW1wb3J0IHsgU21vVGVtcG9UZXh0IH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFRpbWVTaWduYXR1cmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tZWFzdXJlTW9kaWZpZXJzJztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBJbmRpY2F0ZXMgYSBzdGF2ZSBpcy9pcyBub3QgZGlzcGxheWVkIGluIHRoZSBzY29yZVxyXG4gKiBAY2F0ZWdvcnkgU3VpUmVuZGVyXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFZpZXdNYXBFbnRyeSB7XHJcbiAgc2hvdzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgdXBkYXRlU2VsZWN0aW9uRnVuYyA9IChzY29yZTogU21vU2NvcmUsIHNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdKSA9PiB2b2lkO1xyXG5leHBvcnQgdHlwZSB1cGRhdGVTaW5nbGVTZWxlY3Rpb25GdW5jID0gKHNjb3JlOiBTbW9TY29yZSwgc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24pID0+IHZvaWQ7XHJcbmV4cG9ydCB0eXBlIHVwZGF0ZVN0YWZmTW9kaWZpZXJGdW5jID0gKHNjb3JlOiBTbW9TY29yZSwgZnJvbVNlbGVjdGlvbjogU21vU2VsZWN0aW9uLCB0b1NlbGVjdGlvbjogU21vU2VsZWN0aW9uKSA9PiB2b2lkO1xyXG4vKipcclxuICogQmFzZSBjbGFzcyBmb3IgYWxsIG9wZXJhdGlvbnMgb24gdGhlIHJlbmRlcmVkIHNjb3JlLiAgVGhlIGJhc2UgY2xhc3MgaGFuZGxlcyB0aGUgZm9sbG93aW5nOlxyXG4gKiAxLiBVbmRvIGFuZCByZWNvcmRpbmcgYWN0aW9ucyBmb3IgdGhlIG9wZXJhdGlvblxyXG4gKiAyLiBNYWludGFpbi9jaGFuZ2Ugd2hpY2ggc3RhdmVzIGluIHRoZSBzY29yZSBhcmUgZGlzcGxheWVkIChzdGFmZiBtYXApXHJcbiAqIDMuIE1hcHBpbmcgYmV0d2VlbiB0aGUgZGlzcGxheWVkIHNjb3JlIGFuZCB0aGUgZGF0YSByZXByZXNlbnRhdGlvblxyXG4gKiBAY2F0ZWdvcnkgU3VpUmVuZGVyXHJcbiAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3VpU2NvcmVWaWV3IHtcclxuICBzdGF0aWMgSW5zdGFuY2U6IFN1aVNjb3JlVmlldyB8IG51bGwgPSBudWxsO1xyXG4gIHNjb3JlOiBTbW9TY29yZTsgLy8gVGhlIHNjb3JlIHRoYXQgaXMgZGlzcGxheWVkXHJcbiAgc3RvcmVTY29yZTogU21vU2NvcmU7ICAvLyB0aGUgZnVsbCBzY29yZSwgaW5jbHVkaW5nIGludmlzaWJsZSBzdGF2ZXNcclxuICBzdGFmZk1hcDogbnVtYmVyW107IC8vIG1hcHBpbmcgdGhlIDIgdGhpbmdzIGFib3ZlXHJcbiAgc3RvcmVVbmRvOiBVbmRvQnVmZmVyOyAvLyB1bmRvIGJ1ZmZlciBmb3Igb3BlcmF0aW9ucyB0byBhYm92ZVxyXG4gIHRyYWNrZXI6IFN1aVRyYWNrZXI7IC8vIFVJIHNlbGVjdGlvbnNcclxuICByZW5kZXJlcjogU3VpUmVuZGVyU3RhdGU7XHJcbiAgc2Nyb2xsZXI6IFN1aVNjcm9sbGVyO1xyXG4gIHN0b3JlUGFzdGU6IFBhc3RlQnVmZmVyO1xyXG4gIGNvbmZpZzogU21vUmVuZGVyQ29uZmlndXJhdGlvbjtcclxuICBhdWRpb0FuaW1hdGlvbjogU3VpQXVkaW9BbmltYXRpb25QYXJhbXM7XHJcbiAgY29uc3RydWN0b3IoY29uZmlnOiBTbW9SZW5kZXJDb25maWd1cmF0aW9uLCBzdmdDb250YWluZXI6IEhUTUxFbGVtZW50LCBzY29yZTogU21vU2NvcmUsIHNjcm9sbFNlbGVjdG9yOiBIVE1MRWxlbWVudCwgdW5kb0J1ZmZlcjogVW5kb0J1ZmZlcikge1xyXG4gICAgdGhpcy5zY29yZSA9IHNjb3JlO1xyXG4gICAgY29uc3QgcmVuZGVyUGFyYW1zOiBTY29yZVJlbmRlclBhcmFtcyA9IHtcclxuICAgICAgZWxlbWVudElkOiBzdmdDb250YWluZXIsXHJcbiAgICAgIHNjb3JlLFxyXG4gICAgICBjb25maWcsXHJcbiAgICAgIHVuZG9CdWZmZXJcclxuICAgIH07XHJcbiAgICB0aGlzLmF1ZGlvQW5pbWF0aW9uID0gY29uZmlnLmF1ZGlvQW5pbWF0aW9uO1xyXG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBTdWlSZW5kZXJTdGF0ZShyZW5kZXJQYXJhbXMpO1xyXG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XHJcbiAgICBjb25zdCBzY29yZUpzb24gPSBzY29yZS5zZXJpYWxpemUoeyBza2lwU3RhdmVzOiBmYWxzZSwgdXNlRGljdGlvbmFyeTogZmFsc2UsIHByZXNlcnZlU3RhZmZJZHM6IHRydWUgfSk7XHJcbiAgICB0aGlzLnNjcm9sbGVyID0gbmV3IFN1aVNjcm9sbGVyKHNjcm9sbFNlbGVjdG9yLCB0aGlzLnJlbmRlcmVyLnJlbmRlcmVyLnZleENvbnRhaW5lcnMpO1xyXG4gICAgdGhpcy5zdG9yZVBhc3RlID0gbmV3IFBhc3RlQnVmZmVyKCk7XHJcbiAgICB0aGlzLnRyYWNrZXIgPSBuZXcgU3VpVHJhY2tlcih0aGlzLnJlbmRlcmVyLCB0aGlzLnNjcm9sbGVyKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0TWVhc3VyZU1hcHBlcih0aGlzLnRyYWNrZXIpO1xyXG5cclxuICAgIHRoaXMuc3RvcmVTY29yZSA9IFNtb1Njb3JlLmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHNjb3JlSnNvbikpO1xyXG4gICAgdGhpcy5zY29yZS5zeW5jaHJvbml6ZVRleHRHcm91cHModGhpcy5zdG9yZVNjb3JlLnRleHRHcm91cHMpO1xyXG4gICAgdGhpcy5zdG9yZVVuZG8gPSBuZXcgVW5kb0J1ZmZlcigpO1xyXG4gICAgdGhpcy5zdGFmZk1hcCA9IHRoaXMuZGVmYXVsdFN0YWZmTWFwO1xyXG4gICAgU3VpU2NvcmVWaWV3Lkluc3RhbmNlID0gdGhpczsgLy8gZm9yIGRlYnVnZ2luZ1xyXG4gICAgdGhpcy5zZXRNYXBwZWRTdGFmZklkcygpO1xyXG4gICAgY3JlYXRlVG9wRG9tQ29udGFpbmVyKCcuc2F2ZUxpbmsnKTsgLy8gZm9yIGZpbGUgdXBsb2FkXHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEF3YWl0IG9uIHRoZSBmdWxsIHVwZGF0ZSBvZiB0aGUgc2NvcmVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyByZW5kZXJQcm9taXNlKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5yZW5kZXJQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEF3YWl0IG9uIHRoZSBwYXJ0aWFsIHVwZGF0ZSBvZiB0aGUgc2NvcmUgaW4gdGhlIHZpZXdcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVQcm9taXNlKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIGF3YWl0UmVuZGVyKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyQWxsKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGF3YWl0IG9uIHRoZSBmdWxsIHVwZGF0ZSBvZiB0aGUgc2NvcmUsIGFsc28gcmVzZXR0aW5nIHRoZSB2aWV3cG9ydCAodG8gcmVmbGVjdCBsYXlvdXQgY2hhbmdlcylcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyByZWZyZXNoVmlld3BvcnQoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMucmVuZGVyZXIucHJlc2VydmVTY3JvbGwoKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0Vmlld3BvcnQoKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVmcmVzaCgpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci5yZW5kZXJQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGhhbmRsZVNjcm9sbEV2ZW50KHNjcm9sbExlZnQ6IG51bWJlciwgc2Nyb2xsVG9wOiBudW1iZXIpIHtcclxuICAgIHRoaXMudHJhY2tlci5zY3JvbGxlci5oYW5kbGVTY3JvbGwoc2Nyb2xsTGVmdCwgc2Nyb2xsVG9wKTtcclxuICB9XHJcbiAgZ2V0UGFydE1hcCgpOiB7IGtleXM6IG51bWJlcltdLCBwYXJ0TWFwOiBSZWNvcmQ8bnVtYmVyLCBTbW9QYXJ0SW5mbz4gfSB7XHJcbiAgICBsZXQga2VlcE5leHQgPSBmYWxzZTtcclxuICAgIGxldCBwYXJ0Q291bnQgPSAwO1xyXG4gICAgbGV0IHBhcnRNYXA6IFJlY29yZDxudW1iZXIsIFNtb1BhcnRJbmZvPiA9IHt9O1xyXG4gICAgY29uc3Qga2V5czogbnVtYmVyW10gPSBbXTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgY29uc3QgcGFydEluZm8gPSBzdGFmZi5wYXJ0SW5mbztcclxuICAgICAgcGFydEluZm8uYXNzb2NpYXRlZFN0YWZmID0gc3RhZmYuc3RhZmZJZDtcclxuICAgICAgaWYgKCFrZWVwTmV4dCkge1xyXG4gICAgICAgIHBhcnRNYXBbcGFydENvdW50XSA9IHBhcnRJbmZvO1xyXG4gICAgICAgIGtleXMucHVzaChwYXJ0Q291bnQpO1xyXG4gICAgICAgIHBhcnRDb3VudCArPSAxO1xyXG4gICAgICAgIGlmIChwYXJ0SW5mby5zdGF2ZXNBZnRlciA+IDApIHtcclxuICAgICAgICAgIGtlZXBOZXh0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAga2VlcE5leHQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4geyBrZXlzLCBwYXJ0TWFwIH07XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFueSBtZXRob2QgdGhhdCBtb2RpZmllcyBhIHNldCBvZiBzZWxlY3Rpb25zIGNhbiBjYWxsIHRoaXMgdG8gdXBkYXRlIFxyXG4gICAqIHRoZSBzY29yZSB2aWV3IGFuZCB0aGUgYmFja2luZyBzY29yZS5cclxuICAgKiBAcGFyYW0gYWN0b3IgXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbnMgXHJcbiAgICovXHJcbiAgYXN5bmMgbW9kaWZ5Q3VycmVudFNlbGVjdGlvbnMobGFiZWw6IHN0cmluZywgYWN0b3I6IHVwZGF0ZVNlbGVjdGlvbkZ1bmMpIHtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucyk7XHJcbiAgICB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMobGFiZWwpO1xyXG4gICAgYWN0b3IodGhpcy5zY29yZSwgdGhpcy50cmFja2VyLnNlbGVjdGlvbnMpO1xyXG4gICAgYWN0b3IodGhpcy5zdG9yZVNjb3JlLCBhbHRTZWxlY3Rpb25zKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpKTtcclxuICAgIGF3YWl0IHRoaXMudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBbnkgbWV0aG9kIHRoYXQgbW9kaWZpZXMgYSBzZXQgb2Ygc2VsZWN0aW9ucyBjYW4gY2FsbCB0aGlzIHRvIHVwZGF0ZSBcclxuICAgKiB0aGUgc2NvcmUgdmlldyBhbmQgdGhlIGJhY2tpbmcgc2NvcmUuXHJcbiAgICogQHBhcmFtIGFjdG9yIFxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25zIFxyXG4gICAqL1xyXG4gIGFzeW5jIG1vZGlmeVNlbGVjdGlvbihsYWJlbDogc3RyaW5nLCBzZWxlY3Rpb246IFNtb1NlbGVjdGlvbiwgYWN0b3I6IHVwZGF0ZVNlbGVjdGlvbkZ1bmMpIHtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucyhsYWJlbCk7XHJcbiAgICBhY3Rvcih0aGlzLnNjb3JlLCBbc2VsZWN0aW9uXSk7XHJcbiAgICBpZiAoYWx0U2VsZWN0aW9uKSB7XHJcbiAgICAgIGFjdG9yKHRoaXMuc3RvcmVTY29yZSwgW2FsdFNlbGVjdGlvbl0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdChbc2VsZWN0aW9uXSkpO1xyXG4gICAgYXdhaXQgdGhpcy51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gICAgLyoqXHJcbiAgICogQW55IG1ldGhvZCB0aGF0IG1vZGlmaWVzIGEgc2V0IG9mIHNlbGVjdGlvbnMgY2FuIGNhbGwgdGhpcyB0byB1cGRhdGUgXHJcbiAgICogdGhlIHNjb3JlIHZpZXcgYW5kIHRoZSBiYWNraW5nIHNjb3JlLlxyXG4gICAqIEBwYXJhbSBhY3RvciBcclxuICAgKiBAcGFyYW0gc2VsZWN0aW9ucyBcclxuICAgKi9cclxuICAgIGFzeW5jIG1vZGlmeVNlbGVjdGlvbk5vV2FpdChsYWJlbDogc3RyaW5nLCBzZWxlY3Rpb246IFNtb1NlbGVjdGlvbiwgYWN0b3I6IHVwZGF0ZVNpbmdsZVNlbGVjdGlvbkZ1bmMpIHtcclxuICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMobGFiZWwpO1xyXG4gICAgICBhY3Rvcih0aGlzLnNjb3JlLCBzZWxlY3Rpb24pO1xyXG4gICAgICBpZiAoYWx0U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgYWN0b3IodGhpcy5zdG9yZVNjb3JlLCBhbHRTZWxlY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QoW3NlbGVjdGlvbl0pKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTW9kaWZpeSBhIHNldCBvZiBjb2x1bW5zLCBlLmcuIHRlbXBvLCB0aW1lLCBrZXkuICBUaGlzIGhhcyBkaWZmZXJlbnQgdW5kbyBiZWhhdmlvciwgZG9uJ3QgXHJcbiAgICAgKiBwZW5kIG9uIHRoZSByZXN1bHQgYmVjYXVzZSB0aGVyZSBtYXkgYmUgYSBjb21iaW5hdGlvbiBvZiBvcGVyYXRpb25zLlxyXG4gICAgICogQHBhcmFtIGxhYmVsIFxyXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbnMgXHJcbiAgICAgKiBAcGFyYW0gYWN0b3IgXHJcbiAgICAgKi9cclxuICAgIG1vZGlmeUNvbHVtbnNTZWxlY3Rpb25zTm9XYWl0KGxhYmVsOiBzdHJpbmcsIHNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdLCBhY3RvcjogdXBkYXRlU2luZ2xlU2VsZWN0aW9uRnVuYykge1xyXG4gICAgICB0aGlzLnVuZG9Db2x1bW5SYW5nZShsYWJlbCwgc2VsZWN0aW9ucyk7XHJcbiAgICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICAgIGFjdG9yKHRoaXMuc2NvcmUsIHNlbGVjdGlvbik7XHJcbiAgICAgICAgaWYgKGFsdFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgYWN0b3IodGhpcy5zdG9yZVNjb3JlLCBhbHRTZWxlY3Rpb24pO1xyXG4gICAgICAgIH0gIFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKHNlbGVjdGlvbnMpO1xyXG4gICAgfVxyXG4gIC8qKlxyXG4gICAqIFRoaXMgaXMgdXNlZCBpbiBzb21lIFNtb29zaWMgZGVtb3MgYW5kIHBlbnMuXHJcbiAgICogQHBhcmFtIGFjdGlvbiBhbnkgYWN0aW9uLCBidXQgbW9zdCB1c2VmdWxseSBhIFN1aVNjb3JlVmlldyBtZXRob2RcclxuICAgKiBAcGFyYW0gcmVwZXRpdGlvbiBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0LCB3YWl0aW5nIG9uIHJlbmRlciBwcm9taXNlIGJldHdlZW5cclxuICAgKiBpZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAxXHJcbiAgICogQHJldHVybnMgcHJvbWlzZSwgcmVzb2x2ZWQgYWN0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgc2NvcmUgaXMgdXBkYXRlZC5cclxuICAgKi9cclxuICBhc3luYyB3YWl0YWJsZUFjdGlvbihhY3Rpb246ICgpID0+IHZvaWQsIHJlcGV0aXRpb24/OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHJlcCA9IHJlcGV0aXRpb24gPz8gMTtcclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZmMgPSBhc3luYyAoY291bnQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgIGFjdGlvbigpO1xyXG4gICAgICAgICAgYXdhaXQgc2VsZi5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgICAgICAgICBmYyhjb3VudCAtIDEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBmYyhyZXApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBwbHVyYWwgZm9ybSBvZiBfZ2V0RXF1aXZhbGVudFNlbGVjdGlvblxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25zIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIF9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSk6IFNtb1NlbGVjdGlvbltdIHtcclxuICAgIGNvbnN0IHJ2OiBTbW9TZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgY29uc3Qgc2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICBpZiAoc2VsICE9PSBudWxsKSB7XHJcbiAgICAgICAgcnYucHVzaChzZWwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgLy8gR2V0IGEgbG9uZyBlbm91Z2ggbGlzdCBvZiBtZWFzdXJlcyB0byBwYXN0ZSBpbnRvXHJcbiAgZ2V0UGFzdGVNZWFzdXJlTGlzdCgpIHtcclxuICAgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHBhc3RlIGJ1ZmZlciwgaW4gdGlja3NcclxuICAgIGNvbnN0IHRpY2tzVG9QYXN0ZSA9IHRoaXMuc3RvcmVQYXN0ZS5nZXRDb3B5QnVmZmVyVGlja0NvdW50KCk7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSAgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpO1xyXG4gICAgaWYgKCFzZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHNlbGVjdGlvbnNbMF07XHJcbiAgICBzZWxlY3Rpb25zLnNwbGljZSgwKTtcclxuICAgIHNlbGVjdGlvbnMucHVzaChkZXN0aW5hdGlvbik7XHJcbiAgICBjb25zdCB2b2ljZSA9IGRlc3RpbmF0aW9uLnNlbGVjdG9yLnZvaWNlO1xyXG4gICAgY29uc3QgdG0gPSBkZXN0aW5hdGlvbi5tZWFzdXJlLnRpY2ttYXBGb3JWb2ljZSh2b2ljZSk7XHJcbiAgICAvLyBsZW5ndGggb2YgZmlyc3Qgc2VsZWN0ZWQgbWVhc3VyZSwgaW4gdGlja3NcclxuICAgIGNvbnN0IG1lYXN1cmVUaWNrcyA9IGRlc3RpbmF0aW9uLm1lYXN1cmUuZ2V0VGlja3NGcm9tVm9pY2Uodm9pY2UpO1xyXG4gICAgLy8gcmVtYWluaW5nIHRpY2tzIGFmdGVyIGZpcnN0IHNlbGVjdGlvbi4gIFRoaXMgaXMgb3VyIHN0YXJ0aW5nIHBvaW50LlxyXG4gICAgbGV0IHN0YXJ0VGljayA9IG1lYXN1cmVUaWNrcyAtIHRtLmR1cmF0aW9uTWFwW3RoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdLnNlbGVjdG9yLnRpY2tdO1xyXG4gICAgbGV0IGN1cnJlbnRNZWFzdXJlID0gZGVzdGluYXRpb24uc2VsZWN0b3IubWVhc3VyZSArIDE7XHJcbiAgICAvLyBpZiB3ZSBhcmUgc2hvcnQsIGFuZCB0aGVyZSBhcmUgbWVhc3VyZXMgbGVmdCwgYWRkIHRoZW0gdG8gdGhlIHNlbGVjdGlvbiBsaXN0XHJcbiAgICB3aGlsZSAoc3RhcnRUaWNrIDwgdGlja3NUb1Bhc3RlICYmIGRlc3RpbmF0aW9uLnN0YWZmLm1lYXN1cmVzLmxlbmd0aCA+IGN1cnJlbnRNZWFzdXJlKSB7XHJcbiAgICAgIGNvbnN0IG5ld1NlbCA9IFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc2NvcmUsIFxyXG4gICAgICAgIGRlc3RpbmF0aW9uLnNlbGVjdG9yLnN0YWZmLCBjdXJyZW50TWVhc3VyZSk7XHJcbiAgICAgIGlmIChuZXdTZWwpIHtcclxuICAgICAgICBzZWxlY3Rpb25zLnB1c2gobmV3U2VsKTtcclxuICAgICAgICBzdGFydFRpY2sgKz0gbmV3U2VsLm1lYXN1cmUuZ2V0VGlja3NGcm9tVGhpc09yQW55Vm9pY2Uodm9pY2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGN1cnJlbnRNZWFzdXJlICs9IDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2VsZWN0aW9ucztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSBzdGFmZiBtb2RpZmllciBoYXMgY2hhbmdlZCwgY3JlYXRlIHVuZG8gb3BlcmF0aW9ucyBmb3IgdGhlIG1lYXN1cmVzIGFmZmVjdGVkXHJcbiAgICogQHBhcmFtIGxhYmVsIFxyXG4gICAqIEBwYXJhbSBzdGFmZk1vZGlmaWVyIFxyXG4gICAqIEBwYXJhbSBzdWJ0eXBlIFxyXG4gICAqL1xyXG4gIHVuZG9TdGFmZk1vZGlmaWVyKGxhYmVsOiBzdHJpbmcsIHN0YWZmTW9kaWZpZXI6IFN0YWZmTW9kaWZpZXJCYXNlLCBzdWJ0eXBlOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvcHkgPSBTdGFmZk1vZGlmaWVyQmFzZS5kZXNlcmlhbGl6ZShzdGFmZk1vZGlmaWVyLnNlcmlhbGl6ZSgpKTtcclxuICAgIGNvcHkuc3RhcnRTZWxlY3RvciA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rvcihjb3B5LnN0YXJ0U2VsZWN0b3IpO1xyXG4gICAgY29weS5lbmRTZWxlY3RvciA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rvcihjb3B5LmVuZFNlbGVjdG9yKTtcclxuICAgIGNvbnN0IGNvcHlTZXIgPSBjb3B5LnNlcmlhbGl6ZSgpO1xyXG4gICAgLy8gQ29weSBJRCBzbyB3ZSBjYW4gdW5kbyBwcm9wZXJseVxyXG4gICAgY29weVNlci5hdHRycyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc3RhZmZNb2RpZmllci5hdHRycykpO1xyXG4gICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKGxhYmVsLCBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlNUQUZGX01PRElGSUVSLCBTbW9TZWxlY3Rvci5kZWZhdWx0LFxyXG4gICAgICBjb3B5U2VyLCBzdWJ0eXBlKTtcclxuICB9XHJcbiAgLyoqIFxyXG4gICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHBhZ2UgdGhhdCBpcyBpbiB0aGUgY2VudGVyIG9mIHRoZSBjbGllbnQgc2NyZWVuLlxyXG4gICAqL1xyXG4gIGdldEZvY3VzZWRQYWdlKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzY3JvbGxBdmcgPSB0aGlzLnRyYWNrZXIuc2Nyb2xsZXIubmV0U2Nyb2xsLnkgKyAodGhpcy50cmFja2VyLnNjcm9sbGVyLnZpZXdwb3J0LmhlaWdodCAvIDIpO1xyXG4gICAgY29uc3QgbWlkWSA9IHNjcm9sbEF2ZztcclxuICAgIGNvbnN0IGxheW91dE1hbmFnZXIgPSB0aGlzLnNjb3JlLmxheW91dE1hbmFnZXIuZ2V0R2xvYmFsTGF5b3V0KCk7XHJcbiAgICBjb25zdCBsaCA9IGxheW91dE1hbmFnZXIucGFnZUhlaWdodCAvIGxheW91dE1hbmFnZXIuc3ZnU2NhbGU7XHJcbiAgICBjb25zdCBsdyA9IGxheW91dE1hbmFnZXIucGFnZVdpZHRoIC8gbGF5b3V0TWFuYWdlci5zdmdTY2FsZTtcclxuICAgIGNvbnN0IHB0ID0gdGhpcy5yZW5kZXJlci5wYWdlTWFwLnN2Z1RvQ2xpZW50KFN2Z0hlbHBlcnMuc21vQm94KHsgeDogbHcsIHk6IGxoIH0pKTtcclxuICAgIHJldHVybiBNYXRoLnJvdW5kKG1pZFkgLyBwdC55KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgcmVjdGFuZ2xlIHVuZG8sIGxpa2UgYSBtdWx0aXBsZSBjb2x1bW5zIGJ1dCBub3QgbmVjZXNzYXJpbHkgdGhlIHdob2xlXHJcbiAgICogc2NvcmUuXHJcbiAgICovXHJcbiAgX3VuZG9Db2x1bW4obGFiZWw6IHN0cmluZywgbWVhc3VyZUluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcihsYWJlbCwgVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5DT0xVTU4sIFNtb1NlbGVjdG9yLmRlZmF1bHQsXHJcbiAgICAgIHsgc2NvcmU6IHRoaXMuc3RvcmVTY29yZSwgbWVhc3VyZUluZGV4IH0sIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuTk9ORSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNjb3JlIHByZWZlcmVuY2VzIGRvbid0IGFmZmVjdCB0aGUgZGlzcGxheSwgYnV0IHRoZXkgZG8gaGF2ZSBhbiB1bmRvXHJcbiAgICogQHBhcmFtIGxhYmVsIFxyXG4gICAqL1xyXG4gIF91bmRvU2NvcmVQcmVmZXJlbmNlcyhsYWJlbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0b3JlVW5kby5hZGRCdWZmZXIobGFiZWwsIFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuU0NPUkVfQVRUUklCVVRFUywgU21vU2VsZWN0b3IuZGVmYXVsdCwgdGhpcy5zdG9yZVNjb3JlLCBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLk5PTkUpO1xyXG4gIH1cclxuICB1bmRvQ29sdW1uUmFuZ2UobGFiZWw6IHN0cmluZywgbWVhc3VyZVNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdKSB7XHJcbiAgICBjb25zdCBjaGVja2VkOiBSZWNvcmQ8bnVtYmVyLCBib29sZWFuPiA9IHt9O1xyXG4gICAgbWVhc3VyZVNlbGVjdGlvbnMuZm9yRWFjaCgobWVhc3VyZVNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBpZiAoIWNoZWNrZWRbbWVhc3VyZVNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlXSkge1xyXG4gICAgICAgIGNoZWNrZWRbbWVhc3VyZVNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlXSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fdW5kb0NvbHVtbihsYWJlbCwgbWVhc3VyZVNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHVuZG9NZWFzdXJlUmFuZ2UobGFiZWw6IHN0cmluZywgbWVhc3VyZVNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdKSB7XHJcbiAgICBtZWFzdXJlU2VsZWN0aW9ucy5mb3JFYWNoKChtZWFzdXJlU2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVxdWl2ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihtZWFzdXJlU2VsZWN0aW9uKTtcclxuICAgICAgaWYgKGVxdWl2ICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKGxhYmVsLCBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLk1FQVNVUkUsIGVxdWl2LnNlbGVjdG9yLCBlcXVpdi5tZWFzdXJlLFxyXG4gICAgICAgICAgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5OT05FKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbWVhc3VyZVNlbGVjdGlvbnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCB0byB0aGUgdW5kbyBidWZmZXIgdGhlIGN1cnJlbnQgc2V0IG9mIG1lYXN1cmVzIHNlbGVjdGVkLlxyXG4gICAqIEBwYXJhbSBsYWJlbCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICB1bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKGxhYmVsOiBzdHJpbmcpOiBTbW9TZWxlY3Rpb25bXSB7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdCh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucyk7XHJcbiAgICByZXR1cm4gdGhpcy51bmRvTWVhc3VyZVJhbmdlKGxhYmVsLCBtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIG9wZXJhdGlvbiB0aGF0IG9ubHkgYWZmZWN0cyB0aGUgZmlyc3Qgc2VsZWN0aW9uLiAgU2V0dXAgdW5kbyBmb3IgdGhlIG1lYXN1cmVcclxuICAgKi9cclxuICBfdW5kb0ZpcnN0TWVhc3VyZVNlbGVjdGlvbihsYWJlbDogc3RyaW5nKTogU21vU2VsZWN0aW9uIHtcclxuICAgIGNvbnN0IHNlbCA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdO1xyXG4gICAgY29uc3QgZXF1aXYgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbCk7XHJcbiAgICBpZiAoZXF1aXYgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKGxhYmVsLCBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLk1FQVNVUkUsIGVxdWl2LnNlbGVjdG9yLCBlcXVpdi5tZWFzdXJlLFxyXG4gICAgICAgIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuTk9ORSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2VsO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgdGhlIHNlbGVjdGlvbiB0byB0aGUgdW5kbyBidWZmZXJcclxuICAgKiBAcGFyYW0gbGFiZWwgXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbiBcclxuICAgKi9cclxuICBfdW5kb1NlbGVjdGlvbihsYWJlbDogc3RyaW5nLCBzZWxlY3Rpb246IFNtb1NlbGVjdGlvbikge1xyXG4gICAgY29uc3QgZXF1aXYgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICBpZiAoZXF1aXYgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKGxhYmVsLFxyXG4gICAgICAgIFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuTUVBU1VSRSwgZXF1aXYuc2VsZWN0b3IsIGVxdWl2Lm1lYXN1cmUsXHJcbiAgICAgICAgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5OT05FKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWRkIG11bHRpcGxlIHNlbGVjdGlvbnMgdG8gdGhlIHVuZG8gYnVmZmVyIGFzIGEgZ3JvdXBcclxuICAgKiBAcGFyYW0gbGFiZWwgXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbnMgXHJcbiAgICovXHJcbiAgX3VuZG9TZWxlY3Rpb25zKGxhYmVsOiBzdHJpbmcsIHNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdKSB7XHJcbiAgICB0aGlzLnN0b3JlVW5kby5ncm91cGluZyA9IHRydWU7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICB0aGlzLl91bmRvU2VsZWN0aW9uKGxhYmVsLCBzZWxlY3Rpb24pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnN0b3JlVW5kby5ncm91cGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIFxyXG4gICAqIFVwZGF0ZSByZW5kZXJlciBmb3IgbWVhc3VyZXMgdGhhdCBoYXZlIGNoYW5nZWRcclxuICAqL1xyXG4gIF9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdKSB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobWVhc3VyZVNlbGVjdGlvbnMpKSB7XHJcbiAgICAgIG1lYXN1cmVTZWxlY3Rpb25zID0gW21lYXN1cmVTZWxlY3Rpb25zXTtcclxuICAgIH1cclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKG1lYXN1cmVTZWxlY3Rpb24pID0+IHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRUb1JlcGxhY2VRdWV1ZShtZWFzdXJlU2VsZWN0aW9uKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgcmVuZGVyZXIgZm9yIHNvbWUgY29sdW1uc1xyXG4gICAqIEBwYXJhbSBmcm9tU2VsZWN0b3IgXHJcbiAgICogQHBhcmFtIHRvU2VsZWN0b3IgXHJcbiAgICovXHJcbiAgX3JlbmRlclJlY3RhbmdsZShmcm9tU2VsZWN0b3I6IFNtb1NlbGVjdG9yLCB0b1NlbGVjdG9yOiBTbW9TZWxlY3Rvcikge1xyXG4gICAgdGhpcy5fZ2V0UmVjdGFuZ2xlU2VsZWN0aW9ucyhmcm9tU2VsZWN0b3IsIHRvU2VsZWN0b3IpLmZvckVhY2goKHMpID0+IHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRUb1JlcGxhY2VRdWV1ZShzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgdW5kbyBmb3Igb3BlcmF0aW9uIHRoYXQgYWZmZWN0cyB0aGUgd2hvbGUgc2NvcmVcclxuICAgKiBAcGFyYW0gbGFiZWwgXHJcbiAgICovXHJcbiAgX3VuZG9TY29yZShsYWJlbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0b3JlVW5kby5hZGRCdWZmZXIobGFiZWwsIFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuU0NPUkUsIFNtb1NlbGVjdG9yLmRlZmF1bHQsIHRoaXMuc3RvcmVTY29yZSxcclxuICAgICAgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5OT05FKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzZWxlY3RvciBmcm9tIHRoaXMuc3RvcmVTY29yZSB0aGF0IG1hcHMgdG8gdGhlIGRpc3BsYXllZCBzZWxlY3RvciBmcm9tIHRoaXMuc2NvcmVcclxuICAgKiBAcGFyYW0gc2VsZWN0b3IgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgX2dldEVxdWl2YWxlbnRTZWxlY3RvcihzZWxlY3RvcjogU21vU2VsZWN0b3IpIHtcclxuICAgIGNvbnN0IHJ2ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWxlY3RvcikpO1xyXG4gICAgcnYuc3RhZmYgPSB0aGlzLnN0YWZmTWFwW3NlbGVjdG9yLnN0YWZmXTtcclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBlcXVpdmFsZW50IHN0YWZmIGlkIGZyb20gdGhpcy5zdG9yZVNjb3JlIHRoYXQgbWFwcyB0byB0aGUgZGlzcGxheWVkIHNlbGVjdG9yIGZyb20gdGhpcy5zY29yZVxyXG4gICAqIEBwYXJhbSBzdGFmZklkIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIF9nZXRFcXVpdmFsZW50U3RhZmYoc3RhZmZJZDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGFmZk1hcFtzdGFmZklkXTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBlcXVpdmFsZW50IHNlbGVjdGlvbiBmcm9tIHRoaXMuc3RvcmVTY29yZSB0aGF0IG1hcHMgdG8gdGhlIGRpc3BsYXllZCBzZWxlY3Rpb24gZnJvbSB0aGlzLnNjb3JlXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICAgX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24pOiBTbW9TZWxlY3Rpb24gfCBudWxsIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0eXBlb2YgKHNlbGVjdGlvbi5zZWxlY3Rvci50aWNrKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zdG9yZVNjb3JlLCB0aGlzLnN0YWZmTWFwW3NlbGVjdGlvbi5zZWxlY3Rvci5zdGFmZl0sIHNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodHlwZW9mIChzZWxlY3Rpb24uc2VsZWN0b3IucGl0Y2hlcykgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIFNtb1NlbGVjdGlvbi5ub3RlU2VsZWN0aW9uKHRoaXMuc3RvcmVTY29yZSwgdGhpcy5zdGFmZk1hcFtzZWxlY3Rpb24uc2VsZWN0b3Iuc3RhZmZdLCBzZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSwgc2VsZWN0aW9uLnNlbGVjdG9yLnZvaWNlLFxyXG4gICAgICAgICAgc2VsZWN0aW9uLnNlbGVjdG9yLnRpY2spO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBTbW9TZWxlY3Rpb24ucGl0Y2hTZWxlY3Rpb24odGhpcy5zdG9yZVNjb3JlLCB0aGlzLnN0YWZmTWFwW3NlbGVjdGlvbi5zZWxlY3Rvci5zdGFmZl0sIHNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlLCBzZWxlY3Rpb24uc2VsZWN0b3Iudm9pY2UsXHJcbiAgICAgICAgc2VsZWN0aW9uLnNlbGVjdG9yLnRpY2ssIHNlbGVjdGlvbi5zZWxlY3Rvci5waXRjaGVzKTtcclxuICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihleCk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBlcXVpdmFsZW50IHNlbGVjdGlvbiBmcm9tIHRoaXMuc3RvcmVTY29yZSB0aGF0IG1hcHMgdG8gdGhlIGRpc3BsYXllZCBzZWxlY3Rpb24gZnJvbSB0aGlzLnNjb3JlXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICAgX2dldEVxdWl2YWxlbnRHcmFjZU5vdGUoc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24sIGduOiBTbW9HcmFjZU5vdGUpOiBTbW9HcmFjZU5vdGUge1xyXG4gICAgaWYgKHNlbGVjdGlvbi5ub3RlICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IHJ2ID0gc2VsZWN0aW9uLm5vdGUuZ2V0R3JhY2VOb3RlcygpLmZpbmQoKGdnKSA9PiBnZy5hdHRycy5pZCA9PT0gZ24uYXR0cnMuaWQpO1xyXG4gICAgICBpZiAocnYpIHtcclxuICAgICAgICByZXR1cm4gcnY7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBnbjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSByZWN0YW5nbGUgb2Ygc2VsZWN0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgc2NvcmVcclxuICAgKiBAcGFyYW0gc3RhcnRTZWxlY3RvciBcclxuICAgKiBAcGFyYW0gZW5kU2VsZWN0b3IgXHJcbiAgICogQHBhcmFtIHNjb3JlIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIF9nZXRSZWN0YW5nbGVTZWxlY3Rpb25zKHN0YXJ0U2VsZWN0b3I6IFNtb1NlbGVjdG9yLCBlbmRTZWxlY3RvcjogU21vU2VsZWN0b3IpOiBTbW9TZWxlY3Rpb25bXSB7XHJcbiAgICBjb25zdCBydjogU21vU2VsZWN0aW9uW10gPSBbXTtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBqID0gMDtcclxuICAgIGZvciAoaSA9IHN0YXJ0U2VsZWN0b3Iuc3RhZmY7IGkgPD0gZW5kU2VsZWN0b3Iuc3RhZmY7IGkrKykge1xyXG4gICAgICBmb3IgKGogPSBzdGFydFNlbGVjdG9yLm1lYXN1cmU7IGogPD0gZW5kU2VsZWN0b3IubWVhc3VyZTsgaisrKSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zY29yZSwgaSwgaik7XHJcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcnYucHVzaCh0YXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBzZXQgdGhlIGdyb3VwaW5nIGZsYWcgZm9yIHVuZG8gb3BlcmF0aW9uc1xyXG4gICAqIEBwYXJhbSB2YWwgXHJcbiAgICovXHJcbiAgZ3JvdXBVbmRvKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5zdG9yZVVuZG8uZ3JvdXBpbmcgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IGFsbCBzdGF2ZXMsIDE6MSBtYXBwaW5nIG9mIHZpZXcgc2NvcmUgc3RhZmYgdG8gc3RvcmVkIHNjb3JlIHN0YWZmXHJcbiAgICovXHJcbiAgZ2V0IGRlZmF1bHRTdGFmZk1hcCgpOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBjb25zdCBydjogbnVtYmVyW10gPSBbXTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIHJ2LnB1c2goaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEJvb3RzdHJhcHBpbmcgZnVuY3Rpb24sIGNyZWF0ZXMgdGhlIHJlbmRlcmVyIGFuZCBhc3NvY2lhdGVkIHRpbWVyc1xyXG4gICAqL1xyXG4gIHN0YXJ0UmVuZGVyaW5nRW5naW5lKCkge1xyXG4gICAgaWYgKCF0aGlzLnJlbmRlcmVyLnNjb3JlKSB7XHJcbiAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIHBhcnQsIGRpc3BsYXkgdGhlIHBhcnQuXHJcbiAgICAgIGlmICh0aGlzLnN0b3JlU2NvcmUuaXNQYXJ0RXhwb3NlZCgpKSB7XHJcbiAgICAgICAgdGhpcy5leHBvc2VQYXJ0KHRoaXMuc2NvcmUuc3RhdmVzWzBdKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBJZiB0aGUgc2NvcmUgaXMgdHJhbnNwb3NpbmcsIGhpZGUgdGhlIGluc3RydW1lbnQgeHBvc2Ugc2V0dGluZ3NcclxuICAgICAgdGhpcy5fc2V0VHJhbnNwb3NpbmcoKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zY29yZSA9IHRoaXMuc2NvcmU7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0Vmlld3BvcnQoKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVuZGVyZXIuc3RhcnREZW1vbigpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBjdXJyZW50IG1hcHBpbmcgb2YgZGlzcGxheWVkIHN0YXZlcyB0byBzY29yZSBzdGF2ZXMgKHRoaXMuc3RvcmVTY29yZSlcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBnZXRWaWV3KCk6IFZpZXdNYXBFbnRyeVtdIHtcclxuICAgIGNvbnN0IHJ2OiBWaWV3TWFwRW50cnlbXSA9IFtdO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgc2hvdyA9IHRoaXMuc3RhZmZNYXAuaW5kZXhPZihpKSA+PSAwO1xyXG4gICAgICBydi5wdXNoKHsgc2hvdyB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBzdGFmZiBJRCB3aGVuIHRoZSB2aWV3IGNoYW5nZXNcclxuICAgKi9cclxuICBzZXRNYXBwZWRTdGFmZklkcygpIHtcclxuICAgIHRoaXMuc2NvcmUuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5pc1BhcnRFeHBvc2VkKCkpIHtcclxuICAgICAgICBzdGFmZi5wYXJ0SW5mby5kaXNwbGF5Q3VlcyA9IHN0YWZmLnBhcnRJbmZvLmN1ZUluU2NvcmU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc3RhZmYucGFydEluZm8uZGlzcGxheUN1ZXMgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBzdGFmZi5zZXRNYXBwZWRTdGFmZklkKHRoaXMuc3RhZmZNYXBbc3RhZmYuc3RhZmZJZF0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJlc2V0UGFydFZpZXcoKSB7XHJcbiAgICBpZiAodGhpcy5zdGFmZk1hcC5sZW5ndGggPT09IDEpIHtcclxuICAgICAgY29uc3Qgc3RhZmYgPSB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuc3RhZmZNYXBbMF1dO1xyXG4gICAgICB0aGlzLmV4cG9zZVBhcnQoc3RhZmYpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBFeHBvc2VzIGEgcGFydDogIGhpZGVzIG5vbi1wYXJ0IHN0YXZlcywgc2hvd3MgcGFydCBzdGF2ZXMuXHJcbiAgICogTm90ZSB0aGlzIHdpbGwgcmVzZXQgdGhlIHZpZXcuICBBZnRlciB0aGlzIG9wZXJhdGlvbiwgc3RhZmYgMCB3aWxsXHJcbiAgICogYmUgdGhlIHNlbGVjdGVkIHBhcnQuXHJcbiAgICogQHBhcmFtIHN0YWZmIFxyXG4gICAqL1xyXG4gIGV4cG9zZVBhcnQoc3RhZmY6IFNtb1N5c3RlbVN0YWZmKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBjb25zdCBleHBvc2VNYXA6IFZpZXdNYXBFbnRyeVtdID0gW107XHJcbiAgICBsZXQgcHVzaE5leHQgPSBmYWxzZTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHRTID0gdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1tpXTtcclxuICAgICAgY29uc3Qgc2hvdyA9IHRTLnN0YWZmSWQgPT09IHN0YWZmLnN0YWZmSWQ7XHJcbiAgICAgIGlmIChwdXNoTmV4dCkge1xyXG4gICAgICAgIGV4cG9zZU1hcC5wdXNoKHsgc2hvdzogdHJ1ZSB9KTtcclxuICAgICAgICBwdXNoTmV4dCA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgIHtcclxuICAgICAgICBleHBvc2VNYXAucHVzaCh7IHNob3cgfSk7XHJcbiAgICAgICAgaWYgKHRTLnBhcnRJbmZvLnN0YXZlc0FmdGVyID4gMCAmJiBzaG93KSB7XHJcbiAgICAgICAgICBwdXNoTmV4dCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFZpZXcoZXhwb3NlTWFwKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBzY29yZSBpcyBkaXNwbGF5aW5nIGluIHBhcnQtbW9kZSB2cy4gc2NvcmUgbW9kZS5cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBpc1BhcnRFeHBvc2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcmUuaXNQYXJ0RXhwb3NlZCgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQYXJ0cyBoYXZlIGRpZmZlcmVudCBmb3JtYXR0aW5nIG9wdGlvbnMgZnJvbSB0aGUgcGFyZW50IHNjb3JlLCBpbmRsdWRpbmcgbGF5b3V0LiAgUmVzZXRcclxuICAgKiB0aGVtIHdoZW4gZXhwb3NpbmcgYSBwYXJ0LlxyXG4gICAqL1xyXG4gIF9tYXBQYXJ0Rm9ybWF0dGluZygpIHtcclxuICAgIHRoaXMuc2NvcmUubGF5b3V0TWFuYWdlciA9IHRoaXMuc2NvcmUuc3RhdmVzWzBdLnBhcnRJbmZvLmxheW91dE1hbmFnZXI7XHJcbiAgICBsZXQgcmVwbGFjZWRUZXh0ID0gZmFsc2U7XHJcbiAgICB0aGlzLnNjb3JlLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICBzdGFmZi51cGRhdGVNZWFzdXJlRm9ybWF0c0ZvclBhcnQoKTtcclxuICAgICAgaWYgKHN0YWZmLnBhcnRJbmZvLnByZXNlcnZlVGV4dEdyb3VwcyAmJiAhcmVwbGFjZWRUZXh0KSB7XHJcbiAgICAgICAgY29uc3QgdGdhOiBTbW9UZXh0R3JvdXBbXSA9IFtdO1xyXG4gICAgICAgIHJlcGxhY2VkVGV4dCA9IHRydWU7XHJcbiAgICAgICAgc3RhZmYucGFydEluZm8udGV4dEdyb3Vwcy5mb3JFYWNoKCh0ZykgPT4ge1xyXG4gICAgICAgICAgdGdhLnB1c2godGcpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc2NvcmUudGV4dEdyb3VwcyA9IHRnYTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgbGlzdCBvZiBzdGF2ZXMgaW4gdGhlIHNjb3JlIHRoYXQgYXJlIGRpc3BsYXllZC5cclxuICAqL1xyXG4gIHNldFZpZXcocm93czogVmlld01hcEVudHJ5W10pIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IGFueSA9IHJvd3MuZmluZCgocm93KSA9PiByb3cuc2hvdyA9PT0gdHJ1ZSk7XHJcbiAgICBpZiAoIWFueSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBuc2NvcmUgPSBTbW9TY29yZS5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlU2NvcmUuc2VyaWFsaXplKFxyXG4gICAgICB7IHNraXBTdGF2ZXM6IHRydWUsIHVzZURpY3Rpb25hcnk6IGZhbHNlLCBwcmVzZXJ2ZVN0YWZmSWRzOiBmYWxzZSB9KSkpO1xyXG4gICAgY29uc3Qgc3RhZmZNYXA6IG51bWJlcltdID0gW107XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCByb3cgPSByb3dzW2ldO1xyXG4gICAgICBpZiAocm93LnNob3cpIHtcclxuICAgICAgICBjb25zdCBzcmNTdGF2ZSA9IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbaV07XHJcbiAgICAgICAgY29uc3QganNvbk9iaiA9IHNyY1N0YXZlLnNlcmlhbGl6ZSh7IHNraXBNYXBzOiBmYWxzZSwgcHJlc2VydmVJZHM6IHRydWUsXHJcbiAgICAgICAgICB0cmFuc3Bvc2VJbnN0cnVtZW50czogIXRoaXMuc3RvcmVTY29yZS5wcmVmZXJlbmNlcy50cmFuc3Bvc2luZ1Njb3JlXHJcbiAgICAgICAgIH0pO1xyXG4gICAgICAgIGpzb25PYmouc3RhZmZJZCA9IHN0YWZmTWFwLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBuU3RhdmUgPSBTbW9TeXN0ZW1TdGFmZi5kZXNlcmlhbGl6ZShqc29uT2JqLCAhdGhpcy5zdG9yZVNjb3JlLnByZWZlcmVuY2VzLnRyYW5zcG9zaW5nU2NvcmUpO1xyXG4gICAgICAgIG5TdGF2ZS5tYXBTdGFmZkZyb21UbyhpLCBuc2NvcmUuc3RhdmVzLmxlbmd0aCk7XHJcbiAgICAgICAgLy8gUmVtYXAgc2NvcmUgdGV4dCBncm91cHMgYXR0YWNoZWQgdG8gbXVzaWMgaW4gdGhpcyBzdGFmZlxyXG4gICAgICAgIGNvbnN0IGxvY2FsVGV4dCA9IFxyXG4gICAgICAgICAgbnNjb3JlLnRleHRHcm91cHMuZmlsdGVyKCh0dCkgPT4gKHR0LmF0dGFjaFRvU2VsZWN0b3IgJiYgdHQuc2VsZWN0b3IgJiYgdHQuc2VsZWN0b3Iuc3RhZmYgPT09IGkpKTtcclxuICAgICAgICBsb2NhbFRleHQuZm9yRWFjaCgodHQpID0+IHtcclxuICAgICAgICAgIGlmICh0dC5zZWxlY3Rvcikge1xyXG4gICAgICAgICAgICB0dC5zZWxlY3Rvci5zdGFmZiA9IG5zY29yZS5zdGF2ZXMubGVuZ3RoO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgbnNjb3JlLnN0YXZlcy5wdXNoKG5TdGF2ZSk7XHJcbiAgICAgICAgaWYgKHNyY1N0YXZlLmtleVNpZ25hdHVyZU1hcCkge1xyXG4gICAgICAgICAgblN0YXZlLmtleVNpZ25hdHVyZU1hcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc3JjU3RhdmUua2V5U2lnbmF0dXJlTWFwKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5TdGF2ZS5tZWFzdXJlcy5mb3JFYWNoKChtZWFzdXJlOiBTbW9NZWFzdXJlLCBpeCkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgc3JjTWVhc3VyZSA9IHNyY1N0YXZlLm1lYXN1cmVzW2l4XTtcclxuICAgICAgICAgIG1lYXN1cmUudGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KHNyY01lYXN1cmUudGVtcG8uc2VyaWFsaXplKCkpO1xyXG4gICAgICAgICAgbWVhc3VyZS50aW1lU2lnbmF0dXJlID0gbmV3IFRpbWVTaWduYXR1cmUoc3JjTWVhc3VyZS50aW1lU2lnbmF0dXJlKTtcclxuICAgICAgICAgIG1lYXN1cmUua2V5U2lnbmF0dXJlID0gc3JjTWVhc3VyZS5rZXlTaWduYXR1cmU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc3RhZmZNYXAucHVzaChpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbnNjb3JlLm51bWJlclN0YXZlcygpO1xyXG4gICAgdGhpcy5zdGFmZk1hcCA9IHN0YWZmTWFwO1xyXG4gICAgdGhpcy5zY29yZSA9IG5zY29yZTtcclxuICAgIC8vIEluZGljYXRlIHdoaWNoIHNjb3JlIHN0YWZmIHZpZXcgc3RhdmVzIGFyZSBtYXBwZWQgdG8sIHRvIGRlY2lkZSB0byBkaXNwbGF5XHJcbiAgICAvLyBtb2RpZmllcnMuXHJcbiAgICB0aGlzLnNldE1hcHBlZFN0YWZmSWRzKCk7XHJcbiAgICAvLyBUT0RPOiBhZGQgcGFydC1zcGVjaWZpYyBtZWFzdXJlIGZvcm1hdHRpbmcsIGV0Yy5cclxuICAgIHRoaXMuX3NldFRyYW5zcG9zaW5nKCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNjb3JlID0gbnNjb3JlO1xyXG4gICAgLy8gSWYgdGhpcyBjdXJyZW50IHZpZXcgaXMgYSBwYXJ0LCBzaG93IHRoZSBwYXJ0IGxheW91dFxyXG4gICAgaWYgKHRoaXMuaXNQYXJ0RXhwb3NlZCgpKSB7XHJcbiAgICAgIHRoaXMuX21hcFBhcnRGb3JtYXR0aW5nKCk7ICAgICAgXHJcbiAgICAgIHRoaXMuc2NvcmUuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgICAgc3RhZmYucGFydEluZm8uZGlzcGxheUN1ZXMgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5jb21wdXRlTXVsdGlwYXJ0UmVzdChuc2NvcmUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY29yZS5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgICBzdGFmZi5wYXJ0SW5mby5kaXNwbGF5Q3VlcyA9IHN0YWZmLnBhcnRJbmZvLmN1ZUluU2NvcmU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KHNjb3JlQ2hhbmdlRXZlbnQsIHsgZGV0YWlsOiB7IHZpZXc6IHRoaXMgfSB9KSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFZpZXdwb3J0KCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHZpZXcgYWxsIHRoZSBzdGFmZnMgaW4gc2NvcmUgbW9kZS5cclxuICAgKi9cclxuICB2aWV3QWxsKCkge1xyXG4gICAgdGhpcy5zY29yZSA9IFNtb1Njb3JlLmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICB0aGlzLnN0b3JlU2NvcmUuc2VyaWFsaXplKHsgc2tpcFN0YXZlczogZmFsc2UsIHVzZURpY3Rpb25hcnk6IGZhbHNlLCBwcmVzZXJ2ZVN0YWZmSWRzOiB0cnVlIH0pKSk7XHJcbiAgICB0aGlzLnN0YWZmTWFwID0gdGhpcy5kZWZhdWx0U3RhZmZNYXA7XHJcbiAgICB0aGlzLnNldE1hcHBlZFN0YWZmSWRzKCk7XHJcbiAgICB0aGlzLl9zZXRUcmFuc3Bvc2luZygpO1xyXG4gICAgdGhpcy5zY29yZS5zeW5jaHJvbml6ZVRleHRHcm91cHModGhpcy5zdG9yZVNjb3JlLnRleHRHcm91cHMpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zY29yZSA9IHRoaXMuc2NvcmU7XHJcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoc2NvcmVDaGFuZ2VFdmVudCwgeyBkZXRhaWw6IHsgdmlldzogdGhpcyB9IH0pKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0Vmlld3BvcnQoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSWYgdGhlIHNjb3JlIGlzIG5vbi10cmFuc3Bvc2VkLCB0cmFuc3Bvc2UgdGhlIHBhcnQgc28gaXQgaXMgaW4gdGhlIFxyXG4gICAqIGNvcnJlY3Qga2V5LlxyXG4gICAqL1xyXG4gIF9zZXRUcmFuc3Bvc2luZygpIHtcclxuICAgIGlmICh0aGlzLmlzUGFydEV4cG9zZWQoKSkge1xyXG4gICAgICBjb25zdCB4cG9zZSA9IHRoaXMuc2NvcmUucHJlZmVyZW5jZXM/LnRyYW5zcG9zaW5nU2NvcmU7XHJcbiAgICAgIGlmICh4cG9zZSkge1xyXG4gICAgICAgIHRoaXMuc2NvcmUuc2V0Tm9uVHJhbnNwb3NpbmcoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSB2aWV3IGFmdGVyIGxvYWRpbmcgb3IgcmVzdG9yaW5nIGEgY29tcGxldGVseSBuZXcgc2NvcmVcclxuICAgKiBAcGFyYW0gc2NvcmUgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgY2hhbmdlU2NvcmUoc2NvcmU6IFNtb1Njb3JlKSB7XHJcbiAgICB0aGlzLnN0b3JlVW5kby5yZXNldCgpO1xyXG4gICAgU3VpQXVkaW9QbGF5ZXIuc3RvcFBsYXllcigpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zY29yZSA9IHNjb3JlO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRWaWV3cG9ydCgpO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlID0gU21vU2NvcmUuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgIHNjb3JlLnNlcmlhbGl6ZSh7IHNraXBTdGF2ZXM6IGZhbHNlLCB1c2VEaWN0aW9uYXJ5OiBmYWxzZSwgcHJlc2VydmVTdGFmZklkczogdHJ1ZSB9KSkpO1xyXG4gICAgdGhpcy5zY29yZSA9IHNjb3JlO1xyXG4gICAgLy8gSWYgdGhlIHNjb3JlIGlzIG5vbi10cmFuc3Bvc2luZywgaGlkZSB0aGUgaW5zdHJ1bWVudCB4cG9zZSBzZXR0aW5nc1xyXG4gICAgdGhpcy5fc2V0VHJhbnNwb3NpbmcoKTtcclxuICAgIHRoaXMuc3RhZmZNYXAgPSB0aGlzLmRlZmF1bHRTdGFmZk1hcDtcclxuICAgIHRoaXMuc2V0TWFwcGVkU3RhZmZJZHMoKTtcclxuICAgIHRoaXMuc2NvcmUuc3luY2hyb25pemVUZXh0R3JvdXBzKHRoaXMuc3RvcmVTY29yZS50ZXh0R3JvdXBzKTtcclxuICAgIGlmICh0aGlzLnN0b3JlU2NvcmUuaXNQYXJ0RXhwb3NlZCgpKSB7XHJcbiAgICAgIHRoaXMuZXhwb3NlUGFydCh0aGlzLnNjb3JlLnN0YXZlc1swXSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBydiA9IGF3YWl0IHRoaXMuYXdhaXRSZW5kZXIoKTtcclxuICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChzY29yZUNoYW5nZUV2ZW50LCB7IGRldGFpbDogeyB2aWV3OiB0aGlzIH0gfSkpO1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICByZXBsYWNlTWVhc3VyZVZpZXcobWVhc3VyZVJhbmdlOiBudW1iZXJbXSkge1xyXG4gICAgZm9yIChsZXQgaSA9IG1lYXN1cmVSYW5nZVswXTsgaSA8PSBtZWFzdXJlUmFuZ2VbMV07ICsraSkge1xyXG4gICAgICB0aGlzLnNjb3JlLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN0YWZmSWQgPSBzdGFmZi5zdGFmZklkO1xyXG4gICAgICAgIGNvbnN0IGFsdFN0YWZmID0gdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1t0aGlzLl9nZXRFcXVpdmFsZW50U3RhZmYoc3RhZmZJZCldO1xyXG4gICAgICAgIGlmIChhbHRTdGFmZikge1xyXG4gICAgICAgICAgc3RhZmYuc3luY1N0YWZmTW9kaWZpZXJzKGksIGFsdFN0YWZmKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gR2V0IGEgY29weSBvZiB0aGUgYmFja2luZyBzY29yZSwgYW5kIG1hcCBpdCB0byB0aGUgc2NvcmUgc3RhdmUuICB0aGlzLnNjb3JlIG1heSBoYXZlIGZld2VyIHN0YXZlc1xyXG4gICAgICAgIC8vIHRoYW4gdGhpcy5zdG9yZVNjb3JlXHJcbiAgICAgICAgY29uc3Qgc3ZnID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzdGFmZi5tZWFzdXJlc1tpXS5zdmcpKTtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gVW5kb0J1ZmZlci5zZXJpYWxpemVNZWFzdXJlKHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbdGhpcy5zdGFmZk1hcFtzdGFmZklkXV0ubWVhc3VyZXNbaV0pO1xyXG4gICAgICAgIHNlcmlhbGl6ZWQubWVhc3VyZU51bWJlci5zdGFmZklkID0gc3RhZmZJZDtcclxuICAgICAgICBjb25zdCB4cG9zZSA9IHNlcmlhbGl6ZWQudHJhbnNwb3NlSW5kZXggPz8gMDtcclxuICAgICAgICBjb25zdCBjb25jZXJ0S2V5ID0gU21vTXVzaWMudmV4S2V5U2lnV2l0aE9mZnNldChzZXJpYWxpemVkLmtleVNpZ25hdHVyZSA/PyAnYycsIC0xICogeHBvc2UpO1xyXG4gICAgICAgIHNlcmlhbGl6ZWQua2V5U2lnbmF0dXJlID0gY29uY2VydEtleTtcclxuICAgICAgICBjb25zdCBybWVhc3VyZSA9IFNtb01lYXN1cmUuZGVzZXJpYWxpemUoc2VyaWFsaXplZCk7XHJcbiAgICAgICAgcm1lYXN1cmUuc3ZnID0gc3ZnO1xyXG4gICAgICAgIC8vIFdlIHVzZWQgdG8gZm9yY2UgYSB0cmFucG9zaW5nIHNjb3JlIHN0ZmYgaW50byAgJ2MnIGJ1dCBub3cgd2Uga2VlcCB0aGUgXHJcbiAgICAgICAgLy8gbWVhc3VyZXMgaW4gdGhlIGNvbmNlcnQga2V5LCBhbmQgdGhlIHRyYW5zcG9zZSBvZmZzZXQgdG8gMCwgc28gbm8gbmVlZCB0byBkbyBhbnl0aGluZ1xyXG4gICAgICAgIC8vIHNwZWNpYWwgaGVyZS5cclxuICAgICAgICBjb25zdCBzZWxlY3RvcjogU21vU2VsZWN0b3IgPSB7IHN0YWZmOiBzdGFmZklkLCBtZWFzdXJlOiBpLCB2b2ljZTogMCwgdGljazogMCwgcGl0Y2hlczogW10gfTtcclxuICAgICAgICB0aGlzLnNjb3JlLnJlcGxhY2VNZWFzdXJlKHNlbGVjdG9yLCBybWVhc3VyZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENvbHVtblRvUmVwbGFjZVF1ZXVlKGkpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBmb3IgdGhlIHZpZXcgc2NvcmUsIHRoZSByZW5kZXJlciBkZWNpZGVzIHdoYXQgdG8gcmVuZGVyXHJcbiAgICogZGVwZW5kaW5nIG9uIHdoYXQgaXMgdW5kb25lLlxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHVuZG8oKSB7XHJcbiAgICBpZiAoIXRoaXMucmVuZGVyZXIuc2NvcmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAoIXRoaXMuc3RvcmVVbmRvLmJ1ZmZlcnNBdmFpbGFibGUoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzdGFmZk1hcDogUmVjb3JkPG51bWJlciwgbnVtYmVyPiA9IHt9O1xyXG4gICAgY29uc3QgaWRlbnRpdHlNYXA6IFJlY29yZDxudW1iZXIsIG51bWJlcj4gPSB7fTtcclxuICAgIHRoaXMuZGVmYXVsdFN0YWZmTWFwLmZvckVhY2goKG5uKSA9PiBpZGVudGl0eU1hcFtubl0gPSBubik7XHJcbiAgICB0aGlzLnN0YWZmTWFwLmZvckVhY2goKG1tLCBpeCkgPT4gc3RhZmZNYXBbbW1dID0gaXgpO1xyXG4gICAgLy8gQSBzY29yZS1sZXZlbCB1bmRvIG1pZ2h0IGhhdmUgY2hhbmdlZCB0aGUgc2NvcmUuXHJcbiAgICBjb25zdCBmdWxsU2NvcmUgPSB0aGlzLnN0b3JlVW5kby51bmRvU2NvcmVQZWVrKCk7XHJcbiAgICAvLyB0ZXh0IHVuZG8gaXMgaGFuZGxlZCBkaWZmZXJlbnRseSBzaW5jZSB0aGVyZSBpcyB1c3VhbGx5IG5vdFxyXG4gICAgLy8gYW4gYXNzb2NpYXRlZCBtZWFzdXJlLlxyXG4gICAgY29uc3Qgc2NvcmVUZXh0ID0gdGhpcy5zdG9yZVVuZG8udW5kb1Njb3JlVGV4dEdyb3VwUGVlaygpO1xyXG4gICAgY29uc3QgcGFydFRleHQgPSB0aGlzLnN0b3JlVW5kby51bmRvUGFydFRleHRHcm91cFBlZWsoKTtcclxuICAgIGlmIChzY29yZVRleHQgfHwgcGFydFRleHQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5yZW5kZXJlci51bnJlbmRlclRleHRHcm91cHMoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1lYXN1cmVSYW5nZSA9IHRoaXMuc3RvcmVVbmRvLmdldE1lYXN1cmVSYW5nZSgpO1xyXG4gICAgaWYgKCEoZnVsbFNjb3JlIHx8IHNjb3JlVGV4dCB8fCBwYXJ0VGV4dCkpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IG1lYXN1cmVSYW5nZVswXTsgaSA8PSBtZWFzdXJlUmFuZ2VbMV07ICsraSkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIudW5yZW5kZXJDb2x1bW4odGhpcy5zY29yZS5zdGF2ZXNbMF0ubWVhc3VyZXNbaV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUgPSB0aGlzLnN0b3JlVW5kby51bmRvKHRoaXMuc3RvcmVTY29yZSwgaWRlbnRpdHlNYXAsIHRydWUpO1xyXG4gICAgaWYgKGZ1bGxTY29yZSkge1xyXG4gICAgICB0aGlzLnZpZXdBbGwoKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICB9IGVsc2UgaWYgKHBhcnRUZXh0KSB7XHJcbiAgICAgIHRoaXMuc2V0Vmlldyh0aGlzLmdldFZpZXcoKSk7XHJcbiAgICB9IGVsc2UgaWYgKHNjb3JlVGV4dCkge1xyXG4gICAgICB0aGlzLnNjb3JlLnN5bmNocm9uaXplVGV4dEdyb3Vwcyh0aGlzLnN0b3JlU2NvcmUudGV4dEdyb3Vwcyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIucmVyZW5kZXJUZXh0R3JvdXBzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlcGxhY2VNZWFzdXJlVmlldyhtZWFzdXJlUmFuZ2UpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/render/sui/scoreView.ts\n\n}");
1339
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiScoreView: () => (/* binding */ SuiScoreView)\n/* harmony export */ });\n/* harmony import */ var _smo_data_score__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/score */ \"./src/smo/data/score.ts\");\n/* harmony import */ var _smo_data_measure__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/measure */ \"./src/smo/data/measure.ts\");\n/* harmony import */ var _smo_data_music__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../smo/data/music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _smo_data_systemStaff__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../smo/data/systemStaff */ \"./src/smo/data/systemStaff.ts\");\n/* harmony import */ var _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../smo/data/staffModifiers */ \"./src/smo/data/staffModifiers.ts\");\n/* harmony import */ var _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/xform/selections */ \"./src/smo/xform/selections.ts\");\n/* harmony import */ var _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../smo/xform/undo */ \"./src/smo/xform/undo.ts\");\n/* harmony import */ var _smo_xform_copypaste__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../smo/xform/copypaste */ \"./src/smo/xform/copypaste.ts\");\n/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./scroller */ \"./src/render/sui/scroller.ts\");\n/* harmony import */ var _svgHelpers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _tracker__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./tracker */ \"./src/render/sui/tracker.ts\");\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _renderState__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./renderState */ \"./src/render/sui/renderState.ts\");\n/* harmony import */ var _smo_xform_operations__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../smo/xform/operations */ \"./src/smo/xform/operations.ts\");\n/* harmony import */ var _audio_player__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../audio/player */ \"./src/render/audio/player.ts\");\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\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 * Base class for all operations on the rendered score. The base class handles the following:\n * 1. Undo and recording actions for the operation\n * 2. Maintain/change which staves in the score are displayed (staff map)\n * 3. Mapping between the displayed score and the data representation\n * @category SuiRender\n */\nclass SuiScoreView {\n constructor(config, svgContainer, score, scrollSelector, undoBuffer) {\n this.selectedPart = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n this.score = score;\n const renderParams = {\n elementId: svgContainer,\n score,\n config,\n undoBuffer\n };\n this.audioAnimation = config.audioAnimation;\n this.renderer = new _renderState__WEBPACK_IMPORTED_MODULE_12__.SuiRenderState(renderParams);\n this.config = config;\n const scoreJson = score.serialize({ skipStaves: false, useDictionary: false, preserveStaffIds: true });\n this.scroller = new _scroller__WEBPACK_IMPORTED_MODULE_8__.SuiScroller(scrollSelector, this.renderer.renderer.vexContainers);\n this.storePaste = new _smo_xform_copypaste__WEBPACK_IMPORTED_MODULE_7__.PasteBuffer();\n this.tracker = new _tracker__WEBPACK_IMPORTED_MODULE_10__.SuiTracker(this.renderer, this.scroller);\n this.renderer.setMeasureMapper(this.tracker);\n this.storeScore = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(scoreJson));\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n this.storeUndo = new _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer();\n this.staffMap = this.defaultStaffMap;\n SuiScoreView.Instance = this; // for debugging\n this.setMappedStaffIds();\n (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_11__.createTopDomContainer)('.saveLink'); // for file upload\n }\n get PartName() {\n return this.selectedPart;\n }\n /**\n * Await on the full update of the score\n * @returns\n */\n renderPromise() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.renderer.renderPromise();\n });\n }\n /**\n * Await on the partial update of the score in the view\n * @returns\n */\n updatePromise() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.renderer.updatePromise();\n });\n }\n awaitRender() {\n return __awaiter(this, void 0, void 0, function* () {\n this.renderer.rerenderAll();\n return this.renderer.updatePromise();\n });\n }\n /**\n * await on the full update of the score, also resetting the viewport (to reflect layout changes)\n * @returns\n */\n refreshViewport() {\n return __awaiter(this, void 0, void 0, function* () {\n this.renderer.preserveScroll();\n this.renderer.setViewport();\n this.renderer.setRefresh();\n yield this.renderer.renderPromise();\n });\n }\n handleScrollEvent(scrollLeft, scrollTop) {\n this.tracker.scroller.handleScroll(scrollLeft, scrollTop);\n }\n getPartMap() {\n let keepNext = false;\n let partCount = 0;\n let partMap = {};\n const keys = [];\n this.storeScore.staves.forEach((staff) => {\n const partInfo = staff.partInfo;\n partInfo.associatedStaff = staff.staffId;\n if (!keepNext) {\n partMap[partCount] = partInfo;\n keys.push(partCount);\n partCount += 1;\n if (partInfo.stavesAfter > 0) {\n keepNext = true;\n }\n }\n else {\n keepNext = false;\n }\n });\n return { keys, partMap };\n }\n /**\n * Any method that modifies a set of selections can call this to update\n * the score view and the backing score.\n * @param actor\n * @param selections\n */\n modifyCurrentSelections(label, actor) {\n return __awaiter(this, void 0, void 0, function* () {\n const altSelections = this._getEquivalentSelections(this.tracker.selections);\n this.undoTrackerMeasureSelections(label);\n actor(this.score, this.tracker.selections);\n actor(this.storeScore, altSelections);\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList(this.tracker.selections));\n yield this.updatePromise();\n });\n }\n /**\n * Any method that modifies a set of selections can call this to update\n * the score view and the backing score.\n * @param actor\n * @param selections\n */\n modifySelection(label, selection, actor) {\n return __awaiter(this, void 0, void 0, function* () {\n const altSelection = this._getEquivalentSelection(selection);\n this.undoTrackerMeasureSelections(label);\n actor(this.score, [selection]);\n if (altSelection) {\n actor(this.storeScore, [altSelection]);\n }\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList([selection]));\n yield this.updatePromise();\n });\n }\n /**\n * Any method that modifies a set of selections can call this to update\n * the score view and the backing score.\n * @param actor\n * @param selections\n */\n modifySelectionNoWait(label, selection, actor) {\n return __awaiter(this, void 0, void 0, function* () {\n const altSelection = this._getEquivalentSelection(selection);\n this.undoTrackerMeasureSelections(label);\n actor(this.score, selection);\n if (altSelection) {\n actor(this.storeScore, altSelection);\n }\n this._renderChangedMeasures(_smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList([selection]));\n });\n }\n /**\n * Modifiy a set of columns, e.g. tempo, time, key. This has different undo behavior, don't\n * pend on the result because there may be a combination of operations.\n * @param label\n * @param selections\n * @param actor\n */\n modifyColumnsSelectionsNoWait(label, selections, actor) {\n this.undoColumnRange(label, selections);\n selections.forEach((selection) => {\n const altSelection = this._getEquivalentSelection(selection);\n actor(this.score, selection);\n if (altSelection) {\n actor(this.storeScore, altSelection);\n }\n });\n this._renderChangedMeasures(selections);\n }\n /**\n * This is used in some Smoosic demos and pens.\n * @param action any action, but most usefully a SuiScoreView method\n * @param repetition number of times to repeat, waiting on render promise between\n * if not specified, defaults to 1\n * @returns promise, resolved action has been completed and score is updated.\n */\n waitableAction(action, repetition) {\n return __awaiter(this, void 0, void 0, function* () {\n const rep = repetition !== null && repetition !== void 0 ? repetition : 1;\n const self = this;\n const promise = new Promise((resolve) => {\n const fc = (count) => __awaiter(this, void 0, void 0, function* () {\n if (count > 0) {\n action();\n yield self.renderer.updatePromise();\n fc(count - 1);\n }\n else {\n resolve();\n }\n });\n fc(rep);\n });\n return promise;\n });\n }\n /**\n * The plural form of _getEquivalentSelection\n * @param selections\n * @returns\n */\n _getEquivalentSelections(selections) {\n const rv = [];\n selections.forEach((selection) => {\n const sel = this._getEquivalentSelection(selection);\n if (sel !== null) {\n rv.push(sel);\n }\n });\n return rv;\n }\n // Get a long enough list of measures to paste into\n getPasteMeasureList() {\n // The length of the paste buffer, in ticks\n const ticksToPaste = this.storePaste.getCopyBufferTickCount();\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList(this.tracker.selections);\n if (!selections.length) {\n return [];\n }\n const destination = selections[0];\n selections.splice(0);\n selections.push(destination);\n const voice = destination.selector.voice;\n const tm = destination.measure.tickmapForVoice(voice);\n // length of first selected measure, in ticks\n const measureTicks = destination.measure.getTicksFromVoice(voice);\n // remaining ticks after first selection. This is our starting point.\n let startTick = measureTicks - tm.durationMap[this.tracker.selections[0].selector.tick];\n let currentMeasure = destination.selector.measure + 1;\n // if we are short, and there are measures left, add them to the selection list\n while (startTick < ticksToPaste && destination.staff.measures.length > currentMeasure) {\n const newSel = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.measureSelection(this.score, destination.selector.staff, currentMeasure);\n if (newSel) {\n selections.push(newSel);\n startTick += newSel.measure.getTicksFromThisOrAnyVoice(voice);\n }\n currentMeasure += 1;\n }\n return selections;\n }\n /**\n * A staff modifier has changed, create undo operations for the measures affected\n * @param label\n * @param staffModifier\n * @param subtype\n */\n undoStaffModifier(label, staffModifier, subtype) {\n const copy = _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_4__.StaffModifierBase.deserialize(staffModifier.serialize());\n copy.startSelector = this._getEquivalentSelector(copy.startSelector);\n copy.endSelector = this._getEquivalentSelector(copy.endSelector);\n const copySer = copy.serialize();\n // Copy ID so we can undo properly\n copySer.attrs = JSON.parse(JSON.stringify(staffModifier.attrs));\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.STAFF_MODIFIER, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, copySer, subtype);\n }\n /**\n * Return the index of the page that is in the center of the client screen.\n */\n getFocusedPage() {\n if (this.score.layoutManager === undefined) {\n return 0;\n }\n const scrollAvg = this.tracker.scroller.netScroll.y + (this.tracker.scroller.viewport.height / 2);\n const midY = scrollAvg;\n const layoutManager = this.score.layoutManager.getGlobalLayout();\n const lh = layoutManager.pageHeight / layoutManager.svgScale;\n const lw = layoutManager.pageWidth / layoutManager.svgScale;\n const pt = this.renderer.pageMap.svgToClient(_svgHelpers__WEBPACK_IMPORTED_MODULE_9__.SvgHelpers.smoBox({ x: lw, y: lh }));\n return Math.round(midY / pt.y);\n }\n /**\n * Create a rectangle undo, like a multiple columns but not necessarily the whole\n * score.\n */\n _undoColumn(label, measureIndex) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.COLUMN, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, { score: this.storeScore, measureIndex }, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n /**\n * Score preferences don't affect the display, but they do have an undo\n * @param label\n */\n _undoScorePreferences(label) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.SCORE_ATTRIBUTES, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, this.storeScore, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n undoColumnRange(label, measureSelections) {\n const checked = {};\n measureSelections.forEach((measureSelection) => {\n if (!checked[measureSelection.selector.measure]) {\n checked[measureSelection.selector.measure] = true;\n this._undoColumn(label, measureSelection.selector.measure);\n }\n });\n }\n undoMeasureRange(label, measureSelections) {\n measureSelections.forEach((measureSelection) => {\n const equiv = this._getEquivalentSelection(measureSelection);\n if (equiv !== null) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.MEASURE, equiv.selector, equiv.measure, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n });\n return measureSelections;\n }\n /**\n * Add to the undo buffer the current set of measures selected.\n * @param label\n * @returns\n */\n undoTrackerMeasureSelections(label) {\n const measureSelections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.getMeasureList(this.tracker.selections);\n return this.undoMeasureRange(label, measureSelections);\n }\n /**\n * operation that only affects the first selection. Setup undo for the measure\n */\n _undoFirstMeasureSelection(label) {\n const sel = this.tracker.selections[0];\n const equiv = this._getEquivalentSelection(sel);\n if (equiv !== null) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.MEASURE, equiv.selector, equiv.measure, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n return sel;\n }\n /**\n * Add the selection to the undo buffer\n * @param label\n * @param selection\n */\n _undoSelection(label, selection) {\n const equiv = this._getEquivalentSelection(selection);\n if (equiv !== null) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.MEASURE, equiv.selector, equiv.measure, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n }\n /**\n * Add multiple selections to the undo buffer as a group\n * @param label\n * @param selections\n */\n _undoSelections(label, selections) {\n this.storeUndo.grouping = true;\n selections.forEach((selection) => {\n this._undoSelection(label, selection);\n });\n this.storeUndo.grouping = false;\n }\n /**\n * Update renderer for measures that have changed\n */\n _renderChangedMeasures(measureSelections) {\n if (!Array.isArray(measureSelections)) {\n measureSelections = [measureSelections];\n }\n measureSelections.forEach((measureSelection) => {\n this.renderer.addToReplaceQueue(measureSelection);\n });\n }\n /**\n * Update renderer for some columns\n * @param fromSelector\n * @param toSelector\n */\n _renderRectangle(fromSelector, toSelector) {\n this._getRectangleSelections(fromSelector, toSelector).forEach((s) => {\n this.renderer.addToReplaceQueue(s);\n });\n }\n /**\n * Setup undo for operation that affects the whole score\n * @param label\n */\n _undoScore(label) {\n this.storeUndo.addBuffer(label, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferTypes.SCORE, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelector.default, this.storeScore, _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.bufferSubtypes.NONE);\n }\n /**\n * Get the selector from this.storeScore that maps to the displayed selector from this.score\n * @param selector\n * @returns\n */\n _getEquivalentSelector(selector) {\n const rv = JSON.parse(JSON.stringify(selector));\n rv.staff = this.staffMap[selector.staff];\n return rv;\n }\n /**\n * Get the equivalent staff id from this.storeScore that maps to the displayed selector from this.score\n * @param staffId\n * @returns\n */\n _getEquivalentStaff(staffId) {\n return this.staffMap[staffId];\n }\n /**\n * Get the equivalent selection from this.storeScore that maps to the displayed selection from this.score\n * @param selection\n * @returns\n */\n _getEquivalentSelection(selection) {\n try {\n if (typeof (selection.selector.tick) === 'undefined') {\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.measureSelection(this.storeScore, this.staffMap[selection.selector.staff], selection.selector.measure);\n }\n if (typeof (selection.selector.pitches) === 'undefined') {\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.noteSelection(this.storeScore, this.staffMap[selection.selector.staff], selection.selector.measure, selection.selector.voice, selection.selector.tick);\n }\n return _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.pitchSelection(this.storeScore, this.staffMap[selection.selector.staff], selection.selector.measure, selection.selector.voice, selection.selector.tick, selection.selector.pitches);\n }\n catch (ex) {\n console.warn(ex);\n return null;\n }\n }\n /**\n * Get the equivalent selection from this.storeScore that maps to the displayed selection from this.score\n * @param selection\n * @returns\n */\n _getEquivalentGraceNote(selection, gn) {\n if (selection.note !== null) {\n const rv = selection.note.getGraceNotes().find((gg) => gg.attrs.id === gn.attrs.id);\n if (rv) {\n return rv;\n }\n }\n return gn;\n }\n /**\n * Get the rectangle of selections indicated by the parameters from the score\n * @param startSelector\n * @param endSelector\n * @param score\n * @returns\n */\n _getRectangleSelections(startSelector, endSelector) {\n const rv = [];\n let i = 0;\n let j = 0;\n for (i = startSelector.staff; i <= endSelector.staff; i++) {\n for (j = startSelector.measure; j <= endSelector.measure; j++) {\n const target = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_5__.SmoSelection.measureSelection(this.score, i, j);\n if (target !== null) {\n rv.push(target);\n }\n }\n }\n return rv;\n }\n /**\n * set the grouping flag for undo operations\n * @param val\n */\n groupUndo(val) {\n this.storeUndo.grouping = val;\n }\n /**\n * Show all staves, 1:1 mapping of view score staff to stored score staff\n */\n get defaultStaffMap() {\n let i = 0;\n const rv = [];\n for (i = 0; i < this.storeScore.staves.length; ++i) {\n rv.push(i);\n }\n return rv;\n }\n /**\n * Bootstrapping function, creates the renderer and associated timers\n */\n startRenderingEngine() {\n if (!this.renderer.score) {\n // If there is only one part, display the part.\n if (this.storeScore.isPartExposed()) {\n this.exposePart(this.score.staves[0]);\n }\n // If the score is transposing, hide the instrument xpose settings\n this._setTransposing();\n this.renderer.score = this.score;\n this.renderer.setViewport();\n }\n this.renderer.startDemon();\n }\n /**\n * Gets the current mapping of displayed staves to score staves (this.storeScore)\n * @returns\n */\n getView() {\n const rv = [];\n let i = 0;\n for (i = 0; i < this.storeScore.staves.length; ++i) {\n const show = this.staffMap.indexOf(i) >= 0;\n rv.push({ show });\n }\n return rv;\n }\n /**\n * Update the staff ID when the view changes\n */\n setMappedStaffIds() {\n this.score.staves.forEach((staff) => {\n if (!this.isPartExposed()) {\n staff.partInfo.displayCues = staff.partInfo.cueInScore;\n }\n else {\n staff.partInfo.displayCues = false;\n }\n staff.setMappedStaffId(this.staffMap[staff.staffId]);\n });\n }\n resetPartView() {\n if (this.staffMap.length === 1) {\n const staff = this.storeScore.staves[this.staffMap[0]];\n this.exposePart(staff);\n }\n }\n /**\n * Exposes a part: hides non-part staves, shows part staves.\n * Note this will reset the view. After this operation, staff 0 will\n * be the selected part.\n * @param staff\n */\n exposePart(staff) {\n let i = 0;\n const exposeMap = [];\n let pushNext = false;\n for (i = 0; i < this.storeScore.staves.length; ++i) {\n const tS = this.storeScore.staves[i];\n const show = tS.staffId === staff.staffId;\n const part = tS.partInfo;\n if (show) {\n this.selectedPart.value = part.partName;\n }\n if (pushNext) {\n exposeMap.push({ show: true });\n pushNext = false;\n }\n else {\n exposeMap.push({ show });\n if (tS.partInfo.stavesAfter > 0 && show) {\n pushNext = true;\n }\n }\n }\n this.setView(exposeMap);\n }\n /**\n * Indicates if the score is displaying in part-mode vs. score mode.\n * @returns\n */\n isPartExposed() {\n return this.score.isPartExposed();\n }\n /**\n * Parts have different formatting options from the parent score, indluding layout. Reset\n * them when exposing a part.\n */\n _mapPartFormatting() {\n this.score.layoutManager = this.score.staves[0].partInfo.layoutManager;\n let replacedText = false;\n this.score.staves.forEach((staff) => {\n staff.updateMeasureFormatsForPart();\n if (staff.partInfo.preserveTextGroups && !replacedText) {\n const tga = [];\n replacedText = true;\n staff.partInfo.textGroups.forEach((tg) => {\n tga.push(tg);\n });\n this.score.textGroups = tga;\n }\n });\n }\n /**\n * Update the list of staves in the score that are displayed.\n */\n setView(rows) {\n let i = 0;\n const any = rows.find((row) => row.show === true);\n if (!any) {\n return;\n }\n const nscore = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(this.storeScore.serialize({ skipStaves: true, useDictionary: false, preserveStaffIds: false })));\n const staffMap = [];\n for (i = 0; i < rows.length; ++i) {\n const row = rows[i];\n if (row.show) {\n const srcStave = this.storeScore.staves[i];\n const jsonObj = srcStave.serialize({ skipMaps: false, preserveIds: true,\n transposeInstruments: !this.storeScore.preferences.transposingScore\n });\n jsonObj.staffId = staffMap.length;\n const nStave = _smo_data_systemStaff__WEBPACK_IMPORTED_MODULE_3__.SmoSystemStaff.deserialize(jsonObj, !this.storeScore.preferences.transposingScore);\n nStave.mapStaffFromTo(i, nscore.staves.length);\n // Remap score text groups attached to music in this staff\n const localText = nscore.textGroups.filter((tt) => (tt.attachToSelector && tt.selector && tt.selector.staff === i));\n localText.forEach((tt) => {\n if (tt.selector) {\n tt.selector.staff = nscore.staves.length;\n }\n });\n nscore.staves.push(nStave);\n if (srcStave.keySignatureMap) {\n nStave.keySignatureMap = JSON.parse(JSON.stringify(srcStave.keySignatureMap));\n }\n nStave.measures.forEach((measure, ix) => {\n const srcMeasure = srcStave.measures[ix];\n measure.tempo = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_15__.SmoTempoText(srcMeasure.tempo.serialize());\n measure.timeSignature = new _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_15__.TimeSignature(srcMeasure.timeSignature);\n measure.keySignature = srcMeasure.keySignature;\n });\n staffMap.push(i);\n }\n }\n nscore.numberStaves();\n this.staffMap = staffMap;\n this.score = nscore;\n // Indicate which score staff view staves are mapped to, to decide to display\n // modifiers.\n this.setMappedStaffIds();\n // TODO: add part-specific measure formatting, etc.\n this._setTransposing();\n this.renderer.score = nscore;\n // If this current view is a part, show the part layout\n if (this.isPartExposed()) {\n this._mapPartFormatting();\n this.score.staves.forEach((staff) => {\n staff.partInfo.displayCues = false;\n });\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_13__.SmoOperation.computeMultipartRest(nscore);\n }\n else {\n this.score.staves.forEach((staff) => {\n staff.partInfo.displayCues = staff.partInfo.cueInScore;\n });\n }\n window.dispatchEvent(new CustomEvent(_renderState__WEBPACK_IMPORTED_MODULE_12__.scoreChangeEvent, { detail: { view: this } }));\n this.renderer.setViewport();\n }\n /**\n * view all the staffs in score mode.\n */\n viewAll() {\n this.score = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(this.storeScore.serialize({ skipStaves: false, useDictionary: false, preserveStaffIds: true })));\n this.staffMap = this.defaultStaffMap;\n this.setMappedStaffIds();\n this._setTransposing();\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n this.renderer.score = this.score;\n window.dispatchEvent(new CustomEvent(_renderState__WEBPACK_IMPORTED_MODULE_12__.scoreChangeEvent, { detail: { view: this } }));\n this.selectedPart.value = 'Select Part';\n this.renderer.setViewport();\n }\n /**\n * If the score is non-transposed, transpose the part so it is in the\n * correct key.\n */\n _setTransposing() {\n var _a;\n if (this.isPartExposed()) {\n const xpose = (_a = this.score.preferences) === null || _a === void 0 ? void 0 : _a.transposingScore;\n if (xpose) {\n this.score.setNonTransposing();\n }\n }\n }\n /**\n * Update the view after loading or restoring a completely new score\n * @param score\n * @returns\n */\n changeScore(score) {\n return __awaiter(this, void 0, void 0, function* () {\n this.storeUndo.reset();\n _audio_player__WEBPACK_IMPORTED_MODULE_14__.SuiAudioPlayer.stopPlayer();\n this.renderer.score = score;\n this.renderer.setViewport();\n this.storeScore = _smo_data_score__WEBPACK_IMPORTED_MODULE_0__.SmoScore.deserialize(JSON.stringify(score.serialize({ skipStaves: false, useDictionary: false, preserveStaffIds: true })));\n this.score = score;\n // If the score is non-transposing, hide the instrument xpose settings\n this._setTransposing();\n this.staffMap = this.defaultStaffMap;\n this.setMappedStaffIds();\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n if (this.storeScore.isPartExposed()) {\n this.exposePart(this.score.staves[0]);\n }\n const rv = yield this.awaitRender();\n window.dispatchEvent(new CustomEvent(_renderState__WEBPACK_IMPORTED_MODULE_12__.scoreChangeEvent, { detail: { view: this } }));\n return rv;\n });\n }\n replaceMeasureView(measureRange) {\n for (let i = measureRange[0]; i <= measureRange[1]; ++i) {\n this.score.staves.forEach((staff) => {\n var _a, _b;\n const staffId = staff.staffId;\n const altStaff = this.storeScore.staves[this._getEquivalentStaff(staffId)];\n if (altStaff) {\n staff.syncStaffModifiers(i, altStaff);\n }\n // Get a copy of the backing score, and map it to the score stave. this.score may have fewer staves\n // than this.storeScore\n const svg = JSON.parse(JSON.stringify(staff.measures[i].svg));\n const serialized = _smo_xform_undo__WEBPACK_IMPORTED_MODULE_6__.UndoBuffer.serializeMeasure(this.storeScore.staves[this.staffMap[staffId]].measures[i]);\n serialized.measureNumber.staffId = staffId;\n const xpose = (_a = serialized.transposeIndex) !== null && _a !== void 0 ? _a : 0;\n const concertKey = _smo_data_music__WEBPACK_IMPORTED_MODULE_2__.SmoMusic.vexKeySigWithOffset((_b = serialized.keySignature) !== null && _b !== void 0 ? _b : 'c', -1 * xpose);\n serialized.keySignature = concertKey;\n const rmeasure = _smo_data_measure__WEBPACK_IMPORTED_MODULE_1__.SmoMeasure.deserialize(serialized);\n rmeasure.svg = svg;\n // We used to force a tranposing score stff into 'c' but now we keep the \n // measures in the concert key, and the transpose offset to 0, so no need to do anything\n // special here.\n const selector = { staff: staffId, measure: i, voice: 0, tick: 0, pitches: [] };\n this.score.replaceMeasure(selector, rmeasure);\n });\n this.renderer.addColumnToReplaceQueue(i);\n }\n }\n /**\n * for the view score, the renderer decides what to render\n * depending on what is undone.\n * @returns\n */\n undo() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.renderer.score) {\n return;\n }\n if (!this.storeUndo.buffersAvailable()) {\n return;\n }\n const staffMap = {};\n const identityMap = {};\n this.defaultStaffMap.forEach((nn) => identityMap[nn] = nn);\n this.staffMap.forEach((mm, ix) => staffMap[mm] = ix);\n // A score-level undo might have changed the score.\n const fullScore = this.storeUndo.undoScorePeek();\n // text undo is handled differently since there is usually not\n // an associated measure.\n const scoreText = this.storeUndo.undoScoreTextGroupPeek();\n const partText = this.storeUndo.undoPartTextGroupPeek();\n if (scoreText || partText) {\n yield this.renderer.unrenderTextGroups();\n }\n const measureRange = this.storeUndo.getMeasureRange();\n if (!(fullScore || scoreText || partText)) {\n for (let i = measureRange[0]; i <= measureRange[1]; ++i) {\n this.renderer.unrenderColumn(this.score.staves[0].measures[i]);\n }\n }\n this.storeScore = this.storeUndo.undo(this.storeScore, identityMap, true);\n if (fullScore) {\n this.viewAll();\n this.renderer.setRefresh();\n }\n else if (partText) {\n this.setView(this.getView());\n }\n else if (scoreText) {\n this.score.synchronizeTextGroups(this.storeScore.textGroups);\n this.renderer.rerenderTextGroups();\n }\n else {\n this.replaceMeasureView(measureRange);\n }\n yield this.renderer.updatePromise();\n });\n }\n}\nSuiScoreView.Instance = null;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFJLENBQUMsQ0FBQztZQUMxRSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdCLENBQUM7aUJBQU0sSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUMvQixDQUFDO2lCQUFNLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUNELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0tBQUE7O0FBcHZCTSxxQkFBUSxHQUF3QixJQUFJLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvcmVuZGVyL3N1aS9zY29yZVZpZXcudHM/MDk3YiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuaW1wb3J0IHsgU21vU2NvcmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zY29yZSc7XHJcbmltcG9ydCB7IFNtb01lYXN1cmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tZWFzdXJlJztcclxuaW1wb3J0IHsgU21vVGV4dEdyb3VwIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc2NvcmVUZXh0JztcclxuaW1wb3J0IHsgU21vR3JhY2VOb3RlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbm90ZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb011c2ljIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbXVzaWMnO1xyXG5pbXBvcnQgeyBTbW9TeXN0ZW1TdGFmZiB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3N5c3RlbVN0YWZmJztcclxuaW1wb3J0IHsgU21vUGFydEluZm8gfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9wYXJ0SW5mbyc7XHJcbmltcG9ydCB7IFN0YWZmTW9kaWZpZXJCYXNlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc3RhZmZNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9TZWxlY3Rpb24sIFNtb1NlbGVjdG9yIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL3NlbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBVbmRvQnVmZmVyLCBjb3B5VW5kbyB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS91bmRvJztcclxuaW1wb3J0IHsgUGFzdGVCdWZmZXIgfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vY29weXBhc3RlJztcclxuaW1wb3J0IHsgU3VpU2Nyb2xsZXIgfSBmcm9tICcuL3Njcm9sbGVyJztcclxuaW1wb3J0IHsgU3ZnSGVscGVycyB9IGZyb20gJy4vc3ZnSGVscGVycyc7XHJcbmltcG9ydCB7IFN1aVRyYWNrZXIgfSBmcm9tICcuL3RyYWNrZXInO1xyXG5pbXBvcnQgeyBjcmVhdGVUb3BEb21Db250YWluZXIgfSBmcm9tICcuLi8uLi9jb21tb24vaHRtbEhlbHBlcnMnO1xyXG5pbXBvcnQgeyBTbW9SZW5kZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgU3VpUmVuZGVyU3RhdGUsIHNjb3JlQ2hhbmdlRXZlbnQgfSBmcm9tICcuL3JlbmRlclN0YXRlJztcclxuaW1wb3J0IHsgU2NvcmVSZW5kZXJQYXJhbXMgfSBmcm9tICcuL3Njb3JlUmVuZGVyJztcclxuaW1wb3J0IHsgU21vT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL29wZXJhdGlvbnMnO1xyXG5pbXBvcnQgeyBTdWlBdWRpb1BsYXllciB9IGZyb20gJy4uL2F1ZGlvL3BsYXllcic7XHJcbmltcG9ydCB7IFN1aUF1ZGlvQW5pbWF0aW9uUGFyYW1zIH0gZnJvbSAnLi4vYXVkaW8vbXVzaWNDdXJzb3InO1xyXG5pbXBvcnQgeyBTbW9UZW1wb1RleHQgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tZWFzdXJlTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgVGltZVNpZ25hdHVyZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL21lYXN1cmVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyByZWYsIFJlZiB9IGZyb20gJ3Z1ZSc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG4vKipcclxuICogSW5kaWNhdGVzIGEgc3RhdmUgaXMvaXMgbm90IGRpc3BsYXllZCBpbiB0aGUgc2NvcmVcclxuICogQGNhdGVnb3J5IFN1aVJlbmRlclxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBWaWV3TWFwRW50cnkge1xyXG4gIHNob3c6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIHVwZGF0ZVNlbGVjdGlvbkZ1bmMgPSAoc2NvcmU6IFNtb1Njb3JlLCBzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSkgPT4gdm9pZDtcclxuZXhwb3J0IHR5cGUgdXBkYXRlU2luZ2xlU2VsZWN0aW9uRnVuYyA9IChzY29yZTogU21vU2NvcmUsIHNlbGVjdGlvbjogU21vU2VsZWN0aW9uKSA9PiB2b2lkO1xyXG5leHBvcnQgdHlwZSB1cGRhdGVTdGFmZk1vZGlmaWVyRnVuYyA9IChzY29yZTogU21vU2NvcmUsIGZyb21TZWxlY3Rpb246IFNtb1NlbGVjdGlvbiwgdG9TZWxlY3Rpb246IFNtb1NlbGVjdGlvbikgPT4gdm9pZDtcclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBvcGVyYXRpb25zIG9uIHRoZSByZW5kZXJlZCBzY29yZS4gIFRoZSBiYXNlIGNsYXNzIGhhbmRsZXMgdGhlIGZvbGxvd2luZzpcclxuICogMS4gVW5kbyBhbmQgcmVjb3JkaW5nIGFjdGlvbnMgZm9yIHRoZSBvcGVyYXRpb25cclxuICogMi4gTWFpbnRhaW4vY2hhbmdlIHdoaWNoIHN0YXZlcyBpbiB0aGUgc2NvcmUgYXJlIGRpc3BsYXllZCAoc3RhZmYgbWFwKVxyXG4gKiAzLiBNYXBwaW5nIGJldHdlZW4gdGhlIGRpc3BsYXllZCBzY29yZSBhbmQgdGhlIGRhdGEgcmVwcmVzZW50YXRpb25cclxuICogQGNhdGVnb3J5IFN1aVJlbmRlclxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN1aVNjb3JlVmlldyB7XHJcbiAgc3RhdGljIEluc3RhbmNlOiBTdWlTY29yZVZpZXcgfCBudWxsID0gbnVsbDtcclxuICBzY29yZTogU21vU2NvcmU7IC8vIFRoZSBzY29yZSB0aGF0IGlzIGRpc3BsYXllZFxyXG4gIHN0b3JlU2NvcmU6IFNtb1Njb3JlOyAgLy8gdGhlIGZ1bGwgc2NvcmUsIGluY2x1ZGluZyBpbnZpc2libGUgc3RhdmVzXHJcbiAgc3RhZmZNYXA6IG51bWJlcltdOyAvLyBtYXBwaW5nIHRoZSAyIHRoaW5ncyBhYm92ZVxyXG4gIHN0b3JlVW5kbzogVW5kb0J1ZmZlcjsgLy8gdW5kbyBidWZmZXIgZm9yIG9wZXJhdGlvbnMgdG8gYWJvdmVcclxuICB0cmFja2VyOiBTdWlUcmFja2VyOyAvLyBVSSBzZWxlY3Rpb25zXHJcbiAgcmVuZGVyZXI6IFN1aVJlbmRlclN0YXRlO1xyXG4gIHNjcm9sbGVyOiBTdWlTY3JvbGxlcjtcclxuICBzdG9yZVBhc3RlOiBQYXN0ZUJ1ZmZlcjtcclxuICBzZWxlY3RlZFBhcnQ6IFJlZjxzdHJpbmc+ID0gcmVmKCcnKTtcclxuICBjb25maWc6IFNtb1JlbmRlckNvbmZpZ3VyYXRpb247XHJcbiAgYXVkaW9BbmltYXRpb246IFN1aUF1ZGlvQW5pbWF0aW9uUGFyYW1zO1xyXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU21vUmVuZGVyQ29uZmlndXJhdGlvbiwgc3ZnQ29udGFpbmVyOiBIVE1MRWxlbWVudCwgc2NvcmU6IFNtb1Njb3JlLCBzY3JvbGxTZWxlY3RvcjogSFRNTEVsZW1lbnQsIHVuZG9CdWZmZXI6IFVuZG9CdWZmZXIpIHtcclxuICAgIHRoaXMuc2NvcmUgPSBzY29yZTtcclxuICAgIGNvbnN0IHJlbmRlclBhcmFtczogU2NvcmVSZW5kZXJQYXJhbXMgPSB7XHJcbiAgICAgIGVsZW1lbnRJZDogc3ZnQ29udGFpbmVyLFxyXG4gICAgICBzY29yZSxcclxuICAgICAgY29uZmlnLFxyXG4gICAgICB1bmRvQnVmZmVyXHJcbiAgICB9O1xyXG4gICAgdGhpcy5hdWRpb0FuaW1hdGlvbiA9IGNvbmZpZy5hdWRpb0FuaW1hdGlvbjtcclxuICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgU3VpUmVuZGVyU3RhdGUocmVuZGVyUGFyYW1zKTtcclxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xyXG4gICAgY29uc3Qgc2NvcmVKc29uID0gc2NvcmUuc2VyaWFsaXplKHsgc2tpcFN0YXZlczogZmFsc2UsIHVzZURpY3Rpb25hcnk6IGZhbHNlLCBwcmVzZXJ2ZVN0YWZmSWRzOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5zY3JvbGxlciA9IG5ldyBTdWlTY3JvbGxlcihzY3JvbGxTZWxlY3RvciwgdGhpcy5yZW5kZXJlci5yZW5kZXJlci52ZXhDb250YWluZXJzKTtcclxuICAgIHRoaXMuc3RvcmVQYXN0ZSA9IG5ldyBQYXN0ZUJ1ZmZlcigpO1xyXG4gICAgdGhpcy50cmFja2VyID0gbmV3IFN1aVRyYWNrZXIodGhpcy5yZW5kZXJlciwgdGhpcy5zY3JvbGxlcik7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldE1lYXN1cmVNYXBwZXIodGhpcy50cmFja2VyKTtcclxuXHJcbiAgICB0aGlzLnN0b3JlU2NvcmUgPSBTbW9TY29yZS5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeShzY29yZUpzb24pKTtcclxuICAgIHRoaXMuc2NvcmUuc3luY2hyb25pemVUZXh0R3JvdXBzKHRoaXMuc3RvcmVTY29yZS50ZXh0R3JvdXBzKTtcclxuICAgIHRoaXMuc3RvcmVVbmRvID0gbmV3IFVuZG9CdWZmZXIoKTtcclxuICAgIHRoaXMuc3RhZmZNYXAgPSB0aGlzLmRlZmF1bHRTdGFmZk1hcDtcclxuICAgIFN1aVNjb3JlVmlldy5JbnN0YW5jZSA9IHRoaXM7IC8vIGZvciBkZWJ1Z2dpbmdcclxuICAgIHRoaXMuc2V0TWFwcGVkU3RhZmZJZHMoKTtcclxuICAgIGNyZWF0ZVRvcERvbUNvbnRhaW5lcignLnNhdmVMaW5rJyk7IC8vIGZvciBmaWxlIHVwbG9hZFxyXG4gIH1cclxuICBnZXQgUGFydE5hbWUoKTogUmVmPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRQYXJ0O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBd2FpdCBvbiB0aGUgZnVsbCB1cGRhdGUgb2YgdGhlIHNjb3JlXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgcmVuZGVyUHJvbWlzZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIucmVuZGVyUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBd2FpdCBvbiB0aGUgcGFydGlhbCB1cGRhdGUgb2YgdGhlIHNjb3JlIGluIHRoZSB2aWV3XHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlUHJvbWlzZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyBhd2FpdFJlbmRlcigpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5yZW5kZXJlci5yZXJlbmRlckFsbCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBhd2FpdCBvbiB0aGUgZnVsbCB1cGRhdGUgb2YgdGhlIHNjb3JlLCBhbHNvIHJlc2V0dGluZyB0aGUgdmlld3BvcnQgKHRvIHJlZmxlY3QgbGF5b3V0IGNoYW5nZXMpXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgcmVmcmVzaFZpZXdwb3J0KCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnByZXNlcnZlU2Nyb2xsKCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFZpZXdwb3J0KCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIucmVuZGVyUHJvbWlzZSgpO1xyXG4gIH1cclxuICBoYW5kbGVTY3JvbGxFdmVudChzY3JvbGxMZWZ0OiBudW1iZXIsIHNjcm9sbFRvcDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRyYWNrZXIuc2Nyb2xsZXIuaGFuZGxlU2Nyb2xsKHNjcm9sbExlZnQsIHNjcm9sbFRvcCk7XHJcbiAgfVxyXG4gIGdldFBhcnRNYXAoKTogeyBrZXlzOiBudW1iZXJbXSwgcGFydE1hcDogUmVjb3JkPG51bWJlciwgU21vUGFydEluZm8+IH0ge1xyXG4gICAgbGV0IGtlZXBOZXh0ID0gZmFsc2U7XHJcbiAgICBsZXQgcGFydENvdW50ID0gMDtcclxuICAgIGxldCBwYXJ0TWFwOiBSZWNvcmQ8bnVtYmVyLCBTbW9QYXJ0SW5mbz4gPSB7fTtcclxuICAgIGNvbnN0IGtleXM6IG51bWJlcltdID0gW107XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcnRJbmZvID0gc3RhZmYucGFydEluZm87XHJcbiAgICAgIHBhcnRJbmZvLmFzc29jaWF0ZWRTdGFmZiA9IHN0YWZmLnN0YWZmSWQ7XHJcbiAgICAgIGlmICgha2VlcE5leHQpIHtcclxuICAgICAgICBwYXJ0TWFwW3BhcnRDb3VudF0gPSBwYXJ0SW5mbztcclxuICAgICAgICBrZXlzLnB1c2gocGFydENvdW50KTtcclxuICAgICAgICBwYXJ0Q291bnQgKz0gMTtcclxuICAgICAgICBpZiAocGFydEluZm8uc3RhdmVzQWZ0ZXIgPiAwKSB7XHJcbiAgICAgICAgICBrZWVwTmV4dCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGtlZXBOZXh0ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHsga2V5cywgcGFydE1hcCB9O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBbnkgbWV0aG9kIHRoYXQgbW9kaWZpZXMgYSBzZXQgb2Ygc2VsZWN0aW9ucyBjYW4gY2FsbCB0aGlzIHRvIHVwZGF0ZSBcclxuICAgKiB0aGUgc2NvcmUgdmlldyBhbmQgdGhlIGJhY2tpbmcgc2NvcmUuXHJcbiAgICogQHBhcmFtIGFjdG9yIFxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25zIFxyXG4gICAqL1xyXG4gIGFzeW5jIG1vZGlmeUN1cnJlbnRTZWxlY3Rpb25zKGxhYmVsOiBzdHJpbmcsIGFjdG9yOiB1cGRhdGVTZWxlY3Rpb25GdW5jKSB7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb25zID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnModGhpcy50cmFja2VyLnNlbGVjdGlvbnMpO1xyXG4gICAgdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKGxhYmVsKTtcclxuICAgIGFjdG9yKHRoaXMuc2NvcmUsIHRoaXMudHJhY2tlci5zZWxlY3Rpb25zKTtcclxuICAgIGFjdG9yKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsZWN0aW9ucyk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMoU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KHRoaXMudHJhY2tlci5zZWxlY3Rpb25zKSk7XHJcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQW55IG1ldGhvZCB0aGF0IG1vZGlmaWVzIGEgc2V0IG9mIHNlbGVjdGlvbnMgY2FuIGNhbGwgdGhpcyB0byB1cGRhdGUgXHJcbiAgICogdGhlIHNjb3JlIHZpZXcgYW5kIHRoZSBiYWNraW5nIHNjb3JlLlxyXG4gICAqIEBwYXJhbSBhY3RvciBcclxuICAgKiBAcGFyYW0gc2VsZWN0aW9ucyBcclxuICAgKi9cclxuICBhc3luYyBtb2RpZnlTZWxlY3Rpb24obGFiZWw6IHN0cmluZywgc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24sIGFjdG9yOiB1cGRhdGVTZWxlY3Rpb25GdW5jKSB7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMobGFiZWwpO1xyXG4gICAgYWN0b3IodGhpcy5zY29yZSwgW3NlbGVjdGlvbl0pO1xyXG4gICAgaWYgKGFsdFNlbGVjdGlvbikge1xyXG4gICAgICBhY3Rvcih0aGlzLnN0b3JlU2NvcmUsIFthbHRTZWxlY3Rpb25dKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QoW3NlbGVjdGlvbl0pKTtcclxuICAgIGF3YWl0IHRoaXMudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAgIC8qKlxyXG4gICAqIEFueSBtZXRob2QgdGhhdCBtb2RpZmllcyBhIHNldCBvZiBzZWxlY3Rpb25zIGNhbiBjYWxsIHRoaXMgdG8gdXBkYXRlIFxyXG4gICAqIHRoZSBzY29yZSB2aWV3IGFuZCB0aGUgYmFja2luZyBzY29yZS5cclxuICAgKiBAcGFyYW0gYWN0b3IgXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbnMgXHJcbiAgICovXHJcbiAgICBhc3luYyBtb2RpZnlTZWxlY3Rpb25Ob1dhaXQobGFiZWw6IHN0cmluZywgc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24sIGFjdG9yOiB1cGRhdGVTaW5nbGVTZWxlY3Rpb25GdW5jKSB7XHJcbiAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKGxhYmVsKTtcclxuICAgICAgYWN0b3IodGhpcy5zY29yZSwgc2VsZWN0aW9uKTtcclxuICAgICAgaWYgKGFsdFNlbGVjdGlvbikge1xyXG4gICAgICAgIGFjdG9yKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsZWN0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMoU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KFtzZWxlY3Rpb25dKSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE1vZGlmaXkgYSBzZXQgb2YgY29sdW1ucywgZS5nLiB0ZW1wbywgdGltZSwga2V5LiAgVGhpcyBoYXMgZGlmZmVyZW50IHVuZG8gYmVoYXZpb3IsIGRvbid0IFxyXG4gICAgICogcGVuZCBvbiB0aGUgcmVzdWx0IGJlY2F1c2UgdGhlcmUgbWF5IGJlIGEgY29tYmluYXRpb24gb2Ygb3BlcmF0aW9ucy5cclxuICAgICAqIEBwYXJhbSBsYWJlbCBcclxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25zIFxyXG4gICAgICogQHBhcmFtIGFjdG9yIFxyXG4gICAgICovXHJcbiAgICBtb2RpZnlDb2x1bW5zU2VsZWN0aW9uc05vV2FpdChsYWJlbDogc3RyaW5nLCBzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSwgYWN0b3I6IHVwZGF0ZVNpbmdsZVNlbGVjdGlvbkZ1bmMpIHtcclxuICAgICAgdGhpcy51bmRvQ29sdW1uUmFuZ2UobGFiZWwsIHNlbGVjdGlvbnMpO1xyXG4gICAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgICBhY3Rvcih0aGlzLnNjb3JlLCBzZWxlY3Rpb24pO1xyXG4gICAgICAgIGlmIChhbHRTZWxlY3Rpb24pIHtcclxuICAgICAgICAgIGFjdG9yKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsZWN0aW9uKTtcclxuICAgICAgICB9ICBcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhzZWxlY3Rpb25zKTtcclxuICAgIH1cclxuICAvKipcclxuICAgKiBUaGlzIGlzIHVzZWQgaW4gc29tZSBTbW9vc2ljIGRlbW9zIGFuZCBwZW5zLlxyXG4gICAqIEBwYXJhbSBhY3Rpb24gYW55IGFjdGlvbiwgYnV0IG1vc3QgdXNlZnVsbHkgYSBTdWlTY29yZVZpZXcgbWV0aG9kXHJcbiAgICogQHBhcmFtIHJlcGV0aXRpb24gbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCwgd2FpdGluZyBvbiByZW5kZXIgcHJvbWlzZSBiZXR3ZWVuXHJcbiAgICogaWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gMVxyXG4gICAqIEByZXR1cm5zIHByb21pc2UsIHJlc29sdmVkIGFjdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgYW5kIHNjb3JlIGlzIHVwZGF0ZWQuXHJcbiAgICovXHJcbiAgYXN5bmMgd2FpdGFibGVBY3Rpb24oYWN0aW9uOiAoKSA9PiB2b2lkLCByZXBldGl0aW9uPzogbnVtYmVyKSB7XHJcbiAgICBjb25zdCByZXAgPSByZXBldGl0aW9uID8/IDE7XHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZjID0gYXN5bmMgKGNvdW50OiBudW1iZXIpID0+IHtcclxuICAgICAgICBpZiAoY291bnQgPiAwKSB7XHJcbiAgICAgICAgICBhY3Rpb24oKTtcclxuICAgICAgICAgIGF3YWl0IHNlbGYucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gICAgICAgICAgZmMoY291bnQgLSAxKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgZmMocmVwKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHByb21pc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcGx1cmFsIGZvcm0gb2YgX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25cclxuICAgKiBAcGFyYW0gc2VsZWN0aW9ucyBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBfZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9uczogU21vU2VsZWN0aW9uW10pOiBTbW9TZWxlY3Rpb25bXSB7XHJcbiAgICBjb25zdCBydjogU21vU2VsZWN0aW9uW10gPSBbXTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgaWYgKHNlbCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHJ2LnB1c2goc2VsKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIC8vIEdldCBhIGxvbmcgZW5vdWdoIGxpc3Qgb2YgbWVhc3VyZXMgdG8gcGFzdGUgaW50b1xyXG4gIGdldFBhc3RlTWVhc3VyZUxpc3QoKSB7XHJcbiAgICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBwYXN0ZSBidWZmZXIsIGluIHRpY2tzXHJcbiAgICBjb25zdCB0aWNrc1RvUGFzdGUgPSB0aGlzLnN0b3JlUGFzdGUuZ2V0Q29weUJ1ZmZlclRpY2tDb3VudCgpO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uczogU21vU2VsZWN0aW9uW10gID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KHRoaXMudHJhY2tlci5zZWxlY3Rpb25zKTtcclxuICAgIGlmICghc2VsZWN0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGVzdGluYXRpb24gPSBzZWxlY3Rpb25zWzBdO1xyXG4gICAgc2VsZWN0aW9ucy5zcGxpY2UoMCk7XHJcbiAgICBzZWxlY3Rpb25zLnB1c2goZGVzdGluYXRpb24pO1xyXG4gICAgY29uc3Qgdm9pY2UgPSBkZXN0aW5hdGlvbi5zZWxlY3Rvci52b2ljZTtcclxuICAgIGNvbnN0IHRtID0gZGVzdGluYXRpb24ubWVhc3VyZS50aWNrbWFwRm9yVm9pY2Uodm9pY2UpO1xyXG4gICAgLy8gbGVuZ3RoIG9mIGZpcnN0IHNlbGVjdGVkIG1lYXN1cmUsIGluIHRpY2tzXHJcbiAgICBjb25zdCBtZWFzdXJlVGlja3MgPSBkZXN0aW5hdGlvbi5tZWFzdXJlLmdldFRpY2tzRnJvbVZvaWNlKHZvaWNlKTtcclxuICAgIC8vIHJlbWFpbmluZyB0aWNrcyBhZnRlciBmaXJzdCBzZWxlY3Rpb24uICBUaGlzIGlzIG91ciBzdGFydGluZyBwb2ludC5cclxuICAgIGxldCBzdGFydFRpY2sgPSBtZWFzdXJlVGlja3MgLSB0bS5kdXJhdGlvbk1hcFt0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1swXS5zZWxlY3Rvci50aWNrXTtcclxuICAgIGxldCBjdXJyZW50TWVhc3VyZSA9IGRlc3RpbmF0aW9uLnNlbGVjdG9yLm1lYXN1cmUgKyAxO1xyXG4gICAgLy8gaWYgd2UgYXJlIHNob3J0LCBhbmQgdGhlcmUgYXJlIG1lYXN1cmVzIGxlZnQsIGFkZCB0aGVtIHRvIHRoZSBzZWxlY3Rpb24gbGlzdFxyXG4gICAgd2hpbGUgKHN0YXJ0VGljayA8IHRpY2tzVG9QYXN0ZSAmJiBkZXN0aW5hdGlvbi5zdGFmZi5tZWFzdXJlcy5sZW5ndGggPiBjdXJyZW50TWVhc3VyZSkge1xyXG4gICAgICBjb25zdCBuZXdTZWwgPSBTbW9TZWxlY3Rpb24ubWVhc3VyZVNlbGVjdGlvbih0aGlzLnNjb3JlLCBcclxuICAgICAgICBkZXN0aW5hdGlvbi5zZWxlY3Rvci5zdGFmZiwgY3VycmVudE1lYXN1cmUpO1xyXG4gICAgICBpZiAobmV3U2VsKSB7XHJcbiAgICAgICAgc2VsZWN0aW9ucy5wdXNoKG5ld1NlbCk7XHJcbiAgICAgICAgc3RhcnRUaWNrICs9IG5ld1NlbC5tZWFzdXJlLmdldFRpY2tzRnJvbVRoaXNPckFueVZvaWNlKHZvaWNlKTtcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50TWVhc3VyZSArPSAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbGVjdGlvbnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgc3RhZmYgbW9kaWZpZXIgaGFzIGNoYW5nZWQsIGNyZWF0ZSB1bmRvIG9wZXJhdGlvbnMgZm9yIHRoZSBtZWFzdXJlcyBhZmZlY3RlZFxyXG4gICAqIEBwYXJhbSBsYWJlbCBcclxuICAgKiBAcGFyYW0gc3RhZmZNb2RpZmllciBcclxuICAgKiBAcGFyYW0gc3VidHlwZSBcclxuICAgKi9cclxuICB1bmRvU3RhZmZNb2RpZmllcihsYWJlbDogc3RyaW5nLCBzdGFmZk1vZGlmaWVyOiBTdGFmZk1vZGlmaWVyQmFzZSwgc3VidHlwZTogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjb3B5ID0gU3RhZmZNb2RpZmllckJhc2UuZGVzZXJpYWxpemUoc3RhZmZNb2RpZmllci5zZXJpYWxpemUoKSk7XHJcbiAgICBjb3B5LnN0YXJ0U2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoY29weS5zdGFydFNlbGVjdG9yKTtcclxuICAgIGNvcHkuZW5kU2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoY29weS5lbmRTZWxlY3Rvcik7XHJcbiAgICBjb25zdCBjb3B5U2VyID0gY29weS5zZXJpYWxpemUoKTtcclxuICAgIC8vIENvcHkgSUQgc28gd2UgY2FuIHVuZG8gcHJvcGVybHlcclxuICAgIGNvcHlTZXIuYXR0cnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHN0YWZmTW9kaWZpZXIuYXR0cnMpKTtcclxuICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcihsYWJlbCwgVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5TVEFGRl9NT0RJRklFUiwgU21vU2VsZWN0b3IuZGVmYXVsdCxcclxuICAgICAgY29weVNlciwgc3VidHlwZSk7XHJcbiAgfVxyXG4gIC8qKiBcclxuICAgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBwYWdlIHRoYXQgaXMgaW4gdGhlIGNlbnRlciBvZiB0aGUgY2xpZW50IHNjcmVlbi5cclxuICAgKi9cclxuICBnZXRGb2N1c2VkUGFnZSgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuc2NvcmUubGF5b3V0TWFuYWdlciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2Nyb2xsQXZnID0gdGhpcy50cmFja2VyLnNjcm9sbGVyLm5ldFNjcm9sbC55ICsgKHRoaXMudHJhY2tlci5zY3JvbGxlci52aWV3cG9ydC5oZWlnaHQgLyAyKTtcclxuICAgIGNvbnN0IG1pZFkgPSBzY3JvbGxBdmc7XHJcbiAgICBjb25zdCBsYXlvdXRNYW5hZ2VyID0gdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyLmdldEdsb2JhbExheW91dCgpO1xyXG4gICAgY29uc3QgbGggPSBsYXlvdXRNYW5hZ2VyLnBhZ2VIZWlnaHQgLyBsYXlvdXRNYW5hZ2VyLnN2Z1NjYWxlO1xyXG4gICAgY29uc3QgbHcgPSBsYXlvdXRNYW5hZ2VyLnBhZ2VXaWR0aCAvIGxheW91dE1hbmFnZXIuc3ZnU2NhbGU7XHJcbiAgICBjb25zdCBwdCA9IHRoaXMucmVuZGVyZXIucGFnZU1hcC5zdmdUb0NsaWVudChTdmdIZWxwZXJzLnNtb0JveCh7IHg6IGx3LCB5OiBsaCB9KSk7XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtaWRZIC8gcHQueSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIHJlY3RhbmdsZSB1bmRvLCBsaWtlIGEgbXVsdGlwbGUgY29sdW1ucyBidXQgbm90IG5lY2Vzc2FyaWx5IHRoZSB3aG9sZVxyXG4gICAqIHNjb3JlLlxyXG4gICAqL1xyXG4gIF91bmRvQ29sdW1uKGxhYmVsOiBzdHJpbmcsIG1lYXN1cmVJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnN0b3JlVW5kby5hZGRCdWZmZXIobGFiZWwsIFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuQ09MVU1OLCBTbW9TZWxlY3Rvci5kZWZhdWx0LFxyXG4gICAgICB7IHNjb3JlOiB0aGlzLnN0b3JlU2NvcmUsIG1lYXN1cmVJbmRleCB9LCBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLk5PTkUpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTY29yZSBwcmVmZXJlbmNlcyBkb24ndCBhZmZlY3QgdGhlIGRpc3BsYXksIGJ1dCB0aGV5IGRvIGhhdmUgYW4gdW5kb1xyXG4gICAqIEBwYXJhbSBsYWJlbCBcclxuICAgKi9cclxuICBfdW5kb1Njb3JlUHJlZmVyZW5jZXMobGFiZWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKGxhYmVsLCBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlNDT1JFX0FUVFJJQlVURVMsIFNtb1NlbGVjdG9yLmRlZmF1bHQsIHRoaXMuc3RvcmVTY29yZSwgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5OT05FKTtcclxuICB9XHJcbiAgdW5kb0NvbHVtblJhbmdlKGxhYmVsOiBzdHJpbmcsIG1lYXN1cmVTZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSkge1xyXG4gICAgY29uc3QgY2hlY2tlZDogUmVjb3JkPG51bWJlciwgYm9vbGVhbj4gPSB7fTtcclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKG1lYXN1cmVTZWxlY3Rpb24pID0+IHtcclxuICAgICAgaWYgKCFjaGVja2VkW21lYXN1cmVTZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZV0pIHtcclxuICAgICAgICBjaGVja2VkW21lYXN1cmVTZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZV0gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3VuZG9Db2x1bW4obGFiZWwsIG1lYXN1cmVTZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICB1bmRvTWVhc3VyZVJhbmdlKGxhYmVsOiBzdHJpbmcsIG1lYXN1cmVTZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSkge1xyXG4gICAgbWVhc3VyZVNlbGVjdGlvbnMuZm9yRWFjaCgobWVhc3VyZVNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBlcXVpdiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24obWVhc3VyZVNlbGVjdGlvbik7XHJcbiAgICAgIGlmIChlcXVpdiAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcihsYWJlbCwgVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5NRUFTVVJFLCBlcXVpdi5zZWxlY3RvciwgZXF1aXYubWVhc3VyZSxcclxuICAgICAgICAgIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuTk9ORSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG1lYXN1cmVTZWxlY3Rpb25zO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgdG8gdGhlIHVuZG8gYnVmZmVyIHRoZSBjdXJyZW50IHNldCBvZiBtZWFzdXJlcyBzZWxlY3RlZC5cclxuICAgKiBAcGFyYW0gbGFiZWwgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgdW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucyhsYWJlbDogc3RyaW5nKTogU21vU2VsZWN0aW9uW10ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpO1xyXG4gICAgcmV0dXJuIHRoaXMudW5kb01lYXN1cmVSYW5nZShsYWJlbCwgbWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBvcGVyYXRpb24gdGhhdCBvbmx5IGFmZmVjdHMgdGhlIGZpcnN0IHNlbGVjdGlvbi4gIFNldHVwIHVuZG8gZm9yIHRoZSBtZWFzdXJlXHJcbiAgICovXHJcbiAgX3VuZG9GaXJzdE1lYXN1cmVTZWxlY3Rpb24obGFiZWw6IHN0cmluZyk6IFNtb1NlbGVjdGlvbiB7XHJcbiAgICBjb25zdCBzZWwgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1swXTtcclxuICAgIGNvbnN0IGVxdWl2ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwpO1xyXG4gICAgaWYgKGVxdWl2ICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcihsYWJlbCwgVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5NRUFTVVJFLCBlcXVpdi5zZWxlY3RvciwgZXF1aXYubWVhc3VyZSxcclxuICAgICAgICBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLk5PTkUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWRkIHRoZSBzZWxlY3Rpb24gdG8gdGhlIHVuZG8gYnVmZmVyXHJcbiAgICogQHBhcmFtIGxhYmVsIFxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb24gXHJcbiAgICovXHJcbiAgX3VuZG9TZWxlY3Rpb24obGFiZWw6IHN0cmluZywgc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24pIHtcclxuICAgIGNvbnN0IGVxdWl2ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgaWYgKGVxdWl2ICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcihsYWJlbCxcclxuICAgICAgICBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLk1FQVNVUkUsIGVxdWl2LnNlbGVjdG9yLCBlcXVpdi5tZWFzdXJlLFxyXG4gICAgICAgIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuTk9ORSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCBtdWx0aXBsZSBzZWxlY3Rpb25zIHRvIHRoZSB1bmRvIGJ1ZmZlciBhcyBhIGdyb3VwXHJcbiAgICogQHBhcmFtIGxhYmVsIFxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25zIFxyXG4gICAqL1xyXG4gIF91bmRvU2VsZWN0aW9ucyhsYWJlbDogc3RyaW5nLCBzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSkge1xyXG4gICAgdGhpcy5zdG9yZVVuZG8uZ3JvdXBpbmcgPSB0cnVlO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgdGhpcy5fdW5kb1NlbGVjdGlvbihsYWJlbCwgc2VsZWN0aW9uKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdG9yZVVuZG8uZ3JvdXBpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBcclxuICAgKiBVcGRhdGUgcmVuZGVyZXIgZm9yIG1lYXN1cmVzIHRoYXQgaGF2ZSBjaGFuZ2VkXHJcbiAgKi9cclxuICBfcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSkge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG1lYXN1cmVTZWxlY3Rpb25zKSkge1xyXG4gICAgICBtZWFzdXJlU2VsZWN0aW9ucyA9IFttZWFzdXJlU2VsZWN0aW9uc107XHJcbiAgICB9XHJcbiAgICBtZWFzdXJlU2VsZWN0aW9ucy5mb3JFYWNoKChtZWFzdXJlU2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUobWVhc3VyZVNlbGVjdGlvbik7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHJlbmRlcmVyIGZvciBzb21lIGNvbHVtbnNcclxuICAgKiBAcGFyYW0gZnJvbVNlbGVjdG9yIFxyXG4gICAqIEBwYXJhbSB0b1NlbGVjdG9yIFxyXG4gICAqL1xyXG4gIF9yZW5kZXJSZWN0YW5nbGUoZnJvbVNlbGVjdG9yOiBTbW9TZWxlY3RvciwgdG9TZWxlY3RvcjogU21vU2VsZWN0b3IpIHtcclxuICAgIHRoaXMuX2dldFJlY3RhbmdsZVNlbGVjdGlvbnMoZnJvbVNlbGVjdG9yLCB0b1NlbGVjdG9yKS5mb3JFYWNoKChzKSA9PiB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUocyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHVuZG8gZm9yIG9wZXJhdGlvbiB0aGF0IGFmZmVjdHMgdGhlIHdob2xlIHNjb3JlXHJcbiAgICogQHBhcmFtIGxhYmVsIFxyXG4gICAqL1xyXG4gIF91bmRvU2NvcmUobGFiZWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKGxhYmVsLCBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlNDT1JFLCBTbW9TZWxlY3Rvci5kZWZhdWx0LCB0aGlzLnN0b3JlU2NvcmUsXHJcbiAgICAgIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuTk9ORSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgc2VsZWN0b3IgZnJvbSB0aGlzLnN0b3JlU2NvcmUgdGhhdCBtYXBzIHRvIHRoZSBkaXNwbGF5ZWQgc2VsZWN0b3IgZnJvbSB0aGlzLnNjb3JlXHJcbiAgICogQHBhcmFtIHNlbGVjdG9yIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIF9nZXRFcXVpdmFsZW50U2VsZWN0b3Ioc2VsZWN0b3I6IFNtb1NlbGVjdG9yKSB7XHJcbiAgICBjb25zdCBydiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc2VsZWN0b3IpKTtcclxuICAgIHJ2LnN0YWZmID0gdGhpcy5zdGFmZk1hcFtzZWxlY3Rvci5zdGFmZl07XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgZXF1aXZhbGVudCBzdGFmZiBpZCBmcm9tIHRoaXMuc3RvcmVTY29yZSB0aGF0IG1hcHMgdG8gdGhlIGRpc3BsYXllZCBzZWxlY3RvciBmcm9tIHRoaXMuc2NvcmVcclxuICAgKiBAcGFyYW0gc3RhZmZJZCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBfZ2V0RXF1aXZhbGVudFN0YWZmKHN0YWZmSWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhZmZNYXBbc3RhZmZJZF07XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgZXF1aXZhbGVudCBzZWxlY3Rpb24gZnJvbSB0aGlzLnN0b3JlU2NvcmUgdGhhdCBtYXBzIHRvIHRoZSBkaXNwbGF5ZWQgc2VsZWN0aW9uIGZyb20gdGhpcy5zY29yZVxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb24gXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgIF9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbjogU21vU2VsZWN0aW9uKTogU21vU2VsZWN0aW9uIHwgbnVsbCB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodHlwZW9mIChzZWxlY3Rpb24uc2VsZWN0b3IudGljaykgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc3RvcmVTY29yZSwgdGhpcy5zdGFmZk1hcFtzZWxlY3Rpb24uc2VsZWN0b3Iuc3RhZmZdLCBzZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHR5cGVvZiAoc2VsZWN0aW9uLnNlbGVjdG9yLnBpdGNoZXMpID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybiBTbW9TZWxlY3Rpb24ubm90ZVNlbGVjdGlvbih0aGlzLnN0b3JlU2NvcmUsIHRoaXMuc3RhZmZNYXBbc2VsZWN0aW9uLnNlbGVjdG9yLnN0YWZmXSwgc2VsZWN0aW9uLnNlbGVjdG9yLm1lYXN1cmUsIHNlbGVjdGlvbi5zZWxlY3Rvci52b2ljZSxcclxuICAgICAgICAgIHNlbGVjdGlvbi5zZWxlY3Rvci50aWNrKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gU21vU2VsZWN0aW9uLnBpdGNoU2VsZWN0aW9uKHRoaXMuc3RvcmVTY29yZSwgdGhpcy5zdGFmZk1hcFtzZWxlY3Rpb24uc2VsZWN0b3Iuc3RhZmZdLCBzZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSwgc2VsZWN0aW9uLnNlbGVjdG9yLnZvaWNlLFxyXG4gICAgICAgIHNlbGVjdGlvbi5zZWxlY3Rvci50aWNrLCBzZWxlY3Rpb24uc2VsZWN0b3IucGl0Y2hlcyk7XHJcbiAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oZXgpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgZXF1aXZhbGVudCBzZWxlY3Rpb24gZnJvbSB0aGlzLnN0b3JlU2NvcmUgdGhhdCBtYXBzIHRvIHRoZSBkaXNwbGF5ZWQgc2VsZWN0aW9uIGZyb20gdGhpcy5zY29yZVxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb24gXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgIF9nZXRFcXVpdmFsZW50R3JhY2VOb3RlKHNlbGVjdGlvbjogU21vU2VsZWN0aW9uLCBnbjogU21vR3JhY2VOb3RlKTogU21vR3JhY2VOb3RlIHtcclxuICAgIGlmIChzZWxlY3Rpb24ubm90ZSAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBydiA9IHNlbGVjdGlvbi5ub3RlLmdldEdyYWNlTm90ZXMoKS5maW5kKChnZykgPT4gZ2cuYXR0cnMuaWQgPT09IGduLmF0dHJzLmlkKTtcclxuICAgICAgaWYgKHJ2KSB7XHJcbiAgICAgICAgcmV0dXJuIHJ2O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ247XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgcmVjdGFuZ2xlIG9mIHNlbGVjdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIHNjb3JlXHJcbiAgICogQHBhcmFtIHN0YXJ0U2VsZWN0b3IgXHJcbiAgICogQHBhcmFtIGVuZFNlbGVjdG9yIFxyXG4gICAqIEBwYXJhbSBzY29yZSBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBfZ2V0UmVjdGFuZ2xlU2VsZWN0aW9ucyhzdGFydFNlbGVjdG9yOiBTbW9TZWxlY3RvciwgZW5kU2VsZWN0b3I6IFNtb1NlbGVjdG9yKTogU21vU2VsZWN0aW9uW10ge1xyXG4gICAgY29uc3QgcnY6IFNtb1NlbGVjdGlvbltdID0gW107XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBmb3IgKGkgPSBzdGFydFNlbGVjdG9yLnN0YWZmOyBpIDw9IGVuZFNlbGVjdG9yLnN0YWZmOyBpKyspIHtcclxuICAgICAgZm9yIChqID0gc3RhcnRTZWxlY3Rvci5tZWFzdXJlOyBqIDw9IGVuZFNlbGVjdG9yLm1lYXN1cmU7IGorKykge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc2NvcmUsIGksIGopO1xyXG4gICAgICAgIGlmICh0YXJnZXQgIT09IG51bGwpIHtcclxuICAgICAgICAgIHJ2LnB1c2godGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogc2V0IHRoZSBncm91cGluZyBmbGFnIGZvciB1bmRvIG9wZXJhdGlvbnNcclxuICAgKiBAcGFyYW0gdmFsIFxyXG4gICAqL1xyXG4gIGdyb3VwVW5kbyh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuc3RvcmVVbmRvLmdyb3VwaW5nID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhbGwgc3RhdmVzLCAxOjEgbWFwcGluZyBvZiB2aWV3IHNjb3JlIHN0YWZmIHRvIHN0b3JlZCBzY29yZSBzdGFmZlxyXG4gICAqL1xyXG4gIGdldCBkZWZhdWx0U3RhZmZNYXAoKTogbnVtYmVyW10ge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3QgcnY6IG51bWJlcltdID0gW107XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zdG9yZVNjb3JlLnN0YXZlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBydi5wdXNoKGkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBCb290c3RyYXBwaW5nIGZ1bmN0aW9uLCBjcmVhdGVzIHRoZSByZW5kZXJlciBhbmQgYXNzb2NpYXRlZCB0aW1lcnNcclxuICAgKi9cclxuICBzdGFydFJlbmRlcmluZ0VuZ2luZSgpIHtcclxuICAgIGlmICghdGhpcy5yZW5kZXJlci5zY29yZSkge1xyXG4gICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJ0LCBkaXNwbGF5IHRoZSBwYXJ0LlxyXG4gICAgICBpZiAodGhpcy5zdG9yZVNjb3JlLmlzUGFydEV4cG9zZWQoKSkge1xyXG4gICAgICAgIHRoaXMuZXhwb3NlUGFydCh0aGlzLnNjb3JlLnN0YXZlc1swXSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gSWYgdGhlIHNjb3JlIGlzIHRyYW5zcG9zaW5nLCBoaWRlIHRoZSBpbnN0cnVtZW50IHhwb3NlIHNldHRpbmdzXHJcbiAgICAgIHRoaXMuX3NldFRyYW5zcG9zaW5nKCk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2NvcmUgPSB0aGlzLnNjb3JlO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFZpZXdwb3J0KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmRlcmVyLnN0YXJ0RGVtb24oKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgY3VycmVudCBtYXBwaW5nIG9mIGRpc3BsYXllZCBzdGF2ZXMgdG8gc2NvcmUgc3RhdmVzICh0aGlzLnN0b3JlU2NvcmUpXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZ2V0VmlldygpOiBWaWV3TWFwRW50cnlbXSB7XHJcbiAgICBjb25zdCBydjogVmlld01hcEVudHJ5W10gPSBbXTtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHNob3cgPSB0aGlzLnN0YWZmTWFwLmluZGV4T2YoaSkgPj0gMDtcclxuICAgICAgcnYucHVzaCh7IHNob3cgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgc3RhZmYgSUQgd2hlbiB0aGUgdmlldyBjaGFuZ2VzXHJcbiAgICovXHJcbiAgc2V0TWFwcGVkU3RhZmZJZHMoKSB7XHJcbiAgICB0aGlzLnNjb3JlLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuaXNQYXJ0RXhwb3NlZCgpKSB7XHJcbiAgICAgICAgc3RhZmYucGFydEluZm8uZGlzcGxheUN1ZXMgPSBzdGFmZi5wYXJ0SW5mby5jdWVJblNjb3JlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHN0YWZmLnBhcnRJbmZvLmRpc3BsYXlDdWVzID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgc3RhZmYuc2V0TWFwcGVkU3RhZmZJZCh0aGlzLnN0YWZmTWFwW3N0YWZmLnN0YWZmSWRdKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICByZXNldFBhcnRWaWV3KCkge1xyXG4gICAgaWYgKHRoaXMuc3RhZmZNYXAubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIGNvbnN0IHN0YWZmID0gdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1t0aGlzLnN0YWZmTWFwWzBdXTtcclxuICAgICAgdGhpcy5leHBvc2VQYXJ0KHN0YWZmKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogRXhwb3NlcyBhIHBhcnQ6ICBoaWRlcyBub24tcGFydCBzdGF2ZXMsIHNob3dzIHBhcnQgc3RhdmVzLlxyXG4gICAqIE5vdGUgdGhpcyB3aWxsIHJlc2V0IHRoZSB2aWV3LiAgQWZ0ZXIgdGhpcyBvcGVyYXRpb24sIHN0YWZmIDAgd2lsbFxyXG4gICAqIGJlIHRoZSBzZWxlY3RlZCBwYXJ0LlxyXG4gICAqIEBwYXJhbSBzdGFmZiBcclxuICAgKi9cclxuICBleHBvc2VQYXJ0KHN0YWZmOiBTbW9TeXN0ZW1TdGFmZikge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3QgZXhwb3NlTWFwOiBWaWV3TWFwRW50cnlbXSA9IFtdO1xyXG4gICAgbGV0IHB1c2hOZXh0ID0gZmFsc2U7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zdG9yZVNjb3JlLnN0YXZlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB0UyA9IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbaV07XHJcbiAgICAgIGNvbnN0IHNob3cgPSB0Uy5zdGFmZklkID09PSBzdGFmZi5zdGFmZklkO1xyXG4gICAgICBjb25zdCBwYXJ0ID0gdFMucGFydEluZm87XHJcbiAgICAgIGlmIChzaG93KSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBhcnQudmFsdWUgPSBwYXJ0LnBhcnROYW1lO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwdXNoTmV4dCkge1xyXG4gICAgICAgIGV4cG9zZU1hcC5wdXNoKHsgc2hvdzogdHJ1ZSB9KTtcclxuICAgICAgICBwdXNoTmV4dCA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgIHtcclxuICAgICAgICBleHBvc2VNYXAucHVzaCh7IHNob3cgfSk7XHJcbiAgICAgICAgaWYgKHRTLnBhcnRJbmZvLnN0YXZlc0FmdGVyID4gMCAmJiBzaG93KSB7XHJcbiAgICAgICAgICBwdXNoTmV4dCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFZpZXcoZXhwb3NlTWFwKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBzY29yZSBpcyBkaXNwbGF5aW5nIGluIHBhcnQtbW9kZSB2cy4gc2NvcmUgbW9kZS5cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBpc1BhcnRFeHBvc2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcmUuaXNQYXJ0RXhwb3NlZCgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQYXJ0cyBoYXZlIGRpZmZlcmVudCBmb3JtYXR0aW5nIG9wdGlvbnMgZnJvbSB0aGUgcGFyZW50IHNjb3JlLCBpbmRsdWRpbmcgbGF5b3V0LiAgUmVzZXRcclxuICAgKiB0aGVtIHdoZW4gZXhwb3NpbmcgYSBwYXJ0LlxyXG4gICAqL1xyXG4gIF9tYXBQYXJ0Rm9ybWF0dGluZygpIHtcclxuICAgIHRoaXMuc2NvcmUubGF5b3V0TWFuYWdlciA9IHRoaXMuc2NvcmUuc3RhdmVzWzBdLnBhcnRJbmZvLmxheW91dE1hbmFnZXI7XHJcbiAgICBsZXQgcmVwbGFjZWRUZXh0ID0gZmFsc2U7XHJcbiAgICB0aGlzLnNjb3JlLnN0YXZlcy5mb3JFYWNoKChzdGFmZikgPT4ge1xyXG4gICAgICBzdGFmZi51cGRhdGVNZWFzdXJlRm9ybWF0c0ZvclBhcnQoKTtcclxuICAgICAgaWYgKHN0YWZmLnBhcnRJbmZvLnByZXNlcnZlVGV4dEdyb3VwcyAmJiAhcmVwbGFjZWRUZXh0KSB7XHJcbiAgICAgICAgY29uc3QgdGdhOiBTbW9UZXh0R3JvdXBbXSA9IFtdO1xyXG4gICAgICAgIHJlcGxhY2VkVGV4dCA9IHRydWU7XHJcbiAgICAgICAgc3RhZmYucGFydEluZm8udGV4dEdyb3Vwcy5mb3JFYWNoKCh0ZykgPT4ge1xyXG4gICAgICAgICAgdGdhLnB1c2godGcpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc2NvcmUudGV4dEdyb3VwcyA9IHRnYTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgbGlzdCBvZiBzdGF2ZXMgaW4gdGhlIHNjb3JlIHRoYXQgYXJlIGRpc3BsYXllZC5cclxuICAqL1xyXG4gIHNldFZpZXcocm93czogVmlld01hcEVudHJ5W10pIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IGFueSA9IHJvd3MuZmluZCgocm93KSA9PiByb3cuc2hvdyA9PT0gdHJ1ZSk7XHJcbiAgICBpZiAoIWFueSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBuc2NvcmUgPSBTbW9TY29yZS5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlU2NvcmUuc2VyaWFsaXplKFxyXG4gICAgICB7IHNraXBTdGF2ZXM6IHRydWUsIHVzZURpY3Rpb25hcnk6IGZhbHNlLCBwcmVzZXJ2ZVN0YWZmSWRzOiBmYWxzZSB9KSkpO1xyXG4gICAgY29uc3Qgc3RhZmZNYXA6IG51bWJlcltdID0gW107XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCByb3cgPSByb3dzW2ldO1xyXG4gICAgICBpZiAocm93LnNob3cpIHtcclxuICAgICAgICBjb25zdCBzcmNTdGF2ZSA9IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbaV07XHJcbiAgICAgICAgY29uc3QganNvbk9iaiA9IHNyY1N0YXZlLnNlcmlhbGl6ZSh7IHNraXBNYXBzOiBmYWxzZSwgcHJlc2VydmVJZHM6IHRydWUsXHJcbiAgICAgICAgICB0cmFuc3Bvc2VJbnN0cnVtZW50czogIXRoaXMuc3RvcmVTY29yZS5wcmVmZXJlbmNlcy50cmFuc3Bvc2luZ1Njb3JlXHJcbiAgICAgICAgIH0pO1xyXG4gICAgICAgIGpzb25PYmouc3RhZmZJZCA9IHN0YWZmTWFwLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBuU3RhdmUgPSBTbW9TeXN0ZW1TdGFmZi5kZXNlcmlhbGl6ZShqc29uT2JqLCAhdGhpcy5zdG9yZVNjb3JlLnByZWZlcmVuY2VzLnRyYW5zcG9zaW5nU2NvcmUpO1xyXG4gICAgICAgIG5TdGF2ZS5tYXBTdGFmZkZyb21UbyhpLCBuc2NvcmUuc3RhdmVzLmxlbmd0aCk7XHJcbiAgICAgICAgLy8gUmVtYXAgc2NvcmUgdGV4dCBncm91cHMgYXR0YWNoZWQgdG8gbXVzaWMgaW4gdGhpcyBzdGFmZlxyXG4gICAgICAgIGNvbnN0IGxvY2FsVGV4dCA9IFxyXG4gICAgICAgICAgbnNjb3JlLnRleHRHcm91cHMuZmlsdGVyKCh0dCkgPT4gKHR0LmF0dGFjaFRvU2VsZWN0b3IgJiYgdHQuc2VsZWN0b3IgJiYgdHQuc2VsZWN0b3Iuc3RhZmYgPT09IGkpKTtcclxuICAgICAgICBsb2NhbFRleHQuZm9yRWFjaCgodHQpID0+IHtcclxuICAgICAgICAgIGlmICh0dC5zZWxlY3Rvcikge1xyXG4gICAgICAgICAgICB0dC5zZWxlY3Rvci5zdGFmZiA9IG5zY29yZS5zdGF2ZXMubGVuZ3RoO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgbnNjb3JlLnN0YXZlcy5wdXNoKG5TdGF2ZSk7XHJcbiAgICAgICAgaWYgKHNyY1N0YXZlLmtleVNpZ25hdHVyZU1hcCkge1xyXG4gICAgICAgICAgblN0YXZlLmtleVNpZ25hdHVyZU1hcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc3JjU3RhdmUua2V5U2lnbmF0dXJlTWFwKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5TdGF2ZS5tZWFzdXJlcy5mb3JFYWNoKChtZWFzdXJlOiBTbW9NZWFzdXJlLCBpeCkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgc3JjTWVhc3VyZSA9IHNyY1N0YXZlLm1lYXN1cmVzW2l4XTtcclxuICAgICAgICAgIG1lYXN1cmUudGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KHNyY01lYXN1cmUudGVtcG8uc2VyaWFsaXplKCkpO1xyXG4gICAgICAgICAgbWVhc3VyZS50aW1lU2lnbmF0dXJlID0gbmV3IFRpbWVTaWduYXR1cmUoc3JjTWVhc3VyZS50aW1lU2lnbmF0dXJlKTtcclxuICAgICAgICAgIG1lYXN1cmUua2V5U2lnbmF0dXJlID0gc3JjTWVhc3VyZS5rZXlTaWduYXR1cmU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc3RhZmZNYXAucHVzaChpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbnNjb3JlLm51bWJlclN0YXZlcygpO1xyXG4gICAgdGhpcy5zdGFmZk1hcCA9IHN0YWZmTWFwO1xyXG4gICAgdGhpcy5zY29yZSA9IG5zY29yZTtcclxuICAgIC8vIEluZGljYXRlIHdoaWNoIHNjb3JlIHN0YWZmIHZpZXcgc3RhdmVzIGFyZSBtYXBwZWQgdG8sIHRvIGRlY2lkZSB0byBkaXNwbGF5XHJcbiAgICAvLyBtb2RpZmllcnMuXHJcbiAgICB0aGlzLnNldE1hcHBlZFN0YWZmSWRzKCk7XHJcbiAgICAvLyBUT0RPOiBhZGQgcGFydC1zcGVjaWZpYyBtZWFzdXJlIGZvcm1hdHRpbmcsIGV0Yy5cclxuICAgIHRoaXMuX3NldFRyYW5zcG9zaW5nKCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNjb3JlID0gbnNjb3JlO1xyXG4gICAgLy8gSWYgdGhpcyBjdXJyZW50IHZpZXcgaXMgYSBwYXJ0LCBzaG93IHRoZSBwYXJ0IGxheW91dFxyXG4gICAgaWYgKHRoaXMuaXNQYXJ0RXhwb3NlZCgpKSB7XHJcbiAgICAgIHRoaXMuX21hcFBhcnRGb3JtYXR0aW5nKCk7ICAgICAgXHJcbiAgICAgIHRoaXMuc2NvcmUuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgICAgc3RhZmYucGFydEluZm8uZGlzcGxheUN1ZXMgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5jb21wdXRlTXVsdGlwYXJ0UmVzdChuc2NvcmUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY29yZS5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgICBzdGFmZi5wYXJ0SW5mby5kaXNwbGF5Q3VlcyA9IHN0YWZmLnBhcnRJbmZvLmN1ZUluU2NvcmU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KHNjb3JlQ2hhbmdlRXZlbnQsIHsgZGV0YWlsOiB7IHZpZXc6IHRoaXMgfSB9KSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFZpZXdwb3J0KCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHZpZXcgYWxsIHRoZSBzdGFmZnMgaW4gc2NvcmUgbW9kZS5cclxuICAgKi9cclxuICB2aWV3QWxsKCkge1xyXG4gICAgdGhpcy5zY29yZSA9IFNtb1Njb3JlLmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICB0aGlzLnN0b3JlU2NvcmUuc2VyaWFsaXplKHsgc2tpcFN0YXZlczogZmFsc2UsIHVzZURpY3Rpb25hcnk6IGZhbHNlLCBwcmVzZXJ2ZVN0YWZmSWRzOiB0cnVlIH0pKSk7XHJcbiAgICB0aGlzLnN0YWZmTWFwID0gdGhpcy5kZWZhdWx0U3RhZmZNYXA7XHJcbiAgICB0aGlzLnNldE1hcHBlZFN0YWZmSWRzKCk7XHJcbiAgICB0aGlzLl9zZXRUcmFuc3Bvc2luZygpO1xyXG4gICAgdGhpcy5zY29yZS5zeW5jaHJvbml6ZVRleHRHcm91cHModGhpcy5zdG9yZVNjb3JlLnRleHRHcm91cHMpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zY29yZSA9IHRoaXMuc2NvcmU7XHJcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoc2NvcmVDaGFuZ2VFdmVudCwgeyBkZXRhaWw6IHsgdmlldzogdGhpcyB9IH0pKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRQYXJ0LnZhbHVlID0gJ1NlbGVjdCBQYXJ0J1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRWaWV3cG9ydCgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBJZiB0aGUgc2NvcmUgaXMgbm9uLXRyYW5zcG9zZWQsIHRyYW5zcG9zZSB0aGUgcGFydCBzbyBpdCBpcyBpbiB0aGUgXHJcbiAgICogY29ycmVjdCBrZXkuXHJcbiAgICovXHJcbiAgX3NldFRyYW5zcG9zaW5nKCkge1xyXG4gICAgaWYgKHRoaXMuaXNQYXJ0RXhwb3NlZCgpKSB7XHJcbiAgICAgIGNvbnN0IHhwb3NlID0gdGhpcy5zY29yZS5wcmVmZXJlbmNlcz8udHJhbnNwb3NpbmdTY29yZTtcclxuICAgICAgaWYgKHhwb3NlKSB7XHJcbiAgICAgICAgdGhpcy5zY29yZS5zZXROb25UcmFuc3Bvc2luZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlIHZpZXcgYWZ0ZXIgbG9hZGluZyBvciByZXN0b3JpbmcgYSBjb21wbGV0ZWx5IG5ldyBzY29yZVxyXG4gICAqIEBwYXJhbSBzY29yZSBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBjaGFuZ2VTY29yZShzY29yZTogU21vU2NvcmUpIHtcclxuICAgIHRoaXMuc3RvcmVVbmRvLnJlc2V0KCk7XHJcbiAgICBTdWlBdWRpb1BsYXllci5zdG9wUGxheWVyKCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNjb3JlID0gc2NvcmU7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFZpZXdwb3J0KCk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUgPSBTbW9TY29yZS5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeShcclxuICAgICAgc2NvcmUuc2VyaWFsaXplKHsgc2tpcFN0YXZlczogZmFsc2UsIHVzZURpY3Rpb25hcnk6IGZhbHNlLCBwcmVzZXJ2ZVN0YWZmSWRzOiB0cnVlIH0pKSk7XHJcbiAgICB0aGlzLnNjb3JlID0gc2NvcmU7XHJcbiAgICAvLyBJZiB0aGUgc2NvcmUgaXMgbm9uLXRyYW5zcG9zaW5nLCBoaWRlIHRoZSBpbnN0cnVtZW50IHhwb3NlIHNldHRpbmdzXHJcbiAgICB0aGlzLl9zZXRUcmFuc3Bvc2luZygpO1xyXG4gICAgdGhpcy5zdGFmZk1hcCA9IHRoaXMuZGVmYXVsdFN0YWZmTWFwO1xyXG4gICAgdGhpcy5zZXRNYXBwZWRTdGFmZklkcygpO1xyXG4gICAgdGhpcy5zY29yZS5zeW5jaHJvbml6ZVRleHRHcm91cHModGhpcy5zdG9yZVNjb3JlLnRleHRHcm91cHMpO1xyXG4gICAgaWYgKHRoaXMuc3RvcmVTY29yZS5pc1BhcnRFeHBvc2VkKCkpIHtcclxuICAgICAgdGhpcy5leHBvc2VQYXJ0KHRoaXMuc2NvcmUuc3RhdmVzWzBdKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJ2ID0gYXdhaXQgdGhpcy5hd2FpdFJlbmRlcigpO1xyXG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KHNjb3JlQ2hhbmdlRXZlbnQsIHsgZGV0YWlsOiB7IHZpZXc6IHRoaXMgfSB9KSk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIHJlcGxhY2VNZWFzdXJlVmlldyhtZWFzdXJlUmFuZ2U6IG51bWJlcltdKSB7XHJcbiAgICBmb3IgKGxldCBpID0gbWVhc3VyZVJhbmdlWzBdOyBpIDw9IG1lYXN1cmVSYW5nZVsxXTsgKytpKSB7XHJcbiAgICAgIHRoaXMuc2NvcmUuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3RhZmZJZCA9IHN0YWZmLnN0YWZmSWQ7XHJcbiAgICAgICAgY29uc3QgYWx0U3RhZmYgPSB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuX2dldEVxdWl2YWxlbnRTdGFmZihzdGFmZklkKV07XHJcbiAgICAgICAgaWYgKGFsdFN0YWZmKSB7XHJcbiAgICAgICAgICBzdGFmZi5zeW5jU3RhZmZNb2RpZmllcnMoaSwgYWx0U3RhZmYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBHZXQgYSBjb3B5IG9mIHRoZSBiYWNraW5nIHNjb3JlLCBhbmQgbWFwIGl0IHRvIHRoZSBzY29yZSBzdGF2ZS4gIHRoaXMuc2NvcmUgbWF5IGhhdmUgZmV3ZXIgc3RhdmVzXHJcbiAgICAgICAgLy8gdGhhbiB0aGlzLnN0b3JlU2NvcmVcclxuICAgICAgICBjb25zdCBzdmcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHN0YWZmLm1lYXN1cmVzW2ldLnN2ZykpO1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBVbmRvQnVmZmVyLnNlcmlhbGl6ZU1lYXN1cmUodGhpcy5zdG9yZVNjb3JlLnN0YXZlc1t0aGlzLnN0YWZmTWFwW3N0YWZmSWRdXS5tZWFzdXJlc1tpXSk7XHJcbiAgICAgICAgc2VyaWFsaXplZC5tZWFzdXJlTnVtYmVyLnN0YWZmSWQgPSBzdGFmZklkO1xyXG4gICAgICAgIGNvbnN0IHhwb3NlID0gc2VyaWFsaXplZC50cmFuc3Bvc2VJbmRleCA/PyAwO1xyXG4gICAgICAgIGNvbnN0IGNvbmNlcnRLZXkgPSBTbW9NdXNpYy52ZXhLZXlTaWdXaXRoT2Zmc2V0KHNlcmlhbGl6ZWQua2V5U2lnbmF0dXJlID8/ICdjJywgLTEgKiB4cG9zZSk7XHJcbiAgICAgICAgc2VyaWFsaXplZC5rZXlTaWduYXR1cmUgPSBjb25jZXJ0S2V5O1xyXG4gICAgICAgIGNvbnN0IHJtZWFzdXJlID0gU21vTWVhc3VyZS5kZXNlcmlhbGl6ZShzZXJpYWxpemVkKTtcclxuICAgICAgICBybWVhc3VyZS5zdmcgPSBzdmc7XHJcbiAgICAgICAgLy8gV2UgdXNlZCB0byBmb3JjZSBhIHRyYW5wb3Npbmcgc2NvcmUgc3RmZiBpbnRvICAnYycgYnV0IG5vdyB3ZSBrZWVwIHRoZSBcclxuICAgICAgICAvLyBtZWFzdXJlcyBpbiB0aGUgY29uY2VydCBrZXksIGFuZCB0aGUgdHJhbnNwb3NlIG9mZnNldCB0byAwLCBzbyBubyBuZWVkIHRvIGRvIGFueXRoaW5nXHJcbiAgICAgICAgLy8gc3BlY2lhbCBoZXJlLlxyXG4gICAgICAgIGNvbnN0IHNlbGVjdG9yOiBTbW9TZWxlY3RvciA9IHsgc3RhZmY6IHN0YWZmSWQsIG1lYXN1cmU6IGksIHZvaWNlOiAwLCB0aWNrOiAwLCBwaXRjaGVzOiBbXSB9O1xyXG4gICAgICAgIHRoaXMuc2NvcmUucmVwbGFjZU1lYXN1cmUoc2VsZWN0b3IsIHJtZWFzdXJlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ29sdW1uVG9SZXBsYWNlUXVldWUoaSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGZvciB0aGUgdmlldyBzY29yZSwgdGhlIHJlbmRlcmVyIGRlY2lkZXMgd2hhdCB0byByZW5kZXJcclxuICAgKiBkZXBlbmRpbmcgb24gd2hhdCBpcyB1bmRvbmUuXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdW5kbygpIHtcclxuICAgIGlmICghdGhpcy5yZW5kZXJlci5zY29yZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmICghdGhpcy5zdG9yZVVuZG8uYnVmZmVyc0F2YWlsYWJsZSgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHN0YWZmTWFwOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+ID0ge307XHJcbiAgICBjb25zdCBpZGVudGl0eU1hcDogUmVjb3JkPG51bWJlciwgbnVtYmVyPiA9IHt9O1xyXG4gICAgdGhpcy5kZWZhdWx0U3RhZmZNYXAuZm9yRWFjaCgobm4pID0+IGlkZW50aXR5TWFwW25uXSA9IG5uKTtcclxuICAgIHRoaXMuc3RhZmZNYXAuZm9yRWFjaCgobW0sIGl4KSA9PiBzdGFmZk1hcFttbV0gPSBpeCk7XHJcbiAgICAvLyBBIHNjb3JlLWxldmVsIHVuZG8gbWlnaHQgaGF2ZSBjaGFuZ2VkIHRoZSBzY29yZS5cclxuICAgIGNvbnN0IGZ1bGxTY29yZSA9IHRoaXMuc3RvcmVVbmRvLnVuZG9TY29yZVBlZWsoKTtcclxuICAgIC8vIHRleHQgdW5kbyBpcyBoYW5kbGVkIGRpZmZlcmVudGx5IHNpbmNlIHRoZXJlIGlzIHVzdWFsbHkgbm90XHJcbiAgICAvLyBhbiBhc3NvY2lhdGVkIG1lYXN1cmUuXHJcbiAgICBjb25zdCBzY29yZVRleHQgPSB0aGlzLnN0b3JlVW5kby51bmRvU2NvcmVUZXh0R3JvdXBQZWVrKCk7XHJcbiAgICBjb25zdCBwYXJ0VGV4dCA9IHRoaXMuc3RvcmVVbmRvLnVuZG9QYXJ0VGV4dEdyb3VwUGVlaygpO1xyXG4gICAgaWYgKHNjb3JlVGV4dCB8fCBwYXJ0VGV4dCkge1xyXG4gICAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVucmVuZGVyVGV4dEdyb3VwcygpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWVhc3VyZVJhbmdlID0gdGhpcy5zdG9yZVVuZG8uZ2V0TWVhc3VyZVJhbmdlKCk7XHJcbiAgICBpZiAoIShmdWxsU2NvcmUgfHwgc2NvcmVUZXh0IHx8IHBhcnRUZXh0KSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gbWVhc3VyZVJhbmdlWzBdOyBpIDw9IG1lYXN1cmVSYW5nZVsxXTsgKytpKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci51bnJlbmRlckNvbHVtbih0aGlzLnNjb3JlLnN0YXZlc1swXS5tZWFzdXJlc1tpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmVTY29yZSA9IHRoaXMuc3RvcmVVbmRvLnVuZG8odGhpcy5zdG9yZVNjb3JlLCBpZGVudGl0eU1hcCwgdHJ1ZSk7XHJcbiAgICBpZiAoZnVsbFNjb3JlKSB7XHJcbiAgICAgIHRoaXMudmlld0FsbCgpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIH0gZWxzZSBpZiAocGFydFRleHQpIHtcclxuICAgICAgdGhpcy5zZXRWaWV3KHRoaXMuZ2V0VmlldygpKTtcclxuICAgIH0gZWxzZSBpZiAoc2NvcmVUZXh0KSB7XHJcbiAgICAgIHRoaXMuc2NvcmUuc3luY2hyb25pemVUZXh0R3JvdXBzKHRoaXMuc3RvcmVTY29yZS50ZXh0R3JvdXBzKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZXJlbmRlclRleHRHcm91cHMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVwbGFjZU1lYXN1cmVWaWV3KG1lYXN1cmVSYW5nZSk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/render/sui/scoreView.ts\n\n}");
1340
1340
 
1341
1341
  /***/ },
1342
1342
 
@@ -1347,7 +1347,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
1347
1347
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1348
1348
 
1349
1349
  "use strict";
1350
- 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 let altSelector = JSON.parse(JSON.stringify(selector));\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 altSelector.staff = this.staffMap[selector.staff];\n }\n if (!ogText) {\n return;\n }\n // We undo buffer using the score location, not the group location\n this.storeUndo.addBuffer('remove text group', bufType, altSelector, 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 if (altGroup.selector) {\n altGroup.selector.staff = altSelector.staff;\n }\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; // for score view\n const altSelector = JSON.parse(JSON.stringify(selector)); // for full score\n const isPartExposed = this.isPartExposed();\n const partInfo = this.score.staves[0].partInfo;\n // If this text was attached to a staff that is not in the part, ignore the update\n if (newVersion.selector && newVersion.selector.staff >= this.score.staves.length) {\n return;\n }\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 altSelector.staff = this.staffMap[0];\n }\n else {\n altSelector.staff = this.staffMap[selector.staff];\n }\n this.storeUndo.addBuffer('modify text', bufType, altSelector, 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 if (altNew.selector) {\n altNew.selector.staff = altSelector.staff;\n }\n this.score.updateTextGroup(newVersion, true);\n // If this is part text and part-specific text is set, \n // only set the partInfo for the stored score, but don't add to \n // global text.\n if (isPartExposed) {\n const partInfo = this.storeScore.staves[altSelector.staff].partInfo;\n partInfo.updateTextGroup(altNew, true);\n }\n else {\n this.storeScore.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 this.storeScore.setNonTransposing();\n }\n else if (curXpose === true && oldXpose === false) {\n this.score.setTransposing();\n this.storeScore.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 // Make sure all the notes in the measure after the change are updated. \n // We only need to do this for the displayed score, not the storeScore.\n _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections).forEach((ms) => {\n ms.measure.updateClefChangeNotes();\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 current selection\n * @param dynamic\n * @returns\n */\n removeDynamic(dynamic) {\n return __awaiter(this, void 0, void 0, function* () {\n const measures = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections);\n for (let j = 0; j < this.tracker.selections.length; ++j) {\n const selection = this.tracker.selections[j];\n if (selection) {\n const equiv = this._getEquivalentSelection(selection);\n if ((equiv === null || equiv === void 0 ? void 0 : equiv.note) && selection.note) {\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 }\n }\n this._renderChangedMeasures(measures);\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, this.score, selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.changeInstrument(instrument, this.storeScore, 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 removeStaffGroup(staffGroup) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('ungroup staves');\n this.score.removeSystemGroup(staffGroup);\n this.storeScore.removeSystemGroup(staffGroup);\n this.renderer.setDirty();\n yield this.renderer.updatePromise();\n });\n }\n clearSystemGroups() {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('clear staff groups');\n this.score.clearSystemGroups();\n this.storeScore.clearSystemGroups();\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 let isPercussion = false;\n selections.forEach((selected) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transpose(selected, offset);\n if (selected.staff.getStaffInstrument(selected.selector.measure).isPercussion) {\n isPercussion = true;\n }\n const altSel = this._getEquivalentSelection(selected);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transpose(altSel, offset);\n });\n // if this is percussion, set that property\n if (isPercussion) {\n this.score.setNoteInstrumentProperties();\n this.storeScore.setNoteInstrumentProperties();\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 let isPercussion = false;\n selections.forEach((selected) => {\n const selector = selected.selector;\n if (selected.staff.getStaffInstrument(selected.selector.measure).isPercussion) {\n isPercussion = true;\n }\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 (isPercussion) {\n this.score.setNoteInstrumentProperties();\n this.storeScore.setNoteInstrumentProperties();\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 const startMeasure = pos - (ix - 1);\n const startSelector = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelector.default;\n const endSelector = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelector.default;\n startSelector.measure = startMeasure;\n endSelector.measure = pos;\n this._renderRectangle(startSelector, endSelector);\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 toRemove = [];\n const selectedStaves = {};\n this.tracker.selections.forEach((sel) => {\n const scoreSel = this._getEquivalentSelection(sel);\n if (!selectedStaves[scoreSel.selector.staff]) {\n selectedStaves[scoreSel.selector.staff] = true;\n toRemove.push(scoreSel.selector.staff);\n }\n });\n // Sort in descending order so we don't mess up the staff indices as we remove\n toRemove.sort((a, b) => b - a);\n toRemove.forEach((staffIndex) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeStaff(this.storeScore, staffIndex);\n });\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, this.storeScore, 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 // Make sure that the next stave in the score has the correct 'staves before' setting\n if (this.storeScore.staves.length > nStaffIndex + 1) {\n if (nInfo.stavesAfter === 0) {\n const nextStaff = this.storeScore.staves[nStaffIndex + 1];\n nextStaff.partInfo.stavesBefore = 0;\n const nextStaffDisplayIndex = this.staffMap.findIndex((x) => x === nStaffIndex + 1);\n if (nextStaffDisplayIndex >= 0) {\n this.score.staves[nextStaffDisplayIndex].partInfo =\n new _smo_data_partInfo__WEBPACK_IMPORTED_MODULE_3__.SmoPartInfo(nextStaff.partInfo);\n }\n }\n }\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 const alt = this._getEquivalentSelection(m);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureFormat(this.storeScore, alt, format);\n }\n else {\n // If we are seeing some set of staves that is not a part, make sure the whole column in the \n // score is updated.\n const firstRow = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.selectionFromSelector(this.storeScore, {\n staff: 0, measure: m.selector.measure, voice: m.selector.voice, tick: m.selector.tick, pitches: []\n });\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureFormat(this.storeScore, firstRow, 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, displayIndex) {\n this.score.updateRenumberingMap(measureIndex, displayIndex);\n this.storeScore.updateRenumberingMap(measureIndex, displayIndex);\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 return __awaiter(this, void 0, void 0, function* () {\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 }\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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Q0FBQztZQUN0QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEMsQ0FBQztLQUFBO0lBQ0Q7O1VBRU07SUFDQSxvQkFBb0IsQ0FBQyxNQUFjOztZQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0tBQUE7Q0FDRiIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy9yZW5kZXIvc3VpL3Njb3JlVmlld09wZXJhdGlvbnMudHM/Y2Y0NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuaW1wb3J0IHsgU3VpU2NvcmVWaWV3LCB1cGRhdGVTdGFmZk1vZGlmaWVyRnVuYyB9IGZyb20gJy4vc2NvcmVWaWV3JztcclxuaW1wb3J0IHsgU21vU2NvcmUsIGVuZ3JhdmluZ0ZvbnRUeXBlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc2NvcmUnO1xyXG5pbXBvcnQgeyBTbW9TeXN0ZW1TdGFmZlBhcmFtcywgU21vU3lzdGVtU3RhZmYgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zeXN0ZW1TdGFmZic7XHJcbmltcG9ydCB7IFNtb1BhcnRJbmZvIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvcGFydEluZm8nO1xyXG5pbXBvcnQgeyBTbW9NZWFzdXJlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZSc7XHJcbmltcG9ydCB7IFNtb05vdGUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9ub3RlJztcclxuaW1wb3J0IHsgS2V5RXZlbnQsIFN2Z0JveCwgUGl0Y2gsIFBpdGNoTGV0dGVyLCBSZW1vdmVFbGVtZW50TGlrZSwgRWxlbWVudExpa2UgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTbW9SZW5kZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgU21vU3lzdGVtR3JvdXAsIFNtb1BhZ2VMYXlvdXQsIFNtb0dsb2JhbExheW91dCwgU21vTGF5b3V0TWFuYWdlciwgU21vQXVkaW9QbGF5ZXJTZXR0aW5ncyxcclxuICBTbW9TY29yZVByZWZlcmVuY2VzLCBTbW9TY29yZUluZm8gfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zY29yZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb1RleHRHcm91cCB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3Njb3JlVGV4dCc7XHJcbmltcG9ydCB7IFNtb0R5bmFtaWNUZXh0LCBTbW9Ob3RlTW9kaWZpZXJCYXNlLCBTbW9HcmFjZU5vdGUsIFNtb0FydGljdWxhdGlvbiwgXHJcbiAgU21vT3JuYW1lbnQsIFNtb0x5cmljLCBTbW9NaWNyb3RvbmUsIFNtb0FycGVnZ2lvLCBTbW9BcnBlZ2dpb1R5cGUsIFNtb0NsZWZDaGFuZ2UsIFxyXG4gIFNtb1RhYk5vdGV9IGZyb20gJy4uLy4uL3Ntby9kYXRhL25vdGVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9UZW1wb1RleHQsIFNtb1ZvbHRhLCBTbW9CYXJsaW5lLCBTbW9SZXBlYXRTeW1ib2wsIFxyXG4gIFNtb1JlaGVhcnNhbE1hcmssIFNtb01lYXN1cmVGb3JtYXQsIFRpbWVTaWduYXR1cmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tZWFzdXJlTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgVW5kb0J1ZmZlciB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS91bmRvJztcclxuaW1wb3J0IHtcclxuICBTbW9PcGVyYXRpb24sIGNyZWF0ZVN0YWZmTW9kaWZpZXJUeXBlLCBNYWtlVHVwbGV0T3BlcmF0aW9uXHJcbn0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL29wZXJhdGlvbnMnO1xyXG5pbXBvcnQgeyBCYXRjaFNlbGVjdGlvbk9wZXJhdGlvbiB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9vcGVyYXRpb25zJztcclxuaW1wb3J0IHsgc21vU2VyaWFsaXplIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcmlhbGl6YXRpb25IZWxwZXJzJztcclxuaW1wb3J0IHsgRm9udEluZm8gfSBmcm9tICcuLi8uLi9jb21tb24vdmV4JztcclxuaW1wb3J0IHsgU21vTXVzaWMgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tdXNpYyc7XHJcbmltcG9ydCB7IFN1aU9zY2lsbGF0b3IgfSBmcm9tICcuLi9hdWRpby9vc2NpbGxhdG9yJztcclxuaW1wb3J0IHsgWG1sVG9TbW8gfSBmcm9tICcuLi8uLi9zbW8vbXhtbC94bWxUb1Ntbyc7XHJcbmltcG9ydCB7IFN1aUF1ZGlvUGxheWVyIH0gZnJvbSAnLi4vYXVkaW8vcGxheWVyJztcclxuaW1wb3J0IHsgU3VpWGhyTG9hZGVyIH0gZnJvbSAnLi4vLi4vdWkvZmlsZWlvL3hockxvYWRlcic7XHJcbmltcG9ydCB7IFNtb1NlbGVjdGlvbiwgU21vU2VsZWN0b3IgfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vc2VsZWN0aW9ucyc7XHJcbmltcG9ydCB7IFN0YWZmTW9kaWZpZXJCYXNlLCBcclxuICAgU21vSW5zdHJ1bWVudCwgU21vSW5zdHJ1bWVudFBhcmFtcywgU21vU3RhZmZUZXh0QnJhY2tldCwgU21vVGFiU3RhdmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zdGFmZk1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFN1aVBpYW5vIH0gZnJvbSAnLi9waWFubyc7XHJcbmltcG9ydCB7IFN2Z0hlbHBlcnMgfSBmcm9tICcuL3N2Z0hlbHBlcnMnO1xyXG5pbXBvcnQgeyBQcm9taXNlSGVscGVycyB9IGZyb20gJy4uLy4uL2NvbW1vbi9wcm9taXNlSGVscGVycyc7XHJcbmltcG9ydCB7IHBhcnNlSnNvblRleHQgfSBmcm9tICd0eXBlc2NyaXB0JztcclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5kZWNsYXJlIHZhciBTbW9Db25maWc6IFNtb1JlbmRlckNvbmZpZ3VyYXRpb247XHJcblxyXG5cclxuLyoqXHJcbiAqIE1WVk0tbGlrZSBvcGVyYXRpb25zIG9uIHRoZSBkaXNwbGF5ZWQgc2NvcmUuXHJcbiAqIFxyXG4gKiBBbGwgb3BlcmF0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gYSAnbGl2ZScgc2NvcmUgZ28gdGhyb3VnaCB0aGlzXHJcbiAqIG1vZHVsZS4gIEl0IG1hcHMgdGhlIHNjb3JlIHZpZXcgdG8gdGhlIGFjdHVhbCBzY29yZSBhbmQgbWFrZXMgc3VyZSB0aGVcclxuICogbW9kZWwgYW5kIHZpZXcgc3RheSBpbiBzeW5jLiAgXHJcbiAqIFxyXG4gKiBCZWNhdXNlIHRoaXMgb2JqZWN0IG9wZXJhdGVzIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbnMsIFxyXG4gKiBhbGwgb3BlcmF0aW9ucyByZXR1cm4gcHJvbWlzZSBzbyBhcHBsaWNhdGlvbnMgY2FuIHdhaXQgZm9yIHRoZSBcclxuICogb3BlcmF0aW9uIHRvIGNvbXBsZXRlIGFuZCB1cGRhdGUgdGhlIHNlbGVjdGlvbiBsaXN0LlxyXG4gKiBAY2F0ZWdvcnkgU3VpUmVuZGVyXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpU2NvcmVWaWV3T3BlcmF0aW9ucyBleHRlbmRzIFN1aVNjb3JlVmlldyB7XHJcbiAgLyoqXHJcbiAgICogQWRkIGEgbmV3IHRleHQgZ3JvdXAgdG8gdGhlIHNjb3JlIFxyXG4gICAqIEBwYXJhbSB0ZXh0R3JvdXAgYSBuZXcgdGV4dCBncm91cFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZFRleHRHcm91cCh0ZXh0R3JvdXA6IFNtb1RleHRHcm91cCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWx0TmV3ID0gU21vVGV4dEdyb3VwLmRlc2VyaWFsaXplUHJlc2VydmVJZCh0ZXh0R3JvdXAuc2VyaWFsaXplKCkpO1xyXG4gICAgY29uc3QgaXNQYXJ0RXhwb3NlZCA9IHRoaXMuaXNQYXJ0RXhwb3NlZCgpO1xyXG4gICAgbGV0IHNlbGVjdG9yID0gdGV4dEdyb3VwLnNlbGVjdG9yID8/IFNtb1NlbGVjdG9yLmRlZmF1bHQ7XHJcbiAgICBjb25zdCBwYXJ0SW5mbyA9IHRoaXMuc2NvcmUuc3RhdmVzWzBdLnBhcnRJbmZvO1xyXG4gICAgY29uc3QgYnVmVHlwZSA9IGlzUGFydEV4cG9zZWQgJiYgcGFydEluZm8ucHJlc2VydmVUZXh0R3JvdXBzXHJcbiAgICAgID8gVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5QQVJUX01PRElGSUVSIDogVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5TQ09SRV9NT0RJRklFUjtcclxuICAgIGlmIChidWZUeXBlID09PSBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlBBUlRfTU9ESUZJRVIpIHtcclxuICAgICAgc2VsZWN0b3Iuc3RhZmYgPSB0aGlzLnN0YWZmTWFwWzBdO1xyXG4gICAgfSAgXHJcbiAgICB0aGlzLnN0b3JlVW5kby5hZGRCdWZmZXIoJ3JlbW92ZSB0ZXh0IGdyb3VwJywgYnVmVHlwZSxcclxuICAgICAgc2VsZWN0b3IsIHRleHRHcm91cCwgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQpO1xyXG4gICAgaWYgKGlzUGFydEV4cG9zZWQgJiYgcGFydEluZm8ucHJlc2VydmVUZXh0R3JvdXBzKSB7XHJcbiAgICAgIHRoaXMuc2NvcmUuc3RhdmVzWzBdLnBhcnRJbmZvLnVwZGF0ZVRleHRHcm91cCh0ZXh0R3JvdXAsIHRydWUpO1xyXG4gICAgICBjb25zdCBwYXJ0SW5mbyA9IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbdGhpcy5fZ2V0RXF1aXZhbGVudFN0YWZmKDApXS5wYXJ0SW5mbztcclxuICAgICAgcGFydEluZm8udXBkYXRlVGV4dEdyb3VwKGFsdE5ldywgdHJ1ZSk7ICAgICAgXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNjb3JlLnVwZGF0ZVRleHRHcm91cCh0ZXh0R3JvdXAsIHRydWUpO1xyXG4gICAgICB0aGlzLnN0b3JlU2NvcmUudXBkYXRlVGV4dEdyb3VwKGFsdE5ldywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyVGV4dEdyb3VwcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHRoZSB0ZXh0IGdyb3VwIGZyb20gdGhlIHNjb3JlXHJcbiAgICogQHBhcmFtIHRleHRHcm91cCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVUZXh0R3JvdXAodGV4dEdyb3VwOiBTbW9UZXh0R3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzZWxlY3RvciA9IHRleHRHcm91cC5zZWxlY3RvciA/PyBTbW9TZWxlY3Rvci5kZWZhdWx0O1xyXG4gICAgbGV0IGFsdFNlbGVjdG9yID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWxlY3RvcikpO1xyXG4gICAgY29uc3QgcGFydEluZm8gPSB0aGlzLnNjb3JlLnN0YXZlc1swXS5wYXJ0SW5mbztcclxuICAgIGNvbnN0IGlzUGFydEV4cG9zZWQgPSB0aGlzLmlzUGFydEV4cG9zZWQoKTtcclxuICAgIGNvbnN0IGJ1ZlR5cGUgPSBpc1BhcnRFeHBvc2VkICYmIHBhcnRJbmZvLnByZXNlcnZlVGV4dEdyb3VwcyBcclxuICAgICAgPyBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlBBUlRfTU9ESUZJRVIgOiBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlNDT1JFX01PRElGSUVSO1xyXG4gICAgbGV0IG9nVGV4dCA9IHRoaXMuc3RvcmVTY29yZS50ZXh0R3JvdXBzLmZpbmQoKHRnKSA9PiB0Zy5hdHRycy5pZCA9PT0gdGV4dEdyb3VwLmF0dHJzLmlkKTtcclxuICAgIGlmIChpc1BhcnRFeHBvc2VkICYmIHBhcnRJbmZvLnByZXNlcnZlVGV4dEdyb3Vwcykge1xyXG4gICAgICBvZ1RleHQgPSBwYXJ0SW5mby50ZXh0R3JvdXBzLmZpbmQoKHRnKSA9PiB0Zy5hdHRycy5pZCA9PT0gdGV4dEdyb3VwLmF0dHJzLmlkKTtcclxuICAgIH1cclxuICAgIGlmIChidWZUeXBlID09PSBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlBBUlRfTU9ESUZJRVIpIHtcclxuICAgICAgc2VsZWN0b3Iuc3RhZmYgPSB0aGlzLnN0YWZmTWFwWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYWx0U2VsZWN0b3Iuc3RhZmYgPSB0aGlzLnN0YWZmTWFwW3NlbGVjdG9yLnN0YWZmXTtcclxuICAgIH1cclxuICAgIGlmICghb2dUZXh0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIFdlIHVuZG8gYnVmZmVyIHVzaW5nIHRoZSBzY29yZSBsb2NhdGlvbiwgbm90IHRoZSBncm91cCBsb2NhdGlvblxyXG4gICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKCdyZW1vdmUgdGV4dCBncm91cCcsIGJ1ZlR5cGUsXHJcbiAgICAgIGFsdFNlbGVjdG9yLCBvZ1RleHQsIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuUkVNT1ZFKTtcclxuICAgIGNvbnN0IGFsdEdyb3VwID0gU21vVGV4dEdyb3VwLmRlc2VyaWFsaXplUHJlc2VydmVJZCh0ZXh0R3JvdXAuc2VyaWFsaXplKCkpO1xyXG4gICAgaWYgKGFsdEdyb3VwLnNlbGVjdG9yKSB7XHJcbiAgICAgIGFsdEdyb3VwLnNlbGVjdG9yLnN0YWZmID0gYWx0U2VsZWN0b3Iuc3RhZmY7XHJcbiAgICB9XHJcbiAgICB0ZXh0R3JvdXAuZWxlbWVudHMuZm9yRWFjaCgoZWw6IEVsZW1lbnRMaWtlKSA9PiBSZW1vdmVFbGVtZW50TGlrZShlbCkpO1xyXG4gICAgdGV4dEdyb3VwLmVsZW1lbnRzID0gW107XHJcbiAgICBpZiAoaXNQYXJ0RXhwb3NlZCAmJiBwYXJ0SW5mby5wcmVzZXJ2ZVRleHRHcm91cHMpIHtcclxuICAgICAgcGFydEluZm8udXBkYXRlVGV4dEdyb3VwKHRleHRHcm91cCwgZmFsc2UpO1xyXG4gICAgICB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuX2dldEVxdWl2YWxlbnRTdGFmZigwKV0ucGFydEluZm8udXBkYXRlVGV4dEdyb3VwKGFsdEdyb3VwLCBmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNjb3JlLnVwZGF0ZVRleHRHcm91cCh0ZXh0R3JvdXAsIGZhbHNlKTtcclxuICAgICAgdGhpcy5zdG9yZVNjb3JlLnVwZGF0ZVRleHRHcm91cChhbHRHcm91cCwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci5yZXJlbmRlclRleHRHcm91cHMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVQZGF0ZSBhbiBleGlzdGluZyB0ZXh0IGdyb3VwLiAgVGhlIG9yaWdpbmFsIGlzIHBhc3NlZCBpbiwgYmVjYXVzZSBzaW5jZSBURyBub3QgdGllZCB0byBhIG11c2ljYWxcclxuICAgKiBlbGVtZW50LCB3ZSBuZWVkIHRvIGZpbmQgdGhlIG9uZSB3ZSdyZSB1cGRhdGluZy5cclxuICAgKiBAcGFyYW0gb2xkVmVyc2lvbiBcclxuICAgKiBAcGFyYW0gbmV3VmVyc2lvbiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVUZXh0R3JvdXAobmV3VmVyc2lvbjogU21vVGV4dEdyb3VwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3RvciA9IG5ld1ZlcnNpb24uc2VsZWN0b3IgPz8gU21vU2VsZWN0b3IuZGVmYXVsdDsgLy8gZm9yIHNjb3JlIHZpZXdcclxuICAgIGNvbnN0IGFsdFNlbGVjdG9yID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWxlY3RvcikpOyAvLyBmb3IgZnVsbCBzY29yZVxyXG4gICAgY29uc3QgaXNQYXJ0RXhwb3NlZCA9IHRoaXMuaXNQYXJ0RXhwb3NlZCgpO1xyXG4gICAgY29uc3QgcGFydEluZm8gPSB0aGlzLnNjb3JlLnN0YXZlc1swXS5wYXJ0SW5mbztcclxuXHJcbiAgICAvLyBJZiB0aGlzIHRleHQgd2FzIGF0dGFjaGVkIHRvIGEgc3RhZmYgdGhhdCBpcyBub3QgaW4gdGhlIHBhcnQsIGlnbm9yZSB0aGUgdXBkYXRlXHJcbiAgICBpZiAobmV3VmVyc2lvbi5zZWxlY3RvciAmJiBuZXdWZXJzaW9uLnNlbGVjdG9yLnN0YWZmID49IHRoaXMuc2NvcmUuc3RhdmVzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBCYWNrIHVwIHRoZSBvcmlnaW5hbCBzY29yZSB0ZXh0XHJcbiAgICBsZXQgb2d0ZyA9IHRoaXMuc3RvcmVTY29yZS50ZXh0R3JvdXBzLmZpbmQoKHRnKSA9PiB0Zy5hdHRycy5pZCA9PT0gbmV3VmVyc2lvbi5hdHRycy5pZCk7XHJcbiAgICBpZiAoaXNQYXJ0RXhwb3NlZCAmJiBwYXJ0SW5mby5wcmVzZXJ2ZVRleHRHcm91cHMpIHtcclxuICAgICAgb2d0ZyA9IHBhcnRJbmZvLnRleHRHcm91cHMuZmluZCgodGcpID0+IHRnLmF0dHJzLmlkID09PSBuZXdWZXJzaW9uLmF0dHJzLmlkKTtcclxuICAgIH1cclxuICAgIGlmICghb2d0Zykge1xyXG4gICAgICAvLyB0aGVyZSBpcyBub3RoaW5nIHRvIHVwZGF0ZSwgcmV0dXJuLlxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAob2d0Zykge1xyXG4gICAgICBjb25zdCBidWZUeXBlID0gaXNQYXJ0RXhwb3NlZCAmJiBwYXJ0SW5mby5wcmVzZXJ2ZVRleHRHcm91cHMgXHJcbiAgICAgICAgPyBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlBBUlRfTU9ESUZJRVIgOiBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlNDT1JFX01PRElGSUVSO1xyXG4gICAgICAvLyBpZiB0aGlzIGlzIHBhcnQgdGV4dCwgbWFrZSBzdXJlIHRoZSB1bmRvIGJ1ZmZlciBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcnQgc3RhdmVcclxuICAgICAgLy8gaW4gdGhlIGZ1bGwgc2NvcmUsIHNvIHVuZG8gd29ya3MgcHJvcGVybHlcclxuICAgICAgaWYgKGJ1ZlR5cGUgPT09IFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuUEFSVF9NT0RJRklFUikge1xyXG4gICAgICAgIGFsdFNlbGVjdG9yLnN0YWZmID0gdGhpcy5zdGFmZk1hcFswXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhbHRTZWxlY3Rvci5zdGFmZiA9IHRoaXMuc3RhZmZNYXBbc2VsZWN0b3Iuc3RhZmZdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcignbW9kaWZ5IHRleHQnLFxyXG4gICAgICAgIGJ1ZlR5cGUsIGFsdFNlbGVjdG9yLCBvZ3RnLCBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLlVQREFURSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhbHROZXcgPSBTbW9UZXh0R3JvdXAuZGVzZXJpYWxpemVQcmVzZXJ2ZUlkKG5ld1ZlcnNpb24uc2VyaWFsaXplKCkpO1xyXG4gICAgaWYgKGFsdE5ldy5zZWxlY3Rvcikge1xyXG4gICAgICBhbHROZXcuc2VsZWN0b3Iuc3RhZmYgPSBhbHRTZWxlY3Rvci5zdGFmZjtcclxuICAgIH1cclxuICAgIHRoaXMuc2NvcmUudXBkYXRlVGV4dEdyb3VwKG5ld1ZlcnNpb24sIHRydWUpO1xyXG4gICAgLy8gSWYgdGhpcyBpcyBwYXJ0IHRleHQgYW5kIHBhcnQtc3BlY2lmaWMgdGV4dCBpcyBzZXQsIFxyXG4gICAgLy8gb25seSBzZXQgdGhlIHBhcnRJbmZvIGZvciB0aGUgc3RvcmVkIHNjb3JlLCBidXQgZG9uJ3QgYWRkIHRvIFxyXG4gICAgLy8gZ2xvYmFsIHRleHQuXHJcbiAgICBpZiAoaXNQYXJ0RXhwb3NlZCkge1xyXG4gICAgICBjb25zdCBwYXJ0SW5mbyA9IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbYWx0U2VsZWN0b3Iuc3RhZmZdLnBhcnRJbmZvO1xyXG4gICAgICBwYXJ0SW5mby51cGRhdGVUZXh0R3JvdXAoYWx0TmV3LCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RvcmVTY29yZS51cGRhdGVUZXh0R3JvdXAoYWx0TmV3LCB0cnVlKTtcclxuICAgIH1cclxuICAgIC8vIFRPRE86IG9ubHkgcmVuZGVyIHRoZSBvbmUgVEcuXHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyVGV4dEdyb3VwcygpO1xyXG4gICAgLy8gcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBsb2FkIGFuIG14bWwgc2NvcmUgcmVtb3RlbHksIHJldHVybiBhIHByb21pc2UgdGhhdCBcclxuICAgKiBjb21wbGV0ZXMgd2hlbiB0aGUgZmlsZSBpcyBsb2FkZWRcclxuICAgKiBAcGFyYW0gdXJsIHdoZXJlIHRvIGZpbmQgdGhlIHhtbCBmaWxlXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgbG9hZFJlbW90ZVhtbCh1cmw6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCByZXEgPSBuZXcgU3VpWGhyTG9hZGVyKHVybCk7XHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIC8vIFNob3VsZG4ndCB3ZSByZXR1cm4gcHJvbWlzZSBvZiBhY3R1YWxseSBkaXNwbGF5aW5nIHRoZSBzY29yZT9cclxuICAgIGF3YWl0IHJlcS5sb2FkQXN5bmMoKTtcclxuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgIGNvbnN0IHhtbCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVxLnZhbHVlLCAndGV4dC94bWwnKTtcclxuICAgIGNvbnN0IHNjb3JlID0gWG1sVG9TbW8uY29udmVydCh4bWwpO1xyXG4gICAgc2NvcmUubGF5b3V0TWFuYWdlciEuem9vbVRvV2lkdGgoJCgnYm9keScpLndpZHRoKCkpO1xyXG4gICAgYXdhaXQgc2VsZi5jaGFuZ2VTY29yZShzY29yZSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGxvYWQgYSByZW1vdGUgc2NvcmUgaW4gU01PIGZvcm1hdFxyXG4gICAqIEBwYXJhbSB1cmwgdXJsIHRvIGZpbmQgdGhlIHNjb3JlXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgbG9hZFJlbW90ZUpzb24odXJsOiBzdHJpbmcpIDogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IHJlcSA9IG5ldyBTdWlYaHJMb2FkZXIodXJsKTtcclxuICAgIGF3YWl0IHJlcS5sb2FkQXN5bmMoKTtcclxuICAgIGNvbnN0IHNjb3JlID0gU21vU2NvcmUuZGVzZXJpYWxpemUocmVxLnZhbHVlKTtcclxuICAgIGF3YWl0IHRoaXMuY2hhbmdlU2NvcmUoc2NvcmUpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBMb2FkIGEgcmVtb3RlIHNjb3JlLCByZXR1cm4gcHJvbWlzZSB3aGVuIGl0J3MgYmVlbiBsb2FkZWRcclxuICAgKiBmcm9tIGFmYXIuXHJcbiAgICogQHBhcmFtIHByZWYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgbG9hZFJlbW90ZVNjb3JlKHVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh1cmwuZW5kc1dpdGgoJ3htbCcpIHx8IHVybC5lbmRzV2l0aCgnbXhsJykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubG9hZFJlbW90ZVhtbCh1cmwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMubG9hZFJlbW90ZUpzb24odXJsKTtcclxuICAgIH1cclxuICB9XHJcbiAgYXN5bmMgdXBkYXRlQXVkaW9TZXR0aW5ncyhwcmVmOiBTbW9BdWRpb1BsYXllclNldHRpbmdzKSB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmVQcmVmZXJlbmNlcygnVXBkYXRlIHByZWZlcmVuY2VzJyk7XHJcbiAgICB0aGlzLnNjb3JlLmF1ZGlvU2V0dGluZ3MgPSBwcmVmO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLmF1ZGlvU2V0dGluZ3MgPSBuZXcgU21vQXVkaW9QbGF5ZXJTZXR0aW5ncyhwcmVmKTtcclxuICAgIC8vIE5vIHJlbmRlcmluZyB0byBiZSBkb25lXHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdsb2JhbCBzZXR0aW5ncyB0aGF0IGNvbnRyb2wgaG93IHRoZSBzY29yZSBlZGl0b3IgYmVoYXZlc1xyXG4gICAqIEBwYXJhbSBwcmVmIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZVNjb3JlUHJlZmVyZW5jZXMocHJlZjogU21vU2NvcmVQcmVmZXJlbmNlcyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlUHJlZmVyZW5jZXMoJ1VwZGF0ZSBwcmVmZXJlbmNlcycpO1xyXG4gICAgY29uc3Qgb2xkWHBvc2UgPSB0aGlzLnNjb3JlLnByZWZlcmVuY2VzLnRyYW5zcG9zaW5nU2NvcmU7XHJcbiAgICBjb25zdCBjdXJYcG9zZSA9IHByZWYudHJhbnNwb3NpbmdTY29yZTtcclxuICAgIHRoaXMuc2NvcmUudXBkYXRlU2NvcmVQcmVmZXJlbmNlcyhuZXcgU21vU2NvcmVQcmVmZXJlbmNlcyhwcmVmKSk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUudXBkYXRlU2NvcmVQcmVmZXJlbmNlcyhuZXcgU21vU2NvcmVQcmVmZXJlbmNlcyhwcmVmKSk7XHJcbiAgICBpZiAoY3VyWHBvc2UgPT09IGZhbHNlICYmIG9sZFhwb3NlID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuc2NvcmUuc2V0Tm9uVHJhbnNwb3NpbmcoKTtcclxuICAgICAgdGhpcy5zdG9yZVNjb3JlLnNldE5vblRyYW5zcG9zaW5nKCk7XHJcbiAgICB9IGVsc2UgaWYgKGN1clhwb3NlID09PSB0cnVlICYmIG9sZFhwb3NlID09PSBmYWxzZSkge1xyXG4gICAgICB0aGlzLnNjb3JlLnNldFRyYW5zcG9zaW5nKCk7XHJcbiAgICAgIHRoaXMuc3RvcmVTY29yZS5zZXRUcmFuc3Bvc2luZygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXREaXJ0eSgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjb3JlLCBjb21wb3NlciBldGMuXHJcbiAgICogQHBhcmFtIHNjb3JlSW5mbyBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVTY29yZUluZm8oc2NvcmVJbmZvOiBTbW9TY29yZUluZm8pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZVByZWZlcmVuY2VzKCdVcGRhdGUgcHJlZmVyZW5jZXMnKTtcclxuICAgIHRoaXMuc2NvcmUuc2NvcmVJbmZvID0gc2NvcmVJbmZvO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnNjb3JlSW5mbyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc2NvcmVJbmZvKSk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKClcclxuICB9XHJcbiAgYXN5bmMgYWRkUmVtb3ZlQXJwZWdnaW8oY29kZTogU21vQXJwZWdnaW9UeXBlKSB7XHJcbiAgICBhd2FpdCB0aGlzLm1vZGlmeUN1cnJlbnRTZWxlY3Rpb25zKCdhZGQvcmVtb3ZlIGFkZFJlbW92ZUFycGVnZ2lvJyxcclxuICAgICAgKHNjb3JlLCBzZWxlY3Rpb25zKSA9PiB7XHJcbiAgICAgICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgICAgIGlmIChzZWwubm90ZSkge1xyXG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgICAgc2VsLm5vdGUuYXJwZWdnaW8gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgc2VsLm5vdGUuYXJwZWdnaW8gPSBuZXcgU21vQXJwZWdnaW8oeyB0eXBlOiBjb2RlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEEgY2xlZiBjaGFuZ2UgbWlkLW1lYXN1cmUgKGNsZWZOb3RlKVxyXG4gICAqIEBwYXJhbSBjbGVmIFxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZFJlbW92ZUNsZWZDaGFuZ2UoY2xlZjogU21vQ2xlZkNoYW5nZSkge1xyXG4gICAgYXdhaXQgdGhpcy5tb2RpZnlDdXJyZW50U2VsZWN0aW9ucygnYWRkL3JlbW92ZSBhZGRSZW1vdmVDbGVmQ2hhbmdlJyxcclxuICAgICAgKHNjb3JlLCBzZWxlY3Rpb25zKSA9PiB7XHJcbiAgICAgICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG1lYXN1cmVDbGVmID0gc2VsLm1lYXN1cmUuY2xlZjtcclxuICAgICAgICAgIGlmIChzZWwubm90ZSkge1xyXG4gICAgICAgICAgICBpZiAobWVhc3VyZUNsZWYgPT09IGNsZWYuY2xlZikge1xyXG4gICAgICAgICAgICAgIHNlbC5ub3RlLmNsZWZOb3RlID0gbnVsbDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBzZWwubm90ZS5jbGVmTm90ZSA9IGNsZWY7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIC8vIE1ha2Ugc3VyZSBhbGwgdGhlIG5vdGVzIGluIHRoZSBtZWFzdXJlIGFmdGVyIHRoZSBjaGFuZ2UgYXJlIHVwZGF0ZWQuICBcclxuICAgIC8vIFdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGZvciB0aGUgZGlzcGxheWVkIHNjb3JlLCBub3QgdGhlIHN0b3JlU2NvcmUuXHJcbiAgICBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpLmZvckVhY2goKG1zKSA9PiB7XHJcbiAgICAgIG1zLm1lYXN1cmUudXBkYXRlQ2xlZkNoYW5nZU5vdGVzKCk7XHJcbiAgICB9KVxyXG4gIH1cclxuICAvKipcclxuICAgKiBNb2RpZnkgdGhlIGR5bmFtaWNzIGFzc29pY2F0ZWQgd2l0aCB0aGUgc3BlY2lmaWMgc2VsZWN0aW9uXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbiBcclxuICAgKiBAcGFyYW0gZHluYW1pYyBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBhZGREeW5hbWljKHNlbGVjdGlvbjogU21vU2VsZWN0aW9uLCBkeW5hbWljOiBTbW9EeW5hbWljVGV4dCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5tb2RpZnlTZWxlY3Rpb24oJ2FkZCBkeW5hbWljJywgc2VsZWN0aW9uLCAoc2NvcmUsIHNlbGVjdGlvbnMpID0+IHtcclxuICAgICAgU21vT3BlcmF0aW9uLmFkZER5bmFtaWMoc2VsZWN0aW9uc1swXSwgZHluYW1pYyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBkeW5hbWljcyBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGlvblxyXG4gICAqIEBwYXJhbSBkeW5hbWljXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgcmVtb3ZlRHluYW1pYyhkeW5hbWljOiBTbW9EeW5hbWljVGV4dCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZXMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpO1xyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5sZW5ndGg7ICsraikge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1tqXTtcclxuICAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICAgIGNvbnN0IGVxdWl2ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICAgIGlmIChlcXVpdj8ubm90ZSAmJiBzZWxlY3Rpb24ubm90ZSkge1xyXG4gICAgICAgICAgY29uc3QgYWx0TW9kaWZpZXJzID0gZXF1aXYubm90ZS5nZXRNb2RpZmllcnMoJ1Ntb0R5bmFtaWNUZXh0Jyk7XHJcbiAgICAgICAgICBTbW9PcGVyYXRpb24ucmVtb3ZlRHluYW1pYyhzZWxlY3Rpb24sIGR5bmFtaWMpO1xyXG4gICAgICAgICAgaWYgKGFsdE1vZGlmaWVycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgU21vT3BlcmF0aW9uLnJlbW92ZUR5bmFtaWMoZXF1aXYsIGFsdE1vZGlmaWVyc1swXSBhcyBTbW9EeW5hbWljVGV4dCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlcyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKVxyXG4gIH1cclxuICAvKipcclxuICAgKiB3ZSBuZXZlciByZWFsbHkgZGVsZXRlIGEgbm90ZSwgYnV0IHdlIHdpbGwgY29udmVydCBpdCBpbnRvIGEgcmVzdCBhbmQgaWYgaXQnc1xyXG4gICAqIGFscmVhZHkgYSByZXN0IHdlIHdpbGwgdHJ5IHRvIGhpZGUgaXQuXHJcbiAgICogT3BlcmF0ZXMgb24gY3VycmVudCBzZWxlY3Rpb25zXHJcbiAgICogKi9cclxuICBhc3luYyBkZWxldGVOb3RlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ2RlbGV0ZSBub3RlJyk7XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgaWYgKHNlbC5ub3RlKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuXHJcbiAgICAgICAgLy8gc2V0IHRoZSBwaXRjaCB0byBiZSBhIGdvb2QgcG9zaXRpb24gZm9yIHRoZSByZXN0XHJcbiAgICAgICAgY29uc3QgcGl0Y2ggPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgU21vTWVhc3VyZS5kZWZhdWx0UGl0Y2hGb3JDbGVmW3NlbC5tZWFzdXJlLmNsZWZdKSk7XHJcbiAgICAgICAgY29uc3QgYWx0UGl0Y2ggPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgU21vTWVhc3VyZS5kZWZhdWx0UGl0Y2hGb3JDbGVmW2FsdFNlbCEubWVhc3VyZS5jbGVmXSkpO1xyXG4gICAgICAgIHNlbC5ub3RlLnBpdGNoZXMgPSBbcGl0Y2hdO1xyXG4gICAgICAgIGFsdFNlbCEubm90ZSEucGl0Y2hlcyA9IFthbHRQaXRjaF07XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBub3RlIGlzIGEgbm90ZSwgbWFrZSBpdCBpbnRvIGEgcmVzdC4gIElmIHRoZSBub3RlIGlzIGEgcmVzdCBhbHJlYWR5LFxyXG4gICAgICAgIC8vIG1ha2UgaXQgaW52aXNpYmxlLiAgSWYgaXQgaXMgaW52aXNpYmxlIGFscmVhZHksIG1ha2UgaXQgYmFjayBpbnRvIGEgcmVzdC5cclxuICAgICAgICBpZiAoc2VsLm5vdGUuaXNSZXN0KCkgJiYgIXNlbC5ub3RlLmlzSGlkZGVuKCkpIHtcclxuICAgICAgICAgIHNlbC5ub3RlLm1ha2VIaWRkZW4odHJ1ZSk7XHJcbiAgICAgICAgICBhbHRTZWwhLm5vdGUhLm1ha2VIaWRkZW4odHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNlbC5ub3RlLmNsZWFyQXJ0aWN1bGF0aW9ucygpO1xyXG4gICAgICAgICAgc2VsLm5vdGUubWFrZVJlc3QoKTtcclxuICAgICAgICAgIGFsdFNlbCEubm90ZSEubWFrZVJlc3QoKTtcclxuICAgICAgICAgIGFsdFNlbCEubm90ZSEuY2xlYXJBcnRpY3VsYXRpb25zKCk7XHJcbiAgICAgICAgICBzZWwubm90ZS5tYWtlSGlkZGVuKGZhbHNlKTtcclxuICAgICAgICAgIGFsdFNlbCEubm90ZSEubWFrZUhpZGRlbihmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKVxyXG4gIH1cclxuICAvKipcclxuICAqIFRoZSBseXJpYyBlZGl0b3IgbW92ZXMgYXJvdW5kLCBzbyB3ZSBjYW4ndCBkZXBlbmQgb24gdGhlIHRyYWNrZXIgZm9yIHRoZVxyXG4gICogY29ycmVjdCBzZWxlY3Rpb24uICBXZSBnZXQgaXQgZGlyZWN0bHkgZnJvbSB0aGUgZWRpdG9yLlxyXG4gICogXHJcbiAgKiBAcGFyYW0gc2VsZWN0b3IgLSB0aGUgc2VsZWN0b3Igb2YgdGhlIG5vdGUgd2l0aCB0aGUgbHlyaWMgdG8gcmVtb3ZlXHJcbiAgKiBAcGFyYW0gbHlyaWMgLSBhIGNvcHkgb2YgdGhlIGx5cmljIHRvIHJlbW92ZS4gIFdlIHVzZSB0aGUgdmVyc2UsIHBhcnNlciB0byBpZGVudGlmeSBpdFxyXG4gICogQHJldHVybnMgcmVuZGVyIHByb21pc2VcclxuICAqL1xyXG4gIGFzeW5jIHJlbW92ZUx5cmljKHNlbGVjdG9yOiBTbW9TZWxlY3RvciwgbHlyaWM6IFNtb0x5cmljKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBTbW9TZWxlY3Rpb24ubm90ZUZyb21TZWxlY3Rvcih0aGlzLnNjb3JlLCBzZWxlY3Rvcik7XHJcbiAgICBpZiAoc2VsZWN0aW9uID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlSGVscGVycy5lbXB0eVByb21pc2UoKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3VuZG9TZWxlY3Rpb24oJ3JlbW92ZSBseXJpYycsIHNlbGVjdGlvbik7XHJcbiAgICBzZWxlY3Rpb24ubm90ZSEucmVtb3ZlTHlyaWMobHlyaWMpO1xyXG4gICAgY29uc3QgZXF1aXYgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICBjb25zdCBzdG9yZUx5cmljID0gZXF1aXYhLm5vdGUhLmdldEx5cmljRm9yVmVyc2UobHlyaWMudmVyc2UsIGx5cmljLnBhcnNlcik7XHJcbiAgICBpZiAodHlwZW9mIChzdG9yZUx5cmljKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgZXF1aXYhLm5vdGUhLnJlbW92ZUx5cmljKGx5cmljKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUoc2VsZWN0aW9uKTtcclxuICAgIGx5cmljLmRlbGV0ZWQgPSB0cnVlO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcGFyYW0gc2VsZWN0b3Igd2hlcmUgdG8gYWRkIG9yIHVwZGF0ZSB0aGUgbHlyaWNcclxuICAgKiBAcGFyYW0gbHlyaWMgYSBjb3B5IG9mIHRoZSBseXJpYyB0byByZW1vdmVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBhZGRPclVwZGF0ZUx5cmljKHNlbGVjdG9yOiBTbW9TZWxlY3RvciwgbHlyaWM6IFNtb0x5cmljKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBTbW9TZWxlY3Rpb24ubm90ZUZyb21TZWxlY3Rvcih0aGlzLnNjb3JlLCBzZWxlY3Rvcik7XHJcbiAgICBpZiAoc2VsZWN0aW9uID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3VuZG9TZWxlY3Rpb24oJ3VwZGF0ZSBseXJpYycsIHNlbGVjdGlvbik7XHJcbiAgICBzZWxlY3Rpb24ubm90ZSEuYWRkTHlyaWMobHlyaWMpO1xyXG4gICAgY29uc3QgZXF1aXYgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICBjb25zdCBhbHRMeXJpYyA9IFNtb05vdGVNb2RpZmllckJhc2UuZGVzZXJpYWxpemUobHlyaWMuc2VyaWFsaXplKCkgYXMgYW55KSBhcyBTbW9MeXJpYztcclxuICAgIGVxdWl2IS5ub3RlIS5hZGRMeXJpYyhhbHRMeXJpYyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZFRvUmVwbGFjZVF1ZXVlKHNlbGVjdGlvbik7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBhbGwgdGhlIG5vdGVzIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZvaWNlXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgZGVwb3B1bGF0ZVZvaWNlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ2RlcG9wdWxhdGUgdm9pY2UnKTtcclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBpeCA9IHNlbGVjdGlvbi5tZWFzdXJlLmdldEFjdGl2ZVZvaWNlKCk7XHJcbiAgICAgIGlmIChpeCAhPT0gMCkge1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi5kZXBvcHVsYXRlVm9pY2Uoc2VsZWN0aW9uLCBpeCk7XHJcbiAgICAgICAgY29uc3QgZXF1aXYgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLmRlcG9wdWxhdGVWb2ljZShlcXVpdiEsIGl4KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBTbW9PcGVyYXRpb24uc2V0QWN0aXZlVm9pY2UodGhpcy5zY29yZSwgMCk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSB0aGUgYWN0aXZlIHZvaWNlIGluIGEgbXVsdGktdm9pY2UgbWVhc3VyZS5cclxuICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgX2NoYW5nZUFjdGl2ZVZvaWNlKGluZGV4OiBudW1iZXIpOiBTbW9TZWxlY3Rpb25bXSB7XHJcbiAgICBjb25zdCBtZWFzdXJlc1RvQWRkOiBTbW9TZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpO1xyXG4gICAgbWVhc3VyZVNlbGVjdGlvbnMuZm9yRWFjaCgobWVhc3VyZVNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBpZiAoaW5kZXggPT09IG1lYXN1cmVTZWxlY3Rpb24ubWVhc3VyZS52b2ljZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgbWVhc3VyZXNUb0FkZC5wdXNoKG1lYXN1cmVTZWxlY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBtZWFzdXJlc1RvQWRkO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQb3B1bGF0ZSBhIG5ldyB2b2ljZSB3aXRoIGRlZmF1bHQgbm90ZXNcclxuICAgKiBAcGFyYW0gaW5kZXggdGhlIHZvaWNlIHRvIHBvcHVsYXRlXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgcG9wdWxhdGVWb2ljZShpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtZWFzdXJlc1RvQWRkID0gdGhpcy5fY2hhbmdlQWN0aXZlVm9pY2UoaW5kZXgpO1xyXG4gICAgaWYgKG1lYXN1cmVzVG9BZGQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5zZXRBY3RpdmVWb2ljZSh0aGlzLnNjb3JlLCBpbmRleCk7XHJcbiAgICAgIHRoaXMudHJhY2tlci5zZWxlY3RBY3RpdmVWb2ljZSgpO1xyXG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICBtZWFzdXJlc1RvQWRkLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICB0aGlzLl91bmRvU2VsZWN0aW9uKCdwb3B1YWx0ZVZvaWNlJywgc2VsZWN0aW9uKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnBvcHVsYXRlVm9pY2Uoc2VsZWN0aW9uLCBpbmRleCk7XHJcbiAgICAgIGNvbnN0IGVxdWl2ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICBTbW9PcGVyYXRpb24ucG9wdWxhdGVWb2ljZShlcXVpdiEsIGluZGV4KTtcclxuICAgIH0pO1xyXG4gICAgU21vT3BlcmF0aW9uLnNldEFjdGl2ZVZvaWNlKHRoaXMuc2NvcmUsIGluZGV4KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlc1RvQWRkKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdEFjdGl2ZVZvaWNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHN3YXBWb2ljZXModm9pY2UxOiBudW1iZXIsIHZvaWNlMjogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkTWVhc3VyZXMoKTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi5zd2FwVm9pY2Uoc2VsZWN0aW9ucywgdm9pY2UxLCB2b2ljZTIpO1xyXG4gICAgU21vT3BlcmF0aW9uLnN3YXBWb2ljZShhbHRTZWxlY3Rpb25zLCB2b2ljZTEsIHZvaWNlMik7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMoc2VsZWN0aW9ucyk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFzc2lnbiBhbiBpbnN0cnVtZW50IHRvIGEgc2V0IG9mIG1lYXN1cmVzXHJcbiAgICogQHBhcmFtIGluc3RydW1lbnQgdGhlIGluc3RydW1lbnQgdG8gYXNzaWduIHRvIHRoZSBzZWxlY3Rpb25zXHJcbiAgICogQHBhcmFtIHNlbGVjdGlvbnMgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgY2hhbmdlSW5zdHJ1bWVudChpbnN0cnVtZW50OiBTbW9JbnN0cnVtZW50LCBzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHR5cGVvZiAoc2VsZWN0aW9ucykgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIH1cclxuICAgIHRoaXMuX3VuZG9TZWxlY3Rpb25zKCdjaGFuZ2UgaW5zdHJ1bWVudCcsIHNlbGVjdGlvbnMpO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9ucyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLmNoYW5nZUluc3RydW1lbnQoaW5zdHJ1bWVudCwgdGhpcy5zY29yZSwgc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24uY2hhbmdlSW5zdHJ1bWVudChpbnN0cnVtZW50LCB0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbGVjdGlvbnMpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKHNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgdGltZSBzaWduYXR1cmUgZm9yIGEgc2VsZWN0aW9uXHJcbiAgICogQHBhcmFtIHRpbWVTaWduYXR1cmUgYWN0dWFsIHRpbWUgc2lnbmF0dXJlXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0VGltZVNpZ25hdHVyZSh0aW1lU2lnbmF0dXJlOiBUaW1lU2lnbmF0dXJlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ1NldCB0aW1lIHNpZ25hdHVyZScpO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9ucyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLnNldFRpbWVTaWduYXR1cmUodGhpcy5zY29yZSwgc2VsZWN0aW9ucywgdGltZVNpZ25hdHVyZSk7XHJcbiAgICBTbW9PcGVyYXRpb24uc2V0VGltZVNpZ25hdHVyZSh0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbGVjdGlvbnMsIHRpbWVTaWduYXR1cmUpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdCh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucykpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBNb3ZlIHNlbGVjdGVkIHN0YWZmIHVwIG9yIGRvd24gaW4gdGhlIHNjb3JlLlxyXG4gICAqIEBwYXJhbSBpbmRleCBkaXJlY3Rpb24gdG8gbW92ZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIG1vdmVTdGFmZlVwRG93bihpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ3JlLW9yZGVyIHN0YXZlcycpO1xyXG4gICAgLy8gR2V0IHN0YWZmIHRvIG1vdmVcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24odGhpcy50cmFja2VyLnNlbGVjdGlvbnNbMF0pO1xyXG4gICAgLy8gTWFrZSB0aGUgbW92ZSBpbiB0aGUgbW9kZWwsIGFuZCByZXNldCB0aGUgdmlldyBzbyB3ZSBjYW4gc2VlIHRoZSBuZXdcclxuICAgIC8vIGFycmFuZ2VtZW50XHJcbiAgICBTbW9PcGVyYXRpb24ubW92ZVN0YWZmVXBEb3duKHRoaXMuc3RvcmVTY29yZSwgc2VsZWN0aW9uISwgaW5kZXgpO1xyXG4gICAgdGhpcy52aWV3QWxsKCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBzdGFmZiBncm91cCBmb3IgYSBzY29yZSwgd2hpY2ggZGV0ZXJtaW5lcyBob3cgdGhlIHN0YXZlc1xyXG4gICAqIGFyZSBqdXN0aWZpZWQgYW5kIGJyYWNrZXRlZFxyXG4gICAqIEBwYXJhbSBzdGFmZkdyb3VwIFxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZE9yVXBkYXRlU3RhZmZHcm91cChzdGFmZkdyb3VwOiBTbW9TeXN0ZW1Hcm91cCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdncm91cCBzdGF2ZXMnKTtcclxuICAgIC8vIEFzc3VtZSB0aGF0IHRoZSB2aWV3IGlzIG5vdyBzZXQgdG8gZnVsbCBzY29yZVxyXG4gICAgdGhpcy5zY29yZS5hZGRPclJlcGxhY2VTeXN0ZW1Hcm91cChzdGFmZkdyb3VwKTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5hZGRPclJlcGxhY2VTeXN0ZW1Hcm91cChzdGFmZkdyb3VwKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0RGlydHkoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyByZW1vdmVTdGFmZkdyb3VwKHN0YWZmR3JvdXA6IFNtb1N5c3RlbUdyb3VwKTpQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgndW5ncm91cCBzdGF2ZXMnKTtcclxuICAgIHRoaXMuc2NvcmUucmVtb3ZlU3lzdGVtR3JvdXAoc3RhZmZHcm91cCk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUucmVtb3ZlU3lzdGVtR3JvdXAoc3RhZmZHcm91cCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldERpcnR5KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgY2xlYXJTeXN0ZW1Hcm91cHMoKTogUHJvbWlzZTx2b2lkPntcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnY2xlYXIgc3RhZmYgZ3JvdXBzJyk7XHJcbiAgICB0aGlzLnNjb3JlLmNsZWFyU3lzdGVtR3JvdXBzKCk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuY2xlYXJTeXN0ZW1Hcm91cHMoKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0RGlydHkoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyB1cGRhdGVUYWJTdGF2ZSh0YWJTdGF2ZTogU21vVGFiU3RhdmUpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZXNCZXR3ZWVuKHRoaXMuc2NvcmUsIHRhYlN0YXZlLnN0YXJ0U2VsZWN0b3IsIHRhYlN0YXZlLmVuZFNlbGVjdG9yKTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIGlmIChzZWxlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl91bmRvU2VsZWN0aW9ucygndXBkYXRlVGFiU3RhdmUnLCBzZWxlY3Rpb25zKTtcclxuICAgIGNvbnN0IHN0YWZmOiBudW1iZXIgPSBzZWxlY3Rpb25zWzBdLnNlbGVjdG9yLnN0YWZmO1xyXG4gICAgY29uc3QgYWx0U3RhZmYgPSBhbHRTZWxlY3Rpb25zWzBdLnNlbGVjdG9yLnN0YWZmO1xyXG4gICAgY29uc3QgYWx0VGFiU3RhdmUgPSBuZXcgU21vVGFiU3RhdmUodGFiU3RhdmUuc2VyaWFsaXplKCkpO1xyXG4gICAgYWx0VGFiU3RhdmUuc3RhcnRTZWxlY3Rvci5zdGFmZiA9IGFsdFN0YWZmO1xyXG4gICAgYWx0VGFiU3RhdmUuZW5kU2VsZWN0b3Iuc3RhZmYgPSBhbHRTdGFmZjtcclxuICAgIGFsdFRhYlN0YXZlLmF0dHJzLmlkID0gdGFiU3RhdmUuYXR0cnMuaWQ7XHJcbiAgICB0aGlzLnNjb3JlLnN0YXZlc1tzdGFmZl0udXBkYXRlVGFiU3RhdmUodGFiU3RhdmUpO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1thbHRTdGFmZl0udXBkYXRlVGFiU3RhdmUoYWx0VGFiU3RhdmUpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdCh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucykpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHJlbW92ZVRhYlN0YXZlKCkge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9ucyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpO1xyXG4gICAgaWYgKHNlbGVjdGlvbnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3VuZG9TZWxlY3Rpb25zKCd1cGRhdGVUYWJTdGF2ZScsIHNlbGVjdGlvbnMpO1xyXG4gICAgY29uc3Qgc3RhdmVzVG9SZW1vdmU6IFNtb1RhYlN0YXZlW10gPSBbXTtcclxuICAgIGNvbnN0IGFsdFN0YXZlc1RvUmVtb3ZlOiBTbW9UYWJTdGF2ZVtdID0gW107XHJcbiAgICBjb25zdCBhZGRlZDogUmVjb3JkPHN0cmluZywgU21vVGFiU3RhdmU+ID0ge307XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbCwgaXgpID0+IHtcclxuICAgICAgY29uc3QgYWx0U2VsID0gYWx0U2VsZWN0aW9uc1tpeF07XHJcbiAgICAgIGNvbnN0IHRhYlN0YXZlID0gc2VsLnN0YWZmLmdldFRhYlN0YXZlRm9yTWVhc3VyZShzZWwuc2VsZWN0b3IpO1xyXG4gICAgICBjb25zdCBhbHRUYWJTdGF2ZSA9IGFsdFNlbC5zdGFmZi5nZXRUYWJTdGF2ZUZvck1lYXN1cmUoYWx0U2VsLnNlbGVjdG9yKTtcclxuICAgICAgaWYgKHRhYlN0YXZlICYmIGFsdFRhYlN0YXZlKSB7XHJcbiAgICAgICAgaWYgKCFhZGRlZFt0YWJTdGF2ZS5hdHRycy5pZF0pIHtcclxuICAgICAgICAgIGFkZGVkW3RhYlN0YXZlLmF0dHJzLmlkXSA9IHRhYlN0YXZlO1xyXG4gICAgICAgICAgc3RhdmVzVG9SZW1vdmUucHVzaCh0YWJTdGF2ZSk7XHJcbiAgICAgICAgICBhbHRTdGF2ZXNUb1JlbW92ZS5wdXNoKGFsdFRhYlN0YXZlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgc2VsZWN0aW9uc1swXS5zdGFmZi5yZW1vdmVUYWJTdGF2ZXMoc3RhdmVzVG9SZW1vdmUpO1xyXG4gICAgYWx0U2VsZWN0aW9uc1swXS5zdGFmZi5yZW1vdmVUYWJTdGF2ZXMoYWx0U3RhdmVzVG9SZW1vdmUpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdCh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucykpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0ZW1wbyBmb3IgYWxsIG9yIHBhcnQgb2YgdGhlIHNjb3JlXHJcbiAgICogQHBhcmFtIG1lYXN1cmUgdGhlIG1lYXN1cmUgd2l0aCB0aGUgdGVtcG8uICBUZW1wbyBpcyBtZWFzdXJlLXdpZGUgcGFyYW1ldGVyXHJcbiAgICogQHBhcmFtIHNjb3JlTW9kZSBpZiB0cnVlLCB1cGRhdGUgd2hvbGUgc2NvcmUuICBFbHNlIHNlbGVjdGlvbnNcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVUZW1wb1Njb3JlKG1lYXN1cmU6IFNtb01lYXN1cmUsIHRlbXBvOiBTbW9UZW1wb1RleHQsIHNjb3JlTW9kZTogYm9vbGVhbiwgc2VsZWN0aW9uTW9kZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG1lYXN1cmVJbmRleCA9IDA7ICAgIFxyXG4gICAgY29uc3Qgb3JpZ2luYWxUZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQobWVhc3VyZS50ZW1wbyk7XHJcbiAgICB0aGlzLl91bmRvQ29sdW1uKCd1cGRhdGUgdGVtcG8nLCBtZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4KTtcclxuICAgIGxldCBzdGFydE1lYXN1cmUgPSBtZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4O1xyXG4gICAgbGV0IGVuZE1lYXN1cmUgPSB0aGlzLnNjb3JlLnN0YXZlc1swXS5tZWFzdXJlcy5sZW5ndGg7XHJcbiAgICBsZXQgZGlzcGxheWVkID0gZmFsc2U7XHJcbiAgICBpZiAoc2VsZWN0aW9uTW9kZSkge1xyXG4gICAgICBjb25zdCBlbmRTZWwgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKTtcclxuICAgICAgaWYgKGVuZFNlbC5zZWxlY3Rvci5tZWFzdXJlID4gc3RhcnRNZWFzdXJlKSB7XHJcbiAgICAgICAgZW5kTWVhc3VyZSA9IGVuZFNlbC5zZWxlY3Rvci5tZWFzdXJlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBJZiB3ZSBhcmUgb25seSBjaGFuZ2luZyB0aGUgcG9zaXRpb24gb2YgdGhlIHRleHQsIGl0IG9ubHkgYWZmZWN0cyB0aGUgdGVtcG8gbWVhc3VyZS5cclxuICAgIGlmIChTbW9UZW1wb1RleHQuZXEob3JpZ2luYWxUZW1wbywgdGVtcG8pICYmIHRlbXBvLnlPZmZzZXQgIT09IG9yaWdpbmFsVGVtcG8ueU9mZnNldCAmJiBlbmRNZWFzdXJlID4gc3RhcnRNZWFzdXJlKSB7XHJcbiAgICAgIGVuZE1lYXN1cmUgPSBzdGFydE1lYXN1cmUgKyAxOyAgICAgICAgICBcclxuICAgIH1cclxuICAgIGZvciAobWVhc3VyZUluZGV4ID0gc3RhcnRNZWFzdXJlOyBtZWFzdXJlSW5kZXggPCBlbmRNZWFzdXJlOyArK21lYXN1cmVJbmRleCkge1xyXG4gICAgICBpZiAoIXNjb3JlTW9kZSAmJiAhc2VsZWN0aW9uTW9kZSkge1xyXG4gICAgICAgIC8vIElmIG5vdCB3aG9sZSBzY29yZSBvciBzZWxlY3Rpb25zLCBjaGFuZ2UgdW50aWwgdGhlIHRlbXBvIGRvZXNuJ3QgbWF0Y2ggcHJldmlvdXMgbWVhc3VyZSdzIHRlbXBvIChuZXh0IHRlbXBvIGNoYW5nZSlcclxuICAgICAgICBjb25zdCBjb21wTWVhc3VyZSA9IHRoaXMuc2NvcmUuc3RhdmVzWzBdLm1lYXN1cmVzW21lYXN1cmVJbmRleF07XHJcbiAgICAgICAgaWYgKFNtb1RlbXBvVGV4dC5lcShvcmlnaW5hbFRlbXBvLCBjb21wTWVhc3VyZS50ZW1wbykgfHwgZGlzcGxheWVkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgY29uc3Qgc2VsID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zY29yZSwgMCwgbWVhc3VyZUluZGV4KTtcclxuICAgICAgICAgIGNvbnN0IGFsdFNlbCA9IFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc3RvcmVTY29yZSwgMCwgbWVhc3VyZUluZGV4KTtcclxuICAgICAgICAgIGlmIChzZWwgJiYgc2VsLm1lYXN1cmUudGVtcG8uZGlzcGxheSAmJiAhZGlzcGxheWVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUoc2VsKTtcclxuICAgICAgICAgICAgZGlzcGxheWVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICAgU21vT3BlcmF0aW9uLmFkZFRlbXBvKHRoaXMuc2NvcmUsIHNlbCwgdGVtcG8pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGFsdFNlbCkge1xyXG4gICAgICAgICAgICBTbW9PcGVyYXRpb24uYWRkVGVtcG8odGhpcy5zdG9yZVNjb3JlLCBhbHRTZWwsIHRlbXBvKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHNlbCA9IFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc2NvcmUsIDAsIG1lYXN1cmVJbmRleCk7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsID0gU21vU2VsZWN0aW9uLm1lYXN1cmVTZWxlY3Rpb24odGhpcy5zdG9yZVNjb3JlLCAwLCBtZWFzdXJlSW5kZXgpO1xyXG4gICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgIFNtb09wZXJhdGlvbi5hZGRUZW1wbyh0aGlzLnNjb3JlLCBzZWwsIHRlbXBvKTtcclxuICAgICAgICAgIGlmICghZGlzcGxheWVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUoc2VsKTtcclxuICAgICAgICAgICAgZGlzcGxheWVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsdFNlbCkge1xyXG4gICAgICAgICAgU21vT3BlcmF0aW9uLmFkZFRlbXBvKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsLCB0ZW1wbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgdXBkYXRlVGFiTm90ZSh0YWJOb3RlOiBTbW9UYWJOb3RlKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVzQmV0d2Vlbih0aGlzLnNjb3JlLCBcclxuICAgICAgdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpLnNlbGVjdG9yLCB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKS5zZWxlY3Rvcik7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb25zID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICB0aGlzLl91bmRvU2VsZWN0aW9ucygndXBkYXRlVGFiTm90ZScsIHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLnVwZGF0ZVRhYk5vdGUoc2VsZWN0aW9ucywgdGFiTm90ZSk7XHJcbiAgICBTbW9PcGVyYXRpb24udXBkYXRlVGFiTm90ZShhbHRTZWxlY3Rpb25zLCB0YWJOb3RlKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUoc2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgcmVtb3ZlVGFiTm90ZSgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZXNCZXR3ZWVuKHRoaXMuc2NvcmUsIFxyXG4gICAgICB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigtMSkuc2VsZWN0b3IsIHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKDEpLnNlbGVjdG9yKTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIHRoaXMuX3VuZG9TZWxlY3Rpb25zKCd1cGRhdGVUYWJOb3RlJywgc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24ucmVtb3ZlVGFiTm90ZShzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi5yZW1vdmVUYWJOb3RlKGFsdFNlbGVjdGlvbnMpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRUb1JlcGxhY2VRdWV1ZShzZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiAncmVtb3ZlJyB0ZW1wbywgd2hpY2ggbWVhbnMgZWl0aGVyIHNldHRpbmcgdGhlIGJhcnMgdG8gdGhlIFxyXG4gICAqIGRlZmF1bHQgdGVtcG8sIG9yIHRoZSBwcmV2aW91c2x5LXNldCB0ZW1wby5cclxuICAgKiBAcGFyYW0gc2NvcmVNb2RlIHdoZXRoZXIgdG8gcmVzZXQgZW50aXJlIHNjb3JlXHJcbiAgICovXHJcbiAgYXN5bmMgcmVtb3ZlVGVtcG8obWVhc3VyZTogU21vTWVhc3VyZSwgdGVtcG86IFNtb1RlbXBvVGV4dCwgc2NvcmVNb2RlOiBib29sZWFuLCBzZWxlY3Rpb25Nb2RlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzdGFydFNlbGVjdGlvbiA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdO1xyXG4gICAgaWYgKHN0YXJ0U2VsZWN0aW9uLnNlbGVjdG9yLm1lYXN1cmUgPiAwKSB7XHJcbiAgICAgIGNvbnN0IG1lYXN1cmVJeCA9IHN0YXJ0U2VsZWN0aW9uLnNlbGVjdG9yLm1lYXN1cmUgLSAxO1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBzdGFydFNlbGVjdGlvbi5zdGFmZi5tZWFzdXJlc1ttZWFzdXJlSXhdO1xyXG4gICAgICBjb25zdCB0ZW1wbyA9IHRhcmdldC5nZXRUZW1wbygpO1xyXG4gICAgICBjb25zdCBuZXdUZW1wbyA9IG5ldyBTbW9UZW1wb1RleHQodGVtcG8pO1xyXG4gICAgICBuZXdUZW1wby5kaXNwbGF5ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudXBkYXRlVGVtcG9TY29yZShtZWFzdXJlLCBuZXdUZW1wbywgc2NvcmVNb2RlLCBzZWxlY3Rpb25Nb2RlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudXBkYXRlVGVtcG9TY29yZShtZWFzdXJlLCBuZXcgU21vVGVtcG9UZXh0KFNtb1RlbXBvVGV4dC5kZWZhdWx0cyksIHNjb3JlTW9kZSwgc2VsZWN0aW9uTW9kZSk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWRkIGEgZ3JhY2Ugbm90ZSB0byB0aGUgc2VsZWN0ZWQgcmVhbCBub3Rlcy5cclxuICAgKi9cclxuICBhc3luYyBhZGRHcmFjZU5vdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnYWRkIGdyYWNlIG5vdGUnKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0aW9uLm5vdGUhLmdldEdyYWNlTm90ZXMoKS5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IHBpdGNoZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNlbGVjdGlvbi5ub3RlIS5waXRjaGVzKSk7XHJcbiAgICAgIGNvbnN0IGdyYWNlID0gbmV3IFNtb0dyYWNlTm90ZSh7XHJcbiAgICAgICAgcGl0Y2hlcywgdGlja3M6XHJcbiAgICAgICAgICB7IG51bWVyYXRvcjogMjA0OCwgZGVub21pbmF0b3I6IDEsIHJlbWFpbmRlcjogMCB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBTbW9PcGVyYXRpb24uYWRkR3JhY2VOb3RlKHNlbGVjdGlvbiwgZ3JhY2UsIGluZGV4KTtcclxuXHJcbiAgICAgIGNvbnN0IGFsdFBpdGNoZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNlbGVjdGlvbi5ub3RlIS5waXRjaGVzKSk7XHJcbiAgICAgIGNvbnN0IGFsdEdyYWNlID0gbmV3IFNtb0dyYWNlTm90ZSh7XHJcbiAgICAgICAgcGl0Y2hlczogYWx0UGl0Y2hlcywgdGlja3M6XHJcbiAgICAgICAgICB7IG51bWVyYXRvcjogMjA0OCwgZGVub21pbmF0b3I6IDEsIHJlbWFpbmRlcjogMCB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBhbHRHcmFjZS5hdHRycy5pZCA9IGdyYWNlLmF0dHJzLmlkO1xyXG4gICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5hZGRHcmFjZU5vdGUoYWx0U2VsZWN0aW9uISwgYWx0R3JhY2UsIGluZGV4KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogcmVtb3ZlIHNlbGVjdGVkIGdyYWNlIG5vdGVcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZUdyYWNlTm90ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdyZW1vdmUgZ3JhY2Ugbm90ZScpO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgLy8gVE9ETzogZ2V0IHRoZSBjb3JyZWN0IG9mZnNldFxyXG4gICAgICBTbW9PcGVyYXRpb24ucmVtb3ZlR3JhY2VOb3RlKHNlbGVjdGlvbiwgMCk7XHJcbiAgICAgIGNvbnN0IGFsdFNlbCA9ICh0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbikpO1xyXG4gICAgICBTbW9PcGVyYXRpb24ucmVtb3ZlR3JhY2VOb3RlKGFsdFNlbCEsIDApO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSBzbGFzaCBpbiBzdGVtIG9mIGdyYWNlIG5vdGVcclxuICAgKi9cclxuICBhc3luYyBzbGFzaEdyYWNlTm90ZXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBncmFjZSA9IHRoaXMudHJhY2tlci5nZXRTZWxlY3RlZEdyYWNlTm90ZXMoKTtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdzbGFzaCBncmFjZSBub3RlIHRvZ2dsZScpO1xyXG4gICAgZ3JhY2UuZm9yRWFjaCgoZ24pID0+IHtcclxuICAgICAgU21vT3BlcmF0aW9uLnNsYXNoR3JhY2VOb3Rlcyhnbik7XHJcbiAgICAgIGlmIChnbi5zZWxlY3Rpb24gIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGduLnNlbGVjdGlvbik7XHJcbiAgICAgICAgY29uc3QgYWx0R24gPSB0aGlzLl9nZXRFcXVpdmFsZW50R3JhY2VOb3RlKGFsdFNlbGVjdGlvbiEsIGduLm1vZGlmaWVyIGFzIFNtb0dyYWNlTm90ZSk7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnNsYXNoR3JhY2VOb3Rlcyh7XHJcbiAgICAgICAgICBzZWxlY3Rpb246IGFsdFNlbGVjdGlvbiwgbW9kaWZpZXI6IGFsdEduIGFzIGFueSxcclxuICAgICAgICAgIGJveDogU3ZnQm94LmRlZmF1bHQsIGluZGV4OiAwXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyB0cmFuc3Bvc2VTY29yZShvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCd0cmFuc3Bvc2Ugc2NvcmUnKTtcclxuICAgIFNtb09wZXJhdGlvbi50cmFuc3Bvc2VTY29yZSh0aGlzLnNjb3JlLCBvZmZzZXQpO1xyXG4gICAgU21vT3BlcmF0aW9uLnRyYW5zcG9zZVNjb3JlKHRoaXMuc3RvcmVTY29yZSwgb2Zmc2V0KTtcclxuICAgIHRoaXMucmVuZGVyZXIucmVyZW5kZXJBbGwoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiB0cmFuc3Bvc2Ugc2VsZWN0ZWQgbm90ZXNcclxuICAgKiBAcGFyYW0gb2Zmc2V0IDEvMiBzdGVwc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHRyYW5zcG9zZVNlbGVjdGlvbnMob2Zmc2V0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCd0cmFuc3Bvc2UnKTtcclxuICAgIGNvbnN0IGdyYWNlID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkR3JhY2VOb3RlcygpO1xyXG4gICAgaWYgKGdyYWNlLmxlbmd0aCkge1xyXG4gICAgICBncmFjZS5mb3JFYWNoKChhcnRpZmFjdCkgPT4ge1xyXG4gICAgICAgIGlmIChhcnRpZmFjdC5zZWxlY3Rpb24gIT09IG51bGwgJiYgYXJ0aWZhY3Quc2VsZWN0aW9uLm5vdGUgIT09IG51bGwpIHtcclxuICAgICAgICAgIGNvbnN0IGduMSA9IGFydGlmYWN0Lm1vZGlmaWVyIGFzIFNtb0dyYWNlTm90ZTtcclxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gYXJ0aWZhY3Quc2VsZWN0aW9uLm5vdGUuZ3JhY2VOb3Rlcy5maW5kSW5kZXgoKHgpID0+IHguYXR0cnMuaWQgPT09IGduMS5hdHRycy5pZCk7XHJcbiAgICAgICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGFydGlmYWN0LnNlbGVjdGlvbik7XHJcbiAgICAgICAgICBpZiAoYWx0U2VsZWN0aW9uICYmIGFsdFNlbGVjdGlvbi5ub3RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGduMiA9IGFsdFNlbGVjdGlvbi5ub3RlLmdyYWNlTm90ZXNbaW5kZXhdO1xyXG4gICAgICAgICAgICBTbW9PcGVyYXRpb24udHJhbnNwb3NlR3JhY2VOb3RlcyhhbHRTZWxlY3Rpb24hLCBbZ24yXSwgb2Zmc2V0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIFNtb09wZXJhdGlvbi50cmFuc3Bvc2VHcmFjZU5vdGVzKGFydGlmYWN0LnNlbGVjdGlvbiwgW2duMV0sIG9mZnNldCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgaXNQZXJjdXNzaW9uID0gZmFsc2U7XHJcbiAgICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0ZWQpID0+IHtcclxuICAgICAgICBTbW9PcGVyYXRpb24udHJhbnNwb3NlKHNlbGVjdGVkLCBvZmZzZXQpO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZC5zdGFmZi5nZXRTdGFmZkluc3RydW1lbnQoc2VsZWN0ZWQuc2VsZWN0b3IubWVhc3VyZSkuaXNQZXJjdXNzaW9uKSB7XHJcbiAgICAgICAgICBpc1BlcmN1c3Npb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGVkKTtcclxuICAgICAgICBTbW9PcGVyYXRpb24udHJhbnNwb3NlKGFsdFNlbCEsIG9mZnNldCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICAvLyBpZiB0aGlzIGlzIHBlcmN1c3Npb24sIHNldCB0aGF0IHByb3BlcnR5XHJcbiAgICAgIGlmIChpc1BlcmN1c3Npb24pIHtcclxuICAgICAgICB0aGlzLnNjb3JlLnNldE5vdGVJbnN0cnVtZW50UHJvcGVydGllcygpO1xyXG4gICAgICAgIHRoaXMuc3RvcmVTY29yZS5zZXROb3RlSW5zdHJ1bWVudFByb3BlcnRpZXMoKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWxlY3Rpb25zLmxlbmd0aCA9PT0gMSAmJiB0aGlzLnNjb3JlLnByZWZlcmVuY2VzLmF1dG9QbGF5KSB7XHJcbiAgICAgICAgU3VpT3NjaWxsYXRvci5wbGF5U2VsZWN0aW9uTm93KHNlbGVjdGlvbnNbMF0sIHRoaXMuc2NvcmUsIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHRvZ2dsZSB0aGUgYWNjaWRlbnRhbCBzcGVsbGluZyBvZiB0aGUgc2VsZWN0ZWQgbm90ZXNcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGFzeW5jIHRvZ2dsZUVuaGFybW9uaWMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygndG9nZ2xlIGVuaGFybW9uaWMnKTtcclxuICAgIGNvbnN0IGdyYWNlID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkR3JhY2VOb3RlcygpO1xyXG4gICAgaWYgKGdyYWNlLmxlbmd0aCkge1xyXG4gICAgICBncmFjZS5mb3JFYWNoKChhcnRpZmFjdCkgPT4ge1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVHcmFjZU5vdGVFbmhhcm1vbmljKGFydGlmYWN0LnNlbGVjdGlvbiEsIFthcnRpZmFjdC5tb2RpZmllciBhcyBTbW9HcmFjZU5vdGVdKTtcclxuICAgICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGFydGlmYWN0LnNlbGVjdGlvbiEpO1xyXG4gICAgICAgIGNvbnN0IGFsdEdyID0gdGhpcy5fZ2V0RXF1aXZhbGVudEdyYWNlTm90ZShhbHRTZWxlY3Rpb24hLCBhcnRpZmFjdC5tb2RpZmllciBhcyBTbW9HcmFjZU5vdGUpO1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVHcmFjZU5vdGVFbmhhcm1vbmljKGFsdFNlbGVjdGlvbiEsXHJcbiAgICAgICAgICBbYWx0R3JdKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGVkKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiAoc2VsZWN0ZWQuc2VsZWN0b3IucGl0Y2hlcykgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICBzZWxlY3RlZC5zZWxlY3Rvci5waXRjaGVzID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVFbmhhcm1vbmljKHNlbGVjdGVkKTtcclxuICAgICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGVkKTtcclxuICAgICAgICBTbW9PcGVyYXRpb24udG9nZ2xlRW5oYXJtb25pYyhhbHRTZWwhKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUb2dnbGUgY2F1dGlvbmFyeS9jb3VydGVzeSBhY2NpZGVudGFsc1xyXG4gICAqL1xyXG4gIGFzeW5jIHRvZ2dsZUNvdXJ0ZXN5QWNjaWRlbnRhbHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygndG9nZ2xlIGNvdXJ0ZXN5IGFjY2lkZW50YWwnKTtcclxuICAgIGNvbnN0IGdyYWNlID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkR3JhY2VOb3RlcygpO1xyXG4gICAgaWYgKGdyYWNlLmxlbmd0aCkge1xyXG4gICAgICBncmFjZS5mb3JFYWNoKChhcnRpZmFjdCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGduMSA9IFthcnRpZmFjdC5tb2RpZmllcl0gYXMgU21vR3JhY2VOb3RlW107XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZUdyYWNlTm90ZUNvdXJ0ZXN5KGFydGlmYWN0LnNlbGVjdGlvbiwgZ24xKTtcclxuICAgICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGFydGlmYWN0LnNlbGVjdGlvbiEpO1xyXG4gICAgICAgIGNvbnN0IGduMiA9IHRoaXMuX2dldEVxdWl2YWxlbnRHcmFjZU5vdGUoYWx0U2VsISwgZ24xWzBdKTtcclxuICAgICAgICBTbW9PcGVyYXRpb24udG9nZ2xlR3JhY2VOb3RlQ291cnRlc3koYWx0U2VsISwgW2duMl0pO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZUNvdXJ0ZXN5QWNjaWRlbnRhbChzZWxlY3Rpb24pO1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgICBTbW9PcGVyYXRpb24udG9nZ2xlQ291cnRlc3lBY2NpZGVudGFsKGFsdFNlbCEpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNoYW5nZSB0aGUgZHVyYXRpb24gb2Ygbm90ZXMgZm9yIHNlbGVjdGVkLCBjcmVhdGluZyBtb3JlIFxyXG4gICAqIG9yIGZld2VyIG5vdGVzLiBcclxuICAgKiBBZnRlciB0aGUgY2hhbmdlLCByZXNldCB0aGUgc2VsZWN0aW9uIHNvIGl0J3MgYXMgY2xvc2UgYXMgcG9zc2libGUgXHJcbiAgICogdG8gdGhlIG9yaWdpbmFsIGxlbmd0aFxyXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgYmF0Y2hEdXJhdGlvbk9wZXJhdGlvbihvcGVyYXRpb246IEJhdGNoU2VsZWN0aW9uT3BlcmF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnY2hhbmdlIGR1cmF0aW9uJyk7XHJcbiAgICBjb25zdCBncmFjZSA9IHRoaXMudHJhY2tlci5nZXRTZWxlY3RlZEdyYWNlTm90ZXMoKTtcclxuICAgIGNvbnN0IGdyYWNlTWFwOiBSZWNvcmQ8c3RyaW5nLCBCYXRjaFNlbGVjdGlvbk9wZXJhdGlvbj4gPSB7XHJcbiAgICAgIGRvdWJsZUR1cmF0aW9uOiAnZG91YmxlR3JhY2VOb3RlRHVyYXRpb24nLFxyXG4gICAgICBoYWx2ZUR1cmF0aW9uOiAnaGFsdmVHcmFjZU5vdGVEdXJhdGlvbidcclxuICAgIH07XHJcbiAgICBpZiAoZ3JhY2UubGVuZ3RoICYmIHR5cGVvZiAoZ3JhY2VNYXBbb3BlcmF0aW9uXSkgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIG9wZXJhdGlvbiA9IGdyYWNlTWFwW29wZXJhdGlvbl07XHJcbiAgICAgIGdyYWNlLmZvckVhY2goKGFydGlmYWN0KSA9PiB7XHJcbiAgICAgICAgKFNtb09wZXJhdGlvbiBhcyBhbnkpW29wZXJhdGlvbl0oYXJ0aWZhY3Quc2VsZWN0aW9uLCBhcnRpZmFjdC5tb2RpZmllcik7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihhcnRpZmFjdC5zZWxlY3Rpb24hKTtcclxuICAgICAgICBjb25zdCBnbjIgPSB0aGlzLl9nZXRFcXVpdmFsZW50R3JhY2VOb3RlKGFsdFNlbGVjdGlvbiEsIGFydGlmYWN0Lm1vZGlmaWVyIGFzIFNtb0dyYWNlTm90ZSk7XHJcbiAgICAgICAgKFNtb09wZXJhdGlvbiBhcyBhbnkpW29wZXJhdGlvbl0oYWx0U2VsZWN0aW9uISwgZ24yKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBhbHRBciA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpO1xyXG4gICAgICBTbW9PcGVyYXRpb24uYmF0Y2hTZWxlY3Rpb25PcGVyYXRpb24odGhpcy5zY29yZSwgc2VsZWN0aW9ucywgb3BlcmF0aW9uKTtcclxuICAgICAgU21vT3BlcmF0aW9uLmJhdGNoU2VsZWN0aW9uT3BlcmF0aW9uKHRoaXMuc3RvcmVTY29yZSwgYWx0QXIsIG9wZXJhdGlvbik7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSBzZWxlY3RlZCBtb2RpZmllciBvbiBzZWxlY3RlZCBub3Rlc1xyXG4gICAqIEBwYXJhbSBtb2RpZmllciBcclxuICAgKiBAcGFyYW0gY3RvciBwYXJlbnQgY2xhc3MgY29uc3RydWN0b3IgKGUuZy4gU21vT3JuYW1lbnQpXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdG9nZ2xlQXJ0aWN1bGF0aW9uKG1vZGlmaWVyOiBzdHJpbmcsIGN0b3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3RvZ2dsZSBhcnRpY3VsYXRpb24nKTtcclxuICAgIHRoaXMudHJhY2tlci5zZWxlY3Rpb25zLmZvckVhY2goKHNlbCkgPT4ge1xyXG4gICAgICBpZiAoY3RvciA9PT0gJ1Ntb0FydGljdWxhdGlvbicpIHtcclxuICAgICAgICBjb25zdCBhYSA9IG5ldyBTbW9BcnRpY3VsYXRpb24oeyBhcnRpY3VsYXRpb246IG1vZGlmaWVyIH0pO1xyXG4gICAgICAgIGNvbnN0IGFsdEFhID0gbmV3IFNtb0FydGljdWxhdGlvbih7IGFydGljdWxhdGlvbjogbW9kaWZpZXIgfSk7XHJcbiAgICAgICAgYWx0QWEuYXR0cnMuaWQgPSBhYS5hdHRycy5pZDtcclxuICAgICAgICBpZiAoc2VsLm5vdGUpIHtcclxuICAgICAgICAgIHNlbC5ub3RlLnRvZ2dsZUFydGljdWxhdGlvbihhYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuICAgICAgICBpZiAoYWx0U2VsZWN0aW9uICYmIGFsdFNlbGVjdGlvbi5ub3RlKSB7XHJcbiAgICAgICAgICBhbHRTZWxlY3Rpb24ubm90ZS50b2dnbGVBcnRpY3VsYXRpb24oYWx0QWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBhYSA9IG5ldyBTbW9Pcm5hbWVudCh7IG9ybmFtZW50OiBtb2RpZmllciB9KTtcclxuICAgICAgICBjb25zdCBhbHRBYSA9IG5ldyBTbW9Pcm5hbWVudCh7IG9ybmFtZW50OiBtb2RpZmllciB9KTtcclxuICAgICAgICBhbHRBYS5hdHRycy5pZCA9IGFhLmF0dHJzLmlkO1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsISk7XHJcbiAgICAgICAgaWYgKHNlbC5ub3RlKSB7XHJcbiAgICAgICAgICBzZWwubm90ZS50b2dnbGVPcm5hbWVudChhYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhbHRTZWxlY3Rpb24gJiYgYWx0U2VsZWN0aW9uLm5vdGUpIHtcclxuICAgICAgICAgIGFsdFNlbGVjdGlvbi5ub3RlLnRvZ2dsZU9ybmFtZW50KGFsdEFhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyBzZXRBcnRpY3VsYXRpb24obW9kaWZpZXI6IFNtb0FydGljdWxhdGlvbiwgc2V0OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnc2V0IGFydGljdWxhdGlvbicpO1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsKSA9PiB7XHJcbiAgICAgIGNvbnN0IGFsdEFhID0gbmV3IFNtb0FydGljdWxhdGlvbihtb2RpZmllcik7XHJcbiAgICAgIGlmIChzZWwubm90ZSkge1xyXG4gICAgICAgIHNlbC5ub3RlLnNldEFydGljdWxhdGlvbihtb2RpZmllciwgc2V0KTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbCk7XHJcbiAgICAgIGlmIChhbHRTZWxlY3Rpb24gJiYgYWx0U2VsZWN0aW9uLm5vdGUpIHtcclxuICAgICAgICBhbHRTZWxlY3Rpb24ubm90ZS50b2dnbGVBcnRpY3VsYXRpb24oYWx0QWEpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTsgICAgXHJcbiAgfVxyXG4gIGFzeW5jIHNldE9ybmFtZW50KG1vZGlmaWVyOiBTbW9Pcm5hbWVudCwgc2V0OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnc2V0IGFydGljdWxhdGlvbicpO1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsKSA9PiB7XHJcbiAgICAgIGNvbnN0IGFsdEFhID0gbmV3IFNtb09ybmFtZW50KG1vZGlmaWVyKTtcclxuICAgICAgaWYgKHNlbC5ub3RlKSB7XHJcbiAgICAgICAgc2VsLm5vdGUuc2V0T3JuYW1lbnQobW9kaWZpZXIsIHNldCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwpO1xyXG4gICAgICBpZiAoYWx0U2VsZWN0aW9uICYmIGFsdFNlbGVjdGlvbi5ub3RlKSB7XHJcbiAgICAgICAgYWx0U2VsZWN0aW9uLm5vdGUuc2V0T3JuYW1lbnQoYWx0QWEsIHNldCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpOyAgICBcclxuICB9XHJcbiAgLyoqXHJcbiAgICogY29udmVydCBub24tdHVwbGV0IG5vdCB0byBhIHR1cGxldFxyXG4gICAqIEBwYXJhbSBwYXJhbXNcclxuICAgKi9cclxuICBhc3luYyBtYWtlVHVwbGV0KHBhcmFtczogTWFrZVR1cGxldE9wZXJhdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnNbMF07XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnbWFrZSB0dXBsZXQnKTtcclxuICAgIFNtb09wZXJhdGlvbi5tYWtlVHVwbGV0KHNlbGVjdGlvbiwgcGFyYW1zKTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uISk7XHJcbiAgICBTbW9PcGVyYXRpb24ubWFrZVR1cGxldChhbHRTZWxlY3Rpb24hLCBwYXJhbXMpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb252ZXJ0IHNlbGVjdGVkIHR1cGxldCB0byBhIHNpbmdsZSAoaWYgcG9zc2libGUpIG5vbi10dXBsZXRcclxuICAgKi9cclxuICBhc3luYyB1bm1ha2VUdXBsZXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1swXTtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCd1bm1ha2UgdHVwbGV0Jyk7XHJcbiAgICBTbW9PcGVyYXRpb24udW5tYWtlVHVwbGV0KHNlbGVjdGlvbik7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICBTbW9PcGVyYXRpb24udW5tYWtlVHVwbGV0KGFsdFNlbGVjdGlvbiEpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgY2hvcmQgYnkgYWRkaW5nIGFuIGludGVydmFsIHRvIHNlbGVjdGVkIG5vdGVcclxuICAgKiBAcGFyYW0gaW50ZXJ2YWwgMS8yIHN0ZXBzXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0SW50ZXJ2YWwoaW50ZXJ2YWw6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3NldCBpbnRlcnZhbCcpO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3RlZCkgPT4ge1xyXG4gICAgICBTbW9PcGVyYXRpb24uaW50ZXJ2YWwoc2VsZWN0ZWQsIGludGVydmFsKTtcclxuICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3RlZCk7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5pbnRlcnZhbChhbHRTZWxlY3Rpb24hLCBpbnRlcnZhbCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNoYW5nZSB0aGUgc2VsZWN0ZWQgY2hvcmQgaW50byBhIHNpbmdsZSBub3RlXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyBjb2xsYXBzZUNob3JkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ2NvbGxhcHNlIGNob3JkJyk7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGVkKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5vdGU6IFNtb05vdGUgfCBudWxsID0gc2VsZWN0ZWQubm90ZTtcclxuICAgICAgaWYgKG5vdGUpIHtcclxuICAgICAgICBjb25zdCBwcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobm90ZS5waXRjaGVzWzBdKSk7XHJcbiAgICAgICAgY29uc3QgYWx0cHAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG5vdGUucGl0Y2hlc1swXSkpO1xyXG4gICAgICAgIC8vIE5vIG9wZXJhdGlvbiBmb3IgdGhpcz9cclxuICAgICAgICBub3RlLnBpdGNoZXMgPSBbcHBdO1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0ZWQpO1xyXG4gICAgICAgIGFsdFNlbGVjdGlvbiEubm90ZSEucGl0Y2hlcyA9IFthbHRwcF07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBUb2dnbGUgY2hpY2tlbi1zY3JhdGNoZXMsIGZvciBqYXp6IGltcHJvdiwgY29tcGluZyBldGMuXHJcbiAgICovXHJcbiAgYXN5bmMgdG9nZ2xlU2xhc2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnbWFrZSBzbGFzaCcpO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZVNsYXNoKHNlbGVjdGlvbik7XHJcbiAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZVNsYXNoKGFsdFNlbCEpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIG1ha2Ugc2VsZWN0ZWQgbm90ZXMgaW50byBhIHJlc3QsIG9yIHZpc2EtdmVyc2FcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGFzeW5jIG1ha2VSZXN0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ21ha2UgcmVzdCcpO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZVJlc3Qoc2VsZWN0aW9uKTtcclxuICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICBTbW9PcGVyYXRpb24udG9nZ2xlUmVzdChhbHRTZWwhKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyBjbGVhckFsbEJlYW1zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdjbGVhckFsbEJlYW1zJyk7XHJcbiAgICBTbW9PcGVyYXRpb24uY2xlYXJBbGxCZWFtR3JvdXBzKHRoaXMuc2NvcmUpO1xyXG4gICAgU21vT3BlcmF0aW9uLmNsZWFyQWxsQmVhbUdyb3Vwcyh0aGlzLnN0b3JlU2NvcmUpO1xyXG4gICAgYXdhaXQgdGhpcy5hd2FpdFJlbmRlcigpO1xyXG4gIH1cclxuICBhc3luYyBjbGVhclNlbGVjdGVkQmVhbXMoKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlcyA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdChzZWxlY3Rpb25zKTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi5jbGVhckJlYW1Hcm91cHModGhpcy5zY29yZSwgc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24uY2xlYXJCZWFtR3JvdXBzKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsZWN0aW9ucyk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZXMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHRvZ2dsZSB0aGUgJ2VuZCBiZWFtJyBmbGFnIGZvciBzZWxlY3RlZCBub3Rlc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHVuYmVhbVNlbGVjdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygndG9nZ2xlIGJlYW0gZ3JvdXAnKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi51bmJlYW1TZWxlY3Rpb25zKHNlbGVjdGlvbik7XHJcbiAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnVuYmVhbVNlbGVjdGlvbnMoYWx0U2VsISk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgdG9nZ2xlQ3VlKCkge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3RvZ2dsZSBub3RlIGN1ZScpO1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgaWYgKHNlbGVjdGlvbi5ub3RlICYmIHNlbGVjdGlvbi5ub3RlLmlzUmVzdCgpID09PSBmYWxzZSkge1xyXG4gICAgICAgIHNlbGVjdGlvbi5ub3RlLmlzQ3VlID0gIXNlbGVjdGlvbi5ub3RlLmlzQ3VlO1xyXG4gICAgICAgIGlmIChhbHRTZWxlY3Rpb24gJiYgYWx0U2VsZWN0aW9uLm5vdGUpIHtcclxuICAgICAgICAgIGFsdFNlbGVjdGlvbi5ub3RlLmlzQ3VlID0gc2VsZWN0aW9uLm5vdGUuaXNDdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgKiB1cCBvciBkb3duXHJcbiAgKiBAcmV0dXJucyBcclxuICAqL1xyXG4gIGFzeW5jIHRvZ2dsZUJlYW1EaXJlY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBpZiAoc2VsZWN0aW9ucy5sZW5ndGggPCAxKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlSGVscGVycy5lbXB0eVByb21pc2UoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCd0b2dnbGUgYmVhbSBkaXJlY3Rpb24nKTtcclxuICAgIFNtb09wZXJhdGlvbi50b2dnbGVCZWFtRGlyZWN0aW9uKHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLnRvZ2dsZUJlYW1EaXJlY3Rpb24odGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9ucykpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgdGhlIHNlbGVjdGVkIG5vdGVzIHRvIGEgYmVhbSBncm91cFxyXG4gICAqL1xyXG4gIGFzeW5jIGJlYW1TZWxlY3Rpb25zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ2JlYW0gc2VsZWN0aW9ucycpO1xyXG4gICAgU21vT3BlcmF0aW9uLmJlYW1TZWxlY3Rpb25zKHRoaXMuc2NvcmUsIHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLmJlYW1TZWxlY3Rpb25zKHRoaXMuc3RvcmVTY29yZSwgdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9ucykpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBjaGFuZ2Uga2V5IHNpZ25hdHVyZSBmb3Igc2VsZWN0ZWQgbWVhc3VyZXNcclxuICAgKiBAcGFyYW0ga2V5U2lnbmF0dXJlIHZleCBrZXkgc2lnbmF0dXJlXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkS2V5U2lnbmF0dXJlKGtleVNpZ25hdHVyZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnc2V0IGtleSBzaWduYXR1cmUgJyArIGtleVNpZ25hdHVyZSk7XHJcbiAgICBtZWFzdXJlU2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgU21vT3BlcmF0aW9uLmFkZEtleVNpZ25hdHVyZSh0aGlzLnNjb3JlLCBzZWwsIGtleVNpZ25hdHVyZSk7XHJcbiAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuICAgICAgU21vT3BlcmF0aW9uLmFkZEtleVNpZ25hdHVyZSh0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbCEsIGtleVNpZ25hdHVyZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyBhIHBpdGNoIGZyb20gdGhlIHBpYW5vIHdpZGdldC5cclxuICAgKiBAcGFyYW0gcGl0Y2gge1BpdGNofVxyXG4gICAqIEBwYXJhbSBjaG9yZFBlZGFsIHtib29sZWFufSAtIGluZGljYXRlcyB3ZSBhcmUgYWRkaW5nIHRvIGEgY2hvcmRcclxuICAgKi9cclxuICBhc3luYyBzZXRQaXRjaFBpYW5vKHBpdGNoOiBQaXRjaCwgY2hvcmRQZWRhbDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoXHJcbiAgICAgICdzZXRBYnNvbHV0ZVBpdGNoICcgKyBwaXRjaC5sZXR0ZXIgKyAnLycgKyBwaXRjaC5hY2NpZGVudGFsKTtcclxuICAgIHRoaXMudHJhY2tlci5zZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGVkKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5waXRjaDogUGl0Y2ggPSB7XHJcbiAgICAgICAgbGV0dGVyOiBwaXRjaC5sZXR0ZXIsXHJcbiAgICAgICAgYWNjaWRlbnRhbDogcGl0Y2guYWNjaWRlbnRhbCwgb2N0YXZlOiBwaXRjaC5vY3RhdmVcclxuICAgICAgfTtcclxuICAgICAgY29uc3Qgb2N0YXZlID0gU21vTWVhc3VyZS5kZWZhdWx0UGl0Y2hGb3JDbGVmW3NlbGVjdGVkLm1lYXN1cmUuY2xlZl0ub2N0YXZlO1xyXG4gICAgICBucGl0Y2gub2N0YXZlICs9IG9jdGF2ZTtcclxuICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3RlZCk7XHJcbiAgICAgIGlmIChjaG9yZFBlZGFsICYmIHNlbGVjdGVkLm5vdGUpIHtcclxuICAgICAgICBzZWxlY3RlZC5ub3RlLnRvZ2dsZUFkZFBpdGNoKG5waXRjaCk7XHJcbiAgICAgICAgYWx0U2VsIS5ub3RlIS50b2dnbGVBZGRQaXRjaChucGl0Y2gpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi5zZXRQaXRjaChzZWxlY3RlZCwgW25waXRjaF0pO1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi5zZXRQaXRjaChhbHRTZWwhLCBbbnBpdGNoXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBzaG93IG9yIGhpZGUgdGhlIHBpYW5vIHdpZGdldFxyXG4gICAqIEBwYXJhbSB2YWx1ZSB0byBzaG93IGl0XHJcbiAgICovXHJcbiAgYXN5bmMgc2hvd1BpYW5vKHZhbHVlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnNjb3JlLnByZWZlcmVuY2VzLnNob3dQaWFubyA9IHZhbHVlO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnByZWZlcmVuY2VzLnNob3dQaWFubyA9IHZhbHVlO1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIFN1aVBpYW5vLnNob3dQaWFubygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgU3VpUGlhbm8uaGlkZVBpYW5vKCk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVuZGVyIGEgcGl0Y2ggZm9yIGVhY2ggbGV0dGVyIG5hbWUtcGl0Y2ggaW4gdGhlIHN0cmluZyxcclxuICAgKiBAcGFyYW0gcGl0Y2hlcyBsZXR0ZXIgbmFtZXMgZm9yIHBpdGNoZXNcclxuICAgKiBAcmV0dXJucyBwcm9taXNlLCByZXNvbHZlZCB3aGVuIGFsbCBwaXRjaGVzIHJlbmRlcmVkXHJcbiAgICogQHNlZSBzZXRQaXRjaFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldFBpdGNoZXNQcm9taXNlKHBpdGNoZXM6IFBpdGNoTGV0dGVyW10pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBmYyA9IGFzeW5jIChpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgaWYgKGluZGV4ID49IHBpdGNoZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGF3YWl0IHNlbGYuc2V0UGl0Y2gocGl0Y2hlc1tpbmRleF0pO1xyXG4gICAgICAgICAgZmMoaW5kZXggKyAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIGZjKDApO1xyXG4gICAgfSk7XHJcbiAgICBhd2FpdCBwcm9taXNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIGEgcGl0Y2ggdG8gdGhlIHNjb3JlIGF0IHRoZSBjdXJzb3IuICBUaGlzIHRyaWVzIHRvIGZpbmQgdGhlIGJlc3QgcGl0Y2hcclxuICAgKiB0byBtYXRjaCB0aGUgbGV0dGVyIGtleSAoRiB2cyBGIyBmb3IgaW5zdGFuY2UpIGJhc2VkIG9uIGtleSBhbmQgc3Vycm91bmRpbmcgbm90ZXNcclxuICAgKiBAcGFyYW0gbGV0dGVyIHN0cmluZ1xyXG4gICAqL1xyXG4gIGFzeW5jIHNldFBpdGNoKGxldHRlcjogUGl0Y2hMZXR0ZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdzZXQgcGl0Y2ggJyArIGxldHRlcik7XHJcbiAgICBsZXQgaXNQZXJjdXNzaW9uID0gZmFsc2U7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGVkKSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gc2VsZWN0ZWQuc2VsZWN0b3I7XHJcbiAgICAgIGlmIChzZWxlY3RlZC5zdGFmZi5nZXRTdGFmZkluc3RydW1lbnQoc2VsZWN0ZWQuc2VsZWN0b3IubWVhc3VyZSkuaXNQZXJjdXNzaW9uKSB7XHJcbiAgICAgICAgaXNQZXJjdXNzaW9uID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgaGludFNlbCA9IFNtb1NlbGVjdGlvbi5sYXN0Tm90ZVNlbGVjdGlvbk5vblJlc3QodGhpcy5zY29yZSxcclxuICAgICAgICBzZWxlY3Rvci5zdGFmZiwgc2VsZWN0b3IubWVhc3VyZSwgc2VsZWN0b3Iudm9pY2UsIHNlbGVjdG9yLnRpY2spO1xyXG4gICAgICBpZiAoIWhpbnRTZWwpIHtcclxuICAgICAgICBoaW50U2VsID0gU21vU2VsZWN0aW9uLm5leHROb3RlU2VsZWN0aW9uTm9uUmVzdCh0aGlzLnNjb3JlLFxyXG4gICAgICAgICAgc2VsZWN0b3Iuc3RhZmYsIHNlbGVjdG9yLm1lYXN1cmUsIHNlbGVjdG9yLnZvaWNlLCBzZWxlY3Rvci50aWNrKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBUaGUgc2VsZWN0aW9uIG5vIGxvbmdlciBleGlzdHMsIHBvc3NpYmx5IGRlbGV0ZWRcclxuICAgICAgaWYgKGhpbnRTZWwgPT09IG51bGwgfHwgaGludFNlbC5ub3RlID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2VIZWxwZXJzLmVtcHR5UHJvbWlzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHBpdGNoID0gU21vTXVzaWMuZ2V0TGV0dGVyTm90ZVBpdGNoKGhpbnRTZWwubm90ZS5waXRjaGVzWzBdLFxyXG4gICAgICAgIGxldHRlciwgaGludFNlbC5tZWFzdXJlLmtleVNpZ25hdHVyZSk7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5zZXRQaXRjaChzZWxlY3RlZCwgW3BpdGNoXSk7XHJcbiAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0ZWQpO1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0UGl0Y2goYWx0U2VsISwgW3BpdGNoXSk7XHJcbiAgICAgIGlmICh0aGlzLnNjb3JlLnByZWZlcmVuY2VzLmF1dG9BZHZhbmNlKSB7XHJcbiAgICAgICAgLy8gRG9uJ3QgcGxheSB0aGUgbmV4dCBub3RlIGFuZCB0aGUgYWRkZWQgcGl0Y2ggYXQgdGhlIHNhbWUgdGltZS5cclxuICAgICAgICB0aGlzLnRyYWNrZXIuZGVmZXJOZXh0QXV0b1BsYXkoKTtcclxuICAgICAgICB0aGlzLnRyYWNrZXIubW92ZVNlbGVjdGlvblJpZ2h0KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKGlzUGVyY3Vzc2lvbikge1xyXG4gICAgICB0aGlzLnNjb3JlLnNldE5vdGVJbnN0cnVtZW50UHJvcGVydGllcygpO1xyXG4gICAgICB0aGlzLnN0b3JlU2NvcmUuc2V0Tm90ZUluc3RydW1lbnRQcm9wZXJ0aWVzKClcclxuICAgIH1cclxuICAgIGlmIChzZWxlY3Rpb25zLmxlbmd0aCA9PT0gMSAmJiB0aGlzLnNjb3JlLnByZWZlcmVuY2VzLmF1dG9QbGF5KSB7XHJcbiAgICAgIFN1aU9zY2lsbGF0b3IucGxheVNlbGVjdGlvbk5vdyhzZWxlY3Rpb25zWzBdLCB0aGlzLnNjb3JlLCAxKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2VuZXJpYyBjbGlwYm9hcmQgY29weSBhY3Rpb25cclxuICAgKi9cclxuICBhc3luYyBjb3B5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWx0QXI6IFNtb1NlbGVjdGlvbltdID0gW107XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgY29uc3Qgbm90ZVNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuICAgICAgaWYgKG5vdGVTZWxlY3Rpb24gIT09IG51bGwpIHtcclxuICAgICAgICBhbHRBci5wdXNoKG5vdGVTZWxlY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc3RvcmVQYXN0ZS5zZXRTZWxlY3Rpb25zKHRoaXMuc3RvcmVTY29yZSwgYWx0QXIpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGNsaXBib2FyZCBwYXN0ZSBhY3Rpb25cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBwYXN0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFdlIHVuZG8gdGhlIHdob2xlIHNjb3JlIG9uIGEgcGFzdGUsIHNpbmNlIHdlIGRvbid0IHlldCBrbm93IHRoZVxyXG4gICAgLy8gZXh0ZW50IG9mIHRoZSBvdmVybGFwXHJcbiAgICB0aGlzLnJlbmRlcmVyLnByZXNlcnZlU2Nyb2xsKCk7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSAgPSB0aGlzLmdldFBhc3RlTWVhc3VyZUxpc3QoKTtcclxuICAgIGNvbnN0IGZpcnN0U2VsZWN0aW9uID0gc2VsZWN0aW9uc1swXTtcclxuICAgIGNvbnN0IG1lYXN1cmVFbmQgPSBzZWxlY3Rpb25zW3NlbGVjdGlvbnMubGVuZ3RoIC0gMV0uc2VsZWN0b3IubWVhc3VyZTtcclxuICAgIGNvbnN0IG1lYXN1cmVSYW5nZSA9IFtmaXJzdFNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlLCBtZWFzdXJlRW5kXTtcclxuICAgIHRoaXMuc3RvcmVVbmRvLmdyb3VwaW5nID0gdHJ1ZTtcclxuICAgIC8vIFVuZG8gdGhlIHBhc3RlIGJ5IHNlbGVjdGluZyBhbGwgdGhlIGFmZmVjdGVkIG1lYXN1cmVzXHJcbiAgICBmb3IgKGxldCBpID0gbWVhc3VyZVJhbmdlWzBdOyBpIDw9IG1lYXN1cmVSYW5nZVsxXTsgKytpKSB7XHJcbiAgICAgIHRoaXMuX3VuZG9Db2x1bW4oJ3Bhc3RlJywgaSk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIudW5yZW5kZXJDb2x1bW4odGhpcy5zY29yZS5zdGF2ZXNbMF0ubWVhc3VyZXNbaV0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdG9yZVVuZG8uZ3JvdXBpbmcgPSBmYWxzZTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oZmlyc3RTZWxlY3Rpb24pO1xyXG4gICAgY29uc3QgYWx0VGFyZ2V0ID0gYWx0U2VsZWN0aW9uIS5zZWxlY3RvcjtcclxuICAgIGFsdFRhcmdldC50aWNrID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnNbMF0uc2VsZWN0b3IudGljaztcclxuICAgIC8vIHBhc3RlIHRoZSBjbGlwYm9hcmQgaW50byB0aGUgZGVzdGluYXRpb25cclxuICAgIHRoaXMuc3RvcmVQYXN0ZS5wYXN0ZVNlbGVjdGlvbnMoYWx0VGFyZ2V0KTtcclxuICAgIC8vIFJlZnJlc2ggdGhvc2UgbWVhc3VyZXMuXHJcbiAgICB0aGlzLnJlcGxhY2VNZWFzdXJlVmlldyhtZWFzdXJlUmFuZ2UpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFBhc3RlIG9ubHkgdGhlIGNob3Jkcy5cclxuICAgKi9cclxuICBhc3luYyBwYXN0ZUNob3JkcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICAvLyBXZSB1bmRvIHRoZSB3aG9sZSBzY29yZSBvbiBhIHBhc3RlLCBzaW5jZSB3ZSBkb24ndCB5ZXQga25vdyB0aGVcclxuICAgIC8vIGV4dGVudCBvZiB0aGUgb3ZlcmxhcFxyXG4gICAgdGhpcy5yZW5kZXJlci5wcmVzZXJ2ZVNjcm9sbCgpO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uczogU21vU2VsZWN0aW9uW10gID0gdGhpcy5nZXRQYXN0ZU1lYXN1cmVMaXN0KCk7XHJcbiAgICBjb25zdCBmaXJzdFNlbGVjdGlvbiA9IHNlbGVjdGlvbnNbMF07XHJcbiAgICBjb25zdCBtZWFzdXJlRW5kID0gc2VsZWN0aW9uc1tzZWxlY3Rpb25zLmxlbmd0aCAtIDFdLnNlbGVjdG9yLm1lYXN1cmU7XHJcbiAgICBjb25zdCBtZWFzdXJlUmFuZ2UgPSBbZmlyc3RTZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSwgbWVhc3VyZUVuZF07XHJcbiAgICB0aGlzLnN0b3JlVW5kby5ncm91cGluZyA9IHRydWU7XHJcbiAgICAvLyBVbmRvIHRoZSBwYXN0ZSBieSBzZWxlY3RpbmcgYWxsIHRoZSBhZmZlY3RlZCBtZWFzdXJlc1xyXG4gICAgZm9yIChsZXQgaSA9IG1lYXN1cmVSYW5nZVswXTsgaSA8PSBtZWFzdXJlUmFuZ2VbMV07ICsraSkge1xyXG4gICAgICB0aGlzLl91bmRvQ29sdW1uKCdwYXN0ZScsIGkpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnVucmVuZGVyQ29sdW1uKHRoaXMuc2NvcmUuc3RhdmVzWzBdLm1lYXN1cmVzW2ldKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmVVbmRvLmdyb3VwaW5nID0gZmFsc2U7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGZpcnN0U2VsZWN0aW9uKTtcclxuICAgIGNvbnN0IGFsdFRhcmdldCA9IGFsdFNlbGVjdGlvbiEuc2VsZWN0b3I7XHJcbiAgICBhbHRUYXJnZXQudGljayA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdLnNlbGVjdG9yLnRpY2s7XHJcbiAgICB0aGlzLnN0b3JlUGFzdGUucGFzdGVDaG9yZHMoYWx0VGFyZ2V0KTtcclxuICAgIC8vIFJlZnJlc2ggdGhvc2UgbWVhc3VyZXMuXHJcbiAgICB0aGlzLnJlcGxhY2VNZWFzdXJlVmlldyhtZWFzdXJlUmFuZ2UpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHNwZWNpZnkgYSBub3RlIGhlYWQgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBmb3IgdGhlIGR1cmF0aW9uXHJcbiAgICogQHBhcmFtIGhlYWQgXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0Tm90ZUhlYWQoaGVhZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLm1vZGlmeUN1cnJlbnRTZWxlY3Rpb25zKCdzZXQgbm90ZSBoZWFkJywgKHNjb3JlLCBzZWxlY3Rpb25zKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5zZXROb3RlSGVhZChzZWxlY3Rpb25zLCBoZWFkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIGEgdm9sdGEgZm9yIHNlbGVjdGVkIG1lYXN1cmVzXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkRW5kaW5nKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gVE9ETzogd2Ugc2hvdWxkIGhhdmUgdW5kbyBmb3IgY29sdW1uc1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdBZGQgVm9sdGEnKTtcclxuICAgIGNvbnN0IGZ0ID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpO1xyXG4gICAgY29uc3QgdHQgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IFNtb1ZvbHRhLmRlZmF1bHRzO1xyXG4gICAgcGFyYW1zLnN0YXJ0QmFyID0gZnQuc2VsZWN0b3IubWVhc3VyZTtcclxuICAgIHBhcmFtcy5lbmRCYXIgPSB0dC5zZWxlY3Rvci5tZWFzdXJlO1xyXG4gICAgcGFyYW1zLm51bWJlciA9IDE7XHJcbiAgICBjb25zdCB2b2x0YSA9IG5ldyBTbW9Wb2x0YShwYXJhbXMpO1xyXG4gICAgY29uc3QgYWx0Vm9sdGEgPSBuZXcgU21vVm9sdGEocGFyYW1zKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbZnQsIHR0XSk7XHJcbiAgICBTbW9PcGVyYXRpb24uYWRkRW5kaW5nKHRoaXMuc3RvcmVTY29yZSwgYWx0Vm9sdGEpO1xyXG4gICAgU21vT3BlcmF0aW9uLmFkZEVuZGluZyh0aGlzLnNjb3JlLCB2b2x0YSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIGVuZGluZyB2b2x0YSBzZXR0aW5nc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZUVuZGluZyhlbmRpbmc6IFNtb1ZvbHRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ0NoYW5nZSBWb2x0YScpO1xyXG4gICAgZW5kaW5nLmVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICQoZWwpLmZpbmQoJ2cuJyArIGVuZGluZy5hdHRycy5pZCkucmVtb3ZlKCk7XHJcbiAgICB9KTtcclxuICAgIGVuZGluZy5lbGVtZW50cyA9IFtdO1xyXG4gICAgU21vT3BlcmF0aW9uLnJlbW92ZUVuZGluZyh0aGlzLnN0b3JlU2NvcmUsIGVuZGluZyk7XHJcbiAgICBTbW9PcGVyYXRpb24ucmVtb3ZlRW5kaW5nKHRoaXMuc2NvcmUsIGVuZGluZyk7XHJcbiAgICBjb25zdCBhbHRWb2x0YSA9IG5ldyBTbW9Wb2x0YShlbmRpbmcpO1xyXG4gICAgU21vT3BlcmF0aW9uLmFkZEVuZGluZyh0aGlzLnN0b3JlU2NvcmUsIGFsdFZvbHRhKTtcclxuICAgIFNtb09wZXJhdGlvbi5hZGRFbmRpbmcodGhpcy5zY29yZSwgZW5kaW5nKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVmcmVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gZW5kaW5nIHZvbHRhIHRvIHJlbW92ZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZUVuZGluZyhlbmRpbmc6IFNtb1ZvbHRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ1JlbW92ZSBWb2x0YScpO1xyXG4gICAgZW5kaW5nLmVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICQoZWwpLmZpbmQoJ2cuJyArIGVuZGluZy5hdHRycy5pZCkucmVtb3ZlKCk7XHJcbiAgICB9KTtcclxuICAgIGVuZGluZy5lbGVtZW50cyA9IFtdO1xyXG4gICAgU21vT3BlcmF0aW9uLnJlbW92ZUVuZGluZyh0aGlzLnN0b3JlU2NvcmUsIGVuZGluZyk7XHJcbiAgICBTbW9PcGVyYXRpb24ucmVtb3ZlRW5kaW5nKHRoaXMuc2NvcmUsIGVuZGluZyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHBvc2l0aW9uIGJlZ2luIG9yIGVuZFxyXG4gICAqIEBwYXJhbSBiYXJsaW5lIGJhcmxpbmUgdHlwZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldEJhcmxpbmUocG9zaXRpb246IG51bWJlciwgYmFybGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBvYmogPSBuZXcgU21vQmFybGluZSh7IHBvc2l0aW9uLCBiYXJsaW5lIH0pO1xyXG4gICAgY29uc3QgYWx0T2JqID0gbmV3IFNtb0JhcmxpbmUoeyBwb3NpdGlvbiwgYmFybGluZSB9KTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdO1xyXG4gICAgdGhpcy5fdW5kb0NvbHVtbignc2V0IGJhcmxpbmUnLCBzZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSk7XHJcbiAgICBTbW9PcGVyYXRpb24uc2V0TWVhc3VyZUJhcmxpbmUodGhpcy5zY29yZSwgc2VsZWN0aW9uLCBvYmopO1xyXG4gICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVCYXJsaW5lKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsISwgYWx0T2JqKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbc2VsZWN0aW9uXSk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBzdGFydCBvciBlbmRcclxuICAgKiBAcGFyYW0gc3ltYm9sIGNvZGEsIGV0Yy5cclxuICAgKi9cclxuICBhc3luYyBzZXRSZXBlYXRTeW1ib2wocG9zaXRpb246IG51bWJlciwgc3ltYm9sOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IFNtb1JlcGVhdFN5bWJvbC5kZWZhdWx0cztcclxuICAgIHBhcmFtcy5wb3NpdGlvbiA9IHBvc2l0aW9uO1xyXG4gICAgcGFyYW1zLnN5bWJvbCA9IHN5bWJvbDtcclxuICAgIGNvbnN0IG9iaiA9IG5ldyBTbW9SZXBlYXRTeW1ib2wocGFyYW1zKTtcclxuICAgIGNvbnN0IGFsdE9iaiA9IG5ldyBTbW9SZXBlYXRTeW1ib2wocGFyYW1zKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdO1xyXG4gICAgdGhpcy5fdW5kb0NvbHVtbignc2V0IHJlcGVhdCBzeW1ib2wnLCBzZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSk7XHJcbiAgICBTbW9PcGVyYXRpb24uc2V0UmVwZWF0U3ltYm9sKHRoaXMuc2NvcmUsIHNlbGVjdGlvbiwgb2JqKTtcclxuICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIFNtb09wZXJhdGlvbi5zZXRSZXBlYXRTeW1ib2wodGhpcy5zdG9yZVNjb3JlLCBhbHRTZWwhLCBhbHRPYmopO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKFtzZWxlY3Rpb25dKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogIHRvZ2dsZSByZWhlYXJzYWwgbWFyayBvbiBmaXJzdCBzZWxlY3RlZCBtZWFzdXJlXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyB0b2dnbGVSZWhlYXJzYWxNYXJrKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgY29uc3QgY21kID0gc2VsZWN0aW9uLm1lYXN1cmUuZ2V0UmVoZWFyc2FsTWFyaygpID8gJ3JlbW92ZVJlaGVhcnNhbE1hcmsnIDogJ2FkZFJlaGVhcnNhbE1hcmsnO1xyXG4gICAgU21vT3BlcmF0aW9uW2NtZF0odGhpcy5zY29yZSwgc2VsZWN0aW9uLCBuZXcgU21vUmVoZWFyc2FsTWFyayhTbW9SZWhlYXJzYWxNYXJrLmRlZmF1bHRzKSk7XHJcbiAgICBTbW9PcGVyYXRpb25bY21kXSh0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbGVjdGlvbiEsIG5ldyBTbW9SZWhlYXJzYWxNYXJrKFNtb1JlaGVhcnNhbE1hcmsuZGVmYXVsdHMpKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbc2VsZWN0aW9uXSk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIF9yZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyOiBTdGFmZk1vZGlmaWVyQmFzZSkge1xyXG4gICAgdGhpcy5zY29yZS5zdGF2ZXNbbW9kaWZpZXIuYXNzb2NpYXRlZFN0YWZmXS5yZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyKTtcclxuICAgIGNvbnN0IGFsdE1vZGlmaWVyID0gU3RhZmZNb2RpZmllckJhc2UuZGVzZXJpYWxpemUobW9kaWZpZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgYWx0TW9kaWZpZXIuYXR0cnMuaWQgPSBtb2RpZmllci5hdHRycy5pZDtcclxuICAgIGFsdE1vZGlmaWVyLnN0YXJ0U2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoYWx0TW9kaWZpZXIuc3RhcnRTZWxlY3Rvcik7XHJcbiAgICBhbHRNb2RpZmllci5lbmRTZWxlY3RvciA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3RvcihhbHRNb2RpZmllci5lbmRTZWxlY3Rvcik7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuX2dldEVxdWl2YWxlbnRTdGFmZihtb2RpZmllci5hc3NvY2lhdGVkU3RhZmYpXS5yZW1vdmVTdGFmZk1vZGlmaWVyKGFsdE1vZGlmaWVyKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHNlbGVjdGVkIG1vZGlmaWVyXHJcbiAgICogQHBhcmFtIG1vZGlmaWVyIHNsdXIsIGhhaXJwaW4sIGV0Yy5cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyOiBTdGFmZk1vZGlmaWVyQmFzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy51bmRvU3RhZmZNb2RpZmllcignU2V0IG1lYXN1cmUgcHJvcG9ydGlvbicsIG1vZGlmaWVyLFxyXG4gICAgICBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLlJFTU9WRSk7XHJcbiAgICB0aGlzLl9yZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyKTtcclxuICAgIHRoaXMuX3JlbmRlclJlY3RhbmdsZShtb2RpZmllci5zdGFydFNlbGVjdG9yLCBtb2RpZmllci5lbmRTZWxlY3Rvcik7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSBhIHN0YWZmIG1vZGlmaWVyXHJcbiAgICogQHBhcmFtIG9yaWdpbmFsIG9yaWdpbmFsIHZlcnNpb25cclxuICAgKiBAcGFyYW0gbW9kaWZpZXIgbW9kaWZpZWQgdmVyc2lvblxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZE9yVXBkYXRlU3RhZmZNb2RpZmllcihvcmlnaW5hbDogU3RhZmZNb2RpZmllckJhc2UsIG1vZGlmaWVyOiBTdGFmZk1vZGlmaWVyQmFzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFtb2RpZmllcikge1xyXG4gICAgICBpZiAob3JpZ2luYWwpIHtcclxuICAgICAgICAvLyBIYW5kbGUgbGVnYWN5IEFQSSBjaGFuZ2VkXHJcbiAgICAgICAgbW9kaWZpZXIgPSBTdGFmZk1vZGlmaWVyQmFzZS5kZXNlcmlhbGl6ZShvcmlnaW5hbCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCd1cGRhdGUgbW9kaWZpZXI6IGJhZCBtb2RpZmllcicpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlSGVscGVycy5lbXB0eVByb21pc2UoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnNjb3JlLnN0YXZlc1ttb2RpZmllci5zdGFydFNlbGVjdG9yLnN0YWZmXVxyXG4gICAgICAuZ2V0TW9kaWZpZXIobW9kaWZpZXIpO1xyXG4gICAgY29uc3Qgc3VidHlwZSA9IGV4aXN0aW5nID09PSBudWxsID8gVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQgOlxyXG4gICAgICBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLlVQREFURTtcclxuICAgIHRoaXMudW5kb1N0YWZmTW9kaWZpZXIoJ1NldCBtZWFzdXJlIHByb3BvcnRpb24nLCBvcmlnaW5hbCxcclxuICAgICAgc3VidHlwZSk7XHJcbiAgICB0aGlzLl9yZW1vdmVTdGFmZk1vZGlmaWVyKG1vZGlmaWVyKTtcclxuICAgIGNvbnN0IGNvcHkgPSBTdGFmZk1vZGlmaWVyQmFzZS5kZXNlcmlhbGl6ZShtb2RpZmllci5zZXJpYWxpemUoKSk7XHJcbiAgICBjb3B5LnN0YXJ0U2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoY29weS5zdGFydFNlbGVjdG9yKTtcclxuICAgIGNvcHkuZW5kU2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoY29weS5lbmRTZWxlY3Rvcik7XHJcbiAgICBjb25zdCBzZWwgPSBTbW9TZWxlY3Rpb24ubm90ZUZyb21TZWxlY3Rvcih0aGlzLnNjb3JlLCBtb2RpZmllci5zdGFydFNlbGVjdG9yKTtcclxuICAgIGlmIChzZWwgIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwpO1xyXG4gICAgICBTbW9PcGVyYXRpb24uYWRkU3RhZmZNb2RpZmllcihzZWwsIG1vZGlmaWVyKTtcclxuICAgICAgU21vT3BlcmF0aW9uLmFkZFN0YWZmTW9kaWZpZXIoYWx0U2VsISwgY29weSk7XHJcbiAgICAgIGNvbnN0IG1vZElkID0gJ21vZC0nICsgc2VsLnNlbGVjdG9yLnN0YWZmICsgJy0nICsgc2VsLnNlbGVjdG9yLm1lYXN1cmU7XHJcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnJlbmRlcmVyLnJlbmRlcmVyLmdldFJlbmRlcmVyKHNlbC5tZWFzdXJlLnN2Zy5sb2dpY2FsQm94KTtcclxuICAgICAgaWYgKGNvbnRleHQpIHtcclxuICAgICAgICBTdmdIZWxwZXJzLnJlbW92ZUVsZW1lbnRzQnlDbGFzcyhjb250ZXh0LnN2ZywgbW9kSWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZW5kZXJSZWN0YW5nbGUobW9kaWZpZXIuc3RhcnRTZWxlY3RvciwgbW9kaWZpZXIuZW5kU2VsZWN0b3IpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBsaW5lT3BlcmF0aW9uKG9wOiBjcmVhdGVTdGFmZk1vZGlmaWVyVHlwZTxTdGFmZk1vZGlmaWVyQmFzZT4pIHtcclxuICAgIC8vIGlmICh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5sZW5ndGggPCAyKSB7XHJcbiAgICAvLyAgIHJldHVybjtcclxuICAgIC8vIH1cclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdjcmVhdGUgc3RhZmYgbW9kaWZpZXInKTtcclxuICAgIGNvbnN0IGZ0ID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpO1xyXG4gICAgY29uc3QgdHQgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKTtcclxuICAgIGNvbnN0IGZ0QWx0ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihmdCk7XHJcbiAgICBjb25zdCB0dEFsdCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24odHQpO1xyXG4gICAgY29uc3QgbW9kaWZpZXIgPSBvcChmdCwgdHQpO1xyXG4gICAgY29uc3QgYWx0TW9kaWZpZXIgPSBvcChmdEFsdCEsIHR0QWx0ISk7XHJcbiAgICBhbHRNb2RpZmllci5hdHRycy5pZCA9IG1vZGlmaWVyLmF0dHJzLmlkO1xyXG4gICAgZnQuc3RhZmYuYWRkU3RhZmZNb2RpZmllcihtb2RpZmllcik7XHJcbiAgICBmdEFsdD8uc3RhZmYuYWRkU3RhZmZNb2RpZmllcihhbHRNb2RpZmllcik7XHJcbiAgICB0aGlzLnVuZG9TdGFmZk1vZGlmaWVyKCdhZGQgJyArIG9wLCBtb2RpZmllciwgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWRkIGNyZXNjZW5kbyB0byBzZWxlY3Rpb25cclxuICAgKi9cclxuICBhc3luYyBjcmVzY2VuZG8oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmxpbmVPcGVyYXRpb24oU21vT3BlcmF0aW9uLmNyZWF0ZUNyZXNjZW5kbyk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCBjcmVzY2VuZG8gdG8gc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgY3Jlc2NlbmRvQnJhY2tldCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubGluZU9wZXJhdGlvbihTbW9PcGVyYXRpb24uY3JlYXRlQ3Jlc2NlbmRvQnJhY2tldCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCBjcmVzY2VuZG8gdG8gc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgZGltZW51ZW5kbygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubGluZU9wZXJhdGlvbihTbW9PcGVyYXRpb24uY3JlYXRlRGltZW51ZW5kb0JyYWNrZXQpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgY3Jlc2NlbmRvIHRvIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGFzeW5jIGFjY2VsZXJhbmRvKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5saW5lT3BlcmF0aW9uKFNtb09wZXJhdGlvbi5jcmVhdGVBY2NlbGVyYW5kb0JyYWNrZXQpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgY3Jlc2NlbmRvIHRvIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGFzeW5jIHJpdGFyZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubGluZU9wZXJhdGlvbihTbW9PcGVyYXRpb24uY3JlYXRlUml0YXJkQnJhY2tldCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGRpbWludWVuZG8gaGFpcnBpblxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGRlY3Jlc2NlbmRvKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5saW5lT3BlcmF0aW9uKFNtb09wZXJhdGlvbi5jcmVhdGVEZWNyZXNjZW5kbyk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHJlbW92ZVRleHRCcmFja2V0KGJyYWNrZXQ6IFNtb1N0YWZmVGV4dEJyYWNrZXQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnJlbW92ZVN0YWZmTW9kaWZpZXIoYnJhY2tldCk7XHJcbiAgfVxyXG4gIGFzeW5jIGFkZE9yUmVwbGFjZVN0YWZmTW9kaWZpZXIoY2FsbGJhY2s6IHVwZGF0ZVN0YWZmTW9kaWZpZXJGdW5jLCBtb2RpZmllcjogU3RhZmZNb2RpZmllckJhc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGZyb20xID0gU21vU2VsZWN0aW9uLm5vdGVGcm9tU2VsZWN0b3IodGhpcy5zY29yZSwgbW9kaWZpZXIuc3RhcnRTZWxlY3Rvcik7XHJcbiAgICBjb25zdCB0bzEgPSBTbW9TZWxlY3Rpb24ubm90ZUZyb21TZWxlY3Rvcih0aGlzLnNjb3JlLCBtb2RpZmllci5lbmRTZWxlY3Rvcik7XHJcbiAgICBpZiAoZnJvbTEgPT09IG51bGwgfHwgdG8xID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGFsdEZyb20gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGZyb20xKTtcclxuICAgIGNvbnN0IGFsdFRvID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbih0bzEpO1xyXG4gICAgaWYgKGFsdEZyb20gPT09IG51bGwgfHwgYWx0VG8gPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY2FsbGJhY2sodGhpcy5zY29yZSwgZnJvbTEsIHRvMSk7XHJcbiAgICBjYWxsYmFjayh0aGlzLnN0b3JlU2NvcmUsIGFsdEZyb20sIGFsdFRvKTtcclxuICAgIGNvbnN0IHJlZHJhdyA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlc0JldHdlZW4odGhpcy5zY29yZSwgZnJvbTEuc2VsZWN0b3IsIHRvMS5zZWxlY3Rvcik7XHJcbiAgICB0aGlzLnVuZG9TdGFmZk1vZGlmaWVyKCdhZGQgcmVwbCB0ZXh0IGJyYWNrZXQnLCBtb2RpZmllciwgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKHJlZHJhdyk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIGFkZE9yUmVwbGFjZVRleHRCcmFja2V0KG1vZGlmaWVyOiBTbW9TdGFmZlRleHRCcmFja2V0KSB7XHJcbiAgICBjb25zdCBmcm9tMSA9IFNtb1NlbGVjdGlvbi5ub3RlRnJvbVNlbGVjdG9yKHRoaXMuc2NvcmUsIG1vZGlmaWVyLnN0YXJ0U2VsZWN0b3IpO1xyXG4gICAgY29uc3QgdG8xID0gU21vU2VsZWN0aW9uLm5vdGVGcm9tU2VsZWN0b3IodGhpcy5zY29yZSwgbW9kaWZpZXIuZW5kU2VsZWN0b3IpO1xyXG4gICAgaWYgKGZyb20xID09PSBudWxsIHx8IHRvMSA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBhbHRGcm9tID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihmcm9tMSk7XHJcbiAgICBjb25zdCBhbHRUbyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24odG8xKTtcclxuICAgIGlmIChhbHRGcm9tID09PSBudWxsIHx8IGFsdFRvID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFNtb09wZXJhdGlvbi5hZGRPclJlcGxhY2VCcmFja2V0KG1vZGlmaWVyLCBmcm9tMSwgdG8xKTtcclxuICAgIFNtb09wZXJhdGlvbi5hZGRPclJlcGxhY2VCcmFja2V0KG1vZGlmaWVyLCBhbHRGcm9tLCBhbHRUbyk7XHJcbiAgICBjb25zdCByZWRyYXcgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZXNCZXR3ZWVuKHRoaXMuc2NvcmUsIGZyb20xLnNlbGVjdG9yLCB0bzEuc2VsZWN0b3IpO1xyXG4gICAgdGhpcy51bmRvU3RhZmZNb2RpZmllcignYWRkIHJlcGwgdGV4dCBicmFja2V0JywgbW9kaWZpZXIsIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuQUREKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhyZWRyYXcpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTbHVyIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyBhZGRTbHVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpO1xyXG4gICAgY29uc3QgZnQgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigtMSk7XHJcbiAgICBjb25zdCB0dCA9IHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKDEpO1xyXG4gICAgY29uc3QgZnRBbHQgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGZ0KTtcclxuICAgIGNvbnN0IHR0QWx0ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbih0dCk7XHJcbiAgICBjb25zdCBtb2RpZmllciA9IFNtb09wZXJhdGlvbi5jcmVhdGVTbHVyKHRoaXMuc2NvcmUsIGZ0LCB0dCk7XHJcbiAgICBmdC5zdGFmZi5hZGRTdGFmZk1vZGlmaWVyKG1vZGlmaWVyKTtcclxuICAgIC8vIG1ha2Ugc3VyZSBzY29yZSBhbmQgYmFja3VwIGhhdmUgc2FtZSBJRCBmb3IgdW5kby5cclxuICAgIGNvbnN0IGFsdE1vZGlmaWVyID0gU21vT3BlcmF0aW9uLmNyZWF0ZVNsdXIodGhpcy5zdG9yZVNjb3JlLCBmdEFsdCEsIHR0QWx0ISk7XHJcbiAgICBhbHRNb2RpZmllci5hdHRycy5pZCA9IG1vZGlmaWVyLmF0dHJzLmlkO1xyXG4gICAgZnRBbHQ/LnN0YWZmLmFkZFN0YWZmTW9kaWZpZXIoYWx0TW9kaWZpZXIpO1xyXG4gICAgdGhpcy51bmRvU3RhZmZNb2RpZmllcignYWRkIHNsdXInLCBtb2RpZmllciwgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdGllIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdGllKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5saW5lT3BlcmF0aW9uKFNtb09wZXJhdGlvbi5jcmVhdGVUaWUpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyB1cGRhdGVab29tKHpvb21GYWN0b3I6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgb3JpZ2luYWwgPSB0aGlzLnNjb3JlLmxheW91dE1hbmFnZXIhLmdldEdsb2JhbExheW91dCgpO1xyXG4gICAgb3JpZ2luYWwuem9vbVNjYWxlID0gem9vbUZhY3RvcjtcclxuICAgIHRoaXMuc2NvcmUubGF5b3V0TWFuYWdlciEuZ2xvYmFsTGF5b3V0Lnpvb21TY2FsZSA9IHpvb21GYWN0b3I7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnBhZ2VNYXAudXBkYXRlWm9vbSh6b29tRmFjdG9yKTtcclxuICAgIHRoaXMucmVuZGVyZXIucGFnZU1hcC51cGRhdGVDb250YWluZXJPZmZzZXQodGhpcy5zY3JvbGxlci5zY3JvbGxTdGF0ZSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHNldCBnbG9iYWwgcGFnZSBmb3Igc2NvcmUsIHpvb20gZXRjLlxyXG4gICAqIEBwYXJhbSBsYXlvdXQgZ2xvYmFsIFNWRyBzZXR0aW5nc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldEdsb2JhbExheW91dChsYXlvdXQ6IFNtb0dsb2JhbExheW91dCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdTZXQgR2xvYmFsIExheW91dCcpO1xyXG4gICAgY29uc3Qgb3JpZ2luYWwgPSB0aGlzLnNjb3JlLmxheW91dE1hbmFnZXIhLmdldEdsb2JhbExheW91dCgpLnN2Z1NjYWxlO1xyXG4gICAgdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyIS51cGRhdGVHbG9iYWxMYXlvdXQobGF5b3V0KTtcclxuICAgIHRoaXMuc2NvcmUuc2NhbGVUZXh0R3JvdXBzKG9yaWdpbmFsIC8gbGF5b3V0LnN2Z1NjYWxlKTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5sYXlvdXRNYW5hZ2VyIS51cGRhdGVHbG9iYWxMYXlvdXQobGF5b3V0KTtcclxuICAgIHRoaXMucmVuZGVyZXIucmVyZW5kZXJBbGwoKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnByZXNlcnZlU2Nyb2xsKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgbGF5b3V0IG9mIGEgc2luZ2xlIHBhZ2VcclxuICAgKiBAcGFyYW0gbGF5b3V0IHBhZ2UgbGF5b3V0XHJcbiAgICogQHBhcmFtIHBhZ2VJbmRleCB3aGljaCBwYWdlIHRvIGNoYW5nZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldFBhZ2VMYXlvdXQobGF5b3V0OiBTbW9QYWdlTGF5b3V0LCBwYWdlSW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyIS51cGRhdGVQYWdlKGxheW91dCwgcGFnZUluZGV4KTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5sYXlvdXRNYW5hZ2VyIS51cGRhdGVQYWdlKGxheW91dCwgcGFnZUluZGV4KTtcclxuICAgIC8vIElmIHdlIGFyZSBpbiBwYXJ0IG1vZGUsIHNhdmUgdGhlIHBhZ2UgbGF5b3V0IGluIHRoZSBwYXJ0IHNvIGl0IGlzIHRoZXJlIG5leHQgdGltZVxyXG4gICAgLy8gdGhlIHBhcnQgaXMgZXhwb3NlZC5cclxuICAgIGlmICh0aGlzLmlzUGFydEV4cG9zZWQoKSkge1xyXG4gICAgICB0aGlzLnNjb3JlLnN0YXZlcy5mb3JFYWNoKChzdGFmZiwgc3RhZmZJeCkgPT4ge1xyXG4gICAgICAgIHN0YWZmLnBhcnRJbmZvLmxheW91dE1hbmFnZXIudXBkYXRlUGFnZShsYXlvdXQsIHBhZ2VJbmRleCk7XHJcbiAgICAgICAgY29uc3QgYWx0U3RhZmYgPSB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuc3RhZmZNYXBbc3RhZmZJeF1dO1xyXG4gICAgICAgIGFsdFN0YWZmLnBhcnRJbmZvLmxheW91dE1hbmFnZXIudXBkYXRlUGFnZShsYXlvdXQsIHBhZ2VJbmRleCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoVmlld3BvcnQoKTtcclxuICB9XHJcbiAgYXN5bmMgc2V0UGFnZUxheW91dHMobGF5b3V0OiBTbW9QYWdlTGF5b3V0LCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnU2V0IFBhZ2UgTGF5b3V0Jyk7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBmb3IgKGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyArK2kpIHtcclxuICAgICAgdGhpcy5zZXRQYWdlTGF5b3V0KGxheW91dCwgaSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyQWxsKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgbXVzaWMgZm9udFxyXG4gICAqIEBwYXJhbSBmYW1pbHkgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0RW5ncmF2aW5nRm9udEZhbWlseShmYW1pbHk6IGVuZ3JhdmluZ0ZvbnRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnNjb3JlLmVuZ3JhdmluZ0ZvbnQgPSBmYW1pbHk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuZW5ncmF2aW5nRm9udCA9IGZhbWlseTtcclxuICAgIHRoaXMucmVuZGVyZXIubm90aWZ5Rm9udENoYW5nZSgpOyAgIFxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwYXRlIGdsb2JhbCBmb250IHVzZWQgZm9yIGNob3JkIGNoYW5nZXNcclxuICAgKiBAcGFyYW0gZm9udEluZm9cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBzZXRDaG9yZEZvbnQoZm9udEluZm86IEZvbnRJbmZvKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ1NldCBDaG9yZCBGb250Jyk7XHJcbiAgICB0aGlzLnNjb3JlLnNldENob3JkRm9udChmb250SW5mbyk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuc2V0Q2hvcmRGb250KGZvbnRJbmZvKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVmcmVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgZm9udCB1c2VkIGZvciBseXJpY3NcclxuICAgKiBAcGFyYW0gZm9udEluZm8gXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0THlyaWNGb250KGZvbnRJbmZvOiBGb250SW5mbyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdTZXQgTHlyaWMgRm9udCcpO1xyXG4gICAgdGhpcy5zY29yZS5zZXRMeXJpY0ZvbnQoZm9udEluZm8pO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnNldEx5cmljRm9udChmb250SW5mbyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIHZhbHVlIGlmIGZhbHNlLCBseXJpYyB3aWR0aHMgZG9uJ3QgYWZmZWN0IG1lYXN1cmUgd2lkdGhcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBzZXRMeXJpY0FkanVzdFdpZHRoKHZhbHVlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ1NldCBMeXJpYyBBZGogV2lkdGgnKTtcclxuICAgIHRoaXMuc2NvcmUuc2V0THlyaWNBZGp1c3RXaWR0aCh2YWx1ZSk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuc2V0THlyaWNBZGp1c3RXaWR0aCh2YWx1ZSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogZGVsZXRlIHNlbGVjdGVkIG1lYXN1cmVzXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlTWVhc3VyZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnRGVsZXRlIE1lYXN1cmUnKTtcclxuICAgIGlmICh0aGlzLnN0b3JlU2NvcmUuc3RhdmVzWzBdLm1lYXN1cmVzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2VIZWxwZXJzLmVtcHR5UHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlTGlzdCh0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucyk7XHJcbiAgICAvLyBUSGUgbWVhc3VyZXMgZ2V0IHJlbnVtYmVyZWQsIHNvIGtlZXAgdGhlIGluZGV4IGF0IDBcclxuICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0aW9uc1swXS5zZWxlY3Rvci5tZWFzdXJlO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIC8vIFVucmVuZGVyIHRoZSBkZWxldGVkIG1lYXN1cmVcclxuICAgICAgdGhpcy5zY29yZS5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYpID0+IHtcclxuICAgICAgICB0aGlzLnRyYWNrZXIuY2xlYXJNZWFzdXJlTWFwKHN0YWZmLm1lYXN1cmVzW2luZGV4XSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci51bnJlbmRlck1lYXN1cmUoc3RhZmYubWVhc3VyZXNbaW5kZXhdKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnVucmVuZGVyTWVhc3VyZShzdGFmZi5tZWFzdXJlc1tzdGFmZi5tZWFzdXJlcy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgLy8gQSBsaXR0bGUgaGFja3kgLSBkZWxldGUgdGhlIG1vZGlmaWVycyBpZiB0aGV5IHN0YXJ0IG9yIGVuZCBvblxyXG4gICAgICAgIC8vIHRoZSBtZWFzdXJlXHJcbiAgICAgICAgc3RhZmYucmVuZGVyYWJsZU1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xyXG4gICAgICAgICAgaWYgKG1vZGlmaWVyLnN0YXJ0U2VsZWN0b3IubWVhc3VyZSA9PT0gaW5kZXggfHwgbW9kaWZpZXIuZW5kU2VsZWN0b3IubWVhc3VyZSA9PT0gaW5kZXgpIHtcclxuICAgICAgICAgICAgaWYgKG1vZGlmaWVyLmxvZ2ljYWxCb3gpIHtcclxuICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5yZW5kZXJlci5yZW5kZXJlci5nZXRSZW5kZXJlcihtb2RpZmllci5sb2dpY2FsQm94KTtcclxuICAgICAgICAgICAgICBpZiAoY29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgJChjb250ZXh0LnN2ZykuZmluZCgnZy4nICsgbW9kaWZpZXIuYXR0cnMuaWQpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgLy8gUmVtb3ZlIHRoZSBTVkcgYXJ0aWZhY3RzIG1hcHBlZCB0byB0aGlzIG1lYXN1cmUuXHJcbiAgICAgIHRoaXMuc2NvcmUuZGVsZXRlTWVhc3VyZShpbmRleCk7XHJcbiAgICAgIHRoaXMuc3RvcmVTY29yZS5kZWxldGVNZWFzdXJlKGluZGV4KTtcclxuICAgICAgLy8gTm90ZTogaW5kZXggZG9lc24ndCBpbmNyZW1lbnQgc2luY2UgdGhlcmUgYXJlIG5vdyAxIGZld2VyIG1lYXN1cmVzXHJcbiAgICB9O1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGFkZCBudW1iZXIgb2YgbWVhc3VyZXMsIHdpdGggZGVmYXVsdCBub3RlcyBzZWxlY3Rpb25zXHJcbiAgICogQHBhcmFtIGFwcGVuZCBcclxuICAgKiBAcGFyYW0gbnVtYmVyVG9BZGQgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkTWVhc3VyZXMoYXBwZW5kOiBib29sZWFuLCBudW1iZXJUb0FkZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcG9zID0gMDtcclxuICAgIGxldCBpeCA9IDA7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ0FkZCBNZWFzdXJlJyk7XHJcbiAgICBmb3IgKGl4ID0gMDsgaXggPCBudW1iZXJUb0FkZDsgKytpeCkge1xyXG4gICAgICBjb25zdCBtZWFzdXJlID0gdGhpcy50cmFja2VyLmdldEZpcnN0TWVhc3VyZU9mU2VsZWN0aW9uKCk7XHJcbiAgICAgIGlmIChtZWFzdXJlKSB7XHJcbiAgICAgICAgY29uc3Qgbm1lYXN1cmUgPSBTbW9NZWFzdXJlLmdldERlZmF1bHRNZWFzdXJlV2l0aE5vdGVzKG1lYXN1cmUpO1xyXG4gICAgICAgIHBvcyA9IG1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXg7XHJcbiAgICAgICAgaWYgKGFwcGVuZCkge1xyXG4gICAgICAgICAgcG9zICs9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5tZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4ID0gcG9zO1xyXG4gICAgICAgIG5tZWFzdXJlLnNldEFjdGl2ZVZvaWNlKDApO1xyXG4gICAgICAgIHRoaXMuc2NvcmUuYWRkTWVhc3VyZShwb3MpO1xyXG4gICAgICAgIHRoaXMuc3RvcmVTY29yZS5hZGRNZWFzdXJlKHBvcyk7ICAgICAgICBcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3Qgc3RhcnRNZWFzdXJlID0gcG9zIC0gKGl4IC0gMSk7XHJcbiAgICBjb25zdCBzdGFydFNlbGVjdG9yID0gU21vU2VsZWN0b3IuZGVmYXVsdDtcclxuICAgIGNvbnN0IGVuZFNlbGVjdG9yID0gU21vU2VsZWN0b3IuZGVmYXVsdDtcclxuICAgIHN0YXJ0U2VsZWN0b3IubWVhc3VyZSA9IHN0YXJ0TWVhc3VyZTtcclxuICAgIGVuZFNlbGVjdG9yLm1lYXN1cmUgPSBwb3M7XHJcbiAgICB0aGlzLl9yZW5kZXJSZWN0YW5nbGUoc3RhcnRTZWxlY3RvciwgZW5kU2VsZWN0b3IpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGFkZCBhIHNpbmdsZSBtZWFzdXJlIGJlZm9yZSBvciBhZnRlciBzZWxlY3Rpb25cclxuICAgKiBAcGFyYW0gYXBwZW5kIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZE1lYXN1cmUoYXBwZW5kOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ0FkZCBNZWFzdXJlJyk7XHJcbiAgICBsZXQgcG9zID0gMDtcclxuICAgIGNvbnN0IG1lYXN1cmUgPSB0aGlzLnRyYWNrZXIuZ2V0Rmlyc3RNZWFzdXJlT2ZTZWxlY3Rpb24oKTtcclxuICAgIGlmICghbWVhc3VyZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBubWVhc3VyZSA9IFNtb01lYXN1cmUuZ2V0RGVmYXVsdE1lYXN1cmVXaXRoTm90ZXMobWVhc3VyZSk7XHJcbiAgICBwb3MgPSBtZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4O1xyXG4gICAgaWYgKGFwcGVuZCkge1xyXG4gICAgICBwb3MgKz0gMTtcclxuICAgIH1cclxuICAgIG5tZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4ID0gcG9zO1xyXG4gICAgbm1lYXN1cmUuc2V0QWN0aXZlVm9pY2UoMCk7XHJcbiAgICB0aGlzLnNjb3JlLmFkZE1lYXN1cmUocG9zKTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5hZGRNZWFzdXJlKHBvcyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmNsZWFyTGluZShtZWFzdXJlKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVmcmVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiByZW1vdmUgYW4gZW50aXJlIGxpbmUgb2YgbXVzaWNcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZVN0YWZmKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdSZW1vdmUgSW5zdHJ1bWVudCcpO1xyXG4gICAgaWYgKHRoaXMuc3RvcmVTY29yZS5zdGF2ZXMubGVuZ3RoIDwgMiB8fCB0aGlzLnNjb3JlLnN0YXZlcy5sZW5ndGggPCAyKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlSGVscGVycy5lbXB0eVByb21pc2UoKTtcclxuICAgIH1cclxuICAgIC8vIGlmIHdlIGFyZSBsb29raW5nIGF0IGEgc3Vic2V0IG9mIHRoZSBzY29yZSxcclxuICAgIC8vIHJldmVydCB0byB0aGUgZnVsbCBzY29yZSB2aWV3IGJlZm9yZSByZW1vdmluZyB0aGUgc3RhZmYuXHJcbiAgICBjb25zdCB0b1JlbW92ZTogbnVtYmVyW10gPSBbXTtcclxuICAgIGNvbnN0IHNlbGVjdGVkU3RhdmVzOiBSZWNvcmQ8bnVtYmVyLCBib29sZWFuPiAgPSB7fTtcclxuICAgIHRoaXMudHJhY2tlci5zZWxlY3Rpb25zLmZvckVhY2goKHNlbCkgPT4ge1xyXG4gICAgICBjb25zdCBzY29yZVNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuICAgICAgaWYgKCFzZWxlY3RlZFN0YXZlc1tzY29yZVNlbCEuc2VsZWN0b3Iuc3RhZmZdKSB7XHJcbiAgICAgICAgc2VsZWN0ZWRTdGF2ZXNbc2NvcmVTZWwhLnNlbGVjdG9yLnN0YWZmXSA9IHRydWU7XHJcbiAgICAgICAgdG9SZW1vdmUucHVzaChzY29yZVNlbCEuc2VsZWN0b3Iuc3RhZmYpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIFNvcnQgaW4gZGVzY2VuZGluZyBvcmRlciBzbyB3ZSBkb24ndCBtZXNzIHVwIHRoZSBzdGFmZiBpbmRpY2VzIGFzIHdlIHJlbW92ZVxyXG4gICAgdG9SZW1vdmUuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xyXG4gICAgdG9SZW1vdmUuZm9yRWFjaCgoc3RhZmZJbmRleCkgPT4ge1xyXG4gICAgICBTbW9PcGVyYXRpb24ucmVtb3ZlU3RhZmYodGhpcy5zdG9yZVNjb3JlLCBzdGFmZkluZGV4KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy52aWV3QWxsKCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgYWRkU3RhZmYoaW5zdHJ1bWVudDogU21vU3lzdGVtU3RhZmZQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnQWRkIEluc3RydW1lbnQnKTtcclxuICAgIC8vIGlmIHdlIGFyZSBsb29raW5nIGF0IGEgc3Vic2V0IG9mIHRoZSBzY29yZSwgd2Ugd29uJ3Qgc2VlIHRoZSBuZXcgc3RhZmYuICBTb1xyXG4gICAgLy8gcmV2ZXJ0IHRvIHRoZSBmdWxsIHZpZXdcclxuICAgIGNvbnN0IHN0YWZmID0gU21vT3BlcmF0aW9uLmFkZFN0YWZmKHRoaXMuc3RvcmVTY29yZSwgaW5zdHJ1bWVudCk7XHJcbiAgICBjb25zdCBpbnN0S2V5cyA9IE9iamVjdC5rZXlzKHN0YWZmLm1lYXN1cmVJbnN0cnVtZW50TWFwKTtcclxuICAgIC8vIHVwZGF0ZSB0aGUga2V5IHNpZ25hdHVyZXMgZm9yIHRoZSBuZXcgcGFydFxyXG4gICAgaW5zdEtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IG51bUtleSA9IHBhcnNlSW50KGtleSwgMTApO1xyXG4gICAgICBjb25zdCBpbnN0ID0gc3RhZmYubWVhc3VyZUluc3RydW1lbnRNYXBbbnVtS2V5XTtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9ucyA9IFNtb1NlbGVjdGlvbi5pbm5lclNlbGVjdGlvbnModGhpcy5zdG9yZVNjb3JlLCBpbnN0LnN0YXJ0U2VsZWN0b3IsIGluc3QuZW5kU2VsZWN0b3IpO1xyXG4gICAgICBTbW9PcGVyYXRpb24uY2hhbmdlSW5zdHJ1bWVudChpbnN0LCB0aGlzLnN0b3JlU2NvcmUsIHNlbGVjdGlvbnMpO1xyXG4gICAgfSlcclxuICAgIGlmIChpbnN0cnVtZW50LnN0YWZmSWQgPiAwKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc3RvcmVTY29yZSwgaW5zdHJ1bWVudC5zdGFmZklkIC0gMSwgMCk7XHJcbiAgICAgIGNvbnN0IHNlbCA9IFNtb1NlbGVjdG9yLmRlZmF1bHQ7XHJcbiAgICAgIHNlbC5zdGFmZiA9IGluc3RydW1lbnQuc3RhZmZJZCAtIDE7XHJcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgICBsZXQgZ3JwID0gdGhpcy5zdG9yZVNjb3JlLmdldFN5c3RlbUdyb3VwRm9yU3RhZmYoc2VsZWN0aW9uKTtcclxuICAgICAgICBpZiAoZ3JwKSB7XHJcbiAgICAgICAgICBncnAuZW5kU2VsZWN0b3Iuc3RhZmYgPSBpbnN0cnVtZW50LnN0YWZmSWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBncnAgPSBuZXcgU21vU3lzdGVtR3JvdXAoU21vU3lzdGVtR3JvdXAuZGVmYXVsdHMpO1xyXG4gICAgICAgICAgZ3JwLnN0YXJ0U2VsZWN0b3Iuc3RhZmYgPSBpbnN0cnVtZW50LnN0YWZmSWQgLSAxO1xyXG4gICAgICAgICAgZ3JwLmVuZFNlbGVjdG9yLnN0YWZmID0gaW5zdHJ1bWVudC5zdGFmZklkO1xyXG4gICAgICAgICAgdGhpcy5zdG9yZVNjb3JlLnN5c3RlbUdyb3Vwcy5wdXNoKGdycCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnZpZXdBbGwoKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHBhcnQgaW5mbyBhc3N1bWVzIHRoYXQgdGhlIHBhcnQgaXMgY3VycmVudGx5IGV4cG9zZWQgLSB0aGF0XHJcbiAgICogc3RhZmYgMCBpcyB0aGUgZmlyc3Qgc3RhZmYgaW4gdGhlIHBhcnQgcHJpb3IgdG8gZWRpdGluZy5cclxuICAgKiBAcGFyYW0gaW5mb1xyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZVBhcnRJbmZvKGluZm86IFNtb1BhcnRJbmZvKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnVXBkYXRlIHBhcnQgaW5mbycpO1xyXG4gICAgY29uc3Qgc3RvcmVTdGFmZiA9IHRoaXMuc3RhZmZNYXBbMF0gLSBpbmZvLnN0YXZlc0JlZm9yZTtcclxuICAgIGNvbnN0IHBhcnRMZW5ndGggPSBpbmZvLnN0YXZlc0JlZm9yZSArIGluZm8uc3RhdmVzQWZ0ZXIgKyAxO1xyXG4gICAgY29uc3QgcmVzZXRWaWV3ID0gIVNtb0xheW91dE1hbmFnZXIuYXJlTGF5b3V0c0VxdWFsKGluZm8ubGF5b3V0TWFuYWdlci5nZXRHbG9iYWxMYXlvdXQoKSwgdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyIS5nZXRHbG9iYWxMYXlvdXQoKSk7XHJcbiAgICBjb25zdCByZXN0Q2hhbmdlID0gdGhpcy5zY29yZS5zdGF2ZXNbMF0ucGFydEluZm8uZXhwYW5kTXVsdGltZWFzdXJlUmVzdHMgIT0gaW5mby5leHBhbmRNdWx0aW1lYXN1cmVSZXN0cztcclxuICAgIGNvbnN0IHN0YXZlc0NoYW5nZSA9IHRoaXMuc2NvcmUuc3RhdmVzWzBdLnBhcnRJbmZvLnN0YXZlc0FmdGVyICE9PSBpbmZvLnN0YXZlc0FmdGVyO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHBhcnRMZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBuU3RhZmZJbmRleCA9IHN0b3JlU3RhZmYgKyBpO1xyXG4gICAgICBjb25zdCBuSW5mbyA9IG5ldyBTbW9QYXJ0SW5mbyhpbmZvKTtcclxuICAgICAgbkluZm8uc3RhdmVzQmVmb3JlID0gaTtcclxuICAgICAgbkluZm8uc3RhdmVzQWZ0ZXIgPSBwYXJ0TGVuZ3RoIC0gaSAtIDE7XHJcbiAgICAgIHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbblN0YWZmSW5kZXhdLnBhcnRJbmZvID0gbkluZm87XHJcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBuZXh0IHN0YXZlIGluIHRoZSBzY29yZSBoYXMgdGhlIGNvcnJlY3QgJ3N0YXZlcyBiZWZvcmUnIHNldHRpbmdcclxuICAgICAgaWYgKHRoaXMuc3RvcmVTY29yZS5zdGF2ZXMubGVuZ3RoID4gblN0YWZmSW5kZXggKyAxKSB7XHJcbiAgICAgICAgaWYgKG5JbmZvLnN0YXZlc0FmdGVyID09PSAwKSB7XHJcbiAgICAgICAgICBjb25zdCBuZXh0U3RhZmYgPSB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW25TdGFmZkluZGV4ICsgMV07XHJcbiAgICAgICAgICBuZXh0U3RhZmYucGFydEluZm8uc3RhdmVzQmVmb3JlID0gMDtcclxuICAgICAgICAgIGNvbnN0IG5leHRTdGFmZkRpc3BsYXlJbmRleCA9IHRoaXMuc3RhZmZNYXAuZmluZEluZGV4KCh4KSA9PiB4ID09PSBuU3RhZmZJbmRleCArIDEpO1xyXG4gICAgICAgICAgaWYgKG5leHRTdGFmZkRpc3BsYXlJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NvcmUuc3RhdmVzW25leHRTdGFmZkRpc3BsYXlJbmRleF0ucGFydEluZm8gPSBcclxuICAgICAgICAgICAgICBuZXcgU21vUGFydEluZm8obmV4dFN0YWZmLnBhcnRJbmZvKTsgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIElmIHRoZSBzdGFmZiBpbmRleCBpcyBjdXJyZW50bHkgZGlzcGxheWVkLCBcclxuICAgICAgY29uc3QgZGlzcGxheWVkSW5kZXggPSB0aGlzLnN0YWZmTWFwLmZpbmRJbmRleCgoeCkgPT4geCA9PT0gblN0YWZmSW5kZXgpO1xyXG4gICAgICBpZiAoZGlzcGxheWVkSW5kZXggPj0gMCkge1xyXG4gICAgICAgIHRoaXMuc2NvcmUuc3RhdmVzW2Rpc3BsYXllZEluZGV4XS5wYXJ0SW5mbyA9IG5ldyBTbW9QYXJ0SW5mbyhuSW5mbyk7XHJcbiAgICAgICAgdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyID0gbkluZm8ubGF5b3V0TWFuYWdlcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHJlc2V0VmlldyB8fCByZXN0Q2hhbmdlIHx8IHN0YXZlc0NoYW5nZSkge1xyXG4gICAgICBTbW9PcGVyYXRpb24uY29tcHV0ZU11bHRpcGFydFJlc3QodGhpcy5zY29yZSk7XHJcbiAgICAgIC8vIHRoaXMucmVzZXRQYXJ0VmlldygpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyQWxsKClcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSBzaW1wbGVyIEFQSSBmb3IgYXBwbGljYXRpb25zIHRvIGFkZCBhIG5ldyBzdGFmZiB0byB0aGUgc2NvcmUuXHJcbiAgICogQHBhcmFtIHBhcmFtcyAtIHRoZSBpbnN0cnVtZW50LCB3aGljaCBkZXRlcm1pbmVzIGNsZWYsIGV0Yy5cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBhZGRTdGFmZlNpbXBsZShwYXJhbXM6IFBhcnRpYWw8U21vSW5zdHJ1bWVudFBhcmFtcz4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGluc3RydW1lbnRQYXJhbXMgPSBTbW9JbnN0cnVtZW50LmRlZmF1bHRzO1xyXG4gICAgaW5zdHJ1bWVudFBhcmFtcy5zdGFydFNlbGVjdG9yLnN0YWZmID0gaW5zdHJ1bWVudFBhcmFtcy5lbmRTZWxlY3Rvci5zdGFmZiA9IHRoaXMuc2NvcmUuc3RhdmVzLmxlbmd0aDtcclxuICAgIGluc3RydW1lbnRQYXJhbXMuY2xlZiA9IHBhcmFtcy5jbGVmID8/IGluc3RydW1lbnRQYXJhbXMuY2xlZjtcclxuXHJcbiAgICBjb25zdCBzdGFmZlBhcmFtcyA9IFNtb1N5c3RlbVN0YWZmLmRlZmF1bHRzO1xyXG4gICAgc3RhZmZQYXJhbXMuc3RhZmZJZCA9IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXMubGVuZ3RoOyAvLyBhZGQgYSBzdGFmZlxyXG4gICAgc3RhZmZQYXJhbXMubWVhc3VyZUluc3RydW1lbnRNYXBbMF0gPSBuZXcgU21vSW5zdHJ1bWVudChpbnN0cnVtZW50UGFyYW1zKTtcclxuICAgIHRoaXMuYWRkU3RhZmYoc3RhZmZQYXJhbXMpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTYXZlIHRoZSBzY29yZSB0byBsb2NhbCBzdG9yYWdlLlxyXG4gICAqL1xyXG4gIHF1aWNrU2F2ZSgpIHtcclxuICAgIGNvbnN0IHNjb3JlU3RyID0gSlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZVNjb3JlLnNlcmlhbGl6ZSgpKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHNtb1NlcmlhbGl6ZS5sb2NhbFNjb3JlLCBzY29yZVN0cik7XHJcbiAgfVxyXG4gIHVwZGF0ZVJlcGVhdENvdW50KGNvdW50OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdyZXBlYXQgYmFyJyk7XHJcbiAgICBjb25zdCBzeW1ib2wgPSBjb3VudCA+IDAgPyB0cnVlIDogZmFsc2U7ICAgIFxyXG4gICAgbWVhc3VyZVNlbGVjdGlvbnMuZm9yRWFjaCgobXMpID0+IHtcclxuICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKG1zKTtcclxuICAgICAgbXMubWVhc3VyZS5yZXBlYXRDb3VudCA9IGNvdW50O1xyXG4gICAgICBtcy5tZWFzdXJlLnJlcGVhdFN5bWJvbCA9IHN5bWJvbDtcclxuICAgICAgaWYgKHN0b3JlKSB7XHJcbiAgICAgICAgc3RvcmUubWVhc3VyZS5yZXBlYXRDb3VudCA9IGNvdW50O1xyXG4gICAgICAgIHN0b3JlLm1lYXN1cmUucmVwZWF0U3ltYm9sID0gc3ltYm9sO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICByZXR1cm4gdGhpcy51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgbWVhc3VyZSBmb3JtYXR0aW5nIHBhcmFtZXRlcnMgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvblxyXG4gICAqIEBwYXJhbSBmb3JtYXQgZ2VuZXJpYyBtZWFzdXJlIGZvcm1hdHRpbmcgcGFyYW1ldGVyc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHNldE1lYXN1cmVGb3JtYXQoZm9ybWF0OiBTbW9NZWFzdXJlRm9ybWF0KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGxhYmVsID0gJ3NldCBtZWFzdXJlIGZvcm1hdCc7XHJcbiAgICBjb25zdCBmcm9tU2VsZWN0b3IgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigtMSkuc2VsZWN0b3I7XHJcbiAgICBjb25zdCB0b1NlbGVjdG9yID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oMSkuc2VsZWN0b3I7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5nZXRTZWxlY3RlZE1lYXN1cmVzKCk7XHJcbiAgICAvLyBJZiB0aGUgZm9ybWF0dGluZyBpcyBvbiBhIHBhcnQsIHByZXNlcnZlIGl0IGluIHRoZSBwYXJ0J3MgaW5mb1xyXG4gICAgY29uc3QgaXNQYXJ0ID0gdGhpcy5pc1BhcnRFeHBvc2VkKCk7XHJcbiAgICBtZWFzdXJlU2VsZWN0aW9ucy5mb3JFYWNoKChtKSA9PiB7XHJcbiAgICAgIHRoaXMuX3VuZG9Db2x1bW4obGFiZWwsIG0uc2VsZWN0b3IubWVhc3VyZSk7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5zZXRNZWFzdXJlRm9ybWF0KHRoaXMuc2NvcmUsIG0sIGZvcm1hdCk7XHJcbiAgICAgIGlmIChpc1BhcnQpIHtcclxuICAgICAgICBtLnN0YWZmLnBhcnRJbmZvLm1lYXN1cmVGb3JtYXR0aW5nW20ubWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleF0gPSBuZXcgU21vTWVhc3VyZUZvcm1hdChmb3JtYXQpO1xyXG4gICAgICAgIGNvbnN0IGFsdCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24obSk7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVGb3JtYXQodGhpcy5zdG9yZVNjb3JlLCBhbHQhLCBmb3JtYXQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIElmIHdlIGFyZSBzZWVpbmcgc29tZSBzZXQgb2Ygc3RhdmVzIHRoYXQgaXMgbm90IGEgcGFydCwgbWFrZSBzdXJlIHRoZSB3aG9sZSBjb2x1bW4gaW4gdGhlIFxyXG4gICAgICAgIC8vIHNjb3JlIGlzIHVwZGF0ZWQuXHJcbiAgICAgICAgY29uc3QgZmlyc3RSb3cgPSBTbW9TZWxlY3Rpb24uc2VsZWN0aW9uRnJvbVNlbGVjdG9yKFxyXG4gICAgICAgICAgdGhpcy5zdG9yZVNjb3JlLCB7XHJcbiAgICAgICAgICAgIHN0YWZmOiAwLCBtZWFzdXJlOiBtLnNlbGVjdG9yLm1lYXN1cmUsIHZvaWNlOiBtLnNlbGVjdG9yLnZvaWNlLCB0aWNrOiBtLnNlbGVjdG9yLnRpY2ssIHBpdGNoZXM6IFtdIH1cclxuICAgICAgICApXHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVGb3JtYXQodGhpcy5zdG9yZVNjb3JlLCBmaXJzdFJvdyEsIGZvcm1hdCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYWx0ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihtKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVGb3JtYXQodGhpcy5zdG9yZVNjb3JlLCBhbHQhLCBmb3JtYXQpO1xyXG4gICAgICBpZiAoaXNQYXJ0KSB7XHJcbiAgICAgICAgYWx0IS5zdGFmZi5wYXJ0SW5mby5tZWFzdXJlRm9ybWF0dGluZ1ttLm1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXhdID0gbmV3IFNtb01lYXN1cmVGb3JtYXQoZm9ybWF0KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJSZWN0YW5nbGUoZnJvbVNlbGVjdG9yLCB0b1NlbGVjdG9yKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHN5c3RlbSBicmVha3MgZnJvbSB0aGUgbWVhc3VyZSBmb3JtYXR0aW5nIGZvciBzZWxlY3RlZCBtZWFzdXJlc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHJlbW92ZVN5c3RlbUJyZWFrcygpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgbGFiZWwgPSAnc2V0IG1lYXN1cmUgZm9ybWF0JztcclxuICAgIGNvbnN0IGZyb21TZWxlY3RvciA9IHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKS5zZWxlY3RvcjtcclxuICAgIGNvbnN0IHRvU2VsZWN0b3IgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKS5zZWxlY3RvcjtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkTWVhc3VyZXMoKTtcclxuICAgIC8vIElmIHRoZSBmb3JtYXR0aW5nIGlzIG9uIGEgcGFydCwgcHJlc2VydmUgaXQgaW4gdGhlIHBhcnQncyBpbmZvXHJcbiAgICBjb25zdCBpc1BhcnQgPSB0aGlzLmlzUGFydEV4cG9zZWQoKTtcclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKG0pID0+IHtcclxuICAgICAgdGhpcy5fdW5kb0NvbHVtbihsYWJlbCwgbS5zZWxlY3Rvci5tZWFzdXJlKTtcclxuICAgICAgY29uc3QgZm9ybWF0ID0gbmV3IFNtb01lYXN1cmVGb3JtYXQobS5tZWFzdXJlLmZvcm1hdCk7XHJcbiAgICAgIGZvcm1hdC5zeXN0ZW1CcmVhayA9IGZhbHNlO1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0TWVhc3VyZUZvcm1hdCh0aGlzLnNjb3JlLCBtLCBmb3JtYXQpO1xyXG4gICAgICBpZiAoaXNQYXJ0KSB7XHJcbiAgICAgICAgbS5zdGFmZi5wYXJ0SW5mby5tZWFzdXJlRm9ybWF0dGluZ1ttLm1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXhdID0gbmV3IFNtb01lYXN1cmVGb3JtYXQoZm9ybWF0KTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhbHQgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKG0pO1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0TWVhc3VyZUZvcm1hdCh0aGlzLnN0b3JlU2NvcmUsIGFsdCEsIGZvcm1hdCk7XHJcbiAgICAgIGlmIChpc1BhcnQpIHtcclxuICAgICAgICBhbHQhLnN0YWZmLnBhcnRJbmZvLm1lYXN1cmVGb3JtYXR0aW5nW20ubWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleF0gPSBuZXcgU21vTWVhc3VyZUZvcm1hdChmb3JtYXQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlclJlY3RhbmdsZShmcm9tU2VsZWN0b3IsIHRvU2VsZWN0b3IpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICByZW51bWJlck1lYXN1cmVzKG1lYXN1cmVJbmRleDogbnVtYmVyLCBkaXNwbGF5SW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zY29yZS51cGRhdGVSZW51bWJlcmluZ01hcChtZWFzdXJlSW5kZXgsIGRpc3BsYXlJbmRleCk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUudXBkYXRlUmVudW1iZXJpbmdNYXAobWVhc3VyZUluZGV4LCBkaXNwbGF5SW5kZXgpO1xyXG4gICAgY29uc3QgbW1zZWwgPSBTbW9TZWxlY3Rpb24ubWVhc3VyZVNlbGVjdGlvbih0aGlzLnNjb3JlLCAwLCBtZWFzdXJlSW5kZXgpO1xyXG4gICAgaWYgKG1tc2VsKSB7XHJcbiAgICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbbW1zZWxdKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUGxheSB0aGUgbXVzaWMgZnJvbSB0aGUgc3RhcnRpbmcgc2VsZWN0aW9uXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgcGxheUZyb21TZWxlY3Rpb24oKSB7XHJcbiAgICB2YXIgbW0gPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigtMSk7XHJcbiAgICBpZiAoU3VpQXVkaW9QbGF5ZXIucGxheWluZ0luc3RhbmNlICYmIFN1aUF1ZGlvUGxheWVyLnBsYXlpbmdJbnN0YW5jZS5wYXVzZWQpIHtcclxuICAgICAgU3VpQXVkaW9QbGF5ZXIucGxheWluZ0luc3RhbmNlLnBsYXkoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKFN1aUF1ZGlvUGxheWVyLnBsYXlpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbmV3IFN1aUF1ZGlvUGxheWVyKHsgYXVkaW9BbmltYXRpb246IHRoaXMuYXVkaW9BbmltYXRpb24sIHNjb3JlOiB0aGlzLnNjb3JlLCBzdGFydEluZGV4OiBtbS5zZWxlY3Rvci5tZWFzdXJlLCB2aWV3OiB0aGlzIH0pLnBsYXkoKTtcclxuICB9XHJcbiAgc3RvcFBsYXllcigpIHtcclxuICAgIFN1aUF1ZGlvUGxheWVyLnN0b3BQbGF5ZXIoKTtcclxuICB9XHJcbiAgcGF1c2VQbGF5ZXIoKSB7XHJcbiAgICBTdWlBdWRpb1BsYXllci5wYXVzZVBsYXllcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJveHkgY2FsbHMgdG8gbW92ZSB0aGUgdHJhY2tlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byB0aGVcclxuICAgKiBydWxlcyBvZiB0aGUgJ0hvbWUnIGtleSAoZGVwZW5kaW5nIG9uIHNoaWZ0L2N0cmwvYWx0KVxyXG4gICAqIEBwYXJhbSBldiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlSG9tZShldjogS2V5RXZlbnQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLm1vdmVIb21lKGV2KTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQcm94eSBjYWxscyB0byBtb3ZlIHRoZSB0cmFja2VyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHRoZVxyXG4gICAqIHJ1bGVzIG9mIHRoZSAnRW5kJyBrZXkgKGRlcGVuZGluZyBvbiBzaGlmdC9jdHJsL2FsdClcclxuICAgKiBAcGFyYW0gZXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgIGFzeW5jIG1vdmVFbmQoZXY6IEtleUV2ZW50KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlRW5kKGV2KTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHcm93IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSBvbmUgdG8gdGhlIGxlZnQsIGlmIHBvc3NpYmxlXHJcbiAgICogQHBhcmFtIGV2IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gICBhc3luYyBncm93U2VsZWN0aW9uTGVmdCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmdyb3dTZWxlY3Rpb25MZWZ0KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR3JvdyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgb25lIHRvIHRoZSByaWdodCwgaWYgcG9zc2libGVcclxuICAgKiBAcGFyYW0gZXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgIGFzeW5jIGdyb3dTZWxlY3Rpb25SaWdodCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmdyb3dTZWxlY3Rpb25SaWdodCgpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNlbGVjdCB0aGUgbmV4dCB0YWJiYWJsZSBtb2RpZmllciBuZWFyIG9uZSBvZiB0aGUgc2VsZWN0ZWQgbm90ZXNcclxuICAgKiBAcGFyYW0ga2V5RXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgYWR2YW5jZU1vZGlmaWVyU2VsZWN0aW9uKGtleUV2OiBLZXlFdmVudCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIuYWR2YW5jZU1vZGlmaWVyU2VsZWN0aW9uKGtleUV2KTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZWxlY3QgdGhlIG5leHQgZW50aXJlIG1lYXN1cmUsIGlmIHBvc3NpYmxlXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgZ3Jvd1NlbGVjdGlvblJpZ2h0TWVhc3VyZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmdyb3dTZWxlY3Rpb25SaWdodE1lYXN1cmUoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZHZhbmNlIGN1cnNvciBmb3J3YXJkcywgaWYgcG9zc2libGVcclxuICAgKiBAcGFyYW0gZXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgbW92ZVNlbGVjdGlvblJpZ2h0KCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIubW92ZVNlbGVjdGlvblJpZ2h0KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWR2YW5jZSBjdXJzb3IgYmFja3dhcmRzLCBpZiBwb3NzaWJsZVxyXG4gICAqIEBwYXJhbSBldiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uTGVmdCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLm1vdmVTZWxlY3Rpb25MZWZ0KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWR2YW5jZSBjdXJzb3IgYmFjayBlbnRpcmUgbWVhc3VyZSwgaWYgcG9zc2libGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uTGVmdE1lYXN1cmUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uTGVmdE1lYXN1cmUoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZHZhbmNlIGN1cnNvciBmb3J3YXJkIG9uZSBtZWFzdXJlLCBpZiBwb3NzaWJsZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIG1vdmVTZWxlY3Rpb25SaWdodE1lYXN1cmUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uUmlnaHRNZWFzdXJlKCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTW92ZSBjdXJzb3IgdG8gYSBoaWdoZXIgcGl0Y2ggaW4gdGhlIGN1cnJlbnQgY2hvcmQsIHdpdGggd3JhcFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIG1vdmVTZWxlY3Rpb25QaXRjaFVwKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIubW92ZVNlbGVjdGlvblBpdGNoVXAoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBNb3ZlIGN1cnNvciB0byBhIGxvd2VyIHBpdGNoIGluIHRoZSBjdXJyZW50IGNob3JkLCB3aXRoIHdyYXBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uUGl0Y2hEb3duKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIubW92ZVNlbGVjdGlvblBpdGNoRG93bigpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE1vdmUgY3Vyc29yIHVwIGEgc3RhZmYgaW4gdGhlIHN5c3RlbSwgaWYgcG9zc2libGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uVXAoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uVXAoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBNb3ZlIGN1cnNvciBkb3duIGEgc3RhZmYgaW4gdGhlIHN5c3RlbSwgaWYgcG9zc2libGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICAgYXN5bmMgbW92ZVNlbGVjdGlvbkRvd24oKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uRG93bigpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgY3VycmVudCBzdWdnZXN0aW9ucyAoaG92ZXIgZWxlbWVudCkgYXMgdGhlIHNlbGVjdGlvblxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gICBhc3luYyBzZWxlY3RTdWdnZXN0aW9uKGV2RGF0YTogS2V5RXZlbnQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdFN1Z2dlc3Rpb24oZXZEYXRhKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGJveCwgYW5kIG1ha2UgaXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXHJcbiAgICogICovXHJcbiAgYXN5bmMgaW50ZXJzZWN0aW5nQXJ0aWZhY3QoZXZEYXRhOiBTdmdCb3gpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmludGVyc2VjdGluZ0FydGlmYWN0KGV2RGF0YSk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9ICBcclxufVxyXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/render/sui/scoreViewOperations.ts\n\n}");
1350
+ 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 let altSelector = JSON.parse(JSON.stringify(selector));\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 altSelector.staff = this.staffMap[selector.staff];\n }\n if (!ogText) {\n return;\n }\n // We undo buffer using the score location, not the group location\n this.storeUndo.addBuffer('remove text group', bufType, altSelector, 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 if (altGroup.selector) {\n altGroup.selector.staff = altSelector.staff;\n }\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; // for score view\n const altSelector = JSON.parse(JSON.stringify(selector)); // for full score\n const isPartExposed = this.isPartExposed();\n const partInfo = this.score.staves[0].partInfo;\n // If this text was attached to a staff that is not in the part, ignore the update\n if (newVersion.selector && newVersion.selector.staff >= this.score.staves.length) {\n return;\n }\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 altSelector.staff = this.staffMap[0];\n }\n else {\n altSelector.staff = this.staffMap[selector.staff];\n }\n this.storeUndo.addBuffer('modify text', bufType, altSelector, 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 if (altNew.selector) {\n altNew.selector.staff = altSelector.staff;\n }\n this.score.updateTextGroup(newVersion, true);\n // If this is part text and part-specific text is set, \n // only set the partInfo for the stored score, but don't add to \n // global text.\n if (isPartExposed) {\n // Update the full score copy for this part\n const partInfo = this.storeScore.staves[altSelector.staff].partInfo;\n partInfo.updateTextGroup(altNew, true);\n const displayPartInfo = this.score.staves[0].partInfo;\n displayPartInfo.updateTextGroup(newVersion, true);\n }\n else {\n this.storeScore.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 this.storeScore.setNonTransposing();\n }\n else if (curXpose === true && oldXpose === false) {\n this.score.setTransposing();\n this.storeScore.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 // Make sure all the notes in the measure after the change are updated. \n // We only need to do this for the displayed score, not the storeScore.\n _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections).forEach((ms) => {\n ms.measure.updateClefChangeNotes();\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 current selection\n * @param dynamic\n * @returns\n */\n removeDynamic(dynamic) {\n return __awaiter(this, void 0, void 0, function* () {\n const measures = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.getMeasureList(this.tracker.selections);\n for (let j = 0; j < this.tracker.selections.length; ++j) {\n const selection = this.tracker.selections[j];\n if (selection) {\n const equiv = this._getEquivalentSelection(selection);\n if ((equiv === null || equiv === void 0 ? void 0 : equiv.note) && selection.note) {\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 }\n }\n this._renderChangedMeasures(measures);\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, this.score, selections);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.changeInstrument(instrument, this.storeScore, 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 removeStaffGroup(staffGroup) {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('ungroup staves');\n this.score.removeSystemGroup(staffGroup);\n this.storeScore.removeSystemGroup(staffGroup);\n this.renderer.setDirty();\n yield this.renderer.updatePromise();\n });\n }\n clearSystemGroups() {\n return __awaiter(this, void 0, void 0, function* () {\n this._undoScore('clear staff groups');\n this.score.clearSystemGroups();\n this.storeScore.clearSystemGroups();\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 let isPercussion = false;\n selections.forEach((selected) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transpose(selected, offset);\n if (selected.staff.getStaffInstrument(selected.selector.measure).isPercussion) {\n isPercussion = true;\n }\n const altSel = this._getEquivalentSelection(selected);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.transpose(altSel, offset);\n });\n // if this is percussion, set that property\n if (isPercussion) {\n this.score.setNoteInstrumentProperties();\n this.storeScore.setNoteInstrumentProperties();\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 let isPercussion = false;\n selections.forEach((selected) => {\n const selector = selected.selector;\n if (selected.staff.getStaffInstrument(selected.selector.measure).isPercussion) {\n isPercussion = true;\n }\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 (isPercussion) {\n this.score.setNoteInstrumentProperties();\n this.storeScore.setNoteInstrumentProperties();\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 const startMeasure = pos - (ix - 1);\n const startSelector = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelector.default;\n const endSelector = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelector.default;\n startSelector.measure = startMeasure;\n endSelector.measure = pos;\n this._renderRectangle(startSelector, endSelector);\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 toRemove = [];\n const selectedStaves = {};\n this.tracker.selections.forEach((sel) => {\n const scoreSel = this._getEquivalentSelection(sel);\n if (!selectedStaves[scoreSel.selector.staff]) {\n selectedStaves[scoreSel.selector.staff] = true;\n toRemove.push(scoreSel.selector.staff);\n }\n });\n // Sort in descending order so we don't mess up the staff indices as we remove\n toRemove.sort((a, b) => b - a);\n toRemove.forEach((staffIndex) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.removeStaff(this.storeScore, staffIndex);\n });\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, this.storeScore, 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 this.PartName.value = info.partName;\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 // Make sure that the next stave in the score has the correct 'staves before' setting\n if (this.storeScore.staves.length > nStaffIndex + 1) {\n if (nInfo.stavesAfter === 0) {\n const nextStaff = this.storeScore.staves[nStaffIndex + 1];\n nextStaff.partInfo.stavesBefore = 0;\n const nextStaffDisplayIndex = this.staffMap.findIndex((x) => x === nStaffIndex + 1);\n if (nextStaffDisplayIndex >= 0) {\n this.score.staves[nextStaffDisplayIndex].partInfo =\n new _smo_data_partInfo__WEBPACK_IMPORTED_MODULE_3__.SmoPartInfo(nextStaff.partInfo);\n }\n }\n }\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 const alt = this._getEquivalentSelection(m);\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureFormat(this.storeScore, alt, format);\n }\n else {\n // If we are seeing some set of staves that is not a part, make sure the whole column in the \n // score is updated.\n const firstRow = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_18__.SmoSelection.selectionFromSelector(this.storeScore, {\n staff: 0, measure: m.selector.measure, voice: m.selector.voice, tick: m.selector.tick, pitches: []\n });\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_11__.SmoOperation.setMeasureFormat(this.storeScore, firstRow, 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, displayIndex) {\n this.score.updateRenumberingMap(measureIndex, displayIndex);\n this.storeScore.updateRenumberingMap(measureIndex, displayIndex);\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 return __awaiter(this, void 0, void 0, function* () {\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 }\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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SSxpQkFBaUI7O1lBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEMsQ0FBQztLQUFBO0lBQ0Q7OztPQUdHO0lBQ0ksZ0JBQWdCLENBQUMsTUFBZ0I7O1lBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3RDLENBQUM7S0FBQTtJQUNEOztVQUVNO0lBQ0Esb0JBQW9CLENBQUMsTUFBYzs7WUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEMsQ0FBQztLQUFBO0NBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvcmVuZGVyL3N1aS9zY29yZVZpZXdPcGVyYXRpb25zLnRzP2NmNDciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gW1Ntb29zaWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BYXJvbkRhdmlkTmV3bWFuL1Ntb29zaWMpXHJcbi8vIENvcHlyaWdodCAoYykgQWFyb24gRGF2aWQgTmV3bWFuIDIwMjEuXHJcbmltcG9ydCB7IFN1aVNjb3JlVmlldywgdXBkYXRlU3RhZmZNb2RpZmllckZ1bmMgfSBmcm9tICcuL3Njb3JlVmlldyc7XHJcbmltcG9ydCB7IFNtb1Njb3JlLCBlbmdyYXZpbmdGb250VHlwZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3Njb3JlJztcclxuaW1wb3J0IHsgU21vU3lzdGVtU3RhZmZQYXJhbXMsIFNtb1N5c3RlbVN0YWZmIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc3lzdGVtU3RhZmYnO1xyXG5pbXBvcnQgeyBTbW9QYXJ0SW5mbyB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3BhcnRJbmZvJztcclxuaW1wb3J0IHsgU21vTWVhc3VyZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL21lYXN1cmUnO1xyXG5pbXBvcnQgeyBTbW9Ob3RlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbm90ZSc7XHJcbmltcG9ydCB7IEtleUV2ZW50LCBTdmdCb3gsIFBpdGNoLCBQaXRjaExldHRlciwgUmVtb3ZlRWxlbWVudExpa2UsIEVsZW1lbnRMaWtlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvY29tbW9uJztcclxuaW1wb3J0IHsgU21vUmVuZGVyQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IFNtb1N5c3RlbUdyb3VwLCBTbW9QYWdlTGF5b3V0LCBTbW9HbG9iYWxMYXlvdXQsIFNtb0xheW91dE1hbmFnZXIsIFNtb0F1ZGlvUGxheWVyU2V0dGluZ3MsXHJcbiAgU21vU2NvcmVQcmVmZXJlbmNlcywgU21vU2NvcmVJbmZvIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc2NvcmVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9UZXh0R3JvdXAgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zY29yZVRleHQnO1xyXG5pbXBvcnQgeyBTbW9EeW5hbWljVGV4dCwgU21vTm90ZU1vZGlmaWVyQmFzZSwgU21vR3JhY2VOb3RlLCBTbW9BcnRpY3VsYXRpb24sIFxyXG4gIFNtb09ybmFtZW50LCBTbW9MeXJpYywgU21vTWljcm90b25lLCBTbW9BcnBlZ2dpbywgU21vQXJwZWdnaW9UeXBlLCBTbW9DbGVmQ2hhbmdlLCBcclxuICBTbW9UYWJOb3RlfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9ub3RlTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgU21vVGVtcG9UZXh0LCBTbW9Wb2x0YSwgU21vQmFybGluZSwgU21vUmVwZWF0U3ltYm9sLCBcclxuICBTbW9SZWhlYXJzYWxNYXJrLCBTbW9NZWFzdXJlRm9ybWF0LCBUaW1lU2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFVuZG9CdWZmZXIgfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vdW5kbyc7XHJcbmltcG9ydCB7XHJcbiAgU21vT3BlcmF0aW9uLCBjcmVhdGVTdGFmZk1vZGlmaWVyVHlwZSwgTWFrZVR1cGxldE9wZXJhdGlvblxyXG59IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9vcGVyYXRpb25zJztcclxuaW1wb3J0IHsgQmF0Y2hTZWxlY3Rpb25PcGVyYXRpb24gfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vb3BlcmF0aW9ucyc7XHJcbmltcG9ydCB7IHNtb1NlcmlhbGl6ZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZXJpYWxpemF0aW9uSGVscGVycyc7XHJcbmltcG9ydCB7IEZvbnRJbmZvIH0gZnJvbSAnLi4vLi4vY29tbW9uL3ZleCc7XHJcbmltcG9ydCB7IFNtb011c2ljIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbXVzaWMnO1xyXG5pbXBvcnQgeyBTdWlPc2NpbGxhdG9yIH0gZnJvbSAnLi4vYXVkaW8vb3NjaWxsYXRvcic7XHJcbmltcG9ydCB7IFhtbFRvU21vIH0gZnJvbSAnLi4vLi4vc21vL214bWwveG1sVG9TbW8nO1xyXG5pbXBvcnQgeyBTdWlBdWRpb1BsYXllciB9IGZyb20gJy4uL2F1ZGlvL3BsYXllcic7XHJcbmltcG9ydCB7IFN1aVhockxvYWRlciB9IGZyb20gJy4uLy4uL3VpL2ZpbGVpby94aHJMb2FkZXInO1xyXG5pbXBvcnQgeyBTbW9TZWxlY3Rpb24sIFNtb1NlbGVjdG9yIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL3NlbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBTdGFmZk1vZGlmaWVyQmFzZSwgXHJcbiAgIFNtb0luc3RydW1lbnQsIFNtb0luc3RydW1lbnRQYXJhbXMsIFNtb1N0YWZmVGV4dEJyYWNrZXQsIFNtb1RhYlN0YXZlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc3RhZmZNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTdWlQaWFubyB9IGZyb20gJy4vcGlhbm8nO1xyXG5pbXBvcnQgeyBTdmdIZWxwZXJzIH0gZnJvbSAnLi9zdmdIZWxwZXJzJztcclxuaW1wb3J0IHsgUHJvbWlzZUhlbHBlcnMgfSBmcm9tICcuLi8uLi9jb21tb24vcHJvbWlzZUhlbHBlcnMnO1xyXG5pbXBvcnQgeyBwYXJzZUpzb25UZXh0IH0gZnJvbSAndHlwZXNjcmlwdCc7XHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuZGVjbGFyZSB2YXIgU21vQ29uZmlnOiBTbW9SZW5kZXJDb25maWd1cmF0aW9uO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBNVlZNLWxpa2Ugb3BlcmF0aW9ucyBvbiB0aGUgZGlzcGxheWVkIHNjb3JlLlxyXG4gKiBcclxuICogQWxsIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGEgJ2xpdmUnIHNjb3JlIGdvIHRocm91Z2ggdGhpc1xyXG4gKiBtb2R1bGUuICBJdCBtYXBzIHRoZSBzY29yZSB2aWV3IHRvIHRoZSBhY3R1YWwgc2NvcmUgYW5kIG1ha2VzIHN1cmUgdGhlXHJcbiAqIG1vZGVsIGFuZCB2aWV3IHN0YXkgaW4gc3luYy4gIFxyXG4gKiBcclxuICogQmVjYXVzZSB0aGlzIG9iamVjdCBvcGVyYXRlcyBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb25zLCBcclxuICogYWxsIG9wZXJhdGlvbnMgcmV0dXJuIHByb21pc2Ugc28gYXBwbGljYXRpb25zIGNhbiB3YWl0IGZvciB0aGUgXHJcbiAqIG9wZXJhdGlvbiB0byBjb21wbGV0ZSBhbmQgdXBkYXRlIHRoZSBzZWxlY3Rpb24gbGlzdC5cclxuICogQGNhdGVnb3J5IFN1aVJlbmRlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVNjb3JlVmlld09wZXJhdGlvbnMgZXh0ZW5kcyBTdWlTY29yZVZpZXcge1xyXG4gIC8qKlxyXG4gICAqIEFkZCBhIG5ldyB0ZXh0IGdyb3VwIHRvIHRoZSBzY29yZSBcclxuICAgKiBAcGFyYW0gdGV4dEdyb3VwIGEgbmV3IHRleHQgZ3JvdXBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBhZGRUZXh0R3JvdXAodGV4dEdyb3VwOiBTbW9UZXh0R3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGFsdE5ldyA9IFNtb1RleHRHcm91cC5kZXNlcmlhbGl6ZVByZXNlcnZlSWQodGV4dEdyb3VwLnNlcmlhbGl6ZSgpKTtcclxuICAgIGNvbnN0IGlzUGFydEV4cG9zZWQgPSB0aGlzLmlzUGFydEV4cG9zZWQoKTtcclxuICAgIGxldCBzZWxlY3RvciA9IHRleHRHcm91cC5zZWxlY3RvciA/PyBTbW9TZWxlY3Rvci5kZWZhdWx0O1xyXG4gICAgY29uc3QgcGFydEluZm8gPSB0aGlzLnNjb3JlLnN0YXZlc1swXS5wYXJ0SW5mbztcclxuICAgIGNvbnN0IGJ1ZlR5cGUgPSBpc1BhcnRFeHBvc2VkICYmIHBhcnRJbmZvLnByZXNlcnZlVGV4dEdyb3Vwc1xyXG4gICAgICA/IFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuUEFSVF9NT0RJRklFUiA6IFVuZG9CdWZmZXIuYnVmZmVyVHlwZXMuU0NPUkVfTU9ESUZJRVI7XHJcbiAgICBpZiAoYnVmVHlwZSA9PT0gVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5QQVJUX01PRElGSUVSKSB7XHJcbiAgICAgIHNlbGVjdG9yLnN0YWZmID0gdGhpcy5zdGFmZk1hcFswXTtcclxuICAgIH0gIFxyXG4gICAgdGhpcy5zdG9yZVVuZG8uYWRkQnVmZmVyKCdyZW1vdmUgdGV4dCBncm91cCcsIGJ1ZlR5cGUsXHJcbiAgICAgIHNlbGVjdG9yLCB0ZXh0R3JvdXAsIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuQUREKTtcclxuICAgIGlmIChpc1BhcnRFeHBvc2VkICYmIHBhcnRJbmZvLnByZXNlcnZlVGV4dEdyb3Vwcykge1xyXG4gICAgICB0aGlzLnNjb3JlLnN0YXZlc1swXS5wYXJ0SW5mby51cGRhdGVUZXh0R3JvdXAodGV4dEdyb3VwLCB0cnVlKTtcclxuICAgICAgY29uc3QgcGFydEluZm8gPSB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW3RoaXMuX2dldEVxdWl2YWxlbnRTdGFmZigwKV0ucGFydEluZm87XHJcbiAgICAgIHBhcnRJbmZvLnVwZGF0ZVRleHRHcm91cChhbHROZXcsIHRydWUpOyAgICAgIFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY29yZS51cGRhdGVUZXh0R3JvdXAodGV4dEdyb3VwLCB0cnVlKTtcclxuICAgICAgdGhpcy5zdG9yZVNjb3JlLnVwZGF0ZVRleHRHcm91cChhbHROZXcsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci5yZXJlbmRlclRleHRHcm91cHMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSB0aGUgdGV4dCBncm91cCBmcm9tIHRoZSBzY29yZVxyXG4gICAqIEBwYXJhbSB0ZXh0R3JvdXAgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgcmVtb3ZlVGV4dEdyb3VwKHRleHRHcm91cDogU21vVGV4dEdyb3VwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgc2VsZWN0b3IgPSB0ZXh0R3JvdXAuc2VsZWN0b3IgPz8gU21vU2VsZWN0b3IuZGVmYXVsdDtcclxuICAgIGxldCBhbHRTZWxlY3RvciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc2VsZWN0b3IpKTtcclxuICAgIGNvbnN0IHBhcnRJbmZvID0gdGhpcy5zY29yZS5zdGF2ZXNbMF0ucGFydEluZm87XHJcbiAgICBjb25zdCBpc1BhcnRFeHBvc2VkID0gdGhpcy5pc1BhcnRFeHBvc2VkKCk7XHJcbiAgICBjb25zdCBidWZUeXBlID0gaXNQYXJ0RXhwb3NlZCAmJiBwYXJ0SW5mby5wcmVzZXJ2ZVRleHRHcm91cHMgXHJcbiAgICAgID8gVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5QQVJUX01PRElGSUVSIDogVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5TQ09SRV9NT0RJRklFUjtcclxuICAgIGxldCBvZ1RleHQgPSB0aGlzLnN0b3JlU2NvcmUudGV4dEdyb3Vwcy5maW5kKCh0ZykgPT4gdGcuYXR0cnMuaWQgPT09IHRleHRHcm91cC5hdHRycy5pZCk7XHJcbiAgICBpZiAoaXNQYXJ0RXhwb3NlZCAmJiBwYXJ0SW5mby5wcmVzZXJ2ZVRleHRHcm91cHMpIHtcclxuICAgICAgb2dUZXh0ID0gcGFydEluZm8udGV4dEdyb3Vwcy5maW5kKCh0ZykgPT4gdGcuYXR0cnMuaWQgPT09IHRleHRHcm91cC5hdHRycy5pZCk7XHJcbiAgICB9XHJcbiAgICBpZiAoYnVmVHlwZSA9PT0gVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5QQVJUX01PRElGSUVSKSB7XHJcbiAgICAgIHNlbGVjdG9yLnN0YWZmID0gdGhpcy5zdGFmZk1hcFswXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFsdFNlbGVjdG9yLnN0YWZmID0gdGhpcy5zdGFmZk1hcFtzZWxlY3Rvci5zdGFmZl07XHJcbiAgICB9XHJcbiAgICBpZiAoIW9nVGV4dCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBXZSB1bmRvIGJ1ZmZlciB1c2luZyB0aGUgc2NvcmUgbG9jYXRpb24sIG5vdCB0aGUgZ3JvdXAgbG9jYXRpb25cclxuICAgIHRoaXMuc3RvcmVVbmRvLmFkZEJ1ZmZlcigncmVtb3ZlIHRleHQgZ3JvdXAnLCBidWZUeXBlLFxyXG4gICAgICBhbHRTZWxlY3Rvciwgb2dUZXh0LCBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLlJFTU9WRSk7XHJcbiAgICBjb25zdCBhbHRHcm91cCA9IFNtb1RleHRHcm91cC5kZXNlcmlhbGl6ZVByZXNlcnZlSWQodGV4dEdyb3VwLnNlcmlhbGl6ZSgpKTtcclxuICAgIGlmIChhbHRHcm91cC5zZWxlY3Rvcikge1xyXG4gICAgICBhbHRHcm91cC5zZWxlY3Rvci5zdGFmZiA9IGFsdFNlbGVjdG9yLnN0YWZmO1xyXG4gICAgfVxyXG4gICAgdGV4dEdyb3VwLmVsZW1lbnRzLmZvckVhY2goKGVsOiBFbGVtZW50TGlrZSkgPT4gUmVtb3ZlRWxlbWVudExpa2UoZWwpKTtcclxuICAgIHRleHRHcm91cC5lbGVtZW50cyA9IFtdO1xyXG4gICAgaWYgKGlzUGFydEV4cG9zZWQgJiYgcGFydEluZm8ucHJlc2VydmVUZXh0R3JvdXBzKSB7XHJcbiAgICAgIHBhcnRJbmZvLnVwZGF0ZVRleHRHcm91cCh0ZXh0R3JvdXAsIGZhbHNlKTtcclxuICAgICAgdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1t0aGlzLl9nZXRFcXVpdmFsZW50U3RhZmYoMCldLnBhcnRJbmZvLnVwZGF0ZVRleHRHcm91cChhbHRHcm91cCwgZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY29yZS51cGRhdGVUZXh0R3JvdXAodGV4dEdyb3VwLCBmYWxzZSk7XHJcbiAgICAgIHRoaXMuc3RvcmVTY29yZS51cGRhdGVUZXh0R3JvdXAoYWx0R3JvdXAsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIucmVyZW5kZXJUZXh0R3JvdXBzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVUGRhdGUgYW4gZXhpc3RpbmcgdGV4dCBncm91cC4gIFRoZSBvcmlnaW5hbCBpcyBwYXNzZWQgaW4sIGJlY2F1c2Ugc2luY2UgVEcgbm90IHRpZWQgdG8gYSBtdXNpY2FsXHJcbiAgICogZWxlbWVudCwgd2UgbmVlZCB0byBmaW5kIHRoZSBvbmUgd2UncmUgdXBkYXRpbmcuXHJcbiAgICogQHBhcmFtIG9sZFZlcnNpb24gXHJcbiAgICogQHBhcmFtIG5ld1ZlcnNpb24gXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlVGV4dEdyb3VwKG5ld1ZlcnNpb246IFNtb1RleHRHcm91cCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBuZXdWZXJzaW9uLnNlbGVjdG9yID8/IFNtb1NlbGVjdG9yLmRlZmF1bHQ7IC8vIGZvciBzY29yZSB2aWV3XHJcbiAgICBjb25zdCBhbHRTZWxlY3RvciA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc2VsZWN0b3IpKTsgLy8gZm9yIGZ1bGwgc2NvcmVcclxuICAgIGNvbnN0IGlzUGFydEV4cG9zZWQgPSB0aGlzLmlzUGFydEV4cG9zZWQoKTtcclxuICAgIGNvbnN0IHBhcnRJbmZvID0gdGhpcy5zY29yZS5zdGF2ZXNbMF0ucGFydEluZm87XHJcblxyXG4gICAgLy8gSWYgdGhpcyB0ZXh0IHdhcyBhdHRhY2hlZCB0byBhIHN0YWZmIHRoYXQgaXMgbm90IGluIHRoZSBwYXJ0LCBpZ25vcmUgdGhlIHVwZGF0ZVxyXG4gICAgaWYgKG5ld1ZlcnNpb24uc2VsZWN0b3IgJiYgbmV3VmVyc2lvbi5zZWxlY3Rvci5zdGFmZiA+PSB0aGlzLnNjb3JlLnN0YXZlcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gQmFjayB1cCB0aGUgb3JpZ2luYWwgc2NvcmUgdGV4dFxyXG4gICAgbGV0IG9ndGcgPSB0aGlzLnN0b3JlU2NvcmUudGV4dEdyb3Vwcy5maW5kKCh0ZykgPT4gdGcuYXR0cnMuaWQgPT09IG5ld1ZlcnNpb24uYXR0cnMuaWQpO1xyXG4gICAgaWYgKGlzUGFydEV4cG9zZWQgJiYgcGFydEluZm8ucHJlc2VydmVUZXh0R3JvdXBzKSB7XHJcbiAgICAgIG9ndGcgPSBwYXJ0SW5mby50ZXh0R3JvdXBzLmZpbmQoKHRnKSA9PiB0Zy5hdHRycy5pZCA9PT0gbmV3VmVyc2lvbi5hdHRycy5pZCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIW9ndGcpIHtcclxuICAgICAgLy8gdGhlcmUgaXMgbm90aGluZyB0byB1cGRhdGUsIHJldHVybi5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKG9ndGcpIHtcclxuICAgICAgY29uc3QgYnVmVHlwZSA9IGlzUGFydEV4cG9zZWQgJiYgcGFydEluZm8ucHJlc2VydmVUZXh0R3JvdXBzIFxyXG4gICAgICAgID8gVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5QQVJUX01PRElGSUVSIDogVW5kb0J1ZmZlci5idWZmZXJUeXBlcy5TQ09SRV9NT0RJRklFUjtcclxuICAgICAgLy8gaWYgdGhpcyBpcyBwYXJ0IHRleHQsIG1ha2Ugc3VyZSB0aGUgdW5kbyBidWZmZXIgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJ0IHN0YXZlXHJcbiAgICAgIC8vIGluIHRoZSBmdWxsIHNjb3JlLCBzbyB1bmRvIHdvcmtzIHByb3Blcmx5XHJcbiAgICAgIGlmIChidWZUeXBlID09PSBVbmRvQnVmZmVyLmJ1ZmZlclR5cGVzLlBBUlRfTU9ESUZJRVIpIHtcclxuICAgICAgICBhbHRTZWxlY3Rvci5zdGFmZiA9IHRoaXMuc3RhZmZNYXBbMF07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYWx0U2VsZWN0b3Iuc3RhZmYgPSB0aGlzLnN0YWZmTWFwW3NlbGVjdG9yLnN0YWZmXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnN0b3JlVW5kby5hZGRCdWZmZXIoJ21vZGlmeSB0ZXh0JyxcclxuICAgICAgICBidWZUeXBlLCBhbHRTZWxlY3Rvciwgb2d0ZywgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5VUERBVEUpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYWx0TmV3ID0gU21vVGV4dEdyb3VwLmRlc2VyaWFsaXplUHJlc2VydmVJZChuZXdWZXJzaW9uLnNlcmlhbGl6ZSgpKTtcclxuICAgIGlmIChhbHROZXcuc2VsZWN0b3IpIHtcclxuICAgICAgYWx0TmV3LnNlbGVjdG9yLnN0YWZmID0gYWx0U2VsZWN0b3Iuc3RhZmY7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNjb3JlLnVwZGF0ZVRleHRHcm91cChuZXdWZXJzaW9uLCB0cnVlKTtcclxuICAgIC8vIElmIHRoaXMgaXMgcGFydCB0ZXh0IGFuZCBwYXJ0LXNwZWNpZmljIHRleHQgaXMgc2V0LCBcclxuICAgIC8vIG9ubHkgc2V0IHRoZSBwYXJ0SW5mbyBmb3IgdGhlIHN0b3JlZCBzY29yZSwgYnV0IGRvbid0IGFkZCB0byBcclxuICAgIC8vIGdsb2JhbCB0ZXh0LlxyXG4gICAgaWYgKGlzUGFydEV4cG9zZWQpIHtcclxuICAgICAgLy8gVXBkYXRlIHRoZSBmdWxsIHNjb3JlIGNvcHkgZm9yIHRoaXMgcGFydFxyXG4gICAgICBjb25zdCBwYXJ0SW5mbyA9IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbYWx0U2VsZWN0b3Iuc3RhZmZdLnBhcnRJbmZvO1xyXG4gICAgICBwYXJ0SW5mby51cGRhdGVUZXh0R3JvdXAoYWx0TmV3LCB0cnVlKTtcclxuICAgICAgY29uc3QgZGlzcGxheVBhcnRJbmZvID0gdGhpcy5zY29yZS5zdGF2ZXNbMF0ucGFydEluZm87XHJcbiAgICAgIGRpc3BsYXlQYXJ0SW5mby51cGRhdGVUZXh0R3JvdXAobmV3VmVyc2lvbiwgdHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0b3JlU2NvcmUudXBkYXRlVGV4dEdyb3VwKGFsdE5ldywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBUT0RPOiBvbmx5IHJlbmRlciB0aGUgb25lIFRHLlxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci5yZXJlbmRlclRleHRHcm91cHMoKTtcclxuICAgIC8vIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogbG9hZCBhbiBteG1sIHNjb3JlIHJlbW90ZWx5LCByZXR1cm4gYSBwcm9taXNlIHRoYXQgXHJcbiAgICogY29tcGxldGVzIHdoZW4gdGhlIGZpbGUgaXMgbG9hZGVkXHJcbiAgICogQHBhcmFtIHVybCB3aGVyZSB0byBmaW5kIHRoZSB4bWwgZmlsZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGxvYWRSZW1vdGVYbWwodXJsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgcmVxID0gbmV3IFN1aVhockxvYWRlcih1cmwpO1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAvLyBTaG91bGRuJ3Qgd2UgcmV0dXJuIHByb21pc2Ugb2YgYWN0dWFsbHkgZGlzcGxheWluZyB0aGUgc2NvcmU/XHJcbiAgICBhd2FpdCByZXEubG9hZEFzeW5jKCk7XHJcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICBjb25zdCB4bWwgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlcS52YWx1ZSwgJ3RleHQveG1sJyk7XHJcbiAgICBjb25zdCBzY29yZSA9IFhtbFRvU21vLmNvbnZlcnQoeG1sKTtcclxuICAgIHNjb3JlLmxheW91dE1hbmFnZXIhLnpvb21Ub1dpZHRoKCQoJ2JvZHknKS53aWR0aCgpKTtcclxuICAgIGF3YWl0IHNlbGYuY2hhbmdlU2NvcmUoc2NvcmUpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBsb2FkIGEgcmVtb3RlIHNjb3JlIGluIFNNTyBmb3JtYXRcclxuICAgKiBAcGFyYW0gdXJsIHVybCB0byBmaW5kIHRoZSBzY29yZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGxvYWRSZW1vdGVKc29uKHVybDogc3RyaW5nKSA6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCByZXEgPSBuZXcgU3VpWGhyTG9hZGVyKHVybCk7XHJcbiAgICBhd2FpdCByZXEubG9hZEFzeW5jKCk7XHJcbiAgICBjb25zdCBzY29yZSA9IFNtb1Njb3JlLmRlc2VyaWFsaXplKHJlcS52YWx1ZSk7XHJcbiAgICBhd2FpdCB0aGlzLmNoYW5nZVNjb3JlKHNjb3JlKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTG9hZCBhIHJlbW90ZSBzY29yZSwgcmV0dXJuIHByb21pc2Ugd2hlbiBpdCdzIGJlZW4gbG9hZGVkXHJcbiAgICogZnJvbSBhZmFyLlxyXG4gICAqIEBwYXJhbSBwcmVmIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGxvYWRSZW1vdGVTY29yZSh1cmw6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAodXJsLmVuZHNXaXRoKCd4bWwnKSB8fCB1cmwuZW5kc1dpdGgoJ214bCcpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWRSZW1vdGVYbWwodXJsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWRSZW1vdGVKc29uKHVybCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGFzeW5jIHVwZGF0ZUF1ZGlvU2V0dGluZ3MocHJlZjogU21vQXVkaW9QbGF5ZXJTZXR0aW5ncykge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlUHJlZmVyZW5jZXMoJ1VwZGF0ZSBwcmVmZXJlbmNlcycpO1xyXG4gICAgdGhpcy5zY29yZS5hdWRpb1NldHRpbmdzID0gcHJlZjtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5hdWRpb1NldHRpbmdzID0gbmV3IFNtb0F1ZGlvUGxheWVyU2V0dGluZ3MocHJlZik7XHJcbiAgICAvLyBObyByZW5kZXJpbmcgdG8gYmUgZG9uZVxyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHbG9iYWwgc2V0dGluZ3MgdGhhdCBjb250cm9sIGhvdyB0aGUgc2NvcmUgZWRpdG9yIGJlaGF2ZXNcclxuICAgKiBAcGFyYW0gcHJlZiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVTY29yZVByZWZlcmVuY2VzKHByZWY6IFNtb1Njb3JlUHJlZmVyZW5jZXMpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZVByZWZlcmVuY2VzKCdVcGRhdGUgcHJlZmVyZW5jZXMnKTtcclxuICAgIGNvbnN0IG9sZFhwb3NlID0gdGhpcy5zY29yZS5wcmVmZXJlbmNlcy50cmFuc3Bvc2luZ1Njb3JlO1xyXG4gICAgY29uc3QgY3VyWHBvc2UgPSBwcmVmLnRyYW5zcG9zaW5nU2NvcmU7XHJcbiAgICB0aGlzLnNjb3JlLnVwZGF0ZVNjb3JlUHJlZmVyZW5jZXMobmV3IFNtb1Njb3JlUHJlZmVyZW5jZXMocHJlZikpO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnVwZGF0ZVNjb3JlUHJlZmVyZW5jZXMobmV3IFNtb1Njb3JlUHJlZmVyZW5jZXMocHJlZikpO1xyXG4gICAgaWYgKGN1clhwb3NlID09PSBmYWxzZSAmJiBvbGRYcG9zZSA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLnNjb3JlLnNldE5vblRyYW5zcG9zaW5nKCk7XHJcbiAgICAgIHRoaXMuc3RvcmVTY29yZS5zZXROb25UcmFuc3Bvc2luZygpO1xyXG4gICAgfSBlbHNlIGlmIChjdXJYcG9zZSA9PT0gdHJ1ZSAmJiBvbGRYcG9zZSA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5zY29yZS5zZXRUcmFuc3Bvc2luZygpO1xyXG4gICAgICB0aGlzLnN0b3JlU2NvcmUuc2V0VHJhbnNwb3NpbmcoKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0RGlydHkoKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzY29yZSwgY29tcG9zZXIgZXRjLlxyXG4gICAqIEBwYXJhbSBzY29yZUluZm8gXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlU2NvcmVJbmZvKHNjb3JlSW5mbzogU21vU2NvcmVJbmZvKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmVQcmVmZXJlbmNlcygnVXBkYXRlIHByZWZlcmVuY2VzJyk7XHJcbiAgICB0aGlzLnNjb3JlLnNjb3JlSW5mbyA9IHNjb3JlSW5mbztcclxuICAgIHRoaXMuc3RvcmVTY29yZS5zY29yZUluZm8gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNjb3JlSW5mbykpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpXHJcbiAgfVxyXG4gIGFzeW5jIGFkZFJlbW92ZUFycGVnZ2lvKGNvZGU6IFNtb0FycGVnZ2lvVHlwZSkge1xyXG4gICAgYXdhaXQgdGhpcy5tb2RpZnlDdXJyZW50U2VsZWN0aW9ucygnYWRkL3JlbW92ZSBhZGRSZW1vdmVBcnBlZ2dpbycsXHJcbiAgICAgIChzY29yZSwgc2VsZWN0aW9ucykgPT4ge1xyXG4gICAgICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsKSA9PiB7XHJcbiAgICAgICAgICBpZiAoc2VsLm5vdGUpIHtcclxuICAgICAgICAgICAgaWYgKGNvZGUgPT09ICdub25lJykge1xyXG4gICAgICAgICAgICAgIHNlbC5ub3RlLmFycGVnZ2lvID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHNlbC5ub3RlLmFycGVnZ2lvID0gbmV3IFNtb0FycGVnZ2lvKHsgdHlwZTogY29kZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBIGNsZWYgY2hhbmdlIG1pZC1tZWFzdXJlIChjbGVmTm90ZSlcclxuICAgKiBAcGFyYW0gY2xlZiBcclxuICAgKi9cclxuICBhc3luYyBhZGRSZW1vdmVDbGVmQ2hhbmdlKGNsZWY6IFNtb0NsZWZDaGFuZ2UpIHtcclxuICAgIGF3YWl0IHRoaXMubW9kaWZ5Q3VycmVudFNlbGVjdGlvbnMoJ2FkZC9yZW1vdmUgYWRkUmVtb3ZlQ2xlZkNoYW5nZScsXHJcbiAgICAgIChzY29yZSwgc2VsZWN0aW9ucykgPT4ge1xyXG4gICAgICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBtZWFzdXJlQ2xlZiA9IHNlbC5tZWFzdXJlLmNsZWY7XHJcbiAgICAgICAgICBpZiAoc2VsLm5vdGUpIHtcclxuICAgICAgICAgICAgaWYgKG1lYXN1cmVDbGVmID09PSBjbGVmLmNsZWYpIHtcclxuICAgICAgICAgICAgICBzZWwubm90ZS5jbGVmTm90ZSA9IG51bGw7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgc2VsLm5vdGUuY2xlZk5vdGUgPSBjbGVmO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICAvLyBNYWtlIHN1cmUgYWxsIHRoZSBub3RlcyBpbiB0aGUgbWVhc3VyZSBhZnRlciB0aGUgY2hhbmdlIGFyZSB1cGRhdGVkLiAgXHJcbiAgICAvLyBXZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBmb3IgdGhlIGRpc3BsYXllZCBzY29yZSwgbm90IHRoZSBzdG9yZVNjb3JlLlxyXG4gICAgU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KHRoaXMudHJhY2tlci5zZWxlY3Rpb25zKS5mb3JFYWNoKChtcykgPT4ge1xyXG4gICAgICBtcy5tZWFzdXJlLnVwZGF0ZUNsZWZDaGFuZ2VOb3RlcygpO1xyXG4gICAgfSlcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTW9kaWZ5IHRoZSBkeW5hbWljcyBhc3NvaWNhdGVkIHdpdGggdGhlIHNwZWNpZmljIHNlbGVjdGlvblxyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb24gXHJcbiAgICogQHBhcmFtIGR5bmFtaWMgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkRHluYW1pYyhzZWxlY3Rpb246IFNtb1NlbGVjdGlvbiwgZHluYW1pYzogU21vRHluYW1pY1RleHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMubW9kaWZ5U2VsZWN0aW9uKCdhZGQgZHluYW1pYycsIHNlbGVjdGlvbiwgKHNjb3JlLCBzZWxlY3Rpb25zKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5hZGREeW5hbWljKHNlbGVjdGlvbnNbMF0sIGR5bmFtaWMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgZHluYW1pY3MgZnJvbSB0aGUgY3VycmVudCBzZWxlY3Rpb25cclxuICAgKiBAcGFyYW0gZHluYW1pY1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZUR5bmFtaWMoZHluYW1pYzogU21vRHluYW1pY1RleHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1lYXN1cmVzID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KHRoaXMudHJhY2tlci5zZWxlY3Rpb25zKTtcclxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy50cmFja2VyLnNlbGVjdGlvbnMubGVuZ3RoOyArK2opIHtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnNbal07XHJcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgICBjb25zdCBlcXVpdiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgICBpZiAoZXF1aXY/Lm5vdGUgJiYgc2VsZWN0aW9uLm5vdGUpIHtcclxuICAgICAgICAgIGNvbnN0IGFsdE1vZGlmaWVycyA9IGVxdWl2Lm5vdGUuZ2V0TW9kaWZpZXJzKCdTbW9EeW5hbWljVGV4dCcpO1xyXG4gICAgICAgICAgU21vT3BlcmF0aW9uLnJlbW92ZUR5bmFtaWMoc2VsZWN0aW9uLCBkeW5hbWljKTtcclxuICAgICAgICAgIGlmIChhbHRNb2RpZmllcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIFNtb09wZXJhdGlvbi5yZW1vdmVEeW5hbWljKGVxdWl2LCBhbHRNb2RpZmllcnNbMF0gYXMgU21vRHluYW1pY1RleHQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZXMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKClcclxuICB9XHJcbiAgLyoqXHJcbiAgICogd2UgbmV2ZXIgcmVhbGx5IGRlbGV0ZSBhIG5vdGUsIGJ1dCB3ZSB3aWxsIGNvbnZlcnQgaXQgaW50byBhIHJlc3QgYW5kIGlmIGl0J3NcclxuICAgKiBhbHJlYWR5IGEgcmVzdCB3ZSB3aWxsIHRyeSB0byBoaWRlIGl0LlxyXG4gICAqIE9wZXJhdGVzIG9uIGN1cnJlbnQgc2VsZWN0aW9uc1xyXG4gICAqICovXHJcbiAgYXN5bmMgZGVsZXRlTm90ZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdkZWxldGUgbm90ZScpO1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsKSA9PiB7XHJcbiAgICAgIGlmIChzZWwubm90ZSkge1xyXG5cclxuICAgICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbCk7XHJcblxyXG4gICAgICAgIC8vIHNldCB0aGUgcGl0Y2ggdG8gYmUgYSBnb29kIHBvc2l0aW9uIGZvciB0aGUgcmVzdFxyXG4gICAgICAgIGNvbnN0IHBpdGNoID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgIFNtb01lYXN1cmUuZGVmYXVsdFBpdGNoRm9yQ2xlZltzZWwubWVhc3VyZS5jbGVmXSkpO1xyXG4gICAgICAgIGNvbnN0IGFsdFBpdGNoID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgIFNtb01lYXN1cmUuZGVmYXVsdFBpdGNoRm9yQ2xlZlthbHRTZWwhLm1lYXN1cmUuY2xlZl0pKTtcclxuICAgICAgICBzZWwubm90ZS5waXRjaGVzID0gW3BpdGNoXTtcclxuICAgICAgICBhbHRTZWwhLm5vdGUhLnBpdGNoZXMgPSBbYWx0UGl0Y2hdO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgbm90ZSBpcyBhIG5vdGUsIG1ha2UgaXQgaW50byBhIHJlc3QuICBJZiB0aGUgbm90ZSBpcyBhIHJlc3QgYWxyZWFkeSxcclxuICAgICAgICAvLyBtYWtlIGl0IGludmlzaWJsZS4gIElmIGl0IGlzIGludmlzaWJsZSBhbHJlYWR5LCBtYWtlIGl0IGJhY2sgaW50byBhIHJlc3QuXHJcbiAgICAgICAgaWYgKHNlbC5ub3RlLmlzUmVzdCgpICYmICFzZWwubm90ZS5pc0hpZGRlbigpKSB7XHJcbiAgICAgICAgICBzZWwubm90ZS5tYWtlSGlkZGVuKHRydWUpO1xyXG4gICAgICAgICAgYWx0U2VsIS5ub3RlIS5tYWtlSGlkZGVuKHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZWwubm90ZS5jbGVhckFydGljdWxhdGlvbnMoKTtcclxuICAgICAgICAgIHNlbC5ub3RlLm1ha2VSZXN0KCk7XHJcbiAgICAgICAgICBhbHRTZWwhLm5vdGUhLm1ha2VSZXN0KCk7XHJcbiAgICAgICAgICBhbHRTZWwhLm5vdGUhLmNsZWFyQXJ0aWN1bGF0aW9ucygpO1xyXG4gICAgICAgICAgc2VsLm5vdGUubWFrZUhpZGRlbihmYWxzZSk7XHJcbiAgICAgICAgICBhbHRTZWwhLm5vdGUhLm1ha2VIaWRkZW4oZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKClcclxuICB9XHJcbiAgLyoqXHJcbiAgKiBUaGUgbHlyaWMgZWRpdG9yIG1vdmVzIGFyb3VuZCwgc28gd2UgY2FuJ3QgZGVwZW5kIG9uIHRoZSB0cmFja2VyIGZvciB0aGVcclxuICAqIGNvcnJlY3Qgc2VsZWN0aW9uLiAgV2UgZ2V0IGl0IGRpcmVjdGx5IGZyb20gdGhlIGVkaXRvci5cclxuICAqIFxyXG4gICogQHBhcmFtIHNlbGVjdG9yIC0gdGhlIHNlbGVjdG9yIG9mIHRoZSBub3RlIHdpdGggdGhlIGx5cmljIHRvIHJlbW92ZVxyXG4gICogQHBhcmFtIGx5cmljIC0gYSBjb3B5IG9mIHRoZSBseXJpYyB0byByZW1vdmUuICBXZSB1c2UgdGhlIHZlcnNlLCBwYXJzZXIgdG8gaWRlbnRpZnkgaXRcclxuICAqIEByZXR1cm5zIHJlbmRlciBwcm9taXNlXHJcbiAgKi9cclxuICBhc3luYyByZW1vdmVMeXJpYyhzZWxlY3RvcjogU21vU2VsZWN0b3IsIGx5cmljOiBTbW9MeXJpYyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gU21vU2VsZWN0aW9uLm5vdGVGcm9tU2VsZWN0b3IodGhpcy5zY29yZSwgc2VsZWN0b3IpO1xyXG4gICAgaWYgKHNlbGVjdGlvbiA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZUhlbHBlcnMuZW1wdHlQcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl91bmRvU2VsZWN0aW9uKCdyZW1vdmUgbHlyaWMnLCBzZWxlY3Rpb24pO1xyXG4gICAgc2VsZWN0aW9uLm5vdGUhLnJlbW92ZUx5cmljKGx5cmljKTtcclxuICAgIGNvbnN0IGVxdWl2ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgY29uc3Qgc3RvcmVMeXJpYyA9IGVxdWl2IS5ub3RlIS5nZXRMeXJpY0ZvclZlcnNlKGx5cmljLnZlcnNlLCBseXJpYy5wYXJzZXIpO1xyXG4gICAgaWYgKHR5cGVvZiAoc3RvcmVMeXJpYykgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGVxdWl2IS5ub3RlIS5yZW1vdmVMeXJpYyhseXJpYyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZFRvUmVwbGFjZVF1ZXVlKHNlbGVjdGlvbik7XHJcbiAgICBseXJpYy5kZWxldGVkID0gdHJ1ZTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIHNlbGVjdG9yIHdoZXJlIHRvIGFkZCBvciB1cGRhdGUgdGhlIGx5cmljXHJcbiAgICogQHBhcmFtIGx5cmljIGEgY29weSBvZiB0aGUgbHlyaWMgdG8gcmVtb3ZlXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkT3JVcGRhdGVMeXJpYyhzZWxlY3RvcjogU21vU2VsZWN0b3IsIGx5cmljOiBTbW9MeXJpYyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gU21vU2VsZWN0aW9uLm5vdGVGcm9tU2VsZWN0b3IodGhpcy5zY29yZSwgc2VsZWN0b3IpO1xyXG4gICAgaWYgKHNlbGVjdGlvbiA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl91bmRvU2VsZWN0aW9uKCd1cGRhdGUgbHlyaWMnLCBzZWxlY3Rpb24pO1xyXG4gICAgc2VsZWN0aW9uLm5vdGUhLmFkZEx5cmljKGx5cmljKTtcclxuICAgIGNvbnN0IGVxdWl2ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgY29uc3QgYWx0THlyaWMgPSBTbW9Ob3RlTW9kaWZpZXJCYXNlLmRlc2VyaWFsaXplKGx5cmljLnNlcmlhbGl6ZSgpIGFzIGFueSkgYXMgU21vTHlyaWM7XHJcbiAgICBlcXVpdiEubm90ZSEuYWRkTHlyaWMoYWx0THlyaWMpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRUb1JlcGxhY2VRdWV1ZShzZWxlY3Rpb24pO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgYWxsIHRoZSBub3RlcyBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2b2ljZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGRlcG9wdWxhdGVWb2ljZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdkZXBvcHVsYXRlIHZvaWNlJyk7XHJcbiAgICBtZWFzdXJlU2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgY29uc3QgaXggPSBzZWxlY3Rpb24ubWVhc3VyZS5nZXRBY3RpdmVWb2ljZSgpO1xyXG4gICAgICBpZiAoaXggIT09IDApIHtcclxuICAgICAgICBTbW9PcGVyYXRpb24uZGVwb3B1bGF0ZVZvaWNlKHNlbGVjdGlvbiwgaXgpO1xyXG4gICAgICAgIGNvbnN0IGVxdWl2ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi5kZXBvcHVsYXRlVm9pY2UoZXF1aXYhLCBpeCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgU21vT3BlcmF0aW9uLnNldEFjdGl2ZVZvaWNlKHRoaXMuc2NvcmUsIDApO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDaGFuZ2UgdGhlIGFjdGl2ZSB2b2ljZSBpbiBhIG11bHRpLXZvaWNlIG1lYXN1cmUuXHJcbiAgICogQHBhcmFtIGluZGV4IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIF9jaGFuZ2VBY3RpdmVWb2ljZShpbmRleDogbnVtYmVyKTogU21vU2VsZWN0aW9uW10ge1xyXG4gICAgY29uc3QgbWVhc3VyZXNUb0FkZDogU21vU2VsZWN0aW9uW10gPSBbXTtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KHRoaXMudHJhY2tlci5zZWxlY3Rpb25zKTtcclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKG1lYXN1cmVTZWxlY3Rpb24pID0+IHtcclxuICAgICAgaWYgKGluZGV4ID09PSBtZWFzdXJlU2VsZWN0aW9uLm1lYXN1cmUudm9pY2VzLmxlbmd0aCkge1xyXG4gICAgICAgIG1lYXN1cmVzVG9BZGQucHVzaChtZWFzdXJlU2VsZWN0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbWVhc3VyZXNUb0FkZDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUG9wdWxhdGUgYSBuZXcgdm9pY2Ugd2l0aCBkZWZhdWx0IG5vdGVzXHJcbiAgICogQHBhcmFtIGluZGV4IHRoZSB2b2ljZSB0byBwb3B1bGF0ZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHBvcHVsYXRlVm9pY2UoaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZXNUb0FkZCA9IHRoaXMuX2NoYW5nZUFjdGl2ZVZvaWNlKGluZGV4KTtcclxuICAgIGlmIChtZWFzdXJlc1RvQWRkLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0QWN0aXZlVm9pY2UodGhpcy5zY29yZSwgaW5kZXgpO1xyXG4gICAgICB0aGlzLnRyYWNrZXIuc2VsZWN0QWN0aXZlVm9pY2UoKTtcclxuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgbWVhc3VyZXNUb0FkZC5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcclxuICAgICAgdGhpcy5fdW5kb1NlbGVjdGlvbigncG9wdWFsdGVWb2ljZScsIHNlbGVjdGlvbik7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5wb3B1bGF0ZVZvaWNlKHNlbGVjdGlvbiwgaW5kZXgpO1xyXG4gICAgICBjb25zdCBlcXVpdiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnBvcHVsYXRlVm9pY2UoZXF1aXYhLCBpbmRleCk7XHJcbiAgICB9KTtcclxuICAgIFNtb09wZXJhdGlvbi5zZXRBY3RpdmVWb2ljZSh0aGlzLnNjb3JlLCBpbmRleCk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZXNUb0FkZCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICAgIHRoaXMudHJhY2tlci5zZWxlY3RBY3RpdmVWb2ljZSgpO1xyXG4gIH1cclxuICBhc3luYyBzd2FwVm9pY2VzKHZvaWNlMTogbnVtYmVyLCB2b2ljZTI6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5nZXRTZWxlY3RlZE1lYXN1cmVzKCk7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb25zID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24uc3dhcFZvaWNlKHNlbGVjdGlvbnMsIHZvaWNlMSwgdm9pY2UyKTtcclxuICAgIFNtb09wZXJhdGlvbi5zd2FwVm9pY2UoYWx0U2VsZWN0aW9ucywgdm9pY2UxLCB2b2ljZTIpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKHNlbGVjdGlvbnMpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBc3NpZ24gYW4gaW5zdHJ1bWVudCB0byBhIHNldCBvZiBtZWFzdXJlc1xyXG4gICAqIEBwYXJhbSBpbnN0cnVtZW50IHRoZSBpbnN0cnVtZW50IHRvIGFzc2lnbiB0byB0aGUgc2VsZWN0aW9uc1xyXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25zIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGNoYW5nZUluc3RydW1lbnQoaW5zdHJ1bWVudDogU21vSW5zdHJ1bWVudCwgc2VsZWN0aW9uczogU21vU2VsZWN0aW9uW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0eXBlb2YgKHNlbGVjdGlvbnMpID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICB9XHJcbiAgICB0aGlzLl91bmRvU2VsZWN0aW9ucygnY2hhbmdlIGluc3RydW1lbnQnLCBzZWxlY3Rpb25zKTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi5jaGFuZ2VJbnN0cnVtZW50KGluc3RydW1lbnQsIHRoaXMuc2NvcmUsIHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLmNoYW5nZUluc3RydW1lbnQoaW5zdHJ1bWVudCwgdGhpcy5zdG9yZVNjb3JlLCBhbHRTZWxlY3Rpb25zKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhzZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHRpbWUgc2lnbmF0dXJlIGZvciBhIHNlbGVjdGlvblxyXG4gICAqIEBwYXJhbSB0aW1lU2lnbmF0dXJlIGFjdHVhbCB0aW1lIHNpZ25hdHVyZVxyXG4gICAqL1xyXG4gIGFzeW5jIHNldFRpbWVTaWduYXR1cmUodGltZVNpZ25hdHVyZTogVGltZVNpZ25hdHVyZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdTZXQgdGltZSBzaWduYXR1cmUnKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi5zZXRUaW1lU2lnbmF0dXJlKHRoaXMuc2NvcmUsIHNlbGVjdGlvbnMsIHRpbWVTaWduYXR1cmUpO1xyXG4gICAgU21vT3BlcmF0aW9uLnNldFRpbWVTaWduYXR1cmUodGhpcy5zdG9yZVNjb3JlLCBhbHRTZWxlY3Rpb25zLCB0aW1lU2lnbmF0dXJlKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTW92ZSBzZWxlY3RlZCBzdGFmZiB1cCBvciBkb3duIGluIHRoZSBzY29yZS5cclxuICAgKiBAcGFyYW0gaW5kZXggZGlyZWN0aW9uIHRvIG1vdmVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU3RhZmZVcERvd24oaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdyZS1vcmRlciBzdGF2ZXMnKTtcclxuICAgIC8vIEdldCBzdGFmZiB0byBtb3ZlXHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdKTtcclxuICAgIC8vIE1ha2UgdGhlIG1vdmUgaW4gdGhlIG1vZGVsLCBhbmQgcmVzZXQgdGhlIHZpZXcgc28gd2UgY2FuIHNlZSB0aGUgbmV3XHJcbiAgICAvLyBhcnJhbmdlbWVudFxyXG4gICAgU21vT3BlcmF0aW9uLm1vdmVTdGFmZlVwRG93bih0aGlzLnN0b3JlU2NvcmUsIHNlbGVjdGlvbiEsIGluZGV4KTtcclxuICAgIHRoaXMudmlld0FsbCgpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgc3RhZmYgZ3JvdXAgZm9yIGEgc2NvcmUsIHdoaWNoIGRldGVybWluZXMgaG93IHRoZSBzdGF2ZXNcclxuICAgKiBhcmUganVzdGlmaWVkIGFuZCBicmFja2V0ZWRcclxuICAgKiBAcGFyYW0gc3RhZmZHcm91cCBcclxuICAgKi9cclxuICBhc3luYyBhZGRPclVwZGF0ZVN0YWZmR3JvdXAoc3RhZmZHcm91cDogU21vU3lzdGVtR3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnZ3JvdXAgc3RhdmVzJyk7XHJcbiAgICAvLyBBc3N1bWUgdGhhdCB0aGUgdmlldyBpcyBub3cgc2V0IHRvIGZ1bGwgc2NvcmVcclxuICAgIHRoaXMuc2NvcmUuYWRkT3JSZXBsYWNlU3lzdGVtR3JvdXAoc3RhZmZHcm91cCk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuYWRkT3JSZXBsYWNlU3lzdGVtR3JvdXAoc3RhZmZHcm91cCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldERpcnR5KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgcmVtb3ZlU3RhZmZHcm91cChzdGFmZkdyb3VwOiBTbW9TeXN0ZW1Hcm91cCk6UHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ3VuZ3JvdXAgc3RhdmVzJyk7XHJcbiAgICB0aGlzLnNjb3JlLnJlbW92ZVN5c3RlbUdyb3VwKHN0YWZmR3JvdXApO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnJlbW92ZVN5c3RlbUdyb3VwKHN0YWZmR3JvdXApO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXREaXJ0eSgpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIGNsZWFyU3lzdGVtR3JvdXBzKCk6IFByb21pc2U8dm9pZD57XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ2NsZWFyIHN0YWZmIGdyb3VwcycpO1xyXG4gICAgdGhpcy5zY29yZS5jbGVhclN5c3RlbUdyb3VwcygpO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLmNsZWFyU3lzdGVtR3JvdXBzKCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldERpcnR5KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgdXBkYXRlVGFiU3RhdmUodGFiU3RhdmU6IFNtb1RhYlN0YXZlKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVzQmV0d2Vlbih0aGlzLnNjb3JlLCB0YWJTdGF2ZS5zdGFydFNlbGVjdG9yLCB0YWJTdGF2ZS5lbmRTZWxlY3Rvcik7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb25zID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICBpZiAoc2VsZWN0aW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdW5kb1NlbGVjdGlvbnMoJ3VwZGF0ZVRhYlN0YXZlJywgc2VsZWN0aW9ucyk7XHJcbiAgICBjb25zdCBzdGFmZjogbnVtYmVyID0gc2VsZWN0aW9uc1swXS5zZWxlY3Rvci5zdGFmZjtcclxuICAgIGNvbnN0IGFsdFN0YWZmID0gYWx0U2VsZWN0aW9uc1swXS5zZWxlY3Rvci5zdGFmZjtcclxuICAgIGNvbnN0IGFsdFRhYlN0YXZlID0gbmV3IFNtb1RhYlN0YXZlKHRhYlN0YXZlLnNlcmlhbGl6ZSgpKTtcclxuICAgIGFsdFRhYlN0YXZlLnN0YXJ0U2VsZWN0b3Iuc3RhZmYgPSBhbHRTdGFmZjtcclxuICAgIGFsdFRhYlN0YXZlLmVuZFNlbGVjdG9yLnN0YWZmID0gYWx0U3RhZmY7XHJcbiAgICBhbHRUYWJTdGF2ZS5hdHRycy5pZCA9IHRhYlN0YXZlLmF0dHJzLmlkO1xyXG4gICAgdGhpcy5zY29yZS5zdGF2ZXNbc3RhZmZdLnVwZGF0ZVRhYlN0YXZlKHRhYlN0YXZlKTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbYWx0U3RhZmZdLnVwZGF0ZVRhYlN0YXZlKGFsdFRhYlN0YXZlKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyByZW1vdmVUYWJTdGF2ZSgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbnMgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIGlmIChzZWxlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl91bmRvU2VsZWN0aW9ucygndXBkYXRlVGFiU3RhdmUnLCBzZWxlY3Rpb25zKTtcclxuICAgIGNvbnN0IHN0YXZlc1RvUmVtb3ZlOiBTbW9UYWJTdGF2ZVtdID0gW107XHJcbiAgICBjb25zdCBhbHRTdGF2ZXNUb1JlbW92ZTogU21vVGFiU3RhdmVbXSA9IFtdO1xyXG4gICAgY29uc3QgYWRkZWQ6IFJlY29yZDxzdHJpbmcsIFNtb1RhYlN0YXZlPiA9IHt9O1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwsIGl4KSA9PiB7XHJcbiAgICAgIGNvbnN0IGFsdFNlbCA9IGFsdFNlbGVjdGlvbnNbaXhdO1xyXG4gICAgICBjb25zdCB0YWJTdGF2ZSA9IHNlbC5zdGFmZi5nZXRUYWJTdGF2ZUZvck1lYXN1cmUoc2VsLnNlbGVjdG9yKTtcclxuICAgICAgY29uc3QgYWx0VGFiU3RhdmUgPSBhbHRTZWwuc3RhZmYuZ2V0VGFiU3RhdmVGb3JNZWFzdXJlKGFsdFNlbC5zZWxlY3Rvcik7XHJcbiAgICAgIGlmICh0YWJTdGF2ZSAmJiBhbHRUYWJTdGF2ZSkge1xyXG4gICAgICAgIGlmICghYWRkZWRbdGFiU3RhdmUuYXR0cnMuaWRdKSB7XHJcbiAgICAgICAgICBhZGRlZFt0YWJTdGF2ZS5hdHRycy5pZF0gPSB0YWJTdGF2ZTtcclxuICAgICAgICAgIHN0YXZlc1RvUmVtb3ZlLnB1c2godGFiU3RhdmUpO1xyXG4gICAgICAgICAgYWx0U3RhdmVzVG9SZW1vdmUucHVzaChhbHRUYWJTdGF2ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHNlbGVjdGlvbnNbMF0uc3RhZmYucmVtb3ZlVGFiU3RhdmVzKHN0YXZlc1RvUmVtb3ZlKTtcclxuICAgIGFsdFNlbGVjdGlvbnNbMF0uc3RhZmYucmVtb3ZlVGFiU3RhdmVzKGFsdFN0YXZlc1RvUmVtb3ZlKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGVtcG8gZm9yIGFsbCBvciBwYXJ0IG9mIHRoZSBzY29yZVxyXG4gICAqIEBwYXJhbSBtZWFzdXJlIHRoZSBtZWFzdXJlIHdpdGggdGhlIHRlbXBvLiAgVGVtcG8gaXMgbWVhc3VyZS13aWRlIHBhcmFtZXRlclxyXG4gICAqIEBwYXJhbSBzY29yZU1vZGUgaWYgdHJ1ZSwgdXBkYXRlIHdob2xlIHNjb3JlLiAgRWxzZSBzZWxlY3Rpb25zXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlVGVtcG9TY29yZShtZWFzdXJlOiBTbW9NZWFzdXJlLCB0ZW1wbzogU21vVGVtcG9UZXh0LCBzY29yZU1vZGU6IGJvb2xlYW4sIHNlbGVjdGlvbk1vZGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBtZWFzdXJlSW5kZXggPSAwOyAgICBcclxuICAgIGNvbnN0IG9yaWdpbmFsVGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KG1lYXN1cmUudGVtcG8pO1xyXG4gICAgdGhpcy5fdW5kb0NvbHVtbigndXBkYXRlIHRlbXBvJywgbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCk7XHJcbiAgICBsZXQgc3RhcnRNZWFzdXJlID0gbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleDtcclxuICAgIGxldCBlbmRNZWFzdXJlID0gdGhpcy5zY29yZS5zdGF2ZXNbMF0ubWVhc3VyZXMubGVuZ3RoO1xyXG4gICAgbGV0IGRpc3BsYXllZCA9IGZhbHNlO1xyXG4gICAgaWYgKHNlbGVjdGlvbk1vZGUpIHtcclxuICAgICAgY29uc3QgZW5kU2VsID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oMSk7XHJcbiAgICAgIGlmIChlbmRTZWwuc2VsZWN0b3IubWVhc3VyZSA+IHN0YXJ0TWVhc3VyZSkge1xyXG4gICAgICAgIGVuZE1lYXN1cmUgPSBlbmRTZWwuc2VsZWN0b3IubWVhc3VyZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gSWYgd2UgYXJlIG9ubHkgY2hhbmdpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSB0ZXh0LCBpdCBvbmx5IGFmZmVjdHMgdGhlIHRlbXBvIG1lYXN1cmUuXHJcbiAgICBpZiAoU21vVGVtcG9UZXh0LmVxKG9yaWdpbmFsVGVtcG8sIHRlbXBvKSAmJiB0ZW1wby55T2Zmc2V0ICE9PSBvcmlnaW5hbFRlbXBvLnlPZmZzZXQgJiYgZW5kTWVhc3VyZSA+IHN0YXJ0TWVhc3VyZSkge1xyXG4gICAgICBlbmRNZWFzdXJlID0gc3RhcnRNZWFzdXJlICsgMTsgICAgICAgICAgXHJcbiAgICB9XHJcbiAgICBmb3IgKG1lYXN1cmVJbmRleCA9IHN0YXJ0TWVhc3VyZTsgbWVhc3VyZUluZGV4IDwgZW5kTWVhc3VyZTsgKyttZWFzdXJlSW5kZXgpIHtcclxuICAgICAgaWYgKCFzY29yZU1vZGUgJiYgIXNlbGVjdGlvbk1vZGUpIHtcclxuICAgICAgICAvLyBJZiBub3Qgd2hvbGUgc2NvcmUgb3Igc2VsZWN0aW9ucywgY2hhbmdlIHVudGlsIHRoZSB0ZW1wbyBkb2Vzbid0IG1hdGNoIHByZXZpb3VzIG1lYXN1cmUncyB0ZW1wbyAobmV4dCB0ZW1wbyBjaGFuZ2UpXHJcbiAgICAgICAgY29uc3QgY29tcE1lYXN1cmUgPSB0aGlzLnNjb3JlLnN0YXZlc1swXS5tZWFzdXJlc1ttZWFzdXJlSW5kZXhdO1xyXG4gICAgICAgIGlmIChTbW9UZW1wb1RleHQuZXEob3JpZ2luYWxUZW1wbywgY29tcE1lYXN1cmUudGVtcG8pIHx8IGRpc3BsYXllZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgIGNvbnN0IHNlbCA9IFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc2NvcmUsIDAsIG1lYXN1cmVJbmRleCk7XHJcbiAgICAgICAgICBjb25zdCBhbHRTZWwgPSBTbW9TZWxlY3Rpb24ubWVhc3VyZVNlbGVjdGlvbih0aGlzLnN0b3JlU2NvcmUsIDAsIG1lYXN1cmVJbmRleCk7XHJcbiAgICAgICAgICBpZiAoc2VsICYmIHNlbC5tZWFzdXJlLnRlbXBvLmRpc3BsYXkgJiYgIWRpc3BsYXllZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZFRvUmVwbGFjZVF1ZXVlKHNlbCk7XHJcbiAgICAgICAgICAgIGRpc3BsYXllZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICAgIFNtb09wZXJhdGlvbi5hZGRUZW1wbyh0aGlzLnNjb3JlLCBzZWwsIHRlbXBvKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChhbHRTZWwpIHtcclxuICAgICAgICAgICAgU21vT3BlcmF0aW9uLmFkZFRlbXBvKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsLCB0ZW1wbyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBzZWwgPSBTbW9TZWxlY3Rpb24ubWVhc3VyZVNlbGVjdGlvbih0aGlzLnNjb3JlLCAwLCBtZWFzdXJlSW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbCA9IFNtb1NlbGVjdGlvbi5tZWFzdXJlU2VsZWN0aW9uKHRoaXMuc3RvcmVTY29yZSwgMCwgbWVhc3VyZUluZGV4KTtcclxuICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICBTbW9PcGVyYXRpb24uYWRkVGVtcG8odGhpcy5zY29yZSwgc2VsLCB0ZW1wbyk7XHJcbiAgICAgICAgICBpZiAoIWRpc3BsYXllZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZFRvUmVwbGFjZVF1ZXVlKHNlbCk7XHJcbiAgICAgICAgICAgIGRpc3BsYXllZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhbHRTZWwpIHtcclxuICAgICAgICAgIFNtb09wZXJhdGlvbi5hZGRUZW1wbyh0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbCwgdGVtcG8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHVwZGF0ZVRhYk5vdGUodGFiTm90ZTogU21vVGFiTm90ZSkge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IFNtb1NlbGVjdGlvbi5nZXRNZWFzdXJlc0JldHdlZW4odGhpcy5zY29yZSwgXHJcbiAgICAgIHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKS5zZWxlY3RvciwgdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oMSkuc2VsZWN0b3IpO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9ucyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpO1xyXG4gICAgdGhpcy5fdW5kb1NlbGVjdGlvbnMoJ3VwZGF0ZVRhYk5vdGUnLCBzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi51cGRhdGVUYWJOb3RlKHNlbGVjdGlvbnMsIHRhYk5vdGUpO1xyXG4gICAgU21vT3BlcmF0aW9uLnVwZGF0ZVRhYk5vdGUoYWx0U2VsZWN0aW9ucywgdGFiTm90ZSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZFRvUmVwbGFjZVF1ZXVlKHNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHJlbW92ZVRhYk5vdGUoKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVzQmV0d2Vlbih0aGlzLnNjb3JlLCBcclxuICAgICAgdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpLnNlbGVjdG9yLCB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKS5zZWxlY3Rvcik7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb25zID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICB0aGlzLl91bmRvU2VsZWN0aW9ucygndXBkYXRlVGFiTm90ZScsIHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLnJlbW92ZVRhYk5vdGUoc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24ucmVtb3ZlVGFiTm90ZShhbHRTZWxlY3Rpb25zKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkVG9SZXBsYWNlUXVldWUoc2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogJ3JlbW92ZScgdGVtcG8sIHdoaWNoIG1lYW5zIGVpdGhlciBzZXR0aW5nIHRoZSBiYXJzIHRvIHRoZSBcclxuICAgKiBkZWZhdWx0IHRlbXBvLCBvciB0aGUgcHJldmlvdXNseS1zZXQgdGVtcG8uXHJcbiAgICogQHBhcmFtIHNjb3JlTW9kZSB3aGV0aGVyIHRvIHJlc2V0IGVudGlyZSBzY29yZVxyXG4gICAqL1xyXG4gIGFzeW5jIHJlbW92ZVRlbXBvKG1lYXN1cmU6IFNtb01lYXN1cmUsIHRlbXBvOiBTbW9UZW1wb1RleHQsIHNjb3JlTW9kZTogYm9vbGVhbiwgc2VsZWN0aW9uTW9kZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc3RhcnRTZWxlY3Rpb24gPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1swXTtcclxuICAgIGlmIChzdGFydFNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlID4gMCkge1xyXG4gICAgICBjb25zdCBtZWFzdXJlSXggPSBzdGFydFNlbGVjdGlvbi5zZWxlY3Rvci5tZWFzdXJlIC0gMTtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gc3RhcnRTZWxlY3Rpb24uc3RhZmYubWVhc3VyZXNbbWVhc3VyZUl4XTtcclxuICAgICAgY29uc3QgdGVtcG8gPSB0YXJnZXQuZ2V0VGVtcG8oKTtcclxuICAgICAgY29uc3QgbmV3VGVtcG8gPSBuZXcgU21vVGVtcG9UZXh0KHRlbXBvKTtcclxuICAgICAgbmV3VGVtcG8uZGlzcGxheSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRlbXBvU2NvcmUobWVhc3VyZSwgbmV3VGVtcG8sIHNjb3JlTW9kZSwgc2VsZWN0aW9uTW9kZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVwZGF0ZVRlbXBvU2NvcmUobWVhc3VyZSwgbmV3IFNtb1RlbXBvVGV4dChTbW9UZW1wb1RleHQuZGVmYXVsdHMpLCBzY29yZU1vZGUsIHNlbGVjdGlvbk1vZGUpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCBhIGdyYWNlIG5vdGUgdG8gdGhlIHNlbGVjdGVkIHJlYWwgbm90ZXMuXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkR3JhY2VOb3RlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ2FkZCBncmFjZSBub3RlJyk7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbi5ub3RlIS5nZXRHcmFjZU5vdGVzKCkubGVuZ3RoO1xyXG4gICAgICBjb25zdCBwaXRjaGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWxlY3Rpb24ubm90ZSEucGl0Y2hlcykpO1xyXG4gICAgICBjb25zdCBncmFjZSA9IG5ldyBTbW9HcmFjZU5vdGUoe1xyXG4gICAgICAgIHBpdGNoZXMsIHRpY2tzOlxyXG4gICAgICAgICAgeyBudW1lcmF0b3I6IDIwNDgsIGRlbm9taW5hdG9yOiAxLCByZW1haW5kZXI6IDAgfVxyXG4gICAgICB9KTtcclxuICAgICAgU21vT3BlcmF0aW9uLmFkZEdyYWNlTm90ZShzZWxlY3Rpb24sIGdyYWNlLCBpbmRleCk7XHJcblxyXG4gICAgICBjb25zdCBhbHRQaXRjaGVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzZWxlY3Rpb24ubm90ZSEucGl0Y2hlcykpO1xyXG4gICAgICBjb25zdCBhbHRHcmFjZSA9IG5ldyBTbW9HcmFjZU5vdGUoe1xyXG4gICAgICAgIHBpdGNoZXM6IGFsdFBpdGNoZXMsIHRpY2tzOlxyXG4gICAgICAgICAgeyBudW1lcmF0b3I6IDIwNDgsIGRlbm9taW5hdG9yOiAxLCByZW1haW5kZXI6IDAgfVxyXG4gICAgICB9KTtcclxuICAgICAgYWx0R3JhY2UuYXR0cnMuaWQgPSBncmFjZS5hdHRycy5pZDtcclxuICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgICBTbW9PcGVyYXRpb24uYWRkR3JhY2VOb3RlKGFsdFNlbGVjdGlvbiEsIGFsdEdyYWNlLCBpbmRleCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHJlbW92ZSBzZWxlY3RlZCBncmFjZSBub3RlXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVHcmFjZU5vdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygncmVtb3ZlIGdyYWNlIG5vdGUnKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIC8vIFRPRE86IGdldCB0aGUgY29ycmVjdCBvZmZzZXRcclxuICAgICAgU21vT3BlcmF0aW9uLnJlbW92ZUdyYWNlTm90ZShzZWxlY3Rpb24sIDApO1xyXG4gICAgICBjb25zdCBhbHRTZWwgPSAodGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnJlbW92ZUdyYWNlTm90ZShhbHRTZWwhLCAwKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBUb2dnbGUgc2xhc2ggaW4gc3RlbSBvZiBncmFjZSBub3RlXHJcbiAgICovXHJcbiAgYXN5bmMgc2xhc2hHcmFjZU5vdGVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZ3JhY2UgPSB0aGlzLnRyYWNrZXIuZ2V0U2VsZWN0ZWRHcmFjZU5vdGVzKCk7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnc2xhc2ggZ3JhY2Ugbm90ZSB0b2dnbGUnKTtcclxuICAgIGdyYWNlLmZvckVhY2goKGduKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5zbGFzaEdyYWNlTm90ZXMoZ24pO1xyXG4gICAgICBpZiAoZ24uc2VsZWN0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihnbi5zZWxlY3Rpb24pO1xyXG4gICAgICAgIGNvbnN0IGFsdEduID0gdGhpcy5fZ2V0RXF1aXZhbGVudEdyYWNlTm90ZShhbHRTZWxlY3Rpb24hLCBnbi5tb2RpZmllciBhcyBTbW9HcmFjZU5vdGUpO1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi5zbGFzaEdyYWNlTm90ZXMoe1xyXG4gICAgICAgICAgc2VsZWN0aW9uOiBhbHRTZWxlY3Rpb24sIG1vZGlmaWVyOiBhbHRHbiBhcyBhbnksXHJcbiAgICAgICAgICBib3g6IFN2Z0JveC5kZWZhdWx0LCBpbmRleDogMFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgdHJhbnNwb3NlU2NvcmUob2Zmc2V0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgndHJhbnNwb3NlIHNjb3JlJyk7XHJcbiAgICBTbW9PcGVyYXRpb24udHJhbnNwb3NlU2NvcmUodGhpcy5zY29yZSwgb2Zmc2V0KTtcclxuICAgIFNtb09wZXJhdGlvbi50cmFuc3Bvc2VTY29yZSh0aGlzLnN0b3JlU2NvcmUsIG9mZnNldCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyQWxsKCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdHJhbnNwb3NlIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHBhcmFtIG9mZnNldCAxLzIgc3RlcHNcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB0cmFuc3Bvc2VTZWxlY3Rpb25zKG9mZnNldDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygndHJhbnNwb3NlJyk7XHJcbiAgICBjb25zdCBncmFjZSA9IHRoaXMudHJhY2tlci5nZXRTZWxlY3RlZEdyYWNlTm90ZXMoKTtcclxuICAgIGlmIChncmFjZS5sZW5ndGgpIHtcclxuICAgICAgZ3JhY2UuZm9yRWFjaCgoYXJ0aWZhY3QpID0+IHtcclxuICAgICAgICBpZiAoYXJ0aWZhY3Quc2VsZWN0aW9uICE9PSBudWxsICYmIGFydGlmYWN0LnNlbGVjdGlvbi5ub3RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBjb25zdCBnbjEgPSBhcnRpZmFjdC5tb2RpZmllciBhcyBTbW9HcmFjZU5vdGU7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGFydGlmYWN0LnNlbGVjdGlvbi5ub3RlLmdyYWNlTm90ZXMuZmluZEluZGV4KCh4KSA9PiB4LmF0dHJzLmlkID09PSBnbjEuYXR0cnMuaWQpO1xyXG4gICAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihhcnRpZmFjdC5zZWxlY3Rpb24pO1xyXG4gICAgICAgICAgaWYgKGFsdFNlbGVjdGlvbiAmJiBhbHRTZWxlY3Rpb24ubm90ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBnbjIgPSBhbHRTZWxlY3Rpb24ubm90ZS5ncmFjZU5vdGVzW2luZGV4XTtcclxuICAgICAgICAgICAgU21vT3BlcmF0aW9uLnRyYW5zcG9zZUdyYWNlTm90ZXMoYWx0U2VsZWN0aW9uISwgW2duMl0sIG9mZnNldCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBTbW9PcGVyYXRpb24udHJhbnNwb3NlR3JhY2VOb3RlcyhhcnRpZmFjdC5zZWxlY3Rpb24sIFtnbjFdLCBvZmZzZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGlzUGVyY3Vzc2lvbiA9IGZhbHNlO1xyXG4gICAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGVkKSA9PiB7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRyYW5zcG9zZShzZWxlY3RlZCwgb2Zmc2V0KTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWQuc3RhZmYuZ2V0U3RhZmZJbnN0cnVtZW50KHNlbGVjdGVkLnNlbGVjdG9yLm1lYXN1cmUpLmlzUGVyY3Vzc2lvbikge1xyXG4gICAgICAgICAgaXNQZXJjdXNzaW9uID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3RlZCk7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRyYW5zcG9zZShhbHRTZWwhLCBvZmZzZXQpO1xyXG4gICAgICB9KTtcclxuICAgICAgLy8gaWYgdGhpcyBpcyBwZXJjdXNzaW9uLCBzZXQgdGhhdCBwcm9wZXJ0eVxyXG4gICAgICBpZiAoaXNQZXJjdXNzaW9uKSB7XHJcbiAgICAgICAgdGhpcy5zY29yZS5zZXROb3RlSW5zdHJ1bWVudFByb3BlcnRpZXMoKTtcclxuICAgICAgICB0aGlzLnN0b3JlU2NvcmUuc2V0Tm90ZUluc3RydW1lbnRQcm9wZXJ0aWVzKClcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VsZWN0aW9ucy5sZW5ndGggPT09IDEgJiYgdGhpcy5zY29yZS5wcmVmZXJlbmNlcy5hdXRvUGxheSkge1xyXG4gICAgICAgIFN1aU9zY2lsbGF0b3IucGxheVNlbGVjdGlvbk5vdyhzZWxlY3Rpb25zWzBdLCB0aGlzLnNjb3JlLCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiB0b2dnbGUgdGhlIGFjY2lkZW50YWwgc3BlbGxpbmcgb2YgdGhlIHNlbGVjdGVkIG5vdGVzXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyB0b2dnbGVFbmhhcm1vbmljKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3RvZ2dsZSBlbmhhcm1vbmljJyk7XHJcbiAgICBjb25zdCBncmFjZSA9IHRoaXMudHJhY2tlci5nZXRTZWxlY3RlZEdyYWNlTm90ZXMoKTtcclxuICAgIGlmIChncmFjZS5sZW5ndGgpIHtcclxuICAgICAgZ3JhY2UuZm9yRWFjaCgoYXJ0aWZhY3QpID0+IHtcclxuICAgICAgICBTbW9PcGVyYXRpb24udG9nZ2xlR3JhY2VOb3RlRW5oYXJtb25pYyhhcnRpZmFjdC5zZWxlY3Rpb24hLCBbYXJ0aWZhY3QubW9kaWZpZXIgYXMgU21vR3JhY2VOb3RlXSk7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihhcnRpZmFjdC5zZWxlY3Rpb24hKTtcclxuICAgICAgICBjb25zdCBhbHRHciA9IHRoaXMuX2dldEVxdWl2YWxlbnRHcmFjZU5vdGUoYWx0U2VsZWN0aW9uISwgYXJ0aWZhY3QubW9kaWZpZXIgYXMgU21vR3JhY2VOb3RlKTtcclxuICAgICAgICBTbW9PcGVyYXRpb24udG9nZ2xlR3JhY2VOb3RlRW5oYXJtb25pYyhhbHRTZWxlY3Rpb24hLFxyXG4gICAgICAgICAgW2FsdEdyXSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3RlZCkgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgKHNlbGVjdGVkLnNlbGVjdG9yLnBpdGNoZXMpID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgc2VsZWN0ZWQuc2VsZWN0b3IucGl0Y2hlcyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBTbW9PcGVyYXRpb24udG9nZ2xlRW5oYXJtb25pYyhzZWxlY3RlZCk7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3RlZCk7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZUVuaGFybW9uaWMoYWx0U2VsISk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIGNhdXRpb25hcnkvY291cnRlc3kgYWNjaWRlbnRhbHNcclxuICAgKi9cclxuICBhc3luYyB0b2dnbGVDb3VydGVzeUFjY2lkZW50YWxzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3RvZ2dsZSBjb3VydGVzeSBhY2NpZGVudGFsJyk7XHJcbiAgICBjb25zdCBncmFjZSA9IHRoaXMudHJhY2tlci5nZXRTZWxlY3RlZEdyYWNlTm90ZXMoKTtcclxuICAgIGlmIChncmFjZS5sZW5ndGgpIHtcclxuICAgICAgZ3JhY2UuZm9yRWFjaCgoYXJ0aWZhY3QpID0+IHtcclxuICAgICAgICBjb25zdCBnbjEgPSBbYXJ0aWZhY3QubW9kaWZpZXJdIGFzIFNtb0dyYWNlTm90ZVtdO1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVHcmFjZU5vdGVDb3VydGVzeShhcnRpZmFjdC5zZWxlY3Rpb24sIGduMSk7XHJcbiAgICAgICAgY29uc3QgYWx0U2VsID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihhcnRpZmFjdC5zZWxlY3Rpb24hKTtcclxuICAgICAgICBjb25zdCBnbjIgPSB0aGlzLl9nZXRFcXVpdmFsZW50R3JhY2VOb3RlKGFsdFNlbCEsIGduMVswXSk7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZUdyYWNlTm90ZUNvdXJ0ZXN5KGFsdFNlbCEsIFtnbjJdKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVDb3VydGVzeUFjY2lkZW50YWwoc2VsZWN0aW9uKTtcclxuICAgICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZUNvdXJ0ZXN5QWNjaWRlbnRhbChhbHRTZWwhKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBjaGFuZ2UgdGhlIGR1cmF0aW9uIG9mIG5vdGVzIGZvciBzZWxlY3RlZCwgY3JlYXRpbmcgbW9yZSBcclxuICAgKiBvciBmZXdlciBub3Rlcy4gXHJcbiAgICogQWZ0ZXIgdGhlIGNoYW5nZSwgcmVzZXQgdGhlIHNlbGVjdGlvbiBzbyBpdCdzIGFzIGNsb3NlIGFzIHBvc3NpYmxlIFxyXG4gICAqIHRvIHRoZSBvcmlnaW5hbCBsZW5ndGhcclxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGJhdGNoRHVyYXRpb25PcGVyYXRpb24ob3BlcmF0aW9uOiBCYXRjaFNlbGVjdGlvbk9wZXJhdGlvbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ2NoYW5nZSBkdXJhdGlvbicpO1xyXG4gICAgY29uc3QgZ3JhY2UgPSB0aGlzLnRyYWNrZXIuZ2V0U2VsZWN0ZWRHcmFjZU5vdGVzKCk7XHJcbiAgICBjb25zdCBncmFjZU1hcDogUmVjb3JkPHN0cmluZywgQmF0Y2hTZWxlY3Rpb25PcGVyYXRpb24+ID0ge1xyXG4gICAgICBkb3VibGVEdXJhdGlvbjogJ2RvdWJsZUdyYWNlTm90ZUR1cmF0aW9uJyxcclxuICAgICAgaGFsdmVEdXJhdGlvbjogJ2hhbHZlR3JhY2VOb3RlRHVyYXRpb24nXHJcbiAgICB9O1xyXG4gICAgaWYgKGdyYWNlLmxlbmd0aCAmJiB0eXBlb2YgKGdyYWNlTWFwW29wZXJhdGlvbl0pICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBvcGVyYXRpb24gPSBncmFjZU1hcFtvcGVyYXRpb25dO1xyXG4gICAgICBncmFjZS5mb3JFYWNoKChhcnRpZmFjdCkgPT4ge1xyXG4gICAgICAgIChTbW9PcGVyYXRpb24gYXMgYW55KVtvcGVyYXRpb25dKGFydGlmYWN0LnNlbGVjdGlvbiwgYXJ0aWZhY3QubW9kaWZpZXIpO1xyXG4gICAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oYXJ0aWZhY3Quc2VsZWN0aW9uISk7XHJcbiAgICAgICAgY29uc3QgZ24yID0gdGhpcy5fZ2V0RXF1aXZhbGVudEdyYWNlTm90ZShhbHRTZWxlY3Rpb24hLCBhcnRpZmFjdC5tb2RpZmllciBhcyBTbW9HcmFjZU5vdGUpO1xyXG4gICAgICAgIChTbW9PcGVyYXRpb24gYXMgYW55KVtvcGVyYXRpb25dKGFsdFNlbGVjdGlvbiEsIGduMik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgYWx0QXIgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgICAgU21vT3BlcmF0aW9uLmJhdGNoU2VsZWN0aW9uT3BlcmF0aW9uKHRoaXMuc2NvcmUsIHNlbGVjdGlvbnMsIG9wZXJhdGlvbik7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5iYXRjaFNlbGVjdGlvbk9wZXJhdGlvbih0aGlzLnN0b3JlU2NvcmUsIGFsdEFyLCBvcGVyYXRpb24pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBUb2dnbGUgc2VsZWN0ZWQgbW9kaWZpZXIgb24gc2VsZWN0ZWQgbm90ZXNcclxuICAgKiBAcGFyYW0gbW9kaWZpZXIgXHJcbiAgICogQHBhcmFtIGN0b3IgcGFyZW50IGNsYXNzIGNvbnN0cnVjdG9yIChlLmcuIFNtb09ybmFtZW50KVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHRvZ2dsZUFydGljdWxhdGlvbihtb2RpZmllcjogc3RyaW5nLCBjdG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCd0b2dnbGUgYXJ0aWN1bGF0aW9uJyk7XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgaWYgKGN0b3IgPT09ICdTbW9BcnRpY3VsYXRpb24nKSB7XHJcbiAgICAgICAgY29uc3QgYWEgPSBuZXcgU21vQXJ0aWN1bGF0aW9uKHsgYXJ0aWN1bGF0aW9uOiBtb2RpZmllciB9KTtcclxuICAgICAgICBjb25zdCBhbHRBYSA9IG5ldyBTbW9BcnRpY3VsYXRpb24oeyBhcnRpY3VsYXRpb246IG1vZGlmaWVyIH0pO1xyXG4gICAgICAgIGFsdEFhLmF0dHJzLmlkID0gYWEuYXR0cnMuaWQ7XHJcbiAgICAgICAgaWYgKHNlbC5ub3RlKSB7XHJcbiAgICAgICAgICBzZWwubm90ZS50b2dnbGVBcnRpY3VsYXRpb24oYWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbCk7XHJcbiAgICAgICAgaWYgKGFsdFNlbGVjdGlvbiAmJiBhbHRTZWxlY3Rpb24ubm90ZSkge1xyXG4gICAgICAgICAgYWx0U2VsZWN0aW9uLm5vdGUudG9nZ2xlQXJ0aWN1bGF0aW9uKGFsdEFhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgYWEgPSBuZXcgU21vT3JuYW1lbnQoeyBvcm5hbWVudDogbW9kaWZpZXIgfSk7XHJcbiAgICAgICAgY29uc3QgYWx0QWEgPSBuZXcgU21vT3JuYW1lbnQoeyBvcm5hbWVudDogbW9kaWZpZXIgfSk7XHJcbiAgICAgICAgYWx0QWEuYXR0cnMuaWQgPSBhYS5hdHRycy5pZDtcclxuICAgICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbCEpO1xyXG4gICAgICAgIGlmIChzZWwubm90ZSkge1xyXG4gICAgICAgICAgc2VsLm5vdGUudG9nZ2xlT3JuYW1lbnQoYWEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWx0U2VsZWN0aW9uICYmIGFsdFNlbGVjdGlvbi5ub3RlKSB7XHJcbiAgICAgICAgICBhbHRTZWxlY3Rpb24ubm90ZS50b2dnbGVPcm5hbWVudChhbHRBYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgc2V0QXJ0aWN1bGF0aW9uKG1vZGlmaWVyOiBTbW9BcnRpY3VsYXRpb24sIHNldDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3NldCBhcnRpY3VsYXRpb24nKTtcclxuICAgIHRoaXMudHJhY2tlci5zZWxlY3Rpb25zLmZvckVhY2goKHNlbCkgPT4ge1xyXG4gICAgICBjb25zdCBhbHRBYSA9IG5ldyBTbW9BcnRpY3VsYXRpb24obW9kaWZpZXIpO1xyXG4gICAgICBpZiAoc2VsLm5vdGUpIHtcclxuICAgICAgICBzZWwubm90ZS5zZXRBcnRpY3VsYXRpb24obW9kaWZpZXIsIHNldCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWwpO1xyXG4gICAgICBpZiAoYWx0U2VsZWN0aW9uICYmIGFsdFNlbGVjdGlvbi5ub3RlKSB7XHJcbiAgICAgICAgYWx0U2VsZWN0aW9uLm5vdGUudG9nZ2xlQXJ0aWN1bGF0aW9uKGFsdEFhKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7ICAgIFxyXG4gIH1cclxuICBhc3luYyBzZXRPcm5hbWVudChtb2RpZmllcjogU21vT3JuYW1lbnQsIHNldDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3NldCBhcnRpY3VsYXRpb24nKTtcclxuICAgIHRoaXMudHJhY2tlci5zZWxlY3Rpb25zLmZvckVhY2goKHNlbCkgPT4ge1xyXG4gICAgICBjb25zdCBhbHRBYSA9IG5ldyBTbW9Pcm5hbWVudChtb2RpZmllcik7XHJcbiAgICAgIGlmIChzZWwubm90ZSkge1xyXG4gICAgICAgIHNlbC5ub3RlLnNldE9ybmFtZW50KG1vZGlmaWVyLCBzZXQpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuICAgICAgaWYgKGFsdFNlbGVjdGlvbiAmJiBhbHRTZWxlY3Rpb24ubm90ZSkge1xyXG4gICAgICAgIGFsdFNlbGVjdGlvbi5ub3RlLnNldE9ybmFtZW50KGFsdEFhLCBzZXQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTsgICAgXHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGNvbnZlcnQgbm9uLXR1cGxldCBub3QgdG8gYSB0dXBsZXRcclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICovXHJcbiAgYXN5bmMgbWFrZVR1cGxldChwYXJhbXM6IE1ha2VUdXBsZXRPcGVyYXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ21ha2UgdHVwbGV0Jyk7XHJcbiAgICBTbW9PcGVyYXRpb24ubWFrZVR1cGxldChzZWxlY3Rpb24sIHBhcmFtcyk7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbiEpO1xyXG4gICAgU21vT3BlcmF0aW9uLm1ha2VUdXBsZXQoYWx0U2VsZWN0aW9uISwgcGFyYW1zKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ29udmVydCBzZWxlY3RlZCB0dXBsZXQgdG8gYSBzaW5nbGUgKGlmIHBvc3NpYmxlKSBub24tdHVwbGV0XHJcbiAgICovXHJcbiAgYXN5bmMgdW5tYWtlVHVwbGV0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnNbMF07XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygndW5tYWtlIHR1cGxldCcpO1xyXG4gICAgU21vT3BlcmF0aW9uLnVubWFrZVR1cGxldChzZWxlY3Rpb24pO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgU21vT3BlcmF0aW9uLnVubWFrZVR1cGxldChhbHRTZWxlY3Rpb24hKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIGNob3JkIGJ5IGFkZGluZyBhbiBpbnRlcnZhbCB0byBzZWxlY3RlZCBub3RlXHJcbiAgICogQHBhcmFtIGludGVydmFsIDEvMiBzdGVwc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldEludGVydmFsKGludGVydmFsOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdzZXQgaW50ZXJ2YWwnKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0ZWQpID0+IHtcclxuICAgICAgU21vT3BlcmF0aW9uLmludGVydmFsKHNlbGVjdGVkLCBpbnRlcnZhbCk7XHJcbiAgICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0ZWQpO1xyXG4gICAgICBTbW9PcGVyYXRpb24uaW50ZXJ2YWwoYWx0U2VsZWN0aW9uISwgaW50ZXJ2YWwpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBjaGFuZ2UgdGhlIHNlbGVjdGVkIGNob3JkIGludG8gYSBzaW5nbGUgbm90ZVxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgYXN5bmMgY29sbGFwc2VDaG9yZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdjb2xsYXBzZSBjaG9yZCcpO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3RlZCkgPT4ge1xyXG4gICAgICBjb25zdCBub3RlOiBTbW9Ob3RlIHwgbnVsbCA9IHNlbGVjdGVkLm5vdGU7XHJcbiAgICAgIGlmIChub3RlKSB7XHJcbiAgICAgICAgY29uc3QgcHAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG5vdGUucGl0Y2hlc1swXSkpO1xyXG4gICAgICAgIGNvbnN0IGFsdHBwID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShub3RlLnBpdGNoZXNbMF0pKTtcclxuICAgICAgICAvLyBObyBvcGVyYXRpb24gZm9yIHRoaXM/XHJcbiAgICAgICAgbm90ZS5waXRjaGVzID0gW3BwXTtcclxuICAgICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGVkKTtcclxuICAgICAgICBhbHRTZWxlY3Rpb24hLm5vdGUhLnBpdGNoZXMgPSBbYWx0cHBdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIGNoaWNrZW4tc2NyYXRjaGVzLCBmb3IgamF6eiBpbXByb3YsIGNvbXBpbmcgZXRjLlxyXG4gICAqL1xyXG4gIGFzeW5jIHRvZ2dsZVNsYXNoKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ21ha2Ugc2xhc2gnKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVTbGFzaChzZWxlY3Rpb24pO1xyXG4gICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVTbGFzaChhbHRTZWwhKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVTZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBtYWtlIHNlbGVjdGVkIG5vdGVzIGludG8gYSByZXN0LCBvciB2aXNhLXZlcnNhXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyBtYWtlUmVzdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdtYWtlIHJlc3QnKTtcclxuICAgIHNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsZWN0aW9uKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi50b2dnbGVSZXN0KHNlbGVjdGlvbik7XHJcbiAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnRvZ2dsZVJlc3QoYWx0U2VsISk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgY2xlYXJBbGxCZWFtcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnY2xlYXJBbGxCZWFtcycpO1xyXG4gICAgU21vT3BlcmF0aW9uLmNsZWFyQWxsQmVhbUdyb3Vwcyh0aGlzLnNjb3JlKTtcclxuICAgIFNtb09wZXJhdGlvbi5jbGVhckFsbEJlYW1Hcm91cHModGhpcy5zdG9yZVNjb3JlKTtcclxuICAgIGF3YWl0IHRoaXMuYXdhaXRSZW5kZXIoKTtcclxuICB9XHJcbiAgYXN5bmMgY2xlYXJTZWxlY3RlZEJlYW1zKCkge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZXMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3Qoc2VsZWN0aW9ucyk7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb25zID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICBTbW9PcGVyYXRpb24uY2xlYXJCZWFtR3JvdXBzKHRoaXMuc2NvcmUsIHNlbGVjdGlvbnMpO1xyXG4gICAgU21vT3BlcmF0aW9uLmNsZWFyQmVhbUdyb3Vwcyh0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbGVjdGlvbnMpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlZE1lYXN1cmVzKG1lYXN1cmVzKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiB0b2dnbGUgdGhlICdlbmQgYmVhbScgZmxhZyBmb3Igc2VsZWN0ZWQgbm90ZXNcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB1bmJlYW1TZWxlY3Rpb25zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3RvZ2dsZSBiZWFtIGdyb3VwJyk7XHJcbiAgICBzZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBTbW9PcGVyYXRpb24udW5iZWFtU2VsZWN0aW9ucyhzZWxlY3Rpb24pO1xyXG4gICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgIFNtb09wZXJhdGlvbi51bmJlYW1TZWxlY3Rpb25zKGFsdFNlbCEpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIHRvZ2dsZUN1ZSgpIHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCd0b2dnbGUgbm90ZSBjdWUnKTtcclxuICAgIHRoaXMudHJhY2tlci5zZWxlY3Rpb25zLmZvckVhY2goKHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICAgIGlmIChzZWxlY3Rpb24ubm90ZSAmJiBzZWxlY3Rpb24ubm90ZS5pc1Jlc3QoKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICBzZWxlY3Rpb24ubm90ZS5pc0N1ZSA9ICFzZWxlY3Rpb24ubm90ZS5pc0N1ZTtcclxuICAgICAgICBpZiAoYWx0U2VsZWN0aW9uICYmIGFsdFNlbGVjdGlvbi5ub3RlKSB7XHJcbiAgICAgICAgICBhbHRTZWxlY3Rpb24ubm90ZS5pc0N1ZSA9IHNlbGVjdGlvbi5ub3RlLmlzQ3VlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICogdXAgb3IgZG93blxyXG4gICogQHJldHVybnMgXHJcbiAgKi9cclxuICBhc3luYyB0b2dnbGVCZWFtRGlyZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zO1xyXG4gICAgaWYgKHNlbGVjdGlvbnMubGVuZ3RoIDwgMSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZUhlbHBlcnMuZW1wdHlQcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygndG9nZ2xlIGJlYW0gZGlyZWN0aW9uJyk7XHJcbiAgICBTbW9PcGVyYXRpb24udG9nZ2xlQmVhbURpcmVjdGlvbihzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi50b2dnbGVCZWFtRGlyZWN0aW9uKHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWRkIHRoZSBzZWxlY3RlZCBub3RlcyB0byBhIGJlYW0gZ3JvdXBcclxuICAgKi9cclxuICBhc3luYyBiZWFtU2VsZWN0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucztcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdiZWFtIHNlbGVjdGlvbnMnKTtcclxuICAgIFNtb09wZXJhdGlvbi5iZWFtU2VsZWN0aW9ucyh0aGlzLnNjb3JlLCBzZWxlY3Rpb25zKTtcclxuICAgIFNtb09wZXJhdGlvbi5iZWFtU2VsZWN0aW9ucyh0aGlzLnN0b3JlU2NvcmUsIHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogY2hhbmdlIGtleSBzaWduYXR1cmUgZm9yIHNlbGVjdGVkIG1lYXN1cmVzXHJcbiAgICogQHBhcmFtIGtleVNpZ25hdHVyZSB2ZXgga2V5IHNpZ25hdHVyZVxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZEtleVNpZ25hdHVyZShrZXlTaWduYXR1cmU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWVhc3VyZVNlbGVjdGlvbnMgPSB0aGlzLnVuZG9UcmFja2VyTWVhc3VyZVNlbGVjdGlvbnMoJ3NldCBrZXkgc2lnbmF0dXJlICcgKyBrZXlTaWduYXR1cmUpO1xyXG4gICAgbWVhc3VyZVNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsKSA9PiB7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5hZGRLZXlTaWduYXR1cmUodGhpcy5zY29yZSwgc2VsLCBrZXlTaWduYXR1cmUpO1xyXG4gICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbCk7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5hZGRLZXlTaWduYXR1cmUodGhpcy5zdG9yZVNjb3JlLCBhbHRTZWwhLCBrZXlTaWduYXR1cmUpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgYSBwaXRjaCBmcm9tIHRoZSBwaWFubyB3aWRnZXQuXHJcbiAgICogQHBhcmFtIHBpdGNoIHtQaXRjaH1cclxuICAgKiBAcGFyYW0gY2hvcmRQZWRhbCB7Ym9vbGVhbn0gLSBpbmRpY2F0ZXMgd2UgYXJlIGFkZGluZyB0byBhIGNob3JkXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0UGl0Y2hQaWFubyhwaXRjaDogUGl0Y2gsIGNob3JkUGVkYWw6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKFxyXG4gICAgICAnc2V0QWJzb2x1dGVQaXRjaCAnICsgcGl0Y2gubGV0dGVyICsgJy8nICsgcGl0Y2guYWNjaWRlbnRhbCk7XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3RlZCkgPT4ge1xyXG4gICAgICBjb25zdCBucGl0Y2g6IFBpdGNoID0ge1xyXG4gICAgICAgIGxldHRlcjogcGl0Y2gubGV0dGVyLFxyXG4gICAgICAgIGFjY2lkZW50YWw6IHBpdGNoLmFjY2lkZW50YWwsIG9jdGF2ZTogcGl0Y2gub2N0YXZlXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IG9jdGF2ZSA9IFNtb01lYXN1cmUuZGVmYXVsdFBpdGNoRm9yQ2xlZltzZWxlY3RlZC5tZWFzdXJlLmNsZWZdLm9jdGF2ZTtcclxuICAgICAgbnBpdGNoLm9jdGF2ZSArPSBvY3RhdmU7XHJcbiAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0ZWQpO1xyXG4gICAgICBpZiAoY2hvcmRQZWRhbCAmJiBzZWxlY3RlZC5ub3RlKSB7XHJcbiAgICAgICAgc2VsZWN0ZWQubm90ZS50b2dnbGVBZGRQaXRjaChucGl0Y2gpO1xyXG4gICAgICAgIGFsdFNlbCEubm90ZSEudG9nZ2xlQWRkUGl0Y2gobnBpdGNoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBTbW9PcGVyYXRpb24uc2V0UGl0Y2goc2VsZWN0ZWQsIFtucGl0Y2hdKTtcclxuICAgICAgICBTbW9PcGVyYXRpb24uc2V0UGl0Y2goYWx0U2VsISwgW25waXRjaF0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogc2hvdyBvciBoaWRlIHRoZSBwaWFubyB3aWRnZXRcclxuICAgKiBAcGFyYW0gdmFsdWUgdG8gc2hvdyBpdFxyXG4gICAqL1xyXG4gIGFzeW5jIHNob3dQaWFubyh2YWx1ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zY29yZS5wcmVmZXJlbmNlcy5zaG93UGlhbm8gPSB2YWx1ZTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5wcmVmZXJlbmNlcy5zaG93UGlhbm8gPSB2YWx1ZTtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBTdWlQaWFuby5zaG93UGlhbm8oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIFN1aVBpYW5vLmhpZGVQaWFubygpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJlbmRlciBhIHBpdGNoIGZvciBlYWNoIGxldHRlciBuYW1lLXBpdGNoIGluIHRoZSBzdHJpbmcsXHJcbiAgICogQHBhcmFtIHBpdGNoZXMgbGV0dGVyIG5hbWVzIGZvciBwaXRjaGVzXHJcbiAgICogQHJldHVybnMgcHJvbWlzZSwgcmVzb2x2ZWQgd2hlbiBhbGwgcGl0Y2hlcyByZW5kZXJlZFxyXG4gICAqIEBzZWUgc2V0UGl0Y2hcclxuICAgKi9cclxuICBhc3luYyBzZXRQaXRjaGVzUHJvbWlzZShwaXRjaGVzOiBQaXRjaExldHRlcltdKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZmMgPSBhc3luYyAoaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGlmIChpbmRleCA+PSBwaXRjaGVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhd2FpdCBzZWxmLnNldFBpdGNoKHBpdGNoZXNbaW5kZXhdKTtcclxuICAgICAgICAgIGZjKGluZGV4ICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBmYygwKTtcclxuICAgIH0pO1xyXG4gICAgYXdhaXQgcHJvbWlzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBhIHBpdGNoIHRvIHRoZSBzY29yZSBhdCB0aGUgY3Vyc29yLiAgVGhpcyB0cmllcyB0byBmaW5kIHRoZSBiZXN0IHBpdGNoXHJcbiAgICogdG8gbWF0Y2ggdGhlIGxldHRlciBrZXkgKEYgdnMgRiMgZm9yIGluc3RhbmNlKSBiYXNlZCBvbiBrZXkgYW5kIHN1cnJvdW5kaW5nIG5vdGVzXHJcbiAgICogQHBhcmFtIGxldHRlciBzdHJpbmdcclxuICAgKi9cclxuICBhc3luYyBzZXRQaXRjaChsZXR0ZXI6IFBpdGNoTGV0dGVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLnNlbGVjdGlvbnM7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnc2V0IHBpdGNoICcgKyBsZXR0ZXIpO1xyXG4gICAgbGV0IGlzUGVyY3Vzc2lvbiA9IGZhbHNlO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3RlZCkgPT4ge1xyXG4gICAgICBjb25zdCBzZWxlY3RvciA9IHNlbGVjdGVkLnNlbGVjdG9yO1xyXG4gICAgICBpZiAoc2VsZWN0ZWQuc3RhZmYuZ2V0U3RhZmZJbnN0cnVtZW50KHNlbGVjdGVkLnNlbGVjdG9yLm1lYXN1cmUpLmlzUGVyY3Vzc2lvbikge1xyXG4gICAgICAgIGlzUGVyY3Vzc2lvbiA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGhpbnRTZWwgPSBTbW9TZWxlY3Rpb24ubGFzdE5vdGVTZWxlY3Rpb25Ob25SZXN0KHRoaXMuc2NvcmUsXHJcbiAgICAgICAgc2VsZWN0b3Iuc3RhZmYsIHNlbGVjdG9yLm1lYXN1cmUsIHNlbGVjdG9yLnZvaWNlLCBzZWxlY3Rvci50aWNrKTtcclxuICAgICAgaWYgKCFoaW50U2VsKSB7XHJcbiAgICAgICAgaGludFNlbCA9IFNtb1NlbGVjdGlvbi5uZXh0Tm90ZVNlbGVjdGlvbk5vblJlc3QodGhpcy5zY29yZSxcclxuICAgICAgICAgIHNlbGVjdG9yLnN0YWZmLCBzZWxlY3Rvci5tZWFzdXJlLCBzZWxlY3Rvci52b2ljZSwgc2VsZWN0b3IudGljayk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gVGhlIHNlbGVjdGlvbiBubyBsb25nZXIgZXhpc3RzLCBwb3NzaWJseSBkZWxldGVkXHJcbiAgICAgIGlmIChoaW50U2VsID09PSBudWxsIHx8IGhpbnRTZWwubm90ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlSGVscGVycy5lbXB0eVByb21pc2UoKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwaXRjaCA9IFNtb011c2ljLmdldExldHRlck5vdGVQaXRjaChoaW50U2VsLm5vdGUucGl0Y2hlc1swXSxcclxuICAgICAgICBsZXR0ZXIsIGhpbnRTZWwubWVhc3VyZS5rZXlTaWduYXR1cmUpO1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0UGl0Y2goc2VsZWN0ZWQsIFtwaXRjaF0pO1xyXG4gICAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGVkKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnNldFBpdGNoKGFsdFNlbCEsIFtwaXRjaF0pO1xyXG4gICAgICBpZiAodGhpcy5zY29yZS5wcmVmZXJlbmNlcy5hdXRvQWR2YW5jZSkge1xyXG4gICAgICAgIC8vIERvbid0IHBsYXkgdGhlIG5leHQgbm90ZSBhbmQgdGhlIGFkZGVkIHBpdGNoIGF0IHRoZSBzYW1lIHRpbWUuXHJcbiAgICAgICAgdGhpcy50cmFja2VyLmRlZmVyTmV4dEF1dG9QbGF5KCk7XHJcbiAgICAgICAgdGhpcy50cmFja2VyLm1vdmVTZWxlY3Rpb25SaWdodCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChpc1BlcmN1c3Npb24pIHtcclxuICAgICAgdGhpcy5zY29yZS5zZXROb3RlSW5zdHJ1bWVudFByb3BlcnRpZXMoKTtcclxuICAgICAgdGhpcy5zdG9yZVNjb3JlLnNldE5vdGVJbnN0cnVtZW50UHJvcGVydGllcygpXHJcbiAgICB9XHJcbiAgICBpZiAoc2VsZWN0aW9ucy5sZW5ndGggPT09IDEgJiYgdGhpcy5zY29yZS5wcmVmZXJlbmNlcy5hdXRvUGxheSkge1xyXG4gICAgICBTdWlPc2NpbGxhdG9yLnBsYXlTZWxlY3Rpb25Ob3coc2VsZWN0aW9uc1swXSwgdGhpcy5zY29yZSwgMSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMobWVhc3VyZVNlbGVjdGlvbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdlbmVyaWMgY2xpcGJvYXJkIGNvcHkgYWN0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgY29weSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGFsdEFyOiBTbW9TZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdGlvbnMuZm9yRWFjaCgoc2VsKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5vdGVTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbCk7XHJcbiAgICAgIGlmIChub3RlU2VsZWN0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgYWx0QXIucHVzaChub3RlU2VsZWN0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnN0b3JlUGFzdGUuc2V0U2VsZWN0aW9ucyh0aGlzLnN0b3JlU2NvcmUsIGFsdEFyKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBjbGlwYm9hcmQgcGFzdGUgYWN0aW9uXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgcGFzdGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBXZSB1bmRvIHRoZSB3aG9sZSBzY29yZSBvbiBhIHBhc3RlLCBzaW5jZSB3ZSBkb24ndCB5ZXQga25vdyB0aGVcclxuICAgIC8vIGV4dGVudCBvZiB0aGUgb3ZlcmxhcFxyXG4gICAgdGhpcy5yZW5kZXJlci5wcmVzZXJ2ZVNjcm9sbCgpO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uczogU21vU2VsZWN0aW9uW10gID0gdGhpcy5nZXRQYXN0ZU1lYXN1cmVMaXN0KCk7XHJcbiAgICBjb25zdCBmaXJzdFNlbGVjdGlvbiA9IHNlbGVjdGlvbnNbMF07XHJcbiAgICBjb25zdCBtZWFzdXJlRW5kID0gc2VsZWN0aW9uc1tzZWxlY3Rpb25zLmxlbmd0aCAtIDFdLnNlbGVjdG9yLm1lYXN1cmU7XHJcbiAgICBjb25zdCBtZWFzdXJlUmFuZ2UgPSBbZmlyc3RTZWxlY3Rpb24uc2VsZWN0b3IubWVhc3VyZSwgbWVhc3VyZUVuZF07XHJcbiAgICB0aGlzLnN0b3JlVW5kby5ncm91cGluZyA9IHRydWU7XHJcbiAgICAvLyBVbmRvIHRoZSBwYXN0ZSBieSBzZWxlY3RpbmcgYWxsIHRoZSBhZmZlY3RlZCBtZWFzdXJlc1xyXG4gICAgZm9yIChsZXQgaSA9IG1lYXN1cmVSYW5nZVswXTsgaSA8PSBtZWFzdXJlUmFuZ2VbMV07ICsraSkge1xyXG4gICAgICB0aGlzLl91bmRvQ29sdW1uKCdwYXN0ZScsIGkpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnVucmVuZGVyQ29sdW1uKHRoaXMuc2NvcmUuc3RhdmVzWzBdLm1lYXN1cmVzW2ldKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmVVbmRvLmdyb3VwaW5nID0gZmFsc2U7XHJcbiAgICBjb25zdCBhbHRTZWxlY3Rpb24gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKGZpcnN0U2VsZWN0aW9uKTtcclxuICAgIGNvbnN0IGFsdFRhcmdldCA9IGFsdFNlbGVjdGlvbiEuc2VsZWN0b3I7XHJcbiAgICBhbHRUYXJnZXQudGljayA9IHRoaXMudHJhY2tlci5zZWxlY3Rpb25zWzBdLnNlbGVjdG9yLnRpY2s7XHJcbiAgICAvLyBwYXN0ZSB0aGUgY2xpcGJvYXJkIGludG8gdGhlIGRlc3RpbmF0aW9uXHJcbiAgICB0aGlzLnN0b3JlUGFzdGUucGFzdGVTZWxlY3Rpb25zKGFsdFRhcmdldCk7XHJcbiAgICAvLyBSZWZyZXNoIHRob3NlIG1lYXN1cmVzLlxyXG4gICAgdGhpcy5yZXBsYWNlTWVhc3VyZVZpZXcobWVhc3VyZVJhbmdlKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQYXN0ZSBvbmx5IHRoZSBjaG9yZHMuXHJcbiAgICovXHJcbiAgYXN5bmMgcGFzdGVDaG9yZHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgLy8gV2UgdW5kbyB0aGUgd2hvbGUgc2NvcmUgb24gYSBwYXN0ZSwgc2luY2Ugd2UgZG9uJ3QgeWV0IGtub3cgdGhlXHJcbiAgICAvLyBleHRlbnQgb2YgdGhlIG92ZXJsYXBcclxuICAgIHRoaXMucmVuZGVyZXIucHJlc2VydmVTY3JvbGwoKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdICA9IHRoaXMuZ2V0UGFzdGVNZWFzdXJlTGlzdCgpO1xyXG4gICAgY29uc3QgZmlyc3RTZWxlY3Rpb24gPSBzZWxlY3Rpb25zWzBdO1xyXG4gICAgY29uc3QgbWVhc3VyZUVuZCA9IHNlbGVjdGlvbnNbc2VsZWN0aW9ucy5sZW5ndGggLSAxXS5zZWxlY3Rvci5tZWFzdXJlO1xyXG4gICAgY29uc3QgbWVhc3VyZVJhbmdlID0gW2ZpcnN0U2VsZWN0aW9uLnNlbGVjdG9yLm1lYXN1cmUsIG1lYXN1cmVFbmRdO1xyXG4gICAgdGhpcy5zdG9yZVVuZG8uZ3JvdXBpbmcgPSB0cnVlO1xyXG4gICAgLy8gVW5kbyB0aGUgcGFzdGUgYnkgc2VsZWN0aW5nIGFsbCB0aGUgYWZmZWN0ZWQgbWVhc3VyZXNcclxuICAgIGZvciAobGV0IGkgPSBtZWFzdXJlUmFuZ2VbMF07IGkgPD0gbWVhc3VyZVJhbmdlWzFdOyArK2kpIHtcclxuICAgICAgdGhpcy5fdW5kb0NvbHVtbigncGFzdGUnLCBpKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci51bnJlbmRlckNvbHVtbih0aGlzLnNjb3JlLnN0YXZlc1swXS5tZWFzdXJlc1tpXSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0b3JlVW5kby5ncm91cGluZyA9IGZhbHNlO1xyXG4gICAgY29uc3QgYWx0U2VsZWN0aW9uID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihmaXJzdFNlbGVjdGlvbik7XHJcbiAgICBjb25zdCBhbHRUYXJnZXQgPSBhbHRTZWxlY3Rpb24hLnNlbGVjdG9yO1xyXG4gICAgYWx0VGFyZ2V0LnRpY2sgPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1swXS5zZWxlY3Rvci50aWNrO1xyXG4gICAgdGhpcy5zdG9yZVBhc3RlLnBhc3RlQ2hvcmRzKGFsdFRhcmdldCk7XHJcbiAgICAvLyBSZWZyZXNoIHRob3NlIG1lYXN1cmVzLlxyXG4gICAgdGhpcy5yZXBsYWNlTWVhc3VyZVZpZXcobWVhc3VyZVJhbmdlKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBzcGVjaWZ5IGEgbm90ZSBoZWFkIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgZm9yIHRoZSBkdXJhdGlvblxyXG4gICAqIEBwYXJhbSBoZWFkIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldE5vdGVIZWFkKGhlYWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5tb2RpZnlDdXJyZW50U2VsZWN0aW9ucygnc2V0IG5vdGUgaGVhZCcsIChzY29yZSwgc2VsZWN0aW9ucykgPT4ge1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0Tm90ZUhlYWQoc2VsZWN0aW9ucywgaGVhZCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBhIHZvbHRhIGZvciBzZWxlY3RlZCBtZWFzdXJlc1xyXG4gICAqL1xyXG4gIGFzeW5jIGFkZEVuZGluZygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFRPRE86IHdlIHNob3VsZCBoYXZlIHVuZG8gZm9yIGNvbHVtbnNcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnQWRkIFZvbHRhJyk7XHJcbiAgICBjb25zdCBmdCA9IHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKTtcclxuICAgIGNvbnN0IHR0ID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oMSk7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBTbW9Wb2x0YS5kZWZhdWx0cztcclxuICAgIHBhcmFtcy5zdGFydEJhciA9IGZ0LnNlbGVjdG9yLm1lYXN1cmU7XHJcbiAgICBwYXJhbXMuZW5kQmFyID0gdHQuc2VsZWN0b3IubWVhc3VyZTtcclxuICAgIHBhcmFtcy5udW1iZXIgPSAxO1xyXG4gICAgY29uc3Qgdm9sdGEgPSBuZXcgU21vVm9sdGEocGFyYW1zKTtcclxuICAgIGNvbnN0IGFsdFZvbHRhID0gbmV3IFNtb1ZvbHRhKHBhcmFtcyk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMoW2Z0LCB0dF0pO1xyXG4gICAgU21vT3BlcmF0aW9uLmFkZEVuZGluZyh0aGlzLnN0b3JlU2NvcmUsIGFsdFZvbHRhKTtcclxuICAgIFNtb09wZXJhdGlvbi5hZGRFbmRpbmcodGhpcy5zY29yZSwgdm9sdGEpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBlbmRpbmcgdm9sdGEgc2V0dGluZ3NcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVFbmRpbmcoZW5kaW5nOiBTbW9Wb2x0YSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdDaGFuZ2UgVm9sdGEnKTtcclxuICAgIGVuZGluZy5lbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xyXG4gICAgICAkKGVsKS5maW5kKCdnLicgKyBlbmRpbmcuYXR0cnMuaWQpLnJlbW92ZSgpO1xyXG4gICAgfSk7XHJcbiAgICBlbmRpbmcuZWxlbWVudHMgPSBbXTtcclxuICAgIFNtb09wZXJhdGlvbi5yZW1vdmVFbmRpbmcodGhpcy5zdG9yZVNjb3JlLCBlbmRpbmcpO1xyXG4gICAgU21vT3BlcmF0aW9uLnJlbW92ZUVuZGluZyh0aGlzLnNjb3JlLCBlbmRpbmcpO1xyXG4gICAgY29uc3QgYWx0Vm9sdGEgPSBuZXcgU21vVm9sdGEoZW5kaW5nKTtcclxuICAgIFNtb09wZXJhdGlvbi5hZGRFbmRpbmcodGhpcy5zdG9yZVNjb3JlLCBhbHRWb2x0YSk7XHJcbiAgICBTbW9PcGVyYXRpb24uYWRkRW5kaW5nKHRoaXMuc2NvcmUsIGVuZGluZyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGVuZGluZyB2b2x0YSB0byByZW1vdmVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVFbmRpbmcoZW5kaW5nOiBTbW9Wb2x0YSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdSZW1vdmUgVm9sdGEnKTtcclxuICAgIGVuZGluZy5lbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xyXG4gICAgICAkKGVsKS5maW5kKCdnLicgKyBlbmRpbmcuYXR0cnMuaWQpLnJlbW92ZSgpO1xyXG4gICAgfSk7XHJcbiAgICBlbmRpbmcuZWxlbWVudHMgPSBbXTtcclxuICAgIFNtb09wZXJhdGlvbi5yZW1vdmVFbmRpbmcodGhpcy5zdG9yZVNjb3JlLCBlbmRpbmcpO1xyXG4gICAgU21vT3BlcmF0aW9uLnJlbW92ZUVuZGluZyh0aGlzLnNjb3JlLCBlbmRpbmcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBiZWdpbiBvciBlbmRcclxuICAgKiBAcGFyYW0gYmFybGluZSBiYXJsaW5lIHR5cGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBzZXRCYXJsaW5lKHBvc2l0aW9uOiBudW1iZXIsIGJhcmxpbmU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgb2JqID0gbmV3IFNtb0JhcmxpbmUoeyBwb3NpdGlvbiwgYmFybGluZSB9KTtcclxuICAgIGNvbnN0IGFsdE9iaiA9IG5ldyBTbW9CYXJsaW5lKHsgcG9zaXRpb24sIGJhcmxpbmUgfSk7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1swXTtcclxuICAgIHRoaXMuX3VuZG9Db2x1bW4oJ3NldCBiYXJsaW5lJywgc2VsZWN0aW9uLnNlbGVjdG9yLm1lYXN1cmUpO1xyXG4gICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVCYXJsaW5lKHRoaXMuc2NvcmUsIHNlbGVjdGlvbiwgb2JqKTtcclxuICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIFNtb09wZXJhdGlvbi5zZXRNZWFzdXJlQmFybGluZSh0aGlzLnN0b3JlU2NvcmUsIGFsdFNlbCEsIGFsdE9iaik7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMoW3NlbGVjdGlvbl0pO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gcG9zaXRpb24gc3RhcnQgb3IgZW5kXHJcbiAgICogQHBhcmFtIHN5bWJvbCBjb2RhLCBldGMuXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0UmVwZWF0U3ltYm9sKHBvc2l0aW9uOiBudW1iZXIsIHN5bWJvbDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBTbW9SZXBlYXRTeW1ib2wuZGVmYXVsdHM7XHJcbiAgICBwYXJhbXMucG9zaXRpb24gPSBwb3NpdGlvbjtcclxuICAgIHBhcmFtcy5zeW1ib2wgPSBzeW1ib2w7XHJcbiAgICBjb25zdCBvYmogPSBuZXcgU21vUmVwZWF0U3ltYm9sKHBhcmFtcyk7XHJcbiAgICBjb25zdCBhbHRPYmogPSBuZXcgU21vUmVwZWF0U3ltYm9sKHBhcmFtcyk7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnRyYWNrZXIuc2VsZWN0aW9uc1swXTtcclxuICAgIHRoaXMuX3VuZG9Db2x1bW4oJ3NldCByZXBlYXQgc3ltYm9sJywgc2VsZWN0aW9uLnNlbGVjdG9yLm1lYXN1cmUpO1xyXG4gICAgU21vT3BlcmF0aW9uLnNldFJlcGVhdFN5bWJvbCh0aGlzLnNjb3JlLCBzZWxlY3Rpb24sIG9iaik7XHJcbiAgICBjb25zdCBhbHRTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICBTbW9PcGVyYXRpb24uc2V0UmVwZWF0U3ltYm9sKHRoaXMuc3RvcmVTY29yZSwgYWx0U2VsISwgYWx0T2JqKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbc2VsZWN0aW9uXSk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqICB0b2dnbGUgcmVoZWFyc2FsIG1hcmsgb24gZmlyc3Qgc2VsZWN0ZWQgbWVhc3VyZVxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgYXN5bmMgdG9nZ2xlUmVoZWFyc2FsTWFyaygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKTtcclxuICAgIGNvbnN0IGFsdFNlbGVjdGlvbiA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIGNvbnN0IGNtZCA9IHNlbGVjdGlvbi5tZWFzdXJlLmdldFJlaGVhcnNhbE1hcmsoKSA/ICdyZW1vdmVSZWhlYXJzYWxNYXJrJyA6ICdhZGRSZWhlYXJzYWxNYXJrJztcclxuICAgIFNtb09wZXJhdGlvbltjbWRdKHRoaXMuc2NvcmUsIHNlbGVjdGlvbiwgbmV3IFNtb1JlaGVhcnNhbE1hcmsoU21vUmVoZWFyc2FsTWFyay5kZWZhdWx0cykpO1xyXG4gICAgU21vT3BlcmF0aW9uW2NtZF0odGhpcy5zdG9yZVNjb3JlLCBhbHRTZWxlY3Rpb24hLCBuZXcgU21vUmVoZWFyc2FsTWFyayhTbW9SZWhlYXJzYWxNYXJrLmRlZmF1bHRzKSk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMoW3NlbGVjdGlvbl0pO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBfcmVtb3ZlU3RhZmZNb2RpZmllcihtb2RpZmllcjogU3RhZmZNb2RpZmllckJhc2UpIHtcclxuICAgIHRoaXMuc2NvcmUuc3RhdmVzW21vZGlmaWVyLmFzc29jaWF0ZWRTdGFmZl0ucmVtb3ZlU3RhZmZNb2RpZmllcihtb2RpZmllcik7XHJcbiAgICBjb25zdCBhbHRNb2RpZmllciA9IFN0YWZmTW9kaWZpZXJCYXNlLmRlc2VyaWFsaXplKG1vZGlmaWVyLnNlcmlhbGl6ZSgpKTtcclxuICAgIGFsdE1vZGlmaWVyLmF0dHJzLmlkID0gbW9kaWZpZXIuYXR0cnMuaWQ7XHJcbiAgICBhbHRNb2RpZmllci5zdGFydFNlbGVjdG9yID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdG9yKGFsdE1vZGlmaWVyLnN0YXJ0U2VsZWN0b3IpO1xyXG4gICAgYWx0TW9kaWZpZXIuZW5kU2VsZWN0b3IgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0b3IoYWx0TW9kaWZpZXIuZW5kU2VsZWN0b3IpO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1t0aGlzLl9nZXRFcXVpdmFsZW50U3RhZmYobW9kaWZpZXIuYXNzb2NpYXRlZFN0YWZmKV0ucmVtb3ZlU3RhZmZNb2RpZmllcihhbHRNb2RpZmllcik7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBzZWxlY3RlZCBtb2RpZmllclxyXG4gICAqIEBwYXJhbSBtb2RpZmllciBzbHVyLCBoYWlycGluLCBldGMuXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgcmVtb3ZlU3RhZmZNb2RpZmllcihtb2RpZmllcjogU3RhZmZNb2RpZmllckJhc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudW5kb1N0YWZmTW9kaWZpZXIoJ1NldCBtZWFzdXJlIHByb3BvcnRpb24nLCBtb2RpZmllcixcclxuICAgICAgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5SRU1PVkUpO1xyXG4gICAgdGhpcy5fcmVtb3ZlU3RhZmZNb2RpZmllcihtb2RpZmllcik7XHJcbiAgICB0aGlzLl9yZW5kZXJSZWN0YW5nbGUobW9kaWZpZXIuc3RhcnRTZWxlY3RvciwgbW9kaWZpZXIuZW5kU2VsZWN0b3IpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDaGFuZ2UgYSBzdGFmZiBtb2RpZmllclxyXG4gICAqIEBwYXJhbSBvcmlnaW5hbCBvcmlnaW5hbCB2ZXJzaW9uXHJcbiAgICogQHBhcmFtIG1vZGlmaWVyIG1vZGlmaWVkIHZlcnNpb25cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBhZGRPclVwZGF0ZVN0YWZmTW9kaWZpZXIob3JpZ2luYWw6IFN0YWZmTW9kaWZpZXJCYXNlLCBtb2RpZmllcjogU3RhZmZNb2RpZmllckJhc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghbW9kaWZpZXIpIHtcclxuICAgICAgaWYgKG9yaWdpbmFsKSB7XHJcbiAgICAgICAgLy8gSGFuZGxlIGxlZ2FjeSBBUEkgY2hhbmdlZFxyXG4gICAgICAgIG1vZGlmaWVyID0gU3RhZmZNb2RpZmllckJhc2UuZGVzZXJpYWxpemUob3JpZ2luYWwpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUud2FybigndXBkYXRlIG1vZGlmaWVyOiBiYWQgbW9kaWZpZXInKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZUhlbHBlcnMuZW1wdHlQcm9taXNlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5zY29yZS5zdGF2ZXNbbW9kaWZpZXIuc3RhcnRTZWxlY3Rvci5zdGFmZl1cclxuICAgICAgLmdldE1vZGlmaWVyKG1vZGlmaWVyKTtcclxuICAgIGNvbnN0IHN1YnR5cGUgPSBleGlzdGluZyA9PT0gbnVsbCA/IFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuQUREIDpcclxuICAgICAgVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5VUERBVEU7XHJcbiAgICB0aGlzLnVuZG9TdGFmZk1vZGlmaWVyKCdTZXQgbWVhc3VyZSBwcm9wb3J0aW9uJywgb3JpZ2luYWwsXHJcbiAgICAgIHN1YnR5cGUpO1xyXG4gICAgdGhpcy5fcmVtb3ZlU3RhZmZNb2RpZmllcihtb2RpZmllcik7XHJcbiAgICBjb25zdCBjb3B5ID0gU3RhZmZNb2RpZmllckJhc2UuZGVzZXJpYWxpemUobW9kaWZpZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgY29weS5zdGFydFNlbGVjdG9yID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdG9yKGNvcHkuc3RhcnRTZWxlY3Rvcik7XHJcbiAgICBjb3B5LmVuZFNlbGVjdG9yID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdG9yKGNvcHkuZW5kU2VsZWN0b3IpO1xyXG4gICAgY29uc3Qgc2VsID0gU21vU2VsZWN0aW9uLm5vdGVGcm9tU2VsZWN0b3IodGhpcy5zY29yZSwgbW9kaWZpZXIuc3RhcnRTZWxlY3Rvcik7XHJcbiAgICBpZiAoc2VsICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IGFsdFNlbCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oc2VsKTtcclxuICAgICAgU21vT3BlcmF0aW9uLmFkZFN0YWZmTW9kaWZpZXIoc2VsLCBtb2RpZmllcik7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5hZGRTdGFmZk1vZGlmaWVyKGFsdFNlbCEsIGNvcHkpO1xyXG4gICAgICBjb25zdCBtb2RJZCA9ICdtb2QtJyArIHNlbC5zZWxlY3Rvci5zdGFmZiArICctJyArIHNlbC5zZWxlY3Rvci5tZWFzdXJlO1xyXG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5yZW5kZXJlci5yZW5kZXJlci5nZXRSZW5kZXJlcihzZWwubWVhc3VyZS5zdmcubG9naWNhbEJveCk7XHJcbiAgICAgIGlmIChjb250ZXh0KSB7XHJcbiAgICAgICAgU3ZnSGVscGVycy5yZW1vdmVFbGVtZW50c0J5Q2xhc3MoY29udGV4dC5zdmcsIG1vZElkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fcmVuZGVyUmVjdGFuZ2xlKG1vZGlmaWVyLnN0YXJ0U2VsZWN0b3IsIG1vZGlmaWVyLmVuZFNlbGVjdG9yKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgbGluZU9wZXJhdGlvbihvcDogY3JlYXRlU3RhZmZNb2RpZmllclR5cGU8U3RhZmZNb2RpZmllckJhc2U+KSB7XHJcbiAgICAvLyBpZiAodGhpcy50cmFja2VyLnNlbGVjdGlvbnMubGVuZ3RoIDwgMikge1xyXG4gICAgLy8gICByZXR1cm47XHJcbiAgICAvLyB9XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudW5kb1RyYWNrZXJNZWFzdXJlU2VsZWN0aW9ucygnY3JlYXRlIHN0YWZmIG1vZGlmaWVyJyk7XHJcbiAgICBjb25zdCBmdCA9IHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKTtcclxuICAgIGNvbnN0IHR0ID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oMSk7XHJcbiAgICBjb25zdCBmdEFsdCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oZnQpO1xyXG4gICAgY29uc3QgdHRBbHQgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHR0KTtcclxuICAgIGNvbnN0IG1vZGlmaWVyID0gb3AoZnQsIHR0KTtcclxuICAgIGNvbnN0IGFsdE1vZGlmaWVyID0gb3AoZnRBbHQhLCB0dEFsdCEpO1xyXG4gICAgYWx0TW9kaWZpZXIuYXR0cnMuaWQgPSBtb2RpZmllci5hdHRycy5pZDtcclxuICAgIGZ0LnN0YWZmLmFkZFN0YWZmTW9kaWZpZXIobW9kaWZpZXIpO1xyXG4gICAgZnRBbHQ/LnN0YWZmLmFkZFN0YWZmTW9kaWZpZXIoYWx0TW9kaWZpZXIpO1xyXG4gICAgdGhpcy51bmRvU3RhZmZNb2RpZmllcignYWRkICcgKyBvcCwgbW9kaWZpZXIsIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuQUREKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEFkZCBjcmVzY2VuZG8gdG8gc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgY3Jlc2NlbmRvKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5saW5lT3BlcmF0aW9uKFNtb09wZXJhdGlvbi5jcmVhdGVDcmVzY2VuZG8pO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgY3Jlc2NlbmRvIHRvIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGFzeW5jIGNyZXNjZW5kb0JyYWNrZXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmxpbmVPcGVyYXRpb24oU21vT3BlcmF0aW9uLmNyZWF0ZUNyZXNjZW5kb0JyYWNrZXQpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZGQgY3Jlc2NlbmRvIHRvIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGFzeW5jIGRpbWVudWVuZG8oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmxpbmVPcGVyYXRpb24oU21vT3BlcmF0aW9uLmNyZWF0ZURpbWVudWVuZG9CcmFja2V0KTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWRkIGNyZXNjZW5kbyB0byBzZWxlY3Rpb25cclxuICAgKi9cclxuICBhc3luYyBhY2NlbGVyYW5kbygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubGluZU9wZXJhdGlvbihTbW9PcGVyYXRpb24uY3JlYXRlQWNjZWxlcmFuZG9CcmFja2V0KTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWRkIGNyZXNjZW5kbyB0byBzZWxlY3Rpb25cclxuICAgKi9cclxuICBhc3luYyByaXRhcmQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmxpbmVPcGVyYXRpb24oU21vT3BlcmF0aW9uLmNyZWF0ZVJpdGFyZEJyYWNrZXQpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBkaW1pbnVlbmRvIGhhaXJwaW5cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBkZWNyZXNjZW5kbygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubGluZU9wZXJhdGlvbihTbW9PcGVyYXRpb24uY3JlYXRlRGVjcmVzY2VuZG8pO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyByZW1vdmVUZXh0QnJhY2tldChicmFja2V0OiBTbW9TdGFmZlRleHRCcmFja2V0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZW1vdmVTdGFmZk1vZGlmaWVyKGJyYWNrZXQpO1xyXG4gIH1cclxuICBhc3luYyBhZGRPclJlcGxhY2VTdGFmZk1vZGlmaWVyKGNhbGxiYWNrOiB1cGRhdGVTdGFmZk1vZGlmaWVyRnVuYywgbW9kaWZpZXI6IFN0YWZmTW9kaWZpZXJCYXNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBmcm9tMSA9IFNtb1NlbGVjdGlvbi5ub3RlRnJvbVNlbGVjdG9yKHRoaXMuc2NvcmUsIG1vZGlmaWVyLnN0YXJ0U2VsZWN0b3IpO1xyXG4gICAgY29uc3QgdG8xID0gU21vU2VsZWN0aW9uLm5vdGVGcm9tU2VsZWN0b3IodGhpcy5zY29yZSwgbW9kaWZpZXIuZW5kU2VsZWN0b3IpO1xyXG4gICAgaWYgKGZyb20xID09PSBudWxsIHx8IHRvMSA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBhbHRGcm9tID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihmcm9tMSk7XHJcbiAgICBjb25zdCBhbHRUbyA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24odG8xKTtcclxuICAgIGlmIChhbHRGcm9tID09PSBudWxsIHx8IGFsdFRvID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNhbGxiYWNrKHRoaXMuc2NvcmUsIGZyb20xLCB0bzEpO1xyXG4gICAgY2FsbGJhY2sodGhpcy5zdG9yZVNjb3JlLCBhbHRGcm9tLCBhbHRUbyk7XHJcbiAgICBjb25zdCByZWRyYXcgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZXNCZXR3ZWVuKHRoaXMuc2NvcmUsIGZyb20xLnNlbGVjdG9yLCB0bzEuc2VsZWN0b3IpO1xyXG4gICAgdGhpcy51bmRvU3RhZmZNb2RpZmllcignYWRkIHJlcGwgdGV4dCBicmFja2V0JywgbW9kaWZpZXIsIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuQUREKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhyZWRyYXcpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBhc3luYyBhZGRPclJlcGxhY2VUZXh0QnJhY2tldChtb2RpZmllcjogU21vU3RhZmZUZXh0QnJhY2tldCkge1xyXG4gICAgY29uc3QgZnJvbTEgPSBTbW9TZWxlY3Rpb24ubm90ZUZyb21TZWxlY3Rvcih0aGlzLnNjb3JlLCBtb2RpZmllci5zdGFydFNlbGVjdG9yKTtcclxuICAgIGNvbnN0IHRvMSA9IFNtb1NlbGVjdGlvbi5ub3RlRnJvbVNlbGVjdG9yKHRoaXMuc2NvcmUsIG1vZGlmaWVyLmVuZFNlbGVjdG9yKTtcclxuICAgIGlmIChmcm9tMSA9PT0gbnVsbCB8fCB0bzEgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYWx0RnJvbSA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24oZnJvbTEpO1xyXG4gICAgY29uc3QgYWx0VG8gPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHRvMSk7XHJcbiAgICBpZiAoYWx0RnJvbSA9PT0gbnVsbCB8fCBhbHRUbyA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBTbW9PcGVyYXRpb24uYWRkT3JSZXBsYWNlQnJhY2tldChtb2RpZmllciwgZnJvbTEsIHRvMSk7XHJcbiAgICBTbW9PcGVyYXRpb24uYWRkT3JSZXBsYWNlQnJhY2tldChtb2RpZmllciwgYWx0RnJvbSwgYWx0VG8pO1xyXG4gICAgY29uc3QgcmVkcmF3ID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVzQmV0d2Vlbih0aGlzLnNjb3JlLCBmcm9tMS5zZWxlY3RvciwgdG8xLnNlbGVjdG9yKTtcclxuICAgIHRoaXMudW5kb1N0YWZmTW9kaWZpZXIoJ2FkZCByZXBsIHRleHQgYnJhY2tldCcsIG1vZGlmaWVyLCBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLkFERCk7XHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VkTWVhc3VyZXMocmVkcmF3KTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2x1ciBzZWxlY3RlZCBub3Rlc1xyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkU2x1cigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KHRoaXMudHJhY2tlci5zZWxlY3Rpb25zKTtcclxuICAgIGNvbnN0IGZ0ID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpO1xyXG4gICAgY29uc3QgdHQgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKTtcclxuICAgIGNvbnN0IGZ0QWx0ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihmdCk7XHJcbiAgICBjb25zdCB0dEFsdCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24odHQpO1xyXG4gICAgY29uc3QgbW9kaWZpZXIgPSBTbW9PcGVyYXRpb24uY3JlYXRlU2x1cih0aGlzLnNjb3JlLCBmdCwgdHQpO1xyXG4gICAgZnQuc3RhZmYuYWRkU3RhZmZNb2RpZmllcihtb2RpZmllcik7XHJcbiAgICAvLyBtYWtlIHN1cmUgc2NvcmUgYW5kIGJhY2t1cCBoYXZlIHNhbWUgSUQgZm9yIHVuZG8uXHJcbiAgICBjb25zdCBhbHRNb2RpZmllciA9IFNtb09wZXJhdGlvbi5jcmVhdGVTbHVyKHRoaXMuc3RvcmVTY29yZSwgZnRBbHQhLCB0dEFsdCEpO1xyXG4gICAgYWx0TW9kaWZpZXIuYXR0cnMuaWQgPSBtb2RpZmllci5hdHRycy5pZDtcclxuICAgIGZ0QWx0Py5zdGFmZi5hZGRTdGFmZk1vZGlmaWVyKGFsdE1vZGlmaWVyKTtcclxuICAgIHRoaXMudW5kb1N0YWZmTW9kaWZpZXIoJ2FkZCBzbHVyJywgbW9kaWZpZXIsIFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuQUREKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHRpZSBzZWxlY3RlZCBub3Rlc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHRpZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMubGluZU9wZXJhdGlvbihTbW9PcGVyYXRpb24uY3JlYXRlVGllKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgYXN5bmMgdXBkYXRlWm9vbSh6b29tRmFjdG9yOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG9yaWdpbmFsID0gdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyIS5nZXRHbG9iYWxMYXlvdXQoKTtcclxuICAgIG9yaWdpbmFsLnpvb21TY2FsZSA9IHpvb21GYWN0b3I7XHJcbiAgICB0aGlzLnNjb3JlLmxheW91dE1hbmFnZXIhLmdsb2JhbExheW91dC56b29tU2NhbGUgPSB6b29tRmFjdG9yO1xyXG4gICAgdGhpcy5yZW5kZXJlci5wYWdlTWFwLnVwZGF0ZVpvb20oem9vbUZhY3Rvcik7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnBhZ2VNYXAudXBkYXRlQ29udGFpbmVyT2Zmc2V0KHRoaXMuc2Nyb2xsZXIuc2Nyb2xsU3RhdGUpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBzZXQgZ2xvYmFsIHBhZ2UgZm9yIHNjb3JlLCB6b29tIGV0Yy5cclxuICAgKiBAcGFyYW0gbGF5b3V0IGdsb2JhbCBTVkcgc2V0dGluZ3NcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBzZXRHbG9iYWxMYXlvdXQobGF5b3V0OiBTbW9HbG9iYWxMYXlvdXQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnU2V0IEdsb2JhbCBMYXlvdXQnKTtcclxuICAgIGNvbnN0IG9yaWdpbmFsID0gdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyIS5nZXRHbG9iYWxMYXlvdXQoKS5zdmdTY2FsZTtcclxuICAgIHRoaXMuc2NvcmUubGF5b3V0TWFuYWdlciEudXBkYXRlR2xvYmFsTGF5b3V0KGxheW91dCk7XHJcbiAgICB0aGlzLnNjb3JlLnNjYWxlVGV4dEdyb3VwcyhvcmlnaW5hbCAvIGxheW91dC5zdmdTY2FsZSk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUubGF5b3V0TWFuYWdlciEudXBkYXRlR2xvYmFsTGF5b3V0KGxheW91dCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyQWxsKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5wcmVzZXJ2ZVNjcm9sbCgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGxheW91dCBvZiBhIHNpbmdsZSBwYWdlXHJcbiAgICogQHBhcmFtIGxheW91dCBwYWdlIGxheW91dFxyXG4gICAqIEBwYXJhbSBwYWdlSW5kZXggd2hpY2ggcGFnZSB0byBjaGFuZ2VcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBzZXRQYWdlTGF5b3V0KGxheW91dDogU21vUGFnZUxheW91dCwgcGFnZUluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2NvcmUubGF5b3V0TWFuYWdlciEudXBkYXRlUGFnZShsYXlvdXQsIHBhZ2VJbmRleCk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUubGF5b3V0TWFuYWdlciEudXBkYXRlUGFnZShsYXlvdXQsIHBhZ2VJbmRleCk7XHJcbiAgICAvLyBJZiB3ZSBhcmUgaW4gcGFydCBtb2RlLCBzYXZlIHRoZSBwYWdlIGxheW91dCBpbiB0aGUgcGFydCBzbyBpdCBpcyB0aGVyZSBuZXh0IHRpbWVcclxuICAgIC8vIHRoZSBwYXJ0IGlzIGV4cG9zZWQuXHJcbiAgICBpZiAodGhpcy5pc1BhcnRFeHBvc2VkKCkpIHtcclxuICAgICAgdGhpcy5zY29yZS5zdGF2ZXMuZm9yRWFjaCgoc3RhZmYsIHN0YWZmSXgpID0+IHtcclxuICAgICAgICBzdGFmZi5wYXJ0SW5mby5sYXlvdXRNYW5hZ2VyLnVwZGF0ZVBhZ2UobGF5b3V0LCBwYWdlSW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGFsdFN0YWZmID0gdGhpcy5zdG9yZVNjb3JlLnN0YXZlc1t0aGlzLnN0YWZmTWFwW3N0YWZmSXhdXTtcclxuICAgICAgICBhbHRTdGFmZi5wYXJ0SW5mby5sYXlvdXRNYW5hZ2VyLnVwZGF0ZVBhZ2UobGF5b3V0LCBwYWdlSW5kZXgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMucmVmcmVzaFZpZXdwb3J0KCk7XHJcbiAgfVxyXG4gIGFzeW5jIHNldFBhZ2VMYXlvdXRzKGxheW91dDogU21vUGFnZUxheW91dCwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ1NldCBQYWdlIExheW91dCcpO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgKytpKSB7XHJcbiAgICAgIHRoaXMuc2V0UGFnZUxheW91dChsYXlvdXQsIGkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZW5kZXJlci5yZXJlbmRlckFsbCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlIG11c2ljIGZvbnRcclxuICAgKiBAcGFyYW0gZmFtaWx5IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldEVuZ3JhdmluZ0ZvbnRGYW1pbHkoZmFtaWx5OiBlbmdyYXZpbmdGb250VHlwZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zY29yZS5lbmdyYXZpbmdGb250ID0gZmFtaWx5O1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLmVuZ3JhdmluZ0ZvbnQgPSBmYW1pbHk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLm5vdGlmeUZvbnRDaGFuZ2UoKTsgICBcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVmcmVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBVcGF0ZSBnbG9iYWwgZm9udCB1c2VkIGZvciBjaG9yZCBjaGFuZ2VzXHJcbiAgICogQHBhcmFtIGZvbnRJbmZvXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0Q2hvcmRGb250KGZvbnRJbmZvOiBGb250SW5mbyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdTZXQgQ2hvcmQgRm9udCcpO1xyXG4gICAgdGhpcy5zY29yZS5zZXRDaG9yZEZvbnQoZm9udEluZm8pO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnNldENob3JkRm9udChmb250SW5mbyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGZvbnQgdXNlZCBmb3IgbHlyaWNzXHJcbiAgICogQHBhcmFtIGZvbnRJbmZvIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldEx5cmljRm9udChmb250SW5mbzogRm9udEluZm8pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnU2V0IEx5cmljIEZvbnQnKTtcclxuICAgIHRoaXMuc2NvcmUuc2V0THlyaWNGb250KGZvbnRJbmZvKTtcclxuICAgIHRoaXMuc3RvcmVTY29yZS5zZXRMeXJpY0ZvbnQoZm9udEluZm8pO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSB2YWx1ZSBpZiBmYWxzZSwgbHlyaWMgd2lkdGhzIGRvbid0IGFmZmVjdCBtZWFzdXJlIHdpZHRoXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgc2V0THlyaWNBZGp1c3RXaWR0aCh2YWx1ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdTZXQgTHlyaWMgQWRqIFdpZHRoJyk7XHJcbiAgICB0aGlzLnNjb3JlLnNldEx5cmljQWRqdXN0V2lkdGgodmFsdWUpO1xyXG4gICAgdGhpcy5zdG9yZVNjb3JlLnNldEx5cmljQWRqdXN0V2lkdGgodmFsdWUpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGRlbGV0ZSBzZWxlY3RlZCBtZWFzdXJlc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGRlbGV0ZU1lYXN1cmUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ0RlbGV0ZSBNZWFzdXJlJyk7XHJcbiAgICBpZiAodGhpcy5zdG9yZVNjb3JlLnN0YXZlc1swXS5tZWFzdXJlcy5sZW5ndGggPCAyKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlSGVscGVycy5lbXB0eVByb21pc2UoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QodGhpcy50cmFja2VyLnNlbGVjdGlvbnMpO1xyXG4gICAgLy8gVEhlIG1lYXN1cmVzIGdldCByZW51bWJlcmVkLCBzbyBrZWVwIHRoZSBpbmRleCBhdCAwXHJcbiAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbnNbMF0uc2VsZWN0b3IubWVhc3VyZTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0aW9ucy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAvLyBVbnJlbmRlciB0aGUgZGVsZXRlZCBtZWFzdXJlXHJcbiAgICAgIHRoaXMuc2NvcmUuc3RhdmVzLmZvckVhY2goKHN0YWZmKSA9PiB7XHJcbiAgICAgICAgdGhpcy50cmFja2VyLmNsZWFyTWVhc3VyZU1hcChzdGFmZi5tZWFzdXJlc1tpbmRleF0pO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIudW5yZW5kZXJNZWFzdXJlKHN0YWZmLm1lYXN1cmVzW2luZGV4XSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci51bnJlbmRlck1lYXN1cmUoc3RhZmYubWVhc3VyZXNbc3RhZmYubWVhc3VyZXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgIC8vIEEgbGl0dGxlIGhhY2t5IC0gZGVsZXRlIHRoZSBtb2RpZmllcnMgaWYgdGhleSBzdGFydCBvciBlbmQgb25cclxuICAgICAgICAvLyB0aGUgbWVhc3VyZVxyXG4gICAgICAgIHN0YWZmLnJlbmRlcmFibGVNb2RpZmllcnMuZm9yRWFjaCgobW9kaWZpZXIpID0+IHtcclxuICAgICAgICAgIGlmIChtb2RpZmllci5zdGFydFNlbGVjdG9yLm1lYXN1cmUgPT09IGluZGV4IHx8IG1vZGlmaWVyLmVuZFNlbGVjdG9yLm1lYXN1cmUgPT09IGluZGV4KSB7XHJcbiAgICAgICAgICAgIGlmIChtb2RpZmllci5sb2dpY2FsQm94KSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMucmVuZGVyZXIucmVuZGVyZXIuZ2V0UmVuZGVyZXIobW9kaWZpZXIubG9naWNhbEJveCk7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbnRleHQpIHtcclxuICAgICAgICAgICAgICAgICQoY29udGV4dC5zdmcpLmZpbmQoJ2cuJyArIG1vZGlmaWVyLmF0dHJzLmlkKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIFJlbW92ZSB0aGUgU1ZHIGFydGlmYWN0cyBtYXBwZWQgdG8gdGhpcyBtZWFzdXJlLlxyXG4gICAgICB0aGlzLnNjb3JlLmRlbGV0ZU1lYXN1cmUoaW5kZXgpO1xyXG4gICAgICB0aGlzLnN0b3JlU2NvcmUuZGVsZXRlTWVhc3VyZShpbmRleCk7XHJcbiAgICAgIC8vIE5vdGU6IGluZGV4IGRvZXNuJ3QgaW5jcmVtZW50IHNpbmNlIHRoZXJlIGFyZSBub3cgMSBmZXdlciBtZWFzdXJlc1xyXG4gICAgfTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVmcmVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBhZGQgbnVtYmVyIG9mIG1lYXN1cmVzLCB3aXRoIGRlZmF1bHQgbm90ZXMgc2VsZWN0aW9uc1xyXG4gICAqIEBwYXJhbSBhcHBlbmQgXHJcbiAgICogQHBhcmFtIG51bWJlclRvQWRkIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZE1lYXN1cmVzKGFwcGVuZDogYm9vbGVhbiwgbnVtYmVyVG9BZGQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHBvcyA9IDA7XHJcbiAgICBsZXQgaXggPSAwO1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdBZGQgTWVhc3VyZScpO1xyXG4gICAgZm9yIChpeCA9IDA7IGl4IDwgbnVtYmVyVG9BZGQ7ICsraXgpIHtcclxuICAgICAgY29uc3QgbWVhc3VyZSA9IHRoaXMudHJhY2tlci5nZXRGaXJzdE1lYXN1cmVPZlNlbGVjdGlvbigpO1xyXG4gICAgICBpZiAobWVhc3VyZSkge1xyXG4gICAgICAgIGNvbnN0IG5tZWFzdXJlID0gU21vTWVhc3VyZS5nZXREZWZhdWx0TWVhc3VyZVdpdGhOb3RlcyhtZWFzdXJlKTtcclxuICAgICAgICBwb3MgPSBtZWFzdXJlLm1lYXN1cmVOdW1iZXIubWVhc3VyZUluZGV4O1xyXG4gICAgICAgIGlmIChhcHBlbmQpIHtcclxuICAgICAgICAgIHBvcyArPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBubWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCA9IHBvcztcclxuICAgICAgICBubWVhc3VyZS5zZXRBY3RpdmVWb2ljZSgwKTtcclxuICAgICAgICB0aGlzLnNjb3JlLmFkZE1lYXN1cmUocG9zKTtcclxuICAgICAgICB0aGlzLnN0b3JlU2NvcmUuYWRkTWVhc3VyZShwb3MpOyAgICAgICAgXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IHN0YXJ0TWVhc3VyZSA9IHBvcyAtIChpeCAtIDEpO1xyXG4gICAgY29uc3Qgc3RhcnRTZWxlY3RvciA9IFNtb1NlbGVjdG9yLmRlZmF1bHQ7XHJcbiAgICBjb25zdCBlbmRTZWxlY3RvciA9IFNtb1NlbGVjdG9yLmRlZmF1bHQ7XHJcbiAgICBzdGFydFNlbGVjdG9yLm1lYXN1cmUgPSBzdGFydE1lYXN1cmU7XHJcbiAgICBlbmRTZWxlY3Rvci5tZWFzdXJlID0gcG9zO1xyXG4gICAgdGhpcy5fcmVuZGVyUmVjdGFuZ2xlKHN0YXJ0U2VsZWN0b3IsIGVuZFNlbGVjdG9yKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVmcmVzaCgpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBhZGQgYSBzaW5nbGUgbWVhc3VyZSBiZWZvcmUgb3IgYWZ0ZXIgc2VsZWN0aW9uXHJcbiAgICogQHBhcmFtIGFwcGVuZCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBhZGRNZWFzdXJlKGFwcGVuZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fdW5kb1Njb3JlKCdBZGQgTWVhc3VyZScpO1xyXG4gICAgbGV0IHBvcyA9IDA7XHJcbiAgICBjb25zdCBtZWFzdXJlID0gdGhpcy50cmFja2VyLmdldEZpcnN0TWVhc3VyZU9mU2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoIW1lYXN1cmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm1lYXN1cmUgPSBTbW9NZWFzdXJlLmdldERlZmF1bHRNZWFzdXJlV2l0aE5vdGVzKG1lYXN1cmUpO1xyXG4gICAgcG9zID0gbWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleDtcclxuICAgIGlmIChhcHBlbmQpIHtcclxuICAgICAgcG9zICs9IDE7XHJcbiAgICB9XHJcbiAgICBubWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCA9IHBvcztcclxuICAgIG5tZWFzdXJlLnNldEFjdGl2ZVZvaWNlKDApO1xyXG4gICAgdGhpcy5zY29yZS5hZGRNZWFzdXJlKHBvcyk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUuYWRkTWVhc3VyZShwb3MpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5jbGVhckxpbmUobWVhc3VyZSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlZnJlc2goKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogcmVtb3ZlIGFuIGVudGlyZSBsaW5lIG9mIG11c2ljXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBhc3luYyByZW1vdmVTdGFmZigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3VuZG9TY29yZSgnUmVtb3ZlIEluc3RydW1lbnQnKTtcclxuICAgIGlmICh0aGlzLnN0b3JlU2NvcmUuc3RhdmVzLmxlbmd0aCA8IDIgfHwgdGhpcy5zY29yZS5zdGF2ZXMubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZUhlbHBlcnMuZW1wdHlQcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICAvLyBpZiB3ZSBhcmUgbG9va2luZyBhdCBhIHN1YnNldCBvZiB0aGUgc2NvcmUsXHJcbiAgICAvLyByZXZlcnQgdG8gdGhlIGZ1bGwgc2NvcmUgdmlldyBiZWZvcmUgcmVtb3ZpbmcgdGhlIHN0YWZmLlxyXG4gICAgY29uc3QgdG9SZW1vdmU6IG51bWJlcltdID0gW107XHJcbiAgICBjb25zdCBzZWxlY3RlZFN0YXZlczogUmVjb3JkPG51bWJlciwgYm9vbGVhbj4gID0ge307XHJcbiAgICB0aGlzLnRyYWNrZXIuc2VsZWN0aW9ucy5mb3JFYWNoKChzZWwpID0+IHtcclxuICAgICAgY29uc3Qgc2NvcmVTZWwgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKHNlbCk7XHJcbiAgICAgIGlmICghc2VsZWN0ZWRTdGF2ZXNbc2NvcmVTZWwhLnNlbGVjdG9yLnN0YWZmXSkge1xyXG4gICAgICAgIHNlbGVjdGVkU3RhdmVzW3Njb3JlU2VsIS5zZWxlY3Rvci5zdGFmZl0gPSB0cnVlO1xyXG4gICAgICAgIHRvUmVtb3ZlLnB1c2goc2NvcmVTZWwhLnNlbGVjdG9yLnN0YWZmKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBTb3J0IGluIGRlc2NlbmRpbmcgb3JkZXIgc28gd2UgZG9uJ3QgbWVzcyB1cCB0aGUgc3RhZmYgaW5kaWNlcyBhcyB3ZSByZW1vdmVcclxuICAgIHRvUmVtb3ZlLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcclxuICAgIHRvUmVtb3ZlLmZvckVhY2goKHN0YWZmSW5kZXgpID0+IHtcclxuICAgICAgU21vT3BlcmF0aW9uLnJlbW92ZVN0YWZmKHRoaXMuc3RvcmVTY29yZSwgc3RhZmZJbmRleCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMudmlld0FsbCgpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZWZyZXNoKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGFzeW5jIGFkZFN0YWZmKGluc3RydW1lbnQ6IFNtb1N5c3RlbVN0YWZmUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ0FkZCBJbnN0cnVtZW50Jyk7XHJcbiAgICAvLyBpZiB3ZSBhcmUgbG9va2luZyBhdCBhIHN1YnNldCBvZiB0aGUgc2NvcmUsIHdlIHdvbid0IHNlZSB0aGUgbmV3IHN0YWZmLiAgU29cclxuICAgIC8vIHJldmVydCB0byB0aGUgZnVsbCB2aWV3XHJcbiAgICBjb25zdCBzdGFmZiA9IFNtb09wZXJhdGlvbi5hZGRTdGFmZih0aGlzLnN0b3JlU2NvcmUsIGluc3RydW1lbnQpO1xyXG4gICAgY29uc3QgaW5zdEtleXMgPSBPYmplY3Qua2V5cyhzdGFmZi5tZWFzdXJlSW5zdHJ1bWVudE1hcCk7XHJcbiAgICAvLyB1cGRhdGUgdGhlIGtleSBzaWduYXR1cmVzIGZvciB0aGUgbmV3IHBhcnRcclxuICAgIGluc3RLZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBudW1LZXkgPSBwYXJzZUludChrZXksIDEwKTtcclxuICAgICAgY29uc3QgaW5zdCA9IHN0YWZmLm1lYXN1cmVJbnN0cnVtZW50TWFwW251bUtleV07XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uaW5uZXJTZWxlY3Rpb25zKHRoaXMuc3RvcmVTY29yZSwgaW5zdC5zdGFydFNlbGVjdG9yLCBpbnN0LmVuZFNlbGVjdG9yKTtcclxuICAgICAgU21vT3BlcmF0aW9uLmNoYW5nZUluc3RydW1lbnQoaW5zdCwgdGhpcy5zdG9yZVNjb3JlLCBzZWxlY3Rpb25zKTtcclxuICAgIH0pXHJcbiAgICBpZiAoaW5zdHJ1bWVudC5zdGFmZklkID4gMCkge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBTbW9TZWxlY3Rpb24ubWVhc3VyZVNlbGVjdGlvbih0aGlzLnN0b3JlU2NvcmUsIGluc3RydW1lbnQuc3RhZmZJZCAtIDEsIDApO1xyXG4gICAgICBjb25zdCBzZWwgPSBTbW9TZWxlY3Rvci5kZWZhdWx0O1xyXG4gICAgICBzZWwuc3RhZmYgPSBpbnN0cnVtZW50LnN0YWZmSWQgLSAxO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgbGV0IGdycCA9IHRoaXMuc3RvcmVTY29yZS5nZXRTeXN0ZW1Hcm91cEZvclN0YWZmKHNlbGVjdGlvbik7XHJcbiAgICAgICAgaWYgKGdycCkge1xyXG4gICAgICAgICAgZ3JwLmVuZFNlbGVjdG9yLnN0YWZmID0gaW5zdHJ1bWVudC5zdGFmZklkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgZ3JwID0gbmV3IFNtb1N5c3RlbUdyb3VwKFNtb1N5c3RlbUdyb3VwLmRlZmF1bHRzKTtcclxuICAgICAgICAgIGdycC5zdGFydFNlbGVjdG9yLnN0YWZmID0gaW5zdHJ1bWVudC5zdGFmZklkIC0gMTtcclxuICAgICAgICAgIGdycC5lbmRTZWxlY3Rvci5zdGFmZiA9IGluc3RydW1lbnQuc3RhZmZJZDtcclxuICAgICAgICAgIHRoaXMuc3RvcmVTY29yZS5zeXN0ZW1Hcm91cHMucHVzaChncnApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3QWxsKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBwYXJ0IGluZm8gYXNzdW1lcyB0aGF0IHRoZSBwYXJ0IGlzIGN1cnJlbnRseSBleHBvc2VkIC0gdGhhdFxyXG4gICAqIHN0YWZmIDAgaXMgdGhlIGZpcnN0IHN0YWZmIGluIHRoZSBwYXJ0IHByaW9yIHRvIGVkaXRpbmcuXHJcbiAgICogQHBhcmFtIGluZm9cclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVQYXJ0SW5mbyhpbmZvOiBTbW9QYXJ0SW5mbyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGk6IG51bWJlciA9IDA7XHJcbiAgICB0aGlzLl91bmRvU2NvcmUoJ1VwZGF0ZSBwYXJ0IGluZm8nKTtcclxuICAgIGNvbnN0IHN0b3JlU3RhZmYgPSB0aGlzLnN0YWZmTWFwWzBdIC0gaW5mby5zdGF2ZXNCZWZvcmU7XHJcbiAgICBjb25zdCBwYXJ0TGVuZ3RoID0gaW5mby5zdGF2ZXNCZWZvcmUgKyBpbmZvLnN0YXZlc0FmdGVyICsgMTtcclxuICAgIGNvbnN0IHJlc2V0VmlldyA9ICFTbW9MYXlvdXRNYW5hZ2VyLmFyZUxheW91dHNFcXVhbChpbmZvLmxheW91dE1hbmFnZXIuZ2V0R2xvYmFsTGF5b3V0KCksIHRoaXMuc2NvcmUubGF5b3V0TWFuYWdlciEuZ2V0R2xvYmFsTGF5b3V0KCkpO1xyXG4gICAgY29uc3QgcmVzdENoYW5nZSA9IHRoaXMuc2NvcmUuc3RhdmVzWzBdLnBhcnRJbmZvLmV4cGFuZE11bHRpbWVhc3VyZVJlc3RzICE9IGluZm8uZXhwYW5kTXVsdGltZWFzdXJlUmVzdHM7XHJcbiAgICBjb25zdCBzdGF2ZXNDaGFuZ2UgPSB0aGlzLnNjb3JlLnN0YXZlc1swXS5wYXJ0SW5mby5zdGF2ZXNBZnRlciAhPT0gaW5mby5zdGF2ZXNBZnRlcjtcclxuICAgIHRoaXMuUGFydE5hbWUudmFsdWUgPSBpbmZvLnBhcnROYW1lO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHBhcnRMZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBuU3RhZmZJbmRleCA9IHN0b3JlU3RhZmYgKyBpO1xyXG4gICAgICBjb25zdCBuSW5mbyA9IG5ldyBTbW9QYXJ0SW5mbyhpbmZvKTtcclxuICAgICAgbkluZm8uc3RhdmVzQmVmb3JlID0gaTtcclxuICAgICAgbkluZm8uc3RhdmVzQWZ0ZXIgPSBwYXJ0TGVuZ3RoIC0gaSAtIDE7XHJcbiAgICAgIHRoaXMuc3RvcmVTY29yZS5zdGF2ZXNbblN0YWZmSW5kZXhdLnBhcnRJbmZvID0gbkluZm87XHJcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBuZXh0IHN0YXZlIGluIHRoZSBzY29yZSBoYXMgdGhlIGNvcnJlY3QgJ3N0YXZlcyBiZWZvcmUnIHNldHRpbmdcclxuICAgICAgaWYgKHRoaXMuc3RvcmVTY29yZS5zdGF2ZXMubGVuZ3RoID4gblN0YWZmSW5kZXggKyAxKSB7XHJcbiAgICAgICAgaWYgKG5JbmZvLnN0YXZlc0FmdGVyID09PSAwKSB7XHJcbiAgICAgICAgICBjb25zdCBuZXh0U3RhZmYgPSB0aGlzLnN0b3JlU2NvcmUuc3RhdmVzW25TdGFmZkluZGV4ICsgMV07XHJcbiAgICAgICAgICBuZXh0U3RhZmYucGFydEluZm8uc3RhdmVzQmVmb3JlID0gMDtcclxuICAgICAgICAgIGNvbnN0IG5leHRTdGFmZkRpc3BsYXlJbmRleCA9IHRoaXMuc3RhZmZNYXAuZmluZEluZGV4KCh4KSA9PiB4ID09PSBuU3RhZmZJbmRleCArIDEpO1xyXG4gICAgICAgICAgaWYgKG5leHRTdGFmZkRpc3BsYXlJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NvcmUuc3RhdmVzW25leHRTdGFmZkRpc3BsYXlJbmRleF0ucGFydEluZm8gPSBcclxuICAgICAgICAgICAgICBuZXcgU21vUGFydEluZm8obmV4dFN0YWZmLnBhcnRJbmZvKTsgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIElmIHRoZSBzdGFmZiBpbmRleCBpcyBjdXJyZW50bHkgZGlzcGxheWVkLCBcclxuICAgICAgY29uc3QgZGlzcGxheWVkSW5kZXggPSB0aGlzLnN0YWZmTWFwLmZpbmRJbmRleCgoeCkgPT4geCA9PT0gblN0YWZmSW5kZXgpO1xyXG4gICAgICBpZiAoZGlzcGxheWVkSW5kZXggPj0gMCkge1xyXG4gICAgICAgIHRoaXMuc2NvcmUuc3RhdmVzW2Rpc3BsYXllZEluZGV4XS5wYXJ0SW5mbyA9IG5ldyBTbW9QYXJ0SW5mbyhuSW5mbyk7XHJcbiAgICAgICAgdGhpcy5zY29yZS5sYXlvdXRNYW5hZ2VyID0gbkluZm8ubGF5b3V0TWFuYWdlcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHJlc2V0VmlldyB8fCByZXN0Q2hhbmdlIHx8IHN0YXZlc0NoYW5nZSkge1xyXG4gICAgICBTbW9PcGVyYXRpb24uY29tcHV0ZU11bHRpcGFydFJlc3QodGhpcy5zY29yZSk7XHJcbiAgICAgIC8vIHRoaXMucmVzZXRQYXJ0VmlldygpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlcmVuZGVyQWxsKClcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQSBzaW1wbGVyIEFQSSBmb3IgYXBwbGljYXRpb25zIHRvIGFkZCBhIG5ldyBzdGFmZiB0byB0aGUgc2NvcmUuXHJcbiAgICogQHBhcmFtIHBhcmFtcyAtIHRoZSBpbnN0cnVtZW50LCB3aGljaCBkZXRlcm1pbmVzIGNsZWYsIGV0Yy5cclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBhZGRTdGFmZlNpbXBsZShwYXJhbXM6IFBhcnRpYWw8U21vSW5zdHJ1bWVudFBhcmFtcz4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGluc3RydW1lbnRQYXJhbXMgPSBTbW9JbnN0cnVtZW50LmRlZmF1bHRzO1xyXG4gICAgaW5zdHJ1bWVudFBhcmFtcy5zdGFydFNlbGVjdG9yLnN0YWZmID0gaW5zdHJ1bWVudFBhcmFtcy5lbmRTZWxlY3Rvci5zdGFmZiA9IHRoaXMuc2NvcmUuc3RhdmVzLmxlbmd0aDtcclxuICAgIGluc3RydW1lbnRQYXJhbXMuY2xlZiA9IHBhcmFtcy5jbGVmID8/IGluc3RydW1lbnRQYXJhbXMuY2xlZjtcclxuXHJcbiAgICBjb25zdCBzdGFmZlBhcmFtcyA9IFNtb1N5c3RlbVN0YWZmLmRlZmF1bHRzO1xyXG4gICAgc3RhZmZQYXJhbXMuc3RhZmZJZCA9IHRoaXMuc3RvcmVTY29yZS5zdGF2ZXMubGVuZ3RoOyAvLyBhZGQgYSBzdGFmZlxyXG4gICAgc3RhZmZQYXJhbXMubWVhc3VyZUluc3RydW1lbnRNYXBbMF0gPSBuZXcgU21vSW5zdHJ1bWVudChpbnN0cnVtZW50UGFyYW1zKTtcclxuICAgIHRoaXMuYWRkU3RhZmYoc3RhZmZQYXJhbXMpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTYXZlIHRoZSBzY29yZSB0byBsb2NhbCBzdG9yYWdlLlxyXG4gICAqL1xyXG4gIHF1aWNrU2F2ZSgpIHtcclxuICAgIGNvbnN0IHNjb3JlU3RyID0gSlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZVNjb3JlLnNlcmlhbGl6ZSgpKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHNtb1NlcmlhbGl6ZS5sb2NhbFNjb3JlLCBzY29yZVN0cik7XHJcbiAgfVxyXG4gIHVwZGF0ZVJlcGVhdENvdW50KGNvdW50OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy51bmRvVHJhY2tlck1lYXN1cmVTZWxlY3Rpb25zKCdyZXBlYXQgYmFyJyk7XHJcbiAgICBjb25zdCBzeW1ib2wgPSBjb3VudCA+IDAgPyB0cnVlIDogZmFsc2U7ICAgIFxyXG4gICAgbWVhc3VyZVNlbGVjdGlvbnMuZm9yRWFjaCgobXMpID0+IHtcclxuICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKG1zKTtcclxuICAgICAgbXMubWVhc3VyZS5yZXBlYXRDb3VudCA9IGNvdW50O1xyXG4gICAgICBtcy5tZWFzdXJlLnJlcGVhdFN5bWJvbCA9IHN5bWJvbDtcclxuICAgICAgaWYgKHN0b3JlKSB7XHJcbiAgICAgICAgc3RvcmUubWVhc3VyZS5yZXBlYXRDb3VudCA9IGNvdW50O1xyXG4gICAgICAgIHN0b3JlLm1lYXN1cmUucmVwZWF0U3ltYm9sID0gc3ltYm9sO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhtZWFzdXJlU2VsZWN0aW9ucyk7XHJcbiAgICByZXR1cm4gdGhpcy51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgbWVhc3VyZSBmb3JtYXR0aW5nIHBhcmFtZXRlcnMgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvblxyXG4gICAqIEBwYXJhbSBmb3JtYXQgZ2VuZXJpYyBtZWFzdXJlIGZvcm1hdHRpbmcgcGFyYW1ldGVyc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHNldE1lYXN1cmVGb3JtYXQoZm9ybWF0OiBTbW9NZWFzdXJlRm9ybWF0KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IGxhYmVsID0gJ3NldCBtZWFzdXJlIGZvcm1hdCc7XHJcbiAgICBjb25zdCBmcm9tU2VsZWN0b3IgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigtMSkuc2VsZWN0b3I7XHJcbiAgICBjb25zdCB0b1NlbGVjdG9yID0gdGhpcy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oMSkuc2VsZWN0b3I7XHJcbiAgICBjb25zdCBtZWFzdXJlU2VsZWN0aW9ucyA9IHRoaXMudHJhY2tlci5nZXRTZWxlY3RlZE1lYXN1cmVzKCk7XHJcbiAgICAvLyBJZiB0aGUgZm9ybWF0dGluZyBpcyBvbiBhIHBhcnQsIHByZXNlcnZlIGl0IGluIHRoZSBwYXJ0J3MgaW5mb1xyXG4gICAgY29uc3QgaXNQYXJ0ID0gdGhpcy5pc1BhcnRFeHBvc2VkKCk7XHJcbiAgICBtZWFzdXJlU2VsZWN0aW9ucy5mb3JFYWNoKChtKSA9PiB7XHJcbiAgICAgIHRoaXMuX3VuZG9Db2x1bW4obGFiZWwsIG0uc2VsZWN0b3IubWVhc3VyZSk7XHJcbiAgICAgIFNtb09wZXJhdGlvbi5zZXRNZWFzdXJlRm9ybWF0KHRoaXMuc2NvcmUsIG0sIGZvcm1hdCk7XHJcbiAgICAgIGlmIChpc1BhcnQpIHtcclxuICAgICAgICBtLnN0YWZmLnBhcnRJbmZvLm1lYXN1cmVGb3JtYXR0aW5nW20ubWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleF0gPSBuZXcgU21vTWVhc3VyZUZvcm1hdChmb3JtYXQpO1xyXG4gICAgICAgIGNvbnN0IGFsdCA9IHRoaXMuX2dldEVxdWl2YWxlbnRTZWxlY3Rpb24obSk7XHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVGb3JtYXQodGhpcy5zdG9yZVNjb3JlLCBhbHQhLCBmb3JtYXQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIElmIHdlIGFyZSBzZWVpbmcgc29tZSBzZXQgb2Ygc3RhdmVzIHRoYXQgaXMgbm90IGEgcGFydCwgbWFrZSBzdXJlIHRoZSB3aG9sZSBjb2x1bW4gaW4gdGhlIFxyXG4gICAgICAgIC8vIHNjb3JlIGlzIHVwZGF0ZWQuXHJcbiAgICAgICAgY29uc3QgZmlyc3RSb3cgPSBTbW9TZWxlY3Rpb24uc2VsZWN0aW9uRnJvbVNlbGVjdG9yKFxyXG4gICAgICAgICAgdGhpcy5zdG9yZVNjb3JlLCB7XHJcbiAgICAgICAgICAgIHN0YWZmOiAwLCBtZWFzdXJlOiBtLnNlbGVjdG9yLm1lYXN1cmUsIHZvaWNlOiBtLnNlbGVjdG9yLnZvaWNlLCB0aWNrOiBtLnNlbGVjdG9yLnRpY2ssIHBpdGNoZXM6IFtdIH1cclxuICAgICAgICApXHJcbiAgICAgICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVGb3JtYXQodGhpcy5zdG9yZVNjb3JlLCBmaXJzdFJvdyEsIGZvcm1hdCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYWx0ID0gdGhpcy5fZ2V0RXF1aXZhbGVudFNlbGVjdGlvbihtKTtcclxuICAgICAgU21vT3BlcmF0aW9uLnNldE1lYXN1cmVGb3JtYXQodGhpcy5zdG9yZVNjb3JlLCBhbHQhLCBmb3JtYXQpO1xyXG4gICAgICBpZiAoaXNQYXJ0KSB7XHJcbiAgICAgICAgYWx0IS5zdGFmZi5wYXJ0SW5mby5tZWFzdXJlRm9ybWF0dGluZ1ttLm1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXhdID0gbmV3IFNtb01lYXN1cmVGb3JtYXQoZm9ybWF0KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9yZW5kZXJSZWN0YW5nbGUoZnJvbVNlbGVjdG9yLCB0b1NlbGVjdG9yKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHN5c3RlbSBicmVha3MgZnJvbSB0aGUgbWVhc3VyZSBmb3JtYXR0aW5nIGZvciBzZWxlY3RlZCBtZWFzdXJlc1xyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHJlbW92ZVN5c3RlbUJyZWFrcygpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgbGFiZWwgPSAnc2V0IG1lYXN1cmUgZm9ybWF0JztcclxuICAgIGNvbnN0IGZyb21TZWxlY3RvciA9IHRoaXMudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKS5zZWxlY3RvcjtcclxuICAgIGNvbnN0IHRvU2VsZWN0b3IgPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigxKS5zZWxlY3RvcjtcclxuICAgIGNvbnN0IG1lYXN1cmVTZWxlY3Rpb25zID0gdGhpcy50cmFja2VyLmdldFNlbGVjdGVkTWVhc3VyZXMoKTtcclxuICAgIC8vIElmIHRoZSBmb3JtYXR0aW5nIGlzIG9uIGEgcGFydCwgcHJlc2VydmUgaXQgaW4gdGhlIHBhcnQncyBpbmZvXHJcbiAgICBjb25zdCBpc1BhcnQgPSB0aGlzLmlzUGFydEV4cG9zZWQoKTtcclxuICAgIG1lYXN1cmVTZWxlY3Rpb25zLmZvckVhY2goKG0pID0+IHtcclxuICAgICAgdGhpcy5fdW5kb0NvbHVtbihsYWJlbCwgbS5zZWxlY3Rvci5tZWFzdXJlKTtcclxuICAgICAgY29uc3QgZm9ybWF0ID0gbmV3IFNtb01lYXN1cmVGb3JtYXQobS5tZWFzdXJlLmZvcm1hdCk7XHJcbiAgICAgIGZvcm1hdC5zeXN0ZW1CcmVhayA9IGZhbHNlO1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0TWVhc3VyZUZvcm1hdCh0aGlzLnNjb3JlLCBtLCBmb3JtYXQpO1xyXG4gICAgICBpZiAoaXNQYXJ0KSB7XHJcbiAgICAgICAgbS5zdGFmZi5wYXJ0SW5mby5tZWFzdXJlRm9ybWF0dGluZ1ttLm1lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXhdID0gbmV3IFNtb01lYXN1cmVGb3JtYXQoZm9ybWF0KTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhbHQgPSB0aGlzLl9nZXRFcXVpdmFsZW50U2VsZWN0aW9uKG0pO1xyXG4gICAgICBTbW9PcGVyYXRpb24uc2V0TWVhc3VyZUZvcm1hdCh0aGlzLnN0b3JlU2NvcmUsIGFsdCEsIGZvcm1hdCk7XHJcbiAgICAgIGlmIChpc1BhcnQpIHtcclxuICAgICAgICBhbHQhLnN0YWZmLnBhcnRJbmZvLm1lYXN1cmVGb3JtYXR0aW5nW20ubWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleF0gPSBuZXcgU21vTWVhc3VyZUZvcm1hdChmb3JtYXQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JlbmRlclJlY3RhbmdsZShmcm9tU2VsZWN0b3IsIHRvU2VsZWN0b3IpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICByZW51bWJlck1lYXN1cmVzKG1lYXN1cmVJbmRleDogbnVtYmVyLCBkaXNwbGF5SW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zY29yZS51cGRhdGVSZW51bWJlcmluZ01hcChtZWFzdXJlSW5kZXgsIGRpc3BsYXlJbmRleCk7XHJcbiAgICB0aGlzLnN0b3JlU2NvcmUudXBkYXRlUmVudW1iZXJpbmdNYXAobWVhc3VyZUluZGV4LCBkaXNwbGF5SW5kZXgpO1xyXG4gICAgY29uc3QgbW1zZWwgPSBTbW9TZWxlY3Rpb24ubWVhc3VyZVNlbGVjdGlvbih0aGlzLnNjb3JlLCAwLCBtZWFzdXJlSW5kZXgpO1xyXG4gICAgaWYgKG1tc2VsKSB7XHJcbiAgICAgIHRoaXMuX3JlbmRlckNoYW5nZWRNZWFzdXJlcyhbbW1zZWxdKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUGxheSB0aGUgbXVzaWMgZnJvbSB0aGUgc3RhcnRpbmcgc2VsZWN0aW9uXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgcGxheUZyb21TZWxlY3Rpb24oKSB7XHJcbiAgICB2YXIgbW0gPSB0aGlzLnRyYWNrZXIuZ2V0RXh0cmVtZVNlbGVjdGlvbigtMSk7XHJcbiAgICBpZiAoU3VpQXVkaW9QbGF5ZXIucGxheWluZ0luc3RhbmNlICYmIFN1aUF1ZGlvUGxheWVyLnBsYXlpbmdJbnN0YW5jZS5wYXVzZWQpIHtcclxuICAgICAgU3VpQXVkaW9QbGF5ZXIucGxheWluZ0luc3RhbmNlLnBsYXkoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKFN1aUF1ZGlvUGxheWVyLnBsYXlpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbmV3IFN1aUF1ZGlvUGxheWVyKHsgYXVkaW9BbmltYXRpb246IHRoaXMuYXVkaW9BbmltYXRpb24sIHNjb3JlOiB0aGlzLnNjb3JlLCBzdGFydEluZGV4OiBtbS5zZWxlY3Rvci5tZWFzdXJlLCB2aWV3OiB0aGlzIH0pLnBsYXkoKTtcclxuICB9XHJcbiAgc3RvcFBsYXllcigpIHtcclxuICAgIFN1aUF1ZGlvUGxheWVyLnN0b3BQbGF5ZXIoKTtcclxuICB9XHJcbiAgcGF1c2VQbGF5ZXIoKSB7XHJcbiAgICBTdWlBdWRpb1BsYXllci5wYXVzZVBsYXllcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJveHkgY2FsbHMgdG8gbW92ZSB0aGUgdHJhY2tlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byB0aGVcclxuICAgKiBydWxlcyBvZiB0aGUgJ0hvbWUnIGtleSAoZGVwZW5kaW5nIG9uIHNoaWZ0L2N0cmwvYWx0KVxyXG4gICAqIEBwYXJhbSBldiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlSG9tZShldjogS2V5RXZlbnQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLm1vdmVIb21lKGV2KTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQcm94eSBjYWxscyB0byBtb3ZlIHRoZSB0cmFja2VyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHRoZVxyXG4gICAqIHJ1bGVzIG9mIHRoZSAnRW5kJyBrZXkgKGRlcGVuZGluZyBvbiBzaGlmdC9jdHJsL2FsdClcclxuICAgKiBAcGFyYW0gZXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgIGFzeW5jIG1vdmVFbmQoZXY6IEtleUV2ZW50KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlRW5kKGV2KTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHcm93IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSBvbmUgdG8gdGhlIGxlZnQsIGlmIHBvc3NpYmxlXHJcbiAgICogQHBhcmFtIGV2IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gICBhc3luYyBncm93U2VsZWN0aW9uTGVmdCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmdyb3dTZWxlY3Rpb25MZWZ0KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR3JvdyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgb25lIHRvIHRoZSByaWdodCwgaWYgcG9zc2libGVcclxuICAgKiBAcGFyYW0gZXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgIGFzeW5jIGdyb3dTZWxlY3Rpb25SaWdodCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmdyb3dTZWxlY3Rpb25SaWdodCgpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNlbGVjdCB0aGUgbmV4dCB0YWJiYWJsZSBtb2RpZmllciBuZWFyIG9uZSBvZiB0aGUgc2VsZWN0ZWQgbm90ZXNcclxuICAgKiBAcGFyYW0ga2V5RXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgYWR2YW5jZU1vZGlmaWVyU2VsZWN0aW9uKGtleUV2OiBLZXlFdmVudCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIuYWR2YW5jZU1vZGlmaWVyU2VsZWN0aW9uKGtleUV2KTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZWxlY3QgdGhlIG5leHQgZW50aXJlIG1lYXN1cmUsIGlmIHBvc3NpYmxlXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgZ3Jvd1NlbGVjdGlvblJpZ2h0TWVhc3VyZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmdyb3dTZWxlY3Rpb25SaWdodE1lYXN1cmUoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZHZhbmNlIGN1cnNvciBmb3J3YXJkcywgaWYgcG9zc2libGVcclxuICAgKiBAcGFyYW0gZXYgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgYXN5bmMgbW92ZVNlbGVjdGlvblJpZ2h0KCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIubW92ZVNlbGVjdGlvblJpZ2h0KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWR2YW5jZSBjdXJzb3IgYmFja3dhcmRzLCBpZiBwb3NzaWJsZVxyXG4gICAqIEBwYXJhbSBldiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uTGVmdCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLm1vdmVTZWxlY3Rpb25MZWZ0KCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQWR2YW5jZSBjdXJzb3IgYmFjayBlbnRpcmUgbWVhc3VyZSwgaWYgcG9zc2libGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uTGVmdE1lYXN1cmUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uTGVmdE1lYXN1cmUoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBBZHZhbmNlIGN1cnNvciBmb3J3YXJkIG9uZSBtZWFzdXJlLCBpZiBwb3NzaWJsZVxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIG1vdmVTZWxlY3Rpb25SaWdodE1lYXN1cmUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uUmlnaHRNZWFzdXJlKCk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogTW92ZSBjdXJzb3IgdG8gYSBoaWdoZXIgcGl0Y2ggaW4gdGhlIGN1cnJlbnQgY2hvcmQsIHdpdGggd3JhcFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGFzeW5jIG1vdmVTZWxlY3Rpb25QaXRjaFVwKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIubW92ZVNlbGVjdGlvblBpdGNoVXAoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBNb3ZlIGN1cnNvciB0byBhIGxvd2VyIHBpdGNoIGluIHRoZSBjdXJyZW50IGNob3JkLCB3aXRoIHdyYXBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uUGl0Y2hEb3duKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnRyYWNrZXIubW92ZVNlbGVjdGlvblBpdGNoRG93bigpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE1vdmUgY3Vyc29yIHVwIGEgc3RhZmYgaW4gdGhlIHN5c3RlbSwgaWYgcG9zc2libGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBhc3luYyBtb3ZlU2VsZWN0aW9uVXAoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uVXAoKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBNb3ZlIGN1cnNvciBkb3duIGEgc3RhZmYgaW4gdGhlIHN5c3RlbSwgaWYgcG9zc2libGVcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICAgYXN5bmMgbW92ZVNlbGVjdGlvbkRvd24oKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudHJhY2tlci5tb3ZlU2VsZWN0aW9uRG93bigpO1xyXG4gICAgYXdhaXQgdGhpcy5yZW5kZXJlci51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgY3VycmVudCBzdWdnZXN0aW9ucyAoaG92ZXIgZWxlbWVudCkgYXMgdGhlIHNlbGVjdGlvblxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gICBhc3luYyBzZWxlY3RTdWdnZXN0aW9uKGV2RGF0YTogS2V5RXZlbnQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLnNlbGVjdFN1Z2dlc3Rpb24oZXZEYXRhKTtcclxuICAgIGF3YWl0IHRoaXMucmVuZGVyZXIudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGJveCwgYW5kIG1ha2UgaXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXHJcbiAgICogICovXHJcbiAgYXN5bmMgaW50ZXJzZWN0aW5nQXJ0aWZhY3QoZXZEYXRhOiBTdmdCb3gpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy50cmFja2VyLmludGVyc2VjdGluZ0FydGlmYWN0KGV2RGF0YSk7XHJcbiAgICBhd2FpdCB0aGlzLnJlbmRlcmVyLnVwZGF0ZVByb21pc2UoKTtcclxuICB9ICBcclxufVxyXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/render/sui/scoreViewOperations.ts\n\n}");
1351
1351
 
1352
1352
  /***/ },
1353
1353
 
@@ -1556,7 +1556,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
1556
1556
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1557
1557
 
1558
1558
  "use strict";
1559
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SmoPartAttributesBasic: () => (/* binding */ SmoPartAttributesBasic),\n/* harmony export */ SmoPartInfo: () => (/* binding */ SmoPartInfo),\n/* harmony export */ SmoPartInfoBooleanTypes: () => (/* binding */ SmoPartInfoBooleanTypes),\n/* harmony export */ SmoPartInfoNumTypes: () => (/* binding */ SmoPartInfoNumTypes),\n/* harmony export */ SmoPartInfoStringTypes: () => (/* binding */ SmoPartInfoStringTypes)\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 _measureModifiers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _scoreModifiers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./scoreModifiers */ \"./src/smo/data/scoreModifiers.ts\");\n/* harmony import */ var _scoreText__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./scoreText */ \"./src/smo/data/scoreText.ts\");\n/* harmony import */ var _staffModifiers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./staffModifiers */ \"./src/smo/data/staffModifiers.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * Classes to support partsInfo class, for part extraction.\n * Parts is parts.\n * @module /smo/data/partInfo\n */\n\n\n\n\n\nconst SmoPartInfoStringTypes = ['partName', 'partAbbreviation'];\nconst SmoPartInfoNumTypes = ['stavesAfter', 'stavesBefore'];\nconst SmoPartInfoBooleanTypes = ['preserveTextGroups', 'cueInScore', 'expandMultimeasureRests'];\nconst SmoPartAttributesBasic = ['partName', 'partAbbreviation', 'stavesAfter', 'stavesBefore', 'preserveTextGroups', 'cueInScore', 'expandMultimeasureRests'];\nfunction isSmoPartInfoParamsSer(params) {\n if (params.ctor && params.ctor === 'SmoPartInfo') {\n return true;\n }\n return false;\n}\n/**\n * Part info contains information that group 1 or 2 adjacent staves.\n * Parts can have formatting that is indepenedent of the score\n * @category SmoObject\n */\nclass SmoPartInfo extends _staffModifiers__WEBPACK_IMPORTED_MODULE_4__.StaffModifierBase {\n static get defaults() {\n return JSON.parse(JSON.stringify({\n partName: 'Staff ',\n partAbbreviation: '',\n globalLayout: _scoreModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoLayoutManager.defaultLayout,\n textGroups: [],\n preserveTextGroups: false,\n pageLayoutMap: {},\n stavesAfter: 0,\n stavesBefore: 0,\n cueInScore: false,\n midiDevice: null,\n midiInstrument: null,\n expandMultimeasureRests: false\n }));\n }\n constructor(params) {\n super('SmoPartInfo');\n this.partName = '';\n this.partAbbreviation = '';\n this.measureFormatting = {};\n this.textGroups = [];\n this.stavesAfter = 0;\n this.stavesBefore = 0;\n this.preserveTextGroups = false;\n this.cueInScore = false;\n this.displayCues = false;\n this.expandMultimeasureRests = false;\n if (!params.layoutManager) {\n this.layoutManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoLayoutManager(_scoreModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoLayoutManager.defaults);\n }\n else {\n this.layoutManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoLayoutManager(params.layoutManager);\n }\n if (typeof (params.measureFormatting) !== 'undefined') {\n const formatKeys = Object.keys(params.measureFormatting);\n formatKeys.forEach((key) => {\n const numKey = parseInt(key, 10);\n this.measureFormatting[numKey] = new _measureModifiers__WEBPACK_IMPORTED_MODULE_1__.SmoMeasureFormat(params.measureFormatting[numKey]);\n });\n }\n if (params.textGroups) {\n this.textGroups = params.textGroups;\n }\n SmoPartInfoStringTypes.forEach((st) => {\n this[st] = params[st];\n });\n SmoPartInfoNumTypes.forEach((st) => {\n this[st] = params[st];\n });\n SmoPartInfoBooleanTypes.forEach((st) => {\n var _a;\n this[st] = (_a = params[st]) !== null && _a !== void 0 ? _a : false;\n });\n this.midiDevice = params.midiDevice;\n if (params.midiInstrument) {\n this.midiInstrument = JSON.parse(JSON.stringify(params.midiInstrument));\n }\n else {\n this.midiInstrument = null;\n }\n }\n static deserialize(jsonObj) {\n const params = SmoPartInfo.defaults;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoPartAttributesBasic, jsonObj, params);\n jsonObj.textGroups.forEach((tg) => {\n params.textGroups.push(_scoreText__WEBPACK_IMPORTED_MODULE_3__.SmoTextGroup.deserializePreserveId(tg));\n });\n params.midiInstrument = jsonObj.midiInstrument;\n params.midiDevice = jsonObj.midiDevice;\n params.measureFormatting = {};\n if (jsonObj.layoutManager) {\n const layoutManagerParams = {\n globalLayout: jsonObj.layoutManager.globalLayout,\n /**\n * page margins for each page\n */\n pageLayouts: []\n };\n jsonObj.layoutManager.pageLayouts.forEach((pl) => {\n const pageLayout = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoPageLayout(pl);\n layoutManagerParams.pageLayouts.push(pageLayout);\n });\n params.layoutManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoLayoutManager(layoutManagerParams);\n }\n if (jsonObj.measureFormatting) {\n const mfkeys = Object.keys(jsonObj.measureFormatting);\n mfkeys.forEach((mfkey) => {\n const mfnum = parseInt(mfkey, 10);\n params.measureFormatting[mfnum] = _measureModifiers__WEBPACK_IMPORTED_MODULE_1__.SmoMeasureModifierBase.deserialize(jsonObj.measureFormatting[mfnum]);\n });\n }\n return new SmoPartInfo(params);\n }\n serialize() {\n const rv = { ctor: 'SmoPartInfo' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMergeNonDefault(SmoPartInfo.defaults, SmoPartAttributesBasic, this, rv);\n rv.layoutManager = this.layoutManager.serialize();\n rv.textGroups = [];\n this.textGroups.forEach((tg) => {\n rv.textGroups.push(tg.serialize());\n });\n rv.measureFormatting = {};\n if (this.midiInstrument) {\n rv.midiInstrument = JSON.parse(JSON.stringify(this.midiInstrument));\n }\n if (this.midiDevice) {\n rv.midiDevice = this.midiDevice;\n }\n Object.keys(this.measureFormatting).forEach((key) => {\n const numKey = parseInt(key, 10);\n rv.measureFormatting[numKey] = this.measureFormatting[numKey];\n });\n if (!isSmoPartInfoParamsSer(rv)) {\n throw 'bad part info ' + JSON.stringify(rv);\n }\n return rv;\n }\n updateTextGroup(textGroup, toAdd) {\n const tgid = typeof (textGroup) === 'string' ? textGroup :\n textGroup.attrs.id;\n const ar = this.textGroups.filter((tg) => tg.attrs.id !== tgid);\n this.textGroups = ar;\n if (toAdd) {\n this.textGroups.push(textGroup);\n }\n }\n removeTextGroup(textGroup) {\n this.updateTextGroup(textGroup, false);\n }\n addTextGroup(textGroup) {\n this.updateTextGroup(textGroup, true);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0NBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvc21vL2RhdGEvcGFydEluZm8udHM/N2IyMiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuLyoqXHJcbiAqIENsYXNzZXMgdG8gc3VwcG9ydCBwYXJ0c0luZm8gY2xhc3MsIGZvciBwYXJ0IGV4dHJhY3Rpb24uICBcclxuICogUGFydHMgaXMgcGFydHMuXHJcbiAqIEBtb2R1bGUgL3Ntby9kYXRhL3BhcnRJbmZvXHJcbiAqL1xyXG5pbXBvcnQgeyBzbW9TZXJpYWxpemUgfSBmcm9tICcuLi8uLi9jb21tb24vc2VyaWFsaXphdGlvbkhlbHBlcnMnO1xyXG5pbXBvcnQgeyBjcmVhdGVYbWxBdHRyaWJ1dGUgfSBmcm9tICcuL2NvbW1vbic7XHJcbmltcG9ydCB7IFNtb01lYXN1cmVGb3JtYXQsIFNtb01lYXN1cmVGb3JtYXRQYXJhbXNTZXIsIFNtb01lYXN1cmVNb2RpZmllckJhc2UgfSBmcm9tICcuL21lYXN1cmVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9MYXlvdXRNYW5hZ2VyLCBTbW9MYXlvdXRNYW5hZ2VyUGFyYW1zU2VyLCBTbW9MYXlvdXRNYW5hZ2VyUGFyYW1zLCBTbW9QYWdlTGF5b3V0IH0gZnJvbSAnLi9zY29yZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb1RleHRHcm91cCwgU21vVGV4dEdyb3VwUGFyYW1zU2VyIH0gZnJvbSAnLi9zY29yZVRleHQnO1xyXG5pbXBvcnQgeyBTdGFmZk1vZGlmaWVyQmFzZSB9IGZyb20gJy4vc3RhZmZNb2RpZmllcnMnO1xyXG5cclxuZXhwb3J0IHR5cGUgU21vUGFydEluZm9TdHJpbmdUeXBlID0gJ3BhcnROYW1lJyB8ICdwYXJ0QWJicmV2aWF0aW9uJztcclxuZXhwb3J0IGNvbnN0IFNtb1BhcnRJbmZvU3RyaW5nVHlwZXM6IFNtb1BhcnRJbmZvU3RyaW5nVHlwZVtdID0gWydwYXJ0TmFtZScsICdwYXJ0QWJicmV2aWF0aW9uJ107XHJcbmV4cG9ydCB0eXBlIFNtb1BhcnRJbmZvTnVtVHlwZSA9ICdzdGF2ZXNBZnRlcicgfCAnc3RhdmVzQmVmb3JlJztcclxuZXhwb3J0IGNvbnN0IFNtb1BhcnRJbmZvTnVtVHlwZXM6IFNtb1BhcnRJbmZvTnVtVHlwZVtdID0gWydzdGF2ZXNBZnRlcicsICdzdGF2ZXNCZWZvcmUnXTtcclxuZXhwb3J0IHR5cGUgU21vUGFydEluZm9Cb29sZWFuVHlwZSA9ICdwcmVzZXJ2ZVRleHRHcm91cHMnIHwgJ2N1ZUluU2NvcmUnIHwgJ2V4cGFuZE11bHRpbWVhc3VyZVJlc3RzJztcclxuZXhwb3J0IGNvbnN0IFNtb1BhcnRJbmZvQm9vbGVhblR5cGVzOiBTbW9QYXJ0SW5mb0Jvb2xlYW5UeXBlW10gPSBbJ3ByZXNlcnZlVGV4dEdyb3VwcycsICdjdWVJblNjb3JlJywgJ2V4cGFuZE11bHRpbWVhc3VyZVJlc3RzJ107XHJcblxyXG5leHBvcnQgY29uc3QgU21vUGFydEF0dHJpYnV0ZXNCYXNpYyA9IFsncGFydE5hbWUnLCAncGFydEFiYnJldmlhdGlvbicsICdzdGF2ZXNBZnRlcicsICdzdGF2ZXNCZWZvcmUnLCAncHJlc2VydmVUZXh0R3JvdXBzJywgJ2N1ZUluU2NvcmUnLCAnZXhwYW5kTXVsdGltZWFzdXJlUmVzdHMnXTtcclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vTWlkaUluc3RydW1lbnQge1xyXG4gIGNoYW5uZWw6IG51bWJlcixcclxuICBwcm9ncmFtOiBudW1iZXIsXHJcbiAgdm9sdW1lOiBudW1iZXIsXHJcbiAgcGFuOiBudW1iZXJcclxufVxyXG4vKipcclxuICogRGF0YSBjb250YWluZWQgaW4gYSBwYXJ0LiAgQSBwYXJ0IGhhcyBpdHMgb3duIHRleHQsIG1lYXN1cmUgZm9ybWF0dGluZyBhbmQgcGFnZSBsYXlvdXRzLFxyXG4gKiBhbmQgY29udGFpbnMgdGhlIG5vdGVzIGZyb20gdGhlIHNjb3JlLiAgSXQgY2FuIGJlIGNvbXByaXNlZCBvZiAxIG9yIDIgYWRqYWNlbnQgc3RhdmVzLlxyXG4gKiBVc3VhbGx5IHlvdSB3aWxsIGNhbGxcclxuICoge0BsaW5rIFNtb1BhcnRJbmZvLmRlZmF1bHRzfSwgYW5kIG1vZGlmeSB0aGUgcGFyYW1ldGVycyB5b3UgbmVlZCB0byBjaGFuZ2UuXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vUGFydEluZm9QYXJhbXMge1xyXG4gIC8qKlxyXG4gICAqIE5hbWUgb2YgdGhlIHBhcnQsIGNhbiBiZSB1c2VkIGluIGhlYWRlcnNcclxuICAgKi9cclxuICBwYXJ0TmFtZTogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIGFiYnJldmF0aW9uIG9mIHBhcnQgbmFtZVxyXG4gICAqL1xyXG4gIHBhcnRBYmJyZXZpYXRpb246IHN0cmluZyxcclxuICAvKipcclxuICAgKiBpbmRpY2F0ZXMgdGhhdCB0aGlzIHBhcnQgaW5jbHVkZSB0aGUgbmV4dCBzdGF2ZSAgKGUuZy4gcGlhbm8gcGFydClcclxuICAgKi9cclxuICBzdGF2ZXNBZnRlcjogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIGluZGljYXRlcyB0aGF0IHRoaXMgcGFydCBpbmNsdWRlIHRoZSBwcmV2aW91cyBzdGF2ZSAgKGUuZy4gcGlhbm8gcGFydClcclxuICAgKi9cclxuICBzdGF2ZXNCZWZvcmU6IG51bWJlcixcclxuICAvKipcclxuICAgKiBwYXJ0cyBjYW4gaGF2ZSB0aGVpciBvd24gcGFnZSBzZXR0aW5ncywgem9vbSBzZXR0aW5ncywgZXRjLlxyXG4gICAqL1xyXG4gIGxheW91dE1hbmFnZXI/OiBTbW9MYXlvdXRNYW5hZ2VyO1xyXG4gIC8qKlxyXG4gICAqIHBhcnRzIGNhbiBoYXZlIHRoZWlyIG93biBtZWFzdXJlIGZvcm1hdHRpbmdcclxuICAgKi9cclxuICBtZWFzdXJlRm9ybWF0dGluZz86IFJlY29yZDxudW1iZXIsIFNtb01lYXN1cmVGb3JtYXQ+LFxyXG4gIC8qKlxyXG4gICAqIGZvciBwYXJ0LXNwZWNpZmljIHRleHRcclxuICAgKi9cclxuICB0ZXh0R3JvdXBzOiBTbW9UZXh0R3JvdXBbXSxcclxuICAvKipcclxuICAgKiBpbmRpY2F0ZXMgYSBwYXJ0IGhhcyBpdHMgb3duIHRleHQsIG5vdCBpbmhlcml0ZWQgZnJvbSB0aGUgc2NvcmVcclxuICAgKi9cclxuICBwcmVzZXJ2ZVRleHRHcm91cHM6IGJvb2xlYW4sXHJcbiAgLyoqXHJcbiAgICogaW5kaWNhdGVzIHRoZSBwYXJ0IGFwcGVhcnMgYXMgY3VlIHNpemUgaW4gdGhlIHNjb3JlXHJcbiAgICovXHJcbiAgY3VlSW5TY29yZTogYm9vbGVhbixcclxuICAvKipcclxuICAgKiBmdXR1cmUsIGZvciBwbGF5YmFjay4gIFRPRE86IE5vdGUgc3RhdmVzIGNvbnRhaW4gaW5zdHJ1bWVudHMgdGhhdCBjb21wZXRlIHdpdGggdGhpcy5cclxuICAgKiBtYXliZSB0aGlzIHdpbGwgYmUgcmVtb3ZlZFxyXG4gICAqL1xyXG4gIG1pZGlEZXZpY2U6IHN0cmluZyB8IG51bGwsXHJcbiAgLyoqXHJcbiAgICogc2VlIG1pZGlEZXZpY2VcclxuICAgKi9cclxuICBtaWRpSW5zdHJ1bWVudDogU21vTWlkaUluc3RydW1lbnQgfCBudWxsLFxyXG4gIC8qKlxyXG4gICAqIGluZGljYXRlcyBtdWx0aW1lYXN1cmUgcmVzdHMgaW4gcGFydHMgc2hvdWxkIGJlIGV4cGFuZGVkLlxyXG4gICAqL1xyXG4gIGV4cGFuZE11bHRpbWVhc3VyZVJlc3RzOiBib29sZWFuIFxyXG59XHJcblxyXG4vKipcclxuICogU2VyaWFsaXplZCBwYXJ0IGluZm9ybWF0aW9uXHJcbiAqIEBjYXRlZ29yeSBzZXJpYWxpemF0aW9uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNtb1BhcnRJbmZvUGFyYW1zU2VyICB7XHJcbiAgLyoqIGNvbnN0cnVjdG9yICovXHJcbiAgY3Rvcjogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIE5hbWUgb2YgdGhlIHBhcnQsIGNhbiBiZSB1c2VkIGluIGhlYWRlcnNcclxuICAgKi9cclxuICBwYXJ0TmFtZTogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIGFiYnJldmF0aW9uIG9mIHBhcnQgbmFtZVxyXG4gICAqL1xyXG4gIHBhcnRBYmJyZXZpYXRpb246IHN0cmluZyxcclxuICAvKipcclxuICAgKiBpbmRpY2F0ZXMgdGhhdCB0aGlzIHBhcnQgaW5jbHVkZSB0aGUgbmV4dCBzdGF2ZSAgKGUuZy4gcGlhbm8gcGFydClcclxuICAgKi9cclxuICBzdGF2ZXNBZnRlcjogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIGluZGljYXRlcyB0aGF0IHRoaXMgcGFydCBpbmNsdWRlIHRoZSBwcmV2aW91cyBzdGF2ZSAgKGUuZy4gcGlhbm8gcGFydClcclxuICAgKi9cclxuICBzdGF2ZXNCZWZvcmU6IG51bWJlcixcclxuICAvKipcclxuICAgKiBwYXJ0cyBjYW4gaGF2ZSB0aGVpciBvd24gcGFnZSBzZXR0aW5ncywgem9vbSBzZXR0aW5ncywgZXRjLlxyXG4gICAqL1xyXG4gIGxheW91dE1hbmFnZXI/OiBTbW9MYXlvdXRNYW5hZ2VyUGFyYW1zU2VyO1xyXG4gIC8qKlxyXG4gICAqIHBhcnRzIGNhbiBoYXZlIHRoZWlyIG93biBtZWFzdXJlIGZvcm1hdHRpbmdcclxuICAgKi9cclxuICBtZWFzdXJlRm9ybWF0dGluZz86IFJlY29yZDxudW1iZXIsIFNtb01lYXN1cmVGb3JtYXRQYXJhbXNTZXI+LFxyXG4gIC8qKlxyXG4gICAqIGZvciBwYXJ0LXNwZWNpZmljIHRleHRcclxuICAgKi9cclxuICB0ZXh0R3JvdXBzOiBTbW9UZXh0R3JvdXBQYXJhbXNTZXJbXSxcclxuICAvKipcclxuICAgKiBpbmRpY2F0ZXMgYSBwYXJ0IGhhcyBpdHMgb3duIHRleHQsIG5vdCBpbmhlcml0ZWQgZnJvbSB0aGUgc2NvcmVcclxuICAgKi9cclxuICBwcmVzZXJ2ZVRleHRHcm91cHM6IGJvb2xlYW4sXHJcbiAgLyoqXHJcbiAgICogaW5kaWNhdGVzIHRoZSBwYXJ0IGFwcGVhcnMgYXMgY3VlIHNpemUgaW4gdGhlIHNjb3JlXHJcbiAgICovXHJcbiAgY3VlSW5TY29yZTogYm9vbGVhbixcclxuICAvKipcclxuICAgKiBmdXR1cmUsIGZvciBwbGF5YmFjay4gIFRPRE86IE5vdGUgc3RhdmVzIGNvbnRhaW4gaW5zdHJ1bWVudHMgdGhhdCBjb21wZXRlIHdpdGggdGhpcy5cclxuICAgKiBtYXliZSB0aGlzIHdpbGwgYmUgcmVtb3ZlZFxyXG4gICAqL1xyXG4gIG1pZGlEZXZpY2U6IHN0cmluZyB8IG51bGwsXHJcbiAgLyoqXHJcbiAgICogc2VlIG1pZGlEZXZpY2VcclxuICAgKi9cclxuICBtaWRpSW5zdHJ1bWVudDogU21vTWlkaUluc3RydW1lbnQgfCBudWxsLFxyXG4gIC8qKlxyXG4gICAqIGluZGljYXRlcyBtdWx0aW1lYXN1cmUgcmVzdHMgaW4gcGFydHMgc2hvdWxkIGJlIGV4cGFuZGVkLlxyXG4gICAqL1xyXG4gIGV4cGFuZE11bHRpbWVhc3VyZVJlc3RzOiBib29sZWFuICAgXHJcbn1cclxuZnVuY3Rpb24gaXNTbW9QYXJ0SW5mb1BhcmFtc1NlcihwYXJhbXM6IFBhcnRpYWw8U21vUGFydEluZm9QYXJhbXNTZXI+KTogcGFyYW1zIGlzIFNtb1BhcnRJbmZvUGFyYW1zU2VyIHtcclxuICBpZiAocGFyYW1zLmN0b3IgJiYgcGFyYW1zLmN0b3IgPT09ICdTbW9QYXJ0SW5mbycpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuICByZXR1cm4gZmFsc2U7XHJcbn1cclxuLyoqXHJcbiAqIFBhcnQgaW5mbyBjb250YWlucyBpbmZvcm1hdGlvbiB0aGF0IGdyb3VwIDEgb3IgMiBhZGphY2VudCBzdGF2ZXMuXHJcbiAqIFBhcnRzIGNhbiBoYXZlIGZvcm1hdHRpbmcgdGhhdCBpcyBpbmRlcGVuZWRlbnQgb2YgdGhlIHNjb3JlXHJcbiAqIEBjYXRlZ29yeSBTbW9PYmplY3RcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTbW9QYXJ0SW5mbyBleHRlbmRzIFN0YWZmTW9kaWZpZXJCYXNlIHtcclxuICBwYXJ0TmFtZTogc3RyaW5nID0gJyc7XHJcbiAgcGFydEFiYnJldmlhdGlvbjogc3RyaW5nID0gJyc7XHJcbiAgbGF5b3V0TWFuYWdlcjogU21vTGF5b3V0TWFuYWdlcjtcclxuICBtZWFzdXJlRm9ybWF0dGluZzogUmVjb3JkPG51bWJlciwgU21vTWVhc3VyZUZvcm1hdD4gPSB7fTtcclxuICB0ZXh0R3JvdXBzOiBTbW9UZXh0R3JvdXBbXSA9IFtdO1xyXG4gIHN0YXZlc0FmdGVyOiBudW1iZXIgPSAwO1xyXG4gIHN0YXZlc0JlZm9yZTogbnVtYmVyID0gMDtcclxuICBwcmVzZXJ2ZVRleHRHcm91cHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjdWVJblNjb3JlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGlzcGxheUN1ZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBleHBhbmRNdWx0aW1lYXN1cmVSZXN0czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1pZGlJbnN0cnVtZW50OiBTbW9NaWRpSW5zdHJ1bWVudHwgbnVsbDtcclxuICBtaWRpRGV2aWNlOiBzdHJpbmcgfCBudWxsO1xyXG4gIHN0YXRpYyBnZXQgZGVmYXVsdHMoKTogU21vUGFydEluZm9QYXJhbXMge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICBwYXJ0TmFtZTogJ1N0YWZmICcsXHJcbiAgICAgIHBhcnRBYmJyZXZpYXRpb246ICcnLFxyXG4gICAgICBnbG9iYWxMYXlvdXQ6IFNtb0xheW91dE1hbmFnZXIuZGVmYXVsdExheW91dCxcclxuICAgICAgdGV4dEdyb3VwczogW10sXHJcbiAgICAgIHByZXNlcnZlVGV4dEdyb3VwczogZmFsc2UsXHJcbiAgICAgIHBhZ2VMYXlvdXRNYXA6IHt9LFxyXG4gICAgICBzdGF2ZXNBZnRlcjogMCxcclxuICAgICAgc3RhdmVzQmVmb3JlOiAwLFxyXG4gICAgICBjdWVJblNjb3JlOiBmYWxzZSxcclxuICAgICAgbWlkaURldmljZTogbnVsbCxcclxuICAgICAgbWlkaUluc3RydW1lbnQ6IG51bGwsXHJcbiAgICAgIGV4cGFuZE11bHRpbWVhc3VyZVJlc3RzOiBmYWxzZVxyXG4gICAgfSkpO1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihwYXJhbXM6IFNtb1BhcnRJbmZvUGFyYW1zKSB7XHJcbiAgICBzdXBlcignU21vUGFydEluZm8nKTtcclxuICAgIGlmICghcGFyYW1zLmxheW91dE1hbmFnZXIpIHtcclxuICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyID0gbmV3IFNtb0xheW91dE1hbmFnZXIoU21vTGF5b3V0TWFuYWdlci5kZWZhdWx0cyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxheW91dE1hbmFnZXIgPSBuZXcgU21vTGF5b3V0TWFuYWdlcihwYXJhbXMubGF5b3V0TWFuYWdlcik7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mKHBhcmFtcy5tZWFzdXJlRm9ybWF0dGluZykgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1hdEtleXMgPSBPYmplY3Qua2V5cyhwYXJhbXMubWVhc3VyZUZvcm1hdHRpbmcpO1xyXG4gICAgICBmb3JtYXRLZXlzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG51bUtleSA9IHBhcnNlSW50KGtleSwgMTApO1xyXG4gICAgICAgIHRoaXMubWVhc3VyZUZvcm1hdHRpbmdbbnVtS2V5XSA9IG5ldyBTbW9NZWFzdXJlRm9ybWF0KHBhcmFtcy5tZWFzdXJlRm9ybWF0dGluZyFbbnVtS2V5XSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHBhcmFtcy50ZXh0R3JvdXBzKSB7XHJcbiAgICAgIHRoaXMudGV4dEdyb3VwcyA9IHBhcmFtcy50ZXh0R3JvdXBzO1xyXG4gICAgfVxyXG4gICAgU21vUGFydEluZm9TdHJpbmdUeXBlcy5mb3JFYWNoKChzdCkgPT4ge1xyXG4gICAgICB0aGlzW3N0XSA9IHBhcmFtc1tzdF07XHJcbiAgICB9KTtcclxuICAgIFNtb1BhcnRJbmZvTnVtVHlwZXMuZm9yRWFjaCgoc3QpID0+IHtcclxuICAgICAgdGhpc1tzdF0gPSBwYXJhbXNbc3RdO1xyXG4gICAgfSk7XHJcbiAgICBTbW9QYXJ0SW5mb0Jvb2xlYW5UeXBlcy5mb3JFYWNoKChzdCkgPT4ge1xyXG4gICAgICB0aGlzW3N0XSA9IHBhcmFtc1tzdF0gPz8gZmFsc2U7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubWlkaURldmljZSA9IHBhcmFtcy5taWRpRGV2aWNlO1xyXG4gICAgaWYgKHBhcmFtcy5taWRpSW5zdHJ1bWVudCkge1xyXG4gICAgICB0aGlzLm1pZGlJbnN0cnVtZW50ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwYXJhbXMubWlkaUluc3RydW1lbnQpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubWlkaUluc3RydW1lbnQgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICBzdGF0aWMgZGVzZXJpYWxpemUoanNvbk9iajogU21vUGFydEluZm9QYXJhbXNTZXIpOiBTbW9QYXJ0SW5mbyB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBTbW9QYXJ0SW5mby5kZWZhdWx0cztcclxuICAgIHNtb1NlcmlhbGl6ZS5zZXJpYWxpemVkTWVyZ2UoU21vUGFydEF0dHJpYnV0ZXNCYXNpYywganNvbk9iaiwgcGFyYW1zKTtcclxuICAgIGpzb25PYmoudGV4dEdyb3Vwcy5mb3JFYWNoKCh0ZykgPT4ge1xyXG4gICAgICBwYXJhbXMudGV4dEdyb3Vwcy5wdXNoKFNtb1RleHRHcm91cC5kZXNlcmlhbGl6ZVByZXNlcnZlSWQodGcpKTtcclxuICAgIH0pO1xyXG4gICAgcGFyYW1zLm1pZGlJbnN0cnVtZW50ID0ganNvbk9iai5taWRpSW5zdHJ1bWVudDtcclxuICAgIHBhcmFtcy5taWRpRGV2aWNlID0ganNvbk9iai5taWRpRGV2aWNlO1xyXG4gICAgcGFyYW1zLm1lYXN1cmVGb3JtYXR0aW5nID0ge307XHJcbiAgICBpZiAoanNvbk9iai5sYXlvdXRNYW5hZ2VyKSB7XHJcbiAgICAgIGNvbnN0IGxheW91dE1hbmFnZXJQYXJhbXM6IFNtb0xheW91dE1hbmFnZXJQYXJhbXMgPSB7XHJcbiAgICAgICAgZ2xvYmFsTGF5b3V0OiBqc29uT2JqLmxheW91dE1hbmFnZXIuZ2xvYmFsTGF5b3V0LFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHBhZ2UgbWFyZ2lucyBmb3IgZWFjaCBwYWdlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcGFnZUxheW91dHM6IFtdXHJcbiAgICAgIH1cclxuICAgICAganNvbk9iai5sYXlvdXRNYW5hZ2VyLnBhZ2VMYXlvdXRzLmZvckVhY2goKHBsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFnZUxheW91dCA9IG5ldyBTbW9QYWdlTGF5b3V0KHBsKTtcclxuICAgICAgICBsYXlvdXRNYW5hZ2VyUGFyYW1zLnBhZ2VMYXlvdXRzLnB1c2gocGFnZUxheW91dCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBwYXJhbXMubGF5b3V0TWFuYWdlciA9IG5ldyBTbW9MYXlvdXRNYW5hZ2VyKGxheW91dE1hbmFnZXJQYXJhbXMpO1xyXG4gICAgfVxyXG4gICAgaWYgKGpzb25PYmoubWVhc3VyZUZvcm1hdHRpbmcpIHtcclxuICAgICAgY29uc3QgbWZrZXlzID0gT2JqZWN0LmtleXMoanNvbk9iai5tZWFzdXJlRm9ybWF0dGluZyk7XHJcbiAgICAgIG1ma2V5cy5mb3JFYWNoKChtZmtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1mbnVtID0gcGFyc2VJbnQobWZrZXksIDEwKTtcclxuICAgICAgICBwYXJhbXMubWVhc3VyZUZvcm1hdHRpbmchW21mbnVtXSA9IFNtb01lYXN1cmVNb2RpZmllckJhc2UuZGVzZXJpYWxpemUoanNvbk9iai5tZWFzdXJlRm9ybWF0dGluZyFbbWZudW1dKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFNtb1BhcnRJbmZvKHBhcmFtcyk7XHJcbiAgICBcclxuICB9XHJcbiAgc2VyaWFsaXplKCk6IFNtb1BhcnRJbmZvUGFyYW1zU2VyIHtcclxuICAgIGNvbnN0IHJ2OiBQYXJ0aWFsPFNtb1BhcnRJbmZvUGFyYW1zU2VyPiA9IHsgY3RvcjogJ1Ntb1BhcnRJbmZvJyB9O1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZU5vbkRlZmF1bHQoU21vUGFydEluZm8uZGVmYXVsdHMsIFNtb1BhcnRBdHRyaWJ1dGVzQmFzaWMsIHRoaXMsIHJ2KTtcclxuICAgIHJ2LmxheW91dE1hbmFnZXIgPSB0aGlzLmxheW91dE1hbmFnZXIuc2VyaWFsaXplKCk7XHJcbiAgICBydi50ZXh0R3JvdXBzID0gW107XHJcbiAgICB0aGlzLnRleHRHcm91cHMuZm9yRWFjaCgodGcpID0+IHtcclxuICAgICAgcnYudGV4dEdyb3VwcyEucHVzaCh0Zy5zZXJpYWxpemUoKSk7XHJcbiAgICB9KTtcclxuICAgIHJ2Lm1lYXN1cmVGb3JtYXR0aW5nID0ge307XHJcbiAgICBpZiAodGhpcy5taWRpSW5zdHJ1bWVudCkge1xyXG4gICAgICBydi5taWRpSW5zdHJ1bWVudCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5taWRpSW5zdHJ1bWVudCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubWlkaURldmljZSkge1xyXG4gICAgICBydi5taWRpRGV2aWNlID0gdGhpcy5taWRpRGV2aWNlO1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmtleXModGhpcy5tZWFzdXJlRm9ybWF0dGluZykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IG51bUtleSA9IHBhcnNlSW50KGtleSwgMTApO1xyXG4gICAgICBydi5tZWFzdXJlRm9ybWF0dGluZyFbbnVtS2V5XSA9IHRoaXMubWVhc3VyZUZvcm1hdHRpbmdbbnVtS2V5XTtcclxuICAgIH0pO1xyXG4gICAgaWYgKCFpc1Ntb1BhcnRJbmZvUGFyYW1zU2VyKHJ2KSkge1xyXG4gICAgICB0aHJvdyAnYmFkIHBhcnQgaW5mbyAnICsgSlNPTi5zdHJpbmdpZnkocnYpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICB1cGRhdGVUZXh0R3JvdXAodGV4dEdyb3VwOiBTbW9UZXh0R3JvdXAsIHRvQWRkOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCB0Z2lkID0gdHlwZW9mICh0ZXh0R3JvdXApID09PSAnc3RyaW5nJyA/IHRleHRHcm91cCA6XHJcbiAgICAgIHRleHRHcm91cC5hdHRycy5pZDtcclxuICAgIGNvbnN0IGFyID0gdGhpcy50ZXh0R3JvdXBzLmZpbHRlcigodGcpID0+IHRnLmF0dHJzLmlkICE9PSB0Z2lkKTtcclxuICAgIHRoaXMudGV4dEdyb3VwcyA9IGFyO1xyXG4gICAgaWYgKHRvQWRkKSB7XHJcbiAgICAgIHRoaXMudGV4dEdyb3Vwcy5wdXNoKHRleHRHcm91cCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlbW92ZVRleHRHcm91cCh0ZXh0R3JvdXA6IFNtb1RleHRHcm91cCkge1xyXG4gICAgdGhpcy51cGRhdGVUZXh0R3JvdXAodGV4dEdyb3VwLCBmYWxzZSk7XHJcbiAgfVxyXG4gIGFkZFRleHRHcm91cCh0ZXh0R3JvdXA6IFNtb1RleHRHcm91cCkge1xyXG4gICAgdGhpcy51cGRhdGVUZXh0R3JvdXAodGV4dEdyb3VwLCB0cnVlKTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/smo/data/partInfo.ts\n\n}");
1559
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SmoPartAttributesBasic: () => (/* binding */ SmoPartAttributesBasic),\n/* harmony export */ SmoPartInfo: () => (/* binding */ SmoPartInfo),\n/* harmony export */ SmoPartInfoBooleanTypes: () => (/* binding */ SmoPartInfoBooleanTypes),\n/* harmony export */ SmoPartInfoNumTypes: () => (/* binding */ SmoPartInfoNumTypes),\n/* harmony export */ SmoPartInfoStringTypes: () => (/* binding */ SmoPartInfoStringTypes)\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 _measureModifiers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _scoreModifiers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./scoreModifiers */ \"./src/smo/data/scoreModifiers.ts\");\n/* harmony import */ var _scoreText__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./scoreText */ \"./src/smo/data/scoreText.ts\");\n/* harmony import */ var _staffModifiers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./staffModifiers */ \"./src/smo/data/staffModifiers.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * Classes to support partsInfo class, for part extraction.\n * Parts is parts.\n * @module /smo/data/partInfo\n */\n\n\n\n\n\nconst SmoPartInfoStringTypes = ['partName', 'partAbbreviation'];\nconst SmoPartInfoNumTypes = ['stavesAfter', 'stavesBefore'];\nconst SmoPartInfoBooleanTypes = ['preserveTextGroups', 'cueInScore', 'expandMultimeasureRests'];\nconst SmoPartAttributesBasic = ['partName', 'partAbbreviation', 'stavesAfter', 'stavesBefore', 'preserveTextGroups', 'cueInScore', 'expandMultimeasureRests'];\nfunction isSmoPartInfoParamsSer(params) {\n if (params.ctor && params.ctor === 'SmoPartInfo') {\n return true;\n }\n return false;\n}\n/**\n * Part info contains information that group 1 or 2 adjacent staves.\n * Parts can have formatting that is indepenedent of the score\n * @category SmoObject\n */\nclass SmoPartInfo extends _staffModifiers__WEBPACK_IMPORTED_MODULE_4__.StaffModifierBase {\n static get defaults() {\n return JSON.parse(JSON.stringify({\n partName: 'Staff ',\n partAbbreviation: '',\n globalLayout: _scoreModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoLayoutManager.defaultLayout,\n textGroups: [],\n preserveTextGroups: false,\n pageLayoutMap: {},\n stavesAfter: 0,\n stavesBefore: 0,\n cueInScore: false,\n midiDevice: null,\n midiInstrument: null,\n expandMultimeasureRests: false\n }));\n }\n constructor(params) {\n super('SmoPartInfo');\n this.partName = '';\n this.partAbbreviation = '';\n this.measureFormatting = {};\n this.textGroups = [];\n this.stavesAfter = 0;\n this.stavesBefore = 0;\n this.preserveTextGroups = false;\n this.cueInScore = false;\n this.displayCues = false;\n this.expandMultimeasureRests = false;\n if (!params.layoutManager) {\n this.layoutManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoLayoutManager(_scoreModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoLayoutManager.defaults);\n }\n else {\n this.layoutManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoLayoutManager(params.layoutManager);\n }\n if (typeof (params.measureFormatting) !== 'undefined') {\n const formatKeys = Object.keys(params.measureFormatting);\n formatKeys.forEach((key) => {\n const numKey = parseInt(key, 10);\n this.measureFormatting[numKey] = new _measureModifiers__WEBPACK_IMPORTED_MODULE_1__.SmoMeasureFormat(params.measureFormatting[numKey]);\n });\n }\n if (params.textGroups) {\n this.textGroups = params.textGroups;\n }\n SmoPartInfoStringTypes.forEach((st) => {\n this[st] = params[st];\n });\n SmoPartInfoNumTypes.forEach((st) => {\n this[st] = params[st];\n });\n SmoPartInfoBooleanTypes.forEach((st) => {\n var _a;\n this[st] = (_a = params[st]) !== null && _a !== void 0 ? _a : false;\n });\n this.midiDevice = params.midiDevice;\n if (params.midiInstrument) {\n this.midiInstrument = JSON.parse(JSON.stringify(params.midiInstrument));\n }\n else {\n this.midiInstrument = null;\n }\n }\n static deserialize(jsonObj) {\n const params = SmoPartInfo.defaults;\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMerge(SmoPartAttributesBasic, jsonObj, params);\n jsonObj.textGroups.forEach((tg) => {\n params.textGroups.push(_scoreText__WEBPACK_IMPORTED_MODULE_3__.SmoTextGroup.deserializePreserveId(tg));\n });\n params.midiInstrument = jsonObj.midiInstrument;\n params.midiDevice = jsonObj.midiDevice;\n params.measureFormatting = {};\n if (jsonObj.layoutManager) {\n const layoutManagerParams = {\n globalLayout: jsonObj.layoutManager.globalLayout,\n /**\n * page margins for each page\n */\n pageLayouts: []\n };\n jsonObj.layoutManager.pageLayouts.forEach((pl) => {\n const pageLayout = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoPageLayout(pl);\n layoutManagerParams.pageLayouts.push(pageLayout);\n });\n params.layoutManager = new _scoreModifiers__WEBPACK_IMPORTED_MODULE_2__.SmoLayoutManager(layoutManagerParams);\n }\n if (jsonObj.measureFormatting) {\n const mfkeys = Object.keys(jsonObj.measureFormatting);\n mfkeys.forEach((mfkey) => {\n const mfnum = parseInt(mfkey, 10);\n params.measureFormatting[mfnum] = _measureModifiers__WEBPACK_IMPORTED_MODULE_1__.SmoMeasureModifierBase.deserialize(jsonObj.measureFormatting[mfnum]);\n });\n }\n return new SmoPartInfo(params);\n }\n serialize() {\n const rv = { ctor: 'SmoPartInfo' };\n _common_serializationHelpers__WEBPACK_IMPORTED_MODULE_0__.smoSerialize.serializedMergeNonDefault(SmoPartInfo.defaults, SmoPartAttributesBasic, this, rv);\n rv.layoutManager = this.layoutManager.serialize();\n rv.textGroups = [];\n this.textGroups.forEach((tg) => {\n rv.textGroups.push(tg.serialize());\n });\n rv.measureFormatting = {};\n if (this.midiInstrument) {\n rv.midiInstrument = JSON.parse(JSON.stringify(this.midiInstrument));\n }\n if (this.midiDevice) {\n rv.midiDevice = this.midiDevice;\n }\n Object.keys(this.measureFormatting).forEach((key) => {\n const numKey = parseInt(key, 10);\n rv.measureFormatting[numKey] = this.measureFormatting[numKey];\n });\n if (!isSmoPartInfoParamsSer(rv)) {\n throw 'bad part info ' + JSON.stringify(rv);\n }\n return rv;\n }\n updateTextGroup(textGroup, toAdd) {\n const tgid = typeof (textGroup) === 'string' ? textGroup :\n textGroup.attrs.id;\n const ar = this.textGroups.filter((tg) => tg.attrs.id !== tgid);\n this.textGroups = ar;\n if (toAdd) {\n const newVersion = _scoreText__WEBPACK_IMPORTED_MODULE_3__.SmoTextGroup.deserializePreserveId(textGroup);\n this.textGroups.push(newVersion);\n }\n }\n removeTextGroup(textGroup) {\n this.updateTextGroup(textGroup, false);\n }\n addTextGroup(textGroup) {\n this.updateTextGroup(textGroup, true);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc21vL2RhdGEvcGFydEluZm8udHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLHlEQUF5RDtBQUN6RCx5Q0FBeUM7QUFDekM7Ozs7R0FJRztBQUM4RDtBQUV3QztBQUNhO0FBQ3BEO0FBQ2I7QUFHOUMsTUFBTSxzQkFBc0IsR0FBNEIsQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUV6RixNQUFNLG1CQUFtQixHQUF5QixDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUVsRixNQUFNLHVCQUF1QixHQUE2QixDQUFDLG9CQUFvQixFQUFFLFlBQVksRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0FBRTFILE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUseUJBQXlCLENBQUMsQ0FBQztBQThIckssU0FBUyxzQkFBc0IsQ0FBQyxNQUFxQztJQUNuRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUUsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFDRDs7OztHQUlHO0FBQ0ksTUFBTSxXQUFZLFNBQVEsOERBQWlCO0lBY2hELE1BQU0sS0FBSyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQy9CLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLGdCQUFnQixFQUFFLEVBQUU7WUFDcEIsWUFBWSxFQUFFLDZEQUFnQixDQUFDLGFBQWE7WUFDNUMsVUFBVSxFQUFFLEVBQUU7WUFDZCxrQkFBa0IsRUFBRSxLQUFLO1lBQ3pCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFdBQVcsRUFBRSxDQUFDO1lBQ2QsWUFBWSxFQUFFLENBQUM7WUFDZixVQUFVLEVBQUUsS0FBSztZQUNqQixVQUFVLEVBQUUsSUFBSTtZQUNoQixjQUFjLEVBQUUsSUFBSTtZQUNwQix1QkFBdUIsRUFBRSxLQUFLO1NBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNELFlBQVksTUFBeUI7UUFDbkMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBOUJ2QixhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLHFCQUFnQixHQUFXLEVBQUUsQ0FBQztRQUU5QixzQkFBaUIsR0FBcUMsRUFBRSxDQUFDO1FBQ3pELGVBQVUsR0FBbUIsRUFBRSxDQUFDO1FBQ2hDLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLGlCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBQ3pCLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUNwQyxlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQXFCdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksNkRBQWdCLENBQUMsNkRBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksNkRBQWdCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxJQUFJLE9BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNyRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3pELFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDekIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksK0RBQWdCLENBQUMsTUFBTSxDQUFDLGlCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDM0YsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ3RDLENBQUM7UUFDRCxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztRQUNILHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFOztZQUNyQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBTSxDQUFDLEVBQUUsQ0FBQyxtQ0FBSSxLQUFLLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDcEMsSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDMUUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBNkI7UUFDOUMsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNwQyxzRUFBWSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNoQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxvREFBWSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFDL0MsTUFBTSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDOUIsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUIsTUFBTSxtQkFBbUIsR0FBMkI7Z0JBQ2xELFlBQVksRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVk7Z0JBQ2hEOzttQkFFRztnQkFDSCxXQUFXLEVBQUUsRUFBRTthQUNoQjtZQUNELE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUMvQyxNQUFNLFVBQVUsR0FBRyxJQUFJLDBEQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3pDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbkQsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsYUFBYSxHQUFHLElBQUksNkRBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM5QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDdkIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbEMsTUFBTSxDQUFDLGlCQUFrQixDQUFDLEtBQUssQ0FBQyxHQUFHLHFFQUFzQixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsaUJBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzRyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWpDLENBQUM7SUFDRCxTQUFTO1FBQ1AsTUFBTSxFQUFFLEdBQWtDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ2xFLHNFQUFZLENBQUMseUJBQXlCLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxzQkFBc0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0YsRUFBRSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2xELEVBQUUsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDN0IsRUFBRSxDQUFDLFVBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLEVBQUUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixFQUFFLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbEMsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDbEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNqQyxFQUFFLENBQUMsaUJBQWtCLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDaEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxlQUFlLENBQUMsU0FBdUIsRUFBRSxLQUFjO1FBQ3JELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hELFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxVQUFVLEdBQUcsb0RBQVksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUNELGVBQWUsQ0FBQyxTQUF1QjtRQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsWUFBWSxDQUFDLFNBQXVCO1FBQ2xDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRiIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy9zbW8vZGF0YS9wYXJ0SW5mby50cz83YjIyIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG4vKipcclxuICogQ2xhc3NlcyB0byBzdXBwb3J0IHBhcnRzSW5mbyBjbGFzcywgZm9yIHBhcnQgZXh0cmFjdGlvbi4gIFxyXG4gKiBQYXJ0cyBpcyBwYXJ0cy5cclxuICogQG1vZHVsZSAvc21vL2RhdGEvcGFydEluZm9cclxuICovXHJcbmltcG9ydCB7IHNtb1NlcmlhbGl6ZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZXJpYWxpemF0aW9uSGVscGVycyc7XHJcbmltcG9ydCB7IGNyZWF0ZVhtbEF0dHJpYnV0ZSB9IGZyb20gJy4vY29tbW9uJztcclxuaW1wb3J0IHsgU21vTWVhc3VyZUZvcm1hdCwgU21vTWVhc3VyZUZvcm1hdFBhcmFtc1NlciwgU21vTWVhc3VyZU1vZGlmaWVyQmFzZSB9IGZyb20gJy4vbWVhc3VyZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb0xheW91dE1hbmFnZXIsIFNtb0xheW91dE1hbmFnZXJQYXJhbXNTZXIsIFNtb0xheW91dE1hbmFnZXJQYXJhbXMsIFNtb1BhZ2VMYXlvdXQgfSBmcm9tICcuL3Njb3JlTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgU21vVGV4dEdyb3VwLCBTbW9UZXh0R3JvdXBQYXJhbXNTZXIgfSBmcm9tICcuL3Njb3JlVGV4dCc7XHJcbmltcG9ydCB7IFN0YWZmTW9kaWZpZXJCYXNlIH0gZnJvbSAnLi9zdGFmZk1vZGlmaWVycyc7XHJcblxyXG5leHBvcnQgdHlwZSBTbW9QYXJ0SW5mb1N0cmluZ1R5cGUgPSAncGFydE5hbWUnIHwgJ3BhcnRBYmJyZXZpYXRpb24nO1xyXG5leHBvcnQgY29uc3QgU21vUGFydEluZm9TdHJpbmdUeXBlczogU21vUGFydEluZm9TdHJpbmdUeXBlW10gPSBbJ3BhcnROYW1lJywgJ3BhcnRBYmJyZXZpYXRpb24nXTtcclxuZXhwb3J0IHR5cGUgU21vUGFydEluZm9OdW1UeXBlID0gJ3N0YXZlc0FmdGVyJyB8ICdzdGF2ZXNCZWZvcmUnO1xyXG5leHBvcnQgY29uc3QgU21vUGFydEluZm9OdW1UeXBlczogU21vUGFydEluZm9OdW1UeXBlW10gPSBbJ3N0YXZlc0FmdGVyJywgJ3N0YXZlc0JlZm9yZSddO1xyXG5leHBvcnQgdHlwZSBTbW9QYXJ0SW5mb0Jvb2xlYW5UeXBlID0gJ3ByZXNlcnZlVGV4dEdyb3VwcycgfCAnY3VlSW5TY29yZScgfCAnZXhwYW5kTXVsdGltZWFzdXJlUmVzdHMnO1xyXG5leHBvcnQgY29uc3QgU21vUGFydEluZm9Cb29sZWFuVHlwZXM6IFNtb1BhcnRJbmZvQm9vbGVhblR5cGVbXSA9IFsncHJlc2VydmVUZXh0R3JvdXBzJywgJ2N1ZUluU2NvcmUnLCAnZXhwYW5kTXVsdGltZWFzdXJlUmVzdHMnXTtcclxuXHJcbmV4cG9ydCBjb25zdCBTbW9QYXJ0QXR0cmlidXRlc0Jhc2ljID0gWydwYXJ0TmFtZScsICdwYXJ0QWJicmV2aWF0aW9uJywgJ3N0YXZlc0FmdGVyJywgJ3N0YXZlc0JlZm9yZScsICdwcmVzZXJ2ZVRleHRHcm91cHMnLCAnY3VlSW5TY29yZScsICdleHBhbmRNdWx0aW1lYXN1cmVSZXN0cyddO1xyXG4vKipcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9NaWRpSW5zdHJ1bWVudCB7XHJcbiAgY2hhbm5lbDogbnVtYmVyLFxyXG4gIHByb2dyYW06IG51bWJlcixcclxuICB2b2x1bWU6IG51bWJlcixcclxuICBwYW46IG51bWJlclxyXG59XHJcbi8qKlxyXG4gKiBEYXRhIGNvbnRhaW5lZCBpbiBhIHBhcnQuICBBIHBhcnQgaGFzIGl0cyBvd24gdGV4dCwgbWVhc3VyZSBmb3JtYXR0aW5nIGFuZCBwYWdlIGxheW91dHMsXHJcbiAqIGFuZCBjb250YWlucyB0aGUgbm90ZXMgZnJvbSB0aGUgc2NvcmUuICBJdCBjYW4gYmUgY29tcHJpc2VkIG9mIDEgb3IgMiBhZGphY2VudCBzdGF2ZXMuXHJcbiAqIFVzdWFsbHkgeW91IHdpbGwgY2FsbFxyXG4gKiB7QGxpbmsgU21vUGFydEluZm8uZGVmYXVsdHN9LCBhbmQgbW9kaWZ5IHRoZSBwYXJhbWV0ZXJzIHlvdSBuZWVkIHRvIGNoYW5nZS5cclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTbW9QYXJ0SW5mb1BhcmFtcyB7XHJcbiAgLyoqXHJcbiAgICogTmFtZSBvZiB0aGUgcGFydCwgY2FuIGJlIHVzZWQgaW4gaGVhZGVyc1xyXG4gICAqL1xyXG4gIHBhcnROYW1lOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogYWJicmV2YXRpb24gb2YgcGFydCBuYW1lXHJcbiAgICovXHJcbiAgcGFydEFiYnJldmlhdGlvbjogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIGluZGljYXRlcyB0aGF0IHRoaXMgcGFydCBpbmNsdWRlIHRoZSBuZXh0IHN0YXZlICAoZS5nLiBwaWFubyBwYXJ0KVxyXG4gICAqL1xyXG4gIHN0YXZlc0FmdGVyOiBudW1iZXIsXHJcbiAgLyoqXHJcbiAgICogaW5kaWNhdGVzIHRoYXQgdGhpcyBwYXJ0IGluY2x1ZGUgdGhlIHByZXZpb3VzIHN0YXZlICAoZS5nLiBwaWFubyBwYXJ0KVxyXG4gICAqL1xyXG4gIHN0YXZlc0JlZm9yZTogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIHBhcnRzIGNhbiBoYXZlIHRoZWlyIG93biBwYWdlIHNldHRpbmdzLCB6b29tIHNldHRpbmdzLCBldGMuXHJcbiAgICovXHJcbiAgbGF5b3V0TWFuYWdlcj86IFNtb0xheW91dE1hbmFnZXI7XHJcbiAgLyoqXHJcbiAgICogcGFydHMgY2FuIGhhdmUgdGhlaXIgb3duIG1lYXN1cmUgZm9ybWF0dGluZ1xyXG4gICAqL1xyXG4gIG1lYXN1cmVGb3JtYXR0aW5nPzogUmVjb3JkPG51bWJlciwgU21vTWVhc3VyZUZvcm1hdD4sXHJcbiAgLyoqXHJcbiAgICogZm9yIHBhcnQtc3BlY2lmaWMgdGV4dFxyXG4gICAqL1xyXG4gIHRleHRHcm91cHM6IFNtb1RleHRHcm91cFtdLFxyXG4gIC8qKlxyXG4gICAqIGluZGljYXRlcyBhIHBhcnQgaGFzIGl0cyBvd24gdGV4dCwgbm90IGluaGVyaXRlZCBmcm9tIHRoZSBzY29yZVxyXG4gICAqL1xyXG4gIHByZXNlcnZlVGV4dEdyb3VwczogYm9vbGVhbixcclxuICAvKipcclxuICAgKiBpbmRpY2F0ZXMgdGhlIHBhcnQgYXBwZWFycyBhcyBjdWUgc2l6ZSBpbiB0aGUgc2NvcmVcclxuICAgKi9cclxuICBjdWVJblNjb3JlOiBib29sZWFuLFxyXG4gIC8qKlxyXG4gICAqIGZ1dHVyZSwgZm9yIHBsYXliYWNrLiAgVE9ETzogTm90ZSBzdGF2ZXMgY29udGFpbiBpbnN0cnVtZW50cyB0aGF0IGNvbXBldGUgd2l0aCB0aGlzLlxyXG4gICAqIG1heWJlIHRoaXMgd2lsbCBiZSByZW1vdmVkXHJcbiAgICovXHJcbiAgbWlkaURldmljZTogc3RyaW5nIHwgbnVsbCxcclxuICAvKipcclxuICAgKiBzZWUgbWlkaURldmljZVxyXG4gICAqL1xyXG4gIG1pZGlJbnN0cnVtZW50OiBTbW9NaWRpSW5zdHJ1bWVudCB8IG51bGwsXHJcbiAgLyoqXHJcbiAgICogaW5kaWNhdGVzIG11bHRpbWVhc3VyZSByZXN0cyBpbiBwYXJ0cyBzaG91bGQgYmUgZXhwYW5kZWQuXHJcbiAgICovXHJcbiAgZXhwYW5kTXVsdGltZWFzdXJlUmVzdHM6IGJvb2xlYW4gXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTZXJpYWxpemVkIHBhcnQgaW5mb3JtYXRpb25cclxuICogQGNhdGVnb3J5IHNlcmlhbGl6YXRpb25cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21vUGFydEluZm9QYXJhbXNTZXIgIHtcclxuICAvKiogY29uc3RydWN0b3IgKi9cclxuICBjdG9yOiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogTmFtZSBvZiB0aGUgcGFydCwgY2FuIGJlIHVzZWQgaW4gaGVhZGVyc1xyXG4gICAqL1xyXG4gIHBhcnROYW1lOiBzdHJpbmcsXHJcbiAgLyoqXHJcbiAgICogYWJicmV2YXRpb24gb2YgcGFydCBuYW1lXHJcbiAgICovXHJcbiAgcGFydEFiYnJldmlhdGlvbjogc3RyaW5nLFxyXG4gIC8qKlxyXG4gICAqIGluZGljYXRlcyB0aGF0IHRoaXMgcGFydCBpbmNsdWRlIHRoZSBuZXh0IHN0YXZlICAoZS5nLiBwaWFubyBwYXJ0KVxyXG4gICAqL1xyXG4gIHN0YXZlc0FmdGVyOiBudW1iZXIsXHJcbiAgLyoqXHJcbiAgICogaW5kaWNhdGVzIHRoYXQgdGhpcyBwYXJ0IGluY2x1ZGUgdGhlIHByZXZpb3VzIHN0YXZlICAoZS5nLiBwaWFubyBwYXJ0KVxyXG4gICAqL1xyXG4gIHN0YXZlc0JlZm9yZTogbnVtYmVyLFxyXG4gIC8qKlxyXG4gICAqIHBhcnRzIGNhbiBoYXZlIHRoZWlyIG93biBwYWdlIHNldHRpbmdzLCB6b29tIHNldHRpbmdzLCBldGMuXHJcbiAgICovXHJcbiAgbGF5b3V0TWFuYWdlcj86IFNtb0xheW91dE1hbmFnZXJQYXJhbXNTZXI7XHJcbiAgLyoqXHJcbiAgICogcGFydHMgY2FuIGhhdmUgdGhlaXIgb3duIG1lYXN1cmUgZm9ybWF0dGluZ1xyXG4gICAqL1xyXG4gIG1lYXN1cmVGb3JtYXR0aW5nPzogUmVjb3JkPG51bWJlciwgU21vTWVhc3VyZUZvcm1hdFBhcmFtc1Nlcj4sXHJcbiAgLyoqXHJcbiAgICogZm9yIHBhcnQtc3BlY2lmaWMgdGV4dFxyXG4gICAqL1xyXG4gIHRleHRHcm91cHM6IFNtb1RleHRHcm91cFBhcmFtc1NlcltdLFxyXG4gIC8qKlxyXG4gICAqIGluZGljYXRlcyBhIHBhcnQgaGFzIGl0cyBvd24gdGV4dCwgbm90IGluaGVyaXRlZCBmcm9tIHRoZSBzY29yZVxyXG4gICAqL1xyXG4gIHByZXNlcnZlVGV4dEdyb3VwczogYm9vbGVhbixcclxuICAvKipcclxuICAgKiBpbmRpY2F0ZXMgdGhlIHBhcnQgYXBwZWFycyBhcyBjdWUgc2l6ZSBpbiB0aGUgc2NvcmVcclxuICAgKi9cclxuICBjdWVJblNjb3JlOiBib29sZWFuLFxyXG4gIC8qKlxyXG4gICAqIGZ1dHVyZSwgZm9yIHBsYXliYWNrLiAgVE9ETzogTm90ZSBzdGF2ZXMgY29udGFpbiBpbnN0cnVtZW50cyB0aGF0IGNvbXBldGUgd2l0aCB0aGlzLlxyXG4gICAqIG1heWJlIHRoaXMgd2lsbCBiZSByZW1vdmVkXHJcbiAgICovXHJcbiAgbWlkaURldmljZTogc3RyaW5nIHwgbnVsbCxcclxuICAvKipcclxuICAgKiBzZWUgbWlkaURldmljZVxyXG4gICAqL1xyXG4gIG1pZGlJbnN0cnVtZW50OiBTbW9NaWRpSW5zdHJ1bWVudCB8IG51bGwsXHJcbiAgLyoqXHJcbiAgICogaW5kaWNhdGVzIG11bHRpbWVhc3VyZSByZXN0cyBpbiBwYXJ0cyBzaG91bGQgYmUgZXhwYW5kZWQuXHJcbiAgICovXHJcbiAgZXhwYW5kTXVsdGltZWFzdXJlUmVzdHM6IGJvb2xlYW4gICBcclxufVxyXG5mdW5jdGlvbiBpc1Ntb1BhcnRJbmZvUGFyYW1zU2VyKHBhcmFtczogUGFydGlhbDxTbW9QYXJ0SW5mb1BhcmFtc1Nlcj4pOiBwYXJhbXMgaXMgU21vUGFydEluZm9QYXJhbXNTZXIge1xyXG4gIGlmIChwYXJhbXMuY3RvciAmJiBwYXJhbXMuY3RvciA9PT0gJ1Ntb1BhcnRJbmZvJykge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG4vKipcclxuICogUGFydCBpbmZvIGNvbnRhaW5zIGluZm9ybWF0aW9uIHRoYXQgZ3JvdXAgMSBvciAyIGFkamFjZW50IHN0YXZlcy5cclxuICogUGFydHMgY2FuIGhhdmUgZm9ybWF0dGluZyB0aGF0IGlzIGluZGVwZW5lZGVudCBvZiB0aGUgc2NvcmVcclxuICogQGNhdGVnb3J5IFNtb09iamVjdFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNtb1BhcnRJbmZvIGV4dGVuZHMgU3RhZmZNb2RpZmllckJhc2Uge1xyXG4gIHBhcnROYW1lOiBzdHJpbmcgPSAnJztcclxuICBwYXJ0QWJicmV2aWF0aW9uOiBzdHJpbmcgPSAnJztcclxuICBsYXlvdXRNYW5hZ2VyOiBTbW9MYXlvdXRNYW5hZ2VyO1xyXG4gIG1lYXN1cmVGb3JtYXR0aW5nOiBSZWNvcmQ8bnVtYmVyLCBTbW9NZWFzdXJlRm9ybWF0PiA9IHt9O1xyXG4gIHRleHRHcm91cHM6IFNtb1RleHRHcm91cFtdID0gW107XHJcbiAgc3RhdmVzQWZ0ZXI6IG51bWJlciA9IDA7XHJcbiAgc3RhdmVzQmVmb3JlOiBudW1iZXIgPSAwO1xyXG4gIHByZXNlcnZlVGV4dEdyb3VwczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGN1ZUluU2NvcmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkaXNwbGF5Q3VlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGV4cGFuZE11bHRpbWVhc3VyZVJlc3RzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbWlkaUluc3RydW1lbnQ6IFNtb01pZGlJbnN0cnVtZW50fCBudWxsO1xyXG4gIG1pZGlEZXZpY2U6IHN0cmluZyB8IG51bGw7XHJcbiAgc3RhdGljIGdldCBkZWZhdWx0cygpOiBTbW9QYXJ0SW5mb1BhcmFtcyB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgIHBhcnROYW1lOiAnU3RhZmYgJyxcclxuICAgICAgcGFydEFiYnJldmlhdGlvbjogJycsXHJcbiAgICAgIGdsb2JhbExheW91dDogU21vTGF5b3V0TWFuYWdlci5kZWZhdWx0TGF5b3V0LFxyXG4gICAgICB0ZXh0R3JvdXBzOiBbXSxcclxuICAgICAgcHJlc2VydmVUZXh0R3JvdXBzOiBmYWxzZSxcclxuICAgICAgcGFnZUxheW91dE1hcDoge30sXHJcbiAgICAgIHN0YXZlc0FmdGVyOiAwLFxyXG4gICAgICBzdGF2ZXNCZWZvcmU6IDAsXHJcbiAgICAgIGN1ZUluU2NvcmU6IGZhbHNlLFxyXG4gICAgICBtaWRpRGV2aWNlOiBudWxsLFxyXG4gICAgICBtaWRpSW5zdHJ1bWVudDogbnVsbCxcclxuICAgICAgZXhwYW5kTXVsdGltZWFzdXJlUmVzdHM6IGZhbHNlXHJcbiAgICB9KSk7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKHBhcmFtczogU21vUGFydEluZm9QYXJhbXMpIHtcclxuICAgIHN1cGVyKCdTbW9QYXJ0SW5mbycpO1xyXG4gICAgaWYgKCFwYXJhbXMubGF5b3V0TWFuYWdlcikge1xyXG4gICAgICB0aGlzLmxheW91dE1hbmFnZXIgPSBuZXcgU21vTGF5b3V0TWFuYWdlcihTbW9MYXlvdXRNYW5hZ2VyLmRlZmF1bHRzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TWFuYWdlciA9IG5ldyBTbW9MYXlvdXRNYW5hZ2VyKHBhcmFtcy5sYXlvdXRNYW5hZ2VyKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YocGFyYW1zLm1lYXN1cmVGb3JtYXR0aW5nKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgY29uc3QgZm9ybWF0S2V5cyA9IE9iamVjdC5rZXlzKHBhcmFtcy5tZWFzdXJlRm9ybWF0dGluZyk7XHJcbiAgICAgIGZvcm1hdEtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbnVtS2V5ID0gcGFyc2VJbnQoa2V5LCAxMCk7XHJcbiAgICAgICAgdGhpcy5tZWFzdXJlRm9ybWF0dGluZ1tudW1LZXldID0gbmV3IFNtb01lYXN1cmVGb3JtYXQocGFyYW1zLm1lYXN1cmVGb3JtYXR0aW5nIVtudW1LZXldKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAocGFyYW1zLnRleHRHcm91cHMpIHtcclxuICAgICAgdGhpcy50ZXh0R3JvdXBzID0gcGFyYW1zLnRleHRHcm91cHM7XHJcbiAgICB9XHJcbiAgICBTbW9QYXJ0SW5mb1N0cmluZ1R5cGVzLmZvckVhY2goKHN0KSA9PiB7XHJcbiAgICAgIHRoaXNbc3RdID0gcGFyYW1zW3N0XTtcclxuICAgIH0pO1xyXG4gICAgU21vUGFydEluZm9OdW1UeXBlcy5mb3JFYWNoKChzdCkgPT4ge1xyXG4gICAgICB0aGlzW3N0XSA9IHBhcmFtc1tzdF07XHJcbiAgICB9KTtcclxuICAgIFNtb1BhcnRJbmZvQm9vbGVhblR5cGVzLmZvckVhY2goKHN0KSA9PiB7XHJcbiAgICAgIHRoaXNbc3RdID0gcGFyYW1zW3N0XSA/PyBmYWxzZTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5taWRpRGV2aWNlID0gcGFyYW1zLm1pZGlEZXZpY2U7XHJcbiAgICBpZiAocGFyYW1zLm1pZGlJbnN0cnVtZW50KSB7XHJcbiAgICAgIHRoaXMubWlkaUluc3RydW1lbnQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBhcmFtcy5taWRpSW5zdHJ1bWVudCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5taWRpSW5zdHJ1bWVudCA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShqc29uT2JqOiBTbW9QYXJ0SW5mb1BhcmFtc1Nlcik6IFNtb1BhcnRJbmZvIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IFNtb1BhcnRJbmZvLmRlZmF1bHRzO1xyXG4gICAgc21vU2VyaWFsaXplLnNlcmlhbGl6ZWRNZXJnZShTbW9QYXJ0QXR0cmlidXRlc0Jhc2ljLCBqc29uT2JqLCBwYXJhbXMpO1xyXG4gICAganNvbk9iai50ZXh0R3JvdXBzLmZvckVhY2goKHRnKSA9PiB7XHJcbiAgICAgIHBhcmFtcy50ZXh0R3JvdXBzLnB1c2goU21vVGV4dEdyb3VwLmRlc2VyaWFsaXplUHJlc2VydmVJZCh0ZykpO1xyXG4gICAgfSk7XHJcbiAgICBwYXJhbXMubWlkaUluc3RydW1lbnQgPSBqc29uT2JqLm1pZGlJbnN0cnVtZW50O1xyXG4gICAgcGFyYW1zLm1pZGlEZXZpY2UgPSBqc29uT2JqLm1pZGlEZXZpY2U7XHJcbiAgICBwYXJhbXMubWVhc3VyZUZvcm1hdHRpbmcgPSB7fTtcclxuICAgIGlmIChqc29uT2JqLmxheW91dE1hbmFnZXIpIHtcclxuICAgICAgY29uc3QgbGF5b3V0TWFuYWdlclBhcmFtczogU21vTGF5b3V0TWFuYWdlclBhcmFtcyA9IHtcclxuICAgICAgICBnbG9iYWxMYXlvdXQ6IGpzb25PYmoubGF5b3V0TWFuYWdlci5nbG9iYWxMYXlvdXQsXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogcGFnZSBtYXJnaW5zIGZvciBlYWNoIHBhZ2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBwYWdlTGF5b3V0czogW11cclxuICAgICAgfVxyXG4gICAgICBqc29uT2JqLmxheW91dE1hbmFnZXIucGFnZUxheW91dHMuZm9yRWFjaCgocGwpID0+IHtcclxuICAgICAgICBjb25zdCBwYWdlTGF5b3V0ID0gbmV3IFNtb1BhZ2VMYXlvdXQocGwpO1xyXG4gICAgICAgIGxheW91dE1hbmFnZXJQYXJhbXMucGFnZUxheW91dHMucHVzaChwYWdlTGF5b3V0KTtcclxuICAgICAgfSk7XHJcbiAgICAgIHBhcmFtcy5sYXlvdXRNYW5hZ2VyID0gbmV3IFNtb0xheW91dE1hbmFnZXIobGF5b3V0TWFuYWdlclBhcmFtcyk7XHJcbiAgICB9XHJcbiAgICBpZiAoanNvbk9iai5tZWFzdXJlRm9ybWF0dGluZykge1xyXG4gICAgICBjb25zdCBtZmtleXMgPSBPYmplY3Qua2V5cyhqc29uT2JqLm1lYXN1cmVGb3JtYXR0aW5nKTtcclxuICAgICAgbWZrZXlzLmZvckVhY2goKG1ma2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWZudW0gPSBwYXJzZUludChtZmtleSwgMTApO1xyXG4gICAgICAgIHBhcmFtcy5tZWFzdXJlRm9ybWF0dGluZyFbbWZudW1dID0gU21vTWVhc3VyZU1vZGlmaWVyQmFzZS5kZXNlcmlhbGl6ZShqc29uT2JqLm1lYXN1cmVGb3JtYXR0aW5nIVttZm51bV0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgU21vUGFydEluZm8ocGFyYW1zKTtcclxuICAgIFxyXG4gIH1cclxuICBzZXJpYWxpemUoKTogU21vUGFydEluZm9QYXJhbXNTZXIge1xyXG4gICAgY29uc3QgcnY6IFBhcnRpYWw8U21vUGFydEluZm9QYXJhbXNTZXI+ID0geyBjdG9yOiAnU21vUGFydEluZm8nIH07XHJcbiAgICBzbW9TZXJpYWxpemUuc2VyaWFsaXplZE1lcmdlTm9uRGVmYXVsdChTbW9QYXJ0SW5mby5kZWZhdWx0cywgU21vUGFydEF0dHJpYnV0ZXNCYXNpYywgdGhpcywgcnYpO1xyXG4gICAgcnYubGF5b3V0TWFuYWdlciA9IHRoaXMubGF5b3V0TWFuYWdlci5zZXJpYWxpemUoKTtcclxuICAgIHJ2LnRleHRHcm91cHMgPSBbXTtcclxuICAgIHRoaXMudGV4dEdyb3Vwcy5mb3JFYWNoKCh0ZykgPT4ge1xyXG4gICAgICBydi50ZXh0R3JvdXBzIS5wdXNoKHRnLnNlcmlhbGl6ZSgpKTtcclxuICAgIH0pO1xyXG4gICAgcnYubWVhc3VyZUZvcm1hdHRpbmcgPSB7fTtcclxuICAgIGlmICh0aGlzLm1pZGlJbnN0cnVtZW50KSB7XHJcbiAgICAgIHJ2Lm1pZGlJbnN0cnVtZW50ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm1pZGlJbnN0cnVtZW50KSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5taWRpRGV2aWNlKSB7XHJcbiAgICAgIHJ2Lm1pZGlEZXZpY2UgPSB0aGlzLm1pZGlEZXZpY2U7XHJcbiAgICB9XHJcbiAgICBPYmplY3Qua2V5cyh0aGlzLm1lYXN1cmVGb3JtYXR0aW5nKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgY29uc3QgbnVtS2V5ID0gcGFyc2VJbnQoa2V5LCAxMCk7XHJcbiAgICAgIHJ2Lm1lYXN1cmVGb3JtYXR0aW5nIVtudW1LZXldID0gdGhpcy5tZWFzdXJlRm9ybWF0dGluZ1tudW1LZXldO1xyXG4gICAgfSk7XHJcbiAgICBpZiAoIWlzU21vUGFydEluZm9QYXJhbXNTZXIocnYpKSB7XHJcbiAgICAgIHRocm93ICdiYWQgcGFydCBpbmZvICcgKyBKU09OLnN0cmluZ2lmeShydik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIHVwZGF0ZVRleHRHcm91cCh0ZXh0R3JvdXA6IFNtb1RleHRHcm91cCwgdG9BZGQ6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHRnaWQgPSB0eXBlb2YgKHRleHRHcm91cCkgPT09ICdzdHJpbmcnID8gdGV4dEdyb3VwIDpcclxuICAgICAgdGV4dEdyb3VwLmF0dHJzLmlkO1xyXG4gICAgY29uc3QgYXIgPSB0aGlzLnRleHRHcm91cHMuZmlsdGVyKCh0ZykgPT4gdGcuYXR0cnMuaWQgIT09IHRnaWQpO1xyXG4gICAgdGhpcy50ZXh0R3JvdXBzID0gYXI7XHJcbiAgICBpZiAodG9BZGQpIHtcclxuICAgICAgY29uc3QgbmV3VmVyc2lvbiA9IFNtb1RleHRHcm91cC5kZXNlcmlhbGl6ZVByZXNlcnZlSWQodGV4dEdyb3VwKTtcclxuICAgICAgdGhpcy50ZXh0R3JvdXBzLnB1c2gobmV3VmVyc2lvbik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlbW92ZVRleHRHcm91cCh0ZXh0R3JvdXA6IFNtb1RleHRHcm91cCkge1xyXG4gICAgdGhpcy51cGRhdGVUZXh0R3JvdXAodGV4dEdyb3VwLCBmYWxzZSk7XHJcbiAgfVxyXG4gIGFkZFRleHRHcm91cCh0ZXh0R3JvdXA6IFNtb1RleHRHcm91cCkge1xyXG4gICAgdGhpcy51cGRhdGVUZXh0R3JvdXAodGV4dEdyb3VwLCB0cnVlKTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/smo/data/partInfo.ts\n\n}");
1560
1560
 
1561
1561
  /***/ },
1562
1562
 
@@ -1908,7 +1908,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
1908
1908
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1909
1909
 
1910
1910
  "use strict";
1911
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RibbonButtons: () => (/* binding */ RibbonButtons),\n/* harmony export */ SuiModalButtonStrings: () => (/* binding */ SuiModalButtonStrings),\n/* harmony export */ isModalButtonType: () => (/* binding */ isModalButtonType)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common */ \"./src/ui/common.ts\");\n/* harmony import */ var _dialogs_library__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dialogs/library */ \"./src/ui/dialogs/library.ts\");\n/* harmony import */ var _dialogs_tempo__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../dialogs/tempo */ \"./src/ui/dialogs/tempo.ts\");\n/* harmony import */ var _dialogs_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../dialogs/dialog */ \"./src/ui/dialogs/dialog.ts\");\n/* harmony import */ var _help__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../help */ \"./src/ui/help.ts\");\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _dialogs_keySignature__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../dialogs/keySignature */ \"./src/ui/dialogs/keySignature.ts\");\n/* harmony import */ var _components_buttons_ribbon_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/buttons/ribbon.vue */ \"./src/ui/components/buttons/ribbon.vue\");\n/* harmony import */ var _components_buttons_sidebar_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../components/buttons/sidebar.vue */ \"./src/ui/components/buttons/sidebar.vue\");\n/* harmony import */ var _dialogs_timeSignature__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../dialogs/timeSignature */ \"./src/ui/dialogs/timeSignature.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\nvar SuiModalButtonStrings = ['SuiLibraryDialog', 'SuiTempoDialog'];\nfunction isModalButtonType(but) {\n return SuiModalButtonStrings.indexOf(but) >= 0;\n}\n/**\n * Render the ribbon buttons based on group, function, and underlying UI handler.\n * Also handles UI events.\n * @category SuiButton\n */\nclass RibbonButtons {\n static get paramArray() {\n return ['ribbonButtons', 'ribbons', 'keyCommands', 'controller', 'menus', 'eventSource', 'view'];\n }\n static ribbonButtonHtml(containerClass, buttonId, buttonClass, buttonText, buttonIcon, buttonKey) {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const r = b('div').classes(containerClass).append(b('button').attr('id', buttonId).classes(buttonClass).append(b('span').classes('left-text').append(b('span').classes('text-span').text(buttonText)).append(b('span').classes('ribbon-button-text icon ' + buttonIcon))).append(b('span').classes('ribbon-button-hotkey').text(buttonKey)));\n return r.dom();\n }\n static menuButtonHtml(buttonId, buttonClass, buttonText, buttonIcon, buttonKey) {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const r = b('li').classes('nav-item')\n .append(b('button').classes(buttonClass).attr('id', buttonId).classes('nav-link').append(b('span').classes('left-text').append(b('span').classes('text-span').text(buttonText))).append(b('span').classes('ribbon-button-text icon ' + buttonIcon)).append(b('span').classes('ribbon-button-hotkey').text(buttonKey)));\n return r.dom();\n }\n constructor(params) {\n this.collapsables = [];\n this.collapseChildren = [];\n this.controller = params.completeNotifier;\n this.config = params.config;\n this.eventSource = params.eventSource;\n this.view = params.view;\n this.menus = params.menus;\n this.ribbonButtons = params.ribbonButtons;\n this.ribbons = params.ribbons;\n this.collapsables = [];\n this.collapseChildren = [];\n }\n executeQuickButton(button) {\n return __awaiter(this, void 0, void 0, function* () {\n if (button.id === 'zoomin') {\n const globalLayout = this.view.score.layoutManager.getGlobalLayout();\n globalLayout.zoomScale /= 1.1;\n yield this.view.updateZoom(globalLayout.zoomScale);\n }\n else if (button.id === 'zoomout') {\n const globalLayout = this.view.score.layoutManager.getGlobalLayout();\n globalLayout.zoomScale *= 1.1;\n this.view.updateZoom(globalLayout.zoomScale);\n }\n else if (button.id === 'refresh') {\n yield this.view.refreshViewport();\n }\n else if (button.id === 'keySignature') {\n if (!this.controller) {\n return;\n }\n (0,_dialogs_dialog__WEBPACK_IMPORTED_MODULE_4__.createAndDisplayDialog)(_dialogs_keySignature__WEBPACK_IMPORTED_MODULE_7__.SuiKeySignatureDialog, {\n view: this.view,\n completeNotifier: this.controller,\n startPromise: null,\n eventSource: this.eventSource,\n tracker: this.view.tracker,\n ctor: 'SuiKeySignatureDialog',\n id: 'key-signature-dialog',\n modifier: null\n });\n }\n else if (button.id === 'ribbonTime') {\n if (!this.controller) {\n return;\n }\n (0,_dialogs_dialog__WEBPACK_IMPORTED_MODULE_4__.createAndDisplayDialog)(_dialogs_timeSignature__WEBPACK_IMPORTED_MODULE_10__.SuiTimeSignatureDialog, {\n completeNotifier: this.controller,\n view: this.view,\n eventSource: this.eventSource,\n id: 'staffGroups',\n ctor: 'SuiStaffGroupDialog',\n tracker: this.view.tracker,\n modifier: null,\n startPromise: null\n });\n }\n else if (button.id === 'ribbonTempo') {\n if (!this.controller) {\n return;\n }\n const tempo = this.view.tracker.selections[0].measure.getTempo();\n (0,_dialogs_dialog__WEBPACK_IMPORTED_MODULE_4__.createAndDisplayDialog)(_dialogs_tempo__WEBPACK_IMPORTED_MODULE_3__.SuiTempoDialog, {\n id: 'tempoDialog',\n ctor: 'SuiTempoDialog',\n completeNotifier: this.controller,\n view: this.view,\n eventSource: this.eventSource,\n tracker: this.view.tracker,\n startPromise: null,\n modifier: tempo\n });\n }\n else if (button.id === 'playButton2') {\n this.view.playFromSelection();\n }\n else if (button.id === 'stopButton2') {\n this.view.stopPlayer();\n }\n else if (button.id === 'selectPart') {\n if (!this.controller) {\n return;\n }\n yield this.view.renderPromise();\n this.menus.createMenu('SuiPartSelectionMenu', this.controller);\n }\n });\n }\n executeButtonModal(buttonElement, buttonData) {\n return __awaiter(this, void 0, void 0, function* () {\n if (isModalButtonType(buttonData.ctor)) {\n const params = {\n eventSource: this.eventSource,\n completeNotifier: this.controller,\n view: this.view,\n ctor: buttonData.ctor,\n id: buttonData.id,\n startPromise: null,\n tracker: this.view.tracker\n };\n if (buttonData.ctor === 'SuiLibraryDialog') {\n yield _dialogs_library__WEBPACK_IMPORTED_MODULE_2__.SuiLibraryDialog.createAndDisplay(params, this.config);\n }\n else {\n (0,_dialogs_dialog__WEBPACK_IMPORTED_MODULE_4__.createAndDisplayDialog)(_dialogs_tempo__WEBPACK_IMPORTED_MODULE_3__.SuiTempoDialog, params);\n }\n }\n else if (buttonData.ctor === 'helpModal') {\n _help__WEBPACK_IMPORTED_MODULE_5__.SuiHelp.displayHelp();\n }\n });\n }\n executeButtonMenu(buttonElement, buttonData) {\n this.menus.createMenu(buttonData.ctor, this.controller);\n }\n executeButton(buttonElement, buttonData) {\n return __awaiter(this, void 0, void 0, function* () {\n if (buttonData.action === 'modal') {\n yield this.executeButtonModal(buttonElement, buttonData);\n return;\n }\n if (buttonData.action === 'menu' || buttonData.action === 'collapseChildMenu') {\n this.executeButtonMenu(buttonElement, buttonData);\n }\n });\n }\n bindButton(buttonElement, buttonData) {\n const cb = () => __awaiter(this, void 0, void 0, function* () {\n yield this.executeButton(buttonElement, buttonData);\n });\n this.eventSource.domClick(buttonElement, cb);\n }\n createCollapsibleButtonGroups(selector) {\n let containerClass = '';\n // Now all the button elements have been bound. Join child and parent buttons\n // For all the children of a button group, add it to the parent group\n this.collapseChildren.forEach((b) => {\n containerClass = 'ribbonButtonContainer';\n if (b.action === 'collapseGrandchild') {\n containerClass = 'ribbonButtonContainerMore';\n }\n const buttonHtml = RibbonButtons.ribbonButtonHtml(containerClass, b.id, b.classes, b.leftText, b.icon, b.rightText);\n if (b.dataElements) {\n const bkeys = Object.keys(b.dataElements);\n bkeys.forEach((bkey) => {\n var de = b.dataElements[bkey];\n $(buttonHtml).find('button').attr('data-' + bkey, de);\n });\n }\n // Bind the child button actions\n const parent = $(selector).find('.collapseContainer[data-group=\"' + b.group + '\"]');\n $(parent).append(buttonHtml);\n const el = $(selector).find('#' + b.id);\n this.bindButton(el, b);\n });\n this.collapsables.forEach((cb) => {\n // Bind the events of the parent button\n cb.bind();\n });\n }\n _createSidebarButtonGroups(selector) {\n let containerClass = '';\n // Now all the button elements have been bound. Join child and parent buttons\n // For all the children of a button group, add it to the parent group\n this.collapseChildren.forEach((b) => {\n containerClass = 'ribbonButtonContainer';\n if (b.action === 'collapseGrandchild') {\n containerClass = 'ribbonButtonContainerMore';\n }\n const buttonHtml = RibbonButtons.ribbonButtonHtml(containerClass, b.id, b.classes, b.leftText, b.icon, b.rightText);\n if (b.dataElements) {\n const bkeys = Object.keys(b.dataElements);\n bkeys.forEach((bkey) => {\n var de = b.dataElements[bkey];\n $(buttonHtml).find('button').attr('data-' + bkey, de);\n });\n }\n // Bind the child button actions\n const parent = $(selector).find('.collapseContainer[data-group=\"' + b.group + '\"]');\n $(parent).append(buttonHtml);\n const el = $(selector).find('#' + b.id);\n this.bindButton(el, b);\n });\n this.collapsables.forEach((cb) => {\n // Bind the events of the parent button\n cb.bind();\n });\n }\n static isCollapsible(action) {\n return ['collapseChild', 'collapseChildMenu', 'collapseGrandchild', 'collapseMore'].indexOf(action) >= 0;\n }\n // ### _createButtonHtml\n // For each button, create the html and bind the events based on\n // the button's configured action.\n createRibbonHtml(buttonAr, selector) {\n let buttonClass = '';\n const dataArray = [];\n const buttonCallback = (button) => __awaiter(this, void 0, void 0, function* () {\n return yield this.executeQuickButton(button);\n });\n buttonAr.forEach((buttonId) => {\n const buttonData = this.ribbonButtons.find((e) => e.id === buttonId);\n if (buttonData) {\n buttonData.callback = buttonCallback;\n buttonData.classes += ' btn';\n dataArray.push(buttonData);\n }\n });\n const root = (0,_common__WEBPACK_IMPORTED_MODULE_1__.replaceVueRoot)(selector);\n (0,vue__WEBPACK_IMPORTED_MODULE_6__.createApp)(_components_buttons_ribbon_vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"], { buttonProps: dataArray, domId: root }).mount('#' + root);\n }\n // ### _createButtonHtml\n // For each button, create the html and bind the events based on\n // the button's configured action.\n createSidebarMenuHtml(buttonAr, selector) {\n let buttonClass = '';\n const buttonList = [];\n const executeButton = (buttonData) => __awaiter(this, void 0, void 0, function* () {\n yield this.executeButton(buttonData.id, buttonData);\n });\n buttonAr.forEach((buttonId) => {\n const buttonData = this.ribbonButtons.find((e) => e.id === buttonId);\n if (buttonData) {\n buttonData.callback = executeButton;\n buttonData.icon += ' menu-icon';\n buttonList.push(buttonData);\n /* if (buttonData.leftText) {\n RibbonButtons.translateButtons.push({ buttonId: buttonData.id, buttonText: buttonData.leftText });\n }\n // collapse child is hidden until the parent button is selected, exposing the button group\n if (RibbonButtons.isCollapsible(buttonData.action)) {\n this.collapseChildren.push(buttonData);\n }\n if (buttonData.action !== 'collapseChild') {\n // else the button has a specific action, such as a menu or dialog, or a parent button\n // for translation, add the menu name to the button class\n buttonClass = buttonData.classes;\n if (buttonData.action === 'menu' || buttonData.action === 'modal') {\n buttonClass += ' ' + buttonData.ctor;\n }\n const buttonHtml = RibbonButtons.menuButtonHtml(\n buttonData.id, buttonClass, buttonData.leftText, buttonData.icon, buttonData.rightText);\n $(buttonHtml).attr('data-group', buttonData.group);\n $(selector).append(buttonHtml);\n const buttonElement = $('#' + buttonData.id);\n // If this is a collabsable button, create it, otherwise bind its execute function.\n if (buttonData.action === 'collapseParent') {\n $(buttonHtml).addClass('collapseContainer');\n // collapseParent\n this.collapsables.push(new CollapseRibbonControl({\n ctor: buttonData.ctor,\n buttons: this.ribbonButtons,\n view: this.view,\n menus: this.menus,\n eventSource: this.eventSource,\n completeNotifier: this.controller,\n buttonId: buttonData.id,\n buttonElement,\n buttonData\n }));\n } else {\n const cb = async () => {\n await this.executeButton(buttonElement, buttonData);\n };\n this.eventSource.domClick(buttonElement, cb);\n }\n }*/\n }\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_6__.createApp)(_components_buttons_sidebar_vue__WEBPACK_IMPORTED_MODULE_9__[\"default\"], { buttonProps: buttonList, domId: selector instanceof HTMLElement ? selector.id : selector }).mount(selector);\n }\n createRibbon(buttonDataArray, parentElement) {\n this.createRibbonHtml(buttonDataArray, parentElement);\n this.createCollapsibleButtonGroups(parentElement);\n }\n createSidebarRibbon(buttonDataArray, parentElement, containerClasses) {\n this.createSidebarMenuHtml(buttonDataArray, parentElement);\n // this._createCollapsibleButtonGroups(parentElement); needed?\n }\n handleKeyDown(ev) {\n return __awaiter(this, void 0, void 0, function* () {\n if (ev.altKey) {\n const keyButton = this.ribbonButtons.find((bb) => bb.hotKey && bb.hotKey === ev.key);\n if (keyButton) {\n const element = '#' + keyButton.id;\n yield this.executeButton(element, keyButton);\n }\n }\n });\n }\n display() {\n if (this.config.leftControls) {\n const leftControl = (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.getDomContainer)(this.config.leftControls);\n if (leftControl) {\n $(leftControl).html('');\n const lbuttons = this.ribbons.left;\n this.createSidebarRibbon(lbuttons, leftControl, 'nav-item');\n }\n }\n if (this.config.topControls) {\n const topControl = (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.getDomContainer)(this.config.topControls);\n if (topControl) {\n const tbuttons = this.ribbons.top;\n this.createRibbon(tbuttons, topControl);\n }\n }\n const kd = (ev) => __awaiter(this, void 0, void 0, function* () { this.handleKeyDown(ev); });\n this.eventSource.bindKeydownHandler(kd);\n }\n}\nRibbonButtons.translateButtons = [];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFNLFdBQVcsR0FBRyxvRUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDOUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzlELENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzVCLE1BQU0sVUFBVSxHQUFHLG9FQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1RCxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMxQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFHLENBQU8sRUFBTyxFQUFFLEVBQUUsZ0RBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDOztBQXpUTSw4QkFBZ0IsR0FBa0IsRUFBRSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3VpL2J1dHRvbnMvcmliYm9uLnRzP2Y4NmMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gW1Ntb29zaWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BYXJvbkRhdmlkTmV3bWFuL1Ntb29zaWMpXHJcbi8vIENvcHlyaWdodCAoYykgQWFyb24gRGF2aWQgTmV3bWFuIDIwMjEuXHJcbmltcG9ydCB7IGJ1aWxkRG9tLCBnZXREb21Db250YWluZXIgfSBmcm9tICcuLi8uLi9jb21tb24vaHRtbEhlbHBlcnMnO1xyXG5pbXBvcnQgeyBLZXlFdmVudCB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL2NvbW1vbic7XHJcbmltcG9ydCB7IEJ1dHRvbkRlZmluaXRpb24sIEJ1dHRvbkFjdGlvbiB9IGZyb20gJy4vYnV0dG9uJztcclxuaW1wb3J0IHsgQnJvd3NlckV2ZW50U291cmNlIH0gZnJvbSAnLi4vZXZlbnRTb3VyY2UnO1xyXG5pbXBvcnQgeyBTdWlTY29yZVZpZXdPcGVyYXRpb25zIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS9zY29yZVZpZXdPcGVyYXRpb25zJztcclxuaW1wb3J0IHsgQ29tcGxldGVOb3RpZmllciwgUmliYm9uTGF5b3V0LCByZXBsYWNlVnVlUm9vdCB9IGZyb20gJy4uL2NvbW1vbic7XHJcbmltcG9ydCB7IFN1aVRyYWNrZXIgfSBmcm9tICcuLi8uLi9yZW5kZXIvc3VpL3RyYWNrZXInO1xyXG5pbXBvcnQgeyBTdWlNZW51TWFuYWdlciB9IGZyb20gJy4uL21lbnVzL21hbmFnZXInO1xyXG5pbXBvcnQgeyBTdWlMaWJyYXJ5RGlhbG9nIH0gZnJvbSAnLi4vZGlhbG9ncy9saWJyYXJ5JztcclxuaW1wb3J0IHsgU3VpVGVtcG9EaWFsb2cgfSBmcm9tICcuLi9kaWFsb2dzL3RlbXBvJztcclxuaW1wb3J0IHsgQnV0dG9uTGFiZWwgfSBmcm9tICcuL2J1dHRvbic7XHJcbmltcG9ydCB7IENvbGxhcHNlUmliYm9uQ29udHJvbCB9IGZyb20gJy4vY29sbGFwc2FibGUnO1xyXG5pbXBvcnQgeyBjcmVhdGVBbmREaXNwbGF5RGlhbG9nIH0gZnJvbSAnLi4vZGlhbG9ncy9kaWFsb2cnO1xyXG5pbXBvcnQgeyBTdWlIZWxwIH0gZnJvbSAnLi4vaGVscCc7XHJcbmltcG9ydCB7IFNtb1VpQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL2NvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgeyBjcmVhdGVBcHAgfSBmcm9tICd2dWUnO1xyXG5pbXBvcnQgeyBTdWlLZXlTaWduYXR1cmVEaWFsb2cgfSBmcm9tICcuLi9kaWFsb2dzL2tleVNpZ25hdHVyZSc7XHJcbmltcG9ydCB7IGRlZmF1bHQgYXMgcmliYm9uQXBwIH0gZnJvbSAnLi4vY29tcG9uZW50cy9idXR0b25zL3JpYmJvbi52dWUnO1xyXG5pbXBvcnQgeyBkZWZhdWx0IGFzIHJpYmJvblNpZGViYXJBcHAgfSBmcm9tICcuLi9jb21wb25lbnRzL2J1dHRvbnMvc2lkZWJhci52dWUnO1xyXG5pbXBvcnQgeyBTdWlUaW1lU2lnbmF0dXJlRGlhbG9nIH0gZnJvbSAnLi4vZGlhbG9ncy90aW1lU2lnbmF0dXJlJztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbmV4cG9ydCB0eXBlIFN1aU1vZGFsQnV0dG9uVHlwZXMgPSAnU3VpTGlicmFyeURpYWxvZycgfCAnU3VpVGVtcG9EaWFsb2cnO1xyXG5leHBvcnQgdmFyIFN1aU1vZGFsQnV0dG9uU3RyaW5ncyA9IFsnU3VpTGlicmFyeURpYWxvZycsICdTdWlUZW1wb0RpYWxvZyddO1xyXG5leHBvcnQgZnVuY3Rpb24gaXNNb2RhbEJ1dHRvblR5cGUoYnV0OiBzdHJpbmcgfCBTdWlNb2RhbEJ1dHRvblR5cGVzKTogYnV0IGlzIFN1aU1vZGFsQnV0dG9uVHlwZXMge1xyXG4gIHJldHVybiBTdWlNb2RhbEJ1dHRvblN0cmluZ3MuaW5kZXhPZihidXQpID49IDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQYXJhbWV0ZXJzIGZvciBjcmVhdGluZyB0aGUgZ2xvYmFsIGJ1dHRvbiByaWJib24gb2JqZWN0LiAgVGhlIGJ1dHRvbiByaWJib24gc3VwcG9ydHMgYSBcclxuICogYnV0dG9uIHBhbmVsIGluICd0b3AnIGFuZCAnbGVmdCcgYXJlYXMsIHdpdGggc3VwcG9ydCBmb3IgUi10by1MIGxhbmd1YWdlcy4gIFxyXG4gKiBCdXR0b24gZ3JvdXBzIGluIGxlZnQgYW5kIGRpc3BsYXkgbWVudXMgYXJlIG5vdCBjb2xsYXBzaWJsZS4gIFRoZXkgYXJlIGp1c3QgYSBCdXR0b25EZWZpbml0aW9uXHJcbiAqIGNhcHN1bGUgYnV0IGFyZSBub3QgYWN0dWFsbHkgYnV0dG9ucyAtIGV2ZW50IGhhbmRsaW5nIGlzIGRvbmUgYnkgdGhpcyAncmliYm9uJyBvYmplY3QuXHJcbiAqIEJ1dHRvbiBncm91cHMgKG1vc3RseSBvYnNvbGV0ZSkgYXJlIGNvbGxhcHNpYmxlIGFuZCBhcmUgZmlyc3QtY2xhc3MgYnV0dG9uIG9iamVjdHMgYW5kXHJcbiAqIGFyZSBjb2xsYXBzaWJsZS4gIFRoZSBjb250ZW50IG9mIHJpYmJvbkJ1dHRvbnMgZGV0ZXJtaW5lcyB3aGljaCBidXR0b25zIHNob3cgdXAuICBcclxuICogcmliYm9uIGxheW91dCBkZXRlcm1pbmVzIHdoaWNoIHNob3cgdXAgdG9wIHZzLiBsZWZ0XHJcbiAqIEBwYXJhbSB7QnJvd3NlckV2ZW50U291cmNlfSBldmVudFNvdXJjZSAtIGJ1dHRvbnMgd2lsbCB1c2UgdGhpcyB0byBiaW5kIGNsaWNrIGV2ZW50c1xyXG4gKiBAcGFyYW0ge0NvbXBsZXRlTm90aWZpZXJ9IGNvbXBsZXRlTm90aWZpZXIgLSBidXR0b25zIHRoYXQgYnJpbmcgdXAgbWVudXMgYW5kIGRpYWxvZ3Mgd2lsbCBwYXNzIHRoaXMgdG8gdGhlIGRpYWxvZ3NcclxuICogQHBhcmFtIHtTdWlUcmFja2VyfSB0cmFja2VyIC0gc29tZSBidXR0b25zIGFjdCBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb25cclxuICogQHBhcmFtIHtTdWlNZW51TWFuYWdlcn0gbWVudXMgLSBzb21lIGJ1dHRvbnMgaW52b2tlIGEgbWVudVxyXG4gKiBAcGFyYW0ge0J1dHRvbkRlZmluaXRpb25bXX0gLSB0aGUgYnV0dG9uc1xyXG4gKiBAcGFyYW0ge1JpYmJvbkxheW91dH0gcmliYm9ucyAtIHdoZXJlIHRoZSBidXR0b25zIGFwcGVhclxyXG4gKiBAY2F0ZWdvcnkgU3VpQnV0dG9uXHJcbiAqIEBzZWUge0J1dHRvbkRlZmluaXRpb259IGZvciBob3cgdG8gY3JlYXRlL21vZGlmeSBidXR0b25zXHJcbiAqIEBzZWUge2RlZmF1bHRSaWJib25MYXlvdXR9IGZvciBidXR0b25zIHN1cHBvcnRlZCBmcm9tIHRoZSBkZW1vIGFwcGxpY2F0aW9uXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aVJpYmJvblBhcmFtcyB7XHJcbiAgY29uZmlnOiBTbW9VaUNvbmZpZ3VyYXRpb25cclxuICBldmVudFNvdXJjZTogQnJvd3NlckV2ZW50U291cmNlLFxyXG4gIHZpZXc6IFN1aVNjb3JlVmlld09wZXJhdGlvbnMsXHJcbiAgY29tcGxldGVOb3RpZmllcjogQ29tcGxldGVOb3RpZmllcixcclxuICB0cmFja2VyOiBTdWlUcmFja2VyLFxyXG4gIG1lbnVzOiBTdWlNZW51TWFuYWdlcixcclxuICByaWJib25CdXR0b25zOiBCdXR0b25EZWZpbml0aW9uW10sXHJcbiAgcmliYm9uczogUmliYm9uTGF5b3V0XHJcbn1cclxuLyoqXHJcbiAqIFJlbmRlciB0aGUgcmliYm9uIGJ1dHRvbnMgYmFzZWQgb24gZ3JvdXAsIGZ1bmN0aW9uLCBhbmQgdW5kZXJseWluZyBVSSBoYW5kbGVyLlxyXG4gKiBBbHNvIGhhbmRsZXMgVUkgZXZlbnRzLlxyXG4gKiBAY2F0ZWdvcnkgU3VpQnV0dG9uXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUmliYm9uQnV0dG9ucyB7XHJcbiAgc3RhdGljIGdldCBwYXJhbUFycmF5KCkge1xyXG4gICAgcmV0dXJuIFsncmliYm9uQnV0dG9ucycsICdyaWJib25zJywgJ2tleUNvbW1hbmRzJywgJ2NvbnRyb2xsZXInLCAnbWVudXMnLCAnZXZlbnRTb3VyY2UnLCAndmlldyddO1xyXG4gIH1cclxuICBzdGF0aWMgcmliYm9uQnV0dG9uSHRtbChjb250YWluZXJDbGFzczogc3RyaW5nLCBidXR0b25JZDogc3RyaW5nLCBidXR0b25DbGFzczogc3RyaW5nLCBidXR0b25UZXh0OiBzdHJpbmcsIGJ1dHRvbkljb246IHN0cmluZywgYnV0dG9uS2V5OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGIgPSBidWlsZERvbTtcclxuICAgIGNvbnN0IHIgPSBiKCdkaXYnKS5jbGFzc2VzKGNvbnRhaW5lckNsYXNzKS5hcHBlbmQoYignYnV0dG9uJykuYXR0cignaWQnLCBidXR0b25JZCkuY2xhc3NlcyhidXR0b25DbGFzcykuYXBwZW5kKFxyXG4gICAgICBiKCdzcGFuJykuY2xhc3NlcygnbGVmdC10ZXh0JykuYXBwZW5kKFxyXG4gICAgICAgIGIoJ3NwYW4nKS5jbGFzc2VzKCd0ZXh0LXNwYW4nKS50ZXh0KGJ1dHRvblRleHQpKS5hcHBlbmQoXHJcbiAgICAgICAgICBiKCdzcGFuJykuY2xhc3NlcygncmliYm9uLWJ1dHRvbi10ZXh0IGljb24gJyArIGJ1dHRvbkljb24pKSkuYXBwZW5kKFxyXG4gICAgICAgICAgICBiKCdzcGFuJykuY2xhc3NlcygncmliYm9uLWJ1dHRvbi1ob3RrZXknKS50ZXh0KGJ1dHRvbktleSkpKTtcclxuICAgIHJldHVybiByLmRvbSgpO1xyXG4gIH1cclxuICBzdGF0aWMgbWVudUJ1dHRvbkh0bWwoYnV0dG9uSWQ6IHN0cmluZywgYnV0dG9uQ2xhc3M6IHN0cmluZywgYnV0dG9uVGV4dDogc3RyaW5nLCBidXR0b25JY29uOiBzdHJpbmcsIGJ1dHRvbktleTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBiID0gYnVpbGREb207XHJcbiAgICBjb25zdCByID0gYignbGknKS5jbGFzc2VzKCduYXYtaXRlbScpXHJcbiAgICAgIC5hcHBlbmQoYignYnV0dG9uJykuY2xhc3NlcyhidXR0b25DbGFzcykuYXR0cignaWQnLCBidXR0b25JZCkuY2xhc3NlcygnbmF2LWxpbmsnKS5hcHBlbmQoXHJcbiAgICAgICAgYignc3BhbicpLmNsYXNzZXMoJ2xlZnQtdGV4dCcpLmFwcGVuZChcclxuICAgICAgICAgIGIoJ3NwYW4nKS5jbGFzc2VzKCd0ZXh0LXNwYW4nKS50ZXh0KGJ1dHRvblRleHQpKSkuYXBwZW5kKFxyXG4gICAgICAgICAgICBiKCdzcGFuJykuY2xhc3NlcygncmliYm9uLWJ1dHRvbi10ZXh0IGljb24gJyArIGJ1dHRvbkljb24pKS5hcHBlbmQoXHJcbiAgICAgICAgICAgICAgYignc3BhbicpLmNsYXNzZXMoJ3JpYmJvbi1idXR0b24taG90a2V5JykudGV4dChidXR0b25LZXkpKSk7XHJcbiAgICByZXR1cm4gci5kb20oKTtcclxuICB9XHJcbiAgc3RhdGljIHRyYW5zbGF0ZUJ1dHRvbnM6IEJ1dHRvbkxhYmVsW10gPSBbXTtcclxuICBjb250cm9sbGVyOiBDb21wbGV0ZU5vdGlmaWVyO1xyXG4gIGNvbmZpZzogU21vVWlDb25maWd1cmF0aW9uO1xyXG4gIGV2ZW50U291cmNlOiBCcm93c2VyRXZlbnRTb3VyY2U7XHJcbiAgdmlldzogU3VpU2NvcmVWaWV3T3BlcmF0aW9ucztcclxuICBtZW51czogU3VpTWVudU1hbmFnZXI7XHJcbiAgcmliYm9uczogUmliYm9uTGF5b3V0O1xyXG4gIHJpYmJvbkJ1dHRvbnM6IEJ1dHRvbkRlZmluaXRpb25bXTtcclxuICBjb2xsYXBzYWJsZXM6IENvbGxhcHNlUmliYm9uQ29udHJvbFtdID0gW107XHJcbiAgY29sbGFwc2VDaGlsZHJlbjogYW55W10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocGFyYW1zOiBTdWlSaWJib25QYXJhbXMpIHtcclxuICAgIHRoaXMuY29udHJvbGxlciA9IHBhcmFtcy5jb21wbGV0ZU5vdGlmaWVyO1xyXG4gICAgdGhpcy5jb25maWcgPSBwYXJhbXMuY29uZmlnO1xyXG4gICAgdGhpcy5ldmVudFNvdXJjZSA9IHBhcmFtcy5ldmVudFNvdXJjZTtcclxuICAgIHRoaXMudmlldyA9IHBhcmFtcy52aWV3O1xyXG4gICAgdGhpcy5tZW51cyA9IHBhcmFtcy5tZW51cztcclxuICAgIHRoaXMucmliYm9uQnV0dG9ucyA9IHBhcmFtcy5yaWJib25CdXR0b25zO1xyXG4gICAgdGhpcy5yaWJib25zID0gcGFyYW1zLnJpYmJvbnM7XHJcbiAgICB0aGlzLmNvbGxhcHNhYmxlcyA9IFtdO1xyXG4gICAgdGhpcy5jb2xsYXBzZUNoaWxkcmVuID0gW107XHJcbiAgfVxyXG4gIGFzeW5jIGV4ZWN1dGVRdWlja0J1dHRvbihidXR0b246IEJ1dHRvbkRlZmluaXRpb24pIHtcclxuICAgIGlmIChidXR0b24uaWQgPT09ICd6b29taW4nKSB7XHJcbiAgICAgIGNvbnN0IGdsb2JhbExheW91dCA9IHRoaXMudmlldy5zY29yZS5sYXlvdXRNYW5hZ2VyIS5nZXRHbG9iYWxMYXlvdXQoKTtcclxuICAgICAgZ2xvYmFsTGF5b3V0Lnpvb21TY2FsZSAvPSAxLjE7XHJcbiAgICAgIGF3YWl0IHRoaXMudmlldy51cGRhdGVab29tKGdsb2JhbExheW91dC56b29tU2NhbGUpO1xyXG4gICAgfSBlbHNlIGlmIChidXR0b24uaWQgPT09ICd6b29tb3V0Jykge1xyXG4gICAgICBjb25zdCBnbG9iYWxMYXlvdXQgPSB0aGlzLnZpZXcuc2NvcmUubGF5b3V0TWFuYWdlciEuZ2V0R2xvYmFsTGF5b3V0KCk7XHJcbiAgICAgIGdsb2JhbExheW91dC56b29tU2NhbGUgKj0gMS4xO1xyXG4gICAgICB0aGlzLnZpZXcudXBkYXRlWm9vbShnbG9iYWxMYXlvdXQuem9vbVNjYWxlKTtcclxuICAgIH0gZWxzZSBpZiAoYnV0dG9uLmlkID09PSAncmVmcmVzaCcpIHtcclxuICAgICAgYXdhaXQgdGhpcy52aWV3LnJlZnJlc2hWaWV3cG9ydCgpO1xyXG4gICAgfSBlbHNlIGlmIChidXR0b24uaWQgPT09ICdrZXlTaWduYXR1cmUnKSB7XHJcbiAgICAgIGlmICghdGhpcy5jb250cm9sbGVyKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNyZWF0ZUFuZERpc3BsYXlEaWFsb2coU3VpS2V5U2lnbmF0dXJlRGlhbG9nLCB7XHJcbiAgICAgICAgdmlldzogdGhpcy52aWV3LFxyXG4gICAgICAgIGNvbXBsZXRlTm90aWZpZXI6IHRoaXMuY29udHJvbGxlcixcclxuICAgICAgICBzdGFydFByb21pc2U6IG51bGwsXHJcbiAgICAgICAgZXZlbnRTb3VyY2U6IHRoaXMuZXZlbnRTb3VyY2UsXHJcbiAgICAgICAgdHJhY2tlcjogdGhpcy52aWV3LnRyYWNrZXIsXHJcbiAgICAgICAgY3RvcjogJ1N1aUtleVNpZ25hdHVyZURpYWxvZycsXHJcbiAgICAgICAgaWQ6ICdrZXktc2lnbmF0dXJlLWRpYWxvZycsXHJcbiAgICAgICAgbW9kaWZpZXI6IG51bGxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKGJ1dHRvbi5pZCA9PT0gJ3JpYmJvblRpbWUnKSB7XHJcbiAgICAgIGlmICghdGhpcy5jb250cm9sbGVyKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNyZWF0ZUFuZERpc3BsYXlEaWFsb2coU3VpVGltZVNpZ25hdHVyZURpYWxvZywge1xyXG4gICAgICAgIGNvbXBsZXRlTm90aWZpZXI6IHRoaXMuY29udHJvbGxlcixcclxuICAgICAgICB2aWV3OiB0aGlzLnZpZXcsXHJcbiAgICAgICAgZXZlbnRTb3VyY2U6IHRoaXMuZXZlbnRTb3VyY2UsXHJcbiAgICAgICAgaWQ6ICdzdGFmZkdyb3VwcycsXHJcbiAgICAgICAgY3RvcjogJ1N1aVN0YWZmR3JvdXBEaWFsb2cnLFxyXG4gICAgICAgIHRyYWNrZXI6IHRoaXMudmlldy50cmFja2VyLFxyXG4gICAgICAgIG1vZGlmaWVyOiBudWxsLFxyXG4gICAgICAgIHN0YXJ0UHJvbWlzZTogbnVsbFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAoYnV0dG9uLmlkID09PSAncmliYm9uVGVtcG8nKSB7XHJcbiAgICAgIGlmICghdGhpcy5jb250cm9sbGVyKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRlbXBvID0gdGhpcy52aWV3LnRyYWNrZXIuc2VsZWN0aW9uc1swXS5tZWFzdXJlLmdldFRlbXBvKCk7XHJcbiAgICAgIGNyZWF0ZUFuZERpc3BsYXlEaWFsb2coU3VpVGVtcG9EaWFsb2csXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWQ6ICd0ZW1wb0RpYWxvZycsXHJcbiAgICAgICAgICBjdG9yOiAnU3VpVGVtcG9EaWFsb2cnLFxyXG4gICAgICAgICAgY29tcGxldGVOb3RpZmllcjogdGhpcy5jb250cm9sbGVyLFxyXG4gICAgICAgICAgdmlldzogdGhpcy52aWV3LFxyXG4gICAgICAgICAgZXZlbnRTb3VyY2U6IHRoaXMuZXZlbnRTb3VyY2UsXHJcbiAgICAgICAgICB0cmFja2VyOiB0aGlzLnZpZXcudHJhY2tlcixcclxuICAgICAgICAgIHN0YXJ0UHJvbWlzZTogbnVsbCxcclxuICAgICAgICAgIG1vZGlmaWVyOiB0ZW1wb1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0gZWxzZSBpZiAoYnV0dG9uLmlkID09PSAncGxheUJ1dHRvbjInKSB7XHJcbiAgICAgIHRoaXMudmlldy5wbGF5RnJvbVNlbGVjdGlvbigpO1xyXG4gICAgfSBlbHNlIGlmIChidXR0b24uaWQgPT09ICdzdG9wQnV0dG9uMicpIHtcclxuICAgICAgdGhpcy52aWV3LnN0b3BQbGF5ZXIoKTtcclxuICAgIH0gZWxzZSBpZiAoYnV0dG9uLmlkID09PSAnc2VsZWN0UGFydCcpIHtcclxuICAgICAgaWYgKCF0aGlzLmNvbnRyb2xsZXIpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgYXdhaXQgdGhpcy52aWV3LnJlbmRlclByb21pc2UoKTtcclxuICAgICAgdGhpcy5tZW51cy5jcmVhdGVNZW51KCdTdWlQYXJ0U2VsZWN0aW9uTWVudScsIHRoaXMuY29udHJvbGxlcik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGFzeW5jIGV4ZWN1dGVCdXR0b25Nb2RhbChidXR0b25FbGVtZW50OiBzdHJpbmcsIGJ1dHRvbkRhdGE6IEJ1dHRvbkRlZmluaXRpb24pIHtcclxuICAgIGlmIChpc01vZGFsQnV0dG9uVHlwZShidXR0b25EYXRhLmN0b3IpKSB7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHtcclxuICAgICAgICBldmVudFNvdXJjZTogdGhpcy5ldmVudFNvdXJjZSxcclxuICAgICAgICBjb21wbGV0ZU5vdGlmaWVyOiB0aGlzLmNvbnRyb2xsZXIsXHJcbiAgICAgICAgdmlldzogdGhpcy52aWV3LFxyXG4gICAgICAgIGN0b3I6IGJ1dHRvbkRhdGEuY3RvcixcclxuICAgICAgICBpZDogYnV0dG9uRGF0YS5pZCxcclxuICAgICAgICBzdGFydFByb21pc2U6IG51bGwsXHJcbiAgICAgICAgdHJhY2tlcjogdGhpcy52aWV3LnRyYWNrZXJcclxuICAgICAgfTtcclxuICAgICAgaWYgKGJ1dHRvbkRhdGEuY3RvciA9PT0gJ1N1aUxpYnJhcnlEaWFsb2cnKSB7XHJcbiAgICAgICAgYXdhaXQgU3VpTGlicmFyeURpYWxvZy5jcmVhdGVBbmREaXNwbGF5KHBhcmFtcywgdGhpcy5jb25maWcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNyZWF0ZUFuZERpc3BsYXlEaWFsb2coU3VpVGVtcG9EaWFsb2csIHBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoYnV0dG9uRGF0YS5jdG9yID09PSAnaGVscE1vZGFsJykge1xyXG4gICAgICBTdWlIZWxwLmRpc3BsYXlIZWxwKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGV4ZWN1dGVCdXR0b25NZW51KGJ1dHRvbkVsZW1lbnQ6IHN0cmluZywgYnV0dG9uRGF0YTogQnV0dG9uRGVmaW5pdGlvbikge1xyXG4gICAgdGhpcy5tZW51cy5jcmVhdGVNZW51KGJ1dHRvbkRhdGEuY3RvciwgdGhpcy5jb250cm9sbGVyKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGV4ZWN1dGVCdXR0b24oYnV0dG9uRWxlbWVudDogc3RyaW5nLCBidXR0b25EYXRhOiBCdXR0b25EZWZpbml0aW9uKSB7XHJcbiAgICBpZiAoYnV0dG9uRGF0YS5hY3Rpb24gPT09ICdtb2RhbCcpIHtcclxuICAgICAgYXdhaXQgdGhpcy5leGVjdXRlQnV0dG9uTW9kYWwoYnV0dG9uRWxlbWVudCwgYnV0dG9uRGF0YSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChidXR0b25EYXRhLmFjdGlvbiA9PT0gJ21lbnUnIHx8IGJ1dHRvbkRhdGEuYWN0aW9uID09PSAnY29sbGFwc2VDaGlsZE1lbnUnKSB7XHJcbiAgICAgIHRoaXMuZXhlY3V0ZUJ1dHRvbk1lbnUoYnV0dG9uRWxlbWVudCwgYnV0dG9uRGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBiaW5kQnV0dG9uKGJ1dHRvbkVsZW1lbnQ6IHN0cmluZywgYnV0dG9uRGF0YTogQnV0dG9uRGVmaW5pdGlvbikge1xyXG4gICAgY29uc3QgY2IgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUJ1dHRvbihidXR0b25FbGVtZW50LCBidXR0b25EYXRhKTtcclxuICAgIH07XHJcbiAgICB0aGlzLmV2ZW50U291cmNlLmRvbUNsaWNrKGJ1dHRvbkVsZW1lbnQsIGNiKTtcclxuICB9XHJcbiAgY3JlYXRlQ29sbGFwc2libGVCdXR0b25Hcm91cHMoc2VsZWN0b3I6IHN0cmluZyB8IEhUTUxFbGVtZW50KSB7XHJcbiAgICBsZXQgY29udGFpbmVyQ2xhc3M6IHN0cmluZyA9ICcnO1xyXG4gICAgLy8gTm93IGFsbCB0aGUgYnV0dG9uIGVsZW1lbnRzIGhhdmUgYmVlbiBib3VuZC4gIEpvaW4gY2hpbGQgYW5kIHBhcmVudCBidXR0b25zXHJcbiAgICAvLyBGb3IgYWxsIHRoZSBjaGlsZHJlbiBvZiBhIGJ1dHRvbiBncm91cCwgYWRkIGl0IHRvIHRoZSBwYXJlbnQgZ3JvdXBcclxuICAgIHRoaXMuY29sbGFwc2VDaGlsZHJlbi5mb3JFYWNoKChiKSA9PiB7XHJcbiAgICAgIGNvbnRhaW5lckNsYXNzID0gJ3JpYmJvbkJ1dHRvbkNvbnRhaW5lcic7XHJcbiAgICAgIGlmIChiLmFjdGlvbiA9PT0gJ2NvbGxhcHNlR3JhbmRjaGlsZCcpIHtcclxuICAgICAgICBjb250YWluZXJDbGFzcyA9ICdyaWJib25CdXR0b25Db250YWluZXJNb3JlJztcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBidXR0b25IdG1sID0gUmliYm9uQnV0dG9ucy5yaWJib25CdXR0b25IdG1sKFxyXG4gICAgICAgIGNvbnRhaW5lckNsYXNzLCBiLmlkLCBiLmNsYXNzZXMsIGIubGVmdFRleHQsIGIuaWNvbiwgYi5yaWdodFRleHQpO1xyXG4gICAgICBpZiAoYi5kYXRhRWxlbWVudHMpIHtcclxuICAgICAgICBjb25zdCBia2V5cyA9IE9iamVjdC5rZXlzKGIuZGF0YUVsZW1lbnRzKTtcclxuICAgICAgICBia2V5cy5mb3JFYWNoKChia2V5KSA9PiB7XHJcbiAgICAgICAgICB2YXIgZGUgPSBiLmRhdGFFbGVtZW50c1tia2V5XTtcclxuICAgICAgICAgICQoYnV0dG9uSHRtbCkuZmluZCgnYnV0dG9uJykuYXR0cignZGF0YS0nICsgYmtleSwgZGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIEJpbmQgdGhlIGNoaWxkIGJ1dHRvbiBhY3Rpb25zXHJcbiAgICAgIGNvbnN0IHBhcmVudCA9ICQoc2VsZWN0b3IpLmZpbmQoJy5jb2xsYXBzZUNvbnRhaW5lcltkYXRhLWdyb3VwPVwiJyArIGIuZ3JvdXAgKyAnXCJdJyk7XHJcbiAgICAgICQocGFyZW50KS5hcHBlbmQoYnV0dG9uSHRtbCk7XHJcbiAgICAgIGNvbnN0IGVsID0gJChzZWxlY3RvcikuZmluZCgnIycgKyBiLmlkKTtcclxuICAgICAgdGhpcy5iaW5kQnV0dG9uKGVsLCBiKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY29sbGFwc2FibGVzLmZvckVhY2goKGNiKSA9PiB7XHJcbiAgICAgIC8vIEJpbmQgdGhlIGV2ZW50cyBvZiB0aGUgcGFyZW50IGJ1dHRvblxyXG4gICAgICBjYi5iaW5kKCk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgX2NyZWF0ZVNpZGViYXJCdXR0b25Hcm91cHMoc2VsZWN0b3I6IHN0cmluZyB8IEhUTUxFbGVtZW50KSB7XHJcbiAgICBsZXQgY29udGFpbmVyQ2xhc3M6IHN0cmluZyA9ICcnO1xyXG4gICAgLy8gTm93IGFsbCB0aGUgYnV0dG9uIGVsZW1lbnRzIGhhdmUgYmVlbiBib3VuZC4gIEpvaW4gY2hpbGQgYW5kIHBhcmVudCBidXR0b25zXHJcbiAgICAvLyBGb3IgYWxsIHRoZSBjaGlsZHJlbiBvZiBhIGJ1dHRvbiBncm91cCwgYWRkIGl0IHRvIHRoZSBwYXJlbnQgZ3JvdXBcclxuICAgIHRoaXMuY29sbGFwc2VDaGlsZHJlbi5mb3JFYWNoKChiKSA9PiB7XHJcbiAgICAgIGNvbnRhaW5lckNsYXNzID0gJ3JpYmJvbkJ1dHRvbkNvbnRhaW5lcic7XHJcbiAgICAgIGlmIChiLmFjdGlvbiA9PT0gJ2NvbGxhcHNlR3JhbmRjaGlsZCcpIHtcclxuICAgICAgICBjb250YWluZXJDbGFzcyA9ICdyaWJib25CdXR0b25Db250YWluZXJNb3JlJztcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBidXR0b25IdG1sID0gUmliYm9uQnV0dG9ucy5yaWJib25CdXR0b25IdG1sKFxyXG4gICAgICAgIGNvbnRhaW5lckNsYXNzLCBiLmlkLCBiLmNsYXNzZXMsIGIubGVmdFRleHQsIGIuaWNvbiwgYi5yaWdodFRleHQpO1xyXG4gICAgICBpZiAoYi5kYXRhRWxlbWVudHMpIHtcclxuICAgICAgICBjb25zdCBia2V5cyA9IE9iamVjdC5rZXlzKGIuZGF0YUVsZW1lbnRzKTtcclxuICAgICAgICBia2V5cy5mb3JFYWNoKChia2V5KSA9PiB7XHJcbiAgICAgICAgICB2YXIgZGUgPSBiLmRhdGFFbGVtZW50c1tia2V5XTtcclxuICAgICAgICAgICQoYnV0dG9uSHRtbCkuZmluZCgnYnV0dG9uJykuYXR0cignZGF0YS0nICsgYmtleSwgZGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIEJpbmQgdGhlIGNoaWxkIGJ1dHRvbiBhY3Rpb25zXHJcbiAgICAgIGNvbnN0IHBhcmVudCA9ICQoc2VsZWN0b3IpLmZpbmQoJy5jb2xsYXBzZUNvbnRhaW5lcltkYXRhLWdyb3VwPVwiJyArIGIuZ3JvdXAgKyAnXCJdJyk7XHJcbiAgICAgICQocGFyZW50KS5hcHBlbmQoYnV0dG9uSHRtbCk7XHJcbiAgICAgIGNvbnN0IGVsID0gJChzZWxlY3RvcikuZmluZCgnIycgKyBiLmlkKTtcclxuICAgICAgdGhpcy5iaW5kQnV0dG9uKGVsLCBiKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY29sbGFwc2FibGVzLmZvckVhY2goKGNiKSA9PiB7XHJcbiAgICAgIC8vIEJpbmQgdGhlIGV2ZW50cyBvZiB0aGUgcGFyZW50IGJ1dHRvblxyXG4gICAgICBjYi5iaW5kKCk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RhdGljIGlzQ29sbGFwc2libGUoYWN0aW9uOiBCdXR0b25BY3Rpb24pIHtcclxuICAgIHJldHVybiBbJ2NvbGxhcHNlQ2hpbGQnLCAnY29sbGFwc2VDaGlsZE1lbnUnLCAnY29sbGFwc2VHcmFuZGNoaWxkJywgJ2NvbGxhcHNlTW9yZSddLmluZGV4T2YoYWN0aW9uKSA+PSAwO1xyXG4gIH1cclxuXHJcbiAgLy8gIyMjIF9jcmVhdGVCdXR0b25IdG1sXHJcbiAgLy8gRm9yIGVhY2ggYnV0dG9uLCBjcmVhdGUgdGhlIGh0bWwgYW5kIGJpbmQgdGhlIGV2ZW50cyBiYXNlZCBvblxyXG4gIC8vIHRoZSBidXR0b24ncyBjb25maWd1cmVkIGFjdGlvbi5cclxuICBjcmVhdGVSaWJib25IdG1sKGJ1dHRvbkFyOiBzdHJpbmdbXSwgc2VsZWN0b3I6IHN0cmluZyB8IEhUTUxFbGVtZW50KSB7XHJcbiAgICBsZXQgYnV0dG9uQ2xhc3MgPSAnJztcclxuICAgIGNvbnN0IGRhdGFBcnJheTogQnV0dG9uRGVmaW5pdGlvbltdID0gW107XHJcbiAgICBjb25zdCBidXR0b25DYWxsYmFjayA9IGFzeW5jIChidXR0b246IEJ1dHRvbkRlZmluaXRpb24pID0+IHtcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZVF1aWNrQnV0dG9uKGJ1dHRvbik7XHJcbiAgICB9O1xyXG4gICAgYnV0dG9uQXIuZm9yRWFjaCgoYnV0dG9uSWQpID0+IHtcclxuICAgICAgY29uc3QgYnV0dG9uRGF0YSA9IHRoaXMucmliYm9uQnV0dG9ucy5maW5kKChlKSA9PlxyXG4gICAgICAgIGUuaWQgPT09IGJ1dHRvbklkXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChidXR0b25EYXRhKSB7XHJcbiAgICAgICAgYnV0dG9uRGF0YS5jYWxsYmFjayA9IGJ1dHRvbkNhbGxiYWNrO1xyXG4gICAgICAgIGJ1dHRvbkRhdGEuY2xhc3NlcyArPSAnIGJ0bic7XHJcbiAgICAgICAgZGF0YUFycmF5LnB1c2goYnV0dG9uRGF0YSk7ICAgICAgICBcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCByb290ID0gcmVwbGFjZVZ1ZVJvb3Qoc2VsZWN0b3IpO1xyXG4gICAgY3JlYXRlQXBwKHJpYmJvbkFwcCBhcyBhbnksIHsgYnV0dG9uUHJvcHM6IGRhdGFBcnJheSwgZG9tSWQ6IHJvb3QgfSkubW91bnQoJyMnICsgcm9vdCk7XHJcbiAgfVxyXG4gIC8vICMjIyBfY3JlYXRlQnV0dG9uSHRtbFxyXG4gIC8vIEZvciBlYWNoIGJ1dHRvbiwgY3JlYXRlIHRoZSBodG1sIGFuZCBiaW5kIHRoZSBldmVudHMgYmFzZWQgb25cclxuICAvLyB0aGUgYnV0dG9uJ3MgY29uZmlndXJlZCBhY3Rpb24uXHJcbiAgY3JlYXRlU2lkZWJhck1lbnVIdG1sKGJ1dHRvbkFyOiBzdHJpbmdbXSwgc2VsZWN0b3I6IHN0cmluZyB8IEhUTUxFbGVtZW50KSB7XHJcbiAgICBsZXQgYnV0dG9uQ2xhc3MgPSAnJztcclxuICAgIGNvbnN0IGJ1dHRvbkxpc3Q6IEJ1dHRvbkRlZmluaXRpb25bXSA9IFtdO1xyXG4gICAgY29uc3QgZXhlY3V0ZUJ1dHRvbiA9IGFzeW5jIChidXR0b25EYXRhOiBCdXR0b25EZWZpbml0aW9uKSA9PiB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUJ1dHRvbihidXR0b25EYXRhLmlkLCBidXR0b25EYXRhKTtcclxuICAgIH07ICAgIFxyXG4gICAgYnV0dG9uQXIuZm9yRWFjaCgoYnV0dG9uSWQpID0+IHtcclxuICAgICAgY29uc3QgYnV0dG9uRGF0YSA9IHRoaXMucmliYm9uQnV0dG9ucy5maW5kKChlKSA9PlxyXG4gICAgICAgIGUuaWQgPT09IGJ1dHRvbklkXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChidXR0b25EYXRhKSB7XHJcbiAgICAgICAgYnV0dG9uRGF0YS5jYWxsYmFjayA9IGV4ZWN1dGVCdXR0b247XHJcbiAgICAgICAgYnV0dG9uRGF0YS5pY29uICs9ICcgbWVudS1pY29uJztcclxuICAgICAgICBidXR0b25MaXN0LnB1c2goYnV0dG9uRGF0YSk7XHJcbiAgICAgICAgLyogaWYgKGJ1dHRvbkRhdGEubGVmdFRleHQpIHtcclxuICAgICAgICAgIFJpYmJvbkJ1dHRvbnMudHJhbnNsYXRlQnV0dG9ucy5wdXNoKHsgYnV0dG9uSWQ6IGJ1dHRvbkRhdGEuaWQsIGJ1dHRvblRleHQ6IGJ1dHRvbkRhdGEubGVmdFRleHQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbGxhcHNlIGNoaWxkIGlzIGhpZGRlbiB1bnRpbCB0aGUgcGFyZW50IGJ1dHRvbiBpcyBzZWxlY3RlZCwgZXhwb3NpbmcgdGhlIGJ1dHRvbiBncm91cFxyXG4gICAgICAgIGlmIChSaWJib25CdXR0b25zLmlzQ29sbGFwc2libGUoYnV0dG9uRGF0YS5hY3Rpb24pKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbGxhcHNlQ2hpbGRyZW4ucHVzaChidXR0b25EYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJ1dHRvbkRhdGEuYWN0aW9uICE9PSAnY29sbGFwc2VDaGlsZCcpIHtcclxuICAgICAgICAgIC8vIGVsc2UgdGhlIGJ1dHRvbiBoYXMgYSBzcGVjaWZpYyBhY3Rpb24sIHN1Y2ggYXMgYSBtZW51IG9yIGRpYWxvZywgb3IgYSBwYXJlbnQgYnV0dG9uXHJcbiAgICAgICAgICAvLyBmb3IgdHJhbnNsYXRpb24sIGFkZCB0aGUgbWVudSBuYW1lIHRvIHRoZSBidXR0b24gY2xhc3NcclxuICAgICAgICAgIGJ1dHRvbkNsYXNzID0gYnV0dG9uRGF0YS5jbGFzc2VzO1xyXG4gICAgICAgICAgaWYgKGJ1dHRvbkRhdGEuYWN0aW9uID09PSAnbWVudScgfHwgYnV0dG9uRGF0YS5hY3Rpb24gPT09ICdtb2RhbCcpIHtcclxuICAgICAgICAgICAgYnV0dG9uQ2xhc3MgKz0gJyAnICsgYnV0dG9uRGF0YS5jdG9yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgYnV0dG9uSHRtbCA9IFJpYmJvbkJ1dHRvbnMubWVudUJ1dHRvbkh0bWwoXHJcbiAgICAgICAgICAgIGJ1dHRvbkRhdGEuaWQsIGJ1dHRvbkNsYXNzLCBidXR0b25EYXRhLmxlZnRUZXh0LCBidXR0b25EYXRhLmljb24sIGJ1dHRvbkRhdGEucmlnaHRUZXh0KTtcclxuICAgICAgICAgICQoYnV0dG9uSHRtbCkuYXR0cignZGF0YS1ncm91cCcsIGJ1dHRvbkRhdGEuZ3JvdXApO1xyXG4gICAgICAgICAgJChzZWxlY3RvcikuYXBwZW5kKGJ1dHRvbkh0bWwpO1xyXG4gICAgICAgICAgY29uc3QgYnV0dG9uRWxlbWVudCA9ICQoJyMnICsgYnV0dG9uRGF0YS5pZCk7XHJcbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgY29sbGFic2FibGUgYnV0dG9uLCBjcmVhdGUgaXQsIG90aGVyd2lzZSBiaW5kIGl0cyBleGVjdXRlIGZ1bmN0aW9uLlxyXG4gICAgICAgICAgaWYgKGJ1dHRvbkRhdGEuYWN0aW9uID09PSAnY29sbGFwc2VQYXJlbnQnKSB7XHJcbiAgICAgICAgICAgICQoYnV0dG9uSHRtbCkuYWRkQ2xhc3MoJ2NvbGxhcHNlQ29udGFpbmVyJyk7XHJcbiAgICAgICAgICAgIC8vIGNvbGxhcHNlUGFyZW50XHJcbiAgICAgICAgICAgIHRoaXMuY29sbGFwc2FibGVzLnB1c2gobmV3IENvbGxhcHNlUmliYm9uQ29udHJvbCh7XHJcbiAgICAgICAgICAgICAgY3RvcjogYnV0dG9uRGF0YS5jdG9yLFxyXG4gICAgICAgICAgICAgIGJ1dHRvbnM6IHRoaXMucmliYm9uQnV0dG9ucyxcclxuICAgICAgICAgICAgICB2aWV3OiB0aGlzLnZpZXcsXHJcbiAgICAgICAgICAgICAgbWVudXM6IHRoaXMubWVudXMsXHJcbiAgICAgICAgICAgICAgZXZlbnRTb3VyY2U6IHRoaXMuZXZlbnRTb3VyY2UsXHJcbiAgICAgICAgICAgICAgY29tcGxldGVOb3RpZmllcjogdGhpcy5jb250cm9sbGVyLFxyXG4gICAgICAgICAgICAgIGJ1dHRvbklkOiBidXR0b25EYXRhLmlkLFxyXG4gICAgICAgICAgICAgIGJ1dHRvbkVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgYnV0dG9uRGF0YVxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjYiA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVCdXR0b24oYnV0dG9uRWxlbWVudCwgYnV0dG9uRGF0YSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTb3VyY2UuZG9tQ2xpY2soYnV0dG9uRWxlbWVudCwgY2IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0qL1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGNyZWF0ZUFwcChyaWJib25TaWRlYmFyQXBwIGFzIGFueSwgeyBidXR0b25Qcm9wczogYnV0dG9uTGlzdCwgZG9tSWQ6IHNlbGVjdG9yIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBzZWxlY3Rvci5pZCA6IHNlbGVjdG9yIH0pLm1vdW50KHNlbGVjdG9yKTtcclxuICB9XHJcbiAgY3JlYXRlUmliYm9uKGJ1dHRvbkRhdGFBcnJheTogc3RyaW5nW10sIHBhcmVudEVsZW1lbnQ6IHN0cmluZyB8IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLmNyZWF0ZVJpYmJvbkh0bWwoYnV0dG9uRGF0YUFycmF5LCBwYXJlbnRFbGVtZW50KTtcclxuICAgIHRoaXMuY3JlYXRlQ29sbGFwc2libGVCdXR0b25Hcm91cHMocGFyZW50RWxlbWVudCk7XHJcbiAgfVxyXG4gIGNyZWF0ZVNpZGViYXJSaWJib24oYnV0dG9uRGF0YUFycmF5OiBzdHJpbmdbXSwgcGFyZW50RWxlbWVudDogc3RyaW5nIHwgSFRNTEVsZW1lbnQsIGNvbnRhaW5lckNsYXNzZXM6IHN0cmluZykge1xyXG4gICAgdGhpcy5jcmVhdGVTaWRlYmFyTWVudUh0bWwoYnV0dG9uRGF0YUFycmF5LCBwYXJlbnRFbGVtZW50KTtcclxuICAgIC8vIHRoaXMuX2NyZWF0ZUNvbGxhcHNpYmxlQnV0dG9uR3JvdXBzKHBhcmVudEVsZW1lbnQpOyBuZWVkZWQ/XHJcbiAgfVxyXG4gIGFzeW5jIGhhbmRsZUtleURvd24oZXY6IEtleUV2ZW50KSB7XHJcbiAgICBpZiAoZXYuYWx0S2V5KSB7XHJcbiAgICAgIGNvbnN0IGtleUJ1dHRvbiA9IHRoaXMucmliYm9uQnV0dG9ucy5maW5kKChiYikgPT4gYmIuaG90S2V5ICYmIGJiLmhvdEtleSA9PT0gZXYua2V5KTtcclxuICAgICAgaWYgKGtleUJ1dHRvbikge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSAnIycgKyBrZXlCdXR0b24uaWQ7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlQnV0dG9uKGVsZW1lbnQsIGtleUJ1dHRvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgZGlzcGxheSgpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5sZWZ0Q29udHJvbHMpIHtcclxuICAgICAgY29uc3QgbGVmdENvbnRyb2wgPSBnZXREb21Db250YWluZXIodGhpcy5jb25maWcubGVmdENvbnRyb2xzKTtcclxuICAgICAgaWYgKGxlZnRDb250cm9sKSB7XHJcbiAgICAgICAgJChsZWZ0Q29udHJvbCkuaHRtbCgnJyk7XHJcbiAgICAgICAgY29uc3QgbGJ1dHRvbnMgPSB0aGlzLnJpYmJvbnMubGVmdDtcclxuICAgICAgICB0aGlzLmNyZWF0ZVNpZGViYXJSaWJib24obGJ1dHRvbnMsIGxlZnRDb250cm9sLCAnbmF2LWl0ZW0nKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29uZmlnLnRvcENvbnRyb2xzKSB7XHJcbiAgICAgIGNvbnN0IHRvcENvbnRyb2wgPSBnZXREb21Db250YWluZXIodGhpcy5jb25maWcudG9wQ29udHJvbHMpO1xyXG4gICAgICBpZiAodG9wQ29udHJvbCkge1xyXG4gICAgICAgIGNvbnN0IHRidXR0b25zID0gdGhpcy5yaWJib25zLnRvcDtcclxuICAgICAgICB0aGlzLmNyZWF0ZVJpYmJvbih0YnV0dG9ucywgdG9wQ29udHJvbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGtkID0gYXN5bmMgKGV2OiBhbnkpID0+IHsgdGhpcy5oYW5kbGVLZXlEb3duKGV2KTsgfVxyXG4gICAgdGhpcy5ldmVudFNvdXJjZS5iaW5kS2V5ZG93bkhhbmRsZXIoa2QpO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/buttons/ribbon.ts\n\n}");
1911
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ RibbonButtons: () => (/* binding */ RibbonButtons),\n/* harmony export */ SuiModalButtonStrings: () => (/* binding */ SuiModalButtonStrings),\n/* harmony export */ isModalButtonType: () => (/* binding */ isModalButtonType)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common */ \"./src/ui/common.ts\");\n/* harmony import */ var _dialogs_library__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dialogs/library */ \"./src/ui/dialogs/library.ts\");\n/* harmony import */ var _dialogs_tempo__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../dialogs/tempo */ \"./src/ui/dialogs/tempo.ts\");\n/* harmony import */ var _dialogs_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../dialogs/dialog */ \"./src/ui/dialogs/dialog.ts\");\n/* harmony import */ var _help__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../help */ \"./src/ui/help.ts\");\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _dialogs_keySignature__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../dialogs/keySignature */ \"./src/ui/dialogs/keySignature.ts\");\n/* harmony import */ var _components_buttons_ribbon_vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../components/buttons/ribbon.vue */ \"./src/ui/components/buttons/ribbon.vue\");\n/* harmony import */ var _components_buttons_sidebar_vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../components/buttons/sidebar.vue */ \"./src/ui/components/buttons/sidebar.vue\");\n/* harmony import */ var _dialogs_timeSignature__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../dialogs/timeSignature */ \"./src/ui/dialogs/timeSignature.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\nvar SuiModalButtonStrings = ['SuiLibraryDialog', 'SuiTempoDialog'];\nfunction isModalButtonType(but) {\n return SuiModalButtonStrings.indexOf(but) >= 0;\n}\n/**\n * Render the ribbon buttons based on group, function, and underlying UI handler.\n * Also handles UI events.\n * @category SuiButton\n */\nclass RibbonButtons {\n static get paramArray() {\n return ['ribbonButtons', 'ribbons', 'keyCommands', 'controller', 'menus', 'eventSource', 'view'];\n }\n static ribbonButtonHtml(containerClass, buttonId, buttonClass, buttonText, buttonIcon, buttonKey) {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const r = b('div').classes(containerClass).append(b('button').attr('id', buttonId).classes(buttonClass).append(b('span').classes('left-text').append(b('span').classes('text-span').text(buttonText)).append(b('span').classes('ribbon-button-text icon ' + buttonIcon))).append(b('span').classes('ribbon-button-hotkey').text(buttonKey)));\n return r.dom();\n }\n static menuButtonHtml(buttonId, buttonClass, buttonText, buttonIcon, buttonKey) {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const r = b('li').classes('nav-item')\n .append(b('button').classes(buttonClass).attr('id', buttonId).classes('nav-link').append(b('span').classes('left-text').append(b('span').classes('text-span').text(buttonText))).append(b('span').classes('ribbon-button-text icon ' + buttonIcon)).append(b('span').classes('ribbon-button-hotkey').text(buttonKey)));\n return r.dom();\n }\n constructor(params) {\n this.collapsables = [];\n this.collapseChildren = [];\n this.controller = params.completeNotifier;\n this.config = params.config;\n this.eventSource = params.eventSource;\n this.view = params.view;\n this.menus = params.menus;\n this.ribbonButtons = params.ribbonButtons;\n this.ribbons = params.ribbons;\n this.collapsables = [];\n this.collapseChildren = [];\n }\n executeQuickButton(button) {\n return __awaiter(this, void 0, void 0, function* () {\n if (button.id === 'zoomin') {\n const globalLayout = this.view.score.layoutManager.getGlobalLayout();\n globalLayout.zoomScale /= 1.1;\n yield this.view.updateZoom(globalLayout.zoomScale);\n }\n else if (button.id === 'zoomout') {\n const globalLayout = this.view.score.layoutManager.getGlobalLayout();\n globalLayout.zoomScale *= 1.1;\n this.view.updateZoom(globalLayout.zoomScale);\n }\n else if (button.id === 'refresh') {\n yield this.view.refreshViewport();\n }\n else if (button.id === 'keySignature') {\n if (!this.controller) {\n return;\n }\n (0,_dialogs_dialog__WEBPACK_IMPORTED_MODULE_4__.createAndDisplayDialog)(_dialogs_keySignature__WEBPACK_IMPORTED_MODULE_7__.SuiKeySignatureDialog, {\n view: this.view,\n completeNotifier: this.controller,\n startPromise: null,\n eventSource: this.eventSource,\n tracker: this.view.tracker,\n ctor: 'SuiKeySignatureDialog',\n id: 'key-signature-dialog',\n modifier: null\n });\n }\n else if (button.id === 'ribbonTime') {\n if (!this.controller) {\n return;\n }\n (0,_dialogs_dialog__WEBPACK_IMPORTED_MODULE_4__.createAndDisplayDialog)(_dialogs_timeSignature__WEBPACK_IMPORTED_MODULE_10__.SuiTimeSignatureDialog, {\n completeNotifier: this.controller,\n view: this.view,\n eventSource: this.eventSource,\n id: 'staffGroups',\n ctor: 'SuiStaffGroupDialog',\n tracker: this.view.tracker,\n modifier: null,\n startPromise: null\n });\n }\n else if (button.id === 'ribbonTempo') {\n if (!this.controller) {\n return;\n }\n const tempo = this.view.tracker.selections[0].measure.getTempo();\n (0,_dialogs_dialog__WEBPACK_IMPORTED_MODULE_4__.createAndDisplayDialog)(_dialogs_tempo__WEBPACK_IMPORTED_MODULE_3__.SuiTempoDialog, {\n id: 'tempoDialog',\n ctor: 'SuiTempoDialog',\n completeNotifier: this.controller,\n view: this.view,\n eventSource: this.eventSource,\n tracker: this.view.tracker,\n startPromise: null,\n modifier: tempo\n });\n }\n else if (button.id === 'playButton2') {\n this.view.playFromSelection();\n }\n else if (button.id === 'stopButton2') {\n this.view.stopPlayer();\n }\n else if (button.id === 'selectPart') {\n if (!this.controller) {\n return;\n }\n yield this.view.renderPromise();\n this.menus.createMenu('SuiPartSelectionMenu', this.controller);\n }\n });\n }\n executeButtonModal(buttonElement, buttonData) {\n return __awaiter(this, void 0, void 0, function* () {\n if (isModalButtonType(buttonData.ctor)) {\n const params = {\n eventSource: this.eventSource,\n completeNotifier: this.controller,\n view: this.view,\n ctor: buttonData.ctor,\n id: buttonData.id,\n startPromise: null,\n tracker: this.view.tracker\n };\n if (buttonData.ctor === 'SuiLibraryDialog') {\n yield _dialogs_library__WEBPACK_IMPORTED_MODULE_2__.SuiLibraryDialog.createAndDisplay(params, this.config);\n }\n else {\n (0,_dialogs_dialog__WEBPACK_IMPORTED_MODULE_4__.createAndDisplayDialog)(_dialogs_tempo__WEBPACK_IMPORTED_MODULE_3__.SuiTempoDialog, params);\n }\n }\n else if (buttonData.ctor === 'helpModal') {\n _help__WEBPACK_IMPORTED_MODULE_5__.SuiHelp.displayHelp();\n }\n });\n }\n executeButtonMenu(buttonElement, buttonData) {\n this.menus.createMenu(buttonData.ctor, this.controller);\n }\n executeButton(buttonElement, buttonData) {\n return __awaiter(this, void 0, void 0, function* () {\n if (buttonData.action === 'modal') {\n yield this.executeButtonModal(buttonElement, buttonData);\n return;\n }\n if (buttonData.action === 'menu' || buttonData.action === 'collapseChildMenu') {\n this.executeButtonMenu(buttonElement, buttonData);\n }\n });\n }\n bindButton(buttonElement, buttonData) {\n const cb = () => __awaiter(this, void 0, void 0, function* () {\n yield this.executeButton(buttonElement, buttonData);\n });\n this.eventSource.domClick(buttonElement, cb);\n }\n createCollapsibleButtonGroups(selector) {\n let containerClass = '';\n // Now all the button elements have been bound. Join child and parent buttons\n // For all the children of a button group, add it to the parent group\n this.collapseChildren.forEach((b) => {\n containerClass = 'ribbonButtonContainer';\n if (b.action === 'collapseGrandchild') {\n containerClass = 'ribbonButtonContainerMore';\n }\n const buttonHtml = RibbonButtons.ribbonButtonHtml(containerClass, b.id, b.classes, b.leftText, b.icon, b.rightText);\n if (b.dataElements) {\n const bkeys = Object.keys(b.dataElements);\n bkeys.forEach((bkey) => {\n var de = b.dataElements[bkey];\n $(buttonHtml).find('button').attr('data-' + bkey, de);\n });\n }\n // Bind the child button actions\n const parent = $(selector).find('.collapseContainer[data-group=\"' + b.group + '\"]');\n $(parent).append(buttonHtml);\n const el = $(selector).find('#' + b.id);\n this.bindButton(el, b);\n });\n this.collapsables.forEach((cb) => {\n // Bind the events of the parent button\n cb.bind();\n });\n }\n _createSidebarButtonGroups(selector) {\n let containerClass = '';\n // Now all the button elements have been bound. Join child and parent buttons\n // For all the children of a button group, add it to the parent group\n this.collapseChildren.forEach((b) => {\n containerClass = 'ribbonButtonContainer';\n if (b.action === 'collapseGrandchild') {\n containerClass = 'ribbonButtonContainerMore';\n }\n const buttonHtml = RibbonButtons.ribbonButtonHtml(containerClass, b.id, b.classes, b.leftText, b.icon, b.rightText);\n if (b.dataElements) {\n const bkeys = Object.keys(b.dataElements);\n bkeys.forEach((bkey) => {\n var de = b.dataElements[bkey];\n $(buttonHtml).find('button').attr('data-' + bkey, de);\n });\n }\n // Bind the child button actions\n const parent = $(selector).find('.collapseContainer[data-group=\"' + b.group + '\"]');\n $(parent).append(buttonHtml);\n const el = $(selector).find('#' + b.id);\n this.bindButton(el, b);\n });\n this.collapsables.forEach((cb) => {\n // Bind the events of the parent button\n cb.bind();\n });\n }\n static isCollapsible(action) {\n return ['collapseChild', 'collapseChildMenu', 'collapseGrandchild', 'collapseMore'].indexOf(action) >= 0;\n }\n // ### _createButtonHtml\n // For each button, create the html and bind the events based on\n // the button's configured action.\n createRibbonHtml(buttonAr, selector) {\n const dataArray = (0,vue__WEBPACK_IMPORTED_MODULE_6__.reactive)([]);\n const buttonCallback = (button) => __awaiter(this, void 0, void 0, function* () {\n return yield this.executeQuickButton(button);\n });\n buttonAr.forEach((buttonId) => {\n const buttonData = this.ribbonButtons.find((e) => e.id === buttonId);\n if (buttonData) {\n buttonData.callback = buttonCallback;\n buttonData.classes += ' btn';\n dataArray.push(buttonData);\n }\n });\n const partButton = dataArray.find((b) => b.id === 'selectPart');\n if (partButton) {\n (0,vue__WEBPACK_IMPORTED_MODULE_6__.watch)(this.view.PartName, (newVal) => {\n if (newVal.length) {\n partButton.rightText = newVal;\n }\n else {\n partButton.rightText = 'Select Part';\n }\n });\n }\n const root = (0,_common__WEBPACK_IMPORTED_MODULE_1__.replaceVueRoot)(selector);\n (0,vue__WEBPACK_IMPORTED_MODULE_6__.createApp)(_components_buttons_ribbon_vue__WEBPACK_IMPORTED_MODULE_8__[\"default\"], { buttonProps: dataArray, domId: root }).mount('#' + root);\n }\n // ### _createButtonHtml\n // For each button, create the html and bind the events based on\n // the button's configured action.\n createSidebarMenuHtml(buttonAr, selector) {\n let buttonClass = '';\n const buttonList = [];\n const executeButton = (buttonData) => __awaiter(this, void 0, void 0, function* () {\n yield this.executeButton(buttonData.id, buttonData);\n });\n buttonAr.forEach((buttonId) => {\n const buttonData = this.ribbonButtons.find((e) => e.id === buttonId);\n if (buttonData) {\n buttonData.callback = executeButton;\n buttonData.icon += ' menu-icon';\n buttonList.push(buttonData);\n /* if (buttonData.leftText) {\n RibbonButtons.translateButtons.push({ buttonId: buttonData.id, buttonText: buttonData.leftText });\n }\n // collapse child is hidden until the parent button is selected, exposing the button group\n if (RibbonButtons.isCollapsible(buttonData.action)) {\n this.collapseChildren.push(buttonData);\n }\n if (buttonData.action !== 'collapseChild') {\n // else the button has a specific action, such as a menu or dialog, or a parent button\n // for translation, add the menu name to the button class\n buttonClass = buttonData.classes;\n if (buttonData.action === 'menu' || buttonData.action === 'modal') {\n buttonClass += ' ' + buttonData.ctor;\n }\n const buttonHtml = RibbonButtons.menuButtonHtml(\n buttonData.id, buttonClass, buttonData.leftText, buttonData.icon, buttonData.rightText);\n $(buttonHtml).attr('data-group', buttonData.group);\n $(selector).append(buttonHtml);\n const buttonElement = $('#' + buttonData.id);\n // If this is a collabsable button, create it, otherwise bind its execute function.\n if (buttonData.action === 'collapseParent') {\n $(buttonHtml).addClass('collapseContainer');\n // collapseParent\n this.collapsables.push(new CollapseRibbonControl({\n ctor: buttonData.ctor,\n buttons: this.ribbonButtons,\n view: this.view,\n menus: this.menus,\n eventSource: this.eventSource,\n completeNotifier: this.controller,\n buttonId: buttonData.id,\n buttonElement,\n buttonData\n }));\n } else {\n const cb = async () => {\n await this.executeButton(buttonElement, buttonData);\n };\n this.eventSource.domClick(buttonElement, cb);\n }\n }*/\n }\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_6__.createApp)(_components_buttons_sidebar_vue__WEBPACK_IMPORTED_MODULE_9__[\"default\"], { buttonProps: buttonList, domId: selector instanceof HTMLElement ? selector.id : selector }).mount(selector);\n }\n createRibbon(buttonDataArray, parentElement) {\n this.createRibbonHtml(buttonDataArray, parentElement);\n this.createCollapsibleButtonGroups(parentElement);\n }\n createSidebarRibbon(buttonDataArray, parentElement, containerClasses) {\n this.createSidebarMenuHtml(buttonDataArray, parentElement);\n // this._createCollapsibleButtonGroups(parentElement); needed?\n }\n handleKeyDown(ev) {\n return __awaiter(this, void 0, void 0, function* () {\n if (ev.altKey) {\n const keyButton = this.ribbonButtons.find((bb) => bb.hotKey && bb.hotKey === ev.key);\n if (keyButton) {\n const element = '#' + keyButton.id;\n yield this.executeButton(element, keyButton);\n }\n }\n });\n }\n display() {\n if (this.config.leftControls) {\n const leftControl = (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.getDomContainer)(this.config.leftControls);\n if (leftControl) {\n $(leftControl).html('');\n const lbuttons = this.ribbons.left;\n this.createSidebarRibbon(lbuttons, leftControl, 'nav-item');\n }\n }\n if (this.config.topControls) {\n const topControl = (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.getDomContainer)(this.config.topControls);\n if (topControl) {\n const tbuttons = this.ribbons.top;\n this.createRibbon(tbuttons, topControl);\n }\n }\n const kd = (ev) => __awaiter(this, void 0, void 0, function* () { this.handleKeyDown(ev); });\n this.eventSource.bindKeydownHandler(kd);\n }\n}\nRibbonButtons.translateButtons = [];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFNLEVBQUUsR0FBRyxDQUFPLEVBQU8sRUFBRSxFQUFFLGdEQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQzs7QUFsVU0sOEJBQWdCLEdBQWtCLEVBQUUsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy91aS9idXR0b25zL3JpYmJvbi50cz9mODZjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG5pbXBvcnQgeyBidWlsZERvbSwgZ2V0RG9tQ29udGFpbmVyIH0gZnJvbSAnLi4vLi4vY29tbW9uL2h0bWxIZWxwZXJzJztcclxuaW1wb3J0IHsgS2V5RXZlbnQgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9jb21tb24nO1xyXG5pbXBvcnQgeyBCdXR0b25EZWZpbml0aW9uLCBCdXR0b25BY3Rpb24gfSBmcm9tICcuL2J1dHRvbic7XHJcbmltcG9ydCB7IEJyb3dzZXJFdmVudFNvdXJjZSB9IGZyb20gJy4uL2V2ZW50U291cmNlJztcclxuaW1wb3J0IHsgU3VpU2NvcmVWaWV3T3BlcmF0aW9ucyB9IGZyb20gJy4uLy4uL3JlbmRlci9zdWkvc2NvcmVWaWV3T3BlcmF0aW9ucyc7XHJcbmltcG9ydCB7IENvbXBsZXRlTm90aWZpZXIsIFJpYmJvbkxheW91dCwgcmVwbGFjZVZ1ZVJvb3QgfSBmcm9tICcuLi9jb21tb24nO1xyXG5pbXBvcnQgeyBTdWlUcmFja2VyIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS90cmFja2VyJztcclxuaW1wb3J0IHsgU3VpTWVudU1hbmFnZXIgfSBmcm9tICcuLi9tZW51cy9tYW5hZ2VyJztcclxuaW1wb3J0IHsgU3VpTGlicmFyeURpYWxvZyB9IGZyb20gJy4uL2RpYWxvZ3MvbGlicmFyeSc7XHJcbmltcG9ydCB7IFN1aVRlbXBvRGlhbG9nIH0gZnJvbSAnLi4vZGlhbG9ncy90ZW1wbyc7XHJcbmltcG9ydCB7IEJ1dHRvbkxhYmVsIH0gZnJvbSAnLi9idXR0b24nO1xyXG5pbXBvcnQgeyBDb2xsYXBzZVJpYmJvbkNvbnRyb2wgfSBmcm9tICcuL2NvbGxhcHNhYmxlJztcclxuaW1wb3J0IHsgY3JlYXRlQW5kRGlzcGxheURpYWxvZyB9IGZyb20gJy4uL2RpYWxvZ3MvZGlhbG9nJztcclxuaW1wb3J0IHsgU3VpSGVscCB9IGZyb20gJy4uL2hlbHAnO1xyXG5pbXBvcnQgeyBTbW9VaUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgY3JlYXRlQXBwLCByZWYsIHJlYWN0aXZlLCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XHJcbmltcG9ydCB7IFN1aUtleVNpZ25hdHVyZURpYWxvZyB9IGZyb20gJy4uL2RpYWxvZ3Mva2V5U2lnbmF0dXJlJztcclxuaW1wb3J0IHsgZGVmYXVsdCBhcyByaWJib25BcHAgfSBmcm9tICcuLi9jb21wb25lbnRzL2J1dHRvbnMvcmliYm9uLnZ1ZSc7XHJcbmltcG9ydCB7IGRlZmF1bHQgYXMgcmliYm9uU2lkZWJhckFwcCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYnV0dG9ucy9zaWRlYmFyLnZ1ZSc7XHJcbmltcG9ydCB7IFN1aVRpbWVTaWduYXR1cmVEaWFsb2cgfSBmcm9tICcuLi9kaWFsb2dzL3RpbWVTaWduYXR1cmUnO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5cclxuZXhwb3J0IHR5cGUgU3VpTW9kYWxCdXR0b25UeXBlcyA9ICdTdWlMaWJyYXJ5RGlhbG9nJyB8ICdTdWlUZW1wb0RpYWxvZyc7XHJcbmV4cG9ydCB2YXIgU3VpTW9kYWxCdXR0b25TdHJpbmdzID0gWydTdWlMaWJyYXJ5RGlhbG9nJywgJ1N1aVRlbXBvRGlhbG9nJ107XHJcbmV4cG9ydCBmdW5jdGlvbiBpc01vZGFsQnV0dG9uVHlwZShidXQ6IHN0cmluZyB8IFN1aU1vZGFsQnV0dG9uVHlwZXMpOiBidXQgaXMgU3VpTW9kYWxCdXR0b25UeXBlcyB7XHJcbiAgcmV0dXJuIFN1aU1vZGFsQnV0dG9uU3RyaW5ncy5pbmRleE9mKGJ1dCkgPj0gMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFBhcmFtZXRlcnMgZm9yIGNyZWF0aW5nIHRoZSBnbG9iYWwgYnV0dG9uIHJpYmJvbiBvYmplY3QuICBUaGUgYnV0dG9uIHJpYmJvbiBzdXBwb3J0cyBhIFxyXG4gKiBidXR0b24gcGFuZWwgaW4gJ3RvcCcgYW5kICdsZWZ0JyBhcmVhcywgd2l0aCBzdXBwb3J0IGZvciBSLXRvLUwgbGFuZ3VhZ2VzLiAgXHJcbiAqIEJ1dHRvbiBncm91cHMgaW4gbGVmdCBhbmQgZGlzcGxheSBtZW51cyBhcmUgbm90IGNvbGxhcHNpYmxlLiAgVGhleSBhcmUganVzdCBhIEJ1dHRvbkRlZmluaXRpb25cclxuICogY2Fwc3VsZSBidXQgYXJlIG5vdCBhY3R1YWxseSBidXR0b25zIC0gZXZlbnQgaGFuZGxpbmcgaXMgZG9uZSBieSB0aGlzICdyaWJib24nIG9iamVjdC5cclxuICogQnV0dG9uIGdyb3VwcyAobW9zdGx5IG9ic29sZXRlKSBhcmUgY29sbGFwc2libGUgYW5kIGFyZSBmaXJzdC1jbGFzcyBidXR0b24gb2JqZWN0cyBhbmRcclxuICogYXJlIGNvbGxhcHNpYmxlLiAgVGhlIGNvbnRlbnQgb2YgcmliYm9uQnV0dG9ucyBkZXRlcm1pbmVzIHdoaWNoIGJ1dHRvbnMgc2hvdyB1cC4gIFxyXG4gKiByaWJib24gbGF5b3V0IGRldGVybWluZXMgd2hpY2ggc2hvdyB1cCB0b3AgdnMuIGxlZnRcclxuICogQHBhcmFtIHtCcm93c2VyRXZlbnRTb3VyY2V9IGV2ZW50U291cmNlIC0gYnV0dG9ucyB3aWxsIHVzZSB0aGlzIHRvIGJpbmQgY2xpY2sgZXZlbnRzXHJcbiAqIEBwYXJhbSB7Q29tcGxldGVOb3RpZmllcn0gY29tcGxldGVOb3RpZmllciAtIGJ1dHRvbnMgdGhhdCBicmluZyB1cCBtZW51cyBhbmQgZGlhbG9ncyB3aWxsIHBhc3MgdGhpcyB0byB0aGUgZGlhbG9nc1xyXG4gKiBAcGFyYW0ge1N1aVRyYWNrZXJ9IHRyYWNrZXIgLSBzb21lIGJ1dHRvbnMgYWN0IG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvblxyXG4gKiBAcGFyYW0ge1N1aU1lbnVNYW5hZ2VyfSBtZW51cyAtIHNvbWUgYnV0dG9ucyBpbnZva2UgYSBtZW51XHJcbiAqIEBwYXJhbSB7QnV0dG9uRGVmaW5pdGlvbltdfSAtIHRoZSBidXR0b25zXHJcbiAqIEBwYXJhbSB7UmliYm9uTGF5b3V0fSByaWJib25zIC0gd2hlcmUgdGhlIGJ1dHRvbnMgYXBwZWFyXHJcbiAqIEBjYXRlZ29yeSBTdWlCdXR0b25cclxuICogQHNlZSB7QnV0dG9uRGVmaW5pdGlvbn0gZm9yIGhvdyB0byBjcmVhdGUvbW9kaWZ5IGJ1dHRvbnNcclxuICogQHNlZSB7ZGVmYXVsdFJpYmJvbkxheW91dH0gZm9yIGJ1dHRvbnMgc3VwcG9ydGVkIGZyb20gdGhlIGRlbW8gYXBwbGljYXRpb25cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3VpUmliYm9uUGFyYW1zIHtcclxuICBjb25maWc6IFNtb1VpQ29uZmlndXJhdGlvblxyXG4gIGV2ZW50U291cmNlOiBCcm93c2VyRXZlbnRTb3VyY2UsXHJcbiAgdmlldzogU3VpU2NvcmVWaWV3T3BlcmF0aW9ucyxcclxuICBjb21wbGV0ZU5vdGlmaWVyOiBDb21wbGV0ZU5vdGlmaWVyLFxyXG4gIHRyYWNrZXI6IFN1aVRyYWNrZXIsXHJcbiAgbWVudXM6IFN1aU1lbnVNYW5hZ2VyLFxyXG4gIHJpYmJvbkJ1dHRvbnM6IEJ1dHRvbkRlZmluaXRpb25bXSxcclxuICByaWJib25zOiBSaWJib25MYXlvdXRcclxufVxyXG4vKipcclxuICogUmVuZGVyIHRoZSByaWJib24gYnV0dG9ucyBiYXNlZCBvbiBncm91cCwgZnVuY3Rpb24sIGFuZCB1bmRlcmx5aW5nIFVJIGhhbmRsZXIuXHJcbiAqIEFsc28gaGFuZGxlcyBVSSBldmVudHMuXHJcbiAqIEBjYXRlZ29yeSBTdWlCdXR0b25cclxuICovXHJcbmV4cG9ydCBjbGFzcyBSaWJib25CdXR0b25zIHtcclxuICBzdGF0aWMgZ2V0IHBhcmFtQXJyYXkoKSB7XHJcbiAgICByZXR1cm4gWydyaWJib25CdXR0b25zJywgJ3JpYmJvbnMnLCAna2V5Q29tbWFuZHMnLCAnY29udHJvbGxlcicsICdtZW51cycsICdldmVudFNvdXJjZScsICd2aWV3J107XHJcbiAgfVxyXG4gIHN0YXRpYyByaWJib25CdXR0b25IdG1sKGNvbnRhaW5lckNsYXNzOiBzdHJpbmcsIGJ1dHRvbklkOiBzdHJpbmcsIGJ1dHRvbkNsYXNzOiBzdHJpbmcsIGJ1dHRvblRleHQ6IHN0cmluZywgYnV0dG9uSWNvbjogc3RyaW5nLCBidXR0b25LZXk6IHN0cmluZykge1xyXG4gICAgY29uc3QgYiA9IGJ1aWxkRG9tO1xyXG4gICAgY29uc3QgciA9IGIoJ2RpdicpLmNsYXNzZXMoY29udGFpbmVyQ2xhc3MpLmFwcGVuZChiKCdidXR0b24nKS5hdHRyKCdpZCcsIGJ1dHRvbklkKS5jbGFzc2VzKGJ1dHRvbkNsYXNzKS5hcHBlbmQoXHJcbiAgICAgIGIoJ3NwYW4nKS5jbGFzc2VzKCdsZWZ0LXRleHQnKS5hcHBlbmQoXHJcbiAgICAgICAgYignc3BhbicpLmNsYXNzZXMoJ3RleHQtc3BhbicpLnRleHQoYnV0dG9uVGV4dCkpLmFwcGVuZChcclxuICAgICAgICAgIGIoJ3NwYW4nKS5jbGFzc2VzKCdyaWJib24tYnV0dG9uLXRleHQgaWNvbiAnICsgYnV0dG9uSWNvbikpKS5hcHBlbmQoXHJcbiAgICAgICAgICAgIGIoJ3NwYW4nKS5jbGFzc2VzKCdyaWJib24tYnV0dG9uLWhvdGtleScpLnRleHQoYnV0dG9uS2V5KSkpO1xyXG4gICAgcmV0dXJuIHIuZG9tKCk7XHJcbiAgfVxyXG4gIHN0YXRpYyBtZW51QnV0dG9uSHRtbChidXR0b25JZDogc3RyaW5nLCBidXR0b25DbGFzczogc3RyaW5nLCBidXR0b25UZXh0OiBzdHJpbmcsIGJ1dHRvbkljb246IHN0cmluZywgYnV0dG9uS2V5OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGIgPSBidWlsZERvbTtcclxuICAgIGNvbnN0IHIgPSBiKCdsaScpLmNsYXNzZXMoJ25hdi1pdGVtJylcclxuICAgICAgLmFwcGVuZChiKCdidXR0b24nKS5jbGFzc2VzKGJ1dHRvbkNsYXNzKS5hdHRyKCdpZCcsIGJ1dHRvbklkKS5jbGFzc2VzKCduYXYtbGluaycpLmFwcGVuZChcclxuICAgICAgICBiKCdzcGFuJykuY2xhc3NlcygnbGVmdC10ZXh0JykuYXBwZW5kKFxyXG4gICAgICAgICAgYignc3BhbicpLmNsYXNzZXMoJ3RleHQtc3BhbicpLnRleHQoYnV0dG9uVGV4dCkpKS5hcHBlbmQoXHJcbiAgICAgICAgICAgIGIoJ3NwYW4nKS5jbGFzc2VzKCdyaWJib24tYnV0dG9uLXRleHQgaWNvbiAnICsgYnV0dG9uSWNvbikpLmFwcGVuZChcclxuICAgICAgICAgICAgICBiKCdzcGFuJykuY2xhc3NlcygncmliYm9uLWJ1dHRvbi1ob3RrZXknKS50ZXh0KGJ1dHRvbktleSkpKTtcclxuICAgIHJldHVybiByLmRvbSgpO1xyXG4gIH1cclxuICBzdGF0aWMgdHJhbnNsYXRlQnV0dG9uczogQnV0dG9uTGFiZWxbXSA9IFtdO1xyXG4gIGNvbnRyb2xsZXI6IENvbXBsZXRlTm90aWZpZXI7XHJcbiAgY29uZmlnOiBTbW9VaUNvbmZpZ3VyYXRpb247XHJcbiAgZXZlbnRTb3VyY2U6IEJyb3dzZXJFdmVudFNvdXJjZTtcclxuICB2aWV3OiBTdWlTY29yZVZpZXdPcGVyYXRpb25zO1xyXG4gIG1lbnVzOiBTdWlNZW51TWFuYWdlcjtcclxuICByaWJib25zOiBSaWJib25MYXlvdXQ7XHJcbiAgcmliYm9uQnV0dG9uczogQnV0dG9uRGVmaW5pdGlvbltdO1xyXG4gIGNvbGxhcHNhYmxlczogQ29sbGFwc2VSaWJib25Db250cm9sW10gPSBbXTtcclxuICBjb2xsYXBzZUNoaWxkcmVuOiBhbnlbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwYXJhbXM6IFN1aVJpYmJvblBhcmFtcykge1xyXG4gICAgdGhpcy5jb250cm9sbGVyID0gcGFyYW1zLmNvbXBsZXRlTm90aWZpZXI7XHJcbiAgICB0aGlzLmNvbmZpZyA9IHBhcmFtcy5jb25maWc7XHJcbiAgICB0aGlzLmV2ZW50U291cmNlID0gcGFyYW1zLmV2ZW50U291cmNlO1xyXG4gICAgdGhpcy52aWV3ID0gcGFyYW1zLnZpZXc7XHJcbiAgICB0aGlzLm1lbnVzID0gcGFyYW1zLm1lbnVzO1xyXG4gICAgdGhpcy5yaWJib25CdXR0b25zID0gcGFyYW1zLnJpYmJvbkJ1dHRvbnM7XHJcbiAgICB0aGlzLnJpYmJvbnMgPSBwYXJhbXMucmliYm9ucztcclxuICAgIHRoaXMuY29sbGFwc2FibGVzID0gW107XHJcbiAgICB0aGlzLmNvbGxhcHNlQ2hpbGRyZW4gPSBbXTtcclxuICB9XHJcbiAgYXN5bmMgZXhlY3V0ZVF1aWNrQnV0dG9uKGJ1dHRvbjogQnV0dG9uRGVmaW5pdGlvbikge1xyXG4gICAgaWYgKGJ1dHRvbi5pZCA9PT0gJ3pvb21pbicpIHtcclxuICAgICAgY29uc3QgZ2xvYmFsTGF5b3V0ID0gdGhpcy52aWV3LnNjb3JlLmxheW91dE1hbmFnZXIhLmdldEdsb2JhbExheW91dCgpO1xyXG4gICAgICBnbG9iYWxMYXlvdXQuem9vbVNjYWxlIC89IDEuMTtcclxuICAgICAgYXdhaXQgdGhpcy52aWV3LnVwZGF0ZVpvb20oZ2xvYmFsTGF5b3V0Lnpvb21TY2FsZSk7XHJcbiAgICB9IGVsc2UgaWYgKGJ1dHRvbi5pZCA9PT0gJ3pvb21vdXQnKSB7XHJcbiAgICAgIGNvbnN0IGdsb2JhbExheW91dCA9IHRoaXMudmlldy5zY29yZS5sYXlvdXRNYW5hZ2VyIS5nZXRHbG9iYWxMYXlvdXQoKTtcclxuICAgICAgZ2xvYmFsTGF5b3V0Lnpvb21TY2FsZSAqPSAxLjE7XHJcbiAgICAgIHRoaXMudmlldy51cGRhdGVab29tKGdsb2JhbExheW91dC56b29tU2NhbGUpO1xyXG4gICAgfSBlbHNlIGlmIChidXR0b24uaWQgPT09ICdyZWZyZXNoJykge1xyXG4gICAgICBhd2FpdCB0aGlzLnZpZXcucmVmcmVzaFZpZXdwb3J0KCk7XHJcbiAgICB9IGVsc2UgaWYgKGJ1dHRvbi5pZCA9PT0gJ2tleVNpZ25hdHVyZScpIHtcclxuICAgICAgaWYgKCF0aGlzLmNvbnRyb2xsZXIpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY3JlYXRlQW5kRGlzcGxheURpYWxvZyhTdWlLZXlTaWduYXR1cmVEaWFsb2csIHtcclxuICAgICAgICB2aWV3OiB0aGlzLnZpZXcsXHJcbiAgICAgICAgY29tcGxldGVOb3RpZmllcjogdGhpcy5jb250cm9sbGVyLFxyXG4gICAgICAgIHN0YXJ0UHJvbWlzZTogbnVsbCxcclxuICAgICAgICBldmVudFNvdXJjZTogdGhpcy5ldmVudFNvdXJjZSxcclxuICAgICAgICB0cmFja2VyOiB0aGlzLnZpZXcudHJhY2tlcixcclxuICAgICAgICBjdG9yOiAnU3VpS2V5U2lnbmF0dXJlRGlhbG9nJyxcclxuICAgICAgICBpZDogJ2tleS1zaWduYXR1cmUtZGlhbG9nJyxcclxuICAgICAgICBtb2RpZmllcjogbnVsbFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAoYnV0dG9uLmlkID09PSAncmliYm9uVGltZScpIHtcclxuICAgICAgaWYgKCF0aGlzLmNvbnRyb2xsZXIpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY3JlYXRlQW5kRGlzcGxheURpYWxvZyhTdWlUaW1lU2lnbmF0dXJlRGlhbG9nLCB7XHJcbiAgICAgICAgY29tcGxldGVOb3RpZmllcjogdGhpcy5jb250cm9sbGVyLFxyXG4gICAgICAgIHZpZXc6IHRoaXMudmlldyxcclxuICAgICAgICBldmVudFNvdXJjZTogdGhpcy5ldmVudFNvdXJjZSxcclxuICAgICAgICBpZDogJ3N0YWZmR3JvdXBzJyxcclxuICAgICAgICBjdG9yOiAnU3VpU3RhZmZHcm91cERpYWxvZycsXHJcbiAgICAgICAgdHJhY2tlcjogdGhpcy52aWV3LnRyYWNrZXIsXHJcbiAgICAgICAgbW9kaWZpZXI6IG51bGwsXHJcbiAgICAgICAgc3RhcnRQcm9taXNlOiBudWxsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChidXR0b24uaWQgPT09ICdyaWJib25UZW1wbycpIHtcclxuICAgICAgaWYgKCF0aGlzLmNvbnRyb2xsZXIpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdGVtcG8gPSB0aGlzLnZpZXcudHJhY2tlci5zZWxlY3Rpb25zWzBdLm1lYXN1cmUuZ2V0VGVtcG8oKTtcclxuICAgICAgY3JlYXRlQW5kRGlzcGxheURpYWxvZyhTdWlUZW1wb0RpYWxvZyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZDogJ3RlbXBvRGlhbG9nJyxcclxuICAgICAgICAgIGN0b3I6ICdTdWlUZW1wb0RpYWxvZycsXHJcbiAgICAgICAgICBjb21wbGV0ZU5vdGlmaWVyOiB0aGlzLmNvbnRyb2xsZXIsXHJcbiAgICAgICAgICB2aWV3OiB0aGlzLnZpZXcsXHJcbiAgICAgICAgICBldmVudFNvdXJjZTogdGhpcy5ldmVudFNvdXJjZSxcclxuICAgICAgICAgIHRyYWNrZXI6IHRoaXMudmlldy50cmFja2VyLFxyXG4gICAgICAgICAgc3RhcnRQcm9taXNlOiBudWxsLFxyXG4gICAgICAgICAgbW9kaWZpZXI6IHRlbXBvXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIGlmIChidXR0b24uaWQgPT09ICdwbGF5QnV0dG9uMicpIHtcclxuICAgICAgdGhpcy52aWV3LnBsYXlGcm9tU2VsZWN0aW9uKCk7XHJcbiAgICB9IGVsc2UgaWYgKGJ1dHRvbi5pZCA9PT0gJ3N0b3BCdXR0b24yJykge1xyXG4gICAgICB0aGlzLnZpZXcuc3RvcFBsYXllcigpO1xyXG4gICAgfSBlbHNlIGlmIChidXR0b24uaWQgPT09ICdzZWxlY3RQYXJ0Jykge1xyXG4gICAgICBpZiAoIXRoaXMuY29udHJvbGxlcikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBhd2FpdCB0aGlzLnZpZXcucmVuZGVyUHJvbWlzZSgpO1xyXG4gICAgICB0aGlzLm1lbnVzLmNyZWF0ZU1lbnUoJ1N1aVBhcnRTZWxlY3Rpb25NZW51JywgdGhpcy5jb250cm9sbGVyKTtcclxuICAgIH1cclxuICB9XHJcbiAgYXN5bmMgZXhlY3V0ZUJ1dHRvbk1vZGFsKGJ1dHRvbkVsZW1lbnQ6IHN0cmluZywgYnV0dG9uRGF0YTogQnV0dG9uRGVmaW5pdGlvbikge1xyXG4gICAgaWYgKGlzTW9kYWxCdXR0b25UeXBlKGJ1dHRvbkRhdGEuY3RvcikpIHtcclxuICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgIGV2ZW50U291cmNlOiB0aGlzLmV2ZW50U291cmNlLFxyXG4gICAgICAgIGNvbXBsZXRlTm90aWZpZXI6IHRoaXMuY29udHJvbGxlcixcclxuICAgICAgICB2aWV3OiB0aGlzLnZpZXcsXHJcbiAgICAgICAgY3RvcjogYnV0dG9uRGF0YS5jdG9yLFxyXG4gICAgICAgIGlkOiBidXR0b25EYXRhLmlkLFxyXG4gICAgICAgIHN0YXJ0UHJvbWlzZTogbnVsbCxcclxuICAgICAgICB0cmFja2VyOiB0aGlzLnZpZXcudHJhY2tlclxyXG4gICAgICB9O1xyXG4gICAgICBpZiAoYnV0dG9uRGF0YS5jdG9yID09PSAnU3VpTGlicmFyeURpYWxvZycpIHtcclxuICAgICAgICBhd2FpdCBTdWlMaWJyYXJ5RGlhbG9nLmNyZWF0ZUFuZERpc3BsYXkocGFyYW1zLCB0aGlzLmNvbmZpZyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY3JlYXRlQW5kRGlzcGxheURpYWxvZyhTdWlUZW1wb0RpYWxvZywgcGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChidXR0b25EYXRhLmN0b3IgPT09ICdoZWxwTW9kYWwnKSB7XHJcbiAgICAgIFN1aUhlbHAuZGlzcGxheUhlbHAoKTtcclxuICAgIH1cclxuICB9XHJcbiAgZXhlY3V0ZUJ1dHRvbk1lbnUoYnV0dG9uRWxlbWVudDogc3RyaW5nLCBidXR0b25EYXRhOiBCdXR0b25EZWZpbml0aW9uKSB7XHJcbiAgICB0aGlzLm1lbnVzLmNyZWF0ZU1lbnUoYnV0dG9uRGF0YS5jdG9yLCB0aGlzLmNvbnRyb2xsZXIpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZXhlY3V0ZUJ1dHRvbihidXR0b25FbGVtZW50OiBzdHJpbmcsIGJ1dHRvbkRhdGE6IEJ1dHRvbkRlZmluaXRpb24pIHtcclxuICAgIGlmIChidXR0b25EYXRhLmFjdGlvbiA9PT0gJ21vZGFsJykge1xyXG4gICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVCdXR0b25Nb2RhbChidXR0b25FbGVtZW50LCBidXR0b25EYXRhKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGJ1dHRvbkRhdGEuYWN0aW9uID09PSAnbWVudScgfHwgYnV0dG9uRGF0YS5hY3Rpb24gPT09ICdjb2xsYXBzZUNoaWxkTWVudScpIHtcclxuICAgICAgdGhpcy5leGVjdXRlQnV0dG9uTWVudShidXR0b25FbGVtZW50LCBidXR0b25EYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJpbmRCdXR0b24oYnV0dG9uRWxlbWVudDogc3RyaW5nLCBidXR0b25EYXRhOiBCdXR0b25EZWZpbml0aW9uKSB7XHJcbiAgICBjb25zdCBjYiA9IGFzeW5jICgpID0+IHtcclxuICAgICAgYXdhaXQgdGhpcy5leGVjdXRlQnV0dG9uKGJ1dHRvbkVsZW1lbnQsIGJ1dHRvbkRhdGEpO1xyXG4gICAgfTtcclxuICAgIHRoaXMuZXZlbnRTb3VyY2UuZG9tQ2xpY2soYnV0dG9uRWxlbWVudCwgY2IpO1xyXG4gIH1cclxuICBjcmVhdGVDb2xsYXBzaWJsZUJ1dHRvbkdyb3VwcyhzZWxlY3Rvcjogc3RyaW5nIHwgSFRNTEVsZW1lbnQpIHtcclxuICAgIGxldCBjb250YWluZXJDbGFzczogc3RyaW5nID0gJyc7XHJcbiAgICAvLyBOb3cgYWxsIHRoZSBidXR0b24gZWxlbWVudHMgaGF2ZSBiZWVuIGJvdW5kLiAgSm9pbiBjaGlsZCBhbmQgcGFyZW50IGJ1dHRvbnNcclxuICAgIC8vIEZvciBhbGwgdGhlIGNoaWxkcmVuIG9mIGEgYnV0dG9uIGdyb3VwLCBhZGQgaXQgdG8gdGhlIHBhcmVudCBncm91cFxyXG4gICAgdGhpcy5jb2xsYXBzZUNoaWxkcmVuLmZvckVhY2goKGIpID0+IHtcclxuICAgICAgY29udGFpbmVyQ2xhc3MgPSAncmliYm9uQnV0dG9uQ29udGFpbmVyJztcclxuICAgICAgaWYgKGIuYWN0aW9uID09PSAnY29sbGFwc2VHcmFuZGNoaWxkJykge1xyXG4gICAgICAgIGNvbnRhaW5lckNsYXNzID0gJ3JpYmJvbkJ1dHRvbkNvbnRhaW5lck1vcmUnO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGJ1dHRvbkh0bWwgPSBSaWJib25CdXR0b25zLnJpYmJvbkJ1dHRvbkh0bWwoXHJcbiAgICAgICAgY29udGFpbmVyQ2xhc3MsIGIuaWQsIGIuY2xhc3NlcywgYi5sZWZ0VGV4dCwgYi5pY29uLCBiLnJpZ2h0VGV4dCk7XHJcbiAgICAgIGlmIChiLmRhdGFFbGVtZW50cykge1xyXG4gICAgICAgIGNvbnN0IGJrZXlzID0gT2JqZWN0LmtleXMoYi5kYXRhRWxlbWVudHMpO1xyXG4gICAgICAgIGJrZXlzLmZvckVhY2goKGJrZXkpID0+IHtcclxuICAgICAgICAgIHZhciBkZSA9IGIuZGF0YUVsZW1lbnRzW2JrZXldO1xyXG4gICAgICAgICAgJChidXR0b25IdG1sKS5maW5kKCdidXR0b24nKS5hdHRyKCdkYXRhLScgKyBia2V5LCBkZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQmluZCB0aGUgY2hpbGQgYnV0dG9uIGFjdGlvbnNcclxuICAgICAgY29uc3QgcGFyZW50ID0gJChzZWxlY3RvcikuZmluZCgnLmNvbGxhcHNlQ29udGFpbmVyW2RhdGEtZ3JvdXA9XCInICsgYi5ncm91cCArICdcIl0nKTtcclxuICAgICAgJChwYXJlbnQpLmFwcGVuZChidXR0b25IdG1sKTtcclxuICAgICAgY29uc3QgZWwgPSAkKHNlbGVjdG9yKS5maW5kKCcjJyArIGIuaWQpO1xyXG4gICAgICB0aGlzLmJpbmRCdXR0b24oZWwsIGIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jb2xsYXBzYWJsZXMuZm9yRWFjaCgoY2IpID0+IHtcclxuICAgICAgLy8gQmluZCB0aGUgZXZlbnRzIG9mIHRoZSBwYXJlbnQgYnV0dG9uXHJcbiAgICAgIGNiLmJpbmQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBfY3JlYXRlU2lkZWJhckJ1dHRvbkdyb3VwcyhzZWxlY3Rvcjogc3RyaW5nIHwgSFRNTEVsZW1lbnQpIHtcclxuICAgIGxldCBjb250YWluZXJDbGFzczogc3RyaW5nID0gJyc7XHJcbiAgICAvLyBOb3cgYWxsIHRoZSBidXR0b24gZWxlbWVudHMgaGF2ZSBiZWVuIGJvdW5kLiAgSm9pbiBjaGlsZCBhbmQgcGFyZW50IGJ1dHRvbnNcclxuICAgIC8vIEZvciBhbGwgdGhlIGNoaWxkcmVuIG9mIGEgYnV0dG9uIGdyb3VwLCBhZGQgaXQgdG8gdGhlIHBhcmVudCBncm91cFxyXG4gICAgdGhpcy5jb2xsYXBzZUNoaWxkcmVuLmZvckVhY2goKGIpID0+IHtcclxuICAgICAgY29udGFpbmVyQ2xhc3MgPSAncmliYm9uQnV0dG9uQ29udGFpbmVyJztcclxuICAgICAgaWYgKGIuYWN0aW9uID09PSAnY29sbGFwc2VHcmFuZGNoaWxkJykge1xyXG4gICAgICAgIGNvbnRhaW5lckNsYXNzID0gJ3JpYmJvbkJ1dHRvbkNvbnRhaW5lck1vcmUnO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGJ1dHRvbkh0bWwgPSBSaWJib25CdXR0b25zLnJpYmJvbkJ1dHRvbkh0bWwoXHJcbiAgICAgICAgY29udGFpbmVyQ2xhc3MsIGIuaWQsIGIuY2xhc3NlcywgYi5sZWZ0VGV4dCwgYi5pY29uLCBiLnJpZ2h0VGV4dCk7XHJcbiAgICAgIGlmIChiLmRhdGFFbGVtZW50cykge1xyXG4gICAgICAgIGNvbnN0IGJrZXlzID0gT2JqZWN0LmtleXMoYi5kYXRhRWxlbWVudHMpO1xyXG4gICAgICAgIGJrZXlzLmZvckVhY2goKGJrZXkpID0+IHtcclxuICAgICAgICAgIHZhciBkZSA9IGIuZGF0YUVsZW1lbnRzW2JrZXldO1xyXG4gICAgICAgICAgJChidXR0b25IdG1sKS5maW5kKCdidXR0b24nKS5hdHRyKCdkYXRhLScgKyBia2V5LCBkZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQmluZCB0aGUgY2hpbGQgYnV0dG9uIGFjdGlvbnNcclxuICAgICAgY29uc3QgcGFyZW50ID0gJChzZWxlY3RvcikuZmluZCgnLmNvbGxhcHNlQ29udGFpbmVyW2RhdGEtZ3JvdXA9XCInICsgYi5ncm91cCArICdcIl0nKTtcclxuICAgICAgJChwYXJlbnQpLmFwcGVuZChidXR0b25IdG1sKTtcclxuICAgICAgY29uc3QgZWwgPSAkKHNlbGVjdG9yKS5maW5kKCcjJyArIGIuaWQpO1xyXG4gICAgICB0aGlzLmJpbmRCdXR0b24oZWwsIGIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jb2xsYXBzYWJsZXMuZm9yRWFjaCgoY2IpID0+IHtcclxuICAgICAgLy8gQmluZCB0aGUgZXZlbnRzIG9mIHRoZSBwYXJlbnQgYnV0dG9uXHJcbiAgICAgIGNiLmJpbmQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBzdGF0aWMgaXNDb2xsYXBzaWJsZShhY3Rpb246IEJ1dHRvbkFjdGlvbikge1xyXG4gICAgcmV0dXJuIFsnY29sbGFwc2VDaGlsZCcsICdjb2xsYXBzZUNoaWxkTWVudScsICdjb2xsYXBzZUdyYW5kY2hpbGQnLCAnY29sbGFwc2VNb3JlJ10uaW5kZXhPZihhY3Rpb24pID49IDA7XHJcbiAgfVxyXG5cclxuICAvLyAjIyMgX2NyZWF0ZUJ1dHRvbkh0bWxcclxuICAvLyBGb3IgZWFjaCBidXR0b24sIGNyZWF0ZSB0aGUgaHRtbCBhbmQgYmluZCB0aGUgZXZlbnRzIGJhc2VkIG9uXHJcbiAgLy8gdGhlIGJ1dHRvbidzIGNvbmZpZ3VyZWQgYWN0aW9uLlxyXG4gIGNyZWF0ZVJpYmJvbkh0bWwoYnV0dG9uQXI6IHN0cmluZ1tdLCBzZWxlY3Rvcjogc3RyaW5nIHwgSFRNTEVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGRhdGFBcnJheTogQnV0dG9uRGVmaW5pdGlvbltdID0gcmVhY3RpdmUoW10pO1xyXG4gICAgY29uc3QgYnV0dG9uQ2FsbGJhY2sgPSBhc3luYyAoYnV0dG9uOiBCdXR0b25EZWZpbml0aW9uKSA9PiB7XHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVRdWlja0J1dHRvbihidXR0b24pO1xyXG4gICAgfTtcclxuICAgIGJ1dHRvbkFyLmZvckVhY2goKGJ1dHRvbklkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGJ1dHRvbkRhdGEgPSB0aGlzLnJpYmJvbkJ1dHRvbnMuZmluZCgoZSkgPT5cclxuICAgICAgICBlLmlkID09PSBidXR0b25JZFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoYnV0dG9uRGF0YSkge1xyXG4gICAgICAgIGJ1dHRvbkRhdGEuY2FsbGJhY2sgPSBidXR0b25DYWxsYmFjaztcclxuICAgICAgICBidXR0b25EYXRhLmNsYXNzZXMgKz0gJyBidG4nO1xyXG4gICAgICAgIGRhdGFBcnJheS5wdXNoKGJ1dHRvbkRhdGEpOyAgICAgICAgXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgY29uc3QgcGFydEJ1dHRvbiA9IGRhdGFBcnJheS5maW5kKChiKSA9PiBiLmlkID09PSAnc2VsZWN0UGFydCcpO1xyXG4gICAgaWYgKHBhcnRCdXR0b24pIHtcclxuICAgICAgd2F0Y2godGhpcy52aWV3LlBhcnROYW1lLCAobmV3VmFsKSA9PiB7XHJcbiAgICAgICAgaWYgKG5ld1ZhbC5sZW5ndGgpIHsgICBcclxuICAgICAgICAgIHBhcnRCdXR0b24ucmlnaHRUZXh0ID0gbmV3VmFsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYXJ0QnV0dG9uLnJpZ2h0VGV4dCA9ICdTZWxlY3QgUGFydCc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJvb3QgPSByZXBsYWNlVnVlUm9vdChzZWxlY3Rvcik7XHJcbiAgICBjcmVhdGVBcHAocmliYm9uQXBwIGFzIGFueSwgeyBidXR0b25Qcm9wczogZGF0YUFycmF5LCBkb21JZDogcm9vdCB9KS5tb3VudCgnIycgKyByb290KTtcclxuICB9XHJcbiAgLy8gIyMjIF9jcmVhdGVCdXR0b25IdG1sXHJcbiAgLy8gRm9yIGVhY2ggYnV0dG9uLCBjcmVhdGUgdGhlIGh0bWwgYW5kIGJpbmQgdGhlIGV2ZW50cyBiYXNlZCBvblxyXG4gIC8vIHRoZSBidXR0b24ncyBjb25maWd1cmVkIGFjdGlvbi5cclxuICBjcmVhdGVTaWRlYmFyTWVudUh0bWwoYnV0dG9uQXI6IHN0cmluZ1tdLCBzZWxlY3Rvcjogc3RyaW5nIHwgSFRNTEVsZW1lbnQpIHtcclxuICAgIGxldCBidXR0b25DbGFzcyA9ICcnO1xyXG4gICAgY29uc3QgYnV0dG9uTGlzdDogQnV0dG9uRGVmaW5pdGlvbltdID0gW107XHJcbiAgICBjb25zdCBleGVjdXRlQnV0dG9uID0gYXN5bmMgKGJ1dHRvbkRhdGE6IEJ1dHRvbkRlZmluaXRpb24pID0+IHtcclxuICAgICAgYXdhaXQgdGhpcy5leGVjdXRlQnV0dG9uKGJ1dHRvbkRhdGEuaWQsIGJ1dHRvbkRhdGEpO1xyXG4gICAgfTsgICAgXHJcbiAgICBidXR0b25Bci5mb3JFYWNoKChidXR0b25JZCkgPT4ge1xyXG4gICAgICBjb25zdCBidXR0b25EYXRhID0gdGhpcy5yaWJib25CdXR0b25zLmZpbmQoKGUpID0+XHJcbiAgICAgICAgZS5pZCA9PT0gYnV0dG9uSWRcclxuICAgICAgKTtcclxuICAgICAgaWYgKGJ1dHRvbkRhdGEpIHtcclxuICAgICAgICBidXR0b25EYXRhLmNhbGxiYWNrID0gZXhlY3V0ZUJ1dHRvbjtcclxuICAgICAgICBidXR0b25EYXRhLmljb24gKz0gJyBtZW51LWljb24nO1xyXG4gICAgICAgIGJ1dHRvbkxpc3QucHVzaChidXR0b25EYXRhKTtcclxuICAgICAgICAvKiBpZiAoYnV0dG9uRGF0YS5sZWZ0VGV4dCkge1xyXG4gICAgICAgICAgUmliYm9uQnV0dG9ucy50cmFuc2xhdGVCdXR0b25zLnB1c2goeyBidXR0b25JZDogYnV0dG9uRGF0YS5pZCwgYnV0dG9uVGV4dDogYnV0dG9uRGF0YS5sZWZ0VGV4dCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29sbGFwc2UgY2hpbGQgaXMgaGlkZGVuIHVudGlsIHRoZSBwYXJlbnQgYnV0dG9uIGlzIHNlbGVjdGVkLCBleHBvc2luZyB0aGUgYnV0dG9uIGdyb3VwXHJcbiAgICAgICAgaWYgKFJpYmJvbkJ1dHRvbnMuaXNDb2xsYXBzaWJsZShidXR0b25EYXRhLmFjdGlvbikpIHtcclxuICAgICAgICAgIHRoaXMuY29sbGFwc2VDaGlsZHJlbi5wdXNoKGJ1dHRvbkRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYnV0dG9uRGF0YS5hY3Rpb24gIT09ICdjb2xsYXBzZUNoaWxkJykge1xyXG4gICAgICAgICAgLy8gZWxzZSB0aGUgYnV0dG9uIGhhcyBhIHNwZWNpZmljIGFjdGlvbiwgc3VjaCBhcyBhIG1lbnUgb3IgZGlhbG9nLCBvciBhIHBhcmVudCBidXR0b25cclxuICAgICAgICAgIC8vIGZvciB0cmFuc2xhdGlvbiwgYWRkIHRoZSBtZW51IG5hbWUgdG8gdGhlIGJ1dHRvbiBjbGFzc1xyXG4gICAgICAgICAgYnV0dG9uQ2xhc3MgPSBidXR0b25EYXRhLmNsYXNzZXM7XHJcbiAgICAgICAgICBpZiAoYnV0dG9uRGF0YS5hY3Rpb24gPT09ICdtZW51JyB8fCBidXR0b25EYXRhLmFjdGlvbiA9PT0gJ21vZGFsJykge1xyXG4gICAgICAgICAgICBidXR0b25DbGFzcyArPSAnICcgKyBidXR0b25EYXRhLmN0b3I7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBidXR0b25IdG1sID0gUmliYm9uQnV0dG9ucy5tZW51QnV0dG9uSHRtbChcclxuICAgICAgICAgICAgYnV0dG9uRGF0YS5pZCwgYnV0dG9uQ2xhc3MsIGJ1dHRvbkRhdGEubGVmdFRleHQsIGJ1dHRvbkRhdGEuaWNvbiwgYnV0dG9uRGF0YS5yaWdodFRleHQpO1xyXG4gICAgICAgICAgJChidXR0b25IdG1sKS5hdHRyKCdkYXRhLWdyb3VwJywgYnV0dG9uRGF0YS5ncm91cCk7XHJcbiAgICAgICAgICAkKHNlbGVjdG9yKS5hcHBlbmQoYnV0dG9uSHRtbCk7XHJcbiAgICAgICAgICBjb25zdCBidXR0b25FbGVtZW50ID0gJCgnIycgKyBidXR0b25EYXRhLmlkKTtcclxuICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjb2xsYWJzYWJsZSBidXR0b24sIGNyZWF0ZSBpdCwgb3RoZXJ3aXNlIGJpbmQgaXRzIGV4ZWN1dGUgZnVuY3Rpb24uXHJcbiAgICAgICAgICBpZiAoYnV0dG9uRGF0YS5hY3Rpb24gPT09ICdjb2xsYXBzZVBhcmVudCcpIHtcclxuICAgICAgICAgICAgJChidXR0b25IdG1sKS5hZGRDbGFzcygnY29sbGFwc2VDb250YWluZXInKTtcclxuICAgICAgICAgICAgLy8gY29sbGFwc2VQYXJlbnRcclxuICAgICAgICAgICAgdGhpcy5jb2xsYXBzYWJsZXMucHVzaChuZXcgQ29sbGFwc2VSaWJib25Db250cm9sKHtcclxuICAgICAgICAgICAgICBjdG9yOiBidXR0b25EYXRhLmN0b3IsXHJcbiAgICAgICAgICAgICAgYnV0dG9uczogdGhpcy5yaWJib25CdXR0b25zLFxyXG4gICAgICAgICAgICAgIHZpZXc6IHRoaXMudmlldyxcclxuICAgICAgICAgICAgICBtZW51czogdGhpcy5tZW51cyxcclxuICAgICAgICAgICAgICBldmVudFNvdXJjZTogdGhpcy5ldmVudFNvdXJjZSxcclxuICAgICAgICAgICAgICBjb21wbGV0ZU5vdGlmaWVyOiB0aGlzLmNvbnRyb2xsZXIsXHJcbiAgICAgICAgICAgICAgYnV0dG9uSWQ6IGJ1dHRvbkRhdGEuaWQsXHJcbiAgICAgICAgICAgICAgYnV0dG9uRWxlbWVudCxcclxuICAgICAgICAgICAgICBidXR0b25EYXRhXHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNiID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUJ1dHRvbihidXR0b25FbGVtZW50LCBidXR0b25EYXRhKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5ldmVudFNvdXJjZS5kb21DbGljayhidXR0b25FbGVtZW50LCBjYik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSovXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgY3JlYXRlQXBwKHJpYmJvblNpZGViYXJBcHAgYXMgYW55LCB7IGJ1dHRvblByb3BzOiBidXR0b25MaXN0LCBkb21JZDogc2VsZWN0b3IgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IHNlbGVjdG9yLmlkIDogc2VsZWN0b3IgfSkubW91bnQoc2VsZWN0b3IpO1xyXG4gIH1cclxuICBjcmVhdGVSaWJib24oYnV0dG9uRGF0YUFycmF5OiBzdHJpbmdbXSwgcGFyZW50RWxlbWVudDogc3RyaW5nIHwgSFRNTEVsZW1lbnQpIHtcclxuICAgIHRoaXMuY3JlYXRlUmliYm9uSHRtbChidXR0b25EYXRhQXJyYXksIHBhcmVudEVsZW1lbnQpO1xyXG4gICAgdGhpcy5jcmVhdGVDb2xsYXBzaWJsZUJ1dHRvbkdyb3VwcyhwYXJlbnRFbGVtZW50KTtcclxuICB9XHJcbiAgY3JlYXRlU2lkZWJhclJpYmJvbihidXR0b25EYXRhQXJyYXk6IHN0cmluZ1tdLCBwYXJlbnRFbGVtZW50OiBzdHJpbmcgfCBIVE1MRWxlbWVudCwgY29udGFpbmVyQ2xhc3Nlczogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmNyZWF0ZVNpZGViYXJNZW51SHRtbChidXR0b25EYXRhQXJyYXksIHBhcmVudEVsZW1lbnQpO1xyXG4gICAgLy8gdGhpcy5fY3JlYXRlQ29sbGFwc2libGVCdXR0b25Hcm91cHMocGFyZW50RWxlbWVudCk7IG5lZWRlZD9cclxuICB9XHJcbiAgYXN5bmMgaGFuZGxlS2V5RG93bihldjogS2V5RXZlbnQpIHtcclxuICAgIGlmIChldi5hbHRLZXkpIHtcclxuICAgICAgY29uc3Qga2V5QnV0dG9uID0gdGhpcy5yaWJib25CdXR0b25zLmZpbmQoKGJiKSA9PiBiYi5ob3RLZXkgJiYgYmIuaG90S2V5ID09PSBldi5rZXkpO1xyXG4gICAgICBpZiAoa2V5QnV0dG9uKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9ICcjJyArIGtleUJ1dHRvbi5pZDtcclxuICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVCdXR0b24oZWxlbWVudCwga2V5QnV0dG9uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBkaXNwbGF5KCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmxlZnRDb250cm9scykge1xyXG4gICAgICBjb25zdCBsZWZ0Q29udHJvbCA9IGdldERvbUNvbnRhaW5lcih0aGlzLmNvbmZpZy5sZWZ0Q29udHJvbHMpO1xyXG4gICAgICBpZiAobGVmdENvbnRyb2wpIHtcclxuICAgICAgICAkKGxlZnRDb250cm9sKS5odG1sKCcnKTtcclxuICAgICAgICBjb25zdCBsYnV0dG9ucyA9IHRoaXMucmliYm9ucy5sZWZ0O1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU2lkZWJhclJpYmJvbihsYnV0dG9ucywgbGVmdENvbnRyb2wsICduYXYtaXRlbScpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb25maWcudG9wQ29udHJvbHMpIHtcclxuICAgICAgY29uc3QgdG9wQ29udHJvbCA9IGdldERvbUNvbnRhaW5lcih0aGlzLmNvbmZpZy50b3BDb250cm9scyk7XHJcbiAgICAgIGlmICh0b3BDb250cm9sKSB7XHJcbiAgICAgICAgY29uc3QgdGJ1dHRvbnMgPSB0aGlzLnJpYmJvbnMudG9wO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlUmliYm9uKHRidXR0b25zLCB0b3BDb250cm9sKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3Qga2QgPSBhc3luYyAoZXY6IGFueSkgPT4geyB0aGlzLmhhbmRsZUtleURvd24oZXYpOyB9XHJcbiAgICB0aGlzLmV2ZW50U291cmNlLmJpbmRLZXlkb3duSGFuZGxlcihrZCk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/buttons/ribbon.ts\n\n}");
1912
1912
 
1913
1913
  /***/ },
1914
1914
 
@@ -3605,7 +3605,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
3605
3605
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3606
3606
 
3607
3607
  "use strict";
3608
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiChordChangeDialog: () => (/* binding */ SuiChordChangeDialog)\n/* harmony export */ });\n/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dialog */ \"./src/ui/dialogs/dialog.ts\");\n/* harmony import */ var _render_sui_textRender__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../render/sui/textRender */ \"./src/render/sui/textRender.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 * Complex dialog for running a chord change editing session.\n * @category SuiDialog\n */\nclass SuiChordChangeDialog extends _dialog__WEBPACK_IMPORTED_MODULE_0__.SuiDialogBase {\n constructor(parameters) {\n super(SuiChordChangeDialog.dialogElements, parameters);\n this.lyric = null;\n this.selector = null;\n this.mouseMoveHandler = null;\n this.mouseClickHandler = null;\n parameters.ctor = 'SuiChordChangeDialog';\n this.displayOptions = ['BINDCOMPONENTS', 'DRAGGABLE', 'KEYBOARD_CAPTURE', 'SELECTIONPOS'];\n }\n get chordEditorCtrl() {\n return this.cmap.chordEditorCtrl;\n }\n get chordSymbolCtrl() {\n return this.cmap.chordSymbolCtrl;\n }\n get translateYCtrl() {\n return this.cmap.translateYCtrl;\n }\n get textPositionCtrl() {\n return this.cmap.textPositionCtrl;\n }\n get adjustWidthCtrl() {\n return this.cmap.adjustWidthCtrl;\n }\n get fontCtrl() {\n return this.cmap.fontCtrl;\n }\n changed() {\n let val = '';\n if (this.chordSymbolCtrl.changeFlag && this.chordEditorCtrl.running) {\n val = '@' + this.chordSymbolCtrl.getValue() + '@';\n var kv;\n /* type: string, shiftKey: boolean, ctrlKey: boolean, altKey: boolean, key: string, keyCode: string,\n code: string*/\n this.chordEditorCtrl.evKey({\n type: 'keydown',\n shiftKey: false,\n ctrlKey: false,\n altKey: false,\n key: val,\n code: val,\n event: null,\n keyCode: 0\n });\n // Move focus outside the element so it doesn't intercept keys\n this.chordSymbolCtrl.unselect();\n }\n if (this.translateYCtrl.changeFlag) {\n if (this.lyric && this.selector) {\n this.lyric.translateY = this.translateYCtrl.getValue();\n this.view.addOrUpdateLyric(this.selector, this.lyric);\n }\n }\n if (this.textPositionCtrl.changeFlag) {\n this.chordEditorCtrl.setTextType(this.textPositionCtrl.getValue());\n $(this.textPositionCtrl._getInputElement())[0].selectedIndex = -1;\n $(this.textPositionCtrl._getInputElement()).blur();\n }\n if (this.fontCtrl.changeFlag) {\n const fontInfo = this.fontCtrl.getValue();\n this.view.setChordFont(fontInfo);\n }\n if (this.adjustWidthCtrl.changeFlag) {\n this.view.score.setChordAdjustWidth(this.adjustWidthCtrl.getValue());\n }\n }\n setLyric(selector, lyric) {\n this.selector = selector;\n this.lyric = lyric;\n this.translateYCtrl.setValue(lyric.translateY);\n }\n display() {\n super.display();\n const mousemove = (ev) => __awaiter(this, void 0, void 0, function* () { this.mouseMove(ev); });\n const mouseclick = (ev) => __awaiter(this, void 0, void 0, function* () { this.mouseClick(ev); });\n this.mouseMoveHandler = this.eventSource.bindMouseMoveHandler(mousemove);\n this.mouseClickHandler = this.eventSource.bindMouseClickHandler(mouseclick);\n if (this.chordEditorCtrl && this.chordEditorCtrl.session && this.chordEditorCtrl.session.lyric) {\n const lyric = this.chordEditorCtrl.session.lyric;\n this.adjustWidthCtrl.setValue(lyric.adjustNoteWidthChord);\n this.fontCtrl.setValue({\n family: lyric.fontInfo.family,\n size: lyric.fontInfo.size, weight: 'normal'\n });\n }\n }\n bindElements() {\n const dgDom = this.dgDom;\n $(dgDom.element).find('.ok-button').off('click').on('click', () => {\n this._complete();\n });\n $(dgDom.element).find('.cancel-button').off('click').on('click', () => {\n this._complete();\n });\n $(dgDom.element).find('.remove-button').remove();\n // this.chordEditorCtrl.setView(this.eventSource, this.view);\n this.chordEditorCtrl.startEditSession();\n }\n // ### handleKeydown\n // allow a dialog to be dismissed by esc.\n evKey(evdata) {\n return __awaiter(this, void 0, void 0, function* () {\n if (evdata.key === 'Escape') {\n $(this.dgDom.element).find('.cancel-button').click();\n evdata.preventDefault();\n }\n else {\n if (!this.chordEditorCtrl.running) {\n return;\n }\n const edited = yield this.chordEditorCtrl.evKey(evdata);\n if (edited) {\n evdata.stopPropagation();\n }\n }\n });\n }\n _complete() {\n if (this.chordEditorCtrl.running) {\n this.chordEditorCtrl.endSession();\n }\n this.view.renderer.setDirty();\n if (this.mouseMoveHandler) {\n this.eventSource.unbindMouseMoveHandler(this.mouseMoveHandler);\n }\n if (this.mouseClickHandler) {\n this.eventSource.unbindMouseClickHandler(this.mouseClickHandler);\n }\n $('body').removeClass('showAttributeDialog');\n $('body').removeClass('textEditor');\n this.complete();\n }\n mouseMove(ev) {\n if (this.chordEditorCtrl && this.chordEditorCtrl.running) {\n this.chordEditorCtrl.mouseMove(ev);\n }\n }\n mouseClick(ev) {\n if (this.chordEditorCtrl && this.chordEditorCtrl.running) {\n this.chordEditorCtrl.mouseClick(ev);\n ev.stopPropagation();\n }\n }\n}\nSuiChordChangeDialog.dialogElements = {\n label: 'Edit Chord Symbol', elements: [{\n smoName: 'verse',\n defaultValue: 0,\n control: 'SuiDropdownComponent',\n label: 'Ordinality',\n classes: 'hide-when-editing',\n startRow: true,\n options: [{\n value: 0,\n label: '1'\n }, {\n value: 1,\n label: '2'\n }, {\n value: 2,\n label: '3'\n }]\n }, {\n smoName: 'translateY',\n defaultValue: 0,\n classes: 'hide-when-editing',\n control: 'SuiRockerComponent',\n label: 'Y Adjustment (Px)',\n dataType: 'int'\n }, {\n smoName: 'chordEditor',\n defaultValue: 0,\n classes: 'show-always',\n control: 'SuiChordComponent',\n label: 'Edit Text',\n options: []\n }, {\n smoName: 'chordSymbol',\n defaultValue: '',\n classes: 'show-when-editing',\n control: 'SuiDropdownComponent',\n label: 'Chord Symbol',\n startRow: true,\n options: [{\n value: 'csymDiminished',\n label: 'Dim'\n }, {\n value: 'csymHalfDiminished',\n label: 'Half dim'\n }, {\n value: 'csymDiagonalArrangementSlash',\n label: 'Slash'\n }, {\n value: 'csymMajorSeventh',\n label: 'Maj7'\n }]\n }, {\n smoName: 'textPosition',\n defaultValue: _render_sui_textRender__WEBPACK_IMPORTED_MODULE_1__.SuiInlineText.textTypes.normal,\n classes: 'show-when-editing',\n control: 'SuiDropdownComponent',\n label: 'Text Position',\n startRow: true,\n options: [{\n value: _render_sui_textRender__WEBPACK_IMPORTED_MODULE_1__.SuiInlineText.textTypes.superScript,\n label: 'Superscript'\n }, {\n value: _render_sui_textRender__WEBPACK_IMPORTED_MODULE_1__.SuiInlineText.textTypes.subScript,\n label: 'Subscript'\n }, {\n value: _render_sui_textRender__WEBPACK_IMPORTED_MODULE_1__.SuiInlineText.textTypes.normal,\n label: 'Normal'\n }]\n }, {\n smoName: 'font',\n classes: 'hide-when-editing',\n defaultValue: 0,\n control: 'SuiFontComponent',\n label: 'Font'\n }, {\n smoName: 'adjustWidth',\n classes: 'hide-when-editing',\n control: 'SuiToggleComponent',\n label: 'Adjust Note Width',\n options: []\n }],\n staticText: [\n { label: 'Edit Chord Symbol' },\n { undo: 'Undo Chord Symbols' },\n { doneEditing: 'Done Editing Chord Symbols' }\n ]\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QXNCO1lBQy9CLEtBQUssRUFBRSxlQUFlO1lBQ3RCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsT0FBTyxFQUFFLENBQUM7b0JBQ1IsS0FBSyxFQUFFLGlFQUFhLENBQUMsU0FBUyxDQUFDLFdBQVc7b0JBQzFDLEtBQUssRUFBRSxhQUFhO2lCQUNyQixFQUFFO29CQUNELEtBQUssRUFBRSxpRUFBYSxDQUFDLFNBQVMsQ0FBQyxTQUFTO29CQUN4QyxLQUFLLEVBQUUsV0FBVztpQkFDbkIsRUFBRTtvQkFDRCxLQUFLLEVBQUUsaUVBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTTtvQkFDckMsS0FBSyxFQUFFLFFBQVE7aUJBQ2hCLENBQUM7U0FDSCxFQUFFO1lBQ0QsT0FBTyxFQUFFLE1BQU07WUFDZixPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFlBQVksRUFBRSxDQUFDO1lBQ2YsT0FBTyxFQUFFLGtCQUFrQjtZQUMzQixLQUFLLEVBQUUsTUFBTTtTQUNkLEVBQUU7WUFDRCxPQUFPLEVBQUUsYUFBYTtZQUN0QixPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLE9BQU8sRUFBRSxvQkFBb0I7WUFDN0IsS0FBSyxFQUFFLG1CQUFtQjtZQUMxQixPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUM7SUFDSixVQUFVLEVBQUU7UUFDVixFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtRQUM5QixFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRTtRQUM5QixFQUFFLFdBQVcsRUFBRSw0QkFBNEIsRUFBRTtLQUM5QztDQUNGLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvdWkvZGlhbG9ncy9jaG9yZENoYW5nZS50cz9iYzc3Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG5pbXBvcnQgeyBEaWFsb2dEZWZpbml0aW9uLCBTdWlEaWFsb2dCYXNlLCBTdWlEaWFsb2dQYXJhbXMgfSBmcm9tICcuL2RpYWxvZyc7XHJcbmltcG9ydCB7IFN1aUNob3JkQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL25vdGVUZXh0JztcclxuaW1wb3J0IHsgU3VpRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZHJvcGRvd24nO1xyXG5pbXBvcnQgeyBTdWlUb2dnbGVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdG9nZ2xlJztcclxuaW1wb3J0IHsgU3VpUm9ja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3JvY2tlcic7XHJcbmltcG9ydCB7S2V5RXZlbnQgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTbW9MeXJpYyB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL25vdGVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9TZWxlY3RvciB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9zZWxlY3Rpb25zJztcclxuaW1wb3J0IHsgU3VpSW5saW5lVGV4dCB9IGZyb20gJy4uLy4uL3JlbmRlci9zdWkvdGV4dFJlbmRlcic7XHJcbmltcG9ydCB7IFN1aUZvbnRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZm9udENvbXBvbmVudCc7XHJcbmltcG9ydCB7IEV2ZW50SGFuZGxlciB9IGZyb20gJy4uL2V2ZW50U291cmNlJztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuLyoqXHJcbiAqIENvbXBsZXggZGlhbG9nIGZvciBydW5uaW5nIGEgY2hvcmQgY2hhbmdlIGVkaXRpbmcgc2Vzc2lvbi5cclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aUNob3JkQ2hhbmdlRGlhbG9nIGV4dGVuZHMgU3VpRGlhbG9nQmFzZSB7XHJcbiAgc3RhdGljIGRpYWxvZ0VsZW1lbnRzOiBEaWFsb2dEZWZpbml0aW9uID1cclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnRWRpdCBDaG9yZCBTeW1ib2wnLCBlbGVtZW50czpcclxuICAgICAgICAgIFt7XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICd2ZXJzZScsXHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMCxcclxuICAgICAgICAgICAgY29udHJvbDogJ1N1aURyb3Bkb3duQ29tcG9uZW50JyxcclxuICAgICAgICAgICAgbGFiZWw6ICdPcmRpbmFsaXR5JyxcclxuICAgICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nJyxcclxuICAgICAgICAgICAgc3RhcnRSb3c6IHRydWUsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IFt7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IDAsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICcxJ1xyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IDEsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICcyJ1xyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IDIsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICczJ1xyXG4gICAgICAgICAgICB9XVxyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBzbW9OYW1lOiAndHJhbnNsYXRlWScsXHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMCxcclxuICAgICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nJyxcclxuICAgICAgICAgICAgY29udHJvbDogJ1N1aVJvY2tlckNvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnWSBBZGp1c3RtZW50IChQeCknLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2ludCdcclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgc21vTmFtZTogJ2Nob3JkRWRpdG9yJyxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxyXG4gICAgICAgICAgICBjbGFzc2VzOiAnc2hvdy1hbHdheXMnLFxyXG4gICAgICAgICAgICBjb250cm9sOiAnU3VpQ2hvcmRDb21wb25lbnQnLFxyXG4gICAgICAgICAgICBsYWJlbDogJ0VkaXQgVGV4dCcsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IFtdXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICdjaG9yZFN5bWJvbCcsXHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsXHJcbiAgICAgICAgICAgIGNsYXNzZXM6ICdzaG93LXdoZW4tZWRpdGluZycsXHJcbiAgICAgICAgICAgIGNvbnRyb2w6ICdTdWlEcm9wZG93bkNvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnQ2hvcmQgU3ltYm9sJyxcclxuICAgICAgICAgICAgc3RhcnRSb3c6IHRydWUsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IFt7XHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdjc3ltRGltaW5pc2hlZCcsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdEaW0nXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICB2YWx1ZTogJ2NzeW1IYWxmRGltaW5pc2hlZCcsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdIYWxmIGRpbSdcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIHZhbHVlOiAnY3N5bURpYWdvbmFsQXJyYW5nZW1lbnRTbGFzaCcsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdTbGFzaCdcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIHZhbHVlOiAnY3N5bU1ham9yU2V2ZW50aCcsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdNYWo3J1xyXG4gICAgICAgICAgICB9XVxyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBzbW9OYW1lOiAndGV4dFBvc2l0aW9uJyxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBTdWlJbmxpbmVUZXh0LnRleHRUeXBlcy5ub3JtYWwsXHJcbiAgICAgICAgICAgIGNsYXNzZXM6ICdzaG93LXdoZW4tZWRpdGluZycsXHJcbiAgICAgICAgICAgIGNvbnRyb2w6ICdTdWlEcm9wZG93bkNvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnVGV4dCBQb3NpdGlvbicsXHJcbiAgICAgICAgICAgIHN0YXJ0Um93OiB0cnVlLFxyXG4gICAgICAgICAgICBvcHRpb25zOiBbe1xyXG4gICAgICAgICAgICAgIHZhbHVlOiBTdWlJbmxpbmVUZXh0LnRleHRUeXBlcy5zdXBlclNjcmlwdCxcclxuICAgICAgICAgICAgICBsYWJlbDogJ1N1cGVyc2NyaXB0J1xyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IFN1aUlubGluZVRleHQudGV4dFR5cGVzLnN1YlNjcmlwdCxcclxuICAgICAgICAgICAgICBsYWJlbDogJ1N1YnNjcmlwdCdcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIHZhbHVlOiBTdWlJbmxpbmVUZXh0LnRleHRUeXBlcy5ub3JtYWwsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdOb3JtYWwnXHJcbiAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICdmb250JyxcclxuICAgICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nJyxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxyXG4gICAgICAgICAgICBjb250cm9sOiAnU3VpRm9udENvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnRm9udCdcclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgc21vTmFtZTogJ2FkanVzdFdpZHRoJyxcclxuICAgICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nJyxcclxuICAgICAgICAgICAgY29udHJvbDogJ1N1aVRvZ2dsZUNvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnQWRqdXN0IE5vdGUgV2lkdGgnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiBbXVxyXG4gICAgICAgICAgfV0sXHJcbiAgICAgICAgc3RhdGljVGV4dDogW1xyXG4gICAgICAgICAgeyBsYWJlbDogJ0VkaXQgQ2hvcmQgU3ltYm9sJyB9LFxyXG4gICAgICAgICAgeyB1bmRvOiAnVW5kbyBDaG9yZCBTeW1ib2xzJyB9LFxyXG4gICAgICAgICAgeyBkb25lRWRpdGluZzogJ0RvbmUgRWRpdGluZyBDaG9yZCBTeW1ib2xzJyB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9O1xyXG4gIGx5cmljOiBTbW9MeXJpYyB8IG51bGwgPSBudWxsO1xyXG4gIHNlbGVjdG9yOiBTbW9TZWxlY3RvciB8IG51bGwgPSBudWxsO1xyXG4gIG1vdXNlTW92ZUhhbmRsZXI6IEV2ZW50SGFuZGxlciB8IG51bGwgPSBudWxsO1xyXG4gIG1vdXNlQ2xpY2tIYW5kbGVyOiBFdmVudEhhbmRsZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocGFyYW1ldGVyczogU3VpRGlhbG9nUGFyYW1zKSB7XHJcbiAgICBzdXBlcihTdWlDaG9yZENoYW5nZURpYWxvZy5kaWFsb2dFbGVtZW50cywgcGFyYW1ldGVycyk7XHJcbiAgICBwYXJhbWV0ZXJzLmN0b3IgPSAnU3VpQ2hvcmRDaGFuZ2VEaWFsb2cnO1xyXG4gICAgdGhpcy5kaXNwbGF5T3B0aW9ucyA9IFsnQklORENPTVBPTkVOVFMnLCAnRFJBR0dBQkxFJywgJ0tFWUJPQVJEX0NBUFRVUkUnLCAnU0VMRUNUSU9OUE9TJ107XHJcbiAgfVxyXG4gIGdldCBjaG9yZEVkaXRvckN0cmwoKTogU3VpQ2hvcmRDb21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC5jaG9yZEVkaXRvckN0cmwgYXMgU3VpQ2hvcmRDb21wb25lbnQ7XHJcbiAgfVxyXG4gIGdldCBjaG9yZFN5bWJvbEN0cmwoKTogU3VpRHJvcGRvd25Db21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC5jaG9yZFN5bWJvbEN0cmwgYXMgU3VpRHJvcGRvd25Db21wb25lbnQ7XHJcbiAgfVxyXG4gIGdldCB0cmFuc2xhdGVZQ3RybCgpOiBTdWlSb2NrZXJDb21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC50cmFuc2xhdGVZQ3RybCBhcyBTdWlSb2NrZXJDb21wb25lbnQ7XHJcbiAgfVxyXG4gIGdldCB0ZXh0UG9zaXRpb25DdHJsKCk6IFN1aVJvY2tlckNvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLnRleHRQb3NpdGlvbkN0cmwgYXMgU3VpUm9ja2VyQ29tcG9uZW50O1xyXG4gIH1cclxuICBnZXQgYWRqdXN0V2lkdGhDdHJsKCk6IFN1aVRvZ2dsZUNvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLmFkanVzdFdpZHRoQ3RybCBhcyBTdWlUb2dnbGVDb21wb25lbnQ7XHJcbiAgfVxyXG4gIGdldCBmb250Q3RybCgpOiBTdWlGb250Q29tcG9uZW50IHtcclxuICAgIHJldHVybiB0aGlzLmNtYXAuZm9udEN0cmwgYXMgU3VpRm9udENvbXBvbmVudDtcclxuICB9XHJcbiAgY2hhbmdlZCgpIHtcclxuICAgIGxldCB2YWwgPSAnJztcclxuICAgIGlmICh0aGlzLmNob3JkU3ltYm9sQ3RybC5jaGFuZ2VGbGFnICYmIHRoaXMuY2hvcmRFZGl0b3JDdHJsLnJ1bm5pbmcpIHtcclxuICAgICAgdmFsID0gJ0AnICsgdGhpcy5jaG9yZFN5bWJvbEN0cmwuZ2V0VmFsdWUoKSArICdAJztcclxuICAgICAgdmFyICBrdjpLZXlFdmVudDtcclxuICAgICAgLyogICAgIHR5cGU6IHN0cmluZywgc2hpZnRLZXk6IGJvb2xlYW4sIGN0cmxLZXk6IGJvb2xlYW4sIGFsdEtleTogYm9vbGVhbiwga2V5OiBzdHJpbmcsIGtleUNvZGU6IHN0cmluZyxcclxuICAgIGNvZGU6IHN0cmluZyovXHJcbiAgICAgIHRoaXMuY2hvcmRFZGl0b3JDdHJsLmV2S2V5KHtcclxuICAgICAgICB0eXBlOiAna2V5ZG93bicsXHJcbiAgICAgICAgc2hpZnRLZXk6IGZhbHNlLFxyXG4gICAgICAgIGN0cmxLZXk6IGZhbHNlLFxyXG4gICAgICAgIGFsdEtleTogZmFsc2UsXHJcbiAgICAgICAga2V5OiB2YWwsXHJcbiAgICAgICAgY29kZTogdmFsLFxyXG4gICAgICAgIGV2ZW50OiBudWxsLFxyXG4gICAgICAgIGtleUNvZGU6IDBcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIE1vdmUgZm9jdXMgb3V0c2lkZSB0aGUgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGludGVyY2VwdCBrZXlzXHJcbiAgICAgIHRoaXMuY2hvcmRTeW1ib2xDdHJsLnVuc2VsZWN0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50cmFuc2xhdGVZQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIGlmICh0aGlzLmx5cmljICYmIHRoaXMuc2VsZWN0b3IpIHtcclxuICAgICAgICB0aGlzLmx5cmljLnRyYW5zbGF0ZVkgPSB0aGlzLnRyYW5zbGF0ZVlDdHJsLmdldFZhbHVlKCk7XHJcbiAgICAgICAgdGhpcy52aWV3LmFkZE9yVXBkYXRlTHlyaWModGhpcy5zZWxlY3RvciwgdGhpcy5seXJpYyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRleHRQb3NpdGlvbkN0cmwuY2hhbmdlRmxhZykge1xyXG4gICAgICB0aGlzLmNob3JkRWRpdG9yQ3RybC5zZXRUZXh0VHlwZSh0aGlzLnRleHRQb3NpdGlvbkN0cmwuZ2V0VmFsdWUoKSk7XHJcbiAgICAgICQodGhpcy50ZXh0UG9zaXRpb25DdHJsLl9nZXRJbnB1dEVsZW1lbnQoKSlbMF0uc2VsZWN0ZWRJbmRleCA9IC0xO1xyXG4gICAgICAkKHRoaXMudGV4dFBvc2l0aW9uQ3RybC5fZ2V0SW5wdXRFbGVtZW50KCkpLmJsdXIoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZvbnRDdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgY29uc3QgZm9udEluZm8gPSB0aGlzLmZvbnRDdHJsLmdldFZhbHVlKCk7XHJcbiAgICAgIHRoaXMudmlldy5zZXRDaG9yZEZvbnQoZm9udEluZm8pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYWRqdXN0V2lkdGhDdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgdGhpcy52aWV3LnNjb3JlLnNldENob3JkQWRqdXN0V2lkdGgodGhpcy5hZGp1c3RXaWR0aEN0cmwuZ2V0VmFsdWUoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNldEx5cmljKHNlbGVjdG9yOiBTbW9TZWxlY3RvciwgbHlyaWM6IFNtb0x5cmljKSB7XHJcbiAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XHJcbiAgICB0aGlzLmx5cmljID0gbHlyaWM7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVlDdHJsLnNldFZhbHVlKGx5cmljLnRyYW5zbGF0ZVkpO1xyXG4gIH1cclxuXHJcbiAgZGlzcGxheSgpIHtcclxuICAgIHN1cGVyLmRpc3BsYXkoKTtcclxuICAgIGNvbnN0IG1vdXNlbW92ZSA9IGFzeW5jIChldjogYW55KSA9PiB7IHRoaXMubW91c2VNb3ZlKGV2KTsgfVxyXG4gICAgY29uc3QgbW91c2VjbGljayA9IGFzeW5jIChldjogYW55KSA9PiB7IHRoaXMubW91c2VDbGljayhldik7IH0gICAgXHJcbiAgICB0aGlzLm1vdXNlTW92ZUhhbmRsZXIgPSB0aGlzLmV2ZW50U291cmNlLmJpbmRNb3VzZU1vdmVIYW5kbGVyKG1vdXNlbW92ZSk7XHJcbiAgICB0aGlzLm1vdXNlQ2xpY2tIYW5kbGVyID0gdGhpcy5ldmVudFNvdXJjZS5iaW5kTW91c2VDbGlja0hhbmRsZXIobW91c2VjbGljayk7XHJcbiAgICBpZiAodGhpcy5jaG9yZEVkaXRvckN0cmwgJiYgdGhpcy5jaG9yZEVkaXRvckN0cmwuc2Vzc2lvbiAmJiB0aGlzLmNob3JkRWRpdG9yQ3RybC5zZXNzaW9uLmx5cmljKSB7XHJcbiAgICAgIGNvbnN0IGx5cmljID0gdGhpcy5jaG9yZEVkaXRvckN0cmwuc2Vzc2lvbi5seXJpYztcclxuICAgICAgdGhpcy5hZGp1c3RXaWR0aEN0cmwuc2V0VmFsdWUobHlyaWMuYWRqdXN0Tm90ZVdpZHRoQ2hvcmQpO1xyXG4gICAgICB0aGlzLmZvbnRDdHJsLnNldFZhbHVlKHtcclxuICAgICAgICBmYW1pbHk6IGx5cmljLmZvbnRJbmZvLmZhbWlseSxcclxuICAgICAgICBzaXplOiBseXJpYy5mb250SW5mby5zaXplLCB3ZWlnaHQ6ICdub3JtYWwnXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYmluZEVsZW1lbnRzKCkge1xyXG4gICAgY29uc3QgZGdEb20gPSB0aGlzLmRnRG9tO1xyXG5cclxuICAgICQoZGdEb20uZWxlbWVudCkuZmluZCgnLm9rLWJ1dHRvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2NvbXBsZXRlKCk7XHJcbiAgICB9KTtcclxuICAgICQoZGdEb20uZWxlbWVudCkuZmluZCgnLmNhbmNlbC1idXR0b24nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLl9jb21wbGV0ZSgpO1xyXG4gICAgfSk7XHJcbiAgICAkKGRnRG9tLmVsZW1lbnQpLmZpbmQoJy5yZW1vdmUtYnV0dG9uJykucmVtb3ZlKCk7XHJcbiAgICAvLyB0aGlzLmNob3JkRWRpdG9yQ3RybC5zZXRWaWV3KHRoaXMuZXZlbnRTb3VyY2UsIHRoaXMudmlldyk7XHJcbiAgICB0aGlzLmNob3JkRWRpdG9yQ3RybC5zdGFydEVkaXRTZXNzaW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLyAjIyMgaGFuZGxlS2V5ZG93blxyXG4gIC8vIGFsbG93IGEgZGlhbG9nIHRvIGJlIGRpc21pc3NlZCBieSBlc2MuXHJcbiAgYXN5bmMgZXZLZXkoZXZkYXRhOiBhbnkpIHtcclxuICAgIGlmIChldmRhdGEua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAkKHRoaXMuZGdEb20uZWxlbWVudCkuZmluZCgnLmNhbmNlbC1idXR0b24nKS5jbGljaygpO1xyXG4gICAgICBldmRhdGEucHJldmVudERlZmF1bHQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5jaG9yZEVkaXRvckN0cmwucnVubmluZykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBlZGl0ZWQgPSBhd2FpdCB0aGlzLmNob3JkRWRpdG9yQ3RybC5ldktleShldmRhdGEpO1xyXG4gICAgICBpZiAoZWRpdGVkKSB7XHJcbiAgICAgICAgZXZkYXRhLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfY29tcGxldGUoKSB7XHJcbiAgICBpZiAodGhpcy5jaG9yZEVkaXRvckN0cmwucnVubmluZykge1xyXG4gICAgICB0aGlzLmNob3JkRWRpdG9yQ3RybC5lbmRTZXNzaW9uKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnZpZXcucmVuZGVyZXIuc2V0RGlydHkoKTtcclxuICAgIGlmICh0aGlzLm1vdXNlTW92ZUhhbmRsZXIpIHtcclxuICAgICAgdGhpcy5ldmVudFNvdXJjZS51bmJpbmRNb3VzZU1vdmVIYW5kbGVyKHRoaXMubW91c2VNb3ZlSGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tb3VzZUNsaWNrSGFuZGxlcikge1xyXG4gICAgICB0aGlzLmV2ZW50U291cmNlLnVuYmluZE1vdXNlQ2xpY2tIYW5kbGVyKHRoaXMubW91c2VDbGlja0hhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdzaG93QXR0cmlidXRlRGlhbG9nJyk7XHJcbiAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3RleHRFZGl0b3InKTtcclxuICAgIHRoaXMuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIG1vdXNlTW92ZShldjogYW55KSB7XHJcbiAgICBpZiAodGhpcy5jaG9yZEVkaXRvckN0cmwgJiYgdGhpcy5jaG9yZEVkaXRvckN0cmwucnVubmluZykge1xyXG4gICAgICB0aGlzLmNob3JkRWRpdG9yQ3RybC5tb3VzZU1vdmUoZXYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbW91c2VDbGljayhldjogYW55KSB7XHJcbiAgICBpZiAodGhpcy5jaG9yZEVkaXRvckN0cmwgJiYgdGhpcy5jaG9yZEVkaXRvckN0cmwucnVubmluZykge1xyXG4gICAgICB0aGlzLmNob3JkRWRpdG9yQ3RybC5tb3VzZUNsaWNrKGV2KTtcclxuICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59Il0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/dialogs/chordChange.ts\n\n}");
3608
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiChordChangeDialog: () => (/* binding */ SuiChordChangeDialog)\n/* harmony export */ });\n/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dialog */ \"./src/ui/dialogs/dialog.ts\");\n/* harmony import */ var _render_sui_textRender__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../render/sui/textRender */ \"./src/render/sui/textRender.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 * Complex dialog for running a chord change editing session.\n * @category SuiDialog\n */\nclass SuiChordChangeDialog extends _dialog__WEBPACK_IMPORTED_MODULE_0__.SuiDialogBase {\n constructor(parameters) {\n super(SuiChordChangeDialog.dialogElements, parameters);\n this.lyric = null;\n this.selector = null;\n this.mouseMoveHandler = null;\n this.mouseClickHandler = null;\n parameters.ctor = 'SuiChordChangeDialog';\n this.displayOptions = ['BINDCOMPONENTS', 'DRAGGABLE', 'KEYBOARD_CAPTURE', 'SELECTIONPOS'];\n }\n get chordEditorCtrl() {\n return this.cmap.chordEditorCtrl;\n }\n get chordSymbolCtrl() {\n return this.cmap.chordSymbolCtrl;\n }\n get translateYCtrl() {\n return this.cmap.translateYCtrl;\n }\n get textPositionCtrl() {\n return this.cmap.textPositionCtrl;\n }\n get adjustWidthCtrl() {\n return this.cmap.adjustWidthCtrl;\n }\n get fontCtrl() {\n return this.cmap.fontCtrl;\n }\n changed() {\n return __awaiter(this, void 0, void 0, function* () {\n let val = '';\n if (this.chordSymbolCtrl.changeFlag && this.chordEditorCtrl.running) {\n val = '@' + this.chordSymbolCtrl.getValue() + '@';\n var kv;\n /* type: string, shiftKey: boolean, ctrlKey: boolean, altKey: boolean, key: string, keyCode: string,\n code: string*/\n this.chordEditorCtrl.evKey({\n type: 'keydown',\n shiftKey: false,\n ctrlKey: false,\n altKey: false,\n key: val,\n code: val,\n event: null,\n keyCode: 0\n });\n // Move focus outside the element so it doesn't intercept keys\n this.chordSymbolCtrl.unselect();\n }\n if (this.translateYCtrl.changeFlag) {\n if (this.lyric && this.selector) {\n this.lyric.translateY = this.translateYCtrl.getValue();\n this.view.addOrUpdateLyric(this.selector, this.lyric);\n }\n }\n if (this.textPositionCtrl.changeFlag) {\n this.chordEditorCtrl.setTextType(this.textPositionCtrl.getValue());\n $(this.textPositionCtrl._getInputElement())[0].selectedIndex = -1;\n $(this.textPositionCtrl._getInputElement()).blur();\n }\n if (this.fontCtrl.changeFlag) {\n const fontInfo = this.fontCtrl.getValue();\n this.view.setChordFont(fontInfo);\n }\n if (this.adjustWidthCtrl.changeFlag) {\n this.view.score.setChordAdjustWidth(this.adjustWidthCtrl.getValue());\n }\n });\n }\n setLyric(selector, lyric) {\n this.selector = selector;\n this.lyric = lyric;\n this.translateYCtrl.setValue(lyric.translateY);\n }\n display() {\n super.display();\n const mousemove = (ev) => __awaiter(this, void 0, void 0, function* () { this.mouseMove(ev); });\n const mouseclick = (ev) => __awaiter(this, void 0, void 0, function* () { this.mouseClick(ev); });\n this.mouseMoveHandler = this.eventSource.bindMouseMoveHandler(mousemove);\n this.mouseClickHandler = this.eventSource.bindMouseClickHandler(mouseclick);\n if (this.chordEditorCtrl && this.chordEditorCtrl.session && this.chordEditorCtrl.session.lyric) {\n const lyric = this.chordEditorCtrl.session.lyric;\n this.adjustWidthCtrl.setValue(lyric.adjustNoteWidthChord);\n this.fontCtrl.setValue({\n family: lyric.fontInfo.family,\n size: lyric.fontInfo.size, weight: 'normal'\n });\n }\n }\n bindElements() {\n const dgDom = this.dgDom;\n $(dgDom.element).find('.ok-button').off('click').on('click', () => {\n this._complete();\n });\n $(dgDom.element).find('.cancel-button').off('click').on('click', () => {\n this._complete();\n });\n $(dgDom.element).find('.remove-button').remove();\n // this.chordEditorCtrl.setView(this.eventSource, this.view);\n this.chordEditorCtrl.startEditSession();\n }\n // ### handleKeydown\n // allow a dialog to be dismissed by esc.\n evKey(evdata) {\n return __awaiter(this, void 0, void 0, function* () {\n if (evdata.key === 'Escape') {\n $(this.dgDom.element).find('.cancel-button').click();\n evdata.preventDefault();\n }\n else {\n if (!this.chordEditorCtrl.running) {\n return;\n }\n const edited = yield this.chordEditorCtrl.evKey(evdata);\n if (edited) {\n evdata.stopPropagation();\n }\n }\n });\n }\n _complete() {\n if (this.chordEditorCtrl.running) {\n this.chordEditorCtrl.endSession();\n }\n this.view.renderer.setDirty();\n if (this.mouseMoveHandler) {\n this.eventSource.unbindMouseMoveHandler(this.mouseMoveHandler);\n }\n if (this.mouseClickHandler) {\n this.eventSource.unbindMouseClickHandler(this.mouseClickHandler);\n }\n $('body').removeClass('showAttributeDialog');\n $('body').removeClass('textEditor');\n this.complete();\n }\n mouseMove(ev) {\n if (this.chordEditorCtrl && this.chordEditorCtrl.running) {\n this.chordEditorCtrl.mouseMove(ev);\n }\n }\n mouseClick(ev) {\n if (this.chordEditorCtrl && this.chordEditorCtrl.running) {\n this.chordEditorCtrl.mouseClick(ev);\n ev.stopPropagation();\n }\n }\n}\nSuiChordChangeDialog.dialogElements = {\n label: 'Edit Chord Symbol', elements: [{\n smoName: 'verse',\n defaultValue: 0,\n control: 'SuiDropdownComponent',\n label: 'Ordinality',\n classes: 'hide-when-editing',\n startRow: true,\n options: [{\n value: 0,\n label: '1'\n }, {\n value: 1,\n label: '2'\n }, {\n value: 2,\n label: '3'\n }]\n }, {\n smoName: 'translateY',\n defaultValue: 0,\n classes: 'hide-when-editing',\n control: 'SuiRockerComponent',\n label: 'Y Adjustment (Px)',\n dataType: 'int'\n }, {\n smoName: 'chordEditor',\n defaultValue: 0,\n classes: 'show-always',\n control: 'SuiChordComponent',\n label: 'Edit Text',\n options: []\n }, {\n smoName: 'chordSymbol',\n defaultValue: '',\n classes: 'show-when-editing',\n control: 'SuiDropdownComponent',\n label: 'Chord Symbol',\n startRow: true,\n options: [{\n value: 'csymDiminished',\n label: 'Dim'\n }, {\n value: 'csymHalfDiminished',\n label: 'Half dim'\n }, {\n value: 'csymDiagonalArrangementSlash',\n label: 'Slash'\n }, {\n value: 'csymMajorSeventh',\n label: 'Maj7'\n }]\n }, {\n smoName: 'textPosition',\n defaultValue: _render_sui_textRender__WEBPACK_IMPORTED_MODULE_1__.SuiInlineText.textTypes.normal,\n classes: 'show-when-editing',\n control: 'SuiDropdownComponent',\n label: 'Text Position',\n startRow: true,\n options: [{\n value: _render_sui_textRender__WEBPACK_IMPORTED_MODULE_1__.SuiInlineText.textTypes.superScript,\n label: 'Superscript'\n }, {\n value: _render_sui_textRender__WEBPACK_IMPORTED_MODULE_1__.SuiInlineText.textTypes.subScript,\n label: 'Subscript'\n }, {\n value: _render_sui_textRender__WEBPACK_IMPORTED_MODULE_1__.SuiInlineText.textTypes.normal,\n label: 'Normal'\n }]\n }, {\n smoName: 'font',\n classes: 'hide-when-editing',\n defaultValue: 0,\n control: 'SuiFontComponent',\n label: 'Font'\n }, {\n smoName: 'adjustWidth',\n classes: 'hide-when-editing',\n control: 'SuiToggleComponent',\n label: 'Adjust Note Width',\n options: []\n }],\n staticText: [\n { label: 'Edit Chord Symbol' },\n { undo: 'Undo Chord Symbols' },\n { doneEditing: 'Done Editing Chord Symbols' }\n ]\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QjtZQUM1QixPQUFPLEVBQUUsc0JBQXNCO1lBQy9CLEtBQUssRUFBRSxlQUFlO1lBQ3RCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsT0FBTyxFQUFFLENBQUM7b0JBQ1IsS0FBSyxFQUFFLGlFQUFhLENBQUMsU0FBUyxDQUFDLFdBQVc7b0JBQzFDLEtBQUssRUFBRSxhQUFhO2lCQUNyQixFQUFFO29CQUNELEtBQUssRUFBRSxpRUFBYSxDQUFDLFNBQVMsQ0FBQyxTQUFTO29CQUN4QyxLQUFLLEVBQUUsV0FBVztpQkFDbkIsRUFBRTtvQkFDRCxLQUFLLEVBQUUsaUVBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTTtvQkFDckMsS0FBSyxFQUFFLFFBQVE7aUJBQ2hCLENBQUM7U0FDSCxFQUFFO1lBQ0QsT0FBTyxFQUFFLE1BQU07WUFDZixPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFlBQVksRUFBRSxDQUFDO1lBQ2YsT0FBTyxFQUFFLGtCQUFrQjtZQUMzQixLQUFLLEVBQUUsTUFBTTtTQUNkLEVBQUU7WUFDRCxPQUFPLEVBQUUsYUFBYTtZQUN0QixPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLE9BQU8sRUFBRSxvQkFBb0I7WUFDN0IsS0FBSyxFQUFFLG1CQUFtQjtZQUMxQixPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUM7SUFDSixVQUFVLEVBQUU7UUFDVixFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtRQUM5QixFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRTtRQUM5QixFQUFFLFdBQVcsRUFBRSw0QkFBNEIsRUFBRTtLQUM5QztDQUNGLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvdWkvZGlhbG9ncy9jaG9yZENoYW5nZS50cz9iYzc3Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG5pbXBvcnQgeyBEaWFsb2dEZWZpbml0aW9uLCBTdWlEaWFsb2dCYXNlLCBTdWlEaWFsb2dQYXJhbXMgfSBmcm9tICcuL2RpYWxvZyc7XHJcbmltcG9ydCB7IFN1aUNob3JkQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL25vdGVUZXh0JztcclxuaW1wb3J0IHsgU3VpRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZHJvcGRvd24nO1xyXG5pbXBvcnQgeyBTdWlUb2dnbGVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdG9nZ2xlJztcclxuaW1wb3J0IHsgU3VpUm9ja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3JvY2tlcic7XHJcbmltcG9ydCB7S2V5RXZlbnQgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTbW9MeXJpYyB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL25vdGVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9TZWxlY3RvciB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9zZWxlY3Rpb25zJztcclxuaW1wb3J0IHsgU3VpSW5saW5lVGV4dCB9IGZyb20gJy4uLy4uL3JlbmRlci9zdWkvdGV4dFJlbmRlcic7XHJcbmltcG9ydCB7IFN1aUZvbnRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZm9udENvbXBvbmVudCc7XHJcbmltcG9ydCB7IEV2ZW50SGFuZGxlciB9IGZyb20gJy4uL2V2ZW50U291cmNlJztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuLyoqXHJcbiAqIENvbXBsZXggZGlhbG9nIGZvciBydW5uaW5nIGEgY2hvcmQgY2hhbmdlIGVkaXRpbmcgc2Vzc2lvbi5cclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aUNob3JkQ2hhbmdlRGlhbG9nIGV4dGVuZHMgU3VpRGlhbG9nQmFzZSB7XHJcbiAgc3RhdGljIGRpYWxvZ0VsZW1lbnRzOiBEaWFsb2dEZWZpbml0aW9uID1cclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnRWRpdCBDaG9yZCBTeW1ib2wnLCBlbGVtZW50czpcclxuICAgICAgICAgIFt7XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICd2ZXJzZScsXHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMCxcclxuICAgICAgICAgICAgY29udHJvbDogJ1N1aURyb3Bkb3duQ29tcG9uZW50JyxcclxuICAgICAgICAgICAgbGFiZWw6ICdPcmRpbmFsaXR5JyxcclxuICAgICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nJyxcclxuICAgICAgICAgICAgc3RhcnRSb3c6IHRydWUsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IFt7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IDAsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICcxJ1xyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IDEsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICcyJ1xyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IDIsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICczJ1xyXG4gICAgICAgICAgICB9XVxyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBzbW9OYW1lOiAndHJhbnNsYXRlWScsXHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMCxcclxuICAgICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nJyxcclxuICAgICAgICAgICAgY29udHJvbDogJ1N1aVJvY2tlckNvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnWSBBZGp1c3RtZW50IChQeCknLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2ludCdcclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgc21vTmFtZTogJ2Nob3JkRWRpdG9yJyxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxyXG4gICAgICAgICAgICBjbGFzc2VzOiAnc2hvdy1hbHdheXMnLFxyXG4gICAgICAgICAgICBjb250cm9sOiAnU3VpQ2hvcmRDb21wb25lbnQnLFxyXG4gICAgICAgICAgICBsYWJlbDogJ0VkaXQgVGV4dCcsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IFtdXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICdjaG9yZFN5bWJvbCcsXHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsXHJcbiAgICAgICAgICAgIGNsYXNzZXM6ICdzaG93LXdoZW4tZWRpdGluZycsXHJcbiAgICAgICAgICAgIGNvbnRyb2w6ICdTdWlEcm9wZG93bkNvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnQ2hvcmQgU3ltYm9sJyxcclxuICAgICAgICAgICAgc3RhcnRSb3c6IHRydWUsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IFt7XHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdjc3ltRGltaW5pc2hlZCcsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdEaW0nXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICB2YWx1ZTogJ2NzeW1IYWxmRGltaW5pc2hlZCcsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdIYWxmIGRpbSdcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIHZhbHVlOiAnY3N5bURpYWdvbmFsQXJyYW5nZW1lbnRTbGFzaCcsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdTbGFzaCdcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIHZhbHVlOiAnY3N5bU1ham9yU2V2ZW50aCcsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdNYWo3J1xyXG4gICAgICAgICAgICB9XVxyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBzbW9OYW1lOiAndGV4dFBvc2l0aW9uJyxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBTdWlJbmxpbmVUZXh0LnRleHRUeXBlcy5ub3JtYWwsXHJcbiAgICAgICAgICAgIGNsYXNzZXM6ICdzaG93LXdoZW4tZWRpdGluZycsXHJcbiAgICAgICAgICAgIGNvbnRyb2w6ICdTdWlEcm9wZG93bkNvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnVGV4dCBQb3NpdGlvbicsXHJcbiAgICAgICAgICAgIHN0YXJ0Um93OiB0cnVlLFxyXG4gICAgICAgICAgICBvcHRpb25zOiBbe1xyXG4gICAgICAgICAgICAgIHZhbHVlOiBTdWlJbmxpbmVUZXh0LnRleHRUeXBlcy5zdXBlclNjcmlwdCxcclxuICAgICAgICAgICAgICBsYWJlbDogJ1N1cGVyc2NyaXB0J1xyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgdmFsdWU6IFN1aUlubGluZVRleHQudGV4dFR5cGVzLnN1YlNjcmlwdCxcclxuICAgICAgICAgICAgICBsYWJlbDogJ1N1YnNjcmlwdCdcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIHZhbHVlOiBTdWlJbmxpbmVUZXh0LnRleHRUeXBlcy5ub3JtYWwsXHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdOb3JtYWwnXHJcbiAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICdmb250JyxcclxuICAgICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nJyxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxyXG4gICAgICAgICAgICBjb250cm9sOiAnU3VpRm9udENvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnRm9udCdcclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgc21vTmFtZTogJ2FkanVzdFdpZHRoJyxcclxuICAgICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nJyxcclxuICAgICAgICAgICAgY29udHJvbDogJ1N1aVRvZ2dsZUNvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnQWRqdXN0IE5vdGUgV2lkdGgnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiBbXVxyXG4gICAgICAgICAgfV0sXHJcbiAgICAgICAgc3RhdGljVGV4dDogW1xyXG4gICAgICAgICAgeyBsYWJlbDogJ0VkaXQgQ2hvcmQgU3ltYm9sJyB9LFxyXG4gICAgICAgICAgeyB1bmRvOiAnVW5kbyBDaG9yZCBTeW1ib2xzJyB9LFxyXG4gICAgICAgICAgeyBkb25lRWRpdGluZzogJ0RvbmUgRWRpdGluZyBDaG9yZCBTeW1ib2xzJyB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9O1xyXG4gIGx5cmljOiBTbW9MeXJpYyB8IG51bGwgPSBudWxsO1xyXG4gIHNlbGVjdG9yOiBTbW9TZWxlY3RvciB8IG51bGwgPSBudWxsO1xyXG4gIG1vdXNlTW92ZUhhbmRsZXI6IEV2ZW50SGFuZGxlciB8IG51bGwgPSBudWxsO1xyXG4gIG1vdXNlQ2xpY2tIYW5kbGVyOiBFdmVudEhhbmRsZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocGFyYW1ldGVyczogU3VpRGlhbG9nUGFyYW1zKSB7XHJcbiAgICBzdXBlcihTdWlDaG9yZENoYW5nZURpYWxvZy5kaWFsb2dFbGVtZW50cywgcGFyYW1ldGVycyk7XHJcbiAgICBwYXJhbWV0ZXJzLmN0b3IgPSAnU3VpQ2hvcmRDaGFuZ2VEaWFsb2cnO1xyXG4gICAgdGhpcy5kaXNwbGF5T3B0aW9ucyA9IFsnQklORENPTVBPTkVOVFMnLCAnRFJBR0dBQkxFJywgJ0tFWUJPQVJEX0NBUFRVUkUnLCAnU0VMRUNUSU9OUE9TJ107XHJcbiAgfVxyXG4gIGdldCBjaG9yZEVkaXRvckN0cmwoKTogU3VpQ2hvcmRDb21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC5jaG9yZEVkaXRvckN0cmwgYXMgU3VpQ2hvcmRDb21wb25lbnQ7XHJcbiAgfVxyXG4gIGdldCBjaG9yZFN5bWJvbEN0cmwoKTogU3VpRHJvcGRvd25Db21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC5jaG9yZFN5bWJvbEN0cmwgYXMgU3VpRHJvcGRvd25Db21wb25lbnQ7XHJcbiAgfVxyXG4gIGdldCB0cmFuc2xhdGVZQ3RybCgpOiBTdWlSb2NrZXJDb21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC50cmFuc2xhdGVZQ3RybCBhcyBTdWlSb2NrZXJDb21wb25lbnQ7XHJcbiAgfVxyXG4gIGdldCB0ZXh0UG9zaXRpb25DdHJsKCk6IFN1aVJvY2tlckNvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLnRleHRQb3NpdGlvbkN0cmwgYXMgU3VpUm9ja2VyQ29tcG9uZW50O1xyXG4gIH1cclxuICBnZXQgYWRqdXN0V2lkdGhDdHJsKCk6IFN1aVRvZ2dsZUNvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLmFkanVzdFdpZHRoQ3RybCBhcyBTdWlUb2dnbGVDb21wb25lbnQ7XHJcbiAgfVxyXG4gIGdldCBmb250Q3RybCgpOiBTdWlGb250Q29tcG9uZW50IHtcclxuICAgIHJldHVybiB0aGlzLmNtYXAuZm9udEN0cmwgYXMgU3VpRm9udENvbXBvbmVudDtcclxuICB9XHJcbiAgYXN5bmMgY2hhbmdlZCgpIHtcclxuICAgIGxldCB2YWwgPSAnJztcclxuICAgIGlmICh0aGlzLmNob3JkU3ltYm9sQ3RybC5jaGFuZ2VGbGFnICYmIHRoaXMuY2hvcmRFZGl0b3JDdHJsLnJ1bm5pbmcpIHtcclxuICAgICAgdmFsID0gJ0AnICsgdGhpcy5jaG9yZFN5bWJvbEN0cmwuZ2V0VmFsdWUoKSArICdAJztcclxuICAgICAgdmFyICBrdjpLZXlFdmVudDtcclxuICAgICAgLyogICAgIHR5cGU6IHN0cmluZywgc2hpZnRLZXk6IGJvb2xlYW4sIGN0cmxLZXk6IGJvb2xlYW4sIGFsdEtleTogYm9vbGVhbiwga2V5OiBzdHJpbmcsIGtleUNvZGU6IHN0cmluZyxcclxuICAgIGNvZGU6IHN0cmluZyovXHJcbiAgICAgIHRoaXMuY2hvcmRFZGl0b3JDdHJsLmV2S2V5KHtcclxuICAgICAgICB0eXBlOiAna2V5ZG93bicsXHJcbiAgICAgICAgc2hpZnRLZXk6IGZhbHNlLFxyXG4gICAgICAgIGN0cmxLZXk6IGZhbHNlLFxyXG4gICAgICAgIGFsdEtleTogZmFsc2UsXHJcbiAgICAgICAga2V5OiB2YWwsXHJcbiAgICAgICAgY29kZTogdmFsLFxyXG4gICAgICAgIGV2ZW50OiBudWxsLFxyXG4gICAgICAgIGtleUNvZGU6IDBcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIE1vdmUgZm9jdXMgb3V0c2lkZSB0aGUgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGludGVyY2VwdCBrZXlzXHJcbiAgICAgIHRoaXMuY2hvcmRTeW1ib2xDdHJsLnVuc2VsZWN0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50cmFuc2xhdGVZQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIGlmICh0aGlzLmx5cmljICYmIHRoaXMuc2VsZWN0b3IpIHtcclxuICAgICAgICB0aGlzLmx5cmljLnRyYW5zbGF0ZVkgPSB0aGlzLnRyYW5zbGF0ZVlDdHJsLmdldFZhbHVlKCk7XHJcbiAgICAgICAgdGhpcy52aWV3LmFkZE9yVXBkYXRlTHlyaWModGhpcy5zZWxlY3RvciwgdGhpcy5seXJpYyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRleHRQb3NpdGlvbkN0cmwuY2hhbmdlRmxhZykge1xyXG4gICAgICB0aGlzLmNob3JkRWRpdG9yQ3RybC5zZXRUZXh0VHlwZSh0aGlzLnRleHRQb3NpdGlvbkN0cmwuZ2V0VmFsdWUoKSk7XHJcbiAgICAgICQodGhpcy50ZXh0UG9zaXRpb25DdHJsLl9nZXRJbnB1dEVsZW1lbnQoKSlbMF0uc2VsZWN0ZWRJbmRleCA9IC0xO1xyXG4gICAgICAkKHRoaXMudGV4dFBvc2l0aW9uQ3RybC5fZ2V0SW5wdXRFbGVtZW50KCkpLmJsdXIoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZvbnRDdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgY29uc3QgZm9udEluZm8gPSB0aGlzLmZvbnRDdHJsLmdldFZhbHVlKCk7XHJcbiAgICAgIHRoaXMudmlldy5zZXRDaG9yZEZvbnQoZm9udEluZm8pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYWRqdXN0V2lkdGhDdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgdGhpcy52aWV3LnNjb3JlLnNldENob3JkQWRqdXN0V2lkdGgodGhpcy5hZGp1c3RXaWR0aEN0cmwuZ2V0VmFsdWUoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNldEx5cmljKHNlbGVjdG9yOiBTbW9TZWxlY3RvciwgbHlyaWM6IFNtb0x5cmljKSB7XHJcbiAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XHJcbiAgICB0aGlzLmx5cmljID0gbHlyaWM7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVlDdHJsLnNldFZhbHVlKGx5cmljLnRyYW5zbGF0ZVkpO1xyXG4gIH1cclxuXHJcbiAgZGlzcGxheSgpIHtcclxuICAgIHN1cGVyLmRpc3BsYXkoKTtcclxuICAgIGNvbnN0IG1vdXNlbW92ZSA9IGFzeW5jIChldjogYW55KSA9PiB7IHRoaXMubW91c2VNb3ZlKGV2KTsgfVxyXG4gICAgY29uc3QgbW91c2VjbGljayA9IGFzeW5jIChldjogYW55KSA9PiB7IHRoaXMubW91c2VDbGljayhldik7IH0gICAgXHJcbiAgICB0aGlzLm1vdXNlTW92ZUhhbmRsZXIgPSB0aGlzLmV2ZW50U291cmNlLmJpbmRNb3VzZU1vdmVIYW5kbGVyKG1vdXNlbW92ZSk7XHJcbiAgICB0aGlzLm1vdXNlQ2xpY2tIYW5kbGVyID0gdGhpcy5ldmVudFNvdXJjZS5iaW5kTW91c2VDbGlja0hhbmRsZXIobW91c2VjbGljayk7XHJcbiAgICBpZiAodGhpcy5jaG9yZEVkaXRvckN0cmwgJiYgdGhpcy5jaG9yZEVkaXRvckN0cmwuc2Vzc2lvbiAmJiB0aGlzLmNob3JkRWRpdG9yQ3RybC5zZXNzaW9uLmx5cmljKSB7XHJcbiAgICAgIGNvbnN0IGx5cmljID0gdGhpcy5jaG9yZEVkaXRvckN0cmwuc2Vzc2lvbi5seXJpYztcclxuICAgICAgdGhpcy5hZGp1c3RXaWR0aEN0cmwuc2V0VmFsdWUobHlyaWMuYWRqdXN0Tm90ZVdpZHRoQ2hvcmQpO1xyXG4gICAgICB0aGlzLmZvbnRDdHJsLnNldFZhbHVlKHtcclxuICAgICAgICBmYW1pbHk6IGx5cmljLmZvbnRJbmZvLmZhbWlseSxcclxuICAgICAgICBzaXplOiBseXJpYy5mb250SW5mby5zaXplLCB3ZWlnaHQ6ICdub3JtYWwnXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYmluZEVsZW1lbnRzKCkge1xyXG4gICAgY29uc3QgZGdEb20gPSB0aGlzLmRnRG9tO1xyXG5cclxuICAgICQoZGdEb20uZWxlbWVudCkuZmluZCgnLm9rLWJ1dHRvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2NvbXBsZXRlKCk7XHJcbiAgICB9KTtcclxuICAgICQoZGdEb20uZWxlbWVudCkuZmluZCgnLmNhbmNlbC1idXR0b24nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLl9jb21wbGV0ZSgpO1xyXG4gICAgfSk7XHJcbiAgICAkKGRnRG9tLmVsZW1lbnQpLmZpbmQoJy5yZW1vdmUtYnV0dG9uJykucmVtb3ZlKCk7XHJcbiAgICAvLyB0aGlzLmNob3JkRWRpdG9yQ3RybC5zZXRWaWV3KHRoaXMuZXZlbnRTb3VyY2UsIHRoaXMudmlldyk7XHJcbiAgICB0aGlzLmNob3JkRWRpdG9yQ3RybC5zdGFydEVkaXRTZXNzaW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLyAjIyMgaGFuZGxlS2V5ZG93blxyXG4gIC8vIGFsbG93IGEgZGlhbG9nIHRvIGJlIGRpc21pc3NlZCBieSBlc2MuXHJcbiAgYXN5bmMgZXZLZXkoZXZkYXRhOiBhbnkpIHtcclxuICAgIGlmIChldmRhdGEua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAkKHRoaXMuZGdEb20uZWxlbWVudCkuZmluZCgnLmNhbmNlbC1idXR0b24nKS5jbGljaygpO1xyXG4gICAgICBldmRhdGEucHJldmVudERlZmF1bHQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5jaG9yZEVkaXRvckN0cmwucnVubmluZykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBlZGl0ZWQgPSBhd2FpdCB0aGlzLmNob3JkRWRpdG9yQ3RybC5ldktleShldmRhdGEpO1xyXG4gICAgICBpZiAoZWRpdGVkKSB7XHJcbiAgICAgICAgZXZkYXRhLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfY29tcGxldGUoKSB7XHJcbiAgICBpZiAodGhpcy5jaG9yZEVkaXRvckN0cmwucnVubmluZykge1xyXG4gICAgICB0aGlzLmNob3JkRWRpdG9yQ3RybC5lbmRTZXNzaW9uKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnZpZXcucmVuZGVyZXIuc2V0RGlydHkoKTtcclxuICAgIGlmICh0aGlzLm1vdXNlTW92ZUhhbmRsZXIpIHtcclxuICAgICAgdGhpcy5ldmVudFNvdXJjZS51bmJpbmRNb3VzZU1vdmVIYW5kbGVyKHRoaXMubW91c2VNb3ZlSGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tb3VzZUNsaWNrSGFuZGxlcikge1xyXG4gICAgICB0aGlzLmV2ZW50U291cmNlLnVuYmluZE1vdXNlQ2xpY2tIYW5kbGVyKHRoaXMubW91c2VDbGlja0hhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdzaG93QXR0cmlidXRlRGlhbG9nJyk7XHJcbiAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3RleHRFZGl0b3InKTtcclxuICAgIHRoaXMuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIG1vdXNlTW92ZShldjogYW55KSB7XHJcbiAgICBpZiAodGhpcy5jaG9yZEVkaXRvckN0cmwgJiYgdGhpcy5jaG9yZEVkaXRvckN0cmwucnVubmluZykge1xyXG4gICAgICB0aGlzLmNob3JkRWRpdG9yQ3RybC5tb3VzZU1vdmUoZXYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbW91c2VDbGljayhldjogYW55KSB7XHJcbiAgICBpZiAodGhpcy5jaG9yZEVkaXRvckN0cmwgJiYgdGhpcy5jaG9yZEVkaXRvckN0cmwucnVubmluZykge1xyXG4gICAgICB0aGlzLmNob3JkRWRpdG9yQ3RybC5tb3VzZUNsaWNrKGV2KTtcclxuICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59Il0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/dialogs/chordChange.ts\n\n}");
3609
3609
 
3610
3610
  /***/ },
3611
3611
 
@@ -3627,7 +3627,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
3627
3627
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3628
3628
 
3629
3629
  "use strict";
3630
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SmoDynamicComponentCtor: () => (/* binding */ SmoDynamicComponentCtor),\n/* harmony export */ SuiComponentBase: () => (/* binding */ SuiComponentBase),\n/* harmony export */ SuiComponentParent: () => (/* binding */ SuiComponentParent),\n/* harmony export */ SuiCompositeBase: () => (/* binding */ SuiCompositeBase),\n/* harmony export */ SuiDialogNotifier: () => (/* binding */ SuiDialogNotifier)\n/* harmony export */ });\n/**\n * components know about their parent dialog via the\n * DialogNotifier interface. It allows a component to\n * notify parent of changing contents.\n * @category SuiDialog\n */\nclass SuiDialogNotifier {\n}\n/**\n * base class for Dialog components. Notifies parent\n * dialog of state change via `change()`\n * @category SuiDialog\n */\nclass SuiComponentBase {\n constructor(dialog, parameters) {\n var _a;\n this.changeFlag = false;\n this.changeFlag = false;\n this.css = parameters.classes;\n this.dialog = dialog;\n this.id = parameters.id;\n this.label = parameters.label;\n this.control = parameters.control;\n this.smoName = parameters.smoName;\n this.noProperty = (_a = parameters.noProperty) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Called by the derived class when the value changes. The change flag is set to true, so the dialog will\n * know which component changed.\n */\n handleChanged() {\n this.changeFlag = true;\n this.dialog.changed();\n this.changeFlag = false;\n }\n /**\n * combine component classes with string, used for composites\n * @param classes string ot append\n * @returns combined strings\n */\n makeClasses(classes) {\n if (this.css) {\n return classes + ' ' + this.css;\n }\n return classes;\n }\n get parameterId() {\n return this.dialog.getId() + '-' + this.smoName;\n }\n show() {\n $('#' + this.parameterId).removeClass('hide');\n }\n hide() {\n $('#' + this.parameterId).addClass('hide');\n }\n}\n/**\n * Parent components are really containers for other components\n * For instance, FontComponent has size, family, weight, etc.\n *\n * @category SuiDialog\n */\nclass SuiComponentParent extends SuiComponentBase {\n}\nclass SuiCompositeBase extends SuiComponentBase {\n constructor(dialog, params) {\n super(dialog, params);\n if (!params.parentComponent) {\n throw ('invalid parent component');\n }\n this.parentControl = params.parentComponent;\n }\n}\nconst SmoDynamicComponentCtor = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL2Jhc2VDb21wb25lbnQudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFrRUE7Ozs7O0dBS0c7QUFDSSxNQUFlLGlCQUFpQjtDQWlDdEM7QUFDRDs7OztHQUlHO0FBQ0ksTUFBZSxnQkFBZ0I7SUFTcEMsWUFBWSxNQUF5QixFQUFFLFVBQWtDOztRQVJ6RSxlQUFVLEdBQVksS0FBSyxDQUFDO1FBUzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxnQkFBVSxDQUFDLFVBQVUsbUNBQUksS0FBSyxDQUFDO0lBQ25ELENBQUM7SUFZRDs7O09BR0c7SUFDSCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxPQUFlO1FBQ3pCLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2IsT0FBTyxPQUFPLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDbEMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDbEQsQ0FBQztJQUNELElBQUk7UUFDRixDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELElBQUk7UUFDRixDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGO0FBRUQ7Ozs7O0dBS0c7QUFDSSxNQUFlLGtCQUFtQixTQUFRLGdCQUFnQjtDQU1oRTtBQUVNLE1BQWUsZ0JBQWlCLFNBQVEsZ0JBQWdCO0lBRTdELFlBQVksTUFBeUIsRUFBRSxNQUE4QjtRQUNuRSxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDNUIsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztJQUM5QyxDQUFDO0NBQ0Y7QUFFTSxNQUFNLHVCQUF1QixHQUF5QyxFQUFFLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL2Jhc2VDb21wb25lbnQudHM/ZGI1NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuaW1wb3J0IHsgU21vTW9kaWZpZXIgfSBmcm9tICcuLi8uLi8uLi9zbW8vZGF0YS9zY29yZSc7XHJcbmltcG9ydCB7IFN1aVNjb3JlVmlld09wZXJhdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9yZW5kZXIvc3VpL3Njb3JlVmlld09wZXJhdGlvbnMnO1xyXG5pbXBvcnQgeyBCcm93c2VyRXZlbnRTb3VyY2UgfSBmcm9tICcuLi8uLi9ldmVudFNvdXJjZSc7XHJcbi8qKlxyXG4gKiBBIGNvbXBvbmVudCBpcyBhIHBhcnQgb2YgYSBkaWFsb2cgYm94IHRoYXQgYWNjZXB0cyBzb21lIGlucHV0LlxyXG4gKi9cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG4vKipcclxuICogRGlhbG9ncyBjb250cm9scyBvcHRpb25zLCBsaWtlIGRyb3Bkb3duc1xyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIERpYWxvZ0RlZmluaXRpb25PcHRpb24ge1xyXG4gIGNzcz86IHN0cmluZyxcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcclxufVxyXG4vKipcclxuICogRGlhbG9nRGVmaW5pdGlvbiBpcyBhIEpTT04tbGlrZSBzdHJ1Y3R1cmUgdGhhdCBlYWNoIGRpYWxvZyBoYXNcclxuICogdG8gZGVmaW5lIHRoZSBjb21wb25lbnRzLiAgU3BlY2lmaWMgY29tcG9uZW50cyBjYW4gZGVmaW5lXHJcbiAqIGFkZGl0aW9uYWwgcGFyYW1zIGJ5IGV4dGVuZGluZyB0aGlzLCB0aGVzZSBhcmUgdGhlIGJhc2ljcy5cclxuICogQHBhcmFtIHtzbW9OYW1lfSAtIHRoZSBuYW1lIHRoZSBkaWFsb2cgdXNlcyB0byByZWZlcmVuY2UgaXQgXHJcbiAqIEBwYXJhbSB7Y29udHJvbH0gLSBjb25zdHJ1Y3RvciBvZiB0aGUgY29udHJvbFxyXG4gKiBAcGFyYW0ge2xhYmVsfSAtIGxhYmVsIG9mIHRoZSBlbGVtZW50LCBjYW4gYmUgdHJhbnNsYXRlZFxyXG4gKiBAcGFyYW0ge2luY3JlbWVudH0gIC0gdXNlZCBieSBjb21wb25lbnRzIHRoYXQgaGF2ZSBpbmNyZW1lbnQgYXJyb3dzXHJcbiAqIEBwYXJhbSB7ZGVmYXVsdFZhbHVlfSAtIHRoaW5raW5nIG9mIHJlbW92aW5nIHRoaXNcclxuICogQHBhcmFtIHtkYXRhVHlwZX0gLSB1c2VkIHRvIG5hcnJvdyB0aGUgdHlwZSBieSBzb21lIGNvbXBvbmVudHNcclxuICogQHBhcmFtIHtjbGFzc2VzfSAtIGNhbiBiZSB1c2VkIGluIHJlbmRlcmluZ1xyXG4gKiBAcGFyYW0ge21pbn0gIC0gdXNlZCBieSBjb21wb25lbnRzIHRoYXQgaGF2ZSBudW1iZXJcclxuICogQHBhcmFtIHttYXh9ICAtIHVzZWQgYnkgY29tcG9uZW50cyB0aGF0IGhhdmUgbnVtYmVyXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGlhbG9nRGVmaW5pdGlvbkVsZW1lbnQge1xyXG4gIHNtb05hbWU6IHN0cmluZyxcclxuICBjb250cm9sOiBzdHJpbmcsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzdGFydFJvdz86IGJvb2xlYW4sXHJcbiAgb3B0aW9ucz86IERpYWxvZ0RlZmluaXRpb25PcHRpb25bXVxyXG4gIGluY3JlbWVudD86IG51bWJlcixcclxuICBkZWZhdWx0VmFsdWU/OiBudW1iZXIgfCBzdHJpbmcsXHJcbiAgZGF0YVR5cGU/OiBzdHJpbmcsXHJcbiAgY2xhc3Nlcz86IHN0cmluZyxcclxuICBtaW4/OiBudW1iZXIsXHJcbiAgbWF4PzogbnVtYmVyLFxyXG59XHJcblxyXG4vKipcclxuICogZm9yIGJhc2UgY29tcG9uZW50IGNvbnN0cnVjdG9yc1xyXG4gKiBAcGFyYW0ge2lkfSAtIHVuaXF1ZSBJRCBmb3IgdGhlIGNvbnRyb2wgRE9NXHJcbiAqIEBwYXJhbSB7Y2xhc3Nlc30gLSBhZGRpdGlvbmFsIGNsYXNzZXMgZm9yIHN0eWxpbmcgYWRkZWQgdG8gRE9NXHJcbiAqIEBwYXJhbSB7bGFiZWx9IC0gZGVmYXVsdCBsYWJlbCBmb3IgdGhlIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge3Ntb05hbWV9IC0gdGhlIHZhcmlhYmxlIGluIHRoZSBkaWFsb2cgdGhhdCB0aGUgY29tcG9uZW5ldCBtYXBzIHRvXHJcbiAqIEBwYXJhbSB7Y29udHJvbH0gLSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIFVJIGNvbnRyb2xcclxuICogQHBhcmFtIHtwYXJlbnRDb21wb25lbnR9IC0gZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzLCB0aGUgdG9wLWxldmVsXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3VpQmFzZUNvbXBvbmVudFBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nLFxyXG4gIG5vUHJvcGVydHk/OiBib29sZWFuLFxyXG4gIHBhcmVudENvbXBvbmVudD86IFN1aUNvbXBvbmVudFBhcmVudFxyXG59XHJcbi8qKlxyXG4gKiBjb21wb25lbnRzIGtub3cgYWJvdXQgdGhlaXIgcGFyZW50IGRpYWxvZyB2aWEgdGhlIFxyXG4gKiBEaWFsb2dOb3RpZmllciBpbnRlcmZhY2UuICBJdCBhbGxvd3MgYSBjb21wb25lbnQgdG8gXHJcbiAqIG5vdGlmeSBwYXJlbnQgb2YgY2hhbmdpbmcgY29udGVudHMuXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdWlEaWFsb2dOb3RpZmllciB7XHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIGJ5IHRoZSBjb21wb25lbnQgd2hlbiB0aGUgc3RhdGUgaXMgY2hhbmdlZC4gIERpYWxvZ1xyXG4gICAqIHdpbGwgdGhlbiBxdWVyeSB0aGUgY29tcG9uZW50IChnZXRWYWx1ZSgpKSBhbmQgc2V0IHRoZSBcclxuICAgKiBjb3JyZWN0IHNjb3JlIHZhbHVlLlxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGNoYW5nZWQoKTogdm9pZDtcclxuICAvKipcclxuICAgKiByZXR1cm5zIHRoZSBET00gaWQgb2YgdGhlIGRpYWxvZy5cclxuICAgKi9cclxuICBhYnN0cmFjdCBnZXRJZCgpOiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogcmV0dXJucyB0aGUgdG9wIERPTSBub2RlIGZvciB0aGUgZGlhbG9nXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgZ2V0IGRnRG9tKCk6IGFueTtcclxuICAvKipcclxuICAgKiBnZXRzIHRoZSB2aWV3IGZyb20gdGhlIHBhcmVudFxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGdldFZpZXcoKTogU3VpU2NvcmVWaWV3T3BlcmF0aW9ucztcclxuICAvKipcclxuICAgKiBnZXRzIHRoZSAnbW9kaWZpZXInIGZyb20gcGFyZW50IGRpYWxvZywgdXNlZCBieSBcclxuICAgKiB0ZXh0IGVkaXRvcnMuICBNb3N0IGNvbXBvbmVudHMgd29uJ3QgbmVlZCB0aGlzLlxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGdldE1vZGlmaWVyKCk6IFNtb01vZGlmaWVyIHwgbnVsbDtcclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBzdGF0aWMgdGV4dCA8c3RyaW5nLCBzdHJpbmc+IGZvciB0aGUgY3VycmVudCBsYW5ndWFnZS5cclxuICAgKiB0aGlzIGlzIHVzZWQgYnkgY29tcG9uZW50cyB0aGF0IGhhdmUgZGlmZmVyZW50IHRleHQgbGFiZWxzIGZvciBkaWZmZXJlbnQgc3RhdGVzLlxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGdldFN0YXRpY1RleHQoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICAvKipcclxuICAgKiBVc2VkIGJ5IHRleHQgZWRpdGluZyBjb21wb25lbnRzIHRoYXQgYXJlIGFsc28gZXZlbnQgc2lua3NcclxuICAgKi9cclxuICBhYnN0cmFjdCBnZXRFdmVudFNvdXJjZSgpOiBCcm93c2VyRXZlbnRTb3VyY2U7XHJcbn1cclxuLyoqXHJcbiAqIGJhc2UgY2xhc3MgZm9yIERpYWxvZyBjb21wb25lbnRzLiAgTm90aWZpZXMgcGFyZW50IFxyXG4gKiBkaWFsb2cgb2Ygc3RhdGUgY2hhbmdlIHZpYSBgY2hhbmdlKClgXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdWlDb21wb25lbnRCYXNlIHtcclxuICBjaGFuZ2VGbGFnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3NzOiBzdHJpbmc7XHJcbiAgZGlhbG9nOiBTdWlEaWFsb2dOb3RpZmllcjtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5vUHJvcGVydHk6IGJvb2xlYW47XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBjb250cm9sOiBzdHJpbmc7XHJcbiAgc21vTmFtZTogc3RyaW5nO1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcnM6IFN1aUJhc2VDb21wb25lbnRQYXJhbXMpIHtcclxuICAgIHRoaXMuY2hhbmdlRmxhZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jc3MgPSBwYXJhbWV0ZXJzLmNsYXNzZXM7XHJcbiAgICB0aGlzLmRpYWxvZyA9IGRpYWxvZztcclxuICAgIHRoaXMuaWQgPSBwYXJhbWV0ZXJzLmlkO1xyXG4gICAgdGhpcy5sYWJlbCA9IHBhcmFtZXRlcnMubGFiZWw7XHJcbiAgICB0aGlzLmNvbnRyb2wgPSBwYXJhbWV0ZXJzLmNvbnRyb2w7XHJcbiAgICB0aGlzLnNtb05hbWUgPSBwYXJhbWV0ZXJzLnNtb05hbWU7XHJcbiAgICB0aGlzLm5vUHJvcGVydHkgPSBwYXJhbWV0ZXJzLm5vUHJvcGVydHkgPz8gZmFsc2U7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCBieSB0aGUgZGlhbG9nIGFmdGVyIHJlbmRlcmluZywgc28gdGhlIGRlcml2ZWQgY2xhc3MgY2FuIFxyXG4gICAqIGJpbmQgdGhlIGh0bWwgY29udHJvbHNcclxuICAgKi9cclxuICBhYnN0cmFjdCBiaW5kKCk6IHZvaWQ7XHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBodG1sIHRoYXQgbGl2ZXMgaW4gc2lkZSB0aGUgY29tcG9uZW50IERPTS4gSW1wbGVtZW50ZWQgYnkgdGhlXHJcbiAgICogYmFzZSBjbGFzcy5cclxuICAgKi9cclxuICBhYnN0cmFjdCBnZXQgaHRtbCgpOiBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCBieSB0aGUgZGVyaXZlZCBjbGFzcyB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzLiAgVGhlIGNoYW5nZSBmbGFnIGlzIHNldCB0byB0cnVlLCBzbyB0aGUgZGlhbG9nIHdpbGwgXHJcbiAgICoga25vdyB3aGljaCBjb21wb25lbnQgY2hhbmdlZC5cclxuICAgKi9cclxuICBoYW5kbGVDaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gdHJ1ZTtcclxuICAgIHRoaXMuZGlhbG9nLmNoYW5nZWQoKTtcclxuICAgIHRoaXMuY2hhbmdlRmxhZyA9IGZhbHNlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBjb21iaW5lIGNvbXBvbmVudCBjbGFzc2VzIHdpdGggc3RyaW5nLCB1c2VkIGZvciBjb21wb3NpdGVzXHJcbiAgICogQHBhcmFtIGNsYXNzZXMgc3RyaW5nIG90IGFwcGVuZFxyXG4gICAqIEByZXR1cm5zIGNvbWJpbmVkIHN0cmluZ3NcclxuICAgKi9cclxuICBtYWtlQ2xhc3NlcyhjbGFzc2VzOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmNzcykge1xyXG4gICAgICByZXR1cm4gY2xhc3NlcyArICcgJyArIHRoaXMuY3NzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNsYXNzZXM7XHJcbiAgfVxyXG4gIGdldCBwYXJhbWV0ZXJJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmRpYWxvZy5nZXRJZCgpICsgJy0nICsgdGhpcy5zbW9OYW1lO1xyXG4gIH1cclxuICBzaG93KCkge1xyXG4gICAgJCgnIycgKyB0aGlzLnBhcmFtZXRlcklkKS5yZW1vdmVDbGFzcygnaGlkZScpO1xyXG4gIH1cclxuICBoaWRlKCkge1xyXG4gICAgJCgnIycgKyB0aGlzLnBhcmFtZXRlcklkKS5hZGRDbGFzcygnaGlkZScpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFBhcmVudCBjb21wb25lbnRzIGFyZSByZWFsbHkgY29udGFpbmVycyBmb3Igb3RoZXIgY29tcG9uZW50c1xyXG4gKiBGb3IgaW5zdGFuY2UsIEZvbnRDb21wb25lbnQgaGFzIHNpemUsIGZhbWlseSwgd2VpZ2h0LCBldGMuXHJcbiAqIFxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3VpQ29tcG9uZW50UGFyZW50IGV4dGVuZHMgU3VpQ29tcG9uZW50QmFzZSB7XHJcbiAgLyoqXHJcbiAgICogRm9yIHBhcmVudCBjb21wb25lbnQsIHRoZWlyIGNoYW5nZWQgbWV0aG9kIGlzIGNhbGxlZCBieSBjaGlsZCwgYW5kIHRoZW4gdGhlIFxyXG4gICAqIHBhcmVudCBjYWxscyB0aGUgZGlhbG9nIGNoYW5nZWQoKVxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGNoYW5nZWQoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN1aUNvbXBvc2l0ZUJhc2UgZXh0ZW5kcyBTdWlDb21wb25lbnRCYXNlIHtcclxuICBwYXJlbnRDb250cm9sOiBTdWlDb21wb25lbnRQYXJlbnQ7XHJcbiAgY29uc3RydWN0b3IoZGlhbG9nOiBTdWlEaWFsb2dOb3RpZmllciwgcGFyYW1zOiBTdWlCYXNlQ29tcG9uZW50UGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtcyk7XHJcbiAgICBpZiAoIXBhcmFtcy5wYXJlbnRDb21wb25lbnQpIHtcclxuICAgICAgdGhyb3cgKCdpbnZhbGlkIHBhcmVudCBjb21wb25lbnQnKTtcclxuICAgIH1cclxuICAgIHRoaXMucGFyZW50Q29udHJvbCA9IHBhcmFtcy5wYXJlbnRDb21wb25lbnQ7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCB0eXBlIGR5bmFtaWNDb21wb25lbnRDdG9yID0gKGFyZzE6IFN1aURpYWxvZ05vdGlmaWVyLCBwYXJhbXM6IGFueSkgPT4gYW55O1xyXG5leHBvcnQgY29uc3QgU21vRHluYW1pY0NvbXBvbmVudEN0b3I6IFJlY29yZDxzdHJpbmcsIGR5bmFtaWNDb21wb25lbnRDdG9yPiA9IHt9O1xyXG5cclxuXHJcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/baseComponent.ts\n\n}");
3630
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SmoDynamicComponentCtor: () => (/* binding */ SmoDynamicComponentCtor),\n/* harmony export */ SuiComponentBase: () => (/* binding */ SuiComponentBase),\n/* harmony export */ SuiComponentParent: () => (/* binding */ SuiComponentParent),\n/* harmony export */ SuiCompositeBase: () => (/* binding */ SuiCompositeBase),\n/* harmony export */ SuiDialogNotifier: () => (/* binding */ SuiDialogNotifier)\n/* harmony export */ });\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 * components know about their parent dialog via the\n * DialogNotifier interface. It allows a component to\n * notify parent of changing contents.\n * @category SuiDialog\n */\nclass SuiDialogNotifier {\n}\n/**\n * base class for Dialog components. Notifies parent\n * dialog of state change via `change()`\n * @category SuiDialog\n */\nclass SuiComponentBase {\n constructor(dialog, parameters) {\n var _a;\n this.changeFlag = false;\n this.changeFlag = false;\n this.css = parameters.classes;\n this.dialog = dialog;\n this.id = parameters.id;\n this.label = parameters.label;\n this.control = parameters.control;\n this.smoName = parameters.smoName;\n this.noProperty = (_a = parameters.noProperty) !== null && _a !== void 0 ? _a : false;\n }\n /**\n * Called by the derived class when the value changes. The change flag is set to true, so the dialog will\n * know which component changed.\n */\n handleChanged() {\n return __awaiter(this, void 0, void 0, function* () {\n this.changeFlag = true;\n yield this.dialog.changed();\n this.changeFlag = false;\n });\n }\n /**\n * combine component classes with string, used for composites\n * @param classes string ot append\n * @returns combined strings\n */\n makeClasses(classes) {\n if (this.css) {\n return classes + ' ' + this.css;\n }\n return classes;\n }\n get parameterId() {\n return this.dialog.getId() + '-' + this.smoName;\n }\n show() {\n $('#' + this.parameterId).removeClass('hide');\n }\n hide() {\n $('#' + this.parameterId).addClass('hide');\n }\n}\n/**\n * Parent components are really containers for other components\n * For instance, FontComponent has size, family, weight, etc.\n *\n * @category SuiDialog\n */\nclass SuiComponentParent extends SuiComponentBase {\n}\nclass SuiCompositeBase extends SuiComponentBase {\n constructor(dialog, params) {\n super(dialog, params);\n if (!params.parentComponent) {\n throw ('invalid parent component');\n }\n this.parentControl = params.parentComponent;\n }\n}\nconst SmoDynamicComponentCtor = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL2Jhc2VDb21wb25lbnQudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrRUE7Ozs7O0dBS0c7QUFDSSxNQUFlLGlCQUFpQjtDQWlDdEM7QUFDRDs7OztHQUlHO0FBQ0ksTUFBZSxnQkFBZ0I7SUFTcEMsWUFBWSxNQUF5QixFQUFFLFVBQWtDOztRQVJ6RSxlQUFVLEdBQVksS0FBSyxDQUFDO1FBUzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxnQkFBVSxDQUFDLFVBQVUsbUNBQUksS0FBSyxDQUFDO0lBQ25ELENBQUM7SUFZRDs7O09BR0c7SUFDRyxhQUFhOztZQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN2QixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDMUIsQ0FBQztLQUFBO0lBQ0Q7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxPQUFlO1FBQ3pCLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2IsT0FBTyxPQUFPLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDbEMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDbEQsQ0FBQztJQUNELElBQUk7UUFDRixDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELElBQUk7UUFDRixDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGO0FBRUQ7Ozs7O0dBS0c7QUFDSSxNQUFlLGtCQUFtQixTQUFRLGdCQUFnQjtDQU1oRTtBQUVNLE1BQWUsZ0JBQWlCLFNBQVEsZ0JBQWdCO0lBRTdELFlBQVksTUFBeUIsRUFBRSxNQUE4QjtRQUNuRSxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDNUIsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztJQUM5QyxDQUFDO0NBQ0Y7QUFFTSxNQUFNLHVCQUF1QixHQUF5QyxFQUFFLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL2Jhc2VDb21wb25lbnQudHM/ZGI1NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuaW1wb3J0IHsgU21vTW9kaWZpZXIgfSBmcm9tICcuLi8uLi8uLi9zbW8vZGF0YS9zY29yZSc7XHJcbmltcG9ydCB7IFN1aVNjb3JlVmlld09wZXJhdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9yZW5kZXIvc3VpL3Njb3JlVmlld09wZXJhdGlvbnMnO1xyXG5pbXBvcnQgeyBCcm93c2VyRXZlbnRTb3VyY2UgfSBmcm9tICcuLi8uLi9ldmVudFNvdXJjZSc7XHJcbi8qKlxyXG4gKiBBIGNvbXBvbmVudCBpcyBhIHBhcnQgb2YgYSBkaWFsb2cgYm94IHRoYXQgYWNjZXB0cyBzb21lIGlucHV0LlxyXG4gKi9cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG4vKipcclxuICogRGlhbG9ncyBjb250cm9scyBvcHRpb25zLCBsaWtlIGRyb3Bkb3duc1xyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIERpYWxvZ0RlZmluaXRpb25PcHRpb24ge1xyXG4gIGNzcz86IHN0cmluZyxcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcclxufVxyXG4vKipcclxuICogRGlhbG9nRGVmaW5pdGlvbiBpcyBhIEpTT04tbGlrZSBzdHJ1Y3R1cmUgdGhhdCBlYWNoIGRpYWxvZyBoYXNcclxuICogdG8gZGVmaW5lIHRoZSBjb21wb25lbnRzLiAgU3BlY2lmaWMgY29tcG9uZW50cyBjYW4gZGVmaW5lXHJcbiAqIGFkZGl0aW9uYWwgcGFyYW1zIGJ5IGV4dGVuZGluZyB0aGlzLCB0aGVzZSBhcmUgdGhlIGJhc2ljcy5cclxuICogQHBhcmFtIHtzbW9OYW1lfSAtIHRoZSBuYW1lIHRoZSBkaWFsb2cgdXNlcyB0byByZWZlcmVuY2UgaXQgXHJcbiAqIEBwYXJhbSB7Y29udHJvbH0gLSBjb25zdHJ1Y3RvciBvZiB0aGUgY29udHJvbFxyXG4gKiBAcGFyYW0ge2xhYmVsfSAtIGxhYmVsIG9mIHRoZSBlbGVtZW50LCBjYW4gYmUgdHJhbnNsYXRlZFxyXG4gKiBAcGFyYW0ge2luY3JlbWVudH0gIC0gdXNlZCBieSBjb21wb25lbnRzIHRoYXQgaGF2ZSBpbmNyZW1lbnQgYXJyb3dzXHJcbiAqIEBwYXJhbSB7ZGVmYXVsdFZhbHVlfSAtIHRoaW5raW5nIG9mIHJlbW92aW5nIHRoaXNcclxuICogQHBhcmFtIHtkYXRhVHlwZX0gLSB1c2VkIHRvIG5hcnJvdyB0aGUgdHlwZSBieSBzb21lIGNvbXBvbmVudHNcclxuICogQHBhcmFtIHtjbGFzc2VzfSAtIGNhbiBiZSB1c2VkIGluIHJlbmRlcmluZ1xyXG4gKiBAcGFyYW0ge21pbn0gIC0gdXNlZCBieSBjb21wb25lbnRzIHRoYXQgaGF2ZSBudW1iZXJcclxuICogQHBhcmFtIHttYXh9ICAtIHVzZWQgYnkgY29tcG9uZW50cyB0aGF0IGhhdmUgbnVtYmVyXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGlhbG9nRGVmaW5pdGlvbkVsZW1lbnQge1xyXG4gIHNtb05hbWU6IHN0cmluZyxcclxuICBjb250cm9sOiBzdHJpbmcsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzdGFydFJvdz86IGJvb2xlYW4sXHJcbiAgb3B0aW9ucz86IERpYWxvZ0RlZmluaXRpb25PcHRpb25bXVxyXG4gIGluY3JlbWVudD86IG51bWJlcixcclxuICBkZWZhdWx0VmFsdWU/OiBudW1iZXIgfCBzdHJpbmcsXHJcbiAgZGF0YVR5cGU/OiBzdHJpbmcsXHJcbiAgY2xhc3Nlcz86IHN0cmluZyxcclxuICBtaW4/OiBudW1iZXIsXHJcbiAgbWF4PzogbnVtYmVyLFxyXG59XHJcblxyXG4vKipcclxuICogZm9yIGJhc2UgY29tcG9uZW50IGNvbnN0cnVjdG9yc1xyXG4gKiBAcGFyYW0ge2lkfSAtIHVuaXF1ZSBJRCBmb3IgdGhlIGNvbnRyb2wgRE9NXHJcbiAqIEBwYXJhbSB7Y2xhc3Nlc30gLSBhZGRpdGlvbmFsIGNsYXNzZXMgZm9yIHN0eWxpbmcgYWRkZWQgdG8gRE9NXHJcbiAqIEBwYXJhbSB7bGFiZWx9IC0gZGVmYXVsdCBsYWJlbCBmb3IgdGhlIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge3Ntb05hbWV9IC0gdGhlIHZhcmlhYmxlIGluIHRoZSBkaWFsb2cgdGhhdCB0aGUgY29tcG9uZW5ldCBtYXBzIHRvXHJcbiAqIEBwYXJhbSB7Y29udHJvbH0gLSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIFVJIGNvbnRyb2xcclxuICogQHBhcmFtIHtwYXJlbnRDb21wb25lbnR9IC0gZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzLCB0aGUgdG9wLWxldmVsXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3VpQmFzZUNvbXBvbmVudFBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nLFxyXG4gIG5vUHJvcGVydHk/OiBib29sZWFuLFxyXG4gIHBhcmVudENvbXBvbmVudD86IFN1aUNvbXBvbmVudFBhcmVudFxyXG59XHJcbi8qKlxyXG4gKiBjb21wb25lbnRzIGtub3cgYWJvdXQgdGhlaXIgcGFyZW50IGRpYWxvZyB2aWEgdGhlIFxyXG4gKiBEaWFsb2dOb3RpZmllciBpbnRlcmZhY2UuICBJdCBhbGxvd3MgYSBjb21wb25lbnQgdG8gXHJcbiAqIG5vdGlmeSBwYXJlbnQgb2YgY2hhbmdpbmcgY29udGVudHMuXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdWlEaWFsb2dOb3RpZmllciB7XHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIGJ5IHRoZSBjb21wb25lbnQgd2hlbiB0aGUgc3RhdGUgaXMgY2hhbmdlZC4gIERpYWxvZ1xyXG4gICAqIHdpbGwgdGhlbiBxdWVyeSB0aGUgY29tcG9uZW50IChnZXRWYWx1ZSgpKSBhbmQgc2V0IHRoZSBcclxuICAgKiBjb3JyZWN0IHNjb3JlIHZhbHVlLlxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGNoYW5nZWQoKTogUHJvbWlzZTx2b2lkPjtcclxuICAvKipcclxuICAgKiByZXR1cm5zIHRoZSBET00gaWQgb2YgdGhlIGRpYWxvZy5cclxuICAgKi9cclxuICBhYnN0cmFjdCBnZXRJZCgpOiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogcmV0dXJucyB0aGUgdG9wIERPTSBub2RlIGZvciB0aGUgZGlhbG9nXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgZ2V0IGRnRG9tKCk6IGFueTtcclxuICAvKipcclxuICAgKiBnZXRzIHRoZSB2aWV3IGZyb20gdGhlIHBhcmVudFxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGdldFZpZXcoKTogU3VpU2NvcmVWaWV3T3BlcmF0aW9ucztcclxuICAvKipcclxuICAgKiBnZXRzIHRoZSAnbW9kaWZpZXInIGZyb20gcGFyZW50IGRpYWxvZywgdXNlZCBieSBcclxuICAgKiB0ZXh0IGVkaXRvcnMuICBNb3N0IGNvbXBvbmVudHMgd29uJ3QgbmVlZCB0aGlzLlxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGdldE1vZGlmaWVyKCk6IFNtb01vZGlmaWVyIHwgbnVsbDtcclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBzdGF0aWMgdGV4dCA8c3RyaW5nLCBzdHJpbmc+IGZvciB0aGUgY3VycmVudCBsYW5ndWFnZS5cclxuICAgKiB0aGlzIGlzIHVzZWQgYnkgY29tcG9uZW50cyB0aGF0IGhhdmUgZGlmZmVyZW50IHRleHQgbGFiZWxzIGZvciBkaWZmZXJlbnQgc3RhdGVzLlxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGdldFN0YXRpY1RleHQoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICAvKipcclxuICAgKiBVc2VkIGJ5IHRleHQgZWRpdGluZyBjb21wb25lbnRzIHRoYXQgYXJlIGFsc28gZXZlbnQgc2lua3NcclxuICAgKi9cclxuICBhYnN0cmFjdCBnZXRFdmVudFNvdXJjZSgpOiBCcm93c2VyRXZlbnRTb3VyY2U7XHJcbn1cclxuLyoqXHJcbiAqIGJhc2UgY2xhc3MgZm9yIERpYWxvZyBjb21wb25lbnRzLiAgTm90aWZpZXMgcGFyZW50IFxyXG4gKiBkaWFsb2cgb2Ygc3RhdGUgY2hhbmdlIHZpYSBgY2hhbmdlKClgXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTdWlDb21wb25lbnRCYXNlIHtcclxuICBjaGFuZ2VGbGFnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3NzOiBzdHJpbmc7XHJcbiAgZGlhbG9nOiBTdWlEaWFsb2dOb3RpZmllcjtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5vUHJvcGVydHk6IGJvb2xlYW47XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBjb250cm9sOiBzdHJpbmc7XHJcbiAgc21vTmFtZTogc3RyaW5nO1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcnM6IFN1aUJhc2VDb21wb25lbnRQYXJhbXMpIHtcclxuICAgIHRoaXMuY2hhbmdlRmxhZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jc3MgPSBwYXJhbWV0ZXJzLmNsYXNzZXM7XHJcbiAgICB0aGlzLmRpYWxvZyA9IGRpYWxvZztcclxuICAgIHRoaXMuaWQgPSBwYXJhbWV0ZXJzLmlkO1xyXG4gICAgdGhpcy5sYWJlbCA9IHBhcmFtZXRlcnMubGFiZWw7XHJcbiAgICB0aGlzLmNvbnRyb2wgPSBwYXJhbWV0ZXJzLmNvbnRyb2w7XHJcbiAgICB0aGlzLnNtb05hbWUgPSBwYXJhbWV0ZXJzLnNtb05hbWU7XHJcbiAgICB0aGlzLm5vUHJvcGVydHkgPSBwYXJhbWV0ZXJzLm5vUHJvcGVydHkgPz8gZmFsc2U7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCBieSB0aGUgZGlhbG9nIGFmdGVyIHJlbmRlcmluZywgc28gdGhlIGRlcml2ZWQgY2xhc3MgY2FuIFxyXG4gICAqIGJpbmQgdGhlIGh0bWwgY29udHJvbHNcclxuICAgKi9cclxuICBhYnN0cmFjdCBiaW5kKCk6IHZvaWQ7XHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBodG1sIHRoYXQgbGl2ZXMgaW4gc2lkZSB0aGUgY29tcG9uZW50IERPTS4gSW1wbGVtZW50ZWQgYnkgdGhlXHJcbiAgICogYmFzZSBjbGFzcy5cclxuICAgKi9cclxuICBhYnN0cmFjdCBnZXQgaHRtbCgpOiBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCBieSB0aGUgZGVyaXZlZCBjbGFzcyB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzLiAgVGhlIGNoYW5nZSBmbGFnIGlzIHNldCB0byB0cnVlLCBzbyB0aGUgZGlhbG9nIHdpbGwgXHJcbiAgICoga25vdyB3aGljaCBjb21wb25lbnQgY2hhbmdlZC5cclxuICAgKi9cclxuICBhc3luYyBoYW5kbGVDaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gdHJ1ZTtcclxuICAgIGF3YWl0IHRoaXMuZGlhbG9nLmNoYW5nZWQoKTtcclxuICAgIHRoaXMuY2hhbmdlRmxhZyA9IGZhbHNlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBjb21iaW5lIGNvbXBvbmVudCBjbGFzc2VzIHdpdGggc3RyaW5nLCB1c2VkIGZvciBjb21wb3NpdGVzXHJcbiAgICogQHBhcmFtIGNsYXNzZXMgc3RyaW5nIG90IGFwcGVuZFxyXG4gICAqIEByZXR1cm5zIGNvbWJpbmVkIHN0cmluZ3NcclxuICAgKi9cclxuICBtYWtlQ2xhc3NlcyhjbGFzc2VzOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLmNzcykge1xyXG4gICAgICByZXR1cm4gY2xhc3NlcyArICcgJyArIHRoaXMuY3NzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNsYXNzZXM7XHJcbiAgfVxyXG4gIGdldCBwYXJhbWV0ZXJJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmRpYWxvZy5nZXRJZCgpICsgJy0nICsgdGhpcy5zbW9OYW1lO1xyXG4gIH1cclxuICBzaG93KCkge1xyXG4gICAgJCgnIycgKyB0aGlzLnBhcmFtZXRlcklkKS5yZW1vdmVDbGFzcygnaGlkZScpO1xyXG4gIH1cclxuICBoaWRlKCkge1xyXG4gICAgJCgnIycgKyB0aGlzLnBhcmFtZXRlcklkKS5hZGRDbGFzcygnaGlkZScpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFBhcmVudCBjb21wb25lbnRzIGFyZSByZWFsbHkgY29udGFpbmVycyBmb3Igb3RoZXIgY29tcG9uZW50c1xyXG4gKiBGb3IgaW5zdGFuY2UsIEZvbnRDb21wb25lbnQgaGFzIHNpemUsIGZhbWlseSwgd2VpZ2h0LCBldGMuXHJcbiAqIFxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3VpQ29tcG9uZW50UGFyZW50IGV4dGVuZHMgU3VpQ29tcG9uZW50QmFzZSB7XHJcbiAgLyoqXHJcbiAgICogRm9yIHBhcmVudCBjb21wb25lbnQsIHRoZWlyIGNoYW5nZWQgbWV0aG9kIGlzIGNhbGxlZCBieSBjaGlsZCwgYW5kIHRoZW4gdGhlIFxyXG4gICAqIHBhcmVudCBjYWxscyB0aGUgZGlhbG9nIGNoYW5nZWQoKVxyXG4gICAqL1xyXG4gIGFic3RyYWN0IGNoYW5nZWQoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN1aUNvbXBvc2l0ZUJhc2UgZXh0ZW5kcyBTdWlDb21wb25lbnRCYXNlIHtcclxuICBwYXJlbnRDb250cm9sOiBTdWlDb21wb25lbnRQYXJlbnQ7XHJcbiAgY29uc3RydWN0b3IoZGlhbG9nOiBTdWlEaWFsb2dOb3RpZmllciwgcGFyYW1zOiBTdWlCYXNlQ29tcG9uZW50UGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtcyk7XHJcbiAgICBpZiAoIXBhcmFtcy5wYXJlbnRDb21wb25lbnQpIHtcclxuICAgICAgdGhyb3cgKCdpbnZhbGlkIHBhcmVudCBjb21wb25lbnQnKTtcclxuICAgIH1cclxuICAgIHRoaXMucGFyZW50Q29udHJvbCA9IHBhcmFtcy5wYXJlbnRDb21wb25lbnQ7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCB0eXBlIGR5bmFtaWNDb21wb25lbnRDdG9yID0gKGFyZzE6IFN1aURpYWxvZ05vdGlmaWVyLCBwYXJhbXM6IGFueSkgPT4gYW55O1xyXG5leHBvcnQgY29uc3QgU21vRHluYW1pY0NvbXBvbmVudEN0b3I6IFJlY29yZDxzdHJpbmcsIGR5bmFtaWNDb21wb25lbnRDdG9yPiA9IHt9O1xyXG5cclxuXHJcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/baseComponent.ts\n\n}");
3631
3631
 
3632
3632
  /***/ },
3633
3633
 
@@ -3638,7 +3638,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
3638
3638
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3639
3639
 
3640
3640
  "use strict";
3641
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiButtonComponent: () => (/* binding */ SuiButtonComponent),\n/* harmony export */ SuiButtonComposite: () => (/* binding */ SuiButtonComposite)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.ts\");\n\n\n/**\n * Simple click behavior. No value just used to notifiy parent dialog\n * @category SuiDialog\n */\nclass SuiButtonComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_1__.SuiComponentBase {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.dialog = dialog;\n this.icon = parameter.icon;\n this.text = parameter.text;\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const id = this.parameterId;\n this.icon = typeof (this.icon) === 'undefined' ? '' : this.icon;\n if (!this.text) {\n const r = b('div').classes(this.makeClasses('buttonControl smoControl')).attr('id', this.parameterId).attr('data-param', this.smoName)\n .append(b('button').attr('type', 'button').classes(this.icon)\n .attr('id', id + '-input')).append(b('label').attr('for', id + '-input').attr('aria-label', this.label).text(this.label));\n return r;\n }\n else {\n const r = b('div').classes(this.makeClasses('buttonControl smoControl')).attr('id', this.parameterId).attr('data-param', this.smoName)\n .append(b('button').attr('type', 'button').classes(this.icon)\n .attr('id', id + '-input').append(b('span').classes('button-text').text(this.text))).append(b('label').attr('for', id + '-input').attr('aria-label', this.label).text(this.label));\n return r;\n }\n }\n _getInputElement() {\n var pid = this.parameterId;\n return $(this.dialog.dgDom.element).find('#' + pid).find('button');\n }\n setValue() {\n }\n getValue() {\n return null;\n }\n bind() {\n const input = this._getInputElement();\n $(input).off('click').on('click', () => {\n this.handleChanged();\n });\n }\n}\n/**\n * Buttons that are part of a composite control\n * @category SuiDialog\n */\nclass SuiButtonComposite extends SuiButtonComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n this.changeFlag = true;\n this.parentControl.changed();\n this.changeFlag = false;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0QsZ0JBQWdCO1FBQ2QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsUUFBUTtJQUNSLENBQUM7SUFDRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsSUFBSTtRQUNGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFDOUIsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNGO0FBaUJEOzs7R0FHRztBQUNJLE1BQU0sa0JBQW1CLFNBQVEsa0JBQWtCO0lBRXhELFlBQVksTUFBeUIsRUFBRSxVQUFvQztRQUN6RSxLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQztJQUNoRCxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztDQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3VpL2RpYWxvZ3MvY29tcG9uZW50cy9idXR0b24udHM/MDBlMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBidWlsZERvbSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9odG1sSGVscGVycyc7XHJcbmltcG9ydCB7IFN1aUNvbXBvbmVudEJhc2UsIFN1aURpYWxvZ05vdGlmaWVyLCBTdWlDb21wb25lbnRQYXJlbnQgfSBmcm9tICcuL2Jhc2VDb21wb25lbnQnO1xyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG4vKipcclxuICogU2ltcGxlIGJ1dHRvbnMgaW4gZGlhbG9nc1xyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aUJ1dHRvbkNvbXBvbmVudFBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgdHlwZT86IHN0cmluZyxcclxuICBpbmNyZW1lbnQ/OiBudW1iZXIsXHJcbiAgdGV4dD86IHN0cmluZyxcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIHNtb05hbWU6IHN0cmluZyxcclxuICBjb250cm9sOiBzdHJpbmcsXHJcbiAgaWNvbjogc3RyaW5nXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTaW1wbGUgY2xpY2sgYmVoYXZpb3IuICBObyB2YWx1ZSBqdXN0IHVzZWQgdG8gbm90aWZpeSBwYXJlbnQgZGlhbG9nXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdWlCdXR0b25Db21wb25lbnQgZXh0ZW5kcyBTdWlDb21wb25lbnRCYXNlIHtcclxuICBpY29uOiBzdHJpbmc7XHJcbiAgdGV4dD86IHN0cmluZztcclxuICBjb25zdHJ1Y3RvcihkaWFsb2c6IFN1aURpYWxvZ05vdGlmaWVyLCBwYXJhbWV0ZXI6IFN1aUJ1dHRvbkNvbXBvbmVudFBhcmFtcykge1xyXG4gICAgc3VwZXIoZGlhbG9nLCBwYXJhbWV0ZXIpO1xyXG4gICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7XHJcbiAgICB0aGlzLmljb24gPSBwYXJhbWV0ZXIuaWNvbjtcclxuICAgIHRoaXMudGV4dCA9IHBhcmFtZXRlci50ZXh0O1xyXG4gIH1cclxuICBnZXQgaHRtbCgpIHtcclxuICAgIGNvbnN0IGIgPSBidWlsZERvbTtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5wYXJhbWV0ZXJJZDtcclxuICAgIHRoaXMuaWNvbiA9IHR5cGVvZih0aGlzLmljb24pID09PSAndW5kZWZpbmVkJyA/ICcnIDogdGhpcy5pY29uO1xyXG4gICAgaWYgKCF0aGlzLnRleHQpIHtcclxuICAgICAgY29uc3QgciA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3NlcygnYnV0dG9uQ29udHJvbCBzbW9Db250cm9sJykpLmF0dHIoJ2lkJywgdGhpcy5wYXJhbWV0ZXJJZCkuYXR0cignZGF0YS1wYXJhbScsIHRoaXMuc21vTmFtZSlcclxuICAgICAgICAuYXBwZW5kKGIoJ2J1dHRvbicpLmF0dHIoJ3R5cGUnLCAnYnV0dG9uJykuY2xhc3Nlcyh0aGlzLmljb24pXHJcbiAgICAgICAgICAuYXR0cignaWQnLCBpZCArICctaW5wdXQnKSkuYXBwZW5kKFxyXG4gICAgICAgICAgYignbGFiZWwnKS5hdHRyKCdmb3InLCBpZCArICctaW5wdXQnKS5hdHRyKCdhcmlhLWxhYmVsJyx0aGlzLmxhYmVsKS50ZXh0KHRoaXMubGFiZWwpKTtcclxuICAgICAgcmV0dXJuIHI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCByID0gYignZGl2JykuY2xhc3Nlcyh0aGlzLm1ha2VDbGFzc2VzKCdidXR0b25Db250cm9sIHNtb0NvbnRyb2wnKSkuYXR0cignaWQnLCB0aGlzLnBhcmFtZXRlcklkKS5hdHRyKCdkYXRhLXBhcmFtJywgdGhpcy5zbW9OYW1lKVxyXG4gICAgICAgIC5hcHBlbmQoYignYnV0dG9uJykuYXR0cigndHlwZScsICdidXR0b24nKS5jbGFzc2VzKHRoaXMuaWNvbilcclxuICAgICAgICAgIC5hdHRyKCdpZCcsIGlkICsgJy1pbnB1dCcpLmFwcGVuZChcclxuICAgICAgICAgICAgYignc3BhbicpLmNsYXNzZXMoJ2J1dHRvbi10ZXh0JykudGV4dCh0aGlzLnRleHQpXHJcbiAgICAgICAgICApKS5hcHBlbmQoXHJcbiAgICAgICAgICBiKCdsYWJlbCcpLmF0dHIoJ2ZvcicsIGlkICsgJy1pbnB1dCcpLmF0dHIoJ2FyaWEtbGFiZWwnLHRoaXMubGFiZWwpLnRleHQodGhpcy5sYWJlbCkpO1xyXG4gICAgICByZXR1cm4gcjtcclxuICAgIH1cclxuICB9XHJcbiAgX2dldElucHV0RWxlbWVudCgpIHtcclxuICAgIHZhciBwaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgcmV0dXJuICQodGhpcy5kaWFsb2cuZGdEb20uZWxlbWVudCkuZmluZCgnIycgKyBwaWQpLmZpbmQoJ2J1dHRvbicpO1xyXG4gIH1cclxuICBzZXRWYWx1ZSgpIHtcclxuICB9XHJcbiAgZ2V0VmFsdWUoKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgYmluZCgpIHtcclxuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5fZ2V0SW5wdXRFbGVtZW50KCk7XHJcbiAgICAkKGlucHV0KS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJyxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlZCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aUJ1dHRvbkNvbXBvc2l0ZVBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgdHlwZT86IHN0cmluZyxcclxuICBpbmNyZW1lbnQ/OiBudW1iZXIsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgdGV4dD86IHN0cmluZyxcclxuICBjb250cm9sOiBzdHJpbmcsXHJcbiAgaWNvbjogc3RyaW5nLFxyXG4gIHBhcmVudENvbnRyb2w6IFN1aUNvbXBvbmVudFBhcmVudFxyXG59XHJcbi8qKlxyXG4gKiBCdXR0b25zIHRoYXQgYXJlIHBhcnQgb2YgYSBjb21wb3NpdGUgY29udHJvbFxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpQnV0dG9uQ29tcG9zaXRlIGV4dGVuZHMgU3VpQnV0dG9uQ29tcG9uZW50IHtcclxuIHBhcmVudENvbnRyb2w6IFN1aUNvbXBvbmVudFBhcmVudDtcclxuICBjb25zdHJ1Y3RvcihkaWFsb2c6IFN1aURpYWxvZ05vdGlmaWVyLCBwYXJhbWV0ZXJzOiBTdWlCdXR0b25Db21wb3NpdGVQYXJhbXMpIHtcclxuICAgIHN1cGVyKGRpYWxvZywgcGFyYW1ldGVycyk7XHJcbiAgICB0aGlzLnBhcmVudENvbnRyb2wgPSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gdHJ1ZTtcclxuICAgIHRoaXMucGFyZW50Q29udHJvbC5jaGFuZ2VkKCk7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSBmYWxzZTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/button.ts\n\n}");
3641
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiButtonComponent: () => (/* binding */ SuiButtonComponent),\n/* harmony export */ SuiButtonComposite: () => (/* binding */ SuiButtonComposite)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.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/**\n * Simple click behavior. No value just used to notifiy parent dialog\n * @category SuiDialog\n */\nclass SuiButtonComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_1__.SuiComponentBase {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.dialog = dialog;\n this.icon = parameter.icon;\n this.text = parameter.text;\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const id = this.parameterId;\n this.icon = typeof (this.icon) === 'undefined' ? '' : this.icon;\n if (!this.text) {\n const r = b('div').classes(this.makeClasses('buttonControl smoControl')).attr('id', this.parameterId).attr('data-param', this.smoName)\n .append(b('button').attr('type', 'button').classes(this.icon)\n .attr('id', id + '-input')).append(b('label').attr('for', id + '-input').attr('aria-label', this.label).text(this.label));\n return r;\n }\n else {\n const r = b('div').classes(this.makeClasses('buttonControl smoControl')).attr('id', this.parameterId).attr('data-param', this.smoName)\n .append(b('button').attr('type', 'button').classes(this.icon)\n .attr('id', id + '-input').append(b('span').classes('button-text').text(this.text))).append(b('label').attr('for', id + '-input').attr('aria-label', this.label).text(this.label));\n return r;\n }\n }\n _getInputElement() {\n var pid = this.parameterId;\n return $(this.dialog.dgDom.element).find('#' + pid).find('button');\n }\n setValue() {\n }\n getValue() {\n return null;\n }\n bind() {\n const input = this._getInputElement();\n $(input).off('click').on('click', () => {\n this.handleChanged();\n });\n }\n}\n/**\n * Buttons that are part of a composite control\n * @category SuiDialog\n */\nclass SuiButtonComposite extends SuiButtonComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n return __awaiter(this, void 0, void 0, function* () {\n this.changeFlag = true;\n yield this.parentControl.changed();\n this.changeFlag = false;\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SCxDQUFDO0lBQ0QsZ0JBQWdCO1FBQ2QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsUUFBUTtJQUNSLENBQUM7SUFDRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsSUFBSTtRQUNGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFDOUIsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNGO0FBaUJEOzs7R0FHRztBQUNJLE1BQU0sa0JBQW1CLFNBQVEsa0JBQWtCO0lBRXhELFlBQVksTUFBeUIsRUFBRSxVQUFvQztRQUN6RSxLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQztJQUNoRCxDQUFDO0lBRUssYUFBYTs7WUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDdkIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQzFCLENBQUM7S0FBQTtDQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3VpL2RpYWxvZ3MvY29tcG9uZW50cy9idXR0b24udHM/MDBlMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBidWlsZERvbSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9odG1sSGVscGVycyc7XHJcbmltcG9ydCB7IFN1aUNvbXBvbmVudEJhc2UsIFN1aURpYWxvZ05vdGlmaWVyLCBTdWlDb21wb25lbnRQYXJlbnQgfSBmcm9tICcuL2Jhc2VDb21wb25lbnQnO1xyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG4vKipcclxuICogU2ltcGxlIGJ1dHRvbnMgaW4gZGlhbG9nc1xyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aUJ1dHRvbkNvbXBvbmVudFBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgdHlwZT86IHN0cmluZyxcclxuICBpbmNyZW1lbnQ/OiBudW1iZXIsXHJcbiAgdGV4dD86IHN0cmluZyxcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIHNtb05hbWU6IHN0cmluZyxcclxuICBjb250cm9sOiBzdHJpbmcsXHJcbiAgaWNvbjogc3RyaW5nXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTaW1wbGUgY2xpY2sgYmVoYXZpb3IuICBObyB2YWx1ZSBqdXN0IHVzZWQgdG8gbm90aWZpeSBwYXJlbnQgZGlhbG9nXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdWlCdXR0b25Db21wb25lbnQgZXh0ZW5kcyBTdWlDb21wb25lbnRCYXNlIHtcclxuICBpY29uOiBzdHJpbmc7XHJcbiAgdGV4dD86IHN0cmluZztcclxuICBjb25zdHJ1Y3RvcihkaWFsb2c6IFN1aURpYWxvZ05vdGlmaWVyLCBwYXJhbWV0ZXI6IFN1aUJ1dHRvbkNvbXBvbmVudFBhcmFtcykge1xyXG4gICAgc3VwZXIoZGlhbG9nLCBwYXJhbWV0ZXIpO1xyXG4gICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7XHJcbiAgICB0aGlzLmljb24gPSBwYXJhbWV0ZXIuaWNvbjtcclxuICAgIHRoaXMudGV4dCA9IHBhcmFtZXRlci50ZXh0O1xyXG4gIH1cclxuICBnZXQgaHRtbCgpIHtcclxuICAgIGNvbnN0IGIgPSBidWlsZERvbTtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5wYXJhbWV0ZXJJZDtcclxuICAgIHRoaXMuaWNvbiA9IHR5cGVvZih0aGlzLmljb24pID09PSAndW5kZWZpbmVkJyA/ICcnIDogdGhpcy5pY29uO1xyXG4gICAgaWYgKCF0aGlzLnRleHQpIHtcclxuICAgICAgY29uc3QgciA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3NlcygnYnV0dG9uQ29udHJvbCBzbW9Db250cm9sJykpLmF0dHIoJ2lkJywgdGhpcy5wYXJhbWV0ZXJJZCkuYXR0cignZGF0YS1wYXJhbScsIHRoaXMuc21vTmFtZSlcclxuICAgICAgICAuYXBwZW5kKGIoJ2J1dHRvbicpLmF0dHIoJ3R5cGUnLCAnYnV0dG9uJykuY2xhc3Nlcyh0aGlzLmljb24pXHJcbiAgICAgICAgICAuYXR0cignaWQnLCBpZCArICctaW5wdXQnKSkuYXBwZW5kKFxyXG4gICAgICAgICAgYignbGFiZWwnKS5hdHRyKCdmb3InLCBpZCArICctaW5wdXQnKS5hdHRyKCdhcmlhLWxhYmVsJyx0aGlzLmxhYmVsKS50ZXh0KHRoaXMubGFiZWwpKTtcclxuICAgICAgcmV0dXJuIHI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCByID0gYignZGl2JykuY2xhc3Nlcyh0aGlzLm1ha2VDbGFzc2VzKCdidXR0b25Db250cm9sIHNtb0NvbnRyb2wnKSkuYXR0cignaWQnLCB0aGlzLnBhcmFtZXRlcklkKS5hdHRyKCdkYXRhLXBhcmFtJywgdGhpcy5zbW9OYW1lKVxyXG4gICAgICAgIC5hcHBlbmQoYignYnV0dG9uJykuYXR0cigndHlwZScsICdidXR0b24nKS5jbGFzc2VzKHRoaXMuaWNvbilcclxuICAgICAgICAgIC5hdHRyKCdpZCcsIGlkICsgJy1pbnB1dCcpLmFwcGVuZChcclxuICAgICAgICAgICAgYignc3BhbicpLmNsYXNzZXMoJ2J1dHRvbi10ZXh0JykudGV4dCh0aGlzLnRleHQpXHJcbiAgICAgICAgICApKS5hcHBlbmQoXHJcbiAgICAgICAgICBiKCdsYWJlbCcpLmF0dHIoJ2ZvcicsIGlkICsgJy1pbnB1dCcpLmF0dHIoJ2FyaWEtbGFiZWwnLHRoaXMubGFiZWwpLnRleHQodGhpcy5sYWJlbCkpO1xyXG4gICAgICByZXR1cm4gcjtcclxuICAgIH1cclxuICB9XHJcbiAgX2dldElucHV0RWxlbWVudCgpIHtcclxuICAgIHZhciBwaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgcmV0dXJuICQodGhpcy5kaWFsb2cuZGdEb20uZWxlbWVudCkuZmluZCgnIycgKyBwaWQpLmZpbmQoJ2J1dHRvbicpO1xyXG4gIH1cclxuICBzZXRWYWx1ZSgpIHtcclxuICB9XHJcbiAgZ2V0VmFsdWUoKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgYmluZCgpIHtcclxuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5fZ2V0SW5wdXRFbGVtZW50KCk7XHJcbiAgICAkKGlucHV0KS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJyxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlZCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aUJ1dHRvbkNvbXBvc2l0ZVBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgdHlwZT86IHN0cmluZyxcclxuICBpbmNyZW1lbnQ/OiBudW1iZXIsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgdGV4dD86IHN0cmluZyxcclxuICBjb250cm9sOiBzdHJpbmcsXHJcbiAgaWNvbjogc3RyaW5nLFxyXG4gIHBhcmVudENvbnRyb2w6IFN1aUNvbXBvbmVudFBhcmVudFxyXG59XHJcbi8qKlxyXG4gKiBCdXR0b25zIHRoYXQgYXJlIHBhcnQgb2YgYSBjb21wb3NpdGUgY29udHJvbFxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpQnV0dG9uQ29tcG9zaXRlIGV4dGVuZHMgU3VpQnV0dG9uQ29tcG9uZW50IHtcclxuIHBhcmVudENvbnRyb2w6IFN1aUNvbXBvbmVudFBhcmVudDtcclxuICBjb25zdHJ1Y3RvcihkaWFsb2c6IFN1aURpYWxvZ05vdGlmaWVyLCBwYXJhbWV0ZXJzOiBTdWlCdXR0b25Db21wb3NpdGVQYXJhbXMpIHtcclxuICAgIHN1cGVyKGRpYWxvZywgcGFyYW1ldGVycyk7XHJcbiAgICB0aGlzLnBhcmVudENvbnRyb2wgPSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XHJcbiAgfVxyXG5cclxuICBhc3luYyBoYW5kbGVDaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gdHJ1ZTtcclxuICAgIGF3YWl0IHRoaXMucGFyZW50Q29udHJvbC5jaGFuZ2VkKCk7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSBmYWxzZTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/button.ts\n\n}");
3642
3642
 
3643
3643
  /***/ },
3644
3644
 
@@ -3682,7 +3682,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
3682
3682
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3683
3683
 
3684
3684
  "use strict";
3685
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiDropdownComponent: () => (/* binding */ SuiDropdownComponent),\n/* harmony export */ SuiDropdownComposite: () => (/* binding */ SuiDropdownComposite)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * Classes to support dropdown compontents\n * @module /ui/dialogs/components/dropdown\n */\n\n\n/**\n * single-select dropdown list\n * @category SuiDialog\n */\nclass SuiDropdownComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_1__.SuiComponentBase {\n constructor(dialog, parameter) {\n var _a, _b;\n super(dialog, parameter);\n this.value = '';\n this.optionIds = [];\n this.options = parameter.options;\n this.disabledOption = (_a = parameter.disabledOption) !== null && _a !== void 0 ? _a : '';\n this.dataType = (_b = parameter.dataType) !== null && _b !== void 0 ? _b : 'string';\n }\n checkDefault(s, b) {\n if (this.disabledOption.length) {\n s.prop('required', true).append(b('option').attr('selected', 'selected').prop('disabled', true).text(this.disabledOption));\n }\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const id = this.id;\n const label = this.value.length > 0 ? this.value : this.label;\n this.optionIds = [];\n const menuId = `${id}-menu`;\n const r = b('div').classes(this.makeClasses('dropdownControl smoControl')).attr('id', id).attr('data-param', this.smoName)\n .append(b('button').classes('btn dropdown-toggle').text(label));\n const s = b('ul').attr('role', 'menu').classes('dropdown-menu rounded-3 shadow w-220px').attr('id', menuId);\n this.checkDefault(s, b);\n this.options.forEach((option, ix) => {\n const optionId = `${this.parameterId}-${ix}`;\n s.append(b('li').attr('id', optionId).attr('role', 'presentation').\n append(b('a').attr('role', 'menuItem').attr('href', '#').attr('data-value', option.value.toString())\n .classes('dropdown-item').text(option.label)));\n });\n r.append(s).append(b('label').attr('for', menuId).text(this.label));\n return r;\n }\n updateControls() {\n const updateEl = this._getInputElement();\n $(updateEl).html('');\n $(updateEl).append(this.html.dom());\n this.bind();\n }\n unselect() {\n $(this._getInputElement())[0].selectedIndex = -1;\n $(this._getInputElement()).blur();\n }\n _getInputElement() {\n var pid = this.id;\n return $(this.dialog.dgDom.element).find('#' + pid);\n }\n getValue() {\n let val = this.value;\n if (['int', 'float'].indexOf(this.dataType) >= 0) {\n val = (this.dataType.toLowerCase() === 'int') ? parseInt(val, 10) : val;\n val = (this.dataType.toLowerCase() === 'float') ? parseFloat(val) : val;\n if (isNaN(val)) {\n val = -1;\n }\n }\n return val;\n }\n getValueLabel() {\n let label = this.value;\n const selection = this.options.find((ff) => ff.value.toString() === this.value.toString());\n if (selection) {\n label = selection.label;\n }\n return label;\n }\n setValue(value) {\n this.value = value.toString();\n if (this.value.length) {\n $(this._getInputElement()).find('button.dropdown-toggle').text(this.getValueLabel());\n }\n }\n bind() {\n const input = this._getInputElement();\n $(input).find('button.dropdown-toggle').off('click').on('click', () => {\n $(input).find('ul.dropdown-menu').toggleClass('show');\n });\n $(input).find('ul li a.dropdown-item').off('click').on('click', (elem) => {\n this.value = $(elem.target).attr('data-value');\n $(input).find('ul.dropdown-menu').removeClass('show');\n if (this.value.length) {\n $(this._getInputElement()).find('button.dropdown-toggle').text(this.getValueLabel());\n }\n this.handleChanged();\n });\n }\n}\n/**\n * A dropdown composite mixes a dropdown with some other\n * @category SuiDialog\n */\nclass SuiDropdownComposite extends SuiDropdownComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n this.changeFlag = true;\n this.parentControl.changed();\n this.changeFlag = false;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL2Ryb3Bkb3duLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSx5REFBeUQ7QUFDekQseUNBQXlDO0FBQ3pDOzs7R0FHRztBQUNvRDtBQUMyRDtBQTBCbEg7OztHQUdHO0FBQ0ksTUFBTSxvQkFBcUIsU0FBUSw0REFBZ0I7SUFPeEQsWUFBWSxNQUF5QixFQUFFLFNBQXFDOztRQUMxRSxLQUFLLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBSjNCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFFbkIsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUd2QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFRLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxlQUFTLENBQUMsY0FBYyxtQ0FBSSxFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLFFBQVEsR0FBRyxlQUFTLENBQUMsUUFBUSxtQ0FBSSxRQUFRLENBQUM7SUFDakQsQ0FBQztJQUNELFlBQVksQ0FBQyxDQUFNLEVBQUUsQ0FBTTtRQUN6QixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQzdILENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sTUFBTSxDQUFDLEdBQUcseURBQVEsQ0FBQztRQUNuQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENB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QUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDdkYsQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDRjtBQXlCRDs7O0dBR0c7QUFDSSxNQUFNLG9CQUFxQixTQUFRLG9CQUFvQjtJQUU1RCxZQUFZLE1BQXlCLEVBQUUsVUFBc0M7UUFDM0UsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7SUFDaEQsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7Q0FDRiIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy91aS9kaWFsb2dzL2NvbXBvbmVudHMvZHJvcGRvd24udHM/NzNjMiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuLyoqXHJcbiAqIENsYXNzZXMgdG8gc3VwcG9ydCBkcm9wZG93biBjb21wb250ZW50c1xyXG4gKiBAbW9kdWxlIC91aS9kaWFsb2dzL2NvbXBvbmVudHMvZHJvcGRvd25cclxuICovXHJcbmltcG9ydCB7IGJ1aWxkRG9tIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2h0bWxIZWxwZXJzJztcclxuaW1wb3J0IHsgU3VpQ29tcG9uZW50QmFzZSwgU3VpRGlhbG9nTm90aWZpZXIsIFN1aUNvbXBvbmVudFBhcmVudCwgRGlhbG9nRGVmaW5pdGlvbk9wdGlvbiB9IGZyb20gJy4vYmFzZUNvbXBvbmVudCc7XHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBjb25zdHJ1Y3RvciBwYXJhbXMgZm9yIHtAbGluayBTdWlEcm9wZG93bkNvbXBvbmVudH1cclxuICogQHBhcmFtIGlkIGlkIGluIERPTVxyXG4gKiBAcGFyYW0gY2xhc3Nlc1xyXG4gKiBAcGFyYW0gdHlwZSBpbmRpY2F0ZXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFsdWVcclxuICogQHBhcmFtIGluY3JlbWVudCBub3QgdXNlZFxyXG4gKiBAcGFyYW0gbGFiZWxcclxuICogQHBhcmFtIHNtb05hbWUgdmFyaWFibGUgbmFtZSBpbiBkaWFsb2cvYWRhcHRlclxyXG4gKiBAcGFyYW0gY29udHJvbCBuYW1lIG9mIGNvbnN0cnVjdG9yXHJcbiAqIEBwYXJhbSBkaXNhYmxlZE9wdGlvblxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aURyb3Bkb3duQ29tcG9uZW50UGFyYW1zIHtcclxuICBpZDogc3RyaW5nLFxyXG4gIGNsYXNzZXM6IHN0cmluZyxcclxuICBpbmNyZW1lbnQ/OiBudW1iZXIsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nLFxyXG4gIGRpc2FibGVkT3B0aW9uPzogc3RyaW5nLFxyXG4gIGRhdGFUeXBlPzogc3RyaW5nLFxyXG4gIG9wdGlvbnM/OiBEaWFsb2dEZWZpbml0aW9uT3B0aW9uW11cclxufVxyXG4vKipcclxuICogc2luZ2xlLXNlbGVjdCBkcm9wZG93biBsaXN0XHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdWlEcm9wZG93bkNvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudEJhc2Uge1xyXG4gIG9wdGlvbnM6IERpYWxvZ0RlZmluaXRpb25PcHRpb25bXTtcclxuICBkaXNhYmxlZE9wdGlvbjogc3RyaW5nO1xyXG4gIGRhdGFUeXBlOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZyA9ICcnO1xyXG4gIFxyXG4gIG9wdGlvbklkczogc3RyaW5nW10gPSBbXTtcclxuICBjb25zdHJ1Y3RvcihkaWFsb2c6IFN1aURpYWxvZ05vdGlmaWVyLCBwYXJhbWV0ZXI6IFN1aURyb3Bkb3duQ29tcG9uZW50UGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcik7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBwYXJhbWV0ZXIub3B0aW9ucyE7XHJcbiAgICB0aGlzLmRpc2FibGVkT3B0aW9uID0gcGFyYW1ldGVyLmRpc2FibGVkT3B0aW9uID8/ICcnO1xyXG4gICAgdGhpcy5kYXRhVHlwZSA9IHBhcmFtZXRlci5kYXRhVHlwZSA/PyAnc3RyaW5nJztcclxuICB9XHJcbiAgY2hlY2tEZWZhdWx0KHM6IGFueSwgYjogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZE9wdGlvbi5sZW5ndGgpIHtcclxuICAgICAgcy5wcm9wKCdyZXF1aXJlZCcsIHRydWUpLmFwcGVuZChiKCdvcHRpb24nKS5hdHRyKCdzZWxlY3RlZCcsICdzZWxlY3RlZCcpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkudGV4dCh0aGlzLmRpc2FibGVkT3B0aW9uKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaHRtbCgpIHtcclxuICAgIGNvbnN0IGIgPSBidWlsZERvbTtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5pZDtcclxuICAgIGNvbnN0IGxhYmVsID0gdGhpcy52YWx1ZS5sZW5ndGggPiAwID8gdGhpcy52YWx1ZSA6IHRoaXMubGFiZWw7XHJcbiAgICB0aGlzLm9wdGlvbklkcyA9IFtdO1xyXG4gICAgY29uc3QgbWVudUlkID0gYCR7aWR9LW1lbnVgO1xyXG4gICAgY29uc3QgciA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3NlcygnZHJvcGRvd25Db250cm9sIHNtb0NvbnRyb2wnKSkuYXR0cignaWQnLCBpZCkuYXR0cignZGF0YS1wYXJhbScsIHRoaXMuc21vTmFtZSlcclxuICAgICAgLmFwcGVuZChiKCdidXR0b24nKS5jbGFzc2VzKCdidG4gZHJvcGRvd24tdG9nZ2xlJykudGV4dChsYWJlbCkpO1xyXG4gICAgY29uc3QgcyA9IGIoJ3VsJykuYXR0cigncm9sZScsICdtZW51JykuY2xhc3NlcygnZHJvcGRvd24tbWVudSByb3VuZGVkLTMgc2hhZG93IHctMjIwcHgnKS5hdHRyKCdpZCcsIG1lbnVJZCk7XHJcbiAgICB0aGlzLmNoZWNrRGVmYXVsdChzLCBiKTtcclxuICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKChvcHRpb24sIGl4KSA9PiB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbklkID0gYCR7dGhpcy5wYXJhbWV0ZXJJZH0tJHtpeH1gO1xyXG4gICAgICBzLmFwcGVuZChcclxuICAgICAgICBiKCdsaScpLmF0dHIoJ2lkJywgb3B0aW9uSWQpLmF0dHIoJ3JvbGUnLCdwcmVzZW50YXRpb24nKS5cclxuICAgICAgICBhcHBlbmQoYignYScpLmF0dHIoJ3JvbGUnLCAnbWVudUl0ZW0nKS5hdHRyKCdocmVmJywgJyMnKS5hdHRyKCdkYXRhLXZhbHVlJywgb3B0aW9uLnZhbHVlLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAuY2xhc3NlcygnZHJvcGRvd24taXRlbScpLnRleHQob3B0aW9uLmxhYmVsKSkpO1xyXG4gICAgfSk7XHJcbiAgICByLmFwcGVuZChzKS5hcHBlbmQoXHJcbiAgICAgIGIoJ2xhYmVsJykuYXR0cignZm9yJywgbWVudUlkKS50ZXh0KHRoaXMubGFiZWwpKTtcclxuICAgIHJldHVybiByO1xyXG4gIH1cclxuICB1cGRhdGVDb250cm9scygpIHtcclxuICAgIGNvbnN0IHVwZGF0ZUVsID0gdGhpcy5fZ2V0SW5wdXRFbGVtZW50KCk7XHJcbiAgICAkKHVwZGF0ZUVsKS5odG1sKCcnKTtcclxuICAgICQodXBkYXRlRWwpLmFwcGVuZCh0aGlzLmh0bWwuZG9tKCkpO1xyXG4gICAgdGhpcy5iaW5kKCk7XHJcbiAgfVxyXG4gIHVuc2VsZWN0KCkge1xyXG4gICAgJCh0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKSlbMF0uc2VsZWN0ZWRJbmRleCA9IC0xO1xyXG4gICAgJCh0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKSkuYmx1cigpO1xyXG4gIH1cclxuXHJcbiAgX2dldElucHV0RWxlbWVudCgpIHtcclxuICAgIHZhciBwaWQgPSB0aGlzLmlkO1xyXG4gICAgcmV0dXJuICQodGhpcy5kaWFsb2cuZGdEb20uZWxlbWVudCkuZmluZCgnIycgKyBwaWQpO1xyXG4gIH1cclxuICBnZXRWYWx1ZSgpOiBzdHJpbmcgfCBudW1iZXIge1xyXG4gICAgbGV0IHZhbDogc3RyaW5nIHwgbnVtYmVyID0gdGhpcy52YWx1ZTtcclxuICAgIGlmIChbJ2ludCcsICdmbG9hdCddLmluZGV4T2YodGhpcy5kYXRhVHlwZSkgPj0gMCkge1xyXG4gICAgICB2YWwgPSAodGhpcy5kYXRhVHlwZS50b0xvd2VyQ2FzZSgpID09PSAnaW50JykgPyAgcGFyc2VJbnQodmFsLCAxMCkgOiB2YWw7XHJcbiAgICAgIHZhbCA9ICh0aGlzLmRhdGFUeXBlLnRvTG93ZXJDYXNlKCkgPT09ICdmbG9hdCcpID8gIHBhcnNlRmxvYXQodmFsIGFzIHN0cmluZykgOiB2YWw7XHJcbiAgICAgIGlmIChpc05hTih2YWwgYXMgbnVtYmVyKSkge1xyXG4gICAgICAgIHZhbCA9IC0xO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH1cclxuICBnZXRWYWx1ZUxhYmVsKCkge1xyXG4gICAgbGV0IGxhYmVsID0gdGhpcy52YWx1ZTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKChmZikgPT4gZmYudmFsdWUudG9TdHJpbmcoKSA9PT0gdGhpcy52YWx1ZS50b1N0cmluZygpKTtcclxuICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgbGFiZWwgPSBzZWxlY3Rpb24ubGFiZWw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGFiZWw7XHJcbiAgfVxyXG4gIHNldFZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcclxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgaWYgKHRoaXMudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICQodGhpcy5fZ2V0SW5wdXRFbGVtZW50KCkpLmZpbmQoJ2J1dHRvbi5kcm9wZG93bi10b2dnbGUnKS50ZXh0KHRoaXMuZ2V0VmFsdWVMYWJlbCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJpbmQoKSB7XHJcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuX2dldElucHV0RWxlbWVudCgpO1xyXG4gICAgJChpbnB1dCkuZmluZCgnYnV0dG9uLmRyb3Bkb3duLXRvZ2dsZScpLm9mZignY2xpY2snKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICQoaW5wdXQpLmZpbmQoJ3VsLmRyb3Bkb3duLW1lbnUnKS50b2dnbGVDbGFzcygnc2hvdycpO1xyXG4gICAgfSk7XHJcbiAgICAkKGlucHV0KS5maW5kKCd1bCBsaSBhLmRyb3Bkb3duLWl0ZW0nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJyxcclxuICAgICAgKGVsZW06IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSAkKGVsZW0udGFyZ2V0KS5hdHRyKCdkYXRhLXZhbHVlJyk7XHJcbiAgICAgICAgJChpbnB1dCkuZmluZCgndWwuZHJvcGRvd24tbWVudScpLnJlbW92ZUNsYXNzKCdzaG93Jyk7XHJcbiAgICAgICAgaWYgKHRoaXMudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAkKHRoaXMuX2dldElucHV0RWxlbWVudCgpKS5maW5kKCdidXR0b24uZHJvcGRvd24tdG9nZ2xlJykudGV4dCh0aGlzLmdldFZhbHVlTGFiZWwoKSk7XHJcbiAgICAgICAgfSAgICBcclxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZWQoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBjb25zdHJ1Y3RvciBwYXJhbXMgZm9yIHtAbGluayBTdWlEcm9wZG93bkNvbXBvc2l0ZX1cclxuICogZWxlbWVudCwgb2Z0ZW4gYSBjaGVja2JveFxyXG4gKiBAcGFyYW0ge2lkfSAtIHVuaXF1ZSBJRCBmb3IgdGhlIGNvbnRyb2wgRE9NXHJcbiAqIEBwYXJhbSB7Y2xhc3Nlc30gLSBhZGRpdGlvbmFsIGNsYXNzZXMgZm9yIHN0eWxpbmcgYWRkZWQgdG8gRE9NXHJcbiAqIEBwYXJhbSB7bGFiZWx9IC0gZGVmYXVsdCBsYWJlbCBmb3IgdGhlIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge3Ntb05hbWV9IC0gdGhlIHZhcmlhYmxlIGluIHRoZSBkaWFsb2cgdGhhdCB0aGUgY29tcG9uZW5ldCBtYXBzIHRvXHJcbiAqIEBwYXJhbSB7Y29udHJvbH0gLSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIFVJIGNvbnRyb2xcclxuICogQHBhcmFtIHtwYXJlbnRDb21wb25lbnR9IC0gZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzLCB0aGUgdG9wLWxldmVsXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICogKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlEcm9wZG93bkNvbXBvc2l0ZVBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgdHlwZT86IHN0cmluZyxcclxuICBpbmNyZW1lbnQ/OiBudW1iZXIsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nLFxyXG4gIGRpc2FibGVkT3B0aW9uPzogc3RyaW5nLFxyXG4gIGRhdGFUeXBlPzogc3RyaW5nLFxyXG4gIG9wdGlvbnM/OiBEaWFsb2dEZWZpbml0aW9uT3B0aW9uW10sXHJcbiAgcGFyZW50Q29udHJvbDogU3VpQ29tcG9uZW50UGFyZW50XHJcbn1cclxuLyoqXHJcbiAqIEEgZHJvcGRvd24gY29tcG9zaXRlIG1peGVzIGEgZHJvcGRvd24gd2l0aCBzb21lIG90aGVyIFxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpRHJvcGRvd25Db21wb3NpdGUgZXh0ZW5kcyBTdWlEcm9wZG93bkNvbXBvbmVudCB7XHJcbiAgcGFyZW50Q29udHJvbDogU3VpQ29tcG9uZW50UGFyZW50O1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcnM6IFN1aURyb3Bkb3duQ29tcG9zaXRlUGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcnMpO1xyXG4gICAgdGhpcy5wYXJlbnRDb250cm9sID0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2hhbmdlZCgpIHtcclxuICAgIHRoaXMuY2hhbmdlRmxhZyA9IHRydWU7XHJcbiAgICB0aGlzLnBhcmVudENvbnRyb2wuY2hhbmdlZCgpO1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gZmFsc2U7XHJcbiAgfVxyXG59Il0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/dropdown.ts\n\n}");
3685
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiDropdownComponent: () => (/* binding */ SuiDropdownComponent),\n/* harmony export */ SuiDropdownComposite: () => (/* binding */ SuiDropdownComposite)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.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 * Classes to support dropdown compontents\n * @module /ui/dialogs/components/dropdown\n */\n\n\n/**\n * single-select dropdown list\n * @category SuiDialog\n */\nclass SuiDropdownComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_1__.SuiComponentBase {\n constructor(dialog, parameter) {\n var _a, _b;\n super(dialog, parameter);\n this.value = '';\n this.optionIds = [];\n this.options = parameter.options;\n this.disabledOption = (_a = parameter.disabledOption) !== null && _a !== void 0 ? _a : '';\n this.dataType = (_b = parameter.dataType) !== null && _b !== void 0 ? _b : 'string';\n }\n checkDefault(s, b) {\n if (this.disabledOption.length) {\n s.prop('required', true).append(b('option').attr('selected', 'selected').prop('disabled', true).text(this.disabledOption));\n }\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const id = this.id;\n const label = this.value.length > 0 ? this.value : this.label;\n this.optionIds = [];\n const menuId = `${id}-menu`;\n const r = b('div').classes(this.makeClasses('dropdownControl smoControl')).attr('id', id).attr('data-param', this.smoName)\n .append(b('button').classes('btn dropdown-toggle').text(label));\n const s = b('ul').attr('role', 'menu').classes('dropdown-menu rounded-3 shadow w-220px').attr('id', menuId);\n this.checkDefault(s, b);\n this.options.forEach((option, ix) => {\n const optionId = `${this.parameterId}-${ix}`;\n s.append(b('li').attr('id', optionId).attr('role', 'presentation').\n append(b('a').attr('role', 'menuItem').attr('href', '#').attr('data-value', option.value.toString())\n .classes('dropdown-item').text(option.label)));\n });\n r.append(s).append(b('label').attr('for', menuId).text(this.label));\n return r;\n }\n updateControls() {\n const updateEl = this._getInputElement();\n $(updateEl).html('');\n $(updateEl).append(this.html.dom());\n this.bind();\n }\n unselect() {\n $(this._getInputElement())[0].selectedIndex = -1;\n $(this._getInputElement()).blur();\n }\n _getInputElement() {\n var pid = this.id;\n return $(this.dialog.dgDom.element).find('#' + pid);\n }\n getValue() {\n let val = this.value;\n if (['int', 'float'].indexOf(this.dataType) >= 0) {\n val = (this.dataType.toLowerCase() === 'int') ? parseInt(val, 10) : val;\n val = (this.dataType.toLowerCase() === 'float') ? parseFloat(val) : val;\n if (isNaN(val)) {\n val = -1;\n }\n }\n return val;\n }\n getValueLabel() {\n let label = this.value;\n const selection = this.options.find((ff) => ff.value.toString() === this.value.toString());\n if (selection) {\n label = selection.label;\n }\n return label;\n }\n setValue(value) {\n this.value = value.toString();\n if (this.value.length) {\n $(this._getInputElement()).find('button.dropdown-toggle').text(this.getValueLabel());\n }\n }\n bind() {\n const input = this._getInputElement();\n $(input).find('button.dropdown-toggle').off('click').on('click', () => {\n $(input).find('ul.dropdown-menu').toggleClass('show');\n });\n $(input).find('ul li a.dropdown-item').off('click').on('click', (elem) => {\n this.value = $(elem.target).attr('data-value');\n $(input).find('ul.dropdown-menu').removeClass('show');\n if (this.value.length) {\n $(this._getInputElement()).find('button.dropdown-toggle').text(this.getValueLabel());\n }\n this.handleChanged();\n });\n }\n}\n/**\n * A dropdown composite mixes a dropdown with some other\n * @category SuiDialog\n */\nclass SuiDropdownComposite extends SuiDropdownComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n return __awaiter(this, void 0, void 0, function* () {\n this.changeFlag = true;\n yield this.parentControl.changed();\n this.changeFlag = false;\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL2Ryb3Bkb3duLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBeUQ7QUFDekQseUNBQXlDO0FBQ3pDOzs7R0FHRztBQUNvRDtBQUMyRDtBQTBCbEg7OztHQUdHO0FBQ0ksTUFBTSxvQkFBcUIsU0FBUSw0REFBZ0I7SUFPeEQsWUFBWSxNQUF5QixFQUFFLFNBQXFDOztRQUMxRSxLQUFLLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBSjNCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFFbkIsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUd2QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFRLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxlQUFTLENBQUMsY0FBYyxtQ0FBSSxFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLFFBQVEsR0FBRyxlQUFTLENBQUMsUUFBUSxtQ0FBSSxRQUFRLENBQUM7SUFDakQsQ0FBQztJQUNELFlBQVksQ0FBQyxDQUFNLEVBQUUsQ0FBTTtRQUN6QixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQzdILENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sTUFBTSxDQUFDLEdBQUcseURBQVEsQ0FBQztRQUNuQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFB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LGdCQUFnQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDdkYsQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDRjtBQXlCRDs7O0dBR0c7QUFDSSxNQUFNLG9CQUFxQixTQUFRLG9CQUFvQjtJQUU1RCxZQUFZLE1BQXlCLEVBQUUsVUFBc0M7UUFDM0UsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7SUFDaEQsQ0FBQztJQUVLLGFBQWE7O1lBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUMxQixDQUFDO0tBQUE7Q0FDRiIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy91aS9kaWFsb2dzL2NvbXBvbmVudHMvZHJvcGRvd24udHM/NzNjMiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuLyoqXHJcbiAqIENsYXNzZXMgdG8gc3VwcG9ydCBkcm9wZG93biBjb21wb250ZW50c1xyXG4gKiBAbW9kdWxlIC91aS9kaWFsb2dzL2NvbXBvbmVudHMvZHJvcGRvd25cclxuICovXHJcbmltcG9ydCB7IGJ1aWxkRG9tIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2h0bWxIZWxwZXJzJztcclxuaW1wb3J0IHsgU3VpQ29tcG9uZW50QmFzZSwgU3VpRGlhbG9nTm90aWZpZXIsIFN1aUNvbXBvbmVudFBhcmVudCwgRGlhbG9nRGVmaW5pdGlvbk9wdGlvbiB9IGZyb20gJy4vYmFzZUNvbXBvbmVudCc7XHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBjb25zdHJ1Y3RvciBwYXJhbXMgZm9yIHtAbGluayBTdWlEcm9wZG93bkNvbXBvbmVudH1cclxuICogQHBhcmFtIGlkIGlkIGluIERPTVxyXG4gKiBAcGFyYW0gY2xhc3Nlc1xyXG4gKiBAcGFyYW0gdHlwZSBpbmRpY2F0ZXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFsdWVcclxuICogQHBhcmFtIGluY3JlbWVudCBub3QgdXNlZFxyXG4gKiBAcGFyYW0gbGFiZWxcclxuICogQHBhcmFtIHNtb05hbWUgdmFyaWFibGUgbmFtZSBpbiBkaWFsb2cvYWRhcHRlclxyXG4gKiBAcGFyYW0gY29udHJvbCBuYW1lIG9mIGNvbnN0cnVjdG9yXHJcbiAqIEBwYXJhbSBkaXNhYmxlZE9wdGlvblxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aURyb3Bkb3duQ29tcG9uZW50UGFyYW1zIHtcclxuICBpZDogc3RyaW5nLFxyXG4gIGNsYXNzZXM6IHN0cmluZyxcclxuICBpbmNyZW1lbnQ/OiBudW1iZXIsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nLFxyXG4gIGRpc2FibGVkT3B0aW9uPzogc3RyaW5nLFxyXG4gIGRhdGFUeXBlPzogc3RyaW5nLFxyXG4gIG9wdGlvbnM/OiBEaWFsb2dEZWZpbml0aW9uT3B0aW9uW11cclxufVxyXG4vKipcclxuICogc2luZ2xlLXNlbGVjdCBkcm9wZG93biBsaXN0XHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdWlEcm9wZG93bkNvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudEJhc2Uge1xyXG4gIG9wdGlvbnM6IERpYWxvZ0RlZmluaXRpb25PcHRpb25bXTtcclxuICBkaXNhYmxlZE9wdGlvbjogc3RyaW5nO1xyXG4gIGRhdGFUeXBlOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZyA9ICcnO1xyXG4gIFxyXG4gIG9wdGlvbklkczogc3RyaW5nW10gPSBbXTtcclxuICBjb25zdHJ1Y3RvcihkaWFsb2c6IFN1aURpYWxvZ05vdGlmaWVyLCBwYXJhbWV0ZXI6IFN1aURyb3Bkb3duQ29tcG9uZW50UGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcik7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBwYXJhbWV0ZXIub3B0aW9ucyE7XHJcbiAgICB0aGlzLmRpc2FibGVkT3B0aW9uID0gcGFyYW1ldGVyLmRpc2FibGVkT3B0aW9uID8/ICcnO1xyXG4gICAgdGhpcy5kYXRhVHlwZSA9IHBhcmFtZXRlci5kYXRhVHlwZSA/PyAnc3RyaW5nJztcclxuICB9XHJcbiAgY2hlY2tEZWZhdWx0KHM6IGFueSwgYjogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZE9wdGlvbi5sZW5ndGgpIHtcclxuICAgICAgcy5wcm9wKCdyZXF1aXJlZCcsIHRydWUpLmFwcGVuZChiKCdvcHRpb24nKS5hdHRyKCdzZWxlY3RlZCcsICdzZWxlY3RlZCcpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkudGV4dCh0aGlzLmRpc2FibGVkT3B0aW9uKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaHRtbCgpIHtcclxuICAgIGNvbnN0IGIgPSBidWlsZERvbTtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5pZDtcclxuICAgIGNvbnN0IGxhYmVsID0gdGhpcy52YWx1ZS5sZW5ndGggPiAwID8gdGhpcy52YWx1ZSA6IHRoaXMubGFiZWw7XHJcbiAgICB0aGlzLm9wdGlvbklkcyA9IFtdO1xyXG4gICAgY29uc3QgbWVudUlkID0gYCR7aWR9LW1lbnVgO1xyXG4gICAgY29uc3QgciA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3NlcygnZHJvcGRvd25Db250cm9sIHNtb0NvbnRyb2wnKSkuYXR0cignaWQnLCBpZCkuYXR0cignZGF0YS1wYXJhbScsIHRoaXMuc21vTmFtZSlcclxuICAgICAgLmFwcGVuZChiKCdidXR0b24nKS5jbGFzc2VzKCdidG4gZHJvcGRvd24tdG9nZ2xlJykudGV4dChsYWJlbCkpO1xyXG4gICAgY29uc3QgcyA9IGIoJ3VsJykuYXR0cigncm9sZScsICdtZW51JykuY2xhc3NlcygnZHJvcGRvd24tbWVudSByb3VuZGVkLTMgc2hhZG93IHctMjIwcHgnKS5hdHRyKCdpZCcsIG1lbnVJZCk7XHJcbiAgICB0aGlzLmNoZWNrRGVmYXVsdChzLCBiKTtcclxuICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKChvcHRpb24sIGl4KSA9PiB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbklkID0gYCR7dGhpcy5wYXJhbWV0ZXJJZH0tJHtpeH1gO1xyXG4gICAgICBzLmFwcGVuZChcclxuICAgICAgICBiKCdsaScpLmF0dHIoJ2lkJywgb3B0aW9uSWQpLmF0dHIoJ3JvbGUnLCdwcmVzZW50YXRpb24nKS5cclxuICAgICAgICBhcHBlbmQoYignYScpLmF0dHIoJ3JvbGUnLCAnbWVudUl0ZW0nKS5hdHRyKCdocmVmJywgJyMnKS5hdHRyKCdkYXRhLXZhbHVlJywgb3B0aW9uLnZhbHVlLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAuY2xhc3NlcygnZHJvcGRvd24taXRlbScpLnRleHQob3B0aW9uLmxhYmVsKSkpO1xyXG4gICAgfSk7XHJcbiAgICByLmFwcGVuZChzKS5hcHBlbmQoXHJcbiAgICAgIGIoJ2xhYmVsJykuYXR0cignZm9yJywgbWVudUlkKS50ZXh0KHRoaXMubGFiZWwpKTtcclxuICAgIHJldHVybiByO1xyXG4gIH1cclxuICB1cGRhdGVDb250cm9scygpIHtcclxuICAgIGNvbnN0IHVwZGF0ZUVsID0gdGhpcy5fZ2V0SW5wdXRFbGVtZW50KCk7XHJcbiAgICAkKHVwZGF0ZUVsKS5odG1sKCcnKTtcclxuICAgICQodXBkYXRlRWwpLmFwcGVuZCh0aGlzLmh0bWwuZG9tKCkpO1xyXG4gICAgdGhpcy5iaW5kKCk7XHJcbiAgfVxyXG4gIHVuc2VsZWN0KCkge1xyXG4gICAgJCh0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKSlbMF0uc2VsZWN0ZWRJbmRleCA9IC0xO1xyXG4gICAgJCh0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKSkuYmx1cigpO1xyXG4gIH1cclxuXHJcbiAgX2dldElucHV0RWxlbWVudCgpIHtcclxuICAgIHZhciBwaWQgPSB0aGlzLmlkO1xyXG4gICAgcmV0dXJuICQodGhpcy5kaWFsb2cuZGdEb20uZWxlbWVudCkuZmluZCgnIycgKyBwaWQpO1xyXG4gIH1cclxuICBnZXRWYWx1ZSgpOiBzdHJpbmcgfCBudW1iZXIge1xyXG4gICAgbGV0IHZhbDogc3RyaW5nIHwgbnVtYmVyID0gdGhpcy52YWx1ZTtcclxuICAgIGlmIChbJ2ludCcsICdmbG9hdCddLmluZGV4T2YodGhpcy5kYXRhVHlwZSkgPj0gMCkge1xyXG4gICAgICB2YWwgPSAodGhpcy5kYXRhVHlwZS50b0xvd2VyQ2FzZSgpID09PSAnaW50JykgPyAgcGFyc2VJbnQodmFsLCAxMCkgOiB2YWw7XHJcbiAgICAgIHZhbCA9ICh0aGlzLmRhdGFUeXBlLnRvTG93ZXJDYXNlKCkgPT09ICdmbG9hdCcpID8gIHBhcnNlRmxvYXQodmFsIGFzIHN0cmluZykgOiB2YWw7XHJcbiAgICAgIGlmIChpc05hTih2YWwgYXMgbnVtYmVyKSkge1xyXG4gICAgICAgIHZhbCA9IC0xO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH1cclxuICBnZXRWYWx1ZUxhYmVsKCkge1xyXG4gICAgbGV0IGxhYmVsID0gdGhpcy52YWx1ZTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKChmZikgPT4gZmYudmFsdWUudG9TdHJpbmcoKSA9PT0gdGhpcy52YWx1ZS50b1N0cmluZygpKTtcclxuICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgbGFiZWwgPSBzZWxlY3Rpb24ubGFiZWw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGFiZWw7XHJcbiAgfVxyXG4gIHNldFZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcclxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgaWYgKHRoaXMudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICQodGhpcy5fZ2V0SW5wdXRFbGVtZW50KCkpLmZpbmQoJ2J1dHRvbi5kcm9wZG93bi10b2dnbGUnKS50ZXh0KHRoaXMuZ2V0VmFsdWVMYWJlbCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJpbmQoKSB7XHJcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuX2dldElucHV0RWxlbWVudCgpO1xyXG4gICAgJChpbnB1dCkuZmluZCgnYnV0dG9uLmRyb3Bkb3duLXRvZ2dsZScpLm9mZignY2xpY2snKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICQoaW5wdXQpLmZpbmQoJ3VsLmRyb3Bkb3duLW1lbnUnKS50b2dnbGVDbGFzcygnc2hvdycpO1xyXG4gICAgfSk7XHJcbiAgICAkKGlucHV0KS5maW5kKCd1bCBsaSBhLmRyb3Bkb3duLWl0ZW0nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJyxcclxuICAgICAgKGVsZW06IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSAkKGVsZW0udGFyZ2V0KS5hdHRyKCdkYXRhLXZhbHVlJyk7XHJcbiAgICAgICAgJChpbnB1dCkuZmluZCgndWwuZHJvcGRvd24tbWVudScpLnJlbW92ZUNsYXNzKCdzaG93Jyk7XHJcbiAgICAgICAgaWYgKHRoaXMudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAkKHRoaXMuX2dldElucHV0RWxlbWVudCgpKS5maW5kKCdidXR0b24uZHJvcGRvd24tdG9nZ2xlJykudGV4dCh0aGlzLmdldFZhbHVlTGFiZWwoKSk7XHJcbiAgICAgICAgfSAgICBcclxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZWQoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBjb25zdHJ1Y3RvciBwYXJhbXMgZm9yIHtAbGluayBTdWlEcm9wZG93bkNvbXBvc2l0ZX1cclxuICogZWxlbWVudCwgb2Z0ZW4gYSBjaGVja2JveFxyXG4gKiBAcGFyYW0ge2lkfSAtIHVuaXF1ZSBJRCBmb3IgdGhlIGNvbnRyb2wgRE9NXHJcbiAqIEBwYXJhbSB7Y2xhc3Nlc30gLSBhZGRpdGlvbmFsIGNsYXNzZXMgZm9yIHN0eWxpbmcgYWRkZWQgdG8gRE9NXHJcbiAqIEBwYXJhbSB7bGFiZWx9IC0gZGVmYXVsdCBsYWJlbCBmb3IgdGhlIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge3Ntb05hbWV9IC0gdGhlIHZhcmlhYmxlIGluIHRoZSBkaWFsb2cgdGhhdCB0aGUgY29tcG9uZW5ldCBtYXBzIHRvXHJcbiAqIEBwYXJhbSB7Y29udHJvbH0gLSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIFVJIGNvbnRyb2xcclxuICogQHBhcmFtIHtwYXJlbnRDb21wb25lbnR9IC0gZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzLCB0aGUgdG9wLWxldmVsXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICogKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlEcm9wZG93bkNvbXBvc2l0ZVBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgdHlwZT86IHN0cmluZyxcclxuICBpbmNyZW1lbnQ/OiBudW1iZXIsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nLFxyXG4gIGRpc2FibGVkT3B0aW9uPzogc3RyaW5nLFxyXG4gIGRhdGFUeXBlPzogc3RyaW5nLFxyXG4gIG9wdGlvbnM/OiBEaWFsb2dEZWZpbml0aW9uT3B0aW9uW10sXHJcbiAgcGFyZW50Q29udHJvbDogU3VpQ29tcG9uZW50UGFyZW50XHJcbn1cclxuLyoqXHJcbiAqIEEgZHJvcGRvd24gY29tcG9zaXRlIG1peGVzIGEgZHJvcGRvd24gd2l0aCBzb21lIG90aGVyIFxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpRHJvcGRvd25Db21wb3NpdGUgZXh0ZW5kcyBTdWlEcm9wZG93bkNvbXBvbmVudCB7XHJcbiAgcGFyZW50Q29udHJvbDogU3VpQ29tcG9uZW50UGFyZW50O1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcnM6IFN1aURyb3Bkb3duQ29tcG9zaXRlUGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcnMpO1xyXG4gICAgdGhpcy5wYXJlbnRDb250cm9sID0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlQ2hhbmdlZCgpIHtcclxuICAgIHRoaXMuY2hhbmdlRmxhZyA9IHRydWU7XHJcbiAgICBhd2FpdCB0aGlzLnBhcmVudENvbnRyb2wuY2hhbmdlZCgpO1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gZmFsc2U7XHJcbiAgfVxyXG59Il0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/dropdown.ts\n\n}");
3686
3686
 
3687
3687
  /***/ },
3688
3688
 
@@ -3726,7 +3726,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
3726
3726
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3727
3727
 
3728
3728
  "use strict";
3729
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiPitchArrayComponent: () => (/* binding */ SuiPitchArrayComponent),\n/* harmony export */ SuiPitchArrayComponentTab: () => (/* binding */ SuiPitchArrayComponentTab),\n/* harmony export */ SuiPitchComponent: () => (/* binding */ SuiPitchComponent),\n/* harmony export */ SuiPitchComposite: () => (/* binding */ SuiPitchComposite),\n/* harmony export */ getTabNotePitchesFcn: () => (/* binding */ getTabNotePitchesFcn)\n/* harmony export */ });\n/* harmony import */ var _components_baseComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/baseComponent */ \"./src/ui/dialogs/components/baseComponent.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 _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _dropdown__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dropdown */ \"./src/ui/dialogs/components/dropdown.ts\");\n/* harmony import */ var _rocker__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./rocker */ \"./src/ui/dialogs/components/rocker.ts\");\n/* harmony import */ var _button__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./button */ \"./src/ui/dialogs/components/button.ts\");\n/* harmony import */ var _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../smo/data/staffModifiers */ \"./src/smo/data/staffModifiers.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n\n\n\n\n\n\n\n/**\n * Allows users to pick a letter pitch, used in tab stave dialogs\n * @category SuiDialog\n */\nclass SuiPitchComponent extends _components_baseComponent__WEBPACK_IMPORTED_MODULE_0__.SuiComponentBase {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.dialog = dialog;\n this.view = this.dialog.getView();\n this.defaultValue = { letter: 'c', accidental: 'n', octave: 4 };\n const letterName = this.smoName + 'Letter';\n const accidentalName = this.smoName + 'Accidental';\n const octaveName = this.smoName + 'Octave';\n this.staticText = this.dialog.getStaticText();\n this.letterCtrl = new _dropdown__WEBPACK_IMPORTED_MODULE_3__.SuiDropdownComposite(this.dialog, {\n smoName: letterName,\n control: 'SuiDropdownComposite',\n label: ' ',\n parentControl: this,\n classes: '',\n id: letterName,\n options: [\n { value: 'a', label: 'A' },\n { value: 'b', label: 'B' },\n { value: 'c', label: 'C' },\n { value: 'd', label: 'D' },\n { value: 'e', label: 'E' },\n { value: 'f', label: 'F' },\n { value: 'g', label: 'G' }\n ]\n });\n this.accidentalCtrl = new _dropdown__WEBPACK_IMPORTED_MODULE_3__.SuiDropdownComposite(this.dialog, {\n smoName: accidentalName,\n control: 'SuiDropdownComposite',\n label: ' ',\n parentControl: this,\n classes: '',\n id: accidentalName,\n options: [\n { value: 'n', label: '' },\n { value: 'n', label: '#' },\n { value: 'n', label: 'b' },\n ]\n });\n this.octaveCtrl = new _rocker__WEBPACK_IMPORTED_MODULE_4__.SuiRockerComposite(this.dialog, {\n id: octaveName,\n classes: '',\n dataType: 'int',\n increment: 1,\n defaultValue: 4,\n label: 'Octave',\n smoName: octaveName,\n control: 'SuiRockerComposite',\n parentControl: this\n });\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_2__.buildDom;\n const q = b('div').classes(this.makeClasses('multiControl smoControl pitchContainer'))\n .attr('id', this.parameterId);\n q.append(this.letterCtrl.html);\n q.append(this.accidentalCtrl.html);\n q.append(this.octaveCtrl.html);\n return q;\n }\n getInputElement() {\n var pid = this.parameterId;\n return $('#' + pid);\n }\n getValue() {\n return {\n letter: this.letterCtrl.getValue(),\n accidental: this.accidentalCtrl.getValue().toString(),\n octave: this.octaveCtrl.getValue()\n };\n }\n setValue(val) {\n this.letterCtrl.setValue(val.letter);\n this.accidentalCtrl.setValue(val.accidental);\n this.octaveCtrl.setValue(val.octave);\n }\n changed() {\n this.handleChanged();\n }\n bind() {\n this.letterCtrl.bind();\n this.accidentalCtrl.bind();\n this.octaveCtrl.bind();\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiPitchComposite extends SuiPitchComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n this.changeFlag = true;\n this.parentControl.changed();\n this.changeFlag = false;\n }\n}\nconst getTabNotePitchesFcn = () => { return _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoTabStave.defaultStringPitches; };\n/**\n * @category SuiDialog\n */\nclass SuiPitchArrayComponent extends _components_baseComponent__WEBPACK_IMPORTED_MODULE_0__.SuiComponentParent {\n getButtonControlName(index) {\n return `${this.id}-delButton-${index}`;\n }\n getPitchControlName(index) {\n return `${this.id}-pitchCtrl-${index}`;\n }\n constructor(dialog, parameters, def) {\n super(dialog, parameters);\n this.pitchControls = [];\n this.createdShell = false;\n this.defaultPitchFinder = def;\n this.pitches = this.defaultPitchFinder();\n this.setPitchControls();\n this.resetButton = new _button__WEBPACK_IMPORTED_MODULE_5__.SuiButtonComposite(this.dialog, {\n id: `${this.id}-resetButton`,\n classes: '',\n label: 'Reset Pitches',\n smoName: `${this.id}-resetButton`,\n control: 'SuiButtonComposite',\n icon: 'icon-cross',\n parentControl: this\n });\n }\n setPitchControls() {\n this.pitchControls = [];\n for (var i = 0; i < this.pitches.length; ++i) {\n const pitch = this.pitches[i];\n const buttonControlName = this.getButtonControlName(i);\n const pitchControlName = this.getPitchControlName(i);\n const buttonCtrl = new _button__WEBPACK_IMPORTED_MODULE_5__.SuiButtonComposite(this.dialog, {\n id: buttonControlName,\n classes: '',\n label: 'Delete',\n smoName: buttonControlName,\n control: 'SuiButtonComposite',\n icon: 'icon-cross',\n parentControl: this\n });\n const pitchCtrl = new SuiPitchComposite(this.dialog, {\n id: pitchControlName,\n classes: '',\n label: ' ',\n smoName: pitchControlName,\n control: 'SuiPitchComposite',\n parentControl: this\n });\n this.pitchControls.push({\n buttonCtrl, pitchCtrl, pitch\n });\n }\n }\n bind() {\n this.resetButton.bind();\n this.pitchControls.forEach((pc) => {\n pc.buttonCtrl.bind();\n pc.pitchCtrl.bind();\n });\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_2__.buildDom;\n if (!this.createdShell) {\n // First time, create shell for component.\n this.createdShell = true;\n const q = b('div').classes(this.makeClasses('multiControl smoControl pitch-array-parent')).\n attr('id', this.parameterId);\n return q;\n }\n const q = b('div').classes('pitch-array-container').append(b('div').append(this.resetButton.html));\n this.pitchControls.forEach((row) => {\n q.append(b('div').classes('pitch-array-item').append(row.buttonCtrl.html).append(row.pitchCtrl.html));\n });\n return q;\n }\n getInputElement() {\n var pid = this.parameterId;\n return $('#' + pid);\n }\n setValue(pitches) {\n this.pitches = pitches;\n this.setPitchControls();\n this.updateControls();\n for (var i = 0; i < this.pitchControls.length; ++i) {\n const pc = this.pitchControls[i];\n pc.pitchCtrl.setValue(pitches[i]);\n }\n }\n getValue() {\n const rv = [];\n for (var i = 0; i < this.pitchControls.length; ++i) {\n const pc = this.pitchControls[i];\n rv.push(pc.pitchCtrl.getValue());\n }\n return rv;\n }\n updateControls() {\n const updateEl = this.getInputElement();\n $(updateEl).html('');\n $(updateEl).append(this.html.dom());\n $(updateEl).find('input').prop('disabled', false);\n $(updateEl).find('.toggle-disabled input').prop('checked', true);\n $(updateEl).find('.toggle-remove-row input').prop('checked', true);\n $(updateEl).find('.toggle-add-row input').prop('checked', false);\n $(updateEl).find('.toggle-disabled input').prop('disabled', true);\n this.bind();\n }\n changed() {\n let removed = false;\n const pitches = [];\n this.pitchControls.forEach((pc) => {\n if (pc.buttonCtrl.changeFlag) {\n removed = true;\n }\n else {\n pitches.push(pc.pitchCtrl.getValue());\n }\n });\n if (removed && this.pitchControls.length < 2) {\n return; // don't let user delete all the strings\n }\n // If the user asked to reset, update the pitches to default\n // then reset.\n if (this.resetButton.changeFlag) {\n this.pitches = this.defaultPitchFinder();\n this.pitches.sort((a, b) => _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.smoPitchToInt(a) > _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.smoPitchToInt(b) ? -1 : 1);\n }\n else {\n this.pitches = pitches;\n }\n this.setValue(this.pitches);\n this.handleChanged();\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiPitchArrayComponentTab extends SuiPitchArrayComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters, getTabNotePitchesFcn);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL3BpdGNoLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlEQUF5RDtBQUN6RCx5Q0FBeUM7QUFDcUY7QUFFM0U7QUFDZ0I7QUFFakI7QUFDSjtBQUNBO0FBQ2lCO0FBWS9EOzs7R0FHRztBQUNJLE1BQU0saUJBQWtCLFNBQVEsdUVBQWdCO0lBUXJELFlBQVksTUFBeUIsRUFBRSxTQUFpQztRQUN0RSxLQUFLLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNoRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztRQUMzQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLDJEQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDdEQsT0FBTyxFQUFFLFVBQVU7WUFDbkIsT0FBTyxFQUFFLHNCQUFzQjtZQUMvQixLQUFLLEVBQUUsR0FBRztZQUNWLGFBQWEsRUFBRSxJQUFJO1lBQ25CLE9BQU8sRUFBRSxFQUFFO1lBQ1gsRUFBRSxFQUFFLFVBQVU7WUFDZCxPQUFPLEVBQUU7Z0JBQ1AsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQzFCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUMxQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDMUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQzFCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUMxQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDMUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7YUFDM0I7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksMkRBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUMxRCxPQUFPLEVBQUUsY0FBYztZQUN2QixPQUFPLEVBQUUsc0JBQXNCO1lBQy9CLEtBQUssRUFBRSxHQUFHO1lBQ1YsYUFBYSxFQUFFLElBQUk7WUFDbkIsT0FBTyxFQUFFLEVBQUU7WUFDWCxFQUFFLEVBQUUsY0FBYztZQUNsQixPQUFPLEVBQUU7Z0JBQ1AsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7Z0JBQ3pCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUMxQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTthQUMzQjtTQUNGLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSx1REFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3BELEVBQUUsRUFBRSxVQUFVO1lBQ2QsT0FBTyxFQUFFLEVBQUU7WUFDWCxRQUFRLEVBQUUsS0FBSztZQUNmLFNBQVMsRUFBRSxDQUFDO1lBQ1osWUFBWSxFQUFFLENBQUM7WUFDZixLQUFLLEVBQUUsUUFBUTtZQUNmLE9BQU8sRUFBRSxVQUFVO1lBQ25CLE9BQU8sRUFBRSxvQkFBb0I7WUFDN0IsYUFBYSxFQUFFLElBQUk7U0FDcEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELElBQUksSUFBSTtRQUNOLE1BQU0sQ0FBQyxHQUFHLHlEQUFRLENBQUM7UUFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7YUFDbkYsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0QsZUFBZTtRQUNiLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDM0IsT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxRQUFRO1FBQ04sT0FBTztZQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBaUI7WUFDakQsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO1lBQ3JELE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtTQUNuQyxDQUFDO0lBQ0osQ0FBQztJQUNELFFBQVEsQ0FBQyxHQUFVO1FBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBSUQ7O0dBRUc7QUFDSSxNQUFNLGlCQUFrQixTQUFRLGlCQUFpQjtJQUV0RCxZQUFZLE1BQXlCLEVBQUUsVUFBbUM7UUFDeEUsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7SUFDaEQsQ0FBQztJQUNELGFBQWE7UUFDWCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQXVCTSxNQUFNLG9CQUFvQixHQUF5QixHQUFHLEVBQUUsR0FBRyxPQUFPLGlFQUFXLENBQUMsb0JBQW9CLEVBQUMsQ0FBQyxDQUFDO0FBRTVHOztHQUVHO0FBQ0ksTUFBTSxzQkFBdUIsU0FBUSx5RUFBa0I7SUFDNUQsb0JBQW9CLENBQUMsS0FBYTtRQUNoQyxPQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsY0FBYyxLQUFLLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsbUJBQW1CLENBQUMsS0FBYTtRQUMvQixPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsY0FBYyxLQUFLLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBTUQsWUFBWSxNQUF5QixFQUFFLFVBQWtDLEVBQUUsR0FBeUI7UUFDbEcsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUw1QixrQkFBYSxHQUF3QixFQUFFLENBQUM7UUFFeEMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFJNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx1REFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3JELEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLGNBQWM7WUFDNUIsT0FBTyxFQUFFLEVBQUU7WUFDWCxLQUFLLEVBQUUsZUFBZTtZQUN0QixPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxjQUFjO1lBQ2pDLE9BQU8sRUFBRSxvQkFBb0I7WUFDN0IsSUFBSSxFQUFFLFlBQVk7WUFDbEIsYUFBYSxFQUFFLElBQUk7U0FDcEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsTUFBTSxVQUFVLEdBQXVCLElBQUksdURBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRztnQkFDMUUsRUFBRSxFQUFFLGlCQUFpQjtnQkFDckIsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsS0FBSyxFQUFFLFFBQVE7Z0JBQ2YsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsT0FBTyxFQUFFLG9CQUFvQjtnQkFDN0IsSUFBSSxFQUFFLFlBQVk7Z0JBQ2xCLGFBQWEsRUFBRSxJQUFJO2FBQ3BCLENBQUMsQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFzQixJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ3RFLEVBQUUsRUFBRSxnQkFBZ0I7Z0JBQ3BCLE9BQU8sRUFBRSxFQUFFO2dCQUNYLEtBQUssRUFBRSxHQUFHO2dCQUNWLE9BQU8sRUFBRSxnQkFBZ0I7Z0JBQ3pCLE9BQU8sRUFBRSxtQkFBbUI7Z0JBQzVCLGFBQWEsRUFBRSxJQUFJO2FBQ3BCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO2dCQUN0QixVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUs7YUFDN0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ2hDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixNQUFNLENBQUMsR0FBRyx5REFBUSxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsMENBQTBDO1lBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO2dCQUN4RixJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25HLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDakMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN4RyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUNELGVBQWU7UUFDYixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzNCLE9BQU8sQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBQ0QsUUFBUSxDQUFDLE9BQWdCO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDO0lBQ0QsUUFBUTtRQUNOLE1BQU0sRUFBRSxHQUFZLEVBQUUsQ0FBQztRQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxjQUFjO1FBQ1osTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPO1FBQ0wsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ2hDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNqQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0MsT0FBTyxDQUFDLHdDQUF3QztRQUNsRCxDQUFDO1FBQ0QsNERBQTREO1FBQzVELGNBQWM7UUFDZCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLHFEQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLHFEQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUYsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQUNEOztHQUVHO0FBQ0ksTUFBTSx5QkFBMEIsU0FBUSxzQkFBc0I7SUFDbkUsWUFBWSxNQUF5QixFQUFFLFVBQWtDO1FBQ3ZFLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDbEQsQ0FBQztDQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3VpL2RpYWxvZ3MvY29tcG9uZW50cy9waXRjaC50cz8yOTEyIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG5pbXBvcnQgeyBTdWlDb21wb25lbnRCYXNlLCBTdWlEaWFsb2dOb3RpZmllciwgU3VpQ29tcG9uZW50UGFyZW50LCBTdWlCYXNlQ29tcG9uZW50UGFyYW1zIH0gZnJvbSAnLi4vY29tcG9uZW50cy9iYXNlQ29tcG9uZW50JztcclxuaW1wb3J0IHsgUGl0Y2gsIFBpdGNoTGV0dGVyIH0gZnJvbSAnLi4vLi4vLi4vc21vL2RhdGEvY29tbW9uJztcclxuaW1wb3J0IHsgU21vTXVzaWMgfSBmcm9tICcuLi8uLi8uLi9zbW8vZGF0YS9tdXNpYyc7XHJcbmltcG9ydCB7IERvbUJ1aWxkZXIsIGJ1aWxkRG9tIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2h0bWxIZWxwZXJzJztcclxuaW1wb3J0IHsgU3VpU2NvcmVWaWV3T3BlcmF0aW9ucyB9IGZyb20gJy4uLy4uLy4uL3JlbmRlci9zdWkvc2NvcmVWaWV3T3BlcmF0aW9ucyc7XHJcbmltcG9ydCB7IFN1aURyb3Bkb3duQ29tcG9zaXRlIH0gZnJvbSAnLi9kcm9wZG93bic7XHJcbmltcG9ydCB7IFN1aVJvY2tlckNvbXBvc2l0ZSB9IGZyb20gJy4vcm9ja2VyJztcclxuaW1wb3J0IHsgU3VpQnV0dG9uQ29tcG9zaXRlIH0gZnJvbSAnLi9idXR0b24nO1xyXG5pbXBvcnQgeyBTbW9UYWJTdGF2ZSB9IGZyb20gJy4uLy4uLy4uL3Ntby9kYXRhL3N0YWZmTW9kaWZpZXJzJztcclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG4vKipcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlQaXRjaENvbXBvbmVudFBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nXHJcbn1cclxuLyoqXHJcbiAqIEFsbG93cyB1c2VycyB0byBwaWNrIGEgbGV0dGVyIHBpdGNoLCB1c2VkIGluIHRhYiBzdGF2ZSBkaWFsb2dzXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdWlQaXRjaENvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudEJhc2Uge1xyXG4gIHZpZXc6IFN1aVNjb3JlVmlld09wZXJhdGlvbnM7XHJcbiAgc3RhdGljVGV4dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICBsZXR0ZXJDdHJsOiBTdWlEcm9wZG93bkNvbXBvc2l0ZTtcclxuICBhY2NpZGVudGFsQ3RybDogU3VpRHJvcGRvd25Db21wb3NpdGU7XHJcbiAgb2N0YXZlQ3RybDogU3VpUm9ja2VyQ29tcG9zaXRlO1xyXG4gIGRlZmF1bHRWYWx1ZTogUGl0Y2g7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcjogU3VpQmFzZUNvbXBvbmVudFBhcmFtcykge1xyXG4gICAgc3VwZXIoZGlhbG9nLCBwYXJhbWV0ZXIpO1xyXG4gICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7XHJcbiAgICB0aGlzLnZpZXcgPSB0aGlzLmRpYWxvZy5nZXRWaWV3KCk7XHJcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHsgbGV0dGVyOiAnYycsIGFjY2lkZW50YWw6ICduJywgb2N0YXZlOiA0IH07XHJcbiAgICBjb25zdCBsZXR0ZXJOYW1lID0gdGhpcy5zbW9OYW1lICsgJ0xldHRlcic7XHJcbiAgICBjb25zdCBhY2NpZGVudGFsTmFtZSA9IHRoaXMuc21vTmFtZSArICdBY2NpZGVudGFsJztcclxuICAgIGNvbnN0IG9jdGF2ZU5hbWUgPSB0aGlzLnNtb05hbWUgKyAnT2N0YXZlJztcclxuICAgIHRoaXMuc3RhdGljVGV4dCA9IHRoaXMuZGlhbG9nLmdldFN0YXRpY1RleHQoKTtcclxuICAgIHRoaXMubGV0dGVyQ3RybCA9IG5ldyBTdWlEcm9wZG93bkNvbXBvc2l0ZSh0aGlzLmRpYWxvZywge1xyXG4gICAgICBzbW9OYW1lOiBsZXR0ZXJOYW1lLFxyXG4gICAgICBjb250cm9sOiAnU3VpRHJvcGRvd25Db21wb3NpdGUnLFxyXG4gICAgICBsYWJlbDogJyAnLFxyXG4gICAgICBwYXJlbnRDb250cm9sOiB0aGlzLFxyXG4gICAgICBjbGFzc2VzOiAnJyxcclxuICAgICAgaWQ6IGxldHRlck5hbWUsXHJcbiAgICAgIG9wdGlvbnM6IFtcclxuICAgICAgICB7IHZhbHVlOiAnYScsIGxhYmVsOiAnQScgfSxcclxuICAgICAgICB7IHZhbHVlOiAnYicsIGxhYmVsOiAnQicgfSxcclxuICAgICAgICB7IHZhbHVlOiAnYycsIGxhYmVsOiAnQycgfSxcclxuICAgICAgICB7IHZhbHVlOiAnZCcsIGxhYmVsOiAnRCcgfSxcclxuICAgICAgICB7IHZhbHVlOiAnZScsIGxhYmVsOiAnRScgfSxcclxuICAgICAgICB7IHZhbHVlOiAnZicsIGxhYmVsOiAnRicgfSxcclxuICAgICAgICB7IHZhbHVlOiAnZycsIGxhYmVsOiAnRycgfVxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFjY2lkZW50YWxDdHJsID0gbmV3IFN1aURyb3Bkb3duQ29tcG9zaXRlKHRoaXMuZGlhbG9nLCB7XHJcbiAgICAgIHNtb05hbWU6IGFjY2lkZW50YWxOYW1lLFxyXG4gICAgICBjb250cm9sOiAnU3VpRHJvcGRvd25Db21wb3NpdGUnLFxyXG4gICAgICBsYWJlbDogJyAnLFxyXG4gICAgICBwYXJlbnRDb250cm9sOiB0aGlzLFxyXG4gICAgICBjbGFzc2VzOiAnJyxcclxuICAgICAgaWQ6IGFjY2lkZW50YWxOYW1lLFxyXG4gICAgICBvcHRpb25zOiBbXHJcbiAgICAgICAgeyB2YWx1ZTogJ24nLCBsYWJlbDogJycgfSxcclxuICAgICAgICB7IHZhbHVlOiAnbicsIGxhYmVsOiAnIycgfSxcclxuICAgICAgICB7IHZhbHVlOiAnbicsIGxhYmVsOiAnYicgfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm9jdGF2ZUN0cmwgPSBuZXcgU3VpUm9ja2VyQ29tcG9zaXRlKHRoaXMuZGlhbG9nLCB7XHJcbiAgICAgIGlkOiBvY3RhdmVOYW1lLFxyXG4gICAgICBjbGFzc2VzOiAnJyxcclxuICAgICAgZGF0YVR5cGU6ICdpbnQnLFxyXG4gICAgICBpbmNyZW1lbnQ6IDEsXHJcbiAgICAgIGRlZmF1bHRWYWx1ZTogNCxcclxuICAgICAgbGFiZWw6ICdPY3RhdmUnLFxyXG4gICAgICBzbW9OYW1lOiBvY3RhdmVOYW1lLFxyXG4gICAgICBjb250cm9sOiAnU3VpUm9ja2VyQ29tcG9zaXRlJyxcclxuICAgICAgcGFyZW50Q29udHJvbDogdGhpc1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGdldCBodG1sKCkge1xyXG4gICAgY29uc3QgYiA9IGJ1aWxkRG9tO1xyXG4gICAgY29uc3QgcSA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3NlcygnbXVsdGlDb250cm9sIHNtb0NvbnRyb2wgcGl0Y2hDb250YWluZXInKSlcclxuICAgICAgLmF0dHIoJ2lkJywgdGhpcy5wYXJhbWV0ZXJJZCk7XHJcbiAgICBxLmFwcGVuZCh0aGlzLmxldHRlckN0cmwuaHRtbCk7XHJcbiAgICBxLmFwcGVuZCh0aGlzLmFjY2lkZW50YWxDdHJsLmh0bWwpO1xyXG4gICAgcS5hcHBlbmQodGhpcy5vY3RhdmVDdHJsLmh0bWwpO1xyXG4gICAgcmV0dXJuIHE7XHJcbiAgfVxyXG4gIGdldElucHV0RWxlbWVudCgpIHtcclxuICAgIHZhciBwaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgcmV0dXJuICQoJyMnICsgcGlkKTtcclxuICB9XHJcbiAgZ2V0VmFsdWUoKTogUGl0Y2gge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGV0dGVyOiB0aGlzLmxldHRlckN0cmwuZ2V0VmFsdWUoKSBhcyBQaXRjaExldHRlcixcclxuICAgICAgYWNjaWRlbnRhbDogdGhpcy5hY2NpZGVudGFsQ3RybC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCksXHJcbiAgICAgIG9jdGF2ZTogdGhpcy5vY3RhdmVDdHJsLmdldFZhbHVlKClcclxuICAgIH07XHJcbiAgfVxyXG4gIHNldFZhbHVlKHZhbDogUGl0Y2gpIHtcclxuICAgIHRoaXMubGV0dGVyQ3RybC5zZXRWYWx1ZSh2YWwubGV0dGVyKTtcclxuICAgIHRoaXMuYWNjaWRlbnRhbEN0cmwuc2V0VmFsdWUodmFsLmFjY2lkZW50YWwpO1xyXG4gICAgdGhpcy5vY3RhdmVDdHJsLnNldFZhbHVlKHZhbC5vY3RhdmUpO1xyXG4gIH1cclxuICBjaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5oYW5kbGVDaGFuZ2VkKCk7XHJcbiAgfVxyXG4gIGJpbmQoKSB7XHJcbiAgICB0aGlzLmxldHRlckN0cmwuYmluZCgpO1xyXG4gICAgdGhpcy5hY2NpZGVudGFsQ3RybC5iaW5kKCk7XHJcbiAgICB0aGlzLm9jdGF2ZUN0cmwuYmluZCgpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFN1aVBpdGNoQ29tcG9zaXRlUGFyYW1zIGV4dGVuZHMgU3VpUGl0Y2hDb21wb25lbnRQYXJhbXMge1xyXG4gIHBhcmVudENvbnRyb2w6IFN1aUNvbXBvbmVudFBhcmVudFxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpUGl0Y2hDb21wb3NpdGUgZXh0ZW5kcyBTdWlQaXRjaENvbXBvbmVudCB7XHJcbiAgcGFyZW50Q29udHJvbDogU3VpQ29tcG9uZW50UGFyZW50O1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcnM6IFN1aVBpdGNoQ29tcG9zaXRlUGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcnMpO1xyXG4gICAgdGhpcy5wYXJlbnRDb250cm9sID0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xyXG4gIH1cclxuICBoYW5kbGVDaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gdHJ1ZTtcclxuICAgIHRoaXMucGFyZW50Q29udHJvbC5jaGFuZ2VkKCk7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSBmYWxzZTtcclxuICB9XHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3VpUGl0Y2hBcnJheUl0ZW0ge1xyXG4gIGJ1dHRvbkN0cmw6IFN1aUJ1dHRvbkNvbXBvc2l0ZSxcclxuICBwaXRjaEN0cmw6IFN1aVBpdGNoQ29tcG9zaXRlLFxyXG4gIHBpdGNoOiBQaXRjaFxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aVBpdGNoQXJyYXlQYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIGxhYmVsOiBzdHJpbmcsXHJcbiAgc21vTmFtZTogc3RyaW5nLFxyXG4gIGNvbnRyb2w6IHN0cmluZyxcclxuICBwaXRjaGVzPzogUGl0Y2hbXVxyXG59XHJcblxyXG4vLyB0aGlzIGFsbG93cyB1cyB0byB1c2UgdGhlIHBpdGNoIGFycmF5IGZvciBkaWZmZXJlbnQgcHVycG9zZXMsIHRvIHN1cHBvcnQgcmVzZXRcclxuZXhwb3J0IHR5cGUgZ2V0RGVmYXVsdFBpdGNoZXNGY24gPSAoKSA9PiBQaXRjaFtdO1xyXG5leHBvcnQgY29uc3QgZ2V0VGFiTm90ZVBpdGNoZXNGY246IGdldERlZmF1bHRQaXRjaGVzRmNuID0gKCkgPT4geyByZXR1cm4gU21vVGFiU3RhdmUuZGVmYXVsdFN0cmluZ1BpdGNoZXMgfTtcclxuXHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpUGl0Y2hBcnJheUNvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudFBhcmVudCB7XHJcbiAgZ2V0QnV0dG9uQ29udHJvbE5hbWUoaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuICBgJHt0aGlzLmlkfS1kZWxCdXR0b24tJHtpbmRleH1gO1xyXG4gIH1cclxuICBnZXRQaXRjaENvbnRyb2xOYW1lKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiBgJHt0aGlzLmlkfS1waXRjaEN0cmwtJHtpbmRleH1gO1xyXG4gIH1cclxuICByZXNldEJ1dHRvbjogU3VpQnV0dG9uQ29tcG9zaXRlO1xyXG4gIHBpdGNoQ29udHJvbHM6IFN1aVBpdGNoQXJyYXlJdGVtW10gPSBbXTtcclxuICBwaXRjaGVzOiBQaXRjaFtdO1xyXG4gIGNyZWF0ZWRTaGVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRlZmF1bHRQaXRjaEZpbmRlcjogZ2V0RGVmYXVsdFBpdGNoZXNGY247XHJcbiAgY29uc3RydWN0b3IoZGlhbG9nOiBTdWlEaWFsb2dOb3RpZmllciwgcGFyYW1ldGVyczogU3VpQmFzZUNvbXBvbmVudFBhcmFtcywgZGVmOiBnZXREZWZhdWx0UGl0Y2hlc0Zjbikge1xyXG4gICAgc3VwZXIoZGlhbG9nLCBwYXJhbWV0ZXJzKTtcclxuICAgIHRoaXMuZGVmYXVsdFBpdGNoRmluZGVyID0gZGVmO1xyXG4gICAgdGhpcy5waXRjaGVzID0gdGhpcy5kZWZhdWx0UGl0Y2hGaW5kZXIoKTtcclxuICAgIHRoaXMuc2V0UGl0Y2hDb250cm9scygpOyAgICBcclxuICAgIHRoaXMucmVzZXRCdXR0b24gPSBuZXcgU3VpQnV0dG9uQ29tcG9zaXRlKHRoaXMuZGlhbG9nLCB7XHJcbiAgICAgIGlkOiBgJHt0aGlzLmlkfS1yZXNldEJ1dHRvbmAsXHJcbiAgICAgIGNsYXNzZXM6ICcnLFxyXG4gICAgICBsYWJlbDogJ1Jlc2V0IFBpdGNoZXMnLFxyXG4gICAgICBzbW9OYW1lOiBgJHt0aGlzLmlkfS1yZXNldEJ1dHRvbmAsXHJcbiAgICAgIGNvbnRyb2w6ICdTdWlCdXR0b25Db21wb3NpdGUnLFxyXG4gICAgICBpY29uOiAnaWNvbi1jcm9zcycsXHJcbiAgICAgIHBhcmVudENvbnRyb2w6IHRoaXNcclxuICAgIH0pO1xyXG4gIH1cclxuICBzZXRQaXRjaENvbnRyb2xzKCkge1xyXG4gICAgdGhpcy5waXRjaENvbnRyb2xzID0gW107XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGl0Y2hlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBwaXRjaCA9IHRoaXMucGl0Y2hlc1tpXTtcclxuICAgICAgY29uc3QgYnV0dG9uQ29udHJvbE5hbWUgPSB0aGlzLmdldEJ1dHRvbkNvbnRyb2xOYW1lKGkpO1xyXG4gICAgICBjb25zdCBwaXRjaENvbnRyb2xOYW1lID0gdGhpcy5nZXRQaXRjaENvbnRyb2xOYW1lKGkpO1xyXG4gICAgICBjb25zdCBidXR0b25DdHJsOiBTdWlCdXR0b25Db21wb3NpdGUgPSBuZXcgU3VpQnV0dG9uQ29tcG9zaXRlKHRoaXMuZGlhbG9nLCAge1xyXG4gICAgICAgIGlkOiBidXR0b25Db250cm9sTmFtZSxcclxuICAgICAgICBjbGFzc2VzOiAnJyxcclxuICAgICAgICBsYWJlbDogJ0RlbGV0ZScsXHJcbiAgICAgICAgc21vTmFtZTogYnV0dG9uQ29udHJvbE5hbWUsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aUJ1dHRvbkNvbXBvc2l0ZScsXHJcbiAgICAgICAgaWNvbjogJ2ljb24tY3Jvc3MnLFxyXG4gICAgICAgIHBhcmVudENvbnRyb2w6IHRoaXNcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IHBpdGNoQ3RybDogU3VpUGl0Y2hDb21wb3NpdGUgPSBuZXcgU3VpUGl0Y2hDb21wb3NpdGUodGhpcy5kaWFsb2csIHtcclxuICAgICAgICBpZDogcGl0Y2hDb250cm9sTmFtZSxcclxuICAgICAgICBjbGFzc2VzOiAnJyxcclxuICAgICAgICBsYWJlbDogJyAnLFxyXG4gICAgICAgIHNtb05hbWU6IHBpdGNoQ29udHJvbE5hbWUsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aVBpdGNoQ29tcG9zaXRlJyxcclxuICAgICAgICBwYXJlbnRDb250cm9sOiB0aGlzXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnBpdGNoQ29udHJvbHMucHVzaCh7XHJcbiAgICAgICAgYnV0dG9uQ3RybCwgcGl0Y2hDdHJsLCBwaXRjaFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgYmluZCgpIHtcclxuICAgIHRoaXMucmVzZXRCdXR0b24uYmluZCgpO1xyXG4gICAgdGhpcy5waXRjaENvbnRyb2xzLmZvckVhY2goKHBjKSA9PiB7XHJcbiAgICAgIHBjLmJ1dHRvbkN0cmwuYmluZCgpO1xyXG4gICAgICBwYy5waXRjaEN0cmwuYmluZCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGdldCBodG1sKCkge1xyXG4gICAgY29uc3QgYiA9IGJ1aWxkRG9tO1xyXG4gICAgaWYgKCF0aGlzLmNyZWF0ZWRTaGVsbCkge1xyXG4gICAgICAvLyBGaXJzdCB0aW1lLCBjcmVhdGUgc2hlbGwgZm9yIGNvbXBvbmVudC5cclxuICAgICAgdGhpcy5jcmVhdGVkU2hlbGwgPSB0cnVlOyAgICBcclxuICAgICAgY29uc3QgcSA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3NlcygnbXVsdGlDb250cm9sIHNtb0NvbnRyb2wgcGl0Y2gtYXJyYXktcGFyZW50JykpLlxyXG4gICAgICAgIGF0dHIoJ2lkJywgdGhpcy5wYXJhbWV0ZXJJZCk7XHJcbiAgICAgIHJldHVybiBxO1xyXG4gICAgfSBcclxuICAgIGNvbnN0IHEgPSBiKCdkaXYnKS5jbGFzc2VzKCdwaXRjaC1hcnJheS1jb250YWluZXInKS5hcHBlbmQoYignZGl2JykuYXBwZW5kKHRoaXMucmVzZXRCdXR0b24uaHRtbCkpO1xyXG4gICAgdGhpcy5waXRjaENvbnRyb2xzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICBxLmFwcGVuZChiKCdkaXYnKS5jbGFzc2VzKCdwaXRjaC1hcnJheS1pdGVtJykuYXBwZW5kKHJvdy5idXR0b25DdHJsLmh0bWwpLmFwcGVuZChyb3cucGl0Y2hDdHJsLmh0bWwpKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHE7XHJcbiAgfVxyXG4gIGdldElucHV0RWxlbWVudCgpIHtcclxuICAgIHZhciBwaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgcmV0dXJuICQoJyMnICsgcGlkKTtcclxuICB9XHJcbiAgc2V0VmFsdWUocGl0Y2hlczogUGl0Y2hbXSkge1xyXG4gICAgdGhpcy5waXRjaGVzID0gcGl0Y2hlcztcclxuICAgIHRoaXMuc2V0UGl0Y2hDb250cm9scygpO1xyXG4gICAgdGhpcy51cGRhdGVDb250cm9scygpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBpdGNoQ29udHJvbHMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgcGMgPSB0aGlzLnBpdGNoQ29udHJvbHNbaV07XHJcbiAgICAgIHBjLnBpdGNoQ3RybC5zZXRWYWx1ZShwaXRjaGVzW2ldKTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0VmFsdWUoKSB7XHJcbiAgICBjb25zdCBydjogUGl0Y2hbXSA9IFtdO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBpdGNoQ29udHJvbHMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgcGMgPSB0aGlzLnBpdGNoQ29udHJvbHNbaV07XHJcbiAgICAgIHJ2LnB1c2gocGMucGl0Y2hDdHJsLmdldFZhbHVlKCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICB1cGRhdGVDb250cm9scygpIHtcclxuICAgIGNvbnN0IHVwZGF0ZUVsID0gdGhpcy5nZXRJbnB1dEVsZW1lbnQoKTtcclxuICAgICQodXBkYXRlRWwpLmh0bWwoJycpO1xyXG4gICAgJCh1cGRhdGVFbCkuYXBwZW5kKHRoaXMuaHRtbC5kb20oKSk7XHJcbiAgICAkKHVwZGF0ZUVsKS5maW5kKCdpbnB1dCcpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgJCh1cGRhdGVFbCkuZmluZCgnLnRvZ2dsZS1kaXNhYmxlZCBpbnB1dCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICQodXBkYXRlRWwpLmZpbmQoJy50b2dnbGUtcmVtb3ZlLXJvdyBpbnB1dCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICQodXBkYXRlRWwpLmZpbmQoJy50b2dnbGUtYWRkLXJvdyBpbnB1dCcpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XHJcbiAgICAkKHVwZGF0ZUVsKS5maW5kKCcudG9nZ2xlLWRpc2FibGVkIGlucHV0JykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgIHRoaXMuYmluZCgpO1xyXG4gIH1cclxuICBjaGFuZ2VkKCkge1xyXG4gICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcclxuICAgIGNvbnN0IHBpdGNoZXM6IFBpdGNoW10gPSBbXTtcclxuICAgIHRoaXMucGl0Y2hDb250cm9scy5mb3JFYWNoKChwYykgPT4ge1xyXG4gICAgICBpZiAocGMuYnV0dG9uQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgICAgcmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGl0Y2hlcy5wdXNoKHBjLnBpdGNoQ3RybC5nZXRWYWx1ZSgpKTtcclxuICAgICAgfVxyXG4gICAgfSk7ICAgIFxyXG4gICAgaWYgKHJlbW92ZWQgJiYgdGhpcy5waXRjaENvbnRyb2xzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuOyAvLyBkb24ndCBsZXQgdXNlciBkZWxldGUgYWxsIHRoZSBzdHJpbmdzXHJcbiAgICB9XHJcbiAgICAvLyBJZiB0aGUgdXNlciBhc2tlZCB0byByZXNldCwgdXBkYXRlIHRoZSBwaXRjaGVzIHRvIGRlZmF1bHRcclxuICAgIC8vIHRoZW4gcmVzZXQuXHJcbiAgICBpZiAodGhpcy5yZXNldEJ1dHRvbi5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIHRoaXMucGl0Y2hlcyA9IHRoaXMuZGVmYXVsdFBpdGNoRmluZGVyKCk7XHJcbiAgICAgIHRoaXMucGl0Y2hlcy5zb3J0KChhLCBiKSA9PiBTbW9NdXNpYy5zbW9QaXRjaFRvSW50KGEpID4gU21vTXVzaWMuc21vUGl0Y2hUb0ludChiKSA/IC0xIDogMSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBpdGNoZXMgPSBwaXRjaGVzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRWYWx1ZSh0aGlzLnBpdGNoZXMpO1xyXG4gICAgdGhpcy5oYW5kbGVDaGFuZ2VkKCk7XHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpUGl0Y2hBcnJheUNvbXBvbmVudFRhYiBleHRlbmRzIFN1aVBpdGNoQXJyYXlDb21wb25lbnQge1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcnM6IFN1aUJhc2VDb21wb25lbnRQYXJhbXMpIHtcclxuICAgIHN1cGVyKGRpYWxvZywgcGFyYW1ldGVycywgZ2V0VGFiTm90ZVBpdGNoZXNGY24pO1xyXG4gIH1cclxufSJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/pitch.ts\n\n}");
3729
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiPitchArrayComponent: () => (/* binding */ SuiPitchArrayComponent),\n/* harmony export */ SuiPitchArrayComponentTab: () => (/* binding */ SuiPitchArrayComponentTab),\n/* harmony export */ SuiPitchComponent: () => (/* binding */ SuiPitchComponent),\n/* harmony export */ SuiPitchComposite: () => (/* binding */ SuiPitchComposite),\n/* harmony export */ getTabNotePitchesFcn: () => (/* binding */ getTabNotePitchesFcn)\n/* harmony export */ });\n/* harmony import */ var _components_baseComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/baseComponent */ \"./src/ui/dialogs/components/baseComponent.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 _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _dropdown__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dropdown */ \"./src/ui/dialogs/components/dropdown.ts\");\n/* harmony import */ var _rocker__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./rocker */ \"./src/ui/dialogs/components/rocker.ts\");\n/* harmony import */ var _button__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./button */ \"./src/ui/dialogs/components/button.ts\");\n/* harmony import */ var _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../smo/data/staffModifiers */ \"./src/smo/data/staffModifiers.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 * Allows users to pick a letter pitch, used in tab stave dialogs\n * @category SuiDialog\n */\nclass SuiPitchComponent extends _components_baseComponent__WEBPACK_IMPORTED_MODULE_0__.SuiComponentBase {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.dialog = dialog;\n this.view = this.dialog.getView();\n this.defaultValue = { letter: 'c', accidental: 'n', octave: 4 };\n const letterName = this.smoName + 'Letter';\n const accidentalName = this.smoName + 'Accidental';\n const octaveName = this.smoName + 'Octave';\n this.staticText = this.dialog.getStaticText();\n this.letterCtrl = new _dropdown__WEBPACK_IMPORTED_MODULE_3__.SuiDropdownComposite(this.dialog, {\n smoName: letterName,\n control: 'SuiDropdownComposite',\n label: ' ',\n parentControl: this,\n classes: '',\n id: letterName,\n options: [\n { value: 'a', label: 'A' },\n { value: 'b', label: 'B' },\n { value: 'c', label: 'C' },\n { value: 'd', label: 'D' },\n { value: 'e', label: 'E' },\n { value: 'f', label: 'F' },\n { value: 'g', label: 'G' }\n ]\n });\n this.accidentalCtrl = new _dropdown__WEBPACK_IMPORTED_MODULE_3__.SuiDropdownComposite(this.dialog, {\n smoName: accidentalName,\n control: 'SuiDropdownComposite',\n label: ' ',\n parentControl: this,\n classes: '',\n id: accidentalName,\n options: [\n { value: 'n', label: '' },\n { value: 'n', label: '#' },\n { value: 'n', label: 'b' },\n ]\n });\n this.octaveCtrl = new _rocker__WEBPACK_IMPORTED_MODULE_4__.SuiRockerComposite(this.dialog, {\n id: octaveName,\n classes: '',\n dataType: 'int',\n increment: 1,\n defaultValue: 4,\n label: 'Octave',\n smoName: octaveName,\n control: 'SuiRockerComposite',\n parentControl: this\n });\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_2__.buildDom;\n const q = b('div').classes(this.makeClasses('multiControl smoControl pitchContainer'))\n .attr('id', this.parameterId);\n q.append(this.letterCtrl.html);\n q.append(this.accidentalCtrl.html);\n q.append(this.octaveCtrl.html);\n return q;\n }\n getInputElement() {\n var pid = this.parameterId;\n return $('#' + pid);\n }\n getValue() {\n return {\n letter: this.letterCtrl.getValue(),\n accidental: this.accidentalCtrl.getValue().toString(),\n octave: this.octaveCtrl.getValue()\n };\n }\n setValue(val) {\n this.letterCtrl.setValue(val.letter);\n this.accidentalCtrl.setValue(val.accidental);\n this.octaveCtrl.setValue(val.octave);\n }\n changed() {\n this.handleChanged();\n }\n bind() {\n this.letterCtrl.bind();\n this.accidentalCtrl.bind();\n this.octaveCtrl.bind();\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiPitchComposite extends SuiPitchComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n return __awaiter(this, void 0, void 0, function* () {\n this.changeFlag = true;\n yield this.parentControl.changed();\n this.changeFlag = false;\n });\n }\n}\nconst getTabNotePitchesFcn = () => { return _smo_data_staffModifiers__WEBPACK_IMPORTED_MODULE_6__.SmoTabStave.defaultStringPitches; };\n/**\n * @category SuiDialog\n */\nclass SuiPitchArrayComponent extends _components_baseComponent__WEBPACK_IMPORTED_MODULE_0__.SuiComponentParent {\n getButtonControlName(index) {\n return `${this.id}-delButton-${index}`;\n }\n getPitchControlName(index) {\n return `${this.id}-pitchCtrl-${index}`;\n }\n constructor(dialog, parameters, def) {\n super(dialog, parameters);\n this.pitchControls = [];\n this.createdShell = false;\n this.defaultPitchFinder = def;\n this.pitches = this.defaultPitchFinder();\n this.setPitchControls();\n this.resetButton = new _button__WEBPACK_IMPORTED_MODULE_5__.SuiButtonComposite(this.dialog, {\n id: `${this.id}-resetButton`,\n classes: '',\n label: 'Reset Pitches',\n smoName: `${this.id}-resetButton`,\n control: 'SuiButtonComposite',\n icon: 'icon-cross',\n parentControl: this\n });\n }\n setPitchControls() {\n this.pitchControls = [];\n for (var i = 0; i < this.pitches.length; ++i) {\n const pitch = this.pitches[i];\n const buttonControlName = this.getButtonControlName(i);\n const pitchControlName = this.getPitchControlName(i);\n const buttonCtrl = new _button__WEBPACK_IMPORTED_MODULE_5__.SuiButtonComposite(this.dialog, {\n id: buttonControlName,\n classes: '',\n label: 'Delete',\n smoName: buttonControlName,\n control: 'SuiButtonComposite',\n icon: 'icon-cross',\n parentControl: this\n });\n const pitchCtrl = new SuiPitchComposite(this.dialog, {\n id: pitchControlName,\n classes: '',\n label: ' ',\n smoName: pitchControlName,\n control: 'SuiPitchComposite',\n parentControl: this\n });\n this.pitchControls.push({\n buttonCtrl, pitchCtrl, pitch\n });\n }\n }\n bind() {\n this.resetButton.bind();\n this.pitchControls.forEach((pc) => {\n pc.buttonCtrl.bind();\n pc.pitchCtrl.bind();\n });\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_2__.buildDom;\n if (!this.createdShell) {\n // First time, create shell for component.\n this.createdShell = true;\n const q = b('div').classes(this.makeClasses('multiControl smoControl pitch-array-parent')).\n attr('id', this.parameterId);\n return q;\n }\n const q = b('div').classes('pitch-array-container').append(b('div').append(this.resetButton.html));\n this.pitchControls.forEach((row) => {\n q.append(b('div').classes('pitch-array-item').append(row.buttonCtrl.html).append(row.pitchCtrl.html));\n });\n return q;\n }\n getInputElement() {\n var pid = this.parameterId;\n return $('#' + pid);\n }\n setValue(pitches) {\n this.pitches = pitches;\n this.setPitchControls();\n this.updateControls();\n for (var i = 0; i < this.pitchControls.length; ++i) {\n const pc = this.pitchControls[i];\n pc.pitchCtrl.setValue(pitches[i]);\n }\n }\n getValue() {\n const rv = [];\n for (var i = 0; i < this.pitchControls.length; ++i) {\n const pc = this.pitchControls[i];\n rv.push(pc.pitchCtrl.getValue());\n }\n return rv;\n }\n updateControls() {\n const updateEl = this.getInputElement();\n $(updateEl).html('');\n $(updateEl).append(this.html.dom());\n $(updateEl).find('input').prop('disabled', false);\n $(updateEl).find('.toggle-disabled input').prop('checked', true);\n $(updateEl).find('.toggle-remove-row input').prop('checked', true);\n $(updateEl).find('.toggle-add-row input').prop('checked', false);\n $(updateEl).find('.toggle-disabled input').prop('disabled', true);\n this.bind();\n }\n changed() {\n let removed = false;\n const pitches = [];\n this.pitchControls.forEach((pc) => {\n if (pc.buttonCtrl.changeFlag) {\n removed = true;\n }\n else {\n pitches.push(pc.pitchCtrl.getValue());\n }\n });\n if (removed && this.pitchControls.length < 2) {\n return; // don't let user delete all the strings\n }\n // If the user asked to reset, update the pitches to default\n // then reset.\n if (this.resetButton.changeFlag) {\n this.pitches = this.defaultPitchFinder();\n this.pitches.sort((a, b) => _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.smoPitchToInt(a) > _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.smoPitchToInt(b) ? -1 : 1);\n }\n else {\n this.pitches = pitches;\n }\n this.setValue(this.pitches);\n this.handleChanged();\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiPitchArrayComponentTab extends SuiPitchArrayComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters, getTabNotePitchesFcn);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LENBQUMsQ0FBQyxHQUFHLHFEQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUYsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQUNEOztHQUVHO0FBQ0ksTUFBTSx5QkFBMEIsU0FBUSxzQkFBc0I7SUFDbkUsWUFBWSxNQUF5QixFQUFFLFVBQWtDO1FBQ3ZFLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDbEQsQ0FBQztDQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3VpL2RpYWxvZ3MvY29tcG9uZW50cy9waXRjaC50cz8yOTEyIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG5pbXBvcnQgeyBTdWlDb21wb25lbnRCYXNlLCBTdWlEaWFsb2dOb3RpZmllciwgU3VpQ29tcG9uZW50UGFyZW50LCBTdWlCYXNlQ29tcG9uZW50UGFyYW1zIH0gZnJvbSAnLi4vY29tcG9uZW50cy9iYXNlQ29tcG9uZW50JztcclxuaW1wb3J0IHsgUGl0Y2gsIFBpdGNoTGV0dGVyIH0gZnJvbSAnLi4vLi4vLi4vc21vL2RhdGEvY29tbW9uJztcclxuaW1wb3J0IHsgU21vTXVzaWMgfSBmcm9tICcuLi8uLi8uLi9zbW8vZGF0YS9tdXNpYyc7XHJcbmltcG9ydCB7IERvbUJ1aWxkZXIsIGJ1aWxkRG9tIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2h0bWxIZWxwZXJzJztcclxuaW1wb3J0IHsgU3VpU2NvcmVWaWV3T3BlcmF0aW9ucyB9IGZyb20gJy4uLy4uLy4uL3JlbmRlci9zdWkvc2NvcmVWaWV3T3BlcmF0aW9ucyc7XHJcbmltcG9ydCB7IFN1aURyb3Bkb3duQ29tcG9zaXRlIH0gZnJvbSAnLi9kcm9wZG93bic7XHJcbmltcG9ydCB7IFN1aVJvY2tlckNvbXBvc2l0ZSB9IGZyb20gJy4vcm9ja2VyJztcclxuaW1wb3J0IHsgU3VpQnV0dG9uQ29tcG9zaXRlIH0gZnJvbSAnLi9idXR0b24nO1xyXG5pbXBvcnQgeyBTbW9UYWJTdGF2ZSB9IGZyb20gJy4uLy4uLy4uL3Ntby9kYXRhL3N0YWZmTW9kaWZpZXJzJztcclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG4vKipcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlQaXRjaENvbXBvbmVudFBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nXHJcbn1cclxuLyoqXHJcbiAqIEFsbG93cyB1c2VycyB0byBwaWNrIGEgbGV0dGVyIHBpdGNoLCB1c2VkIGluIHRhYiBzdGF2ZSBkaWFsb2dzXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdWlQaXRjaENvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudEJhc2Uge1xyXG4gIHZpZXc6IFN1aVNjb3JlVmlld09wZXJhdGlvbnM7XHJcbiAgc3RhdGljVGV4dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICBsZXR0ZXJDdHJsOiBTdWlEcm9wZG93bkNvbXBvc2l0ZTtcclxuICBhY2NpZGVudGFsQ3RybDogU3VpRHJvcGRvd25Db21wb3NpdGU7XHJcbiAgb2N0YXZlQ3RybDogU3VpUm9ja2VyQ29tcG9zaXRlO1xyXG4gIGRlZmF1bHRWYWx1ZTogUGl0Y2g7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcjogU3VpQmFzZUNvbXBvbmVudFBhcmFtcykge1xyXG4gICAgc3VwZXIoZGlhbG9nLCBwYXJhbWV0ZXIpO1xyXG4gICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7XHJcbiAgICB0aGlzLnZpZXcgPSB0aGlzLmRpYWxvZy5nZXRWaWV3KCk7XHJcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHsgbGV0dGVyOiAnYycsIGFjY2lkZW50YWw6ICduJywgb2N0YXZlOiA0IH07XHJcbiAgICBjb25zdCBsZXR0ZXJOYW1lID0gdGhpcy5zbW9OYW1lICsgJ0xldHRlcic7XHJcbiAgICBjb25zdCBhY2NpZGVudGFsTmFtZSA9IHRoaXMuc21vTmFtZSArICdBY2NpZGVudGFsJztcclxuICAgIGNvbnN0IG9jdGF2ZU5hbWUgPSB0aGlzLnNtb05hbWUgKyAnT2N0YXZlJztcclxuICAgIHRoaXMuc3RhdGljVGV4dCA9IHRoaXMuZGlhbG9nLmdldFN0YXRpY1RleHQoKTtcclxuICAgIHRoaXMubGV0dGVyQ3RybCA9IG5ldyBTdWlEcm9wZG93bkNvbXBvc2l0ZSh0aGlzLmRpYWxvZywge1xyXG4gICAgICBzbW9OYW1lOiBsZXR0ZXJOYW1lLFxyXG4gICAgICBjb250cm9sOiAnU3VpRHJvcGRvd25Db21wb3NpdGUnLFxyXG4gICAgICBsYWJlbDogJyAnLFxyXG4gICAgICBwYXJlbnRDb250cm9sOiB0aGlzLFxyXG4gICAgICBjbGFzc2VzOiAnJyxcclxuICAgICAgaWQ6IGxldHRlck5hbWUsXHJcbiAgICAgIG9wdGlvbnM6IFtcclxuICAgICAgICB7IHZhbHVlOiAnYScsIGxhYmVsOiAnQScgfSxcclxuICAgICAgICB7IHZhbHVlOiAnYicsIGxhYmVsOiAnQicgfSxcclxuICAgICAgICB7IHZhbHVlOiAnYycsIGxhYmVsOiAnQycgfSxcclxuICAgICAgICB7IHZhbHVlOiAnZCcsIGxhYmVsOiAnRCcgfSxcclxuICAgICAgICB7IHZhbHVlOiAnZScsIGxhYmVsOiAnRScgfSxcclxuICAgICAgICB7IHZhbHVlOiAnZicsIGxhYmVsOiAnRicgfSxcclxuICAgICAgICB7IHZhbHVlOiAnZycsIGxhYmVsOiAnRycgfVxyXG4gICAgICBdXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFjY2lkZW50YWxDdHJsID0gbmV3IFN1aURyb3Bkb3duQ29tcG9zaXRlKHRoaXMuZGlhbG9nLCB7XHJcbiAgICAgIHNtb05hbWU6IGFjY2lkZW50YWxOYW1lLFxyXG4gICAgICBjb250cm9sOiAnU3VpRHJvcGRvd25Db21wb3NpdGUnLFxyXG4gICAgICBsYWJlbDogJyAnLFxyXG4gICAgICBwYXJlbnRDb250cm9sOiB0aGlzLFxyXG4gICAgICBjbGFzc2VzOiAnJyxcclxuICAgICAgaWQ6IGFjY2lkZW50YWxOYW1lLFxyXG4gICAgICBvcHRpb25zOiBbXHJcbiAgICAgICAgeyB2YWx1ZTogJ24nLCBsYWJlbDogJycgfSxcclxuICAgICAgICB7IHZhbHVlOiAnbicsIGxhYmVsOiAnIycgfSxcclxuICAgICAgICB7IHZhbHVlOiAnbicsIGxhYmVsOiAnYicgfSxcclxuICAgICAgXVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm9jdGF2ZUN0cmwgPSBuZXcgU3VpUm9ja2VyQ29tcG9zaXRlKHRoaXMuZGlhbG9nLCB7XHJcbiAgICAgIGlkOiBvY3RhdmVOYW1lLFxyXG4gICAgICBjbGFzc2VzOiAnJyxcclxuICAgICAgZGF0YVR5cGU6ICdpbnQnLFxyXG4gICAgICBpbmNyZW1lbnQ6IDEsXHJcbiAgICAgIGRlZmF1bHRWYWx1ZTogNCxcclxuICAgICAgbGFiZWw6ICdPY3RhdmUnLFxyXG4gICAgICBzbW9OYW1lOiBvY3RhdmVOYW1lLFxyXG4gICAgICBjb250cm9sOiAnU3VpUm9ja2VyQ29tcG9zaXRlJyxcclxuICAgICAgcGFyZW50Q29udHJvbDogdGhpc1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGdldCBodG1sKCkge1xyXG4gICAgY29uc3QgYiA9IGJ1aWxkRG9tO1xyXG4gICAgY29uc3QgcSA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3NlcygnbXVsdGlDb250cm9sIHNtb0NvbnRyb2wgcGl0Y2hDb250YWluZXInKSlcclxuICAgICAgLmF0dHIoJ2lkJywgdGhpcy5wYXJhbWV0ZXJJZCk7XHJcbiAgICBxLmFwcGVuZCh0aGlzLmxldHRlckN0cmwuaHRtbCk7XHJcbiAgICBxLmFwcGVuZCh0aGlzLmFjY2lkZW50YWxDdHJsLmh0bWwpO1xyXG4gICAgcS5hcHBlbmQodGhpcy5vY3RhdmVDdHJsLmh0bWwpO1xyXG4gICAgcmV0dXJuIHE7XHJcbiAgfVxyXG4gIGdldElucHV0RWxlbWVudCgpIHtcclxuICAgIHZhciBwaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgcmV0dXJuICQoJyMnICsgcGlkKTtcclxuICB9XHJcbiAgZ2V0VmFsdWUoKTogUGl0Y2gge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGV0dGVyOiB0aGlzLmxldHRlckN0cmwuZ2V0VmFsdWUoKSBhcyBQaXRjaExldHRlcixcclxuICAgICAgYWNjaWRlbnRhbDogdGhpcy5hY2NpZGVudGFsQ3RybC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCksXHJcbiAgICAgIG9jdGF2ZTogdGhpcy5vY3RhdmVDdHJsLmdldFZhbHVlKClcclxuICAgIH07XHJcbiAgfVxyXG4gIHNldFZhbHVlKHZhbDogUGl0Y2gpIHtcclxuICAgIHRoaXMubGV0dGVyQ3RybC5zZXRWYWx1ZSh2YWwubGV0dGVyKTtcclxuICAgIHRoaXMuYWNjaWRlbnRhbEN0cmwuc2V0VmFsdWUodmFsLmFjY2lkZW50YWwpO1xyXG4gICAgdGhpcy5vY3RhdmVDdHJsLnNldFZhbHVlKHZhbC5vY3RhdmUpO1xyXG4gIH1cclxuICBjaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5oYW5kbGVDaGFuZ2VkKCk7XHJcbiAgfVxyXG4gIGJpbmQoKSB7XHJcbiAgICB0aGlzLmxldHRlckN0cmwuYmluZCgpO1xyXG4gICAgdGhpcy5hY2NpZGVudGFsQ3RybC5iaW5kKCk7XHJcbiAgICB0aGlzLm9jdGF2ZUN0cmwuYmluZCgpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIFN1aVBpdGNoQ29tcG9zaXRlUGFyYW1zIGV4dGVuZHMgU3VpUGl0Y2hDb21wb25lbnRQYXJhbXMge1xyXG4gIHBhcmVudENvbnRyb2w6IFN1aUNvbXBvbmVudFBhcmVudFxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpUGl0Y2hDb21wb3NpdGUgZXh0ZW5kcyBTdWlQaXRjaENvbXBvbmVudCB7XHJcbiAgcGFyZW50Q29udHJvbDogU3VpQ29tcG9uZW50UGFyZW50O1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcnM6IFN1aVBpdGNoQ29tcG9zaXRlUGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcnMpO1xyXG4gICAgdGhpcy5wYXJlbnRDb250cm9sID0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xyXG4gIH1cclxuICBhc3luYyBoYW5kbGVDaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gdHJ1ZTtcclxuICAgIGF3YWl0IHRoaXMucGFyZW50Q29udHJvbC5jaGFuZ2VkKCk7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSBmYWxzZTtcclxuICB9XHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3VpUGl0Y2hBcnJheUl0ZW0ge1xyXG4gIGJ1dHRvbkN0cmw6IFN1aUJ1dHRvbkNvbXBvc2l0ZSxcclxuICBwaXRjaEN0cmw6IFN1aVBpdGNoQ29tcG9zaXRlLFxyXG4gIHBpdGNoOiBQaXRjaFxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aVBpdGNoQXJyYXlQYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIGxhYmVsOiBzdHJpbmcsXHJcbiAgc21vTmFtZTogc3RyaW5nLFxyXG4gIGNvbnRyb2w6IHN0cmluZyxcclxuICBwaXRjaGVzPzogUGl0Y2hbXVxyXG59XHJcblxyXG4vLyB0aGlzIGFsbG93cyB1cyB0byB1c2UgdGhlIHBpdGNoIGFycmF5IGZvciBkaWZmZXJlbnQgcHVycG9zZXMsIHRvIHN1cHBvcnQgcmVzZXRcclxuZXhwb3J0IHR5cGUgZ2V0RGVmYXVsdFBpdGNoZXNGY24gPSAoKSA9PiBQaXRjaFtdO1xyXG5leHBvcnQgY29uc3QgZ2V0VGFiTm90ZVBpdGNoZXNGY246IGdldERlZmF1bHRQaXRjaGVzRmNuID0gKCkgPT4geyByZXR1cm4gU21vVGFiU3RhdmUuZGVmYXVsdFN0cmluZ1BpdGNoZXMgfTtcclxuXHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpUGl0Y2hBcnJheUNvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudFBhcmVudCB7XHJcbiAgZ2V0QnV0dG9uQ29udHJvbE5hbWUoaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuICBgJHt0aGlzLmlkfS1kZWxCdXR0b24tJHtpbmRleH1gO1xyXG4gIH1cclxuICBnZXRQaXRjaENvbnRyb2xOYW1lKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHJldHVybiBgJHt0aGlzLmlkfS1waXRjaEN0cmwtJHtpbmRleH1gO1xyXG4gIH1cclxuICByZXNldEJ1dHRvbjogU3VpQnV0dG9uQ29tcG9zaXRlO1xyXG4gIHBpdGNoQ29udHJvbHM6IFN1aVBpdGNoQXJyYXlJdGVtW10gPSBbXTtcclxuICBwaXRjaGVzOiBQaXRjaFtdO1xyXG4gIGNyZWF0ZWRTaGVsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRlZmF1bHRQaXRjaEZpbmRlcjogZ2V0RGVmYXVsdFBpdGNoZXNGY247XHJcbiAgY29uc3RydWN0b3IoZGlhbG9nOiBTdWlEaWFsb2dOb3RpZmllciwgcGFyYW1ldGVyczogU3VpQmFzZUNvbXBvbmVudFBhcmFtcywgZGVmOiBnZXREZWZhdWx0UGl0Y2hlc0Zjbikge1xyXG4gICAgc3VwZXIoZGlhbG9nLCBwYXJhbWV0ZXJzKTtcclxuICAgIHRoaXMuZGVmYXVsdFBpdGNoRmluZGVyID0gZGVmO1xyXG4gICAgdGhpcy5waXRjaGVzID0gdGhpcy5kZWZhdWx0UGl0Y2hGaW5kZXIoKTtcclxuICAgIHRoaXMuc2V0UGl0Y2hDb250cm9scygpOyAgICBcclxuICAgIHRoaXMucmVzZXRCdXR0b24gPSBuZXcgU3VpQnV0dG9uQ29tcG9zaXRlKHRoaXMuZGlhbG9nLCB7XHJcbiAgICAgIGlkOiBgJHt0aGlzLmlkfS1yZXNldEJ1dHRvbmAsXHJcbiAgICAgIGNsYXNzZXM6ICcnLFxyXG4gICAgICBsYWJlbDogJ1Jlc2V0IFBpdGNoZXMnLFxyXG4gICAgICBzbW9OYW1lOiBgJHt0aGlzLmlkfS1yZXNldEJ1dHRvbmAsXHJcbiAgICAgIGNvbnRyb2w6ICdTdWlCdXR0b25Db21wb3NpdGUnLFxyXG4gICAgICBpY29uOiAnaWNvbi1jcm9zcycsXHJcbiAgICAgIHBhcmVudENvbnRyb2w6IHRoaXNcclxuICAgIH0pO1xyXG4gIH1cclxuICBzZXRQaXRjaENvbnRyb2xzKCkge1xyXG4gICAgdGhpcy5waXRjaENvbnRyb2xzID0gW107XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGl0Y2hlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBwaXRjaCA9IHRoaXMucGl0Y2hlc1tpXTtcclxuICAgICAgY29uc3QgYnV0dG9uQ29udHJvbE5hbWUgPSB0aGlzLmdldEJ1dHRvbkNvbnRyb2xOYW1lKGkpO1xyXG4gICAgICBjb25zdCBwaXRjaENvbnRyb2xOYW1lID0gdGhpcy5nZXRQaXRjaENvbnRyb2xOYW1lKGkpO1xyXG4gICAgICBjb25zdCBidXR0b25DdHJsOiBTdWlCdXR0b25Db21wb3NpdGUgPSBuZXcgU3VpQnV0dG9uQ29tcG9zaXRlKHRoaXMuZGlhbG9nLCAge1xyXG4gICAgICAgIGlkOiBidXR0b25Db250cm9sTmFtZSxcclxuICAgICAgICBjbGFzc2VzOiAnJyxcclxuICAgICAgICBsYWJlbDogJ0RlbGV0ZScsXHJcbiAgICAgICAgc21vTmFtZTogYnV0dG9uQ29udHJvbE5hbWUsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aUJ1dHRvbkNvbXBvc2l0ZScsXHJcbiAgICAgICAgaWNvbjogJ2ljb24tY3Jvc3MnLFxyXG4gICAgICAgIHBhcmVudENvbnRyb2w6IHRoaXNcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IHBpdGNoQ3RybDogU3VpUGl0Y2hDb21wb3NpdGUgPSBuZXcgU3VpUGl0Y2hDb21wb3NpdGUodGhpcy5kaWFsb2csIHtcclxuICAgICAgICBpZDogcGl0Y2hDb250cm9sTmFtZSxcclxuICAgICAgICBjbGFzc2VzOiAnJyxcclxuICAgICAgICBsYWJlbDogJyAnLFxyXG4gICAgICAgIHNtb05hbWU6IHBpdGNoQ29udHJvbE5hbWUsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aVBpdGNoQ29tcG9zaXRlJyxcclxuICAgICAgICBwYXJlbnRDb250cm9sOiB0aGlzXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnBpdGNoQ29udHJvbHMucHVzaCh7XHJcbiAgICAgICAgYnV0dG9uQ3RybCwgcGl0Y2hDdHJsLCBwaXRjaFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgYmluZCgpIHtcclxuICAgIHRoaXMucmVzZXRCdXR0b24uYmluZCgpO1xyXG4gICAgdGhpcy5waXRjaENvbnRyb2xzLmZvckVhY2goKHBjKSA9PiB7XHJcbiAgICAgIHBjLmJ1dHRvbkN0cmwuYmluZCgpO1xyXG4gICAgICBwYy5waXRjaEN0cmwuYmluZCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGdldCBodG1sKCkge1xyXG4gICAgY29uc3QgYiA9IGJ1aWxkRG9tO1xyXG4gICAgaWYgKCF0aGlzLmNyZWF0ZWRTaGVsbCkge1xyXG4gICAgICAvLyBGaXJzdCB0aW1lLCBjcmVhdGUgc2hlbGwgZm9yIGNvbXBvbmVudC5cclxuICAgICAgdGhpcy5jcmVhdGVkU2hlbGwgPSB0cnVlOyAgICBcclxuICAgICAgY29uc3QgcSA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3NlcygnbXVsdGlDb250cm9sIHNtb0NvbnRyb2wgcGl0Y2gtYXJyYXktcGFyZW50JykpLlxyXG4gICAgICAgIGF0dHIoJ2lkJywgdGhpcy5wYXJhbWV0ZXJJZCk7XHJcbiAgICAgIHJldHVybiBxO1xyXG4gICAgfSBcclxuICAgIGNvbnN0IHEgPSBiKCdkaXYnKS5jbGFzc2VzKCdwaXRjaC1hcnJheS1jb250YWluZXInKS5hcHBlbmQoYignZGl2JykuYXBwZW5kKHRoaXMucmVzZXRCdXR0b24uaHRtbCkpO1xyXG4gICAgdGhpcy5waXRjaENvbnRyb2xzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICBxLmFwcGVuZChiKCdkaXYnKS5jbGFzc2VzKCdwaXRjaC1hcnJheS1pdGVtJykuYXBwZW5kKHJvdy5idXR0b25DdHJsLmh0bWwpLmFwcGVuZChyb3cucGl0Y2hDdHJsLmh0bWwpKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHE7XHJcbiAgfVxyXG4gIGdldElucHV0RWxlbWVudCgpIHtcclxuICAgIHZhciBwaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgcmV0dXJuICQoJyMnICsgcGlkKTtcclxuICB9XHJcbiAgc2V0VmFsdWUocGl0Y2hlczogUGl0Y2hbXSkge1xyXG4gICAgdGhpcy5waXRjaGVzID0gcGl0Y2hlcztcclxuICAgIHRoaXMuc2V0UGl0Y2hDb250cm9scygpO1xyXG4gICAgdGhpcy51cGRhdGVDb250cm9scygpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBpdGNoQ29udHJvbHMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgcGMgPSB0aGlzLnBpdGNoQ29udHJvbHNbaV07XHJcbiAgICAgIHBjLnBpdGNoQ3RybC5zZXRWYWx1ZShwaXRjaGVzW2ldKTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0VmFsdWUoKSB7XHJcbiAgICBjb25zdCBydjogUGl0Y2hbXSA9IFtdO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBpdGNoQ29udHJvbHMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgcGMgPSB0aGlzLnBpdGNoQ29udHJvbHNbaV07XHJcbiAgICAgIHJ2LnB1c2gocGMucGl0Y2hDdHJsLmdldFZhbHVlKCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICB1cGRhdGVDb250cm9scygpIHtcclxuICAgIGNvbnN0IHVwZGF0ZUVsID0gdGhpcy5nZXRJbnB1dEVsZW1lbnQoKTtcclxuICAgICQodXBkYXRlRWwpLmh0bWwoJycpO1xyXG4gICAgJCh1cGRhdGVFbCkuYXBwZW5kKHRoaXMuaHRtbC5kb20oKSk7XHJcbiAgICAkKHVwZGF0ZUVsKS5maW5kKCdpbnB1dCcpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpO1xyXG4gICAgJCh1cGRhdGVFbCkuZmluZCgnLnRvZ2dsZS1kaXNhYmxlZCBpbnB1dCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICQodXBkYXRlRWwpLmZpbmQoJy50b2dnbGUtcmVtb3ZlLXJvdyBpbnB1dCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICQodXBkYXRlRWwpLmZpbmQoJy50b2dnbGUtYWRkLXJvdyBpbnB1dCcpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XHJcbiAgICAkKHVwZGF0ZUVsKS5maW5kKCcudG9nZ2xlLWRpc2FibGVkIGlucHV0JykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcclxuICAgIHRoaXMuYmluZCgpO1xyXG4gIH1cclxuICBjaGFuZ2VkKCkge1xyXG4gICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcclxuICAgIGNvbnN0IHBpdGNoZXM6IFBpdGNoW10gPSBbXTtcclxuICAgIHRoaXMucGl0Y2hDb250cm9scy5mb3JFYWNoKChwYykgPT4ge1xyXG4gICAgICBpZiAocGMuYnV0dG9uQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgICAgcmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGl0Y2hlcy5wdXNoKHBjLnBpdGNoQ3RybC5nZXRWYWx1ZSgpKTtcclxuICAgICAgfVxyXG4gICAgfSk7ICAgIFxyXG4gICAgaWYgKHJlbW92ZWQgJiYgdGhpcy5waXRjaENvbnRyb2xzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuOyAvLyBkb24ndCBsZXQgdXNlciBkZWxldGUgYWxsIHRoZSBzdHJpbmdzXHJcbiAgICB9XHJcbiAgICAvLyBJZiB0aGUgdXNlciBhc2tlZCB0byByZXNldCwgdXBkYXRlIHRoZSBwaXRjaGVzIHRvIGRlZmF1bHRcclxuICAgIC8vIHRoZW4gcmVzZXQuXHJcbiAgICBpZiAodGhpcy5yZXNldEJ1dHRvbi5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIHRoaXMucGl0Y2hlcyA9IHRoaXMuZGVmYXVsdFBpdGNoRmluZGVyKCk7XHJcbiAgICAgIHRoaXMucGl0Y2hlcy5zb3J0KChhLCBiKSA9PiBTbW9NdXNpYy5zbW9QaXRjaFRvSW50KGEpID4gU21vTXVzaWMuc21vUGl0Y2hUb0ludChiKSA/IC0xIDogMSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBpdGNoZXMgPSBwaXRjaGVzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRWYWx1ZSh0aGlzLnBpdGNoZXMpO1xyXG4gICAgdGhpcy5oYW5kbGVDaGFuZ2VkKCk7XHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpUGl0Y2hBcnJheUNvbXBvbmVudFRhYiBleHRlbmRzIFN1aVBpdGNoQXJyYXlDb21wb25lbnQge1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcnM6IFN1aUJhc2VDb21wb25lbnRQYXJhbXMpIHtcclxuICAgIHN1cGVyKGRpYWxvZywgcGFyYW1ldGVycywgZ2V0VGFiTm90ZVBpdGNoZXNGY24pO1xyXG4gIH1cclxufSJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/pitch.ts\n\n}");
3730
3730
 
3731
3731
  /***/ },
3732
3732
 
@@ -3737,7 +3737,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
3737
3737
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3738
3738
 
3739
3739
  "use strict";
3740
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiRockerComponent: () => (/* binding */ SuiRockerComponent),\n/* harmony export */ SuiRockerComposite: () => (/* binding */ SuiRockerComposite)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n/**\n * @module /ui/dialog/components/rocker\n * **/\n\n\n/**\n * A numeric input box with +- buttons. Adjustable type and scale\n * @category SuiDialog\n * */\nclass SuiRockerComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_1__.SuiComponentBase {\n static get dataTypes() {\n return ['int', 'float', 'percent'];\n }\n static get increments() {\n return { 'int': 1, 'float': 0.1, 'percent': 10 };\n }\n static get parsers() {\n return { 'int': '_getIntValue', 'float': '_getFloatValue', 'percent': '_getPercentValue' };\n }\n constructor(dialog, params) {\n var _a, _b;\n super(dialog, params);\n this.initialValue = 0;\n this.increment = 1;\n this.dataType = (_a = params.dataType) !== null && _a !== void 0 ? _a : 'int';\n this.increment = (_b = params.increment) !== null && _b !== void 0 ? _b : SuiRockerComponent.increments[this.dataType];\n if (SuiRockerComponent.dataTypes.indexOf(this.dataType) < 0) {\n throw new Error('dialog element invalid type ' + this.dataType);\n }\n if (this.dataType === 'int' && this.increment < 1) {\n throw new Error('int component with decimal increment');\n }\n this.parser = SuiRockerComponent.parsers[this.dataType];\n this.min = params.min;\n this.max = params.max;\n this.dialog = dialog;\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const id = this.parameterId;\n const r = b('div').classes(this.makeClasses('rockerControl smoControl')).attr('id', id).attr('data-param', this.smoName)\n .append(b('button').classes('increment').append(b('span').classes('icon icon-circle-up'))).append(b('button').classes('decrement').append(b('span').classes('icon icon-circle-down'))).append(b('input').attr('type', 'text').classes('rockerInput')\n .attr('id', id + '-input')).append(b('label').attr('for', id + '-input').text(this.label));\n return r;\n }\n get parameterId() {\n return this.id;\n }\n handleChange() {\n this.changeFlag = true;\n this.dialog.changed();\n this.changeFlag = false;\n }\n bind() {\n const pid = this.parameterId;\n const input = this._getInputElement();\n let val = 0;\n $('#' + pid).find('button.increment').off('click').on('click', () => {\n val = this[this.parser]();\n if (this.dataType === 'percent') {\n val = 100 * val;\n }\n val += this.increment;\n if (this.max != undefined && val > this.max) {\n val = this.max;\n }\n $(input).val(val);\n this.handleChanged();\n });\n $('#' + pid).find('button.decrement').off('click').on('click', () => {\n val = this[this.parser]();\n if (this.dataType === 'percent') {\n val = 100 * val;\n }\n val -= this.increment;\n if (this.min != undefined && val < this.min) {\n val = this.min;\n }\n $(input).val(val);\n this.handleChanged();\n });\n $(input).off('blur').on('blur', () => {\n val = this[this.parser]();\n if (val !== this.initialValue) {\n this.initialValue = val;\n if (this.dataType === 'percent') {\n val = 100 * val;\n }\n if (this.min != undefined && val < this.min) {\n val = this.min;\n }\n else if (this.max != undefined && val > this.max) {\n val = this.max;\n }\n $(input).val(val);\n this.handleChanged();\n }\n });\n }\n _getInputElement() {\n const pid = this.parameterId;\n return $(this.dialog.dgDom.element).find('#' + pid).find('input');\n }\n _getIntValue() {\n let val = parseInt(this._getInputElement().val(), 10);\n val = isNaN(val) ? 0 : val;\n return val;\n }\n _getFloatValue() {\n let val = parseFloat(this._getInputElement().val());\n val = isNaN(val) ? 1.0 : val;\n return val;\n }\n _getPercentValue() {\n let val = parseFloat(this._getInputElement().val());\n val = isNaN(val) ? 1 : val;\n return val / 100;\n }\n _setIntValue(val) {\n this._getInputElement().val(val);\n }\n setValue(value) {\n if (this.dataType === 'percent') {\n value = value * 100;\n }\n this._setIntValue(value);\n this.initialValue = value;\n }\n getValue() {\n return this[this.parser]();\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiRockerComposite extends SuiRockerComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n this.changeFlag = true;\n this.parentControl.changed();\n this.changeFlag = false;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFZLE1BQXlCLEVBQUUsVUFBb0M7UUFDekUsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7SUFDaEQsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7Q0FDRiIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy91aS9kaWFsb2dzL2NvbXBvbmVudHMvcm9ja2VyLnRzP2MwZmQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gW1Ntb29zaWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BYXJvbkRhdmlkTmV3bWFuL1Ntb29zaWMpXHJcbi8vIENvcHlyaWdodCAoYykgQWFyb24gRGF2aWQgTmV3bWFuIDIwMjEuXHJcbi8qKlxyXG4gKiBAbW9kdWxlIC91aS9kaWFsb2cvY29tcG9uZW50cy9yb2NrZXJcclxuICogKiovXHJcbiBpbXBvcnQgeyBidWlsZERvbSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9odG1sSGVscGVycyc7XHJcbmltcG9ydCB7IFN1aUNvbXBvbmVudEJhc2UsIFN1aURpYWxvZ05vdGlmaWVyLCBTdWlDb21wb25lbnRQYXJlbnQgfSBmcm9tICcuL2Jhc2VDb21wb25lbnQnO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5cclxuLyoqXHJcbiAqIEJhc2ljIGRpYWxvZyBjb21wb25lbnQgaW5mby5cclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlSb2NrZXJDb21wb25lbnRQYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIGRhdGFUeXBlPzogc3RyaW5nLFxyXG4gIGluY3JlbWVudD86IG51bWJlcixcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIHNtb05hbWU6IHN0cmluZyxcclxuICBjb250cm9sOiBzdHJpbmcsXHJcbiAgbWluPzogbnVtYmVyLFxyXG4gIG1heD86IG51bWJlcixcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgbnVtZXJpYyBpbnB1dCBib3ggd2l0aCArLSBidXR0b25zLiAgIEFkanVzdGFibGUgdHlwZSBhbmQgc2NhbGVcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpUm9ja2VyQ29tcG9uZW50IGV4dGVuZHMgU3VpQ29tcG9uZW50QmFzZSB7XHJcbiAgc3RhdGljIGdldCBkYXRhVHlwZXMoKSB7XHJcbiAgICByZXR1cm4gWydpbnQnLCAnZmxvYXQnLCAncGVyY2VudCddO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IGluY3JlbWVudHMoKTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB7XHJcbiAgICByZXR1cm4geyAnaW50JzogMSwgJ2Zsb2F0JzogMC4xLCAncGVyY2VudCc6IDEwIH07XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgcGFyc2VycygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB7ICdpbnQnOiAnX2dldEludFZhbHVlJywgJ2Zsb2F0JzogJ19nZXRGbG9hdFZhbHVlJywgJ3BlcmNlbnQnOiAnX2dldFBlcmNlbnRWYWx1ZScgfTtcclxuICB9XHJcbiAgaW5pdGlhbFZhbHVlOiBudW1iZXIgPSAwO1xyXG4gIGRhdGFUeXBlOiBzdHJpbmc7XHJcbiAgaW5jcmVtZW50OiBudW1iZXIgPSAxO1xyXG4gIHBhcnNlcjogc3RyaW5nO1xyXG4gIG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIG1heDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtczogU3VpUm9ja2VyQ29tcG9uZW50UGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtcyk7XHJcbiAgICB0aGlzLmRhdGFUeXBlID0gcGFyYW1zLmRhdGFUeXBlID8/ICdpbnQnO1xyXG4gICAgdGhpcy5pbmNyZW1lbnQgPSBwYXJhbXMuaW5jcmVtZW50ID8/IFN1aVJvY2tlckNvbXBvbmVudC5pbmNyZW1lbnRzW3RoaXMuZGF0YVR5cGVdO1xyXG4gICAgaWYgKFN1aVJvY2tlckNvbXBvbmVudC5kYXRhVHlwZXMuaW5kZXhPZih0aGlzLmRhdGFUeXBlKSA8IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkaWFsb2cgZWxlbWVudCBpbnZhbGlkIHR5cGUgJyArIHRoaXMuZGF0YVR5cGUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09ICdpbnQnICYmIHRoaXMuaW5jcmVtZW50IDwgMSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludCBjb21wb25lbnQgd2l0aCBkZWNpbWFsIGluY3JlbWVudCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wYXJzZXIgPSBTdWlSb2NrZXJDb21wb25lbnQucGFyc2Vyc1t0aGlzLmRhdGFUeXBlXTtcclxuICAgIHRoaXMubWluID0gcGFyYW1zLm1pbjtcclxuICAgIHRoaXMubWF4ID0gcGFyYW1zLm1heDtcclxuICAgIHRoaXMuZGlhbG9nID0gZGlhbG9nO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGh0bWwoKSB7XHJcbiAgICBjb25zdCBiID0gYnVpbGREb207XHJcbiAgICBjb25zdCBpZCA9IHRoaXMucGFyYW1ldGVySWQ7XHJcbiAgICBjb25zdCByID0gYignZGl2JykuY2xhc3Nlcyh0aGlzLm1ha2VDbGFzc2VzKCdyb2NrZXJDb250cm9sIHNtb0NvbnRyb2wnKSkuYXR0cignaWQnLCBpZCkuYXR0cignZGF0YS1wYXJhbScsIHRoaXMuc21vTmFtZSlcclxuICAgICAgLmFwcGVuZChcclxuICAgICAgICBiKCdidXR0b24nKS5jbGFzc2VzKCdpbmNyZW1lbnQnKS5hcHBlbmQoXHJcbiAgICAgICAgICBiKCdzcGFuJykuY2xhc3NlcygnaWNvbiBpY29uLWNpcmNsZS11cCcpKSkuYXBwZW5kKFxyXG4gICAgICAgIGIoJ2J1dHRvbicpLmNsYXNzZXMoJ2RlY3JlbWVudCcpLmFwcGVuZChcclxuICAgICAgICAgIGIoJ3NwYW4nKS5jbGFzc2VzKCdpY29uIGljb24tY2lyY2xlLWRvd24nKSkpLmFwcGVuZChcclxuICAgICAgICBiKCdpbnB1dCcpLmF0dHIoJ3R5cGUnLCAndGV4dCcpLmNsYXNzZXMoJ3JvY2tlcklucHV0JylcclxuICAgICAgICAgIC5hdHRyKCdpZCcsIGlkICsgJy1pbnB1dCcpKS5hcHBlbmQoXHJcbiAgICAgICAgYignbGFiZWwnKS5hdHRyKCdmb3InLCBpZCArICctaW5wdXQnKS50ZXh0KHRoaXMubGFiZWwpKTtcclxuICAgIHJldHVybiByO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhcmFtZXRlcklkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaWQ7XHJcbiAgfVxyXG4gIGhhbmRsZUNoYW5nZSgpIHtcclxuICAgIHRoaXMuY2hhbmdlRmxhZyA9IHRydWU7XHJcbiAgICB0aGlzLmRpYWxvZy5jaGFuZ2VkKCk7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGJpbmQoKSB7XHJcbiAgICBjb25zdCBwaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKTtcclxuICAgIGxldCB2YWwgPSAwO1xyXG4gICAgJCgnIycgKyBwaWQpLmZpbmQoJ2J1dHRvbi5pbmNyZW1lbnQnKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJyxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHZhbCA9ICh0aGlzIGFzIGFueSlbdGhpcy5wYXJzZXJdKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09ICdwZXJjZW50Jykge1xyXG4gICAgICAgICAgdmFsID0gMTAwICogdmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YWwgKz0gdGhpcy5pbmNyZW1lbnQ7XHJcbiAgICAgICAgaWYgKHRoaXMubWF4ICE9IHVuZGVmaW5lZCAmJiB2YWwgPiB0aGlzLm1heCkge1xyXG4gICAgICAgICAgdmFsID0gdGhpcy5tYXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQoaW5wdXQpLnZhbCh2YWwpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlZCgpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgJCgnIycgKyBwaWQpLmZpbmQoJ2J1dHRvbi5kZWNyZW1lbnQnKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJyxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHZhbCA9ICh0aGlzIGFzIGFueSlbdGhpcy5wYXJzZXJdKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09ICdwZXJjZW50Jykge1xyXG4gICAgICAgICAgdmFsID0gMTAwICogdmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YWwgLT0gdGhpcy5pbmNyZW1lbnQ7XHJcbiAgICAgICAgaWYgKHRoaXMubWluICE9IHVuZGVmaW5lZCAmJiB2YWwgPCB0aGlzLm1pbikge1xyXG4gICAgICAgICAgdmFsID0gdGhpcy5taW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQoaW5wdXQpLnZhbCh2YWwpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlZCgpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgJChpbnB1dCkub2ZmKCdibHVyJykub24oJ2JsdXInLFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgdmFsID0gKHRoaXMgYXMgYW55KVt0aGlzLnBhcnNlcl0oKTtcclxuICAgICAgICBpZiAodmFsICE9PSB0aGlzLmluaXRpYWxWYWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWUgPSB2YWw7XHJcbiAgICAgICAgICBpZiAodGhpcy5kYXRhVHlwZSA9PT0gJ3BlcmNlbnQnKSB7XHJcbiAgICAgICAgICAgIHZhbCA9IDEwMCAqIHZhbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLm1pbiAhPSB1bmRlZmluZWQgJiYgdmFsIDwgdGhpcy5taW4pIHtcclxuICAgICAgICAgICAgdmFsID0gdGhpcy5taW47XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF4ICE9IHVuZGVmaW5lZCAmJiB2YWwgPiB0aGlzLm1heCkge1xyXG4gICAgICAgICAgICB2YWwgPSB0aGlzLm1heDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICQoaW5wdXQpLnZhbCh2YWwpO1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgX2dldElucHV0RWxlbWVudCgpIHtcclxuICAgIGNvbnN0IHBpZCA9IHRoaXMucGFyYW1ldGVySWQ7XHJcbiAgICByZXR1cm4gJCh0aGlzLmRpYWxvZy5kZ0RvbS5lbGVtZW50KS5maW5kKCcjJyArIHBpZCkuZmluZCgnaW5wdXQnKTtcclxuICB9XHJcbiAgX2dldEludFZhbHVlKCkge1xyXG4gICAgbGV0IHZhbDpudW1iZXIgPSBwYXJzZUludCh0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKS52YWwoKSwgMTApO1xyXG4gICAgdmFsID0gaXNOYU4odmFsKSA/IDAgOiB2YWw7XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH1cclxuICBfZ2V0RmxvYXRWYWx1ZSgpIHtcclxuICAgIGxldCB2YWwgPSBwYXJzZUZsb2F0KHRoaXMuX2dldElucHV0RWxlbWVudCgpLnZhbCgpKTtcclxuICAgIHZhbCA9IGlzTmFOKHZhbCkgPyAxLjAgOiB2YWw7XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH1cclxuICBfZ2V0UGVyY2VudFZhbHVlKCkge1xyXG4gICAgbGV0IHZhbCA9IHBhcnNlRmxvYXQodGhpcy5fZ2V0SW5wdXRFbGVtZW50KCkudmFsKCkpO1xyXG4gICAgdmFsID0gaXNOYU4odmFsKSA/IDEgOiB2YWw7XHJcbiAgICByZXR1cm4gdmFsIC8gMTAwO1xyXG4gIH1cclxuICBfc2V0SW50VmFsdWUodmFsOiBzdHJpbmcgfCBudW1iZXIpIHtcclxuICAgIHRoaXMuX2dldElucHV0RWxlbWVudCgpLnZhbCh2YWwpO1xyXG4gIH1cclxuICBzZXRWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhVHlwZSA9PT0gJ3BlcmNlbnQnKSB7XHJcbiAgICAgIHZhbHVlID0gdmFsdWUgKiAxMDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9zZXRJbnRWYWx1ZSh2YWx1ZSk7XHJcbiAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHZhbHVlO1xyXG4gIH1cclxuICBnZXRWYWx1ZSgpIHtcclxuICAgIHJldHVybiAodGhpcyBhcyBhbnkpW3RoaXMucGFyc2VyXSgpO1xyXG4gIH1cclxufVxyXG4vKipcclxuICogQ3JlYXRlIHJvY2tlciBjb21wb3NpdGVcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlSb2NrZXJDb21wb3NpdGVQYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIGRhdGFUeXBlPzogc3RyaW5nLFxyXG4gIGluY3JlbWVudD86IG51bWJlcixcclxuICBkZWZhdWx0VmFsdWU6IG51bWJlcixcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIHNtb05hbWU6IHN0cmluZyxcclxuICBjb250cm9sOiBzdHJpbmcsXHJcbiAgcGFyZW50Q29udHJvbDogU3VpQ29tcG9uZW50UGFyZW50XHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdWlSb2NrZXJDb21wb3NpdGUgZXh0ZW5kcyBTdWlSb2NrZXJDb21wb25lbnQge1xyXG4gIHBhcmVudENvbnRyb2w6IFN1aUNvbXBvbmVudFBhcmVudDtcclxuICBjb25zdHJ1Y3RvcihkaWFsb2c6IFN1aURpYWxvZ05vdGlmaWVyLCBwYXJhbWV0ZXJzOiBTdWlSb2NrZXJDb21wb3NpdGVQYXJhbXMpIHtcclxuICAgIHN1cGVyKGRpYWxvZywgcGFyYW1ldGVycyk7XHJcbiAgICB0aGlzLnBhcmVudENvbnRyb2wgPSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gdHJ1ZTtcclxuICAgIHRoaXMucGFyZW50Q29udHJvbC5jaGFuZ2VkKCk7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSBmYWxzZTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/rocker.ts\n\n}");
3740
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiRockerComponent: () => (/* binding */ SuiRockerComponent),\n/* harmony export */ SuiRockerComposite: () => (/* binding */ SuiRockerComposite)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.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 * @module /ui/dialog/components/rocker\n * **/\n\n\n/**\n * A numeric input box with +- buttons. Adjustable type and scale\n * @category SuiDialog\n * */\nclass SuiRockerComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_1__.SuiComponentBase {\n static get dataTypes() {\n return ['int', 'float', 'percent'];\n }\n static get increments() {\n return { 'int': 1, 'float': 0.1, 'percent': 10 };\n }\n static get parsers() {\n return { 'int': '_getIntValue', 'float': '_getFloatValue', 'percent': '_getPercentValue' };\n }\n constructor(dialog, params) {\n var _a, _b;\n super(dialog, params);\n this.initialValue = 0;\n this.increment = 1;\n this.dataType = (_a = params.dataType) !== null && _a !== void 0 ? _a : 'int';\n this.increment = (_b = params.increment) !== null && _b !== void 0 ? _b : SuiRockerComponent.increments[this.dataType];\n if (SuiRockerComponent.dataTypes.indexOf(this.dataType) < 0) {\n throw new Error('dialog element invalid type ' + this.dataType);\n }\n if (this.dataType === 'int' && this.increment < 1) {\n throw new Error('int component with decimal increment');\n }\n this.parser = SuiRockerComponent.parsers[this.dataType];\n this.min = params.min;\n this.max = params.max;\n this.dialog = dialog;\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const id = this.parameterId;\n const r = b('div').classes(this.makeClasses('rockerControl smoControl')).attr('id', id).attr('data-param', this.smoName)\n .append(b('button').classes('increment').append(b('span').classes('icon icon-circle-up'))).append(b('button').classes('decrement').append(b('span').classes('icon icon-circle-down'))).append(b('input').attr('type', 'text').classes('rockerInput')\n .attr('id', id + '-input')).append(b('label').attr('for', id + '-input').text(this.label));\n return r;\n }\n get parameterId() {\n return this.id;\n }\n handleChange() {\n this.changeFlag = true;\n this.dialog.changed();\n this.changeFlag = false;\n }\n bind() {\n const pid = this.parameterId;\n const input = this._getInputElement();\n let val = 0;\n $('#' + pid).find('button.increment').off('click').on('click', () => {\n val = this[this.parser]();\n if (this.dataType === 'percent') {\n val = 100 * val;\n }\n val += this.increment;\n if (this.max != undefined && val > this.max) {\n val = this.max;\n }\n $(input).val(val);\n this.handleChanged();\n });\n $('#' + pid).find('button.decrement').off('click').on('click', () => {\n val = this[this.parser]();\n if (this.dataType === 'percent') {\n val = 100 * val;\n }\n val -= this.increment;\n if (this.min != undefined && val < this.min) {\n val = this.min;\n }\n $(input).val(val);\n this.handleChanged();\n });\n $(input).off('blur').on('blur', () => {\n val = this[this.parser]();\n if (val !== this.initialValue) {\n this.initialValue = val;\n if (this.dataType === 'percent') {\n val = 100 * val;\n }\n if (this.min != undefined && val < this.min) {\n val = this.min;\n }\n else if (this.max != undefined && val > this.max) {\n val = this.max;\n }\n $(input).val(val);\n this.handleChanged();\n }\n });\n }\n _getInputElement() {\n const pid = this.parameterId;\n return $(this.dialog.dgDom.element).find('#' + pid).find('input');\n }\n _getIntValue() {\n let val = parseInt(this._getInputElement().val(), 10);\n val = isNaN(val) ? 0 : val;\n return val;\n }\n _getFloatValue() {\n let val = parseFloat(this._getInputElement().val());\n val = isNaN(val) ? 1.0 : val;\n return val;\n }\n _getPercentValue() {\n let val = parseFloat(this._getInputElement().val());\n val = isNaN(val) ? 1 : val;\n return val / 100;\n }\n _setIntValue(val) {\n this._getInputElement().val(val);\n }\n setValue(value) {\n if (this.dataType === 'percent') {\n value = value * 100;\n }\n this._setIntValue(value);\n this.initialValue = value;\n }\n getValue() {\n return this[this.parser]();\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiRockerComposite extends SuiRockerComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n return __awaiter(this, void 0, void 0, function* () {\n this.changeFlag = true;\n yield this.parentControl.changed();\n this.changeFlag = false;\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QjtJQUV4RCxZQUFZLE1BQXlCLEVBQUUsVUFBb0M7UUFDekUsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7SUFDaEQsQ0FBQztJQUVLLGFBQWE7O1lBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUMxQixDQUFDO0tBQUE7Q0FDRiIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy91aS9kaWFsb2dzL2NvbXBvbmVudHMvcm9ja2VyLnRzP2MwZmQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gW1Ntb29zaWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BYXJvbkRhdmlkTmV3bWFuL1Ntb29zaWMpXHJcbi8vIENvcHlyaWdodCAoYykgQWFyb24gRGF2aWQgTmV3bWFuIDIwMjEuXHJcbi8qKlxyXG4gKiBAbW9kdWxlIC91aS9kaWFsb2cvY29tcG9uZW50cy9yb2NrZXJcclxuICogKiovXHJcbiBpbXBvcnQgeyBidWlsZERvbSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9odG1sSGVscGVycyc7XHJcbmltcG9ydCB7IFN1aUNvbXBvbmVudEJhc2UsIFN1aURpYWxvZ05vdGlmaWVyLCBTdWlDb21wb25lbnRQYXJlbnQgfSBmcm9tICcuL2Jhc2VDb21wb25lbnQnO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5cclxuLyoqXHJcbiAqIEJhc2ljIGRpYWxvZyBjb21wb25lbnQgaW5mby5cclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlSb2NrZXJDb21wb25lbnRQYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIGRhdGFUeXBlPzogc3RyaW5nLFxyXG4gIGluY3JlbWVudD86IG51bWJlcixcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIHNtb05hbWU6IHN0cmluZyxcclxuICBjb250cm9sOiBzdHJpbmcsXHJcbiAgbWluPzogbnVtYmVyLFxyXG4gIG1heD86IG51bWJlcixcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgbnVtZXJpYyBpbnB1dCBib3ggd2l0aCArLSBidXR0b25zLiAgIEFkanVzdGFibGUgdHlwZSBhbmQgc2NhbGVcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpUm9ja2VyQ29tcG9uZW50IGV4dGVuZHMgU3VpQ29tcG9uZW50QmFzZSB7XHJcbiAgc3RhdGljIGdldCBkYXRhVHlwZXMoKSB7XHJcbiAgICByZXR1cm4gWydpbnQnLCAnZmxvYXQnLCAncGVyY2VudCddO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IGluY3JlbWVudHMoKTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB7XHJcbiAgICByZXR1cm4geyAnaW50JzogMSwgJ2Zsb2F0JzogMC4xLCAncGVyY2VudCc6IDEwIH07XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgcGFyc2VycygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB7ICdpbnQnOiAnX2dldEludFZhbHVlJywgJ2Zsb2F0JzogJ19nZXRGbG9hdFZhbHVlJywgJ3BlcmNlbnQnOiAnX2dldFBlcmNlbnRWYWx1ZScgfTtcclxuICB9XHJcbiAgaW5pdGlhbFZhbHVlOiBudW1iZXIgPSAwO1xyXG4gIGRhdGFUeXBlOiBzdHJpbmc7XHJcbiAgaW5jcmVtZW50OiBudW1iZXIgPSAxO1xyXG4gIHBhcnNlcjogc3RyaW5nO1xyXG4gIG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIG1heDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtczogU3VpUm9ja2VyQ29tcG9uZW50UGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtcyk7XHJcbiAgICB0aGlzLmRhdGFUeXBlID0gcGFyYW1zLmRhdGFUeXBlID8/ICdpbnQnO1xyXG4gICAgdGhpcy5pbmNyZW1lbnQgPSBwYXJhbXMuaW5jcmVtZW50ID8/IFN1aVJvY2tlckNvbXBvbmVudC5pbmNyZW1lbnRzW3RoaXMuZGF0YVR5cGVdO1xyXG4gICAgaWYgKFN1aVJvY2tlckNvbXBvbmVudC5kYXRhVHlwZXMuaW5kZXhPZih0aGlzLmRhdGFUeXBlKSA8IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkaWFsb2cgZWxlbWVudCBpbnZhbGlkIHR5cGUgJyArIHRoaXMuZGF0YVR5cGUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09ICdpbnQnICYmIHRoaXMuaW5jcmVtZW50IDwgMSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludCBjb21wb25lbnQgd2l0aCBkZWNpbWFsIGluY3JlbWVudCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wYXJzZXIgPSBTdWlSb2NrZXJDb21wb25lbnQucGFyc2Vyc1t0aGlzLmRhdGFUeXBlXTtcclxuICAgIHRoaXMubWluID0gcGFyYW1zLm1pbjtcclxuICAgIHRoaXMubWF4ID0gcGFyYW1zLm1heDtcclxuICAgIHRoaXMuZGlhbG9nID0gZGlhbG9nO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGh0bWwoKSB7XHJcbiAgICBjb25zdCBiID0gYnVpbGREb207XHJcbiAgICBjb25zdCBpZCA9IHRoaXMucGFyYW1ldGVySWQ7XHJcbiAgICBjb25zdCByID0gYignZGl2JykuY2xhc3Nlcyh0aGlzLm1ha2VDbGFzc2VzKCdyb2NrZXJDb250cm9sIHNtb0NvbnRyb2wnKSkuYXR0cignaWQnLCBpZCkuYXR0cignZGF0YS1wYXJhbScsIHRoaXMuc21vTmFtZSlcclxuICAgICAgLmFwcGVuZChcclxuICAgICAgICBiKCdidXR0b24nKS5jbGFzc2VzKCdpbmNyZW1lbnQnKS5hcHBlbmQoXHJcbiAgICAgICAgICBiKCdzcGFuJykuY2xhc3NlcygnaWNvbiBpY29uLWNpcmNsZS11cCcpKSkuYXBwZW5kKFxyXG4gICAgICAgIGIoJ2J1dHRvbicpLmNsYXNzZXMoJ2RlY3JlbWVudCcpLmFwcGVuZChcclxuICAgICAgICAgIGIoJ3NwYW4nKS5jbGFzc2VzKCdpY29uIGljb24tY2lyY2xlLWRvd24nKSkpLmFwcGVuZChcclxuICAgICAgICBiKCdpbnB1dCcpLmF0dHIoJ3R5cGUnLCAndGV4dCcpLmNsYXNzZXMoJ3JvY2tlcklucHV0JylcclxuICAgICAgICAgIC5hdHRyKCdpZCcsIGlkICsgJy1pbnB1dCcpKS5hcHBlbmQoXHJcbiAgICAgICAgYignbGFiZWwnKS5hdHRyKCdmb3InLCBpZCArICctaW5wdXQnKS50ZXh0KHRoaXMubGFiZWwpKTtcclxuICAgIHJldHVybiByO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhcmFtZXRlcklkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaWQ7XHJcbiAgfVxyXG4gIGhhbmRsZUNoYW5nZSgpIHtcclxuICAgIHRoaXMuY2hhbmdlRmxhZyA9IHRydWU7XHJcbiAgICB0aGlzLmRpYWxvZy5jaGFuZ2VkKCk7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGJpbmQoKSB7XHJcbiAgICBjb25zdCBwaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKTtcclxuICAgIGxldCB2YWwgPSAwO1xyXG4gICAgJCgnIycgKyBwaWQpLmZpbmQoJ2J1dHRvbi5pbmNyZW1lbnQnKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJyxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHZhbCA9ICh0aGlzIGFzIGFueSlbdGhpcy5wYXJzZXJdKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09ICdwZXJjZW50Jykge1xyXG4gICAgICAgICAgdmFsID0gMTAwICogdmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YWwgKz0gdGhpcy5pbmNyZW1lbnQ7XHJcbiAgICAgICAgaWYgKHRoaXMubWF4ICE9IHVuZGVmaW5lZCAmJiB2YWwgPiB0aGlzLm1heCkge1xyXG4gICAgICAgICAgdmFsID0gdGhpcy5tYXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQoaW5wdXQpLnZhbCh2YWwpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlZCgpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgJCgnIycgKyBwaWQpLmZpbmQoJ2J1dHRvbi5kZWNyZW1lbnQnKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJyxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHZhbCA9ICh0aGlzIGFzIGFueSlbdGhpcy5wYXJzZXJdKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09ICdwZXJjZW50Jykge1xyXG4gICAgICAgICAgdmFsID0gMTAwICogdmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YWwgLT0gdGhpcy5pbmNyZW1lbnQ7XHJcbiAgICAgICAgaWYgKHRoaXMubWluICE9IHVuZGVmaW5lZCAmJiB2YWwgPCB0aGlzLm1pbikge1xyXG4gICAgICAgICAgdmFsID0gdGhpcy5taW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQoaW5wdXQpLnZhbCh2YWwpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlZCgpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgJChpbnB1dCkub2ZmKCdibHVyJykub24oJ2JsdXInLFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgdmFsID0gKHRoaXMgYXMgYW55KVt0aGlzLnBhcnNlcl0oKTtcclxuICAgICAgICBpZiAodmFsICE9PSB0aGlzLmluaXRpYWxWYWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWUgPSB2YWw7XHJcbiAgICAgICAgICBpZiAodGhpcy5kYXRhVHlwZSA9PT0gJ3BlcmNlbnQnKSB7XHJcbiAgICAgICAgICAgIHZhbCA9IDEwMCAqIHZhbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLm1pbiAhPSB1bmRlZmluZWQgJiYgdmFsIDwgdGhpcy5taW4pIHtcclxuICAgICAgICAgICAgdmFsID0gdGhpcy5taW47XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF4ICE9IHVuZGVmaW5lZCAmJiB2YWwgPiB0aGlzLm1heCkge1xyXG4gICAgICAgICAgICB2YWwgPSB0aGlzLm1heDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICQoaW5wdXQpLnZhbCh2YWwpO1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgX2dldElucHV0RWxlbWVudCgpIHtcclxuICAgIGNvbnN0IHBpZCA9IHRoaXMucGFyYW1ldGVySWQ7XHJcbiAgICByZXR1cm4gJCh0aGlzLmRpYWxvZy5kZ0RvbS5lbGVtZW50KS5maW5kKCcjJyArIHBpZCkuZmluZCgnaW5wdXQnKTtcclxuICB9XHJcbiAgX2dldEludFZhbHVlKCkge1xyXG4gICAgbGV0IHZhbDpudW1iZXIgPSBwYXJzZUludCh0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKS52YWwoKSwgMTApO1xyXG4gICAgdmFsID0gaXNOYU4odmFsKSA/IDAgOiB2YWw7XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH1cclxuICBfZ2V0RmxvYXRWYWx1ZSgpIHtcclxuICAgIGxldCB2YWwgPSBwYXJzZUZsb2F0KHRoaXMuX2dldElucHV0RWxlbWVudCgpLnZhbCgpKTtcclxuICAgIHZhbCA9IGlzTmFOKHZhbCkgPyAxLjAgOiB2YWw7XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH1cclxuICBfZ2V0UGVyY2VudFZhbHVlKCkge1xyXG4gICAgbGV0IHZhbCA9IHBhcnNlRmxvYXQodGhpcy5fZ2V0SW5wdXRFbGVtZW50KCkudmFsKCkpO1xyXG4gICAgdmFsID0gaXNOYU4odmFsKSA/IDEgOiB2YWw7XHJcbiAgICByZXR1cm4gdmFsIC8gMTAwO1xyXG4gIH1cclxuICBfc2V0SW50VmFsdWUodmFsOiBzdHJpbmcgfCBudW1iZXIpIHtcclxuICAgIHRoaXMuX2dldElucHV0RWxlbWVudCgpLnZhbCh2YWwpO1xyXG4gIH1cclxuICBzZXRWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhVHlwZSA9PT0gJ3BlcmNlbnQnKSB7XHJcbiAgICAgIHZhbHVlID0gdmFsdWUgKiAxMDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9zZXRJbnRWYWx1ZSh2YWx1ZSk7XHJcbiAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHZhbHVlO1xyXG4gIH1cclxuICBnZXRWYWx1ZSgpIHtcclxuICAgIHJldHVybiAodGhpcyBhcyBhbnkpW3RoaXMucGFyc2VyXSgpO1xyXG4gIH1cclxufVxyXG4vKipcclxuICogQ3JlYXRlIHJvY2tlciBjb21wb3NpdGVcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlSb2NrZXJDb21wb3NpdGVQYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIGRhdGFUeXBlPzogc3RyaW5nLFxyXG4gIGluY3JlbWVudD86IG51bWJlcixcclxuICBkZWZhdWx0VmFsdWU6IG51bWJlcixcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIHNtb05hbWU6IHN0cmluZyxcclxuICBjb250cm9sOiBzdHJpbmcsXHJcbiAgcGFyZW50Q29udHJvbDogU3VpQ29tcG9uZW50UGFyZW50XHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdWlSb2NrZXJDb21wb3NpdGUgZXh0ZW5kcyBTdWlSb2NrZXJDb21wb25lbnQge1xyXG4gIHBhcmVudENvbnRyb2w6IFN1aUNvbXBvbmVudFBhcmVudDtcclxuICBjb25zdHJ1Y3RvcihkaWFsb2c6IFN1aURpYWxvZ05vdGlmaWVyLCBwYXJhbWV0ZXJzOiBTdWlSb2NrZXJDb21wb3NpdGVQYXJhbXMpIHtcclxuICAgIHN1cGVyKGRpYWxvZywgcGFyYW1ldGVycyk7XHJcbiAgICB0aGlzLnBhcmVudENvbnRyb2wgPSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XHJcbiAgfVxyXG5cclxuICBhc3luYyBoYW5kbGVDaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gdHJ1ZTtcclxuICAgIGF3YWl0IHRoaXMucGFyZW50Q29udHJvbC5jaGFuZ2VkKCk7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSBmYWxzZTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/rocker.ts\n\n}");
3741
3741
 
3742
3742
  /***/ },
3743
3743
 
@@ -3770,7 +3770,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
3770
3770
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3771
3771
 
3772
3772
  "use strict";
3773
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiTextBlockComponent: () => (/* binding */ SuiTextBlockComponent),\n/* harmony export */ SuiTextInPlace: () => (/* binding */ SuiTextInPlace)\n/* harmony export */ });\n/* harmony import */ var _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../smo/data/scoreText */ \"./src/smo/data/scoreText.ts\");\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../smo/data/common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _render_sui_textEdit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../render/sui/textEdit */ \"./src/render/sui/textEdit.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.ts\");\n/* harmony import */ var _button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./button */ \"./src/ui/dialogs/components/button.ts\");\n/* harmony import */ var _rocker__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./rocker */ \"./src/ui/dialogs/components/rocker.ts\");\n/* harmony import */ var _dropdown__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dropdown */ \"./src/ui/dialogs/components/dropdown.ts\");\n/* harmony import */ var _render_sui_textRender__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../render/sui/textRender */ \"./src/render/sui/textRender.ts\");\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n\n\n\n\n\n\n\n\n\n/**\n * Edit the text in an SVG element, in the same scale etc. as the text in the score SVG DOM.\n * This component just manages the text editing component of the renderer.\n * @category SuiDialog\n */\nclass SuiTextInPlace extends _baseComponent__WEBPACK_IMPORTED_MODULE_3__.SuiComponentBase {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.editMode = false;\n this.session = null;\n this.scroller = dialog.getView().scroller;\n this.value = new _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup(_smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.defaults);\n this.view = this.dialog.getView();\n const modifier = this.dialog.getModifier();\n if (modifier && _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.isTextGroup(modifier)) {\n this.value = modifier;\n }\n this.staticText = this.dialog.getStaticText();\n this.altLabel = this.staticText.editorLabel;\n }\n show() { }\n hide() { }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_8__.buildDom;\n const id = this.parameterId;\n const r = b('div').classes(this.makeClasses('cbTextInPlace smoControl')).attr('id', this.parameterId).attr('data-param', this.smoName)\n .append(b('button').attr('type', 'checkbox').classes('toggleTextEdit')\n .attr('id', id + '-input').append(b('span').classes('icon icon-pencil'))\n .append(b('label').attr('for', id + '-input').text(this.label)));\n return r;\n }\n endSession() {\n $(this._getInputElement()).find('label').text(this.label);\n const button = document.getElementById(this.parameterId);\n $(button).find('span.icon').removeClass('icon-checkmark').addClass('icon-pencil');\n this.value.skipRender = false;\n if (this.session) {\n this.session.textGroup.tryParseUnicode();\n this.value = this.session.textGroup;\n this.session.stopSession();\n }\n $('body').removeClass('text-edit');\n this.handleChanged();\n }\n get isRunning() {\n return this.session && this.session.isRunning;\n }\n getValue() {\n return this.value;\n }\n _getInputElement() {\n var pid = this.parameterId;\n return $(this.dialog.dgDom.element).find('#' + pid).find('button');\n }\n mouseMove(ev) {\n if (this.session && this.session.isRunning) {\n this.session.handleMouseEvent(ev);\n }\n }\n mouseClick(ev) {\n if (this.session && this.session.isRunning) {\n this.session.handleMouseEvent(ev);\n }\n }\n _renderInactiveBlocks() {\n const modifier = this.value;\n const context = this.view.renderer.pageMap.getRendererFromModifier(this.value).getContext();\n context.save();\n context.setFillStyle('#ddd');\n const svgPage = this.view.renderer.pageMap.getRendererFromModifier(this.value);\n modifier.textBlocks.forEach((block) => {\n const st = block.text;\n if (st.attrs.id !== this.value.getActiveBlock().attrs.id && svgPage) {\n const svgText = _render_sui_textRender__WEBPACK_IMPORTED_MODULE_7__.SuiInlineText.fromScoreText(st, svgPage, this.view.renderer.pageMap, this.scroller);\n if (st.logicalBox) {\n svgText.startX += st.logicalBox.x - st.x;\n svgText.startY += (st.y - st.logicalBox.y) - st.logicalBox.height / 2;\n }\n const sgrp = context.openGroup();\n sgrp.classList.add('inactive-text');\n sgrp.classList.add('suiInlineText');\n svgText.render();\n context.closeGroup();\n }\n });\n context.restore();\n }\n startEditSession() {\n $(this._getInputElement()).find('label').text(this.altLabel);\n const modifier = this.value;\n modifier.skipRender = true;\n let pageContext = this.view.renderer.pageMap.getRendererFromModifier(this.value);\n $(pageContext.svg).find('#' + modifier.attrs.id).remove();\n this._renderInactiveBlocks();\n const ul = modifier.ul();\n // this.textElement=$(this.dialog.layout.svg).find('.'+modifier.attrs.id)[0];\n this.session = new _render_sui_textEdit__WEBPACK_IMPORTED_MODULE_2__.SuiTextSession({\n renderer: this.view.renderer,\n scroller: this.scroller,\n x: ul.x,\n y: ul.y,\n textGroup: modifier,\n text: modifier.getActiveBlock().text,\n scoreText: modifier.getActiveBlock()\n });\n $('body').addClass('text-edit');\n this.value = this.session.textGroup;\n const button = document.getElementById(this.parameterId);\n $(button).find('span.icon').removeClass('icon-pencil').addClass('icon-checkmark');\n // Erase the original since we are going to edit it now.\n if (this.value) {\n this.value.elements.forEach((el) => {\n (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_1__.RemoveElementLike)(el);\n });\n this.value.elements = [];\n }\n this.session.startSession();\n // blur the button so key events don't get passed to it.\n $(this._getInputElement()).blur();\n }\n evKey(evdata) {\n if (this.session) {\n this.session.evKey(evdata);\n }\n }\n bind() {\n $(this._getInputElement()).off('click').on('click', () => {\n if (this.session && this.session.isRunning) {\n this.endSession();\n }\n else {\n this.startEditSession();\n }\n });\n }\n}\n/**\n * Dialog to edit an block of text components. Each block can have\n * different font settings and placement.\n * @category SuiDialog\n */\nclass SuiTextBlockComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_3__.SuiComponentParent {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.addBlockCtrl = new _button__WEBPACK_IMPORTED_MODULE_4__.SuiButtonComposite(this.dialog, {\n id: this.id + 'addBlock',\n smoName: 'addBlock',\n parentControl: this,\n icon: 'icon-plus',\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiButtonComponent',\n label: 'Add Text Block'\n });\n this.toggleBlockCtrl = new _button__WEBPACK_IMPORTED_MODULE_4__.SuiButtonComposite(this.dialog, {\n id: this.id + 'toggleBlock',\n smoName: 'toggleBlock',\n parentControl: this,\n icon: 'icon-arrow-right',\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiButtonComponent',\n label: 'Next Block'\n });\n this.removeBlockCtrl = new _button__WEBPACK_IMPORTED_MODULE_4__.SuiButtonComposite(this.dialog, {\n id: this.id + 'removeBlock',\n smoName: 'removeBlock',\n parentControl: this,\n icon: 'icon-minus',\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiButtonComponent',\n label: 'Remove Block'\n });\n this.relativePositionCtrl = new _dropdown__WEBPACK_IMPORTED_MODULE_6__.SuiDropdownComposite(this.dialog, {\n id: this.id + 'relativePosition',\n smoName: 'relativePosition',\n parentControl: this,\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiDropdownComponent',\n label: 'Block Positions',\n options: [{\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.relativePositions.ABOVE,\n label: 'Above'\n }, {\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.relativePositions.BELOW,\n label: 'Below'\n }, {\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.relativePositions.LEFT,\n label: 'Left'\n }, {\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.relativePositions.RIGHT,\n label: 'Right'\n }]\n });\n this.justificationCtrl = new _dropdown__WEBPACK_IMPORTED_MODULE_6__.SuiDropdownComposite(this.dialog, {\n id: this.id + 'justification',\n smoName: 'justification',\n parentControl: this,\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiDropdownComponent',\n label: 'Justification',\n options: [{\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.justifications.LEFT,\n label: 'Left'\n }, {\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.justifications.RIGHT,\n label: 'Right'\n }, {\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.justifications.CENTER,\n label: 'Center'\n }]\n });\n this.spacingCtrl = new _rocker__WEBPACK_IMPORTED_MODULE_5__.SuiRockerComposite(this.dialog, {\n id: this.id + 'spacing',\n smoName: 'spacing',\n defaultValue: 0,\n parentControl: this,\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiRockerComponent',\n label: 'Spacing',\n dataType: 'float',\n increment: 0.1\n });\n const mod = this.dialog.getModifier();\n if (mod && _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.isTextGroup(mod)) {\n this.modifier = mod;\n }\n else {\n this.modifier = new _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup(_smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.defaults);\n }\n this.activeScoreText = this.modifier.textBlocks[0].text;\n }\n changed() {\n if (this.addBlockCtrl.changeFlag && this.modifier) {\n const nt = new _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoScoreText(this.activeScoreText);\n this.modifier.addScoreText(nt);\n this.activeScoreText = nt;\n this.modifier.setActiveBlock(nt);\n this._updateMultiiFields();\n }\n if (this.relativePositionCtrl.changeFlag) {\n this.modifier.setRelativePosition(parseInt(this.relativePositionCtrl.getValue().toString(), 10));\n }\n if (this.justificationCtrl.changeFlag) {\n this.modifier.justification = parseInt(this.justificationCtrl.getValue().toString(), 10);\n }\n if (this.removeBlockCtrl.changeFlag) {\n this.modifier.removeBlock(this.activeScoreText);\n this.activeScoreText = this.modifier.firstBlock();\n this._updateMultiiFields();\n }\n if (this.toggleBlockCtrl.changeFlag) {\n const curIx = this.modifier.indexOf(this.activeScoreText);\n const newIx = (curIx + 1) % this.modifier.textBlocks.length;\n this.activeScoreText = this.modifier.textBlocks[newIx].text;\n this.modifier.setActiveBlock(this.activeScoreText);\n }\n if (this.spacingCtrl.changeFlag) {\n const val = this.spacingCtrl.getValue();\n if (val >= 0) {\n this.modifier.spacing = val;\n }\n }\n this.handleChanged();\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_8__.buildDom;\n const q = b('div').classes(this.makeClasses('multiControl smoControl'));\n q.append(this.addBlockCtrl.html);\n q.append(this.removeBlockCtrl.html);\n q.append(this.toggleBlockCtrl.html);\n q.append(this.relativePositionCtrl.html);\n q.append(this.justificationCtrl.html);\n q.append(this.spacingCtrl.html);\n return q;\n }\n _getInputElement() {\n return $(this.dialog.dgDom.element).find('#' + this.parameterId);\n }\n getValue() {\n return {\n activeScoreText: this.activeScoreText,\n modifier: this.modifier\n };\n }\n _updateMultiiFields() {\n const fields = [this.justificationCtrl, this.relativePositionCtrl,\n this.removeBlockCtrl, this.toggleBlockCtrl, this.spacingCtrl];\n fields.forEach((field) => {\n if (this.modifier.textBlocks.length < 2) {\n $('#' + field.parameterId).addClass('hide');\n }\n else {\n $('#' + field.parameterId).removeClass('hide');\n }\n });\n }\n setValue(value) {\n this.activeScoreText = value.activeScoreText;\n this.modifier = value.modifier;\n this.relativePositionCtrl.setValue(this.modifier.relativePosition);\n this._updateMultiiFields();\n this.justificationCtrl.setValue(this.modifier.justification);\n this.spacingCtrl.setValue(this.modifier.spacing);\n }\n bind() {\n this.addBlockCtrl.bind();\n this.relativePositionCtrl.bind();\n this.justificationCtrl.bind();\n this.removeBlockCtrl.bind();\n this.toggleBlockCtrl.bind();\n this.spacingCtrl.bind();\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL3RleHRJblBsYWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQXlFO0FBQ1c7QUFDdEI7QUFHNEI7QUFDNUM7QUFDQTtBQUNJO0FBQ2E7QUFDUjtBQWF2RDs7OztHQUlHO0FBQ0ksTUFBTSxjQUFlLFNBQVEsNERBQWdCO0lBUWxELFlBQVksTUFBeUIsRUFBRSxTQUErQjtRQUNwRSxLQUFLLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBUDNCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFLMUIsWUFBTyxHQUEwQixJQUFJLENBQUM7UUFHcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSw2REFBWSxDQUFDLDZEQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0MsSUFBSSxRQUFRLElBQUksNkRBQVksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUksS0FBSSxDQUFDO0lBQ1QsSUFBSSxLQUFJLENBQUM7SUFFVCxJQUFJLElBQUk7UUFDTixNQUFNLENBQUMsR0FBRyx5REFBUSxDQUFDO1FBQ25CLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FB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LElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztDQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3VpL2RpYWxvZ3MvY29tcG9uZW50cy90ZXh0SW5QbGFjZS50cz9hZGNiIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNtb1Njb3JlVGV4dCwgU21vVGV4dEdyb3VwIH0gZnJvbSAnLi4vLi4vLi4vc21vL2RhdGEvc2NvcmVUZXh0JztcclxuaW1wb3J0IHsgS2V5RXZlbnQsIEVsZW1lbnRMaWtlLCBSZW1vdmVFbGVtZW50TGlrZSB9IGZyb20gJy4uLy4uLy4uL3Ntby9kYXRhL2NvbW1vbic7XHJcbmltcG9ydCB7IFN1aVRleHRTZXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vcmVuZGVyL3N1aS90ZXh0RWRpdCc7XHJcbmltcG9ydCB7IFN1aVNjcm9sbGVyIH0gZnJvbSAnLi4vLi4vLi4vcmVuZGVyL3N1aS9zY3JvbGxlcic7XHJcbmltcG9ydCB7IFN1aVNjb3JlVmlld09wZXJhdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9yZW5kZXIvc3VpL3Njb3JlVmlld09wZXJhdGlvbnMnO1xyXG5pbXBvcnQgeyBTdWlEaWFsb2dOb3RpZmllciwgU3VpQ29tcG9uZW50QmFzZSwgU3VpQ29tcG9uZW50UGFyZW50IH0gZnJvbSAnLi9iYXNlQ29tcG9uZW50JztcclxuaW1wb3J0IHsgU3VpQnV0dG9uQ29tcG9zaXRlIH0gZnJvbSAnLi9idXR0b24nO1xyXG5pbXBvcnQgeyBTdWlSb2NrZXJDb21wb3NpdGUgfSBmcm9tICcuL3JvY2tlcic7XHJcbmltcG9ydCB7IFN1aURyb3Bkb3duQ29tcG9zaXRlIH0gZnJvbSAnLi9kcm9wZG93bic7XHJcbmltcG9ydCB7IFN1aUlubGluZVRleHQgfSBmcm9tICcuLi8uLi8uLi9yZW5kZXIvc3VpL3RleHRSZW5kZXInO1xyXG5pbXBvcnQgeyBidWlsZERvbSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9odG1sSGVscGVycyc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aVRleHRJblBsYWNlUGFyYW1zIHtcclxuICBpZDogc3RyaW5nLFxyXG4gIGNsYXNzZXM6IHN0cmluZyxcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIHNtb05hbWU6IHN0cmluZyxcclxuICBjb250cm9sOiBzdHJpbmdcclxufVxyXG4vKipcclxuICogRWRpdCB0aGUgdGV4dCBpbiBhbiBTVkcgZWxlbWVudCwgaW4gdGhlIHNhbWUgc2NhbGUgZXRjLiBhcyB0aGUgdGV4dCBpbiB0aGUgc2NvcmUgU1ZHIERPTS5cclxuICogVGhpcyBjb21wb25lbnQganVzdCBtYW5hZ2VzIHRoZSB0ZXh0IGVkaXRpbmcgY29tcG9uZW50IG9mIHRoZSByZW5kZXJlci5cclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVRleHRJblBsYWNlIGV4dGVuZHMgU3VpQ29tcG9uZW50QmFzZSB7XHJcbiAgc2Nyb2xsZXI6IFN1aVNjcm9sbGVyO1xyXG4gIGVkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdmFsdWU6IFNtb1RleHRHcm91cDtcclxuICBzdGF0aWNUZXh0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIGFsdExhYmVsOiBzdHJpbmc7XHJcbiAgdmlldzogU3VpU2NvcmVWaWV3T3BlcmF0aW9ucztcclxuICBzZXNzaW9uOiBTdWlUZXh0U2Vzc2lvbiB8IG51bGwgPSBudWxsO1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcjogU3VpVGV4dEluUGxhY2VQYXJhbXMpIHtcclxuICAgIHN1cGVyKGRpYWxvZywgcGFyYW1ldGVyKTtcclxuICAgIHRoaXMuc2Nyb2xsZXIgPSBkaWFsb2cuZ2V0VmlldygpLnNjcm9sbGVyO1xyXG4gICAgdGhpcy52YWx1ZSA9IG5ldyBTbW9UZXh0R3JvdXAoU21vVGV4dEdyb3VwLmRlZmF1bHRzKTtcclxuICAgIHRoaXMudmlldyA9IHRoaXMuZGlhbG9nLmdldFZpZXcoKTtcclxuICAgIGNvbnN0IG1vZGlmaWVyID0gdGhpcy5kaWFsb2cuZ2V0TW9kaWZpZXIoKTtcclxuICAgIGlmIChtb2RpZmllciAmJiBTbW9UZXh0R3JvdXAuaXNUZXh0R3JvdXAobW9kaWZpZXIpKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSBtb2RpZmllcjtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdGljVGV4dCA9IHRoaXMuZGlhbG9nLmdldFN0YXRpY1RleHQoKTtcclxuICAgIHRoaXMuYWx0TGFiZWwgPSB0aGlzLnN0YXRpY1RleHQuZWRpdG9yTGFiZWw7XHJcbiAgfVxyXG4gIHNob3coKSB7fVxyXG4gIGhpZGUoKSB7fVxyXG5cclxuICBnZXQgaHRtbCgpIHtcclxuICAgIGNvbnN0IGIgPSBidWlsZERvbTtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5wYXJhbWV0ZXJJZDtcclxuICAgIGNvbnN0IHIgPSBiKCdkaXYnKS5jbGFzc2VzKHRoaXMubWFrZUNsYXNzZXMoJ2NiVGV4dEluUGxhY2Ugc21vQ29udHJvbCcpKS5hdHRyKCdpZCcsIHRoaXMucGFyYW1ldGVySWQpLmF0dHIoJ2RhdGEtcGFyYW0nLCB0aGlzLnNtb05hbWUpXHJcbiAgICAgIC5hcHBlbmQoYignYnV0dG9uJykuYXR0cigndHlwZScsICdjaGVja2JveCcpLmNsYXNzZXMoJ3RvZ2dsZVRleHRFZGl0JylcclxuICAgICAgICAuYXR0cignaWQnLCBpZCArICctaW5wdXQnKS5hcHBlbmQoXHJcbiAgICAgICAgICBiKCdzcGFuJykuY2xhc3NlcygnaWNvbiBpY29uLXBlbmNpbCcpKVxyXG4gICAgICAgIC5hcHBlbmQoXHJcbiAgICAgICAgICBiKCdsYWJlbCcpLmF0dHIoJ2ZvcicsIGlkICsgJy1pbnB1dCcpLnRleHQodGhpcy5sYWJlbCkpKTtcclxuICAgIHJldHVybiByO1xyXG4gIH1cclxuICBlbmRTZXNzaW9uKCkge1xyXG4gICAgJCh0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKSkuZmluZCgnbGFiZWwnKS50ZXh0KHRoaXMubGFiZWwpO1xyXG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYXJhbWV0ZXJJZCk7XHJcbiAgICAkKGJ1dHRvbikuZmluZCgnc3Bhbi5pY29uJykucmVtb3ZlQ2xhc3MoJ2ljb24tY2hlY2ttYXJrJykuYWRkQ2xhc3MoJ2ljb24tcGVuY2lsJyk7XHJcbiAgICB0aGlzLnZhbHVlLnNraXBSZW5kZXIgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5zZXNzaW9uKSB7XHJcbiAgICAgIHRoaXMuc2Vzc2lvbi50ZXh0R3JvdXAudHJ5UGFyc2VVbmljb2RlKCk7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnNlc3Npb24udGV4dEdyb3VwO1xyXG4gICAgICB0aGlzLnNlc3Npb24uc3RvcFNlc3Npb24oKTtcclxuICAgIH1cclxuICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygndGV4dC1lZGl0Jyk7XHJcbiAgICB0aGlzLmhhbmRsZUNoYW5nZWQoKTtcclxuICB9XHJcbiAgZ2V0IGlzUnVubmluZygpIHtcclxuICAgIHJldHVybiB0aGlzLnNlc3Npb24gJiYgdGhpcy5zZXNzaW9uLmlzUnVubmluZztcclxuICB9XHJcbiAgZ2V0VmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICB9XHJcbiAgX2dldElucHV0RWxlbWVudCgpIHtcclxuICAgIHZhciBwaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgcmV0dXJuICQodGhpcy5kaWFsb2cuZGdEb20uZWxlbWVudCkuZmluZCgnIycgKyBwaWQpLmZpbmQoJ2J1dHRvbicpO1xyXG4gIH1cclxuICBtb3VzZU1vdmUoZXY6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuc2Vzc2lvbiAmJiB0aGlzLnNlc3Npb24uaXNSdW5uaW5nKSB7XHJcbiAgICAgIHRoaXMuc2Vzc2lvbi5oYW5kbGVNb3VzZUV2ZW50KGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlQ2xpY2soZXY6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuc2Vzc2lvbiAmJiB0aGlzLnNlc3Npb24uaXNSdW5uaW5nKSB7XHJcbiAgICAgIHRoaXMuc2Vzc2lvbi5oYW5kbGVNb3VzZUV2ZW50KGV2KTtcclxuICAgIH1cclxuICB9XHJcbiAgX3JlbmRlckluYWN0aXZlQmxvY2tzKCkge1xyXG4gICAgY29uc3QgbW9kaWZpZXIgPSB0aGlzLnZhbHVlO1xyXG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMudmlldy5yZW5kZXJlci5wYWdlTWFwLmdldFJlbmRlcmVyRnJvbU1vZGlmaWVyKHRoaXMudmFsdWUpLmdldENvbnRleHQoKTtcclxuICAgIGNvbnRleHQuc2F2ZSgpO1xyXG4gICAgY29udGV4dC5zZXRGaWxsU3R5bGUoJyNkZGQnKTtcclxuICAgIGNvbnN0IHN2Z1BhZ2UgPSB0aGlzLnZpZXcucmVuZGVyZXIucGFnZU1hcC5nZXRSZW5kZXJlckZyb21Nb2RpZmllcih0aGlzLnZhbHVlKTtcclxuICAgIG1vZGlmaWVyLnRleHRCbG9ja3MuZm9yRWFjaCgoYmxvY2spID0+IHtcclxuICAgICAgY29uc3Qgc3QgPSBibG9jay50ZXh0O1xyXG4gICAgICBpZiAoc3QuYXR0cnMuaWQgIT09IHRoaXMudmFsdWUuZ2V0QWN0aXZlQmxvY2soKS5hdHRycy5pZCAmJiBzdmdQYWdlKSB7XHJcbiAgICAgICAgY29uc3Qgc3ZnVGV4dCA9IFN1aUlubGluZVRleHQuZnJvbVNjb3JlVGV4dChzdCwgc3ZnUGFnZSwgdGhpcy52aWV3LnJlbmRlcmVyLnBhZ2VNYXAsIHRoaXMuc2Nyb2xsZXIpO1xyXG4gICAgICAgIGlmIChzdC5sb2dpY2FsQm94KSB7XHJcbiAgICAgICAgICBzdmdUZXh0LnN0YXJ0WCArPSBzdC5sb2dpY2FsQm94LnggLSBzdC54O1xyXG4gICAgICAgICAgc3ZnVGV4dC5zdGFydFkgKz0gKHN0LnkgLSBzdC5sb2dpY2FsQm94LnkpIC0gc3QubG9naWNhbEJveC5oZWlnaHQgLyAyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzZ3JwID0gY29udGV4dC5vcGVuR3JvdXAoKTtcclxuICAgICAgICBzZ3JwLmNsYXNzTGlzdC5hZGQoJ2luYWN0aXZlLXRleHQnKTtcclxuICAgICAgICBzZ3JwLmNsYXNzTGlzdC5hZGQoJ3N1aUlubGluZVRleHQnKTtcclxuICAgICAgICBzdmdUZXh0LnJlbmRlcigpO1xyXG4gICAgICAgIGNvbnRleHQuY2xvc2VHcm91cCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGNvbnRleHQucmVzdG9yZSgpO1xyXG4gIH1cclxuICBzdGFydEVkaXRTZXNzaW9uKCkge1xyXG4gICAgJCh0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKSkuZmluZCgnbGFiZWwnKS50ZXh0KHRoaXMuYWx0TGFiZWwpO1xyXG4gICAgY29uc3QgbW9kaWZpZXIgPSB0aGlzLnZhbHVlO1xyXG4gICAgbW9kaWZpZXIuc2tpcFJlbmRlciA9IHRydWU7XHJcbiAgICBsZXQgcGFnZUNvbnRleHQgPSB0aGlzLnZpZXcucmVuZGVyZXIucGFnZU1hcC5nZXRSZW5kZXJlckZyb21Nb2RpZmllcih0aGlzLnZhbHVlKTtcclxuICAgICQocGFnZUNvbnRleHQuc3ZnKS5maW5kKCcjJyArIG1vZGlmaWVyLmF0dHJzLmlkKS5yZW1vdmUoKTtcclxuICAgIHRoaXMuX3JlbmRlckluYWN0aXZlQmxvY2tzKCk7XHJcbiAgICBjb25zdCB1bCA9IG1vZGlmaWVyLnVsKCk7XHJcblxyXG4gICAgLy8gdGhpcy50ZXh0RWxlbWVudD0kKHRoaXMuZGlhbG9nLmxheW91dC5zdmcpLmZpbmQoJy4nK21vZGlmaWVyLmF0dHJzLmlkKVswXTtcclxuICAgIHRoaXMuc2Vzc2lvbiA9IG5ldyBTdWlUZXh0U2Vzc2lvbih7XHJcbiAgICAgIHJlbmRlcmVyOiB0aGlzLnZpZXcucmVuZGVyZXIsXHJcbiAgICAgIHNjcm9sbGVyOiB0aGlzLnNjcm9sbGVyLFxyXG4gICAgICB4OiB1bC54LFxyXG4gICAgICB5OiB1bC55LFxyXG4gICAgICB0ZXh0R3JvdXA6IG1vZGlmaWVyLFxyXG4gICAgICB0ZXh0OiBtb2RpZmllci5nZXRBY3RpdmVCbG9jaygpLnRleHQsXHJcbiAgICAgIHNjb3JlVGV4dDogbW9kaWZpZXIuZ2V0QWN0aXZlQmxvY2soKVxyXG4gICAgfSk7XHJcbiAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ3RleHQtZWRpdCcpO1xyXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuc2Vzc2lvbi50ZXh0R3JvdXA7XHJcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBhcmFtZXRlcklkKTtcclxuICAgICQoYnV0dG9uKS5maW5kKCdzcGFuLmljb24nKS5yZW1vdmVDbGFzcygnaWNvbi1wZW5jaWwnKS5hZGRDbGFzcygnaWNvbi1jaGVja21hcmsnKTtcclxuICAgIC8vIEVyYXNlIHRoZSBvcmlnaW5hbCBzaW5jZSB3ZSBhcmUgZ29pbmcgdG8gZWRpdCBpdCBub3cuXHJcbiAgICBpZiAodGhpcy52YWx1ZSkge1xyXG4gICAgICB0aGlzLnZhbHVlLmVsZW1lbnRzLmZvckVhY2goKGVsOiBFbGVtZW50TGlrZSkgPT4ge1xyXG4gICAgICAgIFJlbW92ZUVsZW1lbnRMaWtlKGVsKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudmFsdWUuZWxlbWVudHMgPSBbXTtcclxuICAgIH1cclxuICAgIHRoaXMuc2Vzc2lvbi5zdGFydFNlc3Npb24oKTtcclxuICAgIC8vIGJsdXIgdGhlIGJ1dHRvbiBzbyBrZXkgZXZlbnRzIGRvbid0IGdldCBwYXNzZWQgdG8gaXQuXHJcbiAgICAkKHRoaXMuX2dldElucHV0RWxlbWVudCgpKS5ibHVyKCk7XHJcbiAgfVxyXG4gIGV2S2V5KGV2ZGF0YTogS2V5RXZlbnQpIHtcclxuICAgIGlmICh0aGlzLnNlc3Npb24pIHtcclxuICAgICAgdGhpcy5zZXNzaW9uLmV2S2V5KGV2ZGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGJpbmQoKSB7XHJcbiAgICAkKHRoaXMuX2dldElucHV0RWxlbWVudCgpKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5zZXNzaW9uICYmIHRoaXMuc2Vzc2lvbi5pc1J1bm5pbmcpIHtcclxuICAgICAgICB0aGlzLmVuZFNlc3Npb24oKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0YXJ0RWRpdFNlc3Npb24oKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aVRleHRCbG9ja0NvbXBvbmVudFBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nXHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3VpVGV4dEJsb2NrVmFsdWUge1xyXG4gIG1vZGlmaWVyOiBTbW9UZXh0R3JvdXAsXHJcbiAgYWN0aXZlU2NvcmVUZXh0OiBTbW9TY29yZVRleHRcclxufVxyXG4vKipcclxuICogRGlhbG9nIHRvIGVkaXQgYW4gYmxvY2sgb2YgdGV4dCBjb21wb25lbnRzLiAgRWFjaCBibG9jayBjYW4gaGF2ZSBcclxuICogZGlmZmVyZW50IGZvbnQgc2V0dGluZ3MgYW5kIHBsYWNlbWVudC5cclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVRleHRCbG9ja0NvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudFBhcmVudCB7XHJcbiAgYWRkQmxvY2tDdHJsOiBTdWlCdXR0b25Db21wb3NpdGU7XHJcbiAgdG9nZ2xlQmxvY2tDdHJsOiBTdWlCdXR0b25Db21wb3NpdGU7XHJcbiAgcmVtb3ZlQmxvY2tDdHJsOiBTdWlCdXR0b25Db21wb3NpdGU7XHJcbiAgcmVsYXRpdmVQb3NpdGlvbkN0cmw6IFN1aURyb3Bkb3duQ29tcG9zaXRlO1xyXG4gIGp1c3RpZmljYXRpb25DdHJsOiBTdWlEcm9wZG93bkNvbXBvc2l0ZTtcclxuICBzcGFjaW5nQ3RybDogU3VpUm9ja2VyQ29tcG9zaXRlO1xyXG4gIG1vZGlmaWVyOiBTbW9UZXh0R3JvdXA7XHJcbiAgYWN0aXZlU2NvcmVUZXh0OiBTbW9TY29yZVRleHQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcjogU3VpVGV4dEJsb2NrQ29tcG9uZW50UGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcik7XHJcbiAgICB0aGlzLmFkZEJsb2NrQ3RybCA9IG5ldyBTdWlCdXR0b25Db21wb3NpdGUodGhpcy5kaWFsb2csXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogdGhpcy5pZCArICdhZGRCbG9jaycsXHJcbiAgICAgICAgc21vTmFtZTogJ2FkZEJsb2NrJyxcclxuICAgICAgICBwYXJlbnRDb250cm9sOiB0aGlzLFxyXG4gICAgICAgIGljb246ICdpY29uLXBsdXMnLFxyXG4gICAgICAgIGNsYXNzZXM6ICdoaWRlLXdoZW4tZWRpdGluZyBoaWRlLXdoZW4tbW92aW5nJyxcclxuICAgICAgICBjb250cm9sOiAnU3VpQnV0dG9uQ29tcG9uZW50JyxcclxuICAgICAgICBsYWJlbDogJ0FkZCBUZXh0IEJsb2NrJ1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnRvZ2dsZUJsb2NrQ3RybCA9IG5ldyBTdWlCdXR0b25Db21wb3NpdGUodGhpcy5kaWFsb2csXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogdGhpcy5pZCArICd0b2dnbGVCbG9jaycsXHJcbiAgICAgICAgc21vTmFtZTogJ3RvZ2dsZUJsb2NrJyxcclxuICAgICAgICBwYXJlbnRDb250cm9sOiB0aGlzLFxyXG4gICAgICAgIGljb246ICdpY29uLWFycm93LXJpZ2h0JyxcclxuICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aUJ1dHRvbkNvbXBvbmVudCcsXHJcbiAgICAgICAgbGFiZWw6ICdOZXh0IEJsb2NrJ1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnJlbW92ZUJsb2NrQ3RybCA9IG5ldyBTdWlCdXR0b25Db21wb3NpdGUodGhpcy5kaWFsb2csXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogdGhpcy5pZCArICdyZW1vdmVCbG9jaycsXHJcbiAgICAgICAgc21vTmFtZTogJ3JlbW92ZUJsb2NrJyxcclxuICAgICAgICBwYXJlbnRDb250cm9sOiB0aGlzLFxyXG4gICAgICAgIGljb246ICdpY29uLW1pbnVzJyxcclxuICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aUJ1dHRvbkNvbXBvbmVudCcsXHJcbiAgICAgICAgbGFiZWw6ICdSZW1vdmUgQmxvY2snXHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5yZWxhdGl2ZVBvc2l0aW9uQ3RybCA9IG5ldyBTdWlEcm9wZG93bkNvbXBvc2l0ZShcclxuICAgICAgdGhpcy5kaWFsb2csXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogdGhpcy5pZCArICdyZWxhdGl2ZVBvc2l0aW9uJyxcclxuICAgICAgICBzbW9OYW1lOiAncmVsYXRpdmVQb3NpdGlvbicsXHJcbiAgICAgICAgcGFyZW50Q29udHJvbDogdGhpcyxcclxuICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aURyb3Bkb3duQ29tcG9uZW50JyxcclxuICAgICAgICBsYWJlbDogJ0Jsb2NrIFBvc2l0aW9ucycsXHJcbiAgICAgICAgb3B0aW9uczogW3tcclxuICAgICAgICAgIHZhbHVlOiBTbW9UZXh0R3JvdXAucmVsYXRpdmVQb3NpdGlvbnMuQUJPVkUsXHJcbiAgICAgICAgICBsYWJlbDogJ0Fib3ZlJ1xyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHZhbHVlOiBTbW9UZXh0R3JvdXAucmVsYXRpdmVQb3NpdGlvbnMuQkVMT1csXHJcbiAgICAgICAgICBsYWJlbDogJ0JlbG93J1xyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHZhbHVlOiBTbW9UZXh0R3JvdXAucmVsYXRpdmVQb3NpdGlvbnMuTEVGVCxcclxuICAgICAgICAgIGxhYmVsOiAnTGVmdCdcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB2YWx1ZTogU21vVGV4dEdyb3VwLnJlbGF0aXZlUG9zaXRpb25zLlJJR0hULFxyXG4gICAgICAgICAgbGFiZWw6ICdSaWdodCdcclxuICAgICAgICB9XVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5qdXN0aWZpY2F0aW9uQ3RybCA9IG5ldyBTdWlEcm9wZG93bkNvbXBvc2l0ZShcclxuICAgICAgdGhpcy5kaWFsb2csXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogdGhpcy5pZCArICdqdXN0aWZpY2F0aW9uJyxcclxuICAgICAgICBzbW9OYW1lOiAnanVzdGlmaWNhdGlvbicsXHJcbiAgICAgICAgcGFyZW50Q29udHJvbDogdGhpcyxcclxuICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aURyb3Bkb3duQ29tcG9uZW50JyxcclxuICAgICAgICBsYWJlbDogJ0p1c3RpZmljYXRpb24nLFxyXG4gICAgICAgIG9wdGlvbnM6IFt7XHJcbiAgICAgICAgICB2YWx1ZTogU21vVGV4dEdyb3VwLmp1c3RpZmljYXRpb25zLkxFRlQsXHJcbiAgICAgICAgICBsYWJlbDogJ0xlZnQnXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdmFsdWU6IFNtb1RleHRHcm91cC5qdXN0aWZpY2F0aW9ucy5SSUdIVCxcclxuICAgICAgICAgIGxhYmVsOiAnUmlnaHQnXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdmFsdWU6IFNtb1RleHRHcm91cC5qdXN0aWZpY2F0aW9ucy5DRU5URVIsXHJcbiAgICAgICAgICBsYWJlbDogJ0NlbnRlcidcclxuICAgICAgICB9XVxyXG4gICAgICB9KTtcclxuICAgIHRoaXMuc3BhY2luZ0N0cmwgPSBuZXcgU3VpUm9ja2VyQ29tcG9zaXRlKFxyXG4gICAgICB0aGlzLmRpYWxvZyxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiB0aGlzLmlkICsgJ3NwYWNpbmcnLFxyXG4gICAgICAgIHNtb05hbWU6ICdzcGFjaW5nJyxcclxuICAgICAgICBkZWZhdWx0VmFsdWU6IDAsXHJcbiAgICAgICAgcGFyZW50Q29udHJvbDogdGhpcyxcclxuICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aVJvY2tlckNvbXBvbmVudCcsXHJcbiAgICAgICAgbGFiZWw6ICdTcGFjaW5nJyxcclxuICAgICAgICBkYXRhVHlwZTogJ2Zsb2F0JyxcclxuICAgICAgICBpbmNyZW1lbnQ6IDAuMVxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuICAgIGNvbnN0IG1vZCA9IHRoaXMuZGlhbG9nLmdldE1vZGlmaWVyKCk7XHJcbiAgICBpZiAobW9kICYmIFNtb1RleHRHcm91cC5pc1RleHRHcm91cChtb2QpKSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXIgPSBtb2Q7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1vZGlmaWVyID0gbmV3IFNtb1RleHRHcm91cChTbW9UZXh0R3JvdXAuZGVmYXVsdHMpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hY3RpdmVTY29yZVRleHQgPSB0aGlzLm1vZGlmaWVyLnRleHRCbG9ja3NbMF0udGV4dDtcclxuICB9XHJcbiAgY2hhbmdlZCgpIHtcclxuICAgIGlmICh0aGlzLmFkZEJsb2NrQ3RybC5jaGFuZ2VGbGFnICYmIHRoaXMubW9kaWZpZXIpIHtcclxuICAgICAgY29uc3QgbnQgPSBuZXcgU21vU2NvcmVUZXh0KHRoaXMuYWN0aXZlU2NvcmVUZXh0KTtcclxuICAgICAgdGhpcy5tb2RpZmllci5hZGRTY29yZVRleHQobnQpO1xyXG4gICAgICB0aGlzLmFjdGl2ZVNjb3JlVGV4dCA9IG50O1xyXG4gICAgICB0aGlzLm1vZGlmaWVyLnNldEFjdGl2ZUJsb2NrKG50KTtcclxuICAgICAgdGhpcy5fdXBkYXRlTXVsdGlpRmllbGRzKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5yZWxhdGl2ZVBvc2l0aW9uQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXIuc2V0UmVsYXRpdmVQb3NpdGlvbihwYXJzZUludCh0aGlzLnJlbGF0aXZlUG9zaXRpb25DdHJsLmdldFZhbHVlKCkudG9TdHJpbmcoKSwgMTApKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmp1c3RpZmljYXRpb25DdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgdGhpcy5tb2RpZmllci5qdXN0aWZpY2F0aW9uID0gcGFyc2VJbnQodGhpcy5qdXN0aWZpY2F0aW9uQ3RybC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCksIDEwKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnJlbW92ZUJsb2NrQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXIucmVtb3ZlQmxvY2sodGhpcy5hY3RpdmVTY29yZVRleHQpO1xyXG4gICAgICB0aGlzLmFjdGl2ZVNjb3JlVGV4dCA9IHRoaXMubW9kaWZpZXIuZmlyc3RCbG9jaygpO1xyXG4gICAgICB0aGlzLl91cGRhdGVNdWx0aWlGaWVsZHMoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRvZ2dsZUJsb2NrQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIGNvbnN0IGN1ckl4ID0gdGhpcy5tb2RpZmllci5pbmRleE9mKHRoaXMuYWN0aXZlU2NvcmVUZXh0KTtcclxuICAgICAgY29uc3QgbmV3SXggPSAoY3VySXggKyAxKSAlIHRoaXMubW9kaWZpZXIudGV4dEJsb2Nrcy5sZW5ndGg7XHJcbiAgICAgIHRoaXMuYWN0aXZlU2NvcmVUZXh0ID0gdGhpcy5tb2RpZmllci50ZXh0QmxvY2tzW25ld0l4XS50ZXh0O1xyXG4gICAgICB0aGlzLm1vZGlmaWVyLnNldEFjdGl2ZUJsb2NrKHRoaXMuYWN0aXZlU2NvcmVUZXh0KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNwYWNpbmdDdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgY29uc3QgdmFsID0gdGhpcy5zcGFjaW5nQ3RybC5nZXRWYWx1ZSgpO1xyXG4gICAgICBpZiAodmFsID49IDApIHtcclxuICAgICAgICB0aGlzLm1vZGlmaWVyLnNwYWNpbmcgPSB2YWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuaGFuZGxlQ2hhbmdlZCgpO1xyXG4gIH1cclxuICBnZXQgaHRtbCgpIHtcclxuICAgIGNvbnN0IGIgPSBidWlsZERvbTtcclxuICAgIGNvbnN0IHEgPSBiKCdkaXYnKS5jbGFzc2VzKHRoaXMubWFrZUNsYXNzZXMoJ211bHRpQ29udHJvbCBzbW9Db250cm9sJykpO1xyXG4gICAgcS5hcHBlbmQodGhpcy5hZGRCbG9ja0N0cmwuaHRtbCk7XHJcbiAgICBxLmFwcGVuZCh0aGlzLnJlbW92ZUJsb2NrQ3RybC5odG1sKTtcclxuICAgIHEuYXBwZW5kKHRoaXMudG9nZ2xlQmxvY2tDdHJsLmh0bWwpO1xyXG4gICAgcS5hcHBlbmQodGhpcy5yZWxhdGl2ZVBvc2l0aW9uQ3RybC5odG1sKTtcclxuICAgIHEuYXBwZW5kKHRoaXMuanVzdGlmaWNhdGlvbkN0cmwuaHRtbCk7XHJcbiAgICBxLmFwcGVuZCh0aGlzLnNwYWNpbmdDdHJsLmh0bWwpO1xyXG5cclxuICAgIHJldHVybiBxO1xyXG4gIH1cclxuXHJcbiAgX2dldElucHV0RWxlbWVudCgpIHtcclxuICAgIHJldHVybiAkKHRoaXMuZGlhbG9nLmRnRG9tLmVsZW1lbnQpLmZpbmQoJyMnICsgdGhpcy5wYXJhbWV0ZXJJZCk7XHJcbiAgfVxyXG4gIGdldFZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWN0aXZlU2NvcmVUZXh0OiB0aGlzLmFjdGl2ZVNjb3JlVGV4dCxcclxuICAgICAgbW9kaWZpZXI6IHRoaXMubW9kaWZpZXJcclxuICAgIH07XHJcbiAgfVxyXG4gIF91cGRhdGVNdWx0aWlGaWVsZHMoKSB7XHJcbiAgICBjb25zdCBmaWVsZHMgPSBbdGhpcy5qdXN0aWZpY2F0aW9uQ3RybCwgdGhpcy5yZWxhdGl2ZVBvc2l0aW9uQ3RybCxcclxuICAgICAgdGhpcy5yZW1vdmVCbG9ja0N0cmwsIHRoaXMudG9nZ2xlQmxvY2tDdHJsLCB0aGlzLnNwYWNpbmdDdHJsXTtcclxuICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5tb2RpZmllci50ZXh0QmxvY2tzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgICAkKCcjJyArIGZpZWxkLnBhcmFtZXRlcklkKS5hZGRDbGFzcygnaGlkZScpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICQoJyMnICsgZmllbGQucGFyYW1ldGVySWQpLnJlbW92ZUNsYXNzKCdoaWRlJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBzZXRWYWx1ZSh2YWx1ZTogU3VpVGV4dEJsb2NrVmFsdWUpIHtcclxuICAgIHRoaXMuYWN0aXZlU2NvcmVUZXh0ID0gdmFsdWUuYWN0aXZlU2NvcmVUZXh0O1xyXG4gICAgdGhpcy5tb2RpZmllciA9IHZhbHVlLm1vZGlmaWVyO1xyXG4gICAgdGhpcy5yZWxhdGl2ZVBvc2l0aW9uQ3RybC5zZXRWYWx1ZSh0aGlzLm1vZGlmaWVyLnJlbGF0aXZlUG9zaXRpb24pO1xyXG4gICAgdGhpcy5fdXBkYXRlTXVsdGlpRmllbGRzKCk7XHJcbiAgICB0aGlzLmp1c3RpZmljYXRpb25DdHJsLnNldFZhbHVlKHRoaXMubW9kaWZpZXIuanVzdGlmaWNhdGlvbik7XHJcbiAgICB0aGlzLnNwYWNpbmdDdHJsLnNldFZhbHVlKHRoaXMubW9kaWZpZXIuc3BhY2luZyk7XHJcbiAgfVxyXG5cclxuICBiaW5kKCkge1xyXG4gICAgdGhpcy5hZGRCbG9ja0N0cmwuYmluZCgpO1xyXG4gICAgdGhpcy5yZWxhdGl2ZVBvc2l0aW9uQ3RybC5iaW5kKCk7XHJcbiAgICB0aGlzLmp1c3RpZmljYXRpb25DdHJsLmJpbmQoKTtcclxuICAgIHRoaXMucmVtb3ZlQmxvY2tDdHJsLmJpbmQoKTtcclxuICAgIHRoaXMudG9nZ2xlQmxvY2tDdHJsLmJpbmQoKTtcclxuICAgIHRoaXMuc3BhY2luZ0N0cmwuYmluZCgpO1xyXG4gIH1cclxufVxyXG5cclxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/textInPlace.ts\n\n}");
3773
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiTextBlockComponent: () => (/* binding */ SuiTextBlockComponent),\n/* harmony export */ SuiTextInPlace: () => (/* binding */ SuiTextInPlace)\n/* harmony export */ });\n/* harmony import */ var _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../smo/data/scoreText */ \"./src/smo/data/scoreText.ts\");\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../smo/data/common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _render_sui_textEdit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../render/sui/textEdit */ \"./src/render/sui/textEdit.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.ts\");\n/* harmony import */ var _button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./button */ \"./src/ui/dialogs/components/button.ts\");\n/* harmony import */ var _rocker__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./rocker */ \"./src/ui/dialogs/components/rocker.ts\");\n/* harmony import */ var _dropdown__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dropdown */ \"./src/ui/dialogs/components/dropdown.ts\");\n/* harmony import */ var _render_sui_textRender__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../render/sui/textRender */ \"./src/render/sui/textRender.ts\");\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.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\n\n\n\n\n\n\n/**\n * Edit the text in an SVG element, in the same scale etc. as the text in the score SVG DOM.\n * This component just manages the text editing component of the renderer.\n * @category SuiDialog\n */\nclass SuiTextInPlace extends _baseComponent__WEBPACK_IMPORTED_MODULE_3__.SuiComponentBase {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.editMode = false;\n this.session = null;\n this.scroller = dialog.getView().scroller;\n this.value = new _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup(_smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.defaults);\n this.view = this.dialog.getView();\n const modifier = this.dialog.getModifier();\n if (modifier && _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.isTextGroup(modifier)) {\n this.value = modifier;\n }\n this.staticText = this.dialog.getStaticText();\n this.altLabel = this.staticText.editorLabel;\n }\n show() { }\n hide() { }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_8__.buildDom;\n const id = this.parameterId;\n const r = b('div').classes(this.makeClasses('cbTextInPlace smoControl')).attr('id', this.parameterId).attr('data-param', this.smoName)\n .append(b('button').attr('type', 'checkbox').classes('toggleTextEdit')\n .attr('id', id + '-input').append(b('span').classes('icon icon-pencil'))\n .append(b('label').attr('for', id + '-input').text(this.label)));\n return r;\n }\n endSession() {\n return __awaiter(this, void 0, void 0, function* () {\n $(this._getInputElement()).find('label').text(this.label);\n const button = document.getElementById(this.parameterId);\n $(button).find('span.icon').removeClass('icon-checkmark').addClass('icon-pencil');\n this.value.skipRender = false;\n if (this.session) {\n this.session.textGroup.tryParseUnicode();\n this.value = this.session.textGroup;\n this.session.stopSession();\n }\n $('body').removeClass('text-edit');\n this.handleChanged();\n });\n }\n get isRunning() {\n return this.session && this.session.isRunning;\n }\n getValue() {\n return this.value;\n }\n _getInputElement() {\n var pid = this.parameterId;\n return $(this.dialog.dgDom.element).find('#' + pid).find('button');\n }\n mouseMove(ev) {\n if (this.session && this.session.isRunning) {\n this.session.handleMouseEvent(ev);\n }\n }\n mouseClick(ev) {\n if (this.session && this.session.isRunning) {\n this.session.handleMouseEvent(ev);\n }\n }\n _renderInactiveBlocks() {\n const modifier = this.value;\n const context = this.view.renderer.pageMap.getRendererFromModifier(this.value).getContext();\n context.save();\n context.setFillStyle('#ddd');\n const svgPage = this.view.renderer.pageMap.getRendererFromModifier(this.value);\n modifier.textBlocks.forEach((block) => {\n const st = block.text;\n if (st.attrs.id !== this.value.getActiveBlock().attrs.id && svgPage) {\n const svgText = _render_sui_textRender__WEBPACK_IMPORTED_MODULE_7__.SuiInlineText.fromScoreText(st, svgPage, this.view.renderer.pageMap, this.scroller);\n if (st.logicalBox) {\n svgText.startX += st.logicalBox.x - st.x;\n svgText.startY += (st.y - st.logicalBox.y) - st.logicalBox.height / 2;\n }\n const sgrp = context.openGroup();\n sgrp.classList.add('inactive-text');\n sgrp.classList.add('suiInlineText');\n svgText.render();\n context.closeGroup();\n }\n });\n context.restore();\n }\n startEditSession() {\n $(this._getInputElement()).find('label').text(this.altLabel);\n const modifier = this.value;\n modifier.skipRender = true;\n let pageContext = this.view.renderer.pageMap.getRendererFromModifier(this.value);\n $(pageContext.svg).find('#' + modifier.attrs.id).remove();\n this._renderInactiveBlocks();\n const ul = modifier.ul();\n // this.textElement=$(this.dialog.layout.svg).find('.'+modifier.attrs.id)[0];\n this.session = new _render_sui_textEdit__WEBPACK_IMPORTED_MODULE_2__.SuiTextSession({\n renderer: this.view.renderer,\n scroller: this.scroller,\n x: ul.x,\n y: ul.y,\n textGroup: modifier,\n text: modifier.getActiveBlock().text,\n scoreText: modifier.getActiveBlock()\n });\n $('body').addClass('text-edit');\n this.value = this.session.textGroup;\n const button = document.getElementById(this.parameterId);\n $(button).find('span.icon').removeClass('icon-pencil').addClass('icon-checkmark');\n // Erase the original since we are going to edit it now.\n if (this.value) {\n this.value.elements.forEach((el) => {\n (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_1__.RemoveElementLike)(el);\n });\n this.value.elements = [];\n }\n this.session.startSession();\n // blur the button so key events don't get passed to it.\n $(this._getInputElement()).blur();\n }\n evKey(evdata) {\n if (this.session) {\n this.session.evKey(evdata);\n }\n }\n bind() {\n $(this._getInputElement()).off('click').on('click', () => {\n if (this.session && this.session.isRunning) {\n this.endSession();\n }\n else {\n this.startEditSession();\n }\n });\n }\n}\n/**\n * Dialog to edit an block of text components. Each block can have\n * different font settings and placement.\n * @category SuiDialog\n */\nclass SuiTextBlockComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_3__.SuiComponentParent {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.addBlockCtrl = new _button__WEBPACK_IMPORTED_MODULE_4__.SuiButtonComposite(this.dialog, {\n id: this.id + 'addBlock',\n smoName: 'addBlock',\n parentControl: this,\n icon: 'icon-plus',\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiButtonComponent',\n label: 'Add Text Block'\n });\n this.toggleBlockCtrl = new _button__WEBPACK_IMPORTED_MODULE_4__.SuiButtonComposite(this.dialog, {\n id: this.id + 'toggleBlock',\n smoName: 'toggleBlock',\n parentControl: this,\n icon: 'icon-arrow-right',\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiButtonComponent',\n label: 'Next Block'\n });\n this.removeBlockCtrl = new _button__WEBPACK_IMPORTED_MODULE_4__.SuiButtonComposite(this.dialog, {\n id: this.id + 'removeBlock',\n smoName: 'removeBlock',\n parentControl: this,\n icon: 'icon-minus',\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiButtonComponent',\n label: 'Remove Block'\n });\n this.relativePositionCtrl = new _dropdown__WEBPACK_IMPORTED_MODULE_6__.SuiDropdownComposite(this.dialog, {\n id: this.id + 'relativePosition',\n smoName: 'relativePosition',\n parentControl: this,\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiDropdownComponent',\n label: 'Block Positions',\n options: [{\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.relativePositions.ABOVE,\n label: 'Above'\n }, {\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.relativePositions.BELOW,\n label: 'Below'\n }, {\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.relativePositions.LEFT,\n label: 'Left'\n }, {\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.relativePositions.RIGHT,\n label: 'Right'\n }]\n });\n this.justificationCtrl = new _dropdown__WEBPACK_IMPORTED_MODULE_6__.SuiDropdownComposite(this.dialog, {\n id: this.id + 'justification',\n smoName: 'justification',\n parentControl: this,\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiDropdownComponent',\n label: 'Justification',\n options: [{\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.justifications.LEFT,\n label: 'Left'\n }, {\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.justifications.RIGHT,\n label: 'Right'\n }, {\n value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.justifications.CENTER,\n label: 'Center'\n }]\n });\n this.spacingCtrl = new _rocker__WEBPACK_IMPORTED_MODULE_5__.SuiRockerComposite(this.dialog, {\n id: this.id + 'spacing',\n smoName: 'spacing',\n defaultValue: 0,\n parentControl: this,\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiRockerComponent',\n label: 'Spacing',\n dataType: 'float',\n increment: 0.1\n });\n const mod = this.dialog.getModifier();\n if (mod && _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.isTextGroup(mod)) {\n this.modifier = mod;\n }\n else {\n this.modifier = new _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup(_smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoTextGroup.defaults);\n }\n this.activeScoreText = this.modifier.textBlocks[0].text;\n }\n changed() {\n if (this.addBlockCtrl.changeFlag && this.modifier) {\n const nt = new _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_0__.SmoScoreText(this.activeScoreText);\n this.modifier.addScoreText(nt);\n this.activeScoreText = nt;\n this.modifier.setActiveBlock(nt);\n this._updateMultiiFields();\n }\n if (this.relativePositionCtrl.changeFlag) {\n this.modifier.setRelativePosition(parseInt(this.relativePositionCtrl.getValue().toString(), 10));\n }\n if (this.justificationCtrl.changeFlag) {\n this.modifier.justification = parseInt(this.justificationCtrl.getValue().toString(), 10);\n }\n if (this.removeBlockCtrl.changeFlag) {\n this.modifier.removeBlock(this.activeScoreText);\n this.activeScoreText = this.modifier.firstBlock();\n this._updateMultiiFields();\n }\n if (this.toggleBlockCtrl.changeFlag) {\n const curIx = this.modifier.indexOf(this.activeScoreText);\n const newIx = (curIx + 1) % this.modifier.textBlocks.length;\n this.activeScoreText = this.modifier.textBlocks[newIx].text;\n this.modifier.setActiveBlock(this.activeScoreText);\n }\n if (this.spacingCtrl.changeFlag) {\n const val = this.spacingCtrl.getValue();\n if (val >= 0) {\n this.modifier.spacing = val;\n }\n }\n this.handleChanged();\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_8__.buildDom;\n const q = b('div').classes(this.makeClasses('multiControl smoControl'));\n q.append(this.addBlockCtrl.html);\n q.append(this.removeBlockCtrl.html);\n q.append(this.toggleBlockCtrl.html);\n q.append(this.relativePositionCtrl.html);\n q.append(this.justificationCtrl.html);\n q.append(this.spacingCtrl.html);\n return q;\n }\n _getInputElement() {\n return $(this.dialog.dgDom.element).find('#' + this.parameterId);\n }\n getValue() {\n return {\n activeScoreText: this.activeScoreText,\n modifier: this.modifier\n };\n }\n _updateMultiiFields() {\n const fields = [this.justificationCtrl, this.relativePositionCtrl,\n this.removeBlockCtrl, this.toggleBlockCtrl, this.spacingCtrl];\n fields.forEach((field) => {\n if (this.modifier.textBlocks.length < 2) {\n $('#' + field.parameterId).addClass('hide');\n }\n else {\n $('#' + field.parameterId).removeClass('hide');\n }\n });\n }\n setValue(value) {\n this.activeScoreText = value.activeScoreText;\n this.modifier = value.modifier;\n this.relativePositionCtrl.setValue(this.modifier.relativePosition);\n this._updateMultiiFields();\n this.justificationCtrl.setValue(this.modifier.justification);\n this.spacingCtrl.setValue(this.modifier.spacing);\n }\n bind() {\n this.addBlockCtrl.bind();\n this.relativePositionCtrl.bind();\n this.justificationCtrl.bind();\n this.removeBlockCtrl.bind();\n this.toggleBlockCtrl.bind();\n this.spacingCtrl.bind();\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL3RleHRJblBsYWNlLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQXlFO0FBQ1c7QUFDdEI7QUFHNEI7QUFDNUM7QUFDQTtBQUNJO0FBQ2E7QUFDUjtBQWF2RDs7OztHQUlHO0FBQ0ksTUFBTSxjQUFlLFNBQVEsNERBQWdCO0lBUWxELFlBQVksTUFBeUIsRUFBRSxTQUErQjtRQUNwRSxLQUFLLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBUDNCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFLMUIsWUFBTyxHQUEwQixJQUFJLENBQUM7UUFHcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSw2REFBWSxDQUFDLDZEQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0MsSUFBSSxRQUFRLElBQUksNkRBQVksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUksS0FBSSxDQUFDO0lBQ1QsSUFBSSxLQUFJLENBQUM7SUFFVCxJQUFJLElBQUk7UUFDTixNQUFNLENBQUMsR0FBRyx5REFBUSxDQUFDO1FBQ25CLE1BQU0sRUFBRSxHQUFH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QUksRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztDQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3VpL2RpYWxvZ3MvY29tcG9uZW50cy90ZXh0SW5QbGFjZS50cz9hZGNiIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNtb1Njb3JlVGV4dCwgU21vVGV4dEdyb3VwIH0gZnJvbSAnLi4vLi4vLi4vc21vL2RhdGEvc2NvcmVUZXh0JztcclxuaW1wb3J0IHsgS2V5RXZlbnQsIEVsZW1lbnRMaWtlLCBSZW1vdmVFbGVtZW50TGlrZSB9IGZyb20gJy4uLy4uLy4uL3Ntby9kYXRhL2NvbW1vbic7XHJcbmltcG9ydCB7IFN1aVRleHRTZXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vcmVuZGVyL3N1aS90ZXh0RWRpdCc7XHJcbmltcG9ydCB7IFN1aVNjcm9sbGVyIH0gZnJvbSAnLi4vLi4vLi4vcmVuZGVyL3N1aS9zY3JvbGxlcic7XHJcbmltcG9ydCB7IFN1aVNjb3JlVmlld09wZXJhdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9yZW5kZXIvc3VpL3Njb3JlVmlld09wZXJhdGlvbnMnO1xyXG5pbXBvcnQgeyBTdWlEaWFsb2dOb3RpZmllciwgU3VpQ29tcG9uZW50QmFzZSwgU3VpQ29tcG9uZW50UGFyZW50IH0gZnJvbSAnLi9iYXNlQ29tcG9uZW50JztcclxuaW1wb3J0IHsgU3VpQnV0dG9uQ29tcG9zaXRlIH0gZnJvbSAnLi9idXR0b24nO1xyXG5pbXBvcnQgeyBTdWlSb2NrZXJDb21wb3NpdGUgfSBmcm9tICcuL3JvY2tlcic7XHJcbmltcG9ydCB7IFN1aURyb3Bkb3duQ29tcG9zaXRlIH0gZnJvbSAnLi9kcm9wZG93bic7XHJcbmltcG9ydCB7IFN1aUlubGluZVRleHQgfSBmcm9tICcuLi8uLi8uLi9yZW5kZXIvc3VpL3RleHRSZW5kZXInO1xyXG5pbXBvcnQgeyBidWlsZERvbSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9odG1sSGVscGVycyc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aVRleHRJblBsYWNlUGFyYW1zIHtcclxuICBpZDogc3RyaW5nLFxyXG4gIGNsYXNzZXM6IHN0cmluZyxcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIHNtb05hbWU6IHN0cmluZyxcclxuICBjb250cm9sOiBzdHJpbmdcclxufVxyXG4vKipcclxuICogRWRpdCB0aGUgdGV4dCBpbiBhbiBTVkcgZWxlbWVudCwgaW4gdGhlIHNhbWUgc2NhbGUgZXRjLiBhcyB0aGUgdGV4dCBpbiB0aGUgc2NvcmUgU1ZHIERPTS5cclxuICogVGhpcyBjb21wb25lbnQganVzdCBtYW5hZ2VzIHRoZSB0ZXh0IGVkaXRpbmcgY29tcG9uZW50IG9mIHRoZSByZW5kZXJlci5cclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVRleHRJblBsYWNlIGV4dGVuZHMgU3VpQ29tcG9uZW50QmFzZSB7XHJcbiAgc2Nyb2xsZXI6IFN1aVNjcm9sbGVyO1xyXG4gIGVkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdmFsdWU6IFNtb1RleHRHcm91cDtcclxuICBzdGF0aWNUZXh0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIGFsdExhYmVsOiBzdHJpbmc7XHJcbiAgdmlldzogU3VpU2NvcmVWaWV3T3BlcmF0aW9ucztcclxuICBzZXNzaW9uOiBTdWlUZXh0U2Vzc2lvbiB8IG51bGwgPSBudWxsO1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcjogU3VpVGV4dEluUGxhY2VQYXJhbXMpIHtcclxuICAgIHN1cGVyKGRpYWxvZywgcGFyYW1ldGVyKTtcclxuICAgIHRoaXMuc2Nyb2xsZXIgPSBkaWFsb2cuZ2V0VmlldygpLnNjcm9sbGVyO1xyXG4gICAgdGhpcy52YWx1ZSA9IG5ldyBTbW9UZXh0R3JvdXAoU21vVGV4dEdyb3VwLmRlZmF1bHRzKTtcclxuICAgIHRoaXMudmlldyA9IHRoaXMuZGlhbG9nLmdldFZpZXcoKTtcclxuICAgIGNvbnN0IG1vZGlmaWVyID0gdGhpcy5kaWFsb2cuZ2V0TW9kaWZpZXIoKTtcclxuICAgIGlmIChtb2RpZmllciAmJiBTbW9UZXh0R3JvdXAuaXNUZXh0R3JvdXAobW9kaWZpZXIpKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSBtb2RpZmllcjtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdGljVGV4dCA9IHRoaXMuZGlhbG9nLmdldFN0YXRpY1RleHQoKTtcclxuICAgIHRoaXMuYWx0TGFiZWwgPSB0aGlzLnN0YXRpY1RleHQuZWRpdG9yTGFiZWw7XHJcbiAgfVxyXG4gIHNob3coKSB7fVxyXG4gIGhpZGUoKSB7fVxyXG5cclxuICBnZXQgaHRtbCgpIHtcclxuICAgIGNvbnN0IGIgPSBidWlsZERvbTtcclxuICAgIGNvbnN0IGlkID0gdGhpcy5wYXJhbWV0ZXJJZDtcclxuICAgIGNvbnN0IHIgPSBiKCdkaXYnKS5jbGFzc2VzKHRoaXMubWFrZUNsYXNzZXMoJ2NiVGV4dEluUGxhY2Ugc21vQ29udHJvbCcpKS5hdHRyKCdpZCcsIHRoaXMucGFyYW1ldGVySWQpLmF0dHIoJ2RhdGEtcGFyYW0nLCB0aGlzLnNtb05hbWUpXHJcbiAgICAgIC5hcHBlbmQoYignYnV0dG9uJykuYXR0cigndHlwZScsICdjaGVja2JveCcpLmNsYXNzZXMoJ3RvZ2dsZVRleHRFZGl0JylcclxuICAgICAgICAuYXR0cignaWQnLCBpZCArICctaW5wdXQnKS5hcHBlbmQoXHJcbiAgICAgICAgICBiKCdzcGFuJykuY2xhc3NlcygnaWNvbiBpY29uLXBlbmNpbCcpKVxyXG4gICAgICAgIC5hcHBlbmQoXHJcbiAgICAgICAgICBiKCdsYWJlbCcpLmF0dHIoJ2ZvcicsIGlkICsgJy1pbnB1dCcpLnRleHQodGhpcy5sYWJlbCkpKTtcclxuICAgIHJldHVybiByO1xyXG4gIH1cclxuICBhc3luYyBlbmRTZXNzaW9uKCkge1xyXG4gICAgJCh0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKSkuZmluZCgnbGFiZWwnKS50ZXh0KHRoaXMubGFiZWwpO1xyXG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wYXJhbWV0ZXJJZCk7XHJcbiAgICAkKGJ1dHRvbikuZmluZCgnc3Bhbi5pY29uJykucmVtb3ZlQ2xhc3MoJ2ljb24tY2hlY2ttYXJrJykuYWRkQ2xhc3MoJ2ljb24tcGVuY2lsJyk7XHJcbiAgICB0aGlzLnZhbHVlLnNraXBSZW5kZXIgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5zZXNzaW9uKSB7XHJcbiAgICAgIHRoaXMuc2Vzc2lvbi50ZXh0R3JvdXAudHJ5UGFyc2VVbmljb2RlKCk7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnNlc3Npb24udGV4dEdyb3VwO1xyXG4gICAgICB0aGlzLnNlc3Npb24uc3RvcFNlc3Npb24oKTtcclxuICAgIH1cclxuICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygndGV4dC1lZGl0Jyk7XHJcbiAgICB0aGlzLmhhbmRsZUNoYW5nZWQoKTtcclxuICB9XHJcbiAgZ2V0IGlzUnVubmluZygpIHtcclxuICAgIHJldHVybiB0aGlzLnNlc3Npb24gJiYgdGhpcy5zZXNzaW9uLmlzUnVubmluZztcclxuICB9XHJcbiAgZ2V0VmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICB9XHJcbiAgX2dldElucHV0RWxlbWVudCgpIHtcclxuICAgIHZhciBwaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgcmV0dXJuICQodGhpcy5kaWFsb2cuZGdEb20uZWxlbWVudCkuZmluZCgnIycgKyBwaWQpLmZpbmQoJ2J1dHRvbicpO1xyXG4gIH1cclxuICBtb3VzZU1vdmUoZXY6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuc2Vzc2lvbiAmJiB0aGlzLnNlc3Npb24uaXNSdW5uaW5nKSB7XHJcbiAgICAgIHRoaXMuc2Vzc2lvbi5oYW5kbGVNb3VzZUV2ZW50KGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlQ2xpY2soZXY6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuc2Vzc2lvbiAmJiB0aGlzLnNlc3Npb24uaXNSdW5uaW5nKSB7XHJcbiAgICAgIHRoaXMuc2Vzc2lvbi5oYW5kbGVNb3VzZUV2ZW50KGV2KTtcclxuICAgIH1cclxuICB9XHJcbiAgX3JlbmRlckluYWN0aXZlQmxvY2tzKCkge1xyXG4gICAgY29uc3QgbW9kaWZpZXIgPSB0aGlzLnZhbHVlO1xyXG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMudmlldy5yZW5kZXJlci5wYWdlTWFwLmdldFJlbmRlcmVyRnJvbU1vZGlmaWVyKHRoaXMudmFsdWUpLmdldENvbnRleHQoKTtcclxuICAgIGNvbnRleHQuc2F2ZSgpO1xyXG4gICAgY29udGV4dC5zZXRGaWxsU3R5bGUoJyNkZGQnKTtcclxuICAgIGNvbnN0IHN2Z1BhZ2UgPSB0aGlzLnZpZXcucmVuZGVyZXIucGFnZU1hcC5nZXRSZW5kZXJlckZyb21Nb2RpZmllcih0aGlzLnZhbHVlKTtcclxuICAgIG1vZGlmaWVyLnRleHRCbG9ja3MuZm9yRWFjaCgoYmxvY2spID0+IHtcclxuICAgICAgY29uc3Qgc3QgPSBibG9jay50ZXh0O1xyXG4gICAgICBpZiAoc3QuYXR0cnMuaWQgIT09IHRoaXMudmFsdWUuZ2V0QWN0aXZlQmxvY2soKS5hdHRycy5pZCAmJiBzdmdQYWdlKSB7XHJcbiAgICAgICAgY29uc3Qgc3ZnVGV4dCA9IFN1aUlubGluZVRleHQuZnJvbVNjb3JlVGV4dChzdCwgc3ZnUGFnZSwgdGhpcy52aWV3LnJlbmRlcmVyLnBhZ2VNYXAsIHRoaXMuc2Nyb2xsZXIpO1xyXG4gICAgICAgIGlmIChzdC5sb2dpY2FsQm94KSB7XHJcbiAgICAgICAgICBzdmdUZXh0LnN0YXJ0WCArPSBzdC5sb2dpY2FsQm94LnggLSBzdC54O1xyXG4gICAgICAgICAgc3ZnVGV4dC5zdGFydFkgKz0gKHN0LnkgLSBzdC5sb2dpY2FsQm94LnkpIC0gc3QubG9naWNhbEJveC5oZWlnaHQgLyAyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzZ3JwID0gY29udGV4dC5vcGVuR3JvdXAoKTtcclxuICAgICAgICBzZ3JwLmNsYXNzTGlzdC5hZGQoJ2luYWN0aXZlLXRleHQnKTtcclxuICAgICAgICBzZ3JwLmNsYXNzTGlzdC5hZGQoJ3N1aUlubGluZVRleHQnKTtcclxuICAgICAgICBzdmdUZXh0LnJlbmRlcigpO1xyXG4gICAgICAgIGNvbnRleHQuY2xvc2VHcm91cCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGNvbnRleHQucmVzdG9yZSgpO1xyXG4gIH1cclxuICBzdGFydEVkaXRTZXNzaW9uKCkge1xyXG4gICAgJCh0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKSkuZmluZCgnbGFiZWwnKS50ZXh0KHRoaXMuYWx0TGFiZWwpO1xyXG4gICAgY29uc3QgbW9kaWZpZXIgPSB0aGlzLnZhbHVlO1xyXG4gICAgbW9kaWZpZXIuc2tpcFJlbmRlciA9IHRydWU7XHJcbiAgICBsZXQgcGFnZUNvbnRleHQgPSB0aGlzLnZpZXcucmVuZGVyZXIucGFnZU1hcC5nZXRSZW5kZXJlckZyb21Nb2RpZmllcih0aGlzLnZhbHVlKTtcclxuICAgICQocGFnZUNvbnRleHQuc3ZnKS5maW5kKCcjJyArIG1vZGlmaWVyLmF0dHJzLmlkKS5yZW1vdmUoKTtcclxuICAgIHRoaXMuX3JlbmRlckluYWN0aXZlQmxvY2tzKCk7XHJcbiAgICBjb25zdCB1bCA9IG1vZGlmaWVyLnVsKCk7XHJcblxyXG4gICAgLy8gdGhpcy50ZXh0RWxlbWVudD0kKHRoaXMuZGlhbG9nLmxheW91dC5zdmcpLmZpbmQoJy4nK21vZGlmaWVyLmF0dHJzLmlkKVswXTtcclxuICAgIHRoaXMuc2Vzc2lvbiA9IG5ldyBTdWlUZXh0U2Vzc2lvbih7XHJcbiAgICAgIHJlbmRlcmVyOiB0aGlzLnZpZXcucmVuZGVyZXIsXHJcbiAgICAgIHNjcm9sbGVyOiB0aGlzLnNjcm9sbGVyLFxyXG4gICAgICB4OiB1bC54LFxyXG4gICAgICB5OiB1bC55LFxyXG4gICAgICB0ZXh0R3JvdXA6IG1vZGlmaWVyLFxyXG4gICAgICB0ZXh0OiBtb2RpZmllci5nZXRBY3RpdmVCbG9jaygpLnRleHQsXHJcbiAgICAgIHNjb3JlVGV4dDogbW9kaWZpZXIuZ2V0QWN0aXZlQmxvY2soKVxyXG4gICAgfSk7XHJcbiAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ3RleHQtZWRpdCcpO1xyXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuc2Vzc2lvbi50ZXh0R3JvdXA7XHJcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBhcmFtZXRlcklkKTtcclxuICAgICQoYnV0dG9uKS5maW5kKCdzcGFuLmljb24nKS5yZW1vdmVDbGFzcygnaWNvbi1wZW5jaWwnKS5hZGRDbGFzcygnaWNvbi1jaGVja21hcmsnKTtcclxuICAgIC8vIEVyYXNlIHRoZSBvcmlnaW5hbCBzaW5jZSB3ZSBhcmUgZ29pbmcgdG8gZWRpdCBpdCBub3cuXHJcbiAgICBpZiAodGhpcy52YWx1ZSkge1xyXG4gICAgICB0aGlzLnZhbHVlLmVsZW1lbnRzLmZvckVhY2goKGVsOiBFbGVtZW50TGlrZSkgPT4ge1xyXG4gICAgICAgIFJlbW92ZUVsZW1lbnRMaWtlKGVsKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudmFsdWUuZWxlbWVudHMgPSBbXTtcclxuICAgIH1cclxuICAgIHRoaXMuc2Vzc2lvbi5zdGFydFNlc3Npb24oKTtcclxuICAgIC8vIGJsdXIgdGhlIGJ1dHRvbiBzbyBrZXkgZXZlbnRzIGRvbid0IGdldCBwYXNzZWQgdG8gaXQuXHJcbiAgICAkKHRoaXMuX2dldElucHV0RWxlbWVudCgpKS5ibHVyKCk7XHJcbiAgfVxyXG4gIGV2S2V5KGV2ZGF0YTogS2V5RXZlbnQpIHtcclxuICAgIGlmICh0aGlzLnNlc3Npb24pIHtcclxuICAgICAgdGhpcy5zZXNzaW9uLmV2S2V5KGV2ZGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGJpbmQoKSB7XHJcbiAgICAkKHRoaXMuX2dldElucHV0RWxlbWVudCgpKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5zZXNzaW9uICYmIHRoaXMuc2Vzc2lvbi5pc1J1bm5pbmcpIHtcclxuICAgICAgICB0aGlzLmVuZFNlc3Npb24oKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0YXJ0RWRpdFNlc3Npb24oKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aVRleHRCbG9ja0NvbXBvbmVudFBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nXHJcbn1cclxuLyoqXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3VpVGV4dEJsb2NrVmFsdWUge1xyXG4gIG1vZGlmaWVyOiBTbW9UZXh0R3JvdXAsXHJcbiAgYWN0aXZlU2NvcmVUZXh0OiBTbW9TY29yZVRleHRcclxufVxyXG4vKipcclxuICogRGlhbG9nIHRvIGVkaXQgYW4gYmxvY2sgb2YgdGV4dCBjb21wb25lbnRzLiAgRWFjaCBibG9jayBjYW4gaGF2ZSBcclxuICogZGlmZmVyZW50IGZvbnQgc2V0dGluZ3MgYW5kIHBsYWNlbWVudC5cclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVRleHRCbG9ja0NvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudFBhcmVudCB7XHJcbiAgYWRkQmxvY2tDdHJsOiBTdWlCdXR0b25Db21wb3NpdGU7XHJcbiAgdG9nZ2xlQmxvY2tDdHJsOiBTdWlCdXR0b25Db21wb3NpdGU7XHJcbiAgcmVtb3ZlQmxvY2tDdHJsOiBTdWlCdXR0b25Db21wb3NpdGU7XHJcbiAgcmVsYXRpdmVQb3NpdGlvbkN0cmw6IFN1aURyb3Bkb3duQ29tcG9zaXRlO1xyXG4gIGp1c3RpZmljYXRpb25DdHJsOiBTdWlEcm9wZG93bkNvbXBvc2l0ZTtcclxuICBzcGFjaW5nQ3RybDogU3VpUm9ja2VyQ29tcG9zaXRlO1xyXG4gIG1vZGlmaWVyOiBTbW9UZXh0R3JvdXA7XHJcbiAgYWN0aXZlU2NvcmVUZXh0OiBTbW9TY29yZVRleHQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcjogU3VpVGV4dEJsb2NrQ29tcG9uZW50UGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcik7XHJcbiAgICB0aGlzLmFkZEJsb2NrQ3RybCA9IG5ldyBTdWlCdXR0b25Db21wb3NpdGUodGhpcy5kaWFsb2csXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogdGhpcy5pZCArICdhZGRCbG9jaycsXHJcbiAgICAgICAgc21vTmFtZTogJ2FkZEJsb2NrJyxcclxuICAgICAgICBwYXJlbnRDb250cm9sOiB0aGlzLFxyXG4gICAgICAgIGljb246ICdpY29uLXBsdXMnLFxyXG4gICAgICAgIGNsYXNzZXM6ICdoaWRlLXdoZW4tZWRpdGluZyBoaWRlLXdoZW4tbW92aW5nJyxcclxuICAgICAgICBjb250cm9sOiAnU3VpQnV0dG9uQ29tcG9uZW50JyxcclxuICAgICAgICBsYWJlbDogJ0FkZCBUZXh0IEJsb2NrJ1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnRvZ2dsZUJsb2NrQ3RybCA9IG5ldyBTdWlCdXR0b25Db21wb3NpdGUodGhpcy5kaWFsb2csXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogdGhpcy5pZCArICd0b2dnbGVCbG9jaycsXHJcbiAgICAgICAgc21vTmFtZTogJ3RvZ2dsZUJsb2NrJyxcclxuICAgICAgICBwYXJlbnRDb250cm9sOiB0aGlzLFxyXG4gICAgICAgIGljb246ICdpY29uLWFycm93LXJpZ2h0JyxcclxuICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aUJ1dHRvbkNvbXBvbmVudCcsXHJcbiAgICAgICAgbGFiZWw6ICdOZXh0IEJsb2NrJ1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnJlbW92ZUJsb2NrQ3RybCA9IG5ldyBTdWlCdXR0b25Db21wb3NpdGUodGhpcy5kaWFsb2csXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogdGhpcy5pZCArICdyZW1vdmVCbG9jaycsXHJcbiAgICAgICAgc21vTmFtZTogJ3JlbW92ZUJsb2NrJyxcclxuICAgICAgICBwYXJlbnRDb250cm9sOiB0aGlzLFxyXG4gICAgICAgIGljb246ICdpY29uLW1pbnVzJyxcclxuICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aUJ1dHRvbkNvbXBvbmVudCcsXHJcbiAgICAgICAgbGFiZWw6ICdSZW1vdmUgQmxvY2snXHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5yZWxhdGl2ZVBvc2l0aW9uQ3RybCA9IG5ldyBTdWlEcm9wZG93bkNvbXBvc2l0ZShcclxuICAgICAgdGhpcy5kaWFsb2csXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogdGhpcy5pZCArICdyZWxhdGl2ZVBvc2l0aW9uJyxcclxuICAgICAgICBzbW9OYW1lOiAncmVsYXRpdmVQb3NpdGlvbicsXHJcbiAgICAgICAgcGFyZW50Q29udHJvbDogdGhpcyxcclxuICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aURyb3Bkb3duQ29tcG9uZW50JyxcclxuICAgICAgICBsYWJlbDogJ0Jsb2NrIFBvc2l0aW9ucycsXHJcbiAgICAgICAgb3B0aW9uczogW3tcclxuICAgICAgICAgIHZhbHVlOiBTbW9UZXh0R3JvdXAucmVsYXRpdmVQb3NpdGlvbnMuQUJPVkUsXHJcbiAgICAgICAgICBsYWJlbDogJ0Fib3ZlJ1xyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHZhbHVlOiBTbW9UZXh0R3JvdXAucmVsYXRpdmVQb3NpdGlvbnMuQkVMT1csXHJcbiAgICAgICAgICBsYWJlbDogJ0JlbG93J1xyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHZhbHVlOiBTbW9UZXh0R3JvdXAucmVsYXRpdmVQb3NpdGlvbnMuTEVGVCxcclxuICAgICAgICAgIGxhYmVsOiAnTGVmdCdcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICB2YWx1ZTogU21vVGV4dEdyb3VwLnJlbGF0aXZlUG9zaXRpb25zLlJJR0hULFxyXG4gICAgICAgICAgbGFiZWw6ICdSaWdodCdcclxuICAgICAgICB9XVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgdGhpcy5qdXN0aWZpY2F0aW9uQ3RybCA9IG5ldyBTdWlEcm9wZG93bkNvbXBvc2l0ZShcclxuICAgICAgdGhpcy5kaWFsb2csXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogdGhpcy5pZCArICdqdXN0aWZpY2F0aW9uJyxcclxuICAgICAgICBzbW9OYW1lOiAnanVzdGlmaWNhdGlvbicsXHJcbiAgICAgICAgcGFyZW50Q29udHJvbDogdGhpcyxcclxuICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aURyb3Bkb3duQ29tcG9uZW50JyxcclxuICAgICAgICBsYWJlbDogJ0p1c3RpZmljYXRpb24nLFxyXG4gICAgICAgIG9wdGlvbnM6IFt7XHJcbiAgICAgICAgICB2YWx1ZTogU21vVGV4dEdyb3VwLmp1c3RpZmljYXRpb25zLkxFRlQsXHJcbiAgICAgICAgICBsYWJlbDogJ0xlZnQnXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdmFsdWU6IFNtb1RleHRHcm91cC5qdXN0aWZpY2F0aW9ucy5SSUdIVCxcclxuICAgICAgICAgIGxhYmVsOiAnUmlnaHQnXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgdmFsdWU6IFNtb1RleHRHcm91cC5qdXN0aWZpY2F0aW9ucy5DRU5URVIsXHJcbiAgICAgICAgICBsYWJlbDogJ0NlbnRlcidcclxuICAgICAgICB9XVxyXG4gICAgICB9KTtcclxuICAgIHRoaXMuc3BhY2luZ0N0cmwgPSBuZXcgU3VpUm9ja2VyQ29tcG9zaXRlKFxyXG4gICAgICB0aGlzLmRpYWxvZyxcclxuICAgICAge1xyXG4gICAgICAgIGlkOiB0aGlzLmlkICsgJ3NwYWNpbmcnLFxyXG4gICAgICAgIHNtb05hbWU6ICdzcGFjaW5nJyxcclxuICAgICAgICBkZWZhdWx0VmFsdWU6IDAsXHJcbiAgICAgICAgcGFyZW50Q29udHJvbDogdGhpcyxcclxuICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgY29udHJvbDogJ1N1aVJvY2tlckNvbXBvbmVudCcsXHJcbiAgICAgICAgbGFiZWw6ICdTcGFjaW5nJyxcclxuICAgICAgICBkYXRhVHlwZTogJ2Zsb2F0JyxcclxuICAgICAgICBpbmNyZW1lbnQ6IDAuMVxyXG4gICAgICB9LFxyXG4gICAgKTtcclxuICAgIGNvbnN0IG1vZCA9IHRoaXMuZGlhbG9nLmdldE1vZGlmaWVyKCk7XHJcbiAgICBpZiAobW9kICYmIFNtb1RleHRHcm91cC5pc1RleHRHcm91cChtb2QpKSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXIgPSBtb2Q7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1vZGlmaWVyID0gbmV3IFNtb1RleHRHcm91cChTbW9UZXh0R3JvdXAuZGVmYXVsdHMpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hY3RpdmVTY29yZVRleHQgPSB0aGlzLm1vZGlmaWVyLnRleHRCbG9ja3NbMF0udGV4dDtcclxuICB9XHJcbiAgY2hhbmdlZCgpIHtcclxuICAgIGlmICh0aGlzLmFkZEJsb2NrQ3RybC5jaGFuZ2VGbGFnICYmIHRoaXMubW9kaWZpZXIpIHtcclxuICAgICAgY29uc3QgbnQgPSBuZXcgU21vU2NvcmVUZXh0KHRoaXMuYWN0aXZlU2NvcmVUZXh0KTtcclxuICAgICAgdGhpcy5tb2RpZmllci5hZGRTY29yZVRleHQobnQpO1xyXG4gICAgICB0aGlzLmFjdGl2ZVNjb3JlVGV4dCA9IG50O1xyXG4gICAgICB0aGlzLm1vZGlmaWVyLnNldEFjdGl2ZUJsb2NrKG50KTtcclxuICAgICAgdGhpcy5fdXBkYXRlTXVsdGlpRmllbGRzKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5yZWxhdGl2ZVBvc2l0aW9uQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXIuc2V0UmVsYXRpdmVQb3NpdGlvbihwYXJzZUludCh0aGlzLnJlbGF0aXZlUG9zaXRpb25DdHJsLmdldFZhbHVlKCkudG9TdHJpbmcoKSwgMTApKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmp1c3RpZmljYXRpb25DdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgdGhpcy5tb2RpZmllci5qdXN0aWZpY2F0aW9uID0gcGFyc2VJbnQodGhpcy5qdXN0aWZpY2F0aW9uQ3RybC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCksIDEwKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnJlbW92ZUJsb2NrQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXIucmVtb3ZlQmxvY2sodGhpcy5hY3RpdmVTY29yZVRleHQpO1xyXG4gICAgICB0aGlzLmFjdGl2ZVNjb3JlVGV4dCA9IHRoaXMubW9kaWZpZXIuZmlyc3RCbG9jaygpO1xyXG4gICAgICB0aGlzLl91cGRhdGVNdWx0aWlGaWVsZHMoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRvZ2dsZUJsb2NrQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIGNvbnN0IGN1ckl4ID0gdGhpcy5tb2RpZmllci5pbmRleE9mKHRoaXMuYWN0aXZlU2NvcmVUZXh0KTtcclxuICAgICAgY29uc3QgbmV3SXggPSAoY3VySXggKyAxKSAlIHRoaXMubW9kaWZpZXIudGV4dEJsb2Nrcy5sZW5ndGg7XHJcbiAgICAgIHRoaXMuYWN0aXZlU2NvcmVUZXh0ID0gdGhpcy5tb2RpZmllci50ZXh0QmxvY2tzW25ld0l4XS50ZXh0O1xyXG4gICAgICB0aGlzLm1vZGlmaWVyLnNldEFjdGl2ZUJsb2NrKHRoaXMuYWN0aXZlU2NvcmVUZXh0KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNwYWNpbmdDdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgY29uc3QgdmFsID0gdGhpcy5zcGFjaW5nQ3RybC5nZXRWYWx1ZSgpO1xyXG4gICAgICBpZiAodmFsID49IDApIHtcclxuICAgICAgICB0aGlzLm1vZGlmaWVyLnNwYWNpbmcgPSB2YWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuaGFuZGxlQ2hhbmdlZCgpO1xyXG4gIH1cclxuICBnZXQgaHRtbCgpIHtcclxuICAgIGNvbnN0IGIgPSBidWlsZERvbTtcclxuICAgIGNvbnN0IHEgPSBiKCdkaXYnKS5jbGFzc2VzKHRoaXMubWFrZUNsYXNzZXMoJ211bHRpQ29udHJvbCBzbW9Db250cm9sJykpO1xyXG4gICAgcS5hcHBlbmQodGhpcy5hZGRCbG9ja0N0cmwuaHRtbCk7XHJcbiAgICBxLmFwcGVuZCh0aGlzLnJlbW92ZUJsb2NrQ3RybC5odG1sKTtcclxuICAgIHEuYXBwZW5kKHRoaXMudG9nZ2xlQmxvY2tDdHJsLmh0bWwpO1xyXG4gICAgcS5hcHBlbmQodGhpcy5yZWxhdGl2ZVBvc2l0aW9uQ3RybC5odG1sKTtcclxuICAgIHEuYXBwZW5kKHRoaXMuanVzdGlmaWNhdGlvbkN0cmwuaHRtbCk7XHJcbiAgICBxLmFwcGVuZCh0aGlzLnNwYWNpbmdDdHJsLmh0bWwpO1xyXG5cclxuICAgIHJldHVybiBxO1xyXG4gIH1cclxuXHJcbiAgX2dldElucHV0RWxlbWVudCgpIHtcclxuICAgIHJldHVybiAkKHRoaXMuZGlhbG9nLmRnRG9tLmVsZW1lbnQpLmZpbmQoJyMnICsgdGhpcy5wYXJhbWV0ZXJJZCk7XHJcbiAgfVxyXG4gIGdldFZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWN0aXZlU2NvcmVUZXh0OiB0aGlzLmFjdGl2ZVNjb3JlVGV4dCxcclxuICAgICAgbW9kaWZpZXI6IHRoaXMubW9kaWZpZXJcclxuICAgIH07XHJcbiAgfVxyXG4gIF91cGRhdGVNdWx0aWlGaWVsZHMoKSB7XHJcbiAgICBjb25zdCBmaWVsZHMgPSBbdGhpcy5qdXN0aWZpY2F0aW9uQ3RybCwgdGhpcy5yZWxhdGl2ZVBvc2l0aW9uQ3RybCxcclxuICAgICAgdGhpcy5yZW1vdmVCbG9ja0N0cmwsIHRoaXMudG9nZ2xlQmxvY2tDdHJsLCB0aGlzLnNwYWNpbmdDdHJsXTtcclxuICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5tb2RpZmllci50ZXh0QmxvY2tzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgICAkKCcjJyArIGZpZWxkLnBhcmFtZXRlcklkKS5hZGRDbGFzcygnaGlkZScpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICQoJyMnICsgZmllbGQucGFyYW1ldGVySWQpLnJlbW92ZUNsYXNzKCdoaWRlJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBzZXRWYWx1ZSh2YWx1ZTogU3VpVGV4dEJsb2NrVmFsdWUpIHtcclxuICAgIHRoaXMuYWN0aXZlU2NvcmVUZXh0ID0gdmFsdWUuYWN0aXZlU2NvcmVUZXh0O1xyXG4gICAgdGhpcy5tb2RpZmllciA9IHZhbHVlLm1vZGlmaWVyO1xyXG4gICAgdGhpcy5yZWxhdGl2ZVBvc2l0aW9uQ3RybC5zZXRWYWx1ZSh0aGlzLm1vZGlmaWVyLnJlbGF0aXZlUG9zaXRpb24pO1xyXG4gICAgdGhpcy5fdXBkYXRlTXVsdGlpRmllbGRzKCk7XHJcbiAgICB0aGlzLmp1c3RpZmljYXRpb25DdHJsLnNldFZhbHVlKHRoaXMubW9kaWZpZXIuanVzdGlmaWNhdGlvbik7XHJcbiAgICB0aGlzLnNwYWNpbmdDdHJsLnNldFZhbHVlKHRoaXMubW9kaWZpZXIuc3BhY2luZyk7XHJcbiAgfVxyXG5cclxuICBiaW5kKCkge1xyXG4gICAgdGhpcy5hZGRCbG9ja0N0cmwuYmluZCgpO1xyXG4gICAgdGhpcy5yZWxhdGl2ZVBvc2l0aW9uQ3RybC5iaW5kKCk7XHJcbiAgICB0aGlzLmp1c3RpZmljYXRpb25DdHJsLmJpbmQoKTtcclxuICAgIHRoaXMucmVtb3ZlQmxvY2tDdHJsLmJpbmQoKTtcclxuICAgIHRoaXMudG9nZ2xlQmxvY2tDdHJsLmJpbmQoKTtcclxuICAgIHRoaXMuc3BhY2luZ0N0cmwuYmluZCgpO1xyXG4gIH1cclxufVxyXG5cclxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/textInPlace.ts\n\n}");
3774
3774
 
3775
3775
  /***/ },
3776
3776
 
@@ -3781,7 +3781,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
3781
3781
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3782
3782
 
3783
3783
  "use strict";
3784
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiReadOnlyTextComponent: () => (/* binding */ SuiReadOnlyTextComponent),\n/* harmony export */ SuiTextInputComponent: () => (/* binding */ SuiTextInputComponent),\n/* harmony export */ SuiTextInputComposite: () => (/* binding */ SuiTextInputComposite)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.ts\");\n\n\n/**\n * Simple text input, like for a filename. Not the text editing component.\n * @category SuiDialog\n */\nclass SuiTextInputComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_1__.SuiComponentBase {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.defaultValue = '';\n this.value = '';\n this.dialog = dialog;\n this.value = '';\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const id = this.parameterId;\n const r = b('div').classes(this.makeClasses('text-input smoControl')).attr('id', this.parameterId).attr('data-param', this.smoName)\n .append(b('input').attr('type', 'text').classes('file-name')\n .attr('id', id + '-input')).append(b('label').attr('for', id + '-input').text(this.label));\n return r;\n }\n getValue() {\n return this.value;\n }\n setValue(val) {\n this.value = val;\n $('#' + this.parameterId).find('input').val(val);\n }\n _getInputElement() {\n const pid = this.parameterId;\n return $(this.dialog.dgDom.element).find('#' + pid).find('input');\n }\n bind() {\n const self = this;\n $('#' + this.parameterId).find('input').off('change').on('change', () => {\n self.value = $(this._getInputElement()).val();\n self.handleChanged();\n });\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiTextInputComposite extends SuiTextInputComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n this.changeFlag = true;\n this.parentControl.changed();\n this.changeFlag = false;\n }\n}\n/**\n * A static text message that appears in the dialog\n * @category SuiDialog\n */\nclass SuiReadOnlyTextComponent extends SuiTextInputComponent {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.noProperty = true;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL3RleHRJbnB1dC50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUF1RDtBQUNtQztBQWlCMUY7OztHQUdHO0FBQ0ksTUFBTSxxQkFBc0IsU0FBUSw0REFBZ0I7SUFHekQsWUFBWSxNQUF5QixFQUFFLFNBQXNDO1FBQzNFLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFIM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUlqQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ04sTUFBTSxDQUFDLEdBQUcseURBQVEsQ0FBQztRQUNuQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQ2hJLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3pELElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUNsQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUNELFFBQVEsQ0FBQyxHQUFXO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELGdCQUFnQjtRQUNkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDN0IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELElBQUk7UUFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUN0RSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWVEOztHQUVHO0FBQ0ksTUFBTSxxQkFBc0IsU0FBUSxxQkFBcUI7SUFFOUQsWUFBWSxNQUF5QixFQUFFLFVBQXVDO1FBQzVFLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ2hELENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFDRDs7O0dBR0c7QUFDSSxNQUFNLHdCQUF5QixTQUFRLHFCQUFxQjtJQUNqRSxZQUFZLE1BQXlCLEVBQUUsU0FBc0M7UUFDM0UsS0FBSyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0NBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL3RleHRJbnB1dC50cz81Yjc4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJ1aWxkRG9tIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2h0bWxIZWxwZXJzJztcclxuaW1wb3J0IHsgU3VpQ29tcG9uZW50QmFzZSwgU3VpRGlhbG9nTm90aWZpZXIsIFN1aUNvbXBvbmVudFBhcmVudCB9IGZyb20gJy4vYmFzZUNvbXBvbmVudCc7XHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBwYXJhbWV0ZXJzIGZvciB0ZXh0IGlucHV0IGNvbXBvbmVudCAoc2ltcGxlIHRleHQgZW50cnksIG5vdCBTVkcgdGV4dClcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlUZXh0SW5wdXRDb21wb25lbnRQYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIHR5cGU/OiBzdHJpbmcsXHJcbiAgaW5jcmVtZW50PzogbnVtYmVyLFxyXG4gIGRlZmF1bHRWYWx1ZTogc3RyaW5nLFxyXG4gIGxhYmVsOiBzdHJpbmcsXHJcbiAgc21vTmFtZTogc3RyaW5nLFxyXG4gIGNvbnRyb2w6IHN0cmluZ1xyXG59XHJcbi8qKlxyXG4gKiBTaW1wbGUgdGV4dCBpbnB1dCwgbGlrZSBmb3IgYSBmaWxlbmFtZS4gIE5vdCB0aGUgdGV4dCBlZGl0aW5nIGNvbXBvbmVudC5cclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVRleHRJbnB1dENvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudEJhc2Uge1xyXG4gIGRlZmF1bHRWYWx1ZTogc3RyaW5nID0gJyc7XHJcbiAgdmFsdWU6IHN0cmluZyA9ICcnO1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcjogU3VpVGV4dElucHV0Q29tcG9uZW50UGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcik7XHJcblxyXG4gICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7XHJcbiAgICB0aGlzLnZhbHVlID0gJyc7XHJcbiAgfVxyXG4gIGdldCBodG1sKCkge1xyXG4gICAgY29uc3QgYiA9IGJ1aWxkRG9tO1xyXG4gICAgY29uc3QgaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgY29uc3QgciA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3NlcygndGV4dC1pbnB1dCBzbW9Db250cm9sJykpLmF0dHIoJ2lkJywgdGhpcy5wYXJhbWV0ZXJJZCkuYXR0cignZGF0YS1wYXJhbScsIHRoaXMuc21vTmFtZSlcclxuICAgICAgLmFwcGVuZChiKCdpbnB1dCcpLmF0dHIoJ3R5cGUnLCAndGV4dCcpLmNsYXNzZXMoJ2ZpbGUtbmFtZScpXHJcbiAgICAgICAgLmF0dHIoJ2lkJywgaWQgKyAnLWlucHV0JykpLmFwcGVuZChcclxuICAgICAgICBiKCdsYWJlbCcpLmF0dHIoJ2ZvcicsIGlkICsgJy1pbnB1dCcpLnRleHQodGhpcy5sYWJlbCkpO1xyXG4gICAgcmV0dXJuIHI7XHJcbiAgfVxyXG5cclxuICBnZXRWYWx1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gIH1cclxuICBzZXRWYWx1ZSh2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcclxuICAgICQoJyMnICsgdGhpcy5wYXJhbWV0ZXJJZCkuZmluZCgnaW5wdXQnKS52YWwodmFsKTtcclxuICB9XHJcbiAgX2dldElucHV0RWxlbWVudCgpIHtcclxuICAgIGNvbnN0IHBpZCA9IHRoaXMucGFyYW1ldGVySWQ7XHJcbiAgICByZXR1cm4gJCh0aGlzLmRpYWxvZy5kZ0RvbS5lbGVtZW50KS5maW5kKCcjJyArIHBpZCkuZmluZCgnaW5wdXQnKTtcclxuICB9XHJcbiAgYmluZCgpIHtcclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgJCgnIycgKyB0aGlzLnBhcmFtZXRlcklkKS5maW5kKCdpbnB1dCcpLm9mZignY2hhbmdlJykub24oJ2NoYW5nZScsICgpID0+IHtcclxuICAgICAgc2VsZi52YWx1ZSA9ICQodGhpcy5fZ2V0SW5wdXRFbGVtZW50KCkpLnZhbCgpO1xyXG4gICAgICBzZWxmLmhhbmRsZUNoYW5nZWQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlUZXh0SW5wdXRDb21wb3NpdGVQYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIHR5cGU/OiBzdHJpbmcsXHJcbiAgaW5jcmVtZW50PzogbnVtYmVyLFxyXG4gIGRlZmF1bHRWYWx1ZTogc3RyaW5nLFxyXG4gIGxhYmVsOiBzdHJpbmcsXHJcbiAgc21vTmFtZTogc3RyaW5nLFxyXG4gIGNvbnRyb2w6IHN0cmluZ1xyXG4gIHBhcmVudENvbnRyb2w6IFN1aUNvbXBvbmVudFBhcmVudFxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpVGV4dElucHV0Q29tcG9zaXRlIGV4dGVuZHMgU3VpVGV4dElucHV0Q29tcG9uZW50IHtcclxuICBwYXJlbnRDb250cm9sOiBTdWlDb21wb25lbnRQYXJlbnQ7XHJcbiAgY29uc3RydWN0b3IoZGlhbG9nOiBTdWlEaWFsb2dOb3RpZmllciwgcGFyYW1ldGVyczogU3VpVGV4dElucHV0Q29tcG9zaXRlUGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcnMpO1xyXG4gICAgdGhpcy5wYXJlbnRDb250cm9sID0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2hhbmdlZCgpIHtcclxuICAgIHRoaXMuY2hhbmdlRmxhZyA9IHRydWU7XHJcbiAgICB0aGlzLnBhcmVudENvbnRyb2wuY2hhbmdlZCgpO1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gZmFsc2U7XHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBBIHN0YXRpYyB0ZXh0IG1lc3NhZ2UgdGhhdCBhcHBlYXJzIGluIHRoZSBkaWFsb2dcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVJlYWRPbmx5VGV4dENvbXBvbmVudCBleHRlbmRzIFN1aVRleHRJbnB1dENvbXBvbmVudCB7XHJcbiAgY29uc3RydWN0b3IoZGlhbG9nOiBTdWlEaWFsb2dOb3RpZmllciwgcGFyYW1ldGVyOiBTdWlUZXh0SW5wdXRDb21wb25lbnRQYXJhbXMpIHtcclxuICAgIHN1cGVyKGRpYWxvZywgcGFyYW1ldGVyKTtcclxuICAgIHRoaXMubm9Qcm9wZXJ0eSA9IHRydWU7XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/textInput.ts\n\n}");
3784
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiReadOnlyTextComponent: () => (/* binding */ SuiReadOnlyTextComponent),\n/* harmony export */ SuiTextInputComponent: () => (/* binding */ SuiTextInputComponent),\n/* harmony export */ SuiTextInputComposite: () => (/* binding */ SuiTextInputComposite)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.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/**\n * Simple text input, like for a filename. Not the text editing component.\n * @category SuiDialog\n */\nclass SuiTextInputComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_1__.SuiComponentBase {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.defaultValue = '';\n this.value = '';\n this.dialog = dialog;\n this.value = '';\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const id = this.parameterId;\n const r = b('div').classes(this.makeClasses('text-input smoControl')).attr('id', this.parameterId).attr('data-param', this.smoName)\n .append(b('input').attr('type', 'text').classes('file-name')\n .attr('id', id + '-input')).append(b('label').attr('for', id + '-input').text(this.label));\n return r;\n }\n getValue() {\n return this.value;\n }\n setValue(val) {\n this.value = val;\n $('#' + this.parameterId).find('input').val(val);\n }\n _getInputElement() {\n const pid = this.parameterId;\n return $(this.dialog.dgDom.element).find('#' + pid).find('input');\n }\n bind() {\n const self = this;\n $('#' + this.parameterId).find('input').off('change').on('change', () => {\n self.value = $(this._getInputElement()).val();\n self.handleChanged();\n });\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiTextInputComposite extends SuiTextInputComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n return __awaiter(this, void 0, void 0, function* () {\n this.changeFlag = true;\n yield this.parentControl.changed();\n this.changeFlag = false;\n });\n }\n}\n/**\n * A static text message that appears in the dialog\n * @category SuiDialog\n */\nclass SuiReadOnlyTextComponent extends SuiTextInputComponent {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.noProperty = true;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL3RleHRJbnB1dC50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUF1RDtBQUNtQztBQWlCMUY7OztHQUdHO0FBQ0ksTUFBTSxxQkFBc0IsU0FBUSw0REFBZ0I7SUFHekQsWUFBWSxNQUF5QixFQUFFLFNBQXNDO1FBQzNFLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFIM0IsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDMUIsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUlqQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ04sTUFBTSxDQUFDLEdBQUcseURBQVEsQ0FBQztRQUNuQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQ2hJLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3pELElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUNsQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUNELFFBQVEsQ0FBQyxHQUFXO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELGdCQUFnQjtRQUNkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDN0IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELElBQUk7UUFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUN0RSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWVEOztHQUVHO0FBQ0ksTUFBTSxxQkFBc0IsU0FBUSxxQkFBcUI7SUFFOUQsWUFBWSxNQUF5QixFQUFFLFVBQXVDO1FBQzVFLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ2hELENBQUM7SUFFSyxhQUFhOztZQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN2QixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDMUIsQ0FBQztLQUFBO0NBQ0Y7QUFDRDs7O0dBR0c7QUFDSSxNQUFNLHdCQUF5QixTQUFRLHFCQUFxQjtJQUNqRSxZQUFZLE1BQXlCLEVBQUUsU0FBc0M7UUFDM0UsS0FBSyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0NBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvdWkvZGlhbG9ncy9jb21wb25lbnRzL3RleHRJbnB1dC50cz81Yjc4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJ1aWxkRG9tIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2h0bWxIZWxwZXJzJztcclxuaW1wb3J0IHsgU3VpQ29tcG9uZW50QmFzZSwgU3VpRGlhbG9nTm90aWZpZXIsIFN1aUNvbXBvbmVudFBhcmVudCB9IGZyb20gJy4vYmFzZUNvbXBvbmVudCc7XHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbi8qKlxyXG4gKiBwYXJhbWV0ZXJzIGZvciB0ZXh0IGlucHV0IGNvbXBvbmVudCAoc2ltcGxlIHRleHQgZW50cnksIG5vdCBTVkcgdGV4dClcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlUZXh0SW5wdXRDb21wb25lbnRQYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIHR5cGU/OiBzdHJpbmcsXHJcbiAgaW5jcmVtZW50PzogbnVtYmVyLFxyXG4gIGRlZmF1bHRWYWx1ZTogc3RyaW5nLFxyXG4gIGxhYmVsOiBzdHJpbmcsXHJcbiAgc21vTmFtZTogc3RyaW5nLFxyXG4gIGNvbnRyb2w6IHN0cmluZ1xyXG59XHJcbi8qKlxyXG4gKiBTaW1wbGUgdGV4dCBpbnB1dCwgbGlrZSBmb3IgYSBmaWxlbmFtZS4gIE5vdCB0aGUgdGV4dCBlZGl0aW5nIGNvbXBvbmVudC5cclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVRleHRJbnB1dENvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudEJhc2Uge1xyXG4gIGRlZmF1bHRWYWx1ZTogc3RyaW5nID0gJyc7XHJcbiAgdmFsdWU6IHN0cmluZyA9ICcnO1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcjogU3VpVGV4dElucHV0Q29tcG9uZW50UGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcik7XHJcblxyXG4gICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7XHJcbiAgICB0aGlzLnZhbHVlID0gJyc7XHJcbiAgfVxyXG4gIGdldCBodG1sKCkge1xyXG4gICAgY29uc3QgYiA9IGJ1aWxkRG9tO1xyXG4gICAgY29uc3QgaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgY29uc3QgciA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3NlcygndGV4dC1pbnB1dCBzbW9Db250cm9sJykpLmF0dHIoJ2lkJywgdGhpcy5wYXJhbWV0ZXJJZCkuYXR0cignZGF0YS1wYXJhbScsIHRoaXMuc21vTmFtZSlcclxuICAgICAgLmFwcGVuZChiKCdpbnB1dCcpLmF0dHIoJ3R5cGUnLCAndGV4dCcpLmNsYXNzZXMoJ2ZpbGUtbmFtZScpXHJcbiAgICAgICAgLmF0dHIoJ2lkJywgaWQgKyAnLWlucHV0JykpLmFwcGVuZChcclxuICAgICAgICBiKCdsYWJlbCcpLmF0dHIoJ2ZvcicsIGlkICsgJy1pbnB1dCcpLnRleHQodGhpcy5sYWJlbCkpO1xyXG4gICAgcmV0dXJuIHI7XHJcbiAgfVxyXG5cclxuICBnZXRWYWx1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gIH1cclxuICBzZXRWYWx1ZSh2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcclxuICAgICQoJyMnICsgdGhpcy5wYXJhbWV0ZXJJZCkuZmluZCgnaW5wdXQnKS52YWwodmFsKTtcclxuICB9XHJcbiAgX2dldElucHV0RWxlbWVudCgpIHtcclxuICAgIGNvbnN0IHBpZCA9IHRoaXMucGFyYW1ldGVySWQ7XHJcbiAgICByZXR1cm4gJCh0aGlzLmRpYWxvZy5kZ0RvbS5lbGVtZW50KS5maW5kKCcjJyArIHBpZCkuZmluZCgnaW5wdXQnKTtcclxuICB9XHJcbiAgYmluZCgpIHtcclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgJCgnIycgKyB0aGlzLnBhcmFtZXRlcklkKS5maW5kKCdpbnB1dCcpLm9mZignY2hhbmdlJykub24oJ2NoYW5nZScsICgpID0+IHtcclxuICAgICAgc2VsZi52YWx1ZSA9ICQodGhpcy5fZ2V0SW5wdXRFbGVtZW50KCkpLnZhbCgpO1xyXG4gICAgICBzZWxmLmhhbmRsZUNoYW5nZWQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlUZXh0SW5wdXRDb21wb3NpdGVQYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIHR5cGU/OiBzdHJpbmcsXHJcbiAgaW5jcmVtZW50PzogbnVtYmVyLFxyXG4gIGRlZmF1bHRWYWx1ZTogc3RyaW5nLFxyXG4gIGxhYmVsOiBzdHJpbmcsXHJcbiAgc21vTmFtZTogc3RyaW5nLFxyXG4gIGNvbnRyb2w6IHN0cmluZ1xyXG4gIHBhcmVudENvbnRyb2w6IFN1aUNvbXBvbmVudFBhcmVudFxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpVGV4dElucHV0Q29tcG9zaXRlIGV4dGVuZHMgU3VpVGV4dElucHV0Q29tcG9uZW50IHtcclxuICBwYXJlbnRDb250cm9sOiBTdWlDb21wb25lbnRQYXJlbnQ7XHJcbiAgY29uc3RydWN0b3IoZGlhbG9nOiBTdWlEaWFsb2dOb3RpZmllciwgcGFyYW1ldGVyczogU3VpVGV4dElucHV0Q29tcG9zaXRlUGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcnMpO1xyXG4gICAgdGhpcy5wYXJlbnRDb250cm9sID0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlQ2hhbmdlZCgpIHtcclxuICAgIHRoaXMuY2hhbmdlRmxhZyA9IHRydWU7XHJcbiAgICBhd2FpdCB0aGlzLnBhcmVudENvbnRyb2wuY2hhbmdlZCgpO1xyXG4gICAgdGhpcy5jaGFuZ2VGbGFnID0gZmFsc2U7XHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBBIHN0YXRpYyB0ZXh0IG1lc3NhZ2UgdGhhdCBhcHBlYXJzIGluIHRoZSBkaWFsb2dcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVJlYWRPbmx5VGV4dENvbXBvbmVudCBleHRlbmRzIFN1aVRleHRJbnB1dENvbXBvbmVudCB7XHJcbiAgY29uc3RydWN0b3IoZGlhbG9nOiBTdWlEaWFsb2dOb3RpZmllciwgcGFyYW1ldGVyOiBTdWlUZXh0SW5wdXRDb21wb25lbnRQYXJhbXMpIHtcclxuICAgIHN1cGVyKGRpYWxvZywgcGFyYW1ldGVyKTtcclxuICAgIHRoaXMubm9Qcm9wZXJ0eSA9IHRydWU7XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/textInput.ts\n\n}");
3785
3785
 
3786
3786
  /***/ },
3787
3787
 
@@ -3803,7 +3803,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
3803
3803
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3804
3804
 
3805
3805
  "use strict";
3806
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiToggleComponent: () => (/* binding */ SuiToggleComponent),\n/* harmony export */ SuiToggleComposite: () => (/* binding */ SuiToggleComposite)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.ts\");\n\n\n/**\n * Simple boolean checkbox component\n * @category SuiDialog\n */\nclass SuiToggleComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_1__.SuiComponentBase {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.defaultValue = false;\n this.defaultValue = false;\n this.dialog = dialog;\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const id = this.parameterId;\n const r = b('div').classes(this.makeClasses('toggleControl smoControl')).attr('id', this.parameterId).attr('data-param', this.smoName)\n .append(b('input').attr('type', 'checkbox').classes('toggleInput')\n .attr('id', id + '-input')).append(b('label').attr('for', id + '-input').text(this.label));\n return r;\n }\n _getInputElement() {\n const pid = this.parameterId;\n return $(this.dialog.dgDom.element).find('#' + pid).find('input');\n }\n setValue(value) {\n $(this._getInputElement()).prop('checked', value);\n }\n getValue() {\n return $(this._getInputElement()).prop('checked');\n }\n bind() {\n const input = this._getInputElement();\n $(input).off('change').on('change', () => {\n this.handleChanged();\n });\n }\n}\n/**\n * Dropdown component that can be part of a composite control.\n * @category SuiDialog\n */\nclass SuiToggleComposite extends SuiToggleComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n this.changeFlag = true;\n this.parentControl.changed();\n this.changeFlag = false;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3VpL2RpYWxvZ3MvY29tcG9uZW50cy90b2dnbGUudHM/MTA1MCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBidWlsZERvbSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9odG1sSGVscGVycyc7XHJcbmltcG9ydCB7IFN1aUNvbXBvbmVudEJhc2UsIFN1aURpYWxvZ05vdGlmaWVyLCBTdWlDb21wb25lbnRQYXJlbnQgfSBmcm9tICcuL2Jhc2VDb21wb25lbnQnO1xyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG4vKipcclxuICogcGFyYW1ldGVycyBmb3Igc2ltcGxlIG9uLW9mZiB0b2dnbGVcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlUb2dnbGVDb21wb25lbnRQYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIHR5cGU/OiBzdHJpbmcsXHJcbiAgaW5jcmVtZW50PzogbnVtYmVyLFxyXG4gIGxhYmVsOiBzdHJpbmcsXHJcbiAgc21vTmFtZTogc3RyaW5nLFxyXG4gIGNvbnRyb2w6IHN0cmluZ1xyXG59XHJcbi8qKlxyXG4gKiBTaW1wbGUgYm9vbGVhbiBjaGVja2JveCBjb21wb25lbnRcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVRvZ2dsZUNvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudEJhc2Uge1xyXG4gIGRlZmF1bHRWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcjogU3VpVG9nZ2xlQ29tcG9uZW50UGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcik7XHJcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7XHJcbiAgfVxyXG4gIGdldCBodG1sKCkge1xyXG4gICAgY29uc3QgYiA9IGJ1aWxkRG9tO1xyXG4gICAgY29uc3QgaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgY29uc3QgciA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3NlcygndG9nZ2xlQ29udHJvbCBzbW9Db250cm9sJykpLmF0dHIoJ2lkJywgdGhpcy5wYXJhbWV0ZXJJZCkuYXR0cignZGF0YS1wYXJhbScsIHRoaXMuc21vTmFtZSlcclxuICAgICAgLmFwcGVuZChiKCdpbnB1dCcpLmF0dHIoJ3R5cGUnLCAnY2hlY2tib3gnKS5jbGFzc2VzKCd0b2dnbGVJbnB1dCcpXHJcbiAgICAgICAgLmF0dHIoJ2lkJywgaWQgKyAnLWlucHV0JykpLmFwcGVuZChcclxuICAgICAgICBiKCdsYWJlbCcpLmF0dHIoJ2ZvcicsIGlkICsgJy1pbnB1dCcpLnRleHQodGhpcy5sYWJlbCkpO1xyXG4gICAgcmV0dXJuIHI7XHJcbiAgfVxyXG4gIF9nZXRJbnB1dEVsZW1lbnQoKSB7XHJcbiAgICBjb25zdCBwaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgcmV0dXJuICQodGhpcy5kaWFsb2cuZGdEb20uZWxlbWVudCkuZmluZCgnIycgKyBwaWQpLmZpbmQoJ2lucHV0Jyk7XHJcbiAgfVxyXG4gIHNldFZhbHVlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAkKHRoaXMuX2dldElucHV0RWxlbWVudCgpKS5wcm9wKCdjaGVja2VkJywgdmFsdWUpO1xyXG4gIH1cclxuICBnZXRWYWx1ZSgpIHtcclxuICAgIHJldHVybiAkKHRoaXMuX2dldElucHV0RWxlbWVudCgpKS5wcm9wKCdjaGVja2VkJyk7XHJcbiAgfVxyXG5cclxuICBiaW5kKCkge1xyXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKTtcclxuICAgICQoaW5wdXQpLm9mZignY2hhbmdlJykub24oJ2NoYW5nZScsXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZWQoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUGFyYW1zIGZvciB0b2dnbGUgY29tYmluZWQgd2l0aCBhbm90aGVyIGNvbXBvbmVudFxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aVRvZ2dsZUNvbXBvc2l0ZVBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgdHlwZT86IHN0cmluZyxcclxuICBpbmNyZW1lbnQ/OiBudW1iZXIsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nLFxyXG4gIGRpc2FibGVkT3B0aW9uPzogc3RyaW5nLFxyXG4gIGRlZmF1bHRWYWx1ZT86IHN0cmluZyB8IG51bWJlcixcclxuICBkYXRhVHlwZT86IHN0cmluZyxcclxuICBwYXJlbnRDb250cm9sOiBTdWlDb21wb25lbnRQYXJlbnRcclxufVxyXG4vKipcclxuICogRHJvcGRvd24gY29tcG9uZW50IHRoYXQgY2FuIGJlIHBhcnQgb2YgYSBjb21wb3NpdGUgY29udHJvbC5cclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVRvZ2dsZUNvbXBvc2l0ZSBleHRlbmRzIFN1aVRvZ2dsZUNvbXBvbmVudCB7XHJcbiAgcGFyZW50Q29udHJvbDogU3VpQ29tcG9uZW50UGFyZW50O1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcnM6IFN1aVRvZ2dsZUNvbXBvc2l0ZVBhcmFtcykge1xyXG4gICAgc3VwZXIoZGlhbG9nLCBwYXJhbWV0ZXJzKTtcclxuICAgIHRoaXMucGFyZW50Q29udHJvbCA9IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbDtcclxuICB9XHJcblxyXG4gIGhhbmRsZUNoYW5nZWQoKSB7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSB0cnVlO1xyXG4gICAgdGhpcy5wYXJlbnRDb250cm9sLmNoYW5nZWQoKTtcclxuICAgIHRoaXMuY2hhbmdlRmxhZyA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/toggle.ts\n\n}");
3806
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiToggleComponent: () => (/* binding */ SuiToggleComponent),\n/* harmony export */ SuiToggleComposite: () => (/* binding */ SuiToggleComposite)\n/* harmony export */ });\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _baseComponent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./baseComponent */ \"./src/ui/dialogs/components/baseComponent.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/**\n * Simple boolean checkbox component\n * @category SuiDialog\n */\nclass SuiToggleComponent extends _baseComponent__WEBPACK_IMPORTED_MODULE_1__.SuiComponentBase {\n constructor(dialog, parameter) {\n super(dialog, parameter);\n this.defaultValue = false;\n this.defaultValue = false;\n this.dialog = dialog;\n }\n get html() {\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_0__.buildDom;\n const id = this.parameterId;\n const r = b('div').classes(this.makeClasses('toggleControl smoControl')).attr('id', this.parameterId).attr('data-param', this.smoName)\n .append(b('input').attr('type', 'checkbox').classes('toggleInput')\n .attr('id', id + '-input')).append(b('label').attr('for', id + '-input').text(this.label));\n return r;\n }\n _getInputElement() {\n const pid = this.parameterId;\n return $(this.dialog.dgDom.element).find('#' + pid).find('input');\n }\n setValue(value) {\n $(this._getInputElement()).prop('checked', value);\n }\n getValue() {\n return $(this._getInputElement()).prop('checked');\n }\n bind() {\n const input = this._getInputElement();\n $(input).off('change').on('change', () => {\n this.handleChanged();\n });\n }\n}\n/**\n * Dropdown component that can be part of a composite control.\n * @category SuiDialog\n */\nclass SuiToggleComposite extends SuiToggleComponent {\n constructor(dialog, parameters) {\n super(dialog, parameters);\n this.parentControl = parameters.parentControl;\n }\n handleChanged() {\n return __awaiter(this, void 0, void 0, function* () {\n this.changeFlag = true;\n yield this.parentControl.changed();\n this.changeFlag = false;\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDO1FBQzFCLENBQUM7S0FBQTtDQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3VpL2RpYWxvZ3MvY29tcG9uZW50cy90b2dnbGUudHM/MTA1MCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBidWlsZERvbSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9odG1sSGVscGVycyc7XHJcbmltcG9ydCB7IFN1aUNvbXBvbmVudEJhc2UsIFN1aURpYWxvZ05vdGlmaWVyLCBTdWlDb21wb25lbnRQYXJlbnQgfSBmcm9tICcuL2Jhc2VDb21wb25lbnQnO1xyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG4vKipcclxuICogcGFyYW1ldGVycyBmb3Igc2ltcGxlIG9uLW9mZiB0b2dnbGVcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlUb2dnbGVDb21wb25lbnRQYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgY2xhc3Nlczogc3RyaW5nLFxyXG4gIHR5cGU/OiBzdHJpbmcsXHJcbiAgaW5jcmVtZW50PzogbnVtYmVyLFxyXG4gIGxhYmVsOiBzdHJpbmcsXHJcbiAgc21vTmFtZTogc3RyaW5nLFxyXG4gIGNvbnRyb2w6IHN0cmluZ1xyXG59XHJcbi8qKlxyXG4gKiBTaW1wbGUgYm9vbGVhbiBjaGVja2JveCBjb21wb25lbnRcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVRvZ2dsZUNvbXBvbmVudCBleHRlbmRzIFN1aUNvbXBvbmVudEJhc2Uge1xyXG4gIGRlZmF1bHRWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcjogU3VpVG9nZ2xlQ29tcG9uZW50UGFyYW1zKSB7XHJcbiAgICBzdXBlcihkaWFsb2csIHBhcmFtZXRlcik7XHJcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7XHJcbiAgfVxyXG4gIGdldCBodG1sKCkge1xyXG4gICAgY29uc3QgYiA9IGJ1aWxkRG9tO1xyXG4gICAgY29uc3QgaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgY29uc3QgciA9IGIoJ2RpdicpLmNsYXNzZXModGhpcy5tYWtlQ2xhc3NlcygndG9nZ2xlQ29udHJvbCBzbW9Db250cm9sJykpLmF0dHIoJ2lkJywgdGhpcy5wYXJhbWV0ZXJJZCkuYXR0cignZGF0YS1wYXJhbScsIHRoaXMuc21vTmFtZSlcclxuICAgICAgLmFwcGVuZChiKCdpbnB1dCcpLmF0dHIoJ3R5cGUnLCAnY2hlY2tib3gnKS5jbGFzc2VzKCd0b2dnbGVJbnB1dCcpXHJcbiAgICAgICAgLmF0dHIoJ2lkJywgaWQgKyAnLWlucHV0JykpLmFwcGVuZChcclxuICAgICAgICBiKCdsYWJlbCcpLmF0dHIoJ2ZvcicsIGlkICsgJy1pbnB1dCcpLnRleHQodGhpcy5sYWJlbCkpO1xyXG4gICAgcmV0dXJuIHI7XHJcbiAgfVxyXG4gIF9nZXRJbnB1dEVsZW1lbnQoKSB7XHJcbiAgICBjb25zdCBwaWQgPSB0aGlzLnBhcmFtZXRlcklkO1xyXG4gICAgcmV0dXJuICQodGhpcy5kaWFsb2cuZGdEb20uZWxlbWVudCkuZmluZCgnIycgKyBwaWQpLmZpbmQoJ2lucHV0Jyk7XHJcbiAgfVxyXG4gIHNldFZhbHVlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAkKHRoaXMuX2dldElucHV0RWxlbWVudCgpKS5wcm9wKCdjaGVja2VkJywgdmFsdWUpO1xyXG4gIH1cclxuICBnZXRWYWx1ZSgpIHtcclxuICAgIHJldHVybiAkKHRoaXMuX2dldElucHV0RWxlbWVudCgpKS5wcm9wKCdjaGVja2VkJyk7XHJcbiAgfVxyXG5cclxuICBiaW5kKCkge1xyXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLl9nZXRJbnB1dEVsZW1lbnQoKTtcclxuICAgICQoaW5wdXQpLm9mZignY2hhbmdlJykub24oJ2NoYW5nZScsXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZWQoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogUGFyYW1zIGZvciB0b2dnbGUgY29tYmluZWQgd2l0aCBhbm90aGVyIGNvbXBvbmVudFxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aVRvZ2dsZUNvbXBvc2l0ZVBhcmFtcyB7XHJcbiAgaWQ6IHN0cmluZyxcclxuICBjbGFzc2VzOiBzdHJpbmcsXHJcbiAgdHlwZT86IHN0cmluZyxcclxuICBpbmNyZW1lbnQ/OiBudW1iZXIsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBzbW9OYW1lOiBzdHJpbmcsXHJcbiAgY29udHJvbDogc3RyaW5nLFxyXG4gIGRpc2FibGVkT3B0aW9uPzogc3RyaW5nLFxyXG4gIGRlZmF1bHRWYWx1ZT86IHN0cmluZyB8IG51bWJlcixcclxuICBkYXRhVHlwZT86IHN0cmluZyxcclxuICBwYXJlbnRDb250cm9sOiBTdWlDb21wb25lbnRQYXJlbnRcclxufVxyXG4vKipcclxuICogRHJvcGRvd24gY29tcG9uZW50IHRoYXQgY2FuIGJlIHBhcnQgb2YgYSBjb21wb3NpdGUgY29udHJvbC5cclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVRvZ2dsZUNvbXBvc2l0ZSBleHRlbmRzIFN1aVRvZ2dsZUNvbXBvbmVudCB7XHJcbiAgcGFyZW50Q29udHJvbDogU3VpQ29tcG9uZW50UGFyZW50O1xyXG4gIGNvbnN0cnVjdG9yKGRpYWxvZzogU3VpRGlhbG9nTm90aWZpZXIsIHBhcmFtZXRlcnM6IFN1aVRvZ2dsZUNvbXBvc2l0ZVBhcmFtcykge1xyXG4gICAgc3VwZXIoZGlhbG9nLCBwYXJhbWV0ZXJzKTtcclxuICAgIHRoaXMucGFyZW50Q29udHJvbCA9IHBhcmFtZXRlcnMucGFyZW50Q29udHJvbDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhhbmRsZUNoYW5nZWQoKSB7XHJcbiAgICB0aGlzLmNoYW5nZUZsYWcgPSB0cnVlO1xyXG4gICAgYXdhaXQgdGhpcy5wYXJlbnRDb250cm9sLmNoYW5nZWQoKTtcclxuICAgIHRoaXMuY2hhbmdlRmxhZyA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/ui/dialogs/components/toggle.ts\n\n}");
3807
3807
 
3808
3808
  /***/ },
3809
3809
 
@@ -3836,7 +3836,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
3836
3836
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3837
3837
 
3838
3838
  "use strict";
3839
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DialogTranslations: () => (/* binding */ DialogTranslations),\n/* harmony export */ InstallDialog: () => (/* binding */ InstallDialog),\n/* harmony export */ SuiDialogBase: () => (/* binding */ SuiDialogBase),\n/* harmony export */ createAndDisplayDialog: () => (/* binding */ createAndDisplayDialog),\n/* harmony export */ dialogConstructor: () => (/* binding */ dialogConstructor),\n/* harmony export */ suiDialogTranslate: () => (/* binding */ suiDialogTranslate)\n/* harmony export */ });\n/* harmony import */ var _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../render/sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _components_baseComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/baseComponent */ \"./src/ui/dialogs/components/baseComponent.ts\");\n/* harmony import */ var _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../common/promiseHelpers */ \"./src/common/promiseHelpers.ts\");\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _navigation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../navigation */ \"./src/ui/navigation.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 * The key/mouse event handlers take this as a parameter when we are switching control\n * of the input, due to a modal menu or dialog.\n */\nclass closeModalPromiser {\n constructor(closeEvent) {\n this.createUnbindPromise = () => __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => {\n (0,vue__WEBPACK_IMPORTED_MODULE_4__.watch)(this.closeEvent, () => {\n resolve();\n });\n });\n });\n this.closeEvent = closeEvent;\n this.closeModalPromise = this.createUnbindPromise();\n }\n}\n;\n/**\n * The callbacks can be confusing. Dialog CB button calls this callback,\n * which in turn calls the user-supplied callback, and then hides the dialog.\n * params.commitCb is the supplied callback,\n * but appParams.commitCb is set to this function.\n * @param params\n */\nconst InstallDialog = (params) => __awaiter(void 0, void 0, void 0, function* () {\n // If the dialog is raised from another dialog or menu that hasn't closed, wait for it\n // to close. This is required so we can keep keyboard/mouse event manager in sync.\n if (params.dialogParams.startPromise) {\n yield params.dialogParams.startPromise;\n }\n const complete = (0,vue__WEBPACK_IMPORTED_MODULE_4__.ref)(false);\n const trapper = new _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__.InputTrapper('#vue-modal-container');\n trapper.trap();\n const commitCb = () => __awaiter(void 0, void 0, void 0, function* () {\n complete.value = true;\n yield params.commitCb();\n trapper.close();\n _navigation__WEBPACK_IMPORTED_MODULE_5__.SuiNavigation.instance.hideDialogModal();\n });\n const cancelCb = () => __awaiter(void 0, void 0, void 0, function* () {\n complete.value = true;\n yield params.cancelCb();\n trapper.close();\n _navigation__WEBPACK_IMPORTED_MODULE_5__.SuiNavigation.instance.hideDialogModal();\n });\n const removeCb = () => __awaiter(void 0, void 0, void 0, function* () {\n if (params.removeCb) {\n yield params.removeCb();\n }\n trapper.close();\n _navigation__WEBPACK_IMPORTED_MODULE_5__.SuiNavigation.instance.hideDialogModal();\n complete.value = true;\n });\n $('#' + params.root).addClass('modal show fade');\n params.appParams.commitCb = commitCb;\n params.appParams.cancelCb = cancelCb;\n if (params.removeCb) {\n params.appParams.removeCb = removeCb;\n }\n (0,vue__WEBPACK_IMPORTED_MODULE_4__.createApp)(params.app, params.appParams).mount('#' + params.root);\n // allow a dialog to be dismissed by esc.\n const evKey = (evdata) => __awaiter(void 0, void 0, void 0, function* () {\n if (evdata.key === 'Escape') {\n cancelCb();\n evdata.preventDefault();\n }\n });\n // We take over he keyboard for the modal dialog so the user doesn't change the score\n // while typing into the dialog. the 'completeNotifier' takes it back when we are done\n params.dialogParams.completeNotifier.unbindKeyboardForModal(new closeModalPromiser(complete));\n params.dialogParams.eventSource.bindKeydownHandler(evKey);\n _navigation__WEBPACK_IMPORTED_MODULE_5__.SuiNavigation.instance.showDialogModal();\n /* const cb = () => { };\n draggable({\n parent: $('#' + params.root).find('.attributeModal'),\n handle: $('#' + params.root).find('.jsDbMove'),\n animateDiv: '.draganime',\n cb,\n moveParent: true\n });*/\n});\nconst DialogTranslations = [];\nconst suiDialogTranslate = (dialog, ctor) => {\n const elements = dialog.elements;\n const output = [];\n elements.forEach((element) => {\n var _a;\n const component = {};\n if (element.label) {\n component.label = (_a = element.label) !== null && _a !== void 0 ? _a : '';\n component.id = element.smoName;\n if (element.options) {\n component.options = [];\n element.options.forEach((option) => {\n component.options.push({ value: option.value, label: option.label, css: option.css });\n });\n }\n output.push(component);\n }\n });\n // convert static text from an array of name/value pairs to a record for translation\n const staticText = {};\n const dialogStaticText = dialog.staticText;\n if (dialogStaticText) {\n dialogStaticText.forEach((st) => {\n const key = Object.keys(st)[0];\n staticText[key] = st[key];\n });\n }\n return { ctor, label: dialog.label, dialogElements: output, staticText };\n};\n/**\n * Note: Most dialogs will inherit from SuiDialogAdapter, not SuiDialogBase.\n * You will only want to inherit from SuiDialogBase under 2 conditions:\n * 1. the dialog is triviailly simple, like an alert box that makes no changes to the score, or\n * 2. the dialog is extremely complicated in how it interacts with the user, such that a form-based approach won't work\n * @category SuiDialog\n */\nclass SuiDialogBase extends _components_baseComponent__WEBPACK_IMPORTED_MODULE_2__.SuiDialogNotifier {\n static get displayOptions() {\n return {\n BINDCOMPONENTS: 'bindComponents', DRAGGABLE: 'makeDraggable',\n KEYBOARD_CAPTURE: 'captureKeyboardPromise', GLOBALPOS: 'positionGlobally',\n SELECTIONPOS: 'positionFromSelection', MODIFIERPOS: 'positionFromModifier',\n HIDEREMOVE: 'hideRemoveButton'\n };\n }\n static getStaticText(staticText) {\n const rv = {};\n staticText.forEach((st) => {\n const key = Object.keys(st)[0];\n rv[key] = st[key];\n });\n return rv;\n }\n // ### SuiDialogBase ctor\n // Creates the DOM element for the dialog and gets some initial elements\n constructor(dialogElements, parameters) {\n super();\n this.components = [];\n this.boundComponents = [];\n this.cmap = {};\n this.staticText = [];\n this.displayOptions = ['BINDCOMPONENTS', 'DRAGGABLE', 'KEYBOARD_CAPTURE', 'GLOBALPOS', 'HIDEREMOVE'];\n this.keydownHandler = null;\n this.id = parameters.id;\n this.boundKeyboard = false;\n this.scroller = parameters.view.tracker.scroller;\n this.label = dialogElements.label;\n this.eventSource = parameters.eventSource;\n this.view = parameters.view;\n this.completeNotifier = parameters.completeNotifier;\n this.modifier = parameters.modifier;\n this.ctor = parameters.ctor;\n this.closeDialogPromise = new Promise((resolve) => {\n $('body').off('dialogDismiss').on('dialogDismiss', () => {\n resolve();\n });\n });\n this.staticText = dialogElements.staticText;\n // If this dialog was spawned by a menu, wait for the menu to dismiss\n // before continuing.\n // this.startPromise = parameters.closeMenuPromise;\n this.startPromise = parameters.startPromise;\n this.dialogElements = dialogElements;\n const left = $('#smo-scroll-region').offset().left + $('#smo-scroll-region').width() / 2;\n const top = $('#smo-scroll-region').offset().top + $('#smo-scroll-region').height() / 2;\n this.dgDom = this._constructDialog(dialogElements, {\n id: 'dialog-' + this.id,\n top,\n left,\n label: this.label\n });\n // SmoTranslator.registerDialog(this.ctor);\n }\n // ### display\n // make3 the modal visible. bind events and elements.\n display() {\n $('body').addClass('showAttributeDialog');\n this.bindComponents();\n this.bindElements();\n this.applyDisplayOptions();\n this.initialValue();\n }\n // ### bindElements\n // bing the generic controls in most dialogs.\n bindElements() {\n var dgDom = this.dgDom;\n $(dgDom.element).find('.ok-button').off('click').on('click', () => {\n this.view.groupUndo(false);\n this.commit();\n this.complete();\n });\n $(dgDom.element).find('.cancel-button').off('click').on('click', () => {\n this.view.groupUndo(false);\n if (this.modifier) {\n this.modifier.cancel();\n }\n this.complete();\n });\n $(dgDom.element).find('.remove-button').off('click').on('click', () => {\n this.view.groupUndo(false);\n this.complete();\n });\n }\n bindComponents() {\n this.components.forEach((component) => {\n component.bind();\n });\n }\n initialValue() {\n if (this.modifier === null) {\n return;\n }\n this.boundComponents.forEach((comp) => {\n comp.setValue(this.modifier[comp.smoName]);\n });\n }\n changed() {\n if (this.modifier === null) {\n return;\n }\n this.boundComponents.forEach((comp) => {\n if (comp.changeFlag) {\n this.modifier[comp.smoName] = comp.getValue();\n }\n });\n }\n getId() {\n return this.id;\n }\n getModifier() {\n var _a;\n return (_a = this.modifier) !== null && _a !== void 0 ? _a : null;\n }\n getEventSource() {\n return this.eventSource;\n }\n getStaticText() {\n return SuiDialogBase.getStaticText(this.staticText);\n }\n commit() {\n return __awaiter(this, void 0, void 0, function* () {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_3__.PromiseHelpers.emptyPromise();\n });\n }\n get closeModalPromise() {\n return this.closeDialogPromise;\n }\n // ### position\n // For dialogs based on selections, tries to place the dialog near the selection and also\n // to scroll so the dialog is in view\n static position(box, dgDom, scroller) {\n let y = (box.y + box.height) - scroller.netScroll.y;\n let x = 0;\n // TODO: adjust if db is clipped by the browser.\n const dge = $(dgDom.element).find('.attributeModal');\n const dgeHeight = $(dge).height();\n const maxY = $('#smo-scroll-region').height();\n const maxX = $('#smo-scroll-region').width();\n const offset = $('.dom-container').offset();\n y = y - offset.top;\n const offsetY = dgeHeight + y > window.innerHeight ? (dgeHeight + y) - window.innerHeight : 0;\n y = (y < 0) ? -y : y - offsetY;\n y = (y > maxY || y < 0) ? maxY / 2 : y;\n $(dge).css('top', '' + y + 'px');\n x = box.x - scroller.netScroll.x;\n x = x - offset.left;\n const w = $(dge).width();\n x = (x > window.innerWidth / 2) ? x - (w + 25) : x + (w + 25);\n x = (x < 0 || x > maxX) ? maxX / 2 : x;\n $(dge).css('left', '' + x + 'px');\n }\n getView() {\n return this.view;\n }\n applyDisplayOptions() {\n $('body').addClass('showAttributeDialog');\n this.displayOptions.forEach((option) => {\n this[SuiDialogBase.displayOptions[option]]();\n });\n }\n // ### position\n // Position the dialog near a selection. If the dialog is not visible due\n // to scrolling, make sure it is visible.\n position(box) {\n SuiDialogBase.position(box, this.dgDom, this.view.tracker.scroller);\n }\n hideRemoveButton() {\n $(this.dgDom.element).find('.remove-button').remove();\n }\n // ### positionModifier()\n positionFromModifier() {\n if (!this.modifier || this.modifier.logicalBox === null) {\n this.positionGlobally();\n return;\n }\n const pageContext = this.view.renderer.pageMap.getRendererFromModifier(this.modifier);\n const screenBox = this.view.renderer.pageMap.svgToClient(this.modifier.logicalBox);\n this.position(screenBox);\n }\n // ### positionGlobally\n // position the dialog box in the center of the current scroll region\n positionGlobally() {\n const box = _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_0__.SvgHelpers.boxPoints(250, 250, 1, 1);\n SuiDialogBase.position(box, this.dgDom, this.view.tracker.scroller);\n }\n // ### postionFromSelection\n // set initial position of dialog based on first selection\n positionFromSelection() {\n const note = this.view.tracker.selections[0].note;\n if (note && note.logicalBox) {\n const screenBox = this.view.renderer.pageMap.svgToClient(note.logicalBox);\n this.position(screenBox);\n }\n }\n // ### build the html for the dialog, based on the instance-specific components.\n _constructDialog(dialogElements, parameters) {\n (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__.createTopDomContainer)('.attributeDialog');\n const id = parameters.id;\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__.buildDom;\n const r = b('div').classes('attributeModal').attr('id', 'attr-modal-' + id)\n .css('top', parameters.top + 'px').css('left', parameters.left + 'px')\n .append(b('spanb').classes('draggable button').append(b('span').classes('icon icon-move jsDbMove')))\n .append(b('h2').classes('dialog-label').text(this.label));\n var ctrl = b('div').classes('smoControlContainer');\n dialogElements.elements.filter((de) => de.control).forEach((de) => {\n const classes = de.classes ? de.classes : '';\n const compParams = Object.assign({ classes, id: id + de.smoName }, de);\n try {\n const control = _components_baseComponent__WEBPACK_IMPORTED_MODULE_2__.SmoDynamicComponentCtor[de.control](this, compParams);\n this.components.push(control);\n this.cmap[de.smoName + 'Ctrl'] = control;\n ctrl.append(control.html);\n }\n catch (exp) {\n console.error('bad ctor ' + de.smoName);\n throw (exp);\n }\n });\n r.append(ctrl);\n r.append(b('div').classes('buttonContainer').append(b('button').classes('ok-button button-left btn btn-primary').text('OK')).append(b('button').classes('cancel-button button-center btn btn-secondary').text('Cancel')).append(b('button').classes('remove-button button-right btn btn-secondary').text('Remove').append(b('span').classes('icon icon-cancel-circle'))));\n $('.attributeDialog').html('');\n $('.attributeDialog').append(r.dom());\n const trapper = new _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__.InputTrapper('.attributeDialog');\n trapper.trap();\n $('.attributeDialog').find('.cancel-button').focus();\n return {\n element: $('.attributeDialog'),\n trapper\n };\n }\n // ### Complete\n // Dialogs take over the keyboard, so release that and trigger an event\n // that the dialog is closing that can resolve any outstanding promises.\n complete() {\n if (this.boundKeyboard && this.keydownHandler) {\n this.eventSource.unbindKeydownHandler(this.keydownHandler);\n }\n $('body').removeClass('showAttributeDialog');\n $('body').trigger('dialogDismiss');\n this.dgDom.trapper.close();\n }\n // ### makeDraggable\n // generic code to make the dialog box draggable so it doesn't\n // get in front of stuff.\n makeDraggable() {\n (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__.createTopDomContainer)('.draganime');\n const cb = () => { };\n (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__.draggable)({\n parent: $(this.dgDom.element).find('.attributeModal'),\n handle: $(this.dgDom.element).find('.jsDbMove'),\n animateDiv: '.draganime',\n cb,\n moveParent: true\n });\n }\n // ### captureKeyboardPromise\n // capture keyboard events until the dialog closes,\n // then give control back to the current keyboard\n captureKeyboardPromise() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!(this.startPromise)) {\n this.completeNotifier.unbindKeyboardForModal(this);\n this.bindKeyboard();\n return;\n }\n if (this.startPromise) {\n yield this.startPromise;\n this.completeNotifier.unbindKeyboardForModal(this);\n this.bindKeyboard();\n }\n });\n }\n // ### handleKeydown\n // allow a dialog to be dismissed by esc.\n evKey(evdata) {\n if (evdata.key === 'Escape') {\n $(this.dgDom.element).find('.cancel-button').click();\n evdata.preventDefault();\n }\n }\n // ### bindKeyboard\n // generic logic to grab keyboard elements for modal\n bindKeyboard() {\n const evkey = (ev) => __awaiter(this, void 0, void 0, function* () {\n this.evKey(ev);\n });\n this.boundKeyboard = true;\n this.keydownHandler = this.eventSource.bindKeydownHandler(evkey);\n }\n}\n/**\n * Convenience functions\n * @param type\n * @param parameters\n * @returns a new dialog of type T\n * @category SuiDialog\n */\nfunction dialogConstructor(type, parameters) {\n return new type(parameters);\n}\n/**\n * Convenience function to display a dialog\n * @category SuiDialog\n * @param ctor\n * @param parameters\n * @returns\n */\nfunction createAndDisplayDialog(ctor, parameters) {\n const instance = dialogConstructor(ctor, parameters);\n instance.display();\n return instance;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFPLEVBQUUsRUFBRTtZQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkUsQ0FBQztDQUNGO0FBQ0Q7Ozs7OztHQU1HO0FBQ0ksU0FBUyxpQkFBaUIsQ0FBMEIsSUFBOEMsRUFBRSxVQUEyQjtJQUNwSSxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFDRDs7Ozs7O0dBTUc7QUFDSSxTQUFTLHNCQUFzQixDQUEwQixJQUE0QyxFQUFFLFVBQTJCO0lBQ3ZJLE1BQU0sUUFBUSxHQUFNLGlCQUFpQixDQUFJLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzRCxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy91aS9kaWFsb2dzL2RpYWxvZy50cz84MWRlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG5pbXBvcnQgeyBTdmdIZWxwZXJzIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS9zdmdIZWxwZXJzJztcclxuaW1wb3J0IHsgYnVpbGREb20sIElucHV0VHJhcHBlciwgZHJhZ2dhYmxlLCBjcmVhdGVUb3BEb21Db250YWluZXIgfSBmcm9tICcuLi8uLi9jb21tb24vaHRtbEhlbHBlcnMnO1xyXG4vLyBpbXBvcnQgeyBTbW9UcmFuc2xhdG9yIH0gZnJvbSAnLi4vaTE4bi9sYW5ndWFnZSc7XHJcbmltcG9ydCB7IFNtb01vZGlmaWVyIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc2NvcmUnO1xyXG5pbXBvcnQgeyBTdmdCb3ggfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTdWlUcmFja2VyIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS90cmFja2VyJztcclxuaW1wb3J0IHsgU3VpU2NvcmVWaWV3T3BlcmF0aW9ucyB9IGZyb20gJy4uLy4uL3JlbmRlci9zdWkvc2NvcmVWaWV3T3BlcmF0aW9ucyc7XHJcbmltcG9ydCB7IENvbXBsZXRlTm90aWZpZXIgfSBmcm9tICcuLi9jb21tb24nO1xyXG5pbXBvcnQgeyBCcm93c2VyRXZlbnRTb3VyY2UgfSBmcm9tICcuLi9ldmVudFNvdXJjZSc7XHJcbmltcG9ydCB7IFVuZG9CdWZmZXIgfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vdW5kbyc7XHJcbmltcG9ydCB7IFN1aURpYWxvZ05vdGlmaWVyLCBEaWFsb2dEZWZpbml0aW9uRWxlbWVudCwgXHJcbiAgU3VpQ29tcG9uZW50QmFzZSwgRGlhbG9nRGVmaW5pdGlvbk9wdGlvbiwgU3VpQmFzZUNvbXBvbmVudFBhcmFtcywgU21vRHluYW1pY0NvbXBvbmVudEN0b3IgfSBmcm9tICcuL2NvbXBvbmVudHMvYmFzZUNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFN1aVNjcm9sbGVyIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS9zY3JvbGxlcic7XHJcbmltcG9ydCB7IFNtb05vdGUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9ub3RlJztcclxuaW1wb3J0IHsgRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vZXZlbnRTb3VyY2UnO1xyXG5pbXBvcnQgeyBTbW9VaUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgUHJvbWlzZUhlbHBlcnMgfSBmcm9tICcuLi8uLi9jb21tb24vcHJvbWlzZUhlbHBlcnMnO1xyXG5pbXBvcnQgeyBjcmVhdGVBcHAsIHJlZiwgUmVmLCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XHJcbmltcG9ydCB7IFN1aU5hdmlnYXRpb24gfSBmcm9tICcuLi9uYXZpZ2F0aW9uJztcclxuXHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcbi8qKlxyXG4gKiBUaGUga2V5L21vdXNlIGV2ZW50IGhhbmRsZXJzIHRha2UgdGhpcyBhcyBhIHBhcmFtZXRlciB3aGVuIHdlIGFyZSBzd2l0Y2hpbmcgY29udHJvbFxyXG4gKiBvZiB0aGUgaW5wdXQsIGR1ZSB0byBhIG1vZGFsIG1lbnUgb3IgZGlhbG9nLlxyXG4gKi9cclxuY2xhc3MgY2xvc2VNb2RhbFByb21pc2VyIHtcclxuICBjbG9zZU1vZGFsUHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcclxuICBjbG9zZUV2ZW50OiBSZWY8Ym9vbGVhbj47XHJcbiAgY3JlYXRlVW5iaW5kUHJvbWlzZSA9IGFzeW5jICgpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICB3YXRjaCh0aGlzLmNsb3NlRXZlbnQsICgpID0+IHtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSlcclxuICB9XHJcbiAgY29uc3RydWN0b3IoY2xvc2VFdmVudDogUmVmPGJvb2xlYW4+KSB7XHJcbiAgICB0aGlzLmNsb3NlRXZlbnQgPSBjbG9zZUV2ZW50O1xyXG4gICAgdGhpcy5jbG9zZU1vZGFsUHJvbWlzZSA9IHRoaXMuY3JlYXRlVW5iaW5kUHJvbWlzZSgpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgdHlwZSBEaWFsb2dDYWxsYmFjayA9ICgpID0+IFByb21pc2U8dm9pZD47XHJcbi8qKlxyXG4gKiBQYXJhbWV0ZXJzIGZvciBpbnN0YWxsaW5nIGEgZGlhbG9nLiAgVlVFLWJhc2VkIGRpYWxvZyBsb2dpYy5cclxuICogY29tcGxldGUgaXMgYSBSZWYgdGhhdCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHRoZSBkaWFsb2cgaXMgZmluaXNoZWQsIHVzZWQgdG8gXHJcbiAqIGhhbmQgb2ZmIGtleWJvYXJkIGNvbnRyb2wgYmV0d2VlbiBkaWFsb2dzIGFuZCBtZW51cy5cclxuICogYXBwIGlzIGEgVlVFIGFwcCwgYXBwUGFyYW1zIGFyZSB0aGUgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBhcHAuXHJcbiAqIHdlIG92ZXJyaWRlIGNvbW1pdENiLCBjYW5jZWxDYiwgYW5kIHJlbW92ZUNiIHRvIG1hbmFnZSB0aGUgZGlhbG9nIGxpZmV0aW1lLlxyXG4gKiByb290IGlzIHRoZSBET00gaWQgdG8gbW91bnQgdGhlIGRpYWxvZyBpbiAod2l0aG91dCB0aGUgJyMnKVxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nIFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBEaWFsb2dJbnN0YWxsUGFyYW1zIHtcclxuICByb290OiBzdHJpbmcsXHJcbiAgYXBwOiBhbnksIFxyXG4gIGFwcFBhcmFtczogYW55LFxyXG4gIGRpYWxvZ1BhcmFtczogU3VpRGlhbG9nUGFyYW1zLFxyXG4gIGNvbW1pdENiOiBEaWFsb2dDYWxsYmFjaywgXHJcbiAgY2FuY2VsQ2I6IERpYWxvZ0NhbGxiYWNrLFxyXG4gIHJlbW92ZUNiPzogRGlhbG9nQ2FsbGJhY2tcclxufTtcclxuLyoqXHJcbiAqIFRoZSBjYWxsYmFja3MgY2FuIGJlIGNvbmZ1c2luZy4gIERpYWxvZyBDQiBidXR0b24gY2FsbHMgdGhpcyBjYWxsYmFjaywgXHJcbiAqIHdoaWNoIGluIHR1cm4gY2FsbHMgdGhlIHVzZXItc3VwcGxpZWQgY2FsbGJhY2ssIGFuZCB0aGVuIGhpZGVzIHRoZSBkaWFsb2cuXHJcbiAqIHBhcmFtcy5jb21taXRDYiBpcyB0aGUgc3VwcGxpZWQgY2FsbGJhY2ssIFxyXG4gKiBidXQgYXBwUGFyYW1zLmNvbW1pdENiIGlzIHNldCB0byB0aGlzIGZ1bmN0aW9uLlxyXG4gKiBAcGFyYW0gcGFyYW1zIFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEluc3RhbGxEaWFsb2cgPSBhc3luYyAocGFyYW1zOiBEaWFsb2dJbnN0YWxsUGFyYW1zKSA9PiB7XHJcbiAgLy8gSWYgdGhlIGRpYWxvZyBpcyByYWlzZWQgZnJvbSBhbm90aGVyIGRpYWxvZyBvciBtZW51IHRoYXQgaGFzbid0IGNsb3NlZCwgd2FpdCBmb3IgaXRcclxuICAvLyB0byBjbG9zZS4gIFRoaXMgaXMgcmVxdWlyZWQgc28gd2UgY2FuIGtlZXAga2V5Ym9hcmQvbW91c2UgZXZlbnQgbWFuYWdlciBpbiBzeW5jLlxyXG4gIGlmIChwYXJhbXMuZGlhbG9nUGFyYW1zLnN0YXJ0UHJvbWlzZSkge1xyXG4gICAgYXdhaXQgcGFyYW1zLmRpYWxvZ1BhcmFtcy5zdGFydFByb21pc2U7XHJcbiAgfVxyXG4gIGNvbnN0IGNvbXBsZXRlOiBSZWY8Ym9vbGVhbj4gPSByZWYoZmFsc2UpO1xyXG5cclxuICBjb25zdCB0cmFwcGVyID0gbmV3IElucHV0VHJhcHBlcignI3Z1ZS1tb2RhbC1jb250YWluZXInKTtcclxuICB0cmFwcGVyLnRyYXAoKTtcclxuICBjb25zdCBjb21taXRDYiA9IGFzeW5jICgpID0+IHtcclxuICAgIGNvbXBsZXRlLnZhbHVlID0gdHJ1ZTtcclxuICAgIGF3YWl0IHBhcmFtcy5jb21taXRDYigpO1xyXG4gICAgdHJhcHBlci5jbG9zZSgpO1xyXG4gICAgU3VpTmF2aWdhdGlvbi5pbnN0YW5jZS5oaWRlRGlhbG9nTW9kYWwoKTtcclxuICB9XHJcbiAgY29uc3QgY2FuY2VsQ2IgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBjb21wbGV0ZS52YWx1ZSA9IHRydWU7XHJcbiAgICBhd2FpdCBwYXJhbXMuY2FuY2VsQ2IoKTtcclxuICAgIHRyYXBwZXIuY2xvc2UoKTtcclxuICAgIFN1aU5hdmlnYXRpb24uaW5zdGFuY2UuaGlkZURpYWxvZ01vZGFsKCk7XHJcbiAgfVxyXG4gIGNvbnN0IHJlbW92ZUNiID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgaWYgKHBhcmFtcy5yZW1vdmVDYikge1xyXG4gICAgICBhd2FpdCBwYXJhbXMucmVtb3ZlQ2IoKTtcclxuICAgIH1cclxuICAgIHRyYXBwZXIuY2xvc2UoKTtcclxuICAgIFN1aU5hdmlnYXRpb24uaW5zdGFuY2UuaGlkZURpYWxvZ01vZGFsKCk7XHJcbiAgICBjb21wbGV0ZS52YWx1ZSA9IHRydWU7XHJcbiAgfVxyXG4gICQoJyMnICsgcGFyYW1zLnJvb3QpLmFkZENsYXNzKCdtb2RhbCBzaG93IGZhZGUnKTtcclxuICBwYXJhbXMuYXBwUGFyYW1zLmNvbW1pdENiID0gY29tbWl0Q2I7XHJcbiAgcGFyYW1zLmFwcFBhcmFtcy5jYW5jZWxDYiA9IGNhbmNlbENiO1xyXG4gIGlmIChwYXJhbXMucmVtb3ZlQ2IpIHtcclxuICAgIHBhcmFtcy5hcHBQYXJhbXMucmVtb3ZlQ2IgPSByZW1vdmVDYjtcclxuICB9XHJcbiAgY3JlYXRlQXBwKHBhcmFtcy5hcHAgYXMgYW55LCBwYXJhbXMuYXBwUGFyYW1zKS5tb3VudCgnIycgKyBwYXJhbXMucm9vdCk7XHJcblxyXG4gIC8vIGFsbG93IGEgZGlhbG9nIHRvIGJlIGRpc21pc3NlZCBieSBlc2MuXHJcbiAgY29uc3QgZXZLZXkgPSBhc3luYyAoZXZkYXRhOiBhbnkpID0+IHtcclxuICAgIGlmIChldmRhdGEua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICBjYW5jZWxDYigpO1xyXG4gICAgICBldmRhdGEucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gV2UgdGFrZSBvdmVyIGhlIGtleWJvYXJkIGZvciB0aGUgbW9kYWwgZGlhbG9nIHNvIHRoZSB1c2VyIGRvZXNuJ3QgY2hhbmdlIHRoZSBzY29yZVxyXG4gIC8vIHdoaWxlIHR5cGluZyBpbnRvIHRoZSBkaWFsb2cuICB0aGUgJ2NvbXBsZXRlTm90aWZpZXInIHRha2VzIGl0IGJhY2sgd2hlbiB3ZSBhcmUgZG9uZVxyXG4gIHBhcmFtcy5kaWFsb2dQYXJhbXMuY29tcGxldGVOb3RpZmllci51bmJpbmRLZXlib2FyZEZvck1vZGFsKG5ldyBjbG9zZU1vZGFsUHJvbWlzZXIoY29tcGxldGUpKTtcclxuICBwYXJhbXMuZGlhbG9nUGFyYW1zLmV2ZW50U291cmNlLmJpbmRLZXlkb3duSGFuZGxlcihldktleSk7XHJcbiAgU3VpTmF2aWdhdGlvbi5pbnN0YW5jZS5zaG93RGlhbG9nTW9kYWwoKTtcclxuICAvKiBjb25zdCBjYiA9ICgpID0+IHsgfTtcclxuICBkcmFnZ2FibGUoe1xyXG4gICAgcGFyZW50OiAkKCcjJyArIHBhcmFtcy5yb290KS5maW5kKCcuYXR0cmlidXRlTW9kYWwnKSxcclxuICAgIGhhbmRsZTogJCgnIycgKyBwYXJhbXMucm9vdCkuZmluZCgnLmpzRGJNb3ZlJyksXHJcbiAgICBhbmltYXRlRGl2OiAnLmRyYWdhbmltZScsXHJcbiAgICBjYixcclxuICAgIG1vdmVQYXJlbnQ6IHRydWVcclxuICB9KTsqLyAgXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgSlNPTiBkaWFsb2cgdGVtcGxhdGUgaXMgYSBkZWNsYXJpdGl2ZSBzdHJ1Y3RvcmUgZm9yIHRoZSBodG1sIG9mIHRoZSBkaWFsb2dcclxuICogYW5kIGNvbXBvbmVudHMuICBcclxuICogQHBhcmFtIGxhYmVsIGZvciB0aGUgZGlhbG9nIGl0c2VsZlxyXG4gKiBAcGFyYW0gZWxlbWVudHMgYSBzZXJpZXMgb2YgZWxlbWVudHMgdGhhdCBkZWZpbmUgdGhlIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0gc3RhdGljVGV4dCBhIGhhc2ggb2YgdGV4dCBmb3IgdGhlIGRpYWxvZyBhbmQgY29tcG9uZW50cyB0byB1c2VcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBEaWFsb2dEZWZpbml0aW9uIHtcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGVsZW1lbnRzOiBEaWFsb2dEZWZpbml0aW9uRWxlbWVudFtdLFxyXG4gIHN0YXRpY1RleHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5bXVxyXG59XHJcbi8qKlxyXG4gKiBBIHRyYW5zbGF0aW9uIG9mIHRoZSBsYWJlbHMgaW4gRGlhbG9nRGVmaW50aW9uRWxlbWVudFxyXG4gKiBAcGFyYW0gbGFiZWwgdGhlIGNvbXBvbmVudCBsYWJlbFxyXG4gKiBAcGFyYW0gaWQgdXNlZCBhcyBhIGtleSBpbiB0cmFuc2xhdGlvbiB0b29sXHJcbiAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbnMgZm9yIGRyb3Bkb3duIGFuZCBvdGhlciBhcnJheSBjb21wb25lbnRzXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGlhbG9nVHJhbnNsYXRpb25FbGVtZW50IHtcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGlkOiBzdHJpbmcsXHJcbiAgb3B0aW9ucz86IERpYWxvZ0RlZmluaXRpb25PcHRpb25bXVxyXG59XHJcbi8qKlxyXG4gKiBBIHRyYW5zbGF0aW9uIG9mIGFsbCB0aGUgc3RyaW5ncyBpbiB0aGUgZGlhbG9nIGl0c2VsZiwgdXNlZCBcclxuICogd2hlbiBzd2l0Y2hpbmcgbGFuZ3VhZ2VzLlxyXG4gKiBAcGFyYW0gY3RvciB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBkaWFsb2cgY2xhc3MsIHVzZWQgdG8gY2FsbCBzdGF0aWMgbWV0aG9kc1xyXG4gKiBAcGFyYW0gbGFiZWwgdGhlIHRyYW5zbGF0ZWQgbGFiZWxcclxuICogQHBhcmFtIGRpYWxvZ0VsZW1lbnRzIHRoZSB0cmFuc2xhdGVkIGNvbXBvbmVudCBqc29uXHJcbiAqIEBwYXJhbSBzdGF0aWNUZXh0IHRyYW5zbGF0ZWQgbWlzYyB0ZXh0IFxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIERpYWxvZ1RyYW5zbGF0aW9uIHtcclxuICBjdG9yOiBzdHJpbmcsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBkaWFsb2dFbGVtZW50czogRGlhbG9nVHJhbnNsYXRpb25FbGVtZW50W10sXHJcbiAgc3RhdGljVGV4dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgRGlhbG9nVHJhbnNsYXRpb25zOiBEaWFsb2dUcmFuc2xhdGlvbltdID0gW107XHJcblxyXG4vKipcclxuICogRGlhbG9nIHBhcmFtcyBhbHdheXMgY29udGFpbiBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcnVudGltZVxyXG4gKiBmb3IgbW9kYWwgZnVuY3Rpb25hbGl0eVxyXG4gKiBAcGFyYW0gY3RvciBkaWFsb2cgY29uc3RydWN0b3JcclxuICogQHBhcmFtIGlkIERPTSBpZCBmb3IgdGhlIGRpYWxvZ1xyXG4gKiBAcGFyYW0gdHJhY2tlciB0byBnZXQgYW5kIHNldCBzZWxlY3Rpb25zXHJcbiAqIEBwYXJhbSBjb21wbGV0ZU5vdGlmaWVyIHVzZWQgdG8gdGFrZSBvdmVyIGtleS9tb3VzZSBjb250cm9sXHJcbiAqIEBwYXJhbSBzdGFydFByb21pc2UgdXNlZCBpZiB0aGlzIGlzIGNhbGxlZCBmcm9tIGFub3RoZXIgbW9kYWwgZWxlbWVudFxyXG4gKiBAcGFyYW0gdmlldyB0aGUgTVZWTSBvYmplY3QgdG8gY2hhbmdlIHRoZSBzY29yZVxyXG4gKiBAcGFyYW0gZXZlbnRTb3VyY2UgZXZlbnQgc291cmNlIHRvIHJlZ2lzdGVyIGZvciBhZGRpdGlvbmFsIGV2ZW50cyBsaWtlIG1vdXNldXBcclxuICogQHBhcmFtIHVuZG9CdWZmZXIgdXNlZCB0byBjcmVhdGUgdW5kb1xyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aURpYWxvZ1BhcmFtcyB7XHJcbiAgY3Rvcjogc3RyaW5nLFxyXG4gIGlkOiBzdHJpbmcsXHJcbiAgdHJhY2tlcjogU3VpVHJhY2tlcixcclxuICBjb21wbGV0ZU5vdGlmaWVyOiBDb21wbGV0ZU5vdGlmaWVyLFxyXG4gIHN0YXJ0UHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGxcclxuICB2aWV3OiBTdWlTY29yZVZpZXdPcGVyYXRpb25zLFxyXG4gIGV2ZW50U291cmNlOiBCcm93c2VyRXZlbnRTb3VyY2UsXHJcbiAgLy8gZGVmaW5pdGlvbjogRGlhbG9nRGVmaW5pdGlvbixcclxuICBtb2RpZmllcj86IGFueSxcclxuICBjb25maWc/OiBTbW9VaUNvbmZpZ3VyYXRpb25cclxufVxyXG5cclxuLyoqXHJcbiAqIGludGVybmFsIGludGVyZmFjZSB1c2VkIHRvIGNyZWF0ZSB0aGUgRE9NXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlEb21QYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgdG9wOiBudW1iZXIsXHJcbiAgbGVmdDogbnVtYmVyLFxyXG4gIGxhYmVsOiBzdHJpbmdcclxufVxyXG4vKipcclxuICogRE9NIGludGVyZmFjZSBmb3IgdGhlIGRpYWxvZ1xyXG4gKiBAaW50ZXJuYWxcclxuICogQHBhcmFtIGVsZW1lbnQgcGFyZW50IGVsZW1lbnRcclxuICogQHBhcmFtIHRyYXBwZXIgdXNlZCB0byB0cmFwIGZvY3VzIGV2ZW50cyBmb3IgdGhlIGRpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBEaWFsb2dEb20ge1xyXG4gIGVsZW1lbnQ6IGFueSxcclxuICB0cmFwcGVyOiBhbnlcclxufVxyXG5leHBvcnQgY29uc3Qgc3VpRGlhbG9nVHJhbnNsYXRlID0gKGRpYWxvZzogRGlhbG9nRGVmaW5pdGlvbiwgY3Rvcjogc3RyaW5nKTogRGlhbG9nVHJhbnNsYXRpb24gPT4ge1xyXG4gIGNvbnN0IGVsZW1lbnRzOiBEaWFsb2dEZWZpbml0aW9uRWxlbWVudFtdID0gZGlhbG9nLmVsZW1lbnRzO1xyXG4gIGNvbnN0IG91dHB1dDogRGlhbG9nVHJhbnNsYXRpb25FbGVtZW50W10gPSBbXTtcclxuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBEaWFsb2dEZWZpbml0aW9uRWxlbWVudCkgPT4ge1xyXG4gICAgY29uc3QgY29tcG9uZW50OiBQYXJ0aWFsPERpYWxvZ1RyYW5zbGF0aW9uRWxlbWVudD4gPSB7fTtcclxuICAgIGlmIChlbGVtZW50LmxhYmVsKSB7XHJcbiAgICAgIGNvbXBvbmVudC5sYWJlbCA9IGVsZW1lbnQubGFiZWwgPz8gJyc7XHJcbiAgICAgIGNvbXBvbmVudC5pZCA9IGVsZW1lbnQuc21vTmFtZTtcclxuICAgICAgaWYgKGVsZW1lbnQub3B0aW9ucykge1xyXG4gICAgICAgIGNvbXBvbmVudC5vcHRpb25zID0gW107XHJcblxyXG4gICAgICAgIGVsZW1lbnQub3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcclxuICAgICAgICAgIGNvbXBvbmVudC5vcHRpb25zIS5wdXNoKHsgdmFsdWU6IG9wdGlvbi52YWx1ZSwgbGFiZWw6IG9wdGlvbi5sYWJlbCwgY3NzOiBvcHRpb24uY3NzIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIG91dHB1dC5wdXNoKGNvbXBvbmVudCBhcyBEaWFsb2dUcmFuc2xhdGlvbkVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIC8vIGNvbnZlcnQgc3RhdGljIHRleHQgZnJvbSBhbiBhcnJheSBvZiBuYW1lL3ZhbHVlIHBhaXJzIHRvIGEgcmVjb3JkIGZvciB0cmFuc2xhdGlvblxyXG4gIGNvbnN0IHN0YXRpY1RleHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcclxuICBjb25zdCBkaWFsb2dTdGF0aWNUZXh0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10gPSBkaWFsb2cuc3RhdGljVGV4dDtcclxuICBpZiAoZGlhbG9nU3RhdGljVGV4dCkge1xyXG4gICAgZGlhbG9nU3RhdGljVGV4dC5mb3JFYWNoKChzdCkgPT4ge1xyXG4gICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhzdClbMF07XHJcbiAgICAgIHN0YXRpY1RleHRba2V5XSAgPSBzdFtrZXldO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJldHVybiB7IGN0b3IsIGxhYmVsOiBkaWFsb2cubGFiZWwsIGRpYWxvZ0VsZW1lbnRzOiBvdXRwdXQsIHN0YXRpY1RleHQgfTtcclxufVxyXG4vKipcclxuICogTm90ZTogTW9zdCBkaWFsb2dzIHdpbGwgaW5oZXJpdCBmcm9tIFN1aURpYWxvZ0FkYXB0ZXIsIG5vdCBTdWlEaWFsb2dCYXNlLlxyXG4gKiBZb3Ugd2lsbCBvbmx5IHdhbnQgdG8gaW5oZXJpdCBmcm9tIFN1aURpYWxvZ0Jhc2UgdW5kZXIgMiBjb25kaXRpb25zOlxyXG4gKiAxLiB0aGUgZGlhbG9nIGlzIHRyaXZpYWlsbHkgc2ltcGxlLCBsaWtlIGFuIGFsZXJ0IGJveCB0aGF0IG1ha2VzIG5vIGNoYW5nZXMgdG8gdGhlIHNjb3JlLCBvclxyXG4gKiAyLiB0aGUgZGlhbG9nIGlzIGV4dHJlbWVseSBjb21wbGljYXRlZCBpbiBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHVzZXIsIHN1Y2ggdGhhdCBhIGZvcm0tYmFzZWQgYXBwcm9hY2ggd29uJ3Qgd29ya1xyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG4gZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN1aURpYWxvZ0Jhc2UgZXh0ZW5kcyBTdWlEaWFsb2dOb3RpZmllciB7XHJcbiAgc3RhdGljIGdldCBkaXNwbGF5T3B0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIEJJTkRDT01QT05FTlRTOiAnYmluZENvbXBvbmVudHMnLCBEUkFHR0FCTEU6ICdtYWtlRHJhZ2dhYmxlJyxcclxuICAgICAgS0VZQk9BUkRfQ0FQVFVSRTogJ2NhcHR1cmVLZXlib2FyZFByb21pc2UnLCBHTE9CQUxQT1M6ICdwb3NpdGlvbkdsb2JhbGx5JyxcclxuICAgICAgU0VMRUNUSU9OUE9TOiAncG9zaXRpb25Gcm9tU2VsZWN0aW9uJywgTU9ESUZJRVJQT1M6ICdwb3NpdGlvbkZyb21Nb2RpZmllcicsXHJcbiAgICAgIEhJREVSRU1PVkU6ICdoaWRlUmVtb3ZlQnV0dG9uJ1xyXG4gICAgfTtcclxuICB9ICBcclxuXHJcbiAgc3RhdGljIGdldFN0YXRpY1RleHQoc3RhdGljVGV4dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPltdKSB7XHJcbiAgICBjb25zdCBydjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xyXG4gICAgc3RhdGljVGV4dC5mb3JFYWNoKChzdCkgPT4ge1xyXG4gICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhzdClbMF07XHJcbiAgICAgIHJ2W2tleV0gPSBzdFtrZXldO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIGlkOiBzdHJpbmc7XHJcbiAgY3Rvcjogc3RyaW5nO1xyXG4gIGJvdW5kS2V5Ym9hcmQ6IGJvb2xlYW47XHJcbiAgY29tcG9uZW50czogU3VpQ29tcG9uZW50QmFzZVtdID0gW107XHJcbiAgYm91bmRDb21wb25lbnRzOiBTdWlDb21wb25lbnRCYXNlW10gPSBbXTtcclxuICBjbWFwOiBSZWNvcmQ8c3RyaW5nLCBTdWlDb21wb25lbnRCYXNlPiA9IHt9O1xyXG4gIHNjcm9sbGVyOiBTdWlTY3JvbGxlcjtcclxuICBjbG9zZURpYWxvZ1Byb21pc2U6IFByb21pc2U8dm9pZD47XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBzdGF0aWNUZXh0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10gPSBbXTtcclxuICBzdGFydFByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsO1xyXG4gIGRpYWxvZ0VsZW1lbnRzOiBEaWFsb2dEZWZpbml0aW9uO1xyXG4gIGV2ZW50U291cmNlOiBCcm93c2VyRXZlbnRTb3VyY2U7XHJcbiAgdmlldzogU3VpU2NvcmVWaWV3T3BlcmF0aW9ucztcclxuICBjb21wbGV0ZU5vdGlmaWVyOiBDb21wbGV0ZU5vdGlmaWVyO1xyXG4gIG1vZGlmaWVyOiBhbnk7XHJcbiAgZGdEb206IERpYWxvZ0RvbTtcclxuICBkaXNwbGF5T3B0aW9uczogc3RyaW5nW10gPSBbJ0JJTkRDT01QT05FTlRTJywgJ0RSQUdHQUJMRScsICdLRVlCT0FSRF9DQVBUVVJFJywgJ0dMT0JBTFBPUycsICdISURFUkVNT1ZFJ107XHJcbiAga2V5ZG93bkhhbmRsZXI6IEV2ZW50SGFuZGxlciB8IG51bGwgPSBudWxsO1xyXG4gIC8vICMjIyBTdWlEaWFsb2dCYXNlIGN0b3JcclxuICAvLyBDcmVhdGVzIHRoZSBET00gZWxlbWVudCBmb3IgdGhlIGRpYWxvZyBhbmQgZ2V0cyBzb21lIGluaXRpYWwgZWxlbWVudHNcclxuICBjb25zdHJ1Y3RvcihkaWFsb2dFbGVtZW50czogRGlhbG9nRGVmaW5pdGlvbiwgcGFyYW1ldGVyczogU3VpRGlhbG9nUGFyYW1zKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5pZCA9IHBhcmFtZXRlcnMuaWQ7XHJcbiAgICB0aGlzLmJvdW5kS2V5Ym9hcmQgPSBmYWxzZTtcclxuICAgIHRoaXMuc2Nyb2xsZXIgPSBwYXJhbWV0ZXJzLnZpZXcudHJhY2tlci5zY3JvbGxlcjtcclxuICAgIHRoaXMubGFiZWwgPSBkaWFsb2dFbGVtZW50cy5sYWJlbDtcclxuICAgIHRoaXMuZXZlbnRTb3VyY2UgPSBwYXJhbWV0ZXJzLmV2ZW50U291cmNlO1xyXG4gICAgdGhpcy52aWV3ID0gcGFyYW1ldGVycy52aWV3O1xyXG4gICAgdGhpcy5jb21wbGV0ZU5vdGlmaWVyID0gcGFyYW1ldGVycy5jb21wbGV0ZU5vdGlmaWVyO1xyXG4gICAgdGhpcy5tb2RpZmllciA9IHBhcmFtZXRlcnMubW9kaWZpZXI7XHJcbiAgICB0aGlzLmN0b3IgPSBwYXJhbWV0ZXJzLmN0b3I7XHJcblxyXG4gICAgdGhpcy5jbG9zZURpYWxvZ1Byb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAkKCdib2R5Jykub2ZmKCdkaWFsb2dEaXNtaXNzJykub24oJ2RpYWxvZ0Rpc21pc3MnLCAoKSA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdGF0aWNUZXh0ID0gZGlhbG9nRWxlbWVudHMuc3RhdGljVGV4dDtcclxuXHJcbiAgICAvLyBJZiB0aGlzIGRpYWxvZyB3YXMgc3Bhd25lZCBieSBhIG1lbnUsIHdhaXQgZm9yIHRoZSBtZW51IHRvIGRpc21pc3NcclxuICAgIC8vIGJlZm9yZSBjb250aW51aW5nLlxyXG4gICAgLy8gdGhpcy5zdGFydFByb21pc2UgPSBwYXJhbWV0ZXJzLmNsb3NlTWVudVByb21pc2U7XHJcbiAgICB0aGlzLnN0YXJ0UHJvbWlzZSA9IHBhcmFtZXRlcnMuc3RhcnRQcm9taXNlO1xyXG5cclxuICAgIHRoaXMuZGlhbG9nRWxlbWVudHMgPSBkaWFsb2dFbGVtZW50cztcclxuXHJcbiAgICBjb25zdCBsZWZ0ID0gJCgnI3Ntby1zY3JvbGwtcmVnaW9uJykub2Zmc2V0KCkubGVmdCArICQoJyNzbW8tc2Nyb2xsLXJlZ2lvbicpLndpZHRoKCkgLyAyO1xyXG4gICAgY29uc3QgdG9wID0gJCgnI3Ntby1zY3JvbGwtcmVnaW9uJykub2Zmc2V0KCkudG9wICsgJCgnI3Ntby1zY3JvbGwtcmVnaW9uJykuaGVpZ2h0KCkgLyAyO1xyXG5cclxuICAgIHRoaXMuZGdEb20gPSB0aGlzLl9jb25zdHJ1Y3REaWFsb2coZGlhbG9nRWxlbWVudHMsIHtcclxuICAgICAgaWQ6ICdkaWFsb2ctJyArIHRoaXMuaWQsXHJcbiAgICAgIHRvcCxcclxuICAgICAgbGVmdCxcclxuICAgICAgbGFiZWw6IHRoaXMubGFiZWxcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFNtb1RyYW5zbGF0b3IucmVnaXN0ZXJEaWFsb2codGhpcy5jdG9yKTtcclxuICB9XHJcbiAgICAvLyAjIyMgZGlzcGxheVxyXG4gIC8vIG1ha2UzIHRoZSBtb2RhbCB2aXNpYmxlLiAgYmluZCBldmVudHMgYW5kIGVsZW1lbnRzLlxyXG4gIGRpc3BsYXkoKSB7XHJcbiAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ3Nob3dBdHRyaWJ1dGVEaWFsb2cnKTtcclxuICAgIHRoaXMuYmluZENvbXBvbmVudHMoKTtcclxuICAgIHRoaXMuYmluZEVsZW1lbnRzKCk7XHJcbiAgICB0aGlzLmFwcGx5RGlzcGxheU9wdGlvbnMoKTtcclxuICAgIHRoaXMuaW5pdGlhbFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAgIC8vICMjIyBiaW5kRWxlbWVudHNcclxuICAvLyBiaW5nIHRoZSBnZW5lcmljIGNvbnRyb2xzIGluIG1vc3QgZGlhbG9ncy5cclxuICBiaW5kRWxlbWVudHMoKSB7XHJcbiAgICB2YXIgZGdEb20gPSB0aGlzLmRnRG9tO1xyXG4gICAgJChkZ0RvbS5lbGVtZW50KS5maW5kKCcub2stYnV0dG9uJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgdGhpcy52aWV3Lmdyb3VwVW5kbyhmYWxzZSk7XHJcbiAgICAgIHRoaXMuY29tbWl0KCk7XHJcbiAgICAgIHRoaXMuY29tcGxldGUoKTtcclxuICAgIH0pO1xyXG4gICAgJChkZ0RvbS5lbGVtZW50KS5maW5kKCcuY2FuY2VsLWJ1dHRvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMudmlldy5ncm91cFVuZG8oZmFsc2UpO1xyXG4gICAgICBpZiAodGhpcy5tb2RpZmllcikge1xyXG4gICAgICAgIHRoaXMubW9kaWZpZXIuY2FuY2VsKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jb21wbGV0ZSgpO1xyXG4gICAgfSk7XHJcbiAgICAkKGRnRG9tLmVsZW1lbnQpLmZpbmQoJy5yZW1vdmUtYnV0dG9uJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgdGhpcy52aWV3Lmdyb3VwVW5kbyhmYWxzZSk7XHJcbiAgICAgIHRoaXMuY29tcGxldGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBiaW5kQ29tcG9uZW50cygpIHtcclxuICAgIHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKChjb21wb25lbnQpID0+IHtcclxuICAgICAgY29tcG9uZW50LmJpbmQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBpbml0aWFsVmFsdWUoKXtcclxuICAgIGlmICh0aGlzLm1vZGlmaWVyID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuYm91bmRDb21wb25lbnRzLmZvckVhY2goKGNvbXApID0+IHtcclxuICAgICAgKGNvbXAgYXMgYW55KS5zZXRWYWx1ZSgodGhpcy5tb2RpZmllciBhcyBhbnkpW2NvbXAuc21vTmFtZV0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGNoYW5nZWQoKSB7XHJcbiAgICBpZiAodGhpcy5tb2RpZmllciA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmJvdW5kQ29tcG9uZW50cy5mb3JFYWNoKChjb21wKSA9PiB7XHJcbiAgICAgIGlmIChjb21wLmNoYW5nZUZsYWcpIHtcclxuICAgICAgICAodGhpcy5tb2RpZmllciBhcyBhbnkpW2NvbXAuc21vTmFtZV0gPSAoY29tcCBhcyBhbnkpLmdldFZhbHVlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBnZXRJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuaWQ7XHJcbiAgfVxyXG4gIGdldE1vZGlmaWVyKCkgOiBTbW9Nb2RpZmllciB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kaWZpZXIgPz8gbnVsbDtcclxuICB9XHJcbiAgZ2V0RXZlbnRTb3VyY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5ldmVudFNvdXJjZTtcclxuICB9XHJcbiAgZ2V0U3RhdGljVGV4dCgpIHtcclxuICAgIHJldHVybiBTdWlEaWFsb2dCYXNlLmdldFN0YXRpY1RleHQodGhpcy5zdGF0aWNUZXh0KTtcclxuICB9XHJcbiAgYXN5bmMgY29tbWl0KCk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gUHJvbWlzZUhlbHBlcnMuZW1wdHlQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGdldCBjbG9zZU1vZGFsUHJvbWlzZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2xvc2VEaWFsb2dQcm9taXNlO1xyXG4gIH1cclxuICAvLyAjIyMgcG9zaXRpb25cclxuICAvLyBGb3IgZGlhbG9ncyBiYXNlZCBvbiBzZWxlY3Rpb25zLCB0cmllcyB0byBwbGFjZSB0aGUgZGlhbG9nIG5lYXIgdGhlIHNlbGVjdGlvbiBhbmQgYWxzb1xyXG4gIC8vIHRvIHNjcm9sbCBzbyB0aGUgZGlhbG9nIGlzIGluIHZpZXdcclxuICBzdGF0aWMgcG9zaXRpb24oYm94OiBTdmdCb3gsIGRnRG9tOiBEaWFsb2dEb20sIHNjcm9sbGVyOiBTdWlTY3JvbGxlcikge1xyXG4gICAgbGV0IHkgPSAoYm94LnkgKyBib3guaGVpZ2h0KSAtIHNjcm9sbGVyLm5ldFNjcm9sbC55O1xyXG4gICAgbGV0IHggPSAwO1xyXG5cclxuICAgIC8vIFRPRE86IGFkanVzdCBpZiBkYiBpcyBjbGlwcGVkIGJ5IHRoZSBicm93c2VyLlxyXG4gICAgY29uc3QgZGdlID0gJChkZ0RvbS5lbGVtZW50KS5maW5kKCcuYXR0cmlidXRlTW9kYWwnKTtcclxuICAgIGNvbnN0IGRnZUhlaWdodDogbnVtYmVyID0gJChkZ2UpLmhlaWdodCgpO1xyXG4gICAgY29uc3QgbWF4WTogbnVtYmVyID0gJCgnI3Ntby1zY3JvbGwtcmVnaW9uJykuaGVpZ2h0KCk7XHJcbiAgICBjb25zdCBtYXhYOiBudW1iZXIgPSAkKCcjc21vLXNjcm9sbC1yZWdpb24nKS53aWR0aCgpO1xyXG4gICAgY29uc3Qgb2Zmc2V0OiBhbnkgPSAkKCcuZG9tLWNvbnRhaW5lcicpLm9mZnNldCgpO1xyXG4gICAgeSA9IHkgLSAob2Zmc2V0LnRvcCBhcyBudW1iZXIpO1xyXG5cclxuICAgIGNvbnN0IG9mZnNldFkgPSBkZ2VIZWlnaHQgKyB5ID4gd2luZG93LmlubmVySGVpZ2h0ID8gKGRnZUhlaWdodCArIHkpIC0gd2luZG93LmlubmVySGVpZ2h0IDogMDtcclxuICAgIHkgPSAoeSA8IDApID8gLXkgOiB5IC0gb2Zmc2V0WTtcclxuXHJcbiAgICB5ID0gKHkgPiBtYXhZIHx8IHkgPCAwKSA/IG1heFkgLyAyIDogeTtcclxuXHJcbiAgICAkKGRnZSkuY3NzKCd0b3AnLCAnJyArIHkgKyAncHgnKTtcclxuXHJcbiAgICB4ID0gYm94LnggLSBzY3JvbGxlci5uZXRTY3JvbGwueDtcclxuICAgIHggPSB4IC0gKG9mZnNldC5sZWZ0IGFzIG51bWJlcik7XHJcbiAgICBjb25zdCB3OiBudW1iZXIgPSAkKGRnZSkud2lkdGgoKTtcclxuICAgIHggPSAoeCA+IHdpbmRvdy5pbm5lcldpZHRoIC8gMikgPyB4IC0gKHcgKyAyNSkgOiB4ICsgKHcgKyAyNSk7XHJcblxyXG4gICAgeCA9ICh4IDwgMCB8fCB4ID4gbWF4WCkgPyBtYXhYIC8gMiA6IHg7XHJcbiAgICAkKGRnZSkuY3NzKCdsZWZ0JywgJycgKyB4ICsgJ3B4Jyk7XHJcbiAgfVxyXG4gIGdldFZpZXcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy52aWV3O1xyXG4gIH1cclxuICBhcHBseURpc3BsYXlPcHRpb25zKCkge1xyXG4gICAgJCgnYm9keScpLmFkZENsYXNzKCdzaG93QXR0cmlidXRlRGlhbG9nJyk7XHJcbiAgICB0aGlzLmRpc3BsYXlPcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xyXG4gICAgICAodGhpcyBhcyBhbnkpW1N1aURpYWxvZ0Jhc2UuZGlzcGxheU9wdGlvbnNbb3B0aW9uXV0oKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyAjIyMgcG9zaXRpb25cclxuICAvLyBQb3NpdGlvbiB0aGUgZGlhbG9nIG5lYXIgYSBzZWxlY3Rpb24uICBJZiB0aGUgZGlhbG9nIGlzIG5vdCB2aXNpYmxlIGR1ZVxyXG4gIC8vIHRvIHNjcm9sbGluZywgbWFrZSBzdXJlIGl0IGlzIHZpc2libGUuXHJcbiAgcG9zaXRpb24oYm94OiBTdmdCb3gpIHtcclxuICAgIFN1aURpYWxvZ0Jhc2UucG9zaXRpb24oYm94LCB0aGlzLmRnRG9tLCB0aGlzLnZpZXcudHJhY2tlci5zY3JvbGxlcik7XHJcbiAgfVxyXG4gIGhpZGVSZW1vdmVCdXR0b24oKSB7XHJcbiAgICAkKHRoaXMuZGdEb20uZWxlbWVudCkuZmluZCgnLnJlbW92ZS1idXR0b24nKS5yZW1vdmUoKTtcclxuICB9XHJcbiAgLy8gIyMjIHBvc2l0aW9uTW9kaWZpZXIoKVxyXG4gIHBvc2l0aW9uRnJvbU1vZGlmaWVyKCkge1xyXG4gICAgaWYgKCF0aGlzLm1vZGlmaWVyIHx8IHRoaXMubW9kaWZpZXIubG9naWNhbEJveCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnBvc2l0aW9uR2xvYmFsbHkoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGFnZUNvbnRleHQgPSB0aGlzLnZpZXcucmVuZGVyZXIucGFnZU1hcC5nZXRSZW5kZXJlckZyb21Nb2RpZmllcih0aGlzLm1vZGlmaWVyKTtcclxuICAgIGNvbnN0IHNjcmVlbkJveCA9IHRoaXMudmlldy5yZW5kZXJlci5wYWdlTWFwLnN2Z1RvQ2xpZW50KHRoaXMubW9kaWZpZXIubG9naWNhbEJveCk7XHJcbiAgICB0aGlzLnBvc2l0aW9uKHNjcmVlbkJveCk7XHJcbiAgfVxyXG4gIC8vICMjIyBwb3NpdGlvbkdsb2JhbGx5XHJcbiAgLy8gcG9zaXRpb24gdGhlIGRpYWxvZyBib3ggaW4gdGhlIGNlbnRlciBvZiB0aGUgY3VycmVudCBzY3JvbGwgcmVnaW9uXHJcbiAgcG9zaXRpb25HbG9iYWxseSgpIHtcclxuICAgIGNvbnN0IGJveCA9IFN2Z0hlbHBlcnMuYm94UG9pbnRzKDI1MCwgMjUwLCAxLCAxKTtcclxuICAgIFN1aURpYWxvZ0Jhc2UucG9zaXRpb24oYm94LCB0aGlzLmRnRG9tLCB0aGlzLnZpZXcudHJhY2tlci5zY3JvbGxlcik7XHJcbiAgfVxyXG4gIC8vICMjIyBwb3N0aW9uRnJvbVNlbGVjdGlvblxyXG4gIC8vIHNldCBpbml0aWFsIHBvc2l0aW9uIG9mIGRpYWxvZyBiYXNlZCBvbiBmaXJzdCBzZWxlY3Rpb25cclxuICBwb3NpdGlvbkZyb21TZWxlY3Rpb24oKSB7XHJcbiAgICBjb25zdCBub3RlOiBTbW9Ob3RlIHwgbnVsbCA9IHRoaXMudmlldy50cmFja2VyLnNlbGVjdGlvbnNbMF0ubm90ZTtcclxuICAgIGlmIChub3RlICYmIG5vdGUubG9naWNhbEJveCkge1xyXG4gICAgICBjb25zdCBzY3JlZW5Cb3ggPSB0aGlzLnZpZXcucmVuZGVyZXIucGFnZU1hcC5zdmdUb0NsaWVudChub3RlLmxvZ2ljYWxCb3gpO1xyXG4gICAgICB0aGlzLnBvc2l0aW9uKHNjcmVlbkJveCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vICMjIyBidWlsZCB0aGUgaHRtbCBmb3IgdGhlIGRpYWxvZywgYmFzZWQgb24gdGhlIGluc3RhbmNlLXNwZWNpZmljIGNvbXBvbmVudHMuXHJcbiAgX2NvbnN0cnVjdERpYWxvZyhkaWFsb2dFbGVtZW50czogRGlhbG9nRGVmaW5pdGlvbiwgcGFyYW1ldGVyczogU3VpRG9tUGFyYW1zKSB7XHJcbiAgICBjcmVhdGVUb3BEb21Db250YWluZXIoJy5hdHRyaWJ1dGVEaWFsb2cnKTtcclxuICAgIGNvbnN0IGlkID0gcGFyYW1ldGVycy5pZDtcclxuICAgICBjb25zdCBiID0gYnVpbGREb207XHJcbiAgICBjb25zdCByID0gYignZGl2JykuY2xhc3NlcygnYXR0cmlidXRlTW9kYWwnKS5hdHRyKCdpZCcsICdhdHRyLW1vZGFsLScgKyBpZClcclxuICAgICAgLmNzcygndG9wJywgcGFyYW1ldGVycy50b3AgKyAncHgnKS5jc3MoJ2xlZnQnLCBwYXJhbWV0ZXJzLmxlZnQgKyAncHgnKVxyXG4gICAgICAuYXBwZW5kKGIoJ3NwYW5iJykuY2xhc3NlcygnZHJhZ2dhYmxlIGJ1dHRvbicpLmFwcGVuZChiKCdzcGFuJykuY2xhc3NlcygnaWNvbiBpY29uLW1vdmUganNEYk1vdmUnKSkpXHJcbiAgICAgIC5hcHBlbmQoYignaDInKS5jbGFzc2VzKCdkaWFsb2ctbGFiZWwnKS50ZXh0KHRoaXMubGFiZWwpKTtcclxuXHJcbiAgICB2YXIgY3RybCA9IGIoJ2RpdicpLmNsYXNzZXMoJ3Ntb0NvbnRyb2xDb250YWluZXInKTtcclxuICAgIGRpYWxvZ0VsZW1lbnRzLmVsZW1lbnRzLmZpbHRlcigoZGUpID0+IGRlLmNvbnRyb2wpLmZvckVhY2goKGRlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSBkZS5jbGFzc2VzID8gZGUuY2xhc3NlcyA6ICcnO1xyXG4gICAgICBjb25zdCBjb21wUGFyYW1zOiBTdWlCYXNlQ29tcG9uZW50UGFyYW1zID0ge1xyXG4gICAgICAgIGNsYXNzZXMsIGlkOiBpZCArIGRlLnNtb05hbWUsIC4uLmRlXHJcbiAgICAgIH1cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBjb250cm9sOiBTdWlDb21wb25lbnRCYXNlID0gU21vRHluYW1pY0NvbXBvbmVudEN0b3JbZGUuY29udHJvbF0odGhpcywgY29tcFBhcmFtcyk7XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29udHJvbCk7XHJcbiAgICAgICAgdGhpcy5jbWFwW2RlLnNtb05hbWUgKyAnQ3RybCddID0gY29udHJvbDtcclxuICAgICAgICBjdHJsLmFwcGVuZChjb250cm9sLmh0bWwpO1xyXG4gICAgICB9IGNhdGNoIChleHApIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdiYWQgY3RvciAnICsgZGUuc21vTmFtZSk7XHJcbiAgICAgICAgdGhyb3coZXhwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByLmFwcGVuZChjdHJsKTtcclxuICAgIHIuYXBwZW5kKFxyXG4gICAgICBiKCdkaXYnKS5jbGFzc2VzKCdidXR0b25Db250YWluZXInKS5hcHBlbmQoXHJcbiAgICAgICAgYignYnV0dG9uJykuY2xhc3Nlcygnb2stYnV0dG9uIGJ1dHRvbi1sZWZ0IGJ0biBidG4tcHJpbWFyeScpLnRleHQoJ09LJykpLmFwcGVuZChcclxuICAgICAgICBiKCdidXR0b24nKS5jbGFzc2VzKCdjYW5jZWwtYnV0dG9uIGJ1dHRvbi1jZW50ZXIgYnRuIGJ0bi1zZWNvbmRhcnknKS50ZXh0KCdDYW5jZWwnKSkuYXBwZW5kKFxyXG4gICAgICAgIGIoJ2J1dHRvbicpLmNsYXNzZXMoJ3JlbW92ZS1idXR0b24gYnV0dG9uLXJpZ2h0IGJ0biBidG4tc2Vjb25kYXJ5JykudGV4dCgnUmVtb3ZlJykuYXBwZW5kKFxyXG4gICAgICAgICAgYignc3BhbicpLmNsYXNzZXMoJ2ljb24gaWNvbi1jYW5jZWwtY2lyY2xlJykpKSk7XHJcbiAgICAkKCcuYXR0cmlidXRlRGlhbG9nJykuaHRtbCgnJyk7XHJcblxyXG4gICAgJCgnLmF0dHJpYnV0ZURpYWxvZycpLmFwcGVuZChyLmRvbSgpKTtcclxuXHJcbiAgICBjb25zdCB0cmFwcGVyID0gbmV3IElucHV0VHJhcHBlcignLmF0dHJpYnV0ZURpYWxvZycpO1xyXG4gICAgdHJhcHBlci50cmFwKCk7XHJcbiAgICAkKCcuYXR0cmlidXRlRGlhbG9nJykuZmluZCgnLmNhbmNlbC1idXR0b24nKS5mb2N1cygpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZWxlbWVudDogJCgnLmF0dHJpYnV0ZURpYWxvZycpLFxyXG4gICAgICB0cmFwcGVyXHJcbiAgICB9O1xyXG4gIH1cclxuICAvLyAjIyMgQ29tcGxldGVcclxuICAvLyBEaWFsb2dzIHRha2Ugb3ZlciB0aGUga2V5Ym9hcmQsIHNvIHJlbGVhc2UgdGhhdCBhbmQgdHJpZ2dlciBhbiBldmVudFxyXG4gIC8vIHRoYXQgdGhlIGRpYWxvZyBpcyBjbG9zaW5nIHRoYXQgY2FuIHJlc29sdmUgYW55IG91dHN0YW5kaW5nIHByb21pc2VzLlxyXG4gIGNvbXBsZXRlKCkge1xyXG4gICAgaWYgKHRoaXMuYm91bmRLZXlib2FyZCAmJiB0aGlzLmtleWRvd25IYW5kbGVyKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRTb3VyY2UudW5iaW5kS2V5ZG93bkhhbmRsZXIodGhpcy5rZXlkb3duSGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3Nob3dBdHRyaWJ1dGVEaWFsb2cnKTtcclxuICAgICQoJ2JvZHknKS50cmlnZ2VyKCdkaWFsb2dEaXNtaXNzJyk7XHJcbiAgICB0aGlzLmRnRG9tLnRyYXBwZXIuY2xvc2UoKTtcclxuICB9XHJcbiAgLy8gIyMjIG1ha2VEcmFnZ2FibGVcclxuICAvLyBnZW5lcmljIGNvZGUgdG8gbWFrZSB0aGUgZGlhbG9nIGJveCBkcmFnZ2FibGUgc28gaXQgZG9lc24ndFxyXG4gIC8vIGdldCBpbiBmcm9udCBvZiBzdHVmZi5cclxuICBtYWtlRHJhZ2dhYmxlKCkge1xyXG4gICAgY3JlYXRlVG9wRG9tQ29udGFpbmVyKCcuZHJhZ2FuaW1lJyk7XHJcbiAgICBjb25zdCBjYiA9ICgpID0+IHsgfTtcclxuICAgIGRyYWdnYWJsZSh7XHJcbiAgICAgIHBhcmVudDogJCh0aGlzLmRnRG9tLmVsZW1lbnQpLmZpbmQoJy5hdHRyaWJ1dGVNb2RhbCcpLFxyXG4gICAgICBoYW5kbGU6ICQodGhpcy5kZ0RvbS5lbGVtZW50KS5maW5kKCcuanNEYk1vdmUnKSxcclxuICAgICAgYW5pbWF0ZURpdjogJy5kcmFnYW5pbWUnLFxyXG4gICAgICBjYixcclxuICAgICAgbW92ZVBhcmVudDogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8vICMjIyBjYXB0dXJlS2V5Ym9hcmRQcm9taXNlXHJcbiAgLy8gY2FwdHVyZSBrZXlib2FyZCBldmVudHMgdW50aWwgdGhlIGRpYWxvZyBjbG9zZXMsXHJcbiAgLy8gdGhlbiBnaXZlIGNvbnRyb2wgYmFjayB0byB0aGUgY3VycmVudCBrZXlib2FyZFxyXG4gIGFzeW5jIGNhcHR1cmVLZXlib2FyZFByb21pc2UoKSB7XHJcbiAgICBpZiAoISh0aGlzLnN0YXJ0UHJvbWlzZSkpIHtcclxuICAgICAgdGhpcy5jb21wbGV0ZU5vdGlmaWVyLnVuYmluZEtleWJvYXJkRm9yTW9kYWwodGhpcyk7XHJcbiAgICAgIHRoaXMuYmluZEtleWJvYXJkKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnN0YXJ0UHJvbWlzZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0UHJvbWlzZTtcclxuICAgICAgdGhpcy5jb21wbGV0ZU5vdGlmaWVyLnVuYmluZEtleWJvYXJkRm9yTW9kYWwodGhpcyk7XHJcbiAgICAgIHRoaXMuYmluZEtleWJvYXJkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAjIyMgaGFuZGxlS2V5ZG93blxyXG4gIC8vIGFsbG93IGEgZGlhbG9nIHRvIGJlIGRpc21pc3NlZCBieSBlc2MuXHJcbiAgZXZLZXkoZXZkYXRhOiBhbnkpIHtcclxuICAgIGlmIChldmRhdGEua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAkKHRoaXMuZGdEb20uZWxlbWVudCkuZmluZCgnLmNhbmNlbC1idXR0b24nKS5jbGljaygpO1xyXG4gICAgICBldmRhdGEucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vICMjIyBiaW5kS2V5Ym9hcmRcclxuICAvLyBnZW5lcmljIGxvZ2ljIHRvIGdyYWIga2V5Ym9hcmQgZWxlbWVudHMgZm9yIG1vZGFsXHJcbiAgYmluZEtleWJvYXJkKCkge1xyXG4gICAgY29uc3QgZXZrZXkgPSBhc3luYyAoZXY6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmV2S2V5KGV2KTsgXHJcbiAgICB9XHJcbiAgICB0aGlzLmJvdW5kS2V5Ym9hcmQgPSB0cnVlO1xyXG4gICAgdGhpcy5rZXlkb3duSGFuZGxlciA9IHRoaXMuZXZlbnRTb3VyY2UuYmluZEtleWRvd25IYW5kbGVyKGV2a2V5KTtcclxuICB9XHJcbn1cclxuLyoqXHJcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uc1xyXG4gKiBAcGFyYW0gdHlwZSBcclxuICogQHBhcmFtIHBhcmFtZXRlcnMgXHJcbiAqIEByZXR1cm5zIGEgbmV3IGRpYWxvZyBvZiB0eXBlIFRcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRpYWxvZ0NvbnN0cnVjdG9yPFQgZXh0ZW5kcyBTdWlEaWFsb2dCYXNlPih0eXBlOiB7IG5ldyhwYXJhbWV0ZXJzOiBTdWlEaWFsb2dQYXJhbXMpOiBUOyB9LCBwYXJhbWV0ZXJzOiBTdWlEaWFsb2dQYXJhbXMgKTogVCB7XHJcbiAgcmV0dXJuIG5ldyB0eXBlKHBhcmFtZXRlcnMpO1xyXG59XHJcbi8qKlxyXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBkaXNwbGF5IGEgZGlhbG9nXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICogQHBhcmFtIGN0b3IgXHJcbiAqIEBwYXJhbSBwYXJhbWV0ZXJzIFxyXG4gKiBAcmV0dXJucyBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBbmREaXNwbGF5RGlhbG9nPFQgZXh0ZW5kcyBTdWlEaWFsb2dCYXNlPihjdG9yOiBuZXcgKHBhcmFtZXRlcnM6IFN1aURpYWxvZ1BhcmFtcykgPT4gVCwgcGFyYW1ldGVyczogU3VpRGlhbG9nUGFyYW1zKTogVCB7XHJcbiAgY29uc3QgaW5zdGFuY2U6IFQgPSBkaWFsb2dDb25zdHJ1Y3RvcjxUPihjdG9yLCBwYXJhbWV0ZXJzKTtcclxuICBpbnN0YW5jZS5kaXNwbGF5KCk7XHJcbiAgcmV0dXJuIGluc3RhbmNlO1xyXG59XHJcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/dialogs/dialog.ts\n\n}");
3839
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DialogTranslations: () => (/* binding */ DialogTranslations),\n/* harmony export */ InstallDialog: () => (/* binding */ InstallDialog),\n/* harmony export */ SuiDialogBase: () => (/* binding */ SuiDialogBase),\n/* harmony export */ createAndDisplayDialog: () => (/* binding */ createAndDisplayDialog),\n/* harmony export */ dialogConstructor: () => (/* binding */ dialogConstructor),\n/* harmony export */ suiDialogTranslate: () => (/* binding */ suiDialogTranslate)\n/* harmony export */ });\n/* harmony import */ var _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../render/sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _components_baseComponent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/baseComponent */ \"./src/ui/dialogs/components/baseComponent.ts\");\n/* harmony import */ var _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../common/promiseHelpers */ \"./src/common/promiseHelpers.ts\");\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _navigation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../navigation */ \"./src/ui/navigation.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 * The key/mouse event handlers take this as a parameter when we are switching control\n * of the input, due to a modal menu or dialog.\n */\nclass closeModalPromiser {\n constructor(closeEvent) {\n this.createUnbindPromise = () => __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve) => {\n (0,vue__WEBPACK_IMPORTED_MODULE_4__.watch)(this.closeEvent, () => {\n resolve();\n });\n });\n });\n this.closeEvent = closeEvent;\n this.closeModalPromise = this.createUnbindPromise();\n }\n}\n;\n/**\n * The callbacks can be confusing. Dialog CB button calls this callback,\n * which in turn calls the user-supplied callback, and then hides the dialog.\n * params.commitCb is the supplied callback,\n * but appParams.commitCb is set to this function.\n * @param params\n */\nconst InstallDialog = (params) => __awaiter(void 0, void 0, void 0, function* () {\n // If the dialog is raised from another dialog or menu that hasn't closed, wait for it\n // to close. This is required so we can keep keyboard/mouse event manager in sync.\n if (params.dialogParams.startPromise) {\n yield params.dialogParams.startPromise;\n }\n const complete = (0,vue__WEBPACK_IMPORTED_MODULE_4__.ref)(false);\n const trapper = new _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__.InputTrapper('#vue-modal-container');\n trapper.trap();\n const commitCb = () => __awaiter(void 0, void 0, void 0, function* () {\n complete.value = true;\n yield params.commitCb();\n trapper.close();\n _navigation__WEBPACK_IMPORTED_MODULE_5__.SuiNavigation.instance.hideDialogModal();\n });\n const cancelCb = () => __awaiter(void 0, void 0, void 0, function* () {\n complete.value = true;\n yield params.cancelCb();\n trapper.close();\n _navigation__WEBPACK_IMPORTED_MODULE_5__.SuiNavigation.instance.hideDialogModal();\n });\n const removeCb = () => __awaiter(void 0, void 0, void 0, function* () {\n if (params.removeCb) {\n yield params.removeCb();\n }\n trapper.close();\n _navigation__WEBPACK_IMPORTED_MODULE_5__.SuiNavigation.instance.hideDialogModal();\n complete.value = true;\n });\n $('#' + params.root).addClass('modal show fade');\n params.appParams.commitCb = commitCb;\n params.appParams.cancelCb = cancelCb;\n if (params.removeCb) {\n params.appParams.removeCb = removeCb;\n }\n (0,vue__WEBPACK_IMPORTED_MODULE_4__.createApp)(params.app, params.appParams).mount('#' + params.root);\n // allow a dialog to be dismissed by esc.\n const evKey = (evdata) => __awaiter(void 0, void 0, void 0, function* () {\n if (evdata.key === 'Escape') {\n cancelCb();\n evdata.preventDefault();\n }\n });\n // We take over he keyboard for the modal dialog so the user doesn't change the score\n // while typing into the dialog. the 'completeNotifier' takes it back when we are done\n params.dialogParams.completeNotifier.unbindKeyboardForModal(new closeModalPromiser(complete));\n params.dialogParams.eventSource.bindKeydownHandler(evKey);\n _navigation__WEBPACK_IMPORTED_MODULE_5__.SuiNavigation.instance.showDialogModal();\n /* const cb = () => { };\n draggable({\n parent: $('#' + params.root).find('.attributeModal'),\n handle: $('#' + params.root).find('.jsDbMove'),\n animateDiv: '.draganime',\n cb,\n moveParent: true\n });*/\n});\nconst DialogTranslations = [];\nconst suiDialogTranslate = (dialog, ctor) => {\n const elements = dialog.elements;\n const output = [];\n elements.forEach((element) => {\n var _a;\n const component = {};\n if (element.label) {\n component.label = (_a = element.label) !== null && _a !== void 0 ? _a : '';\n component.id = element.smoName;\n if (element.options) {\n component.options = [];\n element.options.forEach((option) => {\n component.options.push({ value: option.value, label: option.label, css: option.css });\n });\n }\n output.push(component);\n }\n });\n // convert static text from an array of name/value pairs to a record for translation\n const staticText = {};\n const dialogStaticText = dialog.staticText;\n if (dialogStaticText) {\n dialogStaticText.forEach((st) => {\n const key = Object.keys(st)[0];\n staticText[key] = st[key];\n });\n }\n return { ctor, label: dialog.label, dialogElements: output, staticText };\n};\n/**\n * Note: Most dialogs will inherit from SuiDialogAdapter, not SuiDialogBase.\n * You will only want to inherit from SuiDialogBase under 2 conditions:\n * 1. the dialog is triviailly simple, like an alert box that makes no changes to the score, or\n * 2. the dialog is extremely complicated in how it interacts with the user, such that a form-based approach won't work\n * @category SuiDialog\n */\nclass SuiDialogBase extends _components_baseComponent__WEBPACK_IMPORTED_MODULE_2__.SuiDialogNotifier {\n static get displayOptions() {\n return {\n BINDCOMPONENTS: 'bindComponents', DRAGGABLE: 'makeDraggable',\n KEYBOARD_CAPTURE: 'captureKeyboardPromise', GLOBALPOS: 'positionGlobally',\n SELECTIONPOS: 'positionFromSelection', MODIFIERPOS: 'positionFromModifier',\n HIDEREMOVE: 'hideRemoveButton'\n };\n }\n static getStaticText(staticText) {\n const rv = {};\n staticText.forEach((st) => {\n const key = Object.keys(st)[0];\n rv[key] = st[key];\n });\n return rv;\n }\n // ### SuiDialogBase ctor\n // Creates the DOM element for the dialog and gets some initial elements\n constructor(dialogElements, parameters) {\n super();\n this.components = [];\n this.boundComponents = [];\n this.cmap = {};\n this.staticText = [];\n this.displayOptions = ['BINDCOMPONENTS', 'DRAGGABLE', 'KEYBOARD_CAPTURE', 'GLOBALPOS', 'HIDEREMOVE'];\n this.keydownHandler = null;\n this.id = parameters.id;\n this.boundKeyboard = false;\n this.scroller = parameters.view.tracker.scroller;\n this.label = dialogElements.label;\n this.eventSource = parameters.eventSource;\n this.view = parameters.view;\n this.completeNotifier = parameters.completeNotifier;\n this.modifier = parameters.modifier;\n this.ctor = parameters.ctor;\n this.closeDialogPromise = new Promise((resolve) => {\n $('body').off('dialogDismiss').on('dialogDismiss', () => {\n resolve();\n });\n });\n this.staticText = dialogElements.staticText;\n // If this dialog was spawned by a menu, wait for the menu to dismiss\n // before continuing.\n // this.startPromise = parameters.closeMenuPromise;\n this.startPromise = parameters.startPromise;\n this.dialogElements = dialogElements;\n const left = $('#smo-scroll-region').offset().left + $('#smo-scroll-region').width() / 2;\n const top = $('#smo-scroll-region').offset().top + $('#smo-scroll-region').height() / 2;\n this.dgDom = this._constructDialog(dialogElements, {\n id: 'dialog-' + this.id,\n top,\n left,\n label: this.label\n });\n // SmoTranslator.registerDialog(this.ctor);\n }\n // ### display\n // make3 the modal visible. bind events and elements.\n display() {\n $('body').addClass('showAttributeDialog');\n this.bindComponents();\n this.bindElements();\n this.applyDisplayOptions();\n this.initialValue();\n }\n // ### bindElements\n // bing the generic controls in most dialogs.\n bindElements() {\n var dgDom = this.dgDom;\n $(dgDom.element).find('.ok-button').off('click').on('click', () => {\n this.view.groupUndo(false);\n this.commit();\n this.complete();\n });\n $(dgDom.element).find('.cancel-button').off('click').on('click', () => {\n this.view.groupUndo(false);\n if (this.modifier) {\n this.modifier.cancel();\n }\n this.complete();\n });\n $(dgDom.element).find('.remove-button').off('click').on('click', () => {\n this.view.groupUndo(false);\n this.complete();\n });\n }\n bindComponents() {\n this.components.forEach((component) => {\n component.bind();\n });\n }\n initialValue() {\n if (this.modifier === null) {\n return;\n }\n this.boundComponents.forEach((comp) => {\n comp.setValue(this.modifier[comp.smoName]);\n });\n }\n changed() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.modifier === null) {\n return;\n }\n this.boundComponents.forEach((comp) => {\n if (comp.changeFlag) {\n this.modifier[comp.smoName] = comp.getValue();\n }\n });\n });\n }\n getId() {\n return this.id;\n }\n getModifier() {\n var _a;\n return (_a = this.modifier) !== null && _a !== void 0 ? _a : null;\n }\n getEventSource() {\n return this.eventSource;\n }\n getStaticText() {\n return SuiDialogBase.getStaticText(this.staticText);\n }\n commit() {\n return __awaiter(this, void 0, void 0, function* () {\n return _common_promiseHelpers__WEBPACK_IMPORTED_MODULE_3__.PromiseHelpers.emptyPromise();\n });\n }\n get closeModalPromise() {\n return this.closeDialogPromise;\n }\n // ### position\n // For dialogs based on selections, tries to place the dialog near the selection and also\n // to scroll so the dialog is in view\n static position(box, dgDom, scroller) {\n let y = (box.y + box.height) - scroller.netScroll.y;\n let x = 0;\n // TODO: adjust if db is clipped by the browser.\n const dge = $(dgDom.element).find('.attributeModal');\n const dgeHeight = $(dge).height();\n const maxY = $('#smo-scroll-region').height();\n const maxX = $('#smo-scroll-region').width();\n const offset = $('.dom-container').offset();\n y = y - offset.top;\n const offsetY = dgeHeight + y > window.innerHeight ? (dgeHeight + y) - window.innerHeight : 0;\n y = (y < 0) ? -y : y - offsetY;\n y = (y > maxY || y < 0) ? maxY / 2 : y;\n $(dge).css('top', '' + y + 'px');\n x = box.x - scroller.netScroll.x;\n x = x - offset.left;\n const w = $(dge).width();\n x = (x > window.innerWidth / 2) ? x - (w + 25) : x + (w + 25);\n x = (x < 0 || x > maxX) ? maxX / 2 : x;\n $(dge).css('left', '' + x + 'px');\n }\n getView() {\n return this.view;\n }\n applyDisplayOptions() {\n $('body').addClass('showAttributeDialog');\n this.displayOptions.forEach((option) => {\n this[SuiDialogBase.displayOptions[option]]();\n });\n }\n // ### position\n // Position the dialog near a selection. If the dialog is not visible due\n // to scrolling, make sure it is visible.\n position(box) {\n SuiDialogBase.position(box, this.dgDom, this.view.tracker.scroller);\n }\n hideRemoveButton() {\n $(this.dgDom.element).find('.remove-button').remove();\n }\n // ### positionModifier()\n positionFromModifier() {\n if (!this.modifier || this.modifier.logicalBox === null) {\n this.positionGlobally();\n return;\n }\n const pageContext = this.view.renderer.pageMap.getRendererFromModifier(this.modifier);\n const screenBox = this.view.renderer.pageMap.svgToClient(this.modifier.logicalBox);\n this.position(screenBox);\n }\n // ### positionGlobally\n // position the dialog box in the center of the current scroll region\n positionGlobally() {\n const box = _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_0__.SvgHelpers.boxPoints(250, 250, 1, 1);\n SuiDialogBase.position(box, this.dgDom, this.view.tracker.scroller);\n }\n // ### postionFromSelection\n // set initial position of dialog based on first selection\n positionFromSelection() {\n const note = this.view.tracker.selections[0].note;\n if (note && note.logicalBox) {\n const screenBox = this.view.renderer.pageMap.svgToClient(note.logicalBox);\n this.position(screenBox);\n }\n }\n // ### build the html for the dialog, based on the instance-specific components.\n _constructDialog(dialogElements, parameters) {\n (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__.createTopDomContainer)('.attributeDialog');\n const id = parameters.id;\n const b = _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__.buildDom;\n const r = b('div').classes('attributeModal').attr('id', 'attr-modal-' + id)\n .css('top', parameters.top + 'px').css('left', parameters.left + 'px')\n .append(b('spanb').classes('draggable button').append(b('span').classes('icon icon-move jsDbMove')))\n .append(b('h2').classes('dialog-label').text(this.label));\n var ctrl = b('div').classes('smoControlContainer');\n dialogElements.elements.filter((de) => de.control).forEach((de) => {\n const classes = de.classes ? de.classes : '';\n const compParams = Object.assign({ classes, id: id + de.smoName }, de);\n try {\n const control = _components_baseComponent__WEBPACK_IMPORTED_MODULE_2__.SmoDynamicComponentCtor[de.control](this, compParams);\n this.components.push(control);\n this.cmap[de.smoName + 'Ctrl'] = control;\n ctrl.append(control.html);\n }\n catch (exp) {\n console.error('bad ctor ' + de.smoName);\n throw (exp);\n }\n });\n r.append(ctrl);\n r.append(b('div').classes('buttonContainer').append(b('button').classes('ok-button button-left btn btn-primary').text('OK')).append(b('button').classes('cancel-button button-center btn btn-secondary').text('Cancel')).append(b('button').classes('remove-button button-right btn btn-secondary').text('Remove').append(b('span').classes('icon icon-cancel-circle'))));\n $('.attributeDialog').html('');\n $('.attributeDialog').append(r.dom());\n const trapper = new _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__.InputTrapper('.attributeDialog');\n trapper.trap();\n $('.attributeDialog').find('.cancel-button').focus();\n return {\n element: $('.attributeDialog'),\n trapper\n };\n }\n // ### Complete\n // Dialogs take over the keyboard, so release that and trigger an event\n // that the dialog is closing that can resolve any outstanding promises.\n complete() {\n if (this.boundKeyboard && this.keydownHandler) {\n this.eventSource.unbindKeydownHandler(this.keydownHandler);\n }\n $('body').removeClass('showAttributeDialog');\n $('body').trigger('dialogDismiss');\n this.dgDom.trapper.close();\n }\n // ### makeDraggable\n // generic code to make the dialog box draggable so it doesn't\n // get in front of stuff.\n makeDraggable() {\n (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__.createTopDomContainer)('.draganime');\n const cb = () => { };\n (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_1__.draggable)({\n parent: $(this.dgDom.element).find('.attributeModal'),\n handle: $(this.dgDom.element).find('.jsDbMove'),\n animateDiv: '.draganime',\n cb,\n moveParent: true\n });\n }\n // ### captureKeyboardPromise\n // capture keyboard events until the dialog closes,\n // then give control back to the current keyboard\n captureKeyboardPromise() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!(this.startPromise)) {\n this.completeNotifier.unbindKeyboardForModal(this);\n this.bindKeyboard();\n return;\n }\n if (this.startPromise) {\n yield this.startPromise;\n this.completeNotifier.unbindKeyboardForModal(this);\n this.bindKeyboard();\n }\n });\n }\n // ### handleKeydown\n // allow a dialog to be dismissed by esc.\n evKey(evdata) {\n if (evdata.key === 'Escape') {\n $(this.dgDom.element).find('.cancel-button').click();\n evdata.preventDefault();\n }\n }\n // ### bindKeyboard\n // generic logic to grab keyboard elements for modal\n bindKeyboard() {\n const evkey = (ev) => __awaiter(this, void 0, void 0, function* () {\n this.evKey(ev);\n });\n this.boundKeyboard = true;\n this.keydownHandler = this.eventSource.bindKeydownHandler(evkey);\n }\n}\n/**\n * Convenience functions\n * @param type\n * @param parameters\n * @returns a new dialog of type T\n * @category SuiDialog\n */\nfunction dialogConstructor(type, parameters) {\n return new type(parameters);\n}\n/**\n * Convenience function to display a dialog\n * @category SuiDialog\n * @param ctor\n * @param parameters\n * @returns\n */\nfunction createAndDisplayDialog(ctor, parameters) {\n const instance = dialogConstructor(ctor, parameters);\n instance.display();\n return instance;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdWkvZGlhbG9ncy9kaWFsb2cudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseURBQXlEO0FBQ3pELHlDQUF5QztBQUNnQjtBQUMyQztBQVU0QjtBQUtuRTtBQUNaO0FBQ0g7QUFJOUM7OztHQUdHO0FBQ0gsTUFBTSxrQkFBa0I7SUFVdEIsWUFBWSxVQUF3QjtRQVBwQyx3QkFBbUIsR0FBRyxHQUFTLEVBQUU7WUFDL0IsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNuQywwQ0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO29CQUMxQixPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQztRQUNKLENBQUM7UUFFQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDdEQsQ0FBQztDQUNGO0FBbUJBLENBQUM7QUFDRjs7Ozs7O0dBTUc7QUFDSSxNQUFNLGFBQWEsR0FBRyxDQUFPLE1BQTJCLEVBQUUsRUFBRTtJQUNqRSxzRkFBc0Y7SUFDdEYsbUZBQW1GO0lBQ25GLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE1BQU0sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO0lBQ3pDLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBaUIsd0NBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLDZEQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6RCxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZixNQUFNLFFBQVEsR0FBRyxHQUFTLEVBQUU7UUFDMUIsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDdEIsTUFBTSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEIsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hCLHNEQUFhLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxHQUFTLEVBQUU7UUFDMUIsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDdEIsTUFBTSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEIsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hCLHNEQUFhLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxHQUFTLEVBQUU7UUFDMUIsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEIsTUFBTSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQixzREFBYSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBQ0QsQ0FBQyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDakQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQ3JDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUNyQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQixNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDdkMsQ0FBQztJQUNELDhDQUFTLENBQUMsTUFBTSxDQUFDLEdBQVUsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFeEUseUNBQXlDO0lBQ3pDLE1BQU0sS0FBSyxHQUFHLENBQU8sTUFBVyxFQUFFLEVBQUU7UUFDbEMsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVCLFFBQVEsRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBQ0QscUZBQXFGO0lBQ3JGLHVGQUF1RjtJQUN2RixNQUFNLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM5RixNQUFNLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRCxzREFBYSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6Qzs7Ozs7OztTQU9LO0FBQ1AsQ0FBQztBQTJDTSxNQUFNLGtCQUFrQixHQUF3QixFQUFFLENBQUM7QUFnRG5ELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxNQUF3QixFQUFFLElBQVksRUFBcUIsRUFBRTtJQUM5RixNQUFNLFFBQVEsR0FBOEIsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUM1RCxNQUFNLE1BQU0sR0FBK0IsRUFBRSxDQUFDO0lBQzlDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFnQyxFQUFFLEVBQUU7O1FBQ3BELE1BQU0sU0FBUyxHQUFzQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsU0FBUyxDQUFDLEtBQUssR0FBRyxhQUFPLENBQUMsS0FBSyxtQ0FBSSxFQUFFLENBQUM7WUFDdEMsU0FBUyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQy9CLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNwQixTQUFTLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFFdkIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDakMsU0FBUyxDQUFDLE9BQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ3pGLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBcUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNILG9GQUFvRjtJQUNwRixNQUFNLFVBQVUsR0FBMkIsRUFBRSxDQUFDO0lBQzlDLE1BQU0sZ0JBQWdCLEdBQTZCLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDckUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JCLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQzlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDM0UsQ0FBQztBQUNEOzs7Ozs7R0FNRztBQUNLLE1BQWUsYUFBYyxTQUFRLHdFQUFpQjtJQUM1RCxNQUFNLEtBQUssY0FBYztRQUN2QixPQUFPO1lBQ0wsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxlQUFlO1lBQzVELGdCQUFnQixFQUFFLHdCQUF3QixFQUFFLFNBQVMsRUFBRSxrQkFBa0I7WUFDekUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxzQkFBc0I7WUFDMUUsVUFBVSxFQUFFLGtCQUFrQjtTQUMvQixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBb0M7UUFDdkQsTUFBTSxFQUFFLEdBQTJCLEVBQUUsQ0FBQztRQUN0QyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDeEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBb0JELHlCQUF5QjtJQUN6Qix3RUFBd0U7SUFDeEUsWUFBWSxjQUFnQyxFQUFFLFVBQTJCO1FBQ3ZFLEtBQUssRUFBRSxDQUFDO1FBbkJWLGVBQVUsR0FBdUIsRUFBRSxDQUFDO1FBQ3BDLG9CQUFlLEdBQXVCLEVBQUUsQ0FBQztRQUN6QyxTQUFJLEdBQXFDLEVBQUUsQ0FBQztRQUk1QyxlQUFVLEdBQTZCLEVBQUUsQ0FBQztRQVExQyxtQkFBYyxHQUFhLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMxRyxtQkFBYyxHQUF3QixJQUFJLENBQUM7UUFLekMsSUFBSSxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2pELElBQUksQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUU1QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUN0RCxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO2dCQUN0RCxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUM7UUFFNUMscUVBQXFFO1FBQ3JFLHFCQUFxQjtRQUNyQixtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBRTVDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBRXJDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUV4RixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUU7WUFDakQsRUFBRSxFQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRTtZQUN2QixHQUFHO1lBQ0gsSUFBSTtZQUNKLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztTQUNsQixDQUFDLENBQUM7UUFFSCwyQ0FBMkM7SUFDN0MsQ0FBQztJQUNDLGNBQWM7SUFDaEIsc0RBQXNEO0lBQ3RELE9BQU87UUFDTCxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVDLG1CQUFtQjtJQUNyQiw2Q0FBNkM7SUFDN0MsWUFBWTtRQUNWLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1lBQ2hFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztRQUNILENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1lBQ3BFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLENBQUM7WUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsY0FBYztRQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDcEMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDM0IsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ25DLElBQVksQ0FBQyxRQUFRLENBQUUsSUFBSSxDQUFDLFFBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0ssT0FBTzs7WUFDWCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzNCLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ25CLElBQUksQ0FBQyxRQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBSSxJQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2xFLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7S0FBQTtJQUNELEtBQUs7UUFDSCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUNELFdBQVc7O1FBQ1QsT0FBTyxVQUFJLENBQUMsUUFBUSxtQ0FBSSxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUNELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUNELGFBQWE7UUFDWCxPQUFPLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDSyxNQUFNOztZQUNWLE9BQU8sa0VBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN2QyxDQUFDO0tBQUE7SUFDRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsZUFBZTtJQUNmLHlGQUF5RjtJQUN6RixxQ0FBcUM7SUFDckMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFXLEVBQUUsS0FBZ0IsRUFBRSxRQUFxQjtRQUNsRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVWLGdEQUFnRDtRQUNoRCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sU0FBUyxHQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBVyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0RCxNQUFNLElBQUksR0FBVyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyRCxNQUFNLE1BQU0sR0FBUSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqRCxDQUFDLEdBQUcsQ0FBQyxHQUFJLE1BQU0sQ0FBQyxHQUFjLENBQUM7UUFFL0IsTUFBTSxPQUFPLEdBQUcsU0FBUyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUYsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUUvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFFakMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQyxHQUFHLENBQUMsR0FBSSxNQUFNLENBQUMsSUFBZSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxHQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFOUQsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFDRCxtQkFBbUI7UUFDakIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDcEMsSUFBWSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGVBQWU7SUFDZiwwRUFBMEU7SUFDMUUseUNBQXlDO0lBQ3pDLFFBQVEsQ0FBQyxHQUFXO1FBQ2xCLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELGdCQUFnQjtRQUNkLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFDRCx5QkFBeUI7SUFDekIsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBQ0QsdUJBQXVCO0lBQ3ZCLHFFQUFxRTtJQUNyRSxnQkFBZ0I7UUFDZCxNQUFNLEdBQUcsR0FBRyw4REFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRCxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCwyQkFBMkI7SUFDM0IsMERBQTBEO0lBQzFELHFCQUFxQjtRQUNuQixNQUFNLElBQUksR0FBbUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNsRSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUNELGdGQUFnRjtJQUNoRixnQkFBZ0IsQ0FBQyxjQUFnQyxFQUFFLFVBQXdCO1FBQ3pFLDBFQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDMUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLENBQUMsR0FBRyx5REFBUSxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsR0FBRyxFQUFFLENBQUM7YUFDeEUsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7YUFDckUsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7YUFDbkcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRTVELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNuRCxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ2hFLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxNQUFNLFVBQVUsbUJBQ2QsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sSUFBSyxFQUFFLENBQ3BDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFxQiw4RUFBdUIsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUN4RixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQztnQkFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4QyxNQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDYixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLE1BQU0sQ0FDTixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUN4QyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUMvRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLCtDQUErQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUMzRixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLDhDQUE4QyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FDdkYsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUvQixDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSw2REFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDckQsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2YsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckQsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLENBQUMsa0JBQWtCLENBQUM7WUFDOUIsT0FBTztTQUNSLENBQUM7SUFDSixDQUFDO0lBQ0QsZUFBZTtJQUNmLHVFQUF1RTtJQUN2RSx3RUFBd0U7SUFDeEUsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUNELENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFDRCxvQkFBb0I7SUFDcEIsOERBQThEO0lBQzlELHlCQUF5QjtJQUN6QixhQUFhO1FBQ1gsMEVBQXFCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEMsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLDhEQUFTLENBQUM7WUFDUixNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ3JELE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQy9DLFVBQVUsRUFBRSxZQUFZO1lBQ3hCLEVBQUU7WUFDRixVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsNkJBQTZCO0lBQzdCLG1EQUFtRDtJQUNuRCxpREFBaUQ7SUFDM0Msc0JBQXNCOztZQUMxQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BCLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7S0FBQTtJQUVELG9CQUFvQjtJQUNwQix5Q0FBeUM7SUFDekMsS0FBSyxDQUFDLE1BQVc7UUFDZixJQUFJLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckQsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO0lBQ25CLG9EQUFvRDtJQUNwRCxZQUFZO1FBQ1YsTUFBTSxLQUFLLEdBQUcsQ0FBTyxFQUFPLEVBQUUsRUFBRTtZQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkUsQ0FBQztDQUNGO0FBQ0Q7Ozs7OztHQU1HO0FBQ0ksU0FBUyxpQkFBaUIsQ0FBMEIsSUFBOEMsRUFBRSxVQUEyQjtJQUNwSSxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFDRDs7Ozs7O0dBTUc7QUFDSSxTQUFTLHNCQUFzQixDQUEwQixJQUE0QyxFQUFFLFVBQTJCO0lBQ3ZJLE1BQU0sUUFBUSxHQUFNLGlCQUFpQixDQUFJLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzRCxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy91aS9kaWFsb2dzL2RpYWxvZy50cz84MWRlIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG5pbXBvcnQgeyBTdmdIZWxwZXJzIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS9zdmdIZWxwZXJzJztcclxuaW1wb3J0IHsgYnVpbGREb20sIElucHV0VHJhcHBlciwgZHJhZ2dhYmxlLCBjcmVhdGVUb3BEb21Db250YWluZXIgfSBmcm9tICcuLi8uLi9jb21tb24vaHRtbEhlbHBlcnMnO1xyXG4vLyBpbXBvcnQgeyBTbW9UcmFuc2xhdG9yIH0gZnJvbSAnLi4vaTE4bi9sYW5ndWFnZSc7XHJcbmltcG9ydCB7IFNtb01vZGlmaWVyIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc2NvcmUnO1xyXG5pbXBvcnQgeyBTdmdCb3ggfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTdWlUcmFja2VyIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS90cmFja2VyJztcclxuaW1wb3J0IHsgU3VpU2NvcmVWaWV3T3BlcmF0aW9ucyB9IGZyb20gJy4uLy4uL3JlbmRlci9zdWkvc2NvcmVWaWV3T3BlcmF0aW9ucyc7XHJcbmltcG9ydCB7IENvbXBsZXRlTm90aWZpZXIgfSBmcm9tICcuLi9jb21tb24nO1xyXG5pbXBvcnQgeyBCcm93c2VyRXZlbnRTb3VyY2UgfSBmcm9tICcuLi9ldmVudFNvdXJjZSc7XHJcbmltcG9ydCB7IFVuZG9CdWZmZXIgfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vdW5kbyc7XHJcbmltcG9ydCB7IFN1aURpYWxvZ05vdGlmaWVyLCBEaWFsb2dEZWZpbml0aW9uRWxlbWVudCwgXHJcbiAgU3VpQ29tcG9uZW50QmFzZSwgRGlhbG9nRGVmaW5pdGlvbk9wdGlvbiwgU3VpQmFzZUNvbXBvbmVudFBhcmFtcywgU21vRHluYW1pY0NvbXBvbmVudEN0b3IgfSBmcm9tICcuL2NvbXBvbmVudHMvYmFzZUNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFN1aVNjcm9sbGVyIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS9zY3JvbGxlcic7XHJcbmltcG9ydCB7IFNtb05vdGUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9ub3RlJztcclxuaW1wb3J0IHsgRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vZXZlbnRTb3VyY2UnO1xyXG5pbXBvcnQgeyBTbW9VaUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgUHJvbWlzZUhlbHBlcnMgfSBmcm9tICcuLi8uLi9jb21tb24vcHJvbWlzZUhlbHBlcnMnO1xyXG5pbXBvcnQgeyBjcmVhdGVBcHAsIHJlZiwgUmVmLCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XHJcbmltcG9ydCB7IFN1aU5hdmlnYXRpb24gfSBmcm9tICcuLi9uYXZpZ2F0aW9uJztcclxuXHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcbi8qKlxyXG4gKiBUaGUga2V5L21vdXNlIGV2ZW50IGhhbmRsZXJzIHRha2UgdGhpcyBhcyBhIHBhcmFtZXRlciB3aGVuIHdlIGFyZSBzd2l0Y2hpbmcgY29udHJvbFxyXG4gKiBvZiB0aGUgaW5wdXQsIGR1ZSB0byBhIG1vZGFsIG1lbnUgb3IgZGlhbG9nLlxyXG4gKi9cclxuY2xhc3MgY2xvc2VNb2RhbFByb21pc2VyIHtcclxuICBjbG9zZU1vZGFsUHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcclxuICBjbG9zZUV2ZW50OiBSZWY8Ym9vbGVhbj47XHJcbiAgY3JlYXRlVW5iaW5kUHJvbWlzZSA9IGFzeW5jICgpID0+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICB3YXRjaCh0aGlzLmNsb3NlRXZlbnQsICgpID0+IHtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSlcclxuICB9XHJcbiAgY29uc3RydWN0b3IoY2xvc2VFdmVudDogUmVmPGJvb2xlYW4+KSB7XHJcbiAgICB0aGlzLmNsb3NlRXZlbnQgPSBjbG9zZUV2ZW50O1xyXG4gICAgdGhpcy5jbG9zZU1vZGFsUHJvbWlzZSA9IHRoaXMuY3JlYXRlVW5iaW5kUHJvbWlzZSgpO1xyXG4gIH1cclxufVxyXG5leHBvcnQgdHlwZSBEaWFsb2dDYWxsYmFjayA9ICgpID0+IFByb21pc2U8dm9pZD47XHJcbi8qKlxyXG4gKiBQYXJhbWV0ZXJzIGZvciBpbnN0YWxsaW5nIGEgZGlhbG9nLiAgVlVFLWJhc2VkIGRpYWxvZyBsb2dpYy5cclxuICogY29tcGxldGUgaXMgYSBSZWYgdGhhdCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHRoZSBkaWFsb2cgaXMgZmluaXNoZWQsIHVzZWQgdG8gXHJcbiAqIGhhbmQgb2ZmIGtleWJvYXJkIGNvbnRyb2wgYmV0d2VlbiBkaWFsb2dzIGFuZCBtZW51cy5cclxuICogYXBwIGlzIGEgVlVFIGFwcCwgYXBwUGFyYW1zIGFyZSB0aGUgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBhcHAuXHJcbiAqIHdlIG92ZXJyaWRlIGNvbW1pdENiLCBjYW5jZWxDYiwgYW5kIHJlbW92ZUNiIHRvIG1hbmFnZSB0aGUgZGlhbG9nIGxpZmV0aW1lLlxyXG4gKiByb290IGlzIHRoZSBET00gaWQgdG8gbW91bnQgdGhlIGRpYWxvZyBpbiAod2l0aG91dCB0aGUgJyMnKVxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nIFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBEaWFsb2dJbnN0YWxsUGFyYW1zIHtcclxuICByb290OiBzdHJpbmcsXHJcbiAgYXBwOiBhbnksIFxyXG4gIGFwcFBhcmFtczogYW55LFxyXG4gIGRpYWxvZ1BhcmFtczogU3VpRGlhbG9nUGFyYW1zLFxyXG4gIGNvbW1pdENiOiBEaWFsb2dDYWxsYmFjaywgXHJcbiAgY2FuY2VsQ2I6IERpYWxvZ0NhbGxiYWNrLFxyXG4gIHJlbW92ZUNiPzogRGlhbG9nQ2FsbGJhY2tcclxufTtcclxuLyoqXHJcbiAqIFRoZSBjYWxsYmFja3MgY2FuIGJlIGNvbmZ1c2luZy4gIERpYWxvZyBDQiBidXR0b24gY2FsbHMgdGhpcyBjYWxsYmFjaywgXHJcbiAqIHdoaWNoIGluIHR1cm4gY2FsbHMgdGhlIHVzZXItc3VwcGxpZWQgY2FsbGJhY2ssIGFuZCB0aGVuIGhpZGVzIHRoZSBkaWFsb2cuXHJcbiAqIHBhcmFtcy5jb21taXRDYiBpcyB0aGUgc3VwcGxpZWQgY2FsbGJhY2ssIFxyXG4gKiBidXQgYXBwUGFyYW1zLmNvbW1pdENiIGlzIHNldCB0byB0aGlzIGZ1bmN0aW9uLlxyXG4gKiBAcGFyYW0gcGFyYW1zIFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEluc3RhbGxEaWFsb2cgPSBhc3luYyAocGFyYW1zOiBEaWFsb2dJbnN0YWxsUGFyYW1zKSA9PiB7XHJcbiAgLy8gSWYgdGhlIGRpYWxvZyBpcyByYWlzZWQgZnJvbSBhbm90aGVyIGRpYWxvZyBvciBtZW51IHRoYXQgaGFzbid0IGNsb3NlZCwgd2FpdCBmb3IgaXRcclxuICAvLyB0byBjbG9zZS4gIFRoaXMgaXMgcmVxdWlyZWQgc28gd2UgY2FuIGtlZXAga2V5Ym9hcmQvbW91c2UgZXZlbnQgbWFuYWdlciBpbiBzeW5jLlxyXG4gIGlmIChwYXJhbXMuZGlhbG9nUGFyYW1zLnN0YXJ0UHJvbWlzZSkge1xyXG4gICAgYXdhaXQgcGFyYW1zLmRpYWxvZ1BhcmFtcy5zdGFydFByb21pc2U7XHJcbiAgfVxyXG4gIGNvbnN0IGNvbXBsZXRlOiBSZWY8Ym9vbGVhbj4gPSByZWYoZmFsc2UpO1xyXG5cclxuICBjb25zdCB0cmFwcGVyID0gbmV3IElucHV0VHJhcHBlcignI3Z1ZS1tb2RhbC1jb250YWluZXInKTtcclxuICB0cmFwcGVyLnRyYXAoKTtcclxuICBjb25zdCBjb21taXRDYiA9IGFzeW5jICgpID0+IHtcclxuICAgIGNvbXBsZXRlLnZhbHVlID0gdHJ1ZTtcclxuICAgIGF3YWl0IHBhcmFtcy5jb21taXRDYigpO1xyXG4gICAgdHJhcHBlci5jbG9zZSgpO1xyXG4gICAgU3VpTmF2aWdhdGlvbi5pbnN0YW5jZS5oaWRlRGlhbG9nTW9kYWwoKTtcclxuICB9XHJcbiAgY29uc3QgY2FuY2VsQ2IgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBjb21wbGV0ZS52YWx1ZSA9IHRydWU7XHJcbiAgICBhd2FpdCBwYXJhbXMuY2FuY2VsQ2IoKTtcclxuICAgIHRyYXBwZXIuY2xvc2UoKTtcclxuICAgIFN1aU5hdmlnYXRpb24uaW5zdGFuY2UuaGlkZURpYWxvZ01vZGFsKCk7XHJcbiAgfVxyXG4gIGNvbnN0IHJlbW92ZUNiID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgaWYgKHBhcmFtcy5yZW1vdmVDYikge1xyXG4gICAgICBhd2FpdCBwYXJhbXMucmVtb3ZlQ2IoKTtcclxuICAgIH1cclxuICAgIHRyYXBwZXIuY2xvc2UoKTtcclxuICAgIFN1aU5hdmlnYXRpb24uaW5zdGFuY2UuaGlkZURpYWxvZ01vZGFsKCk7XHJcbiAgICBjb21wbGV0ZS52YWx1ZSA9IHRydWU7XHJcbiAgfVxyXG4gICQoJyMnICsgcGFyYW1zLnJvb3QpLmFkZENsYXNzKCdtb2RhbCBzaG93IGZhZGUnKTtcclxuICBwYXJhbXMuYXBwUGFyYW1zLmNvbW1pdENiID0gY29tbWl0Q2I7XHJcbiAgcGFyYW1zLmFwcFBhcmFtcy5jYW5jZWxDYiA9IGNhbmNlbENiO1xyXG4gIGlmIChwYXJhbXMucmVtb3ZlQ2IpIHtcclxuICAgIHBhcmFtcy5hcHBQYXJhbXMucmVtb3ZlQ2IgPSByZW1vdmVDYjtcclxuICB9XHJcbiAgY3JlYXRlQXBwKHBhcmFtcy5hcHAgYXMgYW55LCBwYXJhbXMuYXBwUGFyYW1zKS5tb3VudCgnIycgKyBwYXJhbXMucm9vdCk7XHJcblxyXG4gIC8vIGFsbG93IGEgZGlhbG9nIHRvIGJlIGRpc21pc3NlZCBieSBlc2MuXHJcbiAgY29uc3QgZXZLZXkgPSBhc3luYyAoZXZkYXRhOiBhbnkpID0+IHtcclxuICAgIGlmIChldmRhdGEua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICBjYW5jZWxDYigpO1xyXG4gICAgICBldmRhdGEucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gV2UgdGFrZSBvdmVyIGhlIGtleWJvYXJkIGZvciB0aGUgbW9kYWwgZGlhbG9nIHNvIHRoZSB1c2VyIGRvZXNuJ3QgY2hhbmdlIHRoZSBzY29yZVxyXG4gIC8vIHdoaWxlIHR5cGluZyBpbnRvIHRoZSBkaWFsb2cuICB0aGUgJ2NvbXBsZXRlTm90aWZpZXInIHRha2VzIGl0IGJhY2sgd2hlbiB3ZSBhcmUgZG9uZVxyXG4gIHBhcmFtcy5kaWFsb2dQYXJhbXMuY29tcGxldGVOb3RpZmllci51bmJpbmRLZXlib2FyZEZvck1vZGFsKG5ldyBjbG9zZU1vZGFsUHJvbWlzZXIoY29tcGxldGUpKTtcclxuICBwYXJhbXMuZGlhbG9nUGFyYW1zLmV2ZW50U291cmNlLmJpbmRLZXlkb3duSGFuZGxlcihldktleSk7XHJcbiAgU3VpTmF2aWdhdGlvbi5pbnN0YW5jZS5zaG93RGlhbG9nTW9kYWwoKTtcclxuICAvKiBjb25zdCBjYiA9ICgpID0+IHsgfTtcclxuICBkcmFnZ2FibGUoe1xyXG4gICAgcGFyZW50OiAkKCcjJyArIHBhcmFtcy5yb290KS5maW5kKCcuYXR0cmlidXRlTW9kYWwnKSxcclxuICAgIGhhbmRsZTogJCgnIycgKyBwYXJhbXMucm9vdCkuZmluZCgnLmpzRGJNb3ZlJyksXHJcbiAgICBhbmltYXRlRGl2OiAnLmRyYWdhbmltZScsXHJcbiAgICBjYixcclxuICAgIG1vdmVQYXJlbnQ6IHRydWVcclxuICB9KTsqLyAgXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgSlNPTiBkaWFsb2cgdGVtcGxhdGUgaXMgYSBkZWNsYXJpdGl2ZSBzdHJ1Y3RvcmUgZm9yIHRoZSBodG1sIG9mIHRoZSBkaWFsb2dcclxuICogYW5kIGNvbXBvbmVudHMuICBcclxuICogQHBhcmFtIGxhYmVsIGZvciB0aGUgZGlhbG9nIGl0c2VsZlxyXG4gKiBAcGFyYW0gZWxlbWVudHMgYSBzZXJpZXMgb2YgZWxlbWVudHMgdGhhdCBkZWZpbmUgdGhlIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0gc3RhdGljVGV4dCBhIGhhc2ggb2YgdGV4dCBmb3IgdGhlIGRpYWxvZyBhbmQgY29tcG9uZW50cyB0byB1c2VcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBEaWFsb2dEZWZpbml0aW9uIHtcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGVsZW1lbnRzOiBEaWFsb2dEZWZpbml0aW9uRWxlbWVudFtdLFxyXG4gIHN0YXRpY1RleHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5bXVxyXG59XHJcbi8qKlxyXG4gKiBBIHRyYW5zbGF0aW9uIG9mIHRoZSBsYWJlbHMgaW4gRGlhbG9nRGVmaW50aW9uRWxlbWVudFxyXG4gKiBAcGFyYW0gbGFiZWwgdGhlIGNvbXBvbmVudCBsYWJlbFxyXG4gKiBAcGFyYW0gaWQgdXNlZCBhcyBhIGtleSBpbiB0cmFuc2xhdGlvbiB0b29sXHJcbiAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbnMgZm9yIGRyb3Bkb3duIGFuZCBvdGhlciBhcnJheSBjb21wb25lbnRzXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGlhbG9nVHJhbnNsYXRpb25FbGVtZW50IHtcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGlkOiBzdHJpbmcsXHJcbiAgb3B0aW9ucz86IERpYWxvZ0RlZmluaXRpb25PcHRpb25bXVxyXG59XHJcbi8qKlxyXG4gKiBBIHRyYW5zbGF0aW9uIG9mIGFsbCB0aGUgc3RyaW5ncyBpbiB0aGUgZGlhbG9nIGl0c2VsZiwgdXNlZCBcclxuICogd2hlbiBzd2l0Y2hpbmcgbGFuZ3VhZ2VzLlxyXG4gKiBAcGFyYW0gY3RvciB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBkaWFsb2cgY2xhc3MsIHVzZWQgdG8gY2FsbCBzdGF0aWMgbWV0aG9kc1xyXG4gKiBAcGFyYW0gbGFiZWwgdGhlIHRyYW5zbGF0ZWQgbGFiZWxcclxuICogQHBhcmFtIGRpYWxvZ0VsZW1lbnRzIHRoZSB0cmFuc2xhdGVkIGNvbXBvbmVudCBqc29uXHJcbiAqIEBwYXJhbSBzdGF0aWNUZXh0IHRyYW5zbGF0ZWQgbWlzYyB0ZXh0IFxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIERpYWxvZ1RyYW5zbGF0aW9uIHtcclxuICBjdG9yOiBzdHJpbmcsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBkaWFsb2dFbGVtZW50czogRGlhbG9nVHJhbnNsYXRpb25FbGVtZW50W10sXHJcbiAgc3RhdGljVGV4dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgRGlhbG9nVHJhbnNsYXRpb25zOiBEaWFsb2dUcmFuc2xhdGlvbltdID0gW107XHJcblxyXG4vKipcclxuICogRGlhbG9nIHBhcmFtcyBhbHdheXMgY29udGFpbiBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcnVudGltZVxyXG4gKiBmb3IgbW9kYWwgZnVuY3Rpb25hbGl0eVxyXG4gKiBAcGFyYW0gY3RvciBkaWFsb2cgY29uc3RydWN0b3JcclxuICogQHBhcmFtIGlkIERPTSBpZCBmb3IgdGhlIGRpYWxvZ1xyXG4gKiBAcGFyYW0gdHJhY2tlciB0byBnZXQgYW5kIHNldCBzZWxlY3Rpb25zXHJcbiAqIEBwYXJhbSBjb21wbGV0ZU5vdGlmaWVyIHVzZWQgdG8gdGFrZSBvdmVyIGtleS9tb3VzZSBjb250cm9sXHJcbiAqIEBwYXJhbSBzdGFydFByb21pc2UgdXNlZCBpZiB0aGlzIGlzIGNhbGxlZCBmcm9tIGFub3RoZXIgbW9kYWwgZWxlbWVudFxyXG4gKiBAcGFyYW0gdmlldyB0aGUgTVZWTSBvYmplY3QgdG8gY2hhbmdlIHRoZSBzY29yZVxyXG4gKiBAcGFyYW0gZXZlbnRTb3VyY2UgZXZlbnQgc291cmNlIHRvIHJlZ2lzdGVyIGZvciBhZGRpdGlvbmFsIGV2ZW50cyBsaWtlIG1vdXNldXBcclxuICogQHBhcmFtIHVuZG9CdWZmZXIgdXNlZCB0byBjcmVhdGUgdW5kb1xyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1aURpYWxvZ1BhcmFtcyB7XHJcbiAgY3Rvcjogc3RyaW5nLFxyXG4gIGlkOiBzdHJpbmcsXHJcbiAgdHJhY2tlcjogU3VpVHJhY2tlcixcclxuICBjb21wbGV0ZU5vdGlmaWVyOiBDb21wbGV0ZU5vdGlmaWVyLFxyXG4gIHN0YXJ0UHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGxcclxuICB2aWV3OiBTdWlTY29yZVZpZXdPcGVyYXRpb25zLFxyXG4gIGV2ZW50U291cmNlOiBCcm93c2VyRXZlbnRTb3VyY2UsXHJcbiAgLy8gZGVmaW5pdGlvbjogRGlhbG9nRGVmaW5pdGlvbixcclxuICBtb2RpZmllcj86IGFueSxcclxuICBjb25maWc/OiBTbW9VaUNvbmZpZ3VyYXRpb25cclxufVxyXG5cclxuLyoqXHJcbiAqIGludGVybmFsIGludGVyZmFjZSB1c2VkIHRvIGNyZWF0ZSB0aGUgRE9NXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWlEb21QYXJhbXMge1xyXG4gIGlkOiBzdHJpbmcsXHJcbiAgdG9wOiBudW1iZXIsXHJcbiAgbGVmdDogbnVtYmVyLFxyXG4gIGxhYmVsOiBzdHJpbmdcclxufVxyXG4vKipcclxuICogRE9NIGludGVyZmFjZSBmb3IgdGhlIGRpYWxvZ1xyXG4gKiBAaW50ZXJuYWxcclxuICogQHBhcmFtIGVsZW1lbnQgcGFyZW50IGVsZW1lbnRcclxuICogQHBhcmFtIHRyYXBwZXIgdXNlZCB0byB0cmFwIGZvY3VzIGV2ZW50cyBmb3IgdGhlIGRpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBEaWFsb2dEb20ge1xyXG4gIGVsZW1lbnQ6IGFueSxcclxuICB0cmFwcGVyOiBhbnlcclxufVxyXG5leHBvcnQgY29uc3Qgc3VpRGlhbG9nVHJhbnNsYXRlID0gKGRpYWxvZzogRGlhbG9nRGVmaW5pdGlvbiwgY3Rvcjogc3RyaW5nKTogRGlhbG9nVHJhbnNsYXRpb24gPT4ge1xyXG4gIGNvbnN0IGVsZW1lbnRzOiBEaWFsb2dEZWZpbml0aW9uRWxlbWVudFtdID0gZGlhbG9nLmVsZW1lbnRzO1xyXG4gIGNvbnN0IG91dHB1dDogRGlhbG9nVHJhbnNsYXRpb25FbGVtZW50W10gPSBbXTtcclxuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBEaWFsb2dEZWZpbml0aW9uRWxlbWVudCkgPT4ge1xyXG4gICAgY29uc3QgY29tcG9uZW50OiBQYXJ0aWFsPERpYWxvZ1RyYW5zbGF0aW9uRWxlbWVudD4gPSB7fTtcclxuICAgIGlmIChlbGVtZW50LmxhYmVsKSB7XHJcbiAgICAgIGNvbXBvbmVudC5sYWJlbCA9IGVsZW1lbnQubGFiZWwgPz8gJyc7XHJcbiAgICAgIGNvbXBvbmVudC5pZCA9IGVsZW1lbnQuc21vTmFtZTtcclxuICAgICAgaWYgKGVsZW1lbnQub3B0aW9ucykge1xyXG4gICAgICAgIGNvbXBvbmVudC5vcHRpb25zID0gW107XHJcblxyXG4gICAgICAgIGVsZW1lbnQub3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcclxuICAgICAgICAgIGNvbXBvbmVudC5vcHRpb25zIS5wdXNoKHsgdmFsdWU6IG9wdGlvbi52YWx1ZSwgbGFiZWw6IG9wdGlvbi5sYWJlbCwgY3NzOiBvcHRpb24uY3NzIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIG91dHB1dC5wdXNoKGNvbXBvbmVudCBhcyBEaWFsb2dUcmFuc2xhdGlvbkVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIC8vIGNvbnZlcnQgc3RhdGljIHRleHQgZnJvbSBhbiBhcnJheSBvZiBuYW1lL3ZhbHVlIHBhaXJzIHRvIGEgcmVjb3JkIGZvciB0cmFuc2xhdGlvblxyXG4gIGNvbnN0IHN0YXRpY1RleHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcclxuICBjb25zdCBkaWFsb2dTdGF0aWNUZXh0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10gPSBkaWFsb2cuc3RhdGljVGV4dDtcclxuICBpZiAoZGlhbG9nU3RhdGljVGV4dCkge1xyXG4gICAgZGlhbG9nU3RhdGljVGV4dC5mb3JFYWNoKChzdCkgPT4ge1xyXG4gICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhzdClbMF07XHJcbiAgICAgIHN0YXRpY1RleHRba2V5XSAgPSBzdFtrZXldO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJldHVybiB7IGN0b3IsIGxhYmVsOiBkaWFsb2cubGFiZWwsIGRpYWxvZ0VsZW1lbnRzOiBvdXRwdXQsIHN0YXRpY1RleHQgfTtcclxufVxyXG4vKipcclxuICogTm90ZTogTW9zdCBkaWFsb2dzIHdpbGwgaW5oZXJpdCBmcm9tIFN1aURpYWxvZ0FkYXB0ZXIsIG5vdCBTdWlEaWFsb2dCYXNlLlxyXG4gKiBZb3Ugd2lsbCBvbmx5IHdhbnQgdG8gaW5oZXJpdCBmcm9tIFN1aURpYWxvZ0Jhc2UgdW5kZXIgMiBjb25kaXRpb25zOlxyXG4gKiAxLiB0aGUgZGlhbG9nIGlzIHRyaXZpYWlsbHkgc2ltcGxlLCBsaWtlIGFuIGFsZXJ0IGJveCB0aGF0IG1ha2VzIG5vIGNoYW5nZXMgdG8gdGhlIHNjb3JlLCBvclxyXG4gKiAyLiB0aGUgZGlhbG9nIGlzIGV4dHJlbWVseSBjb21wbGljYXRlZCBpbiBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHVzZXIsIHN1Y2ggdGhhdCBhIGZvcm0tYmFzZWQgYXBwcm9hY2ggd29uJ3Qgd29ya1xyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG4gZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN1aURpYWxvZ0Jhc2UgZXh0ZW5kcyBTdWlEaWFsb2dOb3RpZmllciB7XHJcbiAgc3RhdGljIGdldCBkaXNwbGF5T3B0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIEJJTkRDT01QT05FTlRTOiAnYmluZENvbXBvbmVudHMnLCBEUkFHR0FCTEU6ICdtYWtlRHJhZ2dhYmxlJyxcclxuICAgICAgS0VZQk9BUkRfQ0FQVFVSRTogJ2NhcHR1cmVLZXlib2FyZFByb21pc2UnLCBHTE9CQUxQT1M6ICdwb3NpdGlvbkdsb2JhbGx5JyxcclxuICAgICAgU0VMRUNUSU9OUE9TOiAncG9zaXRpb25Gcm9tU2VsZWN0aW9uJywgTU9ESUZJRVJQT1M6ICdwb3NpdGlvbkZyb21Nb2RpZmllcicsXHJcbiAgICAgIEhJREVSRU1PVkU6ICdoaWRlUmVtb3ZlQnV0dG9uJ1xyXG4gICAgfTtcclxuICB9ICBcclxuXHJcbiAgc3RhdGljIGdldFN0YXRpY1RleHQoc3RhdGljVGV4dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPltdKSB7XHJcbiAgICBjb25zdCBydjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xyXG4gICAgc3RhdGljVGV4dC5mb3JFYWNoKChzdCkgPT4ge1xyXG4gICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhzdClbMF07XHJcbiAgICAgIHJ2W2tleV0gPSBzdFtrZXldO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIGlkOiBzdHJpbmc7XHJcbiAgY3Rvcjogc3RyaW5nO1xyXG4gIGJvdW5kS2V5Ym9hcmQ6IGJvb2xlYW47XHJcbiAgY29tcG9uZW50czogU3VpQ29tcG9uZW50QmFzZVtdID0gW107XHJcbiAgYm91bmRDb21wb25lbnRzOiBTdWlDb21wb25lbnRCYXNlW10gPSBbXTtcclxuICBjbWFwOiBSZWNvcmQ8c3RyaW5nLCBTdWlDb21wb25lbnRCYXNlPiA9IHt9O1xyXG4gIHNjcm9sbGVyOiBTdWlTY3JvbGxlcjtcclxuICBjbG9zZURpYWxvZ1Byb21pc2U6IFByb21pc2U8dm9pZD47XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBzdGF0aWNUZXh0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+W10gPSBbXTtcclxuICBzdGFydFByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsO1xyXG4gIGRpYWxvZ0VsZW1lbnRzOiBEaWFsb2dEZWZpbml0aW9uO1xyXG4gIGV2ZW50U291cmNlOiBCcm93c2VyRXZlbnRTb3VyY2U7XHJcbiAgdmlldzogU3VpU2NvcmVWaWV3T3BlcmF0aW9ucztcclxuICBjb21wbGV0ZU5vdGlmaWVyOiBDb21wbGV0ZU5vdGlmaWVyO1xyXG4gIG1vZGlmaWVyOiBhbnk7XHJcbiAgZGdEb206IERpYWxvZ0RvbTtcclxuICBkaXNwbGF5T3B0aW9uczogc3RyaW5nW10gPSBbJ0JJTkRDT01QT05FTlRTJywgJ0RSQUdHQUJMRScsICdLRVlCT0FSRF9DQVBUVVJFJywgJ0dMT0JBTFBPUycsICdISURFUkVNT1ZFJ107XHJcbiAga2V5ZG93bkhhbmRsZXI6IEV2ZW50SGFuZGxlciB8IG51bGwgPSBudWxsO1xyXG4gIC8vICMjIyBTdWlEaWFsb2dCYXNlIGN0b3JcclxuICAvLyBDcmVhdGVzIHRoZSBET00gZWxlbWVudCBmb3IgdGhlIGRpYWxvZyBhbmQgZ2V0cyBzb21lIGluaXRpYWwgZWxlbWVudHNcclxuICBjb25zdHJ1Y3RvcihkaWFsb2dFbGVtZW50czogRGlhbG9nRGVmaW5pdGlvbiwgcGFyYW1ldGVyczogU3VpRGlhbG9nUGFyYW1zKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5pZCA9IHBhcmFtZXRlcnMuaWQ7XHJcbiAgICB0aGlzLmJvdW5kS2V5Ym9hcmQgPSBmYWxzZTtcclxuICAgIHRoaXMuc2Nyb2xsZXIgPSBwYXJhbWV0ZXJzLnZpZXcudHJhY2tlci5zY3JvbGxlcjtcclxuICAgIHRoaXMubGFiZWwgPSBkaWFsb2dFbGVtZW50cy5sYWJlbDtcclxuICAgIHRoaXMuZXZlbnRTb3VyY2UgPSBwYXJhbWV0ZXJzLmV2ZW50U291cmNlO1xyXG4gICAgdGhpcy52aWV3ID0gcGFyYW1ldGVycy52aWV3O1xyXG4gICAgdGhpcy5jb21wbGV0ZU5vdGlmaWVyID0gcGFyYW1ldGVycy5jb21wbGV0ZU5vdGlmaWVyO1xyXG4gICAgdGhpcy5tb2RpZmllciA9IHBhcmFtZXRlcnMubW9kaWZpZXI7XHJcbiAgICB0aGlzLmN0b3IgPSBwYXJhbWV0ZXJzLmN0b3I7XHJcblxyXG4gICAgdGhpcy5jbG9zZURpYWxvZ1Byb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAkKCdib2R5Jykub2ZmKCdkaWFsb2dEaXNtaXNzJykub24oJ2RpYWxvZ0Rpc21pc3MnLCAoKSA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdGF0aWNUZXh0ID0gZGlhbG9nRWxlbWVudHMuc3RhdGljVGV4dDtcclxuXHJcbiAgICAvLyBJZiB0aGlzIGRpYWxvZyB3YXMgc3Bhd25lZCBieSBhIG1lbnUsIHdhaXQgZm9yIHRoZSBtZW51IHRvIGRpc21pc3NcclxuICAgIC8vIGJlZm9yZSBjb250aW51aW5nLlxyXG4gICAgLy8gdGhpcy5zdGFydFByb21pc2UgPSBwYXJhbWV0ZXJzLmNsb3NlTWVudVByb21pc2U7XHJcbiAgICB0aGlzLnN0YXJ0UHJvbWlzZSA9IHBhcmFtZXRlcnMuc3RhcnRQcm9taXNlO1xyXG5cclxuICAgIHRoaXMuZGlhbG9nRWxlbWVudHMgPSBkaWFsb2dFbGVtZW50cztcclxuXHJcbiAgICBjb25zdCBsZWZ0ID0gJCgnI3Ntby1zY3JvbGwtcmVnaW9uJykub2Zmc2V0KCkubGVmdCArICQoJyNzbW8tc2Nyb2xsLXJlZ2lvbicpLndpZHRoKCkgLyAyO1xyXG4gICAgY29uc3QgdG9wID0gJCgnI3Ntby1zY3JvbGwtcmVnaW9uJykub2Zmc2V0KCkudG9wICsgJCgnI3Ntby1zY3JvbGwtcmVnaW9uJykuaGVpZ2h0KCkgLyAyO1xyXG5cclxuICAgIHRoaXMuZGdEb20gPSB0aGlzLl9jb25zdHJ1Y3REaWFsb2coZGlhbG9nRWxlbWVudHMsIHtcclxuICAgICAgaWQ6ICdkaWFsb2ctJyArIHRoaXMuaWQsXHJcbiAgICAgIHRvcCxcclxuICAgICAgbGVmdCxcclxuICAgICAgbGFiZWw6IHRoaXMubGFiZWxcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFNtb1RyYW5zbGF0b3IucmVnaXN0ZXJEaWFsb2codGhpcy5jdG9yKTtcclxuICB9XHJcbiAgICAvLyAjIyMgZGlzcGxheVxyXG4gIC8vIG1ha2UzIHRoZSBtb2RhbCB2aXNpYmxlLiAgYmluZCBldmVudHMgYW5kIGVsZW1lbnRzLlxyXG4gIGRpc3BsYXkoKSB7XHJcbiAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ3Nob3dBdHRyaWJ1dGVEaWFsb2cnKTtcclxuICAgIHRoaXMuYmluZENvbXBvbmVudHMoKTtcclxuICAgIHRoaXMuYmluZEVsZW1lbnRzKCk7XHJcbiAgICB0aGlzLmFwcGx5RGlzcGxheU9wdGlvbnMoKTtcclxuICAgIHRoaXMuaW5pdGlhbFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAgIC8vICMjIyBiaW5kRWxlbWVudHNcclxuICAvLyBiaW5nIHRoZSBnZW5lcmljIGNvbnRyb2xzIGluIG1vc3QgZGlhbG9ncy5cclxuICBiaW5kRWxlbWVudHMoKSB7XHJcbiAgICB2YXIgZGdEb20gPSB0aGlzLmRnRG9tO1xyXG4gICAgJChkZ0RvbS5lbGVtZW50KS5maW5kKCcub2stYnV0dG9uJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgdGhpcy52aWV3Lmdyb3VwVW5kbyhmYWxzZSk7XHJcbiAgICAgIHRoaXMuY29tbWl0KCk7XHJcbiAgICAgIHRoaXMuY29tcGxldGUoKTtcclxuICAgIH0pO1xyXG4gICAgJChkZ0RvbS5lbGVtZW50KS5maW5kKCcuY2FuY2VsLWJ1dHRvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMudmlldy5ncm91cFVuZG8oZmFsc2UpO1xyXG4gICAgICBpZiAodGhpcy5tb2RpZmllcikge1xyXG4gICAgICAgIHRoaXMubW9kaWZpZXIuY2FuY2VsKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jb21wbGV0ZSgpO1xyXG4gICAgfSk7XHJcbiAgICAkKGRnRG9tLmVsZW1lbnQpLmZpbmQoJy5yZW1vdmUtYnV0dG9uJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgdGhpcy52aWV3Lmdyb3VwVW5kbyhmYWxzZSk7XHJcbiAgICAgIHRoaXMuY29tcGxldGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBiaW5kQ29tcG9uZW50cygpIHtcclxuICAgIHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKChjb21wb25lbnQpID0+IHtcclxuICAgICAgY29tcG9uZW50LmJpbmQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBpbml0aWFsVmFsdWUoKXtcclxuICAgIGlmICh0aGlzLm1vZGlmaWVyID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuYm91bmRDb21wb25lbnRzLmZvckVhY2goKGNvbXApID0+IHtcclxuICAgICAgKGNvbXAgYXMgYW55KS5zZXRWYWx1ZSgodGhpcy5tb2RpZmllciBhcyBhbnkpW2NvbXAuc21vTmFtZV0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGFzeW5jIGNoYW5nZWQoKSB7XHJcbiAgICBpZiAodGhpcy5tb2RpZmllciA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmJvdW5kQ29tcG9uZW50cy5mb3JFYWNoKChjb21wKSA9PiB7XHJcbiAgICAgIGlmIChjb21wLmNoYW5nZUZsYWcpIHtcclxuICAgICAgICAodGhpcy5tb2RpZmllciBhcyBhbnkpW2NvbXAuc21vTmFtZV0gPSAoY29tcCBhcyBhbnkpLmdldFZhbHVlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBnZXRJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuaWQ7XHJcbiAgfVxyXG4gIGdldE1vZGlmaWVyKCkgOiBTbW9Nb2RpZmllciB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kaWZpZXIgPz8gbnVsbDtcclxuICB9XHJcbiAgZ2V0RXZlbnRTb3VyY2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5ldmVudFNvdXJjZTtcclxuICB9XHJcbiAgZ2V0U3RhdGljVGV4dCgpIHtcclxuICAgIHJldHVybiBTdWlEaWFsb2dCYXNlLmdldFN0YXRpY1RleHQodGhpcy5zdGF0aWNUZXh0KTtcclxuICB9XHJcbiAgYXN5bmMgY29tbWl0KCk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gUHJvbWlzZUhlbHBlcnMuZW1wdHlQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGdldCBjbG9zZU1vZGFsUHJvbWlzZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2xvc2VEaWFsb2dQcm9taXNlO1xyXG4gIH1cclxuICAvLyAjIyMgcG9zaXRpb25cclxuICAvLyBGb3IgZGlhbG9ncyBiYXNlZCBvbiBzZWxlY3Rpb25zLCB0cmllcyB0byBwbGFjZSB0aGUgZGlhbG9nIG5lYXIgdGhlIHNlbGVjdGlvbiBhbmQgYWxzb1xyXG4gIC8vIHRvIHNjcm9sbCBzbyB0aGUgZGlhbG9nIGlzIGluIHZpZXdcclxuICBzdGF0aWMgcG9zaXRpb24oYm94OiBTdmdCb3gsIGRnRG9tOiBEaWFsb2dEb20sIHNjcm9sbGVyOiBTdWlTY3JvbGxlcikge1xyXG4gICAgbGV0IHkgPSAoYm94LnkgKyBib3guaGVpZ2h0KSAtIHNjcm9sbGVyLm5ldFNjcm9sbC55O1xyXG4gICAgbGV0IHggPSAwO1xyXG5cclxuICAgIC8vIFRPRE86IGFkanVzdCBpZiBkYiBpcyBjbGlwcGVkIGJ5IHRoZSBicm93c2VyLlxyXG4gICAgY29uc3QgZGdlID0gJChkZ0RvbS5lbGVtZW50KS5maW5kKCcuYXR0cmlidXRlTW9kYWwnKTtcclxuICAgIGNvbnN0IGRnZUhlaWdodDogbnVtYmVyID0gJChkZ2UpLmhlaWdodCgpO1xyXG4gICAgY29uc3QgbWF4WTogbnVtYmVyID0gJCgnI3Ntby1zY3JvbGwtcmVnaW9uJykuaGVpZ2h0KCk7XHJcbiAgICBjb25zdCBtYXhYOiBudW1iZXIgPSAkKCcjc21vLXNjcm9sbC1yZWdpb24nKS53aWR0aCgpO1xyXG4gICAgY29uc3Qgb2Zmc2V0OiBhbnkgPSAkKCcuZG9tLWNvbnRhaW5lcicpLm9mZnNldCgpO1xyXG4gICAgeSA9IHkgLSAob2Zmc2V0LnRvcCBhcyBudW1iZXIpO1xyXG5cclxuICAgIGNvbnN0IG9mZnNldFkgPSBkZ2VIZWlnaHQgKyB5ID4gd2luZG93LmlubmVySGVpZ2h0ID8gKGRnZUhlaWdodCArIHkpIC0gd2luZG93LmlubmVySGVpZ2h0IDogMDtcclxuICAgIHkgPSAoeSA8IDApID8gLXkgOiB5IC0gb2Zmc2V0WTtcclxuXHJcbiAgICB5ID0gKHkgPiBtYXhZIHx8IHkgPCAwKSA/IG1heFkgLyAyIDogeTtcclxuXHJcbiAgICAkKGRnZSkuY3NzKCd0b3AnLCAnJyArIHkgKyAncHgnKTtcclxuXHJcbiAgICB4ID0gYm94LnggLSBzY3JvbGxlci5uZXRTY3JvbGwueDtcclxuICAgIHggPSB4IC0gKG9mZnNldC5sZWZ0IGFzIG51bWJlcik7XHJcbiAgICBjb25zdCB3OiBudW1iZXIgPSAkKGRnZSkud2lkdGgoKTtcclxuICAgIHggPSAoeCA+IHdpbmRvdy5pbm5lcldpZHRoIC8gMikgPyB4IC0gKHcgKyAyNSkgOiB4ICsgKHcgKyAyNSk7XHJcblxyXG4gICAgeCA9ICh4IDwgMCB8fCB4ID4gbWF4WCkgPyBtYXhYIC8gMiA6IHg7XHJcbiAgICAkKGRnZSkuY3NzKCdsZWZ0JywgJycgKyB4ICsgJ3B4Jyk7XHJcbiAgfVxyXG4gIGdldFZpZXcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy52aWV3O1xyXG4gIH1cclxuICBhcHBseURpc3BsYXlPcHRpb25zKCkge1xyXG4gICAgJCgnYm9keScpLmFkZENsYXNzKCdzaG93QXR0cmlidXRlRGlhbG9nJyk7XHJcbiAgICB0aGlzLmRpc3BsYXlPcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xyXG4gICAgICAodGhpcyBhcyBhbnkpW1N1aURpYWxvZ0Jhc2UuZGlzcGxheU9wdGlvbnNbb3B0aW9uXV0oKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyAjIyMgcG9zaXRpb25cclxuICAvLyBQb3NpdGlvbiB0aGUgZGlhbG9nIG5lYXIgYSBzZWxlY3Rpb24uICBJZiB0aGUgZGlhbG9nIGlzIG5vdCB2aXNpYmxlIGR1ZVxyXG4gIC8vIHRvIHNjcm9sbGluZywgbWFrZSBzdXJlIGl0IGlzIHZpc2libGUuXHJcbiAgcG9zaXRpb24oYm94OiBTdmdCb3gpIHtcclxuICAgIFN1aURpYWxvZ0Jhc2UucG9zaXRpb24oYm94LCB0aGlzLmRnRG9tLCB0aGlzLnZpZXcudHJhY2tlci5zY3JvbGxlcik7XHJcbiAgfVxyXG4gIGhpZGVSZW1vdmVCdXR0b24oKSB7XHJcbiAgICAkKHRoaXMuZGdEb20uZWxlbWVudCkuZmluZCgnLnJlbW92ZS1idXR0b24nKS5yZW1vdmUoKTtcclxuICB9XHJcbiAgLy8gIyMjIHBvc2l0aW9uTW9kaWZpZXIoKVxyXG4gIHBvc2l0aW9uRnJvbU1vZGlmaWVyKCkge1xyXG4gICAgaWYgKCF0aGlzLm1vZGlmaWVyIHx8IHRoaXMubW9kaWZpZXIubG9naWNhbEJveCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnBvc2l0aW9uR2xvYmFsbHkoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGFnZUNvbnRleHQgPSB0aGlzLnZpZXcucmVuZGVyZXIucGFnZU1hcC5nZXRSZW5kZXJlckZyb21Nb2RpZmllcih0aGlzLm1vZGlmaWVyKTtcclxuICAgIGNvbnN0IHNjcmVlbkJveCA9IHRoaXMudmlldy5yZW5kZXJlci5wYWdlTWFwLnN2Z1RvQ2xpZW50KHRoaXMubW9kaWZpZXIubG9naWNhbEJveCk7XHJcbiAgICB0aGlzLnBvc2l0aW9uKHNjcmVlbkJveCk7XHJcbiAgfVxyXG4gIC8vICMjIyBwb3NpdGlvbkdsb2JhbGx5XHJcbiAgLy8gcG9zaXRpb24gdGhlIGRpYWxvZyBib3ggaW4gdGhlIGNlbnRlciBvZiB0aGUgY3VycmVudCBzY3JvbGwgcmVnaW9uXHJcbiAgcG9zaXRpb25HbG9iYWxseSgpIHtcclxuICAgIGNvbnN0IGJveCA9IFN2Z0hlbHBlcnMuYm94UG9pbnRzKDI1MCwgMjUwLCAxLCAxKTtcclxuICAgIFN1aURpYWxvZ0Jhc2UucG9zaXRpb24oYm94LCB0aGlzLmRnRG9tLCB0aGlzLnZpZXcudHJhY2tlci5zY3JvbGxlcik7XHJcbiAgfVxyXG4gIC8vICMjIyBwb3N0aW9uRnJvbVNlbGVjdGlvblxyXG4gIC8vIHNldCBpbml0aWFsIHBvc2l0aW9uIG9mIGRpYWxvZyBiYXNlZCBvbiBmaXJzdCBzZWxlY3Rpb25cclxuICBwb3NpdGlvbkZyb21TZWxlY3Rpb24oKSB7XHJcbiAgICBjb25zdCBub3RlOiBTbW9Ob3RlIHwgbnVsbCA9IHRoaXMudmlldy50cmFja2VyLnNlbGVjdGlvbnNbMF0ubm90ZTtcclxuICAgIGlmIChub3RlICYmIG5vdGUubG9naWNhbEJveCkge1xyXG4gICAgICBjb25zdCBzY3JlZW5Cb3ggPSB0aGlzLnZpZXcucmVuZGVyZXIucGFnZU1hcC5zdmdUb0NsaWVudChub3RlLmxvZ2ljYWxCb3gpO1xyXG4gICAgICB0aGlzLnBvc2l0aW9uKHNjcmVlbkJveCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vICMjIyBidWlsZCB0aGUgaHRtbCBmb3IgdGhlIGRpYWxvZywgYmFzZWQgb24gdGhlIGluc3RhbmNlLXNwZWNpZmljIGNvbXBvbmVudHMuXHJcbiAgX2NvbnN0cnVjdERpYWxvZyhkaWFsb2dFbGVtZW50czogRGlhbG9nRGVmaW5pdGlvbiwgcGFyYW1ldGVyczogU3VpRG9tUGFyYW1zKSB7XHJcbiAgICBjcmVhdGVUb3BEb21Db250YWluZXIoJy5hdHRyaWJ1dGVEaWFsb2cnKTtcclxuICAgIGNvbnN0IGlkID0gcGFyYW1ldGVycy5pZDtcclxuICAgICBjb25zdCBiID0gYnVpbGREb207XHJcbiAgICBjb25zdCByID0gYignZGl2JykuY2xhc3NlcygnYXR0cmlidXRlTW9kYWwnKS5hdHRyKCdpZCcsICdhdHRyLW1vZGFsLScgKyBpZClcclxuICAgICAgLmNzcygndG9wJywgcGFyYW1ldGVycy50b3AgKyAncHgnKS5jc3MoJ2xlZnQnLCBwYXJhbWV0ZXJzLmxlZnQgKyAncHgnKVxyXG4gICAgICAuYXBwZW5kKGIoJ3NwYW5iJykuY2xhc3NlcygnZHJhZ2dhYmxlIGJ1dHRvbicpLmFwcGVuZChiKCdzcGFuJykuY2xhc3NlcygnaWNvbiBpY29uLW1vdmUganNEYk1vdmUnKSkpXHJcbiAgICAgIC5hcHBlbmQoYignaDInKS5jbGFzc2VzKCdkaWFsb2ctbGFiZWwnKS50ZXh0KHRoaXMubGFiZWwpKTtcclxuXHJcbiAgICB2YXIgY3RybCA9IGIoJ2RpdicpLmNsYXNzZXMoJ3Ntb0NvbnRyb2xDb250YWluZXInKTtcclxuICAgIGRpYWxvZ0VsZW1lbnRzLmVsZW1lbnRzLmZpbHRlcigoZGUpID0+IGRlLmNvbnRyb2wpLmZvckVhY2goKGRlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSBkZS5jbGFzc2VzID8gZGUuY2xhc3NlcyA6ICcnO1xyXG4gICAgICBjb25zdCBjb21wUGFyYW1zOiBTdWlCYXNlQ29tcG9uZW50UGFyYW1zID0ge1xyXG4gICAgICAgIGNsYXNzZXMsIGlkOiBpZCArIGRlLnNtb05hbWUsIC4uLmRlXHJcbiAgICAgIH1cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBjb250cm9sOiBTdWlDb21wb25lbnRCYXNlID0gU21vRHluYW1pY0NvbXBvbmVudEN0b3JbZGUuY29udHJvbF0odGhpcywgY29tcFBhcmFtcyk7XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29udHJvbCk7XHJcbiAgICAgICAgdGhpcy5jbWFwW2RlLnNtb05hbWUgKyAnQ3RybCddID0gY29udHJvbDtcclxuICAgICAgICBjdHJsLmFwcGVuZChjb250cm9sLmh0bWwpO1xyXG4gICAgICB9IGNhdGNoIChleHApIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdiYWQgY3RvciAnICsgZGUuc21vTmFtZSk7XHJcbiAgICAgICAgdGhyb3coZXhwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByLmFwcGVuZChjdHJsKTtcclxuICAgIHIuYXBwZW5kKFxyXG4gICAgICBiKCdkaXYnKS5jbGFzc2VzKCdidXR0b25Db250YWluZXInKS5hcHBlbmQoXHJcbiAgICAgICAgYignYnV0dG9uJykuY2xhc3Nlcygnb2stYnV0dG9uIGJ1dHRvbi1sZWZ0IGJ0biBidG4tcHJpbWFyeScpLnRleHQoJ09LJykpLmFwcGVuZChcclxuICAgICAgICBiKCdidXR0b24nKS5jbGFzc2VzKCdjYW5jZWwtYnV0dG9uIGJ1dHRvbi1jZW50ZXIgYnRuIGJ0bi1zZWNvbmRhcnknKS50ZXh0KCdDYW5jZWwnKSkuYXBwZW5kKFxyXG4gICAgICAgIGIoJ2J1dHRvbicpLmNsYXNzZXMoJ3JlbW92ZS1idXR0b24gYnV0dG9uLXJpZ2h0IGJ0biBidG4tc2Vjb25kYXJ5JykudGV4dCgnUmVtb3ZlJykuYXBwZW5kKFxyXG4gICAgICAgICAgYignc3BhbicpLmNsYXNzZXMoJ2ljb24gaWNvbi1jYW5jZWwtY2lyY2xlJykpKSk7XHJcbiAgICAkKCcuYXR0cmlidXRlRGlhbG9nJykuaHRtbCgnJyk7XHJcblxyXG4gICAgJCgnLmF0dHJpYnV0ZURpYWxvZycpLmFwcGVuZChyLmRvbSgpKTtcclxuXHJcbiAgICBjb25zdCB0cmFwcGVyID0gbmV3IElucHV0VHJhcHBlcignLmF0dHJpYnV0ZURpYWxvZycpO1xyXG4gICAgdHJhcHBlci50cmFwKCk7XHJcbiAgICAkKCcuYXR0cmlidXRlRGlhbG9nJykuZmluZCgnLmNhbmNlbC1idXR0b24nKS5mb2N1cygpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZWxlbWVudDogJCgnLmF0dHJpYnV0ZURpYWxvZycpLFxyXG4gICAgICB0cmFwcGVyXHJcbiAgICB9O1xyXG4gIH1cclxuICAvLyAjIyMgQ29tcGxldGVcclxuICAvLyBEaWFsb2dzIHRha2Ugb3ZlciB0aGUga2V5Ym9hcmQsIHNvIHJlbGVhc2UgdGhhdCBhbmQgdHJpZ2dlciBhbiBldmVudFxyXG4gIC8vIHRoYXQgdGhlIGRpYWxvZyBpcyBjbG9zaW5nIHRoYXQgY2FuIHJlc29sdmUgYW55IG91dHN0YW5kaW5nIHByb21pc2VzLlxyXG4gIGNvbXBsZXRlKCkge1xyXG4gICAgaWYgKHRoaXMuYm91bmRLZXlib2FyZCAmJiB0aGlzLmtleWRvd25IYW5kbGVyKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRTb3VyY2UudW5iaW5kS2V5ZG93bkhhbmRsZXIodGhpcy5rZXlkb3duSGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3Nob3dBdHRyaWJ1dGVEaWFsb2cnKTtcclxuICAgICQoJ2JvZHknKS50cmlnZ2VyKCdkaWFsb2dEaXNtaXNzJyk7XHJcbiAgICB0aGlzLmRnRG9tLnRyYXBwZXIuY2xvc2UoKTtcclxuICB9XHJcbiAgLy8gIyMjIG1ha2VEcmFnZ2FibGVcclxuICAvLyBnZW5lcmljIGNvZGUgdG8gbWFrZSB0aGUgZGlhbG9nIGJveCBkcmFnZ2FibGUgc28gaXQgZG9lc24ndFxyXG4gIC8vIGdldCBpbiBmcm9udCBvZiBzdHVmZi5cclxuICBtYWtlRHJhZ2dhYmxlKCkge1xyXG4gICAgY3JlYXRlVG9wRG9tQ29udGFpbmVyKCcuZHJhZ2FuaW1lJyk7XHJcbiAgICBjb25zdCBjYiA9ICgpID0+IHsgfTtcclxuICAgIGRyYWdnYWJsZSh7XHJcbiAgICAgIHBhcmVudDogJCh0aGlzLmRnRG9tLmVsZW1lbnQpLmZpbmQoJy5hdHRyaWJ1dGVNb2RhbCcpLFxyXG4gICAgICBoYW5kbGU6ICQodGhpcy5kZ0RvbS5lbGVtZW50KS5maW5kKCcuanNEYk1vdmUnKSxcclxuICAgICAgYW5pbWF0ZURpdjogJy5kcmFnYW5pbWUnLFxyXG4gICAgICBjYixcclxuICAgICAgbW92ZVBhcmVudDogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8vICMjIyBjYXB0dXJlS2V5Ym9hcmRQcm9taXNlXHJcbiAgLy8gY2FwdHVyZSBrZXlib2FyZCBldmVudHMgdW50aWwgdGhlIGRpYWxvZyBjbG9zZXMsXHJcbiAgLy8gdGhlbiBnaXZlIGNvbnRyb2wgYmFjayB0byB0aGUgY3VycmVudCBrZXlib2FyZFxyXG4gIGFzeW5jIGNhcHR1cmVLZXlib2FyZFByb21pc2UoKSB7XHJcbiAgICBpZiAoISh0aGlzLnN0YXJ0UHJvbWlzZSkpIHtcclxuICAgICAgdGhpcy5jb21wbGV0ZU5vdGlmaWVyLnVuYmluZEtleWJvYXJkRm9yTW9kYWwodGhpcyk7XHJcbiAgICAgIHRoaXMuYmluZEtleWJvYXJkKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnN0YXJ0UHJvbWlzZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0UHJvbWlzZTtcclxuICAgICAgdGhpcy5jb21wbGV0ZU5vdGlmaWVyLnVuYmluZEtleWJvYXJkRm9yTW9kYWwodGhpcyk7XHJcbiAgICAgIHRoaXMuYmluZEtleWJvYXJkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAjIyMgaGFuZGxlS2V5ZG93blxyXG4gIC8vIGFsbG93IGEgZGlhbG9nIHRvIGJlIGRpc21pc3NlZCBieSBlc2MuXHJcbiAgZXZLZXkoZXZkYXRhOiBhbnkpIHtcclxuICAgIGlmIChldmRhdGEua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAkKHRoaXMuZGdEb20uZWxlbWVudCkuZmluZCgnLmNhbmNlbC1idXR0b24nKS5jbGljaygpO1xyXG4gICAgICBldmRhdGEucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vICMjIyBiaW5kS2V5Ym9hcmRcclxuICAvLyBnZW5lcmljIGxvZ2ljIHRvIGdyYWIga2V5Ym9hcmQgZWxlbWVudHMgZm9yIG1vZGFsXHJcbiAgYmluZEtleWJvYXJkKCkge1xyXG4gICAgY29uc3QgZXZrZXkgPSBhc3luYyAoZXY6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmV2S2V5KGV2KTsgXHJcbiAgICB9XHJcbiAgICB0aGlzLmJvdW5kS2V5Ym9hcmQgPSB0cnVlO1xyXG4gICAgdGhpcy5rZXlkb3duSGFuZGxlciA9IHRoaXMuZXZlbnRTb3VyY2UuYmluZEtleWRvd25IYW5kbGVyKGV2a2V5KTtcclxuICB9XHJcbn1cclxuLyoqXHJcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uc1xyXG4gKiBAcGFyYW0gdHlwZSBcclxuICogQHBhcmFtIHBhcmFtZXRlcnMgXHJcbiAqIEByZXR1cm5zIGEgbmV3IGRpYWxvZyBvZiB0eXBlIFRcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRpYWxvZ0NvbnN0cnVjdG9yPFQgZXh0ZW5kcyBTdWlEaWFsb2dCYXNlPih0eXBlOiB7IG5ldyhwYXJhbWV0ZXJzOiBTdWlEaWFsb2dQYXJhbXMpOiBUOyB9LCBwYXJhbWV0ZXJzOiBTdWlEaWFsb2dQYXJhbXMgKTogVCB7XHJcbiAgcmV0dXJuIG5ldyB0eXBlKHBhcmFtZXRlcnMpO1xyXG59XHJcbi8qKlxyXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBkaXNwbGF5IGEgZGlhbG9nXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICogQHBhcmFtIGN0b3IgXHJcbiAqIEBwYXJhbSBwYXJhbWV0ZXJzIFxyXG4gKiBAcmV0dXJucyBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBbmREaXNwbGF5RGlhbG9nPFQgZXh0ZW5kcyBTdWlEaWFsb2dCYXNlPihjdG9yOiBuZXcgKHBhcmFtZXRlcnM6IFN1aURpYWxvZ1BhcmFtcykgPT4gVCwgcGFyYW1ldGVyczogU3VpRGlhbG9nUGFyYW1zKTogVCB7XHJcbiAgY29uc3QgaW5zdGFuY2U6IFQgPSBkaWFsb2dDb25zdHJ1Y3RvcjxUPihjdG9yLCBwYXJhbWV0ZXJzKTtcclxuICBpbnN0YW5jZS5kaXNwbGF5KCk7XHJcbiAgcmV0dXJuIGluc3RhbmNlO1xyXG59XHJcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/dialogs/dialog.ts\n\n}");
3840
3840
 
3841
3841
  /***/ },
3842
3842
 
@@ -3979,7 +3979,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
3979
3979
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3980
3980
 
3981
3981
  "use strict";
3982
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiLyricDialog: () => (/* binding */ SuiLyricDialog)\n/* harmony export */ });\n/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dialog */ \"./src/ui/dialogs/dialog.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\nfunction isSmoLyric(modifier) {\n return (modifier === null || modifier === void 0 ? void 0 : modifier.ctor) === 'SmoLyric';\n}\n/**\n * Complex dialog for traversing and working with lyrics.\n * @category SuiDialog\n */\nclass SuiLyricDialog extends _dialog__WEBPACK_IMPORTED_MODULE_0__.SuiDialogBase {\n static get ctor() {\n return 'SuiLyricDialog';\n }\n static get idleLyricTime() {\n return 5000;\n }\n constructor(parameters) {\n super(SuiLyricDialog.dialogElements, parameters);\n this.modifier = null;\n this.selector = null;\n this.verse = 0;\n this.mouseMoveHandler = null;\n this.mouseClickHandler = null;\n this.config = this.view.config;\n this.displayOptions = ['BINDCOMPONENTS', 'DRAGGABLE', 'KEYBOARD_CAPTURE', 'SELECTIONPOS'];\n this.originalRefreshTimer = this.config.idleRedrawTime;\n this.config.idleRedrawTime = SuiLyricDialog.idleLyricTime;\n this.verse = 0;\n }\n get lyricEditorCtrl() {\n return this.cmap.lyricEditorCtrl;\n }\n get fontCtrl() {\n return this.cmap.fontCtrl;\n }\n get translateYCtrl() {\n return this.cmap.translateYCtrl;\n }\n get verseCtrl() {\n return this.cmap.verseCtrl;\n }\n display() {\n super.display();\n $(this.dgDom.element).find('.smoControl').each((ix, ctrl) => {\n if (!$(ctrl).hasClass('cbLyricEdit')) {\n $(ctrl).addClass('fold-textedit');\n }\n });\n const mousemove = (ev) => __awaiter(this, void 0, void 0, function* () { this.mouseMove(ev); });\n const mouseclick = (ev) => __awaiter(this, void 0, void 0, function* () { this.mouseClick(ev); });\n this.mouseMoveHandler = this.eventSource.bindMouseMoveHandler(mousemove);\n this.mouseClickHandler = this.eventSource.bindMouseClickHandler(mouseclick);\n if (this.lyricEditorCtrl.session && this.lyricEditorCtrl.session.lyric) {\n const lyric = this.lyricEditorCtrl.session.lyric;\n this.fontCtrl.setValue({\n family: lyric.fontInfo.family,\n size: lyric.fontInfo.size,\n weight: 'normal'\n });\n }\n }\n setLyric(selector, lyric) {\n this.modifier = lyric;\n this.verse = lyric.verse;\n this.selector = selector;\n this.translateYCtrl.setValue(lyric.translateY);\n }\n _focusSelection() {\n var _a, _b;\n const selection = (_a = this.lyricEditorCtrl.session) === null || _a === void 0 ? void 0 : _a.selection;\n const note = selection === null || selection === void 0 ? void 0 : selection.note;\n const box = (_b = note === null || note === void 0 ? void 0 : note.logicalBox) !== null && _b !== void 0 ? _b : null;\n if (box) {\n this.view.scroller.scrollVisibleBox(this.view.renderer.pageMap.svgToClient(box));\n }\n }\n changed() {\n this.lyricEditorCtrl.verse = parseInt(this.verseCtrl.getValue().toString(), 10);\n // TODO: make these undoable\n if (this.fontCtrl.changeFlag) {\n const fontInfo = this.fontCtrl.getValue();\n this.view.setLyricFont({ 'family': fontInfo.family, size: fontInfo.size, weight: 'normal' });\n }\n if (this.translateYCtrl && this.modifier && this.selector) {\n this.modifier.translateY = this.translateYCtrl.getValue();\n this.view.addOrUpdateLyric(this.selector, this.modifier);\n }\n }\n bindElements() {\n const dgDom = this.dgDom;\n $(dgDom.element).find('.ok-button').off('click').on('click', () => {\n this._complete();\n });\n $(dgDom.element).find('.cancel-button').off('click').on('click', () => {\n this._complete();\n });\n $(dgDom.element).find('.remove-button').remove();\n this.lyricEditorCtrl.startEditSession();\n }\n // ### handleKeydown\n // allow a dialog to be dismissed by esc.\n evKey(evdata) {\n return __awaiter(this, void 0, void 0, function* () {\n if (evdata.key === 'Escape') {\n $(this.dgDom.element).find('.cancel-button').click();\n evdata.preventDefault();\n }\n else {\n if (!this.lyricEditorCtrl.running) {\n return;\n }\n const edited = yield this.lyricEditorCtrl.evKey(evdata);\n if (edited) {\n evdata.stopPropagation();\n }\n }\n });\n }\n _complete() {\n if (this.lyricEditorCtrl.running) {\n this.lyricEditorCtrl.endSession();\n }\n if (this.mouseMoveHandler) {\n this.eventSource.unbindMouseMoveHandler(this.mouseMoveHandler);\n }\n if (this.mouseClickHandler) {\n this.eventSource.unbindMouseClickHandler(this.mouseClickHandler);\n }\n $('body').removeClass('showAttributeDialog');\n $('body').removeClass('textEditor');\n this.config.idleRedrawTime = this.originalRefreshTimer;\n this.complete();\n }\n mouseMove(ev) {\n if (this.lyricEditorCtrl && this.lyricEditorCtrl.running) {\n this.lyricEditorCtrl.mouseMove(ev);\n }\n }\n mouseClick(ev) {\n if (this.lyricEditorCtrl && this.lyricEditorCtrl.running) {\n this.lyricEditorCtrl.mouseClick(ev);\n ev.stopPropagation();\n }\n }\n}\nSuiLyricDialog.dialogElements = {\n label: 'Lyric Editor', elements: [{\n smoName: 'verse',\n defaultValue: 0,\n control: 'SuiDropdownComponent',\n label: 'Verse',\n classes: 'hide-when-editing',\n startRow: true,\n options: [{\n value: 0,\n label: '1'\n }, {\n value: 1,\n label: '2'\n }, {\n value: 2,\n label: '3'\n }, {\n value: 3,\n label: '4'\n }\n ]\n }, {\n smoName: 'translateY',\n classes: 'hide-when-editing',\n defaultValue: 0,\n control: 'SuiRockerComponent',\n label: 'Y Adjustment (Px)',\n dataType: 'int'\n }, {\n smoName: 'font',\n classes: 'hide-when-editing',\n defaultValue: 0,\n control: 'SuiFontComponent',\n label: 'Font'\n }, {\n smoName: 'lyricEditor',\n defaultValue: 0,\n classes: 'show-always',\n control: 'SuiLyricComponent',\n label: 'Edit Lyrics',\n options: []\n },\n ], staticText: [\n { doneEditing: 'Done Editing Lyrics' },\n { undo: 'Undo Lyrics' },\n { label: 'Lyric Editor' }\n ]\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LElBQUk7WUFDZCxPQUFPLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsR0FBRztpQkFDWCxFQUFFO29CQUNELEtBQUssRUFBRSxDQUFDO29CQUNSLEtBQUssRUFBRSxHQUFHO2lCQUNYLEVBQUU7b0JBQ0QsS0FBSyxFQUFFLENBQUM7b0JBQ1IsS0FBSyxFQUFFLEdBQUc7aUJBQ1gsRUFBRTtvQkFDRCxLQUFLLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsR0FBRztpQkFDWDthQUNBO1NBQ0YsRUFBRTtZQUNELE9BQU8sRUFBRSxZQUFZO1lBQ3JCLE9BQU8sRUFBRSxtQkFBbUI7WUFDNUIsWUFBWSxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUUsb0JBQW9CO1lBQzdCLEtBQUssRUFBRSxtQkFBbUI7WUFDMUIsUUFBUSxFQUFFLEtBQUs7U0FDaEIsRUFBRTtZQUNELE9BQU8sRUFBRSxNQUFNO1lBQ2YsT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixZQUFZLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxrQkFBa0I7WUFDM0IsS0FBSyxFQUFFLE1BQU07U0FDZCxFQUFFO1lBQ0QsT0FBTyxFQUFFLGFBQWE7WUFDdEIsWUFBWSxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUUsYUFBYTtZQUN0QixPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLEtBQUssRUFBRSxhQUFhO1lBQ3BCLE9BQU8sRUFBRSxFQUFFO1NBQ1o7S0FDQSxFQUFFLFVBQVUsRUFBRTtRQUNiLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFO1FBQ3RDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRTtRQUN2QixFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUU7S0FDMUI7Q0FDSixDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3VpL2RpYWxvZ3MvbHlyaWMudHM/MGI1NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuaW1wb3J0IHsgRGlhbG9nRGVmaW5pdGlvbiwgU3VpRGlhbG9nQmFzZSwgU3VpRGlhbG9nUGFyYW1zIH0gZnJvbSAnLi9kaWFsb2cnO1xyXG5pbXBvcnQgeyBTdWlMeXJpY0NvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9ub3RlVGV4dCc7XHJcbmltcG9ydCB7IFN1aURyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Ryb3Bkb3duJztcclxuaW1wb3J0IHsgU3VpUm9ja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3JvY2tlcic7XHJcbmltcG9ydCB7IFN2Z0JveCB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL2NvbW1vbic7XHJcbmltcG9ydCB7IFNtb1NlbGVjdG9yLCBTbW9TZWxlY3Rpb24gfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vc2VsZWN0aW9ucydcclxuaW1wb3J0IHsgU21vTHlyaWMgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9ub3RlTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgU3VpRm9udENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9mb250Q29tcG9uZW50JztcclxuaW1wb3J0IHsgU21vUmVuZGVyQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uLy4uL3JlbmRlci9zdWkvY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IEV2ZW50SGFuZGxlciB9IGZyb20gJy4uL2V2ZW50U291cmNlJztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbmZ1bmN0aW9uIGlzU21vTHlyaWMobW9kaWZpZXI6IGFueSk6bW9kaWZpZXIgaXMgU21vTHlyaWMge1xyXG4gIHJldHVybiBtb2RpZmllcj8uY3RvciA9PT0gJ1Ntb0x5cmljJztcclxufVxyXG4vKipcclxuICogQ29tcGxleCBkaWFsb2cgZm9yIHRyYXZlcnNpbmcgYW5kIHdvcmtpbmcgd2l0aCBseXJpY3MuXHJcbiAqIEBjYXRlZ29yeSBTdWlEaWFsb2dcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTdWlMeXJpY0RpYWxvZyBleHRlbmRzIFN1aURpYWxvZ0Jhc2Uge1xyXG4gIHN0YXRpYyBnZXQgY3RvcigpIHtcclxuICAgIHJldHVybiAnU3VpTHlyaWNEaWFsb2cnO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0IGlkbGVMeXJpY1RpbWUoKSB7XHJcbiAgICByZXR1cm4gNTAwMDtcclxuICB9XHJcbiAgc3RhdGljIGRpYWxvZ0VsZW1lbnRzOiBEaWFsb2dEZWZpbml0aW9uID1cclxuICAgIHtcclxuICAgICAgbGFiZWw6ICdMeXJpYyBFZGl0b3InLCBlbGVtZW50czpcclxuICAgICAgICBbe1xyXG4gICAgICAgICAgc21vTmFtZTogJ3ZlcnNlJyxcclxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMCxcclxuICAgICAgICAgIGNvbnRyb2w6ICdTdWlEcm9wZG93bkNvbXBvbmVudCcsXHJcbiAgICAgICAgICBsYWJlbDogJ1ZlcnNlJyxcclxuICAgICAgICAgIGNsYXNzZXM6ICdoaWRlLXdoZW4tZWRpdGluZycsXHJcbiAgICAgICAgICBzdGFydFJvdzogdHJ1ZSxcclxuICAgICAgICAgIG9wdGlvbnM6IFt7XHJcbiAgICAgICAgICAgIHZhbHVlOiAwLFxyXG4gICAgICAgICAgICBsYWJlbDogJzEnXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHZhbHVlOiAxLFxyXG4gICAgICAgICAgICBsYWJlbDogJzInXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHZhbHVlOiAyLFxyXG4gICAgICAgICAgICBsYWJlbDogJzMnXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHZhbHVlOiAzLFxyXG4gICAgICAgICAgICBsYWJlbDogJzQnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgc21vTmFtZTogJ3RyYW5zbGF0ZVknLFxyXG4gICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nJyxcclxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMCxcclxuICAgICAgICAgIGNvbnRyb2w6ICdTdWlSb2NrZXJDb21wb25lbnQnLFxyXG4gICAgICAgICAgbGFiZWw6ICdZIEFkanVzdG1lbnQgKFB4KScsXHJcbiAgICAgICAgICBkYXRhVHlwZTogJ2ludCdcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICBzbW9OYW1lOiAnZm9udCcsXHJcbiAgICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcnLFxyXG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxyXG4gICAgICAgICAgY29udHJvbDogJ1N1aUZvbnRDb21wb25lbnQnLFxyXG4gICAgICAgICAgbGFiZWw6ICdGb250J1xyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHNtb05hbWU6ICdseXJpY0VkaXRvcicsXHJcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IDAsXHJcbiAgICAgICAgICBjbGFzc2VzOiAnc2hvdy1hbHdheXMnLFxyXG4gICAgICAgICAgY29udHJvbDogJ1N1aUx5cmljQ29tcG9uZW50JyxcclxuICAgICAgICAgIGxhYmVsOiAnRWRpdCBMeXJpY3MnLFxyXG4gICAgICAgICAgb3B0aW9uczogW11cclxuICAgICAgICB9LFxyXG4gICAgICAgIF0sIHN0YXRpY1RleHQ6IFtcclxuICAgICAgICAgIHsgZG9uZUVkaXRpbmc6ICdEb25lIEVkaXRpbmcgTHlyaWNzJyB9LFxyXG4gICAgICAgICAgeyB1bmRvOiAnVW5kbyBMeXJpY3MnIH0sXHJcbiAgICAgICAgICB7IGxhYmVsOiAnTHlyaWMgRWRpdG9yJyB9XHJcbiAgICAgICAgXVxyXG4gICAgfTtcclxuICBvcmlnaW5hbFJlZnJlc2hUaW1lcjogbnVtYmVyO1xyXG4gIG1vZGlmaWVyOiBTbW9MeXJpYyB8IG51bGwgPSBudWxsO1xyXG4gIHNlbGVjdG9yOiBTbW9TZWxlY3RvciB8IG51bGwgPSBudWxsO1xyXG4gIGNvbmZpZzogU21vUmVuZGVyQ29uZmlndXJhdGlvbjtcclxuICB2ZXJzZTogbnVtYmVyID0gMDtcclxuICBtb3VzZU1vdmVIYW5kbGVyOiBFdmVudEhhbmRsZXIgfCBudWxsID0gbnVsbDtcclxuICBtb3VzZUNsaWNrSGFuZGxlcjogRXZlbnRIYW5kbGVyIHwgbnVsbCA9IG51bGw7XHJcbiAgY29uc3RydWN0b3IocGFyYW1ldGVyczogU3VpRGlhbG9nUGFyYW1zKSB7XHJcbiAgICBzdXBlcihTdWlMeXJpY0RpYWxvZy5kaWFsb2dFbGVtZW50cywgcGFyYW1ldGVycyk7XHJcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMudmlldy5jb25maWc7XHJcbiAgICB0aGlzLmRpc3BsYXlPcHRpb25zID0gWydCSU5EQ09NUE9ORU5UUycsICdEUkFHR0FCTEUnLCAnS0VZQk9BUkRfQ0FQVFVSRScsICdTRUxFQ1RJT05QT1MnXTtcclxuICAgIHRoaXMub3JpZ2luYWxSZWZyZXNoVGltZXIgPSB0aGlzLmNvbmZpZy5pZGxlUmVkcmF3VGltZTtcclxuICAgIHRoaXMuY29uZmlnLmlkbGVSZWRyYXdUaW1lID0gU3VpTHlyaWNEaWFsb2cuaWRsZUx5cmljVGltZTtcclxuICAgIHRoaXMudmVyc2UgPSAwO1xyXG4gIH1cclxuICBnZXQgbHlyaWNFZGl0b3JDdHJsKCk6IFN1aUx5cmljQ29tcG9uZW50IHtcclxuICAgIHJldHVybiB0aGlzLmNtYXAubHlyaWNFZGl0b3JDdHJsIGFzIFN1aUx5cmljQ29tcG9uZW50O1xyXG4gIH1cclxuICBnZXQgZm9udEN0cmwoKTogU3VpRm9udENvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLmZvbnRDdHJsIGFzIFN1aUZvbnRDb21wb25lbnQ7XHJcbiAgfVxyXG4gIGdldCB0cmFuc2xhdGVZQ3RybCgpOiBTdWlSb2NrZXJDb21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC50cmFuc2xhdGVZQ3RybCBhcyBTdWlSb2NrZXJDb21wb25lbnQ7XHJcbiAgfVxyXG4gIGdldCB2ZXJzZUN0cmwoKTogU3VpRHJvcGRvd25Db21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC52ZXJzZUN0cmwgYXMgU3VpRHJvcGRvd25Db21wb25lbnQ7XHJcbiAgfVxyXG4gIGRpc3BsYXkoKSB7XHJcbiAgICBzdXBlci5kaXNwbGF5KCk7XHJcbiAgICAkKHRoaXMuZGdEb20uZWxlbWVudCkuZmluZCgnLnNtb0NvbnRyb2wnKS5lYWNoKChpeDogbnVtYmVyLCBjdHJsOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCEkKGN0cmwpLmhhc0NsYXNzKCdjYkx5cmljRWRpdCcpKSB7XHJcbiAgICAgICAgJChjdHJsKS5hZGRDbGFzcygnZm9sZC10ZXh0ZWRpdCcpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IG1vdXNlbW92ZSA9IGFzeW5jIChldjogYW55KSA9PiB7IHRoaXMubW91c2VNb3ZlKGV2KTsgfVxyXG4gICAgY29uc3QgbW91c2VjbGljayA9IGFzeW5jIChldjogYW55KSA9PiB7IHRoaXMubW91c2VDbGljayhldik7IH1cclxuICAgIHRoaXMubW91c2VNb3ZlSGFuZGxlciA9IHRoaXMuZXZlbnRTb3VyY2UuYmluZE1vdXNlTW92ZUhhbmRsZXIobW91c2Vtb3ZlKTtcclxuICAgIHRoaXMubW91c2VDbGlja0hhbmRsZXIgPSB0aGlzLmV2ZW50U291cmNlLmJpbmRNb3VzZUNsaWNrSGFuZGxlcihtb3VzZWNsaWNrKTtcclxuXHJcbiAgICBpZiAodGhpcy5seXJpY0VkaXRvckN0cmwuc2Vzc2lvbiAmJiB0aGlzLmx5cmljRWRpdG9yQ3RybC5zZXNzaW9uLmx5cmljKSB7XHJcbiAgICAgIGNvbnN0IGx5cmljID0gdGhpcy5seXJpY0VkaXRvckN0cmwuc2Vzc2lvbi5seXJpYztcclxuICAgICAgdGhpcy5mb250Q3RybC5zZXRWYWx1ZSh7XHJcbiAgICAgICAgZmFtaWx5OiBseXJpYy5mb250SW5mby5mYW1pbHksXHJcbiAgICAgICAgc2l6ZTogbHlyaWMuZm9udEluZm8uc2l6ZSxcclxuICAgICAgICB3ZWlnaHQ6ICdub3JtYWwnXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBzZXRMeXJpYyhzZWxlY3RvcjogU21vU2VsZWN0b3IsIGx5cmljOiBTbW9MeXJpYykge1xyXG4gICAgdGhpcy5tb2RpZmllciA9IGx5cmljO1xyXG4gICAgdGhpcy52ZXJzZSA9IGx5cmljLnZlcnNlO1xyXG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xyXG4gICAgdGhpcy50cmFuc2xhdGVZQ3RybC5zZXRWYWx1ZShseXJpYy50cmFuc2xhdGVZKTtcclxuICB9XHJcbiAgX2ZvY3VzU2VsZWN0aW9uKCkge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5seXJpY0VkaXRvckN0cmwuc2Vzc2lvbj8uc2VsZWN0aW9uO1xyXG4gICAgY29uc3Qgbm90ZSA9IHNlbGVjdGlvbj8ubm90ZTtcclxuICAgIGNvbnN0IGJveDogU3ZnQm94IHwgbnVsbCA9IG5vdGU/LmxvZ2ljYWxCb3ggPz8gbnVsbDtcclxuICAgIGlmIChib3gpIHtcclxuICAgICAgdGhpcy52aWV3LnNjcm9sbGVyLnNjcm9sbFZpc2libGVCb3godGhpcy52aWV3LnJlbmRlcmVyLnBhZ2VNYXAuc3ZnVG9DbGllbnQoYm94KSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNoYW5nZWQoKSB7XHJcbiAgICB0aGlzLmx5cmljRWRpdG9yQ3RybC52ZXJzZSA9IHBhcnNlSW50KHRoaXMudmVyc2VDdHJsLmdldFZhbHVlKCkudG9TdHJpbmcoKSwgMTApO1xyXG5cclxuICAgIC8vIFRPRE86IG1ha2UgdGhlc2UgdW5kb2FibGVcclxuICAgIGlmICh0aGlzLmZvbnRDdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgY29uc3QgZm9udEluZm8gPSB0aGlzLmZvbnRDdHJsLmdldFZhbHVlKCk7XHJcbiAgICAgIHRoaXMudmlldy5zZXRMeXJpY0ZvbnQoeyAnZmFtaWx5JzogZm9udEluZm8uZmFtaWx5LCBzaXplOiBmb250SW5mby5zaXplLCB3ZWlnaHQ6ICdub3JtYWwnIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudHJhbnNsYXRlWUN0cmwgJiYgdGhpcy5tb2RpZmllciAmJiB0aGlzLnNlbGVjdG9yKSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXIudHJhbnNsYXRlWSA9IHRoaXMudHJhbnNsYXRlWUN0cmwuZ2V0VmFsdWUoKTtcclxuICAgICAgdGhpcy52aWV3LmFkZE9yVXBkYXRlTHlyaWModGhpcy5zZWxlY3RvciwgdGhpcy5tb2RpZmllcik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGJpbmRFbGVtZW50cygpIHtcclxuICAgIGNvbnN0IGRnRG9tID0gdGhpcy5kZ0RvbTtcclxuXHJcbiAgICAkKGRnRG9tLmVsZW1lbnQpLmZpbmQoJy5vay1idXR0b24nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLl9jb21wbGV0ZSgpO1xyXG4gICAgfSk7XHJcbiAgICAkKGRnRG9tLmVsZW1lbnQpLmZpbmQoJy5jYW5jZWwtYnV0dG9uJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgdGhpcy5fY29tcGxldGUoKTtcclxuICAgIH0pO1xyXG4gICAgJChkZ0RvbS5lbGVtZW50KS5maW5kKCcucmVtb3ZlLWJ1dHRvbicpLnJlbW92ZSgpO1xyXG4gICAgdGhpcy5seXJpY0VkaXRvckN0cmwuc3RhcnRFZGl0U2Vzc2lvbigpO1xyXG4gIH1cclxuICAvLyAjIyMgaGFuZGxlS2V5ZG93blxyXG4gIC8vIGFsbG93IGEgZGlhbG9nIHRvIGJlIGRpc21pc3NlZCBieSBlc2MuXHJcbiAgYXN5bmMgZXZLZXkoZXZkYXRhOiBhbnkpIHtcclxuICAgIGlmIChldmRhdGEua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAkKHRoaXMuZGdEb20uZWxlbWVudCkuZmluZCgnLmNhbmNlbC1idXR0b24nKS5jbGljaygpO1xyXG4gICAgICBldmRhdGEucHJldmVudERlZmF1bHQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5seXJpY0VkaXRvckN0cmwucnVubmluZykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBlZGl0ZWQgPSBhd2FpdCB0aGlzLmx5cmljRWRpdG9yQ3RybC5ldktleShldmRhdGEpO1xyXG4gICAgICBpZiAoZWRpdGVkKSB7XHJcbiAgICAgICAgZXZkYXRhLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIF9jb21wbGV0ZSgpIHtcclxuICAgIGlmICh0aGlzLmx5cmljRWRpdG9yQ3RybC5ydW5uaW5nKSB7XHJcbiAgICAgIHRoaXMubHlyaWNFZGl0b3JDdHJsLmVuZFNlc3Npb24oKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1vdXNlTW92ZUhhbmRsZXIpIHtcclxuICAgICAgdGhpcy5ldmVudFNvdXJjZS51bmJpbmRNb3VzZU1vdmVIYW5kbGVyKHRoaXMubW91c2VNb3ZlSGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tb3VzZUNsaWNrSGFuZGxlcikge1xyXG4gICAgICB0aGlzLmV2ZW50U291cmNlLnVuYmluZE1vdXNlQ2xpY2tIYW5kbGVyKHRoaXMubW91c2VDbGlja0hhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdzaG93QXR0cmlidXRlRGlhbG9nJyk7XHJcbiAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3RleHRFZGl0b3InKTtcclxuICAgIHRoaXMuY29uZmlnLmlkbGVSZWRyYXdUaW1lID0gdGhpcy5vcmlnaW5hbFJlZnJlc2hUaW1lcjtcclxuICAgIHRoaXMuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIG1vdXNlTW92ZShldjogYW55KSB7XHJcbiAgICBpZiAodGhpcy5seXJpY0VkaXRvckN0cmwgJiYgdGhpcy5seXJpY0VkaXRvckN0cmwucnVubmluZykge1xyXG4gICAgICB0aGlzLmx5cmljRWRpdG9yQ3RybC5tb3VzZU1vdmUoZXYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbW91c2VDbGljayhldjogYW55KSB7XHJcbiAgICBpZiAodGhpcy5seXJpY0VkaXRvckN0cmwgJiYgdGhpcy5seXJpY0VkaXRvckN0cmwucnVubmluZykge1xyXG4gICAgICB0aGlzLmx5cmljRWRpdG9yQ3RybC5tb3VzZUNsaWNrKGV2KTtcclxuICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59Il0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/dialogs/lyric.ts\n\n}");
3982
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiLyricDialog: () => (/* binding */ SuiLyricDialog)\n/* harmony export */ });\n/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dialog */ \"./src/ui/dialogs/dialog.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\nfunction isSmoLyric(modifier) {\n return (modifier === null || modifier === void 0 ? void 0 : modifier.ctor) === 'SmoLyric';\n}\n/**\n * Complex dialog for traversing and working with lyrics.\n * @category SuiDialog\n */\nclass SuiLyricDialog extends _dialog__WEBPACK_IMPORTED_MODULE_0__.SuiDialogBase {\n static get ctor() {\n return 'SuiLyricDialog';\n }\n static get idleLyricTime() {\n return 5000;\n }\n constructor(parameters) {\n super(SuiLyricDialog.dialogElements, parameters);\n this.modifier = null;\n this.selector = null;\n this.verse = 0;\n this.mouseMoveHandler = null;\n this.mouseClickHandler = null;\n this.config = this.view.config;\n this.displayOptions = ['BINDCOMPONENTS', 'DRAGGABLE', 'KEYBOARD_CAPTURE', 'SELECTIONPOS'];\n this.originalRefreshTimer = this.config.idleRedrawTime;\n this.config.idleRedrawTime = SuiLyricDialog.idleLyricTime;\n this.verse = 0;\n }\n get lyricEditorCtrl() {\n return this.cmap.lyricEditorCtrl;\n }\n get fontCtrl() {\n return this.cmap.fontCtrl;\n }\n get translateYCtrl() {\n return this.cmap.translateYCtrl;\n }\n get verseCtrl() {\n return this.cmap.verseCtrl;\n }\n display() {\n super.display();\n $(this.dgDom.element).find('.smoControl').each((ix, ctrl) => {\n if (!$(ctrl).hasClass('cbLyricEdit')) {\n $(ctrl).addClass('fold-textedit');\n }\n });\n const mousemove = (ev) => __awaiter(this, void 0, void 0, function* () { this.mouseMove(ev); });\n const mouseclick = (ev) => __awaiter(this, void 0, void 0, function* () { this.mouseClick(ev); });\n this.mouseMoveHandler = this.eventSource.bindMouseMoveHandler(mousemove);\n this.mouseClickHandler = this.eventSource.bindMouseClickHandler(mouseclick);\n if (this.lyricEditorCtrl.session && this.lyricEditorCtrl.session.lyric) {\n const lyric = this.lyricEditorCtrl.session.lyric;\n this.fontCtrl.setValue({\n family: lyric.fontInfo.family,\n size: lyric.fontInfo.size,\n weight: 'normal'\n });\n }\n }\n setLyric(selector, lyric) {\n this.modifier = lyric;\n this.verse = lyric.verse;\n this.selector = selector;\n this.translateYCtrl.setValue(lyric.translateY);\n }\n _focusSelection() {\n var _a, _b;\n const selection = (_a = this.lyricEditorCtrl.session) === null || _a === void 0 ? void 0 : _a.selection;\n const note = selection === null || selection === void 0 ? void 0 : selection.note;\n const box = (_b = note === null || note === void 0 ? void 0 : note.logicalBox) !== null && _b !== void 0 ? _b : null;\n if (box) {\n this.view.scroller.scrollVisibleBox(this.view.renderer.pageMap.svgToClient(box));\n }\n }\n changed() {\n return __awaiter(this, void 0, void 0, function* () {\n this.lyricEditorCtrl.verse = parseInt(this.verseCtrl.getValue().toString(), 10);\n // TODO: make these undoable\n if (this.fontCtrl.changeFlag) {\n const fontInfo = this.fontCtrl.getValue();\n this.view.setLyricFont({ 'family': fontInfo.family, size: fontInfo.size, weight: 'normal' });\n }\n if (this.translateYCtrl && this.modifier && this.selector) {\n this.modifier.translateY = this.translateYCtrl.getValue();\n this.view.addOrUpdateLyric(this.selector, this.modifier);\n }\n });\n }\n bindElements() {\n const dgDom = this.dgDom;\n $(dgDom.element).find('.ok-button').off('click').on('click', () => {\n this._complete();\n });\n $(dgDom.element).find('.cancel-button').off('click').on('click', () => {\n this._complete();\n });\n $(dgDom.element).find('.remove-button').remove();\n this.lyricEditorCtrl.startEditSession();\n }\n // ### handleKeydown\n // allow a dialog to be dismissed by esc.\n evKey(evdata) {\n return __awaiter(this, void 0, void 0, function* () {\n if (evdata.key === 'Escape') {\n $(this.dgDom.element).find('.cancel-button').click();\n evdata.preventDefault();\n }\n else {\n if (!this.lyricEditorCtrl.running) {\n return;\n }\n const edited = yield this.lyricEditorCtrl.evKey(evdata);\n if (edited) {\n evdata.stopPropagation();\n }\n }\n });\n }\n _complete() {\n if (this.lyricEditorCtrl.running) {\n this.lyricEditorCtrl.endSession();\n }\n if (this.mouseMoveHandler) {\n this.eventSource.unbindMouseMoveHandler(this.mouseMoveHandler);\n }\n if (this.mouseClickHandler) {\n this.eventSource.unbindMouseClickHandler(this.mouseClickHandler);\n }\n $('body').removeClass('showAttributeDialog');\n $('body').removeClass('textEditor');\n this.config.idleRedrawTime = this.originalRefreshTimer;\n this.complete();\n }\n mouseMove(ev) {\n if (this.lyricEditorCtrl && this.lyricEditorCtrl.running) {\n this.lyricEditorCtrl.mouseMove(ev);\n }\n }\n mouseClick(ev) {\n if (this.lyricEditorCtrl && this.lyricEditorCtrl.running) {\n this.lyricEditorCtrl.mouseClick(ev);\n ev.stopPropagation();\n }\n }\n}\nSuiLyricDialog.dialogElements = {\n label: 'Lyric Editor', elements: [{\n smoName: 'verse',\n defaultValue: 0,\n control: 'SuiDropdownComponent',\n label: 'Verse',\n classes: 'hide-when-editing',\n startRow: true,\n options: [{\n value: 0,\n label: '1'\n }, {\n value: 1,\n label: '2'\n }, {\n value: 2,\n label: '3'\n }, {\n value: 3,\n label: '4'\n }\n ]\n }, {\n smoName: 'translateY',\n classes: 'hide-when-editing',\n defaultValue: 0,\n control: 'SuiRockerComponent',\n label: 'Y Adjustment (Px)',\n dataType: 'int'\n }, {\n smoName: 'font',\n classes: 'hide-when-editing',\n defaultValue: 0,\n control: 'SuiFontComponent',\n label: 'Font'\n }, {\n smoName: 'lyricEditor',\n defaultValue: 0,\n classes: 'show-always',\n control: 'SuiLyricComponent',\n label: 'Edit Lyrics',\n options: []\n },\n ], staticText: [\n { doneEditing: 'Done Editing Lyrics' },\n { undo: 'Undo Lyrics' },\n { label: 'Lyric Editor' }\n ]\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFFBQVEsRUFBRSxJQUFJO1lBQ2QsT0FBTyxFQUFFLENBQUM7b0JBQ1IsS0FBSyxFQUFFLENBQUM7b0JBQ1IsS0FBSyxFQUFFLEdBQUc7aUJBQ1gsRUFBRTtvQkFDRCxLQUFLLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsR0FBRztpQkFDWCxFQUFFO29CQUNELEtBQUssRUFBRSxDQUFDO29CQUNSLEtBQUssRUFBRSxHQUFHO2lCQUNYLEVBQUU7b0JBQ0QsS0FBSyxFQUFFLENBQUM7b0JBQ1IsS0FBSyxFQUFFLEdBQUc7aUJBQ1g7YUFDQTtTQUNGLEVBQUU7WUFDRCxPQUFPLEVBQUUsWUFBWTtZQUNyQixPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFlBQVksRUFBRSxDQUFDO1lBQ2YsT0FBTyxFQUFFLG9CQUFvQjtZQUM3QixLQUFLLEVBQUUsbUJBQW1CO1lBQzFCLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLEVBQUU7WUFDRCxPQUFPLEVBQUUsTUFBTTtZQUNmLE9BQU8sRUFBRSxtQkFBbUI7WUFDNUIsWUFBWSxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUUsa0JBQWtCO1lBQzNCLEtBQUssRUFBRSxNQUFNO1NBQ2QsRUFBRTtZQUNELE9BQU8sRUFBRSxhQUFhO1lBQ3RCLFlBQVksRUFBRSxDQUFDO1lBQ2YsT0FBTyxFQUFFLGFBQWE7WUFDdEIsT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixLQUFLLEVBQUUsYUFBYTtZQUNwQixPQUFPLEVBQUUsRUFBRTtTQUNaO0tBQ0EsRUFBRSxVQUFVLEVBQUU7UUFDYixFQUFFLFdBQVcsRUFBRSxxQkFBcUIsRUFBRTtRQUN0QyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUU7UUFDdkIsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFO0tBQzFCO0NBQ0osQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy91aS9kaWFsb2dzL2x5cmljLnRzPzBiNTciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gW1Ntb29zaWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BYXJvbkRhdmlkTmV3bWFuL1Ntb29zaWMpXHJcbi8vIENvcHlyaWdodCAoYykgQWFyb24gRGF2aWQgTmV3bWFuIDIwMjEuXHJcbmltcG9ydCB7IERpYWxvZ0RlZmluaXRpb24sIFN1aURpYWxvZ0Jhc2UsIFN1aURpYWxvZ1BhcmFtcyB9IGZyb20gJy4vZGlhbG9nJztcclxuaW1wb3J0IHsgU3VpTHlyaWNDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbm90ZVRleHQnO1xyXG5pbXBvcnQgeyBTdWlEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9kcm9wZG93bic7XHJcbmltcG9ydCB7IFN1aVJvY2tlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9yb2NrZXInO1xyXG5pbXBvcnQgeyBTdmdCb3ggfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTbW9TZWxlY3RvciwgU21vU2VsZWN0aW9uIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL3NlbGVjdGlvbnMnXHJcbmltcG9ydCB7IFNtb0x5cmljIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbm90ZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFN1aUZvbnRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZm9udENvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNtb1JlbmRlckNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi8uLi9yZW5kZXIvc3VpL2NvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgeyBFdmVudEhhbmRsZXIgfSBmcm9tICcuLi9ldmVudFNvdXJjZSc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5mdW5jdGlvbiBpc1Ntb0x5cmljKG1vZGlmaWVyOiBhbnkpOm1vZGlmaWVyIGlzIFNtb0x5cmljIHtcclxuICByZXR1cm4gbW9kaWZpZXI/LmN0b3IgPT09ICdTbW9MeXJpYyc7XHJcbn1cclxuLyoqXHJcbiAqIENvbXBsZXggZGlhbG9nIGZvciB0cmF2ZXJzaW5nIGFuZCB3b3JraW5nIHdpdGggbHlyaWNzLlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpTHlyaWNEaWFsb2cgZXh0ZW5kcyBTdWlEaWFsb2dCYXNlIHtcclxuICBzdGF0aWMgZ2V0IGN0b3IoKSB7XHJcbiAgICByZXR1cm4gJ1N1aUx5cmljRGlhbG9nJztcclxuICB9XHJcbiAgc3RhdGljIGdldCBpZGxlTHlyaWNUaW1lKCkge1xyXG4gICAgcmV0dXJuIDUwMDA7XHJcbiAgfVxyXG4gIHN0YXRpYyBkaWFsb2dFbGVtZW50czogRGlhbG9nRGVmaW5pdGlvbiA9XHJcbiAgICB7XHJcbiAgICAgIGxhYmVsOiAnTHlyaWMgRWRpdG9yJywgZWxlbWVudHM6XHJcbiAgICAgICAgW3tcclxuICAgICAgICAgIHNtb05hbWU6ICd2ZXJzZScsXHJcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IDAsXHJcbiAgICAgICAgICBjb250cm9sOiAnU3VpRHJvcGRvd25Db21wb25lbnQnLFxyXG4gICAgICAgICAgbGFiZWw6ICdWZXJzZScsXHJcbiAgICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcnLFxyXG4gICAgICAgICAgc3RhcnRSb3c6IHRydWUsXHJcbiAgICAgICAgICBvcHRpb25zOiBbe1xyXG4gICAgICAgICAgICB2YWx1ZTogMCxcclxuICAgICAgICAgICAgbGFiZWw6ICcxJ1xyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB2YWx1ZTogMSxcclxuICAgICAgICAgICAgbGFiZWw6ICcyJ1xyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB2YWx1ZTogMixcclxuICAgICAgICAgICAgbGFiZWw6ICczJ1xyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB2YWx1ZTogMyxcclxuICAgICAgICAgICAgbGFiZWw6ICc0J1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgIHNtb05hbWU6ICd0cmFuc2xhdGVZJyxcclxuICAgICAgICAgIGNsYXNzZXM6ICdoaWRlLXdoZW4tZWRpdGluZycsXHJcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IDAsXHJcbiAgICAgICAgICBjb250cm9sOiAnU3VpUm9ja2VyQ29tcG9uZW50JyxcclxuICAgICAgICAgIGxhYmVsOiAnWSBBZGp1c3RtZW50IChQeCknLFxyXG4gICAgICAgICAgZGF0YVR5cGU6ICdpbnQnXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgc21vTmFtZTogJ2ZvbnQnLFxyXG4gICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nJyxcclxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMCxcclxuICAgICAgICAgIGNvbnRyb2w6ICdTdWlGb250Q29tcG9uZW50JyxcclxuICAgICAgICAgIGxhYmVsOiAnRm9udCdcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICBzbW9OYW1lOiAnbHlyaWNFZGl0b3InLFxyXG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxyXG4gICAgICAgICAgY2xhc3NlczogJ3Nob3ctYWx3YXlzJyxcclxuICAgICAgICAgIGNvbnRyb2w6ICdTdWlMeXJpY0NvbXBvbmVudCcsXHJcbiAgICAgICAgICBsYWJlbDogJ0VkaXQgTHlyaWNzJyxcclxuICAgICAgICAgIG9wdGlvbnM6IFtdXHJcbiAgICAgICAgfSxcclxuICAgICAgICBdLCBzdGF0aWNUZXh0OiBbXHJcbiAgICAgICAgICB7IGRvbmVFZGl0aW5nOiAnRG9uZSBFZGl0aW5nIEx5cmljcycgfSxcclxuICAgICAgICAgIHsgdW5kbzogJ1VuZG8gTHlyaWNzJyB9LFxyXG4gICAgICAgICAgeyBsYWJlbDogJ0x5cmljIEVkaXRvcicgfVxyXG4gICAgICAgIF1cclxuICAgIH07XHJcbiAgb3JpZ2luYWxSZWZyZXNoVGltZXI6IG51bWJlcjtcclxuICBtb2RpZmllcjogU21vTHlyaWMgfCBudWxsID0gbnVsbDtcclxuICBzZWxlY3RvcjogU21vU2VsZWN0b3IgfCBudWxsID0gbnVsbDtcclxuICBjb25maWc6IFNtb1JlbmRlckNvbmZpZ3VyYXRpb247XHJcbiAgdmVyc2U6IG51bWJlciA9IDA7XHJcbiAgbW91c2VNb3ZlSGFuZGxlcjogRXZlbnRIYW5kbGVyIHwgbnVsbCA9IG51bGw7XHJcbiAgbW91c2VDbGlja0hhbmRsZXI6IEV2ZW50SGFuZGxlciB8IG51bGwgPSBudWxsO1xyXG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnM6IFN1aURpYWxvZ1BhcmFtcykge1xyXG4gICAgc3VwZXIoU3VpTHlyaWNEaWFsb2cuZGlhbG9nRWxlbWVudHMsIHBhcmFtZXRlcnMpO1xyXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLnZpZXcuY29uZmlnO1xyXG4gICAgdGhpcy5kaXNwbGF5T3B0aW9ucyA9IFsnQklORENPTVBPTkVOVFMnLCAnRFJBR0dBQkxFJywgJ0tFWUJPQVJEX0NBUFRVUkUnLCAnU0VMRUNUSU9OUE9TJ107XHJcbiAgICB0aGlzLm9yaWdpbmFsUmVmcmVzaFRpbWVyID0gdGhpcy5jb25maWcuaWRsZVJlZHJhd1RpbWU7XHJcbiAgICB0aGlzLmNvbmZpZy5pZGxlUmVkcmF3VGltZSA9IFN1aUx5cmljRGlhbG9nLmlkbGVMeXJpY1RpbWU7XHJcbiAgICB0aGlzLnZlcnNlID0gMDtcclxuICB9XHJcbiAgZ2V0IGx5cmljRWRpdG9yQ3RybCgpOiBTdWlMeXJpY0NvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLmx5cmljRWRpdG9yQ3RybCBhcyBTdWlMeXJpY0NvbXBvbmVudDtcclxuICB9XHJcbiAgZ2V0IGZvbnRDdHJsKCk6IFN1aUZvbnRDb21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC5mb250Q3RybCBhcyBTdWlGb250Q29tcG9uZW50O1xyXG4gIH1cclxuICBnZXQgdHJhbnNsYXRlWUN0cmwoKTogU3VpUm9ja2VyQ29tcG9uZW50IHtcclxuICAgIHJldHVybiB0aGlzLmNtYXAudHJhbnNsYXRlWUN0cmwgYXMgU3VpUm9ja2VyQ29tcG9uZW50O1xyXG4gIH1cclxuICBnZXQgdmVyc2VDdHJsKCk6IFN1aURyb3Bkb3duQ29tcG9uZW50IHtcclxuICAgIHJldHVybiB0aGlzLmNtYXAudmVyc2VDdHJsIGFzIFN1aURyb3Bkb3duQ29tcG9uZW50O1xyXG4gIH1cclxuICBkaXNwbGF5KCkge1xyXG4gICAgc3VwZXIuZGlzcGxheSgpO1xyXG4gICAgJCh0aGlzLmRnRG9tLmVsZW1lbnQpLmZpbmQoJy5zbW9Db250cm9sJykuZWFjaCgoaXg6IG51bWJlciwgY3RybDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghJChjdHJsKS5oYXNDbGFzcygnY2JMeXJpY0VkaXQnKSkge1xyXG4gICAgICAgICQoY3RybCkuYWRkQ2xhc3MoJ2ZvbGQtdGV4dGVkaXQnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBtb3VzZW1vdmUgPSBhc3luYyAoZXY6IGFueSkgPT4geyB0aGlzLm1vdXNlTW92ZShldik7IH1cclxuICAgIGNvbnN0IG1vdXNlY2xpY2sgPSBhc3luYyAoZXY6IGFueSkgPT4geyB0aGlzLm1vdXNlQ2xpY2soZXYpOyB9XHJcbiAgICB0aGlzLm1vdXNlTW92ZUhhbmRsZXIgPSB0aGlzLmV2ZW50U291cmNlLmJpbmRNb3VzZU1vdmVIYW5kbGVyKG1vdXNlbW92ZSk7XHJcbiAgICB0aGlzLm1vdXNlQ2xpY2tIYW5kbGVyID0gdGhpcy5ldmVudFNvdXJjZS5iaW5kTW91c2VDbGlja0hhbmRsZXIobW91c2VjbGljayk7XHJcblxyXG4gICAgaWYgKHRoaXMubHlyaWNFZGl0b3JDdHJsLnNlc3Npb24gJiYgdGhpcy5seXJpY0VkaXRvckN0cmwuc2Vzc2lvbi5seXJpYykge1xyXG4gICAgICBjb25zdCBseXJpYyA9IHRoaXMubHlyaWNFZGl0b3JDdHJsLnNlc3Npb24ubHlyaWM7XHJcbiAgICAgIHRoaXMuZm9udEN0cmwuc2V0VmFsdWUoe1xyXG4gICAgICAgIGZhbWlseTogbHlyaWMuZm9udEluZm8uZmFtaWx5LFxyXG4gICAgICAgIHNpemU6IGx5cmljLmZvbnRJbmZvLnNpemUsXHJcbiAgICAgICAgd2VpZ2h0OiAnbm9ybWFsJ1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgc2V0THlyaWMoc2VsZWN0b3I6IFNtb1NlbGVjdG9yLCBseXJpYzogU21vTHlyaWMpIHtcclxuICAgIHRoaXMubW9kaWZpZXIgPSBseXJpYztcclxuICAgIHRoaXMudmVyc2UgPSBseXJpYy52ZXJzZTtcclxuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcclxuICAgIHRoaXMudHJhbnNsYXRlWUN0cmwuc2V0VmFsdWUobHlyaWMudHJhbnNsYXRlWSk7XHJcbiAgfVxyXG4gIF9mb2N1c1NlbGVjdGlvbigpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMubHlyaWNFZGl0b3JDdHJsLnNlc3Npb24/LnNlbGVjdGlvbjtcclxuICAgIGNvbnN0IG5vdGUgPSBzZWxlY3Rpb24/Lm5vdGU7XHJcbiAgICBjb25zdCBib3g6IFN2Z0JveCB8IG51bGwgPSBub3RlPy5sb2dpY2FsQm94ID8/IG51bGw7XHJcbiAgICBpZiAoYm94KSB7XHJcbiAgICAgIHRoaXMudmlldy5zY3JvbGxlci5zY3JvbGxWaXNpYmxlQm94KHRoaXMudmlldy5yZW5kZXJlci5wYWdlTWFwLnN2Z1RvQ2xpZW50KGJveCkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBhc3luYyBjaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5seXJpY0VkaXRvckN0cmwudmVyc2UgPSBwYXJzZUludCh0aGlzLnZlcnNlQ3RybC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCksIDEwKTtcclxuXHJcbiAgICAvLyBUT0RPOiBtYWtlIHRoZXNlIHVuZG9hYmxlXHJcbiAgICBpZiAodGhpcy5mb250Q3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIGNvbnN0IGZvbnRJbmZvID0gdGhpcy5mb250Q3RybC5nZXRWYWx1ZSgpO1xyXG4gICAgICB0aGlzLnZpZXcuc2V0THlyaWNGb250KHsgJ2ZhbWlseSc6IGZvbnRJbmZvLmZhbWlseSwgc2l6ZTogZm9udEluZm8uc2l6ZSwgd2VpZ2h0OiAnbm9ybWFsJyB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRyYW5zbGF0ZVlDdHJsICYmIHRoaXMubW9kaWZpZXIgJiYgdGhpcy5zZWxlY3Rvcikge1xyXG4gICAgICB0aGlzLm1vZGlmaWVyLnRyYW5zbGF0ZVkgPSB0aGlzLnRyYW5zbGF0ZVlDdHJsLmdldFZhbHVlKCk7XHJcbiAgICAgIHRoaXMudmlldy5hZGRPclVwZGF0ZUx5cmljKHRoaXMuc2VsZWN0b3IsIHRoaXMubW9kaWZpZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuICBiaW5kRWxlbWVudHMoKSB7XHJcbiAgICBjb25zdCBkZ0RvbSA9IHRoaXMuZGdEb207XHJcblxyXG4gICAgJChkZ0RvbS5lbGVtZW50KS5maW5kKCcub2stYnV0dG9uJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgdGhpcy5fY29tcGxldGUoKTtcclxuICAgIH0pO1xyXG4gICAgJChkZ0RvbS5lbGVtZW50KS5maW5kKCcuY2FuY2VsLWJ1dHRvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2NvbXBsZXRlKCk7XHJcbiAgICB9KTtcclxuICAgICQoZGdEb20uZWxlbWVudCkuZmluZCgnLnJlbW92ZS1idXR0b24nKS5yZW1vdmUoKTtcclxuICAgIHRoaXMubHlyaWNFZGl0b3JDdHJsLnN0YXJ0RWRpdFNlc3Npb24oKTtcclxuICB9XHJcbiAgLy8gIyMjIGhhbmRsZUtleWRvd25cclxuICAvLyBhbGxvdyBhIGRpYWxvZyB0byBiZSBkaXNtaXNzZWQgYnkgZXNjLlxyXG4gIGFzeW5jIGV2S2V5KGV2ZGF0YTogYW55KSB7XHJcbiAgICBpZiAoZXZkYXRhLmtleSA9PT0gJ0VzY2FwZScpIHtcclxuICAgICAgJCh0aGlzLmRnRG9tLmVsZW1lbnQpLmZpbmQoJy5jYW5jZWwtYnV0dG9uJykuY2xpY2soKTtcclxuICAgICAgZXZkYXRhLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMubHlyaWNFZGl0b3JDdHJsLnJ1bm5pbmcpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZWRpdGVkID0gYXdhaXQgdGhpcy5seXJpY0VkaXRvckN0cmwuZXZLZXkoZXZkYXRhKTtcclxuICAgICAgaWYgKGVkaXRlZCkge1xyXG4gICAgICAgIGV2ZGF0YS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBfY29tcGxldGUoKSB7XHJcbiAgICBpZiAodGhpcy5seXJpY0VkaXRvckN0cmwucnVubmluZykge1xyXG4gICAgICB0aGlzLmx5cmljRWRpdG9yQ3RybC5lbmRTZXNzaW9uKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tb3VzZU1vdmVIYW5kbGVyKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRTb3VyY2UudW5iaW5kTW91c2VNb3ZlSGFuZGxlcih0aGlzLm1vdXNlTW92ZUhhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubW91c2VDbGlja0hhbmRsZXIpIHtcclxuICAgICAgdGhpcy5ldmVudFNvdXJjZS51bmJpbmRNb3VzZUNsaWNrSGFuZGxlcih0aGlzLm1vdXNlQ2xpY2tIYW5kbGVyKTtcclxuICAgIH1cclxuICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygnc2hvd0F0dHJpYnV0ZURpYWxvZycpO1xyXG4gICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCd0ZXh0RWRpdG9yJyk7XHJcbiAgICB0aGlzLmNvbmZpZy5pZGxlUmVkcmF3VGltZSA9IHRoaXMub3JpZ2luYWxSZWZyZXNoVGltZXI7XHJcbiAgICB0aGlzLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBtb3VzZU1vdmUoZXY6IGFueSkge1xyXG4gICAgaWYgKHRoaXMubHlyaWNFZGl0b3JDdHJsICYmIHRoaXMubHlyaWNFZGl0b3JDdHJsLnJ1bm5pbmcpIHtcclxuICAgICAgdGhpcy5seXJpY0VkaXRvckN0cmwubW91c2VNb3ZlKGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlQ2xpY2soZXY6IGFueSkge1xyXG4gICAgaWYgKHRoaXMubHlyaWNFZGl0b3JDdHJsICYmIHRoaXMubHlyaWNFZGl0b3JDdHJsLnJ1bm5pbmcpIHtcclxuICAgICAgdGhpcy5seXJpY0VkaXRvckN0cmwubW91c2VDbGljayhldik7XHJcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxufSJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/dialogs/lyric.ts\n\n}");
3983
3983
 
3984
3984
  /***/ },
3985
3985
 
@@ -4166,7 +4166,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
4166
4166
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
4167
4167
 
4168
4168
  "use strict";
4169
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiTextBlockDialog: () => (/* binding */ SuiTextBlockDialog),\n/* harmony export */ helpModal: () => (/* binding */ helpModal)\n/* harmony export */ });\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/scoreText */ \"./src/smo/data/scoreText.ts\");\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../render/sui/layoutDebug */ \"./src/render/sui/layoutDebug.ts\");\n/* harmony import */ var _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../render/sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _render_sui_textEdit__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../render/sui/textEdit */ \"./src/render/sui/textEdit.ts\");\n/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dialog */ \"./src/ui/dialogs/dialog.ts\");\n/* harmony import */ var _help__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../help */ \"./src/ui/help.ts\");\n/* harmony import */ var _smo_xform_undo__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../smo/xform/undo */ \"./src/smo/xform/undo.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 * Complex dialog for managing score text (not associated with music)\n * @category SuiDialog\n */\nclass SuiTextBlockDialog extends _dialog__WEBPACK_IMPORTED_MODULE_6__.SuiDialogBase {\n get textEditorCtrl() {\n return this.cmap.textEditorCtrl;\n }\n get insertCodeCtrl() {\n return this.cmap.insertCodeCtrl;\n }\n get textDraggerCtrl() {\n return this.cmap.textDraggerCtrl;\n }\n get yCtrl() {\n return this.cmap.yCtrl;\n }\n get xCtrl() {\n return this.cmap.xCtrl;\n }\n get fontCtrl() {\n return this.cmap.fontCtrl;\n }\n get textBlockCtrl() {\n return this.cmap.textBlockCtrl;\n }\n get paginationCtrl() {\n return this.cmap.paginationCtrl;\n }\n get attachToSelectorCtrl() {\n return this.cmap.attachToSelectorCtrl;\n }\n constructor(parameters) {\n var _a;\n let edited = false;\n let isNew = false;\n const originalTextGroup = (_a = parameters.modifier) !== null && _a !== void 0 ? _a : null;\n const tracker = parameters.view.tracker;\n ['staffModifier', 'suggestion'].forEach((outlineType) => {\n if (tracker.outlines[outlineType]) {\n _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_4__.SvgHelpers.eraseOutline(tracker.outlines[outlineType]);\n }\n });\n // Create a new text modifier, if this is new text. Else use selection\n if (!parameters.modifier) {\n isNew = true;\n const textParams = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoScoreText.defaults;\n const newText = new _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoScoreText(textParams);\n // convert scroll from screen coord to svg coord\n const svgScroll = tracker.renderer.pageMap.clientToSvg(_render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_4__.SvgHelpers.smoBox(tracker.scroller.scrollState));\n newText.y += svgScroll.y;\n newText.x += svgScroll.x;\n if (tracker.selections.length > 0) {\n const sel = tracker.selections[0].measure.svg;\n if (typeof (sel.logicalBox) !== 'undefined') {\n if (sel.logicalBox.y >= newText.y) {\n newText.y = sel.logicalBox.y;\n newText.x = sel.logicalBox.x;\n }\n }\n }\n const grpParams = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.defaults;\n grpParams.textBlocks = [{ text: newText, position: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.relativePositions.LEFT, activeText: true }];\n const newGroup = new _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup(grpParams);\n parameters.modifier = newGroup;\n parameters.modifier.setActiveBlock(newText);\n parameters.view.groupUndo(true);\n parameters.view.addTextGroup(parameters.modifier);\n edited = true;\n }\n else {\n // Make sure there is a score text to start the editing.\n parameters.modifier = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.deserializePreserveId(parameters.modifier);\n parameters.modifier.setActiveBlock(parameters.modifier.textBlocks[0].text);\n }\n super(SuiTextBlockDialog.dialogElements, parameters);\n this.originalTextGroup = null;\n this.outlineRect = null;\n this.originalTextGroup = originalTextGroup;\n this.isNew = isNew;\n this.modifier = parameters.modifier;\n this.displayOptions = ['BINDCOMPONENTS', 'DRAGGABLE', 'KEYBOARD_CAPTURE', 'MODIFIERPOS'];\n this.edited = edited;\n this.view.groupUndo(true);\n this.activeScoreText = this.modifier.getActiveBlock();\n this.mouseMoveHandler = null;\n this.mouseUpHandler = null;\n this.mouseDownHandler = null;\n this.mouseClickHandler = null;\n }\n populateInitial() {\n this.textBlockCtrl.setValue({\n activeScoreText: this.activeScoreText,\n modifier: this.modifier\n });\n const fontFamily = this.activeScoreText.fontInfo.family;\n const fontSize = this.activeScoreText.fontInfo.size;\n this.fontCtrl.setValue({\n family: fontFamily,\n size: fontSize,\n style: this.activeScoreText.fontInfo.style,\n weight: this.activeScoreText.fontInfo.weight\n });\n this.attachToSelectorCtrl.setValue(this.modifier.attachToSelector);\n const ul = this.modifier.ul();\n this.xCtrl.setValue(ul.x);\n this.yCtrl.setValue(ul.y);\n this.paginationCtrl.setValue(this.modifier.pagination);\n this.highlightActiveRegion();\n }\n static unrenderTextGroup(tg) {\n tg.elements.forEach((el) => {\n (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_0__.RemoveElementLike)(el);\n });\n tg.elements = [];\n }\n unrenderOriginal() {\n if (this.originalTextGroup) {\n SuiTextBlockDialog.unrenderTextGroup(this.originalTextGroup);\n }\n }\n display() {\n const pageContext = this.view.renderer.pageMap.getRendererFromModifier(this.activeScoreText);\n const svg = pageContext.svg;\n this.textElement = $(svg).find('.' + this.activeScoreText.attrs.id)[0];\n $('body').addClass('showAttributeDialog');\n $('body').addClass('textEditor');\n this.applyDisplayOptions();\n this.populateInitial();\n this.bindElements();\n if (!this.modifier.logicalBox) {\n this.view.renderer.renderTextGroup(this.modifier);\n }\n // If this control has not been edited this session, assume they want to\n // edit the text and just right into that.\n if (!this.modifier.edited) {\n this.modifier.edited = true;\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_3__.layoutDebug.addDialogDebug('text transform db: startEditSession');\n this.unrenderOriginal();\n this.textEditorCtrl.startEditSession();\n }\n const mousemove = (ev) => __awaiter(this, void 0, void 0, function* () {\n this.mouseMove(ev);\n });\n const mouseup = (ev) => __awaiter(this, void 0, void 0, function* () {\n this.mouseUp();\n });\n const mousedown = (ev) => __awaiter(this, void 0, void 0, function* () {\n this.mouseDown(ev);\n });\n const mouseclick = (ev) => __awaiter(this, void 0, void 0, function* () {\n this.mouseClick(ev);\n });\n this.mouseMoveHandler = this.eventSource.bindMouseMoveHandler(mousemove);\n this.mouseUpHandler = this.eventSource.bindMouseUpHandler(mouseup);\n this.mouseDownHandler = this.eventSource.bindMouseDownHandler(mousedown);\n this.mouseClickHandler = this.eventSource.bindMouseClickHandler(mouseclick);\n }\n _resetAttachToSelector() {\n this.modifier.attachToSelector = false;\n this.modifier.selector = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.defaults.selector;\n this.modifier.musicXOffset = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.defaults.musicXOffset;\n this.modifier.musicYOffset = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.defaults.musicYOffset;\n }\n _activateAttachToSelector() {\n this.modifier.attachToSelector = true;\n this.modifier.selector = JSON.parse(JSON.stringify(this.view.tracker.selections[0].selector));\n if (this.modifier.logicalBox) {\n this.modifier.musicXOffset = this.modifier.logicalBox.x - this.view.tracker.selections[0].measure.svg.logicalBox.x;\n this.modifier.musicYOffset = this.modifier.logicalBox.y - this.view.tracker.selections[0].measure.svg.logicalBox.y;\n }\n }\n changed() {\n this.edited = true;\n if (this.insertCodeCtrl.changeFlag && this.textEditorCtrl.session) {\n const val = this.insertCodeCtrl.getValue().toString().split('');\n val.forEach((key) => {\n this.evKey({ key });\n });\n this.insertCodeCtrl.unselect();\n }\n if (this.textBlockCtrl.changeFlag) {\n const nval = this.textBlockCtrl.getValue();\n this.activeScoreText = nval.activeScoreText;\n this.highlightActiveRegion();\n }\n if (this.textEditorCtrl.changeFlag) {\n this.highlightActiveRegion();\n }\n if (this.attachToSelectorCtrl.changeFlag) {\n const toSet = this.attachToSelectorCtrl.getValue();\n if (toSet) {\n this._activateAttachToSelector();\n this.paginationCtrl.setValue(_smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.ONCE);\n this.modifier.pagination = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.ONCE;\n }\n else {\n this._resetAttachToSelector();\n }\n }\n const pos = this.modifier.ul();\n // position can change from drag or by dialog - only update from\n // dialog entries if that changed.\n if (this.xCtrl.changeFlag) {\n this.modifier.offsetX(this.xCtrl.getValue() - pos.x);\n }\n if (this.yCtrl.changeFlag) {\n this.modifier.offsetY(this.yCtrl.getValue() - pos.y);\n }\n if (this.textDraggerCtrl.changeFlag) {\n this.xCtrl.setValue(pos.x);\n this.yCtrl.setValue(pos.y);\n }\n if (this.paginationCtrl.changeFlag) {\n this.modifier.pagination = parseInt(this.paginationCtrl.getValue().toString(), 10);\n // Pagination and attach to measure don't mix.\n this._resetAttachToSelector();\n this.attachToSelectorCtrl.setValue(false);\n }\n if (this.fontCtrl.changeFlag) {\n const fontInfo = this.fontCtrl.getValue();\n this.activeScoreText.fontInfo.family = fontInfo.family;\n // transitioning away from non-point-based font size units\n this.activeScoreText.fontInfo.size = fontInfo.size;\n this.activeScoreText.fontInfo.weight = fontInfo.weight;\n this.activeScoreText.fontInfo.style = fontInfo.style;\n }\n // Use layout context because render may have reset svg.\n const subtype = this.isNew ? _smo_xform_undo__WEBPACK_IMPORTED_MODULE_8__.UndoBuffer.bufferSubtypes.ADD : _smo_xform_undo__WEBPACK_IMPORTED_MODULE_8__.UndoBuffer.bufferSubtypes.UPDATE;\n this.view.updateTextGroup(this.modifier);\n }\n highlightActiveRegion() {\n const pageContext = this.view.renderer.pageMap.getRendererFromModifier(this.activeScoreText);\n const svg = pageContext.svg;\n if (this.activeScoreText.logicalBox) {\n const stroke = _render_sui_textEdit__WEBPACK_IMPORTED_MODULE_5__.SuiTextEditor.strokes['text-highlight'];\n if (!this.outlineRect) {\n this.outlineRect = {\n context: pageContext,\n classes: '',\n stroke,\n box: this.activeScoreText.logicalBox,\n scroll: this.scroller.scrollState,\n timeOff: 1000\n };\n }\n _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_4__.SvgHelpers.eraseOutline(this.outlineRect);\n this.outlineRect.box = this.activeScoreText.logicalBox;\n _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_4__.SvgHelpers.outlineRect(this.outlineRect);\n }\n }\n // ### handleKeydown\n // allow a dialog to be dismissed by esc.\n evKey(evdata) {\n if (evdata.key === 'Escape') {\n $(this.dgDom.element).find('.cancel-button').click();\n evdata.preventDefault();\n }\n else {\n this.textEditorCtrl.evKey(evdata);\n }\n }\n // ### Event handlers, passed from dialog\n mouseUp() {\n if (this.textDraggerCtrl && this.textDraggerCtrl.running) {\n this.textDraggerCtrl.mouseUp(null);\n }\n }\n mouseMove(ev) {\n if (this.textDraggerCtrl && this.textDraggerCtrl.running) {\n this.textDraggerCtrl.mouseMove(ev);\n }\n else if (this.textEditorCtrl && this.textEditorCtrl.isRunning) {\n this.textEditorCtrl.mouseMove(ev);\n }\n }\n mouseClick(ev) {\n if (this.textEditorCtrl && this.textEditorCtrl.isRunning) {\n this.textEditorCtrl.mouseClick(ev);\n ev.stopPropagation();\n }\n }\n mouseDown(ev) {\n if (this.textDraggerCtrl && this.textDraggerCtrl.running) {\n this.textDraggerCtrl.mouseDown(ev);\n }\n }\n _complete() {\n this.view.groupUndo(false);\n this.modifier.setActiveBlock(null);\n this.view.tracker.updateMap(); // update the text map\n this.view.renderer.setDirty();\n if (this.mouseDownHandler) {\n this.eventSource.unbindMouseDownHandler(this.mouseDownHandler);\n }\n if (this.mouseUpHandler) {\n this.eventSource.unbindMouseUpHandler(this.mouseUpHandler);\n }\n if (this.mouseMoveHandler) {\n this.eventSource.unbindMouseMoveHandler(this.mouseMoveHandler);\n }\n if (this.mouseClickHandler) {\n this.eventSource.unbindMouseClickHandler(this.mouseClickHandler);\n }\n if (this.outlineRect) {\n _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_4__.SvgHelpers.eraseOutline(this.outlineRect);\n }\n // Hack - this comes from SuiInlineText and SuiTextEdit.\n $('body').removeClass('showAttributeDialog');\n $('body').removeClass('textEditor');\n this.complete();\n }\n _removeText() {\n // The modifier rendered is for edit, not the one attached to the score. so\n // unrender it now\n SuiTextBlockDialog.unrenderTextGroup(this.modifier);\n this.view.removeTextGroup(this.modifier);\n }\n bindElements() {\n const dgDom = this.dgDom;\n $(dgDom.element).find('.ok-button').off('click').on('click', () => {\n const subtype = this.isNew ? _smo_xform_undo__WEBPACK_IMPORTED_MODULE_8__.UndoBuffer.bufferSubtypes.ADD : _smo_xform_undo__WEBPACK_IMPORTED_MODULE_8__.UndoBuffer.bufferSubtypes.UPDATE;\n this.view.updateTextGroup(this.modifier);\n this._complete();\n });\n $(dgDom.element).find('.cancel-button').off('click').on('click', () => {\n if (this.edited) {\n this.modifier.elements.forEach((element) => {\n (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_0__.RemoveElementLike)(element);\n });\n this.modifier.elements = [];\n this.view.undo();\n }\n this._complete();\n });\n $(dgDom.element).find('.remove-button').off('click').on('click', () => {\n this._removeText();\n this._complete();\n });\n }\n}\nSuiTextBlockDialog.dialogElements = {\n label: 'Text Properties', elements: [{\n smoName: 'textEditor',\n defaultValue: 0,\n control: 'SuiTextInPlace',\n classes: 'show-always hide-when-moving',\n label: 'Edit Text',\n options: []\n }, {\n smoName: 'insertCode',\n classes: 'show-when-editing hide-when-moving',\n control: 'SuiDropdownComponent',\n label: 'Insert Special',\n options: [\n { value: '@@@', label: 'Pages' },\n { value: '###', label: 'Page Number' }\n ]\n }, {\n smoName: 'textDragger',\n classes: 'hide-when-editing show-when-moving',\n defaultValue: 0,\n control: 'SuiDragText',\n label: 'Move Text',\n options: []\n }, {\n smoName: 'x',\n defaultValue: 0,\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiRockerComponent',\n label: 'X Position (Px)',\n dataType: 'int'\n }, {\n smoName: 'y',\n defaultValue: 0,\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiRockerComponent',\n label: 'Y Position (Px)',\n dataType: 'int'\n }, {\n smoName: 'font',\n classes: 'hide-when-editing hide-when-moving',\n defaultValue: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoScoreText.fontFamilies.times,\n control: 'SuiFontComponent',\n label: 'Font Information'\n },\n {\n smoName: 'textBlock',\n classes: 'hide-when-editing hide-when-moving',\n defaultValue: '',\n control: 'SuiTextBlockComponent',\n label: 'Text Block Properties'\n },\n {\n smoName: 'pagination',\n defaultValue: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.ONCE,\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiDropdownComponent',\n label: 'Page Behavior',\n startRow: true,\n options: [{ value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.ONCE, label: 'Once' },\n { value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.EVERY, label: 'Every' },\n { value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.ODD, label: 'Odd' },\n { value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.SUBSEQUENT, label: 'Subsequent' }\n ]\n }, {\n smoName: 'attachToSelector',\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiToggleComponent',\n label: 'Attach to Selection'\n }],\n staticText: [\n { label: 'Text Properties' },\n { editorLabel: 'Done Editing Text' },\n { draggerLabel: 'Done Dragging Text' }\n ]\n};\n/**\n * @category SuiDialog\n */\nclass helpModal {\n static createAndDisplay() {\n _help__WEBPACK_IMPORTED_MODULE_7__.SuiHelp.displayHelp();\n return (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_2__.closeDialogPromise)();\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O1lBQ3JCLFlBQVksRUFBRSw2REFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJO1lBQzNDLE9BQU8sRUFBRSxvQ0FBb0M7WUFDN0MsT0FBTyxFQUFFLHNCQUFzQjtZQUMvQixLQUFLLEVBQUUsZUFBZTtZQUN0QixRQUFRLEVBQUUsSUFBSTtZQUNkLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLDZEQUFZLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO2dCQUNqRSxFQUFFLEtBQUssRUFBRSw2REFBWSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtnQkFDekQsRUFBRSxLQUFLLEVBQUUsNkRBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7Z0JBQ3JELEVBQUUsS0FBSyxFQUFFLDZEQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO2FBQ2xFO1NBQ0YsRUFBRTtZQUNELE9BQU8sRUFBRSxrQkFBa0I7WUFDM0IsT0FBTyxFQUFFLG9DQUFvQztZQUM3QyxPQUFPLEVBQUUsb0JBQW9CO1lBQzdCLEtBQUssRUFBRSxxQkFBcUI7U0FDN0IsQ0FBQztJQUNKLFVBQVUsRUFBRTtRQUNWLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFO1FBQzVCLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFO1FBQ3BDLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFO0tBQ3ZDO0NBQ0YsQ0FBQztBQTRVUjs7R0FFRztBQUNJLE1BQU0sU0FBUztJQUNwQixNQUFNLENBQUMsZ0JBQWdCO1FBQ3JCLDBDQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsT0FBTyx1RUFBa0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy91aS9kaWFsb2dzL3RleHRCbG9jay50cz9hMjZmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFtTbW9vc2ljXShodHRwczovL2dpdGh1Yi5jb20vQWFyb25EYXZpZE5ld21hbi9TbW9vc2ljKVxyXG4vLyBDb3B5cmlnaHQgKGMpIEFhcm9uIERhdmlkIE5ld21hbiAyMDIxLlxyXG5pbXBvcnQgeyBFbGVtZW50TGlrZSwgUmVtb3ZlRWxlbWVudExpa2UgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTbW9TY29yZVRleHQsIFNtb1RleHRHcm91cCB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3Njb3JlVGV4dCc7XHJcblxyXG5pbXBvcnQgeyBjbG9zZURpYWxvZ1Byb21pc2UgfSBmcm9tICcuLi8uLi9jb21tb24vaHRtbEhlbHBlcnMnO1xyXG5cclxuaW1wb3J0IHsgbGF5b3V0RGVidWcgfSBmcm9tICcuLi8uLi9yZW5kZXIvc3VpL2xheW91dERlYnVnJztcclxuaW1wb3J0IHsgU3ZnSGVscGVycywgT3V0bGluZUluZm8gfSBmcm9tICcuLi8uLi9yZW5kZXIvc3VpL3N2Z0hlbHBlcnMnO1xyXG5pbXBvcnQgeyBTdWlUZXh0RWRpdG9yIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS90ZXh0RWRpdCc7XHJcblxyXG5pbXBvcnQgeyBEaWFsb2dEZWZpbml0aW9uLCBTdWlEaWFsb2dCYXNlLCBTdWlEaWFsb2dQYXJhbXMgfSBmcm9tICcuL2RpYWxvZyc7XHJcbmltcG9ydCB7IFN1aURyYWdUZXh0IH0gZnJvbSAnLi9jb21wb25lbnRzL2RyYWdUZXh0JztcclxuaW1wb3J0IHsgU3VpVGV4dEluUGxhY2UgfSBmcm9tICcuL2NvbXBvbmVudHMvdGV4dEluUGxhY2UnO1xyXG5pbXBvcnQgeyBTdWlEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9kcm9wZG93bic7XHJcbmltcG9ydCB7IFN1aVRvZ2dsZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90b2dnbGUnO1xyXG5pbXBvcnQgeyBTdWlSb2NrZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvcm9ja2VyJztcclxuaW1wb3J0IHsgU3VpSGVscCB9IGZyb20gJy4uL2hlbHAnO1xyXG5pbXBvcnQgeyBTdWlGb250Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2ZvbnRDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTdWlUZXh0QmxvY2tDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGV4dEluUGxhY2UnO1xyXG5cclxuaW1wb3J0IHsgRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vZXZlbnRTb3VyY2UnO1xyXG5pbXBvcnQgeyBTdWlJbmxpbmVUZXh0IH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS90ZXh0UmVuZGVyJztcclxuaW1wb3J0IHsgVW5kb0J1ZmZlciB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS91bmRvJztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuLyoqXHJcbiAqIENvbXBsZXggZGlhbG9nIGZvciBtYW5hZ2luZyBzY29yZSB0ZXh0IChub3QgYXNzb2NpYXRlZCB3aXRoIG11c2ljKVxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpVGV4dEJsb2NrRGlhbG9nIGV4dGVuZHMgU3VpRGlhbG9nQmFzZSB7XHJcbiAgZ2V0IHRleHRFZGl0b3JDdHJsKCk6IFN1aVRleHRJblBsYWNlIHtcclxuICAgIHJldHVybiB0aGlzLmNtYXAudGV4dEVkaXRvckN0cmwgYXMgU3VpVGV4dEluUGxhY2U7XHJcbiAgfVxyXG4gIGdldCBpbnNlcnRDb2RlQ3RybCgpOiBTdWlEcm9wZG93bkNvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLmluc2VydENvZGVDdHJsIGFzIFN1aURyb3Bkb3duQ29tcG9uZW50O1xyXG4gIH1cclxuICBnZXQgdGV4dERyYWdnZXJDdHJsKCk6IFN1aURyYWdUZXh0IHtcclxuICAgIHJldHVybiB0aGlzLmNtYXAudGV4dERyYWdnZXJDdHJsIGFzIFN1aURyYWdUZXh0O1xyXG4gIH1cclxuICBnZXQgeUN0cmwoKTogU3VpUm9ja2VyQ29tcG9uZW50IHtcclxuICAgIHJldHVybiB0aGlzLmNtYXAueUN0cmwgYXMgU3VpUm9ja2VyQ29tcG9uZW50O1xyXG4gIH1cclxuICBnZXQgeEN0cmwoKTogU3VpUm9ja2VyQ29tcG9uZW50IHtcclxuICAgIHJldHVybiB0aGlzLmNtYXAueEN0cmwgYXMgU3VpUm9ja2VyQ29tcG9uZW50O1xyXG4gIH1cclxuICBnZXQgZm9udEN0cmwoKTogU3VpRm9udENvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLmZvbnRDdHJsIGFzIFN1aUZvbnRDb21wb25lbnQ7XHJcbiAgfVxyXG4gIGdldCB0ZXh0QmxvY2tDdHJsKCk6IFN1aVRleHRCbG9ja0NvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLnRleHRCbG9ja0N0cmwgYXMgU3VpVGV4dEJsb2NrQ29tcG9uZW50O1xyXG4gIH1cclxuICBnZXQgcGFnaW5hdGlvbkN0cmwoKTogU3VpRHJvcGRvd25Db21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC5wYWdpbmF0aW9uQ3RybCBhcyBTdWlEcm9wZG93bkNvbXBvbmVudDtcclxuICB9XHJcbiAgZ2V0IGF0dGFjaFRvU2VsZWN0b3JDdHJsKCk6IFN1aVRvZ2dsZUNvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLmF0dGFjaFRvU2VsZWN0b3JDdHJsIGFzIFN1aVRvZ2dsZUNvbXBvbmVudDtcclxuICB9XHJcbiAgc3RhdGljIGRpYWxvZ0VsZW1lbnRzOiBEaWFsb2dEZWZpbml0aW9uID1cclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnVGV4dCBQcm9wZXJ0aWVzJywgZWxlbWVudHM6XHJcbiAgICAgICAgICBbe1xyXG4gICAgICAgICAgICBzbW9OYW1lOiAndGV4dEVkaXRvcicsXHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMCxcclxuICAgICAgICAgICAgY29udHJvbDogJ1N1aVRleHRJblBsYWNlJyxcclxuICAgICAgICAgICAgY2xhc3NlczogJ3Nob3ctYWx3YXlzIGhpZGUtd2hlbi1tb3ZpbmcnLFxyXG4gICAgICAgICAgICBsYWJlbDogJ0VkaXQgVGV4dCcsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IFtdXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICdpbnNlcnRDb2RlJyxcclxuICAgICAgICAgICAgY2xhc3NlczogJ3Nob3ctd2hlbi1lZGl0aW5nIGhpZGUtd2hlbi1tb3ZpbmcnLFxyXG4gICAgICAgICAgICBjb250cm9sOiAnU3VpRHJvcGRvd25Db21wb25lbnQnLFxyXG4gICAgICAgICAgICBsYWJlbDogJ0luc2VydCBTcGVjaWFsJyxcclxuICAgICAgICAgICAgb3B0aW9uczogW1xyXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICdAQEAnLCBsYWJlbDogJ1BhZ2VzJyB9LFxyXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICcjIyMnLCBsYWJlbDogJ1BhZ2UgTnVtYmVyJyB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgc21vTmFtZTogJ3RleHREcmFnZ2VyJyxcclxuICAgICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nIHNob3ctd2hlbi1tb3ZpbmcnLFxyXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDAsXHJcbiAgICAgICAgICAgIGNvbnRyb2w6ICdTdWlEcmFnVGV4dCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnTW92ZSBUZXh0JyxcclxuICAgICAgICAgICAgb3B0aW9uczogW11cclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgc21vTmFtZTogJ3gnLFxyXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDAsXHJcbiAgICAgICAgICAgIGNsYXNzZXM6ICdoaWRlLXdoZW4tZWRpdGluZyBoaWRlLXdoZW4tbW92aW5nJyxcclxuICAgICAgICAgICAgY29udHJvbDogJ1N1aVJvY2tlckNvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnWCBQb3NpdGlvbiAoUHgpJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdpbnQnXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICd5JyxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxyXG4gICAgICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgICAgIGNvbnRyb2w6ICdTdWlSb2NrZXJDb21wb25lbnQnLFxyXG4gICAgICAgICAgICBsYWJlbDogJ1kgUG9zaXRpb24gKFB4KScsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnaW50J1xyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBzbW9OYW1lOiAnZm9udCcsXHJcbiAgICAgICAgICAgIGNsYXNzZXM6ICdoaWRlLXdoZW4tZWRpdGluZyBoaWRlLXdoZW4tbW92aW5nJyxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBTbW9TY29yZVRleHQuZm9udEZhbWlsaWVzLnRpbWVzLFxyXG4gICAgICAgICAgICBjb250cm9sOiAnU3VpRm9udENvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnRm9udCBJbmZvcm1hdGlvbidcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICd0ZXh0QmxvY2snLFxyXG4gICAgICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsXHJcbiAgICAgICAgICAgIGNvbnRyb2w6ICdTdWlUZXh0QmxvY2tDb21wb25lbnQnLFxyXG4gICAgICAgICAgICBsYWJlbDogJ1RleHQgQmxvY2sgUHJvcGVydGllcydcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7IC8vIHtldmVyeTonZXZlcnknLGV2ZW46J2V2ZW4nLG9kZDonb2RkJyxvbmNlOidvbmNlJ31cclxuICAgICAgICAgICAgc21vTmFtZTogJ3BhZ2luYXRpb24nLFxyXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFNtb1RleHRHcm91cC5wYWdpbmF0aW9ucy5PTkNFLFxyXG4gICAgICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgICAgIGNvbnRyb2w6ICdTdWlEcm9wZG93bkNvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnUGFnZSBCZWhhdmlvcicsXHJcbiAgICAgICAgICAgIHN0YXJ0Um93OiB0cnVlLFxyXG4gICAgICAgICAgICBvcHRpb25zOiBbeyB2YWx1ZTogU21vVGV4dEdyb3VwLnBhZ2luYXRpb25zLk9OQ0UsIGxhYmVsOiAnT25jZScgfSxcclxuICAgICAgICAgICAgeyB2YWx1ZTogU21vVGV4dEdyb3VwLnBhZ2luYXRpb25zLkVWRVJZLCBsYWJlbDogJ0V2ZXJ5JyB9LFxyXG4gICAgICAgICAgICB7IHZhbHVlOiBTbW9UZXh0R3JvdXAucGFnaW5hdGlvbnMuT0RELCBsYWJlbDogJ09kZCcgfSxcclxuICAgICAgICAgICAgeyB2YWx1ZTogU21vVGV4dEdyb3VwLnBhZ2luYXRpb25zLlNVQlNFUVVFTlQsIGxhYmVsOiAnU3Vic2VxdWVudCcgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICdhdHRhY2hUb1NlbGVjdG9yJyxcclxuICAgICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nIGhpZGUtd2hlbi1tb3ZpbmcnLFxyXG4gICAgICAgICAgICBjb250cm9sOiAnU3VpVG9nZ2xlQ29tcG9uZW50JyxcclxuICAgICAgICAgICAgbGFiZWw6ICdBdHRhY2ggdG8gU2VsZWN0aW9uJ1xyXG4gICAgICAgICAgfV0sXHJcbiAgICAgICAgc3RhdGljVGV4dDogW1xyXG4gICAgICAgICAgeyBsYWJlbDogJ1RleHQgUHJvcGVydGllcycgfSxcclxuICAgICAgICAgIHsgZWRpdG9yTGFiZWw6ICdEb25lIEVkaXRpbmcgVGV4dCcgfSxcclxuICAgICAgICAgIHsgZHJhZ2dlckxhYmVsOiAnRG9uZSBEcmFnZ2luZyBUZXh0JyB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9O1xyXG4gIGVkaXRlZDogYm9vbGVhbjtcclxuICBpc05ldzogYm9vbGVhbjtcclxuICBtb2RpZmllcjogU21vVGV4dEdyb3VwO1xyXG4gIG9yaWdpbmFsVGV4dEdyb3VwOiBTbW9UZXh0R3JvdXAgfCBudWxsID0gbnVsbDtcclxuICBhY3RpdmVTY29yZVRleHQ6IFNtb1Njb3JlVGV4dDtcclxuICB0ZXh0RWxlbWVudDogYW55O1xyXG4gIG1vdXNlTW92ZUhhbmRsZXI6IEV2ZW50SGFuZGxlciB8IG51bGw7XHJcbiAgbW91c2VVcEhhbmRsZXI6IEV2ZW50SGFuZGxlciB8IG51bGw7XHJcbiAgbW91c2VEb3duSGFuZGxlcjogRXZlbnRIYW5kbGVyIHwgbnVsbDtcclxuICBtb3VzZUNsaWNrSGFuZGxlcjogRXZlbnRIYW5kbGVyIHwgbnVsbDtcclxuICBvdXRsaW5lUmVjdDogT3V0bGluZUluZm8gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocGFyYW1ldGVyczogU3VpRGlhbG9nUGFyYW1zKSB7XHJcbiAgICBsZXQgZWRpdGVkID0gZmFsc2U7XHJcbiAgICBsZXQgaXNOZXcgPSBmYWxzZTtcclxuICAgIGNvbnN0IG9yaWdpbmFsVGV4dEdyb3VwOiBTbW9UZXh0R3JvdXAgfCBudWxsID0gcGFyYW1ldGVycy5tb2RpZmllciA/PyBudWxsO1xyXG4gICAgY29uc3QgdHJhY2tlciA9IHBhcmFtZXRlcnMudmlldy50cmFja2VyO1xyXG4gICAgWydzdGFmZk1vZGlmaWVyJywgJ3N1Z2dlc3Rpb24nXS5mb3JFYWNoKChvdXRsaW5lVHlwZSkgPT4ge1xyXG4gICAgICBpZiAodHJhY2tlci5vdXRsaW5lc1tvdXRsaW5lVHlwZV0pIHtcclxuICAgICAgICBTdmdIZWxwZXJzLmVyYXNlT3V0bGluZSh0cmFja2VyLm91dGxpbmVzW291dGxpbmVUeXBlXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHRleHQgbW9kaWZpZXIsIGlmIHRoaXMgaXMgbmV3IHRleHQuICAgRWxzZSB1c2Ugc2VsZWN0aW9uXHJcbiAgICBpZiAoIXBhcmFtZXRlcnMubW9kaWZpZXIpIHtcclxuICAgICAgaXNOZXcgPSB0cnVlO1xyXG4gICAgICBjb25zdCB0ZXh0UGFyYW1zID0gU21vU2NvcmVUZXh0LmRlZmF1bHRzO1xyXG4gICAgICBjb25zdCBuZXdUZXh0ID0gbmV3IFNtb1Njb3JlVGV4dCh0ZXh0UGFyYW1zKTtcclxuICAgICAgLy8gY29udmVydCBzY3JvbGwgZnJvbSBzY3JlZW4gY29vcmQgdG8gc3ZnIGNvb3JkXHJcbiAgICAgIGNvbnN0IHN2Z1Njcm9sbCA9IHRyYWNrZXIucmVuZGVyZXIucGFnZU1hcC5jbGllbnRUb1N2ZyhTdmdIZWxwZXJzLnNtb0JveCh0cmFja2VyLnNjcm9sbGVyLnNjcm9sbFN0YXRlKSk7XHJcbiAgICAgIG5ld1RleHQueSArPSBzdmdTY3JvbGwueTtcclxuICAgICAgbmV3VGV4dC54ICs9IHN2Z1Njcm9sbC54O1xyXG4gICAgICBpZiAodHJhY2tlci5zZWxlY3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBzZWwgPSB0cmFja2VyLnNlbGVjdGlvbnNbMF0ubWVhc3VyZS5zdmc7XHJcbiAgICAgICAgaWYgKHR5cGVvZiAoc2VsLmxvZ2ljYWxCb3gpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgaWYgKHNlbC5sb2dpY2FsQm94LnkgPj0gbmV3VGV4dC55KSB7XHJcbiAgICAgICAgICAgIG5ld1RleHQueSA9IHNlbC5sb2dpY2FsQm94Lnk7XHJcbiAgICAgICAgICAgIG5ld1RleHQueCA9IHNlbC5sb2dpY2FsQm94Lng7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGdycFBhcmFtcyA9IFNtb1RleHRHcm91cC5kZWZhdWx0cztcclxuICAgICAgZ3JwUGFyYW1zLnRleHRCbG9ja3MgPSBbeyB0ZXh0OiBuZXdUZXh0LCBwb3NpdGlvbjogU21vVGV4dEdyb3VwLnJlbGF0aXZlUG9zaXRpb25zLkxFRlQsIGFjdGl2ZVRleHQ6IHRydWUgfV07XHJcbiAgICAgIGNvbnN0IG5ld0dyb3VwID0gbmV3IFNtb1RleHRHcm91cChncnBQYXJhbXMpO1xyXG4gICAgICBwYXJhbWV0ZXJzLm1vZGlmaWVyID0gbmV3R3JvdXA7XHJcbiAgICAgIHBhcmFtZXRlcnMubW9kaWZpZXIuc2V0QWN0aXZlQmxvY2sobmV3VGV4dCk7XHJcbiAgICAgIHBhcmFtZXRlcnMudmlldy5ncm91cFVuZG8odHJ1ZSk7XHJcbiAgICAgIHBhcmFtZXRlcnMudmlldy5hZGRUZXh0R3JvdXAocGFyYW1ldGVycy5tb2RpZmllcik7XHJcbiAgICAgIGVkaXRlZCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgYSBzY29yZSB0ZXh0IHRvIHN0YXJ0IHRoZSBlZGl0aW5nLlxyXG4gICAgICBwYXJhbWV0ZXJzLm1vZGlmaWVyID0gU21vVGV4dEdyb3VwLmRlc2VyaWFsaXplUHJlc2VydmVJZChwYXJhbWV0ZXJzLm1vZGlmaWVyKTtcclxuICAgICAgcGFyYW1ldGVycy5tb2RpZmllci5zZXRBY3RpdmVCbG9jayhwYXJhbWV0ZXJzLm1vZGlmaWVyLnRleHRCbG9ja3NbMF0udGV4dCk7XHJcbiAgICB9XHJcbiAgICBzdXBlcihTdWlUZXh0QmxvY2tEaWFsb2cuZGlhbG9nRWxlbWVudHMsIHBhcmFtZXRlcnMpO1xyXG4gICAgdGhpcy5vcmlnaW5hbFRleHRHcm91cCA9IG9yaWdpbmFsVGV4dEdyb3VwO1xyXG4gICAgdGhpcy5pc05ldyA9IGlzTmV3O1xyXG4gICAgdGhpcy5tb2RpZmllciA9IHBhcmFtZXRlcnMubW9kaWZpZXI7XHJcbiAgICB0aGlzLmRpc3BsYXlPcHRpb25zID0gWydCSU5EQ09NUE9ORU5UUycsICdEUkFHR0FCTEUnLCAnS0VZQk9BUkRfQ0FQVFVSRScsICdNT0RJRklFUlBPUyddXHJcbiAgICB0aGlzLmVkaXRlZCA9IGVkaXRlZDtcclxuICAgIHRoaXMudmlldy5ncm91cFVuZG8odHJ1ZSk7XHJcbiAgICB0aGlzLmFjdGl2ZVNjb3JlVGV4dCA9IHRoaXMubW9kaWZpZXIuZ2V0QWN0aXZlQmxvY2soKTtcclxuICAgIHRoaXMubW91c2VNb3ZlSGFuZGxlciA9IG51bGw7XHJcbiAgICB0aGlzLm1vdXNlVXBIYW5kbGVyID0gbnVsbDtcclxuICAgIHRoaXMubW91c2VEb3duSGFuZGxlciA9IG51bGw7XHJcbiAgICB0aGlzLm1vdXNlQ2xpY2tIYW5kbGVyID0gbnVsbDtcclxuICB9XHJcbiAgcG9wdWxhdGVJbml0aWFsKCkge1xyXG4gICAgdGhpcy50ZXh0QmxvY2tDdHJsLnNldFZhbHVlKHtcclxuICAgICAgYWN0aXZlU2NvcmVUZXh0OiB0aGlzLmFjdGl2ZVNjb3JlVGV4dCxcclxuICAgICAgbW9kaWZpZXI6IHRoaXMubW9kaWZpZXJcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZm9udEZhbWlseSA9IHRoaXMuYWN0aXZlU2NvcmVUZXh0LmZvbnRJbmZvLmZhbWlseTtcclxuICAgIGNvbnN0IGZvbnRTaXplID0gdGhpcy5hY3RpdmVTY29yZVRleHQuZm9udEluZm8uc2l6ZTtcclxuICAgIHRoaXMuZm9udEN0cmwuc2V0VmFsdWUoe1xyXG4gICAgICBmYW1pbHk6IGZvbnRGYW1pbHksXHJcbiAgICAgIHNpemU6IGZvbnRTaXplLFxyXG4gICAgICBzdHlsZTogdGhpcy5hY3RpdmVTY29yZVRleHQuZm9udEluZm8uc3R5bGUsXHJcbiAgICAgIHdlaWdodDogdGhpcy5hY3RpdmVTY29yZVRleHQuZm9udEluZm8ud2VpZ2h0XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYXR0YWNoVG9TZWxlY3RvckN0cmwuc2V0VmFsdWUodGhpcy5tb2RpZmllci5hdHRhY2hUb1NlbGVjdG9yKTtcclxuICAgIGNvbnN0IHVsID0gdGhpcy5tb2RpZmllci51bCgpO1xyXG4gICAgdGhpcy54Q3RybC5zZXRWYWx1ZSh1bC54KTtcclxuICAgIHRoaXMueUN0cmwuc2V0VmFsdWUodWwueSk7XHJcbiAgICB0aGlzLnBhZ2luYXRpb25DdHJsLnNldFZhbHVlKHRoaXMubW9kaWZpZXIucGFnaW5hdGlvbik7XHJcbiAgICB0aGlzLmhpZ2hsaWdodEFjdGl2ZVJlZ2lvbigpO1xyXG4gIH1cclxuICBzdGF0aWMgdW5yZW5kZXJUZXh0R3JvdXAodGc6IFNtb1RleHRHcm91cCkge1xyXG4gICAgdGcuZWxlbWVudHMuZm9yRWFjaCgoZWw6IEVsZW1lbnRMaWtlKSAgPT4ge1xyXG4gICAgICBSZW1vdmVFbGVtZW50TGlrZShlbCk7XHJcbiAgICB9KTtcclxuICAgIHRnLmVsZW1lbnRzID0gW107XHJcblxyXG4gIH1cclxuICB1bnJlbmRlck9yaWdpbmFsKCkge1xyXG4gICAgaWYgKHRoaXMub3JpZ2luYWxUZXh0R3JvdXApIHtcclxuICAgICAgU3VpVGV4dEJsb2NrRGlhbG9nLnVucmVuZGVyVGV4dEdyb3VwKHRoaXMub3JpZ2luYWxUZXh0R3JvdXApO1xyXG4gICAgfVxyXG4gIH1cclxuICBkaXNwbGF5KCkge1xyXG4gICAgY29uc3QgcGFnZUNvbnRleHQgPSB0aGlzLnZpZXcucmVuZGVyZXIucGFnZU1hcC5nZXRSZW5kZXJlckZyb21Nb2RpZmllcih0aGlzLmFjdGl2ZVNjb3JlVGV4dCk7XHJcbiAgICBjb25zdCBzdmcgPSBwYWdlQ29udGV4dC5zdmc7XHJcbiAgICB0aGlzLnRleHRFbGVtZW50ID0gJChzdmcpLmZpbmQoJy4nICsgdGhpcy5hY3RpdmVTY29yZVRleHQuYXR0cnMuaWQpWzBdO1xyXG4gICAgJCgnYm9keScpLmFkZENsYXNzKCdzaG93QXR0cmlidXRlRGlhbG9nJyk7XHJcbiAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ3RleHRFZGl0b3InKTtcclxuICAgIHRoaXMuYXBwbHlEaXNwbGF5T3B0aW9ucygpO1xyXG4gICAgdGhpcy5wb3B1bGF0ZUluaXRpYWwoKTtcclxuICAgIHRoaXMuYmluZEVsZW1lbnRzKCk7XHJcbiAgICBpZiAoIXRoaXMubW9kaWZpZXIubG9naWNhbEJveCkge1xyXG4gICAgICB0aGlzLnZpZXcucmVuZGVyZXIucmVuZGVyVGV4dEdyb3VwKHRoaXMubW9kaWZpZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoaXMgY29udHJvbCBoYXMgbm90IGJlZW4gZWRpdGVkIHRoaXMgc2Vzc2lvbiwgYXNzdW1lIHRoZXkgd2FudCB0b1xyXG4gICAgLy8gZWRpdCB0aGUgdGV4dCBhbmQganVzdCByaWdodCBpbnRvIHRoYXQuXHJcbiAgICBpZiAoIXRoaXMubW9kaWZpZXIuZWRpdGVkKSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXIuZWRpdGVkID0gdHJ1ZTtcclxuICAgICAgbGF5b3V0RGVidWcuYWRkRGlhbG9nRGVidWcoJ3RleHQgdHJhbnNmb3JtIGRiOiBzdGFydEVkaXRTZXNzaW9uJyk7XHJcbiAgICAgIHRoaXMudW5yZW5kZXJPcmlnaW5hbCgpO1xyXG4gICAgICB0aGlzLnRleHRFZGl0b3JDdHJsLnN0YXJ0RWRpdFNlc3Npb24oKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1vdXNlbW92ZSA9IGFzeW5jIChldjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMubW91c2VNb3ZlKGV2KTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1vdXNldXAgPSBhc3luYyAoZXY6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLm1vdXNlVXAoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1vdXNlZG93biA9IGFzeW5jIChldjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMubW91c2VEb3duKGV2KTtcclxuICAgIH1cclxuICAgIGNvbnN0IG1vdXNlY2xpY2sgPSBhc3luYyAoZXY6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLm1vdXNlQ2xpY2soZXYpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb3VzZU1vdmVIYW5kbGVyID0gdGhpcy5ldmVudFNvdXJjZS5iaW5kTW91c2VNb3ZlSGFuZGxlcihtb3VzZW1vdmUpO1xyXG4gICAgdGhpcy5tb3VzZVVwSGFuZGxlciA9IHRoaXMuZXZlbnRTb3VyY2UuYmluZE1vdXNlVXBIYW5kbGVyKG1vdXNldXApO1xyXG4gICAgdGhpcy5tb3VzZURvd25IYW5kbGVyID0gdGhpcy5ldmVudFNvdXJjZS5iaW5kTW91c2VEb3duSGFuZGxlcihtb3VzZWRvd24pO1xyXG4gICAgdGhpcy5tb3VzZUNsaWNrSGFuZGxlciA9IHRoaXMuZXZlbnRTb3VyY2UuYmluZE1vdXNlQ2xpY2tIYW5kbGVyKG1vdXNlY2xpY2spO1xyXG4gIH1cclxuICBfcmVzZXRBdHRhY2hUb1NlbGVjdG9yKCkge1xyXG4gICAgdGhpcy5tb2RpZmllci5hdHRhY2hUb1NlbGVjdG9yID0gZmFsc2U7XHJcbiAgICB0aGlzLm1vZGlmaWVyLnNlbGVjdG9yID0gU21vVGV4dEdyb3VwLmRlZmF1bHRzLnNlbGVjdG9yO1xyXG4gICAgdGhpcy5tb2RpZmllci5tdXNpY1hPZmZzZXQgPSBTbW9UZXh0R3JvdXAuZGVmYXVsdHMubXVzaWNYT2Zmc2V0O1xyXG4gICAgdGhpcy5tb2RpZmllci5tdXNpY1lPZmZzZXQgPSBTbW9UZXh0R3JvdXAuZGVmYXVsdHMubXVzaWNZT2Zmc2V0O1xyXG4gIH1cclxuICBfYWN0aXZhdGVBdHRhY2hUb1NlbGVjdG9yKCkge1xyXG4gICAgdGhpcy5tb2RpZmllci5hdHRhY2hUb1NlbGVjdG9yID0gdHJ1ZTtcclxuICAgIHRoaXMubW9kaWZpZXIuc2VsZWN0b3IgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMudmlldy50cmFja2VyLnNlbGVjdGlvbnNbMF0uc2VsZWN0b3IpKTtcclxuICAgIGlmICh0aGlzLm1vZGlmaWVyLmxvZ2ljYWxCb3gpIHtcclxuICAgICAgdGhpcy5tb2RpZmllci5tdXNpY1hPZmZzZXQgPSB0aGlzLm1vZGlmaWVyLmxvZ2ljYWxCb3gueCAtIHRoaXMudmlldy50cmFja2VyLnNlbGVjdGlvbnNbMF0ubWVhc3VyZS5zdmcubG9naWNhbEJveC54O1xyXG4gICAgICB0aGlzLm1vZGlmaWVyLm11c2ljWU9mZnNldCA9IHRoaXMubW9kaWZpZXIubG9naWNhbEJveC55IC0gdGhpcy52aWV3LnRyYWNrZXIuc2VsZWN0aW9uc1swXS5tZWFzdXJlLnN2Zy5sb2dpY2FsQm94Lnk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5lZGl0ZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaW5zZXJ0Q29kZUN0cmwuY2hhbmdlRmxhZyAmJiB0aGlzLnRleHRFZGl0b3JDdHJsLnNlc3Npb24pIHtcclxuICAgICAgY29uc3QgdmFsID0gdGhpcy5pbnNlcnRDb2RlQ3RybC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkuc3BsaXQoJycpO1xyXG4gICAgICB2YWwuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgdGhpcy5ldktleSh7IGtleSB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuaW5zZXJ0Q29kZUN0cmwudW5zZWxlY3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy50ZXh0QmxvY2tDdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgY29uc3QgbnZhbCA9IHRoaXMudGV4dEJsb2NrQ3RybC5nZXRWYWx1ZSgpO1xyXG4gICAgICB0aGlzLmFjdGl2ZVNjb3JlVGV4dCA9IG52YWwuYWN0aXZlU2NvcmVUZXh0O1xyXG4gICAgICB0aGlzLmhpZ2hsaWdodEFjdGl2ZVJlZ2lvbigpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudGV4dEVkaXRvckN0cmwuY2hhbmdlRmxhZykge1xyXG4gICAgICB0aGlzLmhpZ2hsaWdodEFjdGl2ZVJlZ2lvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmF0dGFjaFRvU2VsZWN0b3JDdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgY29uc3QgdG9TZXQgPSB0aGlzLmF0dGFjaFRvU2VsZWN0b3JDdHJsLmdldFZhbHVlKCk7XHJcbiAgICAgIGlmICh0b1NldCkge1xyXG4gICAgICAgIHRoaXMuX2FjdGl2YXRlQXR0YWNoVG9TZWxlY3RvcigpO1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvbkN0cmwuc2V0VmFsdWUoU21vVGV4dEdyb3VwLnBhZ2luYXRpb25zLk9OQ0UpO1xyXG4gICAgICAgIHRoaXMubW9kaWZpZXIucGFnaW5hdGlvbiA9IFNtb1RleHRHcm91cC5wYWdpbmF0aW9ucy5PTkNFO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3Jlc2V0QXR0YWNoVG9TZWxlY3RvcigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcG9zID0gdGhpcy5tb2RpZmllci51bCgpO1xyXG5cclxuICAgIC8vIHBvc2l0aW9uIGNhbiBjaGFuZ2UgZnJvbSBkcmFnIG9yIGJ5IGRpYWxvZyAtIG9ubHkgdXBkYXRlIGZyb21cclxuICAgIC8vIGRpYWxvZyBlbnRyaWVzIGlmIHRoYXQgY2hhbmdlZC5cclxuICAgIGlmICh0aGlzLnhDdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgdGhpcy5tb2RpZmllci5vZmZzZXRYKHRoaXMueEN0cmwuZ2V0VmFsdWUoKSAtIHBvcy54KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnlDdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgdGhpcy5tb2RpZmllci5vZmZzZXRZKHRoaXMueUN0cmwuZ2V0VmFsdWUoKSAtIHBvcy55KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRleHREcmFnZ2VyQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIHRoaXMueEN0cmwuc2V0VmFsdWUocG9zLngpO1xyXG4gICAgICB0aGlzLnlDdHJsLnNldFZhbHVlKHBvcy55KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wYWdpbmF0aW9uQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXIucGFnaW5hdGlvbiA9IHBhcnNlSW50KHRoaXMucGFnaW5hdGlvbkN0cmwuZ2V0VmFsdWUoKS50b1N0cmluZygpLCAxMCk7XHJcbiAgICAgIC8vIFBhZ2luYXRpb24gYW5kIGF0dGFjaCB0byBtZWFzdXJlIGRvbid0IG1peC5cclxuICAgICAgdGhpcy5fcmVzZXRBdHRhY2hUb1NlbGVjdG9yKCk7XHJcbiAgICAgIHRoaXMuYXR0YWNoVG9TZWxlY3RvckN0cmwuc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZvbnRDdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgY29uc3QgZm9udEluZm8gPSB0aGlzLmZvbnRDdHJsLmdldFZhbHVlKCk7XHJcbiAgICAgIHRoaXMuYWN0aXZlU2NvcmVUZXh0LmZvbnRJbmZvLmZhbWlseSA9IGZvbnRJbmZvLmZhbWlseTtcclxuICAgICAgLy8gdHJhbnNpdGlvbmluZyBhd2F5IGZyb20gbm9uLXBvaW50LWJhc2VkIGZvbnQgc2l6ZSB1bml0c1xyXG4gICAgICB0aGlzLmFjdGl2ZVNjb3JlVGV4dC5mb250SW5mby5zaXplID0gZm9udEluZm8uc2l6ZTtcclxuICAgICAgdGhpcy5hY3RpdmVTY29yZVRleHQuZm9udEluZm8ud2VpZ2h0ID0gZm9udEluZm8ud2VpZ2h0O1xyXG4gICAgICB0aGlzLmFjdGl2ZVNjb3JlVGV4dC5mb250SW5mby5zdHlsZSA9IGZvbnRJbmZvLnN0eWxlO1xyXG4gICAgfVxyXG4gICAgLy8gVXNlIGxheW91dCBjb250ZXh0IGJlY2F1c2UgcmVuZGVyIG1heSBoYXZlIHJlc2V0IHN2Zy5cclxuICAgIGNvbnN0IHN1YnR5cGUgPSB0aGlzLmlzTmV3ID8gVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQgOiBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLlVQREFURTtcclxuICAgIHRoaXMudmlldy51cGRhdGVUZXh0R3JvdXAodGhpcy5tb2RpZmllcik7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodEFjdGl2ZVJlZ2lvbigpIHtcclxuICAgIGNvbnN0IHBhZ2VDb250ZXh0ID0gdGhpcy52aWV3LnJlbmRlcmVyLnBhZ2VNYXAuZ2V0UmVuZGVyZXJGcm9tTW9kaWZpZXIodGhpcy5hY3RpdmVTY29yZVRleHQpO1xyXG4gICAgY29uc3Qgc3ZnID0gcGFnZUNvbnRleHQuc3ZnO1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlU2NvcmVUZXh0LmxvZ2ljYWxCb3gpIHtcclxuICAgICAgY29uc3Qgc3Ryb2tlID0gU3VpVGV4dEVkaXRvci5zdHJva2VzWyd0ZXh0LWhpZ2hsaWdodCddO1xyXG4gICAgICBpZiAoIXRoaXMub3V0bGluZVJlY3QpIHtcclxuICAgICAgICB0aGlzLm91dGxpbmVSZWN0ID0ge1xyXG4gICAgICAgICAgY29udGV4dDogcGFnZUNvbnRleHQsXHJcbiAgICAgICAgICBjbGFzc2VzOiAnJyxcclxuICAgICAgICAgIHN0cm9rZSxcclxuICAgICAgICAgIGJveDogdGhpcy5hY3RpdmVTY29yZVRleHQubG9naWNhbEJveCxcclxuICAgICAgICAgIHNjcm9sbDogdGhpcy5zY3JvbGxlci5zY3JvbGxTdGF0ZSxcclxuICAgICAgICAgIHRpbWVPZmY6IDEwMDBcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIFN2Z0hlbHBlcnMuZXJhc2VPdXRsaW5lKHRoaXMub3V0bGluZVJlY3QpO1xyXG4gICAgICB0aGlzLm91dGxpbmVSZWN0LmJveCA9IHRoaXMuYWN0aXZlU2NvcmVUZXh0LmxvZ2ljYWxCb3g7XHJcbiAgICAgIFN2Z0hlbHBlcnMub3V0bGluZVJlY3QodGhpcy5vdXRsaW5lUmVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vICMjIyBoYW5kbGVLZXlkb3duXHJcbiAgLy8gYWxsb3cgYSBkaWFsb2cgdG8gYmUgZGlzbWlzc2VkIGJ5IGVzYy5cclxuICBldktleShldmRhdGE6IGFueSkge1xyXG4gICAgaWYgKGV2ZGF0YS5rZXkgPT09ICdFc2NhcGUnKSB7XHJcbiAgICAgICQodGhpcy5kZ0RvbS5lbGVtZW50KS5maW5kKCcuY2FuY2VsLWJ1dHRvbicpLmNsaWNrKCk7XHJcbiAgICAgIGV2ZGF0YS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50ZXh0RWRpdG9yQ3RybC5ldktleShldmRhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gIyMjIEV2ZW50IGhhbmRsZXJzLCBwYXNzZWQgZnJvbSBkaWFsb2dcclxuICBtb3VzZVVwKCkge1xyXG4gICAgaWYgKHRoaXMudGV4dERyYWdnZXJDdHJsICYmIHRoaXMudGV4dERyYWdnZXJDdHJsLnJ1bm5pbmcpIHtcclxuICAgICAgdGhpcy50ZXh0RHJhZ2dlckN0cmwubW91c2VVcChudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlTW92ZShldjogYW55KSB7XHJcbiAgICBpZiAodGhpcy50ZXh0RHJhZ2dlckN0cmwgJiYgdGhpcy50ZXh0RHJhZ2dlckN0cmwucnVubmluZykge1xyXG4gICAgICB0aGlzLnRleHREcmFnZ2VyQ3RybC5tb3VzZU1vdmUoZXYpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnRleHRFZGl0b3JDdHJsICYmIHRoaXMudGV4dEVkaXRvckN0cmwuaXNSdW5uaW5nKSB7XHJcbiAgICAgIHRoaXMudGV4dEVkaXRvckN0cmwubW91c2VNb3ZlKGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlQ2xpY2soZXY6IGFueSkge1xyXG4gICAgaWYgKHRoaXMudGV4dEVkaXRvckN0cmwgJiYgdGhpcy50ZXh0RWRpdG9yQ3RybC5pc1J1bm5pbmcpIHtcclxuICAgICAgdGhpcy50ZXh0RWRpdG9yQ3RybC5tb3VzZUNsaWNrKGV2KTtcclxuICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3VzZURvd24oZXY6IGFueSkge1xyXG4gICAgaWYgKHRoaXMudGV4dERyYWdnZXJDdHJsICYmIHRoaXMudGV4dERyYWdnZXJDdHJsLnJ1bm5pbmcpIHtcclxuICAgICAgdGhpcy50ZXh0RHJhZ2dlckN0cmwubW91c2VEb3duKGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9jb21wbGV0ZSgpIHtcclxuICAgIHRoaXMudmlldy5ncm91cFVuZG8oZmFsc2UpO1xyXG4gICAgdGhpcy5tb2RpZmllci5zZXRBY3RpdmVCbG9jayhudWxsKTtcclxuICAgIHRoaXMudmlldy50cmFja2VyLnVwZGF0ZU1hcCgpOyAvLyB1cGRhdGUgdGhlIHRleHQgbWFwXHJcbiAgICB0aGlzLnZpZXcucmVuZGVyZXIuc2V0RGlydHkoKTtcclxuICAgIGlmICh0aGlzLm1vdXNlRG93bkhhbmRsZXIpIHtcclxuICAgICAgdGhpcy5ldmVudFNvdXJjZS51bmJpbmRNb3VzZURvd25IYW5kbGVyKHRoaXMubW91c2VEb3duSGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tb3VzZVVwSGFuZGxlcikge1xyXG4gICAgICB0aGlzLmV2ZW50U291cmNlLnVuYmluZE1vdXNlVXBIYW5kbGVyKHRoaXMubW91c2VVcEhhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubW91c2VNb3ZlSGFuZGxlcikge1xyXG4gICAgICB0aGlzLmV2ZW50U291cmNlLnVuYmluZE1vdXNlTW92ZUhhbmRsZXIodGhpcy5tb3VzZU1vdmVIYW5kbGVyKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1vdXNlQ2xpY2tIYW5kbGVyKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRTb3VyY2UudW5iaW5kTW91c2VDbGlja0hhbmRsZXIodGhpcy5tb3VzZUNsaWNrSGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vdXRsaW5lUmVjdCkge1xyXG4gICAgICBTdmdIZWxwZXJzLmVyYXNlT3V0bGluZSh0aGlzLm91dGxpbmVSZWN0KTtcclxuICAgIH1cclxuICAgIC8vIEhhY2sgLSB0aGlzIGNvbWVzIGZyb20gU3VpSW5saW5lVGV4dCBhbmQgU3VpVGV4dEVkaXQuXHJcbiAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3Nob3dBdHRyaWJ1dGVEaWFsb2cnKTtcclxuICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygndGV4dEVkaXRvcicpO1xyXG4gICAgdGhpcy5jb21wbGV0ZSgpO1xyXG4gIH1cclxuICBfcmVtb3ZlVGV4dCgpIHtcclxuICAgIC8vIFRoZSBtb2RpZmllciByZW5kZXJlZCBpcyBmb3IgZWRpdCwgbm90IHRoZSBvbmUgYXR0YWNoZWQgdG8gdGhlIHNjb3JlLiBzb1xyXG4gICAgLy8gdW5yZW5kZXIgaXQgbm93XHJcbiAgICBTdWlUZXh0QmxvY2tEaWFsb2cudW5yZW5kZXJUZXh0R3JvdXAodGhpcy5tb2RpZmllcik7XHJcbiAgICB0aGlzLnZpZXcucmVtb3ZlVGV4dEdyb3VwKHRoaXMubW9kaWZpZXIpO1xyXG4gIH1cclxuXHJcbiAgYmluZEVsZW1lbnRzKCkge1xyXG4gICAgY29uc3QgZGdEb20gPSB0aGlzLmRnRG9tO1xyXG5cclxuICAgICQoZGdEb20uZWxlbWVudCkuZmluZCgnLm9rLWJ1dHRvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHN1YnR5cGUgPSB0aGlzLmlzTmV3ID8gVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5BREQgOiBVbmRvQnVmZmVyLmJ1ZmZlclN1YnR5cGVzLlVQREFURTtcclxuICAgICAgdGhpcy52aWV3LnVwZGF0ZVRleHRHcm91cCh0aGlzLm1vZGlmaWVyKTtcclxuICAgICAgdGhpcy5fY29tcGxldGUoKTtcclxuICAgIH0pO1xyXG5cclxuICAgICQoZGdEb20uZWxlbWVudCkuZmluZCgnLmNhbmNlbC1idXR0b24nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5lZGl0ZWQpIHtcclxuICAgICAgICB0aGlzLm1vZGlmaWVyLmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQ6IEVsZW1lbnRMaWtlKSA9PiB7XHJcbiAgICAgICAgICBSZW1vdmVFbGVtZW50TGlrZShlbGVtZW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm1vZGlmaWVyLmVsZW1lbnRzID0gW107XHJcbiAgICAgICAgdGhpcy52aWV3LnVuZG8oKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9jb21wbGV0ZSgpO1xyXG4gICAgfSk7XHJcbiAgICAkKGRnRG9tLmVsZW1lbnQpLmZpbmQoJy5yZW1vdmUtYnV0dG9uJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsICgpID0+IHsgICAgICBcclxuICAgICAgdGhpcy5fcmVtb3ZlVGV4dCgpO1xyXG4gICAgICB0aGlzLl9jb21wbGV0ZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgaGVscE1vZGFsIHtcclxuICBzdGF0aWMgY3JlYXRlQW5kRGlzcGxheSgpIHtcclxuICAgIFN1aUhlbHAuZGlzcGxheUhlbHAoKTtcclxuICAgIHJldHVybiBjbG9zZURpYWxvZ1Byb21pc2UoKTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/ui/dialogs/textBlock.ts\n\n}");
4169
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiTextBlockDialog: () => (/* binding */ SuiTextBlockDialog),\n/* harmony export */ helpModal: () => (/* binding */ helpModal)\n/* harmony export */ });\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/scoreText */ \"./src/smo/data/scoreText.ts\");\n/* harmony import */ var _common_htmlHelpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../common/htmlHelpers */ \"./src/common/htmlHelpers.ts\");\n/* harmony import */ var _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../render/sui/layoutDebug */ \"./src/render/sui/layoutDebug.ts\");\n/* harmony import */ var _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../render/sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _render_sui_textEdit__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../render/sui/textEdit */ \"./src/render/sui/textEdit.ts\");\n/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dialog */ \"./src/ui/dialogs/dialog.ts\");\n/* harmony import */ var _help__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../help */ \"./src/ui/help.ts\");\n/* harmony import */ var _smo_xform_undo__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../smo/xform/undo */ \"./src/smo/xform/undo.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 * Complex dialog for managing score text (not associated with music)\n * @category SuiDialog\n */\nclass SuiTextBlockDialog extends _dialog__WEBPACK_IMPORTED_MODULE_6__.SuiDialogBase {\n get textEditorCtrl() {\n return this.cmap.textEditorCtrl;\n }\n get insertCodeCtrl() {\n return this.cmap.insertCodeCtrl;\n }\n get textDraggerCtrl() {\n return this.cmap.textDraggerCtrl;\n }\n get yCtrl() {\n return this.cmap.yCtrl;\n }\n get xCtrl() {\n return this.cmap.xCtrl;\n }\n get fontCtrl() {\n return this.cmap.fontCtrl;\n }\n get textBlockCtrl() {\n return this.cmap.textBlockCtrl;\n }\n get paginationCtrl() {\n return this.cmap.paginationCtrl;\n }\n get attachToSelectorCtrl() {\n return this.cmap.attachToSelectorCtrl;\n }\n constructor(parameters) {\n var _a;\n let edited = false;\n let isNew = false;\n const originalTextGroup = (_a = parameters.modifier) !== null && _a !== void 0 ? _a : null;\n const tracker = parameters.view.tracker;\n ['staffModifier', 'suggestion'].forEach((outlineType) => {\n if (tracker.outlines[outlineType]) {\n _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_4__.SvgHelpers.eraseOutline(tracker.outlines[outlineType]);\n }\n });\n // Create a new text modifier, if this is new text. Else use selection\n if (!parameters.modifier) {\n isNew = true;\n const textParams = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoScoreText.defaults;\n const newText = new _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoScoreText(textParams);\n // convert scroll from screen coord to svg coord\n const svgScroll = tracker.renderer.pageMap.clientToSvg(_render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_4__.SvgHelpers.smoBox(tracker.scroller.scrollState));\n newText.y += svgScroll.y;\n newText.x += svgScroll.x;\n if (tracker.selections.length > 0) {\n const sel = tracker.selections[0].measure.svg;\n if (typeof (sel.logicalBox) !== 'undefined') {\n if (sel.logicalBox.y >= newText.y) {\n newText.y = sel.logicalBox.y;\n newText.x = sel.logicalBox.x;\n }\n }\n }\n const grpParams = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.defaults;\n grpParams.textBlocks = [{ text: newText, position: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.relativePositions.LEFT, activeText: true }];\n const newGroup = new _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup(grpParams);\n parameters.modifier = newGroup;\n parameters.modifier.setActiveBlock(newText);\n parameters.view.groupUndo(true);\n parameters.view.addTextGroup(parameters.modifier);\n edited = true;\n }\n else {\n // Make sure there is a score text to start the editing.\n parameters.modifier = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.deserializePreserveId(parameters.modifier);\n parameters.modifier.setActiveBlock(parameters.modifier.textBlocks[0].text);\n }\n super(SuiTextBlockDialog.dialogElements, parameters);\n this.originalTextGroup = null;\n this.outlineRect = null;\n this.originalTextGroup = originalTextGroup;\n this.isNew = isNew;\n this.modifier = parameters.modifier;\n this.displayOptions = ['BINDCOMPONENTS', 'DRAGGABLE', 'KEYBOARD_CAPTURE', 'MODIFIERPOS'];\n this.edited = edited;\n this.view.groupUndo(true);\n this.activeScoreText = this.modifier.getActiveBlock();\n this.mouseMoveHandler = null;\n this.mouseUpHandler = null;\n this.mouseDownHandler = null;\n this.mouseClickHandler = null;\n }\n populateInitial() {\n this.textBlockCtrl.setValue({\n activeScoreText: this.activeScoreText,\n modifier: this.modifier\n });\n const fontFamily = this.activeScoreText.fontInfo.family;\n const fontSize = this.activeScoreText.fontInfo.size;\n this.fontCtrl.setValue({\n family: fontFamily,\n size: fontSize,\n style: this.activeScoreText.fontInfo.style,\n weight: this.activeScoreText.fontInfo.weight\n });\n this.attachToSelectorCtrl.setValue(this.modifier.attachToSelector);\n const ul = this.modifier.ul();\n this.xCtrl.setValue(ul.x);\n this.yCtrl.setValue(ul.y);\n this.paginationCtrl.setValue(this.modifier.pagination);\n this.highlightActiveRegion();\n }\n static unrenderTextGroup(tg) {\n tg.elements.forEach((el) => {\n (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_0__.RemoveElementLike)(el);\n });\n tg.elements = [];\n }\n unrenderOriginal() {\n if (this.originalTextGroup) {\n SuiTextBlockDialog.unrenderTextGroup(this.originalTextGroup);\n }\n }\n display() {\n const pageContext = this.view.renderer.pageMap.getRendererFromModifier(this.activeScoreText);\n const svg = pageContext.svg;\n this.textElement = $(svg).find('.' + this.activeScoreText.attrs.id)[0];\n $('body').addClass('showAttributeDialog');\n $('body').addClass('textEditor');\n this.applyDisplayOptions();\n this.populateInitial();\n this.bindElements();\n if (!this.modifier.logicalBox) {\n this.view.renderer.renderTextGroup(this.modifier);\n }\n // If this control has not been edited this session, assume they want to\n // edit the text and just right into that.\n if (!this.modifier.edited) {\n this.modifier.edited = true;\n _render_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_3__.layoutDebug.addDialogDebug('text transform db: startEditSession');\n this.unrenderOriginal();\n this.textEditorCtrl.startEditSession();\n }\n const mousemove = (ev) => __awaiter(this, void 0, void 0, function* () {\n this.mouseMove(ev);\n });\n const mouseup = (ev) => __awaiter(this, void 0, void 0, function* () {\n this.mouseUp();\n });\n const mousedown = (ev) => __awaiter(this, void 0, void 0, function* () {\n this.mouseDown(ev);\n });\n const mouseclick = (ev) => __awaiter(this, void 0, void 0, function* () {\n this.mouseClick(ev);\n });\n this.mouseMoveHandler = this.eventSource.bindMouseMoveHandler(mousemove);\n this.mouseUpHandler = this.eventSource.bindMouseUpHandler(mouseup);\n this.mouseDownHandler = this.eventSource.bindMouseDownHandler(mousedown);\n this.mouseClickHandler = this.eventSource.bindMouseClickHandler(mouseclick);\n }\n _resetAttachToSelector() {\n this.modifier.attachToSelector = false;\n this.modifier.selector = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.defaults.selector;\n this.modifier.musicXOffset = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.defaults.musicXOffset;\n this.modifier.musicYOffset = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.defaults.musicYOffset;\n }\n _activateAttachToSelector() {\n this.modifier.attachToSelector = true;\n this.modifier.selector = JSON.parse(JSON.stringify(this.view.tracker.selections[0].selector));\n if (this.modifier.logicalBox) {\n this.modifier.musicXOffset = this.modifier.logicalBox.x - this.view.tracker.selections[0].measure.svg.logicalBox.x;\n this.modifier.musicYOffset = this.modifier.logicalBox.y - this.view.tracker.selections[0].measure.svg.logicalBox.y;\n }\n }\n changed() {\n return __awaiter(this, void 0, void 0, function* () {\n this.edited = true;\n if (this.insertCodeCtrl.changeFlag && this.textEditorCtrl.session) {\n const val = this.insertCodeCtrl.getValue().toString().split('');\n val.forEach((key) => {\n this.evKey({ key });\n });\n this.insertCodeCtrl.unselect();\n }\n if (this.textBlockCtrl.changeFlag) {\n const nval = this.textBlockCtrl.getValue();\n this.activeScoreText = nval.activeScoreText;\n this.highlightActiveRegion();\n }\n if (this.textEditorCtrl.changeFlag) {\n this.highlightActiveRegion();\n }\n if (this.attachToSelectorCtrl.changeFlag) {\n const toSet = this.attachToSelectorCtrl.getValue();\n if (toSet) {\n this._activateAttachToSelector();\n this.paginationCtrl.setValue(_smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.ONCE);\n this.modifier.pagination = _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.ONCE;\n }\n else {\n this._resetAttachToSelector();\n }\n }\n const pos = this.modifier.ul();\n // position can change from drag or by dialog - only update from\n // dialog entries if that changed.\n if (this.xCtrl.changeFlag) {\n this.modifier.offsetX(this.xCtrl.getValue() - pos.x);\n }\n if (this.yCtrl.changeFlag) {\n this.modifier.offsetY(this.yCtrl.getValue() - pos.y);\n }\n if (this.textDraggerCtrl.changeFlag) {\n this.xCtrl.setValue(pos.x);\n this.yCtrl.setValue(pos.y);\n }\n if (this.paginationCtrl.changeFlag) {\n this.modifier.pagination = parseInt(this.paginationCtrl.getValue().toString(), 10);\n // Pagination and attach to measure don't mix.\n this._resetAttachToSelector();\n this.attachToSelectorCtrl.setValue(false);\n }\n if (this.fontCtrl.changeFlag) {\n const fontInfo = this.fontCtrl.getValue();\n this.activeScoreText.fontInfo.family = fontInfo.family;\n // transitioning away from non-point-based font size units\n this.activeScoreText.fontInfo.size = fontInfo.size;\n this.activeScoreText.fontInfo.weight = fontInfo.weight;\n this.activeScoreText.fontInfo.style = fontInfo.style;\n }\n // Use layout context because render may have reset svg.\n const subtype = this.isNew ? _smo_xform_undo__WEBPACK_IMPORTED_MODULE_8__.UndoBuffer.bufferSubtypes.ADD : _smo_xform_undo__WEBPACK_IMPORTED_MODULE_8__.UndoBuffer.bufferSubtypes.UPDATE;\n yield this.view.updateTextGroup(this.modifier);\n // Make sure the modifier we have contains the elements of the rendered one. If there is only a copy in the score\n // we will have it, but if there are different copies between part and score, we need to sync up.\n let elementFound = false;\n if (this.view.isPartExposed()) {\n const tg = this.view.score.staves[0].partInfo.textGroups.find((tgroup) => tgroup.attrs.id === this.modifier.attrs.id);\n if (tg && tg.elements.length > 0) {\n this.modifier.elements = tg.elements;\n elementFound = true;\n }\n else {\n const tg2 = this.view.score.textGroups.find((tgroup) => tgroup.attrs.id === this.modifier.attrs.id);\n if (tg2 && tg2.elements.length > 0) {\n this.modifier.elements = tg2.elements;\n elementFound = true;\n }\n }\n }\n });\n }\n highlightActiveRegion() {\n const pageContext = this.view.renderer.pageMap.getRendererFromModifier(this.activeScoreText);\n const svg = pageContext.svg;\n if (this.activeScoreText.logicalBox) {\n const stroke = _render_sui_textEdit__WEBPACK_IMPORTED_MODULE_5__.SuiTextEditor.strokes['text-highlight'];\n if (!this.outlineRect) {\n this.outlineRect = {\n context: pageContext,\n classes: '',\n stroke,\n box: this.activeScoreText.logicalBox,\n scroll: this.scroller.scrollState,\n timeOff: 1000\n };\n }\n _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_4__.SvgHelpers.eraseOutline(this.outlineRect);\n this.outlineRect.box = this.activeScoreText.logicalBox;\n _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_4__.SvgHelpers.outlineRect(this.outlineRect);\n }\n }\n // ### handleKeydown\n // allow a dialog to be dismissed by esc.\n evKey(evdata) {\n if (evdata.key === 'Escape') {\n $(this.dgDom.element).find('.cancel-button').click();\n evdata.preventDefault();\n }\n else {\n this.textEditorCtrl.evKey(evdata);\n }\n }\n // ### Event handlers, passed from dialog\n mouseUp() {\n if (this.textDraggerCtrl && this.textDraggerCtrl.running) {\n this.textDraggerCtrl.mouseUp(null);\n }\n }\n mouseMove(ev) {\n if (this.textDraggerCtrl && this.textDraggerCtrl.running) {\n this.textDraggerCtrl.mouseMove(ev);\n }\n else if (this.textEditorCtrl && this.textEditorCtrl.isRunning) {\n this.textEditorCtrl.mouseMove(ev);\n }\n }\n mouseClick(ev) {\n if (this.textEditorCtrl && this.textEditorCtrl.isRunning) {\n this.textEditorCtrl.mouseClick(ev);\n ev.stopPropagation();\n }\n }\n mouseDown(ev) {\n if (this.textDraggerCtrl && this.textDraggerCtrl.running) {\n this.textDraggerCtrl.mouseDown(ev);\n }\n }\n _complete() {\n this.view.groupUndo(false);\n this.modifier.setActiveBlock(null);\n this.view.tracker.updateMap(); // update the text map\n this.view.renderer.setDirty();\n if (this.mouseDownHandler) {\n this.eventSource.unbindMouseDownHandler(this.mouseDownHandler);\n }\n if (this.mouseUpHandler) {\n this.eventSource.unbindMouseUpHandler(this.mouseUpHandler);\n }\n if (this.mouseMoveHandler) {\n this.eventSource.unbindMouseMoveHandler(this.mouseMoveHandler);\n }\n if (this.mouseClickHandler) {\n this.eventSource.unbindMouseClickHandler(this.mouseClickHandler);\n }\n if (this.outlineRect) {\n _render_sui_svgHelpers__WEBPACK_IMPORTED_MODULE_4__.SvgHelpers.eraseOutline(this.outlineRect);\n }\n // Hack - this comes from SuiInlineText and SuiTextEdit.\n $('body').removeClass('showAttributeDialog');\n $('body').removeClass('textEditor');\n this.complete();\n }\n _removeText() {\n // The modifier rendered is for edit, not the one attached to the score. so\n // unrender it now\n SuiTextBlockDialog.unrenderTextGroup(this.modifier);\n this.view.removeTextGroup(this.modifier);\n }\n bindElements() {\n const dgDom = this.dgDom;\n $(dgDom.element).find('.ok-button').off('click').on('click', () => {\n const subtype = this.isNew ? _smo_xform_undo__WEBPACK_IMPORTED_MODULE_8__.UndoBuffer.bufferSubtypes.ADD : _smo_xform_undo__WEBPACK_IMPORTED_MODULE_8__.UndoBuffer.bufferSubtypes.UPDATE;\n this.view.updateTextGroup(this.modifier);\n this._complete();\n });\n $(dgDom.element).find('.cancel-button').off('click').on('click', () => {\n if (this.edited) {\n this.modifier.elements.forEach((element) => {\n (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_0__.RemoveElementLike)(element);\n });\n this.modifier.elements = [];\n this.view.undo();\n }\n this._complete();\n });\n $(dgDom.element).find('.remove-button').off('click').on('click', () => {\n this._removeText();\n this._complete();\n });\n }\n}\nSuiTextBlockDialog.dialogElements = {\n label: 'Text Properties', elements: [{\n smoName: 'textEditor',\n defaultValue: 0,\n control: 'SuiTextInPlace',\n classes: 'show-always hide-when-moving',\n label: 'Edit Text',\n options: []\n }, {\n smoName: 'insertCode',\n classes: 'show-when-editing hide-when-moving',\n control: 'SuiDropdownComponent',\n label: 'Insert Special',\n options: [\n { value: '@@@', label: 'Pages' },\n { value: '###', label: 'Page Number' }\n ]\n }, {\n smoName: 'textDragger',\n classes: 'hide-when-editing show-when-moving',\n defaultValue: 0,\n control: 'SuiDragText',\n label: 'Move Text',\n options: []\n }, {\n smoName: 'x',\n defaultValue: 0,\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiRockerComponent',\n label: 'X Position (Px)',\n dataType: 'int'\n }, {\n smoName: 'y',\n defaultValue: 0,\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiRockerComponent',\n label: 'Y Position (Px)',\n dataType: 'int'\n }, {\n smoName: 'font',\n classes: 'hide-when-editing hide-when-moving',\n defaultValue: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoScoreText.fontFamilies.times,\n control: 'SuiFontComponent',\n label: 'Font Information'\n },\n {\n smoName: 'textBlock',\n classes: 'hide-when-editing hide-when-moving',\n defaultValue: '',\n control: 'SuiTextBlockComponent',\n label: 'Text Block Properties'\n },\n {\n smoName: 'pagination',\n defaultValue: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.ONCE,\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiDropdownComponent',\n label: 'Page Behavior',\n startRow: true,\n options: [{ value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.ONCE, label: 'Once' },\n { value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.EVERY, label: 'Every' },\n { value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.ODD, label: 'Odd' },\n { value: _smo_data_scoreText__WEBPACK_IMPORTED_MODULE_1__.SmoTextGroup.paginations.SUBSEQUENT, label: 'Subsequent' }\n ]\n }, {\n smoName: 'attachToSelector',\n classes: 'hide-when-editing hide-when-moving',\n control: 'SuiToggleComponent',\n label: 'Attach to Selection'\n }],\n staticText: [\n { label: 'Text Properties' },\n { editorLabel: 'Done Editing Text' },\n { draggerLabel: 'Done Dragging Text' }\n ]\n};\n/**\n * @category SuiDialog\n */\nclass helpModal {\n static createAndDisplay() {\n _help__WEBPACK_IMPORTED_MODULE_7__.SuiHelp.displayHelp();\n return (0,_common_htmlHelpers__WEBPACK_IMPORTED_MODULE_2__.closeDialogPromise)();\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QVksQ0FBQyxXQUFXLENBQUMsSUFBSTtZQUMzQyxPQUFPLEVBQUUsb0NBQW9DO1lBQzdDLE9BQU8sRUFBRSxzQkFBc0I7WUFDL0IsS0FBSyxFQUFFLGVBQWU7WUFDdEIsUUFBUSxFQUFFLElBQUk7WUFDZCxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSw2REFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtnQkFDakUsRUFBRSxLQUFLLEVBQUUsNkRBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7Z0JBQ3pELEVBQUUsS0FBSyxFQUFFLDZEQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO2dCQUNyRCxFQUFFLEtBQUssRUFBRSw2REFBWSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTthQUNsRTtTQUNGLEVBQUU7WUFDRCxPQUFPLEVBQUUsa0JBQWtCO1lBQzNCLE9BQU8sRUFBRSxvQ0FBb0M7WUFDN0MsT0FBTyxFQUFFLG9CQUFvQjtZQUM3QixLQUFLLEVBQUUscUJBQXFCO1NBQzdCLENBQUM7SUFDSixVQUFVLEVBQUU7UUFDVixFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRTtRQUM1QixFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRTtRQUNwQyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRTtLQUN2QztDQUNGLENBQUM7QUE0VlI7O0dBRUc7QUFDSSxNQUFNLFNBQVM7SUFDcEIsTUFBTSxDQUFDLGdCQUFnQjtRQUNyQiwwQ0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sdUVBQWtCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvdWkvZGlhbG9ncy90ZXh0QmxvY2sudHM/YTI2ZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuaW1wb3J0IHsgRWxlbWVudExpa2UsIFJlbW92ZUVsZW1lbnRMaWtlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvY29tbW9uJztcclxuaW1wb3J0IHsgU21vU2NvcmVUZXh0LCBTbW9UZXh0R3JvdXAgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9zY29yZVRleHQnO1xyXG5cclxuaW1wb3J0IHsgY2xvc2VEaWFsb2dQcm9taXNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2h0bWxIZWxwZXJzJztcclxuXHJcbmltcG9ydCB7IGxheW91dERlYnVnIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS9sYXlvdXREZWJ1Zyc7XHJcbmltcG9ydCB7IFN2Z0hlbHBlcnMsIE91dGxpbmVJbmZvIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS9zdmdIZWxwZXJzJztcclxuaW1wb3J0IHsgU3VpVGV4dEVkaXRvciB9IGZyb20gJy4uLy4uL3JlbmRlci9zdWkvdGV4dEVkaXQnO1xyXG5cclxuaW1wb3J0IHsgRGlhbG9nRGVmaW5pdGlvbiwgU3VpRGlhbG9nQmFzZSwgU3VpRGlhbG9nUGFyYW1zIH0gZnJvbSAnLi9kaWFsb2cnO1xyXG5pbXBvcnQgeyBTdWlEcmFnVGV4dCB9IGZyb20gJy4vY29tcG9uZW50cy9kcmFnVGV4dCc7XHJcbmltcG9ydCB7IFN1aVRleHRJblBsYWNlIH0gZnJvbSAnLi9jb21wb25lbnRzL3RleHRJblBsYWNlJztcclxuaW1wb3J0IHsgU3VpRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZHJvcGRvd24nO1xyXG5pbXBvcnQgeyBTdWlUb2dnbGVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdG9nZ2xlJztcclxuaW1wb3J0IHsgU3VpUm9ja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3JvY2tlcic7XHJcbmltcG9ydCB7IFN1aUhlbHAgfSBmcm9tICcuLi9oZWxwJztcclxuaW1wb3J0IHsgU3VpRm9udENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9mb250Q29tcG9uZW50JztcclxuaW1wb3J0IHsgU3VpVGV4dEJsb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RleHRJblBsYWNlJztcclxuXHJcbmltcG9ydCB7IEV2ZW50SGFuZGxlciB9IGZyb20gJy4uL2V2ZW50U291cmNlJztcclxuaW1wb3J0IHsgU3VpSW5saW5lVGV4dCB9IGZyb20gJy4uLy4uL3JlbmRlci9zdWkvdGV4dFJlbmRlcic7XHJcbmltcG9ydCB7IFVuZG9CdWZmZXIgfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vdW5kbyc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcbi8qKlxyXG4gKiBDb21wbGV4IGRpYWxvZyBmb3IgbWFuYWdpbmcgc2NvcmUgdGV4dCAobm90IGFzc29jaWF0ZWQgd2l0aCBtdXNpYylcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aVRleHRCbG9ja0RpYWxvZyBleHRlbmRzIFN1aURpYWxvZ0Jhc2Uge1xyXG4gIGdldCB0ZXh0RWRpdG9yQ3RybCgpOiBTdWlUZXh0SW5QbGFjZSB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLnRleHRFZGl0b3JDdHJsIGFzIFN1aVRleHRJblBsYWNlO1xyXG4gIH1cclxuICBnZXQgaW5zZXJ0Q29kZUN0cmwoKTogU3VpRHJvcGRvd25Db21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC5pbnNlcnRDb2RlQ3RybCBhcyBTdWlEcm9wZG93bkNvbXBvbmVudDtcclxuICB9XHJcbiAgZ2V0IHRleHREcmFnZ2VyQ3RybCgpOiBTdWlEcmFnVGV4dCB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLnRleHREcmFnZ2VyQ3RybCBhcyBTdWlEcmFnVGV4dDtcclxuICB9XHJcbiAgZ2V0IHlDdHJsKCk6IFN1aVJvY2tlckNvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLnlDdHJsIGFzIFN1aVJvY2tlckNvbXBvbmVudDtcclxuICB9XHJcbiAgZ2V0IHhDdHJsKCk6IFN1aVJvY2tlckNvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5jbWFwLnhDdHJsIGFzIFN1aVJvY2tlckNvbXBvbmVudDtcclxuICB9XHJcbiAgZ2V0IGZvbnRDdHJsKCk6IFN1aUZvbnRDb21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC5mb250Q3RybCBhcyBTdWlGb250Q29tcG9uZW50O1xyXG4gIH1cclxuICBnZXQgdGV4dEJsb2NrQ3RybCgpOiBTdWlUZXh0QmxvY2tDb21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC50ZXh0QmxvY2tDdHJsIGFzIFN1aVRleHRCbG9ja0NvbXBvbmVudDtcclxuICB9XHJcbiAgZ2V0IHBhZ2luYXRpb25DdHJsKCk6IFN1aURyb3Bkb3duQ29tcG9uZW50IHtcclxuICAgIHJldHVybiB0aGlzLmNtYXAucGFnaW5hdGlvbkN0cmwgYXMgU3VpRHJvcGRvd25Db21wb25lbnQ7XHJcbiAgfVxyXG4gIGdldCBhdHRhY2hUb1NlbGVjdG9yQ3RybCgpOiBTdWlUb2dnbGVDb21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuY21hcC5hdHRhY2hUb1NlbGVjdG9yQ3RybCBhcyBTdWlUb2dnbGVDb21wb25lbnQ7XHJcbiAgfVxyXG4gIHN0YXRpYyBkaWFsb2dFbGVtZW50czogRGlhbG9nRGVmaW5pdGlvbiA9XHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogJ1RleHQgUHJvcGVydGllcycsIGVsZW1lbnRzOlxyXG4gICAgICAgICAgW3tcclxuICAgICAgICAgICAgc21vTmFtZTogJ3RleHRFZGl0b3InLFxyXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDAsXHJcbiAgICAgICAgICAgIGNvbnRyb2w6ICdTdWlUZXh0SW5QbGFjZScsXHJcbiAgICAgICAgICAgIGNsYXNzZXM6ICdzaG93LWFsd2F5cyBoaWRlLXdoZW4tbW92aW5nJyxcclxuICAgICAgICAgICAgbGFiZWw6ICdFZGl0IFRleHQnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiBbXVxyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBzbW9OYW1lOiAnaW5zZXJ0Q29kZScsXHJcbiAgICAgICAgICAgIGNsYXNzZXM6ICdzaG93LXdoZW4tZWRpdGluZyBoaWRlLXdoZW4tbW92aW5nJyxcclxuICAgICAgICAgICAgY29udHJvbDogJ1N1aURyb3Bkb3duQ29tcG9uZW50JyxcclxuICAgICAgICAgICAgbGFiZWw6ICdJbnNlcnQgU3BlY2lhbCcsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcclxuICAgICAgICAgICAgICB7IHZhbHVlOiAnQEBAJywgbGFiZWw6ICdQYWdlcycgfSxcclxuICAgICAgICAgICAgICB7IHZhbHVlOiAnIyMjJywgbGFiZWw6ICdQYWdlIE51bWJlcicgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICd0ZXh0RHJhZ2dlcicsXHJcbiAgICAgICAgICAgIGNsYXNzZXM6ICdoaWRlLXdoZW4tZWRpdGluZyBzaG93LXdoZW4tbW92aW5nJyxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxyXG4gICAgICAgICAgICBjb250cm9sOiAnU3VpRHJhZ1RleHQnLFxyXG4gICAgICAgICAgICBsYWJlbDogJ01vdmUgVGV4dCcsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IFtdXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICd4JyxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxyXG4gICAgICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgICAgIGNvbnRyb2w6ICdTdWlSb2NrZXJDb21wb25lbnQnLFxyXG4gICAgICAgICAgICBsYWJlbDogJ1ggUG9zaXRpb24gKFB4KScsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnaW50J1xyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBzbW9OYW1lOiAneScsXHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMCxcclxuICAgICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nIGhpZGUtd2hlbi1tb3ZpbmcnLFxyXG4gICAgICAgICAgICBjb250cm9sOiAnU3VpUm9ja2VyQ29tcG9uZW50JyxcclxuICAgICAgICAgICAgbGFiZWw6ICdZIFBvc2l0aW9uIChQeCknLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2ludCdcclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgc21vTmFtZTogJ2ZvbnQnLFxyXG4gICAgICAgICAgICBjbGFzc2VzOiAnaGlkZS13aGVuLWVkaXRpbmcgaGlkZS13aGVuLW1vdmluZycsXHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogU21vU2NvcmVUZXh0LmZvbnRGYW1pbGllcy50aW1lcyxcclxuICAgICAgICAgICAgY29udHJvbDogJ1N1aUZvbnRDb21wb25lbnQnLFxyXG4gICAgICAgICAgICBsYWJlbDogJ0ZvbnQgSW5mb3JtYXRpb24nXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBzbW9OYW1lOiAndGV4dEJsb2NrJyxcclxuICAgICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nIGhpZGUtd2hlbi1tb3ZpbmcnLFxyXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLFxyXG4gICAgICAgICAgICBjb250cm9sOiAnU3VpVGV4dEJsb2NrQ29tcG9uZW50JyxcclxuICAgICAgICAgICAgbGFiZWw6ICdUZXh0IEJsb2NrIFByb3BlcnRpZXMnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgeyAvLyB7ZXZlcnk6J2V2ZXJ5JyxldmVuOidldmVuJyxvZGQ6J29kZCcsb25jZTonb25jZSd9XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICdwYWdpbmF0aW9uJyxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBTbW9UZXh0R3JvdXAucGFnaW5hdGlvbnMuT05DRSxcclxuICAgICAgICAgICAgY2xhc3NlczogJ2hpZGUtd2hlbi1lZGl0aW5nIGhpZGUtd2hlbi1tb3ZpbmcnLFxyXG4gICAgICAgICAgICBjb250cm9sOiAnU3VpRHJvcGRvd25Db21wb25lbnQnLFxyXG4gICAgICAgICAgICBsYWJlbDogJ1BhZ2UgQmVoYXZpb3InLFxyXG4gICAgICAgICAgICBzdGFydFJvdzogdHJ1ZSxcclxuICAgICAgICAgICAgb3B0aW9uczogW3sgdmFsdWU6IFNtb1RleHRHcm91cC5wYWdpbmF0aW9ucy5PTkNFLCBsYWJlbDogJ09uY2UnIH0sXHJcbiAgICAgICAgICAgIHsgdmFsdWU6IFNtb1RleHRHcm91cC5wYWdpbmF0aW9ucy5FVkVSWSwgbGFiZWw6ICdFdmVyeScgfSxcclxuICAgICAgICAgICAgeyB2YWx1ZTogU21vVGV4dEdyb3VwLnBhZ2luYXRpb25zLk9ERCwgbGFiZWw6ICdPZGQnIH0sXHJcbiAgICAgICAgICAgIHsgdmFsdWU6IFNtb1RleHRHcm91cC5wYWdpbmF0aW9ucy5TVUJTRVFVRU5ULCBsYWJlbDogJ1N1YnNlcXVlbnQnIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBzbW9OYW1lOiAnYXR0YWNoVG9TZWxlY3RvcicsXHJcbiAgICAgICAgICAgIGNsYXNzZXM6ICdoaWRlLXdoZW4tZWRpdGluZyBoaWRlLXdoZW4tbW92aW5nJyxcclxuICAgICAgICAgICAgY29udHJvbDogJ1N1aVRvZ2dsZUNvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnQXR0YWNoIHRvIFNlbGVjdGlvbidcclxuICAgICAgICAgIH1dLFxyXG4gICAgICAgIHN0YXRpY1RleHQ6IFtcclxuICAgICAgICAgIHsgbGFiZWw6ICdUZXh0IFByb3BlcnRpZXMnIH0sXHJcbiAgICAgICAgICB7IGVkaXRvckxhYmVsOiAnRG9uZSBFZGl0aW5nIFRleHQnIH0sXHJcbiAgICAgICAgICB7IGRyYWdnZXJMYWJlbDogJ0RvbmUgRHJhZ2dpbmcgVGV4dCcgfVxyXG4gICAgICAgIF1cclxuICAgICAgfTtcclxuICBlZGl0ZWQ6IGJvb2xlYW47XHJcbiAgaXNOZXc6IGJvb2xlYW47XHJcbiAgbW9kaWZpZXI6IFNtb1RleHRHcm91cDtcclxuICBvcmlnaW5hbFRleHRHcm91cDogU21vVGV4dEdyb3VwIHwgbnVsbCA9IG51bGw7XHJcbiAgYWN0aXZlU2NvcmVUZXh0OiBTbW9TY29yZVRleHQ7XHJcbiAgdGV4dEVsZW1lbnQ6IGFueTtcclxuICBtb3VzZU1vdmVIYW5kbGVyOiBFdmVudEhhbmRsZXIgfCBudWxsO1xyXG4gIG1vdXNlVXBIYW5kbGVyOiBFdmVudEhhbmRsZXIgfCBudWxsO1xyXG4gIG1vdXNlRG93bkhhbmRsZXI6IEV2ZW50SGFuZGxlciB8IG51bGw7XHJcbiAgbW91c2VDbGlja0hhbmRsZXI6IEV2ZW50SGFuZGxlciB8IG51bGw7XHJcbiAgb3V0bGluZVJlY3Q6IE91dGxpbmVJbmZvIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnM6IFN1aURpYWxvZ1BhcmFtcykge1xyXG4gICAgbGV0IGVkaXRlZCA9IGZhbHNlO1xyXG4gICAgbGV0IGlzTmV3ID0gZmFsc2U7XHJcbiAgICBjb25zdCBvcmlnaW5hbFRleHRHcm91cDogU21vVGV4dEdyb3VwIHwgbnVsbCA9IHBhcmFtZXRlcnMubW9kaWZpZXIgPz8gbnVsbDtcclxuICAgIGNvbnN0IHRyYWNrZXIgPSBwYXJhbWV0ZXJzLnZpZXcudHJhY2tlcjtcclxuICAgIFsnc3RhZmZNb2RpZmllcicsICdzdWdnZXN0aW9uJ10uZm9yRWFjaCgob3V0bGluZVR5cGUpID0+IHtcclxuICAgICAgaWYgKHRyYWNrZXIub3V0bGluZXNbb3V0bGluZVR5cGVdKSB7XHJcbiAgICAgICAgU3ZnSGVscGVycy5lcmFzZU91dGxpbmUodHJhY2tlci5vdXRsaW5lc1tvdXRsaW5lVHlwZV0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIENyZWF0ZSBhIG5ldyB0ZXh0IG1vZGlmaWVyLCBpZiB0aGlzIGlzIG5ldyB0ZXh0LiAgIEVsc2UgdXNlIHNlbGVjdGlvblxyXG4gICAgaWYgKCFwYXJhbWV0ZXJzLm1vZGlmaWVyKSB7XHJcbiAgICAgIGlzTmV3ID0gdHJ1ZTtcclxuICAgICAgY29uc3QgdGV4dFBhcmFtcyA9IFNtb1Njb3JlVGV4dC5kZWZhdWx0cztcclxuICAgICAgY29uc3QgbmV3VGV4dCA9IG5ldyBTbW9TY29yZVRleHQodGV4dFBhcmFtcyk7XHJcbiAgICAgIC8vIGNvbnZlcnQgc2Nyb2xsIGZyb20gc2NyZWVuIGNvb3JkIHRvIHN2ZyBjb29yZFxyXG4gICAgICBjb25zdCBzdmdTY3JvbGwgPSB0cmFja2VyLnJlbmRlcmVyLnBhZ2VNYXAuY2xpZW50VG9TdmcoU3ZnSGVscGVycy5zbW9Cb3godHJhY2tlci5zY3JvbGxlci5zY3JvbGxTdGF0ZSkpO1xyXG4gICAgICBuZXdUZXh0LnkgKz0gc3ZnU2Nyb2xsLnk7XHJcbiAgICAgIG5ld1RleHQueCArPSBzdmdTY3JvbGwueDtcclxuICAgICAgaWYgKHRyYWNrZXIuc2VsZWN0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsID0gdHJhY2tlci5zZWxlY3Rpb25zWzBdLm1lYXN1cmUuc3ZnO1xyXG4gICAgICAgIGlmICh0eXBlb2YgKHNlbC5sb2dpY2FsQm94KSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgIGlmIChzZWwubG9naWNhbEJveC55ID49IG5ld1RleHQueSkge1xyXG4gICAgICAgICAgICBuZXdUZXh0LnkgPSBzZWwubG9naWNhbEJveC55O1xyXG4gICAgICAgICAgICBuZXdUZXh0LnggPSBzZWwubG9naWNhbEJveC54O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjb25zdCBncnBQYXJhbXMgPSBTbW9UZXh0R3JvdXAuZGVmYXVsdHM7XHJcbiAgICAgIGdycFBhcmFtcy50ZXh0QmxvY2tzID0gW3sgdGV4dDogbmV3VGV4dCwgcG9zaXRpb246IFNtb1RleHRHcm91cC5yZWxhdGl2ZVBvc2l0aW9ucy5MRUZULCBhY3RpdmVUZXh0OiB0cnVlIH1dO1xyXG4gICAgICBjb25zdCBuZXdHcm91cCA9IG5ldyBTbW9UZXh0R3JvdXAoZ3JwUGFyYW1zKTtcclxuICAgICAgcGFyYW1ldGVycy5tb2RpZmllciA9IG5ld0dyb3VwO1xyXG4gICAgICBwYXJhbWV0ZXJzLm1vZGlmaWVyLnNldEFjdGl2ZUJsb2NrKG5ld1RleHQpO1xyXG4gICAgICBwYXJhbWV0ZXJzLnZpZXcuZ3JvdXBVbmRvKHRydWUpO1xyXG4gICAgICBwYXJhbWV0ZXJzLnZpZXcuYWRkVGV4dEdyb3VwKHBhcmFtZXRlcnMubW9kaWZpZXIpO1xyXG4gICAgICBlZGl0ZWQgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIGEgc2NvcmUgdGV4dCB0byBzdGFydCB0aGUgZWRpdGluZy5cclxuICAgICAgcGFyYW1ldGVycy5tb2RpZmllciA9IFNtb1RleHRHcm91cC5kZXNlcmlhbGl6ZVByZXNlcnZlSWQocGFyYW1ldGVycy5tb2RpZmllcik7XHJcbiAgICAgIHBhcmFtZXRlcnMubW9kaWZpZXIuc2V0QWN0aXZlQmxvY2socGFyYW1ldGVycy5tb2RpZmllci50ZXh0QmxvY2tzWzBdLnRleHQpO1xyXG4gICAgfVxyXG4gICAgc3VwZXIoU3VpVGV4dEJsb2NrRGlhbG9nLmRpYWxvZ0VsZW1lbnRzLCBwYXJhbWV0ZXJzKTtcclxuICAgIHRoaXMub3JpZ2luYWxUZXh0R3JvdXAgPSBvcmlnaW5hbFRleHRHcm91cDtcclxuICAgIHRoaXMuaXNOZXcgPSBpc05ldztcclxuICAgIHRoaXMubW9kaWZpZXIgPSBwYXJhbWV0ZXJzLm1vZGlmaWVyO1xyXG4gICAgdGhpcy5kaXNwbGF5T3B0aW9ucyA9IFsnQklORENPTVBPTkVOVFMnLCAnRFJBR0dBQkxFJywgJ0tFWUJPQVJEX0NBUFRVUkUnLCAnTU9ESUZJRVJQT1MnXVxyXG4gICAgdGhpcy5lZGl0ZWQgPSBlZGl0ZWQ7XHJcbiAgICB0aGlzLnZpZXcuZ3JvdXBVbmRvKHRydWUpO1xyXG4gICAgdGhpcy5hY3RpdmVTY29yZVRleHQgPSB0aGlzLm1vZGlmaWVyLmdldEFjdGl2ZUJsb2NrKCk7XHJcbiAgICB0aGlzLm1vdXNlTW92ZUhhbmRsZXIgPSBudWxsO1xyXG4gICAgdGhpcy5tb3VzZVVwSGFuZGxlciA9IG51bGw7XHJcbiAgICB0aGlzLm1vdXNlRG93bkhhbmRsZXIgPSBudWxsO1xyXG4gICAgdGhpcy5tb3VzZUNsaWNrSGFuZGxlciA9IG51bGw7XHJcbiAgfVxyXG4gIHBvcHVsYXRlSW5pdGlhbCgpIHtcclxuICAgIHRoaXMudGV4dEJsb2NrQ3RybC5zZXRWYWx1ZSh7XHJcbiAgICAgIGFjdGl2ZVNjb3JlVGV4dDogdGhpcy5hY3RpdmVTY29yZVRleHQsXHJcbiAgICAgIG1vZGlmaWVyOiB0aGlzLm1vZGlmaWVyXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmFjdGl2ZVNjb3JlVGV4dC5mb250SW5mby5mYW1pbHk7XHJcbiAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuYWN0aXZlU2NvcmVUZXh0LmZvbnRJbmZvLnNpemU7XHJcbiAgICB0aGlzLmZvbnRDdHJsLnNldFZhbHVlKHtcclxuICAgICAgZmFtaWx5OiBmb250RmFtaWx5LFxyXG4gICAgICBzaXplOiBmb250U2l6ZSxcclxuICAgICAgc3R5bGU6IHRoaXMuYWN0aXZlU2NvcmVUZXh0LmZvbnRJbmZvLnN0eWxlLFxyXG4gICAgICB3ZWlnaHQ6IHRoaXMuYWN0aXZlU2NvcmVUZXh0LmZvbnRJbmZvLndlaWdodFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmF0dGFjaFRvU2VsZWN0b3JDdHJsLnNldFZhbHVlKHRoaXMubW9kaWZpZXIuYXR0YWNoVG9TZWxlY3Rvcik7XHJcbiAgICBjb25zdCB1bCA9IHRoaXMubW9kaWZpZXIudWwoKTtcclxuICAgIHRoaXMueEN0cmwuc2V0VmFsdWUodWwueCk7XHJcbiAgICB0aGlzLnlDdHJsLnNldFZhbHVlKHVsLnkpO1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uQ3RybC5zZXRWYWx1ZSh0aGlzLm1vZGlmaWVyLnBhZ2luYXRpb24pO1xyXG4gICAgdGhpcy5oaWdobGlnaHRBY3RpdmVSZWdpb24oKTtcclxuICB9XHJcbiAgc3RhdGljIHVucmVuZGVyVGV4dEdyb3VwKHRnOiBTbW9UZXh0R3JvdXApIHtcclxuICAgIHRnLmVsZW1lbnRzLmZvckVhY2goKGVsOiBFbGVtZW50TGlrZSkgID0+IHtcclxuICAgICAgUmVtb3ZlRWxlbWVudExpa2UoZWwpO1xyXG4gICAgfSk7XHJcbiAgICB0Zy5lbGVtZW50cyA9IFtdO1xyXG5cclxuICB9XHJcbiAgdW5yZW5kZXJPcmlnaW5hbCgpIHtcclxuICAgIGlmICh0aGlzLm9yaWdpbmFsVGV4dEdyb3VwKSB7XHJcbiAgICAgIFN1aVRleHRCbG9ja0RpYWxvZy51bnJlbmRlclRleHRHcm91cCh0aGlzLm9yaWdpbmFsVGV4dEdyb3VwKTtcclxuICAgIH1cclxuICB9XHJcbiAgZGlzcGxheSgpIHtcclxuICAgIGNvbnN0IHBhZ2VDb250ZXh0ID0gdGhpcy52aWV3LnJlbmRlcmVyLnBhZ2VNYXAuZ2V0UmVuZGVyZXJGcm9tTW9kaWZpZXIodGhpcy5hY3RpdmVTY29yZVRleHQpO1xyXG4gICAgY29uc3Qgc3ZnID0gcGFnZUNvbnRleHQuc3ZnO1xyXG4gICAgdGhpcy50ZXh0RWxlbWVudCA9ICQoc3ZnKS5maW5kKCcuJyArIHRoaXMuYWN0aXZlU2NvcmVUZXh0LmF0dHJzLmlkKVswXTtcclxuICAgICQoJ2JvZHknKS5hZGRDbGFzcygnc2hvd0F0dHJpYnV0ZURpYWxvZycpO1xyXG4gICAgJCgnYm9keScpLmFkZENsYXNzKCd0ZXh0RWRpdG9yJyk7XHJcbiAgICB0aGlzLmFwcGx5RGlzcGxheU9wdGlvbnMoKTtcclxuICAgIHRoaXMucG9wdWxhdGVJbml0aWFsKCk7XHJcbiAgICB0aGlzLmJpbmRFbGVtZW50cygpO1xyXG4gICAgaWYgKCF0aGlzLm1vZGlmaWVyLmxvZ2ljYWxCb3gpIHtcclxuICAgICAgdGhpcy52aWV3LnJlbmRlcmVyLnJlbmRlclRleHRHcm91cCh0aGlzLm1vZGlmaWVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB0aGlzIGNvbnRyb2wgaGFzIG5vdCBiZWVuIGVkaXRlZCB0aGlzIHNlc3Npb24sIGFzc3VtZSB0aGV5IHdhbnQgdG9cclxuICAgIC8vIGVkaXQgdGhlIHRleHQgYW5kIGp1c3QgcmlnaHQgaW50byB0aGF0LlxyXG4gICAgaWYgKCF0aGlzLm1vZGlmaWVyLmVkaXRlZCkge1xyXG4gICAgICB0aGlzLm1vZGlmaWVyLmVkaXRlZCA9IHRydWU7XHJcbiAgICAgIGxheW91dERlYnVnLmFkZERpYWxvZ0RlYnVnKCd0ZXh0IHRyYW5zZm9ybSBkYjogc3RhcnRFZGl0U2Vzc2lvbicpO1xyXG4gICAgICB0aGlzLnVucmVuZGVyT3JpZ2luYWwoKTtcclxuICAgICAgdGhpcy50ZXh0RWRpdG9yQ3RybC5zdGFydEVkaXRTZXNzaW9uKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtb3VzZW1vdmUgPSBhc3luYyAoZXY6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLm1vdXNlTW92ZShldik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtb3VzZXVwID0gYXN5bmMgKGV2OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5tb3VzZVVwKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtb3VzZWRvd24gPSBhc3luYyAoZXY6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLm1vdXNlRG93bihldik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtb3VzZWNsaWNrID0gYXN5bmMgKGV2OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5tb3VzZUNsaWNrKGV2KTtcclxuICAgIH1cclxuICAgIHRoaXMubW91c2VNb3ZlSGFuZGxlciA9IHRoaXMuZXZlbnRTb3VyY2UuYmluZE1vdXNlTW92ZUhhbmRsZXIobW91c2Vtb3ZlKTtcclxuICAgIHRoaXMubW91c2VVcEhhbmRsZXIgPSB0aGlzLmV2ZW50U291cmNlLmJpbmRNb3VzZVVwSGFuZGxlcihtb3VzZXVwKTtcclxuICAgIHRoaXMubW91c2VEb3duSGFuZGxlciA9IHRoaXMuZXZlbnRTb3VyY2UuYmluZE1vdXNlRG93bkhhbmRsZXIobW91c2Vkb3duKTtcclxuICAgIHRoaXMubW91c2VDbGlja0hhbmRsZXIgPSB0aGlzLmV2ZW50U291cmNlLmJpbmRNb3VzZUNsaWNrSGFuZGxlcihtb3VzZWNsaWNrKTtcclxuICB9XHJcbiAgX3Jlc2V0QXR0YWNoVG9TZWxlY3RvcigpIHtcclxuICAgIHRoaXMubW9kaWZpZXIuYXR0YWNoVG9TZWxlY3RvciA9IGZhbHNlO1xyXG4gICAgdGhpcy5tb2RpZmllci5zZWxlY3RvciA9IFNtb1RleHRHcm91cC5kZWZhdWx0cy5zZWxlY3RvcjtcclxuICAgIHRoaXMubW9kaWZpZXIubXVzaWNYT2Zmc2V0ID0gU21vVGV4dEdyb3VwLmRlZmF1bHRzLm11c2ljWE9mZnNldDtcclxuICAgIHRoaXMubW9kaWZpZXIubXVzaWNZT2Zmc2V0ID0gU21vVGV4dEdyb3VwLmRlZmF1bHRzLm11c2ljWU9mZnNldDtcclxuICB9XHJcbiAgX2FjdGl2YXRlQXR0YWNoVG9TZWxlY3RvcigpIHtcclxuICAgIHRoaXMubW9kaWZpZXIuYXR0YWNoVG9TZWxlY3RvciA9IHRydWU7XHJcbiAgICB0aGlzLm1vZGlmaWVyLnNlbGVjdG9yID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnZpZXcudHJhY2tlci5zZWxlY3Rpb25zWzBdLnNlbGVjdG9yKSk7XHJcbiAgICBpZiAodGhpcy5tb2RpZmllci5sb2dpY2FsQm94KSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXIubXVzaWNYT2Zmc2V0ID0gdGhpcy5tb2RpZmllci5sb2dpY2FsQm94LnggLSB0aGlzLnZpZXcudHJhY2tlci5zZWxlY3Rpb25zWzBdLm1lYXN1cmUuc3ZnLmxvZ2ljYWxCb3gueDtcclxuICAgICAgdGhpcy5tb2RpZmllci5tdXNpY1lPZmZzZXQgPSB0aGlzLm1vZGlmaWVyLmxvZ2ljYWxCb3gueSAtIHRoaXMudmlldy50cmFja2VyLnNlbGVjdGlvbnNbMF0ubWVhc3VyZS5zdmcubG9naWNhbEJveC55O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2hhbmdlZCgpIHtcclxuICAgIHRoaXMuZWRpdGVkID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmluc2VydENvZGVDdHJsLmNoYW5nZUZsYWcgJiYgdGhpcy50ZXh0RWRpdG9yQ3RybC5zZXNzaW9uKSB7XHJcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuaW5zZXJ0Q29kZUN0cmwuZ2V0VmFsdWUoKS50b1N0cmluZygpLnNwbGl0KCcnKTtcclxuICAgICAgdmFsLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZXZLZXkoeyBrZXkgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmluc2VydENvZGVDdHJsLnVuc2VsZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudGV4dEJsb2NrQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIGNvbnN0IG52YWwgPSB0aGlzLnRleHRCbG9ja0N0cmwuZ2V0VmFsdWUoKTtcclxuICAgICAgdGhpcy5hY3RpdmVTY29yZVRleHQgPSBudmFsLmFjdGl2ZVNjb3JlVGV4dDtcclxuICAgICAgdGhpcy5oaWdobGlnaHRBY3RpdmVSZWdpb24oKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRleHRFZGl0b3JDdHJsLmNoYW5nZUZsYWcpIHtcclxuICAgICAgdGhpcy5oaWdobGlnaHRBY3RpdmVSZWdpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hdHRhY2hUb1NlbGVjdG9yQ3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIGNvbnN0IHRvU2V0ID0gdGhpcy5hdHRhY2hUb1NlbGVjdG9yQ3RybC5nZXRWYWx1ZSgpO1xyXG4gICAgICBpZiAodG9TZXQpIHtcclxuICAgICAgICB0aGlzLl9hY3RpdmF0ZUF0dGFjaFRvU2VsZWN0b3IoKTtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb25DdHJsLnNldFZhbHVlKFNtb1RleHRHcm91cC5wYWdpbmF0aW9ucy5PTkNFKTtcclxuICAgICAgICB0aGlzLm1vZGlmaWVyLnBhZ2luYXRpb24gPSBTbW9UZXh0R3JvdXAucGFnaW5hdGlvbnMuT05DRTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9yZXNldEF0dGFjaFRvU2VsZWN0b3IoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBvcyA9IHRoaXMubW9kaWZpZXIudWwoKTtcclxuXHJcbiAgICAvLyBwb3NpdGlvbiBjYW4gY2hhbmdlIGZyb20gZHJhZyBvciBieSBkaWFsb2cgLSBvbmx5IHVwZGF0ZSBmcm9tXHJcbiAgICAvLyBkaWFsb2cgZW50cmllcyBpZiB0aGF0IGNoYW5nZWQuXHJcbiAgICBpZiAodGhpcy54Q3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXIub2Zmc2V0WCh0aGlzLnhDdHJsLmdldFZhbHVlKCkgLSBwb3MueCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy55Q3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIHRoaXMubW9kaWZpZXIub2Zmc2V0WSh0aGlzLnlDdHJsLmdldFZhbHVlKCkgLSBwb3MueSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50ZXh0RHJhZ2dlckN0cmwuY2hhbmdlRmxhZykge1xyXG4gICAgICB0aGlzLnhDdHJsLnNldFZhbHVlKHBvcy54KTtcclxuICAgICAgdGhpcy55Q3RybC5zZXRWYWx1ZShwb3MueSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucGFnaW5hdGlvbkN0cmwuY2hhbmdlRmxhZykge1xyXG4gICAgICB0aGlzLm1vZGlmaWVyLnBhZ2luYXRpb24gPSBwYXJzZUludCh0aGlzLnBhZ2luYXRpb25DdHJsLmdldFZhbHVlKCkudG9TdHJpbmcoKSwgMTApO1xyXG4gICAgICAvLyBQYWdpbmF0aW9uIGFuZCBhdHRhY2ggdG8gbWVhc3VyZSBkb24ndCBtaXguXHJcbiAgICAgIHRoaXMuX3Jlc2V0QXR0YWNoVG9TZWxlY3RvcigpO1xyXG4gICAgICB0aGlzLmF0dGFjaFRvU2VsZWN0b3JDdHJsLnNldFZhbHVlKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5mb250Q3RybC5jaGFuZ2VGbGFnKSB7XHJcbiAgICAgIGNvbnN0IGZvbnRJbmZvID0gdGhpcy5mb250Q3RybC5nZXRWYWx1ZSgpO1xyXG4gICAgICB0aGlzLmFjdGl2ZVNjb3JlVGV4dC5mb250SW5mby5mYW1pbHkgPSBmb250SW5mby5mYW1pbHk7XHJcbiAgICAgIC8vIHRyYW5zaXRpb25pbmcgYXdheSBmcm9tIG5vbi1wb2ludC1iYXNlZCBmb250IHNpemUgdW5pdHNcclxuICAgICAgdGhpcy5hY3RpdmVTY29yZVRleHQuZm9udEluZm8uc2l6ZSA9IGZvbnRJbmZvLnNpemU7XHJcbiAgICAgIHRoaXMuYWN0aXZlU2NvcmVUZXh0LmZvbnRJbmZvLndlaWdodCA9IGZvbnRJbmZvLndlaWdodDtcclxuICAgICAgdGhpcy5hY3RpdmVTY29yZVRleHQuZm9udEluZm8uc3R5bGUgPSBmb250SW5mby5zdHlsZTtcclxuICAgIH1cclxuICAgIC8vIFVzZSBsYXlvdXQgY29udGV4dCBiZWNhdXNlIHJlbmRlciBtYXkgaGF2ZSByZXNldCBzdmcuXHJcbiAgICBjb25zdCBzdWJ0eXBlID0gdGhpcy5pc05ldyA/IFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuQUREIDogVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5VUERBVEU7XHJcbiAgICBhd2FpdCB0aGlzLnZpZXcudXBkYXRlVGV4dEdyb3VwKHRoaXMubW9kaWZpZXIpO1xyXG4gICAgLy8gTWFrZSBzdXJlIHRoZSBtb2RpZmllciB3ZSBoYXZlIGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiB0aGUgcmVuZGVyZWQgb25lLiAgSWYgdGhlcmUgaXMgb25seSBhIGNvcHkgaW4gdGhlIHNjb3JlXHJcbiAgICAvLyB3ZSB3aWxsIGhhdmUgaXQsIGJ1dCBpZiB0aGVyZSBhcmUgZGlmZmVyZW50IGNvcGllcyBiZXR3ZWVuIHBhcnQgYW5kIHNjb3JlLCB3ZSBuZWVkIHRvIHN5bmMgdXAuXHJcbiAgICBsZXQgZWxlbWVudEZvdW5kID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy52aWV3LmlzUGFydEV4cG9zZWQoKSkge1xyXG4gICAgICBjb25zdCB0ZyA9IHRoaXMudmlldy5zY29yZS5zdGF2ZXNbMF0ucGFydEluZm8udGV4dEdyb3Vwcy5maW5kKCh0Z3JvdXApID0+IHRncm91cC5hdHRycy5pZCA9PT0gdGhpcy5tb2RpZmllci5hdHRycy5pZCk7XHJcbiAgICAgIGlmICh0ZyAmJiB0Zy5lbGVtZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5tb2RpZmllci5lbGVtZW50cyA9IHRnLmVsZW1lbnRzO1xyXG4gICAgICAgIGVsZW1lbnRGb3VuZCA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgdGcyID0gdGhpcy52aWV3LnNjb3JlLnRleHRHcm91cHMuZmluZCgodGdyb3VwKSA9PiB0Z3JvdXAuYXR0cnMuaWQgPT09IHRoaXMubW9kaWZpZXIuYXR0cnMuaWQpO1xyXG4gICAgICAgIGlmICh0ZzIgJiYgdGcyLmVsZW1lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMubW9kaWZpZXIuZWxlbWVudHMgPSB0ZzIuZWxlbWVudHM7XHJcbiAgICAgICAgICBlbGVtZW50Rm91bmQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBoaWdobGlnaHRBY3RpdmVSZWdpb24oKSB7XHJcbiAgICBjb25zdCBwYWdlQ29udGV4dCA9IHRoaXMudmlldy5yZW5kZXJlci5wYWdlTWFwLmdldFJlbmRlcmVyRnJvbU1vZGlmaWVyKHRoaXMuYWN0aXZlU2NvcmVUZXh0KTtcclxuICAgIGNvbnN0IHN2ZyA9IHBhZ2VDb250ZXh0LnN2ZztcclxuICAgIGlmICh0aGlzLmFjdGl2ZVNjb3JlVGV4dC5sb2dpY2FsQm94KSB7XHJcbiAgICAgIGNvbnN0IHN0cm9rZSA9IFN1aVRleHRFZGl0b3Iuc3Ryb2tlc1sndGV4dC1oaWdobGlnaHQnXTtcclxuICAgICAgaWYgKCF0aGlzLm91dGxpbmVSZWN0KSB7XHJcbiAgICAgICAgdGhpcy5vdXRsaW5lUmVjdCA9IHtcclxuICAgICAgICAgIGNvbnRleHQ6IHBhZ2VDb250ZXh0LFxyXG4gICAgICAgICAgY2xhc3NlczogJycsXHJcbiAgICAgICAgICBzdHJva2UsXHJcbiAgICAgICAgICBib3g6IHRoaXMuYWN0aXZlU2NvcmVUZXh0LmxvZ2ljYWxCb3gsXHJcbiAgICAgICAgICBzY3JvbGw6IHRoaXMuc2Nyb2xsZXIuc2Nyb2xsU3RhdGUsXHJcbiAgICAgICAgICB0aW1lT2ZmOiAxMDAwXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICBTdmdIZWxwZXJzLmVyYXNlT3V0bGluZSh0aGlzLm91dGxpbmVSZWN0KTtcclxuICAgICAgdGhpcy5vdXRsaW5lUmVjdC5ib3ggPSB0aGlzLmFjdGl2ZVNjb3JlVGV4dC5sb2dpY2FsQm94O1xyXG4gICAgICBTdmdIZWxwZXJzLm91dGxpbmVSZWN0KHRoaXMub3V0bGluZVJlY3QpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyAjIyMgaGFuZGxlS2V5ZG93blxyXG4gIC8vIGFsbG93IGEgZGlhbG9nIHRvIGJlIGRpc21pc3NlZCBieSBlc2MuXHJcbiAgZXZLZXkoZXZkYXRhOiBhbnkpIHtcclxuICAgIGlmIChldmRhdGEua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAkKHRoaXMuZGdEb20uZWxlbWVudCkuZmluZCgnLmNhbmNlbC1idXR0b24nKS5jbGljaygpO1xyXG4gICAgICBldmRhdGEucHJldmVudERlZmF1bHQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudGV4dEVkaXRvckN0cmwuZXZLZXkoZXZkYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vICMjIyBFdmVudCBoYW5kbGVycywgcGFzc2VkIGZyb20gZGlhbG9nXHJcbiAgbW91c2VVcCgpIHtcclxuICAgIGlmICh0aGlzLnRleHREcmFnZ2VyQ3RybCAmJiB0aGlzLnRleHREcmFnZ2VyQ3RybC5ydW5uaW5nKSB7XHJcbiAgICAgIHRoaXMudGV4dERyYWdnZXJDdHJsLm1vdXNlVXAobnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3VzZU1vdmUoZXY6IGFueSkge1xyXG4gICAgaWYgKHRoaXMudGV4dERyYWdnZXJDdHJsICYmIHRoaXMudGV4dERyYWdnZXJDdHJsLnJ1bm5pbmcpIHtcclxuICAgICAgdGhpcy50ZXh0RHJhZ2dlckN0cmwubW91c2VNb3ZlKGV2KTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy50ZXh0RWRpdG9yQ3RybCAmJiB0aGlzLnRleHRFZGl0b3JDdHJsLmlzUnVubmluZykge1xyXG4gICAgICB0aGlzLnRleHRFZGl0b3JDdHJsLm1vdXNlTW92ZShldik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3VzZUNsaWNrKGV2OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnRleHRFZGl0b3JDdHJsICYmIHRoaXMudGV4dEVkaXRvckN0cmwuaXNSdW5uaW5nKSB7XHJcbiAgICAgIHRoaXMudGV4dEVkaXRvckN0cmwubW91c2VDbGljayhldik7XHJcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbW91c2VEb3duKGV2OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnRleHREcmFnZ2VyQ3RybCAmJiB0aGlzLnRleHREcmFnZ2VyQ3RybC5ydW5uaW5nKSB7XHJcbiAgICAgIHRoaXMudGV4dERyYWdnZXJDdHJsLm1vdXNlRG93bihldik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfY29tcGxldGUoKSB7XHJcbiAgICB0aGlzLnZpZXcuZ3JvdXBVbmRvKGZhbHNlKTtcclxuICAgIHRoaXMubW9kaWZpZXIuc2V0QWN0aXZlQmxvY2sobnVsbCk7XHJcbiAgICB0aGlzLnZpZXcudHJhY2tlci51cGRhdGVNYXAoKTsgLy8gdXBkYXRlIHRoZSB0ZXh0IG1hcFxyXG4gICAgdGhpcy52aWV3LnJlbmRlcmVyLnNldERpcnR5KCk7XHJcbiAgICBpZiAodGhpcy5tb3VzZURvd25IYW5kbGVyKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRTb3VyY2UudW5iaW5kTW91c2VEb3duSGFuZGxlcih0aGlzLm1vdXNlRG93bkhhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubW91c2VVcEhhbmRsZXIpIHtcclxuICAgICAgdGhpcy5ldmVudFNvdXJjZS51bmJpbmRNb3VzZVVwSGFuZGxlcih0aGlzLm1vdXNlVXBIYW5kbGVyKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1vdXNlTW92ZUhhbmRsZXIpIHtcclxuICAgICAgdGhpcy5ldmVudFNvdXJjZS51bmJpbmRNb3VzZU1vdmVIYW5kbGVyKHRoaXMubW91c2VNb3ZlSGFuZGxlcik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tb3VzZUNsaWNrSGFuZGxlcikge1xyXG4gICAgICB0aGlzLmV2ZW50U291cmNlLnVuYmluZE1vdXNlQ2xpY2tIYW5kbGVyKHRoaXMubW91c2VDbGlja0hhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3V0bGluZVJlY3QpIHtcclxuICAgICAgU3ZnSGVscGVycy5lcmFzZU91dGxpbmUodGhpcy5vdXRsaW5lUmVjdCk7XHJcbiAgICB9XHJcbiAgICAvLyBIYWNrIC0gdGhpcyBjb21lcyBmcm9tIFN1aUlubGluZVRleHQgYW5kIFN1aVRleHRFZGl0LlxyXG4gICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdzaG93QXR0cmlidXRlRGlhbG9nJyk7XHJcbiAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3RleHRFZGl0b3InKTtcclxuICAgIHRoaXMuY29tcGxldGUoKTtcclxuICB9XHJcbiAgX3JlbW92ZVRleHQoKSB7XHJcbiAgICAvLyBUaGUgbW9kaWZpZXIgcmVuZGVyZWQgaXMgZm9yIGVkaXQsIG5vdCB0aGUgb25lIGF0dGFjaGVkIHRvIHRoZSBzY29yZS4gc29cclxuICAgIC8vIHVucmVuZGVyIGl0IG5vd1xyXG4gICAgU3VpVGV4dEJsb2NrRGlhbG9nLnVucmVuZGVyVGV4dEdyb3VwKHRoaXMubW9kaWZpZXIpO1xyXG4gICAgdGhpcy52aWV3LnJlbW92ZVRleHRHcm91cCh0aGlzLm1vZGlmaWVyKTtcclxuICB9XHJcblxyXG4gIGJpbmRFbGVtZW50cygpIHtcclxuICAgIGNvbnN0IGRnRG9tID0gdGhpcy5kZ0RvbTtcclxuXHJcbiAgICAkKGRnRG9tLmVsZW1lbnQpLmZpbmQoJy5vay1idXR0b24nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBzdWJ0eXBlID0gdGhpcy5pc05ldyA/IFVuZG9CdWZmZXIuYnVmZmVyU3VidHlwZXMuQUREIDogVW5kb0J1ZmZlci5idWZmZXJTdWJ0eXBlcy5VUERBVEU7XHJcbiAgICAgIHRoaXMudmlldy51cGRhdGVUZXh0R3JvdXAodGhpcy5tb2RpZmllcik7XHJcbiAgICAgIHRoaXMuX2NvbXBsZXRlKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAkKGRnRG9tLmVsZW1lbnQpLmZpbmQoJy5jYW5jZWwtYnV0dG9uJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsICgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZWRpdGVkKSB7XHJcbiAgICAgICAgdGhpcy5tb2RpZmllci5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBFbGVtZW50TGlrZSkgPT4ge1xyXG4gICAgICAgICAgUmVtb3ZlRWxlbWVudExpa2UoZWxlbWVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5tb2RpZmllci5lbGVtZW50cyA9IFtdO1xyXG4gICAgICAgIHRoaXMudmlldy51bmRvKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fY29tcGxldGUoKTtcclxuICAgIH0pO1xyXG4gICAgJChkZ0RvbS5lbGVtZW50KS5maW5kKCcucmVtb3ZlLWJ1dHRvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCAoKSA9PiB7ICAgICAgXHJcbiAgICAgIHRoaXMuX3JlbW92ZVRleHQoKTtcclxuICAgICAgdGhpcy5fY29tcGxldGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIGhlbHBNb2RhbCB7XHJcbiAgc3RhdGljIGNyZWF0ZUFuZERpc3BsYXkoKSB7XHJcbiAgICBTdWlIZWxwLmRpc3BsYXlIZWxwKCk7XHJcbiAgICByZXR1cm4gY2xvc2VEaWFsb2dQcm9taXNlKCk7XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/dialogs/textBlock.ts\n\n}");
4170
4170
 
4171
4171
  /***/ },
4172
4172