@posiwise/admin-module 0.0.160 → 0.0.162

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.
Files changed (47) hide show
  1. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-build/domain-config-build.component.mjs +198 -102
  2. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-details.component.mjs +2 -2
  3. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-integrations/domain-config-integrations.component.mjs +3 -2
  4. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-interface/domain-config-interface.component.mjs +3 -2
  5. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-organization/domain-config-organization.component.mjs +3 -2
  6. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-security/domain-config-security.component.mjs +3 -2
  7. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-social/domain-config-social.component.mjs +3 -2
  8. package/esm2022/lib/components/faqs/add-faq/add-faq.component.mjs +3 -3
  9. package/esm2022/lib/components/faqs/edit-faq/edit-faq.component.mjs +3 -3
  10. package/esm2022/lib/components/faqs/faqs-list/faqs-list.component.mjs +4 -4
  11. package/esm2022/lib/components/login-notifications/login-notification-details/login-notification-details.component.mjs +2 -2
  12. package/esm2022/lib/components/products/product-details/product-details.component.mjs +3 -3
  13. package/esm2022/lib/components/products/products-list/products-list.component.mjs +3 -3
  14. package/esm2022/lib/components/resources/resources-admin-details/resources-admin-details.component.mjs +57 -28
  15. package/esm2022/lib/components/resources/resources-admin-tabs/resources-index/resources-index.component.mjs +5 -5
  16. package/esm2022/lib/components/subscriptions/subscription-agents/subscription-agents.component.mjs +4 -4
  17. package/esm2022/lib/components/subscriptions/subscription-agents-list/subscription-agents-list.component.mjs +2 -2
  18. package/esm2022/lib/components/subscriptions/subscription-details/subscription-details.component.mjs +4 -4
  19. package/esm2022/lib/components/subscriptions/subscription-product-details/subscription-product-details.component.mjs +3 -3
  20. package/esm2022/lib/components/subscriptions/subscription-products/subscription-products.component.mjs +2 -2
  21. package/esm2022/lib/components/subscriptions/subscription-users/add-members/add-members.component.mjs +16 -5
  22. package/esm2022/lib/components/subscriptions/subscription-users/subscription-users.component.mjs +38 -8
  23. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-average-price/subscription-insight-average-price.component.mjs +2 -7
  24. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-average-user/subscription-insight-average-user.component.mjs +2 -7
  25. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-nps/subscription-insight-nps.component.mjs +2 -7
  26. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-product-session/subscription-insight-product-session.component.mjs +2 -7
  27. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-user-session/subscription-insight-user-session.component.mjs +2 -7
  28. package/esm2022/lib/components/subscriptions/subscriptions-list/invite-users/invite-users.component.mjs +6 -6
  29. package/esm2022/lib/components/subscriptions/subscriptions-list/subscriptions-list.component.mjs +11 -10
  30. package/esm2022/lib/components/tags/tags-details/tags-details.component.mjs +15 -5
  31. package/esm2022/lib/components/tags/tags-list/tags-list.component.mjs +4 -4
  32. package/esm2022/lib/components/tracking/ahoy-events/ahoy-events.component.mjs +5 -6
  33. package/esm2022/lib/components/tracking/ahoy-messages/ahoy-messages.component.mjs +5 -6
  34. package/esm2022/lib/components/tracking/ahoy-visits/ahoy-visits.component.mjs +4 -3
  35. package/esm2022/lib/components/tracking/events/events.component.mjs +4 -3
  36. package/esm2022/lib/components/tracking/versions/versions.component.mjs +3 -3
  37. package/esm2022/lib/components/users/user-details/user-details.component.mjs +6 -3
  38. package/esm2022/lib/components/users/users-list/users-list.component.mjs +11 -11
  39. package/fesm2022/posiwise-admin-module.mjs +399 -247
  40. package/fesm2022/posiwise-admin-module.mjs.map +1 -1
  41. package/lib/components/domain-config/domain-config-details/domain-config-build/domain-config-build.component.d.ts +9 -0
  42. package/lib/components/resources/resources-admin-details/resources-admin-details.component.d.ts +14 -1
  43. package/lib/components/resources/resources-admin-tabs/resources-index/resources-index.component.d.ts +1 -1
  44. package/lib/components/subscriptions/subscription-users/add-members/add-members.component.d.ts +2 -1
  45. package/lib/components/subscriptions/subscription-users/subscription-users.component.d.ts +3 -0
  46. package/lib/components/tags/tags-details/tags-details.component.d.ts +4 -2
  47. package/package.json +1 -1
@@ -85,7 +85,8 @@ export class SubscriptionsListComponent extends AppBaseComponent {
85
85
  }
86
86
  openRecoverSubscriptionModal(item) {
87
87
  this.recoveringItem = item;
88
- this.recoverSubscriptionPasswordModal.confirmMessage = 'Admin.Subscriptions.ConfirmRecover';
88
+ // false positive: not a password, it's a translation key
89
+ this.recoverSubscriptionPasswordModal.confirmMessage = 'Admin.Subscriptions.ConfirmRecover'; // NOSONAR
89
90
  this.recoverSubscriptionPasswordModal.open();
90
91
  }
