@cqa-lib/cqa-ui 1.1.225 → 1.1.227

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 (23) hide show
  1. package/esm2020/lib/simulator/simulator.component.mjs +28 -45
  2. package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +267 -44
  3. package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +183 -41
  4. package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +44 -3
  5. package/esm2020/lib/step-builder/template-variables-form/template-variables-form.component.mjs +218 -57
  6. package/esm2020/lib/test-case-details/element-popup/element-form/element-form.component.mjs +277 -0
  7. package/esm2020/lib/test-case-details/element-popup/element-popup.component.mjs +32 -192
  8. package/esm2020/lib/ui-kit.module.mjs +6 -1
  9. package/esm2020/public-api.mjs +2 -1
  10. package/fesm2015/cqa-lib-cqa-ui.mjs +1118 -444
  11. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  12. package/fesm2020/cqa-lib-cqa-ui.mjs +1103 -440
  13. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  14. package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +50 -4
  15. package/lib/step-builder/step-builder-condition/step-builder-condition.component.d.ts +39 -2
  16. package/lib/step-builder/step-builder-loop/step-builder-loop.component.d.ts +17 -1
  17. package/lib/step-builder/template-variables-form/template-variables-form.component.d.ts +56 -5
  18. package/lib/test-case-details/element-popup/element-form/element-form.component.d.ts +77 -0
  19. package/lib/test-case-details/element-popup/element-popup.component.d.ts +13 -32
  20. package/lib/ui-kit.module.d.ts +42 -41
  21. package/package.json +1 -1
  22. package/public-api.d.ts +1 -0
  23. package/styles.css +1 -1
@@ -36,6 +36,21 @@ export class StepBuilderLoopComponent {
36
36
  this.whileTemplates = [];
37
37
  this.whileSearchPlaceholder = 'Search While';
38
38
  this.whileSearchValue = '';
39
+ // Element fetching properties
40
+ this.elementOptions = [];
41
+ this.hasMoreElements = false;
42
+ this.isLoadingElements = false;
43
+ // Screen name fetching properties
44
+ this.screenNameOptions = [];
45
+ this.hasMoreScreenNames = false;
46
+ this.isLoadingScreenNames = false;
47
+ this.loadMoreElements = new EventEmitter();
48
+ this.searchElements = new EventEmitter();
49
+ this.createElement = new EventEmitter();
50
+ this.searchScreenName = new EventEmitter();
51
+ this.loadMoreScreenNames = new EventEmitter();
52
+ this.createScreenNameRequest = new EventEmitter();
53
+ this.cancelElementForm = new EventEmitter();
39
54
  this.selectedWhileTemplate = null;
40
55
  this.selectedLoopType = 'for';
41
56
  // Internal state for managing loop indices
@@ -379,10 +394,10 @@ export class StepBuilderLoopComponent {
379
394
  }
380
395
  }
381
396
  StepBuilderLoopComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderLoopComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
