ngx-frappe-chart
Version:
A simple and easy to use angular wrapper on top of frappe for generating awesome graphs.
394 lines (380 loc) • 35.2 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core')) :
typeof define === 'function' && define.amd ? define('ngx-frappe-chart', ['exports', '@angular/core'], factory) :
(factory((global['ngx-frappe-chart'] = {}),global.ng.core));
}(this, (function (exports,core) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var FrappeChartsHeatmapComponent = (function () {
function FrappeChartsHeatmapComponent() {
}
FrappeChartsHeatmapComponent.decorators = [
{ type: core.Component, args: [{
selector: 'ngx-frappe-charts-heatmap',
template: "\n <div\n ngxFrappeChartsHeatmap\n [title]=\"title\"\n [countLabel]=\"countLabel\"\n [discreteDomains]=\"discreteDomains\"\n [colors]=\"colors\"\n [data]=\"data\"\n ></div>\n "
},] },
];
FrappeChartsHeatmapComponent.propDecorators = {
data: [{ type: core.Input }],
title: [{ type: core.Input }],
countLabel: [{ type: core.Input }],
discreteDomains: [{ type: core.Input }],
colors: [{ type: core.Input }]
};
return FrappeChartsHeatmapComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var FrappeChartsPercentageComponent = (function () {
function FrappeChartsPercentageComponent() {
}
FrappeChartsPercentageComponent.decorators = [
{ type: core.Component, args: [{
selector: 'ngx-frappe-charts-percentage',
template: "\n <div\n ngxFrappeChartsPercentage\n [title]=\"title\"\n [colors]=\"colors\"\n [height]=\"height\"\n [data]=\"data\"\n [type]=\"type\"\n [barOptions]=\"barOptions\"\n ></div>\n "
},] },
];
FrappeChartsPercentageComponent.propDecorators = {
data: [{ type: core.Input }],
title: [{ type: core.Input }],
colors: [{ type: core.Input }],
height: [{ type: core.Input }],
type: [{ type: core.Input }],
maxSlices: [{ type: core.Input }],
barOptions: [{ type: core.Input }]
};
return FrappeChartsPercentageComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var FrappeChartsBarComponent = (function () {
function FrappeChartsBarComponent() {
}
FrappeChartsBarComponent.decorators = [
{ type: core.Component, args: [{
selector: 'ngx-frappe-charts-bar',
template: "\n <div\n ngxFrappeChartsAxis\n [title]=\"title\"\n [colors]=\"colors\"\n [height]=\"height\"\n [data]=\"data\"\n [type]=\"type\"\n [isNavigable]=\"isNavigable\"\n [valuesOverPoints]=\"valuesOverPoints\"\n [axisOptions]=\"axisOptions\"\n [tooltipOptions]=\"tooltipOptions\"\n [barOptions]=\"barOptions\"\n [lineOptions]=\"lineOptions\"\n [yMarkers]=\"yMarkers\"\n [yRegions]=\"yRegions\"\n ></div>\n "
},] },
];
FrappeChartsBarComponent.propDecorators = {
data: [{ type: core.Input }],
title: [{ type: core.Input }],
type: [{ type: core.Input }],
colors: [{ type: core.Input }],
height: [{ type: core.Input }],
isNavigable: [{ type: core.Input }],
valuesOverPoints: [{ type: core.Input }],
axisOptions: [{ type: core.Input }],
tooltipOptions: [{ type: core.Input }],
barOptions: [{ type: core.Input }],
lineOptions: [{ type: core.Input }],
yMarkers: [{ type: core.Input }],
yRegions: [{ type: core.Input }]
};
return FrappeChartsBarComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
// just to avoid error marked by editor. Optional declaration
var FrappeChartsHeatmapDirective = (function () {
function FrappeChartsHeatmapDirective(el) {
this.el = el;
this.type = 'heatmap';
}
/**
* @return {?}
*/
FrappeChartsHeatmapDirective.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
/** @type {?} */
var chart = new frappe.Chart(this.el.nativeElement, this.getHeatmapInputs());
};
/**
* @return {?}
*/
FrappeChartsHeatmapDirective.prototype.getHeatmapInputs = /**
* @return {?}
*/
function () {
/** @type {?} */
var heatmapobject = {};
heatmapobject['countLabel'] = this.countLabel;
heatmapobject['discreteDomains'] = this.discreteDomains;
heatmapobject['colors'] = this.colors;
heatmapobject['type'] = this.type;
heatmapobject['title'] = this.title;
heatmapobject['data'] = this.data;
return heatmapobject;
};
FrappeChartsHeatmapDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[ngxFrappeChartsHeatmap]'
},] },
];
FrappeChartsHeatmapDirective.ctorParameters = function () {
return [
{ type: core.ElementRef }
];
};
FrappeChartsHeatmapDirective.propDecorators = {
title: [{ type: core.Input }],
data: [{ type: core.Input }],
countLabel: [{ type: core.Input }],
discreteDomains: [{ type: core.Input }],
colors: [{ type: core.Input }]
};
return FrappeChartsHeatmapDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/** @type {?} */
var FrappeChartsConstants = {
chartType: {
percentage: 'percentage',
pie: 'pie',
bar: 'bar',
line: 'line',
axismixed: 'axis-mixed'
}
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var FrappeChartsPercentageDirective = (function () {
function FrappeChartsPercentageDirective(el) {
this.el = el;
}
/**
* @return {?}
*/
FrappeChartsPercentageDirective.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
/** @type {?} */
var chart = new frappe.Chart(this.el.nativeElement, this.getPieInputs());
};
/**
* @return {?}
*/
FrappeChartsPercentageDirective.prototype.getPieInputs = /**
* @return {?}
*/
function () {
/** @type {?} */
var pieobject = {};
pieobject['colors'] = this.colors;
pieobject['type'] = this.type;
pieobject['title'] = this.title;
pieobject['data'] = this.data;
pieobject['height'] = this.height;
pieobject['maxSlices'] = this.maxSlices;
this.addBarOptions(pieobject);
return pieobject;
};
/**
* @param {?} pieobject
* @return {?}
*/
FrappeChartsPercentageDirective.prototype.addBarOptions = /**
* @param {?} pieobject
* @return {?}
*/
function (pieobject) {
if (this.type === FrappeChartsConstants.chartType.percentage) {
pieobject['barOptions'] = this.barOptions;
}
};
FrappeChartsPercentageDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[ngxFrappeChartsPercentage]'
},] },
];
FrappeChartsPercentageDirective.ctorParameters = function () {
return [
{ type: core.ElementRef }
];
};
FrappeChartsPercentageDirective.propDecorators = {
title: [{ type: core.Input }],
data: [{ type: core.Input }],
colors: [{ type: core.Input }],
height: [{ type: core.Input }],
type: [{ type: core.Input }],
maxSlices: [{ type: core.Input }],
barOptions: [{ type: core.Input }]
};
return FrappeChartsPercentageDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var FrappeChartsAxisDirective = (function () {
function FrappeChartsAxisDirective(el) {
this.el = el;
}
/**
* @return {?}
*/
FrappeChartsAxisDirective.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
/** @type {?} */
var chart = new frappe.Chart(this.el.nativeElement, this.getAxisInputs());
};
/**
* @return {?}
*/
FrappeChartsAxisDirective.prototype.getAxisInputs = /**
* @return {?}
*/
function () {
/** @type {?} */
var barObject = {};
barObject['colors'] = this.colors;
barObject['type'] = this.type;
barObject['title'] = this.title;
barObject['height'] = this.height;
barObject['isNavigable'] = this.isNavigable;
barObject['valuesOverPoints'] = this.valuesOverPoints;
barObject['axisOptions'] = this.axisOptions;
barObject['tooltipOptions'] = this.tooltipOptions;
this.addGraphData(barObject);
this.addLineOptions(barObject);
this.addBarOptions(barObject);
return barObject;
};
/**
* @param {?} barObject
* @return {?}
*/
FrappeChartsAxisDirective.prototype.addLineOptions = /**
* @param {?} barObject
* @return {?}
*/
function (barObject) {
if (this.type === FrappeChartsConstants.chartType.line ||
this.type === FrappeChartsConstants.chartType.axismixed) {
barObject['lineOptions'] = this.lineOptions;
}
};
/**
* @param {?} barObject
* @return {?}
*/
FrappeChartsAxisDirective.prototype.addBarOptions = /**
* @param {?} barObject
* @return {?}
*/
function (barObject) {
if (this.type === FrappeChartsConstants.chartType.bar ||
this.type === FrappeChartsConstants.chartType.axismixed) {
barObject['barOptions'] = this.barOptions;
}
};
/**
* @param {?} barObject
* @return {?}
*/
FrappeChartsAxisDirective.prototype.addGraphData = /**
* @param {?} barObject
* @return {?}
*/
function (barObject) {
/** @type {?} */
var data = this.data;
if (this.yMarkers) {
data['yMarkers'] = this.yMarkers;
}
if (this.yRegions) {
data['yRegions'] = this.yRegions;
}
barObject['data'] = data;
};
FrappeChartsAxisDirective.decorators = [
{ type: core.Directive, args: [{
selector: '[ngxFrappeChartsAxis]'
},] },
];
FrappeChartsAxisDirective.ctorParameters = function () {
return [
{ type: core.ElementRef }
];
};
FrappeChartsAxisDirective.propDecorators = {
data: [{ type: core.Input }],
type: [{ type: core.Input }],
title: [{ type: core.Input }],
colors: [{ type: core.Input }],
height: [{ type: core.Input }],
isNavigable: [{ type: core.Input }],
valuesOverPoints: [{ type: core.Input }],
axisOptions: [{ type: core.Input }],
tooltipOptions: [{ type: core.Input }],
barOptions: [{ type: core.Input }],
lineOptions: [{ type: core.Input }],
yMarkers: [{ type: core.Input }],
yRegions: [{ type: core.Input }]
};
return FrappeChartsAxisDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
var FrappeChartsModule = (function () {
function FrappeChartsModule() {
}
FrappeChartsModule.decorators = [
{ type: core.NgModule, args: [{
imports: [],
declarations: [
FrappeChartsHeatmapComponent,
FrappeChartsPercentageComponent,
FrappeChartsBarComponent,
FrappeChartsHeatmapDirective,
FrappeChartsPercentageDirective,
FrappeChartsAxisDirective
],
exports: [
FrappeChartsHeatmapComponent,
FrappeChartsPercentageComponent,
FrappeChartsBarComponent
]
},] },
];
return FrappeChartsModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
exports.FrappeChartsHeatmapComponent = FrappeChartsHeatmapComponent;
exports.FrappeChartsPercentageComponent = FrappeChartsPercentageComponent;
exports.FrappeChartsBarComponent = FrappeChartsBarComponent;
exports.FrappeChartsModule = FrappeChartsModule;
exports.ɵc = FrappeChartsAxisDirective;
exports.ɵa = FrappeChartsHeatmapDirective;
exports.ɵb = FrappeChartsPercentageDirective;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZyYXBwZS1jaGFydC51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL25neC1mcmFwcGUtY2hhcnQvbGliL2NvbXBvbmVudHMvZnJhcHBlLWNoYXJ0cy1oZWF0bWFwLmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWZyYXBwZS1jaGFydC9saWIvY29tcG9uZW50cy9mcmFwcGUtY2hhcnRzLXBlcmNlbnRhZ2UuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtZnJhcHBlLWNoYXJ0L2xpYi9jb21wb25lbnRzL2ZyYXBwZS1jaGFydHMtYmFyLmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWZyYXBwZS1jaGFydC9saWIvZGlyZWN0aXZlcy9mcmFwcGUtY2hhcnRzLWhlYXRtYXAuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3gtZnJhcHBlLWNoYXJ0L2xpYi9jb25zdGFudHMvZnJhcHBlLWNoYXJ0cy5jb25zdGFudHMudHMiLCJuZzovL25neC1mcmFwcGUtY2hhcnQvbGliL2RpcmVjdGl2ZXMvZnJhcHBlLWNoYXJ0cy1wZXJjZW50YWdlLmRpcmVjdGl2ZS50cyIsIm5nOi8vbmd4LWZyYXBwZS1jaGFydC9saWIvZGlyZWN0aXZlcy9mcmFwcGUtY2hhcnRzLWF4aXMuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3gtZnJhcHBlLWNoYXJ0L2xpYi9mcmFwcGUtY2hhcnRzLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIZWF0bWFwRGF0YU1vZGVsIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9oZWF0bWFwLWRhdGEubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZnJhcHBlLWNoYXJ0cy1oZWF0bWFwJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBuZ3hGcmFwcGVDaGFydHNIZWF0bWFwXG4gICAgICBbdGl0bGVdPVwidGl0bGVcIlxuICAgICAgW2NvdW50TGFiZWxdPVwiY291bnRMYWJlbFwiXG4gICAgICBbZGlzY3JldGVEb21haW5zXT1cImRpc2NyZXRlRG9tYWluc1wiXG4gICAgICBbY29sb3JzXT1cImNvbG9yc1wiXG4gICAgICBbZGF0YV09XCJkYXRhXCJcbiAgICA+PC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgRnJhcHBlQ2hhcnRzSGVhdG1hcENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGRhdGE6IEhlYXRtYXBEYXRhTW9kZWw7XG4gIEBJbnB1dCgpIHRpdGxlPzogc3RyaW5nO1xuICBASW5wdXQoKSBjb3VudExhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBkaXNjcmV0ZURvbWFpbnM/OiBudW1iZXI7XG4gIEBJbnB1dCgpIGNvbG9ycz86IHN0cmluZ1s1XTtcbn1cblxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFyT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcGVyY2VudGFnZS1iYXItb3B0aW9ucy5tb2RlbCc7XG5pbXBvcnQgeyBHcmFwaERhdGFNb2RlbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZ3JhcGgtZGF0YS5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1mcmFwcGUtY2hhcnRzLXBlcmNlbnRhZ2UnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIG5neEZyYXBwZUNoYXJ0c1BlcmNlbnRhZ2VcbiAgICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgICBbY29sb3JzXT1cImNvbG9yc1wiXG4gICAgICBbaGVpZ2h0XT1cImhlaWdodFwiXG4gICAgICBbZGF0YV09XCJkYXRhXCJcbiAgICAgIFt0eXBlXT1cInR5cGVcIlxuICAgICAgW2Jhck9wdGlvbnNdPVwiYmFyT3B0aW9uc1wiXG4gICAgPjwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIEZyYXBwZUNoYXJ0c1BlcmNlbnRhZ2VDb21wb25lbnQge1xuICBASW5wdXQoKSBkYXRhOiBHcmFwaERhdGFNb2RlbDtcbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbG9ycz86IHN0cmluZ1tdO1xuICBASW5wdXQoKSBoZWlnaHQ/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHR5cGU/OiBzdHJpbmc7IC8vIHBpZSAsIHBlcmNlbnRhZ2VcbiAgQElucHV0KCkgbWF4U2xpY2VzPzogbnVtYmVyOyAvLyByZXN0cmljdCBudW1iZXIgb2Ygc2xpY2VzXG4gIEBJbnB1dCgpIGJhck9wdGlvbnM/OiBCYXJPcHRpb25zO1xufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXhpc09wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2F4aXMtb3B0aW9ucy5tb2RlbCc7XG5pbXBvcnQgeyBUb29sdGlwT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvdG9vbHRpcC1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IEJhck9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Jhci1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IExpbmVPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9saW5lLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgWU1hcmtlcnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3ktbWFya2Vycy5tb2RlbCc7XG5pbXBvcnQgeyBZUmVnaW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMveS1yZWdpb25zLm1vZGVsJztcbmltcG9ydCB7IEdyYXBoRGF0YU1vZGVsIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ncmFwaC1kYXRhLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWZyYXBwZS1jaGFydHMtYmFyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBuZ3hGcmFwcGVDaGFydHNBeGlzXG4gICAgICBbdGl0bGVdPVwidGl0bGVcIlxuICAgICAgW2NvbG9yc109XCJjb2xvcnNcIlxuICAgICAgW2hlaWdodF09XCJoZWlnaHRcIlxuICAgICAgW2RhdGFdPVwiZGF0YVwiXG4gICAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICAgIFtpc05hdmlnYWJsZV09XCJpc05hdmlnYWJsZVwiXG4gICAgICBbdmFsdWVzT3ZlclBvaW50c109XCJ2YWx1ZXNPdmVyUG9pbnRzXCJcbiAgICAgIFtheGlzT3B0aW9uc109XCJheGlzT3B0aW9uc1wiXG4gICAgICBbdG9vbHRpcE9wdGlvbnNdPVwidG9vbHRpcE9wdGlvbnNcIlxuICAgICAgW2Jhck9wdGlvbnNdPVwiYmFyT3B0aW9uc1wiXG4gICAgICBbbGluZU9wdGlvbnNdPVwibGluZU9wdGlvbnNcIlxuICAgICAgW3lNYXJrZXJzXT1cInlNYXJrZXJzXCJcbiAgICAgIFt5UmVnaW9uc109XCJ5UmVnaW9uc1wiXG4gICAgPjwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIEZyYXBwZUNoYXJ0c0JhckNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGRhdGE6IEdyYXBoRGF0YU1vZGVsO1xuICBASW5wdXQoKSB0aXRsZT86IHN0cmluZztcbiAgQElucHV0KCkgdHlwZT86IHN0cmluZztcbiAgQElucHV0KCkgY29sb3JzPzogc3RyaW5nW107XG4gIEBJbnB1dCgpIGhlaWdodD86IG51bWJlcjsgLy8gMjQwO1xuICBASW5wdXQoKSBpc05hdmlnYWJsZT86IGJvb2xlYW47IC8vIGZhbHNlO1xuICBASW5wdXQoKSB2YWx1ZXNPdmVyUG9pbnRzPzogYm9vbGVhbjsgLy8gZmFsc2U7XG4gIEBJbnB1dCgpIGF4aXNPcHRpb25zPzogQXhpc09wdGlvbnM7XG4gIEBJbnB1dCgpIHRvb2x0aXBPcHRpb25zPzogVG9vbHRpcE9wdGlvbnM7XG4gIEBJbnB1dCgpIGJhck9wdGlvbnM/OiBCYXJPcHRpb25zO1xuICBASW5wdXQoKSBsaW5lT3B0aW9ucz86IExpbmVPcHRpb25zO1xuICBASW5wdXQoKSB5TWFya2VyczogWU1hcmtlcnNbXTtcbiAgQElucHV0KCkgeVJlZ2lvbnM6IFlSZWdpb25zW107XG59XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZGVjbGFyZSB2YXIgZnJhcHBlOiBhbnk7IC8vIGp1c3QgdG8gYXZvaWQgZXJyb3IgbWFya2VkIGJ5IGVkaXRvci4gT3B0aW9uYWwgZGVjbGFyYXRpb25cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neEZyYXBwZUNoYXJ0c0hlYXRtYXBdJ1xufSlcbmV4cG9ydCBjbGFzcyBGcmFwcGVDaGFydHNIZWF0bWFwRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRhdGE6IGFueTtcbiAgQElucHV0KCkgY291bnRMYWJlbD86IHN0cmluZztcbiAgQElucHV0KCkgZGlzY3JldGVEb21haW5zPzogbnVtYmVyO1xuICBASW5wdXQoKSBjb2xvcnM/OiBzdHJpbmdbNV07XG4gIHB1YmxpYyByZWFkb25seSB0eXBlID0gJ2hlYXRtYXAnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgY29uc3QgY2hhcnQgPSBuZXcgZnJhcHBlLkNoYXJ0KFxuICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LFxuICAgICAgdGhpcy5nZXRIZWF0bWFwSW5wdXRzKClcbiAgICApO1xuICB9XG5cbiAgZ2V0SGVhdG1hcElucHV0cygpOiBhbnkge1xuICAgIGNvbnN0IGhlYXRtYXBvYmplY3QgPSB7fTtcbiAgICBoZWF0bWFwb2JqZWN0Wydjb3VudExhYmVsJ10gPSB0aGlzLmNvdW50TGFiZWw7XG4gICAgaGVhdG1hcG9iamVjdFsnZGlzY3JldGVEb21haW5zJ10gPSB0aGlzLmRpc2NyZXRlRG9tYWlucztcbiAgICBoZWF0bWFwb2JqZWN0Wydjb2xvcnMnXSA9IHRoaXMuY29sb3JzO1xuICAgIGhlYXRtYXBvYmplY3RbJ3R5cGUnXSA9IHRoaXMudHlwZTtcbiAgICBoZWF0bWFwb2JqZWN0Wyd0aXRsZSddID0gdGhpcy50aXRsZTtcbiAgICBoZWF0bWFwb2JqZWN0WydkYXRhJ10gPSB0aGlzLmRhdGE7XG4gICAgcmV0dXJuIGhlYXRtYXBvYmplY3Q7XG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBGcmFwcGVDaGFydHNDb25zdGFudHMgPSB7XHJcbiAgY2hhcnRUeXBlOiB7XHJcbiAgICBwZXJjZW50YWdlOiAncGVyY2VudGFnZScsXHJcbiAgICBwaWU6ICdwaWUnLFxyXG4gICAgYmFyOiAnYmFyJyxcclxuICAgIGxpbmU6ICdsaW5lJyxcclxuICAgIGF4aXNtaXhlZDogJ2F4aXMtbWl4ZWQnXHJcbiAgfVxyXG59O1xyXG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZyYXBwZUNoYXJ0c0NvbnN0YW50cyB9IGZyb20gJy4uL2NvbnN0YW50cy9mcmFwcGUtY2hhcnRzLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBCYXJPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wZXJjZW50YWdlLWJhci1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IEdyYXBoRGF0YU1vZGVsIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ncmFwaC1kYXRhLm1vZGVsJztcblxuZGVjbGFyZSB2YXIgZnJhcHBlOiBhbnk7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuZ3hGcmFwcGVDaGFydHNQZXJjZW50YWdlXSdcbn0pXG5leHBvcnQgY2xhc3MgRnJhcHBlQ2hhcnRzUGVyY2VudGFnZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHRpdGxlPzogc3RyaW5nO1xuICBASW5wdXQoKSBkYXRhOiBHcmFwaERhdGFNb2RlbDtcbiAgQElucHV0KCkgY29sb3JzPzogc3RyaW5nW107XG4gIEBJbnB1dCgpIGhlaWdodD86IG51bWJlcjtcbiAgQElucHV0KCkgdHlwZTogc3RyaW5nOyAvLyBwaWUgLCBwZXJjZW50YWdlXG4gIEBJbnB1dCgpIG1heFNsaWNlcz86IG51bWJlcjsgLy8gcmVzdHJpY3QgbnVtYmVyIG9mIHNsaWNlc1xuICBASW5wdXQoKSBiYXJPcHRpb25zPzogQmFyT3B0aW9ucztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7fVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGNvbnN0IGNoYXJ0ID0gbmV3IGZyYXBwZS5DaGFydCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZ2V0UGllSW5wdXRzKCkpO1xuICB9XG5cbiAgZ2V0UGllSW5wdXRzKCk6IGFueSB7XG4gICAgY29uc3QgcGllb2JqZWN0ID0ge307XG4gICAgcGllb2JqZWN0Wydjb2xvcnMnXSA9IHRoaXMuY29sb3JzO1xuICAgIHBpZW9iamVjdFsndHlwZSddID0gdGhpcy50eXBlO1xuICAgIHBpZW9iamVjdFsndGl0bGUnXSA9IHRoaXMudGl0bGU7XG4gICAgcGllb2JqZWN0WydkYXRhJ10gPSB0aGlzLmRhdGE7XG4gICAgcGllb2JqZWN0WydoZWlnaHQnXSA9IHRoaXMuaGVpZ2h0O1xuICAgIHBpZW9iamVjdFsnbWF4U2xpY2VzJ10gPSB0aGlzLm1heFNsaWNlcztcbiAgICB0aGlzLmFkZEJhck9wdGlvbnMocGllb2JqZWN0KTtcbiAgICByZXR1cm4gcGllb2JqZWN0O1xuICB9XG5cbiAgYWRkQmFyT3B0aW9ucyhwaWVvYmplY3QpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSBGcmFwcGVDaGFydHNDb25zdGFudHMuY2hhcnRUeXBlLnBlcmNlbnRhZ2UpIHtcbiAgICAgIHBpZW9iamVjdFsnYmFyT3B0aW9ucyddID0gdGhpcy5iYXJPcHRpb25zO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEF4aXNPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9heGlzLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgVG9vbHRpcE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Rvb2x0aXAtb3B0aW9ucy5tb2RlbCc7XG5pbXBvcnQgeyBCYXJPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9iYXItb3B0aW9ucy5tb2RlbCc7XG5pbXBvcnQgeyBMaW5lT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvbGluZS1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IFlNYXJrZXJzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy95LW1hcmtlcnMubW9kZWwnO1xuaW1wb3J0IHsgWVJlZ2lvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3ktcmVnaW9ucy5tb2RlbCc7XG5pbXBvcnQgeyBGcmFwcGVDaGFydHNDb25zdGFudHMgfSBmcm9tICcuLi9jb25zdGFudHMvZnJhcHBlLWNoYXJ0cy5jb25zdGFudHMnO1xuaW1wb3J0IHsgR3JhcGhEYXRhTW9kZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyYXBoLWRhdGEubW9kZWwnO1xuXG5kZWNsYXJlIHZhciBmcmFwcGU6IGFueTtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neEZyYXBwZUNoYXJ0c0F4aXNdJ1xufSlcbmV4cG9ydCBjbGFzcyBGcmFwcGVDaGFydHNBeGlzRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZGF0YTogR3JhcGhEYXRhTW9kZWw7XG4gIEBJbnB1dCgpIHR5cGU6IHN0cmluZzsgLy8gJ2xpbmUnXG4gIEBJbnB1dCgpIHRpdGxlPzogc3RyaW5nO1xuICBASW5wdXQoKSBjb2xvcnM/OiBzdHJpbmdbXTtcbiAgQElucHV0KCkgaGVpZ2h0PzogbnVtYmVyOyAvLyAyNDA7XG4gIEBJbnB1dCgpIGlzTmF2aWdhYmxlPzogYm9vbGVhbjsgLy8gZmFsc2U7XG4gIEBJbnB1dCgpIHZhbHVlc092ZXJQb2ludHM/OiBib29sZWFuOyAvLyBmYWxzZTtcbiAgQElucHV0KCkgYXhpc09wdGlvbnM/OiBBeGlzT3B0aW9ucztcbiAgQElucHV0KCkgdG9vbHRpcE9wdGlvbnM/OiBUb29sdGlwT3B0aW9ucztcbiAgQElucHV0KCkgYmFyT3B0aW9ucz86IEJhck9wdGlvbnM7XG4gIEBJbnB1dCgpIGxpbmVPcHRpb25zPzogTGluZU9wdGlvbnM7XG4gIEBJbnB1dCgpIHlNYXJrZXJzOiBZTWFya2Vyc1tdO1xuICBASW5wdXQoKSB5UmVnaW9uczogWVJlZ2lvbnNbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7fVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGNvbnN0IGNoYXJ0ID0gbmV3IGZyYXBwZS5DaGFydCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZ2V0QXhpc0lucHV0cygpKTtcbiAgfVxuXG4gIGdldEF4aXNJbnB1dHMoKTogYW55IHtcbiAgICBjb25zdCBiYXJPYmplY3QgPSB7fTtcbiAgICBiYXJPYmplY3RbJ2NvbG9ycyddID0gdGhpcy5jb2xvcnM7XG4gICAgYmFyT2JqZWN0Wyd0eXBlJ10gPSB0aGlzLnR5cGU7XG4gICAgYmFyT2JqZWN0Wyd0aXRsZSddID0gdGhpcy50aXRsZTtcbiAgICBiYXJPYmplY3RbJ2hlaWdodCddID0gdGhpcy5oZWlnaHQ7XG4gICAgYmFyT2JqZWN0Wydpc05hdmlnYWJsZSddID0gdGhpcy5pc05hdmlnYWJsZTtcbiAgICBiYXJPYmplY3RbJ3ZhbHVlc092ZXJQb2ludHMnXSA9IHRoaXMudmFsdWVzT3ZlclBvaW50cztcbiAgICBiYXJPYmplY3RbJ2F4aXNPcHRpb25zJ10gPSB0aGlzLmF4aXNPcHRpb25zO1xuICAgIGJhck9iamVjdFsndG9vbHRpcE9wdGlvbnMnXSA9IHRoaXMudG9vbHRpcE9wdGlvbnM7XG5cbiAgICB0aGlzLmFkZEdyYXBoRGF0YShiYXJPYmplY3QpO1xuICAgIHRoaXMuYWRkTGluZU9wdGlvbnMoYmFyT2JqZWN0KTtcbiAgICB0aGlzLmFkZEJhck9wdGlvbnMoYmFyT2JqZWN0KTtcblxuICAgIHJldHVybiBiYXJPYmplY3Q7XG4gIH1cblxuICBhZGRMaW5lT3B0aW9ucyhiYXJPYmplY3QpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnR5cGUgPT09IEZyYXBwZUNoYXJ0c0NvbnN0YW50cy5jaGFydFR5cGUubGluZSB8fFxuICAgICAgdGhpcy50eXBlID09PSBGcmFwcGVDaGFydHNDb25zdGFudHMuY2hhcnRUeXBlLmF4aXNtaXhlZFxuICAgICkge1xuICAgICAgYmFyT2JqZWN0WydsaW5lT3B0aW9ucyddID0gdGhpcy5saW5lT3B0aW9ucztcbiAgICB9XG4gIH1cblxuICBhZGRCYXJPcHRpb25zKGJhck9iamVjdCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMudHlwZSA9PT0gRnJhcHBlQ2hhcnRzQ29uc3RhbnRzLmNoYXJ0VHlwZS5iYXIgfHxcbiAgICAgIHRoaXMudHlwZSA9PT0gRnJhcHBlQ2hhcnRzQ29uc3RhbnRzLmNoYXJ0VHlwZS5heGlzbWl4ZWRcbiAgICApIHtcbiAgICAgIGJhck9iamVjdFsnYmFyT3B0aW9ucyddID0gdGhpcy5iYXJPcHRpb25zO1xuICAgIH1cbiAgfVxuXG4gIGFkZEdyYXBoRGF0YShiYXJPYmplY3QpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGlmICh0aGlzLnlNYXJrZXJzKSB7XG4gICAgICBkYXRhWyd5TWFya2VycyddID0gdGhpcy55TWFya2VycztcbiAgICB9XG5cbiAgICBpZiAodGhpcy55UmVnaW9ucykge1xuICAgICAgZGF0YVsneVJlZ2lvbnMnXSA9IHRoaXMueVJlZ2lvbnM7XG4gICAgfVxuXG4gICAgYmFyT2JqZWN0WydkYXRhJ10gPSBkYXRhO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRnJhcHBlQ2hhcnRzSGVhdG1hcENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9mcmFwcGUtY2hhcnRzLWhlYXRtYXAuY29tcG9uZW50JztcbmltcG9ydCB7IEZyYXBwZUNoYXJ0c0hlYXRtYXBEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvZnJhcHBlLWNoYXJ0cy1oZWF0bWFwLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGcmFwcGVDaGFydHNQZXJjZW50YWdlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2ZyYXBwZS1jaGFydHMtcGVyY2VudGFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRnJhcHBlQ2hhcnRzUGVyY2VudGFnZURpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9mcmFwcGUtY2hhcnRzLXBlcmNlbnRhZ2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZyYXBwZUNoYXJ0c0JhckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9mcmFwcGUtY2hhcnRzLWJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRnJhcHBlQ2hhcnRzQXhpc0RpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9mcmFwcGUtY2hhcnRzLWF4aXMuZGlyZWN0aXZlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW10sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIEZyYXBwZUNoYXJ0c0hlYXRtYXBDb21wb25lbnQsXG4gICAgRnJhcHBlQ2hhcnRzUGVyY2VudGFnZUNvbXBvbmVudCxcbiAgICBGcmFwcGVDaGFydHNCYXJDb21wb25lbnQsXG4gICAgRnJhcHBlQ2hhcnRzSGVhdG1hcERpcmVjdGl2ZSxcbiAgICBGcmFwcGVDaGFydHNQZXJjZW50YWdlRGlyZWN0aXZlLFxuICAgIEZyYXBwZUNoYXJ0c0F4aXNEaXJlY3RpdmVcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIEZyYXBwZUNoYXJ0c0hlYXRtYXBDb21wb25lbnQsXG4gICAgRnJhcHBlQ2hhcnRzUGVyY2VudGFnZUNvbXBvbmVudCxcbiAgICBGcmFwcGVDaGFydHNCYXJDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBGcmFwcGVDaGFydHNNb2R1bGUge31cbiJdLCJuYW1lcyI6WyJDb21wb25lbnQiLCJJbnB1dCIsIkRpcmVjdGl2ZSIsIkVsZW1lbnRSZWYiLCJOZ01vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO1FBR0E7U0FtQkM7O29CQW5CQUEsY0FBUyxTQUFDO3dCQUNULFFBQVEsRUFBRSwyQkFBMkI7d0JBQ3JDLFFBQVEsRUFBRSxzTkFTVDtxQkFDRjs7OzJCQUVFQyxVQUFLOzRCQUNMQSxVQUFLO2lDQUNMQSxVQUFLO3NDQUNMQSxVQUFLOzZCQUNMQSxVQUFLOztRQUNSLG1DQUFDO0tBQUE7Ozs7OztBQ3RCRDtRQUlBO1NBc0JDOztvQkF0QkFELGNBQVMsU0FBQzt3QkFDVCxRQUFRLEVBQUUsOEJBQThCO3dCQUN4QyxRQUFRLEVBQUUsOE5BVVQ7cUJBQ0Y7OzsyQkFFRUMsVUFBSzs0QkFDTEEsVUFBSzs2QkFDTEEsVUFBSzs2QkFDTEEsVUFBSzsyQkFDTEEsVUFBSztnQ0FDTEEsVUFBSztpQ0FDTEEsVUFBSzs7UUFDUixzQ0FBQztLQUFBOzs7Ozs7QUMxQkQ7UUFTQTtTQW1DQzs7b0JBbkNBRCxjQUFTLFNBQUM7d0JBQ1QsUUFBUSxFQUFFLHVCQUF1Qjt3QkFDakMsUUFBUSxFQUFFLCtkQWlCVDtxQkFDRjs7OzJCQUVFQyxVQUFLOzRCQUNMQSxVQUFLOzJCQUNMQSxVQUFLOzZCQUNMQSxVQUFLOzZCQUNMQSxVQUFLO2tDQUNMQSxVQUFLO3VDQUNMQSxVQUFLO2tDQUNMQSxVQUFLO3FDQUNMQSxVQUFLO2lDQUNMQSxVQUFLO2tDQUNMQSxVQUFLOytCQUNMQSxVQUFL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