@cqa-lib/cqa-ui 1.1.454 → 1.1.456
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/segment-control/segment-control.component.mjs +11 -3
- package/esm2020/lib/version-history/new-version-history-detail/new-version-history-detail.component.mjs +3 -3
- package/fesm2015/cqa-lib-cqa-ui.mjs +12 -4
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +12 -4
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/segment-control/segment-control.component.d.ts +2 -0
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, ViewChild, ViewChildren, } from '@angular/core';
|
|
1
|
+
import { Component, EventEmitter, HostBinding, Input, Output, ViewChild, ViewChildren, } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import * as i1 from "@angular/material/icon";
|
|
4
4
|
import * as i2 from "@angular/common";
|
|
@@ -17,6 +17,8 @@ export class SegmentControlComponent {
|
|
|
17
17
|
this.indicatorStyle = {};
|
|
18
18
|
this.indicatorVisible = false;
|
|
19
19
|
}
|
|
20
|
+
get hostDisplay() { return this.fullWidth ? 'block' : null; }
|
|
21
|
+
get hostWidth() { return this.fullWidth ? '100%' : null; }
|
|
20
22
|
ngOnChanges(changes) {
|
|
21
23
|
if (changes['segments'] || changes['value']) {
|
|
22
24
|
this.ensureSelectedValue();
|
|
@@ -213,7 +215,7 @@ export class SegmentControlComponent {
|
|
|
213
215
|
}
|
|
214
216
|
}
|
|
215
217
|
SegmentControlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SegmentControlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
216
|
-
SegmentControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SegmentControlComponent, selector: "cqa-segment-control", inputs: { segments: "segments", value: "value", disabled: "disabled", containerBgColor: "containerBgColor", fullWidth: "fullWidth" }, outputs: { valueChange: "valueChange" }, host: { classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "segmentContainer", first: true, predicate: ["segmentContainer"], descendants: true }, { propertyName: "segmentButtons", predicate: ["segmentButton"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" [style.display]=\"fullWidth ? 'block' : 'inline-block'\" [style.width]=\"fullWidth ? '100%' : null\">\n <div\n #segmentContainer\n class=\"cqa-relative cqa-flex-row cqa-items-start cqa-p-[3.5px] cqa-h-[31.5px] cqa-bg-surface-light cqa-rounded-[8px]\"\n [ngClass]=\"fullWidth ? 'cqa-flex' : 'cqa-inline-flex'\"\n role=\"tablist\"\n [attr.aria-disabled]=\"disabled || null\"\n [ngStyle]=\"containerBgColor ? {'background-color': containerBgColor} : null\"\n >\n <div\n class=\"cqa-absolute cqa-rounded-[8px] cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-pointer-events-none\"\n [class.cqa-opacity-0]=\"!isIndicatorVisible\" [ngStyle]=\"indicatorStyle\" aria-hidden=\"true\"></div>\n\n <button *ngFor=\"let segment of segments; index as index; trackBy: trackByValue\" #segmentButton type=\"button\"\n role=\"tab\"\n class=\"cqa-relative cqa-z-0 cqa-flex cqa-flex-col cqa-justify-center cqa-items-center cqa-px-[14px] cqa-py-[3.5px] cqa-h-[25px] cqa-rounded-[8px] cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-whitespace-nowrap cqa-text-center focus:cqa-outline-none focus-visible:cqa-outline-none focus-visible:cqa-ring-0 focus-visible:cqa-ring-offset-0\"\n [ngClass]=\"{\n 'cqa-flex-1 cqa-min-w-0': fullWidth,\n 'cqa-flex-none': !fullWidth,\n 'cqa-text-white cqa-font-medium': isSelected(segment),\n 'cqa-text-muted': !isSelected(segment) && !(disabled || segment.disabled),\n 'cqa-cursor-not-allowed': disabled || segment.disabled,\n 'cqa-text-disabled': (disabled || segment.disabled) && !isSelected(segment),\n 'cqa-hover:cqa-text-black': !isSelected(segment) && !disabled && !segment.disabled\n }\" [disabled]=\"disabled || segment.disabled\" [attr.aria-selected]=\"isSelected(segment)\"\n [attr.tabindex]=\"!disabled && !segment.disabled ? (isSelected(segment) ? 0 : -1) : -1\"\n (click)=\"select(segment, index)\" (keydown)=\"onKeyDown($event, index)\">\n <span\n class=\"cqa-flex cqa-gap-1 cqa-items-center cqa-justify-center cqa-h-[18px] cqa-font-['Inter'] cqa-font-normal cqa-text-[12px] cqa-leading-[12px] cqa-text-center cqa-align-middle\">\n \n <mat-icon *ngIf=\"segment?.icon\" class=\"!cqa-w-[12px] !cqa-h-[12px] !cqa-text-[12px]\" >\n {{ segment?.icon }}\n </mat-icon>\n\n {{ segment.label }}\n\n <span *ngIf=\"segment?.tooltip\"\n style=\"display: inline-flex; align-items: center; justify-content: center; margin-left: 4px; cursor: help;\"\n [matTooltip]=\"segment.tooltip\"\n matTooltipPosition=\"above\"\n matTooltipShowDelay=\"0\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon style=\"width: 14px; height: 14px; font-size: 14px; opacity: 0.8;\">info</mat-icon>\n </span>\n </span>\n </button>\n</div>", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
|
|
218
|
+
SegmentControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SegmentControlComponent, selector: "cqa-segment-control", inputs: { segments: "segments", value: "value", disabled: "disabled", containerBgColor: "containerBgColor", fullWidth: "fullWidth" }, outputs: { valueChange: "valueChange" }, host: { properties: { "style.display": "this.hostDisplay", "style.width": "this.hostWidth" }, classAttribute: "cqa-ui-root" }, viewQueries: [{ propertyName: "segmentContainer", first: true, predicate: ["segmentContainer"], descendants: true }, { propertyName: "segmentButtons", predicate: ["segmentButton"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" [style.display]=\"fullWidth ? 'block' : 'inline-block'\" [style.width]=\"fullWidth ? '100%' : null\">\n <div\n #segmentContainer\n class=\"cqa-relative cqa-flex-row cqa-items-start cqa-p-[3.5px] cqa-h-[31.5px] cqa-bg-surface-light cqa-rounded-[8px]\"\n [ngClass]=\"fullWidth ? 'cqa-flex' : 'cqa-inline-flex'\"\n role=\"tablist\"\n [attr.aria-disabled]=\"disabled || null\"\n [ngStyle]=\"containerBgColor ? {'background-color': containerBgColor} : null\"\n >\n <div\n class=\"cqa-absolute cqa-rounded-[8px] cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-pointer-events-none\"\n [class.cqa-opacity-0]=\"!isIndicatorVisible\" [ngStyle]=\"indicatorStyle\" aria-hidden=\"true\"></div>\n\n <button *ngFor=\"let segment of segments; index as index; trackBy: trackByValue\" #segmentButton type=\"button\"\n role=\"tab\"\n class=\"cqa-relative cqa-z-0 cqa-flex cqa-flex-col cqa-justify-center cqa-items-center cqa-px-[14px] cqa-py-[3.5px] cqa-h-[25px] cqa-rounded-[8px] cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-whitespace-nowrap cqa-text-center focus:cqa-outline-none focus-visible:cqa-outline-none focus-visible:cqa-ring-0 focus-visible:cqa-ring-offset-0\"\n [ngClass]=\"{\n 'cqa-flex-1 cqa-min-w-0': fullWidth,\n 'cqa-flex-none': !fullWidth,\n 'cqa-text-white cqa-font-medium': isSelected(segment),\n 'cqa-text-muted': !isSelected(segment) && !(disabled || segment.disabled),\n 'cqa-cursor-not-allowed': disabled || segment.disabled,\n 'cqa-text-disabled': (disabled || segment.disabled) && !isSelected(segment),\n 'cqa-hover:cqa-text-black': !isSelected(segment) && !disabled && !segment.disabled\n }\" [disabled]=\"disabled || segment.disabled\" [attr.aria-selected]=\"isSelected(segment)\"\n [attr.tabindex]=\"!disabled && !segment.disabled ? (isSelected(segment) ? 0 : -1) : -1\"\n (click)=\"select(segment, index)\" (keydown)=\"onKeyDown($event, index)\">\n <span\n class=\"cqa-flex cqa-gap-1 cqa-items-center cqa-justify-center cqa-h-[18px] cqa-font-['Inter'] cqa-font-normal cqa-text-[12px] cqa-leading-[12px] cqa-text-center cqa-align-middle\">\n \n <mat-icon *ngIf=\"segment?.icon\" class=\"!cqa-w-[12px] !cqa-h-[12px] !cqa-text-[12px]\" >\n {{ segment?.icon }}\n </mat-icon>\n\n {{ segment.label }}\n\n <span *ngIf=\"segment?.tooltip\"\n style=\"display: inline-flex; align-items: center; justify-content: center; margin-left: 4px; cursor: help;\"\n [matTooltip]=\"segment.tooltip\"\n matTooltipPosition=\"above\"\n matTooltipShowDelay=\"0\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon style=\"width: 14px; height: 14px; font-size: 14px; opacity: 0.8;\">info</mat-icon>\n </span>\n </span>\n </button>\n</div>", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
|
|
217
219
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SegmentControlComponent, decorators: [{
|
|
218
220
|
type: Component,
|
|
219
221
|
args: [{ selector: 'cqa-segment-control', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-ui-root\" [style.display]=\"fullWidth ? 'block' : 'inline-block'\" [style.width]=\"fullWidth ? '100%' : null\">\n <div\n #segmentContainer\n class=\"cqa-relative cqa-flex-row cqa-items-start cqa-p-[3.5px] cqa-h-[31.5px] cqa-bg-surface-light cqa-rounded-[8px]\"\n [ngClass]=\"fullWidth ? 'cqa-flex' : 'cqa-inline-flex'\"\n role=\"tablist\"\n [attr.aria-disabled]=\"disabled || null\"\n [ngStyle]=\"containerBgColor ? {'background-color': containerBgColor} : null\"\n >\n <div\n class=\"cqa-absolute cqa-rounded-[8px] cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-pointer-events-none\"\n [class.cqa-opacity-0]=\"!isIndicatorVisible\" [ngStyle]=\"indicatorStyle\" aria-hidden=\"true\"></div>\n\n <button *ngFor=\"let segment of segments; index as index; trackBy: trackByValue\" #segmentButton type=\"button\"\n role=\"tab\"\n class=\"cqa-relative cqa-z-0 cqa-flex cqa-flex-col cqa-justify-center cqa-items-center cqa-px-[14px] cqa-py-[3.5px] cqa-h-[25px] cqa-rounded-[8px] cqa-transition-all cqa-duration-200 cqa-ease-in-out cqa-whitespace-nowrap cqa-text-center focus:cqa-outline-none focus-visible:cqa-outline-none focus-visible:cqa-ring-0 focus-visible:cqa-ring-offset-0\"\n [ngClass]=\"{\n 'cqa-flex-1 cqa-min-w-0': fullWidth,\n 'cqa-flex-none': !fullWidth,\n 'cqa-text-white cqa-font-medium': isSelected(segment),\n 'cqa-text-muted': !isSelected(segment) && !(disabled || segment.disabled),\n 'cqa-cursor-not-allowed': disabled || segment.disabled,\n 'cqa-text-disabled': (disabled || segment.disabled) && !isSelected(segment),\n 'cqa-hover:cqa-text-black': !isSelected(segment) && !disabled && !segment.disabled\n }\" [disabled]=\"disabled || segment.disabled\" [attr.aria-selected]=\"isSelected(segment)\"\n [attr.tabindex]=\"!disabled && !segment.disabled ? (isSelected(segment) ? 0 : -1) : -1\"\n (click)=\"select(segment, index)\" (keydown)=\"onKeyDown($event, index)\">\n <span\n class=\"cqa-flex cqa-gap-1 cqa-items-center cqa-justify-center cqa-h-[18px] cqa-font-['Inter'] cqa-font-normal cqa-text-[12px] cqa-leading-[12px] cqa-text-center cqa-align-middle\">\n \n <mat-icon *ngIf=\"segment?.icon\" class=\"!cqa-w-[12px] !cqa-h-[12px] !cqa-text-[12px]\" >\n {{ segment?.icon }}\n </mat-icon>\n\n {{ segment.label }}\n\n <span *ngIf=\"segment?.tooltip\"\n style=\"display: inline-flex; align-items: center; justify-content: center; margin-left: 4px; cursor: help;\"\n [matTooltip]=\"segment.tooltip\"\n matTooltipPosition=\"above\"\n matTooltipShowDelay=\"0\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon style=\"width: 14px; height: 14px; font-size: 14px; opacity: 0.8;\">info</mat-icon>\n </span>\n </span>\n </button>\n</div>", styles: [] }]
|
|
@@ -227,6 +229,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
227
229
|
type: Input
|
|
228
230
|
}], fullWidth: [{
|
|
229
231
|
type: Input
|
|
232
|
+
}], hostDisplay: [{
|
|
233
|
+
type: HostBinding,
|
|
234
|
+
args: ['style.display']
|
|
235
|
+
}], hostWidth: [{
|
|
236
|
+
type: HostBinding,
|
|
237
|
+
args: ['style.width']
|
|
230
238
|
}], valueChange: [{
|
|
231
239
|
type: Output
|
|
232
240
|
}], segmentButtons: [{
|
|
@@ -236,4 +244,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
236
244
|
type: ViewChild,
|
|
237
245
|
args: ['segmentContainer']
|
|
238
246
|
}] } });
|
|
239
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudC1jb250cm9sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VnbWVudC1jb250cm9sL3NlZ21lbnQtY29udHJvbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlZ21lbnQtY29udHJvbC9zZWdtZW50LWNvbnRyb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFHTixTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDOzs7OztBQWlCdkIsTUFBTSxPQUFPLHVCQUF1QjtJQU5wQztRQVFXLGFBQVEsR0FBb0I7WUFDbkMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7WUFDNUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7U0FDN0MsQ0FBQztRQU9PLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBRS9CLHlGQUF5RjtRQUNoRixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWpCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUtuRCxtQkFBYyxHQUEyQixFQUFFLENBQUM7UUFDNUMscUJBQWdCLEdBQUcsS0FBSyxDQUFDO0tBaU8xQjtJQTlOQyxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdB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OztvSEF4UFUsdUJBQXVCO3dHQUF2Qix1QkFBdUIsbWZDOUJwQyxxMEZBOENNOzJGRGhCTyx1QkFBdUI7a0JBTm5DLFNBQVM7K0JBQ0UscUJBQXFCLFFBR3pCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTs4QkFJckIsUUFBUTtzQkFBaEIsS0FBSztnQkFTRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUV3QixjQUFjO3NCQUE1QyxZQUFZO3VCQUFDLGVBQWU7Z0JBQ0UsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxudHlwZSBTZWdtZW50T3B0aW9uID0ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGljb24/OiBzdHJpbmc7XG4gIHRvb2x0aXA/OiBzdHJpbmc7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtc2VnbWVudC1jb250cm9sJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlZ21lbnQtY29udHJvbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfVxufSlcbmV4cG9ydCBjbGFzcyBTZWdtZW50Q29udHJvbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKSBzZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdUYWIgR3JvdXAnLCB2YWx1ZTogJ3RhYi1ncm91cC0xJyB9LFxuICAgIHsgbGFiZWw6ICdUYWIgR3JvdXAnLCB2YWx1ZTogJ3RhYi1ncm91cC0yJyB9LFxuICBdO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHNlZ21lbnQgdmFsdWUuXG4gICAqIElmIG5vdCBwcm92aWRlZCwgZGVmYXVsdHMgdG8gdGhlIGZpcnN0IGVuYWJsZWQgc2VnbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIHZhbHVlPzogc3RyaW5nO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBjb250YWluZXJCZ0NvbG9yID0gJyc7XG5cbiAgLyoqIFdoZW4gdHJ1ZSwgdGhlIGNvbnRyb2wgc3RyZXRjaGVzIHRvIGZpbGwgaXRzIHBhcmVudCBhbmQgYnV0dG9ucyBzaGFyZSBlcXVhbCB3aWR0aC4gKi9cbiAgQElucHV0KCkgZnVsbFdpZHRoID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQFZpZXdDaGlsZHJlbignc2VnbWVudEJ1dHRvbicpIHNlZ21lbnRCdXR0b25zITogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+PjtcbiAgQFZpZXdDaGlsZCgnc2VnbWVudENvbnRhaW5lcicpIHNlZ21lbnRDb250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBpbmRpY2F0b3JTdHlsZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBpbmRpY2F0b3JWaXNpYmxlID0gZmFsc2U7XG4gIHByaXZhdGUgYnV0dG9uQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NlZ21lbnRzJ10gfHwgY2hhbmdlc1sndmFsdWUnXSkge1xuICAgICAgdGhpcy5lbnN1cmVTZWxlY3RlZFZhbHVlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYnV0dG9uQ2hhbmdlc1N1YiA9IHRoaXMuc2VnbWVudEJ1dHRvbnMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVJbmRpY2F0b3IoKSk7XG4gICAgdGhpcy5lbnN1cmVTZWxlY3RlZFZhbHVlKCk7XG4gICAgdGhpcy51cGRhdGVJbmRpY2F0b3IoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuYnV0dG9uQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmU/LigpO1xuICB9XG5cbiAgdHJhY2tCeVZhbHVlKF9pbmRleDogbnVtYmVyLCBvcHRpb246IFNlZ21lbnRPcHRpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBvcHRpb24udmFsdWU7XG4gIH1cblxuICBpc1NlbGVjdGVkKG9wdGlvbjogU2VnbWVudE9wdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBvcHRpb24udmFsdWUgPT09IHRoaXMudmFsdWU7XG4gIH1cblxuICBzZWxlY3Qob3B0aW9uOiBTZWdtZW50T3B0aW9uLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgb3B0aW9uLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dFZhbHVlID0gb3B0aW9uLnZhbHVlO1xuICAgIGlmIChuZXh0VmFsdWUgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBuZXh0VmFsdWU7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQobmV4dFZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvY3VzQnV0dG9uKGluZGV4KTtcbiAgICB0aGlzLnVwZGF0ZUluZGljYXRvcigpO1xuICB9XG5cbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBjdXJyZW50SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlU2VsZWN0aW9uKDEsIGN1cnJlbnRJbmRleCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVTZWxlY3Rpb24oLTEsIGN1cnJlbnRJbmRleCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2VsZWN0Rmlyc3RFbmFibGVkKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RMYXN0RW5hYmxlZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLnNlZ21lbnRzW2N1cnJlbnRJbmRleF0sIGN1cnJlbnRJbmRleCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlU2VsZWN0aW9uKHN0ZXA6IDEgfCAtMSwgc3RhcnRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZW5hYmxlZEluZGV4ZXMgPSB0aGlzLmdldEVuYWJsZWRJbmRleGVzKCk7XG4gICAgaWYgKGVuYWJsZWRJbmRleGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRFbmFibGVkSW5kZXggPSBlbmFibGVkSW5kZXhlcy5pbmRleE9mKHN0YXJ0SW5kZXgpO1xuICAgIGNvbnN0IGZhbGxiYWNrSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXgoZW5hYmxlZEluZGV4ZXMpO1xuICAgIGNvbnN0IGJhc2VJbmRleCA9IGN1cnJlbnRFbmFibGVkSW5kZXggPj0gMCA/IGN1cnJlbnRFbmFibGVkSW5kZXggOiBmYWxsYmFja0luZGV4O1xuICAgIGNvbnN0IG5leHRQb3NpdGlvbiA9IChiYXNlSW5kZXggKyBzdGVwICsgZW5hYmxlZEluZGV4ZXMubGVuZ3RoKSAlIGVuYWJsZWRJbmRleGVzLmxlbmd0aDtcbiAgICBjb25zdCB0YXJnZXRJbmRleCA9IGVuYWJsZWRJbmRleGVzW25leHRQb3NpdGlvbl07XG5cbiAgICB0aGlzLnNlbGVjdCh0aGlzLnNlZ21lbnRzW3RhcmdldEluZGV4XSwgdGFyZ2V0SW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RGaXJzdEVuYWJsZWQoKTogdm9pZCB7XG4gICAgY29uc3QgZW5hYmxlZEluZGV4ZXMgPSB0aGlzLmdldEVuYWJsZWRJbmRleGVzKCk7XG4gICAgaWYgKGVuYWJsZWRJbmRleGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gZW5hYmxlZEluZGV4ZXNbMF07XG4gICAgICB0aGlzLnNlbGVjdCh0aGlzLnNlZ21lbnRzW2luZGV4XSwgaW5kZXgpO1xuICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdExhc3RFbmFibGVkKCk6IHZvaWQge1xuICAgIGNvbnN0IGVuYWJsZWRJbmRleGVzID0gdGhpcy5nZXRFbmFibGVkSW5kZXhlcygpO1xuICAgIGlmIChlbmFibGVkSW5kZXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGVuYWJsZWRJbmRleGVzW2VuYWJsZWRJbmRleGVzLmxlbmd0aCAtIDFdO1xuICAgICAgdGhpcy5zZWxlY3QodGhpcy5zZWdtZW50c1tpbmRleF0sIGluZGV4KTtcbiAgICAgIHRoaXMudXBkYXRlSW5kaWNhdG9yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmFibGVkSW5kZXhlcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VnbWVudHNcbiAgICAgIC5tYXAoKG9wdGlvbiwgaW5kZXgpID0+ICh7IG9wdGlvbiwgaW5kZXggfSkpXG4gICAgICAuZmlsdGVyKCh7IG9wdGlvbiB9KSA9PiAhb3B0aW9uLmRpc2FibGVkKVxuICAgICAgLm1hcCgoeyBpbmRleCB9KSA9PiBpbmRleCk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGVkSW5kZXgoZW5hYmxlZEluZGV4ZXM6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zZWdtZW50cy5maW5kSW5kZXgoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSB0aGlzLnZhbHVlICYmICFvcHRpb24uZGlzYWJsZWQpO1xuICAgIGlmIChjdXJyZW50ID49IDApIHtcbiAgICAgIHJldHVybiBlbmFibGVkSW5kZXhlcy5pbmRleE9mKGN1cnJlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgYSB2YWxpZCB2YWx1ZSBpcyBzZWxlY3RlZC5cbiAgICogSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQgb3IgdGhlIHZhbHVlIGlzIGludmFsaWQsIGRlZmF1bHRzIHRvIHRoZSBmaXJzdCBlbmFibGVkIHNlZ21lbnQuXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZVNlbGVjdGVkVmFsdWUoKTogdm9pZCB7XG4gICAgY29uc3QgZW5hYmxlZCA9IHRoaXMuc2VnbWVudHMuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZGlzYWJsZWQpO1xuICAgIGlmIChlbmFibGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBubyB2YWx1ZSBpcyBzZXQsIG9yIHZhbHVlIGRvZXNuJ3QgZXhpc3QgaW4gc2VnbWVudHMsIGRlZmF1bHQgdG8gZmlyc3QgZW5hYmxlZCBzZWdtZW50XG4gICAgaWYgKCF0aGlzLnZhbHVlIHx8ICF0aGlzLnNlZ21lbnRzLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSB0aGlzLnZhbHVlKSkge1xuICAgICAgY29uc3QgZmlyc3RFbmFibGVkVmFsdWUgPSBlbmFibGVkWzBdLnZhbHVlO1xuICAgICAgLy8gT25seSBlbWl0IGlmIHZhbHVlIGFjdHVhbGx5IGNoYW5nZWRcbiAgICAgIGlmICh0aGlzLnZhbHVlICE9PSBmaXJzdEVuYWJsZWRWYWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gZmlyc3RFbmFibGVkVmFsdWU7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWdtZW50cy5maW5kSW5kZXgoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBmaXJzdEVuYWJsZWRWYWx1ZSk7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLmZvY3VzQnV0dG9uKGluZGV4KTtcbiAgICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3IoaW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzZWxlY3RlZCB2YWx1ZSBpcyBkaXNhYmxlZCwgc3dpdGNoIHRvIGZpcnN0IGVuYWJsZWQgc2VnbWVudFxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWdtZW50cy5maW5kKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PT0gdGhpcy52YWx1ZSk7XG4gICAgaWYgKHNlbGVjdGVkPy5kaXNhYmxlZCkge1xuICAgICAgY29uc3QgZmlyc3RFbmFibGVkVmFsdWUgPSBlbmFibGVkWzBdLnZhbHVlO1xuICAgICAgLy8gT25seSBlbWl0IGlmIHZhbHVlIGFjdHVhbGx5IGNoYW5nZWRcbiAgICAgIGlmICh0aGlzLnZhbHVlICE9PSBmaXJzdEVuYWJsZWRWYWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gZmlyc3RFbmFibGVkVmFsdWU7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWdtZW50cy5maW5kSW5kZXgoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBmaXJzdEVuYWJsZWRWYWx1ZSk7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLmZvY3VzQnV0dG9uKGluZGV4KTtcbiAgICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3IoaW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnVwZGF0ZUluZGljYXRvcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0J1dHRvbihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgYnV0dG9uID0gdGhpcy5zZWdtZW50QnV0dG9ucz8uZ2V0KGluZGV4KT8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGJ1dHRvbj8uZm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5kaWNhdG9yKHByZWZlcnJlZEluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zZWdtZW50Q29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3QgYnV0dG9ucyA9IHRoaXMuc2VnbWVudEJ1dHRvbnM/LnRvQXJyYXkoKSA/PyBbXTtcbiAgICAgIGlmICghY29udGFpbmVyIHx8IGJ1dHRvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmluZGljYXRvclN0eWxlID0ge307XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5kZXggPSBwcmVmZXJyZWRJbmRleCA/PyBidXR0b25zLmZpbmRJbmRleCgoYnV0dG9uLCBpZHgpID0+IHRoaXMuc2VnbWVudHNbaWR4XT8udmFsdWUgPT09IHRoaXMudmFsdWUpO1xuICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICB0aGlzLmluZGljYXRvclZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JTdHlsZSA9IHt9O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvbkVsID0gYnV0dG9uc1tpbmRleF0/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWJ1dHRvbkVsKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmluZGljYXRvclN0eWxlID0ge307XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGJ1dHRvblJlY3QgPSBidXR0b25FbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IG9mZnNldExlZnQgPSBidXR0b25FbC5vZmZzZXRMZWZ0O1xuICAgICAgY29uc3Qgb2Zmc2V0VG9wID0gYnV0dG9uRWwub2Zmc2V0VG9wO1xuICAgICAgY29uc3Qgd2lkdGggPSBidXR0b25FbC5vZmZzZXRXaWR0aDtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGJ1dHRvbkVsLm9mZnNldEhlaWdodDtcblxuICAgICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5zZWdtZW50c1tpbmRleF0/LmRpc2FibGVkO1xuICAgICAgdGhpcy5pbmRpY2F0b3JTdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6IGAke3dpZHRofXB4YCxcbiAgICAgICAgaGVpZ2h0OiBgJHtoZWlnaHR9cHhgLFxuICAgICAgICBsZWZ0OiBgJHtvZmZzZXRMZWZ0fXB4YCxcbiAgICAgICAgdG9wOiBgJHtvZmZzZXRUb3B9cHhgLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGlzRGlzYWJsZWQgPyAnIzlCQTBGNCcgOiAnIzNGNDNFRScsXG4gICAgICB9O1xuICAgICAgdGhpcy5pbmRpY2F0b3JWaXNpYmxlID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBpc0luZGljYXRvclZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaW5kaWNhdG9yVmlzaWJsZTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCIgW3N0eWxlLmRpc3BsYXldPVwiZnVsbFdpZHRoID8gJ2Jsb2NrJyA6ICdpbmxpbmUtYmxvY2snXCIgW3N0eWxlLndpZHRoXT1cImZ1bGxXaWR0aCA/ICcxMDAlJyA6IG51bGxcIj5cbiAgPGRpdlxuICAgICNzZWdtZW50Q29udGFpbmVyXG4gICAgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWZsZXgtcm93IGNxYS1pdGVtcy1zdGFydCBjcWEtcC1bMy41cHhdIGNxYS1oLVszMS41cHhdIGNxYS1iZy1zdXJmYWNlLWxpZ2h0IGNxYS1yb3VuZGVkLVs4cHhdXCJcbiAgICBbbmdDbGFzc109XCJmdWxsV2lkdGggPyAnY3FhLWZsZXgnIDogJ2NxYS1pbmxpbmUtZmxleCdcIlxuICAgIHJvbGU9XCJ0YWJsaXN0XCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkIHx8IG51bGxcIlxuICAgIFtuZ1N0eWxlXT1cImNvbnRhaW5lckJnQ29sb3IgPyB7J2JhY2tncm91bmQtY29sb3InOiBjb250YWluZXJCZ0NvbG9yfSA6IG51bGxcIlxuICA+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXJvdW5kZWQtWzhweF0gY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1kdXJhdGlvbi0yMDAgY3FhLWVhc2UtaW4tb3V0IGNxYS1wb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0wXT1cIiFpc0luZGljYXRvclZpc2libGVcIiBbbmdTdHlsZV09XCJpbmRpY2F0b3JTdHlsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuXG4gICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgc2VnbWVudCBvZiBzZWdtZW50czsgaW5kZXggYXMgaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlWYWx1ZVwiICNzZWdtZW50QnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgcm9sZT1cInRhYlwiXG4gICAgICBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtei0wIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlciBjcWEtcHgtWzE0cHhdIGNxYS1weS1bMy41cHhdIGNxYS1oLVsyNXB4XSBjcWEtcm91bmRlZC1bOHB4XSBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWR1cmF0aW9uLTIwMCBjcWEtZWFzZS1pbi1vdXQgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS10ZXh0LWNlbnRlciBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6Y3FhLW91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLTAgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1vZmZzZXQtMFwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdjcWEtZmxleC0xIGNxYS1taW4tdy0wJzogZnVsbFdpZHRoLFxuICAgICAgICAnY3FhLWZsZXgtbm9uZSc6ICFmdWxsV2lkdGgsXG4gICAgICAgICdjcWEtdGV4dC13aGl0ZSBjcWEtZm9udC1tZWRpdW0nOiBpc1NlbGVjdGVkKHNlZ21lbnQpLFxuICAgICAgICAnY3FhLXRleHQtbXV0ZWQnOiAhaXNTZWxlY3RlZChzZWdtZW50KSAmJiAhKGRpc2FibGVkIHx8IHNlZ21lbnQuZGlzYWJsZWQpLFxuICAgICAgICAnY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IGRpc2FibGVkIHx8IHNlZ21lbnQuZGlzYWJsZWQsXG4gICAgICAgICdjcWEtdGV4dC1kaXNhYmxlZCc6IChkaXNhYmxlZCB8fCBzZWdtZW50LmRpc2FibGVkKSAmJiAhaXNTZWxlY3RlZChzZWdtZW50KSxcbiAgICAgICAgJ2NxYS1ob3ZlcjpjcWEtdGV4dC1ibGFjayc6ICFpc1NlbGVjdGVkKHNlZ21lbnQpICYmICFkaXNhYmxlZCAmJiAhc2VnbWVudC5kaXNhYmxlZFxuICAgICAgfVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzZWdtZW50LmRpc2FibGVkXCIgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKHNlZ21lbnQpXCJcbiAgICAgIFthdHRyLnRhYmluZGV4XT1cIiFkaXNhYmxlZCAmJiAhc2VnbWVudC5kaXNhYmxlZCA/IChpc1NlbGVjdGVkKHNlZ21lbnQpID8gMCA6IC0xKSA6IC0xXCJcbiAgICAgIChjbGljayk9XCJzZWxlY3Qoc2VnbWVudCwgaW5kZXgpXCIgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudCwgaW5kZXgpXCI+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtMSBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaC1bMThweF0gY3FhLWZvbnQtWydJbnRlciddIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS10ZXh0LWNlbnRlciBjcWEtYWxpZ24tbWlkZGxlXCI+XG4gICAgICAgIFxuICAgICAgPG1hdC1pY29uICpuZ0lmPVwic2VnbWVudD8uaWNvblwiIGNsYXNzPVwiIWNxYS13LVsxMnB4XSAhY3FhLWgtWzEycHhdICFjcWEtdGV4dC1bMTJweF1cIiA+XG4gICAgICAgIHt7IHNlZ21lbnQ/Lmljb24gfX1cbiAgICAgIDwvbWF0LWljb24+XG5cbiAgICAgIHt7IHNlZ21lbnQubGFiZWwgfX1cblxuICAgICAgPHNwYW4gKm5nSWY9XCJzZWdtZW50Py50b29sdGlwXCJcbiAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IG1hcmdpbi1sZWZ0OiA0cHg7IGN1cnNvcjogaGVscDtcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJzZWdtZW50LnRvb2x0aXBcIlxuICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCIwXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJ3aWR0aDogMTRweDsgaGVpZ2h0OiAxNHB4OyBmb250LXNpemU6IDE0cHg7IG9wYWNpdHk6IDAuODtcIj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9kaXY+Il19
|
|
247
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudC1jb250cm9sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VnbWVudC1jb250cm9sL3NlZ21lbnQtY29udHJvbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlZ21lbnQtY29udHJvbC9zZWdtZW50LWNvbnRyb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFpQnZCLE1BQU0sT0FBTyx1QkFBdUI7SUFOcEM7UUFRVyxhQUFRLEdBQW9CO1lBQ25DLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO1lBQzVDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO1NBQzdDLENBQUM7UUFPTyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLHFCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUUvQix5RkFBeUY7UUFDaEYsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUtqQixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFLbkQsbUJBQWMsR0FBMkIsRUFBRSxDQUFDO1FBQzVDLHFCQUFnQixHQUFHLEtBQUssQ0FBQztLQWlPMUI7SUExT0MsSUFBa0MsV0FBVyxLQUFLLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNGLElBQWdDLFNBQVMsS0FBSyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQVd0RixX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QUk7Z0JBQ3JCLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUNwRCxDQUFDO1lBQ0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDOztvSEEzUFUsdUJBQXVCO3dHQUF2Qix1QkFBdUIseWtCQy9CcEMscTBGQThDTTsyRkRmTyx1QkFBdUI7a0JBTm5DLFNBQVM7K0JBQ0UscUJBQXFCLFFBR3pCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTs4QkFJckIsUUFBUTtzQkFBaEIsS0FBSztnQkFTRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csU0FBUztzQkFBakIsS0FBSztnQkFFNEIsV0FBVztzQkFBNUMsV0FBVzt1QkFBQyxlQUFlO2dCQUNJLFNBQVM7c0JBQXhDLFdBQVc7dUJBQUMsYUFBYTtnQkFFaEIsV0FBVztzQkFBcEIsTUFBTTtnQkFFd0IsY0FBYztzQkFBNUMsWUFBWTt1QkFBQyxlQUFlO2dCQUNFLGdCQUFnQjtzQkFBOUMsU0FBUzt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG50eXBlIFNlZ21lbnRPcHRpb24gPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgaWNvbj86IHN0cmluZztcbiAgdG9vbHRpcD86IHN0cmluZztcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1zZWdtZW50LWNvbnRyb2wnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VnbWVudC1jb250cm9sLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9XG59KVxuZXhwb3J0IGNsYXNzIFNlZ21lbnRDb250cm9sQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIHNlZ21lbnRzOiBTZWdtZW50T3B0aW9uW10gPSBbXG4gICAgeyBsYWJlbDogJ1RhYiBHcm91cCcsIHZhbHVlOiAndGFiLWdyb3VwLTEnIH0sXG4gICAgeyBsYWJlbDogJ1RhYiBHcm91cCcsIHZhbHVlOiAndGFiLWdyb3VwLTInIH0sXG4gIF07XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc2VnbWVudCB2YWx1ZS5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBkZWZhdWx0cyB0byB0aGUgZmlyc3QgZW5hYmxlZCBzZWdtZW50LlxuICAgKi9cbiAgQElucHV0KCkgdmFsdWU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvbnRhaW5lckJnQ29sb3IgPSAnJztcblxuICAvKiogV2hlbiB0cnVlLCB0aGUgY29udHJvbCBzdHJldGNoZXMgdG8gZmlsbCBpdHMgcGFyZW50IGFuZCBidXR0b25zIHNoYXJlIGVxdWFsIHdpZHRoLiAqL1xuICBASW5wdXQoKSBmdWxsV2lkdGggPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKSBnZXQgaG9zdERpc3BsYXkoKSB7IHJldHVybiB0aGlzLmZ1bGxXaWR0aCA/ICdibG9jaycgOiBudWxsOyB9XG4gIEBIb3N0QmluZGluZygnc3R5bGUud2lkdGgnKSBnZXQgaG9zdFdpZHRoKCkgeyByZXR1cm4gdGhpcy5mdWxsV2lkdGggPyAnMTAwJScgOiBudWxsOyB9XG5cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQFZpZXdDaGlsZHJlbignc2VnbWVudEJ1dHRvbicpIHNlZ21lbnRCdXR0b25zITogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+PjtcbiAgQFZpZXdDaGlsZCgnc2VnbWVudENvbnRhaW5lcicpIHNlZ21lbnRDb250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBpbmRpY2F0b3JTdHlsZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBpbmRpY2F0b3JWaXNpYmxlID0gZmFsc2U7XG4gIHByaXZhdGUgYnV0dG9uQ2hhbmdlc1N1Yj86IFN1YnNjcmlwdGlvbjtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NlZ21lbnRzJ10gfHwgY2hhbmdlc1sndmFsdWUnXSkge1xuICAgICAgdGhpcy5lbnN1cmVTZWxlY3RlZFZhbHVlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYnV0dG9uQ2hhbmdlc1N1YiA9IHRoaXMuc2VnbWVudEJ1dHRvbnMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVJbmRpY2F0b3IoKSk7XG4gICAgdGhpcy5lbnN1cmVTZWxlY3RlZFZhbHVlKCk7XG4gICAgdGhpcy51cGRhdGVJbmRpY2F0b3IoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuYnV0dG9uQ2hhbmdlc1N1Yj8udW5zdWJzY3JpYmU/LigpO1xuICB9XG5cbiAgdHJhY2tCeVZhbHVlKF9pbmRleDogbnVtYmVyLCBvcHRpb246IFNlZ21lbnRPcHRpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBvcHRpb24udmFsdWU7XG4gIH1cblxuICBpc1NlbGVjdGVkKG9wdGlvbjogU2VnbWVudE9wdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBvcHRpb24udmFsdWUgPT09IHRoaXMudmFsdWU7XG4gIH1cblxuICBzZWxlY3Qob3B0aW9uOiBTZWdtZW50T3B0aW9uLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgb3B0aW9uLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dFZhbHVlID0gb3B0aW9uLnZhbHVlO1xuICAgIGlmIChuZXh0VmFsdWUgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBuZXh0VmFsdWU7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQobmV4dFZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvY3VzQnV0dG9uKGluZGV4KTtcbiAgICB0aGlzLnVwZGF0ZUluZGljYXRvcigpO1xuICB9XG5cbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBjdXJyZW50SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlU2VsZWN0aW9uKDEsIGN1cnJlbnRJbmRleCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVTZWxlY3Rpb24oLTEsIGN1cnJlbnRJbmRleCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2VsZWN0Rmlyc3RFbmFibGVkKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RMYXN0RW5hYmxlZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLnNlZ21lbnRzW2N1cnJlbnRJbmRleF0sIGN1cnJlbnRJbmRleCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlU2VsZWN0aW9uKHN0ZXA6IDEgfCAtMSwgc3RhcnRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZW5hYmxlZEluZGV4ZXMgPSB0aGlzLmdldEVuYWJsZWRJbmRleGVzKCk7XG4gICAgaWYgKGVuYWJsZWRJbmRleGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRFbmFibGVkSW5kZXggPSBlbmFibGVkSW5kZXhlcy5pbmRleE9mKHN0YXJ0SW5kZXgpO1xuICAgIGNvbnN0IGZhbGxiYWNrSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXgoZW5hYmxlZEluZGV4ZXMpO1xuICAgIGNvbnN0IGJhc2VJbmRleCA9IGN1cnJlbnRFbmFibGVkSW5kZXggPj0gMCA/IGN1cnJlbnRFbmFibGVkSW5kZXggOiBmYWxsYmFja0luZGV4O1xuICAgIGNvbnN0IG5leHRQb3NpdGlvbiA9IChiYXNlSW5kZXggKyBzdGVwICsgZW5hYmxlZEluZGV4ZXMubGVuZ3RoKSAlIGVuYWJsZWRJbmRleGVzLmxlbmd0aDtcbiAgICBjb25zdCB0YXJnZXRJbmRleCA9IGVuYWJsZWRJbmRleGVzW25leHRQb3NpdGlvbl07XG5cbiAgICB0aGlzLnNlbGVjdCh0aGlzLnNlZ21lbnRzW3RhcmdldEluZGV4XSwgdGFyZ2V0SW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RGaXJzdEVuYWJsZWQoKTogdm9pZCB7XG4gICAgY29uc3QgZW5hYmxlZEluZGV4ZXMgPSB0aGlzLmdldEVuYWJsZWRJbmRleGVzKCk7XG4gICAgaWYgKGVuYWJsZWRJbmRleGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gZW5hYmxlZEluZGV4ZXNbMF07XG4gICAgICB0aGlzLnNlbGVjdCh0aGlzLnNlZ21lbnRzW2luZGV4XSwgaW5kZXgpO1xuICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdExhc3RFbmFibGVkKCk6IHZvaWQge1xuICAgIGNvbnN0IGVuYWJsZWRJbmRleGVzID0gdGhpcy5nZXRFbmFibGVkSW5kZXhlcygpO1xuICAgIGlmIChlbmFibGVkSW5kZXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGVuYWJsZWRJbmRleGVzW2VuYWJsZWRJbmRleGVzLmxlbmd0aCAtIDFdO1xuICAgICAgdGhpcy5zZWxlY3QodGhpcy5zZWdtZW50c1tpbmRleF0sIGluZGV4KTtcbiAgICAgIHRoaXMudXBkYXRlSW5kaWNhdG9yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmFibGVkSW5kZXhlcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VnbWVudHNcbiAgICAgIC5tYXAoKG9wdGlvbiwgaW5kZXgpID0+ICh7IG9wdGlvbiwgaW5kZXggfSkpXG4gICAgICAuZmlsdGVyKCh7IG9wdGlvbiB9KSA9PiAhb3B0aW9uLmRpc2FibGVkKVxuICAgICAgLm1hcCgoeyBpbmRleCB9KSA9PiBpbmRleCk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGVkSW5kZXgoZW5hYmxlZEluZGV4ZXM6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zZWdtZW50cy5maW5kSW5kZXgoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSB0aGlzLnZhbHVlICYmICFvcHRpb24uZGlzYWJsZWQpO1xuICAgIGlmIChjdXJyZW50ID49IDApIHtcbiAgICAgIHJldHVybiBlbmFibGVkSW5kZXhlcy5pbmRleE9mKGN1cnJlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgYSB2YWxpZCB2YWx1ZSBpcyBzZWxlY3RlZC5cbiAgICogSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQgb3IgdGhlIHZhbHVlIGlzIGludmFsaWQsIGRlZmF1bHRzIHRvIHRoZSBmaXJzdCBlbmFibGVkIHNlZ21lbnQuXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZVNlbGVjdGVkVmFsdWUoKTogdm9pZCB7XG4gICAgY29uc3QgZW5hYmxlZCA9IHRoaXMuc2VnbWVudHMuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZGlzYWJsZWQpO1xuICAgIGlmIChlbmFibGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBubyB2YWx1ZSBpcyBzZXQsIG9yIHZhbHVlIGRvZXNuJ3QgZXhpc3QgaW4gc2VnbWVudHMsIGRlZmF1bHQgdG8gZmlyc3QgZW5hYmxlZCBzZWdtZW50XG4gICAgaWYgKCF0aGlzLnZhbHVlIHx8ICF0aGlzLnNlZ21lbnRzLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSB0aGlzLnZhbHVlKSkge1xuICAgICAgY29uc3QgZmlyc3RFbmFibGVkVmFsdWUgPSBlbmFibGVkWzBdLnZhbHVlO1xuICAgICAgLy8gT25seSBlbWl0IGlmIHZhbHVlIGFjdHVhbGx5IGNoYW5nZWRcbiAgICAgIGlmICh0aGlzLnZhbHVlICE9PSBmaXJzdEVuYWJsZWRWYWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gZmlyc3RFbmFibGVkVmFsdWU7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWdtZW50cy5maW5kSW5kZXgoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBmaXJzdEVuYWJsZWRWYWx1ZSk7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLmZvY3VzQnV0dG9uKGluZGV4KTtcbiAgICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3IoaW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzZWxlY3RlZCB2YWx1ZSBpcyBkaXNhYmxlZCwgc3dpdGNoIHRvIGZpcnN0IGVuYWJsZWQgc2VnbWVudFxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWdtZW50cy5maW5kKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PT0gdGhpcy52YWx1ZSk7XG4gICAgaWYgKHNlbGVjdGVkPy5kaXNhYmxlZCkge1xuICAgICAgY29uc3QgZmlyc3RFbmFibGVkVmFsdWUgPSBlbmFibGVkWzBdLnZhbHVlO1xuICAgICAgLy8gT25seSBlbWl0IGlmIHZhbHVlIGFjdHVhbGx5IGNoYW5nZWRcbiAgICAgIGlmICh0aGlzLnZhbHVlICE9PSBmaXJzdEVuYWJsZWRWYWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gZmlyc3RFbmFibGVkVmFsdWU7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWdtZW50cy5maW5kSW5kZXgoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBmaXJzdEVuYWJsZWRWYWx1ZSk7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLmZvY3VzQnV0dG9uKGluZGV4KTtcbiAgICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3IoaW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnVwZGF0ZUluZGljYXRvcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0J1dHRvbihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgYnV0dG9uID0gdGhpcy5zZWdtZW50QnV0dG9ucz8uZ2V0KGluZGV4KT8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGJ1dHRvbj8uZm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5kaWNhdG9yKHByZWZlcnJlZEluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zZWdtZW50Q29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3QgYnV0dG9ucyA9IHRoaXMuc2VnbWVudEJ1dHRvbnM/LnRvQXJyYXkoKSA/PyBbXTtcbiAgICAgIGlmICghY29udGFpbmVyIHx8IGJ1dHRvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmluZGljYXRvclN0eWxlID0ge307XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5kZXggPSBwcmVmZXJyZWRJbmRleCA/PyBidXR0b25zLmZpbmRJbmRleCgoYnV0dG9uLCBpZHgpID0+IHRoaXMuc2VnbWVudHNbaWR4XT8udmFsdWUgPT09IHRoaXMudmFsdWUpO1xuICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICB0aGlzLmluZGljYXRvclZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JTdHlsZSA9IHt9O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvbkVsID0gYnV0dG9uc1tpbmRleF0/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWJ1dHRvbkVsKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmluZGljYXRvclN0eWxlID0ge307XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGJ1dHRvblJlY3QgPSBidXR0b25FbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IG9mZnNldExlZnQgPSBidXR0b25FbC5vZmZzZXRMZWZ0O1xuICAgICAgY29uc3Qgb2Zmc2V0VG9wID0gYnV0dG9uRWwub2Zmc2V0VG9wO1xuICAgICAgY29uc3Qgd2lkdGggPSBidXR0b25FbC5vZmZzZXRXaWR0aDtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGJ1dHRvbkVsLm9mZnNldEhlaWdodDtcblxuICAgICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5zZWdtZW50c1tpbmRleF0/LmRpc2FibGVkO1xuICAgICAgdGhpcy5pbmRpY2F0b3JTdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6IGAke3dpZHRofXB4YCxcbiAgICAgICAgaGVpZ2h0OiBgJHtoZWlnaHR9cHhgLFxuICAgICAgICBsZWZ0OiBgJHtvZmZzZXRMZWZ0fXB4YCxcbiAgICAgICAgdG9wOiBgJHtvZmZzZXRUb3B9cHhgLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGlzRGlzYWJsZWQgPyAnIzlCQTBGNCcgOiAnIzNGNDNFRScsXG4gICAgICB9O1xuICAgICAgdGhpcy5pbmRpY2F0b3JWaXNpYmxlID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBpc0luZGljYXRvclZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaW5kaWNhdG9yVmlzaWJsZTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCIgW3N0eWxlLmRpc3BsYXldPVwiZnVsbFdpZHRoID8gJ2Jsb2NrJyA6ICdpbmxpbmUtYmxvY2snXCIgW3N0eWxlLndpZHRoXT1cImZ1bGxXaWR0aCA/ICcxMDAlJyA6IG51bGxcIj5cbiAgPGRpdlxuICAgICNzZWdtZW50Q29udGFpbmVyXG4gICAgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWZsZXgtcm93IGNxYS1pdGVtcy1zdGFydCBjcWEtcC1bMy41cHhdIGNxYS1oLVszMS41cHhdIGNxYS1iZy1zdXJmYWNlLWxpZ2h0IGNxYS1yb3VuZGVkLVs4cHhdXCJcbiAgICBbbmdDbGFzc109XCJmdWxsV2lkdGggPyAnY3FhLWZsZXgnIDogJ2NxYS1pbmxpbmUtZmxleCdcIlxuICAgIHJvbGU9XCJ0YWJsaXN0XCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkIHx8IG51bGxcIlxuICAgIFtuZ1N0eWxlXT1cImNvbnRhaW5lckJnQ29sb3IgPyB7J2JhY2tncm91bmQtY29sb3InOiBjb250YWluZXJCZ0NvbG9yfSA6IG51bGxcIlxuICA+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXJvdW5kZWQtWzhweF0gY3FhLXRyYW5zaXRpb24tYWxsIGNxYS1kdXJhdGlvbi0yMDAgY3FhLWVhc2UtaW4tb3V0IGNxYS1wb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgIFtjbGFzcy5jcWEtb3BhY2l0eS0wXT1cIiFpc0luZGljYXRvclZpc2libGVcIiBbbmdTdHlsZV09XCJpbmRpY2F0b3JTdHlsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuXG4gICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgc2VnbWVudCBvZiBzZWdtZW50czsgaW5kZXggYXMgaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlWYWx1ZVwiICNzZWdtZW50QnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgcm9sZT1cInRhYlwiXG4gICAgICBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtei0wIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlciBjcWEtcHgtWzE0cHhdIGNxYS1weS1bMy41cHhdIGNxYS1oLVsyNXB4XSBjcWEtcm91bmRlZC1bOHB4XSBjcWEtdHJhbnNpdGlvbi1hbGwgY3FhLWR1cmF0aW9uLTIwMCBjcWEtZWFzZS1pbi1vdXQgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS10ZXh0LWNlbnRlciBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6Y3FhLW91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLTAgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1vZmZzZXQtMFwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdjcWEtZmxleC0xIGNxYS1taW4tdy0wJzogZnVsbFdpZHRoLFxuICAgICAgICAnY3FhLWZsZXgtbm9uZSc6ICFmdWxsV2lkdGgsXG4gICAgICAgICdjcWEtdGV4dC13aGl0ZSBjcWEtZm9udC1tZWRpdW0nOiBpc1NlbGVjdGVkKHNlZ21lbnQpLFxuICAgICAgICAnY3FhLXRleHQtbXV0ZWQnOiAhaXNTZWxlY3RlZChzZWdtZW50KSAmJiAhKGRpc2FibGVkIHx8IHNlZ21lbnQuZGlzYWJsZWQpLFxuICAgICAgICAnY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IGRpc2FibGVkIHx8IHNlZ21lbnQuZGlzYWJsZWQsXG4gICAgICAgICdjcWEtdGV4dC1kaXNhYmxlZCc6IChkaXNhYmxlZCB8fCBzZWdtZW50LmRpc2FibGVkKSAmJiAhaXNTZWxlY3RlZChzZWdtZW50KSxcbiAgICAgICAgJ2NxYS1ob3ZlcjpjcWEtdGV4dC1ibGFjayc6ICFpc1NlbGVjdGVkKHNlZ21lbnQpICYmICFkaXNhYmxlZCAmJiAhc2VnbWVudC5kaXNhYmxlZFxuICAgICAgfVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzZWdtZW50LmRpc2FibGVkXCIgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKHNlZ21lbnQpXCJcbiAgICAgIFthdHRyLnRhYmluZGV4XT1cIiFkaXNhYmxlZCAmJiAhc2VnbWVudC5kaXNhYmxlZCA/IChpc1NlbGVjdGVkKHNlZ21lbnQpID8gMCA6IC0xKSA6IC0xXCJcbiAgICAgIChjbGljayk9XCJzZWxlY3Qoc2VnbWVudCwgaW5kZXgpXCIgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudCwgaW5kZXgpXCI+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtMSBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaC1bMThweF0gY3FhLWZvbnQtWydJbnRlciddIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzEycHhdIGNxYS10ZXh0LWNlbnRlciBjcWEtYWxpZ24tbWlkZGxlXCI+XG4gICAgICAgIFxuICAgICAgPG1hdC1pY29uICpuZ0lmPVwic2VnbWVudD8uaWNvblwiIGNsYXNzPVwiIWNxYS13LVsxMnB4XSAhY3FhLWgtWzEycHhdICFjcWEtdGV4dC1bMTJweF1cIiA+XG4gICAgICAgIHt7IHNlZ21lbnQ/Lmljb24gfX1cbiAgICAgIDwvbWF0LWljb24+XG5cbiAgICAgIHt7IHNlZ21lbnQubGFiZWwgfX1cblxuICAgICAgPHNwYW4gKm5nSWY9XCJzZWdtZW50Py50b29sdGlwXCJcbiAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IG1hcmdpbi1sZWZ0OiA0cHg7IGN1cnNvcjogaGVscDtcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJzZWdtZW50LnRvb2x0aXBcIlxuICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCIwXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJ3aWR0aDogMTRweDsgaGVpZ2h0OiAxNHB4OyBmb250LXNpemU6IDE0cHg7IG9wYWNpdHk6IDAuODtcIj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9kaXY+Il19
|
|
@@ -136,10 +136,10 @@ export class NewVersionHistoryDetailComponent {
|
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
NewVersionHistoryDetailComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewVersionHistoryDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
139
|
-
NewVersionHistoryDetailComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: NewVersionHistoryDetailComponent, selector: "cqa-new-version-history-detail", inputs: { selectedVersion: "selectedVersion", selectedIsCurrent: "selectedIsCurrent", isRestoring: "isRestoring", getAuthorLabelFn: "getAuthorLabelFn", getFieldLabelFn: "getFieldLabelFn", getStepPrefixFn: "getStepPrefixFn", getCategoryLabelFn: "getCategoryLabelFn", formatDisplayValueFn: "formatDisplayValueFn", getStepActionHtmlFn: "getStepActionHtmlFn", hiddenFields: "hiddenFields", parseFieldAsTableFn: "parseFieldAsTableFn", getValueBadgeConfigFn: "getValueBadgeConfigFn", getInlineDiffFn: "getInlineDiffFn" }, outputs: { compare: "compare", restore: "restore" }, ngImport: i0, template: "<ng-container *ngIf=\"selectedVersion; else noSelection\">\n <!-- ========== Header (same as old component) ========== -->\n <div class=\"d-flex align-items-start justify-content-between cqa-nvh-detail-header\">\n <div>\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-bottom: 6px;\">\n <h3 class=\"cqa-nvh-detail-version-number\">Version {{ selectedVersion.versionNumber }}</h3>\n <cqa-badge *ngIf=\"selectedIsCurrent\" label=\"Current\" size=\"small\" variant=\"info\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <div class=\"cqa-nvh-detail-meta\">\n {{ getAuthorLabelFn(selectedVersion) }} \u00B7 {{ selectedVersion.createdDate | date:'MMM d, yyyy \u00B7 h:mm a' }}\n </div>\n <div *ngIf=\"selectedVersion.changeSummary\" class=\"cqa-nvh-detail-summary\">\n {{ selectedVersion.changeSummary }}\n </div>\n </div>\n <div *ngIf=\"!selectedIsCurrent\" class=\"cqa-nvh-detail-actions\">\n <!-- <cqa-button variant=\"outlined\" text=\"Compare with Current\" (clicked)=\"compare.emit()\"></cqa-button> -->\n <cqa-button variant=\"filled\" icon=\"refresh\" [text]=\"isRestoring ? 'Restoring...' : 'Restore this Version'\"\n [disabled]=\"isRestoring\" (clicked)=\"restore.emit()\"></cqa-button>\n </div>\n </div>\n\n <!-- ========== Summary bar ========== -->\n <!-- <div *ngIf=\"stepsSummary\" class=\"cqa-nvh-detail-summary-bar\">\n <span *ngIf=\"stepsSummary.added\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--added\">+{{ stepsSummary.added }} added</span>\n <span *ngIf=\"stepsSummary.modified\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--modified\">{{ stepsSummary.modified }} modified</span>\n <span *ngIf=\"stepsSummary.removed\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--removed\">{{ stepsSummary.removed }} removed</span>\n <span *ngIf=\"stepsSummary.unchanged\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--unchanged\">{{ stepsSummary.unchanged }} unchanged</span>\n </div> -->\n\n <!-- ========== Test Case Changes ========== -->\n <ng-container *ngIf=\"hasTestCaseChanges\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Test Case Changes</span>\n <cqa-badge [label]=\"'' + testCaseChangedFields.length\" size=\"small\" variant=\"info\"\n backgroundColor=\"#EFF4FF\" textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let field of testCaseChangedFields; trackBy: trackByField\" class=\"cqa-nvh-change-card\">\n <div class=\"cqa-nvh-change-field-label\">{{ getFieldLabelFn(field) }}</div>\n <ng-container\n *ngTemplateOutlet=\"beforeAfterBlock; context: {\n oldValue: selectedVersion.testCase.old?.[field],\n newValue: selectedVersion.testCase.new?.[field],\n field: field,\n oldStepData: selectedVersion.testCase.old,\n newStepData: selectedVersion.testCase.new\n }\">\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Steps Added ========== -->\n <ng-container *ngIf=\"stepsAdded.length\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Steps Added</span>\n <cqa-badge [label]=\"'' + stepsAdded.length\" size=\"small\" backgroundColor=\"#ECFDF3\"\n textColor=\"#027A48\" borderColor=\"#A7F3D0\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let step of stepsAdded; trackBy: trackByStepId\" class=\"cqa-nvh-change-card cqa-nvh-change-card--added\">\n <div class=\"cqa-nvh-step-header\">\n <cqa-badge label=\"Added\" size=\"small\" backgroundColor=\"#ECFDF3\" textColor=\"#027A48\"\n borderColor=\"#A7F3D0\"></cqa-badge>\n <span class=\"cqa-nvh-step-prefix\">{{ getStepPrefixFn(step) }}</span>\n <span class=\"cqa-nvh-step-action cqa-action-format\" [innerHTML]=\"getStepActionHtmlFn(step)\"></span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Steps Deleted ========== -->\n <ng-container *ngIf=\"stepsDeleted.length\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Steps Removed</span>\n <cqa-badge [label]=\"'' + stepsDeleted.length\" size=\"small\" backgroundColor=\"#FEF3F2\"\n textColor=\"#B42318\" borderColor=\"#FECDCA\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let step of stepsDeleted; trackBy: trackByStepId\" class=\"cqa-nvh-change-card cqa-nvh-change-card--removed\">\n <div class=\"cqa-nvh-step-header\">\n <cqa-badge label=\"Removed\" size=\"small\" backgroundColor=\"#FEF3F2\" textColor=\"#B42318\"\n borderColor=\"#FECDCA\"></cqa-badge>\n <span class=\"cqa-nvh-step-prefix\">{{ getStepPrefixFn(step) }}</span>\n <span class=\"cqa-nvh-step-action cqa-action-format\" [innerHTML]=\"getStepActionHtmlFn(step)\"></span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Steps Updated ========== -->\n <ng-container *ngIf=\"stepsUpdated.length\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Steps Modified</span>\n <cqa-badge [label]=\"'' + stepsUpdated.length\" size=\"small\" backgroundColor=\"#FFFAEB\"\n textColor=\"#B54708\" borderColor=\"#FEDF89\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let step of stepsUpdated; trackBy: trackByStepId\" class=\"cqa-nvh-change-card\">\n <!-- Step header with category badge -->\n <div class=\"cqa-nvh-step-header\">\n <cqa-badge [label]=\"getCategoryLabelFn(step.category)\" size=\"small\" backgroundColor=\"#EDF1F3\"\n textColor=\"#636A71\" borderColor=\"#DBDEE1\"></cqa-badge>\n <span class=\"cqa-nvh-step-prefix\">{{ getStepPrefixFn(step) }}</span>\n <span class=\"cqa-nvh-step-action cqa-action-format\" [innerHTML]=\"getStepActionHtmlFn(step)\"></span>\n </div>\n\n <!-- Changed fields with before/after -->\n <div *ngFor=\"let field of visibleChangedFields(step); trackBy: trackByField\" class=\"cqa-nvh-field-diff\">\n <div class=\"cqa-nvh-change-field-label\">{{ getFieldLabelFn(field) }}</div>\n <ng-container\n *ngTemplateOutlet=\"beforeAfterBlock; context: {\n oldValue: step.old?.[field],\n newValue: step.new?.[field],\n field: field,\n oldStepData: step.old,\n newStepData: step.new\n }\">\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Empty state ========== -->\n <div *ngIf=\"!hasAnyChanges\" class=\"cqa-nvh-detail-empty\">\n <cqa-empty-state title=\"No changes\" description=\"No changes recorded for this version.\"></cqa-empty-state>\n </div>\n</ng-container>\n\n<ng-template #noSelection>\n <div class=\"cqa-nvh-detail-no-selection\">\n Select a version to view details.\n </div>\n</ng-template>\n\n<!-- ===== Reusable before/after block ===== -->\n<ng-template #beforeAfterBlock let-oldValue=\"oldValue\" let-newValue=\"newValue\" let-field=\"field\" let-oldStepData=\"oldStepData\" let-newStepData=\"newStepData\">\n <!-- 1. Custom table via parseFieldAsTableFn (e.g. testDataList) -->\n <ng-container *ngIf=\"parseFieldAsTableFn(field, oldValue, oldStepData) || parseFieldAsTableFn(field, newValue, newStepData); else nativeObjectCheck\">\n <ng-container\n *ngTemplateOutlet=\"objTable; context: {\n oldObj: parseFieldAsTableFn(field, oldValue, oldStepData),\n newObj: parseFieldAsTableFn(field, newValue, newStepData)\n }\">\n </ng-container>\n </ng-container>\n\n <!-- 2. Native object / JSON string -->\n <ng-template #nativeObjectCheck>\n <ng-container *ngIf=\"parseObjectValue(oldValue) || parseObjectValue(newValue); else simpleValue\">\n <ng-container\n *ngTemplateOutlet=\"objTable; context: {\n oldObj: parseObjectValue(oldValue),\n newObj: parseObjectValue(newValue)\n }\">\n </ng-container>\n </ng-container>\n </ng-template>\n\n <!-- 3. Primitive fallback -->\n <ng-template #simpleValue>\n <ng-container *ngIf=\"getInlineDiffFn(oldValue, newValue, field, oldStepData, newStepData) as diff; else plainBeforeAfter\">\n <!-- Inline diff view: no --before/--after color modifiers; diff HTML owns all token colors -->\n <div class=\"cqa-nvh-before-after\">\n <div class=\"cqa-nvh-value-row\">\n <cqa-badge label=\"Before\" size=\"small\" backgroundColor=\"#FEF2F2\" textColor=\"#FB2C36\"\n borderColor=\"#FFE2E2\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(oldValue, field, oldStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\" [innerHTML]=\"diff.oldHtml\"></span>\n </div>\n <div class=\"cqa-nvh-value-row\">\n <cqa-badge label=\"After\" size=\"small\" backgroundColor=\"#ECFDF5\" textColor=\"#009966\"\n borderColor=\"#D0FAE5\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(newValue, field, newStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\" [innerHTML]=\"diff.newHtml\"></span>\n </div>\n </div>\n </ng-container>\n\n <!-- Plain text fallback (no diff) -->\n <ng-template #plainBeforeAfter>\n <div class=\"cqa-nvh-before-after\">\n <div class=\"cqa-nvh-value-row cqa-nvh-value-row--before\">\n <cqa-badge label=\"Before\" size=\"small\" backgroundColor=\"#FEF2F2\" textColor=\"#FB2C36\"\n borderColor=\"#FFE2E2\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(oldValue, field, oldStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\">{{ formatDisplayValueFn(oldValue, field, oldStepData) }}</span>\n </div>\n <div class=\"cqa-nvh-value-row cqa-nvh-value-row--after\">\n <cqa-badge label=\"After\" size=\"small\" backgroundColor=\"#ECFDF5\" textColor=\"#009966\"\n borderColor=\"#D0FAE5\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(newValue, field, newStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\">{{ formatDisplayValueFn(newValue, field, newStepData) }}</span>\n </div>\n </div>\n </ng-template>\n </ng-template>\n</ng-template>\n\n<!-- ===== Shared object table ===== -->\n<ng-template #objTable let-oldObj=\"oldObj\" let-newObj=\"newObj\">\n <div class=\"cqa-nvh-obj-table\" *ngIf=\"objectKeys(oldObj, newObj).length > 0\">\n <div class=\"cqa-nvh-obj-header\">\n <span class=\"cqa-nvh-obj-col-label cqa-nvh-obj-col-key-header\"></span>\n <span class=\"cqa-nvh-obj-col-label cqa-nvh-obj-col-label--before\">Before</span>\n <span class=\"cqa-nvh-obj-col-label cqa-nvh-obj-col-label--after\">After</span>\n </div>\n <div\n *ngFor=\"let key of objectKeys(oldObj, newObj); trackBy: trackByKey\"\n class=\"cqa-nvh-obj-row\"\n [class.cqa-nvh-obj-row--changed]=\"formatPrimitiveValue(oldObj?.[key]) !== formatPrimitiveValue(newObj?.[key])\">\n <span class=\"cqa-nvh-obj-key\">{{ getFieldLabelFn(key) }}</span>\n <span class=\"cqa-nvh-obj-val cqa-nvh-obj-val--before\">\n {{ formatPrimitiveValue(oldObj?.[key]) }}\n </span>\n <span class=\"cqa-nvh-obj-val cqa-nvh-obj-val--after\">\n {{ formatPrimitiveValue(newObj?.[key]) }}\n </span>\n </div>\n </div>\n</ng-template>\n", components: [{ type: i1.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.EmptyStateComponent, selector: "cqa-empty-state", inputs: ["preset", "imageUrl", "title", "description", "actions"], outputs: ["actionClick"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "date": i4.DatePipe } });
|
|
139
|
+
NewVersionHistoryDetailComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: NewVersionHistoryDetailComponent, selector: "cqa-new-version-history-detail", inputs: { selectedVersion: "selectedVersion", selectedIsCurrent: "selectedIsCurrent", isRestoring: "isRestoring", getAuthorLabelFn: "getAuthorLabelFn", getFieldLabelFn: "getFieldLabelFn", getStepPrefixFn: "getStepPrefixFn", getCategoryLabelFn: "getCategoryLabelFn", formatDisplayValueFn: "formatDisplayValueFn", getStepActionHtmlFn: "getStepActionHtmlFn", hiddenFields: "hiddenFields", parseFieldAsTableFn: "parseFieldAsTableFn", getValueBadgeConfigFn: "getValueBadgeConfigFn", getInlineDiffFn: "getInlineDiffFn" }, outputs: { compare: "compare", restore: "restore" }, ngImport: i0, template: "<ng-container *ngIf=\"selectedVersion; else noSelection\">\n <!-- ========== Header (same as old component) ========== -->\n <div class=\"d-flex align-items-start justify-content-between cqa-nvh-detail-header\">\n <div>\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-bottom: 6px;\">\n <h3 class=\"cqa-nvh-detail-version-number\">Version {{ selectedVersion.versionNumber }}</h3>\n <cqa-badge *ngIf=\"selectedIsCurrent\" label=\"Current\" size=\"small\" variant=\"info\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <div class=\"cqa-nvh-detail-meta\">\n {{ getAuthorLabelFn(selectedVersion) }} \u00B7 {{ selectedVersion.createdDate | date:'MMM d, yyyy \u00B7 h:mm a' }}\n </div>\n <div *ngIf=\"selectedVersion.changeSummary\" class=\"cqa-nvh-detail-summary\">\n {{ selectedVersion.changeSummary }}\n </div>\n </div>\n <div *ngIf=\"!selectedIsCurrent\" class=\"cqa-nvh-detail-actions\">\n <!-- <cqa-button variant=\"outlined\" text=\"Compare with Current\" (clicked)=\"compare.emit()\"></cqa-button> -->\n <cqa-button variant=\"filled\" icon=\"refresh\" [text]=\"isRestoring ? 'Restoring...' : 'Restore this Version'\"\n [disabled]=\"isRestoring\" (clicked)=\"restore.emit()\"></cqa-button>\n </div>\n </div>\n\n <!-- ========== Summary bar ========== -->\n <!-- <div *ngIf=\"stepsSummary\" class=\"cqa-nvh-detail-summary-bar\">\n <span *ngIf=\"stepsSummary.added\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--added\">+{{ stepsSummary.added }} added</span>\n <span *ngIf=\"stepsSummary.modified\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--modified\">{{ stepsSummary.modified }} modified</span>\n <span *ngIf=\"stepsSummary.removed\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--removed\">{{ stepsSummary.removed }} removed</span>\n <span *ngIf=\"stepsSummary.unchanged\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--unchanged\">{{ stepsSummary.unchanged }} unchanged</span>\n </div> -->\n\n <!-- ========== Test Case Changes ========== -->\n <ng-container *ngIf=\"hasTestCaseChanges\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Test Case Changes</span>\n <cqa-badge [label]=\"'' + testCaseChangedFields.length\" size=\"small\" variant=\"info\"\n backgroundColor=\"#EFF4FF\" textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let field of testCaseChangedFields; trackBy: trackByField\" class=\"cqa-nvh-change-card\">\n <div class=\"cqa-nvh-change-field-label\">{{ getFieldLabelFn(field) }}</div>\n <ng-container\n *ngTemplateOutlet=\"beforeAfterBlock; context: {\n oldValue: selectedVersion.testCase.old?.[field],\n newValue: selectedVersion.testCase.new?.[field],\n field: field,\n oldStepData: selectedVersion.testCase.old,\n newStepData: selectedVersion.testCase.new\n }\">\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Steps Added ========== -->\n <ng-container *ngIf=\"stepsAdded.length\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Steps Added</span>\n <cqa-badge [label]=\"'' + stepsAdded.length\" size=\"small\" backgroundColor=\"#ECFDF3\"\n textColor=\"#027A48\" borderColor=\"#A7F3D0\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let step of stepsAdded; trackBy: trackByStepId\" class=\"cqa-nvh-change-card cqa-nvh-change-card--added\">\n <div class=\"cqa-nvh-step-header\">\n <cqa-badge label=\"Added\" size=\"small\" backgroundColor=\"#ECFDF3\" textColor=\"#027A48\"\n borderColor=\"#A7F3D0\"></cqa-badge>\n <span class=\"cqa-nvh-step-prefix\">{{ getStepPrefixFn(step) }}</span>\n <span class=\"cqa-nvh-step-action cqa-action-format\" [innerHTML]=\"getStepActionHtmlFn(step)\"></span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Steps Deleted ========== -->\n <ng-container *ngIf=\"stepsDeleted.length\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Steps Removed</span>\n <cqa-badge [label]=\"'' + stepsDeleted.length\" size=\"small\" backgroundColor=\"#FEF3F2\"\n textColor=\"#B42318\" borderColor=\"#FECDCA\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let step of stepsDeleted; trackBy: trackByStepId\" class=\"cqa-nvh-change-card cqa-nvh-change-card--removed\">\n <div class=\"cqa-nvh-step-header\">\n <cqa-badge label=\"Removed\" size=\"small\" backgroundColor=\"#FEF3F2\" textColor=\"#B42318\"\n borderColor=\"#FECDCA\"></cqa-badge>\n <span class=\"cqa-nvh-step-prefix\">{{ getStepPrefixFn(step) }}</span>\n <span class=\"cqa-nvh-step-action cqa-action-format\" [innerHTML]=\"getStepActionHtmlFn(step)\"></span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Steps Updated ========== -->\n <ng-container *ngIf=\"stepsUpdated.length\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Steps Modified</span>\n <cqa-badge [label]=\"'' + stepsUpdated.length\" size=\"small\" backgroundColor=\"#FFFAEB\"\n textColor=\"#B54708\" borderColor=\"#FEDF89\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let step of stepsUpdated; trackBy: trackByStepId\" class=\"cqa-nvh-change-card\">\n <!-- Step header with category badge -->\n <div class=\"cqa-nvh-step-header\">\n <cqa-badge [label]=\"getCategoryLabelFn(step.category)\" size=\"small\" backgroundColor=\"#EDF1F3\"\n textColor=\"#636A71\" borderColor=\"#DBDEE1\"></cqa-badge>\n <span class=\"cqa-nvh-step-prefix\">{{ getStepPrefixFn(step) }}</span>\n <span class=\"cqa-nvh-step-action cqa-action-format\" [innerHTML]=\"getStepActionHtmlFn(step)\"></span>\n </div>\n\n <!-- Changed fields with before/after -->\n <ng-container *ngIf=\"visibleChangedFields(step).length; else internalOnlyChanges\">\n <div *ngFor=\"let field of visibleChangedFields(step); trackBy: trackByField\" class=\"cqa-nvh-field-diff\">\n <div class=\"cqa-nvh-change-field-label\">{{ getFieldLabelFn(field) }}</div>\n <ng-container\n *ngTemplateOutlet=\"beforeAfterBlock; context: {\n oldValue: step.old?.[field],\n newValue: step.new?.[field],\n field: field,\n oldStepData: step.old,\n newStepData: step.new\n }\">\n </ng-container>\n </div>\n </ng-container>\n <ng-template #internalOnlyChanges>\n <div class=\"cqa-nvh-internal-change-msg\">\n Some internal properties of this step were changed.\n </div>\n </ng-template>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Empty state ========== -->\n <div *ngIf=\"!hasAnyChanges\" class=\"cqa-nvh-detail-empty\">\n <cqa-empty-state title=\"No changes\" description=\"No changes recorded for this version.\"></cqa-empty-state>\n </div>\n</ng-container>\n\n<ng-template #noSelection>\n <div class=\"cqa-nvh-detail-no-selection\">\n Select a version to view details.\n </div>\n</ng-template>\n\n<!-- ===== Reusable before/after block ===== -->\n<ng-template #beforeAfterBlock let-oldValue=\"oldValue\" let-newValue=\"newValue\" let-field=\"field\" let-oldStepData=\"oldStepData\" let-newStepData=\"newStepData\">\n <!-- 1. Custom table via parseFieldAsTableFn (e.g. testDataList) -->\n <ng-container *ngIf=\"parseFieldAsTableFn(field, oldValue, oldStepData) || parseFieldAsTableFn(field, newValue, newStepData); else nativeObjectCheck\">\n <ng-container\n *ngTemplateOutlet=\"objTable; context: {\n oldObj: parseFieldAsTableFn(field, oldValue, oldStepData),\n newObj: parseFieldAsTableFn(field, newValue, newStepData)\n }\">\n </ng-container>\n </ng-container>\n\n <!-- 2. Native object / JSON string -->\n <ng-template #nativeObjectCheck>\n <ng-container *ngIf=\"parseObjectValue(oldValue) || parseObjectValue(newValue); else simpleValue\">\n <ng-container\n *ngTemplateOutlet=\"objTable; context: {\n oldObj: parseObjectValue(oldValue),\n newObj: parseObjectValue(newValue)\n }\">\n </ng-container>\n </ng-container>\n </ng-template>\n\n <!-- 3. Primitive fallback -->\n <ng-template #simpleValue>\n <ng-container *ngIf=\"getInlineDiffFn(oldValue, newValue, field, oldStepData, newStepData) as diff; else plainBeforeAfter\">\n <!-- Inline diff view: no --before/--after color modifiers; diff HTML owns all token colors -->\n <div class=\"cqa-nvh-before-after\">\n <div class=\"cqa-nvh-value-row\">\n <cqa-badge label=\"Before\" size=\"small\" backgroundColor=\"#FEF2F2\" textColor=\"#FB2C36\"\n borderColor=\"#FFE2E2\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(oldValue, field, oldStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\" [innerHTML]=\"diff.oldHtml\"></span>\n </div>\n <div class=\"cqa-nvh-value-row\">\n <cqa-badge label=\"After\" size=\"small\" backgroundColor=\"#ECFDF5\" textColor=\"#009966\"\n borderColor=\"#D0FAE5\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(newValue, field, newStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\" [innerHTML]=\"diff.newHtml\"></span>\n </div>\n </div>\n </ng-container>\n\n <!-- Plain text fallback (no diff) -->\n <ng-template #plainBeforeAfter>\n <div class=\"cqa-nvh-before-after\">\n <div class=\"cqa-nvh-value-row cqa-nvh-value-row--before\">\n <cqa-badge label=\"Before\" size=\"small\" backgroundColor=\"#FEF2F2\" textColor=\"#FB2C36\"\n borderColor=\"#FFE2E2\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(oldValue, field, oldStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\">{{ formatDisplayValueFn(oldValue, field, oldStepData) }}</span>\n </div>\n <div class=\"cqa-nvh-value-row cqa-nvh-value-row--after\">\n <cqa-badge label=\"After\" size=\"small\" backgroundColor=\"#ECFDF5\" textColor=\"#009966\"\n borderColor=\"#D0FAE5\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(newValue, field, newStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\">{{ formatDisplayValueFn(newValue, field, newStepData) }}</span>\n </div>\n </div>\n </ng-template>\n </ng-template>\n</ng-template>\n\n<!-- ===== Shared object table ===== -->\n<ng-template #objTable let-oldObj=\"oldObj\" let-newObj=\"newObj\">\n <div class=\"cqa-nvh-obj-table\" *ngIf=\"objectKeys(oldObj, newObj).length > 0\">\n <div class=\"cqa-nvh-obj-header\">\n <span class=\"cqa-nvh-obj-col-label cqa-nvh-obj-col-key-header\"></span>\n <span class=\"cqa-nvh-obj-col-label cqa-nvh-obj-col-label--before\">Before</span>\n <span class=\"cqa-nvh-obj-col-label cqa-nvh-obj-col-label--after\">After</span>\n </div>\n <div\n *ngFor=\"let key of objectKeys(oldObj, newObj); trackBy: trackByKey\"\n class=\"cqa-nvh-obj-row\"\n [class.cqa-nvh-obj-row--changed]=\"formatPrimitiveValue(oldObj?.[key]) !== formatPrimitiveValue(newObj?.[key])\">\n <span class=\"cqa-nvh-obj-key\">{{ getFieldLabelFn(key) }}</span>\n <span class=\"cqa-nvh-obj-val cqa-nvh-obj-val--before\">\n {{ formatPrimitiveValue(oldObj?.[key]) }}\n </span>\n <span class=\"cqa-nvh-obj-val cqa-nvh-obj-val--after\">\n {{ formatPrimitiveValue(newObj?.[key]) }}\n </span>\n </div>\n </div>\n</ng-template>\n", components: [{ type: i1.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.EmptyStateComponent, selector: "cqa-empty-state", inputs: ["preset", "imageUrl", "title", "description", "actions"], outputs: ["actionClick"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "date": i4.DatePipe } });
|
|
140
140
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NewVersionHistoryDetailComponent, decorators: [{
|
|
141
141
|
type: Component,
|
|
142
|
-
args: [{ selector: 'cqa-new-version-history-detail', template: "<ng-container *ngIf=\"selectedVersion; else noSelection\">\n <!-- ========== Header (same as old component) ========== -->\n <div class=\"d-flex align-items-start justify-content-between cqa-nvh-detail-header\">\n <div>\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-bottom: 6px;\">\n <h3 class=\"cqa-nvh-detail-version-number\">Version {{ selectedVersion.versionNumber }}</h3>\n <cqa-badge *ngIf=\"selectedIsCurrent\" label=\"Current\" size=\"small\" variant=\"info\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <div class=\"cqa-nvh-detail-meta\">\n {{ getAuthorLabelFn(selectedVersion) }} \u00B7 {{ selectedVersion.createdDate | date:'MMM d, yyyy \u00B7 h:mm a' }}\n </div>\n <div *ngIf=\"selectedVersion.changeSummary\" class=\"cqa-nvh-detail-summary\">\n {{ selectedVersion.changeSummary }}\n </div>\n </div>\n <div *ngIf=\"!selectedIsCurrent\" class=\"cqa-nvh-detail-actions\">\n <!-- <cqa-button variant=\"outlined\" text=\"Compare with Current\" (clicked)=\"compare.emit()\"></cqa-button> -->\n <cqa-button variant=\"filled\" icon=\"refresh\" [text]=\"isRestoring ? 'Restoring...' : 'Restore this Version'\"\n [disabled]=\"isRestoring\" (clicked)=\"restore.emit()\"></cqa-button>\n </div>\n </div>\n\n <!-- ========== Summary bar ========== -->\n <!-- <div *ngIf=\"stepsSummary\" class=\"cqa-nvh-detail-summary-bar\">\n <span *ngIf=\"stepsSummary.added\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--added\">+{{ stepsSummary.added }} added</span>\n <span *ngIf=\"stepsSummary.modified\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--modified\">{{ stepsSummary.modified }} modified</span>\n <span *ngIf=\"stepsSummary.removed\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--removed\">{{ stepsSummary.removed }} removed</span>\n <span *ngIf=\"stepsSummary.unchanged\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--unchanged\">{{ stepsSummary.unchanged }} unchanged</span>\n </div> -->\n\n <!-- ========== Test Case Changes ========== -->\n <ng-container *ngIf=\"hasTestCaseChanges\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Test Case Changes</span>\n <cqa-badge [label]=\"'' + testCaseChangedFields.length\" size=\"small\" variant=\"info\"\n backgroundColor=\"#EFF4FF\" textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let field of testCaseChangedFields; trackBy: trackByField\" class=\"cqa-nvh-change-card\">\n <div class=\"cqa-nvh-change-field-label\">{{ getFieldLabelFn(field) }}</div>\n <ng-container\n *ngTemplateOutlet=\"beforeAfterBlock; context: {\n oldValue: selectedVersion.testCase.old?.[field],\n newValue: selectedVersion.testCase.new?.[field],\n field: field,\n oldStepData: selectedVersion.testCase.old,\n newStepData: selectedVersion.testCase.new\n }\">\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Steps Added ========== -->\n <ng-container *ngIf=\"stepsAdded.length\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Steps Added</span>\n <cqa-badge [label]=\"'' + stepsAdded.length\" size=\"small\" backgroundColor=\"#ECFDF3\"\n textColor=\"#027A48\" borderColor=\"#A7F3D0\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let step of stepsAdded; trackBy: trackByStepId\" class=\"cqa-nvh-change-card cqa-nvh-change-card--added\">\n <div class=\"cqa-nvh-step-header\">\n <cqa-badge label=\"Added\" size=\"small\" backgroundColor=\"#ECFDF3\" textColor=\"#027A48\"\n borderColor=\"#A7F3D0\"></cqa-badge>\n <span class=\"cqa-nvh-step-prefix\">{{ getStepPrefixFn(step) }}</span>\n <span class=\"cqa-nvh-step-action cqa-action-format\" [innerHTML]=\"getStepActionHtmlFn(step)\"></span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Steps Deleted ========== -->\n <ng-container *ngIf=\"stepsDeleted.length\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Steps Removed</span>\n <cqa-badge [label]=\"'' + stepsDeleted.length\" size=\"small\" backgroundColor=\"#FEF3F2\"\n textColor=\"#B42318\" borderColor=\"#FECDCA\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let step of stepsDeleted; trackBy: trackByStepId\" class=\"cqa-nvh-change-card cqa-nvh-change-card--removed\">\n <div class=\"cqa-nvh-step-header\">\n <cqa-badge label=\"Removed\" size=\"small\" backgroundColor=\"#FEF3F2\" textColor=\"#B42318\"\n borderColor=\"#FECDCA\"></cqa-badge>\n <span class=\"cqa-nvh-step-prefix\">{{ getStepPrefixFn(step) }}</span>\n <span class=\"cqa-nvh-step-action cqa-action-format\" [innerHTML]=\"getStepActionHtmlFn(step)\"></span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Steps Updated ========== -->\n <ng-container *ngIf=\"stepsUpdated.length\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Steps Modified</span>\n <cqa-badge [label]=\"'' + stepsUpdated.length\" size=\"small\" backgroundColor=\"#FFFAEB\"\n textColor=\"#B54708\" borderColor=\"#FEDF89\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let step of stepsUpdated; trackBy: trackByStepId\" class=\"cqa-nvh-change-card\">\n <!-- Step header with category badge -->\n <div class=\"cqa-nvh-step-header\">\n <cqa-badge [label]=\"getCategoryLabelFn(step.category)\" size=\"small\" backgroundColor=\"#EDF1F3\"\n textColor=\"#636A71\" borderColor=\"#DBDEE1\"></cqa-badge>\n <span class=\"cqa-nvh-step-prefix\">{{ getStepPrefixFn(step) }}</span>\n <span class=\"cqa-nvh-step-action cqa-action-format\" [innerHTML]=\"getStepActionHtmlFn(step)\"></span>\n </div>\n\n <!-- Changed fields with before/after -->\n <div *ngFor=\"let field of visibleChangedFields(step); trackBy: trackByField\" class=\"cqa-nvh-field-diff\">\n <div class=\"cqa-nvh-change-field-label\">{{ getFieldLabelFn(field) }}</div>\n <ng-container\n *ngTemplateOutlet=\"beforeAfterBlock; context: {\n oldValue: step.old?.[field],\n newValue: step.new?.[field],\n field: field,\n oldStepData: step.old,\n newStepData: step.new\n }\">\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Empty state ========== -->\n <div *ngIf=\"!hasAnyChanges\" class=\"cqa-nvh-detail-empty\">\n <cqa-empty-state title=\"No changes\" description=\"No changes recorded for this version.\"></cqa-empty-state>\n </div>\n</ng-container>\n\n<ng-template #noSelection>\n <div class=\"cqa-nvh-detail-no-selection\">\n Select a version to view details.\n </div>\n</ng-template>\n\n<!-- ===== Reusable before/after block ===== -->\n<ng-template #beforeAfterBlock let-oldValue=\"oldValue\" let-newValue=\"newValue\" let-field=\"field\" let-oldStepData=\"oldStepData\" let-newStepData=\"newStepData\">\n <!-- 1. Custom table via parseFieldAsTableFn (e.g. testDataList) -->\n <ng-container *ngIf=\"parseFieldAsTableFn(field, oldValue, oldStepData) || parseFieldAsTableFn(field, newValue, newStepData); else nativeObjectCheck\">\n <ng-container\n *ngTemplateOutlet=\"objTable; context: {\n oldObj: parseFieldAsTableFn(field, oldValue, oldStepData),\n newObj: parseFieldAsTableFn(field, newValue, newStepData)\n }\">\n </ng-container>\n </ng-container>\n\n <!-- 2. Native object / JSON string -->\n <ng-template #nativeObjectCheck>\n <ng-container *ngIf=\"parseObjectValue(oldValue) || parseObjectValue(newValue); else simpleValue\">\n <ng-container\n *ngTemplateOutlet=\"objTable; context: {\n oldObj: parseObjectValue(oldValue),\n newObj: parseObjectValue(newValue)\n }\">\n </ng-container>\n </ng-container>\n </ng-template>\n\n <!-- 3. Primitive fallback -->\n <ng-template #simpleValue>\n <ng-container *ngIf=\"getInlineDiffFn(oldValue, newValue, field, oldStepData, newStepData) as diff; else plainBeforeAfter\">\n <!-- Inline diff view: no --before/--after color modifiers; diff HTML owns all token colors -->\n <div class=\"cqa-nvh-before-after\">\n <div class=\"cqa-nvh-value-row\">\n <cqa-badge label=\"Before\" size=\"small\" backgroundColor=\"#FEF2F2\" textColor=\"#FB2C36\"\n borderColor=\"#FFE2E2\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(oldValue, field, oldStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\" [innerHTML]=\"diff.oldHtml\"></span>\n </div>\n <div class=\"cqa-nvh-value-row\">\n <cqa-badge label=\"After\" size=\"small\" backgroundColor=\"#ECFDF5\" textColor=\"#009966\"\n borderColor=\"#D0FAE5\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(newValue, field, newStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\" [innerHTML]=\"diff.newHtml\"></span>\n </div>\n </div>\n </ng-container>\n\n <!-- Plain text fallback (no diff) -->\n <ng-template #plainBeforeAfter>\n <div class=\"cqa-nvh-before-after\">\n <div class=\"cqa-nvh-value-row cqa-nvh-value-row--before\">\n <cqa-badge label=\"Before\" size=\"small\" backgroundColor=\"#FEF2F2\" textColor=\"#FB2C36\"\n borderColor=\"#FFE2E2\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(oldValue, field, oldStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\">{{ formatDisplayValueFn(oldValue, field, oldStepData) }}</span>\n </div>\n <div class=\"cqa-nvh-value-row cqa-nvh-value-row--after\">\n <cqa-badge label=\"After\" size=\"small\" backgroundColor=\"#ECFDF5\" textColor=\"#009966\"\n borderColor=\"#D0FAE5\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(newValue, field, newStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\">{{ formatDisplayValueFn(newValue, field, newStepData) }}</span>\n </div>\n </div>\n </ng-template>\n </ng-template>\n</ng-template>\n\n<!-- ===== Shared object table ===== -->\n<ng-template #objTable let-oldObj=\"oldObj\" let-newObj=\"newObj\">\n <div class=\"cqa-nvh-obj-table\" *ngIf=\"objectKeys(oldObj, newObj).length > 0\">\n <div class=\"cqa-nvh-obj-header\">\n <span class=\"cqa-nvh-obj-col-label cqa-nvh-obj-col-key-header\"></span>\n <span class=\"cqa-nvh-obj-col-label cqa-nvh-obj-col-label--before\">Before</span>\n <span class=\"cqa-nvh-obj-col-label cqa-nvh-obj-col-label--after\">After</span>\n </div>\n <div\n *ngFor=\"let key of objectKeys(oldObj, newObj); trackBy: trackByKey\"\n class=\"cqa-nvh-obj-row\"\n [class.cqa-nvh-obj-row--changed]=\"formatPrimitiveValue(oldObj?.[key]) !== formatPrimitiveValue(newObj?.[key])\">\n <span class=\"cqa-nvh-obj-key\">{{ getFieldLabelFn(key) }}</span>\n <span class=\"cqa-nvh-obj-val cqa-nvh-obj-val--before\">\n {{ formatPrimitiveValue(oldObj?.[key]) }}\n </span>\n <span class=\"cqa-nvh-obj-val cqa-nvh-obj-val--after\">\n {{ formatPrimitiveValue(newObj?.[key]) }}\n </span>\n </div>\n </div>\n</ng-template>\n", styles: [] }]
|
|
142
|
+
args: [{ selector: 'cqa-new-version-history-detail', template: "<ng-container *ngIf=\"selectedVersion; else noSelection\">\n <!-- ========== Header (same as old component) ========== -->\n <div class=\"d-flex align-items-start justify-content-between cqa-nvh-detail-header\">\n <div>\n <div class=\"d-flex align-items-center\" style=\"gap: 8px; margin-bottom: 6px;\">\n <h3 class=\"cqa-nvh-detail-version-number\">Version {{ selectedVersion.versionNumber }}</h3>\n <cqa-badge *ngIf=\"selectedIsCurrent\" label=\"Current\" size=\"small\" variant=\"info\" backgroundColor=\"#EFF4FF\"\n textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n <div class=\"cqa-nvh-detail-meta\">\n {{ getAuthorLabelFn(selectedVersion) }} \u00B7 {{ selectedVersion.createdDate | date:'MMM d, yyyy \u00B7 h:mm a' }}\n </div>\n <div *ngIf=\"selectedVersion.changeSummary\" class=\"cqa-nvh-detail-summary\">\n {{ selectedVersion.changeSummary }}\n </div>\n </div>\n <div *ngIf=\"!selectedIsCurrent\" class=\"cqa-nvh-detail-actions\">\n <!-- <cqa-button variant=\"outlined\" text=\"Compare with Current\" (clicked)=\"compare.emit()\"></cqa-button> -->\n <cqa-button variant=\"filled\" icon=\"refresh\" [text]=\"isRestoring ? 'Restoring...' : 'Restore this Version'\"\n [disabled]=\"isRestoring\" (clicked)=\"restore.emit()\"></cqa-button>\n </div>\n </div>\n\n <!-- ========== Summary bar ========== -->\n <!-- <div *ngIf=\"stepsSummary\" class=\"cqa-nvh-detail-summary-bar\">\n <span *ngIf=\"stepsSummary.added\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--added\">+{{ stepsSummary.added }} added</span>\n <span *ngIf=\"stepsSummary.modified\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--modified\">{{ stepsSummary.modified }} modified</span>\n <span *ngIf=\"stepsSummary.removed\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--removed\">{{ stepsSummary.removed }} removed</span>\n <span *ngIf=\"stepsSummary.unchanged\" class=\"cqa-nvh-summary-chip cqa-nvh-summary-chip--unchanged\">{{ stepsSummary.unchanged }} unchanged</span>\n </div> -->\n\n <!-- ========== Test Case Changes ========== -->\n <ng-container *ngIf=\"hasTestCaseChanges\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Test Case Changes</span>\n <cqa-badge [label]=\"'' + testCaseChangedFields.length\" size=\"small\" variant=\"info\"\n backgroundColor=\"#EFF4FF\" textColor=\"#3f43ee\" borderColor=\"#C7D7FE\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let field of testCaseChangedFields; trackBy: trackByField\" class=\"cqa-nvh-change-card\">\n <div class=\"cqa-nvh-change-field-label\">{{ getFieldLabelFn(field) }}</div>\n <ng-container\n *ngTemplateOutlet=\"beforeAfterBlock; context: {\n oldValue: selectedVersion.testCase.old?.[field],\n newValue: selectedVersion.testCase.new?.[field],\n field: field,\n oldStepData: selectedVersion.testCase.old,\n newStepData: selectedVersion.testCase.new\n }\">\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Steps Added ========== -->\n <ng-container *ngIf=\"stepsAdded.length\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Steps Added</span>\n <cqa-badge [label]=\"'' + stepsAdded.length\" size=\"small\" backgroundColor=\"#ECFDF3\"\n textColor=\"#027A48\" borderColor=\"#A7F3D0\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let step of stepsAdded; trackBy: trackByStepId\" class=\"cqa-nvh-change-card cqa-nvh-change-card--added\">\n <div class=\"cqa-nvh-step-header\">\n <cqa-badge label=\"Added\" size=\"small\" backgroundColor=\"#ECFDF3\" textColor=\"#027A48\"\n borderColor=\"#A7F3D0\"></cqa-badge>\n <span class=\"cqa-nvh-step-prefix\">{{ getStepPrefixFn(step) }}</span>\n <span class=\"cqa-nvh-step-action cqa-action-format\" [innerHTML]=\"getStepActionHtmlFn(step)\"></span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Steps Deleted ========== -->\n <ng-container *ngIf=\"stepsDeleted.length\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Steps Removed</span>\n <cqa-badge [label]=\"'' + stepsDeleted.length\" size=\"small\" backgroundColor=\"#FEF3F2\"\n textColor=\"#B42318\" borderColor=\"#FECDCA\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let step of stepsDeleted; trackBy: trackByStepId\" class=\"cqa-nvh-change-card cqa-nvh-change-card--removed\">\n <div class=\"cqa-nvh-step-header\">\n <cqa-badge label=\"Removed\" size=\"small\" backgroundColor=\"#FEF3F2\" textColor=\"#B42318\"\n borderColor=\"#FECDCA\"></cqa-badge>\n <span class=\"cqa-nvh-step-prefix\">{{ getStepPrefixFn(step) }}</span>\n <span class=\"cqa-nvh-step-action cqa-action-format\" [innerHTML]=\"getStepActionHtmlFn(step)\"></span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Steps Updated ========== -->\n <ng-container *ngIf=\"stepsUpdated.length\">\n <div class=\"cqa-nvh-section-header\">\n <span class=\"cqa-nvh-section-label\">Steps Modified</span>\n <cqa-badge [label]=\"'' + stepsUpdated.length\" size=\"small\" backgroundColor=\"#FFFAEB\"\n textColor=\"#B54708\" borderColor=\"#FEDF89\"></cqa-badge>\n </div>\n\n <div class=\"cqa-nvh-changes-list\">\n <div *ngFor=\"let step of stepsUpdated; trackBy: trackByStepId\" class=\"cqa-nvh-change-card\">\n <!-- Step header with category badge -->\n <div class=\"cqa-nvh-step-header\">\n <cqa-badge [label]=\"getCategoryLabelFn(step.category)\" size=\"small\" backgroundColor=\"#EDF1F3\"\n textColor=\"#636A71\" borderColor=\"#DBDEE1\"></cqa-badge>\n <span class=\"cqa-nvh-step-prefix\">{{ getStepPrefixFn(step) }}</span>\n <span class=\"cqa-nvh-step-action cqa-action-format\" [innerHTML]=\"getStepActionHtmlFn(step)\"></span>\n </div>\n\n <!-- Changed fields with before/after -->\n <ng-container *ngIf=\"visibleChangedFields(step).length; else internalOnlyChanges\">\n <div *ngFor=\"let field of visibleChangedFields(step); trackBy: trackByField\" class=\"cqa-nvh-field-diff\">\n <div class=\"cqa-nvh-change-field-label\">{{ getFieldLabelFn(field) }}</div>\n <ng-container\n *ngTemplateOutlet=\"beforeAfterBlock; context: {\n oldValue: step.old?.[field],\n newValue: step.new?.[field],\n field: field,\n oldStepData: step.old,\n newStepData: step.new\n }\">\n </ng-container>\n </div>\n </ng-container>\n <ng-template #internalOnlyChanges>\n <div class=\"cqa-nvh-internal-change-msg\">\n Some internal properties of this step were changed.\n </div>\n </ng-template>\n </div>\n </div>\n </ng-container>\n\n <!-- ========== Empty state ========== -->\n <div *ngIf=\"!hasAnyChanges\" class=\"cqa-nvh-detail-empty\">\n <cqa-empty-state title=\"No changes\" description=\"No changes recorded for this version.\"></cqa-empty-state>\n </div>\n</ng-container>\n\n<ng-template #noSelection>\n <div class=\"cqa-nvh-detail-no-selection\">\n Select a version to view details.\n </div>\n</ng-template>\n\n<!-- ===== Reusable before/after block ===== -->\n<ng-template #beforeAfterBlock let-oldValue=\"oldValue\" let-newValue=\"newValue\" let-field=\"field\" let-oldStepData=\"oldStepData\" let-newStepData=\"newStepData\">\n <!-- 1. Custom table via parseFieldAsTableFn (e.g. testDataList) -->\n <ng-container *ngIf=\"parseFieldAsTableFn(field, oldValue, oldStepData) || parseFieldAsTableFn(field, newValue, newStepData); else nativeObjectCheck\">\n <ng-container\n *ngTemplateOutlet=\"objTable; context: {\n oldObj: parseFieldAsTableFn(field, oldValue, oldStepData),\n newObj: parseFieldAsTableFn(field, newValue, newStepData)\n }\">\n </ng-container>\n </ng-container>\n\n <!-- 2. Native object / JSON string -->\n <ng-template #nativeObjectCheck>\n <ng-container *ngIf=\"parseObjectValue(oldValue) || parseObjectValue(newValue); else simpleValue\">\n <ng-container\n *ngTemplateOutlet=\"objTable; context: {\n oldObj: parseObjectValue(oldValue),\n newObj: parseObjectValue(newValue)\n }\">\n </ng-container>\n </ng-container>\n </ng-template>\n\n <!-- 3. Primitive fallback -->\n <ng-template #simpleValue>\n <ng-container *ngIf=\"getInlineDiffFn(oldValue, newValue, field, oldStepData, newStepData) as diff; else plainBeforeAfter\">\n <!-- Inline diff view: no --before/--after color modifiers; diff HTML owns all token colors -->\n <div class=\"cqa-nvh-before-after\">\n <div class=\"cqa-nvh-value-row\">\n <cqa-badge label=\"Before\" size=\"small\" backgroundColor=\"#FEF2F2\" textColor=\"#FB2C36\"\n borderColor=\"#FFE2E2\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(oldValue, field, oldStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\" [innerHTML]=\"diff.oldHtml\"></span>\n </div>\n <div class=\"cqa-nvh-value-row\">\n <cqa-badge label=\"After\" size=\"small\" backgroundColor=\"#ECFDF5\" textColor=\"#009966\"\n borderColor=\"#D0FAE5\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(newValue, field, newStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\" [innerHTML]=\"diff.newHtml\"></span>\n </div>\n </div>\n </ng-container>\n\n <!-- Plain text fallback (no diff) -->\n <ng-template #plainBeforeAfter>\n <div class=\"cqa-nvh-before-after\">\n <div class=\"cqa-nvh-value-row cqa-nvh-value-row--before\">\n <cqa-badge label=\"Before\" size=\"small\" backgroundColor=\"#FEF2F2\" textColor=\"#FB2C36\"\n borderColor=\"#FFE2E2\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(oldValue, field, oldStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\">{{ formatDisplayValueFn(oldValue, field, oldStepData) }}</span>\n </div>\n <div class=\"cqa-nvh-value-row cqa-nvh-value-row--after\">\n <cqa-badge label=\"After\" size=\"small\" backgroundColor=\"#ECFDF5\" textColor=\"#009966\"\n borderColor=\"#D0FAE5\"></cqa-badge>\n <ng-container *ngIf=\"getValueBadgeConfigFn(newValue, field, newStepData) as badge\">\n <cqa-badge [label]=\"badge.label\" size=\"small\"\n [backgroundColor]=\"badge.backgroundColor\" [textColor]=\"badge.textColor\"\n [borderColor]=\"badge.borderColor\"></cqa-badge>\n </ng-container>\n <span class=\"cqa-nvh-value-text\">{{ formatDisplayValueFn(newValue, field, newStepData) }}</span>\n </div>\n </div>\n </ng-template>\n </ng-template>\n</ng-template>\n\n<!-- ===== Shared object table ===== -->\n<ng-template #objTable let-oldObj=\"oldObj\" let-newObj=\"newObj\">\n <div class=\"cqa-nvh-obj-table\" *ngIf=\"objectKeys(oldObj, newObj).length > 0\">\n <div class=\"cqa-nvh-obj-header\">\n <span class=\"cqa-nvh-obj-col-label cqa-nvh-obj-col-key-header\"></span>\n <span class=\"cqa-nvh-obj-col-label cqa-nvh-obj-col-label--before\">Before</span>\n <span class=\"cqa-nvh-obj-col-label cqa-nvh-obj-col-label--after\">After</span>\n </div>\n <div\n *ngFor=\"let key of objectKeys(oldObj, newObj); trackBy: trackByKey\"\n class=\"cqa-nvh-obj-row\"\n [class.cqa-nvh-obj-row--changed]=\"formatPrimitiveValue(oldObj?.[key]) !== formatPrimitiveValue(newObj?.[key])\">\n <span class=\"cqa-nvh-obj-key\">{{ getFieldLabelFn(key) }}</span>\n <span class=\"cqa-nvh-obj-val cqa-nvh-obj-val--before\">\n {{ formatPrimitiveValue(oldObj?.[key]) }}\n </span>\n <span class=\"cqa-nvh-obj-val cqa-nvh-obj-val--after\">\n {{ formatPrimitiveValue(newObj?.[key]) }}\n </span>\n </div>\n </div>\n</ng-template>\n", styles: [] }]
|
|
143
143
|
}], propDecorators: { selectedVersion: [{
|
|
144
144
|
type: Input
|
|
145
145
|
}], selectedIsCurrent: [{
|
|
@@ -171,4 +171,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
171
171
|
}], restore: [{
|
|
172
172
|
type: Output
|
|
173
173
|
}] } });
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXZlcnNpb24taGlzdG9yeS1kZXRhaWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi92ZXJzaW9uLWhpc3RvcnkvbmV3LXZlcnNpb24taGlzdG9yeS1kZXRhaWwvbmV3LXZlcnNpb24taGlzdG9yeS1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi92ZXJzaW9uLWhpc3RvcnkvbmV3LXZlcnNpb24taGlzdG9yeS1kZXRhaWwvbmV3LXZlcnNpb24taGlzdG9yeS1kZXRhaWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBT3ZFLE1BQU0sT0FBTyxnQ0FBZ0M7SUFMN0M7UUFNbUIsc0JBQWlCLEdBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUdqRCxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFcEIscUJBQWdCLEdBQTZCLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN0RCxvQkFBZSxHQUE4QixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQzlELG9CQUFlLEdBQTBCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUN0RCx1QkFBa0IsR0FBaUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUMxRix5QkFBb0IsR0FBMkQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xILHdCQUFtQixHQUEwQixHQUFH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TUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1uZXctdmVyc2lvbi1oaXN0b3J5LWRldGFpbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZXctdmVyc2lvbi1oaXN0b3J5LWRldGFpbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgTmV3VmVyc2lvbkhpc3RvcnlEZXRhaWxDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHByaW9yaXRpemVkRmllbGRzOiBzdHJpbmdbXSA9IFsnYWN0aW9uJ107XG5cbiAgQElucHV0KCkgc2VsZWN0ZWRWZXJzaW9uOiBhbnk7XG4gIEBJbnB1dCgpIHNlbGVjdGVkSXNDdXJyZW50ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzUmVzdG9yaW5nID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZ2V0QXV0aG9yTGFiZWxGbjogKHZlcnNpb246IGFueSkgPT4gc3RyaW5nID0gKCkgPT4gJyc7XG4gIEBJbnB1dCgpIGdldEZpZWxkTGFiZWxGbjogKGZpZWxkOiBzdHJpbmcpID0+IHN0cmluZyA9IChmaWVsZCkgPT4gZmllbGQ7XG4gIEBJbnB1dCgpIGdldFN0ZXBQcmVmaXhGbjogKHN0ZXA6IGFueSkgPT4gc3RyaW5nID0gKCkgPT4gJ1N0ZXAnO1xuICBASW5wdXQoKSBnZXRDYXRlZ29yeUxhYmVsRm46IChjYXRlZ29yeTogc3RyaW5nKSA9PiBzdHJpbmcgPSAoY2F0KSA9PiAoY2F0IHx8ICdPdGhlcicpICsgJyBDaGFuZ2VzJztcbiAgQElucHV0KCkgZm9ybWF0RGlzcGxheVZhbHVlRm46ICh2YWx1ZTogYW55LCBmaWVsZD86IHN0cmluZywgc3RlcERhdGE/OiBhbnkpID0+IHN0cmluZyA9ICh2KSA9PiB2ID09IG51bGwgPyAnLScgOiBTdHJpbmcodik7XG4gIEBJbnB1dCgpIGdldFN0ZXBBY3Rpb25IdG1sRm46IChzdGVwOiBhbnkpID0+IHN0cmluZyA9ICgpID0+ICcnO1xuICBASW5wdXQoKSBoaWRkZW5GaWVsZHM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIHBhcnNlRmllbGRBc1RhYmxlRm46IChmaWVsZDogc3RyaW5nLCB2YWx1ZTogYW55LCBzdGVwRGF0YT86IGFueSkgPT4gUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSAoKSA9PiBudWxsO1xuICAvKiogUmV0dXJuIGEgYmFkZ2UgY29uZmlnIHRvIHJlbmRlciBiZWZvcmUgdGhlIHZhbHVlIHRleHQsIG9yIG51bGwgZm9yIG5vIGJhZGdlLiAqL1xuICBASW5wdXQoKSBnZXRWYWx1ZUJhZGdlQ29uZmlnRm46ICh2YWx1ZTogYW55LCBmaWVsZDogc3RyaW5nLCBzdGVwRGF0YT86IGFueSkgPT4geyBsYWJlbDogc3RyaW5nOyBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZzsgdGV4dENvbG9yOiBzdHJpbmc7IGJvcmRlckNvbG9yOiBzdHJpbmcgfSB8IG51bGwgPSAoKSA9PiBudWxsO1xuICAvKiogUmV0dXJuIHsgb2xkSHRtbCwgbmV3SHRtbCB9IHdpdGggaW5saW5lIGRpZmYgbWFya3VwLCBvciBudWxsIHRvIHVzZSBwbGFpbiB0ZXh0IHJlbmRlcmluZy4gKi9cbiAgQElucHV0KCkgZ2V0SW5saW5lRGlmZkZuOiAob2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSwgZmllbGQ6IHN0cmluZywgb2xkU3RlcERhdGE/OiBhbnksIG5ld1N0ZXBEYXRhPzogYW55KSA9PiB7IG9sZEh0bWw6IHN0cmluZzsgbmV3SHRtbDogc3RyaW5nIH0gfCBudWxsID0gKCkgPT4gbnVsbDtcblxuICBAT3V0cHV0KCkgY29tcGFyZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlc3RvcmUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZ2V0IGhhc1Rlc3RDYXNlQ2hhbmdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFZlcnNpb24/LnRlc3RDYXNlPy5oYXNDaGFuZ2VzID09PSB0cnVlO1xuICB9XG5cbiAgZ2V0IHRlc3RDYXNlQ2hhbmdlZEZpZWxkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUZpZWxkcyh0aGlzLnNlbGVjdGVkVmVyc2lvbj8udGVzdENhc2U/LmNoYW5nZWRGaWVsZHMgfHwgW10pO1xuICB9XG5cbiAgdmlzaWJsZUZpZWxkcyhmaWVsZHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLmhpZGRlbkZpZWxkcz8ubGVuZ3RoXG4gICAgICA/IGZpZWxkcy5maWx0ZXIoZiA9PiAhdGhpcy5oaWRkZW5GaWVsZHMuaW5jbHVkZXMoZikpXG4gICAgICA6IFsuLi5maWVsZHNdO1xuICAgIHJldHVybiB0aGlzLnByaW9yaXRpemVGaWVsZHModmlzaWJsZSk7XG4gIH1cblxuICB2aXNpYmxlQ2hhbmdlZEZpZWxkcyhzdGVwOiBhbnkpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUZpZWxkcyhzdGVwPy5jaGFuZ2VkRmllbGRzIHx8IFtdKTtcbiAgfVxuXG4gIGdldCBzdGVwc0FkZGVkKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFZlcnNpb24/LnN0ZXBzPy5hZGRlZCB8fCBbXTtcbiAgfVxuXG4gIGdldCBzdGVwc0RlbGV0ZWQoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVmVyc2lvbj8uc3RlcHM/LmRlbGV0ZWQgfHwgW107XG4gIH1cblxuICBnZXQgc3RlcHNVcGRhdGVkKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFZlcnNpb24/LnN0ZXBzPy51cGRhdGVkIHx8IFtdO1xuICB9XG5cbiAgZ2V0IHN0ZXBzU3VtbWFyeSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVmVyc2lvbj8uc3RlcHM/LnN1bW1hcnk7XG4gIH1cblxuICBnZXQgaGFzQW55Q2hhbmdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNUZXN0Q2FzZUNoYW5nZXNcbiAgICAgIHx8IHRoaXMuc3RlcHNBZGRlZC5sZW5ndGggPiAwXG4gICAgICB8fCB0aGlzLnN0ZXBzRGVsZXRlZC5sZW5ndGggPiAwXG4gICAgICB8fCB0aGlzLnN0ZXBzVXBkYXRlZC5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIHBhcnNlIHRoZSB2YWx1ZSBhcyBhIHBsYWluIG9iamVjdCAob3IgYSBKU09OIHN0cmluZyB0aGF0IGlzIGFuIG9iamVjdCkuXG4gICAqIFJldHVybnMgdGhlIHBhcnNlZCBvYmplY3QsIG9yIG51bGwgaWYgdGhlIHZhbHVlIGlzIG5vdCBhbiBvYmplY3QvSlNPTi1vYmplY3QuXG4gICAqL1xuICBwYXJzZU9iamVjdFZhbHVlKHZhbHVlOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsgcmV0dXJuIHZhbHVlOyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gICAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRyaW1tZWQpO1xuICAgICAgICAgIGlmIChwYXJzZWQgJiYgdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBub3QgdmFsaWQgSlNPTiAqLyB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIFJldHVybnMgb25seSB0aGUga2V5cyB3aGVyZSBvbGQgYW5kIG5ldyB2YWx1ZXMgZGlmZmVyLiAqL1xuICBvYmplY3RLZXlzKG9sZE9iajogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwsIG5ld09iajogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYWxsS2V5cyA9IG5ldyBTZXQoW1xuICAgICAgLi4uT2JqZWN0LmtleXMob2xkT2JqIHx8IHt9KSxcbiAgICAgIC4uLk9iamVjdC5rZXlzKG5ld09iaiB8fCB7fSlcbiAgICBdKTtcbiAgICBjb25zdCBjaGFuZ2VkID0gQXJyYXkuZnJvbShhbGxLZXlzKS5maWx0ZXIoa2V5ID0+XG4gICAgICBKU09OLnN0cmluZ2lmeSgob2xkT2JqIHx8IHt9KVtrZXldKSAhPT0gSlNPTi5zdHJpbmdpZnkoKG5ld09iaiB8fCB7fSlba2V5XSlcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnByaW9yaXRpemVGaWVsZHMoY2hhbmdlZCk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSB2YWx1ZSBmb3IgYSBrZXkgZGlmZmVycyBiZXR3ZWVuIG9sZCBhbmQgbmV3LiAqL1xuICBpc0tleUNoYW5nZWQob2xkT2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCwgbmV3T2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoKG9sZE9iaiB8fCB7fSlba2V5XSkgIT09IEpTT04uc3RyaW5naWZ5KChuZXdPYmogfHwge30pW2tleV0pO1xuICB9XG5cbiAgZm9ybWF0UHJpbWl0aXZlVmFsdWUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHsgcmV0dXJuICctJzsgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgeyByZXR1cm4gdmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnOyB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7IHJldHVybiAnLSc7IH1cbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0sIGkpID0+XG4gICAgICAgIGAke2kgKyAxfS4gJHt0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShpdGVtKSA6IFN0cmluZyhpdGVtKX1gXG4gICAgICApLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgeyByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpOyB9XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICB0cmFja0J5S2V5KF9pbmRleDogbnVtYmVyLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHRyYWNrQnlGaWVsZChfaW5kZXg6IG51bWJlciwgZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkO1xuICB9XG5cbiAgdHJhY2tCeVN0ZXBJZChfaW5kZXg6IG51bWJlciwgc3RlcDogYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gc3RlcC5zdGVwSWQgPz8gc3RlcC5vbGQ/LmlkID8/IHN0ZXAubmV3Py5pZCA/PyBfaW5kZXg7XG4gIH1cblxuICBwcml2YXRlIHByaW9yaXRpemVGaWVsZHMoZmllbGRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIWZpZWxkcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmllbGRzO1xuICAgIH1cblxuICAgIGNvbnN0IHByaW9yaXRpemVkID0gdGhpcy5wcmlvcml0aXplZEZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGRzLmluY2x1ZGVzKGZpZWxkKSk7XG4gICAgaWYgKCFwcmlvcml0aXplZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfVxuXG4gICAgY29uc3QgcHJpb3JpdGl6ZWRTZXQgPSBuZXcgU2V0KHByaW9yaXRpemVkKTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBmaWVsZHMuZmlsdGVyKGZpZWxkID0+ICFwcmlvcml0aXplZFNldC5oYXMoZmllbGQpKTtcbiAgICByZXR1cm4gWy4uLnByaW9yaXRpemVkLCAuLi5yZW1haW5pbmddO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRWZXJzaW9uOyBlbHNlIG5vU2VsZWN0aW9uXCI+XG4gIDwhLS0gPT09PT09PT09PSBIZWFkZXIgKHNhbWUgYXMgb2xkIGNvbXBvbmVudCkgPT09PT09PT09PSAtLT5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBjcWEtbnZoLWRldGFpbC1oZWFkZXJcIj5cbiAgICA8ZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cImdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+XG4gICAgICAgIDxoMyBjbGFzcz1cImNxYS1udmgtZGV0YWlsLXZlcnNpb24tbnVtYmVyXCI+VmVyc2lvbiB7eyBzZWxlY3RlZFZlcnNpb24udmVyc2lvbk51bWJlciB9fTwvaDM+XG4gICAgICAgIDxjcWEtYmFkZ2UgKm5nSWY9XCJzZWxlY3RlZElzQ3VycmVudFwiIGxhYmVsPVwiQ3VycmVudFwiIHNpemU9XCJzbWFsbFwiIHZhcmlhbnQ9XCJpbmZvXCIgYmFja2dyb3VuZENvbG9yPVwiI0VGRjRGRlwiXG4gICAgICAgICAgdGV4dENvbG9yPVwiIzNmNDNlZVwiIGJvcmRlckNvbG9yPVwiI0M3RDdGRVwiPjwvY3FhLWJhZGdlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLW52aC1kZXRhaWwtbWV0YVwiPlxuICAgICAgICB7eyBnZXRBdXRob3JMYWJlbEZuKHNlbGVjdGVkVmVyc2lvbikgfX0gwrcge3sgc2VsZWN0ZWRWZXJzaW9uLmNyZWF0ZWREYXRlIHwgZGF0ZTonTU1NIGQsIHl5eXkgwrcgaDptbSBhJyB9fVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRWZXJzaW9uLmNoYW5nZVN1bW1hcnlcIiBjbGFzcz1cImNxYS1udmgtZGV0YWlsLXN1bW1hcnlcIj5cbiAgICAgICAge3sgc2VsZWN0ZWRWZXJzaW9uLmNoYW5nZVN1bW1hcnkgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhc2VsZWN0ZWRJc0N1cnJlbnRcIiBjbGFzcz1cImNxYS1udmgtZGV0YWlsLWFjdGlvbnNcIj5cbiAgICAgIDwhLS0gPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgdGV4dD1cIkNvbXBhcmUgd2l0aCBDdXJyZW50XCIgKGNsaWNrZWQpPVwiY29tcGFyZS5lbWl0KClcIj48L2NxYS1idXR0b24+IC0tPlxuICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGljb249XCJyZWZyZXNoXCIgW3RleHRdPVwiaXNSZXN0b3JpbmcgPyAnUmVzdG9yaW5nLi4uJyA6ICdSZXN0b3JlIHRoaXMgVmVyc2lvbidcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZXN0b3JpbmdcIiAoY2xpY2tlZCk9XCJyZXN0b3JlLmVtaXQoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSA9PT09PT09PT09IFN1bW1hcnkgYmFyID09PT09PT09PT0gLS0+XG4gIDwhLS0gPGRpdiAqbmdJZj1cInN0ZXBzU3VtbWFyeVwiIGNsYXNzPVwiY3FhLW52aC1kZXRhaWwtc3VtbWFyeS1iYXJcIj5cbiAgICA8c3BhbiAqbmdJZj1cInN0ZXBzU3VtbWFyeS5hZGRlZFwiIGNsYXNzPVwiY3FhLW52aC1zdW1tYXJ5LWNoaXAgY3FhLW52aC1zdW1tYXJ5LWNoaXAtLWFkZGVkXCI+K3t7IHN0ZXBzU3VtbWFyeS5hZGRlZCB9fSBhZGRlZDwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cInN0ZXBzU3VtbWFyeS5tb2RpZmllZFwiIGNsYXNzPVwiY3FhLW52aC1zdW1tYXJ5LWNoaXAgY3FhLW52aC1zdW1tYXJ5LWNoaXAtLW1vZGlmaWVkXCI+e3sgc3RlcHNTdW1tYXJ5Lm1vZGlmaWVkIH19IG1vZGlmaWVkPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwic3RlcHNTdW1tYXJ5LnJlbW92ZWRcIiBjbGFzcz1cImNxYS1udmgtc3VtbWFyeS1jaGlwIGNxYS1udmgtc3VtbWFyeS1jaGlwLS1yZW1vdmVkXCI+e3sgc3RlcHNTdW1tYXJ5LnJlbW92ZWQgfX0gcmVtb3ZlZDwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cInN0ZXBzU3VtbWFyeS51bmNoYW5nZWRcIiBjbGFzcz1cImNxYS1udmgtc3VtbWFyeS1jaGlwIGNxYS1udmgtc3VtbWFyeS1jaGlwLS11bmNoYW5nZWRcIj57eyBzdGVwc1N1bW1hcnkudW5jaGFuZ2VkIH19IHVuY2hhbmdlZDwvc3Bhbj5cbiAgPC9kaXY+IC0tPlxuXG4gIDwhLS0gPT09PT09PT09PSBUZXN0IENhc2UgQ2hhbmdlcyA9PT09PT09PT09IC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzVGVzdENhc2VDaGFuZ2VzXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1udmgtc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW52aC1zZWN0aW9uLWxhYmVsXCI+VGVzdCBDYXNlIENoYW5nZXM8L3NwYW4+XG4gICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCInJyArIHRlc3RDYXNlQ2hhbmdlZEZpZWxkcy5sZW5ndGhcIiBzaXplPVwic21hbGxcIiB2YXJpYW50PVwiaW5mb1wiXG4gICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNFRkY0RkZcIiB0ZXh0Q29sb3I9XCIjM2Y0M2VlXCIgYm9yZGVyQ29sb3I9XCIjQzdEN0ZFXCI+PC9jcWEtYmFkZ2U+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW52aC1jaGFuZ2VzLWxpc3RcIj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHRlc3RDYXNlQ2hhbmdlZEZpZWxkczsgdHJhY2tCeTogdHJhY2tCeUZpZWxkXCIgY2xhc3M9XCJjcWEtbnZoLWNoYW5nZS1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLWNoYW5nZS1maWVsZC1sYWJlbFwiPnt7IGdldEZpZWxkTGFiZWxGbihmaWVsZCkgfX08L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmVmb3JlQWZ0ZXJCbG9jazsgY29udGV4dDoge1xuICAgICAgICAgICAgb2xkVmFsdWU6IHNlbGVjdGVkVmVyc2lvbi50ZXN0Q2FzZS5vbGQ/LltmaWVsZF0sXG4gICAgICAgICAgICBuZXdWYWx1ZTogc2VsZWN0ZWRWZXJzaW9uLnRlc3RDYXNlLm5ldz8uW2ZpZWxkXSxcbiAgICAgICAgICAgIGZpZWxkOiBmaWVsZCxcbiAgICAgICAgICAgIG9sZFN0ZXBEYXRhOiBzZWxlY3RlZFZlcnNpb24udGVzdENhc2Uub2xkLFxuICAgICAgICAgICAgbmV3U3RlcERhdGE6IHNlbGVjdGVkVmVyc2lvbi50ZXN0Q2FzZS5uZXdcbiAgICAgICAgICB9XCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gPT09PT09PT09PSBTdGVwcyBBZGRlZCA9PT09PT09PT09IC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RlcHNBZGRlZC5sZW5ndGhcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW52aC1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbnZoLXNlY3Rpb24tbGFiZWxcIj5TdGVwcyBBZGRlZDwvc3Bhbj5cbiAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cIicnICsgc3RlcHNBZGRlZC5sZW5ndGhcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRUNGREYzXCJcbiAgICAgICAgdGV4dENvbG9yPVwiIzAyN0E0OFwiIGJvcmRlckNvbG9yPVwiI0E3RjNEMFwiPjwvY3FhLWJhZGdlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1udmgtY2hhbmdlcy1saXN0XCI+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBzQWRkZWQ7IHRyYWNrQnk6IHRyYWNrQnlTdGVwSWRcIiBjbGFzcz1cImNxYS1udmgtY2hhbmdlLWNhcmQgY3FhLW52aC1jaGFuZ2UtY2FyZC0tYWRkZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1udmgtc3RlcC1oZWFkZXJcIj5cbiAgICAgICAgICA8Y3FhLWJhZGdlIGxhYmVsPVwiQWRkZWRcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRUNGREYzXCIgdGV4dENvbG9yPVwiIzAyN0E0OFwiXG4gICAgICAgICAgICBib3JkZXJDb2xvcj1cIiNBN0YzRDBcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtc3RlcC1wcmVmaXhcIj57eyBnZXRTdGVwUHJlZml4Rm4oc3RlcCkgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbnZoLXN0ZXAtYWN0aW9uIGNxYS1hY3Rpb24tZm9ybWF0XCIgW2lubmVySFRNTF09XCJnZXRTdGVwQWN0aW9uSHRtbEZuKHN0ZXApXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tID09PT09PT09PT0gU3RlcHMgRGVsZXRlZCA9PT09PT09PT09IC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RlcHNEZWxldGVkLmxlbmd0aFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtc2VjdGlvbi1sYWJlbFwiPlN0ZXBzIFJlbW92ZWQ8L3NwYW4+XG4gICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCInJyArIHN0ZXBzRGVsZXRlZC5sZW5ndGhcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRkVGM0YyXCJcbiAgICAgICAgdGV4dENvbG9yPVwiI0I0MjMxOFwiIGJvcmRlckNvbG9yPVwiI0ZFQ0RDQVwiPjwvY3FhLWJhZGdlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1udmgtY2hhbmdlcy1saXN0XCI+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBzRGVsZXRlZDsgdHJhY2tCeTogdHJhY2tCeVN0ZXBJZFwiIGNsYXNzPVwiY3FhLW52aC1jaGFuZ2UtY2FyZCBjcWEtbnZoLWNoYW5nZS1jYXJkLS1yZW1vdmVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLXN0ZXAtaGVhZGVyXCI+XG4gICAgICAgICAgPGNxYS1iYWRnZSBsYWJlbD1cIlJlbW92ZWRcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRkVGM0YyXCIgdGV4dENvbG9yPVwiI0I0MjMxOFwiXG4gICAgICAgICAgICBib3JkZXJDb2xvcj1cIiNGRUNEQ0FcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtc3RlcC1wcmVmaXhcIj57eyBnZXRTdGVwUHJlZml4Rm4oc3RlcCkgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbnZoLXN0ZXAtYWN0aW9uIGNxYS1hY3Rpb24tZm9ybWF0XCIgW2lubmVySFRNTF09XCJnZXRTdGVwQWN0aW9uSHRtbEZuKHN0ZXApXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tID09PT09PT09PT0gU3RlcHMgVXBkYXRlZCA9PT09PT09PT09IC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RlcHNVcGRhdGVkLmxlbmd0aFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtc2VjdGlvbi1sYWJlbFwiPlN0ZXBzIE1vZGlmaWVkPC9zcGFuPlxuICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiJycgKyBzdGVwc1VwZGF0ZWQubGVuZ3RoXCIgc2l6ZT1cInNtYWxsXCIgYmFja2dyb3VuZENvbG9yPVwiI0ZGRkFFQlwiXG4gICAgICAgIHRleHRDb2xvcj1cIiNCNTQ3MDhcIiBib3JkZXJDb2xvcj1cIiNGRURGODlcIj48L2NxYS1iYWRnZT5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLWNoYW5nZXMtbGlzdFwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwc1VwZGF0ZWQ7IHRyYWNrQnk6IHRyYWNrQnlTdGVwSWRcIiBjbGFzcz1cImNxYS1udmgtY2hhbmdlLWNhcmRcIj5cbiAgICAgICAgPCEtLSBTdGVwIGhlYWRlciB3aXRoIGNhdGVnb3J5IGJhZGdlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW52aC1zdGVwLWhlYWRlclwiPlxuICAgICAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cImdldENhdGVnb3J5TGFiZWxGbihzdGVwLmNhdGVnb3J5KVwiIHNpemU9XCJzbWFsbFwiIGJhY2tncm91bmRDb2xvcj1cIiNFREYxRjNcIlxuICAgICAgICAgICAgdGV4dENvbG9yPVwiIzYzNkE3MVwiIGJvcmRlckNvbG9yPVwiI0RCREVFMVwiPjwvY3FhLWJhZGdlPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW52aC1zdGVwLXByZWZpeFwiPnt7IGdldFN0ZXBQcmVmaXhGbihzdGVwKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtc3RlcC1hY3Rpb24gY3FhLWFjdGlvbi1mb3JtYXRcIiBbaW5uZXJIVE1MXT1cImdldFN0ZXBBY3Rpb25IdG1sRm4oc3RlcClcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQ2hhbmdlZCBmaWVsZHMgd2l0aCBiZWZvcmUvYWZ0ZXIgLS0+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHZpc2libGVDaGFuZ2VkRmllbGRzKHN0ZXApOyB0cmFja0J5OiB0cmFja0J5RmllbGRcIiBjbGFzcz1cImNxYS1udmgtZmllbGQtZGlmZlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLWNoYW5nZS1maWVsZC1sYWJlbFwiPnt7IGdldEZpZWxkTGFiZWxGbihmaWVsZCkgfX08L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImJlZm9yZUFmdGVyQmxvY2s7IGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgb2xkVmFsdWU6IHN0ZXAub2xkPy5bZmllbGRdLFxuICAgICAgICAgICAgICBuZXdWYWx1ZTogc3RlcC5uZXc/LltmaWVsZF0sXG4gICAgICAgICAgICAgIGZpZWxkOiBmaWVsZCxcbiAgICAgICAgICAgICAgb2xkU3RlcERhdGE6IHN0ZXAub2xkLFxuICAgICAgICAgICAgICBuZXdTdGVwRGF0YTogc3RlcC5uZXdcbiAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSA9PT09PT09PT09IEVtcHR5IHN0YXRlID09PT09PT09PT0gLS0+XG4gIDxkaXYgKm5nSWY9XCIhaGFzQW55Q2hhbmdlc1wiIGNsYXNzPVwiY3FhLW52aC1kZXRhaWwtZW1wdHlcIj5cbiAgICA8Y3FhLWVtcHR5LXN0YXRlIHRpdGxlPVwiTm8gY2hhbmdlc1wiIGRlc2NyaXB0aW9uPVwiTm8gY2hhbmdlcyByZWNvcmRlZCBmb3IgdGhpcyB2ZXJzaW9uLlwiPjwvY3FhLWVtcHR5LXN0YXRlPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI25vU2VsZWN0aW9uPlxuICA8ZGl2IGNsYXNzPVwiY3FhLW52aC1kZXRhaWwtbm8tc2VsZWN0aW9uXCI+XG4gICAgU2VsZWN0IGEgdmVyc2lvbiB0byB2aWV3IGRldGFpbHMuXG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSA9PT09PSBSZXVzYWJsZSBiZWZvcmUvYWZ0ZXIgYmxvY2sgPT09PT0gLS0+XG48bmctdGVtcGxhdGUgI2JlZm9yZUFmdGVyQmxvY2sgbGV0LW9sZFZhbHVlPVwib2xkVmFsdWVcIiBsZXQtbmV3VmFsdWU9XCJuZXdWYWx1ZVwiIGxldC1maWVsZD1cImZpZWxkXCIgbGV0LW9sZFN0ZXBEYXRhPVwib2xkU3RlcERhdGFcIiBsZXQtbmV3U3RlcERhdGE9XCJuZXdTdGVwRGF0YVwiPlxuICA8IS0tIDEuIEN1c3RvbSB0YWJsZSB2aWEgcGFyc2VGaWVsZEFzVGFibGVGbiAoZS5nLiB0ZXN0RGF0YUxpc3QpIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFyc2VGaWVsZEFzVGFibGVGbihmaWVsZCwgb2xkVmFsdWUsIG9sZFN0ZXBEYXRhKSB8fCBwYXJzZUZpZWxkQXNUYWJsZUZuKGZpZWxkLCBuZXdWYWx1ZSwgbmV3U3RlcERhdGEpOyBlbHNlIG5hdGl2ZU9iamVjdENoZWNrXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJvYmpUYWJsZTsgY29udGV4dDoge1xuICAgICAgICBvbGRPYmo6IHBhcnNlRmllbGRBc1RhYmxlRm4oZmllbGQsIG9sZFZhbHVlLCBvbGRTdGVwRGF0YSksXG4gICAgICAgIG5ld09iajogcGFyc2VGaWVsZEFzVGFibGVGbihmaWVsZCwgbmV3VmFsdWUsIG5ld1N0ZXBEYXRhKVxuICAgICAgfVwiPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIDIuIE5hdGl2ZSBvYmplY3QgLyBKU09OIHN0cmluZyAtLT5cbiAgPG5nLXRlbXBsYXRlICNuYXRpdmVPYmplY3RDaGVjaz5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFyc2VPYmplY3RWYWx1ZShvbGRWYWx1ZSkgfHwgcGFyc2VPYmplY3RWYWx1ZShuZXdWYWx1ZSk7IGVsc2Ugc2ltcGxlVmFsdWVcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJvYmpUYWJsZTsgY29udGV4dDoge1xuICAgICAgICAgIG9sZE9iajogcGFyc2VPYmplY3RWYWx1ZShvbGRWYWx1ZSksXG4gICAgICAgICAgbmV3T2JqOiBwYXJzZU9iamVjdFZhbHVlKG5ld1ZhbHVlKVxuICAgICAgICB9XCI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8IS0tIDMuIFByaW1pdGl2ZSBmYWxsYmFjayAtLT5cbiAgPG5nLXRlbXBsYXRlICNzaW1wbGVWYWx1ZT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0SW5saW5lRGlmZkZuKG9sZFZhbHVlLCBuZXdWYWx1ZSwgZmllbGQsIG9sZFN0ZXBEYXRhLCBuZXdTdGVwRGF0YSkgYXMgZGlmZjsgZWxzZSBwbGFpbkJlZm9yZUFmdGVyXCI+XG4gICAgICA8IS0tIElubGluZSBkaWZmIHZpZXc6IG5vIC0tYmVmb3JlLy0tYWZ0ZXIgY29sb3IgbW9kaWZpZXJzOyBkaWZmIEhUTUwgb3ducyBhbGwgdG9rZW4gY29sb3JzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1udmgtYmVmb3JlLWFmdGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLXZhbHVlLXJvd1wiPlxuICAgICAgICAgIDxjcWEtYmFkZ2UgbGFiZWw9XCJCZWZvcmVcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRkVGMkYyXCIgdGV4dENvbG9yPVwiI0ZCMkMzNlwiXG4gICAgICAgICAgICBib3JkZXJDb2xvcj1cIiNGRkUyRTJcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0VmFsdWVCYWRnZUNvbmZpZ0ZuKG9sZFZhbHVlLCBmaWVsZCwgb2xkU3RlcERhdGEpIGFzIGJhZGdlXCI+XG4gICAgICAgICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCJiYWRnZS5sYWJlbFwiIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiYmFkZ2UuYmFja2dyb3VuZENvbG9yXCIgW3RleHRDb2xvcl09XCJiYWRnZS50ZXh0Q29sb3JcIlxuICAgICAgICAgICAgICBbYm9yZGVyQ29sb3JdPVwiYmFkZ2UuYm9yZGVyQ29sb3JcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtdmFsdWUtdGV4dFwiIFtpbm5lckhUTUxdPVwiZGlmZi5vbGRIdG1sXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1udmgtdmFsdWUtcm93XCI+XG4gICAgICAgICAgPGNxYS1iYWRnZSBsYWJlbD1cIkFmdGVyXCIgc2l6ZT1cInNtYWxsXCIgYmFja2dyb3VuZENvbG9yPVwiI0VDRkRGNVwiIHRleHRDb2xvcj1cIiMwMDk5NjZcIlxuICAgICAgICAgICAgYm9yZGVyQ29sb3I9XCIjRDBGQUU1XCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFZhbHVlQmFkZ2VDb25maWdGbihuZXdWYWx1ZSwgZmllbGQsIG5ld1N0ZXBEYXRhKSBhcyBiYWRnZVwiPlxuICAgICAgICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiYmFkZ2UubGFiZWxcIiBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cImJhZGdlLmJhY2tncm91bmRDb2xvclwiIFt0ZXh0Q29sb3JdPVwiYmFkZ2UudGV4dENvbG9yXCJcbiAgICAgICAgICAgICAgW2JvcmRlckNvbG9yXT1cImJhZGdlLmJvcmRlckNvbG9yXCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbnZoLXZhbHVlLXRleHRcIiBbaW5uZXJIVE1MXT1cImRpZmYubmV3SHRtbFwiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gUGxhaW4gdGV4dCBmYWxsYmFjayAobm8gZGlmZikgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNwbGFpbkJlZm9yZUFmdGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1udmgtYmVmb3JlLWFmdGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLXZhbHVlLXJvdyBjcWEtbnZoLXZhbHVlLXJvdy0tYmVmb3JlXCI+XG4gICAgICAgICAgPGNxYS1iYWRnZSBsYWJlbD1cIkJlZm9yZVwiIHNpemU9XCJzbWFsbFwiIGJhY2tncm91bmRDb2xvcj1cIiNGRUYyRjJcIiB0ZXh0Q29sb3I9XCIjRkIyQzM2XCJcbiAgICAgICAgICAgIGJvcmRlckNvbG9yPVwiI0ZGRTJFMlwiPjwvY3FhLWJhZGdlPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRWYWx1ZUJhZGdlQ29uZmlnRm4ob2xkVmFsdWUsIGZpZWxkLCBvbGRTdGVwRGF0YSkgYXMgYmFkZ2VcIj5cbiAgICAgICAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cImJhZGdlLmxhYmVsXCIgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCJiYWRnZS5iYWNrZ3JvdW5kQ29sb3JcIiBbdGV4dENvbG9yXT1cImJhZGdlLnRleHRDb2xvclwiXG4gICAgICAgICAgICAgIFtib3JkZXJDb2xvcl09XCJiYWRnZS5ib3JkZXJDb2xvclwiPjwvY3FhLWJhZGdlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW52aC12YWx1ZS10ZXh0XCI+e3sgZm9ybWF0RGlzcGxheVZhbHVlRm4ob2xkVmFsdWUsIGZpZWxkLCBvbGRTdGVwRGF0YSkgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW52aC12YWx1ZS1yb3cgY3FhLW52aC12YWx1ZS1yb3ctLWFmdGVyXCI+XG4gICAgICAgICAgPGNxYS1iYWRnZSBsYWJlbD1cIkFmdGVyXCIgc2l6ZT1cInNtYWxsXCIgYmFja2dyb3VuZENvbG9yPVwiI0VDRkRGNVwiIHRleHRDb2xvcj1cIiMwMDk5NjZcIlxuICAgICAgICAgICAgYm9yZGVyQ29sb3I9XCIjRDBGQUU1XCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFZhbHVlQmFkZ2VDb25maWdGbihuZXdWYWx1ZSwgZmllbGQsIG5ld1N0ZXBEYXRhKSBhcyBiYWRnZVwiPlxuICAgICAgICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiYmFkZ2UubGFiZWxcIiBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cImJhZGdlLmJhY2tncm91bmRDb2xvclwiIFt0ZXh0Q29sb3JdPVwiYmFkZ2UudGV4dENvbG9yXCJcbiAgICAgICAgICAgICAgW2JvcmRlckNvbG9yXT1cImJhZGdlLmJvcmRlckNvbG9yXCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbnZoLXZhbHVlLXRleHRcIj57eyBmb3JtYXREaXNwbGF5VmFsdWVGbihuZXdWYWx1ZSwgZmllbGQsIG5ld1N0ZXBEYXRhKSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSA9PT09PSBTaGFyZWQgb2JqZWN0IHRhYmxlID09PT09IC0tPlxuPG5nLXRlbXBsYXRlICNvYmpUYWJsZSBsZXQtb2xkT2JqPVwib2xkT2JqXCIgbGV0LW5ld09iaj1cIm5ld09ialwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLW52aC1vYmotdGFibGVcIiAqbmdJZj1cIm9iamVjdEtleXMob2xkT2JqLCBuZXdPYmopLmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW52aC1vYmotaGVhZGVyXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtb2JqLWNvbC1sYWJlbCBjcWEtbnZoLW9iai1jb2wta2V5LWhlYWRlclwiPjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW52aC1vYmotY29sLWxhYmVsIGNxYS1udmgtb2JqLWNvbC1sYWJlbC0tYmVmb3JlXCI+QmVmb3JlPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbnZoLW9iai1jb2wtbGFiZWwgY3FhLW52aC1vYmotY29sLWxhYmVsLS1hZnRlclwiPkFmdGVyPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgICpuZ0Zvcj1cImxldCBrZXkgb2Ygb2JqZWN0S2V5cyhvbGRPYmosIG5ld09iaik7IHRyYWNrQnk6IHRyYWNrQnlLZXlcIlxuICAgICAgY2xhc3M9XCJjcWEtbnZoLW9iai1yb3dcIlxuICAgICAgW2NsYXNzLmNxYS1udmgtb2JqLXJvdy0tY2hhbmdlZF09XCJmb3JtYXRQcmltaXRpdmVWYWx1ZShvbGRPYmo/LltrZXldKSAhPT0gZm9ybWF0UHJpbWl0aXZlVmFsdWUobmV3T2JqPy5ba2V5XSlcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW52aC1vYmota2V5XCI+e3sgZ2V0RmllbGRMYWJlbEZuKGtleSkgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtb2JqLXZhbCBjcWEtbnZoLW9iai12YWwtLWJlZm9yZVwiPlxuICAgICAgICB7eyBmb3JtYXRQcmltaXRpdmVWYWx1ZShvbGRPYmo/LltrZXldKSB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbnZoLW9iai12YWwgY3FhLW52aC1vYmotdmFsLS1hZnRlclwiPlxuICAgICAgICB7eyBmb3JtYXRQcmltaXRpdmVWYWx1ZShuZXdPYmo/LltrZXldKSB9fVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXZlcnNpb24taGlzdG9yeS1kZXRhaWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi92ZXJzaW9uLWhpc3RvcnkvbmV3LXZlcnNpb24taGlzdG9yeS1kZXRhaWwvbmV3LXZlcnNpb24taGlzdG9yeS1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi92ZXJzaW9uLWhpc3RvcnkvbmV3LXZlcnNpb24taGlzdG9yeS1kZXRhaWwvbmV3LXZlcnNpb24taGlzdG9yeS1kZXRhaWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBT3ZFLE1BQU0sT0FBTyxnQ0FBZ0M7SUFMN0M7UUFNbUIsc0JBQWlCLEdBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUdqRCxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFcEIscUJBQWdCLEdBQTZCLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN0RCxvQkFBZSxHQUE4QixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQzlELG9CQUFlLEdBQTBCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUN0RCx1QkFBa0IsR0FBaUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUMxRix5QkFBb0IsR0FBMkQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xILHdCQUFtQixHQUEwQixHQUFH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TUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1uZXctdmVyc2lvbi1oaXN0b3J5LWRldGFpbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZXctdmVyc2lvbi1oaXN0b3J5LWRldGFpbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgTmV3VmVyc2lvbkhpc3RvcnlEZXRhaWxDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHByaW9yaXRpemVkRmllbGRzOiBzdHJpbmdbXSA9IFsnYWN0aW9uJ107XG5cbiAgQElucHV0KCkgc2VsZWN0ZWRWZXJzaW9uOiBhbnk7XG4gIEBJbnB1dCgpIHNlbGVjdGVkSXNDdXJyZW50ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzUmVzdG9yaW5nID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZ2V0QXV0aG9yTGFiZWxGbjogKHZlcnNpb246IGFueSkgPT4gc3RyaW5nID0gKCkgPT4gJyc7XG4gIEBJbnB1dCgpIGdldEZpZWxkTGFiZWxGbjogKGZpZWxkOiBzdHJpbmcpID0+IHN0cmluZyA9IChmaWVsZCkgPT4gZmllbGQ7XG4gIEBJbnB1dCgpIGdldFN0ZXBQcmVmaXhGbjogKHN0ZXA6IGFueSkgPT4gc3RyaW5nID0gKCkgPT4gJ1N0ZXAnO1xuICBASW5wdXQoKSBnZXRDYXRlZ29yeUxhYmVsRm46IChjYXRlZ29yeTogc3RyaW5nKSA9PiBzdHJpbmcgPSAoY2F0KSA9PiAoY2F0IHx8ICdPdGhlcicpICsgJyBDaGFuZ2VzJztcbiAgQElucHV0KCkgZm9ybWF0RGlzcGxheVZhbHVlRm46ICh2YWx1ZTogYW55LCBmaWVsZD86IHN0cmluZywgc3RlcERhdGE/OiBhbnkpID0+IHN0cmluZyA9ICh2KSA9PiB2ID09IG51bGwgPyAnLScgOiBTdHJpbmcodik7XG4gIEBJbnB1dCgpIGdldFN0ZXBBY3Rpb25IdG1sRm46IChzdGVwOiBhbnkpID0+IHN0cmluZyA9ICgpID0+ICcnO1xuICBASW5wdXQoKSBoaWRkZW5GaWVsZHM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIHBhcnNlRmllbGRBc1RhYmxlRm46IChmaWVsZDogc3RyaW5nLCB2YWx1ZTogYW55LCBzdGVwRGF0YT86IGFueSkgPT4gUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSAoKSA9PiBudWxsO1xuICAvKiogUmV0dXJuIGEgYmFkZ2UgY29uZmlnIHRvIHJlbmRlciBiZWZvcmUgdGhlIHZhbHVlIHRleHQsIG9yIG51bGwgZm9yIG5vIGJhZGdlLiAqL1xuICBASW5wdXQoKSBnZXRWYWx1ZUJhZGdlQ29uZmlnRm46ICh2YWx1ZTogYW55LCBmaWVsZDogc3RyaW5nLCBzdGVwRGF0YT86IGFueSkgPT4geyBsYWJlbDogc3RyaW5nOyBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZzsgdGV4dENvbG9yOiBzdHJpbmc7IGJvcmRlckNvbG9yOiBzdHJpbmcgfSB8IG51bGwgPSAoKSA9PiBudWxsO1xuICAvKiogUmV0dXJuIHsgb2xkSHRtbCwgbmV3SHRtbCB9IHdpdGggaW5saW5lIGRpZmYgbWFya3VwLCBvciBudWxsIHRvIHVzZSBwbGFpbiB0ZXh0IHJlbmRlcmluZy4gKi9cbiAgQElucHV0KCkgZ2V0SW5saW5lRGlmZkZuOiAob2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSwgZmllbGQ6IHN0cmluZywgb2xkU3RlcERhdGE/OiBhbnksIG5ld1N0ZXBEYXRhPzogYW55KSA9PiB7IG9sZEh0bWw6IHN0cmluZzsgbmV3SHRtbDogc3RyaW5nIH0gfCBudWxsID0gKCkgPT4gbnVsbDtcblxuICBAT3V0cHV0KCkgY29tcGFyZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlc3RvcmUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZ2V0IGhhc1Rlc3RDYXNlQ2hhbmdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFZlcnNpb24/LnRlc3RDYXNlPy5oYXNDaGFuZ2VzID09PSB0cnVlO1xuICB9XG5cbiAgZ2V0IHRlc3RDYXNlQ2hhbmdlZEZpZWxkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUZpZWxkcyh0aGlzLnNlbGVjdGVkVmVyc2lvbj8udGVzdENhc2U/LmNoYW5nZWRGaWVsZHMgfHwgW10pO1xuICB9XG5cbiAgdmlzaWJsZUZpZWxkcyhmaWVsZHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLmhpZGRlbkZpZWxkcz8ubGVuZ3RoXG4gICAgICA/IGZpZWxkcy5maWx0ZXIoZiA9PiAhdGhpcy5oaWRkZW5GaWVsZHMuaW5jbHVkZXMoZikpXG4gICAgICA6IFsuLi5maWVsZHNdO1xuICAgIHJldHVybiB0aGlzLnByaW9yaXRpemVGaWVsZHModmlzaWJsZSk7XG4gIH1cblxuICB2aXNpYmxlQ2hhbmdlZEZpZWxkcyhzdGVwOiBhbnkpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUZpZWxkcyhzdGVwPy5jaGFuZ2VkRmllbGRzIHx8IFtdKTtcbiAgfVxuXG4gIGdldCBzdGVwc0FkZGVkKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFZlcnNpb24/LnN0ZXBzPy5hZGRlZCB8fCBbXTtcbiAgfVxuXG4gIGdldCBzdGVwc0RlbGV0ZWQoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVmVyc2lvbj8uc3RlcHM/LmRlbGV0ZWQgfHwgW107XG4gIH1cblxuICBnZXQgc3RlcHNVcGRhdGVkKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFZlcnNpb24/LnN0ZXBzPy51cGRhdGVkIHx8IFtdO1xuICB9XG5cbiAgZ2V0IHN0ZXBzU3VtbWFyeSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVmVyc2lvbj8uc3RlcHM/LnN1bW1hcnk7XG4gIH1cblxuICBnZXQgaGFzQW55Q2hhbmdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNUZXN0Q2FzZUNoYW5nZXNcbiAgICAgIHx8IHRoaXMuc3RlcHNBZGRlZC5sZW5ndGggPiAwXG4gICAgICB8fCB0aGlzLnN0ZXBzRGVsZXRlZC5sZW5ndGggPiAwXG4gICAgICB8fCB0aGlzLnN0ZXBzVXBkYXRlZC5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIHBhcnNlIHRoZSB2YWx1ZSBhcyBhIHBsYWluIG9iamVjdCAob3IgYSBKU09OIHN0cmluZyB0aGF0IGlzIGFuIG9iamVjdCkuXG4gICAqIFJldHVybnMgdGhlIHBhcnNlZCBvYmplY3QsIG9yIG51bGwgaWYgdGhlIHZhbHVlIGlzIG5vdCBhbiBvYmplY3QvSlNPTi1vYmplY3QuXG4gICAqL1xuICBwYXJzZU9iamVjdFZhbHVlKHZhbHVlOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsgcmV0dXJuIHZhbHVlOyB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gICAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRyaW1tZWQpO1xuICAgICAgICAgIGlmIChwYXJzZWQgJiYgdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBub3QgdmFsaWQgSlNPTiAqLyB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIFJldHVybnMgb25seSB0aGUga2V5cyB3aGVyZSBvbGQgYW5kIG5ldyB2YWx1ZXMgZGlmZmVyLiAqL1xuICBvYmplY3RLZXlzKG9sZE9iajogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwsIG5ld09iajogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYWxsS2V5cyA9IG5ldyBTZXQoW1xuICAgICAgLi4uT2JqZWN0LmtleXMob2xkT2JqIHx8IHt9KSxcbiAgICAgIC4uLk9iamVjdC5rZXlzKG5ld09iaiB8fCB7fSlcbiAgICBdKTtcbiAgICBjb25zdCBjaGFuZ2VkID0gQXJyYXkuZnJvbShhbGxLZXlzKS5maWx0ZXIoa2V5ID0+XG4gICAgICBKU09OLnN0cmluZ2lmeSgob2xkT2JqIHx8IHt9KVtrZXldKSAhPT0gSlNPTi5zdHJpbmdpZnkoKG5ld09iaiB8fCB7fSlba2V5XSlcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnByaW9yaXRpemVGaWVsZHMoY2hhbmdlZCk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSB2YWx1ZSBmb3IgYSBrZXkgZGlmZmVycyBiZXR3ZWVuIG9sZCBhbmQgbmV3LiAqL1xuICBpc0tleUNoYW5nZWQob2xkT2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCwgbmV3T2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoKG9sZE9iaiB8fCB7fSlba2V5XSkgIT09IEpTT04uc3RyaW5naWZ5KChuZXdPYmogfHwge30pW2tleV0pO1xuICB9XG5cbiAgZm9ybWF0UHJpbWl0aXZlVmFsdWUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHsgcmV0dXJuICctJzsgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgeyByZXR1cm4gdmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnOyB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7IHJldHVybiAnLSc7IH1cbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0sIGkpID0+XG4gICAgICAgIGAke2kgKyAxfS4gJHt0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShpdGVtKSA6IFN0cmluZyhpdGVtKX1gXG4gICAgICApLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgeyByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpOyB9XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICB0cmFja0J5S2V5KF9pbmRleDogbnVtYmVyLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIHRyYWNrQnlGaWVsZChfaW5kZXg6IG51bWJlciwgZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkO1xuICB9XG5cbiAgdHJhY2tCeVN0ZXBJZChfaW5kZXg6IG51bWJlciwgc3RlcDogYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gc3RlcC5zdGVwSWQgPz8gc3RlcC5vbGQ/LmlkID8/IHN0ZXAubmV3Py5pZCA/PyBfaW5kZXg7XG4gIH1cblxuICBwcml2YXRlIHByaW9yaXRpemVGaWVsZHMoZmllbGRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIWZpZWxkcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmllbGRzO1xuICAgIH1cblxuICAgIGNvbnN0IHByaW9yaXRpemVkID0gdGhpcy5wcmlvcml0aXplZEZpZWxkcy5maWx0ZXIoZmllbGQgPT4gZmllbGRzLmluY2x1ZGVzKGZpZWxkKSk7XG4gICAgaWYgKCFwcmlvcml0aXplZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfVxuXG4gICAgY29uc3QgcHJpb3JpdGl6ZWRTZXQgPSBuZXcgU2V0KHByaW9yaXRpemVkKTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBmaWVsZHMuZmlsdGVyKGZpZWxkID0+ICFwcmlvcml0aXplZFNldC5oYXMoZmllbGQpKTtcbiAgICByZXR1cm4gWy4uLnByaW9yaXRpemVkLCAuLi5yZW1haW5pbmddO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRWZXJzaW9uOyBlbHNlIG5vU2VsZWN0aW9uXCI+XG4gIDwhLS0gPT09PT09PT09PSBIZWFkZXIgKHNhbWUgYXMgb2xkIGNvbXBvbmVudCkgPT09PT09PT09PSAtLT5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBjcWEtbnZoLWRldGFpbC1oZWFkZXJcIj5cbiAgICA8ZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cImdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+XG4gICAgICAgIDxoMyBjbGFzcz1cImNxYS1udmgtZGV0YWlsLXZlcnNpb24tbnVtYmVyXCI+VmVyc2lvbiB7eyBzZWxlY3RlZFZlcnNpb24udmVyc2lvbk51bWJlciB9fTwvaDM+XG4gICAgICAgIDxjcWEtYmFkZ2UgKm5nSWY9XCJzZWxlY3RlZElzQ3VycmVudFwiIGxhYmVsPVwiQ3VycmVudFwiIHNpemU9XCJzbWFsbFwiIHZhcmlhbnQ9XCJpbmZvXCIgYmFja2dyb3VuZENvbG9yPVwiI0VGRjRGRlwiXG4gICAgICAgICAgdGV4dENvbG9yPVwiIzNmNDNlZVwiIGJvcmRlckNvbG9yPVwiI0M3RDdGRVwiPjwvY3FhLWJhZGdlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLW52aC1kZXRhaWwtbWV0YVwiPlxuICAgICAgICB7eyBnZXRBdXRob3JMYWJlbEZuKHNlbGVjdGVkVmVyc2lvbikgfX0gwrcge3sgc2VsZWN0ZWRWZXJzaW9uLmNyZWF0ZWREYXRlIHwgZGF0ZTonTU1NIGQsIHl5eXkgwrcgaDptbSBhJyB9fVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRWZXJzaW9uLmNoYW5nZVN1bW1hcnlcIiBjbGFzcz1cImNxYS1udmgtZGV0YWlsLXN1bW1hcnlcIj5cbiAgICAgICAge3sgc2VsZWN0ZWRWZXJzaW9uLmNoYW5nZVN1bW1hcnkgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhc2VsZWN0ZWRJc0N1cnJlbnRcIiBjbGFzcz1cImNxYS1udmgtZGV0YWlsLWFjdGlvbnNcIj5cbiAgICAgIDwhLS0gPGNxYS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVkXCIgdGV4dD1cIkNvbXBhcmUgd2l0aCBDdXJyZW50XCIgKGNsaWNrZWQpPVwiY29tcGFyZS5lbWl0KClcIj48L2NxYS1idXR0b24+IC0tPlxuICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGljb249XCJyZWZyZXNoXCIgW3RleHRdPVwiaXNSZXN0b3JpbmcgPyAnUmVzdG9yaW5nLi4uJyA6ICdSZXN0b3JlIHRoaXMgVmVyc2lvbidcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZXN0b3JpbmdcIiAoY2xpY2tlZCk9XCJyZXN0b3JlLmVtaXQoKVwiPjwvY3FhLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSA9PT09PT09PT09IFN1bW1hcnkgYmFyID09PT09PT09PT0gLS0+XG4gIDwhLS0gPGRpdiAqbmdJZj1cInN0ZXBzU3VtbWFyeVwiIGNsYXNzPVwiY3FhLW52aC1kZXRhaWwtc3VtbWFyeS1iYXJcIj5cbiAgICA8c3BhbiAqbmdJZj1cInN0ZXBzU3VtbWFyeS5hZGRlZFwiIGNsYXNzPVwiY3FhLW52aC1zdW1tYXJ5LWNoaXAgY3FhLW52aC1zdW1tYXJ5LWNoaXAtLWFkZGVkXCI+K3t7IHN0ZXBzU3VtbWFyeS5hZGRlZCB9fSBhZGRlZDwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cInN0ZXBzU3VtbWFyeS5tb2RpZmllZFwiIGNsYXNzPVwiY3FhLW52aC1zdW1tYXJ5LWNoaXAgY3FhLW52aC1zdW1tYXJ5LWNoaXAtLW1vZGlmaWVkXCI+e3sgc3RlcHNTdW1tYXJ5Lm1vZGlmaWVkIH19IG1vZGlmaWVkPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwic3RlcHNTdW1tYXJ5LnJlbW92ZWRcIiBjbGFzcz1cImNxYS1udmgtc3VtbWFyeS1jaGlwIGNxYS1udmgtc3VtbWFyeS1jaGlwLS1yZW1vdmVkXCI+e3sgc3RlcHNTdW1tYXJ5LnJlbW92ZWQgfX0gcmVtb3ZlZDwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cInN0ZXBzU3VtbWFyeS51bmNoYW5nZWRcIiBjbGFzcz1cImNxYS1udmgtc3VtbWFyeS1jaGlwIGNxYS1udmgtc3VtbWFyeS1jaGlwLS11bmNoYW5nZWRcIj57eyBzdGVwc1N1bW1hcnkudW5jaGFuZ2VkIH19IHVuY2hhbmdlZDwvc3Bhbj5cbiAgPC9kaXY+IC0tPlxuXG4gIDwhLS0gPT09PT09PT09PSBUZXN0IENhc2UgQ2hhbmdlcyA9PT09PT09PT09IC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzVGVzdENhc2VDaGFuZ2VzXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1udmgtc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW52aC1zZWN0aW9uLWxhYmVsXCI+VGVzdCBDYXNlIENoYW5nZXM8L3NwYW4+XG4gICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCInJyArIHRlc3RDYXNlQ2hhbmdlZEZpZWxkcy5sZW5ndGhcIiBzaXplPVwic21hbGxcIiB2YXJpYW50PVwiaW5mb1wiXG4gICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNFRkY0RkZcIiB0ZXh0Q29sb3I9XCIjM2Y0M2VlXCIgYm9yZGVyQ29sb3I9XCIjQzdEN0ZFXCI+PC9jcWEtYmFkZ2U+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW52aC1jaGFuZ2VzLWxpc3RcIj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHRlc3RDYXNlQ2hhbmdlZEZpZWxkczsgdHJhY2tCeTogdHJhY2tCeUZpZWxkXCIgY2xhc3M9XCJjcWEtbnZoLWNoYW5nZS1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLWNoYW5nZS1maWVsZC1sYWJlbFwiPnt7IGdldEZpZWxkTGFiZWxGbihmaWVsZCkgfX08L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmVmb3JlQWZ0ZXJCbG9jazsgY29udGV4dDoge1xuICAgICAgICAgICAgb2xkVmFsdWU6IHNlbGVjdGVkVmVyc2lvbi50ZXN0Q2FzZS5vbGQ/LltmaWVsZF0sXG4gICAgICAgICAgICBuZXdWYWx1ZTogc2VsZWN0ZWRWZXJzaW9uLnRlc3RDYXNlLm5ldz8uW2ZpZWxkXSxcbiAgICAgICAgICAgIGZpZWxkOiBmaWVsZCxcbiAgICAgICAgICAgIG9sZFN0ZXBEYXRhOiBzZWxlY3RlZFZlcnNpb24udGVzdENhc2Uub2xkLFxuICAgICAgICAgICAgbmV3U3RlcERhdGE6IHNlbGVjdGVkVmVyc2lvbi50ZXN0Q2FzZS5uZXdcbiAgICAgICAgICB9XCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gPT09PT09PT09PSBTdGVwcyBBZGRlZCA9PT09PT09PT09IC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RlcHNBZGRlZC5sZW5ndGhcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW52aC1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbnZoLXNlY3Rpb24tbGFiZWxcIj5TdGVwcyBBZGRlZDwvc3Bhbj5cbiAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cIicnICsgc3RlcHNBZGRlZC5sZW5ndGhcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRUNGREYzXCJcbiAgICAgICAgdGV4dENvbG9yPVwiIzAyN0E0OFwiIGJvcmRlckNvbG9yPVwiI0E3RjNEMFwiPjwvY3FhLWJhZGdlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1udmgtY2hhbmdlcy1saXN0XCI+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBzQWRkZWQ7IHRyYWNrQnk6IHRyYWNrQnlTdGVwSWRcIiBjbGFzcz1cImNxYS1udmgtY2hhbmdlLWNhcmQgY3FhLW52aC1jaGFuZ2UtY2FyZC0tYWRkZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1udmgtc3RlcC1oZWFkZXJcIj5cbiAgICAgICAgICA8Y3FhLWJhZGdlIGxhYmVsPVwiQWRkZWRcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRUNGREYzXCIgdGV4dENvbG9yPVwiIzAyN0E0OFwiXG4gICAgICAgICAgICBib3JkZXJDb2xvcj1cIiNBN0YzRDBcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtc3RlcC1wcmVmaXhcIj57eyBnZXRTdGVwUHJlZml4Rm4oc3RlcCkgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbnZoLXN0ZXAtYWN0aW9uIGNxYS1hY3Rpb24tZm9ybWF0XCIgW2lubmVySFRNTF09XCJnZXRTdGVwQWN0aW9uSHRtbEZuKHN0ZXApXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tID09PT09PT09PT0gU3RlcHMgRGVsZXRlZCA9PT09PT09PT09IC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RlcHNEZWxldGVkLmxlbmd0aFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtc2VjdGlvbi1sYWJlbFwiPlN0ZXBzIFJlbW92ZWQ8L3NwYW4+XG4gICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCInJyArIHN0ZXBzRGVsZXRlZC5sZW5ndGhcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRkVGM0YyXCJcbiAgICAgICAgdGV4dENvbG9yPVwiI0I0MjMxOFwiIGJvcmRlckNvbG9yPVwiI0ZFQ0RDQVwiPjwvY3FhLWJhZGdlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS1udmgtY2hhbmdlcy1saXN0XCI+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBzRGVsZXRlZDsgdHJhY2tCeTogdHJhY2tCeVN0ZXBJZFwiIGNsYXNzPVwiY3FhLW52aC1jaGFuZ2UtY2FyZCBjcWEtbnZoLWNoYW5nZS1jYXJkLS1yZW1vdmVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLXN0ZXAtaGVhZGVyXCI+XG4gICAgICAgICAgPGNxYS1iYWRnZSBsYWJlbD1cIlJlbW92ZWRcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRkVGM0YyXCIgdGV4dENvbG9yPVwiI0I0MjMxOFwiXG4gICAgICAgICAgICBib3JkZXJDb2xvcj1cIiNGRUNEQ0FcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtc3RlcC1wcmVmaXhcIj57eyBnZXRTdGVwUHJlZml4Rm4oc3RlcCkgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbnZoLXN0ZXAtYWN0aW9uIGNxYS1hY3Rpb24tZm9ybWF0XCIgW2lubmVySFRNTF09XCJnZXRTdGVwQWN0aW9uSHRtbEZuKHN0ZXApXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tID09PT09PT09PT0gU3RlcHMgVXBkYXRlZCA9PT09PT09PT09IC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RlcHNVcGRhdGVkLmxlbmd0aFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtc2VjdGlvbi1sYWJlbFwiPlN0ZXBzIE1vZGlmaWVkPC9zcGFuPlxuICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiJycgKyBzdGVwc1VwZGF0ZWQubGVuZ3RoXCIgc2l6ZT1cInNtYWxsXCIgYmFja2dyb3VuZENvbG9yPVwiI0ZGRkFFQlwiXG4gICAgICAgIHRleHRDb2xvcj1cIiNCNTQ3MDhcIiBib3JkZXJDb2xvcj1cIiNGRURGODlcIj48L2NxYS1iYWRnZT5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLWNoYW5nZXMtbGlzdFwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwc1VwZGF0ZWQ7IHRyYWNrQnk6IHRyYWNrQnlTdGVwSWRcIiBjbGFzcz1cImNxYS1udmgtY2hhbmdlLWNhcmRcIj5cbiAgICAgICAgPCEtLSBTdGVwIGhlYWRlciB3aXRoIGNhdGVnb3J5IGJhZGdlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW52aC1zdGVwLWhlYWRlclwiPlxuICAgICAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cImdldENhdGVnb3J5TGFiZWxGbihzdGVwLmNhdGVnb3J5KVwiIHNpemU9XCJzbWFsbFwiIGJhY2tncm91bmRDb2xvcj1cIiNFREYxRjNcIlxuICAgICAgICAgICAgdGV4dENvbG9yPVwiIzYzNkE3MVwiIGJvcmRlckNvbG9yPVwiI0RCREVFMVwiPjwvY3FhLWJhZGdlPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW52aC1zdGVwLXByZWZpeFwiPnt7IGdldFN0ZXBQcmVmaXhGbihzdGVwKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtc3RlcC1hY3Rpb24gY3FhLWFjdGlvbi1mb3JtYXRcIiBbaW5uZXJIVE1MXT1cImdldFN0ZXBBY3Rpb25IdG1sRm4oc3RlcClcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQ2hhbmdlZCBmaWVsZHMgd2l0aCBiZWZvcmUvYWZ0ZXIgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2aXNpYmxlQ2hhbmdlZEZpZWxkcyhzdGVwKS5sZW5ndGg7IGVsc2UgaW50ZXJuYWxPbmx5Q2hhbmdlc1wiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHZpc2libGVDaGFuZ2VkRmllbGRzKHN0ZXApOyB0cmFja0J5OiB0cmFja0J5RmllbGRcIiBjbGFzcz1cImNxYS1udmgtZmllbGQtZGlmZlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1udmgtY2hhbmdlLWZpZWxkLWxhYmVsXCI+e3sgZ2V0RmllbGRMYWJlbEZuKGZpZWxkKSB9fTwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImJlZm9yZUFmdGVyQmxvY2s7IGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZTogc3RlcC5vbGQ/LltmaWVsZF0sXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHN0ZXAubmV3Py5bZmllbGRdLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBmaWVsZCxcbiAgICAgICAgICAgICAgICBvbGRTdGVwRGF0YTogc3RlcC5vbGQsXG4gICAgICAgICAgICAgICAgbmV3U3RlcERhdGE6IHN0ZXAubmV3XG4gICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNpbnRlcm5hbE9ubHlDaGFuZ2VzPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLWludGVybmFsLWNoYW5nZS1tc2dcIj5cbiAgICAgICAgICAgIFNvbWUgaW50ZXJuYWwgcHJvcGVydGllcyBvZiB0aGlzIHN0ZXAgd2VyZSBjaGFuZ2VkLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gPT09PT09PT09PSBFbXB0eSBzdGF0ZSA9PT09PT09PT09IC0tPlxuICA8ZGl2ICpuZ0lmPVwiIWhhc0FueUNoYW5nZXNcIiBjbGFzcz1cImNxYS1udmgtZGV0YWlsLWVtcHR5XCI+XG4gICAgPGNxYS1lbXB0eS1zdGF0ZSB0aXRsZT1cIk5vIGNoYW5nZXNcIiBkZXNjcmlwdGlvbj1cIk5vIGNoYW5nZXMgcmVjb3JkZWQgZm9yIHRoaXMgdmVyc2lvbi5cIj48L2NxYS1lbXB0eS1zdGF0ZT5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNub1NlbGVjdGlvbj5cbiAgPGRpdiBjbGFzcz1cImNxYS1udmgtZGV0YWlsLW5vLXNlbGVjdGlvblwiPlxuICAgIFNlbGVjdCBhIHZlcnNpb24gdG8gdmlldyBkZXRhaWxzLlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gPT09PT0gUmV1c2FibGUgYmVmb3JlL2FmdGVyIGJsb2NrID09PT09IC0tPlxuPG5nLXRlbXBsYXRlICNiZWZvcmVBZnRlckJsb2NrIGxldC1vbGRWYWx1ZT1cIm9sZFZhbHVlXCIgbGV0LW5ld1ZhbHVlPVwibmV3VmFsdWVcIiBsZXQtZmllbGQ9XCJmaWVsZFwiIGxldC1vbGRTdGVwRGF0YT1cIm9sZFN0ZXBEYXRhXCIgbGV0LW5ld1N0ZXBEYXRhPVwibmV3U3RlcERhdGFcIj5cbiAgPCEtLSAxLiBDdXN0b20gdGFibGUgdmlhIHBhcnNlRmllbGRBc1RhYmxlRm4gKGUuZy4gdGVzdERhdGFMaXN0KSAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhcnNlRmllbGRBc1RhYmxlRm4oZmllbGQsIG9sZFZhbHVlLCBvbGRTdGVwRGF0YSkgfHwgcGFyc2VGaWVsZEFzVGFibGVGbihmaWVsZCwgbmV3VmFsdWUsIG5ld1N0ZXBEYXRhKTsgZWxzZSBuYXRpdmVPYmplY3RDaGVja1wiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwib2JqVGFibGU7IGNvbnRleHQ6IHtcbiAgICAgICAgb2xkT2JqOiBwYXJzZUZpZWxkQXNUYWJsZUZuKGZpZWxkLCBvbGRWYWx1ZSwgb2xkU3RlcERhdGEpLFxuICAgICAgICBuZXdPYmo6IHBhcnNlRmllbGRBc1RhYmxlRm4oZmllbGQsIG5ld1ZhbHVlLCBuZXdTdGVwRGF0YSlcbiAgICAgIH1cIj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSAyLiBOYXRpdmUgb2JqZWN0IC8gSlNPTiBzdHJpbmcgLS0+XG4gIDxuZy10ZW1wbGF0ZSAjbmF0aXZlT2JqZWN0Q2hlY2s+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhcnNlT2JqZWN0VmFsdWUob2xkVmFsdWUpIHx8IHBhcnNlT2JqZWN0VmFsdWUobmV3VmFsdWUpOyBlbHNlIHNpbXBsZVZhbHVlXCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwib2JqVGFibGU7IGNvbnRleHQ6IHtcbiAgICAgICAgICBvbGRPYmo6IHBhcnNlT2JqZWN0VmFsdWUob2xkVmFsdWUpLFxuICAgICAgICAgIG5ld09iajogcGFyc2VPYmplY3RWYWx1ZShuZXdWYWx1ZSlcbiAgICAgICAgfVwiPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPCEtLSAzLiBQcmltaXRpdmUgZmFsbGJhY2sgLS0+XG4gIDxuZy10ZW1wbGF0ZSAjc2ltcGxlVmFsdWU+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldElubGluZURpZmZGbihvbGRWYWx1ZSwgbmV3VmFsdWUsIGZpZWxkLCBvbGRTdGVwRGF0YSwgbmV3U3RlcERhdGEpIGFzIGRpZmY7IGVsc2UgcGxhaW5CZWZvcmVBZnRlclwiPlxuICAgICAgPCEtLSBJbmxpbmUgZGlmZiB2aWV3OiBubyAtLWJlZm9yZS8tLWFmdGVyIGNvbG9yIG1vZGlmaWVyczsgZGlmZiBIVE1MIG93bnMgYWxsIHRva2VuIGNvbG9ycyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLWJlZm9yZS1hZnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW52aC12YWx1ZS1yb3dcIj5cbiAgICAgICAgICA8Y3FhLWJhZGdlIGxhYmVsPVwiQmVmb3JlXCIgc2l6ZT1cInNtYWxsXCIgYmFja2dyb3VuZENvbG9yPVwiI0ZFRjJGMlwiIHRleHRDb2xvcj1cIiNGQjJDMzZcIlxuICAgICAgICAgICAgYm9yZGVyQ29sb3I9XCIjRkZFMkUyXCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFZhbHVlQmFkZ2VDb25maWdGbihvbGRWYWx1ZSwgZmllbGQsIG9sZFN0ZXBEYXRhKSBhcyBiYWRnZVwiPlxuICAgICAgICAgICAgPGNxYS1iYWRnZSBbbGFiZWxdPVwiYmFkZ2UubGFiZWxcIiBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cImJhZGdlLmJhY2tncm91bmRDb2xvclwiIFt0ZXh0Q29sb3JdPVwiYmFkZ2UudGV4dENvbG9yXCJcbiAgICAgICAgICAgICAgW2JvcmRlckNvbG9yXT1cImJhZGdlLmJvcmRlckNvbG9yXCI+PC9jcWEtYmFkZ2U+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbnZoLXZhbHVlLXRleHRcIiBbaW5uZXJIVE1MXT1cImRpZmYub2xkSHRtbFwiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLXZhbHVlLXJvd1wiPlxuICAgICAgICAgIDxjcWEtYmFkZ2UgbGFiZWw9XCJBZnRlclwiIHNpemU9XCJzbWFsbFwiIGJhY2tncm91bmRDb2xvcj1cIiNFQ0ZERjVcIiB0ZXh0Q29sb3I9XCIjMDA5OTY2XCJcbiAgICAgICAgICAgIGJvcmRlckNvbG9yPVwiI0QwRkFFNVwiPjwvY3FhLWJhZGdlPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRWYWx1ZUJhZGdlQ29uZmlnRm4obmV3VmFsdWUsIGZpZWxkLCBuZXdTdGVwRGF0YSkgYXMgYmFkZ2VcIj5cbiAgICAgICAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cImJhZGdlLmxhYmVsXCIgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCJiYWRnZS5iYWNrZ3JvdW5kQ29sb3JcIiBbdGV4dENvbG9yXT1cImJhZGdlLnRleHRDb2xvclwiXG4gICAgICAgICAgICAgIFtib3JkZXJDb2xvcl09XCJiYWRnZS5ib3JkZXJDb2xvclwiPjwvY3FhLWJhZGdlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW52aC12YWx1ZS10ZXh0XCIgW2lubmVySFRNTF09XCJkaWZmLm5ld0h0bWxcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFBsYWluIHRleHQgZmFsbGJhY2sgKG5vIGRpZmYpIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5CZWZvcmVBZnRlcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbnZoLWJlZm9yZS1hZnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW52aC12YWx1ZS1yb3cgY3FhLW52aC12YWx1ZS1yb3ctLWJlZm9yZVwiPlxuICAgICAgICAgIDxjcWEtYmFkZ2UgbGFiZWw9XCJCZWZvcmVcIiBzaXplPVwic21hbGxcIiBiYWNrZ3JvdW5kQ29sb3I9XCIjRkVGMkYyXCIgdGV4dENvbG9yPVwiI0ZCMkMzNlwiXG4gICAgICAgICAgICBib3JkZXJDb2xvcj1cIiNGRkUyRTJcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0VmFsdWVCYWRnZUNvbmZpZ0ZuKG9sZFZhbHVlLCBmaWVsZCwgb2xkU3RlcERhdGEpIGFzIGJhZGdlXCI+XG4gICAgICAgICAgICA8Y3FhLWJhZGdlIFtsYWJlbF09XCJiYWRnZS5sYWJlbFwiIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwiYmFkZ2UuYmFja2dyb3VuZENvbG9yXCIgW3RleHRDb2xvcl09XCJiYWRnZS50ZXh0Q29sb3JcIlxuICAgICAgICAgICAgICBbYm9yZGVyQ29sb3JdPVwiYmFkZ2UuYm9yZGVyQ29sb3JcIj48L2NxYS1iYWRnZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtdmFsdWUtdGV4dFwiPnt7IGZvcm1hdERpc3BsYXlWYWx1ZUZuKG9sZFZhbHVlLCBmaWVsZCwgb2xkU3RlcERhdGEpIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1udmgtdmFsdWUtcm93IGNxYS1udmgtdmFsdWUtcm93LS1hZnRlclwiPlxuICAgICAgICAgIDxjcWEtYmFkZ2UgbGFiZWw9XCJBZnRlclwiIHNpemU9XCJzbWFsbFwiIGJhY2tncm91bmRDb2xvcj1cIiNFQ0ZERjVcIiB0ZXh0Q29sb3I9XCIjMDA5OTY2XCJcbiAgICAgICAgICAgIGJvcmRlckNvbG9yPVwiI0QwRkFFNVwiPjwvY3FhLWJhZGdlPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRWYWx1ZUJhZGdlQ29uZmlnRm4obmV3VmFsdWUsIGZpZWxkLCBuZXdTdGVwRGF0YSkgYXMgYmFkZ2VcIj5cbiAgICAgICAgICAgIDxjcWEtYmFkZ2UgW2xhYmVsXT1cImJhZGdlLmxhYmVsXCIgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCJiYWRnZS5iYWNrZ3JvdW5kQ29sb3JcIiBbdGV4dENvbG9yXT1cImJhZGdlLnRleHRDb2xvclwiXG4gICAgICAgICAgICAgIFtib3JkZXJDb2xvcl09XCJiYWRnZS5ib3JkZXJDb2xvclwiPjwvY3FhLWJhZGdlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW52aC12YWx1ZS10ZXh0XCI+e3sgZm9ybWF0RGlzcGxheVZhbHVlRm4obmV3VmFsdWUsIGZpZWxkLCBuZXdTdGVwRGF0YSkgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gPT09PT0gU2hhcmVkIG9iamVjdCB0YWJsZSA9PT09PSAtLT5cbjxuZy10ZW1wbGF0ZSAjb2JqVGFibGUgbGV0LW9sZE9iaj1cIm9sZE9ialwiIGxldC1uZXdPYmo9XCJuZXdPYmpcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS1udmgtb2JqLXRhYmxlXCIgKm5nSWY9XCJvYmplY3RLZXlzKG9sZE9iaiwgbmV3T2JqKS5sZW5ndGggPiAwXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1udmgtb2JqLWhlYWRlclwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbnZoLW9iai1jb2wtbGFiZWwgY3FhLW52aC1vYmotY29sLWtleS1oZWFkZXJcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtb2JqLWNvbC1sYWJlbCBjcWEtbnZoLW9iai1jb2wtbGFiZWwtLWJlZm9yZVwiPkJlZm9yZTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW52aC1vYmotY29sLWxhYmVsIGNxYS1udmgtb2JqLWNvbC1sYWJlbC0tYWZ0ZXJcIj5BZnRlcjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAqbmdGb3I9XCJsZXQga2V5IG9mIG9iamVjdEtleXMob2xkT2JqLCBuZXdPYmopOyB0cmFja0J5OiB0cmFja0J5S2V5XCJcbiAgICAgIGNsYXNzPVwiY3FhLW52aC1vYmotcm93XCJcbiAgICAgIFtjbGFzcy5jcWEtbnZoLW9iai1yb3ctLWNoYW5nZWRdPVwiZm9ybWF0UHJpbWl0aXZlVmFsdWUob2xkT2JqPy5ba2V5XSkgIT09IGZvcm1hdFByaW1pdGl2ZVZhbHVlKG5ld09iaj8uW2tleV0pXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS1udmgtb2JqLWtleVwiPnt7IGdldEZpZWxkTGFiZWxGbihrZXkpIH19PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbnZoLW9iai12YWwgY3FhLW52aC1vYmotdmFsLS1iZWZvcmVcIj5cbiAgICAgICAge3sgZm9ybWF0UHJpbWl0aXZlVmFsdWUob2xkT2JqPy5ba2V5XSkgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW52aC1vYmotdmFsIGNxYS1udmgtb2JqLXZhbC0tYWZ0ZXJcIj5cbiAgICAgICAge3sgZm9ybWF0UHJpbWl0aXZlVmFsdWUobmV3T2JqPy5ba2V5XSkgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|