@cqa-lib/cqa-ui 1.1.259 → 1.1.260

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.
Files changed (20) hide show
  1. package/esm2020/lib/step-builder/advanced-variables-form/advanced-variables-form.component.mjs +107 -5
  2. package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +144 -18
  3. package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +176 -6
  4. package/esm2020/lib/step-builder/step-builder-custom-code/step-builder-custom-code.component.mjs +102 -7
  5. package/esm2020/lib/step-builder/step-builder-document/step-builder-document.component.mjs +113 -7
  6. package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +7 -3
  7. package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +3 -3
  8. package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +7 -1
  9. package/fesm2015/cqa-lib-cqa-ui.mjs +702 -91
  10. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  11. package/fesm2020/cqa-lib-cqa-ui.mjs +689 -90
  12. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  13. package/lib/step-builder/advanced-variables-form/advanced-variables-form.component.d.ts +43 -2
  14. package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +8 -1
  15. package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +14 -1
  16. package/lib/step-builder/step-builder-custom-code/step-builder-custom-code.component.d.ts +12 -2
  17. package/lib/step-builder/step-builder-document/step-builder-document.component.d.ts +15 -1
  18. package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +3 -1
  19. package/package.json +1 -1
  20. package/styles.css +1 -1
@@ -1,13 +1,16 @@
1
1
  import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
2
- import { FormArray, FormGroup } from '@angular/forms';
2
+ import { FormArray, FormGroup, FormControl } from '@angular/forms';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/material/slide-toggle";
5
- import * as i2 from "@angular/common";
5
+ import * as i2 from "../../custom-input/custom-input.component";
6
+ import * as i3 from "@angular/material/icon";
7
+ import * as i4 from "@angular/common";
6
8
  export class AdvancedVariablesFormComponent {
7
9
  constructor() {
8
10
  this.advancedVariables = [];
9
11
  this.advancedVariableForm = new FormArray([]);
10
12
  this.variableBooleanChange = new EventEmitter();
13
+ this.variableValueChange = new EventEmitter();
11
14
  }
12
15
  ngOnChanges(changes) {
13
16
  // Handle changes if needed
@@ -36,29 +39,128 @@ export class AdvancedVariablesFormComponent {
36
39
  }
37
40
  return variable.value || false;
38
41
  }
42
+ /**
43
+ * Get the value from form or variable (for non-boolean types)
44
+ */
45
+ getValue(variable, index) {
46
+ const formGroup = this.getFormGroupAt(index);
47
+ if (formGroup) {
48
+ const value = formGroup.get('value')?.value;
49
+ return value !== null && value !== undefined ? value : variable.value;
50
+ }
51
+ return variable.value;
52
+ }
53
+ /**
54
+ * Check if variable is boolean type
55
+ */
56
+ isBooleanType(variable) {
57
+ return variable.type !== 'str_list' && typeof variable.value === 'boolean';
58
+ }
59
+ /**
60
+ * Check if variable is str_list type
61
+ */
62
+ isStrListType(variable) {
63
+ return variable.type === 'str_list';
64
+ }
39
65
  /**
40
66
  * Handle boolean value change
41
67
  */
42
68
  onVariableBooleanChange(variableName, value) {
43
69
  this.variableBooleanChange.emit({ name: variableName, value });
44
70
  }
71
+ /**
72
+ * Handle value change for non-boolean types
73
+ */
74
+ onVariableValueChange(variableName, value) {
75
+ this.variableValueChange.emit({ name: variableName, value });
76
+ }
77
+ /**
78
+ * Handle adding a new item to str_list
79
+ */
80
+ addStrListItem(variable, index) {
81
+ const formGroup = this.getFormGroupAt(index);
82
+ if (formGroup) {
83
+ const valueControl = formGroup.get('value');
84
+ if (valueControl instanceof FormArray) {
85
+ valueControl.push(new FormControl(''));
86
+ // Emit the updated value
87
+ const currentValue = valueControl.value;
88
+ this.onVariableValueChange(variable.name, currentValue);
89
+ }
90
+ else {
91
+ console.error('Expected FormArray for str_list variable, got:', valueControl);
92
+ }
93
+ }
94
+ }
95
+ /**
96
+ * Handle removing an item from str_list
97
+ */
98
+ removeStrListItem(variable, index, itemIndex) {
99
+ const formGroup = this.getFormGroupAt(index);
100
+ if (formGroup) {
101
+ const valueControl = formGroup.get('value');
102
+ if (valueControl instanceof FormArray && itemIndex >= 0 && itemIndex < valueControl.length) {
103
+ valueControl.removeAt(itemIndex);
104
+ // Emit the updated value
105
+ const currentValue = valueControl.value;
106
+ this.onVariableValueChange(variable.name, currentValue);
107
+ }
108
+ }
109
+ }
110
+ /**
111
+ * Handle str_list item value change
112
+ */
113
+ onStrListItemChange(variable, index, itemIndex, value) {
114
+ const formGroup = this.getFormGroupAt(index);
115
+ if (formGroup) {
116
+ const valueControl = formGroup.get('value');
117
+ if (valueControl instanceof FormArray && itemIndex >= 0 && itemIndex < valueControl.length) {
118
+ // Use emitEvent: false to prevent triggering change detection that causes focus loss
119
+ valueControl.at(itemIndex).setValue(value, { emitEvent: false });
120
+ // Emit the updated value after a short delay to avoid focus issues
121
+ setTimeout(() => {
122
+ const currentValue = valueControl.value;
123
+ this.onVariableValueChange(variable.name, currentValue);
124
+ }, 0);
125
+ }
126
+ }
127
+ }
128
+ /**
129
+ * Get FormArray for str_list variable
130
+ */
131
+ getStrListFormArray(variable, index) {
132
+ const formGroup = this.getFormGroupAt(index);
133
+ if (formGroup) {
134
+ const formArray = formGroup.get('value');
135
+ return formArray instanceof FormArray ? formArray : null;
136
+ }
137
+ return null;
138
+ }
45
139
  /**
46
140
  * Track by function for ngFor
47
141
  */
48
142
  trackByVariable(index, variable) {
49
143
  return variable.name || index.toString();
50
144
  }
145
+ /**
146
+ * Track by function for form controls in str_list
147
+ */
148
+ trackByControl(index, control) {
149
+ return control || index;
150
+ }
51
151
  }
