ngx-beautiful-charts
Version:
A library to create charts in Angular
333 lines • 26.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
// @Injectable({
// providedIn: BeautifulChartsModule
// })
var
// @Injectable({
// providedIn: BeautifulChartsModule
// })
GanttChartService = /** @class */ (function () {
function GanttChartService() {
this.monthNames = [
'January', 'February', 'March',
'April', 'May', 'June', 'July',
'August', 'September', 'October',
'November', 'December'
];
}
/**
* @return {?}
*/
GanttChartService.prototype.computeRectDimensions = /**
* @return {?}
*/
function () {
this.rectWidth = this.width - this.xPadding * 2 - 150;
this.rectHeight = this.ganttPhases.length * 60;
};
/**
* @return {?}
*/
GanttChartService.prototype.computeLegionDimensions = /**
* @return {?}
*/
function () {
/** @type {?} */
var noOfLines = Math.ceil(this.data.length / 3);
this.legionWidth = this.width - this.xPadding * 2 - 150;
this.legionHeight = 40 + 40 * noOfLines;
};
/**
* @param {?} x
* @return {?}
*/
GanttChartService.prototype.transformX = /**
* @param {?} x
* @return {?}
*/
function (x) {
return this.rectWidth * x / (this.maxX - this.minX);
};
/**
* @return {?}
*/
GanttChartService.prototype.computeLegion = /**
* @return {?}
*/
function () {
/** @type {?} */
var noOfLines = Math.ceil(this.data.length / 3);
this.legion = [];
/** @type {?} */
var cnt = 0;
for (var line = 0; line < noOfLines; line++) {
/** @type {?} */
var legionLine = [];
for (var 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 {?}
*/
GanttChartService.prototype.transformGanttDate = /**
* @param {?} d
* @return {?}
*/
function (d) {
/** @type {?} */
var oneDay = 24 * 60 * 60 * 1000;
/** @type {?} */
var 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 {?}
*/
GanttChartService.prototype.closestMultipleLessThanEqualTo = /**
* @param {?} factor
* @param {?} num
* @return {?}
*/
function (factor, num) {
if (num % factor === 0)
return num;
else
return this.closestMultipleLessThanEqualTo(factor, num - 1);
};
/**
* @param {?} factor
* @param {?} num
* @return {?}
*/
GanttChartService.prototype.closestMultipleMoreThanEqualTo = /**
* @param {?} factor
* @param {?} num
* @return {?}
*/
function (factor, num) {
if (num % factor === 0)
return num;
else
return this.closestMultipleMoreThanEqualTo(factor, num + 1);
};
/**
* @param {?} __0
* @return {?}
*/
GanttChartService.prototype.setValues = /**
* @param {?} __0
* @return {?}
*/
function (_a) {
var e_1, _b, e_2, _c, e_3, _d;
var componentID = _a.componentID, width = _a.width, xPadding = _a.xPadding, yPadding = _a.yPadding, data = _a.data;
this.componentID = componentID;
this.width = width;
this.xPadding = xPadding;
this.yPadding = yPadding;
this.data = data;
// console.log('service color scheme: ' + this.colorScheme)
/** @type {?} */
var froms = [];
/** @type {?} */
var tos = [];
/** @type {?} */
var phases = new Set();
this.ganttTeams = [];
try {
// this.setColors();
// console.log(this.data);
for (var _e = tslib_1.__values(this.data), _f = _e.next(); !_f.done; _f = _e.next()) {
var team = _f.value;
this.ganttTeams.push({ name: team.name, color: team.color });
try {
for (var _g = tslib_1.__values(Object.keys(team.timelines)), _h = _g.next(); !_h.done; _h = _g.next()) {
var phase = _h.value;
phases.add(phase);
try {
for (var _j = tslib_1.__values(team.timelines[phase]), _k = _j.next(); !_k.done; _k = _j.next()) {
var timeline = _k.value;
froms.push(timeline.from);
tos.push(timeline.to);
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_k && !_k.done && (_d = _j.return)) _d.call(_j);
}
finally { if (e_3) throw e_3.error; }
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_h && !_h.done && (_c = _g.return)) _c.call(_g);
}
finally { if (e_2) throw e_2.error; }
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
}
finally { if (e_1) throw e_1.error; }
}
this.ganttPhases = Array.from(phases);
// console.log('phase timelines: ');
// console.log(this.phaseTimelines);
/** @type {?} */
var minDate = froms.reduce((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return new Date(a) < new Date(b) ? a : b; }));
/** @type {?} */
var maxDate = tos.reduce((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return new Date(a) > new Date(b) ? a : b; }));
this.ganttMinDate = minDate;
this.ganttMaxDate = maxDate;
// console.log(this.ganttMinDate + ' - ' + this.ganttMaxDate);
/** @type {?} */
var noOfLines = Math.ceil(this.data.length / 3);
this.height = this.ganttPhases.length * 60 + this.yPadding * 3 + 100 + 40 + 30 * noOfLines;
/** @type {?} */
var 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 {?} */
var flag = 0;
/** @type {?} */
var qts = 1;
/** @type {?} */
var 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 {?}
*/
GanttChartService.prototype.addDays = /**
* @param {?} date
* @param {?} days
* @return {?}
*/
function (date, days) {
/** @type {?} */
var newdate = new Date(date);
newdate.setDate((new Date(date)).getDate() + days);
/** @type {?} */
var day = newdate.getDate();
/** @type {?} */
var monthIndex = newdate.getMonth();
/** @type {?} */
var year = newdate.getFullYear();
return this.monthNames[monthIndex] + ' ' + day + ', ' + year;
};
/**
* @return {?}
*/
GanttChartService.prototype.printAll = /**
* @return {?}
*/
function () {
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);
};
return GanttChartService;
}());
// @Injectable({
// providedIn: BeautifulChartsModule
// })
export { GanttChartService };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtY2hhcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1iZWF1dGlmdWwtY2hhcnRzLyIsInNvdXJjZXMiOlsibGliL2dhbnR0LWNoYXJ0L2dhbnR0LWNoYXJ0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFPQTs7Ozs7SUE4QkU7UUFQQSxlQUFVLEdBQUc7WUFDWCxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU87WUFDOUIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTTtZQUM5QixRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVM7WUFDaEMsVUFBVSxFQUFFLFVBQVU7U0FDdkIsQ0FBQztJQUVjLENBQUM7Ozs7SUFFakIsaURBQXFCOzs7SUFBckI7UUFDRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2pELENBQUM7Ozs7SUFFRCxtREFBdUI7OztJQUF2Qjs7WUFDUSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4RCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQzFDLENBQUM7Ozs7O0lBRUQsc0NBQVU7Ozs7SUFBVixVQUFXLENBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FB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SSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNILHdCQUFDO0FBQUQsQ0FBQyxBQWhMRCxJQWdMQzs7Ozs7OztJQTlLQyxrQ0FBYzs7SUFDZCxtQ0FBZTs7SUFDZix1Q0FBdUI7O0lBQ3ZCLHdDQUF3Qjs7SUFDeEIsMkNBQWU7O0lBQ2YsbUNBQU87O0lBQ1AseUNBQWE7O0lBQ2IseUNBQWE7O0lBQ2IsMkNBQXVCOztJQUN2QixxQ0FBaUI7O0lBQ2pCLHFDQUFpQjs7SUFDakIsd0NBQW9COztJQUNwQixpQ0FBVTs7SUFFVixzQ0FBa0I7O0lBQ2xCLHVDQUFtQjs7SUFDbkIsd0NBQW9COztJQUNwQix5Q0FBcUI7O0lBQ3JCLGlDQUFhOztJQUNiLGlDQUFhOztJQUViLHVDQUtFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVhdXRpZnVsQ2hhcnRzTW9kdWxlIH0gZnJvbSAnLi4vYmVhdXRpZnVsLWNoYXJ0cy5tb2R1bGUnO1xuaW1wb3J0IHsgY29sb3JTY2hlbWVzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NvbG9yLXNjaGVtZXMnO1xuXG4vLyBASW5qZWN0YWJsZSh7XG4vLyAgIHByb3ZpZGVkSW46IEJlYXV0aWZ1bENoYXJ0c01vZHVsZVxuLy8gfSlcbmV4cG9ydCBjbGFzcyBHYW50dENoYXJ0U2VydmljZSB7XG5cbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGdhbnR0VGVhbXM6IEFycmF5PGFueT47XG4gIGdhbnR0UGhhc2VzOiBBcnJheTxhbnk+O1xuICBwaGFzZVRpbWVsaW5lcztcbiAgbGVnaW9uO1xuICBnYW50dE1pbkRhdGU7XG4gIGdhbnR0TWF4RGF0ZTtcbiAgZ2FudHREYXRlUmFuZ2U6IG51bWJlcjtcbiAgeFBhZGRpbmc6IG51bWJlcjtcbiAgeVBhZGRpbmc6IG51bWJlcjtcbiAgY29tcG9uZW50SUQ6IG51bWJlcjtcbiAgZGF0YTogYW55O1xuXG4gIHJlY3RXaWR0aDogbnVtYmVyO1xuICByZWN0SGVpZ2h0OiBudW1iZXI7XG4gIGxlZ2lvbldpZHRoOiBudW1iZXI7XG4gIGxlZ2lvbkhlaWdodDogbnVtYmVyO1xuICBtaW5YOiBudW1iZXI7XG4gIG1heFg6IG51bWJlcjtcblxuICBtb250aE5hbWVzID0gW1xuICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJyxcbiAgICAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsXG4gICAgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsXG4gICAgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ1xuICBdO1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgY29tcHV0ZVJlY3REaW1lbnNpb25zKCkge1xuICAgIHRoaXMucmVjdFdpZHRoID0gdGhpcy53aWR0aCAtIHRoaXMueFBhZGRpbmcgKiAyIC0gMTUwO1xuICAgIHRoaXMucmVjdEhlaWdodCA9IHRoaXMuZ2FudHRQaGFzZXMubGVuZ3RoICogNjA7XG4gIH1cblxuICBjb21wdXRlTGVnaW9uRGltZW5zaW9ucygpIHtcbiAgICBjb25zdCBub09mTGluZXMgPSBNYXRoLmNlaWwodGhpcy5kYXRhLmxlbmd0aCAvIDMpO1xuICAgIHRoaXMubGVnaW9uV2lkdGggPSB0aGlzLndpZHRoIC0gdGhpcy54UGFkZGluZyAqIDIgLSAxNTA7XG4gICAgdGhpcy5sZWdpb25IZWlnaHQgPSA0MCArIDQwICogbm9PZkxpbmVzO1xuICB9XG5cbiAgdHJhbnNmb3JtWCh4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5yZWN0V2lkdGggKiB4IC8gKHRoaXMubWF4WCAtIHRoaXMubWluWCk7XG4gIH1cblxuICBjb21wdXRlTGVnaW9uKCkge1xuICAgIGNvbnN0IG5vT2ZMaW5lcyA9IE1hdGguY2VpbCh0aGlzLmRhdGEubGVuZ3RoIC8gMyk7XG4gICAgdGhpcy5sZWdpb24gPSBbXTtcbiAgICBsZXQgY250ID0gMDtcbiAgICBmb3IgKGxldCBsaW5lID0gMDsgbGluZSA8IG5vT2ZMaW5lczsgbGluZSsrKSB7XG4gICAgICBjb25zdCBsZWdpb25MaW5lID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5nYW50dFRlYW1zW2NudF0pIGxlZ2lvbkxpbmUucHVzaCh0aGlzLmdhbnR0VGVhbXNbY250XSk7XG4gICAgICAgIGNudCsrO1xuICAgICAgfVxuICAgICAgdGhpcy5sZWdpb24ucHVzaChsZWdpb25MaW5lKTtcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5sZWdpb24pO1xuICB9XG5cbiAgdHJhbnNmb3JtR2FudHREYXRlKGQpIHtcbiAgICBjb25zdCBvbmVEYXkgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgIGNvbnN0IGRheXNTaW5jZU1pbkRhdGUgPSBNYXRoLnJvdW5kKE1hdGguYWJzKFxuICAgICAgICAobmV3IERhdGUoZCkuZ2V0VGltZSgpXG4gICAgICAgIC0gKG5ldyBEYXRlKHRoaXMuZ2FudHRNaW5EYXRlKSkuZ2V0VGltZSgpXG4gICAgICAgICkgLyAob25lRGF5KSkpO1xuICAgIHJldHVybiB0aGlzLnJlY3RXaWR0aCAqIGRheXNTaW5jZU1pbkRhdGUgLyAodGhpcy5tYXhYIC0gdGhpcy5taW5YKTtcbiAgfVxuXG4gIGNsb3Nlc3RNdWx0aXBsZUxlc3NUaGFuRXF1YWxUbyhmYWN0b3IsIG51bSkge1xuICAgIGlmIChudW0gJSBmYWN0b3IgPT09IDApIHJldHVybiBudW07XG4gICAgZWxzZSByZXR1cm4gdGhpcy5jbG9zZXN0TXVsdGlwbGVMZXNzVGhhbkVxdWFsVG8oZmFjdG9yLCBudW0gLSAxKTtcbiAgfVxuXG4gIGNsb3Nlc3RNdWx0aXBsZU1vcmVUaGFuRXF1YWxUbyhmYWN0b3IsIG51bSkge1xuICAgIGlmIChudW0gJSBmYWN0b3IgPT09IDApIHJldHVybiBudW07XG4gICAgZWxzZSByZXR1cm4gdGhpcy5jbG9zZXN0TXVsdGlwbGVNb3JlVGhhbkVxdWFsVG8oZmFjdG9yLCBudW0gKyAxKTtcbiAgfVxuXG5cbiAgc2V0VmFsdWVzKHtcbiAgICBjb21wb25lbnRJRDogY29tcG9uZW50SUQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIHhQYWRkaW5nOiB4UGFkZGluZyxcbiAgICB5UGFkZGluZzogeVBhZGRpbmcsXG4gICAgZGF0YTogZGF0YVxuICB9KSB7XG4gICAgdGhpcy5jb21wb25lbnRJRCA9IGNvbXBvbmVudElEO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLnhQYWRkaW5nID0geFBhZGRpbmc7XG4gICAgdGhpcy55UGFkZGluZyA9IHlQYWRkaW5nO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgLy8gY29uc29sZS5sb2coJ3NlcnZpY2UgY29sb3Igc2NoZW1lOiAnICsgdGhpcy5jb2xvclNjaGVtZSlcblxuICAgIGNvbnN0IGZyb21zID0gW107XG4gICAgY29uc3QgdG9zID0gW107XG4gICAgY29uc3QgcGhhc2VzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuZ2FudHRUZWFtcyA9IFtdO1xuICAgIC8vIHRoaXMuc2V0Q29sb3JzKCk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5kYXRhKTtcbiAgICBmb3IgKGNvbnN0IHRlYW0gb2YgdGhpcy5kYXRhKSB7XG4gICAgICB0aGlzLmdhbnR0VGVhbXMucHVzaCh7bmFtZTogdGVhbS5uYW1lLCBjb2xvcjogdGVhbS5jb2xvcn0pO1xuICAgICAgZm9yIChjb25zdCBwaGFzZSBvZiBPYmplY3Qua2V5cyh0ZWFtLnRpbWVsaW5lcykpIHtcbiAgICAgICAgcGhhc2VzLmFkZChwaGFzZSk7XG4gICAgICAgIGZvciAoY29uc3QgdGltZWxpbmUgb2YgdGVhbS50aW1lbGluZXNbcGhhc2VdKSB7XG4gICAgICAgICAgZnJvbXMucHVzaCh0aW1lbGluZS5mcm9tKTtcbiAgICAgICAgICB0b3MucHVzaCh0aW1lbGluZS50byk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5nYW50dFBoYXNlcyA9IEFycmF5LmZyb20ocGhhc2VzKTtcblxuICAgIC8vIGNvbnNvbGUubG9nKCdwaGFzZSB0aW1lbGluZXM6ICcpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMucGhhc2VUaW1lbGluZXMpO1xuXG4gICAgY29uc3QgbWluRGF0ZSA9IGZyb21zLnJlZHVjZSgoYSwgYikgPT4gbmV3IERhdGUoYSkgPCBuZXcgRGF0ZShiKSA/IGEgOiBiICk7XG4gICAgY29uc3QgbWF4RGF0ZSA9IHRvcy5yZWR1Y2UoKGEsIGIpID0+IG5ldyBEYXRlKGEpID4gbmV3IERhdGUoYikgPyBhIDogYiApO1xuXG4gICAgdGhpcy5nYW50dE1pbkRhdGUgPSBtaW5EYXRlO1xuICAgIHRoaXMuZ2FudHRNYXhEYXRlID0gbWF4RGF0ZTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmdhbnR0TWluRGF0ZSArICcgLSAnICsgdGhpcy5nYW50dE1heERhdGUpO1xuICAgIGNvbnN0IG5vT2ZMaW5lcyA9IE1hdGguY2VpbCh0aGlzLmRhdGEubGVuZ3RoIC8gMyk7XG4gICAgdGhpcy5oZWlnaHQgPSB0aGlzLmdhbnR0UGhhc2VzLmxlbmd0aCAqIDYwICsgdGhpcy55UGFkZGluZyAqIDMgKyAxMDAgKyA0MCArIDMwICogbm9PZkxpbmVzO1xuXG4gICAgY29uc3Qgb25lRGF5ID0gMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICB0aGlzLmdhbnR0RGF0ZVJhbmdlID0gTWF0aC5yb3VuZChNYXRoLmFicyhcbiAgICAgICAgKG5ldyBEYXRlKHRoaXMuZ2FudHRNYXhEYXRlKS5nZXRUaW1lKClcbiAgICAgICAgLSBuZXcgRGF0ZSh0aGlzLmdhbnR0TWluRGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgICkgLyAob25lRGF5KSkpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdEYXRlIFJhbmdlOiAnKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmdhbnR0RGF0ZVJhbmdlKTtcbiAgICB0aGlzLm1pblggPSAwO1xuICAgIC8vIHRoaXMubWF4WCA9IHRoaXMuZ2FudHREYXRlUmFuZ2U7XG4gICAgbGV0IGZsYWcgPSAwO1xuICAgIGxldCBxdHMgPSAxO1xuICAgIGxldCBncmlkUHJlY2lzaW9uWCA9IDA7XG4gICAgd2hpbGUgKGZsYWcgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLmdhbnR0RGF0ZVJhbmdlIDw9IDkwICogcXRzKSB7XG4gICAgICAgIGdyaWRQcmVjaXNpb25YID0gNyAqIHF0cztcbiAgICAgICAgZmxhZyA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHsgcXRzID0gcXRzICsgMTsgfVxuICAgIH1cblxuICAgIHRoaXMubWF4WCA9IHRoaXMuY2xvc2VzdE11bHRpcGxlTW9yZVRoYW5FcXVhbFRvKDcgKiBxdHMsIHRoaXMuZ2FudHREYXRlUmFuZ2UpO1xuICAgIHRoaXMuZ2FudHRNYXhEYXRlID0gdGhpcy5hZGREYXlzKHRoaXMuZ2FudHRNaW5EYXRlLCB0aGlzLm1heFgpO1xuXG4gICAgdGhpcy5jb21wdXRlUmVjdERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmNvbXB1dGVMZWdpb25EaW1lbnNpb25zKCk7XG4gICAgdGhpcy5jb21wdXRlTGVnaW9uKCk7XG4gICAgLy8gdGhpcy5wcmludEFsbCgpO1xuICB9XG5cbiAgYWRkRGF5cyhkYXRlLCBkYXlzOiBudW1iZXIpIHtcbiAgICBjb25zdCBuZXdkYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgbmV3ZGF0ZS5zZXREYXRlKChuZXcgRGF0ZShkYXRlKSkuZ2V0RGF0ZSgpICsgZGF5cyk7XG4gICAgY29uc3QgZGF5ID0gbmV3ZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhJbmRleCA9IG5ld2RhdGUuZ2V0TW9udGgoKTtcbiAgICBjb25zdCB5ZWFyID0gbmV3ZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG5cbiAgICByZXR1cm4gdGhpcy5tb250aE5hbWVzW21vbnRoSW5kZXhdICsgJyAnICsgZGF5ICsgJywgJyArIHllYXI7XG4gIH1cblxuICBwcmludEFsbCgpIHtcbiAgICBjb25zb2xlLmxvZygnbGluZS1ncmFwaC1zZXJ2aWNlJyk7XG4gICAgY29uc29sZS5sb2coJ2NvbXBvbmVudCBJRDogJyArIHRoaXMuY29tcG9uZW50SUQpO1xuICAgIGNvbnNvbGUubG9nKCd3aWR0aDogJyArIHRoaXMud2lkdGgpO1xuICAgIGNvbnNvbGUubG9nKCdoZWlnaHQ6ICcgKyB0aGlzLmhlaWdodCk7XG4gICAgY29uc29sZS5sb2coJ3hQYWRkaW5nOiAnICsgdGhpcy54UGFkZGluZyk7XG4gICAgY29uc29sZS5sb2coJ3lQYWRkaW5nOiAnICsgdGhpcy55UGFkZGluZyk7XG4gICAgY29uc29sZS5sb2coJ3JlY3RXaWR0aDogJyArIHRoaXMucmVjdFdpZHRoKTtcbiAgICBjb25zb2xlLmxvZygncmVjdEhlaWdodDogJyArIHRoaXMucmVjdEhlaWdodCk7XG4gIH1cbn1cbiJdfQ==