tango-app-ui-manage-billing 3.3.12 → 3.3.13

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.
@@ -373,10 +373,10 @@ export class BrandsBillingComponent {
373
373
  this.router.navigate(['/manage/billing/brand-invoices']);
374
374
  }
375
375
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrandsBillingComponent, deps: [{ token: i1.BillingService }, { token: i0.ChangeDetectorRef }, { token: i2.ToastService }, { token: i3.Router }, { token: i4.GlobalStateService }, { token: i4.PageInfoService }, { token: i5.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
376
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrandsBillingComponent, selector: "lib-brands-billing", ngImport: i0, template: "<!-- Brands & Billing Section -->\n<div class=\"brands-section mx-3 mt-4 mb-4\">\n <div class=\"d-flex justify-content-between align-items-start mb-3\">\n <div>\n <div class=\"billingheader\">Brands & Billing</div>\n <div class=\"text-muted small\">Click any brand to manage billing \u2014 configured brands open invoices directly</div>\n </div>\n <button *ngIf=\"userRole === 'superadmin'\"\n type=\"button\"\n class=\"btn btn-icon btn-light-primary\"\n (click)=\"openInvoiceSettings()\"\n ngbTooltip=\"Invoice Settings\"\n aria-label=\"Invoice Settings\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M12 15.5A3.5 3.5 0 1 0 12 8.5a3.5 3.5 0 0 0 0 7Z\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n\n <!-- Overview Chips \u2014 Active / Hold / Deactive each double as a tab. -->\n <div class=\"row g-3 mb-4\">\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Active' ? 'chip-active' : ''\" (click)=\"setFilter('Active')\">\n <div class=\"chip-label\">Active</div>\n <div class=\"chip-value\">{{ activeBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Hold' ? 'chip-active' : ''\" (click)=\"setFilter('Hold')\">\n <div class=\"chip-label\">Hold</div>\n <div class=\"chip-value\">{{ holdBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Suspended' ? 'chip-active' : ''\" (click)=\"setFilter('Suspended')\">\n <div class=\"chip-label\">Suspended</div>\n <div class=\"chip-value\">{{ suspendedBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Deactive' ? 'chip-active' : ''\" (click)=\"setFilter('Deactive')\">\n <div class=\"chip-label\">Deactive</div>\n <div class=\"chip-value\">{{ deactiveBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\">\n <div class=\"chip-label\">Total Bill Due</div>\n <div class=\"chip-value text-danger\">\u20B9{{ totalBillDue | number:'1.0-3':'en-IN' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\">\n <div class=\"chip-label\">Stores Under Billing</div>\n <div class=\"chip-value\">{{ storesUnderBilling }}</div>\n </div>\n </div>\n </div>\n\n <!-- Payment-status pill row \u2014 independent of the lifecycle tab above,\n visible regardless of which tab is selected. -->\n <div class=\"d-flex align-items-center gap-2 mb-3\">\n <span class=\"text-muted small\">Payment:</span>\n <button class=\"btn btn-sm\"\n [ngClass]=\"paymentSubFilter === '' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setPaymentSubFilter('')\">All</button>\n <button *ngFor=\"let pill of paymentSubTabs\" class=\"btn btn-sm\"\n [ngClass]=\"paymentSubFilter === pill.value ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setPaymentSubFilter(pill.value)\">\n {{ pill.label }} ({{ paymentPillCount(pill.value) }})\n </button>\n </div>\n\n <!-- Search & Toolbar -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar w-100\">\n <div class=\"d-flex justify-content-end\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search brands...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"brandFilterObject\" (appliedFilters)=\"applyBrandFilters($event)\"></lib-filters>\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!brandsList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">Export</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"brandsLoading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- No Data -->\n <ng-container *ngIf=\"brandsNoData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Brands Table -->\n <div *ngIf=\"!brandsLoading && !brandsNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th class=\"cursor-pointer\" (click)=\"sortData('clientName')\">Brand Name\n <svg [ngClass]=\"sortColumName === 'clientName' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'clientName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('totalStores')\">Stores\n <svg [ngClass]=\"sortColumName === 'totalStores' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'totalStores' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>Billing Stores</th>\n <th>Products Added</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('billAmountDue')\">Bill Amount Due\n <svg [ngClass]=\"sortColumName === 'billAmountDue' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'billAmountDue' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('status')\">Status\n <svg [ngClass]=\"sortColumName === 'status' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'status' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('paymentStatus')\">Payment Status\n <svg [ngClass]=\"sortColumName === 'paymentStatus' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'paymentStatus' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th scope=\"col\">Actions</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let brand of brandsList; let i = index\">\n <td>\n <div class=\"table-title table-title-primary d-flex cursor-pointer\" (click)=\"viewBrand(brand)\">\n <div class=\"symbol symbol-35px symbol-circle me-2\">\n <span class=\"symbol-label text-symbol\">\n <span *ngIf=\"!brand?.logo\" class=\"symbol-label bg-light-primary text-symbol\">\n {{ brand?.clientName?.charAt(0) }}\n </span>\n <img *ngIf=\"brand?.logo\" class=\"logo-img\" [src]=\"brand?.logo\" alt=\"\">\n </span>\n </div>\n <div>\n <u>{{ brand?.clientName | uppercase }}</u>\n <div class=\"text-muted small\" style=\"line-height: 1;\">ID: {{ brand?.clientId }}</div>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ brand?.totalStores }} Stores</div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngIf=\"brand?.billingStores > 0\">{{ brand?.billingStores }}</span>\n <span *ngIf=\"!brand?.billingStores\" class=\"text-muted\">\u2014</span>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngIf=\"brand?.productsAdded > 0\">{{ brand?.productsAdded }} Products</span>\n <span *ngIf=\"!brand?.productsAdded\" class=\"text-muted small\">Setup billing to add products</span>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngIf=\"brand?.billAmountDue > 0\">\u20B9{{ brand?.billAmountDue | number:'1.0-3':'en-IN' }}</span>\n <span *ngIf=\"!brand?.billAmountDue\" class=\"text-muted\">\u2014</span>\n </div>\n </td>\n <td>\n <div [ngClass]=\"brand?.status === 'active' ? 'badge badge-light-success' :\n 'badge badge-light-danger'\" class=\"mt-3\">\n {{ brand?.status }}\n </div>\n </td>\n <td>\n <div [ngClass]=\"brand?.paymentStatus === 'paid' ? 'badge badge-light-success' :\n brand?.paymentStatus === 'trial' ? 'badge badge-light-warning' :\n 'badge badge-light-danger'\" class=\"mt-3\">\n {{ brand?.paymentStatus }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <button *ngIf=\"!brand?.billingStores\" class=\"btn btn-sm viewdetails\" (click)=\"setupBilling(brand)\">\n Setup Billing\n </button>\n <button *ngIf=\"brand?.billingStores > 0\" class=\"btn btn-sm viewdetails\" (click)=\"viewBrand(brand)\">\n View\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <div *ngIf=\"!brandsLoading && !brandsNoData\">\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </div>\n </div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:20px}.activePlanBtnprimary{border-radius:6px;background:var(--Primary-50, #EAF8FF)!important;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a!important;color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.rotate{rotate:180deg;transition:1s}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.billingheader{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.table-title{font-family:Inter;font-size:14px;font-weight:500;line-height:3!important}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:3!important}.text-symbol{color:var(--primary-600, #00A3FF)}.symbol-label{font-family:Inter;font-size:16px;font-weight:500;line-height:24px;letter-spacing:0em;text-align:center}.viewdetails{border-radius:8px;border:1px solid var(--Primary-50, #EAF8FF);background:var(--Primary-50, #EAF8FF);box-shadow:0 1px 2px #1018280d;color:var(--Primary-700, #009BF3);padding:10px 16px;justify-content:center;align-items:center;gap:10px;font-family:Inter;font-size:12px;font-style:normal;font-weight:600;line-height:18px;text-transform:capitalize}.logo-img{border-radius:50%;width:100%;height:100%;object-fit:cover}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.summary-card{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:10px;padding:16px 18px;transition:box-shadow .2s}.summary-card:hover{box-shadow:0 2px 8px #0000000f}.summary-icon{width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.summary-icon.icon-warning{background:#fff3e0}.summary-icon.icon-primary{background:#e3f2fd}.summary-icon.icon-success{background:#e8f5e9}.summary-icon.icon-danger{background:#fce4ec}.summary-icon.icon-paid{background:#e0f2f1}.summary-label{font-family:Inter;font-size:12px;color:var(--Gray-500, #667085);font-weight:500;line-height:18px}.summary-value{font-family:Inter;font-size:22px;font-weight:700;color:var(--Gray-900, #101828);line-height:1.2}.summary-sub{font-family:Inter;font-size:11px;color:var(--Gray-400, #98A2B3);font-weight:400;margin-top:2px}.brands-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.overview-chip{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:10px;padding:12px 16px;cursor:pointer;transition:all .2s}.overview-chip:hover,.overview-chip.chip-active{border-color:var(--Primary-700, #009BF3);box-shadow:0 0 0 1px var(--Primary-700, #009BF3)}.overview-chip .chip-label{font-family:Inter;font-size:12px;color:var(--Gray-500, #667085);font-weight:500;line-height:18px}.overview-chip .chip-value{font-family:Inter;font-size:20px;font-weight:700;color:var(--Gray-900, #101828)}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i2.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i2.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "pipe", type: i6.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i6.DecimalPipe, name: "number" }] });
376
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrandsBillingComponent, selector: "lib-brands-billing", ngImport: i0, template: "<!-- Brands & Billing Section -->\n<div class=\"brands-section mx-3 mt-4 mb-4\">\n <div class=\"d-flex justify-content-between align-items-start mb-3\">\n <div>\n <div class=\"billingheader\">Brands & Billing</div>\n <div class=\"text-muted small\">Click any brand to manage billing \u2014 configured brands open invoices directly</div>\n </div>\n <button *ngIf=\"userRole === 'superadmin'\"\n type=\"button\"\n class=\"btn btn-icon btn-light-primary\"\n (click)=\"openInvoiceSettings()\"\n ngbTooltip=\"Invoice Settings\"\n aria-label=\"Invoice Settings\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M12 15.5A3.5 3.5 0 1 0 12 8.5a3.5 3.5 0 0 0 0 7Z\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n\n <!-- Overview Chips \u2014 Active / Hold / Deactive each double as a tab. -->\n <div class=\"row g-3 mb-4\">\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Active' ? 'chip-active' : ''\" (click)=\"setFilter('Active')\">\n <div class=\"chip-label\">Active</div>\n <div class=\"chip-value\">{{ activeBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Hold' ? 'chip-active' : ''\" (click)=\"setFilter('Hold')\">\n <div class=\"chip-label\">Hold</div>\n <div class=\"chip-value\">{{ holdBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Suspended' ? 'chip-active' : ''\" (click)=\"setFilter('Suspended')\">\n <div class=\"chip-label\">Suspended</div>\n <div class=\"chip-value\">{{ suspendedBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Deactive' ? 'chip-active' : ''\" (click)=\"setFilter('Deactive')\">\n <div class=\"chip-label\">Deactive</div>\n <div class=\"chip-value\">{{ deactiveBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\">\n <div class=\"chip-label\">Total Bill Due</div>\n <div class=\"chip-value text-danger\">\u20B9{{ totalBillDue | number:'1.0-3':'en-IN' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\">\n <div class=\"chip-label\">Stores Under Billing</div>\n <div class=\"chip-value\">{{ storesUnderBilling }}</div>\n </div>\n </div>\n </div>\n\n <!-- Payment-status pill row \u2014 independent of the lifecycle tab above,\n visible regardless of which tab is selected. -->\n <div class=\"d-flex align-items-center gap-2 mb-3\">\n <span class=\"text-muted small\">Payment:</span>\n <button class=\"btn btn-sm\"\n [ngClass]=\"paymentSubFilter === '' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setPaymentSubFilter('')\">All</button>\n <button *ngFor=\"let pill of paymentSubTabs\" class=\"btn btn-sm\"\n [ngClass]=\"paymentSubFilter === pill.value ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setPaymentSubFilter(pill.value)\">\n {{ pill.label }} ({{ paymentPillCount(pill.value) }})\n </button>\n </div>\n\n <!-- Search & Toolbar -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar w-100\">\n <div class=\"d-flex justify-content-end\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search brands...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"brandFilterObject\" (appliedFilters)=\"applyBrandFilters($event)\"></lib-filters>\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!brandsList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">Export</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"brandsLoading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- No Data -->\n <ng-container *ngIf=\"brandsNoData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Brands Table -->\n <div *ngIf=\"!brandsLoading && !brandsNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th class=\"cursor-pointer\" (click)=\"sortData('clientName')\">Brand Name\n <svg [ngClass]=\"sortColumName === 'clientName' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'clientName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('totalStores')\">Stores\n <svg [ngClass]=\"sortColumName === 'totalStores' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'totalStores' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>Billing Stores</th>\n <th>Products Added</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('billAmountDue')\">Bill Amount Due\n <svg [ngClass]=\"sortColumName === 'billAmountDue' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'billAmountDue' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('status')\">Status\n <svg [ngClass]=\"sortColumName === 'status' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'status' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('paymentStatus')\">Payment Status\n <svg [ngClass]=\"sortColumName === 'paymentStatus' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'paymentStatus' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th scope=\"col\">Actions</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let brand of brandsList; let i = index\">\n <td>\n <div class=\"table-title table-title-primary d-flex cursor-pointer\" (click)=\"viewBrand(brand)\">\n <div class=\"symbol symbol-35px symbol-circle me-2\">\n <span class=\"symbol-label text-symbol\">\n <span *ngIf=\"!brand?.logo\" class=\"symbol-label bg-light-primary text-symbol\">\n {{ brand?.clientName?.charAt(0) }}\n </span>\n <img *ngIf=\"brand?.logo\" class=\"logo-img\" [src]=\"brand?.logo\" alt=\"\">\n </span>\n </div>\n <div>\n <u>{{ brand?.clientName | uppercase }}</u>\n <div class=\"text-muted small\" style=\"line-height: 1;\">ID: {{ brand?.clientId }}</div>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ brand?.totalStores }} Stores</div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngIf=\"brand?.billingStores > 0\">{{ brand?.billingStores }}</span>\n <span *ngIf=\"!brand?.billingStores\" class=\"text-muted\">\u2014</span>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngIf=\"brand?.productsAdded > 0\">{{ brand?.productsAdded }} Products</span>\n <span *ngIf=\"!brand?.productsAdded\" class=\"text-muted small\">Setup billing to add products</span>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngIf=\"brand?.billAmountDue > 0\">\u20B9{{ brand?.billAmountDue | number:'1.0-3':'en-IN' }}</span>\n <span *ngIf=\"!brand?.billAmountDue\" class=\"text-muted\">\u2014</span>\n </div>\n </td>\n <td>\n <div [ngClass]=\"brand?.status === 'active' ? 'badge badge-light-success' :\n 'badge badge-light-danger'\" class=\"mt-3\">\n {{ brand?.status }}\n </div>\n </td>\n <td>\n <div [ngClass]=\"brand?.paymentStatus === 'paid' ? 'badge badge-light-success' :\n brand?.paymentStatus === 'trial' ? 'badge badge-light-warning' :\n 'badge badge-light-danger'\" class=\"mt-3\">\n {{ brand?.paymentStatus }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <button *ngIf=\"!brand?.billingConfigured\" class=\"btn btn-sm viewdetails\" (click)=\"setupBilling(brand)\">\n Setup Billing\n </button>\n <button *ngIf=\"brand?.billingConfigured\" class=\"btn btn-sm viewdetails\" (click)=\"viewBrand(brand)\">\n View\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <div *ngIf=\"!brandsLoading && !brandsNoData\">\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </div>\n </div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:20px}.activePlanBtnprimary{border-radius:6px;background:var(--Primary-50, #EAF8FF)!important;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a!important;color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.rotate{rotate:180deg;transition:1s}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.billingheader{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.table-title{font-family:Inter;font-size:14px;font-weight:500;line-height:3!important}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:3!important}.text-symbol{color:var(--primary-600, #00A3FF)}.symbol-label{font-family:Inter;font-size:16px;font-weight:500;line-height:24px;letter-spacing:0em;text-align:center}.viewdetails{border-radius:8px;border:1px solid var(--Primary-50, #EAF8FF);background:var(--Primary-50, #EAF8FF);box-shadow:0 1px 2px #1018280d;color:var(--Primary-700, #009BF3);padding:10px 16px;justify-content:center;align-items:center;gap:10px;font-family:Inter;font-size:12px;font-style:normal;font-weight:600;line-height:18px;text-transform:capitalize}.logo-img{border-radius:50%;width:100%;height:100%;object-fit:cover}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.summary-card{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:10px;padding:16px 18px;transition:box-shadow .2s}.summary-card:hover{box-shadow:0 2px 8px #0000000f}.summary-icon{width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.summary-icon.icon-warning{background:#fff3e0}.summary-icon.icon-primary{background:#e3f2fd}.summary-icon.icon-success{background:#e8f5e9}.summary-icon.icon-danger{background:#fce4ec}.summary-icon.icon-paid{background:#e0f2f1}.summary-label{font-family:Inter;font-size:12px;color:var(--Gray-500, #667085);font-weight:500;line-height:18px}.summary-value{font-family:Inter;font-size:22px;font-weight:700;color:var(--Gray-900, #101828);line-height:1.2}.summary-sub{font-family:Inter;font-size:11px;color:var(--Gray-400, #98A2B3);font-weight:400;margin-top:2px}.brands-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.overview-chip{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:10px;padding:12px 16px;cursor:pointer;transition:all .2s}.overview-chip:hover,.overview-chip.chip-active{border-color:var(--Primary-700, #009BF3);box-shadow:0 0 0 1px var(--Primary-700, #009BF3)}.overview-chip .chip-label{font-family:Inter;font-size:12px;color:var(--Gray-500, #667085);font-weight:500;line-height:18px}.overview-chip .chip-value{font-family:Inter;font-size:20px;font-weight:700;color:var(--Gray-900, #101828)}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i2.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i2.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "pipe", type: i6.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i6.DecimalPipe, name: "number" }] });
377
377
  }
378
378
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrandsBillingComponent, decorators: [{
379
379
  type: Component,
380
- args: [{ selector: 'lib-brands-billing', template: "<!-- Brands & Billing Section -->\n<div class=\"brands-section mx-3 mt-4 mb-4\">\n <div class=\"d-flex justify-content-between align-items-start mb-3\">\n <div>\n <div class=\"billingheader\">Brands & Billing</div>\n <div class=\"text-muted small\">Click any brand to manage billing \u2014 configured brands open invoices directly</div>\n </div>\n <button *ngIf=\"userRole === 'superadmin'\"\n type=\"button\"\n class=\"btn btn-icon btn-light-primary\"\n (click)=\"openInvoiceSettings()\"\n ngbTooltip=\"Invoice Settings\"\n aria-label=\"Invoice Settings\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M12 15.5A3.5 3.5 0 1 0 12 8.5a3.5 3.5 0 0 0 0 7Z\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n\n <!-- Overview Chips \u2014 Active / Hold / Deactive each double as a tab. -->\n <div class=\"row g-3 mb-4\">\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Active' ? 'chip-active' : ''\" (click)=\"setFilter('Active')\">\n <div class=\"chip-label\">Active</div>\n <div class=\"chip-value\">{{ activeBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Hold' ? 'chip-active' : ''\" (click)=\"setFilter('Hold')\">\n <div class=\"chip-label\">Hold</div>\n <div class=\"chip-value\">{{ holdBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Suspended' ? 'chip-active' : ''\" (click)=\"setFilter('Suspended')\">\n <div class=\"chip-label\">Suspended</div>\n <div class=\"chip-value\">{{ suspendedBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Deactive' ? 'chip-active' : ''\" (click)=\"setFilter('Deactive')\">\n <div class=\"chip-label\">Deactive</div>\n <div class=\"chip-value\">{{ deactiveBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\">\n <div class=\"chip-label\">Total Bill Due</div>\n <div class=\"chip-value text-danger\">\u20B9{{ totalBillDue | number:'1.0-3':'en-IN' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\">\n <div class=\"chip-label\">Stores Under Billing</div>\n <div class=\"chip-value\">{{ storesUnderBilling }}</div>\n </div>\n </div>\n </div>\n\n <!-- Payment-status pill row \u2014 independent of the lifecycle tab above,\n visible regardless of which tab is selected. -->\n <div class=\"d-flex align-items-center gap-2 mb-3\">\n <span class=\"text-muted small\">Payment:</span>\n <button class=\"btn btn-sm\"\n [ngClass]=\"paymentSubFilter === '' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setPaymentSubFilter('')\">All</button>\n <button *ngFor=\"let pill of paymentSubTabs\" class=\"btn btn-sm\"\n [ngClass]=\"paymentSubFilter === pill.value ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setPaymentSubFilter(pill.value)\">\n {{ pill.label }} ({{ paymentPillCount(pill.value) }})\n </button>\n </div>\n\n <!-- Search & Toolbar -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar w-100\">\n <div class=\"d-flex justify-content-end\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search brands...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"brandFilterObject\" (appliedFilters)=\"applyBrandFilters($event)\"></lib-filters>\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!brandsList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">Export</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"brandsLoading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- No Data -->\n <ng-container *ngIf=\"brandsNoData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Brands Table -->\n <div *ngIf=\"!brandsLoading && !brandsNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th class=\"cursor-pointer\" (click)=\"sortData('clientName')\">Brand Name\n <svg [ngClass]=\"sortColumName === 'clientName' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'clientName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('totalStores')\">Stores\n <svg [ngClass]=\"sortColumName === 'totalStores' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'totalStores' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>Billing Stores</th>\n <th>Products Added</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('billAmountDue')\">Bill Amount Due\n <svg [ngClass]=\"sortColumName === 'billAmountDue' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'billAmountDue' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('status')\">Status\n <svg [ngClass]=\"sortColumName === 'status' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'status' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('paymentStatus')\">Payment Status\n <svg [ngClass]=\"sortColumName === 'paymentStatus' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'paymentStatus' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th scope=\"col\">Actions</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let brand of brandsList; let i = index\">\n <td>\n <div class=\"table-title table-title-primary d-flex cursor-pointer\" (click)=\"viewBrand(brand)\">\n <div class=\"symbol symbol-35px symbol-circle me-2\">\n <span class=\"symbol-label text-symbol\">\n <span *ngIf=\"!brand?.logo\" class=\"symbol-label bg-light-primary text-symbol\">\n {{ brand?.clientName?.charAt(0) }}\n </span>\n <img *ngIf=\"brand?.logo\" class=\"logo-img\" [src]=\"brand?.logo\" alt=\"\">\n </span>\n </div>\n <div>\n <u>{{ brand?.clientName | uppercase }}</u>\n <div class=\"text-muted small\" style=\"line-height: 1;\">ID: {{ brand?.clientId }}</div>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ brand?.totalStores }} Stores</div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngIf=\"brand?.billingStores > 0\">{{ brand?.billingStores }}</span>\n <span *ngIf=\"!brand?.billingStores\" class=\"text-muted\">\u2014</span>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngIf=\"brand?.productsAdded > 0\">{{ brand?.productsAdded }} Products</span>\n <span *ngIf=\"!brand?.productsAdded\" class=\"text-muted small\">Setup billing to add products</span>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngIf=\"brand?.billAmountDue > 0\">\u20B9{{ brand?.billAmountDue | number:'1.0-3':'en-IN' }}</span>\n <span *ngIf=\"!brand?.billAmountDue\" class=\"text-muted\">\u2014</span>\n </div>\n </td>\n <td>\n <div [ngClass]=\"brand?.status === 'active' ? 'badge badge-light-success' :\n 'badge badge-light-danger'\" class=\"mt-3\">\n {{ brand?.status }}\n </div>\n </td>\n <td>\n <div [ngClass]=\"brand?.paymentStatus === 'paid' ? 'badge badge-light-success' :\n brand?.paymentStatus === 'trial' ? 'badge badge-light-warning' :\n 'badge badge-light-danger'\" class=\"mt-3\">\n {{ brand?.paymentStatus }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <button *ngIf=\"!brand?.billingStores\" class=\"btn btn-sm viewdetails\" (click)=\"setupBilling(brand)\">\n Setup Billing\n </button>\n <button *ngIf=\"brand?.billingStores > 0\" class=\"btn btn-sm viewdetails\" (click)=\"viewBrand(brand)\">\n View\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <div *ngIf=\"!brandsLoading && !brandsNoData\">\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </div>\n </div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:20px}.activePlanBtnprimary{border-radius:6px;background:var(--Primary-50, #EAF8FF)!important;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a!important;color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.rotate{rotate:180deg;transition:1s}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.billingheader{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.table-title{font-family:Inter;font-size:14px;font-weight:500;line-height:3!important}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:3!important}.text-symbol{color:var(--primary-600, #00A3FF)}.symbol-label{font-family:Inter;font-size:16px;font-weight:500;line-height:24px;letter-spacing:0em;text-align:center}.viewdetails{border-radius:8px;border:1px solid var(--Primary-50, #EAF8FF);background:var(--Primary-50, #EAF8FF);box-shadow:0 1px 2px #1018280d;color:var(--Primary-700, #009BF3);padding:10px 16px;justify-content:center;align-items:center;gap:10px;font-family:Inter;font-size:12px;font-style:normal;font-weight:600;line-height:18px;text-transform:capitalize}.logo-img{border-radius:50%;width:100%;height:100%;object-fit:cover}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.summary-card{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:10px;padding:16px 18px;transition:box-shadow .2s}.summary-card:hover{box-shadow:0 2px 8px #0000000f}.summary-icon{width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.summary-icon.icon-warning{background:#fff3e0}.summary-icon.icon-primary{background:#e3f2fd}.summary-icon.icon-success{background:#e8f5e9}.summary-icon.icon-danger{background:#fce4ec}.summary-icon.icon-paid{background:#e0f2f1}.summary-label{font-family:Inter;font-size:12px;color:var(--Gray-500, #667085);font-weight:500;line-height:18px}.summary-value{font-family:Inter;font-size:22px;font-weight:700;color:var(--Gray-900, #101828);line-height:1.2}.summary-sub{font-family:Inter;font-size:11px;color:var(--Gray-400, #98A2B3);font-weight:400;margin-top:2px}.brands-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.overview-chip{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:10px;padding:12px 16px;cursor:pointer;transition:all .2s}.overview-chip:hover,.overview-chip.chip-active{border-color:var(--Primary-700, #009BF3);box-shadow:0 0 0 1px var(--Primary-700, #009BF3)}.overview-chip .chip-label{font-family:Inter;font-size:12px;color:var(--Gray-500, #667085);font-weight:500;line-height:18px}.overview-chip .chip-value{font-family:Inter;font-size:20px;font-weight:700;color:var(--Gray-900, #101828)}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}\n"] }]
380
+ args: [{ selector: 'lib-brands-billing', template: "<!-- Brands & Billing Section -->\n<div class=\"brands-section mx-3 mt-4 mb-4\">\n <div class=\"d-flex justify-content-between align-items-start mb-3\">\n <div>\n <div class=\"billingheader\">Brands & Billing</div>\n <div class=\"text-muted small\">Click any brand to manage billing \u2014 configured brands open invoices directly</div>\n </div>\n <button *ngIf=\"userRole === 'superadmin'\"\n type=\"button\"\n class=\"btn btn-icon btn-light-primary\"\n (click)=\"openInvoiceSettings()\"\n ngbTooltip=\"Invoice Settings\"\n aria-label=\"Invoice Settings\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M12 15.5A3.5 3.5 0 1 0 12 8.5a3.5 3.5 0 0 0 0 7Z\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n\n <!-- Overview Chips \u2014 Active / Hold / Deactive each double as a tab. -->\n <div class=\"row g-3 mb-4\">\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Active' ? 'chip-active' : ''\" (click)=\"setFilter('Active')\">\n <div class=\"chip-label\">Active</div>\n <div class=\"chip-value\">{{ activeBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Hold' ? 'chip-active' : ''\" (click)=\"setFilter('Hold')\">\n <div class=\"chip-label\">Hold</div>\n <div class=\"chip-value\">{{ holdBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Suspended' ? 'chip-active' : ''\" (click)=\"setFilter('Suspended')\">\n <div class=\"chip-label\">Suspended</div>\n <div class=\"chip-value\">{{ suspendedBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\" [ngClass]=\"activeFilter === 'Deactive' ? 'chip-active' : ''\" (click)=\"setFilter('Deactive')\">\n <div class=\"chip-label\">Deactive</div>\n <div class=\"chip-value\">{{ deactiveBrands }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\">\n <div class=\"chip-label\">Total Bill Due</div>\n <div class=\"chip-value text-danger\">\u20B9{{ totalBillDue | number:'1.0-3':'en-IN' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"overview-chip\">\n <div class=\"chip-label\">Stores Under Billing</div>\n <div class=\"chip-value\">{{ storesUnderBilling }}</div>\n </div>\n </div>\n </div>\n\n <!-- Payment-status pill row \u2014 independent of the lifecycle tab above,\n visible regardless of which tab is selected. -->\n <div class=\"d-flex align-items-center gap-2 mb-3\">\n <span class=\"text-muted small\">Payment:</span>\n <button class=\"btn btn-sm\"\n [ngClass]=\"paymentSubFilter === '' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setPaymentSubFilter('')\">All</button>\n <button *ngFor=\"let pill of paymentSubTabs\" class=\"btn btn-sm\"\n [ngClass]=\"paymentSubFilter === pill.value ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setPaymentSubFilter(pill.value)\">\n {{ pill.label }} ({{ paymentPillCount(pill.value) }})\n </button>\n </div>\n\n <!-- Search & Toolbar -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar w-100\">\n <div class=\"d-flex justify-content-end\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search brands...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"brandFilterObject\" (appliedFilters)=\"applyBrandFilters($event)\"></lib-filters>\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!brandsList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">Export</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"brandsLoading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- No Data -->\n <ng-container *ngIf=\"brandsNoData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Brands Table -->\n <div *ngIf=\"!brandsLoading && !brandsNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th class=\"cursor-pointer\" (click)=\"sortData('clientName')\">Brand Name\n <svg [ngClass]=\"sortColumName === 'clientName' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'clientName' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('totalStores')\">Stores\n <svg [ngClass]=\"sortColumName === 'totalStores' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'totalStores' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>Billing Stores</th>\n <th>Products Added</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('billAmountDue')\">Bill Amount Due\n <svg [ngClass]=\"sortColumName === 'billAmountDue' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'billAmountDue' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('status')\">Status\n <svg [ngClass]=\"sortColumName === 'status' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'status' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('paymentStatus')\">Payment Status\n <svg [ngClass]=\"sortColumName === 'paymentStatus' && sortBy === 1 ? 'rotate' : ''\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumName === 'paymentStatus' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th scope=\"col\">Actions</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let brand of brandsList; let i = index\">\n <td>\n <div class=\"table-title table-title-primary d-flex cursor-pointer\" (click)=\"viewBrand(brand)\">\n <div class=\"symbol symbol-35px symbol-circle me-2\">\n <span class=\"symbol-label text-symbol\">\n <span *ngIf=\"!brand?.logo\" class=\"symbol-label bg-light-primary text-symbol\">\n {{ brand?.clientName?.charAt(0) }}\n </span>\n <img *ngIf=\"brand?.logo\" class=\"logo-img\" [src]=\"brand?.logo\" alt=\"\">\n </span>\n </div>\n <div>\n <u>{{ brand?.clientName | uppercase }}</u>\n <div class=\"text-muted small\" style=\"line-height: 1;\">ID: {{ brand?.clientId }}</div>\n </div>\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ brand?.totalStores }} Stores</div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngIf=\"brand?.billingStores > 0\">{{ brand?.billingStores }}</span>\n <span *ngIf=\"!brand?.billingStores\" class=\"text-muted\">\u2014</span>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngIf=\"brand?.productsAdded > 0\">{{ brand?.productsAdded }} Products</span>\n <span *ngIf=\"!brand?.productsAdded\" class=\"text-muted small\">Setup billing to add products</span>\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <span *ngIf=\"brand?.billAmountDue > 0\">\u20B9{{ brand?.billAmountDue | number:'1.0-3':'en-IN' }}</span>\n <span *ngIf=\"!brand?.billAmountDue\" class=\"text-muted\">\u2014</span>\n </div>\n </td>\n <td>\n <div [ngClass]=\"brand?.status === 'active' ? 'badge badge-light-success' :\n 'badge badge-light-danger'\" class=\"mt-3\">\n {{ brand?.status }}\n </div>\n </td>\n <td>\n <div [ngClass]=\"brand?.paymentStatus === 'paid' ? 'badge badge-light-success' :\n brand?.paymentStatus === 'trial' ? 'badge badge-light-warning' :\n 'badge badge-light-danger'\" class=\"mt-3\">\n {{ brand?.paymentStatus }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <button *ngIf=\"!brand?.billingConfigured\" class=\"btn btn-sm viewdetails\" (click)=\"setupBilling(brand)\">\n Setup Billing\n </button>\n <button *ngIf=\"brand?.billingConfigured\" class=\"btn btn-sm viewdetails\" (click)=\"viewBrand(brand)\">\n View\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <div *ngIf=\"!brandsLoading && !brandsNoData\">\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </div>\n </div>", styles: [".paymenthistory{padding:0px 1.25rem!important}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:20px}.activePlanBtnprimary{border-radius:6px;background:var(--Primary-50, #EAF8FF)!important;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a!important;color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.rotate{rotate:180deg;transition:1s}.invoicesearch{color:var(--Gray-700, #344054)!important;font-family:Inter;font-size:14px!important;font-style:normal;font-weight:500!important;height:100%}.invoicesearch::placeholder{color:var(--Gray-700, #344054)!important}.invheader{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.billingheader{color:var(--Gray-900, #101828);font-family:Inter;font-size:18px;font-style:normal;font-weight:600;line-height:28px}.table-title{font-family:Inter;font-size:14px;font-weight:500;line-height:3!important}.table-title-primary{color:var(--Primary-700, #009BF3)!important;font-family:Inter;font-size:14px;font-weight:500!important;line-height:3!important}.text-symbol{color:var(--primary-600, #00A3FF)}.symbol-label{font-family:Inter;font-size:16px;font-weight:500;line-height:24px;letter-spacing:0em;text-align:center}.viewdetails{border-radius:8px;border:1px solid var(--Primary-50, #EAF8FF);background:var(--Primary-50, #EAF8FF);box-shadow:0 1px 2px #1018280d;color:var(--Primary-700, #009BF3);padding:10px 16px;justify-content:center;align-items:center;gap:10px;font-family:Inter;font-size:12px;font-style:normal;font-weight:600;line-height:18px;text-transform:capitalize}.logo-img{border-radius:50%;width:100%;height:100%;object-fit:cover}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.summary-card{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:10px;padding:16px 18px;transition:box-shadow .2s}.summary-card:hover{box-shadow:0 2px 8px #0000000f}.summary-icon{width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.summary-icon.icon-warning{background:#fff3e0}.summary-icon.icon-primary{background:#e3f2fd}.summary-icon.icon-success{background:#e8f5e9}.summary-icon.icon-danger{background:#fce4ec}.summary-icon.icon-paid{background:#e0f2f1}.summary-label{font-family:Inter;font-size:12px;color:var(--Gray-500, #667085);font-weight:500;line-height:18px}.summary-value{font-family:Inter;font-size:22px;font-weight:700;color:var(--Gray-900, #101828);line-height:1.2}.summary-sub{font-family:Inter;font-size:11px;color:var(--Gray-400, #98A2B3);font-weight:400;margin-top:2px}.brands-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.overview-chip{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:10px;padding:12px 16px;cursor:pointer;transition:all .2s}.overview-chip:hover,.overview-chip.chip-active{border-color:var(--Primary-700, #009BF3);box-shadow:0 0 0 1px var(--Primary-700, #009BF3)}.overview-chip .chip-label{font-family:Inter;font-size:12px;color:var(--Gray-500, #667085);font-weight:500;line-height:18px}.overview-chip .chip-value{font-family:Inter;font-size:20px;font-weight:700;color:var(--Gray-900, #101828)}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}\n"] }]
381
381
  }], ctorParameters: () => [{ type: i1.BillingService }, { type: i0.ChangeDetectorRef }, { type: i2.ToastService }, { type: i3.Router }, { type: i4.GlobalStateService }, { type: i4.PageInfoService }, { type: i5.NgbModal }] });
