@cqa-lib/cqa-ui 1.1.179 → 1.1.181
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/esm2020/lib/custom-textarea/custom-textarea.component.mjs +6 -3
- package/esm2020/lib/custom-toggle/custom-toggle.component.mjs +35 -0
- package/esm2020/lib/execution-screen/ai-action-step/ai-action-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/ai-agent-step/ai-agent-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/api-step/api-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/basic-step/basic-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/condition-step/condition-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/document-verification-step/document-verification-step.component.mjs +9 -3
- package/esm2020/lib/execution-screen/file-download-step/file-download-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/live-execution-step/live-execution-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/loop-step/loop-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/step-group/step-group.component.mjs +6 -3
- package/esm2020/lib/file-upload/file-upload.component.mjs +87 -0
- package/esm2020/lib/item-list/item-list.component.mjs +59 -0
- package/esm2020/lib/item-list/item-list.model.mjs +2 -0
- package/esm2020/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.mjs +136 -0
- package/esm2020/lib/step-builder/step-builder-custom-code/step-builder-custom-code.component.mjs +65 -0
- package/esm2020/lib/step-builder/step-builder-database/step-builder-database.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-document/step-builder-document.component.mjs +241 -0
- package/esm2020/lib/step-builder/step-builder-document-generation-template-step/step-builder-document-generation-template-step.component.mjs +176 -0
- package/esm2020/lib/step-builder/step-builder-record-step/step-builder-record-step.component.mjs +31 -0
- package/esm2020/lib/test-case-details/custom-edit-step/custom-edit-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/element-list/element-list.component.mjs +50 -0
- package/esm2020/lib/test-case-details/element-popup/element-popup-data.mjs +5 -0
- package/esm2020/lib/test-case-details/element-popup/element-popup-ref.mjs +32 -0
- package/esm2020/lib/test-case-details/element-popup/element-popup.component.mjs +272 -0
- package/esm2020/lib/test-case-details/element-popup/element-popup.service.mjs +97 -0
- package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +151 -19
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-data.mjs +5 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-environment.model.mjs +10 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-parameter.model.mjs +8 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-ref.mjs +32 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal.component.mjs +301 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal.service.mjs +97 -0
- package/esm2020/lib/ui-kit.module.mjs +58 -3
- package/esm2020/lib/utils/tw-overlay-container.mjs +7 -3
- package/esm2020/public-api.mjs +19 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +2971 -1106
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +2966 -1121
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/custom-textarea/custom-textarea.component.d.ts +2 -1
- package/lib/custom-toggle/custom-toggle.component.d.ts +12 -0
- package/lib/execution-screen/ai-action-step/ai-action-step.component.d.ts +2 -1
- package/lib/execution-screen/ai-agent-step/ai-agent-step.component.d.ts +2 -1
- package/lib/execution-screen/api-step/api-step.component.d.ts +2 -1
- package/lib/execution-screen/basic-step/basic-step.component.d.ts +2 -1
- package/lib/execution-screen/condition-step/condition-step.component.d.ts +2 -1
- package/lib/execution-screen/db-verification-step/db-verification-step.component.d.ts +2 -1
- package/lib/execution-screen/document-verification-step/document-verification-step.component.d.ts +2 -1
- package/lib/execution-screen/file-download-step/file-download-step.component.d.ts +2 -1
- package/lib/execution-screen/live-execution-step/live-execution-step.component.d.ts +2 -1
- package/lib/execution-screen/loop-step/loop-step.component.d.ts +2 -1
- package/lib/execution-screen/step-group/step-group.component.d.ts +2 -1
- package/lib/file-upload/file-upload.component.d.ts +26 -0
- package/lib/item-list/item-list.component.d.ts +25 -0
- package/lib/item-list/item-list.model.d.ts +16 -0
- package/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.d.ts +47 -0
- package/lib/step-builder/step-builder-custom-code/step-builder-custom-code.component.d.ts +27 -0
- package/lib/step-builder/step-builder-document/step-builder-document.component.d.ts +81 -0
- package/lib/step-builder/step-builder-document-generation-template-step/step-builder-document-generation-template-step.component.d.ts +55 -0
- package/lib/step-builder/step-builder-record-step/step-builder-record-step.component.d.ts +16 -0
- package/lib/test-case-details/element-list/element-list.component.d.ts +26 -0
- package/lib/test-case-details/element-popup/element-popup-data.d.ts +16 -0
- package/lib/test-case-details/element-popup/element-popup-ref.d.ts +13 -0
- package/lib/test-case-details/element-popup/element-popup.component.d.ts +60 -0
- package/lib/test-case-details/element-popup/element-popup.service.d.ts +23 -0
- package/lib/test-case-details/normal-step/normal-step.component.d.ts +17 -2
- package/lib/test-case-details/test-data-modal/test-data-modal-data.d.ts +31 -0
- package/lib/test-case-details/test-data-modal/test-data-modal-environment.model.d.ts +12 -0
- package/lib/test-case-details/test-data-modal/test-data-modal-parameter.model.d.ts +11 -0
- package/lib/test-case-details/test-data-modal/test-data-modal-ref.d.ts +13 -0
- package/lib/test-case-details/test-data-modal/test-data-modal.component.d.ts +91 -0
- package/lib/test-case-details/test-data-modal/test-data-modal.service.d.ts +23 -0
- package/lib/ui-kit.module.d.ts +60 -49
- package/package.json +1 -1
- package/public-api.d.ts +18 -0
- package/styles.css +1 -1
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
/** Sentinel returned from afterClosed() when user clicked "Edit in depth". */
|
|
3
|
+
export const ELEMENT_POPUP_EDIT_IN_DEPTH = Symbol('ElementPopupEditInDepth');
|
|
4
|
+
export const ELEMENT_POPUP_DATA = new InjectionToken('ELEMENT_POPUP_DATA');
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC1wb3B1cC1kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy9lbGVtZW50LXBvcHVwL2VsZW1lbnQtcG9wdXAtZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBZ0IvQyw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFFN0UsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQ2xELG9CQUFvQixDQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRQb3B1cERhdGEge1xuICBlbGVtZW50PzogRWxlbWVudFBvcHVwRGF0YUVsZW1lbnRzO1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICBlbGVtZW50czogRWxlbWVudFBvcHVwRGF0YUVsZW1lbnRzW107XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGhlbHBVcmw/OiBzdHJpbmc7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50UG9wdXBEYXRhRWxlbWVudHMge1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICB0aXRsZTogc3RyaW5nO1xuICBzZWxlY3Rvcj86IHN0cmluZztcbn1cbi8qKiBTZW50aW5lbCByZXR1cm5lZCBmcm9tIGFmdGVyQ2xvc2VkKCkgd2hlbiB1c2VyIGNsaWNrZWQgXCJFZGl0IGluIGRlcHRoXCIuICovXG5leHBvcnQgY29uc3QgRUxFTUVOVF9QT1BVUF9FRElUX0lOX0RFUFRIID0gU3ltYm9sKCdFbGVtZW50UG9wdXBFZGl0SW5EZXB0aCcpO1xuXG5leHBvcnQgY29uc3QgRUxFTUVOVF9QT1BVUF9EQVRBID0gbmV3IEluamVjdGlvblRva2VuPEVsZW1lbnRQb3B1cERhdGE+KFxuICAnRUxFTUVOVF9QT1BVUF9EQVRBJ1xuKTtcbiJdfQ==
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
export class ElementPopupRef {
|
|
4
|
+
constructor(overlayRef) {
|
|
5
|
+
this.overlayRef = overlayRef;
|
|
6
|
+
this.closed$ = new Subject();
|
|
7
|
+
this.isClosed = false;
|
|
8
|
+
this.overlayRef.detachments().subscribe(() => {
|
|
9
|
+
this.finishClose(undefined);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
close(result) {
|
|
13
|
+
if (this.isClosed) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
this.finishClose(result);
|
|
17
|
+
this.overlayRef.dispose();
|
|
18
|
+
}
|
|
19
|
+
afterClosed() {
|
|
20
|
+
return this.closed$.asObservable();
|
|
21
|
+
}
|
|
22
|
+
finishClose(result) {
|
|
23
|
+
if (this.isClosed) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
this.isClosed = true;
|
|
27
|
+
this.closed$.next(result);
|
|
28
|
+
this.closed$.complete();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export const CUSTOM_ELEMENT_POPUP_REF = new InjectionToken('CUSTOM_ELEMENT_POPUP_REF');
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC1wb3B1cC1yZWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2VsZW1lbnQtcG9wdXAvZWxlbWVudC1wb3B1cC1yZWYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE1BQU0sT0FBTyxlQUFlO0lBSTFCLFlBQTZCLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFIbEMsWUFBTyxHQUFHLElBQUksT0FBTyxFQUF1QixDQUFDO1FBQ3RELGFBQVEsR0FBRyxLQUFLLENBQUM7UUFHdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQWdCO1FBQ3BCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVPLFdBQVcsQ0FBQyxNQUEyQjtRQUM3QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLGNBQWMsQ0FDeEQsMEJBQTBCLENBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRQb3B1cFJlZjxUUmVzdWx0ID0gc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xvc2VkJCA9IG5ldyBTdWJqZWN0PFRSZXN1bHQgfCB1bmRlZmluZWQ+KCk7XG4gIHByaXZhdGUgaXNDbG9zZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYpIHtcbiAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNobWVudHMoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5maW5pc2hDbG9zZSh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UocmVzdWx0PzogVFJlc3VsdCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQ2xvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZmluaXNoQ2xvc2UocmVzdWx0KTtcbiAgICB0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICB9XG5cbiAgYWZ0ZXJDbG9zZWQoKTogT2JzZXJ2YWJsZTxUUmVzdWx0IHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoQ2xvc2UocmVzdWx0OiBUUmVzdWx0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNDbG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc0Nsb3NlZCA9IHRydWU7XG4gICAgdGhpcy5jbG9zZWQkLm5leHQocmVzdWx0KTtcbiAgICB0aGlzLmNsb3NlZCQuY29tcGxldGUoKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgQ1VTVE9NX0VMRU1FTlRfUE9QVVBfUkVGID0gbmV3IEluamVjdGlvblRva2VuPEVsZW1lbnRQb3B1cFJlZj4oXG4gICdDVVNUT01fRUxFTUVOVF9QT1BVUF9SRUYnXG4pO1xuIl19
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output, } from '@angular/core';
|
|
2
|
+
import { ELEMENT_POPUP_DATA, ELEMENT_POPUP_EDIT_IN_DEPTH, } from './element-popup-data';
|
|
3
|
+
import { CUSTOM_ELEMENT_POPUP_REF } from './../element-popup/element-popup-ref';
|
|
4
|
+
import { FormBuilder, Validators } from '@angular/forms';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/forms";
|
|
7
|
+
import * as i2 from "@angular/material/icon";
|
|
8
|
+
import * as i3 from "../../custom-input/custom-input.component";
|
|
9
|
+
import * as i4 from "../../dynamic-select/dynamic-select-field.component";
|
|
10
|
+
import * as i5 from "../../button/button.component";
|
|
11
|
+
import * as i6 from "../../badge/badge.component";
|
|
12
|
+
import * as i7 from "../../search-bar/search-bar.component";
|
|
13
|
+
import * as i8 from "../element-list/element-list.component";
|
|
14
|
+
import * as i9 from "@angular/common";
|
|
15
|
+
import * as i10 from "./../element-popup/element-popup-ref";
|
|
16
|
+
export class ElementPopupComponent {
|
|
17
|
+
constructor(ref, data, fb, cdr) {
|
|
18
|
+
this.ref = ref;
|
|
19
|
+
this.cdr = cdr;
|
|
20
|
+
this.value = '';
|
|
21
|
+
this.helpUrl = '';
|
|
22
|
+
this.labels = [];
|
|
23
|
+
this.element = { title: '', selector: '', labels: [] };
|
|
24
|
+
this.elements = [];
|
|
25
|
+
this.enableForm = false;
|
|
26
|
+
this.isOnRecord = false;
|
|
27
|
+
this.apply = new EventEmitter();
|
|
28
|
+
this.cancel = new EventEmitter();
|
|
29
|
+
this.editInDepth = new EventEmitter();
|
|
30
|
+
this.searchElement = new EventEmitter();
|
|
31
|
+
/** Tooltip shown when hovering over the "Need help ?" icon and text */
|
|
32
|
+
this.helpTooltipText = 'Not sure what to do? Click to go to our detailed step creation documentation';
|
|
33
|
+
/** Whether the help tooltip is visible (custom tooltip for use inside overlay) */
|
|
34
|
+
this.showHelpTooltip = false;
|
|
35
|
+
/** Whether we're in edit mode (true) or create mode (false) */
|
|
36
|
+
this.isEditMode = false;
|
|
37
|
+
/** Cached select options to avoid recomputing on every change detection */
|
|
38
|
+
this.cachedSelectOptions = [];
|
|
39
|
+
this.injectedData = data;
|
|
40
|
+
// Initialize FormBuilder if not injected (for Storybook/testing scenarios)
|
|
41
|
+
this.fb = fb || new FormBuilder();
|
|
42
|
+
this.initializeForm();
|
|
43
|
+
}
|
|
44
|
+
ngOnChanges(changes) {
|
|
45
|
+
// Update cached options when labels input changes
|
|
46
|
+
if (changes['labels'] && !changes['labels'].firstChange) {
|
|
47
|
+
this.updateSelectOptions();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
ngOnInit() {
|
|
51
|
+
// Use injected data if inputs are not provided (for backward compatibility)
|
|
52
|
+
if (this.injectedData) {
|
|
53
|
+
if (!this.value) {
|
|
54
|
+
this.value = this.injectedData.description ?? '';
|
|
55
|
+
}
|
|
56
|
+
if (!this.helpUrl) {
|
|
57
|
+
this.helpUrl = this.injectedData.helpUrl ?? '';
|
|
58
|
+
}
|
|
59
|
+
if (this.labels.length === 0) {
|
|
60
|
+
this.labels = this.injectedData.labels ?? [];
|
|
61
|
+
}
|
|
62
|
+
if (this.elements.length === 0) {
|
|
63
|
+
this.elements = this.injectedData.elements ?? [];
|
|
64
|
+
}
|
|
65
|
+
if (!this.element || !this.element.title) {
|
|
66
|
+
this.element = this.injectedData.element ?? { title: '', selector: '', labels: [] };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Update select options after labels are potentially set
|
|
70
|
+
this.updateSelectOptions();
|
|
71
|
+
}
|
|
72
|
+
initializeForm() {
|
|
73
|
+
this.form = this.fb.group({
|
|
74
|
+
name: ['', [Validators.required]],
|
|
75
|
+
screenName: ['', [Validators.required]],
|
|
76
|
+
value: ['', [Validators.required]],
|
|
77
|
+
label: [null]
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
populateFormForEdit() {
|
|
81
|
+
if (this.element && this.element.title) {
|
|
82
|
+
this.isEditMode = true;
|
|
83
|
+
this.form.patchValue({
|
|
84
|
+
name: this.element.title || '',
|
|
85
|
+
screenName: this.element.selector || '',
|
|
86
|
+
value: this.element.selector || '',
|
|
87
|
+
label: this.element.labels && this.element.labels.length > 0 ? this.element.labels[0] : null
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
this.isEditMode = false;
|
|
92
|
+
this.form.reset();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
resetForm() {
|
|
96
|
+
this.isEditMode = false;
|
|
97
|
+
this.form.reset({
|
|
98
|
+
name: '',
|
|
99
|
+
screenName: '',
|
|
100
|
+
value: '',
|
|
101
|
+
label: null
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
onApply() {
|
|
105
|
+
if (this.form.invalid) {
|
|
106
|
+
// Mark all fields as touched to show validation errors
|
|
107
|
+
Object.keys(this.form.controls).forEach(key => {
|
|
108
|
+
this.form.get(key)?.markAsTouched();
|
|
109
|
+
});
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const formValue = this.form.value;
|
|
113
|
+
const elementData = {
|
|
114
|
+
title: formValue.name,
|
|
115
|
+
selector: formValue.value,
|
|
116
|
+
labels: formValue.label ? [formValue.label] : []
|
|
117
|
+
};
|
|
118
|
+
if (this.isEditMode) {
|
|
119
|
+
// Update existing element
|
|
120
|
+
this.element = elementData;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// Create new element
|
|
124
|
+
this.elements = [...this.elements, elementData];
|
|
125
|
+
this.element = elementData;
|
|
126
|
+
}
|
|
127
|
+
// Emit the selector value (for backward compatibility)
|
|
128
|
+
this.value = formValue.value;
|
|
129
|
+
this.apply.emit(formValue.value);
|
|
130
|
+
this.ref.close(formValue.value);
|
|
131
|
+
// Close form after applying
|
|
132
|
+
this.enableForm = false;
|
|
133
|
+
this.resetForm();
|
|
134
|
+
}
|
|
135
|
+
toggleForm() {
|
|
136
|
+
if (!this.enableForm) {
|
|
137
|
+
// Opening form - check if we're editing existing element
|
|
138
|
+
this.populateFormForEdit();
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
// Closing form - reset
|
|
142
|
+
this.resetForm();
|
|
143
|
+
}
|
|
144
|
+
this.enableForm = !this.enableForm;
|
|
145
|
+
}
|
|
146
|
+
/** Called when "Create New" button is clicked - explicitly sets create mode */
|
|
147
|
+
openCreateForm() {
|
|
148
|
+
this.isEditMode = false;
|
|
149
|
+
this.resetForm();
|
|
150
|
+
this.enableForm = true;
|
|
151
|
+
}
|
|
152
|
+
toggleRecord() {
|
|
153
|
+
this.isOnRecord = !this.isOnRecord;
|
|
154
|
+
}
|
|
155
|
+
onCancel() {
|
|
156
|
+
// Reset form when canceling
|
|
157
|
+
if (this.enableForm) {
|
|
158
|
+
this.resetForm();
|
|
159
|
+
this.enableForm = false;
|
|
160
|
+
}
|
|
161
|
+
this.cancel.emit();
|
|
162
|
+
this.ref.close(undefined);
|
|
163
|
+
}
|
|
164
|
+
onClose() {
|
|
165
|
+
this.onCancel();
|
|
166
|
+
}
|
|
167
|
+
onEditInDepth(event) {
|
|
168
|
+
event.preventDefault();
|
|
169
|
+
this.editInDepth.emit();
|
|
170
|
+
this.ref.close(ELEMENT_POPUP_EDIT_IN_DEPTH);
|
|
171
|
+
}
|
|
172
|
+
search(event) {
|
|
173
|
+
console.log(event);
|
|
174
|
+
this.searchElement.emit(event);
|
|
175
|
+
}
|
|
176
|
+
onHelp(event) {
|
|
177
|
+
if (this.helpUrl) {
|
|
178
|
+
event.preventDefault();
|
|
179
|
+
window.open(this.helpUrl, '_blank');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
onVariableValueChange(variableName, value) {
|
|
183
|
+
console.log(value);
|
|
184
|
+
}
|
|
185
|
+
/** Update cached select options when labels change */
|
|
186
|
+
updateSelectOptions() {
|
|
187
|
+
// Limit options to prevent performance issues - only use unique labels, max 100
|
|
188
|
+
const uniqueLabels = Array.from(new Set(this.labels || [])).slice(0, 100);
|
|
189
|
+
this.cachedSelectOptions = uniqueLabels.map(label => ({
|
|
190
|
+
id: label,
|
|
191
|
+
name: label
|
|
192
|
+
}));
|
|
193
|
+
// Clear cached config to force recreation
|
|
194
|
+
this.cachedSelectConfig = undefined;
|
|
195
|
+
}
|
|
196
|
+
getSelectConfig() {
|
|
197
|
+
// Return cached config if available and labels haven't changed
|
|
198
|
+
if (this.cachedSelectConfig) {
|
|
199
|
+
return this.cachedSelectConfig;
|
|
200
|
+
}
|
|
201
|
+
// Create new config with cached options
|
|
202
|
+
this.cachedSelectConfig = {
|
|
203
|
+
key: "label",
|
|
204
|
+
label: "Label",
|
|
205
|
+
placeholder: "Select label",
|
|
206
|
+
options: this.cachedSelectOptions,
|
|
207
|
+
onChange: (value) => {
|
|
208
|
+
this.form.patchValue({ label: value });
|
|
209
|
+
this.onVariableValueChange("label", value);
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
return this.cachedSelectConfig;
|
|
213
|
+
}
|
|
214
|
+
getFormControl(controlName) {
|
|
215
|
+
return this.form.get(controlName);
|
|
216
|
+
}
|
|
217
|
+
getFormControlValue(controlName) {
|
|
218
|
+
return this.form.get(controlName)?.value || '';
|
|
219
|
+
}
|
|
220
|
+
onFormControlChange(controlName, value) {
|
|
221
|
+
this.form.patchValue({ [controlName]: value });
|
|
222
|
+
}
|
|
223
|
+
onElementClick(element) {
|
|
224
|
+
// Handle element click - you can customize this behavior
|
|
225
|
+
this.element = element;
|
|
226
|
+
// Optionally close the form if it's open
|
|
227
|
+
if (this.enableForm) {
|
|
228
|
+
this.enableForm = false;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
ElementPopupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ElementPopupComponent, deps: [{ token: CUSTOM_ELEMENT_POPUP_REF }, { token: ELEMENT_POPUP_DATA, optional: true }, { token: i1.FormBuilder, optional: true }, { token: i0.ChangeDetectorRef, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
233
|
+
ElementPopupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ElementPopupComponent, selector: "cqa-element-popup", inputs: { value: "value", helpUrl: "helpUrl", labels: "labels", element: "element", elements: "elements", enableForm: "enableForm", isOnRecord: "isOnRecord" }, outputs: { apply: "apply", cancel: "cancel", editInDepth: "editInDepth", searchElement: "searchElement" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-[500px] cqa-flex cqa-flex-col cqa-gap-[12px] cqa-p-2 cqa-box-border\">\n <!-- Header: title left; Need help? + close icon right -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-4\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0 cqa-font-[600]\">\n Element\n </h2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Need help? with custom tooltip (works inside overlay) -->\n <div class=\"cqa-relative cqa-inline-flex\"\n (mouseenter)=\"showHelpTooltip = true\" (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"helpUrl\" href=\"#\" (click)=\"onHelp($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!helpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <!-- Custom tooltip (exact spec: 306\u00D720 content, 6px radius, #0A0A0A, no arrow) -->\n <div *ngIf=\"showHelpTooltip\" class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100]\"\n style=\"top: -24px; left: -125px;\"\n role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-center cqa-whitespace-nowrap\"\n style=\"width: 306px; min-height: 20px; border-radius: 6px; opacity: 1; padding: 4px 8px; background-color: #0A0A0A; line-height: 20px; font-size: 8px;\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-p-1 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- Line below header (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <ng-container *ngIf=\"enableForm && !isOnRecord\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-px-1 cqa-pt-3\">\n <div class=\"cqa-flex cqa-gap-1.5\">\n <cqa-custom-input \n class=\"cqa-w-1/2\" \n label=\"Name\" \n placeholder=\"default-element\"\n [value]=\"getFormControlValue('name')\"\n [errors]=\"getFormControl('name')?.touched && getFormControl('name')?.invalid ? ['Name is required'] : []\"\n [required]=\"true\"\n (valueChange)=\"onFormControlChange('name', $event)\">\n </cqa-custom-input>\n <cqa-custom-input \n class=\"cqa-w-1/2\" \n label=\"Screen Name\" \n placeholder=\"default-screen\"\n [value]=\"getFormControlValue('screenName')\"\n [errors]=\"getFormControl('screenName')?.touched && getFormControl('screenName')?.invalid ? ['Screen Name is required'] : []\"\n [required]=\"true\"\n (valueChange)=\"onFormControlChange('screenName', $event)\">\n </cqa-custom-input>\n </div>\n <cqa-custom-input \n class=\"cqa-w-full\" \n label=\"Enter Value\" \n placeholder=\"#default_id\"\n [value]=\"getFormControlValue('value')\"\n [errors]=\"getFormControl('value')?.touched && getFormControl('value')?.invalid ? ['Value is required'] : []\"\n [required]=\"true\"\n (valueChange)=\"onFormControlChange('value', $event)\">\n </cqa-custom-input>\n <div class=\"cqa-w-full cqa-position-relative\">\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig()\"></cqa-dynamic-select>\n </div>\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Cancel'\" [fullWidth]=\"true\" (clicked)=\"toggleForm()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"isEditMode ? 'Update' : 'Create'\" [fullWidth]=\"true\" (clicked)=\"onApply()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n </div>\n </div>\n <a href=\"#\" (click)=\"onEditInDepth($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-1.5 cqa-no-underline hover:cqa-no-underline cqa-self-center\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">open_in_new</mat-icon>\n Edit in depth (open detailed right panel)\n </a>\n </div>\n </ng-container>\n\n<ng-container *ngIf=\"isOnRecord && !enableForm\">\n <div\n class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-text-center cqa-gap-3 cqa-pt-10\">\n\n <!-- Video Icon -->\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-[64px] cqa-h-[64px] cqa-rounded-full cqa-bg-[#FEE2E2]\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21.333 17.3333L28.297 21.9759C28.3974 22.0428 28.514 22.0811 28.6345 22.0868C28.7549 22.0926 28.8747 22.0656 28.981 22.0087C29.0873 21.9517 29.1762 21.8671 29.2382 21.7636C29.3002 21.6602 29.3329 21.5419 29.333 21.4213V10.4933C29.333 10.376 29.3021 10.2607 29.2434 10.1592C29.1846 10.0577 29.1001 9.97344 28.9984 9.91501C28.8967 9.85658 28.7814 9.82602 28.6641 9.82642C28.5468 9.82682 28.4317 9.85816 28.3303 9.91728L21.333 13.9999\" stroke=\"#E7000B\" stroke-width=\"2.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M18.667 8H5.33366C3.8609 8 2.66699 9.19391 2.66699 10.6667V21.3333C2.66699 22.8061 3.8609 24 5.33366 24H18.667C20.1398 24 21.3337 22.8061 21.3337 21.3333V10.6667C21.3337 9.19391 20.1398 8 18.667 8Z\" stroke=\"#E7000B\" stroke-width=\"2.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n \n </div>\n\n <!-- Title -->\n <h4 class=\"cqa-m-0 cqa-text-[16px] cqa-leading-[24px] cqa-font-[600] cqa-text-[#0A0A0A]\">\n Recording Mode Active\n </h4>\n\n <!-- Subtitle -->\n <p class=\"cqa-m-0 cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280]\">\n Click on any element in the browser to capture it\n </p>\n </div>\n\n <!-- Footer -->\n <div class=\"cqa-flex cqa-justify-center cqa-pb-4\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n [text]=\"'Cancel Recording'\"\n (clicked)=\"toggleRecord()\"\n [customClass]=\"'cqa-text-[14px] cqa-px-16 cqa-py-[9px] cqa-border-[#414146]'\">\n </cqa-button>\n </div>\n</ng-container>\n\n\n <ng-container *ngIf=\"!enableForm && !isOnRecord\">\n<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-px-1 cqa-pt-3\">\n\n <!-- Selected -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Selected</span>\n\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-between\n cqa-bg-[#FFFBEB] cqa-border cqa-border-[#fadfba]\n cqa-rounded-lg cqa-p-3 cqa-border-solid cqa-gap-3\">\n\n <div class=\"cqa-flex cqa-px-3 cqa-py-2 cqa-rounded-lg cqa-flex-col cqa-gap-0.5 cqa-bg-[#f5f5f5] cqa-flex-1\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <span class=\"cqa-text-[14px] cqa-font-[600] cqa-text-[#111827]\">\n {{element.title}}\n </span>\n\n <div class=\"cqa-flex cqa-gap-2\">\n <span *ngFor=\"let l of element.labels\"\n class=\"cqa-text-[10px] cqa-px-1.5 cqa-py-0.5\n cqa-rounded cqa-bg-[#EEF2FF] cqa-text-[#3F43EE] cqa-rounded-full cqa-px-2 cqa-bg-[#eff6ff] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{l}}\n </span>\n </div>\n </div>\n\n <span class=\"cqa-text-[11px] cqa-text-[#6B7280]\">\n {{element.selector}}\n </span>\n </div>\n <cqa-button variant=\"outlined\" icon=\"edit\" btnSize=\"lg\" [text]=\"'Edit'\" [fullWidth]=\"true\" (clicked)=\"toggleForm()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n </div>\n\n <!-- Recent -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Recent</span>\n\n <div class=\"cqa-flex cqa-gap-2 cqa-overflow-x-auto cqa-scrollbar-thin cqa-scrollbar-track-transparent cqa-scrollbar-thumb-[#E5E7EB] cqa-scrollbar-thumb-rounded-full cqa-scrollbar-thumb-hover:cqa-bg-[#D1D5DB]\">\n\n <cqa-badge *ngFor=\"let label of labels\" class=\"cqa-element-badge cqa-mb-2 cqa-chip !cqa-bg-white !cqa-text-[12px] cqa-whitespace-nowrap\" [label]=\"label\"></cqa-badge>\n </div>\n </div>\n\n <!-- Element Library -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Element Library</span>\n <cqa-search-bar [fullWidth]=\"true\" placeholder=\"Search library\" (valueChange)=\"search($event)\"></cqa-search-bar> \n </div>\n\n <cqa-element-list \n [items]=\"elements\"\n [titleKey]=\"'title'\"\n [selectorKey]=\"'selector'\"\n [labelsKey]=\"'labels'\"\n [maxHeight]=\"'200px'\"\n (itemClick)=\"onElementClick($event)\">\n </cqa-element-list>\n</div>\n\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" icon=\"radio_button_checked\" btnSize=\"lg\" [text]=\"'Record'\" [fullWidth]=\"true\" (clicked)=\"toggleRecord()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" icon=\"add\" btnSize=\"lg\" [text]=\"'Create New'\" [fullWidth]=\"true\" (clicked)=\"openCreateForm()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n\n</div>\n", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.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: i4.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore"] }, { type: i5.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i6.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading"] }, { type: i7.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i8.ElementListComponent, selector: "cqa-element-list", inputs: ["items", "titleKey", "selectorKey", "labelsKey", "maxHeight"], outputs: ["itemClick"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
234
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ElementPopupComponent, decorators: [{
|
|
235
|
+
type: Component,
|
|
236
|
+
args: [{ selector: 'cqa-element-popup', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-[500px] cqa-flex cqa-flex-col cqa-gap-[12px] cqa-p-2 cqa-box-border\">\n <!-- Header: title left; Need help? + close icon right -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-4\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0 cqa-font-[600]\">\n Element\n </h2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Need help? with custom tooltip (works inside overlay) -->\n <div class=\"cqa-relative cqa-inline-flex\"\n (mouseenter)=\"showHelpTooltip = true\" (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"helpUrl\" href=\"#\" (click)=\"onHelp($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!helpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#help-icon-clip-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"help-icon-clip-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <!-- Custom tooltip (exact spec: 306\u00D720 content, 6px radius, #0A0A0A, no arrow) -->\n <div *ngIf=\"showHelpTooltip\" class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100]\"\n style=\"top: -24px; left: -125px;\"\n role=\"tooltip\">\n <div class=\"cqa-text-white cqa-text-center cqa-whitespace-nowrap\"\n style=\"width: 306px; min-height: 20px; border-radius: 6px; opacity: 1; padding: 4px 8px; background-color: #0A0A0A; line-height: 20px; font-size: 8px;\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-p-1 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- Line below header (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <ng-container *ngIf=\"enableForm && !isOnRecord\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-px-1 cqa-pt-3\">\n <div class=\"cqa-flex cqa-gap-1.5\">\n <cqa-custom-input \n class=\"cqa-w-1/2\" \n label=\"Name\" \n placeholder=\"default-element\"\n [value]=\"getFormControlValue('name')\"\n [errors]=\"getFormControl('name')?.touched && getFormControl('name')?.invalid ? ['Name is required'] : []\"\n [required]=\"true\"\n (valueChange)=\"onFormControlChange('name', $event)\">\n </cqa-custom-input>\n <cqa-custom-input \n class=\"cqa-w-1/2\" \n label=\"Screen Name\" \n placeholder=\"default-screen\"\n [value]=\"getFormControlValue('screenName')\"\n [errors]=\"getFormControl('screenName')?.touched && getFormControl('screenName')?.invalid ? ['Screen Name is required'] : []\"\n [required]=\"true\"\n (valueChange)=\"onFormControlChange('screenName', $event)\">\n </cqa-custom-input>\n </div>\n <cqa-custom-input \n class=\"cqa-w-full\" \n label=\"Enter Value\" \n placeholder=\"#default_id\"\n [value]=\"getFormControlValue('value')\"\n [errors]=\"getFormControl('value')?.touched && getFormControl('value')?.invalid ? ['Value is required'] : []\"\n [required]=\"true\"\n (valueChange)=\"onFormControlChange('value', $event)\">\n </cqa-custom-input>\n <div class=\"cqa-w-full cqa-position-relative\">\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig()\"></cqa-dynamic-select>\n </div>\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Cancel'\" [fullWidth]=\"true\" (clicked)=\"toggleForm()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"isEditMode ? 'Update' : 'Create'\" [fullWidth]=\"true\" (clicked)=\"onApply()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n </div>\n </div>\n <a href=\"#\" (click)=\"onEditInDepth($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-1.5 cqa-no-underline hover:cqa-no-underline cqa-self-center\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">open_in_new</mat-icon>\n Edit in depth (open detailed right panel)\n </a>\n </div>\n </ng-container>\n\n<ng-container *ngIf=\"isOnRecord && !enableForm\">\n <div\n class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-text-center cqa-gap-3 cqa-pt-10\">\n\n <!-- Video Icon -->\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-[64px] cqa-h-[64px] cqa-rounded-full cqa-bg-[#FEE2E2]\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21.333 17.3333L28.297 21.9759C28.3974 22.0428 28.514 22.0811 28.6345 22.0868C28.7549 22.0926 28.8747 22.0656 28.981 22.0087C29.0873 21.9517 29.1762 21.8671 29.2382 21.7636C29.3002 21.6602 29.3329 21.5419 29.333 21.4213V10.4933C29.333 10.376 29.3021 10.2607 29.2434 10.1592C29.1846 10.0577 29.1001 9.97344 28.9984 9.91501C28.8967 9.85658 28.7814 9.82602 28.6641 9.82642C28.5468 9.82682 28.4317 9.85816 28.3303 9.91728L21.333 13.9999\" stroke=\"#E7000B\" stroke-width=\"2.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M18.667 8H5.33366C3.8609 8 2.66699 9.19391 2.66699 10.6667V21.3333C2.66699 22.8061 3.8609 24 5.33366 24H18.667C20.1398 24 21.3337 22.8061 21.3337 21.3333V10.6667C21.3337 9.19391 20.1398 8 18.667 8Z\" stroke=\"#E7000B\" stroke-width=\"2.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n \n </div>\n\n <!-- Title -->\n <h4 class=\"cqa-m-0 cqa-text-[16px] cqa-leading-[24px] cqa-font-[600] cqa-text-[#0A0A0A]\">\n Recording Mode Active\n </h4>\n\n <!-- Subtitle -->\n <p class=\"cqa-m-0 cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280]\">\n Click on any element in the browser to capture it\n </p>\n </div>\n\n <!-- Footer -->\n <div class=\"cqa-flex cqa-justify-center cqa-pb-4\">\n <cqa-button\n variant=\"outlined\"\n btnSize=\"lg\"\n [text]=\"'Cancel Recording'\"\n (clicked)=\"toggleRecord()\"\n [customClass]=\"'cqa-text-[14px] cqa-px-16 cqa-py-[9px] cqa-border-[#414146]'\">\n </cqa-button>\n </div>\n</ng-container>\n\n\n <ng-container *ngIf=\"!enableForm && !isOnRecord\">\n<div class=\"cqa-flex cqa-flex-col cqa-gap-4 cqa-px-1 cqa-pt-3\">\n\n <!-- Selected -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Selected</span>\n\n <div\n class=\"cqa-flex cqa-items-center cqa-justify-between\n cqa-bg-[#FFFBEB] cqa-border cqa-border-[#fadfba]\n cqa-rounded-lg cqa-p-3 cqa-border-solid cqa-gap-3\">\n\n <div class=\"cqa-flex cqa-px-3 cqa-py-2 cqa-rounded-lg cqa-flex-col cqa-gap-0.5 cqa-bg-[#f5f5f5] cqa-flex-1\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <span class=\"cqa-text-[14px] cqa-font-[600] cqa-text-[#111827]\">\n {{element.title}}\n </span>\n\n <div class=\"cqa-flex cqa-gap-2\">\n <span *ngFor=\"let l of element.labels\"\n class=\"cqa-text-[10px] cqa-px-1.5 cqa-py-0.5\n cqa-rounded cqa-bg-[#EEF2FF] cqa-text-[#3F43EE] cqa-rounded-full cqa-px-2 cqa-bg-[#eff6ff] cqa-border cqa-border-solid cqa-border-[#c8e0ff]\">\n {{l}}\n </span>\n </div>\n </div>\n\n <span class=\"cqa-text-[11px] cqa-text-[#6B7280]\">\n {{element.selector}}\n </span>\n </div>\n <cqa-button variant=\"outlined\" icon=\"edit\" btnSize=\"lg\" [text]=\"'Edit'\" [fullWidth]=\"true\" (clicked)=\"toggleForm()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n </div>\n\n <!-- Recent -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Recent</span>\n\n <div class=\"cqa-flex cqa-gap-2 cqa-overflow-x-auto cqa-scrollbar-thin cqa-scrollbar-track-transparent cqa-scrollbar-thumb-[#E5E7EB] cqa-scrollbar-thumb-rounded-full cqa-scrollbar-thumb-hover:cqa-bg-[#D1D5DB]\">\n\n <cqa-badge *ngFor=\"let label of labels\" class=\"cqa-element-badge cqa-mb-2 cqa-chip !cqa-bg-white !cqa-text-[12px] cqa-whitespace-nowrap\" [label]=\"label\"></cqa-badge>\n </div>\n </div>\n\n <!-- Element Library -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Element Library</span>\n <cqa-search-bar [fullWidth]=\"true\" placeholder=\"Search library\" (valueChange)=\"search($event)\"></cqa-search-bar> \n </div>\n\n <cqa-element-list \n [items]=\"elements\"\n [titleKey]=\"'title'\"\n [selectorKey]=\"'selector'\"\n [labelsKey]=\"'labels'\"\n [maxHeight]=\"'200px'\"\n (itemClick)=\"onElementClick($event)\">\n </cqa-element-list>\n</div>\n\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" icon=\"radio_button_checked\" btnSize=\"lg\" [text]=\"'Record'\" [fullWidth]=\"true\" (clicked)=\"toggleRecord()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" icon=\"add\" btnSize=\"lg\" [text]=\"'Create New'\" [fullWidth]=\"true\" (clicked)=\"openCreateForm()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n </div>\n </div>\n </ng-container>\n\n</div>\n" }]
|
|
237
|
+
}], ctorParameters: function () { return [{ type: i10.ElementPopupRef, decorators: [{
|
|
238
|
+
type: Inject,
|
|
239
|
+
args: [CUSTOM_ELEMENT_POPUP_REF]
|
|
240
|
+
}] }, { type: undefined, decorators: [{
|
|
241
|
+
type: Optional
|
|
242
|
+
}, {
|
|
243
|
+
type: Inject,
|
|
244
|
+
args: [ELEMENT_POPUP_DATA]
|
|
245
|
+
}] }, { type: i1.FormBuilder, decorators: [{
|
|
246
|
+
type: Optional
|
|
247
|
+
}] }, { type: i0.ChangeDetectorRef, decorators: [{
|
|
248
|
+
type: Optional
|
|
249
|
+
}] }]; }, propDecorators: { value: [{
|
|
250
|
+
type: Input
|
|
251
|
+
}], helpUrl: [{
|
|
252
|
+
type: Input
|
|
253
|
+
}], labels: [{
|
|
254
|
+
type: Input
|
|
255
|
+
}], element: [{
|
|
256
|
+
type: Input
|
|
257
|
+
}], elements: [{
|
|
258
|
+
type: Input
|
|
259
|
+
}], enableForm: [{
|
|
260
|
+
type: Input
|
|
261
|
+
}], isOnRecord: [{
|
|
262
|
+
type: Input
|
|
263
|
+
}], apply: [{
|
|
264
|
+
type: Output
|
|
265
|
+
}], cancel: [{
|
|
266
|
+
type: Output
|
|
267
|
+
}], editInDepth: [{
|
|
268
|
+
type: Output
|
|
269
|
+
}], searchElement: [{
|
|
270
|
+
type: Output
|
|
271
|
+
}] } });
|
|
272
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC1wb3B1cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2VsZW1lbnQtcG9wdXAvZWxlbWVudC1wb3B1cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2VsZW1lbnQtcG9wdXAvZWxlbWVudC1wb3B1cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsMkJBQTJCLEdBRzVCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLHdCQUF3QixFQUFtQixNQUFNLHNDQUFzQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxXQUFXLEVBQTBCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7QUFTakYsTUFBTSxPQUFPLHFCQUFxQjtJQTZCaEMsWUFDNEMsR0FBb0IsRUFDdEIsSUFBdUIsRUFDbkQsRUFBZ0IsRUFDQyxHQUF1QjtRQUhWLFFBQUcsR0FBSCxHQUFHLENBQWlCO1FBR2pDLFFBQUcsR0FBSCxHQUFHLENBQW9CO1FBaEM3QyxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQ25CLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDckIsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUN0QixZQUFPLEdBQTZCLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUMsQ0FBQztRQUMxRSxhQUFRLEdBQStCLEVBQUUsQ0FBQztRQUMxQyxlQUFVLEdBQVksS0FBSyxDQUFDO1FB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Q0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEVMRU1FTlRfUE9QVVBfREFUQSxcbiAgRUxFTUVOVF9QT1BVUF9FRElUX0lOX0RFUFRILFxuICBFbGVtZW50UG9wdXBEYXRhLFxuICBFbGVtZW50UG9wdXBEYXRhRWxlbWVudHMsXG59IGZyb20gJy4vZWxlbWVudC1wb3B1cC1kYXRhJztcbmltcG9ydCB7IENVU1RPTV9FTEVNRU5UX1BPUFVQX1JFRiwgRWxlbWVudFBvcHVwUmVmIH0gZnJvbSAnLi8uLi9lbGVtZW50LXBvcHVwL2VsZW1lbnQtcG9wdXAtcmVmJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWVsZW1lbnQtcG9wdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vZWxlbWVudC1wb3B1cC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEVsZW1lbnRQb3B1cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdmFsdWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBoZWxwVXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgbGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBlbGVtZW50OiBFbGVtZW50UG9wdXBEYXRhRWxlbWVudHMgPSB7dGl0bGU6ICcnLCBzZWxlY3RvcjogJycsIGxhYmVsczogW119O1xuICBASW5wdXQoKSBlbGVtZW50czogRWxlbWVudFBvcHVwRGF0YUVsZW1lbnRzW10gPSBbXTtcbiAgQElucHV0KCkgZW5hYmxlRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc09uUmVjb3JkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGFwcGx5ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBlZGl0SW5EZXB0aCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNlYXJjaEVsZW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZm9ybSE6IEZvcm1Hcm91cDtcbiAgLyoqIFRvb2x0aXAgc2hvd24gd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBcIk5lZWQgaGVscCA/XCIgaWNvbiBhbmQgdGV4dCAqL1xuICBoZWxwVG9vbHRpcFRleHQgPSAnTm90IHN1cmUgd2hhdCB0byBkbz8gQ2xpY2sgdG8gZ28gdG8gb3VyIGRldGFpbGVkIHN0ZXAgY3JlYXRpb24gZG9jdW1lbnRhdGlvbic7XG4gIC8qKiBXaGV0aGVyIHRoZSBoZWxwIHRvb2x0aXAgaXMgdmlzaWJsZSAoY3VzdG9tIHRvb2x0aXAgZm9yIHVzZSBpbnNpZGUgb3ZlcmxheSkgKi9cbiAgc2hvd0hlbHBUb29sdGlwID0gZmFsc2U7XG4gIC8qKiBXaGV0aGVyIHdlJ3JlIGluIGVkaXQgbW9kZSAodHJ1ZSkgb3IgY3JlYXRlIG1vZGUgKGZhbHNlKSAqL1xuICBpc0VkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBpbmplY3RlZERhdGE/OiBFbGVtZW50UG9wdXBEYXRhO1xuICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcjtcbiAgLyoqIENhY2hlZCBzZWxlY3Qgb3B0aW9ucyB0byBhdm9pZCByZWNvbXB1dGluZyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uICovXG4gIHByaXZhdGUgY2FjaGVkU2VsZWN0T3B0aW9uczogYW55W10gPSBbXTtcbiAgLyoqIENhY2hlZCBzZWxlY3QgY29uZmlnIHRvIGF2b2lkIHJlY3JlYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvbiAqL1xuICBwcml2YXRlIGNhY2hlZFNlbGVjdENvbmZpZz86IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KENVU1RPTV9FTEVNRU5UX1BPUFVQX1JFRikgcHJpdmF0ZSByZWY6IEVsZW1lbnRQb3B1cFJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVMRU1FTlRfUE9QVVBfREFUQSkgZGF0YT86IEVsZW1lbnRQb3B1cERhdGEsXG4gICAgQE9wdGlvbmFsKCkgZmI/OiBGb3JtQnVpbGRlcixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IGNkcj86IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuaW5qZWN0ZWREYXRhID0gZGF0YTtcbiAgICAvLyBJbml0aWFsaXplIEZvcm1CdWlsZGVyIGlmIG5vdCBpbmplY3RlZCAoZm9yIFN0b3J5Ym9vay90ZXN0aW5nIHNjZW5hcmlvcylcbiAgICB0aGlzLmZiID0gZmIgfHwgbmV3IEZvcm1CdWlsZGVyKCk7XG4gICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSBjYWNoZWQgb3B0aW9ucyB3aGVuIGxhYmVscyBpbnB1dCBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZXNbJ2xhYmVscyddICYmICFjaGFuZ2VzWydsYWJlbHMnXS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3RPcHRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gVXNlIGluamVjdGVkIGRhdGEgaWYgaW5wdXRzIGFyZSBub3QgcHJvdmlkZWQgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgIGlmICh0aGlzLmluamVjdGVkRGF0YSkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmluamVjdGVkRGF0YS5kZXNjcmlwdGlvbiA/PyAnJztcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5oZWxwVXJsKSB7XG4gICAgICAgIHRoaXMuaGVscFVybCA9IHRoaXMuaW5qZWN0ZWREYXRhLmhlbHBVcmwgPz8gJyc7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5sYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMubGFiZWxzID0gdGhpcy5pbmplY3RlZERhdGEubGFiZWxzID8/IFtdO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudHMgPSB0aGlzLmluamVjdGVkRGF0YS5lbGVtZW50cyA/PyBbXTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5lbGVtZW50IHx8ICF0aGlzLmVsZW1lbnQudGl0bGUpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5pbmplY3RlZERhdGEuZWxlbWVudCA/PyB7dGl0bGU6ICcnLCBzZWxlY3RvcjogJycsIGxhYmVsczogW119O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBVcGRhdGUgc2VsZWN0IG9wdGlvbnMgYWZ0ZXIgbGFiZWxzIGFyZSBwb3RlbnRpYWxseSBzZXRcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdE9wdGlvbnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBzY3JlZW5OYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICB2YWx1ZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgbGFiZWw6IFtudWxsXVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3B1bGF0ZUZvcm1Gb3JFZGl0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVsZW1lbnQgJiYgdGhpcy5lbGVtZW50LnRpdGxlKSB7XG4gICAgICB0aGlzLmlzRWRpdE1vZGUgPSB0cnVlO1xuICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBuYW1lOiB0aGlzLmVsZW1lbnQudGl0bGUgfHwgJycsXG4gICAgICAgIHNjcmVlbk5hbWU6IHRoaXMuZWxlbWVudC5zZWxlY3RvciB8fCAnJyxcbiAgICAgICAgdmFsdWU6IHRoaXMuZWxlbWVudC5zZWxlY3RvciB8fCAnJyxcbiAgICAgICAgbGFiZWw6IHRoaXMuZWxlbWVudC5sYWJlbHMgJiYgdGhpcy5lbGVtZW50LmxhYmVscy5sZW5ndGggPiAwID8gdGhpcy5lbGVtZW50LmxhYmVsc1swXSA6IG51bGxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzRWRpdE1vZGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuaXNFZGl0TW9kZSA9IGZhbHNlO1xuICAgIHRoaXMuZm9ybS5yZXNldCh7XG4gICAgICBuYW1lOiAnJyxcbiAgICAgIHNjcmVlbk5hbWU6ICcnLFxuICAgICAgdmFsdWU6ICcnLFxuICAgICAgbGFiZWw6IG51bGxcbiAgICB9KTtcbiAgfVxuXG4gIG9uQXBwbHkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XG4gICAgICAvLyBNYXJrIGFsbCBmaWVsZHMgYXMgdG91Y2hlZCB0byBzaG93IHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgdGhpcy5mb3JtLmdldChrZXkpPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvcm0udmFsdWU7XG4gICAgY29uc3QgZWxlbWVudERhdGE6IEVsZW1lbnRQb3B1cERhdGFFbGVtZW50cyA9IHtcbiAgICAgIHRpdGxlOiBmb3JtVmFsdWUubmFtZSxcbiAgICAgIHNlbGVjdG9yOiBmb3JtVmFsdWUudmFsdWUsXG4gICAgICBsYWJlbHM6IGZvcm1WYWx1ZS5sYWJlbCA/IFtmb3JtVmFsdWUubGFiZWxdIDogW11cbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuaXNFZGl0TW9kZSkge1xuICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGVsZW1lbnRcbiAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnREYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IGVsZW1lbnRcbiAgICAgIHRoaXMuZWxlbWVudHMgPSBbLi4udGhpcy5lbGVtZW50cywgZWxlbWVudERhdGFdO1xuICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudERhdGE7XG4gICAgfVxuXG4gICAgLy8gRW1pdCB0aGUgc2VsZWN0b3IgdmFsdWUgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgIHRoaXMudmFsdWUgPSBmb3JtVmFsdWUudmFsdWU7XG4gICAgdGhpcy5hcHBseS5lbWl0KGZvcm1WYWx1ZS52YWx1ZSk7XG4gICAgdGhpcy5yZWYuY2xvc2UoZm9ybVZhbHVlLnZhbHVlKTtcbiAgICBcbiAgICAvLyBDbG9zZSBmb3JtIGFmdGVyIGFwcGx5aW5nXG4gICAgdGhpcy5lbmFibGVGb3JtID0gZmFsc2U7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgfVxuXG4gIHRvZ2dsZUZvcm0oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUZvcm0pIHtcbiAgICAgIC8vIE9wZW5pbmcgZm9ybSAtIGNoZWNrIGlmIHdlJ3JlIGVkaXRpbmcgZXhpc3RpbmcgZWxlbWVudFxuICAgICAgdGhpcy5wb3B1bGF0ZUZvcm1Gb3JFZGl0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENsb3NpbmcgZm9ybSAtIHJlc2V0XG4gICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgIH1cbiAgICB0aGlzLmVuYWJsZUZvcm0gPSAhdGhpcy5lbmFibGVGb3JtO1xuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIFwiQ3JlYXRlIE5ld1wiIGJ1dHRvbiBpcyBjbGlja2VkIC0gZXhwbGljaXRseSBzZXRzIGNyZWF0ZSBtb2RlICovXG4gIG9wZW5DcmVhdGVGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuaXNFZGl0TW9kZSA9IGZhbHNlO1xuICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgdGhpcy5lbmFibGVGb3JtID0gdHJ1ZTtcbiAgfVxuXG4gIHRvZ2dsZVJlY29yZCgpOnZvaWR7XG4gICAgdGhpcy5pc09uUmVjb3JkPSAhdGhpcy5pc09uUmVjb3JkO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgZm9ybSB3aGVuIGNhbmNlbGluZ1xuICAgIGlmICh0aGlzLmVuYWJsZUZvcm0pIHtcbiAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICB0aGlzLmVuYWJsZUZvcm0gPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMub25DYW5jZWwoKTtcbiAgfVxuXG4gIG9uRWRpdEluRGVwdGgoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmVkaXRJbkRlcHRoLmVtaXQoKTtcbiAgICB0aGlzLnJlZi5jbG9zZShFTEVNRU5UX1BPUFVQX0VESVRfSU5fREVQVEggYXMgYW55KTtcbiAgfVxuXG4gIHNlYXJjaChldmVudDphbnkpe1xuICAgIGNvbnNvbGUubG9nKGV2ZW50KVxuICAgIHRoaXMuc2VhcmNoRWxlbWVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uSGVscChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oZWxwVXJsKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgd2luZG93Lm9wZW4odGhpcy5oZWxwVXJsLCAnX2JsYW5rJyk7XG4gICAgfVxuICB9XG4gIG9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKHZhbHVlKVxuICB9XG5cbiAgLyoqIFVwZGF0ZSBjYWNoZWQgc2VsZWN0IG9wdGlvbnMgd2hlbiBsYWJlbHMgY2hhbmdlICovXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0T3B0aW9ucygpOiB2b2lkIHtcbiAgICAvLyBMaW1pdCBvcHRpb25zIHRvIHByZXZlbnQgcGVyZm9ybWFuY2UgaXNzdWVzIC0gb25seSB1c2UgdW5pcXVlIGxhYmVscywgbWF4IDEwMFxuICAgIGNvbnN0IHVuaXF1ZUxhYmVscyA9IEFycmF5LmZyb20obmV3IFNldCh0aGlzLmxhYmVscyB8fCBbXSkpLnNsaWNlKDAsIDEwMCk7XG4gICAgdGhpcy5jYWNoZWRTZWxlY3RPcHRpb25zID0gdW5pcXVlTGFiZWxzLm1hcChsYWJlbCA9PiAoeyBcbiAgICAgIGlkOiBsYWJlbCwgXG4gICAgICBuYW1lOiBsYWJlbCBcbiAgICB9KSk7XG4gICAgLy8gQ2xlYXIgY2FjaGVkIGNvbmZpZyB0byBmb3JjZSByZWNyZWF0aW9uXG4gICAgdGhpcy5jYWNoZWRTZWxlY3RDb25maWcgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRTZWxlY3RDb25maWcoKTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIGNvbmZpZyBpZiBhdmFpbGFibGUgYW5kIGxhYmVscyBoYXZlbid0IGNoYW5nZWRcbiAgICBpZiAodGhpcy5jYWNoZWRTZWxlY3RDb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlZFNlbGVjdENvbmZpZztcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbmV3IGNvbmZpZyB3aXRoIGNhY2hlZCBvcHRpb25zXG4gICAgdGhpcy5jYWNoZWRTZWxlY3RDb25maWcgPSB7XG4gICAgICBrZXk6IFwibGFiZWxcIixcbiAgICAgIGxhYmVsOiBcIkxhYmVsXCIsXG4gICAgICBwbGFjZWhvbGRlcjogXCJTZWxlY3QgbGFiZWxcIixcbiAgICAgIG9wdGlvbnM6IHRoaXMuY2FjaGVkU2VsZWN0T3B0aW9ucyxcbiAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7IGxhYmVsOiB2YWx1ZSB9KTtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UoXCJsYWJlbFwiLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmNhY2hlZFNlbGVjdENvbmZpZztcbiAgfVxuXG4gIGdldEZvcm1Db250cm9sKGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBGb3JtQ29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoY29udHJvbE5hbWUpIGFzIEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Rm9ybUNvbnRyb2xWYWx1ZShjb250cm9sTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldChjb250cm9sTmFtZSk/LnZhbHVlIHx8ICcnO1xuICB9XG5cbiAgb25Gb3JtQ29udHJvbENoYW5nZShjb250cm9sTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyBbY29udHJvbE5hbWVdOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIG9uRWxlbWVudENsaWNrKGVsZW1lbnQ6IEVsZW1lbnRQb3B1cERhdGFFbGVtZW50cyk6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBlbGVtZW50IGNsaWNrIC0geW91IGNhbiBjdXN0b21pemUgdGhpcyBiZWhhdmlvclxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgLy8gT3B0aW9uYWxseSBjbG9zZSB0aGUgZm9ybSBpZiBpdCdzIG9wZW5cbiAgICBpZiAodGhpcy5lbmFibGVGb3JtKSB7XG4gICAgICB0aGlzLmVuYWJsZUZvcm0gPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtWzEycHhdIGNxYS1zaGFkb3ctbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS13LVs1MDBweF0gY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtWzEycHhdIGNxYS1wLTIgY3FhLWJveC1ib3JkZXJcIj5cbiAgPCEtLSBIZWFkZXI6IHRpdGxlIGxlZnQ7IE5lZWQgaGVscD8gKyBjbG9zZSBpY29uIHJpZ2h0IC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMiBjcWEtcHgtNFwiPlxuICAgIDxoMiBjbGFzcz1cImNxYS10ZXh0LVsxNnB4XSBjcWEtbGVhZGluZy1bMjRweF0gY3FhLWZvbnQtYm9sZCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtZm9udC1bNjAwXVwiPlxuICAgICAgRWxlbWVudFxuICAgIDwvaDI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICA8IS0tIE5lZWQgaGVscD8gd2l0aCBjdXN0b20gdG9vbHRpcCAod29ya3MgaW5zaWRlIG92ZXJsYXkpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaW5saW5lLWZsZXhcIlxuICAgICAgICAobW91c2VlbnRlcik9XCJzaG93SGVscFRvb2x0aXAgPSB0cnVlXCIgKG1vdXNlbGVhdmUpPVwic2hvd0hlbHBUb29sdGlwID0gZmFsc2VcIj5cbiAgICAgICAgPGEgKm5nSWY9XCJoZWxwVXJsXCIgaHJlZj1cIiNcIiAoY2xpY2spPVwib25IZWxwKCRldmVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXRleHQtWyMzRjQzRUVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjFweF0gY3FhLW5vLXVuZGVybGluZSBjcWEtY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTcgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2hlbHAtaWNvbi1jbGlwKVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNTAwMzMgMTQuNjY2M0MxMi40MTIzIDE0LjY2NjMgMTUuNTgzNyAxMS42ODE2IDE1LjU4MzcgNy45OTk2N0MxNS41ODM3IDQuMzE3NzggMTIuNDEyMyAxLjMzMzAxIDguNTAwMzMgMS4zMzMwMUM0LjU4ODMxIDEuMzMzMDEgMS40MTY5OSA0LjMxNzc4IDEuNDE2OTkgNy45OTk2N0MxLjQxNjk5IDExLjY4MTYgNC41ODgzMSAxNC42NjYzIDguNTAwMzMgMTQuNjY2M1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi40Mzg0OCA2LjAwMDM4QzYuNjA1MDEgNS41NTQ4MyA2LjkzMzcxIDUuMTc5MTIgNy4zNjYzNiA0LjkzOThDNy43OTkwMSA0LjcwMDQ5IDguMzA3NjkgNC42MTMwMSA4LjgwMjMxIDQuNjkyODVDOS4yOTY5MyA0Ljc3MjcgOS43NDU1NiA1LjAxNDczIDEwLjA2ODcgNS4zNzYwN0MxMC4zOTE5IDUuNzM3NCAxMC41Njg4IDYuMTk0NzMgMTAuNTY4MSA2LjY2NzA1QzEwLjU2ODEgOC4wMDAzOCA4LjQ0MzA2IDguNjY3MDUgOC40NDMwNiA4LjY2NzA1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNSAxMS4zMzNIOC41MDk2NlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJoZWxwLWljb24tY2xpcFwiPlxuICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiLz5cbiAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICBOZWVkIGhlbHAgP1xuICAgICAgICA8L2E+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWhlbHBVcmxcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLWZvbnQtWzUwMF0gY3FhLXRleHQtWzEwcHhdIGNxYS1jdXJzb3ItZGVmYXVsdFwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNyAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXRleHQtWyMzRjQzRUVdXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2hlbHAtaWNvbi1jbGlwLW5vbGluaylcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjUwMDMzIDE0LjY2NjNDMTIuNDEyMyAxNC42NjYzIDE1LjU4MzcgMTEuNjgxNiAxNS41ODM3IDcuOTk5NjdDMTUuNTgzNyA0LjMxNzc4IDEyLjQxMjMgMS4zMzMwMSA4LjUwMDMzIDEuMzMzMDFDNC41ODgzMSAxLjMzMzAxIDEuNDE2OTkgNC4zMTc3OCAxLjQxNjk5IDcuOTk5NjdDMS40MTY5OSAxMS42ODE2IDQuNTg4MzEgMTQuNjY2MyA4LjUwMDMzIDE0LjY2NjNaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuNDM4NDggNi4wMDAzOEM2LjYwNTAxIDUuNTU0ODMgNi45MzM3MSA1LjE3OTEyIDcuMzY2MzYgNC45Mzk4QzcuNzk5MDEgNC43MDA0OSA4LjMwNzY5IDQuNjEzMDEgOC44MDIzMSA0LjY5Mjg1QzkuMjk2OTMgNC43NzI3IDkuNzQ1NTYgNS4wMTQ3MyAxMC4wNjg3IDUuMzc2MDdDMTAuMzkxOSA1LjczNzQgMTAuNTY4OCA2LjE5NDczIDEwLjU2ODEgNi42NjcwNUMxMC41NjgxIDguMDAwMzggOC40NDMwNiA4LjY2NzA1IDguNDQzMDYgOC42NjcwNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjUgMTEuMzMzSDguNTA5NjZcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiaGVscC1pY29uLWNsaXAtbm9saW5rXCI+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIE5lZWQgaGVscCA/XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPCEtLSBDdXN0b20gdG9vbHRpcCAoZXhhY3Qgc3BlYzogMzA2w5cyMCBjb250ZW50LCA2cHggcmFkaXVzLCAjMEEwQTBBLCBubyBhcnJvdykgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93SGVscFRvb2x0aXBcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtcG9pbnRlci1ldmVudHMtbm9uZSBjcWEtei1bMTAwXVwiXG4gICAgICAgICAgc3R5bGU9XCJ0b3A6IC0yNHB4OyBsZWZ0OiAtMTI1cHg7XCJcbiAgICAgICAgICByb2xlPVwidG9vbHRpcFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC13aGl0ZSBjcWEtdGV4dC1jZW50ZXIgY3FhLXdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDMwNnB4OyBtaW4taGVpZ2h0OiAyMHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IG9wYWNpdHk6IDE7IHBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQtY29sb3I6ICMwQTBBMEE7IGxpbmUtaGVpZ2h0OiAyMHB4OyBmb250LXNpemU6IDhweDtcIj5cbiAgICAgICAgICAgIHt7IGhlbHBUb29sdGlwVGV4dCB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtcm91bmRlZCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgIHRpdGxlPVwiQ2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTUgIWNxYS1oLTUgIWNxYS10ZXh0LVsyMHB4XVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExpbmUgYmVsb3cgaGVhZGVyIChmdWxsIHdpZHRoIG9mIG1vZGFsLCBubyBzaWRlIG1hcmdpbikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtLW14LTIgY3FhLXctW2NhbGMoMTAwJSsxcmVtKV0gY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWgtcHggY3FhLXctZnVsbCBjcWEtYmctWyNFNUU3RUJdXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvZGl2PlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlRm9ybSAmJiAhaXNPblJlY29yZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLXB4LTEgY3FhLXB0LTNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LTEvMlwiIFxuICAgICAgICAgICAgbGFiZWw9XCJOYW1lXCIgXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImRlZmF1bHQtZWxlbWVudFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZ2V0Rm9ybUNvbnRyb2xWYWx1ZSgnbmFtZScpXCJcbiAgICAgICAgICAgIFtlcnJvcnNdPVwiZ2V0Rm9ybUNvbnRyb2woJ25hbWUnKT8udG91Y2hlZCAmJiBnZXRGb3JtQ29udHJvbCgnbmFtZScpPy5pbnZhbGlkID8gWydOYW1lIGlzIHJlcXVpcmVkJ10gOiBbXVwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25Gb3JtQ29udHJvbENoYW5nZSgnbmFtZScsICRldmVudClcIj5cbiAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LTEvMlwiICBcbiAgICAgICAgICAgIGxhYmVsPVwiU2NyZWVuIE5hbWVcIiBcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZGVmYXVsdC1zY3JlZW5cIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImdldEZvcm1Db250cm9sVmFsdWUoJ3NjcmVlbk5hbWUnKVwiXG4gICAgICAgICAgICBbZXJyb3JzXT1cImdldEZvcm1Db250cm9sKCdzY3JlZW5OYW1lJyk/LnRvdWNoZWQgJiYgZ2V0Rm9ybUNvbnRyb2woJ3NjcmVlbk5hbWUnKT8uaW52YWxpZCA/IFsnU2NyZWVuIE5hbWUgaXMgcmVxdWlyZWQnXSA6IFtdXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkZvcm1Db250cm9sQ2hhbmdlKCdzY3JlZW5OYW1lJywgJGV2ZW50KVwiPlxuICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiICBcbiAgICAgICAgICBsYWJlbD1cIkVudGVyIFZhbHVlXCIgXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCIjZGVmYXVsdF9pZFwiXG4gICAgICAgICAgW3ZhbHVlXT1cImdldEZvcm1Db250cm9sVmFsdWUoJ3ZhbHVlJylcIlxuICAgICAgICAgIFtlcnJvcnNdPVwiZ2V0Rm9ybUNvbnRyb2woJ3ZhbHVlJyk/LnRvdWNoZWQgJiYgZ2V0Rm9ybUNvbnRyb2woJ3ZhbHVlJyk/LmludmFsaWQgPyBbJ1ZhbHVlIGlzIHJlcXVpcmVkJ10gOiBbXVwiXG4gICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkZvcm1Db250cm9sQ2hhbmdlKCd2YWx1ZScsICRldmVudClcIj5cbiAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtcG9zaXRpb24tcmVsYXRpdmVcIj5cbiAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImZvcm1cIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZygpXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRm9vdGVyOiBDYW5jZWwsIEFwcGx5IChmdWxsIHdpZHRoIGluIG9uZSByb3cpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtM1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RyZXRjaCBjcWEtZ2FwLTIgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ0NhbmNlbCdcIiBbZnVsbFdpZHRoXT1cInRydWVcIiAoY2xpY2tlZCk9XCJ0b2dnbGVGb3JtKClcIlxuICAgICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtYm9yZGVyLVsjNDE0MTQ2XSdcIj48L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiBidG5TaXplPVwibGdcIiBbdGV4dF09XCJpc0VkaXRNb2RlID8gJ1VwZGF0ZScgOiAnQ3JlYXRlJ1wiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIChjbGlja2VkKT1cIm9uQXBwbHkoKVwiXG4gICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyMzRjQzRUVdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwib25FZGl0SW5EZXB0aCgkZXZlbnQpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1uby11bmRlcmxpbmUgaG92ZXI6Y3FhLW5vLXVuZGVybGluZSBjcWEtc2VsZi1jZW50ZXJcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNCAhY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdXCI+b3Blbl9pbl9uZXc8L21hdC1pY29uPlxuICAgICAgICAgIEVkaXQgaW4gZGVwdGggKG9wZW4gZGV0YWlsZWQgcmlnaHQgcGFuZWwpXG4gICAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzT25SZWNvcmQgJiYgIWVuYWJsZUZvcm1cIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS10ZXh0LWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB0LTEwXCI+XG5cbiAgICA8IS0tIFZpZGVvIEljb24gLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy1bNjRweF0gY3FhLWgtWzY0cHhdIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLVsjRkVFMkUyXVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiB2aWV3Qm94PVwiMCAwIDMyIDMyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMjEuMzMzIDE3LjMzMzNMMjguMjk3IDIxLjk3NTlDMjguMzk3NCAyMi4wNDI4IDI4LjUxNCAyMi4wODExIDI4LjYzNDUgMjIuMDg2OEMyOC43NTQ5IDIyLjA5MjYgMjguODc0NyAyMi4wNjU2IDI4Ljk4MSAyMi4wMDg3QzI5LjA4NzMgMjEuOTUxNyAyOS4xNzYyIDIxLjg2NzEgMjkuMjM4MiAyMS43NjM2QzI5LjMwMDIgMjEuNjYwMiAyOS4zMzI5IDIxLjU0MTkgMjkuMzMzIDIxLjQyMTNWMTAuNDkzM0MyOS4zMzMgMTAuMzc2IDI5LjMwMjEgMTAuMjYwNyAyOS4yNDM0IDEwLjE1OTJDMjkuMTg0NiAxMC4wNTc3IDI5LjEwMDEgOS45NzM0NCAyOC45OTg0IDkuOTE1MDFDMjguODk2NyA5Ljg1NjU4IDI4Ljc4MTQgOS44MjYwMiAyOC42NjQxIDkuODI2NDJDMjguNTQ2OCA5LjgyNjgyIDI4LjQzMTcgOS44NTgxNiAyOC4zMzAzIDkuOTE3MjhMMjEuMzMzIDEzLjk5OTlcIiBzdHJva2U9XCIjRTcwMDBCXCIgc3Ryb2tlLXdpZHRoPVwiMi42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgPHBhdGggZD1cIk0xOC42NjcgOEg1LjMzMzY2QzMuODYwOSA4IDIuNjY2OTkgOS4xOTM5MSAyLjY2Njk5IDEwLjY2NjdWMjEuMzMzM0MyLjY2Njk5IDIyLjgwNjEgMy44NjA5IDI0IDUuMzMzNjYgMjRIMTguNjY3QzIwLjEzOTggMjQgMjEuMzMzNyAyMi44MDYxIDIxLjMzMzcgMjEuMzMzM1YxMC42NjY3QzIxLjMzMzcgOS4xOTM5MSAyMC4xMzk4IDggMTguNjY3IDhaXCIgc3Ryb2tlPVwiI0U3MDAwQlwiIHN0cm9rZS13aWR0aD1cIjIuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICBcbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVGl0bGUgLS0+XG4gICAgPGg0IGNsYXNzPVwiY3FhLW0tMCBjcWEtdGV4dC1bMTZweF0gY3FhLWxlYWRpbmctWzI0cHhdIGNxYS1mb250LVs2MDBdIGNxYS10ZXh0LVsjMEEwQTBBXVwiPlxuICAgICAgUmVjb3JkaW5nIE1vZGUgQWN0aXZlXG4gICAgPC9oND5cblxuICAgIDwhLS0gU3VidGl0bGUgLS0+XG4gICAgPHAgY2xhc3M9XCJjcWEtbS0wIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLXRleHQtWyM2QjcyODBdXCI+XG4gICAgICBDbGljayBvbiBhbnkgZWxlbWVudCBpbiB0aGUgYnJvd3NlciB0byBjYXB0dXJlIGl0XG4gICAgPC9wPlxuICA8L2Rpdj5cblxuICA8IS0tIEZvb3RlciAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcGItNFwiPlxuICAgIDxjcWEtYnV0dG9uXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgYnRuU2l6ZT1cImxnXCJcbiAgICAgIFt0ZXh0XT1cIidDYW5jZWwgUmVjb3JkaW5nJ1wiXG4gICAgICAoY2xpY2tlZCk9XCJ0b2dnbGVSZWNvcmQoKVwiXG4gICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHgtMTYgY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyM0MTQxNDZdJ1wiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZW5hYmxlRm9ybSAmJiAhaXNPblJlY29yZFwiPlxuPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLXB4LTEgY3FhLXB0LTNcIj5cblxuICA8IS0tIFNlbGVjdGVkIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXVwiPlNlbGVjdGVkPC9zcGFuPlxuXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW5cbiAgICAgICAgICAgICBjcWEtYmctWyNGRkZCRUJdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI2ZhZGZiYV1cbiAgICAgICAgICAgICBjcWEtcm91bmRlZC1sZyBjcWEtcC0zIGNxYS1ib3JkZXItc29saWQgY3FhLWdhcC0zXCI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtcHgtMyBjcWEtcHktMiBjcWEtcm91bmRlZC1sZyBjcWEtZmxleC1jb2wgY3FhLWdhcC0wLjUgY3FhLWJnLVsjZjVmNWY1XSBjcWEtZmxleC0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gIGNxYS1nYXAtMlwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE0cHhdIGNxYS1mb250LVs2MDBdIGNxYS10ZXh0LVsjMTExODI3XVwiPlxuICAgICAgICAgICAge3tlbGVtZW50LnRpdGxlfX1cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC0yXCI+XG4gICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGwgb2YgZWxlbWVudC5sYWJlbHNcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bMTBweF0gY3FhLXB4LTEuNSBjcWEtcHktMC41XG4gICAgICAgICAgICAgICAgICAgY3FhLXJvdW5kZWQgY3FhLWJnLVsjRUVGMkZGXSBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXJvdW5kZWQtZnVsbCBjcWEtcHgtMiBjcWEtYmctWyNlZmY2ZmZdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjYzhlMGZmXVwiPlxuICAgICAgICAgICAgIHt7bH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMXB4XSBjcWEtdGV4dC1bIzZCNzI4MF1cIj5cbiAgICAgICAgICB7e2VsZW1lbnQuc2VsZWN0b3J9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGljb249XCJlZGl0XCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ0VkaXQnXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgKGNsaWNrZWQpPVwidG9nZ2xlRm9ybSgpXCJcbiAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyM0MTQxNDZdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBSZWNlbnQgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM2QjcyODBdXCI+UmVjZW50PC9zcGFuPlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtMiBjcWEtb3ZlcmZsb3cteC1hdXRvIGNxYS1zY3JvbGxiYXItdGhpbiBjcWEtc2Nyb2xsYmFyLXRyYWNrLXRyYW5zcGFyZW50IGNxYS1zY3JvbGxiYXItdGh1bWItWyNFNUU3RUJdIGNxYS1zY3JvbGxiYXItdGh1bWItcm91bmRlZC1mdWxsIGNxYS1zY3JvbGxiYXItdGh1bWItaG92ZXI6Y3FhLWJnLVsjRDFENURCXVwiPlxuXG4gICAgICA8Y3FhLWJhZGdlICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBsYWJlbHNcIiAgY2xhc3M9XCJjcWEtZWxlbWVudC1iYWRnZSBjcWEtbWItMiBjcWEtY2hpcCAhY3FhLWJnLXdoaXRlICFjcWEtdGV4dC1bMTJweF0gY3FhLXdoaXRlc3BhY2Utbm93cmFwXCIgW2xhYmVsXT1cImxhYmVsXCI+PC9jcWEtYmFkZ2U+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRWxlbWVudCBMaWJyYXJ5IC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXVwiPkVsZW1lbnQgTGlicmFyeTwvc3Bhbj5cbiAgICA8Y3FhLXNlYXJjaC1iYXIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggbGlicmFyeVwiICh2YWx1ZUNoYW5nZSk9XCJzZWFyY2goJGV2ZW50KVwiPjwvY3FhLXNlYXJjaC1iYXI+ICAgICAgICBcbiAgPC9kaXY+XG5cbiAgPGNxYS1lbGVtZW50LWxpc3QgXG4gICAgW2l0ZW1zXT1cImVsZW1lbnRzXCJcbiAgICBbdGl0bGVLZXldPVwiJ3RpdGxlJ1wiXG4gICAgW3NlbGVjdG9yS2V5XT1cIidzZWxlY3RvcidcIlxuICAgIFtsYWJlbHNLZXldPVwiJ2xhYmVscydcIlxuICAgIFttYXhIZWlnaHRdPVwiJzIwMHB4J1wiXG4gICAgKGl0ZW1DbGljayk9XCJvbkVsZW1lbnRDbGljaygkZXZlbnQpXCI+XG4gIDwvY3FhLWVsZW1lbnQtbGlzdD5cbjwvZGl2PlxuXG5cbiAgICAgIDwhLS0gRm9vdGVyOiBDYW5jZWwsIEFwcGx5IChmdWxsIHdpZHRoIGluIG9uZSByb3cpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1zdHJldGNoIGNxYS1nYXAtMiBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGljb249XCJyYWRpb19idXR0b25fY2hlY2tlZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidSZWNvcmQnXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgKGNsaWNrZWQpPVwidG9nZ2xlUmVjb3JkKClcIlxuICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS10ZXh0LVsxNHB4XSBjcWEtcHktWzlweF0gY3FhLWJvcmRlci1bIzQxNDE0Nl0nXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBpY29uPVwiYWRkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ0NyZWF0ZSBOZXcnXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgKGNsaWNrZWQpPVwib3BlbkNyZWF0ZUZvcm0oKVwiXG4gICAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzE0cHhdIGNxYS1weS1bOXB4XSBjcWEtYm9yZGVyLVsjNDE0MTQ2XSdcIj48L2NxYS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Injectable, Injector } from '@angular/core';
|
|
2
|
+
import { OverlayConfig } from '@angular/cdk/overlay';
|
|
3
|
+
import { ComponentPortal } from '@angular/cdk/portal';
|
|
4
|
+
import { filter } from 'rxjs/operators';
|
|
5
|
+
import { ElementPopupComponent } from './element-popup.component';
|
|
6
|
+
import { ElementPopupRef } from './element-popup-ref';
|
|
7
|
+
import { ELEMENT_POPUP_DATA, } from './element-popup-data';
|
|
8
|
+
import { CUSTOM_ELEMENT_POPUP_REF } from './element-popup-ref';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/cdk/overlay";
|
|
11
|
+
export class ElementPopupService {
|
|
12
|
+
constructor(overlay, injector) {
|
|
13
|
+
this.overlay = overlay;
|
|
14
|
+
this.injector = injector;
|
|
15
|
+
/** Currently open Step Description overlay ref; only one panel is allowed at a time. */
|
|
16
|
+
this.currentRef = null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Opens the Step Description modal positioned just below the given origin element.
|
|
20
|
+
* If a panel is already open, returns the existing ref and does not open a duplicate.
|
|
21
|
+
* @param origin Element (e.g. description span or edit icon) to position below
|
|
22
|
+
* @param data Initial description and optional help URL
|
|
23
|
+
* @returns Ref with afterClosed() and close(); afterClosed emits the new description on Apply, undefined on Cancel, or EDIT_IN_DEPTH symbol when user clicks "Edit in depth"
|
|
24
|
+
*/
|
|
25
|
+
open(origin, data) {
|
|
26
|
+
if (this.currentRef) {
|
|
27
|
+
return this.currentRef;
|
|
28
|
+
}
|
|
29
|
+
const originEl = origin.nativeElement;
|
|
30
|
+
const gap = 8;
|
|
31
|
+
const modalWidth = 500;
|
|
32
|
+
const margin = 8;
|
|
33
|
+
originEl.scrollIntoView({ block: 'nearest', behavior: 'auto' });
|
|
34
|
+
const positionStrategy = this.overlay.position().global();
|
|
35
|
+
const overlayRef = this.overlay.create(new OverlayConfig({
|
|
36
|
+
hasBackdrop: true,
|
|
37
|
+
backdropClass: 'cdk-overlay-transparent-backdrop',
|
|
38
|
+
scrollStrategy: this.overlay.scrollStrategies.reposition(),
|
|
39
|
+
positionStrategy,
|
|
40
|
+
panelClass: ['cqa-element-popup-panel', 'cqa-ui-root'],
|
|
41
|
+
width: 'min(560px, 90vw)',
|
|
42
|
+
}));
|
|
43
|
+
const updatePosition = () => {
|
|
44
|
+
const rect = originEl.getBoundingClientRect();
|
|
45
|
+
const viewportWidth = window.innerWidth;
|
|
46
|
+
let top = rect.bottom + gap;
|
|
47
|
+
let left = rect.left;
|
|
48
|
+
if (left + modalWidth > viewportWidth - margin) {
|
|
49
|
+
left = viewportWidth - modalWidth - margin;
|
|
50
|
+
}
|
|
51
|
+
if (left < margin) {
|
|
52
|
+
left = margin;
|
|
53
|
+
}
|
|
54
|
+
if (top < margin) {
|
|
55
|
+
top = margin;
|
|
56
|
+
}
|
|
57
|
+
positionStrategy.top(`${top}px`).left(`${left}px`);
|
|
58
|
+
overlayRef.updatePosition();
|
|
59
|
+
};
|
|
60
|
+
const editStepRef = new ElementPopupRef(overlayRef);
|
|
61
|
+
const injector = Injector.create({
|
|
62
|
+
parent: this.injector,
|
|
63
|
+
providers: [
|
|
64
|
+
{ provide: CUSTOM_ELEMENT_POPUP_REF, useValue: editStepRef },
|
|
65
|
+
{ provide: ELEMENT_POPUP_DATA, useValue: data },
|
|
66
|
+
],
|
|
67
|
+
});
|
|
68
|
+
updatePosition();
|
|
69
|
+
const portal = new ComponentPortal(ElementPopupComponent, undefined, injector);
|
|
70
|
+
overlayRef.attach(portal);
|
|
71
|
+
requestAnimationFrame(() => updatePosition());
|
|
72
|
+
const scrollListener = () => updatePosition();
|
|
73
|
+
window.addEventListener('scroll', scrollListener, true);
|
|
74
|
+
window.addEventListener('resize', scrollListener);
|
|
75
|
+
this.currentRef = editStepRef;
|
|
76
|
+
editStepRef.afterClosed().subscribe(() => {
|
|
77
|
+
this.currentRef = null;
|
|
78
|
+
window.removeEventListener('scroll', scrollListener, true);
|
|
79
|
+
window.removeEventListener('resize', scrollListener);
|
|
80
|
+
});
|
|
81
|
+
overlayRef.backdropClick().subscribe(() => editStepRef.close(undefined));
|
|
82
|
+
overlayRef
|
|
83
|
+
.keydownEvents()
|
|
84
|
+
.pipe(filter((e) => e.key === 'Escape' || e.key === 'Esc'))
|
|
85
|
+
.subscribe(() => editStepRef.close(undefined));
|
|
86
|
+
return editStepRef;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
ElementPopupService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ElementPopupService, deps: [{ token: i1.Overlay }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
90
|
+
ElementPopupService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ElementPopupService, providedIn: 'root' });
|
|
91
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ElementPopupService, decorators: [{
|
|
92
|
+
type: Injectable,
|
|
93
|
+
args: [{
|
|
94
|
+
providedIn: 'root',
|
|
95
|
+
}]
|
|
96
|
+
}], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Injector }]; } });
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC1wb3B1cC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy9lbGVtZW50LXBvcHVwL2VsZW1lbnQtcG9wdXAuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUNMLGtCQUFrQixHQUduQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7QUFVL0QsTUFBTSxPQUFPLG1CQUFtQjtJQUk5QixZQUE2QixPQUFnQixFQUFtQixRQUFrQjtRQUFyRCxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQW1CLGFBQVEsR0FBUixRQUFRLENBQVU7UUFIbEYsd0ZBQXdGO1FBQ2hGLGVBQVUsR0FBK0MsSUFBSSxDQUFDO0lBRWUsQ0FBQztJQUV0Rjs7Ozs7O09BTUc7SUFDSCxJQUFJLENBQ0YsTUFBK0IsRUFDL0IsSUFBc0I7UUFFdEIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUN4QjtRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsTUFBTSxVQUFV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QUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBRUgsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDekUsVUFBVTthQUNQLGFBQWEsRUFBRTthQUNmLElBQUksQ0FDSCxNQUFNLENBQUMsQ0FBQyxDQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUNwRTthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFakQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQzs7Z0hBOUZVLG1CQUFtQjtvSEFBbkIsbUJBQW1CLGNBRmxCLE1BQU07MkZBRVAsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFbGVtZW50UG9wdXBDb21wb25lbnQgfSBmcm9tICcuL2VsZW1lbnQtcG9wdXAuY29tcG9uZW50JztcbmltcG9ydCB7IEVsZW1lbnRQb3B1cFJlZiB9IGZyb20gJy4vZWxlbWVudC1wb3B1cC1yZWYnO1xuaW1wb3J0IHtcbiAgRUxFTUVOVF9QT1BVUF9EQVRBLFxuICBFTEVNRU5UX1BPUFVQX0VESVRfSU5fREVQVEgsXG4gIEVsZW1lbnRQb3B1cERhdGEsXG59IGZyb20gJy4vZWxlbWVudC1wb3B1cC1kYXRhJztcbmltcG9ydCB7IENVU1RPTV9FTEVNRU5UX1BPUFVQX1JFRiB9IGZyb20gJy4vZWxlbWVudC1wb3B1cC1yZWYnO1xuXG5leHBvcnQgdHlwZSBFbGVtZW50UG9wdXBSZXN1bHQgPVxuICB8IHN0cmluZ1xuICB8IHVuZGVmaW5lZFxuICB8IHR5cGVvZiBFTEVNRU5UX1BPUFVQX0VESVRfSU5fREVQVEg7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBFbGVtZW50UG9wdXBTZXJ2aWNlIHtcbiAgLyoqIEN1cnJlbnRseSBvcGVuIFN0ZXAgRGVzY3JpcHRpb24gb3ZlcmxheSByZWY7IG9ubHkgb25lIHBhbmVsIGlzIGFsbG93ZWQgYXQgYSB0aW1lLiAqL1xuICBwcml2YXRlIGN1cnJlbnRSZWY6IEVsZW1lbnRQb3B1cFJlZjxFbGVtZW50UG9wdXBSZXN1bHQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvdmVybGF5OiBPdmVybGF5LCBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3Rvcikge31cblxuICAvKipcbiAgICogT3BlbnMgdGhlIFN0ZXAgRGVzY3JpcHRpb24gbW9kYWwgcG9zaXRpb25lZCBqdXN0IGJlbG93IHRoZSBnaXZlbiBvcmlnaW4gZWxlbWVudC5cbiAgICogSWYgYSBwYW5lbCBpcyBhbHJlYWR5IG9wZW4sIHJldHVybnMgdGhlIGV4aXN0aW5nIHJlZiBhbmQgZG9lcyBub3Qgb3BlbiBhIGR1cGxpY2F0ZS5cbiAgICogQHBhcmFtIG9yaWdpbiBFbGVtZW50IChlLmcuIGRlc2NyaXB0aW9uIHNwYW4gb3IgZWRpdCBpY29uKSB0byBwb3NpdGlvbiBiZWxvd1xuICAgKiBAcGFyYW0gZGF0YSBJbml0aWFsIGRlc2NyaXB0aW9uIGFuZCBvcHRpb25hbCBoZWxwIFVSTFxuICAgKiBAcmV0dXJucyBSZWYgd2l0aCBhZnRlckNsb3NlZCgpIGFuZCBjbG9zZSgpOyBhZnRlckNsb3NlZCBlbWl0cyB0aGUgbmV3IGRlc2NyaXB0aW9uIG9uIEFwcGx5LCB1bmRlZmluZWQgb24gQ2FuY2VsLCBvciBFRElUX0lOX0RFUFRIIHN5bWJvbCB3aGVuIHVzZXIgY2xpY2tzIFwiRWRpdCBpbiBkZXB0aFwiXG4gICAqL1xuICBvcGVuKFxuICAgIG9yaWdpbjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgZGF0YTogRWxlbWVudFBvcHVwRGF0YVxuICApOiBFbGVtZW50UG9wdXBSZWY8RWxlbWVudFBvcHVwUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuY3VycmVudFJlZikge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFJlZjtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luRWwgPSBvcmlnaW4ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBnYXAgPSA4O1xuICAgIGNvbnN0IG1vZGFsV2lkdGggPSA1MDA7XG4gICAgY29uc3QgbWFyZ2luID0gODtcblxuICAgIG9yaWdpbkVsLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JywgYmVoYXZpb3I6ICdhdXRvJyB9KTtcblxuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXkucG9zaXRpb24oKS5nbG9iYWwoKTtcblxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKFxuICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgICAgYmFja2Ryb3BDbGFzczogJ2Nkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJyxcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneSxcbiAgICAgICAgcGFuZWxDbGFzczogWydjcWEtZWxlbWVudC1wb3B1cC1wYW5lbCcsICdjcWEtdWktcm9vdCddLFxuICAgICAgICB3aWR0aDogJ21pbig1NjBweCwgOTB2dyknLFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgY29uc3QgdXBkYXRlUG9zaXRpb24gPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gb3JpZ2luRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICBsZXQgdG9wID0gcmVjdC5ib3R0b20gKyBnYXA7XG4gICAgICBsZXQgbGVmdCA9IHJlY3QubGVmdDtcbiAgICAgIGlmIChsZWZ0ICsgbW9kYWxXaWR0aCA+IHZpZXdwb3J0V2lkdGggLSBtYXJnaW4pIHtcbiAgICAgICAgbGVmdCA9IHZpZXdwb3J0V2lkdGggLSBtb2RhbFdpZHRoIC0gbWFyZ2luO1xuICAgICAgfVxuICAgICAgaWYgKGxlZnQgPCBtYXJnaW4pIHtcbiAgICAgICAgbGVmdCA9IG1hcmdpbjtcbiAgICAgIH1cbiAgICAgIGlmICh0b3AgPCBtYXJnaW4pIHtcbiAgICAgICAgdG9wID0gbWFyZ2luO1xuICAgICAgfVxuICAgICAgcG9zaXRpb25TdHJhdGVneS50b3AoYCR7dG9wfXB4YCkubGVmdChgJHtsZWZ0fXB4YCk7XG4gICAgICBvdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGVkaXRTdGVwUmVmID0gbmV3IEVsZW1lbnRQb3B1cFJlZjxFbGVtZW50UG9wdXBSZXN1bHQ+KG92ZXJsYXlSZWYpO1xuXG4gICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogQ1VTVE9NX0VMRU1FTlRfUE9QVVBfUkVGLCB1c2VWYWx1ZTogZWRpdFN0ZXBSZWYgfSxcbiAgICAgICAgeyBwcm92aWRlOiBFTEVNRU5UX1BPUFVQX0RBVEEsIHVzZVZhbHVlOiBkYXRhIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgdXBkYXRlUG9zaXRpb24oKTtcblxuICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoRWxlbWVudFBvcHVwQ29tcG9uZW50LCB1bmRlZmluZWQsIGluamVjdG9yKTtcbiAgICBvdmVybGF5UmVmLmF0dGFjaChwb3J0YWwpO1xuXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHVwZGF0ZVBvc2l0aW9uKCkpO1xuXG4gICAgY29uc3Qgc2Nyb2xsTGlzdGVuZXIgPSAoKTogdm9pZCA9PiB1cGRhdGVQb3NpdGlvbigpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxMaXN0ZW5lciwgdHJ1ZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHNjcm9sbExpc3RlbmVyKTtcbiAgICB0aGlzLmN1cnJlbnRSZWYgPSBlZGl0U3RlcFJlZjtcbiAgICBlZGl0U3RlcFJlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRSZWYgPSBudWxsO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbExpc3RlbmVyLCB0cnVlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzY3JvbGxMaXN0ZW5lcik7XG4gICAgfSk7XG5cbiAgICBvdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gZWRpdFN0ZXBSZWYuY2xvc2UodW5kZWZpbmVkKSk7XG4gICAgb3ZlcmxheVJlZlxuICAgICAgLmtleWRvd25FdmVudHMoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4gZS5rZXkgPT09ICdFc2NhcGUnIHx8IGUua2V5ID09PSAnRXNjJylcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gZWRpdFN0ZXBSZWYuY2xvc2UodW5kZWZpbmVkKSk7XG5cbiAgICByZXR1cm4gZWRpdFN0ZXBSZWY7XG4gIH1cbn1cbiJdfQ==
|