52
152
  AdvancedVariablesFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AdvancedVariablesFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
53
- AdvancedVariablesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: { advancedVariables: "advancedVariables", advancedVariableForm: "advancedVariableForm" }, outputs: { variableBooleanChange: "variableBooleanChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap advanced-variables-form\">\n <ng-container *ngFor=\"let variable of advancedVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle \n [checked]=\"getBooleanValue(variable, i)\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" \n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n</div>\n\n", components: [{ type: i1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
153
+ AdvancedVariablesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: AdvancedVariablesFormComponent, selector: "cqa-advanced-variables-form", inputs: { advancedVariables: "advancedVariables", advancedVariableForm: "advancedVariableForm" }, outputs: { variableBooleanChange: "variableBooleanChange", variableValueChange: "variableValueChange" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap advanced-variables-form cqa-mb-4\">\n <ng-container *ngFor=\"let variable of advancedVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"isBooleanType(variable)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" style=\"width: 100%\">\n <mat-slide-toggle \n [checked]=\"getBooleanValue(variable, i)\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" \n color=\"primary\">\n </mat-slide-toggle>\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n </div>\n </ng-container>\n\n <!-- str_list variables with dynamic list -->\n <ng-container *ngIf=\"isStrListType(variable)\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <ng-container *ngIf=\"getStrListFormArray(variable, i) as formArray\">\n <div *ngFor=\"let control of formArray.controls; let itemIndex = index; trackBy: trackByControl\" class=\"cqa-flex cqa-gap-2 cqa-items-center\">\n <cqa-custom-input \n [placeholder]=\"'Enter locator'\" \n [value]=\"control.value\" \n [fullWidth]=\"true\"\n (valueChange)=\"onStrListItemChange(variable, i, itemIndex, $event)\">\n </cqa-custom-input>\n <div class=\"cqa-cursor-pointer cqa-text-red-600 cqa-flex cqa-items-center cqa-justify-center\" (click)=\"removeStrListItem(variable, i, itemIndex)\">\n <mat-icon style=\"font-size: 24px;\">delete</mat-icon>\n </div>\n <div *ngIf=\"itemIndex === formArray.length - 1\" class=\"cqa-cursor-pointer cqa-text-blue-600 cqa-flex cqa-items-center cqa-justify-center\" (click)=\"addStrListItem(variable, i)\">\n <mat-icon style=\"font-size: 24px;\">add</mat-icon>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n", components: [{ type: i1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i2.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
54
154
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AdvancedVariablesFormComponent, decorators: [{
55
155
  type: Component,
56
- args: [{ selector: 'cqa-advanced-variables-form', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap advanced-variables-form\">\n <ng-container *ngFor=\"let variable of advancedVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle \n [checked]=\"getBooleanValue(variable, i)\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" \n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n</div>\n\n", styles: [] }]
156
+ args: [{ selector: 'cqa-advanced-variables-form', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-flex cqa-gap-x-6 cqa-gap-y-4 cqa-flex-wrap advanced-variables-form cqa-mb-4\">\n <ng-container *ngFor=\"let variable of advancedVariables; let i = index; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"isBooleanType(variable)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" style=\"width: 100%\">\n <mat-slide-toggle \n [checked]=\"getBooleanValue(variable, i)\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\" \n color=\"primary\">\n </mat-slide-toggle>\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 capitalize-first\">\n {{ variable.label }}\n </label>\n </div>\n </ng-container>\n\n <!-- str_list variables with dynamic list -->\n <ng-container *ngIf=\"isStrListType(variable)\">\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1 capitalize-first\">\n {{ variable.label }}\n </label>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <ng-container *ngIf=\"getStrListFormArray(variable, i) as formArray\">\n <div *ngFor=\"let control of formArray.controls; let itemIndex = index; trackBy: trackByControl\" class=\"cqa-flex cqa-gap-2 cqa-items-center\">\n <cqa-custom-input \n [placeholder]=\"'Enter locator'\" \n [value]=\"control.value\" \n [fullWidth]=\"true\"\n (valueChange)=\"onStrListItemChange(variable, i, itemIndex, $event)\">\n </cqa-custom-input>\n <div class=\"cqa-cursor-pointer cqa-text-red-600 cqa-flex cqa-items-center cqa-justify-center\" (click)=\"removeStrListItem(variable, i, itemIndex)\">\n <mat-icon style=\"font-size: 24px;\">delete</mat-icon>\n </div>\n <div *ngIf=\"itemIndex === formArray.length - 1\" class=\"cqa-cursor-pointer cqa-text-blue-600 cqa-flex cqa-items-center cqa-justify-center\" (click)=\"addStrListItem(variable, i)\">\n <mat-icon style=\"font-size: 24px;\">add</mat-icon>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</div>\n\n", styles: [] }]
57
157
  }], propDecorators: { advancedVariables: [{
58
158
  type: Input
59
159
  }], advancedVariableForm: [{
60
160
  type: Input
61
161
  }], variableBooleanChange: [{
62
162
  type: Output
163
+ }], variableValueChange: [{
164
+ type: Output
63
165
  }] } });
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0vYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0vYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQWVuRSxNQUFNLE9BQU8sOEJBQThCO0lBUDNDO1FBUVcsc0JBQWlCLEdBQXVCLEVBQUUsQ0FBQztRQUMzQyx5QkFBb0IsR0FBYyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVuRCwwQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBb0MsQ0FBQztLQTZDeEY7SUEzQ0MsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLDJCQUEyQjtRQUMzQixJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQ25FLHNDQUFzQztTQUN2QztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxLQUFhO1FBQzFCLElBQUksSUFBSSxDQUFDLG9CQUFvQixJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUU7WUFDdkYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRCxPQUFPLE9BQU8sWUFBWSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ3REO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsUUFBMEIsRUFBRSxLQUFhO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsSUFBSSxTQUFTLEVBQUU7WUFDYixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQztZQUM1QyxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztTQUNoRjtRQUNELE9BQU8sUUFBUSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsdUJBQXVCLENBQUMsWUFBb0IsRUFBRSxLQUFjO1FBQzFELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZSxDQUFDLEtBQWEsRUFBRSxRQUEwQjtRQUN2RCxPQUFPLFFBQVEsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNDLENBQUM7OzJIQWhEVSw4QkFBOEI7K0dBQTlCLDhCQUE4QixnU0NoQjNDLHN0QkFnQkE7MkZEQWEsOEJBQThCO2tCQVAxQyxTQUFTOytCQUNFLDZCQUE2QixRQUdqQyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsbUJBQ2IsdUJBQXVCLENBQUMsTUFBTTs4QkFHdEMsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFSSxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFkdmFuY2VkVmFyaWFibGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkVmFyaWFibGVzRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGFkdmFuY2VkVmFyaWFibGVzOiBBZHZhbmNlZFZhcmlhYmxlW10gPSBbXTtcbiAgQElucHV0KCkgYWR2YW5jZWRWYXJpYWJsZUZvcm06IEZvcm1BcnJheSA9IG5ldyBGb3JtQXJyYXkoW10pO1xuICBcbiAgQE91dHB1dCgpIHZhcmlhYmxlQm9vbGVhbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBib29sZWFuIH0+KCk7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBjaGFuZ2VzIGlmIG5lZWRlZFxuICAgIGlmIChjaGFuZ2VzWydhZHZhbmNlZFZhcmlhYmxlcyddIHx8IGNoYW5nZXNbJ2FkdmFuY2VkVmFyaWFibGVGb3JtJ10pIHtcbiAgICAgIC8vIEZvcm0gaXMgbWFuYWdlZCBieSBwYXJlbnQgY29tcG9uZW50XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgRm9ybUdyb3VwIGF0IGEgc3BlY2lmaWMgaW5kZXhcbiAgICovXG4gIGdldEZvcm1Hcm91cEF0KGluZGV4OiBudW1iZXIpOiBGb3JtR3JvdXAgfCBudWxsIHtcbiAgICBpZiAodGhpcy5hZHZhbmNlZFZhcmlhYmxlRm9ybSAmJiBpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5hZHZhbmNlZFZhcmlhYmxlRm9ybS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmFkdmFuY2VkVmFyaWFibGVGb3JtLmF0KGluZGV4KTtcbiAgICAgIHJldHVybiBjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwID8gY29udHJvbCA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmFsdWUgZnJvbSBmb3JtIG9yIHZhcmlhYmxlXG4gICAqL1xuICBnZXRCb29sZWFuVmFsdWUodmFyaWFibGU6IEFkdmFuY2VkVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmdldEZvcm1Hcm91cEF0KGluZGV4KTtcbiAgICBpZiAoZm9ybUdyb3VwKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk/LnZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHZhcmlhYmxlLnZhbHVlIHx8IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdmFyaWFibGUudmFsdWUgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGJvb2xlYW4gdmFsdWUgY2hhbmdlXG4gICAqL1xuICBvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnZhcmlhYmxlQm9vbGVhbkNoYW5nZS5lbWl0KHsgbmFtZTogdmFyaWFibGVOYW1lLCB2YWx1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFjayBieSBmdW5jdGlvbiBmb3IgbmdGb3JcbiAgICovXG4gIHRyYWNrQnlWYXJpYWJsZShpbmRleDogbnVtYmVyLCB2YXJpYWJsZTogQWR2YW5jZWRWYXJpYWJsZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhcmlhYmxlLm5hbWUgfHwgaW5kZXgudG9TdHJpbmcoKTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC14LTYgY3FhLWdhcC15LTQgY3FhLWZsZXgtd3JhcCBhZHZhbmNlZC12YXJpYWJsZXMtZm9ybVwiPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YXJpYWJsZSBvZiBhZHZhbmNlZFZhcmlhYmxlczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeVZhcmlhYmxlXCI+XG4gICAgPCEtLSBCb29sZWFuIHZhcmlhYmxlcyB3aXRoIG1hdC1zbGlkZS10b2dnbGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCIgc3R5bGU9XCJ3aWR0aDogY2FsYyg1MCUgLSAxMnB4KTtcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICA8L2xhYmVsPlxuICAgICAgPG1hdC1zbGlkZS10b2dnbGUgXG4gICAgICAgIFtjaGVja2VkXT1cImdldEJvb2xlYW5WYWx1ZSh2YXJpYWJsZSwgaSlcIlxuICAgICAgICAoY2hhbmdlKT1cIm9uVmFyaWFibGVCb29sZWFuQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudC5jaGVja2VkKVwiIFxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuIl19
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0vYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0vYWR2YW5jZWQtdmFyaWFibGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBNEIsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQWdCbkUsTUFBTSxPQUFPLDhCQUE4QjtJQVAzQztRQVFXLHNCQUFpQixHQUF1QixFQUFFLENBQUM7UUFDM0MseUJBQW9CLEdBQWMsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbkQsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQW9DLENBQUM7UUFDN0Usd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQWdDLENBQUM7S0FzSmxGO0lBcEpDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQywyQkFBMkI7UUFDM0IsSUFBSSxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxPQUFPLENBQUMsc0JBQXNCLENBQUMsRUFBRTtZQUNuRSxzQ0FBc0M7U0FDdkM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUMsS0FBYTtRQUMxQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLENB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cG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWR2YW5jZWRWYXJpYWJsZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IGJvb2xlYW4gfCBzdHJpbmdbXTtcbiAgdHlwZT86IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkdmFuY2VkLXZhcmlhYmxlcy1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZFZhcmlhYmxlc0Zvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBhZHZhbmNlZFZhcmlhYmxlczogQWR2YW5jZWRWYXJpYWJsZVtdID0gW107XG4gIEBJbnB1dCgpIGFkdmFuY2VkVmFyaWFibGVGb3JtOiBGb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5KFtdKTtcbiAgXG4gIEBPdXRwdXQoKSB2YXJpYWJsZUJvb2xlYW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYm9vbGVhbiB9PigpO1xuICBAT3V0cHV0KCkgdmFyaWFibGVWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnkgfT4oKTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGNoYW5nZXMgaWYgbmVlZGVkXG4gICAgaWYgKGNoYW5nZXNbJ2FkdmFuY2VkVmFyaWFibGVzJ10gfHwgY2hhbmdlc1snYWR2YW5jZWRWYXJpYWJsZUZvcm0nXSkge1xuICAgICAgLy8gRm9ybSBpcyBtYW5hZ2VkIGJ5IHBhcmVudCBjb21wb25lbnRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBGb3JtR3JvdXAgYXQgYSBzcGVjaWZpYyBpbmRleFxuICAgKi9cbiAgZ2V0Rm9ybUdyb3VwQXQoaW5kZXg6IG51bWJlcik6IEZvcm1Hcm91cCB8IG51bGwge1xuICAgIGlmICh0aGlzLmFkdmFuY2VkVmFyaWFibGVGb3JtICYmIGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLmFkdmFuY2VkVmFyaWFibGVGb3JtLmxlbmd0aCkge1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuYWR2YW5jZWRWYXJpYWJsZUZvcm0uYXQoaW5kZXgpO1xuICAgICAgcmV0dXJuIGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXAgPyBjb250cm9sIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBmcm9tIGZvcm0gb3IgdmFyaWFibGVcbiAgICovXG4gIGdldEJvb2xlYW5WYWx1ZSh2YXJpYWJsZTogQWR2YW5jZWRWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZ2V0Rm9ybUdyb3VwQXQoaW5kZXgpO1xuICAgIGlmIChmb3JtR3JvdXApIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZm9ybUdyb3VwLmdldCgndmFsdWUnKT8udmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogKHZhcmlhYmxlLnZhbHVlIGFzIGJvb2xlYW4pIHx8IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKHZhcmlhYmxlLnZhbHVlIGFzIGJvb2xlYW4pIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmFsdWUgZnJvbSBmb3JtIG9yIHZhcmlhYmxlIChmb3Igbm9uLWJvb2xlYW4gdHlwZXMpXG4gICAqL1xuICBnZXRWYWx1ZSh2YXJpYWJsZTogQWR2YW5jZWRWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5nZXRGb3JtR3JvdXBBdChpbmRleCk7XG4gICAgaWYgKGZvcm1Hcm91cCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBmb3JtR3JvdXAuZ2V0KCd2YWx1ZScpPy52YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB2YXJpYWJsZS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhcmlhYmxlLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHZhcmlhYmxlIGlzIGJvb2xlYW4gdHlwZVxuICAgKi9cbiAgaXNCb29sZWFuVHlwZSh2YXJpYWJsZTogQWR2YW5jZWRWYXJpYWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YXJpYWJsZS50eXBlICE9PSAnc3RyX2xpc3QnICYmIHR5cGVvZiB2YXJpYWJsZS52YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHZhcmlhYmxlIGlzIHN0cl9saXN0IHR5cGVcbiAgICovXG4gIGlzU3RyTGlzdFR5cGUodmFyaWFibGU6IEFkdmFuY2VkVmFyaWFibGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFyaWFibGUudHlwZSA9PT0gJ3N0cl9saXN0JztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYm9vbGVhbiB2YWx1ZSBjaGFuZ2VcbiAgICovXG4gIG9uVmFyaWFibGVCb29sZWFuQ2hhbmdlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmFyaWFibGVCb29sZWFuQ2hhbmdlLmVtaXQoeyBuYW1lOiB2YXJpYWJsZU5hbWUsIHZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB2YWx1ZSBjaGFuZ2UgZm9yIG5vbi1ib29sZWFuIHR5cGVzXG4gICAqL1xuICBvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhcmlhYmxlVmFsdWVDaGFuZ2UuZW1pdCh7IG5hbWU6IHZhcmlhYmxlTmFtZSwgdmFsdWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFkZGluZyBhIG5ldyBpdGVtIHRvIHN0cl9saXN0XG4gICAqL1xuICBhZGRTdHJMaXN0SXRlbSh2YXJpYWJsZTogQWR2YW5jZWRWYXJpYWJsZSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZ2V0Rm9ybUdyb3VwQXQoaW5kZXgpO1xuICAgIGlmIChmb3JtR3JvdXApIHtcbiAgICAgIGNvbnN0IHZhbHVlQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk7XG4gICAgICBpZiAodmFsdWVDb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgIHZhbHVlQ29udHJvbC5wdXNoKG5ldyBGb3JtQ29udHJvbCgnJykpO1xuICAgICAgICAvLyBFbWl0IHRoZSB1cGRhdGVkIHZhbHVlXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhbHVlQ29udHJvbC52YWx1ZTtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgY3VycmVudFZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V4cGVjdGVkIEZvcm1BcnJheSBmb3Igc3RyX2xpc3QgdmFyaWFibGUsIGdvdDonLCB2YWx1ZUNvbnRyb2wpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgcmVtb3ZpbmcgYW4gaXRlbSBmcm9tIHN0cl9saXN0XG4gICAqL1xuICByZW1vdmVTdHJMaXN0SXRlbSh2YXJpYWJsZTogQWR2YW5jZWRWYXJpYWJsZSwgaW5kZXg6IG51bWJlciwgaXRlbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmdldEZvcm1Hcm91cEF0KGluZGV4KTtcbiAgICBpZiAoZm9ybUdyb3VwKSB7XG4gICAgICBjb25zdCB2YWx1ZUNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KCd2YWx1ZScpO1xuICAgICAgaWYgKHZhbHVlQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSAmJiBpdGVtSW5kZXggPj0gMCAmJiBpdGVtSW5kZXggPCB2YWx1ZUNvbnRyb2wubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlQ29udHJvbC5yZW1vdmVBdChpdGVtSW5kZXgpO1xuICAgICAgICAvLyBFbWl0IHRoZSB1cGRhdGVkIHZhbHVlXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhbHVlQ29udHJvbC52YWx1ZTtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgY3VycmVudFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN0cl9saXN0IGl0ZW0gdmFsdWUgY2hhbmdlXG4gICAqL1xuICBvblN0ckxpc3RJdGVtQ2hhbmdlKHZhcmlhYmxlOiBBZHZhbmNlZFZhcmlhYmxlLCBpbmRleDogbnVtYmVyLCBpdGVtSW5kZXg6IG51bWJlciwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZ2V0Rm9ybUdyb3VwQXQoaW5kZXgpO1xuICAgIGlmIChmb3JtR3JvdXApIHtcbiAgICAgIGNvbnN0IHZhbHVlQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQoJ3ZhbHVlJyk7XG4gICAgICBpZiAodmFsdWVDb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5ICYmIGl0ZW1JbmRleCA+PSAwICYmIGl0ZW1JbmRleCA8IHZhbHVlQ29udHJvbC5sZW5ndGgpIHtcbiAgICAgICAgLy8gVXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIGNoYW5nZSBkZXRlY3Rpb24gdGhhdCBjYXVzZXMgZm9jdXMgbG9zc1xuICAgICAgICB2YWx1ZUNvbnRyb2wuYXQoaXRlbUluZGV4KS5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAvLyBFbWl0IHRoZSB1cGRhdGVkIHZhbHVlIGFmdGVyIGEgc2hvcnQgZGVsYXkgdG8gYXZvaWQgZm9jdXMgaXNzdWVzXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhbHVlQ29udHJvbC52YWx1ZTtcbiAgICAgICAgICB0aGlzLm9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZS5uYW1lLCBjdXJyZW50VmFsdWUpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IEZvcm1BcnJheSBmb3Igc3RyX2xpc3QgdmFyaWFibGVcbiAgICovXG4gIGdldFN0ckxpc3RGb3JtQXJyYXkodmFyaWFibGU6IEFkdmFuY2VkVmFyaWFibGUsIGluZGV4OiBudW1iZXIpOiBGb3JtQXJyYXkgfCBudWxsIHtcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmdldEZvcm1Hcm91cEF0KGluZGV4KTtcbiAgICBpZiAoZm9ybUdyb3VwKSB7XG4gICAgICBjb25zdCBmb3JtQXJyYXkgPSBmb3JtR3JvdXAuZ2V0KCd2YWx1ZScpO1xuICAgICAgcmV0dXJuIGZvcm1BcnJheSBpbnN0YW5jZW9mIEZvcm1BcnJheSA/IGZvcm1BcnJheSA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrIGJ5IGZ1bmN0aW9uIGZvciBuZ0ZvclxuICAgKi9cbiAgdHJhY2tCeVZhcmlhYmxlKGluZGV4OiBudW1iZXIsIHZhcmlhYmxlOiBBZHZhbmNlZFZhcmlhYmxlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFyaWFibGUubmFtZSB8fCBpbmRleC50b1N0cmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrIGJ5IGZ1bmN0aW9uIGZvciBmb3JtIGNvbnRyb2xzIGluIHN0cl9saXN0XG4gICAqL1xuICB0cmFja0J5Q29udHJvbChpbmRleDogbnVtYmVyLCBjb250cm9sOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBjb250cm9sIHx8IGluZGV4O1xuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLXgtNiBjcWEtZ2FwLXktNCBjcWEtZmxleC13cmFwIGFkdmFuY2VkLXZhcmlhYmxlcy1mb3JtIGNxYS1tYi00XCI+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmlhYmxlIG9mIGFkdmFuY2VkVmFyaWFibGVzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5VmFyaWFibGVcIj5cbiAgICA8IS0tIEJvb2xlYW4gdmFyaWFibGVzIHdpdGggbWF0LXNsaWRlLXRvZ2dsZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNCb29sZWFuVHlwZSh2YXJpYWJsZSlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgXG4gICAgICAgICAgW2NoZWNrZWRdPVwiZ2V0Qm9vbGVhblZhbHVlKHZhcmlhYmxlLCBpKVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZS5uYW1lLCAkZXZlbnQuY2hlY2tlZClcIiBcbiAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY2FwaXRhbGl6ZS1maXJzdFwiPlxuICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gc3RyX2xpc3QgdmFyaWFibGVzIHdpdGggZHluYW1pYyBsaXN0IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1N0ckxpc3RUeXBlKHZhcmlhYmxlKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMSBjYXBpdGFsaXplLWZpcnN0XCI+XG4gICAgICAgICAge3sgdmFyaWFibGUubGFiZWwgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0U3RyTGlzdEZvcm1BcnJheSh2YXJpYWJsZSwgaSkgYXMgZm9ybUFycmF5XCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb250cm9sIG9mIGZvcm1BcnJheS5jb250cm9sczsgbGV0IGl0ZW1JbmRleCA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Q29udHJvbFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC0yIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidFbnRlciBsb2NhdG9yJ1wiIFxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb250cm9sLnZhbHVlXCIgXG4gICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TdHJMaXN0SXRlbUNoYW5nZSh2YXJpYWJsZSwgaSwgaXRlbUluZGV4LCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdGV4dC1yZWQtNjAwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKGNsaWNrKT1cInJlbW92ZVN0ckxpc3RJdGVtKHZhcmlhYmxlLCBpLCBpdGVtSW5kZXgpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOiAyNHB4O1wiPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbUluZGV4ID09PSBmb3JtQXJyYXkubGVuZ3RoIC0gMVwiIGNsYXNzPVwiY3FhLWN1cnNvci1wb2ludGVyIGNxYS10ZXh0LWJsdWUtNjAwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKGNsaWNrKT1cImFkZFN0ckxpc3RJdGVtKHZhcmlhYmxlLCBpKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZTogMjRweDtcIj5hZGQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG4iXX0=