mmhglobal-dynamicform 1.2.3 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -2
- package/esm2020/lib/directives/fieldelement.directive.mjs +16 -0
- package/esm2020/lib/directives/scrollbar.theme.directive.mjs +43 -0
- package/esm2020/lib/mmhglobal-dynamicform.module.mjs +464 -0
- package/esm2020/lib/services/main.service.mjs +752 -0
- package/esm2020/lib/services/zcomponent.debug.service.mjs +621 -0
- package/esm2020/lib/services/zcomponent.service.mjs +81 -0
- package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +265 -0
- package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +67 -0
- package/esm2020/lib/uicontent/uicontent.component.mjs +41 -0
- package/esm2020/lib/uiheader/uiheader.component.mjs +66 -0
- package/esm2020/lib/uimenubutton/uimenubutton.component.mjs +35 -0
- package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +37 -0
- package/{esm2015/lib/uipage/uipage.component.js → esm2020/lib/uipage/uipage.component.mjs} +12 -13
- package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +41 -0
- package/esm2020/lib/zbullet/zbullet.component.mjs +74 -0
- package/esm2020/lib/zbuttons/zbuttons.component.mjs +171 -0
- package/esm2020/lib/zcard/zcard.component.mjs +72 -0
- package/esm2020/lib/zchart/zchart.component.mjs +201 -0
- package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +166 -0
- package/esm2020/lib/zchip/zchip.component.mjs +121 -0
- package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +169 -0
- package/esm2020/lib/zcodeeditor/zcodeeditor.pipe.mjs +60 -0
- package/esm2020/lib/zdaterange/zdaterange.component.mjs +70 -0
- package/esm2020/lib/zdatetime/dateParser.pipe.mjs +30 -0
- package/esm2020/lib/zdatetime/zdatetime.component.mjs +285 -0
- package/esm2020/lib/zdiv/zdiv.component.mjs +50 -0
- package/esm2020/lib/zdiv/zdiv.pipe.mjs +31 -0
- package/esm2020/lib/zform/zform.component.mjs +147 -0
- package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +49 -0
- package/esm2020/lib/zgauge/zgauge.component.mjs +148 -0
- package/esm2020/lib/zgrid/date-range-cell-filter.component.mjs +135 -0
- package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +490 -0
- package/esm2020/lib/zgrid/zgrid.component.mjs +847 -0
- package/esm2020/lib/zgrid/zgrid.popup.anchor-target.directive.mjs +17 -0
- package/esm2020/lib/zimg/zimg.component.mjs +121 -0
- package/esm2020/lib/zkcard/zkcard.component.mjs +367 -0
- package/esm2020/lib/zlabel/zlabel.component.mjs +62 -0
- package/esm2020/lib/zmfb/zmfb.component.mjs +215 -0
- package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +120 -0
- package/esm2020/lib/zmodal/zmodal.component.mjs +125 -0
- package/esm2020/lib/znumeric/znumeric.component.mjs +119 -0
- package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +352 -0
- package/esm2020/lib/zquerybuilder/zquerybuilder.component.mjs +204 -0
- package/esm2020/lib/zreport/zreport.component.mjs +105 -0
- package/esm2020/lib/zreport/zreport.config.mjs +117 -0
- package/esm2020/lib/zscheduler/zscheduler.component.mjs +267 -0
- package/{esm2015/lib/zscheduler/zscheduler.toolbar.component.js → esm2020/lib/zscheduler/zscheduler.toolbar.component.mjs} +55 -19
- package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +577 -0
- package/esm2020/lib/zselectmultiple/zselectmultiple.directive.mjs +35 -0
- package/esm2020/lib/ztab/ztab.component.mjs +187 -0
- package/esm2020/lib/ztab/ztab.pipe.mjs +26 -0
- package/esm2020/lib/ztext/ztext.component.mjs +297 -0
- package/esm2020/lib/ztextarea/ztextarea.component.mjs +109 -0
- package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +57 -0
- package/esm2020/lib/ztree/ztree.component.mjs +380 -0
- package/esm2020/lib/ztreelist/ztreelist.component.mjs +544 -0
- package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +92 -0
- package/esm2020/lib/zudf/zudf.component.mjs +205 -0
- package/esm2020/lib/zunknown/zunknown.component.mjs +20 -0
- package/esm2020/lib/zupload/zupload.component.mjs +359 -0
- package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +216 -0
- package/esm2020/mmhglobal-dynamicform.mjs +5 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/mmhglobal-dynamicform.mjs +10790 -0
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -0
- package/fesm2020/mmhglobal-dynamicform.mjs +10779 -0
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -0
- package/lib/directives/fieldelement.directive.d.ts +3 -0
- package/lib/directives/scrollbar.theme.directive.d.ts +3 -0
- package/lib/mmhglobal-dynamicform.module.d.ts +92 -0
- package/lib/services/main.service.d.ts +3 -0
- package/lib/services/zcomponent.debug.service.d.ts +8 -5
- package/lib/services/zcomponent.service.d.ts +7 -2
- package/lib/uiactionbutton/uiactionbutton.component.d.ts +3 -0
- package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +3 -0
- package/lib/uicontent/uicontent.component.d.ts +3 -0
- package/lib/uiheader/uiheader.component.d.ts +3 -0
- package/lib/uimenubutton/uimenubutton.component.d.ts +3 -0
- package/lib/uimenucontent/uimenucontent.component.d.ts +3 -0
- package/lib/uipage/uipage.component.d.ts +3 -0
- package/lib/uivalidationmessage/uivalidationmessage.component.d.ts +3 -0
- package/lib/zbullet/zbullet.component.d.ts +3 -0
- package/lib/zbuttons/zbuttons.component.d.ts +3 -0
- package/lib/zcard/zcard.component.d.ts +3 -0
- package/lib/zchart/zchart.component.d.ts +3 -0
- package/lib/zcheckbox/zcheckbox.component.d.ts +3 -0
- package/lib/zchip/zchip.component.d.ts +3 -0
- package/lib/zcodeeditor/zcodeeditor.component.d.ts +3 -0
- package/lib/zcodeeditor/zcodeeditor.pipe.d.ts +3 -0
- package/lib/zdaterange/zdaterange.component.d.ts +3 -0
- package/lib/zdatetime/dateParser.pipe.d.ts +3 -0
- package/lib/zdatetime/zdatetime.component.d.ts +3 -0
- package/lib/zdiv/zdiv.component.d.ts +3 -0
- package/lib/zdiv/zdiv.pipe.d.ts +3 -0
- package/lib/zform/zform.component.d.ts +3 -0
- package/lib/zformcontrol/zformcontrol.component.d.ts +3 -0
- package/lib/zgauge/zgauge.component.d.ts +3 -0
- package/lib/zgrid/date-range-cell-filter.component.d.ts +3 -0
- package/lib/zgrid/zgrid.binding.directive.d.ts +3 -0
- package/lib/zgrid/zgrid.component.d.ts +4 -1
- package/lib/zgrid/zgrid.popup.anchor-target.directive.d.ts +3 -0
- package/lib/zimg/zimg.component.d.ts +3 -0
- package/lib/zkcard/zkcard.component.d.ts +3 -0
- package/lib/zlabel/zlabel.component.d.ts +3 -0
- package/lib/zmfb/zmfb.component.d.ts +3 -0
- package/lib/zmodal/zmodal-mobile.component.d.ts +3 -0
- package/lib/zmodal/zmodal.component.d.ts +3 -0
- package/lib/znumeric/znumeric.component.d.ts +3 -0
- package/lib/zpostselectinput/zpostselectinput.component.d.ts +3 -0
- package/lib/zquerybuilder/zquerybuilder.component.d.ts +3 -0
- package/lib/zreport/zreport.component.d.ts +3 -0
- package/lib/zreport/zreport.config.d.ts +3 -0
- package/lib/zscheduler/zscheduler.component.d.ts +3 -0
- package/lib/zscheduler/zscheduler.toolbar.component.d.ts +3 -0
- package/lib/zselectmultiple/zselectmultiple.component.d.ts +3 -0
- package/lib/zselectmultiple/zselectmultiple.directive.d.ts +3 -0
- package/lib/ztab/ztab.component.d.ts +3 -0
- package/lib/ztab/ztab.pipe.d.ts +3 -0
- package/lib/ztext/ztext.component.d.ts +3 -0
- package/lib/ztextarea/ztextarea.component.d.ts +3 -0
- package/lib/ztexteditor/ztexteditor.component.d.ts +3 -0
- package/lib/ztree/ztree.component.d.ts +3 -0
- package/lib/ztreelist/ztreelist.component.d.ts +3 -0
- package/lib/ztrendcard/ztrendcard.component.d.ts +3 -0
- package/lib/zudf/zudf.component.d.ts +3 -0
- package/lib/zunknown/zunknown.component.d.ts +3 -0
- package/lib/zupload/zupload.component.d.ts +3 -0
- package/lib/zworkflowbuttons/zworkflowbuttons.component.d.ts +3 -0
- package/mmhglobal-dynamicform.d.ts +1 -2
- package/package.json +20 -11
- package/bundles/mmhglobal-dynamicform.umd.js +0 -11360
- package/bundles/mmhglobal-dynamicform.umd.js.map +0 -1
- package/bundles/mmhglobal-dynamicform.umd.min.js +0 -16
- package/bundles/mmhglobal-dynamicform.umd.min.js.map +0 -1
- package/esm2015/lib/directives/fieldelement.directive.js +0 -15
- package/esm2015/lib/directives/scrollbar.theme.directive.js +0 -42
- package/esm2015/lib/mmhglobal-dynamicform.module.js +0 -314
- package/esm2015/lib/services/main.service.js +0 -766
- package/esm2015/lib/services/zcomponent.debug.service.js +0 -626
- package/esm2015/lib/services/zcomponent.service.js +0 -167
- package/esm2015/lib/uiactionbutton/uiactionbutton.component.js +0 -271
- package/esm2015/lib/uiappmenucontent/uiappmenucontent.component.js +0 -69
- package/esm2015/lib/uicontent/uicontent.component.js +0 -41
- package/esm2015/lib/uiheader/uiheader.component.js +0 -65
- package/esm2015/lib/uimenubutton/uimenubutton.component.js +0 -40
- package/esm2015/lib/uimenucontent/uimenucontent.component.js +0 -34
- package/esm2015/lib/uivalidationmessage/uivalidationmessage.component.js +0 -39
- package/esm2015/lib/zbullet/zbullet.component.js +0 -71
- package/esm2015/lib/zbuttons/zbuttons.component.js +0 -168
- package/esm2015/lib/zcard/zcard.component.js +0 -68
- package/esm2015/lib/zchart/zchart.component.js +0 -199
- package/esm2015/lib/zcheckbox/zcheckbox.component.js +0 -158
- package/esm2015/lib/zchip/zchip.component.js +0 -117
- package/esm2015/lib/zcodeeditor/zcodeeditor.component.js +0 -163
- package/esm2015/lib/zcodeeditor/zcodeeditor.pipe.js +0 -56
- package/esm2015/lib/zdaterange/zdaterange.component.js +0 -63
- package/esm2015/lib/zdatetime/dateParser.pipe.js +0 -26
- package/esm2015/lib/zdatetime/zdatetime.component.js +0 -279
- package/esm2015/lib/zdiv/zdiv.component.js +0 -48
- package/esm2015/lib/zdiv/zdiv.pipe.js +0 -27
- package/esm2015/lib/zform/zform.component.js +0 -148
- package/esm2015/lib/zformcontrol/zformcontrol.component.js +0 -49
- package/esm2015/lib/zgauge/zgauge.component.js +0 -146
- package/esm2015/lib/zgrid/date-range-cell-filter.component.js +0 -102
- package/esm2015/lib/zgrid/zgrid.binding.directive.js +0 -493
- package/esm2015/lib/zgrid/zgrid.component.js +0 -834
- package/esm2015/lib/zgrid/zgrid.popup.anchor-target.directive.js +0 -16
- package/esm2015/lib/zimg/zimg.component.js +0 -123
- package/esm2015/lib/zkcard/zkcard.component.js +0 -372
- package/esm2015/lib/zlabel/zlabel.component.js +0 -59
- package/esm2015/lib/zmfb/zmfb.component.js +0 -215
- package/esm2015/lib/zmodal/zmodal-mobile.component.js +0 -119
- package/esm2015/lib/zmodal/zmodal.component.js +0 -130
- package/esm2015/lib/znumeric/znumeric.component.js +0 -114
- package/esm2015/lib/zpostselectinput/zpostselectinput.component.js +0 -345
- package/esm2015/lib/zquerybuilder/zquerybuilder.component.js +0 -196
- package/esm2015/lib/zreport/zreport.component.js +0 -104
- package/esm2015/lib/zreport/zreport.config.js +0 -115
- package/esm2015/lib/zscheduler/zscheduler.component.js +0 -268
- package/esm2015/lib/zselectmultiple/zselectmultiple.component.js +0 -565
- package/esm2015/lib/zselectmultiple/zselectmultiple.directive.js +0 -28
- package/esm2015/lib/ztab/ztab.component.js +0 -180
- package/esm2015/lib/ztab/ztab.pipe.js +0 -22
- package/esm2015/lib/ztext/ztext.component.js +0 -286
- package/esm2015/lib/ztextarea/ztextarea.component.js +0 -104
- package/esm2015/lib/ztexteditor/ztexteditor.component.js +0 -52
- package/esm2015/lib/ztree/ztree.component.js +0 -374
- package/esm2015/lib/ztreelist/ztreelist.component.js +0 -539
- package/esm2015/lib/ztrendcard/ztrendcard.component.js +0 -89
- package/esm2015/lib/zudf/zudf.component.js +0 -206
- package/esm2015/lib/zunknown/zunknown.component.js +0 -20
- package/esm2015/lib/zupload/zupload.component.js +0 -358
- package/esm2015/lib/zworkflowbuttons/zworkflowbuttons.component.js +0 -215
- package/esm2015/mmhglobal-dynamicform.js +0 -7
- package/fesm2015/mmhglobal-dynamicform.js +0 -10729
- package/fesm2015/mmhglobal-dynamicform.js.map +0 -1
- package/mmhglobal-dynamicform.metadata.json +0 -1
|
@@ -1,539 +0,0 @@
|
|
|
1
|
-
/********** Angular **********/
|
|
2
|
-
import { Component, Input } from "@angular/core";
|
|
3
|
-
import { FormControl, FormGroup, Validators } from "@angular/forms";
|
|
4
|
-
import { ActivatedRoute, Router } from '@angular/router';
|
|
5
|
-
/********** Ionic **********/
|
|
6
|
-
/********** Plugin **********/
|
|
7
|
-
import { of, forkJoin, Subject } from 'rxjs';
|
|
8
|
-
import { tap, switchMap } from 'rxjs/operators';
|
|
9
|
-
/********** Component & Service **********/
|
|
10
|
-
import { ZComponentHelper, ZComponentProperties, FieldService, WebApiService, AuthService } from "mmhglobal-zcore";
|
|
11
|
-
export class ZTreeListOptions {
|
|
12
|
-
constructor(sortable, resizable, filterable, reorderable, columnMenu, scrollable, refresh, autoBind, dataSource, dataBound, idField, parentIdField, columns, aggregate, pageAble) {
|
|
13
|
-
this.sortable = sortable;
|
|
14
|
-
this.resizable = resizable;
|
|
15
|
-
this.filterable = filterable;
|
|
16
|
-
this.reorderable = reorderable;
|
|
17
|
-
this.columnMenu = columnMenu;
|
|
18
|
-
this.scrollable = scrollable;
|
|
19
|
-
this.refresh = refresh;
|
|
20
|
-
this.autoBind = autoBind;
|
|
21
|
-
this.dataSource = dataSource;
|
|
22
|
-
this.dataBound = dataBound;
|
|
23
|
-
this.idField = idField;
|
|
24
|
-
this.parentIdField = parentIdField;
|
|
25
|
-
this.columns = columns;
|
|
26
|
-
this.aggregate = aggregate;
|
|
27
|
-
this.pageAble = pageAble;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
export class ZtreelistComponent {
|
|
31
|
-
constructor(fieldService, webapiService, activatedRoute, router, authService) {
|
|
32
|
-
this.fieldService = fieldService;
|
|
33
|
-
this.webapiService = webapiService;
|
|
34
|
-
this.activatedRoute = activatedRoute;
|
|
35
|
-
this.router = router;
|
|
36
|
-
this.authService = authService;
|
|
37
|
-
// @ViewChild(ZTreeListBindingDirective, { static: false }) ztreelist: ZTreeListBindingDirective;
|
|
38
|
-
this.ztreelist = null;
|
|
39
|
-
this.idField = "Id";
|
|
40
|
-
this.parentIdField = "ParentId";
|
|
41
|
-
this.options = new ZTreeListOptions();
|
|
42
|
-
this.componentProperties = new ZComponentProperties();
|
|
43
|
-
this.pageSize = 20;
|
|
44
|
-
this.inlineEditedFormGroups = [];
|
|
45
|
-
this.treelistSubject = new Subject();
|
|
46
|
-
this.setEnable = (status) => {
|
|
47
|
-
const fc = this.group.form.controls[this.data.Value];
|
|
48
|
-
status ? fc.enable() : fc.disable();
|
|
49
|
-
this.componentProperties.isReadOnly = !status;
|
|
50
|
-
};
|
|
51
|
-
this.setVisible = (status) => {
|
|
52
|
-
this.componentProperties.isVisible = status;
|
|
53
|
-
this.data.Visible = status;
|
|
54
|
-
};
|
|
55
|
-
this.setRequire = (status) => {
|
|
56
|
-
this.componentProperties.isRequired = status;
|
|
57
|
-
ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, Validators.required);
|
|
58
|
-
};
|
|
59
|
-
this.setData = (gData) => {
|
|
60
|
-
this.dataSource = gData;
|
|
61
|
-
this.createFormControlsForInlineEdit(gData);
|
|
62
|
-
if (gData && this.inlineEditedFormGroups && this.inlineEditedFormGroups.length > 0) {
|
|
63
|
-
gData.forEach(data => {
|
|
64
|
-
const fgVal = this.inlineEditedFormGroups.find(i => i[this.idField] === data[this.idField]);
|
|
65
|
-
const fg = fgVal.Fg;
|
|
66
|
-
if (fgVal && fg) {
|
|
67
|
-
const ke = Object.keys(fg.controls);
|
|
68
|
-
Object.keys(fg.controls).forEach(k => {
|
|
69
|
-
const fc = fg.controls[k];
|
|
70
|
-
if (fc) {
|
|
71
|
-
fc.setValue(data[k]);
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
// ngAfterViewInit(): void {
|
|
80
|
-
// // this.ztreelist.setOptions({data: this.data, group: this.group});
|
|
81
|
-
// }
|
|
82
|
-
ngOnInit() {
|
|
83
|
-
ZComponentHelper.setComponentProperties(this);
|
|
84
|
-
ZComponentHelper.registerComponent(this);
|
|
85
|
-
this.widthReduce = this.data.WidthReduce || 60;
|
|
86
|
-
this.heightReduce = this.data.HeightReduce || 560;
|
|
87
|
-
this.pageSize = this.data.PageSize || 20;
|
|
88
|
-
if (!!this.data.Options) {
|
|
89
|
-
this.setLocalOptions();
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
this.setFieldElementOptions();
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
ngOnDestroy() {
|
|
96
|
-
// if (this.subscription) {
|
|
97
|
-
// this.subscription.unsubscribe();
|
|
98
|
-
// }
|
|
99
|
-
}
|
|
100
|
-
getGridStyle() {
|
|
101
|
-
// debugger;
|
|
102
|
-
return {
|
|
103
|
-
"height.px": this.getGridHeight(),
|
|
104
|
-
"width.px": window.innerWidth - this.widthReduce,
|
|
105
|
-
}; // "width.px": this.innerWidth - 35
|
|
106
|
-
}
|
|
107
|
-
getGridHeight() {
|
|
108
|
-
const h = window.innerHeight - this.heightReduce;
|
|
109
|
-
return h < 180 ? 180 : h;
|
|
110
|
-
}
|
|
111
|
-
isButtonHidden(col, cellContain) {
|
|
112
|
-
if (col.visible) {
|
|
113
|
-
return ZComponentHelper.getGroupEvalValue.call(this, col.visible, cellContain.viewItem.data);
|
|
114
|
-
}
|
|
115
|
-
if (!col.hiddenParam || col.hiddenValue === 'undefined') {
|
|
116
|
-
return false;
|
|
117
|
-
}
|
|
118
|
-
if (cellContain.viewItem.data[col.hiddenParam] === null) {
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
if (cellContain.viewItem.data[col.hiddenParam] === col.hiddenValue) {
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
buttonClick(button, cellContext) {
|
|
129
|
-
if (button.edit) {
|
|
130
|
-
button.edit(cellContext);
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
this.group.subject.next({
|
|
134
|
-
type: "buttonClick",
|
|
135
|
-
target: button.ClickEvent,
|
|
136
|
-
data: cellContext
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
onNavigateTo(event, colSetting, rowData, cellData) {
|
|
141
|
-
// debugger;
|
|
142
|
-
// const n = colSetting.navigateTo.replace('/:id', cellData);
|
|
143
|
-
event.stopPropagation();
|
|
144
|
-
this.group.subject.next({
|
|
145
|
-
type: 'zgrid-onNavigateTo',
|
|
146
|
-
target: colSetting.navigateTo,
|
|
147
|
-
data: cellData
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
isColumnsVisible(fieldExpr) {
|
|
151
|
-
if (fieldExpr !== false && !fieldExpr) {
|
|
152
|
-
return true;
|
|
153
|
-
}
|
|
154
|
-
const v = ZComponentHelper.getGroupEvalValue.call(this, fieldExpr);
|
|
155
|
-
return v;
|
|
156
|
-
}
|
|
157
|
-
setLocalOptions() {
|
|
158
|
-
const options = ZComponentHelper.getGroupValue(this.data.Options, this.group);
|
|
159
|
-
if (!options) {
|
|
160
|
-
console.warn("No initialise for Field.Options: ", this.data.Options);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
this.options = options;
|
|
164
|
-
this.options.idField = this.options.idField || this.idField;
|
|
165
|
-
this.options.parentIdField = this.options.parentIdField || this.parentIdField;
|
|
166
|
-
const _translationFullList = this.authService.SystemLocaleTranslation;
|
|
167
|
-
//debugger;
|
|
168
|
-
//const _translationFilteredList = _translationFullList ? _translationFullList.filter(x => x['ProjectName'] === projectName && x['ElementName'] === fieldName) : null;
|
|
169
|
-
//if (this.options.columns && )
|
|
170
|
-
//const translatedTitle = _translationFilteredList.find(x => x['PhraseKey'] === field.Name.toLowerCase());
|
|
171
|
-
//if (translatedTitle) {
|
|
172
|
-
// const _label = field.Label.toString().trim();
|
|
173
|
-
//}
|
|
174
|
-
if (this.options.dataSource &&
|
|
175
|
-
typeof this.options.dataSource === "string") {
|
|
176
|
-
if (this.options.dataSource.startsWith("group.")) {
|
|
177
|
-
this.dataSource = ZComponentHelper.getGroupValue(this.options.dataSource, this.group);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
console.error(this.data.Name + " - has invalid dataSource");
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
console.error(this.data.Name + " - dataSource property is not declared.");
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
setFieldElementOptions() {
|
|
188
|
-
this.options.sortable = true;
|
|
189
|
-
this.options.resizable = true;
|
|
190
|
-
this.options.filterable = true;
|
|
191
|
-
this.options.resizable = true;
|
|
192
|
-
this.options.columnMenu = this.data.DisableGridColumnMenu ? false : true;
|
|
193
|
-
this.options.scrollable = true;
|
|
194
|
-
this.options.idField = this.data["idField"] || this.idField;
|
|
195
|
-
this.options.parentIdField = this.data["parentIdField"] || this.parentIdField;
|
|
196
|
-
this.options.columns = [];
|
|
197
|
-
this.options.aggregate = [];
|
|
198
|
-
this.options.pageAble = this.data.PageSize ? true : false;
|
|
199
|
-
let zfields = [];
|
|
200
|
-
this.fieldService.getFormFieldCode(this.data["ColumnFieldCode"], "FormField", null, null).pipe(switchMap(fields => {
|
|
201
|
-
zfields = fields;
|
|
202
|
-
return this.getButtonsFromZButtons(fields);
|
|
203
|
-
}), tap((buttons) => {
|
|
204
|
-
this.setTreeListColumns(zfields, buttons);
|
|
205
|
-
}), switchMap(() => {
|
|
206
|
-
return this.getDataBinding();
|
|
207
|
-
}), tap(data => {
|
|
208
|
-
this.createFormControlsForInlineEdit(data);
|
|
209
|
-
})).subscribe(data => {
|
|
210
|
-
if (data) {
|
|
211
|
-
this.dataSource = data;
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
// const zbuttonFields = [] as Array<ZField>;
|
|
216
|
-
// fields.forEach(field => {
|
|
217
|
-
// if (field.Type === "zbuttons") {
|
|
218
|
-
// let fieldColVisible = field.gridColVisible;
|
|
219
|
-
// if (field.gridColVisible && field.gridColVisible.toString().startsWith('group.')) {
|
|
220
|
-
// // field.gridColVisible = ZComponentHelper.getGroupValue(field.gridColVisible.toString(), this.group);
|
|
221
|
-
// fieldColVisible = ZComponentHelper.getGroupValue(field.gridColVisible.toString(), this.group);
|
|
222
|
-
// }
|
|
223
|
-
// // if (field.gridColVisible === true) {
|
|
224
|
-
// if (fieldColVisible === true) {
|
|
225
|
-
// zbuttonFields.push(field);
|
|
226
|
-
// }
|
|
227
|
-
// }
|
|
228
|
-
// });
|
|
229
|
-
// if (zbuttonFields.length === 0) {
|
|
230
|
-
// return of([]);
|
|
231
|
-
// }
|
|
232
|
-
// zbuttonFields.forEach(zbuttonField => {
|
|
233
|
-
// zbuttonResult.push(
|
|
234
|
-
// this.fieldService.getFormFieldCode(zbuttonField.Value, "FormField", null, null).pipe(
|
|
235
|
-
// switchMap(buttons => {
|
|
236
|
-
// return of({ zbuttonField, buttons });
|
|
237
|
-
// }))
|
|
238
|
-
// );
|
|
239
|
-
// });
|
|
240
|
-
getButtonsFromZButtons(fields) {
|
|
241
|
-
const buttonCmd = [];
|
|
242
|
-
const zbuttonResult = [];
|
|
243
|
-
fields.forEach(field => {
|
|
244
|
-
if (field.Type === "zbuttons" && ZComponentHelper.getGroupValue(field.gridColVisible, this.group)) {
|
|
245
|
-
zbuttonResult.push(this.fieldService.getFormFieldCode(field.Value, "FormField", null, null).pipe(switchMap(buttons => {
|
|
246
|
-
return of({ field, buttons });
|
|
247
|
-
})));
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
if (zbuttonResult.length === 0) {
|
|
251
|
-
return of([]);
|
|
252
|
-
}
|
|
253
|
-
return forkJoin(zbuttonResult).pipe(tap(resp => {
|
|
254
|
-
resp.forEach(zbuttonsArray => zbuttonsArray["buttons"].forEach((button) => {
|
|
255
|
-
buttonCmd.push({
|
|
256
|
-
zbuttonsName: zbuttonsArray["field"].Value,
|
|
257
|
-
name: button.Value,
|
|
258
|
-
class: button.Class,
|
|
259
|
-
text: button.Label,
|
|
260
|
-
icon: button.Icon,
|
|
261
|
-
visible: button.Visible,
|
|
262
|
-
hiddenParam: button["hiddenParam"],
|
|
263
|
-
hiddenValue: button["hiddenValue"],
|
|
264
|
-
edit: button.edit,
|
|
265
|
-
ClickEvent: button.ClickEvent,
|
|
266
|
-
ShowLabel: button.ShowLabel,
|
|
267
|
-
color: button.Color
|
|
268
|
-
});
|
|
269
|
-
}));
|
|
270
|
-
}), switchMap(() => {
|
|
271
|
-
return of(buttonCmd);
|
|
272
|
-
}));
|
|
273
|
-
}
|
|
274
|
-
setTreeListColumns(fields, buttons) {
|
|
275
|
-
fields.forEach(field => {
|
|
276
|
-
if (Array.isArray(field.Value)) {
|
|
277
|
-
this.setTreeListColumns(field.Value, buttons);
|
|
278
|
-
}
|
|
279
|
-
if (ZComponentHelper.getGroupValue(field.gridColVisible, this.group) === true) {
|
|
280
|
-
if (field.Type === "zbuttons") {
|
|
281
|
-
this.insertCommand(field, buttons);
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
if (field.AggregateType && field.AggregateType !== "") {
|
|
285
|
-
let aggregatetitle = "";
|
|
286
|
-
if (field.AggregateType === "sum") {
|
|
287
|
-
aggregatetitle = "Total: ";
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
aggregatetitle = field.AggregateType + ": ";
|
|
291
|
-
}
|
|
292
|
-
this.insertFooterTemplateField(field, aggregatetitle);
|
|
293
|
-
this.options.aggregate.push({
|
|
294
|
-
field: field.Value,
|
|
295
|
-
aggregate: field.AggregateType
|
|
296
|
-
});
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
this.insertField(field);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
insertField(field) {
|
|
306
|
-
let colTitle = field.Name;
|
|
307
|
-
if (colTitle.toString().startsWith('group.')) {
|
|
308
|
-
colTitle = ZComponentHelper.getGroupValue(colTitle.toString(), this.group);
|
|
309
|
-
}
|
|
310
|
-
this.options.columns.push(Object.assign(field, {
|
|
311
|
-
field: field.Value,
|
|
312
|
-
title: colTitle,
|
|
313
|
-
width: field.width,
|
|
314
|
-
visible: true,
|
|
315
|
-
fieldType: field.Type,
|
|
316
|
-
navigateTo: field.NavigateTo,
|
|
317
|
-
command: null,
|
|
318
|
-
class: field.DivClass,
|
|
319
|
-
footerTemplate: false,
|
|
320
|
-
aggregateType: "",
|
|
321
|
-
aggregateTitle: "",
|
|
322
|
-
isEditableInGrid: field.IsEditableInGrid
|
|
323
|
-
}));
|
|
324
|
-
}
|
|
325
|
-
insertCommand(field, buttons) {
|
|
326
|
-
let colTitle = field.Name;
|
|
327
|
-
if (colTitle.toString().startsWith('group.')) {
|
|
328
|
-
colTitle = ZComponentHelper.getGroupValue(colTitle.toString(), this.group);
|
|
329
|
-
}
|
|
330
|
-
this.options.columns.push({
|
|
331
|
-
field: field.Name,
|
|
332
|
-
title: colTitle,
|
|
333
|
-
width: field.width,
|
|
334
|
-
visible: field.Visible,
|
|
335
|
-
fieldType: field.Type,
|
|
336
|
-
navigateTo: field.NavigateTo,
|
|
337
|
-
command: buttons.filter(x => x.zbuttonsName === field.Value),
|
|
338
|
-
class: field.DivClass,
|
|
339
|
-
footerTemplate: false,
|
|
340
|
-
aggregateType: "",
|
|
341
|
-
aggregateTitle: "",
|
|
342
|
-
isEditableInGrid: field.IsEditableInGrid
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
insertFooterTemplateField(field, aggregatetitle) {
|
|
346
|
-
let colTitle = field.Name;
|
|
347
|
-
if (colTitle.toString().startsWith('group.')) {
|
|
348
|
-
colTitle = ZComponentHelper.getGroupValue(colTitle.toString(), this.group);
|
|
349
|
-
}
|
|
350
|
-
this.options.columns.push({
|
|
351
|
-
field: field.Value,
|
|
352
|
-
title: colTitle,
|
|
353
|
-
width: field.width,
|
|
354
|
-
visible: true,
|
|
355
|
-
fieldType: field.Type,
|
|
356
|
-
navigateTo: field.NavigateTo,
|
|
357
|
-
command: null,
|
|
358
|
-
class: field.DivClass,
|
|
359
|
-
footerTemplate: true,
|
|
360
|
-
aggregateType: field.AggregateType,
|
|
361
|
-
aggregateTitle: aggregatetitle,
|
|
362
|
-
isEditableInGrid: field.IsEditableInGrid
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
getDataBinding() {
|
|
366
|
-
if (this.data.DataSource) {
|
|
367
|
-
return of(ZComponentHelper.getGroupValue(this.data.DataSource, this.group));
|
|
368
|
-
}
|
|
369
|
-
const resourceUrl = this.getResouceURL();
|
|
370
|
-
if (resourceUrl) {
|
|
371
|
-
return this.webapiService.getApi(resourceUrl, null, null, null, null, null, true);
|
|
372
|
-
}
|
|
373
|
-
return of([]);
|
|
374
|
-
}
|
|
375
|
-
getResouceURL() {
|
|
376
|
-
return ZComponentHelper.getGroupValue(this.data.ResourceURL, this.group);
|
|
377
|
-
}
|
|
378
|
-
cellClickHandler(event) {
|
|
379
|
-
if (!!this.data.DisableCellClickHandler) {
|
|
380
|
-
return;
|
|
381
|
-
}
|
|
382
|
-
console.log("cellClick event: ", event);
|
|
383
|
-
if (this.data.OnItemClick) {
|
|
384
|
-
const func = ZComponentHelper.getGroupEvalValue.call(this, this.data.OnItemClick);
|
|
385
|
-
if (typeof func === 'function') {
|
|
386
|
-
const callFunc = func.bind(this.group.ctrlScope);
|
|
387
|
-
callFunc(event);
|
|
388
|
-
}
|
|
389
|
-
return;
|
|
390
|
-
}
|
|
391
|
-
this.editModel(event.dataItem);
|
|
392
|
-
}
|
|
393
|
-
editModel(dataItem) {
|
|
394
|
-
if (this.data.EditClickURL) {
|
|
395
|
-
// TODO:
|
|
396
|
-
// debugger;
|
|
397
|
-
// this.router.navigate([this.data.EditClickURL, dataItem.Id]);
|
|
398
|
-
const colFields = ZComponentHelper.getGroupValue(this.data.ColumnFields, this.group);
|
|
399
|
-
this.group.subject.next({
|
|
400
|
-
type: "zgrid-cellClick",
|
|
401
|
-
target: this.data.EditClickURL,
|
|
402
|
-
data: dataItem,
|
|
403
|
-
columnFields$: colFields
|
|
404
|
-
});
|
|
405
|
-
}
|
|
406
|
-
else {
|
|
407
|
-
this.router.navigate([this.group.editModelURL, dataItem.Id, 'edit'], {
|
|
408
|
-
relativeTo: this.activatedRoute
|
|
409
|
-
});
|
|
410
|
-
// console.log('Path: ', this.activatedRoute['_routerState'].snapshot.url);
|
|
411
|
-
// const currentPath = this.activatedRoute['_routerState'].snapshot.url;
|
|
412
|
-
// this.router.navigate([currentPath + "/" + this.group.editModelURL, dataItem.Id]);
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
createFormControlsForInlineEdit(data) {
|
|
416
|
-
if (this.options.columns.find(c => c.isEditableInGrid) === undefined || !data) {
|
|
417
|
-
return;
|
|
418
|
-
}
|
|
419
|
-
this.inlineEditedFormGroups = [];
|
|
420
|
-
data.forEach(d => {
|
|
421
|
-
const items = {};
|
|
422
|
-
this.options.columns.forEach(c => {
|
|
423
|
-
items[c.field] = new FormControl(d[c.field]);
|
|
424
|
-
});
|
|
425
|
-
const formGroup = new FormGroup(items);
|
|
426
|
-
this.inlineEditedFormGroups.push({ Id: d[this.idField], Fg: formGroup });
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
getInlineField(value) {
|
|
430
|
-
return this.options.columns.find(x => x.Value === value);
|
|
431
|
-
}
|
|
432
|
-
getInlineForm(dataItem) {
|
|
433
|
-
return this.inlineEditedFormGroups.find(x => x.Id === dataItem[this.idField]).Fg;
|
|
434
|
-
}
|
|
435
|
-
isInlineEditColVisible(dataItem, column) {
|
|
436
|
-
const isVisible = dataItem[`${column.Value}_Visible`];
|
|
437
|
-
return !(isVisible === false);
|
|
438
|
-
}
|
|
439
|
-
getFormat(col) {
|
|
440
|
-
let format = "";
|
|
441
|
-
const formatArr = col.FormatOptions.split(".");
|
|
442
|
-
let dp = 0;
|
|
443
|
-
if (formatArr.length > 1) {
|
|
444
|
-
dp = formatArr[1].length;
|
|
445
|
-
}
|
|
446
|
-
if (dp !== 0) {
|
|
447
|
-
format = "1." + dp + "-" + dp;
|
|
448
|
-
}
|
|
449
|
-
return format;
|
|
450
|
-
}
|
|
451
|
-
setHeaderText(columnName, newHeaderTitle) {
|
|
452
|
-
const gridColumns = this.options.columns;
|
|
453
|
-
gridColumns.forEach((col) => {
|
|
454
|
-
if (col.Name === columnName || col.field === columnName) {
|
|
455
|
-
col.title = newHeaderTitle;
|
|
456
|
-
}
|
|
457
|
-
});
|
|
458
|
-
}
|
|
459
|
-
getColClass(dataItem, col) {
|
|
460
|
-
let ngClass = "gridCell ";
|
|
461
|
-
if (col.fieldType === 'number' || col.fieldType === 'currency' || col.fieldType === 'znumeric') {
|
|
462
|
-
ngClass += "rightAligned ";
|
|
463
|
-
}
|
|
464
|
-
if (dataItem[col.field + '_Class']) {
|
|
465
|
-
ngClass += dataItem[col.field + '_Class'] + " ";
|
|
466
|
-
}
|
|
467
|
-
if (col.Class) {
|
|
468
|
-
ngClass += col.Class + " ";
|
|
469
|
-
}
|
|
470
|
-
return ngClass;
|
|
471
|
-
}
|
|
472
|
-
setGridIsLoading(triggered) {
|
|
473
|
-
this.isLoading = triggered;
|
|
474
|
-
}
|
|
475
|
-
onFilterChange(event) {
|
|
476
|
-
if (this.ztreelist) {
|
|
477
|
-
// to be implement.
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
mapFilterOperator(operator) {
|
|
481
|
-
switch (operator) {
|
|
482
|
-
case "eq":
|
|
483
|
-
return "eq";
|
|
484
|
-
case "neq":
|
|
485
|
-
return "neq";
|
|
486
|
-
case "lt":
|
|
487
|
-
return "lt";
|
|
488
|
-
case "lte":
|
|
489
|
-
return "lte";
|
|
490
|
-
case "gt":
|
|
491
|
-
return "gt";
|
|
492
|
-
case "gte":
|
|
493
|
-
return "gte";
|
|
494
|
-
case "startswith":
|
|
495
|
-
return "startswith";
|
|
496
|
-
case "endswith":
|
|
497
|
-
return "endswith";
|
|
498
|
-
case "isnull":
|
|
499
|
-
return "isnull";
|
|
500
|
-
case "isnotnull":
|
|
501
|
-
return "isnotnull";
|
|
502
|
-
default:
|
|
503
|
-
return "==";
|
|
504
|
-
// eq, neq, isnull, isnotnull, endswith, startswith
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
filterable(value) {
|
|
508
|
-
if (value === false) {
|
|
509
|
-
return false;
|
|
510
|
-
}
|
|
511
|
-
return true;
|
|
512
|
-
}
|
|
513
|
-
sortable(value) {
|
|
514
|
-
if (value === false) {
|
|
515
|
-
return false;
|
|
516
|
-
}
|
|
517
|
-
return true;
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
ZtreelistComponent.decorators = [
|
|
521
|
-
{ type: Component, args: [{
|
|
522
|
-
selector: "app-ztreelist",
|
|
523
|
-
template: "<div *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\" style=\"margin: 10px 0 6px 0;\">\r\n <div *ngIf=\"data.Title\" class=\"treelistTitle\">{{data.Title}}</div>\r\n <kendo-treelist [kendoTreeListFlatBinding]=\"dataSource\" [ngStyle]=\"getGridStyle()\" [idField]=\"options.idField\" [parentIdField]=\"options.parentIdField\"\r\n (cellClick)=\"cellClickHandler($event)\"\r\n [sortable]=\"options.sortable\"\r\n [resizable]=\"options.resizable\"\r\n [filterable]=\"false\"\r\n [reorderable]=\"false\"\r\n [columnMenu]=\"options.columnMenu\"\r\n [scrollable]=\"options.scrollable\"\r\n [aggregate]=\"options.aggregate\"\r\n [pageable]=\"options.pageAble\"\r\n [pageSize]=\"data.PageSize\"\r\n [initiallyExpanded]=\"data.DefaultCollapse === false\"\r\n (filterChange)=\"onFilterChange($event)\"\r\n kendoTreeListExpandable\r\n treelist>\r\n\r\n <!--\r\n [filterable]=\"options.filterable\"\r\n [reorderable]=\"options.resizable\"\r\n -->\r\n <ng-container *ngFor=\"let col of options.columns; index as i\">\r\n <kendo-treelist-column *ngIf=\"!col.command\"\r\n [class]=\"col.class\"\r\n [expandable]=\"i===0\"\r\n [field]=\"col.field\"\r\n [title]=\"col.title || col.field\"\r\n [width]=\"col.width || 250\"\r\n [filterable]=\"filterable(col.enableFiltering)\"\r\n [sortable]=\"sortable(col.enableSorting)\"\r\n [hidden]=\"!isColumnsVisible(col.visible)\">\r\n <div [ngSwitch]=\"true\">\r\n <div *ngSwitchCase=\"col.fieldType === 'number'\r\n || col.fieldType === 'currency'\r\n || col.fieldType === 'znumeric'\">\r\n <ng-template kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-numeric-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"eq\">\r\n <kendo-filter-eq-operator></kendo-filter-eq-operator>\r\n <kendo-filter-neq-operator></kendo-filter-neq-operator>\r\n <kendo-filter-lt-operator></kendo-filter-lt-operator>\r\n <kendo-filter-lte-operator></kendo-filter-lte-operator>\r\n <kendo-filter-gt-operator></kendo-filter-gt-operator>\r\n <kendo-filter-gte-operator></kendo-filter-gte-operator>\r\n <kendo-filter-isnull-operator></kendo-filter-isnull-operator>\r\n <kendo-filter-isnotnull-operator></kendo-filter-isnotnull-operator>\r\n </kendo-treelist-numeric-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngSwitchCase=\"col.fieldType == 'zdate'\r\n || col.fieldType === 'zdatetime'\r\n || col.fieldType === 'zuidatetime'\">\r\n <div *ngIf=\"col.filterByDateRange === true\">\r\n <ng-template kendoTreeListFilterCellTemplate let-filter let-column=\"column\" operator=\"lte\">\r\n <date-range-filter-cell class=\"date-range-filter\"\r\n [filter]=\"filter\"\r\n [field]=\"col.field\">\r\n <kendo-treelist-filter-lt-operator></kendo-treelist-filter-lt-operator>\r\n <kendo-treelist-filter-lte-operator></kendo-treelist-filter-lte-operator>\r\n <kendo-treelist-filter-gt-operator></kendo-treelist-filter-gt-operator>\r\n <kendo-treelist-filter-gte-operator></kendo-treelist-filter-gte-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-filter-isnotnull-operator>\r\n </date-range-filter-cell>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"col.filterByDateRange === false\">\r\n <ng-template kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-date-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"lte\">\r\n <kendo-treelist-filter-lt-operator></kendo-treelist-filter-lt-operator>\r\n <kendo-treelist-filter-lte-operator></kendo-treelist-filter-lte-operator>\r\n <kendo-treelist-filter-gt-operator></kendo-treelist-filter-gt-operator>\r\n <kendo-treelist-filter-gte-operator></kendo-treelist-filter-gte-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-filter-isnotnull-operator>\r\n </kendo-treelist-date-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>\r\n <ng-template kendoTreeListFilterCellTemplate let-filter let-column=\"column\">\r\n <kendo-treelist-string-filter-cell [column]=\"column\" [filter]=\"filter\" operator=\"contains\">\r\n <kendo-treelist-filter-contains-operator></kendo-treelist-filter-contains-operator>\r\n <kendo-treelist-filter-eq-operator></kendo-treelist-filter-eq-operator>\r\n <kendo-treelist-filter-neq-operator></kendo-treelist-filter-neq-operator>\r\n <kendo-treelist-filter-startswith-operator></kendo-treelist-filter-startswith-operator>\r\n <kendo-treelist-filter-endswith-operator></kendo-treelist-filter-endswith-operator>\r\n <kendo-treelist-filter-isnull-operator></kendo-treelist-filter-isnull-operator>\r\n <kendo-treelist-filter-isnotnull-operator></kendo-treelist-filter-isnotnull-operator>\r\n </kendo-treelist-string-filter-cell>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <ng-template kendoTreeListCellTemplate let-dataItem let-rowIndex=\"rowIndex\" let-cellContext=\"cellContext\">\r\n <div style=\"margin: 7px 0;display: inline;\" [style.color]=\"(!!dataItem.Color ? [dataItem.Color] : 'black')\" *ngIf=\"!col.navigateTo && col.isEditableInGrid !== true\" [ngSwitch]=\"col.fieldType\" [ngClass]=\"getColClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'zdate'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zshortdate'\">\r\n {{ dataItem[col.field] | date: 'MMM yyyy' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zdatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'zuidatetime'\">\r\n {{ dataItem[col.field] | date: 'dd/MM/yyyy hh:mm:ss aa' }}\r\n </span>\r\n <span *ngSwitchCase=\"'number'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number }} </div>\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number: '1.2-2' }}</div>\r\n </span>\r\n <span *ngSwitchCase=\"'znumeric'\">\r\n <div style=\"text-align:right;\">{{ dataItem[col.field] | number: getFormat(col) }}</div>\r\n </span>\r\n <span *ngSwitchCase=\"'url'\" style=\"color: blue; cursor: pointer; text-decoration:underline;\">\r\n {{ dataItem[col.field] }}\r\n </span>\r\n <span *ngSwitchDefault>\r\n {{ dataItem[col.field]}}\r\n </span>\r\n </div>\r\n <div style=\"margin: 7px 0;display: inline;\" [style.color]=\"(!!dataItem.Color ? [dataItem.Color] : 'black')\" *ngIf=\"!col.navigateTo && col.isEditableInGrid === true && isInlineEditColVisible(dataItem, col)\" [ngSwitch]=\"col.fieldType\" [ngClass]=\"getColClass(dataItem, col)\">\r\n <span *ngSwitchCase=\"'checkbox'\">\r\n <app-zcheckbox style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(dataItem)\" (click)=\"buttonClick(col, cellContext)\"></app-zcheckbox>\r\n </span>\r\n <span *ngSwitchCase=\"'zuiselectmultiple'\">\r\n <app-zselectmultiple style=\"width: 100%;\" [data]=\"getInlineField(col.field)\" [group]=\"group\" [form]=\"getInlineForm(dataItem)\"></app-zselectmultiple>\r\n </span>\r\n <span *ngSwitchCase=\"'textarea'\">\r\n <app-ztextarea style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(dataItem)\"></app-ztextarea>\r\n </span>\r\n <span *ngSwitchCase=\"['zuidatetime','zdate','zdatetime','zshortdate'].includes(col.fieldType) ? col.fieldType : ''\">\r\n <app-zdatetime style=\"width: 100%;\" [data]=\"getInlineField(col.Value)\" [group]=\"group\" [form]=\"getInlineForm(dataItem)\"></app-zdatetime>\r\n </span>\r\n </div>\r\n <span *ngIf=\"!!col.navigateTo\" (click)=\"onNavigateTo($event, col, dataItem, dataItem[col.field])\">\r\n <ion-button color=\"light\" size=\"small\">\r\n {{ dataItem[col.field] }}\r\n <!-- <ion-icon slot= \"end\" name=\"arrow-forward\"></ion-icon> -->\r\n <fa-icon slot=\"end\" [icon]=\"'arrow-right'\"></fa-icon>\r\n </ion-button>\r\n </span> \r\n </ng-template>\r\n <ng-template *ngIf=\"col.footerTemplate\" kendoTreeListFooterTemplate let-aggregates=\"aggregates\">\r\n <div *ngIf=\"!col.navigateTo\" [ngSwitch]=\"col.fieldType\" [ngClass]=\"{'rightAligned': col.fieldType === 'number' || col.fieldType === 'currency'}\">\r\n <span *ngSwitchCase=\"'number'\">\r\n <b>\r\n {{ col.aggregateTitle | titlecase }} {{ aggregates[col.field][col.aggregateType] | number }}\r\n </b>\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n <b>\r\n {{ col.aggregateTitle | titlecase }} {{ aggregates[col.field][col.aggregateType] | number: '1.2-2' }}\r\n </b>\r\n </span>\r\n </div>\r\n </ng-template>\r\n </kendo-treelist-column>\r\n <kendo-treelist-command-column *ngIf=\"!!col.command\" [title]=\"col.title || col.field\" [width]=\"col.width || 250\">\r\n <ng-template kendoTreeListCellTemplate let-cellContext=\"cellContext\">\r\n <div [ngClass]=\"col.class\">\r\n <button *ngFor=\"let col2 of col.command; index as i\" type=\"button\" [kendoTreeListEditCommand]=\"cellContext\"\r\n [title]=\"col2.text\" (click)=\"buttonClick(col2, cellContext)\"\r\n [hidden]=\"isButtonHidden(col2, cellContext)\">\r\n <fa-icon [icon]=\"col2.icon\" [style.color]=\"(!!col2.color ? [col2.color] : 'black')\">\r\n </fa-icon>\r\n <div *ngIf=\"col2.ShowLabel === undefined || col2.ShowLabel\">{{col2.text}}</div>\r\n </button>\r\n </div>\r\n </ng-template>\r\n </kendo-treelist-command-column>\r\n </ng-container>\r\n\r\n <!-- <kendo-treelist-command-column width=\"140\">\r\n <ng-template kendoTreeListCellTemplate let-isNew=\"isNew\" let-cellContext=\"cellContext\">\r\n <button [kendoTreeListAddCommand]=\"cellContext\"\r\n icon=\"filter-add-expression\" title=\"Add Child\">\r\n </button>\r\n <button [kendoTreeListCancelCommand]=\"cellContext\"\r\n icon=\"cancel\" title=\"{{ isNew ? 'Discard changes' : 'Cancel' }}\">\r\n </button>\r\n </ng-template>\r\n </kendo-treelist-command-column> -->\r\n </kendo-treelist>\r\n</div>\r\n",
|
|
524
|
-
styles: [":host ::ng-deep kendo-treelist .k-grid-content{white-space:nowrap}:host ::ng-deep kendo-treelist .k-toolbar{background-color:#e3ecf8}:host ::ng-deep kendo-treelist .k-grid-add-row,:host ::ng-deep kendo-treelist .k-grid-footer,:host ::ng-deep kendo-treelist .k-grid-header,:host ::ng-deep kendo-treelist .k-grouping-header{background-color:#e3ecf8;font-weight:600}:host ::ng-deep kendo-treelist .k-button{border-radius:5px;box-shadow:0 2px 2px rgba(0,0,0,.1);background-color:#c9daf2}:host ::ng-deep kendo-treelist .k-grid-header .k-grid-filter:hover,:host ::ng-deep kendo-treelist .k-grid-header .k-header-column-menu:hover,:host ::ng-deep kendo-treelist .k-grid-header .k-hierarchy-cell .k-icon:hover{background-color:#c9daf2}:host ::ng-deep kendo-treelist .k-grid .k-grid-filter,:host ::ng-deep kendo-treelist .k-grid .k-header-column-menu,:host ::ng-deep kendo-treelist .k-grid .k-hierarchy-cell .k-icon{color:#132842}:host ::ng-deep kendo-treelist .k-dropdown .k-dropdown-wrap,:host ::ng-deep kendo-treelist .k-dropdowntree .k-dropdown-wrap{border-radius:2px;background-color:rgba(214,224,239,.5)}:host ::ng-deep kendo-treelist tr.k-alt{background-color:rgba(232,238,246,.5)}:host ::ng-deep kendo-treelist tbody tr.k-state-hover,:host ::ng-deep kendo-treelist tbody tr:hover{background-color:rgba(214,224,239,.5)}:host ::ng-deep kendo-treelist .k-pager-wrap{background-color:#e3ecf8}:host ::ng-deep kendo-treelist .k-pager-numbers .k-link.k-state-selected{color:#ff5e5b;background-color:rgba(255,94,91,.4)}:host ::ng-deep kendo-treelist .k-pager-numbers .k-link.k-state-hover,:host ::ng-deep kendo-treelist .k-pager-numbers .k-link:hover{color:#ff5e5b;background-color:rgba(255,94,91,.15)}.cellWrapText .gridCell{white-space:pre-line!important}.treelistTitle{margin:20px 10px 5px;font-size:18px;font-weight:700}.rightAligned{text-align:right;display:table!important;margin:0 0 0 auto!important}.centerAligned{text-align:center;display:table!important;margin:0 auto!important}.k-i-loading{position:absolute;top:100px;left:0;right:0;bottom:0;font-size:45px;background-color:hsla(0,0%,100%,.3);color:#0f4800}"]
|
|
525
|
-
},] }
|
|
526
|
-
];
|
|
527
|
-
ZtreelistComponent.ctorParameters = () => [
|
|
528
|
-
{ type: FieldService },
|
|
529
|
-
{ type: WebApiService },
|
|
530
|
-
{ type: ActivatedRoute },
|
|
531
|
-
{ type: Router },
|
|
532
|
-
{ type: AuthService }
|
|
533
|
-
];
|
|
534
|
-
ZtreelistComponent.propDecorators = {
|
|
535
|
-
data: [{ type: Input }],
|
|
536
|
-
group: [{ type: Input }],
|
|
537
|
-
form: [{ type: Input }]
|
|
538
|
-
};
|
|
539
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienRyZWVsaXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3p0cmVlbGlzdC96dHJlZWxpc3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpELDZCQUE2QjtBQUU3Qiw4QkFBOEI7QUFDOUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQTRCLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2hELDJDQUEyQztBQUMzQyxPQUFPLEVBQ08sZ0JBQWdCLEVBQ1osb0JBQW9CLEVBQUUsWUFBWSxFQUNsRCxhQUFhLEVBQUUsV0FBVyxFQUMzQixNQUFNLGlCQUFpQixDQUFDO0FBa0J6QixNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLFlBQ1MsUUFBa0IsRUFDbEIsU0FBbUIsRUFDbkIsVUFBb0IsRUFDcEIsV0FBcUIsRUFDckIsVUFBb0IsRUFDcEIsVUFBb0IsRUFDcEIsT0FBaUIsRUFDakIsUUFBa0IsRUFDbEIsVUFBbUIsRUFDbkIsU0FBZSxFQUNmLE9BQWdCLEVBQ2hCLGFBQXNCLEVBQ3RCLE9BQW9CLEVBQ3BCLFNBQWUsRUFDZixRQUFjO1FBZGQsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ25CLGVBQVUsR0FBVixVQUFVLENBQVU7UUFDcEIsZ0JBQVcs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SyxLQUFLO2dCQUNSLE9BQU8sS0FBSyxDQUFDO1lBQ2YsS0FBSyxJQUFJO2dCQUNQLE9BQU8sSUFBSSxDQUFDO1lBQ2QsS0FBSyxLQUFLO2dCQUNSLE9BQU8sS0FBSyxDQUFDO1lBQ2YsS0FBSyxJQUFJO2dCQUNQLE9BQU8sSUFBSSxDQUFDO1lBQ2QsS0FBSyxLQUFLO2dCQUNSLE9BQU8sS0FBSyxDQUFDO1lBQ2YsS0FBSyxZQUFZO2dCQUNmLE9BQU8sWUFBWSxDQUFDO1lBQ3RCLEtBQUssVUFBVTtnQkFDYixPQUFPLFVBQVUsQ0FBQztZQUNwQixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxRQUFRLENBQUM7WUFDbEIsS0FBSyxXQUFXO2dCQUNkLE9BQU8sV0FBVyxDQUFDO1lBQ3JCO2dCQUNFLE9BQU8sSUFBSSxDQUFDO1lBQ2QsbURBQW1EO1NBQ3BEO0lBQ0gsQ0FBQztJQUVNLFVBQVUsQ0FBQyxLQUFVO1FBQzFCLElBQUksS0FBSyxLQUFLLEtBQUssRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQVU7UUFDeEIsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFO1lBQ25CLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7OztZQXJrQkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxlQUFlO2dCQUN6QixzaFlBQXlDOzthQUUxQzs7O1lBNUN1QyxZQUFZO1lBQ2xELGFBQWE7WUFiTixjQUFjO1lBQUUsTUFBTTtZQWFkLFdBQVc7OzttQkE2Q3pCLEtBQUs7b0JBQ0wsS0FBSzttQkFDTCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uRGVzdHJveSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IG9mLCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRhcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBDZWxsQ2xpY2tFdmVudCB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLXRyZWVsaXN0JztcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHtcclxuICBaQ29tcG9uZW50LCBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQsXHJcbiAgWkZpZWxkLCBaR3JvdXAsIFpDb21wb25lbnRQcm9wZXJ0aWVzLCBGaWVsZFNlcnZpY2UsXHJcbiAgV2ViQXBpU2VydmljZSwgQXV0aFNlcnZpY2VcclxufSBmcm9tIFwibW1oZ2xvYmFsLXpjb3JlXCI7XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBaVHJlZUxpc3RDb2x1bW4ge1xyXG4gIGZpZWxkOiBzdHJpbmc7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICB3aWR0aDogbnVtYmVyO1xyXG4gIHZpc2libGU6IGJvb2xlYW4gfCBhbnk7XHJcbiAgZmllbGRUeXBlOiBzdHJpbmc7XHJcbiAgbmF2aWdhdGVUbzogc3RyaW5nO1xyXG4gIGNvbW1hbmQ6IGFueTtcclxuICBjbGFzczogYW55O1xyXG4gIGZvb3RlclRlbXBsYXRlOiBib29sZWFuO1xyXG4gIGFnZ3JlZ2F0ZVR5cGU6IHN0cmluZztcclxuICBhZ2dyZWdhdGVUaXRsZTogc3RyaW5nO1xyXG4gIGljb25Pbmx5PzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFpUcmVlTGlzdE9wdGlvbnMge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHNvcnRhYmxlPzogYm9vbGVhbixcclxuICAgIHB1YmxpYyByZXNpemFibGU/OiBib29sZWFuLFxyXG4gICAgcHVibGljIGZpbHRlcmFibGU/OiBib29sZWFuLFxyXG4gICAgcHVibGljIHJlb3JkZXJhYmxlPzogYm9vbGVhbixcclxuICAgIHB1YmxpYyBjb2x1bW5NZW51PzogYm9vbGVhbixcclxuICAgIHB1YmxpYyBzY3JvbGxhYmxlPzogYm9vbGVhbixcclxuICAgIHB1YmxpYyByZWZyZXNoPzogYm9vbGVhbixcclxuICAgIHB1YmxpYyBhdXRvQmluZD86IGJvb2xlYW4sXHJcbiAgICBwdWJsaWMgZGF0YVNvdXJjZT86IHN0cmluZyxcclxuICAgIHB1YmxpYyBkYXRhQm91bmQ/OiBhbnksXHJcbiAgICBwdWJsaWMgaWRGaWVsZD86IHN0cmluZyxcclxuICAgIHB1YmxpYyBwYXJlbnRJZEZpZWxkPzogc3RyaW5nLFxyXG4gICAgcHVibGljIGNvbHVtbnM/OiBBcnJheTxhbnk+LFxyXG4gICAgcHVibGljIGFnZ3JlZ2F0ZT86IGFueSxcclxuICAgIHB1YmxpYyBwYWdlQWJsZT86IGFueSxcclxuICApIHsgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtenRyZWVsaXN0XCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi96dHJlZWxpc3QuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4venRyZWVsaXN0LmNvbXBvbmVudC5zY3NzXCJdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgWnRyZWVsaXN0Q29tcG9uZW50IGltcGxlbWVudHMgWkNvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGRhdGE6IFpGaWVsZDtcclxuICBASW5wdXQoKSBncm91cDogWkdyb3VwO1xyXG4gIEBJbnB1dCgpIGZvcm06IEZvcm1Hcm91cDtcclxuICAvLyBAVmlld0NoaWxkKFpUcmVlTGlzdEJpbmRpbmdEaXJlY3RpdmUsIHsgc3RhdGljOiBmYWxzZSB9KSB6dHJlZWxpc3Q6IFpUcmVlTGlzdEJpbmRpbmdEaXJlY3RpdmU7XHJcbiAgenRyZWVsaXN0OiBhbnkgPSBudWxsO1xyXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGRhdGFTb3VyY2U6IHN0cmluZztcclxuICBpZEZpZWxkID0gXCJJZFwiO1xyXG4gIHBhcmVudElkRmllbGQgPSBcIlBhcmVudElkXCI7XHJcbiAgb3B0aW9uczogWlRyZWVMaXN0T3B0aW9ucyA9IG5ldyBaVHJlZUxpc3RPcHRpb25zKCk7XHJcbiAgY29tcG9uZW50UHJvcGVydGllcyA9IG5ldyBaQ29tcG9uZW50UHJvcGVydGllcygpO1xyXG4gIGZpZWxkZ3JpZENvbFZpc2libGU6IGFueVtdO1xyXG4gIHBhZ2VTaXplID0gMjA7XHJcbiAgaW5saW5lRWRpdGVkRm9ybUdyb3VwczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIGlzTG9hZGluZzogYm9vbGVhbjtcclxuICB0cmVlbGlzdFN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICAvLyB0cmVlbGlzdFN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICAvLyBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICAvLyB6dHJlZWxpc3Q6IGFueSA9IG51bGw7XHJcbiAgLy8gY29sdW1uczogYW55W107XHJcblxyXG4gIHByaXZhdGUgd2lkdGhSZWR1Y2U6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBoZWlnaHRSZWR1Y2U6IG51bWJlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB3ZWJhcGlTZXJ2aWNlOiBXZWJBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UpIHsgfVxyXG4gIC8vIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAvLyAgIC8vIHRoaXMuenRyZWVsaXN0LnNldE9wdGlvbnMoe2RhdGE6IHRoaXMuZGF0YSwgZ3JvdXA6IHRoaXMuZ3JvdXB9KTtcclxuICAvLyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRDb21wb25lbnRQcm9wZXJ0aWVzKHRoaXMpO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5yZWdpc3RlckNvbXBvbmVudCh0aGlzKTtcclxuXHJcbiAgICB0aGlzLndpZHRoUmVkdWNlID0gdGhpcy5kYXRhLldpZHRoUmVkdWNlIHx8IDYwO1xyXG4gICAgdGhpcy5oZWlnaHRSZWR1Y2UgPSB0aGlzLmRhdGEuSGVpZ2h0UmVkdWNlIHx8IDU2MDtcclxuICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLmRhdGEuUGFnZVNpemUgfHwgMjA7XHJcbiAgICBpZiAoISF0aGlzLmRhdGEuT3B0aW9ucykge1xyXG4gICAgICB0aGlzLnNldExvY2FsT3B0aW9ucygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXRGaWVsZEVsZW1lbnRPcHRpb25zKCk7XHJcbiAgICB9XHJcbiAgICAgXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgLy8gICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgZ2V0R3JpZFN0eWxlKCkge1xyXG4gICAgLy8gZGVidWdnZXI7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBcImhlaWdodC5weFwiOiB0aGlzLmdldEdyaWRIZWlnaHQoKSwgLy8gd2luZG93LmlubmVySGVpZ2h0IC0gdGhpcy5oZWlnaHRSZWR1Y2UsIC8vIDQ1MCxcclxuICAgICAgXCJ3aWR0aC5weFwiOiB3aW5kb3cuaW5uZXJXaWR0aCAtIHRoaXMud2lkdGhSZWR1Y2UsXHJcbiAgICB9OyAvLyBcIndpZHRoLnB4XCI6IHRoaXMuaW5uZXJXaWR0aCAtIDM1XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEdyaWRIZWlnaHQoKSB7XHJcbiAgICBjb25zdCBoID0gd2luZG93LmlubmVySGVpZ2h0IC0gdGhpcy5oZWlnaHRSZWR1Y2U7XHJcbiAgICByZXR1cm4gaCA8IDE4MCA/IDE4MCA6IGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RW5hYmxlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgY29uc3QgZmMgPSB0aGlzLmdyb3VwLmZvcm0uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgIHN0YXR1cyA/IGZjLmVuYWJsZSgpIDogZmMuZGlzYWJsZSgpO1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkgPSAhc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlID0gc3RhdHVzO1xyXG4gICAgdGhpcy5kYXRhLlZpc2libGUgPSBzdGF0dXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UmVxdWlyZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1JlcXVpcmVkID0gc3RhdHVzO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5jaGFuZ2VWYWxpZGF0b3Ioc3RhdHVzLCB0aGlzLmdyb3VwLCB0aGlzLmRhdGEuVmFsdWUsIHRoaXMuY29tcG9uZW50UHJvcGVydGllcywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGF0YSA9IChnRGF0YTogYW55KSA9PiB7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBnRGF0YTtcclxuICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzRm9ySW5saW5lRWRpdChnRGF0YSk7XHJcbiAgICBpZiAoZ0RhdGEgJiYgdGhpcy5pbmxpbmVFZGl0ZWRGb3JtR3JvdXBzICYmIHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3Vwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGdEYXRhLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmdWYWwgPSB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMuZmluZChpID0+IGlbdGhpcy5pZEZpZWxkXSA9PT0gZGF0YVt0aGlzLmlkRmllbGRdKTtcclxuICAgICAgICBjb25zdCBmZyA9IGZnVmFsLkZnO1xyXG4gICAgICAgIGlmIChmZ1ZhbCAmJiBmZykge1xyXG4gICAgICAgICAgY29uc3Qga2UgPSBPYmplY3Qua2V5cyhmZy5jb250cm9scyk7XHJcbiAgICAgICAgICBPYmplY3Qua2V5cyhmZy5jb250cm9scykuZm9yRWFjaChrID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmMgPSBmZy5jb250cm9sc1trXTtcclxuICAgICAgICAgICAgaWYgKGZjKSB7XHJcbiAgICAgICAgICAgICAgZmMuc2V0VmFsdWUoZGF0YVtrXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNCdXR0b25IaWRkZW4oY29sOiBhbnksIGNlbGxDb250YWluOiBhbnkpIHtcclxuICAgIGlmIChjb2wudmlzaWJsZSkge1xyXG4gICAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIGNvbC52aXNpYmxlLCBjZWxsQ29udGFpbi52aWV3SXRlbS5kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbC5oaWRkZW5QYXJhbSB8fCBjb2wuaGlkZGVuVmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2VsbENvbnRhaW4udmlld0l0ZW0uZGF0YVtjb2wuaGlkZGVuUGFyYW1dID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjZWxsQ29udGFpbi52aWV3SXRlbS5kYXRhW2NvbC5oaWRkZW5QYXJhbV0gPT09IGNvbC5oaWRkZW5WYWx1ZSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7IHJldHVybiBmYWxzZTsgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGJ1dHRvbkNsaWNrKGJ1dHRvbjogYW55LCBjZWxsQ29udGV4dDogYW55KSB7XHJcbiAgICBpZiAoYnV0dG9uLmVkaXQpIHtcclxuICAgICAgYnV0dG9uLmVkaXQoY2VsbENvbnRleHQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiYnV0dG9uQ2xpY2tcIixcclxuICAgICAgICB0YXJnZXQ6IGJ1dHRvbi5DbGlja0V2ZW50LFxyXG4gICAgICAgIGRhdGE6IGNlbGxDb250ZXh0XHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk5hdmlnYXRlVG8oZXZlbnQ6IGFueSwgY29sU2V0dGluZzogYW55LCByb3dEYXRhOiBhbnksIGNlbGxEYXRhOiBzdHJpbmcpIHtcclxuICAgIC8vIGRlYnVnZ2VyO1xyXG4gICAgLy8gY29uc3QgbiA9IGNvbFNldHRpbmcubmF2aWdhdGVUby5yZXBsYWNlKCcvOmlkJywgY2VsbERhdGEpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgIHR5cGU6ICd6Z3JpZC1vbk5hdmlnYXRlVG8nLFxyXG4gICAgICB0YXJnZXQ6IGNvbFNldHRpbmcubmF2aWdhdGVUbyxcclxuICAgICAgZGF0YTogY2VsbERhdGFcclxuICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0NvbHVtbnNWaXNpYmxlKGZpZWxkRXhwcikge1xyXG4gICAgaWYgKGZpZWxkRXhwciAhPT0gZmFsc2UgJiYgIWZpZWxkRXhwcikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHYgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgZmllbGRFeHByKTtcclxuICAgIHJldHVybiB2O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRMb2NhbE9wdGlvbnMoKSB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBaVHJlZUxpc3RPcHRpb25zID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICB0aGlzLmRhdGEuT3B0aW9ucyxcclxuICAgICAgdGhpcy5ncm91cFxyXG4gICAgKTtcclxuICAgIGlmICghb3B0aW9ucykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJObyBpbml0aWFsaXNlIGZvciBGaWVsZC5PcHRpb25zOiBcIiwgdGhpcy5kYXRhLk9wdGlvbnMpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgdGhpcy5vcHRpb25zLmlkRmllbGQgPSB0aGlzLm9wdGlvbnMuaWRGaWVsZCB8fCB0aGlzLmlkRmllbGQ7XHJcbiAgICB0aGlzLm9wdGlvbnMucGFyZW50SWRGaWVsZCA9IHRoaXMub3B0aW9ucy5wYXJlbnRJZEZpZWxkIHx8IHRoaXMucGFyZW50SWRGaWVsZDtcclxuXHJcblxyXG4gICAgY29uc3QgX3RyYW5zbGF0aW9uRnVsbExpc3QgPSB0aGlzLmF1dGhTZXJ2aWNlLlN5c3RlbUxvY2FsZVRyYW5zbGF0aW9uO1xyXG4gICAgLy9kZWJ1Z2dlcjtcclxuICAgIC8vY29uc3QgX3RyYW5zbGF0aW9uRmlsdGVyZWRMaXN0ID0gX3RyYW5zbGF0aW9uRnVsbExpc3QgPyBfdHJhbnNsYXRpb25GdWxsTGlzdC5maWx0ZXIoeCA9PiB4WydQcm9qZWN0TmFtZSddID09PSBwcm9qZWN0TmFtZSAmJiB4WydFbGVtZW50TmFtZSddID09PSBmaWVsZE5hbWUpIDogbnVsbDtcclxuXHJcblxyXG4gICAgLy9pZiAodGhpcy5vcHRpb25zLmNvbHVtbnMgJiYgKVxyXG4gICAgLy9jb25zdCB0cmFuc2xhdGVkVGl0bGUgPSBfdHJhbnNsYXRpb25GaWx0ZXJlZExpc3QuZmluZCh4ID0+IHhbJ1BocmFzZUtleSddID09PSBmaWVsZC5OYW1lLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgLy9pZiAodHJhbnNsYXRlZFRpdGxlKSB7XHJcbiAgICAvLyAgY29uc3QgX2xhYmVsID0gZmllbGQuTGFiZWwudG9TdHJpbmcoKS50cmltKCk7XHJcbiAgICAvL31cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5kYXRhU291cmNlICYmXHJcbiAgICAgIHR5cGVvZiB0aGlzLm9wdGlvbnMuZGF0YVNvdXJjZSA9PT0gXCJzdHJpbmdcIlxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGF0YVNvdXJjZS5zdGFydHNXaXRoKFwiZ3JvdXAuXCIpKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKHRoaXMub3B0aW9ucy5kYXRhU291cmNlLCB0aGlzLmdyb3VwKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKHRoaXMuZGF0YS5OYW1lICsgXCIgLSBoYXMgaW52YWxpZCBkYXRhU291cmNlXCIpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKHRoaXMuZGF0YS5OYW1lICsgXCIgLSBkYXRhU291cmNlIHByb3BlcnR5IGlzIG5vdCBkZWNsYXJlZC5cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZpZWxkRWxlbWVudE9wdGlvbnMoKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMuc29ydGFibGUgPSB0cnVlO1xyXG4gICAgdGhpcy5vcHRpb25zLnJlc2l6YWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLm9wdGlvbnMuZmlsdGVyYWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLm9wdGlvbnMucmVzaXphYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMub3B0aW9ucy5jb2x1bW5NZW51ID0gdGhpcy5kYXRhLkRpc2FibGVHcmlkQ29sdW1uTWVudSA/IGZhbHNlIDogdHJ1ZTtcclxuICAgIHRoaXMub3B0aW9ucy5zY3JvbGxhYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMub3B0aW9ucy5pZEZpZWxkID0gdGhpcy5kYXRhW1wiaWRGaWVsZFwiXSB8fCB0aGlzLmlkRmllbGQ7XHJcbiAgICB0aGlzLm9wdGlvbnMucGFyZW50SWRGaWVsZCA9IHRoaXMuZGF0YVtcInBhcmVudElkRmllbGRcIl0gfHwgdGhpcy5wYXJlbnRJZEZpZWxkO1xyXG4gICAgdGhpcy5vcHRpb25zLmNvbHVtbnMgPSBbXTtcclxuICAgIHRoaXMub3B0aW9ucy5hZ2dyZWdhdGUgPSBbXTtcclxuICAgIHRoaXMub3B0aW9ucy5wYWdlQWJsZSA9IHRoaXMuZGF0YS5QYWdlU2l6ZSA/IHRydWUgOiBmYWxzZTtcclxuXHJcbiAgICBsZXQgemZpZWxkcyA9IFtdO1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZSh0aGlzLmRhdGFbXCJDb2x1bW5GaWVsZENvZGVcIl0sIFwiRm9ybUZpZWxkXCIsIG51bGwsIG51bGwpLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcChmaWVsZHMgPT4ge1xyXG4gICAgICAgIHpmaWVsZHMgPSBmaWVsZHM7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnV0dG9uc0Zyb21aQnV0dG9ucyhmaWVsZHMpO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChidXR0b25zKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRUcmVlTGlzdENvbHVtbnMoemZpZWxkcywgYnV0dG9ucyk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldERhdGFCaW5kaW5nKCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoZGF0YSA9PiB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbHNGb3JJbmxpbmVFZGl0KGRhdGEpO1xyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gZGF0YTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBjb25zdCB6YnV0dG9uRmllbGRzID0gW10gYXMgQXJyYXk8WkZpZWxkPjtcclxuICAvLyBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgLy8gICAgIGlmIChmaWVsZC5UeXBlID09PSBcInpidXR0b25zXCIpIHtcclxuICAvLyAgICAgICAgIGxldCBmaWVsZENvbFZpc2libGUgPSBmaWVsZC5ncmlkQ29sVmlzaWJsZTtcclxuICAvLyAgICAgICAgIGlmIChmaWVsZC5ncmlkQ29sVmlzaWJsZSAmJiBmaWVsZC5ncmlkQ29sVmlzaWJsZS50b1N0cmluZygpLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgLy8gICAgICAgICAgICAgLy8gZmllbGQuZ3JpZENvbFZpc2libGUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZmllbGQuZ3JpZENvbFZpc2libGUudG9TdHJpbmcoKSwgdGhpcy5ncm91cCk7XHJcbiAgLy8gICAgICAgICAgICAgZmllbGRDb2xWaXNpYmxlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGZpZWxkLmdyaWRDb2xWaXNpYmxlLnRvU3RyaW5nKCksIHRoaXMuZ3JvdXApO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgLy8gaWYgKGZpZWxkLmdyaWRDb2xWaXNpYmxlID09PSB0cnVlKSB7XHJcbiAgLy8gICAgICAgICBpZiAoZmllbGRDb2xWaXNpYmxlID09PSB0cnVlKSB7XHJcbiAgLy8gICAgICAgICAgICAgemJ1dHRvbkZpZWxkcy5wdXNoKGZpZWxkKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vIH0pO1xyXG5cclxuICAvLyBpZiAoemJ1dHRvbkZpZWxkcy5sZW5ndGggPT09IDApIHtcclxuICAvLyAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAvLyB9XHJcbiAgLy8gemJ1dHRvbkZpZWxkcy5mb3JFYWNoKHpidXR0b25GaWVsZCA9PiB7XHJcbiAgLy8gICAgIHpidXR0b25SZXN1bHQucHVzaChcclxuICAvLyAgICAgICAgIHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoemJ1dHRvbkZpZWxkLlZhbHVlLCBcIkZvcm1GaWVsZFwiLCBudWxsLCBudWxsKS5waXBlKFxyXG4gIC8vICAgICAgICAgICAgIHN3aXRjaE1hcChidXR0b25zID0+IHtcclxuICAvLyAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHsgemJ1dHRvbkZpZWxkLCBidXR0b25zIH0pO1xyXG4gIC8vICAgICAgICAgICAgIH0pKVxyXG4gIC8vICAgICApO1xyXG4gIC8vIH0pO1xyXG5cclxuICBwcml2YXRlIGdldEJ1dHRvbnNGcm9tWkJ1dHRvbnMoZmllbGRzOiBBcnJheTxaRmllbGQ+KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGJ1dHRvbkNtZCA9IFtdO1xyXG4gICAgY29uc3QgemJ1dHRvblJlc3VsdCA9IFtdO1xyXG4gICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICBpZiAoZmllbGQuVHlwZSA9PT0gXCJ6YnV0dG9uc1wiICYmIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShmaWVsZC5ncmlkQ29sVmlzaWJsZSBhcyBzdHJpbmcsIHRoaXMuZ3JvdXApKSB7XHJcbiAgICAgICAgemJ1dHRvblJlc3VsdC5wdXNoKFxyXG4gICAgICAgICAgdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShmaWVsZC5WYWx1ZSwgXCJGb3JtRmllbGRcIiwgbnVsbCwgbnVsbCkucGlwZShcclxuICAgICAgICAgICAgc3dpdGNoTWFwKGJ1dHRvbnMgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBvZih7IGZpZWxkLCBidXR0b25zIH0pO1xyXG4gICAgICAgICAgICB9KSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoemJ1dHRvblJlc3VsdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ya0pvaW4oemJ1dHRvblJlc3VsdCkucGlwZShcclxuICAgICAgdGFwKHJlc3AgPT4ge1xyXG4gICAgICAgIHJlc3AuZm9yRWFjaCh6YnV0dG9uc0FycmF5ID0+XHJcbiAgICAgICAgICB6YnV0dG9uc0FycmF5W1wiYnV0dG9uc1wiXS5mb3JFYWNoKChidXR0b246IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBidXR0b25DbWQucHVzaCh7XHJcbiAgICAgICAgICAgICAgemJ1dHRvbnNOYW1lOiB6YnV0dG9uc0FycmF5W1wiZmllbGRcIl0uVmFsdWUsXHJcbiAgICAgICAgICAgICAgbmFtZTogYnV0dG9uLlZhbHVlLFxyXG4gICAgICAgICAgICAgIGNsYXNzOiBidXR0b24uQ2xhc3MsXHJcbiAgICAgICAgICAgICAgdGV4dDogYnV0dG9uLkxhYmVsLFxyXG4gICAgICAgICAgICAgIGljb246IGJ1dHRvbi5JY29uLFxyXG4gICAgICAgICAgICAgIHZpc2libGU6IGJ1dHRvbi5WaXNpYmxlLFxyXG4gICAgICAgICAgICAgIGhpZGRlblBhcmFtOiBidXR0b25bXCJoaWRkZW5QYXJhbVwiXSxcclxuICAgICAgICAgICAgICBoaWRkZW5WYWx1ZTogYnV0dG9uW1wiaGlkZGVuVmFsdWVcIl0sXHJcbiAgICAgICAgICAgICAgZWRpdDogYnV0dG9uLmVkaXQsXHJcbiAgICAgICAgICAgICAgQ2xpY2tFdmVudDogYnV0dG9uLkNsaWNrRXZlbnQsXHJcbiAgICAgICAgICAgICAgU2hvd0xhYmVsOiBidXR0b24uU2hvd0xhYmVsLFxyXG4gICAgICAgICAgICAgIGNvbG9yOiBidXR0b24uQ29sb3JcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBvZihidXR0b25DbWQpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VHJlZUxpc3RDb2x1bW5zKGZpZWxkczogQXJyYXk8WkZpZWxkPiwgYnV0dG9uczogYW55KSB7XHJcbiAgICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkLlZhbHVlKSkge1xyXG4gICAgICAgIHRoaXMuc2V0VHJlZUxpc3RDb2x1bW5zKGZpZWxkLlZhbHVlLCBidXR0b25zKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGZpZWxkLmdyaWRDb2xWaXNpYmxlIGFzIHN0cmluZywgdGhpcy5ncm91cCkgPT09IHRydWUpIHtcclxuICAgICAgICBpZiAoZmllbGQuVHlwZSA9PT0gXCJ6YnV0dG9uc1wiKSB7XHJcbiAgICAgICAgICB0aGlzLmluc2VydENvbW1hbmQoZmllbGQsIGJ1dHRvbnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoZmllbGQuQWdncmVnYXRlVHlwZSAmJiBmaWVsZC5BZ2dyZWdhdGVUeXBlICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGxldCBhZ2dyZWdhdGV0aXRsZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5BZ2dyZWdhdGVUeXBlID09PSBcInN1bVwiKSB7XHJcbiAgICAgICAgICAgICAgYWdncmVnYXRldGl0bGUgPSBcIlRvdGFsOiBcIjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBhZ2dyZWdhdGV0aXRsZSA9IGZpZWxkLkFnZ3JlZ2F0ZVR5cGUgKyBcIjogXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5pbnNlcnRGb290ZXJUZW1wbGF0ZUZpZWxkKGZpZWxkLCBhZ2dyZWdhdGV0aXRsZSk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hZ2dyZWdhdGUucHVzaCh7XHJcbiAgICAgICAgICAgICAgZmllbGQ6IGZpZWxkLlZhbHVlLFxyXG4gICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogZmllbGQuQWdncmVnYXRlVHlwZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0RmllbGQoZmllbGQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluc2VydEZpZWxkKGZpZWxkOiBaRmllbGQpIHtcclxuICAgIGxldCBjb2xUaXRsZSA9IGZpZWxkLk5hbWU7XHJcbiAgICBpZiAoY29sVGl0bGUudG9TdHJpbmcoKS5zdGFydHNXaXRoKCdncm91cC4nKSkge1xyXG4gICAgICBjb2xUaXRsZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShjb2xUaXRsZS50b1N0cmluZygpLCB0aGlzLmdyb3VwKTtcclxuICAgIH1cclxuICAgIHRoaXMub3B0aW9ucy5jb2x1bW5zLnB1c2goXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oZmllbGQsIHtcclxuICAgICAgICBmaWVsZDogZmllbGQuVmFsdWUsXHJcbiAgICAgICAgdGl0bGU6IGNvbFRpdGxlLFxyXG4gICAgICAgIHdpZHRoOiBmaWVsZC53aWR0aCxcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGZpZWxkVHlwZTogZmllbGQuVHlwZSxcclxuICAgICAgICBuYXZpZ2F0ZVRvOiBmaWVsZC5OYXZpZ2F0ZVRvLFxyXG4gICAgICAgIGNvbW1hbmQ6IG51bGwsXHJcbiAgICAgICAgY2xhc3M6IGZpZWxkLkRpdkNsYXNzLFxyXG4gICAgICAgIGZvb3RlclRlbXBsYXRlOiBmYWxzZSxcclxuICAgICAgICBhZ2dyZWdhdGVUeXBlOiBcIlwiLFxyXG4gICAgICAgIGFnZ3JlZ2F0ZVRpdGxlOiBcIlwiLFxyXG4gICAgICAgIGlzRWRpdGFibGVJbkdyaWQ6IGZpZWxkLklzRWRpdGFibGVJbkdyaWRcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluc2VydENvbW1hbmQoZmllbGQ6IFpGaWVsZCwgYnV0dG9uczogYW55KSB7XHJcbiAgICBsZXQgY29sVGl0bGUgPSBmaWVsZC5OYW1lO1xyXG4gICAgaWYgKGNvbFRpdGxlLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgY29sVGl0bGUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoY29sVGl0bGUudG9TdHJpbmcoKSwgdGhpcy5ncm91cCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sdW1ucy5wdXNoKHtcclxuICAgICAgZmllbGQ6IGZpZWxkLk5hbWUsXHJcbiAgICAgIHRpdGxlOiBjb2xUaXRsZSxcclxuICAgICAgd2lkdGg6IGZpZWxkLndpZHRoLFxyXG4gICAgICB2aXNpYmxlOiBmaWVsZC5WaXNpYmxlLFxyXG4gICAgICBmaWVsZFR5cGU6IGZpZWxkLlR5cGUsXHJcbiAgICAgIG5hdmlnYXRlVG86IGZpZWxkLk5hdmlnYXRlVG8sXHJcbiAgICAgIGNvbW1hbmQ6IGJ1dHRvbnMuZmlsdGVyKHggPT4geC56YnV0dG9uc05hbWUgPT09IGZpZWxkLlZhbHVlKSxcclxuICAgICAgY2xhc3M6IGZpZWxkLkRpdkNsYXNzLFxyXG4gICAgICBmb290ZXJUZW1wbGF0ZTogZmFsc2UsXHJcbiAgICAgIGFnZ3JlZ2F0ZVR5cGU6IFwiXCIsXHJcbiAgICAgIGFnZ3JlZ2F0ZVRpdGxlOiBcIlwiLFxyXG4gICAgICBpc0VkaXRhYmxlSW5HcmlkOiBmaWVsZC5Jc0VkaXRhYmxlSW5HcmlkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5zZXJ0Rm9vdGVyVGVtcGxhdGVGaWVsZChmaWVsZDogWkZpZWxkLCBhZ2dyZWdhdGV0aXRsZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgY29sVGl0bGUgPSBmaWVsZC5OYW1lO1xyXG4gICAgaWYgKGNvbFRpdGxlLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgnZ3JvdXAuJykpIHtcclxuICAgICAgY29sVGl0bGUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoY29sVGl0bGUudG9TdHJpbmcoKSwgdGhpcy5ncm91cCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdGlvbnMuY29sdW1ucy5wdXNoKHtcclxuICAgICAgZmllbGQ6IGZpZWxkLlZhbHVlLFxyXG4gICAgICB0aXRsZTogY29sVGl0bGUsXHJcbiAgICAgIHdpZHRoOiBmaWVsZC53aWR0aCxcclxuICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgZmllbGRUeXBlOiBmaWVsZC5UeXBlLFxyXG4gICAgICBuYXZpZ2F0ZVRvOiBmaWVsZC5OYXZpZ2F0ZVRvLFxyXG4gICAgICBjb21tYW5kOiBudWxsLFxyXG4gICAgICBjbGFzczogZmllbGQuRGl2Q2xhc3MsXHJcbiAgICAgIGZvb3RlclRlbXBsYXRlOiB0cnVlLFxyXG4gICAgICBhZ2dyZWdhdGVUeXBlOiBmaWVsZC5BZ2dyZWdhdGVUeXBlLFxyXG4gICAgICBhZ2dyZWdhdGVUaXRsZTogYWdncmVnYXRldGl0bGUsXHJcbiAgICAgIGlzRWRpdGFibGVJbkdyaWQ6IGZpZWxkLklzRWRpdGFibGVJbkdyaWRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhQmluZGluZygpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5EYXRhU291cmNlKSB7XHJcbiAgICAgIHJldHVybiBvZihaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5kYXRhLkRhdGFTb3VyY2UsIHRoaXMuZ3JvdXApKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXNvdXJjZVVybCA9IHRoaXMuZ2V0UmVzb3VjZVVSTCgpO1xyXG4gICAgaWYgKHJlc291cmNlVXJsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLndlYmFwaVNlcnZpY2UuZ2V0QXBpKHJlc291cmNlVXJsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBvZihbXSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJlc291Y2VVUkwoKSB7XHJcbiAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKFxyXG4gICAgICB0aGlzLmRhdGEuUmVzb3VyY2VVUkwsXHJcbiAgICAgIHRoaXMuZ3JvdXBcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBjZWxsQ2xpY2tIYW5kbGVyKGV2ZW50OiBDZWxsQ2xpY2tFdmVudCkge1xyXG4gICAgaWYgKCEhdGhpcy5kYXRhLkRpc2FibGVDZWxsQ2xpY2tIYW5kbGVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLmxvZyhcImNlbGxDbGljayBldmVudDogXCIsIGV2ZW50KTtcclxuICAgIGlmICh0aGlzLmRhdGEuT25JdGVtQ2xpY2spIHtcclxuICAgICAgY29uc3QgZnVuYyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuT25JdGVtQ2xpY2spO1xyXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBjb25zdCBjYWxsRnVuYyA9IGZ1bmMuYmluZCh0aGlzLmdyb3VwLmN0cmxTY29wZSk7XHJcbiAgICAgICAgY2FsbEZ1bmMoZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVkaXRNb2RlbChldmVudC5kYXRhSXRlbSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVkaXRNb2RlbChkYXRhSXRlbTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLkVkaXRDbGlja1VSTCkge1xyXG4gICAgICAvLyBUT0RPOlxyXG4gICAgICAvLyBkZWJ1Z2dlcjtcclxuICAgICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuZGF0YS5FZGl0Q2xpY2tVUkwsIGRhdGFJdGVtLklkXSk7XHJcbiAgICAgIGNvbnN0IGNvbEZpZWxkcyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSh0aGlzLmRhdGEuQ29sdW1uRmllbGRzLCB0aGlzLmdyb3VwKTtcclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiemdyaWQtY2VsbENsaWNrXCIsXHJcbiAgICAgICAgdGFyZ2V0OiB0aGlzLmRhdGEuRWRpdENsaWNrVVJMLFxyXG4gICAgICAgIGRhdGE6IGRhdGFJdGVtLFxyXG4gICAgICAgIGNvbHVtbkZpZWxkcyQ6IGNvbEZpZWxkc1xyXG4gICAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5ncm91cC5lZGl0TW9kZWxVUkwsIGRhdGFJdGVtLklkLCAnZWRpdCddLCB7XHJcbiAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZVxyXG4gICAgICB9KTtcclxuICAgICAgLy8gY29uc29sZS5sb2coJ1BhdGg6ICcsIHRoaXMuYWN0aXZhdGVkUm91dGVbJ19yb3V0ZXJTdGF0ZSddLnNuYXBzaG90LnVybCk7XHJcbiAgICAgIC8vIGNvbnN0IGN1cnJlbnRQYXRoID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZVsnX3JvdXRlclN0YXRlJ10uc25hcHNob3QudXJsO1xyXG4gICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbY3VycmVudFBhdGggKyBcIi9cIiArIHRoaXMuZ3JvdXAuZWRpdE1vZGVsVVJMLCBkYXRhSXRlbS5JZF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtQ29udHJvbHNGb3JJbmxpbmVFZGl0KGRhdGE6IGFueSkge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb2x1bW5zLmZpbmQoYyA9PiBjLmlzRWRpdGFibGVJbkdyaWQpID09PSB1bmRlZmluZWQgfHwgIWRhdGEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5saW5lRWRpdGVkRm9ybUdyb3VwcyA9IFtdO1xyXG5cclxuICAgIGRhdGEuZm9yRWFjaChkID0+IHtcclxuICAgICAgY29uc3QgaXRlbXMgPSB7fTtcclxuICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuICAgICAgICBpdGVtc1tjLmZpZWxkXSA9IG5ldyBGb3JtQ29udHJvbChkW2MuZmllbGRdKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoaXRlbXMpO1xyXG4gICAgICB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMucHVzaCh7IElkOiBkW3RoaXMuaWRGaWVsZF0sIEZnOiBmb3JtR3JvdXAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJbmxpbmVGaWVsZCh2YWx1ZTogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbHVtbnMuZmluZCh4ID0+IHguVmFsdWUgPT09IHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJbmxpbmVGb3JtKGRhdGFJdGVtOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmlubGluZUVkaXRlZEZvcm1Hcm91cHMuZmluZCh4ID0+IHguSWQgPT09IGRhdGFJdGVtW3RoaXMuaWRGaWVsZF0pLkZnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSW5saW5lRWRpdENvbFZpc2libGUoZGF0YUl0ZW06IGFueSwgY29sdW1uOiBhbnkpIHtcclxuICAgIGNvbnN0IGlzVmlzaWJsZSA9IGRhdGFJdGVtW2Ake2NvbHVtbi5WYWx1ZX1fVmlzaWJsZWBdO1xyXG4gICAgcmV0dXJuICEoaXNWaXNpYmxlID09PSBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybWF0KGNvbDogYW55KSB7XHJcbiAgICBsZXQgZm9ybWF0ID0gXCJcIjtcclxuICAgIGNvbnN0IGZvcm1hdEFyciA9IGNvbC5Gb3JtYXRPcHRpb25zLnNwbGl0KFwiLlwiKVxyXG4gICAgbGV0IGRwID0gMDtcclxuXHJcbiAgICBpZiAoZm9ybWF0QXJyLmxlbmd0aCA+IDEpIHtcclxuICAgICAgZHAgPSBmb3JtYXRBcnJbMV0ubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkcCAhPT0gMCkge1xyXG4gICAgICBmb3JtYXQgPSBcIjEuXCIgKyBkcCArIFwiLVwiICsgZHA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcm1hdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRIZWFkZXJUZXh0KGNvbHVtbk5hbWU6IHN0cmluZywgbmV3SGVhZGVyVGl0bGU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZ3JpZENvbHVtbnMgPSB0aGlzLm9wdGlvbnMuY29sdW1ucztcclxuICAgIGdyaWRDb2x1bW5zLmZvckVhY2goKGNvbDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChjb2wuTmFtZSA9PT0gY29sdW1uTmFtZSB8fCBjb2wuZmllbGQgPT09IGNvbHVtbk5hbWUpIHtcclxuICAgICAgICBjb2wudGl0bGUgPSBuZXdIZWFkZXJUaXRsZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q29sQ2xhc3MoZGF0YUl0ZW06IGFueSwgY29sOiBhbnkpIHtcclxuICAgIGxldCBuZ0NsYXNzID0gXCJncmlkQ2VsbCBcIjtcclxuICAgIGlmIChjb2wuZmllbGRUeXBlID09PSAnbnVtYmVyJyB8fCBjb2wuZmllbGRUeXBlID09PSAnY3VycmVuY3knIHx8IGNvbC5maWVsZFR5cGUgPT09ICd6bnVtZXJpYycpIHtcclxuICAgICAgbmdDbGFzcyArPSBcInJpZ2h0QWxpZ25lZCBcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YUl0ZW1bY29sLmZpZWxkICsgJ19DbGFzcyddKSB7XHJcbiAgICAgIG5nQ2xhc3MgKz0gZGF0YUl0ZW1bY29sLmZpZWxkICsgJ19DbGFzcyddICsgXCIgXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbC5DbGFzcykge1xyXG4gICAgICBuZ0NsYXNzICs9IGNvbC5DbGFzcyArIFwiIFwiO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZ0NsYXNzO1xyXG4gIH1cclxuXHJcbiAgc2V0R3JpZElzTG9hZGluZyh0cmlnZ2VyZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJpZ2dlcmVkO1xyXG4gIH1cclxuXHJcbiAgb25GaWx0ZXJDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuenRyZWVsaXN0KSB7XHJcbiAgICAgIC8vIHRvIGJlIGltcGxlbWVudC5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFwRmlsdGVyT3BlcmF0b3Iob3BlcmF0b3I6IGFueSkge1xyXG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xyXG4gICAgICBjYXNlIFwiZXFcIjpcclxuICAgICAgICByZXR1cm4gXCJlcVwiO1xyXG4gICAgICBjYXNlIFwibmVxXCI6XHJcbiAgICAgICAgcmV0dXJuIFwibmVxXCI7XHJcbiAgICAgIGNhc2UgXCJsdFwiOlxyXG4gICAgICAgIHJldHVybiBcImx0XCI7XHJcbiAgICAgIGNhc2UgXCJsdGVcIjpcclxuICAgICAgICByZXR1cm4gXCJsdGVcIjtcclxuICAgICAgY2FzZSBcImd0XCI6XHJcbiAgICAgICAgcmV0dXJuIFwiZ3RcIjtcclxuICAgICAgY2FzZSBcImd0ZVwiOlxyXG4gICAgICAgIHJldHVybiBcImd0ZVwiO1xyXG4gICAgICBjYXNlIFwic3RhcnRzd2l0aFwiOlxyXG4gICAgICAgIHJldHVybiBcInN0YXJ0c3dpdGhcIjtcclxuICAgICAgY2FzZSBcImVuZHN3aXRoXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiZW5kc3dpdGhcIjtcclxuICAgICAgY2FzZSBcImlzbnVsbFwiOlxyXG4gICAgICAgIHJldHVybiBcImlzbnVsbFwiO1xyXG4gICAgICBjYXNlIFwiaXNub3RudWxsXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiaXNub3RudWxsXCI7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFwiPT1cIjtcclxuICAgICAgLy8gZXEsIG5lcSwgaXNudWxsLCBpc25vdG51bGwsIGVuZHN3aXRoLCBzdGFydHN3aXRoXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmlsdGVyYWJsZSh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNvcnRhYmxlKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|