smoosic 1.0.16 → 1.0.18

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
@@ -245,7 +245,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
245
245
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
246
246
 
247
247
  "use strict";
248
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScoreRoadMapBuilder: () => (/* binding */ ScoreRoadMapBuilder)\n/* harmony export */ });\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n\n/**\n * Builds and maintans a road map from repeats and other landmarks in a score.\n * Maintains an internal cursor into the current measure.\n * This object should be repopulated (or recreated) each time it is played because the\n * sections are consumed as the internal cursor advances.\n */\nclass ScoreRoadMapBuilder {\n static get defaultMap() {\n return {\n startMeasure: -1,\n endMeasure: -1,\n startReason: 'scoreStart',\n endReason: 'scoreEnd',\n ending: -1\n };\n }\n constructor(score) {\n this.jumpQueue = [];\n this.lastSkip = -1;\n this.measureTracker = 0;\n this.dcMeasure = -1;\n this.codaMeasure = -1;\n this.signMeasure = -1;\n this.dsMeasure = -1;\n this.fineMeasure = -1;\n this.toCodaMeasure = -1;\n this.score = score;\n }\n /**\n * Populate repeat landmarks e.g. coda\n */\n populateLandmarks() {\n const stave = this.score.staves[0];\n for (let i = 0; i < stave.measures.length; ++i) {\n const mm = stave.measures[i];\n if (mm.isToDc) {\n this.dcMeasure = i;\n }\n else if (mm.isToDs) {\n this.dsMeasure = i;\n }\n else if (mm.isCoda) {\n this.codaMeasure = i;\n }\n else if (mm.isSegno) {\n this.signMeasure = i;\n }\n else if (mm.isToCoda) {\n this.toCodaMeasure = i;\n }\n else if (mm.isFine) {\n this.fineMeasure = i;\n }\n }\n }\n /**\n * When populating DC/DS logic, gets the score segments between start and the landmark (coda, fine etc).\n * @param start\n * @param end\n * @param startReason\n * @returns\n */\n duplicateJumpsFromTo(start, end, startReason) {\n const rv = [];\n let started = false;\n for (let i = 0; i < this.jumpQueue.length; ++i) {\n const rm = this.jumpQueue[i];\n if (rm.endMeasure < start) {\n continue;\n }\n if (rm.startMeasure > end) {\n continue;\n }\n // If this section fits fully within the section, just copy it\n // adjusting start if required\n if (rm.startMeasure >= start && rm.endMeasure < end) {\n const sm = started ? rm.startMeasure : start;\n const sr = started ? rm.startReason : startReason;\n started = true;\n const nrm = {\n startMeasure: sm,\n endMeasure: rm.endMeasure,\n startReason: sr,\n endReason: rm.endReason,\n ending: rm.ending\n };\n rv.push(nrm);\n }\n else if (rm.startMeasure >= start && rm.endMeasure >= end) {\n // if this section ends after the requested end, copy part of it\n // and then exit since we've reached the end\n rv.push({\n startMeasure: rm.startMeasure,\n endMeasure: end,\n startReason: rm.startReason,\n endReason: rm.endReason,\n ending: rm.ending\n });\n break;\n }\n }\n return rv;\n }\n /**\n * Internal function to find the voltas before/after a repeat\n * @param startMeasure\n * @param endMeasure\n * @returns\n */\n findVoltaBetween(startMeasure, endMeasure) {\n const rv = [];\n const stave = this.score.staves[0];\n const voltas = stave.getVoltaMap(startMeasure, endMeasure);\n voltas.forEach((volta) => {\n // this is our first ending.\n if (volta.endBar === endMeasure) {\n rv.push(volta);\n // get any nth ending starting in bar n+1\n const nvolta = stave.getVoltasForMeasure(endMeasure + 1);\n while (nvolta.length > 0) {\n const vv = nvolta.pop();\n if ((vv === null || vv === void 0 ? void 0 : vv.startBar) === endMeasure + 1) {\n rv.push(vv);\n nvolta.splice(0);\n // Clear the array and get any voltas at the end of this volta.\n endMeasure = vv.endBar;\n stave.getVoltasForMeasure(endMeasure + 1).forEach((nv) => {\n nvolta.push(nv);\n });\n }\n }\n }\n });\n return rv;\n }\n /**\n * Gets the next measure in the score, including repeats etc. And advances the internal\n * cursor\n * @returns\n */\n getAndAdvance() {\n if (this.jumpQueue.length < 1) {\n return -1;\n }\n // Return the current measure\n const rv = this.measureTracker;\n // Advance the measure for next time.\n const top = this.jumpQueue[0];\n // If this is the end of the current road map, go to the next one\n // if it exists\n if (top.endMeasure <= this.measureTracker) {\n console.log(`mm ${this.measureTracker}: done with jump ${this.jumpQueue.length}`);\n this.jumpQueue.shift();\n if (this.jumpQueue.length) {\n this.measureTracker = this.jumpQueue[0].startMeasure;\n }\n }\n else {\n // else just advance to the next measure\n this.measureTracker += 1;\n }\n return rv;\n }\n /**\n * Returns true if all the score measures have been played\n *\n * @readonly\n * @memberof ScoreRoadMapBuilder\n */\n get isDone() {\n return this.jumpQueue.length < 1;\n }\n populateRange(startMeasure, endMeasure, currentJump) {\n let skipTo = -1;\n for (let i = startMeasure; i < endMeasure; ++i) {\n if (skipTo > i) {\n continue;\n }\n const mm = this.score.staves[0].measures[i];\n // If this is a start repeat, keep track of it as the repeat destination\n if (mm.getStartBarline().barline === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_0__.SmoBarline.barlines['startRepeat']) {\n this.lastSkip = i;\n }\n // End repeat. Handle voltas\n if (mm.getEndBarline().barline === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_0__.SmoBarline.barlines['endRepeat'] &&\n this.lastSkip >= 0) {\n currentJump.endMeasure = i;\n currentJump.endReason = 'endRepeat';\n // Create a new skip from start repeat to here.\n currentJump = {\n startMeasure: this.lastSkip,\n endMeasure: i,\n startReason: 'startRepeat',\n endReason: 'endRepeat',\n ending: -1\n };\n this.jumpQueue.push(currentJump);\n // Get any voltas on or after this repeat\n const voltas = this.findVoltaBetween(this.lastSkip, i);\n // The first ending we've already played, so skip that\n if (voltas.length) {\n const firstEnding = voltas[0];\n currentJump.endMeasure = firstEnding.startBar - 1;\n currentJump.endReason = 'Volta';\n voltas.shift();\n let sanity = 0;\n // For 2nd+ ending, play the ending. Sanity is in case the voltas\n // overlap in some weird way and we can't figure out where they go.\n while (voltas.length && sanity < 20) {\n sanity += 1;\n const volta = voltas[0];\n currentJump = {\n startMeasure: volta.startBar,\n endMeasure: volta.endBar,\n startReason: 'Volta',\n endReason: 'Volta',\n ending: volta.number\n };\n this.jumpQueue.push(currentJump);\n voltas.shift();\n // If there are more than 2, do more repeats\n if (voltas.length) {\n currentJump = {\n startMeasure: this.lastSkip,\n endMeasure: firstEnding.startBar,\n startReason: 'startRepeat',\n endReason: 'Volta',\n ending: volta.number\n };\n this.jumpQueue.push(currentJump);\n }\n }\n }\n // Done with repeats and voltas. Continue with the score from after the last volta\n skipTo = currentJump.endMeasure + 1;\n this.lastSkip = skipTo;\n currentJump = {\n startMeasure: skipTo,\n endMeasure,\n startReason: 'startRepeat',\n endReason: 'scoreEnd',\n ending: -1\n };\n this.jumpQueue.push(currentJump);\n }\n }\n }\n /**\n * Populate the jump queue of sections of the score, starting\n * at the given measure. This should be called before calling\n * getAndAdvance the first time.\n * @param startMeasure\n */\n populate(startMeasure) {\n this.populateLandmarks();\n const stave = this.score.staves[0];\n this.jumpQueue.splice(0);\n this.lastSkip = 0;\n // assume we are playing the full score\n let endMeasure = stave.measures.length - 1;\n if (this.dcMeasure > 0) {\n endMeasure = this.dcMeasure;\n }\n else if (this.dsMeasure > 0) {\n endMeasure = this.dsMeasure;\n }\n let endReason = 'scoreEnd';\n if (this.dcMeasure > 0 || this.dsMeasure > 0) {\n endReason = 'Coda';\n }\n this.jumpQueue.push({\n startMeasure: 0,\n endMeasure,\n startReason: 'scoreStart',\n endReason,\n ending: -1\n });\n let currentJump = this.jumpQueue[0];\n this.populateRange(0, endMeasure, currentJump);\n const last = this.jumpQueue.length - 1;\n // handle dc al coda, etc.\n endMeasure = stave.measures.length - 1;\n endReason = 'scoreEnd';\n if (this.fineMeasure > 0) {\n endMeasure = this.fineMeasure;\n }\n else if (this.toCodaMeasure > 0) {\n endMeasure = this.toCodaMeasure;\n }\n // Handle DC\n if (this.dcMeasure >= 0) {\n const dcMeasures = this.duplicateJumpsFromTo(0, endMeasure, 'DC');\n this.jumpQueue = this.jumpQueue.concat(dcMeasures);\n this.jumpQueue[last].endReason = 'Coda';\n if (this.codaMeasure > this.dcMeasure) {\n currentJump = {\n startMeasure: this.codaMeasure,\n endMeasure,\n startReason: 'DC',\n endReason: 'scoreEnd',\n ending: -1\n };\n this.jumpQueue.push(currentJump);\n this.populateRange(this.dcMeasure, stave.measures.length - 1, currentJump);\n }\n }\n else if (this.dsMeasure >= 0 && this.signMeasure > 0 && this.signMeasure < this.dsMeasure) {\n // Only to DS if the sign is present and it's location makes sense\n const dcMeasures = this.duplicateJumpsFromTo(this.signMeasure, endMeasure, 'DS');\n this.jumpQueue = this.jumpQueue.concat(dcMeasures);\n this.jumpQueue[last].endReason = 'Coda';\n if (this.codaMeasure > this.dsMeasure) {\n currentJump = {\n startMeasure: this.codaMeasure,\n endMeasure,\n startReason: 'DS',\n endReason: 'scoreEnd',\n ending: -1\n };\n this.jumpQueue.push(currentJump);\n this.populateRange(this.dsMeasure, stave.measures.length - 1, currentJump);\n }\n }\n // If we are starting from somewhere other than the beginning, remove everything before the \n // cursor and set the start measure of the last block to startMeasure\n let toRemove = 0;\n for (let j = 0; j < this.jumpQueue.length; ++j) {\n const roadmap = this.jumpQueue[j];\n if (startMeasure > roadmap.endMeasure) {\n toRemove += 1;\n }\n }\n this.jumpQueue.splice(0, toRemove);\n if (this.jumpQueue.length) {\n this.measureTracker = startMeasure;\n this.jumpQueue[0].startMeasure = startMeasure;\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QU0sRUFBRSxDQUFDLENBQUM7aUJBQ1gsQ0FBQztnQkFDRixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBQ0gsQ0FBQztRQUNELDRGQUE0RjtRQUM1RixxRUFBcUU7UUFDckUsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsSUFBSSxZQUFZLEdBQUcsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN0QyxRQUFRLElBQUksQ0FBQyxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLFlBQVksQ0FBQztZQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXMiOlsid2VicGFjazovL1Ntby8uL3NyYy9yZW5kZXIvYXVkaW8vcm9hZG1hcC50cz80OWY0Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNtb1Njb3JlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc2NvcmUnO1xyXG5pbXBvcnQgeyBTbW9Wb2x0YSwgU21vQmFybGluZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL21lYXN1cmVNb2RpZmllcnMnO1xyXG5cclxuZXhwb3J0IHR5cGUgcGxheWVyU3RhcnRSZWFzb24gPSAnc2NvcmVTdGFydCcgfCdzdGFydFJlcGVhdCcgfCAnREMnIHwgICdEUycgfCAnVm9sdGEnO1xyXG5leHBvcnQgdHlwZSBwbGF5ZXJFbmRSZWFzb24gPSAnc2NvcmVTdGFydCcgfCAnc2NvcmVFbmQnIHwgJ2VuZFJlcGVhdCcgfCAnQ29kYScgfCAnU2Vnbm8nIHwgJ1ZvbHRhJztcclxuZXhwb3J0IGludGVyZmFjZSBTY29yZVNlZ21lbnQge1xyXG4gIHN0YXJ0TWVhc3VyZTogbnVtYmVyLFxyXG4gIGVuZE1lYXN1cmU6IG51bWJlcixcclxuICBzdGFydFJlYXNvbjogcGxheWVyU3RhcnRSZWFzb24sXHJcbiAgZW5kUmVhc29uOiBwbGF5ZXJFbmRSZWFzb24sXHJcbiAgZW5kaW5nOiBudW1iZXJcclxufVxyXG4vKipcclxuICogQnVpbGRzIGFuZCBtYWludGFucyBhIHJvYWQgbWFwIGZyb20gcmVwZWF0cyBhbmQgb3RoZXIgbGFuZG1hcmtzIGluIGEgc2NvcmUuXHJcbiAqIE1haW50YWlucyBhbiBpbnRlcm5hbCBjdXJzb3IgaW50byB0aGUgY3VycmVudCBtZWFzdXJlLlxyXG4gKiBUaGlzIG9iamVjdCBzaG91bGQgYmUgcmVwb3B1bGF0ZWQgKG9yIHJlY3JlYXRlZCkgZWFjaCB0aW1lIGl0IGlzIHBsYXllZCBiZWNhdXNlIHRoZSBcclxuICogc2VjdGlvbnMgYXJlIGNvbnN1bWVkIGFzIHRoZSBpbnRlcm5hbCBjdXJzb3IgYWR2YW5jZXMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU2NvcmVSb2FkTWFwQnVpbGRlciB7XHJcbiAganVtcFF1ZXVlOiBTY29yZVNlZ21lbnRbXSA9IFtdO1xyXG4gIGxhc3RTa2lwOiBudW1iZXIgPSAtMVxyXG4gIHNjb3JlOiBTbW9TY29yZTtcclxuICBtZWFzdXJlVHJhY2tlcjogbnVtYmVyID0gMDtcclxuICBkY01lYXN1cmU6IG51bWJlciA9IC0xO1xyXG4gIGNvZGFNZWFzdXJlOiBudW1iZXIgPSAtMTtcclxuICBzaWduTWVhc3VyZTogbnVtYmVyID0gLTE7XHJcbiAgZHNNZWFzdXJlOiBudW1iZXIgPSAtMTtcclxuICBmaW5lTWVhc3VyZTogbnVtYmVyID0gLTE7XHJcbiAgdG9Db2RhTWVhc3VyZTogbnVtYmVyID0gLTE7XHJcbiAgc3RhdGljIGdldCBkZWZhdWx0TWFwKCk6U2NvcmVTZWdtZW50IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0YXJ0TWVhc3VyZTogLTEsXHJcbiAgICAgIGVuZE1lYXN1cmU6IC0xLFxyXG4gICAgICBzdGFydFJlYXNvbjogJ3Njb3JlU3RhcnQnLFxyXG4gICAgICBlbmRSZWFzb246ICdzY29yZUVuZCcsXHJcbiAgICAgIGVuZGluZzogLTFcclxuICAgIH1cclxuICB9XHJcbiAgY29uc3RydWN0b3Ioc2NvcmU6IFNtb1Njb3JlKSB7XHJcbiAgICB0aGlzLnNjb3JlID0gc2NvcmU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQb3B1bGF0ZSByZXBlYXQgbGFuZG1hcmtzIGUuZy4gY29kYVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcG9wdWxhdGVMYW5kbWFya3MoKSB7XHJcbiAgICBjb25zdCBzdGF2ZSA9IHRoaXMuc2NvcmUuc3RhdmVzWzBdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF2ZS5tZWFzdXJlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBtbSA9IHN0YXZlLm1lYXN1cmVzW2ldO1xyXG4gICAgICBpZiAobW0uaXNUb0RjKSB7XHJcbiAgICAgICAgdGhpcy5kY01lYXN1cmUgPSBpO1xyXG4gICAgICB9IGVsc2UgaWYgKG1tLmlzVG9Ecykge1xyXG4gICAgICAgIHRoaXMuZHNNZWFzdXJlID0gaTtcclxuICAgICAgfSBlbHNlIGlmIChtbS5pc0NvZGEpIHtcclxuICAgICAgICB0aGlzLmNvZGFNZWFzdXJlID0gaTtcclxuICAgICAgfSBlbHNlIGlmIChtbS5pc1NlZ25vKSB7XHJcbiAgICAgICAgdGhpcy5zaWduTWVhc3VyZSA9IGk7XHJcbiAgICAgIH0gZWxzZSBpZiAobW0uaXNUb0NvZGEpIHtcclxuICAgICAgICB0aGlzLnRvQ29kYU1lYXN1cmUgPSBpO1xyXG4gICAgICB9IGVsc2UgaWYgKG1tLmlzRmluZSkge1xyXG4gICAgICAgIHRoaXMuZmluZU1lYXN1cmUgPSBpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIHBvcHVsYXRpbmcgREMvRFMgbG9naWMsIGdldHMgdGhlIHNjb3JlIHNlZ21lbnRzIGJldHdlZW4gc3RhcnQgYW5kIHRoZSBsYW5kbWFyayAoY29kYSwgZmluZSBldGMpLlxyXG4gICAqIEBwYXJhbSBzdGFydCBcclxuICAgKiBAcGFyYW0gZW5kIFxyXG4gICAqIEBwYXJhbSBzdGFydFJlYXNvbiBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBwcml2YXRlIGR1cGxpY2F0ZUp1bXBzRnJvbVRvKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBzdGFydFJlYXNvbjogcGxheWVyU3RhcnRSZWFzb24pOiBTY29yZVNlZ21lbnRbXSB7XHJcbiAgICBjb25zdCBydjogU2NvcmVTZWdtZW50W10gPSBbXTtcclxuICAgIGxldCBzdGFydGVkID0gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuanVtcFF1ZXVlLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHJtID0gdGhpcy5qdW1wUXVldWVbaV07XHJcbiAgICAgIGlmIChybS5lbmRNZWFzdXJlIDwgc3RhcnQpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocm0uc3RhcnRNZWFzdXJlID4gZW5kKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgLy8gSWYgdGhpcyBzZWN0aW9uIGZpdHMgZnVsbHkgd2l0aGluIHRoZSBzZWN0aW9uLCBqdXN0IGNvcHkgaXRcclxuICAgICAgLy8gYWRqdXN0aW5nIHN0YXJ0IGlmIHJlcXVpcmVkXHJcbiAgICAgIGlmIChybS5zdGFydE1lYXN1cmUgPj0gc3RhcnQgJiYgcm0uZW5kTWVhc3VyZSA8IGVuZCkge1xyXG4gICAgICAgIGNvbnN0IHNtID0gc3RhcnRlZCA/IHJtLnN0YXJ0TWVhc3VyZSA6IHN0YXJ0O1xyXG4gICAgICAgIGNvbnN0IHNyID0gc3RhcnRlZCA/IHJtLnN0YXJ0UmVhc29uIDogc3RhcnRSZWFzb247XHJcbiAgICAgICAgc3RhcnRlZCA9IHRydWU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgbnJtOiBTY29yZVNlZ21lbnQgPSB7XHJcbiAgICAgICAgICBzdGFydE1lYXN1cmU6IHNtLFxyXG4gICAgICAgICAgZW5kTWVhc3VyZTogcm0uZW5kTWVhc3VyZSxcclxuICAgICAgICAgIHN0YXJ0UmVhc29uIDogc3IsXHJcbiAgICAgICAgICBlbmRSZWFzb24gOiBybS5lbmRSZWFzb24sXHJcbiAgICAgICAgICBlbmRpbmc6IHJtLmVuZGluZ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcnYucHVzaChucm0pXHJcbiAgICAgIH0gZWxzZSBpZiAocm0uc3RhcnRNZWFzdXJlID49IHN0YXJ0ICYmIHJtLmVuZE1lYXN1cmUgPj0gZW5kKSB7XHJcbiAgICAgICAgLy8gaWYgdGhpcyBzZWN0aW9uIGVuZHMgYWZ0ZXIgdGhlIHJlcXVlc3RlZCBlbmQsIGNvcHkgcGFydCBvZiBpdFxyXG4gICAgICAgIC8vIGFuZCB0aGVuIGV4aXQgc2luY2Ugd2UndmUgcmVhY2hlZCB0aGUgZW5kXHJcbiAgICAgICAgcnYucHVzaCh7XHJcbiAgICAgICAgICBzdGFydE1lYXN1cmU6IHJtLnN0YXJ0TWVhc3VyZSxcclxuICAgICAgICAgIGVuZE1lYXN1cmU6IGVuZCxcclxuICAgICAgICAgIHN0YXJ0UmVhc29uOiBybS5zdGFydFJlYXNvbixcclxuICAgICAgICAgIGVuZFJlYXNvbjogcm0uZW5kUmVhc29uLFxyXG4gICAgICAgICAgZW5kaW5nOiBybS5lbmRpbmdcclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZmluZCB0aGUgdm9sdGFzIGJlZm9yZS9hZnRlciBhIHJlcGVhdFxyXG4gICAqIEBwYXJhbSBzdGFydE1lYXN1cmUgXHJcbiAgICogQHBhcmFtIGVuZE1lYXN1cmUgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmaW5kVm9sdGFCZXR3ZWVuKHN0YXJ0TWVhc3VyZTogbnVtYmVyLCBlbmRNZWFzdXJlOiBudW1iZXIpOlNtb1ZvbHRhW10ge1xyXG4gICAgY29uc3QgcnY6IFNtb1ZvbHRhW10gPSBbXTtcclxuICAgIGNvbnN0IHN0YXZlID0gdGhpcy5zY29yZS5zdGF2ZXNbMF07XHJcbiAgICBjb25zdCB2b2x0YXMgPSBzdGF2ZS5nZXRWb2x0YU1hcChzdGFydE1lYXN1cmUsIGVuZE1lYXN1cmUpO1xyXG4gICAgdm9sdGFzLmZvckVhY2goKHZvbHRhKSA9PiB7XHJcbiAgICAgIC8vIHRoaXMgaXMgb3VyIGZpcnN0IGVuZGluZy5cclxuICAgICAgaWYgKHZvbHRhLmVuZEJhciA9PT0gZW5kTWVhc3VyZSkge1xyXG4gICAgICAgIHJ2LnB1c2godm9sdGEpO1xyXG4gICAgICAgIC8vIGdldCBhbnkgbnRoIGVuZGluZyBzdGFydGluZyBpbiBiYXIgbisxXHJcbiAgICAgICAgY29uc3QgbnZvbHRhID0gc3RhdmUuZ2V0Vm9sdGFzRm9yTWVhc3VyZShlbmRNZWFzdXJlICsgMSk7XHJcbiAgICAgICAgd2hpbGUgKG52b2x0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCB2diA9IG52b2x0YS5wb3AoKTtcclxuICAgICAgICAgIGlmICh2dj8uc3RhcnRCYXIgPT09IGVuZE1lYXN1cmUgKyAxKSB7XHJcbiAgICAgICAgICAgIHJ2LnB1c2godnYpO1xyXG4gICAgICAgICAgICBudm9sdGEuc3BsaWNlKDApO1xyXG4gICAgICAgICAgICAvLyBDbGVhciB0aGUgYXJyYXkgYW5kIGdldCBhbnkgdm9sdGFzIGF0IHRoZSBlbmQgb2YgdGhpcyB2b2x0YS5cclxuICAgICAgICAgICAgZW5kTWVhc3VyZSA9IHZ2LmVuZEJhcjtcclxuICAgICAgICAgICAgc3RhdmUuZ2V0Vm9sdGFzRm9yTWVhc3VyZShlbmRNZWFzdXJlICsgMSkuZm9yRWFjaCgobnYpID0+IHtcclxuICAgICAgICAgICAgICBudm9sdGEucHVzaChudik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIG5leHQgbWVhc3VyZSBpbiB0aGUgc2NvcmUsIGluY2x1ZGluZyByZXBlYXRzIGV0Yy4gIEFuZCBhZHZhbmNlcyB0aGUgaW50ZXJuYWxcclxuICAgKiBjdXJzb3JcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBnZXRBbmRBZHZhbmNlKCkge1xyXG4gICAgaWYgKHRoaXMuanVtcFF1ZXVlLmxlbmd0aCA8IDEpIHtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG4gICAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IG1lYXN1cmVcclxuICAgIGNvbnN0IHJ2ID0gdGhpcy5tZWFzdXJlVHJhY2tlcjtcclxuICAgIC8vIEFkdmFuY2UgdGhlIG1lYXN1cmUgZm9yIG5leHQgdGltZS5cclxuICAgIGNvbnN0IHRvcCA9IHRoaXMuanVtcFF1ZXVlWzBdO1xyXG4gICAgLy8gSWYgdGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJvYWQgbWFwLCBnbyB0byB0aGUgbmV4dCBvbmVcclxuICAgIC8vIGlmIGl0IGV4aXN0c1xyXG4gICAgaWYgKHRvcC5lbmRNZWFzdXJlIDw9IHRoaXMubWVhc3VyZVRyYWNrZXIpIHtcclxuICAgICAgY29uc29sZS5sb2coYG1tICR7dGhpcy5tZWFzdXJlVHJhY2tlcn06IGRvbmUgd2l0aCBqdW1wICR7dGhpcy5qdW1wUXVldWUubGVuZ3RofWApO1xyXG4gICAgICB0aGlzLmp1bXBRdWV1ZS5zaGlmdCgpO1xyXG4gICAgICBpZiAodGhpcy5qdW1wUXVldWUubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5tZWFzdXJlVHJhY2tlciA9IHRoaXMuanVtcFF1ZXVlWzBdLnN0YXJ0TWVhc3VyZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gZWxzZSBqdXN0IGFkdmFuY2UgdG8gdGhlIG5leHQgbWVhc3VyZVxyXG4gICAgICB0aGlzLm1lYXN1cmVUcmFja2VyICs9IDE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnY7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgdGhlIHNjb3JlIG1lYXN1cmVzIGhhdmUgYmVlbiBwbGF5ZWRcclxuICAgKlxyXG4gICAqIEByZWFkb25seVxyXG4gICAqIEBtZW1iZXJvZiBTY29yZVJvYWRNYXBCdWlsZGVyXHJcbiAgICovXHJcbiAgZ2V0IGlzRG9uZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmp1bXBRdWV1ZS5sZW5ndGggPCAxO1xyXG4gIH1cclxuICBwcml2YXRlIHBvcHVsYXRlUmFuZ2Uoc3RhcnRNZWFzdXJlOiBudW1iZXIsIGVuZE1lYXN1cmU6IG51bWJlcixcclxuICAgIGN1cnJlbnRKdW1wOiBTY29yZVNlZ21lbnRcclxuICApIHtcclxuICAgICBsZXQgc2tpcFRvID0gLTE7XHJcbiAgICBmb3IgKGxldCBpID0gc3RhcnRNZWFzdXJlOyBpIDwgZW5kTWVhc3VyZTsgKytpKSB7XHJcbiAgICAgIGlmIChza2lwVG8gPiBpKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbW0gPSB0aGlzLnNjb3JlLnN0YXZlc1swXS5tZWFzdXJlc1tpXTtcclxuICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0YXJ0IHJlcGVhdCwga2VlcCB0cmFjayBvZiBpdCBhcyB0aGUgcmVwZWF0IGRlc3RpbmF0aW9uXHJcbiAgICAgIGlmIChtbS5nZXRTdGFydEJhcmxpbmUoKS5iYXJsaW5lID09PSBTbW9CYXJsaW5lLmJhcmxpbmVzWydzdGFydFJlcGVhdCddKSB7XHJcbiAgICAgICAgdGhpcy5sYXN0U2tpcCA9IGk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gRW5kIHJlcGVhdC4gIEhhbmRsZSB2b2x0YXNcclxuICAgICAgaWYgKG1tLmdldEVuZEJhcmxpbmUoKS5iYXJsaW5lID09PSBTbW9CYXJsaW5lLmJhcmxpbmVzWydlbmRSZXBlYXQnXSAmJlxyXG4gICAgICAgdGhpcy5sYXN0U2tpcCA+PSAwKSB7XHJcbiAgICAgICAgY3VycmVudEp1bXAuZW5kTWVhc3VyZSA9IGk7XHJcbiAgICAgICAgY3VycmVudEp1bXAuZW5kUmVhc29uID0gJ2VuZFJlcGVhdCc7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNraXAgZnJvbSBzdGFydCByZXBlYXQgdG8gaGVyZS5cclxuICAgICAgICBjdXJyZW50SnVtcCA9IHtcclxuICAgICAgICAgICAgc3RhcnRNZWFzdXJlOiB0aGlzLmxhc3RTa2lwLFxyXG4gICAgICAgICAgICBlbmRNZWFzdXJlOiBpLFxyXG4gICAgICAgICAgICBzdGFydFJlYXNvbjogJ3N0YXJ0UmVwZWF0JyxcclxuICAgICAgICAgICAgZW5kUmVhc29uOiAnZW5kUmVwZWF0JyxcclxuICAgICAgICAgICAgZW5kaW5nOiAtMVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5qdW1wUXVldWUucHVzaChjdXJyZW50SnVtcCk7XHJcbiAgICAgICAgLy8gR2V0IGFueSB2b2x0YXMgb24gb3IgYWZ0ZXIgdGhpcyByZXBlYXRcclxuICAgICAgICBjb25zdCB2b2x0YXMgPSB0aGlzLmZpbmRWb2x0YUJldHdlZW4odGhpcy5sYXN0U2tpcCwgaSk7XHJcbiAgICAgICAgLy8gVGhlIGZpcnN0IGVuZGluZyB3ZSd2ZSBhbHJlYWR5IHBsYXllZCwgc28gc2tpcCB0aGF0XHJcbiAgICAgICAgaWYgKHZvbHRhcy5sZW5ndGgpIHtcclxuICAgICAgICAgIGNvbnN0IGZpcnN0RW5kaW5nID0gdm9sdGFzWzBdO1xyXG4gICAgICAgICAgY3VycmVudEp1bXAuZW5kTWVhc3VyZSA9IGZpcnN0RW5kaW5nLnN0YXJ0QmFyIC0gMTtcclxuICAgICAgICAgIGN1cnJlbnRKdW1wLmVuZFJlYXNvbiA9ICdWb2x0YSc7XHJcbiAgICAgICAgICB2b2x0YXMuc2hpZnQoKTtcclxuICAgICAgICAgIGxldCBzYW5pdHkgPSAwO1xyXG4gICAgICAgICAgLy8gRm9yIDJuZCsgZW5kaW5nLCBwbGF5IHRoZSBlbmRpbmcuICBTYW5pdHkgaXMgaW4gY2FzZSB0aGUgdm9sdGFzXHJcbiAgICAgICAgICAvLyBvdmVybGFwIGluIHNvbWUgd2VpcmQgd2F5IGFuZCB3ZSBjYW4ndCBmaWd1cmUgb3V0IHdoZXJlIHRoZXkgZ28uXHJcbiAgICAgICAgICB3aGlsZSAodm9sdGFzLmxlbmd0aCAmJiBzYW5pdHkgPCAyMCkge1xyXG4gICAgICAgICAgICBzYW5pdHkgKz0gMTtcclxuICAgICAgICAgICAgY29uc3Qgdm9sdGEgPSB2b2x0YXNbMF07XHJcbiAgICAgICAgICAgIGN1cnJlbnRKdW1wID0ge1xyXG4gICAgICAgICAgICAgIHN0YXJ0TWVhc3VyZTogdm9sdGEuc3RhcnRCYXIsXHJcbiAgICAgICAgICAgICAgZW5kTWVhc3VyZTogdm9sdGEuZW5kQmFyLFxyXG4gICAgICAgICAgICAgIHN0YXJ0UmVhc29uOiAnVm9sdGEnLFxyXG4gICAgICAgICAgICAgIGVuZFJlYXNvbjogJ1ZvbHRhJyxcclxuICAgICAgICAgICAgICBlbmRpbmc6IHZvbHRhLm51bWJlclxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmp1bXBRdWV1ZS5wdXNoKGN1cnJlbnRKdW1wKTtcclxuICAgICAgICAgICAgdm9sdGFzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMiwgZG8gbW9yZSByZXBlYXRzXHJcbiAgICAgICAgICAgIGlmICh2b2x0YXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgY3VycmVudEp1bXAgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydE1lYXN1cmU6IHRoaXMubGFzdFNraXAsXHJcbiAgICAgICAgICAgICAgICBlbmRNZWFzdXJlOiBmaXJzdEVuZGluZy5zdGFydEJhcixcclxuICAgICAgICAgICAgICAgIHN0YXJ0UmVhc29uOiAnc3RhcnRSZXBlYXQnLFxyXG4gICAgICAgICAgICAgICAgZW5kUmVhc29uOiAnVm9sdGEnLFxyXG4gICAgICAgICAgICAgICAgZW5kaW5nOiB2b2x0YS5udW1iZXJcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIHRoaXMuanVtcFF1ZXVlLnB1c2goY3VycmVudEp1bXApO1xyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBEb25lIHdpdGggcmVwZWF0cyBhbmQgdm9sdGFzLiAgQ29udGludWUgd2l0aCB0aGUgc2NvcmUgZnJvbSBhZnRlciB0aGUgbGFzdCB2b2x0YVxyXG4gICAgICAgIHNraXBUbyA9IGN1cnJlbnRKdW1wLmVuZE1lYXN1cmUgKyAxO1xyXG4gICAgICAgIHRoaXMubGFzdFNraXAgPSBza2lwVG87XHJcbiAgICAgICAgY3VycmVudEp1bXAgPSB7XHJcbiAgICAgICAgICBzdGFydE1lYXN1cmU6IHNraXBUbyxcclxuICAgICAgICAgIGVuZE1lYXN1cmUsXHJcbiAgICAgICAgICBzdGFydFJlYXNvbjogJ3N0YXJ0UmVwZWF0JyxcclxuICAgICAgICAgIGVuZFJlYXNvbjogJ3Njb3JlRW5kJyxcclxuICAgICAgICAgIGVuZGluZzogLTFcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5qdW1wUXVldWUucHVzaChjdXJyZW50SnVtcCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogUG9wdWxhdGUgdGhlIGp1bXAgcXVldWUgb2Ygc2VjdGlvbnMgb2YgdGhlIHNjb3JlLCBzdGFydGluZ1xyXG4gICAqIGF0IHRoZSBnaXZlbiBtZWFzdXJlLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIFxyXG4gICAqIGdldEFuZEFkdmFuY2UgdGhlIGZpcnN0IHRpbWUuXHJcbiAgICogQHBhcmFtIHN0YXJ0TWVhc3VyZSBcclxuICAgKi9cclxuICBwb3B1bGF0ZShzdGFydE1lYXN1cmU6IG51bWJlcikge1xyXG4gICAgdGhpcy5wb3B1bGF0ZUxhbmRtYXJrcygpO1xyXG4gICAgY29uc3Qgc3RhdmUgPSB0aGlzLnNjb3JlLnN0YXZlc1swXTtcclxuICAgIHRoaXMuanVtcFF1ZXVlLnNwbGljZSgwKTtcclxuICAgIHRoaXMubGFzdFNraXAgPSAwO1xyXG4gICAgLy8gYXNzdW1lIHdlIGFyZSBwbGF5aW5nIHRoZSBmdWxsIHNjb3JlXHJcbiAgICBsZXQgZW5kTWVhc3VyZSA9IHN0YXZlLm1lYXN1cmVzLmxlbmd0aCAtIDE7XHJcbiAgICBpZiAodGhpcy5kY01lYXN1cmUgPiAwKSB7XHJcbiAgICAgIGVuZE1lYXN1cmUgPSB0aGlzLmRjTWVhc3VyZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5kc01lYXN1cmUgPiAwKSB7XHJcbiAgICAgIGVuZE1lYXN1cmUgPSB0aGlzLmRzTWVhc3VyZTtcclxuICAgIH1cclxuICAgIGxldCBlbmRSZWFzb246cGxheWVyRW5kUmVhc29uID0gJ3Njb3JlRW5kJztcclxuICAgIGlmICh0aGlzLmRjTWVhc3VyZSA+IDAgfHwgdGhpcy5kc01lYXN1cmUgPiAwKSB7XHJcbiAgICAgIGVuZFJlYXNvbiA9ICdDb2RhJztcclxuICAgIH1cclxuICAgIHRoaXMuanVtcFF1ZXVlLnB1c2goe1xyXG4gICAgICBzdGFydE1lYXN1cmU6IDAsXHJcbiAgICAgIGVuZE1lYXN1cmUsXHJcbiAgICAgIHN0YXJ0UmVhc29uOiAnc2NvcmVTdGFydCcsXHJcbiAgICAgIGVuZFJlYXNvbixcclxuICAgICAgZW5kaW5nOiAtMVxyXG4gICAgfSk7ICAgIFxyXG4gICAgbGV0IGN1cnJlbnRKdW1wID0gdGhpcy5qdW1wUXVldWVbMF07XHJcbiAgICB0aGlzLnBvcHVsYXRlUmFuZ2UoMCwgZW5kTWVhc3VyZSwgY3VycmVudEp1bXApXHJcbiAgICBcclxuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmp1bXBRdWV1ZS5sZW5ndGggLSAxO1xyXG4gICAgLy8gaGFuZGxlIGRjIGFsIGNvZGEsIGV0Yy5cclxuICAgIGVuZE1lYXN1cmUgPSBzdGF2ZS5tZWFzdXJlcy5sZW5ndGggLSAxO1xyXG4gICAgZW5kUmVhc29uID0gJ3Njb3JlRW5kJztcclxuICAgIGlmICh0aGlzLmZpbmVNZWFzdXJlID4gMCkge1xyXG4gICAgICBlbmRNZWFzdXJlID0gdGhpcy5maW5lTWVhc3VyZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMudG9Db2RhTWVhc3VyZSA+IDApIHtcclxuICAgICAgZW5kTWVhc3VyZSA9IHRoaXMudG9Db2RhTWVhc3VyZTtcclxuICAgIH1cclxuICAgIC8vIEhhbmRsZSBEQ1xyXG4gICAgaWYgKHRoaXMuZGNNZWFzdXJlID49IDApIHtcclxuICAgICAgY29uc3QgZGNNZWFzdXJlcyA9IHRoaXMuZHVwbGljYXRlSnVtcHNGcm9tVG8oMCwgZW5kTWVhc3VyZSwgJ0RDJyk7XHJcbiAgICAgIHRoaXMuanVtcFF1ZXVlID0gdGhpcy5qdW1wUXVldWUuY29uY2F0KGRjTWVhc3VyZXMpO1xyXG4gICAgICB0aGlzLmp1bXBRdWV1ZVtsYXN0XS5lbmRSZWFzb24gPSAnQ29kYSc7XHJcbiAgICAgIGlmICh0aGlzLmNvZGFNZWFzdXJlID4gdGhpcy5kY01lYXN1cmUpIHtcclxuICAgICAgICBjdXJyZW50SnVtcCA9IHtcclxuICAgICAgICAgIHN0YXJ0TWVhc3VyZTogdGhpcy5jb2RhTWVhc3VyZSxcclxuICAgICAgICAgIGVuZE1lYXN1cmUsXHJcbiAgICAgICAgICBzdGFydFJlYXNvbjogJ0RDJyxcclxuICAgICAgICAgIGVuZFJlYXNvbjogJ3Njb3JlRW5kJyxcclxuICAgICAgICAgIGVuZGluZzogLTFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuanVtcFF1ZXVlLnB1c2goY3VycmVudEp1bXApO1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVSYW5nZSh0aGlzLmRjTWVhc3VyZSwgc3RhdmUubWVhc3VyZXMubGVuZ3RoIC0gMSwgY3VycmVudEp1bXApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZHNNZWFzdXJlID49IDAgJiYgdGhpcy5zaWduTWVhc3VyZSA+IDAgJiYgdGhpcy5zaWduTWVhc3VyZSA8IHRoaXMuZHNNZWFzdXJlKSB7XHJcbiAgICAgIC8vIE9ubHkgdG8gRFMgaWYgdGhlIHNpZ24gaXMgcHJlc2VudCBhbmQgaXQncyBsb2NhdGlvbiBtYWtlcyBzZW5zZVxyXG4gICAgICBjb25zdCBkY01lYXN1cmVzID0gdGhpcy5kdXBsaWNhdGVKdW1wc0Zyb21Ubyh0aGlzLnNpZ25NZWFzdXJlLCBlbmRNZWFzdXJlLCAnRFMnKTtcclxuICAgICAgdGhpcy5qdW1wUXVldWUgPSB0aGlzLmp1bXBRdWV1ZS5jb25jYXQoZGNNZWFzdXJlcyk7XHJcbiAgICAgIHRoaXMuanVtcFF1ZXVlW2xhc3RdLmVuZFJlYXNvbiA9ICdDb2RhJztcclxuICAgICAgaWYgKHRoaXMuY29kYU1lYXN1cmUgPiB0aGlzLmRzTWVhc3VyZSkge1xyXG4gICAgICAgIGN1cnJlbnRKdW1wID0ge1xyXG4gICAgICAgICAgc3RhcnRNZWFzdXJlOiB0aGlzLmNvZGFNZWFzdXJlLFxyXG4gICAgICAgICAgZW5kTWVhc3VyZSxcclxuICAgICAgICAgIHN0YXJ0UmVhc29uOiAnRFMnLFxyXG4gICAgICAgICAgZW5kUmVhc29uOiAnc2NvcmVFbmQnLFxyXG4gICAgICAgICAgZW5kaW5nOiAtMVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5qdW1wUXVldWUucHVzaChjdXJyZW50SnVtcCk7XHJcbiAgICAgICAgdGhpcy5wb3B1bGF0ZVJhbmdlKHRoaXMuZHNNZWFzdXJlLCBzdGF2ZS5tZWFzdXJlcy5sZW5ndGggLSAxLCBjdXJyZW50SnVtcCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIElmIHdlIGFyZSBzdGFydGluZyBmcm9tIHNvbWV3aGVyZSBvdGhlciB0aGFuIHRoZSBiZWdpbm5pbmcsIHJlbW92ZSBldmVyeXRoaW5nIGJlZm9yZSB0aGUgXHJcbiAgICAvLyBjdXJzb3IgYW5kIHNldCB0aGUgc3RhcnQgbWVhc3VyZSBvZiB0aGUgbGFzdCBibG9jayB0byBzdGFydE1lYXN1cmVcclxuICAgIGxldCB0b1JlbW92ZSA9IDA7XHJcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuanVtcFF1ZXVlLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIGNvbnN0IHJvYWRtYXAgPSB0aGlzLmp1bXBRdWV1ZVtqXTtcclxuICAgICAgaWYgKHN0YXJ0TWVhc3VyZSA+IHJvYWRtYXAuZW5kTWVhc3VyZSkge1xyXG4gICAgICAgIHRvUmVtb3ZlICs9IDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuanVtcFF1ZXVlLnNwbGljZSgwLCB0b1JlbW92ZSk7XHJcbiAgICBpZiAodGhpcy5qdW1wUXVldWUubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMubWVhc3VyZVRyYWNrZXIgPSBzdGFydE1lYXN1cmU7XHJcbiAgICAgIHRoaXMuanVtcFF1ZXVlWzBdLnN0YXJ0TWVhc3VyZSA9IHN0YXJ0TWVhc3VyZTtcclxuICAgIH1cclxuICB9XHJcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/render/audio/roadmap.ts\n");
248
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ScoreRoadMapBuilder: () => (/* binding */ ScoreRoadMapBuilder)\n/* harmony export */ });\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n\n/**\n * Builds and maintans a road map from repeats and other landmarks in a score.\n * Maintains an internal cursor into the current measure.\n * This object should be repopulated (or recreated) each time it is played because the\n * sections are consumed as the internal cursor advances.\n */\nclass ScoreRoadMapBuilder {\n static get defaultMap() {\n return {\n startMeasure: -1,\n endMeasure: -1,\n startReason: 'scoreStart',\n endReason: 'scoreEnd',\n ending: -1\n };\n }\n constructor(score) {\n this.jumpQueue = [];\n this.lastSkip = -1;\n this.measureTracker = 0;\n this.dcMeasure = -1;\n this.codaMeasure = -1;\n this.signMeasure = -1;\n this.dsMeasure = -1;\n this.fineMeasure = -1;\n this.toCodaMeasure = -1;\n this.score = score;\n }\n /**\n * Populate repeat landmarks e.g. coda\n */\n populateLandmarks() {\n const stave = this.score.staves[0];\n for (let i = 0; i < stave.measures.length; ++i) {\n const mm = stave.measures[i];\n if (mm.isToDc) {\n this.dcMeasure = i;\n }\n else if (mm.isToDs) {\n this.dsMeasure = i;\n }\n else if (mm.isCoda) {\n this.codaMeasure = i;\n }\n else if (mm.isSegno) {\n this.signMeasure = i;\n }\n else if (mm.isToCoda) {\n this.toCodaMeasure = i;\n }\n else if (mm.isFine) {\n this.fineMeasure = i;\n }\n }\n }\n /**\n * When populating DC/DS logic, gets the score segments between start and the landmark (coda, fine etc).\n * @param start\n * @param end\n * @param startReason\n * @returns\n */\n duplicateJumpsFromTo(start, end, startReason) {\n const rv = [];\n let started = false;\n for (let i = 0; i < this.jumpQueue.length; ++i) {\n const rm = this.jumpQueue[i];\n if (rm.endMeasure < start) {\n continue;\n }\n if (rm.startMeasure > end) {\n continue;\n }\n // If this section fits fully within the section, just copy it\n // adjusting start if required\n if (rm.startMeasure >= start && rm.endMeasure < end) {\n const sm = started ? rm.startMeasure : start;\n const sr = started ? rm.startReason : startReason;\n started = true;\n const nrm = {\n startMeasure: sm,\n endMeasure: rm.endMeasure,\n startReason: sr,\n endReason: rm.endReason,\n ending: rm.ending\n };\n rv.push(nrm);\n }\n else if (rm.startMeasure >= start && rm.endMeasure >= end) {\n // if this section ends after the requested end, copy part of it\n // and then exit since we've reached the end\n rv.push({\n startMeasure: rm.startMeasure,\n endMeasure: end,\n startReason: rm.startReason,\n endReason: rm.endReason,\n ending: rm.ending\n });\n break;\n }\n }\n return rv;\n }\n /**\n * Internal function to find the voltas before/after a repeat\n * @param startMeasure\n * @param endMeasure\n * @returns\n */\n findVoltaBetween(startMeasure, endMeasure) {\n const rv = [];\n const stave = this.score.staves[0];\n const voltas = stave.getVoltaMap(startMeasure, endMeasure);\n voltas.forEach((volta) => {\n // this is our first ending.\n if (volta.endBar === endMeasure) {\n rv.push(volta);\n // get any nth ending starting in bar n+1\n const nvolta = stave.getVoltasForMeasure(endMeasure + 1);\n while (nvolta.length > 0) {\n const vv = nvolta.pop();\n if ((vv === null || vv === void 0 ? void 0 : vv.startBar) === endMeasure + 1) {\n rv.push(vv);\n nvolta.splice(0);\n // Clear the array and get any voltas at the end of this volta.\n endMeasure = vv.endBar;\n stave.getVoltasForMeasure(endMeasure + 1).forEach((nv) => {\n nvolta.push(nv);\n });\n }\n }\n }\n });\n return rv;\n }\n /**\n * Gets the next measure in the score, including repeats etc. And advances the internal\n * cursor\n * @returns\n */\n getAndAdvance() {\n if (this.jumpQueue.length < 1) {\n return -1;\n }\n // Return the current measure\n const rv = this.measureTracker;\n // Advance the measure for next time.\n const top = this.jumpQueue[0];\n // If this is the end of the current road map, go to the next one\n // if it exists\n if (top.endMeasure <= this.measureTracker) {\n console.log(`mm ${this.measureTracker}: done with jump ${this.jumpQueue.length}`);\n this.jumpQueue.shift();\n if (this.jumpQueue.length) {\n this.measureTracker = this.jumpQueue[0].startMeasure;\n }\n }\n else {\n // else just advance to the next measure\n this.measureTracker += 1;\n }\n return rv;\n }\n /**\n * Returns true if all the score measures have been played\n *\n * @readonly\n * @memberof ScoreRoadMapBuilder\n */\n get isDone() {\n return this.jumpQueue.length < 1;\n }\n populateRange(startMeasure, endMeasure, currentJump) {\n let skipTo = -1;\n for (let i = startMeasure; i < endMeasure; ++i) {\n if (skipTo > i) {\n continue;\n }\n const mm = this.score.staves[0].measures[i];\n // If this is a start repeat, keep track of it as the repeat destination\n if (mm.getStartBarline().barline === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_0__.SmoBarline.barlines['startRepeat']) {\n this.lastSkip = i;\n }\n // End repeat. Handle voltas\n if (mm.getEndBarline().barline === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_0__.SmoBarline.barlines['endRepeat'] &&\n this.lastSkip >= 0) {\n currentJump.endMeasure = i;\n currentJump.endReason = 'endRepeat';\n // Create a new skip from start repeat to here.\n currentJump = {\n startMeasure: this.lastSkip,\n endMeasure: i,\n startReason: 'startRepeat',\n endReason: 'endRepeat',\n ending: -1\n };\n this.jumpQueue.push(currentJump);\n // Get any voltas on or after this repeat\n const voltas = this.findVoltaBetween(this.lastSkip, i);\n // The first ending we've already played, so skip that\n if (voltas.length) {\n const firstEnding = voltas[0];\n currentJump.endMeasure = firstEnding.startBar - 1;\n currentJump.endReason = 'Volta';\n voltas.shift();\n let sanity = 0;\n // For 2nd+ ending, play the ending. Sanity is in case the voltas\n // overlap in some weird way and we can't figure out where they go.\n while (voltas.length && sanity < 20) {\n sanity += 1;\n const volta = voltas[0];\n currentJump = {\n startMeasure: volta.startBar,\n endMeasure: volta.endBar,\n startReason: 'Volta',\n endReason: 'Volta',\n ending: volta.number\n };\n this.jumpQueue.push(currentJump);\n voltas.shift();\n // If there are more than 2, do more repeats\n if (voltas.length) {\n currentJump = {\n startMeasure: this.lastSkip,\n endMeasure: firstEnding.startBar,\n startReason: 'startRepeat',\n endReason: 'Volta',\n ending: volta.number\n };\n this.jumpQueue.push(currentJump);\n }\n }\n }\n // Done with repeats and voltas. Continue with the score from after the last volta\n if (currentJump.endMeasure < endMeasure) {\n skipTo = currentJump.endMeasure + 1;\n this.lastSkip = skipTo;\n currentJump = {\n startMeasure: skipTo,\n endMeasure,\n startReason: 'startRepeat',\n endReason: 'scoreEnd',\n ending: -1\n };\n this.jumpQueue.push(currentJump);\n }\n }\n }\n }\n /**\n * Populate the jump queue of sections of the score, starting\n * at the given measure. This should be called before calling\n * getAndAdvance the first time.\n * @param startMeasure\n */\n populate(startMeasure) {\n this.populateLandmarks();\n const stave = this.score.staves[0];\n this.jumpQueue.splice(0);\n this.lastSkip = 0;\n // assume we are playing the full score\n let endMeasure = stave.measures.length - 1;\n if (this.dcMeasure > 0) {\n endMeasure = this.dcMeasure;\n }\n else if (this.dsMeasure > 0) {\n endMeasure = this.dsMeasure;\n }\n let endReason = 'scoreEnd';\n if (this.dcMeasure > 0 || this.dsMeasure > 0) {\n endReason = 'Coda';\n }\n this.jumpQueue.push({\n startMeasure: 0,\n endMeasure,\n startReason: 'scoreStart',\n endReason,\n ending: -1\n });\n let currentJump = this.jumpQueue[0];\n this.populateRange(0, endMeasure, currentJump);\n const last = this.jumpQueue.length - 1;\n // handle dc al coda, etc.\n endMeasure = stave.measures.length - 1;\n endReason = 'scoreEnd';\n if (this.fineMeasure > 0) {\n endMeasure = this.fineMeasure;\n }\n else if (this.toCodaMeasure > 0) {\n endMeasure = this.toCodaMeasure;\n }\n // Handle DC\n if (this.dcMeasure >= 0) {\n const dcMeasures = this.duplicateJumpsFromTo(0, endMeasure, 'DC');\n this.jumpQueue = this.jumpQueue.concat(dcMeasures);\n this.jumpQueue[last].endReason = 'Coda';\n if (this.codaMeasure > this.dcMeasure) {\n currentJump = {\n startMeasure: this.codaMeasure,\n endMeasure,\n startReason: 'DC',\n endReason: 'scoreEnd',\n ending: -1\n };\n this.jumpQueue.push(currentJump);\n this.populateRange(this.dcMeasure, stave.measures.length - 1, currentJump);\n }\n }\n else if (this.dsMeasure >= 0 && this.signMeasure > 0 && this.signMeasure < this.dsMeasure) {\n // Only to DS if the sign is present and it's location makes sense\n const dcMeasures = this.duplicateJumpsFromTo(this.signMeasure, endMeasure, 'DS');\n this.jumpQueue = this.jumpQueue.concat(dcMeasures);\n this.jumpQueue[last].endReason = 'Coda';\n if (this.codaMeasure > this.dsMeasure) {\n currentJump = {\n startMeasure: this.codaMeasure,\n endMeasure,\n startReason: 'DS',\n endReason: 'scoreEnd',\n ending: -1\n };\n this.jumpQueue.push(currentJump);\n this.populateRange(this.dsMeasure, stave.measures.length - 1, currentJump);\n }\n }\n // If we are starting from somewhere other than the beginning, remove everything before the \n // cursor and set the start measure of the last block to startMeasure\n let toRemove = 0;\n for (let j = 0; j < this.jumpQueue.length; ++j) {\n const roadmap = this.jumpQueue[j];\n if (startMeasure > roadmap.endMeasure) {\n toRemove += 1;\n }\n }\n this.jumpQueue.splice(0, toRemove);\n if (this.jumpQueue.length) {\n this.measureTracker = startMeasure;\n this.jumpQueue[0].startMeasure = startMeasure;\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFVBQVU7b0JBQ1YsV0FBVyxFQUFFLElBQUk7b0JBQ2pCLFNBQVMsRUFBRSxVQUFVO29CQUNyQixNQUFNLEVBQUUsQ0FBQyxDQUFDO2lCQUNYLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDN0UsQ0FBQztRQUNILENBQUM7UUFDRCw0RkFBNEY7UUFDNUYscUVBQXFFO1FBQ3JFLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDdEMsUUFBUSxJQUFJLENBQUMsQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNuQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxZQUFZLENBQUM7WUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvcmVuZGVyL2F1ZGlvL3JvYWRtYXAudHM/NDlmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTbW9TY29yZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3Njb3JlJztcclxuaW1wb3J0IHsgU21vVm9sdGEsIFNtb0JhcmxpbmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tZWFzdXJlTW9kaWZpZXJzJztcclxuXHJcbmV4cG9ydCB0eXBlIHBsYXllclN0YXJ0UmVhc29uID0gJ3Njb3JlU3RhcnQnIHwnc3RhcnRSZXBlYXQnIHwgJ0RDJyB8ICAnRFMnIHwgJ1ZvbHRhJztcclxuZXhwb3J0IHR5cGUgcGxheWVyRW5kUmVhc29uID0gJ3Njb3JlU3RhcnQnIHwgJ3Njb3JlRW5kJyB8ICdlbmRSZXBlYXQnIHwgJ0NvZGEnIHwgJ1NlZ25vJyB8ICdWb2x0YSc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgU2NvcmVTZWdtZW50IHtcclxuICBzdGFydE1lYXN1cmU6IG51bWJlcixcclxuICBlbmRNZWFzdXJlOiBudW1iZXIsXHJcbiAgc3RhcnRSZWFzb246IHBsYXllclN0YXJ0UmVhc29uLFxyXG4gIGVuZFJlYXNvbjogcGxheWVyRW5kUmVhc29uLFxyXG4gIGVuZGluZzogbnVtYmVyXHJcbn1cclxuLyoqXHJcbiAqIEJ1aWxkcyBhbmQgbWFpbnRhbnMgYSByb2FkIG1hcCBmcm9tIHJlcGVhdHMgYW5kIG90aGVyIGxhbmRtYXJrcyBpbiBhIHNjb3JlLlxyXG4gKiBNYWludGFpbnMgYW4gaW50ZXJuYWwgY3Vyc29yIGludG8gdGhlIGN1cnJlbnQgbWVhc3VyZS5cclxuICogVGhpcyBvYmplY3Qgc2hvdWxkIGJlIHJlcG9wdWxhdGVkIChvciByZWNyZWF0ZWQpIGVhY2ggdGltZSBpdCBpcyBwbGF5ZWQgYmVjYXVzZSB0aGUgXHJcbiAqIHNlY3Rpb25zIGFyZSBjb25zdW1lZCBhcyB0aGUgaW50ZXJuYWwgY3Vyc29yIGFkdmFuY2VzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNjb3JlUm9hZE1hcEJ1aWxkZXIge1xyXG4gIGp1bXBRdWV1ZTogU2NvcmVTZWdtZW50W10gPSBbXTtcclxuICBsYXN0U2tpcDogbnVtYmVyID0gLTFcclxuICBzY29yZTogU21vU2NvcmU7XHJcbiAgbWVhc3VyZVRyYWNrZXI6IG51bWJlciA9IDA7XHJcbiAgZGNNZWFzdXJlOiBudW1iZXIgPSAtMTtcclxuICBjb2RhTWVhc3VyZTogbnVtYmVyID0gLTE7XHJcbiAgc2lnbk1lYXN1cmU6IG51bWJlciA9IC0xO1xyXG4gIGRzTWVhc3VyZTogbnVtYmVyID0gLTE7XHJcbiAgZmluZU1lYXN1cmU6IG51bWJlciA9IC0xO1xyXG4gIHRvQ29kYU1lYXN1cmU6IG51bWJlciA9IC0xO1xyXG4gIHN0YXRpYyBnZXQgZGVmYXVsdE1hcCgpOlNjb3JlU2VnbWVudCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdGFydE1lYXN1cmU6IC0xLFxyXG4gICAgICBlbmRNZWFzdXJlOiAtMSxcclxuICAgICAgc3RhcnRSZWFzb246ICdzY29yZVN0YXJ0JyxcclxuICAgICAgZW5kUmVhc29uOiAnc2NvcmVFbmQnLFxyXG4gICAgICBlbmRpbmc6IC0xXHJcbiAgICB9XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKHNjb3JlOiBTbW9TY29yZSkge1xyXG4gICAgdGhpcy5zY29yZSA9IHNjb3JlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUG9wdWxhdGUgcmVwZWF0IGxhbmRtYXJrcyBlLmcuIGNvZGFcclxuICAgKi9cclxuICBwcml2YXRlIHBvcHVsYXRlTGFuZG1hcmtzKCkge1xyXG4gICAgY29uc3Qgc3RhdmUgPSB0aGlzLnNjb3JlLnN0YXZlc1swXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhdmUubWVhc3VyZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgbW0gPSBzdGF2ZS5tZWFzdXJlc1tpXTtcclxuICAgICAgaWYgKG1tLmlzVG9EYykge1xyXG4gICAgICAgIHRoaXMuZGNNZWFzdXJlID0gaTtcclxuICAgICAgfSBlbHNlIGlmIChtbS5pc1RvRHMpIHtcclxuICAgICAgICB0aGlzLmRzTWVhc3VyZSA9IGk7XHJcbiAgICAgIH0gZWxzZSBpZiAobW0uaXNDb2RhKSB7XHJcbiAgICAgICAgdGhpcy5jb2RhTWVhc3VyZSA9IGk7XHJcbiAgICAgIH0gZWxzZSBpZiAobW0uaXNTZWdubykge1xyXG4gICAgICAgIHRoaXMuc2lnbk1lYXN1cmUgPSBpO1xyXG4gICAgICB9IGVsc2UgaWYgKG1tLmlzVG9Db2RhKSB7XHJcbiAgICAgICAgdGhpcy50b0NvZGFNZWFzdXJlID0gaTtcclxuICAgICAgfSBlbHNlIGlmIChtbS5pc0ZpbmUpIHtcclxuICAgICAgICB0aGlzLmZpbmVNZWFzdXJlID0gaTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBwb3B1bGF0aW5nIERDL0RTIGxvZ2ljLCBnZXRzIHRoZSBzY29yZSBzZWdtZW50cyBiZXR3ZWVuIHN0YXJ0IGFuZCB0aGUgbGFuZG1hcmsgKGNvZGEsIGZpbmUgZXRjKS5cclxuICAgKiBAcGFyYW0gc3RhcnQgXHJcbiAgICogQHBhcmFtIGVuZCBcclxuICAgKiBAcGFyYW0gc3RhcnRSZWFzb24gXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkdXBsaWNhdGVKdW1wc0Zyb21UbyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgc3RhcnRSZWFzb246IHBsYXllclN0YXJ0UmVhc29uKTogU2NvcmVTZWdtZW50W10ge1xyXG4gICAgY29uc3QgcnY6IFNjb3JlU2VnbWVudFtdID0gW107XHJcbiAgICBsZXQgc3RhcnRlZCA9IGZhbHNlO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmp1bXBRdWV1ZS5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBybSA9IHRoaXMuanVtcFF1ZXVlW2ldO1xyXG4gICAgICBpZiAocm0uZW5kTWVhc3VyZSA8IHN0YXJ0KSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJtLnN0YXJ0TWVhc3VyZSA+IGVuZCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIElmIHRoaXMgc2VjdGlvbiBmaXRzIGZ1bGx5IHdpdGhpbiB0aGUgc2VjdGlvbiwganVzdCBjb3B5IGl0XHJcbiAgICAgIC8vIGFkanVzdGluZyBzdGFydCBpZiByZXF1aXJlZFxyXG4gICAgICBpZiAocm0uc3RhcnRNZWFzdXJlID49IHN0YXJ0ICYmIHJtLmVuZE1lYXN1cmUgPCBlbmQpIHtcclxuICAgICAgICBjb25zdCBzbSA9IHN0YXJ0ZWQgPyBybS5zdGFydE1lYXN1cmUgOiBzdGFydDtcclxuICAgICAgICBjb25zdCBzciA9IHN0YXJ0ZWQgPyBybS5zdGFydFJlYXNvbiA6IHN0YXJ0UmVhc29uO1xyXG4gICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IG5ybTogU2NvcmVTZWdtZW50ID0ge1xyXG4gICAgICAgICAgc3RhcnRNZWFzdXJlOiBzbSxcclxuICAgICAgICAgIGVuZE1lYXN1cmU6IHJtLmVuZE1lYXN1cmUsXHJcbiAgICAgICAgICBzdGFydFJlYXNvbiA6IHNyLFxyXG4gICAgICAgICAgZW5kUmVhc29uIDogcm0uZW5kUmVhc29uLFxyXG4gICAgICAgICAgZW5kaW5nOiBybS5lbmRpbmdcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJ2LnB1c2gobnJtKVxyXG4gICAgICB9IGVsc2UgaWYgKHJtLnN0YXJ0TWVhc3VyZSA+PSBzdGFydCAmJiBybS5lbmRNZWFzdXJlID49IGVuZCkge1xyXG4gICAgICAgIC8vIGlmIHRoaXMgc2VjdGlvbiBlbmRzIGFmdGVyIHRoZSByZXF1ZXN0ZWQgZW5kLCBjb3B5IHBhcnQgb2YgaXRcclxuICAgICAgICAvLyBhbmQgdGhlbiBleGl0IHNpbmNlIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZFxyXG4gICAgICAgIHJ2LnB1c2goe1xyXG4gICAgICAgICAgc3RhcnRNZWFzdXJlOiBybS5zdGFydE1lYXN1cmUsXHJcbiAgICAgICAgICBlbmRNZWFzdXJlOiBlbmQsXHJcbiAgICAgICAgICBzdGFydFJlYXNvbjogcm0uc3RhcnRSZWFzb24sXHJcbiAgICAgICAgICBlbmRSZWFzb246IHJtLmVuZFJlYXNvbixcclxuICAgICAgICAgIGVuZGluZzogcm0uZW5kaW5nXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBydjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIHZvbHRhcyBiZWZvcmUvYWZ0ZXIgYSByZXBlYXRcclxuICAgKiBAcGFyYW0gc3RhcnRNZWFzdXJlIFxyXG4gICAqIEBwYXJhbSBlbmRNZWFzdXJlIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmluZFZvbHRhQmV0d2VlbihzdGFydE1lYXN1cmU6IG51bWJlciwgZW5kTWVhc3VyZTogbnVtYmVyKTpTbW9Wb2x0YVtdIHtcclxuICAgIGNvbnN0IHJ2OiBTbW9Wb2x0YVtdID0gW107XHJcbiAgICBjb25zdCBzdGF2ZSA9IHRoaXMuc2NvcmUuc3RhdmVzWzBdO1xyXG4gICAgY29uc3Qgdm9sdGFzID0gc3RhdmUuZ2V0Vm9sdGFNYXAoc3RhcnRNZWFzdXJlLCBlbmRNZWFzdXJlKTtcclxuICAgIHZvbHRhcy5mb3JFYWNoKCh2b2x0YSkgPT4ge1xyXG4gICAgICAvLyB0aGlzIGlzIG91ciBmaXJzdCBlbmRpbmcuXHJcbiAgICAgIGlmICh2b2x0YS5lbmRCYXIgPT09IGVuZE1lYXN1cmUpIHtcclxuICAgICAgICBydi5wdXNoKHZvbHRhKTtcclxuICAgICAgICAvLyBnZXQgYW55IG50aCBlbmRpbmcgc3RhcnRpbmcgaW4gYmFyIG4rMVxyXG4gICAgICAgIGNvbnN0IG52b2x0YSA9IHN0YXZlLmdldFZvbHRhc0Zvck1lYXN1cmUoZW5kTWVhc3VyZSArIDEpO1xyXG4gICAgICAgIHdoaWxlIChudm9sdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY29uc3QgdnYgPSBudm9sdGEucG9wKCk7XHJcbiAgICAgICAgICBpZiAodnY/LnN0YXJ0QmFyID09PSBlbmRNZWFzdXJlICsgMSkge1xyXG4gICAgICAgICAgICBydi5wdXNoKHZ2KTtcclxuICAgICAgICAgICAgbnZvbHRhLnNwbGljZSgwKTtcclxuICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGFycmF5IGFuZCBnZXQgYW55IHZvbHRhcyBhdCB0aGUgZW5kIG9mIHRoaXMgdm9sdGEuXHJcbiAgICAgICAgICAgIGVuZE1lYXN1cmUgPSB2di5lbmRCYXI7XHJcbiAgICAgICAgICAgIHN0YXZlLmdldFZvbHRhc0Zvck1lYXN1cmUoZW5kTWVhc3VyZSArIDEpLmZvckVhY2goKG52KSA9PiB7XHJcbiAgICAgICAgICAgICAgbnZvbHRhLnB1c2gobnYpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBuZXh0IG1lYXN1cmUgaW4gdGhlIHNjb3JlLCBpbmNsdWRpbmcgcmVwZWF0cyBldGMuICBBbmQgYWR2YW5jZXMgdGhlIGludGVybmFsXHJcbiAgICogY3Vyc29yXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZ2V0QW5kQWR2YW5jZSgpIHtcclxuICAgIGlmICh0aGlzLmp1bXBRdWV1ZS5sZW5ndGggPCAxKSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuICAgIC8vIFJldHVybiB0aGUgY3VycmVudCBtZWFzdXJlXHJcbiAgICBjb25zdCBydiA9IHRoaXMubWVhc3VyZVRyYWNrZXI7XHJcbiAgICAvLyBBZHZhbmNlIHRoZSBtZWFzdXJlIGZvciBuZXh0IHRpbWUuXHJcbiAgICBjb25zdCB0b3AgPSB0aGlzLmp1bXBRdWV1ZVswXTtcclxuICAgIC8vIElmIHRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByb2FkIG1hcCwgZ28gdG8gdGhlIG5leHQgb25lXHJcbiAgICAvLyBpZiBpdCBleGlzdHNcclxuICAgIGlmICh0b3AuZW5kTWVhc3VyZSA8PSB0aGlzLm1lYXN1cmVUcmFja2VyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBtbSAke3RoaXMubWVhc3VyZVRyYWNrZXJ9OiBkb25lIHdpdGgganVtcCAke3RoaXMuanVtcFF1ZXVlLmxlbmd0aH1gKTtcclxuICAgICAgdGhpcy5qdW1wUXVldWUuc2hpZnQoKTtcclxuICAgICAgaWYgKHRoaXMuanVtcFF1ZXVlLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMubWVhc3VyZVRyYWNrZXIgPSB0aGlzLmp1bXBRdWV1ZVswXS5zdGFydE1lYXN1cmU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGVsc2UganVzdCBhZHZhbmNlIHRvIHRoZSBuZXh0IG1lYXN1cmVcclxuICAgICAgdGhpcy5tZWFzdXJlVHJhY2tlciArPSAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJ2O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgYWxsIHRoZSBzY29yZSBtZWFzdXJlcyBoYXZlIGJlZW4gcGxheWVkXHJcbiAgICpcclxuICAgKiBAcmVhZG9ubHlcclxuICAgKiBAbWVtYmVyb2YgU2NvcmVSb2FkTWFwQnVpbGRlclxyXG4gICAqL1xyXG4gIGdldCBpc0RvbmUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5qdW1wUXVldWUubGVuZ3RoIDwgMTtcclxuICB9XHJcbiAgcHJpdmF0ZSBwb3B1bGF0ZVJhbmdlKHN0YXJ0TWVhc3VyZTogbnVtYmVyLCBlbmRNZWFzdXJlOiBudW1iZXIsXHJcbiAgICBjdXJyZW50SnVtcDogU2NvcmVTZWdtZW50XHJcbiAgKSB7XHJcbiAgICAgbGV0IHNraXBUbyA9IC0xO1xyXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0TWVhc3VyZTsgaSA8IGVuZE1lYXN1cmU7ICsraSkge1xyXG4gICAgICBpZiAoc2tpcFRvID4gaSkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG1tID0gdGhpcy5zY29yZS5zdGF2ZXNbMF0ubWVhc3VyZXNbaV07XHJcbiAgICAgIC8vIElmIHRoaXMgaXMgYSBzdGFydCByZXBlYXQsIGtlZXAgdHJhY2sgb2YgaXQgYXMgdGhlIHJlcGVhdCBkZXN0aW5hdGlvblxyXG4gICAgICBpZiAobW0uZ2V0U3RhcnRCYXJsaW5lKCkuYmFybGluZSA9PT0gU21vQmFybGluZS5iYXJsaW5lc1snc3RhcnRSZXBlYXQnXSkge1xyXG4gICAgICAgIHRoaXMubGFzdFNraXAgPSBpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIEVuZCByZXBlYXQuICBIYW5kbGUgdm9sdGFzXHJcbiAgICAgIGlmIChtbS5nZXRFbmRCYXJsaW5lKCkuYmFybGluZSA9PT0gU21vQmFybGluZS5iYXJsaW5lc1snZW5kUmVwZWF0J10gJiZcclxuICAgICAgIHRoaXMubGFzdFNraXAgPj0gMCkge1xyXG4gICAgICAgIGN1cnJlbnRKdW1wLmVuZE1lYXN1cmUgPSBpO1xyXG4gICAgICAgIGN1cnJlbnRKdW1wLmVuZFJlYXNvbiA9ICdlbmRSZXBlYXQnO1xyXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBza2lwIGZyb20gc3RhcnQgcmVwZWF0IHRvIGhlcmUuXHJcbiAgICAgICAgY3VycmVudEp1bXAgPSB7XHJcbiAgICAgICAgICAgIHN0YXJ0TWVhc3VyZTogdGhpcy5sYXN0U2tpcCxcclxuICAgICAgICAgICAgZW5kTWVhc3VyZTogaSxcclxuICAgICAgICAgICAgc3RhcnRSZWFzb246ICdzdGFydFJlcGVhdCcsXHJcbiAgICAgICAgICAgIGVuZFJlYXNvbjogJ2VuZFJlcGVhdCcsXHJcbiAgICAgICAgICAgIGVuZGluZzogLTFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuanVtcFF1ZXVlLnB1c2goY3VycmVudEp1bXApO1xyXG4gICAgICAgIC8vIEdldCBhbnkgdm9sdGFzIG9uIG9yIGFmdGVyIHRoaXMgcmVwZWF0XHJcbiAgICAgICAgY29uc3Qgdm9sdGFzID0gdGhpcy5maW5kVm9sdGFCZXR3ZWVuKHRoaXMubGFzdFNraXAsIGkpO1xyXG4gICAgICAgIC8vIFRoZSBmaXJzdCBlbmRpbmcgd2UndmUgYWxyZWFkeSBwbGF5ZWQsIHNvIHNraXAgdGhhdFxyXG4gICAgICAgIGlmICh2b2x0YXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICBjb25zdCBmaXJzdEVuZGluZyA9IHZvbHRhc1swXTtcclxuICAgICAgICAgIGN1cnJlbnRKdW1wLmVuZE1lYXN1cmUgPSBmaXJzdEVuZGluZy5zdGFydEJhciAtIDE7XHJcbiAgICAgICAgICBjdXJyZW50SnVtcC5lbmRSZWFzb24gPSAnVm9sdGEnO1xyXG4gICAgICAgICAgdm9sdGFzLnNoaWZ0KCk7XHJcbiAgICAgICAgICBsZXQgc2FuaXR5ID0gMDtcclxuICAgICAgICAgIC8vIEZvciAybmQrIGVuZGluZywgcGxheSB0aGUgZW5kaW5nLiAgU2FuaXR5IGlzIGluIGNhc2UgdGhlIHZvbHRhc1xyXG4gICAgICAgICAgLy8gb3ZlcmxhcCBpbiBzb21lIHdlaXJkIHdheSBhbmQgd2UgY2FuJ3QgZmlndXJlIG91dCB3aGVyZSB0aGV5IGdvLlxyXG4gICAgICAgICAgd2hpbGUgKHZvbHRhcy5sZW5ndGggJiYgc2FuaXR5IDwgMjApIHtcclxuICAgICAgICAgICAgc2FuaXR5ICs9IDE7XHJcbiAgICAgICAgICAgIGNvbnN0IHZvbHRhID0gdm9sdGFzWzBdO1xyXG4gICAgICAgICAgICBjdXJyZW50SnVtcCA9IHtcclxuICAgICAgICAgICAgICBzdGFydE1lYXN1cmU6IHZvbHRhLnN0YXJ0QmFyLFxyXG4gICAgICAgICAgICAgIGVuZE1lYXN1cmU6IHZvbHRhLmVuZEJhcixcclxuICAgICAgICAgICAgICBzdGFydFJlYXNvbjogJ1ZvbHRhJyxcclxuICAgICAgICAgICAgICBlbmRSZWFzb246ICdWb2x0YScsXHJcbiAgICAgICAgICAgICAgZW5kaW5nOiB2b2x0YS5udW1iZXJcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5qdW1wUXVldWUucHVzaChjdXJyZW50SnVtcCk7XHJcbiAgICAgICAgICAgIHZvbHRhcy5zaGlmdCgpO1xyXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDIsIGRvIG1vcmUgcmVwZWF0c1xyXG4gICAgICAgICAgICBpZiAodm9sdGFzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRKdW1wID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRNZWFzdXJlOiB0aGlzLmxhc3RTa2lwLFxyXG4gICAgICAgICAgICAgICAgZW5kTWVhc3VyZTogZmlyc3RFbmRpbmcuc3RhcnRCYXIsXHJcbiAgICAgICAgICAgICAgICBzdGFydFJlYXNvbjogJ3N0YXJ0UmVwZWF0JyxcclxuICAgICAgICAgICAgICAgIGVuZFJlYXNvbjogJ1ZvbHRhJyxcclxuICAgICAgICAgICAgICAgIGVuZGluZzogdm9sdGEubnVtYmVyXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB0aGlzLmp1bXBRdWV1ZS5wdXNoKGN1cnJlbnRKdW1wKTtcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRG9uZSB3aXRoIHJlcGVhdHMgYW5kIHZvbHRhcy4gIENvbnRpbnVlIHdpdGggdGhlIHNjb3JlIGZyb20gYWZ0ZXIgdGhlIGxhc3Qgdm9sdGFcclxuICAgICAgICBpZiAoY3VycmVudEp1bXAuZW5kTWVhc3VyZSA8IGVuZE1lYXN1cmUpIHtcclxuICAgICAgICAgIHNraXBUbyA9IGN1cnJlbnRKdW1wLmVuZE1lYXN1cmUgKyAxO1xyXG4gICAgICAgICAgdGhpcy5sYXN0U2tpcCA9IHNraXBUbztcclxuICAgICAgICAgIGN1cnJlbnRKdW1wID0ge1xyXG4gICAgICAgICAgICBzdGFydE1lYXN1cmU6IHNraXBUbyxcclxuICAgICAgICAgICAgZW5kTWVhc3VyZSxcclxuICAgICAgICAgICAgc3RhcnRSZWFzb246ICdzdGFydFJlcGVhdCcsXHJcbiAgICAgICAgICAgIGVuZFJlYXNvbjogJ3Njb3JlRW5kJyxcclxuICAgICAgICAgICAgZW5kaW5nOiAtMVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5qdW1wUXVldWUucHVzaChjdXJyZW50SnVtcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFBvcHVsYXRlIHRoZSBqdW1wIHF1ZXVlIG9mIHNlY3Rpb25zIG9mIHRoZSBzY29yZSwgc3RhcnRpbmdcclxuICAgKiBhdCB0aGUgZ2l2ZW4gbWVhc3VyZS4gIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBcclxuICAgKiBnZXRBbmRBZHZhbmNlIHRoZSBmaXJzdCB0aW1lLlxyXG4gICAqIEBwYXJhbSBzdGFydE1lYXN1cmUgXHJcbiAgICovXHJcbiAgcG9wdWxhdGUoc3RhcnRNZWFzdXJlOiBudW1iZXIpIHtcclxuICAgIHRoaXMucG9wdWxhdGVMYW5kbWFya3MoKTtcclxuICAgIGNvbnN0IHN0YXZlID0gdGhpcy5zY29yZS5zdGF2ZXNbMF07XHJcbiAgICB0aGlzLmp1bXBRdWV1ZS5zcGxpY2UoMCk7XHJcbiAgICB0aGlzLmxhc3RTa2lwID0gMDtcclxuICAgIC8vIGFzc3VtZSB3ZSBhcmUgcGxheWluZyB0aGUgZnVsbCBzY29yZVxyXG4gICAgbGV0IGVuZE1lYXN1cmUgPSBzdGF2ZS5tZWFzdXJlcy5sZW5ndGggLSAxO1xyXG4gICAgaWYgKHRoaXMuZGNNZWFzdXJlID4gMCkge1xyXG4gICAgICBlbmRNZWFzdXJlID0gdGhpcy5kY01lYXN1cmU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZHNNZWFzdXJlID4gMCkge1xyXG4gICAgICBlbmRNZWFzdXJlID0gdGhpcy5kc01lYXN1cmU7XHJcbiAgICB9XHJcbiAgICBsZXQgZW5kUmVhc29uOnBsYXllckVuZFJlYXNvbiA9ICdzY29yZUVuZCc7XHJcbiAgICBpZiAodGhpcy5kY01lYXN1cmUgPiAwIHx8IHRoaXMuZHNNZWFzdXJlID4gMCkge1xyXG4gICAgICBlbmRSZWFzb24gPSAnQ29kYSc7XHJcbiAgICB9XHJcbiAgICB0aGlzLmp1bXBRdWV1ZS5wdXNoKHtcclxuICAgICAgc3RhcnRNZWFzdXJlOiAwLFxyXG4gICAgICBlbmRNZWFzdXJlLFxyXG4gICAgICBzdGFydFJlYXNvbjogJ3Njb3JlU3RhcnQnLFxyXG4gICAgICBlbmRSZWFzb24sXHJcbiAgICAgIGVuZGluZzogLTFcclxuICAgIH0pOyAgICBcclxuICAgIGxldCBjdXJyZW50SnVtcCA9IHRoaXMuanVtcFF1ZXVlWzBdO1xyXG4gICAgdGhpcy5wb3B1bGF0ZVJhbmdlKDAsIGVuZE1lYXN1cmUsIGN1cnJlbnRKdW1wKVxyXG4gICAgXHJcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5qdW1wUXVldWUubGVuZ3RoIC0gMTtcclxuICAgIC8vIGhhbmRsZSBkYyBhbCBjb2RhLCBldGMuXHJcbiAgICBlbmRNZWFzdXJlID0gc3RhdmUubWVhc3VyZXMubGVuZ3RoIC0gMTtcclxuICAgIGVuZFJlYXNvbiA9ICdzY29yZUVuZCc7XHJcbiAgICBpZiAodGhpcy5maW5lTWVhc3VyZSA+IDApIHtcclxuICAgICAgZW5kTWVhc3VyZSA9IHRoaXMuZmluZU1lYXN1cmU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnRvQ29kYU1lYXN1cmUgPiAwKSB7XHJcbiAgICAgIGVuZE1lYXN1cmUgPSB0aGlzLnRvQ29kYU1lYXN1cmU7XHJcbiAgICB9XHJcbiAgICAvLyBIYW5kbGUgRENcclxuICAgIGlmICh0aGlzLmRjTWVhc3VyZSA+PSAwKSB7XHJcbiAgICAgIGNvbnN0IGRjTWVhc3VyZXMgPSB0aGlzLmR1cGxpY2F0ZUp1bXBzRnJvbVRvKDAsIGVuZE1lYXN1cmUsICdEQycpO1xyXG4gICAgICB0aGlzLmp1bXBRdWV1ZSA9IHRoaXMuanVtcFF1ZXVlLmNvbmNhdChkY01lYXN1cmVzKTtcclxuICAgICAgdGhpcy5qdW1wUXVldWVbbGFzdF0uZW5kUmVhc29uID0gJ0NvZGEnO1xyXG4gICAgICBpZiAodGhpcy5jb2RhTWVhc3VyZSA+IHRoaXMuZGNNZWFzdXJlKSB7XHJcbiAgICAgICAgY3VycmVudEp1bXAgPSB7XHJcbiAgICAgICAgICBzdGFydE1lYXN1cmU6IHRoaXMuY29kYU1lYXN1cmUsXHJcbiAgICAgICAgICBlbmRNZWFzdXJlLFxyXG4gICAgICAgICAgc3RhcnRSZWFzb246ICdEQycsXHJcbiAgICAgICAgICBlbmRSZWFzb246ICdzY29yZUVuZCcsXHJcbiAgICAgICAgICBlbmRpbmc6IC0xXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmp1bXBRdWV1ZS5wdXNoKGN1cnJlbnRKdW1wKTtcclxuICAgICAgICB0aGlzLnBvcHVsYXRlUmFuZ2UodGhpcy5kY01lYXN1cmUsIHN0YXZlLm1lYXN1cmVzLmxlbmd0aCAtIDEsIGN1cnJlbnRKdW1wKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmRzTWVhc3VyZSA+PSAwICYmIHRoaXMuc2lnbk1lYXN1cmUgPiAwICYmIHRoaXMuc2lnbk1lYXN1cmUgPCB0aGlzLmRzTWVhc3VyZSkge1xyXG4gICAgICAvLyBPbmx5IHRvIERTIGlmIHRoZSBzaWduIGlzIHByZXNlbnQgYW5kIGl0J3MgbG9jYXRpb24gbWFrZXMgc2Vuc2VcclxuICAgICAgY29uc3QgZGNNZWFzdXJlcyA9IHRoaXMuZHVwbGljYXRlSnVtcHNGcm9tVG8odGhpcy5zaWduTWVhc3VyZSwgZW5kTWVhc3VyZSwgJ0RTJyk7XHJcbiAgICAgIHRoaXMuanVtcFF1ZXVlID0gdGhpcy5qdW1wUXVldWUuY29uY2F0KGRjTWVhc3VyZXMpO1xyXG4gICAgICB0aGlzLmp1bXBRdWV1ZVtsYXN0XS5lbmRSZWFzb24gPSAnQ29kYSc7XHJcbiAgICAgIGlmICh0aGlzLmNvZGFNZWFzdXJlID4gdGhpcy5kc01lYXN1cmUpIHtcclxuICAgICAgICBjdXJyZW50SnVtcCA9IHtcclxuICAgICAgICAgIHN0YXJ0TWVhc3VyZTogdGhpcy5jb2RhTWVhc3VyZSxcclxuICAgICAgICAgIGVuZE1lYXN1cmUsXHJcbiAgICAgICAgICBzdGFydFJlYXNvbjogJ0RTJyxcclxuICAgICAgICAgIGVuZFJlYXNvbjogJ3Njb3JlRW5kJyxcclxuICAgICAgICAgIGVuZGluZzogLTFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuanVtcFF1ZXVlLnB1c2goY3VycmVudEp1bXApO1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVSYW5nZSh0aGlzLmRzTWVhc3VyZSwgc3RhdmUubWVhc3VyZXMubGVuZ3RoIC0gMSwgY3VycmVudEp1bXApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBJZiB3ZSBhcmUgc3RhcnRpbmcgZnJvbSBzb21ld2hlcmUgb3RoZXIgdGhhbiB0aGUgYmVnaW5uaW5nLCByZW1vdmUgZXZlcnl0aGluZyBiZWZvcmUgdGhlIFxyXG4gICAgLy8gY3Vyc29yIGFuZCBzZXQgdGhlIHN0YXJ0IG1lYXN1cmUgb2YgdGhlIGxhc3QgYmxvY2sgdG8gc3RhcnRNZWFzdXJlXHJcbiAgICBsZXQgdG9SZW1vdmUgPSAwO1xyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmp1bXBRdWV1ZS5sZW5ndGg7ICsraikge1xyXG4gICAgICBjb25zdCByb2FkbWFwID0gdGhpcy5qdW1wUXVldWVbal07XHJcbiAgICAgIGlmIChzdGFydE1lYXN1cmUgPiByb2FkbWFwLmVuZE1lYXN1cmUpIHtcclxuICAgICAgICB0b1JlbW92ZSArPSAxO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmp1bXBRdWV1ZS5zcGxpY2UoMCwgdG9SZW1vdmUpO1xyXG4gICAgaWYgKHRoaXMuanVtcFF1ZXVlLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLm1lYXN1cmVUcmFja2VyID0gc3RhcnRNZWFzdXJlO1xyXG4gICAgICB0aGlzLmp1bXBRdWV1ZVswXS5zdGFydE1lYXN1cmUgPSBzdGFydE1lYXN1cmU7XHJcbiAgICB9XHJcbiAgfVxyXG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/render/audio/roadmap.ts\n");
249
249
 
250
250
  /***/ }),
251
251
 
@@ -467,7 +467,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
467
467
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
468
468
 
469
469
  "use strict";
470
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VxMeasure: () => (/* binding */ VxMeasure)\n/* harmony export */ });\n/* harmony import */ var _smo_data_note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/note */ \"./src/smo/data/note.ts\");\n/* harmony import */ var _smo_data_music__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../sui/layoutDebug */ \"./src/render/sui/layoutDebug.ts\");\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _styles_font_metrics_ssp_serif_metrics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../styles/font_metrics/ssp-serif-metrics */ \"./src/styles/font_metrics/ssp-serif-metrics.js\");\n/* harmony import */ var _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/data/noteModifiers */ \"./src/smo/data/noteModifiers.ts\");\n/* harmony import */ var _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../smo/data/common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _smoAdapter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./smoAdapter */ \"./src/render/vex/smoAdapter.ts\");\n/* harmony import */ var _common_vex__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../common/vex */ \"./src/common/vex.ts\");\n/* harmony import */ var _vxNote__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./vxNote */ \"./src/render/vex/vxNote.ts\");\n/* harmony import */ var _glyphDimensions__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./glyphDimensions */ \"./src/render/vex/glyphDimensions.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n// ## Description:\n// This file calls the vexflow routines that actually render a\n// measure of music. If multiple measures are justified in a\n// column, the rendering is deferred until all the measures have been\n// preformatted.\n\n\n\n\n\n\n\n\n\n\n\n\nconst VF = _common_vex__WEBPACK_IMPORTED_MODULE_9__.VexFlow;\n// const VF = eval('Vex.Flow');\n/**\n * This is the interface for VexFlow library that actually does the engraving.\n * @category SuiRender\n */\nclass VxMeasure {\n constructor(context, selection, printing, softmax) {\n this.rendered = false;\n this.noteToVexMap = {};\n this.beamToVexMap = {};\n this.tupletToVexMap = {};\n this.multimeasureRest = null;\n this.vexNotes = [];\n this.vexBeamGroups = [];\n this.vexTuplets = [];\n this.tickmapObject = null;\n this.stave = null; // vex stave\n this.voiceNotes = []; // notes for current voice, as rendering\n this.tabNotes = [];\n this.voiceAr = [];\n this.tabVoice = null;\n this.formatter = null;\n this.allCues = false;\n this.modifiersToBox = [];\n this.collisionMap = {};\n this.dbgLeftX = 0;\n this.dbgWidth = 0;\n this.context = context;\n this.rendered = false;\n this.selection = selection;\n this.smoMeasure = this.selection.measure;\n this.printing = printing;\n this.allCues = selection.staff.partInfo.displayCues;\n this.tupletToVexMap = {};\n this.vexNotes = [];\n this.vexBeamGroups = [];\n this.vexBeamGroups = [];\n this.beamToVexMap = {};\n this.softmax = softmax;\n this.smoTabStave = selection.staff.getTabStaveForMeasure(selection.selector);\n }\n static get fillStyle() {\n return '#000';\n }\n // Treat a rest like a whole rest if there is only a single rest in the measure\n // and the measure length is not a pickup\n isWholeRest() {\n return (this.smoMeasure.voices.length === 1 &&\n this.smoMeasure.voices[0].notes.length === 1 &&\n this.smoMeasure.voices[0].notes[0].isRest() &&\n this.smoMeasure.getMaxTicksVoice() > 4096);\n }\n createCollisionTickmap() {\n let i = 0;\n let j = 0;\n if (!this.tickmapObject) {\n return;\n }\n for (i = 0; i < this.smoMeasure.voices.length; ++i) {\n const tm = this.tickmapObject.tickmaps[i];\n for (j = 0; j < tm.durationMap.length; ++j) {\n if (typeof (this.collisionMap[tm.durationMap[j]]) === 'undefined') {\n this.collisionMap[tm.durationMap[j]] = [];\n }\n this.collisionMap[tm.durationMap[j]].push(this.smoMeasure.voices[i].notes[j]);\n }\n }\n }\n isCollision(voiceIx, tickIx) {\n let i = 0;\n let j = 0;\n let k = 0;\n let staffLines = [];\n if (!this.tickmapObject) {\n return false;\n }\n const tick = this.tickmapObject.tickmaps[voiceIx].durationMap[tickIx];\n // Just one note, no collision\n if (this.collisionMap[tick].length < 2) {\n return false;\n }\n for (i = 0; i < this.collisionMap[tick].length; ++i) {\n const note = this.collisionMap[tick][i];\n for (j = 0; j < note.pitches.length; ++j) {\n const clef = (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_7__.IsClef)(note.clef) ? note.clef : 'treble';\n const pitch = note.pitches[j];\n const curLine = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.pitchToStaffLine(clef, pitch);\n for (k = 0; k < staffLines.length; ++k) {\n if (Math.abs(curLine - staffLines[k]) < 1) {\n return true;\n }\n }\n staffLines.push(curLine);\n }\n }\n return false;\n }\n /**\n * convert a smoNote into a vxNote so it can be rasterized\n * @param smoNote\n * @param tickIndex - used to calculate accidental\n * @param voiceIx\n * @returns\n */\n createVexNote(smoNote, tickIndex, voiceIx) {\n let vexNote = null;\n let smoTabNote = null;\n let timestamp = new Date().valueOf();\n const stemTicks = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.ticksToDuration[smoNote.stemTicks];\n let tabNote = null;\n const noteHead = smoNote.isRest() ? 'r' : smoNote.noteHead;\n const keys = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.smoPitchesToVexKeys(smoNote.pitches, 0, noteHead);\n const smoNoteParams = {\n isTuplet: smoNote.isTuplet,\n measureIndex: this.smoMeasure.measureNumber.measureIndex,\n clef: smoNote.clef,\n stemTicks,\n keys,\n noteType: smoNote.noteType,\n isCue: smoNote.isCue\n };\n const { noteParams, duration } = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getVexNoteParameters)(smoNoteParams);\n if (this.tabStave && this.smoTabStave) {\n smoTabNote = this.smoTabStave.getTabNoteFromNote(smoNote, this.smoMeasure.transposeIndex);\n if (smoTabNote) {\n const positions = (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.VexTabNotePositions)(this.smoTabStave, smoTabNote, smoNote);\n if (positions.length) {\n if (!smoNote.isRest()) {\n tabNote = new VF.TabNote({ positions, duration: duration });\n if (this.smoTabStave.showStems) {\n tabNote.render_options.draw_stem = true;\n tabNote.render_options.draw_dots = true;\n tabNote.render_options.draw_stem_through_stave = smoTabNote.flagThrough;\n }\n }\n else {\n tabNote = new VF.StaveNote(noteParams);\n }\n }\n }\n }\n if (smoNote.noteType === '/') {\n // vexNote = new VF.GlyphNote('\\uE504', { duration });\n vexNote = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getSlashGlyph)();\n smoNote.renderId = 'vf-' + vexNote.getAttribute('id'); // where does 'vf' come from?\n }\n else {\n const smoVexStemParams = {\n voiceCount: this.smoMeasure.voices.length,\n voiceIx,\n isAuto: smoNote.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.auto,\n isUp: smoNote.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.up\n };\n (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.applyStemDirection)(smoVexStemParams, noteParams);\n if (smoTabNote && tabNote) {\n tabNote.setStemDirection(noteParams.stem_direction);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATA, new Date().valueOf() - timestamp);\n timestamp = new Date().valueOf();\n vexNote = new VF.StaveNote(noteParams);\n if (voiceIx > 0 && this.isCollision(voiceIx, tickIndex)) {\n vexNote.setXShift(-10);\n }\n if (this.isWholeRest()) {\n noteParams.duration = 'wr';\n vexNote = new VF.StaveNote(noteParams);\n vexNote.setCenterAlignment(true);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATB, new Date().valueOf() - timestamp);\n timestamp = new Date().valueOf();\n if (smoNote.fillStyle && !this.printing) {\n vexNote.setStyle({ fillStyle: smoNote.fillStyle });\n }\n else if (voiceIx > 0 && !this.printing) {\n vexNote.setStyle({ fillStyle: \"#115511\" });\n }\n else if (smoNote.isHidden() && this.printing) {\n vexNote.setStyle({ fillStyle: \"#ffffff00\" });\n }\n smoNote.renderId = 'vf-' + vexNote.getAttribute('id'); // where does 'vf' come from?\n }\n const noteData = {\n smoMeasure: this.smoMeasure,\n vxMeasure: this,\n smoNote: smoNote,\n staveNote: vexNote,\n voiceIndex: voiceIx,\n tickIndex: tickIndex\n };\n if (tabNote) {\n noteData.tabNote = tabNote;\n this.tabNotes.push(tabNote);\n }\n const modObj = new _vxNote__WEBPACK_IMPORTED_MODULE_10__.VxNote(noteData);\n modObj.addModifiers();\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATC, new Date().valueOf() - timestamp);\n return modObj;\n }\n renderNoteGlyph(smoNote, textObj) {\n var x = this.noteToVexMap[smoNote.attrs.id].getAbsoluteX() + textObj.xOffset;\n // the -3 is copied from vexflow textDynamics\n var y = this.stave.getYForLine(textObj.yOffsetLine - 3) + textObj.yOffsetPixels;\n let maxh = 0;\n const minx = x;\n var group = this.context.getContext().openGroup();\n group.classList.add(textObj.attrs.id + '-' + smoNote.attrs.id);\n group.classList.add(textObj.attrs.id);\n // const duration = SmoMusic.closestVexDuration(smoNote.tickCount);\n for (var i = 0; i < textObj.text.length; i += 1) {\n const { width, height } = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.renderDynamics)(this.context.getContext(), VF.TextDynamics.GLYPHS[textObj.text[i]].code, textObj.fontSize, x, y);\n /* const { width , height } = renderDynamics(this.context.getContext(), VF.TextDynamics.GLYPHS[textObj.text[i]],\n textObj.fontSize, x, y); */\n x += width;\n maxh = Math.max(height, maxh);\n }\n textObj.logicalBox = _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.boxPoints(minx, y + this.context.box.y, x - minx, maxh);\n textObj.element = group;\n this.modifiersToBox.push(textObj);\n this.context.getContext().closeGroup();\n }\n renderDynamics() {\n this.smoMeasure.voices.forEach((voice) => {\n voice.notes.forEach((smoNote) => {\n const mods = smoNote.textModifiers.filter((mod) => mod.attrs.type === 'SmoDynamicText');\n mods.forEach((btm) => {\n const tm = btm;\n this.renderNoteGlyph(smoNote, tm);\n });\n });\n });\n }\n createRepeatSymbol() {\n this.voiceNotes = [];\n // const vexNote = new VF.GlyphNote('\\uE500', { duration: 'w' }, { line: 2 });\n const vexNote = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getRepeatBar)();\n vexNote.setCenterAlignment(true);\n this.vexNotes.push(vexNote);\n this.voiceNotes.push(vexNote);\n }\n /**\n * create an a array of VF.StaveNote objects to render the active voice.\n * @param voiceIx\n */\n createVexNotes(voiceIx) {\n let i = 0;\n this.voiceNotes = [];\n const voice = this.smoMeasure.voices[voiceIx];\n let clefNoteAdded = false;\n for (i = 0; i < voice.notes.length; ++i) {\n const smoNote = voice.notes[i];\n const textNotes = smoNote.getTextOrnaments();\n const vexNote = this.createVexNote(smoNote, i, voiceIx);\n this.noteToVexMap[smoNote.attrs.id] = vexNote.noteData.staveNote;\n this.vexNotes.push(vexNote.noteData.staveNote);\n if (vexNote.noteData.smoNote.clefNote && !clefNoteAdded) {\n const cf = new VF.ClefNote(vexNote.noteData.smoNote.clefNote.clef, 'small');\n this.voiceNotes.push(cf);\n clefNoteAdded = true; // ignore 2nd in a measure\n }\n this.voiceNotes.push(vexNote.noteData.staveNote);\n textNotes.forEach((tn) => {\n this.voiceNotes.push((0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createTextNote)(_smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_5__.SmoOrnament.textNoteOrnaments[tn.ornament]));\n });\n if (isNaN(smoNote.ticks.numerator) || isNaN(smoNote.ticks.denominator)\n || isNaN(smoNote.ticks.remainder)) {\n throw ('vxMeasure: NaN in ticks');\n }\n }\n }\n /**\n * Group the notes for beaming and create Vex beam objects\n * @param vix - voice index\n * @returns\n */\n createVexBeamGroups(vix) {\n let keyNoteIx = -1;\n let i = 0;\n let j = 0;\n let stemDirection = VF.Stem.DOWN;\n for (i = 0; i < this.smoMeasure.beamGroups.length; ++i) {\n const bg = this.smoMeasure.beamGroups[i];\n if (bg.voice !== vix) {\n continue;\n }\n const vexNotes = [];\n keyNoteIx = bg.notes.findIndex((nn) => nn.noteType === 'n');\n // Fix stem bug: key off first non-rest note.\n keyNoteIx = (keyNoteIx >= 0) ? keyNoteIx : 0;\n for (j = 0; j < bg.notes.length; ++j) {\n const note = bg.notes[j];\n if (note.noteType === '/') {\n continue;\n }\n const vexNote = this.noteToVexMap[note.attrs.id];\n // some type of redraw condition?\n if (!(vexNote instanceof VF.StaveNote || vexNote instanceof VF.GraceNote)) {\n return;\n }\n if (note.tickCount >= 4096 || vexNote.getIntrinsicTicks() >= 4096) {\n console.warn('bad length in beam group');\n return;\n }\n if (keyNoteIx === j) {\n stemDirection = note.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.auto ?\n vexNote.getStemDirection() : (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexStemDirection)(note);\n }\n vexNote.setStemDirection(stemDirection);\n vexNotes.push(vexNote);\n }\n const vexBeam = new VF.Beam(vexNotes);\n vexBeam.breakSecondaryAt(bg.secondaryBeamBreaks);\n this.beamToVexMap[bg.attrs.id] = vexBeam;\n this.vexBeamGroups.push(vexBeam);\n }\n }\n createVexTuplets(vix) {\n this.vexTuplets = [];\n this.tupletToVexMap = {};\n for (let i = 0; i < this.smoMeasure.tupletTrees.length; ++i) {\n const tupletTree = this.smoMeasure.tupletTrees[i];\n if (tupletTree.voice !== vix) {\n continue;\n }\n const traverseTupletTree = (parentTuplet) => {\n const vexNotes = [];\n for (let smoNote of this.smoMeasure.tupletNotes(parentTuplet)) {\n vexNotes.push(this.noteToVexMap[smoNote.attrs.id]);\n }\n const location = this.smoMeasure.getStemDirectionForTuplet(parentTuplet) === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.up ?\n VF.Tuplet.LOCATION_TOP : VF.Tuplet.LOCATION_BOTTOM;\n const smoTupletParams = {\n vexNotes,\n numNotes: parentTuplet.numNotes,\n notesOccupied: parentTuplet.notesOccupied,\n ratioed: parentTuplet.ratioed,\n bracketed: parentTuplet.bracketed,\n location\n };\n const vexTuplet = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getVexTuplets)(smoTupletParams);\n this.tupletToVexMap[parentTuplet.attrs.id] = vexTuplet;\n this.vexTuplets.push(vexTuplet);\n for (let i = 0; i < parentTuplet.childrenTuplets.length; i++) {\n const tuplet = parentTuplet.childrenTuplets[i];\n traverseTupletTree(tuplet);\n }\n };\n traverseTupletTree(tupletTree.tuplet);\n }\n }\n /**\n * create the modifiers for the stave itself, bar lines etc.\n */\n createMeasureModifiers() {\n const sb = this.smoMeasure.getStartBarline();\n const eb = this.smoMeasure.getEndBarline();\n const sym = this.smoMeasure.getRepeatSymbol();\n if (!this.stave) {\n return;\n }\n // don't create a begin bar for any but the 1st measure.\n if (this.smoMeasure.measureNumber.systemIndex !== 0 && sb.barline === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoBarline.barlines.singleBar\n && this.smoMeasure.format.padLeft === 0) {\n this.stave.setBegBarType(VF.Barline.type.NONE);\n }\n else {\n this.stave.setBegBarType((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexBarlineType)(sb));\n }\n if (this.smoMeasure.svg.multimeasureLength > 0 && !this.smoMeasure.svg.hideMultimeasure) {\n this.stave.setEndBarType(_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.vexBarlineType[this.smoMeasure.svg.multimeasureEndBarline]);\n }\n else if (eb.barline !== _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoBarline.barlines.singleBar) {\n this.stave.setEndBarType((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexBarlineType)(eb));\n }\n if (sym && sym.symbol !== _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoRepeatSymbol.symbols.None) {\n const rep = new VF.Repetition((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexSymbol)(sym), sym.xOffset + this.smoMeasure.staffX, sym.yOffset);\n this.stave.getModifiers().push(rep);\n }\n const tms = this.smoMeasure.getMeasureText();\n // TODO: set font\n tms.forEach((tmb) => {\n var _a;\n const tm = tmb;\n const offset = tm.position === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoMeasureText.positions.left ? this.smoMeasure.format.padLeft : 0;\n const staveText = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createStaveText)(tm.text, (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexTextPosition)(tm), {\n shiftX: tm.adjustX + offset, shiftY: tm.adjustY, justification: (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexTextJustification)(tm)\n });\n (_a = this.stave) === null || _a === void 0 ? void 0 : _a.addModifier(staveText);\n // hack - we can't create staveText directly so this is the only way I could set the font\n const ar = this.stave.getModifiers();\n const vm = ar[ar.length - 1];\n vm.setFont(tm.fontInfo);\n });\n if (this.smoMeasure.svg.rowInSystem === 0) {\n const rmb = this.smoMeasure.getRehearsalMark();\n const rm = rmb;\n if (rm) {\n this.stave.setSection(rm.symbol, 0);\n }\n }\n const tempo = this.smoMeasure.getTempo();\n if (tempo && this.smoMeasure.svg.forceTempo) {\n this.stave.setTempo(tempo.toVexTempo(), -1 * tempo.yOffset);\n const vexTempo = this.stave.getModifiers().find((mod) => mod.getAttribute('type') === 'StaveTempo');\n if (vexTempo) {\n vexTempo.setFont({ family: _styles_font_metrics_ssp_serif_metrics__WEBPACK_IMPORTED_MODULE_4__.SourceSerifProFont.fontFamily, size: 13, weight: 'bold' });\n }\n }\n }\n /**\n * Create all Vex notes and modifiers. We defer the format and rendering so\n * we can align across multiple staves\n */\n preFormat() {\n var _a;\n var j = 0;\n if (this.smoMeasure.svg.element !== null) {\n this.smoMeasure.svg.element.remove();\n this.smoMeasure.svg.element = null;\n if (this.smoMeasure.svg.tabElement) {\n this.smoMeasure.svg.tabElement.remove();\n this.smoMeasure.svg.tabElement = undefined;\n }\n }\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n // Note: need to do this to get it into VEX KS format\n const staffX = this.smoMeasure.staffX + this.smoMeasure.format.padLeft;\n const staffY = this.smoMeasure.staffY - this.context.box.y;\n const key = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySignatureTranspose(this.smoMeasure.keySignature, 0);\n const canceledKey = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySignatureTranspose(this.smoMeasure.canceledKeySignature, 0);\n const smoVexStaveParams = {\n x: staffX,\n y: staffY,\n padLeft: this.smoMeasure.format.padLeft,\n id: this.smoMeasure.id,\n staffX: this.smoMeasure.staffX,\n staffY: this.smoMeasure.staffY,\n staffWidth: this.smoMeasure.staffWidth,\n forceClef: this.smoMeasure.svg.forceClef,\n clef: this.smoMeasure.clef,\n forceKey: this.smoMeasure.svg.forceKeySignature,\n key,\n canceledKey,\n startX: this.smoMeasure.svg.maxColumnStartX,\n adjX: this.smoMeasure.svg.adjX,\n lines: this.smoMeasure.lines,\n context: this.context.getContext()\n };\n this.stave = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createStave)(smoVexStaveParams);\n if (this.smoMeasure.svg.forceTimeSignature) {\n const ts = this.smoMeasure.timeSignature;\n let tsString = ts.timeSignature;\n if (this.smoMeasure.timeSignature.useSymbol && ts.actualBeats === 4 && ts.beatDuration === 4) {\n tsString = 'C';\n }\n else if (this.smoMeasure.timeSignature.useSymbol && ts.actualBeats === 2 && ts.beatDuration === 4) {\n tsString = 'C|';\n }\n else if (this.smoMeasure.timeSignature.displayString.length) {\n tsString = this.smoMeasure.timeSignature.displayString;\n }\n this.stave.addTimeSignature(tsString);\n }\n // Connect it to the rendering context and draw!\n this.stave.setContext(this.context.getContext());\n if (this.smoTabStave && ((_a = this.smoMeasure.svg.tabStaveBox) === null || _a === void 0 ? void 0 : _a.width)) {\n const box = this.smoMeasure.svg.tabStaveBox;\n let tabWidth = 0;\n box.y -= this.context.box.y;\n box.x = staffX - this.context.box.x;\n box.width = this.smoMeasure.staffWidth;\n this.tabStave = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createTabStave)(box, this.smoTabStave.spacing, this.smoTabStave.numLines);\n if (this.smoMeasure.svg.forceClef) {\n this.tabStave.addTabGlyph();\n tabWidth = _glyphDimensions__WEBPACK_IMPORTED_MODULE_11__.vexGlyph.dimensions['tab'].width;\n }\n this.tabStave.setNoteStartX(this.tabStave.getNoteStartX() + this.smoMeasure.svg.adjX - tabWidth);\n this.tabStave.setContext(this.context.getContext());\n }\n this.createMeasureModifiers();\n this.tickmapObject = this.smoMeasure.createMeasureTickmaps();\n this.createCollisionTickmap();\n this.voiceAr = [];\n this.vexNotes = [];\n this.noteToVexMap = {};\n // If there are multiple voices, add them all to the formatter at the same time so they don't collide\n for (j = 0; j < this.smoMeasure.voices.length; ++j) {\n const smoVexVoiceParams = {\n actualBeats: this.smoMeasure.timeSignature.actualBeats,\n beatDuration: this.smoMeasure.timeSignature.beatDuration,\n notes: this.vexNotes\n };\n if (!this.smoMeasure.svg.multimeasureLength && !this.smoMeasure.repeatSymbol) {\n this.createVexNotes(j);\n smoVexVoiceParams.notes = this.voiceNotes;\n this.createVexTuplets(j);\n this.createVexBeamGroups(j);\n // Create a voice in 4/4 and add above notes\n const voice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)(smoVexVoiceParams);\n this.voiceAr.push(voice);\n }\n if (this.smoMeasure.repeatSymbol) {\n this.createRepeatSymbol();\n // Create a voice in 4/4 and add above notes\n const voice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)(smoVexVoiceParams);\n this.voiceAr.push(voice);\n }\n }\n // Need to format for x position, then set y position before drawing dynamics.\n this.formatter = new VF.Formatter({ softmaxFactor: this.softmax, globalSoftmax: false });\n this.formatter.joinVoices(this.voiceAr);\n if (this.tabStave) {\n this.tabVoice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)({\n actualBeats: this.smoMeasure.timeSignature.actualBeats,\n beatDuration: this.smoMeasure.timeSignature.beatDuration,\n notes: this.tabNotes\n });\n this.formatter.joinVoices([this.tabVoice]);\n }\n }\n /**\n * Create the Vex formatter that calculates the X and Y positions of the notes. A formatter\n * may actually span multiple staves for justified staves. The notes are drawn in their\n * individual vxMeasure objects but formatting is done once for all justified staves\n * @param voices Voice objects from VexFlow\n * @returns\n */\n format(voices) {\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n if (this.smoMeasure.svg.multimeasureLength > 0) {\n this.multimeasureRest = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getMultimeasureRest)(this.smoMeasure.svg.multimeasureLength);\n this.multimeasureRest.setContext(this.context.getContext());\n this.multimeasureRest.setStave(this.stave);\n return;\n }\n if (!this.formatter) {\n return;\n }\n const timestamp = new Date().valueOf();\n const staffWidth = this.smoMeasure.staffWidth -\n (this.smoMeasure.svg.maxColumnStartX + this.smoMeasure.svg.adjRight + this.smoMeasure.format.padLeft) - 10;\n this.dbgLeftX = this.smoMeasure.staffX + this.smoMeasure.format.padLeft + this.smoMeasure.svg.adjX;\n this.dbgWidth = staffWidth;\n this.formatter.format(voices, staffWidth);\n if (this.tabVoice && this.tabNotes.length) {\n this.formatter.format([this.tabVoice], staffWidth);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.FORMAT, new Date().valueOf() - timestamp);\n }\n /**\n * render is called after format. Actually draw the things.\n */\n render() {\n var _a;\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n var group = this.context.getContext().openGroup();\n var mmClass = this.smoMeasure.getClassId();\n var j = 0;\n try {\n // bound each measure in its own SVG group for easy deletion and mapping to screen coordinate\n group.classList.add(this.smoMeasure.id);\n group.classList.add(mmClass);\n group.id = this.smoMeasure.id;\n this.stave.draw();\n this.smoMeasure.svg.element = group;\n for (j = 0; j < this.voiceAr.length; ++j) {\n this.voiceAr[j].draw(this.context.getContext(), this.stave);\n }\n this.vexBeamGroups.forEach((b) => {\n b.setContext(this.context.getContext()).draw();\n });\n this.vexTuplets.forEach((tuplet) => {\n tuplet.setContext(this.context.getContext()).draw();\n });\n if (this.multimeasureRest) {\n this.multimeasureRest.draw();\n }\n // this._updateLyricDomSelectors();\n this.renderDynamics();\n // this.smoMeasure.adjX = this.stave.start_x - (this.smoMeasure.staffX);\n this.context.getContext().closeGroup();\n if (this.tabStave) {\n const tabStaveId = `${this.smoMeasure.id}-tab`;\n const tabGroup = this.context.getContext().openGroup();\n tabGroup.classList.add(tabStaveId);\n this.tabStave.draw();\n (_a = this.tabVoice) === null || _a === void 0 ? void 0 : _a.draw(this.context.getContext(), this.tabStave);\n this.context.getContext().closeGroup();\n this.smoMeasure.svg.tabElement = tabGroup;\n }\n // layoutDebug.setTimestamp(layoutDebug.codeRegions.RENDER, new Date().valueOf() - timestamp);\n this.rendered = true;\n if (_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.mask & _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.values['adjust']) {\n _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.debugBoxNoText(this.context.getContext().svg, _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.boxPoints(this.dbgLeftX, this.smoMeasure.svg.staffY, this.dbgWidth, 40), 'render-x-dbg', 0);\n }\n }\n catch (exc) {\n console.warn('unable to render measure ' + this.smoMeasure.measureNumber.measureIndex);\n this.context.getContext().closeGroup();\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEVBQUUsRUFBRSxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3JlbmRlci92ZXgvdnhNZWFzdXJlLnRzP2NjMTEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gW1Ntb29zaWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BYXJvbkRhdmlkTmV3bWFuL1Ntb29zaWMpXHJcbi8vIENvcHlyaWdodCAoYykgQWFyb24gRGF2aWQgTmV3bWFuIDIwMjEuXHJcbi8vICMjIERlc2NyaXB0aW9uOlxyXG4vLyBUaGlzIGZpbGUgY2FsbHMgdGhlIHZleGZsb3cgcm91dGluZXMgdGhhdCBhY3R1YWxseSByZW5kZXIgYVxyXG4vLyBtZWFzdXJlIG9mIG11c2ljLiAgSWYgbXVsdGlwbGUgbWVhc3VyZXMgYXJlIGp1c3RpZmllZCBpbiBhXHJcbi8vIGNvbHVtbiwgdGhlIHJlbmRlcmluZyBpcyBkZWZlcnJlZCB1bnRpbCBhbGwgdGhlIG1lYXN1cmVzIGhhdmUgYmVlblxyXG4vLyBwcmVmb3JtYXR0ZWQuXHJcbmltcG9ydCB7IFNtb05vdGUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9ub3RlJztcclxuaW1wb3J0IHsgU21vTXVzaWMgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tdXNpYyc7XHJcbmltcG9ydCB7IGxheW91dERlYnVnIH0gZnJvbSAnLi4vc3VpL2xheW91dERlYnVnJztcclxuaW1wb3J0IHsgU21vUmVwZWF0U3ltYm9sLCBTbW9NZWFzdXJlVGV4dCwgU21vQmFybGluZSwgU21vTWVhc3VyZU1vZGlmaWVyQmFzZSwgU21vUmVoZWFyc2FsTWFyayB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL21lYXN1cmVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTb3VyY2VTZXJpZlByb0ZvbnQgfSBmcm9tICcuLi8uLi9zdHlsZXMvZm9udF9tZXRyaWNzL3NzcC1zZXJpZi1tZXRyaWNzJztcclxuaW1wb3J0IHsgU21vT3JuYW1lbnQsIFNtb0FydGljdWxhdGlvbiwgU21vRHluYW1pY1RleHQsIFNtb0x5cmljLCBcclxuICBTbW9BcnBlZ2dpbywgU21vTm90ZU1vZGlmaWVyQmFzZSwgVmV4QW5ub3RhdGlvblBhcmFtcywgU21vVGFiTm90ZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL25vdGVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9TZWxlY3Rpb24gfSBmcm9tICcuLi8uLi9zbW8veGZvcm0vc2VsZWN0aW9ucyc7XHJcbmltcG9ydCB7IFNtb01lYXN1cmUsIE1lYXN1cmVUaWNrbWFwcyB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL21lYXN1cmUnO1xyXG5pbXBvcnQgeyBTdmdIZWxwZXJzIH0gZnJvbSAnLi4vc3VpL3N2Z0hlbHBlcnMnO1xyXG5pbXBvcnQgeyBDbGVmLCBJc0NsZWYgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTdmdQYWdlIH0gZnJvbSAnLi4vc3VpL3N2Z1BhZ2VNYXAnO1xyXG5pbXBvcnQgeyBTbW9UYWJTdGF2ZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3N0YWZmTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgdG9WZXhCYXJsaW5lVHlwZSwgdmV4QmFybGluZVR5cGUsIHZleEJhcmxpbmVQb3NpdGlvbiwgdG9WZXhCYXJsaW5lUG9zaXRpb24sIHRvVmV4U3ltYm9sLFxyXG4gIHRvVmV4VGV4dEp1c3RpZmljYXRpb24sIHRvVmV4VGV4dFBvc2l0aW9uLCBnZXRWZXhDaG9yZEJsb2NrcywgdG9WZXhTdGVtRGlyZWN0aW9uLFxyXG4gIFZleFRhYk5vdGVQb3NpdGlvbnMgfSBmcm9tICcuL3Ntb0FkYXB0ZXInO1xyXG5pbXBvcnQgeyBWZXhGbG93LCBTdGF2ZSxTdGVtbWFibGVOb3RlLCBOb3RlLCBCZWFtLCBUdXBsZXQsIFZvaWNlLFxyXG4gIEZvcm1hdHRlciwgQWNjaWRlbnRhbCwgQW5ub3RhdGlvbiwgU3RhdmVOb3RlU3RydWN0LCBTdGF2ZVRleHQsIFN0YXZlTW9kaWZpZXIsXHJcbiAgY3JlYXRlU3RhdmVUZXh0LCByZW5kZXJEeW5hbWljcywgYXBwbHlTdGVtRGlyZWN0aW9uLFxyXG4gIGdldFZleE5vdGVQYXJhbWV0ZXJzLCBkZWZhdWx0Tm90ZVNjYWxlLCBkZWZhdWx0Q3VlU2NhbGUsIGdldFZleFR1cGxldHMsXHJcbiAgY3JlYXRlU3RhdmUsIGNyZWF0ZVZvaWNlLCBnZXRPcm5hbWVudEdseXBoLCBnZXRTbGFzaEdseXBoLCBnZXRSZXBlYXRCYXIsIGdldE11bHRpbWVhc3VyZVJlc3QsXHJcbiAgY3JlYXRlVGV4dE5vdGUsIFRhYlN0YXZlLCBjcmVhdGVUYWJTdGF2ZSwgVGFiTm90ZVBvc2l0aW9uLCBUYWJOb3RlU3RydWN0LFxyXG4gIENyZWF0ZVZleE5vdGVQYXJhbXMsIFRhYk5vdGUsIFBlZGFsTWFya2luZ1xyXG4gICB9IGZyb20gJy4uLy4uL2NvbW1vbi92ZXgnO1xyXG5cclxuaW1wb3J0IHsgVnhNZWFzdXJlSWYsIFZleE5vdGVNb2RpZmllcklmLCBWeE5vdGUgfSBmcm9tICcuL3Z4Tm90ZSc7XHJcbmltcG9ydCB7IFNtb1R1cGxldCB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL3R1cGxldCc7XHJcbmltcG9ydCB7IHZleEdseXBoIH0gZnJvbSAnLi9nbHlwaERpbWVuc2lvbnMnO1xyXG5jb25zdCBWRiA9IFZleEZsb3c7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcbi8vIGNvbnN0IFZGID0gZXZhbCgnVmV4LkZsb3cnKTtcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIFZleEZsb3cgbGlicmFyeSB0aGF0IGFjdHVhbGx5IGRvZXMgdGhlIGVuZ3JhdmluZy5cclxuICogQGNhdGVnb3J5IFN1aVJlbmRlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFZ4TWVhc3VyZSBpbXBsZW1lbnRzIFZ4TWVhc3VyZUlmIHtcclxuICBjb250ZXh0OiBTdmdQYWdlO1xyXG4gIHByaW50aW5nOiBib29sZWFuO1xyXG4gIHNlbGVjdGlvbjogU21vU2VsZWN0aW9uO1xyXG4gIHNvZnRtYXg6IG51bWJlcjtcclxuICBzbW9NZWFzdXJlOiBTbW9NZWFzdXJlO1xyXG4gIHNtb1RhYlN0YXZlPzogU21vVGFiU3RhdmU7XHJcbiAgdGFiU3RhdmU/OiBUYWJTdGF2ZTtcclxuICByZW5kZXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG5vdGVUb1ZleE1hcDogUmVjb3JkPHN0cmluZywgTm90ZT4gPSB7fTtcclxuICBiZWFtVG9WZXhNYXA6IFJlY29yZDxzdHJpbmcsIEJlYW0+ID0ge307XHJcbiAgdHVwbGV0VG9WZXhNYXA6IFJlY29yZDxzdHJpbmcsIFR1cGxldD4gPSB7fTtcclxuICBtdWx0aW1lYXN1cmVSZXN0OiBhbnkgfCBudWxsID0gbnVsbDtcclxuICB2ZXhOb3RlczogTm90ZVtdID0gW107XHJcbiAgdmV4QmVhbUdyb3VwczogQmVhbVtdID0gW107XHJcbiAgdmV4VHVwbGV0czogVHVwbGV0W10gPSBbXTtcclxuICB0aWNrbWFwT2JqZWN0OiBNZWFzdXJlVGlja21hcHMgfCBudWxsID0gbnVsbDtcclxuICBzdGF2ZTogU3RhdmUgfCBudWxsID0gbnVsbDsgLy8gdmV4IHN0YXZlXHJcbiAgdm9pY2VOb3RlczogTm90ZVtdID0gW107IC8vIG5vdGVzIGZvciBjdXJyZW50IHZvaWNlLCBhcyByZW5kZXJpbmdcclxuICB0YWJOb3RlczogTm90ZVtdID0gW107XHJcbiAgdm9pY2VBcjogVm9pY2VbXSA9IFtdO1xyXG4gIHRhYlZvaWNlOiBWb2ljZSB8IG51bGwgPSBudWxsO1xyXG4gIGZvcm1hdHRlcjogRm9ybWF0dGVyIHwgbnVsbCA9IG51bGw7XHJcbiAgYWxsQ3VlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1vZGlmaWVyc1RvQm94OiBTbW9Ob3RlTW9kaWZpZXJCYXNlW10gPSBbXTtcclxuICBjb2xsaXNpb25NYXA6IFJlY29yZDxudW1iZXIsIFNtb05vdGVbXT4gPSB7fTtcclxuICBkYmdMZWZ0WDogbnVtYmVyID0gMDtcclxuICBkYmdXaWR0aDogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dDogU3ZnUGFnZSwgc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb24sIHByaW50aW5nOiBib29sZWFuLCBzb2Z0bWF4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICB0aGlzLnJlbmRlcmVkID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjtcclxuICAgIHRoaXMuc21vTWVhc3VyZSA9IHRoaXMuc2VsZWN0aW9uLm1lYXN1cmU7XHJcbiAgICB0aGlzLnByaW50aW5nID0gcHJpbnRpbmc7XHJcbiAgICB0aGlzLmFsbEN1ZXMgPSBzZWxlY3Rpb24uc3RhZmYucGFydEluZm8uZGlzcGxheUN1ZXM7XHJcbiAgICB0aGlzLnR1cGxldFRvVmV4TWFwID0ge307XHJcbiAgICB0aGlzLnZleE5vdGVzID0gW107XHJcbiAgICB0aGlzLnZleEJlYW1Hcm91cHMgPSBbXTtcclxuICAgIHRoaXMudmV4QmVhbUdyb3VwcyA9IFtdO1xyXG4gICAgdGhpcy5iZWFtVG9WZXhNYXAgPSB7fTtcclxuICAgIHRoaXMuc29mdG1heCA9IHNvZnRtYXg7XHJcbiAgICB0aGlzLnNtb1RhYlN0YXZlID0gc2VsZWN0aW9uLnN0YWZmLmdldFRhYlN0YXZlRm9yTWVhc3VyZShzZWxlY3Rpb24uc2VsZWN0b3IpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldCBmaWxsU3R5bGUoKSB7XHJcbiAgICByZXR1cm4gJyMwMDAnO1xyXG4gIH1cclxuICAvLyBUcmVhdCBhIHJlc3QgbGlrZSBhIHdob2xlIHJlc3QgaWYgdGhlcmUgaXMgb25seSBhIHNpbmdsZSByZXN0IGluIHRoZSBtZWFzdXJlXHJcbiAgLy8gYW5kIHRoZSBtZWFzdXJlIGxlbmd0aCBpcyBub3QgYSBwaWNrdXBcclxuICBpc1dob2xlUmVzdCgpIHtcclxuICAgIHJldHVybiAodGhpcy5zbW9NZWFzdXJlLnZvaWNlcy5sZW5ndGggPT09IDEgJiZcclxuICAgICAgdGhpcy5zbW9NZWFzdXJlLnZvaWNlc1swXS5ub3Rlcy5sZW5ndGggPT09IDEgJiZcclxuICAgICAgdGhpcy5zbW9NZWFzdXJlLnZvaWNlc1swXS5ub3Rlc1swXS5pc1Jlc3QoKSAmJlxyXG4gICAgICB0aGlzLnNtb01lYXN1cmUuZ2V0TWF4VGlja3NWb2ljZSgpID4gNDA5NlxyXG4gICAgICApO1xyXG4gIH1cclxuICBjcmVhdGVDb2xsaXNpb25UaWNrbWFwKCkge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IGogPSAwO1xyXG4gICAgaWYgKCF0aGlzLnRpY2ttYXBPYmplY3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc21vTWVhc3VyZS52b2ljZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgdG0gPSB0aGlzLnRpY2ttYXBPYmplY3QudGlja21hcHNbaV07XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCB0bS5kdXJhdGlvbk1hcC5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGlmICh0eXBlb2YodGhpcy5jb2xsaXNpb25NYXBbdG0uZHVyYXRpb25NYXBbal1dKSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgIHRoaXMuY29sbGlzaW9uTWFwW3RtLmR1cmF0aW9uTWFwW2pdXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbGxpc2lvbk1hcFt0bS5kdXJhdGlvbk1hcFtqXV0ucHVzaCh0aGlzLnNtb01lYXN1cmUudm9pY2VzW2ldLm5vdGVzW2pdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBpc0NvbGxpc2lvbih2b2ljZUl4OiBudW1iZXIsIHRpY2tJeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBsZXQgayA9IDA7XHJcbiAgICBsZXQgc3RhZmZMaW5lczogbnVtYmVyW10gPSBbXTtcclxuICAgIGlmICghdGhpcy50aWNrbWFwT2JqZWN0KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRpY2sgPSB0aGlzLnRpY2ttYXBPYmplY3QudGlja21hcHNbdm9pY2VJeF0uZHVyYXRpb25NYXBbdGlja0l4XTtcclxuICAgIC8vIEp1c3Qgb25lIG5vdGUsIG5vIGNvbGxpc2lvblxyXG4gICAgaWYgKHRoaXMuY29sbGlzaW9uTWFwW3RpY2tdLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuY29sbGlzaW9uTWFwW3RpY2tdLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG5vdGUgPSB0aGlzLmNvbGxpc2lvbk1hcFt0aWNrXVtpXTtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IG5vdGUucGl0Y2hlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGNvbnN0IGNsZWY6IENsZWYgPSBJc0NsZWYobm90ZS5jbGVmKSA/IG5vdGUuY2xlZiA6ICd0cmVibGUnO1xyXG4gICAgICAgIGNvbnN0IHBpdGNoID0gbm90ZS5waXRjaGVzW2pdO1xyXG4gICAgICAgIGNvbnN0IGN1ckxpbmUgPSBTbW9NdXNpYy5waXRjaFRvU3RhZmZMaW5lKGNsZWYsIHBpdGNoKTtcclxuICAgICAgICBmb3IgKGsgPSAwO2sgPCBzdGFmZkxpbmVzLmxlbmd0aDsgKytrKSB7XHJcbiAgICAgICAgICBpZiAoTWF0aC5hYnMoY3VyTGluZSAtIHN0YWZmTGluZXNba10pIDwgMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgc3RhZmZMaW5lcy5wdXNoKGN1ckxpbmUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBjb252ZXJ0IGEgc21vTm90ZSBpbnRvIGEgdnhOb3RlIHNvIGl0IGNhbiBiZSByYXN0ZXJpemVkXHJcbiAgICogQHBhcmFtIHNtb05vdGUgXHJcbiAgICogQHBhcmFtIHRpY2tJbmRleCAtIHVzZWQgdG8gY2FsY3VsYXRlIGFjY2lkZW50YWxcclxuICAgKiBAcGFyYW0gdm9pY2VJeCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBjcmVhdGVWZXhOb3RlKHNtb05vdGU6IFNtb05vdGUsIHRpY2tJbmRleDogbnVtYmVyLCB2b2ljZUl4OiBudW1iZXIpIHtcclxuICAgIGxldCB2ZXhOb3RlOiBOb3RlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBsZXQgc21vVGFiTm90ZTogU21vVGFiTm90ZSB8IG51bGwgPSBudWxsO1xyXG4gICAgbGV0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudmFsdWVPZigpO1xyXG4gICAgY29uc3Qgc3RlbVRpY2tzID0gU21vTXVzaWMudGlja3NUb0R1cmF0aW9uW3Ntb05vdGUuc3RlbVRpY2tzXTtcclxuICAgIGxldCB0YWJOb3RlOiBTdGVtbWFibGVOb3RlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBjb25zdCBub3RlSGVhZCA9IHNtb05vdGUuaXNSZXN0KCkgPyAncicgOiBzbW9Ob3RlLm5vdGVIZWFkO1xyXG4gICAgY29uc3Qga2V5cyA9IFNtb011c2ljLnNtb1BpdGNoZXNUb1ZleEtleXMoc21vTm90ZS5waXRjaGVzLCAwLCBub3RlSGVhZCk7XHJcbiAgICBjb25zdCBzbW9Ob3RlUGFyYW1zID0ge1xyXG4gICAgICBpc1R1cGxldDogc21vTm90ZS5pc1R1cGxldCxcclxuICAgICAgbWVhc3VyZUluZGV4OiB0aGlzLnNtb01lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXgsXHJcbiAgICAgIGNsZWY6IHNtb05vdGUuY2xlZixcclxuICAgICAgc3RlbVRpY2tzLFxyXG4gICAgICBrZXlzLFxyXG4gICAgICBub3RlVHlwZTogc21vTm90ZS5ub3RlVHlwZSxcclxuICAgICAgaXNDdWU6IHNtb05vdGUuaXNDdWVcclxuICAgIH07XHJcbiAgICBjb25zdCB7IG5vdGVQYXJhbXMsIGR1cmF0aW9uIH0gPSBnZXRWZXhOb3RlUGFyYW1ldGVycyhzbW9Ob3RlUGFyYW1zKTtcclxuICAgIGlmICh0aGlzLnRhYlN0YXZlICYmIHRoaXMuc21vVGFiU3RhdmUpIHtcclxuICAgICAgc21vVGFiTm90ZSA9IHRoaXMuc21vVGFiU3RhdmUuZ2V0VGFiTm90ZUZyb21Ob3RlKHNtb05vdGUsIHRoaXMuc21vTWVhc3VyZS50cmFuc3Bvc2VJbmRleCk7XHJcbiAgICAgIGlmIChzbW9UYWJOb3RlKSB7XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25zOiBUYWJOb3RlUG9zaXRpb25bXSA9IFZleFRhYk5vdGVQb3NpdGlvbnModGhpcy5zbW9UYWJTdGF2ZSwgc21vVGFiTm90ZSwgc21vTm90ZSk7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgIGlmICghc21vTm90ZS5pc1Jlc3QoKSkge1xyXG4gICAgICAgICAgICB0YWJOb3RlID0gbmV3IFZGLlRhYk5vdGUoeyBwb3NpdGlvbnMsIGR1cmF0aW9uOiBkdXJhdGlvbiB9KTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc21vVGFiU3RhdmUuc2hvd1N0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgdGFiTm90ZS5yZW5kZXJfb3B0aW9ucy5kcmF3X3N0ZW0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRhYk5vdGUucmVuZGVyX29wdGlvbnMuZHJhd19kb3RzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0YWJOb3RlLnJlbmRlcl9vcHRpb25zLmRyYXdfc3RlbV90aHJvdWdoX3N0YXZlID0gc21vVGFiTm90ZS5mbGFnVGhyb3VnaDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGFiTm90ZSA9IG5ldyBWRi5TdGF2ZU5vdGUobm90ZVBhcmFtcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoc21vTm90ZS5ub3RlVHlwZSA9PT0gJy8nKSB7XHJcbiAgICAgIC8vIHZleE5vdGUgPSBuZXcgVkYuR2x5cGhOb3RlKCdcXHVFNTA0JywgeyBkdXJhdGlvbiB9KTtcclxuICAgICAgdmV4Tm90ZSA9IGdldFNsYXNoR2x5cGgoKTtcclxuICAgICAgc21vTm90ZS5yZW5kZXJJZCA9ICd2Zi0nICsgdmV4Tm90ZS5nZXRBdHRyaWJ1dGUoJ2lkJyk7IC8vIHdoZXJlIGRvZXMgJ3ZmJyBjb21lIGZyb20/XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBzbW9WZXhTdGVtUGFyYW1zID0ge1xyXG4gICAgICAgIHZvaWNlQ291bnQ6IHRoaXMuc21vTWVhc3VyZS52b2ljZXMubGVuZ3RoLFxyXG4gICAgICAgIHZvaWNlSXgsXHJcbiAgICAgICAgaXNBdXRvOiBzbW9Ob3RlLmZsYWdTdGF0ZSA9PT0gU21vTm90ZS5mbGFnU3RhdGVzLmF1dG8sXHJcbiAgICAgICAgaXNVcDogc21vTm90ZS5mbGFnU3RhdGUgPT09IFNtb05vdGUuZmxhZ1N0YXRlcy51cFxyXG4gICAgICB9XHJcbiAgICAgIGFwcGx5U3RlbURpcmVjdGlvbihzbW9WZXhTdGVtUGFyYW1zLCBub3RlUGFyYW1zKTtcclxuICAgICAgaWYgKHNtb1RhYk5vdGUgJiYgdGFiTm90ZSkge1xyXG4gICAgICAgIHRhYk5vdGUuc2V0U3RlbURpcmVjdGlvbihub3RlUGFyYW1zLnN0ZW1fZGlyZWN0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICBsYXlvdXREZWJ1Zy5zZXRUaW1lc3RhbXAobGF5b3V0RGVidWcuY29kZVJlZ2lvbnMuUFJFRk9STUFUQSwgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSB0aW1lc3RhbXApO1xyXG4gICAgICB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnZhbHVlT2YoKTtcclxuICAgICAgdmV4Tm90ZSA9IG5ldyBWRi5TdGF2ZU5vdGUobm90ZVBhcmFtcyk7XHJcbiAgICAgIGlmICh2b2ljZUl4ID4gMCAmJiB0aGlzLmlzQ29sbGlzaW9uKHZvaWNlSXgsIHRpY2tJbmRleCkpIHtcclxuICAgICAgICB2ZXhOb3RlLnNldFhTaGlmdCgtMTApO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmlzV2hvbGVSZXN0KCkpIHtcclxuICAgICAgICBub3RlUGFyYW1zLmR1cmF0aW9uID0gJ3dyJztcclxuICAgICAgICB2ZXhOb3RlID0gbmV3IFZGLlN0YXZlTm90ZShub3RlUGFyYW1zKTtcclxuICAgICAgICB2ZXhOb3RlLnNldENlbnRlckFsaWdubWVudCh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICBsYXlvdXREZWJ1Zy5zZXRUaW1lc3RhbXAobGF5b3V0RGVidWcuY29kZVJlZ2lvbnMuUFJFRk9STUFUQiwgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSB0aW1lc3RhbXApO1xyXG4gICAgICB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnZhbHVlT2YoKTtcclxuICAgICAgaWYgKHNtb05vdGUuZmlsbFN0eWxlICYmICF0aGlzLnByaW50aW5nKSB7XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRTdHlsZSh7IGZpbGxTdHlsZTogc21vTm90ZS5maWxsU3R5bGUgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodm9pY2VJeCA+IDAgJiYgIXRoaXMucHJpbnRpbmcpIHtcclxuICAgICAgICB2ZXhOb3RlLnNldFN0eWxlKHsgZmlsbFN0eWxlOiBcIiMxMTU1MTFcIiB9KTtcclxuICAgICAgfSBlbHNlIGlmIChzbW9Ob3RlLmlzSGlkZGVuKCkgJiYgdGhpcy5wcmludGluZykge1xyXG4gICAgICAgIHZleE5vdGUuc2V0U3R5bGUoeyBmaWxsU3R5bGU6IFwiI2ZmZmZmZjAwXCIgfSk7XHJcbiAgICAgIH1cclxuICAgICAgc21vTm90ZS5yZW5kZXJJZCA9ICd2Zi0nICsgdmV4Tm90ZS5nZXRBdHRyaWJ1dGUoJ2lkJyk7IC8vIHdoZXJlIGRvZXMgJ3ZmJyBjb21lIGZyb20/XHJcbiAgICB9XHJcbiAgICBjb25zdCBub3RlRGF0YTogVmV4Tm90ZU1vZGlmaWVySWYgPSB7XHJcbiAgICAgIHNtb01lYXN1cmU6IHRoaXMuc21vTWVhc3VyZSxcclxuICAgICAgdnhNZWFzdXJlOiB0aGlzLFxyXG4gICAgICBzbW9Ob3RlOiBzbW9Ob3RlLFxyXG4gICAgICBzdGF2ZU5vdGU6IHZleE5vdGUsXHJcbiAgICAgIHZvaWNlSW5kZXg6IHZvaWNlSXgsXHJcbiAgICAgIHRpY2tJbmRleDogdGlja0luZGV4XHJcbiAgICB9XHJcbiAgICBpZiAodGFiTm90ZSkge1xyXG4gICAgICBub3RlRGF0YS50YWJOb3RlID0gdGFiTm90ZTtcclxuICAgICAgdGhpcy50YWJOb3Rlcy5wdXNoKHRhYk5vdGUpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbW9kT2JqID0gbmV3IFZ4Tm90ZShub3RlRGF0YSk7XHJcbiAgICBtb2RPYmouYWRkTW9kaWZpZXJzKCk7XHJcbiAgICBsYXlvdXREZWJ1Zy5zZXRUaW1lc3RhbXAobGF5b3V0RGVidWcuY29kZVJlZ2lvbnMuUFJFRk9STUFUQywgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSB0aW1lc3RhbXApO1xyXG5cclxuICAgIHJldHVybiBtb2RPYmo7XHJcbiAgfVxyXG5cclxuICByZW5kZXJOb3RlR2x5cGgoc21vTm90ZTogU21vTm90ZSwgdGV4dE9iajogU21vRHluYW1pY1RleHQpIHtcclxuICAgIHZhciB4ID0gdGhpcy5ub3RlVG9WZXhNYXBbc21vTm90ZS5hdHRycy5pZF0uZ2V0QWJzb2x1dGVYKCkgKyB0ZXh0T2JqLnhPZmZzZXQ7XHJcbiAgICAvLyB0aGUgLTMgaXMgY29waWVkIGZyb20gdmV4ZmxvdyB0ZXh0RHluYW1pY3NcclxuICAgIHZhciB5ID0gdGhpcy5zdGF2ZSEuZ2V0WUZvckxpbmUodGV4dE9iai55T2Zmc2V0TGluZSAtIDMpICsgdGV4dE9iai55T2Zmc2V0UGl4ZWxzO1xyXG4gICAgbGV0IG1heGggPSAwO1xyXG4gICAgY29uc3QgbWlueCA9IHg7XHJcbiAgICB2YXIgZ3JvdXAgPSB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLm9wZW5Hcm91cCgpO1xyXG4gICAgZ3JvdXAuY2xhc3NMaXN0LmFkZCh0ZXh0T2JqLmF0dHJzLmlkICsgJy0nICsgc21vTm90ZS5hdHRycy5pZCk7XHJcbiAgICBncm91cC5jbGFzc0xpc3QuYWRkKHRleHRPYmouYXR0cnMuaWQpO1xyXG4gICAgLy8gY29uc3QgZHVyYXRpb24gPSBTbW9NdXNpYy5jbG9zZXN0VmV4RHVyYXRpb24oc21vTm90ZS50aWNrQ291bnQpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0T2JqLnRleHQubGVuZ3RoOyBpICs9IDEgKSB7XHJcbiAgICAgIGNvbnN0IHsgd2lkdGggLCBoZWlnaHQgfSA9IHJlbmRlckR5bmFtaWNzKHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCksIFZGLlRleHREeW5hbWljcy5HTFlQSFNbdGV4dE9iai50ZXh0W2ldXS5jb2RlLFxyXG4gICAgICAgIHRleHRPYmouZm9udFNpemUsIHgsIHkpO1xyXG4gICAgICAvKiBjb25zdCB7IHdpZHRoICwgaGVpZ2h0IH0gPSByZW5kZXJEeW5hbWljcyh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLCBWRi5UZXh0RHluYW1pY3MuR0xZUEhTW3RleHRPYmoudGV4dFtpXV0sXHJcbiAgICAgICAgdGV4dE9iai5mb250U2l6ZSwgeCwgeSk7ICovXHJcbiAgICAgIHggKz0gd2lkdGg7XHJcbiAgICAgIG1heGggPSBNYXRoLm1heChoZWlnaHQsIG1heGgpOyAgICAgIFxyXG4gICAgfVxyXG4gICAgdGV4dE9iai5sb2dpY2FsQm94ID0gU3ZnSGVscGVycy5ib3hQb2ludHMobWlueCwgeSArIHRoaXMuY29udGV4dC5ib3gueSwgeCAtIG1pbngsIG1heGgpO1xyXG4gICAgdGV4dE9iai5lbGVtZW50ID0gZ3JvdXA7XHJcbiAgICB0aGlzLm1vZGlmaWVyc1RvQm94LnB1c2godGV4dE9iaik7XHJcbiAgICB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLmNsb3NlR3JvdXAoKTtcclxuICB9XHJcblxyXG4gIHJlbmRlckR5bmFtaWNzKCkge1xyXG4gICAgdGhpcy5zbW9NZWFzdXJlLnZvaWNlcy5mb3JFYWNoKCh2b2ljZSkgPT4ge1xyXG4gICAgICB2b2ljZS5ub3Rlcy5mb3JFYWNoKChzbW9Ob3RlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbW9kcyA9IHNtb05vdGUudGV4dE1vZGlmaWVycy5maWx0ZXIoKG1vZCkgPT5cclxuICAgICAgICAgIG1vZC5hdHRycy50eXBlID09PSAnU21vRHluYW1pY1RleHQnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBtb2RzLmZvckVhY2goKGJ0bSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdG0gPSBidG0gYXMgU21vRHluYW1pY1RleHQ7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlck5vdGVHbHlwaChzbW9Ob3RlLCB0bSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGNyZWF0ZVJlcGVhdFN5bWJvbCgpIHtcclxuICAgIHRoaXMudm9pY2VOb3RlcyA9IFtdO1xyXG4gICAgLy8gY29uc3QgdmV4Tm90ZSA9IG5ldyBWRi5HbHlwaE5vdGUoJ1xcdUU1MDAnLCB7IGR1cmF0aW9uOiAndycgfSwgeyBsaW5lOiAyIH0pO1xyXG4gICAgY29uc3QgdmV4Tm90ZSA9IGdldFJlcGVhdEJhcigpO1xyXG4gICAgdmV4Tm90ZS5zZXRDZW50ZXJBbGlnbm1lbnQodHJ1ZSk7XHJcbiAgICB0aGlzLnZleE5vdGVzLnB1c2godmV4Tm90ZSk7XHJcbiAgICB0aGlzLnZvaWNlTm90ZXMucHVzaCh2ZXhOb3RlKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogY3JlYXRlIGFuIGEgYXJyYXkgb2YgVkYuU3RhdmVOb3RlIG9iamVjdHMgdG8gcmVuZGVyIHRoZSBhY3RpdmUgdm9pY2UuXHJcbiAgICogQHBhcmFtIHZvaWNlSXggXHJcbiAgICovXHJcbiAgY3JlYXRlVmV4Tm90ZXModm9pY2VJeDogbnVtYmVyKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICB0aGlzLnZvaWNlTm90ZXMgPSBbXTtcclxuICAgIGNvbnN0IHZvaWNlID0gdGhpcy5zbW9NZWFzdXJlLnZvaWNlc1t2b2ljZUl4XTtcclxuICAgIGxldCBjbGVmTm90ZUFkZGVkID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChpID0gMDtcclxuICAgICAgaSA8IHZvaWNlLm5vdGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHNtb05vdGUgPSB2b2ljZS5ub3Rlc1tpXTtcclxuICAgICAgY29uc3QgdGV4dE5vdGVzID0gc21vTm90ZS5nZXRUZXh0T3JuYW1lbnRzKCk7XHJcbiAgICAgIGNvbnN0IHZleE5vdGUgPSB0aGlzLmNyZWF0ZVZleE5vdGUoc21vTm90ZSwgaSwgdm9pY2VJeCk7XHJcbiAgICAgIHRoaXMubm90ZVRvVmV4TWFwW3Ntb05vdGUuYXR0cnMuaWRdID0gdmV4Tm90ZS5ub3RlRGF0YS5zdGF2ZU5vdGU7XHJcbiAgICAgIHRoaXMudmV4Tm90ZXMucHVzaCh2ZXhOb3RlLm5vdGVEYXRhLnN0YXZlTm90ZSk7XHJcblxyXG4gICAgICBpZiAodmV4Tm90ZS5ub3RlRGF0YS5zbW9Ob3RlLmNsZWZOb3RlICYmICFjbGVmTm90ZUFkZGVkKSB7XHJcbiAgICAgICAgY29uc3QgY2YgPSBuZXcgVkYuQ2xlZk5vdGUodmV4Tm90ZS5ub3RlRGF0YS5zbW9Ob3RlLmNsZWZOb3RlLmNsZWYsICdzbWFsbCcpO1xyXG4gICAgICAgIHRoaXMudm9pY2VOb3Rlcy5wdXNoKGNmKTtcclxuICAgICAgICBjbGVmTm90ZUFkZGVkID0gdHJ1ZTsgLy8gaWdub3JlIDJuZCBpbiBhIG1lYXN1cmVcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnZvaWNlTm90ZXMucHVzaCh2ZXhOb3RlLm5vdGVEYXRhLnN0YXZlTm90ZSk7XHJcbiAgICAgIHRleHROb3Rlcy5mb3JFYWNoKCh0bikgPT4ge1xyXG4gICAgICAgIHRoaXMudm9pY2VOb3Rlcy5wdXNoKGNyZWF0ZVRleHROb3RlKFNtb09ybmFtZW50LnRleHROb3RlT3JuYW1lbnRzW3RuLm9ybmFtZW50XSkpO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKGlzTmFOKHNtb05vdGUudGlja3MubnVtZXJhdG9yKSB8fCBpc05hTihzbW9Ob3RlLnRpY2tzLmRlbm9taW5hdG9yKVxyXG4gICAgICAgIHx8IGlzTmFOKHNtb05vdGUudGlja3MucmVtYWluZGVyKSkge1xyXG4gICAgICAgIHRocm93ICgndnhNZWFzdXJlOiBOYU4gaW4gdGlja3MnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR3JvdXAgdGhlIG5vdGVzIGZvciBiZWFtaW5nIGFuZCBjcmVhdGUgVmV4IGJlYW0gb2JqZWN0c1xyXG4gICAqIEBwYXJhbSB2aXggLSB2b2ljZSBpbmRleFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGNyZWF0ZVZleEJlYW1Hcm91cHModml4OiBudW1iZXIpIHtcclxuICAgIGxldCBrZXlOb3RlSXggPSAtMTtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBqID0gMDtcclxuICAgIGxldCBzdGVtRGlyZWN0aW9uID0gVkYuU3RlbS5ET1dOO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc21vTWVhc3VyZS5iZWFtR3JvdXBzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IGJnID0gdGhpcy5zbW9NZWFzdXJlLmJlYW1Hcm91cHNbaV07XHJcbiAgICAgIGlmIChiZy52b2ljZSAhPT0gdml4KSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdmV4Tm90ZXM6IFN0ZW1tYWJsZU5vdGVbXSA9IFtdO1xyXG4gICAgICBrZXlOb3RlSXggPSBiZy5ub3Rlcy5maW5kSW5kZXgoKG5uKSA9PiBubi5ub3RlVHlwZSA9PT0gJ24nKTtcclxuXHJcbiAgICAgIC8vIEZpeCBzdGVtIGJ1Zzoga2V5IG9mZiBmaXJzdCBub24tcmVzdCBub3RlLlxyXG4gICAgICBrZXlOb3RlSXggPSAoa2V5Tm90ZUl4ID49IDApID8ga2V5Tm90ZUl4IDogMDtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IGJnLm5vdGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3Qgbm90ZSA9IGJnLm5vdGVzW2pdO1xyXG4gICAgICAgIGlmIChub3RlLm5vdGVUeXBlID09PSAnLycpIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB2ZXhOb3RlID0gdGhpcy5ub3RlVG9WZXhNYXBbbm90ZS5hdHRycy5pZF07XHJcbiAgICAgICAgLy8gc29tZSB0eXBlIG9mIHJlZHJhdyBjb25kaXRpb24/XHJcbiAgICAgICAgaWYgKCEodmV4Tm90ZSBpbnN0YW5jZW9mIFZGLlN0YXZlTm90ZSB8fCB2ZXhOb3RlIGluc3RhbmNlb2YgVkYuR3JhY2VOb3RlKSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobm90ZS50aWNrQ291bnQgPj0gNDA5NiB8fCB2ZXhOb3RlLmdldEludHJpbnNpY1RpY2tzKCkgPj0gNDA5Nikge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKCdiYWQgbGVuZ3RoIGluIGJlYW0gZ3JvdXAnKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGtleU5vdGVJeCA9PT0gaikge1xyXG4gICAgICAgICAgc3RlbURpcmVjdGlvbiA9IG5vdGUuZmxhZ1N0YXRlID09PSBTbW9Ob3RlLmZsYWdTdGF0ZXMuYXV0byA/XHJcbiAgICAgICAgICAgIHZleE5vdGUuZ2V0U3RlbURpcmVjdGlvbigpIDogdG9WZXhTdGVtRGlyZWN0aW9uKG5vdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2ZXhOb3RlLnNldFN0ZW1EaXJlY3Rpb24oc3RlbURpcmVjdGlvbik7XHJcbiAgICAgICAgdmV4Tm90ZXMucHVzaCh2ZXhOb3RlKTsgIFxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZleEJlYW0gPSBuZXcgVkYuQmVhbSh2ZXhOb3Rlcyk7XHJcbiAgICAgIHZleEJlYW0uYnJlYWtTZWNvbmRhcnlBdChiZy5zZWNvbmRhcnlCZWFtQnJlYWtzKTtcclxuICAgICAgdGhpcy5iZWFtVG9WZXhNYXBbYmcuYXR0cnMuaWRdID0gdmV4QmVhbTtcclxuICAgICAgdGhpcy52ZXhCZWFtR3JvdXBzLnB1c2godmV4QmVhbSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjcmVhdGVWZXhUdXBsZXRzKHZpeDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnZleFR1cGxldHMgPSBbXTtcclxuICAgIHRoaXMudHVwbGV0VG9WZXhNYXAgPSB7fTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zbW9NZWFzdXJlLnR1cGxldFRyZWVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHR1cGxldFRyZWUgPSB0aGlzLnNtb01lYXN1cmUudHVwbGV0VHJlZXNbaV07XHJcbiAgICAgIGlmICh0dXBsZXRUcmVlLnZvaWNlICE9PSB2aXgpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB0cmF2ZXJzZVR1cGxldFRyZWUgPSAoIHBhcmVudFR1cGxldDogU21vVHVwbGV0KTogdm9pZCA9PiB7XHJcbiAgICAgICAgY29uc3QgdmV4Tm90ZXM6IE5vdGVbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IHNtb05vdGUgb2YgdGhpcy5zbW9NZWFzdXJlLnR1cGxldE5vdGVzKHBhcmVudFR1cGxldCkpIHtcclxuICAgICAgICAgIHZleE5vdGVzLnB1c2godGhpcy5ub3RlVG9WZXhNYXBbc21vTm90ZS5hdHRycy5pZF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuc21vTWVhc3VyZS5nZXRTdGVtRGlyZWN0aW9uRm9yVHVwbGV0KHBhcmVudFR1cGxldCkgPT09IFNtb05vdGUuZmxhZ1N0YXRlcy51cCA/XHJcbiAgICAgICAgICBWRi5UdXBsZXQuTE9DQVRJT05fVE9QIDogVkYuVHVwbGV0LkxPQ0FUSU9OX0JPVFRPTTtcclxuICAgICAgICBjb25zdCBzbW9UdXBsZXRQYXJhbXMgPSB7XHJcbiAgICAgICAgICB2ZXhOb3RlcyxcclxuICAgICAgICAgIG51bU5vdGVzOiBwYXJlbnRUdXBsZXQubnVtTm90ZXMsXHJcbiAgICAgICAgICBub3Rlc09jY3VwaWVkOiBwYXJlbnRUdXBsZXQubm90ZXNPY2N1cGllZCxcclxuICAgICAgICAgIHJhdGlvZWQ6IHBhcmVudFR1cGxldC5yYXRpb2VkLFxyXG4gICAgICAgICAgYnJhY2tldGVkOiBwYXJlbnRUdXBsZXQuYnJhY2tldGVkLFxyXG4gICAgICAgICAgbG9jYXRpb25cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmV4VHVwbGV0ID0gZ2V0VmV4VHVwbGV0cyhzbW9UdXBsZXRQYXJhbXMpO1xyXG5cclxuICAgICAgICB0aGlzLnR1cGxldFRvVmV4TWFwW3BhcmVudFR1cGxldC5hdHRycy5pZF0gPSB2ZXhUdXBsZXQ7XHJcbiAgICAgICAgdGhpcy52ZXhUdXBsZXRzLnB1c2godmV4VHVwbGV0KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmVudFR1cGxldC5jaGlsZHJlblR1cGxldHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHR1cGxldCA9IHBhcmVudFR1cGxldC5jaGlsZHJlblR1cGxldHNbaV07XHJcbiAgICAgICAgICB0cmF2ZXJzZVR1cGxldFRyZWUodHVwbGV0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdHJhdmVyc2VUdXBsZXRUcmVlKHR1cGxldFRyZWUudHVwbGV0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNyZWF0ZSB0aGUgbW9kaWZpZXJzIGZvciB0aGUgc3RhdmUgaXRzZWxmLCBiYXIgbGluZXMgZXRjLlxyXG4gICAqL1xyXG4gIGNyZWF0ZU1lYXN1cmVNb2RpZmllcnMoKSB7XHJcbiAgICBjb25zdCBzYiA9IHRoaXMuc21vTWVhc3VyZS5nZXRTdGFydEJhcmxpbmUoKTtcclxuICAgIGNvbnN0IGViID0gdGhpcy5zbW9NZWFzdXJlLmdldEVuZEJhcmxpbmUoKTtcclxuICAgIGNvbnN0IHN5bSA9IHRoaXMuc21vTWVhc3VyZS5nZXRSZXBlYXRTeW1ib2woKTtcclxuICAgIGlmICghdGhpcy5zdGF2ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZG9uJ3QgY3JlYXRlIGEgYmVnaW4gYmFyIGZvciBhbnkgYnV0IHRoZSAxc3QgbWVhc3VyZS5cclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUubWVhc3VyZU51bWJlci5zeXN0ZW1JbmRleCAhPT0gMCAmJiBzYi5iYXJsaW5lID09PSBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhclxyXG4gICAgICAmJiB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQgPT09IDApIHtcclxuICAgICAgdGhpcy5zdGF2ZS5zZXRCZWdCYXJUeXBlKFZGLkJhcmxpbmUudHlwZS5OT05FKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhdmUuc2V0QmVnQmFyVHlwZSh0b1ZleEJhcmxpbmVUeXBlKHNiKSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5tdWx0aW1lYXN1cmVMZW5ndGggPiAwICYmICF0aGlzLnNtb01lYXN1cmUuc3ZnLmhpZGVNdWx0aW1lYXN1cmUpIHtcclxuICAgICAgdGhpcy5zdGF2ZS5zZXRFbmRCYXJUeXBlKHZleEJhcmxpbmVUeXBlW3RoaXMuc21vTWVhc3VyZS5zdmcubXVsdGltZWFzdXJlRW5kQmFybGluZV0pO1xyXG4gICAgfSBlbHNlIGlmIChlYi5iYXJsaW5lICE9PSBTbW9CYXJsaW5lLmJhcmxpbmVzLnNpbmdsZUJhcikge1xyXG4gICAgICB0aGlzLnN0YXZlLnNldEVuZEJhclR5cGUodG9WZXhCYXJsaW5lVHlwZShlYikpO1xyXG4gICAgfVxyXG4gICAgaWYgKHN5bSAmJiBzeW0uc3ltYm9sICE9PSBTbW9SZXBlYXRTeW1ib2wuc3ltYm9scy5Ob25lKSB7XHJcbiAgICAgIGNvbnN0IHJlcCA9IG5ldyBWRi5SZXBldGl0aW9uKHRvVmV4U3ltYm9sKHN5bSksIHN5bS54T2Zmc2V0ICsgdGhpcy5zbW9NZWFzdXJlLnN0YWZmWCwgc3ltLnlPZmZzZXQpO1xyXG4gICAgICB0aGlzLnN0YXZlLmdldE1vZGlmaWVycygpLnB1c2gocmVwKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHRtcyA9IHRoaXMuc21vTWVhc3VyZS5nZXRNZWFzdXJlVGV4dCgpO1xyXG4gICAgLy8gVE9ETzogc2V0IGZvbnRcclxuICAgIHRtcy5mb3JFYWNoKCh0bWI6IFNtb01lYXN1cmVNb2RpZmllckJhc2UpID0+IHtcclxuICAgICAgY29uc3QgdG0gPSB0bWIgYXMgU21vTWVhc3VyZVRleHQ7XHJcbiAgICAgIGNvbnN0IG9mZnNldCA9IHRtLnBvc2l0aW9uID09PSBTbW9NZWFzdXJlVGV4dC5wb3NpdGlvbnMubGVmdCA/IHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdCA6IDA7XHJcbiAgICAgIGNvbnN0IHN0YXZlVGV4dCA9IGNyZWF0ZVN0YXZlVGV4dCh0bS50ZXh0LCB0b1ZleFRleHRQb3NpdGlvbih0bSksIFxyXG4gICAgICB7XHJcbiAgICAgICAgc2hpZnRYOiB0bS5hZGp1c3RYICsgb2Zmc2V0LCBzaGlmdFk6IHRtLmFkanVzdFksIGp1c3RpZmljYXRpb246IHRvVmV4VGV4dEp1c3RpZmljYXRpb24odG0pXHJcbiAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdGF2ZT8uYWRkTW9kaWZpZXIoc3RhdmVUZXh0KTtcclxuXHJcbiAgICAgIC8vIGhhY2sgLSB3ZSBjYW4ndCBjcmVhdGUgc3RhdmVUZXh0IGRpcmVjdGx5IHNvIHRoaXMgaXMgdGhlIG9ubHkgd2F5IEkgY291bGQgc2V0IHRoZSBmb250XHJcbiAgICAgIGNvbnN0IGFyID0gdGhpcy5zdGF2ZSEuZ2V0TW9kaWZpZXJzKCk7XHJcbiAgICAgIGNvbnN0IHZtID0gYXJbYXIubGVuZ3RoIC0gMV07XHJcbiAgICAgIHZtLnNldEZvbnQodG0uZm9udEluZm8pO1xyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5yb3dJblN5c3RlbSA9PT0gMCkge1xyXG4gICAgICBjb25zdCBybWIgPSB0aGlzLnNtb01lYXN1cmUuZ2V0UmVoZWFyc2FsTWFyaygpO1xyXG4gICAgICBjb25zdCBybSA9IHJtYiBhcyBTbW9SZWhlYXJzYWxNYXJrO1xyXG4gICAgICBpZiAocm0pIHtcclxuICAgICAgICB0aGlzLnN0YXZlLnNldFNlY3Rpb24ocm0uc3ltYm9sLCAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRlbXBvID0gdGhpcy5zbW9NZWFzdXJlLmdldFRlbXBvKCk7XHJcbiAgICBpZiAodGVtcG8gJiYgdGhpcy5zbW9NZWFzdXJlLnN2Zy5mb3JjZVRlbXBvKSB7XHJcbiAgICAgIHRoaXMuc3RhdmUuc2V0VGVtcG8odGVtcG8udG9WZXhUZW1wbygpLCAtMSAqIHRlbXBvLnlPZmZzZXQpO1xyXG4gICAgICBjb25zdCB2ZXhUZW1wbyA9IHRoaXMuc3RhdmUuZ2V0TW9kaWZpZXJzKCkuZmluZCgobW9kOiBTdGF2ZU1vZGlmaWVyKSA9PiBtb2QuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdTdGF2ZVRlbXBvJyk7XHJcbiAgICAgIGlmICh2ZXhUZW1wbykge1xyXG4gICAgICAgIHZleFRlbXBvLnNldEZvbnQoeyBmYW1pbHk6IFNvdXJjZVNlcmlmUHJvRm9udC5mb250RmFtaWx5LCBzaXplOiAxMywgd2VpZ2h0OiAnYm9sZCcgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbGwgVmV4IG5vdGVzIGFuZCBtb2RpZmllcnMuICBXZSBkZWZlciB0aGUgZm9ybWF0IGFuZCByZW5kZXJpbmcgc29cclxuICAgKiB3ZSBjYW4gYWxpZ24gYWNyb3NzIG11bHRpcGxlIHN0YXZlc1xyXG4gICAqL1xyXG4gIHByZUZvcm1hdCgpIHtcclxuICAgIHZhciBqID0gMDtcclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLmVsZW1lbnQgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy5lbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgICB0aGlzLnNtb01lYXN1cmUuc3ZnLmVsZW1lbnQgPSBudWxsO1xyXG4gICAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy50YWJFbGVtZW50KSB7XHJcbiAgICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy50YWJFbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcudGFiRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcuaGlkZUVtcHR5TWVhc3VyZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBOb3RlOiBuZWVkIHRvIGRvIHRoaXMgdG8gZ2V0IGl0IGludG8gVkVYIEtTIGZvcm1hdFxyXG4gICAgY29uc3Qgc3RhZmZYID0gdGhpcy5zbW9NZWFzdXJlLnN0YWZmWCArIHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdDtcclxuICAgIGNvbnN0IHN0YWZmWSA9IHRoaXMuc21vTWVhc3VyZS5zdGFmZlkgLSB0aGlzLmNvbnRleHQuYm94Lnk7XHJcbiAgICBjb25zdCBrZXkgPSBTbW9NdXNpYy52ZXhLZXlTaWduYXR1cmVUcmFuc3Bvc2UodGhpcy5zbW9NZWFzdXJlLmtleVNpZ25hdHVyZSwgMCk7XHJcbiAgICBjb25zdCBjYW5jZWxlZEtleSA9IFNtb011c2ljLnZleEtleVNpZ25hdHVyZVRyYW5zcG9zZSh0aGlzLnNtb01lYXN1cmUuY2FuY2VsZWRLZXlTaWduYXR1cmUsIDApO1xyXG4gICAgY29uc3Qgc21vVmV4U3RhdmVQYXJhbXMgPSB7XHJcbiAgICAgIHg6IHN0YWZmWCxcclxuICAgICAgeTogc3RhZmZZLFxyXG4gICAgICBwYWRMZWZ0OiB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQsXHJcbiAgICAgIGlkOiB0aGlzLnNtb01lYXN1cmUuaWQsXHJcbiAgICAgIHN0YWZmWDogdGhpcy5zbW9NZWFzdXJlLnN0YWZmWCxcclxuICAgICAgc3RhZmZZOiB0aGlzLnNtb01lYXN1cmUuc3RhZmZZLFxyXG4gICAgICBzdGFmZldpZHRoOiB0aGlzLnNtb01lYXN1cmUuc3RhZmZXaWR0aCxcclxuICAgICAgZm9yY2VDbGVmOiB0aGlzLnNtb01lYXN1cmUuc3ZnLmZvcmNlQ2xlZixcclxuICAgICAgY2xlZjogdGhpcy5zbW9NZWFzdXJlLmNsZWYsXHJcbiAgICAgIGZvcmNlS2V5OiB0aGlzLnNtb01lYXN1cmUuc3ZnLmZvcmNlS2V5U2lnbmF0dXJlLFxyXG4gICAgICBrZXksXHJcbiAgICAgIGNhbmNlbGVkS2V5LFxyXG4gICAgICBzdGFydFg6IHRoaXMuc21vTWVhc3VyZS5zdmcubWF4Q29sdW1uU3RhcnRYLFxyXG4gICAgICBhZGpYOiB0aGlzLnNtb01lYXN1cmUuc3ZnLmFkalgsXHJcbiAgICAgIGxpbmVzOiB0aGlzLnNtb01lYXN1cmUubGluZXMsXHJcbiAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dC5nZXRDb250ZXh0KClcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdmUgPSBjcmVhdGVTdGF2ZShzbW9WZXhTdGF2ZVBhcmFtcyk7XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5mb3JjZVRpbWVTaWduYXR1cmUpIHtcclxuICAgICAgY29uc3QgdHMgPSB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZTtcclxuICAgICAgbGV0IHRzU3RyaW5nID0gdHMudGltZVNpZ25hdHVyZTtcclxuICAgICAgaWYgKHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLnVzZVN5bWJvbCAmJiB0cy5hY3R1YWxCZWF0cyA9PT0gNCAmJiB0cy5iZWF0RHVyYXRpb24gPT09IDQpIHtcclxuICAgICAgICB0c1N0cmluZyA9ICdDJztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS51c2VTeW1ib2wgJiYgdHMuYWN0dWFsQmVhdHMgPT09IDIgJiYgdHMuYmVhdER1cmF0aW9uID09PSA0KSB7XHJcbiAgICAgICAgdHNTdHJpbmcgPSAnQ3wnO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLmRpc3BsYXlTdHJpbmcubGVuZ3RoKSB7XHJcbiAgICAgICAgdHNTdHJpbmcgPSB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS5kaXNwbGF5U3RyaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RhdmUuYWRkVGltZVNpZ25hdHVyZSh0c1N0cmluZyk7XHJcbiAgICB9XHJcbiAgICAvLyBDb25uZWN0IGl0IHRvIHRoZSByZW5kZXJpbmcgY29udGV4dCBhbmQgZHJhdyFcclxuICAgIHRoaXMuc3RhdmUuc2V0Q29udGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpKTtcclxuICAgIGlmICh0aGlzLnNtb1RhYlN0YXZlICYmIHRoaXMuc21vTWVhc3VyZS5zdmcudGFiU3RhdmVCb3g/LndpZHRoKSB7XHJcbiAgICAgIGNvbnN0IGJveCA9IHRoaXMuc21vTWVhc3VyZS5zdmcudGFiU3RhdmVCb3g7XHJcbiAgICAgIGxldCB0YWJXaWR0aCA9IDA7XHJcbiAgICAgIGJveC55IC09IHRoaXMuY29udGV4dC5ib3gueTtcclxuICAgICAgYm94LnggPSBzdGFmZlggLSB0aGlzLmNvbnRleHQuYm94Lng7XHJcbiAgICAgIGJveC53aWR0aCA9IHRoaXMuc21vTWVhc3VyZS5zdGFmZldpZHRoO1xyXG4gICAgICB0aGlzLnRhYlN0YXZlID0gY3JlYXRlVGFiU3RhdmUoYm94LCB0aGlzLnNtb1RhYlN0YXZlLnNwYWNpbmcsIHRoaXMuc21vVGFiU3RhdmUubnVtTGluZXMpO1xyXG4gICAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5mb3JjZUNsZWYpIHtcclxuICAgICAgICB0aGlzLnRhYlN0YXZlLmFkZFRhYkdseXBoKCk7XHJcbiAgICAgICAgdGFiV2lkdGggPSB2ZXhHbHlwaC5kaW1lbnNpb25zWyd0YWInXS53aWR0aDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRhYlN0YXZlLnNldE5vdGVTdGFydFgodGhpcy50YWJTdGF2ZS5nZXROb3RlU3RhcnRYKCkgKyB0aGlzLnNtb01lYXN1cmUuc3ZnLmFkalggLSB0YWJXaWR0aCk7XHJcbiAgICAgIHRoaXMudGFiU3RhdmUuc2V0Q29udGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNyZWF0ZU1lYXN1cmVNb2RpZmllcnMoKTtcclxuXHJcbiAgICB0aGlzLnRpY2ttYXBPYmplY3QgPSB0aGlzLnNtb01lYXN1cmUuY3JlYXRlTWVhc3VyZVRpY2ttYXBzKCk7XHJcbiAgICB0aGlzLmNyZWF0ZUNvbGxpc2lvblRpY2ttYXAoKTtcclxuXHJcbiAgICB0aGlzLnZvaWNlQXIgPSBbXTtcclxuICAgIHRoaXMudmV4Tm90ZXMgPSBbXTtcclxuICAgIHRoaXMubm90ZVRvVmV4TWFwID0ge307XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIHZvaWNlcywgYWRkIHRoZW0gYWxsIHRvIHRoZSBmb3JtYXR0ZXIgYXQgdGhlIHNhbWUgdGltZSBzbyB0aGV5IGRvbid0IGNvbGxpZGVcclxuICAgIGZvciAoaiA9IDA7IGogPCB0aGlzLnNtb01lYXN1cmUudm9pY2VzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIGNvbnN0IHNtb1ZleFZvaWNlUGFyYW1zID0ge1xyXG4gICAgICAgIGFjdHVhbEJlYXRzOiB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS5hY3R1YWxCZWF0cyxcclxuICAgICAgICBiZWF0RHVyYXRpb246IHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLmJlYXREdXJhdGlvbixcclxuICAgICAgICBub3RlczogdGhpcy52ZXhOb3Rlc1xyXG4gICAgICB9XHJcbiAgICBpZiAoIXRoaXMuc21vTWVhc3VyZS5zdmcubXVsdGltZWFzdXJlTGVuZ3RoICYmICF0aGlzLnNtb01lYXN1cmUucmVwZWF0U3ltYm9sKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVWZXhOb3RlcyhqKTtcclxuICAgICAgICBzbW9WZXhWb2ljZVBhcmFtcy5ub3RlcyA9IHRoaXMudm9pY2VOb3RlcztcclxuICAgICAgICB0aGlzLmNyZWF0ZVZleFR1cGxldHMoaik7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVWZXhCZWFtR3JvdXBzKGopO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgYSB2b2ljZSBpbiA0LzQgYW5kIGFkZCBhYm92ZSBub3Rlc1xyXG4gICAgICAgIGNvbnN0IHZvaWNlID0gY3JlYXRlVm9pY2Uoc21vVmV4Vm9pY2VQYXJhbXMpO1xyXG4gICAgICAgIHRoaXMudm9pY2VBci5wdXNoKHZvaWNlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnJlcGVhdFN5bWJvbCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlUmVwZWF0U3ltYm9sKCk7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgdm9pY2UgaW4gNC80IGFuZCBhZGQgYWJvdmUgbm90ZXNcclxuICAgICAgICBjb25zdCB2b2ljZSA9IGNyZWF0ZVZvaWNlKHNtb1ZleFZvaWNlUGFyYW1zKTtcclxuICAgICAgICB0aGlzLnZvaWNlQXIucHVzaCh2b2ljZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIE5lZWQgdG8gZm9ybWF0IGZvciB4IHBvc2l0aW9uLCB0aGVuIHNldCB5IHBvc2l0aW9uIGJlZm9yZSBkcmF3aW5nIGR5bmFtaWNzLlxyXG4gICAgdGhpcy5mb3JtYXR0ZXIgPSBuZXcgVkYuRm9ybWF0dGVyKHsgc29mdG1heEZhY3RvcjogdGhpcy5zb2Z0bWF4LCBnbG9iYWxTb2Z0bWF4OiBmYWxzZSB9KTtcclxuICAgIHRoaXMuZm9ybWF0dGVyLmpvaW5Wb2ljZXModGhpcy52b2ljZUFyKTtcclxuICAgIGlmICh0aGlzLnRhYlN0YXZlKSB7XHJcbiAgICAgIHRoaXMudGFiVm9pY2UgPSBjcmVhdGVWb2ljZSh7XHJcbiAgICAgICAgYWN0dWFsQmVhdHM6IHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLmFjdHVhbEJlYXRzLFxyXG4gICAgICAgIGJlYXREdXJhdGlvbjogdGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmUuYmVhdER1cmF0aW9uLFxyXG4gICAgICAgIG5vdGVzOiB0aGlzLnRhYk5vdGVzXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmZvcm1hdHRlci5qb2luVm9pY2VzKFt0aGlzLnRhYlZvaWNlXSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0aGUgVmV4IGZvcm1hdHRlciB0aGF0IGNhbGN1bGF0ZXMgdGhlIFggYW5kIFkgcG9zaXRpb25zIG9mIHRoZSBub3Rlcy4gIEEgZm9ybWF0dGVyXHJcbiAgICogbWF5IGFjdHVhbGx5IHNwYW4gbXVsdGlwbGUgc3RhdmVzIGZvciBqdXN0aWZpZWQgc3RhdmVzLiAgVGhlIG5vdGVzIGFyZSBkcmF3biBpbiB0aGVpclxyXG4gICAqIGluZGl2aWR1YWwgdnhNZWFzdXJlIG9iamVjdHMgYnV0IGZvcm1hdHRpbmcgaXMgZG9uZSBvbmNlIGZvciBhbGwganVzdGlmaWVkIHN0YXZlc1xyXG4gICAqIEBwYXJhbSB2b2ljZXMgVm9pY2Ugb2JqZWN0cyBmcm9tIFZleEZsb3dcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBmb3JtYXQodm9pY2VzOiBWb2ljZVtdKSB7XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5oaWRlRW1wdHlNZWFzdXJlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5tdWx0aW1lYXN1cmVMZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMubXVsdGltZWFzdXJlUmVzdCA9IGdldE11bHRpbWVhc3VyZVJlc3QodGhpcy5zbW9NZWFzdXJlLnN2Zy5tdWx0aW1lYXN1cmVMZW5ndGgpO1xyXG4gICAgICB0aGlzLm11bHRpbWVhc3VyZVJlc3Quc2V0Q29udGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpKTtcclxuICAgICAgdGhpcy5tdWx0aW1lYXN1cmVSZXN0LnNldFN0YXZlKHRoaXMuc3RhdmUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuZm9ybWF0dGVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudmFsdWVPZigpO1xyXG4gICAgY29uc3Qgc3RhZmZXaWR0aCA9IHRoaXMuc21vTWVhc3VyZS5zdGFmZldpZHRoIC1cclxuICAgICAgKHRoaXMuc21vTWVhc3VyZS5zdmcubWF4Q29sdW1uU3RhcnRYICsgdGhpcy5zbW9NZWFzdXJlLnN2Zy5hZGpSaWdodCArIHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdCkgLSAxMDtcclxuICAgIHRoaXMuZGJnTGVmdFggPSB0aGlzLnNtb01lYXN1cmUuc3RhZmZYICsgIHRoaXMuc21vTWVhc3VyZS5mb3JtYXQucGFkTGVmdCArIHRoaXMuc21vTWVhc3VyZS5zdmcuYWRqWDtcclxuICAgIHRoaXMuZGJnV2lkdGggPSBzdGFmZldpZHRoO1xyXG4gICAgdGhpcy5mb3JtYXR0ZXIuZm9ybWF0KHZvaWNlcywgc3RhZmZXaWR0aCk7XHJcbiAgICBpZiAodGhpcy50YWJWb2ljZSAmJiB0aGlzLnRhYk5vdGVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmZvcm1hdHRlci5mb3JtYXQoW3RoaXMudGFiVm9pY2VdLCBzdGFmZldpZHRoKTtcclxuICAgIH1cclxuICAgIGxheW91dERlYnVnLnNldFRpbWVzdGFtcChsYXlvdXREZWJ1Zy5jb2RlUmVnaW9ucy5GT1JNQVQsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGltZXN0YW1wKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogcmVuZGVyIGlzIGNhbGxlZCBhZnRlciBmb3JtYXQuICBBY3R1YWxseSBkcmF3IHRoZSB0aGluZ3MuXHJcbiAgICovXHJcbiAgcmVuZGVyKCkge1xyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcuaGlkZUVtcHR5TWVhc3VyZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGdyb3VwID0gdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5vcGVuR3JvdXAoKSBhcyBTVkdTVkdFbGVtZW50O1xyXG4gICAgdmFyIG1tQ2xhc3MgPSB0aGlzLnNtb01lYXN1cmUuZ2V0Q2xhc3NJZCgpO1xyXG4gICAgdmFyIGogPSAwO1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gYm91bmQgZWFjaCBtZWFzdXJlIGluIGl0cyBvd24gU1ZHIGdyb3VwIGZvciBlYXN5IGRlbGV0aW9uIGFuZCBtYXBwaW5nIHRvIHNjcmVlbiBjb29yZGluYXRlXHJcbiAgICAgIGdyb3VwLmNsYXNzTGlzdC5hZGQodGhpcy5zbW9NZWFzdXJlLmlkKTtcclxuICAgICAgZ3JvdXAuY2xhc3NMaXN0LmFkZChtbUNsYXNzKTtcclxuICAgICAgZ3JvdXAuaWQgPSB0aGlzLnNtb01lYXN1cmUuaWQ7XHJcbiAgICAgIHRoaXMuc3RhdmUhLmRyYXcoKTtcclxuICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy5lbGVtZW50ID0gZ3JvdXA7XHJcblxyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgdGhpcy52b2ljZUFyLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgdGhpcy52b2ljZUFyW2pdLmRyYXcodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSwgdGhpcy5zdGF2ZSEpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudmV4QmVhbUdyb3Vwcy5mb3JFYWNoKChiKSA9PiB7XHJcbiAgICAgICAgYi5zZXRDb250ZXh0KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkpLmRyYXcoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnZleFR1cGxldHMuZm9yRWFjaCgodHVwbGV0KSA9PiB7XHJcbiAgICAgICAgdHVwbGV0LnNldENvbnRleHQodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSkuZHJhdygpO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKHRoaXMubXVsdGltZWFzdXJlUmVzdCkge1xyXG4gICAgICAgIHRoaXMubXVsdGltZWFzdXJlUmVzdC5kcmF3KCk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5fdXBkYXRlTHlyaWNEb21TZWxlY3RvcnMoKTtcclxuICAgICAgdGhpcy5yZW5kZXJEeW5hbWljcygpO1xyXG4gICAgICAvLyB0aGlzLnNtb01lYXN1cmUuYWRqWCA9IHRoaXMuc3RhdmUuc3RhcnRfeCAtICh0aGlzLnNtb01lYXN1cmUuc3RhZmZYKTtcclxuXHJcbiAgICAgIHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuY2xvc2VHcm91cCgpO1xyXG4gICAgICBpZiAodGhpcy50YWJTdGF2ZSkge1xyXG4gICAgICAgIGNvbnN0IHRhYlN0YXZlSWQgPSBgJHt0aGlzLnNtb01lYXN1cmUuaWR9LXRhYmA7XHJcbiAgICAgICAgY29uc3QgdGFiR3JvdXAgPSB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLm9wZW5Hcm91cCgpIGFzIFNWR1NWR0VsZW1lbnQ7XHJcbiAgICAgICAgdGFiR3JvdXAuY2xhc3NMaXN0LmFkZCh0YWJTdGF2ZUlkKTtcclxuICAgICAgICB0aGlzLnRhYlN0YXZlLmRyYXcoKTtcclxuICAgICAgICB0aGlzLnRhYlZvaWNlPy5kcmF3KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCksIHRoaXMudGFiU3RhdmUpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuY2xvc2VHcm91cCgpO1xyXG4gICAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcudGFiRWxlbWVudCA9IHRhYkdyb3VwO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGxheW91dERlYnVnLnNldFRpbWVzdGFtcChsYXlvdXREZWJ1Zy5jb2RlUmVnaW9ucy5SRU5ERVIsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGltZXN0YW1wKTtcclxuXHJcbiAgICAgIHRoaXMucmVuZGVyZWQgPSB0cnVlO1xyXG4gICAgICBpZiAobGF5b3V0RGVidWcubWFzayAmIGxheW91dERlYnVnLnZhbHVlc1snYWRqdXN0J10pIHtcclxuICAgICAgICBTdmdIZWxwZXJzLmRlYnVnQm94Tm9UZXh0KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuc3ZnLFxyXG4gICAgICAgIFN2Z0hlbHBlcnMuYm94UG9pbnRzKHRoaXMuZGJnTGVmdFgsIFxyXG4gICAgICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy5zdGFmZlksIHRoaXMuZGJnV2lkdGgsIDQwKSwgJ3JlbmRlci14LWRiZycsIDApO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChleGMpIHtcclxuICAgICAgY29uc29sZS53YXJuKCd1bmFibGUgdG8gcmVuZGVyIG1lYXN1cmUgJyArIHRoaXMuc21vTWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCk7XHJcbiAgICAgIHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuY2xvc2VHcm91cCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/render/vex/vxMeasure.ts\n");
470
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VxMeasure: () => (/* binding */ VxMeasure)\n/* harmony export */ });\n/* harmony import */ var _smo_data_note__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/data/note */ \"./src/smo/data/note.ts\");\n/* harmony import */ var _smo_data_music__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../smo/data/music */ \"./src/smo/data/music.ts\");\n/* harmony import */ var _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../sui/layoutDebug */ \"./src/render/sui/layoutDebug.ts\");\n/* harmony import */ var _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../smo/data/measureModifiers */ \"./src/smo/data/measureModifiers.ts\");\n/* harmony import */ var _styles_font_metrics_ssp_serif_metrics__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../styles/font_metrics/ssp-serif-metrics */ \"./src/styles/font_metrics/ssp-serif-metrics.js\");\n/* harmony import */ var _smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../smo/data/noteModifiers */ \"./src/smo/data/noteModifiers.ts\");\n/* harmony import */ var _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../sui/svgHelpers */ \"./src/render/sui/svgHelpers.ts\");\n/* harmony import */ var _smo_data_common__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../smo/data/common */ \"./src/smo/data/common.ts\");\n/* harmony import */ var _smoAdapter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./smoAdapter */ \"./src/render/vex/smoAdapter.ts\");\n/* harmony import */ var _common_vex__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../common/vex */ \"./src/common/vex.ts\");\n/* harmony import */ var _vxNote__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./vxNote */ \"./src/render/vex/vxNote.ts\");\n/* harmony import */ var _glyphDimensions__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./glyphDimensions */ \"./src/render/vex/glyphDimensions.ts\");\n// [Smoosic](https://github.com/AaronDavidNewman/Smoosic)\n// Copyright (c) Aaron David Newman 2021.\n// ## Description:\n// This file calls the vexflow routines that actually render a\n// measure of music. If multiple measures are justified in a\n// column, the rendering is deferred until all the measures have been\n// preformatted.\n\n\n\n\n\n\n\n\n\n\n\n\nconst VF = _common_vex__WEBPACK_IMPORTED_MODULE_9__.VexFlow;\n// const VF = eval('Vex.Flow');\n/**\n * This is the interface for VexFlow library that actually does the engraving.\n * @category SuiRender\n */\nclass VxMeasure {\n constructor(context, selection, printing, softmax) {\n this.rendered = false;\n this.noteToVexMap = {};\n this.beamToVexMap = {};\n this.tupletToVexMap = {};\n this.multimeasureRest = null;\n this.vexNotes = [];\n this.vexBeamGroups = [];\n this.vexTuplets = [];\n this.tickmapObject = null;\n this.stave = null; // vex stave\n this.voiceNotes = []; // notes for current voice, as rendering\n this.tabNotes = [];\n this.voiceAr = [];\n this.tabVoice = null;\n this.formatter = null;\n this.allCues = false;\n this.modifiersToBox = [];\n this.collisionMap = {};\n this.dbgLeftX = 0;\n this.dbgWidth = 0;\n this.context = context;\n this.rendered = false;\n this.selection = selection;\n this.smoMeasure = this.selection.measure;\n this.printing = printing;\n this.allCues = selection.staff.partInfo.displayCues;\n this.tupletToVexMap = {};\n this.vexNotes = [];\n this.vexBeamGroups = [];\n this.vexBeamGroups = [];\n this.beamToVexMap = {};\n this.softmax = softmax;\n this.smoTabStave = selection.staff.getTabStaveForMeasure(selection.selector);\n }\n static get fillStyle() {\n return '#000';\n }\n // Treat a rest like a whole rest if there is only a single rest in the measure\n // and the measure length is not a pickup\n isWholeRest() {\n return (this.smoMeasure.voices.length === 1 &&\n this.smoMeasure.voices[0].notes.length === 1 &&\n this.smoMeasure.voices[0].notes[0].isRest() &&\n this.smoMeasure.getMaxTicksVoice() > 4096);\n }\n createCollisionTickmap() {\n let i = 0;\n let j = 0;\n if (!this.tickmapObject) {\n return;\n }\n for (i = 0; i < this.smoMeasure.voices.length; ++i) {\n const tm = this.tickmapObject.tickmaps[i];\n for (j = 0; j < tm.durationMap.length; ++j) {\n if (typeof (this.collisionMap[tm.durationMap[j]]) === 'undefined') {\n this.collisionMap[tm.durationMap[j]] = [];\n }\n this.collisionMap[tm.durationMap[j]].push(this.smoMeasure.voices[i].notes[j]);\n }\n }\n }\n isCollision(voiceIx, tickIx) {\n let i = 0;\n let j = 0;\n let k = 0;\n let staffLines = [];\n if (!this.tickmapObject) {\n return false;\n }\n const tick = this.tickmapObject.tickmaps[voiceIx].durationMap[tickIx];\n // Just one note, no collision\n if (this.collisionMap[tick].length < 2) {\n return false;\n }\n for (i = 0; i < this.collisionMap[tick].length; ++i) {\n const note = this.collisionMap[tick][i];\n for (j = 0; j < note.pitches.length; ++j) {\n const clef = (0,_smo_data_common__WEBPACK_IMPORTED_MODULE_7__.IsClef)(note.clef) ? note.clef : 'treble';\n const pitch = note.pitches[j];\n const curLine = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.pitchToStaffLine(clef, pitch);\n for (k = 0; k < staffLines.length; ++k) {\n if (Math.abs(curLine - staffLines[k]) < 1) {\n return true;\n }\n }\n staffLines.push(curLine);\n }\n }\n return false;\n }\n /**\n * convert a smoNote into a vxNote so it can be rasterized\n * @param smoNote\n * @param tickIndex - used to calculate accidental\n * @param voiceIx\n * @returns\n */\n createVexNote(smoNote, tickIndex, voiceIx) {\n let vexNote = null;\n let smoTabNote = null;\n let timestamp = new Date().valueOf();\n const stemTicks = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.ticksToDuration[smoNote.stemTicks];\n let tabNote = null;\n const noteHead = smoNote.isRest() ? 'r' : smoNote.noteHead;\n const keys = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.smoPitchesToVexKeys(smoNote.pitches, 0, noteHead);\n const smoNoteParams = {\n isTuplet: smoNote.isTuplet,\n measureIndex: this.smoMeasure.measureNumber.measureIndex,\n clef: smoNote.clef,\n stemTicks,\n keys,\n noteType: smoNote.noteType,\n isCue: smoNote.isCue\n };\n const { noteParams, duration } = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getVexNoteParameters)(smoNoteParams);\n if (this.tabStave && this.smoTabStave) {\n smoTabNote = this.smoTabStave.getTabNoteFromNote(smoNote, this.smoMeasure.transposeIndex);\n if (smoTabNote) {\n const positions = (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.VexTabNotePositions)(this.smoTabStave, smoTabNote, smoNote);\n if (positions.length) {\n if (!smoNote.isRest()) {\n tabNote = new VF.TabNote({ positions, duration: duration });\n if (this.smoTabStave.showStems) {\n tabNote.render_options.draw_stem = true;\n tabNote.render_options.draw_dots = true;\n tabNote.render_options.draw_stem_through_stave = smoTabNote.flagThrough;\n }\n }\n else {\n tabNote = new VF.StaveNote(noteParams);\n }\n }\n }\n }\n if (smoNote.noteType === '/') {\n // vexNote = new VF.GlyphNote('\\uE504', { duration });\n vexNote = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getSlashGlyph)();\n smoNote.renderId = 'vf-' + vexNote.getAttribute('id'); // where does 'vf' come from?\n }\n else {\n const smoVexStemParams = {\n voiceCount: this.smoMeasure.voices.length,\n voiceIx,\n isAuto: smoNote.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.auto,\n isUp: smoNote.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.up\n };\n (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.applyStemDirection)(smoVexStemParams, noteParams);\n if (smoTabNote && tabNote) {\n tabNote.setStemDirection(noteParams.stem_direction);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATA, new Date().valueOf() - timestamp);\n timestamp = new Date().valueOf();\n vexNote = new VF.StaveNote(noteParams);\n if (voiceIx > 0 && this.isCollision(voiceIx, tickIndex)) {\n vexNote.setXShift(-10);\n }\n if (this.isWholeRest()) {\n noteParams.duration = 'wr';\n vexNote = new VF.StaveNote(noteParams);\n vexNote.setCenterAlignment(true);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATB, new Date().valueOf() - timestamp);\n timestamp = new Date().valueOf();\n if (smoNote.fillStyle && !this.printing) {\n vexNote.setStyle({ fillStyle: smoNote.fillStyle });\n }\n else if (voiceIx > 0 && !this.printing) {\n vexNote.setStyle({ fillStyle: \"#115511\" });\n }\n else if (smoNote.isHidden() && this.printing) {\n vexNote.setStyle({ fillStyle: \"#ffffff00\" });\n }\n smoNote.renderId = 'vf-' + vexNote.getAttribute('id'); // where does 'vf' come from?\n }\n const noteData = {\n smoMeasure: this.smoMeasure,\n vxMeasure: this,\n smoNote: smoNote,\n staveNote: vexNote,\n voiceIndex: voiceIx,\n tickIndex: tickIndex\n };\n if (tabNote) {\n noteData.tabNote = tabNote;\n this.tabNotes.push(tabNote);\n }\n const modObj = new _vxNote__WEBPACK_IMPORTED_MODULE_10__.VxNote(noteData);\n modObj.addModifiers();\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.PREFORMATC, new Date().valueOf() - timestamp);\n return modObj;\n }\n renderNoteGlyph(smoNote, textObj) {\n var x = this.noteToVexMap[smoNote.attrs.id].getAbsoluteX() + textObj.xOffset;\n // the -3 is copied from vexflow textDynamics\n var y = this.stave.getYForLine(textObj.yOffsetLine - 3) + textObj.yOffsetPixels;\n let maxh = 0;\n const minx = x;\n var group = this.context.getContext().openGroup();\n group.classList.add(textObj.attrs.id + '-' + smoNote.attrs.id);\n group.classList.add(textObj.attrs.id);\n // const duration = SmoMusic.closestVexDuration(smoNote.tickCount);\n for (var i = 0; i < textObj.text.length; i += 1) {\n const { width, height } = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.renderDynamics)(this.context.getContext(), VF.TextDynamics.GLYPHS[textObj.text[i]].code, textObj.fontSize, x, y);\n /* const { width , height } = renderDynamics(this.context.getContext(), VF.TextDynamics.GLYPHS[textObj.text[i]],\n textObj.fontSize, x, y); */\n x += width;\n maxh = Math.max(height, maxh);\n }\n textObj.logicalBox = _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.boxPoints(minx, y + this.context.box.y, x - minx, maxh);\n textObj.element = group;\n this.modifiersToBox.push(textObj);\n this.context.getContext().closeGroup();\n }\n renderDynamics() {\n this.smoMeasure.voices.forEach((voice) => {\n voice.notes.forEach((smoNote) => {\n const mods = smoNote.textModifiers.filter((mod) => mod.attrs.type === 'SmoDynamicText');\n mods.forEach((btm) => {\n const tm = btm;\n this.renderNoteGlyph(smoNote, tm);\n });\n });\n });\n }\n createRepeatSymbol() {\n this.voiceNotes = [];\n // const vexNote = new VF.GlyphNote('\\uE500', { duration: 'w' }, { line: 2 });\n const vexNote = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getRepeatBar)();\n vexNote.setCenterAlignment(true);\n this.vexNotes.push(vexNote);\n this.voiceNotes.push(vexNote);\n }\n /**\n * create an a array of VF.StaveNote objects to render the active voice.\n * @param voiceIx\n */\n createVexNotes(voiceIx) {\n let i = 0;\n this.voiceNotes = [];\n const voice = this.smoMeasure.voices[voiceIx];\n let clefNoteAdded = false;\n for (i = 0; i < voice.notes.length; ++i) {\n const smoNote = voice.notes[i];\n const textNotes = smoNote.getTextOrnaments();\n const vexNote = this.createVexNote(smoNote, i, voiceIx);\n this.noteToVexMap[smoNote.attrs.id] = vexNote.noteData.staveNote;\n this.vexNotes.push(vexNote.noteData.staveNote);\n if (vexNote.noteData.smoNote.clefNote && !clefNoteAdded) {\n const cf = new VF.ClefNote(vexNote.noteData.smoNote.clefNote.clef, 'small');\n this.voiceNotes.push(cf);\n clefNoteAdded = true; // ignore 2nd in a measure\n }\n this.voiceNotes.push(vexNote.noteData.staveNote);\n textNotes.forEach((tn) => {\n this.voiceNotes.push((0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createTextNote)(_smo_data_noteModifiers__WEBPACK_IMPORTED_MODULE_5__.SmoOrnament.textNoteOrnaments[tn.ornament]));\n });\n if (isNaN(smoNote.ticks.numerator) || isNaN(smoNote.ticks.denominator)\n || isNaN(smoNote.ticks.remainder)) {\n throw ('vxMeasure: NaN in ticks');\n }\n }\n }\n /**\n * Group the notes for beaming and create Vex beam objects\n * @param vix - voice index\n * @returns\n */\n createVexBeamGroups(vix) {\n let keyNoteIx = -1;\n let i = 0;\n let j = 0;\n let stemDirection = VF.Stem.DOWN;\n for (i = 0; i < this.smoMeasure.beamGroups.length; ++i) {\n const bg = this.smoMeasure.beamGroups[i];\n if (bg.voice !== vix) {\n continue;\n }\n const vexNotes = [];\n keyNoteIx = bg.notes.findIndex((nn) => nn.noteType === 'n');\n // Fix stem bug: key off first non-rest note.\n keyNoteIx = (keyNoteIx >= 0) ? keyNoteIx : 0;\n for (j = 0; j < bg.notes.length; ++j) {\n const note = bg.notes[j];\n if (note.noteType === '/') {\n continue;\n }\n const vexNote = this.noteToVexMap[note.attrs.id];\n // some type of redraw condition?\n if (!(vexNote instanceof VF.StaveNote || vexNote instanceof VF.GraceNote)) {\n return;\n }\n if (note.tickCount >= 4096 || vexNote.getIntrinsicTicks() >= 4096) {\n console.warn('bad length in beam group');\n return;\n }\n if (keyNoteIx === j) {\n stemDirection = note.flagState === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.auto ?\n vexNote.getStemDirection() : (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexStemDirection)(note);\n }\n vexNote.setStemDirection(stemDirection);\n vexNotes.push(vexNote);\n }\n const vexBeam = new VF.Beam(vexNotes);\n vexBeam.breakSecondaryAt(bg.secondaryBeamBreaks);\n this.beamToVexMap[bg.attrs.id] = vexBeam;\n this.vexBeamGroups.push(vexBeam);\n }\n }\n createVexTuplets(vix) {\n this.vexTuplets = [];\n this.tupletToVexMap = {};\n for (let i = 0; i < this.smoMeasure.tupletTrees.length; ++i) {\n const tupletTree = this.smoMeasure.tupletTrees[i];\n if (tupletTree.voice !== vix) {\n continue;\n }\n const traverseTupletTree = (parentTuplet) => {\n const vexNotes = [];\n for (let smoNote of this.smoMeasure.tupletNotes(parentTuplet)) {\n vexNotes.push(this.noteToVexMap[smoNote.attrs.id]);\n }\n // If the tuplet has been deleted, the measure might not be updated.\n if (vexNotes.length < 2) {\n return;\n }\n const location = this.smoMeasure.getStemDirectionForTuplet(parentTuplet) === _smo_data_note__WEBPACK_IMPORTED_MODULE_0__.SmoNote.flagStates.up ?\n VF.Tuplet.LOCATION_TOP : VF.Tuplet.LOCATION_BOTTOM;\n const smoTupletParams = {\n vexNotes,\n numNotes: parentTuplet.numNotes,\n notesOccupied: parentTuplet.notesOccupied,\n ratioed: parentTuplet.ratioed,\n bracketed: parentTuplet.bracketed,\n location\n };\n const vexTuplet = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getVexTuplets)(smoTupletParams);\n this.tupletToVexMap[parentTuplet.attrs.id] = vexTuplet;\n this.vexTuplets.push(vexTuplet);\n for (let i = 0; i < parentTuplet.childrenTuplets.length; i++) {\n const tuplet = parentTuplet.childrenTuplets[i];\n traverseTupletTree(tuplet);\n }\n };\n traverseTupletTree(tupletTree.tuplet);\n }\n }\n /**\n * create the modifiers for the stave itself, bar lines etc.\n */\n createMeasureModifiers() {\n const sb = this.smoMeasure.getStartBarline();\n const eb = this.smoMeasure.getEndBarline();\n const sym = this.smoMeasure.getRepeatSymbol();\n if (!this.stave) {\n return;\n }\n // don't create a begin bar for any but the 1st measure.\n if (this.smoMeasure.measureNumber.systemIndex !== 0 && sb.barline === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoBarline.barlines.singleBar\n && this.smoMeasure.format.padLeft === 0) {\n this.stave.setBegBarType(VF.Barline.type.NONE);\n }\n else {\n this.stave.setBegBarType((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexBarlineType)(sb));\n }\n if (this.smoMeasure.svg.multimeasureLength > 0 && !this.smoMeasure.svg.hideMultimeasure) {\n this.stave.setEndBarType(_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.vexBarlineType[this.smoMeasure.svg.multimeasureEndBarline]);\n }\n else if (eb.barline !== _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoBarline.barlines.singleBar) {\n this.stave.setEndBarType((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexBarlineType)(eb));\n }\n if (sym && sym.symbol !== _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoRepeatSymbol.symbols.None) {\n const rep = new VF.Repetition((0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexSymbol)(sym), sym.xOffset + this.smoMeasure.staffX, sym.yOffset);\n this.stave.getModifiers().push(rep);\n }\n const tms = this.smoMeasure.getMeasureText();\n // TODO: set font\n tms.forEach((tmb) => {\n var _a;\n const tm = tmb;\n const offset = tm.position === _smo_data_measureModifiers__WEBPACK_IMPORTED_MODULE_3__.SmoMeasureText.positions.left ? this.smoMeasure.format.padLeft : 0;\n const staveText = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createStaveText)(tm.text, (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexTextPosition)(tm), {\n shiftX: tm.adjustX + offset, shiftY: tm.adjustY, justification: (0,_smoAdapter__WEBPACK_IMPORTED_MODULE_8__.toVexTextJustification)(tm)\n });\n (_a = this.stave) === null || _a === void 0 ? void 0 : _a.addModifier(staveText);\n // hack - we can't create staveText directly so this is the only way I could set the font\n const ar = this.stave.getModifiers();\n const vm = ar[ar.length - 1];\n vm.setFont(tm.fontInfo);\n });\n if (this.smoMeasure.svg.rowInSystem === 0) {\n const rmb = this.smoMeasure.getRehearsalMark();\n const rm = rmb;\n if (rm) {\n this.stave.setSection(rm.symbol, 0);\n }\n }\n const tempo = this.smoMeasure.getTempo();\n if (tempo && this.smoMeasure.svg.forceTempo) {\n this.stave.setTempo(tempo.toVexTempo(), -1 * tempo.yOffset);\n const vexTempo = this.stave.getModifiers().find((mod) => mod.getAttribute('type') === 'StaveTempo');\n if (vexTempo) {\n vexTempo.setFont({ family: _styles_font_metrics_ssp_serif_metrics__WEBPACK_IMPORTED_MODULE_4__.SourceSerifProFont.fontFamily, size: 13, weight: 'bold' });\n }\n }\n }\n /**\n * Create all Vex notes and modifiers. We defer the format and rendering so\n * we can align across multiple staves\n */\n preFormat() {\n var _a;\n var j = 0;\n if (this.smoMeasure.svg.element !== null) {\n this.smoMeasure.svg.element.remove();\n this.smoMeasure.svg.element = null;\n if (this.smoMeasure.svg.tabElement) {\n this.smoMeasure.svg.tabElement.remove();\n this.smoMeasure.svg.tabElement = undefined;\n }\n }\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n // Note: need to do this to get it into VEX KS format\n const staffX = this.smoMeasure.staffX + this.smoMeasure.format.padLeft;\n const staffY = this.smoMeasure.staffY - this.context.box.y;\n const key = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySignatureTranspose(this.smoMeasure.keySignature, 0);\n const canceledKey = _smo_data_music__WEBPACK_IMPORTED_MODULE_1__.SmoMusic.vexKeySignatureTranspose(this.smoMeasure.canceledKeySignature, 0);\n const smoVexStaveParams = {\n x: staffX,\n y: staffY,\n padLeft: this.smoMeasure.format.padLeft,\n id: this.smoMeasure.id,\n staffX: this.smoMeasure.staffX,\n staffY: this.smoMeasure.staffY,\n staffWidth: this.smoMeasure.staffWidth,\n forceClef: this.smoMeasure.svg.forceClef,\n clef: this.smoMeasure.clef,\n forceKey: this.smoMeasure.svg.forceKeySignature,\n key,\n canceledKey,\n startX: this.smoMeasure.svg.maxColumnStartX,\n adjX: this.smoMeasure.svg.adjX,\n lines: this.smoMeasure.lines,\n context: this.context.getContext()\n };\n this.stave = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createStave)(smoVexStaveParams);\n if (this.smoMeasure.svg.forceTimeSignature) {\n const ts = this.smoMeasure.timeSignature;\n let tsString = ts.timeSignature;\n if (this.smoMeasure.timeSignature.useSymbol && ts.actualBeats === 4 && ts.beatDuration === 4) {\n tsString = 'C';\n }\n else if (this.smoMeasure.timeSignature.useSymbol && ts.actualBeats === 2 && ts.beatDuration === 4) {\n tsString = 'C|';\n }\n else if (this.smoMeasure.timeSignature.displayString.length) {\n tsString = this.smoMeasure.timeSignature.displayString;\n }\n this.stave.addTimeSignature(tsString);\n }\n // Connect it to the rendering context and draw!\n this.stave.setContext(this.context.getContext());\n if (this.smoTabStave && ((_a = this.smoMeasure.svg.tabStaveBox) === null || _a === void 0 ? void 0 : _a.width)) {\n const box = this.smoMeasure.svg.tabStaveBox;\n let tabWidth = 0;\n box.y -= this.context.box.y;\n box.x = staffX - this.context.box.x;\n box.width = this.smoMeasure.staffWidth;\n this.tabStave = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createTabStave)(box, this.smoTabStave.spacing, this.smoTabStave.numLines);\n if (this.smoMeasure.svg.forceClef) {\n this.tabStave.addTabGlyph();\n tabWidth = _glyphDimensions__WEBPACK_IMPORTED_MODULE_11__.vexGlyph.dimensions['tab'].width;\n }\n this.tabStave.setNoteStartX(this.tabStave.getNoteStartX() + this.smoMeasure.svg.adjX - tabWidth);\n this.tabStave.setContext(this.context.getContext());\n }\n this.createMeasureModifiers();\n this.tickmapObject = this.smoMeasure.createMeasureTickmaps();\n this.createCollisionTickmap();\n this.voiceAr = [];\n this.vexNotes = [];\n this.noteToVexMap = {};\n // If there are multiple voices, add them all to the formatter at the same time so they don't collide\n for (j = 0; j < this.smoMeasure.voices.length; ++j) {\n const smoVexVoiceParams = {\n actualBeats: this.smoMeasure.timeSignature.actualBeats,\n beatDuration: this.smoMeasure.timeSignature.beatDuration,\n notes: this.vexNotes\n };\n if (!this.smoMeasure.svg.multimeasureLength && !this.smoMeasure.repeatSymbol) {\n this.createVexNotes(j);\n smoVexVoiceParams.notes = this.voiceNotes;\n this.createVexTuplets(j);\n this.createVexBeamGroups(j);\n // Create a voice in 4/4 and add above notes\n const voice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)(smoVexVoiceParams);\n this.voiceAr.push(voice);\n }\n if (this.smoMeasure.repeatSymbol) {\n this.createRepeatSymbol();\n // Create a voice in 4/4 and add above notes\n const voice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)(smoVexVoiceParams);\n this.voiceAr.push(voice);\n }\n }\n // Need to format for x position, then set y position before drawing dynamics.\n this.formatter = new VF.Formatter({ softmaxFactor: this.softmax, globalSoftmax: false });\n this.formatter.joinVoices(this.voiceAr);\n if (this.tabStave) {\n this.tabVoice = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.createVoice)({\n actualBeats: this.smoMeasure.timeSignature.actualBeats,\n beatDuration: this.smoMeasure.timeSignature.beatDuration,\n notes: this.tabNotes\n });\n this.formatter.joinVoices([this.tabVoice]);\n }\n }\n /**\n * Create the Vex formatter that calculates the X and Y positions of the notes. A formatter\n * may actually span multiple staves for justified staves. The notes are drawn in their\n * individual vxMeasure objects but formatting is done once for all justified staves\n * @param voices Voice objects from VexFlow\n * @returns\n */\n format(voices) {\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n if (this.smoMeasure.svg.multimeasureLength > 0) {\n this.multimeasureRest = (0,_common_vex__WEBPACK_IMPORTED_MODULE_9__.getMultimeasureRest)(this.smoMeasure.svg.multimeasureLength);\n this.multimeasureRest.setContext(this.context.getContext());\n this.multimeasureRest.setStave(this.stave);\n return;\n }\n if (!this.formatter) {\n return;\n }\n const timestamp = new Date().valueOf();\n const staffWidth = this.smoMeasure.staffWidth -\n (this.smoMeasure.svg.maxColumnStartX + this.smoMeasure.svg.adjRight + this.smoMeasure.format.padLeft) - 10;\n this.dbgLeftX = this.smoMeasure.staffX + this.smoMeasure.format.padLeft + this.smoMeasure.svg.adjX;\n this.dbgWidth = staffWidth;\n this.formatter.format(voices, staffWidth);\n if (this.tabVoice && this.tabNotes.length) {\n this.formatter.format([this.tabVoice], staffWidth);\n }\n _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.setTimestamp(_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.codeRegions.FORMAT, new Date().valueOf() - timestamp);\n }\n /**\n * render is called after format. Actually draw the things.\n */\n render() {\n var _a;\n if (this.smoMeasure.svg.hideEmptyMeasure) {\n return;\n }\n var group = this.context.getContext().openGroup();\n var mmClass = this.smoMeasure.getClassId();\n var j = 0;\n try {\n // bound each measure in its own SVG group for easy deletion and mapping to screen coordinate\n group.classList.add(this.smoMeasure.id);\n group.classList.add(mmClass);\n group.id = this.smoMeasure.id;\n this.stave.draw();\n this.smoMeasure.svg.element = group;\n for (j = 0; j < this.voiceAr.length; ++j) {\n this.voiceAr[j].draw(this.context.getContext(), this.stave);\n }\n this.vexBeamGroups.forEach((b) => {\n b.setContext(this.context.getContext()).draw();\n });\n this.vexTuplets.forEach((tuplet) => {\n tuplet.setContext(this.context.getContext()).draw();\n });\n if (this.multimeasureRest) {\n this.multimeasureRest.draw();\n }\n // this._updateLyricDomSelectors();\n this.renderDynamics();\n // this.smoMeasure.adjX = this.stave.start_x - (this.smoMeasure.staffX);\n this.context.getContext().closeGroup();\n if (this.tabStave) {\n const tabStaveId = `${this.smoMeasure.id}-tab`;\n const tabGroup = this.context.getContext().openGroup();\n tabGroup.classList.add(tabStaveId);\n this.tabStave.draw();\n (_a = this.tabVoice) === null || _a === void 0 ? void 0 : _a.draw(this.context.getContext(), this.tabStave);\n this.context.getContext().closeGroup();\n this.smoMeasure.svg.tabElement = tabGroup;\n }\n // layoutDebug.setTimestamp(layoutDebug.codeRegions.RENDER, new Date().valueOf() - timestamp);\n this.rendered = true;\n if (_sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.mask & _sui_layoutDebug__WEBPACK_IMPORTED_MODULE_2__.layoutDebug.values['adjust']) {\n _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.debugBoxNoText(this.context.getContext().svg, _sui_svgHelpers__WEBPACK_IMPORTED_MODULE_6__.SvgHelpers.boxPoints(this.dbgLeftX, this.smoMeasure.svg.staffY, this.dbgWidth, 40), 'render-x-dbg', 0);\n }\n }\n catch (exc) {\n console.warn('unable to render measure ' + this.smoMeasure.measureNumber.measureIndex);\n this.context.getContext().closeGroup();\n }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkUsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2RixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvcmVuZGVyL3ZleC92eE1lYXN1cmUudHM/Y2MxMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuLy8gIyMgRGVzY3JpcHRpb246XHJcbi8vIFRoaXMgZmlsZSBjYWxscyB0aGUgdmV4ZmxvdyByb3V0aW5lcyB0aGF0IGFjdHVhbGx5IHJlbmRlciBhXHJcbi8vIG1lYXN1cmUgb2YgbXVzaWMuICBJZiBtdWx0aXBsZSBtZWFzdXJlcyBhcmUganVzdGlmaWVkIGluIGFcclxuLy8gY29sdW1uLCB0aGUgcmVuZGVyaW5nIGlzIGRlZmVycmVkIHVudGlsIGFsbCB0aGUgbWVhc3VyZXMgaGF2ZSBiZWVuXHJcbi8vIHByZWZvcm1hdHRlZC5cclxuaW1wb3J0IHsgU21vTm90ZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL25vdGUnO1xyXG5pbXBvcnQgeyBTbW9NdXNpYyB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL211c2ljJztcclxuaW1wb3J0IHsgbGF5b3V0RGVidWcgfSBmcm9tICcuLi9zdWkvbGF5b3V0RGVidWcnO1xyXG5pbXBvcnQgeyBTbW9SZXBlYXRTeW1ib2wsIFNtb01lYXN1cmVUZXh0LCBTbW9CYXJsaW5lLCBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlLCBTbW9SZWhlYXJzYWxNYXJrIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNvdXJjZVNlcmlmUHJvRm9udCB9IGZyb20gJy4uLy4uL3N0eWxlcy9mb250X21ldHJpY3Mvc3NwLXNlcmlmLW1ldHJpY3MnO1xyXG5pbXBvcnQgeyBTbW9Pcm5hbWVudCwgU21vQXJ0aWN1bGF0aW9uLCBTbW9EeW5hbWljVGV4dCwgU21vTHlyaWMsIFxyXG4gIFNtb0FycGVnZ2lvLCBTbW9Ob3RlTW9kaWZpZXJCYXNlLCBWZXhBbm5vdGF0aW9uUGFyYW1zLCBTbW9UYWJOb3RlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbm90ZU1vZGlmaWVycyc7XHJcbmltcG9ydCB7IFNtb1NlbGVjdGlvbiB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9zZWxlY3Rpb25zJztcclxuaW1wb3J0IHsgU21vTWVhc3VyZSwgTWVhc3VyZVRpY2ttYXBzIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZSc7XHJcbmltcG9ydCB7IFN2Z0hlbHBlcnMgfSBmcm9tICcuLi9zdWkvc3ZnSGVscGVycyc7XHJcbmltcG9ydCB7IENsZWYsIElzQ2xlZiB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL2NvbW1vbic7XHJcbmltcG9ydCB7IFN2Z1BhZ2UgfSBmcm9tICcuLi9zdWkvc3ZnUGFnZU1hcCc7XHJcbmltcG9ydCB7IFNtb1RhYlN0YXZlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvc3RhZmZNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyB0b1ZleEJhcmxpbmVUeXBlLCB2ZXhCYXJsaW5lVHlwZSwgdmV4QmFybGluZVBvc2l0aW9uLCB0b1ZleEJhcmxpbmVQb3NpdGlvbiwgdG9WZXhTeW1ib2wsXHJcbiAgdG9WZXhUZXh0SnVzdGlmaWNhdGlvbiwgdG9WZXhUZXh0UG9zaXRpb24sIGdldFZleENob3JkQmxvY2tzLCB0b1ZleFN0ZW1EaXJlY3Rpb24sXHJcbiAgVmV4VGFiTm90ZVBvc2l0aW9ucyB9IGZyb20gJy4vc21vQWRhcHRlcic7XHJcbmltcG9ydCB7IFZleEZsb3csIFN0YXZlLFN0ZW1tYWJsZU5vdGUsIE5vdGUsIEJlYW0sIFR1cGxldCwgVm9pY2UsXHJcbiAgRm9ybWF0dGVyLCBBY2NpZGVudGFsLCBBbm5vdGF0aW9uLCBTdGF2ZU5vdGVTdHJ1Y3QsIFN0YXZlVGV4dCwgU3RhdmVNb2RpZmllcixcclxuICBjcmVhdGVTdGF2ZVRleHQsIHJlbmRlckR5bmFtaWNzLCBhcHBseVN0ZW1EaXJlY3Rpb24sXHJcbiAgZ2V0VmV4Tm90ZVBhcmFtZXRlcnMsIGRlZmF1bHROb3RlU2NhbGUsIGRlZmF1bHRDdWVTY2FsZSwgZ2V0VmV4VHVwbGV0cyxcclxuICBjcmVhdGVTdGF2ZSwgY3JlYXRlVm9pY2UsIGdldE9ybmFtZW50R2x5cGgsIGdldFNsYXNoR2x5cGgsIGdldFJlcGVhdEJhciwgZ2V0TXVsdGltZWFzdXJlUmVzdCxcclxuICBjcmVhdGVUZXh0Tm90ZSwgVGFiU3RhdmUsIGNyZWF0ZVRhYlN0YXZlLCBUYWJOb3RlUG9zaXRpb24sIFRhYk5vdGVTdHJ1Y3QsXHJcbiAgQ3JlYXRlVmV4Tm90ZVBhcmFtcywgVGFiTm90ZSwgUGVkYWxNYXJraW5nXHJcbiAgIH0gZnJvbSAnLi4vLi4vY29tbW9uL3ZleCc7XHJcblxyXG5pbXBvcnQgeyBWeE1lYXN1cmVJZiwgVmV4Tm90ZU1vZGlmaWVySWYsIFZ4Tm90ZSB9IGZyb20gJy4vdnhOb3RlJztcclxuaW1wb3J0IHsgU21vVHVwbGV0IH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvdHVwbGV0JztcclxuaW1wb3J0IHsgdmV4R2x5cGggfSBmcm9tICcuL2dseXBoRGltZW5zaW9ucyc7XHJcbmNvbnN0IFZGID0gVmV4RmxvdztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuLy8gY29uc3QgVkYgPSBldmFsKCdWZXguRmxvdycpO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgVmV4RmxvdyBsaWJyYXJ5IHRoYXQgYWN0dWFsbHkgZG9lcyB0aGUgZW5ncmF2aW5nLlxyXG4gKiBAY2F0ZWdvcnkgU3VpUmVuZGVyXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVnhNZWFzdXJlIGltcGxlbWVudHMgVnhNZWFzdXJlSWYge1xyXG4gIGNvbnRleHQ6IFN2Z1BhZ2U7XHJcbiAgcHJpbnRpbmc6IGJvb2xlYW47XHJcbiAgc2VsZWN0aW9uOiBTbW9TZWxlY3Rpb247XHJcbiAgc29mdG1heDogbnVtYmVyO1xyXG4gIHNtb01lYXN1cmU6IFNtb01lYXN1cmU7XHJcbiAgc21vVGFiU3RhdmU/OiBTbW9UYWJTdGF2ZTtcclxuICB0YWJTdGF2ZT86IFRhYlN0YXZlO1xyXG4gIHJlbmRlcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbm90ZVRvVmV4TWFwOiBSZWNvcmQ8c3RyaW5nLCBOb3RlPiA9IHt9O1xyXG4gIGJlYW1Ub1ZleE1hcDogUmVjb3JkPHN0cmluZywgQmVhbT4gPSB7fTtcclxuICB0dXBsZXRUb1ZleE1hcDogUmVjb3JkPHN0cmluZywgVHVwbGV0PiA9IHt9O1xyXG4gIG11bHRpbWVhc3VyZVJlc3Q6IGFueSB8IG51bGwgPSBudWxsO1xyXG4gIHZleE5vdGVzOiBOb3RlW10gPSBbXTtcclxuICB2ZXhCZWFtR3JvdXBzOiBCZWFtW10gPSBbXTtcclxuICB2ZXhUdXBsZXRzOiBUdXBsZXRbXSA9IFtdO1xyXG4gIHRpY2ttYXBPYmplY3Q6IE1lYXN1cmVUaWNrbWFwcyB8IG51bGwgPSBudWxsO1xyXG4gIHN0YXZlOiBTdGF2ZSB8IG51bGwgPSBudWxsOyAvLyB2ZXggc3RhdmVcclxuICB2b2ljZU5vdGVzOiBOb3RlW10gPSBbXTsgLy8gbm90ZXMgZm9yIGN1cnJlbnQgdm9pY2UsIGFzIHJlbmRlcmluZ1xyXG4gIHRhYk5vdGVzOiBOb3RlW10gPSBbXTtcclxuICB2b2ljZUFyOiBWb2ljZVtdID0gW107XHJcbiAgdGFiVm9pY2U6IFZvaWNlIHwgbnVsbCA9IG51bGw7XHJcbiAgZm9ybWF0dGVyOiBGb3JtYXR0ZXIgfCBudWxsID0gbnVsbDtcclxuICBhbGxDdWVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbW9kaWZpZXJzVG9Cb3g6IFNtb05vdGVNb2RpZmllckJhc2VbXSA9IFtdO1xyXG4gIGNvbGxpc2lvbk1hcDogUmVjb3JkPG51bWJlciwgU21vTm90ZVtdPiA9IHt9O1xyXG4gIGRiZ0xlZnRYOiBudW1iZXIgPSAwO1xyXG4gIGRiZ1dpZHRoOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBTdmdQYWdlLCBzZWxlY3Rpb246IFNtb1NlbGVjdGlvbiwgcHJpbnRpbmc6IGJvb2xlYW4sIHNvZnRtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMucmVuZGVyZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xyXG4gICAgdGhpcy5zbW9NZWFzdXJlID0gdGhpcy5zZWxlY3Rpb24ubWVhc3VyZTtcclxuICAgIHRoaXMucHJpbnRpbmcgPSBwcmludGluZztcclxuICAgIHRoaXMuYWxsQ3VlcyA9IHNlbGVjdGlvbi5zdGFmZi5wYXJ0SW5mby5kaXNwbGF5Q3VlcztcclxuICAgIHRoaXMudHVwbGV0VG9WZXhNYXAgPSB7fTtcclxuICAgIHRoaXMudmV4Tm90ZXMgPSBbXTtcclxuICAgIHRoaXMudmV4QmVhbUdyb3VwcyA9IFtdO1xyXG4gICAgdGhpcy52ZXhCZWFtR3JvdXBzID0gW107XHJcbiAgICB0aGlzLmJlYW1Ub1ZleE1hcCA9IHt9O1xyXG4gICAgdGhpcy5zb2Z0bWF4ID0gc29mdG1heDtcclxuICAgIHRoaXMuc21vVGFiU3RhdmUgPSBzZWxlY3Rpb24uc3RhZmYuZ2V0VGFiU3RhdmVGb3JNZWFzdXJlKHNlbGVjdGlvbi5zZWxlY3Rvcik7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0IGZpbGxTdHlsZSgpIHtcclxuICAgIHJldHVybiAnIzAwMCc7XHJcbiAgfVxyXG4gIC8vIFRyZWF0IGEgcmVzdCBsaWtlIGEgd2hvbGUgcmVzdCBpZiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHJlc3QgaW4gdGhlIG1lYXN1cmVcclxuICAvLyBhbmQgdGhlIG1lYXN1cmUgbGVuZ3RoIGlzIG5vdCBhIHBpY2t1cFxyXG4gIGlzV2hvbGVSZXN0KCkge1xyXG4gICAgcmV0dXJuICh0aGlzLnNtb01lYXN1cmUudm9pY2VzLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICB0aGlzLnNtb01lYXN1cmUudm9pY2VzWzBdLm5vdGVzLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICB0aGlzLnNtb01lYXN1cmUudm9pY2VzWzBdLm5vdGVzWzBdLmlzUmVzdCgpICYmXHJcbiAgICAgIHRoaXMuc21vTWVhc3VyZS5nZXRNYXhUaWNrc1ZvaWNlKCkgPiA0MDk2XHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIGNyZWF0ZUNvbGxpc2lvblRpY2ttYXAoKSB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgaiA9IDA7XHJcbiAgICBpZiAoIXRoaXMudGlja21hcE9iamVjdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zbW9NZWFzdXJlLnZvaWNlcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCB0bSA9IHRoaXMudGlja21hcE9iamVjdC50aWNrbWFwc1tpXTtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IHRtLmR1cmF0aW9uTWFwLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0aGlzLmNvbGxpc2lvbk1hcFt0bS5kdXJhdGlvbk1hcFtqXV0pID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgdGhpcy5jb2xsaXNpb25NYXBbdG0uZHVyYXRpb25NYXBbal1dID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29sbGlzaW9uTWFwW3RtLmR1cmF0aW9uTWFwW2pdXS5wdXNoKHRoaXMuc21vTWVhc3VyZS52b2ljZXNbaV0ubm90ZXNbal0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlzQ29sbGlzaW9uKHZvaWNlSXg6IG51bWJlciwgdGlja0l4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIGxldCBqID0gMDtcclxuICAgIGxldCBrID0gMDtcclxuICAgIGxldCBzdGFmZkxpbmVzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgaWYgKCF0aGlzLnRpY2ttYXBPYmplY3QpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGljayA9IHRoaXMudGlja21hcE9iamVjdC50aWNrbWFwc1t2b2ljZUl4XS5kdXJhdGlvbk1hcFt0aWNrSXhdO1xyXG4gICAgLy8gSnVzdCBvbmUgbm90ZSwgbm8gY29sbGlzaW9uXHJcbiAgICBpZiAodGhpcy5jb2xsaXNpb25NYXBbdGlja10ubGVuZ3RoIDwgMikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jb2xsaXNpb25NYXBbdGlja10ubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgbm90ZSA9IHRoaXMuY29sbGlzaW9uTWFwW3RpY2tdW2ldO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgbm90ZS5waXRjaGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3QgY2xlZjogQ2xlZiA9IElzQ2xlZihub3RlLmNsZWYpID8gbm90ZS5jbGVmIDogJ3RyZWJsZSc7XHJcbiAgICAgICAgY29uc3QgcGl0Y2ggPSBub3RlLnBpdGNoZXNbal07XHJcbiAgICAgICAgY29uc3QgY3VyTGluZSA9IFNtb011c2ljLnBpdGNoVG9TdGFmZkxpbmUoY2xlZiwgcGl0Y2gpO1xyXG4gICAgICAgIGZvciAoayA9IDA7ayA8IHN0YWZmTGluZXMubGVuZ3RoOyArK2spIHtcclxuICAgICAgICAgIGlmIChNYXRoLmFicyhjdXJMaW5lIC0gc3RhZmZMaW5lc1trXSkgPCAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzdGFmZkxpbmVzLnB1c2goY3VyTGluZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNvbnZlcnQgYSBzbW9Ob3RlIGludG8gYSB2eE5vdGUgc28gaXQgY2FuIGJlIHJhc3Rlcml6ZWRcclxuICAgKiBAcGFyYW0gc21vTm90ZSBcclxuICAgKiBAcGFyYW0gdGlja0luZGV4IC0gdXNlZCB0byBjYWxjdWxhdGUgYWNjaWRlbnRhbFxyXG4gICAqIEBwYXJhbSB2b2ljZUl4IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIGNyZWF0ZVZleE5vdGUoc21vTm90ZTogU21vTm90ZSwgdGlja0luZGV4OiBudW1iZXIsIHZvaWNlSXg6IG51bWJlcikge1xyXG4gICAgbGV0IHZleE5vdGU6IE5vdGUgfCBudWxsID0gbnVsbDtcclxuICAgIGxldCBzbW9UYWJOb3RlOiBTbW9UYWJOb3RlIHwgbnVsbCA9IG51bGw7XHJcbiAgICBsZXQgdGltZXN0YW1wID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XHJcbiAgICBjb25zdCBzdGVtVGlja3MgPSBTbW9NdXNpYy50aWNrc1RvRHVyYXRpb25bc21vTm90ZS5zdGVtVGlja3NdO1xyXG4gICAgbGV0IHRhYk5vdGU6IFN0ZW1tYWJsZU5vdGUgfCBudWxsID0gbnVsbDtcclxuICAgIGNvbnN0IG5vdGVIZWFkID0gc21vTm90ZS5pc1Jlc3QoKSA/ICdyJyA6IHNtb05vdGUubm90ZUhlYWQ7XHJcbiAgICBjb25zdCBrZXlzID0gU21vTXVzaWMuc21vUGl0Y2hlc1RvVmV4S2V5cyhzbW9Ob3RlLnBpdGNoZXMsIDAsIG5vdGVIZWFkKTtcclxuICAgIGNvbnN0IHNtb05vdGVQYXJhbXMgPSB7XHJcbiAgICAgIGlzVHVwbGV0OiBzbW9Ob3RlLmlzVHVwbGV0LFxyXG4gICAgICBtZWFzdXJlSW5kZXg6IHRoaXMuc21vTWVhc3VyZS5tZWFzdXJlTnVtYmVyLm1lYXN1cmVJbmRleCxcclxuICAgICAgY2xlZjogc21vTm90ZS5jbGVmLFxyXG4gICAgICBzdGVtVGlja3MsXHJcbiAgICAgIGtleXMsXHJcbiAgICAgIG5vdGVUeXBlOiBzbW9Ob3RlLm5vdGVUeXBlLFxyXG4gICAgICBpc0N1ZTogc21vTm90ZS5pc0N1ZVxyXG4gICAgfTtcclxuICAgIGNvbnN0IHsgbm90ZVBhcmFtcywgZHVyYXRpb24gfSA9IGdldFZleE5vdGVQYXJhbWV0ZXJzKHNtb05vdGVQYXJhbXMpO1xyXG4gICAgaWYgKHRoaXMudGFiU3RhdmUgJiYgdGhpcy5zbW9UYWJTdGF2ZSkge1xyXG4gICAgICBzbW9UYWJOb3RlID0gdGhpcy5zbW9UYWJTdGF2ZS5nZXRUYWJOb3RlRnJvbU5vdGUoc21vTm90ZSwgdGhpcy5zbW9NZWFzdXJlLnRyYW5zcG9zZUluZGV4KTtcclxuICAgICAgaWYgKHNtb1RhYk5vdGUpIHtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbnM6IFRhYk5vdGVQb3NpdGlvbltdID0gVmV4VGFiTm90ZVBvc2l0aW9ucyh0aGlzLnNtb1RhYlN0YXZlLCBzbW9UYWJOb3RlLCBzbW9Ob3RlKTtcclxuICAgICAgICBpZiAocG9zaXRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgaWYgKCFzbW9Ob3RlLmlzUmVzdCgpKSB7XHJcbiAgICAgICAgICAgIHRhYk5vdGUgPSBuZXcgVkYuVGFiTm90ZSh7IHBvc2l0aW9ucywgZHVyYXRpb246IGR1cmF0aW9uIH0pO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zbW9UYWJTdGF2ZS5zaG93U3RlbXMpIHtcclxuICAgICAgICAgICAgICB0YWJOb3RlLnJlbmRlcl9vcHRpb25zLmRyYXdfc3RlbSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGFiTm90ZS5yZW5kZXJfb3B0aW9ucy5kcmF3X2RvdHMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRhYk5vdGUucmVuZGVyX29wdGlvbnMuZHJhd19zdGVtX3Rocm91Z2hfc3RhdmUgPSBzbW9UYWJOb3RlLmZsYWdUaHJvdWdoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0YWJOb3RlID0gbmV3IFZGLlN0YXZlTm90ZShub3RlUGFyYW1zKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChzbW9Ob3RlLm5vdGVUeXBlID09PSAnLycpIHtcclxuICAgICAgLy8gdmV4Tm90ZSA9IG5ldyBWRi5HbHlwaE5vdGUoJ1xcdUU1MDQnLCB7IGR1cmF0aW9uIH0pO1xyXG4gICAgICB2ZXhOb3RlID0gZ2V0U2xhc2hHbHlwaCgpO1xyXG4gICAgICBzbW9Ob3RlLnJlbmRlcklkID0gJ3ZmLScgKyB2ZXhOb3RlLmdldEF0dHJpYnV0ZSgnaWQnKTsgLy8gd2hlcmUgZG9lcyAndmYnIGNvbWUgZnJvbT9cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHNtb1ZleFN0ZW1QYXJhbXMgPSB7XHJcbiAgICAgICAgdm9pY2VDb3VudDogdGhpcy5zbW9NZWFzdXJlLnZvaWNlcy5sZW5ndGgsXHJcbiAgICAgICAgdm9pY2VJeCxcclxuICAgICAgICBpc0F1dG86IHNtb05vdGUuZmxhZ1N0YXRlID09PSBTbW9Ob3RlLmZsYWdTdGF0ZXMuYXV0byxcclxuICAgICAgICBpc1VwOiBzbW9Ob3RlLmZsYWdTdGF0ZSA9PT0gU21vTm90ZS5mbGFnU3RhdGVzLnVwXHJcbiAgICAgIH1cclxuICAgICAgYXBwbHlTdGVtRGlyZWN0aW9uKHNtb1ZleFN0ZW1QYXJhbXMsIG5vdGVQYXJhbXMpO1xyXG4gICAgICBpZiAoc21vVGFiTm90ZSAmJiB0YWJOb3RlKSB7XHJcbiAgICAgICAgdGFiTm90ZS5zZXRTdGVtRGlyZWN0aW9uKG5vdGVQYXJhbXMuc3RlbV9kaXJlY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICAgIGxheW91dERlYnVnLnNldFRpbWVzdGFtcChsYXlvdXREZWJ1Zy5jb2RlUmVnaW9ucy5QUkVGT1JNQVRBLCBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHRpbWVzdGFtcCk7XHJcbiAgICAgIHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudmFsdWVPZigpO1xyXG4gICAgICB2ZXhOb3RlID0gbmV3IFZGLlN0YXZlTm90ZShub3RlUGFyYW1zKTtcclxuICAgICAgaWYgKHZvaWNlSXggPiAwICYmIHRoaXMuaXNDb2xsaXNpb24odm9pY2VJeCwgdGlja0luZGV4KSkge1xyXG4gICAgICAgIHZleE5vdGUuc2V0WFNoaWZ0KC0xMCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuaXNXaG9sZVJlc3QoKSkge1xyXG4gICAgICAgIG5vdGVQYXJhbXMuZHVyYXRpb24gPSAnd3InO1xyXG4gICAgICAgIHZleE5vdGUgPSBuZXcgVkYuU3RhdmVOb3RlKG5vdGVQYXJhbXMpO1xyXG4gICAgICAgIHZleE5vdGUuc2V0Q2VudGVyQWxpZ25tZW50KHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGxheW91dERlYnVnLnNldFRpbWVzdGFtcChsYXlvdXREZWJ1Zy5jb2RlUmVnaW9ucy5QUkVGT1JNQVRCLCBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHRpbWVzdGFtcCk7XHJcbiAgICAgIHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudmFsdWVPZigpO1xyXG4gICAgICBpZiAoc21vTm90ZS5maWxsU3R5bGUgJiYgIXRoaXMucHJpbnRpbmcpIHtcclxuICAgICAgICB2ZXhOb3RlLnNldFN0eWxlKHsgZmlsbFN0eWxlOiBzbW9Ob3RlLmZpbGxTdHlsZSB9KTtcclxuICAgICAgfSBlbHNlIGlmICh2b2ljZUl4ID4gMCAmJiAhdGhpcy5wcmludGluZykge1xyXG4gICAgICAgIHZleE5vdGUuc2V0U3R5bGUoeyBmaWxsU3R5bGU6IFwiIzExNTUxMVwiIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKHNtb05vdGUuaXNIaWRkZW4oKSAmJiB0aGlzLnByaW50aW5nKSB7XHJcbiAgICAgICAgdmV4Tm90ZS5zZXRTdHlsZSh7IGZpbGxTdHlsZTogXCIjZmZmZmZmMDBcIiB9KTtcclxuICAgICAgfVxyXG4gICAgICBzbW9Ob3RlLnJlbmRlcklkID0gJ3ZmLScgKyB2ZXhOb3RlLmdldEF0dHJpYnV0ZSgnaWQnKTsgLy8gd2hlcmUgZG9lcyAndmYnIGNvbWUgZnJvbT9cclxuICAgIH1cclxuICAgIGNvbnN0IG5vdGVEYXRhOiBWZXhOb3RlTW9kaWZpZXJJZiA9IHtcclxuICAgICAgc21vTWVhc3VyZTogdGhpcy5zbW9NZWFzdXJlLFxyXG4gICAgICB2eE1lYXN1cmU6IHRoaXMsXHJcbiAgICAgIHNtb05vdGU6IHNtb05vdGUsXHJcbiAgICAgIHN0YXZlTm90ZTogdmV4Tm90ZSxcclxuICAgICAgdm9pY2VJbmRleDogdm9pY2VJeCxcclxuICAgICAgdGlja0luZGV4OiB0aWNrSW5kZXhcclxuICAgIH1cclxuICAgIGlmICh0YWJOb3RlKSB7XHJcbiAgICAgIG5vdGVEYXRhLnRhYk5vdGUgPSB0YWJOb3RlO1xyXG4gICAgICB0aGlzLnRhYk5vdGVzLnB1c2godGFiTm90ZSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtb2RPYmogPSBuZXcgVnhOb3RlKG5vdGVEYXRhKTtcclxuICAgIG1vZE9iai5hZGRNb2RpZmllcnMoKTtcclxuICAgIGxheW91dERlYnVnLnNldFRpbWVzdGFtcChsYXlvdXREZWJ1Zy5jb2RlUmVnaW9ucy5QUkVGT1JNQVRDLCBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHRpbWVzdGFtcCk7XHJcblxyXG4gICAgcmV0dXJuIG1vZE9iajtcclxuICB9XHJcblxyXG4gIHJlbmRlck5vdGVHbHlwaChzbW9Ob3RlOiBTbW9Ob3RlLCB0ZXh0T2JqOiBTbW9EeW5hbWljVGV4dCkge1xyXG4gICAgdmFyIHggPSB0aGlzLm5vdGVUb1ZleE1hcFtzbW9Ob3RlLmF0dHJzLmlkXS5nZXRBYnNvbHV0ZVgoKSArIHRleHRPYmoueE9mZnNldDtcclxuICAgIC8vIHRoZSAtMyBpcyBjb3BpZWQgZnJvbSB2ZXhmbG93IHRleHREeW5hbWljc1xyXG4gICAgdmFyIHkgPSB0aGlzLnN0YXZlIS5nZXRZRm9yTGluZSh0ZXh0T2JqLnlPZmZzZXRMaW5lIC0gMykgKyB0ZXh0T2JqLnlPZmZzZXRQaXhlbHM7XHJcbiAgICBsZXQgbWF4aCA9IDA7XHJcbiAgICBjb25zdCBtaW54ID0geDtcclxuICAgIHZhciBncm91cCA9IHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkub3Blbkdyb3VwKCk7XHJcbiAgICBncm91cC5jbGFzc0xpc3QuYWRkKHRleHRPYmouYXR0cnMuaWQgKyAnLScgKyBzbW9Ob3RlLmF0dHJzLmlkKTtcclxuICAgIGdyb3VwLmNsYXNzTGlzdC5hZGQodGV4dE9iai5hdHRycy5pZCk7XHJcbiAgICAvLyBjb25zdCBkdXJhdGlvbiA9IFNtb011c2ljLmNsb3Nlc3RWZXhEdXJhdGlvbihzbW9Ob3RlLnRpY2tDb3VudCk7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHRPYmoudGV4dC5sZW5ndGg7IGkgKz0gMSApIHtcclxuICAgICAgY29uc3QgeyB3aWR0aCAsIGhlaWdodCB9ID0gcmVuZGVyRHluYW1pY3ModGhpcy5jb250ZXh0LmdldENvbnRleHQoKSwgVkYuVGV4dER5bmFtaWNzLkdMWVBIU1t0ZXh0T2JqLnRleHRbaV1dLmNvZGUsXHJcbiAgICAgICAgdGV4dE9iai5mb250U2l6ZSwgeCwgeSk7XHJcbiAgICAgIC8qIGNvbnN0IHsgd2lkdGggLCBoZWlnaHQgfSA9IHJlbmRlckR5bmFtaWNzKHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCksIFZGLlRleHREeW5hbWljcy5HTFlQSFNbdGV4dE9iai50ZXh0W2ldXSxcclxuICAgICAgICB0ZXh0T2JqLmZvbnRTaXplLCB4LCB5KTsgKi9cclxuICAgICAgeCArPSB3aWR0aDtcclxuICAgICAgbWF4aCA9IE1hdGgubWF4KGhlaWdodCwgbWF4aCk7ICAgICAgXHJcbiAgICB9XHJcbiAgICB0ZXh0T2JqLmxvZ2ljYWxCb3ggPSBTdmdIZWxwZXJzLmJveFBvaW50cyhtaW54LCB5ICsgdGhpcy5jb250ZXh0LmJveC55LCB4IC0gbWlueCwgbWF4aCk7XHJcbiAgICB0ZXh0T2JqLmVsZW1lbnQgPSBncm91cDtcclxuICAgIHRoaXMubW9kaWZpZXJzVG9Cb3gucHVzaCh0ZXh0T2JqKTtcclxuICAgIHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkuY2xvc2VHcm91cCgpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyRHluYW1pY3MoKSB7XHJcbiAgICB0aGlzLnNtb01lYXN1cmUudm9pY2VzLmZvckVhY2goKHZvaWNlKSA9PiB7XHJcbiAgICAgIHZvaWNlLm5vdGVzLmZvckVhY2goKHNtb05vdGUpID0+IHtcclxuICAgICAgICBjb25zdCBtb2RzID0gc21vTm90ZS50ZXh0TW9kaWZpZXJzLmZpbHRlcigobW9kKSA9PlxyXG4gICAgICAgICAgbW9kLmF0dHJzLnR5cGUgPT09ICdTbW9EeW5hbWljVGV4dCdcclxuICAgICAgICApO1xyXG4gICAgICAgIG1vZHMuZm9yRWFjaCgoYnRtKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB0bSA9IGJ0bSBhcyBTbW9EeW5hbWljVGV4dDtcclxuICAgICAgICAgIHRoaXMucmVuZGVyTm90ZUdseXBoKHNtb05vdGUsIHRtKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgY3JlYXRlUmVwZWF0U3ltYm9sKCkge1xyXG4gICAgdGhpcy52b2ljZU5vdGVzID0gW107XHJcbiAgICAvLyBjb25zdCB2ZXhOb3RlID0gbmV3IFZGLkdseXBoTm90ZSgnXFx1RTUwMCcsIHsgZHVyYXRpb246ICd3JyB9LCB7IGxpbmU6IDIgfSk7XHJcbiAgICBjb25zdCB2ZXhOb3RlID0gZ2V0UmVwZWF0QmFyKCk7XHJcbiAgICB2ZXhOb3RlLnNldENlbnRlckFsaWdubWVudCh0cnVlKTtcclxuICAgIHRoaXMudmV4Tm90ZXMucHVzaCh2ZXhOb3RlKTtcclxuICAgIHRoaXMudm9pY2VOb3Rlcy5wdXNoKHZleE5vdGUpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBjcmVhdGUgYW4gYSBhcnJheSBvZiBWRi5TdGF2ZU5vdGUgb2JqZWN0cyB0byByZW5kZXIgdGhlIGFjdGl2ZSB2b2ljZS5cclxuICAgKiBAcGFyYW0gdm9pY2VJeCBcclxuICAgKi9cclxuICBjcmVhdGVWZXhOb3Rlcyh2b2ljZUl4OiBudW1iZXIpIHtcclxuICAgIGxldCBpID0gMDtcclxuICAgIHRoaXMudm9pY2VOb3RlcyA9IFtdO1xyXG4gICAgY29uc3Qgdm9pY2UgPSB0aGlzLnNtb01lYXN1cmUudm9pY2VzW3ZvaWNlSXhdO1xyXG4gICAgbGV0IGNsZWZOb3RlQWRkZWQgPSBmYWxzZTtcclxuXHJcbiAgICBmb3IgKGkgPSAwO1xyXG4gICAgICBpIDwgdm9pY2Uubm90ZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3Qgc21vTm90ZSA9IHZvaWNlLm5vdGVzW2ldO1xyXG4gICAgICBjb25zdCB0ZXh0Tm90ZXMgPSBzbW9Ob3RlLmdldFRleHRPcm5hbWVudHMoKTtcclxuICAgICAgY29uc3QgdmV4Tm90ZSA9IHRoaXMuY3JlYXRlVmV4Tm90ZShzbW9Ob3RlLCBpLCB2b2ljZUl4KTtcclxuICAgICAgdGhpcy5ub3RlVG9WZXhNYXBbc21vTm90ZS5hdHRycy5pZF0gPSB2ZXhOb3RlLm5vdGVEYXRhLnN0YXZlTm90ZTtcclxuICAgICAgdGhpcy52ZXhOb3Rlcy5wdXNoKHZleE5vdGUubm90ZURhdGEuc3RhdmVOb3RlKTtcclxuXHJcbiAgICAgIGlmICh2ZXhOb3RlLm5vdGVEYXRhLnNtb05vdGUuY2xlZk5vdGUgJiYgIWNsZWZOb3RlQWRkZWQpIHtcclxuICAgICAgICBjb25zdCBjZiA9IG5ldyBWRi5DbGVmTm90ZSh2ZXhOb3RlLm5vdGVEYXRhLnNtb05vdGUuY2xlZk5vdGUuY2xlZiwgJ3NtYWxsJyk7XHJcbiAgICAgICAgdGhpcy52b2ljZU5vdGVzLnB1c2goY2YpO1xyXG4gICAgICAgIGNsZWZOb3RlQWRkZWQgPSB0cnVlOyAvLyBpZ25vcmUgMm5kIGluIGEgbWVhc3VyZVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudm9pY2VOb3Rlcy5wdXNoKHZleE5vdGUubm90ZURhdGEuc3RhdmVOb3RlKTtcclxuICAgICAgdGV4dE5vdGVzLmZvckVhY2goKHRuKSA9PiB7XHJcbiAgICAgICAgdGhpcy52b2ljZU5vdGVzLnB1c2goY3JlYXRlVGV4dE5vdGUoU21vT3JuYW1lbnQudGV4dE5vdGVPcm5hbWVudHNbdG4ub3JuYW1lbnRdKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoaXNOYU4oc21vTm90ZS50aWNrcy5udW1lcmF0b3IpIHx8IGlzTmFOKHNtb05vdGUudGlja3MuZGVub21pbmF0b3IpXHJcbiAgICAgICAgfHwgaXNOYU4oc21vTm90ZS50aWNrcy5yZW1haW5kZXIpKSB7XHJcbiAgICAgICAgdGhyb3cgKCd2eE1lYXN1cmU6IE5hTiBpbiB0aWNrcycpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHcm91cCB0aGUgbm90ZXMgZm9yIGJlYW1pbmcgYW5kIGNyZWF0ZSBWZXggYmVhbSBvYmplY3RzXHJcbiAgICogQHBhcmFtIHZpeCAtIHZvaWNlIGluZGV4XHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgY3JlYXRlVmV4QmVhbUdyb3Vwcyh2aXg6IG51bWJlcikge1xyXG4gICAgbGV0IGtleU5vdGVJeCA9IC0xO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgbGV0IGogPSAwO1xyXG4gICAgbGV0IHN0ZW1EaXJlY3Rpb24gPSBWRi5TdGVtLkRPV047XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5zbW9NZWFzdXJlLmJlYW1Hcm91cHMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgYmcgPSB0aGlzLnNtb01lYXN1cmUuYmVhbUdyb3Vwc1tpXTtcclxuICAgICAgaWYgKGJnLnZvaWNlICE9PSB2aXgpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB2ZXhOb3RlczogU3RlbW1hYmxlTm90ZVtdID0gW107XHJcbiAgICAgIGtleU5vdGVJeCA9IGJnLm5vdGVzLmZpbmRJbmRleCgobm4pID0+IG5uLm5vdGVUeXBlID09PSAnbicpO1xyXG5cclxuICAgICAgLy8gRml4IHN0ZW0gYnVnOiBrZXkgb2ZmIGZpcnN0IG5vbi1yZXN0IG5vdGUuXHJcbiAgICAgIGtleU5vdGVJeCA9IChrZXlOb3RlSXggPj0gMCkgPyBrZXlOb3RlSXggOiAwO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgYmcubm90ZXMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBjb25zdCBub3RlID0gYmcubm90ZXNbal07XHJcbiAgICAgICAgaWYgKG5vdGUubm90ZVR5cGUgPT09ICcvJykge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHZleE5vdGUgPSB0aGlzLm5vdGVUb1ZleE1hcFtub3RlLmF0dHJzLmlkXTtcclxuICAgICAgICAvLyBzb21lIHR5cGUgb2YgcmVkcmF3IGNvbmRpdGlvbj9cclxuICAgICAgICBpZiAoISh2ZXhOb3RlIGluc3RhbmNlb2YgVkYuU3RhdmVOb3RlIHx8IHZleE5vdGUgaW5zdGFuY2VvZiBWRi5HcmFjZU5vdGUpKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChub3RlLnRpY2tDb3VudCA+PSA0MDk2IHx8IHZleE5vdGUuZ2V0SW50cmluc2ljVGlja3MoKSA+PSA0MDk2KSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ2JhZCBsZW5ndGggaW4gYmVhbSBncm91cCcpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoa2V5Tm90ZUl4ID09PSBqKSB7XHJcbiAgICAgICAgICBzdGVtRGlyZWN0aW9uID0gbm90ZS5mbGFnU3RhdGUgPT09IFNtb05vdGUuZmxhZ1N0YXRlcy5hdXRvID9cclxuICAgICAgICAgICAgdmV4Tm90ZS5nZXRTdGVtRGlyZWN0aW9uKCkgOiB0b1ZleFN0ZW1EaXJlY3Rpb24obm90ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZleE5vdGUuc2V0U3RlbURpcmVjdGlvbihzdGVtRGlyZWN0aW9uKTtcclxuICAgICAgICB2ZXhOb3Rlcy5wdXNoKHZleE5vdGUpOyAgXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdmV4QmVhbSA9IG5ldyBWRi5CZWFtKHZleE5vdGVzKTtcclxuICAgICAgdmV4QmVhbS5icmVha1NlY29uZGFyeUF0KGJnLnNlY29uZGFyeUJlYW1CcmVha3MpO1xyXG4gICAgICB0aGlzLmJlYW1Ub1ZleE1hcFtiZy5hdHRycy5pZF0gPSB2ZXhCZWFtO1xyXG4gICAgICB0aGlzLnZleEJlYW1Hcm91cHMucHVzaCh2ZXhCZWFtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNyZWF0ZVZleFR1cGxldHModml4OiBudW1iZXIpIHtcclxuICAgIHRoaXMudmV4VHVwbGV0cyA9IFtdO1xyXG4gICAgdGhpcy50dXBsZXRUb1ZleE1hcCA9IHt9O1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNtb01lYXN1cmUudHVwbGV0VHJlZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgdHVwbGV0VHJlZSA9IHRoaXMuc21vTWVhc3VyZS50dXBsZXRUcmVlc1tpXTtcclxuICAgICAgaWYgKHR1cGxldFRyZWUudm9pY2UgIT09IHZpeCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRyYXZlcnNlVHVwbGV0VHJlZSA9ICggcGFyZW50VHVwbGV0OiBTbW9UdXBsZXQpOiB2b2lkID0+IHtcclxuICAgICAgICBjb25zdCB2ZXhOb3RlczogTm90ZVtdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgc21vTm90ZSBvZiB0aGlzLnNtb01lYXN1cmUudHVwbGV0Tm90ZXMocGFyZW50VHVwbGV0KSkge1xyXG4gICAgICAgICAgdmV4Tm90ZXMucHVzaCh0aGlzLm5vdGVUb1ZleE1hcFtzbW9Ob3RlLmF0dHJzLmlkXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIElmIHRoZSB0dXBsZXQgaGFzIGJlZW4gZGVsZXRlZCwgdGhlIG1lYXN1cmUgbWlnaHQgbm90IGJlIHVwZGF0ZWQuXHJcbiAgICAgICAgaWYgKHZleE5vdGVzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLnNtb01lYXN1cmUuZ2V0U3RlbURpcmVjdGlvbkZvclR1cGxldChwYXJlbnRUdXBsZXQpID09PSBTbW9Ob3RlLmZsYWdTdGF0ZXMudXAgP1xyXG4gICAgICAgICAgVkYuVHVwbGV0LkxPQ0FUSU9OX1RPUCA6IFZGLlR1cGxldC5MT0NBVElPTl9CT1RUT007XHJcbiAgICAgICAgY29uc3Qgc21vVHVwbGV0UGFyYW1zID0ge1xyXG4gICAgICAgICAgdmV4Tm90ZXMsXHJcbiAgICAgICAgICBudW1Ob3RlczogcGFyZW50VHVwbGV0Lm51bU5vdGVzLFxyXG4gICAgICAgICAgbm90ZXNPY2N1cGllZDogcGFyZW50VHVwbGV0Lm5vdGVzT2NjdXBpZWQsXHJcbiAgICAgICAgICByYXRpb2VkOiBwYXJlbnRUdXBsZXQucmF0aW9lZCxcclxuICAgICAgICAgIGJyYWNrZXRlZDogcGFyZW50VHVwbGV0LmJyYWNrZXRlZCxcclxuICAgICAgICAgIGxvY2F0aW9uXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHZleFR1cGxldCA9IGdldFZleFR1cGxldHMoc21vVHVwbGV0UGFyYW1zKTtcclxuXHJcbiAgICAgICAgdGhpcy50dXBsZXRUb1ZleE1hcFtwYXJlbnRUdXBsZXQuYXR0cnMuaWRdID0gdmV4VHVwbGV0O1xyXG4gICAgICAgIHRoaXMudmV4VHVwbGV0cy5wdXNoKHZleFR1cGxldCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRUdXBsZXQuY2hpbGRyZW5UdXBsZXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCB0dXBsZXQgPSBwYXJlbnRUdXBsZXQuY2hpbGRyZW5UdXBsZXRzW2ldO1xyXG4gICAgICAgICAgdHJhdmVyc2VUdXBsZXRUcmVlKHR1cGxldCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRyYXZlcnNlVHVwbGV0VHJlZSh0dXBsZXRUcmVlLnR1cGxldCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBjcmVhdGUgdGhlIG1vZGlmaWVycyBmb3IgdGhlIHN0YXZlIGl0c2VsZiwgYmFyIGxpbmVzIGV0Yy5cclxuICAgKi9cclxuICBjcmVhdGVNZWFzdXJlTW9kaWZpZXJzKCkge1xyXG4gICAgY29uc3Qgc2IgPSB0aGlzLnNtb01lYXN1cmUuZ2V0U3RhcnRCYXJsaW5lKCk7XHJcbiAgICBjb25zdCBlYiA9IHRoaXMuc21vTWVhc3VyZS5nZXRFbmRCYXJsaW5lKCk7XHJcbiAgICBjb25zdCBzeW0gPSB0aGlzLnNtb01lYXN1cmUuZ2V0UmVwZWF0U3ltYm9sKCk7XHJcbiAgICBpZiAoIXRoaXMuc3RhdmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRvbid0IGNyZWF0ZSBhIGJlZ2luIGJhciBmb3IgYW55IGJ1dCB0aGUgMXN0IG1lYXN1cmUuXHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLm1lYXN1cmVOdW1iZXIuc3lzdGVtSW5kZXggIT09IDAgJiYgc2IuYmFybGluZSA9PT0gU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXJcclxuICAgICAgJiYgdGhpcy5zbW9NZWFzdXJlLmZvcm1hdC5wYWRMZWZ0ID09PSAwKSB7XHJcbiAgICAgIHRoaXMuc3RhdmUuc2V0QmVnQmFyVHlwZShWRi5CYXJsaW5lLnR5cGUuTk9ORSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0YXZlLnNldEJlZ0JhclR5cGUodG9WZXhCYXJsaW5lVHlwZShzYikpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcubXVsdGltZWFzdXJlTGVuZ3RoID4gMCAmJiAhdGhpcy5zbW9NZWFzdXJlLnN2Zy5oaWRlTXVsdGltZWFzdXJlKSB7XHJcbiAgICAgIHRoaXMuc3RhdmUuc2V0RW5kQmFyVHlwZSh2ZXhCYXJsaW5lVHlwZVt0aGlzLnNtb01lYXN1cmUuc3ZnLm11bHRpbWVhc3VyZUVuZEJhcmxpbmVdKTtcclxuICAgIH0gZWxzZSBpZiAoZWIuYmFybGluZSAhPT0gU21vQmFybGluZS5iYXJsaW5lcy5zaW5nbGVCYXIpIHtcclxuICAgICAgdGhpcy5zdGF2ZS5zZXRFbmRCYXJUeXBlKHRvVmV4QmFybGluZVR5cGUoZWIpKTtcclxuICAgIH1cclxuICAgIGlmIChzeW0gJiYgc3ltLnN5bWJvbCAhPT0gU21vUmVwZWF0U3ltYm9sLnN5bWJvbHMuTm9uZSkge1xyXG4gICAgICBjb25zdCByZXAgPSBuZXcgVkYuUmVwZXRpdGlvbih0b1ZleFN5bWJvbChzeW0pLCBzeW0ueE9mZnNldCArIHRoaXMuc21vTWVhc3VyZS5zdGFmZlgsIHN5bS55T2Zmc2V0KTtcclxuICAgICAgdGhpcy5zdGF2ZS5nZXRNb2RpZmllcnMoKS5wdXNoKHJlcCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0bXMgPSB0aGlzLnNtb01lYXN1cmUuZ2V0TWVhc3VyZVRleHQoKTtcclxuICAgIC8vIFRPRE86IHNldCBmb250XHJcbiAgICB0bXMuZm9yRWFjaCgodG1iOiBTbW9NZWFzdXJlTW9kaWZpZXJCYXNlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRtID0gdG1iIGFzIFNtb01lYXN1cmVUZXh0O1xyXG4gICAgICBjb25zdCBvZmZzZXQgPSB0bS5wb3NpdGlvbiA9PT0gU21vTWVhc3VyZVRleHQucG9zaXRpb25zLmxlZnQgPyB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQgOiAwO1xyXG4gICAgICBjb25zdCBzdGF2ZVRleHQgPSBjcmVhdGVTdGF2ZVRleHQodG0udGV4dCwgdG9WZXhUZXh0UG9zaXRpb24odG0pLCBcclxuICAgICAge1xyXG4gICAgICAgIHNoaWZ0WDogdG0uYWRqdXN0WCArIG9mZnNldCwgc2hpZnRZOiB0bS5hZGp1c3RZLCBqdXN0aWZpY2F0aW9uOiB0b1ZleFRleHRKdXN0aWZpY2F0aW9uKHRtKVxyXG4gICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc3RhdmU/LmFkZE1vZGlmaWVyKHN0YXZlVGV4dCk7XHJcblxyXG4gICAgICAvLyBoYWNrIC0gd2UgY2FuJ3QgY3JlYXRlIHN0YXZlVGV4dCBkaXJlY3RseSBzbyB0aGlzIGlzIHRoZSBvbmx5IHdheSBJIGNvdWxkIHNldCB0aGUgZm9udFxyXG4gICAgICBjb25zdCBhciA9IHRoaXMuc3RhdmUhLmdldE1vZGlmaWVycygpO1xyXG4gICAgICBjb25zdCB2bSA9IGFyW2FyLmxlbmd0aCAtIDFdO1xyXG4gICAgICB2bS5zZXRGb250KHRtLmZvbnRJbmZvKTtcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcucm93SW5TeXN0ZW0gPT09IDApIHtcclxuICAgICAgY29uc3Qgcm1iID0gdGhpcy5zbW9NZWFzdXJlLmdldFJlaGVhcnNhbE1hcmsoKTtcclxuICAgICAgY29uc3Qgcm0gPSBybWIgYXMgU21vUmVoZWFyc2FsTWFyaztcclxuICAgICAgaWYgKHJtKSB7XHJcbiAgICAgICAgdGhpcy5zdGF2ZS5zZXRTZWN0aW9uKHJtLnN5bWJvbCwgMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0ZW1wbyA9IHRoaXMuc21vTWVhc3VyZS5nZXRUZW1wbygpO1xyXG4gICAgaWYgKHRlbXBvICYmIHRoaXMuc21vTWVhc3VyZS5zdmcuZm9yY2VUZW1wbykge1xyXG4gICAgICB0aGlzLnN0YXZlLnNldFRlbXBvKHRlbXBvLnRvVmV4VGVtcG8oKSwgLTEgKiB0ZW1wby55T2Zmc2V0KTtcclxuICAgICAgY29uc3QgdmV4VGVtcG8gPSB0aGlzLnN0YXZlLmdldE1vZGlmaWVycygpLmZpbmQoKG1vZDogU3RhdmVNb2RpZmllcikgPT4gbW9kLmdldEF0dHJpYnV0ZSgndHlwZScpID09PSAnU3RhdmVUZW1wbycpO1xyXG4gICAgICBpZiAodmV4VGVtcG8pIHtcclxuICAgICAgICB2ZXhUZW1wby5zZXRGb250KHsgZmFtaWx5OiBTb3VyY2VTZXJpZlByb0ZvbnQuZm9udEZhbWlseSwgc2l6ZTogMTMsIHdlaWdodDogJ2JvbGQnIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYWxsIFZleCBub3RlcyBhbmQgbW9kaWZpZXJzLiAgV2UgZGVmZXIgdGhlIGZvcm1hdCBhbmQgcmVuZGVyaW5nIHNvXHJcbiAgICogd2UgY2FuIGFsaWduIGFjcm9zcyBtdWx0aXBsZSBzdGF2ZXNcclxuICAgKi9cclxuICBwcmVGb3JtYXQoKSB7XHJcbiAgICB2YXIgaiA9IDA7XHJcbiAgICBpZiAodGhpcy5zbW9NZWFzdXJlLnN2Zy5lbGVtZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcuZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgdGhpcy5zbW9NZWFzdXJlLnN2Zy5lbGVtZW50ID0gbnVsbDtcclxuICAgICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcudGFiRWxlbWVudCkge1xyXG4gICAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcudGFiRWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLnNtb01lYXN1cmUuc3ZnLnRhYkVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLmhpZGVFbXB0eU1lYXN1cmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gTm90ZTogbmVlZCB0byBkbyB0aGlzIHRvIGdldCBpdCBpbnRvIFZFWCBLUyBmb3JtYXRcclxuICAgIGNvbnN0IHN0YWZmWCA9IHRoaXMuc21vTWVhc3VyZS5zdGFmZlggKyB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQ7XHJcbiAgICBjb25zdCBzdGFmZlkgPSB0aGlzLnNtb01lYXN1cmUuc3RhZmZZIC0gdGhpcy5jb250ZXh0LmJveC55O1xyXG4gICAgY29uc3Qga2V5ID0gU21vTXVzaWMudmV4S2V5U2lnbmF0dXJlVHJhbnNwb3NlKHRoaXMuc21vTWVhc3VyZS5rZXlTaWduYXR1cmUsIDApO1xyXG4gICAgY29uc3QgY2FuY2VsZWRLZXkgPSBTbW9NdXNpYy52ZXhLZXlTaWduYXR1cmVUcmFuc3Bvc2UodGhpcy5zbW9NZWFzdXJlLmNhbmNlbGVkS2V5U2lnbmF0dXJlLCAwKTtcclxuICAgIGNvbnN0IHNtb1ZleFN0YXZlUGFyYW1zID0ge1xyXG4gICAgICB4OiBzdGFmZlgsXHJcbiAgICAgIHk6IHN0YWZmWSxcclxuICAgICAgcGFkTGVmdDogdGhpcy5zbW9NZWFzdXJlLmZvcm1hdC5wYWRMZWZ0LFxyXG4gICAgICBpZDogdGhpcy5zbW9NZWFzdXJlLmlkLFxyXG4gICAgICBzdGFmZlg6IHRoaXMuc21vTWVhc3VyZS5zdGFmZlgsXHJcbiAgICAgIHN0YWZmWTogdGhpcy5zbW9NZWFzdXJlLnN0YWZmWSxcclxuICAgICAgc3RhZmZXaWR0aDogdGhpcy5zbW9NZWFzdXJlLnN0YWZmV2lkdGgsXHJcbiAgICAgIGZvcmNlQ2xlZjogdGhpcy5zbW9NZWFzdXJlLnN2Zy5mb3JjZUNsZWYsXHJcbiAgICAgIGNsZWY6IHRoaXMuc21vTWVhc3VyZS5jbGVmLFxyXG4gICAgICBmb3JjZUtleTogdGhpcy5zbW9NZWFzdXJlLnN2Zy5mb3JjZUtleVNpZ25hdHVyZSxcclxuICAgICAga2V5LFxyXG4gICAgICBjYW5jZWxlZEtleSxcclxuICAgICAgc3RhcnRYOiB0aGlzLnNtb01lYXN1cmUuc3ZnLm1heENvbHVtblN0YXJ0WCxcclxuICAgICAgYWRqWDogdGhpcy5zbW9NZWFzdXJlLnN2Zy5hZGpYLFxyXG4gICAgICBsaW5lczogdGhpcy5zbW9NZWFzdXJlLmxpbmVzLFxyXG4gICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpXHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXZlID0gY3JlYXRlU3RhdmUoc21vVmV4U3RhdmVQYXJhbXMpO1xyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcuZm9yY2VUaW1lU2lnbmF0dXJlKSB7XHJcbiAgICAgIGNvbnN0IHRzID0gdGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmU7XHJcbiAgICAgIGxldCB0c1N0cmluZyA9IHRzLnRpbWVTaWduYXR1cmU7XHJcbiAgICAgIGlmICh0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS51c2VTeW1ib2wgJiYgdHMuYWN0dWFsQmVhdHMgPT09IDQgJiYgdHMuYmVhdER1cmF0aW9uID09PSA0KSB7XHJcbiAgICAgICAgdHNTdHJpbmcgPSAnQyc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmUudXNlU3ltYm9sICYmIHRzLmFjdHVhbEJlYXRzID09PSAyICYmIHRzLmJlYXREdXJhdGlvbiA9PT0gNCkge1xyXG4gICAgICAgIHRzU3RyaW5nID0gJ0N8JztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS5kaXNwbGF5U3RyaW5nLmxlbmd0aCkge1xyXG4gICAgICAgIHRzU3RyaW5nID0gdGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmUuZGlzcGxheVN0cmluZztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnN0YXZlLmFkZFRpbWVTaWduYXR1cmUodHNTdHJpbmcpO1xyXG4gICAgfVxyXG4gICAgLy8gQ29ubmVjdCBpdCB0byB0aGUgcmVuZGVyaW5nIGNvbnRleHQgYW5kIGRyYXchXHJcbiAgICB0aGlzLnN0YXZlLnNldENvbnRleHQodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSk7XHJcbiAgICBpZiAodGhpcy5zbW9UYWJTdGF2ZSAmJiB0aGlzLnNtb01lYXN1cmUuc3ZnLnRhYlN0YXZlQm94Py53aWR0aCkge1xyXG4gICAgICBjb25zdCBib3ggPSB0aGlzLnNtb01lYXN1cmUuc3ZnLnRhYlN0YXZlQm94O1xyXG4gICAgICBsZXQgdGFiV2lkdGggPSAwO1xyXG4gICAgICBib3gueSAtPSB0aGlzLmNvbnRleHQuYm94Lnk7XHJcbiAgICAgIGJveC54ID0gc3RhZmZYIC0gdGhpcy5jb250ZXh0LmJveC54O1xyXG4gICAgICBib3gud2lkdGggPSB0aGlzLnNtb01lYXN1cmUuc3RhZmZXaWR0aDtcclxuICAgICAgdGhpcy50YWJTdGF2ZSA9IGNyZWF0ZVRhYlN0YXZlKGJveCwgdGhpcy5zbW9UYWJTdGF2ZS5zcGFjaW5nLCB0aGlzLnNtb1RhYlN0YXZlLm51bUxpbmVzKTtcclxuICAgICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcuZm9yY2VDbGVmKSB7XHJcbiAgICAgICAgdGhpcy50YWJTdGF2ZS5hZGRUYWJHbHlwaCgpO1xyXG4gICAgICAgIHRhYldpZHRoID0gdmV4R2x5cGguZGltZW5zaW9uc1sndGFiJ10ud2lkdGg7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50YWJTdGF2ZS5zZXROb3RlU3RhcnRYKHRoaXMudGFiU3RhdmUuZ2V0Tm90ZVN0YXJ0WCgpICsgdGhpcy5zbW9NZWFzdXJlLnN2Zy5hZGpYIC0gdGFiV2lkdGgpO1xyXG4gICAgICB0aGlzLnRhYlN0YXZlLnNldENvbnRleHQodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jcmVhdGVNZWFzdXJlTW9kaWZpZXJzKCk7XHJcblxyXG4gICAgdGhpcy50aWNrbWFwT2JqZWN0ID0gdGhpcy5zbW9NZWFzdXJlLmNyZWF0ZU1lYXN1cmVUaWNrbWFwcygpO1xyXG4gICAgdGhpcy5jcmVhdGVDb2xsaXNpb25UaWNrbWFwKCk7XHJcblxyXG4gICAgdGhpcy52b2ljZUFyID0gW107XHJcbiAgICB0aGlzLnZleE5vdGVzID0gW107XHJcbiAgICB0aGlzLm5vdGVUb1ZleE1hcCA9IHt9O1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSB2b2ljZXMsIGFkZCB0aGVtIGFsbCB0byB0aGUgZm9ybWF0dGVyIGF0IHRoZSBzYW1lIHRpbWUgc28gdGhleSBkb24ndCBjb2xsaWRlXHJcbiAgICBmb3IgKGogPSAwOyBqIDwgdGhpcy5zbW9NZWFzdXJlLnZvaWNlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICBjb25zdCBzbW9WZXhWb2ljZVBhcmFtcyA9IHtcclxuICAgICAgICBhY3R1YWxCZWF0czogdGhpcy5zbW9NZWFzdXJlLnRpbWVTaWduYXR1cmUuYWN0dWFsQmVhdHMsXHJcbiAgICAgICAgYmVhdER1cmF0aW9uOiB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS5iZWF0RHVyYXRpb24sXHJcbiAgICAgICAgbm90ZXM6IHRoaXMudmV4Tm90ZXNcclxuICAgICAgfVxyXG4gICAgaWYgKCF0aGlzLnNtb01lYXN1cmUuc3ZnLm11bHRpbWVhc3VyZUxlbmd0aCAmJiAhdGhpcy5zbW9NZWFzdXJlLnJlcGVhdFN5bWJvbCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlVmV4Tm90ZXMoaik7XHJcbiAgICAgICAgc21vVmV4Vm9pY2VQYXJhbXMubm90ZXMgPSB0aGlzLnZvaWNlTm90ZXM7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVWZXhUdXBsZXRzKGopO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlVmV4QmVhbUdyb3VwcyhqKTtcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgdm9pY2UgaW4gNC80IGFuZCBhZGQgYWJvdmUgbm90ZXNcclxuICAgICAgICBjb25zdCB2b2ljZSA9IGNyZWF0ZVZvaWNlKHNtb1ZleFZvaWNlUGFyYW1zKTtcclxuICAgICAgICB0aGlzLnZvaWNlQXIucHVzaCh2b2ljZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuc21vTWVhc3VyZS5yZXBlYXRTeW1ib2wpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZVJlcGVhdFN5bWJvbCgpO1xyXG4gICAgICAgIC8vIENyZWF0ZSBhIHZvaWNlIGluIDQvNCBhbmQgYWRkIGFib3ZlIG5vdGVzXHJcbiAgICAgICAgY29uc3Qgdm9pY2UgPSBjcmVhdGVWb2ljZShzbW9WZXhWb2ljZVBhcmFtcyk7XHJcbiAgICAgICAgdGhpcy52b2ljZUFyLnB1c2godm9pY2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBOZWVkIHRvIGZvcm1hdCBmb3IgeCBwb3NpdGlvbiwgdGhlbiBzZXQgeSBwb3NpdGlvbiBiZWZvcmUgZHJhd2luZyBkeW5hbWljcy5cclxuICAgIHRoaXMuZm9ybWF0dGVyID0gbmV3IFZGLkZvcm1hdHRlcih7IHNvZnRtYXhGYWN0b3I6IHRoaXMuc29mdG1heCwgZ2xvYmFsU29mdG1heDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLmZvcm1hdHRlci5qb2luVm9pY2VzKHRoaXMudm9pY2VBcik7XHJcbiAgICBpZiAodGhpcy50YWJTdGF2ZSkge1xyXG4gICAgICB0aGlzLnRhYlZvaWNlID0gY3JlYXRlVm9pY2Uoe1xyXG4gICAgICAgIGFjdHVhbEJlYXRzOiB0aGlzLnNtb01lYXN1cmUudGltZVNpZ25hdHVyZS5hY3R1YWxCZWF0cyxcclxuICAgICAgICBiZWF0RHVyYXRpb246IHRoaXMuc21vTWVhc3VyZS50aW1lU2lnbmF0dXJlLmJlYXREdXJhdGlvbixcclxuICAgICAgICBub3RlczogdGhpcy50YWJOb3Rlc1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5mb3JtYXR0ZXIuam9pblZvaWNlcyhbdGhpcy50YWJWb2ljZV0pO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBDcmVhdGUgdGhlIFZleCBmb3JtYXR0ZXIgdGhhdCBjYWxjdWxhdGVzIHRoZSBYIGFuZCBZIHBvc2l0aW9ucyBvZiB0aGUgbm90ZXMuICBBIGZvcm1hdHRlclxyXG4gICAqIG1heSBhY3R1YWxseSBzcGFuIG11bHRpcGxlIHN0YXZlcyBmb3IganVzdGlmaWVkIHN0YXZlcy4gIFRoZSBub3RlcyBhcmUgZHJhd24gaW4gdGhlaXJcclxuICAgKiBpbmRpdmlkdWFsIHZ4TWVhc3VyZSBvYmplY3RzIGJ1dCBmb3JtYXR0aW5nIGlzIGRvbmUgb25jZSBmb3IgYWxsIGp1c3RpZmllZCBzdGF2ZXNcclxuICAgKiBAcGFyYW0gdm9pY2VzIFZvaWNlIG9iamVjdHMgZnJvbSBWZXhGbG93XHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgZm9ybWF0KHZvaWNlczogVm9pY2VbXSkge1xyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcuaGlkZUVtcHR5TWVhc3VyZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc21vTWVhc3VyZS5zdmcubXVsdGltZWFzdXJlTGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLm11bHRpbWVhc3VyZVJlc3QgPSBnZXRNdWx0aW1lYXN1cmVSZXN0KHRoaXMuc21vTWVhc3VyZS5zdmcubXVsdGltZWFzdXJlTGVuZ3RoKTtcclxuICAgICAgdGhpcy5tdWx0aW1lYXN1cmVSZXN0LnNldENvbnRleHQodGhpcy5jb250ZXh0LmdldENvbnRleHQoKSk7XHJcbiAgICAgIHRoaXMubXVsdGltZWFzdXJlUmVzdC5zZXRTdGF2ZSh0aGlzLnN0YXZlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmZvcm1hdHRlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnZhbHVlT2YoKTtcclxuICAgIGNvbnN0IHN0YWZmV2lkdGggPSB0aGlzLnNtb01lYXN1cmUuc3RhZmZXaWR0aCAtXHJcbiAgICAgICh0aGlzLnNtb01lYXN1cmUuc3ZnLm1heENvbHVtblN0YXJ0WCArIHRoaXMuc21vTWVhc3VyZS5zdmcuYWRqUmlnaHQgKyB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQpIC0gMTA7XHJcbiAgICB0aGlzLmRiZ0xlZnRYID0gdGhpcy5zbW9NZWFzdXJlLnN0YWZmWCArICB0aGlzLnNtb01lYXN1cmUuZm9ybWF0LnBhZExlZnQgKyB0aGlzLnNtb01lYXN1cmUuc3ZnLmFkalg7XHJcbiAgICB0aGlzLmRiZ1dpZHRoID0gc3RhZmZXaWR0aDtcclxuICAgIHRoaXMuZm9ybWF0dGVyLmZvcm1hdCh2b2ljZXMsIHN0YWZmV2lkdGgpO1xyXG4gICAgaWYgKHRoaXMudGFiVm9pY2UgJiYgdGhpcy50YWJOb3Rlcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5mb3JtYXR0ZXIuZm9ybWF0KFt0aGlzLnRhYlZvaWNlXSwgc3RhZmZXaWR0aCk7XHJcbiAgICB9XHJcbiAgICBsYXlvdXREZWJ1Zy5zZXRUaW1lc3RhbXAobGF5b3V0RGVidWcuY29kZVJlZ2lvbnMuRk9STUFULCBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHRpbWVzdGFtcCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIHJlbmRlciBpcyBjYWxsZWQgYWZ0ZXIgZm9ybWF0LiAgQWN0dWFsbHkgZHJhdyB0aGUgdGhpbmdzLlxyXG4gICAqL1xyXG4gIHJlbmRlcigpIHtcclxuICAgIGlmICh0aGlzLnNtb01lYXN1cmUuc3ZnLmhpZGVFbXB0eU1lYXN1cmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBncm91cCA9IHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkub3Blbkdyb3VwKCkgYXMgU1ZHU1ZHRWxlbWVudDtcclxuICAgIHZhciBtbUNsYXNzID0gdGhpcy5zbW9NZWFzdXJlLmdldENsYXNzSWQoKTtcclxuICAgIHZhciBqID0gMDtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGJvdW5kIGVhY2ggbWVhc3VyZSBpbiBpdHMgb3duIFNWRyBncm91cCBmb3IgZWFzeSBkZWxldGlvbiBhbmQgbWFwcGluZyB0byBzY3JlZW4gY29vcmRpbmF0ZVxyXG4gICAgICBncm91cC5jbGFzc0xpc3QuYWRkKHRoaXMuc21vTWVhc3VyZS5pZCk7XHJcbiAgICAgIGdyb3VwLmNsYXNzTGlzdC5hZGQobW1DbGFzcyk7XHJcbiAgICAgIGdyb3VwLmlkID0gdGhpcy5zbW9NZWFzdXJlLmlkO1xyXG4gICAgICB0aGlzLnN0YXZlIS5kcmF3KCk7XHJcbiAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcuZWxlbWVudCA9IGdyb3VwO1xyXG5cclxuICAgICAgZm9yIChqID0gMDsgaiA8IHRoaXMudm9pY2VBci5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIHRoaXMudm9pY2VBcltqXS5kcmF3KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCksIHRoaXMuc3RhdmUhKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnZleEJlYW1Hcm91cHMuZm9yRWFjaCgoYikgPT4ge1xyXG4gICAgICAgIGIuc2V0Q29udGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpKS5kcmF3KCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy52ZXhUdXBsZXRzLmZvckVhY2goKHR1cGxldCkgPT4ge1xyXG4gICAgICAgIHR1cGxldC5zZXRDb250ZXh0KHRoaXMuY29udGV4dC5nZXRDb250ZXh0KCkpLmRyYXcoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmICh0aGlzLm11bHRpbWVhc3VyZVJlc3QpIHtcclxuICAgICAgICB0aGlzLm11bHRpbWVhc3VyZVJlc3QuZHJhdygpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHRoaXMuX3VwZGF0ZUx5cmljRG9tU2VsZWN0b3JzKCk7XHJcbiAgICAgIHRoaXMucmVuZGVyRHluYW1pY3MoKTtcclxuICAgICAgLy8gdGhpcy5zbW9NZWFzdXJlLmFkalggPSB0aGlzLnN0YXZlLnN0YXJ0X3ggLSAodGhpcy5zbW9NZWFzdXJlLnN0YWZmWCk7XHJcblxyXG4gICAgICB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLmNsb3NlR3JvdXAoKTtcclxuICAgICAgaWYgKHRoaXMudGFiU3RhdmUpIHtcclxuICAgICAgICBjb25zdCB0YWJTdGF2ZUlkID0gYCR7dGhpcy5zbW9NZWFzdXJlLmlkfS10YWJgO1xyXG4gICAgICAgIGNvbnN0IHRhYkdyb3VwID0gdGhpcy5jb250ZXh0LmdldENvbnRleHQoKS5vcGVuR3JvdXAoKSBhcyBTVkdTVkdFbGVtZW50O1xyXG4gICAgICAgIHRhYkdyb3VwLmNsYXNzTGlzdC5hZGQodGFiU3RhdmVJZCk7XHJcbiAgICAgICAgdGhpcy50YWJTdGF2ZS5kcmF3KCk7XHJcbiAgICAgICAgdGhpcy50YWJWb2ljZT8uZHJhdyh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLCB0aGlzLnRhYlN0YXZlKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLmNsb3NlR3JvdXAoKTtcclxuICAgICAgICB0aGlzLnNtb01lYXN1cmUuc3ZnLnRhYkVsZW1lbnQgPSB0YWJHcm91cDtcclxuICAgICAgfVxyXG4gICAgICAvLyBsYXlvdXREZWJ1Zy5zZXRUaW1lc3RhbXAobGF5b3V0RGVidWcuY29kZVJlZ2lvbnMuUkVOREVSLCBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHRpbWVzdGFtcCk7XHJcblxyXG4gICAgICB0aGlzLnJlbmRlcmVkID0gdHJ1ZTtcclxuICAgICAgaWYgKGxheW91dERlYnVnLm1hc2sgJiBsYXlvdXREZWJ1Zy52YWx1ZXNbJ2FkanVzdCddKSB7XHJcbiAgICAgICAgU3ZnSGVscGVycy5kZWJ1Z0JveE5vVGV4dCh0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLnN2ZyxcclxuICAgICAgICBTdmdIZWxwZXJzLmJveFBvaW50cyh0aGlzLmRiZ0xlZnRYLCBcclxuICAgICAgICAgIHRoaXMuc21vTWVhc3VyZS5zdmcuc3RhZmZZLCB0aGlzLmRiZ1dpZHRoLCA0MCksICdyZW5kZXIteC1kYmcnLCAwKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXhjKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybigndW5hYmxlIHRvIHJlbmRlciBtZWFzdXJlICcgKyB0aGlzLnNtb01lYXN1cmUubWVhc3VyZU51bWJlci5tZWFzdXJlSW5kZXgpO1xyXG4gICAgICB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpLmNsb3NlR3JvdXAoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/render/vex/vxMeasure.ts\n");
471
471
 
