fx-form-builder-wrapper 2.0.63 → 2.0.64
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/esm2022/lib/components/date-picker/date-picker.component.mjs +13 -14
- package/esm2022/lib/components/dropdown-with-other/dropdown-with-other.component.mjs +35 -10
- package/esm2022/lib/components/fx-form-component/fx-form-component.component.mjs +4 -2
- package/esm2022/lib/components/radio-group/radio-group.component.mjs +112 -0
- package/esm2022/lib/components/uploader/uploader.component.mjs +4 -2
- package/esm2022/lib/fx-builder-wrapper.component.mjs +5 -1
- package/fesm2022/fx-form-builder-wrapper.mjs +156 -26
- package/fesm2022/fx-form-builder-wrapper.mjs.map +1 -1
- package/lib/components/dropdown-with-other/dropdown-with-other.component.d.ts +3 -1
- package/lib/components/radio-group/radio-group.component.d.ts +31 -0
- package/package.json +1 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Component, inject, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
3
|
+
import { FxBaseComponent, FxComponent, FxOptionSetting, FxStringSetting } from '@instantsys-labs/fx';
|
|
4
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
5
|
+
import { CommonModule } from '@angular/common';
|
|
6
|
+
import { CalendarModule } from 'primeng/calendar';
|
|
7
|
+
import { RadioButtonModule } from 'primeng/radiobutton';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/common/http";
|
|
10
|
+
import * as i2 from "../../fx-builder-wrapper.service";
|
|
11
|
+
import * as i3 from "@instantsys-labs/core";
|
|
12
|
+
import * as i4 from "@angular/common";
|
|
13
|
+
import * as i5 from "@angular/forms";
|
|
14
|
+
export class RadioGroupComponent extends FxBaseComponent {
|
|
15
|
+
cdr;
|
|
16
|
+
http;
|
|
17
|
+
fxBuilderWrapperService;
|
|
18
|
+
fxApiService;
|
|
19
|
+
fb = inject(FormBuilder);
|
|
20
|
+
destroy$ = new Subject();
|
|
21
|
+
formObject = {};
|
|
22
|
+
showOnSelection = 'yes'; // configurable: show textarea on Yes or No
|
|
23
|
+
showTextArea = false;
|
|
24
|
+
confirmationForm = this.fb.group({
|
|
25
|
+
confirmation: [''],
|
|
26
|
+
remarks: ['']
|
|
27
|
+
});
|
|
28
|
+
options = [
|
|
29
|
+
{ option: 'Yes', value: 'YES' },
|
|
30
|
+
{ option: 'No', value: 'NO' },
|
|
31
|
+
{ option: 'NA', value: 'NA' }
|
|
32
|
+
];
|
|
33
|
+
fxComponent;
|
|
34
|
+
constructor(cdr, http, fxBuilderWrapperService, fxApiService) {
|
|
35
|
+
super(cdr);
|
|
36
|
+
this.cdr = cdr;
|
|
37
|
+
this.http = http;
|
|
38
|
+
this.fxBuilderWrapperService = fxBuilderWrapperService;
|
|
39
|
+
this.fxApiService = fxApiService;
|
|
40
|
+
this.onInit.subscribe(() => {
|
|
41
|
+
this._register(this.confirmationForm);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
ngAfterViewInit() {
|
|
45
|
+
this.options = this.fxComponent?.fxData?.settings?.find((s) => s.key === 'items')?.options || [];
|
|
46
|
+
setTimeout(() => {
|
|
47
|
+
this.confirmationForm.patchValue(this.formObject);
|
|
48
|
+
console.log('Patched formObject:', this.fxComponent);
|
|
49
|
+
}, 100);
|
|
50
|
+
}
|
|
51
|
+
ngOnInit() {
|
|
52
|
+
this.fxBuilderWrapperService.variables$
|
|
53
|
+
.pipe(takeUntil(this.destroy$))
|
|
54
|
+
.subscribe((variables) => {
|
|
55
|
+
if (!variables)
|
|
56
|
+
return;
|
|
57
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
58
|
+
if (key.includes('radio-group-custom')) {
|
|
59
|
+
this.formObject = value;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
this.options = this.fxComponent?.fxData?.settings?.find((s) => s.key === 'items')?.options || [];
|
|
64
|
+
// this.setting('items').length > 0 ? this.options = this.setting('items') : null;
|
|
65
|
+
// this.dropDownForm.get('selectedOption')?.valueChanges.subscribe(value => {
|
|
66
|
+
// const otherControl = this.dropDownForm.get('otherInput');
|
|
67
|
+
// if (value === 'other') {
|
|
68
|
+
// otherControl?.enable();
|
|
69
|
+
// } else {
|
|
70
|
+
// otherControl?.disable();
|
|
71
|
+
// otherControl?.reset();
|
|
72
|
+
// }
|
|
73
|
+
// });
|
|
74
|
+
}
|
|
75
|
+
settings() {
|
|
76
|
+
return [
|
|
77
|
+
// new FxStringSetting({ key: 'clinicalNotesURL', $title: 'API Url', value: '' }),
|
|
78
|
+
// new FxStringSetting({ key: 'customClass', $title: 'Custom Class Name', value: '' }),
|
|
79
|
+
new FxStringSetting({ key: 'select-label', $title: 'Header Label', value: 'Header Label' }),
|
|
80
|
+
// new FxStringSetting({ key: 'option-value-one', $title: 'Value one', value: 'Value one' }),
|
|
81
|
+
// new FxStringSetting({ key: 'option-value-two', $title: 'Value two', value: 'Value two' }),
|
|
82
|
+
// new FxStringSetting({ key: 'option-label-one', $title: 'Label one', value: 'Label one' }),
|
|
83
|
+
// new FxStringSetting({ key: 'option-label-two', $title: 'Label two', value: 'Label two' }),
|
|
84
|
+
new FxStringSetting({ key: 'value-show-text', $title: 'Value to show textarea', value: 'Value to show textarea' }),
|
|
85
|
+
new FxOptionSetting({ key: 'items', $title: 'Options', value: [{ option: 'Yes', value: 'yes' }, { option: 'No', value: 'no' }] }, [{ option: 'Yes', value: 'yes' }, { option: 'No', value: 'no' }]),
|
|
86
|
+
// new FxStringSetting({ key: 'other-label', $title: 'Other Label', value: '' }),
|
|
87
|
+
// new FxStringSetting({ key: 'other-placeholder', $title: 'Other Placeholder', value: '' }),
|
|
88
|
+
// new FxSelectSetting({key: 'serviceName', $title: 'Service', value: ''}, [{option: 'User Service', value: 'user_service'}, {option: 'Patient Service', value: 'patient_service'},{option: 'Workflow Service', value: 'workflow_service'}]),
|
|
89
|
+
// // new FxSelectSetting({key: 'service', $title: 'Service', value: 'local'}, [{option: 'Local', value: 'local'}, {option: 'QA', value: 'qa'},{option: 'UAT', value: 'uat'},{option: 'Production', value: 'prod'}]),
|
|
90
|
+
// // new FxSelectSetting({key: 'isRequired', $title: 'Required', value: true}, [{option: 'Yes', value: true}, {option: 'No', value: false}]),
|
|
91
|
+
// new FxStringSetting({ key: 'errorMessage', $title: 'Error Message', value: 'Please fill out the field' }),
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
validations() {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
onSelectionChange(selection) {
|
|
98
|
+
this.showTextArea = selection === this.setting('value-show-text');
|
|
99
|
+
}
|
|
100
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadioGroupComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.HttpClient }, { token: i2.FxBuilderWrapperService }, { token: i3.ApiServiceRegistry }], target: i0.ɵɵFactoryTarget.Component });
|
|
101
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RadioGroupComponent, isStandalone: true, selector: "radio-group-custom", inputs: { showOnSelection: "showOnSelection" }, viewQueries: [{ propertyName: "fxComponent", first: true, predicate: ["fxComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\r\n<fx-component [fxData]=\"fxData\" #fxComponent>\r\n\r\n\r\n\r\n<form [formGroup]=\"confirmationForm\" class=\"flex flex-col gap-2\">\r\n <!-- Heading -->\r\n <label class=\"font-semibold mb-1\">{{ setting('select-label') }}</label>\r\n\r\n <!-- Radio buttons + textarea in same row -->\r\n <div class=\"flex items-center gap-4\">\r\n <!-- Dynamic radio buttons -->\r\n <div class=\"flex items-center gap-3\">\r\n <label\r\n *ngFor=\"let opt of options\"\r\n class=\"flex items-center gap-1 cursor-pointer\"\r\n >\r\n <input\r\n type=\"radio\"\r\n formControlName=\"confirmation\"\r\n [value]=\"opt.value\"\r\n (change)=\"onSelectionChange(opt.value)\"\r\n class=\"accent-blue-600\"\r\n />\r\n <span>{{ opt.option }}</span>\r\n </label>\r\n </div>\r\n\r\n <!-- Textarea (inline with radios) -->\r\n <textarea\r\n *ngIf=\"showTextArea\"\r\n formControlName=\"remarks\"\r\n rows=\"2\"\r\n placeholder=\"Enter details...\"\r\n class=\"border border-gray-300 rounded-md p-2 w-64 resize-none focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n ></textarea>\r\n </div>\r\n</form>\r\n\r\n\r\n\r\n</fx-component>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: FxComponent, selector: "fx-component", inputs: ["fxData"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "ngmodule", type: RadioButtonModule }] });
|
|
102
|
+
}
|
|
103
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadioGroupComponent, decorators: [{
|
|
104
|
+
type: Component,
|
|
105
|
+
args: [{ selector: 'radio-group-custom', standalone: true, imports: [CommonModule, ReactiveFormsModule, FormsModule, FxComponent, CalendarModule, RadioButtonModule], template: "\r\n<fx-component [fxData]=\"fxData\" #fxComponent>\r\n\r\n\r\n\r\n<form [formGroup]=\"confirmationForm\" class=\"flex flex-col gap-2\">\r\n <!-- Heading -->\r\n <label class=\"font-semibold mb-1\">{{ setting('select-label') }}</label>\r\n\r\n <!-- Radio buttons + textarea in same row -->\r\n <div class=\"flex items-center gap-4\">\r\n <!-- Dynamic radio buttons -->\r\n <div class=\"flex items-center gap-3\">\r\n <label\r\n *ngFor=\"let opt of options\"\r\n class=\"flex items-center gap-1 cursor-pointer\"\r\n >\r\n <input\r\n type=\"radio\"\r\n formControlName=\"confirmation\"\r\n [value]=\"opt.value\"\r\n (change)=\"onSelectionChange(opt.value)\"\r\n class=\"accent-blue-600\"\r\n />\r\n <span>{{ opt.option }}</span>\r\n </label>\r\n </div>\r\n\r\n <!-- Textarea (inline with radios) -->\r\n <textarea\r\n *ngIf=\"showTextArea\"\r\n formControlName=\"remarks\"\r\n rows=\"2\"\r\n placeholder=\"Enter details...\"\r\n class=\"border border-gray-300 rounded-md p-2 w-64 resize-none focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n ></textarea>\r\n </div>\r\n</form>\r\n\r\n\r\n\r\n</fx-component>\r\n" }]
|
|
106
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.HttpClient }, { type: i2.FxBuilderWrapperService }, { type: i3.ApiServiceRegistry }], propDecorators: { showOnSelection: [{
|
|
107
|
+
type: Input
|
|
108
|
+
}], fxComponent: [{
|
|
109
|
+
type: ViewChild,
|
|
110
|
+
args: ['fxComponent']
|
|
111
|
+
}] } });
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZngtYnVpbGRlci13cmFwcGVyL3NyYy9saWIvY29tcG9uZW50cy9yYWRpby1ncm91cC9yYWRpby1ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9meC1idWlsZGVyLXdyYXBwZXIvc3JjL2xpYi9jb21wb25lbnRzL3JhZGlvLWdyb3VwL3JhZGlvLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUE4QixlQUFlLEVBQW9DLE1BQU0scUJBQXFCLENBQUM7QUFDbkssT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQVN4RCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsZUFBZTtJQW1CaEM7SUFBK0I7SUFBeUI7SUFBeUQ7SUFsQmpJLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekIsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7SUFDMUMsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUNmLGVBQWUsR0FBaUIsS0FBSyxDQUFDLENBQUMs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QUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFDLGlCQUFpQixDQUFDO3NMQVFqRyxlQUFlO3NCQUF2QixLQUFLO2dCQWF3QixXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBpbmplY3QsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJ0BpbnN0YW50c3lzLWxhYnMvY29yZSc7XHJcbmltcG9ydCB7IEZ4QmFzZUNvbXBvbmVudCwgRnhDb21wb25lbnQsIEZ4T3B0aW9uU2V0dGluZywgRnhTZWxlY3RTZXR0aW5nLCBGeFNldHRpbmcsIEZ4U3RyaW5nU2V0dGluZywgRnhWYWxpZGF0aW9uLCBGeFZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICdAaW5zdGFudHN5cy1sYWJzL2Z4JztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZngtYnVpbGRlci13cmFwcGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDYWxlbmRhck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY2FsZW5kYXInO1xyXG5pbXBvcnQgeyBSYWRpb0J1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcmFkaW9idXR0b24nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdyYWRpby1ncm91cC1jdXN0b20nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybXNNb2R1bGUsIEZ4Q29tcG9uZW50LCBDYWxlbmRhck1vZHVsZSxSYWRpb0J1dHRvbk1vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JhZGlvLWdyb3VwLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vcmFkaW8tZ3JvdXAuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFJhZGlvR3JvdXBDb21wb25lbnQgZXh0ZW5kcyBGeEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXR7XHJcbnByaXZhdGUgZmIgPSBpbmplY3QoRm9ybUJ1aWxkZXIpO1xyXG5wcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Qm9vbGVhbj4oKTtcclxuZm9ybU9iamVjdDogb2JqZWN0ID0ge307XHJcbkBJbnB1dCgpIHNob3dPblNlbGVjdGlvbjogJ3llcycgfCAnbm8nID0gJ3llcyc7IC8vIGNvbmZpZ3VyYWJsZTogc2hvdyB0ZXh0YXJlYSBvbiBZZXMgb3IgTm9cclxuICBzaG93VGV4dEFyZWEgPSBmYWxzZTtcclxuIHB1YmxpYyBjb25maXJtYXRpb25Gb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGNvbmZpcm1hdGlvbjogWycnXSxcclxuICAgICAgcmVtYXJrczogWycnXVxyXG4gICAgfSk7XHJcblxyXG4gICAgb3B0aW9uczogYW55W10gPSBbXHJcbiAgICAgIHsgb3B0aW9uOiAnWWVzJywgdmFsdWU6ICdZRVMnIH0sXHJcbiAgICAgIHsgb3B0aW9uOiAnTm8nLCB2YWx1ZTogJ05PJyB9LFxyXG4gICAgICB7IG9wdGlvbjogJ05BJywgdmFsdWU6ICdOQScgfVxyXG4gICAgXTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdmeENvbXBvbmVudCcpIGZ4Q29tcG9uZW50ITogRnhDb21wb25lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxwcml2YXRlIGZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlOiBGeEJ1aWxkZXJXcmFwcGVyU2VydmljZSxwcml2YXRlIGZ4QXBpU2VydmljZTogQXBpU2VydmljZVJlZ2lzdHJ5KSB7XHJcbiAgICAgICBzdXBlcihjZHIpXHJcbiAgICAgICAgdGhpcy5vbkluaXQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyKHRoaXMuY29uZmlybWF0aW9uRm9ybSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICBcclxuICAgICB9XHJcblxyXG4gICAgICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyAgPSAodGhpcy5meENvbXBvbmVudD8uZnhEYXRhPy5zZXR0aW5ncz8uZmluZCgoczogYW55KSA9PiBzLmtleSA9PT0gJ2l0ZW1zJykgYXMgYW55KT8ub3B0aW9ucyB8fCBbXTtcclxuICAgICAgICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgICB0aGlzLmNvbmZpcm1hdGlvbkZvcm0ucGF0Y2hWYWx1ZSh0aGlzLmZvcm1PYmplY3QpO1xyXG4gICAgICBjb25zb2xlLmxvZygnUGF0Y2hlZCBmb3JtT2JqZWN0OicsIHRoaXMuZnhDb21wb25lbnQpO1xyXG4gICAgICAgICB9LDEwMClcclxuXHJcbiAgICAgICAgXHJcbiAgICAgICB9XHJcbiAgICAgXHJcbiAgICAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICAgICB0aGlzLmZ4QnVpbGRlcldyYXBwZXJTZXJ2aWNlLnZhcmlhYmxlcyRcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKHZhcmlhYmxlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdmFyaWFibGVzKSByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykgYXMgW3N0cmluZywgYW55XVtdKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGtleS5pbmNsdWRlcygncmFkaW8tZ3JvdXAtY3VzdG9tJykpIHtcclxuICAgICAgICAgICAgICAgdGhpcy5mb3JtT2JqZWN0ID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICB9KVxyXG5cclxuICAgICAgICB0aGlzLm9wdGlvbnMgID0gKHRoaXMuZnhDb21wb25lbnQ/LmZ4RGF0YT8uc2V0dGluZ3M/LmZpbmQoKHM6IGFueSkgPT4gcy5rZXkgPT09ICdpdGVtcycpIGFzIGFueSk/Lm9wdGlvbnMgfHwgW107XHJcblxyXG5cclxuICAgICAgLy8gIHRoaXMuc2V0dGluZygnaXRlbXMnKS5sZW5ndGggPiAwID8gdGhpcy5vcHRpb25zID0gdGhpcy5zZXR0aW5nKCdpdGVtcycpIDogbnVsbDtcclxuICAgICBcclxuICAgICAgIC8vICB0aGlzLmRyb3BEb3duRm9ybS5nZXQoJ3NlbGVjdGVkT3B0aW9uJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgLy8gICBjb25zdCBvdGhlckNvbnRyb2wgPSB0aGlzLmRyb3BEb3duRm9ybS5nZXQoJ290aGVySW5wdXQnKTtcclxuICAgICAgIC8vICAgaWYgKHZhbHVlID09PSAnb3RoZXInKSB7XHJcbiAgICAgICAvLyAgICAgb3RoZXJDb250cm9sPy5lbmFibGUoKTtcclxuICAgICAgIC8vICAgfSBlbHNlIHtcclxuICAgICAgIC8vICAgICBvdGhlckNvbnRyb2w/LmRpc2FibGUoKTtcclxuICAgICAgIC8vICAgICBvdGhlckNvbnRyb2w/LnJlc2V0KCk7XHJcbiAgICAgICAvLyAgIH1cclxuICAgICAgIC8vIH0pO1xyXG4gICAgICAgXHJcbiAgICAgXHJcbiAgICAgfVxyXG5cclxuICAgICBwcm90ZWN0ZWQgc2V0dGluZ3MoKTogRnhTZXR0aW5nW10ge1xyXG4gICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgLy8gbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ2NsaW5pY2FsTm90ZXNVUkwnLCAkdGl0bGU6ICdBUEkgVXJsJywgdmFsdWU6ICcnIH0pLFxyXG4gICAgICAgICAgICAvLyBuZXcgRnhTdHJpbmdTZXR0aW5nKHsga2V5OiAnY3VzdG9tQ2xhc3MnLCAkdGl0bGU6ICdDdXN0b20gQ2xhc3MgTmFtZScsIHZhbHVlOiAnJyB9KSxcclxuICAgICAgICAgICAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdzZWxlY3QtbGFiZWwnLCAkdGl0bGU6ICdIZWFkZXIgTGFiZWwnLCB2YWx1ZTogJ0hlYWRlciBMYWJlbCcgfSksIFxyXG4gICAgICAgICAgICAgIC8vIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdvcHRpb24tdmFsdWUtb25lJywgJHRpdGxlOiAnVmFsdWUgb25lJywgdmFsdWU6ICdWYWx1ZSBvbmUnIH0pLCBcclxuICAgICAgICAgICAgICAvLyAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ29wdGlvbi12YWx1ZS10d28nLCAkdGl0bGU6ICdWYWx1ZSB0d28nLCB2YWx1ZTogJ1ZhbHVlIHR3bycgfSksIFxyXG4gICAgICAgICAgICAgIC8vICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ29wdGlvbi1sYWJlbC1vbmUnLCAkdGl0bGU6ICdMYWJlbCBvbmUnLCB2YWx1ZTogJ0xhYmVsIG9uZScgfSksIFxyXG4gICAgICAgICAgICAgIC8vICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ29wdGlvbi1sYWJlbC10d28nLCAkdGl0bGU6ICdMYWJlbCB0d28nLCB2YWx1ZTogJ0xhYmVsIHR3bycgfSksIFxyXG4gICAgICAgICAgICAgICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ3ZhbHVlLXNob3ctdGV4dCcsICR0aXRsZTogJ1ZhbHVlIHRvIHNob3cgdGV4dGFyZWEnLCB2YWx1ZTogJ1ZhbHVlIHRvIHNob3cgdGV4dGFyZWEnIH0pLFxyXG4gICAgICAgICAgICAgICAgIG5ldyBGeE9wdGlvblNldHRpbmcoeyBrZXk6ICdpdGVtcycsICR0aXRsZTogJ09wdGlvbnMnLCB2YWx1ZTogW3tvcHRpb246ICdZZXMnLCB2YWx1ZTogJ3llcyd9LCB7b3B0aW9uOiAnTm8nLCB2YWx1ZTogJ25vJ31dICB9LCBbe29wdGlvbjogJ1llcycsIHZhbHVlOiAneWVzJ30sIHtvcHRpb246ICdObycsIHZhbHVlOiAnbm8nfV0pLCBcclxuICAgICAgICAgICAgLy8gIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdvdGhlci1sYWJlbCcsICR0aXRsZTogJ090aGVyIExhYmVsJywgdmFsdWU6ICcnIH0pLFxyXG4gICAgICAgICAgICAvLyAgIG5ldyBGeFN0cmluZ1NldHRpbmcoeyBrZXk6ICdvdGhlci1wbGFjZWhvbGRlcicsICR0aXRsZTogJ090aGVyIFBsYWNlaG9sZGVyJywgdmFsdWU6ICcnIH0pLCAgXHJcbiAgICAgICAgICAgIC8vICAgbmV3IEZ4U2VsZWN0U2V0dGluZyh7a2V5OiAnc2VydmljZU5hbWUnLCAkdGl0bGU6ICdTZXJ2aWNlJywgdmFsdWU6ICcnfSwgW3tvcHRpb246ICdVc2VyIFNlcnZpY2UnLCB2YWx1ZTogJ3VzZXJfc2VydmljZSd9LCB7b3B0aW9uOiAnUGF0aWVudCBTZXJ2aWNlJywgdmFsdWU6ICdwYXRpZW50X3NlcnZpY2UnfSx7b3B0aW9uOiAnV29ya2Zsb3cgU2VydmljZScsIHZhbHVlOiAnd29ya2Zsb3dfc2VydmljZSd9XSksXHJcbiAgICAgICAgICAgIC8vICAgLy8gbmV3IEZ4U2VsZWN0U2V0dGluZyh7a2V5OiAnc2VydmljZScsICR0aXRsZTogJ1NlcnZpY2UnLCB2YWx1ZTogJ2xvY2FsJ30sIFt7b3B0aW9uOiAnTG9jYWwnLCB2YWx1ZTogJ2xvY2FsJ30sIHtvcHRpb246ICdRQScsIHZhbHVlOiAncWEnfSx7b3B0aW9uOiAnVUFUJywgdmFsdWU6ICd1YXQnfSx7b3B0aW9uOiAnUHJvZHVjdGlvbicsIHZhbHVlOiAncHJvZCd9XSksICAgXHJcbiAgICAgICAgICAgIC8vICAgLy8gbmV3IEZ4U2VsZWN0U2V0dGluZyh7a2V5OiAnaXNSZXF1aXJlZCcsICR0aXRsZTogJ1JlcXVpcmVkJywgdmFsdWU6IHRydWV9LCBbe29wdGlvbjogJ1llcycsIHZhbHVlOiB0cnVlfSwge29wdGlvbjogJ05vJywgdmFsdWU6IGZhbHNlfV0pLCAgICBcclxuICAgICAgICAgICAgLy8gICAgbmV3IEZ4U3RyaW5nU2V0dGluZyh7IGtleTogJ2Vycm9yTWVzc2FnZScsICR0aXRsZTogJ0Vycm9yIE1lc3NhZ2UnLCB2YWx1ZTogJ1BsZWFzZSBmaWxsIG91dCB0aGUgZmllbGQnIH0pLCAgXHJcbiAgICAgICAgICBdO1xyXG4gICAgICAgIH1cclxuICAgICAgXHJcbiAgICAgICAgcHJvdGVjdGVkIHZhbGlkYXRpb25zKCk6IEZ4VmFsaWRhdGlvbltdIHtcclxuICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGlvbjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNob3dUZXh0QXJlYSA9IHNlbGVjdGlvbiA9PT0gdGhpcy5zZXR0aW5nKCd2YWx1ZS1zaG93LXRleHQnKTtcclxuICB9XHJcbn1cclxuIiwiXHJcbjxmeC1jb21wb25lbnQgW2Z4RGF0YV09XCJmeERhdGFcIiAjZnhDb21wb25lbnQ+XHJcblxyXG5cclxuXHJcbjxmb3JtIFtmb3JtR3JvdXBdPVwiY29uZmlybWF0aW9uRm9ybVwiIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxyXG4gIDwhLS0gSGVhZGluZyAtLT5cclxuICA8bGFiZWwgY2xhc3M9XCJmb250LXNlbWlib2xkIG1iLTFcIj57eyBzZXR0aW5nKCdzZWxlY3QtbGFiZWwnKSB9fTwvbGFiZWw+XHJcblxyXG4gIDwhLS0gUmFkaW8gYnV0dG9ucyArIHRleHRhcmVhIGluIHNhbWUgcm93IC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNFwiPlxyXG4gICAgPCEtLSBEeW5hbWljIHJhZGlvIGJ1dHRvbnMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTNcIj5cclxuICAgICAgPGxhYmVsXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IG9wdCBvZiBvcHRpb25zXCJcclxuICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbmZpcm1hdGlvblwiXHJcbiAgICAgICAgICBbdmFsdWVdPVwib3B0LnZhbHVlXCJcclxuICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2Uob3B0LnZhbHVlKVwiXHJcbiAgICAgICAgICBjbGFzcz1cImFjY2VudC1ibHVlLTYwMFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8c3Bhbj57eyBvcHQub3B0aW9uIH19PC9zcGFuPlxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBUZXh0YXJlYSAoaW5saW5lIHdpdGggcmFkaW9zKSAtLT5cclxuICAgIDx0ZXh0YXJlYVxyXG4gICAgICAqbmdJZj1cInNob3dUZXh0QXJlYVwiXHJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlbWFya3NcIlxyXG4gICAgICByb3dzPVwiMlwiXHJcbiAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgZGV0YWlscy4uLlwiXHJcbiAgICAgIGNsYXNzPVwiYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkLW1kIHAtMiB3LTY0IHJlc2l6ZS1ub25lIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1ibHVlLTUwMFwiXHJcbiAgICA+PC90ZXh0YXJlYT5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG5cclxuXHJcblxyXG48L2Z4LWNvbXBvbmVudD5cclxuIl19
|