382
- StepBuilderLoopComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderLoopComponent, selector: "cqa-step-builder-loop", inputs: { loopType: "loopType", selectOptions: "selectOptions", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", setWhileTemplateVariables: "setWhileTemplateVariables", whileTemplates: "whileTemplates", whileSearchPlaceholder: "whileSearchPlaceholder", whileSearchValue: "whileSearchValue" }, outputs: { createStep: "createStep", cancelled: "cancelled", loopTypeChange: "loopTypeChange", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Loop Test Step\n </h2>\n\n <!-- Loop Type Selection -->\n <div class=\"cqa-mb-4 cqa-w-full\">\n <div class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <!-- For Button -->\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'for' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'for' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('for')\">\n For\n </button>\n <!-- While Button -->\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'while' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'while' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('while')\">\n While\n </button>\n </div>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action [showHeader]=\"false\" [templates]=\"whileTemplates\" [setTemplateVariables]=\"setWhileTemplateVariables\" [searchPlaceholder]=\"whileSearchPlaceholder\" (templateChanged)=\"selectWhileTemplate($event)\" (createStep)=\"createWhileStep($event)\"></cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n text=\"Create Step\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", components: [{ type: i1.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { 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.StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: ["showHeader", "templates", "searchPlaceholder", "setTemplateVariables", "preventSelectTemplate"], outputs: ["templateChanged", "createStep", "cancelled"] }, { type: i4.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
397
+ StepBuilderLoopComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderLoopComponent, selector: "cqa-step-builder-loop", inputs: { loopType: "loopType", selectOptions: "selectOptions", dataProfileOptions: "dataProfileOptions", hasMoreDataProfiles: "hasMoreDataProfiles", isLoadingDataProfiles: "isLoadingDataProfiles", setWhileTemplateVariables: "setWhileTemplateVariables", whileTemplates: "whileTemplates", whileSearchPlaceholder: "whileSearchPlaceholder", whileSearchValue: "whileSearchValue", elementOptions: "elementOptions", hasMoreElements: "hasMoreElements", isLoadingElements: "isLoadingElements", screenNameOptions: "screenNameOptions", hasMoreScreenNames: "hasMoreScreenNames", isLoadingScreenNames: "isLoadingScreenNames" }, outputs: { createStep: "createStep", cancelled: "cancelled", loopTypeChange: "loopTypeChange", loadMoreDataProfiles: "loadMoreDataProfiles", searchDataProfiles: "searchDataProfiles", loadMoreElements: "loadMoreElements", searchElements: "searchElements", createElement: "createElement", searchScreenName: "searchScreenName", loadMoreScreenNames: "loadMoreScreenNames", createScreenNameRequest: "createScreenNameRequest", cancelElementForm: "cancelElementForm" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Loop Test Step\n </h2>\n\n <!-- Loop Type Selection -->\n <div class=\"cqa-mb-4 cqa-w-full\">\n <div class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <!-- For Button -->\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'for' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'for' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('for')\">\n For\n </button>\n <!-- While Button -->\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'while' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'while' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('while')\">\n While\n </button>\n </div>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action \n [showHeader]=\"false\" \n [templates]=\"whileTemplates\" \n [setTemplateVariables]=\"setWhileTemplateVariables\" \n [searchPlaceholder]=\"whileSearchPlaceholder\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n (templateChanged)=\"selectWhileTemplate($event)\" \n (createStep)=\"createWhileStep($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (cancelElementForm)=\"cancelElementForm.emit()\">\n </cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n text=\"Create Step\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", components: [{ type: i1.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { 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.StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: ["showHeader", "templates", "searchPlaceholder", "setTemplateVariables", "preventSelectTemplate", "elementOptions", "hasMoreElements", "isLoadingElements", "screenNameOptions", "hasMoreScreenNames", "isLoadingScreenNames"], outputs: ["templateChanged", "loadMoreElements", "searchElements", "createElement", "searchScreenName", "loadMoreScreenNames", "createScreenNameRequest", "createStep", "cancelled"] }, { type: i4.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
383
398
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderLoopComponent, decorators: [{
384
399
  type: Component,
385
- args: [{ selector: 'cqa-step-builder-loop', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Loop Test Step\n </h2>\n\n <!-- Loop Type Selection -->\n <div class=\"cqa-mb-4 cqa-w-full\">\n <div class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <!-- For Button -->\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'for' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'for' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('for')\">\n For\n </button>\n <!-- While Button -->\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'while' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'while' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('while')\">\n While\n </button>\n </div>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action [showHeader]=\"false\" [templates]=\"whileTemplates\" [setTemplateVariables]=\"setWhileTemplateVariables\" [searchPlaceholder]=\"whileSearchPlaceholder\" (templateChanged)=\"selectWhileTemplate($event)\" (createStep)=\"createWhileStep($event)\"></cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n text=\"Create Step\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", styles: [] }]
400
+ args: [{ selector: 'cqa-step-builder-loop', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white cqa-px-4 cqa-py-2\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n Create Loop Test Step\n </h2>\n\n <!-- Loop Type Selection -->\n <div class=\"cqa-mb-4 cqa-w-full\">\n <div class=\"cqa-w-full cqa-inline-flex cqa-items-center cqa-bg-gray-100 cqa-rounded-lg cqa-p-1 cqa-gap-0\" style=\"height: 30px; background-color: #F3F4F6;\">\n <!-- For Button -->\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'for' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'for' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('for')\">\n For\n </button>\n <!-- While Button -->\n <button\n type=\"button\"\n class=\"cqa-w-1/2 cqa-text-[12px] cqa-rounded-md cqa-font-medium cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-min-w-[80px] cqa-text-center cqa-cursor-pointer\"\n [style.background-color]=\"selectedLoopType === 'while' ? '#3F43EE' : 'transparent'\"\n [style.color]=\"selectedLoopType === 'while' ? '#FFFFFF' : '#6B7280'\"\n [style.border-radius]=\"'8px'\"\n [style.height]=\"'22px'\"\n (click)=\"onLoopTypeChange('while')\">\n While\n </button>\n </div>\n </div>\n\n <!-- Form Fields -->\n <ng-container *ngIf=\"selectedLoopType === 'for'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Dropdown Fields Row -->\n <div class=\"cqa-flex cqa-gap-4 cqa-flex-wrap\">\n <!-- Select Option -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Select Option\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"selectOptionConfig\">\n </cqa-dynamic-select>\n </div>\n\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'dataProfile'\">\n <!-- Data Profile -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Data Profile\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"dataProfileConfig\"\n (searchChange)=\"onSearchDataProfiles($event.query)\"\n (loadMore)=\"onLoadMoreDataProfiles($event)\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop Start -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop Start\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopStartConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Loop End -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Loop End\n </label>\n <cqa-dynamic-select\n [form]=\"loopForm\"\n [config]=\"loopEndConfig\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"loopForm.get('selectOption')?.value === 'runTime'\">\n <!-- Run Time Input Field -->\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1\" style=\"min-width: calc(25% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1.5\">\n Run Time\n </label>\n <cqa-custom-input\n [placeholder]=\"'Enter Run Time'\"\n [value]=\"loopForm.get('runTime')?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"loopForm.get('runTime')?.setValue($event)\">\n </cqa-custom-input>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n <ng-container *ngIf=\"selectedLoopType === 'while'\">\n <cqa-step-builder-action \n [showHeader]=\"false\" \n [templates]=\"whileTemplates\" \n [setTemplateVariables]=\"setWhileTemplateVariables\" \n [searchPlaceholder]=\"whileSearchPlaceholder\"\n [elementOptions]=\"elementOptions\"\n [hasMoreElements]=\"hasMoreElements\"\n [isLoadingElements]=\"isLoadingElements\"\n [screenNameOptions]=\"screenNameOptions\"\n [hasMoreScreenNames]=\"hasMoreScreenNames\"\n [isLoadingScreenNames]=\"isLoadingScreenNames\"\n (templateChanged)=\"selectWhileTemplate($event)\" \n (createStep)=\"createWhileStep($event)\"\n (loadMoreElements)=\"loadMoreElements.emit()\"\n (searchElements)=\"searchElements.emit($event)\"\n (createElement)=\"createElement.emit($event)\"\n (searchScreenName)=\"searchScreenName.emit($event)\"\n (loadMoreScreenNames)=\"loadMoreScreenNames.emit($event)\"\n (createScreenNameRequest)=\"createScreenNameRequest.emit($event)\"\n (cancelElementForm)=\"cancelElementForm.emit()\">\n </cqa-step-builder-action>\n </ng-container>\n\n <!-- Action Buttons -->\n <div *ngIf=\"selectedLoopType === 'for'\" class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-6 cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"outlined\"\n text=\"Cancel\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button\n class=\"cqa-w-1/2\"\n variant=\"filled\"\n text=\"Create Step\"\n [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", styles: [] }]
386
401
  }], ctorParameters: function () { return []; }, propDecorators: { loopType: [{
387
402
  type: Input
388
403
  }], selectOptions: [{
@@ -411,5 +426,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
411
426
  type: Input
412
427
  }], whileSearchValue: [{
413
428
  type: Input
429
+ }], elementOptions: [{
430
+ type: Input
431
+ }], hasMoreElements: [{
432
+ type: Input
433
+ }], isLoadingElements: [{
434
+ type: Input
435
+ }], screenNameOptions: [{
436
+ type: Input
437
+ }], hasMoreScreenNames: [{
438
+ type: Input
439
+ }], isLoadingScreenNames: [{
440
+ type: Input
441
+ }], loadMoreElements: [{
442
+ type: Output
443
+ }], searchElements: [{
444
+ type: Output
445
+ }], createElement: [{
446
+ type: Output
447
+ }], searchScreenName: [{
448
+ type: Output
449
+ }], loadMoreScreenNames: [{
450
+ type: Output
451
+ }], createScreenNameRequest: [{
452
+ type: Output
453
+ }], cancelElementForm: [{
454
+ type: Output
414
455
  }] } });
415
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztBQXFDeEQsTUFBTSxPQUFPLHdCQUF3QjtJQXdEbkM7UUF2REEsbUNBQW1DO1FBQzFCLGFBQVEsR0FBYSxLQUFLLENBQUM7UUFFcEMsNkNBQTZDO1FBQ3BDLGtCQUFhLEdBQVU7WUFDOUIsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUM7WUFDN0MsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUM7U0FDdEMsQ0FBQztRQUVGLGdGQUFnRjtRQUN2RSx1QkFBa0IsR0FBd0IsRUFBRSxDQUFDO1FBRXRELGdFQUFnRTtRQUN2RCx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFFOUMsc0NBQXNDO1FBQzdCLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUNoRCxtR0FBbUc7UUFDMUYsOEJBQXlCLEdBQXVDLEdBQUcsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFBLENBQUEsQ0FBQyxDQUFDO1FBRTVGLGdDQUFnQztRQUN0QixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFFeEQsMEJBQTBCO1FBQ2hCLGNB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Q2hDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFhO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JNLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxRQUFhO1FBQy9CLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxRQUFRLENBQUM7SUFDeEMsQ0FBQzs7cUhBM2FVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLDhxQkN0Q3JDLDh3S0ErSEE7MkZEekZhLHdCQUF3QjtrQkFOcEMsU0FBUzsrQkFDRSx1QkFBdUIsUUFHM0IsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFOzBFQUlyQixRQUFRO3NCQUFoQixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBTUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUdHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFHRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUcseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUdJLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTTtnQkFHRyxjQUFjO3NCQUF2QixNQUFNO2dCQUdHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFHRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0UsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWN0aW9uVGVtcGxhdGUgfSBmcm9tICcuLi9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgTG9vcFR5cGUgPSAnZm9yJyB8ICd3aGlsZSc7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBkYXRhIHByb2ZpbGUgb3B0aW9uXG4gKiBCYXNlZCBvbiBUZXN0RGF0YSBtb2RlbCBzdHJ1Y3R1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhUHJvZmlsZU9wdGlvbiB7XG4gIGlkOiBudW1iZXIgfCBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEFycmF5IG9mIGRhdGEgc2V0cyAtIGxlbmd0aCBkZXRlcm1pbmVzIGF2YWlsYWJsZSBsb29wIGluZGljZXMgKi9cbiAgZGF0YT86IGFueVtdO1xuICAvKiogT3B0aW9uYWw6IGRpcmVjdCBkYXRhIGxlbmd0aCBpZiBkYXRhIGFycmF5IGlzIG5vdCBwcm92aWRlZCAqL1xuICBkYXRhTGVuZ3RoPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvb3BGb3JtRGF0YSB7XG4gIHNlbGVjdGVkTG9vcFR5cGU6IExvb3BUeXBlO1xuICBsb29wVHlwZTogTG9vcFR5cGU7XG4gIHNlbGVjdE9wdGlvbj86IHN0cmluZztcbiAgZGF0YVByb2ZpbGU/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGxvb3BTdGFydD86IG51bWJlciB8IHN0cmluZztcbiAgbG9vcEVuZD86IG51bWJlciB8IHN0cmluZztcbiAgcnVuVGltZT86IHN0cmluZztcbiAgd2hpbGVUZW1wbGF0ZT86IGFueTtcbiAgZXZlbnQ/OiBhbnk7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLWJ1aWxkZXItbG9vcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwLWJ1aWxkZXItbG9vcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfVxufSlcbmV4cG9ydCBjbGFzcyBTdGVwQnVpbGRlckxvb3BDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKiBDdXJyZW50bHkgc2VsZWN0ZWQgbG9vcCB0eXBlICovXG4gIEBJbnB1dCgpIGxvb3BUeXBlOiBMb29wVHlwZSA9ICdmb3InO1xuXG4gIC8qKiBPcHRpb25zIGZvciB0aGUgc2VsZWN0IG9wdGlvbiBkcm9wZG93biAqL1xuICBASW5wdXQoKSBzZWxlY3RPcHRpb25zOiBhbnlbXSA9IFtcbiAgICB7dmFsdWU6ICdkYXRhUHJvZmlsZScsIGxhYmVsOiAnRGF0YSBQcm9maWxlJ30sXG4gICAge3ZhbHVlOiAncnVuVGltZScsIGxhYmVsOiAnUnVuIFRpbWUnfVxuICBdO1xuXG4gIC8qKiBPcHRpb25zIGZvciB0aGUgZGF0YSBwcm9maWxlIGRyb3Bkb3duIC0gYWNjZXB0cyBEYXRhUHJvZmlsZU9wdGlvbiBvYmplY3RzICovXG4gIEBJbnB1dCgpIGRhdGFQcm9maWxlT3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSA9IFtdO1xuXG4gIC8qKiBJbmRpY2F0ZXMgaWYgbW9yZSBkYXRhIHByb2ZpbGVzIGFyZSBhdmFpbGFibGUgZm9yIGxvYWRpbmcgKi9cbiAgQElucHV0KCkgaGFzTW9yZURhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBMb2FkaW5nIHN0YXRlIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0RhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRnVuY3Rpb24gdG8gaGFuZGxlIHZhcmlhYmxlIHByb2Nlc3Npbmcgb3IgY3VzdG9tIGxvZ2ljLiBDYW4gYmUgcGFzc2VkIGZyb20gcGFyZW50IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgc2V0V2hpbGVUZW1wbGF0ZVZhcmlhYmxlczogKHZhcmlhYmxlczogQWN0aW9uVGVtcGxhdGUpID0+IGFueSA9ICgpID0+IHsgcmV0dXJuIFtdfTtcblxuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgY3JlYXRlZCAqL1xuICBAT3V0cHV0KCkgY3JlYXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcEZvcm1EYXRhPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gY2FuY2VsbGVkICovXG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBsb29wIHR5cGUgY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgbG9vcFR5cGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPExvb3BUeXBlPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gbW9yZSBkYXRhIHByb2ZpbGVzIG5lZWQgdG8gYmUgbG9hZGVkICovXG4gIEBPdXRwdXQoKSBsb2FkTW9yZURhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gZGF0YSBwcm9maWxlIHNlYXJjaCBxdWVyeSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBzZWFyY2hEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQElucHV0KCkgd2hpbGVUZW1wbGF0ZXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIHdoaWxlU2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWFyY2ggV2hpbGUnO1xuICBASW5wdXQoKSB3aGlsZVNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRXaGlsZVRlbXBsYXRlOiBhbnkgPSBudWxsO1xuICBzZWxlY3RlZExvb3BUeXBlOiBMb29wVHlwZSA9ICdmb3InO1xuICBcbiAgLy8gU2luZ2xlIEZvcm1Hcm91cCBjb250YWluaW5nIGFsbCBmb3VyIGZpZWxkc1xuICBsb29wRm9ybTogRm9ybUdyb3VwO1xuXG4gIC8vIENvbmZpZ3MgZm9yIGR5bmFtaWMtc2VsZWN0IGNvbXBvbmVudHNcbiAgc2VsZWN0T3B0aW9uQ29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGRhdGFQcm9maWxlQ29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGxvb3BTdGFydENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBsb29wRW5kQ29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG5cblxuICAvLyBJbnRlcm5hbCBzdGF0ZSBmb3IgbWFuYWdpbmcgbG9vcCBpbmRpY2VzXG4gIHByaXZhdGUgc2VsZWN0ZWREYXRhUHJvZmlsZTogRGF0YVByb2ZpbGVPcHRpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGFydEFycmF5OiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIGVuZEFycmF5OiBudW1iZXJbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEluaXRpYWxpemUgc2luZ2xlIEZvcm1Hcm91cCB3aXRoIGFsbCBmaWVsZHNcbiAgICB0aGlzLmxvb3BGb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICBzZWxlY3RPcHRpb246IG5ldyBGb3JtQ29udHJvbChudWxsKSxcbiAgICAgIGRhdGFQcm9maWxlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBsb29wU3RhcnQ6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcbiAgICAgIGxvb3BFbmQ6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcbiAgICAgIHJ1blRpbWU6IG5ldyBGb3JtQ29udHJvbChudWxsKVxuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb25maWdzXG4gICAgdGhpcy5zZWxlY3RPcHRpb25Db25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RPcHRpb24nLFxuICAgICAgcGxhY2Vob2xkZXI6ICdzZWxlY3Qgb3B0aW9uJyxcbiAgICAgIHNlbGVjdGVkVmFsdWU6ICdkYXRhUHJvZmlsZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuc2VsZWN0T3B0aW9uc1xuICAgIH07XG4gICAgdGhpcy5kYXRhUHJvZmlsZUNvbmZpZyA9IHtcbiAgICAgIGtleTogJ2RhdGFQcm9maWxlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnZGF0YSBwcm9maWxlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVEYXRhUHJvZmlsZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzLFxuICAgICAgb3B0aW9uczogW10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSB8fCAnJyk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmxvb3BTdGFydENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2xvb3BTdGFydCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ2xvb3Agc3RhcnQnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBbXSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uTG9vcFN0YXJ0Q2hhbmdlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMubG9vcEVuZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2xvb3BFbmQnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdsb29wIGVuZCcsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2UgaWYgbmVlZGVkXG4gICAgICB9XG4gICAgfTsgIFxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gdGhpcy5sb29wVHlwZTtcbiAgICB0aGlzLnVwZGF0ZUNvbmZpZ3MoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhcInRoaXMud2hpbGVUZW1wbGF0ZXNcIix0aGlzLndoaWxlVGVtcGxhdGVzKTtcbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0T3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3MoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGFQcm9maWxlT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3MoKTtcbiAgICAgIC8vIElmIGEgZGF0YSBwcm9maWxlIGlzIGFscmVhZHkgc2VsZWN0ZWQsIHVwZGF0ZSBsb29wIGluZGljZXNcbiAgICAgIGNvbnN0IGN1cnJlbnRQcm9maWxlSWQgPSB0aGlzLmxvb3BGb3JtLmdldCgnZGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgICBpZiAoY3VycmVudFByb2ZpbGVJZCkge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UoY3VycmVudFByb2ZpbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoYXNNb3JlRGF0YVByb2ZpbGVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRGF0YVByb2ZpbGVzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVByb2ZpbGVDb25maWcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2xvb3BUeXBlJ10pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9IHRoaXMubG9vcFR5cGU7XG4gICAgfVxuICAgIC8vIE5vdGU6IGxvb3BTdGFydE9wdGlvbnMgYW5kIGxvb3BFbmRPcHRpb25zIGFyZSBub3cgY2FsY3VsYXRlZCBkeW5hbWljYWxseVxuICAgIC8vIHNvIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSB1cGRhdGVkIGZyb20gaW5wdXRzXG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbmZpZ3MoKTogdm9pZCB7XG4gICAgLy8gQ29udmVydCBEYXRhUHJvZmlsZU9wdGlvbltdIHRvIFNlbGVjdE9wdGlvbltdXG4gICAgdGhpcy5kYXRhUHJvZmlsZUNvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuZGF0YVByb2ZpbGVDb25maWcsXG4gICAgICBvcHRpb25zOiB0aGlzLmNvbnZlcnREYXRhUHJvZmlsZU9wdGlvbnNUb1NlbGVjdE9wdGlvbnModGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMpLFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRGF0YVByb2ZpbGVzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ0RhdGFQcm9maWxlcyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UodmFsdWUpO1xuICAgICAgfSxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgICBvbkxvYWRNb3JlOiAocXVlcnk/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5IHx8ICcnKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIC8vIExvb3Agc3RhcnQgYW5kIGVuZCBvcHRpb25zIGFyZSB1cGRhdGVkIHdoZW4gZGF0YSBwcm9maWxlIGlzIHNlbGVjdGVkXG4gICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREYXRhUHJvZmlsZU9wdGlvbnNUb1NlbGVjdE9wdGlvbnMob3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSk6IFNlbGVjdE9wdGlvbltdIHtcbiAgICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICBpZDogb3B0aW9uLmlkLFxuICAgICAgdmFsdWU6IG9wdGlvbi5pZCxcbiAgICAgIG5hbWU6IG9wdGlvbi5uYW1lLFxuICAgICAgbGFiZWw6IG9wdGlvbi5uYW1lXG4gICAgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBIYW5kbGUgZGF0YSBwcm9maWxlIHNlbGVjdGlvbiBhbmQgdXBkYXRlIGxvb3Agc3RhcnQvZW5kIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgb25EYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZSA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQocHJvZmlsZSA9PiBcbiAgICAgIHByb2ZpbGUuaWQgPT09IHByb2ZpbGVJZCB8fCBTdHJpbmcocHJvZmlsZS5pZCkgPT09IFN0cmluZyhwcm9maWxlSWQpXG4gICAgKTtcblxuICAgIGlmIChzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZSA9IHNlbGVjdGVkUHJvZmlsZTtcbiAgICAgIHRoaXMudXBkYXRlTG9vcEluZGljZXNGcm9tUHJvZmlsZShzZWxlY3RlZFByb2ZpbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVByb2ZpbGUgPSBudWxsO1xuICAgICAgdGhpcy5zdGFydEFycmF5ID0gW107XG4gICAgICB0aGlzLmVuZEFycmF5ID0gW107XG4gICAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGxvb3AgaW5kaWNlcyBiYXNlZCBvbiBzZWxlY3RlZCBkYXRhIHByb2ZpbGVcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlTG9vcEluZGljZXNGcm9tUHJvZmlsZShwcm9maWxlOiBEYXRhUHJvZmlsZU9wdGlvbik6IHZvaWQge1xuICAgIC8vIENhbGN1bGF0ZSBkYXRhIGxlbmd0aCBmcm9tIGRhdGEgYXJyYXkgb3IgdXNlIHByb3ZpZGVkIGRhdGFMZW5ndGhcbiAgICBsZXQgZGF0YVNldExlbmd0aCA9IDE7XG4gICAgaWYgKHByb2ZpbGUuZGF0YSAmJiBBcnJheS5pc0FycmF5KHByb2ZpbGUuZGF0YSkpIHtcbiAgICAgIGRhdGFTZXRMZW5ndGggPSBwcm9maWxlLmRhdGEubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAocHJvZmlsZS5kYXRhTGVuZ3RoICYmIHByb2ZpbGUuZGF0YUxlbmd0aCA+IDApIHtcbiAgICAgIGRhdGFTZXRMZW5ndGggPSBwcm9maWxlLmRhdGFMZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHN0YXJ0IGFycmF5IGZyb20gMSB0byBkYXRhU2V0TGVuZ3RoXG4gICAgdGhpcy5zdGFydEFycmF5ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogZGF0YVNldExlbmd0aCB9LCAoXywgaSkgPT4gaSArIDEpO1xuICAgIC8vIEluaXRpYWxpemUgZW5kIGFycmF5IHNhbWUgYXMgc3RhcnQgYXJyYXlcbiAgICAvLyBFbmQgYXJyYXkgd2lsbCBiZSB1cGRhdGVkIHdoZW4gc3RhcnQgaW5kZXggaXMgc2VsZWN0ZWRcbiAgICB0aGlzLmVuZEFycmF5ID0gWy4uLnRoaXMuc3RhcnRBcnJheV07XG5cbiAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXMgaWYgZm9ybSBpcyBlbXB0eVxuICAgIGNvbnN0IGN1cnJlbnRTdGFydCA9IHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wU3RhcnQnKT8udmFsdWU7XG4gICAgY29uc3QgY3VycmVudEVuZCA9IHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wRW5kJyk/LnZhbHVlO1xuICAgIFxuICAgIGlmICghY3VycmVudFN0YXJ0ICYmIHRoaXMuc3RhcnRBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcFN0YXJ0Jyk/LnNldFZhbHVlKHRoaXMuc3RhcnRBcnJheVswXSk7XG4gICAgfVxuICAgIGlmICghY3VycmVudEVuZCAmJiB0aGlzLmVuZEFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wRW5kJyk/LnNldFZhbHVlKHRoaXMuZW5kQXJyYXlbdGhpcy5lbmRBcnJheS5sZW5ndGggLSAxXSk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGxvb3Agc3RhcnQgY2hhbmdlIGFuZCB1cGRhdGUgZW5kIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgb25Mb29wU3RhcnRDaGFuZ2Uoc3RhcnRJbmRleDogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRGF0YVByb2ZpbGUgfHwgIXN0YXJ0SW5kZXgpIHtcbiAgICAgIHRoaXMuZW5kQXJyYXkgPSBbLi4udGhpcy5zdGFydEFycmF5XTtcbiAgICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0SWR4ID0gdHlwZW9mIHN0YXJ0SW5kZXggPT09ICdzdHJpbmcnID8gcGFyc2VJbnQoc3RhcnRJbmRleCkgOiBzdGFydEluZGV4O1xuICAgIFxuICAgIGlmIChpc05hTihzdGFydElkeCkgfHwgc3RhcnRJZHggPCAxKSB7XG4gICAgICB0aGlzLmVuZEFycmF5ID0gWy4uLnRoaXMuc3RhcnRBcnJheV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEVuZCBhcnJheSBzaG91bGQgYmUgZnJvbSBzdGFydEluZGV4IHRvIGVuZCBvZiBkYXRhXG4gICAgICAvLyBCYXNlZCBvbiByZWZlcmVuY2U6IGVuZEFycmF5ID0gc3RhcnRBcnJheS5zcGxpY2Uoc3RhcnRJbmRleCAtIDEsIHN0YXJ0QXJyYXkubGVuZ3RoKVxuICAgICAgY29uc3Qgc3RhcnRBcnJheUNvcHkgPSBbLi4udGhpcy5zdGFydEFycmF5XTtcbiAgICAgIHRoaXMuZW5kQXJyYXkgPSBzdGFydEFycmF5Q29weS5zbGljZShzdGFydElkeCAtIDEpO1xuICAgIH1cblxuICAgIC8vIEF1dG8tdXBkYXRlIGVuZCBpbmRleCBpZiBjdXJyZW50IGVuZCBpcyBpbnZhbGlkXG4gICAgY29uc3QgY3VycmVudEVuZCA9IHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wRW5kJyk/LnZhbHVlO1xuICAgIGNvbnN0IGVuZElkeCA9IHR5cGVvZiBjdXJyZW50RW5kID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KGN1cnJlbnRFbmQpIDogY3VycmVudEVuZDtcbiAgICBcbiAgICBpZiAoIWN1cnJlbnRFbmQgfHwgaXNOYU4oZW5kSWR4KSB8fCBlbmRJZHggPCBzdGFydElkeCkge1xuICAgICAgaWYgKHRoaXMuZW5kQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy5zZXRWYWx1ZSh0aGlzLmVuZEFycmF5W3RoaXMuZW5kQXJyYXkubGVuZ3RoIC0gMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBsb29wIHN0YXJ0IGFuZCBlbmQgY29uZmlnIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlTG9vcEluZGV4T3B0aW9ucygpOiB2b2lkIHtcbiAgICAvLyBDb252ZXJ0IHN0YXJ0QXJyYXkgdG8gU2VsZWN0T3B0aW9uc1xuICAgIGNvbnN0IHN0YXJ0T3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSB0aGlzLnN0YXJ0QXJyYXkubWFwKGlkeCA9PiAoe1xuICAgICAgaWQ6IGlkeCxcbiAgICAgIHZhbHVlOiBpZHgsXG4gICAgICBuYW1lOiBTdHJpbmcoaWR4KSxcbiAgICAgIGxhYmVsOiBTdHJpbmcoaWR4KVxuICAgIH0pKTtcblxuICAgIC8vIENvbnZlcnQgZW5kQXJyYXkgdG8gU2VsZWN0T3B0aW9uc1xuICAgIGNvbnN0IGVuZE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gdGhpcy5lbmRBcnJheS5tYXAoaWR4ID0+ICh7XG4gICAgICBpZDogaWR4LFxuICAgICAgdmFsdWU6IGlkeCxcbiAgICAgIG5hbWU6IFN0cmluZyhpZHgpLFxuICAgICAgbGFiZWw6IFN0cmluZyhpZHgpXG4gICAgfSkpO1xuXG4gICAgdGhpcy5sb29wU3RhcnRDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmxvb3BTdGFydENvbmZpZyxcbiAgICAgIG9wdGlvbnM6IFt7aWQ6IC0xLCB2YWx1ZTogLTEsIG5hbWU6ICdTdGFydCcsIGxhYmVsOiAnU3RhcnQnfSwgLi4uc3RhcnRPcHRpb25zXSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uTG9vcFN0YXJ0Q2hhbmdlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5sb29wRW5kQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5sb29wRW5kQ29uZmlnLFxuICAgICAgb3B0aW9uczogWy4uLmVuZE9wdGlvbnMse2lkOiAtMSwgdmFsdWU6IC0xLCBuYW1lOiAnRW5kJywgbGFiZWw6ICdFbmQnfV0sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZSBpZiBuZWVkZWRcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgb25Mb29wVHlwZUNoYW5nZSh0eXBlOiBzdHJpbmcgfCBMb29wVHlwZSk6IHZvaWQge1xuICAgIGNvbnN0IGxvb3BUeXBlID0gdHlwZSBhcyBMb29wVHlwZTtcbiAgICB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPSBsb29wVHlwZTtcbiAgICB0aGlzLmxvb3BUeXBlQ2hhbmdlLmVtaXQobG9vcFR5cGUpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yICdmb3InIGxvb3AgdHlwZVxuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5sb29wRm9ybS52YWx1ZTtcbiAgICAgIGNvbnN0IHNlbGVjdE9wdGlvbiA9IGZvcm1WYWx1ZS5zZWxlY3RPcHRpb247XG4gICAgICBcbiAgICAgIGlmICghc2VsZWN0T3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHNlbGVjdE9wdGlvbiA9PT0gJ2RhdGFQcm9maWxlJykge1xuICAgICAgICAvLyBGb3IgZGF0YSBwcm9maWxlLCBuZWVkIGRhdGFQcm9maWxlLCBsb29wU3RhcnQsIGFuZCBsb29wRW5kXG4gICAgICAgIHJldHVybiAhIShmb3JtVmFsdWUuZGF0YVByb2ZpbGUgJiYgZm9ybVZhbHVlLmxvb3BTdGFydCAmJiBmb3JtVmFsdWUubG9vcEVuZCk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdE9wdGlvbiA9PT0gJ3J1blRpbWUnKSB7XG4gICAgICAgIC8vIEZvciBydW4gdGltZSwgbmVlZCBydW5UaW1lIHZhbHVlXG4gICAgICAgIHJldHVybiAhIShmb3JtVmFsdWUucnVuVGltZSAmJiBmb3JtVmFsdWUucnVuVGltZS50cmltKCkgIT09ICcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmxvb3BGb3JtLnZhbHVlO1xuICAgIGlmKHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgaWYoIXRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3RlcERhdGE6IExvb3BGb3JtRGF0YSA9IHtcbiAgICAgIHNlbGVjdGVkTG9vcFR5cGU6IHRoaXMuc2VsZWN0ZWRMb29wVHlwZSBhcyBMb29wVHlwZSxcbiAgICAgIGxvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUsXG4gICAgICBzZWxlY3RPcHRpb246IGZvcm1WYWx1ZS5zZWxlY3RPcHRpb24gfHwgdW5kZWZpbmVkLFxuICAgICAgZGF0YVByb2ZpbGU6IGZvcm1WYWx1ZS5kYXRhUHJvZmlsZSB8fCB1bmRlZmluZWQsXG4gICAgICBsb29wU3RhcnQ6IGZvcm1WYWx1ZS5sb29wU3RhcnQgfHwgdW5kZWZpbmVkLFxuICAgICAgbG9vcEVuZDogZm9ybVZhbHVlLmxvb3BFbmQgfHwgdW5kZWZpbmVkLFxuICAgICAgcnVuVGltZTogZm9ybVZhbHVlLnJ1blRpbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgd2hpbGVUZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFdoaWxlVGVtcGxhdGUgfHwgdW5kZWZpbmVkXG4gICAgfTtcbiAgICBjb25zb2xlLmxvZygnc3RlcERhdGEnLCBzdGVwRGF0YSk7XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgY3JlYXRlV2hpbGVTdGVwKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnY3JlYXRlV2hpbGVTdGVwJywgZXZlbnQpO1xuICAgIGNvbnN0IHN0ZXBEYXRhOiBMb29wRm9ybURhdGEgPSB7XG4gICAgICBzZWxlY3RlZExvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgYXMgTG9vcFR5cGUsXG4gICAgICBsb29wVHlwZTogdGhpcy5zZWxlY3RlZExvb3BUeXBlIGFzIExvb3BUeXBlLFxuICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgfTtcbiAgICBjb25zb2xlLmxvZygnc3RlcERhdGEnLCBzdGVwRGF0YSk7XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzZWFyY2ggZXZlbnQgZm9yIGRhdGEgcHJvZmlsZXNcbiAgICovXG4gIG9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaERhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbG9hZE1vcmUgZXZlbnQgZm9yIGRhdGEgcHJvZmlsZXNcbiAgICovXG4gIG9uTG9hZE1vcmVEYXRhUHJvZmlsZXMoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChldmVudC5xdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGRhdGEgcHJvZmlsZSBjb25maWcgd2hlbiBsb2FkaW5nIHN0YXRlIG9yIGhhc01vcmUgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVEYXRhUHJvZmlsZUNvbmZpZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhUHJvZmlsZUNvbmZpZykge1xuICAgICAgdGhpcy5kYXRhUHJvZmlsZUNvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5kYXRhUHJvZmlsZUNvbmZpZyxcbiAgICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRGF0YVByb2ZpbGVzLFxuICAgICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9ICdmb3InO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZSA9IG51bGw7XG4gICAgdGhpcy5zdGFydEFycmF5ID0gW107XG4gICAgdGhpcy5lbmRBcnJheSA9IFtdO1xuICAgIHRoaXMubG9vcEZvcm0ucmVzZXQoe1xuICAgICAgc2VsZWN0T3B0aW9uOiBudWxsLFxuICAgICAgZGF0YVByb2ZpbGU6IG51bGwsXG4gICAgICBsb29wU3RhcnQ6IG51bGwsXG4gICAgICBsb29wRW5kOiBudWxsXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlU2VhcmNoVmFsdWUgPSBldmVudDtcbiAgICB0aGlzLmZpbHRlcldoaWxlVGVtcGxhdGVzKGV2ZW50KTtcbiAgfVxuXG4gIG9uV2hpbGVTZWFyY2hTdWJtaXQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25XaGlsZVNlYXJjaENoYW5nZShldmVudCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoQ2xlYXJlZCgpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlU2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLmZpbHRlcldoaWxlVGVtcGxhdGVzKCcnKTtcbiAgfVxuXG4gIGZpbHRlcldoaWxlVGVtcGxhdGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlVGVtcGxhdGVzID0gdGhpcy53aGlsZVRlbXBsYXRlcy5maWx0ZXIodGVtcGxhdGUgPT4gdGVtcGxhdGUuaHRtbEdyYW1tYXIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpKTtcbiAgfVxuXG4gIHNlbGVjdFdoaWxlVGVtcGxhdGUodGVtcGxhdGU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlID0gdGVtcGxhdGU7XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1iZy13aGl0ZSBjcWEtcHgtNCBjcWEtcHktMlwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWJsYWNrLTEwMCBjcWEtbWItNFwiPlxuICAgIENyZWF0ZSBMb29wIFRlc3QgU3RlcFxuICA8L2gyPlxuXG4gIDwhLS0gTG9vcCBUeXBlIFNlbGVjdGlvbiAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1tYi00IGNxYS13LWZ1bGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtZ2FwLTBcIiBzdHlsZT1cImhlaWdodDogMzBweDsgYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDwhLS0gRm9yIEJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXctMS8yIGNxYS10ZXh0LVsxMnB4XSBjcWEtcm91bmRlZC1tZCBjcWEtZm9udC1tZWRpdW0gY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1kdXJhdGlvbi0yMDAgY3FhLWVhc2UtaW4tb3V0IGNxYS1taW4tdy1bODBweF0gY3FhLXRleHQtY2VudGVyIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InID8gJyMzRjQzRUUnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgIFtzdHlsZS5jb2xvcl09XCJzZWxlY3RlZExvb3BUeXBlID09PSAnZm9yJyA/ICcjRkZGRkZGJyA6ICcjNkI3MjgwJ1wiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItcmFkaXVzXT1cIic4cHgnXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCInMjJweCdcIlxuICAgICAgICAoY2xpY2spPVwib25Mb29wVHlwZUNoYW5nZSgnZm9yJylcIj5cbiAgICAgICAgRm9yXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDwhLS0gV2hpbGUgQnV0dG9uIC0tPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdy0xLzIgY3FhLXRleHQtWzEycHhdIGNxYS1yb3VuZGVkLW1kIGNxYS1mb250LW1lZGl1bSBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWR1cmF0aW9uLTIwMCBjcWEtZWFzZS1pbi1vdXQgY3FhLW1pbi13LVs4MHB4XSBjcWEtdGV4dC1jZW50ZXIgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJyA/ICcjM0Y0M0VFJyA6ICd0cmFuc3BhcmVudCdcIlxuICAgICAgICBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJyA/ICcjRkZGRkZGJyA6ICcjNkI3MjgwJ1wiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItcmFkaXVzXT1cIic4cHgnXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCInMjJweCdcIlxuICAgICAgICAoY2xpY2spPVwib25Mb29wVHlwZUNoYW5nZSgnd2hpbGUnKVwiPlxuICAgICAgICBXaGlsZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRm9ybSBGaWVsZHMgLS0+XG4gICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgPCEtLSBEcm9wZG93biBGaWVsZHMgUm93IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLTQgY3FhLWZsZXgtd3JhcFwiPlxuICAgICAgPCEtLSBTZWxlY3QgT3B0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgU2VsZWN0IE9wdGlvblxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwibG9vcEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwic2VsZWN0T3B0aW9uQ29uZmlnXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb29wRm9ybS5nZXQoJ3NlbGVjdE9wdGlvbicpPy52YWx1ZSA9PT0gJ2RhdGFQcm9maWxlJ1wiPlxuICAgICAgPCEtLSBEYXRhIFByb2ZpbGUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LTFcIiBzdHlsZT1cIm1pbi13aWR0aDogY2FsYygyNSUgLSAxMnB4KTtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjVcIj5cbiAgICAgICAgICBEYXRhIFByb2ZpbGVcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImRhdGFQcm9maWxlQ29uZmlnXCJcbiAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VhcmNoRGF0YVByb2ZpbGVzKCRldmVudC5xdWVyeSlcIlxuICAgICAgICAgIChsb2FkTW9yZSk9XCJvbkxvYWRNb3JlRGF0YVByb2ZpbGVzKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBMb29wIFN0YXJ0IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgTG9vcCBTdGFydFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwibG9vcEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwibG9vcFN0YXJ0Q29uZmlnXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTG9vcCBFbmQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LTFcIiBzdHlsZT1cIm1pbi13aWR0aDogY2FsYygyNSUgLSAxMnB4KTtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjVcIj5cbiAgICAgICAgICBMb29wIEVuZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwibG9vcEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwibG9vcEVuZENvbmZpZ1wiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9vcEZvcm0uZ2V0KCdzZWxlY3RPcHRpb24nKT8udmFsdWUgPT09ICdydW5UaW1lJ1wiPlxuICAgICAgICA8IS0tIFJ1biBUaW1lIElucHV0IEZpZWxkIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LTFcIiBzdHlsZT1cIm1pbi13aWR0aDogY2FsYygyNSUgLSAxMnB4KTtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgICAgUnVuIFRpbWVcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0VudGVyIFJ1biBUaW1lJ1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwibG9vcEZvcm0uZ2V0KCdydW5UaW1lJyk/LnZhbHVlXCJcbiAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwibG9vcEZvcm0uZ2V0KCdydW5UaW1lJyk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnXCI+XG4gICAgPGNxYS1zdGVwLWJ1aWxkZXItYWN0aW9uIFtzaG93SGVhZGVyXT1cImZhbHNlXCIgW3RlbXBsYXRlc109XCJ3aGlsZVRlbXBsYXRlc1wiIFtzZXRUZW1wbGF0ZVZhcmlhYmxlc109XCJzZXRXaGlsZVRlbXBsYXRlVmFyaWFibGVzXCIgW3NlYXJjaFBsYWNlaG9sZGVyXT1cIndoaWxlU2VhcmNoUGxhY2Vob2xkZXJcIiAodGVtcGxhdGVDaGFuZ2VkKT1cInNlbGVjdFdoaWxlVGVtcGxhdGUoJGV2ZW50KVwiIChjcmVhdGVTdGVwKT1cImNyZWF0ZVdoaWxlU3RlcCgkZXZlbnQpXCI+PC9jcWEtc3RlcC1idWlsZGVyLWFjdGlvbj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtbXQtNiBjcWEtcHQtNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICBjbGFzcz1cImNxYS13LTEvMlwiXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgdGV4dD1cIkNhbmNlbFwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8Y3FhLWJ1dHRvblxuICAgICAgY2xhc3M9XCJjcWEtdy0xLzJcIlxuICAgICAgdmFyaWFudD1cImZpbGxlZFwiXG4gICAgICB0ZXh0PVwiQ3JlYXRlIFN0ZXBcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhaXNGb3JtVmFsaWQoKVwiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNyZWF0ZVN0ZXAoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWxvb3Avc3RlcC1idWlsZGVyLWxvb3AuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztBQStDeEQsTUFBTSxPQUFPLHdCQUF3QjtJQTJFbkM7UUExRUEsbUNBQW1DO1FBQzFCLGFBQVEsR0FBYSxLQUFLLENBQUM7UUFFcEMsNkNBQTZDO1FBQ3BDLGtCQUFhLEdBQVU7WUFDOUIsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUM7WUFDN0MsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUM7U0FDdEMsQ0FBQztRQUVGLGdGQUFnRjtRQUN2RSx1QkFBa0IsR0FBd0IsRUFBRSxDQUFDO1FBRXRELGdFQUFnRTtRQUN2RCx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFFOUMsc0NBQXNDO1FBQzdCLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUNoRCxtR0FBbUc7UUFDMUYsOEJBQXlCLEdBQXVDLEdBQUcsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFBLENBQUEsQ0FBQyxDQUFDO1FBRTVGLGdDQUFnQztRQUN0QixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFFeEQsMEJBQTBCO1FBQ2hCLGNB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SyxFQUFFLGFBQWEsRUFBRTswRUFJckIsUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQU1HLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFHRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBR0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU07Z0JBR0csY0FBYztzQkFBdkIsTUFBTTtnQkFHRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBR0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNFLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVJLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLCBTZWxlY3RPcHRpb24gfSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWN0aW9uVGVtcGxhdGUgfSBmcm9tICcuLi9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50JztcblxuLy8gSW1wb3J0IEVsZW1lbnQgdHlwZSAtIHVzaW5nIGFueSBmb3Igbm93IHNpbmNlIEVsZW1lbnQgaXMgZnJvbSB0cy1wb3J0YWwtdWlcbi8vIEluIGEgcmVhbCBzY2VuYXJpbywgeW91IG1pZ2h0IHdhbnQgdG8gY3JlYXRlIGEgc2hhcmVkIGludGVyZmFjZSBvciBpbXBvcnQgZnJvbSBhIHNoYXJlZCBwYWNrYWdlXG5pbnRlcmZhY2UgRWxlbWVudCB7XG4gIGlkPzogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxvY2F0b3JWYWx1ZT86IHN0cmluZztcbiAgb3RoZXJMb2NhdG9yPzogc3RyaW5nW107XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IHR5cGUgTG9vcFR5cGUgPSAnZm9yJyB8ICd3aGlsZSc7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBkYXRhIHByb2ZpbGUgb3B0aW9uXG4gKiBCYXNlZCBvbiBUZXN0RGF0YSBtb2RlbCBzdHJ1Y3R1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhUHJvZmlsZU9wdGlvbiB7XG4gIGlkOiBudW1iZXIgfCBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEFycmF5IG9mIGRhdGEgc2V0cyAtIGxlbmd0aCBkZXRlcm1pbmVzIGF2YWlsYWJsZSBsb29wIGluZGljZXMgKi9cbiAgZGF0YT86IGFueVtdO1xuICAvKiogT3B0aW9uYWw6IGRpcmVjdCBkYXRhIGxlbmd0aCBpZiBkYXRhIGFycmF5IGlzIG5vdCBwcm92aWRlZCAqL1xuICBkYXRhTGVuZ3RoPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvb3BGb3JtRGF0YSB7XG4gIHNlbGVjdGVkTG9vcFR5cGU6IExvb3BUeXBlO1xuICBsb29wVHlwZTogTG9vcFR5cGU7XG4gIHNlbGVjdE9wdGlvbj86IHN0cmluZztcbiAgZGF0YVByb2ZpbGU/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGxvb3BTdGFydD86IG51bWJlciB8IHN0cmluZztcbiAgbG9vcEVuZD86IG51bWJlciB8IHN0cmluZztcbiAgcnVuVGltZT86IHN0cmluZztcbiAgd2hpbGVUZW1wbGF0ZT86IGFueTtcbiAgZXZlbnQ/OiBhbnk7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLWJ1aWxkZXItbG9vcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGVwLWJ1aWxkZXItbG9vcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfVxufSlcbmV4cG9ydCBjbGFzcyBTdGVwQnVpbGRlckxvb3BDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKiBDdXJyZW50bHkgc2VsZWN0ZWQgbG9vcCB0eXBlICovXG4gIEBJbnB1dCgpIGxvb3BUeXBlOiBMb29wVHlwZSA9ICdmb3InO1xuXG4gIC8qKiBPcHRpb25zIGZvciB0aGUgc2VsZWN0IG9wdGlvbiBkcm9wZG93biAqL1xuICBASW5wdXQoKSBzZWxlY3RPcHRpb25zOiBhbnlbXSA9IFtcbiAgICB7dmFsdWU6ICdkYXRhUHJvZmlsZScsIGxhYmVsOiAnRGF0YSBQcm9maWxlJ30sXG4gICAge3ZhbHVlOiAncnVuVGltZScsIGxhYmVsOiAnUnVuIFRpbWUnfVxuICBdO1xuXG4gIC8qKiBPcHRpb25zIGZvciB0aGUgZGF0YSBwcm9maWxlIGRyb3Bkb3duIC0gYWNjZXB0cyBEYXRhUHJvZmlsZU9wdGlvbiBvYmplY3RzICovXG4gIEBJbnB1dCgpIGRhdGFQcm9maWxlT3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSA9IFtdO1xuXG4gIC8qKiBJbmRpY2F0ZXMgaWYgbW9yZSBkYXRhIHByb2ZpbGVzIGFyZSBhdmFpbGFibGUgZm9yIGxvYWRpbmcgKi9cbiAgQElucHV0KCkgaGFzTW9yZURhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBMb2FkaW5nIHN0YXRlIGZvciBkYXRhIHByb2ZpbGVzICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZ0RhdGFQcm9maWxlczogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogRnVuY3Rpb24gdG8gaGFuZGxlIHZhcmlhYmxlIHByb2Nlc3Npbmcgb3IgY3VzdG9tIGxvZ2ljLiBDYW4gYmUgcGFzc2VkIGZyb20gcGFyZW50IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgc2V0V2hpbGVUZW1wbGF0ZVZhcmlhYmxlczogKHZhcmlhYmxlczogQWN0aW9uVGVtcGxhdGUpID0+IGFueSA9ICgpID0+IHsgcmV0dXJuIFtdfTtcblxuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgY3JlYXRlZCAqL1xuICBAT3V0cHV0KCkgY3JlYXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8TG9vcEZvcm1EYXRhPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gY2FuY2VsbGVkICovXG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBsb29wIHR5cGUgY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgbG9vcFR5cGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPExvb3BUeXBlPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gbW9yZSBkYXRhIHByb2ZpbGVzIG5lZWQgdG8gYmUgbG9hZGVkICovXG4gIEBPdXRwdXQoKSBsb2FkTW9yZURhdGFQcm9maWxlcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gZGF0YSBwcm9maWxlIHNlYXJjaCBxdWVyeSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBzZWFyY2hEYXRhUHJvZmlsZXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQElucHV0KCkgd2hpbGVUZW1wbGF0ZXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIHdoaWxlU2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWFyY2ggV2hpbGUnO1xuICBASW5wdXQoKSB3aGlsZVNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgXG4gIC8vIEVsZW1lbnQgZmV0Y2hpbmcgcHJvcGVydGllc1xuICBASW5wdXQoKSBlbGVtZW50T3B0aW9uczogYW55W10gPSBbXTtcbiAgQElucHV0KCkgaGFzTW9yZUVsZW1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZ0VsZW1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBTY3JlZW4gbmFtZSBmZXRjaGluZyBwcm9wZXJ0aWVzXG4gIEBJbnB1dCgpIHNjcmVlbk5hbWVPcHRpb25zOiB7IGlkPzogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIEBJbnB1dCgpIGhhc01vcmVTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0xvYWRpbmdTY3JlZW5OYW1lczogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgQE91dHB1dCgpIGxvYWRNb3JlRWxlbWVudHMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hFbGVtZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY3JlYXRlRWxlbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgc2VhcmNoU2NyZWVuTmFtZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgbG9hZE1vcmVTY3JlZW5OYW1lcyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY3JlYXRlU2NyZWVuTmFtZVJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbEVsZW1lbnRGb3JtID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBcbiAgc2VsZWN0ZWRXaGlsZVRlbXBsYXRlOiBhbnkgPSBudWxsO1xuICBzZWxlY3RlZExvb3BUeXBlOiBMb29wVHlwZSA9ICdmb3InO1xuICBcbiAgLy8gU2luZ2xlIEZvcm1Hcm91cCBjb250YWluaW5nIGFsbCBmb3VyIGZpZWxkc1xuICBsb29wRm9ybTogRm9ybUdyb3VwO1xuXG4gIC8vIENvbmZpZ3MgZm9yIGR5bmFtaWMtc2VsZWN0IGNvbXBvbmVudHNcbiAgc2VsZWN0T3B0aW9uQ29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGRhdGFQcm9maWxlQ29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIGxvb3BTdGFydENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBsb29wRW5kQ29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG5cblxuICAvLyBJbnRlcm5hbCBzdGF0ZSBmb3IgbWFuYWdpbmcgbG9vcCBpbmRpY2VzXG4gIHByaXZhdGUgc2VsZWN0ZWREYXRhUHJvZmlsZTogRGF0YVByb2ZpbGVPcHRpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGFydEFycmF5OiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIGVuZEFycmF5OiBudW1iZXJbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEluaXRpYWxpemUgc2luZ2xlIEZvcm1Hcm91cCB3aXRoIGFsbCBmaWVsZHNcbiAgICB0aGlzLmxvb3BGb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICBzZWxlY3RPcHRpb246IG5ldyBGb3JtQ29udHJvbChudWxsKSxcbiAgICAgIGRhdGFQcm9maWxlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICBsb29wU3RhcnQ6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcbiAgICAgIGxvb3BFbmQ6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcbiAgICAgIHJ1blRpbWU6IG5ldyBGb3JtQ29udHJvbChudWxsKVxuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb25maWdzXG4gICAgdGhpcy5zZWxlY3RPcHRpb25Db25maWcgPSB7XG4gICAgICBrZXk6ICdzZWxlY3RPcHRpb24nLFxuICAgICAgcGxhY2Vob2xkZXI6ICdzZWxlY3Qgb3B0aW9uJyxcbiAgICAgIHNlbGVjdGVkVmFsdWU6ICdkYXRhUHJvZmlsZScsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuc2VsZWN0T3B0aW9uc1xuICAgIH07XG4gICAgdGhpcy5kYXRhUHJvZmlsZUNvbmZpZyA9IHtcbiAgICAgIGtleTogJ2RhdGFQcm9maWxlJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnZGF0YSBwcm9maWxlJyxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBzZXJ2ZXJTZWFyY2g6IHRydWUsXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVEYXRhUHJvZmlsZXMsXG4gICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzLFxuICAgICAgb3B0aW9uczogW10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRhdGFQcm9maWxlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblNlYXJjaDogKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaERhdGFQcm9maWxlcyhxdWVyeSk7XG4gICAgICB9LFxuICAgICAgb25Mb2FkTW9yZTogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChxdWVyeSB8fCAnJyk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmxvb3BTdGFydENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2xvb3BTdGFydCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ2xvb3Agc3RhcnQnLFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgICBvcHRpb25zOiBbXSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uTG9vcFN0YXJ0Q2hhbmdlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMubG9vcEVuZENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2xvb3BFbmQnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdsb29wIGVuZCcsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2UgaWYgbmVlZGVkXG4gICAgICB9XG4gICAgfTsgIFxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZExvb3BUeXBlID0gdGhpcy5sb29wVHlwZTtcbiAgICB0aGlzLnVwZGF0ZUNvbmZpZ3MoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhcInRoaXMud2hpbGVUZW1wbGF0ZXNcIix0aGlzLndoaWxlVGVtcGxhdGVzKTtcbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0T3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3MoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGFQcm9maWxlT3B0aW9ucyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3MoKTtcbiAgICAgIC8vIElmIGEgZGF0YSBwcm9maWxlIGlzIGFscmVhZHkgc2VsZWN0ZWQsIHVwZGF0ZSBsb29wIGluZGljZXNcbiAgICAgIGNvbnN0IGN1cnJlbnRQcm9maWxlSWQgPSB0aGlzLmxvb3BGb3JtLmdldCgnZGF0YVByb2ZpbGUnKT8udmFsdWU7XG4gICAgICBpZiAoY3VycmVudFByb2ZpbGVJZCkge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UoY3VycmVudFByb2ZpbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydoYXNNb3JlRGF0YVByb2ZpbGVzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nRGF0YVByb2ZpbGVzJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVByb2ZpbGVDb25maWcoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2xvb3BUeXBlJ10pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9IHRoaXMubG9vcFR5cGU7XG4gICAgfVxuICAgIC8vIE5vdGU6IGxvb3BTdGFydE9wdGlvbnMgYW5kIGxvb3BFbmRPcHRpb25zIGFyZSBub3cgY2FsY3VsYXRlZCBkeW5hbWljYWxseVxuICAgIC8vIHNvIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSB1cGRhdGVkIGZyb20gaW5wdXRzXG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbmZpZ3MoKTogdm9pZCB7XG4gICAgLy8gQ29udmVydCBEYXRhUHJvZmlsZU9wdGlvbltdIHRvIFNlbGVjdE9wdGlvbltdXG4gICAgdGhpcy5kYXRhUHJvZmlsZUNvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuZGF0YVByb2ZpbGVDb25maWcsXG4gICAgICBvcHRpb25zOiB0aGlzLmNvbnZlcnREYXRhUHJvZmlsZU9wdGlvbnNUb1NlbGVjdE9wdGlvbnModGhpcy5kYXRhUHJvZmlsZU9wdGlvbnMpLFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRGF0YVByb2ZpbGVzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ0RhdGFQcm9maWxlcyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRGF0YVByb2ZpbGVDaGFuZ2UodmFsdWUpO1xuICAgICAgfSxcbiAgICAgIG9uU2VhcmNoOiAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgICBvbkxvYWRNb3JlOiAocXVlcnk/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5IHx8ICcnKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIC8vIExvb3Agc3RhcnQgYW5kIGVuZCBvcHRpb25zIGFyZSB1cGRhdGVkIHdoZW4gZGF0YSBwcm9maWxlIGlzIHNlbGVjdGVkXG4gICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREYXRhUHJvZmlsZU9wdGlvbnNUb1NlbGVjdE9wdGlvbnMob3B0aW9uczogRGF0YVByb2ZpbGVPcHRpb25bXSk6IFNlbGVjdE9wdGlvbltdIHtcbiAgICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICBpZDogb3B0aW9uLmlkLFxuICAgICAgdmFsdWU6IG9wdGlvbi5pZCxcbiAgICAgIG5hbWU6IG9wdGlvbi5uYW1lLFxuICAgICAgbGFiZWw6IG9wdGlvbi5uYW1lXG4gICAgfSkpO1xuICB9XG4gIC8qKlxuICAgKiBIYW5kbGUgZGF0YSBwcm9maWxlIHNlbGVjdGlvbiBhbmQgdXBkYXRlIGxvb3Agc3RhcnQvZW5kIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgb25EYXRhUHJvZmlsZUNoYW5nZShwcm9maWxlSWQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUHJvZmlsZSA9IHRoaXMuZGF0YVByb2ZpbGVPcHRpb25zLmZpbmQocHJvZmlsZSA9PiBcbiAgICAgIHByb2ZpbGUuaWQgPT09IHByb2ZpbGVJZCB8fCBTdHJpbmcocHJvZmlsZS5pZCkgPT09IFN0cmluZyhwcm9maWxlSWQpXG4gICAgKTtcblxuICAgIGlmIChzZWxlY3RlZFByb2ZpbGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZSA9IHNlbGVjdGVkUHJvZmlsZTtcbiAgICAgIHRoaXMudXBkYXRlTG9vcEluZGljZXNGcm9tUHJvZmlsZShzZWxlY3RlZFByb2ZpbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVByb2ZpbGUgPSBudWxsO1xuICAgICAgdGhpcy5zdGFydEFycmF5ID0gW107XG4gICAgICB0aGlzLmVuZEFycmF5ID0gW107XG4gICAgICB0aGlzLnVwZGF0ZUxvb3BJbmRleE9wdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGxvb3AgaW5kaWNlcyBiYXNlZCBvbiBzZWxlY3RlZCBkYXRhIHByb2ZpbGVcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlTG9vcEluZGljZXNGcm9tUHJvZmlsZShwcm9maWxlOiBEYXRhUHJvZmlsZU9wdGlvbik6IHZvaWQge1xuICAgIC8vIENhbGN1bGF0ZSBkYXRhIGxlbmd0aCBmcm9tIGRhdGEgYXJyYXkgb3IgdXNlIHByb3ZpZGVkIGRhdGFMZW5ndGhcbiAgICBsZXQgZGF0YVNldExlbmd0aCA9IDE7XG4gICAgaWYgKHByb2ZpbGUuZGF0YSAmJiBBcnJheS5pc0FycmF5KHByb2ZpbGUuZGF0YSkpIHtcbiAgICAgIGRhdGFTZXRMZW5ndGggPSBwcm9maWxlLmRhdGEubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAocHJvZmlsZS5kYXRhTGVuZ3RoICYmIHByb2ZpbGUuZGF0YUxlbmd0aCA+IDApIHtcbiAgICAgIGRhdGFTZXRMZW5ndGggPSBwcm9maWxlLmRhdGFMZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHN0YXJ0IGFycmF5IGZyb20gMSB0byBkYXRhU2V0TGVuZ3RoXG4gICAgdGhpcy5zdGFydEFycmF5ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogZGF0YVNldExlbmd0aCB9LCAoXywgaSkgPT4gaSArIDEpO1xuICAgIC8vIEluaXRpYWxpemUgZW5kIGFycmF5IHNhbWUgYXMgc3RhcnQgYXJyYXlcbiAgICAvLyBFbmQgYXJyYXkgd2lsbCBiZSB1cGRhdGVkIHdoZW4gc3RhcnQgaW5kZXggaXMgc2VsZWN0ZWRcbiAgICB0aGlzLmVuZEFycmF5ID0gWy4uLnRoaXMuc3RhcnRBcnJheV07XG5cbiAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXMgaWYgZm9ybSBpcyBlbXB0eVxuICAgIGNvbnN0IGN1cnJlbnRTdGFydCA9IHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wU3RhcnQnKT8udmFsdWU7XG4gICAgY29uc3QgY3VycmVudEVuZCA9IHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wRW5kJyk/LnZhbHVlO1xuICAgIFxuICAgIGlmICghY3VycmVudFN0YXJ0ICYmIHRoaXMuc3RhcnRBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcFN0YXJ0Jyk/LnNldFZhbHVlKHRoaXMuc3RhcnRBcnJheVswXSk7XG4gICAgfVxuICAgIGlmICghY3VycmVudEVuZCAmJiB0aGlzLmVuZEFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wRW5kJyk/LnNldFZhbHVlKHRoaXMuZW5kQXJyYXlbdGhpcy5lbmRBcnJheS5sZW5ndGggLSAxXSk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGxvb3Agc3RhcnQgY2hhbmdlIGFuZCB1cGRhdGUgZW5kIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgb25Mb29wU3RhcnRDaGFuZ2Uoc3RhcnRJbmRleDogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRGF0YVByb2ZpbGUgfHwgIXN0YXJ0SW5kZXgpIHtcbiAgICAgIHRoaXMuZW5kQXJyYXkgPSBbLi4udGhpcy5zdGFydEFycmF5XTtcbiAgICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0SWR4ID0gdHlwZW9mIHN0YXJ0SW5kZXggPT09ICdzdHJpbmcnID8gcGFyc2VJbnQoc3RhcnRJbmRleCkgOiBzdGFydEluZGV4O1xuICAgIFxuICAgIGlmIChpc05hTihzdGFydElkeCkgfHwgc3RhcnRJZHggPCAxKSB7XG4gICAgICB0aGlzLmVuZEFycmF5ID0gWy4uLnRoaXMuc3RhcnRBcnJheV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEVuZCBhcnJheSBzaG91bGQgYmUgZnJvbSBzdGFydEluZGV4IHRvIGVuZCBvZiBkYXRhXG4gICAgICAvLyBCYXNlZCBvbiByZWZlcmVuY2U6IGVuZEFycmF5ID0gc3RhcnRBcnJheS5zcGxpY2Uoc3RhcnRJbmRleCAtIDEsIHN0YXJ0QXJyYXkubGVuZ3RoKVxuICAgICAgY29uc3Qgc3RhcnRBcnJheUNvcHkgPSBbLi4udGhpcy5zdGFydEFycmF5XTtcbiAgICAgIHRoaXMuZW5kQXJyYXkgPSBzdGFydEFycmF5Q29weS5zbGljZShzdGFydElkeCAtIDEpO1xuICAgIH1cblxuICAgIC8vIEF1dG8tdXBkYXRlIGVuZCBpbmRleCBpZiBjdXJyZW50IGVuZCBpcyBpbnZhbGlkXG4gICAgY29uc3QgY3VycmVudEVuZCA9IHRoaXMubG9vcEZvcm0uZ2V0KCdsb29wRW5kJyk/LnZhbHVlO1xuICAgIGNvbnN0IGVuZElkeCA9IHR5cGVvZiBjdXJyZW50RW5kID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KGN1cnJlbnRFbmQpIDogY3VycmVudEVuZDtcbiAgICBcbiAgICBpZiAoIWN1cnJlbnRFbmQgfHwgaXNOYU4oZW5kSWR4KSB8fCBlbmRJZHggPCBzdGFydElkeCkge1xuICAgICAgaWYgKHRoaXMuZW5kQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmxvb3BGb3JtLmdldCgnbG9vcEVuZCcpPy5zZXRWYWx1ZSh0aGlzLmVuZEFycmF5W3RoaXMuZW5kQXJyYXkubGVuZ3RoIC0gMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlTG9vcEluZGV4T3B0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBsb29wIHN0YXJ0IGFuZCBlbmQgY29uZmlnIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlTG9vcEluZGV4T3B0aW9ucygpOiB2b2lkIHtcbiAgICAvLyBDb252ZXJ0IHN0YXJ0QXJyYXkgdG8gU2VsZWN0T3B0aW9uc1xuICAgIGNvbnN0IHN0YXJ0T3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSB0aGlzLnN0YXJ0QXJyYXkubWFwKGlkeCA9PiAoe1xuICAgICAgaWQ6IGlkeCxcbiAgICAgIHZhbHVlOiBpZHgsXG4gICAgICBuYW1lOiBTdHJpbmcoaWR4KSxcbiAgICAgIGxhYmVsOiBTdHJpbmcoaWR4KVxuICAgIH0pKTtcblxuICAgIC8vIENvbnZlcnQgZW5kQXJyYXkgdG8gU2VsZWN0T3B0aW9uc1xuICAgIGNvbnN0IGVuZE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gdGhpcy5lbmRBcnJheS5tYXAoaWR4ID0+ICh7XG4gICAgICBpZDogaWR4LFxuICAgICAgdmFsdWU6IGlkeCxcbiAgICAgIG5hbWU6IFN0cmluZyhpZHgpLFxuICAgICAgbGFiZWw6IFN0cmluZyhpZHgpXG4gICAgfSkpO1xuXG4gICAgdGhpcy5sb29wU3RhcnRDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmxvb3BTdGFydENvbmZpZyxcbiAgICAgIG9wdGlvbnM6IFt7aWQ6IC0xLCB2YWx1ZTogLTEsIG5hbWU6ICdTdGFydCcsIGxhYmVsOiAnU3RhcnQnfSwgLi4uc3RhcnRPcHRpb25zXSxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uTG9vcFN0YXJ0Q2hhbmdlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5sb29wRW5kQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5sb29wRW5kQ29uZmlnLFxuICAgICAgb3B0aW9uczogWy4uLmVuZE9wdGlvbnMse2lkOiAtMSwgdmFsdWU6IC0xLCBuYW1lOiAnRW5kJywgbGFiZWw6ICdFbmQnfV0sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZSBpZiBuZWVkZWRcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgb25Mb29wVHlwZUNoYW5nZSh0eXBlOiBzdHJpbmcgfCBMb29wVHlwZSk6IHZvaWQge1xuICAgIGNvbnN0IGxvb3BUeXBlID0gdHlwZSBhcyBMb29wVHlwZTtcbiAgICB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgPSBsb29wVHlwZTtcbiAgICB0aGlzLmxvb3BUeXBlQ2hhbmdlLmVtaXQobG9vcFR5cGUpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkV2hpbGVUZW1wbGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yICdmb3InIGxvb3AgdHlwZVxuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5sb29wRm9ybS52YWx1ZTtcbiAgICAgIGNvbnN0IHNlbGVjdE9wdGlvbiA9IGZvcm1WYWx1ZS5zZWxlY3RPcHRpb247XG4gICAgICBcbiAgICAgIGlmICghc2VsZWN0T3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHNlbGVjdE9wdGlvbiA9PT0gJ2RhdGFQcm9maWxlJykge1xuICAgICAgICAvLyBGb3IgZGF0YSBwcm9maWxlLCBuZWVkIGRhdGFQcm9maWxlLCBsb29wU3RhcnQsIGFuZCBsb29wRW5kXG4gICAgICAgIHJldHVybiAhIShmb3JtVmFsdWUuZGF0YVByb2ZpbGUgJiYgZm9ybVZhbHVlLmxvb3BTdGFydCAmJiBmb3JtVmFsdWUubG9vcEVuZCk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdE9wdGlvbiA9PT0gJ3J1blRpbWUnKSB7XG4gICAgICAgIC8vIEZvciBydW4gdGltZSwgbmVlZCBydW5UaW1lIHZhbHVlXG4gICAgICAgIHJldHVybiAhIShmb3JtVmFsdWUucnVuVGltZSAmJiBmb3JtVmFsdWUucnVuVGltZS50cmltKCkgIT09ICcnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmxvb3BGb3JtLnZhbHVlO1xuICAgIGlmKHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJykge1xuICAgICAgaWYoIXRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3RlcERhdGE6IExvb3BGb3JtRGF0YSA9IHtcbiAgICAgIHNlbGVjdGVkTG9vcFR5cGU6IHRoaXMuc2VsZWN0ZWRMb29wVHlwZSBhcyBMb29wVHlwZSxcbiAgICAgIGxvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUsXG4gICAgICBzZWxlY3RPcHRpb246IGZvcm1WYWx1ZS5zZWxlY3RPcHRpb24gfHwgdW5kZWZpbmVkLFxuICAgICAgZGF0YVByb2ZpbGU6IGZvcm1WYWx1ZS5kYXRhUHJvZmlsZSB8fCB1bmRlZmluZWQsXG4gICAgICBsb29wU3RhcnQ6IGZvcm1WYWx1ZS5sb29wU3RhcnQgfHwgdW5kZWZpbmVkLFxuICAgICAgbG9vcEVuZDogZm9ybVZhbHVlLmxvb3BFbmQgfHwgdW5kZWZpbmVkLFxuICAgICAgcnVuVGltZTogZm9ybVZhbHVlLnJ1blRpbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgd2hpbGVUZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFdoaWxlVGVtcGxhdGUgfHwgdW5kZWZpbmVkXG4gICAgfTtcbiAgICBjb25zb2xlLmxvZygnc3RlcERhdGEnLCBzdGVwRGF0YSk7XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgY3JlYXRlV2hpbGVTdGVwKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnY3JlYXRlV2hpbGVTdGVwJywgZXZlbnQpO1xuICAgIGNvbnN0IHN0ZXBEYXRhOiBMb29wRm9ybURhdGEgPSB7XG4gICAgICBzZWxlY3RlZExvb3BUeXBlOiB0aGlzLnNlbGVjdGVkTG9vcFR5cGUgYXMgTG9vcFR5cGUsXG4gICAgICBsb29wVHlwZTogdGhpcy5zZWxlY3RlZExvb3BUeXBlIGFzIExvb3BUeXBlLFxuICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgfTtcbiAgICBjb25zb2xlLmxvZygnc3RlcERhdGEnLCBzdGVwRGF0YSk7XG4gICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzZWFyY2ggZXZlbnQgZm9yIGRhdGEgcHJvZmlsZXNcbiAgICovXG4gIG9uU2VhcmNoRGF0YVByb2ZpbGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaERhdGFQcm9maWxlcy5lbWl0KHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbG9hZE1vcmUgZXZlbnQgZm9yIGRhdGEgcHJvZmlsZXNcbiAgICovXG4gIG9uTG9hZE1vcmVEYXRhUHJvZmlsZXMoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vcmVEYXRhUHJvZmlsZXMuZW1pdChldmVudC5xdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGRhdGEgcHJvZmlsZSBjb25maWcgd2hlbiBsb2FkaW5nIHN0YXRlIG9yIGhhc01vcmUgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVEYXRhUHJvZmlsZUNvbmZpZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhUHJvZmlsZUNvbmZpZykge1xuICAgICAgdGhpcy5kYXRhUHJvZmlsZUNvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5kYXRhUHJvZmlsZUNvbmZpZyxcbiAgICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlRGF0YVByb2ZpbGVzLFxuICAgICAgICBpc0xvYWRpbmc6IHRoaXMuaXNMb2FkaW5nRGF0YVByb2ZpbGVzXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRMb29wVHlwZSA9ICdmb3InO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRhUHJvZmlsZSA9IG51bGw7XG4gICAgdGhpcy5zdGFydEFycmF5ID0gW107XG4gICAgdGhpcy5lbmRBcnJheSA9IFtdO1xuICAgIHRoaXMubG9vcEZvcm0ucmVzZXQoe1xuICAgICAgc2VsZWN0T3B0aW9uOiBudWxsLFxuICAgICAgZGF0YVByb2ZpbGU6IG51bGwsXG4gICAgICBsb29wU3RhcnQ6IG51bGwsXG4gICAgICBsb29wRW5kOiBudWxsXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVMb29wSW5kZXhPcHRpb25zKCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlU2VhcmNoVmFsdWUgPSBldmVudDtcbiAgICB0aGlzLmZpbHRlcldoaWxlVGVtcGxhdGVzKGV2ZW50KTtcbiAgfVxuXG4gIG9uV2hpbGVTZWFyY2hTdWJtaXQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25XaGlsZVNlYXJjaENoYW5nZShldmVudCk7XG4gIH1cblxuICBvbldoaWxlU2VhcmNoQ2xlYXJlZCgpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlU2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLmZpbHRlcldoaWxlVGVtcGxhdGVzKCcnKTtcbiAgfVxuXG4gIGZpbHRlcldoaWxlVGVtcGxhdGVzKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndoaWxlVGVtcGxhdGVzID0gdGhpcy53aGlsZVRlbXBsYXRlcy5maWx0ZXIodGVtcGxhdGUgPT4gdGVtcGxhdGUuaHRtbEdyYW1tYXIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpKTtcbiAgfVxuXG4gIHNlbGVjdFdoaWxlVGVtcGxhdGUodGVtcGxhdGU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRXaGlsZVRlbXBsYXRlID0gdGVtcGxhdGU7XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsIGNxYS1iZy13aGl0ZSBjcWEtcHgtNCBjcWEtcHktMlwiPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LWJsYWNrLTEwMCBjcWEtbWItNFwiPlxuICAgIENyZWF0ZSBMb29wIFRlc3QgU3RlcFxuICA8L2gyPlxuXG4gIDwhLS0gTG9vcCBUeXBlIFNlbGVjdGlvbiAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1tYi00IGNxYS13LWZ1bGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtZ2FwLTBcIiBzdHlsZT1cImhlaWdodDogMzBweDsgYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDwhLS0gRm9yIEJ1dHRvbiAtLT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXctMS8yIGNxYS10ZXh0LVsxMnB4XSBjcWEtcm91bmRlZC1tZCBjcWEtZm9udC1tZWRpdW0gY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1kdXJhdGlvbi0yMDAgY3FhLWVhc2UtaW4tb3V0IGNxYS1taW4tdy1bODBweF0gY3FhLXRleHQtY2VudGVyIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InID8gJyMzRjQzRUUnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgIFtzdHlsZS5jb2xvcl09XCJzZWxlY3RlZExvb3BUeXBlID09PSAnZm9yJyA/ICcjRkZGRkZGJyA6ICcjNkI3MjgwJ1wiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItcmFkaXVzXT1cIic4cHgnXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCInMjJweCdcIlxuICAgICAgICAoY2xpY2spPVwib25Mb29wVHlwZUNoYW5nZSgnZm9yJylcIj5cbiAgICAgICAgRm9yXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDwhLS0gV2hpbGUgQnV0dG9uIC0tPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdy0xLzIgY3FhLXRleHQtWzEycHhdIGNxYS1yb3VuZGVkLW1kIGNxYS1mb250LW1lZGl1bSBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWR1cmF0aW9uLTIwMCBjcWEtZWFzZS1pbi1vdXQgY3FhLW1pbi13LVs4MHB4XSBjcWEtdGV4dC1jZW50ZXIgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJyA/ICcjM0Y0M0VFJyA6ICd0cmFuc3BhcmVudCdcIlxuICAgICAgICBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ3doaWxlJyA/ICcjRkZGRkZGJyA6ICcjNkI3MjgwJ1wiXG4gICAgICAgIFtzdHlsZS5ib3JkZXItcmFkaXVzXT1cIic4cHgnXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCInMjJweCdcIlxuICAgICAgICAoY2xpY2spPVwib25Mb29wVHlwZUNoYW5nZSgnd2hpbGUnKVwiPlxuICAgICAgICBXaGlsZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRm9ybSBGaWVsZHMgLS0+XG4gICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMb29wVHlwZSA9PT0gJ2ZvcidcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgPCEtLSBEcm9wZG93biBGaWVsZHMgUm93IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLTQgY3FhLWZsZXgtd3JhcFwiPlxuICAgICAgPCEtLSBTZWxlY3QgT3B0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgU2VsZWN0IE9wdGlvblxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwibG9vcEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwic2VsZWN0T3B0aW9uQ29uZmlnXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb29wRm9ybS5nZXQoJ3NlbGVjdE9wdGlvbicpPy52YWx1ZSA9PT0gJ2RhdGFQcm9maWxlJ1wiPlxuICAgICAgPCEtLSBEYXRhIFByb2ZpbGUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LTFcIiBzdHlsZT1cIm1pbi13aWR0aDogY2FsYygyNSUgLSAxMnB4KTtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjVcIj5cbiAgICAgICAgICBEYXRhIFByb2ZpbGVcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImxvb3BGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImRhdGFQcm9maWxlQ29uZmlnXCJcbiAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VhcmNoRGF0YVByb2ZpbGVzKCRldmVudC5xdWVyeSlcIlxuICAgICAgICAgIChsb2FkTW9yZSk9XCJvbkxvYWRNb3JlRGF0YVByb2ZpbGVzKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBMb29wIFN0YXJ0IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xXCIgc3R5bGU9XCJtaW4td2lkdGg6IGNhbGMoMjUlIC0gMTJweCk7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMS41XCI+XG4gICAgICAgICAgTG9vcCBTdGFydFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwibG9vcEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwibG9vcFN0YXJ0Q29uZmlnXCI+XG4gICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTG9vcCBFbmQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LTFcIiBzdHlsZT1cIm1pbi13aWR0aDogY2FsYygyNSUgLSAxMnB4KTtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xLjVcIj5cbiAgICAgICAgICBMb29wIEVuZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwibG9vcEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwibG9vcEVuZENvbmZpZ1wiPlxuICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9vcEZvcm0uZ2V0KCdzZWxlY3RPcHRpb24nKT8udmFsdWUgPT09ICdydW5UaW1lJ1wiPlxuICAgICAgICA8IS0tIFJ1biBUaW1lIElucHV0IEZpZWxkIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1mbGV4LTFcIiBzdHlsZT1cIm1pbi13aWR0aDogY2FsYygyNSUgLSAxMnB4KTtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTEuNVwiPlxuICAgICAgICAgICAgUnVuIFRpbWVcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0VudGVyIFJ1biBUaW1lJ1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwibG9vcEZvcm0uZ2V0KCdydW5UaW1lJyk/LnZhbHVlXCJcbiAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwibG9vcEZvcm0uZ2V0KCdydW5UaW1lJyk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZExvb3BUeXBlID09PSAnd2hpbGUnXCI+XG4gICAgPGNxYS1zdGVwLWJ1aWxkZXItYWN0aW9uIFxuICAgICAgW3Nob3dIZWFkZXJdPVwiZmFsc2VcIiBcbiAgICAgIFt0ZW1wbGF0ZXNdPVwid2hpbGVUZW1wbGF0ZXNcIiBcbiAgICAgIFtzZXRUZW1wbGF0ZVZhcmlhYmxlc109XCJzZXRXaGlsZVRlbXBsYXRlVmFyaWFibGVzXCIgXG4gICAgICBbc2VhcmNoUGxhY2Vob2xkZXJdPVwid2hpbGVTZWFyY2hQbGFjZWhvbGRlclwiXG4gICAgICBbZWxlbWVudE9wdGlvbnNdPVwiZWxlbWVudE9wdGlvbnNcIlxuICAgICAgW2hhc01vcmVFbGVtZW50c109XCJoYXNNb3JlRWxlbWVudHNcIlxuICAgICAgW2lzTG9hZGluZ0VsZW1lbnRzXT1cImlzTG9hZGluZ0VsZW1lbnRzXCJcbiAgICAgIFtzY3JlZW5OYW1lT3B0aW9uc109XCJzY3JlZW5OYW1lT3B0aW9uc1wiXG4gICAgICBbaGFzTW9yZVNjcmVlbk5hbWVzXT1cImhhc01vcmVTY3JlZW5OYW1lc1wiXG4gICAgICBbaXNMb2FkaW5nU2NyZWVuTmFtZXNdPVwiaXNMb2FkaW5nU2NyZWVuTmFtZXNcIlxuICAgICAgKHRlbXBsYXRlQ2hhbmdlZCk9XCJzZWxlY3RXaGlsZVRlbXBsYXRlKCRldmVudClcIiBcbiAgICAgIChjcmVhdGVTdGVwKT1cImNyZWF0ZVdoaWxlU3RlcCgkZXZlbnQpXCJcbiAgICAgIChsb2FkTW9yZUVsZW1lbnRzKT1cImxvYWRNb3JlRWxlbWVudHMuZW1pdCgpXCJcbiAgICAgIChzZWFyY2hFbGVtZW50cyk9XCJzZWFyY2hFbGVtZW50cy5lbWl0KCRldmVudClcIlxuICAgICAgKGNyZWF0ZUVsZW1lbnQpPVwiY3JlYXRlRWxlbWVudC5lbWl0KCRldmVudClcIlxuICAgICAgKHNlYXJjaFNjcmVlbk5hbWUpPVwic2VhcmNoU2NyZWVuTmFtZS5lbWl0KCRldmVudClcIlxuICAgICAgKGxvYWRNb3JlU2NyZWVuTmFtZXMpPVwibG9hZE1vcmVTY3JlZW5OYW1lcy5lbWl0KCRldmVudClcIlxuICAgICAgKGNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0KT1cImNyZWF0ZVNjcmVlbk5hbWVSZXF1ZXN0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAoY2FuY2VsRWxlbWVudEZvcm0pPVwiY2FuY2VsRWxlbWVudEZvcm0uZW1pdCgpXCI+XG4gICAgPC9jcWEtc3RlcC1idWlsZGVyLWFjdGlvbj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdGVkTG9vcFR5cGUgPT09ICdmb3InXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtbXQtNiBjcWEtcHQtNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICBjbGFzcz1cImNxYS13LTEvMlwiXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgdGV4dD1cIkNhbmNlbFwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8Y3FhLWJ1dHRvblxuICAgICAgY2xhc3M9XCJjcWEtdy0xLzJcIlxuICAgICAgdmFyaWFudD1cImZpbGxlZFwiXG4gICAgICB0ZXh0PVwiQ3JlYXRlIFN0ZXBcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgIFtkaXNhYmxlZF09XCIhaXNGb3JtVmFsaWQoKVwiXG4gICAgICAoY2xpY2tlZCk9XCJvbkNyZWF0ZVN0ZXAoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19