smoosic 1.0.16 → 1.0.17
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 +1 -1
- package/package.json +1 -1
- package/release/smoosic.js +1 -1
- package/src/render/audio/roadmap.ts +11 -9
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
|
|
package/package.json
CHANGED
package/release/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
|
|
|
@@ -244,16 +244,18 @@ export class ScoreRoadMapBuilder {
|
|
|
244
244
|
}
|
|
245
245
|
}
|
|
246
246
|
// Done with repeats and voltas. Continue with the score from after the last volta
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
247
|
+
if (currentJump.endMeasure < endMeasure) {
|
|
248
|
+
skipTo = currentJump.endMeasure + 1;
|
|
249
|
+
this.lastSkip = skipTo;
|
|
250
|
+
currentJump = {
|
|
251
|
+
startMeasure: skipTo,
|
|
252
|
+
endMeasure,
|
|
253
|
+
startReason: 'startRepeat',
|
|
254
|
+
endReason: 'scoreEnd',
|
|
255
|
+
ending: -1
|
|
256
|
+
}
|
|
257
|
+
this.jumpQueue.push(currentJump);
|
|
255
258
|
}
|
|
256
|
-
this.jumpQueue.push(currentJump);
|
|
257
259
|
}
|
|
258
260
|
}
|
|
259
261
|
}
|