@posiwise/admin-module 0.0.143 → 0.0.145

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.
@@ -320,11 +320,11 @@ export class UserListComponent extends AppBaseComponent {
320
320
  this.adminService.remove2fa(this.remove2faUserId, this.subscriptionId).subscribe();
321
321
  }
322
322
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: UserListComponent, deps: [{ token: i1.AdminService }, { token: i2.CustomToastService }, { token: i2.ProductService }, { token: i0.Injector }, { token: i2.AuthService }, { token: i0.ChangeDetectorRef }, { token: i2.WindowService }], target: i0.ɵɵFactoryTarget.Component }); }
323
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: UserListComponent, selector: "pw-admin-user-list", viewQueries: [{ propertyName: "passwordValidationModalForUserDelete", first: true, predicate: ["passwordValidationModalForUserDelete"], descendants: true }, { propertyName: "passwordValidationModalForImpersonate", first: true, predicate: ["passwordValidationModalForImpersonate"], descendants: true }, { propertyName: "passwordValidationModalForRemove2fa", first: true, predicate: ["passwordValidationModalForRemove2fa"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-12 d-flex justify-content-between align-items-center\">\n <h2 class=\"card-title p-0 float-start\">Users</h2>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n id=\"btn-create\"\n *rbacAllow=\"'SuperAdmin'\"\n [routerLink]=\"[routers.usersDetails + 'add']\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Create User\n </a>\n </div>\n</div>\n<div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!isLoaded\">\n <p-progressSpinner> </p-progressSpinner>\n </ng-template>\n</div>\n<div class=\"primeng-datatable-container mt-0\" [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n [value]=\"users\"\n [paginator]=\"totalRecords !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <div class=\"search-filter\">\n <div class=\"col-sm-4\">\n <p-multiSelect [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event)\"\n placeholder=\"Filter users by role, product, or feature\"\n [selectionLimit]=\"1\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-4\"\n *ngIf=\"selectedOption\">\n <p-multiSelect [options]=\"searchDataSource\"\n (onChange)=\"onSearchCriteria($event)\"\n [showToggleAll]=\"true\"\n [(ngModel)]=\"criteria\"\n [showHeader]=\"true\"\n placeholder=\"Select {{ selectedOption.value }}s\"\n maxSelectedLabels=\"2\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"text-end\">\n <i class=\"fa fa-search mt-2 me-2\" aria-hidden=\"true\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n pInputText\n size=\"50\"\n placeholder=\"Search User...\"\n data-cy=\"user-search\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"wd-90\" />\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sortIcon field=\"id\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n <p-sortIcon field=\"first_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sortIcon field=\"last_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sortIcon field=\"email\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Users.Slug' | transloco }}\n <p-sortIcon field=\"slug\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"encrypted_password\">\n {{ 'Admin.Users.EmailConfirm' | transloco }}\n <p-sortIcon field=\"encrypted_password\"></p-sortIcon>\n </th>\n\n <th scope=\"true\"\n pSortableColumn=\"sessions_last_month\">\n {{ 'Admin.Subscriptions.SessionsTotalLastMonth' | transloco }}\n <p-sortIcon field=\"sessions_last_month\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Users.LastLogin' | transloco }}\n <p-sortIcon field=\"last_sign_in_at\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"signed_up_at\">\n {{ 'Admin.Users.RegisteredOn' | transloco }}\n <p-sortIcon field=\"signed_up_at\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n class=\"actions-list-four\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-user>\n <tr>\n <td data-head=\"id\"> {{ user.id }}</td>\n <td data-head=\"First Name\"><a [routerLink]=\"['/members', user.slug]\">{{ user.first_name }}</a></td>\n <td data-head=\"Last Name\">{{ user.last_name }}\n <span *ngIf=\"user?.alpha\"\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n <span class=\"ms-2\"\n *ngIf=\"user?.beta\"\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n tooltipPosition=\"top\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\" ></i>\n </span>\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Slug\">{{ user.slug }}</td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{\n itemsArray: [true, false],\n item: user?.has_password\n }\"\n color=\"success-danger\"\n class=\"badge\">{{ user?.has_password ? 'Yes' : 'No' }}</span>\n <span class=\"ms-2\" *ngIf=\"user?.blocked\" [pTooltip]=\"'This user has been blocked'\" tooltipPosition=\"top\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n </td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': user?.sessions_last_month < 3\n }\">{{ user?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Last Login\">\n <span *ngIf=\"user?.current_sign_in_at;else lastSignin\">\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n <ng-template #lastSignin>\n {{ user.last_sign_in_at | dateFormat }}\n </ng-template>\n </td>\n <td data-head=\"Registered On\">{{ user.signed_up_at | dateFormat }}</td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li ngbTooltip=\"Impersonate this user\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fas fa-people-arrows fa-lg\"\n (click)=\"onImpersonate(user)\"\n (keydown.enter)=\"onImpersonate(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n <ng-template [ngIf]=\"user?.enable_two_factor_authenticator\">\n <li ngbTooltip=\"Disable 2fa\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-lock fa-lg warning\" aria-hidden=\"true\"></i>\n </li>\n </ng-template>\n <ng-template [ngIf]=\"currentUser && user.id !== currentUser.id\">\n <li ngbTooltip=\"Message\"\n *rbacAllow=\"chatPermission\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"['/message']\"\n [fragment]=\"user.slug\">\n <i class=\"fa fa-comments cta1-icon\" aria-hidden=\"true\"></i>\n </li>\n </ng-template>\n <li ngbTooltip=\"Edit\"\n *rbacAllow=\"'Pages.Admin.Users.Edit'\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.usersDetails + user.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li ngbTooltip=\"Delete\"\n *rbacAllow=\"'Pages.Admin.Users.Delete'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (keydown.enter)=\"onDelete(user)\"\n (keydown.space)=\"onDelete(user)\"\n (click)=\"onDelete(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <div *ngIf=\"totalRecords === 0 && totalRecordsUnFiltered !== 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n <span class=\"total-records-count\" *ngIf=\"totalRecords !== 0\">{{ 'Label.Total' | transloco }}: {{ totalRecords }}</span>\n </div>\n</div>\n<div *ngIf=\"!loading && totalRecordsUnFiltered === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Users.NoDataMessage' | transloco\"> </pw-no-data>\n</div>\n<!-- password validation modal for delete user -->\n<pw-password-validation #passwordValidationModalForUserDelete\n (successEvent)=\"deleteUser($event)\">\n <div class=\"row\">\n <div class=\"col-12\">\n <p>{{ 'User.Account.Message.ActionCanNotUndone' | transloco }}</p>\n <p>{{ 'User.Account.Message.ConfirmPassword' | transloco }}</p>\n </div>\n </div>\n</pw-password-validation>\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.search-input input{width:100%}.w-150{width:150px}@media (min-width: 767px){.table-responsive td,.table-responsive th{font-size:11px!important}}.hexa-warning{font-size:18px;vertical-align:middle}.alpha-beta{font-size:14px}\n"], dependencies: [{ kind: "component", type: i3.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i3.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i3.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i6.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i7.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.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: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.PasswordValidationComponent, selector: "pw-password-validation", outputs: ["successEvent"] }, { kind: "directive", type: i11.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i12.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i10.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "directive", type: i13.DynamicBadgeDirective, selector: "[appDynamicBadge]", inputs: ["appDynamicBadge", "color"] }, { kind: "directive", type: i13.RbacAllowDirective, selector: "[rbacAllow]", inputs: ["rbacAllow"] }, { kind: "directive", type: i14.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "pipe", type: i15.TranslocoPipe, name: "transloco" }, { kind: "pipe", type: i16.DateFormatPipe, name: "dateFormat" }] }); }
323
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: UserListComponent, selector: "pw-admin-user-list", viewQueries: [{ propertyName: "passwordValidationModalForUserDelete", first: true, predicate: ["passwordValidationModalForUserDelete"], descendants: true }, { propertyName: "passwordValidationModalForImpersonate", first: true, predicate: ["passwordValidationModalForImpersonate"], descendants: true }, { propertyName: "passwordValidationModalForRemove2fa", first: true, predicate: ["passwordValidationModalForRemove2fa"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-12 d-flex justify-content-between align-items-center\">\n <h2 class=\"card-title p-0 float-start\">Users</h2>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n id=\"btn-create\"\n *rbacAllow=\"'SuperAdmin'\"\n [routerLink]=\"[routers.usersDetails + 'add']\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Create User\n </a>\n </div>\n</div>\n<div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!isLoaded\">\n <p-progressSpinner> </p-progressSpinner>\n </ng-template>\n</div>\n<div class=\"primeng-datatable-container mt-0\" [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n [value]=\"users\"\n [paginator]=\"totalRecords !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <div class=\"search-filter\">\n <div class=\"col-sm-4\">\n <p-multiSelect [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event)\"\n placeholder=\"Filter users by role, product, or feature\"\n [selectionLimit]=\"1\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-4\"\n *ngIf=\"selectedOption\">\n <p-multiSelect [options]=\"searchDataSource\"\n (onChange)=\"onSearchCriteria($event)\"\n [showToggleAll]=\"true\"\n [(ngModel)]=\"criteria\"\n [showHeader]=\"true\"\n placeholder=\"Select {{ selectedOption.value }}s\"\n maxSelectedLabels=\"2\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"text-end\">\n <i class=\"fa fa-search mt-2 me-2\" aria-hidden=\"true\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n pInputText\n size=\"50\"\n placeholder=\"Search User...\"\n data-cy=\"user-search\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"wd-90\" />\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sortIcon field=\"id\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n <p-sortIcon field=\"first_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sortIcon field=\"last_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sortIcon field=\"email\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Users.Slug' | transloco }}\n <p-sortIcon field=\"slug\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"encrypted_password\">\n {{ 'Admin.Users.EmailConfirm' | transloco }}\n <p-sortIcon field=\"encrypted_password\"></p-sortIcon>\n </th>\n\n <th scope=\"true\"\n pSortableColumn=\"sessions_last_month\">\n {{ 'Admin.Subscriptions.SessionsTotalLastMonth' | transloco }}\n <p-sortIcon field=\"sessions_last_month\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Users.LastLogin' | transloco }}\n <p-sortIcon field=\"last_sign_in_at\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"signed_up_at\">\n {{ 'Admin.Users.RegisteredOn' | transloco }}\n <p-sortIcon field=\"signed_up_at\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n class=\"actions-list-four\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-user>\n <tr>\n <td data-head=\"id\"> {{ user.id }}</td>\n <td data-head=\"First Name\"><a [routerLink]=\"['/members', user.slug]\">{{ user.first_name }}</a></td>\n <td data-head=\"Last Name\">{{ user.last_name }}\n <span *ngIf=\"user?.alpha\"\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n <span class=\"ms-2\"\n *ngIf=\"user?.beta\"\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n tooltipPosition=\"top\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\" ></i>\n </span>\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Slug\">{{ user.slug }}</td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{\n itemsArray: [true, false],\n item: user?.has_password\n }\"\n color=\"success-danger\"\n class=\"badge\">{{ user?.has_password ? 'Yes' : 'No' }}</span>\n <span class=\"ms-2\" *ngIf=\"user?.blocked\" [pTooltip]=\"'This user has been blocked'\" tooltipPosition=\"top\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n </td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': user?.sessions_last_month < 3\n }\">{{ user?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Last Login\">\n <span *ngIf=\"user?.current_sign_in_at;else lastSignin\">\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n <ng-template #lastSignin>\n {{ user.last_sign_in_at | dateFormat }}\n </ng-template>\n </td>\n <td data-head=\"Registered On\">{{ user.signed_up_at | dateFormat }}</td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li ngbTooltip=\"Impersonate this user\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fas fa-people-arrows fa-lg\"\n (click)=\"onImpersonate(user)\"\n (keydown.enter)=\"onImpersonate(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n <ng-template [ngIf]=\"user?.enable_two_factor_authenticator\">\n <li ngbTooltip=\"Disable 2FA\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-lock fa-lg success\" aria-hidden=\"true\"></i>\n </li>\n </ng-template>\n <ng-template [ngIf]=\"currentUser && user.id !== currentUser.id\">\n <li ngbTooltip=\"Message\"\n *rbacAllow=\"chatPermission\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"['/message']\"\n [fragment]=\"user.slug\">\n <i class=\"fa fa-comments cta1-icon\" aria-hidden=\"true\"></i>\n </li>\n </ng-template>\n <li ngbTooltip=\"Edit\"\n *rbacAllow=\"'Pages.Admin.Users.Edit'\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.usersDetails + user.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li ngbTooltip=\"Delete\"\n *rbacAllow=\"'Pages.Admin.Users.Delete'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (keydown.enter)=\"onDelete(user)\"\n (keydown.space)=\"onDelete(user)\"\n (click)=\"onDelete(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <div *ngIf=\"totalRecords === 0 && totalRecordsUnFiltered !== 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n <span class=\"total-records-count\" *ngIf=\"totalRecords !== 0\">{{ 'Label.Total' | transloco }}: {{ totalRecords }}</span>\n </div>\n</div>\n<div *ngIf=\"!loading && totalRecordsUnFiltered === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Users.NoDataMessage' | transloco\"> </pw-no-data>\n</div>\n<!-- password validation modal for delete user -->\n<pw-password-validation #passwordValidationModalForUserDelete\n (successEvent)=\"deleteUser($event)\">\n <div class=\"row\">\n <div class=\"col-12\">\n <p>{{ 'User.Account.Message.ActionCanNotUndone' | transloco }}</p>\n <p>{{ 'User.Account.Message.ConfirmPassword' | transloco }}</p>\n </div>\n </div>\n</pw-password-validation>\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.search-input input{width:100%}.w-150{width:150px}@media (min-width: 767px){.table-responsive td,.table-responsive th{font-size:11px!important}}.hexa-warning{font-size:18px;vertical-align:middle}.alpha-beta{font-size:14px}\n"], dependencies: [{ kind: "component", type: i3.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i3.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i3.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i6.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i7.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.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: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.PasswordValidationComponent, selector: "pw-password-validation", outputs: ["successEvent"] }, { kind: "directive", type: i11.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i12.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i10.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "directive", type: i13.DynamicBadgeDirective, selector: "[appDynamicBadge]", inputs: ["appDynamicBadge", "color"] }, { kind: "directive", type: i13.RbacAllowDirective, selector: "[rbacAllow]", inputs: ["rbacAllow"] }, { kind: "directive", type: i14.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "pipe", type: i15.TranslocoPipe, name: "transloco" }, { kind: "pipe", type: i16.DateFormatPipe, name: "dateFormat" }] }); }
324
324
  }
