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.
@@ -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>&nbsp;\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>&nbsp;\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienNsaWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96c2xpZGVyL3pzbGlkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenNsaWRlci96c2xpZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFXLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFHN0UsMkNBQTJDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV4RSxPQUFPLEVBQWMsZ0JBQWdCLEVBQXFDLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBUWxHLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxjQUFjO0lBcUJsRCxZQUNTLGdCQUFtQztRQUUxQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUZqQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW1CO1FBWnJDLGNBQVMsR0FBRyxTQUFTLENBQUM7UUFDdEIsYUFBUSxHQUF1QixDQUFDLENBQUM7UUFDakMsYUFBUSxHQUF1QixDQUFDLENBQUM7UUFHakMsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxrQkFBYSxHQUFHLE1BQU0sQ0FBQztRQUN2QixnQkFBVyxHQUFHLENBQUMsQ0FBQztJQU92QixDQUFDO0lBcEJELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLElBQW9DLENBQUM7SUFDbkQsQ0FBQztJQW9CRCxRQUFRO1FBQ04sS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRTVCLHdHQUF3RztRQUN4RyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQWUsRUFBRSxFQUFFO1lBQ3BDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQy9CLENBQUMsQ0FBQztRQUVGLDZGQUE2RjtRQUM3RixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDcEQsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDN0IsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQztTQUNqRDtJQUNILENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDaEQsSUFBSSxlQUFlLEtBQUssSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQ2pELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxlQUFlLENBQUM7WUFDNUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRCxJQUFJLEVBQUUsRUFBRTtnQkFDTixlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQzlDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlDQUFpQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxlQUFlO1lBQ2hELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDO1lBQ3hELENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQztJQUM3QyxDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQWdCO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBRXpCLHlEQUF5RDtRQUN6RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQWdCO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBRXpCLHlEQUF5RDtRQUN6RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLElBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN4RyxJQUFJLENBQUMsUUFBUSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQWdCLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BHO2FBQ0k7WUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsSUFBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQWdCLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3hHLElBQUksQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDcEc7YUFDSTtZQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDcEM7UUFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksUUFBUSxJQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDdEgsSUFBSSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFpQixDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM1RzthQUNJO1lBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztTQUM1QztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2hGLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxJQUFJLFFBQVEsSUFBSyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQWlCLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3RILElBQUksQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBaUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUc7YUFDSTtZQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7U0FDNUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNoRixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztTQUNwQjtRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLElBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFxQixDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMzRyxJQUFJLENBQUMsYUFBYSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQXFCLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BIO2FBQ0k7WUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQztTQUM5RDtRQUVELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRCxJQUFJLE9BQU8sRUFBRTtZQUNYLDZHQUE2RztZQUM3RyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDN0M7WUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDN0M7WUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksU0FBUyxFQUFFO2dCQUM5QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNsQyxvR0FBb0c7Z0JBQ3BHLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFrQixFQUEyQixFQUFFO29CQUNsRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUNsQixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRTt3QkFBRSxPQUFPLElBQUksQ0FBQztvQkFDM0QsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xFLENBQUMsQ0FBQztnQkFDRixPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUMxQztZQUVELElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxTQUFTLEVBQUU7Z0JBQzlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2xDLG9HQUFvRztnQkFDcEcsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQWtCLEVBQTJCLEVBQUU7b0JBQ2xFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxFQUFFO3dCQUFFLE9BQU8sSUFBSSxDQUFDO29CQUMzRCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDbEUsQ0FBQyxDQUFDO2dCQUNGLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzFDO1lBQ0QsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBRTFCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMzQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzdDO1lBQ0QsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDM0MsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUM3QztZQUNELE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4RixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDM0YsQ0FBQzs7NkdBN0xVLGdCQUFnQjtpR0FBaEIsZ0JBQWdCLGtJQ2Y3QixtakNBZUE7MkZEQWEsZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNFLGFBQWE7d0dBS2QsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgRG9DaGVjaywgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBJbnB1dEZpZWxkQmFzZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvaW5wdXRmaWVsZGJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy96Y29tcG9uZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50LCBaQ29tcG9uZW50SGVscGVyLCBaRmllbGQsIFpHcm91cCwgelNsaWRlclByb3BlcnRpZXMgfSBmcm9tIFwibW1oZ2xvYmFsLXpjb3JlXCI7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtenNsaWRlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3pzbGlkZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3pzbGlkZXIuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFpzbGlkZXJDb21wb25lbnQgZXh0ZW5kcyBJbnB1dEZpZWxkQmFzZSBpbXBsZW1lbnRzIFpDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBEb0NoZWNrIHtcclxuICBASW5wdXQoKSBkYXRhOiBaRmllbGQ7XHJcbiAgQElucHV0KCkgZ3JvdXA6IFpHcm91cDtcclxuICBASW5wdXQoKSBmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGdldCBzbGlkZXJEYXRhKCk6IHpTbGlkZXJQcm9wZXJ0aWVzIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGEgYXMgdW5rbm93biBhcyB6U2xpZGVyUHJvcGVydGllcztcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgaW5wdXRNb2RlID0gXCJkZWNpbWFsXCI7XHJcbiAgcHVibGljIG1pblZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgPSAwO1xyXG4gIHB1YmxpYyBtYXhWYWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcclxuICBwcml2YXRlIG1pblZhbGlkYXRvcjtcclxuICBwcml2YXRlIG1heFZhbGlkYXRvcjtcclxuICBwdWJsaWMgc21hbGxTdGVwID0gMTtcclxuICBwdWJsaWMgbGFyZ2VTdGVwID0gNTtcclxuICBwdWJsaWMgdGlja1BsYWNlbWVudCA9ICdib3RoJztcclxuICBwdWJsaWMgc2xpZGVydmFsdWUgPSAwO1xyXG4gIHByaXZhdGUgX2NhY2hlZFJlYWRPbmx5U3RhdGU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGNvbXBvbmVudFNlcnZpY2U6IFpDb21wb25lbnRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgc3VwZXIuc2V0dXBJbm5lckZpZWxkKCk7XHJcbiAgICB0aGlzLnNldEluaXRQcm9wZXJ0eVZhbHVlKCk7XHJcblxyXG4gICAgLy8gV3JhcCBzZXRSZXF1aXJlIHRvIHJlLWFkZCBtaW4vbWF4IHZhbGlkYXRvcnMgYWZ0ZXIgdGhlIGJhc2UgcmVzZXRzIGFsbCB2YWxpZGF0b3JzIHZpYSBzZXRWYWxpZGF0b3JzKClcclxuICAgIGNvbnN0IG9yaWdpbmFsU2V0UmVxdWlyZSA9IHRoaXMuc2V0UmVxdWlyZTtcclxuICAgIHRoaXMuc2V0UmVxdWlyZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgICAgb3JpZ2luYWxTZXRSZXF1aXJlKHN0YXR1cyk7XHJcbiAgICAgIHRoaXMuYWRkTWluQW5kTWF4VmFsaWRhdG9yKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEluaXRpYWxpemUgRm9ybUNvbnRyb2wgZGlzYWJsZWQgc3RhdGUgcHJvZ3JhbW1hdGljYWxseSAoYXZvaWRzIFtkaXNhYmxlZF0gQW5ndWxhciB3YXJuaW5nKVxyXG4gICAgdGhpcy5fY2FjaGVkUmVhZE9ubHlTdGF0ZSA9IHRoaXMuZ2V0UmVhZE9ubHlTdGF0ZSgpO1xyXG4gICAgaWYgKHRoaXMuX2NhY2hlZFJlYWRPbmx5U3RhdGUpIHtcclxuICAgICAgdGhpcy5mb3JtPy5jb250cm9sc1t0aGlzLmRhdGEuVmFsdWVdPy5kaXNhYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0RvQ2hlY2soKSB7XHJcbiAgICBjb25zdCBjdXJyZW50UmVhZE9ubHkgPSB0aGlzLmdldFJlYWRPbmx5U3RhdGUoKTtcclxuICAgIGlmIChjdXJyZW50UmVhZE9ubHkgIT09IHRoaXMuX2NhY2hlZFJlYWRPbmx5U3RhdGUpIHtcclxuICAgICAgdGhpcy5fY2FjaGVkUmVhZE9ubHlTdGF0ZSA9IGN1cnJlbnRSZWFkT25seTtcclxuICAgICAgY29uc3QgZmMgPSB0aGlzLmZvcm0/LmNvbnRyb2xzW3RoaXMuZGF0YS5WYWx1ZV07XHJcbiAgICAgIGlmIChmYykge1xyXG4gICAgICAgIGN1cnJlbnRSZWFkT25seSA/IGZjLmRpc2FibGUoKSA6IGZjLmVuYWJsZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMucmVtb3ZlTWluQW5kTWF4VmFsaWRhdG9yKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFNlcnZpY2UuZGVjcmVtZW50Q29tcG9uZW50Q291bnRlckZvckZpZWxkKHRoaXMuZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJlYWRPbmx5U3RhdGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLmNvbXBvbmVudFByb3BlcnRpZXM/LmlzUmVhZE9ubHlGaWVsZFxyXG4gICAgICA/ICEhdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXVxyXG4gICAgICA6ICEhdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzPy5pc1JlYWRPbmx5O1xyXG4gIH1cclxuXHJcbiAgc2V0TWluVmFsdWUobmV3VmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5taW5WYWx1ZSA9IG5ld1ZhbHVlO1xyXG5cclxuICAgIC8vIG1hcmsgdGhpcyBjb250cm9sIGFzIHRvdWNoZWQgdG8gdHJpZ2dlciBmb3IgdmFsaWRhdGlvblxyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLmRhdGEuVmFsdWVdO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBzZXRNYXhWYWx1ZShuZXdWYWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm1heFZhbHVlID0gbmV3VmFsdWU7XHJcblxyXG4gICAgLy8gbWFyayB0aGlzIGNvbnRyb2wgYXMgdG91Y2hlZCB0byB0cmlnZ2VyIGZvciB2YWxpZGF0aW9uXHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMuZGF0YS5WYWx1ZV07XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SW5pdFByb3BlcnR5VmFsdWUoKSB7XHJcbiAgICBpZiAodHlwZW9mIHRoaXMuZGF0YS5NaW5WYWx1ZSA9PSAnc3RyaW5nJyAmJiAodGhpcy5kYXRhLk1pblZhbHVlIGFzIGFueSkudG9TdHJpbmcoKS5zdGFydHNXaXRoKCdncm91cC4nKSkge1xyXG4gICAgICB0aGlzLm1pblZhbHVlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKCh0aGlzLmRhdGEuTWluVmFsdWUgYXMgYW55KS50b1N0cmluZygpLCB0aGlzLmdyb3VwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm1pblZhbHVlID0gdGhpcy5kYXRhLk1pblZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLk1heFZhbHVlID09ICdzdHJpbmcnICYmICh0aGlzLmRhdGEuTWF4VmFsdWUgYXMgYW55KS50b1N0cmluZygpLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgIHRoaXMubWF4VmFsdWUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoKHRoaXMuZGF0YS5NYXhWYWx1ZSBhcyBhbnkpLnRvU3RyaW5nKCksIHRoaXMuZ3JvdXApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubWF4VmFsdWUgPSB0aGlzLmRhdGEuTWF4VmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLnNsaWRlckRhdGEuU21hbGxTdGVwID09ICdzdHJpbmcnICYmICh0aGlzLnNsaWRlckRhdGEuU21hbGxTdGVwIGFzIGFueSkudG9TdHJpbmcoKS5zdGFydHNXaXRoKCdncm91cC4nKSkge1xyXG4gICAgICB0aGlzLnNtYWxsU3RlcCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSgodGhpcy5zbGlkZXJEYXRhLlNtYWxsU3RlcCBhcyBhbnkpLnRvU3RyaW5nKCksIHRoaXMuZ3JvdXApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc21hbGxTdGVwID0gdGhpcy5zbGlkZXJEYXRhLlNtYWxsU3RlcDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNtYWxsU3RlcCA8PSAwIHx8IFpDb21wb25lbnRIZWxwZXIuaXNOdWxsVW5kZWZpbmVkRW1wdHkodGhpcy5zbWFsbFN0ZXApKSB7XHJcbiAgICAgIHRoaXMuc21hbGxTdGVwID0gMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHRoaXMuc2xpZGVyRGF0YS5MYXJnZVN0ZXAgPT0gJ3N0cmluZycgJiYgKHRoaXMuc2xpZGVyRGF0YS5MYXJnZVN0ZXAgYXMgYW55KS50b1N0cmluZygpLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgIHRoaXMubGFyZ2VTdGVwID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKCh0aGlzLnNsaWRlckRhdGEuTGFyZ2VTdGVwIGFzIGFueSkudG9TdHJpbmcoKSwgdGhpcy5ncm91cCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5sYXJnZVN0ZXAgPSB0aGlzLnNsaWRlckRhdGEuTGFyZ2VTdGVwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGFyZ2VTdGVwIDw9IDAgfHwgWkNvbXBvbmVudEhlbHBlci5pc051bGxVbmRlZmluZWRFbXB0eSh0aGlzLmxhcmdlU3RlcCkpIHtcclxuICAgICAgdGhpcy5sYXJnZVN0ZXAgPSA1O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNsaWRlckRhdGEuVGlja1BsYWNlbWVudCAmJiAodGhpcy5zbGlkZXJEYXRhLlRpY2tQbGFjZW1lbnQgYXMgYW55KS50b1N0cmluZygpLnN0YXJ0c1dpdGgoJ2dyb3VwLicpKSB7XHJcbiAgICAgIHRoaXMudGlja1BsYWNlbWVudCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZSgodGhpcy5zbGlkZXJEYXRhLlRpY2tQbGFjZW1lbnQgYXMgYW55KS50b1N0cmluZygpLCB0aGlzLmdyb3VwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnRpY2tQbGFjZW1lbnQgPSB0aGlzLnNsaWRlckRhdGEuVGlja1BsYWNlbWVudCB8fCAnYm90aCc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hZGRNaW5BbmRNYXhWYWxpZGF0b3IoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkTWluQW5kTWF4VmFsaWRhdG9yKCkge1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybT8uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgIC8vIFJlbW92ZSBleGlzdGluZyByZWZlcmVuY2VzIGZpcnN0IHRvIHByZXZlbnQgZHVwbGljYXRlcyBvbiByZS1hZGQgKGUuZy4gYWZ0ZXIgc2V0UmVxdWlyZSByZXNldHMgdmFsaWRhdG9ycylcclxuICAgICAgaWYgKHRoaXMubWluVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgY29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKHRoaXMubWluVmFsaWRhdG9yKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5tYXhWYWxpZGF0b3IpIHtcclxuICAgICAgICBjb250cm9sLnJlbW92ZVZhbGlkYXRvcnModGhpcy5tYXhWYWxpZGF0b3IpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5taW5WYWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBtaW4gPSBOdW1iZXIodGhpcy5taW5WYWx1ZSk7XHJcbiAgICAgICAgLy8gVXNlIG1pbkVycm9yIGtleSAobm90IEFuZ3VsYXIncyAnbWluJykgc28gZ2V0RXJyb3JNZXNzYWdlQnlFcnJvclR5cGUgcHJvZHVjZXMgdGhlIGNvcnJlY3QgbWVzc2FnZVxyXG4gICAgICAgIHRoaXMubWluVmFsaWRhdG9yID0gKGM6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcclxuICAgICAgICAgIGNvbnN0IHYgPSBjLnZhbHVlO1xyXG4gICAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09ICcnKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgIHJldHVybiBOdW1iZXIodikgPCBtaW4gPyB7IG1pbkVycm9yOiB7IG1pblZhbHVlOiBtaW4gfSB9IDogbnVsbDtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnRyb2wuYWRkVmFsaWRhdG9ycyh0aGlzLm1pblZhbGlkYXRvcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLm1heFZhbHVlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IG1heCA9IE51bWJlcih0aGlzLm1heFZhbHVlKTtcclxuICAgICAgICAvLyBVc2UgbWF4RXJyb3Iga2V5IChub3QgQW5ndWxhcidzICdtYXgnKSBzbyBnZXRFcnJvck1lc3NhZ2VCeUVycm9yVHlwZSBwcm9kdWNlcyB0aGUgY29ycmVjdCBtZXNzYWdlXHJcbiAgICAgICAgdGhpcy5tYXhWYWxpZGF0b3IgPSAoYzogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdiA9IGMudmFsdWU7XHJcbiAgICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gJycpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgcmV0dXJuIE51bWJlcih2KSA+IG1heCA/IHsgbWF4RXJyb3I6IHsgbWF4VmFsdWU6IG1heCB9IH0gOiBudWxsO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29udHJvbC5hZGRWYWxpZGF0b3JzKHRoaXMubWF4VmFsaWRhdG9yKTtcclxuICAgICAgfVxyXG4gICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlTWluQW5kTWF4VmFsaWRhdG9yKCkge1xyXG4gICAgdGhpcy5taW5WYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMubWF4VmFsdWUgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybT8uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgIGlmIChjb250cm9sLmhhc1ZhbGlkYXRvcih0aGlzLm1pblZhbGlkYXRvcikpIHtcclxuICAgICAgICBjb250cm9sLnJlbW92ZVZhbGlkYXRvcnModGhpcy5taW5WYWxpZGF0b3IpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb250cm9sLmhhc1ZhbGlkYXRvcih0aGlzLm1heFZhbGlkYXRvcikpIHtcclxuICAgICAgICBjb250cm9sLnJlbW92ZVZhbGlkYXRvcnModGhpcy5tYXhWYWxpZGF0b3IpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0Vycm9yKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLmZvcm0gfHwgIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLlZhbHVlIHx8ICF0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMuZGF0YS5WYWx1ZV07XHJcbiAgICByZXR1cm4gIWNvbnRyb2wudmFsaWQgJiYgIWNvbnRyb2wudW50b3VjaGVkICYmICFjb250cm9sLmRpc2FibGVkICYmICF0aGlzLmZvcm0udW50b3VjaGVkO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwienNsaWRlci1jb250YWluZXIgZTF0YWctc3R5bGVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZVwiXHJcbiAgICAgW2NsYXNzLmhhcy1lcnJvci13aXRoLXRpY2tdPVwidGlja1BsYWNlbWVudCAhPT0gJ25vbmUnICYmIGhhc0Vycm9yXCI+XHJcbiAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7ICB3aWR0aDogMTAwJTtcIj5cclxuICAgIDxrZW5kby1zbGlkZXIgI29yaWVudGF0aW9uIFtpZF09XCJkYXRhLk5hbWVcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIiBbdmVydGljYWxdPVwic2xpZGVyRGF0YT8uSXNWZXJ0aWNhbFwiXHJcbiAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluVmFsdWVcIiBbbWF4XT1cIm1heFZhbHVlXCIgW3NtYWxsU3RlcF09XCJzbWFsbFN0ZXBcIiBbbGFyZ2VTdGVwXT1cImxhcmdlU3RlcFwiIFt0aWNrUGxhY2VtZW50XT1cInRpY2tQbGFjZW1lbnRcIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwic2xpZGVyRGF0YT8uU2hvd0J1dHRvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2UobnVsbCwgJGV2ZW50KVwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZT8uc3R5bGUxXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTFcIj5cclxuICAgIDwva2VuZG8tc2xpZGVyPiZuYnNwO1xyXG5cclxuICAgIDxrZW5kby1udW1lcmljdGV4dGJveCBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIiBbbWluXT1cIm1pblZhbHVlXCIgW21heF09XCJtYXhWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NwaW5uZXJzXT1cImRhdGEuU2hvd1NwaW5uZXJzXCIgW3N0ZXBdPVwiZGF0YS5TdGVwVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZShudWxsLCAkZXZlbnQpXCIgc3R5bGU9XCJ3aWR0aDogMzAlO1wiPlxyXG4gICAgPC9rZW5kby1udW1lcmljdGV4dGJveD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==