91
92
  onRecoverConfirmed() {
@@ -109,9 +110,9 @@ export class SubscriptionsListComponent extends AppBaseComponent {
109
110
  this.localStorage.getItem$('subscription-list-state').subscribe(res => {
110
111
  if (res) {
111
112
  const result = JSON.parse(res);
112
- this.searchText = result?.searchText || '';
113
- this.status = result?.status || '';
114
- this.selectedFeatureKeys = result?.featureKeys || [];
113
+ this.searchText = result?.searchText ?? '';
114
+ this.status = result?.status ?? '';
115
+ this.selectedFeatureKeys = result?.featureKeys ?? [];
115
116
  this.filterByFeatureKeys = this.selectedFeatureKeys;
116
117
  }
117
118
  });
@@ -137,7 +138,7 @@ export class SubscriptionsListComponent extends AppBaseComponent {
137
138
  }
138
139
  getMinMaxUnits() {
139
140
  this.form.get('product_id').valueChanges.subscribe(x => {
140
- this.unitsText = x?.unitsText || '';
141
+ this.unitsText = x?.unitsText ?? '';
141
142
  });
142
143
  }
143
144
  getData(paging) {
@@ -161,7 +162,7 @@ export class SubscriptionsListComponent extends AppBaseComponent {
161
162
  this.subscriptions = uniqBy(this.subscriptions, 'id');
162
163
  }
163
164
  this.subscriptionInsights = response?.subscription_insights;
164
- this.totalRecords = response.object_count || 0;
165
+ this.totalRecords = response.object_count ?? 0;
165
166
  this.totalRecordsUnFiltered = response?.unfiltered_count;
166
167
  })
167
168
  .add(() => {
@@ -195,7 +196,7 @@ export class SubscriptionsListComponent extends AppBaseComponent {
195
196
  this.searchOptions = featureKeys.map(element => {
196
197
  return {
197
198
  id: element,
198
- label: element || ''
199
+ label: element ?? ''
199
200
  };
200
201
  });
201
202
  });
@@ -295,11 +296,11 @@ export class SubscriptionsListComponent extends AppBaseComponent {
295
296
  super.ngOnDestroy();
296
297
  }
297
298
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SubscriptionsListComponent, deps: [{ token: i1.ProductService }, { token: i2.AdminService }, { token: i3.UntypedFormBuilder }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: i1.CommonService }], target: i0.ɵɵFactoryTarget.Component }); }
298
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SubscriptionsListComponent, selector: "pw-subscriptions-list", viewQueries: [{ propertyName: "refProduct", first: true, predicate: ["refProduct"], descendants: true }, { propertyName: "recoverSubscriptionPasswordModal", first: true, predicate: ["recoverSubscriptionPasswordModal"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <div\n class=\"col-12 d-flex justify-content-between align-items-center\">\n <h2 class=\"card-title p-0 float-start\">Subscriptions</h2>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n id=\"btn-create\"\n [routerLink]=\"[routers.inviteUsers]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Invite a User to a Trial\n </a>\n </div>\n</div>\n<div class=\"p-2 mt-3\">\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 table-responsive mt-0\"\n [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <p-table #dt\n [value]=\"subscriptions\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [lazy]=\"true\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <ng-container *ngIf=\"subscriptionInsights\">\n <div class=\"row mb-4\">\n <ng-container *ngFor=\"let temp of objectKeys(subscriptionInsights)\">\n <div class=\"col-12 col-lg-3 mt-2 summary\">\n <div class=\"card\">\n <div class=\"card-body\">\n <ng-container *ngFor=\"let item of subscriptionInsights[temp]\">\n <div>\n <p class=\"mb-0 px-2\">{{ item?.title }}\n <span *ngIf=\"item?.info\"\n [pTooltip]=\"item?.info\">\n <i class=\"fas fa-info-circle\"></i>\n </span>\n </p>\n <h4 class=\"fw-bold mt-2 mb-2\">\n {{ item?.value }}\n </h4>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <div class=\"search-filter\">\n <div class=\"col-12 col-sm-4\">\n <p-multiSelect placeholder=\"Select Feature Keys\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n [(ngModel)]=\"selectedFeatureKeys\"\n [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-12 col-sm-4\">\n <p-dropdown\n [options]=\"subscriptionStatus\"\n [placeholder]=\"'Select status'\"\n (onChange)=\"filterByStatus($event.value)\"\n [(ngModel)]=\"status\">\n </p-dropdown>\n </div>\n <div class=\"text-end\">\n <i class=\"fa fa-search mt-2 me-2 d-none\" aria-hidden=\"true\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n pInputText\n size=\"30\"\n placeholder=\"Search Subscription...\"\n class=\"mw-90\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\" />\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Subscriptions.Id' | transloco }}\n <p-sortIcon field=\"id\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"organisation\">\n {{ 'Admin.Subscriptions.Organization' | transloco }}\n <p-sortIcon field=\"organisation\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"contact_name\">\n {{ 'Admin.Subscriptions.ContactName' | transloco }}\n <p-sortIcon field=\"contact_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"contact_email\">\n {{ 'Admin.Subscriptions.ContactEmail' | transloco }}\n <p-sortIcon field=\"contact_email\"></p-sortIcon>\n </th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.Product' | transloco }}</th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.Currency' | transloco }}</th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.PricePerMonth' | transloco }}</th>\n <th scope=\"true\"\n pSortableColumn=\"stripe_customer_id\">\n {{ 'Admin.Subscriptions.Paid' | transloco }}\n <p-sortIcon field=\"stripe_customer_id\"></p-sortIcon>\n </th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.Billing' | transloco }}</th>\n <th scope=\"true\"\n class=\"expires-at-width\">\n {{ 'Admin.Subscriptions.ExpiresAt' | transloco }}\n </th>\n <th scope=\"true\"\n pSortableColumn=\"sessions_total\">\n {{ 'Admin.Subscriptions.SessionsTotal' | transloco }}\n <p-sortIcon field=\"sessions_total\"></p-sortIcon>\n </th>\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=\"deleted_at\">\n {{ 'Admin.Subscriptions.Deleted' | transloco }}\n <p-sortIcon field=\"deleted_at\"></p-sortIcon>\n </th>\n <th class=\"actions-list-two\"\n scope=\"true\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-item>\n <tr>\n <td data-head=\"id\">{{ item.id }}</td>\n <td data-head=\"Organization\">\n <span class=\"cursor-pointer custom-break-word\"\n [pTooltip]=\"item.organisation\"\n tooltipPosition=\"top\">{{ item.organisation | textTruncate: 20 }}</span>\n </td>\n <td data-head=\"ContactName\"\n class=\"custom-break-word\">\n {{ item.contact_name }}\n </td>\n <td data-head=\"ContactEmail\">{{ item.contact_email }}</td>\n <td data-head=\"Name\">\n <span class=\"cursor-pointer custom-break-word\"\n [pTooltip]=\"item.productName\"\n tooltipPosition=\"top\">{{ item.productName }}</span>\n </td>\n <td data-head=\"Currency\">\n <span [appDynamicBadge]=\"{ itemsArray: currency, item: item.currency }\"\n color=\"blue-grey\"\n class=\"badge\">{{ item.currency }}</span>\n </td>\n <td data-head=\"Price/M\">\n <span>{{ (item.price / 100).toFixed(2) | currency:item.currency }}\n <i\n class=\"fa fa-info-circle\"\n *ngIf=\"item?.discount && objectKeys(item?.discount)?.length\"\n aria-hidden=\"true\"\n [pTooltip]=\"item?.discount | json\"\n tooltipPosition=\"top\"\n ></i>\n </span>\n </td>\n <td data-head=\"Paid\">\n <ng-container *ngIf=\"item?.unsubscribed_at\">\n <span class=\"badge bg-warning\">Unsub</span>\n </ng-container>\n <ng-container *ngIf=\"!item?.unsubscribed_at\">\n <ng-template [ngIf]=\"item?.stripe_customer_id || item?.external_payment\"\n [ngIfElse]=\"noBlock\">\n <span class=\"badge bg-success\">Yes</span>\n </ng-template>\n <ng-template #noBlock>\n <span class=\"badge bg-blue-grey\">No</span>\n </ng-template>\n </ng-container>\n <span *ngIf=\"item?.pause_collection && objectKeys(item?.pause_collection)?.length\"\n class=\"ms-2\"\n [pTooltip]=\"item?.pause_collection | json\"\n tooltipPosition=\"top\">\n <i class=\"fas fa-exclamation-triangle text-warning\"></i>\n </span>\n </td>\n <td data-head=\"Billing\">\n <span class=\"badge\"\n [appDynamicBadge]=\"{\n itemsArray: billingFrequency,\n item: item?.billingFrequency\n }\"\n color=\"blue-grey\">{{ item.billingFrequency }}</span>\n </td>\n <td data-head=\"Expires\">\n <span [ngClass]=\"getExpiresAtColor(item)\">{{item?.expires_at | dateFormat}}</span><br />\n <span>{{item?.created_at | sinceAgo}}</span>\n </td>\n <td data-head=\"S#\">{{ item?.sessions_total }}</td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': item?.sessions_last_month < 3\n }\">{{ item?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Deleted\">\n <span *ngIf=\"item?.deleted_at\"\n class=\"badge bg-danger\">Yes</span>\n <span *ngIf=\"!item?.deleted_at\"\n class=\"badge bg-blue-grey\">No</span>\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li ngbTooltip=\"Edit\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.subscriptionDetails, item.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <ng-container *ngIf=\"item.deleted; else showDelete\">\n <li ngbTooltip=\"Reactivate subscription\"\n class=\"me-2 me-sm-3\"\n *rbacAllow=\"'Pages.Alpha'\"\n (click)=\"openRecoverSubscriptionModal(item)\">\n <i class=\"fa fa-trash delete-icon text-success\" aria-hidden=\"true\"></i>\n </li>\n </ng-container>\n <ng-template #showDelete>\n <li ngbTooltip=\"Delete\"\n class=\"me-2 me-sm-3\"\n *rbacAllow=\"'Pages.Admin.Subscription.Delete'\"\n (keydown.enter)=\"onDelete(item)\"\n (click)=\"onDelete(item)\">\n <i class=\"fa fa-trash delete-icon\" aria-hidden=\"true\"></i>\n </li>\n </ng-template>\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<pw-no-data [withImage]=\"true\" [message]=\"'Admin.Subscriptions.NoSubscriptionMessage' | transloco\" *ngIf=\"totalRecordsUnFiltered === 0 && isLoaded\">\n</pw-no-data>\n<pw-password-validation\n #recoverSubscriptionPasswordModal\n (successEvent)=\"onRecoverConfirmed()\">\n</pw-password-validation>\n\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)}@media (min-width: 767px){.table-responsive td,.table-responsive th{font-size:11px!important}}.expires-at-width{width:8%}.custom-break-word{word-break:break-word!important}.summary .card{padding-bottom:0}.summary .card .card-body{padding-top:20px;text-align:center}.summary .card .card-body p,.summary .card .card-body h4{font-size:14px}@media (min-width: 320px) and (max-width: 720px){.primeng-datatable-container .search-filter{display:flex;flex-direction:column;gap:.5rem;justify-content:space-between}}\n"], dependencies: [{ kind: "component", type: i4.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: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "directive", type: i6.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: i7.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i8.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: i9.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.PasswordValidationComponent, selector: "pw-password-validation", inputs: ["confirmMessage"], outputs: ["successEvent"] }, { kind: "directive", type: i12.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i13.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i11.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "directive", type: i14.DynamicBadgeDirective, selector: "[appDynamicBadge]", inputs: ["appDynamicBadge", "color", "colorByName", "dataName"] }, { kind: "directive", type: i14.RbacAllowDirective, selector: "[rbacAllow]", inputs: ["rbacAllow"] }, { kind: "directive", type: i15.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: i10.JsonPipe, name: "json" }, { kind: "pipe", type: i10.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i16.TranslocoPipe, name: "transloco" }, { kind: "pipe", type: i17.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i17.SinceAgoPipe, name: "sinceAgo" }, { kind: "pipe", type: i17.TextTruncatePipe, name: "textTruncate" }] }); }
299
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SubscriptionsListComponent, selector: "pw-subscriptions-list", viewQueries: [{ propertyName: "refProduct", first: true, predicate: ["refProduct"], descendants: true }, { propertyName: "recoverSubscriptionPasswordModal", first: true, predicate: ["recoverSubscriptionPasswordModal"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <div\n class=\"col-12 d-flex justify-content-between align-items-center\">\n <h2 class=\"card-title p-0 float-start\">Subscriptions</h2>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n id=\"btn-create\"\n [routerLink]=\"[routers.inviteUsers]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Invite a User to a Trial\n </a>\n </div>\n</div>\n<div class=\"p-2 mt-3\">\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 table-responsive mt-0\"\n [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <p-table #dt\n [value]=\"subscriptions\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [lazy]=\"true\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <ng-container *ngIf=\"subscriptionInsights\">\n <div class=\"row mb-4\">\n <ng-container *ngFor=\"let temp of objectKeys(subscriptionInsights)\">\n <div class=\"col-12 col-lg-3 mt-2 summary\">\n <div class=\"card\">\n <div class=\"card-body\">\n <ng-container *ngFor=\"let item of subscriptionInsights[temp]\">\n <div>\n <p class=\"mb-0 px-2\">{{ item?.title }}\n <span *ngIf=\"item?.info\"\n [pTooltip]=\"item?.info\">\n <i class=\"fas fa-info-circle\"></i>\n </span>\n </p>\n <h4 class=\"fw-bold mt-2 mb-2\">\n {{ item?.value }}\n </h4>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <div class=\"search-filter\">\n <div class=\"col-12 col-sm-4\">\n <p-multiSelect placeholder=\"Select Feature Keys\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n [(ngModel)]=\"selectedFeatureKeys\"\n [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-12 col-sm-4\">\n <p-dropdown\n [options]=\"subscriptionStatus\"\n [placeholder]=\"'Select status'\"\n (onChange)=\"filterByStatus($event.value)\"\n [(ngModel)]=\"status\">\n </p-dropdown>\n </div>\n <div class=\"text-end\">\n <i class=\"fa fa-search mt-2 me-2 d-none\" aria-hidden=\"true\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n pInputText\n size=\"30\"\n placeholder=\"Search Subscription...\"\n class=\"mw-90\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\" />\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Subscriptions.Id' | transloco }}\n <p-sortIcon field=\"id\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"organisation\">\n {{ 'Admin.Subscriptions.Organization' | transloco }}\n <p-sortIcon field=\"organisation\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"contact_name\">\n {{ 'Admin.Subscriptions.ContactName' | transloco }}\n <p-sortIcon field=\"contact_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"contact_email\">\n {{ 'Admin.Subscriptions.ContactEmail' | transloco }}\n <p-sortIcon field=\"contact_email\"></p-sortIcon>\n </th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.Product' | transloco }}</th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.Currency' | transloco }}</th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.PricePerMonth' | transloco }}</th>\n <th scope=\"true\"\n pSortableColumn=\"stripe_customer_id\">\n {{ 'Admin.Subscriptions.Paid' | transloco }}\n <p-sortIcon field=\"stripe_customer_id\"></p-sortIcon>\n </th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.Billing' | transloco }}</th>\n <th scope=\"true\"\n class=\"expires-at-width\">\n {{ 'Admin.Subscriptions.ExpiresAt' | transloco }}\n </th>\n <th scope=\"true\"\n pSortableColumn=\"sessions_total\">\n {{ 'Admin.Subscriptions.SessionsTotal' | transloco }}\n <p-sortIcon field=\"sessions_total\"></p-sortIcon>\n </th>\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=\"deleted_at\">\n {{ 'Admin.Subscriptions.Deleted' | transloco }}\n <p-sortIcon field=\"deleted_at\"></p-sortIcon>\n </th>\n <th class=\"actions-list-two\"\n scope=\"true\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-item>\n <tr>\n <td data-head=\"id\">{{ item.id }}</td>\n <td data-head=\"Organization\">\n <span class=\"cursor-pointer custom-break-word\"\n [pTooltip]=\"item.organisation\"\n tooltipPosition=\"top\">{{ item.organisation | textTruncate: 20 }}</span>\n </td>\n <td data-head=\"ContactName\"\n class=\"custom-break-word\">\n {{ item.contact_name }}\n </td>\n <td data-head=\"ContactEmail\">{{ item.contact_email }}</td>\n <td data-head=\"Name\">\n <span class=\"cursor-pointer custom-break-word\"\n [pTooltip]=\"item.productName\"\n tooltipPosition=\"top\">{{ item.productName }}</span>\n </td>\n <td data-head=\"Currency\">\n <span [appDynamicBadge]=\"{ itemsArray: currency, item: item.currency }\"\n color=\"blue-grey\"\n class=\"badge\">{{ item.currency }}</span>\n </td>\n <td data-head=\"Price/M\">\n <span>{{ (item.price / 100).toFixed(2) | currency:item.currency }}\n <i\n class=\"fa fa-info-circle\"\n *ngIf=\"item?.discount && objectKeys(item?.discount)?.length\"\n aria-hidden=\"true\"\n [pTooltip]=\"item?.discount | json\"\n tooltipPosition=\"top\"\n ></i>\n </span>\n </td>\n <td data-head=\"Paid\">\n <ng-container *ngIf=\"item?.unsubscribed_at\">\n <span class=\"badge bg-warning\">Unsub</span>\n </ng-container>\n <ng-container *ngIf=\"!item?.unsubscribed_at\">\n <ng-template [ngIf]=\"item?.stripe_customer_id || item?.external_payment\"\n [ngIfElse]=\"noBlock\">\n <span class=\"badge bg-success\">Yes</span>\n </ng-template>\n <ng-template #noBlock>\n <span class=\"badge bg-blue-grey\">No</span>\n </ng-template>\n </ng-container>\n <span *ngIf=\"item?.pause_collection && objectKeys(item?.pause_collection)?.length\"\n class=\"ms-2\"\n [pTooltip]=\"item?.pause_collection | json\"\n tooltipPosition=\"top\">\n <i class=\"fas fa-exclamation-triangle text-warning\"></i>\n </span>\n </td>\n <td data-head=\"Billing\">\n <span class=\"badge\"\n [appDynamicBadge]=\"{\n itemsArray: billingFrequency,\n item: item?.billingFrequency\n }\"\n color=\"blue-grey\">{{ item.billingFrequency }}</span>\n </td>\n <td data-head=\"Expires\">\n <span [ngClass]=\"getExpiresAtColor(item)\">{{item?.expires_at | dateFormat}}</span><br />\n <span>{{item?.created_at | sinceAgo}}</span>\n </td>\n <td data-head=\"S#\">{{ item?.sessions_total }}</td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': item?.sessions_last_month < 3\n }\">{{ item?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Deleted\">\n <span *ngIf=\"item?.deleted_at\"\n class=\"badge bg-danger\">Yes</span>\n <span *ngIf=\"!item?.deleted_at\"\n class=\"badge bg-blue-grey\">No</span>\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li ngbTooltip=\"Edit\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.subscriptionDetails, item.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <ng-container *ngIf=\"item.deleted; else showDelete\">\n <li ngbTooltip=\"Reactivate subscription\"\n class=\"me-2 me-sm-3\"\n *rbacAllow=\"'Pages.Alpha'\"\n (keydown.enter)=\"openRecoverSubscriptionModal(item)\"\n (click)=\"openRecoverSubscriptionModal(item)\">\n <i class=\"fa fa-trash delete-icon text-success\" aria-hidden=\"true\"></i>\n </li>\n </ng-container>\n <ng-template #showDelete>\n <li ngbTooltip=\"Delete\"\n class=\"me-2 me-sm-3\"\n *rbacAllow=\"'Pages.Admin.Subscription.Delete'\"\n (keydown.enter)=\"onDelete(item)\"\n (click)=\"onDelete(item)\">\n <i class=\"fa fa-trash delete-icon\" aria-hidden=\"true\"></i>\n </li>\n </ng-template>\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<pw-no-data [withImage]=\"true\" [message]=\"'Admin.Subscriptions.NoSubscriptionMessage' | transloco\" *ngIf=\"totalRecordsUnFiltered === 0 && isLoaded\">\n</pw-no-data>\n<pw-password-validation\n #recoverSubscriptionPasswordModal\n (successEvent)=\"onRecoverConfirmed()\">\n</pw-password-validation>\n\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)}@media (min-width: 767px){.table-responsive td,.table-responsive th{font-size:11px!important}}.expires-at-width{width:8%}.custom-break-word{word-break:break-word!important}.summary .card{padding-bottom:0}.summary .card .card-body{padding-top:20px;text-align:center}.summary .card .card-body p,.summary .card .card-body h4{font-size:14px}@media (min-width: 320px) and (max-width: 720px){.primeng-datatable-container .search-filter{display:flex;flex-direction:column;gap:.5rem;justify-content:space-between}}\n"], dependencies: [{ kind: "component", type: i4.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: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "directive", type: i6.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: i7.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i8.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: i9.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.PasswordValidationComponent, selector: "pw-password-validation", inputs: ["confirmMessage"], outputs: ["successEvent"] }, { kind: "directive", type: i12.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i13.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i11.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "directive", type: i14.DynamicBadgeDirective, selector: "[appDynamicBadge]", inputs: ["appDynamicBadge", "color", "colorByName", "dataName"] }, { kind: "directive", type: i14.RbacAllowDirective, selector: "[rbacAllow]", inputs: ["rbacAllow"] }, { kind: "directive", type: i15.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: i10.JsonPipe, name: "json" }, { kind: "pipe", type: i10.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i16.TranslocoPipe, name: "transloco" }, { kind: "pipe", type: i17.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i17.SinceAgoPipe, name: "sinceAgo" }, { kind: "pipe", type: i17.TextTruncatePipe, name: "textTruncate" }] }); }
299
300
  }