325
325
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: UserListComponent, decorators: [{
326
326
  type: Component,
327
- args: [{ selector: 'pw-admin-user-list', template: "<div class=\"row\">\n <div class=\"col-12 d-flex justify-content-between align-items-center\">\n <h2 class=\"card-title p-0 float-start\">Users</h2>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n id=\"btn-create\"\n *rbacAllow=\"'SuperAdmin'\"\n [routerLink]=\"[routers.usersDetails + 'add']\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Create User\n </a>\n </div>\n</div>\n<div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!isLoaded\">\n <p-progressSpinner> </p-progressSpinner>\n </ng-template>\n</div>\n<div class=\"primeng-datatable-container mt-0\" [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n [value]=\"users\"\n [paginator]=\"totalRecords !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <div class=\"search-filter\">\n <div class=\"col-sm-4\">\n <p-multiSelect [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event)\"\n placeholder=\"Filter users by role, product, or feature\"\n [selectionLimit]=\"1\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-4\"\n *ngIf=\"selectedOption\">\n <p-multiSelect [options]=\"searchDataSource\"\n (onChange)=\"onSearchCriteria($event)\"\n [showToggleAll]=\"true\"\n [(ngModel)]=\"criteria\"\n [showHeader]=\"true\"\n placeholder=\"Select {{ selectedOption.value }}s\"\n maxSelectedLabels=\"2\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"text-end\">\n <i class=\"fa fa-search mt-2 me-2\" aria-hidden=\"true\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n pInputText\n size=\"50\"\n placeholder=\"Search User...\"\n data-cy=\"user-search\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"wd-90\" />\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sortIcon field=\"id\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n <p-sortIcon field=\"first_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sortIcon field=\"last_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sortIcon field=\"email\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Users.Slug' | transloco }}\n <p-sortIcon field=\"slug\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"encrypted_password\">\n {{ 'Admin.Users.EmailConfirm' | transloco }}\n <p-sortIcon field=\"encrypted_password\"></p-sortIcon>\n </th>\n\n <th scope=\"true\"\n pSortableColumn=\"sessions_last_month\">\n {{ 'Admin.Subscriptions.SessionsTotalLastMonth' | transloco }}\n <p-sortIcon field=\"sessions_last_month\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Users.LastLogin' | transloco }}\n <p-sortIcon field=\"last_sign_in_at\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"signed_up_at\">\n {{ 'Admin.Users.RegisteredOn' | transloco }}\n <p-sortIcon field=\"signed_up_at\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n class=\"actions-list-four\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-user>\n <tr>\n <td data-head=\"id\"> {{ user.id }}</td>\n <td data-head=\"First Name\"><a [routerLink]=\"['/members', user.slug]\">{{ user.first_name }}</a></td>\n <td data-head=\"Last Name\">{{ user.last_name }}\n <span *ngIf=\"user?.alpha\"\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n <span class=\"ms-2\"\n *ngIf=\"user?.beta\"\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n tooltipPosition=\"top\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\" ></i>\n </span>\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Slug\">{{ user.slug }}</td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{\n itemsArray: [true, false],\n item: user?.has_password\n }\"\n color=\"success-danger\"\n class=\"badge\">{{ user?.has_password ? 'Yes' : 'No' }}</span>\n <span class=\"ms-2\" *ngIf=\"user?.blocked\" [pTooltip]=\"'This user has been blocked'\" tooltipPosition=\"top\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n </td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': user?.sessions_last_month < 3\n }\">{{ user?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Last Login\">\n <span *ngIf=\"user?.current_sign_in_at;else lastSignin\">\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n <ng-template #lastSignin>\n {{ user.last_sign_in_at | dateFormat }}\n </ng-template>\n </td>\n <td data-head=\"Registered On\">{{ user.signed_up_at | dateFormat }}</td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li ngbTooltip=\"Impersonate this user\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fas fa-people-arrows fa-lg\"\n (click)=\"onImpersonate(user)\"\n (keydown.enter)=\"onImpersonate(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n <ng-template [ngIf]=\"user?.enable_two_factor_authenticator\">\n <li ngbTooltip=\"Disable 2fa\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-lock fa-lg warning\" aria-hidden=\"true\"></i>\n </li>\n </ng-template>\n <ng-template [ngIf]=\"currentUser && user.id !== currentUser.id\">\n <li ngbTooltip=\"Message\"\n *rbacAllow=\"chatPermission\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"['/message']\"\n [fragment]=\"user.slug\">\n <i class=\"fa fa-comments cta1-icon\" aria-hidden=\"true\"></i>\n </li>\n </ng-template>\n <li ngbTooltip=\"Edit\"\n *rbacAllow=\"'Pages.Admin.Users.Edit'\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.usersDetails + user.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li ngbTooltip=\"Delete\"\n *rbacAllow=\"'Pages.Admin.Users.Delete'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (keydown.enter)=\"onDelete(user)\"\n (keydown.space)=\"onDelete(user)\"\n (click)=\"onDelete(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <div *ngIf=\"totalRecords === 0 && totalRecordsUnFiltered !== 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n <span class=\"total-records-count\" *ngIf=\"totalRecords !== 0\">{{ 'Label.Total' | transloco }}: {{ totalRecords }}</span>\n </div>\n</div>\n<div *ngIf=\"!loading && totalRecordsUnFiltered === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Users.NoDataMessage' | transloco\"> </pw-no-data>\n</div>\n<!-- password validation modal for delete user -->\n<pw-password-validation #passwordValidationModalForUserDelete\n (successEvent)=\"deleteUser($event)\">\n <div class=\"row\">\n <div class=\"col-12\">\n <p>{{ 'User.Account.Message.ActionCanNotUndone' | transloco }}</p>\n <p>{{ 'User.Account.Message.ConfirmPassword' | transloco }}</p>\n </div>\n </div>\n</pw-password-validation>\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.search-input input{width:100%}.w-150{width:150px}@media (min-width: 767px){.table-responsive td,.table-responsive th{font-size:11px!important}}.hexa-warning{font-size:18px;vertical-align:middle}.alpha-beta{font-size:14px}\n"] }]
327
+ args: [{ selector: 'pw-admin-user-list', template: "<div class=\"row\">\n <div class=\"col-12 d-flex justify-content-between align-items-center\">\n <h2 class=\"card-title p-0 float-start\">Users</h2>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n id=\"btn-create\"\n *rbacAllow=\"'SuperAdmin'\"\n [routerLink]=\"[routers.usersDetails + 'add']\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Create User\n </a>\n </div>\n</div>\n<div class=\"w-100 text-center mt-3\">\n <ng-template [ngIf]=\"!isLoaded\">\n <p-progressSpinner> </p-progressSpinner>\n </ng-template>\n</div>\n<div class=\"primeng-datatable-container mt-0\" [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n [value]=\"users\"\n [paginator]=\"totalRecords !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <div class=\"search-filter\">\n <div class=\"col-sm-4\">\n <p-multiSelect [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event)\"\n placeholder=\"Filter users by role, product, or feature\"\n [selectionLimit]=\"1\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-4\"\n *ngIf=\"selectedOption\">\n <p-multiSelect [options]=\"searchDataSource\"\n (onChange)=\"onSearchCriteria($event)\"\n [showToggleAll]=\"true\"\n [(ngModel)]=\"criteria\"\n [showHeader]=\"true\"\n placeholder=\"Select {{ selectedOption.value }}s\"\n maxSelectedLabels=\"2\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"text-end\">\n <i class=\"fa fa-search mt-2 me-2\" aria-hidden=\"true\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n pInputText\n size=\"50\"\n placeholder=\"Search User...\"\n data-cy=\"user-search\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"wd-90\" />\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Users.Id' | transloco }}\n <p-sortIcon field=\"id\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"first_name\">\n {{ 'Label.FirstName' | transloco }}\n <p-sortIcon field=\"first_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"last_name\">\n {{ 'Label.LastName' | transloco }}\n <p-sortIcon field=\"last_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"email\">\n {{ 'Label.Email' | transloco }}\n <p-sortIcon field=\"email\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"slug\">\n {{ 'Admin.Users.Slug' | transloco }}\n <p-sortIcon field=\"slug\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"encrypted_password\">\n {{ 'Admin.Users.EmailConfirm' | transloco }}\n <p-sortIcon field=\"encrypted_password\"></p-sortIcon>\n </th>\n\n <th scope=\"true\"\n pSortableColumn=\"sessions_last_month\">\n {{ 'Admin.Subscriptions.SessionsTotalLastMonth' | transloco }}\n <p-sortIcon field=\"sessions_last_month\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"last_sign_in_at\">\n {{ 'Admin.Users.LastLogin' | transloco }}\n <p-sortIcon field=\"last_sign_in_at\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"signed_up_at\">\n {{ 'Admin.Users.RegisteredOn' | transloco }}\n <p-sortIcon field=\"signed_up_at\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n class=\"actions-list-four\">\n {{ 'Label.Actions' | transloco }}\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-user>\n <tr>\n <td data-head=\"id\"> {{ user.id }}</td>\n <td data-head=\"First Name\"><a [routerLink]=\"['/members', user.slug]\">{{ user.first_name }}</a></td>\n <td data-head=\"Last Name\">{{ user.last_name }}\n <span *ngIf=\"user?.alpha\"\n [pTooltip]=\"'Admin.Users.Tooltip.AlphaIcon'|transloco\"\n tooltipPosition=\"top\">\n <i class=\"fa-regular fa-square-a alpha-beta text-warning\"></i>\n </span>\n <span class=\"ms-2\"\n *ngIf=\"user?.beta\"\n [pTooltip]=\"'Admin.Users.Tooltip.BetaIcon'|transloco\"\n tooltipPosition=\"top\">\n <i class=\"fa-regular fa-square-b alpha-beta text-primary\" ></i>\n </span>\n </td>\n <td data-head=\"Email\">{{ user.email }}</td>\n <td data-head=\"Slug\">{{ user.slug }}</td>\n <td data-head=\"Email Confirm\">\n <span [appDynamicBadge]=\"{\n itemsArray: [true, false],\n item: user?.has_password\n }\"\n color=\"success-danger\"\n class=\"badge\">{{ user?.has_password ? 'Yes' : 'No' }}</span>\n <span class=\"ms-2\" *ngIf=\"user?.blocked\" [pTooltip]=\"'This user has been blocked'\" tooltipPosition=\"top\">\n <i class=\"fa-solid fa-hexagon-exclamation text-danger hexa-warning\"></i>\n </span>\n </td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': user?.sessions_last_month < 3\n }\">{{ user?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Last Login\">\n <span *ngIf=\"user?.current_sign_in_at;else lastSignin\">\n {{ user.current_sign_in_at | dateFormat }}\n </span>\n <ng-template #lastSignin>\n {{ user.last_sign_in_at | dateFormat }}\n </ng-template>\n </td>\n <td data-head=\"Registered On\">{{ user.signed_up_at | dateFormat }}</td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li ngbTooltip=\"Impersonate this user\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fas fa-people-arrows fa-lg\"\n (click)=\"onImpersonate(user)\"\n (keydown.enter)=\"onImpersonate(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n <ng-template [ngIf]=\"user?.enable_two_factor_authenticator\">\n <li ngbTooltip=\"Disable 2FA\"\n (click)=\"disable2fa(user?.id)\"\n (keydown.enter)=\"disable2fa(user?.id)\"\n *rbacAllow=\"'Pages.Alpha'\"\n class=\"me-2 me-sm-3\">\n <i class=\"fa fa-lock fa-lg success\" aria-hidden=\"true\"></i>\n </li>\n </ng-template>\n <ng-template [ngIf]=\"currentUser && user.id !== currentUser.id\">\n <li ngbTooltip=\"Message\"\n *rbacAllow=\"chatPermission\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"['/message']\"\n [fragment]=\"user.slug\">\n <i class=\"fa fa-comments cta1-icon\" aria-hidden=\"true\"></i>\n </li>\n </ng-template>\n <li ngbTooltip=\"Edit\"\n *rbacAllow=\"'Pages.Admin.Users.Edit'\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.usersDetails + user.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <li ngbTooltip=\"Delete\"\n *rbacAllow=\"'Pages.Admin.Users.Delete'\"\n class=\"me-2 me-sm-3\">\n <i\n class=\"fa fa-trash delete-icon\"\n (keydown.enter)=\"onDelete(user)\"\n (keydown.space)=\"onDelete(user)\"\n (click)=\"onDelete(user)\"\n aria-hidden=\"true\"\n ></i>\n </li>\n </ul>\n </td>\n </tr>\n </ng-template>\n </p-table>\n <div *ngIf=\"totalRecords === 0 && totalRecordsUnFiltered !== 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n <span class=\"total-records-count\" *ngIf=\"totalRecords !== 0\">{{ 'Label.Total' | transloco }}: {{ totalRecords }}</span>\n </div>\n</div>\n<div *ngIf=\"!loading && totalRecordsUnFiltered === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Users.NoDataMessage' | transloco\"> </pw-no-data>\n</div>\n<!-- password validation modal for delete user -->\n<pw-password-validation #passwordValidationModalForUserDelete\n (successEvent)=\"deleteUser($event)\">\n <div class=\"row\">\n <div class=\"col-12\">\n <p>{{ 'User.Account.Message.ActionCanNotUndone' | transloco }}</p>\n <p>{{ 'User.Account.Message.ConfirmPassword' | transloco }}</p>\n </div>\n </div>\n</pw-password-validation>\n<!-- password validation modal for impersonate -->\n<pw-password-validation #passwordValidationModalForImpersonate\n (successEvent)=\"onUserImpersonation($event)\">\n</pw-password-validation>\n<!-- password validation modal for remove2fa -->\n<pw-password-validation #passwordValidationModalForRemove2fa\n (successEvent)=\"remove2fa($event)\">\n</pw-password-validation>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.search-input input{width:100%}.w-150{width:150px}@media (min-width: 767px){.table-responsive td,.table-responsive th{font-size:11px!important}}.hexa-warning{font-size:18px;vertical-align:middle}.alpha-beta{font-size:14px}\n"] }]
328
328
  }], ctorParameters: () => [{ type: i1.AdminService }, { type: i2.CustomToastService }, { type: i2.ProductService }, { type: i0.Injector }, { type: i2.AuthService }, { type: i0.ChangeDetectorRef }, { type: i2.WindowService }], propDecorators: { passwordValidationModalForUserDelete: [{
329
329
  type: ViewChild,
330
330
  args: ['passwordValidationModalForUserDelete', { static: false }]
@@ -335,4 +335,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
335
335
  type: ViewChild,
336
336
  args: ['passwordValidationModalForRemove2fa', { static: false }]
337
337
  }] } });