472
472
  /***/ }),
473
473
 
@@ -1349,7 +1349,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1349
1349
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1350
1350
 
1351
1351
  "use strict";
1352
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiKeySignatureAdapter: () => (/* binding */ SuiKeySignatureAdapter),\n/* harmony export */ SuiKeySignatureDialog: () => (/* binding */ SuiKeySignatureDialog)\n/* harmony export */ });\n/* harmony import */ var _smo_xform_selections__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/xform/selections */ \"./src/smo/xform/selections.ts\");\n/* harmony import */ var _adapter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./adapter */ \"./src/ui/dialogs/adapter.ts\");\n/* harmony import */ var _smo_xform_operations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../smo/xform/operations */ \"./src/smo/xform/operations.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 * @category SuiDialog\n */\nclass SuiKeySignatureAdapter extends _adapter__WEBPACK_IMPORTED_MODULE_1__.SuiComponentAdapter {\n constructor(view, measure) {\n super(view);\n this.applyToAll = false;\n this.applyToSelections = false;\n this.applyToRemaining = false;\n this.edited = false;\n this.measure = measure;\n this.keySignature = measure.keySignature;\n }\n cancel() {\n return __awaiter(this, void 0, void 0, function* () {\n });\n }\n applySelections(selections) {\n this.view.groupUndo(true);\n this.view.modifyColumnsSelectionsNoWait('keySignature', selections, (score, selection) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_2__.SmoOperation.addKeySignature(score, selection, this.keySignature);\n });\n this.view.groupUndo(false);\n }\n apply() {\n return __awaiter(this, void 0, void 0, function* () {\n let minSel = this.view.tracker.getExtremeSelection(-1).selector.measure;\n let maxSel = minSel;\n const maxMeasure = this.view.score.staves[0].measures.length - 1;\n if (this.applyToAll) {\n minSel = 0;\n maxSel = maxMeasure;\n }\n else if (this.applyToRemaining) {\n maxSel = maxMeasure;\n }\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_0__.SmoSelection.getMeasuresBetween(this.view.score, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_0__.SmoSelector.measureSelector(0, minSel), _smo_xform_selections__WEBPACK_IMPORTED_MODULE_0__.SmoSelector.measureSelector(0, maxSel));\n this.applySelections(selections);\n yield this.view.updatePromise();\n });\n }\n get applyTo() {\n if (this.applyToAll) {\n return 'all';\n }\n if (this.applyToRemaining) {\n return 'remaining';\n }\n return 'selections';\n }\n set applyTo(val) {\n const orig = this.applyTo;\n if (orig === val) {\n return;\n }\n this.applyToAll = false;\n this.applyToRemaining = false;\n this.applyToSelections = false;\n if (val === 'all') {\n this.applyToAll = true;\n }\n else if (val === 'remaining') {\n this.applyToRemaining = true;\n }\n else {\n this.applyToSelections = true;\n }\n }\n commit() {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.apply();\n });\n }\n get key() {\n return this.keySignature;\n }\n set key(value) {\n this.keySignature = value;\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiKeySignatureDialog extends _adapter__WEBPACK_IMPORTED_MODULE_1__.SuiDialogAdapterBase {\n changed() {\n const _super = Object.create(null, {\n changed: { get: () => super.changed }\n });\n return __awaiter(this, void 0, void 0, function* () {\n yield _super.changed.call(this);\n });\n }\n constructor(parameters) {\n const measures = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_0__.SmoSelection.getMeasureList(parameters.view.tracker.selections)\n .map((sel) => sel.measure);\n const measure = measures[0];\n const adapter = new SuiKeySignatureAdapter(parameters.view, measure);\n super(SuiKeySignatureDialog.dialogElements, Object.assign({ adapter }, parameters));\n }\n}\nSuiKeySignatureDialog.dialogElements = {\n label: 'Key Signature',\n staticText: [],\n elements: [\n {\n smoName: 'key',\n defaultValue: 'C',\n control: 'SuiDropdownComponent',\n label: 'Tempo Mode',\n options: [{\n label: 'C Major',\n value: 'c',\n }, {\n label: 'F Major',\n value: 'f',\n }, {\n label: 'G Major',\n value: 'g',\n }, {\n label: 'Bb Major',\n value: 'bb'\n }, {\n label: 'D Major',\n value: 'd'\n }, {\n label: 'Eb Major',\n value: 'eb'\n }, {\n label: 'A Major',\n value: 'a'\n }, {\n label: 'Ab Major',\n value: 'ab'\n }, {\n label: 'E Major',\n value: 'e'\n }, {\n label: 'Db Major',\n value: 'db'\n }, {\n label: 'B Major',\n value: 'b'\n }, {\n label: 'F# Major',\n value: 'f#'\n }, {\n label: 'C# Major',\n value: 'c#'\n }, {\n label: 'Gb Major',\n value: 'gb'\n }\n ]\n }, {\n smoName: 'applyTo',\n defaultValue: 'selections',\n control: 'SuiDropdownComponent',\n label: 'Apply to:',\n options: [{\n label: 'Current Selections',\n value: 'selections',\n }, {\n label: 'Future Measures',\n value: 'remaining',\n }, {\n label: 'Full Score',\n value: 'all',\n }]\n }\n ]\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QkFDakIsS0FBSyxFQUFFLElBQUk7aUJBQ1osRUFBRTtvQkFDRCxLQUFLLEVBQUUsVUFBVTtvQkFDakIsS0FBSyxFQUFFLElBQUk7aUJBQ1o7YUFDQTtTQUNGLEVBQVc7WUFDVixPQUFPLEVBQUUsU0FBUztZQUNsQixZQUFZLEVBQUUsWUFBWTtZQUMxQixPQUFPLEVBQUUsc0JBQXNCO1lBQy9CLEtBQUssRUFBRSxXQUFXO1lBQ2xCLE9BQU8sRUFBRSxDQUFDO29CQUNSLEtBQUssRUFBRSxvQkFBb0I7b0JBQzNCLEtBQUssRUFBRSxZQUFZO2lCQUNwQixFQUFFO29CQUNELEtBQUssRUFBRSxpQkFBaUI7b0JBQ3hCLEtBQUssRUFBRSxXQUFXO2lCQUNuQixFQUFDO29CQUNBLEtBQUssRUFBRSxZQUFZO29CQUNuQixLQUFLLEVBQUUsS0FBSztpQkFDYixDQUFDO1NBQ0g7S0FDRjtDQUNGLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TbW8vLi9zcmMvdWkvZGlhbG9ncy9rZXlTaWduYXR1cmUudHM/NjE1NCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBbU21vb3NpY10oaHR0cHM6Ly9naXRodWIuY29tL0Fhcm9uRGF2aWROZXdtYW4vU21vb3NpYylcclxuLy8gQ29weXJpZ2h0IChjKSBBYXJvbiBEYXZpZCBOZXdtYW4gMjAyMS5cclxuaW1wb3J0IHsgU21vVGVtcG9UZXh0LCBTbW9UZW1wb051bWJlckF0dHJpYnV0ZSwgU21vVGVtcG9TdHJpbmdBdHRyaWJ1dGUsIFNtb1RlbXBvQm9vbGVhbkF0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL3Ntby9kYXRhL21lYXN1cmVNb2RpZmllcnMnO1xyXG5pbXBvcnQgeyBTbW9TZWxlY3Rpb24sIFNtb1NlbGVjdG9yIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL3NlbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBTdWlTY29yZVZpZXdPcGVyYXRpb25zIH0gZnJvbSAnLi4vLi4vcmVuZGVyL3N1aS9zY29yZVZpZXdPcGVyYXRpb25zJztcclxuaW1wb3J0IHsgRGlhbG9nRGVmaW5pdGlvbiwgU3VpRGlhbG9nUGFyYW1zIH0gZnJvbSAnLi9kaWFsb2cnO1xyXG5pbXBvcnQgeyBTdWlDb21wb25lbnRBZGFwdGVyLCBTdWlEaWFsb2dBZGFwdGVyQmFzZSB9IGZyb20gJy4vYWRhcHRlcic7XHJcbmltcG9ydCB7IFNtb01lYXN1cmUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tZWFzdXJlJztcclxuaW1wb3J0IHsgU21vT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vc21vL3hmb3JtL29wZXJhdGlvbnMnO1xyXG5pbXBvcnQgeyBQcm9taXNlSGVscGVycyB9IGZyb20gJy4uLy4uL2NvbW1vbi9wcm9taXNlSGVscGVycyc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpS2V5U2lnbmF0dXJlQWRhcHRlciBleHRlbmRzIFN1aUNvbXBvbmVudEFkYXB0ZXIge1xyXG4gIGtleVNpZ25hdHVyZTogc3RyaW5nO1xyXG4gIGFwcGx5VG9BbGw6IGJvb2xlYW4gPSBmYWxzZTsgIFxyXG4gIGFwcGx5VG9TZWxlY3Rpb25zOiBib29sZWFuID0gZmFsc2U7XHJcbiAgYXBwbHlUb1JlbWFpbmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGVkaXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1lYXN1cmU6IFNtb01lYXN1cmU7XHJcbiAgY29uc3RydWN0b3IodmlldzogU3VpU2NvcmVWaWV3T3BlcmF0aW9ucywgbWVhc3VyZTogU21vTWVhc3VyZSkge1xyXG4gICAgc3VwZXIodmlldyk7XHJcbiAgICB0aGlzLm1lYXN1cmUgPSBtZWFzdXJlO1xyXG4gICAgdGhpcy5rZXlTaWduYXR1cmUgPSBtZWFzdXJlLmtleVNpZ25hdHVyZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNhbmNlbCgpIHtcclxuICB9XHJcbiAgYXBwbHlTZWxlY3Rpb25zKHNlbGVjdGlvbnM6IFNtb1NlbGVjdGlvbltdKSB7XHJcbiAgICB0aGlzLnZpZXcuZ3JvdXBVbmRvKHRydWUpO1xyXG4gICAgdGhpcy52aWV3Lm1vZGlmeUNvbHVtbnNTZWxlY3Rpb25zTm9XYWl0KCdrZXlTaWduYXR1cmUnLCBzZWxlY3Rpb25zLCAoc2NvcmUsIHNlbGVjdGlvbikgPT4ge1xyXG4gICAgICBTbW9PcGVyYXRpb24uYWRkS2V5U2lnbmF0dXJlKHNjb3JlLCBzZWxlY3Rpb24sIHRoaXMua2V5U2lnbmF0dXJlKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy52aWV3Lmdyb3VwVW5kbyhmYWxzZSk7XHJcbiAgfVxyXG4gIGFzeW5jIGFwcGx5KCkge1xyXG4gICAgbGV0IG1pblNlbCA9IHRoaXMudmlldy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oLTEpLnNlbGVjdG9yLm1lYXN1cmU7XHJcbiAgICBsZXQgbWF4U2VsID0gbWluU2VsO1xyXG4gICAgY29uc3QgbWF4TWVhc3VyZSA9IHRoaXMudmlldy5zY29yZS5zdGF2ZXNbMF0ubWVhc3VyZXMubGVuZ3RoIC0gMTtcclxuICAgIGlmICh0aGlzLmFwcGx5VG9BbGwpIHtcclxuICAgICAgbWluU2VsID0gMDtcclxuICAgICAgbWF4U2VsID0gbWF4TWVhc3VyZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5hcHBseVRvUmVtYWluaW5nKSB7XHJcbiAgICAgIG1heFNlbCA9IG1heE1lYXN1cmU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVzQmV0d2Vlbih0aGlzLnZpZXcuc2NvcmUsIFxyXG4gICAgICBTbW9TZWxlY3Rvci5tZWFzdXJlU2VsZWN0b3IoMCwgbWluU2VsKSwgU21vU2VsZWN0b3IubWVhc3VyZVNlbGVjdG9yKDAsIG1heFNlbCkpO1xyXG4gICAgdGhpcy5hcHBseVNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnZpZXcudXBkYXRlUHJvbWlzZSgpO1xyXG4gIH1cclxuICBnZXQgYXBwbHlUbygpIHtcclxuICAgIGlmICh0aGlzLmFwcGx5VG9BbGwpIHtcclxuICAgICAgcmV0dXJuICdhbGwnO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYXBwbHlUb1JlbWFpbmluZykge1xyXG4gICAgICByZXR1cm4gJ3JlbWFpbmluZyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ3NlbGVjdGlvbnMnO1xyXG4gIH1cclxuICBzZXQgYXBwbHlUbyh2YWw6IHN0cmluZykge1xyXG4gICAgY29uc3Qgb3JpZyA9IHRoaXMuYXBwbHlUbztcclxuICAgIGlmIChvcmlnID09PSB2YWwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hcHBseVRvQWxsID0gZmFsc2U7XHJcbiAgICB0aGlzLmFwcGx5VG9SZW1haW5pbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuYXBwbHlUb1NlbGVjdGlvbnMgPSBmYWxzZTtcclxuICAgIGlmICh2YWwgPT09ICdhbGwnKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlUb0FsbCA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHZhbCA9PT0gJ3JlbWFpbmluZycpIHtcclxuICAgICAgdGhpcy5hcHBseVRvUmVtYWluaW5nID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXBwbHlUb1NlbGVjdGlvbnMgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuICBhc3luYyBjb21taXQoKXtcclxuICAgIGF3YWl0IHRoaXMuYXBwbHkoKTtcclxuICB9XHJcbiAgZ2V0IGtleSgpIHtcclxuICAgIHJldHVybiB0aGlzLmtleVNpZ25hdHVyZTtcclxuICB9XHJcbiAgc2V0IGtleSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmtleVNpZ25hdHVyZSA9IHZhbHVlO1xyXG4gIH1cclxufVxyXG4vKipcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aUtleVNpZ25hdHVyZURpYWxvZyBleHRlbmRzIFN1aURpYWxvZ0FkYXB0ZXJCYXNlPFN1aUtleVNpZ25hdHVyZUFkYXB0ZXI+IHtcclxuICBzdGF0aWMgZGlhbG9nRWxlbWVudHM6IERpYWxvZ0RlZmluaXRpb24gPSBcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnS2V5IFNpZ25hdHVyZScsXHJcbiAgICAgICAgc3RhdGljVGV4dDogW10sXHJcbiAgICAgICAgZWxlbWVudHM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgc21vTmFtZTogJ2tleScsXHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJ0MnLFxyXG4gICAgICAgICAgICBjb250cm9sOiAnU3VpRHJvcGRvd25Db21wb25lbnQnLFxyXG4gICAgICAgICAgICBsYWJlbDogJ1RlbXBvIE1vZGUnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiBbe1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnQyBNYWpvcicsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdjJyxcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnRiBNYWpvcicsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdmJyxcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnRyBNYWpvcicsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdnJyxcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnQmIgTWFqb3InLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiAnYmInXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICBsYWJlbDogJ0QgTWFqb3InLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiAnZCdcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnRWIgTWFqb3InLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiAnZWInXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICBsYWJlbDogJ0EgTWFqb3InLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiAnYSdcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnQWIgTWFqb3InLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiAnYWInXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICBsYWJlbDogJ0UgTWFqb3InLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiAnZSdcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnRGIgTWFqb3InLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiAnZGInXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICBsYWJlbDogJ0IgTWFqb3InLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiAnYidcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnRiMgTWFqb3InLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiAnZiMnXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICBsYWJlbDogJ0MjIE1ham9yJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogJ2MjJ1xyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdHYiBNYWpvcicsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdnYidcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICB9LCAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHNtb05hbWU6ICdhcHBseVRvJyxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnc2VsZWN0aW9ucycsXHJcbiAgICAgICAgICAgIGNvbnRyb2w6ICdTdWlEcm9wZG93bkNvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnQXBwbHkgdG86JyxcclxuICAgICAgICAgICAgb3B0aW9uczogW3tcclxuICAgICAgICAgICAgICBsYWJlbDogJ0N1cnJlbnQgU2VsZWN0aW9ucycsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdzZWxlY3Rpb25zJyxcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnRnV0dXJlIE1lYXN1cmVzJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogJ3JlbWFpbmluZycsXHJcbiAgICAgICAgICAgIH0se1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnRnVsbCBTY29yZScsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdhbGwnLFxyXG4gICAgICAgICAgICB9XVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgfTtcclxuICBhc3luYyBjaGFuZ2VkKCkge1xyXG4gICAgYXdhaXQgc3VwZXIuY2hhbmdlZCgpO1xyXG4gIH1cclxuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzOiBTdWlEaWFsb2dQYXJhbXMpIHtcclxuICAgIGNvbnN0IG1lYXN1cmVzID0gU21vU2VsZWN0aW9uLmdldE1lYXN1cmVMaXN0KHBhcmFtZXRlcnMudmlldy50cmFja2VyLnNlbGVjdGlvbnMpXHJcbiAgICAgIC5tYXAoKHNlbCkgPT4gc2VsLm1lYXN1cmUpO1xyXG4gICAgY29uc3QgbWVhc3VyZSA9IG1lYXN1cmVzWzBdO1xyXG4gICAgY29uc3QgYWRhcHRlciA9IG5ldyBTdWlLZXlTaWduYXR1cmVBZGFwdGVyKHBhcmFtZXRlcnMudmlldywgbWVhc3VyZSk7XHJcbiAgICBzdXBlcihTdWlLZXlTaWduYXR1cmVEaWFsb2cuZGlhbG9nRWxlbWVudHMsIHsgYWRhcHRlciwgLi4ucGFyYW1ldGVycyB9KTtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/ui/dialogs/keySignature.ts\n");
1352
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SuiKeySignatureAdapter: () => (/* binding */ SuiKeySignatureAdapter),\n/* harmony export */ SuiKeySignatureDialog: () => (/* binding */ SuiKeySignatureDialog)\n/* harmony export */ });\n/* harmony import */ var _smo_xform_selections__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../smo/xform/selections */ \"./src/smo/xform/selections.ts\");\n/* harmony import */ var _adapter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./adapter */ \"./src/ui/dialogs/adapter.ts\");\n/* harmony import */ var _smo_xform_operations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../smo/xform/operations */ \"./src/smo/xform/operations.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 * @category SuiDialog\n */\nclass SuiKeySignatureAdapter extends _adapter__WEBPACK_IMPORTED_MODULE_1__.SuiComponentAdapter {\n constructor(view, measure) {\n super(view);\n this.applyToAll = false;\n this.applyToSelections = false;\n this.applyToRemaining = false;\n this.edited = false;\n this.measure = measure;\n this.keySignature = measure.keySignature;\n }\n cancel() {\n return __awaiter(this, void 0, void 0, function* () {\n });\n }\n applySelections(selections) {\n this.view.groupUndo(true);\n this.view.modifyColumnsSelectionsNoWait('keySignature', selections, (score, selection) => {\n _smo_xform_operations__WEBPACK_IMPORTED_MODULE_2__.SmoOperation.addKeySignature(score, selection, this.keySignature);\n });\n this.view.groupUndo(false);\n }\n apply() {\n return __awaiter(this, void 0, void 0, function* () {\n let minSel = this.view.tracker.getExtremeSelection(-1).selector.measure;\n let maxSel = minSel;\n let maxMeasure = this.view.score.staves[0].measures.length - 1;\n if (this.applyToAll) {\n minSel = 0;\n maxSel = maxMeasure;\n }\n else if (this.applyToRemaining) {\n maxSel = maxMeasure;\n }\n else {\n maxSel = this.view.tracker.getExtremeSelection(1).selector.measure;\n }\n const selections = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_0__.SmoSelection.getMeasuresBetween(this.view.score, _smo_xform_selections__WEBPACK_IMPORTED_MODULE_0__.SmoSelector.measureSelector(0, minSel), _smo_xform_selections__WEBPACK_IMPORTED_MODULE_0__.SmoSelector.measureSelector(0, maxSel));\n this.applySelections(selections);\n yield this.view.updatePromise();\n });\n }\n get applyTo() {\n if (this.applyToAll) {\n return 'all';\n }\n if (this.applyToRemaining) {\n return 'remaining';\n }\n return 'selections';\n }\n set applyTo(val) {\n const orig = this.applyTo;\n if (orig === val) {\n return;\n }\n this.applyToAll = false;\n this.applyToRemaining = false;\n this.applyToSelections = false;\n if (val === 'all') {\n this.applyToAll = true;\n }\n else if (val === 'remaining') {\n this.applyToRemaining = true;\n }\n else {\n this.applyToSelections = true;\n }\n }\n commit() {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.apply();\n });\n }\n get key() {\n return this.keySignature;\n }\n set key(value) {\n this.keySignature = value;\n }\n}\n/**\n * @category SuiDialog\n */\nclass SuiKeySignatureDialog extends _adapter__WEBPACK_IMPORTED_MODULE_1__.SuiDialogAdapterBase {\n changed() {\n const _super = Object.create(null, {\n changed: { get: () => super.changed }\n });\n return __awaiter(this, void 0, void 0, function* () {\n yield _super.changed.call(this);\n });\n }\n constructor(parameters) {\n const measures = _smo_xform_selections__WEBPACK_IMPORTED_MODULE_0__.SmoSelection.getMeasureList(parameters.view.tracker.selections)\n .map((sel) => sel.measure);\n const measure = measures[0];\n const adapter = new SuiKeySignatureAdapter(parameters.view, measure);\n super(SuiKeySignatureDialog.dialogElements, Object.assign({ adapter }, parameters));\n }\n}\nSuiKeySignatureDialog.dialogElements = {\n label: 'Key Signature',\n staticText: [],\n elements: [\n {\n smoName: 'key',\n defaultValue: 'C',\n control: 'SuiDropdownComponent',\n label: 'Tempo Mode',\n options: [{\n label: 'C Major',\n value: 'c',\n }, {\n label: 'F Major',\n value: 'f',\n }, {\n label: 'G Major',\n value: 'g',\n }, {\n label: 'Bb Major',\n value: 'bb'\n }, {\n label: 'D Major',\n value: 'd'\n }, {\n label: 'Eb Major',\n value: 'eb'\n }, {\n label: 'A Major',\n value: 'a'\n }, {\n label: 'Ab Major',\n value: 'ab'\n }, {\n label: 'E Major',\n value: 'e'\n }, {\n label: 'Db Major',\n value: 'db'\n }, {\n label: 'B Major',\n value: 'b'\n }, {\n label: 'F# Major',\n value: 'f#'\n }, {\n label: 'C# Major',\n value: 'c#'\n }, {\n label: 'Gb Major',\n value: 'gb'\n }\n ]\n }, {\n smoName: 'applyTo',\n defaultValue: 'selections',\n control: 'SuiDropdownComponent',\n label: 'Apply to:',\n options: [{\n label: 'Current Selections',\n value: 'selections',\n }, {\n label: 'Future Measures',\n value: 'remaining',\n }, {\n label: 'Full Score',\n value: 'all',\n }]\n }\n ]\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFNBQVM7b0JBQ2hCLEtBQUssRUFBRSxHQUFHO2lCQUNYLEVBQUU7b0JBQ0QsS0FBSyxFQUFFLFVBQVU7b0JBQ2pCLEtBQUssRUFBRSxJQUFJO2lCQUNaLEVBQUU7b0JBQ0QsS0FBSyxFQUFFLFVBQVU7b0JBQ2pCLEtBQUssRUFBRSxJQUFJO2lCQUNaLEVBQUU7b0JBQ0QsS0FBSyxFQUFFLFVBQVU7b0JBQ2pCLEtBQUssRUFBRSxJQUFJO2lCQUNaO2FBQ0E7U0FDRixFQUFXO1lBQ1YsT0FBTyxFQUFFLFNBQVM7WUFDbEIsWUFBWSxFQUFFLFlBQVk7WUFDMUIsT0FBTyxFQUFFLHNCQUFzQjtZQUMvQixLQUFLLEVBQUUsV0FBVztZQUNsQixPQUFPLEVBQUUsQ0FBQztvQkFDUixLQUFLLEVBQUUsb0JBQW9CO29CQUMzQixLQUFLLEVBQUUsWUFBWTtpQkFDcEIsRUFBRTtvQkFDRCxLQUFLLEVBQUUsaUJBQWlCO29CQUN4QixLQUFLLEVBQUUsV0FBVztpQkFDbkIsRUFBQztvQkFDQSxLQUFLLEVBQUUsWUFBWTtvQkFDbkIsS0FBSyxFQUFFLEtBQUs7aUJBQ2IsQ0FBQztTQUNIO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vU21vLy4vc3JjL3VpL2RpYWxvZ3Mva2V5U2lnbmF0dXJlLnRzPzYxNTQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gW1Ntb29zaWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BYXJvbkRhdmlkTmV3bWFuL1Ntb29zaWMpXHJcbi8vIENvcHlyaWdodCAoYykgQWFyb24gRGF2aWQgTmV3bWFuIDIwMjEuXHJcbmltcG9ydCB7IFNtb1RlbXBvVGV4dCwgU21vVGVtcG9OdW1iZXJBdHRyaWJ1dGUsIFNtb1RlbXBvU3RyaW5nQXR0cmlidXRlLCBTbW9UZW1wb0Jvb2xlYW5BdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi9zbW8vZGF0YS9tZWFzdXJlTW9kaWZpZXJzJztcclxuaW1wb3J0IHsgU21vU2VsZWN0aW9uLCBTbW9TZWxlY3RvciB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9zZWxlY3Rpb25zJztcclxuaW1wb3J0IHsgU3VpU2NvcmVWaWV3T3BlcmF0aW9ucyB9IGZyb20gJy4uLy4uL3JlbmRlci9zdWkvc2NvcmVWaWV3T3BlcmF0aW9ucyc7XHJcbmltcG9ydCB7IERpYWxvZ0RlZmluaXRpb24sIFN1aURpYWxvZ1BhcmFtcyB9IGZyb20gJy4vZGlhbG9nJztcclxuaW1wb3J0IHsgU3VpQ29tcG9uZW50QWRhcHRlciwgU3VpRGlhbG9nQWRhcHRlckJhc2UgfSBmcm9tICcuL2FkYXB0ZXInO1xyXG5pbXBvcnQgeyBTbW9NZWFzdXJlIH0gZnJvbSAnLi4vLi4vc21vL2RhdGEvbWVhc3VyZSc7XHJcbmltcG9ydCB7IFNtb09wZXJhdGlvbiB9IGZyb20gJy4uLy4uL3Ntby94Zm9ybS9vcGVyYXRpb25zJztcclxuaW1wb3J0IHsgUHJvbWlzZUhlbHBlcnMgfSBmcm9tICcuLi8uLi9jb21tb24vcHJvbWlzZUhlbHBlcnMnO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG4vKipcclxuICogQGNhdGVnb3J5IFN1aURpYWxvZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFN1aUtleVNpZ25hdHVyZUFkYXB0ZXIgZXh0ZW5kcyBTdWlDb21wb25lbnRBZGFwdGVyIHtcclxuICBrZXlTaWduYXR1cmU6IHN0cmluZztcclxuICBhcHBseVRvQWxsOiBib29sZWFuID0gZmFsc2U7ICBcclxuICBhcHBseVRvU2VsZWN0aW9uczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGFwcGx5VG9SZW1haW5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBlZGl0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtZWFzdXJlOiBTbW9NZWFzdXJlO1xyXG4gIGNvbnN0cnVjdG9yKHZpZXc6IFN1aVNjb3JlVmlld09wZXJhdGlvbnMsIG1lYXN1cmU6IFNtb01lYXN1cmUpIHtcclxuICAgIHN1cGVyKHZpZXcpO1xyXG4gICAgdGhpcy5tZWFzdXJlID0gbWVhc3VyZTtcclxuICAgIHRoaXMua2V5U2lnbmF0dXJlID0gbWVhc3VyZS5rZXlTaWduYXR1cmU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjYW5jZWwoKSB7XHJcbiAgfVxyXG4gIGFwcGx5U2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBTbW9TZWxlY3Rpb25bXSkge1xyXG4gICAgdGhpcy52aWV3Lmdyb3VwVW5kbyh0cnVlKTtcclxuICAgIHRoaXMudmlldy5tb2RpZnlDb2x1bW5zU2VsZWN0aW9uc05vV2FpdCgna2V5U2lnbmF0dXJlJywgc2VsZWN0aW9ucywgKHNjb3JlLCBzZWxlY3Rpb24pID0+IHtcclxuICAgICAgU21vT3BlcmF0aW9uLmFkZEtleVNpZ25hdHVyZShzY29yZSwgc2VsZWN0aW9uLCB0aGlzLmtleVNpZ25hdHVyZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMudmlldy5ncm91cFVuZG8oZmFsc2UpO1xyXG4gIH1cclxuICBhc3luYyBhcHBseSgpIHtcclxuICAgIGxldCBtaW5TZWwgPSB0aGlzLnZpZXcudHJhY2tlci5nZXRFeHRyZW1lU2VsZWN0aW9uKC0xKS5zZWxlY3Rvci5tZWFzdXJlO1xyXG4gICAgbGV0IG1heFNlbCA9IG1pblNlbDtcclxuICAgIGxldCBtYXhNZWFzdXJlID0gdGhpcy52aWV3LnNjb3JlLnN0YXZlc1swXS5tZWFzdXJlcy5sZW5ndGggLSAxO1xyXG4gICAgaWYgKHRoaXMuYXBwbHlUb0FsbCkge1xyXG4gICAgICBtaW5TZWwgPSAwO1xyXG4gICAgICBtYXhTZWwgPSBtYXhNZWFzdXJlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmFwcGx5VG9SZW1haW5pbmcpIHtcclxuICAgICAgbWF4U2VsID0gbWF4TWVhc3VyZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1heFNlbCA9IHRoaXMudmlldy50cmFja2VyLmdldEV4dHJlbWVTZWxlY3Rpb24oMSkuc2VsZWN0b3IubWVhc3VyZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZXNCZXR3ZWVuKHRoaXMudmlldy5zY29yZSwgXHJcbiAgICAgIFNtb1NlbGVjdG9yLm1lYXN1cmVTZWxlY3RvcigwLCBtaW5TZWwpLCBTbW9TZWxlY3Rvci5tZWFzdXJlU2VsZWN0b3IoMCwgbWF4U2VsKSk7XHJcbiAgICB0aGlzLmFwcGx5U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTtcclxuICAgIGF3YWl0IHRoaXMudmlldy51cGRhdGVQcm9taXNlKCk7XHJcbiAgfVxyXG4gIGdldCBhcHBseVRvKCkge1xyXG4gICAgaWYgKHRoaXMuYXBwbHlUb0FsbCkge1xyXG4gICAgICByZXR1cm4gJ2FsbCc7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hcHBseVRvUmVtYWluaW5nKSB7XHJcbiAgICAgIHJldHVybiAncmVtYWluaW5nJztcclxuICAgIH1cclxuICAgIHJldHVybiAnc2VsZWN0aW9ucyc7XHJcbiAgfVxyXG4gIHNldCBhcHBseVRvKHZhbDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBvcmlnID0gdGhpcy5hcHBseVRvO1xyXG4gICAgaWYgKG9yaWcgPT09IHZhbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcGx5VG9BbGwgPSBmYWxzZTtcclxuICAgIHRoaXMuYXBwbHlUb1JlbWFpbmluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5hcHBseVRvU2VsZWN0aW9ucyA9IGZhbHNlO1xyXG4gICAgaWYgKHZhbCA9PT0gJ2FsbCcpIHtcclxuICAgICAgdGhpcy5hcHBseVRvQWxsID0gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAodmFsID09PSAncmVtYWluaW5nJykge1xyXG4gICAgICB0aGlzLmFwcGx5VG9SZW1haW5pbmcgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hcHBseVRvU2VsZWN0aW9ucyA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGFzeW5jIGNvbW1pdCgpe1xyXG4gICAgYXdhaXQgdGhpcy5hcHBseSgpO1xyXG4gIH1cclxuICBnZXQga2V5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMua2V5U2lnbmF0dXJlO1xyXG4gIH1cclxuICBzZXQga2V5KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMua2V5U2lnbmF0dXJlID0gdmFsdWU7XHJcbiAgfVxyXG59XHJcbi8qKlxyXG4gKiBAY2F0ZWdvcnkgU3VpRGlhbG9nXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VpS2V5U2lnbmF0dXJlRGlhbG9nIGV4dGVuZHMgU3VpRGlhbG9nQWRhcHRlckJhc2U8U3VpS2V5U2lnbmF0dXJlQWRhcHRlcj4ge1xyXG4gIHN0YXRpYyBkaWFsb2dFbGVtZW50czogRGlhbG9nRGVmaW5pdGlvbiA9IFxyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdLZXkgU2lnbmF0dXJlJyxcclxuICAgICAgICBzdGF0aWNUZXh0OiBbXSxcclxuICAgICAgICBlbGVtZW50czogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBzbW9OYW1lOiAna2V5JyxcclxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnQycsXHJcbiAgICAgICAgICAgIGNvbnRyb2w6ICdTdWlEcm9wZG93bkNvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAnVGVtcG8gTW9kZScsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IFt7XHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdDIE1ham9yJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogJ2MnLFxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdGIE1ham9yJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogJ2YnLFxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdHIE1ham9yJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogJ2cnLFxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdCYiBNYWpvcicsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdiYidcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnRCBNYWpvcicsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdkJ1xyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdFYiBNYWpvcicsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdlYidcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnQSBNYWpvcicsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdhJ1xyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdBYiBNYWpvcicsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdhYidcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnRSBNYWpvcicsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdlJ1xyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdEYiBNYWpvcicsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdkYidcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnQiBNYWpvcicsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdiJ1xyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdGIyBNYWpvcicsXHJcbiAgICAgICAgICAgICAgdmFsdWU6ICdmIydcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnQyMgTWFqb3InLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiAnYyMnXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICBsYWJlbDogJ0diIE1ham9yJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogJ2diJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgIH0sICAgICAgICAgIHtcclxuICAgICAgICAgICAgc21vTmFtZTogJ2FwcGx5VG8nLFxyXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICdzZWxlY3Rpb25zJyxcclxuICAgICAgICAgICAgY29udHJvbDogJ1N1aURyb3Bkb3duQ29tcG9uZW50JyxcclxuICAgICAgICAgICAgbGFiZWw6ICdBcHBseSB0bzonLFxyXG4gICAgICAgICAgICBvcHRpb25zOiBbe1xyXG4gICAgICAgICAgICAgIGxhYmVsOiAnQ3VycmVudCBTZWxlY3Rpb25zJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogJ3NlbGVjdGlvbnMnLFxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdGdXR1cmUgTWVhc3VyZXMnLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiAncmVtYWluaW5nJyxcclxuICAgICAgICAgICAgfSx7XHJcbiAgICAgICAgICAgICAgbGFiZWw6ICdGdWxsIFNjb3JlJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogJ2FsbCcsXHJcbiAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9O1xyXG4gIGFzeW5jIGNoYW5nZWQoKSB7XHJcbiAgICBhd2FpdCBzdXBlci5jaGFuZ2VkKCk7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnM6IFN1aURpYWxvZ1BhcmFtcykge1xyXG4gICAgY29uc3QgbWVhc3VyZXMgPSBTbW9TZWxlY3Rpb24uZ2V0TWVhc3VyZUxpc3QocGFyYW1ldGVycy52aWV3LnRyYWNrZXIuc2VsZWN0aW9ucylcclxuICAgICAgLm1hcCgoc2VsKSA9PiBzZWwubWVhc3VyZSk7XHJcbiAgICBjb25zdCBtZWFzdXJlID0gbWVhc3VyZXNbMF07XHJcbiAgICBjb25zdCBhZGFwdGVyID0gbmV3IFN1aUtleVNpZ25hdHVyZUFkYXB0ZXIocGFyYW1ldGVycy52aWV3LCBtZWFzdXJlKTtcclxuICAgIHN1cGVyKFN1aUtleVNpZ25hdHVyZURpYWxvZy5kaWFsb2dFbGVtZW50cywgeyBhZGFwdGVyLCAuLi5wYXJhbWV0ZXJzIH0pO1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/ui/dialogs/keySignature.ts\n");
1353
1353
 
1354
1354
  /***/ }),
1355
1355