mmhglobal-dynamicform 2.43.0 → 2.44.1
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 +58 -1
- package/esm2020/lib/embed-components/input-field-addons/input-field-addons.component.mjs +30 -6
- package/esm2020/lib/mmhglobal-dynamicform.module.mjs +17 -9
- package/esm2020/lib/zchip/zchip.component.mjs +36 -9
- package/esm2020/lib/zinput-container/zinput-container.component.mjs +14 -12
- package/esm2020/lib/zslider/zslider.component.mjs +181 -0
- package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +162 -42
- package/esm2020/lib/ztreelist/ztreelist.component.mjs +22 -3
- package/esm2020/lib/zudf/zudf.component.mjs +2 -1
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/mmhglobal-dynamicform.mjs +586 -208
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
- package/fesm2020/mmhglobal-dynamicform.mjs +576 -207
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
- package/lib/embed-components/input-field-addons/input-field-addons.component.d.ts +3 -0
- package/lib/mmhglobal-dynamicform.module.d.ts +42 -41
- package/lib/zchip/zchip.component.d.ts +8 -0
- package/lib/zinput-container/zinput-container.component.d.ts +1 -0
- package/lib/zslider/zslider.component.d.ts +39 -0
- package/lib/ztexteditor/ztexteditor.component.d.ts +20 -8
- package/lib/ztreelist/ztreelist.component.d.ts +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/********** Angular **********/
|
|
2
|
+
import { Component, Input } from '@angular/core';
|
|
3
|
+
/********** Component & Service **********/
|
|
4
|
+
import { InputFieldBase } from '../components/inputfieldbase.component';
|
|
5
|
+
import { ZComponentHelper } from "mmhglobal-zcore";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../services/zcomponent.service";
|
|
8
|
+
import * as i2 from "@progress/kendo-angular-inputs";
|
|
9
|
+
import * as i3 from "@angular/forms";
|
|
10
|
+
export class ZsliderComponent extends InputFieldBase {
|
|
11
|
+
constructor(componentService) {
|
|
12
|
+
super(componentService);
|
|
13
|
+
this.componentService = componentService;
|
|
14
|
+
this.inputMode = "decimal";
|
|
15
|
+
this.minValue = 0;
|
|
16
|
+
this.maxValue = 0;
|
|
17
|
+
this.smallStep = 1;
|
|
18
|
+
this.largeStep = 5;
|
|
19
|
+
this.tickPlacement = 'both';
|
|
20
|
+
this.slidervalue = 0;
|
|
21
|
+
}
|
|
22
|
+
get sliderData() {
|
|
23
|
+
return this.data;
|
|
24
|
+
}
|
|
25
|
+
ngOnInit() {
|
|
26
|
+
super.setupInnerField();
|
|
27
|
+
this.setInitPropertyValue();
|
|
28
|
+
// Wrap setRequire to re-add min/max validators after the base resets all validators via setValidators()
|
|
29
|
+
const originalSetRequire = this.setRequire;
|
|
30
|
+
this.setRequire = (status) => {
|
|
31
|
+
originalSetRequire(status);
|
|
32
|
+
this.addMinAndMaxValidator();
|
|
33
|
+
};
|
|
34
|
+
// Initialize FormControl disabled state programmatically (avoids [disabled] Angular warning)
|
|
35
|
+
this._cachedReadOnlyState = this.getReadOnlyState();
|
|
36
|
+
if (this._cachedReadOnlyState) {
|
|
37
|
+
this.form?.controls[this.data.Value]?.disable();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
ngDoCheck() {
|
|
41
|
+
const currentReadOnly = this.getReadOnlyState();
|
|
42
|
+
if (currentReadOnly !== this._cachedReadOnlyState) {
|
|
43
|
+
this._cachedReadOnlyState = currentReadOnly;
|
|
44
|
+
const fc = this.form?.controls[this.data.Value];
|
|
45
|
+
if (fc) {
|
|
46
|
+
currentReadOnly ? fc.disable() : fc.enable();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
ngOnDestroy() {
|
|
51
|
+
this.removeMinAndMaxValidator();
|
|
52
|
+
}
|
|
53
|
+
ngAfterViewInit() {
|
|
54
|
+
this.componentService.decrementComponentCounterForField(this.data);
|
|
55
|
+
}
|
|
56
|
+
getReadOnlyState() {
|
|
57
|
+
return !!this.componentProperties?.isReadOnlyField
|
|
58
|
+
? !!this.group[this.componentProperties.isReadOnlyField]
|
|
59
|
+
: !!this.componentProperties?.isReadOnly;
|
|
60
|
+
}
|
|
61
|
+
setMinValue(newValue) {
|
|
62
|
+
this.minValue = newValue;
|
|
63
|
+
// mark this control as touched to trigger for validation
|
|
64
|
+
const control = this.form.controls[this.data.Value];
|
|
65
|
+
control.markAsTouched();
|
|
66
|
+
}
|
|
67
|
+
setMaxValue(newValue) {
|
|
68
|
+
this.maxValue = newValue;
|
|
69
|
+
// mark this control as touched to trigger for validation
|
|
70
|
+
const control = this.form.controls[this.data.Value];
|
|
71
|
+
control.markAsTouched();
|
|
72
|
+
}
|
|
73
|
+
setInitPropertyValue() {
|
|
74
|
+
if (typeof this.data.MinValue == 'string' && this.data.MinValue.toString().startsWith('group.')) {
|
|
75
|
+
this.minValue = ZComponentHelper.getGroupValue(this.data.MinValue.toString(), this.group);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
this.minValue = this.data.MinValue;
|
|
79
|
+
}
|
|
80
|
+
if (typeof this.data.MaxValue == 'string' && this.data.MaxValue.toString().startsWith('group.')) {
|
|
81
|
+
this.maxValue = ZComponentHelper.getGroupValue(this.data.MaxValue.toString(), this.group);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
this.maxValue = this.data.MaxValue;
|
|
85
|
+
}
|
|
86
|
+
if (typeof this.sliderData.SmallStep == 'string' && this.sliderData.SmallStep.toString().startsWith('group.')) {
|
|
87
|
+
this.smallStep = ZComponentHelper.getGroupValue(this.sliderData.SmallStep.toString(), this.group);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this.smallStep = this.sliderData.SmallStep;
|
|
91
|
+
}
|
|
92
|
+
if (this.smallStep <= 0 || ZComponentHelper.isNullUndefinedEmpty(this.smallStep)) {
|
|
93
|
+
this.smallStep = 1;
|
|
94
|
+
}
|
|
95
|
+
if (typeof this.sliderData.LargeStep == 'string' && this.sliderData.LargeStep.toString().startsWith('group.')) {
|
|
96
|
+
this.largeStep = ZComponentHelper.getGroupValue(this.sliderData.LargeStep.toString(), this.group);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.largeStep = this.sliderData.LargeStep;
|
|
100
|
+
}
|
|
101
|
+
if (this.largeStep <= 0 || ZComponentHelper.isNullUndefinedEmpty(this.largeStep)) {
|
|
102
|
+
this.largeStep = 5;
|
|
103
|
+
}
|
|
104
|
+
if (this.sliderData.TickPlacement && this.sliderData.TickPlacement.toString().startsWith('group.')) {
|
|
105
|
+
this.tickPlacement = ZComponentHelper.getGroupValue(this.sliderData.TickPlacement.toString(), this.group);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this.tickPlacement = this.sliderData.TickPlacement || 'both';
|
|
109
|
+
}
|
|
110
|
+
this.addMinAndMaxValidator();
|
|
111
|
+
}
|
|
112
|
+
addMinAndMaxValidator() {
|
|
113
|
+
const control = this.form?.controls[this.data.Value];
|
|
114
|
+
if (control) {
|
|
115
|
+
// Remove existing references first to prevent duplicates on re-add (e.g. after setRequire resets validators)
|
|
116
|
+
if (this.minValidator) {
|
|
117
|
+
control.removeValidators(this.minValidator);
|
|
118
|
+
}
|
|
119
|
+
if (this.maxValidator) {
|
|
120
|
+
control.removeValidators(this.maxValidator);
|
|
121
|
+
}
|
|
122
|
+
if (this.minValue != undefined) {
|
|
123
|
+
const min = Number(this.minValue);
|
|
124
|
+
// Use minError key (not Angular's 'min') so getErrorMessageByErrorType produces the correct message
|
|
125
|
+
this.minValidator = (c) => {
|
|
126
|
+
const v = c.value;
|
|
127
|
+
if (v === null || v === undefined || v === '')
|
|
128
|
+
return null;
|
|
129
|
+
return Number(v) < min ? { minError: { minValue: min } } : null;
|
|
130
|
+
};
|
|
131
|
+
control.addValidators(this.minValidator);
|
|
132
|
+
}
|
|
133
|
+
if (this.maxValue != undefined) {
|
|
134
|
+
const max = Number(this.maxValue);
|
|
135
|
+
// Use maxError key (not Angular's 'max') so getErrorMessageByErrorType produces the correct message
|
|
136
|
+
this.maxValidator = (c) => {
|
|
137
|
+
const v = c.value;
|
|
138
|
+
if (v === null || v === undefined || v === '')
|
|
139
|
+
return null;
|
|
140
|
+
return Number(v) > max ? { maxError: { maxValue: max } } : null;
|
|
141
|
+
};
|
|
142
|
+
control.addValidators(this.maxValidator);
|
|
143
|
+
}
|
|
144
|
+
control.updateValueAndValidity();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
removeMinAndMaxValidator() {
|
|
148
|
+
this.minValue = undefined;
|
|
149
|
+
this.maxValue = undefined;
|
|
150
|
+
const control = this.form?.controls[this.data.Value];
|
|
151
|
+
if (control) {
|
|
152
|
+
if (control.hasValidator(this.minValidator)) {
|
|
153
|
+
control.removeValidators(this.minValidator);
|
|
154
|
+
}
|
|
155
|
+
if (control.hasValidator(this.maxValidator)) {
|
|
156
|
+
control.removeValidators(this.maxValidator);
|
|
157
|
+
}
|
|
158
|
+
control.updateValueAndValidity();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
get hasError() {
|
|
162
|
+
if (!this.form || !this.data || !this.data.Value || !this.form.controls[this.data.Value]) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
const control = this.form.controls[this.data.Value];
|
|
166
|
+
return !control.valid && !control.untouched && !control.disabled && !this.form.untouched;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
ZsliderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZsliderComponent, deps: [{ token: i1.ZComponentService }], target: i0.ɵɵFactoryTarget.Component });
|
|
170
|
+
ZsliderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZsliderComponent, selector: "app-zslider", inputs: { data: "data", group: "group", form: "form" }, usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"form\" class=\"zslider-container e1tag-style\" [style]=\"componentProperties.style.style\"\r\n [class.has-error-with-tick]=\"tickPlacement !== 'none' && hasError\">\r\n <div style=\"display: flex; width: 100%;\">\r\n <kendo-slider #orientation [id]=\"data.Name\" [formControlName]=\"data.Value\" [vertical]=\"sliderData?.IsVertical\"\r\n [min]=\"minValue\" [max]=\"maxValue\" [smallStep]=\"smallStep\" [largeStep]=\"largeStep\" [tickPlacement]=\"tickPlacement\"\r\n [showButtons]=\"sliderData?.ShowButtons\"\r\n (valueChange)=\"onChange(null, $event)\" [style]=\"componentProperties?.style?.style1\" class=\"e1tag-style1\">\r\n </kendo-slider> \r\n\r\n <kendo-numerictextbox [formControlName]=\"data.Value\" [min]=\"minValue\" [max]=\"maxValue\"\r\n [spinners]=\"data.ShowSpinners\" [step]=\"data.StepValue\"\r\n (valueChange)=\"onChange(null, $event)\" style=\"width: 30%;\">\r\n </kendo-numerictextbox>\r\n </div>\r\n</div>\r\n", styles: [".has-error-with-tick{padding-bottom:25px}\n"], components: [{ type: i2.SliderComponent, selector: "kendo-slider", inputs: ["focusableId", "dragHandleTitle", "incrementTitle", "animate", "decrementTitle", "showButtons", "value", "tabIndex"], exportAs: ["kendoSlider"] }, { type: i2.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }], directives: [{ type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
|
|
171
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZsliderComponent, decorators: [{
|
|
172
|
+
type: Component,
|
|
173
|
+
args: [{ selector: 'app-zslider', template: "<div [formGroup]=\"form\" class=\"zslider-container e1tag-style\" [style]=\"componentProperties.style.style\"\r\n [class.has-error-with-tick]=\"tickPlacement !== 'none' && hasError\">\r\n <div style=\"display: flex; width: 100%;\">\r\n <kendo-slider #orientation [id]=\"data.Name\" [formControlName]=\"data.Value\" [vertical]=\"sliderData?.IsVertical\"\r\n [min]=\"minValue\" [max]=\"maxValue\" [smallStep]=\"smallStep\" [largeStep]=\"largeStep\" [tickPlacement]=\"tickPlacement\"\r\n [showButtons]=\"sliderData?.ShowButtons\"\r\n (valueChange)=\"onChange(null, $event)\" [style]=\"componentProperties?.style?.style1\" class=\"e1tag-style1\">\r\n </kendo-slider> \r\n\r\n <kendo-numerictextbox [formControlName]=\"data.Value\" [min]=\"minValue\" [max]=\"maxValue\"\r\n [spinners]=\"data.ShowSpinners\" [step]=\"data.StepValue\"\r\n (valueChange)=\"onChange(null, $event)\" style=\"width: 30%;\">\r\n </kendo-numerictextbox>\r\n </div>\r\n</div>\r\n", styles: [".has-error-with-tick{padding-bottom:25px}\n"] }]
|
|
174
|
+
}], ctorParameters: function () { return [{ type: i1.ZComponentService }]; }, propDecorators: { data: [{
|
|
175
|
+
type: Input
|
|
176
|
+
}], group: [{
|
|
177
|
+
type: Input
|
|
178
|
+
}], form: [{
|
|
179
|
+
type: Input
|
|
180
|
+
}] } });
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienNsaWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96c2xpZGVyL3pzbGlkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenNsaWRlci96c2xpZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFXLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFHN0UsMkNBQTJDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV4RSxPQUFPLEVBQWMsZ0JBQWdCLEVBQXFDLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBUWxHLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxjQUFjO0lBcUJsRCxZQUNTLGdCQUFtQztRQUUxQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUZqQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW1CO1FBWnJDLGNBQVMsR0FBRyxTQUFTLENBQUM7UUFDdEIsYUFBUSxHQUF1QixDQUFDLENBQUM7UUFDakMsYUFBUSxHQUF1QixDQUFDLENBQUM7UUFHakMsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxrQkFBYSxHQUFHLE1BQU0sQ0FBQztRQUN2QixnQkFBVyxHQUFHLENBQUMsQ0FBQztJQU92QixDQUFDO0lBcEJELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLElBQW9DLENBQUM7SUFDbkQsQ0FBQztJQW9CRCxRQUFRO1FBQ04sS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRTVCLHdHQUF3RztRQUN4RyxN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QUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDM0YsQ0FBQzs7NkdBN0xVLGdCQUFnQjtpR0FBaEIsZ0JBQWdCLGtJQ2Y3QixtakNBZUE7MkZEQWEsZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNFLGFBQWE7d0dBS2QsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgRG9DaGVjaywgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBJbnB1dEZpZWxkQmFzZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvaW5wdXRmaWVsZGJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy96Y29tcG9uZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50LCBaQ29tcG9uZW50SGVscGVyLCBaRmllbGQsIFpHcm91cCwgelNsaWRlclByb3BlcnRpZXMgfSBmcm9tIFwibW1oZ2xvYmFsLXpjb3JlXCI7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtenNsaWRlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3pzbGlkZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3pzbGlkZXIuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFpzbGlkZXJDb21wb25lbnQgZXh0ZW5kcyBJbnB1dEZpZWxkQmFzZSBpbXBsZW1lbnRzIFpDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBEb0NoZWNrIHtcclxuICBASW5wdXQoKSBkYXRhOiBaRmllbGQ7XHJcbiAgQElucHV0KCkgZ3JvdXA6IFpHcm91cDtcclxuICBASW5wdXQoKSBmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGdldCBzbGlkZXJEYXRhKCk6IHpTbGlkZXJQcm9wZXJ0aWVzIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGEgYXMgdW5rbm93biBhcyB6U2xpZGVyUHJvcGVydGllcztcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgaW5wdXRNb2RlID0gXCJkZWNpbWFsXCI7XHJcbiAgcHVibGljIG1pblZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgPSAwO1xyXG4gIHB1YmxpYyBtYXhWYWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcclxuICBwcml2YXRlIG1pblZhbGlkYXRvcjtcclxuICBwcml2YXRlIG1heFZhbGlkYXRvcjtcclxuICBwdWJsaWMgc21hbGxTdGVwID0gMTtcclxuICBwdWJsaWMgbGFyZ2VTdGVwID0gNTtcclxuICBwdWJsaWMgdGlja1BsYWNlbWVudCA9ICdib3RoJztcclxuICBwdWJsaWMgc2xpZGVydmFsdWUgPSAwO1xyXG4gIHByaXZhdGUgX2NhY2hlZFJlYWRPbmx5U3RhdGU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGNvbXBvbmVudFNlcnZpY2U6IFpDb21wb25lbnRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgc3VwZXIuc2V0dXBJbm5lckZpZWxkKCk7XHJcbiAgICB0aGlzLnNldEluaXRQcm9wZXJ0eVZhbHVlKCk7XHJcblxyXG4gICAgLy8gV3JhcCBzZXRSZXF1aXJlIHRvIHJlLWFkZCBtaW4vbWF4IHZhbGlkYXRvcnMgYWZ0ZXIgdGhlIGJhc2UgcmVzZXRzIGFsbCB2YWxpZGF0b3JzIHZpYSBzZXRWYWxpZGF0b3JzKClcclxuICAgIGNvbnN0IG9yaWdpbmFsU2V0UmVxdWlyZSA9IHRoaXMuc2V0UmVxdWlyZTtcclxuICAgIHRoaXMuc2V0UmVxdWlyZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgICAgb3JpZ2luYWxTZXRSZXF1aXJlKHN0YXR1cyk7XHJcbiAgICAgIHRoaXMuYWRkTWluQW5kTWF4VmFsaWRhdG9yKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEluaXRpYWxpemUgRm9ybUNvbnRyb2wgZGlzYWJsZWQgc3RhdGUgcHJvZ3JhbW1hdGljYWxseSAoYXZvaWRzIFtkaXNhYmxlZF0gQW5ndWxhciB3YXJuaW5nKVxyXG4gICAgdGhpcy5fY2FjaGVkUmVhZE9ubHlTdGF0ZSA9IHRoaXMuZ2V0UmVhZE9ubHlTdGF0ZSgpO1xyXG4gICAgaWYgKHRoaXMuX2NhY2hlZFJlYWRPbmx5U3RhdGUpIHtcclxuICAgICAgdGhpcy5mb3JtPy5jb250cm9sc1t0aGlzLmRhdGEuVmFsdWVdPy5kaXNhYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0RvQ2hlY2soKSB7XHJcbiAgICBjb25zdCBjdXJyZW50UmVhZE9ubHkgPSB0aGlzLmdldFJlYWRPbmx5U3RhdGUoKTtcclxuICAgIGlmIChjdXJyZW50UmVhZE9ubHkgIT09IHRoaXMuX2NhY2hlZFJlYWRPbmx5U3RhdGUpIHtcclxuICAgICAgdGhpcy5fY2FjaGVkUmVhZE9ubHlTdGF0ZSA9IGN1cnJlbnRSZWFkT25seTtcclxuICAgICAgY29uc3QgZmMgPSB0aGlzLmZvcm0/LmNvbnRyb2xzW3RoaXMuZGF0YS5WYWx1ZV07XHJcbiAgICAgIGlmIChmYykge1xyXG4gICAgICAgIGN1cnJlbnRSZWFkT25seSA/IGZjLmRpc2FibGUoKSA6IGZjLmVuYWJsZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMucmVtb3ZlTWluQW5kTWF4VmFsaWRhdG9yKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UuZGVjcmVtZW50Q29tcG9uZW50Q291bnRlckZvckZpZWxkKHRoaXMuZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJlYWRPbmx5U3RhdGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLmNvbXBvbmVudFByb3BlcnRpZXM/LmlzUmVhZE9ubHlGaWVsZFxyXG4gICAgICA/ICEhdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXVxyXG4gICAgICA6ICEhdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzPy5pc1JlYWRPbmx5O1xyXG4gIH1cclxuXHJcbiAgc2V0TWluVmFsdWUobmV3VmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5taW5WYWx1ZSA9IG5ld1ZhbHVlO1xyXG5cclxuICAgIC8vIG1hcmsgdGhpcyBjb250cm9sIGFzIHRvdWNoZWQgdG8gdHJpZ2dlciBmb3IgdmFsaWRhdGlvblxyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLmRhdGEuVmFsdWVdO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBzZXRNYXhWYWx1ZShuZXdWYWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm1heFZhbHVlID0gbmV3VmFsdWU7XHJcblxyXG4gICAgLy8gbWFyayB0aGlzIGNvbnRyb2wgYXMgdG91Y2hlZCB0byB0cmlnZ2VyIGZvciB2YWxpZGF0aW9uXHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMuZGF0YS5WYWx1ZV07XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SW5pdFByb3BlcnR5VmFsdWUoKSB7XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuZGF0YS5NaW5WYWx1ZSA9PSAnc3RyaW5nJyAmJiAodGhpcy5kYXRhLk1pblZhbHVlIGFzIGFueSkudG9TdHJpbmcoKS5zdGFydHNXaXRoKCdncm91cC4nKSkge1xyXG4gICAgICB0aGlzLm1pblZhbHVlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKCh0aGlzLmRhdGEuTWluVmFsdWUgYXMgYW55KS50b1N0cmluZygpLCB0aGlzLmdyb3VwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm1pblZhbHVlID0gdGhpcy5kYXRhLk1pblZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLk1heFZhbHVlID09ICdzdHJpbmcnICYmICh0aGlzLmRhdGEuTWF4VmFsdWUgYXMgYW55KS50b1N0cmluZygpLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgIHRoaXMubWF4VmFsdWUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoKHRoaXMuZGF0YS5NYXhWYWx1ZSBhcyBhbnkpLnRvU3RyaW5nKCksIHRoaXMuZ3JvdXApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubWF4VmFsdWUgPSB0aGlzLmRhdGEuTWF4VmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLnNsaWRlckRhdGEuU21hbGxTdGVwID09ICdzdHJpbmcnICYmICh0aGlzLnNsaWRlckRhdGEuU21hbGxTdGVwIGFzIGFueSkudG9TdHJpbmcoKS5zdGFydHNXaXRoKCdncm91cC4nKSkge1xyXG4gICAgICB0aGlzLnNtYWxsU3RlcCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSgodGhpcy5zbGlkZXJEYXRhLlNtYWxsU3RlcCBhcyBhbnkpLnRvU3RyaW5nKCksIHRoaXMuZ3JvdXApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc21hbGxTdGVwID0gdGhpcy5zbGlkZXJEYXRhLlNtYWxsU3RlcDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNtYWxsU3RlcCA8PSAwIHx8IFpDb21wb25lbnRIZWxwZXIuaXNOdWxsVW5kZWZpbmVkRW1wdHkodGhpcy5zbWFsbFN0ZXApKSB7XHJcbiAgICAgIHRoaXMuc21hbGxTdGVwID0gMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHRoaXMuc2xpZGVyRGF0YS5MYXJnZVN0ZXAgPT0gJ3N0cmluZycgJiYgKHRoaXMuc2xpZGVyRGF0YS5MYXJnZVN0ZXAgYXMgYW55KS50b1N0cmluZygpLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgIHRoaXMubGFyZ2VTdGVwID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKCh0aGlzLnNsaWRlckRhdGEuTGFyZ2VTdGVwIGFzIGFueSkudG9TdHJpbmcoKSwgdGhpcy5ncm91cCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5sYXJnZVN0ZXAgPSB0aGlzLnNsaWRlckRhdGEuTGFyZ2VTdGVwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGFyZ2VTdGVwIDw9IDAgfHwgWkNvbXBvbmVudEhlbHBlci5pc051bGxVbmRlZmluZWRFbXB0eSh0aGlzLmxhcmdlU3RlcCkpIHtcclxuICAgICAgdGhpcy5sYXJnZVN0ZXAgPSA1O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNsaWRlckRhdGEuVGlja1BsYWNlbWVudCAmJiAodGhpcy5zbGlkZXJEYXRhLlRpY2tQbGFjZW1lbnQgYXMgYW55KS50b1N0cmluZygpLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgIHRoaXMudGlja1BsYWNlbWVudCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSgodGhpcy5zbGlkZXJEYXRhLlRpY2tQbGFjZW1lbnQgYXMgYW55KS50b1N0cmluZygpLCB0aGlzLmdyb3VwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnRpY2tQbGFjZW1lbnQgPSB0aGlzLnNsaWRlckRhdGEuVGlja1BsYWNlbWVudCB8fCAnYm90aCc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hZGRNaW5BbmRNYXhWYWxpZGF0b3IoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkTWluQW5kTWF4VmFsaWRhdG9yKCkge1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybT8uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgIC8vIFJlbW92ZSBleGlzdGluZyByZWZlcmVuY2VzIGZpcnN0IHRvIHByZXZlbnQgZHVwbGljYXRlcyBvbiByZS1hZGQgKGUuZy4gYWZ0ZXIgc2V0UmVxdWlyZSByZXNldHMgdmFsaWRhdG9ycylcclxuICAgICAgaWYgKHRoaXMubWluVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgY29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKHRoaXMubWluVmFsaWRhdG9yKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5tYXhWYWxpZGF0b3IpIHtcclxuICAgICAgICBjb250cm9sLnJlbW92ZVZhbGlkYXRvcnModGhpcy5tYXhWYWxpZGF0b3IpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5taW5WYWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBtaW4gPSBOdW1iZXIodGhpcy5taW5WYWx1ZSk7XHJcbiAgICAgICAgLy8gVXNlIG1pbkVycm9yIGtleSAobm90IEFuZ3VsYXIncyAnbWluJykgc28gZ2V0RXJyb3JNZXNzYWdlQnlFcnJvclR5cGUgcHJvZHVjZXMgdGhlIGNvcnJlY3QgbWVzc2FnZVxyXG4gICAgICAgIHRoaXMubWluVmFsaWRhdG9yID0gKGM6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcclxuICAgICAgICAgIGNvbnN0IHYgPSBjLnZhbHVlO1xyXG4gICAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09ICcnKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgIHJldHVybiBOdW1iZXIodikgPCBtaW4gPyB7IG1pbkVycm9yOiB7IG1pblZhbHVlOiBtaW4gfSB9IDogbnVsbDtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnRyb2wuYWRkVmFsaWRhdG9ycyh0aGlzLm1pblZhbGlkYXRvcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLm1heFZhbHVlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IG1heCA9IE51bWJlcih0aGlzLm1heFZhbHVlKTtcclxuICAgICAgICAvLyBVc2UgbWF4RXJyb3Iga2V5IChub3QgQW5ndWxhcidzICdtYXgnKSBzbyBnZXRFcnJvck1lc3NhZ2VCeUVycm9yVHlwZSBwcm9kdWNlcyB0aGUgY29ycmVjdCBtZXNzYWdlXHJcbiAgICAgICAgdGhpcy5tYXhWYWxpZGF0b3IgPSAoYzogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdiA9IGMudmFsdWU7XHJcbiAgICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gJycpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgcmV0dXJuIE51bWJlcih2KSA+IG1heCA/IHsgbWF4RXJyb3I6IHsgbWF4VmFsdWU6IG1heCB9IH0gOiBudWxsO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29udHJvbC5hZGRWYWxpZGF0b3JzKHRoaXMubWF4VmFsaWRhdG9yKTtcclxuICAgICAgfVxyXG4gICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlTWluQW5kTWF4VmFsaWRhdG9yKCkge1xyXG4gICAgdGhpcy5taW5WYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMubWF4VmFsdWUgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybT8uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgIGlmIChjb250cm9sLmhhc1ZhbGlkYXRvcih0aGlzLm1pblZhbGlkYXRvcikpIHtcclxuICAgICAgICBjb250cm9sLnJlbW92ZVZhbGlkYXRvcnModGhpcy5taW5WYWxpZGF0b3IpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb250cm9sLmhhc1ZhbGlkYXRvcih0aGlzLm1heFZhbGlkYXRvcikpIHtcclxuICAgICAgICBjb250cm9sLnJlbW92ZVZhbGlkYXRvcnModGhpcy5tYXhWYWxpZGF0b3IpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0Vycm9yKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLmZvcm0gfHwgIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLlZhbHVlIHx8ICF0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMuZGF0YS5WYWx1ZV07XHJcbiAgICByZXR1cm4gIWNvbnRyb2wudmFsaWQgJiYgIWNvbnRyb2wudW50b3VjaGVkICYmICFjb250cm9sLmRpc2FibGVkICYmICF0aGlzLmZvcm0udW50b3VjaGVkO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwienNsaWRlci1jb250YWluZXIgZTF0YWctc3R5bGVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZVwiXHJcbiAgICAgW2NsYXNzLmhhcy1lcnJvci13aXRoLXRpY2tdPVwidGlja1BsYWNlbWVudCAhPT0gJ25vbmUnICYmIGhhc0Vycm9yXCI+XHJcbiAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7ICB3aWR0aDogMTAwJTtcIj5cclxuICAgIDxrZW5kby1zbGlkZXIgI29yaWVudGF0aW9uIFtpZF09XCJkYXRhLk5hbWVcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIiBbdmVydGljYWxdPVwic2xpZGVyRGF0YT8uSXNWZXJ0aWNhbFwiXHJcbiAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluVmFsdWVcIiBbbWF4XT1cIm1heFZhbHVlXCIgW3NtYWxsU3RlcF09XCJzbWFsbFN0ZXBcIiBbbGFyZ2VTdGVwXT1cImxhcmdlU3RlcFwiIFt0aWNrUGxhY2VtZW50XT1cInRpY2tQbGFjZW1lbnRcIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwic2xpZGVyRGF0YT8uU2hvd0J1dHRvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2UobnVsbCwgJGV2ZW50KVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZT8uc3R5bGUxXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTFcIj5cclxuICAgIDwva2VuZG8tc2xpZGVyPiZuYnNwO1xyXG5cclxuICAgIDxrZW5kby1udW1lcmljdGV4dGJveCBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIiBbbWluXT1cIm1pblZhbHVlXCIgW21heF09XCJtYXhWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NwaW5uZXJzXT1cImRhdGEuU2hvd1NwaW5uZXJzXCIgW3N0ZXBdPVwiZGF0YS5TdGVwVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZShudWxsLCAkZXZlbnQpXCIgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxyXG4gICAgPC9rZW5kby1udW1lcmljdGV4dGJveD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|