338
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnMtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FkbWluLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvdXNlcnMvdXNlcnMtbGlzdC91c2Vycy1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYWRtaW4tbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy91c2Vycy91c2Vycy1saXN0L3VzZXJzLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUdSLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFDSCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsYUFBYSxFQUNoQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRzFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTzFELE1BQU0sT0FBTyxpQkFDVCxTQUFRLGdCQUFnQjtJQTZEeEIsWUFDcUIsWUFBMEIsRUFD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U0FBUyxDQUFDLE1BQU07UUFDWixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN2RixDQUFDOytHQTFVUSxpQkFBaUI7bUdBQWpCLGlCQUFpQiw2Z0JDbEM5QixxOVVBcVBBOzs0RkRuTmEsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNJLG9CQUFvQjs0UEFTOUIsb0NBQW9DO3NCQURuQyxTQUFTO3VCQUFDLHNDQUFzQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHcEUscUNBQXFDO3NCQURwQyxTQUFTO3VCQUFDLHVDQUF1QyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHckUsbUNBQW1DO3NCQURsQyxTQUFTO3VCQUFDLHFDQUFxQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgSW5qZWN0b3IsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgQWRtaW5TZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2FkbWluLW1vZHVsZS11dGlscyc7XG5pbXBvcnQgeyBBcHBCYXNlQ29tcG9uZW50IH0gZnJvbSAnQHBvc2l3aXNlL2FwcC1iYXNlLWNvbXBvbmVudCc7XG5pbXBvcnQge1xuICAgIEF1dGhTZXJ2aWNlLFxuICAgIEN1c3RvbVRvYXN0U2VydmljZSxcbiAgICBQZXJtaXNzaW9uU2VydmljZSxcbiAgICBQcm9kdWN0U2VydmljZSxcbiAgICBXaW5kb3dTZXJ2aWNlXG59IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tc2VydmljZXMnO1xuaW1wb3J0IHsgUEFHRV9TSVpFLCBQYWdpbmcsIFVzZXIgfSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXV0aWxpdGllcyc7XG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2hlbHBlci1zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkVmFsaWRhdGlvbkNvbXBvbmVudCB9IGZyb20gJ0Bwb3Npd2lzZS9zaGFyZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7IExhenlMb2FkRXZlbnQsIFNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUk9VVEVSUyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9yb3V0ZXJzL3JvdXRlcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3B3LWFkbWluLXVzZXItbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VzZXJzLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3VzZXJzLWxpc3QuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBVc2VyTGlzdENvbXBvbmVudFxuICAgIGV4dGVuZHMgQXBwQmFzZUNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWRcbntcbiAgICBAVmlld0NoaWxkKCdwYXNzd29yZFZhbGlkYXRpb25Nb2RhbEZvclVzZXJEZWxldGUnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgICBwYXNzd29yZFZhbGlkYXRpb25Nb2RhbEZvclVzZXJEZWxldGU6IFBhc3N3b3JkVmFsaWRhdGlvbkNvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCdwYXNzd29yZFZhbGlkYXRpb25Nb2RhbEZvckltcGVyc29uYXRlJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcGFzc3dvcmRWYWxpZGF0aW9uTW9kYWxGb3JJbXBlcnNvbmF0ZTogUGFzc3dvcmRWYWxpZGF0aW9uQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ3Bhc3N3b3JkVmFsaWRhdGlvbk1vZGFsRm9yUmVtb3ZlMmZhJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcGFzc3dvcmRWYWxpZGF0aW9uTW9kYWxGb3JSZW1vdmUyZmE6IFBhc3N3b3JkVmFsaWRhdGlvbkNvbXBvbmVudDtcblxuICAgIHByaXZhdGUgcGFnZSA9IDE7XG4gICAgcHJpdmF0ZSBmaWx0ZXJCeVByb2R1Y3RzID0gW107XG4gICAgcHJpdmF0ZSBmaWx0ZXJCeVJvbGVzID0gW107XG4gICAgcHJpdmF0ZSB1c2VyVG9EZWxldGU6IFVzZXI7XG5cbiAgICB0b3RhbFJlY29yZHM6IG51bWJlcjtcblxuICAgIHVzZXJzOiBVc2VyW10gPSBbXTtcbiAgICBhbGxSb2xlczogU2VsZWN0SXRlbVtdO1xuICAgIGFsbFVzZXJzOiBVc2VyW10gPSBbXTtcbiAgICBwcm9kdWN0TGlzdDogU2VsZWN0SXRlbVtdO1xuXG4gICAgbG9hZGluZyA9IHRydWU7XG4gICAgaXNMb2FkZWQgPSBmYWxzZTtcblxuICAgIHNlYXJjaE9wdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnUm9sZScsXG4gICAgICAgICAgICB2YWx1ZTogJ3JvbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnUHJvZHVjdCcsXG4gICAgICAgICAgICB2YWx1ZTogJ3Byb2R1Y3QnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnRmVhdHVyZSBLZXknLFxuICAgICAgICAgICAgdmFsdWU6ICdmZWF0dXJlX2tleSdcbiAgICAgICAgfVxuICAgIF07XG4gICAgc2VhcmNoVGV4dCA9ICcnO1xuXG4gICAgc2VhcmNoRGF0YVNvdXJjZSA9IFtdO1xuICAgIGZlYXR1cmVLZXlzTGlzdCA9IFtdO1xuICAgIGZpbHRlckJ5RmVhdHVyZUtleXMgPSBbXTtcbiAgICBmaWx0ZXJTb3VyY2U6IHN0cmluZ1tdO1xuICAgIGNyaXRlcmlhID0gW107XG5cbiAgICBzZWxlY3RlZE9wdGlvbjogU2VsZWN0SXRlbTtcbiAgICBjdXJyZW50VXNlcjogVXNlcjtcblxuICAgIHJvdXRlcnMgPSBST1VURVJTO1xuICAgIG1hc3RlclByb2R1Y3RJZCA9IHRoaXMuYXBwQ29uZmlnLm1hc3Rlcl9zdWJzY3JpcHRpb24ucHJvZHVjdF9pZDtcblxuICAgIHRvdGFsUmVjb3Jkc1VuRmlsdGVyZWQgPSAwO1xuXG4gICAgY2hhdFBlcm1pc3Npb246IHN0cmluZztcbiAgICB1c2VyVG9JbXBlcnNvbmF0ZTogVXNlcjtcblxuICAgIHN1YnNjcmlwdGlvbklkOiBudW1iZXI7XG4gICAgcmVtb3ZlMmZhVXNlcklkOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhZG1pblNlcnZpY2U6IEFkbWluU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0b2FzdGVyOiBDdXN0b21Ub2FzdFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjdFNlcnZpY2U6IFByb2R1Y3RTZXJ2aWNlLFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgd2luZG93U2VydmljZTogV2luZG93U2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcihpbmplY3Rvcik7XG4gICAgICAgIHRoaXMuZ2V0VGFibGVTdGF0ZSgpO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25JZCA9IFBlcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkU3Vic2NyaXB0aW9uPy5pZDtcbiAgICAgICAgdGhpcy5jaGF0UGVybWlzc2lvbiA9IGAke1Blcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkUHJvZHVjdC5wZXJtaXNzaW9ufS4ke1Blcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkUHJvZHVjdC5mZWF0dXJlX2tleX1gO1xuICAgICAgICB0aGlzLmdldFJvbGVzKCk7XG4gICAgICAgIHRoaXMuZ2V0UHJvZHVjdHMoKTtcbiAgICAgICAgdGhpcy51c2VyU3RvcmUoKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VXNlciA9IHJlc3BvbnNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRUYWJsZVN0YXRlKCkge1xuICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtJCgndXNlci1saXN0LXN0YXRlJykuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzID0gSlNPTi5wYXJzZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVNlYXJjaFRleHQocmVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVTZWxlY3RlZE9wdGlvbihyZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVNlYXJjaERhdGFTb3VyY2UocmVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVDcml0ZXJpYShyZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUZpbHRlcnMocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplU2VhcmNoVGV4dChyZXMpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gcmVzPy5zZWFyY2hUZXh0IHx8ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVNlbGVjdGVkT3B0aW9uKHJlcykge1xuICAgICAgICBpZiAocmVzPy5zZWxlY3RlZE9wdGlvbj8udmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSByZXM/LnNlbGVjdGVkT3B0aW9uO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJTb3VyY2UgPSBbdGhpcy5zZWxlY3RlZE9wdGlvbj8udmFsdWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplU2VhcmNoRGF0YVNvdXJjZShyZXMpIHtcbiAgICAgICAgaWYgKHJlcz8uc2VhcmNoRGF0YVNvdXJjZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERhdGFTb3VyY2UgPSByZXM/LnNlYXJjaERhdGFTb3VyY2UgfHwgW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVDcml0ZXJpYShyZXMpIHtcbiAgICAgICAgaWYgKHJlcz8uc2VsZWN0ZWRPcHRpb24/LnZhbHVlID09PSAnZmVhdHVyZV9rZXknKSB7XG4gICAgICAgICAgICB0aGlzLmNyaXRlcmlhID0gcmVzPy5maWx0ZXJCeUZlYXR1cmVLZXlzIHx8IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXM/LnNlbGVjdGVkT3B0aW9uPy52YWx1ZSA9PT0gJ3Byb2R1Y3QnKSB7XG4gICAgICAgICAgICB0aGlzLmNyaXRlcmlhID0gcmVzPy5maWx0ZXJCeVByb2R1Y3RzIHx8IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXM/LnNlbGVjdGVkT3B0aW9uPy52YWx1ZSA9PT0gJ3JvbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmNyaXRlcmlhID0gcmVzPy5maWx0ZXJCeVJvbGVzIHx8IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRmlsdGVycyhyZXMpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJCeUZlYXR1cmVLZXlzID0gcmVzPy5maWx0ZXJCeUZlYXR1cmVLZXlzIHx8IFtdO1xuICAgICAgICB0aGlzLmZpbHRlckJ5UHJvZHVjdHMgPSByZXM/LmZpbHRlckJ5UHJvZHVjdHMgfHwgW107XG4gICAgICAgIHRoaXMuZmlsdGVyQnlSb2xlcyA9IHJlcz8uZmlsdGVyQnlSb2xlcyB8fCBbXTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgb25MYXp5TG9hZChldmVudDogTGF6eUxvYWRFdmVudCkge1xuICAgICAgICBjb25zdCBwYWdlRGV0YWlscyA9IEhlbHBlclNlcnZpY2Uub25UYWJsZUxhenlMb2FkKGV2ZW50KTtcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZURldGFpbHMucGFnZTtcbiAgICAgICAgdGhpcy5nZXRVc2Vycyh7XG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRSxcbiAgICAgICAgICAgIG9yZGVyX2J5OiBwYWdlRGV0YWlscy5zb3J0RmllbGQsXG4gICAgICAgICAgICBvcmRlcl9kaXJlY3Rpb246IHBhZ2VEZXRhaWxzLnNvcnRPcmRlcixcbiAgICAgICAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hUZXh0XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFJvbGVzKCkge1xuICAgICAgICB0aGlzLmFkbWluU2VydmljZS5nZXRSb2xlcyh7fSwgdGhpcy5zdWJzY3JpcHRpb25JZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWxsUm9sZXMgPSByZXNwb25zZS5yb2xlcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0uaWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFByb2R1Y3RzKCkge1xuICAgICAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0UHJvZHVjdHMoe1xuICAgICAgICAgICAgICAgIG1hc3Rlcl9wcm9kdWN0X2lkOiB0aGlzLm1hc3RlclByb2R1Y3RJZCxcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25faWQ6IHRoaXMuc3Vic2NyaXB0aW9uSWRcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3AgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwLnByb2R1Y3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdExpc3QgPSByZXNwLnByb2R1Y3RzLm1hcChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGVsZW1lbnQubmFtZSB8fCAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZUtleXNMaXN0ID0gcmVzcC5wcm9kdWN0cy5tYXAoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbGVtZW50LmZlYXR1cmVfa2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlbGVtZW50LmZlYXR1cmVfa2V5IHx8ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RMaXN0LnVuc2hpZnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdOb25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFVzZXJzKHBhZ2luZzogUGFnaW5nKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgcHJvZHVjdF9pZHM6IHRoaXMuZmlsdGVyQnlQcm9kdWN0cy5qb2luKCkgfHwgJycsXG4gICAgICAgICAgICByb2xlX2lkczogdGhpcy5maWx0ZXJCeVJvbGVzLmpvaW4oKSB8fCAnJyxcbiAgICAgICAgICAgIGZlYXR1cmVfa2V5czogdGhpcy5maWx0ZXJCeUZlYXR1cmVLZXlzLmpvaW4oKSB8fCAnJyxcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5zdWJzY3JpcHRpb25JZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkbWluU2VydmljZS5nZXRVc2VycyhwYWdpbmcsIHBhcmFtcykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMudXNlcnMgPSByZXNwb25zZS51c2VycztcbiAgICAgICAgICAgIHRoaXMuYWxsVXNlcnMgPSBbLi4udGhpcy51c2Vyc107XG4gICAgICAgICAgICB0aGlzLnRvdGFsUmVjb3JkcyA9IHJlc3BvbnNlLm9iamVjdF9jb3VudDtcbiAgICAgICAgICAgIHRoaXMudG90YWxSZWNvcmRzVW5GaWx0ZXJlZCA9IHJlc3BvbnNlPy51bmZpbHRlcmVkX2NvdW50O1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uU2VhcmNoT3B0aW9uQ2hhbmdlKCRldmVudCkge1xuICAgICAgICB0aGlzLmNyaXRlcmlhID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSB0aGlzLnNlYXJjaE9wdGlvbnMuZmluZCh4ID0+IHgudmFsdWUgPT09ICRldmVudC52YWx1ZVswXSk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkT3B0aW9uICYmIHRoaXMuc2VsZWN0ZWRPcHRpb24udmFsdWUgPT09ICdyb2xlJykge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hEYXRhU291cmNlID0gdGhpcy5hbGxSb2xlcztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkT3B0aW9uICYmIHRoaXMuc2VsZWN0ZWRPcHRpb24udmFsdWUgPT09ICdwcm9kdWN0Jykge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hEYXRhU291cmNlID0gdGhpcy5wcm9kdWN0TGlzdDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkT3B0aW9uICYmIHRoaXMuc2VsZWN0ZWRPcHRpb24udmFsdWUgPT09ICdmZWF0dXJlX2tleScpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRGF0YVNvdXJjZSA9IHRoaXMuZmVhdHVyZUtleXNMaXN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hEYXRhU291cmNlID0gW107XG4gICAgICAgICAgICB0aGlzLmNsZWFyRmlsdGVycygpO1xuICAgICAgICAgICAgdGhpcy5nZXRVc2Vycyh7XG4gICAgICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjbGVhckZpbHRlcnMoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyQnlQcm9kdWN0cyA9IFtdO1xuICAgICAgICB0aGlzLmZpbHRlckJ5RmVhdHVyZUtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5maWx0ZXJCeVJvbGVzID0gW107XG4gICAgfVxuICAgIG9uU2VhcmNoQ3JpdGVyaWEoZXZ0KSB7XG4gICAgICAgIHRoaXMuY2xlYXJGaWx0ZXJzKCk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkT3B0aW9uLnZhbHVlID09PSAncm9sZScpIHtcbiAgICAgICAgICAgIHRoaXMub25Sb2xlQ2hhbmdlKGV2dCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZE9wdGlvbi52YWx1ZSA9PT0gJ3Byb2R1Y3QnKSB7XG4gICAgICAgICAgICB0aGlzLm9uUHJvZHVjdENoYW5nZShldnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRPcHRpb24udmFsdWUgPT09ICdmZWF0dXJlX2tleScpIHtcbiAgICAgICAgICAgIHRoaXMub25GZWF0dXJlS2V5Q2hhbmdlKGV2dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERhdGFTb3VyY2UgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblJvbGVDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5jbGVhckZpbHRlcnMoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJCeVJvbGVzID0gZXZlbnQudmFsdWU7XG4gICAgICAgIHRoaXMuZ2V0VXNlcnMoe1xuICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uUHJvZHVjdENoYW5nZShldmVudCkge1xuICAgICAgICB0aGlzLmNsZWFyRmlsdGVycygpO1xuICAgICAgICB0aGlzLmZpbHRlckJ5UHJvZHVjdHMgPSBldmVudC52YWx1ZTtcbiAgICAgICAgdGhpcy5nZXRVc2Vycyh7XG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBvbkZlYXR1cmVLZXlDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5jbGVhckZpbHRlcnMoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJCeUZlYXR1cmVLZXlzID0gZXZlbnQudmFsdWU7XG4gICAgICAgIHRoaXMuZ2V0VXNlcnMoe1xuICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uRGVsZXRlKHVzZXI6IFVzZXIpIHtcbiAgICAgICAgdGhpcy51c2VyVG9EZWxldGUgPSB1c2VyO1xuICAgICAgICB0aGlzLnBhc3N3b3JkVmFsaWRhdGlvbk1vZGFsRm9yVXNlckRlbGV0ZS5vcGVuKCk7XG4gICAgfVxuICAgIGRlbGV0ZVVzZXIoX2V2ZW50KSB7XG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlXG4gICAgICAgICAgICAuZGVsZXRlVXNlcih0aGlzLnVzZXJUb0RlbGV0ZS5pZCwgdGhpcy5zdWJzY3JpcHRpb25JZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlcnMgPSB0aGlzLnVzZXJzLmZpbHRlcih4ID0+IHguaWQgIT09IHRoaXMudXNlclRvRGVsZXRlLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ZXIuc3VjY2Vzcyh0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgnQWRtaW4uVXNlcnMuRGVsZXRlZE1lc3NhZ2UnKSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmdldFVzZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRSxcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaFRleHRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJUb0RlbGV0ZSA9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgb25JbXBlcnNvbmF0ZSh1c2VyOiBVc2VyKSB7XG4gICAgICAgIHRoaXMudXNlclRvSW1wZXJzb25hdGUgPSB1c2VyO1xuICAgICAgICB0aGlzLnBhc3N3b3JkVmFsaWRhdGlvbk1vZGFsRm9ySW1wZXJzb25hdGUub3BlbigpO1xuICAgIH1cbiAgICBvblVzZXJJbXBlcnNvbmF0aW9uKF9ldmVudCkge1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLnBsYXRmb3JtJC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBsYXRmb3JtID0gcmVzO1xuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgICAgICAgICAgIC5pbXBlcnNvbmF0ZVVzZXIoe1xuICAgICAgICAgICAgICAgICAgICBlbWFpbDogdGhpcy51c2VyVG9JbXBlcnNvbmF0ZS5lbWFpbCxcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uX2lkOiBQZXJtaXNzaW9uU2VydmljZS5zZWxlY3RlZFN1YnNjcmlwdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgcGhvbmVnYXA6IHBsYXRmb3JtICE9PSAnYnJvd3NlcidcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhgWW91J3JlIG5vdyBiZWluZyBsb2dnZWQgaW4gYXMgYW5vdGhlciB1c2VyLi4uYCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIDIgc2VjIGJlZm9yZSByZWRpcmVjdGluZyB1c2VyIHRvIGhvbWUgcGFnZVxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2luZG93U2VydmljZS5yZXBsYWNlVXJsKCcvaG9tZScpO1xuICAgICAgICAgICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgICAgICBjb25zdCB2YWwgPSB7XG4gICAgICAgICAgICBzZWFyY2hUZXh0OiB0aGlzLnNlYXJjaFRleHQsXG4gICAgICAgICAgICBmaWx0ZXJCeUZlYXR1cmVLZXlzOiB0aGlzLmZpbHRlckJ5RmVhdHVyZUtleXMsXG4gICAgICAgICAgICBmaWx0ZXJCeVJvbGVzOiB0aGlzLmZpbHRlckJ5Um9sZXMsXG4gICAgICAgICAgICBmaWx0ZXJCeVByb2R1Y3RzOiB0aGlzLmZpbHRlckJ5UHJvZHVjdHMsXG4gICAgICAgICAgICBzZWxlY3RlZE9wdGlvbjogdGhpcy5zZWxlY3RlZE9wdGlvbixcbiAgICAgICAgICAgIHNlYXJjaERhdGFTb3VyY2U6IHRoaXMuc2VhcmNoRGF0YVNvdXJjZVxuICAgICAgICB9O1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndXNlci1saXN0LXN0YXRlJywgSlNPTi5zdHJpbmdpZnkodmFsKSk7XG4gICAgICAgIGNvbnN0IG5vdGlmaWVyID0gbmV3IFN1YmplY3QoKTtcbiAgICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUodGFrZVVudGlsKG5vdGlmaWVyKSkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLmluY2x1ZGVzKCcvdXNlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0kKCd1c2VyLWxpc3Qtc3RhdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpZXIubmV4dCgnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG4gICAgZGlzYWJsZTJmYShpZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlMmZhVXNlcklkID0gaWQ7XG4gICAgICAgIHRoaXMucGFzc3dvcmRWYWxpZGF0aW9uTW9kYWxGb3JSZW1vdmUyZmEub3BlbigpO1xuICAgIH1cbiAgICByZW1vdmUyZmEoX2V2ZW50KSB7XG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlLnJlbW92ZTJmYSh0aGlzLnJlbW92ZTJmYVVzZXJJZCwgdGhpcy5zdWJzY3JpcHRpb25JZCkuc3Vic2NyaWJlKCk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInJvd1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sLTEyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICA8aDIgY2xhc3M9XCJjYXJkLXRpdGxlIHAtMCBmbG9hdC1zdGFydFwiPlVzZXJzPC9oMj5cbiAgICA8YSBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBmbG9hdC1lbmRcIlxuICAgICAgaWQ9XCJidG4tY3JlYXRlXCJcbiAgICAgICpyYmFjQWxsb3c9XCInU3VwZXJBZG1pbidcIlxuICAgICAgW3JvdXRlckxpbmtdPVwiW3JvdXRlcnMudXNlcnNEZXRhaWxzICsgJ2FkZCddXCI+XG4gICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiBDcmVhdGUgVXNlclxuICAgIDwvYT5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCI+XG4gIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhaXNMb2FkZWRcIj5cbiAgICA8cC1wcm9ncmVzc1NwaW5uZXI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJwcmltZW5nLWRhdGF0YWJsZS1jb250YWluZXIgbXQtMFwiIFtjbGFzcy5oaWRlVGFibGVdPVwidG90YWxSZWNvcmRzVW5GaWx0ZXJlZCA9PT0gMFwiPlxuICA8ZGl2IGNsYXNzPVwidXNlci1tYW5hZ2VtZW50LXRhYmxlIHRhYmxlLXJlc3BvbnNpdmVcIj5cbiAgICA8cC10YWJsZSAjZHRcbiAgICAgIFt2YWx1ZV09XCJ1c2Vyc1wiXG4gICAgICBbcGFnaW5hdG9yXT1cInRvdGFsUmVjb3JkcyAhPT0gMFwiXG4gICAgICBbbGF6eV09XCJ0cnVlXCJcbiAgICAgIFtyb3dzXT1cIlBBR0VfU0laRVwiXG4gICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3Jkc1wiXG4gICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICAgIFtmaWx0ZXJEZWxheV09XCIxMDAwXCJcbiAgICAgIChvbkxhenlMb2FkKT1cIm9uTGF6eUxvYWQoJGV2ZW50KVwiXG4gICAgICBbY3VzdG9tU29ydF09XCJ0cnVlXCI+XG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWZpbHRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxuICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgW29wdGlvbnNdPVwic2VhcmNoT3B0aW9uc1wiXG4gICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvblNlYXJjaE9wdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgdXNlcnMgYnkgcm9sZSwgcHJvZHVjdCwgb3IgZmVhdHVyZVwiXG4gICAgICAgICAgICAgIFtzZWxlY3Rpb25MaW1pdF09XCIxXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJTb3VyY2VcIlxuICAgICAgICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiPlxuICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiXG4gICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkT3B0aW9uXCI+XG4gICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBbb3B0aW9uc109XCJzZWFyY2hEYXRhU291cmNlXCJcbiAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uU2VhcmNoQ3JpdGVyaWEoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cInRydWVcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNyaXRlcmlhXCJcbiAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IHt7IHNlbGVjdGVkT3B0aW9uLnZhbHVlIH19c1wiXG4gICAgICAgICAgICAgIG1heFNlbGVjdGVkTGFiZWxzPVwiMlwiXG4gICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiPlxuICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2ggbXQtMiBtZS0yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCJcbiAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICBzaXplPVwiNTBcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBVc2VyLi4uXCJcbiAgICAgICAgICAgICAgZGF0YS1jeT1cInVzZXItc2VhcmNoXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cImR0LmZpbHRlckdsb2JhbCgkZXZlbnQudGFyZ2V0LnZhbHVlLCAnY29udGFpbnMnKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwid2QtOTBcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImlkXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uVXNlcnMuSWQnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cImlkXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJmaXJzdF9uYW1lXCI+XG4gICAgICAgICAgICB7eyAnTGFiZWwuRmlyc3ROYW1lJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJmaXJzdF9uYW1lXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJsYXN0X25hbWVcIj5cbiAgICAgICAgICAgIHt7ICdMYWJlbC5MYXN0TmFtZScgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwibGFzdF9uYW1lXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJlbWFpbFwiPlxuICAgICAgICAgICAge3sgJ0xhYmVsLkVtYWlsJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJlbWFpbFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwic2x1Z1wiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlVzZXJzLlNsdWcnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cInNsdWdcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImVuY3J5cHRlZF9wYXNzd29yZFwiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlVzZXJzLkVtYWlsQ29uZmlybScgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwiZW5jcnlwdGVkX3Bhc3N3b3JkXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cInNlc3Npb25zX2xhc3RfbW9udGhcIj5cbiAgICAgICAgICAgIHt7ICdBZG1pbi5TdWJzY3JpcHRpb25zLlNlc3Npb25zVG90YWxMYXN0TW9udGgnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cInNlc3Npb25zX2xhc3RfbW9udGhcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImxhc3Rfc2lnbl9pbl9hdFwiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlVzZXJzLkxhc3RMb2dpbicgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwibGFzdF9zaWduX2luX2F0XCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJzaWduZWRfdXBfYXRcIj5cbiAgICAgICAgICAgIHt7ICdBZG1pbi5Vc2Vycy5SZWdpc3RlcmVkT24nIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cInNpZ25lZF91cF9hdFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb25zLWxpc3QtZm91clwiPlxuICAgICAgICAgICAge3sgJ0xhYmVsLkFjdGlvbnMnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiXG4gICAgICAgIGxldC11c2VyPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cImlkXCI+IHt7IHVzZXIuaWQgfX08L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJGaXJzdCBOYW1lXCI+PGEgW3JvdXRlckxpbmtdPVwiWycvbWVtYmVycycsIHVzZXIuc2x1Z11cIj57eyB1c2VyLmZpcnN0X25hbWUgfX08L2E+PC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiTGFzdCBOYW1lXCI+e3sgdXNlci5sYXN0X25hbWUgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidXNlcj8uYWxwaGFcIlxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ0FkbWluLlVzZXJzLlRvb2x0aXAuQWxwaGFJY29uJ3x0cmFuc2xvY29cIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1yZWd1bGFyIGZhLXNxdWFyZS1hIGFscGhhLWJldGEgdGV4dC13YXJuaW5nXCI+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ1c2VyPy5iZXRhXCJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidBZG1pbi5Vc2Vycy5Ub29sdGlwLkJldGFJY29uJ3x0cmFuc2xvY29cIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1yZWd1bGFyIGZhLXNxdWFyZS1iIGFscGhhLWJldGEgdGV4dC1wcmltYXJ5XCIgPjwvaT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJFbWFpbFwiPnt7IHVzZXIuZW1haWwgfX08L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJTbHVnXCI+e3sgdXNlci5zbHVnIH19PC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiRW1haWwgQ29uZmlybVwiPlxuICAgICAgICAgICAgPHNwYW4gW2FwcER5bmFtaWNCYWRnZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQXJyYXk6IFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IHVzZXI/Lmhhc19wYXNzd29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICBjb2xvcj1cInN1Y2Nlc3MtZGFuZ2VyXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJiYWRnZVwiPnt7IHVzZXI/Lmhhc19wYXNzd29yZCA/ICdZZXMnIDogJ05vJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCIgKm5nSWY9XCJ1c2VyPy5ibG9ja2VkXCIgW3BUb29sdGlwXT1cIidUaGlzIHVzZXIgaGFzIGJlZW4gYmxvY2tlZCdcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLWhleGFnb24tZXhjbGFtYXRpb24gdGV4dC1kYW5nZXIgaGV4YS13YXJuaW5nXCI+PC9pPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiUy9tICNcIj5cbiAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWRhbmdlciBmdy1ib2xkJzogdXNlcj8uc2Vzc2lvbnNfbGFzdF9tb250aCA8IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPnt7IHVzZXI/LnNlc3Npb25zX2xhc3RfbW9udGggfX08L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiTGFzdCBMb2dpblwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ1c2VyPy5jdXJyZW50X3NpZ25faW5fYXQ7ZWxzZSBsYXN0U2lnbmluXCI+XG4gICAgICAgICAgICAgIHt7IHVzZXIuY3VycmVudF9zaWduX2luX2F0ICB8IGRhdGVGb3JtYXQgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGFzdFNpZ25pbj5cbiAgICAgICAgICAgICAge3sgdXNlci5sYXN0X3NpZ25faW5fYXQgfCBkYXRlRm9ybWF0IH19XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIlJlZ2lzdGVyZWQgT25cIj57eyB1c2VyLnNpZ25lZF91cF9hdCB8IGRhdGVGb3JtYXQgfX08L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY3Rpb25cIj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgbGlzdC1pbmxpbmUgbGlzdC1hY3Rpb25cIj5cbiAgICAgICAgICAgICAgPGxpIG5nYlRvb2x0aXA9XCJJbXBlcnNvbmF0ZSB0aGlzIHVzZXJcIlxuICAgICAgICAgICAgICAgICpyYmFjQWxsb3c9XCInUGFnZXMuQWxwaGEnXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1lLTIgbWUtc20tM1wiPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtcGVvcGxlLWFycm93cyBmYS1sZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSW1wZXJzb25hdGUodXNlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uSW1wZXJzb25hdGUodXNlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwidXNlcj8uZW5hYmxlX3R3b19mYWN0b3JfYXV0aGVudGljYXRvclwiPlxuICAgICAgICAgICAgICAgIDxsaSBuZ2JUb29sdGlwPVwiRGlzYWJsZSAyZmFcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRpc2FibGUyZmEodXNlcj8uaWQpXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImRpc2FibGUyZmEodXNlcj8uaWQpXCJcbiAgICAgICAgICAgICAgICAgICpyYmFjQWxsb3c9XCInUGFnZXMuQWxwaGEnXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxvY2sgZmEtbGcgd2FybmluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiY3VycmVudFVzZXIgJiYgdXNlci5pZCAhPT0gY3VycmVudFVzZXIuaWRcIj5cbiAgICAgICAgICAgICAgICA8bGkgbmdiVG9vbHRpcD1cIk1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgKnJiYWNBbGxvdz1cImNoYXRQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCJcbiAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL21lc3NhZ2UnXVwiXG4gICAgICAgICAgICAgICAgICBbZnJhZ21lbnRdPVwidXNlci5zbHVnXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNvbW1lbnRzIGN0YTEtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bGkgbmdiVG9vbHRpcD1cIkVkaXRcIlxuICAgICAgICAgICAgICAgICpyYmFjQWxsb3c9XCInUGFnZXMuQWRtaW4uVXNlcnMuRWRpdCdcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCJcbiAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbcm91dGVycy51c2Vyc0RldGFpbHMgKyB1c2VyLmlkXVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWRpdCBlZGl0LWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSBuZ2JUb29sdGlwPVwiRGVsZXRlXCJcbiAgICAgICAgICAgICAgICAqcmJhY0FsbG93PVwiJ1BhZ2VzLkFkbWluLlVzZXJzLkRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCI+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2ggZGVsZXRlLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25EZWxldGUodXNlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwib25EZWxldGUodXNlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlKHVzZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvcC10YWJsZT5cbiAgICA8ZGl2ICpuZ0lmPVwidG90YWxSZWNvcmRzID09PSAwICYmIHRvdGFsUmVjb3Jkc1VuRmlsdGVyZWQgIT09IDBcIj5cbiAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidTZWFyY2guTm9EYXRhTWVzc2FnZScgfCB0cmFuc2xvY29cIiBbZGVzY3JpcHRpb25dPVwiJ1NlYXJjaC5Ob0RhdGFEZXNjcmlwdGlvbicgfCB0cmFuc2xvY29cIj5cbiAgICAgIDwvcHctbm8tZGF0YT5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXJlY29yZHMtY291bnRcIiAqbmdJZj1cInRvdGFsUmVjb3JkcyAhPT0gMFwiPnt7ICdMYWJlbC5Ub3RhbCcgfCB0cmFuc2xvY28gfX06IHt7IHRvdGFsUmVjb3JkcyB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiB0b3RhbFJlY29yZHNVbkZpbHRlcmVkID09PSAwXCI+XG4gIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidBZG1pbi5Vc2Vycy5Ob0RhdGFNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPiA8L3B3LW5vLWRhdGE+XG48L2Rpdj5cbjwhLS0gcGFzc3dvcmQgdmFsaWRhdGlvbiBtb2RhbCBmb3IgZGVsZXRlIHVzZXIgLS0+XG48cHctcGFzc3dvcmQtdmFsaWRhdGlvbiAjcGFzc3dvcmRWYWxpZGF0aW9uTW9kYWxGb3JVc2VyRGVsZXRlXG4gIChzdWNjZXNzRXZlbnQpPVwiZGVsZXRlVXNlcigkZXZlbnQpXCI+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICA8cD57eyAnVXNlci5BY2NvdW50Lk1lc3NhZ2UuQWN0aW9uQ2FuTm90VW5kb25lJyB8IHRyYW5zbG9jbyB9fTwvcD5cbiAgICAgIDxwPnt7ICdVc2VyLkFjY291bnQuTWVzc2FnZS5Db25maXJtUGFzc3dvcmQnIHwgdHJhbnNsb2NvIH19PC9wPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvcHctcGFzc3dvcmQtdmFsaWRhdGlvbj5cbjwhLS0gcGFzc3dvcmQgdmFsaWRhdGlvbiBtb2RhbCBmb3IgaW1wZXJzb25hdGUgLS0+XG48cHctcGFzc3dvcmQtdmFsaWRhdGlvbiAjcGFzc3dvcmRWYWxpZGF0aW9uTW9kYWxGb3JJbXBlcnNvbmF0ZVxuICAoc3VjY2Vzc0V2ZW50KT1cIm9uVXNlckltcGVyc29uYXRpb24oJGV2ZW50KVwiPlxuPC9wdy1wYXNzd29yZC12YWxpZGF0aW9uPlxuPCEtLSBwYXNzd29yZCB2YWxpZGF0aW9uIG1vZGFsIGZvciByZW1vdmUyZmEgLS0+XG48cHctcGFzc3dvcmQtdmFsaWRhdGlvbiAjcGFzc3dvcmRWYWxpZGF0aW9uTW9kYWxGb3JSZW1vdmUyZmFcbiAgKHN1Y2Nlc3NFdmVudCk9XCJyZW1vdmUyZmEoJGV2ZW50KVwiPlxuPC9wdy1wYXNzd29yZC12YWxpZGF0aW9uPlxuIl19
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnMtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FkbWluLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvdXNlcnMvdXNlcnMtbGlzdC91c2Vycy1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYWRtaW4tbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy91c2Vycy91c2Vycy1saXN0L3VzZXJzLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUdSLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFDSCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsYUFBYSxFQUNoQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRzFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTzFELE1BQU0sT0FBTyxpQkFDVCxTQUFRLGdCQUFnQjtJQTZEeEIsWUFDcUIsWUFBMEIsRUFD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U0FBUyxDQUFDLE1BQU07UUFDWixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN2RixDQUFDOytHQTFVUSxpQkFBaUI7bUdBQWpCLGlCQUFpQiw2Z0JDbEM5QixxOVVBcVBBOzs0RkRuTmEsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNJLG9CQUFvQjs0UEFTOUIsb0NBQW9DO3NCQURuQyxTQUFTO3VCQUFDLHNDQUFzQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHcEUscUNBQXFDO3NCQURwQyxTQUFTO3VCQUFDLHVDQUF1QyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHckUsbUNBQW1DO3NCQURsQyxTQUFTO3VCQUFDLHFDQUFxQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgSW5qZWN0b3IsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgQWRtaW5TZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2FkbWluLW1vZHVsZS11dGlscyc7XG5pbXBvcnQgeyBBcHBCYXNlQ29tcG9uZW50IH0gZnJvbSAnQHBvc2l3aXNlL2FwcC1iYXNlLWNvbXBvbmVudCc7XG5pbXBvcnQge1xuICAgIEF1dGhTZXJ2aWNlLFxuICAgIEN1c3RvbVRvYXN0U2VydmljZSxcbiAgICBQZXJtaXNzaW9uU2VydmljZSxcbiAgICBQcm9kdWN0U2VydmljZSxcbiAgICBXaW5kb3dTZXJ2aWNlXG59IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tc2VydmljZXMnO1xuaW1wb3J0IHsgUEFHRV9TSVpFLCBQYWdpbmcsIFVzZXIgfSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXV0aWxpdGllcyc7XG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2hlbHBlci1zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkVmFsaWRhdGlvbkNvbXBvbmVudCB9IGZyb20gJ0Bwb3Npd2lzZS9zaGFyZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7IExhenlMb2FkRXZlbnQsIFNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUk9VVEVSUyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9yb3V0ZXJzL3JvdXRlcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3B3LWFkbWluLXVzZXItbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VzZXJzLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3VzZXJzLWxpc3QuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBVc2VyTGlzdENvbXBvbmVudFxuICAgIGV4dGVuZHMgQXBwQmFzZUNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWRcbntcbiAgICBAVmlld0NoaWxkKCdwYXNzd29yZFZhbGlkYXRpb25Nb2RhbEZvclVzZXJEZWxldGUnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgICBwYXNzd29yZFZhbGlkYXRpb25Nb2RhbEZvclVzZXJEZWxldGU6IFBhc3N3b3JkVmFsaWRhdGlvbkNvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCdwYXNzd29yZFZhbGlkYXRpb25Nb2RhbEZvckltcGVyc29uYXRlJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcGFzc3dvcmRWYWxpZGF0aW9uTW9kYWxGb3JJbXBlcnNvbmF0ZTogUGFzc3dvcmRWYWxpZGF0aW9uQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ3Bhc3N3b3JkVmFsaWRhdGlvbk1vZGFsRm9yUmVtb3ZlMmZhJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcGFzc3dvcmRWYWxpZGF0aW9uTW9kYWxGb3JSZW1vdmUyZmE6IFBhc3N3b3JkVmFsaWRhdGlvbkNvbXBvbmVudDtcblxuICAgIHByaXZhdGUgcGFnZSA9IDE7XG4gICAgcHJpdmF0ZSBmaWx0ZXJCeVByb2R1Y3RzID0gW107XG4gICAgcHJpdmF0ZSBmaWx0ZXJCeVJvbGVzID0gW107XG4gICAgcHJpdmF0ZSB1c2VyVG9EZWxldGU6IFVzZXI7XG5cbiAgICB0b3RhbFJlY29yZHM6IG51bWJlcjtcblxuICAgIHVzZXJzOiBVc2VyW10gPSBbXTtcbiAgICBhbGxSb2xlczogU2VsZWN0SXRlbVtdO1xuICAgIGFsbFVzZXJzOiBVc2VyW10gPSBbXTtcbiAgICBwcm9kdWN0TGlzdDogU2VsZWN0SXRlbVtdO1xuXG4gICAgbG9hZGluZyA9IHRydWU7XG4gICAgaXNMb2FkZWQgPSBmYWxzZTtcblxuICAgIHNlYXJjaE9wdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnUm9sZScsXG4gICAgICAgICAgICB2YWx1ZTogJ3JvbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnUHJvZHVjdCcsXG4gICAgICAgICAgICB2YWx1ZTogJ3Byb2R1Y3QnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnRmVhdHVyZSBLZXknLFxuICAgICAgICAgICAgdmFsdWU6ICdmZWF0dXJlX2tleSdcbiAgICAgICAgfVxuICAgIF07XG4gICAgc2VhcmNoVGV4dCA9ICcnO1xuXG4gICAgc2VhcmNoRGF0YVNvdXJjZSA9IFtdO1xuICAgIGZlYXR1cmVLZXlzTGlzdCA9IFtdO1xuICAgIGZpbHRlckJ5RmVhdHVyZUtleXMgPSBbXTtcbiAgICBmaWx0ZXJTb3VyY2U6IHN0cmluZ1tdO1xuICAgIGNyaXRlcmlhID0gW107XG5cbiAgICBzZWxlY3RlZE9wdGlvbjogU2VsZWN0SXRlbTtcbiAgICBjdXJyZW50VXNlcjogVXNlcjtcblxuICAgIHJvdXRlcnMgPSBST1VURVJTO1xuICAgIG1hc3RlclByb2R1Y3RJZCA9IHRoaXMuYXBwQ29uZmlnLm1hc3Rlcl9zdWJzY3JpcHRpb24ucHJvZHVjdF9pZDtcblxuICAgIHRvdGFsUmVjb3Jkc1VuRmlsdGVyZWQgPSAwO1xuXG4gICAgY2hhdFBlcm1pc3Npb246IHN0cmluZztcbiAgICB1c2VyVG9JbXBlcnNvbmF0ZTogVXNlcjtcblxuICAgIHN1YnNjcmlwdGlvbklkOiBudW1iZXI7XG4gICAgcmVtb3ZlMmZhVXNlcklkOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhZG1pblNlcnZpY2U6IEFkbWluU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0b2FzdGVyOiBDdXN0b21Ub2FzdFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjdFNlcnZpY2U6IFByb2R1Y3RTZXJ2aWNlLFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgd2luZG93U2VydmljZTogV2luZG93U2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcihpbmplY3Rvcik7XG4gICAgICAgIHRoaXMuZ2V0VGFibGVTdGF0ZSgpO1xuICAgIH1cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25JZCA9IFBlcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkU3Vic2NyaXB0aW9uPy5pZDtcbiAgICAgICAgdGhpcy5jaGF0UGVybWlzc2lvbiA9IGAke1Blcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkUHJvZHVjdC5wZXJtaXNzaW9ufS4ke1Blcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkUHJvZHVjdC5mZWF0dXJlX2tleX1gO1xuICAgICAgICB0aGlzLmdldFJvbGVzKCk7XG4gICAgICAgIHRoaXMuZ2V0UHJvZHVjdHMoKTtcbiAgICAgICAgdGhpcy51c2VyU3RvcmUoKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VXNlciA9IHJlc3BvbnNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRUYWJsZVN0YXRlKCkge1xuICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtJCgndXNlci1saXN0LXN0YXRlJykuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzID0gSlNPTi5wYXJzZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVNlYXJjaFRleHQocmVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVTZWxlY3RlZE9wdGlvbihyZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVNlYXJjaERhdGFTb3VyY2UocmVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVDcml0ZXJpYShyZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUZpbHRlcnMocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplU2VhcmNoVGV4dChyZXMpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gcmVzPy5zZWFyY2hUZXh0IHx8ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVNlbGVjdGVkT3B0aW9uKHJlcykge1xuICAgICAgICBpZiAocmVzPy5zZWxlY3RlZE9wdGlvbj8udmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSByZXM/LnNlbGVjdGVkT3B0aW9uO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJTb3VyY2UgPSBbdGhpcy5zZWxlY3RlZE9wdGlvbj8udmFsdWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplU2VhcmNoRGF0YVNvdXJjZShyZXMpIHtcbiAgICAgICAgaWYgKHJlcz8uc2VhcmNoRGF0YVNvdXJjZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERhdGFTb3VyY2UgPSByZXM/LnNlYXJjaERhdGFTb3VyY2UgfHwgW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVDcml0ZXJpYShyZXMpIHtcbiAgICAgICAgaWYgKHJlcz8uc2VsZWN0ZWRPcHRpb24/LnZhbHVlID09PSAnZmVhdHVyZV9rZXknKSB7XG4gICAgICAgICAgICB0aGlzLmNyaXRlcmlhID0gcmVzPy5maWx0ZXJCeUZlYXR1cmVLZXlzIHx8IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXM/LnNlbGVjdGVkT3B0aW9uPy52YWx1ZSA9PT0gJ3Byb2R1Y3QnKSB7XG4gICAgICAgICAgICB0aGlzLmNyaXRlcmlhID0gcmVzPy5maWx0ZXJCeVByb2R1Y3RzIHx8IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXM/LnNlbGVjdGVkT3B0aW9uPy52YWx1ZSA9PT0gJ3JvbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmNyaXRlcmlhID0gcmVzPy5maWx0ZXJCeVJvbGVzIHx8IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRmlsdGVycyhyZXMpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJCeUZlYXR1cmVLZXlzID0gcmVzPy5maWx0ZXJCeUZlYXR1cmVLZXlzIHx8IFtdO1xuICAgICAgICB0aGlzLmZpbHRlckJ5UHJvZHVjdHMgPSByZXM/LmZpbHRlckJ5UHJvZHVjdHMgfHwgW107XG4gICAgICAgIHRoaXMuZmlsdGVyQnlSb2xlcyA9IHJlcz8uZmlsdGVyQnlSb2xlcyB8fCBbXTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgb25MYXp5TG9hZChldmVudDogTGF6eUxvYWRFdmVudCkge1xuICAgICAgICBjb25zdCBwYWdlRGV0YWlscyA9IEhlbHBlclNlcnZpY2Uub25UYWJsZUxhenlMb2FkKGV2ZW50KTtcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZURldGFpbHMucGFnZTtcbiAgICAgICAgdGhpcy5nZXRVc2Vycyh7XG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRSxcbiAgICAgICAgICAgIG9yZGVyX2J5OiBwYWdlRGV0YWlscy5zb3J0RmllbGQsXG4gICAgICAgICAgICBvcmRlcl9kaXJlY3Rpb246IHBhZ2VEZXRhaWxzLnNvcnRPcmRlcixcbiAgICAgICAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hUZXh0XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFJvbGVzKCkge1xuICAgICAgICB0aGlzLmFkbWluU2VydmljZS5nZXRSb2xlcyh7fSwgdGhpcy5zdWJzY3JpcHRpb25JZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWxsUm9sZXMgPSByZXNwb25zZS5yb2xlcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0uaWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFByb2R1Y3RzKCkge1xuICAgICAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0UHJvZHVjdHMoe1xuICAgICAgICAgICAgICAgIG1hc3Rlcl9wcm9kdWN0X2lkOiB0aGlzLm1hc3RlclByb2R1Y3RJZCxcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25faWQ6IHRoaXMuc3Vic2NyaXB0aW9uSWRcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3AgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwLnByb2R1Y3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdExpc3QgPSByZXNwLnByb2R1Y3RzLm1hcChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGVsZW1lbnQubmFtZSB8fCAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZUtleXNMaXN0ID0gcmVzcC5wcm9kdWN0cy5tYXAoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbGVtZW50LmZlYXR1cmVfa2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlbGVtZW50LmZlYXR1cmVfa2V5IHx8ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RMaXN0LnVuc2hpZnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdOb25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFVzZXJzKHBhZ2luZzogUGFnaW5nKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgcHJvZHVjdF9pZHM6IHRoaXMuZmlsdGVyQnlQcm9kdWN0cy5qb2luKCkgfHwgJycsXG4gICAgICAgICAgICByb2xlX2lkczogdGhpcy5maWx0ZXJCeVJvbGVzLmpvaW4oKSB8fCAnJyxcbiAgICAgICAgICAgIGZlYXR1cmVfa2V5czogdGhpcy5maWx0ZXJCeUZlYXR1cmVLZXlzLmpvaW4oKSB8fCAnJyxcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5zdWJzY3JpcHRpb25JZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkbWluU2VydmljZS5nZXRVc2VycyhwYWdpbmcsIHBhcmFtcykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMudXNlcnMgPSByZXNwb25zZS51c2VycztcbiAgICAgICAgICAgIHRoaXMuYWxsVXNlcnMgPSBbLi4udGhpcy51c2Vyc107XG4gICAgICAgICAgICB0aGlzLnRvdGFsUmVjb3JkcyA9IHJlc3BvbnNlLm9iamVjdF9jb3VudDtcbiAgICAgICAgICAgIHRoaXMudG90YWxSZWNvcmRzVW5GaWx0ZXJlZCA9IHJlc3BvbnNlPy51bmZpbHRlcmVkX2NvdW50O1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uU2VhcmNoT3B0aW9uQ2hhbmdlKCRldmVudCkge1xuICAgICAgICB0aGlzLmNyaXRlcmlhID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb24gPSB0aGlzLnNlYXJjaE9wdGlvbnMuZmluZCh4ID0+IHgudmFsdWUgPT09ICRldmVudC52YWx1ZVswXSk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkT3B0aW9uICYmIHRoaXMuc2VsZWN0ZWRPcHRpb24udmFsdWUgPT09ICdyb2xlJykge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hEYXRhU291cmNlID0gdGhpcy5hbGxSb2xlcztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkT3B0aW9uICYmIHRoaXMuc2VsZWN0ZWRPcHRpb24udmFsdWUgPT09ICdwcm9kdWN0Jykge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hEYXRhU291cmNlID0gdGhpcy5wcm9kdWN0TGlzdDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkT3B0aW9uICYmIHRoaXMuc2VsZWN0ZWRPcHRpb24udmFsdWUgPT09ICdmZWF0dXJlX2tleScpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRGF0YVNvdXJjZSA9IHRoaXMuZmVhdHVyZUtleXNMaXN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hEYXRhU291cmNlID0gW107XG4gICAgICAgICAgICB0aGlzLmNsZWFyRmlsdGVycygpO1xuICAgICAgICAgICAgdGhpcy5nZXRVc2Vycyh7XG4gICAgICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjbGVhckZpbHRlcnMoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyQnlQcm9kdWN0cyA9IFtdO1xuICAgICAgICB0aGlzLmZpbHRlckJ5RmVhdHVyZUtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5maWx0ZXJCeVJvbGVzID0gW107XG4gICAgfVxuICAgIG9uU2VhcmNoQ3JpdGVyaWEoZXZ0KSB7XG4gICAgICAgIHRoaXMuY2xlYXJGaWx0ZXJzKCk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkT3B0aW9uLnZhbHVlID09PSAncm9sZScpIHtcbiAgICAgICAgICAgIHRoaXMub25Sb2xlQ2hhbmdlKGV2dCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZE9wdGlvbi52YWx1ZSA9PT0gJ3Byb2R1Y3QnKSB7XG4gICAgICAgICAgICB0aGlzLm9uUHJvZHVjdENoYW5nZShldnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRPcHRpb24udmFsdWUgPT09ICdmZWF0dXJlX2tleScpIHtcbiAgICAgICAgICAgIHRoaXMub25GZWF0dXJlS2V5Q2hhbmdlKGV2dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERhdGFTb3VyY2UgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblJvbGVDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5jbGVhckZpbHRlcnMoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJCeVJvbGVzID0gZXZlbnQudmFsdWU7XG4gICAgICAgIHRoaXMuZ2V0VXNlcnMoe1xuICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uUHJvZHVjdENoYW5nZShldmVudCkge1xuICAgICAgICB0aGlzLmNsZWFyRmlsdGVycygpO1xuICAgICAgICB0aGlzLmZpbHRlckJ5UHJvZHVjdHMgPSBldmVudC52YWx1ZTtcbiAgICAgICAgdGhpcy5nZXRVc2Vycyh7XG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBvbkZlYXR1cmVLZXlDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5jbGVhckZpbHRlcnMoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJCeUZlYXR1cmVLZXlzID0gZXZlbnQudmFsdWU7XG4gICAgICAgIHRoaXMuZ2V0VXNlcnMoe1xuICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uRGVsZXRlKHVzZXI6IFVzZXIpIHtcbiAgICAgICAgdGhpcy51c2VyVG9EZWxldGUgPSB1c2VyO1xuICAgICAgICB0aGlzLnBhc3N3b3JkVmFsaWRhdGlvbk1vZGFsRm9yVXNlckRlbGV0ZS5vcGVuKCk7XG4gICAgfVxuICAgIGRlbGV0ZVVzZXIoX2V2ZW50KSB7XG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlXG4gICAgICAgICAgICAuZGVsZXRlVXNlcih0aGlzLnVzZXJUb0RlbGV0ZS5pZCwgdGhpcy5zdWJzY3JpcHRpb25JZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlcnMgPSB0aGlzLnVzZXJzLmZpbHRlcih4ID0+IHguaWQgIT09IHRoaXMudXNlclRvRGVsZXRlLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ZXIuc3VjY2Vzcyh0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgnQWRtaW4uVXNlcnMuRGVsZXRlZE1lc3NhZ2UnKSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmdldFVzZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRSxcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaFRleHRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJUb0RlbGV0ZSA9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgb25JbXBlcnNvbmF0ZSh1c2VyOiBVc2VyKSB7XG4gICAgICAgIHRoaXMudXNlclRvSW1wZXJzb25hdGUgPSB1c2VyO1xuICAgICAgICB0aGlzLnBhc3N3b3JkVmFsaWRhdGlvbk1vZGFsRm9ySW1wZXJzb25hdGUub3BlbigpO1xuICAgIH1cbiAgICBvblVzZXJJbXBlcnNvbmF0aW9uKF9ldmVudCkge1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLnBsYXRmb3JtJC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBsYXRmb3JtID0gcmVzO1xuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgICAgICAgICAgIC5pbXBlcnNvbmF0ZVVzZXIoe1xuICAgICAgICAgICAgICAgICAgICBlbWFpbDogdGhpcy51c2VyVG9JbXBlcnNvbmF0ZS5lbWFpbCxcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uX2lkOiBQZXJtaXNzaW9uU2VydmljZS5zZWxlY3RlZFN1YnNjcmlwdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgcGhvbmVnYXA6IHBsYXRmb3JtICE9PSAnYnJvd3NlcidcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhgWW91J3JlIG5vdyBiZWluZyBsb2dnZWQgaW4gYXMgYW5vdGhlciB1c2VyLi4uYCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIDIgc2VjIGJlZm9yZSByZWRpcmVjdGluZyB1c2VyIHRvIGhvbWUgcGFnZVxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2luZG93U2VydmljZS5yZXBsYWNlVXJsKCcvaG9tZScpO1xuICAgICAgICAgICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgICAgICBjb25zdCB2YWwgPSB7XG4gICAgICAgICAgICBzZWFyY2hUZXh0OiB0aGlzLnNlYXJjaFRleHQsXG4gICAgICAgICAgICBmaWx0ZXJCeUZlYXR1cmVLZXlzOiB0aGlzLmZpbHRlckJ5RmVhdHVyZUtleXMsXG4gICAgICAgICAgICBmaWx0ZXJCeVJvbGVzOiB0aGlzLmZpbHRlckJ5Um9sZXMsXG4gICAgICAgICAgICBmaWx0ZXJCeVByb2R1Y3RzOiB0aGlzLmZpbHRlckJ5UHJvZHVjdHMsXG4gICAgICAgICAgICBzZWxlY3RlZE9wdGlvbjogdGhpcy5zZWxlY3RlZE9wdGlvbixcbiAgICAgICAgICAgIHNlYXJjaERhdGFTb3VyY2U6IHRoaXMuc2VhcmNoRGF0YVNvdXJjZVxuICAgICAgICB9O1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndXNlci1saXN0LXN0YXRlJywgSlNPTi5zdHJpbmdpZnkodmFsKSk7XG4gICAgICAgIGNvbnN0IG5vdGlmaWVyID0gbmV3IFN1YmplY3QoKTtcbiAgICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUodGFrZVVudGlsKG5vdGlmaWVyKSkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLmluY2x1ZGVzKCcvdXNlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0kKCd1c2VyLWxpc3Qtc3RhdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpZXIubmV4dCgnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG4gICAgZGlzYWJsZTJmYShpZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlMmZhVXNlcklkID0gaWQ7XG4gICAgICAgIHRoaXMucGFzc3dvcmRWYWxpZGF0aW9uTW9kYWxGb3JSZW1vdmUyZmEub3BlbigpO1xuICAgIH1cbiAgICByZW1vdmUyZmEoX2V2ZW50KSB7XG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlLnJlbW92ZTJmYSh0aGlzLnJlbW92ZTJmYVVzZXJJZCwgdGhpcy5zdWJzY3JpcHRpb25JZCkuc3Vic2NyaWJlKCk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInJvd1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sLTEyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICA8aDIgY2xhc3M9XCJjYXJkLXRpdGxlIHAtMCBmbG9hdC1zdGFydFwiPlVzZXJzPC9oMj5cbiAgICA8YSBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBmbG9hdC1lbmRcIlxuICAgICAgaWQ9XCJidG4tY3JlYXRlXCJcbiAgICAgICpyYmFjQWxsb3c9XCInU3VwZXJBZG1pbidcIlxuICAgICAgW3JvdXRlckxpbmtdPVwiW3JvdXRlcnMudXNlcnNEZXRhaWxzICsgJ2FkZCddXCI+XG4gICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiBDcmVhdGUgVXNlclxuICAgIDwvYT5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCI+XG4gIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhaXNMb2FkZWRcIj5cbiAgICA8cC1wcm9ncmVzc1NwaW5uZXI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJwcmltZW5nLWRhdGF0YWJsZS1jb250YWluZXIgbXQtMFwiIFtjbGFzcy5oaWRlVGFibGVdPVwidG90YWxSZWNvcmRzVW5GaWx0ZXJlZCA9PT0gMFwiPlxuICA8ZGl2IGNsYXNzPVwidXNlci1tYW5hZ2VtZW50LXRhYmxlIHRhYmxlLXJlc3BvbnNpdmVcIj5cbiAgICA8cC10YWJsZSAjZHRcbiAgICAgIFt2YWx1ZV09XCJ1c2Vyc1wiXG4gICAgICBbcGFnaW5hdG9yXT1cInRvdGFsUmVjb3JkcyAhPT0gMFwiXG4gICAgICBbbGF6eV09XCJ0cnVlXCJcbiAgICAgIFtyb3dzXT1cIlBBR0VfU0laRVwiXG4gICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3Jkc1wiXG4gICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICAgIFtmaWx0ZXJEZWxheV09XCIxMDAwXCJcbiAgICAgIChvbkxhenlMb2FkKT1cIm9uTGF6eUxvYWQoJGV2ZW50KVwiXG4gICAgICBbY3VzdG9tU29ydF09XCJ0cnVlXCI+XG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWZpbHRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxuICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgW29wdGlvbnNdPVwic2VhcmNoT3B0aW9uc1wiXG4gICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvblNlYXJjaE9wdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgdXNlcnMgYnkgcm9sZSwgcHJvZHVjdCwgb3IgZmVhdHVyZVwiXG4gICAgICAgICAgICAgIFtzZWxlY3Rpb25MaW1pdF09XCIxXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJTb3VyY2VcIlxuICAgICAgICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiPlxuICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiXG4gICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkT3B0aW9uXCI+XG4gICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBbb3B0aW9uc109XCJzZWFyY2hEYXRhU291cmNlXCJcbiAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uU2VhcmNoQ3JpdGVyaWEoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cInRydWVcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNyaXRlcmlhXCJcbiAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IHt7IHNlbGVjdGVkT3B0aW9uLnZhbHVlIH19c1wiXG4gICAgICAgICAgICAgIG1heFNlbGVjdGVkTGFiZWxzPVwiMlwiXG4gICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiPlxuICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2ggbXQtMiBtZS0yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCJcbiAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICBzaXplPVwiNTBcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBVc2VyLi4uXCJcbiAgICAgICAgICAgICAgZGF0YS1jeT1cInVzZXItc2VhcmNoXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cImR0LmZpbHRlckdsb2JhbCgkZXZlbnQudGFyZ2V0LnZhbHVlLCAnY29udGFpbnMnKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwid2QtOTBcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImlkXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uVXNlcnMuSWQnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cImlkXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJmaXJzdF9uYW1lXCI+XG4gICAgICAgICAgICB7eyAnTGFiZWwuRmlyc3ROYW1lJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJmaXJzdF9uYW1lXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJsYXN0X25hbWVcIj5cbiAgICAgICAgICAgIHt7ICdMYWJlbC5MYXN0TmFtZScgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwibGFzdF9uYW1lXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJlbWFpbFwiPlxuICAgICAgICAgICAge3sgJ0xhYmVsLkVtYWlsJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJlbWFpbFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwic2x1Z1wiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlVzZXJzLlNsdWcnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cInNsdWdcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImVuY3J5cHRlZF9wYXNzd29yZFwiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlVzZXJzLkVtYWlsQ29uZmlybScgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwiZW5jcnlwdGVkX3Bhc3N3b3JkXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cInNlc3Npb25zX2xhc3RfbW9udGhcIj5cbiAgICAgICAgICAgIHt7ICdBZG1pbi5TdWJzY3JpcHRpb25zLlNlc3Npb25zVG90YWxMYXN0TW9udGgnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cInNlc3Npb25zX2xhc3RfbW9udGhcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImxhc3Rfc2lnbl9pbl9hdFwiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlVzZXJzLkxhc3RMb2dpbicgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwibGFzdF9zaWduX2luX2F0XCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJzaWduZWRfdXBfYXRcIj5cbiAgICAgICAgICAgIHt7ICdBZG1pbi5Vc2Vycy5SZWdpc3RlcmVkT24nIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cInNpZ25lZF91cF9hdFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb25zLWxpc3QtZm91clwiPlxuICAgICAgICAgICAge3sgJ0xhYmVsLkFjdGlvbnMnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiXG4gICAgICAgIGxldC11c2VyPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cImlkXCI+IHt7IHVzZXIuaWQgfX08L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJGaXJzdCBOYW1lXCI+PGEgW3JvdXRlckxpbmtdPVwiWycvbWVtYmVycycsIHVzZXIuc2x1Z11cIj57eyB1c2VyLmZpcnN0X25hbWUgfX08L2E+PC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiTGFzdCBOYW1lXCI+e3sgdXNlci5sYXN0X25hbWUgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidXNlcj8uYWxwaGFcIlxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ0FkbWluLlVzZXJzLlRvb2x0aXAuQWxwaGFJY29uJ3x0cmFuc2xvY29cIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1yZWd1bGFyIGZhLXNxdWFyZS1hIGFscGhhLWJldGEgdGV4dC13YXJuaW5nXCI+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ1c2VyPy5iZXRhXCJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidBZG1pbi5Vc2Vycy5Ub29sdGlwLkJldGFJY29uJ3x0cmFuc2xvY29cIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1yZWd1bGFyIGZhLXNxdWFyZS1iIGFscGhhLWJldGEgdGV4dC1wcmltYXJ5XCIgPjwvaT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJFbWFpbFwiPnt7IHVzZXIuZW1haWwgfX08L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJTbHVnXCI+e3sgdXNlci5zbHVnIH19PC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiRW1haWwgQ29uZmlybVwiPlxuICAgICAgICAgICAgPHNwYW4gW2FwcER5bmFtaWNCYWRnZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQXJyYXk6IFt0cnVlLCBmYWxzZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IHVzZXI/Lmhhc19wYXNzd29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICBjb2xvcj1cInN1Y2Nlc3MtZGFuZ2VyXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJiYWRnZVwiPnt7IHVzZXI/Lmhhc19wYXNzd29yZCA/ICdZZXMnIDogJ05vJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCIgKm5nSWY9XCJ1c2VyPy5ibG9ja2VkXCIgW3BUb29sdGlwXT1cIidUaGlzIHVzZXIgaGFzIGJlZW4gYmxvY2tlZCdcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLWhleGFnb24tZXhjbGFtYXRpb24gdGV4dC1kYW5nZXIgaGV4YS13YXJuaW5nXCI+PC9pPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiUy9tICNcIj5cbiAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWRhbmdlciBmdy1ib2xkJzogdXNlcj8uc2Vzc2lvbnNfbGFzdF9tb250aCA8IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPnt7IHVzZXI/LnNlc3Npb25zX2xhc3RfbW9udGggfX08L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiTGFzdCBMb2dpblwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ1c2VyPy5jdXJyZW50X3NpZ25faW5fYXQ7ZWxzZSBsYXN0U2lnbmluXCI+XG4gICAgICAgICAgICAgIHt7IHVzZXIuY3VycmVudF9zaWduX2luX2F0ICB8IGRhdGVGb3JtYXQgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGFzdFNpZ25pbj5cbiAgICAgICAgICAgICAge3sgdXNlci5sYXN0X3NpZ25faW5fYXQgfCBkYXRlRm9ybWF0IH19XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIlJlZ2lzdGVyZWQgT25cIj57eyB1c2VyLnNpZ25lZF91cF9hdCB8IGRhdGVGb3JtYXQgfX08L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY3Rpb25cIj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgbGlzdC1pbmxpbmUgbGlzdC1hY3Rpb25cIj5cbiAgICAgICAgICAgICAgPGxpIG5nYlRvb2x0aXA9XCJJbXBlcnNvbmF0ZSB0aGlzIHVzZXJcIlxuICAgICAgICAgICAgICAgICpyYmFjQWxsb3c9XCInUGFnZXMuQWxwaGEnXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1lLTIgbWUtc20tM1wiPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtcGVvcGxlLWFycm93cyBmYS1sZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSW1wZXJzb25hdGUodXNlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uSW1wZXJzb25hdGUodXNlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwidXNlcj8uZW5hYmxlX3R3b19mYWN0b3JfYXV0aGVudGljYXRvclwiPlxuICAgICAgICAgICAgICAgIDxsaSBuZ2JUb29sdGlwPVwiRGlzYWJsZSAyRkFcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRpc2FibGUyZmEodXNlcj8uaWQpXCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImRpc2FibGUyZmEodXNlcj8uaWQpXCJcbiAgICAgICAgICAgICAgICAgICpyYmFjQWxsb3c9XCInUGFnZXMuQWxwaGEnXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWxvY2sgZmEtbGcgc3VjY2Vzc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiY3VycmVudFVzZXIgJiYgdXNlci5pZCAhPT0gY3VycmVudFVzZXIuaWRcIj5cbiAgICAgICAgICAgICAgICA8bGkgbmdiVG9vbHRpcD1cIk1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgKnJiYWNBbGxvdz1cImNoYXRQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCJcbiAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL21lc3NhZ2UnXVwiXG4gICAgICAgICAgICAgICAgICBbZnJhZ21lbnRdPVwidXNlci5zbHVnXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNvbW1lbnRzIGN0YTEtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bGkgbmdiVG9vbHRpcD1cIkVkaXRcIlxuICAgICAgICAgICAgICAgICpyYmFjQWxsb3c9XCInUGFnZXMuQWRtaW4uVXNlcnMuRWRpdCdcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCJcbiAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbcm91dGVycy51c2Vyc0RldGFpbHMgKyB1c2VyLmlkXVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWRpdCBlZGl0LWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSBuZ2JUb29sdGlwPVwiRGVsZXRlXCJcbiAgICAgICAgICAgICAgICAqcmJhY0FsbG93PVwiJ1BhZ2VzLkFkbWluLlVzZXJzLkRlbGV0ZSdcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCI+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdHJhc2ggZGVsZXRlLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25EZWxldGUodXNlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwib25EZWxldGUodXNlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlKHVzZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvcC10YWJsZT5cbiAgICA8ZGl2ICpuZ0lmPVwidG90YWxSZWNvcmRzID09PSAwICYmIHRvdGFsUmVjb3Jkc1VuRmlsdGVyZWQgIT09IDBcIj5cbiAgICAgIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidTZWFyY2guTm9EYXRhTWVzc2FnZScgfCB0cmFuc2xvY29cIiBbZGVzY3JpcHRpb25dPVwiJ1NlYXJjaC5Ob0RhdGFEZXNjcmlwdGlvbicgfCB0cmFuc2xvY29cIj5cbiAgICAgIDwvcHctbm8tZGF0YT5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXJlY29yZHMtY291bnRcIiAqbmdJZj1cInRvdGFsUmVjb3JkcyAhPT0gMFwiPnt7ICdMYWJlbC5Ub3RhbCcgfCB0cmFuc2xvY28gfX06IHt7IHRvdGFsUmVjb3JkcyB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiB0b3RhbFJlY29yZHNVbkZpbHRlcmVkID09PSAwXCI+XG4gIDxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidBZG1pbi5Vc2Vycy5Ob0RhdGFNZXNzYWdlJyB8IHRyYW5zbG9jb1wiPiA8L3B3LW5vLWRhdGE+XG48L2Rpdj5cbjwhLS0gcGFzc3dvcmQgdmFsaWRhdGlvbiBtb2RhbCBmb3IgZGVsZXRlIHVzZXIgLS0+XG48cHctcGFzc3dvcmQtdmFsaWRhdGlvbiAjcGFzc3dvcmRWYWxpZGF0aW9uTW9kYWxGb3JVc2VyRGVsZXRlXG4gIChzdWNjZXNzRXZlbnQpPVwiZGVsZXRlVXNlcigkZXZlbnQpXCI+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICA8cD57eyAnVXNlci5BY2NvdW50Lk1lc3NhZ2UuQWN0aW9uQ2FuTm90VW5kb25lJyB8IHRyYW5zbG9jbyB9fTwvcD5cbiAgICAgIDxwPnt7ICdVc2VyLkFjY291bnQuTWVzc2FnZS5Db25maXJtUGFzc3dvcmQnIHwgdHJhbnNsb2NvIH19PC9wPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvcHctcGFzc3dvcmQtdmFsaWRhdGlvbj5cbjwhLS0gcGFzc3dvcmQgdmFsaWRhdGlvbiBtb2RhbCBmb3IgaW1wZXJzb25hdGUgLS0+XG48cHctcGFzc3dvcmQtdmFsaWRhdGlvbiAjcGFzc3dvcmRWYWxpZGF0aW9uTW9kYWxGb3JJbXBlcnNvbmF0ZVxuICAoc3VjY2Vzc0V2ZW50KT1cIm9uVXNlckltcGVyc29uYXRpb24oJGV2ZW50KVwiPlxuPC9wdy1wYXNzd29yZC12YWxpZGF0aW9uPlxuPCEtLSBwYXNzd29yZCB2YWxpZGF0aW9uIG1vZGFsIGZvciByZW1vdmUyZmEgLS0+XG48cHctcGFzc3dvcmQtdmFsaWRhdGlvbiAjcGFzc3dvcmRWYWxpZGF0aW9uTW9kYWxGb3JSZW1vdmUyZmFcbiAgKHN1Y2Nlc3NFdmVudCk9XCJyZW1vdmUyZmEoJGV2ZW50KVwiPlxuPC9wdy1wYXNzd29yZC12YWxpZGF0aW9uPlxuIl19