UNPKG

ngx-beautiful-charts

Version:
252 lines 23.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ // @Injectable({ // providedIn: BeautifulChartsModule // }) export class GanttChartService { constructor() { this.monthNames = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]; } /** * @return {?} */ computeRectDimensions() { this.rectWidth = this.width - this.xPadding * 2 - 150; this.rectHeight = this.ganttPhases.length * 60; } /** * @return {?} */ computeLegionDimensions() { /** @type {?} */ const noOfLines = Math.ceil(this.data.length / 3); this.legionWidth = this.width - this.xPadding * 2 - 150; this.legionHeight = 40 + 40 * noOfLines; } /** * @param {?} x * @return {?} */ transformX(x) { return this.rectWidth * x / (this.maxX - this.minX); } /** * @return {?} */ computeLegion() { /** @type {?} */ const noOfLines = Math.ceil(this.data.length / 3); this.legion = []; /** @type {?} */ let cnt = 0; for (let line = 0; line < noOfLines; line++) { /** @type {?} */ const legionLine = []; for (let i = 0; i < 3; i++) { if (this.ganttTeams[cnt]) legionLine.push(this.ganttTeams[cnt]); cnt++; } this.legion.push(legionLine); } // console.log(this.legion); } /** * @param {?} d * @return {?} */ transformGanttDate(d) { /** @type {?} */ const oneDay = 24 * 60 * 60 * 1000; /** @type {?} */ const daysSinceMinDate = Math.round(Math.abs((new Date(d).getTime() - (new Date(this.ganttMinDate)).getTime()) / (oneDay))); return this.rectWidth * daysSinceMinDate / (this.maxX - this.minX); } /** * @param {?} factor * @param {?} num * @return {?} */ closestMultipleLessThanEqualTo(factor, num) { if (num % factor === 0) return num; else return this.closestMultipleLessThanEqualTo(factor, num - 1); } /** * @param {?} factor * @param {?} num * @return {?} */ closestMultipleMoreThanEqualTo(factor, num) { if (num % factor === 0) return num; else return this.closestMultipleMoreThanEqualTo(factor, num + 1); } /** * @param {?} __0 * @return {?} */ setValues({ componentID: componentID, width: width, xPadding: xPadding, yPadding: yPadding, data: data }) { this.componentID = componentID; this.width = width; this.xPadding = xPadding; this.yPadding = yPadding; this.data = data; // console.log('service color scheme: ' + this.colorScheme) /** @type {?} */ const froms = []; /** @type {?} */ const tos = []; /** @type {?} */ const phases = new Set(); this.ganttTeams = []; // this.setColors(); // console.log(this.data); for (const team of this.data) { this.ganttTeams.push({ name: team.name, color: team.color }); for (const phase of Object.keys(team.timelines)) { phases.add(phase); for (const timeline of team.timelines[phase]) { froms.push(timeline.from); tos.push(timeline.to); } } } this.ganttPhases = Array.from(phases); // console.log('phase timelines: '); // console.log(this.phaseTimelines); /** @type {?} */ const minDate = froms.reduce((/** * @param {?} a * @param {?} b * @return {?} */ (a, b) => new Date(a) < new Date(b) ? a : b)); /** @type {?} */ const maxDate = tos.reduce((/** * @param {?} a * @param {?} b * @return {?} */ (a, b) => new Date(a) > new Date(b) ? a : b)); this.ganttMinDate = minDate; this.ganttMaxDate = maxDate; // console.log(this.ganttMinDate + ' - ' + this.ganttMaxDate); /** @type {?} */ const noOfLines = Math.ceil(this.data.length / 3); this.height = this.ganttPhases.length * 60 + this.yPadding * 3 + 100 + 40 + 30 * noOfLines; /** @type {?} */ const oneDay = 24 * 60 * 60 * 1000; this.ganttDateRange = Math.round(Math.abs((new Date(this.ganttMaxDate).getTime() - new Date(this.ganttMinDate).getTime()) / (oneDay))); // console.log('Date Range: '); // console.log(this.ganttDateRange); this.minX = 0; // this.maxX = this.ganttDateRange; /** @type {?} */ let flag = 0; /** @type {?} */ let qts = 1; /** @type {?} */ let gridPrecisionX = 0; while (flag === 0) { if (this.ganttDateRange <= 90 * qts) { gridPrecisionX = 7 * qts; flag = 1; break; } else { qts = qts + 1; } } this.maxX = this.closestMultipleMoreThanEqualTo(7 * qts, this.ganttDateRange); this.ganttMaxDate = this.addDays(this.ganttMinDate, this.maxX); this.computeRectDimensions(); this.computeLegionDimensions(); this.computeLegion(); // this.printAll(); } /** * @param {?} date * @param {?} days * @return {?} */ addDays(date, days) { /** @type {?} */ const newdate = new Date(date); newdate.setDate((new Date(date)).getDate() + days); /** @type {?} */ const day = newdate.getDate(); /** @type {?} */ const monthIndex = newdate.getMonth(); /** @type {?} */ const year = newdate.getFullYear(); return this.monthNames[monthIndex] + ' ' + day + ', ' + year; } /** * @return {?} */ printAll() { console.log('line-graph-service'); console.log('component ID: ' + this.componentID); console.log('width: ' + this.width); console.log('height: ' + this.height); console.log('xPadding: ' + this.xPadding); console.log('yPadding: ' + this.yPadding); console.log('rectWidth: ' + this.rectWidth); console.log('rectHeight: ' + this.rectHeight); } } if (false) { /** @type {?} */ GanttChartService.prototype.width; /** @type {?} */ GanttChartService.prototype.height; /** @type {?} */ GanttChartService.prototype.ganttTeams; /** @type {?} */ GanttChartService.prototype.ganttPhases; /** @type {?} */ GanttChartService.prototype.phaseTimelines; /** @type {?} */ GanttChartService.prototype.legion; /** @type {?} */ GanttChartService.prototype.ganttMinDate; /** @type {?} */ GanttChartService.prototype.ganttMaxDate; /** @type {?} */ GanttChartService.prototype.ganttDateRange; /** @type {?} */ GanttChartService.prototype.xPadding; /** @type {?} */ GanttChartService.prototype.yPadding; /** @type {?} */ GanttChartService.prototype.componentID; /** @type {?} */ GanttChartService.prototype.data; /** @type {?} */ GanttChartService.prototype.rectWidth; /** @type {?} */ GanttChartService.prototype.rectHeight; /** @type {?} */ GanttChartService.prototype.legionWidth; /** @type {?} */ GanttChartService.prototype.legionHeight; /** @type {?} */ GanttChartService.prototype.minX; /** @type {?} */ GanttChartService.prototype.maxX; /** @type {?} */ GanttChartService.prototype.monthNames; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtY2hhcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1iZWF1dGlmdWwtY2hhcnRzLyIsInNvdXJjZXMiOlsibGliL2dhbnR0LWNoYXJ0L2dhbnR0LWNoYXJ0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQU9BLE1BQU0sT0FBTyxpQkFBaUI7SUE4QjVCO1FBUEEsZUFBVSxHQUFHO1lBQ1gsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPO1lBQzlCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU07WUFDOUIsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTO1lBQ2hDLFVBQVUsRUFBRSxVQUFVO1NBQ3ZCLENBQUM7SUFFYyxDQUFDOzs7O0lBRWpCLHFCQUFxQjtRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2pELENBQUM7Ozs7SUFFRCx1QkFBdUI7O2NBQ2YsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEQsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztJQUMxQyxDQUFDOzs7OztJQUVELFVBQVUsQ0FBQyxDQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0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QUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEQsQ0FBQztDQUNGOzs7SUE5S0Msa0NBQWM7O0lBQ2QsbUNBQWU7O0lBQ2YsdUNBQXVCOztJQUN2Qix3Q0FBd0I7O0lBQ3hCLDJDQUFlOztJQUNmLG1DQUFPOztJQUNQLHlDQUFhOztJQUNiLHlDQUFhOztJQUNiLDJDQUF1Qjs7SUFDdkIscUNBQWlCOztJQUNqQixxQ0FBaUI7O0lBQ2pCLHdDQUFvQjs7SUFDcEIsaUNBQVU7O0lBRVYsc0NBQWtCOztJQUNsQix1Q0FBbUI7O0lBQ25CLHdDQUFvQjs7SUFDcEIseUNBQXFCOztJQUNyQixpQ0FBYTs7SUFDYixpQ0FBYTs7SUFFYix1Q0FLRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlYXV0aWZ1bENoYXJ0c01vZHVsZSB9IGZyb20gJy4uL2JlYXV0aWZ1bC1jaGFydHMubW9kdWxlJztcbmltcG9ydCB7IGNvbG9yU2NoZW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jb2xvci1zY2hlbWVzJztcblxuLy8gQEluamVjdGFibGUoe1xuLy8gICBwcm92aWRlZEluOiBCZWF1dGlmdWxDaGFydHNNb2R1bGVcbi8vIH0pXG5leHBvcnQgY2xhc3MgR2FudHRDaGFydFNlcnZpY2Uge1xuXG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBnYW50dFRlYW1zOiBBcnJheTxhbnk+O1xuICBnYW50dFBoYXNlczogQXJyYXk8YW55PjtcbiAgcGhhc2VUaW1lbGluZXM7XG4gIGxlZ2lvbjtcbiAgZ2FudHRNaW5EYXRlO1xuICBnYW50dE1heERhdGU7XG4gIGdhbnR0RGF0ZVJhbmdlOiBudW1iZXI7XG4gIHhQYWRkaW5nOiBudW1iZXI7XG4gIHlQYWRkaW5nOiBudW1iZXI7XG4gIGNvbXBvbmVudElEOiBudW1iZXI7XG4gIGRhdGE6IGFueTtcblxuICByZWN0V2lkdGg6IG51bWJlcjtcbiAgcmVjdEhlaWdodDogbnVtYmVyO1xuICBsZWdpb25XaWR0aDogbnVtYmVyO1xuICBsZWdpb25IZWlnaHQ6IG51bWJlcjtcbiAgbWluWDogbnVtYmVyO1xuICBtYXhYOiBudW1iZXI7XG5cbiAgbW9udGhOYW1lcyA9IFtcbiAgICAnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsXG4gICAgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLFxuICAgICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLFxuICAgICdOb3ZlbWJlcicsICdEZWNlbWJlcidcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIGNvbXB1dGVSZWN0RGltZW5zaW9ucygpIHtcbiAgICB0aGlzLnJlY3RXaWR0aCA9IHRoaXMud2lkdGggLSB0aGlzLnhQYWRkaW5nICogMiAtIDE1MDtcbiAgICB0aGlzLnJlY3RIZWlnaHQgPSB0aGlzLmdhbnR0UGhhc2VzLmxlbmd0aCAqIDYwO1xuICB9XG5cbiAgY29tcHV0ZUxlZ2lvbkRpbWVuc2lvbnMoKSB7XG4gICAgY29uc3Qgbm9PZkxpbmVzID0gTWF0aC5jZWlsKHRoaXMuZGF0YS5sZW5ndGggLyAzKTtcbiAgICB0aGlzLmxlZ2lvbldpZHRoID0gdGhpcy53aWR0aCAtIHRoaXMueFBhZGRpbmcgKiAyIC0gMTUwO1xuICAgIHRoaXMubGVnaW9uSGVpZ2h0ID0gNDAgKyA0MCAqIG5vT2ZMaW5lcztcbiAgfVxuXG4gIHRyYW5zZm9ybVgoeDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjdFdpZHRoICogeCAvICh0aGlzLm1heFggLSB0aGlzLm1pblgpO1xuICB9XG5cbiAgY29tcHV0ZUxlZ2lvbigpIHtcbiAgICBjb25zdCBub09mTGluZXMgPSBNYXRoLmNlaWwodGhpcy5kYXRhLmxlbmd0aCAvIDMpO1xuICAgIHRoaXMubGVnaW9uID0gW107XG4gICAgbGV0IGNudCA9IDA7XG4gICAgZm9yIChsZXQgbGluZSA9IDA7IGxpbmUgPCBub09mTGluZXM7IGxpbmUrKykge1xuICAgICAgY29uc3QgbGVnaW9uTGluZSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuZ2FudHRUZWFtc1tjbnRdKSBsZWdpb25MaW5lLnB1c2godGhpcy5nYW50dFRlYW1zW2NudF0pO1xuICAgICAgICBjbnQrKztcbiAgICAgIH1cbiAgICAgIHRoaXMubGVnaW9uLnB1c2gobGVnaW9uTGluZSk7XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMubGVnaW9uKTtcbiAgfVxuXG4gIHRyYW5zZm9ybUdhbnR0RGF0ZShkKSB7XG4gICAgY29uc3Qgb25lRGF5ID0gMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICBjb25zdCBkYXlzU2luY2VNaW5EYXRlID0gTWF0aC5yb3VuZChNYXRoLmFicyhcbiAgICAgICAgKG5ldyBEYXRlKGQpLmdldFRpbWUoKVxuICAgICAgICAtIChuZXcgRGF0ZSh0aGlzLmdhbnR0TWluRGF0ZSkpLmdldFRpbWUoKVxuICAgICAgICApIC8gKG9uZURheSkpKTtcbiAgICByZXR1cm4gdGhpcy5yZWN0V2lkdGggKiBkYXlzU2luY2VNaW5EYXRlIC8gKHRoaXMubWF4WCAtIHRoaXMubWluWCk7XG4gIH1cblxuICBjbG9zZXN0TXVsdGlwbGVMZXNzVGhhbkVxdWFsVG8oZmFjdG9yLCBudW0pIHtcbiAgICBpZiAobnVtICUgZmFjdG9yID09PSAwKSByZXR1cm4gbnVtO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuY2xvc2VzdE11bHRpcGxlTGVzc1RoYW5FcXVhbFRvKGZhY3RvciwgbnVtIC0gMSk7XG4gIH1cblxuICBjbG9zZXN0TXVsdGlwbGVNb3JlVGhhbkVxdWFsVG8oZmFjdG9yLCBudW0pIHtcbiAgICBpZiAobnVtICUgZmFjdG9yID09PSAwKSByZXR1cm4gbnVtO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuY2xvc2VzdE11bHRpcGxlTW9yZVRoYW5FcXVhbFRvKGZhY3RvciwgbnVtICsgMSk7XG4gIH1cblxuXG4gIHNldFZhbHVlcyh7XG4gICAgY29tcG9uZW50SUQ6IGNvbXBvbmVudElELFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICB4UGFkZGluZzogeFBhZGRpbmcsXG4gICAgeVBhZGRpbmc6IHlQYWRkaW5nLFxuICAgIGRhdGE6IGRhdGFcbiAgfSkge1xuICAgIHRoaXMuY29tcG9uZW50SUQgPSBjb21wb25lbnRJRDtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy54UGFkZGluZyA9IHhQYWRkaW5nO1xuICAgIHRoaXMueVBhZGRpbmcgPSB5UGFkZGluZztcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIC8vIGNvbnNvbGUubG9nKCdzZXJ2aWNlIGNvbG9yIHNjaGVtZTogJyArIHRoaXMuY29sb3JTY2hlbWUpXG5cbiAgICBjb25zdCBmcm9tcyA9IFtdO1xuICAgIGNvbnN0IHRvcyA9IFtdO1xuICAgIGNvbnN0IHBoYXNlcyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLmdhbnR0VGVhbXMgPSBbXTtcbiAgICAvLyB0aGlzLnNldENvbG9ycygpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZGF0YSk7XG4gICAgZm9yIChjb25zdCB0ZWFtIG9mIHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy5nYW50dFRlYW1zLnB1c2goe25hbWU6IHRlYW0ubmFtZSwgY29sb3I6IHRlYW0uY29sb3J9KTtcbiAgICAgIGZvciAoY29uc3QgcGhhc2Ugb2YgT2JqZWN0LmtleXModGVhbS50aW1lbGluZXMpKSB7XG4gICAgICAgIHBoYXNlcy5hZGQocGhhc2UpO1xuICAgICAgICBmb3IgKGNvbnN0IHRpbWVsaW5lIG9mIHRlYW0udGltZWxpbmVzW3BoYXNlXSkge1xuICAgICAgICAgIGZyb21zLnB1c2godGltZWxpbmUuZnJvbSk7XG4gICAgICAgICAgdG9zLnB1c2godGltZWxpbmUudG8pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZ2FudHRQaGFzZXMgPSBBcnJheS5mcm9tKHBoYXNlcyk7XG5cbiAgICAvLyBjb25zb2xlLmxvZygncGhhc2UgdGltZWxpbmVzOiAnKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnBoYXNlVGltZWxpbmVzKTtcblxuICAgIGNvbnN0IG1pbkRhdGUgPSBmcm9tcy5yZWR1Y2UoKGEsIGIpID0+IG5ldyBEYXRlKGEpIDwgbmV3IERhdGUoYikgPyBhIDogYiApO1xuICAgIGNvbnN0IG1heERhdGUgPSB0b3MucmVkdWNlKChhLCBiKSA9PiBuZXcgRGF0ZShhKSA+IG5ldyBEYXRlKGIpID8gYSA6IGIgKTtcblxuICAgIHRoaXMuZ2FudHRNaW5EYXRlID0gbWluRGF0ZTtcbiAgICB0aGlzLmdhbnR0TWF4RGF0ZSA9IG1heERhdGU7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5nYW50dE1pbkRhdGUgKyAnIC0gJyArIHRoaXMuZ2FudHRNYXhEYXRlKTtcbiAgICBjb25zdCBub09mTGluZXMgPSBNYXRoLmNlaWwodGhpcy5kYXRhLmxlbmd0aCAvIDMpO1xuICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5nYW50dFBoYXNlcy5sZW5ndGggKiA2MCArIHRoaXMueVBhZGRpbmcgKiAzICsgMTAwICsgNDAgKyAzMCAqIG5vT2ZMaW5lcztcblxuICAgIGNvbnN0IG9uZURheSA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG4gICAgdGhpcy5nYW50dERhdGVSYW5nZSA9IE1hdGgucm91bmQoTWF0aC5hYnMoXG4gICAgICAgIChuZXcgRGF0ZSh0aGlzLmdhbnR0TWF4RGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgIC0gbmV3IERhdGUodGhpcy5nYW50dE1pbkRhdGUpLmdldFRpbWUoKVxuICAgICAgICApIC8gKG9uZURheSkpKTtcbiAgICAvLyBjb25zb2xlLmxvZygnRGF0ZSBSYW5nZTogJyk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5nYW50dERhdGVSYW5nZSk7XG4gICAgdGhpcy5taW5YID0gMDtcbiAgICAvLyB0aGlzLm1heFggPSB0aGlzLmdhbnR0RGF0ZVJhbmdlO1xuICAgIGxldCBmbGFnID0gMDtcbiAgICBsZXQgcXRzID0gMTtcbiAgICBsZXQgZ3JpZFByZWNpc2lvblggPSAwO1xuICAgIHdoaWxlIChmbGFnID09PSAwKSB7XG4gICAgICBpZiAodGhpcy5nYW50dERhdGVSYW5nZSA8PSA5MCAqIHF0cykge1xuICAgICAgICBncmlkUHJlY2lzaW9uWCA9IDcgKiBxdHM7XG4gICAgICAgIGZsYWcgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7IHF0cyA9IHF0cyArIDE7IH1cbiAgICB9XG5cbiAgICB0aGlzLm1heFggPSB0aGlzLmNsb3Nlc3RNdWx0aXBsZU1vcmVUaGFuRXF1YWxUbyg3ICogcXRzLCB0aGlzLmdhbnR0RGF0ZVJhbmdlKTtcbiAgICB0aGlzLmdhbnR0TWF4RGF0ZSA9IHRoaXMuYWRkRGF5cyh0aGlzLmdhbnR0TWluRGF0ZSwgdGhpcy5tYXhYKTtcblxuICAgIHRoaXMuY29tcHV0ZVJlY3REaW1lbnNpb25zKCk7XG4gICAgdGhpcy5jb21wdXRlTGVnaW9uRGltZW5zaW9ucygpO1xuICAgIHRoaXMuY29tcHV0ZUxlZ2lvbigpO1xuICAgIC8vIHRoaXMucHJpbnRBbGwoKTtcbiAgfVxuXG4gIGFkZERheXMoZGF0ZSwgZGF5czogbnVtYmVyKSB7XG4gICAgY29uc3QgbmV3ZGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xuICAgIG5ld2RhdGUuc2V0RGF0ZSgobmV3IERhdGUoZGF0ZSkpLmdldERhdGUoKSArIGRheXMpO1xuICAgIGNvbnN0IGRheSA9IG5ld2RhdGUuZ2V0RGF0ZSgpO1xuICAgIGNvbnN0IG1vbnRoSW5kZXggPSBuZXdkYXRlLmdldE1vbnRoKCk7XG4gICAgY29uc3QgeWVhciA9IG5ld2RhdGUuZ2V0RnVsbFllYXIoKTtcblxuXG4gICAgcmV0dXJuIHRoaXMubW9udGhOYW1lc1ttb250aEluZGV4XSArICcgJyArIGRheSArICcsICcgKyB5ZWFyO1xuICB9XG5cbiAgcHJpbnRBbGwoKSB7XG4gICAgY29uc29sZS5sb2coJ2xpbmUtZ3JhcGgtc2VydmljZScpO1xuICAgIGNvbnNvbGUubG9nKCdjb21wb25lbnQgSUQ6ICcgKyB0aGlzLmNvbXBvbmVudElEKTtcbiAgICBjb25zb2xlLmxvZygnd2lkdGg6ICcgKyB0aGlzLndpZHRoKTtcbiAgICBjb25zb2xlLmxvZygnaGVpZ2h0OiAnICsgdGhpcy5oZWlnaHQpO1xuICAgIGNvbnNvbGUubG9nKCd4UGFkZGluZzogJyArIHRoaXMueFBhZGRpbmcpO1xuICAgIGNvbnNvbGUubG9nKCd5UGFkZGluZzogJyArIHRoaXMueVBhZGRpbmcpO1xuICAgIGNvbnNvbGUubG9nKCdyZWN0V2lkdGg6ICcgKyB0aGlzLnJlY3RXaWR0aCk7XG4gICAgY29uc29sZS5sb2coJ3JlY3RIZWlnaHQ6ICcgKyB0aGlzLnJlY3RIZWlnaHQpO1xuICB9XG59XG4iXX0=