300
301
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SubscriptionsListComponent, decorators: [{
301
302
  type: Component,
302
- args: [{ selector: 'pw-subscriptions-list', template: "<div class=\"row\">\n <div\n class=\"col-12 d-flex justify-content-between align-items-center\">\n <h2 class=\"card-title p-0 float-start\">Subscriptions</h2>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n id=\"btn-create\"\n [routerLink]=\"[routers.inviteUsers]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Invite a User to a Trial\n </a>\n </div>\n</div>\n<div class=\"p-2 mt-3\">\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 table-responsive mt-0\"\n [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <p-table #dt\n [value]=\"subscriptions\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [lazy]=\"true\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <ng-container *ngIf=\"subscriptionInsights\">\n <div class=\"row mb-4\">\n <ng-container *ngFor=\"let temp of objectKeys(subscriptionInsights)\">\n <div class=\"col-12 col-lg-3 mt-2 summary\">\n <div class=\"card\">\n <div class=\"card-body\">\n <ng-container *ngFor=\"let item of subscriptionInsights[temp]\">\n <div>\n <p class=\"mb-0 px-2\">{{ item?.title }}\n <span *ngIf=\"item?.info\"\n [pTooltip]=\"item?.info\">\n <i class=\"fas fa-info-circle\"></i>\n </span>\n </p>\n <h4 class=\"fw-bold mt-2 mb-2\">\n {{ item?.value }}\n </h4>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <div class=\"search-filter\">\n <div class=\"col-12 col-sm-4\">\n <p-multiSelect placeholder=\"Select Feature Keys\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n [(ngModel)]=\"selectedFeatureKeys\"\n [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-12 col-sm-4\">\n <p-dropdown\n [options]=\"subscriptionStatus\"\n [placeholder]=\"'Select status'\"\n (onChange)=\"filterByStatus($event.value)\"\n [(ngModel)]=\"status\">\n </p-dropdown>\n </div>\n <div class=\"text-end\">\n <i class=\"fa fa-search mt-2 me-2 d-none\" aria-hidden=\"true\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n pInputText\n size=\"30\"\n placeholder=\"Search Subscription...\"\n class=\"mw-90\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\" />\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Subscriptions.Id' | transloco }}\n <p-sortIcon field=\"id\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"organisation\">\n {{ 'Admin.Subscriptions.Organization' | transloco }}\n <p-sortIcon field=\"organisation\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"contact_name\">\n {{ 'Admin.Subscriptions.ContactName' | transloco }}\n <p-sortIcon field=\"contact_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"contact_email\">\n {{ 'Admin.Subscriptions.ContactEmail' | transloco }}\n <p-sortIcon field=\"contact_email\"></p-sortIcon>\n </th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.Product' | transloco }}</th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.Currency' | transloco }}</th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.PricePerMonth' | transloco }}</th>\n <th scope=\"true\"\n pSortableColumn=\"stripe_customer_id\">\n {{ 'Admin.Subscriptions.Paid' | transloco }}\n <p-sortIcon field=\"stripe_customer_id\"></p-sortIcon>\n </th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.Billing' | transloco }}</th>\n <th scope=\"true\"\n class=\"expires-at-width\">\n {{ 'Admin.Subscriptions.ExpiresAt' | transloco }}\n </th>\n <th scope=\"true\"\n pSortableColumn=\"sessions_total\">\n {{ 'Admin.Subscriptions.SessionsTotal' | transloco }}\n <p-sortIcon field=\"sessions_total\"></p-sortIcon>\n </th>\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=\"deleted_at\">\n {{ 'Admin.Subscriptions.Deleted' | transloco }}\n <p-sortIcon field=\"deleted_at\"></p-sortIcon>\n </th>\n <th class=\"actions-list-two\"\n scope=\"true\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-item>\n <tr>\n <td data-head=\"id\">{{ item.id }}</td>\n <td data-head=\"Organization\">\n <span class=\"cursor-pointer custom-break-word\"\n [pTooltip]=\"item.organisation\"\n tooltipPosition=\"top\">{{ item.organisation | textTruncate: 20 }}</span>\n </td>\n <td data-head=\"ContactName\"\n class=\"custom-break-word\">\n {{ item.contact_name }}\n </td>\n <td data-head=\"ContactEmail\">{{ item.contact_email }}</td>\n <td data-head=\"Name\">\n <span class=\"cursor-pointer custom-break-word\"\n [pTooltip]=\"item.productName\"\n tooltipPosition=\"top\">{{ item.productName }}</span>\n </td>\n <td data-head=\"Currency\">\n <span [appDynamicBadge]=\"{ itemsArray: currency, item: item.currency }\"\n color=\"blue-grey\"\n class=\"badge\">{{ item.currency }}</span>\n </td>\n <td data-head=\"Price/M\">\n <span>{{ (item.price / 100).toFixed(2) | currency:item.currency }}\n <i\n class=\"fa fa-info-circle\"\n *ngIf=\"item?.discount && objectKeys(item?.discount)?.length\"\n aria-hidden=\"true\"\n [pTooltip]=\"item?.discount | json\"\n tooltipPosition=\"top\"\n ></i>\n </span>\n </td>\n <td data-head=\"Paid\">\n <ng-container *ngIf=\"item?.unsubscribed_at\">\n <span class=\"badge bg-warning\">Unsub</span>\n </ng-container>\n <ng-container *ngIf=\"!item?.unsubscribed_at\">\n <ng-template [ngIf]=\"item?.stripe_customer_id || item?.external_payment\"\n [ngIfElse]=\"noBlock\">\n <span class=\"badge bg-success\">Yes</span>\n </ng-template>\n <ng-template #noBlock>\n <span class=\"badge bg-blue-grey\">No</span>\n </ng-template>\n </ng-container>\n <span *ngIf=\"item?.pause_collection && objectKeys(item?.pause_collection)?.length\"\n class=\"ms-2\"\n [pTooltip]=\"item?.pause_collection | json\"\n tooltipPosition=\"top\">\n <i class=\"fas fa-exclamation-triangle text-warning\"></i>\n </span>\n </td>\n <td data-head=\"Billing\">\n <span class=\"badge\"\n [appDynamicBadge]=\"{\n itemsArray: billingFrequency,\n item: item?.billingFrequency\n }\"\n color=\"blue-grey\">{{ item.billingFrequency }}</span>\n </td>\n <td data-head=\"Expires\">\n <span [ngClass]=\"getExpiresAtColor(item)\">{{item?.expires_at | dateFormat}}</span><br />\n <span>{{item?.created_at | sinceAgo}}</span>\n </td>\n <td data-head=\"S#\">{{ item?.sessions_total }}</td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': item?.sessions_last_month < 3\n }\">{{ item?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Deleted\">\n <span *ngIf=\"item?.deleted_at\"\n class=\"badge bg-danger\">Yes</span>\n <span *ngIf=\"!item?.deleted_at\"\n class=\"badge bg-blue-grey\">No</span>\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li ngbTooltip=\"Edit\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.subscriptionDetails, item.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <ng-container *ngIf=\"item.deleted; else showDelete\">\n <li ngbTooltip=\"Reactivate subscription\"\n class=\"me-2 me-sm-3\"\n *rbacAllow=\"'Pages.Alpha'\"\n (click)=\"openRecoverSubscriptionModal(item)\">\n <i class=\"fa fa-trash delete-icon text-success\" aria-hidden=\"true\"></i>\n </li>\n </ng-container>\n <ng-template #showDelete>\n <li ngbTooltip=\"Delete\"\n class=\"me-2 me-sm-3\"\n *rbacAllow=\"'Pages.Admin.Subscription.Delete'\"\n (keydown.enter)=\"onDelete(item)\"\n (click)=\"onDelete(item)\">\n <i class=\"fa fa-trash delete-icon\" aria-hidden=\"true\"></i>\n </li>\n </ng-template>\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<pw-no-data [withImage]=\"true\" [message]=\"'Admin.Subscriptions.NoSubscriptionMessage' | transloco\" *ngIf=\"totalRecordsUnFiltered === 0 && isLoaded\">\n</pw-no-data>\n<pw-password-validation\n #recoverSubscriptionPasswordModal\n (successEvent)=\"onRecoverConfirmed()\">\n</pw-password-validation>\n\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)}@media (min-width: 767px){.table-responsive td,.table-responsive th{font-size:11px!important}}.expires-at-width{width:8%}.custom-break-word{word-break:break-word!important}.summary .card{padding-bottom:0}.summary .card .card-body{padding-top:20px;text-align:center}.summary .card .card-body p,.summary .card .card-body h4{font-size:14px}@media (min-width: 320px) and (max-width: 720px){.primeng-datatable-container .search-filter{display:flex;flex-direction:column;gap:.5rem;justify-content:space-between}}\n"] }]
303
+ args: [{ selector: 'pw-subscriptions-list', template: "<div class=\"row\">\n <div\n class=\"col-12 d-flex justify-content-between align-items-center\">\n <h2 class=\"card-title p-0 float-start\">Subscriptions</h2>\n <a class=\"btn btn-sm btn-outline-primary float-end\"\n id=\"btn-create\"\n [routerLink]=\"[routers.inviteUsers]\">\n <i class=\"fa fa-plus-circle\" aria-hidden=\"true\"></i> Invite a User to a Trial\n </a>\n </div>\n</div>\n<div class=\"p-2 mt-3\">\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 table-responsive mt-0\"\n [class.hideTable]=\"totalRecordsUnFiltered === 0\">\n <p-table #dt\n [value]=\"subscriptions\"\n [paginator]=\"totalRecords !== 0\"\n [rows]=\"PAGE_SIZE\"\n [lazy]=\"true\"\n [totalRecords]=\"totalRecords\"\n [loading]=\"loading\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\"\n [customSort]=\"true\">\n <ng-template pTemplate=\"caption\">\n <ng-container *ngIf=\"subscriptionInsights\">\n <div class=\"row mb-4\">\n <ng-container *ngFor=\"let temp of objectKeys(subscriptionInsights)\">\n <div class=\"col-12 col-lg-3 mt-2 summary\">\n <div class=\"card\">\n <div class=\"card-body\">\n <ng-container *ngFor=\"let item of subscriptionInsights[temp]\">\n <div>\n <p class=\"mb-0 px-2\">{{ item?.title }}\n <span *ngIf=\"item?.info\"\n [pTooltip]=\"item?.info\">\n <i class=\"fas fa-info-circle\"></i>\n </span>\n </p>\n <h4 class=\"fw-bold mt-2 mb-2\">\n {{ item?.value }}\n </h4>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <div class=\"search-filter\">\n <div class=\"col-12 col-sm-4\">\n <p-multiSelect placeholder=\"Select Feature Keys\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n [(ngModel)]=\"selectedFeatureKeys\"\n [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event)\"\n appendTo=\"body\">\n </p-multiSelect>\n </div>\n <div class=\"col-12 col-sm-4\">\n <p-dropdown\n [options]=\"subscriptionStatus\"\n [placeholder]=\"'Select status'\"\n (onChange)=\"filterByStatus($event.value)\"\n [(ngModel)]=\"status\">\n </p-dropdown>\n </div>\n <div class=\"text-end\">\n <i class=\"fa fa-search mt-2 me-2 d-none\" aria-hidden=\"true\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n pInputText\n size=\"30\"\n placeholder=\"Search Subscription...\"\n class=\"mw-90\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\" />\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\"\n pSortableColumn=\"id\">\n {{ 'Admin.Subscriptions.Id' | transloco }}\n <p-sortIcon field=\"id\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"organisation\">\n {{ 'Admin.Subscriptions.Organization' | transloco }}\n <p-sortIcon field=\"organisation\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"contact_name\">\n {{ 'Admin.Subscriptions.ContactName' | transloco }}\n <p-sortIcon field=\"contact_name\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"contact_email\">\n {{ 'Admin.Subscriptions.ContactEmail' | transloco }}\n <p-sortIcon field=\"contact_email\"></p-sortIcon>\n </th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.Product' | transloco }}</th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.Currency' | transloco }}</th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.PricePerMonth' | transloco }}</th>\n <th scope=\"true\"\n pSortableColumn=\"stripe_customer_id\">\n {{ 'Admin.Subscriptions.Paid' | transloco }}\n <p-sortIcon field=\"stripe_customer_id\"></p-sortIcon>\n </th>\n <th scope=\"true\">{{ 'Admin.Subscriptions.Billing' | transloco }}</th>\n <th scope=\"true\"\n class=\"expires-at-width\">\n {{ 'Admin.Subscriptions.ExpiresAt' | transloco }}\n </th>\n <th scope=\"true\"\n pSortableColumn=\"sessions_total\">\n {{ 'Admin.Subscriptions.SessionsTotal' | transloco }}\n <p-sortIcon field=\"sessions_total\"></p-sortIcon>\n </th>\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=\"deleted_at\">\n {{ 'Admin.Subscriptions.Deleted' | transloco }}\n <p-sortIcon field=\"deleted_at\"></p-sortIcon>\n </th>\n <th class=\"actions-list-two\"\n scope=\"true\">{{ 'Label.Actions' | transloco }}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-item>\n <tr>\n <td data-head=\"id\">{{ item.id }}</td>\n <td data-head=\"Organization\">\n <span class=\"cursor-pointer custom-break-word\"\n [pTooltip]=\"item.organisation\"\n tooltipPosition=\"top\">{{ item.organisation | textTruncate: 20 }}</span>\n </td>\n <td data-head=\"ContactName\"\n class=\"custom-break-word\">\n {{ item.contact_name }}\n </td>\n <td data-head=\"ContactEmail\">{{ item.contact_email }}</td>\n <td data-head=\"Name\">\n <span class=\"cursor-pointer custom-break-word\"\n [pTooltip]=\"item.productName\"\n tooltipPosition=\"top\">{{ item.productName }}</span>\n </td>\n <td data-head=\"Currency\">\n <span [appDynamicBadge]=\"{ itemsArray: currency, item: item.currency }\"\n color=\"blue-grey\"\n class=\"badge\">{{ item.currency }}</span>\n </td>\n <td data-head=\"Price/M\">\n <span>{{ (item.price / 100).toFixed(2) | currency:item.currency }}\n <i\n class=\"fa fa-info-circle\"\n *ngIf=\"item?.discount && objectKeys(item?.discount)?.length\"\n aria-hidden=\"true\"\n [pTooltip]=\"item?.discount | json\"\n tooltipPosition=\"top\"\n ></i>\n </span>\n </td>\n <td data-head=\"Paid\">\n <ng-container *ngIf=\"item?.unsubscribed_at\">\n <span class=\"badge bg-warning\">Unsub</span>\n </ng-container>\n <ng-container *ngIf=\"!item?.unsubscribed_at\">\n <ng-template [ngIf]=\"item?.stripe_customer_id || item?.external_payment\"\n [ngIfElse]=\"noBlock\">\n <span class=\"badge bg-success\">Yes</span>\n </ng-template>\n <ng-template #noBlock>\n <span class=\"badge bg-blue-grey\">No</span>\n </ng-template>\n </ng-container>\n <span *ngIf=\"item?.pause_collection && objectKeys(item?.pause_collection)?.length\"\n class=\"ms-2\"\n [pTooltip]=\"item?.pause_collection | json\"\n tooltipPosition=\"top\">\n <i class=\"fas fa-exclamation-triangle text-warning\"></i>\n </span>\n </td>\n <td data-head=\"Billing\">\n <span class=\"badge\"\n [appDynamicBadge]=\"{\n itemsArray: billingFrequency,\n item: item?.billingFrequency\n }\"\n color=\"blue-grey\">{{ item.billingFrequency }}</span>\n </td>\n <td data-head=\"Expires\">\n <span [ngClass]=\"getExpiresAtColor(item)\">{{item?.expires_at | dateFormat}}</span><br />\n <span>{{item?.created_at | sinceAgo}}</span>\n </td>\n <td data-head=\"S#\">{{ item?.sessions_total }}</td>\n <td data-head=\"S/m #\">\n <span [ngClass]=\"{\n 'text-danger fw-bold': item?.sessions_last_month < 3\n }\">{{ item?.sessions_last_month }}</span>\n </td>\n <td data-head=\"Deleted\">\n <span *ngIf=\"item?.deleted_at\"\n class=\"badge bg-danger\">Yes</span>\n <span *ngIf=\"!item?.deleted_at\"\n class=\"badge bg-blue-grey\">No</span>\n </td>\n <td data-head=\"Action\">\n <ul class=\"list-unstyled list-inline list-action\">\n <li ngbTooltip=\"Edit\"\n class=\"me-2 me-sm-3\"\n [routerLink]=\"[routers.subscriptionDetails, item.id]\">\n <i class=\"fa fa-edit edit-icon\" aria-hidden=\"true\"></i>\n </li>\n <ng-container *ngIf=\"item.deleted; else showDelete\">\n <li ngbTooltip=\"Reactivate subscription\"\n class=\"me-2 me-sm-3\"\n *rbacAllow=\"'Pages.Alpha'\"\n (keydown.enter)=\"openRecoverSubscriptionModal(item)\"\n (click)=\"openRecoverSubscriptionModal(item)\">\n <i class=\"fa fa-trash delete-icon text-success\" aria-hidden=\"true\"></i>\n </li>\n </ng-container>\n <ng-template #showDelete>\n <li ngbTooltip=\"Delete\"\n class=\"me-2 me-sm-3\"\n *rbacAllow=\"'Pages.Admin.Subscription.Delete'\"\n (keydown.enter)=\"onDelete(item)\"\n (click)=\"onDelete(item)\">\n <i class=\"fa fa-trash delete-icon\" aria-hidden=\"true\"></i>\n </li>\n </ng-template>\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<pw-no-data [withImage]=\"true\" [message]=\"'Admin.Subscriptions.NoSubscriptionMessage' | transloco\" *ngIf=\"totalRecordsUnFiltered === 0 && isLoaded\">\n</pw-no-data>\n<pw-password-validation\n #recoverSubscriptionPasswordModal\n (successEvent)=\"onRecoverConfirmed()\">\n</pw-password-validation>\n\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)}@media (min-width: 767px){.table-responsive td,.table-responsive th{font-size:11px!important}}.expires-at-width{width:8%}.custom-break-word{word-break:break-word!important}.summary .card{padding-bottom:0}.summary .card .card-body{padding-top:20px;text-align:center}.summary .card .card-body p,.summary .card .card-body h4{font-size:14px}@media (min-width: 320px) and (max-width: 720px){.primeng-datatable-container .search-filter{display:flex;flex-direction:column;gap:.5rem;justify-content:space-between}}\n"] }]
303
304
  }], ctorParameters: () => [{ type: i1.ProductService }, { type: i2.AdminService }, { type: i3.UntypedFormBuilder }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: i1.CommonService }], propDecorators: { refProduct: [{
304
305
  type: ViewChild,
305
306
  args: ['refProduct']
@@ -307,4 +308,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
307
308
  type: ViewChild,
308
309
  args: ['recoverSubscriptionPasswordModal', { static: false }]
309
310
  }] } });
