@cqa-lib/cqa-ui 1.1.504 → 1.1.505
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.
|
@@ -935,10 +935,10 @@ export class DynamicSelectFieldComponent {
|
|
|
935
935
|
}
|
|
936
936
|
}
|
|
937
937
|
DynamicSelectFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicSelectFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
938
|
-
DynamicSelectFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: { form: "form", config: "config" }, outputs: { selectionChange: "selectionChange", selectClick: "selectClick", searchChange: "searchChange", loadMore: "loadMore", addCustomValue: "addCustomValue" }, host: { listeners: { "document:click": "handleDocumentClick($event)" } }, viewQueries: [{ propertyName: "selectRef", first: true, predicate: ["selectRef"], descendants: true }, { propertyName: "hostEl", first: true, predicate: ["host"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\"\n (keydown)=\"onSelectKeydown($event)\">\n <mat-select-trigger *ngIf=\"!isMultiple && singleSelectedDisplayLabel\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0\">\n <ng-container *ngIf=\"config?.showTestTypeIcon\">\n <ng-container *ngTemplateOutlet=\"optionTestTypeIconTpl; context: { kind: testTypeIconKind(singleSelectedOption) }\"></ng-container>\n </ng-container>\n <span class=\"cqa-min-w-0\" [innerHTML]=\"singleSelectedDisplayLabel\"></span>\n </span>\n </mat-select-trigger>\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"onSearchInputKeydown($event)\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option *ngIf=\"showAddCustomOption\" [value]=\"addCustomSentinelValue\" class=\"cqa-text-primary\">\n New\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"getOptionValue(opt)\">\n <ng-container *ngIf=\"config.isCompareRuns\"> \n <ng-container *ngIf=\"useCheckboxStyle; else compareRunsDefaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else checkboxDefaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }} </span>\n </span>\n <ng-template #checkboxDefaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n </span>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-container>\n <ng-template #compareRunsDefaultOptionTpl>\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else defaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }} </span>\n </span>\n <ng-template #defaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!config.isCompareRuns\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <ng-container *ngIf=\"config?.showTestTypeIcon; else checkboxNoIconTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"optionTestTypeIconTpl; context: { kind: testTypeIconKind(opt) }\"></ng-container>\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\" *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-container>\n <ng-template #checkboxNoIconTpl>\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-template>\n </ng-container>\n <ng-template #defaultOptionTpl>\n <ng-container *ngIf=\"config?.showTestTypeIcon; else defaultNoIconTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"optionTestTypeIconTpl; context: { kind: testTypeIconKind(opt) }\"></ng-container>\n <span class=\"cqa-min-w-0\" *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-container>\n <ng-template #defaultNoIconTpl>\n <span *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-template>\n </ng-container>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n\n <ng-template #optionTestTypeIconTpl let-kind=\"kind\">\n <span *ngIf=\"kind === 'mobile'\" class=\"cqa-inline-flex cqa-flex-shrink-0 cqa-items-center\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/>\n <path d=\"M6 5a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2v-14\"/>\n <path d=\"M11 4h2\"/>\n <path d=\"M12 17v.01\"/>\n </svg>\n </span>\n <span *ngIf=\"kind === 'web'\" class=\"cqa-inline-flex cqa-flex-shrink-0 cqa-items-center\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/>\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0\"/>\n <path d=\"M3.6 9h16.8\"/>\n <path d=\"M3.6 15h16.8\"/>\n <path d=\"M11.5 3a17 17 0 0 0 0 18\"/>\n <path d=\"M12.5 3a17 17 0 0 1 0 18\"/>\n </svg>\n </span>\n <span *ngIf=\"kind === 'other'\" class=\"cqa-inline-flex cqa-flex-shrink-0 cqa-items-center\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6.5h16v11H4z\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n <path d=\"M8 6.5V5h8v1.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </ng-template>\n</div>", components: [{ type: i1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.MatSelectTrigger, selector: "mat-select-trigger" }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
938
|
+
DynamicSelectFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: { form: "form", config: "config" }, outputs: { selectionChange: "selectionChange", selectClick: "selectClick", searchChange: "searchChange", loadMore: "loadMore", addCustomValue: "addCustomValue" }, host: { listeners: { "document:click": "handleDocumentClick($event)" } }, viewQueries: [{ propertyName: "selectRef", first: true, predicate: ["selectRef"], descendants: true }, { propertyName: "hostEl", first: true, predicate: ["host"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\"\n (keydown)=\"onSelectKeydown($event)\">\n <mat-select-trigger *ngIf=\"!isMultiple && singleSelectedDisplayLabel\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0\">\n <ng-container *ngIf=\"config?.showTestTypeIcon\">\n <ng-container *ngTemplateOutlet=\"optionTestTypeIconTpl; context: { kind: testTypeIconKind(singleSelectedOption) }\"></ng-container>\n </ng-container>\n <span class=\"cqa-min-w-0\" [innerHTML]=\"singleSelectedDisplayLabel\"></span>\n </span>\n </mat-select-trigger>\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"onSearchInputKeydown($event)\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option *ngIf=\"showAddCustomOption\" [value]=\"addCustomSentinelValue\" class=\"cqa-text-primary\">\n New\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"getOptionValue(opt)\" [title]=\"opt.name ?? opt.label ?? opt.value\">\n <ng-container *ngIf=\"config.isCompareRuns\"> \n <ng-container *ngIf=\"useCheckboxStyle; else compareRunsDefaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else checkboxDefaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }} </span>\n </span>\n <ng-template #checkboxDefaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n </span>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-container>\n <ng-template #compareRunsDefaultOptionTpl>\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else defaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }} </span>\n </span>\n <ng-template #defaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!config.isCompareRuns\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <ng-container *ngIf=\"config?.showTestTypeIcon; else checkboxNoIconTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"optionTestTypeIconTpl; context: { kind: testTypeIconKind(opt) }\"></ng-container>\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\" *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-container>\n <ng-template #checkboxNoIconTpl>\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-template>\n </ng-container>\n <ng-template #defaultOptionTpl>\n <ng-container *ngIf=\"config?.showTestTypeIcon; else defaultNoIconTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"optionTestTypeIconTpl; context: { kind: testTypeIconKind(opt) }\"></ng-container>\n <span class=\"cqa-min-w-0\" *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-container>\n <ng-template #defaultNoIconTpl>\n <span *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-template>\n </ng-container>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n\n <ng-template #optionTestTypeIconTpl let-kind=\"kind\">\n <span *ngIf=\"kind === 'mobile'\" class=\"cqa-inline-flex cqa-flex-shrink-0 cqa-items-center\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/>\n <path d=\"M6 5a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2v-14\"/>\n <path d=\"M11 4h2\"/>\n <path d=\"M12 17v.01\"/>\n </svg>\n </span>\n <span *ngIf=\"kind === 'web'\" class=\"cqa-inline-flex cqa-flex-shrink-0 cqa-items-center\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/>\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0\"/>\n <path d=\"M3.6 9h16.8\"/>\n <path d=\"M3.6 15h16.8\"/>\n <path d=\"M11.5 3a17 17 0 0 0 0 18\"/>\n <path d=\"M12.5 3a17 17 0 0 1 0 18\"/>\n </svg>\n </span>\n <span *ngIf=\"kind === 'other'\" class=\"cqa-inline-flex cqa-flex-shrink-0 cqa-items-center\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6.5h16v11H4z\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n <path d=\"M8 6.5V5h8v1.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </ng-template>\n</div>", components: [{ type: i1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.MatSelectTrigger, selector: "mat-select-trigger" }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
939
939
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicSelectFieldComponent, decorators: [{
|
|
940
940
|
type: Component,
|
|
941
|
-
args: [{ selector: 'cqa-dynamic-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\"\n (keydown)=\"onSelectKeydown($event)\">\n <mat-select-trigger *ngIf=\"!isMultiple && singleSelectedDisplayLabel\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0\">\n <ng-container *ngIf=\"config?.showTestTypeIcon\">\n <ng-container *ngTemplateOutlet=\"optionTestTypeIconTpl; context: { kind: testTypeIconKind(singleSelectedOption) }\"></ng-container>\n </ng-container>\n <span class=\"cqa-min-w-0\" [innerHTML]=\"singleSelectedDisplayLabel\"></span>\n </span>\n </mat-select-trigger>\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"onSearchInputKeydown($event)\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option *ngIf=\"showAddCustomOption\" [value]=\"addCustomSentinelValue\" class=\"cqa-text-primary\">\n New\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"getOptionValue(opt)\">\n <ng-container *ngIf=\"config.isCompareRuns\"> \n <ng-container *ngIf=\"useCheckboxStyle; else compareRunsDefaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else checkboxDefaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }} </span>\n </span>\n <ng-template #checkboxDefaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n </span>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-container>\n <ng-template #compareRunsDefaultOptionTpl>\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else defaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }} </span>\n </span>\n <ng-template #defaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!config.isCompareRuns\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <ng-container *ngIf=\"config?.showTestTypeIcon; else checkboxNoIconTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"optionTestTypeIconTpl; context: { kind: testTypeIconKind(opt) }\"></ng-container>\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\" *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-container>\n <ng-template #checkboxNoIconTpl>\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-template>\n </ng-container>\n <ng-template #defaultOptionTpl>\n <ng-container *ngIf=\"config?.showTestTypeIcon; else defaultNoIconTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"optionTestTypeIconTpl; context: { kind: testTypeIconKind(opt) }\"></ng-container>\n <span class=\"cqa-min-w-0\" *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-container>\n <ng-template #defaultNoIconTpl>\n <span *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-template>\n </ng-container>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n\n <ng-template #optionTestTypeIconTpl let-kind=\"kind\">\n <span *ngIf=\"kind === 'mobile'\" class=\"cqa-inline-flex cqa-flex-shrink-0 cqa-items-center\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/>\n <path d=\"M6 5a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2v-14\"/>\n <path d=\"M11 4h2\"/>\n <path d=\"M12 17v.01\"/>\n </svg>\n </span>\n <span *ngIf=\"kind === 'web'\" class=\"cqa-inline-flex cqa-flex-shrink-0 cqa-items-center\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/>\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0\"/>\n <path d=\"M3.6 9h16.8\"/>\n <path d=\"M3.6 15h16.8\"/>\n <path d=\"M11.5 3a17 17 0 0 0 0 18\"/>\n <path d=\"M12.5 3a17 17 0 0 1 0 18\"/>\n </svg>\n </span>\n <span *ngIf=\"kind === 'other'\" class=\"cqa-inline-flex cqa-flex-shrink-0 cqa-items-center\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6.5h16v11H4z\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n <path d=\"M8 6.5V5h8v1.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </ng-template>\n</div>" }]
|
|
941
|
+
args: [{ selector: 'cqa-dynamic-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"displayPlaceholder\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onSelectionChange($event, selectRef)\"\n (keydown)=\"onSelectKeydown($event)\">\n <mat-select-trigger *ngIf=\"!isMultiple && singleSelectedDisplayLabel\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0\">\n <ng-container *ngIf=\"config?.showTestTypeIcon\">\n <ng-container *ngTemplateOutlet=\"optionTestTypeIconTpl; context: { kind: testTypeIconKind(singleSelectedOption) }\"></ng-container>\n </ng-container>\n <span class=\"cqa-min-w-0\" [innerHTML]=\"singleSelectedDisplayLabel\"></span>\n </span>\n </mat-select-trigger>\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input cqa-text-black-100\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"onSearchInputKeydown($event)\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n \n <mat-option [ngClass]=\"{'checkmark': config.optionStyle === 'checkmark','checkbox': config.optionStyle !== 'checkmark','mat-selected': allSelected}\" [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngIf=\"isMultiple && config.showSelectAll\" [value]=\"SELECT_ALL_VALUE\">\n <ng-container *ngIf=\"useCheckboxStyle; else selectAllDefaultTpl\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"allSelected ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"allSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\">{{ config.selectAllLabel || 'All' }}</span>\n </span>\n </ng-container>\n <ng-template #selectAllDefaultTpl>\n {{ config.selectAllLabel || 'All' }}\n </ng-template>\n </mat-option>\n\n <mat-option *ngIf=\"showAddCustomOption\" [value]=\"addCustomSentinelValue\" class=\"cqa-text-primary\">\n New\n </mat-option>\n\n <mat-option [class]=\"config.optionStyle == 'checkmark' ? 'checkmark' : 'checkbox'\" *ngFor=\"let opt of filteredOptions(config)\" [value]=\"getOptionValue(opt)\" [title]=\"opt.name ?? opt.label ?? opt.value\">\n <ng-container *ngIf=\"config.isCompareRuns\"> \n <ng-container *ngIf=\"useCheckboxStyle; else compareRunsDefaultOptionTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else checkboxDefaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }} </span>\n </span>\n <ng-template #checkboxDefaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n </span>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-container>\n <ng-template #compareRunsDefaultOptionTpl>\n <span class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-compare-runs-item\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"hasHighlighting\"\n [style.color]=\"opt.statusColor || null\"\n [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <ng-container *ngIf=\"!hasHighlighting\">\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n *ngIf=\"opt.runNumberLabel && opt.runDateLabel; else defaultLabel\">\n <span [style.color]=\"opt.statusColor || null\">{{ opt.runNumberLabel }}</span>\n <span class=\"cqa-text-[#6B7280]\"> {{ opt.runDateLabel }} </span>\n </span>\n <ng-template #defaultLabel>\n <span\n class=\"cqa-min-w-0 cqa-compare-runs\"\n [style.color]=\"opt.statusColor || null\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-container>\n <span\n *ngIf=\"opt.durationFormatted\"\n class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-1 cqa-text-[12px] cqa-text-[#6B7280] cqa-flex-shrink-0 cqa-whitespace-nowrap cqa-max-w-[80px]\" \n [ngClass]=\"{\n 'cqa-min-w-[82px]': opt?.hasHourRun,\n 'cqa-min-w-[66px]': !opt?.hasHourRun && opt?.hasMinuteRun,\n 'cqa-min-w-[40px]': !opt?.hasHourRun && !opt?.hasMinuteRun\n }\">\n <svg class=\"cqa-min-w-[12px] cqa-max-w-[12px]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke=\"#9CA3AF\" stroke-width=\"1\"/>\n <path d=\"M6 3.5V6L7.5 7\" stroke=\"#4B5563\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>{{ opt.durationFormatted }}</span>\n </span>\n </span>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"!config.isCompareRuns\">\n <ng-container *ngIf=\"useCheckboxStyle; else defaultOptionTpl\">\n <ng-container *ngIf=\"config?.showTestTypeIcon; else checkboxNoIconTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"optionTestTypeIconTpl; context: { kind: testTypeIconKind(opt) }\"></ng-container>\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span class=\"cqa-min-w-0\" *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-container>\n <ng-template #checkboxNoIconTpl>\n <span class=\"cqa-flex cqa-items-center\">\n <span class=\"cqa-w-4 cqa-h-4 cqa-flex-shrink-0 cqa-rounded-[4px] cqa-border cqa-border-[#D1D5DB] cqa-mr-2 cqa-flex cqa-items-center cqa-justify-center cqa-border-solid\"\n [ngStyle]=\"isOptionSelected(opt) ? {'background-color':'#4F46E5','border-color':'#4F46E5'} : {}\">\n <svg *ngIf=\"isOptionSelected(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-template>\n </ng-container>\n <ng-template #defaultOptionTpl>\n <ng-container *ngIf=\"config?.showTestTypeIcon; else defaultNoIconTpl\">\n <span class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0\">\n <ng-container *ngTemplateOutlet=\"optionTestTypeIconTpl; context: { kind: testTypeIconKind(opt) }\"></ng-container>\n <span class=\"cqa-min-w-0\" *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span class=\"cqa-min-w-0\" *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </span>\n </ng-container>\n <ng-template #defaultNoIconTpl>\n <span *ngIf=\"config?.displayLabelAsInnerHtml\" [innerHTML]=\"opt.label ?? opt.name ?? opt.value\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && hasHighlighting\" [innerHTML]=\"highlightText(opt.name ?? opt.label ?? opt.value)\"></span>\n <span *ngIf=\"!config?.displayLabelAsInnerHtml && !hasHighlighting\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </span>\n </ng-template>\n </ng-template>\n </ng-container>\n </mat-option>\n \n <!-- No results state (only when not loading and no options) -->\n <mat-option disabled *ngIf=\"!(config?.options?.length || 0) && !(config?.isLoading || loadingMore)\">\n No results\n </mat-option>\n <!-- Infinite scroll sentinel (serverSearch or explicit hasMore) -->\n <mat-option disabled class=\"load-more-sentinel\" *ngIf=\"config?.hasMore\">\n <span *ngIf=\"loadingMore || config?.isLoading\">Loading...</span>\n <span *ngIf=\"!loadingMore && !config?.isLoading\">Scroll to load more\u2026</span>\n </mat-option>\n </mat-select>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <!-- Inline spinner shown when loading more (infinite scroll) or when config.isLoading is true -->\n <svg *ngIf=\"loadingMore || config?.isLoading\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\" aria-label=\"loading\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" stroke=\"#E5E7EB\" stroke-width=\"6\" fill=\"none\"/>\n <path d=\"M45 25a20 20 0 0 0-20-20\" stroke=\"#4F46E5\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 25 25\" to=\"360 25 25\"\n dur=\"0.8s\" repeatCount=\"indefinite\"/>\n </path>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n\n <ng-template #optionTestTypeIconTpl let-kind=\"kind\">\n <span *ngIf=\"kind === 'mobile'\" class=\"cqa-inline-flex cqa-flex-shrink-0 cqa-items-center\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/>\n <path d=\"M6 5a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2v-14\"/>\n <path d=\"M11 4h2\"/>\n <path d=\"M12 17v.01\"/>\n </svg>\n </span>\n <span *ngIf=\"kind === 'web'\" class=\"cqa-inline-flex cqa-flex-shrink-0 cqa-items-center\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/>\n <path d=\"M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0\"/>\n <path d=\"M3.6 9h16.8\"/>\n <path d=\"M3.6 15h16.8\"/>\n <path d=\"M11.5 3a17 17 0 0 0 0 18\"/>\n <path d=\"M12.5 3a17 17 0 0 1 0 18\"/>\n </svg>\n </span>\n <span *ngIf=\"kind === 'other'\" class=\"cqa-inline-flex cqa-flex-shrink-0 cqa-items-center\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6.5h16v11H4z\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n <path d=\"M8 6.5V5h8v1.5\" stroke=\"#9CA3AF\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>\n </span>\n </ng-template>\n</div>" }]
|
|
942
942
|
}], propDecorators: { form: [{
|
|
943
943
|
type: Input
|
|
944
944
|
}], config: [{
|
|
@@ -963,4 +963,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
963
963
|
type: HostListener,
|
|
964
964
|
args: ['document:click', ['$event']]
|
|
965
965
|
}] } });
|
|
966
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFvQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBeUV2SyxNQUFNLE9BQU8sMkJBQTJCO0lBTHhDO1FBTVcscUJBQWdCLEdBQVcsZ0JBQWdCLENBQUM7UUFDNUMsNEJBQXVCLEdBQVcsaUJBQWlCLENBQUM7UUFHbkQsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBdUQsQ0FBQztRQUMxRixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDakQscUVBQXFFO1FBQzNELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFDNUUsd0VBQXdFO1FBQzlELGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQztRQUN4RSxzSkFBc0o7UUFDNUksbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQztRQUs5RSxnRkFBZ0Y7UUFDaEYsb0JBQWUsR0FBMkIsRUFBRSxDQUFDO1FBR3JDLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUM5QixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUdwQjs7O1dBR0c7UUFDSyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDckM7Ozs7V0FJRztRQUNLLDRCQUF1QixHQUFHLEtBQUssQ0FBQztRQUNoQyxrQkFBYSxHQUFHLEdBQUcsRUFBRTtZQUMz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SUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFBRTt3QkFBQyxNQUFNLEdBQUU7cUJBQzlDO2lCQUNGO3FCQUFNO29CQUNMLDJGQUEyRjtvQkFDM0YsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztpQkFDdEM7YUFDRjtRQUNILENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDeEMsSUFBSTtZQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7U0FBRTtRQUFDLE1BQU0sR0FBRTtJQUMzRCxDQUFDOzt3SEFyNkJVLDJCQUEyQjs0R0FBM0IsMkJBQTJCLHVmQWVJLFVBQVUsa0RDeEZ0RCxxeWhCQW9QTTsyRkQzS08sMkJBQTJCO2tCQUx2QyxTQUFTOytCQUNFLG9CQUFvQixtQkFFYix1QkFBdUIsQ0FBQyxNQUFNOzhCQUt0QyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTTtnQkFFb0MsU0FBUztzQkFBbkQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNlLE1BQU07c0JBQTdELFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQTRzQnRELG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRTZWxlY3QsIE1hdFNlbGVjdENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5cbi8vIExvY2FsIG9wdGlvbiBtb2RlbCAocHJldmlvdXNseSBpbXBvcnRlZCBmcm9tIHJlbW92ZWQgY3FhLXNlbGVjdCBjb21wb25lbnQpXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE9wdGlvbiB7XG4gIGlkPzogYW55O1xuICB2YWx1ZT86IGFueTtcbiAgbmFtZT86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBlLmcuIE1PQklMRSwgQlJPV1NFUiDigJQgc2hvd24gYXMgYSBsZWFkaW5nIGljb24gaW4gdGhlIGRyb3Bkb3duIHdoZW4gc2V0ICovXG4gIHRlc3RUeXBlPzogc3RyaW5nO1xuICBzdGF0dXNDb2xvcj86IHN0cmluZztcbiAgZHVyYXRpb25Gb3JtYXR0ZWQ/OiBzdHJpbmc7XG4gIHJ1bk51bWJlckxhYmVsPzogc3RyaW5nO1xuICBoYXNIb3VyUnVuPzogYm9vbGVhbjtcbiAgaGFzTWludXRlUnVuPzogYm9vbGVhbjtcbiAgcnVuRGF0ZUxhYmVsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gIGtleTogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sPzogYm9vbGVhbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBtdWx0aXBsZT86IGJvb2xlYW47XG4gIHNlYXJjaGFibGU/OiBib29sZWFuO1xuICAvKiogQ29udHJvbHMgaG93IHNlbGVjdGlvbiBpbmRpY2F0b3IgaXMgc2hvd24gZm9yIG11bHRpLXNlbGVjdCBvcHRpb25zLiAqL1xuICBvcHRpb25TdHlsZT86ICdjaGVja21hcmsnIHwgJ2NoZWNrYm94JztcbiAgLyoqIFNob3cgYSAnU2VsZWN0IEFsbCcgb3B0aW9uIGF0IHRoZSB0b3AgKG11bHRpLXNlbGVjdCBvbmx5KS4gKi9cbiAgc2hvd1NlbGVjdEFsbD86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gbGFiZWwgZm9yIHRoZSAnU2VsZWN0IEFsbCcgb3B0aW9uLiBEZWZhdWx0cyB0byAnQWxsJy4gKi9cbiAgc2VsZWN0QWxsTGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBjbG9zZSB0aGUgcGFuZWwgd2hlbiBhbiBvcHRpb24gaXMgc2VsZWN0ZWQgKHVzZWZ1bCBmb3IgbXVsdGktc2VsZWN0IGluIGhlYWRlcnMpLiAqL1xuICBjbG9zZU9uU2VsZWN0PzogYm9vbGVhbjtcbiAgLyoqIFByb3ZpZGUgYSBkZWZhdWx0IHNlbGVjdGVkIHZhbHVlIChvciBhcnJheSBmb3IgbXVsdGktc2VsZWN0KSBpZiB0aGUgY29udHJvbCBoYXMgbm8gdmFsdWUgeWV0LiAqL1xuICBzZWxlY3RlZFZhbHVlPzogYW55IHwgYW55W107XG4gIC8qKiBPcHRpb25hbCBjYWxsYmFjayBpbnZva2VkIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4gKi9cbiAgb25DaGFuZ2U/OiAodmFsdWU6IGFueSwgZXZlbnQ/OiBNYXRTZWxlY3RDaGFuZ2UpID0+IHZvaWQ7XG4gIC8qKiBFbmFibGUgc2VydmVyLXNpZGUgc2VhcmNoIG1vZGU7IGNvbXBvbmVudCB3aWxsIGVtaXQgc2VhcmNoIGluc3RlYWQgb2YgbG9jYWwgZmlsdGVyaW5nLiAqL1xuICBzZXJ2ZXJTZWFyY2g/OiBib29sZWFuO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCB0cmlnZ2VycyBhbiBpbml0aWFsIHNlYXJjaCBlbWl0IG9uIHBhbmVsIG9wZW4gKHNlcnZlclNlYXJjaCBtb2RlIG9ubHkpLlxuICAgKiBEZWZhdWx0cyB0byBmYWxzZSBzbyBvcGVuaW5nIHRoZSBkcm9wZG93biBkb2VzIE5PVCBjYWxsIHRoZSBBUEkuXG4gICAqL1xuICBpbml0aWFsRmV0Y2hPbk9wZW4/OiBib29sZWFuO1xuICAvKiogSW5kaWNhdGVzIG1vcmUgcmVzdWx0cyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwuICovXG4gIGhhc01vcmU/OiBib29sZWFuO1xuICAvKiogT3B0aW9uYWwgbG9hZGluZyBmbGFnIGNvbnRyb2xsZWQgYnkgY29uc3VtZXIgdG8gc2hvdyBsb2FkaW5nIHN0YXRlLiAqL1xuICBpc0xvYWRpbmc/OiBib29sZWFuO1xuICAvKiogT3B0aW9uYWwgY2FsbGJhY2sgZm9yIHNlcnZlci1zaWRlIHNlYXJjaCB3aGVuIHF1ZXJ5IGNoYW5nZXMuICovXG4gIG9uU2VhcmNoPzogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBJZiB0cnVlLCByZW5kZXJzIHRlc3RUeXBlIGljb25zIChtb2JpbGUvd2ViL290aGVyKSBiZWZvcmUgbGFiZWxzLiAqL1xuICBzaG93VGVzdFR5cGVJY29uPzogYm9vbGVhbjtcbiAgLyoqIE9wdGlvbmFsIGNhbGxiYWNrIHdoZW4gbW9yZSBkYXRhIGlzIHJlcXVlc3RlZCAoaW5maW5pdGUgc2Nyb2xsKS4gKi9cbiAgb25Mb2FkTW9yZT86IChxdWVyeT86IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIE9wdGlvbmFsIHJlZ2V4IHBhdHRlcm4gb3IgZnVuY3Rpb24gdG8gaGlnaGxpZ2h0IHBhcnRzIG9mIG9wdGlvbiB0ZXh0LiAqL1xuICBoaWdobGlnaHRQYXR0ZXJuPzogUmVnRXhwIHwgc3RyaW5nIHwgKCh0ZXh0OiBzdHJpbmcpID0+IHN0cmluZyk7XG4gIC8qKiBXaGVuIHRydWUgKGFuZCBzZWFyY2hhYmxlKSwgYWxsb3dzIGFkZGluZyB0aGUgY3VycmVudCBzZWFyY2ggdGV4dCBhcyBhIG5ldyBvcHRpb24gdmlhIGFuIFwiQWRkICc8dmFsdWU+J1wiIGNob2ljZS4gKi9cbiAgYWxsb3dDdXN0b21WYWx1ZT86IGJvb2xlYW47XG4gIG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdO1xuICBpc0NvbXBhcmVSdW5zPzogYm9vbGVhbjtcbiAgdmFsdWVCeT86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGV4dHJhIENTUyBjbGFzcyBhcHBlbmRlZCB0byB0aGUgbWF0LXNlbGVjdCBwYW5lbCAodXNlIGZvciBzY29wZWQgb3ZlcmxheSB0YXJnZXRpbmcpLiAqL1xuICBleHRyYVBhbmVsQ2xhc3M/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1keW5hbWljLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNTZWxlY3RGaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgcmVhZG9ubHkgU0VMRUNUX0FMTF9WQUxVRTogc3RyaW5nID0gJ19fc2VsZWN0X2FsbF9fJztcbiAgcmVhZG9ubHkgQUREX0NVU1RPTV9WQUxVRV9QUkVGSVg6IHN0cmluZyA9ICdfX2FkZF9jdXN0b21fXzonO1xuICBASW5wdXQoKSBmb3JtITogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBjb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBhbnk7IGV2ZW50OiBNYXRTZWxlY3RDaGFuZ2UgfT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHMgd2hlbiB1c2VyIHR5cGVzIGluIHNlYXJjaCBib3ggKHVzZWZ1bCBmb3Igc2VydmVyIHNlYXJjaCkgKi9cbiAgQE91dHB1dCgpIHNlYXJjaENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuICAvKiogRW1pdHMgd2hlbiB0aGUgY29tcG9uZW50IHJlcXVlc3RzIG1vcmUgZGF0YSBmb3IgdGhlIGN1cnJlbnQgcXVlcnkgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHRoZSB1c2VyIGNob29zZXMgdG8gYWRkIGEgY3VzdG9tIHZhbHVlIChhbGxvd0N1c3RvbVZhbHVlOiB0cnVlKS4gQ29uc3VtZXIgc2hvdWxkIGFkZCB0aGUgdmFsdWUgdG8gb3B0aW9ucyBhbmQgc2V0IHRoZSBjb250cm9sIHZhbHVlLiAqL1xuICBAT3V0cHV0KCkgYWRkQ3VzdG9tVmFsdWUgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4oKTtcblxuICBAVmlld0NoaWxkKCdzZWxlY3RSZWYnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VsZWN0UmVmPzogTWF0U2VsZWN0O1xuICBAVmlld0NoaWxkKCdob3N0JywgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBFbGVtZW50UmVmIH0pIGhvc3RFbD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8vIE11c3QgYmUgcHVibGljIGZvciB0ZW1wbGF0ZSBhY2Nlc3MgaW4gQW5ndWxhcidzIHN0cmljdCB0ZW1wbGF0ZSBjaGVja2luZyBtb2RlXG4gIHNlYXJjaFRleHRCeUtleTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIG91dHNpZGVDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBsb2FkTW9yZU9ic2VydmVyPzogSW50ZXJzZWN0aW9uT2JzZXJ2ZXI7XG4gIHByaXZhdGUgbGFzdE9wdGlvbnNMZW5ndGggPSAwO1xuICBsb2FkaW5nTW9yZSA9IGZhbHNlO1xuICBwcml2YXRlIHBhbmVsU2Nyb2xsRWw/OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBkb2N1bWVudEtleWRvd25MaXN0ZW5lcj86IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEd1YXJkIHRvIGVuc3VyZSBsb2FkLW1vcmUgaXMgb25seSB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIHVzZXIgaGFzIHNjcm9sbGVkXG4gICAqIGF0IGxlYXN0IG9uY2Ugc2luY2Ugb3BlbmluZyB0aGUgcGFuZWwuIFByZXZlbnRzIGF1dG8tbG9hZCBvbiBvcGVuLlxuICAgKi9cbiAgcHJpdmF0ZSBoYXNTY3JvbGxlZFNpbmNlT3BlbiA9IGZhbHNlO1xuICAvKipcbiAgICogVHJ1ZSB3aGVuIHRoZSBsb2FkLW1vcmUgc2VudGluZWwgaXMgY3VycmVudGx5IGluIHZpZXcuIFVzZWQgdG8gdHJpZ2dlciBvbmx5IHdoZW5cbiAgICogdGhlIHNlbnRpbmVsIHRyYW5zaXRpb25zIGZyb20gb3V0LW9mLXZpZXcgdG8gaW4tdmlldyAodXNlciBzY3JvbGxlZCB0byBib3R0b20gYWdhaW4pLFxuICAgKiBub3Qgd2hlbiBpdCBzdGF5cyBpbiB2aWV3IGFmdGVyIG5ldyBkYXRhIGFycml2ZXMgKHdoaWNoIHdvdWxkIGNhdXNlIHJlcGVhdGVkIEFQSSBjYWxscykuXG4gICAqL1xuICBwcml2YXRlIHNlbnRpbmVsQ3VycmVudGx5SW5WaWV3ID0gZmFsc2U7XG4gIHByaXZhdGUgb25QYW5lbFNjcm9sbCA9ICgpID0+IHtcbiAgICB0aGlzLmhhc1Njcm9sbGVkU2luY2VPcGVuID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5oYXNNb3JlIHx8IHRoaXMubG9hZGluZ01vcmUpIHJldHVybjtcbiAgICBjb25zdCBlbCA9IHRoaXMucGFuZWxTY3JvbGxFbDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgY29uc3QgbmVhckJvdHRvbSA9IGVsLnNjcm9sbFRvcCArIGVsLmNsaWVudEhlaWdodCA+PSBlbC5zY3JvbGxIZWlnaHQgLSA0ODsgLy8gfjMgb3B0aW9uIHJvd3NcbiAgICBpZiAobmVhckJvdHRvbSAmJiAhdGhpcy5zZW50aW5lbEN1cnJlbnRseUluVmlldykge1xuICAgICAgdGhpcy5zZW50aW5lbEN1cnJlbnRseUluVmlldyA9IHRydWU7XG4gICAgICB0aGlzLmxvYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXkgfHwgJyc7XG4gICAgICBjb25zdCBxID0gdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSB8fCAnJztcbiAgICAgIHRoaXMubG9hZE1vcmUuZW1pdCh7IGtleSwgcXVlcnk6IHEgfSk7XG4gICAgICB0cnkgeyB0aGlzLmNvbmZpZy5vbkxvYWRNb3JlPy4ocSk7IH0gY2F0Y2gge31cbiAgICB9IGVsc2UgaWYgKCFuZWFyQm90dG9tKSB7XG4gICAgICB0aGlzLnNlbnRpbmVsQ3VycmVudGx5SW5WaWV3ID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcgfHwgIXRoaXMuY29uZmlnLmtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcWEtZHluYW1pYy1zZWxlY3Q6IGlucHV0IFwiY29uZmlnLmtleVwiIGlzIHJlcXVpcmVkLicpO1xuICAgIH1cbiAgICB0aGlzLmFwcGx5U2VsZWN0ZWRWYWx1ZUlmTmVlZGVkKCk7XG4gICAgdGhpcy5zeW5jRGlzYWJsZWRTdGF0ZSgpO1xuICAgIHRoaXMubGFzdE9wdGlvbnNMZW5ndGggPSAodGhpcy5jb25maWc/Lm9wdGlvbnMgfHwgW10pLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBkaXNwbGF5UGxhY2Vob2xkZXIoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybiB0aGlzLmNvbmZpZz8ucGxhY2Vob2xkZXI7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5mb3JtLmdldChrZXkpPy52YWx1ZTtcbiAgICByZXR1cm4gdGhpcy5oYXNFeGlzdGluZ1ZhbHVlKGNvbnRyb2xWYWx1ZSkgPyB1bmRlZmluZWQgOiB0aGlzLmNvbmZpZz8ucGxhY2Vob2xkZXI7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCdjb25maWcnIGluIGNoYW5nZXMgfHwgJ2Zvcm0nIGluIGNoYW5nZXMpIHtcbiAgICAgIHRoaXMuc3luY0Rpc2FibGVkU3RhdGUoKTtcbiAgICB9XG4gICAgaWYgKCdjb25maWcnIGluIGNoYW5nZXMpIHtcbiAgICAgIC8vIFdoZW4gY29uZmlnIGNoYW5nZXMgKGluY2x1ZGluZyB0b2dnbGluZyBtdWx0aXBsZSksIGVuc3VyZSBjb250cm9sIHZhbHVlIHNoYXBlIG1hdGNoZXNcbiAgICAgIHRoaXMuc3luY0NvbnRyb2xWYWx1ZUZvck11bHRpcGxlTW9kZSgpO1xuICAgICAgdGhpcy5hcHBseVNlbGVjdGVkVmFsdWVJZk5lZWRlZCgpO1xuICAgICAgLy8gU3luYyBsb2FkaW5nTW9yZSB3aXRoIGNvbmZpZy5pc0xvYWRpbmcgd2hlbiBwcm92aWRlZCBieSBwYXJlbnRcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHBhcmVudCB0byBjb250cm9sIGxvYWRpbmcgc3RhdGUgKGUuZy4sIGR1cmluZyBsb2FkIG1vcmUgb3BlcmF0aW9ucylcbiAgICAgIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IHRoaXMuY29uZmlnLmlzTG9hZGluZztcbiAgICAgIH1cbiAgICAgIC8vIFJlc2V0IGxvYWRpbmdNb3JlIHdoZW4gbmV3IG9wdGlvbnMgYXJyaXZlIChvcHRpb25zIGxlbmd0aCBpbmNyZWFzZWQpXG4gICAgICBjb25zdCBsZW4gPSAodGhpcy5jb25maWc/Lm9wdGlvbnMgfHwgW10pLmxlbmd0aDtcbiAgICAgIGlmIChsZW4gPiB0aGlzLmxhc3RPcHRpb25zTGVuZ3RoKSB7XG4gICAgICAgIC8vIFJlc2V0IGxvYWRpbmcgc3RhdGUgd2hlbiBuZXcgZGF0YSBhcnJpdmVzLCB1bmxlc3MgcGFyZW50IGV4cGxpY2l0bHkgc2F5cyBzdGlsbCBsb2FkaW5nXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBPbmx5IGF1dG8tcmVzZXQgaWYgcGFyZW50IGRvZXNuJ3QgY29udHJvbCBsb2FkaW5nIHN0YXRlXG4gICAgICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RPcHRpb25zTGVuZ3RoID0gbGVuO1xuICAgICAgLy8gSWYgY29uc3VtZXIgaW5kaWNhdGVzIG5vIG1vcmUgcmVzdWx0cywgY2xlYXIgbG9hZGluZyBzdGF0ZSBhbmQgYW55IG9ic2VydmVyc1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZz8uaGFzTW9yZSkge1xuICAgICAgICAvLyBDbGVhciBsb2FkaW5nIHN0YXRlIHdoZW4gbm8gbW9yZSByZXN1bHRzLCB1bmxlc3MgcGFyZW50IGV4cGxpY2l0bHkgc2F5cyBzdGlsbCBsb2FkaW5nXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9hZE1vcmVPYnNlcnZlcikge1xuICAgICAgICAgIHRyeSB7IHRoaXMubG9hZE1vcmVPYnNlcnZlci5kaXNjb25uZWN0KCk7IH0gY2F0Y2gge31cbiAgICAgICAgICB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIElmIHBhbmVsIGlzIG9wZW4gYW5kIGhhc01vcmUgaXMgdHJ1ZSwgZW5zdXJlIHRoZSBzZW50aW5lbCBpcyBiZWluZyBvYnNlcnZlZC5cbiAgICAgIGlmICh0aGlzLnNlbGVjdFJlZj8ucGFuZWxPcGVuICYmIHRoaXMuY29uZmlnPy5oYXNNb3JlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXR1cExvYWRNb3JlT2JzZXJ2ZXIoKSwgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgnZm9ybScgaW4gY2hhbmdlcyAmJiAhY2hhbmdlc1snZm9ybSddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmFwcGx5U2VsZWN0ZWRWYWx1ZUlmTmVlZGVkKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBhbmVsQ2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGN0Yy1zZWxlY3QtcGFuZWwgJHt0aGlzLmlzTXVsdGlwbGUgPyAnbXVsdGlwbGUnIDogJyd9ICR7dGhpcy5jb25maWc/LmlzQ29tcGFyZVJ1bnMgPyAnY29tcGFyZS1ydW5zLXNlbGVjdC1wYW5lbCcgOiAnJ30gJHt0aGlzLmNvbmZpZz8uZXh0cmFQYW5lbENsYXNzID8/ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgZ2V0IGlzTXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHRoaXMuY29uZmlnPy5tdWx0aXBsZSk7XG4gIH1cblxuICBnZXQgc2luZ2xlU2VsZWN0ZWREaXNwbGF5TGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0gfHwgdGhpcy5pc011bHRpcGxlKSByZXR1cm4gJyc7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5mb3JtLmdldChrZXkpPy52YWx1ZTtcbiAgICBpZiAoY29udHJvbFZhbHVlID09PSBudWxsIHx8IGNvbnRyb2xWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGNvbnRyb2xWYWx1ZSA9PT0gJycpIHJldHVybiAnJztcbiAgICBjb25zdCBtYXRjaGVkT3B0aW9uID0gKHRoaXMuY29uZmlnPy5vcHRpb25zIHx8IFtdKS5maW5kKFxuICAgICAgKG9wdCkgPT4gdGhpcy5nZXRPcHRpb25WYWx1ZShvcHQpID09PSBjb250cm9sVmFsdWUgfHwgU3RyaW5nKHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0KSkgPT09IFN0cmluZyhjb250cm9sVmFsdWUpXG4gICAgKTtcbiAgICBpZiAobWF0Y2hlZE9wdGlvbikge1xuICAgICAgcmV0dXJuIFN0cmluZyhtYXRjaGVkT3B0aW9uLm5hbWUgPz8gbWF0Y2hlZE9wdGlvbi5sYWJlbCA/PyBtYXRjaGVkT3B0aW9uLnZhbHVlID8/IG1hdGNoZWRPcHRpb24uaWQgPz8gJycpO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKGNvbnRyb2xWYWx1ZSk7XG4gIH1cblxuICAvKiogUmVzb2x2ZWQgb3B0aW9uIGZvciBzaW5nbGUtc2VsZWN0IHRyaWdnZXIgKGljb24gKyBsYWJlbCkuICovXG4gIGdldCBzaW5nbGVTZWxlY3RlZE9wdGlvbigpOiBTZWxlY3RPcHRpb24gfCBudWxsIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0gfHwgdGhpcy5pc011bHRpcGxlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KGtleSk/LnZhbHVlO1xuICAgIGlmIChjb250cm9sVmFsdWUgPT09IG51bGwgfHwgY29udHJvbFZhbHVlID09PSB1bmRlZmluZWQgfHwgY29udHJvbFZhbHVlID09PSAnJykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbWF0Y2hlZCA9ICh0aGlzLmNvbmZpZz8ub3B0aW9ucyB8fCBbXSkuZmluZChcbiAgICAgIChvcHQpID0+IHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0KSA9PT0gY29udHJvbFZhbHVlIHx8IFN0cmluZyh0aGlzLmdldE9wdGlvblZhbHVlKG9wdCkpID09PSBTdHJpbmcoY29udHJvbFZhbHVlKVxuICAgICk7XG4gICAgcmV0dXJuIG1hdGNoZWQgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIEFQSSB0ZXN0VHlwZSBzdHJpbmdzIHRvIGljb24gdmFyaWFudHMuIFVua25vd24gbm9uLWVtcHR5IHZhbHVlcyB1c2UgJ290aGVyJy5cbiAgICovXG4gIHRlc3RUeXBlSWNvbktpbmQob3B0OiBTZWxlY3RPcHRpb24gfCBudWxsIHwgdW5kZWZpbmVkKTogJ21vYmlsZScgfCAnd2ViJyB8ICdvdGhlcicgfCBudWxsIHtcbiAgICBjb25zdCByYXcgPSBvcHQ/LnRlc3RUeXBlO1xuICAgIGlmIChyYXcgPT0gbnVsbCB8fCBTdHJpbmcocmF3KS50cmltKCkgPT09ICcnKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB1ID0gU3RyaW5nKHJhdykudHJpbSgpLnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKHUgPT09ICdNT0JJTEUnKSByZXR1cm4gJ21vYmlsZSc7XG4gICAgaWYgKHUgPT09ICdCUk9XU0VSJyB8fCB1ID09PSAnV0VCJykgcmV0dXJuICd3ZWInO1xuICAgIHJldHVybiAnb3RoZXInO1xuICB9XG5cbiAgZ2V0IGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHRoaXMuY29uZmlnPy5kaXNhYmxlZCk7XG4gIH1cbiAgXG4gIGdldCB1c2VDaGVja2JveFN0eWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTXVsdGlwbGUgJiYgKHRoaXMuY29uZmlnPy5vcHRpb25TdHlsZSA9PT0gJ2NoZWNrYm94Jyk7XG4gIH1cbiAgXG4gIGdldCBhbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNNdWx0aXBsZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBjb250cm9sLnZhbHVlIGFzIGFueVtdO1xuICAgIGNvbnN0IGFsbElkcyA9IHRoaXMuZ2V0QWxsT3B0aW9uSWRzKCk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNlbGVjdGVkKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghYWxsSWRzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBhbGxJZHMuZXZlcnkoaWQgPT4gc2VsZWN0ZWQuaW5jbHVkZXMoaWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9Cb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHYgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICh2ID09PSAndHJ1ZScgfHwgdiA9PT0gJzEnKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh2ID09PSAnZmFsc2UnIHx8IHYgPT09ICcwJyB8fCB2ID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGFueSBvdGhlciBub24tZW1wdHkgc3RyaW5nIHRyZWF0ZWQgYXMgdHJ1dGh5XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gdmFsdWUgIT09IDA7XG4gICAgfVxuICAgIHJldHVybiAhIXZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmFsdWUgZm9yIGFuIG9wdGlvbiBiYXNlZCBvbiB0aGUgdmFsdWVCeSBwcm9wZXJ0eS5cbiAgICogSWYgdmFsdWVCeSBpcyBwcm92aWRlZCwgdXNlIHRoYXQgcHJvcGVydHkgZnJvbSB0aGUgb3B0aW9uLlxuICAgKiBPdGhlcndpc2UsIGZhbGwgYmFjayB0byBpZCA/PyB2YWx1ZSAoZGVmYXVsdCBiZWhhdmlvcikuXG4gICAqIE11c3QgYmUgcHVibGljIGZvciB0ZW1wbGF0ZSBhY2Nlc3MuXG4gICAqL1xuICBnZXRPcHRpb25WYWx1ZShvcHQ6IFNlbGVjdE9wdGlvbik6IGFueSB7XG4gICAgaWYgKHRoaXMuY29uZmlnPy52YWx1ZUJ5KSB7XG4gICAgICAvLyBVc2UgdGhlIHByb3BlcnR5IHNwZWNpZmllZCBieSB2YWx1ZUJ5XG4gICAgICByZXR1cm4gKG9wdCBhcyBhbnkpW3RoaXMuY29uZmlnLnZhbHVlQnldO1xuICAgIH1cbiAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiB1c2UgaWQgPz8gdmFsdWVcbiAgICByZXR1cm4gb3B0LmlkID8/IG9wdC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIHRoZSBmb3JtIGNvbnRyb2wncyBkaXNhYmxlZCBzdGF0ZSBmcm9tIGNvbmZpZy5cbiAgICogVXNlIHRoZSBGb3JtQ29udHJvbCBBUEkgaW5zdGVhZCBvZiBbZGlzYWJsZWRdIGluIHRoZSB0ZW1wbGF0ZSB0byBhdm9pZCBBbmd1bGFyJ3NcbiAgICogXCJjaGFuZ2VkIGFmdGVyIGNoZWNrZWRcIiAvIHJlYWN0aXZlIGZvcm1zIGRpc2FibGVkLWF0dHJpYnV0ZSB3YXJuaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzeW5jRGlzYWJsZWRTdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybjtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuO1xuICAgIGNvbnN0IHNob3VsZERpc2FibGUgPSB0aGlzLnRvQm9vbGVhbih0aGlzLmNvbmZpZz8uZGlzYWJsZWQpO1xuICAgIGlmIChzaG91bGREaXNhYmxlKSB7XG4gICAgICBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29udHJvbFZhbHVlRm9yTXVsdGlwbGVNb2RlKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlID09IG51bGwpIHJldHVybjtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoW2N1cnJlbnRWYWx1ZV0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoY3VycmVudFZhbHVlLmxlbmd0aCA/IGN1cnJlbnRWYWx1ZVswXSA6IG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U2VsZWN0ZWRWYWx1ZUlmTmVlZGVkKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm47XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IHRoaXMuY29uZmlnPy5zZWxlY3RlZFZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgXG4gICAgLy8gSWYgdGhlcmUncyBhbiBleGlzdGluZyB2YWx1ZSwgZG9uJ3Qgb3ZlcnJpZGUgaXRcbiAgICBpZiAodGhpcy5oYXNFeGlzdGluZ1ZhbHVlKGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gRm9yIG11bHRpLXNlbGVjdDogaWYgY3VycmVudFZhbHVlIGlzIGFuIGVtcHR5IGFycmF5IFtdLCB0aGlzIGlzIGFuIGV4cGxpY2l0IHVzZXIgY2hvaWNlIHRvIGNsZWFyXG4gICAgLy8gRG9uJ3QgcmVzdG9yZSBmcm9tIHNlbGVjdGVkVmFsdWUgLSByZXNwZWN0IHRoZSB1c2VyJ3MgZGVjaXNpb24gdG8gZGVzZWxlY3QgYWxsXG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkgJiYgY3VycmVudFZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdGVkVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRWYWx1ZSkgPyBzZWxlY3RlZFZhbHVlIDogW3NlbGVjdGVkVmFsdWVdKS5maWx0ZXIoXG4gICAgICAgICh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkLFxuICAgICAgKTtcbiAgICAgIGlmICghbm9ybWFsaXplZC5sZW5ndGgpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUobm9ybWFsaXplZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gQXJyYXkuaXNBcnJheShzZWxlY3RlZFZhbHVlKVxuICAgICAgICA/IChzZWxlY3RlZFZhbHVlLmxlbmd0aCA/IHNlbGVjdGVkVmFsdWVbMF0gOiB1bmRlZmluZWQpXG4gICAgICAgIDogc2VsZWN0ZWRWYWx1ZTtcbiAgICAgIGlmIChub3JtYWxpemVkID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUobm9ybWFsaXplZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzRXhpc3RpbmdWYWx1ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuc29tZSgodmFsKSA9PiB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSAnJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWUudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaXNPcHRpb25TZWxlY3RlZChvcHQ6IFNlbGVjdE9wdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0KTtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udHJvbFZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGNvbnRyb2xWYWx1ZS5pbmNsdWRlcyhvcHRpb25WYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sVmFsdWUgPT09IG9wdGlvblZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxPcHRpb25JZHMoKTogYW55W10ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZz8ub3B0aW9ucyB8fCBbXTtcbiAgICByZXR1cm4gb3B0aW9ucy5tYXAobyA9PiB0aGlzLmdldE9wdGlvblZhbHVlKG8pKS5maWx0ZXIodiA9PiB2ICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgb25Ub2dnbGVTZWxlY3RBbGwoc2VsZWN0OiBNYXRTZWxlY3QpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybjtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuO1xuICAgIGNvbnN0IGFsbElkcyA9IHRoaXMuZ2V0QWxsT3B0aW9uSWRzKCk7XG4gICAgaWYgKCFhbGxJZHMubGVuZ3RoKSByZXR1cm47XG4gICAgaWYgKHRoaXMuYWxsU2VsZWN0ZWQpIHtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoW10sIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKGFsbElkcywgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgfVxuICAgIC8vIEtlZXAgcGFuZWwgb3BlbiBmb3IgY29udGludWVkIHNlbGVjdGlvbnMgaW4gbXVsdGktc2VsZWN0XG4gICAgdHJ5IHsgc2VsZWN0Lm9wZW4oKTsgfSBjYXRjaCB7fVxuICB9XG5cbiAgb25TZWxlY3RPcGVuZWRDaGFuZ2Uob3BlbmVkOiBib29sZWFuLCBfc2VsZWN0OiBNYXRTZWxlY3QpOiB2b2lkIHtcbiAgICBpZiAob3BlbmVkKSB7XG4gICAgICAvLyBFbWl0IGNsaWNrIGV2ZW50IHdoZW4gc2VsZWN0IGlzIG9wZW5lZCAoY2xpY2tlZClcbiAgICAgIHRoaXMuc2VsZWN0Q2xpY2suZW1pdCgpO1xuICAgICAgLy8gUmVzZXQgbG9hZGluZ01vcmUgd2hlbiBvcGVuaW5nIGlmIG9wdGlvbnMgYWxyZWFkeSBleGlzdCAoZG9uJ3Qgc2hvdyBsb2FkZXIgb24gaW5pdGlhbCBvcGVuKVxuICAgICAgaWYgKCh0aGlzLmNvbmZpZz8ub3B0aW9ucyB8fCBbXSkubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgd2Ugb25seSB0cmlnZ2VyIGxvYWQtbW9yZSBhZnRlciBhIHJlYWwgdXNlciBzY3JvbGxcbiAgICAgIHRoaXMuaGFzU2Nyb2xsZWRTaW5jZU9wZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFvcGVuZWQpIHtcbiAgICAgIC8vIFJlc2V0IHNlYXJjaCB0ZXh0IG9uIGNsb3NlIHNvIHRoZSBuZXh0IG9wZW4gc2hvd3MgZnVsbCBsaXN0XG4gICAgICBpZiAodGhpcy5jb25maWc/LmtleSkge1xuICAgICAgICB0aGlzLnNlYXJjaFRleHRCeUtleVt0aGlzLmNvbmZpZy5rZXldID0gJyc7XG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgYW55IHByZXZpb3VzIGN1c3RvbSBsaXN0ZW5lcnMgYXJlIGNsZWFyZWQgKGxlZ2FjeSBjb21wYXRpYmlsaXR5KVxuICAgICAgaWYgKHRoaXMub3V0c2lkZUNsZWFudXApIHtcbiAgICAgICAgdGhpcy5vdXRzaWRlQ2xlYW51cCgpO1xuICAgICAgICB0aGlzLm91dHNpZGVDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgLy8gUmVtb3ZlIGRvY3VtZW50IGtleWJvYXJkIGxpc3RlbmVyXG4gICAgICBpZiAodGhpcy5kb2N1bWVudEtleWRvd25MaXN0ZW5lcikge1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5kb2N1bWVudEtleWRvd25MaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRLZXlkb3duTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBEaXNjb25uZWN0IGxvYWQtbW9yZSBvYnNlcnZlciBpZiBhbnlcbiAgICAgIGlmICh0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIpIHtcbiAgICAgICAgdHJ5IHsgdGhpcy5sb2FkTW9yZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTsgfSBjYXRjaCB7fVxuICAgICAgICB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmUgc2Nyb2xsIGxpc3RlbmVyIGlmIGF0dGFjaGVkXG4gICAgICBpZiAodGhpcy5wYW5lbFNjcm9sbEVsKSB7XG4gICAgICAgIHRyeSB7IHRoaXMucGFuZWxTY3JvbGxFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uUGFuZWxTY3JvbGwpOyB9IGNhdGNoIHt9XG4gICAgICAgIHRoaXMucGFuZWxTY3JvbGxFbCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIC8vIFJlc2V0IGxvYWQtbW9yZSBzdGF0ZSB3aGVuIGNsb3NpbmdcbiAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VudGluZWxDdXJyZW50bHlJblZpZXcgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb2N1cyB0aGUgc2VhcmNoIGJveCBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMuY29uZmlnPy5zZWFyY2hhYmxlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcudHMtc2VsZWN0LXNlYXJjaC1pbnB1dCcpO1xuICAgICAgICBpbnB1dD8uZm9jdXMoKTtcbiAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIC8vIFNlcnZlci1zZWFyY2g6IHJlc2V0IHNlYXJjaCBhbmQgcmVmZXRjaCBmdWxsIGxpc3Qgd2hlbiBwYW5lbCBvcGVucyBzbyB1c2VyIGFsd2F5cyBzZWVzIGEgZnJlc2ggbGlzdC5cbiAgICBpZiAodGhpcy5jb25maWc/LnNlcnZlclNlYXJjaCkge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcua2V5O1xuICAgICAgdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSA9ICcnO1xuICAgICAgdHJ5IHsgdGhpcy5jb25maWcub25TZWFyY2g/LignJyk7IH0gY2F0Y2gge31cbiAgICAgIHRoaXMuc2VhcmNoQ2hhbmdlLmVtaXQoeyBrZXksIHF1ZXJ5OiAnJyB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudG9Cb29sZWFuKHRoaXMuY29uZmlnPy5pbml0aWFsRmV0Y2hPbk9wZW4pKSB7XG4gICAgICAvLyBOb24tc2VydmVyLXNlYXJjaDogb3B0aW9uYWwgaW5pdGlhbCBmZXRjaCBvbiBvcGVuIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5rZXk7XG4gICAgICBjb25zdCBxID0gdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSB8fCAnJztcbiAgICAgIHRyeSB7IHRoaXMuY29uZmlnLm9uU2VhcmNoPy4ocSk7IH0gY2F0Y2gge31cbiAgICAgIHRoaXMuc2VhcmNoQ2hhbmdlLmVtaXQoeyBrZXksIHF1ZXJ5OiBxIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2VudGluZWxDdXJyZW50bHlJblZpZXcgPSBmYWxzZTtcbiAgICB0aGlzLmhhc1Njcm9sbGVkU2luY2VPcGVuID0gZmFsc2U7XG4gICAgLy8gU2V0dXAgaW5maW5pdGUgc2Nyb2xsIG9ic2VydmVyIG9uIHNlbnRpbmVsXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldHVwTG9hZE1vcmVPYnNlcnZlcigpLCAwKTtcbiAgICAvLyBBbHNvIGF0dGFjaCBhIHNjcm9sbCBsaXN0ZW5lciBmYWxsYmFjayBmb3IgcmVsaWFibGUgbG9hZC1tb3JlIHRyaWdnZXJzXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYW5lbHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXQtc2VsZWN0LXBhbmVsJykpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICAgIHRoaXMucGFuZWxTY3JvbGxFbCA9IHBhbmVscy5sZW5ndGggPyBwYW5lbHNbcGFuZWxzLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5wYW5lbFNjcm9sbEVsKSB7XG4gICAgICAgICAgdGhpcy5wYW5lbFNjcm9sbEVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25QYW5lbFNjcm9sbCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfSwgMCk7XG4gICAgXG4gICAgLy8gU2V0dXAgZG9jdW1lbnQtbGV2ZWwga2V5Ym9hcmQgbGlzdGVuZXIgd2hpbGUgdGhlIHBhbmVsIGlzIG9wZW4uXG4gICAgLy8gTmVlZGVkIHRvIHJlbGlhYmx5IGludGVyY2VwdCBrZXkgY29tYm9zIChlLmcuIEN0cmwvQ21kK0EpIHRoYXQgY2FuIHRyaWdnZXIgQW5ndWxhciBNYXRlcmlhbCB0eXBlYWhlYWRcbiAgICAvLyBhbmQgYWNjaWRlbnRhbGx5IGFjdGl2YXRlIHRoZSBcIlNlbGVjdCBBbGxcIiBvcHRpb24gaW4gbXVsdGktc2VsZWN0cy5cbiAgICB0aGlzLnNldHVwRG9jdW1lbnRLZXlkb3duTGlzdGVuZXIoKTtcbiAgfVxuXG4gIG9uU2VhcmNoKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSA9IHZhbHVlID8/ICcnO1xuICAgIGlmICh0aGlzLmNvbmZpZz8uc2VydmVyU2VhcmNoKSB7XG4gICAgICAvLyBGb3Igc2VydmVyLXNpZGUgc2VhcmNoLCBlbWl0IGluc3RlYWQgb2YgbG9jYWwgZmlsdGVyaW5nXG4gICAgICB0cnkgeyB0aGlzLmNvbmZpZy5vblNlYXJjaD8uKHZhbHVlID8/ICcnKTsgfSBjYXRjaCB7fVxuICAgICAgdGhpcy5zZWFyY2hDaGFuZ2UuZW1pdCh7IGtleSwgcXVlcnk6IHZhbHVlID8/ICcnIH0pO1xuICAgICAgLy8gUmVzZXQgaW50ZXJuYWwgcGFnaW5nIHN0YXRlXG4gICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RPcHRpb25zTGVuZ3RoID0gKHRoaXMuY29uZmlnPy5vcHRpb25zIHx8IFtdKS5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMga2V5Ym9hcmQgZXZlbnRzIG9uIHRoZSBzZWFyY2ggaW5wdXQgdG8gZW5hYmxlIG5hdmlnYXRpb24gd2l0aCBhcnJvdyBrZXlzXG4gICAqIGFuZCBzZWxlY3Rpb24gd2l0aCBFbnRlciBrZXksIHdoaWxlIHN0aWxsIGFsbG93aW5nIHR5cGluZyBpbiB0aGUgc2VhcmNoIGJveC5cbiAgICovXG4gIG9uU2VhcmNoSW5wdXRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gZXZlbnQua2V5O1xuXG4gICAgLy8gUHJldmVudCBDdHJsL0NtZCArIEEgZnJvbSB0cmlnZ2VyaW5nIG1hdC1zZWxlY3QgdHlwZWFoZWFkL3NlbGVjdC1hbGwgYmVoYXZpb3JcbiAgICAvLyB3aGVuIHRoZSBkcm9wZG93biB1c2VzIGNoZWNrYm94LXN0eWxlIG11bHRpLXNlbGVjdC5cbiAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdhJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIEhhbmRsZSBuYXZpZ2F0aW9uIGFuZCBzZWxlY3Rpb24ga2V5c1xuICAgIGlmIChrZXkgPT09ICdBcnJvd1VwJyB8fCBrZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAvLyBTdG9wIHRoZSBldmVudCBjb21wbGV0ZWx5IGJlZm9yZSBkb2luZyBhbnl0aGluZ1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICBcbiAgICAgIC8vIE5hdmlnYXRlIGltbWVkaWF0ZWx5IChzeW5jaHJvbm91c2x5KSB0byBwcmV2ZW50IEFuZ3VsYXIgTWF0ZXJpYWwgZnJvbSBwcm9jZXNzaW5nXG4gICAgICB0aGlzLm5hdmlnYXRlT3B0aW9ucyhrZXkgPT09ICdBcnJvd0Rvd24nID8gMSA6IC0xKTtcbiAgICAgIFxuICAgICAgLy8gQmx1ciB0aGUgc2VhcmNoIGlucHV0IGFmdGVyIG5hdmlnYXRpb24gdG8gYWxsb3cgc3Vic2VxdWVudCBhcnJvdyBrZXlzIHRvIHdvcmsgbmF0dXJhbGx5XG4gICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgIC8vIFVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgdG8gYmx1ciBhZnRlciBvdXIgbmF2aWdhdGlvbiBjb21wbGV0ZXNcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBpbnB1dC5ibHVyKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBpZiAoa2V5ID09PSAnRW50ZXInKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy8gQmx1ciB0aGUgc2VhcmNoIGlucHV0XG4gICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgIGlucHV0LmJsdXIoKTtcbiAgICAgIH1cbiAgICAgIC8vIEZpbmQgYW5kIHNlbGVjdCB0aGUgYWN0aXZlIG9wdGlvblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1hdC1zZWxlY3QtcGFuZWwnKTtcbiAgICAgICAgaWYgKHBhbmVsKSB7XG4gICAgICAgICAgY29uc3QgYWN0aXZlT3B0aW9uID0gcGFuZWwucXVlcnlTZWxlY3RvcignLm1hdC1vcHRpb24ubWF0LWFjdGl2ZTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgaWYgKGFjdGl2ZU9wdGlvbikge1xuICAgICAgICAgICAgYWN0aXZlT3B0aW9uLmNsaWNrKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIG5vIGFjdGl2ZSBvcHRpb24sIHRyeSB0byBzZWxlY3QgdGhlIGZpcnN0IGVuYWJsZWQgb3B0aW9uXG4gICAgICAgICAgICBjb25zdCBmaXJzdE9wdGlvbiA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJy5tYXQtb3B0aW9uOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCk6bm90KC50cy1zZWxlY3Qtc2VhcmNoKScpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGZpcnN0T3B0aW9uKSB7XG4gICAgICAgICAgICAgIGZpcnN0T3B0aW9uLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCAxMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIEZvciBFc2NhcGUsIGFsbG93IGl0IHRvIHByb3BhZ2F0ZSAobWF0LXNlbGVjdCB3aWxsIGNsb3NlIHRoZSBwYW5lbClcbiAgICBpZiAoa2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBGb3IgYWxsIG90aGVyIGtleXMgKHR5cGluZyksIHN0b3AgcHJvcGFnYXRpb24gdG8gYWxsb3cgc2VhcmNoIGlucHV0IHRvIHdvcmsgbm9ybWFsbHlcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBvblNlbGVjdEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBIYXJkLWJsb2NrIEN0cmwvQ21kICsgQSBzbyBpdCBjYW4ndCB0cmlnZ2VyIEFuZ3VsYXIgTWF0ZXJpYWwgdHlwZWFoZWFkXG4gICAgLy8gdGhhdCBtYXkgZW5kIHVwIHNlbGVjdGluZyB0aGUgXCJBbGxcIiBvcHRpb24gaW4gY2hlY2tib3gtc3R5bGUgbXVsdGktc2VsZWN0cy5cbiAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09ICdhJyAmJiB0aGlzLmlzTXVsdGlwbGUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBuYXZpZ2F0ZXMgdGhyb3VnaCBvcHRpb25zIHdoZW4gYXJyb3cga2V5cyBhcmUgcHJlc3NlZCBmcm9tIHNlYXJjaCBpbnB1dC5cbiAgICogQHBhcmFtIGRpcmVjdGlvbiAxIGZvciBkb3duLCAtMSBmb3IgdXBcbiAgICovXG4gIHByaXZhdGUgbmF2aWdhdGVPcHRpb25zKGRpcmVjdGlvbjogMSB8IC0xKTogdm9pZCB7XG4gICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWF0LXNlbGVjdC1wYW5lbCcpO1xuICAgIGlmICghcGFuZWwpIHJldHVybjtcblxuICAgIC8vIEdldCBhbGwgZW5hYmxlZCwgbm9uLWRpc2FibGVkIG9wdGlvbnMgKGV4Y2x1ZGluZyBzZWFyY2ggaW5wdXQpXG4gICAgY29uc3QgYWxsT3B0aW9ucyA9IEFycmF5LmZyb20oXG4gICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsKCcubWF0LW9wdGlvbjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpOm5vdCgudHMtc2VsZWN0LXNlYXJjaCknKVxuICAgICkgYXMgSFRNTEVsZW1lbnRbXTtcblxuICAgIGlmIChhbGxPcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gRmluZCBjdXJyZW50bHkgYWN0aXZlIG9wdGlvblxuICAgIGxldCBjdXJyZW50SW5kZXggPSBhbGxPcHRpb25zLmZpbmRJbmRleChvcHQgPT4gb3B0LmNsYXNzTGlzdC5jb250YWlucygnbWF0LWFjdGl2ZScpKTtcblxuICAgIC8vIElmIG5vIGFjdGl2ZSBvcHRpb24sIHN0YXJ0IGF0IHRoZSBmaXJzdCBvbmUgKGZvciBkb3duKSBvciBsYXN0IG9uZSAoZm9yIHVwKVxuICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSB7XG4gICAgICBjdXJyZW50SW5kZXggPSBkaXJlY3Rpb24gPT09IDEgPyAtMSA6IGFsbE9wdGlvbnMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBuZXh0IGluZGV4XG4gICAgY29uc3QgbmV4dEluZGV4ID0gY3VycmVudEluZGV4ICsgZGlyZWN0aW9uO1xuXG4gICAgLy8gQm91bmRzIGNoZWNrXG4gICAgaWYgKG5leHRJbmRleCA8IDAgfHwgbmV4dEluZGV4ID49IGFsbE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFjdGl2ZSBjbGFzcyBmcm9tIGFsbCBvcHRpb25zXG4gICAgYWxsT3B0aW9ucy5mb3JFYWNoKG9wdCA9PiBvcHQuY2xhc3NMaXN0LnJlbW92ZSgnbWF0LWFjdGl2ZScpKTtcblxuICAgIC8vIEFkZCBhY3RpdmUgY2xhc3MgdG8gdGhlIHRhcmdldCBvcHRpb25cbiAgICBjb25zdCB0YXJnZXRPcHRpb24gPSBhbGxPcHRpb25zW25leHRJbmRleF07XG4gICAgdGFyZ2V0T3B0aW9uLmNsYXNzTGlzdC5hZGQoJ21hdC1hY3RpdmUnKTtcbiAgICBcbiAgICAvLyBTY3JvbGwgdGhlIG9wdGlvbiBpbnRvIHZpZXcgaWYgbmVlZGVkXG4gICAgdGFyZ2V0T3B0aW9uLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JywgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIFxuICAgIC8vIEZvY3VzIHRoZSBvcHRpb24gc28gQW5ndWxhciBNYXRlcmlhbCdzIGtleWJvYXJkIG1hbmFnZXIgY2FuIGhhbmRsZSBzdWJzZXF1ZW50IGFycm93IGtleXNcbiAgICAvLyBGb2N1c2luZyBhbiBvcHRpb24gZG9lc24ndCB0cmlnZ2VyIHNlbGVjdGlvbiBpbiBBbmd1bGFyIE1hdGVyaWFsIC0gb25seSBjbGljay9FbnRlciBkb2VzXG4gICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIHRoZSBET00gaXMgdXBkYXRlZCBmaXJzdFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGFyZ2V0T3B0aW9uLmZvY3VzKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbiBpZHMgZm9yIHRoZSBjb25maWd1cmVkIGNvbnRyb2wuXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdGVkSWRzRm9yS2V5KGtleTogc3RyaW5nKTogYW55W10ge1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybiBbXTtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCA/IFt2YWx1ZV0gOiBbXTtcbiAgfVxuXG4gIC8qKiBQcm9ncmFtbWF0aWNhbGx5IGNsb3NlIHRoZSBzZWxlY3QgcGFuZWwgaWYgb3BlbiAqL1xuICBwdWJsaWMgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zZWxlY3RSZWY/LmNsb3NlKCk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgZmlsdGVyZWRPcHRpb25zKGM6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyk6IFNlbGVjdE9wdGlvbltdIHtcbiAgICBjb25zdCB0ID0gKHRoaXMuc2VhcmNoVGV4dEJ5S2V5W2Mua2V5XSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgLy8gSW4gc2VydmVyLXNpZGUgbW9kZSwgcmV0dXJuIG9wdGlvbnMgYXMtaXMgKHBhcmVudCBwcm92aWRlcyBsaXN0KVxuICAgIGlmIChjLnNlcnZlclNlYXJjaCkgcmV0dXJuIGMub3B0aW9ucyB8fCBbXTtcbiAgICAvLyBXaGVuIG5vdCBzZWFyY2hpbmcsIHJldHVybiBmdWxsIGxpc3QgdG8gcHJlc2VydmUgb3JpZ2luYWwgb3JkZXJpbmdcbiAgICBpZiAoIXQpIHJldHVybiBjLm9wdGlvbnMgfHwgW107XG5cbiAgICBjb25zdCBhbGxPcHRpb25zID0gYy5vcHRpb25zIHx8IFtdO1xuICAgIGNvbnN0IGJhc2VGaWx0ZXJlZCA9IGFsbE9wdGlvbnMuZmlsdGVyKChvcHQpID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSBTdHJpbmcob3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiB0ZXh0LmluY2x1ZGVzKHQpO1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24ocykgYXJlIGFsd2F5cyB2aXNpYmxlIHdoaWxlIHNlYXJjaGluZ1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy5nZXRTZWxlY3RlZElkc0ZvcktleShjLmtleSk7XG4gICAgaWYgKCFzZWxlY3RlZElkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBiYXNlRmlsdGVyZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVPZiA9IChvOiBTZWxlY3RPcHRpb24pID0+IHRoaXMuZ2V0T3B0aW9uVmFsdWUobyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25zID0gYWxsT3B0aW9ucy5maWx0ZXIobyA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyh2YWx1ZU9mKG8pKSk7XG5cbiAgICAvLyBNZXJnZSBzZWxlY3RlZCBvcHRpb25zIChrZWVwaW5nIHRoZWlyIG9yaWdpbmFsIG9yZGVyKSB3aXRoIGZpbHRlcmVkIG9uZXMsIGRlLWR1cGxpY2F0ZWRcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxhbnk+KCk7XG4gICAgY29uc3QgbWVyZ2VkOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbyBvZiBzZWxlY3RlZE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHZhbHVlT2Yobyk7XG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFzZWVuLmhhcyh2YWwpKSB7XG4gICAgICAgIHNlZW4uYWRkKHZhbCk7XG4gICAgICAgIG1lcmdlZC5wdXNoKG8pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IG8gb2YgYmFzZUZpbHRlcmVkKSB7XG4gICAgICBjb25zdCB2YWwgPSB2YWx1ZU9mKG8pO1xuICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmICghc2Vlbi5oYXModmFsKSkge1xuICAgICAgICBzZWVuLmFkZCh2YWwpO1xuICAgICAgICBtZXJnZWQucHVzaChvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIC8qKiBXaGVuIGFsbG93Q3VzdG9tVmFsdWUgaXMgdHJ1ZSBhbmQgdGhlIHVzZXIgaGFzIHR5cGVkIGEgdmFsdWUgdGhhdCBpcyBub3QgaW4gb3B0aW9ucywgcmV0dXJucyB0aGF0IHZhbHVlIGZvciB0aGUgXCJBZGRcIiBvcHRpb24uICovXG4gIGdldCBjdXN0b21WYWx1ZVRvQWRkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGMgPSB0aGlzLmNvbmZpZztcbiAgICBpZiAoIWM/LmtleSB8fCAhdGhpcy50b0Jvb2xlYW4oYy5zZWFyY2hhYmxlKSB8fCAhdGhpcy50b0Jvb2xlYW4oYy5hbGxvd0N1c3RvbVZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdCA9ICh0aGlzLnNlYXJjaFRleHRCeUtleVtjLmtleV0gfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG9wdHMgPSBjLm9wdGlvbnMgfHwgW107XG4gICAgY29uc3QgbG93ZXIgPSB0LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IG9wdHMuc29tZSgobykgPT4ge1xuICAgICAgY29uc3QgdiA9IFN0cmluZyhvLm5hbWUgPz8gby5sYWJlbCA/PyBvLnZhbHVlID8/IG8uaWQgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gdiA9PT0gbG93ZXI7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFscmVhZHlFeGlzdHMgPyBudWxsIDogdDtcbiAgfVxuXG4gIGdldCBzaG93QWRkQ3VzdG9tT3B0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbVZhbHVlVG9BZGQgIT09IG51bGw7XG4gIH1cblxuICBnZXQgYWRkQ3VzdG9tU2VudGluZWxWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYgPSB0aGlzLmN1c3RvbVZhbHVlVG9BZGQ7XG4gICAgcmV0dXJuIHYgIT0gbnVsbCA/IGAke3RoaXMuQUREX0NVU1RPTV9WQUxVRV9QUkVGSVh9JHt2fWAgOiAnJztcbiAgfVxuXG4gIC8vIENsb3NlIHdoZW4gYW4gb3B0aW9uIGlzIHNlbGVjdGVkIGlmIHJlcXVlc3RlZC4gQWx3YXlzIGNsb3NlIGZvciBzaW5nbGUtc2VsZWN0LlxuICBvblNlbGVjdGlvbkNoYW5nZShldmVudDogTWF0U2VsZWN0Q2hhbmdlLCBzZWxlY3Q6IE1hdFNlbGVjdCk6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBhZGQtY3VzdG9tLXZhbHVlIHNlbnRpbmVsIChhbGxvd0N1c3RvbVZhbHVlKVxuICAgIGNvbnN0IHJhdyA9IGV2ZW50LnZhbHVlO1xuICAgIGNvbnN0IHNlbnRpbmVsSW5BcnJheSA9IEFycmF5LmlzQXJyYXkocmF3KVxuICAgICAgPyByYXcuZmluZCgodjogYW55KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi5zdGFydHNXaXRoKHRoaXMuQUREX0NVU1RPTV9WQUxVRV9QUkVGSVgpKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGlzQWRkQ3VzdG9tID1cbiAgICAgICh0eXBlb2YgcmF3ID09PSAnc3RyaW5nJyAmJiByYXcuc3RhcnRzV2l0aCh0aGlzLkFERF9DVVNUT01fVkFMVUVfUFJFRklYKSkgfHwgc2VudGluZWxJbkFycmF5ICE9IG51bGw7XG5cbiAgICBpZiAoaXNBZGRDdXN0b20pIHtcbiAgICAgIGNvbnN0IHNlbnRpbmVsU3RyID0gdHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgPyByYXcgOiBzZW50aW5lbEluQXJyYXk7XG4gICAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhzZW50aW5lbFN0cikuc2xpY2UodGhpcy5BRERfQ1VTVE9NX1ZBTFVFX1BSRUZJWC5sZW5ndGgpO1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICAgIGlmIChrZXkgJiYgdGhpcy5mb3JtKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KGNvbnRyb2wudmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IChjb250cm9sLnZhbHVlIGFzIGFueVtdKS5maWx0ZXIoXG4gICAgICAgICAgICAgICh2OiBhbnkpID0+IHR5cGVvZiB2ICE9PSAnc3RyaW5nJyB8fCAhdi5zdGFydHNXaXRoKHRoaXMuQUREX0NVU1RPTV9WQUxVRV9QUkVGSVgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShmaWx0ZXJlZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkQ3VzdG9tVmFsdWUuZW1pdCh7IGtleToga2V5ID8/ICcnLCB2YWx1ZSB9KTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZz8uc2VhcmNoYWJsZSAmJiB0aGlzLmNvbmZpZz8ua2V5KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dEJ5S2V5W3RoaXMuY29uZmlnLmtleV0gPSAnJztcbiAgICAgIH1cbiAgICAgIHRyeSB7IHNlbGVjdC5jbG9zZSgpOyB9IGNhdGNoIHt9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEhhbmRsZSBzZWxlY3QtYWxsIHNlbnRpbmVsIGluIG11bHRpLXNlbGVjdFxuICAgIGlmICh0aGlzLmlzTXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheShldmVudC52YWx1ZSkgJiYgZXZlbnQudmFsdWUuaW5jbHVkZXModGhpcy5TRUxFQ1RfQUxMX1ZBTFVFKSkge1xuICAgICAgLy8gUmVtb3ZlIHNlbnRpbmVsIGFuZCB0b2dnbGUgYWxsXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgICAgaWYgKGtleSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICAgICAgLy8gVG9nZ2xlIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGVcbiAgICAgICAgdGhpcy5vblRvZ2dsZVNlbGVjdEFsbChzZWxlY3QpO1xuICAgICAgICAvLyBFbnN1cmUgc2VudGluZWwgaXMgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IChjb250cm9sLnZhbHVlIGFzIGFueVtdKS5maWx0ZXIodiA9PiB2ICE9PSB0aGlzLlNFTEVDVF9BTExfVkFMVUUpO1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyZWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRG8gbm90IHByb2NlZWQgd2l0aCBub3JtYWwgY2xvc2UgbG9naWMgZm9yIHNlbGVjdC1hbGxcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTGV0IEFuZ3VsYXIgTWF0ZXJpYWwgYXV0by1jbG9zZSBmb3Igc2luZ2xlLXNlbGVjdC5cbiAgICAvLyBGb3IgbXVsdGktc2VsZWN0LCBjbG9zZSBvbmx5IGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAgIGNvbnN0IHNob3VsZENsb3NlID0gdGhpcy5pc011bHRpcGxlID8gISF0aGlzLmNvbmZpZz8uY2xvc2VPblNlbGVjdCA6IGZhbHNlO1xuICAgIGlmIChzaG91bGRDbG9zZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VsZWN0LmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICAgIC8vIElmIHNlYXJjaGFibGUsIGNsZWFyIHRoZSBzZWFyY2ggYWZ0ZXIgc2VsZWN0aW9uIHNvIHJlb3BlbmluZyB3b3JrcyBwcmVkaWN0YWJseVxuICAgIGlmICh0aGlzLmNvbmZpZz8uc2VhcmNoYWJsZSAmJiB0aGlzLmNvbmZpZz8ua2V5KSB7XG4gICAgICB0aGlzLnNlYXJjaFRleHRCeUtleVt0aGlzLmNvbmZpZy5rZXldID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZz8ub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uQ2hhbmdlKGV2ZW50LnZhbHVlLCBldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdjcWEtZHluYW1pYy1zZWxlY3Qgb25DaGFuZ2UgaGFuZGxlciBlcnJvcjonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7XG4gICAgICBrZXk6IHRoaXMuY29uZmlnPy5rZXksXG4gICAgICB2YWx1ZTogZXZlbnQudmFsdWUsXG4gICAgICBldmVudCxcbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIENsb3NlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgdHJpZ2dlciBhbmQgb3V0c2lkZSBvZiB0aGUgb3BlbiBwYW5lbFxuICAgIGlmICghdGhpcy5zZWxlY3RSZWY/LnBhbmVsT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgLy8gSWYgY2xpY2sgaXMgaW5zaWRlIHRoZSBjb21wb25lbnQgaG9zdCwgaWdub3JlXG4gICAgaWYgKHRoaXMuaG9zdEVsPy5uYXRpdmVFbGVtZW50ICYmIHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBVc2UgY29tcG9zZWRQYXRoKCkgdG8gY2FwdHVyZSB0aGUgZXZlbnQgZGlzcGF0Y2ggcGF0aCBhdCB0aGUgdGltZSBvZiB0aGUgY2xpY2ssXG4gICAgLy8gYmVmb3JlIGFueSBET00gbXV0YXRpb25zIHRyaWdnZXJlZCBieSBzZWxlY3Rpb24tY2hhbmdlIGhhbmRsZXJzIChlLmcuIG9wdGlvbnMgbGlzdFxuICAgIC8vIHJlYnVpbGQpLiBXaXRob3V0IHRoaXMsIHdoZW4gYW4gb3B0aW9uIGlzIHVuLWNoZWNrZWQgdGhlIGNvbnN1bWVyIG1heSByZWFzc2lnblxuICAgIC8vIGNvbmZpZyAobmV3IHJlZmVyZW5jZSkgd2hpY2ggY2F1c2VzIEFuZ3VsYXIgdG8gcmUtcmVuZGVyIGFuZCBkZXRhY2ggdGhlIG9yaWdpbmFsXG4gICAgLy8gY2xpY2stdGFyZ2V0IG5vZGUsIG1ha2luZyBlbC5jb250YWlucyh0YXJnZXQpIHJldHVybiBmYWxzZSBldmVuIGZvciBpbi1wYW5lbCBjbGlja3MuXG4gICAgY29uc3QgZXZlbnRQYXRoOiBFdmVudFRhcmdldFtdID0gKGV2ZW50LmNvbXBvc2VkUGF0aCA/IGV2ZW50LmNvbXBvc2VkUGF0aCgpIDogW10pO1xuICAgIGNvbnN0IHBhbmVsRWxzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWF0LXNlbGVjdC1wYW5lbCcpKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgIGNvbnN0IGNsaWNrSW5zaWRlUGFuZWwgPSBwYW5lbEVscy5zb21lKFxuICAgICAgKGVsKSA9PiBlbC5jb250YWlucyh0YXJnZXQpIHx8IGV2ZW50UGF0aC5pbmNsdWRlcyhlbCBhcyBFdmVudFRhcmdldClcbiAgICApO1xuICAgIGlmIChjbGlja0luc2lkZVBhbmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLnNlbGVjdFJlZi5jbG9zZSgpO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIC8qKlxuICAgKiBIaWdobGlnaHRzIHRleHQgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgaGlnaGxpZ2h0UGF0dGVybi5cbiAgICogUmV0dXJucyBIVE1MIHN0cmluZyB3aXRoIGhpZ2hsaWdodGVkIHBvcnRpb25zIHdyYXBwZWQgaW4gPHNwYW4gY2xhc3M9XCJoaWdobGlnaHRcIj4uXG4gICAqL1xuICBoaWdobGlnaHRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0IHx8ICF0aGlzLmNvbmZpZz8uaGlnaGxpZ2h0UGF0dGVybikge1xuICAgICAgcmV0dXJuIHRoaXMuZXNjYXBlSHRtbCh0ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5jb25maWcuaGlnaGxpZ2h0UGF0dGVybjtcblxuICAgIC8vIElmIGl0J3MgYSBmdW5jdGlvbiwgdXNlIGl0IGRpcmVjdGx5XG4gICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcGF0dGVybih0ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHN0cmluZyBwYXR0ZXJuIHRvIFJlZ0V4cCBpZiBuZWVkZWRcbiAgICBsZXQgcmVnZXg6IFJlZ0V4cDtcbiAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgJ2dpJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCBoaWdobGlnaHQgcGF0dGVybjonLCBwYXR0ZXJuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXNjYXBlSHRtbCh0ZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVnZXggPSBwYXR0ZXJuO1xuICAgIH1cblxuICAgIC8vIEVzY2FwZSBIVE1MIGZpcnN0LCB0aGVuIGFwcGx5IGhpZ2hsaWdodGluZ1xuICAgIGNvbnN0IGVzY2FwZWQgPSB0aGlzLmVzY2FwZUh0bWwodGV4dCk7XG4gICAgcmV0dXJuIGVzY2FwZWQucmVwbGFjZShyZWdleCwgKG1hdGNoKSA9PiBgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1wcmltYXJ5XCI+JHttYXRjaH08L3NwYW4+YCk7XG4gIH1cblxuICAvKipcbiAgICogRXNjYXBlcyBIVE1MIHNwZWNpYWwgY2hhcmFjdGVycyB0byBwcmV2ZW50IFhTUy5cbiAgICovXG4gIHByaXZhdGUgZXNjYXBlSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGhpZ2hsaWdodGluZyBpcyBlbmFibGVkIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGdldCBoYXNIaWdobGlnaHRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWc/LmhpZ2hsaWdodFBhdHRlcm47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBhIGRvY3VtZW50LWxldmVsIGtleWJvYXJkIGxpc3RlbmVyIHRvIGhhbmRsZSBhcnJvdyBrZXkgbmF2aWdhdGlvblxuICAgKiB3aGVuIHRoZSBwYW5lbCBpcyBvcGVuIGFuZCB0aGUgc2VhcmNoIGlucHV0IGlzIG5vdCBmb2N1c2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERvY3VtZW50S2V5ZG93bkxpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRvY3VtZW50S2V5ZG93bkxpc3RlbmVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5kb2N1bWVudEtleWRvd25MaXN0ZW5lcik7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZG9jdW1lbnRLZXlkb3duTGlzdGVuZXIgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIC8vIE9ubHkgaGFuZGxlIGlmIHBhbmVsIGlzIG9wZW5cbiAgICAgIGlmICghdGhpcy5zZWxlY3RSZWY/LnBhbmVsT3Blbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIERvbid0IGhhbmRsZSBpZiB0aGUgc2VhcmNoIGlucHV0IGlzIGZvY3VzZWQgKGl0IGhhcyBpdHMgb3duIGhhbmRsZXIpXG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGlmIChhY3RpdmVFbGVtZW50ICYmIGFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCd0cy1zZWxlY3Qtc2VhcmNoLWlucHV0JykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEb24ndCBoYW5kbGUgaWYgdXNlciBpcyB0eXBpbmcgaW4gYW5vdGhlciBpbnB1dFxuICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQgJiYgKGFjdGl2ZUVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBhY3RpdmVFbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gb3VyIHNlbGVjdCBwYW5lbFxuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWF0LXNlbGVjdC1wYW5lbCcpO1xuICAgICAgaWYgKCFwYW5lbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIE9ubHkgaGFuZGxlIGlmIHRoZSBldmVudCB0YXJnZXQgaXMgd2l0aGluIG91ciBjb21wb25lbnQgb3IgdGhlIHBhbmVsXG4gICAgICBjb25zdCBpc0luT3VyQ29tcG9uZW50ID0gdGhpcy5ob3N0RWw/Lm5hdGl2ZUVsZW1lbnQ/LmNvbnRhaW5zKHRhcmdldCkgfHwgcGFuZWwuY29udGFpbnModGFyZ2V0KTtcbiAgICAgIGlmICghaXNJbk91ckNvbXBvbmVudCAmJiB0YXJnZXQgIT09IGRvY3VtZW50LmJvZHkgJiYgdGFyZ2V0ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmV2ZW50IEN0cmwvQ21kICsgQSBmcm9tIHRyaWdnZXJpbmcgbWF0LXNlbGVjdCB0eXBlYWhlYWQvc2VsZWN0LWFsbCBiZWhhdmlvclxuICAgICAgLy8gKG9mdGVuIGVuZHMgdXAgc2VsZWN0aW5nIHRoZSBcIkFsbFwiIG9wdGlvbiBhbmQgc2VsZWN0aW5nIGV2ZXJ5dGhpbmcpLlxuICAgICAgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSAnYScgJiYgdGhpcy5pc011bHRpcGxlKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IGhhbmRsZSBhcnJvdyBrZXlzIGFuZCBFbnRlclxuICAgICAgaWYgKGV2ZW50LmtleSAhPT0gJ0Fycm93VXAnICYmIGV2ZW50LmtleSAhPT0gJ0Fycm93RG93bicgJiYgZXZlbnQua2V5ICE9PSAnRW50ZXInKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSGFuZGxlIGFycm93IGtleXMgZm9yIG5hdmlnYXRpb25cbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJyB8fCBldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGFuIG9wdGlvbiBpcyBjdXJyZW50bHkgZm9jdXNlZCAtIGlmIHNvLCBsZXQgQW5ndWxhciBNYXRlcmlhbCBoYW5kbGUgaXRcbiAgICAgICAgY29uc3QgZm9jdXNlZE9wdGlvbiA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJy5tYXQtb3B0aW9uOmZvY3VzJyk7XG4gICAgICAgIGlmIChmb2N1c2VkT3B0aW9uKSB7XG4gICAgICAgICAgLy8gTGV0IEFuZ3VsYXIgTWF0ZXJpYWwgaGFuZGxlIGl0IG5hdHVyYWxseSB3aGVuIGFuIG9wdGlvbiBpcyBmb2N1c2VkXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBPbmx5IGludGVyY2VwdCB3aGVuIG5vIG9wdGlvbiBpcyBmb2N1c2VkIChlLmcuLCBhZnRlciBibHVycmluZyBzZWFyY2ggaW5wdXQpXG4gICAgICAgIC8vIFN0b3AgdGhlIGV2ZW50IGNvbXBsZXRlbHkgdG8gcHJldmVudCBBbmd1bGFyIE1hdGVyaWFsIGZyb20gYWxzbyBwcm9jZXNzaW5nIGl0XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZU9wdGlvbnMoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyA/IDEgOiAtMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSGFuZGxlIEVudGVyIGZvciBzZWxlY3Rpb25cbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAocGFuZWwpIHtcbiAgICAgICAgICBjb25zdCBhY3RpdmVPcHRpb24gPSBwYW5lbC5xdWVyeVNlbGVjdG9yKCcubWF0LW9wdGlvbi5tYXQtYWN0aXZlOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCknKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICBpZiAoYWN0aXZlT3B0aW9uKSB7XG4gICAgICAgICAgICBhY3RpdmVPcHRpb24uY2xpY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuZG9jdW1lbnRLZXlkb3duTGlzdGVuZXIsIHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExvYWRNb3JlT2JzZXJ2ZXIoKTogdm9pZCB7XG4gICAgLy8gT25seSBpZiBjb25zdW1lciBpbmRpY2F0ZXMgbW9yZSBkYXRhIGlzIGF2YWlsYWJsZVxuICAgIGlmICghdGhpcy5jb25maWc/Lmhhc01vcmUpIHJldHVybjtcbiAgICAvLyBGaW5kIHNlbnRpbmVsIG9wdGlvbiByZW5kZXJlZCBpbiB0aGUgb3BlbiBwYW5lbFxuICAgIGNvbnN0IHNlbnRpbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubG9hZC1tb3JlLXNlbnRpbmVsJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghc2VudGluZWwpIHJldHVybjtcbiAgICBpZiAodGhpcy5sb2FkTW9yZU9ic2VydmVyKSB7XG4gICAgICB0cnkgeyB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9IGNhdGNoIHt9XG4gICAgICB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIFVzZSB0aGUgc2VudGluZWwncyBjbG9zZXN0IHBhbmVsIGFzIHRoZSByb290IHRvIGF2b2lkIHBpY2tpbmcgYSB3cm9uZyBwYW5lbFxuICAgIGNvbnN0IHBhbmVsUm9vdCA9IHNlbnRpbmVsLmNsb3Nlc3QoJy5tYXQtc2VsZWN0LXBhbmVsJykgYXMgRWxlbWVudCB8IG51bGw7XG4gICAgdGhpcy5sb2FkTW9yZU9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgLy8gT25seSB0cmlnZ2VyIHdoZW4gc2VudGluZWwganVzdCBjYW1lIGludG8gdmlldyAodXNlciBzY3JvbGxlZCB0byBib3R0b20pLlxuICAgICAgICAgIC8vIElmIGl0IHdhcyBhbHJlYWR5IGluIHZpZXcgKGUuZy4gYWZ0ZXIgbmV3IGRhdGEgYXBwZW5kZWQpLCBkbyBub3QgdHJpZ2dlciBhZ2Fpbi5cbiAgICAgICAgICBjb25zdCB3YXNPdXRPZlZpZXcgPSAhdGhpcy5zZW50aW5lbEN1cnJlbnRseUluVmlldztcbiAgICAgICAgICB0aGlzLnNlbnRpbmVsQ3VycmVudGx5SW5WaWV3ID0gdHJ1ZTtcbiAgICAgICAgICBpZiAod2FzT3V0T2ZWaWV3ICYmIHRoaXMuaGFzU2Nyb2xsZWRTaW5jZU9wZW4gJiYgIXRoaXMubG9hZGluZ01vcmUgJiYgdGhpcy5jb25maWc/Lmhhc01vcmUpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleSB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaFRleHRCeUtleVtrZXldIHx8ICcnO1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9yZS5lbWl0KHsga2V5LCBxdWVyeTogcSB9KTtcbiAgICAgICAgICAgIHRyeSB7IHRoaXMuY29uZmlnLm9uTG9hZE1vcmU/LihxKTsgfSBjYXRjaCB7fVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZW50aW5lbCBsZWZ0IHZpZXcgKHVzZXIgc2Nyb2xsZWQgdXApIOKAkyBhbGxvdyBuZXh0IGxvYWQgbW9yZSB3aGVuIHRoZXkgc2Nyb2xsIGRvd24gYWdhaW5cbiAgICAgICAgICB0aGlzLnNlbnRpbmVsQ3VycmVudGx5SW5WaWV3ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7IHJvb3Q6IHBhbmVsUm9vdCwgdGhyZXNob2xkOiAwLjEgfSk7XG4gICAgdHJ5IHsgdGhpcy5sb2FkTW9yZU9ic2VydmVyLm9ic2VydmUoc2VudGluZWwpOyB9IGNhdGNoIHt9XG4gIH1cbn1cblxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLXVpLXJvb3RcIj5cbiAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8bGFiZWwgKm5nSWY9XCJjb25maWcubGFiZWxcIlxuICAgICAgY2xhc3M9XCJmb3JtLWxhYmVsIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1ibG9jayBjcWEtbGVhZGluZy1bMS40XSBjcWEtbWItMlwiPnt7XG4gICAgICBjb25maWcubGFiZWwgfX08L2xhYmVsPlxuICAgIDxtYXQtZm9ybS1maWVsZCAjaG9zdCBjbGFzcz1cIm1hdC1zZWxlY3QtY3VzdG9tIGNxYS13LWZ1bGxcIiBhcHBlYXJhbmNlPVwiZmlsbFwiPlxuICAgICAgPG1hdC1zZWxlY3QgI3NlbGVjdFJlZj1cIm1hdFNlbGVjdFwiIFtwbGFjZWhvbGRlcl09XCJkaXNwbGF5UGxhY2Vob2xkZXJcIiBbbXVsdGlwbGVdPVwiaXNNdWx0aXBsZVwiXG4gICAgICAgIGRpc2FibGVPcHRpb25DZW50ZXJpbmcgW3BhbmVsQ2xhc3NdPVwicGFuZWxDbGFzc1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiY29uZmlnLmtleVwiXG4gICAgICAgIChvcGVuZWRDaGFuZ2UpPVwib25TZWxlY3RPcGVuZWRDaGFuZ2UoJGV2ZW50LCBzZWxlY3RSZWYpXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQsIHNlbGVjdFJlZilcIlxuICAgICAgICAoa2V5ZG93bik9XCJvblNlbGVjdEtleWRvd24oJGV2ZW50KVwiPlxuICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyICpuZ0lmPVwiIWlzTXVsdGlwbGUgJiYgc2luZ2xlU2VsZWN0ZWREaXNwbGF5TGFiZWxcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnPy5zaG93VGVzdFR5cGVJY29uXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJvcHRpb25UZXN0VHlwZUljb25UcGw7IGNvbnRleHQ6IHsga2luZDogdGVzdFR5cGVJY29uS2luZChzaW5nbGVTZWxlY3RlZE9wdGlvbikgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1taW4tdy0wXCIgW2lubmVySFRNTF09XCJzaW5nbGVTZWxlY3RlZERpc3BsYXlMYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxuXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwiY29uZmlnLnNlYXJjaGFibGVcIiBjbGFzcz1cInRzLXNlbGVjdC1zZWFyY2hcIiBkaXNhYmxlZD5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ0cy1zZWxlY3Qtc2VhcmNoLWlucHV0IGNxYS10ZXh0LWJsYWNrLTEwMFwiIHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cInNlYXJjaFRleHRCeUtleVtjb25maWcua2V5XSB8fCAnJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25TZWFyY2hJbnB1dEtleWRvd24oJGV2ZW50KVwiIChpbnB1dCk9XCJvblNlYXJjaChjb25maWcua2V5LCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIC8+XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgXG4gICAgICAgIDxtYXQtb3B0aW9uIFtuZ0NsYXNzXT1cInsnY2hlY2ttYXJrJzogY29uZmlnLm9wdGlvblN0eWxlID09PSAnY2hlY2ttYXJrJywnY2hlY2tib3gnOiBjb25maWcub3B0aW9uU3R5bGUgIT09ICdjaGVja21hcmsnLCdtYXQtc2VsZWN0ZWQnOiBhbGxTZWxlY3RlZH1cIiBbY2xhc3NdPVwiY29uZmlnLm9wdGlvblN0eWxlID09ICdjaGVja21hcmsnID8gJ2NoZWNrbWFyaycgOiAnY2hlY2tib3gnXCIgKm5nSWY9XCJpc011bHRpcGxlICYmIGNvbmZpZy5zaG93U2VsZWN0QWxsXCIgW3ZhbHVlXT1cIlNFTEVDVF9BTExfVkFMVUVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlQ2hlY2tib3hTdHlsZTsgZWxzZSBzZWxlY3RBbGxEZWZhdWx0VHBsXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXJvdW5kZWQtWzRweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRDFENURCXSBjcWEtbXItMiBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtYm9yZGVyLXNvbGlkXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJhbGxTZWxlY3RlZCA/IHsnYmFja2dyb3VuZC1jb2xvcic6JyM0RjQ2RTUnLCdib3JkZXItY29sb3InOicjNEY0NkU1J30gOiB7fVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJhbGxTZWxlY3RlZFwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgM0w0LjUgOC41TDIgNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1pbi13LTBcIj57eyBjb25maWcuc2VsZWN0QWxsTGFiZWwgfHwgJ0FsbCcgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzZWxlY3RBbGxEZWZhdWx0VHBsPlxuICAgICAgICAgICAge3sgY29uZmlnLnNlbGVjdEFsbExhYmVsIHx8ICdBbGwnIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwic2hvd0FkZEN1c3RvbU9wdGlvblwiIFt2YWx1ZV09XCJhZGRDdXN0b21TZW50aW5lbFZhbHVlXCIgY2xhc3M9XCJjcWEtdGV4dC1wcmltYXJ5XCI+XG4gICAgICAgICAgTmV3XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cblxuICAgICAgICA8bWF0LW9wdGlvbiBbY2xhc3NdPVwiY29uZmlnLm9wdGlvblN0eWxlID09ICdjaGVja21hcmsnID8gJ2NoZWNrbWFyaycgOiAnY2hlY2tib3gnXCIgKm5nRm9yPVwibGV0IG9wdCBvZiBmaWx0ZXJlZE9wdGlvbnMoY29uZmlnKVwiIFt2YWx1ZV09XCJnZXRPcHRpb25WYWx1ZShvcHQpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbmZpZy5pc0NvbXBhcmVSdW5zXCI+ICAgXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlQ2hlY2tib3hTdHlsZTsgZWxzZSBjb21wYXJlUnVuc0RlZmF1bHRPcHRpb25UcGxcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtY29tcGFyZS1ydW5zLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00IGNxYS1mbGV4LXNocmluay0wIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0QxRDVEQl0gY3FhLW1yLTIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWJvcmRlci1zb2xpZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0KSA/IHsnYmFja2dyb3VuZC1jb2xvcic6JyM0RjQ2RTUnLCdib3JkZXItY29sb3InOicjNEY0NkU1J30gOiB7fVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNPcHRpb25TZWxlY3RlZChvcHQpXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgM0w0LjUgOC41TDIgNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1pbi13LTAgY3FhLWNvbXBhcmUtcnVuc1wiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaGFzSGlnaGxpZ2h0aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIm9wdC5zdGF0dXNDb2xvciB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJoaWdobGlnaHRUZXh0KG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoYXNIaWdobGlnaHRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS1jb21wYXJlLXJ1bnNcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0LnJ1bk51bWJlckxhYmVsICYmIG9wdC5ydW5EYXRlTGFiZWw7IGVsc2UgY2hlY2tib3hEZWZhdWx0TGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUuY29sb3JdPVwib3B0LnN0YXR1c0NvbG9yIHx8IG51bGxcIj57eyBvcHQucnVuTnVtYmVyTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF1cIj4ge3sgb3B0LnJ1bkRhdGVMYWJlbCB9fSZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrYm94RGVmYXVsdExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS1jb21wYXJlLXJ1bnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIm9wdC5zdGF0dXNDb2xvciB8fCBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIm9wdC5kdXJhdGlvbkZvcm1hdHRlZFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWdhcC0xIGNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1tYXgtdy1bODBweF1cIiBcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgJ2NxYS1taW4tdy1bODJweF0nOiBvcHQ/Lmhhc0hvdXJSdW4sXG4gICAgICAgICAgICAgICAgICAgICdjcWEtbWluLXctWzY2cHhdJzogIW9wdD8uaGFzSG91clJ1biAmJiBvcHQ/Lmhhc01pbnV0ZVJ1bixcbiAgICAgICAgICAgICAgICAgICAgJ2NxYS1taW4tdy1bNDBweF0nOiAhb3B0Py5oYXNIb3VyUnVuICYmICFvcHQ/Lmhhc01pbnV0ZVJ1blxuICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1taW4tdy1bMTJweF0gY3FhLW1heC13LVsxMnB4XVwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjZcIiBjeT1cIjZcIiByPVwiNC41XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjFcIi8+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNiAzLjVWNkw3LjUgN1wiIHN0cm9rZT1cIiM0QjU1NjNcIiBzdHJva2Utd2lkdGg9XCIxXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBvcHQuZHVyYXRpb25Gb3JtYXR0ZWQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY29tcGFyZVJ1bnNEZWZhdWx0T3B0aW9uVHBsPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS1jb21wYXJlLXJ1bnMtaXRlbVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS1jb21wYXJlLXJ1bnNcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoYXNIaWdobGlnaHRpbmdcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIm9wdC5zdGF0dXNDb2xvciB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiaGlnaGxpZ2h0VGV4dChvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlKVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWhhc0hpZ2hsaWdodGluZ1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtbWluLXctMCBjcWEtY29tcGFyZS1ydW5zXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJvcHQucnVuTnVtYmVyTGFiZWwgJiYgb3B0LnJ1bkRhdGVMYWJlbDsgZWxzZSBkZWZhdWx0TGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlLmNvbG9yXT1cIm9wdC5zdGF0dXNDb2xvciB8fCBudWxsXCI+e3sgb3B0LnJ1bk51bWJlckxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXVwiPiB7eyBvcHQucnVuRGF0ZUxhYmVsIH19Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtbWluLXctMCBjcWEtY29tcGFyZS1ydW5zXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwib3B0LnN0YXR1c0NvbG9yIHx8IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0LmR1cmF0aW9uRm9ybWF0dGVkXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1zdGFydCBjcWEtZ2FwLTEgY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtZmxleC1zaHJpbmstMCBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLW1heC13LVs4MHB4XVwiIFxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnY3FhLW1pbi13LVs4MnB4XSc6IG9wdD8uaGFzSG91clJ1bixcbiAgICAgICAgICAgICAgICAgICAgJ2NxYS1taW4tdy1bNjZweF0nOiAhb3B0Py5oYXNIb3VyUnVuICYmIG9wdD8uaGFzTWludXRlUnVuLFxuICAgICAgICAgICAgICAgICAgICAnY3FhLW1pbi13LVs0MHB4XSc6ICFvcHQ/Lmhhc0hvdXJSdW4gJiYgIW9wdD8uaGFzTWludXRlUnVuXG4gICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLW1pbi13LVsxMnB4XSBjcWEtbWF4LXctWzEycHhdXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiNlwiIGN5PVwiNlwiIHI9XCI0LjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMVwiLz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02IDMuNVY2TDcuNSA3XCIgc3Ryb2tlPVwiIzRCNTU2M1wiIHN0cm9rZS13aWR0aD1cIjFcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IG9wdC5kdXJhdGlvbkZvcm1hdHRlZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb25maWcuaXNDb21wYXJlUnVuc1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZUNoZWNrYm94U3R5bGU7IGVsc2UgZGVmYXVsdE9wdGlvblRwbFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnPy5zaG93VGVzdFR5cGVJY29uOyBlbHNlIGNoZWNrYm94Tm9JY29uVHBsXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm9wdGlvblRlc3RUeXBlSWNvblRwbDsgY29udGV4dDogeyBraW5kOiB0ZXN0VHlwZUljb25LaW5kKG9wdCkgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXJvdW5kZWQtWzRweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRDFENURCXSBjcWEtbXItMiBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtYm9yZGVyLXNvbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiaXNPcHRpb25TZWxlY3RlZChvcHQpID8geydiYWNrZ3JvdW5kLWNvbG9yJzonIzRGNDZFNScsJ2JvcmRlci1jb2xvcic6JyM0RjQ2RTUnfSA6IHt9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc09wdGlvblNlbGVjdGVkKG9wdClcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMCAzTDQuNSA4LjVMMiA2XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbWluLXctMFwiICpuZ0lmPVwiY29uZmlnPy5kaXNwbGF5TGFiZWxBc0lubmVySHRtbFwiIFtpbm5lckhUTUxdPVwib3B0LmxhYmVsID8/IG9wdC5uYW1lID8/IG9wdC52YWx1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1pbi13LTBcIiAqbmdJZj1cIiFjb25maWc/LmRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sICYmIGhhc0hpZ2hsaWdodGluZ1wiIFtpbm5lckhUTUxdPVwiaGlnaGxpZ2h0VGV4dChvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlKVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1pbi13LTBcIiAqbmdJZj1cIiFjb25maWc/LmRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sICYmICFoYXNIaWdobGlnaHRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgb3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tib3hOb0ljb25UcGw+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS13LTQgY3FhLWgtNCBjcWEtZmxleC1zaHJpbmstMCBjcWEtcm91bmRlZC1bNHB4XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNEMUQ1REJdIGNxYS1tci0yIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1ib3JkZXItc29saWRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJpc09wdGlvblNlbGVjdGVkKG9wdCkgPyB7J2JhY2tncm91bmQtY29sb3InOicjNEY0NkU1JywnYm9yZGVyLWNvbG9yJzonIzRGNDZFNSd9IDoge31cIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzT3B0aW9uU2VsZWN0ZWQob3B0KVwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDNMNC41IDguNUwyIDZcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbmZpZz8uZGlzcGxheUxhYmVsQXNJbm5lckh0bWxcIiBbaW5uZXJIVE1MXT1cIm9wdC5sYWJlbCA/PyBvcHQubmFtZSA/PyBvcHQudmFsdWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFjb25maWc/LmRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sICYmIGhhc0hpZ2hsaWdodGluZ1wiIFtpbm5lckhUTUxdPVwiaGlnaGxpZ2h0VGV4dChvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlKVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWNvbmZpZz8uZGlzcGxheUxhYmVsQXNJbm5lckh0bWwgJiYgIWhhc0hpZ2hsaWdodGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRPcHRpb25UcGw+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb25maWc/LnNob3dUZXN0VHlwZUljb247IGVsc2UgZGVmYXVsdE5vSWNvblRwbFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJvcHRpb25UZXN0VHlwZUljb25UcGw7IGNvbnRleHQ6IHsga2luZDogdGVzdFR5cGVJY29uS2luZChvcHQpIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1pbi13LTBcIiAqbmdJZj1cImNvbmZpZz8uZGlzcGxheUxhYmVsQXNJbm5lckh0bWxcIiBbaW5uZXJIVE1MXT1cIm9wdC5sYWJlbCA/PyBvcHQubmFtZSA/PyBvcHQudmFsdWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1taW4tdy0wXCIgKm5nSWY9XCIhY29uZmlnPy5kaXNwbGF5TGFiZWxBc0lubmVySHRtbCAmJiBoYXNIaWdobGlnaHRpbmdcIiBbaW5uZXJIVE1MXT1cImhpZ2hsaWdodFRleHQob3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSlcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1taW4tdy0wXCIgKm5nSWY9XCIhY29uZmlnPy5kaXNwbGF5TGFiZWxBc0lubmVySHRtbCAmJiAhaGFzSGlnaGxpZ2h0aW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHROb0ljb25UcGw+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb25maWc/LmRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sXCIgW2lubmVySFRNTF09XCJvcHQubGFiZWwgPz8gb3B0Lm5hbWUgPz8gb3B0LnZhbHVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWNvbmZpZz8uZGlzcGxheUxhYmVsQXNJbm5lckh0bWwgJiYgaGFzSGlnaGxpZ2h0aW5nXCIgW2lubmVySFRNTF09XCJoaWdobGlnaHRUZXh0KG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWNvbmZpZz8uZGlzcGxheUxhYmVsQXNJbm5lckh0bWwgJiYgIWhhc0hpZ2hsaWdodGluZ1wiPlxuICAgICAgICAgICAgICAgICAge3sgb3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgXG4gICAgICAgIDwhLS0gTm8gcmVzdWx0cyBzdGF0ZSAob25seSB3aGVuIG5vdCBsb2FkaW5nIGFuZCBubyBvcHRpb25zKSAtLT5cbiAgICAgICAgPG1hdC1vcHRpb24gZGlzYWJsZWQgKm5nSWY9XCIhKGNvbmZpZz8ub3B0aW9ucz8ubGVuZ3RoIHx8IDApICYmICEoY29uZmlnPy5pc0xvYWRpbmcgfHwgbG9hZGluZ01vcmUpXCI+XG4gICAgICAgICAgTm8gcmVzdWx0c1xuICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgIDwhLS0gSW5maW5pdGUgc2Nyb2xsIHNlbnRpbmVsIChzZXJ2ZXJTZWFyY2ggb3IgZXhwbGljaXQgaGFzTW9yZSkgLS0+XG4gICAgICAgIDxtYXQtb3B0aW9uIGRpc2FibGVkIGNsYXNzPVwibG9hZC1tb3JlLXNlbnRpbmVsXCIgKm5nSWY9XCJjb25maWc/Lmhhc01vcmVcIj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImxvYWRpbmdNb3JlIHx8IGNvbmZpZz8uaXNMb2FkaW5nXCI+TG9hZGluZy4uLjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFsb2FkaW5nTW9yZSAmJiAhY29uZmlnPy5pc0xvYWRpbmdcIj5TY3JvbGwgdG8gbG9hZCBtb3Jl4oCmPC9zcGFuPlxuICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPCEtLSBJbmxpbmUgc3Bpbm5lciBzaG93biB3aGVuIGxvYWRpbmcgbW9yZSAoaW5maW5pdGUgc2Nyb2xsKSBvciB3aGVuIGNvbmZpZy5pc0xvYWRpbmcgaXMgdHJ1ZSAtLT5cbiAgICAgICAgPHN2ZyAqbmdJZj1cImxvYWRpbmdNb3JlIHx8IGNvbmZpZz8uaXNMb2FkaW5nXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCA1MCA1MFwiIGFyaWEtbGFiZWw9XCJsb2FkaW5nXCJcbiAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPGNpcmNsZSBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIHN0cm9rZT1cIiNFNUU3RUJcIiBzdHJva2Utd2lkdGg9XCI2XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgPHBhdGggZD1cIk00NSAyNWEyMCAyMCAwIDAgMC0yMC0yMFwiIHN0cm9rZT1cIiM0RjQ2RTVcIiBzdHJva2Utd2lkdGg9XCI2XCIgZmlsbD1cIm5vbmVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+XG4gICAgICAgICAgICA8YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPVwidHJhbnNmb3JtXCIgdHlwZT1cInJvdGF0ZVwiIGZyb209XCIwIDI1IDI1XCIgdG89XCIzNjAgMjUgMjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyPVwiMC44c1wiIHJlcGVhdENvdW50PVwiaW5kZWZpbml0ZVwiLz5cbiAgICAgICAgICA8L3BhdGg+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjMEEwQTBBXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLXRlbXBsYXRlICNvcHRpb25UZXN0VHlwZUljb25UcGwgbGV0LWtpbmQ9XCJraW5kXCI+XG4gICAgPHNwYW4gKm5nSWY9XCJraW5kID09PSAnbW9iaWxlJ1wiIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1mbGV4LXNocmluay0wIGNxYS1pdGVtcy1jZW50ZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggc3Ryb2tlPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgIDxwYXRoIGQ9XCJNNiA1YTIgMiAwIDAgMSAyIC0yaDhhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEgLTIgMmgtOGEyIDIgMCAwIDEgLTIgLTJ2LTE0XCIvPlxuICAgICAgICA8cGF0aCBkPVwiTTExIDRoMlwiLz5cbiAgICAgICAgPHBhdGggZD1cIk0xMiAxN3YuMDFcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L3NwYW4+XG4gICAgPHNwYW4gKm5nSWY9XCJraW5kID09PSAnd2ViJ1wiIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1mbGV4LXNocmluay0wIGNxYS1pdGVtcy1jZW50ZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggc3Ryb2tlPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgIDxwYXRoIGQ9XCJNMyAxMmE5IDkgMCAxIDAgMTggMGE5IDkgMCAwIDAgLTE4IDBcIi8+XG4gICAgICAgIDxwYXRoIGQ9XCJNMy42IDloMTYuOFwiLz5cbiAgICAgICAgPHBhdGggZD1cIk0zLjYgMTVoMTYuOFwiLz5cbiAgICAgICAgPHBhdGggZD1cIk0xMS41IDNhMTcgMTcgMCAwIDAgMCAxOFwiLz5cbiAgICAgICAgPHBhdGggZD1cIk0xMi41IDNhMTcgMTcgMCAwIDEgMCAxOFwiLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cImtpbmQgPT09ICdvdGhlcidcIiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtZmxleC1zaHJpbmstMCBjcWEtaXRlbXMtY2VudGVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk00IDYuNWgxNnYxMUg0elwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgPHBhdGggZD1cIk04IDYuNVY1aDh2MS41XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L3NwYW4+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj4iXX0=
|
|
966
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFvQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBeUV2SyxNQUFNLE9BQU8sMkJBQTJCO0lBTHhDO1FBTVcscUJBQWdCLEdBQVcsZ0JBQWdCLENBQUM7UUFDNUMsNEJBQXVCLEdBQVcsaUJBQWlCLENBQUM7UUFHbkQsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBdUQsQ0FBQztRQUMxRixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDakQscUVBQXFFO1FBQzNELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFDNUUsd0VBQXdFO1FBQzlELGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQztRQUN4RSxzSkFBc0o7UUFDNUksbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBa0MsQ0FBQztRQUs5RSxnRkFBZ0Y7UUFDaEYsb0JBQWUsR0FBMkIsRUFBRSxDQUFDO1FBR3JDLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUM5QixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUdwQjs7O1dBR0c7UUFDSyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDckM7Ozs7V0FJRztRQUNLLDRCQUF1QixHQUFHLEtBQUssQ0FBQztRQUNoQyxrQkFBYSxHQUFHLEdBQUcsRUFBRTtZQUMz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SUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFBRTt3QkFBQyxNQUFNLEdBQUU7cUJBQzlDO2lCQUNGO3FCQUFNO29CQUNMLDJGQUEyRjtvQkFDM0YsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztpQkFDdEM7YUFDRjtRQUNILENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDeEMsSUFBSTtZQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7U0FBRTtRQUFDLE1BQU0sR0FBRTtJQUMzRCxDQUFDOzt3SEFyNkJVLDJCQUEyQjs0R0FBM0IsMkJBQTJCLHVmQWVJLFVBQVUsa0RDeEZ0RCxvMWhCQW9QTTsyRkQzS08sMkJBQTJCO2tCQUx2QyxTQUFTOytCQUNFLG9CQUFvQixtQkFFYix1QkFBdUIsQ0FBQyxNQUFNOzhCQUt0QyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTTtnQkFFb0MsU0FBUztzQkFBbkQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNlLE1BQU07c0JBQTdELFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQTRzQnRELG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRTZWxlY3QsIE1hdFNlbGVjdENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5cbi8vIExvY2FsIG9wdGlvbiBtb2RlbCAocHJldmlvdXNseSBpbXBvcnRlZCBmcm9tIHJlbW92ZWQgY3FhLXNlbGVjdCBjb21wb25lbnQpXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE9wdGlvbiB7XG4gIGlkPzogYW55O1xuICB2YWx1ZT86IGFueTtcbiAgbmFtZT86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBlLmcuIE1PQklMRSwgQlJPV1NFUiDigJQgc2hvd24gYXMgYSBsZWFkaW5nIGljb24gaW4gdGhlIGRyb3Bkb3duIHdoZW4gc2V0ICovXG4gIHRlc3RUeXBlPzogc3RyaW5nO1xuICBzdGF0dXNDb2xvcj86IHN0cmluZztcbiAgZHVyYXRpb25Gb3JtYXR0ZWQ/OiBzdHJpbmc7XG4gIHJ1bk51bWJlckxhYmVsPzogc3RyaW5nO1xuICBoYXNIb3VyUnVuPzogYm9vbGVhbjtcbiAgaGFzTWludXRlUnVuPzogYm9vbGVhbjtcbiAgcnVuRGF0ZUxhYmVsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gIGtleTogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sPzogYm9vbGVhbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBtdWx0aXBsZT86IGJvb2xlYW47XG4gIHNlYXJjaGFibGU/OiBib29sZWFuO1xuICAvKiogQ29udHJvbHMgaG93IHNlbGVjdGlvbiBpbmRpY2F0b3IgaXMgc2hvd24gZm9yIG11bHRpLXNlbGVjdCBvcHRpb25zLiAqL1xuICBvcHRpb25TdHlsZT86ICdjaGVja21hcmsnIHwgJ2NoZWNrYm94JztcbiAgLyoqIFNob3cgYSAnU2VsZWN0IEFsbCcgb3B0aW9uIGF0IHRoZSB0b3AgKG11bHRpLXNlbGVjdCBvbmx5KS4gKi9cbiAgc2hvd1NlbGVjdEFsbD86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gbGFiZWwgZm9yIHRoZSAnU2VsZWN0IEFsbCcgb3B0aW9uLiBEZWZhdWx0cyB0byAnQWxsJy4gKi9cbiAgc2VsZWN0QWxsTGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBjbG9zZSB0aGUgcGFuZWwgd2hlbiBhbiBvcHRpb24gaXMgc2VsZWN0ZWQgKHVzZWZ1bCBmb3IgbXVsdGktc2VsZWN0IGluIGhlYWRlcnMpLiAqL1xuICBjbG9zZU9uU2VsZWN0PzogYm9vbGVhbjtcbiAgLyoqIFByb3ZpZGUgYSBkZWZhdWx0IHNlbGVjdGVkIHZhbHVlIChvciBhcnJheSBmb3IgbXVsdGktc2VsZWN0KSBpZiB0aGUgY29udHJvbCBoYXMgbm8gdmFsdWUgeWV0LiAqL1xuICBzZWxlY3RlZFZhbHVlPzogYW55IHwgYW55W107XG4gIC8qKiBPcHRpb25hbCBjYWxsYmFjayBpbnZva2VkIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4gKi9cbiAgb25DaGFuZ2U/OiAodmFsdWU6IGFueSwgZXZlbnQ/OiBNYXRTZWxlY3RDaGFuZ2UpID0+IHZvaWQ7XG4gIC8qKiBFbmFibGUgc2VydmVyLXNpZGUgc2VhcmNoIG1vZGU7IGNvbXBvbmVudCB3aWxsIGVtaXQgc2VhcmNoIGluc3RlYWQgb2YgbG9jYWwgZmlsdGVyaW5nLiAqL1xuICBzZXJ2ZXJTZWFyY2g/OiBib29sZWFuO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCB0cmlnZ2VycyBhbiBpbml0aWFsIHNlYXJjaCBlbWl0IG9uIHBhbmVsIG9wZW4gKHNlcnZlclNlYXJjaCBtb2RlIG9ubHkpLlxuICAgKiBEZWZhdWx0cyB0byBmYWxzZSBzbyBvcGVuaW5nIHRoZSBkcm9wZG93biBkb2VzIE5PVCBjYWxsIHRoZSBBUEkuXG4gICAqL1xuICBpbml0aWFsRmV0Y2hPbk9wZW4/OiBib29sZWFuO1xuICAvKiogSW5kaWNhdGVzIG1vcmUgcmVzdWx0cyBhcmUgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwuICovXG4gIGhhc01vcmU/OiBib29sZWFuO1xuICAvKiogT3B0aW9uYWwgbG9hZGluZyBmbGFnIGNvbnRyb2xsZWQgYnkgY29uc3VtZXIgdG8gc2hvdyBsb2FkaW5nIHN0YXRlLiAqL1xuICBpc0xvYWRpbmc/OiBib29sZWFuO1xuICAvKiogT3B0aW9uYWwgY2FsbGJhY2sgZm9yIHNlcnZlci1zaWRlIHNlYXJjaCB3aGVuIHF1ZXJ5IGNoYW5nZXMuICovXG4gIG9uU2VhcmNoPzogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBJZiB0cnVlLCByZW5kZXJzIHRlc3RUeXBlIGljb25zIChtb2JpbGUvd2ViL290aGVyKSBiZWZvcmUgbGFiZWxzLiAqL1xuICBzaG93VGVzdFR5cGVJY29uPzogYm9vbGVhbjtcbiAgLyoqIE9wdGlvbmFsIGNhbGxiYWNrIHdoZW4gbW9yZSBkYXRhIGlzIHJlcXVlc3RlZCAoaW5maW5pdGUgc2Nyb2xsKS4gKi9cbiAgb25Mb2FkTW9yZT86IChxdWVyeT86IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIE9wdGlvbmFsIHJlZ2V4IHBhdHRlcm4gb3IgZnVuY3Rpb24gdG8gaGlnaGxpZ2h0IHBhcnRzIG9mIG9wdGlvbiB0ZXh0LiAqL1xuICBoaWdobGlnaHRQYXR0ZXJuPzogUmVnRXhwIHwgc3RyaW5nIHwgKCh0ZXh0OiBzdHJpbmcpID0+IHN0cmluZyk7XG4gIC8qKiBXaGVuIHRydWUgKGFuZCBzZWFyY2hhYmxlKSwgYWxsb3dzIGFkZGluZyB0aGUgY3VycmVudCBzZWFyY2ggdGV4dCBhcyBhIG5ldyBvcHRpb24gdmlhIGFuIFwiQWRkICc8dmFsdWU+J1wiIGNob2ljZS4gKi9cbiAgYWxsb3dDdXN0b21WYWx1ZT86IGJvb2xlYW47XG4gIG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdO1xuICBpc0NvbXBhcmVSdW5zPzogYm9vbGVhbjtcbiAgdmFsdWVCeT86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGV4dHJhIENTUyBjbGFzcyBhcHBlbmRlZCB0byB0aGUgbWF0LXNlbGVjdCBwYW5lbCAodXNlIGZvciBzY29wZWQgb3ZlcmxheSB0YXJnZXRpbmcpLiAqL1xuICBleHRyYVBhbmVsQ2xhc3M/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1keW5hbWljLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNTZWxlY3RGaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgcmVhZG9ubHkgU0VMRUNUX0FMTF9WQUxVRTogc3RyaW5nID0gJ19fc2VsZWN0X2FsbF9fJztcbiAgcmVhZG9ubHkgQUREX0NVU1RPTV9WQUxVRV9QUkVGSVg6IHN0cmluZyA9ICdfX2FkZF9jdXN0b21fXzonO1xuICBASW5wdXQoKSBmb3JtITogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBjb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBhbnk7IGV2ZW50OiBNYXRTZWxlY3RDaGFuZ2UgfT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHMgd2hlbiB1c2VyIHR5cGVzIGluIHNlYXJjaCBib3ggKHVzZWZ1bCBmb3Igc2VydmVyIHNlYXJjaCkgKi9cbiAgQE91dHB1dCgpIHNlYXJjaENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuICAvKiogRW1pdHMgd2hlbiB0aGUgY29tcG9uZW50IHJlcXVlc3RzIG1vcmUgZGF0YSBmb3IgdGhlIGN1cnJlbnQgcXVlcnkgKi9cbiAgQE91dHB1dCgpIGxvYWRNb3JlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0+KCk7XG4gIC8qKiBFbWl0cyB3aGVuIHRoZSB1c2VyIGNob29zZXMgdG8gYWRkIGEgY3VzdG9tIHZhbHVlIChhbGxvd0N1c3RvbVZhbHVlOiB0cnVlKS4gQ29uc3VtZXIgc2hvdWxkIGFkZCB0aGUgdmFsdWUgdG8gb3B0aW9ucyBhbmQgc2V0IHRoZSBjb250cm9sIHZhbHVlLiAqL1xuICBAT3V0cHV0KCkgYWRkQ3VzdG9tVmFsdWUgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4oKTtcblxuICBAVmlld0NoaWxkKCdzZWxlY3RSZWYnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VsZWN0UmVmPzogTWF0U2VsZWN0O1xuICBAVmlld0NoaWxkKCdob3N0JywgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBFbGVtZW50UmVmIH0pIGhvc3RFbD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8vIE11c3QgYmUgcHVibGljIGZvciB0ZW1wbGF0ZSBhY2Nlc3MgaW4gQW5ndWxhcidzIHN0cmljdCB0ZW1wbGF0ZSBjaGVja2luZyBtb2RlXG4gIHNlYXJjaFRleHRCeUtleTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIG91dHNpZGVDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBsb2FkTW9yZU9ic2VydmVyPzogSW50ZXJzZWN0aW9uT2JzZXJ2ZXI7XG4gIHByaXZhdGUgbGFzdE9wdGlvbnNMZW5ndGggPSAwO1xuICBsb2FkaW5nTW9yZSA9IGZhbHNlO1xuICBwcml2YXRlIHBhbmVsU2Nyb2xsRWw/OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBkb2N1bWVudEtleWRvd25MaXN0ZW5lcj86IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEd1YXJkIHRvIGVuc3VyZSBsb2FkLW1vcmUgaXMgb25seSB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIHVzZXIgaGFzIHNjcm9sbGVkXG4gICAqIGF0IGxlYXN0IG9uY2Ugc2luY2Ugb3BlbmluZyB0aGUgcGFuZWwuIFByZXZlbnRzIGF1dG8tbG9hZCBvbiBvcGVuLlxuICAgKi9cbiAgcHJpdmF0ZSBoYXNTY3JvbGxlZFNpbmNlT3BlbiA9IGZhbHNlO1xuICAvKipcbiAgICogVHJ1ZSB3aGVuIHRoZSBsb2FkLW1vcmUgc2VudGluZWwgaXMgY3VycmVudGx5IGluIHZpZXcuIFVzZWQgdG8gdHJpZ2dlciBvbmx5IHdoZW5cbiAgICogdGhlIHNlbnRpbmVsIHRyYW5zaXRpb25zIGZyb20gb3V0LW9mLXZpZXcgdG8gaW4tdmlldyAodXNlciBzY3JvbGxlZCB0byBib3R0b20gYWdhaW4pLFxuICAgKiBub3Qgd2hlbiBpdCBzdGF5cyBpbiB2aWV3IGFmdGVyIG5ldyBkYXRhIGFycml2ZXMgKHdoaWNoIHdvdWxkIGNhdXNlIHJlcGVhdGVkIEFQSSBjYWxscykuXG4gICAqL1xuICBwcml2YXRlIHNlbnRpbmVsQ3VycmVudGx5SW5WaWV3ID0gZmFsc2U7XG4gIHByaXZhdGUgb25QYW5lbFNjcm9sbCA9ICgpID0+IHtcbiAgICB0aGlzLmhhc1Njcm9sbGVkU2luY2VPcGVuID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5oYXNNb3JlIHx8IHRoaXMubG9hZGluZ01vcmUpIHJldHVybjtcbiAgICBjb25zdCBlbCA9IHRoaXMucGFuZWxTY3JvbGxFbDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgY29uc3QgbmVhckJvdHRvbSA9IGVsLnNjcm9sbFRvcCArIGVsLmNsaWVudEhlaWdodCA+PSBlbC5zY3JvbGxIZWlnaHQgLSA0ODsgLy8gfjMgb3B0aW9uIHJvd3NcbiAgICBpZiAobmVhckJvdHRvbSAmJiAhdGhpcy5zZW50aW5lbEN1cnJlbnRseUluVmlldykge1xuICAgICAgdGhpcy5zZW50aW5lbEN1cnJlbnRseUluVmlldyA9IHRydWU7XG4gICAgICB0aGlzLmxvYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXkgfHwgJyc7XG4gICAgICBjb25zdCBxID0gdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSB8fCAnJztcbiAgICAgIHRoaXMubG9hZE1vcmUuZW1pdCh7IGtleSwgcXVlcnk6IHEgfSk7XG4gICAgICB0cnkgeyB0aGlzLmNvbmZpZy5vbkxvYWRNb3JlPy4ocSk7IH0gY2F0Y2gge31cbiAgICB9IGVsc2UgaWYgKCFuZWFyQm90dG9tKSB7XG4gICAgICB0aGlzLnNlbnRpbmVsQ3VycmVudGx5SW5WaWV3ID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcgfHwgIXRoaXMuY29uZmlnLmtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcWEtZHluYW1pYy1zZWxlY3Q6IGlucHV0IFwiY29uZmlnLmtleVwiIGlzIHJlcXVpcmVkLicpO1xuICAgIH1cbiAgICB0aGlzLmFwcGx5U2VsZWN0ZWRWYWx1ZUlmTmVlZGVkKCk7XG4gICAgdGhpcy5zeW5jRGlzYWJsZWRTdGF0ZSgpO1xuICAgIHRoaXMubGFzdE9wdGlvbnNMZW5ndGggPSAodGhpcy5jb25maWc/Lm9wdGlvbnMgfHwgW10pLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBkaXNwbGF5UGxhY2Vob2xkZXIoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybiB0aGlzLmNvbmZpZz8ucGxhY2Vob2xkZXI7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5mb3JtLmdldChrZXkpPy52YWx1ZTtcbiAgICByZXR1cm4gdGhpcy5oYXNFeGlzdGluZ1ZhbHVlKGNvbnRyb2xWYWx1ZSkgPyB1bmRlZmluZWQgOiB0aGlzLmNvbmZpZz8ucGxhY2Vob2xkZXI7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCdjb25maWcnIGluIGNoYW5nZXMgfHwgJ2Zvcm0nIGluIGNoYW5nZXMpIHtcbiAgICAgIHRoaXMuc3luY0Rpc2FibGVkU3RhdGUoKTtcbiAgICB9XG4gICAgaWYgKCdjb25maWcnIGluIGNoYW5nZXMpIHtcbiAgICAgIC8vIFdoZW4gY29uZmlnIGNoYW5nZXMgKGluY2x1ZGluZyB0b2dnbGluZyBtdWx0aXBsZSksIGVuc3VyZSBjb250cm9sIHZhbHVlIHNoYXBlIG1hdGNoZXNcbiAgICAgIHRoaXMuc3luY0NvbnRyb2xWYWx1ZUZvck11bHRpcGxlTW9kZSgpO1xuICAgICAgdGhpcy5hcHBseVNlbGVjdGVkVmFsdWVJZk5lZWRlZCgpO1xuICAgICAgLy8gU3luYyBsb2FkaW5nTW9yZSB3aXRoIGNvbmZpZy5pc0xvYWRpbmcgd2hlbiBwcm92aWRlZCBieSBwYXJlbnRcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHBhcmVudCB0byBjb250cm9sIGxvYWRpbmcgc3RhdGUgKGUuZy4sIGR1cmluZyBsb2FkIG1vcmUgb3BlcmF0aW9ucylcbiAgICAgIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IHRoaXMuY29uZmlnLmlzTG9hZGluZztcbiAgICAgIH1cbiAgICAgIC8vIFJlc2V0IGxvYWRpbmdNb3JlIHdoZW4gbmV3IG9wdGlvbnMgYXJyaXZlIChvcHRpb25zIGxlbmd0aCBpbmNyZWFzZWQpXG4gICAgICBjb25zdCBsZW4gPSAodGhpcy5jb25maWc/Lm9wdGlvbnMgfHwgW10pLmxlbmd0aDtcbiAgICAgIGlmIChsZW4gPiB0aGlzLmxhc3RPcHRpb25zTGVuZ3RoKSB7XG4gICAgICAgIC8vIFJlc2V0IGxvYWRpbmcgc3RhdGUgd2hlbiBuZXcgZGF0YSBhcnJpdmVzLCB1bmxlc3MgcGFyZW50IGV4cGxpY2l0bHkgc2F5cyBzdGlsbCBsb2FkaW5nXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBPbmx5IGF1dG8tcmVzZXQgaWYgcGFyZW50IGRvZXNuJ3QgY29udHJvbCBsb2FkaW5nIHN0YXRlXG4gICAgICAgICAgdGhpcy5sb2FkaW5nTW9yZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RPcHRpb25zTGVuZ3RoID0gbGVuO1xuICAgICAgLy8gSWYgY29uc3VtZXIgaW5kaWNhdGVzIG5vIG1vcmUgcmVzdWx0cywgY2xlYXIgbG9hZGluZyBzdGF0ZSBhbmQgYW55IG9ic2VydmVyc1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZz8uaGFzTW9yZSkge1xuICAgICAgICAvLyBDbGVhciBsb2FkaW5nIHN0YXRlIHdoZW4gbm8gbW9yZSByZXN1bHRzLCB1bmxlc3MgcGFyZW50IGV4cGxpY2l0bHkgc2F5cyBzdGlsbCBsb2FkaW5nXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nID09PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZz8uaXNMb2FkaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9hZE1vcmVPYnNlcnZlcikge1xuICAgICAgICAgIHRyeSB7IHRoaXMubG9hZE1vcmVPYnNlcnZlci5kaXNjb25uZWN0KCk7IH0gY2F0Y2gge31cbiAgICAgICAgICB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIElmIHBhbmVsIGlzIG9wZW4gYW5kIGhhc01vcmUgaXMgdHJ1ZSwgZW5zdXJlIHRoZSBzZW50aW5lbCBpcyBiZWluZyBvYnNlcnZlZC5cbiAgICAgIGlmICh0aGlzLnNlbGVjdFJlZj8ucGFuZWxPcGVuICYmIHRoaXMuY29uZmlnPy5oYXNNb3JlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXR1cExvYWRNb3JlT2JzZXJ2ZXIoKSwgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgnZm9ybScgaW4gY2hhbmdlcyAmJiAhY2hhbmdlc1snZm9ybSddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmFwcGx5U2VsZWN0ZWRWYWx1ZUlmTmVlZGVkKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBhbmVsQ2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGN0Yy1zZWxlY3QtcGFuZWwgJHt0aGlzLmlzTXVsdGlwbGUgPyAnbXVsdGlwbGUnIDogJyd9ICR7dGhpcy5jb25maWc/LmlzQ29tcGFyZVJ1bnMgPyAnY29tcGFyZS1ydW5zLXNlbGVjdC1wYW5lbCcgOiAnJ30gJHt0aGlzLmNvbmZpZz8uZXh0cmFQYW5lbENsYXNzID8/ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgZ2V0IGlzTXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHRoaXMuY29uZmlnPy5tdWx0aXBsZSk7XG4gIH1cblxuICBnZXQgc2luZ2xlU2VsZWN0ZWREaXNwbGF5TGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0gfHwgdGhpcy5pc011bHRpcGxlKSByZXR1cm4gJyc7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5mb3JtLmdldChrZXkpPy52YWx1ZTtcbiAgICBpZiAoY29udHJvbFZhbHVlID09PSBudWxsIHx8IGNvbnRyb2xWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGNvbnRyb2xWYWx1ZSA9PT0gJycpIHJldHVybiAnJztcbiAgICBjb25zdCBtYXRjaGVkT3B0aW9uID0gKHRoaXMuY29uZmlnPy5vcHRpb25zIHx8IFtdKS5maW5kKFxuICAgICAgKG9wdCkgPT4gdGhpcy5nZXRPcHRpb25WYWx1ZShvcHQpID09PSBjb250cm9sVmFsdWUgfHwgU3RyaW5nKHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0KSkgPT09IFN0cmluZyhjb250cm9sVmFsdWUpXG4gICAgKTtcbiAgICBpZiAobWF0Y2hlZE9wdGlvbikge1xuICAgICAgcmV0dXJuIFN0cmluZyhtYXRjaGVkT3B0aW9uLm5hbWUgPz8gbWF0Y2hlZE9wdGlvbi5sYWJlbCA/PyBtYXRjaGVkT3B0aW9uLnZhbHVlID8/IG1hdGNoZWRPcHRpb24uaWQgPz8gJycpO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKGNvbnRyb2xWYWx1ZSk7XG4gIH1cblxuICAvKiogUmVzb2x2ZWQgb3B0aW9uIGZvciBzaW5nbGUtc2VsZWN0IHRyaWdnZXIgKGljb24gKyBsYWJlbCkuICovXG4gIGdldCBzaW5nbGVTZWxlY3RlZE9wdGlvbigpOiBTZWxlY3RPcHRpb24gfCBudWxsIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0gfHwgdGhpcy5pc011bHRpcGxlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KGtleSk/LnZhbHVlO1xuICAgIGlmIChjb250cm9sVmFsdWUgPT09IG51bGwgfHwgY29udHJvbFZhbHVlID09PSB1bmRlZmluZWQgfHwgY29udHJvbFZhbHVlID09PSAnJykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbWF0Y2hlZCA9ICh0aGlzLmNvbmZpZz8ub3B0aW9ucyB8fCBbXSkuZmluZChcbiAgICAgIChvcHQpID0+IHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0KSA9PT0gY29udHJvbFZhbHVlIHx8IFN0cmluZyh0aGlzLmdldE9wdGlvblZhbHVlKG9wdCkpID09PSBTdHJpbmcoY29udHJvbFZhbHVlKVxuICAgICk7XG4gICAgcmV0dXJuIG1hdGNoZWQgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIEFQSSB0ZXN0VHlwZSBzdHJpbmdzIHRvIGljb24gdmFyaWFudHMuIFVua25vd24gbm9uLWVtcHR5IHZhbHVlcyB1c2UgJ290aGVyJy5cbiAgICovXG4gIHRlc3RUeXBlSWNvbktpbmQob3B0OiBTZWxlY3RPcHRpb24gfCBudWxsIHwgdW5kZWZpbmVkKTogJ21vYmlsZScgfCAnd2ViJyB8ICdvdGhlcicgfCBudWxsIHtcbiAgICBjb25zdCByYXcgPSBvcHQ/LnRlc3RUeXBlO1xuICAgIGlmIChyYXcgPT0gbnVsbCB8fCBTdHJpbmcocmF3KS50cmltKCkgPT09ICcnKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB1ID0gU3RyaW5nKHJhdykudHJpbSgpLnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKHUgPT09ICdNT0JJTEUnKSByZXR1cm4gJ21vYmlsZSc7XG4gICAgaWYgKHUgPT09ICdCUk9XU0VSJyB8fCB1ID09PSAnV0VCJykgcmV0dXJuICd3ZWInO1xuICAgIHJldHVybiAnb3RoZXInO1xuICB9XG5cbiAgZ2V0IGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHRoaXMuY29uZmlnPy5kaXNhYmxlZCk7XG4gIH1cbiAgXG4gIGdldCB1c2VDaGVja2JveFN0eWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTXVsdGlwbGUgJiYgKHRoaXMuY29uZmlnPy5vcHRpb25TdHlsZSA9PT0gJ2NoZWNrYm94Jyk7XG4gIH1cbiAgXG4gIGdldCBhbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNNdWx0aXBsZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBjb250cm9sLnZhbHVlIGFzIGFueVtdO1xuICAgIGNvbnN0IGFsbElkcyA9IHRoaXMuZ2V0QWxsT3B0aW9uSWRzKCk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNlbGVjdGVkKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghYWxsSWRzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBhbGxJZHMuZXZlcnkoaWQgPT4gc2VsZWN0ZWQuaW5jbHVkZXMoaWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9Cb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHYgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICh2ID09PSAndHJ1ZScgfHwgdiA9PT0gJzEnKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh2ID09PSAnZmFsc2UnIHx8IHYgPT09ICcwJyB8fCB2ID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGFueSBvdGhlciBub24tZW1wdHkgc3RyaW5nIHRyZWF0ZWQgYXMgdHJ1dGh5XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gdmFsdWUgIT09IDA7XG4gICAgfVxuICAgIHJldHVybiAhIXZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmFsdWUgZm9yIGFuIG9wdGlvbiBiYXNlZCBvbiB0aGUgdmFsdWVCeSBwcm9wZXJ0eS5cbiAgICogSWYgdmFsdWVCeSBpcyBwcm92aWRlZCwgdXNlIHRoYXQgcHJvcGVydHkgZnJvbSB0aGUgb3B0aW9uLlxuICAgKiBPdGhlcndpc2UsIGZhbGwgYmFjayB0byBpZCA/PyB2YWx1ZSAoZGVmYXVsdCBiZWhhdmlvcikuXG4gICAqIE11c3QgYmUgcHVibGljIGZvciB0ZW1wbGF0ZSBhY2Nlc3MuXG4gICAqL1xuICBnZXRPcHRpb25WYWx1ZShvcHQ6IFNlbGVjdE9wdGlvbik6IGFueSB7XG4gICAgaWYgKHRoaXMuY29uZmlnPy52YWx1ZUJ5KSB7XG4gICAgICAvLyBVc2UgdGhlIHByb3BlcnR5IHNwZWNpZmllZCBieSB2YWx1ZUJ5XG4gICAgICByZXR1cm4gKG9wdCBhcyBhbnkpW3RoaXMuY29uZmlnLnZhbHVlQnldO1xuICAgIH1cbiAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiB1c2UgaWQgPz8gdmFsdWVcbiAgICByZXR1cm4gb3B0LmlkID8/IG9wdC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIHRoZSBmb3JtIGNvbnRyb2wncyBkaXNhYmxlZCBzdGF0ZSBmcm9tIGNvbmZpZy5cbiAgICogVXNlIHRoZSBGb3JtQ29udHJvbCBBUEkgaW5zdGVhZCBvZiBbZGlzYWJsZWRdIGluIHRoZSB0ZW1wbGF0ZSB0byBhdm9pZCBBbmd1bGFyJ3NcbiAgICogXCJjaGFuZ2VkIGFmdGVyIGNoZWNrZWRcIiAvIHJlYWN0aXZlIGZvcm1zIGRpc2FibGVkLWF0dHJpYnV0ZSB3YXJuaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzeW5jRGlzYWJsZWRTdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybjtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuO1xuICAgIGNvbnN0IHNob3VsZERpc2FibGUgPSB0aGlzLnRvQm9vbGVhbih0aGlzLmNvbmZpZz8uZGlzYWJsZWQpO1xuICAgIGlmIChzaG91bGREaXNhYmxlKSB7XG4gICAgICBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29udHJvbFZhbHVlRm9yTXVsdGlwbGVNb2RlKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlID09IG51bGwpIHJldHVybjtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoW2N1cnJlbnRWYWx1ZV0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoY3VycmVudFZhbHVlLmxlbmd0aCA/IGN1cnJlbnRWYWx1ZVswXSA6IG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U2VsZWN0ZWRWYWx1ZUlmTmVlZGVkKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm47XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IHRoaXMuY29uZmlnPy5zZWxlY3RlZFZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgXG4gICAgLy8gSWYgdGhlcmUncyBhbiBleGlzdGluZyB2YWx1ZSwgZG9uJ3Qgb3ZlcnJpZGUgaXRcbiAgICBpZiAodGhpcy5oYXNFeGlzdGluZ1ZhbHVlKGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gRm9yIG11bHRpLXNlbGVjdDogaWYgY3VycmVudFZhbHVlIGlzIGFuIGVtcHR5IGFycmF5IFtdLCB0aGlzIGlzIGFuIGV4cGxpY2l0IHVzZXIgY2hvaWNlIHRvIGNsZWFyXG4gICAgLy8gRG9uJ3QgcmVzdG9yZSBmcm9tIHNlbGVjdGVkVmFsdWUgLSByZXNwZWN0IHRoZSB1c2VyJ3MgZGVjaXNpb24gdG8gZGVzZWxlY3QgYWxsXG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkgJiYgY3VycmVudFZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdGVkVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRWYWx1ZSkgPyBzZWxlY3RlZFZhbHVlIDogW3NlbGVjdGVkVmFsdWVdKS5maWx0ZXIoXG4gICAgICAgICh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkLFxuICAgICAgKTtcbiAgICAgIGlmICghbm9ybWFsaXplZC5sZW5ndGgpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUobm9ybWFsaXplZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gQXJyYXkuaXNBcnJheShzZWxlY3RlZFZhbHVlKVxuICAgICAgICA/IChzZWxlY3RlZFZhbHVlLmxlbmd0aCA/IHNlbGVjdGVkVmFsdWVbMF0gOiB1bmRlZmluZWQpXG4gICAgICAgIDogc2VsZWN0ZWRWYWx1ZTtcbiAgICAgIGlmIChub3JtYWxpemVkID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUobm9ybWFsaXplZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzRXhpc3RpbmdWYWx1ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuc29tZSgodmFsKSA9PiB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSAnJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWUudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaXNPcHRpb25TZWxlY3RlZChvcHQ6IFNlbGVjdE9wdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0KTtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udHJvbFZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGNvbnRyb2xWYWx1ZS5pbmNsdWRlcyhvcHRpb25WYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sVmFsdWUgPT09IG9wdGlvblZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxPcHRpb25JZHMoKTogYW55W10ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZz8ub3B0aW9ucyB8fCBbXTtcbiAgICByZXR1cm4gb3B0aW9ucy5tYXAobyA9PiB0aGlzLmdldE9wdGlvblZhbHVlKG8pKS5maWx0ZXIodiA9PiB2ICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgb25Ub2dnbGVTZWxlY3RBbGwoc2VsZWN0OiBNYXRTZWxlY3QpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybjtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuO1xuICAgIGNvbnN0IGFsbElkcyA9IHRoaXMuZ2V0QWxsT3B0aW9uSWRzKCk7XG4gICAgaWYgKCFhbGxJZHMubGVuZ3RoKSByZXR1cm47XG4gICAgaWYgKHRoaXMuYWxsU2VsZWN0ZWQpIHtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoW10sIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKGFsbElkcywgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgfVxuICAgIC8vIEtlZXAgcGFuZWwgb3BlbiBmb3IgY29udGludWVkIHNlbGVjdGlvbnMgaW4gbXVsdGktc2VsZWN0XG4gICAgdHJ5IHsgc2VsZWN0Lm9wZW4oKTsgfSBjYXRjaCB7fVxuICB9XG5cbiAgb25TZWxlY3RPcGVuZWRDaGFuZ2Uob3BlbmVkOiBib29sZWFuLCBfc2VsZWN0OiBNYXRTZWxlY3QpOiB2b2lkIHtcbiAgICBpZiAob3BlbmVkKSB7XG4gICAgICAvLyBFbWl0IGNsaWNrIGV2ZW50IHdoZW4gc2VsZWN0IGlzIG9wZW5lZCAoY2xpY2tlZClcbiAgICAgIHRoaXMuc2VsZWN0Q2xpY2suZW1pdCgpO1xuICAgICAgLy8gUmVzZXQgbG9hZGluZ01vcmUgd2hlbiBvcGVuaW5nIGlmIG9wdGlvbnMgYWxyZWFkeSBleGlzdCAoZG9uJ3Qgc2hvdyBsb2FkZXIgb24gaW5pdGlhbCBvcGVuKVxuICAgICAgaWYgKCh0aGlzLmNvbmZpZz8ub3B0aW9ucyB8fCBbXSkubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgd2Ugb25seSB0cmlnZ2VyIGxvYWQtbW9yZSBhZnRlciBhIHJlYWwgdXNlciBzY3JvbGxcbiAgICAgIHRoaXMuaGFzU2Nyb2xsZWRTaW5jZU9wZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFvcGVuZWQpIHtcbiAgICAgIC8vIFJlc2V0IHNlYXJjaCB0ZXh0IG9uIGNsb3NlIHNvIHRoZSBuZXh0IG9wZW4gc2hvd3MgZnVsbCBsaXN0XG4gICAgICBpZiAodGhpcy5jb25maWc/LmtleSkge1xuICAgICAgICB0aGlzLnNlYXJjaFRleHRCeUtleVt0aGlzLmNvbmZpZy5rZXldID0gJyc7XG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgYW55IHByZXZpb3VzIGN1c3RvbSBsaXN0ZW5lcnMgYXJlIGNsZWFyZWQgKGxlZ2FjeSBjb21wYXRpYmlsaXR5KVxuICAgICAgaWYgKHRoaXMub3V0c2lkZUNsZWFudXApIHtcbiAgICAgICAgdGhpcy5vdXRzaWRlQ2xlYW51cCgpO1xuICAgICAgICB0aGlzLm91dHNpZGVDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgLy8gUmVtb3ZlIGRvY3VtZW50IGtleWJvYXJkIGxpc3RlbmVyXG4gICAgICBpZiAodGhpcy5kb2N1bWVudEtleWRvd25MaXN0ZW5lcikge1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5kb2N1bWVudEtleWRvd25MaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRLZXlkb3duTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBEaXNjb25uZWN0IGxvYWQtbW9yZSBvYnNlcnZlciBpZiBhbnlcbiAgICAgIGlmICh0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIpIHtcbiAgICAgICAgdHJ5IHsgdGhpcy5sb2FkTW9yZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTsgfSBjYXRjaCB7fVxuICAgICAgICB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmUgc2Nyb2xsIGxpc3RlbmVyIGlmIGF0dGFjaGVkXG4gICAgICBpZiAodGhpcy5wYW5lbFNjcm9sbEVsKSB7XG4gICAgICAgIHRyeSB7IHRoaXMucGFuZWxTY3JvbGxFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uUGFuZWxTY3JvbGwpOyB9IGNhdGNoIHt9XG4gICAgICAgIHRoaXMucGFuZWxTY3JvbGxFbCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIC8vIFJlc2V0IGxvYWQtbW9yZSBzdGF0ZSB3aGVuIGNsb3NpbmdcbiAgICAgIHRoaXMubG9hZGluZ01vcmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VudGluZWxDdXJyZW50bHlJblZpZXcgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb2N1cyB0aGUgc2VhcmNoIGJveCBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMuY29uZmlnPy5zZWFyY2hhYmxlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcudHMtc2VsZWN0LXNlYXJjaC1pbnB1dCcpO1xuICAgICAgICBpbnB1dD8uZm9jdXMoKTtcbiAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIC8vIFNlcnZlci1zZWFyY2g6IHJlc2V0IHNlYXJjaCBhbmQgcmVmZXRjaCBmdWxsIGxpc3Qgd2hlbiBwYW5lbCBvcGVucyBzbyB1c2VyIGFsd2F5cyBzZWVzIGEgZnJlc2ggbGlzdC5cbiAgICBpZiAodGhpcy5jb25maWc/LnNlcnZlclNlYXJjaCkge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcua2V5O1xuICAgICAgdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSA9ICcnO1xuICAgICAgdHJ5IHsgdGhpcy5jb25maWcub25TZWFyY2g/LignJyk7IH0gY2F0Y2gge31cbiAgICAgIHRoaXMuc2VhcmNoQ2hhbmdlLmVtaXQoeyBrZXksIHF1ZXJ5OiAnJyB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudG9Cb29sZWFuKHRoaXMuY29uZmlnPy5pbml0aWFsRmV0Y2hPbk9wZW4pKSB7XG4gICAgICAvLyBOb24tc2VydmVyLXNlYXJjaDogb3B0aW9uYWwgaW5pdGlhbCBmZXRjaCBvbiBvcGVuIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5rZXk7XG4gICAgICBjb25zdCBxID0gdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSB8fCAnJztcbiAgICAgIHRyeSB7IHRoaXMuY29uZmlnLm9uU2VhcmNoPy4ocSk7IH0gY2F0Y2gge31cbiAgICAgIHRoaXMuc2VhcmNoQ2hhbmdlLmVtaXQoeyBrZXksIHF1ZXJ5OiBxIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2VudGluZWxDdXJyZW50bHlJblZpZXcgPSBmYWxzZTtcbiAgICB0aGlzLmhhc1Njcm9sbGVkU2luY2VPcGVuID0gZmFsc2U7XG4gICAgLy8gU2V0dXAgaW5maW5pdGUgc2Nyb2xsIG9ic2VydmVyIG9uIHNlbnRpbmVsXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldHVwTG9hZE1vcmVPYnNlcnZlcigpLCAwKTtcbiAgICAvLyBBbHNvIGF0dGFjaCBhIHNjcm9sbCBsaXN0ZW5lciBmYWxsYmFjayBmb3IgcmVsaWFibGUgbG9hZC1tb3JlIHRyaWdnZXJzXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYW5lbHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXQtc2VsZWN0LXBhbmVsJykpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICAgIHRoaXMucGFuZWxTY3JvbGxFbCA9IHBhbmVscy5sZW5ndGggPyBwYW5lbHNbcGFuZWxzLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5wYW5lbFNjcm9sbEVsKSB7XG4gICAgICAgICAgdGhpcy5wYW5lbFNjcm9sbEVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25QYW5lbFNjcm9sbCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfSwgMCk7XG4gICAgXG4gICAgLy8gU2V0dXAgZG9jdW1lbnQtbGV2ZWwga2V5Ym9hcmQgbGlzdGVuZXIgd2hpbGUgdGhlIHBhbmVsIGlzIG9wZW4uXG4gICAgLy8gTmVlZGVkIHRvIHJlbGlhYmx5IGludGVyY2VwdCBrZXkgY29tYm9zIChlLmcuIEN0cmwvQ21kK0EpIHRoYXQgY2FuIHRyaWdnZXIgQW5ndWxhciBNYXRlcmlhbCB0eXBlYWhlYWRcbiAgICAvLyBhbmQgYWNjaWRlbnRhbGx5IGFjdGl2YXRlIHRoZSBcIlNlbGVjdCBBbGxcIiBvcHRpb24gaW4gbXVsdGktc2VsZWN0cy5cbiAgICB0aGlzLnNldHVwRG9jdW1lbnRLZXlkb3duTGlzdGVuZXIoKTtcbiAgfVxuXG4gIG9uU2VhcmNoKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSA9IHZhbHVlID8/ICcnO1xuICAgIGlmICh0aGlzLmNvbmZpZz8uc2VydmVyU2VhcmNoKSB7XG4gICAgICAvLyBGb3Igc2VydmVyLXNpZGUgc2VhcmNoLCBlbWl0IGluc3RlYWQgb2YgbG9jYWwgZmlsdGVyaW5nXG4gICAgICB0cnkgeyB0aGlzLmNvbmZpZy5vblNlYXJjaD8uKHZhbHVlID8/ICcnKTsgfSBjYXRjaCB7fVxuICAgICAgdGhpcy5zZWFyY2hDaGFuZ2UuZW1pdCh7IGtleSwgcXVlcnk6IHZhbHVlID8/ICcnIH0pO1xuICAgICAgLy8gUmVzZXQgaW50ZXJuYWwgcGFnaW5nIHN0YXRlXG4gICAgICB0aGlzLmxvYWRpbmdNb3JlID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RPcHRpb25zTGVuZ3RoID0gKHRoaXMuY29uZmlnPy5vcHRpb25zIHx8IFtdKS5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMga2V5Ym9hcmQgZXZlbnRzIG9uIHRoZSBzZWFyY2ggaW5wdXQgdG8gZW5hYmxlIG5hdmlnYXRpb24gd2l0aCBhcnJvdyBrZXlzXG4gICAqIGFuZCBzZWxlY3Rpb24gd2l0aCBFbnRlciBrZXksIHdoaWxlIHN0aWxsIGFsbG93aW5nIHR5cGluZyBpbiB0aGUgc2VhcmNoIGJveC5cbiAgICovXG4gIG9uU2VhcmNoSW5wdXRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gZXZlbnQua2V5O1xuXG4gICAgLy8gUHJldmVudCBDdHJsL0NtZCArIEEgZnJvbSB0cmlnZ2VyaW5nIG1hdC1zZWxlY3QgdHlwZWFoZWFkL3NlbGVjdC1hbGwgYmVoYXZpb3JcbiAgICAvLyB3aGVuIHRoZSBkcm9wZG93biB1c2VzIGNoZWNrYm94LXN0eWxlIG11bHRpLXNlbGVjdC5cbiAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdhJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIEhhbmRsZSBuYXZpZ2F0aW9uIGFuZCBzZWxlY3Rpb24ga2V5c1xuICAgIGlmIChrZXkgPT09ICdBcnJvd1VwJyB8fCBrZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAvLyBTdG9wIHRoZSBldmVudCBjb21wbGV0ZWx5IGJlZm9yZSBkb2luZyBhbnl0aGluZ1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICBcbiAgICAgIC8vIE5hdmlnYXRlIGltbWVkaWF0ZWx5IChzeW5jaHJvbm91c2x5KSB0byBwcmV2ZW50IEFuZ3VsYXIgTWF0ZXJpYWwgZnJvbSBwcm9jZXNzaW5nXG4gICAgICB0aGlzLm5hdmlnYXRlT3B0aW9ucyhrZXkgPT09ICdBcnJvd0Rvd24nID8gMSA6IC0xKTtcbiAgICAgIFxuICAgICAgLy8gQmx1ciB0aGUgc2VhcmNoIGlucHV0IGFmdGVyIG5hdmlnYXRpb24gdG8gYWxsb3cgc3Vic2VxdWVudCBhcnJvdyBrZXlzIHRvIHdvcmsgbmF0dXJhbGx5XG4gICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgIC8vIFVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgdG8gYmx1ciBhZnRlciBvdXIgbmF2aWdhdGlvbiBjb21wbGV0ZXNcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBpbnB1dC5ibHVyKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBpZiAoa2V5ID09PSAnRW50ZXInKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy8gQmx1ciB0aGUgc2VhcmNoIGlucHV0XG4gICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgIGlucHV0LmJsdXIoKTtcbiAgICAgIH1cbiAgICAgIC8vIEZpbmQgYW5kIHNlbGVjdCB0aGUgYWN0aXZlIG9wdGlvblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1hdC1zZWxlY3QtcGFuZWwnKTtcbiAgICAgICAgaWYgKHBhbmVsKSB7XG4gICAgICAgICAgY29uc3QgYWN0aXZlT3B0aW9uID0gcGFuZWwucXVlcnlTZWxlY3RvcignLm1hdC1vcHRpb24ubWF0LWFjdGl2ZTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgaWYgKGFjdGl2ZU9wdGlvbikge1xuICAgICAgICAgICAgYWN0aXZlT3B0aW9uLmNsaWNrKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIG5vIGFjdGl2ZSBvcHRpb24sIHRyeSB0byBzZWxlY3QgdGhlIGZpcnN0IGVuYWJsZWQgb3B0aW9uXG4gICAgICAgICAgICBjb25zdCBmaXJzdE9wdGlvbiA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJy5tYXQtb3B0aW9uOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCk6bm90KC50cy1zZWxlY3Qtc2VhcmNoKScpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGZpcnN0T3B0aW9uKSB7XG4gICAgICAgICAgICAgIGZpcnN0T3B0aW9uLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCAxMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIEZvciBFc2NhcGUsIGFsbG93IGl0IHRvIHByb3BhZ2F0ZSAobWF0LXNlbGVjdCB3aWxsIGNsb3NlIHRoZSBwYW5lbClcbiAgICBpZiAoa2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBGb3IgYWxsIG90aGVyIGtleXMgKHR5cGluZyksIHN0b3AgcHJvcGFnYXRpb24gdG8gYWxsb3cgc2VhcmNoIGlucHV0IHRvIHdvcmsgbm9ybWFsbHlcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBvblNlbGVjdEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBIYXJkLWJsb2NrIEN0cmwvQ21kICsgQSBzbyBpdCBjYW4ndCB0cmlnZ2VyIEFuZ3VsYXIgTWF0ZXJpYWwgdHlwZWFoZWFkXG4gICAgLy8gdGhhdCBtYXkgZW5kIHVwIHNlbGVjdGluZyB0aGUgXCJBbGxcIiBvcHRpb24gaW4gY2hlY2tib3gtc3R5bGUgbXVsdGktc2VsZWN0cy5cbiAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09ICdhJyAmJiB0aGlzLmlzTXVsdGlwbGUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBuYXZpZ2F0ZXMgdGhyb3VnaCBvcHRpb25zIHdoZW4gYXJyb3cga2V5cyBhcmUgcHJlc3NlZCBmcm9tIHNlYXJjaCBpbnB1dC5cbiAgICogQHBhcmFtIGRpcmVjdGlvbiAxIGZvciBkb3duLCAtMSBmb3IgdXBcbiAgICovXG4gIHByaXZhdGUgbmF2aWdhdGVPcHRpb25zKGRpcmVjdGlvbjogMSB8IC0xKTogdm9pZCB7XG4gICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWF0LXNlbGVjdC1wYW5lbCcpO1xuICAgIGlmICghcGFuZWwpIHJldHVybjtcblxuICAgIC8vIEdldCBhbGwgZW5hYmxlZCwgbm9uLWRpc2FibGVkIG9wdGlvbnMgKGV4Y2x1ZGluZyBzZWFyY2ggaW5wdXQpXG4gICAgY29uc3QgYWxsT3B0aW9ucyA9IEFycmF5LmZyb20oXG4gICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsKCcubWF0LW9wdGlvbjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpOm5vdCgudHMtc2VsZWN0LXNlYXJjaCknKVxuICAgICkgYXMgSFRNTEVsZW1lbnRbXTtcblxuICAgIGlmIChhbGxPcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gRmluZCBjdXJyZW50bHkgYWN0aXZlIG9wdGlvblxuICAgIGxldCBjdXJyZW50SW5kZXggPSBhbGxPcHRpb25zLmZpbmRJbmRleChvcHQgPT4gb3B0LmNsYXNzTGlzdC5jb250YWlucygnbWF0LWFjdGl2ZScpKTtcblxuICAgIC8vIElmIG5vIGFjdGl2ZSBvcHRpb24sIHN0YXJ0IGF0IHRoZSBmaXJzdCBvbmUgKGZvciBkb3duKSBvciBsYXN0IG9uZSAoZm9yIHVwKVxuICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSB7XG4gICAgICBjdXJyZW50SW5kZXggPSBkaXJlY3Rpb24gPT09IDEgPyAtMSA6IGFsbE9wdGlvbnMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBuZXh0IGluZGV4XG4gICAgY29uc3QgbmV4dEluZGV4ID0gY3VycmVudEluZGV4ICsgZGlyZWN0aW9uO1xuXG4gICAgLy8gQm91bmRzIGNoZWNrXG4gICAgaWYgKG5leHRJbmRleCA8IDAgfHwgbmV4dEluZGV4ID49IGFsbE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFjdGl2ZSBjbGFzcyBmcm9tIGFsbCBvcHRpb25zXG4gICAgYWxsT3B0aW9ucy5mb3JFYWNoKG9wdCA9PiBvcHQuY2xhc3NMaXN0LnJlbW92ZSgnbWF0LWFjdGl2ZScpKTtcblxuICAgIC8vIEFkZCBhY3RpdmUgY2xhc3MgdG8gdGhlIHRhcmdldCBvcHRpb25cbiAgICBjb25zdCB0YXJnZXRPcHRpb24gPSBhbGxPcHRpb25zW25leHRJbmRleF07XG4gICAgdGFyZ2V0T3B0aW9uLmNsYXNzTGlzdC5hZGQoJ21hdC1hY3RpdmUnKTtcbiAgICBcbiAgICAvLyBTY3JvbGwgdGhlIG9wdGlvbiBpbnRvIHZpZXcgaWYgbmVlZGVkXG4gICAgdGFyZ2V0T3B0aW9uLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JywgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIFxuICAgIC8vIEZvY3VzIHRoZSBvcHRpb24gc28gQW5ndWxhciBNYXRlcmlhbCdzIGtleWJvYXJkIG1hbmFnZXIgY2FuIGhhbmRsZSBzdWJzZXF1ZW50IGFycm93IGtleXNcbiAgICAvLyBGb2N1c2luZyBhbiBvcHRpb24gZG9lc24ndCB0cmlnZ2VyIHNlbGVjdGlvbiBpbiBBbmd1bGFyIE1hdGVyaWFsIC0gb25seSBjbGljay9FbnRlciBkb2VzXG4gICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIHRoZSBET00gaXMgdXBkYXRlZCBmaXJzdFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGFyZ2V0T3B0aW9uLmZvY3VzKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbiBpZHMgZm9yIHRoZSBjb25maWd1cmVkIGNvbnRyb2wuXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdGVkSWRzRm9yS2V5KGtleTogc3RyaW5nKTogYW55W10ge1xuICAgIGlmICgha2V5IHx8ICF0aGlzLmZvcm0pIHJldHVybiBbXTtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCA/IFt2YWx1ZV0gOiBbXTtcbiAgfVxuXG4gIC8qKiBQcm9ncmFtbWF0aWNhbGx5IGNsb3NlIHRoZSBzZWxlY3QgcGFuZWwgaWYgb3BlbiAqL1xuICBwdWJsaWMgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zZWxlY3RSZWY/LmNsb3NlKCk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgZmlsdGVyZWRPcHRpb25zKGM6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyk6IFNlbGVjdE9wdGlvbltdIHtcbiAgICBjb25zdCB0ID0gKHRoaXMuc2VhcmNoVGV4dEJ5S2V5W2Mua2V5XSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgLy8gSW4gc2VydmVyLXNpZGUgbW9kZSwgcmV0dXJuIG9wdGlvbnMgYXMtaXMgKHBhcmVudCBwcm92aWRlcyBsaXN0KVxuICAgIGlmIChjLnNlcnZlclNlYXJjaCkgcmV0dXJuIGMub3B0aW9ucyB8fCBbXTtcbiAgICAvLyBXaGVuIG5vdCBzZWFyY2hpbmcsIHJldHVybiBmdWxsIGxpc3QgdG8gcHJlc2VydmUgb3JpZ2luYWwgb3JkZXJpbmdcbiAgICBpZiAoIXQpIHJldHVybiBjLm9wdGlvbnMgfHwgW107XG5cbiAgICBjb25zdCBhbGxPcHRpb25zID0gYy5vcHRpb25zIHx8IFtdO1xuICAgIGNvbnN0IGJhc2VGaWx0ZXJlZCA9IGFsbE9wdGlvbnMuZmlsdGVyKChvcHQpID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSBTdHJpbmcob3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiB0ZXh0LmluY2x1ZGVzKHQpO1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24ocykgYXJlIGFsd2F5cyB2aXNpYmxlIHdoaWxlIHNlYXJjaGluZ1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy5nZXRTZWxlY3RlZElkc0ZvcktleShjLmtleSk7XG4gICAgaWYgKCFzZWxlY3RlZElkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBiYXNlRmlsdGVyZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVPZiA9IChvOiBTZWxlY3RPcHRpb24pID0+IHRoaXMuZ2V0T3B0aW9uVmFsdWUobyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25zID0gYWxsT3B0aW9ucy5maWx0ZXIobyA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyh2YWx1ZU9mKG8pKSk7XG5cbiAgICAvLyBNZXJnZSBzZWxlY3RlZCBvcHRpb25zIChrZWVwaW5nIHRoZWlyIG9yaWdpbmFsIG9yZGVyKSB3aXRoIGZpbHRlcmVkIG9uZXMsIGRlLWR1cGxpY2F0ZWRcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxhbnk+KCk7XG4gICAgY29uc3QgbWVyZ2VkOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbyBvZiBzZWxlY3RlZE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHZhbHVlT2Yobyk7XG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFzZWVuLmhhcyh2YWwpKSB7XG4gICAgICAgIHNlZW4uYWRkKHZhbCk7XG4gICAgICAgIG1lcmdlZC5wdXNoKG8pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IG8gb2YgYmFzZUZpbHRlcmVkKSB7XG4gICAgICBjb25zdCB2YWwgPSB2YWx1ZU9mKG8pO1xuICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmICghc2Vlbi5oYXModmFsKSkge1xuICAgICAgICBzZWVuLmFkZCh2YWwpO1xuICAgICAgICBtZXJnZWQucHVzaChvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIC8qKiBXaGVuIGFsbG93Q3VzdG9tVmFsdWUgaXMgdHJ1ZSBhbmQgdGhlIHVzZXIgaGFzIHR5cGVkIGEgdmFsdWUgdGhhdCBpcyBub3QgaW4gb3B0aW9ucywgcmV0dXJucyB0aGF0IHZhbHVlIGZvciB0aGUgXCJBZGRcIiBvcHRpb24uICovXG4gIGdldCBjdXN0b21WYWx1ZVRvQWRkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGMgPSB0aGlzLmNvbmZpZztcbiAgICBpZiAoIWM/LmtleSB8fCAhdGhpcy50b0Jvb2xlYW4oYy5zZWFyY2hhYmxlKSB8fCAhdGhpcy50b0Jvb2xlYW4oYy5hbGxvd0N1c3RvbVZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdCA9ICh0aGlzLnNlYXJjaFRleHRCeUtleVtjLmtleV0gfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG9wdHMgPSBjLm9wdGlvbnMgfHwgW107XG4gICAgY29uc3QgbG93ZXIgPSB0LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IG9wdHMuc29tZSgobykgPT4ge1xuICAgICAgY29uc3QgdiA9IFN0cmluZyhvLm5hbWUgPz8gby5sYWJlbCA/PyBvLnZhbHVlID8/IG8uaWQgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gdiA9PT0gbG93ZXI7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFscmVhZHlFeGlzdHMgPyBudWxsIDogdDtcbiAgfVxuXG4gIGdldCBzaG93QWRkQ3VzdG9tT3B0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbVZhbHVlVG9BZGQgIT09IG51bGw7XG4gIH1cblxuICBnZXQgYWRkQ3VzdG9tU2VudGluZWxWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYgPSB0aGlzLmN1c3RvbVZhbHVlVG9BZGQ7XG4gICAgcmV0dXJuIHYgIT0gbnVsbCA/IGAke3RoaXMuQUREX0NVU1RPTV9WQUxVRV9QUkVGSVh9JHt2fWAgOiAnJztcbiAgfVxuXG4gIC8vIENsb3NlIHdoZW4gYW4gb3B0aW9uIGlzIHNlbGVjdGVkIGlmIHJlcXVlc3RlZC4gQWx3YXlzIGNsb3NlIGZvciBzaW5nbGUtc2VsZWN0LlxuICBvblNlbGVjdGlvbkNoYW5nZShldmVudDogTWF0U2VsZWN0Q2hhbmdlLCBzZWxlY3Q6IE1hdFNlbGVjdCk6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBhZGQtY3VzdG9tLXZhbHVlIHNlbnRpbmVsIChhbGxvd0N1c3RvbVZhbHVlKVxuICAgIGNvbnN0IHJhdyA9IGV2ZW50LnZhbHVlO1xuICAgIGNvbnN0IHNlbnRpbmVsSW5BcnJheSA9IEFycmF5LmlzQXJyYXkocmF3KVxuICAgICAgPyByYXcuZmluZCgodjogYW55KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi5zdGFydHNXaXRoKHRoaXMuQUREX0NVU1RPTV9WQUxVRV9QUkVGSVgpKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGlzQWRkQ3VzdG9tID1cbiAgICAgICh0eXBlb2YgcmF3ID09PSAnc3RyaW5nJyAmJiByYXcuc3RhcnRzV2l0aCh0aGlzLkFERF9DVVNUT01fVkFMVUVfUFJFRklYKSkgfHwgc2VudGluZWxJbkFycmF5ICE9IG51bGw7XG5cbiAgICBpZiAoaXNBZGRDdXN0b20pIHtcbiAgICAgIGNvbnN0IHNlbnRpbmVsU3RyID0gdHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgPyByYXcgOiBzZW50aW5lbEluQXJyYXk7XG4gICAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhzZW50aW5lbFN0cikuc2xpY2UodGhpcy5BRERfQ1VTVE9NX1ZBTFVFX1BSRUZJWC5sZW5ndGgpO1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleTtcbiAgICAgIGlmIChrZXkgJiYgdGhpcy5mb3JtKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KGNvbnRyb2wudmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IChjb250cm9sLnZhbHVlIGFzIGFueVtdKS5maWx0ZXIoXG4gICAgICAgICAgICAgICh2OiBhbnkpID0+IHR5cGVvZiB2ICE9PSAnc3RyaW5nJyB8fCAhdi5zdGFydHNXaXRoKHRoaXMuQUREX0NVU1RPTV9WQUxVRV9QUkVGSVgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShmaWx0ZXJlZCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkQ3VzdG9tVmFsdWUuZW1pdCh7IGtleToga2V5ID8/ICcnLCB2YWx1ZSB9KTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZz8uc2VhcmNoYWJsZSAmJiB0aGlzLmNvbmZpZz8ua2V5KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dEJ5S2V5W3RoaXMuY29uZmlnLmtleV0gPSAnJztcbiAgICAgIH1cbiAgICAgIHRyeSB7IHNlbGVjdC5jbG9zZSgpOyB9IGNhdGNoIHt9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEhhbmRsZSBzZWxlY3QtYWxsIHNlbnRpbmVsIGluIG11bHRpLXNlbGVjdFxuICAgIGlmICh0aGlzLmlzTXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheShldmVudC52YWx1ZSkgJiYgZXZlbnQudmFsdWUuaW5jbHVkZXModGhpcy5TRUxFQ1RfQUxMX1ZBTFVFKSkge1xuICAgICAgLy8gUmVtb3ZlIHNlbnRpbmVsIGFuZCB0b2dnbGUgYWxsXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZz8ua2V5O1xuICAgICAgaWYgKGtleSAmJiB0aGlzLmZvcm0pIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICAgICAgLy8gVG9nZ2xlIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGVcbiAgICAgICAgdGhpcy5vblRvZ2dsZVNlbGVjdEFsbChzZWxlY3QpO1xuICAgICAgICAvLyBFbnN1cmUgc2VudGluZWwgaXMgbm90IHByZXNlbnRcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IChjb250cm9sLnZhbHVlIGFzIGFueVtdKS5maWx0ZXIodiA9PiB2ICE9PSB0aGlzLlNFTEVDVF9BTExfVkFMVUUpO1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyZWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRG8gbm90IHByb2NlZWQgd2l0aCBub3JtYWwgY2xvc2UgbG9naWMgZm9yIHNlbGVjdC1hbGxcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTGV0IEFuZ3VsYXIgTWF0ZXJpYWwgYXV0by1jbG9zZSBmb3Igc2luZ2xlLXNlbGVjdC5cbiAgICAvLyBGb3IgbXVsdGktc2VsZWN0LCBjbG9zZSBvbmx5IGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAgIGNvbnN0IHNob3VsZENsb3NlID0gdGhpcy5pc011bHRpcGxlID8gISF0aGlzLmNvbmZpZz8uY2xvc2VPblNlbGVjdCA6IGZhbHNlO1xuICAgIGlmIChzaG91bGRDbG9zZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VsZWN0LmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICAgIC8vIElmIHNlYXJjaGFibGUsIGNsZWFyIHRoZSBzZWFyY2ggYWZ0ZXIgc2VsZWN0aW9uIHNvIHJlb3BlbmluZyB3b3JrcyBwcmVkaWN0YWJseVxuICAgIGlmICh0aGlzLmNvbmZpZz8uc2VhcmNoYWJsZSAmJiB0aGlzLmNvbmZpZz8ua2V5KSB7XG4gICAgICB0aGlzLnNlYXJjaFRleHRCeUtleVt0aGlzLmNvbmZpZy5rZXldID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZz8ub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uQ2hhbmdlKGV2ZW50LnZhbHVlLCBldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdjcWEtZHluYW1pYy1zZWxlY3Qgb25DaGFuZ2UgaGFuZGxlciBlcnJvcjonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7XG4gICAgICBrZXk6IHRoaXMuY29uZmlnPy5rZXksXG4gICAgICB2YWx1ZTogZXZlbnQudmFsdWUsXG4gICAgICBldmVudCxcbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIENsb3NlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgdHJpZ2dlciBhbmQgb3V0c2lkZSBvZiB0aGUgb3BlbiBwYW5lbFxuICAgIGlmICghdGhpcy5zZWxlY3RSZWY/LnBhbmVsT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgLy8gSWYgY2xpY2sgaXMgaW5zaWRlIHRoZSBjb21wb25lbnQgaG9zdCwgaWdub3JlXG4gICAgaWYgKHRoaXMuaG9zdEVsPy5uYXRpdmVFbGVtZW50ICYmIHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBVc2UgY29tcG9zZWRQYXRoKCkgdG8gY2FwdHVyZSB0aGUgZXZlbnQgZGlzcGF0Y2ggcGF0aCBhdCB0aGUgdGltZSBvZiB0aGUgY2xpY2ssXG4gICAgLy8gYmVmb3JlIGFueSBET00gbXV0YXRpb25zIHRyaWdnZXJlZCBieSBzZWxlY3Rpb24tY2hhbmdlIGhhbmRsZXJzIChlLmcuIG9wdGlvbnMgbGlzdFxuICAgIC8vIHJlYnVpbGQpLiBXaXRob3V0IHRoaXMsIHdoZW4gYW4gb3B0aW9uIGlzIHVuLWNoZWNrZWQgdGhlIGNvbnN1bWVyIG1heSByZWFzc2lnblxuICAgIC8vIGNvbmZpZyAobmV3IHJlZmVyZW5jZSkgd2hpY2ggY2F1c2VzIEFuZ3VsYXIgdG8gcmUtcmVuZGVyIGFuZCBkZXRhY2ggdGhlIG9yaWdpbmFsXG4gICAgLy8gY2xpY2stdGFyZ2V0IG5vZGUsIG1ha2luZyBlbC5jb250YWlucyh0YXJnZXQpIHJldHVybiBmYWxzZSBldmVuIGZvciBpbi1wYW5lbCBjbGlja3MuXG4gICAgY29uc3QgZXZlbnRQYXRoOiBFdmVudFRhcmdldFtdID0gKGV2ZW50LmNvbXBvc2VkUGF0aCA/IGV2ZW50LmNvbXBvc2VkUGF0aCgpIDogW10pO1xuICAgIGNvbnN0IHBhbmVsRWxzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWF0LXNlbGVjdC1wYW5lbCcpKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgIGNvbnN0IGNsaWNrSW5zaWRlUGFuZWwgPSBwYW5lbEVscy5zb21lKFxuICAgICAgKGVsKSA9PiBlbC5jb250YWlucyh0YXJnZXQpIHx8IGV2ZW50UGF0aC5pbmNsdWRlcyhlbCBhcyBFdmVudFRhcmdldClcbiAgICApO1xuICAgIGlmIChjbGlja0luc2lkZVBhbmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLnNlbGVjdFJlZi5jbG9zZSgpO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIC8qKlxuICAgKiBIaWdobGlnaHRzIHRleHQgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgaGlnaGxpZ2h0UGF0dGVybi5cbiAgICogUmV0dXJucyBIVE1MIHN0cmluZyB3aXRoIGhpZ2hsaWdodGVkIHBvcnRpb25zIHdyYXBwZWQgaW4gPHNwYW4gY2xhc3M9XCJoaWdobGlnaHRcIj4uXG4gICAqL1xuICBoaWdobGlnaHRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0IHx8ICF0aGlzLmNvbmZpZz8uaGlnaGxpZ2h0UGF0dGVybikge1xuICAgICAgcmV0dXJuIHRoaXMuZXNjYXBlSHRtbCh0ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5jb25maWcuaGlnaGxpZ2h0UGF0dGVybjtcblxuICAgIC8vIElmIGl0J3MgYSBmdW5jdGlvbiwgdXNlIGl0IGRpcmVjdGx5XG4gICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcGF0dGVybih0ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHN0cmluZyBwYXR0ZXJuIHRvIFJlZ0V4cCBpZiBuZWVkZWRcbiAgICBsZXQgcmVnZXg6IFJlZ0V4cDtcbiAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgJ2dpJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCBoaWdobGlnaHQgcGF0dGVybjonLCBwYXR0ZXJuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXNjYXBlSHRtbCh0ZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVnZXggPSBwYXR0ZXJuO1xuICAgIH1cblxuICAgIC8vIEVzY2FwZSBIVE1MIGZpcnN0LCB0aGVuIGFwcGx5IGhpZ2hsaWdodGluZ1xuICAgIGNvbnN0IGVzY2FwZWQgPSB0aGlzLmVzY2FwZUh0bWwodGV4dCk7XG4gICAgcmV0dXJuIGVzY2FwZWQucmVwbGFjZShyZWdleCwgKG1hdGNoKSA9PiBgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1wcmltYXJ5XCI+JHttYXRjaH08L3NwYW4+YCk7XG4gIH1cblxuICAvKipcbiAgICogRXNjYXBlcyBIVE1MIHNwZWNpYWwgY2hhcmFjdGVycyB0byBwcmV2ZW50IFhTUy5cbiAgICovXG4gIHByaXZhdGUgZXNjYXBlSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGhpZ2hsaWdodGluZyBpcyBlbmFibGVkIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGdldCBoYXNIaWdobGlnaHRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWc/LmhpZ2hsaWdodFBhdHRlcm47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBhIGRvY3VtZW50LWxldmVsIGtleWJvYXJkIGxpc3RlbmVyIHRvIGhhbmRsZSBhcnJvdyBrZXkgbmF2aWdhdGlvblxuICAgKiB3aGVuIHRoZSBwYW5lbCBpcyBvcGVuIGFuZCB0aGUgc2VhcmNoIGlucHV0IGlzIG5vdCBmb2N1c2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERvY3VtZW50S2V5ZG93bkxpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRvY3VtZW50S2V5ZG93bkxpc3RlbmVyKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5kb2N1bWVudEtleWRvd25MaXN0ZW5lcik7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZG9jdW1lbnRLZXlkb3duTGlzdGVuZXIgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIC8vIE9ubHkgaGFuZGxlIGlmIHBhbmVsIGlzIG9wZW5cbiAgICAgIGlmICghdGhpcy5zZWxlY3RSZWY/LnBhbmVsT3Blbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIERvbid0IGhhbmRsZSBpZiB0aGUgc2VhcmNoIGlucHV0IGlzIGZvY3VzZWQgKGl0IGhhcyBpdHMgb3duIGhhbmRsZXIpXG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGlmIChhY3RpdmVFbGVtZW50ICYmIGFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCd0cy1zZWxlY3Qtc2VhcmNoLWlucHV0JykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEb24ndCBoYW5kbGUgaWYgdXNlciBpcyB0eXBpbmcgaW4gYW5vdGhlciBpbnB1dFxuICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQgJiYgKGFjdGl2ZUVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBhY3RpdmVFbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gb3VyIHNlbGVjdCBwYW5lbFxuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWF0LXNlbGVjdC1wYW5lbCcpO1xuICAgICAgaWYgKCFwYW5lbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIE9ubHkgaGFuZGxlIGlmIHRoZSBldmVudCB0YXJnZXQgaXMgd2l0aGluIG91ciBjb21wb25lbnQgb3IgdGhlIHBhbmVsXG4gICAgICBjb25zdCBpc0luT3VyQ29tcG9uZW50ID0gdGhpcy5ob3N0RWw/Lm5hdGl2ZUVsZW1lbnQ/LmNvbnRhaW5zKHRhcmdldCkgfHwgcGFuZWwuY29udGFpbnModGFyZ2V0KTtcbiAgICAgIGlmICghaXNJbk91ckNvbXBvbmVudCAmJiB0YXJnZXQgIT09IGRvY3VtZW50LmJvZHkgJiYgdGFyZ2V0ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmV2ZW50IEN0cmwvQ21kICsgQSBmcm9tIHRyaWdnZXJpbmcgbWF0LXNlbGVjdCB0eXBlYWhlYWQvc2VsZWN0LWFsbCBiZWhhdmlvclxuICAgICAgLy8gKG9mdGVuIGVuZHMgdXAgc2VsZWN0aW5nIHRoZSBcIkFsbFwiIG9wdGlvbiBhbmQgc2VsZWN0aW5nIGV2ZXJ5dGhpbmcpLlxuICAgICAgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpID09PSAnYScgJiYgdGhpcy5pc011bHRpcGxlKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IGhhbmRsZSBhcnJvdyBrZXlzIGFuZCBFbnRlclxuICAgICAgaWYgKGV2ZW50LmtleSAhPT0gJ0Fycm93VXAnICYmIGV2ZW50LmtleSAhPT0gJ0Fycm93RG93bicgJiYgZXZlbnQua2V5ICE9PSAnRW50ZXInKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSGFuZGxlIGFycm93IGtleXMgZm9yIG5hdmlnYXRpb25cbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJyB8fCBldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGFuIG9wdGlvbiBpcyBjdXJyZW50bHkgZm9jdXNlZCAtIGlmIHNvLCBsZXQgQW5ndWxhciBNYXRlcmlhbCBoYW5kbGUgaXRcbiAgICAgICAgY29uc3QgZm9jdXNlZE9wdGlvbiA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3IoJy5tYXQtb3B0aW9uOmZvY3VzJyk7XG4gICAgICAgIGlmIChmb2N1c2VkT3B0aW9uKSB7XG4gICAgICAgICAgLy8gTGV0IEFuZ3VsYXIgTWF0ZXJpYWwgaGFuZGxlIGl0IG5hdHVyYWxseSB3aGVuIGFuIG9wdGlvbiBpcyBmb2N1c2VkXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBPbmx5IGludGVyY2VwdCB3aGVuIG5vIG9wdGlvbiBpcyBmb2N1c2VkIChlLmcuLCBhZnRlciBibHVycmluZyBzZWFyY2ggaW5wdXQpXG4gICAgICAgIC8vIFN0b3AgdGhlIGV2ZW50IGNvbXBsZXRlbHkgdG8gcHJldmVudCBBbmd1bGFyIE1hdGVyaWFsIGZyb20gYWxzbyBwcm9jZXNzaW5nIGl0XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZU9wdGlvbnMoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyA/IDEgOiAtMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSGFuZGxlIEVudGVyIGZvciBzZWxlY3Rpb25cbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAocGFuZWwpIHtcbiAgICAgICAgICBjb25zdCBhY3RpdmVPcHRpb24gPSBwYW5lbC5xdWVyeVNlbGVjdG9yKCcubWF0LW9wdGlvbi5tYXQtYWN0aXZlOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCknKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICBpZiAoYWN0aXZlT3B0aW9uKSB7XG4gICAgICAgICAgICBhY3RpdmVPcHRpb24uY2xpY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuZG9jdW1lbnRLZXlkb3duTGlzdGVuZXIsIHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExvYWRNb3JlT2JzZXJ2ZXIoKTogdm9pZCB7XG4gICAgLy8gT25seSBpZiBjb25zdW1lciBpbmRpY2F0ZXMgbW9yZSBkYXRhIGlzIGF2YWlsYWJsZVxuICAgIGlmICghdGhpcy5jb25maWc/Lmhhc01vcmUpIHJldHVybjtcbiAgICAvLyBGaW5kIHNlbnRpbmVsIG9wdGlvbiByZW5kZXJlZCBpbiB0aGUgb3BlbiBwYW5lbFxuICAgIGNvbnN0IHNlbnRpbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubG9hZC1tb3JlLXNlbnRpbmVsJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghc2VudGluZWwpIHJldHVybjtcbiAgICBpZiAodGhpcy5sb2FkTW9yZU9ic2VydmVyKSB7XG4gICAgICB0cnkgeyB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9IGNhdGNoIHt9XG4gICAgICB0aGlzLmxvYWRNb3JlT2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIFVzZSB0aGUgc2VudGluZWwncyBjbG9zZXN0IHBhbmVsIGFzIHRoZSByb290IHRvIGF2b2lkIHBpY2tpbmcgYSB3cm9uZyBwYW5lbFxuICAgIGNvbnN0IHBhbmVsUm9vdCA9IHNlbnRpbmVsLmNsb3Nlc3QoJy5tYXQtc2VsZWN0LXBhbmVsJykgYXMgRWxlbWVudCB8IG51bGw7XG4gICAgdGhpcy5sb2FkTW9yZU9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgLy8gT25seSB0cmlnZ2VyIHdoZW4gc2VudGluZWwganVzdCBjYW1lIGludG8gdmlldyAodXNlciBzY3JvbGxlZCB0byBib3R0b20pLlxuICAgICAgICAgIC8vIElmIGl0IHdhcyBhbHJlYWR5IGluIHZpZXcgKGUuZy4gYWZ0ZXIgbmV3IGRhdGEgYXBwZW5kZWQpLCBkbyBub3QgdHJpZ2dlciBhZ2Fpbi5cbiAgICAgICAgICBjb25zdCB3YXNPdXRPZlZpZXcgPSAhdGhpcy5zZW50aW5lbEN1cnJlbnRseUluVmlldztcbiAgICAgICAgICB0aGlzLnNlbnRpbmVsQ3VycmVudGx5SW5WaWV3ID0gdHJ1ZTtcbiAgICAgICAgICBpZiAod2FzT3V0T2ZWaWV3ICYmIHRoaXMuaGFzU2Nyb2xsZWRTaW5jZU9wZW4gJiYgIXRoaXMubG9hZGluZ01vcmUgJiYgdGhpcy5jb25maWc/Lmhhc01vcmUpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ01vcmUgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWc/LmtleSB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaFRleHRCeUtleVtrZXldIHx8ICcnO1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9yZS5lbWl0KHsga2V5LCBxdWVyeTogcSB9KTtcbiAgICAgICAgICAgIHRyeSB7IHRoaXMuY29uZmlnLm9uTG9hZE1vcmU/LihxKTsgfSBjYXRjaCB7fVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZW50aW5lbCBsZWZ0IHZpZXcgKHVzZXIgc2Nyb2xsZWQgdXApIOKAkyBhbGxvdyBuZXh0IGxvYWQgbW9yZSB3aGVuIHRoZXkgc2Nyb2xsIGRvd24gYWdhaW5cbiAgICAgICAgICB0aGlzLnNlbnRpbmVsQ3VycmVudGx5SW5WaWV3ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7IHJvb3Q6IHBhbmVsUm9vdCwgdGhyZXNob2xkOiAwLjEgfSk7XG4gICAgdHJ5IHsgdGhpcy5sb2FkTW9yZU9ic2VydmVyLm9ic2VydmUoc2VudGluZWwpOyB9IGNhdGNoIHt9XG4gIH1cbn1cblxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLXVpLXJvb3RcIj5cbiAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8bGFiZWwgKm5nSWY9XCJjb25maWcubGFiZWxcIlxuICAgICAgY2xhc3M9XCJmb3JtLWxhYmVsIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1ibG9jayBjcWEtbGVhZGluZy1bMS40XSBjcWEtbWItMlwiPnt7XG4gICAgICBjb25maWcubGFiZWwgfX08L2xhYmVsPlxuICAgIDxtYXQtZm9ybS1maWVsZCAjaG9zdCBjbGFzcz1cIm1hdC1zZWxlY3QtY3VzdG9tIGNxYS13LWZ1bGxcIiBhcHBlYXJhbmNlPVwiZmlsbFwiPlxuICAgICAgPG1hdC1zZWxlY3QgI3NlbGVjdFJlZj1cIm1hdFNlbGVjdFwiIFtwbGFjZWhvbGRlcl09XCJkaXNwbGF5UGxhY2Vob2xkZXJcIiBbbXVsdGlwbGVdPVwiaXNNdWx0aXBsZVwiXG4gICAgICAgIGRpc2FibGVPcHRpb25DZW50ZXJpbmcgW3BhbmVsQ2xhc3NdPVwicGFuZWxDbGFzc1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiY29uZmlnLmtleVwiXG4gICAgICAgIChvcGVuZWRDaGFuZ2UpPVwib25TZWxlY3RPcGVuZWRDaGFuZ2UoJGV2ZW50LCBzZWxlY3RSZWYpXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQsIHNlbGVjdFJlZilcIlxuICAgICAgICAoa2V5ZG93bik9XCJvblNlbGVjdEtleWRvd24oJGV2ZW50KVwiPlxuICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyICpuZ0lmPVwiIWlzTXVsdGlwbGUgJiYgc2luZ2xlU2VsZWN0ZWREaXNwbGF5TGFiZWxcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnPy5zaG93VGVzdFR5cGVJY29uXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJvcHRpb25UZXN0VHlwZUljb25UcGw7IGNvbnRleHQ6IHsga2luZDogdGVzdFR5cGVJY29uS2luZChzaW5nbGVTZWxlY3RlZE9wdGlvbikgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1taW4tdy0wXCIgW2lubmVySFRNTF09XCJzaW5nbGVTZWxlY3RlZERpc3BsYXlMYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxuXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwiY29uZmlnLnNlYXJjaGFibGVcIiBjbGFzcz1cInRzLXNlbGVjdC1zZWFyY2hcIiBkaXNhYmxlZD5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ0cy1zZWxlY3Qtc2VhcmNoLWlucHV0IGNxYS10ZXh0LWJsYWNrLTEwMFwiIHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cInNlYXJjaFRleHRCeUtleVtjb25maWcua2V5XSB8fCAnJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25TZWFyY2hJbnB1dEtleWRvd24oJGV2ZW50KVwiIChpbnB1dCk9XCJvblNlYXJjaChjb25maWcua2V5LCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIC8+XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgXG4gICAgICAgIDxtYXQtb3B0aW9uIFtuZ0NsYXNzXT1cInsnY2hlY2ttYXJrJzogY29uZmlnLm9wdGlvblN0eWxlID09PSAnY2hlY2ttYXJrJywnY2hlY2tib3gnOiBjb25maWcub3B0aW9uU3R5bGUgIT09ICdjaGVja21hcmsnLCdtYXQtc2VsZWN0ZWQnOiBhbGxTZWxlY3RlZH1cIiBbY2xhc3NdPVwiY29uZmlnLm9wdGlvblN0eWxlID09ICdjaGVja21hcmsnID8gJ2NoZWNrbWFyaycgOiAnY2hlY2tib3gnXCIgKm5nSWY9XCJpc011bHRpcGxlICYmIGNvbmZpZy5zaG93U2VsZWN0QWxsXCIgW3ZhbHVlXT1cIlNFTEVDVF9BTExfVkFMVUVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlQ2hlY2tib3hTdHlsZTsgZWxzZSBzZWxlY3RBbGxEZWZhdWx0VHBsXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXJvdW5kZWQtWzRweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRDFENURCXSBjcWEtbXItMiBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtYm9yZGVyLXNvbGlkXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJhbGxTZWxlY3RlZCA/IHsnYmFja2dyb3VuZC1jb2xvcic6JyM0RjQ2RTUnLCdib3JkZXItY29sb3InOicjNEY0NkU1J30gOiB7fVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJhbGxTZWxlY3RlZFwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgM0w0LjUgOC41TDIgNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1pbi13LTBcIj57eyBjb25maWcuc2VsZWN0QWxsTGFiZWwgfHwgJ0FsbCcgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzZWxlY3RBbGxEZWZhdWx0VHBsPlxuICAgICAgICAgICAge3sgY29uZmlnLnNlbGVjdEFsbExhYmVsIHx8ICdBbGwnIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwic2hvd0FkZEN1c3RvbU9wdGlvblwiIFt2YWx1ZV09XCJhZGRDdXN0b21TZW50aW5lbFZhbHVlXCIgY2xhc3M9XCJjcWEtdGV4dC1wcmltYXJ5XCI+XG4gICAgICAgICAgTmV3XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cblxuICAgICAgICA8bWF0LW9wdGlvbiBbY2xhc3NdPVwiY29uZmlnLm9wdGlvblN0eWxlID09ICdjaGVja21hcmsnID8gJ2NoZWNrbWFyaycgOiAnY2hlY2tib3gnXCIgKm5nRm9yPVwibGV0IG9wdCBvZiBmaWx0ZXJlZE9wdGlvbnMoY29uZmlnKVwiIFt2YWx1ZV09XCJnZXRPcHRpb25WYWx1ZShvcHQpXCIgW3RpdGxlXT1cIm9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnLmlzQ29tcGFyZVJ1bnNcIj4gICBcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VDaGVja2JveFN0eWxlOyBlbHNlIGNvbXBhcmVSdW5zRGVmYXVsdE9wdGlvblRwbFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS1jb21wYXJlLXJ1bnMtaXRlbVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXJvdW5kZWQtWzRweF0gY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRDFENURCXSBjcWEtbXItMiBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtYm9yZGVyLXNvbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiaXNPcHRpb25TZWxlY3RlZChvcHQpID8geydiYWNrZ3JvdW5kLWNvbG9yJzonIzRGNDZFNScsJ2JvcmRlci1jb2xvcic6JyM0RjQ2RTUnfSA6IHt9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc09wdGlvblNlbGVjdGVkKG9wdClcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMCAzTDQuNSA4LjVMMiA2XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtbWluLXctMCBjcWEtY29tcGFyZS1ydW5zXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoYXNIaWdobGlnaHRpbmdcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwib3B0LnN0YXR1c0NvbG9yIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImhpZ2hsaWdodFRleHQob3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSlcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWhhc0hpZ2hsaWdodGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1pbi13LTAgY3FhLWNvbXBhcmUtcnVuc1wiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJvcHQucnVuTnVtYmVyTGFiZWwgJiYgb3B0LnJ1bkRhdGVMYWJlbDsgZWxzZSBjaGVja2JveERlZmF1bHRMYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtzdHlsZS5jb2xvcl09XCJvcHQuc3RhdHVzQ29sb3IgfHwgbnVsbFwiPnt7IG9wdC5ydW5OdW1iZXJMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXVwiPiB7eyBvcHQucnVuRGF0ZUxhYmVsIH19Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tib3hEZWZhdWx0TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1pbi13LTAgY3FhLWNvbXBhcmUtcnVuc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwib3B0LnN0YXR1c0NvbG9yIHx8IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0LmR1cmF0aW9uRm9ybWF0dGVkXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1zdGFydCBjcWEtZ2FwLTEgY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtZmxleC1zaHJpbmstMCBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLW1heC13LVs4MHB4XVwiIFxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAnY3FhLW1pbi13LVs4MnB4XSc6IG9wdD8uaGFzSG91clJ1bixcbiAgICAgICAgICAgICAgICAgICAgJ2NxYS1taW4tdy1bNjZweF0nOiAhb3B0Py5oYXNIb3VyUnVuICYmIG9wdD8uaGFzTWludXRlUnVuLFxuICAgICAgICAgICAgICAgICAgICAnY3FhLW1pbi13LVs0MHB4XSc6ICFvcHQ/Lmhhc0hvdXJSdW4gJiYgIW9wdD8uaGFzTWludXRlUnVuXG4gICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3FhLW1pbi13LVsxMnB4XSBjcWEtbWF4LXctWzEycHhdXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiNlwiIGN5PVwiNlwiIHI9XCI0LjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMVwiLz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02IDMuNVY2TDcuNSA3XCIgc3Ryb2tlPVwiIzRCNTU2M1wiIHN0cm9rZS13aWR0aD1cIjFcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IG9wdC5kdXJhdGlvbkZvcm1hdHRlZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb21wYXJlUnVuc0RlZmF1bHRPcHRpb25UcGw+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWNvbXBhcmUtcnVucy1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1pbi13LTAgY3FhLWNvbXBhcmUtcnVuc1wiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImhhc0hpZ2hsaWdodGluZ1wiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwib3B0LnN0YXR1c0NvbG9yIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJoaWdobGlnaHRUZXh0KG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGFzSGlnaGxpZ2h0aW5nXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS1jb21wYXJlLXJ1bnNcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm9wdC5ydW5OdW1iZXJMYWJlbCAmJiBvcHQucnVuRGF0ZUxhYmVsOyBlbHNlIGRlZmF1bHRMYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUuY29sb3JdPVwib3B0LnN0YXR1c0NvbG9yIHx8IG51bGxcIj57eyBvcHQucnVuTnVtYmVyTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdXCI+IHt7IG9wdC5ydW5EYXRlTGFiZWwgfX0mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS1jb21wYXJlLXJ1bnNcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJvcHQuc3RhdHVzQ29sb3IgfHwgbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJvcHQuZHVyYXRpb25Gb3JtYXR0ZWRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1nYXAtMSBjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1mbGV4LXNocmluay0wIGNxYS13aGl0ZXNwYWNlLW5vd3JhcCBjcWEtbWF4LXctWzgwcHhdXCIgXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICdjcWEtbWluLXctWzgycHhdJzogb3B0Py5oYXNIb3VyUnVuLFxuICAgICAgICAgICAgICAgICAgICAnY3FhLW1pbi13LVs2NnB4XSc6ICFvcHQ/Lmhhc0hvdXJSdW4gJiYgb3B0Py5oYXNNaW51dGVSdW4sXG4gICAgICAgICAgICAgICAgICAgICdjcWEtbWluLXctWzQwcHhdJzogIW9wdD8uaGFzSG91clJ1biAmJiAhb3B0Py5oYXNNaW51dGVSdW5cbiAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtbWluLXctWzEycHhdIGNxYS1tYXgtdy1bMTJweF1cIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI2XCIgY3k9XCI2XCIgcj1cIjQuNVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIxXCIvPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYgMy41VjZMNy41IDdcIiBzdHJva2U9XCIjNEI1NTYzXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgb3B0LmR1cmF0aW9uRm9ybWF0dGVkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbmZpZy5pc0NvbXBhcmVSdW5zXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlQ2hlY2tib3hTdHlsZTsgZWxzZSBkZWZhdWx0T3B0aW9uVHBsXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb25maWc/LnNob3dUZXN0VHlwZUljb247IGVsc2UgY2hlY2tib3hOb0ljb25UcGxcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwib3B0aW9uVGVzdFR5cGVJY29uVHBsOyBjb250ZXh0OiB7IGtpbmQ6IHRlc3RUeXBlSWNvbktpbmQob3B0KSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS13LTQgY3FhLWgtNCBjcWEtZmxleC1zaHJpbmstMCBjcWEtcm91bmRlZC1bNHB4XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNEMUQ1REJdIGNxYS1tci0yIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1ib3JkZXItc29saWRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJpc09wdGlvblNlbGVjdGVkKG9wdCkgPyB7J2JhY2tncm91bmQtY29sb3InOicjNEY0NkU1JywnYm9yZGVyLWNvbG9yJzonIzRGNDZFNSd9IDoge31cIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzT3B0aW9uU2VsZWN0ZWQob3B0KVwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDNMNC41IDguNUwyIDZcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1taW4tdy0wXCIgKm5nSWY9XCJjb25maWc/LmRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sXCIgW2lubmVySFRNTF09XCJvcHQubGFiZWwgPz8gb3B0Lm5hbWUgPz8gb3B0LnZhbHVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbWluLXctMFwiICpuZ0lmPVwiIWNvbmZpZz8uZGlzcGxheUxhYmVsQXNJbm5lckh0bWwgJiYgaGFzSGlnaGxpZ2h0aW5nXCIgW2lubmVySFRNTF09XCJoaWdobGlnaHRUZXh0KG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbWluLXctMFwiICpuZ0lmPVwiIWNvbmZpZz8uZGlzcGxheUxhYmVsQXNJbm5lckh0bWwgJiYgIWhhc0hpZ2hsaWdodGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja2JveE5vSWNvblRwbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00IGNxYS1mbGV4LXNocmluay0wIGNxYS1yb3VuZGVkLVs0cHhdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0QxRDVEQl0gY3FhLW1yLTIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWJvcmRlci1zb2xpZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0KSA/IHsnYmFja2dyb3VuZC1jb2xvcic6JyM0RjQ2RTUnLCdib3JkZXItY29sb3InOicjNEY0NkU1J30gOiB7fVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNPcHRpb25TZWxlY3RlZChvcHQpXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgM0w0LjUgOC41TDIgNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29uZmlnPy5kaXNwbGF5TGFiZWxBc0lubmVySHRtbFwiIFtpbm5lckhUTUxdPVwib3B0LmxhYmVsID8/IG9wdC5uYW1lID8/IG9wdC52YWx1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWNvbmZpZz8uZGlzcGxheUxhYmVsQXNJbm5lckh0bWwgJiYgaGFzSGlnaGxpZ2h0aW5nXCIgW2lubmVySFRNTF09XCJoaWdobGlnaHRUZXh0KG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhY29uZmlnPy5kaXNwbGF5TGFiZWxBc0lubmVySHRtbCAmJiAhaGFzSGlnaGxpZ2h0aW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE9wdGlvblRwbD5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbmZpZz8uc2hvd1Rlc3RUeXBlSWNvbjsgZWxzZSBkZWZhdWx0Tm9JY29uVHBsXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm9wdGlvblRlc3RUeXBlSWNvblRwbDsgY29udGV4dDogeyBraW5kOiB0ZXN0VHlwZUljb25LaW5kKG9wdCkgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtbWluLXctMFwiICpuZ0lmPVwiY29uZmlnPy5kaXNwbGF5TGFiZWxBc0lubmVySHRtbFwiIFtpbm5lckhUTUxdPVwib3B0LmxhYmVsID8/IG9wdC5uYW1lID8/IG9wdC52YWx1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1pbi13LTBcIiAqbmdJZj1cIiFjb25maWc/LmRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sICYmIGhhc0hpZ2hsaWdodGluZ1wiIFtpbm5lckhUTUxdPVwiaGlnaGxpZ2h0VGV4dChvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlKVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1pbi13LTBcIiAqbmdJZj1cIiFjb25maWc/LmRpc3BsYXlMYWJlbEFzSW5uZXJIdG1sICYmICFoYXNIaWdobGlnaHRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgb3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE5vSWNvblRwbD5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbmZpZz8uZGlzcGxheUxhYmVsQXNJbm5lckh0bWxcIiBbaW5uZXJIVE1MXT1cIm9wdC5sYWJlbCA/PyBvcHQubmFtZSA/PyBvcHQudmFsdWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhY29uZmlnPy5kaXNwbGF5TGFiZWxBc0lubmVySHRtbCAmJiBoYXNIaWdobGlnaHRpbmdcIiBbaW5uZXJIVE1MXT1cImhpZ2hsaWdodFRleHQob3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZSlcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhY29uZmlnPy5kaXNwbGF5TGFiZWxBc0lubmVySHRtbCAmJiAhaGFzSGlnaGxpZ2h0aW5nXCI+XG4gICAgICAgICAgICAgICAgICB7eyBvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICBcbiAgICAgICAgPCEtLSBObyByZXN1bHRzIHN0YXRlIChvbmx5IHdoZW4gbm90IGxvYWRpbmcgYW5kIG5vIG9wdGlvbnMpIC0tPlxuICAgICAgICA8bWF0LW9wdGlvbiBkaXNhYmxlZCAqbmdJZj1cIiEoY29uZmlnPy5vcHRpb25zPy5sZW5ndGggfHwgMCkgJiYgIShjb25maWc/LmlzTG9hZGluZyB8fCBsb2FkaW5nTW9yZSlcIj5cbiAgICAgICAgICBObyByZXN1bHRzXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPCEtLSBJbmZpbml0ZSBzY3JvbGwgc2VudGluZWwgKHNlcnZlclNlYXJjaCBvciBleHBsaWNpdCBoYXNNb3JlKSAtLT5cbiAgICAgICAgPG1hdC1vcHRpb24gZGlzYWJsZWQgY2xhc3M9XCJsb2FkLW1vcmUtc2VudGluZWxcIiAqbmdJZj1cImNvbmZpZz8uaGFzTW9yZVwiPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwibG9hZGluZ01vcmUgfHwgY29uZmlnPy5pc0xvYWRpbmdcIj5Mb2FkaW5nLi4uPC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWxvYWRpbmdNb3JlICYmICFjb25maWc/LmlzTG9hZGluZ1wiPlNjcm9sbCB0byBsb2FkIG1vcmXigKY8L3NwYW4+XG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICA8IS0tIElubGluZSBzcGlubmVyIHNob3duIHdoZW4gbG9hZGluZyBtb3JlIChpbmZpbml0ZSBzY3JvbGwpIG9yIHdoZW4gY29uZmlnLmlzTG9hZGluZyBpcyB0cnVlIC0tPlxuICAgICAgICA8c3ZnICpuZ0lmPVwibG9hZGluZ01vcmUgfHwgY29uZmlnPy5pc0xvYWRpbmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDUwIDUwXCIgYXJpYS1sYWJlbD1cImxvYWRpbmdcIlxuICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjVcIiBjeT1cIjI1XCIgcj1cIjIwXCIgc3Ryb2tlPVwiI0U1RTdFQlwiIHN0cm9rZS13aWR0aD1cIjZcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTQ1IDI1YTIwIDIwIDAgMCAwLTIwLTIwXCIgc3Ryb2tlPVwiIzRGNDZFNVwiIHN0cm9rZS13aWR0aD1cIjZcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj5cbiAgICAgICAgICAgIDxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9XCJ0cmFuc2Zvcm1cIiB0eXBlPVwicm90YXRlXCIgZnJvbT1cIjAgMjUgMjVcIiB0bz1cIjM2MCAyNSAyNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXI9XCIwLjhzXCIgcmVwZWF0Q291bnQ9XCJpbmRlZmluaXRlXCIvPlxuICAgICAgICAgIDwvcGF0aD5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiMwQTBBMEFcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9kaXY+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGUgI29wdGlvblRlc3RUeXBlSWNvblRwbCBsZXQta2luZD1cImtpbmRcIj5cbiAgICA8c3BhbiAqbmdJZj1cImtpbmQgPT09ICdtb2JpbGUnXCIgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWl0ZW1zLWNlbnRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBzdHJva2U9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgPHBhdGggZD1cIk02IDVhMiAyIDAgMCAxIDIgLTJoOGEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMSAtMiAyaC04YTIgMiAwIDAgMSAtMiAtMnYtMTRcIi8+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTEgNGgyXCIvPlxuICAgICAgICA8cGF0aCBkPVwiTTEyIDE3di4wMVwiLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cImtpbmQgPT09ICd3ZWInXCIgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWl0ZW1zLWNlbnRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBzdHJva2U9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgPHBhdGggZD1cIk0zIDEyYTkgOSAwIDEgMCAxOCAwYTkgOSAwIDAgMCAtMTggMFwiLz5cbiAgICAgICAgPHBhdGggZD1cIk0zLjYgOWgxNi44XCIvPlxuICAgICAgICA8cGF0aCBkPVwiTTMuNiAxNWgxNi44XCIvPlxuICAgICAgICA8cGF0aCBkPVwiTTExLjUgM2ExNyAxNyAwIDAgMCAwIDE4XCIvPlxuICAgICAgICA8cGF0aCBkPVwiTTEyLjUgM2ExNyAxNyAwIDAgMSAwIDE4XCIvPlxuICAgICAgPC9zdmc+XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwia2luZCA9PT0gJ290aGVyJ1wiIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1mbGV4LXNocmluay0wIGNxYS1pdGVtcy1jZW50ZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTQgNi41aDE2djExSDR6XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICA8cGF0aCBkPVwiTTggNi41VjVoOHYxLjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvc3Bhbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PiJdfQ==
|