382
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmRzLWJpbGxpbmcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2JyYW5kcy1iaWxsaW5nL2JyYW5kcy1iaWxsaW5nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9icmFuZHMtYmlsbGluZy9icmFuZHMtYmlsbGluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLMUMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNERBQTRELENBQUM7Ozs7Ozs7OztBQU8zRyxNQUFNLE9BQU8sc0JBQXNCO0lBcUV2QjtJQUNBO0lBQ0E7SUFDQTtJQUNEO0lBQ0M7SUFDQTtJQTFFTyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUUxQyxXQUFXLEdBQVcsZ0JBQWdCLENBQUM7SUFDdkMsR0FBRyxDQUFNO0lBQ1QsY0FBYyxHQUFZLEtBQUssQ0FBQztJQUNoQyxRQUFRLEdBQVcsRUFBRSxDQUFDO0lBRXRCLDJFQUEyRTtJQUMzRSxxREFBcUQ7SUFDckQsWUFBWSxHQUFXLENBQUMsQ0FBQztJQUN6QixVQUFVLEdBQVcsQ0FBQyxDQUFDO0lBQ3ZCLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFDNUIsY0FBYyxHQUFXLENBQUMsQ0FBQztJQUMzQixXQUFXLEdBQVcsQ0FBQyxDQUFDO0lBQ3hCLFVBQVUsR0FBVyxDQUFDLENBQUM7SUFDdkIsVUFBVSxHQUFXLENBQUMsQ0FBQztJQUN2QixlQUFlLEdBQVcsQ0FBQyxDQUFDO0lB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c0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgQmlsbGluZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9iaWxsaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlLCBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuaW1wb3J0IHsgSW52b2ljZVNldHRpbmdzTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9pbnZvaWNlLXNldHRpbmdzLW1vZGFsL2ludm9pY2Utc2V0dGluZ3MtbW9kYWwuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJyYW5kcy1iaWxsaW5nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JyYW5kcy1iaWxsaW5nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2JyYW5kcy1iaWxsaW5nLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBCcmFuZHNCaWxsaW5nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBzZWxlY3RlZFRhYjogc3RyaW5nID0gJ2JyYW5kcy1iaWxsaW5nJztcbiAgbGVuOiBhbnk7XG4gIHNlYXJjaERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGNsaWVudElkOiBzdHJpbmcgPSAnJztcblxuICAvLyBPdmVydmlldyDigJQgY291bnRzIGFyZSBjb21wdXRlZCBieSB0aGUgQVBJIGFnYWluc3QgdGhlIEZVTEwgcG9wdWxhdGlvbiBzb1xuICAvLyBjaGlwcyBkb24ndCBjaGFuZ2Ugd2hlbiB0aGUgdXNlciBmaWx0ZXJzIHRoZSBsaXN0LlxuICBhY3RpdmVCcmFuZHM6IG51bWJlciA9IDA7XG4gIGhvbGRCcmFuZHM6IG51bWJlciA9IDA7XG4gIHN1c3BlbmRlZEJyYW5kczogbnVtYmVyID0gMDtcbiAgZGVhY3RpdmVCcmFuZHM6IG51bWJlciA9IDA7XG4gIHRyaWFsQnJhbmRzOiBudW1iZXIgPSAwO1xuICBwYWlkQnJhbmRzOiBudW1iZXIgPSAwO1xuICBmcmVlQnJhbmRzOiBudW1iZXIgPSAwO1xuICB0cmlhbFBhaWRCcmFuZHM6IG51bWJlciA9IDA7XG4gIHVuYmlsbGVkQnJhbmRzOiBudW1iZXIgPSAwO1xuICAvLyBzdGF0dXMgKGFjdGl2ZS9ob2xkL3N1c3BlbmRlZC9kZWFjdGl2ZS9hbGwpIOKGkiBwYXltZW50ICh0cmlhbC9wYWlkL2ZyZWUvdHJpYWxQYWlkKSDihpIgY291bnQuXG4gIC8vIERyaXZlcyB0aGUgUGF5bWVudCBwaWxsIGNvdW50cyBzbyB0aGV5IHJlZmxlY3QgdGhlIGN1cnJlbnRseS1zZWxlY3RlZFxuICAvLyBsaWZlY3ljbGUgdGFiIGluc3RlYWQgb2YgdGhlIGdsb2JhbCB0b3RhbHMuXG4gIHBheW1lbnRCeVN0YXR1czogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgbnVtYmVyPj4gPSB7fTtcbiAgdG90YWxCaWxsRHVlOiBudW1iZXIgPSAwO1xuICBzdG9yZXNVbmRlckJpbGxpbmc6IG51bWJlciA9IDA7XG5cbiAgLy8gVGFibGVcbiAgYnJhbmRzTGlzdDogYW55ID0gW107XG4gIGJyYW5kc0xvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBicmFuZHNOb0RhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdG90YWxJdGVtczogbnVtYmVyID0gMDtcbiAgcGFnZVNpemU6IG51bWJlciA9IDEwO1xuICBjdXJyZW50UGFnZTogbnVtYmVyID0gMTtcbiAgaXRlbXNQZXJQYWdlOiBudW1iZXIgPSAxMDtcbiAgcGFnaW5hdGlvblNpemVzID0gWzEwLCAyMCwgMzBdO1xuICBzb3J0Q29sdW1OYW1lOiBzdHJpbmcgPSAndG90YWxTdG9yZXMnO1xuICBzb3J0Qnk6IG51bWJlciA9IC0xO1xuICAvLyBQcmltYXJ5IHRhYiDigJQgbmFycm93cyB0aGUgbGlzdCB0byBvbmUgbGlmZWN5Y2xlIGJ1Y2tldC5cbiAgLy8gRGVmYXVsdCBpcyBBY3RpdmUgYmVjYXVzZSB0aGF0J3Mgd2hlcmUgZGF5LXRvLWRheSB3b3JrIGhhcHBlbnMuXG4gIGFjdGl2ZUZpbHRlcjogc3RyaW5nID0gJ0FjdGl2ZSc7XG4gIGZpbHRlclRhYnMgPSBbJ0FjdGl2ZScsICdIb2xkJywgJ1N1c3BlbmRlZCcsICdEZWFjdGl2ZSddO1xuICAvLyBQYXltZW50IHN1Yi1maWx0ZXIg4oCUIGluZGVwZW5kZW50IG9mIHRoZSBsaWZlY3ljbGUgdGFiLlxuICAvLyAnJyBtZWFucyBcIm5vIHBheW1lbnQtc3RhdHVzIGZpbHRlciBhcHBsaWVkXCIuXG4gIHBheW1lbnRTdWJGaWx0ZXI6IHN0cmluZyA9ICcnO1xuICAvLyBEaXNwbGF5IGxhYmVsIOKGkiBiYWNrZW5kIHBheW1lbnRTdGF0dXMgdmFsdWUuIEtlcHQgaW4gbGFiZWwtb3JkZXIgc28gdGhlXG4gIC8vIHRlbXBsYXRlIGNhbiBqdXN0IGl0ZXJhdGUgb3ZlciB0aGUgcGFpcnMuXG4gIHBheW1lbnRTdWJUYWJzOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4gPSBbXG4gICAgeyBsYWJlbDogJ1BhaWQnLCB2YWx1ZTogJ3BhaWQnIH0sXG4gICAgeyBsYWJlbDogJ1RyaWFsJywgdmFsdWU6ICd0cmlhbCcgfSxcbiAgICB7IGxhYmVsOiAnUGFpZC1UcmlhbCcsIHZhbHVlOiAndHJpYWxQYWlkJyB9LFxuICAgIHsgbGFiZWw6ICdGcmVlJywgdmFsdWU6ICdmcmVlJyB9LFxuICAgIHsgbGFiZWw6ICdVbmJpbGxlZCcsIHZhbHVlOiAndW5iaWxsZWQnIH0sXG4gIF07XG4gIHN0YXR1c0ZpbHRlcjogYW55ID0gW107XG5cbiAgYnJhbmRGaWx0ZXJPYmplY3QgPSBbXG4gICAgeyBEZXNjcmlwdGlvbjogJ1N0YXR1cycsIHR5cGU6ICdzaW5nbGUnLCBJc3N1ZXM6IFt7IGlkOiAnYWN0aXZlJywgdGV4dDogJ0FjdGl2ZScgfSwgeyBpZDogJ2hvbGQnLCB0ZXh0OiAnSG9sZCcgfSwgeyBpZDogJ3N1c3BlbmRlZCcsIHRleHQ6ICdTdXNwZW5kZWQnIH0sIHsgaWQ6ICdkZWFjdGl2ZScsIHRleHQ6ICdEZWFjdGl2ZScgfSwgeyBpZDogJ3RyaWFsJywgdGV4dDogJ1RyaWFsJyB9LCB7IGlkOiAncGFpZCcsIHRleHQ6ICdQYWlkJyB9LCB7IGlkOiAnZnJlZScsIHRleHQ6ICdGcmVlJyB9LCB7IGlkOiAndHJpYWxQYWlkJywgdGV4dDogJ1RyaWFsLVBhaWQnIH0sIHsgaWQ6ICd1bmJpbGxlZCcsIHRleHQ6ICdVbmJpbGxlZCcgfV0gfSxcbiAgXTtcblxuICB1c2VyUm9sZTogc3RyaW5nID0gJyc7XG5cbiAgLy8gc2Vzc2lvblN0b3JhZ2Uga2V5IGZvciB0aGUgcGFnZSdzIHBlcnNpc3RlZCBzdGF0ZS4gc2Vzc2lvblN0b3JhZ2UgaXNcbiAgLy8gc2NvcGVkIHBlci10YWIgYW5kIGNsZWFyZWQgd2hlbiB0aGUgdGFiIGNsb3Nlcywgc28gd2UgZG9uJ3QgYWNjdW11bGF0ZVxuICAvLyBzdGFsZSBzdGF0ZSBhY3Jvc3MgbG9naW5zLiBVUkwgcXVlcnlQYXJhbXMgd291bGQgYmUgbW9yZSBzaGFyZWFibGUgYnV0XG4gIC8vIHdvdWxkIGNsdXR0ZXIgdGhlIFVSTDsgc2Vzc2lvblN0b3JhZ2UgaXMgZW5vdWdoIGZvciB0aGUgXCJiYWNrLXRvLWxpc3RcIlxuICAvLyBuYXZpZ2F0aW9uIHBhdHRlcm4gdGhpcyBpcyBzb2x2aW5nLlxuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlU3RvcmFnZUtleSA9ICdicmFuZHMtYmlsbGluZzpsaXN0LXN0YXRlJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGJpbGxpbmdTZXJ2aWNlOiBCaWxsaW5nU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIHBhZ2VJbmZvOiBQYWdlSW5mb1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VySW5mbyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXItaW5mbycpIHx8ICd7fScpO1xuICAgICAgdGhpcy51c2VyUm9sZSA9IHVzZXJJbmZvPy5yb2xlIHx8ICcnO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy51c2VyUm9sZSA9ICcnO1xuICAgIH1cbiAgICAvLyBSZXN0b3JlIGFueSBwZXJzaXN0ZWQgbGlzdCBzdGF0ZSBCRUZPUkUgdGhlIGZpcnN0IGxvYWRCcmFuZHMoKSBjYWxsIHNvXG4gICAgLy8gcGFnZSAvIHNvcnQgLyBmaWx0ZXIgY29tZSBiYWNrIGV4YWN0bHkgYXMgdGhlIHVzZXIgbGVmdCB0aGVtLlxuICAgIHRoaXMucmVzdG9yZVN0YXRlKCk7XG4gICAgdGhpcy5ncy51c2VyQWNjZXNzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGFjY2VzczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGFjY2Vzcykge1xuICAgICAgICAgICAgaWYgKGFjY2Vzcz8udXNlclR5cGUgPT0gJ3RhbmdvJykge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRCcmFuZHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICB9XG5cbiAgb3Blbkludm9pY2VTZXR0aW5ncygpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEludm9pY2VTZXR0aW5nc01vZGFsQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcbiAgICAgIHNpemU6ICdtZCcsXG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLy8gUGVyc2lzdCB0aGUgdXNlcidzIGxpc3QtdmlldyBzdGF0ZSBzbyB3aGVuIHRoZXkgbmF2aWdhdGUgYXdheSAoVmlld1xuICAvLyBicmFuZCDihpIgaW52b2ljZXMpIGFuZCBjb21lIGJhY2sgdmlhIGJyb3dzZXItYmFjayBvciBhcHAtbGV2ZWwgbmF2LFxuICAvLyB0aGV5IGxhbmQgb24gdGhlIHNhbWUgcGFnZS9zb3J0L2ZpbHRlciB0aGV5IGxlZnQgZnJvbS5cbiAgcHJpdmF0ZSBzYXZlU3RhdGUoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5zdGF0ZVN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY3VycmVudFBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLFxuICAgICAgICBzb3J0Q29sdW1OYW1lOiB0aGlzLnNvcnRDb2x1bU5hbWUsXG4gICAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICAgIGFjdGl2ZUZpbHRlcjogdGhpcy5hY3RpdmVGaWx0ZXIsXG4gICAgICAgIHBheW1lbnRTdWJGaWx0ZXI6IHRoaXMucGF5bWVudFN1YkZpbHRlcixcbiAgICAgICAgc3RhdHVzRmlsdGVyOiB0aGlzLnN0YXR1c0ZpbHRlcixcbiAgICAgICAgbGVuOiB0aGlzLmxlbiB8fCAnJyxcbiAgICAgIH0pKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHNlc3Npb25TdG9yYWdlIGNhbiB0aHJvdyBpbiBxdW90YSAvIHByaXZhdGUtbW9kZSBlZGdlIGNhc2VzLlxuICAgICAgLy8gU2lsZW50bHkgaWdub3JlIOKAlCB0aGUgdXNlciBqdXN0IHdvbid0IGdldCB0aGUgc2F2ZWQtc3RhdGUgYmVoYXZpb3IuXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5zdGF0ZVN0b3JhZ2VLZXkpO1xuICAgICAgaWYgKCFyYXcpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHMgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgICBpZiAodHlwZW9mIHMgIT09ICdvYmplY3QnIHx8IHMgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2Ygcy5jdXJyZW50UGFnZSA9PT0gJ251bWJlcicpIHRoaXMuY3VycmVudFBhZ2UgPSBzLmN1cnJlbnRQYWdlO1xuICAgICAgaWYgKHR5cGVvZiBzLnBhZ2VTaXplID09PSAnbnVtYmVyJykge1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gcy5wYWdlU2l6ZTtcbiAgICAgICAgdGhpcy5pdGVtc1BlclBhZ2UgPSBzLnBhZ2VTaXplO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBzLnNvcnRDb2x1bU5hbWUgPT09ICdzdHJpbmcnKSB0aGlzLnNvcnRDb2x1bU5hbWUgPSBzLnNvcnRDb2x1bU5hbWU7XG4gICAgICBpZiAodHlwZW9mIHMuc29ydEJ5ID09PSAnbnVtYmVyJykgdGhpcy5zb3J0QnkgPSBzLnNvcnRCeTtcbiAgICAgIGlmICh0eXBlb2Ygcy5hY3RpdmVGaWx0ZXIgPT09ICdzdHJpbmcnICYmIHRoaXMuZmlsdGVyVGFicy5pbmNsdWRlcyhzLmFjdGl2ZUZpbHRlcikpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVGaWx0ZXIgPSBzLmFjdGl2ZUZpbHRlcjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygcy5wYXltZW50U3ViRmlsdGVyID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAocy5wYXltZW50U3ViRmlsdGVyID09PSAnJyB8fCB0aGlzLnBheW1lbnRTdWJUYWJzLnNvbWUocCA9PiBwLnZhbHVlID09PSBzLnBheW1lbnRTdWJGaWx0ZXIpKSkge1xuICAgICAgICB0aGlzLnBheW1lbnRTdWJGaWx0ZXIgPSBzLnBheW1lbnRTdWJGaWx0ZXI7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzLnN0YXR1c0ZpbHRlcikpIHRoaXMuc3RhdHVzRmlsdGVyID0gcy5zdGF0dXNGaWx0ZXI7XG4gICAgICBpZiAodHlwZW9mIHMubGVuID09PSAnc3RyaW5nJykgdGhpcy5sZW4gPSBzLmxlbjtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNldFBhZ2VEYXRhKCkge1xuICAgIHRoaXMucGFnZUluZm8uc2V0VGl0bGUoJ0JyYW5kcyAmIEJpbGxpbmcnKTtcbiAgICB0aGlzLnBhZ2VJbmZvLnNldERlc2NyaXB0aW9uKCdNYW5hZ2UgYnJhbmQgYmlsbGluZyBjb25maWd1cmF0aW9ucycpO1xuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoW1xuICAgICAgeyB0aXRsZTogJ01hbmFnZScsIHBhdGg6ICcvbWFuYWdlJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcbiAgICAgIHsgdGl0bGU6ICdNYW5hZ2UnLCBwYXRoOiAnL21hbmFnZScsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcbiAgICBdKTtcbiAgfVxuXG4gIGxvYWRCcmFuZHMoKSB7XG4gICAgdGhpcy5zZWFyY2hEaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuYnJhbmRzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5icmFuZHNOb0RhdGEgPSBmYWxzZTtcblxuICAgIGNvbnN0IHsgc3RhdHVzOiBzdGF0dXNGaWx0ZXIsIHBheW1lbnRTdGF0dXM6IHBheW1lbnRTdGF0dXNGaWx0ZXIgfSA9IHRoaXMuYnVpbGRGaWx0ZXJQYXlsb2FkKCk7XG5cbiAgICBsZXQgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGxpbWl0OiB0aGlzLnBhZ2VTaXplLFxuICAgICAgb2Zmc2V0OiB0aGlzLmN1cnJlbnRQYWdlLFxuICAgICAgc2VhcmNoVmFsdWU6IHRoaXMubGVuLFxuICAgICAgc29ydENvbHVtTmFtZTogdGhpcy5zb3J0Q29sdW1OYW1lLFxuICAgICAgc29ydEJ5OiB0aGlzLnNvcnRCeSxcbiAgICAgIHN0YXR1czogc3RhdHVzRmlsdGVyLFxuICAgICAgcGF5bWVudFN0YXR1czogcGF5bWVudFN0YXR1c0ZpbHRlcixcbiAgICAgIGV4cG9ydDogZmFsc2VcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5icmFuZHNCaWxsaW5nTGlzdChmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChlKSA9PiB7XG4gICAgICAgIC8vIFN1bW1hcnkgY291bnRzIGFyZSBjb21wdXRlZCBieSB0aGUgQVBJIG92ZXIgdGhlIEZVTEwgcG9wdWxhdGlvblxuICAgICAgICAvLyAobm90IHRoZSBmaWx0ZXJlZCBzbGljZSksIHNvIGFwcGx5IHRoZW0gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZVxuICAgICAgICAvLyBjdXJyZW50IGxpZmVjeWNsZSB0YWIgaGFzIGFueSByb3dzLiBQcmV2aW91c2x5IHRoaXMgbGl2ZWQgaW5zaWRlIHRoZVxuICAgICAgICAvLyBgY291bnRgIGJyYW5jaCwgc28gdGhlIGRlZmF1bHQgQWN0aXZlIHRhYiByZXR1cm5pbmcgemVybyByb3dzIGxlZnRcbiAgICAgICAgLy8gSG9sZC9TdXNwZW5kZWQvRGVhY3RpdmUgY2FyZHMgc3R1Y2sgYXQgMC5cbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGU/LmRhdGE/LnN1bW1hcnk7XG4gICAgICAgIGlmIChzdW1tYXJ5KSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVCcmFuZHMgPSBzdW1tYXJ5LmFjdGl2ZSB8fCAwO1xuICAgICAgICAgIHRoaXMuaG9sZEJyYW5kcyA9IHN1bW1hcnkuaG9sZCB8fCAwO1xuICAgICAgICAgIHRoaXMuc3VzcGVuZGVkQnJhbmRzID0gc3VtbWFyeS5zdXNwZW5kZWQgfHwgMDtcbiAgICAgICAgICB0aGlzLmRlYWN0aXZlQnJhbmRzID0gc3VtbWFyeS5kZWFjdGl2ZSB8fCAwO1xuICAgICAgICAgIHRoaXMudHJpYWxCcmFuZHMgPSBzdW1tYXJ5LnRyaWFsIHx8IDA7XG4gICAgICAgICAgdGhpcy5wYWlkQnJhbmRzID0gc3VtbWFyeS5wYWlkIHx8IDA7XG4gICAgICAgICAgdGhpcy5mcmVlQnJhbmRzID0gc3VtbWFyeS5mcmVlIHx8IDA7XG4gICAgICAgICAgdGhpcy50cmlhbFBhaWRCcmFuZHMgPSBzdW1tYXJ5LnRyaWFsUGFpZCB8fCAwO1xuICAgICAgICAgIHRoaXMudW5iaWxsZWRCcmFuZHMgPSBzdW1tYXJ5LnVuYmlsbGVkIHx8IDA7XG4gICAgICAgICAgdGhpcy5wYXltZW50QnlTdGF0dXMgPSBzdW1tYXJ5LnBheW1lbnRCeVN0YXR1cyB8fCB7fTtcbiAgICAgICAgICB0aGlzLnRvdGFsQmlsbER1ZSA9IHN1bW1hcnkudG90YWxCaWxsRHVlIHx8IDA7XG4gICAgICAgICAgdGhpcy5zdG9yZXNVbmRlckJpbGxpbmcgPSBzdW1tYXJ5LnN0b3Jlc1VuZGVyQmlsbGluZyB8fCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGU/LmRhdGE/LmNvdW50KSB7XG4gICAgICAgICAgdGhpcy5icmFuZHNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5icmFuZHNOb0RhdGEgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmJyYW5kc0xpc3QgPSBlLmRhdGE/LmRhdGE7XG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gZS5kYXRhPy5jb3VudDtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmJyYW5kc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmJyYW5kc05vRGF0YSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zZWFyY2hEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoaXMubGVuPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5icmFuZHNMaXN0ID0gW107XG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMDtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICB0aGlzLmJyYW5kc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5icmFuZHNOb0RhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLmJyYW5kc0xpc3QgPSBbXTtcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMDtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RUYWIodGFiOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlbGVjdGVkVGFiID0gdGFiO1xuICB9XG5cbiAgc2V0RmlsdGVyKGZpbHRlcjogc3RyaW5nKSB7XG4gICAgdGhpcy5hY3RpdmVGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICB0aGlzLmxvYWRCcmFuZHMoKTtcbiAgfVxuXG4gIHNldFBheW1lbnRTdWJGaWx0ZXIoc3ViOiBzdHJpbmcpIHtcbiAgICB0aGlzLnBheW1lbnRTdWJGaWx0ZXIgPSBzdWI7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICB0aGlzLmxvYWRCcmFuZHMoKTtcbiAgfVxuXG4gIC8vIFBpbGwtdmFsdWUg4oaSIGNvdW50LCBzY29wZWQgdG8gd2hpY2hldmVyIGxpZmVjeWNsZSB0YWIgaXMgc2VsZWN0ZWQuIFNvXG4gIC8vIFwiUGFpZCAoMylcIiBvbiB0aGUgSG9sZCB0YWIgbWVhbnMgXCIzIEhvbGQgYnJhbmRzIGFyZSBQYWlkXCIsIG5vdCB0aGUgZ2xvYmFsXG4gIC8vIHRvdGFsLiBGYWxscyBiYWNrIHRvIHRoZSBnbG9iYWwgdGFsbHkgaWYgdGhlIG1hdHJpeCBpcyBtaXNzaW5nIGEgYnVja2V0LlxuICBwYXltZW50UGlsbENvdW50KHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHNjb3BlID0gKHRoaXMuYWN0aXZlRmlsdGVyIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGJ1Y2tldCA9IHRoaXMucGF5bWVudEJ5U3RhdHVzPy5bc2NvcGVdO1xuICAgIGlmIChidWNrZXQgJiYgdHlwZW9mIGJ1Y2tldFt2YWx1ZV0gPT09ICdudW1iZXInKSByZXR1cm4gYnVja2V0W3ZhbHVlXTtcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICBjYXNlICdwYWlkJzogICAgICByZXR1cm4gdGhpcy5wYWlkQnJhbmRzO1xuICAgICAgY2FzZSAndHJpYWwnOiAgICAgcmV0dXJuIHRoaXMudHJpYWxCcmFuZHM7XG4gICAgICBjYXNlICd0cmlhbFBhaWQnOiByZXR1cm4gdGhpcy50cmlhbFBhaWRCcmFuZHM7XG4gICAgICBjYXNlICdmcmVlJzogICAgICByZXR1cm4gdGhpcy5mcmVlQnJhbmRzO1xuICAgICAgY2FzZSAndW5iaWxsZWQnOiAgcmV0dXJuIHRoaXMudW5iaWxsZWRCcmFuZHM7XG4gICAgICBkZWZhdWx0OiAgICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICAvLyBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgc3RhdHVzIC8gcGF5bWVudFN0YXR1cyBwYXlsb2FkIHNlbnQgdG9cbiAgLy8gYnJhbmRzQmlsbGluZ0xpc3QuIExpZmVjeWNsZSB0YWIgYW5kIHBheW1lbnQtc3RhdHVzIHBpbGwgYXBwbHlcbiAgLy8gaW5kZXBlbmRlbnRseSDigJQgYm90aCBjYW4gYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUuXG4gIHByaXZhdGUgYnVpbGRGaWx0ZXJQYXlsb2FkKCk6IHsgc3RhdHVzOiBzdHJpbmdbXTsgcGF5bWVudFN0YXR1czogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgcHJpbWFyeSA9ICh0aGlzLmFjdGl2ZUZpbHRlciB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBzdGF0dXMgPSBwcmltYXJ5ID8gW3ByaW1hcnldIDogW107XG4gICAgY29uc3QgcGF5bWVudFN0YXR1cyA9IHRoaXMucGF5bWVudFN1YkZpbHRlciA/IFt0aGlzLnBheW1lbnRTdWJGaWx0ZXJdIDogW107XG4gICAgcmV0dXJuIHsgc3RhdHVzLCBwYXltZW50U3RhdHVzIH07XG4gIH1cblxuICBzZWFyY2hGaWVsZCgpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgIHRoaXMubG9hZEJyYW5kcygpO1xuICB9XG5cbiAgc29ydERhdGEoY29sdW1uOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNvcnRDb2x1bU5hbWUgPSBjb2x1bW47XG4gICAgdGhpcy5zb3J0QnkgKj0gLTE7XG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmxvYWRCcmFuZHMoKTtcbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShwYWdlT2Zmc2V0OiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFyc2VJbnQocGFnZU9mZnNldCk7XG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICB0aGlzLmxvYWRCcmFuZHMoKTtcbiAgfVxuXG4gIG9uUGFnZVNpemVDaGFuZ2UocGFnZVNpemU6IGFueSkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMucGFnZVNpemUgPSBwYXJzZUludChwYWdlU2l6ZSk7XG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICB0aGlzLmxvYWRCcmFuZHMoKTtcbiAgfVxuXG4gIG9uRXhwb3J0KCkge1xuICAgIGNvbnN0IHsgc3RhdHVzOiBzdGF0dXNGaWx0ZXIsIHBheW1lbnRTdGF0dXM6IHBheW1lbnRTdGF0dXNGaWx0ZXIgfSA9IHRoaXMuYnVpbGRGaWx0ZXJQYXlsb2FkKCk7XG5cbiAgICBsZXQgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmxlbixcbiAgICAgIHNvcnRDb2x1bU5hbWU6IHRoaXMuc29ydENvbHVtTmFtZSxcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICBzdGF0dXM6IHN0YXR1c0ZpbHRlcixcbiAgICAgIHBheW1lbnRTdGF0dXM6IHBheW1lbnRTdGF0dXNGaWx0ZXIsXG4gICAgICBleHBvcnQ6IHRydWVcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5icmFuZHNCaWxsaW5nTGlzdEV4cG9ydChmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5zYXZlQXNFeGNlbEZpbGUocmVzLCAnYnJhbmRzLWJpbGxpbmcnKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGUpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdTb21ldGhpbmcgd2VudCBXcm9uZy4uJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhcHBseUJyYW5kRmlsdGVycyhldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50Py5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5EZXNjcmlwdGlvbiA9PT0gJ1N0YXR1cycpIHtcbiAgICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gZWxlbWVudC5Jc3N1ZXM/LmlkIHx8ICcnO1xuICAgICAgICAgIGlmIChpZCA9PT0gJ2FjdGl2ZScgfHwgaWQgPT09ICdob2xkJyB8fCBpZCA9PT0gJ3N1c3BlbmRlZCcgfHwgaWQgPT09ICdkZWFjdGl2ZScpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRmlsdGVyID0gaWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBpZC5zbGljZSgxKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlkID09PSAndHJpYWwnIHx8IGlkID09PSAncGFpZCcgfHwgaWQgPT09ICdmcmVlJyB8fCBpZCA9PT0gJ3RyaWFsUGFpZCcgfHwgaWQgPT09ICd1bmJpbGxlZCcpIHtcbiAgICAgICAgICAgIC8vIFBheW1lbnQtc3RhdHVzIHBpY2tzIGp1c3Qgc2V0IHRoZSBzdWItZmlsdGVyOyBsaWZlY3ljbGUgdGFiIGlzXG4gICAgICAgICAgICAvLyBpbmRlcGVuZGVudCBzbyB3ZSBsZWF2ZSBhY3RpdmVGaWx0ZXIgYWxvbmUuXG4gICAgICAgICAgICB0aGlzLnBheW1lbnRTdWJGaWx0ZXIgPSBpZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgIHRoaXMubG9hZEJyYW5kcygpO1xuICB9XG5cbiAgc2V0dXBCaWxsaW5nKGJyYW5kOiBhbnkpIHtcbiAgICAvLyBQZXJzaXN0IGJlZm9yZSBuYXZpZ2F0aW5nIGF3YXkgc28gdGhlIHVzZXIgbGFuZHMgYmFjayBvbiB0aGUgc2FtZVxuICAgIC8vIHBhZ2UgLyBmaWx0ZXIgd2hlbiB0aGV5IHJldHVybi5cbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgIGNvbnN0IGRhdGF2YWx1ZTogYW55ID0gSlNPTi5wYXJzZShcbiAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgfHwgXCJ7fVwiXG4gICAgKTtcbiAgICBkYXRhdmFsdWUuY2xpZW50ID0gYnJhbmQuY2xpZW50SWQudG9TdHJpbmcoKTtcbiAgICBkYXRhdmFsdWUuY2xpZW50TmFtZSA9IGJyYW5kLmNsaWVudE5hbWU7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkoZGF0YXZhbHVlKSk7XG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KGRhdGF2YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL2JpbGxpbmcvc2V0dXAtYmlsbGluZyddKTtcbiAgfVxuXG4gIHZpZXdCcmFuZChicmFuZDogYW55KSB7XG4gICAgLy8gUGVyc2lzdCBiZWZvcmUgbmF2aWdhdGluZyBhd2F5IHNvIHRoZSB1c2VyIGxhbmRzIGJhY2sgb24gdGhlIHNhbWVcbiAgICAvLyBwYWdlIC8gZmlsdGVyIHdoZW4gdGhleSByZXR1cm4gZnJvbSB0aGUgcGVyLWJyYW5kIEludm9pY2VzIHZpZXcuXG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICBjb25zdCBkYXRhdmFsdWU6IGFueSA9IEpTT04ucGFyc2UoXG4gICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwie31cIlxuICAgICk7XG4gICAgZGF0YXZhbHVlLmNsaWVudCA9IGJyYW5kLmNsaWVudElkLnRvU3RyaW5nKCk7XG4gICAgZGF0YXZhbHVlLmNsaWVudE5hbWUgPSBicmFuZC5jbGllbnROYW1lO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KGRhdGF2YWx1ZSkpO1xuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dChkYXRhdmFsdWUpO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS9iaWxsaW5nL2JyYW5kLWludm9pY2VzJ10pO1xuICB9XG5cbn0iLCI8IS0tIEJyYW5kcyAmIEJpbGxpbmcgU2VjdGlvbiAtLT5cbjxkaXYgY2xhc3M9XCJicmFuZHMtc2VjdGlvbiBteC0zIG10LTQgbWItNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLXN0YXJ0IG1iLTNcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJpbGxpbmdoZWFkZXJcIj5CcmFuZHMgJiBCaWxsaW5nPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5DbGljayBhbnkgYnJhbmQgdG8gbWFuYWdlIGJpbGxpbmcg4oCUIGNvbmZpZ3VyZWQgYnJhbmRzIG9wZW4gaW52b2ljZXMgZGlyZWN0bHk8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInVzZXJSb2xlID09PSAnc3VwZXJhZG1pbidcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWljb24gYnRuLWxpZ2h0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3Blbkludm9pY2VTZXR0aW5ncygpXCJcbiAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkludm9pY2UgU2V0dGluZ3NcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiSW52b2ljZSBTZXR0aW5nc1wiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDE1LjVBMy41IDMuNSAwIDEgMCAxMiA4LjVhMy41IDMuNSAwIDAgMCAwIDdaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS43XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE5LjQgMTVhMS42NSAxLjY1IDAgMCAwIC4zMyAxLjgybC4wNi4wNmEyIDIgMCAxIDEtMi44MyAyLjgzbC0uMDYtLjA2YTEuNjUgMS42NSAwIDAgMC0xLjgyLS4zMyAxLjY1IDEuNjUgMCAwIDAtMSAxLjUxVjIxYTIgMiAwIDEgMS00IDB2LS4wOUExLjY1IDEuNjUgMCAwIDAgOSAxOS40YTEuNjUgMS42NSAwIDAgMC0xLjgyLjMzbC0uMDYuMDZhMiAyIDAgMSAxLTIuODMtMi44M2wuMDYtLjA2YTEuNjUgMS42NSAwIDAgMCAuMzMtMS44MiAxLjY1IDEuNjUgMCAwIDAtMS41MS0xSDNhMiAyIDAgMSAxIDAtNGguMDlBMS42NSAxLjY1IDAgMCAwIDQuNiA5YTEuNjUgMS42NSAwIDAgMC0uMzMtMS44MmwtLjA2LS4wNmEyIDIgMCAxIDEgMi44My0yLjgzbC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMS44Mi4zM0g5YTEuNjUgMS42NSAwIDAgMCAxLTEuNTFWM2EyIDIgMCAxIDEgNCAwdi4wOWExLjY1IDEuNjUgMCAwIDAgMSAxLjUxIDEuNjUgMS42NSAwIDAgMCAxLjgyLS4zM2wuMDYtLjA2YTIgMiAwIDEgMSAyLjgzIDIuODNsLS4wNi4wNmExLjY1IDEuNjUgMCAwIDAtLjMzIDEuODJWOWExLjY1IDEuNjUgMCAwIDAgMS41MSAxSDIxYTIgMiAwIDEgMSAwIDRoLS4wOWExLjY1IDEuNjUgMCAwIDAtMS41MSAxWlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuN1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE92ZXJ2aWV3IENoaXBzIOKAlCBBY3RpdmUgLyBIb2xkIC8gRGVhY3RpdmUgZWFjaCBkb3VibGUgYXMgYSB0YWIuIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctMyBtYi00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJ2aWV3LWNoaXBcIiBbbmdDbGFzc109XCJhY3RpdmVGaWx0ZXIgPT09ICdBY3RpdmUnID8gJ2NoaXAtYWN0aXZlJyA6ICcnXCIgKGNsaWNrKT1cInNldEZpbHRlcignQWN0aXZlJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtbGFiZWxcIj5BY3RpdmU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtdmFsdWVcIj57eyBhY3RpdmVCcmFuZHMgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdmVydmlldy1jaGlwXCIgW25nQ2xhc3NdPVwiYWN0aXZlRmlsdGVyID09PSAnSG9sZCcgPyAnY2hpcC1hY3RpdmUnIDogJydcIiAoY2xpY2spPVwic2V0RmlsdGVyKCdIb2xkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtbGFiZWxcIj5Ib2xkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwLXZhbHVlXCI+e3sgaG9sZEJyYW5kcyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJ2aWV3LWNoaXBcIiBbbmdDbGFzc109XCJhY3RpdmVGaWx0ZXIgPT09ICdTdXNwZW5kZWQnID8gJ2NoaXAtYWN0aXZlJyA6ICcnXCIgKGNsaWNrKT1cInNldEZpbHRlcignU3VzcGVuZGVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtbGFiZWxcIj5TdXNwZW5kZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtdmFsdWVcIj57eyBzdXNwZW5kZWRCcmFuZHMgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdmVydmlldy1jaGlwXCIgW25nQ2xhc3NdPVwiYWN0aXZlRmlsdGVyID09PSAnRGVhY3RpdmUnID8gJ2NoaXAtYWN0aXZlJyA6ICcnXCIgKGNsaWNrKT1cInNldEZpbHRlcignRGVhY3RpdmUnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcC1sYWJlbFwiPkRlYWN0aXZlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwLXZhbHVlXCI+e3sgZGVhY3RpdmVCcmFuZHMgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdmVydmlldy1jaGlwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwLWxhYmVsXCI+VG90YWwgQmlsbCBEdWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtdmFsdWUgdGV4dC1kYW5nZXJcIj7igrl7eyB0b3RhbEJpbGxEdWUgfCBudW1iZXI6JzEuMC0zJzonZW4tSU4nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcnZpZXctY2hpcFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcC1sYWJlbFwiPlN0b3JlcyBVbmRlciBCaWxsaW5nPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwLXZhbHVlXCI+e3sgc3RvcmVzVW5kZXJCaWxsaW5nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBQYXltZW50LXN0YXR1cyBwaWxsIHJvdyDigJQgaW5kZXBlbmRlbnQgb2YgdGhlIGxpZmVjeWNsZSB0YWIgYWJvdmUsXG4gICAgICAgICAgICAgdmlzaWJsZSByZWdhcmRsZXNzIG9mIHdoaWNoIHRhYiBpcyBzZWxlY3RlZC4gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIG1iLTNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPlBheW1lbnQ6PC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInBheW1lbnRTdWJGaWx0ZXIgPT09ICcnID8gJ2FjdGl2ZVBsYW5CdG5wcmltYXJ5JyA6ICdpbmFjdGl2ZVBsYW5CdG4nXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0UGF5bWVudFN1YkZpbHRlcignJylcIj5BbGw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IHBpbGwgb2YgcGF5bWVudFN1YlRhYnNcIiBjbGFzcz1cImJ0biBidG4tc21cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInBheW1lbnRTdWJGaWx0ZXIgPT09IHBpbGwudmFsdWUgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRQYXltZW50U3ViRmlsdGVyKHBpbGwudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAge3sgcGlsbC5sYWJlbCB9fSAoe3sgcGF5bWVudFBpbGxDb3VudChwaWxsLnZhbHVlKSB9fSlcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFNlYXJjaCAmIFRvb2xiYXIgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwYXltZW50aGlzdG9yeSBib3JkZXItMCBweC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10b29sYmFyIHctMTAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gaW52b2ljZXNlYXJjaCBzdmctaWNvbi0xIHBvc2l0aW9uLWFic29sdXRlIG10LTYgbXMtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBvcGFjaXR5PVwiMC41XCIgeD1cIjE3LjAzNjVcIiB5PVwiMTUuMTIyM1wiIHdpZHRoPVwiOC4xNTU0NlwiIGhlaWdodD1cIjJcIiByeD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKDQ1IDE3LjAzNjUgMTUuMTIyMylcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9yZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMSAxOUM2LjU1NTU2IDE5IDMgMTUuNDQ0NCAzIDExQzMgNi41NTU1NiA2LjU1NTU2IDMgMTEgM0MxNS40NDQ0IDMgMTkgNi41NTU1NiAxOSAxMUMxOSAxNS40NDQ0IDE1LjQ0NDQgMTkgMTEgMTlaTTExIDVDNy41MzMzMyA1IDUgNy41MzMzMyA1IDExQzUgMTQuNDY2NyA3LjUzMzMzIDE3IDExIDE3QzE0LjQ2NjcgMTcgMTcgMTQuNDY2NyAxNyAxMUMxNyA3LjUzMzMzIDE0LjQ2NjcgNSAxMSA1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwibGVuXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBpbnZvaWNlc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBicmFuZHMuLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIiAoY2hhbmdlKT1cInNlYXJjaEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWFyY2hEaXNhYmxlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWZpbHRlcnMgW2RhdGFPYmplY3RdPVwiYnJhbmRGaWx0ZXJPYmplY3RcIiAoYXBwbGllZEZpbHRlcnMpPVwiYXBwbHlCcmFuZEZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25FeHBvcnQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFicmFuZHNMaXN0Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+RXhwb3J0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTG9hZGluZyBTaGltbWVyIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYnJhbmRzTG9hZGluZ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gTm8gRGF0YSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJyYW5kc05vRGF0YVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmMgdy0yNVwiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YS5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBCcmFuZHMgVGFibGUgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhYnJhbmRzTG9hZGluZyAmJiAhYnJhbmRzTm9EYXRhXCIgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhY2NvcmRpb24gdGFibGUgYm90dG9tLWJvcmRlciB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ2NsaWVudE5hbWUnKVwiPkJyYW5kIE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRDb2x1bU5hbWUgPT09ICdjbGllbnROYW1lJyAmJiBzb3J0QnkgPT09IDEgPyAncm90YXRlJyA6ICcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAnY2xpZW50TmFtZScgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgndG90YWxTdG9yZXMnKVwiPlN0b3Jlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydENvbHVtTmFtZSA9PT0gJ3RvdGFsU3RvcmVzJyAmJiBzb3J0QnkgPT09IDEgPyAncm90YXRlJyA6ICcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAndG90YWxTdG9yZXMnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkJpbGxpbmcgU3RvcmVzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Qcm9kdWN0cyBBZGRlZDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgnYmlsbEFtb3VudER1ZScpXCI+QmlsbCBBbW91bnQgRHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0Q29sdW1OYW1lID09PSAnYmlsbEFtb3VudER1ZScgJiYgc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydENvbHVtTmFtZSA9PT0gJ2JpbGxBbW91bnREdWUnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ3N0YXR1cycpXCI+U3RhdHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0Q29sdW1OYW1lID09PSAnc3RhdHVzJyAmJiBzb3J0QnkgPT09IDEgPyAncm90YXRlJyA6ICcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAnc3RhdHVzJyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCdwYXltZW50U3RhdHVzJylcIj5QYXltZW50IFN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydENvbHVtTmFtZSA9PT0gJ3BheW1lbnRTdGF0dXMnICYmIHNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRDb2x1bU5hbWUgPT09ICdwYXltZW50U3RhdHVzJyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPkFjdGlvbnM8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGJyYW5kIG9mIGJyYW5kc0xpc3Q7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGUgdGFibGUtdGl0bGUtcHJpbWFyeSBkLWZsZXggY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidmlld0JyYW5kKGJyYW5kKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ltYm9sIHN5bWJvbC0zNXB4IHN5bWJvbC1jaXJjbGUgbWUtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzeW1ib2wtbGFiZWwgdGV4dC1zeW1ib2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFicmFuZD8ubG9nb1wiIGNsYXNzPVwic3ltYm9sLWxhYmVsIGJnLWxpZ2h0LXByaW1hcnkgdGV4dC1zeW1ib2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYnJhbmQ/LmNsaWVudE5hbWU/LmNoYXJBdCgwKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiYnJhbmQ/LmxvZ29cIiBjbGFzcz1cImxvZ28taW1nXCIgW3NyY109XCJicmFuZD8ubG9nb1wiIGFsdD1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1Pnt7IGJyYW5kPy5jbGllbnROYW1lIHwgdXBwZXJjYXNlIH19PC91PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIiBzdHlsZT1cImxpbmUtaGVpZ2h0OiAxO1wiPklEOiB7eyBicmFuZD8uY2xpZW50SWQgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPnt7IGJyYW5kPy50b3RhbFN0b3JlcyB9fSBTdG9yZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYnJhbmQ/LmJpbGxpbmdTdG9yZXMgPiAwXCI+e3sgYnJhbmQ/LmJpbGxpbmdTdG9yZXMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWJyYW5kPy5iaWxsaW5nU3RvcmVzXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+4oCUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJicmFuZD8ucHJvZHVjdHNBZGRlZCA+IDBcIj57eyBicmFuZD8ucHJvZHVjdHNBZGRlZCB9fSBQcm9kdWN0czwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYnJhbmQ/LnByb2R1Y3RzQWRkZWRcIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5TZXR1cCBiaWxsaW5nIHRvIGFkZCBwcm9kdWN0czwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYnJhbmQ/LmJpbGxBbW91bnREdWUgPiAwXCI+4oK5e3sgYnJhbmQ/LmJpbGxBbW91bnREdWUgfCBudW1iZXI6JzEuMC0zJzonZW4tSU4nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFicmFuZD8uYmlsbEFtb3VudER1ZVwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPuKAlDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJicmFuZD8uc3RhdHVzID09PSAnYWN0aXZlJyA/ICdiYWRnZSBiYWRnZS1saWdodC1zdWNjZXNzJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWRnZSBiYWRnZS1saWdodC1kYW5nZXInXCIgY2xhc3M9XCJtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGJyYW5kPy5zdGF0dXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJicmFuZD8ucGF5bWVudFN0YXR1cyA9PT0gJ3BhaWQnID8gJ2JhZGdlIGJhZGdlLWxpZ2h0LXN1Y2Nlc3MnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmQ/LnBheW1lbnRTdGF0dXMgPT09ICd0cmlhbCcgPyAnYmFkZ2UgYmFkZ2UtbGlnaHQtd2FybmluZycgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFkZ2UgYmFkZ2UtbGlnaHQtZGFuZ2VyJ1wiIGNsYXNzPVwibXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBicmFuZD8ucGF5bWVudFN0YXR1cyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFicmFuZD8uYmlsbGluZ1N0b3Jlc1wiIGNsYXNzPVwiYnRuIGJ0bi1zbSB2aWV3ZGV0YWlsc1wiIChjbGljayk9XCJzZXR1cEJpbGxpbmcoYnJhbmQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR1cCBCaWxsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiYnJhbmQ/LmJpbGxpbmdTdG9yZXMgPiAwXCIgY2xhc3M9XCJidG4gYnRuLXNtIHZpZXdkZXRhaWxzXCIgKGNsaWNrKT1cInZpZXdCcmFuZChicmFuZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFicmFuZHNMb2FkaW5nICYmICFicmFuZHNOb0RhdGFcIj5cbiAgICAgICAgICAgICAgICA8bGliLXBhZ2luYXRpb24gY2xhc3M9XCJ0ZXh0LXN0YXJ0XCIgW2l0ZW1zUGVyUGFnZV09XCJpdGVtc1BlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwiY3VycmVudFBhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zXCIgW3BhZ2luYXRpb25TaXplc109XCJwYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PiJdfQ==
382
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmRzLWJpbGxpbmcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2JyYW5kcy1iaWxsaW5nL2JyYW5kcy1iaWxsaW5nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9icmFuZHMtYmlsbGluZy9icmFuZHMtYmlsbGluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLMUMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNERBQTRELENBQUM7Ozs7Ozs7OztBQU8zRyxNQUFNLE9BQU8sc0JBQXNCO0lBcUV2QjtJQUNBO0lBQ0E7SUFDQTtJQUNEO0lBQ0M7SUFDQTtJQTFFTyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUUxQyxXQUFXLEdBQVcsZ0JBQWdCLENBQUM7SUFDdkMsR0FBRyxDQUFNO0lBQ1QsY0FBYyxHQUFZLEtBQUssQ0FBQztJQUNoQyxRQUFRLEdBQVcsRUFBRSxDQUFDO0lBRXRCLDJFQUEyRTtJQUMzRSxxREFBcUQ7SUFDckQsWUFBWSxHQUFXLENBQUMsQ0FBQztJQUN6QixVQUFVLEdBQVcsQ0FBQyxDQUFDO0lBQ3ZCLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFDNUIsY0FBYyxHQUFXLENBQUMsQ0FBQztJQUMzQixXQUFXLEdBQVcsQ0FBQyxDQUFDO0lBQ3hCLFVBQVUsR0FBVyxDQUFDLENBQUM7SUFDdkIsVUFBVSxHQUFXLENBQUMsQ0FBQztJQUN2QixlQUFlLEdBQVcsQ0FBQyxDQUFDO0lB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c0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgQmlsbGluZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9iaWxsaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlLCBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuaW1wb3J0IHsgSW52b2ljZVNldHRpbmdzTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9pbnZvaWNlLXNldHRpbmdzLW1vZGFsL2ludm9pY2Utc2V0dGluZ3MtbW9kYWwuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJyYW5kcy1iaWxsaW5nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JyYW5kcy1iaWxsaW5nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2JyYW5kcy1iaWxsaW5nLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBCcmFuZHNCaWxsaW5nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBzZWxlY3RlZFRhYjogc3RyaW5nID0gJ2JyYW5kcy1iaWxsaW5nJztcbiAgbGVuOiBhbnk7XG4gIHNlYXJjaERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGNsaWVudElkOiBzdHJpbmcgPSAnJztcblxuICAvLyBPdmVydmlldyDigJQgY291bnRzIGFyZSBjb21wdXRlZCBieSB0aGUgQVBJIGFnYWluc3QgdGhlIEZVTEwgcG9wdWxhdGlvbiBzb1xuICAvLyBjaGlwcyBkb24ndCBjaGFuZ2Ugd2hlbiB0aGUgdXNlciBmaWx0ZXJzIHRoZSBsaXN0LlxuICBhY3RpdmVCcmFuZHM6IG51bWJlciA9IDA7XG4gIGhvbGRCcmFuZHM6IG51bWJlciA9IDA7XG4gIHN1c3BlbmRlZEJyYW5kczogbnVtYmVyID0gMDtcbiAgZGVhY3RpdmVCcmFuZHM6IG51bWJlciA9IDA7XG4gIHRyaWFsQnJhbmRzOiBudW1iZXIgPSAwO1xuICBwYWlkQnJhbmRzOiBudW1iZXIgPSAwO1xuICBmcmVlQnJhbmRzOiBudW1iZXIgPSAwO1xuICB0cmlhbFBhaWRCcmFuZHM6IG51bWJlciA9IDA7XG4gIHVuYmlsbGVkQnJhbmRzOiBudW1iZXIgPSAwO1xuICAvLyBzdGF0dXMgKGFjdGl2ZS9ob2xkL3N1c3BlbmRlZC9kZWFjdGl2ZS9hbGwpIOKGkiBwYXltZW50ICh0cmlhbC9wYWlkL2ZyZWUvdHJpYWxQYWlkKSDihpIgY291bnQuXG4gIC8vIERyaXZlcyB0aGUgUGF5bWVudCBwaWxsIGNvdW50cyBzbyB0aGV5IHJlZmxlY3QgdGhlIGN1cnJlbnRseS1zZWxlY3RlZFxuICAvLyBsaWZlY3ljbGUgdGFiIGluc3RlYWQgb2YgdGhlIGdsb2JhbCB0b3RhbHMuXG4gIHBheW1lbnRCeVN0YXR1czogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgbnVtYmVyPj4gPSB7fTtcbiAgdG90YWxCaWxsRHVlOiBudW1iZXIgPSAwO1xuICBzdG9yZXNVbmRlckJpbGxpbmc6IG51bWJlciA9IDA7XG5cbiAgLy8gVGFibGVcbiAgYnJhbmRzTGlzdDogYW55ID0gW107XG4gIGJyYW5kc0xvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBicmFuZHNOb0RhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdG90YWxJdGVtczogbnVtYmVyID0gMDtcbiAgcGFnZVNpemU6IG51bWJlciA9IDEwO1xuICBjdXJyZW50UGFnZTogbnVtYmVyID0gMTtcbiAgaXRlbXNQZXJQYWdlOiBudW1iZXIgPSAxMDtcbiAgcGFnaW5hdGlvblNpemVzID0gWzEwLCAyMCwgMzBdO1xuICBzb3J0Q29sdW1OYW1lOiBzdHJpbmcgPSAndG90YWxTdG9yZXMnO1xuICBzb3J0Qnk6IG51bWJlciA9IC0xO1xuICAvLyBQcmltYXJ5IHRhYiDigJQgbmFycm93cyB0aGUgbGlzdCB0byBvbmUgbGlmZWN5Y2xlIGJ1Y2tldC5cbiAgLy8gRGVmYXVsdCBpcyBBY3RpdmUgYmVjYXVzZSB0aGF0J3Mgd2hlcmUgZGF5LXRvLWRheSB3b3JrIGhhcHBlbnMuXG4gIGFjdGl2ZUZpbHRlcjogc3RyaW5nID0gJ0FjdGl2ZSc7XG4gIGZpbHRlclRhYnMgPSBbJ0FjdGl2ZScsICdIb2xkJywgJ1N1c3BlbmRlZCcsICdEZWFjdGl2ZSddO1xuICAvLyBQYXltZW50IHN1Yi1maWx0ZXIg4oCUIGluZGVwZW5kZW50IG9mIHRoZSBsaWZlY3ljbGUgdGFiLlxuICAvLyAnJyBtZWFucyBcIm5vIHBheW1lbnQtc3RhdHVzIGZpbHRlciBhcHBsaWVkXCIuXG4gIHBheW1lbnRTdWJGaWx0ZXI6IHN0cmluZyA9ICcnO1xuICAvLyBEaXNwbGF5IGxhYmVsIOKGkiBiYWNrZW5kIHBheW1lbnRTdGF0dXMgdmFsdWUuIEtlcHQgaW4gbGFiZWwtb3JkZXIgc28gdGhlXG4gIC8vIHRlbXBsYXRlIGNhbiBqdXN0IGl0ZXJhdGUgb3ZlciB0aGUgcGFpcnMuXG4gIHBheW1lbnRTdWJUYWJzOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4gPSBbXG4gICAgeyBsYWJlbDogJ1BhaWQnLCB2YWx1ZTogJ3BhaWQnIH0sXG4gICAgeyBsYWJlbDogJ1RyaWFsJywgdmFsdWU6ICd0cmlhbCcgfSxcbiAgICB7IGxhYmVsOiAnUGFpZC1UcmlhbCcsIHZhbHVlOiAndHJpYWxQYWlkJyB9LFxuICAgIHsgbGFiZWw6ICdGcmVlJywgdmFsdWU6ICdmcmVlJyB9LFxuICAgIHsgbGFiZWw6ICdVbmJpbGxlZCcsIHZhbHVlOiAndW5iaWxsZWQnIH0sXG4gIF07XG4gIHN0YXR1c0ZpbHRlcjogYW55ID0gW107XG5cbiAgYnJhbmRGaWx0ZXJPYmplY3QgPSBbXG4gICAgeyBEZXNjcmlwdGlvbjogJ1N0YXR1cycsIHR5cGU6ICdzaW5nbGUnLCBJc3N1ZXM6IFt7IGlkOiAnYWN0aXZlJywgdGV4dDogJ0FjdGl2ZScgfSwgeyBpZDogJ2hvbGQnLCB0ZXh0OiAnSG9sZCcgfSwgeyBpZDogJ3N1c3BlbmRlZCcsIHRleHQ6ICdTdXNwZW5kZWQnIH0sIHsgaWQ6ICdkZWFjdGl2ZScsIHRleHQ6ICdEZWFjdGl2ZScgfSwgeyBpZDogJ3RyaWFsJywgdGV4dDogJ1RyaWFsJyB9LCB7IGlkOiAncGFpZCcsIHRleHQ6ICdQYWlkJyB9LCB7IGlkOiAnZnJlZScsIHRleHQ6ICdGcmVlJyB9LCB7IGlkOiAndHJpYWxQYWlkJywgdGV4dDogJ1RyaWFsLVBhaWQnIH0sIHsgaWQ6ICd1bmJpbGxlZCcsIHRleHQ6ICdVbmJpbGxlZCcgfV0gfSxcbiAgXTtcblxuICB1c2VyUm9sZTogc3RyaW5nID0gJyc7XG5cbiAgLy8gc2Vzc2lvblN0b3JhZ2Uga2V5IGZvciB0aGUgcGFnZSdzIHBlcnNpc3RlZCBzdGF0ZS4gc2Vzc2lvblN0b3JhZ2UgaXNcbiAgLy8gc2NvcGVkIHBlci10YWIgYW5kIGNsZWFyZWQgd2hlbiB0aGUgdGFiIGNsb3Nlcywgc28gd2UgZG9uJ3QgYWNjdW11bGF0ZVxuICAvLyBzdGFsZSBzdGF0ZSBhY3Jvc3MgbG9naW5zLiBVUkwgcXVlcnlQYXJhbXMgd291bGQgYmUgbW9yZSBzaGFyZWFibGUgYnV0XG4gIC8vIHdvdWxkIGNsdXR0ZXIgdGhlIFVSTDsgc2Vzc2lvblN0b3JhZ2UgaXMgZW5vdWdoIGZvciB0aGUgXCJiYWNrLXRvLWxpc3RcIlxuICAvLyBuYXZpZ2F0aW9uIHBhdHRlcm4gdGhpcyBpcyBzb2x2aW5nLlxuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlU3RvcmFnZUtleSA9ICdicmFuZHMtYmlsbGluZzpsaXN0LXN0YXRlJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGJpbGxpbmdTZXJ2aWNlOiBCaWxsaW5nU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIHBhZ2VJbmZvOiBQYWdlSW5mb1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VySW5mbyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXItaW5mbycpIHx8ICd7fScpO1xuICAgICAgdGhpcy51c2VyUm9sZSA9IHVzZXJJbmZvPy5yb2xlIHx8ICcnO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy51c2VyUm9sZSA9ICcnO1xuICAgIH1cbiAgICAvLyBSZXN0b3JlIGFueSBwZXJzaXN0ZWQgbGlzdCBzdGF0ZSBCRUZPUkUgdGhlIGZpcnN0IGxvYWRCcmFuZHMoKSBjYWxsIHNvXG4gICAgLy8gcGFnZSAvIHNvcnQgLyBmaWx0ZXIgY29tZSBiYWNrIGV4YWN0bHkgYXMgdGhlIHVzZXIgbGVmdCB0aGVtLlxuICAgIHRoaXMucmVzdG9yZVN0YXRlKCk7XG4gICAgdGhpcy5ncy51c2VyQWNjZXNzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGFjY2VzczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGFjY2Vzcykge1xuICAgICAgICAgICAgaWYgKGFjY2Vzcz8udXNlclR5cGUgPT0gJ3RhbmdvJykge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRCcmFuZHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICB9XG5cbiAgb3Blbkludm9pY2VTZXR0aW5ncygpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEludm9pY2VTZXR0aW5nc01vZGFsQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcbiAgICAgIHNpemU6ICdtZCcsXG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLy8gUGVyc2lzdCB0aGUgdXNlcidzIGxpc3QtdmlldyBzdGF0ZSBzbyB3aGVuIHRoZXkgbmF2aWdhdGUgYXdheSAoVmlld1xuICAvLyBicmFuZCDihpIgaW52b2ljZXMpIGFuZCBjb21lIGJhY2sgdmlhIGJyb3dzZXItYmFjayBvciBhcHAtbGV2ZWwgbmF2LFxuICAvLyB0aGV5IGxhbmQgb24gdGhlIHNhbWUgcGFnZS9zb3J0L2ZpbHRlciB0aGV5IGxlZnQgZnJvbS5cbiAgcHJpdmF0ZSBzYXZlU3RhdGUoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5zdGF0ZVN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY3VycmVudFBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLFxuICAgICAgICBzb3J0Q29sdW1OYW1lOiB0aGlzLnNvcnRDb2x1bU5hbWUsXG4gICAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICAgIGFjdGl2ZUZpbHRlcjogdGhpcy5hY3RpdmVGaWx0ZXIsXG4gICAgICAgIHBheW1lbnRTdWJGaWx0ZXI6IHRoaXMucGF5bWVudFN1YkZpbHRlcixcbiAgICAgICAgc3RhdHVzRmlsdGVyOiB0aGlzLnN0YXR1c0ZpbHRlcixcbiAgICAgICAgbGVuOiB0aGlzLmxlbiB8fCAnJyxcbiAgICAgIH0pKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHNlc3Npb25TdG9yYWdlIGNhbiB0aHJvdyBpbiBxdW90YSAvIHByaXZhdGUtbW9kZSBlZGdlIGNhc2VzLlxuICAgICAgLy8gU2lsZW50bHkgaWdub3JlIOKAlCB0aGUgdXNlciBqdXN0IHdvbid0IGdldCB0aGUgc2F2ZWQtc3RhdGUgYmVoYXZpb3IuXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5zdGF0ZVN0b3JhZ2VLZXkpO1xuICAgICAgaWYgKCFyYXcpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHMgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgICBpZiAodHlwZW9mIHMgIT09ICdvYmplY3QnIHx8IHMgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2Ygcy5jdXJyZW50UGFnZSA9PT0gJ251bWJlcicpIHRoaXMuY3VycmVudFBhZ2UgPSBzLmN1cnJlbnRQYWdlO1xuICAgICAgaWYgKHR5cGVvZiBzLnBhZ2VTaXplID09PSAnbnVtYmVyJykge1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gcy5wYWdlU2l6ZTtcbiAgICAgICAgdGhpcy5pdGVtc1BlclBhZ2UgPSBzLnBhZ2VTaXplO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBzLnNvcnRDb2x1bU5hbWUgPT09ICdzdHJpbmcnKSB0aGlzLnNvcnRDb2x1bU5hbWUgPSBzLnNvcnRDb2x1bU5hbWU7XG4gICAgICBpZiAodHlwZW9mIHMuc29ydEJ5ID09PSAnbnVtYmVyJykgdGhpcy5zb3J0QnkgPSBzLnNvcnRCeTtcbiAgICAgIGlmICh0eXBlb2Ygcy5hY3RpdmVGaWx0ZXIgPT09ICdzdHJpbmcnICYmIHRoaXMuZmlsdGVyVGFicy5pbmNsdWRlcyhzLmFjdGl2ZUZpbHRlcikpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVGaWx0ZXIgPSBzLmFjdGl2ZUZpbHRlcjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygcy5wYXltZW50U3ViRmlsdGVyID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAocy5wYXltZW50U3ViRmlsdGVyID09PSAnJyB8fCB0aGlzLnBheW1lbnRTdWJUYWJzLnNvbWUocCA9PiBwLnZhbHVlID09PSBzLnBheW1lbnRTdWJGaWx0ZXIpKSkge1xuICAgICAgICB0aGlzLnBheW1lbnRTdWJGaWx0ZXIgPSBzLnBheW1lbnRTdWJGaWx0ZXI7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzLnN0YXR1c0ZpbHRlcikpIHRoaXMuc3RhdHVzRmlsdGVyID0gcy5zdGF0dXNGaWx0ZXI7XG4gICAgICBpZiAodHlwZW9mIHMubGVuID09PSAnc3RyaW5nJykgdGhpcy5sZW4gPSBzLmxlbjtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHNldFBhZ2VEYXRhKCkge1xuICAgIHRoaXMucGFnZUluZm8uc2V0VGl0bGUoJ0JyYW5kcyAmIEJpbGxpbmcnKTtcbiAgICB0aGlzLnBhZ2VJbmZvLnNldERlc2NyaXB0aW9uKCdNYW5hZ2UgYnJhbmQgYmlsbGluZyBjb25maWd1cmF0aW9ucycpO1xuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoW1xuICAgICAgeyB0aXRsZTogJ01hbmFnZScsIHBhdGg6ICcvbWFuYWdlJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcbiAgICAgIHsgdGl0bGU6ICdNYW5hZ2UnLCBwYXRoOiAnL21hbmFnZScsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcbiAgICBdKTtcbiAgfVxuXG4gIGxvYWRCcmFuZHMoKSB7XG4gICAgdGhpcy5zZWFyY2hEaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuYnJhbmRzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5icmFuZHNOb0RhdGEgPSBmYWxzZTtcblxuICAgIGNvbnN0IHsgc3RhdHVzOiBzdGF0dXNGaWx0ZXIsIHBheW1lbnRTdGF0dXM6IHBheW1lbnRTdGF0dXNGaWx0ZXIgfSA9IHRoaXMuYnVpbGRGaWx0ZXJQYXlsb2FkKCk7XG5cbiAgICBsZXQgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGxpbWl0OiB0aGlzLnBhZ2VTaXplLFxuICAgICAgb2Zmc2V0OiB0aGlzLmN1cnJlbnRQYWdlLFxuICAgICAgc2VhcmNoVmFsdWU6IHRoaXMubGVuLFxuICAgICAgc29ydENvbHVtTmFtZTogdGhpcy5zb3J0Q29sdW1OYW1lLFxuICAgICAgc29ydEJ5OiB0aGlzLnNvcnRCeSxcbiAgICAgIHN0YXR1czogc3RhdHVzRmlsdGVyLFxuICAgICAgcGF5bWVudFN0YXR1czogcGF5bWVudFN0YXR1c0ZpbHRlcixcbiAgICAgIGV4cG9ydDogZmFsc2VcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5icmFuZHNCaWxsaW5nTGlzdChmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChlKSA9PiB7XG4gICAgICAgIC8vIFN1bW1hcnkgY291bnRzIGFyZSBjb21wdXRlZCBieSB0aGUgQVBJIG92ZXIgdGhlIEZVTEwgcG9wdWxhdGlvblxuICAgICAgICAvLyAobm90IHRoZSBmaWx0ZXJlZCBzbGljZSksIHNvIGFwcGx5IHRoZW0gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZVxuICAgICAgICAvLyBjdXJyZW50IGxpZmVjeWNsZSB0YWIgaGFzIGFueSByb3dzLiBQcmV2aW91c2x5IHRoaXMgbGl2ZWQgaW5zaWRlIHRoZVxuICAgICAgICAvLyBgY291bnRgIGJyYW5jaCwgc28gdGhlIGRlZmF1bHQgQWN0aXZlIHRhYiByZXR1cm5pbmcgemVybyByb3dzIGxlZnRcbiAgICAgICAgLy8gSG9sZC9TdXNwZW5kZWQvRGVhY3RpdmUgY2FyZHMgc3R1Y2sgYXQgMC5cbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGU/LmRhdGE/LnN1bW1hcnk7XG4gICAgICAgIGlmIChzdW1tYXJ5KSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVCcmFuZHMgPSBzdW1tYXJ5LmFjdGl2ZSB8fCAwO1xuICAgICAgICAgIHRoaXMuaG9sZEJyYW5kcyA9IHN1bW1hcnkuaG9sZCB8fCAwO1xuICAgICAgICAgIHRoaXMuc3VzcGVuZGVkQnJhbmRzID0gc3VtbWFyeS5zdXNwZW5kZWQgfHwgMDtcbiAgICAgICAgICB0aGlzLmRlYWN0aXZlQnJhbmRzID0gc3VtbWFyeS5kZWFjdGl2ZSB8fCAwO1xuICAgICAgICAgIHRoaXMudHJpYWxCcmFuZHMgPSBzdW1tYXJ5LnRyaWFsIHx8IDA7XG4gICAgICAgICAgdGhpcy5wYWlkQnJhbmRzID0gc3VtbWFyeS5wYWlkIHx8IDA7XG4gICAgICAgICAgdGhpcy5mcmVlQnJhbmRzID0gc3VtbWFyeS5mcmVlIHx8IDA7XG4gICAgICAgICAgdGhpcy50cmlhbFBhaWRCcmFuZHMgPSBzdW1tYXJ5LnRyaWFsUGFpZCB8fCAwO1xuICAgICAgICAgIHRoaXMudW5iaWxsZWRCcmFuZHMgPSBzdW1tYXJ5LnVuYmlsbGVkIHx8IDA7XG4gICAgICAgICAgdGhpcy5wYXltZW50QnlTdGF0dXMgPSBzdW1tYXJ5LnBheW1lbnRCeVN0YXR1cyB8fCB7fTtcbiAgICAgICAgICB0aGlzLnRvdGFsQmlsbER1ZSA9IHN1bW1hcnkudG90YWxCaWxsRHVlIHx8IDA7XG4gICAgICAgICAgdGhpcy5zdG9yZXNVbmRlckJpbGxpbmcgPSBzdW1tYXJ5LnN0b3Jlc1VuZGVyQmlsbGluZyB8fCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGU/LmRhdGE/LmNvdW50KSB7XG4gICAgICAgICAgdGhpcy5icmFuZHNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5icmFuZHNOb0RhdGEgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmJyYW5kc0xpc3QgPSBlLmRhdGE/LmRhdGE7XG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gZS5kYXRhPy5jb3VudDtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmJyYW5kc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmJyYW5kc05vRGF0YSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zZWFyY2hEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoaXMubGVuPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5icmFuZHNMaXN0ID0gW107XG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMDtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZSkgPT4ge1xuICAgICAgICB0aGlzLmJyYW5kc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5icmFuZHNOb0RhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLmJyYW5kc0xpc3QgPSBbXTtcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMDtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RUYWIodGFiOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlbGVjdGVkVGFiID0gdGFiO1xuICB9XG5cbiAgc2V0RmlsdGVyKGZpbHRlcjogc3RyaW5nKSB7XG4gICAgdGhpcy5hY3RpdmVGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICB0aGlzLmxvYWRCcmFuZHMoKTtcbiAgfVxuXG4gIHNldFBheW1lbnRTdWJGaWx0ZXIoc3ViOiBzdHJpbmcpIHtcbiAgICB0aGlzLnBheW1lbnRTdWJGaWx0ZXIgPSBzdWI7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICB0aGlzLmxvYWRCcmFuZHMoKTtcbiAgfVxuXG4gIC8vIFBpbGwtdmFsdWUg4oaSIGNvdW50LCBzY29wZWQgdG8gd2hpY2hldmVyIGxpZmVjeWNsZSB0YWIgaXMgc2VsZWN0ZWQuIFNvXG4gIC8vIFwiUGFpZCAoMylcIiBvbiB0aGUgSG9sZCB0YWIgbWVhbnMgXCIzIEhvbGQgYnJhbmRzIGFyZSBQYWlkXCIsIG5vdCB0aGUgZ2xvYmFsXG4gIC8vIHRvdGFsLiBGYWxscyBiYWNrIHRvIHRoZSBnbG9iYWwgdGFsbHkgaWYgdGhlIG1hdHJpeCBpcyBtaXNzaW5nIGEgYnVja2V0LlxuICBwYXltZW50UGlsbENvdW50KHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHNjb3BlID0gKHRoaXMuYWN0aXZlRmlsdGVyIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGJ1Y2tldCA9IHRoaXMucGF5bWVudEJ5U3RhdHVzPy5bc2NvcGVdO1xuICAgIGlmIChidWNrZXQgJiYgdHlwZW9mIGJ1Y2tldFt2YWx1ZV0gPT09ICdudW1iZXInKSByZXR1cm4gYnVja2V0W3ZhbHVlXTtcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICBjYXNlICdwYWlkJzogICAgICByZXR1cm4gdGhpcy5wYWlkQnJhbmRzO1xuICAgICAgY2FzZSAndHJpYWwnOiAgICAgcmV0dXJuIHRoaXMudHJpYWxCcmFuZHM7XG4gICAgICBjYXNlICd0cmlhbFBhaWQnOiByZXR1cm4gdGhpcy50cmlhbFBhaWRCcmFuZHM7XG4gICAgICBjYXNlICdmcmVlJzogICAgICByZXR1cm4gdGhpcy5mcmVlQnJhbmRzO1xuICAgICAgY2FzZSAndW5iaWxsZWQnOiAgcmV0dXJuIHRoaXMudW5iaWxsZWRCcmFuZHM7XG4gICAgICBkZWZhdWx0OiAgICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICAvLyBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgc3RhdHVzIC8gcGF5bWVudFN0YXR1cyBwYXlsb2FkIHNlbnQgdG9cbiAgLy8gYnJhbmRzQmlsbGluZ0xpc3QuIExpZmVjeWNsZSB0YWIgYW5kIHBheW1lbnQtc3RhdHVzIHBpbGwgYXBwbHlcbiAgLy8gaW5kZXBlbmRlbnRseSDigJQgYm90aCBjYW4gYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUuXG4gIHByaXZhdGUgYnVpbGRGaWx0ZXJQYXlsb2FkKCk6IHsgc3RhdHVzOiBzdHJpbmdbXTsgcGF5bWVudFN0YXR1czogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgcHJpbWFyeSA9ICh0aGlzLmFjdGl2ZUZpbHRlciB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBzdGF0dXMgPSBwcmltYXJ5ID8gW3ByaW1hcnldIDogW107XG4gICAgY29uc3QgcGF5bWVudFN0YXR1cyA9IHRoaXMucGF5bWVudFN1YkZpbHRlciA/IFt0aGlzLnBheW1lbnRTdWJGaWx0ZXJdIDogW107XG4gICAgcmV0dXJuIHsgc3RhdHVzLCBwYXltZW50U3RhdHVzIH07XG4gIH1cblxuICBzZWFyY2hGaWVsZCgpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgIHRoaXMubG9hZEJyYW5kcygpO1xuICB9XG5cbiAgc29ydERhdGEoY29sdW1uOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNvcnRDb2x1bU5hbWUgPSBjb2x1bW47XG4gICAgdGhpcy5zb3J0QnkgKj0gLTE7XG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmxvYWRCcmFuZHMoKTtcbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShwYWdlT2Zmc2V0OiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFyc2VJbnQocGFnZU9mZnNldCk7XG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICB0aGlzLmxvYWRCcmFuZHMoKTtcbiAgfVxuXG4gIG9uUGFnZVNpemVDaGFuZ2UocGFnZVNpemU6IGFueSkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMucGFnZVNpemUgPSBwYXJzZUludChwYWdlU2l6ZSk7XG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICB0aGlzLmxvYWRCcmFuZHMoKTtcbiAgfVxuXG4gIG9uRXhwb3J0KCkge1xuICAgIGNvbnN0IHsgc3RhdHVzOiBzdGF0dXNGaWx0ZXIsIHBheW1lbnRTdGF0dXM6IHBheW1lbnRTdGF0dXNGaWx0ZXIgfSA9IHRoaXMuYnVpbGRGaWx0ZXJQYXlsb2FkKCk7XG5cbiAgICBsZXQgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmxlbixcbiAgICAgIHNvcnRDb2x1bU5hbWU6IHRoaXMuc29ydENvbHVtTmFtZSxcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICBzdGF0dXM6IHN0YXR1c0ZpbHRlcixcbiAgICAgIHBheW1lbnRTdGF0dXM6IHBheW1lbnRTdGF0dXNGaWx0ZXIsXG4gICAgICBleHBvcnQ6IHRydWVcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5icmFuZHNCaWxsaW5nTGlzdEV4cG9ydChmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5zYXZlQXNFeGNlbEZpbGUocmVzLCAnYnJhbmRzLWJpbGxpbmcnKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGUpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdTb21ldGhpbmcgd2VudCBXcm9uZy4uJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhcHBseUJyYW5kRmlsdGVycyhldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50Py5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5EZXNjcmlwdGlvbiA9PT0gJ1N0YXR1cycpIHtcbiAgICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gZWxlbWVudC5Jc3N1ZXM/LmlkIHx8ICcnO1xuICAgICAgICAgIGlmIChpZCA9PT0gJ2FjdGl2ZScgfHwgaWQgPT09ICdob2xkJyB8fCBpZCA9PT0gJ3N1c3BlbmRlZCcgfHwgaWQgPT09ICdkZWFjdGl2ZScpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRmlsdGVyID0gaWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBpZC5zbGljZSgxKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlkID09PSAndHJpYWwnIHx8IGlkID09PSAncGFpZCcgfHwgaWQgPT09ICdmcmVlJyB8fCBpZCA9PT0gJ3RyaWFsUGFpZCcgfHwgaWQgPT09ICd1bmJpbGxlZCcpIHtcbiAgICAgICAgICAgIC8vIFBheW1lbnQtc3RhdHVzIHBpY2tzIGp1c3Qgc2V0IHRoZSBzdWItZmlsdGVyOyBsaWZlY3ljbGUgdGFiIGlzXG4gICAgICAgICAgICAvLyBpbmRlcGVuZGVudCBzbyB3ZSBsZWF2ZSBhY3RpdmVGaWx0ZXIgYWxvbmUuXG4gICAgICAgICAgICB0aGlzLnBheW1lbnRTdWJGaWx0ZXIgPSBpZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgIHRoaXMubG9hZEJyYW5kcygpO1xuICB9XG5cbiAgc2V0dXBCaWxsaW5nKGJyYW5kOiBhbnkpIHtcbiAgICAvLyBQZXJzaXN0IGJlZm9yZSBuYXZpZ2F0aW5nIGF3YXkgc28gdGhlIHVzZXIgbGFuZHMgYmFjayBvbiB0aGUgc2FtZVxuICAgIC8vIHBhZ2UgLyBmaWx0ZXIgd2hlbiB0aGV5IHJldHVybi5cbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xuICAgIGNvbnN0IGRhdGF2YWx1ZTogYW55ID0gSlNPTi5wYXJzZShcbiAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgfHwgXCJ7fVwiXG4gICAgKTtcbiAgICBkYXRhdmFsdWUuY2xpZW50ID0gYnJhbmQuY2xpZW50SWQudG9TdHJpbmcoKTtcbiAgICBkYXRhdmFsdWUuY2xpZW50TmFtZSA9IGJyYW5kLmNsaWVudE5hbWU7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkoZGF0YXZhbHVlKSk7XG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KGRhdGF2YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL2JpbGxpbmcvc2V0dXAtYmlsbGluZyddKTtcbiAgfVxuXG4gIHZpZXdCcmFuZChicmFuZDogYW55KSB7XG4gICAgLy8gUGVyc2lzdCBiZWZvcmUgbmF2aWdhdGluZyBhd2F5IHNvIHRoZSB1c2VyIGxhbmRzIGJhY2sgb24gdGhlIHNhbWVcbiAgICAvLyBwYWdlIC8gZmlsdGVyIHdoZW4gdGhleSByZXR1cm4gZnJvbSB0aGUgcGVyLWJyYW5kIEludm9pY2VzIHZpZXcuXG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcbiAgICBjb25zdCBkYXRhdmFsdWU6IGFueSA9IEpTT04ucGFyc2UoXG4gICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwie31cIlxuICAgICk7XG4gICAgZGF0YXZhbHVlLmNsaWVudCA9IGJyYW5kLmNsaWVudElkLnRvU3RyaW5nKCk7XG4gICAgZGF0YXZhbHVlLmNsaWVudE5hbWUgPSBicmFuZC5jbGllbnROYW1lO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KGRhdGF2YWx1ZSkpO1xuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dChkYXRhdmFsdWUpO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS9iaWxsaW5nL2JyYW5kLWludm9pY2VzJ10pO1xuICB9XG5cbn0iLCI8IS0tIEJyYW5kcyAmIEJpbGxpbmcgU2VjdGlvbiAtLT5cbjxkaXYgY2xhc3M9XCJicmFuZHMtc2VjdGlvbiBteC0zIG10LTQgbWItNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLXN0YXJ0IG1iLTNcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJpbGxpbmdoZWFkZXJcIj5CcmFuZHMgJiBCaWxsaW5nPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5DbGljayBhbnkgYnJhbmQgdG8gbWFuYWdlIGJpbGxpbmcg4oCUIGNvbmZpZ3VyZWQgYnJhbmRzIG9wZW4gaW52b2ljZXMgZGlyZWN0bHk8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInVzZXJSb2xlID09PSAnc3VwZXJhZG1pbidcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWljb24gYnRuLWxpZ2h0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3Blbkludm9pY2VTZXR0aW5ncygpXCJcbiAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkludm9pY2UgU2V0dGluZ3NcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiSW52b2ljZSBTZXR0aW5nc1wiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDE1LjVBMy41IDMuNSAwIDEgMCAxMiA4LjVhMy41IDMuNSAwIDAgMCAwIDdaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS43XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE5LjQgMTVhMS42NSAxLjY1IDAgMCAwIC4zMyAxLjgybC4wNi4wNmEyIDIgMCAxIDEtMi44MyAyLjgzbC0uMDYtLjA2YTEuNjUgMS42NSAwIDAgMC0xLjgyLS4zMyAxLjY1IDEuNjUgMCAwIDAtMSAxLjUxVjIxYTIgMiAwIDEgMS00IDB2LS4wOUExLjY1IDEuNjUgMCAwIDAgOSAxOS40YTEuNjUgMS42NSAwIDAgMC0xLjgyLjMzbC0uMDYuMDZhMiAyIDAgMSAxLTIuODMtMi44M2wuMDYtLjA2YTEuNjUgMS42NSAwIDAgMCAuMzMtMS44MiAxLjY1IDEuNjUgMCAwIDAtMS41MS0xSDNhMiAyIDAgMSAxIDAtNGguMDlBMS42NSAxLjY1IDAgMCAwIDQuNiA5YTEuNjUgMS42NSAwIDAgMC0uMzMtMS44MmwtLjA2LS4wNmEyIDIgMCAxIDEgMi44My0yLjgzbC4wNi4wNmExLjY1IDEuNjUgMCAwIDAgMS44Mi4zM0g5YTEuNjUgMS42NSAwIDAgMCAxLTEuNTFWM2EyIDIgMCAxIDEgNCAwdi4wOWExLjY1IDEuNjUgMCAwIDAgMSAxLjUxIDEuNjUgMS42NSAwIDAgMCAxLjgyLS4zM2wuMDYtLjA2YTIgMiAwIDEgMSAyLjgzIDIuODNsLS4wNi4wNmExLjY1IDEuNjUgMCAwIDAtLjMzIDEuODJWOWExLjY1IDEuNjUgMCAwIDAgMS41MSAxSDIxYTIgMiAwIDEgMSAwIDRoLS4wOWExLjY1IDEuNjUgMCAwIDAtMS41MSAxWlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuN1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE92ZXJ2aWV3IENoaXBzIOKAlCBBY3RpdmUgLyBIb2xkIC8gRGVhY3RpdmUgZWFjaCBkb3VibGUgYXMgYSB0YWIuIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctMyBtYi00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJ2aWV3LWNoaXBcIiBbbmdDbGFzc109XCJhY3RpdmVGaWx0ZXIgPT09ICdBY3RpdmUnID8gJ2NoaXAtYWN0aXZlJyA6ICcnXCIgKGNsaWNrKT1cInNldEZpbHRlcignQWN0aXZlJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtbGFiZWxcIj5BY3RpdmU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtdmFsdWVcIj57eyBhY3RpdmVCcmFuZHMgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdmVydmlldy1jaGlwXCIgW25nQ2xhc3NdPVwiYWN0aXZlRmlsdGVyID09PSAnSG9sZCcgPyAnY2hpcC1hY3RpdmUnIDogJydcIiAoY2xpY2spPVwic2V0RmlsdGVyKCdIb2xkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtbGFiZWxcIj5Ib2xkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwLXZhbHVlXCI+e3sgaG9sZEJyYW5kcyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJ2aWV3LWNoaXBcIiBbbmdDbGFzc109XCJhY3RpdmVGaWx0ZXIgPT09ICdTdXNwZW5kZWQnID8gJ2NoaXAtYWN0aXZlJyA6ICcnXCIgKGNsaWNrKT1cInNldEZpbHRlcignU3VzcGVuZGVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtbGFiZWxcIj5TdXNwZW5kZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtdmFsdWVcIj57eyBzdXNwZW5kZWRCcmFuZHMgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdmVydmlldy1jaGlwXCIgW25nQ2xhc3NdPVwiYWN0aXZlRmlsdGVyID09PSAnRGVhY3RpdmUnID8gJ2NoaXAtYWN0aXZlJyA6ICcnXCIgKGNsaWNrKT1cInNldEZpbHRlcignRGVhY3RpdmUnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcC1sYWJlbFwiPkRlYWN0aXZlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwLXZhbHVlXCI+e3sgZGVhY3RpdmVCcmFuZHMgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdmVydmlldy1jaGlwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwLWxhYmVsXCI+VG90YWwgQmlsbCBEdWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtdmFsdWUgdGV4dC1kYW5nZXJcIj7igrl7eyB0b3RhbEJpbGxEdWUgfCBudW1iZXI6JzEuMC0zJzonZW4tSU4nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcnZpZXctY2hpcFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcC1sYWJlbFwiPlN0b3JlcyBVbmRlciBCaWxsaW5nPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwLXZhbHVlXCI+e3sgc3RvcmVzVW5kZXJCaWxsaW5nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBQYXltZW50LXN0YXR1cyBwaWxsIHJvdyDigJQgaW5kZXBlbmRlbnQgb2YgdGhlIGxpZmVjeWNsZSB0YWIgYWJvdmUsXG4gICAgICAgICAgICAgdmlzaWJsZSByZWdhcmRsZXNzIG9mIHdoaWNoIHRhYiBpcyBzZWxlY3RlZC4gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIG1iLTNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPlBheW1lbnQ6PC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInBheW1lbnRTdWJGaWx0ZXIgPT09ICcnID8gJ2FjdGl2ZVBsYW5CdG5wcmltYXJ5JyA6ICdpbmFjdGl2ZVBsYW5CdG4nXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0UGF5bWVudFN1YkZpbHRlcignJylcIj5BbGw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IHBpbGwgb2YgcGF5bWVudFN1YlRhYnNcIiBjbGFzcz1cImJ0biBidG4tc21cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInBheW1lbnRTdWJGaWx0ZXIgPT09IHBpbGwudmFsdWUgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRQYXltZW50U3ViRmlsdGVyKHBpbGwudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAge3sgcGlsbC5sYWJlbCB9fSAoe3sgcGF5bWVudFBpbGxDb3VudChwaWxsLnZhbHVlKSB9fSlcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFNlYXJjaCAmIFRvb2xiYXIgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwYXltZW50aGlzdG9yeSBib3JkZXItMCBweC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10b29sYmFyIHctMTAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gaW52b2ljZXNlYXJjaCBzdmctaWNvbi0xIHBvc2l0aW9uLWFic29sdXRlIG10LTYgbXMtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBvcGFjaXR5PVwiMC41XCIgeD1cIjE3LjAzNjVcIiB5PVwiMTUuMTIyM1wiIHdpZHRoPVwiOC4xNTU0NlwiIGhlaWdodD1cIjJcIiByeD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKDQ1IDE3LjAzNjUgMTUuMTIyMylcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9yZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMSAxOUM2LjU1NTU2IDE5IDMgMTUuNDQ0NCAzIDExQzMgNi41NTU1NiA2LjU1NTU2IDMgMTEgM0MxNS40NDQ0IDMgMTkgNi41NTU1NiAxOSAxMUMxOSAxNS40NDQ0IDE1LjQ0NDQgMTkgMTEgMTlaTTExIDVDNy41MzMzMyA1IDUgNy41MzMzMyA1IDExQzUgMTQuNDY2NyA3LjUzMzMzIDE3IDExIDE3QzE0LjQ2NjcgMTcgMTcgMTQuNDY2NyAxNyAxMUMxNyA3LjUzMzMzIDE0LjQ2NjcgNSAxMSA1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwibGVuXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBpbnZvaWNlc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBicmFuZHMuLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIiAoY2hhbmdlKT1cInNlYXJjaEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWFyY2hEaXNhYmxlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWZpbHRlcnMgW2RhdGFPYmplY3RdPVwiYnJhbmRGaWx0ZXJPYmplY3RcIiAoYXBwbGllZEZpbHRlcnMpPVwiYXBwbHlCcmFuZEZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25FeHBvcnQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFicmFuZHNMaXN0Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+RXhwb3J0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTG9hZGluZyBTaGltbWVyIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYnJhbmRzTG9hZGluZ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gTm8gRGF0YSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJyYW5kc05vRGF0YVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmMgdy0yNVwiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YS5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBCcmFuZHMgVGFibGUgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhYnJhbmRzTG9hZGluZyAmJiAhYnJhbmRzTm9EYXRhXCIgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhY2NvcmRpb24gdGFibGUgYm90dG9tLWJvcmRlciB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ2NsaWVudE5hbWUnKVwiPkJyYW5kIE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRDb2x1bU5hbWUgPT09ICdjbGllbnROYW1lJyAmJiBzb3J0QnkgPT09IDEgPyAncm90YXRlJyA6ICcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAnY2xpZW50TmFtZScgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgndG90YWxTdG9yZXMnKVwiPlN0b3Jlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydENvbHVtTmFtZSA9PT0gJ3RvdGFsU3RvcmVzJyAmJiBzb3J0QnkgPT09IDEgPyAncm90YXRlJyA6ICcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAndG90YWxTdG9yZXMnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkJpbGxpbmcgU3RvcmVzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Qcm9kdWN0cyBBZGRlZDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgnYmlsbEFtb3VudER1ZScpXCI+QmlsbCBBbW91bnQgRHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0Q29sdW1OYW1lID09PSAnYmlsbEFtb3VudER1ZScgJiYgc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydENvbHVtTmFtZSA9PT0gJ2JpbGxBbW91bnREdWUnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ3N0YXR1cycpXCI+U3RhdHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0Q29sdW1OYW1lID09PSAnc3RhdHVzJyAmJiBzb3J0QnkgPT09IDEgPyAncm90YXRlJyA6ICcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAnc3RhdHVzJyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCdwYXltZW50U3RhdHVzJylcIj5QYXltZW50IFN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydENvbHVtTmFtZSA9PT0gJ3BheW1lbnRTdGF0dXMnICYmIHNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRDb2x1bU5hbWUgPT09ICdwYXltZW50U3RhdHVzJyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPkFjdGlvbnM8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGJyYW5kIG9mIGJyYW5kc0xpc3Q7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGUgdGFibGUtdGl0bGUtcHJpbWFyeSBkLWZsZXggY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidmlld0JyYW5kKGJyYW5kKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ltYm9sIHN5bWJvbC0zNXB4IHN5bWJvbC1jaXJjbGUgbWUtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzeW1ib2wtbGFiZWwgdGV4dC1zeW1ib2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFicmFuZD8ubG9nb1wiIGNsYXNzPVwic3ltYm9sLWxhYmVsIGJnLWxpZ2h0LXByaW1hcnkgdGV4dC1zeW1ib2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYnJhbmQ/LmNsaWVudE5hbWU/LmNoYXJBdCgwKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiYnJhbmQ/LmxvZ29cIiBjbGFzcz1cImxvZ28taW1nXCIgW3NyY109XCJicmFuZD8ubG9nb1wiIGFsdD1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1Pnt7IGJyYW5kPy5jbGllbnROYW1lIHwgdXBwZXJjYXNlIH19PC91PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIiBzdHlsZT1cImxpbmUtaGVpZ2h0OiAxO1wiPklEOiB7eyBicmFuZD8uY2xpZW50SWQgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPnt7IGJyYW5kPy50b3RhbFN0b3JlcyB9fSBTdG9yZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYnJhbmQ/LmJpbGxpbmdTdG9yZXMgPiAwXCI+e3sgYnJhbmQ/LmJpbGxpbmdTdG9yZXMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWJyYW5kPy5iaWxsaW5nU3RvcmVzXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+4oCUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJicmFuZD8ucHJvZHVjdHNBZGRlZCA+IDBcIj57eyBicmFuZD8ucHJvZHVjdHNBZGRlZCB9fSBQcm9kdWN0czwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYnJhbmQ/LnByb2R1Y3RzQWRkZWRcIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5TZXR1cCBiaWxsaW5nIHRvIGFkZCBwcm9kdWN0czwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYnJhbmQ/LmJpbGxBbW91bnREdWUgPiAwXCI+4oK5e3sgYnJhbmQ/LmJpbGxBbW91bnREdWUgfCBudW1iZXI6JzEuMC0zJzonZW4tSU4nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFicmFuZD8uYmlsbEFtb3VudER1ZVwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPuKAlDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJicmFuZD8uc3RhdHVzID09PSAnYWN0aXZlJyA/ICdiYWRnZSBiYWRnZS1saWdodC1zdWNjZXNzJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWRnZSBiYWRnZS1saWdodC1kYW5nZXInXCIgY2xhc3M9XCJtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGJyYW5kPy5zdGF0dXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJicmFuZD8ucGF5bWVudFN0YXR1cyA9PT0gJ3BhaWQnID8gJ2JhZGdlIGJhZGdlLWxpZ2h0LXN1Y2Nlc3MnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmQ/LnBheW1lbnRTdGF0dXMgPT09ICd0cmlhbCcgPyAnYmFkZ2UgYmFkZ2UtbGlnaHQtd2FybmluZycgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFkZ2UgYmFkZ2UtbGlnaHQtZGFuZ2VyJ1wiIGNsYXNzPVwibXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBicmFuZD8ucGF5bWVudFN0YXR1cyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFicmFuZD8uYmlsbGluZ0NvbmZpZ3VyZWRcIiBjbGFzcz1cImJ0biBidG4tc20gdmlld2RldGFpbHNcIiAoY2xpY2spPVwic2V0dXBCaWxsaW5nKGJyYW5kKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXAgQmlsbGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImJyYW5kPy5iaWxsaW5nQ29uZmlndXJlZFwiIGNsYXNzPVwiYnRuIGJ0bi1zbSB2aWV3ZGV0YWlsc1wiIChjbGljayk9XCJ2aWV3QnJhbmQoYnJhbmQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhYnJhbmRzTG9hZGluZyAmJiAhYnJhbmRzTm9EYXRhXCI+XG4gICAgICAgICAgICAgICAgPGxpYi1wYWdpbmF0aW9uIGNsYXNzPVwidGV4dC1zdGFydFwiIFtpdGVtc1BlclBhZ2VdPVwiaXRlbXNQZXJQYWdlXCIgW2N1cnJlbnRQYWdlXT1cImN1cnJlbnRQYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwidG90YWxJdGVtc1wiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIiAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4iXX0=