UNPKG

ngx-beautiful-charts

Version:
351 lines 34 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, ElementRef } from '@angular/core'; import { colorSchemes } from '../../constants/color-schemes'; import { PieChartService } from './pie-chart.service'; import { GlobalParametersService } from '../../global/global-parameters.service'; var PieChartComponent = /** @class */ (function () { function PieChartComponent(pieChartService, globalParametersService, currentElement) { this.pieChartService = pieChartService; this.globalParametersService = globalParametersService; this.currentElement = currentElement; this.colorScheme = 'colorful'; this.customColorScheme = []; this.xPadding = 60; this.yPadding = this.xPadding / 2; this.pieSlicesInit = 0; } /** * @param {?} pieCompletion * @return {?} */ PieChartComponent.prototype.generatePieSlices = /** * @param {?} pieCompletion * @return {?} */ function (pieCompletion) { var e_1, _a, e_2, _b; if (this.pieSlicesInit === 0) this.pieSlices = []; /** @type {?} */ var sum = 0; try { for (var _c = tslib_1.__values(this.data), _d = _c.next(); !_d.done; _d = _c.next()) { var val = _d.value; sum = sum + val.value; } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_d && !_d.done && (_a = _c.return)) _a.call(_c); } finally { if (e_1) throw e_1.error; } } /** @type {?} */ var rotation = 0; /** @type {?} */ var rotationRad = 0; /** @type {?} */ var cnt = 0; try { for (var _e = tslib_1.__values(this.data), _f = _e.next(); !_f.done; _f = _e.next()) { var val = _f.value; // console.log(val); /** @type {?} */ var perc = val.value / sum * pieCompletion; /** @type {?} */ var angle = 360 * perc; // const angleMod = (angle > 180 ) ? 360 - angle : angle; /** @type {?} */ var angleRad = angle * Math.PI / 180; /** @type {?} */ var largeArc = (angle > 180) ? 1 : 0; /** @type {?} */ var path = 'M 0 0 0 ' + -this.pieRadius + ' A ' + this.pieRadius + ' ' + this.pieRadius + ' 0 ' + largeArc + ' 1' + this.pieRadius * Math.sin(angleRad) + ' ' + -this.pieRadius * Math.cos(angleRad) + ' z'; /** @type {?} */ var hoverPath = 'M 0 0 0 ' + -this.hoverPieRadius + ' A ' + this.hoverPieRadius + ' ' + this.hoverPieRadius + ' 0 ' + largeArc + ' 1' + this.hoverPieRadius * Math.sin(angleRad) + ' ' + -this.hoverPieRadius * Math.cos(angleRad) + ' z'; /** @type {?} */ var pieInteriorX = this.pieRadius * 2 / 3 * Math.sin(rotationRad + angleRad / 2); /** @type {?} */ var pieInteriorY = -this.pieRadius * 2 / 3 * Math.cos(rotationRad + angleRad / 2); /** @type {?} */ var toolTipText = (Math.round(perc * 10000) / 100).toString() + '%'; /** @type {?} */ var pieSlice = { perc: perc, name: val.name, color: val.color, hoverD: hoverPath, rotation: 'rotate(' + rotation + 'deg)', d: path, hover: false, toolTipTranslate: 'translate(' + pieInteriorX + 'px, ' + pieInteriorY + 'px)', toolTipText: toolTipText }; // console.log(hoverPath); // console.log(pieSlice); if (this.pieSlicesInit === 0) this.pieSlices.push(pieSlice); else this.pieSlices[cnt] = pieSlice; // this.pieSlices.push(pieSlice); rotation += angle; rotationRad = rotation * Math.PI / 180; cnt++; } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_f && !_f.done && (_b = _e.return)) _b.call(_e); } finally { if (e_2) throw e_2.error; } } }; /** * @return {?} */ PieChartComponent.prototype.setDimensions = /** * @return {?} */ function () { if (this.width) this.height = this.width * .6 - this.xPadding; else { /** @type {?} */ var host = this.currentElement.nativeElement; if (host.parentNode != null) { /** @type {?} */ var dims = host.parentNode.getBoundingClientRect(); this.width = dims.width; this.height = this.width * .6 - this.xPadding; } } // console.log('---set dimensions---'); // console.log('width: ' + this.width); // console.log('height: ' + this.height); // console.log('--------------------'); }; /** * @return {?} */ PieChartComponent.prototype.setColors = /** * @return {?} */ function () { var e_3, _a; /** @type {?} */ var cnt = 0; try { for (var _b = tslib_1.__values(this.data), _c = _b.next(); !_c.done; _c = _b.next()) { var slice = _c.value; if (!slice.color) { if (this.customColorScheme.length > 0) { slice.color = this.customColorScheme[cnt % this.customColorScheme.length]; } else { slice.color = colorSchemes[this.colorScheme][cnt % 10]; } } cnt++; } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_3) throw e_3.error; } } }; /** * @return {?} */ PieChartComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.data = JSON.parse(JSON.stringify(this.data)); this.componentID = this.globalParametersService.addNewComponent(); // console.log('x: ' + this.x); this.setDimensions(); this.data.sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { return a.value > b.value ? -1 : a.value < b.value ? 1 : 0; })); this.setColors(); this.pieSlicesInit = 0; this.pieChartService.setValues({ componentID: this.componentID, width: this.width, height: this.height, xPadding: this.xPadding, yPadding: this.yPadding, data: this.data }); this.pieRadius = this.pieChartService.pieRadius; this.hoverPieRadius = this.pieChartService.pieRadius * 1.05; /** @type {?} */ var pieCompletion = 0; /** @type {?} */ var intervalID = setInterval((/** * @return {?} */ function () { _this.generatePieSlices(pieCompletion); _this.pieSlicesInit = 1; pieCompletion = pieCompletion + 0.01; pieCompletion = Math.round(pieCompletion * 100) / 100; if (pieCompletion > 1) clearInterval(intervalID); }), 5); // console.log(this.hoverPieRadius); this.cX = this.xPadding + this.pieRadius; this.cY = this.yPadding + this.pieRadius; /** @type {?} */ var translateX = this.xPadding + this.pieRadius; /** @type {?} */ var translateY = this.yPadding + this.pieRadius; this.gTranslate = 'translate(' + translateX + 'px, ' + translateY + 'px)'; /** @type {?} */ var hoverTranslateXY = this.pieRadius * 0.08; this.hoverTranslate = 'translate(' + hoverTranslateXY + 'px, ' + -hoverTranslateXY + 'px)'; }; /** * @return {?} */ PieChartComponent.prototype.ngOnChanges = /** * @return {?} */ function () { var _this = this; this.data = JSON.parse(JSON.stringify(this.data)); // console.log('x: ' + this.x); this.setDimensions(); this.data.sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { return a.value > b.value ? -1 : a.value < b.value ? 1 : 0; })); this.setColors(); this.pieSlicesInit = 0; this.pieChartService.setValues({ componentID: this.componentID, width: this.width, height: this.height, xPadding: this.xPadding, yPadding: this.yPadding, data: this.data }); this.pieRadius = this.pieChartService.pieRadius; this.hoverPieRadius = this.pieChartService.pieRadius * 1.05; /** @type {?} */ var pieCompletion = 0; /** @type {?} */ var intervalID = setInterval((/** * @return {?} */ function () { _this.generatePieSlices(pieCompletion); _this.pieSlicesInit = 1; pieCompletion = pieCompletion + 0.01; pieCompletion = Math.round(pieCompletion * 100) / 100; if (pieCompletion > 1) clearInterval(intervalID); }), 5); // console.log(this.hoverPieRadius); this.cX = this.xPadding + this.pieRadius; this.cY = this.yPadding + this.pieRadius; /** @type {?} */ var translateX = this.xPadding + this.pieRadius; /** @type {?} */ var translateY = this.yPadding + this.pieRadius; this.gTranslate = 'translate(' + translateX + 'px, ' + translateY + 'px)'; /** @type {?} */ var hoverTranslateXY = this.pieRadius * 0.08; this.hoverTranslate = 'translate(' + hoverTranslateXY + 'px, ' + -hoverTranslateXY + 'px)'; }; PieChartComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-pie-chart', template: "<svg [attr.width]=\"width\" [attr.height]=\"height\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n\n <g ngx-pie-chart-base />\n <g *ngFor=\"let pieSlice of pieSlices\">\n <g id=\"component\" [ngStyle]=\"{'transform': gTranslate}\">\n <g class=\"pie-g\" [ngStyle]=\"{'transform': pieSlice.rotation, 'position': 'relative'}\">\n <path class=\"pie-slice\" (mouseover)=\"pieSlice.hover=true\" (mouseout)=\"pieSlice.hover=false\"\n [ngStyle]=\"{'opacity': pieSlice.hover ? 0.7 : 1.0}\"\n [attr.d]=\"pieSlice.hover ? pieSlice.hoverD : pieSlice.d\" [attr.fill]=\"pieSlice.color\" />\n </g>\n <g class=\"tooltip\" [ngStyle]=\"{'transform': pieSlice.toolTipTranslate}\" \n opacity=\"0.9\">\n <rect rx=\"5\" width=\"70\" height=\"25\"></rect>\n <text x=\"15\" y=\"16\">{{ pieSlice.toolTipText }}</text>\n </g>\n </g>\n </g>\n \n</svg>\n\n<!-- 'transform': pieSlice.hover ? hoverTranslate + ' ' + pieSlice.rotation : pieSlice.rotation, -->", providers: [PieChartService], styles: [".pie-slice{transition:.3s ease-in}#component .tooltip{visibility:hidden;position:relative!important}#component:hover .tooltip{visibility:visible;position:absolute;z-index:9999999!important}#component:hover:after .tooltip{position:relative;left:0;top:100%;white-space:nowrap;z-index:9999999!important}.tooltip text{fill:#eee;font-size:12px;font-family:sans-serif;z-index:9999999!important}.tooltip rect{fill:#222;stroke:#111;z-index:9999998!important}"] }] } ]; /** @nocollapse */ PieChartComponent.ctorParameters = function () { return [ { type: PieChartService }, { type: GlobalParametersService }, { type: ElementRef } ]; }; PieChartComponent.propDecorators = { data: [{ type: Input }], width: [{ type: Input }], colorScheme: [{ type: Input }], customColorScheme: [{ type: Input }] }; return PieChartComponent; }()); export { PieChartComponent }; if (false) { /** @type {?} */ PieChartComponent.prototype.data; /** @type {?} */ PieChartComponent.prototype.width; /** @type {?} */ PieChartComponent.prototype.colorScheme; /** @type {?} */ PieChartComponent.prototype.customColorScheme; /** @type {?} */ PieChartComponent.prototype.componentID; /** @type {?} */ PieChartComponent.prototype.xPadding; /** @type {?} */ PieChartComponent.prototype.yPadding; /** @type {?} */ PieChartComponent.prototype.height; /** @type {?} */ PieChartComponent.prototype.pieSlices; /** @type {?} */ PieChartComponent.prototype.pieRadius; /** @type {?} */ PieChartComponent.prototype.hoverPieRadius; /** @type {?} */ PieChartComponent.prototype.cX; /** @type {?} */ PieChartComponent.prototype.cY; /** @type {?} */ PieChartComponent.prototype.gTranslate; /** @type {?} */ PieChartComponent.prototype.hoverTranslate; /** @type {?} */ PieChartComponent.prototype.pieSlicesInit; /** @type {?} */ PieChartComponent.prototype.pieChartService; /** * @type {?} * @private */ PieChartComponent.prototype.globalParametersService; /** * @type {?} * @private */ PieChartComponent.prototype.currentElement; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGllLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1iZWF1dGlmdWwtY2hhcnRzLyIsInNvdXJjZXMiOlsibGliL3BpZS1jaGFydC9waWUtY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWEsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFakY7SUE4QkUsMkJBQW1CLGVBQWdDLEVBQy9CLHVCQUFnRCxFQUNoRCxjQUEwQjtRQUYzQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDL0IsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUNoRCxtQkFBYyxHQUFkLGNBQWMsQ0FBWTtRQWxCckMsZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFDekIsc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBRzFDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxhQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFTN0Isa0JBQWEsR0FBRyxDQUFDLENBQUM7SUFLbEIsQ0FBQzs7Ozs7SUFFRCw2Q0FBaUI7Ozs7SUFBakIsVUFBa0IsYUFBYTs7UUFDN0IsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLENBQUM7WUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQzs7WUFFOUMsR0FBRyxHQUFHLENBQUM7O1lBQ1gsS0FBa0IsSUFBQSxLQUFBLGlCQUFBLElBQUksQ0FBQyxJQUFJLENBQUEsZ0JBQUEsNEJBQUU7Z0JBQXhCLElBQU0sR0FBRyxXQUFBO2dCQUNaLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FB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TFIsd0JBQUM7Q0FBQSxBQW5NRCxJQW1NQztTQTdMWSxpQkFBaUI7OztJQU01QixpQ0FBK0Q7O0lBQy9ELGtDQUF1Qjs7SUFDdkIsd0NBQWtDOztJQUNsQyw4Q0FBMEM7O0lBRTFDLHdDQUFZOztJQUNaLHFDQUFjOztJQUNkLHFDQUE2Qjs7SUFDN0IsbUNBQWU7O0lBQ2Ysc0NBQWU7O0lBQ2Ysc0NBQWtCOztJQUNsQiwyQ0FBdUI7O0lBQ3ZCLCtCQUFXOztJQUNYLCtCQUFXOztJQUNYLHVDQUFtQjs7SUFDbkIsMkNBQXVCOztJQUN2QiwwQ0FBa0I7O0lBRU4sNENBQXVDOzs7OztJQUN2QyxvREFBd0Q7Ozs7O0lBQ3hELDJDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25DaGFuZ2VzLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb2xvclNjaGVtZXMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvY29sb3Itc2NoZW1lcyc7XG5pbXBvcnQgeyBQaWVDaGFydFNlcnZpY2UgfSBmcm9tICcuL3BpZS1jaGFydC5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZ2xvYmFsL2dsb2JhbC1wYXJhbWV0ZXJzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtcGllLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BpZS1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BpZS1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtQaWVDaGFydFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIFBpZUNoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIC8vIDxuZ3gtYmVhdXRpZnVsLWNoYXJ0cyBbd2lkdGhdPVwiODAwXCJcbiAgLy8gW2RhdGFdPVwicGllQ2hhcnREYXRhXCJcbiAgLy8gY2hhcnRUeXBlPVwicGllLWNoYXJ0XCI+PC9uZ3gtYmVhdXRpZnVsLWNoYXJ0cz5cblxuICBASW5wdXQoKSBkYXRhOiBbe25hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZywgdmFsdWU6IG51bWJlciB9XTtcbiAgQElucHV0KCkgd2lkdGg6IG51bWJlcjtcbiAgQElucHV0KCkgY29sb3JTY2hlbWUgPSAnY29sb3JmdWwnO1xuICBASW5wdXQoKSBjdXN0b21Db2xvclNjaGVtZTogc3RyaW5nW10gPSBbXTtcblxuICBjb21wb25lbnRJRDtcbiAgeFBhZGRpbmcgPSA2MDtcbiAgeVBhZGRpbmcgPSB0aGlzLnhQYWRkaW5nIC8gMjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHBpZVNsaWNlczogYW55O1xuICBwaWVSYWRpdXM6IG51bWJlcjtcbiAgaG92ZXJQaWVSYWRpdXM6IG51bWJlcjtcbiAgY1g6IG51bWJlcjtcbiAgY1k6IG51bWJlcjtcbiAgZ1RyYW5zbGF0ZTogc3RyaW5nO1xuICBob3ZlclRyYW5zbGF0ZTogc3RyaW5nO1xuICBwaWVTbGljZXNJbml0ID0gMDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGllQ2hhcnRTZXJ2aWNlOiBQaWVDaGFydFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgZ2xvYmFsUGFyYW1ldGVyc1NlcnZpY2U6IEdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGN1cnJlbnRFbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gIH1cblxuICBnZW5lcmF0ZVBpZVNsaWNlcyhwaWVDb21wbGV0aW9uKSB7XG4gICAgaWYgKHRoaXMucGllU2xpY2VzSW5pdCA9PT0gMCkgdGhpcy5waWVTbGljZXMgPSBbXTtcblxuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuZGF0YSkge1xuICAgICAgc3VtID0gc3VtICsgdmFsLnZhbHVlO1xuICAgIH1cbiAgICBsZXQgcm90YXRpb24gPSAwO1xuICAgIGxldCByb3RhdGlvblJhZCA9IDA7XG5cbiAgICBsZXQgY250ID0gMDtcblxuICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuZGF0YSkge1xuICAgICAgLy8gY29uc29sZS5sb2codmFsKTtcbiAgICAgIGNvbnN0IHBlcmMgPSB2YWwudmFsdWUgLyBzdW0gKiBwaWVDb21wbGV0aW9uO1xuICAgICAgY29uc3QgYW5nbGUgPSAzNjAgKiBwZXJjO1xuICAgICAgLy8gY29uc3QgYW5nbGVNb2QgPSAoYW5nbGUgPiAxODAgKSA/IDM2MCAtIGFuZ2xlIDogYW5nbGU7XG4gICAgICBjb25zdCBhbmdsZVJhZCA9IGFuZ2xlICogTWF0aC5QSSAvIDE4MDtcbiAgICAgIGNvbnN0IGxhcmdlQXJjID0gKGFuZ2xlID4gMTgwKSA/IDEgOiAwO1xuXG4gICAgICBjb25zdCBwYXRoID0gJ00gMCAwIDAgJyArIC10aGlzLnBpZVJhZGl1cyArICcgQSAnXG4gICAgICArIHRoaXMucGllUmFkaXVzICsgJyAnICsgdGhpcy5waWVSYWRpdXNcbiAgICAgICsgJyAwICcgKyBsYXJnZUFyYyArICcgMScgKyB0aGlzLnBpZVJhZGl1cyAqIE1hdGguc2luKGFuZ2xlUmFkKSArICcgJ1xuICAgICAgKyAtdGhpcy5waWVSYWRpdXMgKiBNYXRoLmNvcyhhbmdsZVJhZCkgKyAnIHonO1xuXG4gICAgICBjb25zdCBob3ZlclBhdGggPSAnTSAwIDAgMCAnICsgLXRoaXMuaG92ZXJQaWVSYWRpdXMgKyAnIEEgJ1xuICAgICAgKyB0aGlzLmhvdmVyUGllUmFkaXVzICsgJyAnICsgdGhpcy5ob3ZlclBpZVJhZGl1c1xuICAgICAgKyAnIDAgJyArIGxhcmdlQXJjICsgJyAxJyArIHRoaXMuaG92ZXJQaWVSYWRpdXMgKiBNYXRoLnNpbihhbmdsZVJhZCkgKyAnICdcbiAgICAgICsgLXRoaXMuaG92ZXJQaWVSYWRpdXMgKiBNYXRoLmNvcyhhbmdsZVJhZCkgKyAnIHonO1xuXG4gICAgICBjb25zdCBwaWVJbnRlcmlvclggPSB0aGlzLnBpZVJhZGl1cyAqIDIgLyAzICogTWF0aC5zaW4ocm90YXRpb25SYWQgKyBhbmdsZVJhZCAvIDIpO1xuICAgICAgY29uc3QgcGllSW50ZXJpb3JZID0gLXRoaXMucGllUmFkaXVzICogMiAvIDMgKiBNYXRoLmNvcyhyb3RhdGlvblJhZCArIGFuZ2xlUmFkIC8gMik7XG4gICAgICBjb25zdCB0b29sVGlwVGV4dCA9IChNYXRoLnJvdW5kKHBlcmMgKiAxMDAwMCkgLyAxMDApLnRvU3RyaW5nKCkgKyAnJSc7XG5cbiAgICAgIGNvbnN0IHBpZVNsaWNlID0ge1xuICAgICAgICBwZXJjLFxuICAgICAgICBuYW1lOiB2YWwubmFtZSxcbiAgICAgICAgY29sb3I6IHZhbC5jb2xvcixcbiAgICAgICAgaG92ZXJEOiBob3ZlclBhdGgsXG4gICAgICAgIHJvdGF0aW9uOiAncm90YXRlKCcgKyByb3RhdGlvbiArICdkZWcpJyxcbiAgICAgICAgZDogcGF0aCxcbiAgICAgICAgaG92ZXI6IGZhbHNlLFxuICAgICAgICB0b29sVGlwVHJhbnNsYXRlOiAndHJhbnNsYXRlKCcgKyBwaWVJbnRlcmlvclggKyAncHgsICcgKyBwaWVJbnRlcmlvclkgKyAncHgpJyxcbiAgICAgICAgdG9vbFRpcFRleHRcbiAgICAgIH07XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKGhvdmVyUGF0aCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhwaWVTbGljZSk7XG4gICAgICBpZiAoIHRoaXMucGllU2xpY2VzSW5pdCA9PT0gMCApIHRoaXMucGllU2xpY2VzLnB1c2gocGllU2xpY2UpO1xuICAgICAgZWxzZSB0aGlzLnBpZVNsaWNlc1tjbnRdID0gcGllU2xpY2U7XG4gICAgICAvLyB0aGlzLnBpZVNsaWNlcy5wdXNoKHBpZVNsaWNlKTtcbiAgICAgIHJvdGF0aW9uICs9IGFuZ2xlO1xuICAgICAgcm90YXRpb25SYWQgPSByb3RhdGlvbiAqIE1hdGguUEkgLyAxODA7XG5cbiAgICAgIGNudCArKztcbiAgICB9XG4gIH1cblxuICBzZXREaW1lbnNpb25zKCkge1xuICAgIGlmICh0aGlzLndpZHRoKSB0aGlzLmhlaWdodCA9IHRoaXMud2lkdGggKiAuNiAtIHRoaXMueFBhZGRpbmc7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBob3N0ID0gdGhpcy5jdXJyZW50RWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKGhvc3QucGFyZW50Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGRpbXMgPSBob3N0LnBhcmVudE5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMud2lkdGggPSBkaW1zLndpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMud2lkdGggKiAuNiAtIHRoaXMueFBhZGRpbmc7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCctLS1zZXQgZGltZW5zaW9ucy0tLScpO1xuICAgIC8vIGNvbnNvbGUubG9nKCd3aWR0aDogJyArIHRoaXMud2lkdGgpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdoZWlnaHQ6ICcgKyB0aGlzLmhlaWdodCk7XG4gICAgLy8gY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gIH1cblxuICBzZXRDb2xvcnMoKSB7XG4gICAgbGV0IGNudCA9IDA7XG4gICAgZm9yIChjb25zdCBzbGljZSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGlmICghc2xpY2UuY29sb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ29sb3JTY2hlbWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNsaWNlLmNvbG9yID0gdGhpcy5jdXN0b21Db2xvclNjaGVtZVtjbnQgJSB0aGlzLmN1c3RvbUNvbG9yU2NoZW1lLmxlbmd0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2xpY2UuY29sb3IgPSBjb2xvclNjaGVtZXNbdGhpcy5jb2xvclNjaGVtZV1bY250ICUgMTBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbnQrKztcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpO1xuICAgIHRoaXMuY29tcG9uZW50SUQgPSB0aGlzLmdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlLmFkZE5ld0NvbXBvbmVudCgpO1xuICAgIC8vIGNvbnNvbGUubG9nKCd4OiAnICsgdGhpcy54KTtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmRhdGEuc29ydCgoYSwgYikgPT4gYS52YWx1ZSA+IGIudmFsdWUgPyAtMSA6IGEudmFsdWUgPCBiLnZhbHVlID8gMSA6IDApO1xuICAgIHRoaXMuc2V0Q29sb3JzKCk7XG4gICAgdGhpcy5waWVTbGljZXNJbml0ID0gMDtcbiAgICB0aGlzLnBpZUNoYXJ0U2VydmljZS5zZXRWYWx1ZXMoe1xuICAgICAgY29tcG9uZW50SUQ6IHRoaXMuY29tcG9uZW50SUQsXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgICB4UGFkZGluZzogdGhpcy54UGFkZGluZyxcbiAgICAgIHlQYWRkaW5nOiB0aGlzLnlQYWRkaW5nLFxuICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgfSk7XG4gICAgdGhpcy5waWVSYWRpdXMgPSB0aGlzLnBpZUNoYXJ0U2VydmljZS5waWVSYWRpdXM7XG4gICAgdGhpcy5ob3ZlclBpZVJhZGl1cyA9IHRoaXMucGllQ2hhcnRTZXJ2aWNlLnBpZVJhZGl1cyAqIDEuMDU7XG4gICAgbGV0IHBpZUNvbXBsZXRpb24gPSAwO1xuXG4gICAgY29uc3QgaW50ZXJ2YWxJRCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVQaWVTbGljZXMocGllQ29tcGxldGlvbik7XG4gICAgICB0aGlzLnBpZVNsaWNlc0luaXQgPSAxO1xuICAgICAgcGllQ29tcGxldGlvbiA9IHBpZUNvbXBsZXRpb24gKyAwLjAxO1xuICAgICAgcGllQ29tcGxldGlvbiA9IE1hdGgucm91bmQocGllQ29tcGxldGlvbiAqIDEwMCkgLyAxMDA7XG4gICAgICBpZiAocGllQ29tcGxldGlvbiA+IDEpIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJRCk7XG4gICAgfSwgNSk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5ob3ZlclBpZVJhZGl1cyk7XG4gICAgdGhpcy5jWCA9IHRoaXMueFBhZGRpbmcgKyB0aGlzLnBpZVJhZGl1cztcbiAgICB0aGlzLmNZID0gdGhpcy55UGFkZGluZyArIHRoaXMucGllUmFkaXVzO1xuICAgIGNvbnN0IHRyYW5zbGF0ZVggPSB0aGlzLnhQYWRkaW5nICsgdGhpcy5waWVSYWRpdXM7XG4gICAgY29uc3QgdHJhbnNsYXRlWSA9IHRoaXMueVBhZGRpbmcgKyB0aGlzLnBpZVJhZGl1cztcbiAgICB0aGlzLmdUcmFuc2xhdGUgPSAndHJhbnNsYXRlKCcgKyB0cmFuc2xhdGVYICsgJ3B4LCAnICsgdHJhbnNsYXRlWSArICdweCknO1xuICAgIGNvbnN0IGhvdmVyVHJhbnNsYXRlWFkgPSB0aGlzLnBpZVJhZGl1cyAqIDAuMDg7XG4gICAgdGhpcy5ob3ZlclRyYW5zbGF0ZSA9ICd0cmFuc2xhdGUoJyArIGhvdmVyVHJhbnNsYXRlWFkgKyAncHgsICcgKyAtaG92ZXJUcmFuc2xhdGVYWSArICdweCknO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5kYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEpKTtcbiAgICAvLyBjb25zb2xlLmxvZygneDogJyArIHRoaXMueCk7XG4gICAgdGhpcy5zZXREaW1lbnNpb25zKCk7XG4gICAgdGhpcy5kYXRhLnNvcnQoKGEsIGIpID0+IGEudmFsdWUgPiBiLnZhbHVlID8gLTEgOiBhLnZhbHVlIDwgYi52YWx1ZSA/IDEgOiAwKTtcbiAgICB0aGlzLnNldENvbG9ycygpO1xuICAgIHRoaXMucGllU2xpY2VzSW5pdCA9IDA7XG4gICAgdGhpcy5waWVDaGFydFNlcnZpY2Uuc2V0VmFsdWVzKHtcbiAgICAgIGNvbXBvbmVudElEOiB0aGlzLmNvbXBvbmVudElELFxuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgeFBhZGRpbmc6IHRoaXMueFBhZGRpbmcsXG4gICAgICB5UGFkZGluZzogdGhpcy55UGFkZGluZyxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgIH0pO1xuICAgIHRoaXMucGllUmFkaXVzID0gdGhpcy5waWVDaGFydFNlcnZpY2UucGllUmFkaXVzO1xuICAgIHRoaXMuaG92ZXJQaWVSYWRpdXMgPSB0aGlzLnBpZUNoYXJ0U2VydmljZS5waWVSYWRpdXMgKiAxLjA1O1xuICAgIGxldCBwaWVDb21wbGV0aW9uID0gMDtcbiAgICBjb25zdCBpbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5nZW5lcmF0ZVBpZVNsaWNlcyhwaWVDb21wbGV0aW9uKTtcbiAgICAgIHRoaXMucGllU2xpY2VzSW5pdCA9IDE7XG4gICAgICBwaWVDb21wbGV0aW9uID0gcGllQ29tcGxldGlvbiArIDAuMDE7XG4gICAgICBwaWVDb21wbGV0aW9uID0gTWF0aC5yb3VuZChwaWVDb21wbGV0aW9uICogMTAwKSAvIDEwMDtcbiAgICAgIGlmIChwaWVDb21wbGV0aW9uID4gMSkgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElEKTtcbiAgICB9LCA1KTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmhvdmVyUGllUmFkaXVzKTtcbiAgICB0aGlzLmNYID0gdGhpcy54UGFkZGluZyArIHRoaXMucGllUmFkaXVzO1xuICAgIHRoaXMuY1kgPSB0aGlzLnlQYWRkaW5nICsgdGhpcy5waWVSYWRpdXM7XG4gICAgY29uc3QgdHJhbnNsYXRlWCA9IHRoaXMueFBhZGRpbmcgKyB0aGlzLnBpZVJhZGl1cztcbiAgICBjb25zdCB0cmFuc2xhdGVZID0gdGhpcy55UGFkZGluZyArIHRoaXMucGllUmFkaXVzO1xuICAgIHRoaXMuZ1RyYW5zbGF0ZSA9ICd0cmFuc2xhdGUoJyArIHRyYW5zbGF0ZVggKyAncHgsICcgKyB0cmFuc2xhdGVZICsgJ3B4KSc7XG4gICAgY29uc3QgaG92ZXJUcmFuc2xhdGVYWSA9IHRoaXMucGllUmFkaXVzICogMC4wODtcbiAgICB0aGlzLmhvdmVyVHJhbnNsYXRlID0gJ3RyYW5zbGF0ZSgnICsgaG92ZXJUcmFuc2xhdGVYWSArICdweCwgJyArIC1ob3ZlclRyYW5zbGF0ZVhZICsgJ3B4KSc7XG4gIH1cblxufVxuIl19