310
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9ucy1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYWRtaW4tbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9zdWJzY3JpcHRpb25zL3N1YnNjcmlwdGlvbnMtbGlzdC9zdWJzY3JpcHRpb25zLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hZG1pbi1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3N1YnNjcmlwdGlvbnMvc3Vic2NyaXB0aW9ucy1saXN0L3N1YnNjcmlwdGlvbnMtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUVILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUdSLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQW9CLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RixPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTFFLE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JD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QTs7NEZEbk9hLDBCQUEwQjtrQkFMdEMsU0FBUzsrQkFDSSx1QkFBdUI7a09BUVIsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUV2QixnQ0FBZ0M7c0JBRC9CLFNBQVM7dUJBQUMsa0NBQWtDLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgSW5qZWN0b3IsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgQWRtaW5TZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2FkbWluLW1vZHVsZS11dGlscyc7XG5pbXBvcnQgeyBBcHBCYXNlQ29tcG9uZW50IH0gZnJvbSAnQHBvc2l3aXNlL2FwcC1iYXNlLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlLCBQZXJtaXNzaW9uU2VydmljZSwgUHJvZHVjdFNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXNlcnZpY2VzJztcbmltcG9ydCB7IFBBR0VfU0laRSwgUGFnaW5nIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi11dGlsaXRpZXMnO1xuaW1wb3J0IHsgSGVscGVyU2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9oZWxwZXItc2VydmljZSc7XG5pbXBvcnQgeyBQYXNzd29yZFZhbGlkYXRpb25Db21wb25lbnQgfSBmcm9tICdAcG9zaXdpc2Uvc2hhcmVkLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQgZ3JvdXBCeSBmcm9tICdsb2Rhc2gvZ3JvdXBCeSc7XG5pbXBvcnQgdW5pcUJ5IGZyb20gJ2xvZGFzaC91bmlxQnknO1xuaW1wb3J0IHsgTGF6eUxvYWRFdmVudCB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IEF1dG9Db21wbGV0ZSB9IGZyb20gJ3ByaW1lbmcvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHN3YWwgZnJvbSAnc3dlZXRhbGVydDInO1xuXG5pbXBvcnQgeyBGZWF0dXJlS2V5IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZS9uZXdzbGV0dGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBST1VURVJTIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3JvdXRlcnMvcm91dGVycyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncHctc3Vic2NyaXB0aW9ucy1saXN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc3Vic2NyaXB0aW9ucy1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zdWJzY3JpcHRpb25zLWxpc3QuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTdWJzY3JpcHRpb25zTGlzdENvbXBvbmVudFxuICAgIGV4dGVuZHMgQXBwQmFzZUNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWRcbntcbiAgICBAVmlld0NoaWxkKCdyZWZQcm9kdWN0JykgcmVmUHJvZHVjdDogQXV0b0NvbXBsZXRlO1xuICAgIEBWaWV3Q2hpbGQoJ3JlY292ZXJTdWJzY3JpcHRpb25QYXNzd29yZE1vZGFsJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcmVjb3ZlclN1YnNjcmlwdGlvblBhc3N3b3JkTW9kYWw6IFBhc3N3b3JkVmFsaWRhdGlvbkNvbXBvbmVudDtcblxuICAgIHJlY292ZXJpbmdJdGVtO1xuXG4gICAgb3JnYW5pemF0aW9uU2l6ZXMkOiBPYnNlcnZhYmxlPEZlYXR1cmVLZXlbXT47XG4gICAgb3JnYW5pemF0aW9uVHlwZXMkOiBPYnNlcnZhYmxlPEZlYXR1cmVLZXlbXT47XG4gICAgb3JnYW5pemF0aW9uSW5kdXN0cmllcyQ6IE9ic2VydmFibGU8RmVhdHVyZUtleVtdPjtcblxuICAgIHRvdGFsUmVjb3JkcyA9IDA7XG5cbiAgICBsb2FkaW5nID0gdHJ1ZTtcblxuICAgIHNlYXJjaFRleHQgPSAnJztcblxuICAgIHN1YnNjcmlwdGlvbnMgPSBbXTtcblxuICAgIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG5cbiAgICBzaG93SW52aXRlRm9ybSA9IGZhbHNlO1xuXG4gICAgcHJvZHVjdHMgPSBbXTtcblxuICAgIHNlYXJjaE9wdGlvbnM6IHsgaWQ6IHVua25vd247IGxhYmVsOiB1bmtub3duIH1bXSA9IFtdO1xuXG4gICAgZmlsdGVyQnlGZWF0dXJlS2V5cyA9IFtdO1xuXG4gICAgaXNMb2FkZWQgPSB0cnVlO1xuXG4gICAgcHJpdmF0ZSBwYWdlID0gMTtcblxuICAgIGJpbGxpbmdGcmVxdWVuY3kgPSBbJ3dlZWsnLCAnbW9udGgnLCAneWVhciddO1xuXG4gICAgcm91dGVycyA9IFJPVVRFUlM7XG5cbiAgICBzdWJzY3JpcHRpb25TdGF0dXMgPSBbJ2FsbCcsICdleHBpcmVkJywgJ2FjdGl2ZScsICdwYWlkJ107XG5cbiAgICBzdGF0dXMgPSAnJztcbiAgICB1bml0c1RleHQgPSAnJztcblxuICAgIHN1YnNjcmlwdGlvbklkOiBudW1iZXI7XG5cbiAgICB0b3RhbFJlY29yZHNVbkZpbHRlcmVkID0gMDtcblxuICAgIGZpbHRlcmVkUHJvZHVjdHMgPSBbXTtcblxuICAgIGN1cnJlbmN5ID0gW107XG5cbiAgICBvYmplY3RLZXlzID0gT2JqZWN0LmtleXM7XG5cbiAgICBidXR0b25CdXN5ID0gZmFsc2U7XG5cbiAgICBzZWxlY3RlZEZlYXR1cmVLZXlzOiBGZWF0dXJlS2V5W107XG4gICAgc3Vic2NyaXB0aW9uSW5zaWdodHM6IEZlYXR1cmVLZXlbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHByb2R1Y3RTZXJ2aWNlOiBQcm9kdWN0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhZG1pblNlcnZpY2U6IEFkbWluU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBmYjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBwcm9kdWN0X2lkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgZmlyc3RfbmFtZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIGxhc3RfbmFtZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIGVtYWlsOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLmVtYWlsXV0sXG4gICAgICAgICAgICBvcmdhbml6YXRpb25faW5kdXN0cnlfaWQ6IFsnJ10sXG4gICAgICAgICAgICBvcmdhbml6YXRpb25fdHlwZV9pZDogWycnXSxcbiAgICAgICAgICAgIG9yZ2FuaXphdGlvbl9zaXplX2lkOiBbJyddLFxuICAgICAgICAgICAgbmFtZTogWycnXSxcbiAgICAgICAgICAgIHVuaXRzOiBbJyddLFxuICAgICAgICAgICAgbWluX3VuaXRzOiBbJyddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdldFRhYmxlU3RhdGUoKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25JbmR1c3RyaWVzJCA9IHRoaXMuY29tbW9uU2VydmljZS5nZXRPcmdhbml6YXRpb25JbmR1c3RyaWVzKCk7XG4gICAgICAgIHRoaXMub3JnYW5pemF0aW9uVHlwZXMkID0gdGhpcy5jb21tb25TZXJ2aWNlLmdldE9yZ2FuaXphdGlvblR5cGVzKCk7XG4gICAgICAgIHRoaXMub3JnYW5pemF0aW9uU2l6ZXMkID0gdGhpcy5jb21tb25TZXJ2aWNlLmdldE9yZ2FuaXphdGlvblNpemVzKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSBQZXJtaXNzaW9uU2VydmljZS5zZWxlY3RlZFN1YnNjcmlwdGlvbj8uaWQ7XG4gICAgICAgIHRoaXMuZ2V0U3VwcG9ydGVkQ3VycmVuY3koKTtcbiAgICAgICAgdGhpcy5nZXRQcm9kdWN0c0xpc3QoKTtcbiAgICAgICAgdGhpcy5nZXRNaW5NYXhVbml0cygpO1xuICAgIH1cbiAgICBvcGVuUmVjb3ZlclN1YnNjcmlwdGlvbk1vZGFsKGl0ZW0pIHtcbiAgICAgICAgdGhpcy5yZWNvdmVyaW5nSXRlbSA9IGl0ZW07XG4gICAgICAgIHRoaXMucmVjb3ZlclN1YnNjcmlwdGlvblBhc3N3b3JkTW9kYWwuY29uZmlybU1lc3NhZ2UgPSAnQWRtaW4uU3Vic2NyaXB0aW9ucy5Db25maXJtUmVjb3Zlcic7XG4gICAgICAgIHRoaXMucmVjb3ZlclN1YnNjcmlwdGlvblBhc3N3b3JkTW9kYWwub3BlbigpO1xuICAgIH1cblxuICAgIG9uUmVjb3ZlckNvbmZpcm1lZCgpIHtcbiAgICAgICAgdGhpcy5idXR0b25CdXN5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hZG1pblNlcnZpY2VcbiAgICAgICAgICAgIC5yZWNvdmVyRGVsZXRlZFN1YnNjcmlwdGlvbih0aGlzLnJlY292ZXJpbmdJdGVtLmlkLCB0aGlzLnN1YnNjcmlwdGlvbklkKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKCdTdWJzY3JpcHRpb24gcmVjb3ZlcmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YSh7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkUsXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hUZXh0IHx8ICcnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5idXR0b25CdXN5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvdmVyaW5nSXRlbSA9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRUYWJsZVN0YXRlKCkge1xuICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtJCgnc3Vic2NyaXB0aW9uLWxpc3Qtc3RhdGUnKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKHJlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gcmVzdWx0Py5zZWFyY2hUZXh0IHx8ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gcmVzdWx0Py5zdGF0dXMgfHwgJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZlYXR1cmVLZXlzID0gcmVzdWx0Py5mZWF0dXJlS2V5cyB8fCBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckJ5RmVhdHVyZUtleXMgPSB0aGlzLnNlbGVjdGVkRmVhdHVyZUtleXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIG9uTGF6eUxvYWQoZXZlbnQ6IExhenlMb2FkRXZlbnQpIHtcbiAgICAgICAgY29uc3QgcGFnZURldGFpbHMgPSBIZWxwZXJTZXJ2aWNlLm9uVGFibGVMYXp5TG9hZChldmVudCk7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2VEZXRhaWxzLnBhZ2U7XG4gICAgICAgIHRoaXMuZ2V0RGF0YSh7XG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRSxcbiAgICAgICAgICAgIG9yZGVyX2J5OiBwYWdlRGV0YWlscy5zb3J0RmllbGQsXG4gICAgICAgICAgICBvcmRlcl9kaXJlY3Rpb246IHBhZ2VEZXRhaWxzLnNvcnRPcmRlcixcbiAgICAgICAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hUZXh0XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFN1cHBvcnRlZEN1cnJlbmN5KCkge1xuICAgICAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlLmdldFN1cHBvcnRlZEN1cnJlbmN5KCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbmN5ID0gcmVzPy5yZWdpb25zO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRNaW5NYXhVbml0cygpIHtcbiAgICAgICAgdGhpcy5mb3JtLmdldCgncHJvZHVjdF9pZCcpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICAgICAgICB0aGlzLnVuaXRzVGV4dCA9IHg/LnVuaXRzVGV4dCB8fCAnJztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREYXRhKHBhZ2luZzogUGFnaW5nKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0U3Vic2NyaXB0aW9ucyhcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckJ5RmVhdHVyZUtleXMubWFwKGtleSA9PiBrZXkuaWQpLmpvaW4oKSB8fCAnJyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyB8fCAnJyxcbiAgICAgICAgICAgICAgICBwYWdpbmcsXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25JZCB8fCBudWxsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3Vic2NyaXB0aW9ucyAmJiByZXNwb25zZS5zdWJzY3JpcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24ucHJvZHVjdHMuZm9yRWFjaChwcm9kdWN0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24ucHJvZHVjdElkID0gcHJvZHVjdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24ucHJvZHVjdE5hbWUgPSBwcm9kdWN0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmFjdGl2ZSA9IHByb2R1Y3QuYWN0aXZlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5iaWxsaW5nRnJlcXVlbmN5ID0gcHJvZHVjdC5iaWxsaW5nX2ZyZXF1ZW5jeTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24ucHJpY2VQZXJVbml0ID0gcHJvZHVjdC5wcmljZV9wZXJfdW5pdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uY3VycmVuY3kgPSBwcm9kdWN0LmN1cnJlbmN5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IHVuaXFCeSh0aGlzLnN1YnNjcmlwdGlvbnMsICdpZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkluc2lnaHRzID0gcmVzcG9uc2U/LnN1YnNjcmlwdGlvbl9pbnNpZ2h0cztcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsUmVjb3JkcyA9IHJlc3BvbnNlLm9iamVjdF9jb3VudCB8fCAwO1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWxSZWNvcmRzVW5GaWx0ZXJlZCA9IHJlc3BvbnNlPy51bmZpbHRlcmVkX2NvdW50O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25EZWxldGUoaXRlbSkge1xuICAgICAgICBzd2FsLmZpcmUoe1xuICAgICAgICAgICAgdGl0bGU6ICdEZWxldGUnLFxuICAgICAgICAgICAgdGV4dDogYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlICR7aXRlbT8ucHJvZHVjdE5hbWV9IHN1YnNjcmlwdGlvbiBmb3IgdGhlIGN1c3RvbWVyICR7aXRlbS5jb250YWN0X2VtYWlsfSA/YCxcbiAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXG4gICAgICAgICAgICByZXZlcnNlQnV0dG9uczogdHJ1ZSxcbiAgICAgICAgICAgIGljb246ICd3YXJuaW5nJ1xuICAgICAgICB9KS50aGVuKHJlcCA9PiB7XG4gICAgICAgICAgICBpZiAocmVwLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdwcm9kdWN0X2lkJywgaXRlbS5wcm9kdWN0SWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5kZWxldGVTdWJzY3JpcHRpb24oaXRlbS5pZCwgeyBwYXJhbXM6IGh0dHBQYXJhbXMgfSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSB0aGlzLnN1YnNjcmlwdGlvbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPT4geC5wcm9kdWN0SWQgIT09IGl0ZW0ucHJvZHVjdElkXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b3RhbFJlY29yZHMtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uLnRyYW5zbGF0ZSgnQWRtaW4uU3Vic2NyaXB0aW9ucy5EZWxldGVkTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcm9kdWN0c0xpc3QoKSB7XG4gICAgICAgIHRoaXMucHJvZHVjdFNlcnZpY2UuZ2V0UHJvZHVjdExpc3Qoe30sIHRoaXMuc3Vic2NyaXB0aW9uSWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlS2V5cyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICAgICAgbmV3IFNldChyZXNwb25zZS5wcm9kdWN0cy5tYXAoaXRlbSA9PiBpdGVtLmZlYXR1cmVfa2V5KSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaE9wdGlvbnMgPSBmZWF0dXJlS2V5cy5tYXAoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlbGVtZW50IHx8ICcnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblNlYXJjaE9wdGlvbkNoYW5nZShldmVudCkge1xuICAgICAgICB0aGlzLmZpbHRlckJ5RmVhdHVyZUtleXMgPSBldmVudC52YWx1ZTtcblxuICAgICAgICB0aGlzLmdldERhdGEoe1xuICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkUsXG4gICAgICAgICAgICBzZWFyY2g6IHRoaXMuc2VhcmNoVGV4dCB8fCAnJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmaWx0ZXJCeVN0YXR1cyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gdmFsdWUgfHwgJyc7XG4gICAgICAgIHRoaXMuZ2V0RGF0YSh7XG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRSxcbiAgICAgICAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hUZXh0IHx8ICcnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNvcnRPYmoob2JqKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgICAgICAgLnJlZHVjZSgocmVzdWx0LCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgfVxuXG4gICAgc2VhcmNoUHJvZHVjdChldmVudCkge1xuICAgICAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0UHJvZHVjdExpc3QoeyBzZWFyY2g6IGV2ZW50LnF1ZXJ5IH0sIHRoaXMuc3Vic2NyaXB0aW9uSWQpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkUHJvZHVjdHMgPSB0aGlzLmdyb3VwUHJvZHVjdHMocmVzcG9uc2UucHJvZHVjdHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Qcm9kdWN0Q2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHByb2R1Y3RJZCA9IE51bWJlcihldmVudD8udmFsdWUuaWQpO1xuICAgICAgICBjb25zdCBwcm9kdWN0T2JqID0gdGhpcy5maWx0ZXJlZFByb2R1Y3RzLmZpbmQoeCA9PiB4LmlkID09PSBwcm9kdWN0SWQpO1xuICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICBwcm9kdWN0X2lkOiBwcm9kdWN0T2JqXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uUHJvZHVjdENsZWFyKF9ldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMucmVmUHJvZHVjdC5pbnB1dEVMLm5hdGl2ZUVsZW1lbnQudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3Byb2R1Y3RfaWQnKS5zZXRWYWx1ZSgnJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdyb3VwUHJvZHVjdHMocHJvZHVjdHMpIHtcbiAgICAgICAgaWYgKHByb2R1Y3RzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHByb2R1Y3RzID0gcHJvZHVjdHMuZmlsdGVyKHggPT4geC5kZXBlbmRlbmN5X3Byb2R1Y3RzPy5sZW5ndGggPCAxICYmIHguYWN0aXZlKTtcbiAgICAgICAgICAgIHByb2R1Y3RzID0gZ3JvdXBCeShwcm9kdWN0cywgJ2N1cnJlbmN5Jyk7XG4gICAgICAgICAgICBwcm9kdWN0cyA9IHRoaXMuc29ydE9iaihwcm9kdWN0cyk7XG4gICAgICAgICAgICBsZXQgZ3JvdXBlZEFycmF5ID0gW107XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgICAgIGZvciAoY29uc3QgcCBpbiBwcm9kdWN0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvZHVjdHNbcF0uc29ydChcbiAgICAgICAgICAgICAgICAgICAgKGEsIGIpID0+IE51bWJlcihiLnByaWNlX3Blcl91bml0KSAtIE51bWJlcihhLnByaWNlX3Blcl91bml0KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZ3JvdXBlZEFycmF5LnB1c2goLi4udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JvdXBlZEFycmF5ID1cbiAgICAgICAgICAgICAgICBncm91cGVkQXJyYXk/Lm1hcCh4ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB4LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGAke3gubmFtZX0gfCAke3gucmVnaW9ufSB8ICR7eC5iaWxsaW5nX2ZyZXF1ZW5jeX0gfCAke3gubWluX3VuaXRzfSB4ICR7KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgucHJpY2VfcGVyX3VuaXQgLyAxMDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkudG9GaXhlZCgyKX0gfCAke3guY3VycmVuY3l9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzVGV4dDogYChtaW4gJHt4Lm1pbl91bml0c30gLSBtYXggJHt4Lm1heF91bml0c30pYFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pIHx8IFtdO1xuXG4gICAgICAgICAgICByZXR1cm4gZ3JvdXBlZEFycmF5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGdldEV4cGlyZXNBdENvbG9yKGl0ZW0pIHtcbiAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IG1vbnRoQmVmb3JlID0gZC5zZXRNb250aChkLmdldE1vbnRoKCkgLSAxKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ3RleHQtZGFuZ2VyIGZ3LWJvbGQnOiBuZXcgRGF0ZShpdGVtLmV4cGlyZXNfYXQpIDwgbmV3IERhdGUoKSxcbiAgICAgICAgICAgICd0ZXh0LXdhcm5pbmcgdGV4dC1ib2xkLTcwMCc6XG4gICAgICAgICAgICAgICAgaXRlbS5iaWxsaW5nRnJlcXVlbmN5ID09PSAneWVhcicgJiZcbiAgICAgICAgICAgICAgICBuZXcgRGF0ZShpdGVtLmV4cGlyZXNfYXQpIDwgbmV3IERhdGUobW9udGhCZWZvcmUpICYmXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoaXRlbS5leHBpcmVzX2F0KSA+IG5ldyBEYXRlKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIHNlYXJjaFRleHQ6IHRoaXMuc2VhcmNoVGV4dCxcbiAgICAgICAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICAgICAgICBmZWF0dXJlS2V5czogdGhpcy5maWx0ZXJCeUZlYXR1cmVLZXlzXG4gICAgICAgIH07XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzdWJzY3JpcHRpb24tbGlzdC1zdGF0ZScsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgY29uc3Qgbm90aWZpZXIgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICB0aGlzLnJvdXRlci5ldmVudHMucGlwZSh0YWtlVW50aWwobm90aWZpZXIpKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICAgICAgICAgIGlmICghZXZlbnQudXJsQWZ0ZXJSZWRpcmVjdHMuaW5jbHVkZXMoJy9zdWJzY3JpcHRpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtJCgnc3Vic2NyaXB0aW9uLWxpc3Qtc3RhdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpZXIubmV4dCgnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicm93XCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNvbC0xMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgPGgyIGNsYXNzPVwiY2FyZC10aXRsZSBwLTAgZmxvYXQtc3RhcnRcIj5TdWJzY3JpcHRpb25zPC9oMj5cbiAgICA8YSBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtcHJpbWFyeSBmbG9hdC1lbmRcIlxuICAgICAgaWQ9XCJidG4tY3JlYXRlXCJcbiAgICAgIFtyb3V0ZXJMaW5rXT1cIltyb3V0ZXJzLmludml0ZVVzZXJzXVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzLWNpcmNsZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4gSW52aXRlIGEgVXNlciB0byBhIFRyaWFsXG4gICAgPC9hPlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInAtMiBtdC0zXCI+XG4gIDxkaXYgY2xhc3M9XCJ3LTEwMCB0ZXh0LWNlbnRlciBtdC0zXCI+XG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFpc0xvYWRlZFwiPlxuICAgICAgPHAtcHJvZ3Jlc3NTcGlubmVyPiA8L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicHJpbWVuZy1kYXRhdGFibGUtY29udGFpbmVyIHRhYmxlLXJlc3BvbnNpdmUgbXQtMFwiXG4gICAgW2NsYXNzLmhpZGVUYWJsZV09XCJ0b3RhbFJlY29yZHNVbkZpbHRlcmVkID09PSAwXCI+XG4gICAgPHAtdGFibGUgI2R0XG4gICAgICBbdmFsdWVdPVwic3Vic2NyaXB0aW9uc1wiXG4gICAgICBbcGFnaW5hdG9yXT1cInRvdGFsUmVjb3JkcyAhPT0gMFwiXG4gICAgICBbcm93c109XCJQQUdFX1NJWkVcIlxuICAgICAgW2xhenldPVwidHJ1ZVwiXG4gICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3Jkc1wiXG4gICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICAgIFtmaWx0ZXJEZWxheV09XCIxMDAwXCJcbiAgICAgIChvbkxhenlMb2FkKT1cIm9uTGF6eUxvYWQoJGV2ZW50KVwiXG4gICAgICBbY3VzdG9tU29ydF09XCJ0cnVlXCI+XG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3Vic2NyaXB0aW9uSW5zaWdodHNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRlbXAgb2Ygb2JqZWN0S2V5cyhzdWJzY3JpcHRpb25JbnNpZ2h0cylcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbGctMyBtdC0yIHN1bW1hcnlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHN1YnNjcmlwdGlvbkluc2lnaHRzW3RlbXBdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMCBweC0yXCI+e3sgaXRlbT8udGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5pbmZvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiaXRlbT8uaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWluZm8tY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJmdy1ib2xkIG10LTIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtPy52YWx1ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtZmlsdGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tNFwiPlxuICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgcGxhY2Vob2xkZXI9XCJTZWxlY3QgRmVhdHVyZSBLZXlzXCJcbiAgICAgICAgICAgICAgW3Nob3dUb2dnbGVBbGxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtzaG93SGVhZGVyXT1cInRydWVcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmVhdHVyZUtleXNcIlxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJzZWFyY2hPcHRpb25zXCJcbiAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uU2VhcmNoT3B0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIj5cbiAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS00XCI+XG4gICAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJzdWJzY3JpcHRpb25TdGF0dXNcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBzdGF0dXMnXCJcbiAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cImZpbHRlckJ5U3RhdHVzKCRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXR1c1wiPlxuICAgICAgICAgICAgPC9wLWRyb3Bkb3duPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVuZFwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2ggbXQtMiBtZS0yIGQtbm9uZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgc2l6ZT1cIjMwXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggU3Vic2NyaXB0aW9uLi4uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtdy05MFwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJkdC5maWx0ZXJHbG9iYWwoJGV2ZW50LnRhcmdldC52YWx1ZSwgJ2NvbnRhaW5zJylcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImlkXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uU3Vic2NyaXB0aW9ucy5JZCcgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwiaWRcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cIm9yZ2FuaXNhdGlvblwiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlN1YnNjcmlwdGlvbnMuT3JnYW5pemF0aW9uJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJvcmdhbmlzYXRpb25cIj48L3Atc29ydEljb24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImNvbnRhY3RfbmFtZVwiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlN1YnNjcmlwdGlvbnMuQ29udGFjdE5hbWUnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cImNvbnRhY3RfbmFtZVwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwiY29udGFjdF9lbWFpbFwiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlN1YnNjcmlwdGlvbnMuQ29udGFjdEVtYWlsJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJjb250YWN0X2VtYWlsXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiPnt7ICdBZG1pbi5TdWJzY3JpcHRpb25zLlByb2R1Y3QnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0FkbWluLlN1YnNjcmlwdGlvbnMuQ3VycmVuY3knIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0FkbWluLlN1YnNjcmlwdGlvbnMuUHJpY2VQZXJNb250aCcgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwic3RyaXBlX2N1c3RvbWVyX2lkXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uU3Vic2NyaXB0aW9ucy5QYWlkJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJzdHJpcGVfY3VzdG9tZXJfaWRcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0FkbWluLlN1YnNjcmlwdGlvbnMuQmlsbGluZycgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJleHBpcmVzLWF0LXdpZHRoXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uU3Vic2NyaXB0aW9ucy5FeHBpcmVzQXQnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cInNlc3Npb25zX3RvdGFsXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uU3Vic2NyaXB0aW9ucy5TZXNzaW9uc1RvdGFsJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJzZXNzaW9uc190b3RhbFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwic2Vzc2lvbnNfbGFzdF9tb250aFwiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlN1YnNjcmlwdGlvbnMuU2Vzc2lvbnNUb3RhbExhc3RNb250aCcgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwic2Vzc2lvbnNfbGFzdF9tb250aFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwiZGVsZXRlZF9hdFwiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlN1YnNjcmlwdGlvbnMuRGVsZXRlZCcgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwiZGVsZXRlZF9hdFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBjbGFzcz1cImFjdGlvbnMtbGlzdC10d29cIlxuICAgICAgICAgICAgc2NvcGU9XCJ0cnVlXCI+e3sgJ0xhYmVsLkFjdGlvbnMnIHwgdHJhbnNsb2NvIH19PC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiXG4gICAgICAgIGxldC1pdGVtPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cImlkXCI+e3sgaXRlbS5pZCB9fTwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIk9yZ2FuaXphdGlvblwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBjdXN0b20tYnJlYWstd29yZFwiXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJpdGVtLm9yZ2FuaXNhdGlvblwiXG4gICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPnt7IGl0ZW0ub3JnYW5pc2F0aW9uIHwgdGV4dFRydW5jYXRlOiAyMCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDb250YWN0TmFtZVwiXG4gICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1icmVhay13b3JkXCI+XG4gICAgICAgICAgICB7eyBpdGVtLmNvbnRhY3RfbmFtZSB9fVxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkNvbnRhY3RFbWFpbFwiPnt7IGl0ZW0uY29udGFjdF9lbWFpbCB9fTwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIk5hbWVcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgY3VzdG9tLWJyZWFrLXdvcmRcIlxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiaXRlbS5wcm9kdWN0TmFtZVwiXG4gICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPnt7IGl0ZW0ucHJvZHVjdE5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiQ3VycmVuY3lcIj5cbiAgICAgICAgICAgIDxzcGFuIFthcHBEeW5hbWljQmFkZ2VdPVwieyBpdGVtc0FycmF5OiBjdXJyZW5jeSwgaXRlbTogaXRlbS5jdXJyZW5jeSB9XCJcbiAgICAgICAgICAgICAgY29sb3I9XCJibHVlLWdyZXlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImJhZGdlXCI+e3sgaXRlbS5jdXJyZW5jeSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJQcmljZS9NXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyAoaXRlbS5wcmljZSAvIDEwMCkudG9GaXhlZCgyKSB8IGN1cnJlbmN5Oml0ZW0uY3VycmVuY3kgfX1cbiAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtPy5kaXNjb3VudCAmJiBvYmplY3RLZXlzKGl0ZW0/LmRpc2NvdW50KT8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiaXRlbT8uZGlzY291bnQgfCBqc29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiUGFpZFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0/LnVuc3Vic2NyaWJlZF9hdFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLXdhcm5pbmdcIj5VbnN1Yjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpdGVtPy51bnN1YnNjcmliZWRfYXRcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIml0ZW0/LnN0cmlwZV9jdXN0b21lcl9pZCB8fCBpdGVtPy5leHRlcm5hbF9wYXltZW50XCJcbiAgICAgICAgICAgICAgICBbbmdJZkVsc2VdPVwibm9CbG9ja1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc3VjY2Vzc1wiPlllczwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0Jsb2NrPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctYmx1ZS1ncmV5XCI+Tm88L3NwYW4+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbT8ucGF1c2VfY29sbGVjdGlvbiAmJiBvYmplY3RLZXlzKGl0ZW0/LnBhdXNlX2NvbGxlY3Rpb24pPy5sZW5ndGhcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1zLTJcIlxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiaXRlbT8ucGF1c2VfY29sbGVjdGlvbiB8IGpzb25cIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUgdGV4dC13YXJuaW5nXCI+PC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkJpbGxpbmdcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2VcIlxuICAgICAgICAgICAgICBbYXBwRHluYW1pY0JhZGdlXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zQXJyYXk6IGJpbGxpbmdGcmVxdWVuY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiBpdGVtPy5iaWxsaW5nRnJlcXVlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICBjb2xvcj1cImJsdWUtZ3JleVwiPnt7IGl0ZW0uYmlsbGluZ0ZyZXF1ZW5jeSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJFeHBpcmVzXCI+XG4gICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJnZXRFeHBpcmVzQXRDb2xvcihpdGVtKVwiPnt7aXRlbT8uZXhwaXJlc19hdCB8IGRhdGVGb3JtYXR9fTwvc3Bhbj48YnIgLz5cbiAgICAgICAgICAgIDxzcGFuPnt7aXRlbT8uY3JlYXRlZF9hdCB8IHNpbmNlQWdvfX08L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiUyNcIj57eyBpdGVtPy5zZXNzaW9uc190b3RhbCB9fTwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIlMvbSAjXCI+XG4gICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1kYW5nZXIgZnctYm9sZCc6IGl0ZW0/LnNlc3Npb25zX2xhc3RfbW9udGggPCAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj57eyBpdGVtPy5zZXNzaW9uc19sYXN0X21vbnRoIH19PC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkRlbGV0ZWRcIj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbT8uZGVsZXRlZF9hdFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYmFkZ2UgYmctZGFuZ2VyXCI+WWVzPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXRlbT8uZGVsZXRlZF9hdFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYmFkZ2UgYmctYmx1ZS1ncmV5XCI+Tm88L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiQWN0aW9uXCI+XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkIGxpc3QtaW5saW5lIGxpc3QtYWN0aW9uXCI+XG4gICAgICAgICAgICAgIDxsaSBuZ2JUb29sdGlwPVwiRWRpdFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtZS0yIG1lLXNtLTNcIlxuICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIltyb3V0ZXJzLnN1YnNjcmlwdGlvbkRldGFpbHMsIGl0ZW0uaWRdXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1lZGl0IGVkaXQtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uZGVsZXRlZDsgZWxzZSBzaG93RGVsZXRlXCI+XG4gICAgICAgICAgICAgICAgPGxpIG5nYlRvb2x0aXA9XCJSZWFjdGl2YXRlIHN1YnNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCJcbiAgICAgICAgICAgICAgICAgICAgKnJiYWNBbGxvdz1cIidQYWdlcy5BbHBoYSdcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblJlY292ZXJTdWJzY3JpcHRpb25Nb2RhbChpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaCBkZWxldGUtaWNvbiB0ZXh0LXN1Y2Nlc3NcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd0RlbGV0ZT5cbiAgICAgICAgICAgICAgICA8bGkgbmdiVG9vbHRpcD1cIkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCJcbiAgICAgICAgICAgICAgICAgICAgKnJiYWNBbGxvdz1cIidQYWdlcy5BZG1pbi5TdWJzY3JpcHRpb24uRGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uRGVsZXRlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2ggZGVsZXRlLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9wLXRhYmxlPlxuICAgIDxkaXYgKm5nSWY9XCJ0b3RhbFJlY29yZHMgPT09IDAgJiYgdG90YWxSZWNvcmRzVW5GaWx0ZXJlZCAhPT0gMFwiPlxuICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ1NlYXJjaC5Ob0RhdGFNZXNzYWdlJyB8IHRyYW5zbG9jb1wiIFtkZXNjcmlwdGlvbl09XCInU2VhcmNoLk5vRGF0YURlc2NyaXB0aW9uJyB8IHRyYW5zbG9jb1wiID5cbiAgICAgIDwvcHctbm8tZGF0YT5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXJlY29yZHMtY291bnRcIiAqbmdJZj1cInRvdGFsUmVjb3JkcyAhPT0gMFwiPnt7ICdMYWJlbC5Ub3RhbCcgfCB0cmFuc2xvY28gfX06IHt7IHRvdGFsUmVjb3JkcyB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidBZG1pbi5TdWJzY3JpcHRpb25zLk5vU3Vic2NyaXB0aW9uTWVzc2FnZScgfCB0cmFuc2xvY29cIiAqbmdJZj1cInRvdGFsUmVjb3Jkc1VuRmlsdGVyZWQgPT09IDAgJiYgaXNMb2FkZWRcIj5cbjwvcHctbm8tZGF0YT5cbjxwdy1wYXNzd29yZC12YWxpZGF0aW9uXG4gICNyZWNvdmVyU3Vic2NyaXB0aW9uUGFzc3dvcmRNb2RhbFxuICAoc3VjY2Vzc0V2ZW50KT1cIm9uUmVjb3ZlckNvbmZpcm1lZCgpXCI+XG48L3B3LXBhc3N3b3JkLXZhbGlkYXRpb24+XG5cbiJdfQ==
311
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9ucy1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYWRtaW4tbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9zdWJzY3JpcHRpb25zL3N1YnNjcmlwdGlvbnMtbGlzdC9zdWJzY3JpcHRpb25zLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hZG1pbi1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3N1YnNjcmlwdGlvbnMvc3Vic2NyaXB0aW9ucy1saXN0L3N1YnNjcmlwdGlvbnMtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUVILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUdSLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQW9CLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RixPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTFFLE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sTUFBTSxNQUFNLGVBQWUsQ0FBQztBQUVuQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxJQUFJLE1BQU0sYUFBYSxDQUFDO0FBRy9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU8xRCxNQUFNLE9BQU8sMEJBQ1QsU0FBUSxnQkFBZ0I7SUEyRHhCLFlBQ3FCLGNBQThCLEVBQzlCLFlBQTBCLEVBQzFCLEVBQXNCLEVBQ3ZDLFFBQWtCLEVBQ0QsR0FBc0IsRUFDdEIsYUFBNEI7UUFFN0MsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBUEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBRXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBcERqRCxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUVqQixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBRWYsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUVoQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUluQixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUV2QixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBRWQsa0JBQWEsR0FBc0MsRUFBRSxDQUFDO1FBRXRELHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUV6QixhQUFRLEdBQUcsSUFBSSxDQUFDO1FBRVIsU0FBSSxHQUFHLENBQUMsQ0FBQztRQUVqQixxQkFBZ0IsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFN0MsWUFBTyxHQUFHLE9BQU8sQ0FBQztRQUVsQix1QkFBa0IsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTFELFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBSWYsMkJBQXNCLEdBQUcsQ0FBQyxDQUFDO1FBRTNCLHFCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUV0QixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBRWQsZUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFFekIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQWNmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDdEIsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDckMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDckMsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDcEMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEQsd0JBQXdCLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDOUIsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDMUIsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ1YsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ1gsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO1NBQ2xCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDOUUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNwRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxjQUFjLEdBQUcsaUJBQWlCLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1FBQ2pFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNELDRCQUE0QixDQUFDLElBQUk7UUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IseURBQXlEO1FBQ3pELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxjQUFjLEdBQUcsb0NBQW9DLENBQUMsQ0FBQyxVQUFVO1FBQ3ZHLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVk7YUFDWiwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDO2FBQ3ZFLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLFNBQVMsRUFBRSxTQUFTO2dCQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFO2FBQ2hDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQzthQUNELEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDTixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxhQUFhO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbEUsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDTixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDeEQsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGtCQUFrQjtRQUNkLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFvQjtRQUMzQixNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ1QsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsU0FBUyxFQUFFLFNBQVM7WUFDcEIsUUFBUSxFQUFFLFdBQVcsQ0FBQyxTQUFTO1lBQy9CLGVBQWUsRUFBRSxXQUFXLENBQUMsU0FBUztZQUN0QyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7U0FDMUIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELG9CQUFvQjtRQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZELElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxFQUFFLE9BQU8sQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxjQUFjO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNuRCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLE9BQU8sQ0FBQyxNQUFjO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZO2FBQ1osZ0JBQWdCLENBQ2IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQ3hELElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxFQUNqQixNQUFNLEVBQ04sSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQzlCO2FBQ0EsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xCLElBQUksUUFBUSxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUU7b0JBQzFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUNwQyxZQUFZLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQ3BDLFlBQVksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQzt3QkFDeEMsWUFBWSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO3dCQUNyQyxZQUFZLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDO3dCQUMxRCxZQUFZLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7d0JBQ25ELFlBQVksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQzt3QkFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQzFDLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLEVBQUUscUJBQXFCLENBQUM7WUFDNUQsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsUUFBUSxFQUFFLGdCQUFnQixDQUFDO1FBQzdELENBQUMsQ0FBQzthQUNELEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDTixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBSTtRQUNULElBQUksQ0FBQyxJQUFJLENBQUM7WUFDTixLQUFLLEVBQUUsUUFBUTtZQUNmLElBQUksRUFBRSx1Q0FBdUMsSUFBSSxFQUFFLFdBQVcsa0NBQWtDLElBQUksQ0FBQyxhQUFhLElBQUk7WUFDdEgsZ0JBQWdCLEVBQUUsSUFBSTtZQUN0QixjQUFjLEVBQUUsSUFBSTtZQUNwQixJQUFJLEVBQUUsU0FBUztTQUNsQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ1YsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxDQUFDLFlBQVk7cUJBQ1osa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztxQkFDbkQsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDWixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUMxQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FDdEMsQ0FBQztvQkFDRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLG9DQUFvQyxDQUFDLENBQ25FLENBQUM7Z0JBQ04sQ0FBQyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM3RSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUMxQixJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUMzRCxDQUFDO1lBQ0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUMzQyxPQUFPO29CQUNILEVBQUUsRUFBRSxPQUFPO29CQUNYLEtBQUssRUFBRSxPQUFPLElBQUksRUFBRTtpQkFDdkIsQ0FBQztZQUNOLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBSztRQUN0QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUV2QyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ1QsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsU0FBUyxFQUFFLFNBQVM7WUFDcEIsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRTtTQUNoQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQWE7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDVCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixTQUFTLEVBQUUsU0FBUztZQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFO1NBQ2hDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBRztRQUNQLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7YUFDbEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNsQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDcEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QixPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDZixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQUs7UUFDZixJQUFJLENBQUMsY0FBYzthQUNkLGNBQWMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQzthQUM1RCxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFLO1FBQ2pCLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2pCLFVBQVUsRUFBRSxVQUFVO1NBQ3pCLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBTTtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGFBQWEsQ0FBQyxRQUFRO1FBQzFCLElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ25CLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9FLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3pDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xDLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUN0QixnREFBZ0Q7WUFDaEQsS0FBSyxNQUFNLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDMUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQ2hFLENBQUM7Z0JBQ0YsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLENBQUM7WUFDRCxZQUFZO2dCQUNSLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ2xCLE9BQU87d0JBQ0gsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO3dCQUNSLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLENBQUMsaUJBQWlCLE1BQU0sQ0FBQyxDQUFDLFNBQVMsTUFBTSxDQUMxRSxDQUFDLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FDekIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRTt3QkFDOUIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsU0FBUyxHQUFHO3FCQUN6RCxDQUFDO2dCQUNOLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUViLE9BQU8sWUFBWSxDQUFDO1FBQ3hCLENBQUM7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUFJO1FBQ2xCLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDckIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFakQsT0FBTztZQUNILHFCQUFxQixFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRTtZQUM3RCw0QkFBNEIsRUFDeEIsSUFBSSxDQUFDLGdCQUFnQixLQUFLLE1BQU07Z0JBQ2hDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQ2pELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLElBQUksRUFBRTtTQUM3QyxDQUFDO0lBQ04sQ0FBQztJQUVRLFdBQVc7UUFDaEIsTUFBTSxJQUFJLEdBQUc7WUFDVCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFdBQVcsRUFBRSxJQUFJLENBQUMsbUJBQW1CO1NBQ3hDLENBQUM7UUFDRixZQUFZLENBQUMsT0FBTyxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDM0QsSUFBSSxLQUFLLFlBQVksYUFBYSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7b0JBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLHlCQUF5QixDQUFDLENBQUM7b0JBQ3pELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3RCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEIsQ0FBQzsrR0F0VlEsMEJBQTBCO21HQUExQiwwQkFBMEIscVVDbkN2Qyx5NFdBdVFBOzs0RkRwT2EsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNJLHVCQUF1QjtrT0FRUixVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBRXZCLGdDQUFnQztzQkFEL0IsU0FBUzt1QkFBQyxrQ0FBa0MsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdDaGVja2VkLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBJbmplY3RvcixcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBBZG1pblNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2UvYWRtaW4tbW9kdWxlLXV0aWxzJztcbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICdAcG9zaXdpc2UvYXBwLWJhc2UtY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UsIFBlcm1pc3Npb25TZXJ2aWNlLCBQcm9kdWN0U2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9jb21tb24tc2VydmljZXMnO1xuaW1wb3J0IHsgUEFHRV9TSVpFLCBQYWdpbmcgfSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXV0aWxpdGllcyc7XG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2hlbHBlci1zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3N3b3JkVmFsaWRhdGlvbkNvbXBvbmVudCB9IGZyb20gJ0Bwb3Npd2lzZS9zaGFyZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCBncm91cEJ5IGZyb20gJ2xvZGFzaC9ncm91cEJ5JztcbmltcG9ydCB1bmlxQnkgZnJvbSAnbG9kYXNoL3VuaXFCeSc7XG5pbXBvcnQgeyBMYXp5TG9hZEV2ZW50IH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgQXV0b0NvbXBsZXRlIH0gZnJvbSAncHJpbWVuZy9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgc3dhbCBmcm9tICdzd2VldGFsZXJ0Mic7XG5cbmltcG9ydCB7IEZlYXR1cmVLZXkgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvaW50ZXJmYWNlL25ld3NsZXR0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJPVVRFUlMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvcm91dGVycy9yb3V0ZXJzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwdy1zdWJzY3JpcHRpb25zLWxpc3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zdWJzY3JpcHRpb25zLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3N1YnNjcmlwdGlvbnMtbGlzdC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFN1YnNjcmlwdGlvbnNMaXN0Q29tcG9uZW50XG4gICAgZXh0ZW5kcyBBcHBCYXNlQ29tcG9uZW50XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZFxue1xuICAgIEBWaWV3Q2hpbGQoJ3JlZlByb2R1Y3QnKSByZWZQcm9kdWN0OiBBdXRvQ29tcGxldGU7XG4gICAgQFZpZXdDaGlsZCgncmVjb3ZlclN1YnNjcmlwdGlvblBhc3N3b3JkTW9kYWwnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgICByZWNvdmVyU3Vic2NyaXB0aW9uUGFzc3dvcmRNb2RhbDogUGFzc3dvcmRWYWxpZGF0aW9uQ29tcG9uZW50O1xuXG4gICAgcmVjb3ZlcmluZ0l0ZW07XG5cbiAgICBvcmdhbml6YXRpb25TaXplcyQ6IE9ic2VydmFibGU8RmVhdHVyZUtleVtdPjtcbiAgICBvcmdhbml6YXRpb25UeXBlcyQ6IE9ic2VydmFibGU8RmVhdHVyZUtleVtdPjtcbiAgICBvcmdhbml6YXRpb25JbmR1c3RyaWVzJDogT2JzZXJ2YWJsZTxGZWF0dXJlS2V5W10+O1xuXG4gICAgdG90YWxSZWNvcmRzID0gMDtcblxuICAgIGxvYWRpbmcgPSB0cnVlO1xuXG4gICAgc2VhcmNoVGV4dCA9ICcnO1xuXG4gICAgc3Vic2NyaXB0aW9ucyA9IFtdO1xuXG4gICAgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcblxuICAgIHNob3dJbnZpdGVGb3JtID0gZmFsc2U7XG5cbiAgICBwcm9kdWN0cyA9IFtdO1xuXG4gICAgc2VhcmNoT3B0aW9uczogeyBpZDogdW5rbm93bjsgbGFiZWw6IHVua25vd24gfVtdID0gW107XG5cbiAgICBmaWx0ZXJCeUZlYXR1cmVLZXlzID0gW107XG5cbiAgICBpc0xvYWRlZCA9IHRydWU7XG5cbiAgICBwcml2YXRlIHBhZ2UgPSAxO1xuXG4gICAgYmlsbGluZ0ZyZXF1ZW5jeSA9IFsnd2VlaycsICdtb250aCcsICd5ZWFyJ107XG5cbiAgICByb3V0ZXJzID0gUk9VVEVSUztcblxuICAgIHN1YnNjcmlwdGlvblN0YXR1cyA9IFsnYWxsJywgJ2V4cGlyZWQnLCAnYWN0aXZlJywgJ3BhaWQnXTtcblxuICAgIHN0YXR1cyA9ICcnO1xuICAgIHVuaXRzVGV4dCA9ICcnO1xuXG4gICAgc3Vic2NyaXB0aW9uSWQ6IG51bWJlcjtcblxuICAgIHRvdGFsUmVjb3Jkc1VuRmlsdGVyZWQgPSAwO1xuXG4gICAgZmlsdGVyZWRQcm9kdWN0cyA9IFtdO1xuXG4gICAgY3VycmVuY3kgPSBbXTtcblxuICAgIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cztcblxuICAgIGJ1dHRvbkJ1c3kgPSBmYWxzZTtcblxuICAgIHNlbGVjdGVkRmVhdHVyZUtleXM6IEZlYXR1cmVLZXlbXTtcbiAgICBzdWJzY3JpcHRpb25JbnNpZ2h0czogRmVhdHVyZUtleVtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjdFNlcnZpY2U6IFByb2R1Y3RTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFkbWluU2VydmljZTogQWRtaW5TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIHByb2R1Y3RfaWQ6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBmaXJzdF9uYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgbGFzdF9uYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgZW1haWw6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdXSxcbiAgICAgICAgICAgIG9yZ2FuaXphdGlvbl9pbmR1c3RyeV9pZDogWycnXSxcbiAgICAgICAgICAgIG9yZ2FuaXphdGlvbl90eXBlX2lkOiBbJyddLFxuICAgICAgICAgICAgb3JnYW5pemF0aW9uX3NpemVfaWQ6IFsnJ10sXG4gICAgICAgICAgICBuYW1lOiBbJyddLFxuICAgICAgICAgICAgdW5pdHM6IFsnJ10sXG4gICAgICAgICAgICBtaW5fdW5pdHM6IFsnJ11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0VGFibGVTdGF0ZSgpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLm9yZ2FuaXphdGlvbkluZHVzdHJpZXMkID0gdGhpcy5jb21tb25TZXJ2aWNlLmdldE9yZ2FuaXphdGlvbkluZHVzdHJpZXMoKTtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25UeXBlcyQgPSB0aGlzLmNvbW1vblNlcnZpY2UuZ2V0T3JnYW5pemF0aW9uVHlwZXMoKTtcbiAgICAgICAgdGhpcy5vcmdhbml6YXRpb25TaXplcyQgPSB0aGlzLmNvbW1vblNlcnZpY2UuZ2V0T3JnYW5pemF0aW9uU2l6ZXMoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25JZCA9IFBlcm1pc3Npb25TZXJ2aWNlLnNlbGVjdGVkU3Vic2NyaXB0aW9uPy5pZDtcbiAgICAgICAgdGhpcy5nZXRTdXBwb3J0ZWRDdXJyZW5jeSgpO1xuICAgICAgICB0aGlzLmdldFByb2R1Y3RzTGlzdCgpO1xuICAgICAgICB0aGlzLmdldE1pbk1heFVuaXRzKCk7XG4gICAgfVxuICAgIG9wZW5SZWNvdmVyU3Vic2NyaXB0aW9uTW9kYWwoaXRlbSkge1xuICAgICAgICB0aGlzLnJlY292ZXJpbmdJdGVtID0gaXRlbTtcbiAgICAgICAgLy8gZmFsc2UgcG9zaXRpdmU6IG5vdCBhIHBhc3N3b3JkLCBpdCdzIGEgdHJhbnNsYXRpb24ga2V5XG4gICAgICAgIHRoaXMucmVjb3ZlclN1YnNjcmlwdGlvblBhc3N3b3JkTW9kYWwuY29uZmlybU1lc3NhZ2UgPSAnQWRtaW4uU3Vic2NyaXB0aW9ucy5Db25maXJtUmVjb3Zlcic7IC8vIE5PU09OQVJcbiAgICAgICAgdGhpcy5yZWNvdmVyU3Vic2NyaXB0aW9uUGFzc3dvcmRNb2RhbC5vcGVuKCk7XG4gICAgfVxuXG4gICAgb25SZWNvdmVyQ29uZmlybWVkKCkge1xuICAgICAgICB0aGlzLmJ1dHRvbkJ1c3kgPSB0cnVlO1xuICAgICAgICB0aGlzLmFkbWluU2VydmljZVxuICAgICAgICAgICAgLnJlY292ZXJEZWxldGVkU3Vic2NyaXB0aW9uKHRoaXMucmVjb3ZlcmluZ0l0ZW0uaWQsIHRoaXMuc3Vic2NyaXB0aW9uSWQpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoJ1N1YnNjcmlwdGlvbiByZWNvdmVyZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRSxcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaFRleHQgfHwgJydcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbkJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY292ZXJpbmdJdGVtID0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFRhYmxlU3RhdGUoKSB7XG4gICAgICAgIHRoaXMubG9jYWxTdG9yYWdlLmdldEl0ZW0kKCdzdWJzY3JpcHRpb24tbGlzdC1zdGF0ZScpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UocmVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSByZXN1bHQ/LnNlYXJjaFRleHQgPz8gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSByZXN1bHQ/LnN0YXR1cyA/PyAnJztcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZUtleXMgPSByZXN1bHQ/LmZlYXR1cmVLZXlzID8/IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyQnlGZWF0dXJlS2V5cyA9IHRoaXMuc2VsZWN0ZWRGZWF0dXJlS2V5cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgb25MYXp5TG9hZChldmVudDogTGF6eUxvYWRFdmVudCkge1xuICAgICAgICBjb25zdCBwYWdlRGV0YWlscyA9IEhlbHBlclNlcnZpY2Uub25UYWJsZUxhenlMb2FkKGV2ZW50KTtcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZURldGFpbHMucGFnZTtcbiAgICAgICAgdGhpcy5nZXREYXRhKHtcbiAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFLFxuICAgICAgICAgICAgb3JkZXJfYnk6IHBhZ2VEZXRhaWxzLnNvcnRGaWVsZCxcbiAgICAgICAgICAgIG9yZGVyX2RpcmVjdGlvbjogcGFnZURldGFpbHMuc29ydE9yZGVyLFxuICAgICAgICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaFRleHRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0U3VwcG9ydGVkQ3VycmVuY3koKSB7XG4gICAgICAgIHRoaXMucHJvZHVjdFNlcnZpY2UuZ2V0U3VwcG9ydGVkQ3VycmVuY3koKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVuY3kgPSByZXM/LnJlZ2lvbnM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldE1pbk1heFVuaXRzKCkge1xuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdwcm9kdWN0X2lkJykudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICAgIHRoaXMudW5pdHNUZXh0ID0geD8udW5pdHNUZXh0ID8/ICcnO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERhdGEocGFnaW5nOiBQYWdpbmcpIHtcbiAgICAgICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5hZG1pblNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRTdWJzY3JpcHRpb25zKFxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyQnlGZWF0dXJlS2V5cy5tYXAoa2V5ID0+IGtleS5pZCkuam9pbigpIHx8ICcnLFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzIHx8ICcnLFxuICAgICAgICAgICAgICAgIHBhZ2luZyxcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbklkIHx8IG51bGxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWJzY3JpcHRpb25zICYmIHJlc3BvbnNlLnN1YnNjcmlwdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5wcm9kdWN0cy5mb3JFYWNoKHByb2R1Y3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5wcm9kdWN0SWQgPSBwcm9kdWN0LmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5wcm9kdWN0TmFtZSA9IHByb2R1Y3QubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uYWN0aXZlID0gcHJvZHVjdC5hY3RpdmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmJpbGxpbmdGcmVxdWVuY3kgPSBwcm9kdWN0LmJpbGxpbmdfZnJlcXVlbmN5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5wcmljZVBlclVuaXQgPSBwcm9kdWN0LnByaWNlX3Blcl91bml0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5jdXJyZW5jeSA9IHByb2R1Y3QuY3VycmVuY3k7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gdW5pcUJ5KHRoaXMuc3Vic2NyaXB0aW9ucywgJ2lkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSW5zaWdodHMgPSByZXNwb25zZT8uc3Vic2NyaXB0aW9uX2luc2lnaHRzO1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWxSZWNvcmRzID0gcmVzcG9uc2Uub2JqZWN0X2NvdW50ID8/IDA7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbFJlY29yZHNVbkZpbHRlcmVkID0gcmVzcG9uc2U/LnVuZmlsdGVyZWRfY291bnQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkRlbGV0ZShpdGVtKSB7XG4gICAgICAgIHN3YWwuZmlyZSh7XG4gICAgICAgICAgICB0aXRsZTogJ0RlbGV0ZScsXG4gICAgICAgICAgICB0ZXh0OiBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgJHtpdGVtPy5wcm9kdWN0TmFtZX0gc3Vic2NyaXB0aW9uIGZvciB0aGUgY3VzdG9tZXIgJHtpdGVtLmNvbnRhY3RfZW1haWx9ID9gLFxuICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgIHJldmVyc2VCdXR0b25zOiB0cnVlLFxuICAgICAgICAgICAgaWNvbjogJ3dhcm5pbmcnXG4gICAgICAgIH0pLnRoZW4ocmVwID0+IHtcbiAgICAgICAgICAgIGlmIChyZXAudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKS5zZXQoJ3Byb2R1Y3RfaWQnLCBpdGVtLnByb2R1Y3RJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZG1pblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmRlbGV0ZVN1YnNjcmlwdGlvbihpdGVtLmlkLCB7IHBhcmFtczogaHR0cFBhcmFtcyB9KVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IHRoaXMuc3Vic2NyaXB0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9PiB4LnByb2R1Y3RJZCAhPT0gaXRlbS5wcm9kdWN0SWRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdGFsUmVjb3Jkcy0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRpb24udHJhbnNsYXRlKCdBZG1pbi5TdWJzY3JpcHRpb25zLkRlbGV0ZWRNZXNzYWdlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByb2R1Y3RzTGlzdCgpIHtcbiAgICAgICAgdGhpcy5wcm9kdWN0U2VydmljZS5nZXRQcm9kdWN0TGlzdCh7fSwgdGhpcy5zdWJzY3JpcHRpb25JZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVLZXlzID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICBuZXcgU2V0KHJlc3BvbnNlLnByb2R1Y3RzLm1hcChpdGVtID0+IGl0ZW0uZmVhdHVyZV9rZXkpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoT3B0aW9ucyA9IGZlYXR1cmVLZXlzLm1hcChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGVsZW1lbnQgPz8gJydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uU2VhcmNoT3B0aW9uQ2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZmlsdGVyQnlGZWF0dXJlS2V5cyA9IGV2ZW50LnZhbHVlO1xuXG4gICAgICAgIHRoaXMuZ2V0RGF0YSh7XG4gICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRSxcbiAgICAgICAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hUZXh0IHx8ICcnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZpbHRlckJ5U3RhdHVzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSB2YWx1ZSB8fCAnJztcbiAgICAgICAgdGhpcy5nZXREYXRhKHtcbiAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFLFxuICAgICAgICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaFRleHQgfHwgJydcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc29ydE9iaihvYmopIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iailcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gICAgICAgICAgICAucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gb2JqW2tleV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICB9XG5cbiAgICBzZWFyY2hQcm9kdWN0KGV2ZW50KSB7XG4gICAgICAgIHRoaXMucHJvZHVjdFNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRQcm9kdWN0TGlzdCh7IHNlYXJjaDogZXZlbnQucXVlcnkgfSwgdGhpcy5zdWJzY3JpcHRpb25JZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRQcm9kdWN0cyA9IHRoaXMuZ3JvdXBQcm9kdWN0cyhyZXNwb25zZS5wcm9kdWN0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblByb2R1Y3RDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgcHJvZHVjdElkID0gTnVtYmVyKGV2ZW50Py52YWx1ZS5pZCk7XG4gICAgICAgIGNvbnN0IHByb2R1Y3RPYmogPSB0aGlzLmZpbHRlcmVkUHJvZHVjdHMuZmluZCh4ID0+IHguaWQgPT09IHByb2R1Y3RJZCk7XG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgIHByb2R1Y3RfaWQ6IHByb2R1Y3RPYmpcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Qcm9kdWN0Q2xlYXIoX2V2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5yZWZQcm9kdWN0LmlucHV0RUwubmF0aXZlRWxlbWVudC52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgncHJvZHVjdF9pZCcpLnNldFZhbHVlKCcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ3JvdXBQcm9kdWN0cyhwcm9kdWN0cykge1xuICAgICAgICBpZiAocHJvZHVjdHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcHJvZHVjdHMgPSBwcm9kdWN0cy5maWx0ZXIoeCA9PiB4LmRlcGVuZGVuY3lfcHJvZHVjdHM/Lmxlbmd0aCA8IDEgJiYgeC5hY3RpdmUpO1xuICAgICAgICAgICAgcHJvZHVjdHMgPSBncm91cEJ5KHByb2R1Y3RzLCAnY3VycmVuY3knKTtcbiAgICAgICAgICAgIHByb2R1Y3RzID0gdGhpcy5zb3J0T2JqKHByb2R1Y3RzKTtcbiAgICAgICAgICAgIGxldCBncm91cGVkQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgZm9yIChjb25zdCBwIGluIHByb2R1Y3RzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwcm9kdWN0c1twXS5zb3J0KFxuICAgICAgICAgICAgICAgICAgICAoYSwgYikgPT4gTnVtYmVyKGIucHJpY2VfcGVyX3VuaXQpIC0gTnVtYmVyKGEucHJpY2VfcGVyX3VuaXQpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBncm91cGVkQXJyYXkucHVzaCguLi52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cGVkQXJyYXkgPVxuICAgICAgICAgICAgICAgIGdyb3VwZWRBcnJheT8ubWFwKHggPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHguaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogYCR7eC5uYW1lfSB8ICR7eC5yZWdpb259IHwgJHt4LmJpbGxpbmdfZnJlcXVlbmN5fSB8ICR7eC5taW5fdW5pdHN9IHggJHsoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeC5wcmljZV9wZXJfdW5pdCAvIDEwMFxuICAgICAgICAgICAgICAgICAgICAgICAgKS50b0ZpeGVkKDIpfSB8ICR7eC5jdXJyZW5jeX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHNUZXh0OiBgKG1pbiAke3gubWluX3VuaXRzfSAtIG1heCAke3gubWF4X3VuaXRzfSlgXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSkgfHwgW107XG5cbiAgICAgICAgICAgIHJldHVybiBncm91cGVkQXJyYXk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgZ2V0RXhwaXJlc0F0Q29sb3IoaXRlbSkge1xuICAgICAgICBjb25zdCBkID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgbW9udGhCZWZvcmUgPSBkLnNldE1vbnRoKGQuZ2V0TW9udGgoKSAtIDEpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAndGV4dC1kYW5nZXIgZnctYm9sZCc6IG5ldyBEYXRlKGl0ZW0uZXhwaXJlc19hdCkgPCBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgJ3RleHQtd2FybmluZyB0ZXh0LWJvbGQtNzAwJzpcbiAgICAgICAgICAgICAgICBpdGVtLmJpbGxpbmdGcmVxdWVuY3kgPT09ICd5ZWFyJyAmJlxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKGl0ZW0uZXhwaXJlc19hdCkgPCBuZXcgRGF0ZShtb250aEJlZm9yZSkgJiZcbiAgICAgICAgICAgICAgICBuZXcgRGF0ZShpdGVtLmV4cGlyZXNfYXQpID4gbmV3IERhdGUoKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgc2VhcmNoVGV4dDogdGhpcy5zZWFyY2hUZXh0LFxuICAgICAgICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgICAgICAgIGZlYXR1cmVLZXlzOiB0aGlzLmZpbHRlckJ5RmVhdHVyZUtleXNcbiAgICAgICAgfTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3N1YnNjcmlwdGlvbi1saXN0LXN0YXRlJywgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgICBjb25zdCBub3RpZmllciA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5waXBlKHRha2VVbnRpbChub3RpZmllcikpLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFldmVudC51cmxBZnRlclJlZGlyZWN0cy5pbmNsdWRlcygnL3N1YnNjcmlwdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0kKCdzdWJzY3JpcHRpb24tbGlzdC1zdGF0ZScpO1xuICAgICAgICAgICAgICAgICAgICBub3RpZmllci5uZXh0KCcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY29sLTEyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICA8aDIgY2xhc3M9XCJjYXJkLXRpdGxlIHAtMCBmbG9hdC1zdGFydFwiPlN1YnNjcmlwdGlvbnM8L2gyPlxuICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5IGZsb2F0LWVuZFwiXG4gICAgICBpZD1cImJ0bi1jcmVhdGVcIlxuICAgICAgW3JvdXRlckxpbmtdPVwiW3JvdXRlcnMuaW52aXRlVXNlcnNdXCI+XG4gICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiBJbnZpdGUgYSBVc2VyIHRvIGEgVHJpYWxcbiAgICA8L2E+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwicC0yIG10LTNcIj5cbiAgPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyIG10LTNcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiIWlzTG9hZGVkXCI+XG4gICAgICA8cC1wcm9ncmVzc1NwaW5uZXI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJwcmltZW5nLWRhdGF0YWJsZS1jb250YWluZXIgdGFibGUtcmVzcG9uc2l2ZSBtdC0wXCJcbiAgICBbY2xhc3MuaGlkZVRhYmxlXT1cInRvdGFsUmVjb3Jkc1VuRmlsdGVyZWQgPT09IDBcIj5cbiAgICA8cC10YWJsZSAjZHRcbiAgICAgIFt2YWx1ZV09XCJzdWJzY3JpcHRpb25zXCJcbiAgICAgIFtwYWdpbmF0b3JdPVwidG90YWxSZWNvcmRzICE9PSAwXCJcbiAgICAgIFtyb3dzXT1cIlBBR0VfU0laRVwiXG4gICAgICBbbGF6eV09XCJ0cnVlXCJcbiAgICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzXCJcbiAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgICAgW2ZpbHRlckRlbGF5XT1cIjEwMDBcIlxuICAgICAgKG9uTGF6eUxvYWQpPVwib25MYXp5TG9hZCgkZXZlbnQpXCJcbiAgICAgIFtjdXN0b21Tb3J0XT1cInRydWVcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjYXB0aW9uXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdWJzY3JpcHRpb25JbnNpZ2h0c1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItNFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGVtcCBvZiBvYmplY3RLZXlzKHN1YnNjcmlwdGlvbkluc2lnaHRzKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1sZy0zIG10LTIgc3VtbWFyeVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc3Vic2NyaXB0aW9uSW5zaWdodHNbdGVtcF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wIHB4LTJcIj57eyBpdGVtPy50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LmluZm9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJpdGVtPy5pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cImZ3LWJvbGQgbXQtMiBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0/LnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1maWx0ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1zbS00XCI+XG4gICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjdCBGZWF0dXJlIEtleXNcIlxuICAgICAgICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGZWF0dXJlS2V5c1wiXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cInNlYXJjaE9wdGlvbnNcIlxuICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25TZWFyY2hPcHRpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiPlxuICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLXNtLTRcIj5cbiAgICAgICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cInN1YnNjcmlwdGlvblN0YXR1c1wiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IHN0YXR1cydcIlxuICAgICAgICAgICAgICAob25DaGFuZ2UpPVwiZmlsdGVyQnlTdGF0dXMoJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RhdHVzXCI+XG4gICAgICAgICAgICA8L3AtZHJvcGRvd24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZW5kXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaCBtdC0yIG1lLTIgZC1ub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCJcbiAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICBzaXplPVwiMzBcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBTdWJzY3JpcHRpb24uLi5cIlxuICAgICAgICAgICAgICBjbGFzcz1cIm13LTkwXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cImR0LmZpbHRlckdsb2JhbCgkZXZlbnQudGFyZ2V0LnZhbHVlLCAnY29udGFpbnMnKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwiaWRcIj5cbiAgICAgICAgICAgIHt7ICdBZG1pbi5TdWJzY3JpcHRpb25zLklkJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJpZFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwib3JnYW5pc2F0aW9uXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uU3Vic2NyaXB0aW9ucy5Pcmdhbml6YXRpb24nIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cIm9yZ2FuaXNhdGlvblwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwiY29udGFjdF9uYW1lXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uU3Vic2NyaXB0aW9ucy5Db250YWN0TmFtZScgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwiY29udGFjdF9uYW1lXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJjb250YWN0X2VtYWlsXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uU3Vic2NyaXB0aW9ucy5Db250YWN0RW1haWwnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cImNvbnRhY3RfZW1haWxcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+e3sgJ0FkbWluLlN1YnNjcmlwdGlvbnMuUHJvZHVjdCcgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQWRtaW4uU3Vic2NyaXB0aW9ucy5DdXJyZW5jeScgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQWRtaW4uU3Vic2NyaXB0aW9ucy5QcmljZVBlck1vbnRoJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJzdHJpcGVfY3VzdG9tZXJfaWRcIj5cbiAgICAgICAgICAgIHt7ICdBZG1pbi5TdWJzY3JpcHRpb25zLlBhaWQnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cInN0cmlwZV9jdXN0b21lcl9pZFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIj57eyAnQWRtaW4uU3Vic2NyaXB0aW9ucy5CaWxsaW5nJyB8IHRyYW5zbG9jbyB9fTwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cImV4cGlyZXMtYXQtd2lkdGhcIj5cbiAgICAgICAgICAgIHt7ICdBZG1pbi5TdWJzY3JpcHRpb25zLkV4cGlyZXNBdCcgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwic2Vzc2lvbnNfdG90YWxcIj5cbiAgICAgICAgICAgIHt7ICdBZG1pbi5TdWJzY3JpcHRpb25zLlNlc3Npb25zVG90YWwnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cInNlc3Npb25zX3RvdGFsXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJzZXNzaW9uc19sYXN0X21vbnRoXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uU3Vic2NyaXB0aW9ucy5TZXNzaW9uc1RvdGFsTGFzdE1vbnRoJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJzZXNzaW9uc19sYXN0X21vbnRoXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJkZWxldGVkX2F0XCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uU3Vic2NyaXB0aW9ucy5EZWxldGVkJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJkZWxldGVkX2F0XCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIGNsYXNzPVwiYWN0aW9ucy1saXN0LXR3b1wiXG4gICAgICAgICAgICBzY29wZT1cInRydWVcIj57eyAnTGFiZWwuQWN0aW9ucycgfCB0cmFuc2xvY28gfX08L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCJcbiAgICAgICAgbGV0LWl0ZW0+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiaWRcIj57eyBpdGVtLmlkIH19PC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT3JnYW5pemF0aW9uXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGN1c3RvbS1icmVhay13b3JkXCJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIml0ZW0ub3JnYW5pc2F0aW9uXCJcbiAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+e3sgaXRlbS5vcmdhbmlzYXRpb24gfCB0ZXh0VHJ1bmNhdGU6IDIwIH19PC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkNvbnRhY3ROYW1lXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWJyZWFrLXdvcmRcIj5cbiAgICAgICAgICAgIHt7IGl0ZW0uY29udGFjdF9uYW1lIH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiQ29udGFjdEVtYWlsXCI+e3sgaXRlbS5jb250YWN0X2VtYWlsIH19PC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiTmFtZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBjdXN0b20tYnJlYWstd29yZFwiXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJpdGVtLnByb2R1Y3ROYW1lXCJcbiAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+e3sgaXRlbS5wcm9kdWN0TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJDdXJyZW5jeVwiPlxuICAgICAgICAgICAgPHNwYW4gW2FwcER5bmFtaWNCYWRnZV09XCJ7IGl0ZW1zQXJyYXk6IGN1cnJlbmN5LCBpdGVtOiBpdGVtLmN1cnJlbmN5IH1cIlxuICAgICAgICAgICAgICBjb2xvcj1cImJsdWUtZ3JleVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYmFkZ2VcIj57eyBpdGVtLmN1cnJlbmN5IH19PC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIlByaWNlL01cIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IChpdGVtLnByaWNlIC8gMTAwKS50b0ZpeGVkKDIpIHwgY3VycmVuY3k6aXRlbS5jdXJyZW5jeSB9fVxuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0/LmRpc2NvdW50ICYmIG9iamVjdEtleXMoaXRlbT8uZGlzY291bnQpPy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJpdGVtPy5kaXNjb3VudCB8IGpzb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJQYWlkXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbT8udW5zdWJzY3JpYmVkX2F0XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctd2FybmluZ1wiPlVuc3ViPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0/LnVuc3Vic2NyaWJlZF9hdFwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXRlbT8uc3RyaXBlX2N1c3RvbWVyX2lkIHx8IGl0ZW0/LmV4dGVybmFsX3BheW1lbnRcIlxuICAgICAgICAgICAgICAgIFtuZ0lmRWxzZV09XCJub0Jsb2NrXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1zdWNjZXNzXCI+WWVzPC9zcGFuPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vQmxvY2s+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1ibHVlLWdyZXlcIj5Obzwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5wYXVzZV9jb2xsZWN0aW9uICYmIG9iamVjdEtleXMoaXRlbT8ucGF1c2VfY29sbGVjdGlvbik/Lmxlbmd0aFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibXMtMlwiXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJpdGVtPy5wYXVzZV9jb2xsZWN0aW9uIHwganNvblwiXG4gICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1leGNsYW1hdGlvbi10cmlhbmdsZSB0ZXh0LXdhcm5pbmdcIj48L2k+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiQmlsbGluZ1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZVwiXG4gICAgICAgICAgICAgIFthcHBEeW5hbWljQmFkZ2VdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNBcnJheTogYmlsbGluZ0ZyZXF1ZW5jeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IGl0ZW0/LmJpbGxpbmdGcmVxdWVuY3lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgIGNvbG9yPVwiYmx1ZS1ncmV5XCI+e3sgaXRlbS5iaWxsaW5nRnJlcXVlbmN5IH19PC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIkV4cGlyZXNcIj5cbiAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cImdldEV4cGlyZXNBdENvbG9yKGl0ZW0pXCI+e3tpdGVtPy5leHBpcmVzX2F0IHwgZGF0ZUZvcm1hdH19PC9zcGFuPjxiciAvPlxuICAgICAgICAgICAgPHNwYW4+e3tpdGVtPy5jcmVhdGVkX2F0IHwgc2luY2VBZ299fTwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJTI1wiPnt7IGl0ZW0/LnNlc3Npb25zX3RvdGFsIH19PC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiUy9tICNcIj5cbiAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWRhbmdlciBmdy1ib2xkJzogaXRlbT8uc2Vzc2lvbnNfbGFzdF9tb250aCA8IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPnt7IGl0ZW0/LnNlc3Npb25zX2xhc3RfbW9udGggfX08L3NwYW4+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiRGVsZXRlZFwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5kZWxldGVkX2F0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJiYWRnZSBiZy1kYW5nZXJcIj5ZZXM8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpdGVtPy5kZWxldGVkX2F0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJiYWRnZSBiZy1ibHVlLWdyZXlcIj5Obzwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJBY3Rpb25cIj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgbGlzdC1pbmxpbmUgbGlzdC1hY3Rpb25cIj5cbiAgICAgICAgICAgICAgPGxpIG5nYlRvb2x0aXA9XCJFZGl0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1lLTIgbWUtc20tM1wiXG4gICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiW3JvdXRlcnMuc3Vic2NyaXB0aW9uRGV0YWlscywgaXRlbS5pZF1cIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWVkaXQgZWRpdC1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5kZWxldGVkOyBlbHNlIHNob3dEZWxldGVcIj5cbiAgICAgICAgICAgICAgICA8bGkgbmdiVG9vbHRpcD1cIlJlYWN0aXZhdGUgc3Vic2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZS0yIG1lLXNtLTNcIlxuICAgICAgICAgICAgICAgICAgICAqcmJhY0FsbG93PVwiJ1BhZ2VzLkFscGhhJ1wiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9wZW5SZWNvdmVyU3Vic2NyaXB0aW9uTW9kYWwoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblJlY292ZXJTdWJzY3JpcHRpb25Nb2RhbChpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaCBkZWxldGUtaWNvbiB0ZXh0LXN1Y2Nlc3NcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd0RlbGV0ZT5cbiAgICAgICAgICAgICAgICA8bGkgbmdiVG9vbHRpcD1cIkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMiBtZS1zbS0zXCJcbiAgICAgICAgICAgICAgICAgICAgKnJiYWNBbGxvdz1cIidQYWdlcy5BZG1pbi5TdWJzY3JpcHRpb24uRGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uRGVsZXRlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2ggZGVsZXRlLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9wLXRhYmxlPlxuICAgIDxkaXYgKm5nSWY9XCJ0b3RhbFJlY29yZHMgPT09IDAgJiYgdG90YWxSZWNvcmRzVW5GaWx0ZXJlZCAhPT0gMFwiPlxuICAgICAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ1NlYXJjaC5Ob0RhdGFNZXNzYWdlJyB8IHRyYW5zbG9jb1wiIFtkZXNjcmlwdGlvbl09XCInU2VhcmNoLk5vRGF0YURlc2NyaXB0aW9uJyB8IHRyYW5zbG9jb1wiID5cbiAgICAgIDwvcHctbm8tZGF0YT5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cInRvdGFsLXJlY29yZHMtY291bnRcIiAqbmdJZj1cInRvdGFsUmVjb3JkcyAhPT0gMFwiPnt7ICdMYWJlbC5Ub3RhbCcgfCB0cmFuc2xvY28gfX06IHt7IHRvdGFsUmVjb3JkcyB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxwdy1uby1kYXRhIFt3aXRoSW1hZ2VdPVwidHJ1ZVwiIFttZXNzYWdlXT1cIidBZG1pbi5TdWJzY3JpcHRpb25zLk5vU3Vic2NyaXB0aW9uTWVzc2FnZScgfCB0cmFuc2xvY29cIiAqbmdJZj1cInRvdGFsUmVjb3Jkc1VuRmlsdGVyZWQgPT09IDAgJiYgaXNMb2FkZWRcIj5cbjwvcHctbm8tZGF0YT5cbjxwdy1wYXNzd29yZC12YWxpZGF0aW9uXG4gICNyZWNvdmVyU3Vic2NyaXB0aW9uUGFzc3dvcmRNb2RhbFxuICAoc3VjY2Vzc0V2ZW50KT1cIm9uUmVjb3ZlckNvbmZpcm1lZCgpXCI+XG48L3B3LXBhc3N3b3JkLXZhbGlkYXRpb24+XG5cbiJdfQ==