@cqa-lib/cqa-ui 1.1.496 → 1.1.497

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.
@@ -0,0 +1,129 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../custom-toggle/custom-toggle.component";
4
+ import * as i2 from "@angular/common";
5
+ /**
6
+ * Dual-mode card summarising the API mocking configuration of a test case.
7
+ *
8
+ * The card surfaces **one boolean choice** — `restoreMock` — as two mutually-exclusive rows
9
+ * labelled "Capture API responses" and "Renew API responses":
10
+ *
11
+ * restoreMock === true → Renew = ON, Capture = OFF
12
+ * restoreMock === false → Renew = OFF, Capture = ON
13
+ *
14
+ * In read-only mode both rows show a value text ("On"/"Off") derived from `restoreMock`.
15
+ * In edit mode both rows render a toggle; interacting with either one flips `restoreMock`
16
+ * and the card emits `restoreMockChange` so the parent can persist the new value.
17
+ */
18
+ export class ApiMockingCardComponent {
19
+ constructor() {
20
+ this.title = 'API Mocking';
21
+ this.statusLabel = 'Not configured';
22
+ this.captureLabel = 'Capture API responses';
23
+ this.renewLabel = 'Renew API responses';
24
+ /**
25
+ * Single source of truth for the card's dual-toggle state.
26
+ * Defaults to `false` → Capture is ON, Renew is OFF.
27
+ */
28
+ this.restoreMock = false;
29
+ this.mockedApisCount = 0;
30
+ this.totalApisCount = 0;
31
+ this.progressPercent = 0;
32
+ this.configureButtonLabel = 'Configure';
33
+ this.editing = false;
34
+ /**
35
+ * Controls whether the "Mocked X of Y / progress bar / percent" block is shown.
36
+ * Hidden when the test case has no captured mock summary yet (and always hidden in
37
+ * edit mode regardless of this flag).
38
+ */
39
+ this.showProgress = false;
40
+ this.configure = new EventEmitter();
41
+ /**
42
+ * Emitted whenever the effective `restoreMock` value changes (either row's toggle was
43
+ * interacted with in edit mode). Parent components should persist this value — e.g. under
44
+ * `testCase.mockApiSettings.restoreMock`.
45
+ */
46
+ this.restoreMockChange = new EventEmitter();
47
+ }
48
+ // Derived per-row state (template binds these directly so the two rows stay in lock-step).
49
+ get renewEnabled() { return this.restoreMock; }
50
+ get captureEnabled() { return !this.restoreMock; }
51
+ get renewValueText() { return this.restoreMock ? 'On' : 'Off'; }
52
+ get captureValueText() { return this.restoreMock ? 'Off' : 'On'; }
53
+ get computedSummaryText() {
54
+ if (this.summaryText)
55
+ return this.summaryText;
56
+ return `${this.mockedApisCount} of ${this.totalApisCount} APIs set to mock`;
57
+ }
58
+ get computedPercentText() {
59
+ if (this.percentText)
60
+ return this.percentText;
61
+ return `${this.progressPercent}% of calls will use mock responses`;
62
+ }
63
+ get progressWidth() {
64
+ const clamped = Math.max(0, Math.min(100, Number(this.progressPercent) || 0));
65
+ return `${clamped}%`;
66
+ }
67
+ onConfigureClick() {
68
+ this.configure.emit();
69
+ }
70
+ /**
71
+ * User interacted with the "Renew API responses" toggle in edit mode.
72
+ * Renew ON → restoreMock = true (Capture OFF).
73
+ * Renew OFF → restoreMock = false (Capture ON — mutual exclusivity).
74
+ */
75
+ onRenewToggle(value) {
76
+ this.setRestoreMock(value);
77
+ }
78
+ /**
79
+ * User interacted with the "Capture API responses" toggle in edit mode.
80
+ * Capture ON → restoreMock = false (Renew OFF).
81
+ * Capture OFF → restoreMock = true (Renew ON — mutual exclusivity).
82
+ */
83
+ onCaptureToggle(value) {
84
+ this.setRestoreMock(!value);
85
+ }
86
+ setRestoreMock(next) {
87
+ if (this.restoreMock === next)
88
+ return;
89
+ this.restoreMock = next;
90
+ this.restoreMockChange.emit(next);
91
+ }
92
+ }
93
+ ApiMockingCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiMockingCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
94
+ ApiMockingCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ApiMockingCardComponent, selector: "cqa-api-mocking-card", inputs: { title: "title", statusLabel: "statusLabel", captureLabel: "captureLabel", renewLabel: "renewLabel", restoreMock: "restoreMock", mockedApisCount: "mockedApisCount", totalApisCount: "totalApisCount", progressPercent: "progressPercent", summaryText: "summaryText", percentText: "percentText", configureButtonLabel: "configureButtonLabel", editing: "editing", showProgress: "showProgress" }, outputs: { configure: "configure", restoreMockChange: "restoreMockChange" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-amc-card\">\n <div class=\"cqa-amc-header\">\n <span class=\"cqa-amc-title\">{{ title }}</span>\n <span class=\"cqa-amc-status\" *ngIf=\"statusLabel\">{{ statusLabel }}</span>\n </div>\n\n <!-- Read-only rows -->\n <ng-container *ngIf=\"!editing\">\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n <span class=\"cqa-amc-value\">{{ captureValueText }}</span>\n </div>\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n <span class=\"cqa-amc-value\">{{ renewValueText }}</span>\n </div>\n </ng-container>\n\n <!-- Edit rows: toggles -->\n <ng-container *ngIf=\"editing\">\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n <cqa-custom-toggle\n [checked]=\"captureEnabled\"\n [ariaLabel]=\"captureLabel\"\n (checkedChange)=\"onCaptureToggle($event)\">\n </cqa-custom-toggle>\n </div>\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n <cqa-custom-toggle\n [checked]=\"renewEnabled\"\n [ariaLabel]=\"renewLabel\"\n (checkedChange)=\"onRenewToggle($event)\">\n </cqa-custom-toggle>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"showProgress && !editing\">\n <p class=\"cqa-amc-summary\">{{ computedSummaryText }}</p>\n <div class=\"cqa-amc-progress-track\">\n <div class=\"cqa-amc-progress-fill\" [style.width]=\"progressWidth\"></div>\n </div>\n <p class=\"cqa-amc-percent\">{{ computedPercentText }}</p>\n </ng-container>\n\n <button\n *ngIf=\"!editing\"\n type=\"button\"\n class=\"cqa-amc-configure-btn\"\n (click)=\"onConfigureClick()\">\n {{ configureButtonLabel }}\n </button>\n</div>\n", components: [{ type: i1.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
95
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ApiMockingCardComponent, decorators: [{
96
+ type: Component,
97
+ args: [{ selector: 'cqa-api-mocking-card', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-amc-card\">\n <div class=\"cqa-amc-header\">\n <span class=\"cqa-amc-title\">{{ title }}</span>\n <span class=\"cqa-amc-status\" *ngIf=\"statusLabel\">{{ statusLabel }}</span>\n </div>\n\n <!-- Read-only rows -->\n <ng-container *ngIf=\"!editing\">\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n <span class=\"cqa-amc-value\">{{ captureValueText }}</span>\n </div>\n <div class=\"cqa-amc-row\">\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n <span class=\"cqa-amc-value\">{{ renewValueText }}</span>\n </div>\n </ng-container>\n\n <!-- Edit rows: toggles -->\n <ng-container *ngIf=\"editing\">\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <span class=\"cqa-amc-label\">{{ captureLabel }}</span>\n <cqa-custom-toggle\n [checked]=\"captureEnabled\"\n [ariaLabel]=\"captureLabel\"\n (checkedChange)=\"onCaptureToggle($event)\">\n </cqa-custom-toggle>\n </div>\n <div class=\"cqa-amc-row cqa-amc-row--edit\">\n <span class=\"cqa-amc-label\">{{ renewLabel }}</span>\n <cqa-custom-toggle\n [checked]=\"renewEnabled\"\n [ariaLabel]=\"renewLabel\"\n (checkedChange)=\"onRenewToggle($event)\">\n </cqa-custom-toggle>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"showProgress && !editing\">\n <p class=\"cqa-amc-summary\">{{ computedSummaryText }}</p>\n <div class=\"cqa-amc-progress-track\">\n <div class=\"cqa-amc-progress-fill\" [style.width]=\"progressWidth\"></div>\n </div>\n <p class=\"cqa-amc-percent\">{{ computedPercentText }}</p>\n </ng-container>\n\n <button\n *ngIf=\"!editing\"\n type=\"button\"\n class=\"cqa-amc-configure-btn\"\n (click)=\"onConfigureClick()\">\n {{ configureButtonLabel }}\n </button>\n</div>\n", styles: [] }]
98
+ }], propDecorators: { title: [{
99
+ type: Input
100
+ }], statusLabel: [{
101
+ type: Input
102
+ }], captureLabel: [{
103
+ type: Input
104
+ }], renewLabel: [{
105
+ type: Input
106
+ }], restoreMock: [{
107
+ type: Input
108
+ }], mockedApisCount: [{
109
+ type: Input
110
+ }], totalApisCount: [{
111
+ type: Input
112
+ }], progressPercent: [{
113
+ type: Input
114
+ }], summaryText: [{
115
+ type: Input
116
+ }], percentText: [{
117
+ type: Input
118
+ }], configureButtonLabel: [{
119
+ type: Input
120
+ }], editing: [{
121
+ type: Input
122
+ }], showProgress: [{
123
+ type: Input
124
+ }], configure: [{
125
+ type: Output
126
+ }], restoreMockChange: [{
127
+ type: Output
128
+ }] } });
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1tb2NraW5nLWNhcmQvYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL2FwaS1tb2NraW5nLWNhcmQvYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBWWhHOzs7Ozs7Ozs7Ozs7R0FZRztBQVVILE1BQU0sT0FBTyx1QkFBdUI7SUFUcEM7UUFVVyxVQUFLLEdBQVcsYUFBYSxDQUFDO1FBQzlCLGdCQUFXLEdBQVcsZ0JBQWdCLENBQUM7UUFFdkMsaUJBQVksR0FBVyx1QkFBdUIsQ0FBQztRQUMvQyxlQUFVLEdBQVcscUJBQXFCLENBQUM7UUFFcEQ7OztXQUdHO1FBQ00sZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFN0Isb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFDNUIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDM0Isb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFLNUIseUJBQW9CLEdBQVcsV0FBVyxDQUFDO1FBQzNDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFFbEM7Ozs7V0FJRztRQUNNLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRTdCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQy9DOzs7O1dBSUc7UUFDTyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0tBa0QzRDtJQWhEQywyRkFBMkY7SUFDM0YsSUFBSSxZQUFZLEtBQWMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN4RCxJQUFJLGNBQWMsS0FBYyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDM0QsSUFBSSxjQUFjLEtBQWEsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEUsSUFBSSxnQkFBZ0IsS0FBYSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUxRSxJQUFJLG1CQUFtQjtRQUNyQixJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzlDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxPQUFPLElBQUksQ0FBQyxjQUFjLG1CQUFtQixDQUFDO0lBQzlFLENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzlDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxvQ0FBb0MsQ0FBQztJQUNyRSxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLE9BQU8sR0FBRyxPQUFPLEdBQUcsQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxLQUFjO1FBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxlQUFlLENBQUMsS0FBYztRQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxJQUFhO1FBQ2xDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJO1lBQUUsT0FBTztRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7O29IQXJGVSx1QkFBdUI7d0dBQXZCLHVCQUF1Qixna0JDbENwQyw4MERBc0RBOzJGRHBCYSx1QkFBdUI7a0JBVG5DLFNBQVM7K0JBQ0Usc0JBQXNCLFFBSzFCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxtQkFDYix1QkFBdUIsQ0FBQyxNQUFNOzhCQUd0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFPRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLFNBQVM7c0JBQWxCLE1BQU07Z0JBTUcsaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogTGVnYWN5IHRvZ2dsZS1jaGFuZ2UgcGF5bG9hZCBrZXB0IGZvciBiYWNrLWNvbXBhdCB3aXRoIGNvbnN1bWVycyB0aGF0IGhhdmVuJ3QgbWlncmF0ZWRcbiAqIHRvIGByZXN0b3JlTW9ja0NoYW5nZWAgeWV0LiBga2V5YCBpZGVudGlmaWVzIHdoaWNoIHJvdyB3YXMgdG9nZ2xlZDsgYHZhbHVlYCBpcyB0aGUgbmV3XG4gKiBjaGVja2VkIHN0YXRlIG9mIHRoYXQgcm93LiBOZXcgY29kZSBzaG91bGQgbGlzdGVuIHRvIGByZXN0b3JlTW9ja0NoYW5nZWAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlNb2NraW5nQ2FyZFRvZ2dsZUNoYW5nZSB7XG4gIGtleTogJ2NhcHR1cmVBcGlSZXNwb25zZXMnIHwgJ3JlbmV3QXBpUmVzcG9uc2VzJztcbiAgdmFsdWU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRHVhbC1tb2RlIGNhcmQgc3VtbWFyaXNpbmcgdGhlIEFQSSBtb2NraW5nIGNvbmZpZ3VyYXRpb24gb2YgYSB0ZXN0IGNhc2UuXG4gKlxuICogVGhlIGNhcmQgc3VyZmFjZXMgKipvbmUgYm9vbGVhbiBjaG9pY2UqKiDigJQgYHJlc3RvcmVNb2NrYCDigJQgYXMgdHdvIG11dHVhbGx5LWV4Y2x1c2l2ZSByb3dzXG4gKiBsYWJlbGxlZCBcIkNhcHR1cmUgQVBJIHJlc3BvbnNlc1wiIGFuZCBcIlJlbmV3IEFQSSByZXNwb25zZXNcIjpcbiAqXG4gKiAgIHJlc3RvcmVNb2NrID09PSB0cnVlICAg4oaSICAgUmVuZXcgPSBPTiwgIENhcHR1cmUgPSBPRkZcbiAqICAgcmVzdG9yZU1vY2sgPT09IGZhbHNlICDihpIgICBSZW5ldyA9IE9GRiwgQ2FwdHVyZSA9IE9OXG4gKlxuICogSW4gcmVhZC1vbmx5IG1vZGUgYm90aCByb3dzIHNob3cgYSB2YWx1ZSB0ZXh0IChcIk9uXCIvXCJPZmZcIikgZGVyaXZlZCBmcm9tIGByZXN0b3JlTW9ja2AuXG4gKiBJbiBlZGl0IG1vZGUgYm90aCByb3dzIHJlbmRlciBhIHRvZ2dsZTsgaW50ZXJhY3Rpbmcgd2l0aCBlaXRoZXIgb25lIGZsaXBzIGByZXN0b3JlTW9ja2BcbiAqIGFuZCB0aGUgY2FyZCBlbWl0cyBgcmVzdG9yZU1vY2tDaGFuZ2VgIHNvIHRoZSBwYXJlbnQgY2FuIHBlcnNpc3QgdGhlIG5ldyB2YWx1ZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWFwaS1tb2NraW5nLWNhcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBpLW1vY2tpbmctY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIC8vIFN0eWxlcyBsaXZlIGluIHNyYy9saWIvc3R5bGVzL3RhaWx3aW5kLmNzcyAodGhlIGxpYiBzaGlwcyBhIHNpbmdsZSBjb21waWxlZCBzdHlsZXNoZWV0KTtcbiAgLy8gcGVyLWNvbXBvbmVudCAuc2NzcyBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGUgbmctcGFja2FnciBidWlsZCBmb3IgdGhpcyBsaWIuXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFwaU1vY2tpbmdDYXJkQ29tcG9uZW50IHtcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZyA9ICdBUEkgTW9ja2luZyc7XG4gIEBJbnB1dCgpIHN0YXR1c0xhYmVsOiBzdHJpbmcgPSAnTm90IGNvbmZpZ3VyZWQnO1xuXG4gIEBJbnB1dCgpIGNhcHR1cmVMYWJlbDogc3RyaW5nID0gJ0NhcHR1cmUgQVBJIHJlc3BvbnNlcyc7XG4gIEBJbnB1dCgpIHJlbmV3TGFiZWw6IHN0cmluZyA9ICdSZW5ldyBBUEkgcmVzcG9uc2VzJztcblxuICAvKipcbiAgICogU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGNhcmQncyBkdWFsLXRvZ2dsZSBzdGF0ZS5cbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYCDihpIgQ2FwdHVyZSBpcyBPTiwgUmVuZXcgaXMgT0ZGLlxuICAgKi9cbiAgQElucHV0KCkgcmVzdG9yZU1vY2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBtb2NrZWRBcGlzQ291bnQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIHRvdGFsQXBpc0NvdW50OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBwcm9ncmVzc1BlcmNlbnQ6IG51bWJlciA9IDA7XG5cbiAgQElucHV0KCkgc3VtbWFyeVRleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBlcmNlbnRUZXh0Pzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGNvbmZpZ3VyZUJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnQ29uZmlndXJlJztcbiAgQElucHV0KCkgZWRpdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBcIk1vY2tlZCBYIG9mIFkgLyBwcm9ncmVzcyBiYXIgLyBwZXJjZW50XCIgYmxvY2sgaXMgc2hvd24uXG4gICAqIEhpZGRlbiB3aGVuIHRoZSB0ZXN0IGNhc2UgaGFzIG5vIGNhcHR1cmVkIG1vY2sgc3VtbWFyeSB5ZXQgKGFuZCBhbHdheXMgaGlkZGVuIGluXG4gICAqIGVkaXQgbW9kZSByZWdhcmRsZXNzIG9mIHRoaXMgZmxhZykuXG4gICAqL1xuICBASW5wdXQoKSBzaG93UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgY29uZmlndXJlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuZXZlciB0aGUgZWZmZWN0aXZlIGByZXN0b3JlTW9ja2AgdmFsdWUgY2hhbmdlcyAoZWl0aGVyIHJvdydzIHRvZ2dsZSB3YXNcbiAgICogaW50ZXJhY3RlZCB3aXRoIGluIGVkaXQgbW9kZSkuIFBhcmVudCBjb21wb25lbnRzIHNob3VsZCBwZXJzaXN0IHRoaXMgdmFsdWUg4oCUIGUuZy4gdW5kZXJcbiAgICogYHRlc3RDYXNlLm1vY2tBcGlTZXR0aW5ncy5yZXN0b3JlTW9ja2AuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVzdG9yZU1vY2tDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLy8gRGVyaXZlZCBwZXItcm93IHN0YXRlICh0ZW1wbGF0ZSBiaW5kcyB0aGVzZSBkaXJlY3RseSBzbyB0aGUgdHdvIHJvd3Mgc3RheSBpbiBsb2NrLXN0ZXApLlxuICBnZXQgcmVuZXdFbmFibGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5yZXN0b3JlTW9jazsgfVxuICBnZXQgY2FwdHVyZUVuYWJsZWQoKTogYm9vbGVhbiB7IHJldHVybiAhdGhpcy5yZXN0b3JlTW9jazsgfVxuICBnZXQgcmVuZXdWYWx1ZVRleHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMucmVzdG9yZU1vY2sgPyAnT24nIDogJ09mZic7IH1cbiAgZ2V0IGNhcHR1cmVWYWx1ZVRleHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMucmVzdG9yZU1vY2sgPyAnT2ZmJyA6ICdPbic7IH1cblxuICBnZXQgY29tcHV0ZWRTdW1tYXJ5VGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnN1bW1hcnlUZXh0KSByZXR1cm4gdGhpcy5zdW1tYXJ5VGV4dDtcbiAgICByZXR1cm4gYCR7dGhpcy5tb2NrZWRBcGlzQ291bnR9IG9mICR7dGhpcy50b3RhbEFwaXNDb3VudH0gQVBJcyBzZXQgdG8gbW9ja2A7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRQZXJjZW50VGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnBlcmNlbnRUZXh0KSByZXR1cm4gdGhpcy5wZXJjZW50VGV4dDtcbiAgICByZXR1cm4gYCR7dGhpcy5wcm9ncmVzc1BlcmNlbnR9JSBvZiBjYWxscyB3aWxsIHVzZSBtb2NrIHJlc3BvbnNlc2A7XG4gIH1cblxuICBnZXQgcHJvZ3Jlc3NXaWR0aCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIE51bWJlcih0aGlzLnByb2dyZXNzUGVyY2VudCkgfHwgMCkpO1xuICAgIHJldHVybiBgJHtjbGFtcGVkfSVgO1xuICB9XG5cbiAgb25Db25maWd1cmVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZ3VyZS5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlciBpbnRlcmFjdGVkIHdpdGggdGhlIFwiUmVuZXcgQVBJIHJlc3BvbnNlc1wiIHRvZ2dsZSBpbiBlZGl0IG1vZGUuXG4gICAqIFJlbmV3IE9OICDihpIgcmVzdG9yZU1vY2sgPSB0cnVlICAoQ2FwdHVyZSBPRkYpLlxuICAgKiBSZW5ldyBPRkYg4oaSIHJlc3RvcmVNb2NrID0gZmFsc2UgKENhcHR1cmUgT04g4oCUIG11dHVhbCBleGNsdXNpdml0eSkuXG4gICAqL1xuICBvblJlbmV3VG9nZ2xlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zZXRSZXN0b3JlTW9jayh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlciBpbnRlcmFjdGVkIHdpdGggdGhlIFwiQ2FwdHVyZSBBUEkgcmVzcG9uc2VzXCIgdG9nZ2xlIGluIGVkaXQgbW9kZS5cbiAgICogQ2FwdHVyZSBPTiAg4oaSIHJlc3RvcmVNb2NrID0gZmFsc2UgKFJlbmV3IE9GRikuXG4gICAqIENhcHR1cmUgT0ZGIOKGkiByZXN0b3JlTW9jayA9IHRydWUgIChSZW5ldyBPTiDigJQgbXV0dWFsIGV4Y2x1c2l2aXR5KS5cbiAgICovXG4gIG9uQ2FwdHVyZVRvZ2dsZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2V0UmVzdG9yZU1vY2soIXZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UmVzdG9yZU1vY2sobmV4dDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc3RvcmVNb2NrID09PSBuZXh0KSByZXR1cm47XG4gICAgdGhpcy5yZXN0b3JlTW9jayA9IG5leHQ7XG4gICAgdGhpcy5yZXN0b3JlTW9ja0NoYW5nZS5lbWl0KG5leHQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWFtYy1jYXJkXCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtYW1jLWhlYWRlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy10aXRsZVwiPnt7IHRpdGxlIH19PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy1zdGF0dXNcIiAqbmdJZj1cInN0YXR1c0xhYmVsXCI+e3sgc3RhdHVzTGFiZWwgfX08L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDwhLS0gUmVhZC1vbmx5IHJvd3MgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZWRpdGluZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLXJvd1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLWxhYmVsXCI+e3sgY2FwdHVyZUxhYmVsIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLXZhbHVlXCI+e3sgY2FwdHVyZVZhbHVlVGV4dCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWFtYy1yb3dcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWFtYy1sYWJlbFwiPnt7IHJlbmV3TGFiZWwgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1hbWMtdmFsdWVcIj57eyByZW5ld1ZhbHVlVGV4dCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBFZGl0IHJvd3M6IHRvZ2dsZXMgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0aW5nXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1hbWMtcm93IGNxYS1hbWMtcm93LS1lZGl0XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1hbWMtbGFiZWxcIj57eyBjYXB0dXJlTGFiZWwgfX08L3NwYW4+XG4gICAgICA8Y3FhLWN1c3RvbS10b2dnbGVcbiAgICAgICAgW2NoZWNrZWRdPVwiY2FwdHVyZUVuYWJsZWRcIlxuICAgICAgICBbYXJpYUxhYmVsXT1cImNhcHR1cmVMYWJlbFwiXG4gICAgICAgIChjaGVja2VkQ2hhbmdlKT1cIm9uQ2FwdHVyZVRvZ2dsZSgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLXJvdyBjcWEtYW1jLXJvdy0tZWRpdFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYW1jLWxhYmVsXCI+e3sgcmVuZXdMYWJlbCB9fTwvc3Bhbj5cbiAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZVxuICAgICAgICBbY2hlY2tlZF09XCJyZW5ld0VuYWJsZWRcIlxuICAgICAgICBbYXJpYUxhYmVsXT1cInJlbmV3TGFiZWxcIlxuICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJvblJlbmV3VG9nZ2xlKCRldmVudClcIj5cbiAgICAgIDwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UHJvZ3Jlc3MgJiYgIWVkaXRpbmdcIj5cbiAgICA8cCBjbGFzcz1cImNxYS1hbWMtc3VtbWFyeVwiPnt7IGNvbXB1dGVkU3VtbWFyeVRleHQgfX08L3A+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1hbWMtcHJvZ3Jlc3MtdHJhY2tcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYW1jLXByb2dyZXNzLWZpbGxcIiBbc3R5bGUud2lkdGhdPVwicHJvZ3Jlc3NXaWR0aFwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxwIGNsYXNzPVwiY3FhLWFtYy1wZXJjZW50XCI+e3sgY29tcHV0ZWRQZXJjZW50VGV4dCB9fTwvcD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwiIWVkaXRpbmdcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwiY3FhLWFtYy1jb25maWd1cmUtYnRuXCJcbiAgICAoY2xpY2spPVwib25Db25maWd1cmVDbGljaygpXCI+XG4gICAge3sgY29uZmlndXJlQnV0dG9uTGFiZWwgfX1cbiAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==