@valtimo/task-management 12.1.3 → 12.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/task-management-column-modal/task-management-column-modal.component.mjs +2 -2
- package/esm2022/lib/components/task-management-detail/task-management-detail.component.mjs +2 -2
- package/esm2022/lib/components/task-management-search-fields/task-management-search-fields.component.mjs +8 -6
- package/esm2022/lib/components/task-management-search-fields-modal/task-management-search-fields-modal.component.mjs +14 -9
- package/fesm2022/valtimo-task-management.mjs +19 -13
- package/fesm2022/valtimo-task-management.mjs.map +1 -1
- package/lib/components/task-management-search-fields/task-management-search-fields.component.d.ts.map +1 -1
- package/lib/components/task-management-search-fields-modal/task-management-search-fields-modal.component.d.ts +6 -2
- package/lib/components/task-management-search-fields-modal/task-management-search-fields-modal.component.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -18,7 +18,7 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from
|
|
|
18
18
|
import { ReactiveFormsModule, Validators, } from '@angular/forms';
|
|
19
19
|
import { InformationFilled16, TrashCan16 } from '@carbon/icons';
|
|
20
20
|
import { TranslateModule } from '@ngx-translate/core';
|
|
21
|
-
import { CARBON_CONSTANTS, CarbonListModule, InputLabelModule, ViewType, } from '@valtimo/components';
|
|
21
|
+
import { CARBON_CONSTANTS, CarbonListModule, InputLabelModule, ValuePathSelectorComponent, ValuePathSelectorPrefix, ViewType, } from '@valtimo/components';
|
|
22
22
|
import { TaskListSearchDropdownDataProvider, TaskListSearchFieldDataType, TaskListSearchFieldFieldType, TaskListSearchFieldMatchType, } from '@valtimo/task';
|
|
23
23
|
import { ButtonModule, DropdownModule, IconModule, InputModule, ModalModule, } from 'carbon-components-angular';
|
|
24
24
|
import { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, startWith, switchMap, } from 'rxjs';
|
|
@@ -27,8 +27,9 @@ import * as i1 from "@valtimo/document";
|
|
|
27
27
|
import * as i2 from "carbon-components-angular";
|
|
28
28
|
import * as i3 from "@angular/forms";
|
|
29
29
|
import * as i4 from "@ngx-translate/core";
|
|
30
|
-
import * as i5 from "@angular/
|
|
31
|
-
import * as i6 from "@
|
|
30
|
+
import * as i5 from "@angular/router";
|
|
31
|
+
import * as i6 from "@angular/common";
|
|
32
|
+
import * as i7 from "@valtimo/components";
|
|
32
33
|
export class TaskManagementSearchFieldsModalComponent {
|
|
33
34
|
set prefillData(value) {
|
|
34
35
|
this._prefillData = value;
|
|
@@ -83,11 +84,12 @@ export class TaskManagementSearchFieldsModalComponent {
|
|
|
83
84
|
const formArray = this.form.get('dropdownValues');
|
|
84
85
|
return !formArray ? null : formArray;
|
|
85
86
|
}
|
|
86
|
-
constructor(documentService, iconService, fb, translateService) {
|
|
87
|
+
constructor(documentService, iconService, fb, translateService, route) {
|
|
87
88
|
this.documentService = documentService;
|
|
88
89
|
this.iconService = iconService;
|
|
89
90
|
this.fb = fb;
|
|
90
91
|
this.translateService = translateService;
|
|
92
|
+
this.route = route;
|
|
91
93
|
this.closeEvent = new EventEmitter();
|
|
92
94
|
this.form = this.fb.group({
|
|
93
95
|
key: this.fb.control('', Validators.required),
|
|
@@ -196,6 +198,8 @@ export class TaskManagementSearchFieldsModalComponent {
|
|
|
196
198
|
id: TaskListSearchFieldMatchType.EXACT,
|
|
197
199
|
},
|
|
198
200
|
].map(item => ({ ...item, selected: item.id === matchTypeValue?.id }))));
|
|
201
|
+
this.documentDefinitionName$ = this.route.params.pipe(map(params => params.name || ''), filter(docDefName => !!docDefName));
|
|
202
|
+
this.ValuePathSelectorPrefix = ValuePathSelectorPrefix;
|
|
199
203
|
this.iconService.registerAll([TrashCan16, InformationFilled16]);
|
|
200
204
|
}
|
|
201
205
|
ngOnInit() {
|
|
@@ -323,8 +327,8 @@ export class TaskManagementSearchFieldsModalComponent {
|
|
|
323
327
|
this.form.enable();
|
|
324
328
|
}, CARBON_CONSTANTS.modalAnimationMs);
|
|
325
329
|
}
|
|
326
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskManagementSearchFieldsModalComponent, deps: [{ token: i1.DocumentService }, { token: i2.IconService }, { token: i3.FormBuilder }, { token: i4.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
327
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TaskManagementSearchFieldsModalComponent, isStandalone: true, selector: "valtimo-task-management-search-fields-modal", inputs: { open: "open", documentDefinitionName: "documentDefinitionName", prefillData: "prefillData" }, outputs: { closeEvent: "closeEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<cds-modal [open]=\"open\" showFooter=\"true\">\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"onCancel()\">\n <h3 cdsModalHeaderHeading>\n {{ (!prefillData ? 'searchFieldsOverview.add' : 'searchFieldsOverview.edit') | translate }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent>\n <form [formGroup]=\"form\" class=\"valtimo-task-management-search-fields-modal__content\">\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.title' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n >\n </v-input-label>\n\n <input cdsText type=\"text\" formControlName=\"title\" />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.key' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n >\n </v-input-label>\n\n <input cdsText type=\"text\" formControlName=\"key\" />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.path' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.path' | translate\"\n >\n </v-input-label>\n\n <input cdsText type=\"text\" formControlName=\"path\" />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dataType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown formControlName=\"dataType\">\n <cds-dropdown-list [items]=\"dataTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dataTypeValue === TaskListSearchFieldDataType.TEXT) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.matchType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.matchType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown formControlName=\"matchType\">\n <cds-dropdown-list [items]=\"matchTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n }\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.fieldType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown formControlName=\"fieldType\">\n <cds-dropdown-list [items]=\"fieldTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (\n dataTypeValue === TaskListSearchFieldDataType.TEXT &&\n (fieldTypeValue === TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN ||\n fieldTypeValue === TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN)\n ) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownDataProvider' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownDataProvider' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown formControlName=\"dropdownDataProvider\">\n <cds-dropdown-list [items]=\"dataProviderItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.DATABASE) {\n <div\n class=\"valtimo-task-management-search-fields-modal__list\"\n formArrayName=\"dropdownValues\"\n >\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownListValues' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownListValues' | translate\"\n [noMargin]=\"true\"\n >\n </v-input-label>\n\n @for (dropdownValue of dropdownValuesArray?.controls; track $index) {\n <form\n [formGroup]=\"dropdownValue\"\n class=\"valtimo-task-management-search-fields-modal__dropdown-values\"\n >\n <cds-text-label>\n {{ 'interface.key' | translate }}\n\n <input cdsText type=\"text\" formControlName=\"key\" />\n </cds-text-label>\n\n <cds-text-label>\n {{ 'interface.value' | translate }}\n\n <input cdsText type=\"text\" formControlName=\"value\" />\n </cds-text-label>\n\n <button\n cdsButton=\"danger\"\n [disabled]=\"$count === 1\"\n [iconOnly]=\"true\"\n (click)=\"removeDropdownValue($index)\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </form>\n }\n\n <button cdsButton=\"primary\" (click)=\"addDropdownValue()\">\n {{ 'interface.addRow' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </div>\n } @else if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.JSON) {\n <valtimo-carbon-list\n [header]=\"false\"\n [hideToolbar]=\"true\"\n [fields]=\"DROPDOWN_FIELDS\"\n [items]=\"dropdownReadonlyItems$ | async\"\n ></valtimo-carbon-list>\n }\n }\n </form>\n </section>\n\n <cds-modal-footer>\n <button cdsButton=\"ghost\" (click)=\"onCancel()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button cdsButton=\"primary\" [disabled]=\"form.invalid\" (click)=\"onSave()\">\n {{ 'interface.save' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n", styles: [".valtimo-task-management-search-fields-modal__content,.valtimo-task-management-search-fields-modal__dropdown-values{display:flex;gap:16px}.valtimo-task-management-search-fields-modal__content{flex-direction:column}.valtimo-task-management-search-fields-modal__dropdown-values{align-items:flex-end;gap:16px}.valtimo-task-management-search-fields-modal__label{display:flex;gap:4px}.valtimo-task-management-search-fields-modal__list{display:flex;flex-direction:column;gap:16px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i2.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i2.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "ngmodule", type: InputModule }, { kind: "component", type: i2.TextInputLabelComponent, selector: "cds-text-label, ibm-text-label", inputs: ["labelInputID", "disabled", "skeleton", "labelTemplate", "textInputTemplate", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i2.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "ngmodule", type: ModalModule }, { kind: "component", type: i2.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i2.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i2.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i2.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i2.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "ngmodule", type: CarbonListModule }, { kind: "component", type: i6.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "actions", "actionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "ngmodule", type: InputLabelModule }, { kind: "component", type: i6.InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
330
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskManagementSearchFieldsModalComponent, deps: [{ token: i1.DocumentService }, { token: i2.IconService }, { token: i3.FormBuilder }, { token: i4.TranslateService }, { token: i5.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
331
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TaskManagementSearchFieldsModalComponent, isStandalone: true, selector: "valtimo-task-management-search-fields-modal", inputs: { open: "open", documentDefinitionName: "documentDefinitionName", prefillData: "prefillData" }, outputs: { closeEvent: "closeEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<cds-modal [open]=\"open\" showFooter=\"true\">\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"onCancel()\">\n <h3 cdsModalHeaderHeading>\n {{ (!prefillData ? 'searchFieldsOverview.add' : 'searchFieldsOverview.edit') | translate }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent>\n <form [formGroup]=\"form\" class=\"valtimo-task-management-search-fields-modal__content\">\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.title' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n >\n </v-input-label>\n\n <input\n data-testid=\"task-management-search-title\"\n cdsText\n type=\"text\"\n formControlName=\"title\"\n />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.key' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n >\n </v-input-label>\n\n <input data-testid=\"task-management-search-key\" cdsText type=\"text\" formControlName=\"key\" />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.path' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.path' | translate\"\n >\n </v-input-label>\n\n <valtimo-value-path-selector\n formControlName=\"path\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n ></valtimo-value-path-selector>\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dataType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown data-testid=\"task-management-search-dataType\" formControlName=\"dataType\">\n <cds-dropdown-list [items]=\"dataTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dataTypeValue === TaskListSearchFieldDataType.TEXT) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.matchType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.matchType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown data-testid=\"task-management-search-matchType\" formControlName=\"matchType\">\n <cds-dropdown-list [items]=\"matchTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n }\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.fieldType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown data-testid=\"task-management-search-fieldType\" formControlName=\"fieldType\">\n <cds-dropdown-list [items]=\"fieldTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (\n dataTypeValue === TaskListSearchFieldDataType.TEXT &&\n (fieldTypeValue === TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN ||\n fieldTypeValue === TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN)\n ) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownDataProvider' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownDataProvider' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown\n data-testid=\"task-management-search-dropdownDataProvider\"\n formControlName=\"dropdownDataProvider\"\n >\n <cds-dropdown-list [items]=\"dataProviderItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.DATABASE) {\n <div\n class=\"valtimo-task-management-search-fields-modal__list\"\n formArrayName=\"dropdownValues\"\n >\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownListValues' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownListValues' | translate\"\n [noMargin]=\"true\"\n >\n </v-input-label>\n\n @for (dropdownValue of dropdownValuesArray?.controls; track $index) {\n <form\n [formGroup]=\"dropdownValue\"\n class=\"valtimo-task-management-search-fields-modal__dropdown-values\"\n >\n <cds-text-label>\n {{ 'interface.value' | translate }}\n\n <input\n data-testid=\"task-management-search-dropdownKey\"\n cdsText\n type=\"text\"\n formControlName=\"key\"\n />\n </cds-text-label>\n\n <cds-text-label>\n {{ 'interface.display' | translate }}\n\n <input\n data-testid=\"task-management-search-dropdownValue\"\n cdsText\n type=\"text\"\n formControlName=\"value\"\n />\n </cds-text-label>\n\n <button\n cdsButton=\"danger\"\n data-testid=\"task-management-search-deleteEnum\"\n [disabled]=\"$count === 1\"\n [iconOnly]=\"true\"\n (click)=\"removeDropdownValue($index)\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </form>\n }\n\n <button\n data-testid=\"task-management-search-addDropdownValue\"\n cdsButton=\"primary\"\n (click)=\"addDropdownValue()\"\n >\n {{ 'interface.addRow' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </div>\n } @else if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.JSON) {\n <valtimo-carbon-list\n [header]=\"false\"\n [hideToolbar]=\"true\"\n [fields]=\"DROPDOWN_FIELDS\"\n [items]=\"dropdownReadonlyItems$ | async\"\n ></valtimo-carbon-list>\n }\n }\n </form>\n </section>\n\n <cds-modal-footer>\n <button data-testid=\"task-management-search-cancel\" cdsButton=\"ghost\" (click)=\"onCancel()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button\n data-testid=\"task-management-search-save\"\n cdsButton=\"primary\"\n [disabled]=\"form.invalid\"\n (click)=\"onSave()\"\n >\n {{ 'interface.save' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n", styles: [".valtimo-task-management-search-fields-modal__content,.valtimo-task-management-search-fields-modal__dropdown-values{display:flex;gap:16px}.valtimo-task-management-search-fields-modal__content{flex-direction:column}.valtimo-task-management-search-fields-modal__dropdown-values{align-items:flex-end;gap:16px}.valtimo-task-management-search-fields-modal__label{display:flex;gap:4px}.valtimo-task-management-search-fields-modal__list{display:flex;flex-direction:column;gap:16px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i2.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "hideLabel", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i2.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "ngmodule", type: InputModule }, { kind: "component", type: i2.TextInputLabelComponent, selector: "cds-text-label, ibm-text-label", inputs: ["labelInputID", "disabled", "skeleton", "labelTemplate", "textInputTemplate", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i2.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "ngmodule", type: ModalModule }, { kind: "component", type: i2.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i2.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i2.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i2.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i2.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "ngmodule", type: CarbonListModule }, { kind: "component", type: i7.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "actions", "actionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "ngmodule", type: InputLabelModule }, { kind: "component", type: i7.InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }, { kind: "component", type: ValuePathSelectorComponent, selector: "valtimo-value-path-selector", inputs: ["name", "appendInline", "margin", "marginLg", "marginXl", "disabled", "documentDefinitionName", "version", "prefixes", "label", "tooltip", "required", "showDocumentDefinitionSelector", "notation", "defaultValue"], outputs: ["valueChangeEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
328
332
|
}
|
|
329
333
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskManagementSearchFieldsModalComponent, decorators: [{
|
|
330
334
|
type: Component,
|
|
@@ -339,8 +343,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
339
343
|
IconModule,
|
|
340
344
|
CarbonListModule,
|
|
341
345
|
InputLabelModule,
|
|
342
|
-
|
|
343
|
-
|
|
346
|
+
ValuePathSelectorComponent,
|
|
347
|
+
], template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<cds-modal [open]=\"open\" showFooter=\"true\">\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"onCancel()\">\n <h3 cdsModalHeaderHeading>\n {{ (!prefillData ? 'searchFieldsOverview.add' : 'searchFieldsOverview.edit') | translate }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent>\n <form [formGroup]=\"form\" class=\"valtimo-task-management-search-fields-modal__content\">\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.title' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n >\n </v-input-label>\n\n <input\n data-testid=\"task-management-search-title\"\n cdsText\n type=\"text\"\n formControlName=\"title\"\n />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.key' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n >\n </v-input-label>\n\n <input data-testid=\"task-management-search-key\" cdsText type=\"text\" formControlName=\"key\" />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.path' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.path' | translate\"\n >\n </v-input-label>\n\n <valtimo-value-path-selector\n formControlName=\"path\"\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [prefixes]=\"[ValuePathSelectorPrefix.DOC, ValuePathSelectorPrefix.CASE]\"\n ></valtimo-value-path-selector>\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dataType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown data-testid=\"task-management-search-dataType\" formControlName=\"dataType\">\n <cds-dropdown-list [items]=\"dataTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dataTypeValue === TaskListSearchFieldDataType.TEXT) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.matchType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.matchType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown data-testid=\"task-management-search-matchType\" formControlName=\"matchType\">\n <cds-dropdown-list [items]=\"matchTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n }\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.fieldType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown data-testid=\"task-management-search-fieldType\" formControlName=\"fieldType\">\n <cds-dropdown-list [items]=\"fieldTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (\n dataTypeValue === TaskListSearchFieldDataType.TEXT &&\n (fieldTypeValue === TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN ||\n fieldTypeValue === TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN)\n ) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownDataProvider' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownDataProvider' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown\n data-testid=\"task-management-search-dropdownDataProvider\"\n formControlName=\"dropdownDataProvider\"\n >\n <cds-dropdown-list [items]=\"dataProviderItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.DATABASE) {\n <div\n class=\"valtimo-task-management-search-fields-modal__list\"\n formArrayName=\"dropdownValues\"\n >\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownListValues' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownListValues' | translate\"\n [noMargin]=\"true\"\n >\n </v-input-label>\n\n @for (dropdownValue of dropdownValuesArray?.controls; track $index) {\n <form\n [formGroup]=\"dropdownValue\"\n class=\"valtimo-task-management-search-fields-modal__dropdown-values\"\n >\n <cds-text-label>\n {{ 'interface.value' | translate }}\n\n <input\n data-testid=\"task-management-search-dropdownKey\"\n cdsText\n type=\"text\"\n formControlName=\"key\"\n />\n </cds-text-label>\n\n <cds-text-label>\n {{ 'interface.display' | translate }}\n\n <input\n data-testid=\"task-management-search-dropdownValue\"\n cdsText\n type=\"text\"\n formControlName=\"value\"\n />\n </cds-text-label>\n\n <button\n cdsButton=\"danger\"\n data-testid=\"task-management-search-deleteEnum\"\n [disabled]=\"$count === 1\"\n [iconOnly]=\"true\"\n (click)=\"removeDropdownValue($index)\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </form>\n }\n\n <button\n data-testid=\"task-management-search-addDropdownValue\"\n cdsButton=\"primary\"\n (click)=\"addDropdownValue()\"\n >\n {{ 'interface.addRow' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </div>\n } @else if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.JSON) {\n <valtimo-carbon-list\n [header]=\"false\"\n [hideToolbar]=\"true\"\n [fields]=\"DROPDOWN_FIELDS\"\n [items]=\"dropdownReadonlyItems$ | async\"\n ></valtimo-carbon-list>\n }\n }\n </form>\n </section>\n\n <cds-modal-footer>\n <button data-testid=\"task-management-search-cancel\" cdsButton=\"ghost\" (click)=\"onCancel()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button\n data-testid=\"task-management-search-save\"\n cdsButton=\"primary\"\n [disabled]=\"form.invalid\"\n (click)=\"onSave()\"\n >\n {{ 'interface.save' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n", styles: [".valtimo-task-management-search-fields-modal__content,.valtimo-task-management-search-fields-modal__dropdown-values{display:flex;gap:16px}.valtimo-task-management-search-fields-modal__content{flex-direction:column}.valtimo-task-management-search-fields-modal__dropdown-values{align-items:flex-end;gap:16px}.valtimo-task-management-search-fields-modal__label{display:flex;gap:4px}.valtimo-task-management-search-fields-modal__list{display:flex;flex-direction:column;gap:16px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
|
|
348
|
+
}], ctorParameters: () => [{ type: i1.DocumentService }, { type: i2.IconService }, { type: i3.FormBuilder }, { type: i4.TranslateService }, { type: i5.ActivatedRoute }], propDecorators: { open: [{
|
|
344
349
|
type: Input,
|
|
345
350
|
args: [{ required: true }]
|
|
346
351
|
}], documentDefinitionName: [{
|
|
@@ -351,4 +356,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
351
356
|
}], closeEvent: [{
|
|
352
357
|
type: Output
|
|
353
358
|
}] } });
|
|
354
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrLW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vdGFzay1tYW5hZ2VtZW50L3NyYy9saWIvY29tcG9uZW50cy90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbC90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUwsbUJBQW1CLEVBRW5CLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFDLGVBQWUsRUFBbUIsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUVoQixnQkFBZ0IsRUFDaEIsUUFBUSxHQUNULE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxFQUNMLGtDQUFrQyxFQUdsQywyQkFBMkIsRUFDM0IsNEJBQTRCLEVBQzVCLDRCQUE0QixHQUM3QixNQUFN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WTt3QkFDWixlQUFlO3dCQUNmLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxXQUFXO3dCQUNYLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixVQUFVO3dCQUNWLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3FCQUNqQjt1S0FHd0IsSUFBSTtzQkFBNUIsS0FBSzt1QkFBQyxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUM7Z0JBQ0Usc0JBQXNCO3NCQUE5QyxLQUFLO3VCQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQztnQkFHSCxXQUFXO3NCQUE5QixLQUFLO2dCQU9JLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEZvcm1BcnJheSxcbiAgRm9ybUJ1aWxkZXIsXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7SW5mb3JtYXRpb25GaWxsZWQxNiwgVHJhc2hDYW4xNn0gZnJvbSAnQGNhcmJvbi9pY29ucyc7XG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1xuICBDQVJCT05fQ09OU1RBTlRTLFxuICBDYXJib25MaXN0TW9kdWxlLFxuICBDb2x1bW5Db25maWcsXG4gIElucHV0TGFiZWxNb2R1bGUsXG4gIFZpZXdUeXBlLFxufSBmcm9tICdAdmFsdGltby9jb21wb25lbnRzJztcbmltcG9ydCB7RG9jdW1lbnRTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQge1xuICBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyLFxuICBUYXNrTGlzdFNlYXJjaERyb3Bkb3duVmFsdWUsXG4gIFRhc2tMaXN0U2VhcmNoRmllbGQsXG4gIFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZSxcbiAgVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZSxcbiAgVGFza0xpc3RTZWFyY2hGaWVsZE1hdGNoVHlwZSxcbn0gZnJvbSAnQHZhbHRpbW8vdGFzayc7XG5pbXBvcnQge1xuICBCdXR0b25Nb2R1bGUsXG4gIERyb3Bkb3duTW9kdWxlLFxuICBJY29uTW9kdWxlLFxuICBJY29uU2VydmljZSxcbiAgSW5wdXRNb2R1bGUsXG4gIExpc3RJdGVtLFxuICBNb2RhbE1vZHVsZSxcbn0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG59IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsLmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBEcm9wZG93bk1vZHVsZSxcbiAgICBJbnB1dE1vZHVsZSxcbiAgICBNb2RhbE1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEljb25Nb2R1bGUsXG4gICAgQ2FyYm9uTGlzdE1vZHVsZSxcbiAgICBJbnB1dExhYmVsTW9kdWxlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNrTWFuYWdlbWVudFNlYXJjaEZpZWxkc01vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KHtyZXF1aXJlZDogdHJ1ZX0pIG9wZW46IGJvb2xlYW47XG4gIEBJbnB1dCh7cmVxdWlyZWQ6IHRydWV9KSBkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfcHJlZmlsbERhdGE6IFRhc2tMaXN0U2VhcmNoRmllbGQgfCBudWxsO1xuICBASW5wdXQoKSBwdWJsaWMgc2V0IHByZWZpbGxEYXRhKHZhbHVlOiBUYXNrTGlzdFNlYXJjaEZpZWxkIHwgbnVsbCkge1xuICAgIHRoaXMuX3ByZWZpbGxEYXRhID0gdmFsdWU7XG4gICAgdGhpcy5zZXRQcmVmaWxsZWRGb3JtKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHByZWZpbGxEYXRhKCk6IFRhc2tMaXN0U2VhcmNoRmllbGQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZmlsbERhdGE7XG4gIH1cbiAgQE91dHB1dCgpIGNsb3NlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFBhcnRpYWw8VGFza0xpc3RTZWFyY2hGaWVsZD4gfCBudWxsPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBmb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAga2V5OiB0aGlzLmZiLmNvbnRyb2w8c3RyaW5nPignJywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgdGl0bGU6IHRoaXMuZmIuY29udHJvbDxzdHJpbmc+KCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICBwYXRoOiB0aGlzLmZiLmNvbnRyb2w8c3RyaW5nPignJywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgZGF0YVR5cGU6IHRoaXMuZmIuY29udHJvbDxMaXN0SXRlbSB8IG51bGw+KG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIG1hdGNoVHlwZTogdGhpcy5mYi5jb250cm9sPExpc3RJdGVtIHwgbnVsbD4obnVsbCwgdGhpcy5tYXRjaFR5cGVWYWxpZGF0b3IpLFxuICAgIGZpZWxkVHlwZTogdGhpcy5mYi5jb250cm9sPExpc3RJdGVtIHwgbnVsbD4obnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgZHJvcGRvd25EYXRhUHJvdmlkZXI6IHRoaXMuZmIuY29udHJvbDxMaXN0SXRlbSB8IG51bGw+KG51bGwpLFxuICAgIGRyb3Bkb3duVmFsdWVzOiB0aGlzLmZiLmFycmF5PHtrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZ30+KFtdKSxcbiAgfSk7XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBBYnN0cmFjdENvbnRyb2w8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2RhdGFUeXBlJyk7XG4gIH1cbiAgcHVibGljIGdldCBkYXRhVHlwZVZhbHVlJCgpOiBPYnNlcnZhYmxlPExpc3RJdGVtIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFUeXBlLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmRhdGFUeXBlLnZhbHVlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1hdGNoVHlwZSgpOiBBYnN0cmFjdENvbnRyb2w8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ21hdGNoVHlwZScpO1xuICB9XG4gIHB1YmxpYyBnZXQgbWF0Y2hUeXBlVmFsdWUkKCk6IE9ic2VydmFibGU8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hUeXBlLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLm1hdGNoVHlwZS52YWx1ZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBkcm9wZG93bkRhdGFQcm92aWRlcigpOiBBYnN0cmFjdENvbnRyb2w8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duRGF0YVByb3ZpZGVyJyk7XG4gIH1cbiAgcHVibGljIGdldCBkcm9wZG93bkRhdGFQcm92aWRlclZhbHVlJCgpOiBPYnNlcnZhYmxlPExpc3RJdGVtIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyLnZhbHVlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkVHlwZSgpOiBBYnN0cmFjdENvbnRyb2w8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2ZpZWxkVHlwZScpO1xuICB9XG4gIHB1YmxpYyBnZXQgZmllbGRUeXBlVmFsdWUkKCk6IE9ic2VydmFibGU8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRUeXBlLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmZpZWxkVHlwZS52YWx1ZSkpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZSA9IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZTtcbiAgcHVibGljIHJlYWRvbmx5IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUgPSBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlO1xuICBwdWJsaWMgcmVhZG9ubHkgVGFza0xpc3RTZWFyY2hEcm9wZG93bkRhdGFQcm92aWRlciA9IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXI7XG5cbiAgcHVibGljIGdldCBrZXlWYWx1ZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KCdrZXknKT8udmFsdWU7XG5cbiAgICByZXR1cm4gIWNvbnRyb2xWYWx1ZSA/IG51bGwgOiBjb250cm9sVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlVmFsdWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5mb3JtLmdldCgnZGF0YVR5cGUnKT8udmFsdWU7XG4gICAgdGhpcy5fZGF0YVR5cGVWYWx1ZSQubmV4dChjb250cm9sVmFsdWU/LmlkKTtcblxuICAgIHJldHVybiAhY29udHJvbFZhbHVlID8gbnVsbCA6IGNvbnRyb2xWYWx1ZS5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRUeXBlVmFsdWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5mb3JtLmdldCgnZmllbGRUeXBlJyk/LnZhbHVlO1xuXG4gICAgcmV0dXJuICFjb250cm9sVmFsdWUgPyBudWxsIDogY29udHJvbFZhbHVlLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBkcm9wZG93bkRhdGFQcm92aWRlclZhbHVlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duRGF0YVByb3ZpZGVyJyk/LnZhbHVlO1xuICAgIHRoaXMuX2Ryb3Bkb3duUHJvdmlkZXJWYWx1ZSQubmV4dChjb250cm9sVmFsdWU/LmlkKTtcblxuICAgIHJldHVybiAhY29udHJvbFZhbHVlID8gbnVsbCA6IGNvbnRyb2xWYWx1ZS5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZHJvcGRvd25WYWx1ZXNBcnJheSgpOiBGb3JtQXJyYXkgfCBudWxsIHtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93blZhbHVlcycpO1xuXG4gICAgcmV0dXJuICFmb3JtQXJyYXkgPyBudWxsIDogKGZvcm1BcnJheSBhcyBGb3JtQXJyYXkpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IERST1BET1dOX0ZJRUxEUzogQ29sdW1uQ29uZmlnW10gPSBbXG4gICAge1xuICAgICAga2V5OiAna2V5JyxcbiAgICAgIGxhYmVsOiAnc2VhcmNoRmllbGRzT3ZlcnZpZXcua2V5JyxcbiAgICAgIHZpZXdUeXBlOiBWaWV3VHlwZS5URVhULFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgbGFiZWw6ICdzZWFyY2hGaWVsZHNPdmVydmlldy50ZXh0JyxcbiAgICAgIHZpZXdUeXBlOiBWaWV3VHlwZS5URVhULFxuICAgIH0sXG4gIF07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGF0YVR5cGVWYWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZSB8IG51bGwgfCB1bmRlZmluZWRcbiAgPihudWxsKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kcm9wZG93blByb3ZpZGVyVmFsdWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyIHwgbnVsbCB8IHVuZGVmaW5lZFxuICA+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgZHJvcGRvd25SZWFkb25seUl0ZW1zJCA9IHRoaXMuX2Ryb3Bkb3duUHJvdmlkZXJWYWx1ZSQucGlwZShcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIGZpbHRlcih2YWwgPT4gISF2YWwgJiYgdmFsID09PSBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyLkpTT04pLFxuICAgIHN3aXRjaE1hcCgocHJvdmlkZXI6IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIgfCBudWxsIHwgdW5kZWZpbmVkKSA9PlxuICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0RHJvcGRvd25EYXRhKFxuICAgICAgICBwcm92aWRlciA/PyAnJyxcbiAgICAgICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lID8/ICcnLFxuICAgICAgICB0aGlzLmtleVZhbHVlID8/ICcnXG4gICAgICApXG4gICAgKSxcbiAgICBtYXAoZHJvcGRvd25EYXRhID0+XG4gICAgICBkcm9wZG93bkRhdGEgPyBPYmplY3QuZW50cmllcyhkcm9wZG93bkRhdGEpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe2tleSwgdmFsdWV9KSkgOiBbXVxuICAgIClcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZGF0YVR5cGVJdGVtcyQ6IE9ic2VydmFibGU8TGlzdEl0ZW1bXT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmRhdGFUeXBlVmFsdWUkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2RhdGFUeXBlVmFsdWVdKSA9PlxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkcy50ZXh0JyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5URVhULFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkcy5ib29sZWFuJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5CT09MRUFOLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkcy5kYXRlJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5EQVRFLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkcy5kYXRldGltZScpLFxuICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaEZpZWxkRGF0YVR5cGUuREFURVRJTUUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzLm51bWJlcicpLFxuICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaEZpZWxkRGF0YVR5cGUuTlVNQkVSLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkcy50aW1lJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5USU1FLFxuICAgICAgICB9LFxuICAgICAgXS5tYXAoaXRlbSA9PiAoey4uLml0ZW0sIHNlbGVjdGVkOiBpdGVtLmlkID09PSBkYXRhVHlwZVZhbHVlPy5pZH0pKVxuICAgIClcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZmllbGRUeXBlSXRlbXMkOiBPYnNlcnZhYmxlPExpc3RJdGVtW10+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fZGF0YVR5cGVWYWx1ZSQucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKSxcbiAgICB0aGlzLmZpZWxkVHlwZVZhbHVlJCxcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtkYXRhVHlwZVZhbHVlLCBmaWVsZFR5cGVWYWx1ZV0pID0+XG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzT3ZlcnZpZXcuc2luZ2xlJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuU0lOR0xFLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnJhbmdlJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuUkFOR0UsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLihkYXRhVHlwZVZhbHVlID09PSBUYXNrTGlzdFNlYXJjaEZpZWxkRGF0YVR5cGUuVEVYVFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgICAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuc2luZ2xlLXNlbGVjdC1kcm9wZG93bidcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLlNJTkdMRV9TRUxFQ1RfRFJPUERPV04sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICdzZWFyY2hGaWVsZHNPdmVydmlldy5tdWx0aS1zZWxlY3QtZHJvcGRvd24nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5NVUxUSV9TRUxFQ1RfRFJPUERPV04sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSksXG4gICAgICBdLm1hcChpdGVtID0+ICh7Li4uaXRlbSwgc2VsZWN0ZWQ6IGl0ZW0uaWQgPT09IGZpZWxkVHlwZVZhbHVlPy5pZH0pKVxuICAgIClcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZGF0YVByb3ZpZGVySXRlbXMkOiBPYnNlcnZhYmxlPExpc3RJdGVtW10+ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgLnN0cmVhbSgna2V5JylcbiAgICAucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsdWUkKSxcbiAgICAgIG1hcChkYXRhUHJvdmlkZXJWYWx1ZSA9PlxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgICAgICdzZWFyY2hGaWVsZHNPdmVydmlldy5kcm9wZG93bkRhdGFiYXNlRGF0YVByb3ZpZGVyJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyLkRBVEFCQVNFLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgICAgICdzZWFyY2hGaWVsZHNPdmVydmlldy5kcm9wZG93bkpzb25GaWxlRGF0YVByb3ZpZGVyJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyLkpTT04sXG4gICAgICAgICAgfSxcbiAgICAgICAgXS5tYXAoaXRlbSA9PiAoey4uLml0ZW0sIHNlbGVjdGVkOiBpdGVtLmlkID09PSBkYXRhUHJvdmlkZXJWYWx1ZT8uaWR9KSlcbiAgICAgIClcbiAgICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBtYXRjaFR5cGVJdGVtcyQ6IE9ic2VydmFibGU8TGlzdEl0ZW1bXT4gPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VcbiAgICAuc3RyZWFtKCdrZXknKVxuICAgIC5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMubWF0Y2hUeXBlVmFsdWUkKSxcbiAgICAgIG1hcChtYXRjaFR5cGVWYWx1ZSA9PlxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkc092ZXJ2aWV3Lmxpa2UnKSxcbiAgICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaEZpZWxkTWF0Y2hUeXBlLkxJS0UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzT3ZlcnZpZXcuZXhhY3QnKSxcbiAgICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaEZpZWxkTWF0Y2hUeXBlLkVYQUNULFxuICAgICAgICAgIH0sXG4gICAgICAgIF0ubWFwKGl0ZW0gPT4gKHsuLi5pdGVtLCBzZWxlY3RlZDogaXRlbS5pZCA9PT0gbWF0Y2hUeXBlVmFsdWU/LmlkfSkpXG4gICAgICApXG4gICAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50U2VydmljZTogRG9jdW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvblNlcnZpY2U6IEljb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZVxuICApIHtcbiAgICB0aGlzLmljb25TZXJ2aWNlLnJlZ2lzdGVyQWxsKFtUcmFzaENhbjE2LCBJbmZvcm1hdGlvbkZpbGxlZDE2XSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLnNldFZhbGlkYXRvcnMoW3RoaXMuZHJvcGRvd25EYXRhUHJvdmlkZXJWYWxpZGF0b3IsIHRoaXMuZHJvcGRvd25WYWx1ZXNWYWxpZGF0b3JdKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGREcm9wZG93blZhbHVlKHByZWZpbGxWYWx1ZT86IHtrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZ30pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25WYWx1ZXNBcnJheSkgcmV0dXJuO1xuXG4gICAgdGhpcy5kcm9wZG93blZhbHVlc0FycmF5LnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAga2V5OiB0aGlzLmZiLmNvbnRyb2wocHJlZmlsbFZhbHVlPy5rZXkgPz8gJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgICB2YWx1ZTogdGhpcy5mYi5jb250cm9sKHByZWZpbGxWYWx1ZT8udmFsdWUgPz8gJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZURyb3Bkb3duVmFsdWUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcm9wZG93blZhbHVlc0FycmF5KSByZXR1cm47XG5cbiAgICB0aGlzLmRyb3Bkb3duVmFsdWVzQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgcHVibGljIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VFdmVudC5lbWl0KG51bGwpO1xuICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gIH1cblxuICBwdWJsaWMgb25TYXZlKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwVmFsdWUgPSB0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICB0aGlzLmNsb3NlRXZlbnQuZW1pdCh7XG4gICAgICAuLi4oZ3JvdXBWYWx1ZS50aXRsZSAmJiB7dGl0bGU6IGdyb3VwVmFsdWUudGl0bGV9KSxcbiAgICAgIC4uLihncm91cFZhbHVlLmtleSAmJiB7a2V5OiBncm91cFZhbHVlLmtleX0pLFxuICAgICAgLi4uKGdyb3VwVmFsdWUucGF0aCAmJiB7cGF0aDogZ3JvdXBWYWx1ZS5wYXRofSksXG4gICAgICAuLi4oZ3JvdXBWYWx1ZS5kYXRhVHlwZT8uY29udGVudCAmJiB7ZGF0YVR5cGU6IGdyb3VwVmFsdWUuZGF0YVR5cGUuaWR9KSxcbiAgICAgIC4uLihncm91cFZhbHVlLm1hdGNoVHlwZT8uY29udGVudCAmJiB7bWF0Y2hUeXBlOiBncm91cFZhbHVlLm1hdGNoVHlwZS5pZH0pLFxuICAgICAgLi4uKGdyb3VwVmFsdWUuZmllbGRUeXBlPy5jb250ZW50ICYmIHtmaWVsZFR5cGU6IGdyb3VwVmFsdWUuZmllbGRUeXBlLmlkfSksXG4gICAgICAuLi4oZ3JvdXBWYWx1ZS5kcm9wZG93bkRhdGFQcm92aWRlcj8uY29udGVudCAmJiB7XG4gICAgICAgIGRyb3Bkb3duRGF0YVByb3ZpZGVyOiBncm91cFZhbHVlLmRyb3Bkb3duRGF0YVByb3ZpZGVyLmlkLFxuICAgICAgfSksXG4gICAgICAuLi4oZ3JvdXBWYWx1ZS5kcm9wZG93blZhbHVlcyAmJiB7XG4gICAgICAgIGRyb3Bkb3duVmFsdWVzOiBncm91cFZhbHVlLmRyb3Bkb3duVmFsdWVzLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBjdXJyKSA9PiAoey4uLmFjYywgLi4uKCEhY3Vycj8ua2V5ICYmIHtbY3Vyci5rZXldOiBjdXJyLnZhbHVlfSl9KSxcbiAgICAgICAgICB7fVxuICAgICAgICApLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcmVmaWxsZWRGb3JtKHByZWZpbGxEYXRhOiBUYXNrTGlzdFNlYXJjaEZpZWxkIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghcHJlZmlsbERhdGEpIHJldHVybjtcblxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIC4uLnByZWZpbGxEYXRhLFxuICAgICAgZGF0YVR5cGU6ICFwcmVmaWxsRGF0YS5kYXRhVHlwZVxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB7XG4gICAgICAgICAgICBjb250ZW50OiBwcmVmaWxsRGF0YS5kYXRhVHlwZSxcbiAgICAgICAgICAgIGlkOiBwcmVmaWxsRGF0YS5kYXRhVHlwZSxcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICBtYXRjaFR5cGU6ICFwcmVmaWxsRGF0YS5tYXRjaFR5cGVcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDoge1xuICAgICAgICAgICAgY29udGVudDogcHJlZmlsbERhdGEubWF0Y2hUeXBlLFxuICAgICAgICAgICAgaWQ6IHByZWZpbGxEYXRhLm1hdGNoVHlwZSxcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICBmaWVsZFR5cGU6ICFwcmVmaWxsRGF0YS5maWVsZFR5cGVcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDoge1xuICAgICAgICAgICAgY29udGVudDogcHJlZmlsbERhdGEuZmllbGRUeXBlLFxuICAgICAgICAgICAgaWQ6IHByZWZpbGxEYXRhLmZpZWxkVHlwZSxcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICBkcm9wZG93bkRhdGFQcm92aWRlcjogIXByZWZpbGxEYXRhLmRyb3Bkb3duRGF0YVByb3ZpZGVyXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHByZWZpbGxEYXRhLmRyb3Bkb3duRGF0YVByb3ZpZGVyLFxuICAgICAgICAgICAgaWQ6IHByZWZpbGxEYXRhLmRyb3Bkb3duRGF0YVByb3ZpZGVyLFxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgIGRyb3Bkb3duVmFsdWVzOiBbXSxcbiAgICB9KTtcblxuICAgIGlmIChwcmVmaWxsRGF0YS5kcm9wZG93bkRhdGFQcm92aWRlciAmJiBwcmVmaWxsRGF0YS5kcm9wZG93blZhbHVlcylcbiAgICAgIHRoaXMuc2V0UHJlZmlsbGVkRHJvcGRvd25WYWx1ZXMocHJlZmlsbERhdGEuZHJvcGRvd25WYWx1ZXMpO1xuICAgIHRoaXMuZm9ybS5nZXQoJ2tleScpPy5kaXNhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHNldFByZWZpbGxlZERyb3Bkb3duVmFsdWVzKGRyb3Bkb3duVmFsdWU6IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25WYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcm9wZG93blZhbHVlc0FycmF5IHx8ICF0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsdWUpIHJldHVybjtcblxuICAgIE9iamVjdC5lbnRyaWVzKGRyb3Bkb3duVmFsdWUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgdGhpcy5hZGREcm9wZG93blZhbHVlKHtrZXksIHZhbHVlfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoVHlwZVZhbGlkYXRvcihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBudWxsIHwge1trZXk6IHN0cmluZ106IHN0cmluZ30ge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZTogTGlzdEl0ZW0gfCB1bmRlZmluZWQgPSBjb250cm9sLnZhbHVlO1xuICAgIGNvbnN0IGRhdGFUeXBlQ29udHJvbFZhbHVlOiBMaXN0SXRlbSB8IG51bGwgfCB1bmRlZmluZWQgPVxuICAgICAgY29udHJvbC5wYXJlbnQ/LmdldCgnZGF0YVR5cGUnKT8udmFsdWU7XG5cbiAgICBpZiAoXG4gICAgICBkYXRhVHlwZUNvbnRyb2xWYWx1ZT8uaWQgPT09IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5URVhUICYmXG4gICAgICAoIWNvbnRyb2xWYWx1ZSB8fCAhY29udHJvbFZhbHVlLnNlbGVjdGVkKVxuICAgIClcbiAgICAgIHJldHVybiB7ZXJyb3I6ICdNYXRjaCB0eXBlIG5vdCBzZWxlY3RlZCd9O1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsaWRhdG9yKGdyb3VwOiB0eXBlb2YgdGhpcy5mb3JtKTogVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgY29uc3QgY29udHJvbFZhbHVlOiBMaXN0SXRlbSB8IHVuZGVmaW5lZCA9IGdyb3VwLmdldCgnZHJvcGRvd25EYXRhUHJvdmlkZXInKT8udmFsdWU7XG4gICAgY29uc3QgZmllbGRUeXBlQ29udHJvbFZhbHVlOiBMaXN0SXRlbSB8IG51bGwgfCB1bmRlZmluZWQgPSBncm91cC5nZXQoJ2ZpZWxkVHlwZScpPy52YWx1ZTtcblxuICAgIGlmIChcbiAgICAgIFtcbiAgICAgICAgVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUX0RST1BET1dOLFxuICAgICAgICBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLk1VTFRJX1NFTEVDVF9EUk9QRE9XTixcbiAgICAgIF0uaW5jbHVkZXMoZmllbGRUeXBlQ29udHJvbFZhbHVlPy5pZCkgJiZcbiAgICAgICFjb250cm9sVmFsdWVcbiAgICApXG4gICAgICByZXR1cm4ge2Vycm9yOiAnRHJvcGRvd24gc291cmNlIHByb3ZpZGVyIGlzIG5vdCBzcGVjaWZpZWQnfTtcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBkcm9wZG93blZhbHVlc1ZhbGlkYXRvcihncm91cDogdHlwZW9mIHRoaXMuZm9ybSk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZToge2tleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nfVtdIHwgdW5kZWZpbmVkID1cbiAgICAgIGdyb3VwLmdldCgnZHJvcGRvd25WYWx1ZXMnKT8udmFsdWU7XG4gICAgY29uc3QgZmllbGRUeXBlQ29udHJvbFZhbHVlID0gZ3JvdXAuZ2V0KCdmaWVsZFR5cGUnKT8udmFsdWU/LmlkO1xuICAgIGNvbnN0IGRyb3Bkb3duUHJvdmlkZXJWYWx1ZSA9IGdyb3VwLmdldCgnZHJvcGRvd25EYXRhUHJvdmlkZXInKT8udmFsdWU/LmlkO1xuXG4gICAgaWYgKFxuICAgICAgW1xuICAgICAgICBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLlNJTkdMRV9TRUxFQ1RfRFJPUERPV04sXG4gICAgICAgIFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuTVVMVElfU0VMRUNUX0RST1BET1dOLFxuICAgICAgXS5pbmNsdWRlcyhmaWVsZFR5cGVDb250cm9sVmFsdWUpICYmXG4gICAgICAoIWNvbnRyb2xWYWx1ZSB8fCBjb250cm9sVmFsdWU/Lmxlbmd0aCA9PT0gMCkgJiZcbiAgICAgIGRyb3Bkb3duUHJvdmlkZXJWYWx1ZSA9PT0gVGFza0xpc3RTZWFyY2hEcm9wZG93bkRhdGFQcm92aWRlci5EQVRBQkFTRVxuICAgIClcbiAgICAgIHJldHVybiB7ZXJyb3I6ICdEcm9wZG93biBzb3VyY2UgcHJvdmlkZXIgaXMgbm90IHNwZWNpZmllZCBvciBpcyBlbXB0eSd9O1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHdoaWxlICghIXRoaXMuZHJvcGRvd25WYWx1ZXNBcnJheT8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25WYWx1ZXNBcnJheS5yZW1vdmVBdCgwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xuICAgICAgdGhpcy5mb3JtLmVuYWJsZSgpO1xuICAgIH0sIENBUkJPTl9DT05TVEFOVFMubW9kYWxBbmltYXRpb25Ncyk7XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cbjxjZHMtbW9kYWwgW29wZW5dPVwib3BlblwiIHNob3dGb290ZXI9XCJ0cnVlXCI+XG4gIDxjZHMtbW9kYWwtaGVhZGVyIFtzaG93Q2xvc2VCdXR0b25dPVwidHJ1ZVwiIChjbG9zZVNlbGVjdCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgPGgzIGNkc01vZGFsSGVhZGVySGVhZGluZz5cbiAgICAgIHt7ICghcHJlZmlsbERhdGEgPyAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuYWRkJyA6ICdzZWFyY2hGaWVsZHNPdmVydmlldy5lZGl0JykgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2gzPlxuICA8L2Nkcy1tb2RhbC1oZWFkZXI+XG5cbiAgPHNlY3Rpb24gY2RzTW9kYWxDb250ZW50PlxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwidmFsdGltby10YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbF9fY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2lucHV0XCI+XG4gICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy50aXRsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFt0b29sdGlwXT1cIidzZWFyY2hGaWVsZHNPdmVydmlld1Rvb2x0aXBzLnRpdGxlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgIDxpbnB1dCBjZHNUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcua2V5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMua2V5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgIDxpbnB1dCBjZHNUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwia2V5XCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidmFsdGltby10YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbF9faW5wdXRcIj5cbiAgICAgICAgPHYtaW5wdXQtbGFiZWxcbiAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnBhdGgnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5wYXRoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgIDxpbnB1dCBjZHNUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwicGF0aFwiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2lucHV0XCI+XG4gICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5kYXRhVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFt0b29sdGlwXT1cIidzZWFyY2hGaWVsZHNPdmVydmlld1Rvb2x0aXBzLmRhdGFUeXBlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgIDxjZHMtZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwiZGF0YVR5cGVcIj5cbiAgICAgICAgICA8Y2RzLWRyb3Bkb3duLWxpc3QgW2l0ZW1zXT1cImRhdGFUeXBlSXRlbXMkIHwgYXN5bmNcIj48L2Nkcy1kcm9wZG93bi1saXN0PlxuICAgICAgICA8L2Nkcy1kcm9wZG93bj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKGRhdGFUeXBlVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5URVhUKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3Lm1hdGNoVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMubWF0Y2hUeXBlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvdi1pbnB1dC1sYWJlbD5cblxuICAgICAgICAgIDxjZHMtZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwibWF0Y2hUeXBlXCI+XG4gICAgICAgICAgICA8Y2RzLWRyb3Bkb3duLWxpc3QgW2l0ZW1zXT1cIm1hdGNoVHlwZUl0ZW1zJCB8IGFzeW5jXCI+PC9jZHMtZHJvcGRvd24tbGlzdD5cbiAgICAgICAgICA8L2Nkcy1kcm9wZG93bj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcuZmllbGRUeXBlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMuZmllbGRUeXBlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgIDxjZHMtZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwiZmllbGRUeXBlXCI+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJmaWVsZFR5cGVJdGVtcyQgfCBhc3luY1wiPjwvY2RzLWRyb3Bkb3duLWxpc3Q+XG4gICAgICAgIDwvY2RzLWRyb3Bkb3duPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAoXG4gICAgICAgIGRhdGFUeXBlVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5URVhUICYmXG4gICAgICAgIChmaWVsZFR5cGVWYWx1ZSA9PT0gVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUX0RST1BET1dOIHx8XG4gICAgICAgICAgZmllbGRUeXBlVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuTVVMVElfU0VMRUNUX0RST1BET1dOKVxuICAgICAgKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRyb3Bkb3duRGF0YVByb3ZpZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5kcm9wZG93bkRhdGFQcm92aWRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3YtaW5wdXQtbGFiZWw+XG5cbiAgICAgICAgICA8Y2RzLWRyb3Bkb3duIGZvcm1Db250cm9sTmFtZT1cImRyb3Bkb3duRGF0YVByb3ZpZGVyXCI+XG4gICAgICAgICAgICA8Y2RzLWRyb3Bkb3duLWxpc3QgW2l0ZW1zXT1cImRhdGFQcm92aWRlckl0ZW1zJCB8IGFzeW5jXCI+PC9jZHMtZHJvcGRvd24tbGlzdD5cbiAgICAgICAgICA8L2Nkcy1kcm9wZG93bj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmIChkcm9wZG93bkRhdGFQcm92aWRlclZhbHVlID09PSBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyLkRBVEFCQVNFKSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19saXN0XCJcbiAgICAgICAgICAgIGZvcm1BcnJheU5hbWU9XCJkcm9wZG93blZhbHVlc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHYtaW5wdXQtbGFiZWxcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5kcm9wZG93bkxpc3RWYWx1ZXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMuZHJvcGRvd25MaXN0VmFsdWVzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtub01hcmdpbl09XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvdi1pbnB1dC1sYWJlbD5cblxuICAgICAgICAgICAgQGZvciAoZHJvcGRvd25WYWx1ZSBvZiBkcm9wZG93blZhbHVlc0FycmF5Py5jb250cm9sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJkcm9wZG93blZhbHVlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2Ryb3Bkb3duLXZhbHVlc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Y2RzLXRleHQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICB7eyAnaW50ZXJmYWNlLmtleScgfCB0cmFuc2xhdGUgfX1cblxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNkc1RleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJrZXlcIiAvPlxuICAgICAgICAgICAgICAgIDwvY2RzLXRleHQtbGFiZWw+XG5cbiAgICAgICAgICAgICAgICA8Y2RzLXRleHQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICB7eyAnaW50ZXJmYWNlLnZhbHVlJyB8IHRyYW5zbGF0ZSB9fVxuXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgY2RzVGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Nkcy10ZXh0LWxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2RzQnV0dG9uPVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIkY291bnQgPT09IDFcIlxuICAgICAgICAgICAgICAgICAgW2ljb25Pbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZURyb3Bkb3duVmFsdWUoJGluZGV4KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNkcy0tYnRuX19pY29uXCIgY2RzSWNvbj1cInRyYXNoLWNhblwiIHNpemU9XCIxNlwiPjwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDxidXR0b24gY2RzQnV0dG9uPVwicHJpbWFyeVwiIChjbGljayk9XCJhZGREcm9wZG93blZhbHVlKClcIj5cbiAgICAgICAgICAgICAge3sgJ2ludGVyZmFjZS5hZGRSb3cnIHwgdHJhbnNsYXRlIH19XG5cbiAgICAgICAgICAgICAgPHN2ZyBjZHNJY29uPVwiYWRkXCIgc2l6ZT1cIjE2XCIgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiPjwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2UgaWYgKGRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIuSlNPTikge1xuICAgICAgICAgIDx2YWx0aW1vLWNhcmJvbi1saXN0XG4gICAgICAgICAgICBbaGVhZGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtoaWRlVG9vbGJhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtmaWVsZHNdPVwiRFJPUERPV05fRklFTERTXCJcbiAgICAgICAgICAgIFtpdGVtc109XCJkcm9wZG93blJlYWRvbmx5SXRlbXMkIHwgYXN5bmNcIlxuICAgICAgICAgID48L3ZhbHRpbW8tY2FyYm9uLWxpc3Q+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Zvcm0+XG4gIDwvc2VjdGlvbj5cblxuICA8Y2RzLW1vZGFsLWZvb3Rlcj5cbiAgICA8YnV0dG9uIGNkc0J1dHRvbj1cImdob3N0XCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5cbiAgICAgIHt7ICdpbnRlcmZhY2UuY2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvbiBjZHNCdXR0b249XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiIChjbGljayk9XCJvblNhdmUoKVwiPlxuICAgICAge3sgJ2ludGVyZmFjZS5zYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Nkcy1tb2RhbC1mb290ZXI+XG48L2Nkcy1tb2RhbD5cbiJdfQ==
|
|
359
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrLW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vdGFzay1tYW5hZ2VtZW50L3NyYy9saWIvY29tcG9uZW50cy90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbC90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUwsbUJBQW1CLEVBRW5CLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFDLGVBQWUsRUFBbUIsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUVoQixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixRQUFRLEdBQ1QsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQ0wsa0NBQWtDLEVBR2xDLDJCQUEyQixFQUMzQiw0QkFB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QWdCLENBQUMsQ0FBQztJQUN4QyxDQUFDOytHQXJaVSx3Q0FBd0M7bUdBQXhDLHdDQUF3QyxzUEM3RnJELGc4UEFpTkEsbXBDRGpJSSxZQUFZLG1GQUNaLGVBQWUsMkZBQ2YsWUFBWSxnTUFDWixjQUFjLGdzQkFDZCxXQUFXLDJhQUNYLFdBQVcsK3NCQUNYLG1CQUFtQixtakNBQ25CLFVBQVUsNE5BQ1YsZ0JBQWdCLGtvQkFDaEIsZ0JBQWdCLHVQQUNoQiwwQkFBMEI7OzRGQUdqQix3Q0FBd0M7a0JBcEJwRCxTQUFTOytCQUNFLDZDQUE2QyxtQkFHdEMsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixlQUFlO3dCQUNmLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxXQUFXO3dCQUNYLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixVQUFVO3dCQUNWLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQiwwQkFBMEI7cUJBQzNCO29NQUd3QixJQUFJO3NCQUE1QixLQUFLO3VCQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQztnQkFDRSxzQkFBc0I7c0JBQTlDLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDO2dCQUdILFdBQVc7c0JBQTlCLEtBQUs7Z0JBT0ksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUFycmF5LFxuICBGb3JtQnVpbGRlcixcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtJbmZvcm1hdGlvbkZpbGxlZDE2LCBUcmFzaENhbjE2fSBmcm9tICdAY2FyYm9uL2ljb25zJztcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7XG4gIENBUkJPTl9DT05TVEFOVFMsXG4gIENhcmJvbkxpc3RNb2R1bGUsXG4gIENvbHVtbkNvbmZpZyxcbiAgSW5wdXRMYWJlbE1vZHVsZSxcbiAgVmFsdWVQYXRoU2VsZWN0b3JDb21wb25lbnQsXG4gIFZhbHVlUGF0aFNlbGVjdG9yUHJlZml4LFxuICBWaWV3VHlwZSxcbn0gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge0RvY3VtZW50U2VydmljZX0gZnJvbSAnQHZhbHRpbW8vZG9jdW1lbnQnO1xuaW1wb3J0IHtcbiAgVGFza0xpc3RTZWFyY2hEcm9wZG93bkRhdGFQcm92aWRlcixcbiAgVGFza0xpc3RTZWFyY2hEcm9wZG93blZhbHVlLFxuICBUYXNrTGlzdFNlYXJjaEZpZWxkLFxuICBUYXNrTGlzdFNlYXJjaEZpZWxkRGF0YVR5cGUsXG4gIFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUsXG4gIFRhc2tMaXN0U2VhcmNoRmllbGRNYXRjaFR5cGUsXG59IGZyb20gJ0B2YWx0aW1vL3Rhc2snO1xuaW1wb3J0IHtcbiAgQnV0dG9uTW9kdWxlLFxuICBEcm9wZG93bk1vZHVsZSxcbiAgSWNvbk1vZHVsZSxcbiAgSWNvblNlcnZpY2UsXG4gIElucHV0TW9kdWxlLFxuICBMaXN0SXRlbSxcbiAgTW9kYWxNb2R1bGUsXG59IGZyb20gJ2NhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXInO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWwuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIERyb3Bkb3duTW9kdWxlLFxuICAgIElucHV0TW9kdWxlLFxuICAgIE1vZGFsTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgSWNvbk1vZHVsZSxcbiAgICBDYXJib25MaXN0TW9kdWxlLFxuICAgIElucHV0TGFiZWxNb2R1bGUsXG4gICAgVmFsdWVQYXRoU2VsZWN0b3JDb21wb25lbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFRhc2tNYW5hZ2VtZW50U2VhcmNoRmllbGRzTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoe3JlcXVpcmVkOiB0cnVlfSkgb3BlbjogYm9vbGVhbjtcbiAgQElucHV0KHtyZXF1aXJlZDogdHJ1ZX0pIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIF9wcmVmaWxsRGF0YTogVGFza0xpc3RTZWFyY2hGaWVsZCB8IG51bGw7XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgcHJlZmlsbERhdGEodmFsdWU6IFRhc2tMaXN0U2VhcmNoRmllbGQgfCBudWxsKSB7XG4gICAgdGhpcy5fcHJlZmlsbERhdGEgPSB2YWx1ZTtcbiAgICB0aGlzLnNldFByZWZpbGxlZEZvcm0odmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgcHJlZmlsbERhdGEoKTogVGFza0xpc3RTZWFyY2hGaWVsZCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wcmVmaWxsRGF0YTtcbiAgfVxuICBAT3V0cHV0KCkgY2xvc2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8UGFydGlhbDxUYXNrTGlzdFNlYXJjaEZpZWxkPiB8IG51bGw+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICBrZXk6IHRoaXMuZmIuY29udHJvbDxzdHJpbmc+KCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICB0aXRsZTogdGhpcy5mYi5jb250cm9sPHN0cmluZz4oJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIHBhdGg6IHRoaXMuZmIuY29udHJvbDxzdHJpbmc+KCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICBkYXRhVHlwZTogdGhpcy5mYi5jb250cm9sPExpc3RJdGVtIHwgbnVsbD4obnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgbWF0Y2hUeXBlOiB0aGlzLmZiLmNvbnRyb2w8TGlzdEl0ZW0gfCBudWxsPihudWxsLCB0aGlzLm1hdGNoVHlwZVZhbGlkYXRvciksXG4gICAgZmllbGRUeXBlOiB0aGlzLmZiLmNvbnRyb2w8TGlzdEl0ZW0gfCBudWxsPihudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICBkcm9wZG93bkRhdGFQcm92aWRlcjogdGhpcy5mYi5jb250cm9sPExpc3RJdGVtIHwgbnVsbD4obnVsbCksXG4gICAgZHJvcGRvd25WYWx1ZXM6IHRoaXMuZmIuYXJyYXk8e2tleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nfT4oW10pLFxuICB9KTtcblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6IEFic3RyYWN0Q29udHJvbDxMaXN0SXRlbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnZGF0YVR5cGUnKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlVmFsdWUkKCk6IE9ic2VydmFibGU8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVR5cGUudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuZGF0YVR5cGUudmFsdWUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF0Y2hUeXBlKCk6IEFic3RyYWN0Q29udHJvbDxMaXN0SXRlbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnbWF0Y2hUeXBlJyk7XG4gIH1cbiAgcHVibGljIGdldCBtYXRjaFR5cGVWYWx1ZSQoKTogT2JzZXJ2YWJsZTxMaXN0SXRlbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaFR5cGUudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMubWF0Y2hUeXBlLnZhbHVlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRyb3Bkb3duRGF0YVByb3ZpZGVyKCk6IEFic3RyYWN0Q29udHJvbDxMaXN0SXRlbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnZHJvcGRvd25EYXRhUHJvdmlkZXInKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsdWUkKCk6IE9ic2VydmFibGU8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZHJvcGRvd25EYXRhUHJvdmlkZXIudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuZHJvcGRvd25EYXRhUHJvdmlkZXIudmFsdWUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRUeXBlKCk6IEFic3RyYWN0Q29udHJvbDxMaXN0SXRlbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnZmllbGRUeXBlJyk7XG4gIH1cbiAgcHVibGljIGdldCBmaWVsZFR5cGVWYWx1ZSQoKTogT2JzZXJ2YWJsZTxMaXN0SXRlbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5maWVsZFR5cGUudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuZmllbGRUeXBlLnZhbHVlKSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlID0gVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlO1xuICBwdWJsaWMgcmVhZG9ubHkgVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZSA9IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGU7XG4gIHB1YmxpYyByZWFkb25seSBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyID0gVGFza0xpc3RTZWFyY2hEcm9wZG93bkRhdGFQcm92aWRlcjtcblxuICBwdWJsaWMgZ2V0IGtleVZhbHVlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuZm9ybS5nZXQoJ2tleScpPy52YWx1ZTtcblxuICAgIHJldHVybiAhY29udHJvbFZhbHVlID8gbnVsbCA6IGNvbnRyb2xWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGVWYWx1ZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KCdkYXRhVHlwZScpPy52YWx1ZTtcbiAgICB0aGlzLl9kYXRhVHlwZVZhbHVlJC5uZXh0KGNvbnRyb2xWYWx1ZT8uaWQpO1xuXG4gICAgcmV0dXJuICFjb250cm9sVmFsdWUgPyBudWxsIDogY29udHJvbFZhbHVlLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZFR5cGVWYWx1ZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KCdmaWVsZFR5cGUnKT8udmFsdWU7XG5cbiAgICByZXR1cm4gIWNvbnRyb2xWYWx1ZSA/IG51bGwgOiBjb250cm9sVmFsdWUuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsdWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5mb3JtLmdldCgnZHJvcGRvd25EYXRhUHJvdmlkZXInKT8udmFsdWU7XG4gICAgdGhpcy5fZHJvcGRvd25Qcm92aWRlclZhbHVlJC5uZXh0KGNvbnRyb2xWYWx1ZT8uaWQpO1xuXG4gICAgcmV0dXJuICFjb250cm9sVmFsdWUgPyBudWxsIDogY29udHJvbFZhbHVlLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBkcm9wZG93blZhbHVlc0FycmF5KCk6IEZvcm1BcnJheSB8IG51bGwge1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duVmFsdWVzJyk7XG5cbiAgICByZXR1cm4gIWZvcm1BcnJheSA/IG51bGwgOiAoZm9ybUFycmF5IGFzIEZvcm1BcnJheSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgRFJPUERPV05fRklFTERTOiBDb2x1bW5Db25maWdbXSA9IFtcbiAgICB7XG4gICAgICBrZXk6ICdrZXknLFxuICAgICAgbGFiZWw6ICdzZWFyY2hGaWVsZHNPdmVydmlldy5rZXknLFxuICAgICAgdmlld1R5cGU6IFZpZXdUeXBlLlRFWFQsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICd2YWx1ZScsXG4gICAgICBsYWJlbDogJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnRleHQnLFxuICAgICAgdmlld1R5cGU6IFZpZXdUeXBlLlRFWFQsXG4gICAgfSxcbiAgXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kYXRhVHlwZVZhbHVlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZFxuICA+KG51bGwpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Ryb3Bkb3duUHJvdmlkZXJWYWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIgfCBudWxsIHwgdW5kZWZpbmVkXG4gID4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBkcm9wZG93blJlYWRvbmx5SXRlbXMkID0gdGhpcy5fZHJvcGRvd25Qcm92aWRlclZhbHVlJC5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgZmlsdGVyKHZhbCA9PiAhIXZhbCAmJiB2YWwgPT09IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIuSlNPTiksXG4gICAgc3dpdGNoTWFwKChwcm92aWRlcjogVGFza0xpc3RTZWFyY2hEcm9wZG93bkRhdGFQcm92aWRlciB8IG51bGwgfCB1bmRlZmluZWQpID0+XG4gICAgICB0aGlzLmRvY3VtZW50U2VydmljZS5nZXREcm9wZG93bkRhdGEoXG4gICAgICAgIHByb3ZpZGVyID8/ICcnLFxuICAgICAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPz8gJycsXG4gICAgICAgIHRoaXMua2V5VmFsdWUgPz8gJydcbiAgICAgIClcbiAgICApLFxuICAgIG1hcChkcm9wZG93bkRhdGEgPT5cbiAgICAgIGRyb3Bkb3duRGF0YSA/IE9iamVjdC5lbnRyaWVzKGRyb3Bkb3duRGF0YSkubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7a2V5LCB2YWx1ZX0pKSA6IFtdXG4gICAgKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBkYXRhVHlwZUl0ZW1zJDogT2JzZXJ2YWJsZTxMaXN0SXRlbVtdPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuZGF0YVR5cGVWYWx1ZSQsXG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JyksXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbZGF0YVR5cGVWYWx1ZV0pID0+XG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzLnRleHQnKSxcbiAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlLlRFWFQsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzLmJvb2xlYW4nKSxcbiAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlLkJPT0xFQU4sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzLmRhdGUnKSxcbiAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlLkRBVEUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzLmRhdGV0aW1lJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5EQVRFVElNRSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdzZWFyY2hGaWVsZHMubnVtYmVyJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5OVU1CRVIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzLnRpbWUnKSxcbiAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZERhdGFUeXBlLlRJTUUsXG4gICAgICAgIH0sXG4gICAgICBdLm1hcChpdGVtID0+ICh7Li4uaXRlbSwgc2VsZWN0ZWQ6IGl0ZW0uaWQgPT09IGRhdGFUeXBlVmFsdWU/LmlkfSkpXG4gICAgKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBmaWVsZFR5cGVJdGVtcyQ6IE9ic2VydmFibGU8TGlzdEl0ZW1bXT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLl9kYXRhVHlwZVZhbHVlJC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLFxuICAgIHRoaXMuZmllbGRUeXBlVmFsdWUkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2RhdGFUeXBlVmFsdWUsIGZpZWxkVHlwZVZhbHVlXSkgPT5cbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdzZWFyY2hGaWVsZHNPdmVydmlldy5zaW5nbGUnKSxcbiAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5TSU5HTEUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzT3ZlcnZpZXcucmFuZ2UnKSxcbiAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5SQU5HRSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKGRhdGFUeXBlVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5URVhUXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICdzZWFyY2hGaWVsZHNPdmVydmlldy5zaW5nbGUtc2VsZWN0LWRyb3Bkb3duJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuU0lOR0xFX1NFTEVDVF9EUk9QRE9XTixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgICAgICAgICAgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3Lm11bHRpLXNlbGVjdC1kcm9wZG93bidcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLk1VTFRJX1NFTEVDVF9EUk9QRE9XTixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgIF0ubWFwKGl0ZW0gPT4gKHsuLi5pdGVtLCBzZWxlY3RlZDogaXRlbS5pZCA9PT0gZmllbGRUeXBlVmFsdWU/LmlkfSkpXG4gICAgKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBkYXRhUHJvdmlkZXJJdGVtcyQ6IE9ic2VydmFibGU8TGlzdEl0ZW1bXT4gPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VcbiAgICAuc3RyZWFtKCdrZXknKVxuICAgIC5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZHJvcGRvd25EYXRhUHJvdmlkZXJWYWx1ZSQpLFxuICAgICAgbWFwKGRhdGFQcm92aWRlclZhbHVlID0+XG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRyb3Bkb3duRGF0YWJhc2VEYXRhUHJvdmlkZXInXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIuREFUQUJBU0UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRyb3Bkb3duSnNvbkZpbGVEYXRhUHJvdmlkZXInXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIuSlNPTixcbiAgICAgICAgICB9LFxuICAgICAgICBdLm1hcChpdGVtID0+ICh7Li4uaXRlbSwgc2VsZWN0ZWQ6IGl0ZW0uaWQgPT09IGRhdGFQcm92aWRlclZhbHVlPy5pZH0pKVxuICAgICAgKVxuICAgICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IG1hdGNoVHlwZUl0ZW1zJDogT2JzZXJ2YWJsZTxMaXN0SXRlbVtdPiA9IHRoaXMudHJhbnNsYXRlU2VydmljZVxuICAgIC5zdHJlYW0oJ2tleScpXG4gICAgLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5tYXRjaFR5cGVWYWx1ZSQpLFxuICAgICAgbWFwKG1hdGNoVHlwZVZhbHVlID0+XG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzT3ZlcnZpZXcubGlrZScpLFxuICAgICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGRNYXRjaFR5cGUuTElLRSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdzZWFyY2hGaWVsZHNPdmVydmlldy5leGFjdCcpLFxuICAgICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGRNYXRjaFR5cGUuRVhBQ1QsXG4gICAgICAgICAgfSxcbiAgICAgICAgXS5tYXAoaXRlbSA9PiAoey4uLml0ZW0sIHNlbGVjdGVkOiBpdGVtLmlkID09PSBtYXRjaFR5cGVWYWx1ZT8uaWR9KSlcbiAgICAgIClcbiAgICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBkb2N1bWVudERlZmluaXRpb25OYW1lJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShcbiAgICBtYXAocGFyYW1zID0+IHBhcmFtcy5uYW1lIHx8ICcnKSxcbiAgICBmaWx0ZXIoZG9jRGVmTmFtZSA9PiAhIWRvY0RlZk5hbWUpXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IFZhbHVlUGF0aFNlbGVjdG9yUHJlZml4ID0gVmFsdWVQYXRoU2VsZWN0b3JQcmVmaXg7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGljb25TZXJ2aWNlOiBJY29uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZTogQWN0aXZhdGVkUm91dGVcbiAgKSB7XG4gICAgdGhpcy5pY29uU2VydmljZS5yZWdpc3RlckFsbChbVHJhc2hDYW4xNiwgSW5mb3JtYXRpb25GaWxsZWQxNl0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybS5zZXRWYWxpZGF0b3JzKFt0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsaWRhdG9yLCB0aGlzLmRyb3Bkb3duVmFsdWVzVmFsaWRhdG9yXSk7XG4gIH1cblxuICBwdWJsaWMgYWRkRHJvcGRvd25WYWx1ZShwcmVmaWxsVmFsdWU/OiB7a2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmd9KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyb3Bkb3duVmFsdWVzQXJyYXkpIHJldHVybjtcblxuICAgIHRoaXMuZHJvcGRvd25WYWx1ZXNBcnJheS5wdXNoKFxuICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGtleTogdGhpcy5mYi5jb250cm9sKHByZWZpbGxWYWx1ZT8ua2V5ID8/ICcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgICAgdmFsdWU6IHRoaXMuZmIuY29udHJvbChwcmVmaWxsVmFsdWU/LnZhbHVlID8/ICcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVEcm9wZG93blZhbHVlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25WYWx1ZXNBcnJheSkgcmV0dXJuO1xuXG4gICAgdGhpcy5kcm9wZG93blZhbHVlc0FycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlRXZlbnQuZW1pdChudWxsKTtcbiAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICB9XG5cbiAgcHVibGljIG9uU2F2ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cFZhbHVlID0gdGhpcy5mb3JtLmdldFJhd1ZhbHVlKCk7XG4gICAgdGhpcy5jbG9zZUV2ZW50LmVtaXQoe1xuICAgICAgLi4uKGdyb3VwVmFsdWUudGl0bGUgJiYge3RpdGxlOiBncm91cFZhbHVlLnRpdGxlfSksXG4gICAgICAuLi4oZ3JvdXBWYWx1ZS5rZXkgJiYge2tleTogZ3JvdXBWYWx1ZS5rZXl9KSxcbiAgICAgIC4uLihncm91cFZhbHVlLnBhdGggJiYge3BhdGg6IGdyb3VwVmFsdWUucGF0aH0pLFxuICAgICAgLi4uKGdyb3VwVmFsdWUuZGF0YVR5cGU/LmNvbnRlbnQgJiYge2RhdGFUeXBlOiBncm91cFZhbHVlLmRhdGFUeXBlLmlkfSksXG4gICAgICAuLi4oZ3JvdXBWYWx1ZS5tYXRjaFR5cGU/LmNvbnRlbnQgJiYge21hdGNoVHlwZTogZ3JvdXBWYWx1ZS5tYXRjaFR5cGUuaWR9KSxcbiAgICAgIC4uLihncm91cFZhbHVlLmZpZWxkVHlwZT8uY29udGVudCAmJiB7ZmllbGRUeXBlOiBncm91cFZhbHVlLmZpZWxkVHlwZS5pZH0pLFxuICAgICAgLi4uKGdyb3VwVmFsdWUuZHJvcGRvd25EYXRhUHJvdmlkZXI/LmNvbnRlbnQgJiYge1xuICAgICAgICBkcm9wZG93bkRhdGFQcm92aWRlcjogZ3JvdXBWYWx1ZS5kcm9wZG93bkRhdGFQcm92aWRlci5pZCxcbiAgICAgIH0pLFxuICAgICAgLi4uKGdyb3VwVmFsdWUuZHJvcGRvd25WYWx1ZXMgJiYge1xuICAgICAgICBkcm9wZG93blZhbHVlczogZ3JvdXBWYWx1ZS5kcm9wZG93blZhbHVlcy5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgY3VycikgPT4gKHsuLi5hY2MsIC4uLighIWN1cnI/LmtleSAmJiB7W2N1cnIua2V5XTogY3Vyci52YWx1ZX0pfSksXG4gICAgICAgICAge31cbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UHJlZmlsbGVkRm9ybShwcmVmaWxsRGF0YTogVGFza0xpc3RTZWFyY2hGaWVsZCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXByZWZpbGxEYXRhKSByZXR1cm47XG5cbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAuLi5wcmVmaWxsRGF0YSxcbiAgICAgIGRhdGFUeXBlOiAhcHJlZmlsbERhdGEuZGF0YVR5cGVcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDoge1xuICAgICAgICAgICAgY29udGVudDogcHJlZmlsbERhdGEuZGF0YVR5cGUsXG4gICAgICAgICAgICBpZDogcHJlZmlsbERhdGEuZGF0YVR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgbWF0Y2hUeXBlOiAhcHJlZmlsbERhdGEubWF0Y2hUeXBlXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHByZWZpbGxEYXRhLm1hdGNoVHlwZSxcbiAgICAgICAgICAgIGlkOiBwcmVmaWxsRGF0YS5tYXRjaFR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgZmllbGRUeXBlOiAhcHJlZmlsbERhdGEuZmllbGRUeXBlXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHByZWZpbGxEYXRhLmZpZWxkVHlwZSxcbiAgICAgICAgICAgIGlkOiBwcmVmaWxsRGF0YS5maWVsZFR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgZHJvcGRvd25EYXRhUHJvdmlkZXI6ICFwcmVmaWxsRGF0YS5kcm9wZG93bkRhdGFQcm92aWRlclxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB7XG4gICAgICAgICAgICBjb250ZW50OiBwcmVmaWxsRGF0YS5kcm9wZG93bkRhdGFQcm92aWRlcixcbiAgICAgICAgICAgIGlkOiBwcmVmaWxsRGF0YS5kcm9wZG93bkRhdGFQcm92aWRlcixcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICBkcm9wZG93blZhbHVlczogW10sXG4gICAgfSk7XG5cbiAgICBpZiAocHJlZmlsbERhdGEuZHJvcGRvd25EYXRhUHJvdmlkZXIgJiYgcHJlZmlsbERhdGEuZHJvcGRvd25WYWx1ZXMpXG4gICAgICB0aGlzLnNldFByZWZpbGxlZERyb3Bkb3duVmFsdWVzKHByZWZpbGxEYXRhLmRyb3Bkb3duVmFsdWVzKTtcbiAgICB0aGlzLmZvcm0uZ2V0KCdrZXknKT8uZGlzYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcmVmaWxsZWREcm9wZG93blZhbHVlcyhkcm9wZG93blZhbHVlOiBUYXNrTGlzdFNlYXJjaERyb3Bkb3duVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25WYWx1ZXNBcnJheSB8fCAhdGhpcy5kcm9wZG93bkRhdGFQcm92aWRlclZhbHVlKSByZXR1cm47XG5cbiAgICBPYmplY3QuZW50cmllcyhkcm9wZG93blZhbHVlKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHRoaXMuYWRkRHJvcGRvd25WYWx1ZSh7a2V5LCB2YWx1ZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaFR5cGVWYWxpZGF0b3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogbnVsbCB8IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9IHtcbiAgICBjb25zdCBjb250cm9sVmFsdWU6IExpc3RJdGVtIHwgdW5kZWZpbmVkID0gY29udHJvbC52YWx1ZTtcbiAgICBjb25zdCBkYXRhVHlwZUNvbnRyb2xWYWx1ZTogTGlzdEl0ZW0gfCBudWxsIHwgdW5kZWZpbmVkID1cbiAgICAgIGNvbnRyb2wucGFyZW50Py5nZXQoJ2RhdGFUeXBlJyk/LnZhbHVlO1xuXG4gICAgaWYgKFxuICAgICAgZGF0YVR5cGVDb250cm9sVmFsdWU/LmlkID09PSBUYXNrTGlzdFNlYXJjaEZpZWxkRGF0YVR5cGUuVEVYVCAmJlxuICAgICAgKCFjb250cm9sVmFsdWUgfHwgIWNvbnRyb2xWYWx1ZS5zZWxlY3RlZClcbiAgICApXG4gICAgICByZXR1cm4ge2Vycm9yOiAnTWF0Y2ggdHlwZSBub3Qgc2VsZWN0ZWQnfTtcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBkcm9wZG93bkRhdGFQcm92aWRlclZhbGlkYXRvcihncm91cDogdHlwZW9mIHRoaXMuZm9ybSk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZTogTGlzdEl0ZW0gfCB1bmRlZmluZWQgPSBncm91cC5nZXQoJ2Ryb3Bkb3duRGF0YVByb3ZpZGVyJyk/LnZhbHVlO1xuICAgIGNvbnN0IGZpZWxkVHlwZUNvbnRyb2xWYWx1ZTogTGlzdEl0ZW0gfCBudWxsIHwgdW5kZWZpbmVkID0gZ3JvdXAuZ2V0KCdmaWVsZFR5cGUnKT8udmFsdWU7XG5cbiAgICBpZiAoXG4gICAgICBbXG4gICAgICAgIFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuU0lOR0xFX1NFTEVDVF9EUk9QRE9XTixcbiAgICAgICAgVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5NVUxUSV9TRUxFQ1RfRFJPUERPV04sXG4gICAgICBdLmluY2x1ZGVzKGZpZWxkVHlwZUNvbnRyb2xWYWx1ZT8uaWQpICYmXG4gICAgICAhY29udHJvbFZhbHVlXG4gICAgKVxuICAgICAgcmV0dXJuIHtlcnJvcjogJ0Ryb3Bkb3duIHNvdXJjZSBwcm92aWRlciBpcyBub3Qgc3BlY2lmaWVkJ307XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZHJvcGRvd25WYWx1ZXNWYWxpZGF0b3IoZ3JvdXA6IHR5cGVvZiB0aGlzLmZvcm0pOiBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICBjb25zdCBjb250cm9sVmFsdWU6IHtrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZ31bXSB8IHVuZGVmaW5lZCA9XG4gICAgICBncm91cC5nZXQoJ2Ryb3Bkb3duVmFsdWVzJyk/LnZhbHVlO1xuICAgIGNvbnN0IGZpZWxkVHlwZUNvbnRyb2xWYWx1ZSA9IGdyb3VwLmdldCgnZmllbGRUeXBlJyk/LnZhbHVlPy5pZDtcbiAgICBjb25zdCBkcm9wZG93blByb3ZpZGVyVmFsdWUgPSBncm91cC5nZXQoJ2Ryb3Bkb3duRGF0YVByb3ZpZGVyJyk/LnZhbHVlPy5pZDtcblxuICAgIGlmIChcbiAgICAgIFtcbiAgICAgICAgVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUX0RST1BET1dOLFxuICAgICAgICBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLk1VTFRJX1NFTEVDVF9EUk9QRE9XTixcbiAgICAgIF0uaW5jbHVkZXMoZmllbGRUeXBlQ29udHJvbFZhbHVlKSAmJlxuICAgICAgKCFjb250cm9sVmFsdWUgfHwgY29udHJvbFZhbHVlPy5sZW5ndGggPT09IDApICYmXG4gICAgICBkcm9wZG93blByb3ZpZGVyVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIuREFUQUJBU0VcbiAgICApXG4gICAgICByZXR1cm4ge2Vycm9yOiAnRHJvcGRvd24gc291cmNlIHByb3ZpZGVyIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgZW1wdHknfTtcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZvcm0oKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB3aGlsZSAoISF0aGlzLmRyb3Bkb3duVmFsdWVzQXJyYXk/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duVmFsdWVzQXJyYXkucmVtb3ZlQXQoMCk7XG4gICAgICB9XG4gICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcbiAgICAgIHRoaXMuZm9ybS5lbmFibGUoKTtcbiAgICB9LCBDQVJCT05fQ09OU1RBTlRTLm1vZGFsQW5pbWF0aW9uTXMpO1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG48Y2RzLW1vZGFsIFtvcGVuXT1cIm9wZW5cIiBzaG93Rm9vdGVyPVwidHJ1ZVwiPlxuICA8Y2RzLW1vZGFsLWhlYWRlciBbc2hvd0Nsb3NlQnV0dG9uXT1cInRydWVcIiAoY2xvc2VTZWxlY3QpPVwib25DYW5jZWwoKVwiPlxuICAgIDxoMyBjZHNNb2RhbEhlYWRlckhlYWRpbmc+XG4gICAgICB7eyAoIXByZWZpbGxEYXRhID8gJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmFkZCcgOiAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuZWRpdCcpIHwgdHJhbnNsYXRlIH19XG4gICAgPC9oMz5cbiAgPC9jZHMtbW9kYWwtaGVhZGVyPlxuXG4gIDxzZWN0aW9uIGNkc01vZGFsQ29udGVudD5cbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2NvbnRlbnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcudGl0bGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy50aXRsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgIDwvdi1pbnB1dC1sYWJlbD5cblxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cInRhc2stbWFuYWdlbWVudC1zZWFyY2gtdGl0bGVcIlxuICAgICAgICAgIGNkc1RleHRcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcua2V5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMua2V5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgIDxpbnB1dCBkYXRhLXRlc3RpZD1cInRhc2stbWFuYWdlbWVudC1zZWFyY2gta2V5XCIgY2RzVGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImtleVwiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2lucHV0XCI+XG4gICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5wYXRoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMucGF0aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgIDwvdi1pbnB1dC1sYWJlbD5cblxuICAgICAgICA8dmFsdGltby12YWx1ZS1wYXRoLXNlbGVjdG9yXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGF0aFwiXG4gICAgICAgICAgW2RvY3VtZW50RGVmaW5pdGlvbk5hbWVdPVwiZG9jdW1lbnREZWZpbml0aW9uTmFtZSQgfCBhc3luY1wiXG4gICAgICAgICAgW3ByZWZpeGVzXT1cIltWYWx1ZVBhdGhTZWxlY3RvclByZWZpeC5ET0MsIFZhbHVlUGF0aFNlbGVjdG9yUHJlZml4LkNBU0VdXCJcbiAgICAgICAgPjwvdmFsdGltby12YWx1ZS1wYXRoLXNlbGVjdG9yPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcuZGF0YVR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5kYXRhVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgIDwvdi1pbnB1dC1sYWJlbD5cblxuICAgICAgICA8Y2RzLWRyb3Bkb3duIGRhdGEtdGVzdGlkPVwidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1kYXRhVHlwZVwiIGZvcm1Db250cm9sTmFtZT1cImRhdGFUeXBlXCI+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJkYXRhVHlwZUl0ZW1zJCB8IGFzeW5jXCI+PC9jZHMtZHJvcGRvd24tbGlzdD5cbiAgICAgICAgPC9jZHMtZHJvcGRvd24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgQGlmIChkYXRhVHlwZVZhbHVlID09PSBUYXNrTGlzdFNlYXJjaEZpZWxkRGF0YVR5cGUuVEVYVCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdGltby10YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbF9faW5wdXRcIj5cbiAgICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5tYXRjaFR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidzZWFyY2hGaWVsZHNPdmVydmlld1Rvb2x0aXBzLm1hdGNoVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3YtaW5wdXQtbGFiZWw+XG5cbiAgICAgICAgICA8Y2RzLWRyb3Bkb3duIGRhdGEtdGVzdGlkPVwidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1tYXRjaFR5cGVcIiBmb3JtQ29udHJvbE5hbWU9XCJtYXRjaFR5cGVcIj5cbiAgICAgICAgICAgIDxjZHMtZHJvcGRvd24tbGlzdCBbaXRlbXNdPVwibWF0Y2hUeXBlSXRlbXMkIHwgYXN5bmNcIj48L2Nkcy1kcm9wZG93bi1saXN0PlxuICAgICAgICAgIDwvY2RzLWRyb3Bkb3duPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPGRpdiBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2lucHV0XCI+XG4gICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5maWVsZFR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5maWVsZFR5cGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPlxuICAgICAgICA8L3YtaW5wdXQtbGFiZWw+XG5cbiAgICAgICAgPGNkcy1kcm9wZG93biBkYXRhLXRlc3RpZD1cInRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRUeXBlXCIgZm9ybUNvbnRyb2xOYW1lPVwiZmllbGRUeXBlXCI+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJmaWVsZFR5cGVJdGVtcyQgfCBhc3luY1wiPjwvY2RzLWRyb3Bkb3duLWxpc3Q+XG4gICAgICAgIDwvY2RzLWRyb3Bkb3duPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAoXG4gICAgICAgIGRhdGFUeXBlVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5URVhUICYmXG4gICAgICAgIChmaWVsZFR5cGVWYWx1ZSA9PT0gVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUX0RST1BET1dOIHx8XG4gICAgICAgICAgZmllbGRUeXBlVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuTVVMVElfU0VMRUNUX0RST1BET1dOKVxuICAgICAgKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRyb3Bkb3duRGF0YVByb3ZpZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5kcm9wZG93bkRhdGFQcm92aWRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3YtaW5wdXQtbGFiZWw+XG5cbiAgICAgICAgICA8Y2RzLWRyb3Bkb3duXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cInRhc2stbWFuYWdlbWVudC1zZWFyY2gtZHJvcGRvd25EYXRhUHJvdmlkZXJcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZHJvcGRvd25EYXRhUHJvdmlkZXJcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxjZHMtZHJvcGRvd24tbGlzdCBbaXRlbXNdPVwiZGF0YVByb3ZpZGVySXRlbXMkIHwgYXN5bmNcIj48L2Nkcy1kcm9wZG93bi1saXN0PlxuICAgICAgICAgIDwvY2RzLWRyb3Bkb3duPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKGRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIuREFUQUJBU0UpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2xpc3RcIlxuICAgICAgICAgICAgZm9ybUFycmF5TmFtZT1cImRyb3Bkb3duVmFsdWVzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRyb3Bkb3duTGlzdFZhbHVlcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5kcm9wZG93bkxpc3RWYWx1ZXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW25vTWFyZ2luXT1cInRydWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgICAgICBAZm9yIChkcm9wZG93blZhbHVlIG9mIGRyb3Bkb3duVmFsdWVzQXJyYXk/LmNvbnRyb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGZvcm1cbiAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImRyb3Bkb3duVmFsdWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidmFsdGltby10YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbF9fZHJvcGRvd24tdmFsdWVzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxjZHMtdGV4dC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIHt7ICdpbnRlcmZhY2UudmFsdWUnIHwgdHJhbnNsYXRlIH19XG5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cInRhc2stbWFuYWdlbWVudC1zZWFyY2gtZHJvcGRvd25LZXlcIlxuICAgICAgICAgICAgICAgICAgICBjZHNUZXh0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9jZHMtdGV4dC1sYWJlbD5cblxuICAgICAgICAgICAgICAgIDxjZHMtdGV4dC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIHt7ICdpbnRlcmZhY2UuZGlzcGxheScgfCB0cmFuc2xhdGUgfX1cblxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1kcm9wZG93blZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgY2RzVGV4dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9jZHMtdGV4dC1sYWJlbD5cblxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNkc0J1dHRvbj1cImRhbmdlclwiXG4gICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cInRhc2stbWFuYWdlbWVudC1zZWFyY2gtZGVsZXRlRW51bVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiJGNvdW50ID09PSAxXCJcbiAgICAgICAgICAgICAgICAgIFtpY29uT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVEcm9wZG93blZhbHVlKCRpbmRleClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiIGNkc0ljb249XCJ0cmFzaC1jYW5cIiBzaXplPVwiMTZcIj48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1hZGREcm9wZG93blZhbHVlXCJcbiAgICAgICAgICAgICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhZGREcm9wZG93blZhbHVlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnaW50ZXJmYWNlLmFkZFJvdycgfCB0cmFuc2xhdGUgfX1cblxuICAgICAgICAgICAgICA8c3ZnIGNkc0ljb249XCJhZGRcIiBzaXplPVwiMTZcIiBjbGFzcz1cImNkcy0tYnRuX19pY29uXCI+PC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSBpZiAoZHJvcGRvd25EYXRhUHJvdmlkZXJWYWx1ZSA9PT0gVGFza0xpc3RTZWFyY2hEcm9wZG93bkRhdGFQcm92aWRlci5KU09OKSB7XG4gICAgICAgICAgPHZhbHRpbW8tY2FyYm9uLWxpc3RcbiAgICAgICAgICAgIFtoZWFkZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVUb29sYmFyXT1cInRydWVcIlxuICAgICAgICAgICAgW2ZpZWxkc109XCJEUk9QRE9XTl9GSUVMRFNcIlxuICAgICAgICAgICAgW2l0ZW1zXT1cImRyb3Bkb3duUmVhZG9ubHlJdGVtcyQgfCBhc3luY1wiXG4gICAgICAgICAgPjwvdmFsdGltby1jYXJib24tbGlzdD5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZm9ybT5cbiAgPC9zZWN0aW9uPlxuXG4gIDxjZHMtbW9kYWwtZm9vdGVyPlxuICAgIDxidXR0b24gZGF0YS10ZXN0aWQ9XCJ0YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWNhbmNlbFwiIGNkc0J1dHRvbj1cImdob3N0XCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5cbiAgICAgIHt7ICdpbnRlcmZhY2UuY2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvblxuICAgICAgZGF0YS10ZXN0aWQ9XCJ0YXNrLW1hbmFnZW1lbnQtc2VhcmNoLXNhdmVcIlxuICAgICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCJcbiAgICAgIChjbGljayk9XCJvblNhdmUoKVwiXG4gICAgPlxuICAgICAge3sgJ2ludGVyZmFjZS5zYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Nkcy1tb2RhbC1mb290ZXI+XG48L2Nkcy1tb2RhbD5cbiJdfQ==
|