@alfresco/adf-content-services
Version:
Alfresco ADF content services
124 lines • 45.3 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, Inject, ViewEncapsulation } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
import { MemberModel } from '../../models/member.model';
import { CommonModule } from '@angular/common';
import { MatButtonModule } from '@angular/material/button';
import { TranslateModule } from '@ngx-translate/core';
import { DataColumnComponent, DataColumnListComponent, DataTableComponent, DateColumnHeaderComponent } from '@alfresco/adf-core';
import { MatIconModule } from '@angular/material/icon';
import { AddPermissionPanelComponent } from './add-permission-panel.component';
import { UserIconColumnComponent } from '../user-icon-column/user-icon-column.component';
import { UserNameColumnComponent } from '../user-name-column/user-name-column.component';
import { UserRoleColumnComponent } from '../user-role-column/user-role-column.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/dialog";
import * as i2 from "@angular/common";
import * as i3 from "@angular/material/button";
import * as i4 from "@ngx-translate/core";
import * as i5 from "@angular/material/icon";
export class AddPermissionDialogComponent {
constructor(data, dialogRef) {
this.data = data;
this.dialogRef = dialogRef;
this.isSearchActive = true;
this.selectedMembers = [];
this.existingMembers = [];
this.currentSelection = [];
this.existingMembers = this.data.node.permissions.locallySet || [];
}
onSelect(items) {
this.currentSelection = items;
}
onAddClicked() {
const selection = this.selectedMembers.filter((member) => !member.readonly).map((member) => member.toPermissionElement());
this.data.confirm.next(selection);
this.data.confirm.complete();
}
onSearchAddClicked() {
const newMembers = this.currentSelection
.map((item) => MemberModel.parseFromSearchResult(item))
.filter(({ id }) => !this.selectedMembers.find((member) => member.id === id));
this.selectedMembers = this.selectedMembers.concat(newMembers);
this.selectedMembers.forEach((member) => {
const existingMember = this.existingMembers.find(({ authorityId }) => authorityId === member.id);
if (existingMember) {
member.role = existingMember.name;
member.accessStatus = existingMember.accessStatus;
member.readonly = true; // make role non editable
}
});
this.disableSearch();
}
canCloseDialog() {
if (this.selectedMembers.length) {
this.disableSearch();
}
else {
this.dialogRef.close();
}
}
enableSearch() {
this.isSearchActive = true;
}
disableSearch() {
this.isSearchActive = false;
}
onBulkUpdate(role) {
this.selectedMembers.filter((member) => !member.readonly).forEach((member) => (member.role = role));
}
onMemberDelete({ id }) {
const index = this.selectedMembers.findIndex((member) => member.id === id);
this.selectedMembers.splice(index, 1);
if (this.selectedMembers.length === 0) {
this.enableSearch();
this.currentSelection = [];
}
}
onMemberUpdate(role, member) {
const memberInstance = this.selectedMembers.find(({ id }) => id === member.id);
memberInstance.role = role;
}
isValid() {
return this.selectedMembers.filter(({ readonly }) => !readonly).length && this.selectedMembers.every(({ role }) => !!role);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: AddPermissionDialogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialogRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: AddPermissionDialogComponent, isStandalone: true, selector: "adf-add-permission-dialog", ngImport: i0, template: "<h2 mat-dialog-title class='adf-add-permission-dialog-title' id=\"add-permission-dialog-title\">\n {{ (data?.title ? data?.title : \"PERMISSION_MANAGER.ADD-PERMISSION.BASE-DIALOG-TITLE\") | translate }}\n</h2>\n\n<ng-container *ngIf=\"!isSearchActive\">\n <mat-dialog-content class=\"adf-add-permission-dialog-content\">\n <button mat-button (click)=\"enableSearch()\" class=\"adf-search-user-button\">\n {{ \"PERMISSION_MANAGER.ADD-PERMISSION.SEARCH\" | translate }}\n <span class=\"adf-toolbar--spacer\"></span>\n <mat-icon iconPositionEnd>search</mat-icon>\n </button>\n\n <div class=\"adf-new-permission-table\">\n <adf-datatable [rows]=\"selectedMembers\"\n class=\"adf-datatable-permission\"\n selectionMode=\"none\"\n [stickyHeader]=\"true\"\n data-automation-id=\"adf-user-role-selection-table\"\n *ngIf=\"selectedMembers.length\">\n <data-columns>\n <data-column class=\"adf-datatable-cell--image adf-authority-icon-column\" key=\"$thumbunail\" [sortable]=\"false\">\n <ng-template let-context>\n <adf-user-icon-column [context]=\"context\" />\n </ng-template>\n </data-column>\n\n <data-column class=\"adf-ellipsis-cell adf-expand-cell-5 adf-authorityId-column\"\n [title]=\"'PERMISSION_MANAGER.COLUMN.NAME' | translate:{count:selectedMembers.length}\"\n key=\"id\">\n <ng-template let-context>\n <adf-user-name-column [context]=\"context\" />\n </ng-template>\n </data-column>\n\n <data-column class=\"adf-ellipsis-cell adf-expand-cell-4\"\n title=\"PERMISSION_MANAGER.PERMISSION_DISPLAY.ROLE\"\n key=\"role\">\n <ng-template let-entry=\"$implicit\">\n <adf-user-role-column [readonly]=\"entry.row.obj.readonly\"\n [value]=\"entry.data.getValue(entry.row, entry.col)\"\n [roles]=\"data.roles\"\n id=\"adf-select-role-permission\"\n (roleChanged)=\"onMemberUpdate($event, entry.row.obj)\" />\n </ng-template>\n\n <adf-data-column-header>\n <ng-template>\n <adf-user-role-column class=\"adf-permission-role-column-header\"\n placeholder=\"PERMISSION_MANAGER.COLUMN.BULK-ROLE\"\n [roles]=\"data.roles\"\n id=\"adf-bulk-select-role-permission\"\n (roleChanged)=\"onBulkUpdate($event)\" />\n </ng-template>\n </adf-data-column-header>\n </data-column>\n\n <data-column class=\"adf-datatable-cell adf-delete-permission-column\" key=\"\" [sortable]=\"false\">\n <ng-template let-entry=\"$implicit\">\n <button mat-icon-button\n class=\"adf-add-member-action\"\n [style.display]=\"entry.row.obj.readonly ? 'none': 'block'\"\n (click)=\"onMemberDelete(entry.row.obj)\"\n data-automation-id=\"adf-delete-permission-button\">\n <mat-icon>highlight_off</mat-icon>\n </button>\n </ng-template>\n </data-column>\n </data-columns>\n </adf-datatable>\n </div>\n\n </mat-dialog-content>\n\n <mat-dialog-actions class=\"adf-add-permission-dialog-actions\">\n <button mat-button\n mat-dialog-close\n data-automation-id=\"add-permission-dialog-close-button\">\n {{ \"PERMISSION_MANAGER.ADD-PERMISSION.CLOSE-ACTION\" | translate }}\n </button>\n <button mat-button\n data-automation-id=\"add-permission-dialog-confirm-button\"\n [mat-dialog-close]=\"true\"\n class=\"adf-choose-action\"\n [disabled]=\"!isValid()\"\n (click)=\"onAddClicked()\">\n {{ \"PERMISSION_MANAGER.ADD-PERMISSION.ADD-ACTION\" | translate }}\n </button>\n </mat-dialog-actions>\n</ng-container>\n\n<ng-container *ngIf=\"isSearchActive\">\n <mat-dialog-content class=\"adf-add-permission-dialog-content\">\n <adf-add-permission-panel class=\"adf-search-container\" (select)=\"onSelect($event)\" />\n </mat-dialog-content>\n\n <mat-dialog-actions class=\"adf-add-permission-dialog-actions\">\n <button mat-button\n (click)=\"canCloseDialog()\"\n data-automation-id=\"add-permission-dialog-close-button\">\n {{ \"PERMISSION_MANAGER.ADD-PERMISSION.CLOSE-ACTION\" | translate }}\n </button>\n <button mat-button\n data-automation-id=\"add-permission-dialog-confirm-button\"\n [disabled]=\"!currentSelection.length\"\n (click)=\"onSearchAddClicked()\">\n {{ \"PERMISSION_MANAGER.ADD-PERMISSION.SELECT-ACTION\" | translate }}\n </button>\n </mat-dialog-actions>\n</ng-container>\n", styles: [".mdc-dialog .mat-mdc-dialog-surface:is(div){padding-bottom:0}.adf-add-permission-dialog .adf-add-permission-dialog-title{margin-bottom:28px;margin-left:20px;margin-right:20px;font-size:var(--theme-title-font-size);font-weight:600;font-style:normal;font-stretch:normal;line-height:1.6;letter-spacing:-.5px;color:var(--adf-theme-foreground-text-color-087)}.adf-add-permission-dialog .adf-add-permission-dialog-content{margin:0;overflow:hidden;flex-grow:1;height:80vh}.adf-add-permission-dialog .adf-add-permission-dialog-content .adf-search-user-button{width:100%;justify-content:unset}.adf-add-permission-dialog .adf-add-permission-dialog-content .adf-search-user-button .mdc-button__label{padding-right:0}.adf-add-permission-dialog .adf-add-permission-dialog-content .adf-search-user-button .mat-icon{font-size:24px;width:24px;height:24px;margin-left:0}.adf-add-permission-dialog .adf-add-permission-dialog-content .adf-add-member-action{padding:0 15px}.adf-add-permission-dialog .adf-add-permission-dialog-content .adf-new-permission-table{height:90%}.adf-add-permission-dialog .adf-add-permission-dialog-content .adf-search-container{height:100%}.adf-add-permission-dialog .adf-add-permission-dialog-actions{padding:0 24px;background-color:var(--theme-background-color);display:flex;justify-content:flex-end;color:var(--adf-theme-foreground-text-color)}.adf-add-permission-dialog .adf-add-permission-dialog-actions button{text-transform:uppercase;font-weight:400}.adf-add-permission-dialog .adf-add-permission-dialog-actions .adf-choose-action[disabled]{color:var(--adf-theme-foreground-secondary-text-color)}.adf-add-permission-dialog .adf-add-permission-dialog-actions .adf-choose-action:enabled{color:var(--theme-primary-color)}.adf-add-permission-dialog .adf-datatable-cell .adf-cell-value adf-user-role-column{position:unset}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "component", type: DataTableComponent, selector: "adf-datatable", inputs: ["data", "rows", "sorting", "columns", "selectionMode", "multiselect", "mainTableAction", "actions", "showMainDatatableActions", "showProvidedActions", "actionsPosition", "actionsVisibleOnHover", "fallbackThumbnail", "contextMenu", "rowStyle", "rowStyleClass", "showHeader", "stickyHeader", "loading", "noPermission", "rowMenuCacheEnabled", "resolverFn", "allowFiltering", "isResizingEnabled", "blurOnResize", "displayCheckboxesOnHover", "enableDragRows"], outputs: ["rowClick", "rowDblClick", "showRowContextMenu", "showRowActionsMenu", "executeRowAction", "columnOrderChanged", "columnsWidthChanged", "selectedItemsCountChanged", "dragDropped"] }, { kind: "component", type: DataColumnListComponent, selector: "data-columns" }, { kind: "component", type: DataColumnComponent, selector: "data-column", inputs: ["id", "key", "customData", "type", "format", "sortable", "draggable", "resizable", "isHidden", "title", "subtitle", "formatTooltip", "sr-title", "class", "copyContent", "editable", "focus", "sortingKey", "order", "currencyConfig", "decimalConfig", "dateConfig"] }, { kind: "component", type: DateColumnHeaderComponent, selector: "adf-data-column-header" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: AddPermissionPanelComponent, selector: "adf-add-permission-panel", outputs: ["select"] }, { kind: "component", type: UserIconColumnComponent, selector: "adf-user-icon-column", inputs: ["context", "node", "selected"] }, { kind: "component", type: UserNameColumnComponent, selector: "adf-user-name-column", inputs: ["context", "node"] }, { kind: "component", type: UserRoleColumnComponent, selector: "adf-user-role-column", inputs: ["roles", "value", "readonly", "placeholder"], outputs: ["roleChanged"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: AddPermissionDialogComponent, decorators: [{
type: Component,
args: [{ selector: 'adf-add-permission-dialog', standalone: true, imports: [
CommonModule,
MatDialogModule,
MatButtonModule,
TranslateModule,
DataTableComponent,
DataColumnListComponent,
DataColumnComponent,
DateColumnHeaderComponent,
MatIconModule,
AddPermissionPanelComponent,
UserIconColumnComponent,
UserNameColumnComponent,
UserRoleColumnComponent
], encapsulation: ViewEncapsulation.None, template: "<h2 mat-dialog-title class='adf-add-permission-dialog-title' id=\"add-permission-dialog-title\">\n {{ (data?.title ? data?.title : \"PERMISSION_MANAGER.ADD-PERMISSION.BASE-DIALOG-TITLE\") | translate }}\n</h2>\n\n<ng-container *ngIf=\"!isSearchActive\">\n <mat-dialog-content class=\"adf-add-permission-dialog-content\">\n <button mat-button (click)=\"enableSearch()\" class=\"adf-search-user-button\">\n {{ \"PERMISSION_MANAGER.ADD-PERMISSION.SEARCH\" | translate }}\n <span class=\"adf-toolbar--spacer\"></span>\n <mat-icon iconPositionEnd>search</mat-icon>\n </button>\n\n <div class=\"adf-new-permission-table\">\n <adf-datatable [rows]=\"selectedMembers\"\n class=\"adf-datatable-permission\"\n selectionMode=\"none\"\n [stickyHeader]=\"true\"\n data-automation-id=\"adf-user-role-selection-table\"\n *ngIf=\"selectedMembers.length\">\n <data-columns>\n <data-column class=\"adf-datatable-cell--image adf-authority-icon-column\" key=\"$thumbunail\" [sortable]=\"false\">\n <ng-template let-context>\n <adf-user-icon-column [context]=\"context\" />\n </ng-template>\n </data-column>\n\n <data-column class=\"adf-ellipsis-cell adf-expand-cell-5 adf-authorityId-column\"\n [title]=\"'PERMISSION_MANAGER.COLUMN.NAME' | translate:{count:selectedMembers.length}\"\n key=\"id\">\n <ng-template let-context>\n <adf-user-name-column [context]=\"context\" />\n </ng-template>\n </data-column>\n\n <data-column class=\"adf-ellipsis-cell adf-expand-cell-4\"\n title=\"PERMISSION_MANAGER.PERMISSION_DISPLAY.ROLE\"\n key=\"role\">\n <ng-template let-entry=\"$implicit\">\n <adf-user-role-column [readonly]=\"entry.row.obj.readonly\"\n [value]=\"entry.data.getValue(entry.row, entry.col)\"\n [roles]=\"data.roles\"\n id=\"adf-select-role-permission\"\n (roleChanged)=\"onMemberUpdate($event, entry.row.obj)\" />\n </ng-template>\n\n <adf-data-column-header>\n <ng-template>\n <adf-user-role-column class=\"adf-permission-role-column-header\"\n placeholder=\"PERMISSION_MANAGER.COLUMN.BULK-ROLE\"\n [roles]=\"data.roles\"\n id=\"adf-bulk-select-role-permission\"\n (roleChanged)=\"onBulkUpdate($event)\" />\n </ng-template>\n </adf-data-column-header>\n </data-column>\n\n <data-column class=\"adf-datatable-cell adf-delete-permission-column\" key=\"\" [sortable]=\"false\">\n <ng-template let-entry=\"$implicit\">\n <button mat-icon-button\n class=\"adf-add-member-action\"\n [style.display]=\"entry.row.obj.readonly ? 'none': 'block'\"\n (click)=\"onMemberDelete(entry.row.obj)\"\n data-automation-id=\"adf-delete-permission-button\">\n <mat-icon>highlight_off</mat-icon>\n </button>\n </ng-template>\n </data-column>\n </data-columns>\n </adf-datatable>\n </div>\n\n </mat-dialog-content>\n\n <mat-dialog-actions class=\"adf-add-permission-dialog-actions\">\n <button mat-button\n mat-dialog-close\n data-automation-id=\"add-permission-dialog-close-button\">\n {{ \"PERMISSION_MANAGER.ADD-PERMISSION.CLOSE-ACTION\" | translate }}\n </button>\n <button mat-button\n data-automation-id=\"add-permission-dialog-confirm-button\"\n [mat-dialog-close]=\"true\"\n class=\"adf-choose-action\"\n [disabled]=\"!isValid()\"\n (click)=\"onAddClicked()\">\n {{ \"PERMISSION_MANAGER.ADD-PERMISSION.ADD-ACTION\" | translate }}\n </button>\n </mat-dialog-actions>\n</ng-container>\n\n<ng-container *ngIf=\"isSearchActive\">\n <mat-dialog-content class=\"adf-add-permission-dialog-content\">\n <adf-add-permission-panel class=\"adf-search-container\" (select)=\"onSelect($event)\" />\n </mat-dialog-content>\n\n <mat-dialog-actions class=\"adf-add-permission-dialog-actions\">\n <button mat-button\n (click)=\"canCloseDialog()\"\n data-automation-id=\"add-permission-dialog-close-button\">\n {{ \"PERMISSION_MANAGER.ADD-PERMISSION.CLOSE-ACTION\" | translate }}\n </button>\n <button mat-button\n data-automation-id=\"add-permission-dialog-confirm-button\"\n [disabled]=\"!currentSelection.length\"\n (click)=\"onSearchAddClicked()\">\n {{ \"PERMISSION_MANAGER.ADD-PERMISSION.SELECT-ACTION\" | translate }}\n </button>\n </mat-dialog-actions>\n</ng-container>\n", styles: [".mdc-dialog .mat-mdc-dialog-surface:is(div){padding-bottom:0}.adf-add-permission-dialog .adf-add-permission-dialog-title{margin-bottom:28px;margin-left:20px;margin-right:20px;font-size:var(--theme-title-font-size);font-weight:600;font-style:normal;font-stretch:normal;line-height:1.6;letter-spacing:-.5px;color:var(--adf-theme-foreground-text-color-087)}.adf-add-permission-dialog .adf-add-permission-dialog-content{margin:0;overflow:hidden;flex-grow:1;height:80vh}.adf-add-permission-dialog .adf-add-permission-dialog-content .adf-search-user-button{width:100%;justify-content:unset}.adf-add-permission-dialog .adf-add-permission-dialog-content .adf-search-user-button .mdc-button__label{padding-right:0}.adf-add-permission-dialog .adf-add-permission-dialog-content .adf-search-user-button .mat-icon{font-size:24px;width:24px;height:24px;margin-left:0}.adf-add-permission-dialog .adf-add-permission-dialog-content .adf-add-member-action{padding:0 15px}.adf-add-permission-dialog .adf-add-permission-dialog-content .adf-new-permission-table{height:90%}.adf-add-permission-dialog .adf-add-permission-dialog-content .adf-search-container{height:100%}.adf-add-permission-dialog .adf-add-permission-dialog-actions{padding:0 24px;background-color:var(--theme-background-color);display:flex;justify-content:flex-end;color:var(--adf-theme-foreground-text-color)}.adf-add-permission-dialog .adf-add-permission-dialog-actions button{text-transform:uppercase;font-weight:400}.adf-add-permission-dialog .adf-add-permission-dialog-actions .adf-choose-action[disabled]{color:var(--adf-theme-foreground-secondary-text-color)}.adf-add-permission-dialog .adf-add-permission-dialog-actions .adf-choose-action:enabled{color:var(--theme-primary-color)}.adf-add-permission-dialog .adf-datatable-cell .adf-cell-value adf-user-role-column{position:unset}\n"] }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [MAT_DIALOG_DATA]
}] }, { type: i1.MatDialogRef }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXBlcm1pc3Npb24tZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvcGVybWlzc2lvbi1tYW5hZ2VyL2NvbXBvbmVudHMvYWRkLXBlcm1pc3Npb24vYWRkLXBlcm1pc3Npb24tZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvcGVybWlzc2lvbi1tYW5hZ2VyL2NvbXBvbmVudHMvYWRkLXBlcm1pc3Npb24vYWRkLXBlcm1pc3Npb24tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRzFGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqSSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1B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QyxNQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0gsQ0FBQzs4R0ExRVEsNEJBQTRCLGtCQU9qQixlQUFlO2tHQVAxQiw0QkFBNEIscUZDdER6QyxnMExBNkdBLG0yRER6RVEsWUFBWSxrSUFDWixlQUFlLCtuQkFDZixlQUFlLHdVQUNmLGVBQWUsNEZBQ2Ysa0JBQWtCLDBzQkFDbEIsdUJBQXVCLHlEQUN2QixtQkFBbUIsd1VBQ25CLHlCQUF5QixrRUFDekIsYUFBYSxvTEFDYiwyQkFBMkIsMEZBQzNCLHVCQUF1QiwwR0FDdkIsdUJBQXVCLDhGQUN2Qix1QkFBdUI7OzJGQU1sQiw0QkFBNEI7a0JBdEJ4QyxTQUFTOytCQUNJLDJCQUEyQixjQUN6QixJQUFJLFdBQ1A7d0JBQ0wsWUFBWTt3QkFDWixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixrQkFBa0I7d0JBQ2xCLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3dCQUNuQix5QkFBeUI7d0JBQ3pCLGFBQWE7d0JBQ2IsMkJBQTJCO3dCQUMzQix1QkFBdUI7d0JBQ3ZCLHVCQUF1Qjt3QkFDdkIsdUJBQXVCO3FCQUMxQixpQkFHYyxpQkFBaUIsQ0FBQyxJQUFJOzswQkFTeEIsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IMKpIDIwMDUtMjAyNSBIeWxhbmQgU29mdHdhcmUsIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nTW9kdWxlLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTm9kZUVudHJ5LCBQZXJtaXNzaW9uRWxlbWVudCB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHsgQWRkUGVybWlzc2lvbkRpYWxvZ0RhdGEgfSBmcm9tICcuL2FkZC1wZXJtaXNzaW9uLWRpYWxvZy1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBNZW1iZXJNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9tZW1iZXIubW9kZWwnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IERhdGFDb2x1bW5Db21wb25lbnQsIERhdGFDb2x1bW5MaXN0Q29tcG9uZW50LCBEYXRhVGFibGVDb21wb25lbnQsIERhdGVDb2x1bW5IZWFkZXJDb21wb25lbnQgfSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgQWRkUGVybWlzc2lvblBhbmVsQ29tcG9uZW50IH0gZnJvbSAnLi9hZGQtcGVybWlzc2lvbi1wYW5lbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXNlckljb25Db2x1bW5Db21wb25lbnQgfSBmcm9tICcuLi91c2VyLWljb24tY29sdW1uL3VzZXItaWNvbi1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IFVzZXJOYW1lQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vdXNlci1uYW1lLWNvbHVtbi91c2VyLW5hbWUtY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBVc2VyUm9sZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4uL3VzZXItcm9sZS1jb2x1bW4vdXNlci1yb2xlLWNvbHVtbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FkZi1hZGQtcGVybWlzc2lvbi1kaWFsb2cnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIE1hdERpYWxvZ01vZHVsZSxcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIERhdGFUYWJsZUNvbXBvbmVudCxcbiAgICAgICAgRGF0YUNvbHVtbkxpc3RDb21wb25lbnQsXG4gICAgICAgIERhdGFDb2x1bW5Db21wb25lbnQsXG4gICAgICAgIERhdGVDb2x1bW5IZWFkZXJDb21wb25lbnQsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIEFkZFBlcm1pc3Npb25QYW5lbENvbXBvbmVudCxcbiAgICAgICAgVXNlckljb25Db2x1bW5Db21wb25lbnQsXG4gICAgICAgIFVzZXJOYW1lQ29sdW1uQ29tcG9uZW50LFxuICAgICAgICBVc2VyUm9sZUNvbHVtbkNvbXBvbmVudFxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FkZC1wZXJtaXNzaW9uLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vYWRkLXBlcm1pc3Npb24tZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBBZGRQZXJtaXNzaW9uRGlhbG9nQ29tcG9uZW50IHtcbiAgICBpc1NlYXJjaEFjdGl2ZSA9IHRydWU7XG4gICAgc2VsZWN0ZWRNZW1iZXJzOiBNZW1iZXJNb2RlbFtdID0gW107XG5cbiAgICBwcml2YXRlIGV4aXN0aW5nTWVtYmVyczogUGVybWlzc2lvbkVsZW1lbnRbXSA9IFtdO1xuICAgIGN1cnJlbnRTZWxlY3Rpb246IE5vZGVFbnRyeVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IEFkZFBlcm1pc3Npb25EaWFsb2dEYXRhLCBwcml2YXRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEFkZFBlcm1pc3Npb25EaWFsb2dDb21wb25lbnQ+KSB7XG4gICAgICAgIHRoaXMuZXhpc3RpbmdNZW1iZXJzID0gdGhpcy5kYXRhLm5vZGUucGVybWlzc2lvbnMubG9jYWxseVNldCB8fCBbXTtcbiAgICB9XG5cbiAgICBvblNlbGVjdChpdGVtczogTm9kZUVudHJ5W10pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gaXRlbXM7XG4gICAgfVxuXG4gICAgb25BZGRDbGlja2VkKCkge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGVkTWVtYmVycy5maWx0ZXIoKG1lbWJlcikgPT4gIW1lbWJlci5yZWFkb25seSkubWFwKChtZW1iZXIpID0+IG1lbWJlci50b1Blcm1pc3Npb25FbGVtZW50KCkpO1xuICAgICAgICB0aGlzLmRhdGEuY29uZmlybS5uZXh0KHNlbGVjdGlvbik7XG4gICAgICAgIHRoaXMuZGF0YS5jb25maXJtLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgb25TZWFyY2hBZGRDbGlja2VkKCkge1xuICAgICAgICBjb25zdCBuZXdNZW1iZXJzID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uXG4gICAgICAgICAgICAubWFwKChpdGVtKSA9PiBNZW1iZXJNb2RlbC5wYXJzZUZyb21TZWFyY2hSZXN1bHQoaXRlbSkpXG4gICAgICAgICAgICAuZmlsdGVyKCh7IGlkIH0pID0+ICF0aGlzLnNlbGVjdGVkTWVtYmVycy5maW5kKChtZW1iZXIpID0+IG1lbWJlci5pZCA9PT0gaWQpKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1lbWJlcnMgPSB0aGlzLnNlbGVjdGVkTWVtYmVycy5jb25jYXQobmV3TWVtYmVycyk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZE1lbWJlcnMuZm9yRWFjaCgobWVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ01lbWJlciA9IHRoaXMuZXhpc3RpbmdNZW1iZXJzLmZpbmQoKHsgYXV0aG9yaXR5SWQgfSkgPT4gYXV0aG9yaXR5SWQgPT09IG1lbWJlci5pZCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdNZW1iZXIpIHtcbiAgICAgICAgICAgICAgICBtZW1iZXIucm9sZSA9IGV4aXN0aW5nTWVtYmVyLm5hbWU7XG4gICAgICAgICAgICAgICAgbWVtYmVyLmFjY2Vzc1N0YXR1cyA9IGV4aXN0aW5nTWVtYmVyLmFjY2Vzc1N0YXR1cztcbiAgICAgICAgICAgICAgICBtZW1iZXIucmVhZG9ubHkgPSB0cnVlOyAvLyBtYWtlIHJvbGUgbm9uIGVkaXRhYmxlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpc2FibGVTZWFyY2goKTtcbiAgICB9XG5cbiAgICBjYW5DbG9zZURpYWxvZygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNZW1iZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlU2VhcmNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW5hYmxlU2VhcmNoKCkge1xuICAgICAgICB0aGlzLmlzU2VhcmNoQWN0aXZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBkaXNhYmxlU2VhcmNoKCkge1xuICAgICAgICB0aGlzLmlzU2VhcmNoQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgb25CdWxrVXBkYXRlKHJvbGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTWVtYmVycy5maWx0ZXIoKG1lbWJlcikgPT4gIW1lbWJlci5yZWFkb25seSkuZm9yRWFjaCgobWVtYmVyKSA9PiAobWVtYmVyLnJvbGUgPSByb2xlKSk7XG4gICAgfVxuXG4gICAgb25NZW1iZXJEZWxldGUoeyBpZCB9OiBNZW1iZXJNb2RlbCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRNZW1iZXJzLmZpbmRJbmRleCgobWVtYmVyKSA9PiBtZW1iZXIuaWQgPT09IGlkKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1lbWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNZW1iZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVTZWFyY2goKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25NZW1iZXJVcGRhdGUocm9sZTogc3RyaW5nLCBtZW1iZXI6IE1lbWJlck1vZGVsKSB7XG4gICAgICAgIGNvbnN0IG1lbWJlckluc3RhbmNlID0gdGhpcy5zZWxlY3RlZE1lbWJlcnMuZmluZCgoeyBpZCB9KSA9PiBpZCA9PT0gbWVtYmVyLmlkKTtcbiAgICAgICAgbWVtYmVySW5zdGFuY2Uucm9sZSA9IHJvbGU7XG4gICAgfVxuXG4gICAgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRNZW1iZXJzLmZpbHRlcigoeyByZWFkb25seSB9KSA9PiAhcmVhZG9ubHkpLmxlbmd0aCAmJiB0aGlzLnNlbGVjdGVkTWVtYmVycy5ldmVyeSgoeyByb2xlIH0pID0+ICEhcm9sZSk7XG4gICAgfVxufVxuIiwiPGgyIG1hdC1kaWFsb2ctdGl0bGUgY2xhc3M9J2FkZi1hZGQtcGVybWlzc2lvbi1kaWFsb2ctdGl0bGUnIGlkPVwiYWRkLXBlcm1pc3Npb24tZGlhbG9nLXRpdGxlXCI+XG4gICAge3sgKGRhdGE/LnRpdGxlID8gZGF0YT8udGl0bGUgOiBcIlBFUk1JU1NJT05fTUFOQUdFUi5BREQtUEVSTUlTU0lPTi5CQVNFLURJQUxPRy1USVRMRVwiKSB8IHRyYW5zbGF0ZSB9fVxuPC9oMj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1NlYXJjaEFjdGl2ZVwiPlxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJhZGYtYWRkLXBlcm1pc3Npb24tZGlhbG9nLWNvbnRlbnRcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJlbmFibGVTZWFyY2goKVwiIGNsYXNzPVwiYWRmLXNlYXJjaC11c2VyLWJ1dHRvblwiPlxuICAgICAgICAgICAge3sgXCJQRVJNSVNTSU9OX01BTkFHRVIuQURELVBFUk1JU1NJT04uU0VBUkNIXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRmLXRvb2xiYXItLXNwYWNlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBpY29uUG9zaXRpb25FbmQ+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFkZi1uZXctcGVybWlzc2lvbi10YWJsZVwiPlxuICAgICAgICAgICAgPGFkZi1kYXRhdGFibGUgW3Jvd3NdPVwic2VsZWN0ZWRNZW1iZXJzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWRmLWRhdGF0YWJsZS1wZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbk1vZGU9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGlja3lIZWFkZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJhZGYtdXNlci1yb2xlLXNlbGVjdGlvbi10YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkTWVtYmVycy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8ZGF0YS1jb2x1bW5zPlxuICAgICAgICAgICAgICAgICAgICA8ZGF0YS1jb2x1bW4gY2xhc3M9XCJhZGYtZGF0YXRhYmxlLWNlbGwtLWltYWdlIGFkZi1hdXRob3JpdHktaWNvbi1jb2x1bW5cIiBrZXk9XCIkdGh1bWJ1bmFpbFwiIFtzb3J0YWJsZV09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1jb250ZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGYtdXNlci1pY29uLWNvbHVtbiBbY29udGV4dF09XCJjb250ZXh0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGF0YS1jb2x1bW4+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRhdGEtY29sdW1uIGNsYXNzPVwiYWRmLWVsbGlwc2lzLWNlbGwgYWRmLWV4cGFuZC1jZWxsLTUgYWRmLWF1dGhvcml0eUlkLWNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1BFUk1JU1NJT05fTUFOQUdFUi5DT0xVTU4uTkFNRScgfCB0cmFuc2xhdGU6e2NvdW50OnNlbGVjdGVkTWVtYmVycy5sZW5ndGh9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1cImlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWNvbnRleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZi11c2VyLW5hbWUtY29sdW1uIFtjb250ZXh0XT1cImNvbnRleHRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kYXRhLWNvbHVtbj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGF0YS1jb2x1bW4gY2xhc3M9XCJhZGYtZWxsaXBzaXMtY2VsbCBhZGYtZXhwYW5kLWNlbGwtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlBFUk1JU1NJT05fTUFOQUdFUi5QRVJNSVNTSU9OX0RJU1BMQVkuUk9MRVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9XCJyb2xlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWVudHJ5PVwiJGltcGxpY2l0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZi11c2VyLXJvbGUtY29sdW1uIFtyZWFkb25seV09XCJlbnRyeS5yb3cub2JqLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImVudHJ5LmRhdGEuZ2V0VmFsdWUoZW50cnkucm93LCBlbnRyeS5jb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGVzXT1cImRhdGEucm9sZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImFkZi1zZWxlY3Qtcm9sZS1wZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvbGVDaGFuZ2VkKT1cIm9uTWVtYmVyVXBkYXRlKCRldmVudCwgZW50cnkucm93Lm9iailcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGFkZi1kYXRhLWNvbHVtbi1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRmLXVzZXItcm9sZS1jb2x1bW4gIGNsYXNzPVwiYWRmLXBlcm1pc3Npb24tcm9sZS1jb2x1bW4taGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBFUk1JU1NJT05fTUFOQUdFUi5DT0xVTU4uQlVMSy1ST0xFXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm9sZXNdPVwiZGF0YS5yb2xlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhZGYtYnVsay1zZWxlY3Qtcm9sZS1wZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocm9sZUNoYW5nZWQpPVwib25CdWxrVXBkYXRlKCRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2FkZi1kYXRhLWNvbHVtbi1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGF0YS1jb2x1bW4+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRhdGEtY29sdW1uIGNsYXNzPVwiYWRmLWRhdGF0YWJsZS1jZWxsIGFkZi1kZWxldGUtcGVybWlzc2lvbi1jb2x1bW5cIiBrZXk9XCJcIiBbc29ydGFibGVdPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZW50cnk9XCIkaW1wbGljaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZGYtYWRkLW1lbWJlci1hY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwiZW50cnkucm93Lm9iai5yZWFkb25seSA/ICdub25lJzogJ2Jsb2NrJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25NZW1iZXJEZWxldGUoZW50cnkucm93Lm9iailcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1hdXRvbWF0aW9uLWlkPVwiYWRmLWRlbGV0ZS1wZXJtaXNzaW9uLWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+aGlnaGxpZ2h0X29mZjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L2RhdGEtY29sdW1uPlxuICAgICAgICAgICAgICAgIDwvZGF0YS1jb2x1bW5zPlxuICAgICAgICAgICAgPC9hZGYtZGF0YXRhYmxlPlxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuXG4gICAgPG1hdC1kaWFsb2ctYWN0aW9ucyBjbGFzcz1cImFkZi1hZGQtcGVybWlzc2lvbi1kaWFsb2ctYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgICBtYXQtZGlhbG9nLWNsb3NlXG4gICAgICAgICAgICAgICAgZGF0YS1hdXRvbWF0aW9uLWlkPVwiYWRkLXBlcm1pc3Npb24tZGlhbG9nLWNsb3NlLWJ1dHRvblwiPlxuICAgICAgICAgICAge3sgXCJQRVJNSVNTSU9OX01BTkFHRVIuQURELVBFUk1JU1NJT04uQ0xPU0UtQUNUSU9OXCIgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAgIGRhdGEtYXV0b21hdGlvbi1pZD1cImFkZC1wZXJtaXNzaW9uLWRpYWxvZy1jb25maXJtLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW21hdC1kaWFsb2ctY2xvc2VdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhZGYtY2hvb3NlLWFjdGlvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc1ZhbGlkKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkFkZENsaWNrZWQoKVwiPlxuICAgICAgICAgICAge3sgXCJQRVJNSVNTSU9OX01BTkFHRVIuQURELVBFUk1JU1NJT04uQURELUFDVElPTlwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJpc1NlYXJjaEFjdGl2ZVwiPlxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJhZGYtYWRkLXBlcm1pc3Npb24tZGlhbG9nLWNvbnRlbnRcIj5cbiAgICAgICAgPGFkZi1hZGQtcGVybWlzc2lvbi1wYW5lbCBjbGFzcz1cImFkZi1zZWFyY2gtY29udGFpbmVyXCIgKHNlbGVjdCk9XCJvblNlbGVjdCgkZXZlbnQpXCIgLz5cbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cblxuICAgIDxtYXQtZGlhbG9nLWFjdGlvbnMgY2xhc3M9XCJhZGYtYWRkLXBlcm1pc3Npb24tZGlhbG9nLWFjdGlvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuQ2xvc2VEaWFsb2coKVwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtYXV0b21hdGlvbi1pZD1cImFkZC1wZXJtaXNzaW9uLWRpYWxvZy1jbG9zZS1idXR0b25cIj5cbiAgICAgICAgICAgICAgICB7eyBcIlBFUk1JU1NJT05fTUFOQUdFUi5BREQtUEVSTUlTU0lPTi5DTE9TRS1BQ1RJT05cIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgZGF0YS1hdXRvbWF0aW9uLWlkPVwiYWRkLXBlcm1pc3Npb24tZGlhbG9nLWNvbmZpcm0tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjdXJyZW50U2VsZWN0aW9uLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNlYXJjaEFkZENsaWNrZWQoKVwiPlxuICAgICAgICAgICAgICAgIHt7IFwiUEVSTUlTU0lPTl9NQU5BR0VSLkFERC1QRVJNSVNTSU9OLlNFTEVDVC1BQ1RJT05cIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==