kre-form
Version:
本项目由 Angular8+ 编写的表单设计器和表单应用,所有的配置都是 JSON 结构体组成,PC 端是基于 ANT 组件库封装
224 lines • 25.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, } from "@angular/core";
import { moveItemInArray, copyArrayItem, } from "@angular/cdk/drag-drop";
import { NzMessageService } from "ng-zorro-antd/message";
import { NzModalService } from "ng-zorro-antd/modal";
export class BoardComponent {
/**
* @param {?} message
* @param {?} modalService
*/
constructor(message, modalService) {
this.message = message;
this.modalService = modalService;
this.changeDataSource = new EventEmitter();
this.changeEchartsParams = new EventEmitter();
this.isLight = false;
}
/**
* @return {?}
*/
ngOnInit() { }
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
for (const propName in changes) {
/** @type {?} */
const chng = changes[propName];
if (propName === "term") {
if (!chng.currentValue || JSON.stringify(chng.currentValue) === "{}") {
this.term = {
row: [],
target: [],
condition: [],
};
}
}
if (propName === "chartOptions") {
if (chng.currentValue) {
// @ts-ignore
this.echartsList = this.chartOptions.dataset["source"];
}
else {
this.chartOptions = {};
}
}
}
}
/**
* @param {?} e
* @return {?}
*/
editChartOptions(e) {
this.chartOptions = e;
if (this.echartsList.length > 0) {
((/** @type {?} */ (this.chartOptions["series"]))).splice(1, ((/** @type {?} */ (this.chartOptions["series"]))).length - 1);
for (let i = 0; i < this.echartsList[0].length - 2; i++) {
if (this.chartOptions["series"]) {
this.chartOptions["series"].push(this.chartOptions["series"][0]);
}
}
}
}
/**
* @param {?} e
* @return {?}
*/
getEchartShape(e) {
this.editChartOptions(e.chartOption);
if (this.echartsList.length > 0) {
Object.assign(this.chartOptions, {
dataset: {
source: this.echartsList,
},
});
}
this.chartOptions = Object.assign({}, this.chartOptions);
}
/**
* @param {?} e
* @return {?}
*/
getEchartOptions(e) {
this.editChartOptions(e);
this.chartOptions = Object.assign({}, this.chartOptions);
}
/**
* @param {?} event
* @return {?}
*/
drop(event) {
if (event.previousContainer === event.container) {
moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
}
else {
/** @type {?} */
let idx = event.container.data.indexOf(event.previousContainer.data[event.previousIndex]);
if (idx != -1) {
this.message.create("error", "标签不能重复");
return; //if item exist
}
if (event.container.id == "row" && this.term.row.length > 1) {
this.message.create("error", "维度不能超过2个");
return;
}
copyArrayItem(event.previousContainer.data, event.container.data, event.previousIndex, event.currentIndex);
this.changeEchartsParams.emit(this.term);
}
}
/**
* @return {?}
*/
dragStarted() {
this.isLight = true;
}
/**
* @return {?}
*/
dragEnded() {
this.isLight = false;
}
/**
* @param {?} item
* @param {?} status
* @return {?}
*/
hover(item, status) {
item.closeBtn = status;
}
/**
* @param {?} e
* @return {?}
*/
changeData(e) {
this.changeDataSource.emit(e);
}
/**
* @param {?} list
* @param {?} i
* @return {?}
*/
closeLabel(list, i) {
list.splice(i, 1);
}
/**
* @return {?}
*/
saveFinalObj() {
this.finalObj = {
dataSourceTitle: this.dataSourceItem.title,
echartsList: this.echartsList,
chartOptions: this.chartOptions,
chartCondition: this.chartCondition,
term: this.term,
};
console.log(JSON.stringify(this.finalObj));
}
/**
* @param {?} e
* @return {?}
*/
echartClickHandler(e) {
console.log("我在echart上点了啥", e);
}
}
BoardComponent.decorators = [
{ type: Component, args: [{
selector: "demo-board",
template: "<div class=\"header\">\n <button nz-button nzType=\"link\" (click)=\"saveFinalObj()\" class=\"btn-text\">\n \u4FDD\u5B58\u6570\u636E\n </button>\n</div>\n<div class=\"wrap\" cdkDropListGroup>\n <div class=\"sider\">\n <div class=\"sider-title\">\n \u6570\u636E\u6E90\n <button\n nz-button\n nzType=\"link\"\n class=\"btn-text\"\n (click)=\"changeData($event)\"\n >\n \u66F4\u6539\u6570\u636E\u6E90\n </button>\n </div>\n <hr />\n <div *ngIf=\"dataSourceItem\">\n <div class=\"sider-title\">\n <h4>\u5B57\u6BB5</h4>\n <button\n nz-button\n nzType=\"link\"\n class=\"btn-text\"\n style=\"font-size: 1rem\"\n >\n <i class=\"icon-time\"></i>\n </button>\n </div>\n <p>\n <i\n style=\"font-size: 1rem; color: deepskyblue; margin-right: 1rem\"\n class=\"icon-DuoJiLuQu\"\n ></i>\n {{ dataSourceItem.title }}\n </p>\n <div\n cdkDropList\n [cdkDropListData]=\"dataSourceItem.columns\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <div\n class=\"data-list\"\n *ngFor=\"let item of dataSourceItem.columns\"\n cdkDrag\n (cdkDragStarted)=\"dragStarted()\"\n (cdkDragEnded)=\"dragEnded()\"\n >\n <i class=\"icon-Edit03\"></i>{{ item.title }}\n </div>\n </div>\n </div>\n </div>\n <div class=\"main\">\n <div\n id=\"row\"\n class=\"main-list\"\n [ngClass]=\"isLight ? 'main-list-hover' : ''\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n [cdkDropListData]=\"term.row\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <div class=\"title\">\u7EF4\u5EA6</div>\n <!--\u7EF4\u5EA6\uFF08\u884C\uFF09 -->\n <div\n *ngFor=\"let item of term.row; let i = index\"\n cdkDrag\n class=\"drag-list\"\n (mouseenter)=\"hover(item, 'on')\"\n (mouseleave)=\"hover(item, 'off')\"\n >\n <div nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\">\n <i class=\"icon-KT-Down\"></i>\n <span>{{ item.title }}</span>\n </div>\n <i\n [ngClass]=\"item.closeBtn == 'on' ? 'on' : 'off'\"\n (click)=\"closeLabel(term.row, i)\"\n class=\"icon-KT-Close\"\n ></i>\n </div>\n </div>\n\n <div\n id=\"target\"\n class=\"main-list\"\n [ngClass]=\"isLight ? 'main-list-hover' : ''\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n [cdkDropListData]=\"term.target\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <div class=\"title\">\u6307\u6807</div>\n <div\n *ngFor=\"let item of term.target; let i = index\"\n cdkDrag\n class=\"drag-list target-list\"\n (mouseenter)=\"hover(item, 'on')\"\n (mouseleave)=\"hover(item, 'off')\"\n >\n <div nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\">\n <i class=\"icon-FenGeXian\"></i>\n <span>{{ item.title }}</span>\n </div>\n <i\n [ngClass]=\"item.closeBtn == 'on' ? 'on' : 'off'\"\n (click)=\"closeLabel(term.target, i)\"\n class=\"icon-KT-Close\"\n ></i>\n </div>\n </div>\n\n <div\n id=\"condition\"\n class=\"main-list\"\n [ngClass]=\"isLight ? 'main-list-hover' : ''\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n [cdkDropListData]=\"term.condition\"\n (cdkDropListDropped)=\"drop($event)\"\n >\n <div class=\"title\">\u8FC7\u6EE4\u6761\u4EF6</div>\n <div\n *ngFor=\"let item of term.condition; let i = index\"\n cdkDrag\n class=\"drag-list condition-list\"\n (mouseenter)=\"hover(item, 'on')\"\n (mouseleave)=\"hover(item, 'off')\"\n >\n <div nz-dropdown nzTrigger=\"click\" [nzDropdownMenu]=\"menu\">\n <i class=\"icon-FenGeXian\"></i>\n <span>{{ item.title }}</span>\n </div>\n <i\n [ngClass]=\"item.closeBtn == 'on' ? 'on' : 'off'\"\n (click)=\"closeLabel(term.condition, i)\"\n class=\"icon-KT-Close\"\n ></i>\n </div>\n </div>\n <div class=\"echarts-wrap\">\n <nz-empty\n [nzNotFoundContent]=\"contentTpl\"\n *ngIf=\"\n term.row.length <= 0 || term.target.length <= 0 || !chartCondition\n \"\n >\n <ng-template #contentTpl>\n <p *ngIf=\"term.row.length <= 0 || term.target.length <= 0\">\n \u8BF7\u9009\u62E9\u7EF4\u5EA6\u548C\u6307\u6807\n </p>\n <p *ngIf=\"!chartCondition\">\u8BF7\u9009\u62E9\u53F3\u4FA7\u56FE\u6807\u7C7B\u578B</p>\n </ng-template>\n </nz-empty>\n <div *ngIf=\"chartOptions\" style=\"height: 600px\">\n <echart-dom\n [option]=\"chartOptions\"\n (echartClick)=\"echartClickHandler($event)\"\n ></echart-dom>\n </div>\n </div>\n </div>\n <div class=\"right\">\n <echart-options-dom\n [colorList]=\"colorList\"\n [echartsList]=\"echartsList\"\n [(chartCondition)]=\"chartCondition\"\n (echartOptionsChange)=\"getEchartOptions($event)\"\n (echartShapeChange)=\"getEchartShape($event)\"\n ></echart-options-dom>\n </div>\n</div>\n\n<nz-dropdown-menu #menu=\"nzDropdownMenu\">\n <ul nz-menu nzSelectable>\n <li nz-menu-item>1st menu item</li>\n <li nz-menu-item>2nd menu item</li>\n <li nz-menu-item>3rd menu item</li>\n </ul>\n</nz-dropdown-menu>\n",
styles: [":host .header{height:60px;display:flex;justify-content:flex-end;align-items:flex-end}:host .wrap{background:#f4f6f9;display:flex;height:calc(100% - 60px)}:host .wrap .sider{padding:10px 0 0 15px;width:250px;border-right:1px solid #e9e9e9}:host .wrap .sider .btn-text{color:#0db3a6}:host .wrap .sider .data-list{cursor:pointer;font-size:12px;padding:10px 0;display:flex;flex-direction:row;align-items:center;box-sizing:border-box}:host .wrap .sider ul li{list-style:none;cursor:pointer;height:26px;line-height:26px}:host .wrap .sider .sider-title{display:flex;justify-content:space-between;align-items:baseline}:host .wrap .main{padding:10px 15px;flex-grow:1}:host .wrap .main ul li{list-style:none}:host .wrap .main .main-list{line-height:34px;background:#fff;position:relative;margin-bottom:10px;border:1px dashed #d9d9d9;border-radius:3px;display:flex;flex-direction:row;align-items:center}:host .wrap .main .main-list .title{display:inline-block;width:80px}:host .wrap .main .main-list .drag-list{cursor:pointer;border-radius:100px;color:#fff;background:#0db3a6;height:24px;line-height:24px;padding:0 10px 0 6px;margin:0 3px}:host .wrap .main .main-list .drag-list span{padding:0 4px}:host .wrap .main .main-list .drag-list .on{opacity:1}:host .wrap .main .main-list .drag-list .off{opacity:0}:host .wrap .main .main-list .target-list{background:#00bfff}:host .wrap .main .main-list .condition-list{background:#7fffd4}:host .wrap .main .echarts-wrap p{text-align:center}:host .wrap .main .main-list-hover{background-color:rgba(212,242,231,.4);border:1px dashed #0ff}:host .wrap .right{width:300px;padding-right:15px}.cdk-drag-preview{display:inline-block;box-sizing:border-box;background-color:#fff;width:80px;overflow:hidden;border-radius:4px;box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}:host ::ng-deep hr{border:none;border-bottom:1px solid #eee}:host ::ng-deep .ant-select{width:100%}:host ::ng-deep .ant-dropdown-trigger{display:inline-block}"]
}] }
];
/** @nocollapse */
BoardComponent.ctorParameters = () => [
{ type: NzMessageService },
{ type: NzModalService }
];
BoardComponent.propDecorators = {
colorList: [{ type: Input }],
echartsList: [{ type: Input }],
dataSourceItem: [{ type: Input }],
term: [{ type: Input }],
chartCondition: [{ type: Input }],
chartOptions: [{ type: Input }],
changeDataSource: [{ type: Output }],
changeEchartsParams: [{ type: Output }]
};
if (false) {
/** @type {?} */
BoardComponent.prototype.colorList;
/** @type {?} */
BoardComponent.prototype.echartsList;
/** @type {?} */
BoardComponent.prototype.dataSourceItem;
/** @type {?} */
BoardComponent.prototype.term;
/** @type {?} */
BoardComponent.prototype.chartCondition;
/** @type {?} */
BoardComponent.prototype.chartOptions;
/** @type {?} */
BoardComponent.prototype.changeDataSource;
/** @type {?} */
BoardComponent.prototype.changeEchartsParams;
/** @type {?} */
BoardComponent.prototype.isLight;
/** @type {?} */
BoardComponent.prototype.finalObj;
/**
* @type {?}
* @private
*/
BoardComponent.prototype.message;
/**
* @type {?}
* @private
*/
BoardComponent.prototype.modalService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGtyZS1mb3JtL2FiYy9zcmMvbGliL2JvYXJkLyIsInNvdXJjZXMiOlsiYm9hcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxNQUFNLEVBQ04sWUFBWSxHQUliLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxlQUFlLEVBQ2YsYUFBYSxHQUNkLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBV3JELE1BQU0sT0FBTyxjQUFjOzs7OztJQWF6QixZQUNVLE9BQXlCLEVBQ3pCLFlBQTRCO1FBRDVCLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQ3pCLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQVA1QixxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3RDLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbkQsWUFBTyxHQUFHLEtBQUssQ0FBQztJQUtiLENBQUM7Ozs7SUFFSixRQUFRLEtBQUksQ0FBQzs7Ozs7SUFFYixXQUFXLENBQUMsT0FBWTtRQUN0QixLQUFLLE1BQU0sUUFBUSxJQUFJLE9BQU8sRUFBRTs7a0JBQ3hCLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQzlCLElBQUksUUFBUSxLQUFLLE1BQU0sRUFBRTtnQkFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxFQUFFO29CQUNwRSxJQUFJLENBQUMsSUFBSSxHQUFHO3dCQUNWLEdBQUcsRUFBRSxFQUFFO3dCQUNQLE1BQU0sRUFBRSxFQUFFO3dCQUNW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SUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ2hCLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQzs7Ozs7SUFFRCxrQkFBa0IsQ0FBQyxDQUFNO1FBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7OztZQWpKRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLG1oTEFBcUM7O2FBRXRDOzs7O1lBWFEsZ0JBQWdCO1lBQ2hCLGNBQWM7Ozt3QkFZcEIsS0FBSzswQkFDTCxLQUFLOzZCQUNMLEtBQUs7bUJBQ0wsS0FBSzs2QkFDTCxLQUFLOzJCQUNMLEtBQUs7K0JBRUwsTUFBTTtrQ0FDTixNQUFNOzs7O0lBUlAsbUNBQXdCOztJQUN4QixxQ0FBMEI7O0lBQzFCLHdDQUE2Qjs7SUFDN0IsOEJBQW1COztJQUNuQix3Q0FBNkI7O0lBQzdCLHNDQUFvQzs7SUFFcEMsMENBQWdEOztJQUNoRCw2Q0FBbUQ7O0lBRW5ELGlDQUFnQjs7SUFDaEIsa0NBQWE7Ozs7O0lBRVgsaUNBQWlDOzs7OztJQUNqQyxzQ0FBb0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkNoYW5nZXMsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIENka0RyYWdEcm9wLFxuICBtb3ZlSXRlbUluQXJyYXksXG4gIGNvcHlBcnJheUl0ZW0sXG59IGZyb20gXCJAYW5ndWxhci9jZGsvZHJhZy1kcm9wXCI7XG5pbXBvcnQgeyBOek1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvbWVzc2FnZVwiO1xuaW1wb3J0IHsgTnpNb2RhbFNlcnZpY2UgfSBmcm9tIFwibmctem9ycm8tYW50ZC9tb2RhbFwiO1xuaW1wb3J0ICogYXMgZWNoYXJ0cyBmcm9tIFwiZWNoYXJ0c1wiO1xuaW1wb3J0IHsgRUNoYXJ0T3B0aW9uIH0gZnJvbSBcImVjaGFydHNcIjtcblxuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJkZW1vLWJvYXJkXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vYm9hcmQuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2JvYXJkLmNvbXBvbmVudC5sZXNzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBCb2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgY29sb3JMaXN0OiBhbnk7XG4gIEBJbnB1dCgpIGVjaGFydHNMaXN0OiBhbnk7XG4gIEBJbnB1dCgpIGRhdGFTb3VyY2VJdGVtOiBhbnk7XG4gIEBJbnB1dCgpIHRlcm06IGFueTtcbiAgQElucHV0KCkgY2hhcnRDb25kaXRpb246IGFueTtcbiAgQElucHV0KCkgY2hhcnRPcHRpb25zOiBFQ2hhcnRPcHRpb247XG5cbiAgQE91dHB1dCgpIGNoYW5nZURhdGFTb3VyY2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBjaGFuZ2VFY2hhcnRzUGFyYW1zID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGlzTGlnaHQgPSBmYWxzZTtcbiAgZmluYWxPYmo6IHt9O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1lc3NhZ2U6IE56TWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE56TW9kYWxTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogYW55KSB7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBjaGFuZ2VzKSB7XG4gICAgICBjb25zdCBjaG5nID0gY2hhbmdlc1twcm9wTmFtZV07XG4gICAgICBpZiAocHJvcE5hbWUgPT09IFwidGVybVwiKSB7XG4gICAgICAgIGlmICghY2huZy5jdXJyZW50VmFsdWUgfHwgSlNPTi5zdHJpbmdpZnkoY2huZy5jdXJyZW50VmFsdWUpID09PSBcInt9XCIpIHtcbiAgICAgICAgICB0aGlzLnRlcm0gPSB7XG4gICAgICAgICAgICByb3c6IFtdLFxuICAgICAgICAgICAgdGFyZ2V0OiBbXSxcbiAgICAgICAgICAgIGNvbmRpdGlvbjogW10sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BOYW1lID09PSBcImNoYXJ0T3B0aW9uc1wiKSB7XG4gICAgICAgIGlmIChjaG5nLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICB0aGlzLmVjaGFydHNMaXN0ID0gdGhpcy5jaGFydE9wdGlvbnMuZGF0YXNldFtcInNvdXJjZVwiXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNoYXJ0T3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZWRpdENoYXJ0T3B0aW9ucyhlOiBhbnkpIHtcbiAgICB0aGlzLmNoYXJ0T3B0aW9ucyA9IGU7XG4gICAgaWYgKHRoaXMuZWNoYXJ0c0xpc3QubGVuZ3RoID4gMCkge1xuICAgICAgKHRoaXMuY2hhcnRPcHRpb25zW1wic2VyaWVzXCJdIGFzIGFueSkuc3BsaWNlKFxuICAgICAgICAxLFxuICAgICAgICAodGhpcy5jaGFydE9wdGlvbnNbXCJzZXJpZXNcIl0gYXMgYW55KS5sZW5ndGggLSAxXG4gICAgICApO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVjaGFydHNMaXN0WzBdLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5jaGFydE9wdGlvbnNbXCJzZXJpZXNcIl0pIHtcbiAgICAgICAgICB0aGlzLmNoYXJ0T3B0aW9uc1tcInNlcmllc1wiXS5wdXNoKHRoaXMuY2hhcnRPcHRpb25zW1wic2VyaWVzXCJdWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldEVjaGFydFNoYXBlKGU6IGFueSkge1xuICAgIHRoaXMuZWRpdENoYXJ0T3B0aW9ucyhlLmNoYXJ0T3B0aW9uKTtcbiAgICBpZiAodGhpcy5lY2hhcnRzTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuY2hhcnRPcHRpb25zLCB7XG4gICAgICAgIGRhdGFzZXQ6IHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMuZWNoYXJ0c0xpc3QsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jaGFydE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNoYXJ0T3B0aW9ucyk7XG4gIH1cblxuICBnZXRFY2hhcnRPcHRpb25zKGU6IGFueSkge1xuICAgIHRoaXMuZWRpdENoYXJ0T3B0aW9ucyhlKTtcbiAgICB0aGlzLmNoYXJ0T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2hhcnRPcHRpb25zKTtcbiAgfVxuXG4gIGRyb3AoZXZlbnQ6IENka0RyYWdEcm9wPHN0cmluZ1tdPikge1xuICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lciA9PT0gZXZlbnQuY29udGFpbmVyKSB7XG4gICAgICBtb3ZlSXRlbUluQXJyYXkoXG4gICAgICAgIGV2ZW50LmNvbnRhaW5lci5kYXRhLFxuICAgICAgICBldmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgICBldmVudC5jdXJyZW50SW5kZXhcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBpZHggPSBldmVudC5jb250YWluZXIuZGF0YS5pbmRleE9mKFxuICAgICAgICBldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhW2V2ZW50LnByZXZpb3VzSW5kZXhdXG4gICAgICApO1xuXG4gICAgICBpZiAoaWR4ICE9IC0xKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZS5jcmVhdGUoXCJlcnJvclwiLCBcIuagh+etvuS4jeiDvemHjeWkjVwiKTtcbiAgICAgICAgcmV0dXJuOyAvL2lmIGl0ZW0gZXhpc3RcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmNvbnRhaW5lci5pZCA9PSBcInJvd1wiICYmIHRoaXMudGVybS5yb3cubGVuZ3RoID4gMSkge1xuICAgICAgICB0aGlzLm1lc3NhZ2UuY3JlYXRlKFwiZXJyb3JcIiwgXCLnu7TluqbkuI3og73otoXov4cy5LiqXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvcHlBcnJheUl0ZW0oXG4gICAgICAgIGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmRhdGEsXG4gICAgICAgIGV2ZW50LmNvbnRhaW5lci5kYXRhLFxuICAgICAgICBldmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgICBldmVudC5jdXJyZW50SW5kZXhcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuY2hhbmdlRWNoYXJ0c1BhcmFtcy5lbWl0KHRoaXMudGVybSk7XG4gICAgfVxuICB9XG5cbiAgZHJhZ1N0YXJ0ZWQoKSB7XG4gICAgdGhpcy5pc0xpZ2h0ID0gdHJ1ZTtcbiAgfVxuICBkcmFnRW5kZWQoKSB7XG4gICAgdGhpcy5pc0xpZ2h0ID0gZmFsc2U7XG4gIH1cblxuICBob3ZlcihpdGVtOiBhbnksIHN0YXR1czogYW55KSB7XG4gICAgaXRlbS5jbG9zZUJ0biA9IHN0YXR1cztcbiAgfVxuXG4gIGNoYW5nZURhdGEoZTogYW55KSB7XG4gICAgdGhpcy5jaGFuZ2VEYXRhU291cmNlLmVtaXQoZSk7XG4gIH1cblxuICBjbG9zZUxhYmVsKGxpc3Q6IGFueSwgaTogYW55KSB7XG4gICAgbGlzdC5zcGxpY2UoaSwgMSk7XG4gIH1cblxuICBzYXZlRmluYWxPYmooKSB7XG4gICAgdGhpcy5maW5hbE9iaiA9IHtcbiAgICAgIGRhdGFTb3VyY2VUaXRsZTogdGhpcy5kYXRhU291cmNlSXRlbS50aXRsZSxcbiAgICAgIGVjaGFydHNMaXN0OiB0aGlzLmVjaGFydHNMaXN0LFxuICAgICAgY2hhcnRPcHRpb25zOiB0aGlzLmNoYXJ0T3B0aW9ucyxcbiAgICAgIGNoYXJ0Q29uZGl0aW9uOiB0aGlzLmNoYXJ0Q29uZGl0aW9uLFxuICAgICAgdGVybTogdGhpcy50ZXJtLFxuICAgIH07XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkodGhpcy5maW5hbE9iaikpO1xuICB9XG5cbiAgZWNoYXJ0Q2xpY2tIYW5kbGVyKGU6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKFwi5oiR5ZyoZWNoYXJ05LiK54K55LqG5ZWlXCIsIGUpO1xuICB9XG59XG4iXX0=