@cqa-lib/cqa-ui 1.1.200 → 1.1.202
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-input/custom-input.component.mjs +3 -3
- package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +75 -13
- package/esm2020/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.mjs +3 -3
- package/esm2020/lib/step-builder/step-builder-document/step-builder-document.component.mjs +5 -6
- package/esm2020/lib/step-builder/step-builder-group/step-builder-group.component.mjs +148 -0
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +13 -7
- package/esm2020/lib/test-case-details/element-popup/element-popup.component.mjs +3 -3
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +13 -7
- package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +6 -5
- package/esm2020/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.mjs +16 -2
- package/esm2020/lib/ui-kit.module.mjs +6 -6
- package/esm2020/public-api.mjs +2 -2
- package/fesm2015/cqa-lib-cqa-ui.mjs +223 -626
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +226 -621
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +10 -2
- package/lib/step-builder/step-builder-group/step-builder-group.component.d.ts +48 -0
- package/lib/test-case-details/condition-step/condition-step.component.d.ts +6 -1
- package/lib/test-case-details/loop-step/loop-step.component.d.ts +6 -1
- package/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.d.ts +5 -1
- package/lib/ui-kit.module.d.ts +2 -2
- package/package.json +1 -1
- package/public-api.d.ts +1 -1
- package/styles.css +1 -1
- package/esm2020/lib/step-builder/step-builder-api/step-builder-api.component.mjs +0 -636
- package/lib/step-builder/step-builder-api/step-builder-api.component.d.ts +0 -121
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/forms";
|
|
5
|
+
import * as i2 from "../../dynamic-select/dynamic-select-field.component";
|
|
6
|
+
import * as i3 from "../../button/button.component";
|
|
7
|
+
import * as i4 from "@angular/common";
|
|
8
|
+
export class StepBuilderGroupComponent {
|
|
9
|
+
constructor(fb) {
|
|
10
|
+
this.fb = fb;
|
|
11
|
+
/** Options for step group dropdown */
|
|
12
|
+
this.stepGroupOptions = [];
|
|
13
|
+
/** Indicates if more step groups are available for loading */
|
|
14
|
+
this.hasMoreStepGroups = false;
|
|
15
|
+
/** Loading state for step groups */
|
|
16
|
+
this.isLoadingStepGroups = false;
|
|
17
|
+
/** Whether in edit mode */
|
|
18
|
+
this.editMode = false;
|
|
19
|
+
/** Emit when step is created */
|
|
20
|
+
this.createStep = new EventEmitter();
|
|
21
|
+
/** Emit when cancelled */
|
|
22
|
+
this.cancelled = new EventEmitter();
|
|
23
|
+
/** Emit when more step groups need to be loaded */
|
|
24
|
+
this.loadMoreStepGroups = new EventEmitter();
|
|
25
|
+
/** Emit when step group search query changes */
|
|
26
|
+
this.searchStepGroups = new EventEmitter();
|
|
27
|
+
this.selectedStepGroup = null;
|
|
28
|
+
this.stepGroupForm = this.fb.group({
|
|
29
|
+
stepGroupId: [null, Validators.required]
|
|
30
|
+
});
|
|
31
|
+
this.stepGroupConfig = {
|
|
32
|
+
key: 'stepGroupId',
|
|
33
|
+
placeholder: 'Select Step Group',
|
|
34
|
+
multiple: false,
|
|
35
|
+
searchable: true,
|
|
36
|
+
serverSearch: true,
|
|
37
|
+
hasMore: this.hasMoreStepGroups,
|
|
38
|
+
isLoading: this.isLoadingStepGroups,
|
|
39
|
+
options: [],
|
|
40
|
+
onChange: (value) => {
|
|
41
|
+
this.onStepGroupChange(value);
|
|
42
|
+
},
|
|
43
|
+
onSearch: (query) => {
|
|
44
|
+
this.searchStepGroups.emit(query);
|
|
45
|
+
},
|
|
46
|
+
onLoadMore: (query) => {
|
|
47
|
+
this.loadMoreStepGroups.emit(query || '');
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
ngOnInit() {
|
|
52
|
+
this.updateStepGroupConfig();
|
|
53
|
+
if (this.initialStepGroupId) {
|
|
54
|
+
this.stepGroupForm.patchValue({ stepGroupId: this.initialStepGroupId });
|
|
55
|
+
const foundGroup = this.stepGroupOptions.find(opt => opt.id === this.initialStepGroupId);
|
|
56
|
+
if (foundGroup) {
|
|
57
|
+
this.selectedStepGroup = foundGroup;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (this.stepGroupOptions.length > 0) {
|
|
61
|
+
// Auto-select first option if available
|
|
62
|
+
const firstOption = this.stepGroupOptions[0];
|
|
63
|
+
this.stepGroupForm.patchValue({ stepGroupId: firstOption.id });
|
|
64
|
+
this.selectedStepGroup = firstOption;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
ngOnChanges(changes) {
|
|
68
|
+
if (changes['stepGroupOptions'] || changes['hasMoreStepGroups'] || changes['isLoadingStepGroups']) {
|
|
69
|
+
this.updateStepGroupConfig();
|
|
70
|
+
}
|
|
71
|
+
if (changes['initialStepGroupId'] && this.initialStepGroupId) {
|
|
72
|
+
this.stepGroupForm.patchValue({ stepGroupId: this.initialStepGroupId });
|
|
73
|
+
const foundGroup = this.stepGroupOptions.find(opt => opt.id === this.initialStepGroupId);
|
|
74
|
+
if (foundGroup) {
|
|
75
|
+
this.selectedStepGroup = foundGroup;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
updateStepGroupConfig() {
|
|
80
|
+
const options = this.stepGroupOptions.map(group => ({
|
|
81
|
+
id: group.id,
|
|
82
|
+
value: group.id,
|
|
83
|
+
name: group.name,
|
|
84
|
+
label: group.name
|
|
85
|
+
}));
|
|
86
|
+
this.stepGroupConfig = {
|
|
87
|
+
...this.stepGroupConfig,
|
|
88
|
+
options: options,
|
|
89
|
+
hasMore: this.hasMoreStepGroups,
|
|
90
|
+
isLoading: this.isLoadingStepGroups
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
onStepGroupChange(stepGroupId) {
|
|
94
|
+
const foundGroup = this.stepGroupOptions.find(opt => opt.id === stepGroupId);
|
|
95
|
+
if (foundGroup) {
|
|
96
|
+
this.selectedStepGroup = foundGroup;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
getStepGroupDescription() {
|
|
100
|
+
if (this.selectedStepGroup?.description) {
|
|
101
|
+
const tempDescElem = document.createElement('div');
|
|
102
|
+
tempDescElem.innerHTML = this.selectedStepGroup.description;
|
|
103
|
+
return tempDescElem.textContent || '';
|
|
104
|
+
}
|
|
105
|
+
return 'No description available';
|
|
106
|
+
}
|
|
107
|
+
onCreateStep() {
|
|
108
|
+
if (this.stepGroupForm.valid) {
|
|
109
|
+
const formValue = this.stepGroupForm.value;
|
|
110
|
+
const stepData = {
|
|
111
|
+
stepGroupId: formValue.stepGroupId,
|
|
112
|
+
stepGroup: this.selectedStepGroup
|
|
113
|
+
};
|
|
114
|
+
this.createStep.emit(stepData);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
onCancel() {
|
|
118
|
+
this.cancelled.emit();
|
|
119
|
+
}
|
|
120
|
+
isFormValid() {
|
|
121
|
+
return this.stepGroupForm.valid && !!this.selectedStepGroup;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
StepBuilderGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderGroupComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
125
|
+
StepBuilderGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderGroupComponent, selector: "cqa-step-builder-group", inputs: { stepGroupOptions: "stepGroupOptions", hasMoreStepGroups: "hasMoreStepGroups", isLoadingStepGroups: "isLoadingStepGroups", initialStepGroupId: "initialStepGroupId", editMode: "editMode" }, outputs: { createStep: "createStep", cancelled: "cancelled", loadMoreStepGroups: "loadMoreStepGroups", searchStepGroups: "searchStepGroups" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-px-4 cqa-py-2 cqa-h-full\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n {{ editMode ? 'Edit Step Group Test Step' : 'Create Step Group Test Step' }}\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Step Group Selection -->\n <div class=\"cqa-mb-6\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[14px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Select Step Group<span class=\"cqa-text-[#EF4444] cqa-ml-0.5\">*</span>\n </label>\n <cqa-dynamic-select\n [form]=\"stepGroupForm\"\n [config]=\"stepGroupConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Step Group Description -->\n <!-- <div *ngIf=\"selectedStepGroup\" class=\"cqa-mb-6\">\n <div class=\"cqa-mb-2\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#4b5563]\">Description:</span>\n </div>\n <div class=\"cqa-p-3 cqa-bg-[#f9fafb] cqa-rounded cqa-border cqa-border-[#e5e7eb]\">\n <div class=\"cqa-text-[14px] cqa-text-[#374151]\" [innerHTML]=\"getStepGroupDescription()\">\n </div>\n </div>\n </div> -->\n\n <!-- Loading State -->\n <div *ngIf=\"isLoadingStepGroups\" class=\"cqa-flex cqa-justify-center cqa-items-center cqa-py-8\">\n <div class=\"cqa-text-[14px] cqa-text-[#6b7280]\">Loading step groups...</div>\n </div>\n\n <!-- Empty State -->\n <div *ngIf=\"!isLoadingStepGroups && stepGroupOptions.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-[#9ca3af] cqa-text-[14px]\">\n No step groups available\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2 cqa-rounded-[10px]\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-border-solid cqa-rounded-[9px] cqa-w-1/2 cqa-border cqa-border-[#3F43EE]\" variant=\"filled\" [text]=\"editMode ? 'Update Step' : 'Insert Step Group'\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", components: [{ type: i2.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
126
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderGroupComponent, decorators: [{
|
|
127
|
+
type: Component,
|
|
128
|
+
args: [{ selector: 'cqa-step-builder-group', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-px-4 cqa-py-2 cqa-h-full\">\n <!-- Header -->\n <h2 class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-4\">\n {{ editMode ? 'Edit Step Group Test Step' : 'Create Step Group Test Step' }}\n </h2>\n\n <div class=\"cqa-flex cqa-flex-col cqa-flex-1 cqa-overflow-y-auto\">\n <!-- Step Group Selection -->\n <div class=\"cqa-mb-6\">\n <label class=\"cqa-leading-[100%] cqa-block cqa-text-[14px] cqa-font-medium cqa-text-[#161617] cqa-mb-1\">\n Select Step Group<span class=\"cqa-text-[#EF4444] cqa-ml-0.5\">*</span>\n </label>\n <cqa-dynamic-select\n [form]=\"stepGroupForm\"\n [config]=\"stepGroupConfig\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Step Group Description -->\n <!-- <div *ngIf=\"selectedStepGroup\" class=\"cqa-mb-6\">\n <div class=\"cqa-mb-2\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#4b5563]\">Description:</span>\n </div>\n <div class=\"cqa-p-3 cqa-bg-[#f9fafb] cqa-rounded cqa-border cqa-border-[#e5e7eb]\">\n <div class=\"cqa-text-[14px] cqa-text-[#374151]\" [innerHTML]=\"getStepGroupDescription()\">\n </div>\n </div>\n </div> -->\n\n <!-- Loading State -->\n <div *ngIf=\"isLoadingStepGroups\" class=\"cqa-flex cqa-justify-center cqa-items-center cqa-py-8\">\n <div class=\"cqa-text-[14px] cqa-text-[#6b7280]\">Loading step groups...</div>\n </div>\n\n <!-- Empty State -->\n <div *ngIf=\"!isLoadingStepGroups && stepGroupOptions.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-[#9ca3af] cqa-text-[14px]\">\n No step groups available\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-mt-auto cqa-pt-4 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2 cqa-rounded-[10px]\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-border-solid cqa-rounded-[9px] cqa-w-1/2 cqa-border cqa-border-[#3F43EE]\" variant=\"filled\" [text]=\"editMode ? 'Update Step' : 'Insert Step Group'\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n</div>\n\n", styles: [] }]
|
|
129
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { stepGroupOptions: [{
|
|
130
|
+
type: Input
|
|
131
|
+
}], hasMoreStepGroups: [{
|
|
132
|
+
type: Input
|
|
133
|
+
}], isLoadingStepGroups: [{
|
|
134
|
+
type: Input
|
|
135
|
+
}], initialStepGroupId: [{
|
|
136
|
+
type: Input
|
|
137
|
+
}], editMode: [{
|
|
138
|
+
type: Input
|
|
139
|
+
}], createStep: [{
|
|
140
|
+
type: Output
|
|
141
|
+
}], cancelled: [{
|
|
142
|
+
type: Output
|
|
143
|
+
}], loadMoreStepGroups: [{
|
|
144
|
+
type: Output
|
|
145
|
+
}], searchStepGroups: [{
|
|
146
|
+
type: Output
|
|
147
|
+
}] } });
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3RlcC1idWlsZGVyL3N0ZXAtYnVpbGRlci1ncm91cC9zdGVwLWJ1aWxkZXItZ3JvdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWdyb3VwL3N0ZXAtYnVpbGRlci1ncm91cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQXVDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFvQmpGLE1BQU0sT0FBTyx5QkFBeUI7SUFnQ3BDLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBL0JuQyxzQ0FBc0M7UUFDN0IscUJBQWdCLEdBQXNCLEVBQUUsQ0FBQztRQUVsRCw4REFBOEQ7UUFDckQsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBRTVDLG9DQUFvQztRQUMzQix3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFLOUMsMkJBQTJCO1FBQ2xCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFbkMsZ0NBQWdDO1FBQ3RCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztRQUU3RCwwQkFBMEI7UUFDaEIsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFL0MsbURBQW1EO1FBQ3pDLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFMUQsZ0RBQWdEO1FBQ3RDLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFJeEQsc0JBQWlCLEdBQTJCLElBQUksQ0FBQztRQUcvQyxJQUFJLENBQUMsYUFBYSxHQUFHLElB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c0I7Z0JBQ2xDLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVztnQkFDbEMsU0FBUyxFQUFFLElBQUksQ0FBQyxpQkFBaUI7YUFDbEMsQ0FBQztZQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQzlELENBQUM7O3NIQXhJVSx5QkFBeUI7MEdBQXpCLHlCQUF5QixpZENyQnRDLDJ6RUFvREE7MkZEL0JhLHlCQUF5QjtrQkFOckMsU0FBUzsrQkFDRSx3QkFBd0IsUUFHNUIsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO2tHQUlyQixnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUdHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFHRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU07Z0JBR0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUdHLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcEdyb3VwRm9ybURhdGEge1xuICBzdGVwR3JvdXBJZDogbnVtYmVyO1xuICBzdGVwR3JvdXA/OiBhbnk7IC8vIFRlc3RDYXNlIG9iamVjdFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBHcm91cE9wdGlvbiB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zdGVwLWJ1aWxkZXItZ3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1idWlsZGVyLWdyb3VwLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9XG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBCdWlsZGVyR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKiBPcHRpb25zIGZvciBzdGVwIGdyb3VwIGRyb3Bkb3duICovXG4gIEBJbnB1dCgpIHN0ZXBHcm91cE9wdGlvbnM6IFN0ZXBHcm91cE9wdGlvbltdID0gW107XG5cbiAgLyoqIEluZGljYXRlcyBpZiBtb3JlIHN0ZXAgZ3JvdXBzIGFyZSBhdmFpbGFibGUgZm9yIGxvYWRpbmcgKi9cbiAgQElucHV0KCkgaGFzTW9yZVN0ZXBHcm91cHM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogTG9hZGluZyBzdGF0ZSBmb3Igc3RlcCBncm91cHMgKi9cbiAgQElucHV0KCkgaXNMb2FkaW5nU3RlcEdyb3VwczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBJbml0aWFsIHN0ZXAgZ3JvdXAgSUQgZm9yIGVkaXQgbW9kZSAqL1xuICBASW5wdXQoKSBpbml0aWFsU3RlcEdyb3VwSWQ/OiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgaW4gZWRpdCBtb2RlICovXG4gIEBJbnB1dCgpIGVkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEVtaXQgd2hlbiBzdGVwIGlzIGNyZWF0ZWQgKi9cbiAgQE91dHB1dCgpIGNyZWF0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPFN0ZXBHcm91cEZvcm1EYXRhPigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gY2FuY2VsbGVkICovXG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXQgd2hlbiBtb3JlIHN0ZXAgZ3JvdXBzIG5lZWQgdG8gYmUgbG9hZGVkICovXG4gIEBPdXRwdXQoKSBsb2FkTW9yZVN0ZXBHcm91cHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogRW1pdCB3aGVuIHN0ZXAgZ3JvdXAgc2VhcmNoIHF1ZXJ5IGNoYW5nZXMgKi9cbiAgQE91dHB1dCgpIHNlYXJjaFN0ZXBHcm91cHMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBzdGVwR3JvdXBGb3JtOiBGb3JtR3JvdXA7XG4gIHN0ZXBHcm91cENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnO1xuICBzZWxlY3RlZFN0ZXBHcm91cDogU3RlcEdyb3VwT3B0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICB0aGlzLnN0ZXBHcm91cEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHN0ZXBHcm91cElkOiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICB9KTtcblxuICAgIHRoaXMuc3RlcEdyb3VwQ29uZmlnID0ge1xuICAgICAga2V5OiAnc3RlcEdyb3VwSWQnLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgU3RlcCBHcm91cCcsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgc2VydmVyU2VhcmNoOiB0cnVlLFxuICAgICAgaGFzTW9yZTogdGhpcy5oYXNNb3JlU3RlcEdyb3VwcyxcbiAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmdTdGVwR3JvdXBzLFxuICAgICAgb3B0aW9uczogW10sXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblN0ZXBHcm91cENoYW5nZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25TZWFyY2g6IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoU3RlcEdyb3Vwcy5lbWl0KHF1ZXJ5KTtcbiAgICAgIH0sXG4gICAgICBvbkxvYWRNb3JlOiAocXVlcnk/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZVN0ZXBHcm91cHMuZW1pdChxdWVyeSB8fCAnJyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlU3RlcEdyb3VwQ29uZmlnKCk7XG4gICAgaWYgKHRoaXMuaW5pdGlhbFN0ZXBHcm91cElkKSB7XG4gICAgICB0aGlzLnN0ZXBHcm91cEZvcm0ucGF0Y2hWYWx1ZSh7IHN0ZXBHcm91cElkOiB0aGlzLmluaXRpYWxTdGVwR3JvdXBJZCB9KTtcbiAgICAgIGNvbnN0IGZvdW5kR3JvdXAgPSB0aGlzLnN0ZXBHcm91cE9wdGlvbnMuZmluZChvcHQgPT4gb3B0LmlkID09PSB0aGlzLmluaXRpYWxTdGVwR3JvdXBJZCk7XG4gICAgICBpZiAoZm91bmRHcm91cCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkU3RlcEdyb3VwID0gZm91bmRHcm91cDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RlcEdyb3VwT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBBdXRvLXNlbGVjdCBmaXJzdCBvcHRpb24gaWYgYXZhaWxhYmxlXG4gICAgICBjb25zdCBmaXJzdE9wdGlvbiA9IHRoaXMuc3RlcEdyb3VwT3B0aW9uc1swXTtcbiAgICAgIHRoaXMuc3RlcEdyb3VwRm9ybS5wYXRjaFZhbHVlKHsgc3RlcEdyb3VwSWQ6IGZpcnN0T3B0aW9uLmlkIH0pO1xuICAgICAgdGhpcy5zZWxlY3RlZFN0ZXBHcm91cCA9IGZpcnN0T3B0aW9uO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc3RlcEdyb3VwT3B0aW9ucyddIHx8IGNoYW5nZXNbJ2hhc01vcmVTdGVwR3JvdXBzJ10gfHwgY2hhbmdlc1snaXNMb2FkaW5nU3RlcEdyb3VwcyddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0ZXBHcm91cENvbmZpZygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFN0ZXBHcm91cElkJ10gJiYgdGhpcy5pbml0aWFsU3RlcEdyb3VwSWQpIHtcbiAgICAgIHRoaXMuc3RlcEdyb3VwRm9ybS5wYXRjaFZhbHVlKHsgc3RlcEdyb3VwSWQ6IHRoaXMuaW5pdGlhbFN0ZXBHcm91cElkIH0pO1xuICAgICAgY29uc3QgZm91bmRHcm91cCA9IHRoaXMuc3RlcEdyb3VwT3B0aW9ucy5maW5kKG9wdCA9PiBvcHQuaWQgPT09IHRoaXMuaW5pdGlhbFN0ZXBHcm91cElkKTtcbiAgICAgIGlmIChmb3VuZEdyb3VwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwR3JvdXAgPSBmb3VuZEdyb3VwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RlcEdyb3VwQ29uZmlnKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gdGhpcy5zdGVwR3JvdXBPcHRpb25zLm1hcChncm91cCA9PiAoe1xuICAgICAgaWQ6IGdyb3VwLmlkLFxuICAgICAgdmFsdWU6IGdyb3VwLmlkLFxuICAgICAgbmFtZTogZ3JvdXAubmFtZSxcbiAgICAgIGxhYmVsOiBncm91cC5uYW1lXG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdGVwR3JvdXBDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnN0ZXBHcm91cENvbmZpZyxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICBoYXNNb3JlOiB0aGlzLmhhc01vcmVTdGVwR3JvdXBzLFxuICAgICAgaXNMb2FkaW5nOiB0aGlzLmlzTG9hZGluZ1N0ZXBHcm91cHNcbiAgICB9O1xuICB9XG5cbiAgb25TdGVwR3JvdXBDaGFuZ2Uoc3RlcEdyb3VwSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZvdW5kR3JvdXAgPSB0aGlzLnN0ZXBHcm91cE9wdGlvbnMuZmluZChvcHQgPT4gb3B0LmlkID09PSBzdGVwR3JvdXBJZCk7XG4gICAgaWYgKGZvdW5kR3JvdXApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwR3JvdXAgPSBmb3VuZEdyb3VwO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0ZXBHcm91cERlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTdGVwR3JvdXA/LmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCB0ZW1wRGVzY0VsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRlbXBEZXNjRWxlbS5pbm5lckhUTUwgPSB0aGlzLnNlbGVjdGVkU3RlcEdyb3VwLmRlc2NyaXB0aW9uO1xuICAgICAgcmV0dXJuIHRlbXBEZXNjRWxlbS50ZXh0Q29udGVudCB8fCAnJztcbiAgICB9XG4gICAgcmV0dXJuICdObyBkZXNjcmlwdGlvbiBhdmFpbGFibGUnO1xuICB9XG5cbiAgb25DcmVhdGVTdGVwKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0ZXBHcm91cEZvcm0udmFsaWQpIHtcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuc3RlcEdyb3VwRm9ybS52YWx1ZTtcbiAgICAgIGNvbnN0IHN0ZXBEYXRhOiBTdGVwR3JvdXBGb3JtRGF0YSA9IHtcbiAgICAgICAgc3RlcEdyb3VwSWQ6IGZvcm1WYWx1ZS5zdGVwR3JvdXBJZCxcbiAgICAgICAgc3RlcEdyb3VwOiB0aGlzLnNlbGVjdGVkU3RlcEdyb3VwXG4gICAgICB9O1xuICAgICAgdGhpcy5jcmVhdGVTdGVwLmVtaXQoc3RlcERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgfVxuXG4gIGlzRm9ybVZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0ZXBHcm91cEZvcm0udmFsaWQgJiYgISF0aGlzLnNlbGVjdGVkU3RlcEdyb3VwO1xuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWJnLXdoaXRlIGNxYS1weC00IGNxYS1weS0yIGNxYS1oLWZ1bGxcIj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIDxoMiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1ibGFjay0xMDAgY3FhLW1iLTRcIj5cbiAgICB7eyBlZGl0TW9kZSA/ICdFZGl0IFN0ZXAgR3JvdXAgVGVzdCBTdGVwJyA6ICdDcmVhdGUgU3RlcCBHcm91cCBUZXN0IFN0ZXAnIH19XG4gIDwvaDI+XG5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZmxleC0xIGNxYS1vdmVyZmxvdy15LWF1dG9cIj5cbiAgICA8IS0tIFN0ZXAgR3JvdXAgU2VsZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItNlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLWxlYWRpbmctWzEwMCVdIGNxYS1ibG9jayBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTYxNjE3XSBjcWEtbWItMVwiPlxuICAgICAgICBTZWxlY3QgU3RlcCBHcm91cDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyNFRjQ0NDRdIGNxYS1tbC0wLjVcIj4qPC9zcGFuPlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgW2Zvcm1dPVwic3RlcEdyb3VwRm9ybVwiXG4gICAgICAgIFtjb25maWddPVwic3RlcEdyb3VwQ29uZmlnXCI+XG4gICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3RlcCBHcm91cCBEZXNjcmlwdGlvbiAtLT5cbiAgICA8IS0tIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFN0ZXBHcm91cFwiIGNsYXNzPVwiY3FhLW1iLTZcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItMlwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM0YjU1NjNdXCI+RGVzY3JpcHRpb246PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMyBjcWEtYmctWyNmOWZhZmJdIGNxYS1yb3VuZGVkIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI2U1ZTdlYl1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtdGV4dC1bIzM3NDE1MV1cIiBbaW5uZXJIVE1MXT1cImdldFN0ZXBHcm91cERlc2NyaXB0aW9uKClcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gLS0+XG5cbiAgICA8IS0tIExvYWRpbmcgU3RhdGUgLS0+XG4gICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ1N0ZXBHcm91cHNcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyIGNxYS1weS04XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzE0cHhdIGNxYS10ZXh0LVsjNmI3MjgwXVwiPkxvYWRpbmcgc3RlcCBncm91cHMuLi48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRW1wdHkgU3RhdGUgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFpc0xvYWRpbmdTdGVwR3JvdXBzICYmIHN0ZXBHcm91cE9wdGlvbnMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXB5LTggY3FhLXRleHQtWyM5Y2EzYWZdIGNxYS10ZXh0LVsxNHB4XVwiPlxuICAgICAgTm8gc3RlcCBncm91cHMgYXZhaWxhYmxlXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtbXQtYXV0byBjcWEtcHQtNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgIDxjcWEtYnV0dG9uIGNsYXNzPVwiY3FhLXctMS8yIGNxYS1yb3VuZGVkLVsxMHB4XVwiIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIHRleHQ9XCJDYW5jZWxcIiBbY3VzdG9tQ2xhc3NdPVwiJ2NxYS1mbGV4LTEgY3FhLXctZnVsbCdcIlxuICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8Y3FhLWJ1dHRvbiBjbGFzcz1cImNxYS1ib3JkZXItc29saWQgY3FhLXJvdW5kZWQtWzlweF0gY3FhLXctMS8yIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bIzNGNDNFRV1cIiB2YXJpYW50PVwiZmlsbGVkXCIgW3RleHRdPVwiZWRpdE1vZGUgPyAnVXBkYXRlIFN0ZXAnIDogJ0luc2VydCBTdGVwIEdyb3VwJ1wiIFtjdXN0b21DbGFzc109XCInY3FhLWZsZXgtMSBjcWEtdy1mdWxsJ1wiXG4gICAgICBbZGlzYWJsZWRdPVwiIWlzRm9ybVZhbGlkKClcIlxuICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVTdGVwKClcIj5cbiAgICA8L2NxYS1idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==
|