tango-app-ui-manage-billing 3.3.44 → 3.3.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/esm2022/lib/components/brand-invoices/brand-invoices.component.mjs +31 -9
  2. package/esm2022/lib/components/credit-notes/credit-notes.component.mjs +25 -3
  3. package/esm2022/lib/components/purchase-order/purchase-order-details/purchase-order-details.component.mjs +13 -3
  4. package/esm2022/lib/components/purchase-order/purchase-order-form/purchase-order-form.component.mjs +7 -3
  5. package/esm2022/lib/components/purchase-order/purchase-order.component.mjs +33 -3
  6. package/esm2022/lib/components/services/billing.service.mjs +4 -1
  7. package/esm2022/lib/components/tango-manage-billing/delete-confirmation/delete-confirmation.component.mjs +12 -5
  8. package/esm2022/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.mjs +62 -32
  9. package/esm2022/lib/components/tango-manage-billing/tango-manage-billing.component.mjs +34 -11
  10. package/fesm2022/tango-app-ui-manage-billing.mjs +210 -60
  11. package/fesm2022/tango-app-ui-manage-billing.mjs.map +1 -1
  12. package/lib/components/brand-invoices/brand-invoices.component.d.ts +1 -0
  13. package/lib/components/credit-notes/credit-notes.component.d.ts +1 -0
  14. package/lib/components/purchase-order/purchase-order-details/purchase-order-details.component.d.ts +4 -1
  15. package/lib/components/purchase-order/purchase-order-form/purchase-order-form.component.d.ts +2 -1
  16. package/lib/components/purchase-order/purchase-order.component.d.ts +5 -0
  17. package/lib/components/services/billing.service.d.ts +1 -0
  18. package/lib/components/tango-manage-billing/delete-confirmation/delete-confirmation.component.d.ts +3 -1
  19. package/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.d.ts +4 -0
  20. package/lib/components/tango-manage-billing/tango-manage-billing.component.d.ts +1 -0
  21. package/package.json +1 -1
@@ -522,20 +522,21 @@ export class BrandInvoicesComponent {
522
522
  isInvoiceLocked(inv) {
523
523
  return inv?.status === 'approved' || inv?.status === 'cancelled';
524
524
  }
525
- // Once the real INV/TINV number is issued (finance approval), only Finance /
526
- // Invoice approvers — or superadmins — may edit. The server enforces the same
527
- // (updateInvoice / applyDiscount / one-time fee).
525
+ // Once the CSM has approved (and so also once finance approval issues the
526
+ // real INV/TINV number), only Finance / Invoice approvers — or superadmins —
527
+ // may edit. The server enforces the same (updateInvoice / applyDiscount /
528
+ // one-time fee).
528
529
  isEditBlocked(inv) {
529
530
  if (this.isInvoiceLocked(inv))
530
531
  return true;
531
- const issued = !String(inv?.invoice || '').startsWith('DRAFT-');
532
- return issued && !this.hasApproverAccess;
532
+ const pastCsm = !['pendingCsm', 'pending'].includes(inv?.status) || !String(inv?.invoice || '').startsWith('DRAFT-');
533
+ return pastCsm && !this.hasApproverAccess;
533
534
  }
534
535
  editTooltip(inv) {
535
536
  if (this.isInvoiceLocked(inv))
536
537
  return 'Approved invoice — editing is disabled';
537
538
  if (this.isEditBlocked(inv))
538
- return 'Invoice number issued — only Finance / Invoice approvers can edit';
539
+ return 'CSM approved — only Finance / Invoice approvers can edit';
539
540
  return 'Edit Invoice';
540
541
  }
541
542
  // Finance Approval OR Invoice Approval (edit), or superadmin. Gates editing
@@ -582,6 +583,27 @@ export class BrandInvoicesComponent {
582
583
  error: () => this.toast.getErrorToast('Failed to download credit note'),
583
584
  });
584
585
  }
586
+ // Same Finance / Invoice approver rule as editing; the server enforces it.
587
+ deleteCreditNote(cn) {
588
+ if (!this.hasApproverAccess)
589
+ return;
590
+ const modalRef = this.modalService.open(DeleteConfirmationComponent, {
591
+ centered: true, size: 'md', scrollable: true,
592
+ });
593
+ modalRef.componentInstance.title = 'Delete Credit Note?';
594
+ modalRef.componentInstance.description = `Are you sure you want to delete ${cn.creditNote}? This action cannot be undone.`;
595
+ modalRef.result.then((result) => {
596
+ if (result === 'Yes') {
597
+ this.billingService.deleteCreditNote(cn._id).pipe(takeUntil(this.destroy$)).subscribe({
598
+ next: () => {
599
+ this.toast.getPrimaryToast('Credit note deleted successfully');
600
+ this.loadInvoices();
601
+ },
602
+ error: (err) => this.toast.getErrorToast(err?.error?.message || 'Failed to delete credit note'),
603
+ });
604
+ }
605
+ }).catch(() => { });
606
+ }
585
607
  // Delete lock — once a real invoice number has been minted (at finance
586
608
  // approval), the invoice can no longer be deleted; deleting it would reopen a
587
609
  // gap in the gapless INV/TINV series. Only pre-finance drafts (number still
@@ -1079,10 +1101,10 @@ export class BrandInvoicesComponent {
1079
1101
  this.router.navigate(['/manage/billing']);
1080
1102
  }
1081
1103
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrandInvoicesComponent, deps: [{ token: i1.BillingService }, { token: i0.ChangeDetectorRef }, { token: i2.ToastService }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.GlobalStateService }, { token: i4.PageInfoService }, { token: i5.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
1082
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrandInvoicesComponent, selector: "lib-brand-invoices", ngImport: i0, template: "<div class=\"card\">\n <!-- Back Button \u2014 hidden for client users (no Brands list to go back to). -->\n <div class=\"mt-3 mx-3\" *ngIf=\"!isClient\">\n <button class=\"btn btn-sm btn-link text-muted p-0\" (click)=\"goBack()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" class=\"me-1\">\n <path d=\"M15 8H1M1 8L8 15M1 8L8 1\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Back to Billing\n </button>\n </div>\n\n <!-- Brand Header \u2014 hidden for client users. -->\n <div class=\"brand-header mx-3 mt-3 d-flex align-items-center gap-3\" *ngIf=\"!isClient\">\n <div class=\"symbol symbol-50px symbol-circle\">\n <span class=\"symbol-label bg-primary text-white brand-avatar\">\n {{ clientInfo?.clientName?.charAt(0) || brandName?.charAt(0) }}\n </span>\n </div>\n <div>\n <div class=\"brand-name\">{{ clientInfo?.clientName || brandName }}</div>\n <div class=\"brand-meta text-muted\">\n {{ clientInfo?.totalStores || 0 }} Stores\n <span class=\"mx-1\">&middot;</span>\n Billing {{ clientInfo?.status === 'active' ? 'Active' : 'Inactive' }}\n </div>\n </div>\n </div>\n\n <!-- Sub Tabs -->\n <div class=\"mt-4 mx-3 paymenthistory\">\n <button *ngIf=\"visibleTabs.includes('invoices')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'invoices' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('invoices')\">\n Invoices\n </button>\n <button *ngIf=\"visibleTabs.includes('estimate')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'estimate' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('estimate')\">\n Estimate\n </button>\n <button *ngIf=\"visibleTabs.includes('daily-pricing')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'daily-pricing' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('daily-pricing')\">\n Billing Breakdown\n </button>\n <button *ngIf=\"visibleTabs.includes('plans-subscription')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'plans-subscription' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('plans-subscription')\">\n Plans &amp; Subscription\n </button>\n <button *ngIf=\"visibleTabs.includes('billing-groups')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'billing-groups' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('billing-groups')\">\n Billing Settings\n </button>\n <button *ngIf=\"visibleTabs.includes('purchase-order')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3\"\n [ngClass]=\"selectedTab === 'purchase-order' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('purchase-order')\">\n Purchase Order\n </button>\n </div>\n\n <!-- Plans & Subscription Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'plans-subscription'\">\n <lib-plans-subscription></lib-plans-subscription>\n </div>\n\n <!-- Estimate Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'estimate'\">\n <lib-estimates [clientId]=\"brandId\"></lib-estimates>\n </div>\n\n <!-- Invoices Section -->\n <div class=\"invoices-section mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'invoices'\">\n <!-- Sub-toggle: regular invoices vs advance (TINV-*) invoices. Shown for\n both tango and client views. -->\n <div class=\"invoice-type-toggle mb-3\">\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'all' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('all')\">All Invoices</button>\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'advance' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('advance')\">Advance Invoice</button>\n <!-- Credit notes are tango-only (the credit-note API is too). -->\n <button type=\"button\" *ngIf=\"!isClient\"\n [ngClass]=\"invoiceType === 'creditNote' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('creditNote')\">Credit Notes</button>\n </div>\n\n <!-- Credit Notes: own list (separate collection) for this brand. -->\n <lib-credit-notes *ngIf=\"invoiceType === 'creditNote'\" [clientId]=\"brandId\"></lib-credit-notes>\n\n <ng-container *ngIf=\"invoiceType !== 'creditNote'\">\n <!-- Header summary cards \u2014 Outstanding / Overdue / Pending Payment,\n each split into Excl. GST / Incl. GST (\u20B9). -->\n <div class=\"row g-3 mb-3\">\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Outstanding</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.outstandingCount }} {{ invoiceCards.outstandingCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Overdue</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.overdueCount }} {{ invoiceCards.overdueCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Pending Payment</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.pendingPaymentCount }} {{ invoiceCards.pendingPaymentCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Header Row -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"billingheader\">Invoices</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ totalInvoices }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Total invoiced: <strong>\u20B9{{ totalInvoiced | number:'1.2-2':'en-IN' }}</strong></div>\n </div>\n <div class=\"d-flex align-items-center gap-3\">\n <button type=\"button\" (click)=\"downloadSelected()\"\n class=\"btn btn-outline-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path 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.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"currentColor\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkDownloading\">Download Selected ({{ selectedInvoices.size }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkDownloading\">Preparing ZIP...</span>\n </button>\n <button type=\"button\" (click)=\"sendEmailSelected()\"\n class=\"btn btn-outline-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0 && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"\n [disabled]=\"bulkEmailing\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M2.5 5.83333L9.07 10.4283C9.635 10.8235 10.365 10.8235 10.93 10.4283L17.5 5.83333M4.16667 15.8333H15.8333C16.7538 15.8333 17.5 15.0871 17.5 14.1667V5.83333C17.5 4.91286 16.7538 4.16667 15.8333 4.16667H4.16667C3.24619 4.16667 2.5 4.91286 2.5 5.83333V14.1667C2.5 15.0871 3.24619 15.8333 4.16667 15.8333Z\"\n stroke=\"currentColor\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkEmailing\">Send Email</span>\n <span class=\"ms-1\" *ngIf=\"bulkEmailing\">Sending...</span>\n </button>\n <button type=\"button\" (click)=\"approveSelected()\"\n class=\"btn btn-success btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0 && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"\n [disabled]=\"bulkApproving || pendingInSelection() === 0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M16.6667 5L7.50001 14.1667L3.33334 10\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkApproving\">Approve Selected ({{ pendingInSelection() }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkApproving\">Approving...</span>\n </button>\n <!-- Create Invoice follows Tango Billing EDIT access (not invoice approval). -->\n <button type=\"button\" (click)=\"createInvoice()\"\n class=\"btn btn-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && (gs.userAccess | async)?.TangoAdmin_EditBilling_isEdit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 4.16667V15.8333M4.16667 10H15.8333\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\">Create Invoice</span>\n </button>\n <button type=\"button\" (click)=\"onExport()\" *ngIf=\"!isClient\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!invoiceList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path 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-1\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Filter Tabs + Search -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"d-flex align-items-center gap-2\">\n <!-- 'Pending Approval' is internal pipeline \u2014 hidden for client login.\n Clients still see All / Pending Payment / Paid. -->\n <button *ngFor=\"let tab of filterTabs\" class=\"btn btn-sm\"\n [hidden]=\"isClient && tab === 'Pending Approval'\"\n [ngClass]=\"activeFilter === tab ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setFilter(tab)\">\n {{ tab }}\n <span *ngIf=\"tab === 'Pending Approval' && pendingApproval\" class=\"ms-1 small\">{{ pendingApproval }}</span>\n <span *ngIf=\"tab === 'Pending Payment' && pendingPayment\" class=\"ms-1 small\">{{ pendingPayment }}</span>\n </button>\n </div>\n <div class=\"card-toolbar\">\n <div class=\"d-flex\">\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=\"Invoice # or billing group...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"invoiceFilterObject\" (appliedFilters)=\"applyInvoiceFilters($event)\"></lib-filters>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"invoiceLoading\">\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=\"invoiceNoData\">\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 <!-- Invoices Table -->\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\" [(ngModel)]=\"selectAll\" (change)=\"toggleSelectAll()\"\n class=\"form-check-input\" [disabled]=\"invoiceList.length === 0\">\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('invoice')\">INVOICE #\n <svg [ngClass]=\"sortColumName === 'invoice' && 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 === 'invoice' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th *ngIf=\"!isClient\">BILLING GROUP</th>\n <th>PERIOD</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('billingDate')\">GENERATED\n <svg [ngClass]=\"sortColumName === 'billingDate' && 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 === 'billingDate' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>QTY</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('amount')\">AMOUNT (excl. GST)\n <svg [ngClass]=\"sortColumName === 'amount' && 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 === 'amount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>GST</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('totalAmount')\">AMOUNT (incl. GST)\n <svg [ngClass]=\"sortColumName === 'totalAmount' && 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 === 'totalAmount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STATUS</th>\n <th>ACTION</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let inv of invoiceList; let i = index\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\"\n class=\"form-check-input mt-3\"\n [checked]=\"isSelected(inv)\"\n (change)=\"toggleInvoiceSelect(inv)\">\n </td>\n <td>\n <div class=\"table-title table-title-primary\">\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"invoice-indicator\"\n [ngClass]=\"inv?.status === 'pending' ? 'indicator-warning' :\n inv?.paymentStatus === 'paid' ? 'indicator-success' : 'indicator-primary'\">\n </div>\n <a class=\"invoice-link\" (click)=\"openInvoicePreview(inv); $event.stopPropagation()\">{{ inv?.invoice }}</a>\n </div>\n </div>\n </td>\n <td *ngIf=\"!isClient\">\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.groupName }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.billingDate | date: 'MMM yyyy' }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ inv?.billingDate | date: 'dd MMM yyyy' }}</div>\n </td>\n <td>\n <div class=\"table-title text-center\"><strong>{{ inv?.stores }}</strong></div>\n </td>\n <td>\n <div class=\"table-title\">{{ invoiceCurrencySymbol(inv) }}{{ inv?.amount | number:'1.2-2':'en-IN' }}</div>\n </td>\n <td>\n <div class=\"table-title\" *ngIf=\"isGstApplicable(inv); else noGst\">{{ invoiceCurrencySymbol(inv) }}{{ gstAmount(inv) | number:'1.2-2':'en-IN' }}</div>\n <ng-template #noGst><div class=\"table-title\">\u2014</div></ng-template>\n </td>\n <td>\n <div class=\"table-title\"><strong>{{ invoiceCurrencySymbol(inv) }}{{ inv?.totalAmount | number:'1.2-2':'en-IN' }}</strong></div>\n </td>\n <td>\n <!-- Clients only see the status once the invoice is APPROVED\n (then it's the payment status: Pending Payment / Partial /\n Paid). Approval-pipeline statuses are hidden from clients. -->\n <ng-container *ngIf=\"!isClient || inv?.status === 'approved'\">\n <div [ngClass]=\"getStatusClass(inv)\" class=\"mt-3 cursor-pointer\" title=\"View activity\"\n (click)=\"openInvoiceLogs(inv); $event.stopPropagation()\">\n {{ getInvoiceStatus(inv) }}\n </div>\n <div *ngIf=\"hasPending(inv)\" class=\"pending-note mt-1\">\n {{ invoiceCurrencySymbol(inv) }}{{ pendingAmount(inv) | number:'1.2-2':'en-IN' }} pending\n </div>\n </ng-container>\n </td>\n <td>\n <div class=\"table-title d-flex justify-content-around\">\n <span *ngIf=\"!isClient\" [class.cursor-pointer]=\"!isEditBlocked(inv)\"\n [class.locked-action]=\"isEditBlocked(inv)\"\n (click)=\"!isEditBlocked(inv) && editInvoice(inv)\"\n [ngbTooltip]=\"editTooltip(inv)\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_edit)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M26.5 14.5L29.5 17.5M14.5 29.5H17.5L28 19C28.3978 18.6022 28.6213 18.0663 28.6213 17.5C28.6213 16.9337 28.3978 16.3978 28 16L28 16C27.6022 15.6022 27.0663 15.3787 26.5 15.3787C25.9337 15.3787 25.3978 15.6022 25 16L14.5 26.5V29.5Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_edit\" x=\"0\" y=\"0\" width=\"44\" height=\"44\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_edit\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_edit\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span class=\"cursor-pointer\" (click)=\"approveInvoice(inv)\" [ngbTooltip]=\"getApproveTooltip(inv)\"\n *ngIf=\"!isClient && canApprove(inv, (gs.userAccess | async))\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_16478_43040)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <g clip-path=\"url(#clip0_16478_43040)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16478_43040\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16478_43040\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16478_43040\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16478_43040\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && inv.status==='approved' && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" ngbTooltip=\"Already Approved\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <g filter=\"url(#filter0_d_16630_8062)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#EAECF0\" />\n <g clip-path=\"url(#clip0_16630_8062)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16630_8062\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16630_8062\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16630_8062\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16630_8062\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && hasApproverAccess\" class=\"cursor-pointer\" (click)=\"regenerateInvoice(inv)\" ngbTooltip=\"Regenerate Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60395)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M31.1654 14.3333V19.3333M31.1654 19.3333H26.1654M31.1654 19.3333L27.2987 15.7C26.4031 14.8039 25.2951 14.1493 24.078 13.7973C22.861 13.4453 21.5746 13.4073 20.3389 13.6869C19.1033 13.9665 17.9585 14.5545 17.0116 15.3962C16.0646 16.2378 15.3463 17.3056 14.9237 18.5M12.832 27.6666V22.6666M12.832 22.6666H17.832M12.832 22.6666L16.6987 26.3C17.5943 27.1961 18.7023 27.8506 19.9194 28.2027C21.1364 28.5547 22.4228 28.5927 23.6585 28.3131C24.8941 28.0335 26.0389 27.4455 26.9858 26.6038C27.9328 25.7621 28.6511 24.6943 29.0737 23.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60395\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60395\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60395\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && (gs.userAccess | async)?.Global_Billing_isEdit\" class=\"cursor-pointer\" (click)=\"paymentstatusChange(inv)\" ngbTooltip=\"Payment Status\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <rect x=\"2.5\" y=\"2.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" fill=\"white\" />\n <g transform=\"translate(13, 11)\">\n <path d=\"M2.9987 8.00065V6.33398C2.9987 5.0079 3.52548 3.73613 4.46316 2.79845C5.40085 1.86077 6.67262 1.33398 7.9987 1.33398C9.32478 1.33398 10.5966 1.86077 11.5342 2.79845C12.4719 3.73613 12.9987 5.0079 12.9987 6.33398V8.00065M1.33203 13.0007C1.33203 13.4427 1.50763 13.8666 1.82019 14.1792C2.13275 14.4917 2.55667 14.6673 2.9987 14.6673C3.44073 14.6673 3.86465 14.4917 4.17721 14.1792C4.48977 13.8666 4.66536 13.4427 4.66536 13.0007C4.66536 12.5586 4.48977 12.1347 4.17721 11.8221C3.86465 11.5096 3.44073 11.334 2.9987 11.334C2.55667 11.334 2.13275 11.5096 1.82019 11.8221C1.50763 12.1347 1.33203 12.5586 1.33203 13.0007ZM11.332 13.0007C11.332 13.4427 11.5076 13.8666 11.8202 14.1792C12.1327 14.4917 12.5567 14.6673 12.9987 14.6673C13.4407 14.6673 13.8646 14.4917 14.1772 14.1792C14.4898 13.8666 14.6654 13.4427 14.6654 13.0007C14.6654 12.5586 14.4898 12.1347 14.1772 11.8221C13.8646 11.5096 13.4407 11.334 12.9987 11.334C12.5567 11.334 12.1327 11.5096 11.8202 11.8221C11.5076 12.1347 11.332 12.5586 11.332 13.0007Z\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M10.5 5.5L13 8L15.5 5.5\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n </svg>\n </span>\n <span (click)=\"downloadInvoice(inv)\" class=\"cursor-pointer\" ngbTooltip=\"Download Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60396)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M29.5 23.5V26.8333C29.5 27.2754 29.3244 27.6993 29.0118 28.0118C28.6993 28.3244 28.2754 28.5 27.8333 28.5H16.1667C15.7246 28.5 15.3007 28.3244 14.9882 28.0118C14.6756 27.6993 14.5 27.2754 14.5 26.8333V23.5M17.8333 19.3333L22 23.5M22 23.5L26.1667 19.3333M22 23.5V13.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60396\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60396\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60396\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <!-- Cancel invoice (approved + unpaid only) \u2014 replaces the disabled\n delete slot for cancellable rows. -->\n <!-- Cancelling is a finance action: only users with Finance Approval access. -->\n <span *ngIf=\"!isClient && canShowCancel(inv, (gs.userAccess | async))\" class=\"cursor-pointer\"\n (click)=\"cancelInvoice(inv)\"\n ngbTooltip=\"Cancel Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_cancel)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M28.5 15.5L15.5 28.5M15.5 15.5L28.5 28.5\" stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_cancel\" x=\"0\" y=\"0\" width=\"44\" height=\"44\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_cancel\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_cancel\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n\n <!-- Delete \u2014 HIDDEN (not disabled) once it no longer applies:\n cancellable rows show Cancel instead; number-minted/locked\n rows show neither. -->\n <span *ngIf=\"!isClient && !canCancelInvoice(inv) && !isDeleteLocked(inv)\" class=\"cursor-pointer\"\n (click)=\"deleteInvoice(inv)\"\n ngbTooltip=\"Delete Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_delete)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M17 21H27M15.5 17H28.5M19.5 25H24.5M16.1667 28.5H27.8333C28.7538 28.5 29.5 27.7538 29.5 26.8333V15.1667C29.5 14.2462 28.7538 13.5 27.8333 13.5H16.1667C15.2462 13.5 14.5 14.2462 14.5 15.1667V26.8333C14.5 27.7538 15.2462 28.5 16.1667 28.5Z\"\n stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_delete\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_delete\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_delete\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n </div>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"invoice-total-row\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <!-- Leading span covers INVOICE# + PERIOD + GENERATED, plus\n BILLING GROUP for non-client views (that column is hidden\n for clients). Without the isClient adjustment the totals\n shifted one column right on client login. -->\n <td [attr.colspan]=\"isClient ? 3 : 4\"><strong>Total \u00B7 {{ totalInvoices }} invoices</strong></td>\n <td><strong>{{ totalStores | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountExclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountInclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n <td></td>\n </tr>\n <!-- Each credit note against the listed invoices: its number (and\n source invoice), billing group, the source invoice's period,\n its own date, stores covered, and credit / GST at the source\n invoice's rate / incl. GST. Then the net total after them.\n Credit doesn't reduce any single invoice. Tango only, like\n credit notes. -->\n <ng-container *ngIf=\"!isClient && creditNotes.length > 0\">\n <tr class=\"invoice-credit-row\" *ngFor=\"let cn of creditNotes\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <td>\n <div class=\"table-title\"><strong>{{ cn.creditNote }}</strong></div>\n <div class=\"credit-ref\">Against {{ cn.invoice }}</div>\n </td>\n <td *ngIf=\"!isClient\">\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ cn.groupName }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ cn.period | date: 'MMM yyyy' }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ cn.creditNoteDate | date: 'dd MMM yyyy' }}</div>\n </td>\n <td>\n <div class=\"table-title text-center\"><strong>{{ cn.stores }}</strong></div>\n </td>\n <td class=\"credit-amount\">- {{ invoiceCurrencySymbol(cn) }}{{ cn.amount | number:'1.2-2':'en-IN' }}</td>\n <td class=\"credit-amount\">- {{ invoiceCurrencySymbol(cn) }}{{ cn.gst | number:'1.2-2':'en-IN' }}</td>\n <td class=\"credit-amount\"><strong>- {{ invoiceCurrencySymbol(cn) }}{{ cn.totalAmount | number:'1.2-2':'en-IN' }}</strong></td>\n <td><span class=\"credit-badge\">Credit note</span></td>\n <td>\n <!-- Same Edit / Download icons as the invoice rows. Credit\n notes have no approval, payment or cancel steps. -->\n <div class=\"table-title d-flex credit-actions\">\n <span [class.cursor-pointer]=\"hasApproverAccess\"\n [class.locked-action]=\"!hasApproverAccess\"\n (click)=\"editCreditNote(cn)\"\n [ngbTooltip]=\"hasApproverAccess ? 'Edit Credit Note' : 'Only Finance / Invoice approvers can edit credit notes'\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" fill=\"white\" stroke=\"#D0D5DD\"/>\n <path d=\"M26.5 14.5L29.5 17.5M14.5 29.5H17.5L28 19C28.3978 18.6022 28.6213 18.0663 28.6213 17.5C28.6213 16.9337 28.3978 16.3978 28 16C27.6022 15.6022 27.0663 15.3787 26.5 15.3787C25.9337 15.3787 25.3978 15.6022 25 16L14.5 26.5V29.5Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer\" (click)=\"downloadCreditNote(cn)\" ngbTooltip=\"Download Credit Note\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" fill=\"white\" stroke=\"#D0D5DD\"/>\n <path d=\"M29.5 23.5V26.8333C29.5 27.2754 29.3244 27.6993 29.0118 28.0118C28.6993 28.3244 28.2754 28.5 27.8333 28.5H16.1667C15.7246 28.5 15.3007 28.3244 14.9882 28.0118C14.6756 27.6993 14.5 27.2754 14.5 26.8333V23.5M17.8333 19.3333L22 23.5M22 23.5L26.1667 19.3333M22 23.5V13.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n </td>\n </tr>\n <tr class=\"invoice-net-row\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <td [attr.colspan]=\"isClient ? 3 : 4\"><strong>Net total \u00B7 after credit notes</strong></td>\n <td></td>\n <td><strong>\u20B9{{ netAmountExclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ netGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ netAmountInclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n <td></td>\n </tr>\n </ng-container>\n </tfoot>\n </table>\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\">\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 </ng-container>\n </div>\n\n <!-- Daily Pricing Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'daily-pricing'\">\n <lib-daily-pricing [clientId]=\"brandId\"></lib-daily-pricing>\n </div>\n\n <!-- Billing Groups Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'billing-groups'\">\n <lib-billing-groups [clientId]=\"brandId\"></lib-billing-groups>\n </div>\n\n <!-- Purchase Order Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'purchase-order'\">\n <lib-purchase-order [clientId]=\"brandId\"></lib-purchase-order>\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}.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}.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}.brand-header{padding:8px 0}.brand-avatar{font-family:Inter;font-size:20px;font-weight:600;width:50px;height:50px;display:flex;align-items:center;justify-content:center;border-radius:50%}.brand-name{font-family:Inter;font-size:20px;font-weight:600;color:var(--Gray-900, #101828);line-height:1.3}.brand-meta{font-family:Inter;font-size:14px;font-weight:400}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.status-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.status-dot.dot-warning{background:#f79009}.status-dot.dot-primary{background:#009bf3}.status-dot.dot-success{background:#12b76a}.status-text{font-family:Inter;font-size:13px;color:var(--Gray-600, #475467);font-weight:500}.invoice-indicator{width:3px;height:32px;border-radius:2px}.invoice-indicator.indicator-warning{background:#f79009}.invoice-indicator.indicator-primary{background:#009bf3}.invoice-indicator.indicator-success{background:#12b76a}.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}}.invoice-link{color:#00a3ff;cursor:pointer;text-decoration:none}.invoice-link:hover{text-decoration:underline}.locked-action{opacity:.4;cursor:not-allowed}.pending-note{color:#b54708;font-size:11px;font-weight:600}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}.invoice-total-row td{background:#eff8ff;border-top:2px solid #D0D5DD;padding-top:12px;padding-bottom:12px;color:#101828}.invoice-credit-row td,.invoice-net-row td{background:#eff8ff;padding-top:10px;padding-bottom:10px;color:#101828}.invoice-credit-row td.credit-amount{color:#d92d20}.invoice-credit-row .credit-actions{gap:11px}.invoice-credit-row .credit-ref{font-size:12px;color:#667085}.invoice-credit-row .credit-badge{display:inline-block;padding:2px 8px;border-radius:16px;font-size:12px;font-weight:500;color:#b42318;background:#fef3f2;white-space:nowrap}.invoice-net-row td{border-top:1px solid #D0D5DD}.invoice-type-toggle{display:inline-flex;gap:4px;padding:4px;background:#f2f4f7;border-radius:10px}.invoice-type-btn{border:0;background:transparent;color:#475467;font-size:13.5px;font-weight:600;padding:7px 16px;border-radius:7px;cursor:pointer;transition:background .15s,color .15s}.invoice-type-btn:hover{color:#101828}.invoice-type-btn.active{background:#fff;color:#00a3ff;box-shadow:0 1px 2px #10182814}.invoice-card{border:1px solid #E4E7EC;border-radius:12px;padding:18px 22px;background:#fff}.invoice-card-label{display:flex;align-items:center;gap:6px;color:#475467;font-size:13.5px;font-weight:500}.invoice-card-value{font-size:19px;font-weight:700;color:#101828;letter-spacing:-.3px}.invoice-card-value.text-danger{color:#d64545}.invoice-card-value.text-warning{color:#b9740a}.invoice-card-split{display:flex;gap:28px;margin-top:8px;flex-wrap:wrap}.invoice-card-split-item{display:flex;flex-direction:column;gap:2px}.invoice-card-split-label{color:#98a2b3;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.invoice-card-sub{color:#98a2b3;font-size:12.5px;margin-top:4px}\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.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { 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: "component", type: i8.EstimatesComponent, selector: "lib-estimates", inputs: ["clientId"] }, { kind: "component", type: i9.CreditNotesComponent, selector: "lib-credit-notes", inputs: ["clientId", "allClients"] }, { kind: "component", type: i10.DailyPricingComponent, selector: "lib-daily-pricing", inputs: ["clientId"] }, { kind: "component", type: i11.BillingGroupsComponent, selector: "lib-billing-groups", inputs: ["clientId"] }, { kind: "component", type: i12.PlansSubscriptionComponent, selector: "lib-plans-subscription" }, { kind: "component", type: i13.PurchaseOrderComponent, selector: "lib-purchase-order", inputs: ["clientId"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.DecimalPipe, name: "number" }, { kind: "pipe", type: i6.DatePipe, name: "date" }] });
1104
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrandInvoicesComponent, selector: "lib-brand-invoices", ngImport: i0, template: "<div class=\"card\">\n <!-- Back Button \u2014 hidden for client users (no Brands list to go back to). -->\n <div class=\"mt-3 mx-3\" *ngIf=\"!isClient\">\n <button class=\"btn btn-sm btn-link text-muted p-0\" (click)=\"goBack()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" class=\"me-1\">\n <path d=\"M15 8H1M1 8L8 15M1 8L8 1\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Back to Billing\n </button>\n </div>\n\n <!-- Brand Header \u2014 hidden for client users. -->\n <div class=\"brand-header mx-3 mt-3 d-flex align-items-center gap-3\" *ngIf=\"!isClient\">\n <div class=\"symbol symbol-50px symbol-circle\">\n <span class=\"symbol-label bg-primary text-white brand-avatar\">\n {{ clientInfo?.clientName?.charAt(0) || brandName?.charAt(0) }}\n </span>\n </div>\n <div>\n <div class=\"brand-name\">{{ clientInfo?.clientName || brandName }}</div>\n <div class=\"brand-meta text-muted\">\n {{ clientInfo?.totalStores || 0 }} Stores\n <span class=\"mx-1\">&middot;</span>\n Billing {{ clientInfo?.status === 'active' ? 'Active' : 'Inactive' }}\n </div>\n </div>\n </div>\n\n <!-- Sub Tabs -->\n <div class=\"mt-4 mx-3 paymenthistory\">\n <button *ngIf=\"visibleTabs.includes('invoices')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'invoices' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('invoices')\">\n Invoices\n </button>\n <button *ngIf=\"visibleTabs.includes('estimate')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'estimate' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('estimate')\">\n Estimate\n </button>\n <button *ngIf=\"visibleTabs.includes('daily-pricing')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'daily-pricing' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('daily-pricing')\">\n Billing Breakdown\n </button>\n <button *ngIf=\"visibleTabs.includes('plans-subscription')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'plans-subscription' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('plans-subscription')\">\n Plans &amp; Subscription\n </button>\n <button *ngIf=\"visibleTabs.includes('billing-groups')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'billing-groups' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('billing-groups')\">\n Billing Settings\n </button>\n <button *ngIf=\"visibleTabs.includes('purchase-order')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3\"\n [ngClass]=\"selectedTab === 'purchase-order' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('purchase-order')\">\n Purchase Order\n </button>\n </div>\n\n <!-- Plans & Subscription Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'plans-subscription'\">\n <lib-plans-subscription></lib-plans-subscription>\n </div>\n\n <!-- Estimate Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'estimate'\">\n <lib-estimates [clientId]=\"brandId\"></lib-estimates>\n </div>\n\n <!-- Invoices Section -->\n <div class=\"invoices-section mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'invoices'\">\n <!-- Sub-toggle: regular invoices vs advance (TINV-*) invoices. Shown for\n both tango and client views. -->\n <div class=\"invoice-type-toggle mb-3\">\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'all' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('all')\">All Invoices</button>\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'advance' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('advance')\">Advance Invoice</button>\n <!-- Credit notes are tango-only (the credit-note API is too). -->\n <button type=\"button\" *ngIf=\"!isClient\"\n [ngClass]=\"invoiceType === 'creditNote' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('creditNote')\">Credit Notes</button>\n </div>\n\n <!-- Credit Notes: own list (separate collection) for this brand. -->\n <lib-credit-notes *ngIf=\"invoiceType === 'creditNote'\" [clientId]=\"brandId\"></lib-credit-notes>\n\n <ng-container *ngIf=\"invoiceType !== 'creditNote'\">\n <!-- Header summary cards \u2014 Outstanding / Overdue / Pending Payment,\n each split into Excl. GST / Incl. GST (\u20B9). -->\n <div class=\"row g-3 mb-3\">\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Outstanding</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.outstandingCount }} {{ invoiceCards.outstandingCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Overdue</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.overdueCount }} {{ invoiceCards.overdueCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Pending Payment</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.pendingPaymentCount }} {{ invoiceCards.pendingPaymentCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Header Row -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"billingheader\">Invoices</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ totalInvoices }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Total invoiced: <strong>\u20B9{{ totalInvoiced | number:'1.2-2':'en-IN' }}</strong></div>\n </div>\n <div class=\"d-flex align-items-center gap-3\">\n <button type=\"button\" (click)=\"downloadSelected()\"\n class=\"btn btn-outline-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path 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.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"currentColor\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkDownloading\">Download Selected ({{ selectedInvoices.size }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkDownloading\">Preparing ZIP...</span>\n </button>\n <button type=\"button\" (click)=\"sendEmailSelected()\"\n class=\"btn btn-outline-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0 && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"\n [disabled]=\"bulkEmailing\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M2.5 5.83333L9.07 10.4283C9.635 10.8235 10.365 10.8235 10.93 10.4283L17.5 5.83333M4.16667 15.8333H15.8333C16.7538 15.8333 17.5 15.0871 17.5 14.1667V5.83333C17.5 4.91286 16.7538 4.16667 15.8333 4.16667H4.16667C3.24619 4.16667 2.5 4.91286 2.5 5.83333V14.1667C2.5 15.0871 3.24619 15.8333 4.16667 15.8333Z\"\n stroke=\"currentColor\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkEmailing\">Send Email</span>\n <span class=\"ms-1\" *ngIf=\"bulkEmailing\">Sending...</span>\n </button>\n <button type=\"button\" (click)=\"approveSelected()\"\n class=\"btn btn-success btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0 && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"\n [disabled]=\"bulkApproving || pendingInSelection() === 0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M16.6667 5L7.50001 14.1667L3.33334 10\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkApproving\">Approve Selected ({{ pendingInSelection() }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkApproving\">Approving...</span>\n </button>\n <!-- Create Invoice follows Tango Billing EDIT access (not invoice approval). -->\n <button type=\"button\" (click)=\"createInvoice()\"\n class=\"btn btn-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && (gs.userAccess | async)?.TangoAdmin_EditBilling_isEdit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 4.16667V15.8333M4.16667 10H15.8333\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\">Create Invoice</span>\n </button>\n <button type=\"button\" (click)=\"onExport()\" *ngIf=\"!isClient\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!invoiceList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path 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-1\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Filter Tabs + Search -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"d-flex align-items-center gap-2\">\n <!-- 'Pending Approval' is internal pipeline \u2014 hidden for client login.\n Clients still see All / Pending Payment / Paid. -->\n <button *ngFor=\"let tab of filterTabs\" class=\"btn btn-sm\"\n [hidden]=\"isClient && tab === 'Pending Approval'\"\n [ngClass]=\"activeFilter === tab ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setFilter(tab)\">\n {{ tab }}\n <span *ngIf=\"tab === 'Pending Approval' && pendingApproval\" class=\"ms-1 small\">{{ pendingApproval }}</span>\n <span *ngIf=\"tab === 'Pending Payment' && pendingPayment\" class=\"ms-1 small\">{{ pendingPayment }}</span>\n </button>\n </div>\n <div class=\"card-toolbar\">\n <div class=\"d-flex\">\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=\"Invoice # or billing group...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"invoiceFilterObject\" (appliedFilters)=\"applyInvoiceFilters($event)\"></lib-filters>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"invoiceLoading\">\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=\"invoiceNoData\">\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 <!-- Invoices Table -->\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\" [(ngModel)]=\"selectAll\" (change)=\"toggleSelectAll()\"\n class=\"form-check-input\" [disabled]=\"invoiceList.length === 0\">\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('invoice')\">INVOICE #\n <svg [ngClass]=\"sortColumName === 'invoice' && 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 === 'invoice' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th *ngIf=\"!isClient\">BILLING GROUP</th>\n <th>PERIOD</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('billingDate')\">GENERATED\n <svg [ngClass]=\"sortColumName === 'billingDate' && 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 === 'billingDate' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>QTY</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('amount')\">AMOUNT (excl. GST)\n <svg [ngClass]=\"sortColumName === 'amount' && 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 === 'amount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>GST</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('totalAmount')\">AMOUNT (incl. GST)\n <svg [ngClass]=\"sortColumName === 'totalAmount' && 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 === 'totalAmount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STATUS</th>\n <th>ACTION</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let inv of invoiceList; let i = index\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\"\n class=\"form-check-input mt-3\"\n [checked]=\"isSelected(inv)\"\n (change)=\"toggleInvoiceSelect(inv)\">\n </td>\n <td>\n <div class=\"table-title table-title-primary\">\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"invoice-indicator\"\n [ngClass]=\"inv?.status === 'pending' ? 'indicator-warning' :\n inv?.paymentStatus === 'paid' ? 'indicator-success' : 'indicator-primary'\">\n </div>\n <a class=\"invoice-link\" (click)=\"openInvoicePreview(inv); $event.stopPropagation()\">{{ inv?.invoice }}</a>\n </div>\n </div>\n </td>\n <td *ngIf=\"!isClient\">\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.groupName }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.billingDate | date: 'MMM yyyy' }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ inv?.billingDate | date: 'dd MMM yyyy' }}</div>\n </td>\n <td>\n <div class=\"table-title text-center\"><strong>{{ inv?.stores }}</strong></div>\n </td>\n <td>\n <div class=\"table-title\">{{ invoiceCurrencySymbol(inv) }}{{ inv?.amount | number:'1.2-2':'en-IN' }}</div>\n </td>\n <td>\n <div class=\"table-title\" *ngIf=\"isGstApplicable(inv); else noGst\">{{ invoiceCurrencySymbol(inv) }}{{ gstAmount(inv) | number:'1.2-2':'en-IN' }}</div>\n <ng-template #noGst><div class=\"table-title\">\u2014</div></ng-template>\n </td>\n <td>\n <div class=\"table-title\"><strong>{{ invoiceCurrencySymbol(inv) }}{{ inv?.totalAmount | number:'1.2-2':'en-IN' }}</strong></div>\n </td>\n <td>\n <!-- Clients only see the status once the invoice is APPROVED\n (then it's the payment status: Pending Payment / Partial /\n Paid). Approval-pipeline statuses are hidden from clients. -->\n <ng-container *ngIf=\"!isClient || inv?.status === 'approved'\">\n <div [ngClass]=\"getStatusClass(inv)\" class=\"mt-3 cursor-pointer\" title=\"View activity\"\n (click)=\"openInvoiceLogs(inv); $event.stopPropagation()\">\n {{ getInvoiceStatus(inv) }}\n </div>\n <div *ngIf=\"hasPending(inv)\" class=\"pending-note mt-1\">\n {{ invoiceCurrencySymbol(inv) }}{{ pendingAmount(inv) | number:'1.2-2':'en-IN' }} pending\n </div>\n </ng-container>\n </td>\n <td>\n <div class=\"table-title d-flex justify-content-around\">\n <span *ngIf=\"!isClient\" [class.cursor-pointer]=\"!isEditBlocked(inv)\"\n [class.locked-action]=\"isEditBlocked(inv)\"\n (click)=\"!isEditBlocked(inv) && editInvoice(inv)\"\n [ngbTooltip]=\"editTooltip(inv)\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_edit)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M26.5 14.5L29.5 17.5M14.5 29.5H17.5L28 19C28.3978 18.6022 28.6213 18.0663 28.6213 17.5C28.6213 16.9337 28.3978 16.3978 28 16L28 16C27.6022 15.6022 27.0663 15.3787 26.5 15.3787C25.9337 15.3787 25.3978 15.6022 25 16L14.5 26.5V29.5Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_edit\" x=\"0\" y=\"0\" width=\"44\" height=\"44\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_edit\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_edit\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span class=\"cursor-pointer\" (click)=\"approveInvoice(inv)\" [ngbTooltip]=\"getApproveTooltip(inv)\"\n *ngIf=\"!isClient && canApprove(inv, (gs.userAccess | async))\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_16478_43040)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <g clip-path=\"url(#clip0_16478_43040)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16478_43040\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16478_43040\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16478_43040\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16478_43040\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && inv.status==='approved' && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" ngbTooltip=\"Already Approved\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <g filter=\"url(#filter0_d_16630_8062)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#EAECF0\" />\n <g clip-path=\"url(#clip0_16630_8062)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16630_8062\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16630_8062\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16630_8062\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16630_8062\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && hasApproverAccess\" class=\"cursor-pointer\" (click)=\"regenerateInvoice(inv)\" ngbTooltip=\"Regenerate Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60395)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M31.1654 14.3333V19.3333M31.1654 19.3333H26.1654M31.1654 19.3333L27.2987 15.7C26.4031 14.8039 25.2951 14.1493 24.078 13.7973C22.861 13.4453 21.5746 13.4073 20.3389 13.6869C19.1033 13.9665 17.9585 14.5545 17.0116 15.3962C16.0646 16.2378 15.3463 17.3056 14.9237 18.5M12.832 27.6666V22.6666M12.832 22.6666H17.832M12.832 22.6666L16.6987 26.3C17.5943 27.1961 18.7023 27.8506 19.9194 28.2027C21.1364 28.5547 22.4228 28.5927 23.6585 28.3131C24.8941 28.0335 26.0389 27.4455 26.9858 26.6038C27.9328 25.7621 28.6511 24.6943 29.0737 23.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60395\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60395\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60395\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && (gs.userAccess | async)?.Global_Billing_isEdit\" class=\"cursor-pointer\" (click)=\"paymentstatusChange(inv)\" ngbTooltip=\"Payment Status\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <rect x=\"2.5\" y=\"2.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" fill=\"white\" />\n <g transform=\"translate(13, 11)\">\n <path d=\"M2.9987 8.00065V6.33398C2.9987 5.0079 3.52548 3.73613 4.46316 2.79845C5.40085 1.86077 6.67262 1.33398 7.9987 1.33398C9.32478 1.33398 10.5966 1.86077 11.5342 2.79845C12.4719 3.73613 12.9987 5.0079 12.9987 6.33398V8.00065M1.33203 13.0007C1.33203 13.4427 1.50763 13.8666 1.82019 14.1792C2.13275 14.4917 2.55667 14.6673 2.9987 14.6673C3.44073 14.6673 3.86465 14.4917 4.17721 14.1792C4.48977 13.8666 4.66536 13.4427 4.66536 13.0007C4.66536 12.5586 4.48977 12.1347 4.17721 11.8221C3.86465 11.5096 3.44073 11.334 2.9987 11.334C2.55667 11.334 2.13275 11.5096 1.82019 11.8221C1.50763 12.1347 1.33203 12.5586 1.33203 13.0007ZM11.332 13.0007C11.332 13.4427 11.5076 13.8666 11.8202 14.1792C12.1327 14.4917 12.5567 14.6673 12.9987 14.6673C13.4407 14.6673 13.8646 14.4917 14.1772 14.1792C14.4898 13.8666 14.6654 13.4427 14.6654 13.0007C14.6654 12.5586 14.4898 12.1347 14.1772 11.8221C13.8646 11.5096 13.4407 11.334 12.9987 11.334C12.5567 11.334 12.1327 11.5096 11.8202 11.8221C11.5076 12.1347 11.332 12.5586 11.332 13.0007Z\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M10.5 5.5L13 8L15.5 5.5\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n </svg>\n </span>\n <span (click)=\"downloadInvoice(inv)\" class=\"cursor-pointer\" ngbTooltip=\"Download Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60396)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M29.5 23.5V26.8333C29.5 27.2754 29.3244 27.6993 29.0118 28.0118C28.6993 28.3244 28.2754 28.5 27.8333 28.5H16.1667C15.7246 28.5 15.3007 28.3244 14.9882 28.0118C14.6756 27.6993 14.5 27.2754 14.5 26.8333V23.5M17.8333 19.3333L22 23.5M22 23.5L26.1667 19.3333M22 23.5V13.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60396\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60396\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60396\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <!-- Cancel invoice (approved + unpaid only) \u2014 replaces the disabled\n delete slot for cancellable rows. -->\n <!-- Cancelling is a finance action: only users with Finance Approval access. -->\n <span *ngIf=\"!isClient && canShowCancel(inv, (gs.userAccess | async))\" class=\"cursor-pointer\"\n (click)=\"cancelInvoice(inv)\"\n ngbTooltip=\"Cancel Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_cancel)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M28.5 15.5L15.5 28.5M15.5 15.5L28.5 28.5\" stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_cancel\" x=\"0\" y=\"0\" width=\"44\" height=\"44\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_cancel\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_cancel\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n\n <!-- Delete \u2014 HIDDEN (not disabled) once it no longer applies:\n cancellable rows show Cancel instead; number-minted/locked\n rows show neither. -->\n <span *ngIf=\"!isClient && !canCancelInvoice(inv) && !isDeleteLocked(inv)\" class=\"cursor-pointer\"\n (click)=\"deleteInvoice(inv)\"\n ngbTooltip=\"Delete Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_delete)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M17 21H27M15.5 17H28.5M19.5 25H24.5M16.1667 28.5H27.8333C28.7538 28.5 29.5 27.7538 29.5 26.8333V15.1667C29.5 14.2462 28.7538 13.5 27.8333 13.5H16.1667C15.2462 13.5 14.5 14.2462 14.5 15.1667V26.8333C14.5 27.7538 15.2462 28.5 16.1667 28.5Z\"\n stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_delete\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_delete\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_delete\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n </div>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"invoice-total-row\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <!-- Leading span covers INVOICE# + PERIOD + GENERATED, plus\n BILLING GROUP for non-client views (that column is hidden\n for clients). Without the isClient adjustment the totals\n shifted one column right on client login. -->\n <td [attr.colspan]=\"isClient ? 3 : 4\"><strong>Total \u00B7 {{ totalInvoices }} invoices</strong></td>\n <td><strong>{{ totalStores | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountExclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountInclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n <td></td>\n </tr>\n <!-- Each credit note generated in this period (by its own date,\n not the date of the invoice it's against), on the \"All\" view:\n its number (and source invoice), billing group, the source\n invoice's period, its own date, stores covered, and credit /\n GST at the source invoice's rate / incl. GST. Then the net\n total after them, so this month's credit comes off this\n month's invoices. Credit doesn't change any single invoice.\n Tango only, like credit notes. -->\n <ng-container *ngIf=\"!isClient && creditNotes.length > 0\">\n <tr class=\"invoice-credit-row\" *ngFor=\"let cn of creditNotes\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <td>\n <div class=\"table-title\"><strong>{{ cn.creditNote }}</strong></div>\n <div class=\"credit-ref\">Against {{ cn.invoice }}</div>\n </td>\n <td *ngIf=\"!isClient\">\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ cn.groupName }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ cn.period | date: 'MMM yyyy' }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ cn.creditNoteDate | date: 'dd MMM yyyy' }}</div>\n </td>\n <td>\n <div class=\"table-title text-center\"><strong>{{ cn.stores }}</strong></div>\n </td>\n <td class=\"credit-amount\">- {{ invoiceCurrencySymbol(cn) }}{{ cn.amount | number:'1.2-2':'en-IN' }}</td>\n <td class=\"credit-amount\">- {{ invoiceCurrencySymbol(cn) }}{{ cn.gst | number:'1.2-2':'en-IN' }}</td>\n <td class=\"credit-amount\"><strong>- {{ invoiceCurrencySymbol(cn) }}{{ cn.totalAmount | number:'1.2-2':'en-IN' }}</strong></td>\n <td><span class=\"credit-badge\">Credit note</span></td>\n <td>\n <!-- Same Edit / Download icons as the invoice rows. Credit\n notes have no approval, payment or cancel steps. -->\n <div class=\"table-title d-flex credit-actions\">\n <span [class.cursor-pointer]=\"hasApproverAccess\"\n [class.locked-action]=\"!hasApproverAccess\"\n (click)=\"editCreditNote(cn)\"\n [ngbTooltip]=\"hasApproverAccess ? 'Edit Credit Note' : 'Only Finance / Invoice approvers can edit credit notes'\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" fill=\"white\" stroke=\"#D0D5DD\"/>\n <path d=\"M26.5 14.5L29.5 17.5M14.5 29.5H17.5L28 19C28.3978 18.6022 28.6213 18.0663 28.6213 17.5C28.6213 16.9337 28.3978 16.3978 28 16C27.6022 15.6022 27.0663 15.3787 26.5 15.3787C25.9337 15.3787 25.3978 15.6022 25 16L14.5 26.5V29.5Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer\" (click)=\"downloadCreditNote(cn)\" ngbTooltip=\"Download Credit Note\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" fill=\"white\" stroke=\"#D0D5DD\"/>\n <path d=\"M29.5 23.5V26.8333C29.5 27.2754 29.3244 27.6993 29.0118 28.0118C28.6993 28.3244 28.2754 28.5 27.8333 28.5H16.1667C15.7246 28.5 15.3007 28.3244 14.9882 28.0118C14.6756 27.6993 14.5 27.2754 14.5 26.8333V23.5M17.8333 19.3333L22 23.5M22 23.5L26.1667 19.3333M22 23.5V13.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span *ngIf=\"hasApproverAccess\" class=\"cursor-pointer\" (click)=\"deleteCreditNote(cn)\" ngbTooltip=\"Delete Credit Note\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" fill=\"white\" stroke=\"#D0D5DD\"/>\n <path d=\"M17 21H27M15.5 17H28.5M19.5 25H24.5M16.1667 28.5H27.8333C28.7538 28.5 29.5 27.7538 29.5 26.8333V15.1667C29.5 14.2462 28.7538 13.5 27.8333 13.5H16.1667C15.2462 13.5 14.5 14.2462 14.5 15.1667V26.8333C14.5 27.7538 15.2462 28.5 16.1667 28.5Z\"\n stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>\n </svg>\n </span>\n </div>\n </td>\n </tr>\n <tr class=\"invoice-net-row\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <td [attr.colspan]=\"isClient ? 3 : 4\"><strong>Net total \u00B7 after credit notes</strong></td>\n <td></td>\n <td><strong>\u20B9{{ netAmountExclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ netGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ netAmountInclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n <td></td>\n </tr>\n </ng-container>\n </tfoot>\n </table>\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\">\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 </ng-container>\n </div>\n\n <!-- Daily Pricing Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'daily-pricing'\">\n <lib-daily-pricing [clientId]=\"brandId\"></lib-daily-pricing>\n </div>\n\n <!-- Billing Groups Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'billing-groups'\">\n <lib-billing-groups [clientId]=\"brandId\"></lib-billing-groups>\n </div>\n\n <!-- Purchase Order Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'purchase-order'\">\n <lib-purchase-order [clientId]=\"brandId\"></lib-purchase-order>\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}.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}.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}.brand-header{padding:8px 0}.brand-avatar{font-family:Inter;font-size:20px;font-weight:600;width:50px;height:50px;display:flex;align-items:center;justify-content:center;border-radius:50%}.brand-name{font-family:Inter;font-size:20px;font-weight:600;color:var(--Gray-900, #101828);line-height:1.3}.brand-meta{font-family:Inter;font-size:14px;font-weight:400}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.status-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.status-dot.dot-warning{background:#f79009}.status-dot.dot-primary{background:#009bf3}.status-dot.dot-success{background:#12b76a}.status-text{font-family:Inter;font-size:13px;color:var(--Gray-600, #475467);font-weight:500}.invoice-indicator{width:3px;height:32px;border-radius:2px}.invoice-indicator.indicator-warning{background:#f79009}.invoice-indicator.indicator-primary{background:#009bf3}.invoice-indicator.indicator-success{background:#12b76a}.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}}.invoice-link{color:#00a3ff;cursor:pointer;text-decoration:none}.invoice-link:hover{text-decoration:underline}.locked-action{opacity:.4;cursor:not-allowed}.pending-note{color:#b54708;font-size:11px;font-weight:600}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}.invoice-total-row td{background:#eff8ff;border-top:2px solid #D0D5DD;padding-top:12px;padding-bottom:12px;color:#101828}.invoice-credit-row td,.invoice-net-row td{background:#eff8ff;padding-top:10px;padding-bottom:10px;color:#101828}.invoice-credit-row td.credit-amount{color:#d92d20}.invoice-credit-row .credit-actions{gap:11px}.invoice-credit-row .credit-ref{font-size:12px;color:#667085}.invoice-credit-row .credit-badge{display:inline-block;padding:2px 8px;border-radius:16px;font-size:12px;font-weight:500;color:#b42318;background:#fef3f2;white-space:nowrap}.invoice-net-row td{border-top:1px solid #D0D5DD}.invoice-type-toggle{display:inline-flex;gap:4px;padding:4px;background:#f2f4f7;border-radius:10px}.invoice-type-btn{border:0;background:transparent;color:#475467;font-size:13.5px;font-weight:600;padding:7px 16px;border-radius:7px;cursor:pointer;transition:background .15s,color .15s}.invoice-type-btn:hover{color:#101828}.invoice-type-btn.active{background:#fff;color:#00a3ff;box-shadow:0 1px 2px #10182814}.invoice-card{border:1px solid #E4E7EC;border-radius:12px;padding:18px 22px;background:#fff}.invoice-card-label{display:flex;align-items:center;gap:6px;color:#475467;font-size:13.5px;font-weight:500}.invoice-card-value{font-size:19px;font-weight:700;color:#101828;letter-spacing:-.3px}.invoice-card-value.text-danger{color:#d64545}.invoice-card-value.text-warning{color:#b9740a}.invoice-card-split{display:flex;gap:28px;margin-top:8px;flex-wrap:wrap}.invoice-card-split-item{display:flex;flex-direction:column;gap:2px}.invoice-card-split-label{color:#98a2b3;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.invoice-card-sub{color:#98a2b3;font-size:12.5px;margin-top:4px}\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.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { 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: "component", type: i8.EstimatesComponent, selector: "lib-estimates", inputs: ["clientId"] }, { kind: "component", type: i9.CreditNotesComponent, selector: "lib-credit-notes", inputs: ["clientId", "allClients"] }, { kind: "component", type: i10.DailyPricingComponent, selector: "lib-daily-pricing", inputs: ["clientId"] }, { kind: "component", type: i11.BillingGroupsComponent, selector: "lib-billing-groups", inputs: ["clientId"] }, { kind: "component", type: i12.PlansSubscriptionComponent, selector: "lib-plans-subscription" }, { kind: "component", type: i13.PurchaseOrderComponent, selector: "lib-purchase-order", inputs: ["clientId"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.DecimalPipe, name: "number" }, { kind: "pipe", type: i6.DatePipe, name: "date" }] });
1083
1105
  }
1084
1106
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrandInvoicesComponent, decorators: [{
1085
1107
  type: Component,
1086
- args: [{ selector: 'lib-brand-invoices', template: "<div class=\"card\">\n <!-- Back Button \u2014 hidden for client users (no Brands list to go back to). -->\n <div class=\"mt-3 mx-3\" *ngIf=\"!isClient\">\n <button class=\"btn btn-sm btn-link text-muted p-0\" (click)=\"goBack()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" class=\"me-1\">\n <path d=\"M15 8H1M1 8L8 15M1 8L8 1\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Back to Billing\n </button>\n </div>\n\n <!-- Brand Header \u2014 hidden for client users. -->\n <div class=\"brand-header mx-3 mt-3 d-flex align-items-center gap-3\" *ngIf=\"!isClient\">\n <div class=\"symbol symbol-50px symbol-circle\">\n <span class=\"symbol-label bg-primary text-white brand-avatar\">\n {{ clientInfo?.clientName?.charAt(0) || brandName?.charAt(0) }}\n </span>\n </div>\n <div>\n <div class=\"brand-name\">{{ clientInfo?.clientName || brandName }}</div>\n <div class=\"brand-meta text-muted\">\n {{ clientInfo?.totalStores || 0 }} Stores\n <span class=\"mx-1\">&middot;</span>\n Billing {{ clientInfo?.status === 'active' ? 'Active' : 'Inactive' }}\n </div>\n </div>\n </div>\n\n <!-- Sub Tabs -->\n <div class=\"mt-4 mx-3 paymenthistory\">\n <button *ngIf=\"visibleTabs.includes('invoices')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'invoices' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('invoices')\">\n Invoices\n </button>\n <button *ngIf=\"visibleTabs.includes('estimate')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'estimate' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('estimate')\">\n Estimate\n </button>\n <button *ngIf=\"visibleTabs.includes('daily-pricing')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'daily-pricing' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('daily-pricing')\">\n Billing Breakdown\n </button>\n <button *ngIf=\"visibleTabs.includes('plans-subscription')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'plans-subscription' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('plans-subscription')\">\n Plans &amp; Subscription\n </button>\n <button *ngIf=\"visibleTabs.includes('billing-groups')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'billing-groups' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('billing-groups')\">\n Billing Settings\n </button>\n <button *ngIf=\"visibleTabs.includes('purchase-order')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3\"\n [ngClass]=\"selectedTab === 'purchase-order' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('purchase-order')\">\n Purchase Order\n </button>\n </div>\n\n <!-- Plans & Subscription Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'plans-subscription'\">\n <lib-plans-subscription></lib-plans-subscription>\n </div>\n\n <!-- Estimate Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'estimate'\">\n <lib-estimates [clientId]=\"brandId\"></lib-estimates>\n </div>\n\n <!-- Invoices Section -->\n <div class=\"invoices-section mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'invoices'\">\n <!-- Sub-toggle: regular invoices vs advance (TINV-*) invoices. Shown for\n both tango and client views. -->\n <div class=\"invoice-type-toggle mb-3\">\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'all' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('all')\">All Invoices</button>\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'advance' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('advance')\">Advance Invoice</button>\n <!-- Credit notes are tango-only (the credit-note API is too). -->\n <button type=\"button\" *ngIf=\"!isClient\"\n [ngClass]=\"invoiceType === 'creditNote' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('creditNote')\">Credit Notes</button>\n </div>\n\n <!-- Credit Notes: own list (separate collection) for this brand. -->\n <lib-credit-notes *ngIf=\"invoiceType === 'creditNote'\" [clientId]=\"brandId\"></lib-credit-notes>\n\n <ng-container *ngIf=\"invoiceType !== 'creditNote'\">\n <!-- Header summary cards \u2014 Outstanding / Overdue / Pending Payment,\n each split into Excl. GST / Incl. GST (\u20B9). -->\n <div class=\"row g-3 mb-3\">\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Outstanding</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.outstandingCount }} {{ invoiceCards.outstandingCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Overdue</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.overdueCount }} {{ invoiceCards.overdueCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Pending Payment</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.pendingPaymentCount }} {{ invoiceCards.pendingPaymentCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Header Row -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"billingheader\">Invoices</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ totalInvoices }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Total invoiced: <strong>\u20B9{{ totalInvoiced | number:'1.2-2':'en-IN' }}</strong></div>\n </div>\n <div class=\"d-flex align-items-center gap-3\">\n <button type=\"button\" (click)=\"downloadSelected()\"\n class=\"btn btn-outline-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path 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.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"currentColor\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkDownloading\">Download Selected ({{ selectedInvoices.size }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkDownloading\">Preparing ZIP...</span>\n </button>\n <button type=\"button\" (click)=\"sendEmailSelected()\"\n class=\"btn btn-outline-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0 && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"\n [disabled]=\"bulkEmailing\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M2.5 5.83333L9.07 10.4283C9.635 10.8235 10.365 10.8235 10.93 10.4283L17.5 5.83333M4.16667 15.8333H15.8333C16.7538 15.8333 17.5 15.0871 17.5 14.1667V5.83333C17.5 4.91286 16.7538 4.16667 15.8333 4.16667H4.16667C3.24619 4.16667 2.5 4.91286 2.5 5.83333V14.1667C2.5 15.0871 3.24619 15.8333 4.16667 15.8333Z\"\n stroke=\"currentColor\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkEmailing\">Send Email</span>\n <span class=\"ms-1\" *ngIf=\"bulkEmailing\">Sending...</span>\n </button>\n <button type=\"button\" (click)=\"approveSelected()\"\n class=\"btn btn-success btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0 && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"\n [disabled]=\"bulkApproving || pendingInSelection() === 0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M16.6667 5L7.50001 14.1667L3.33334 10\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkApproving\">Approve Selected ({{ pendingInSelection() }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkApproving\">Approving...</span>\n </button>\n <!-- Create Invoice follows Tango Billing EDIT access (not invoice approval). -->\n <button type=\"button\" (click)=\"createInvoice()\"\n class=\"btn btn-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && (gs.userAccess | async)?.TangoAdmin_EditBilling_isEdit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 4.16667V15.8333M4.16667 10H15.8333\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\">Create Invoice</span>\n </button>\n <button type=\"button\" (click)=\"onExport()\" *ngIf=\"!isClient\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!invoiceList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path 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-1\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Filter Tabs + Search -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"d-flex align-items-center gap-2\">\n <!-- 'Pending Approval' is internal pipeline \u2014 hidden for client login.\n Clients still see All / Pending Payment / Paid. -->\n <button *ngFor=\"let tab of filterTabs\" class=\"btn btn-sm\"\n [hidden]=\"isClient && tab === 'Pending Approval'\"\n [ngClass]=\"activeFilter === tab ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setFilter(tab)\">\n {{ tab }}\n <span *ngIf=\"tab === 'Pending Approval' && pendingApproval\" class=\"ms-1 small\">{{ pendingApproval }}</span>\n <span *ngIf=\"tab === 'Pending Payment' && pendingPayment\" class=\"ms-1 small\">{{ pendingPayment }}</span>\n </button>\n </div>\n <div class=\"card-toolbar\">\n <div class=\"d-flex\">\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=\"Invoice # or billing group...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"invoiceFilterObject\" (appliedFilters)=\"applyInvoiceFilters($event)\"></lib-filters>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"invoiceLoading\">\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=\"invoiceNoData\">\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 <!-- Invoices Table -->\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\" [(ngModel)]=\"selectAll\" (change)=\"toggleSelectAll()\"\n class=\"form-check-input\" [disabled]=\"invoiceList.length === 0\">\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('invoice')\">INVOICE #\n <svg [ngClass]=\"sortColumName === 'invoice' && 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 === 'invoice' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th *ngIf=\"!isClient\">BILLING GROUP</th>\n <th>PERIOD</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('billingDate')\">GENERATED\n <svg [ngClass]=\"sortColumName === 'billingDate' && 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 === 'billingDate' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>QTY</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('amount')\">AMOUNT (excl. GST)\n <svg [ngClass]=\"sortColumName === 'amount' && 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 === 'amount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>GST</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('totalAmount')\">AMOUNT (incl. GST)\n <svg [ngClass]=\"sortColumName === 'totalAmount' && 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 === 'totalAmount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STATUS</th>\n <th>ACTION</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let inv of invoiceList; let i = index\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\"\n class=\"form-check-input mt-3\"\n [checked]=\"isSelected(inv)\"\n (change)=\"toggleInvoiceSelect(inv)\">\n </td>\n <td>\n <div class=\"table-title table-title-primary\">\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"invoice-indicator\"\n [ngClass]=\"inv?.status === 'pending' ? 'indicator-warning' :\n inv?.paymentStatus === 'paid' ? 'indicator-success' : 'indicator-primary'\">\n </div>\n <a class=\"invoice-link\" (click)=\"openInvoicePreview(inv); $event.stopPropagation()\">{{ inv?.invoice }}</a>\n </div>\n </div>\n </td>\n <td *ngIf=\"!isClient\">\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.groupName }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.billingDate | date: 'MMM yyyy' }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ inv?.billingDate | date: 'dd MMM yyyy' }}</div>\n </td>\n <td>\n <div class=\"table-title text-center\"><strong>{{ inv?.stores }}</strong></div>\n </td>\n <td>\n <div class=\"table-title\">{{ invoiceCurrencySymbol(inv) }}{{ inv?.amount | number:'1.2-2':'en-IN' }}</div>\n </td>\n <td>\n <div class=\"table-title\" *ngIf=\"isGstApplicable(inv); else noGst\">{{ invoiceCurrencySymbol(inv) }}{{ gstAmount(inv) | number:'1.2-2':'en-IN' }}</div>\n <ng-template #noGst><div class=\"table-title\">\u2014</div></ng-template>\n </td>\n <td>\n <div class=\"table-title\"><strong>{{ invoiceCurrencySymbol(inv) }}{{ inv?.totalAmount | number:'1.2-2':'en-IN' }}</strong></div>\n </td>\n <td>\n <!-- Clients only see the status once the invoice is APPROVED\n (then it's the payment status: Pending Payment / Partial /\n Paid). Approval-pipeline statuses are hidden from clients. -->\n <ng-container *ngIf=\"!isClient || inv?.status === 'approved'\">\n <div [ngClass]=\"getStatusClass(inv)\" class=\"mt-3 cursor-pointer\" title=\"View activity\"\n (click)=\"openInvoiceLogs(inv); $event.stopPropagation()\">\n {{ getInvoiceStatus(inv) }}\n </div>\n <div *ngIf=\"hasPending(inv)\" class=\"pending-note mt-1\">\n {{ invoiceCurrencySymbol(inv) }}{{ pendingAmount(inv) | number:'1.2-2':'en-IN' }} pending\n </div>\n </ng-container>\n </td>\n <td>\n <div class=\"table-title d-flex justify-content-around\">\n <span *ngIf=\"!isClient\" [class.cursor-pointer]=\"!isEditBlocked(inv)\"\n [class.locked-action]=\"isEditBlocked(inv)\"\n (click)=\"!isEditBlocked(inv) && editInvoice(inv)\"\n [ngbTooltip]=\"editTooltip(inv)\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_edit)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M26.5 14.5L29.5 17.5M14.5 29.5H17.5L28 19C28.3978 18.6022 28.6213 18.0663 28.6213 17.5C28.6213 16.9337 28.3978 16.3978 28 16L28 16C27.6022 15.6022 27.0663 15.3787 26.5 15.3787C25.9337 15.3787 25.3978 15.6022 25 16L14.5 26.5V29.5Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_edit\" x=\"0\" y=\"0\" width=\"44\" height=\"44\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_edit\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_edit\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span class=\"cursor-pointer\" (click)=\"approveInvoice(inv)\" [ngbTooltip]=\"getApproveTooltip(inv)\"\n *ngIf=\"!isClient && canApprove(inv, (gs.userAccess | async))\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_16478_43040)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <g clip-path=\"url(#clip0_16478_43040)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16478_43040\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16478_43040\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16478_43040\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16478_43040\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && inv.status==='approved' && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" ngbTooltip=\"Already Approved\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <g filter=\"url(#filter0_d_16630_8062)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#EAECF0\" />\n <g clip-path=\"url(#clip0_16630_8062)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16630_8062\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16630_8062\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16630_8062\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16630_8062\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && hasApproverAccess\" class=\"cursor-pointer\" (click)=\"regenerateInvoice(inv)\" ngbTooltip=\"Regenerate Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60395)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M31.1654 14.3333V19.3333M31.1654 19.3333H26.1654M31.1654 19.3333L27.2987 15.7C26.4031 14.8039 25.2951 14.1493 24.078 13.7973C22.861 13.4453 21.5746 13.4073 20.3389 13.6869C19.1033 13.9665 17.9585 14.5545 17.0116 15.3962C16.0646 16.2378 15.3463 17.3056 14.9237 18.5M12.832 27.6666V22.6666M12.832 22.6666H17.832M12.832 22.6666L16.6987 26.3C17.5943 27.1961 18.7023 27.8506 19.9194 28.2027C21.1364 28.5547 22.4228 28.5927 23.6585 28.3131C24.8941 28.0335 26.0389 27.4455 26.9858 26.6038C27.9328 25.7621 28.6511 24.6943 29.0737 23.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60395\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60395\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60395\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && (gs.userAccess | async)?.Global_Billing_isEdit\" class=\"cursor-pointer\" (click)=\"paymentstatusChange(inv)\" ngbTooltip=\"Payment Status\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <rect x=\"2.5\" y=\"2.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" fill=\"white\" />\n <g transform=\"translate(13, 11)\">\n <path d=\"M2.9987 8.00065V6.33398C2.9987 5.0079 3.52548 3.73613 4.46316 2.79845C5.40085 1.86077 6.67262 1.33398 7.9987 1.33398C9.32478 1.33398 10.5966 1.86077 11.5342 2.79845C12.4719 3.73613 12.9987 5.0079 12.9987 6.33398V8.00065M1.33203 13.0007C1.33203 13.4427 1.50763 13.8666 1.82019 14.1792C2.13275 14.4917 2.55667 14.6673 2.9987 14.6673C3.44073 14.6673 3.86465 14.4917 4.17721 14.1792C4.48977 13.8666 4.66536 13.4427 4.66536 13.0007C4.66536 12.5586 4.48977 12.1347 4.17721 11.8221C3.86465 11.5096 3.44073 11.334 2.9987 11.334C2.55667 11.334 2.13275 11.5096 1.82019 11.8221C1.50763 12.1347 1.33203 12.5586 1.33203 13.0007ZM11.332 13.0007C11.332 13.4427 11.5076 13.8666 11.8202 14.1792C12.1327 14.4917 12.5567 14.6673 12.9987 14.6673C13.4407 14.6673 13.8646 14.4917 14.1772 14.1792C14.4898 13.8666 14.6654 13.4427 14.6654 13.0007C14.6654 12.5586 14.4898 12.1347 14.1772 11.8221C13.8646 11.5096 13.4407 11.334 12.9987 11.334C12.5567 11.334 12.1327 11.5096 11.8202 11.8221C11.5076 12.1347 11.332 12.5586 11.332 13.0007Z\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M10.5 5.5L13 8L15.5 5.5\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n </svg>\n </span>\n <span (click)=\"downloadInvoice(inv)\" class=\"cursor-pointer\" ngbTooltip=\"Download Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60396)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M29.5 23.5V26.8333C29.5 27.2754 29.3244 27.6993 29.0118 28.0118C28.6993 28.3244 28.2754 28.5 27.8333 28.5H16.1667C15.7246 28.5 15.3007 28.3244 14.9882 28.0118C14.6756 27.6993 14.5 27.2754 14.5 26.8333V23.5M17.8333 19.3333L22 23.5M22 23.5L26.1667 19.3333M22 23.5V13.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60396\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60396\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60396\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <!-- Cancel invoice (approved + unpaid only) \u2014 replaces the disabled\n delete slot for cancellable rows. -->\n <!-- Cancelling is a finance action: only users with Finance Approval access. -->\n <span *ngIf=\"!isClient && canShowCancel(inv, (gs.userAccess | async))\" class=\"cursor-pointer\"\n (click)=\"cancelInvoice(inv)\"\n ngbTooltip=\"Cancel Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_cancel)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M28.5 15.5L15.5 28.5M15.5 15.5L28.5 28.5\" stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_cancel\" x=\"0\" y=\"0\" width=\"44\" height=\"44\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_cancel\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_cancel\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n\n <!-- Delete \u2014 HIDDEN (not disabled) once it no longer applies:\n cancellable rows show Cancel instead; number-minted/locked\n rows show neither. -->\n <span *ngIf=\"!isClient && !canCancelInvoice(inv) && !isDeleteLocked(inv)\" class=\"cursor-pointer\"\n (click)=\"deleteInvoice(inv)\"\n ngbTooltip=\"Delete Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_delete)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M17 21H27M15.5 17H28.5M19.5 25H24.5M16.1667 28.5H27.8333C28.7538 28.5 29.5 27.7538 29.5 26.8333V15.1667C29.5 14.2462 28.7538 13.5 27.8333 13.5H16.1667C15.2462 13.5 14.5 14.2462 14.5 15.1667V26.8333C14.5 27.7538 15.2462 28.5 16.1667 28.5Z\"\n stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_delete\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_delete\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_delete\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n </div>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"invoice-total-row\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <!-- Leading span covers INVOICE# + PERIOD + GENERATED, plus\n BILLING GROUP for non-client views (that column is hidden\n for clients). Without the isClient adjustment the totals\n shifted one column right on client login. -->\n <td [attr.colspan]=\"isClient ? 3 : 4\"><strong>Total \u00B7 {{ totalInvoices }} invoices</strong></td>\n <td><strong>{{ totalStores | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountExclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountInclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n <td></td>\n </tr>\n <!-- Each credit note against the listed invoices: its number (and\n source invoice), billing group, the source invoice's period,\n its own date, stores covered, and credit / GST at the source\n invoice's rate / incl. GST. Then the net total after them.\n Credit doesn't reduce any single invoice. Tango only, like\n credit notes. -->\n <ng-container *ngIf=\"!isClient && creditNotes.length > 0\">\n <tr class=\"invoice-credit-row\" *ngFor=\"let cn of creditNotes\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <td>\n <div class=\"table-title\"><strong>{{ cn.creditNote }}</strong></div>\n <div class=\"credit-ref\">Against {{ cn.invoice }}</div>\n </td>\n <td *ngIf=\"!isClient\">\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ cn.groupName }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ cn.period | date: 'MMM yyyy' }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ cn.creditNoteDate | date: 'dd MMM yyyy' }}</div>\n </td>\n <td>\n <div class=\"table-title text-center\"><strong>{{ cn.stores }}</strong></div>\n </td>\n <td class=\"credit-amount\">- {{ invoiceCurrencySymbol(cn) }}{{ cn.amount | number:'1.2-2':'en-IN' }}</td>\n <td class=\"credit-amount\">- {{ invoiceCurrencySymbol(cn) }}{{ cn.gst | number:'1.2-2':'en-IN' }}</td>\n <td class=\"credit-amount\"><strong>- {{ invoiceCurrencySymbol(cn) }}{{ cn.totalAmount | number:'1.2-2':'en-IN' }}</strong></td>\n <td><span class=\"credit-badge\">Credit note</span></td>\n <td>\n <!-- Same Edit / Download icons as the invoice rows. Credit\n notes have no approval, payment or cancel steps. -->\n <div class=\"table-title d-flex credit-actions\">\n <span [class.cursor-pointer]=\"hasApproverAccess\"\n [class.locked-action]=\"!hasApproverAccess\"\n (click)=\"editCreditNote(cn)\"\n [ngbTooltip]=\"hasApproverAccess ? 'Edit Credit Note' : 'Only Finance / Invoice approvers can edit credit notes'\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" fill=\"white\" stroke=\"#D0D5DD\"/>\n <path d=\"M26.5 14.5L29.5 17.5M14.5 29.5H17.5L28 19C28.3978 18.6022 28.6213 18.0663 28.6213 17.5C28.6213 16.9337 28.3978 16.3978 28 16C27.6022 15.6022 27.0663 15.3787 26.5 15.3787C25.9337 15.3787 25.3978 15.6022 25 16L14.5 26.5V29.5Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer\" (click)=\"downloadCreditNote(cn)\" ngbTooltip=\"Download Credit Note\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" fill=\"white\" stroke=\"#D0D5DD\"/>\n <path d=\"M29.5 23.5V26.8333C29.5 27.2754 29.3244 27.6993 29.0118 28.0118C28.6993 28.3244 28.2754 28.5 27.8333 28.5H16.1667C15.7246 28.5 15.3007 28.3244 14.9882 28.0118C14.6756 27.6993 14.5 27.2754 14.5 26.8333V23.5M17.8333 19.3333L22 23.5M22 23.5L26.1667 19.3333M22 23.5V13.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n </td>\n </tr>\n <tr class=\"invoice-net-row\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <td [attr.colspan]=\"isClient ? 3 : 4\"><strong>Net total \u00B7 after credit notes</strong></td>\n <td></td>\n <td><strong>\u20B9{{ netAmountExclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ netGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ netAmountInclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n <td></td>\n </tr>\n </ng-container>\n </tfoot>\n </table>\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\">\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 </ng-container>\n </div>\n\n <!-- Daily Pricing Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'daily-pricing'\">\n <lib-daily-pricing [clientId]=\"brandId\"></lib-daily-pricing>\n </div>\n\n <!-- Billing Groups Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'billing-groups'\">\n <lib-billing-groups [clientId]=\"brandId\"></lib-billing-groups>\n </div>\n\n <!-- Purchase Order Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'purchase-order'\">\n <lib-purchase-order [clientId]=\"brandId\"></lib-purchase-order>\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}.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}.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}.brand-header{padding:8px 0}.brand-avatar{font-family:Inter;font-size:20px;font-weight:600;width:50px;height:50px;display:flex;align-items:center;justify-content:center;border-radius:50%}.brand-name{font-family:Inter;font-size:20px;font-weight:600;color:var(--Gray-900, #101828);line-height:1.3}.brand-meta{font-family:Inter;font-size:14px;font-weight:400}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.status-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.status-dot.dot-warning{background:#f79009}.status-dot.dot-primary{background:#009bf3}.status-dot.dot-success{background:#12b76a}.status-text{font-family:Inter;font-size:13px;color:var(--Gray-600, #475467);font-weight:500}.invoice-indicator{width:3px;height:32px;border-radius:2px}.invoice-indicator.indicator-warning{background:#f79009}.invoice-indicator.indicator-primary{background:#009bf3}.invoice-indicator.indicator-success{background:#12b76a}.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}}.invoice-link{color:#00a3ff;cursor:pointer;text-decoration:none}.invoice-link:hover{text-decoration:underline}.locked-action{opacity:.4;cursor:not-allowed}.pending-note{color:#b54708;font-size:11px;font-weight:600}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}.invoice-total-row td{background:#eff8ff;border-top:2px solid #D0D5DD;padding-top:12px;padding-bottom:12px;color:#101828}.invoice-credit-row td,.invoice-net-row td{background:#eff8ff;padding-top:10px;padding-bottom:10px;color:#101828}.invoice-credit-row td.credit-amount{color:#d92d20}.invoice-credit-row .credit-actions{gap:11px}.invoice-credit-row .credit-ref{font-size:12px;color:#667085}.invoice-credit-row .credit-badge{display:inline-block;padding:2px 8px;border-radius:16px;font-size:12px;font-weight:500;color:#b42318;background:#fef3f2;white-space:nowrap}.invoice-net-row td{border-top:1px solid #D0D5DD}.invoice-type-toggle{display:inline-flex;gap:4px;padding:4px;background:#f2f4f7;border-radius:10px}.invoice-type-btn{border:0;background:transparent;color:#475467;font-size:13.5px;font-weight:600;padding:7px 16px;border-radius:7px;cursor:pointer;transition:background .15s,color .15s}.invoice-type-btn:hover{color:#101828}.invoice-type-btn.active{background:#fff;color:#00a3ff;box-shadow:0 1px 2px #10182814}.invoice-card{border:1px solid #E4E7EC;border-radius:12px;padding:18px 22px;background:#fff}.invoice-card-label{display:flex;align-items:center;gap:6px;color:#475467;font-size:13.5px;font-weight:500}.invoice-card-value{font-size:19px;font-weight:700;color:#101828;letter-spacing:-.3px}.invoice-card-value.text-danger{color:#d64545}.invoice-card-value.text-warning{color:#b9740a}.invoice-card-split{display:flex;gap:28px;margin-top:8px;flex-wrap:wrap}.invoice-card-split-item{display:flex;flex-direction:column;gap:2px}.invoice-card-split-label{color:#98a2b3;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.invoice-card-sub{color:#98a2b3;font-size:12.5px;margin-top:4px}\n"] }]
1108
+ args: [{ selector: 'lib-brand-invoices', template: "<div class=\"card\">\n <!-- Back Button \u2014 hidden for client users (no Brands list to go back to). -->\n <div class=\"mt-3 mx-3\" *ngIf=\"!isClient\">\n <button class=\"btn btn-sm btn-link text-muted p-0\" (click)=\"goBack()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" class=\"me-1\">\n <path d=\"M15 8H1M1 8L8 15M1 8L8 1\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Back to Billing\n </button>\n </div>\n\n <!-- Brand Header \u2014 hidden for client users. -->\n <div class=\"brand-header mx-3 mt-3 d-flex align-items-center gap-3\" *ngIf=\"!isClient\">\n <div class=\"symbol symbol-50px symbol-circle\">\n <span class=\"symbol-label bg-primary text-white brand-avatar\">\n {{ clientInfo?.clientName?.charAt(0) || brandName?.charAt(0) }}\n </span>\n </div>\n <div>\n <div class=\"brand-name\">{{ clientInfo?.clientName || brandName }}</div>\n <div class=\"brand-meta text-muted\">\n {{ clientInfo?.totalStores || 0 }} Stores\n <span class=\"mx-1\">&middot;</span>\n Billing {{ clientInfo?.status === 'active' ? 'Active' : 'Inactive' }}\n </div>\n </div>\n </div>\n\n <!-- Sub Tabs -->\n <div class=\"mt-4 mx-3 paymenthistory\">\n <button *ngIf=\"visibleTabs.includes('invoices')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'invoices' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('invoices')\">\n Invoices\n </button>\n <button *ngIf=\"visibleTabs.includes('estimate')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'estimate' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('estimate')\">\n Estimate\n </button>\n <button *ngIf=\"visibleTabs.includes('daily-pricing')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'daily-pricing' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('daily-pricing')\">\n Billing Breakdown\n </button>\n <button *ngIf=\"visibleTabs.includes('plans-subscription')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'plans-subscription' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('plans-subscription')\">\n Plans &amp; Subscription\n </button>\n <button *ngIf=\"visibleTabs.includes('billing-groups')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3 me-2\"\n [ngClass]=\"selectedTab === 'billing-groups' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('billing-groups')\">\n Billing Settings\n </button>\n <button *ngIf=\"visibleTabs.includes('purchase-order')\" class=\"btn btn-color-gray-600 btn-active btn-active-secondary px-6 py-3\"\n [ngClass]=\"selectedTab === 'purchase-order' ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"selectTab('purchase-order')\">\n Purchase Order\n </button>\n </div>\n\n <!-- Plans & Subscription Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'plans-subscription'\">\n <lib-plans-subscription></lib-plans-subscription>\n </div>\n\n <!-- Estimate Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'estimate'\">\n <lib-estimates [clientId]=\"brandId\"></lib-estimates>\n </div>\n\n <!-- Invoices Section -->\n <div class=\"invoices-section mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'invoices'\">\n <!-- Sub-toggle: regular invoices vs advance (TINV-*) invoices. Shown for\n both tango and client views. -->\n <div class=\"invoice-type-toggle mb-3\">\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'all' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('all')\">All Invoices</button>\n <button type=\"button\"\n [ngClass]=\"invoiceType === 'advance' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('advance')\">Advance Invoice</button>\n <!-- Credit notes are tango-only (the credit-note API is too). -->\n <button type=\"button\" *ngIf=\"!isClient\"\n [ngClass]=\"invoiceType === 'creditNote' ? 'invoice-type-btn active' : 'invoice-type-btn'\"\n (click)=\"selectInvoiceType('creditNote')\">Credit Notes</button>\n </div>\n\n <!-- Credit Notes: own list (separate collection) for this brand. -->\n <lib-credit-notes *ngIf=\"invoiceType === 'creditNote'\" [clientId]=\"brandId\"></lib-credit-notes>\n\n <ng-container *ngIf=\"invoiceType !== 'creditNote'\">\n <!-- Header summary cards \u2014 Outstanding / Overdue / Pending Payment,\n each split into Excl. GST / Incl. GST (\u20B9). -->\n <div class=\"row g-3 mb-3\">\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Outstanding</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value\">\u20B9{{ invoiceCards.outstandingInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.outstandingCount }} {{ invoiceCards.outstandingCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Overdue</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-danger\">\u20B9{{ invoiceCards.overdueInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.overdueCount }} {{ invoiceCards.overdueCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card\">\n <div class=\"invoice-card-label\">Pending Payment</div>\n <div class=\"invoice-card-split\">\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Excl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentExclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n <div class=\"invoice-card-split-item\">\n <span class=\"invoice-card-split-label\">Incl. GST</span>\n <span class=\"invoice-card-value text-warning\">\u20B9{{ invoiceCards.pendingPaymentInclAmount | number:'1.2-2':'en-IN' }}</span>\n </div>\n </div>\n <div class=\"invoice-card-sub\">{{ invoiceCards.pendingPaymentCount }} {{ invoiceCards.pendingPaymentCount === 1 ? 'invoice' : 'invoices' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Header Row -->\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M6.66667 10H13.3333M6.66667 6.66667H13.3333M6.66667 13.3333H10M5 17.5H15C15.9205 17.5 16.6667 16.7538 16.6667 15.8333V4.16667C16.6667 3.24619 15.9205 2.5 15 2.5H5C4.07953 2.5 3.33333 3.24619 3.33333 4.16667V15.8333C3.33333 16.7538 4.07953 17.5 5 17.5Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"billingheader\">Invoices</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ totalInvoices }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Total invoiced: <strong>\u20B9{{ totalInvoiced | number:'1.2-2':'en-IN' }}</strong></div>\n </div>\n <div class=\"d-flex align-items-center gap-3\">\n <button type=\"button\" (click)=\"downloadSelected()\"\n class=\"btn btn-outline-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path 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.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\n stroke=\"currentColor\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkDownloading\">Download Selected ({{ selectedInvoices.size }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkDownloading\">Preparing ZIP...</span>\n </button>\n <button type=\"button\" (click)=\"sendEmailSelected()\"\n class=\"btn btn-outline-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0 && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"\n [disabled]=\"bulkEmailing\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M2.5 5.83333L9.07 10.4283C9.635 10.8235 10.365 10.8235 10.93 10.4283L17.5 5.83333M4.16667 15.8333H15.8333C16.7538 15.8333 17.5 15.0871 17.5 14.1667V5.83333C17.5 4.91286 16.7538 4.16667 15.8333 4.16667H4.16667C3.24619 4.16667 2.5 4.91286 2.5 5.83333V14.1667C2.5 15.0871 3.24619 15.8333 4.16667 15.8333Z\"\n stroke=\"currentColor\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkEmailing\">Send Email</span>\n <span class=\"ms-1\" *ngIf=\"bulkEmailing\">Sending...</span>\n </button>\n <button type=\"button\" (click)=\"approveSelected()\"\n class=\"btn btn-success btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && selectedInvoices.size > 0 && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"\n [disabled]=\"bulkApproving || pendingInSelection() === 0\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M16.6667 5L7.50001 14.1667L3.33334 10\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\" *ngIf=\"!bulkApproving\">Approve Selected ({{ pendingInSelection() }})</span>\n <span class=\"ms-1\" *ngIf=\"bulkApproving\">Approving...</span>\n </button>\n <!-- Create Invoice follows Tango Billing EDIT access (not invoice approval). -->\n <button type=\"button\" (click)=\"createInvoice()\"\n class=\"btn btn-primary btn-sm align-items-end text-nowrap invheader me-2\"\n *ngIf=\"!isClient && (gs.userAccess | async)?.TangoAdmin_EditBilling_isEdit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M10 4.16667V15.8333M4.16667 10H15.8333\" stroke=\"white\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"ms-1\">Create Invoice</span>\n </button>\n <button type=\"button\" (click)=\"onExport()\" *ngIf=\"!isClient\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!invoiceList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path 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-1\">Export</span>\n </button>\n </div>\n </div>\n\n <!-- Filter Tabs + Search -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"d-flex align-items-center gap-2\">\n <!-- 'Pending Approval' is internal pipeline \u2014 hidden for client login.\n Clients still see All / Pending Payment / Paid. -->\n <button *ngFor=\"let tab of filterTabs\" class=\"btn btn-sm\"\n [hidden]=\"isClient && tab === 'Pending Approval'\"\n [ngClass]=\"activeFilter === tab ? 'activePlanBtnprimary' : 'inactivePlanBtn'\"\n (click)=\"setFilter(tab)\">\n {{ tab }}\n <span *ngIf=\"tab === 'Pending Approval' && pendingApproval\" class=\"ms-1 small\">{{ pendingApproval }}</span>\n <span *ngIf=\"tab === 'Pending Payment' && pendingPayment\" class=\"ms-1 small\">{{ pendingPayment }}</span>\n </button>\n </div>\n <div class=\"card-toolbar\">\n <div class=\"d-flex\">\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=\"Invoice # or billing group...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"invoiceFilterObject\" (appliedFilters)=\"applyInvoiceFilters($event)\"></lib-filters>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"invoiceLoading\">\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=\"invoiceNoData\">\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 <!-- Invoices Table -->\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\" [(ngModel)]=\"selectAll\" (change)=\"toggleSelectAll()\"\n class=\"form-check-input\" [disabled]=\"invoiceList.length === 0\">\n </th>\n <th class=\"cursor-pointer\" (click)=\"sortData('invoice')\">INVOICE #\n <svg [ngClass]=\"sortColumName === 'invoice' && 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 === 'invoice' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th *ngIf=\"!isClient\">BILLING GROUP</th>\n <th>PERIOD</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('billingDate')\">GENERATED\n <svg [ngClass]=\"sortColumName === 'billingDate' && 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 === 'billingDate' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>QTY</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('amount')\">AMOUNT (excl. GST)\n <svg [ngClass]=\"sortColumName === 'amount' && 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 === 'amount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>GST</th>\n <th class=\"cursor-pointer\" (click)=\"sortData('totalAmount')\">AMOUNT (incl. GST)\n <svg [ngClass]=\"sortColumName === 'totalAmount' && 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 === 'totalAmount' ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th>STATUS</th>\n <th>ACTION</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let inv of invoiceList; let i = index\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" style=\"width: 40px;\">\n <input type=\"checkbox\"\n class=\"form-check-input mt-3\"\n [checked]=\"isSelected(inv)\"\n (change)=\"toggleInvoiceSelect(inv)\">\n </td>\n <td>\n <div class=\"table-title table-title-primary\">\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"invoice-indicator\"\n [ngClass]=\"inv?.status === 'pending' ? 'indicator-warning' :\n inv?.paymentStatus === 'paid' ? 'indicator-success' : 'indicator-primary'\">\n </div>\n <a class=\"invoice-link\" (click)=\"openInvoicePreview(inv); $event.stopPropagation()\">{{ inv?.invoice }}</a>\n </div>\n </div>\n </td>\n <td *ngIf=\"!isClient\">\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.groupName }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ inv?.billingDate | date: 'MMM yyyy' }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ inv?.billingDate | date: 'dd MMM yyyy' }}</div>\n </td>\n <td>\n <div class=\"table-title text-center\"><strong>{{ inv?.stores }}</strong></div>\n </td>\n <td>\n <div class=\"table-title\">{{ invoiceCurrencySymbol(inv) }}{{ inv?.amount | number:'1.2-2':'en-IN' }}</div>\n </td>\n <td>\n <div class=\"table-title\" *ngIf=\"isGstApplicable(inv); else noGst\">{{ invoiceCurrencySymbol(inv) }}{{ gstAmount(inv) | number:'1.2-2':'en-IN' }}</div>\n <ng-template #noGst><div class=\"table-title\">\u2014</div></ng-template>\n </td>\n <td>\n <div class=\"table-title\"><strong>{{ invoiceCurrencySymbol(inv) }}{{ inv?.totalAmount | number:'1.2-2':'en-IN' }}</strong></div>\n </td>\n <td>\n <!-- Clients only see the status once the invoice is APPROVED\n (then it's the payment status: Pending Payment / Partial /\n Paid). Approval-pipeline statuses are hidden from clients. -->\n <ng-container *ngIf=\"!isClient || inv?.status === 'approved'\">\n <div [ngClass]=\"getStatusClass(inv)\" class=\"mt-3 cursor-pointer\" title=\"View activity\"\n (click)=\"openInvoiceLogs(inv); $event.stopPropagation()\">\n {{ getInvoiceStatus(inv) }}\n </div>\n <div *ngIf=\"hasPending(inv)\" class=\"pending-note mt-1\">\n {{ invoiceCurrencySymbol(inv) }}{{ pendingAmount(inv) | number:'1.2-2':'en-IN' }} pending\n </div>\n </ng-container>\n </td>\n <td>\n <div class=\"table-title d-flex justify-content-around\">\n <span *ngIf=\"!isClient\" [class.cursor-pointer]=\"!isEditBlocked(inv)\"\n [class.locked-action]=\"isEditBlocked(inv)\"\n (click)=\"!isEditBlocked(inv) && editInvoice(inv)\"\n [ngbTooltip]=\"editTooltip(inv)\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_edit)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M26.5 14.5L29.5 17.5M14.5 29.5H17.5L28 19C28.3978 18.6022 28.6213 18.0663 28.6213 17.5C28.6213 16.9337 28.3978 16.3978 28 16L28 16C27.6022 15.6022 27.0663 15.3787 26.5 15.3787C25.9337 15.3787 25.3978 15.6022 25 16L14.5 26.5V29.5Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_edit\" x=\"0\" y=\"0\" width=\"44\" height=\"44\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_edit\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_edit\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span class=\"cursor-pointer\" (click)=\"approveInvoice(inv)\" [ngbTooltip]=\"getApproveTooltip(inv)\"\n *ngIf=\"!isClient && canApprove(inv, (gs.userAccess | async))\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_16478_43040)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <g clip-path=\"url(#clip0_16478_43040)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16478_43040\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16478_43040\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16478_43040\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16478_43040\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && inv.status==='approved' && (gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\" ngbTooltip=\"Already Approved\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <g filter=\"url(#filter0_d_16630_8062)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#EAECF0\" />\n <g clip-path=\"url(#clip0_16630_8062)\">\n <path\n d=\"M30.3346 20.2335V21.0002C30.3336 22.7972 29.7517 24.5458 28.6757 25.9851C27.5998 27.4244 26.0874 28.4773 24.3641 28.9868C22.6408 29.4963 20.799 29.4351 19.1134 28.8124C17.4277 28.1896 15.9885 27.0386 15.0104 25.5311C14.0324 24.0236 13.5678 22.2403 13.686 20.4471C13.8043 18.654 14.499 16.9472 15.6665 15.5811C16.8341 14.2151 18.412 13.263 20.1648 12.867C21.9176 12.471 23.7515 12.6522 25.393 13.3835M30.3346 14.3335L22.0013 22.6752L19.5013 20.1752\"\n stroke=\"#D0D5DD\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n </g>\n <defs>\n <filter id=\"filter0_d_16630_8062\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_16630_8062\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_16630_8062\" result=\"shape\" />\n </filter>\n <clipPath id=\"clip0_16630_8062\">\n <rect width=\"20\" height=\"20\" fill=\"white\"\n transform=\"translate(12 11)\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && hasApproverAccess\" class=\"cursor-pointer\" (click)=\"regenerateInvoice(inv)\" ngbTooltip=\"Regenerate Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60395)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M31.1654 14.3333V19.3333M31.1654 19.3333H26.1654M31.1654 19.3333L27.2987 15.7C26.4031 14.8039 25.2951 14.1493 24.078 13.7973C22.861 13.4453 21.5746 13.4073 20.3389 13.6869C19.1033 13.9665 17.9585 14.5545 17.0116 15.3962C16.0646 16.2378 15.3463 17.3056 14.9237 18.5M12.832 27.6666V22.6666M12.832 22.6666H17.832M12.832 22.6666L16.6987 26.3C17.5943 27.1961 18.7023 27.8506 19.9194 28.2027C21.1364 28.5547 22.4228 28.5927 23.6585 28.3131C24.8941 28.0335 26.0389 27.4455 26.9858 26.6038C27.9328 25.7621 28.6511 24.6943 29.0737 23.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60395\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60395\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60395\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <span *ngIf=\"!isClient && (gs.userAccess | async)?.Global_Billing_isEdit\" class=\"cursor-pointer\" (click)=\"paymentstatusChange(inv)\" ngbTooltip=\"Payment Status\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\">\n <rect x=\"2.5\" y=\"2.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" fill=\"white\" />\n <g transform=\"translate(13, 11)\">\n <path d=\"M2.9987 8.00065V6.33398C2.9987 5.0079 3.52548 3.73613 4.46316 2.79845C5.40085 1.86077 6.67262 1.33398 7.9987 1.33398C9.32478 1.33398 10.5966 1.86077 11.5342 2.79845C12.4719 3.73613 12.9987 5.0079 12.9987 6.33398V8.00065M1.33203 13.0007C1.33203 13.4427 1.50763 13.8666 1.82019 14.1792C2.13275 14.4917 2.55667 14.6673 2.9987 14.6673C3.44073 14.6673 3.86465 14.4917 4.17721 14.1792C4.48977 13.8666 4.66536 13.4427 4.66536 13.0007C4.66536 12.5586 4.48977 12.1347 4.17721 11.8221C3.86465 11.5096 3.44073 11.334 2.9987 11.334C2.55667 11.334 2.13275 11.5096 1.82019 11.8221C1.50763 12.1347 1.33203 12.5586 1.33203 13.0007ZM11.332 13.0007C11.332 13.4427 11.5076 13.8666 11.8202 14.1792C12.1327 14.4917 12.5567 14.6673 12.9987 14.6673C13.4407 14.6673 13.8646 14.4917 14.1772 14.1792C14.4898 13.8666 14.6654 13.4427 14.6654 13.0007C14.6654 12.5586 14.4898 12.1347 14.1772 11.8221C13.8646 11.5096 13.4407 11.334 12.9987 11.334C12.5567 11.334 12.1327 11.5096 11.8202 11.8221C11.5076 12.1347 11.332 12.5586 11.332 13.0007Z\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M10.5 5.5L13 8L15.5 5.5\" stroke=\"#667085\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n </svg>\n </span>\n <span (click)=\"downloadInvoice(inv)\" class=\"cursor-pointer\" ngbTooltip=\"Download Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_15530_60396)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path\n d=\"M29.5 23.5V26.8333C29.5 27.2754 29.3244 27.6993 29.0118 28.0118C28.6993 28.3244 28.2754 28.5 27.8333 28.5H16.1667C15.7246 28.5 15.3007 28.3244 14.9882 28.0118C14.6756 27.6993 14.5 27.2754 14.5 26.8333V23.5M17.8333 19.3333L22 23.5M22 23.5L26.1667 19.3333M22 23.5V13.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_15530_60396\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_15530_60396\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_15530_60396\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n <!-- Cancel invoice (approved + unpaid only) \u2014 replaces the disabled\n delete slot for cancellable rows. -->\n <!-- Cancelling is a finance action: only users with Finance Approval access. -->\n <span *ngIf=\"!isClient && canShowCancel(inv, (gs.userAccess | async))\" class=\"cursor-pointer\"\n (click)=\"cancelInvoice(inv)\"\n ngbTooltip=\"Cancel Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_cancel)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M28.5 15.5L15.5 28.5M15.5 15.5L28.5 28.5\" stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_cancel\" x=\"0\" y=\"0\" width=\"44\" height=\"44\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_cancel\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_cancel\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n\n <!-- Delete \u2014 HIDDEN (not disabled) once it no longer applies:\n cancellable rows show Cancel instead; number-minted/locked\n rows show neither. -->\n <span *ngIf=\"!isClient && !canCancelInvoice(inv) && !isDeleteLocked(inv)\" class=\"cursor-pointer\"\n (click)=\"deleteInvoice(inv)\"\n ngbTooltip=\"Delete Invoice\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g filter=\"url(#filter0_d_delete)\">\n <rect x=\"2\" y=\"1\" width=\"40\" height=\"40\" rx=\"8\" fill=\"white\" />\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\n <path d=\"M17 21H27M15.5 17H28.5M19.5 25H24.5M16.1667 28.5H27.8333C28.7538 28.5 29.5 27.7538 29.5 26.8333V15.1667C29.5 14.2462 28.7538 13.5 27.8333 13.5H16.1667C15.2462 13.5 14.5 14.2462 14.5 15.1667V26.8333C14.5 27.7538 15.2462 28.5 16.1667 28.5Z\"\n stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <filter id=\"filter0_d_delete\" x=\"0\" y=\"0\" width=\"44\" height=\"44\"\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n result=\"hardAlpha\" />\n <feOffset dy=\"1\" />\n <feGaussianBlur stdDeviation=\"1\" />\n <feColorMatrix type=\"matrix\"\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\n result=\"effect1_dropShadow_delete\" />\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_delete\" result=\"shape\" />\n </filter>\n </defs>\n </svg>\n </span>\n </div>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"invoice-total-row\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <!-- Leading span covers INVOICE# + PERIOD + GENERATED, plus\n BILLING GROUP for non-client views (that column is hidden\n for clients). Without the isClient adjustment the totals\n shifted one column right on client login. -->\n <td [attr.colspan]=\"isClient ? 3 : 4\"><strong>Total \u00B7 {{ totalInvoices }} invoices</strong></td>\n <td><strong>{{ totalStores | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountExclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totalAmountInclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n <td></td>\n </tr>\n <!-- Each credit note generated in this period (by its own date,\n not the date of the invoice it's against), on the \"All\" view:\n its number (and source invoice), billing group, the source\n invoice's period, its own date, stores covered, and credit /\n GST at the source invoice's rate / incl. GST. Then the net\n total after them, so this month's credit comes off this\n month's invoices. Credit doesn't change any single invoice.\n Tango only, like credit notes. -->\n <ng-container *ngIf=\"!isClient && creditNotes.length > 0\">\n <tr class=\"invoice-credit-row\" *ngFor=\"let cn of creditNotes\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <td>\n <div class=\"table-title\"><strong>{{ cn.creditNote }}</strong></div>\n <div class=\"credit-ref\">Against {{ cn.invoice }}</div>\n </td>\n <td *ngIf=\"!isClient\">\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ cn.groupName }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" class=\"me-1\">\n <path d=\"M3.5 1.16675V2.91675M10.5 1.16675V2.91675M1.16667 5.54175H12.8333M2.33333 2.04175H11.6667C12.3111 2.04175 12.8333 2.56402 12.8333 3.20841V11.6667C12.8333 12.3111 12.3111 12.8334 11.6667 12.8334H2.33333C1.68899 12.8334 1.16667 12.3111 1.16667 11.6667V3.20841C1.16667 2.56402 1.68899 2.04175 2.33333 2.04175Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ cn.period | date: 'MMM yyyy' }}\n </div>\n </td>\n <td>\n <div class=\"table-title\">{{ cn.creditNoteDate | date: 'dd MMM yyyy' }}</div>\n </td>\n <td>\n <div class=\"table-title text-center\"><strong>{{ cn.stores }}</strong></div>\n </td>\n <td class=\"credit-amount\">- {{ invoiceCurrencySymbol(cn) }}{{ cn.amount | number:'1.2-2':'en-IN' }}</td>\n <td class=\"credit-amount\">- {{ invoiceCurrencySymbol(cn) }}{{ cn.gst | number:'1.2-2':'en-IN' }}</td>\n <td class=\"credit-amount\"><strong>- {{ invoiceCurrencySymbol(cn) }}{{ cn.totalAmount | number:'1.2-2':'en-IN' }}</strong></td>\n <td><span class=\"credit-badge\">Credit note</span></td>\n <td>\n <!-- Same Edit / Download icons as the invoice rows. Credit\n notes have no approval, payment or cancel steps. -->\n <div class=\"table-title d-flex credit-actions\">\n <span [class.cursor-pointer]=\"hasApproverAccess\"\n [class.locked-action]=\"!hasApproverAccess\"\n (click)=\"editCreditNote(cn)\"\n [ngbTooltip]=\"hasApproverAccess ? 'Edit Credit Note' : 'Only Finance / Invoice approvers can edit credit notes'\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" fill=\"white\" stroke=\"#D0D5DD\"/>\n <path d=\"M26.5 14.5L29.5 17.5M14.5 29.5H17.5L28 19C28.3978 18.6022 28.6213 18.0663 28.6213 17.5C28.6213 16.9337 28.3978 16.3978 28 16C27.6022 15.6022 27.0663 15.3787 26.5 15.3787C25.9337 15.3787 25.3978 15.6022 25 16L14.5 26.5V29.5Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>\n </svg>\n </span>\n <span class=\"cursor-pointer\" (click)=\"downloadCreditNote(cn)\" ngbTooltip=\"Download Credit Note\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" fill=\"white\" stroke=\"#D0D5DD\"/>\n <path d=\"M29.5 23.5V26.8333C29.5 27.2754 29.3244 27.6993 29.0118 28.0118C28.6993 28.3244 28.2754 28.5 27.8333 28.5H16.1667C15.7246 28.5 15.3007 28.3244 14.9882 28.0118C14.6756 27.6993 14.5 27.2754 14.5 26.8333V23.5M17.8333 19.3333L22 23.5M22 23.5L26.1667 19.3333M22 23.5V13.5\"\n stroke=\"#344054\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n <span *ngIf=\"hasApproverAccess\" class=\"cursor-pointer\" (click)=\"deleteCreditNote(cn)\" ngbTooltip=\"Delete Credit Note\">\n <svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2.5\" y=\"1.5\" width=\"39\" height=\"39\" rx=\"7.5\" fill=\"white\" stroke=\"#D0D5DD\"/>\n <path d=\"M17 21H27M15.5 17H28.5M19.5 25H24.5M16.1667 28.5H27.8333C28.7538 28.5 29.5 27.7538 29.5 26.8333V15.1667C29.5 14.2462 28.7538 13.5 27.8333 13.5H16.1667C15.2462 13.5 14.5 14.2462 14.5 15.1667V26.8333C14.5 27.7538 15.2462 28.5 16.1667 28.5Z\"\n stroke=\"#D92D20\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>\n </svg>\n </span>\n </div>\n </td>\n </tr>\n <tr class=\"invoice-net-row\">\n <td *ngIf=\"(gs.userAccess | async)?.TangoAdmin_invoiceApproval_isEdit\"></td>\n <td [attr.colspan]=\"isClient ? 3 : 4\"><strong>Net total \u00B7 after credit notes</strong></td>\n <td></td>\n <td><strong>\u20B9{{ netAmountExclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ netGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ netAmountInclGst | number:'1.2-2':'en-IN' }}</strong></td>\n <td></td>\n <td></td>\n </tr>\n </ng-container>\n </tfoot>\n </table>\n <div *ngIf=\"!invoiceLoading && !invoiceNoData\">\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 </ng-container>\n </div>\n\n <!-- Daily Pricing Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'daily-pricing'\">\n <lib-daily-pricing [clientId]=\"brandId\"></lib-daily-pricing>\n </div>\n\n <!-- Billing Groups Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'billing-groups'\">\n <lib-billing-groups [clientId]=\"brandId\"></lib-billing-groups>\n </div>\n\n <!-- Purchase Order Section -->\n <div class=\"mx-3 mt-4 mb-4\" *ngIf=\"selectedTab === 'purchase-order'\">\n <lib-purchase-order [clientId]=\"brandId\"></lib-purchase-order>\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}.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}.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}.brand-header{padding:8px 0}.brand-avatar{font-family:Inter;font-size:20px;font-weight:600;width:50px;height:50px;display:flex;align-items:center;justify-content:center;border-radius:50%}.brand-name{font-family:Inter;font-size:20px;font-weight:600;color:var(--Gray-900, #101828);line-height:1.3}.brand-meta{font-family:Inter;font-size:14px;font-weight:400}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.status-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.status-dot.dot-warning{background:#f79009}.status-dot.dot-primary{background:#009bf3}.status-dot.dot-success{background:#12b76a}.status-text{font-family:Inter;font-size:13px;color:var(--Gray-600, #475467);font-weight:500}.invoice-indicator{width:3px;height:32px;border-radius:2px}.invoice-indicator.indicator-warning{background:#f79009}.invoice-indicator.indicator-primary{background:#009bf3}.invoice-indicator.indicator-success{background:#12b76a}.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}}.invoice-link{color:#00a3ff;cursor:pointer;text-decoration:none}.invoice-link:hover{text-decoration:underline}.locked-action{opacity:.4;cursor:not-allowed}.pending-note{color:#b54708;font-size:11px;font-weight:600}.svg-icon.invoicesearch.position-absolute{top:71%;transform:translateY(-50%);margin-top:0!important}.invoice-total-row td{background:#eff8ff;border-top:2px solid #D0D5DD;padding-top:12px;padding-bottom:12px;color:#101828}.invoice-credit-row td,.invoice-net-row td{background:#eff8ff;padding-top:10px;padding-bottom:10px;color:#101828}.invoice-credit-row td.credit-amount{color:#d92d20}.invoice-credit-row .credit-actions{gap:11px}.invoice-credit-row .credit-ref{font-size:12px;color:#667085}.invoice-credit-row .credit-badge{display:inline-block;padding:2px 8px;border-radius:16px;font-size:12px;font-weight:500;color:#b42318;background:#fef3f2;white-space:nowrap}.invoice-net-row td{border-top:1px solid #D0D5DD}.invoice-type-toggle{display:inline-flex;gap:4px;padding:4px;background:#f2f4f7;border-radius:10px}.invoice-type-btn{border:0;background:transparent;color:#475467;font-size:13.5px;font-weight:600;padding:7px 16px;border-radius:7px;cursor:pointer;transition:background .15s,color .15s}.invoice-type-btn:hover{color:#101828}.invoice-type-btn.active{background:#fff;color:#00a3ff;box-shadow:0 1px 2px #10182814}.invoice-card{border:1px solid #E4E7EC;border-radius:12px;padding:18px 22px;background:#fff}.invoice-card-label{display:flex;align-items:center;gap:6px;color:#475467;font-size:13.5px;font-weight:500}.invoice-card-value{font-size:19px;font-weight:700;color:#101828;letter-spacing:-.3px}.invoice-card-value.text-danger{color:#d64545}.invoice-card-value.text-warning{color:#b9740a}.invoice-card-split{display:flex;gap:28px;margin-top:8px;flex-wrap:wrap}.invoice-card-split-item{display:flex;flex-direction:column;gap:2px}.invoice-card-split-label{color:#98a2b3;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.invoice-card-sub{color:#98a2b3;font-size:12.5px;margin-top:4px}\n"] }]
1087
1109
  }], ctorParameters: () => [{ type: i1.BillingService }, { type: i0.ChangeDetectorRef }, { type: i2.ToastService }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.GlobalStateService }, { type: i4.PageInfoService }, { type: i5.NgbModal }] });
1088
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmQtaW52b2ljZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2JyYW5kLWludm9pY2VzL2JyYW5kLWludm9pY2VzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9icmFuZC1pbnZvaWNlcy9icmFuZC1pbnZvaWNlcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLMUMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkVBQTZFLENBQUM7QUFDM0gsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDL0csT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkVBQTZFLENBQUM7QUFDM0gsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDbkcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkVBQTJFLENBQUM7QUFDeEgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUVBQWlFLENBQUM7QUFDekcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDbkcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQU8vRixNQUFNLE9BQU8sc0JBQXNCO0lBa0d2QjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0Q7SUFDQztJQUNBO0lBeEdPLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRTFDLE9BQU8sR0FBVyxFQUFFLENBQUM7SUFDckIsU0FBUyxHQUFXLEVBQUUsQ0FBQztJQUN2QixHQUFHLENBQU07SUFDVCxjQUFjLEdBQVksS0FBSyxDQUFDO0lBQ2hDLDZFQUE2RTtJQUM3RSwyRUFBMkU7SUFDM0UsYUFBYTtJQUNiLFdBQVcsR0FBVyxVQUFVLENBQUM7SUFFakMsY0FBYztJQUNkLFVBQVUsR0FBUSxFQUFFLENBQUM7SUFFckIsVUFBVTtJQUNWLGFBQWEsR0FBVyxDQUFDLENBQUM7SUFDMUIsYUFBYSxHQUFXLENBQUMsQ0FBQztJQUMxQixlQUFlLEdBQVcsQ0FBQyxDQUFDO0lBQzVCLGNBQWMsR0FBVyxDQUFDLENBQUM7SUFDM0IsSUFBSSxHQUFXLENBQUMsQ0FBQztJQUNqQixtRUFBbUU7SUFDbkUsV0FBVyxHQUFXLENBQUMsQ0FBQztJQUN4QixrQkFBa0IsR0FBVyxDQUFDLENBQUM7SUFDL0Isa0JBQWtCLEdBQVcsQ0FBQyxDQUFDO0lBQy9CLDZFQUE2RTtJQUM3RSw0RUFBNEU7SUFDNUUsaUVBQWlFO0lBQ2pFLFdBQVcsR0FBVSxFQUFFLENBQUM7SUFDeEIsV0FBVyxHQUFXLENBQUMsQ0FBQztJQUN4QixjQUFjLEdBQVcsQ0FBQyxDQUFDO0lBQzNCLGtCQUFrQixHQUFXLENBQUMsQ0FBQztJQUUvQixRQUFRO0lBQ1IsV0FBVyxHQUFRLEVBQUUsQ0FBQztJQUN0QixjQUFjLEdBQVksSUFBSSxDQUFDO0lBQy9CLGFBQWEsR0FBWSxLQUFLLENBQUM7SUFDL0IsVUFBVSxHQUFXLENBQUMsQ0FBQztJQUN2QixRQUFRLEdBQVcsRUFBRSxDQUFDO0lBQ3RCLFdBQVcsR0FBVyxDQUFDLENBQUM7SUFDeEIsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixlQUFlLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoRixhQUFhLEdBQVcsYUFBYSxDQUFDO0lBQ3RDLE1BQU0sR0FBVyxDQUFDLENBQUMsQ0FBQztJQUNwQixZQUFZLEdBQVcsS0FBSyxDQUFDO0lBQzdCLFVBQVUsR0FBRyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDakYsc0VBQXNFO0lBQ3RFLHlFQUF5RTtJQUN6RSxXQUFXLEdBQXFDLEtBQUssQ0FBQztJQUN0RCw2RUFBNkU7SUFDN0UsWUFBWSxHQUFHO1FBQ2IscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3ZFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUM7UUFDM0Qsd0JBQXdCLEVBQUUsQ0FBQyxFQUFFLHdCQUF3QixFQUFFLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0tBQ2pGLENBQUM7SUFFRiw2RUFBNkU7SUFDN0Usd0NBQXdDO0lBQ3hDLGNBQWMsR0FBVyxTQUFTLENBQUM7SUFFbkMsbUNBQW1DO0lBQ25DLGdCQUFnQixHQUFnQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzFDLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFDM0IsYUFBYSxHQUFZLEtBQUssQ0FBQztJQUMvQixlQUFlLEdBQVksS0FBSyxDQUFDO0lBQ2pDLFlBQVksR0FBWSxLQUFLLENBQUM7SUFFOUIsaUVBQWlFO0lBQ2pFLGdEQUFnRDtJQUNoRCxVQUFVLEdBQVEsRUFBRSxDQUFDO0lBRXJCLHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFDNUUsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUUxQixXQUFXLEdBQVcsRUFBRSxDQUFDO0lBQ3pCLFVBQVUsR0FBVyxFQUFFLENBQUM7SUFFeEIsbUJBQW1CLEdBQUc7UUFDcEIsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUU7UUFDak8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRTtRQUM5UCxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUU7Z0JBQzlDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtnQkFDdkYsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO2dCQUMvRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBQ3RGLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTthQUM5RixFQUFFO1FBQ0gsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFO2dCQUNuRCxNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLEtBQUssR0FBbUMsRUFBRSxDQUFDO2dCQUNqRCxLQUFLLElBQUksQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3ZELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNoRDtnQkFDRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUMsQ0FBQyxFQUFFLEVBQUU7S0FDUCxDQUFDO0lBRUYsWUFDVSxjQUE4QixFQUM5QixjQUFpQyxFQUNqQyxLQUFtQixFQUNuQixNQUFjLEVBQ2QsS0FBcUIsRUFDdEIsRUFBc0IsRUFDckIsUUFBeUIsRUFDekIsWUFBc0I7UUFQdEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUN0QixPQUFFLEdBQUYsRUFBRSxDQUFvQjtRQUNyQixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixpQkFBWSxHQUFaLFlBQVksQ0FBVTtRQUU5QixJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQzVFLElBQUksSUFBSSxFQUFFLE1BQU0sRUFBRTtnQkFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUMzQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUNyQjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsNEVBQTRFO1FBQzVFLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQzFFLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsS0FBSyxRQUFRLENBQUM7WUFDdEQsMEVBQTBFO1lBQzFFLHlFQUF5RTtZQUN6RSx1RUFBdUU7WUFDdkUsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDbEMsSUFBSTtvQkFDRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7b0JBQ3ZFLElBQUksUUFBUSxFQUFFLFFBQVEsRUFBRTt3QkFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUN6QyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFOzRCQUNsRSxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQzt5QkFDL0I7d0JBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUN0QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7cUJBQ3JCO2lCQUNGO2dCQUFDLE1BQU0sRUFBRSxnQ0FBZ0MsRUFBRTthQUM3QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHFFQUFxRTtJQUNyRSxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRO1lBQ2xCLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQztZQUNwQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFRCxRQUFRO0lBQ1IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7WUFDM0IsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO1lBQ3pFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtZQUN4RSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRTtZQUNsRixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtTQUNsRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDNUcsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxFQUFFLElBQUksRUFBRTtvQkFDYixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7b0JBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO29CQUNsRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQ3JDO1lBQ0gsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFFM0IsSUFBSSxZQUFZLEdBQVEsRUFBRSxDQUFDO1FBQzNCLElBQUksbUJBQW1CLEdBQVEsRUFBRSxDQUFDO1FBRWxDLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxrQkFBa0IsRUFBRTtZQUM1QyxZQUFZLEdBQUcsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztTQUNwRTthQUFNLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxpQkFBaUIsRUFBRTtZQUNsRCxZQUFZLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM1QixtQkFBbUIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2xDO2FBQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLE1BQU0sRUFBRTtZQUN2QyxtQkFBbUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2hDO2FBQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFdBQVcsRUFBRTtZQUM1QyxZQUFZLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM5QjtRQUVELElBQUksT0FBTyxHQUF3QjtZQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDdEIsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3BCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVztZQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDckIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixNQUFNLEVBQUUsWUFBWTtZQUNwQixhQUFhLEVBQUUsbUJBQW1CO1lBQ2xDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztZQUNuQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixNQUFNLEVBQUUsS0FBSztTQUNkLENBQUM7UUFFRixJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3JGLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNWLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO29CQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztvQkFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztvQkFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQztvQkFFaEMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTt3QkFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzt3QkFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7d0JBQ2xELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztxQkFDcEI7b0JBRUQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7b0JBQ2hDLElBQUksT0FBTyxFQUFFO3dCQUNYLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUM7d0JBQ2hELElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUM7d0JBQ2hELElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUM7d0JBQ3BELElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUM7d0JBQ2xELElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7d0JBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7d0JBQzVDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLElBQUksQ0FBQyxDQUFDO3dCQUMxRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixJQUFJLENBQUMsQ0FBQzt3QkFDMUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQzt3QkFDNUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQzt3QkFDbEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLENBQUM7cUJBQzNEO29CQUVELE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO29CQUM1QixJQUFJLEtBQUssRUFBRTt3QkFDVCxJQUFJLENBQUMsWUFBWSxHQUFHOzRCQUNsQixxQkFBcUIsRUFBRSxLQUFLLENBQUMscUJBQXFCLElBQUksQ0FBQzs0QkFDdkQscUJBQXFCLEVBQUUsS0FBSyxDQUFDLHFCQUFxQixJQUFJLENBQUM7NEJBQ3ZELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDOzRCQUM3QyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCLElBQUksQ0FBQzs0QkFDL0MsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixJQUFJLENBQUM7NEJBQy9DLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLENBQUM7NEJBQ3JDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSxDQUFDOzRCQUM3RCx3QkFBd0IsRUFBRSxLQUFLLENBQUMsd0JBQXdCLElBQUksQ0FBQzs0QkFDN0QsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixJQUFJLENBQUM7eUJBQ3BELENBQUM7cUJBQ0g7b0JBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztpQkFDckM7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7b0JBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztvQkFDM0IsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRTt3QkFDcEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7cUJBQzdCO29CQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO29CQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztvQkFDcEIscUVBQXFFO29CQUNyRSxzRUFBc0U7b0JBQ3RFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUNyQztZQUNILENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDWCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztnQkFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDcEIsa0VBQWtFO2dCQUNsRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN0QyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDZFQUE2RTtJQUNyRSxtQkFBbUI7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNsQixxQkFBcUIsRUFBRSxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUM7WUFDdkUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUMzRCx3QkFBd0IsRUFBRSxDQUFDLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUM7U0FDakYsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLDBFQUEwRTtJQUMxRSxpQkFBaUIsQ0FBQyxJQUFzQztRQUN0RCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLElBQUksS0FBSyxZQUFZLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxRQUFRLENBQUMsTUFBYztRQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxZQUFZLENBQUMsVUFBZTtRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQWE7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsMEVBQTBFO1FBQzFFLHlFQUF5RTtRQUN6RSwwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksWUFBWSxHQUFRLEVBQUUsQ0FBQztRQUMzQixJQUFJLG1CQUFtQixHQUFRLEVBQUUsQ0FBQztRQUVsQyxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssa0JBQWtCLEVBQUU7WUFDNUMsWUFBWSxHQUFHLENBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLENBQUM7U0FDcEU7YUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssaUJBQWlCLEVBQUU7WUFDbEQsWUFBWSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUIsbUJBQW1CLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNsQzthQUFNLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxNQUFNLEVBQUU7WUFDdkMsbUJBQW1CLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNoQzthQUFNLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxXQUFXLEVBQUU7WUFDNUMsWUFBWSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDOUI7UUFFRCxJQUFJLE9BQU8sR0FBd0I7WUFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3RCLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNyQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDakMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLE1BQU0sRUFBRSxZQUFZO1lBQ3BCLGFBQWEsRUFBRSxtQkFBbUI7WUFDbEMsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ25DLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLE1BQU0sRUFBRSxJQUFJO1NBQ2IsQ0FBQztRQUVGLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDM0YsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDckQsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFVO1FBQzVCLElBQUksS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUNqQixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7Z0JBQzdCLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUU7b0JBQ3BDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUU7d0JBQ3RCLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO3dCQUM3QixJQUFJLEVBQUUsS0FBSyxpQkFBaUI7NEJBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxrQkFBa0IsQ0FBQzs2QkFDaEUsSUFBSSxFQUFFLEtBQUssZ0JBQWdCOzRCQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsaUJBQWlCLENBQUM7NkJBQ25FLElBQUksRUFBRSxLQUFLLE1BQU07NEJBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7NkJBQzlDLElBQUksRUFBRSxLQUFLLFdBQVc7NEJBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7cUJBQzlEO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO3FCQUMzQjtpQkFDRjtnQkFDRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLEtBQUssVUFBVSxFQUFFO29CQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLFNBQVMsQ0FBQztpQkFDdkQ7Z0JBQ0QsSUFBSSxPQUFPLENBQUMsV0FBVyxLQUFLLE9BQU8sRUFBRTtvQkFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQzdDO2dCQUNELElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxNQUFNLEVBQUU7b0JBQ2xDLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUM1QztZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQVk7UUFDM0IsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLFdBQVc7WUFBRSxPQUFPLFdBQVcsQ0FBQztRQUN2RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssWUFBWTtZQUFFLE9BQU8sYUFBYSxDQUFDO1FBQzFELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxnQkFBZ0I7WUFBRSxPQUFPLGlCQUFpQixDQUFDO1FBQ2xFLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxpQkFBaUI7WUFBRSxPQUFPLGtCQUFrQixDQUFDO1FBQ3BFLHdFQUF3RTtRQUN4RSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUztZQUFFLE9BQU8sa0JBQWtCLENBQUM7UUFDNUQsSUFBSSxPQUFPLENBQUMsYUFBYSxLQUFLLFNBQVM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUMxRCxJQUFJLE9BQU8sQ0FBQyxhQUFhLEtBQUssUUFBUTtZQUFFLE9BQU8saUJBQWlCLENBQUM7UUFDakUsSUFBSSxPQUFPLENBQUMsYUFBYSxLQUFLLE1BQU07WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUNwRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDeEIsQ0FBQztJQUVELGNBQWMsQ0FBQyxPQUFZO1FBQ3pCLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxXQUFXO1lBQUUsT0FBTywyQkFBMkIsQ0FBQztRQUN2RSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssWUFBWTtZQUFFLE9BQU8sMkJBQTJCLENBQUM7UUFDeEUsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLGdCQUFnQjtZQUFFLE9BQU8sd0JBQXdCLENBQUM7UUFDekUsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLGlCQUFpQjtZQUFFLE9BQU8sd0JBQXdCLENBQUM7UUFDMUUsc0VBQXNFO1FBQ3RFLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTO1lBQUUsT0FBTywyQkFBMkIsQ0FBQztRQUNyRSxJQUFJLE9BQU8sQ0FBQyxhQUFhLEtBQUssTUFBTTtZQUFFLE9BQU8sMkJBQTJCLENBQUM7UUFDekUsSUFBSSxPQUFPLENBQUMsYUFBYSxLQUFLLFNBQVM7WUFBRSxPQUFPLDJCQUEyQixDQUFDO1FBQzVFLElBQUksT0FBTyxDQUFDLGFBQWEsS0FBSyxRQUFRO1lBQUUsT0FBTywyQkFBMkIsQ0FBQztRQUMzRSxPQUFPLDBCQUEwQixDQUFDO0lBQ3BDLENBQUM7SUFFRCxnRUFBZ0U7SUFDaEUsaUVBQWlFO0lBQ2pFLHlCQUF5QjtJQUN6QixhQUFhLENBQUMsT0FBWTtRQUN4QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFZO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLE9BQU8sSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLG9EQUFvRDtJQUNwRCxTQUFTLENBQUMsT0FBWTtRQUNwQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFZO1FBQzFCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQztJQUNoRCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLHlEQUF5RDtJQUN6RCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUM5RSxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3JGLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsaUNBQWlDO0lBQ2hCLGVBQWUsR0FBMkI7UUFDekQsR0FBRyxFQUFFLEdBQUc7UUFDUixNQUFNLEVBQUUsR0FBRztRQUNYLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLElBQUksRUFBRSxHQUFHO1FBQ1QsR0FBRyxFQUFFLEtBQUs7S0FDWCxDQUFDO0lBRUYscUJBQXFCLENBQUMsR0FBUTtRQUM1QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDMUQsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSwyRUFBMkU7SUFDM0UsNEJBQTRCO0lBQzVCLGVBQWUsQ0FBQyxHQUFRO1FBQ3RCLE9BQU8sR0FBRyxFQUFFLE1BQU0sS0FBSyxVQUFVLElBQUksR0FBRyxFQUFFLE1BQU0sS0FBSyxXQUFXLENBQUM7SUFDbkUsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSw4RUFBOEU7SUFDOUUsa0RBQWtEO0lBQ2xELGFBQWEsQ0FBQyxHQUFRO1FBQ3BCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMzQyxNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRSxPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUMzQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVE7UUFDbEIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sd0NBQXdDLENBQUM7UUFDL0UsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sbUVBQW1FLENBQUM7UUFDeEcsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSw2RUFBNkU7SUFDN0UsK0JBQStCO0lBQy9CLElBQUksaUJBQWlCO1FBQ25CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDO0lBQ25ILENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsY0FBYyxDQUFDLEVBQU87UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxPQUFPO1FBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNqRixJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7b0JBQzVELFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSTtpQkFDN0MsQ0FBQyxDQUFDO2dCQUNILFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ25ELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNsRSxRQUFRLENBQUMsaUJBQWlCLENBQUMsV0FBVyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUM7Z0JBQ25ELFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7b0JBQ25DLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTt3QkFDeEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO3FCQUNyQjtnQkFDSCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksNEJBQTRCLENBQUM7U0FDbkcsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtCQUFrQixDQUFDLEVBQU87UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdEYsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztnQkFDYixDQUFDLENBQUMsUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLFVBQVUsTUFBTSxDQUFDO2dCQUNwQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNwRCxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLENBQUM7U0FDeEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSw4RUFBOEU7SUFDOUUsNEVBQTRFO0lBQzVFLDhFQUE4RTtJQUM5RSx3RUFBd0U7SUFDeEUsY0FBYyxDQUFDLEdBQVE7UUFDckIsSUFBSSxHQUFHLEVBQUUsTUFBTSxLQUFLLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM3QyxNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUMvQixPQUFPLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsNkJBQTZCO0lBQzdCLGdCQUFnQixDQUFDLEdBQVE7UUFDdkIscUVBQXFFO1FBQ3JFLDBFQUEwRTtRQUMxRSxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU0sS0FBSyxVQUFVLElBQUksR0FBRyxFQUFFLE1BQU0sS0FBSyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsRUFBRSxhQUFhLEtBQUssUUFBUSxDQUFDO0lBQzlHLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUseUVBQXlFO0lBQ3pFLDREQUE0RDtJQUM1RCxpRUFBaUU7SUFDakUsYUFBYSxDQUFDLEdBQVEsRUFBRSxVQUFlO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsaUNBQWlDLENBQUM7SUFDdkYsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSx5REFBeUQ7SUFDekQsMEVBQTBFO0lBQzFFLG9EQUFvRDtJQUNwRCxVQUFVLENBQUMsR0FBUSxFQUFFLFVBQWU7UUFDbEMsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM5QixvRkFBb0Y7UUFDcEYsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTtZQUNwQyxPQUFPLENBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNsRjtRQUNELElBQUksR0FBRyxFQUFFLE1BQU0sS0FBSyxZQUFZO1lBQUUsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLDZCQUE2QixDQUFDO1FBQ3BGLElBQUksR0FBRyxFQUFFLE1BQU0sS0FBSyxnQkFBZ0I7WUFBRSxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsaUNBQWlDLENBQUM7UUFDNUYsSUFBSSxHQUFHLEVBQUUsTUFBTSxLQUFLLGlCQUFpQjtZQUFFLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxpQ0FBaUMsQ0FBQztRQUM3RixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsaUJBQWlCLENBQUMsR0FBUTtRQUN4QixJQUFJLEdBQUcsRUFBRSxNQUFNLEtBQUssWUFBWTtZQUFFLE9BQU8sZ0JBQWdCLENBQUM7UUFDMUQsSUFBSSxHQUFHLEVBQUUsTUFBTSxLQUFLLGdCQUFnQjtZQUFFLE9BQU8sb0JBQW9CLENBQUM7UUFDbEUsSUFBSSxHQUFHLEVBQUUsTUFBTSxLQUFLLGlCQUFpQjtZQUFFLE9BQU8sZUFBZSxDQUFDO1FBQzlELE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDeEQsV0FBVyxHQUEyQjtRQUNyRCxVQUFVLEVBQUUsYUFBYTtRQUN6QixjQUFjLEVBQUUsaUJBQWlCO1FBQ2pDLGVBQWUsRUFBRSxrQkFBa0I7UUFDbkMsUUFBUSxFQUFFLFVBQVU7S0FDckIsQ0FBQztJQUVGLHVFQUF1RTtJQUN2RSw2REFBNkQ7SUFDNUMsU0FBUyxHQUEyQjtRQUNuRCxVQUFVLEVBQUUsZ0JBQWdCO1FBQzVCLGNBQWMsRUFBRSxpQkFBaUI7UUFDakMsZUFBZSxFQUFFLFVBQVU7S0FDNUIsQ0FBQztJQUVGLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDbkUsZ0JBQWdCLENBQUMsUUFBZTtRQUN0QyxNQUFNLEtBQUssR0FBRyxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sTUFBTSxHQUEyQixFQUFFLENBQUM7UUFDMUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3ZCLE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRSxNQUFNLENBQUM7WUFDM0IsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzVDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUs7YUFDVCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDekIsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUNqQixDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSx3RUFBd0U7SUFDeEUsNkVBQTZFO0lBQ3JFLHNCQUFzQixDQUFDLEdBQVE7UUFDckMsSUFBSSxHQUFHLEVBQUUsTUFBTSxLQUFLLFlBQVksRUFBRTtZQUNoQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZEO1FBQ0QsSUFBSSxHQUFHLEVBQUUsTUFBTSxLQUFLLGdCQUFnQixFQUFFO1lBQ3BDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDM0Q7UUFDRixJQUFJLEdBQUcsRUFBRSxNQUFNLEtBQUssaUJBQWlCLEVBQUU7WUFDcEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUNsRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVM7UUFDdEIsdUVBQXVFO1FBQ3ZFLHlFQUF5RTtRQUN6RSxxRUFBcUU7UUFDckUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUU7WUFDcEUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJO1NBQzdDLENBQUMsQ0FBQztRQUNILHdFQUF3RTtRQUN4RSxtQ0FBbUM7UUFDbkMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO2dCQUNwQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxJQUFJO29CQUFFLE9BQU87Z0JBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDNUMsSUFBSSxFQUFFLEdBQUcsRUFBRTt3QkFDVCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO3dCQUNqRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3RCLENBQUM7b0JBQ0QsS0FBSyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7d0JBQ2xCLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLDJCQUEyQixDQUFDO3dCQUMvRCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDaEMsQ0FBQztpQkFDRixDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsSUFBUztRQUN6QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNoRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUk7U0FDN0MsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUNuQyxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7Z0JBQ3BCLElBQUksT0FBTyxHQUFHO29CQUNaLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTztvQkFDdkIsU0FBUyxFQUFFLEtBQUs7b0JBQ2hCLFNBQVMsRUFBRSxJQUFJO2lCQUNoQixDQUFDO2dCQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO29CQUNsRSxJQUFJLEdBQUcsRUFBRTt3QkFDUCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO3dCQUM3RSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7cUJBQ3JCO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUFTO1FBQzNCLGlFQUFpRTtRQUNqRSxxRUFBcUU7UUFDckUsMERBQTBEO1FBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFO1lBQ3BFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSTtTQUM3QyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsaUJBQWlCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUMxQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ25DLElBQUksTUFBTSxFQUFFLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtnQkFDakQsTUFBTSxPQUFPLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQ2xGLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO3dCQUNqQixNQUFNLE1BQU0sR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLGFBQWEsSUFBSSxHQUFHLEVBQUUsYUFBYSxJQUFJLFNBQVMsQ0FBQzt3QkFDM0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsOEJBQThCLE1BQU0sRUFBRSxDQUFDLENBQUM7d0JBQ25FLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDdEIsQ0FBQztvQkFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTt3QkFDbEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLElBQUksMEJBQTBCLENBQUM7d0JBQ25GLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNoQyxDQUFDO2lCQUNGLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxlQUFlLENBQUMsSUFBUztRQUN2QixNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDeEIsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUM5RCxJQUFJLEdBQUcsRUFBRTtnQkFDUCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztnQkFDMUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDN0csTUFBTSxTQUFTLEdBQUcsSUFBSSxFQUFFLHFCQUFxQixJQUFJLElBQUksRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDO2dCQUN6RSxNQUFNLFFBQVEsR0FBRyxHQUFHLElBQUksRUFBRSxPQUFPLElBQUksU0FBUyxJQUFJLEtBQUssSUFBSSxTQUFTLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25ILE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztnQkFDekIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDYixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDakM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsMkVBQTJFO0lBQzNFLGdFQUFnRTtJQUNoRSxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FDMUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUM1RSxDQUFDLE1BQU0sQ0FBQztJQUNYLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN4RjthQUFNO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVELG1CQUFtQixDQUFDLEdBQVE7UUFDMUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN2QzthQUFNO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEM7UUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNwQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQzdDLHVFQUF1RTtRQUN2RSwyREFBMkQ7UUFDM0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUN4RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQzVFLENBQUM7UUFDRixJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7WUFDN0QsT0FBTztTQUNSO1FBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUU7WUFDcEUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJO1NBQzdDLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdFLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO2dCQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDMUIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDZixZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7b0JBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxDQUFDLElBQUksRUFBRTt3QkFDVCxTQUFTLEVBQUUsQ0FBQzt3QkFDWixNQUFNLEVBQUUsQ0FBQzt3QkFDVCxPQUFPO3FCQUNSO29CQUNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzt3QkFDNUMsSUFBSSxFQUFFLEdBQUcsRUFBRTs0QkFDVCxTQUFTLEVBQUUsQ0FBQzs0QkFDWixTQUFTLEVBQUUsQ0FBQzs0QkFDWixJQUFJLFNBQVMsS0FBSyxZQUFZLENBQUMsTUFBTTtnQ0FBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO3dCQUNuRixDQUFDO3dCQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7NEJBQ1YsU0FBUyxFQUFFLENBQUM7NEJBQ1osTUFBTSxFQUFFLENBQUM7NEJBQ1QsSUFBSSxTQUFTLEtBQUssWUFBWSxDQUFDLE1BQU07Z0NBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQzt3QkFDbkYsQ0FBQztxQkFDRixDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRU8saUJBQWlCLENBQUMsU0FBaUIsRUFBRSxNQUFjO1FBQ3pELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxTQUFTLG9DQUFvQyxDQUFDLENBQUM7U0FDOUU7YUFBTSxJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxNQUFNLCtCQUErQixDQUFDLENBQUM7U0FDeEU7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsU0FBUyxjQUFjLE1BQU0sU0FBUyxDQUFDLENBQUM7U0FDckU7UUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTztRQUM3QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixNQUFNLE9BQU8sR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUMzRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3hGLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztnQkFDMUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDO2dCQUM3RSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQztnQkFDckcsTUFBTSxRQUFRLEdBQUcsWUFBWSxLQUFLLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xGLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztnQkFDekIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDYixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxjQUFjLEtBQUssYUFBYSxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEMsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUFFLE9BQU87UUFDN0MsTUFBTSxPQUFPLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM1RixJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQztnQkFDMUIsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFO29CQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO29CQUM5RCxPQUFPO2lCQUNSO2dCQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO29CQUNqRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUk7aUJBQzdDLENBQUMsQ0FBQztnQkFDSCxRQUFRLENBQUMsaUJBQWlCLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztnQkFDN0MsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtvQkFDbkMsSUFBSSxNQUFNLEVBQUUsTUFBTSxLQUFLLE1BQU0sRUFBRTt3QkFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7d0JBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUM7NEJBQ3ZDLFVBQVUsRUFBRSxPQUFPLENBQUMsV0FBVzs0QkFDL0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFROzRCQUN6QixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7eUJBQzFCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzs0QkFDMUMsSUFBSSxFQUFFLENBQUMsT0FBWSxFQUFFLEVBQUU7Z0NBQ3JCLE1BQU0sQ0FBQyxHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO2dDQUNwRSxNQUFNLE9BQU8sR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixJQUFJLENBQUMsQ0FBQztnQ0FDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQ3hCLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsT0FBTyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FDaEcsQ0FBQztnQ0FDRixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQ0FDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO2dDQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQ0FDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs0QkFDdEMsQ0FBQzs0QkFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQ0FDbEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0NBQzFCLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLHlCQUF5QixDQUFDO2dDQUM3RCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs0QkFDdEMsQ0FBQzt5QkFDRixDQUFDLENBQUM7cUJBQ0o7Z0JBQ0gsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDbEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUkseUJBQXlCLENBQUM7Z0JBQzdELElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsR0FBUTtRQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbkYsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLE1BQU0sV0FBVyxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDO2dCQUNyQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtvQkFDL0QsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJO2lCQUM3QyxDQUFDLENBQUM7Z0JBQ0gsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7WUFDdkQsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQztTQUNoRSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVE7UUFDbEIseUVBQXlFO1FBQ3pFLDJFQUEyRTtRQUMzRSw0REFBNEQ7UUFDNUQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLE9BQU87U0FDUjtRQUNELGlDQUFpQztRQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbkYsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLE1BQU0sV0FBVyxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLDBEQUEwRDtnQkFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGFBQWEsQ0FBQyxXQUFnQjtRQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM1RCxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUk7U0FDN0MsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDckQsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7UUFDekMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ25ELFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxlQUFlLElBQUksTUFBTSxLQUFLLFlBQVksRUFBRTtnQkFDakYsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3JCO1FBQ0gsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDNUQsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJO1NBQzdDLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQzNDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNuRCxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ25DLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3JCO1FBQ0gsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxhQUFhLENBQUMsR0FBUTtRQUNwQix3RUFBd0U7UUFDeEUsaUVBQWlFO1FBQ2pFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM1QixPQUFPO1NBQ1I7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRTtZQUNuRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUk7U0FDN0MsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUNuQyxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDbEYsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7d0JBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLDhCQUE4QixDQUFDLENBQUM7d0JBQzNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDdEIsQ0FBQztvQkFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTt3QkFDbEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksMEJBQTBCLENBQUM7d0JBQzlELElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNoQyxDQUFDO2lCQUNGLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsMEVBQTBFO0lBQzFFLGdEQUFnRDtJQUNoRCxhQUFhLENBQUMsR0FBUTtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE9BQU87U0FDUjtRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQzlELFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSTtTQUM3QyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ25DLElBQUksTUFBTSxFQUFFLE1BQU0sRUFBRTtnQkFDbEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDN0csSUFBSSxFQUFFLEdBQUcsRUFBRTt3QkFDVCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO3dCQUM3RCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3RCLENBQUM7b0JBQ0QsS0FBSyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7d0JBQ2xCLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLDBCQUEwQixDQUFDO3dCQUM5RCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDaEMsQ0FBQztpQkFDRixDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLG1FQUFtRTtJQUNuRSxlQUFlLENBQUMsR0FBUTtRQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM1RCxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUk7U0FDN0MsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDM0MsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFXO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBQ3ZCLElBQUksR0FBRyxLQUFLLFVBQVUsRUFBRTtZQUN0QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7d0dBM2pDVSxzQkFBc0I7NEZBQXRCLHNCQUFzQiwwREN0Qm5DLDJwM0RBcXRCTTs7NEZEL3JCTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSwgUGFnZUluZm9TZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IFJlcXVlc3RDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi90YW5nby1tYW5hZ2UtYmlsbGluZy9yZXF1ZXN0LWNvbmZpcm1hdGlvbi9yZXF1ZXN0LWNvbmZpcm1hdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVnZXJhdGVJbnZvaWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvcmVnZXJhdGUtaW52b2ljZS9yZWdlcmF0ZS1pbnZvaWNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYXltZW50U3RhdHVzY2hhbmdlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvcGF5bWVudC1zdGF0dXNjaGFuZ2UvcGF5bWVudC1zdGF0dXNjaGFuZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IEVkaXRJbnZvaWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvZWRpdC1pbnZvaWNlL2VkaXQtaW52b2ljZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvZGVsZXRlLWNvbmZpcm1hdGlvbi9kZWxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDYW5jZWxJbnZvaWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvY2FuY2VsLWludm9pY2UvY2FuY2VsLWludm9pY2UuY29tcG9uZW50JztcbmltcG9ydCB7IEludm9pY2VMb2dzQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvaW52b2ljZS1sb2dzL2ludm9pY2UtbG9ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW52b2ljZVByZXZpZXdDb21wb25lbnQgfSBmcm9tICcuLi9pbnZvaWNlLXByZXZpZXcvaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZW5kSW52b2ljZUVtYWlsQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VuZC1pbnZvaWNlLWVtYWlsL3NlbmQtaW52b2ljZS1lbWFpbC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYnJhbmQtaW52b2ljZXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vYnJhbmQtaW52b2ljZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYnJhbmQtaW52b2ljZXMuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIEJyYW5kSW52b2ljZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGJyYW5kSWQ6IHN0cmluZyA9ICcnO1xuICBicmFuZE5hbWU6IHN0cmluZyA9ICcnO1xuICBsZW46IGFueTtcbiAgc2VhcmNoRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gSW52b2ljZXMgaXMgdGhlIGJyYW5kLWRldGFpbCBsYW5kaW5nIHRhYiAobWF0Y2hlcyB0aGUgcHJvdG90eXBlIHRhYiBvcmRlcjpcbiAgLy8gSW52b2ljZXMg4oaSIEVzdGltYXRlIOKGkiBCaWxsaW5nIEJyZWFrZG93biDihpIgUGxhbnMgJiBTdWJzY3JpcHRpb24g4oaSIEJpbGxpbmdcbiAgLy8gU2V0dGluZ3MpLlxuICBzZWxlY3RlZFRhYjogc3RyaW5nID0gJ2ludm9pY2VzJztcblxuICAvLyBDbGllbnQgaW5mb1xuICBjbGllbnRJbmZvOiBhbnkgPSB7fTtcblxuICAvLyBTdW1tYXJ5XG4gIHRvdGFsSW52b2ljZXM6IG51bWJlciA9IDA7XG4gIHRvdGFsSW52b2ljZWQ6IG51bWJlciA9IDA7XG4gIHBlbmRpbmdBcHByb3ZhbDogbnVtYmVyID0gMDtcbiAgcGVuZGluZ1BheW1lbnQ6IG51bWJlciA9IDA7XG4gIHBhaWQ6IG51bWJlciA9IDA7XG4gIC8vIEZvb3RlciB0b3RhbHMgb3ZlciB0aGUgZnVsbCBmaWx0ZXJlZCBzZXQgKGZyb20gYmFja2VuZCBzdW1tYXJ5KS5cbiAgdG90YWxTdG9yZXM6IG51bWJlciA9IDA7XG4gIHRvdGFsQW1vdW50RXhjbEdzdDogbnVtYmVyID0gMDtcbiAgdG90YWxBbW91bnRJbmNsR3N0OiBudW1iZXIgPSAwO1xuICAvLyBDcmVkaXQgbm90ZXMgcmFpc2VkIGFnYWluc3QgdGhlc2UgaW52b2ljZXMgKHRhbmdvIG9ubHkpLiBUaGV5IGRvbid0IHJlZHVjZVxuICAvLyBhbnkgaW52b2ljZSDigJQgdGhlIGZvb3RlciBsaXN0cyBlYWNoIG9uZSAoY3JlZGl0IGV4Y2wuIEdTVCwgaXRzIEdTVCwgaW5jbC5cbiAgLy8gR1NUKSBhbmQgYSBuZXQgdG90YWwgYWZ0ZXIgdGhlbTsgdGhlIHRvdGFscyBmZWVkIHRoYXQgbmV0IHJvdy5cbiAgY3JlZGl0Tm90ZXM6IGFueVtdID0gW107XG4gIHRvdGFsQ3JlZGl0OiBudW1iZXIgPSAwO1xuICB0b3RhbENyZWRpdEdzdDogbnVtYmVyID0gMDtcbiAgdG90YWxDcmVkaXRJbmNsR3N0OiBudW1iZXIgPSAwO1xuXG4gIC8vIFRhYmxlXG4gIGludm9pY2VMaXN0OiBhbnkgPSBbXTtcbiAgaW52b2ljZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBpbnZvaWNlTm9EYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIHRvdGFsSXRlbXM6IG51bWJlciA9IDA7XG4gIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgY3VycmVudFBhZ2U6IG51bWJlciA9IDE7XG4gIGl0ZW1zUGVyUGFnZTogbnVtYmVyID0gMTA7XG4gIHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwLCA1MCwgMTAwLCAxNTAsIDIwMCwgMjUwLCAzMDAsIDM1MCwgNDAwLCA0NTAsIDUwMF07XG4gIHNvcnRDb2x1bU5hbWU6IHN0cmluZyA9ICdiaWxsaW5nRGF0ZSc7XG4gIHNvcnRCeTogbnVtYmVyID0gLTE7XG4gIGFjdGl2ZUZpbHRlcjogc3RyaW5nID0gJ0FsbCc7XG4gIGZpbHRlclRhYnMgPSBbJ0FsbCcsICdQZW5kaW5nIEFwcHJvdmFsJywgJ1BlbmRpbmcgUGF5bWVudCcsICdQYWlkJywgJ0NhbmNlbGxlZCddO1xuICAvLyBJbnZvaWNlIHR5cGUgc3ViLXRvZ2dsZTogJ2FsbCcgPSByZWd1bGFyIElOVi0qLCAnYWR2YW5jZScgPSBUSU5WLSouXG4gIC8vICdjcmVkaXROb3RlJyBzd2FwcyB0aGUgaW52b2ljZSBsaXN0IGZvciB0aGUgYnJhbmQncyBDcmVkaXQgTm90ZXMgbGlzdC5cbiAgaW52b2ljZVR5cGU6ICdhbGwnIHwgJ2FkdmFuY2UnIHwgJ2NyZWRpdE5vdGUnID0gJ2FsbCc7XG4gIC8vIEhlYWRlciBjYXJkcyAoT3V0c3RhbmRpbmcgLyBPdmVyZHVlIC8gUGVuZGluZyBQYXltZW50KSBzcGxpdCBieSBHU1QsIGluIOKCuS5cbiAgaW52b2ljZUNhcmRzID0ge1xuICAgIG91dHN0YW5kaW5nRXhjbEFtb3VudDogMCwgb3V0c3RhbmRpbmdJbmNsQW1vdW50OiAwLCBvdXRzdGFuZGluZ0NvdW50OiAwLFxuICAgIG92ZXJkdWVFeGNsQW1vdW50OiAwLCBvdmVyZHVlSW5jbEFtb3VudDogMCwgb3ZlcmR1ZUNvdW50OiAwLFxuICAgIHBlbmRpbmdQYXltZW50RXhjbEFtb3VudDogMCwgcGVuZGluZ1BheW1lbnRJbmNsQW1vdW50OiAwLCBwZW5kaW5nUGF5bWVudENvdW50OiAwLFxuICB9O1xuXG4gIC8vIE9wZW5zIG9uIEN1cnJlbnQgTW9udGgsIGxpa2UgdGhlIEFsbCBJbnZvaWNlcyB0YWIgKGFuZCB0aGUgdmFsdWUgYSBjbGVhcmVkXG4gIC8vIER1cmF0aW9uIGZpbHRlciBmYWxscyBiYWNrIHRvIGJlbG93KS5cbiAgZHVyYXRpb25GaWx0ZXI6IHN0cmluZyA9ICdjdXJyZW50JztcblxuICAvLyBNdWx0aS1zZWxlY3QgYXBwcm92YWwgLyBkb3dubG9hZFxuICBzZWxlY3RlZEludm9pY2VzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgc2VsZWN0QWxsOiBib29sZWFuID0gZmFsc2U7XG4gIGJ1bGtBcHByb3Zpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYnVsa0Rvd25sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGJ1bGtFbWFpbGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEZsYXQgdXNlci1hY2Nlc3Mgb2JqZWN0LCBjYWNoZWQgZnJvbSBncy51c2VyQWNjZXNzLiBSZWFkcyBsaWtlXG4gIC8vIHVzZXJBY2Nlc3MuVGFuZ29BZG1pbl9jc21BcHByb3ZhbF9pc0VkaXQgZXRjLlxuICB1c2VyQWNjZXNzOiBhbnkgPSB7fTtcblxuICAvLyBDbGllbnQgdXNlcnMgc2VlIGEgcmVhZC1vbmx5LCByZXN0cmljdGVkIHZpZXc6IG9ubHkgSW52b2ljZXMgKyBQbGFucyAmXG4gIC8vIFN1YnNjcmlwdGlvbiB0YWJzLCBubyBlZGl0L2FjdGlvbiBjb250cm9scywgc2NvcGVkIHRvIHRoZWlyIG93biBjbGllbnRJZC5cbiAgaXNDbGllbnQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBtb250aEZpbHRlcjogc3RyaW5nID0gJyc7XG4gIHllYXJGaWx0ZXI6IHN0cmluZyA9ICcnO1xuXG4gIGludm9pY2VGaWx0ZXJPYmplY3QgPSBbXG4gICAgeyBEZXNjcmlwdGlvbjogJ1N0YXR1cycsIHR5cGU6ICdzaW5nbGUnLCBJc3N1ZXM6IFt7IGlkOiAncGVuZGluZ0FwcHJvdmFsJywgdGV4dDogJ1BlbmRpbmcgQXBwcm92YWwnIH0sIHsgaWQ6ICdwZW5kaW5nUGF5bWVudCcsIHRleHQ6ICdQZW5kaW5nIFBheW1lbnQnIH0sIHsgaWQ6ICdwYWlkJywgdGV4dDogJ1BhaWQnIH0sIHsgaWQ6ICdjYW5jZWxsZWQnLCB0ZXh0OiAnQ2FuY2VsbGVkJyB9XSB9LFxuICAgIHsgRGVzY3JpcHRpb246ICdEdXJhdGlvbicsIHR5cGU6ICdzaW5nbGUnLCBJc3N1ZXM6IFt7IGlkOiAnY3VycmVudCcsIHRleHQ6ICdDdXJyZW50IE1vbnRoJyB9LCB7IGlkOiAncHJldicsIHRleHQ6ICdQcmV2aW91cyBNb250aCcgfSwgeyBpZDogJ2xhc3QzJywgdGV4dDogJ0xhc3QgMyBNb250aHMnIH0sIHsgaWQ6ICdsYXN0NicsIHRleHQ6ICdMYXN0IDYgTW9udGhzJyB9LCB7IGlkOiAnbGFzdDEyJywgdGV4dDogJ0xhc3QgMSBZZWFyJyB9XSB9LFxuICAgIHsgRGVzY3JpcHRpb246ICdNb250aCcsIHR5cGU6ICdzaW5nbGUnLCBJc3N1ZXM6IFtcbiAgICAgIHsgaWQ6ICcxJywgdGV4dDogJ0phbnVhcnknIH0sIHsgaWQ6ICcyJywgdGV4dDogJ0ZlYnJ1YXJ5JyB9LCB7IGlkOiAnMycsIHRleHQ6ICdNYXJjaCcgfSxcbiAgICAgIHsgaWQ6ICc0JywgdGV4dDogJ0FwcmlsJyB9LCB7IGlkOiAnNScsIHRleHQ6ICdNYXknIH0sIHsgaWQ6ICc2JywgdGV4dDogJ0p1bmUnIH0sXG4gICAgICB7IGlkOiAnNycsIHRleHQ6ICdKdWx5JyB9LCB7IGlkOiAnOCcsIHRleHQ6ICdBdWd1c3QnIH0sIHsgaWQ6ICc5JywgdGV4dDogJ1NlcHRlbWJlcicgfSxcbiAgICAgIHsgaWQ6ICcxMCcsIHRleHQ6ICdPY3RvYmVyJyB9LCB7IGlkOiAnMTEnLCB0ZXh0OiAnTm92ZW1iZXInIH0sIHsgaWQ6ICcxMicsIHRleHQ6ICdEZWNlbWJlcicgfVxuICAgIF0gfSxcbiAgICB7IERlc2NyaXB0aW9uOiAnWWVhcicsIHR5cGU6ICdzaW5nbGUnLCBJc3N1ZXM6ICgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgICAgIGNvbnN0IHllYXJzOiB7IGlkOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgIGZvciAobGV0IHkgPSBjdXJyZW50WWVhciArIDE7IHkgPj0gY3VycmVudFllYXIgLSA1OyB5LS0pIHtcbiAgICAgICAgeWVhcnMucHVzaCh7IGlkOiBTdHJpbmcoeSksIHRleHQ6IFN0cmluZyh5KSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB5ZWFycztcbiAgICB9KSgpIH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHVibGljIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwYWdlSW5mbzogUGFnZUluZm9TZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbFxuICApIHtcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xuICAgICAgICB0aGlzLmJyYW5kSWQgPSBkYXRhLmNsaWVudDtcbiAgICAgICAgdGhpcy5sb2FkQ2xpZW50SW5mbygpO1xuICAgICAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIENhY2hlIHRoZSB1c2VyJ3MgZmxhdC1hY2Nlc3Mgb2JqZWN0IHNvIHN5bmNocm9ub3VzIG1ldGhvZHMgKGJ1bGsgZmlsdGVycyxcbiAgICAvLyBwZW5kaW5nSW5TZWxlY3Rpb24pIGNhbiBnYXRlIGJ5IHN0YWdlLXNwZWNpZmljIHBlcm1pc3Npb24gd2l0aG91dCBhc3luYy5cbiAgICB0aGlzLmdzLnVzZXJBY2Nlc3MucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoYWNjZXNzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMudXNlckFjY2VzcyA9IGFjY2VzcyB8fCB7fTtcbiAgICAgIHRoaXMuaXNDbGllbnQgPSAoYWNjZXNzPy51c2VyVHlwZSB8fCAnJykgPT09ICdjbGllbnQnO1xuICAgICAgLy8gQSBjbGllbnQgdXNlciBsYW5kcyBkaXJlY3RseSBvbiB0aGVpciBvd24gYnJhbmQgdmlldyAobm8gQnJhbmRzIGxpc3QgdG9cbiAgICAgIC8vIG5hdmlnYXRlIGZyb20pLCBzbyByZXNvbHZlIHRoZWlyIGNsaWVudElkIGZyb20gdGhlaXIgcHJvZmlsZSBhbmQgc2NvcGVcbiAgICAgIC8vIHRoZSB0YWJzIHRvIEludm9pY2VzICsgUGxhbnMgJiBTdWJzY3JpcHRpb24sIGRlZmF1bHRpbmcgdG8gSW52b2ljZXMuXG4gICAgICBpZiAodGhpcy5pc0NsaWVudCAmJiAhdGhpcy5icmFuZElkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdXNlckluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSB8fCAne30nKTtcbiAgICAgICAgICBpZiAodXNlckluZm8/LmNsaWVudElkKSB7XG4gICAgICAgICAgICB0aGlzLmJyYW5kSWQgPSBTdHJpbmcodXNlckluZm8uY2xpZW50SWQpO1xuICAgICAgICAgICAgaWYgKCFbJ2ludm9pY2VzJywgJ3BsYW5zLXN1YnNjcmlwdGlvbiddLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRUYWIpKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnaW52b2ljZXMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2FkQ2xpZW50SW5mbygpO1xuICAgICAgICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgbWFsZm9ybWVkIHVzZXItaW5mbyAqLyB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBUYWJzIGEgY2xpZW50IHVzZXIgaXMgYWxsb3dlZCB0byBzZWUgKGV2ZXJ5dGhpbmcgZm9yIHRhbmdvIHVzZXJzKS5cbiAgZ2V0IHZpc2libGVUYWJzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5pc0NsaWVudFxuICAgICAgPyBbJ2ludm9pY2VzJywgJ3BsYW5zLXN1YnNjcmlwdGlvbiddXG4gICAgICA6IFsnaW52b2ljZXMnLCAnZXN0aW1hdGUnLCAnZGFpbHktcHJpY2luZycsICdwbGFucy1zdWJzY3JpcHRpb24nLCAnYmlsbGluZy1ncm91cHMnLCAncHVyY2hhc2Utb3JkZXInXTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHNldFBhZ2VEYXRhKCkge1xuICAgIHRoaXMucGFnZUluZm8uc2V0VGl0bGUodGhpcy5icmFuZE5hbWUgfHwgJ0JyYW5kIEludm9pY2VzJyk7XG4gICAgdGhpcy5wYWdlSW5mby5zZXREZXNjcmlwdGlvbignVmlldyBhbmQgbWFuYWdlIGJyYW5kIGludm9pY2VzJyk7XG4gICAgdGhpcy5wYWdlSW5mby5zZXRCcmVhZGNydW1icyhbXG4gICAgICB7IHRpdGxlOiAnTWFuYWdlJywgcGF0aDogJy9tYW5hZ2UnLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiBmYWxzZSB9LFxuICAgICAgeyB0aXRsZTogJ01hbmFnZScsIHBhdGg6ICcvbWFuYWdlJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogdHJ1ZSB9LFxuICAgICAgeyB0aXRsZTogJ0JpbGxpbmcnLCBwYXRoOiAnL21hbmFnZS9iaWxsaW5nJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcbiAgICAgIHsgdGl0bGU6ICdCaWxsaW5nJywgcGF0aDogJy9tYW5hZ2UvYmlsbGluZycsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcbiAgICBdKTtcbiAgfVxuXG4gIGxvYWRDbGllbnRJbmZvKCkge1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0Q2xpZW50QmlsbGluZ0luZm8oeyBjbGllbnRJZDogdGhpcy5icmFuZElkIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXM/LmRhdGEpIHtcbiAgICAgICAgICB0aGlzLmNsaWVudEluZm8gPSByZXMuZGF0YTtcbiAgICAgICAgICB0aGlzLmJyYW5kTmFtZSA9IHRoaXMuY2xpZW50SW5mby5jbGllbnROYW1lIHx8ICcnO1xuICAgICAgICAgIHRoaXMuc2V0UGFnZURhdGEoKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbG9hZEludm9pY2VzKCkge1xuICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmludm9pY2VMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmludm9pY2VOb0RhdGEgPSBmYWxzZTtcblxuICAgIGxldCBzdGF0dXNGaWx0ZXI6IGFueSA9IFtdO1xuICAgIGxldCBwYXltZW50U3RhdHVzRmlsdGVyOiBhbnkgPSBbXTtcblxuICAgIGlmICh0aGlzLmFjdGl2ZUZpbHRlciA9PT0gJ1BlbmRpbmcgQXBwcm92YWwnKSB7XG4gICAgICBzdGF0dXNGaWx0ZXIgPSBbJ3BlbmRpbmdDc20nLCAncGVuZGluZ0ZpbmFuY2UnLCAncGVuZGluZ0FwcHJvdmFsJ107XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZUZpbHRlciA9PT0gJ1BlbmRpbmcgUGF5bWVudCcpIHtcbiAgICAgIHN0YXR1c0ZpbHRlciA9IFsnYXBwcm92ZWQnXTtcbiAgICAgIHBheW1lbnRTdGF0dXNGaWx0ZXIgPSBbJ3VucGFpZCddO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVGaWx0ZXIgPT09ICdQYWlkJykge1xuICAgICAgcGF5bWVudFN0YXR1c0ZpbHRlciA9IFsncGFpZCddO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVGaWx0ZXIgPT09ICdDYW5jZWxsZWQnKSB7XG4gICAgICBzdGF0dXNGaWx0ZXIgPSBbJ2NhbmNlbGxlZCddO1xuICAgIH1cblxuICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgY2xpZW50SWQ6IHRoaXMuYnJhbmRJZCxcbiAgICAgIGxpbWl0OiB0aGlzLnBhZ2VTaXplLFxuICAgICAgb2Zmc2V0OiB0aGlzLmN1cnJlbnRQYWdlLFxuICAgICAgc2VhcmNoVmFsdWU6IHRoaXMubGVuLFxuICAgICAgc29ydENvbHVtTmFtZTogdGhpcy5zb3J0Q29sdW1OYW1lLFxuICAgICAgc29ydEJ5OiB0aGlzLnNvcnRCeSxcbiAgICAgIHN0YXR1czogc3RhdHVzRmlsdGVyLFxuICAgICAgcGF5bWVudFN0YXR1czogcGF5bWVudFN0YXR1c0ZpbHRlcixcbiAgICAgIGR1cmF0aW9uRmlsdGVyOiB0aGlzLmR1cmF0aW9uRmlsdGVyLFxuICAgICAgbW9udGhGaWx0ZXI6IHRoaXMubW9udGhGaWx0ZXIsXG4gICAgICB5ZWFyRmlsdGVyOiB0aGlzLnllYXJGaWx0ZXIsXG4gICAgICBpbnZvaWNlVHlwZTogdGhpcy5pbnZvaWNlVHlwZSxcbiAgICAgIGV4cG9ydDogZmFsc2VcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5icmFuZEludm9pY2VMaXN0KGZpbHRlcnMpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGUpID0+IHtcbiAgICAgICAgaWYgKGU/LmRhdGE/LmNvdW50KSB7XG4gICAgICAgICAgdGhpcy5pbnZvaWNlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaW52b2ljZU5vRGF0YSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaW52b2ljZUxpc3QgPSBlLmRhdGE/LmRhdGE7XG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gZS5kYXRhPy5jb3VudDtcblxuICAgICAgICAgIGlmIChlLmRhdGE/LmNsaWVudEluZm8pIHtcbiAgICAgICAgICAgIHRoaXMuY2xpZW50SW5mbyA9IGUuZGF0YS5jbGllbnRJbmZvO1xuICAgICAgICAgICAgdGhpcy5icmFuZE5hbWUgPSB0aGlzLmNsaWVudEluZm8uY2xpZW50TmFtZSB8fCAnJztcbiAgICAgICAgICAgIHRoaXMuc2V0UGFnZURhdGEoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gZS5kYXRhPy5zdW1tYXJ5O1xuICAgICAgICAgIGlmIChzdW1tYXJ5KSB7XG4gICAgICAgICAgICB0aGlzLnRvdGFsSW52b2ljZXMgPSBzdW1tYXJ5LnRvdGFsSW52b2ljZXMgfHwgMDtcbiAgICAgICAgICAgIHRoaXMudG90YWxJbnZvaWNlZCA9IHN1bW1hcnkudG90YWxJbnZvaWNlZCB8fCAwO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQXBwcm92YWwgPSBzdW1tYXJ5LnBlbmRpbmdBcHByb3ZhbCB8fCAwO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUGF5bWVudCA9IHN1bW1hcnkucGVuZGluZ1BheW1lbnQgfHwgMDtcbiAgICAgICAgICAgIHRoaXMucGFpZCA9IHN1bW1hcnkucGFpZCB8fCAwO1xuICAgICAgICAgICAgdGhpcy50b3RhbFN0b3JlcyA9IHN1bW1hcnkudG90YWxTdG9yZXMgfHwgMDtcbiAgICAgICAgICAgIHRoaXMudG90YWxBbW91bnRFeGNsR3N0ID0gc3VtbWFyeS50b3RhbEFtb3VudEV4Y2xHc3QgfHwgMDtcbiAgICAgICAgICAgIHRoaXMudG90YWxBbW91bnRJbmNsR3N0ID0gc3VtbWFyeS50b3RhbEFtb3VudEluY2xHc3QgfHwgMDtcbiAgICAgICAgICAgIHRoaXMuY3JlZGl0Tm90ZXMgPSBzdW1tYXJ5LmNyZWRpdE5vdGVzIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy50b3RhbENyZWRpdCA9IHN1bW1hcnkudG90YWxDcmVkaXQgfHwgMDtcbiAgICAgICAgICAgIHRoaXMudG90YWxDcmVkaXRHc3QgPSBzdW1tYXJ5LnRvdGFsQ3JlZGl0R3N0IHx8IDA7XG4gICAgICAgICAgICB0aGlzLnRvdGFsQ3JlZGl0SW5jbEdzdCA9IHN1bW1hcnkudG90YWxDcmVkaXRJbmNsR3N0IHx8IDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY2FyZHMgPSBlLmRhdGE/LmNhcmRzO1xuICAgICAgICAgIGlmIChjYXJkcykge1xuICAgICAgICAgICAgdGhpcy5pbnZvaWNlQ2FyZHMgPSB7XG4gICAgICAgICAgICAgIG91dHN0YW5kaW5nRXhjbEFtb3VudDogY2FyZHMub3V0c3RhbmRpbmdFeGNsQW1vdW50IHx8IDAsXG4gICAgICAgICAgICAgIG91dHN0YW5kaW5nSW5jbEFtb3VudDogY2FyZHMub3V0c3RhbmRpbmdJbmNsQW1vdW50IHx8IDAsXG4gICAgICAgICAgICAgIG91dHN0YW5kaW5nQ291bnQ6IGNhcmRzLm91dHN0YW5kaW5nQ291bnQgfHwgMCxcbiAgICAgICAgICAgICAgb3ZlcmR1ZUV4Y2xBbW91bnQ6IGNhcmRzLm92ZXJkdWVFeGNsQW1vdW50IHx8IDAsXG4gICAgICAgICAgICAgIG92ZXJkdWVJbmNsQW1vdW50OiBjYXJkcy5vdmVyZHVlSW5jbEFtb3VudCB8fCAwLFxuICAgICAgICAgICAgICBvdmVyZHVlQ291bnQ6IGNhcmRzLm92ZXJkdWVDb3VudCB8fCAwLFxuICAgICAgICAgICAgICBwZW5kaW5nUGF5bWVudEV4Y2xBbW91bnQ6IGNhcmRzLnBlbmRpbmdQYXltZW50RXhjbEFtb3VudCB8fCAwLFxuICAgICAgICAgICAgICBwZW5kaW5nUGF5bWVudEluY2xBbW91bnQ6IGNhcmRzLnBlbmRpbmdQYXltZW50SW5jbEFtb3VudCB8fCAwLFxuICAgICAgICAgICAgICBwZW5kaW5nUGF5bWVudENvdW50OiBjYXJkcy5wZW5kaW5nUGF5bWVudENvdW50IHx8IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaW52b2ljZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmludm9pY2VOb0RhdGEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIGlmICh0aGlzLmxlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaW52b2ljZUxpc3QgPSBbXTtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAgIC8vIE5vIGludm9pY2VzIGZvciB0aGUgY3VycmVudCBmaWx0ZXIvdG9nZ2xlIOKAlCB6ZXJvIG91dCB0aGUgY2FyZHMgYW5kXG4gICAgICAgICAgLy8gc3VtbWFyeSBjb3VudGVycyBzbyB0aGV5IGRvbid0IHNob3cgc3RhbGUgdmFsdWVzIGZyb20gYSBwcmlvciBsb2FkLlxuICAgICAgICAgIHRoaXMucmVzZXRJbnZvaWNlU3VtbWFyeSgpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgIHRoaXMuaW52b2ljZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnZvaWNlTm9EYXRhID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbnZvaWNlTGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAvLyBBIDIwNCAobm8gZGF0YSkgY2FuIHN1cmZhY2UgaGVyZSB0b28g4oCUIHJlc2V0IHRoZSBjYXJkcy9zdW1tYXJ5LlxuICAgICAgICB0aGlzLnJlc2V0SW52b2ljZVN1bW1hcnkoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBaZXJvIHRoZSBoZWFkZXIgY2FyZHMgKyBzdW1tYXJ5IGNvdW50ZXJzICh1c2VkIHdoZW4gdGhlIGxpc3QgaGFzIG5vIGRhdGEpLlxuICBwcml2YXRlIHJlc2V0SW52b2ljZVN1bW1hcnkoKSB7XG4gICAgdGhpcy5pbnZvaWNlQ2FyZHMgPSB7XG4gICAgICBvdXRzdGFuZGluZ0V4Y2xBbW91bnQ6IDAsIG91dHN0YW5kaW5nSW5jbEFtb3VudDogMCwgb3V0c3RhbmRpbmdDb3VudDogMCxcbiAgICAgIG92ZXJkdWVFeGNsQW1vdW50OiAwLCBvdmVyZHVlSW5jbEFtb3VudDogMCwgb3ZlcmR1ZUNvdW50OiAwLFxuICAgICAgcGVuZGluZ1BheW1lbnRFeGNsQW1vdW50OiAwLCBwZW5kaW5nUGF5bWVudEluY2xBbW91bnQ6IDAsIHBlbmRpbmdQYXltZW50Q291bnQ6IDAsXG4gICAgfTtcbiAgICB0aGlzLnRvdGFsSW52b2ljZXMgPSAwO1xuICAgIHRoaXMudG90YWxJbnZvaWNlZCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nQXBwcm92YWwgPSAwO1xuICAgIHRoaXMucGVuZGluZ1BheW1lbnQgPSAwO1xuICAgIHRoaXMucGFpZCA9IDA7XG4gICAgdGhpcy50b3RhbFN0b3JlcyA9IDA7XG4gICAgdGhpcy50b3RhbEFtb3VudEV4Y2xHc3QgPSAwO1xuICAgIHRoaXMudG90YWxBbW91bnRJbmNsR3N0ID0gMDtcbiAgICB0aGlzLmNyZWRpdE5vdGVzID0gW107XG4gICAgdGhpcy50b3RhbENyZWRpdCA9IDA7XG4gICAgdGhpcy50b3RhbENyZWRpdEdzdCA9IDA7XG4gICAgdGhpcy50b3RhbENyZWRpdEluY2xHc3QgPSAwO1xuICB9XG5cbiAgc2V0RmlsdGVyKGZpbHRlcjogc3RyaW5nKSB7XG4gICAgdGhpcy5hY3RpdmVGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgfVxuXG4gIC8vIEludm9pY2UgdHlwZSBzdWItdG9nZ2xlOiBhbGwgKHJlZ3VsYXIpIHZzIGFkdmFuY2UgKFRJTlYtKikuIFJlbG9hZHMgdGhlIGxpc3QsXG4gIC8vIHN1bW1hcnkgYW5kIGNhcmRzLiBDcmVkaXQgTm90ZXMgaXMgaXRzIG93biBjb21wb25lbnQgdGhhdCBsb2FkcyBpdHNlbGYuXG4gIHNlbGVjdEludm9pY2VUeXBlKHR5cGU6ICdhbGwnIHwgJ2FkdmFuY2UnIHwgJ2NyZWRpdE5vdGUnKSB7XG4gICAgaWYgKHRoaXMuaW52b2ljZVR5cGUgPT09IHR5cGUpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5pbnZvaWNlVHlwZSA9IHR5cGU7XG4gICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmNsZWFyKCk7XG4gICAgdGhpcy5zZWxlY3RBbGwgPSBmYWxzZTtcbiAgICBpZiAodHlwZSA9PT0gJ2NyZWRpdE5vdGUnKSB7IHJldHVybjsgfVxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gIH1cblxuICBzZWFyY2hGaWVsZCgpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICB9XG5cbiAgc29ydERhdGEoY29sdW1uOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNvcnRDb2x1bU5hbWUgPSBjb2x1bW47XG4gICAgdGhpcy5zb3J0QnkgKj0gLTE7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShwYWdlT2Zmc2V0OiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFyc2VJbnQocGFnZU9mZnNldCk7XG4gICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgfVxuXG4gIG9uUGFnZVNpemVDaGFuZ2UocGFnZVNpemU6IGFueSkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMucGFnZVNpemUgPSBwYXJzZUludChwYWdlU2l6ZSk7XG4gICAgLy8gS2VlcCBpdGVtc1BlclBhZ2UgaW4gc3luYyB3aXRoIHRoZSBjaG9zZW4gc2l6ZSDigJQgdGhlIHBhZ2luYXRpb24gY29udHJvbFxuICAgIC8vIGRlcml2ZXMgaXRzIHBhZ2UgY291bnQgZnJvbSBpdGVtc1BlclBhZ2UsIHNvIGEgc3RhbGUgdmFsdWUgKGFsd2F5cyAxMClcbiAgICAvLyBtYWRlIHRoZSBwYWdlIG51bWJlcnMgd3JvbmcgZm9yIGFueSBzaXplIG90aGVyIHRoYW4gMTAuXG4gICAgdGhpcy5pdGVtc1BlclBhZ2UgPSB0aGlzLnBhZ2VTaXplO1xuICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gIH1cblxuICBvbkV4cG9ydCgpIHtcbiAgICBsZXQgc3RhdHVzRmlsdGVyOiBhbnkgPSBbXTtcbiAgICBsZXQgcGF5bWVudFN0YXR1c0ZpbHRlcjogYW55ID0gW107XG5cbiAgICBpZiAodGhpcy5hY3RpdmVGaWx0ZXIgPT09ICdQZW5kaW5nIEFwcHJvdmFsJykge1xuICAgICAgc3RhdHVzRmlsdGVyID0gWydwZW5kaW5nQ3NtJywgJ3BlbmRpbmdGaW5hbmNlJywgJ3BlbmRpbmdBcHByb3ZhbCddO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVGaWx0ZXIgPT09ICdQZW5kaW5nIFBheW1lbnQnKSB7XG4gICAgICBzdGF0dXNGaWx0ZXIgPSBbJ2FwcHJvdmVkJ107XG4gICAgICBwYXltZW50U3RhdHVzRmlsdGVyID0gWyd1bnBhaWQnXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlRmlsdGVyID09PSAnUGFpZCcpIHtcbiAgICAgIHBheW1lbnRTdGF0dXNGaWx0ZXIgPSBbJ3BhaWQnXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlRmlsdGVyID09PSAnQ2FuY2VsbGVkJykge1xuICAgICAgc3RhdHVzRmlsdGVyID0gWydjYW5jZWxsZWQnXTtcbiAgICB9XG5cbiAgICBsZXQgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmJyYW5kSWQsXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5sZW4sXG4gICAgICBzb3J0Q29sdW1OYW1lOiB0aGlzLnNvcnRDb2x1bU5hbWUsXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgICAgc3RhdHVzOiBzdGF0dXNGaWx0ZXIsXG4gICAgICBwYXltZW50U3RhdHVzOiBwYXltZW50U3RhdHVzRmlsdGVyLFxuICAgICAgZHVyYXRpb25GaWx0ZXI6IHRoaXMuZHVyYXRpb25GaWx0ZXIsXG4gICAgICBtb250aEZpbHRlcjogdGhpcy5tb250aEZpbHRlcixcbiAgICAgIHllYXJGaWx0ZXI6IHRoaXMueWVhckZpbHRlcixcbiAgICAgIGludm9pY2VUeXBlOiB0aGlzLmludm9pY2VUeXBlLFxuICAgICAgZXhwb3J0OiB0cnVlXG4gICAgfTtcblxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYnJhbmRJbnZvaWNlTGlzdEV4cG9ydChmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5zYXZlQXNFeGNlbEZpbGUocmVzLCAnYnJhbmQtaW52b2ljZXMnKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGUpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdTb21ldGhpbmcgd2VudCBXcm9uZy4uJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhcHBseUludm9pY2VGaWx0ZXJzKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoZXZlbnQ/Lmxlbmd0aCkge1xuICAgICAgZXZlbnQuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LkRlc2NyaXB0aW9uID09PSAnU3RhdHVzJykge1xuICAgICAgICAgIGlmIChlbGVtZW50Lklzc3Vlcz8uaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gZWxlbWVudC5Jc3N1ZXMuaWQ7XG4gICAgICAgICAgICBpZiAoaWQgPT09ICdwZW5kaW5nQXBwcm92YWwnKSB0aGlzLmFjdGl2ZUZpbHRlciA9ICdQZW5kaW5nIEFwcHJvdmFsJztcbiAgICAgICAgICAgIGVsc2UgaWYgKGlkID09PSAncGVuZGluZ1BheW1lbnQnKSB0aGlzLmFjdGl2ZUZpbHRlciA9ICdQZW5kaW5nIFBheW1lbnQnO1xuICAgICAgICAgICAgZWxzZSBpZiAoaWQgPT09ICdwYWlkJykgdGhpcy5hY3RpdmVGaWx0ZXIgPSAnUGFpZCc7XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA9PT0gJ2NhbmNlbGxlZCcpIHRoaXMuYWN0aXZlRmlsdGVyID0gJ0NhbmNlbGxlZCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRmlsdGVyID0gJ0FsbCc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50LkRlc2NyaXB0aW9uID09PSAnRHVyYXRpb24nKSB7XG4gICAgICAgICAgdGhpcy5kdXJhdGlvbkZpbHRlciA9IGVsZW1lbnQuSXNzdWVzPy5pZCB8fCAnY3VycmVudCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQuRGVzY3JpcHRpb24gPT09ICdNb250aCcpIHtcbiAgICAgICAgICB0aGlzLm1vbnRoRmlsdGVyID0gZWxlbWVudC5Jc3N1ZXM/LmlkIHx8ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50LkRlc2NyaXB0aW9uID09PSAnWWVhcicpIHtcbiAgICAgICAgICB0aGlzLnllYXJGaWx0ZXIgPSBlbGVtZW50Lklzc3Vlcz8uaWQgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICB9XG5cbiAgZ2V0SW52b2ljZVN0YXR1cyhpbnZvaWNlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChpbnZvaWNlLnN0YXR1cyA9PT0gJ2NhbmNlbGxlZCcpIHJldHVybiAnQ2FuY2VsbGVkJztcbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nQ3NtJykgcmV0dXJuICdQZW5kaW5nIENTTSc7XG4gICAgaWYgKGludm9pY2Uuc3RhdHVzID09PSAncGVuZGluZ0ZpbmFuY2UnKSByZXR1cm4gJ1BlbmRpbmcgRmluYW5jZSc7XG4gICAgaWYgKGludm9pY2Uuc3RhdHVzID09PSAncGVuZGluZ0FwcHJvdmFsJykgcmV0dXJuICdQZW5kaW5nIEFwcHJvdmFsJztcbiAgICAvLyBMZWdhY3kgcHJlLXBpcGVsaW5lIHZhbHVlLCBqdXN0IGluIGNhc2UgdW4tbWlncmF0ZWQgcm93cyBzdGlsbCBleGlzdC5cbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nJykgcmV0dXJuICdQZW5kaW5nIEFwcHJvdmFsJztcbiAgICBpZiAoaW52b2ljZS5wYXltZW50U3RhdHVzID09PSAncGFydGlhbCcpIHJldHVybiAnUGFydGlhbCc7XG4gICAgaWYgKGludm9pY2UucGF5bWVudFN0YXR1cyA9PT0gJ3VucGFpZCcpIHJldHVybiAnUGVuZGluZyBQYXltZW50JztcbiAgICBpZiAoaW52b2ljZS5wYXltZW50U3RhdHVzID09PSAncGFpZCcpIHJldHVybiAnUGFpZCc7XG4gICAgcmV0dXJuIGludm9pY2Uuc3RhdHVzO1xuICB9XG5cbiAgZ2V0U3RhdHVzQ2xhc3MoaW52b2ljZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdjYW5jZWxsZWQnKSByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LWRlZmF1bHQnO1xuICAgIGlmIChpbnZvaWNlLnN0YXR1cyA9PT0gJ3BlbmRpbmdDc20nKSByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LXdhcm5pbmcnO1xuICAgIGlmIChpbnZvaWNlLnN0YXR1cyA9PT0gJ3BlbmRpbmdGaW5hbmNlJykgcmV0dXJuICdiYWRnZSBiYWRnZS1saWdodC1pbmZvJztcbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nQXBwcm92YWwnKSByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LWRhcmsnO1xuICAgIC8vIExlZ2FjeSBwcmUtcGlwZWxpbmUgdmFsdWUgZmFsbHMgYmFjayB0byB0aGUgb3JpZ2luYWwgd2FybmluZyBzdHlsZS5cbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nJykgcmV0dXJuICdiYWRnZSBiYWRnZS1saWdodC13YXJuaW5nJztcbiAgICBpZiAoaW52b2ljZS5wYXltZW50U3RhdHVzID09PSAncGFpZCcpIHJldHVybiAnYmFkZ2UgYmFkZ2UtbGlnaHQtc3VjY2Vzcyc7XG4gICAgaWYgKGludm9pY2UucGF5bWVudFN0YXR1cyA9PT0gJ3BhcnRpYWwnKSByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LXdhcm5pbmcnO1xuICAgIGlmIChpbnZvaWNlLnBheW1lbnRTdGF0dXMgPT09ICd1bnBhaWQnKSByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LXByaW1hcnknO1xuICAgIHJldHVybiAnYmFkZ2UgYmFkZ2UtbGlnaHQtZGFuZ2VyJztcbiAgfVxuXG4gIC8vIE91dHN0YW5kaW5nIGJhbGFuY2Ugb24gdGhpcyBpbnZvaWNlLiBVc2VkIHRvIHJlbmRlciBhbiBpbmxpbmVcbiAgLy8gXCLigrkgWCBwZW5kaW5nXCIgbm90ZSB1bmRlciB0aGUgc3RhdHVzIGJhZGdlIHNvIHJldmlld2VycyBzZWUgdGhlXG4gIC8vIHNob3J0ZmFsbCBhdCBhIGdsYW5jZS5cbiAgcGVuZGluZ0Ftb3VudChpbnZvaWNlOiBhbnkpOiBudW1iZXIge1xuICAgIGNvbnN0IHRvdGFsID0gTnVtYmVyKGludm9pY2U/LnRvdGFsQW1vdW50KSB8fCAwO1xuICAgIGNvbnN0IHBhaWQgPSBOdW1iZXIoaW52b2ljZT8ucGFpZEFtb3VudCkgfHwgMDtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCgodG90YWwgLSBwYWlkKSAqIDEwMCkgLyAxMDApO1xuICB9XG5cbiAgaGFzUGVuZGluZyhpbnZvaWNlOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYWlkID0gTnVtYmVyKGludm9pY2U/LnBhaWRBbW91bnQpIHx8IDA7XG4gICAgcmV0dXJuIHBhaWQgPiAwICYmIHRoaXMucGVuZGluZ0Ftb3VudChpbnZvaWNlKSA+IDA7XG4gIH1cblxuICAvLyBHU1QgY29sdW1uIOKAlCBzYW1lIHJ1bGUgYXMgdGhlIEFsbCBJbnZvaWNlcyBwYWdlOiBpbmNsLiDiiJIgZXhjbC4gR1NULCBhbmRcbiAgLy8gb25seSBJTlIgaW52b2ljZXMgY2FycnkgR1NUIChvdGhlcnMgc2hvdyBhIGRhc2gpLlxuICBnc3RBbW91bnQoaW52b2ljZTogYW55KTogbnVtYmVyIHtcbiAgICBjb25zdCB0b3RhbCA9IE51bWJlcihpbnZvaWNlPy50b3RhbEFtb3VudCkgfHwgMDtcbiAgICBjb25zdCBhbW91bnQgPSBOdW1iZXIoaW52b2ljZT8uYW1vdW50KSB8fCAwO1xuICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKCh0b3RhbCAtIGFtb3VudCkgKiAxMDApIC8gMTAwKTtcbiAgfVxuXG4gIGlzR3N0QXBwbGljYWJsZShpbnZvaWNlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGludm9pY2U/LmN1cnJlbmN5IHx8ICdpbnInKSA9PT0gJ2lucic7XG4gIH1cblxuICAvLyBGb290ZXI6IEdTVCBvbiB0aGUgaW52b2ljZXMsIGFuZCB0aGUgbmV0IHRvdGFsIG9uY2UgdGhlIGNyZWRpdCBub3RlcydcbiAgLy8gY3JlZGl0ICh3aXRoIGl0cyBHU1QpIGlzIHRha2VuIG9mZiB0aGUgaW52b2ljZSB0b3RhbHMuXG4gIGdldCB0b3RhbEdzdCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCh0aGlzLnRvdGFsQW1vdW50SW5jbEdzdCAtIHRoaXMudG90YWxBbW91bnRFeGNsR3N0KSAqIDEwMCkgLyAxMDA7XG4gIH1cblxuICBnZXQgbmV0QW1vdW50RXhjbEdzdCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCh0aGlzLnRvdGFsQW1vdW50RXhjbEdzdCAtIHRoaXMudG90YWxDcmVkaXQpICogMTAwKSAvIDEwMDtcbiAgfVxuXG4gIGdldCBuZXRHc3QoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgodGhpcy50b3RhbEdzdCAtIHRoaXMudG90YWxDcmVkaXRHc3QpICogMTAwKSAvIDEwMDtcbiAgfVxuXG4gIGdldCBuZXRBbW91bnRJbmNsR3N0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoKHRoaXMudG90YWxBbW91bnRJbmNsR3N0IC0gdGhpcy50b3RhbENyZWRpdEluY2xHc3QpICogMTAwKSAvIDEwMDtcbiAgfVxuXG4gIC8vIE1pcnJvciB0aGUgYmFja2VuZCBzeW1ib2wgbWFwIHNvIGVhY2ggaW52b2ljZSByb3cgcmVuZGVycyBpbiBpdHMgb3duXG4gIC8vIGN1cnJlbmN5ICh3YXMgaGFyZGNvZGVkIHRvIOKCuSkuXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVuY3lTeW1ib2xzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGlucjogJ+KCuScsXG4gICAgZG9sbGFyOiAnJCcsXG4gICAgc2luZ2Fwb3JlZG9sbGFyOiAnUyQnLFxuICAgIGV1cm86ICfigqwnLFxuICAgIGFlZDogJ0FFRCcsXG4gIH07XG5cbiAgaW52b2ljZUN1cnJlbmN5U3ltYm9sKGludjogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW5jeVN5bWJvbHNbaW52Py5jdXJyZW5jeSB8fCAnJ10gfHwgJyQnO1xuICB9XG5cbiAgLy8gRWRpdCBsb2NrIOKAlCBhIGZpbmFsLWFwcHJvdmVkIGludm9pY2UgbXVzdCBub3QgYmUgZWRpdGVkLiBUaGUgYmFja2VuZFxuICAvLyAodXBkYXRlSW52b2ljZSkgZW5mb3JjZXMgdGhlIHNhbWUgY2hlY2sgc28gdGhlIGxvY2sgY2FuJ3QgYmUgYnlwYXNzZWQgYnlcbiAgLy8gaGl0dGluZyB0aGUgQVBJIGRpcmVjdGx5LlxuICBpc0ludm9pY2VMb2NrZWQoaW52OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW52Py5zdGF0dXMgPT09ICdhcHByb3ZlZCcgfHwgaW52Py5zdGF0dXMgPT09ICdjYW5jZWxsZWQnO1xuICB9XG5cbiAgLy8gT25jZSB0aGUgcmVhbCBJTlYvVElOViBudW1iZXIgaXMgaXNzdWVkIChmaW5hbmNlIGFwcHJvdmFsKSwgb25seSBGaW5hbmNlIC9cbiAgLy8gSW52b2ljZSBhcHByb3ZlcnMg4oCUIG9yIHN1cGVyYWRtaW5zIOKAlCBtYXkgZWRpdC4gVGhlIHNlcnZlciBlbmZvcmNlcyB0aGUgc2FtZVxuICAvLyAodXBkYXRlSW52b2ljZSAvIGFwcGx5RGlzY291bnQgLyBvbmUtdGltZSBmZWUpLlxuICBpc0VkaXRCbG9ja2VkKGludjogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNJbnZvaWNlTG9ja2VkKGludikpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGlzc3VlZCA9ICFTdHJpbmcoaW52Py5pbnZvaWNlIHx8ICcnKS5zdGFydHNXaXRoKCdEUkFGVC0nKTtcbiAgICByZXR1cm4gaXNzdWVkICYmICF0aGlzLmhhc0FwcHJvdmVyQWNjZXNzO1xuICB9XG5cbiAgZWRpdFRvb2x0aXAoaW52OiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzSW52b2ljZUxvY2tlZChpbnYpKSByZXR1cm4gJ0FwcHJvdmVkIGludm9pY2Ug4oCUIGVkaXRpbmcgaXMgZGlzYWJsZWQnO1xuICAgIGlmICh0aGlzLmlzRWRpdEJsb2NrZWQoaW52KSkgcmV0dXJuICdJbnZvaWNlIG51bWJlciBpc3N1ZWQg4oCUIG9ubHkgRmluYW5jZSAvIEludm9pY2UgYXBwcm92ZXJzIGNhbiBlZGl0JztcbiAgICByZXR1cm4gJ0VkaXQgSW52b2ljZSc7XG4gIH1cblxuICAvLyBGaW5hbmNlIEFwcHJvdmFsIE9SIEludm9pY2UgQXBwcm92YWwgKGVkaXQpLCBvciBzdXBlcmFkbWluLiBHYXRlcyBlZGl0aW5nXG4gIC8vIGFuIGlzc3VlZCBpbnZvaWNlLCBSZWdlbmVyYXRlLCBhbmQgY3JlZGl0LW5vdGUgZWRpdHMg4oCUIHRoZSBzZXJ2ZXIgZW5mb3JjZXNcbiAgLy8gdGhlIHNhbWUgb24gdGhvc2UgZW5kcG9pbnRzLlxuICBnZXQgaGFzQXBwcm92ZXJBY2Nlc3MoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYSA9IHRoaXMudXNlckFjY2VzcyB8fCB7fTtcbiAgICByZXR1cm4gYS5yb2xlID09PSAnc3VwZXJhZG1pbicgfHwgISFhLlRhbmdvQWRtaW5fZmluYW5jZUFwcHJvdmFsX2lzRWRpdCB8fCAhIWEuVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0O1xuICB9XG5cbiAgLy8gVGhlIHJvd3Mgb25seSBjYXJyeSBsaXN0IGZpZWxkczsgdGhlIGVkaXQgZm9ybSBuZWVkcyB0aGUgZnVsbCBjcmVkaXQgbm90ZS5cbiAgZWRpdENyZWRpdE5vdGUoY246IGFueSkge1xuICAgIGlmICghdGhpcy5oYXNBcHByb3ZlckFjY2VzcykgcmV0dXJuO1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0Q3JlZGl0Tm90ZShjbi5faWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihFZGl0SW52b2ljZUNvbXBvbmVudCwge1xuICAgICAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAneGwnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UubW9kZSA9ICdlZGl0Q3JlZGl0Tm90ZSc7XG4gICAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNsaWVudElkID0gY24uY2xpZW50SWQgfHwgdGhpcy5icmFuZElkO1xuICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnZvaWNlRGF0YSA9IHJlcz8uZGF0YTtcbiAgICAgICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ3VwZGF0ZWQnKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gbG9hZCBjcmVkaXQgbm90ZScpLFxuICAgIH0pO1xuICB9XG5cbiAgZG93bmxvYWRDcmVkaXROb3RlKGNuOiBhbnkpIHtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmRvd25sb2FkQ3JlZGl0Tm90ZShjbi5faWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGJ1ZjogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vcGRmJyB9KTtcbiAgICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgICBhLmRvd25sb2FkID0gYCR7Y24uY3JlZGl0Tm90ZX0ucGRmYDtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsgYS5jbGljaygpOyBhLnJlbW92ZSgpO1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGRvd25sb2FkIGNyZWRpdCBub3RlJyksXG4gICAgfSk7XG4gIH1cblxuICAvLyBEZWxldGUgbG9jayDigJQgb25jZSBhIHJlYWwgaW52b2ljZSBudW1iZXIgaGFzIGJlZW4gbWludGVkIChhdCBmaW5hbmNlXG4gIC8vIGFwcHJvdmFsKSwgdGhlIGludm9pY2UgY2FuIG5vIGxvbmdlciBiZSBkZWxldGVkOyBkZWxldGluZyBpdCB3b3VsZCByZW9wZW4gYVxuICAvLyBnYXAgaW4gdGhlIGdhcGxlc3MgSU5WL1RJTlYgc2VyaWVzLiBPbmx5IHByZS1maW5hbmNlIGRyYWZ0cyAobnVtYmVyIHN0aWxsXG4gIC8vIHN0YXJ0cyB3aXRoIERSQUZULSkgYXJlIGRlbGV0YWJsZS4gQmFja2VuZCBkZWxldGVJbnZvaWNlIGVuZm9yY2VzIHRoZSBzYW1lLlxuICAvLyBDYW5jZWxsZWQgaW52b2ljZXMgYXJlIGFsc28gbG9ja2VkIOKAlCB0aGV5J3JlIHRlcm1pbmFsLCBub3QgZGVsZXRhYmxlLlxuICBpc0RlbGV0ZUxvY2tlZChpbnY6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ2NhbmNlbGxlZCcpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IG51bSA9IGludj8uaW52b2ljZSB8fCAnJztcbiAgICByZXR1cm4gISh0eXBlb2YgbnVtID09PSAnc3RyaW5nJyAmJiBudW0uc3RhcnRzV2l0aCgnRFJBRlQtJykpO1xuICB9XG5cbiAgLy8gQ2FuY2VsbGFibGUgb25seSB3aGlsZSBhcHByb3ZlZCBhbmQgc3RpbGwgdW5wYWlkIOKAlCBtYXRjaGVzIHRoZSBiYWNrZW5kJ3NcbiAgLy8gb3duIGdhdGUgaW4gY2FuY2VsSW52b2ljZS5cbiAgY2FuQ2FuY2VsSW52b2ljZShpbnY6IGFueSk6IGJvb2xlYW4ge1xuICAgIC8vIENhbmNlbGxhYmxlIG9uY2UgdGhlIGludm9pY2UgbnVtYmVyIGlzIG1pbnRlZCAocGVuZGluZ0FwcHJvdmFsIGFuZFxuICAgIC8vIGFwcHJvdmVkKSB3aGlsZSBzdGlsbCB1bnBhaWQg4oCUIG1pcnJvcnMgdGhlIGJhY2tlbmQgY2FuY2VsSW52b2ljZSBndWFyZC5cbiAgICByZXR1cm4gKGludj8uc3RhdHVzID09PSAnYXBwcm92ZWQnIHx8IGludj8uc3RhdHVzID09PSAncGVuZGluZ0FwcHJvdmFsJykgJiYgaW52Py5wYXltZW50U3RhdHVzID09PSAndW5wYWlkJztcbiAgfVxuXG4gIC8vIENhbmNlbCBpcyBhIEZJTkFOQ0UgYWN0aW9uOiBzaG93biBvbmx5IHRvIHVzZXJzIHdpdGggRmluYW5jZSBBcHByb3ZhbFxuICAvLyBhY2Nlc3MsIG9uIHJvd3MgdGhhdCBhcmUgY2FuY2VsbGFibGUuIHVzZXJBY2Nlc3MgaXMgcGFzc2VkIGluIGZyb20gdGhlXG4gIC8vIHRlbXBsYXRlIChzYW1lIGlkaW9tIGFzIGNhbkFwcHJvdmUpIGJlY2F1c2UgdGhlIHB1Ymxpc2hlZFxuICAvLyB0YW5nby1hcHAtdWktZ2xvYmFsIHR5cGluZ3MgcHJlZGF0ZSB0aGUgZmluYW5jZUFwcHJvdmFsIGZsYWdzLlxuICBjYW5TaG93Q2FuY2VsKGludjogYW55LCB1c2VyQWNjZXNzOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYW5DYW5jZWxJbnZvaWNlKGludikgJiYgISF1c2VyQWNjZXNzPy5UYW5nb0FkbWluX2ZpbmFuY2VBcHByb3ZhbF9pc0VkaXQ7XG4gIH1cblxuICAvLyBUcnVlIHdoZW4gdGhlIGludm9pY2UgaXMgaW4gYSBwcmUtYXBwcm92YWwgc3RhZ2UgQU5EIHRoZSBjdXJyZW50IHVzZXJcbiAgLy8gaGFzIHRoZSBtYXRjaGluZyBUYW5nb0FkbWluIHBlcm1pc3Npb24gZm9yIHRoYXQgc3RhZ2UuXG4gIC8vIHVzZXJBY2Nlc3MgaXMgdGhlIGZsYXQgb2JqZWN0IHNlcnZlZCBieSBHbG9iYWxTdGF0ZVNlcnZpY2UudXNlckFjY2VzcyQsXG4gIC8vIGUuZy4geyBUYW5nb0FkbWluX2NzbUFwcHJvdmFsX2lzRWRpdDogdHJ1ZSwgLi4uIH1cbiAgY2FuQXBwcm92ZShpbnY6IGFueSwgdXNlckFjY2VzczogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCF1c2VyQWNjZXNzKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gU3VwZXJhZG1pbiBieXBhc3M6IGNhbiBhcHByb3ZlIGF0IGFueSBzdGFnZSByZWdhcmRsZXNzIG9mIHBlci1tb2R1bGUgcGVybWlzc2lvbnMuXG4gICAgaWYgKHVzZXJBY2Nlc3Mucm9sZSA9PT0gJ3N1cGVyYWRtaW4nKSB7XG4gICAgICByZXR1cm4gWydwZW5kaW5nQ3NtJywgJ3BlbmRpbmdGaW5hbmNlJywgJ3BlbmRpbmdBcHByb3ZhbCddLmluY2x1ZGVzKGludj8uc3RhdHVzKTtcbiAgICB9XG4gICAgaWYgKGludj8uc3RhdHVzID09PSAncGVuZGluZ0NzbScpIHJldHVybiAhIXVzZXJBY2Nlc3MuVGFuZ29BZG1pbl9jc21BcHByb3ZhbF9pc0VkaXQ7XG4gICAgaWYgKGludj8uc3RhdHVzID09PSAncGVuZGluZ0ZpbmFuY2UnKSByZXR1cm4gISF1c2VyQWNjZXNzLlRhbmdvQWRtaW5fZmluYW5jZUFwcHJvdmFsX2lzRWRpdDtcbiAgICBpZiAoaW52Py5zdGF0dXMgPT09ICdwZW5kaW5nQXBwcm92YWwnKSByZXR1cm4gISF1c2VyQWNjZXNzLlRhbmdvQWRtaW5faW52b2ljZUFwcHJvdmFsX2lzRWRpdDtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBUb29sdGlwIC8gYnV0dG9uIGxhYmVsIGZvciB0aGUgcGVyLXJvdyBhcHByb3ZlIGljb24sIGJ5IGN1cnJlbnQgc3RhZ2UuXG4gIGdldEFwcHJvdmVUb29sdGlwKGludjogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoaW52Py5zdGF0dXMgPT09ICdwZW5kaW5nQ3NtJykgcmV0dXJuICdBcHByb3ZlIGFzIENTTSc7XG4gICAgaWYgKGludj8uc3RhdHVzID09PSAncGVuZGluZ0ZpbmFuY2UnKSByZXR1cm4gJ0FwcHJvdmUgYXMgRmluYW5jZSc7XG4gICAgaWYgKGludj8uc3RhdHVzID09PSAncGVuZGluZ0FwcHJvdmFsJykgcmV0dXJuICdGaW5hbCBBcHByb3ZlJztcbiAgICByZXR1cm4gJ0FwcHJvdmUgSW52b2ljZSc7XG4gIH1cblxuICAvLyBIdW1hbiBsYWJlbCBmb3IgZWFjaCBwaXBlbGluZSBzdGF0dXMg4oCUIHVzZWQgaW4gdGhlIGNvbmZpcm1hdGlvbiBwb3B1cCdzXG4gIC8vIFwiZnJvbSDihpIgdG9cIiBicmVha2Rvd24gc28gdGhlIHVzZXIgc2VlcyBleGFjdGx5IHdoYXQgZWFjaCBhcHByb3ZlIGRvZXMuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2VMYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgcGVuZGluZ0NzbTogJ1BlbmRpbmcgQ1NNJyxcbiAgICBwZW5kaW5nRmluYW5jZTogJ1BlbmRpbmcgRmluYW5jZScsXG4gICAgcGVuZGluZ0FwcHJvdmFsOiAnUGVuZGluZyBBcHByb3ZhbCcsXG4gICAgYXBwcm92ZWQ6ICdBcHByb3ZlZCcsXG4gIH07XG5cbiAgLy8gVGhlIHNpbmdsZSBuZXh0LXN0YWdlIHN0ZXAgZm9yIGVhY2ggcHJlLWFwcHJvdmFsIHN0YXR1cy4gTWlycm9ycyB0aGVcbiAgLy8gYmFja2VuZCB0cmFuc2l0aW9ucyBpbiBhcHByb3ZlSW52b2ljZUNzbS9GaW5hbmNlL0FwcHJvdmFsLlxuICBwcml2YXRlIHJlYWRvbmx5IHN0YWdlTmV4dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBwZW5kaW5nQ3NtOiAncGVuZGluZ0ZpbmFuY2UnLFxuICAgIHBlbmRpbmdGaW5hbmNlOiAncGVuZGluZ0FwcHJvdmFsJyxcbiAgICBwZW5kaW5nQXBwcm92YWw6ICdhcHByb3ZlZCcsXG4gIH07XG5cbiAgLy8gQ29sbGFwc2UgYSBsaXN0IG9mIGludm9pY2VzIGludG8gW3tmcm9tLCB0bywgY291bnR9LCAuLi5dIHNvcnRlZCBieSB0aGVcbiAgLy8gcGlwZWxpbmUgb3JkZXIsIHNvIHRoZSBwb3B1cCBsaXN0cyBDU00gZmlyc3QgdGhlbiBGaW5hbmNlIHRoZW4gQXBwcm92YWwuXG4gIHByaXZhdGUgYnVpbGRUcmFuc2l0aW9ucyhpbnZvaWNlczogYW55W10pOiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZzsgY291bnQ6IG51bWJlciB9W10ge1xuICAgIGNvbnN0IG9yZGVyID0gWydwZW5kaW5nQ3NtJywgJ3BlbmRpbmdGaW5hbmNlJywgJ3BlbmRpbmdBcHByb3ZhbCddO1xuICAgIGNvbnN0IGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGludm9pY2VzLmZvckVhY2goKGludikgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gaW52Py5zdGF0dXM7XG4gICAgICBpZiAodGhpcy5zdGFnZU5leHRbc3RhdHVzXSkge1xuICAgICAgICBjb3VudHNbc3RhdHVzXSA9IChjb3VudHNbc3RhdHVzXSB8fCAwKSArIDE7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9yZGVyXG4gICAgICAuZmlsdGVyKChzKSA9PiBjb3VudHNbc10pXG4gICAgICAubWFwKChzKSA9PiAoe1xuICAgICAgICBmcm9tOiB0aGlzLnN0YWdlTGFiZWxzW3NdLFxuICAgICAgICB0bzogdGhpcy5zdGFnZUxhYmVsc1t0aGlzLnN0YWdlTmV4dFtzXV0sXG4gICAgICAgIGNvdW50OiBjb3VudHNbc10sXG4gICAgICB9KSk7XG4gIH1cblxuICAvLyBDYWxscyB0aGUgZGVkaWNhdGVkIHRyYW5zaXRpb24gZW5kcG9pbnQgZm9yIGVhY2ggcHJlLWFwcHJvdmFsIHN0YWdlLlxuICAvLyBGaW5hbC1zdGFnZSBhcHByb3ZhbCAocGVuZGluZ0FwcHJvdmFsIOKGkiBhcHByb3ZlZCkgbXVzdCBOT1QgZ28gdGhyb3VnaFxuICAvLyBpbnZvaWNlRG93bmxvYWQg4oCUIHRoYXQgZW5kcG9pbnQgaXMgZm9yIFBERiBnZW5lcmF0aW9uIGFuZCBvbmx5IGFkdmFuY2VzXG4gIC8vIHN0YXR1cyBhcyBhIHNpZGUgZWZmZWN0LCB3aGljaCBzaWxlbnRseSBmYWlscyB3aGVuIFBERi9lbWFpbCBzZXR1cCBpc1xuICAvLyBicm9rZW4uIFVzZSBhcHByb3ZlSW52b2ljZUFwcHJvdmFsLCB3aGljaCBhZHZhbmNlcyBzdGF0dXMgdW5jb25kaXRpb25hbGx5LlxuICBwcml2YXRlIGFkdmFuY2VJbnZvaWNlQnlTdGF0dXMoaW52OiBhbnkpIHtcbiAgICBpZiAoaW52Py5zdGF0dXMgPT09ICdwZW5kaW5nQ3NtJykge1xuICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1NlcnZpY2UuYXBwcm92ZUludm9pY2VDc20oaW52Ll9pZCk7XG4gICAgfVxuICAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmdGaW5hbmNlJykge1xuICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1NlcnZpY2UuYXBwcm92ZUludm9pY2VGaW5hbmNlKGludi5faWQpO1xuICAgIH1cbiAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmdBcHByb3ZhbCcpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7IC4uLmludiwgc2VuZEludm9pY2U6IHRydWUsIHN0YXR1czogJ2FwcHJvdmVkJyB9O1xuICAgICAgcmV0dXJuIHRoaXMuYmlsbGluZ1NlcnZpY2UuaW52b2ljZURvd25sb2FkKHBheWxvYWQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFwcHJvdmVJbnZvaWNlKGRhdGE6IGFueSkge1xuICAgIC8vIFRoZSBwZXItcm93IGljb24ncyAqbmdJZiBhbHJlYWR5IGdhdGVzIGJ5IHN0YWdlICsgcGVybWlzc2lvbi4gSWYgdGhlXG4gICAgLy8gaW52b2ljZSdzIHN0YXR1cyBpc24ndCBpbiB0aGUgcHJlLWFwcHJvdmFsIHNldCwgYWR2YW5jZUludm9pY2VCeVN0YXR1c1xuICAgIC8vIHJldHVybnMgbnVsbCBiZWxvdyDigJQgdGhlIGJhY2tlbmQgd291bGQgYWxzbyByZWZ1c2Ugd2l0aCBhIDQwMy80MDkuXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFJlcXVlc3RDb25maXJtYXRpb25Db21wb25lbnQsIHtcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIC8vIFNob3cgdGhlIHNpbmdsZS1yb3cncyBmcm9tIOKGkiB0byB0cmFuc2l0aW9uIHNvIHRoZSBwb3B1cCBpcyBjb25zaXN0ZW50XG4gICAgLy8gd2l0aCB0aGUgYnVsay1hcHByb3ZlIGJyZWFrZG93bi5cbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50cmFuc2l0aW9ucyA9IHRoaXMuYnVpbGRUcmFuc2l0aW9ucyhbZGF0YV0pO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ1llcycpIHtcbiAgICAgICAgY29uc3QgY2FsbCA9IHRoaXMuYWR2YW5jZUludm9pY2VCeVN0YXR1cyhkYXRhKTtcbiAgICAgICAgaWYgKCFjYWxsKSByZXR1cm47XG4gICAgICAgIGNhbGwucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoJ0ludm9pY2UgYWR2YW5jZWQgdG8gdGhlIG5leHQgc3RhZ2UnKTtcbiAgICAgICAgICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gYWR2YW5jZSBpbnZvaWNlJztcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChtc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgcmVnZW5lcmF0ZUludm9pY2UoZGF0YTogYW55KSB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFJlZ2VyYXRlSW52b2ljZUNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnWWVzJykge1xuICAgICAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgICAgICBpbnZvaWNlSWQ6IGRhdGEuaW52b2ljZSxcbiAgICAgICAgICBhbGxDbGllbnQ6IGZhbHNlLFxuICAgICAgICAgIHJlZ2VucmF0ZTogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmludm9pY2VyZWdlcmF0ZShwYXlsb2FkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoJ1RoZSBpbnZvaWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZWdlbmVyYXRlZC4nKTtcbiAgICAgICAgICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHBheW1lbnRzdGF0dXNDaGFuZ2UoZGF0YTogYW55KSB7XG4gICAgLy8gTW9kYWwgbm93IGNvbGxlY3RzIGEgcmVhbCBwYXltZW50IGVudHJ5IChhbW91bnQsIGRhdGUsIG1ldGhvZCxcbiAgICAvLyByZWZlcmVuY2UsIG5vdGVzKSBpbnN0ZWFkIG9mIGEgWWVzL05vIHRvZ2dsZS4gT24gc3VibWl0IHRoZSBzZXJ2ZXJcbiAgICAvLyBhcHBlbmRzIHRvIHBheW1lbnRIaXN0b3J5IGFuZCByZWNvbXB1dGVzIHBheW1lbnRTdGF0dXMuXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFBheW1lbnRTdGF0dXNjaGFuZ2VDb21wb25lbnQsIHtcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmludm9pY2UgPSBkYXRhO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSAncmVjb3JkJyAmJiByZXN1bHQucGF5bG9hZCkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0geyBpbnZvaWNlSWQ6IGRhdGEuaW52b2ljZSwgLi4ucmVzdWx0LnBheWxvYWQgfTtcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5yZWNvcmRQYXltZW50KHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzPy5kYXRhPy5wYXltZW50U3RhdHVzIHx8IHJlcz8ucGF5bWVudFN0YXR1cyB8fCAndXBkYXRlZCc7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdChgUGF5bWVudCByZWNvcmRlZCDigJQgc3RhdHVzOiAke3N0YXR1c31gKTtcbiAgICAgICAgICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8uZXJyb3I/LmVycm9yIHx8ICdGYWlsZWQgdG8gcmVjb3JkIHBheW1lbnQnO1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KG1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBkb3dubG9hZEludm9pY2UoZGF0YTogYW55KSB7XG4gICAgY29uc3QgcmVxID0geyAuLi5kYXRhIH07XG4gICAgcmVxLmNsaWVudElkID0gW2RhdGEuY2xpZW50SWRdO1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuaW52b2ljZURvd25sb2FkKHJlcSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3Jlc10sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3BkZicgfSk7XG4gICAgICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICBjb25zdCBtb250aCA9IGRhdGE/LmJpbGxpbmdEYXRlID8gbmV3IERhdGUoZGF0YS5iaWxsaW5nRGF0ZSkudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ2xvbmcnIH0pIDogJyc7XG4gICAgICAgIGNvbnN0IGJyYW5kTmFtZSA9IGRhdGE/LnJlZ2lzdGVyZWRDb21wYW55TmFtZSB8fCBkYXRhPy5jb21wYW55TmFtZSB8fCAnJztcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBgJHtkYXRhPy5pbnZvaWNlIHx8ICdpbnZvaWNlJ30tJHttb250aH0tJHticmFuZE5hbWV9LnBkZmAucmVwbGFjZSgvW1xcXFwvOio/XCI8PnxcXHJcXG5dL2csICcnKS50cmltKCk7XG4gICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgbGluay5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBNdWx0aS1zZWxlY3QgYXBwcm92YWwgLyBkb3dubG9hZC4gQ2hlY2tib3hlcyBhcmUgdW5jb25kaXRpb25hbDtcbiAgLy8gQXBwcm92ZSBhZHZhbmNlcyBlYWNoIHNlbGVjdGVkIHJvdyBieSBvbmUgcGlwZWxpbmUgc3RhZ2UgYXQgYWN0aW9uIHRpbWUuXG4gIC8vIEEgcm93IHRoZSB1c2VyIGNhbid0IGFwcHJvdmUgYXQgaXRzIGN1cnJlbnQgc3RhZ2UgaXMgc2tpcHBlZC5cbiAgZ2V0UGVuZGluZ0ludm9pY2VzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5pbnZvaWNlTGlzdC5maWx0ZXIoKGludjogYW55KSA9PiB0aGlzLmNhbkFwcHJvdmUoaW52LCB0aGlzLnVzZXJBY2Nlc3MpKTtcbiAgfVxuXG4gIGdldFNlbGVjdGFibGVJbnZvaWNlcygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW52b2ljZUxpc3Q7XG4gIH1cblxuICBwZW5kaW5nSW5TZWxlY3Rpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pbnZvaWNlTGlzdC5maWx0ZXIoKGludjogYW55KSA9PlxuICAgICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmhhcyhpbnYuX2lkKSAmJiB0aGlzLmNhbkFwcHJvdmUoaW52LCB0aGlzLnVzZXJBY2Nlc3MpXG4gICAgKS5sZW5ndGg7XG4gIH1cblxuICB0b2dnbGVTZWxlY3RBbGwoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0QWxsKSB7XG4gICAgICB0aGlzLmdldFNlbGVjdGFibGVJbnZvaWNlcygpLmZvckVhY2goKGludjogYW55KSA9PiB0aGlzLnNlbGVjdGVkSW52b2ljZXMuYWRkKGludi5faWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlSW52b2ljZVNlbGVjdChpbnY6IGFueSkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSW52b2ljZXMuaGFzKGludi5faWQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSW52b2ljZXMuZGVsZXRlKGludi5faWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSW52b2ljZXMuYWRkKGludi5faWQpO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RhYmxlID0gdGhpcy5nZXRTZWxlY3RhYmxlSW52b2ljZXMoKTtcbiAgICB0aGlzLnNlbGVjdEFsbCA9IHNlbGVjdGFibGUubGVuZ3RoID4gMCAmJlxuICAgICAgc2VsZWN0YWJsZS5ldmVyeSgoaTogYW55KSA9PiB0aGlzLnNlbGVjdGVkSW52b2ljZXMuaGFzKGkuX2lkKSk7XG4gIH1cblxuICBpc1NlbGVjdGVkKGludjogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5oYXMoaW52Ll9pZCk7XG4gIH1cblxuICBhcHByb3ZlU2VsZWN0ZWQoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5zaXplID09PSAwKSByZXR1cm47XG4gICAgLy8gQ29tcHV0ZSB0aGUgYXBwcm92YWJsZSBzdWJzZXQgdXAtZnJvbnQgc28gdGhlIGNvbmZpcm1hdGlvbiBwb3B1cCBjYW5cbiAgICAvLyBzaG93IHRoZSBmcm9tIOKGkiB0byBicmVha2Rvd24gYmVmb3JlIHRoZSB1c2VyIGNsaWNrcyBZZXMuXG4gICAgY29uc3Qgc2VsZWN0ZWRMaXN0ID0gdGhpcy5pbnZvaWNlTGlzdC5maWx0ZXIoKGludjogYW55KSA9PlxuICAgICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmhhcyhpbnYuX2lkKSAmJiB0aGlzLmNhbkFwcHJvdmUoaW52LCB0aGlzLnVzZXJBY2Nlc3MpXG4gICAgKTtcbiAgICBpZiAoc2VsZWN0ZWRMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdObyBwZW5kaW5nIGludm9pY2VzIGluIHNlbGVjdGlvbicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oUmVxdWVzdENvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudHJhbnNpdGlvbnMgPSB0aGlzLmJ1aWxkVHJhbnNpdGlvbnMoc2VsZWN0ZWRMaXN0KTtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdZZXMnKSB7XG4gICAgICAgIHRoaXMuYnVsa0FwcHJvdmluZyA9IHRydWU7XG4gICAgICAgIGxldCBjb21wbGV0ZWQgPSAwO1xuICAgICAgICBsZXQgc3VjY2VlZGVkID0gMDtcbiAgICAgICAgbGV0IGZhaWxlZCA9IDA7XG4gICAgICAgIHNlbGVjdGVkTGlzdC5mb3JFYWNoKChpbnY6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbGwgPSB0aGlzLmFkdmFuY2VJbnZvaWNlQnlTdGF0dXMoaW52KTtcbiAgICAgICAgICBpZiAoIWNhbGwpIHtcbiAgICAgICAgICAgIGNvbXBsZXRlZCsrO1xuICAgICAgICAgICAgZmFpbGVkKys7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhbGwucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbXBsZXRlZCsrO1xuICAgICAgICAgICAgICBzdWNjZWVkZWQrKztcbiAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlZCA9PT0gc2VsZWN0ZWRMaXN0Lmxlbmd0aCkgdGhpcy5maW5pc2hCdWxrQXBwcm92ZShzdWNjZWVkZWQsIGZhaWxlZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgICAgY29tcGxldGVkKys7XG4gICAgICAgICAgICAgIGZhaWxlZCsrO1xuICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID09PSBzZWxlY3RlZExpc3QubGVuZ3RoKSB0aGlzLmZpbmlzaEJ1bGtBcHByb3ZlKHN1Y2NlZWRlZCwgZmFpbGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5pc2hCdWxrQXBwcm92ZShzdWNjZWVkZWQ6IG51bWJlciwgZmFpbGVkOiBudW1iZXIpIHtcbiAgICB0aGlzLmJ1bGtBcHByb3ZpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkSW52b2ljZXMuY2xlYXIoKTtcbiAgICB0aGlzLnNlbGVjdEFsbCA9IGZhbHNlO1xuICAgIGlmIChmYWlsZWQgPT09IDApIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGAke3N1Y2NlZWRlZH0gaW52b2ljZShzKSBhZHZhbmNlZCB0byBuZXh0IHN0YWdlYCk7XG4gICAgfSBlbHNlIGlmIChzdWNjZWVkZWQgPT09IDApIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChgQWxsICR7ZmFpbGVkfSBpbnZvaWNlKHMpIGZhaWxlZCB0byBhZHZhbmNlYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChgJHtzdWNjZWVkZWR9IGFkdmFuY2VkLCAke2ZhaWxlZH0gZmFpbGVkYCk7XG4gICAgfVxuICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gIH1cblxuICBkb3dubG9hZFNlbGVjdGVkKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSW52b2ljZXMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuYnVsa0Rvd25sb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBwYXlsb2FkID0geyBpbnZvaWNlSWRzOiBbLi4udGhpcy5zZWxlY3RlZEludm9pY2VzXSB9O1xuICAgIGNvbnN0IGNvdW50ID0gcGF5bG9hZC5pbnZvaWNlSWRzLmxlbmd0aDtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmJ1bGtJbnZvaWNlRG93bmxvYWQocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtyZXNdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi96aXAnIH0pO1xuICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgY29uc3QgcmF3QnJhbmQgPSB0aGlzLmNsaWVudEluZm8/LmNsaWVudE5hbWUgfHwgdGhpcy5icmFuZE5hbWUgfHwgJ2ludm9pY2VzJztcbiAgICAgICAgY29uc3QgYnJhbmQgPSByYXdCcmFuZC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJykgfHwgJ2ludm9pY2VzJztcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBgaW52b2ljZXMtJHticmFuZH0tJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApfS56aXBgO1xuICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBsaW5rLmhyZWYgPSB1cmw7XG4gICAgICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgbGluay5jbGljaygpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgICB0aGlzLmJ1bGtEb3dubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkSW52b2ljZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RBbGwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoYERvd25sb2FkZWQgJHtjb3VudH0gaW52b2ljZShzKWApO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmJ1bGtEb3dubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBkb3dubG9hZCBpbnZvaWNlcycpO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNlbmRFbWFpbFNlbGVjdGVkKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSW52b2ljZXMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IGludm9pY2VJZHM6IFsuLi50aGlzLnNlbGVjdGVkSW52b2ljZXNdIH07XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5idWxrSW52b2ljZUVtYWlsUHJldmlldyhwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2aWV3ID0gcmVzPy5kYXRhO1xuICAgICAgICBpZiAoIXByZXZpZXcgfHwgIXByZXZpZXcuYXBwcm92ZWRJZHM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm8gYXBwcm92ZWQgaW52b2ljZXMgaW4gc2VsZWN0aW9uJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihTZW5kSW52b2ljZUVtYWlsQ29tcG9uZW50LCB7XG4gICAgICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5wcmV2aWV3ID0gcHJldmlldztcbiAgICAgICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSAnc2VuZCcpIHtcbiAgICAgICAgICAgIHRoaXMuYnVsa0VtYWlsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYnVsa0ludm9pY2VFbWFpbFNlbmQoe1xuICAgICAgICAgICAgICBpbnZvaWNlSWRzOiBwcmV2aWV3LmFwcHJvdmVkSWRzLFxuICAgICAgICAgICAgICB0b0VtYWlsczogcmVzdWx0LnRvRW1haWxzLFxuICAgICAgICAgICAgICBjY0VtYWlsczogcmVzdWx0LmNjRW1haWxzLFxuICAgICAgICAgICAgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgIG5leHQ6IChzZW5kUmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gc2VuZFJlcz8uZGF0YT8uZW1haWxlZENvdW50ID8/IHByZXZpZXcuYXBwcm92ZWRJZHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNraXBwZWQgPSBzZW5kUmVzPy5kYXRhPy5za2lwcGVkQnVpbGRDb3VudCA/PyAwO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KFxuICAgICAgICAgICAgICAgICAgc2tpcHBlZCA+IDAgPyBgRW1haWxlZCAke259IGludm9pY2UocyksICR7c2tpcHBlZH0gZmFpbGVkIHRvIGJ1aWxkYCA6IGBFbWFpbGVkICR7bn0gaW52b2ljZShzKWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1bGtFbWFpbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5jbGVhcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1bGtFbWFpbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBzZW5kIGludm9pY2VzJztcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QobXNnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHByZXBhcmUgZW1haWwnO1xuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QobXNnKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBvcGVuSW52b2ljZVByZXZpZXcoaW52OiBhbnkpIHtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldEludm9pY2VCeUlkKGludi5faWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGludm9pY2VEYXRhID0gcmVzPy5kYXRhIHx8IGludjtcbiAgICAgICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEludm9pY2VQcmV2aWV3Q29tcG9uZW50LCB7XG4gICAgICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnZvaWNlRGF0YSA9IGludm9pY2VEYXRhO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBsb2FkIGludm9pY2UnKVxuICAgIH0pO1xuICB9XG5cbiAgZWRpdEludm9pY2UoaW52OiBhbnkpIHtcbiAgICAvLyBMb2NrZWQgb25jZSBmaW5hbC1hcHByb3ZlZCwgb3Igb25jZSB0aGUgbnVtYmVyIGlzIGlzc3VlZCBmb3IgdXNlcnMgd2hvXG4gICAgLy8gYXJlbid0IEZpbmFuY2UgLyBJbnZvaWNlIGFwcHJvdmVyczsgdGhlIGljb24gaXMgZGlzYWJsZWQgaW4gdGhlIHRlbXBsYXRlXG4gICAgLy8gYnV0IGd1YXJkIGhlcmUgdG9vIGluIGNhc2UgaXQncyBjYWxsZWQgZnJvbSBhbm90aGVyIHBhdGguXG4gICAgaWYgKHRoaXMuaXNFZGl0QmxvY2tlZChpbnYpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZldGNoIGZ1bGwgaW52b2ljZSBkYXRhIGJ5IF9pZFxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0SW52b2ljZUJ5SWQoaW52Ll9pZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZnVsbEludm9pY2UgPSByZXM/LmRhdGEgfHwgaW52O1xuICAgICAgICB0aGlzLm9wZW5FZGl0TW9kYWwoZnVsbEludm9pY2UpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBvcGVuIHdpdGggd2hhdGV2ZXIgZGF0YSB3ZSBoYXZlIGZyb20gdGhlIGxpc3RcbiAgICAgICAgdGhpcy5vcGVuRWRpdE1vZGFsKGludik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5FZGl0TW9kYWwoaW52b2ljZURhdGE6IGFueSkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihFZGl0SW52b2ljZUNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaW52b2ljZURhdGEgPSBpbnZvaWNlRGF0YTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5tb2RlID0gJ2VkaXQnO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNsaWVudElkID0gdGhpcy5icmFuZElkO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3VwZGF0ZWQnIHx8IHJlc3VsdCA9PT0gJ2NyZWRpdEFwcGxpZWQnIHx8IHJlc3VsdCA9PT0gJ2ZlZUFwcGxpZWQnKSB7XG4gICAgICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgY3JlYXRlSW52b2ljZSgpIHtcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRWRpdEludm9pY2VDb21wb25lbnQsIHtcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAneGwnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLm1vZGUgPSAnY3JlYXRlJztcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jbGllbnRJZCA9IHRoaXMuYnJhbmRJZDtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdjcmVhdGVkJykge1xuICAgICAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIGRlbGV0ZUludm9pY2UoaW52OiBhbnkpIHtcbiAgICAvLyBMb2NrZWQgb25jZSBhIHJlYWwgaW52b2ljZSBudW1iZXIgaXMgbWludGVkIChmaW5hbmNlIGFwcHJvdmFsKSDigJQgb25seVxuICAgIC8vIHByZS1maW5hbmNlIGRyYWZ0cyBhcmUgZGVsZXRhYmxlLiBFbmZvcmNlZCBieSB0aGUgYmFja2VuZCB0b28uXG4gICAgaWYgKHRoaXMuaXNEZWxldGVMb2NrZWQoaW52KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdZZXMnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZGVsZXRlSW52b2ljZShpbnYuX2lkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdJbnZvaWNlIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGRlbGV0ZSBpbnZvaWNlJztcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChtc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgLy8gQ2FuY2VsIGFuIGFwcHJvdmVkK3VucGFpZCBpbnZvaWNlLiBDb25maXJtYXRpb24gbW9kYWwgY29sbGVjdHMgYVxuICAvLyBtYW5kYXRvcnkgcmVhc29uOyB0aGUgYmFja2VuZCByZS12YWxpZGF0ZXMgc3RhdHVzL3BheW1lbnRTdGF0dXMgYW5kIHRoZVxuICAvLyByZWFzb24gYmVmb3JlIGZsaXBwaW5nIHN0YXR1cyB0byAnY2FuY2VsbGVkJy5cbiAgY2FuY2VsSW52b2ljZShpbnY6IGFueSkge1xuICAgIGlmICghdGhpcy5jYW5DYW5jZWxJbnZvaWNlKGludikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKENhbmNlbEludm9pY2VDb21wb25lbnQsIHtcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdD8ucmVhc29uKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuY2FuY2VsSW52b2ljZShpbnYuX2lkLCB7IHJlYXNvbjogcmVzdWx0LnJlYXNvbiB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdCgnSW52b2ljZSBjYW5jZWxsZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGNhbmNlbCBpbnZvaWNlJztcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChtc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgLy8gT3BlbnMgdGhlIGFjdGl2aXR5LWxvZyB0aW1lbGluZSBmb3IgYSBzaW5nbGUgaW52b2ljZSDigJQgdHJpZ2dlcmVkIGJ5XG4gIC8vIGNsaWNraW5nIGl0cyBzdGF0dXMgYmFkZ2UuIFJlYWQtb25seTsgdGhlIG1vZGFsIGZldGNoZXMgb24gaW5pdC5cbiAgb3Blbkludm9pY2VMb2dzKGludjogYW55KTogdm9pZCB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEludm9pY2VMb2dzQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnZvaWNlID0gaW52O1xuICB9XG5cbiAgc2VsZWN0VGFiKHRhYjogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3RlZFRhYiA9IHRhYjtcbiAgICBpZiAodGFiID09PSAnaW52b2ljZXMnKSB7XG4gICAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICAgIH1cbiAgfVxuXG4gIGdvQmFjaygpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvYmlsbGluZyddKTtcbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgPCEtLSBCYWNrIEJ1dHRvbiDigJQgaGlkZGVuIGZvciBjbGllbnQgdXNlcnMgKG5vIEJyYW5kcyBsaXN0IHRvIGdvIGJhY2sgdG8pLiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibXQtMyBteC0zXCIgKm5nSWY9XCIhaXNDbGllbnRcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpbmsgdGV4dC1tdXRlZCBwLTBcIiAoY2xpY2spPVwiZ29CYWNrKClcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwibWUtMVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUgOEgxTTEgOEw4IDE1TTEgOEw4IDFcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICBCYWNrIHRvIEJpbGxpbmdcbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEJyYW5kIEhlYWRlciDigJQgaGlkZGVuIGZvciBjbGllbnQgdXNlcnMuIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJicmFuZC1oZWFkZXIgbXgtMyBtdC0zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIiAqbmdJZj1cIiFpc0NsaWVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3ltYm9sIHN5bWJvbC01MHB4IHN5bWJvbC1jaXJjbGVcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ltYm9sLWxhYmVsIGJnLXByaW1hcnkgdGV4dC13aGl0ZSBicmFuZC1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgICB7eyBjbGllbnRJbmZvPy5jbGllbnROYW1lPy5jaGFyQXQoMCkgfHwgYnJhbmROYW1lPy5jaGFyQXQoMCkgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnJhbmQtbmFtZVwiPnt7IGNsaWVudEluZm8/LmNsaWVudE5hbWUgfHwgYnJhbmROYW1lIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnJhbmQtbWV0YSB0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAge3sgY2xpZW50SW5mbz8udG90YWxTdG9yZXMgfHwgMCB9fSBTdG9yZXNcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm14LTFcIj4mbWlkZG90Ozwvc3Bhbj5cbiAgICAgICAgICAgICAgICBCaWxsaW5nIHt7IGNsaWVudEluZm8/LnN0YXR1cyA9PT0gJ2FjdGl2ZScgPyAnQWN0aXZlJyA6ICdJbmFjdGl2ZScgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3ViIFRhYnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm10LTQgbXgtMyBwYXltZW50aGlzdG9yeVwiPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwidmlzaWJsZVRhYnMuaW5jbHVkZXMoJ2ludm9pY2VzJylcIiBjbGFzcz1cImJ0biBidG4tY29sb3ItZ3JheS02MDAgYnRuLWFjdGl2ZSBidG4tYWN0aXZlLXNlY29uZGFyeSBweC02IHB5LTMgbWUtMlwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0gJ2ludm9pY2VzJyA/ICdhY3RpdmVQbGFuQnRucHJpbWFyeScgOiAnaW5hY3RpdmVQbGFuQnRuJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGFiKCdpbnZvaWNlcycpXCI+XG4gICAgICAgICAgICBJbnZvaWNlc1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInZpc2libGVUYWJzLmluY2x1ZGVzKCdlc3RpbWF0ZScpXCIgY2xhc3M9XCJidG4gYnRuLWNvbG9yLWdyYXktNjAwIGJ0bi1hY3RpdmUgYnRuLWFjdGl2ZS1zZWNvbmRhcnkgcHgtNiBweS0zIG1lLTJcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdlc3RpbWF0ZScgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRhYignZXN0aW1hdGUnKVwiPlxuICAgICAgICAgICAgRXN0aW1hdGVcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJ2aXNpYmxlVGFicy5pbmNsdWRlcygnZGFpbHktcHJpY2luZycpXCIgY2xhc3M9XCJidG4gYnRuLWNvbG9yLWdyYXktNjAwIGJ0bi1hY3RpdmUgYnRuLWFjdGl2ZS1zZWNvbmRhcnkgcHgtNiBweS0zIG1lLTJcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdkYWlseS1wcmljaW5nJyA/ICdhY3RpdmVQbGFuQnRucHJpbWFyeScgOiAnaW5hY3RpdmVQbGFuQnRuJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGFiKCdkYWlseS1wcmljaW5nJylcIj5cbiAgICAgICAgICAgIEJpbGxpbmcgQnJlYWtkb3duXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwidmlzaWJsZVRhYnMuaW5jbHVkZXMoJ3BsYW5zLXN1YnNjcmlwdGlvbicpXCIgY2xhc3M9XCJidG4gYnRuLWNvbG9yLWdyYXktNjAwIGJ0bi1hY3RpdmUgYnRuLWFjdGl2ZS1zZWNvbmRhcnkgcHgtNiBweS0zIG1lLTJcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdwbGFucy1zdWJzY3JpcHRpb24nID8gJ2FjdGl2ZVBsYW5CdG5wcmltYXJ5JyA6ICdpbmFjdGl2ZVBsYW5CdG4nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIoJ3BsYW5zLXN1YnNjcmlwdGlvbicpXCI+XG4gICAgICAgICAgICBQbGFucyAmYW1wOyBTdWJzY3JpcHRpb25cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJ2aXNpYmxlVGFicy5pbmNsdWRlcygnYmlsbGluZy1ncm91cHMnKVwiIGNsYXNzPVwiYnRuIGJ0bi1jb2xvci1ncmF5LTYwMCBidG4tYWN0aXZlIGJ0bi1hY3RpdmUtc2Vjb25kYXJ5IHB4LTYgcHktMyBtZS0yXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiID09PSAnYmlsbGluZy1ncm91cHMnID8gJ2FjdGl2ZVBsYW5CdG5wcmltYXJ5JyA6ICdpbmFjdGl2ZVBsYW5CdG4nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIoJ2JpbGxpbmctZ3JvdXBzJylcIj5cbiAgICAgICAgICAgIEJpbGxpbmcgU2V0dGluZ3NcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJ2aXNpYmxlVGFicy5pbmNsdWRlcygncHVyY2hhc2Utb3JkZXInKVwiIGNsYXNzPVwiYnRuIGJ0bi1jb2xvci1ncmF5LTYwMCBidG4tYWN0aXZlIGJ0bi1hY3RpdmUtc2Vjb25kYXJ5IHB4LTYgcHktM1wiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0gJ3B1cmNoYXNlLW9yZGVyJyA/ICdhY3RpdmVQbGFuQnRucHJpbWFyeScgOiAnaW5hY3RpdmVQbGFuQnRuJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGFiKCdwdXJjaGFzZS1vcmRlcicpXCI+XG4gICAgICAgICAgICBQdXJjaGFzZSBPcmRlclxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUGxhbnMgJiBTdWJzY3JpcHRpb24gU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibXgtMyBtdC00IG1iLTRcIiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAncGxhbnMtc3Vic2NyaXB0aW9uJ1wiPlxuICAgICAgICA8bGliLXBsYW5zLXN1YnNjcmlwdGlvbj48L2xpYi1wbGFucy1zdWJzY3JpcHRpb24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEVzdGltYXRlIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm14LTMgbXQtNCBtYi00XCIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2VzdGltYXRlJ1wiPlxuICAgICAgICA8bGliLWVzdGltYXRlcyBbY2xpZW50SWRdPVwiYnJhbmRJZFwiPjwvbGliLWVzdGltYXRlcz5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gSW52b2ljZXMgU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZXMtc2VjdGlvbiBteC0zIG10LTQgbWItNFwiICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdpbnZvaWNlcydcIj5cbiAgICAgICAgPCEtLSBTdWItdG9nZ2xlOiByZWd1bGFyIGludm9pY2VzIHZzIGFkdmFuY2UgKFRJTlYtKikgaW52b2ljZXMuIFNob3duIGZvclxuICAgICAgICAgICAgIGJvdGggdGFuZ28gYW5kIGNsaWVudCB2aWV3cy4gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLXR5cGUtdG9nZ2xlIG1iLTNcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaW52b2ljZVR5cGUgPT09ICdhbGwnID8gJ2ludm9pY2UtdHlwZS1idG4gYWN0aXZlJyA6ICdpbnZvaWNlLXR5cGUtYnRuJ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEludm9pY2VUeXBlKCdhbGwnKVwiPkFsbCBJbnZvaWNlczwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpbnZvaWNlVHlwZSA9PT0gJ2FkdmFuY2UnID8gJ2ludm9pY2UtdHlwZS1idG4gYWN0aXZlJyA6ICdpbnZvaWNlLXR5cGUtYnRuJ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEludm9pY2VUeXBlKCdhZHZhbmNlJylcIj5BZHZhbmNlIEludm9pY2U8L2J1dHRvbj5cbiAgICAgICAgICAgIDwhLS0gQ3JlZGl0IG5vdGVzIGFyZSB0YW5nby1vbmx5ICh0aGUgY3JlZGl0LW5vdGUgQVBJIGlzIHRvbykuIC0tPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCIhaXNDbGllbnRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImludm9pY2VUeXBlID09PSAnY3JlZGl0Tm90ZScgPyAnaW52b2ljZS10eXBlLWJ0biBhY3RpdmUnIDogJ2ludm9pY2UtdHlwZS1idG4nXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SW52b2ljZVR5cGUoJ2NyZWRpdE5vdGUnKVwiPkNyZWRpdCBOb3RlczwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIENyZWRpdCBOb3Rlczogb3duIGxpc3QgKHNlcGFyYXRlIGNvbGxlY3Rpb24pIGZvciB0aGlzIGJyYW5kLiAtLT5cbiAgICAgICAgPGxpYi1jcmVkaXQtbm90ZXMgKm5nSWY9XCJpbnZvaWNlVHlwZSA9PT0gJ2NyZWRpdE5vdGUnXCIgW2NsaWVudElkXT1cImJyYW5kSWRcIj48L2xpYi1jcmVkaXQtbm90ZXM+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImludm9pY2VUeXBlICE9PSAnY3JlZGl0Tm90ZSdcIj5cbiAgICAgICAgPCEtLSBIZWFkZXIgc3VtbWFyeSBjYXJkcyDigJQgT3V0c3RhbmRpbmcgLyBPdmVyZHVlIC8gUGVuZGluZyBQYXltZW50LFxuICAgICAgICAgICAgIGVhY2ggc3BsaXQgaW50byBFeGNsLiBHU1QgLyBJbmNsLiBHU1QgKOKCuSkuIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctMyBtYi0zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLWxhYmVsXCI+T3V0c3RhbmRpbmc8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtbGFiZWxcIj5FeGNsLiBHU1Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtdmFsdWVcIj7igrl7eyBpbnZvaWNlQ2FyZHMub3V0c3RhbmRpbmdFeGNsQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtbGFiZWxcIj5JbmNsLiBHU1Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtdmFsdWVcIj7igrl7eyBpbnZvaWNlQ2FyZHMub3V0c3RhbmRpbmdJbmNsQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zdWJcIj57eyBpbnZvaWNlQ2FyZHMub3V0c3RhbmRpbmdDb3VudCB9fSB7eyBpbnZvaWNlQ2FyZHMub3V0c3RhbmRpbmdDb3VudCA9PT0gMSA/ICdpbnZvaWNlJyA6ICdpbnZvaWNlcycgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1sYWJlbFwiPk92ZXJkdWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtbGFiZWxcIj5FeGNsLiBHU1Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtdmFsdWUgdGV4dC1kYW5nZXJcIj7igrl7eyBpbnZvaWNlQ2FyZHMub3ZlcmR1ZUV4Y2xBbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1sYWJlbFwiPkluY2wuIEdTVDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC12YWx1ZSB0ZXh0LWRhbmdlclwiPuKCuXt7IGludm9pY2VDYXJkcy5vdmVyZHVlSW5jbEFtb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3ViXCI+e3sgaW52b2ljZUNhcmRzLm92ZXJkdWVDb3VudCB9fSB7eyBpbnZvaWNlQ2FyZHMub3ZlcmR1ZUNvdW50ID09PSAxID8gJ2ludm9pY2UnIDogJ2ludm9pY2VzJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLWxhYmVsXCI+UGVuZGluZyBQYXltZW50PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWxhYmVsXCI+RXhjbC4gR1NUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXZhbHVlIHRleHQtd2FybmluZ1wiPuKCuXt7IGludm9pY2VDYXJkcy5wZW5kaW5nUGF5bWVudEV4Y2xBbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1sYWJlbFwiPkluY2wuIEdTVDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC12YWx1ZSB0ZXh0LXdhcm5pbmdcIj7igrl7eyBpbnZvaWNlQ2FyZHMucGVuZGluZ1BheW1lbnRJbmNsQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zdWJcIj57eyBpbnZvaWNlQ2FyZHMucGVuZGluZ1BheW1lbnRDb3VudCB9fSB7eyBpbnZvaWNlQ2FyZHMucGVuZGluZ1BheW1lbnRDb3VudCA9PT0gMSA/ICdpbnZvaWNlJyA6ICdpbnZvaWNlcycgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEhlYWRlciBSb3cgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuNjY2NjcgMTBIMTMuMzMzM002LjY2NjY3IDYuNjY2NjdIMTMuMzMzM002LjY2NjY3IDEzLjMzMzNIMTBNNSAxNy41SDE1QzE1LjkyMDUgMTcuNSAxNi42NjY3IDE2Ljc1MzggMTYuNjY2NyAxNS44MzMzVjQuMTY2NjdDMTYuNjY2NyAzLjI0NjE5IDE1LjkyMDUgMi41IDE1IDIuNUg1QzQuMDc5NTMgMi41IDMuMzMzMzMgMy4yNDYxOSAzLjMzMzMzIDQuMTY2NjdWMTUuODMzM0MzLjMzMzMzIDE2Ljc1MzggNC4wNzk1MyAxNy41IDUgMTcuNVpcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmlsbGluZ2hlYWRlclwiPkludm9pY2VzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLWxpZ2h0IHRleHQtZGFyayBtcy0xXCI+e3sgdG90YWxJbnZvaWNlcyB9fSB0b3RhbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtdC0xXCI+VG90YWwgaW52b2ljZWQ6IDxzdHJvbmc+4oK5e3sgdG90YWxJbnZvaWNlZCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZG93bmxvYWRTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tc20gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBtZS0yXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNDbGllbnQgJiYgc2VsZWN0ZWRJbnZvaWNlcy5zaXplID4gMFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidWxrRG93bmxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNNS44MzMzMyA4LjMzMzMzTDEwIDEyLjVNMTAgMTIuNUwxNC4xNjY3IDguMzMzMzNNMTAgMTIuNVYyLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIiAqbmdJZj1cIiFidWxrRG93bmxvYWRpbmdcIj5Eb3dubG9hZCBTZWxlY3RlZCAoe3sgc2VsZWN0ZWRJbnZvaWNlcy5zaXplIH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJidWxrRG93bmxvYWRpbmdcIj5QcmVwYXJpbmcgWklQLi4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZW5kRW1haWxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tc20gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBtZS0yXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNDbGllbnQgJiYgc2VsZWN0ZWRJbnZvaWNlcy5zaXplID4gMCAmJiAoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1bGtFbWFpbGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMi41IDUuODMzMzNMOS4wNyAxMC40MjgzQzkuNjM1IDEwLjgyMzUgMTAuMzY1IDEwLjgyMzUgMTAuOTMgMTAuNDI4M0wxNy41IDUuODMzMzNNNC4xNjY2NyAxNS44MzMzSDE1LjgzMzNDMTYuNzUzOCAxNS44MzMzIDE3LjUgMTUuMDg3MSAxNy41IDE0LjE2NjdWNS44MzMzM0MxNy41IDQuOTEyODYgMTYuNzUzOCA0LjE2NjY3IDE1LjgzMzMgNC4xNjY2N0g0LjE2NjY3QzMuMjQ2MTkgNC4xNjY2NyAyLjUgNC45MTI4NiAyLjUgNS44MzMzM1YxNC4xNjY3QzIuNSAxNS4wODcxIDMuMjQ2MTkgMTUuODMzMyA0LjE2NjY3IDE1LjgzMzNaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCIhYnVsa0VtYWlsaW5nXCI+U2VuZCBFbWFpbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJidWxrRW1haWxpbmdcIj5TZW5kaW5nLi4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhcHByb3ZlU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzIGJ0bi1zbSBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyIG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0NsaWVudCAmJiBzZWxlY3RlZEludm9pY2VzLnNpemUgPiAwICYmIChncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5UYW5nb0FkbWluX2ludm9pY2VBcHByb3ZhbF9pc0VkaXRcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVsa0FwcHJvdmluZyB8fCBwZW5kaW5nSW5TZWxlY3Rpb24oKSA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTYuNjY2NyA1TDcuNTAwMDEgMTQuMTY2N0wzLjMzMzM0IDEwXCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCIhYnVsa0FwcHJvdmluZ1wiPkFwcHJvdmUgU2VsZWN0ZWQgKHt7IHBlbmRpbmdJblNlbGVjdGlvbigpIH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCIgKm5nSWY9XCJidWxrQXBwcm92aW5nXCI+QXBwcm92aW5nLi4uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwhLS0gQ3JlYXRlIEludm9pY2UgZm9sbG93cyBUYW5nbyBCaWxsaW5nIEVESVQgYWNjZXNzIChub3QgaW52b2ljZSBhcHByb3ZhbCkuIC0tPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjcmVhdGVJbnZvaWNlKClcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBtZS0yXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNDbGllbnQgJiYgKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LlRhbmdvQWRtaW5fRWRpdEJpbGxpbmdfaXNFZGl0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMCA0LjE2NjY3VjE1LjgzMzNNNC4xNjY2NyAxMEgxNS44MzMzXCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCI+Q3JlYXRlIEludm9pY2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRXhwb3J0KClcIiAqbmdJZj1cIiFpc0NsaWVudFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLW91dGxpbmUgYnRuIGFsaWduLWl0ZW1zLWVuZCB0ZXh0LW5vd3JhcCBpbnZoZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWludm9pY2VMaXN0Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMVwiPkV4cG9ydDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEZpbHRlciBUYWJzICsgU2VhcmNoIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcGF5bWVudGhpc3RvcnkgYm9yZGVyLTAgcHgtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8IS0tICdQZW5kaW5nIEFwcHJvdmFsJyBpcyBpbnRlcm5hbCBwaXBlbGluZSDigJQgaGlkZGVuIGZvciBjbGllbnQgbG9naW4uXG4gICAgICAgICAgICAgICAgICAgICBDbGllbnRzIHN0aWxsIHNlZSBBbGwgLyBQZW5kaW5nIFBheW1lbnQgLyBQYWlkLiAtLT5cbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCB0YWIgb2YgZmlsdGVyVGFic1wiIGNsYXNzPVwiYnRuIGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiaXNDbGllbnQgJiYgdGFiID09PSAnUGVuZGluZyBBcHByb3ZhbCdcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhY3RpdmVGaWx0ZXIgPT09IHRhYiA/ICdhY3RpdmVQbGFuQnRucHJpbWFyeScgOiAnaW5hY3RpdmVQbGFuQnRuJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRGaWx0ZXIodGFiKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyB0YWIgfX1cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YWIgPT09ICdQZW5kaW5nIEFwcHJvdmFsJyAmJiBwZW5kaW5nQXBwcm92YWxcIiBjbGFzcz1cIm1zLTEgc21hbGxcIj57eyBwZW5kaW5nQXBwcm92YWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFiID09PSAnUGVuZGluZyBQYXltZW50JyAmJiBwZW5kaW5nUGF5bWVudFwiIGNsYXNzPVwibXMtMSBzbWFsbFwiPnt7IHBlbmRpbmdQYXltZW50IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10b29sYmFyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwb3NpdGlvbi1yZWxhdGl2ZSBteS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIGludm9pY2VzZWFyY2ggc3ZnLWljb24tMSBwb3NpdGlvbi1hYnNvbHV0ZSBtdC02IG1zLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgb3BhY2l0eT1cIjAuNVwiIHg9XCIxNy4wMzY1XCIgeT1cIjE1LjEyMjNcIiB3aWR0aD1cIjguMTU1NDZcIiBoZWlnaHQ9XCIyXCIgcng9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSg0NSAxNy4wMzY1IDE1LjEyMjMpXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcmVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTEgMTlDNi41NTU1NiAxOSAzIDE1LjQ0NDQgMyAxMUMzIDYuNTU1NTYgNi41NTU1NiAzIDExIDNDMTUuNDQ0NCAzIDE5IDYuNTU1NTYgMTkgMTFDMTkgMTUuNDQ0NCAxNS40NDQ0IDE5IDExIDE5Wk0xMSA1QzcuNTMzMzMgNSA1IDcuNTMzMzMgNSAxMUM1IDE0LjQ2NjcgNy41MzMzMyAxNyAxMSAxN0MxNC40NjY3IDE3IDE3IDE0LjQ2NjcgMTcgMTFDMTcgNy41MzMzMyAxNC40NjY3IDUgMTEgNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImxlblwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcHMtMTQgaW52b2ljZXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJJbnZvaWNlICMgb3IgYmlsbGluZyBncm91cC4uLlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChjaGFuZ2UpPVwic2VhcmNoRmllbGQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNlYXJjaERpc2FibGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItZmlsdGVycyBbZGF0YU9iamVjdF09XCJpbnZvaWNlRmlsdGVyT2JqZWN0XCIgKGFwcGxpZWRGaWx0ZXJzKT1cImFwcGx5SW52b2ljZUZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTG9hZGluZyBTaGltbWVyIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW52b2ljZUxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIE5vIERhdGEgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbnZvaWNlTm9EYXRhXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyYyB3LTI1XCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhLnN2Z1wiIGFsdD1cIlwiPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEludm9pY2VzIFRhYmxlIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWludm9pY2VMb2FkaW5nICYmICFpbnZvaWNlTm9EYXRhXCIgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhY2NvcmRpb24gdGFibGUgYm90dG9tLWJvcmRlciB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LlRhbmdvQWRtaW5faW52b2ljZUFwcHJvdmFsX2lzRWRpdFwiIHN0eWxlPVwid2lkdGg6IDQwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwic2VsZWN0QWxsXCIgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIFtkaXNhYmxlZF09XCJpbnZvaWNlTGlzdC5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzb3J0RGF0YSgnaW52b2ljZScpXCI+SU5WT0lDRSAjXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0Q29sdW1OYW1lID09PSAnaW52b2ljZScgJiYgc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydENvbHVtTmFtZSA9PT0gJ2ludm9pY2UnID8gJyMwMEEzRkYnIDogJyM2NjcwODUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiIWlzQ2xpZW50XCI+QklMTElORyBHUk9VUDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+UEVSSU9EPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCdiaWxsaW5nRGF0ZScpXCI+R0VORVJBVEVEXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0Q29sdW1OYW1lID09PSAnYmlsbGluZ0RhdGUnICYmIHNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRDb2x1bU5hbWUgPT09ICdiaWxsaW5nRGF0ZScgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+UVRZPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCdhbW91bnQnKVwiPkFNT1VOVCAoZXhjbC4gR1NUKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW25nQ2xhc3NdPVwic29ydENvbHVtTmFtZSA9PT0gJ2Ftb3VudCcgJiYgc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydENvbHVtTmFtZSA9PT0gJ2Ftb3VudCcgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+R1NUPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCd0b3RhbEFtb3VudCcpXCI+QU1PVU5UIChpbmNsLiBHU1QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0Q29sdW1OYW1lID09PSAndG90YWxBbW91bnQnICYmIHNvcnRCeSA9PT0gMSA/ICdyb3RhdGUnIDogJydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNvcnRDb2x1bU5hbWUgPT09ICd0b3RhbEFtb3VudCcgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+U1RBVFVTPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BQ1RJT048L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGludiBvZiBpbnZvaWNlTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LlRhbmdvQWRtaW5faW52b2ljZUFwcHJvdmFsX2lzRWRpdFwiIHN0eWxlPVwid2lkdGg6IDQwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtdC0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZChpbnYpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVJbnZvaWNlU2VsZWN0KGludilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlIHRhYmxlLXRpdGxlLXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWluZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaW52Py5zdGF0dXMgPT09ICdwZW5kaW5nJyA/ICdpbmRpY2F0b3Itd2FybmluZycgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52Py5wYXltZW50U3RhdHVzID09PSAncGFpZCcgPyAnaW5kaWNhdG9yLXN1Y2Nlc3MnIDogJ2luZGljYXRvci1wcmltYXJ5J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImludm9pY2UtbGlua1wiIChjbGljayk9XCJvcGVuSW52b2ljZVByZXZpZXcoaW52KTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+e3sgaW52Py5pbnZvaWNlIH19PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhaXNDbGllbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtZS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNSAxLjE2Njc1VjIuOTE2NzVNMTAuNSAxLjE2Njc1VjIuOTE2NzVNMS4xNjY2NyA1LjU0MTc1SDEyLjgzMzNNMi4zMzMzMyAyLjA0MTc1SDExLjY2NjdDMTIuMzExMSAyLjA0MTc1IDEyLjgzMzMgMi41NjQwMiAxMi44MzMzIDMuMjA4NDFWMTEuNjY2N0MxMi44MzMzIDEyLjMxMTEgMTIuMzExMSAxMi44MzM0IDExLjY2NjcgMTIuODMzNEgyLjMzMzMzQzEuNjg4OTkgMTIuODMzNCAxLjE2NjY3IDEyLjMxMTEgMS4xNjY2NyAxMS42NjY3VjMuMjA4NDFDMS4xNjY2NyAyLjU2NDAyIDEuNjg4OTkgMi4wNDE3NSAyLjMzMzMzIDIuMDQxNzVaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGludj8uZ3JvdXBOYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy41IDEuMTY2NzVWMi45MTY3NU0xMC41IDEuMTY2NzVWMi45MTY3NU0xLjE2NjY3IDUuNTQxNzVIMTIuODMzM00yLjMzMzMzIDIuMDQxNzVIMTEuNjY2N0MxMi4zMTExIDIuMDQxNzUgMTIuODMzMyAyLjU2NDAyIDEyLjgzMzMgMy4yMDg0MVYxMS42NjY3QzEyLjgzMzMgMTIuMzExMSAxMi4zMTExIDEyLjgzMzQgMTEuNjY2NyAxMi44MzM0SDIuMzMzMzNDMS42ODg5OSAxMi44MzM0IDEuMTY2NjcgMTIuMzExMSAxLjE2NjY3IDExLjY2NjdWMy4yMDg0MUMxLjE2NjY3IDIuNTY0MDIgMS42ODg5OSAyLjA0MTc1IDIuMzMzMzMgMi4wNDE3NVpcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaW52Py5iaWxsaW5nRGF0ZSB8IGRhdGU6ICdNTU0geXl5eScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+e3sgaW52Py5iaWxsaW5nRGF0ZSB8IGRhdGU6ICdkZCBNTU0geXl5eScgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlIHRleHQtY2VudGVyXCI+PHN0cm9uZz57eyBpbnY/LnN0b3JlcyB9fTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj57eyBpbnZvaWNlQ3VycmVuY3lTeW1ib2woaW52KSB9fXt7IGludj8uYW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIiAqbmdJZj1cImlzR3N0QXBwbGljYWJsZShpbnYpOyBlbHNlIG5vR3N0XCI+e3sgaW52b2ljZUN1cnJlbmN5U3ltYm9sKGludikgfX17eyBnc3RBbW91bnQoaW52KSB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vR3N0PjxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPuKAlDwvZGl2PjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPjxzdHJvbmc+e3sgaW52b2ljZUN1cnJlbmN5U3ltYm9sKGludikgfX17eyBpbnY/LnRvdGFsQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENsaWVudHMgb25seSBzZWUgdGhlIHN0YXR1cyBvbmNlIHRoZSBpbnZvaWNlIGlzIEFQUFJPVkVEXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlbiBpdCdzIHRoZSBwYXltZW50IHN0YXR1czogUGVuZGluZyBQYXltZW50IC8gUGFydGlhbCAvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWlkKS4gQXBwcm92YWwtcGlwZWxpbmUgc3RhdHVzZXMgYXJlIGhpZGRlbiBmcm9tIGNsaWVudHMuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNDbGllbnQgfHwgaW52Py5zdGF0dXMgPT09ICdhcHByb3ZlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXRTdGF0dXNDbGFzcyhpbnYpXCIgY2xhc3M9XCJtdC0zIGN1cnNvci1wb2ludGVyXCIgdGl0bGU9XCJWaWV3IGFjdGl2aXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuSW52b2ljZUxvZ3MoaW52KTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRJbnZvaWNlU3RhdHVzKGludikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNQZW5kaW5nKGludilcIiBjbGFzcz1cInBlbmRpbmctbm90ZSBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpbnZvaWNlQ3VycmVuY3lTeW1ib2woaW52KSB9fXt7IHBlbmRpbmdBbW91bnQoaW52KSB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX0gcGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYXJvdW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ2xpZW50XCIgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiFpc0VkaXRCbG9ja2VkKGludilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmxvY2tlZC1hY3Rpb25dPVwiaXNFZGl0QmxvY2tlZChpbnYpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIhaXNFZGl0QmxvY2tlZChpbnYpICYmIGVkaXRJbnZvaWNlKGludilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiZWRpdFRvb2x0aXAoaW52KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsdGVyPVwidXJsKCNmaWx0ZXIwX2RfZWRpdClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yNi41IDE0LjVMMjkuNSAxNy41TTE0LjUgMjkuNUgxNy41TDI4IDE5QzI4LjM5NzggMTguNjAyMiAyOC42MjEzIDE4LjA2NjMgMjguNjIxMyAxNy41QzI4LjYyMTMgMTYuOTMzNyAyOC4zOTc4IDE2LjM5NzggMjggMTZMMjggMTZDMjcuNjAyMiAxNS42MDIyIDI3LjA2NjMgMTUuMzc4NyAyNi41IDE1LjM3ODdDMjUuOTMzNyAxNS4zNzg3IDI1LjM5NzggMTUuNjAyMiAyNSAxNkwxNC41IDI2LjVWMjkuNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF9lZGl0XCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCBpbj1cIlNvdXJjZUFscGhhXCIgdHlwZT1cIm1hdHJpeFwiIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCIgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIiByZXN1bHQ9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfZWRpdFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCIgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93X2VkaXRcIiByZXN1bHQ9XCJzaGFwZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYXBwcm92ZUludm9pY2UoaW52KVwiIFtuZ2JUb29sdGlwXT1cImdldEFwcHJvdmVUb29sdGlwKGludilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNDbGllbnQgJiYgY2FuQXBwcm92ZShpbnYsIChncy51c2VyQWNjZXNzIHwgYXN5bmMpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF8xNjQ3OF80MzA0MClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNjQ3OF80MzA0MClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zMC4zMzQ2IDIwLjIzMzVWMjEuMDAwMkMzMC4zMzM2IDIyLjc5NzIgMjkuNzUxNyAyNC41NDU4IDI4LjY3NTcgMjUuOTg1MUMyNy41OTk4IDI3LjQyNDQgMjYuMDg3NCAyOC40NzczIDI0LjM2NDEgMjguOTg2OEMyMi42NDA4IDI5LjQ5NjMgMjAuNzk5IDI5LjQzNTEgMTkuMTEzNCAyOC44MTI0QzE3LjQyNzcgMjguMTg5NiAxNS45ODg1IDI3LjAzODYgMTUuMDEwNCAyNS41MzExQzE0LjAzMjQgMjQuMDIzNiAxMy41Njc4IDIyLjI0MDMgMTMuNjg2IDIwLjQ0NzFDMTMuODA0MyAxOC42NTQgMTQuNDk5IDE2Ljk0NzIgMTUuNjY2NSAxNS41ODExQzE2LjgzNDEgMTQuMjE1MSAxOC40MTIgMTMuMjYzIDIwLjE2NDggMTIuODY3QzIxLjkxNzYgMTIuNDcxIDIzLjc1MTUgMTIuNjUyMiAyNS4zOTMgMTMuMzgzNU0zMC4zMzQ2IDE0LjMzMzVMMjIuMDAxMyAyMi42NzUyTDE5LjUwMTMgMjAuMTc1MlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfMTY0NzhfNDMwNDBcIiB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCBpbj1cIlNvdXJjZUFscGhhXCIgdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImhhcmRBbHBoYVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVPZmZzZXQgZHk9XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd18xNjQ3OF80MzA0MFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjI9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfMTY0NzhfNDMwNDBcIiByZXN1bHQ9XCJzaGFwZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNjQ3OF80MzA0MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMTIgMTEpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0NsaWVudCAmJiBpbnYuc3RhdHVzPT09J2FwcHJvdmVkJyAmJiAoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0XCIgbmdiVG9vbHRpcD1cIkFscmVhZHkgQXBwcm92ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzE2NjMwXzgwNjIpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjFcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjhcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0VBRUNGMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTY2MzBfODA2MilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zMC4zMzQ2IDIwLjIzMzVWMjEuMDAwMkMzMC4zMzM2IDIyLjc5NzIgMjkuNzUxNyAyNC41NDU4IDI4LjY3NTcgMjUuOTg1MUMyNy41OTk4IDI3LjQyNDQgMjYuMDg3NCAyOC40NzczIDI0LjM2NDEgMjguOTg2OEMyMi42NDA4IDI5LjQ5NjMgMjAuNzk5IDI5LjQzNTEgMTkuMTEzNCAyOC44MTI0QzE3LjQyNzcgMjguMTg5NiAxNS45ODg1IDI3LjAzODYgMTUuMDEwNCAyNS41MzExQzE0LjAzMjQgMjQuMDIzNiAxMy41Njc4IDIyLjI0MDMgMTMuNjg2IDIwLjQ0NzFDMTMuODA0MyAxOC42NTQgMTQuNDk5IDE2Ljk0NzIgMTUuNjY2NSAxNS41ODExQzE2LjgzNDEgMTQuMjE1MSAxOC40MTIgMTMuMjYzIDIwLjE2NDggMTIuODY3QzIxLjkxNzYgMTIuNDcxIDIzLjc1MTUgMTIuNjUyMiAyNS4zOTMgMTMuMzgzNU0zMC4zMzQ2IDE0LjMzMzVMMjIuMDAxMyAyMi42NzUyTDE5LjUwMTMgMjAuMTc1MlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0QwRDVERFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfMTY2MzBfODA2MlwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzE2NjMwXzgwNjJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93XzE2NjMwXzgwNjJcIiByZXN1bHQ9XCJzaGFwZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNjYzMF84MDYyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxMiAxMSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ2xpZW50ICYmIGhhc0FwcHJvdmVyQWNjZXNzXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZWdlbmVyYXRlSW52b2ljZShpbnYpXCIgbmdiVG9vbHRpcD1cIlJlZ2VuZXJhdGUgSW52b2ljZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsdGVyPVwidXJsKCNmaWx0ZXIwX2RfMTU1MzBfNjAzOTUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjFcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjhcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTMxLjE2NTQgMTQuMzMzM1YxOS4zMzMzTTMxLjE2NTQgMTkuMzMzM0gyNi4xNjU0TTMxLjE2NTQgMTkuMzMzM0wyNy4yOTg3IDE1LjdDMjYuNDAzMSAxNC44MDM5IDI1LjI5NTEgMTQuMTQ5MyAyNC4wNzggMTMuNzk3M0MyMi44NjEgMTMuNDQ1MyAyMS41NzQ2IDEzLjQwNzMgMjAuMzM4OSAxMy42ODY5QzE5LjEwMzMgMTMuOTY2NSAxNy45NTg1IDE0LjU1NDUgMTcuMDExNiAxNS4zOTYyQzE2LjA2NDYgMTYuMjM3OCAxNS4zNDYzIDE3LjMwNTYgMTQuOTIzNyAxOC41TTEyLjgzMiAyNy42NjY2VjIyLjY2NjZNMTIuODMyIDIyLjY2NjZIMTcuODMyTTEyLjgzMiAyMi42NjY2TDE2LjY5ODcgMjYuM0MxNy41OTQzIDI3LjE5NjEgMTguNzAyMyAyNy44NTA2IDE5LjkxOTQgMjguMjAyN0MyMS4xMzY0IDI4LjU1NDcgMjIuNDIyOCAyOC41OTI3IDIzLjY1ODUgMjguMzEzMUMyNC44OTQxIDI4LjAzMzUgMjYuMDM4OSAyNy40NDU1IDI2Ljk4NTggMjYuNjAzOEMyNy45MzI4IDI1Ljc2MjEgMjguNjUxMSAyNC42OTQzIDI5LjA3MzcgMjMuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF8xNTUzMF82MDM5NVwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzE1NTMwXzYwMzk1XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd18xNTUzMF82MDM5NVwiIHJlc3VsdD1cInNoYXBlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNDbGllbnQgJiYgKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/Lkdsb2JhbF9CaWxsaW5nX2lzRWRpdFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwicGF5bWVudHN0YXR1c0NoYW5nZShpbnYpXCIgbmdiVG9vbHRpcD1cIlBheW1lbnQgU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjIuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEzLCAxMSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yLjk5ODcgOC4wMDA2NVY2LjMzMzk4QzIuOTk4NyA1LjAwNzkgMy41MjU0OCAzLjczNjEzIDQuNDYzMTYgMi43OTg0NUM1LjQwMDg1IDEuODYwNzcgNi42NzI2MiAxLjMzMzk4IDcuOTk4NyAxLjMzMzk4QzkuMzI0NzggMS4zMzM5OCAxMC41OTY2IDEuODYwNzcgMTEuNTM0MiAyLjc5ODQ1QzEyLjQ3MTkgMy43MzYxMyAxMi45OTg3IDUuMDA3OSAxMi45OTg3IDYuMzMzOThWOC4wMDA2NU0xLjMzMjAzIDEzLjAwMDdDMS4zMzIwMyAxMy40NDI3IDEuNTA3NjMgMTMuODY2NiAxLjgyMDE5IDE0LjE3OTJDMi4xMzI3NSAxNC40OTE3IDIuNTU2NjcgMTQuNjY3MyAyLjk5ODcgMTQuNjY3M0MzLjQ0MDczIDE0LjY2NzMgMy44NjQ2NSAxNC40OTE3IDQuMTc3MjEgMTQuMTc5MkM0LjQ4OTc3IDEzLjg2NjYgNC42NjUzNiAxMy40NDI3IDQuNjY1MzYgMTMuMDAwN0M0LjY2NTM2IDEyLjU1ODYgNC40ODk3NyAxMi4xMzQ3IDQuMTc3MjEgMTEuODIyMUMzLjg2NDY1IDExLjUwOTYgMy40NDA3MyAxMS4zMzQgMi45OTg3IDExLjMzNEMyLjU1NjY3IDExLjMzNCAyLjEzMjc1IDExLjUwOTYgMS44MjAxOSAxMS44MjIxQzEuNTA3NjMgMTIuMTM0NyAxLjMzMjAzIDEyLjU1ODYgMS4zMzIwMyAxMy4wMDA3Wk0xMS4zMzIgMTMuMDAwN0MxMS4zMzIgMTMuNDQyNyAxMS41MDc2IDEzLjg2NjYgMTEuODIwMiAxNC4xNzkyQzEyLjEzMjcgMTQuNDkxNyAxMi41NTY3IDE0LjY2NzMgMTIuOTk4NyAxNC42NjczQzEzLjQ0MDcgMTQuNjY3MyAxMy44NjQ2IDE0LjQ5MTcgMTQuMTc3MiAxNC4xNzkyQzE0LjQ4OTggMTMuODY2NiAxNC42NjU0IDEzLjQ0MjcgMTQuNjY1NCAxMy4wMDA3QzE0LjY2NTQgMTIuNTU4NiAxNC40ODk4IDEyLjEzNDcgMTQuMTc3MiAxMS44MjIxQzEzLjg2NDYgMTEuNTA5NiAxMy40NDA3IDExLjMzNCAxMi45OTg3IDExLjMzNEMxMi41NTY3IDExLjMzNCAxMi4xMzI3IDExLjUwOTYgMTEuODIwMiAxMS44MjIxQzExLjUwNzYgMTIuMTM0NyAxMS4zMzIgMTIuNTU4NiAxMS4zMzIgMTMuMDAwN1pcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMC41IDUuNUwxMyA4TDE1LjUgNS41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImRvd25sb2FkSW52b2ljZShpbnYpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIG5nYlRvb2x0aXA9XCJEb3dubG9hZCBJbnZvaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF8xNTUzMF82MDM5NilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjkuNSAyMy41VjI2LjgzMzNDMjkuNSAyNy4yNzU0IDI5LjMyNDQgMjcuNjk5MyAyOS4wMTE4IDI4LjAxMThDMjguNjk5MyAyOC4zMjQ0IDI4LjI3NTQgMjguNSAyNy44MzMzIDI4LjVIMTYuMTY2N0MxNS43MjQ2IDI4LjUgMTUuMzAwNyAyOC4zMjQ0IDE0Ljk4ODIgMjguMDExOEMxNC42NzU2IDI3LjY5OTMgMTQuNSAyNy4yNzU0IDE0LjUgMjYuODMzM1YyMy41TTE3LjgzMzMgMTkuMzMzM0wyMiAyMy41TTIyIDIzLjVMMjYuMTY2NyAxOS4zMzMzTTIyIDIzLjVWMTMuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF8xNTUzMF82MDM5NlwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzE1NTMwXzYwMzk2XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd18xNTUzMF82MDM5NlwiIHJlc3VsdD1cInNoYXBlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYW5jZWwgaW52b2ljZSAoYXBwcm92ZWQgKyB1bnBhaWQgb25seSkg4oCUIHJlcGxhY2VzIHRoZSBkaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzbG90IGZvciBjYW5jZWxsYWJsZSByb3dzLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYW5jZWxsaW5nIGlzIGEgZmluYW5jZSBhY3Rpb246IG9ubHkgdXNlcnMgd2l0aCBGaW5hbmNlIEFwcHJvdmFsIGFjY2Vzcy4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ2xpZW50ICYmIGNhblNob3dDYW5jZWwoaW52LCAoZ3MudXNlckFjY2VzcyB8IGFzeW5jKSlcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxJbnZvaWNlKGludilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkNhbmNlbCBJbnZvaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF9jYW5jZWwpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjFcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjhcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjguNSAxNS41TDE1LjUgMjguNU0xNS41IDE1LjVMMjguNSAyOC41XCIgc3Ryb2tlPVwiI0Q5MkQyMFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF9jYW5jZWxcIiB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCIgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIiByZXN1bHQ9XCJoYXJkQWxwaGFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlT2Zmc2V0IGR5PVwiMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd19jYW5jZWxcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd19jYW5jZWxcIiByZXN1bHQ9XCJzaGFwZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZWxldGUg4oCUIEhJRERFTiAobm90IGRpc2FibGVkKSBvbmNlIGl0IG5vIGxvbmdlciBhcHBsaWVzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhYmxlIHJvd3Mgc2hvdyBDYW5jZWwgaW5zdGVhZDsgbnVtYmVyLW1pbnRlZC9sb2NrZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzIHNob3cgbmVpdGhlci4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ2xpZW50ICYmICFjYW5DYW5jZWxJbnZvaWNlKGludikgJiYgIWlzRGVsZXRlTG9ja2VkKGludilcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVJbnZvaWNlKGludilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkRlbGV0ZSBJbnZvaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF9kZWxldGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjFcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjhcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcgMjFIMjdNMTUuNSAxN0gyOC41TTE5LjUgMjVIMjQuNU0xNi4xNjY3IDI4LjVIMjcuODMzM0MyOC43NTM4IDI4LjUgMjkuNSAyNy43NTM4IDI5LjUgMjYuODMzM1YxNS4xNjY3QzI5LjUgMTQuMjQ2MiAyOC43NTM4IDEzLjUgMjcuODMzMyAxMy41SDE2LjE2NjdDMTUuMjQ2MiAxMy41IDE0LjUgMTQuMjQ2MiAxNC41IDE1LjE2NjdWMjYuODMzM0MxNC41IDI3Ljc1MzggMTUuMjQ2MiAyOC41IDE2LjE2NjcgMjguNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0Q5MkQyMFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF9kZWxldGVcIiB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCBpbj1cIlNvdXJjZUFscGhhXCIgdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImhhcmRBbHBoYVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVPZmZzZXQgZHk9XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd19kZWxldGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93X2RlbGV0ZVwiIHJlc3VsdD1cInNoYXBlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICA8dGZvb3Q+XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImludm9pY2UtdG90YWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0XCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTGVhZGluZyBzcGFuIGNvdmVycyBJTlZPSUNFIyArIFBFUklPRCArIEdFTkVSQVRFRCwgcGx1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUxMSU5HIEdST1VQIGZvciBub24tY2xpZW50IHZpZXdzICh0aGF0IGNvbHVtbiBpcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNsaWVudHMpLiBXaXRob3V0IHRoZSBpc0NsaWVudCBhZGp1c3RtZW50IHRoZSB0b3RhbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnRlZCBvbmUgY29sdW1uIHJpZ2h0IG9uIGNsaWVudCBsb2dpbi4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJpc0NsaWVudCA/IDMgOiA0XCI+PHN0cm9uZz5Ub3RhbCDCtyB7eyB0b3RhbEludm9pY2VzIH19IGludm9pY2VzPC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48c3Ryb25nPnt7IHRvdGFsU3RvcmVzIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHN0cm9uZz7igrl7eyB0b3RhbEFtb3VudEV4Y2xHc3QgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48c3Ryb25nPuKCuXt7IHRvdGFsR3N0IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHN0cm9uZz7igrl7eyB0b3RhbEFtb3VudEluY2xHc3QgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRWFjaCBjcmVkaXQgbm90ZSBhZ2FpbnN0IHRoZSBsaXN0ZWQgaW52b2ljZXM6IGl0cyBudW1iZXIgKGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBpbnZvaWNlKSwgYmlsbGluZyBncm91cCwgdGhlIHNvdXJjZSBpbnZvaWNlJ3MgcGVyaW9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGl0cyBvd24gZGF0ZSwgc3RvcmVzIGNvdmVyZWQsIGFuZCBjcmVkaXQgLyBHU1QgYXQgdGhlIHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgIGludm9pY2UncyByYXRlIC8gaW5jbC4gR1NULiBUaGVuIHRoZSBuZXQgdG90YWwgYWZ0ZXIgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICAgICBDcmVkaXQgZG9lc24ndCByZWR1Y2UgYW55IHNpbmdsZSBpbnZvaWNlLiBUYW5nbyBvbmx5LCBsaWtlXG4gICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGl0IG5vdGVzLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0NsaWVudCAmJiBjcmVkaXROb3Rlcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJpbnZvaWNlLWNyZWRpdC1yb3dcIiAqbmdGb3I9XCJsZXQgY24gb2YgY3JlZGl0Tm90ZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0XCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPjxzdHJvbmc+e3sgY24uY3JlZGl0Tm90ZSB9fTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3JlZGl0LXJlZlwiPkFnYWluc3Qge3sgY24uaW52b2ljZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWlzQ2xpZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtZS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjUgMS4xNjY3NVYyLjkxNjc1TTEwLjUgMS4xNjY3NVYyLjkxNjc1TTEuMTY2NjcgNS41NDE3NUgxMi44MzMzTTIuMzMzMzMgMi4wNDE3NUgxMS42NjY3QzEyLjMxMTEgMi4wNDE3NSAxMi44MzMzIDIuNTY0MDIgMTIuODMzMyAzLjIwODQxVjExLjY2NjdDMTIuODMzMyAxMi4zMTExIDEyLjMxMTEgMTIuODMzNCAxMS42NjY3IDEyLjgzMzRIMi4zMzMzM0MxLjY4ODk5IDEyLjgzMzQgMS4xNjY2NyAxMi4zMTExIDEuMTY2NjcgMTEuNjY2N1YzLjIwODQxQzEuMTY2NjcgMi41NjQwMiAxLjY4ODk5IDIuMDQxNzUgMi4zMzMzMyAyLjA0MTc1WlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNuLmdyb3VwTmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNSAxLjE2Njc1VjIuOTE2NzVNMTAuNSAxLjE2Njc1VjIuOTE2NzVNMS4xNjY2NyA1LjU0MTc1SDEyLjgzMzNNMi4zMzMzMyAyLjA0MTc1SDExLjY2NjdDMTIuMzExMSAyLjA0MTc1IDEyLjgzMzMgMi41NjQwMiAxMi44MzMzIDMuMjA4NDFWMTEuNjY2N0MxMi44MzMzIDEyLjMxMTEgMTIuMzExMSAxMi44MzM0IDExLjY2NjcgMTIuODMzNEgyLjMzMzMzQzEuNjg4OTkgMTIuODMzNCAxLjE2NjY3IDEyLjMxMTEgMS4xNjY2NyAxMS42NjY3VjMuMjA4NDFDMS4xNjY2NyAyLjU2NDAyIDEuNjg4OTkgMi4wNDE3NSAyLjMzMzMzIDIuMDQxNzVaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY24ucGVyaW9kIHwgZGF0ZTogJ01NTSB5eXl5JyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+e3sgY24uY3JlZGl0Tm90ZURhdGUgfCBkYXRlOiAnZGQgTU1NIHl5eXknIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZSB0ZXh0LWNlbnRlclwiPjxzdHJvbmc+e3sgY24uc3RvcmVzIH19PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjcmVkaXQtYW1vdW50XCI+LSB7eyBpbnZvaWNlQ3VycmVuY3lTeW1ib2woY24pIH19e3sgY24uYW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY3JlZGl0LWFtb3VudFwiPi0ge3sgaW52b2ljZUN1cnJlbmN5U3ltYm9sKGNuKSB9fXt7IGNuLmdzdCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNyZWRpdC1hbW91bnRcIj48c3Ryb25nPi0ge3sgaW52b2ljZUN1cnJlbmN5U3ltYm9sKGNuKSB9fXt7IGNuLnRvdGFsQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiY3JlZGl0LWJhZGdlXCI+Q3JlZGl0IG5vdGU8L3NwYW4+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2FtZSBFZGl0IC8gRG93bmxvYWQgaWNvbnMgYXMgdGhlIGludm9pY2Ugcm93cy4gQ3JlZGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZXMgaGF2ZSBubyBhcHByb3ZhbCwgcGF5bWVudCBvciBjYW5jZWwgc3RlcHMuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGUgZC1mbGV4IGNyZWRpdC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiaGFzQXBwcm92ZXJBY2Nlc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5sb2NrZWQtYWN0aW9uXT1cIiFoYXNBcHByb3ZlckFjY2Vzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRDcmVkaXROb3RlKGNuKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiaGFzQXBwcm92ZXJBY2Nlc3MgPyAnRWRpdCBDcmVkaXQgTm90ZScgOiAnT25seSBGaW5hbmNlIC8gSW52b2ljZSBhcHByb3ZlcnMgY2FuIGVkaXQgY3JlZGl0IG5vdGVzJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCIgdmlld0JveD1cIjAgMCA0NCA0NFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgZmlsbD1cIndoaXRlXCIgc3Ryb2tlPVwiI0QwRDVERFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yNi41IDE0LjVMMjkuNSAxNy41TTE0LjUgMjkuNUgxNy41TDI4IDE5QzI4LjM5NzggMTguNjAyMiAyOC42MjEzIDE4LjA2NjMgMjguNjIxMyAxNy41QzI4LjYyMTMgMTYuOTMzNyAyOC4zOTc4IDE2LjM5NzggMjggMTZDMjcuNjAyMiAxNS42MDIyIDI3LjA2NjMgMTUuMzc4NyAyNi41IDE1LjM3ODdDMjUuOTMzNyAxNS4zNzg3IDI1LjM5NzggMTUuNjAyMiAyNSAxNkwxNC41IDI2LjVWMjkuNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZG93bmxvYWRDcmVkaXROb3RlKGNuKVwiIG5nYlRvb2x0aXA9XCJEb3dubG9hZCBDcmVkaXQgTm90ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCIgdmlld0JveD1cIjAgMCA0NCA0NFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzlcIiBoZWlnaHQ9XCIzOVwiIHJ4PVwiNy41XCIgZmlsbD1cIndoaXRlXCIgc3Ryb2tlPVwiI0QwRDVERFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yOS41IDIzLjVWMjYuODMzM0MyOS41IDI3LjI3NTQgMjkuMzI0NCAyNy42OTkzIDI5LjAxMTggMjguMDExOEMyOC42OTkzIDI4LjMyNDQgMjguMjc1NCAyOC41IDI3LjgzMzMgMjguNUgxNi4xNjY3QzE1LjcyNDYgMjguNSAxNS4zMDA3IDI4LjMyNDQgMTQuOTg4MiAyOC4wMTE4QzE0LjY3NTYgMjcuNjk5MyAxNC41IDI3LjI3NTQgMTQuNSAyNi44MzMzVjIzLjVNMTcuODMzMyAxOS4zMzMzTDIyIDIzLjVNMjIgMjMuNUwyNi4xNjY3IDE5LjMzMzNNMjIgMjMuNVYxMy41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImludm9pY2UtbmV0LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5UYW5nb0FkbWluX2ludm9pY2VBcHByb3ZhbF9pc0VkaXRcIj48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImlzQ2xpZW50ID8gMyA6IDRcIj48c3Ryb25nPk5ldCB0b3RhbCDCtyBhZnRlciBjcmVkaXQgbm90ZXM8L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48c3Ryb25nPuKCuXt7IG5ldEFtb3VudEV4Y2xHc3QgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHN0cm9uZz7igrl7eyBuZXRHc3QgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHN0cm9uZz7igrl7eyBuZXRBbW91bnRJbmNsR3N0IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3Rmb290PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaW52b2ljZUxvYWRpbmcgJiYgIWludm9pY2VOb0RhdGFcIj5cbiAgICAgICAgICAgICAgICA8bGliLXBhZ2luYXRpb24gY2xhc3M9XCJ0ZXh0LXN0YXJ0XCIgW2l0ZW1zUGVyUGFnZV09XCJpdGVtc1BlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwiY3VycmVudFBhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zXCIgW3BhZ2luYXRpb25TaXplc109XCJwYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRGFpbHkgUHJpY2luZyBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJteC0zIG10LTQgbWItNFwiICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdkYWlseS1wcmljaW5nJ1wiPlxuICAgICAgICA8bGliLWRhaWx5LXByaWNpbmcgW2NsaWVudElkXT1cImJyYW5kSWRcIj48L2xpYi1kYWlseS1wcmljaW5nPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBCaWxsaW5nIEdyb3VwcyBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJteC0zIG10LTQgbWItNFwiICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdiaWxsaW5nLWdyb3VwcydcIj5cbiAgICAgICAgPGxpYi1iaWxsaW5nLWdyb3VwcyBbY2xpZW50SWRdPVwiYnJhbmRJZFwiPjwvbGliLWJpbGxpbmctZ3JvdXBzPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQdXJjaGFzZSBPcmRlciBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJteC0zIG10LTQgbWItNFwiICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdwdXJjaGFzZS1vcmRlcidcIj5cbiAgICAgICAgPGxpYi1wdXJjaGFzZS1vcmRlciBbY2xpZW50SWRdPVwiYnJhbmRJZFwiPjwvbGliLXB1cmNoYXNlLW9yZGVyPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
1110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmQtaW52b2ljZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2JyYW5kLWludm9pY2VzL2JyYW5kLWludm9pY2VzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9icmFuZC1pbnZvaWNlcy9icmFuZC1pbnZvaWNlcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLMUMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkVBQTZFLENBQUM7QUFDM0gsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDL0csT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkVBQTZFLENBQUM7QUFDM0gsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDbkcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkVBQTJFLENBQUM7QUFDeEgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUVBQWlFLENBQUM7QUFDekcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDbkcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQU8vRixNQUFNLE9BQU8sc0JBQXNCO0lBa0d2QjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0Q7SUFDQztJ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QUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7d0dBamxDVSxzQkFBc0I7NEZBQXRCLHNCQUFzQiwwREN0Qm5DLDh6NURBOHRCTTs7NEZEeHNCTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSwgUGFnZUluZm9TZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IFJlcXVlc3RDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi90YW5nby1tYW5hZ2UtYmlsbGluZy9yZXF1ZXN0LWNvbmZpcm1hdGlvbi9yZXF1ZXN0LWNvbmZpcm1hdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVnZXJhdGVJbnZvaWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvcmVnZXJhdGUtaW52b2ljZS9yZWdlcmF0ZS1pbnZvaWNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYXltZW50U3RhdHVzY2hhbmdlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvcGF5bWVudC1zdGF0dXNjaGFuZ2UvcGF5bWVudC1zdGF0dXNjaGFuZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IEVkaXRJbnZvaWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvZWRpdC1pbnZvaWNlL2VkaXQtaW52b2ljZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvZGVsZXRlLWNvbmZpcm1hdGlvbi9kZWxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDYW5jZWxJbnZvaWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvY2FuY2VsLWludm9pY2UvY2FuY2VsLWludm9pY2UuY29tcG9uZW50JztcbmltcG9ydCB7IEludm9pY2VMb2dzQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvaW52b2ljZS1sb2dzL2ludm9pY2UtbG9ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW52b2ljZVByZXZpZXdDb21wb25lbnQgfSBmcm9tICcuLi9pbnZvaWNlLXByZXZpZXcvaW52b2ljZS1wcmV2aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZW5kSW52b2ljZUVtYWlsQ29tcG9uZW50IH0gZnJvbSAnLi4vc2VuZC1pbnZvaWNlLWVtYWlsL3NlbmQtaW52b2ljZS1lbWFpbC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYnJhbmQtaW52b2ljZXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vYnJhbmQtaW52b2ljZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYnJhbmQtaW52b2ljZXMuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIEJyYW5kSW52b2ljZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGJyYW5kSWQ6IHN0cmluZyA9ICcnO1xuICBicmFuZE5hbWU6IHN0cmluZyA9ICcnO1xuICBsZW46IGFueTtcbiAgc2VhcmNoRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gSW52b2ljZXMgaXMgdGhlIGJyYW5kLWRldGFpbCBsYW5kaW5nIHRhYiAobWF0Y2hlcyB0aGUgcHJvdG90eXBlIHRhYiBvcmRlcjpcbiAgLy8gSW52b2ljZXMg4oaSIEVzdGltYXRlIOKGkiBCaWxsaW5nIEJyZWFrZG93biDihpIgUGxhbnMgJiBTdWJzY3JpcHRpb24g4oaSIEJpbGxpbmdcbiAgLy8gU2V0dGluZ3MpLlxuICBzZWxlY3RlZFRhYjogc3RyaW5nID0gJ2ludm9pY2VzJztcblxuICAvLyBDbGllbnQgaW5mb1xuICBjbGllbnRJbmZvOiBhbnkgPSB7fTtcblxuICAvLyBTdW1tYXJ5XG4gIHRvdGFsSW52b2ljZXM6IG51bWJlciA9IDA7XG4gIHRvdGFsSW52b2ljZWQ6IG51bWJlciA9IDA7XG4gIHBlbmRpbmdBcHByb3ZhbDogbnVtYmVyID0gMDtcbiAgcGVuZGluZ1BheW1lbnQ6IG51bWJlciA9IDA7XG4gIHBhaWQ6IG51bWJlciA9IDA7XG4gIC8vIEZvb3RlciB0b3RhbHMgb3ZlciB0aGUgZnVsbCBmaWx0ZXJlZCBzZXQgKGZyb20gYmFja2VuZCBzdW1tYXJ5KS5cbiAgdG90YWxTdG9yZXM6IG51bWJlciA9IDA7XG4gIHRvdGFsQW1vdW50RXhjbEdzdDogbnVtYmVyID0gMDtcbiAgdG90YWxBbW91bnRJbmNsR3N0OiBudW1iZXIgPSAwO1xuICAvLyBDcmVkaXQgbm90ZXMgcmFpc2VkIGFnYWluc3QgdGhlc2UgaW52b2ljZXMgKHRhbmdvIG9ubHkpLiBUaGV5IGRvbid0IHJlZHVjZVxuICAvLyBhbnkgaW52b2ljZSDigJQgdGhlIGZvb3RlciBsaXN0cyBlYWNoIG9uZSAoY3JlZGl0IGV4Y2wuIEdTVCwgaXRzIEdTVCwgaW5jbC5cbiAgLy8gR1NUKSBhbmQgYSBuZXQgdG90YWwgYWZ0ZXIgdGhlbTsgdGhlIHRvdGFscyBmZWVkIHRoYXQgbmV0IHJvdy5cbiAgY3JlZGl0Tm90ZXM6IGFueVtdID0gW107XG4gIHRvdGFsQ3JlZGl0OiBudW1iZXIgPSAwO1xuICB0b3RhbENyZWRpdEdzdDogbnVtYmVyID0gMDtcbiAgdG90YWxDcmVkaXRJbmNsR3N0OiBudW1iZXIgPSAwO1xuXG4gIC8vIFRhYmxlXG4gIGludm9pY2VMaXN0OiBhbnkgPSBbXTtcbiAgaW52b2ljZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBpbnZvaWNlTm9EYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIHRvdGFsSXRlbXM6IG51bWJlciA9IDA7XG4gIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgY3VycmVudFBhZ2U6IG51bWJlciA9IDE7XG4gIGl0ZW1zUGVyUGFnZTogbnVtYmVyID0gMTA7XG4gIHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwLCA1MCwgMTAwLCAxNTAsIDIwMCwgMjUwLCAzMDAsIDM1MCwgNDAwLCA0NTAsIDUwMF07XG4gIHNvcnRDb2x1bU5hbWU6IHN0cmluZyA9ICdiaWxsaW5nRGF0ZSc7XG4gIHNvcnRCeTogbnVtYmVyID0gLTE7XG4gIGFjdGl2ZUZpbHRlcjogc3RyaW5nID0gJ0FsbCc7XG4gIGZpbHRlclRhYnMgPSBbJ0FsbCcsICdQZW5kaW5nIEFwcHJvdmFsJywgJ1BlbmRpbmcgUGF5bWVudCcsICdQYWlkJywgJ0NhbmNlbGxlZCddO1xuICAvLyBJbnZvaWNlIHR5cGUgc3ViLXRvZ2dsZTogJ2FsbCcgPSByZWd1bGFyIElOVi0qLCAnYWR2YW5jZScgPSBUSU5WLSouXG4gIC8vICdjcmVkaXROb3RlJyBzd2FwcyB0aGUgaW52b2ljZSBsaXN0IGZvciB0aGUgYnJhbmQncyBDcmVkaXQgTm90ZXMgbGlzdC5cbiAgaW52b2ljZVR5cGU6ICdhbGwnIHwgJ2FkdmFuY2UnIHwgJ2NyZWRpdE5vdGUnID0gJ2FsbCc7XG4gIC8vIEhlYWRlciBjYXJkcyAoT3V0c3RhbmRpbmcgLyBPdmVyZHVlIC8gUGVuZGluZyBQYXltZW50KSBzcGxpdCBieSBHU1QsIGluIOKCuS5cbiAgaW52b2ljZUNhcmRzID0ge1xuICAgIG91dHN0YW5kaW5nRXhjbEFtb3VudDogMCwgb3V0c3RhbmRpbmdJbmNsQW1vdW50OiAwLCBvdXRzdGFuZGluZ0NvdW50OiAwLFxuICAgIG92ZXJkdWVFeGNsQW1vdW50OiAwLCBvdmVyZHVlSW5jbEFtb3VudDogMCwgb3ZlcmR1ZUNvdW50OiAwLFxuICAgIHBlbmRpbmdQYXltZW50RXhjbEFtb3VudDogMCwgcGVuZGluZ1BheW1lbnRJbmNsQW1vdW50OiAwLCBwZW5kaW5nUGF5bWVudENvdW50OiAwLFxuICB9O1xuXG4gIC8vIE9wZW5zIG9uIEN1cnJlbnQgTW9udGgsIGxpa2UgdGhlIEFsbCBJbnZvaWNlcyB0YWIgKGFuZCB0aGUgdmFsdWUgYSBjbGVhcmVkXG4gIC8vIER1cmF0aW9uIGZpbHRlciBmYWxscyBiYWNrIHRvIGJlbG93KS5cbiAgZHVyYXRpb25GaWx0ZXI6IHN0cmluZyA9ICdjdXJyZW50JztcblxuICAvLyBNdWx0aS1zZWxlY3QgYXBwcm92YWwgLyBkb3dubG9hZFxuICBzZWxlY3RlZEludm9pY2VzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgc2VsZWN0QWxsOiBib29sZWFuID0gZmFsc2U7XG4gIGJ1bGtBcHByb3Zpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYnVsa0Rvd25sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGJ1bGtFbWFpbGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEZsYXQgdXNlci1hY2Nlc3Mgb2JqZWN0LCBjYWNoZWQgZnJvbSBncy51c2VyQWNjZXNzLiBSZWFkcyBsaWtlXG4gIC8vIHVzZXJBY2Nlc3MuVGFuZ29BZG1pbl9jc21BcHByb3ZhbF9pc0VkaXQgZXRjLlxuICB1c2VyQWNjZXNzOiBhbnkgPSB7fTtcblxuICAvLyBDbGllbnQgdXNlcnMgc2VlIGEgcmVhZC1vbmx5LCByZXN0cmljdGVkIHZpZXc6IG9ubHkgSW52b2ljZXMgKyBQbGFucyAmXG4gIC8vIFN1YnNjcmlwdGlvbiB0YWJzLCBubyBlZGl0L2FjdGlvbiBjb250cm9scywgc2NvcGVkIHRvIHRoZWlyIG93biBjbGllbnRJZC5cbiAgaXNDbGllbnQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBtb250aEZpbHRlcjogc3RyaW5nID0gJyc7XG4gIHllYXJGaWx0ZXI6IHN0cmluZyA9ICcnO1xuXG4gIGludm9pY2VGaWx0ZXJPYmplY3QgPSBbXG4gICAgeyBEZXNjcmlwdGlvbjogJ1N0YXR1cycsIHR5cGU6ICdzaW5nbGUnLCBJc3N1ZXM6IFt7IGlkOiAncGVuZGluZ0FwcHJvdmFsJywgdGV4dDogJ1BlbmRpbmcgQXBwcm92YWwnIH0sIHsgaWQ6ICdwZW5kaW5nUGF5bWVudCcsIHRleHQ6ICdQZW5kaW5nIFBheW1lbnQnIH0sIHsgaWQ6ICdwYWlkJywgdGV4dDogJ1BhaWQnIH0sIHsgaWQ6ICdjYW5jZWxsZWQnLCB0ZXh0OiAnQ2FuY2VsbGVkJyB9XSB9LFxuICAgIHsgRGVzY3JpcHRpb246ICdEdXJhdGlvbicsIHR5cGU6ICdzaW5nbGUnLCBJc3N1ZXM6IFt7IGlkOiAnY3VycmVudCcsIHRleHQ6ICdDdXJyZW50IE1vbnRoJyB9LCB7IGlkOiAncHJldicsIHRleHQ6ICdQcmV2aW91cyBNb250aCcgfSwgeyBpZDogJ2xhc3QzJywgdGV4dDogJ0xhc3QgMyBNb250aHMnIH0sIHsgaWQ6ICdsYXN0NicsIHRleHQ6ICdMYXN0IDYgTW9udGhzJyB9LCB7IGlkOiAnbGFzdDEyJywgdGV4dDogJ0xhc3QgMSBZZWFyJyB9XSB9LFxuICAgIHsgRGVzY3JpcHRpb246ICdNb250aCcsIHR5cGU6ICdzaW5nbGUnLCBJc3N1ZXM6IFtcbiAgICAgIHsgaWQ6ICcxJywgdGV4dDogJ0phbnVhcnknIH0sIHsgaWQ6ICcyJywgdGV4dDogJ0ZlYnJ1YXJ5JyB9LCB7IGlkOiAnMycsIHRleHQ6ICdNYXJjaCcgfSxcbiAgICAgIHsgaWQ6ICc0JywgdGV4dDogJ0FwcmlsJyB9LCB7IGlkOiAnNScsIHRleHQ6ICdNYXknIH0sIHsgaWQ6ICc2JywgdGV4dDogJ0p1bmUnIH0sXG4gICAgICB7IGlkOiAnNycsIHRleHQ6ICdKdWx5JyB9LCB7IGlkOiAnOCcsIHRleHQ6ICdBdWd1c3QnIH0sIHsgaWQ6ICc5JywgdGV4dDogJ1NlcHRlbWJlcicgfSxcbiAgICAgIHsgaWQ6ICcxMCcsIHRleHQ6ICdPY3RvYmVyJyB9LCB7IGlkOiAnMTEnLCB0ZXh0OiAnTm92ZW1iZXInIH0sIHsgaWQ6ICcxMicsIHRleHQ6ICdEZWNlbWJlcicgfVxuICAgIF0gfSxcbiAgICB7IERlc2NyaXB0aW9uOiAnWWVhcicsIHR5cGU6ICdzaW5nbGUnLCBJc3N1ZXM6ICgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgICAgIGNvbnN0IHllYXJzOiB7IGlkOiBzdHJpbmc7IHRleHQ6IHN0cmluZyB9W10gPSBbXTtcbiAgICAgIGZvciAobGV0IHkgPSBjdXJyZW50WWVhciArIDE7IHkgPj0gY3VycmVudFllYXIgLSA1OyB5LS0pIHtcbiAgICAgICAgeWVhcnMucHVzaCh7IGlkOiBTdHJpbmcoeSksIHRleHQ6IFN0cmluZyh5KSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB5ZWFycztcbiAgICB9KSgpIH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHVibGljIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwYWdlSW5mbzogUGFnZUluZm9TZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbFxuICApIHtcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xuICAgICAgICB0aGlzLmJyYW5kSWQgPSBkYXRhLmNsaWVudDtcbiAgICAgICAgdGhpcy5sb2FkQ2xpZW50SW5mbygpO1xuICAgICAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIENhY2hlIHRoZSB1c2VyJ3MgZmxhdC1hY2Nlc3Mgb2JqZWN0IHNvIHN5bmNocm9ub3VzIG1ldGhvZHMgKGJ1bGsgZmlsdGVycyxcbiAgICAvLyBwZW5kaW5nSW5TZWxlY3Rpb24pIGNhbiBnYXRlIGJ5IHN0YWdlLXNwZWNpZmljIHBlcm1pc3Npb24gd2l0aG91dCBhc3luYy5cbiAgICB0aGlzLmdzLnVzZXJBY2Nlc3MucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoYWNjZXNzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMudXNlckFjY2VzcyA9IGFjY2VzcyB8fCB7fTtcbiAgICAgIHRoaXMuaXNDbGllbnQgPSAoYWNjZXNzPy51c2VyVHlwZSB8fCAnJykgPT09ICdjbGllbnQnO1xuICAgICAgLy8gQSBjbGllbnQgdXNlciBsYW5kcyBkaXJlY3RseSBvbiB0aGVpciBvd24gYnJhbmQgdmlldyAobm8gQnJhbmRzIGxpc3QgdG9cbiAgICAgIC8vIG5hdmlnYXRlIGZyb20pLCBzbyByZXNvbHZlIHRoZWlyIGNsaWVudElkIGZyb20gdGhlaXIgcHJvZmlsZSBhbmQgc2NvcGVcbiAgICAgIC8vIHRoZSB0YWJzIHRvIEludm9pY2VzICsgUGxhbnMgJiBTdWJzY3JpcHRpb24sIGRlZmF1bHRpbmcgdG8gSW52b2ljZXMuXG4gICAgICBpZiAodGhpcy5pc0NsaWVudCAmJiAhdGhpcy5icmFuZElkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdXNlckluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSB8fCAne30nKTtcbiAgICAgICAgICBpZiAodXNlckluZm8/LmNsaWVudElkKSB7XG4gICAgICAgICAgICB0aGlzLmJyYW5kSWQgPSBTdHJpbmcodXNlckluZm8uY2xpZW50SWQpO1xuICAgICAgICAgICAgaWYgKCFbJ2ludm9pY2VzJywgJ3BsYW5zLXN1YnNjcmlwdGlvbiddLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRUYWIpKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnaW52b2ljZXMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2FkQ2xpZW50SW5mbygpO1xuICAgICAgICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgbWFsZm9ybWVkIHVzZXItaW5mbyAqLyB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBUYWJzIGEgY2xpZW50IHVzZXIgaXMgYWxsb3dlZCB0byBzZWUgKGV2ZXJ5dGhpbmcgZm9yIHRhbmdvIHVzZXJzKS5cbiAgZ2V0IHZpc2libGVUYWJzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5pc0NsaWVudFxuICAgICAgPyBbJ2ludm9pY2VzJywgJ3BsYW5zLXN1YnNjcmlwdGlvbiddXG4gICAgICA6IFsnaW52b2ljZXMnLCAnZXN0aW1hdGUnLCAnZGFpbHktcHJpY2luZycsICdwbGFucy1zdWJzY3JpcHRpb24nLCAnYmlsbGluZy1ncm91cHMnLCAncHVyY2hhc2Utb3JkZXInXTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHNldFBhZ2VEYXRhKCkge1xuICAgIHRoaXMucGFnZUluZm8uc2V0VGl0bGUodGhpcy5icmFuZE5hbWUgfHwgJ0JyYW5kIEludm9pY2VzJyk7XG4gICAgdGhpcy5wYWdlSW5mby5zZXREZXNjcmlwdGlvbignVmlldyBhbmQgbWFuYWdlIGJyYW5kIGludm9pY2VzJyk7XG4gICAgdGhpcy5wYWdlSW5mby5zZXRCcmVhZGNydW1icyhbXG4gICAgICB7IHRpdGxlOiAnTWFuYWdlJywgcGF0aDogJy9tYW5hZ2UnLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiBmYWxzZSB9LFxuICAgICAgeyB0aXRsZTogJ01hbmFnZScsIHBhdGg6ICcvbWFuYWdlJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogdHJ1ZSB9LFxuICAgICAgeyB0aXRsZTogJ0JpbGxpbmcnLCBwYXRoOiAnL21hbmFnZS9iaWxsaW5nJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcbiAgICAgIHsgdGl0bGU6ICdCaWxsaW5nJywgcGF0aDogJy9tYW5hZ2UvYmlsbGluZycsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcbiAgICBdKTtcbiAgfVxuXG4gIGxvYWRDbGllbnRJbmZvKCkge1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0Q2xpZW50QmlsbGluZ0luZm8oeyBjbGllbnRJZDogdGhpcy5icmFuZElkIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXM/LmRhdGEpIHtcbiAgICAgICAgICB0aGlzLmNsaWVudEluZm8gPSByZXMuZGF0YTtcbiAgICAgICAgICB0aGlzLmJyYW5kTmFtZSA9IHRoaXMuY2xpZW50SW5mby5jbGllbnROYW1lIHx8ICcnO1xuICAgICAgICAgIHRoaXMuc2V0UGFnZURhdGEoKTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbG9hZEludm9pY2VzKCkge1xuICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmludm9pY2VMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmludm9pY2VOb0RhdGEgPSBmYWxzZTtcblxuICAgIGxldCBzdGF0dXNGaWx0ZXI6IGFueSA9IFtdO1xuICAgIGxldCBwYXltZW50U3RhdHVzRmlsdGVyOiBhbnkgPSBbXTtcblxuICAgIGlmICh0aGlzLmFjdGl2ZUZpbHRlciA9PT0gJ1BlbmRpbmcgQXBwcm92YWwnKSB7XG4gICAgICBzdGF0dXNGaWx0ZXIgPSBbJ3BlbmRpbmdDc20nLCAncGVuZGluZ0ZpbmFuY2UnLCAncGVuZGluZ0FwcHJvdmFsJ107XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZUZpbHRlciA9PT0gJ1BlbmRpbmcgUGF5bWVudCcpIHtcbiAgICAgIHN0YXR1c0ZpbHRlciA9IFsnYXBwcm92ZWQnXTtcbiAgICAgIHBheW1lbnRTdGF0dXNGaWx0ZXIgPSBbJ3VucGFpZCddO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVGaWx0ZXIgPT09ICdQYWlkJykge1xuICAgICAgcGF5bWVudFN0YXR1c0ZpbHRlciA9IFsncGFpZCddO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVGaWx0ZXIgPT09ICdDYW5jZWxsZWQnKSB7XG4gICAgICBzdGF0dXNGaWx0ZXIgPSBbJ2NhbmNlbGxlZCddO1xuICAgIH1cblxuICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgY2xpZW50SWQ6IHRoaXMuYnJhbmRJZCxcbiAgICAgIGxpbWl0OiB0aGlzLnBhZ2VTaXplLFxuICAgICAgb2Zmc2V0OiB0aGlzLmN1cnJlbnRQYWdlLFxuICAgICAgc2VhcmNoVmFsdWU6IHRoaXMubGVuLFxuICAgICAgc29ydENvbHVtTmFtZTogdGhpcy5zb3J0Q29sdW1OYW1lLFxuICAgICAgc29ydEJ5OiB0aGlzLnNvcnRCeSxcbiAgICAgIHN0YXR1czogc3RhdHVzRmlsdGVyLFxuICAgICAgcGF5bWVudFN0YXR1czogcGF5bWVudFN0YXR1c0ZpbHRlcixcbiAgICAgIGR1cmF0aW9uRmlsdGVyOiB0aGlzLmR1cmF0aW9uRmlsdGVyLFxuICAgICAgbW9udGhGaWx0ZXI6IHRoaXMubW9udGhGaWx0ZXIsXG4gICAgICB5ZWFyRmlsdGVyOiB0aGlzLnllYXJGaWx0ZXIsXG4gICAgICBpbnZvaWNlVHlwZTogdGhpcy5pbnZvaWNlVHlwZSxcbiAgICAgIGV4cG9ydDogZmFsc2VcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5icmFuZEludm9pY2VMaXN0KGZpbHRlcnMpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGUpID0+IHtcbiAgICAgICAgaWYgKGU/LmRhdGE/LmNvdW50KSB7XG4gICAgICAgICAgdGhpcy5pbnZvaWNlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaW52b2ljZU5vRGF0YSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaW52b2ljZUxpc3QgPSBlLmRhdGE/LmRhdGE7XG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gZS5kYXRhPy5jb3VudDtcblxuICAgICAgICAgIGlmIChlLmRhdGE/LmNsaWVudEluZm8pIHtcbiAgICAgICAgICAgIHRoaXMuY2xpZW50SW5mbyA9IGUuZGF0YS5jbGllbnRJbmZvO1xuICAgICAgICAgICAgdGhpcy5icmFuZE5hbWUgPSB0aGlzLmNsaWVudEluZm8uY2xpZW50TmFtZSB8fCAnJztcbiAgICAgICAgICAgIHRoaXMuc2V0UGFnZURhdGEoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gZS5kYXRhPy5zdW1tYXJ5O1xuICAgICAgICAgIGlmIChzdW1tYXJ5KSB7XG4gICAgICAgICAgICB0aGlzLnRvdGFsSW52b2ljZXMgPSBzdW1tYXJ5LnRvdGFsSW52b2ljZXMgfHwgMDtcbiAgICAgICAgICAgIHRoaXMudG90YWxJbnZvaWNlZCA9IHN1bW1hcnkudG90YWxJbnZvaWNlZCB8fCAwO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQXBwcm92YWwgPSBzdW1tYXJ5LnBlbmRpbmdBcHByb3ZhbCB8fCAwO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUGF5bWVudCA9IHN1bW1hcnkucGVuZGluZ1BheW1lbnQgfHwgMDtcbiAgICAgICAgICAgIHRoaXMucGFpZCA9IHN1bW1hcnkucGFpZCB8fCAwO1xuICAgICAgICAgICAgdGhpcy50b3RhbFN0b3JlcyA9IHN1bW1hcnkudG90YWxTdG9yZXMgfHwgMDtcbiAgICAgICAgICAgIHRoaXMudG90YWxBbW91bnRFeGNsR3N0ID0gc3VtbWFyeS50b3RhbEFtb3VudEV4Y2xHc3QgfHwgMDtcbiAgICAgICAgICAgIHRoaXMudG90YWxBbW91bnRJbmNsR3N0ID0gc3VtbWFyeS50b3RhbEFtb3VudEluY2xHc3QgfHwgMDtcbiAgICAgICAgICAgIHRoaXMuY3JlZGl0Tm90ZXMgPSBzdW1tYXJ5LmNyZWRpdE5vdGVzIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy50b3RhbENyZWRpdCA9IHN1bW1hcnkudG90YWxDcmVkaXQgfHwgMDtcbiAgICAgICAgICAgIHRoaXMudG90YWxDcmVkaXRHc3QgPSBzdW1tYXJ5LnRvdGFsQ3JlZGl0R3N0IHx8IDA7XG4gICAgICAgICAgICB0aGlzLnRvdGFsQ3JlZGl0SW5jbEdzdCA9IHN1bW1hcnkudG90YWxDcmVkaXRJbmNsR3N0IHx8IDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY2FyZHMgPSBlLmRhdGE/LmNhcmRzO1xuICAgICAgICAgIGlmIChjYXJkcykge1xuICAgICAgICAgICAgdGhpcy5pbnZvaWNlQ2FyZHMgPSB7XG4gICAgICAgICAgICAgIG91dHN0YW5kaW5nRXhjbEFtb3VudDogY2FyZHMub3V0c3RhbmRpbmdFeGNsQW1vdW50IHx8IDAsXG4gICAgICAgICAgICAgIG91dHN0YW5kaW5nSW5jbEFtb3VudDogY2FyZHMub3V0c3RhbmRpbmdJbmNsQW1vdW50IHx8IDAsXG4gICAgICAgICAgICAgIG91dHN0YW5kaW5nQ291bnQ6IGNhcmRzLm91dHN0YW5kaW5nQ291bnQgfHwgMCxcbiAgICAgICAgICAgICAgb3ZlcmR1ZUV4Y2xBbW91bnQ6IGNhcmRzLm92ZXJkdWVFeGNsQW1vdW50IHx8IDAsXG4gICAgICAgICAgICAgIG92ZXJkdWVJbmNsQW1vdW50OiBjYXJkcy5vdmVyZHVlSW5jbEFtb3VudCB8fCAwLFxuICAgICAgICAgICAgICBvdmVyZHVlQ291bnQ6IGNhcmRzLm92ZXJkdWVDb3VudCB8fCAwLFxuICAgICAgICAgICAgICBwZW5kaW5nUGF5bWVudEV4Y2xBbW91bnQ6IGNhcmRzLnBlbmRpbmdQYXltZW50RXhjbEFtb3VudCB8fCAwLFxuICAgICAgICAgICAgICBwZW5kaW5nUGF5bWVudEluY2xBbW91bnQ6IGNhcmRzLnBlbmRpbmdQYXltZW50SW5jbEFtb3VudCB8fCAwLFxuICAgICAgICAgICAgICBwZW5kaW5nUGF5bWVudENvdW50OiBjYXJkcy5wZW5kaW5nUGF5bWVudENvdW50IHx8IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaW52b2ljZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmludm9pY2VOb0RhdGEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIGlmICh0aGlzLmxlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaW52b2ljZUxpc3QgPSBbXTtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAgIC8vIE5vIGludm9pY2VzIGZvciB0aGUgY3VycmVudCBmaWx0ZXIvdG9nZ2xlIOKAlCB6ZXJvIG91dCB0aGUgY2FyZHMgYW5kXG4gICAgICAgICAgLy8gc3VtbWFyeSBjb3VudGVycyBzbyB0aGV5IGRvbid0IHNob3cgc3RhbGUgdmFsdWVzIGZyb20gYSBwcmlvciBsb2FkLlxuICAgICAgICAgIHRoaXMucmVzZXRJbnZvaWNlU3VtbWFyeSgpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlKSA9PiB7XG4gICAgICAgIHRoaXMuaW52b2ljZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnZvaWNlTm9EYXRhID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbnZvaWNlTGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAvLyBBIDIwNCAobm8gZGF0YSkgY2FuIHN1cmZhY2UgaGVyZSB0b28g4oCUIHJlc2V0IHRoZSBjYXJkcy9zdW1tYXJ5LlxuICAgICAgICB0aGlzLnJlc2V0SW52b2ljZVN1bW1hcnkoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBaZXJvIHRoZSBoZWFkZXIgY2FyZHMgKyBzdW1tYXJ5IGNvdW50ZXJzICh1c2VkIHdoZW4gdGhlIGxpc3QgaGFzIG5vIGRhdGEpLlxuICBwcml2YXRlIHJlc2V0SW52b2ljZVN1bW1hcnkoKSB7XG4gICAgdGhpcy5pbnZvaWNlQ2FyZHMgPSB7XG4gICAgICBvdXRzdGFuZGluZ0V4Y2xBbW91bnQ6IDAsIG91dHN0YW5kaW5nSW5jbEFtb3VudDogMCwgb3V0c3RhbmRpbmdDb3VudDogMCxcbiAgICAgIG92ZXJkdWVFeGNsQW1vdW50OiAwLCBvdmVyZHVlSW5jbEFtb3VudDogMCwgb3ZlcmR1ZUNvdW50OiAwLFxuICAgICAgcGVuZGluZ1BheW1lbnRFeGNsQW1vdW50OiAwLCBwZW5kaW5nUGF5bWVudEluY2xBbW91bnQ6IDAsIHBlbmRpbmdQYXltZW50Q291bnQ6IDAsXG4gICAgfTtcbiAgICB0aGlzLnRvdGFsSW52b2ljZXMgPSAwO1xuICAgIHRoaXMudG90YWxJbnZvaWNlZCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nQXBwcm92YWwgPSAwO1xuICAgIHRoaXMucGVuZGluZ1BheW1lbnQgPSAwO1xuICAgIHRoaXMucGFpZCA9IDA7XG4gICAgdGhpcy50b3RhbFN0b3JlcyA9IDA7XG4gICAgdGhpcy50b3RhbEFtb3VudEV4Y2xHc3QgPSAwO1xuICAgIHRoaXMudG90YWxBbW91bnRJbmNsR3N0ID0gMDtcbiAgICB0aGlzLmNyZWRpdE5vdGVzID0gW107XG4gICAgdGhpcy50b3RhbENyZWRpdCA9IDA7XG4gICAgdGhpcy50b3RhbENyZWRpdEdzdCA9IDA7XG4gICAgdGhpcy50b3RhbENyZWRpdEluY2xHc3QgPSAwO1xuICB9XG5cbiAgc2V0RmlsdGVyKGZpbHRlcjogc3RyaW5nKSB7XG4gICAgdGhpcy5hY3RpdmVGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgfVxuXG4gIC8vIEludm9pY2UgdHlwZSBzdWItdG9nZ2xlOiBhbGwgKHJlZ3VsYXIpIHZzIGFkdmFuY2UgKFRJTlYtKikuIFJlbG9hZHMgdGhlIGxpc3QsXG4gIC8vIHN1bW1hcnkgYW5kIGNhcmRzLiBDcmVkaXQgTm90ZXMgaXMgaXRzIG93biBjb21wb25lbnQgdGhhdCBsb2FkcyBpdHNlbGYuXG4gIHNlbGVjdEludm9pY2VUeXBlKHR5cGU6ICdhbGwnIHwgJ2FkdmFuY2UnIHwgJ2NyZWRpdE5vdGUnKSB7XG4gICAgaWYgKHRoaXMuaW52b2ljZVR5cGUgPT09IHR5cGUpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5pbnZvaWNlVHlwZSA9IHR5cGU7XG4gICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmNsZWFyKCk7XG4gICAgdGhpcy5zZWxlY3RBbGwgPSBmYWxzZTtcbiAgICBpZiAodHlwZSA9PT0gJ2NyZWRpdE5vdGUnKSB7IHJldHVybjsgfVxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gIH1cblxuICBzZWFyY2hGaWVsZCgpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICB9XG5cbiAgc29ydERhdGEoY29sdW1uOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNvcnRDb2x1bU5hbWUgPSBjb2x1bW47XG4gICAgdGhpcy5zb3J0QnkgKj0gLTE7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShwYWdlT2Zmc2V0OiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFyc2VJbnQocGFnZU9mZnNldCk7XG4gICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgfVxuXG4gIG9uUGFnZVNpemVDaGFuZ2UocGFnZVNpemU6IGFueSkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMucGFnZVNpemUgPSBwYXJzZUludChwYWdlU2l6ZSk7XG4gICAgLy8gS2VlcCBpdGVtc1BlclBhZ2UgaW4gc3luYyB3aXRoIHRoZSBjaG9zZW4gc2l6ZSDigJQgdGhlIHBhZ2luYXRpb24gY29udHJvbFxuICAgIC8vIGRlcml2ZXMgaXRzIHBhZ2UgY291bnQgZnJvbSBpdGVtc1BlclBhZ2UsIHNvIGEgc3RhbGUgdmFsdWUgKGFsd2F5cyAxMClcbiAgICAvLyBtYWRlIHRoZSBwYWdlIG51bWJlcnMgd3JvbmcgZm9yIGFueSBzaXplIG90aGVyIHRoYW4gMTAuXG4gICAgdGhpcy5pdGVtc1BlclBhZ2UgPSB0aGlzLnBhZ2VTaXplO1xuICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gIH1cblxuICBvbkV4cG9ydCgpIHtcbiAgICBsZXQgc3RhdHVzRmlsdGVyOiBhbnkgPSBbXTtcbiAgICBsZXQgcGF5bWVudFN0YXR1c0ZpbHRlcjogYW55ID0gW107XG5cbiAgICBpZiAodGhpcy5hY3RpdmVGaWx0ZXIgPT09ICdQZW5kaW5nIEFwcHJvdmFsJykge1xuICAgICAgc3RhdHVzRmlsdGVyID0gWydwZW5kaW5nQ3NtJywgJ3BlbmRpbmdGaW5hbmNlJywgJ3BlbmRpbmdBcHByb3ZhbCddO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVGaWx0ZXIgPT09ICdQZW5kaW5nIFBheW1lbnQnKSB7XG4gICAgICBzdGF0dXNGaWx0ZXIgPSBbJ2FwcHJvdmVkJ107XG4gICAgICBwYXltZW50U3RhdHVzRmlsdGVyID0gWyd1bnBhaWQnXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlRmlsdGVyID09PSAnUGFpZCcpIHtcbiAgICAgIHBheW1lbnRTdGF0dXNGaWx0ZXIgPSBbJ3BhaWQnXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlRmlsdGVyID09PSAnQ2FuY2VsbGVkJykge1xuICAgICAgc3RhdHVzRmlsdGVyID0gWydjYW5jZWxsZWQnXTtcbiAgICB9XG5cbiAgICBsZXQgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmJyYW5kSWQsXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5sZW4sXG4gICAgICBzb3J0Q29sdW1OYW1lOiB0aGlzLnNvcnRDb2x1bU5hbWUsXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgICAgc3RhdHVzOiBzdGF0dXNGaWx0ZXIsXG4gICAgICBwYXltZW50U3RhdHVzOiBwYXltZW50U3RhdHVzRmlsdGVyLFxuICAgICAgZHVyYXRpb25GaWx0ZXI6IHRoaXMuZHVyYXRpb25GaWx0ZXIsXG4gICAgICBtb250aEZpbHRlcjogdGhpcy5tb250aEZpbHRlcixcbiAgICAgIHllYXJGaWx0ZXI6IHRoaXMueWVhckZpbHRlcixcbiAgICAgIGludm9pY2VUeXBlOiB0aGlzLmludm9pY2VUeXBlLFxuICAgICAgZXhwb3J0OiB0cnVlXG4gICAgfTtcblxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYnJhbmRJbnZvaWNlTGlzdEV4cG9ydChmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5zYXZlQXNFeGNlbEZpbGUocmVzLCAnYnJhbmQtaW52b2ljZXMnKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGUpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdTb21ldGhpbmcgd2VudCBXcm9uZy4uJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhcHBseUludm9pY2VGaWx0ZXJzKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoZXZlbnQ/Lmxlbmd0aCkge1xuICAgICAgZXZlbnQuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LkRlc2NyaXB0aW9uID09PSAnU3RhdHVzJykge1xuICAgICAgICAgIGlmIChlbGVtZW50Lklzc3Vlcz8uaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gZWxlbWVudC5Jc3N1ZXMuaWQ7XG4gICAgICAgICAgICBpZiAoaWQgPT09ICdwZW5kaW5nQXBwcm92YWwnKSB0aGlzLmFjdGl2ZUZpbHRlciA9ICdQZW5kaW5nIEFwcHJvdmFsJztcbiAgICAgICAgICAgIGVsc2UgaWYgKGlkID09PSAncGVuZGluZ1BheW1lbnQnKSB0aGlzLmFjdGl2ZUZpbHRlciA9ICdQZW5kaW5nIFBheW1lbnQnO1xuICAgICAgICAgICAgZWxzZSBpZiAoaWQgPT09ICdwYWlkJykgdGhpcy5hY3RpdmVGaWx0ZXIgPSAnUGFpZCc7XG4gICAgICAgICAgICBlbHNlIGlmIChpZCA9PT0gJ2NhbmNlbGxlZCcpIHRoaXMuYWN0aXZlRmlsdGVyID0gJ0NhbmNlbGxlZCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRmlsdGVyID0gJ0FsbCc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50LkRlc2NyaXB0aW9uID09PSAnRHVyYXRpb24nKSB7XG4gICAgICAgICAgdGhpcy5kdXJhdGlvbkZpbHRlciA9IGVsZW1lbnQuSXNzdWVzPy5pZCB8fCAnY3VycmVudCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQuRGVzY3JpcHRpb24gPT09ICdNb250aCcpIHtcbiAgICAgICAgICB0aGlzLm1vbnRoRmlsdGVyID0gZWxlbWVudC5Jc3N1ZXM/LmlkIHx8ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50LkRlc2NyaXB0aW9uID09PSAnWWVhcicpIHtcbiAgICAgICAgICB0aGlzLnllYXJGaWx0ZXIgPSBlbGVtZW50Lklzc3Vlcz8uaWQgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRJbnZvaWNlcygpO1xuICB9XG5cbiAgZ2V0SW52b2ljZVN0YXR1cyhpbnZvaWNlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChpbnZvaWNlLnN0YXR1cyA9PT0gJ2NhbmNlbGxlZCcpIHJldHVybiAnQ2FuY2VsbGVkJztcbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nQ3NtJykgcmV0dXJuICdQZW5kaW5nIENTTSc7XG4gICAgaWYgKGludm9pY2Uuc3RhdHVzID09PSAncGVuZGluZ0ZpbmFuY2UnKSByZXR1cm4gJ1BlbmRpbmcgRmluYW5jZSc7XG4gICAgaWYgKGludm9pY2Uuc3RhdHVzID09PSAncGVuZGluZ0FwcHJvdmFsJykgcmV0dXJuICdQZW5kaW5nIEFwcHJvdmFsJztcbiAgICAvLyBMZWdhY3kgcHJlLXBpcGVsaW5lIHZhbHVlLCBqdXN0IGluIGNhc2UgdW4tbWlncmF0ZWQgcm93cyBzdGlsbCBleGlzdC5cbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nJykgcmV0dXJuICdQZW5kaW5nIEFwcHJvdmFsJztcbiAgICBpZiAoaW52b2ljZS5wYXltZW50U3RhdHVzID09PSAncGFydGlhbCcpIHJldHVybiAnUGFydGlhbCc7XG4gICAgaWYgKGludm9pY2UucGF5bWVudFN0YXR1cyA9PT0gJ3VucGFpZCcpIHJldHVybiAnUGVuZGluZyBQYXltZW50JztcbiAgICBpZiAoaW52b2ljZS5wYXltZW50U3RhdHVzID09PSAncGFpZCcpIHJldHVybiAnUGFpZCc7XG4gICAgcmV0dXJuIGludm9pY2Uuc3RhdHVzO1xuICB9XG5cbiAgZ2V0U3RhdHVzQ2xhc3MoaW52b2ljZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdjYW5jZWxsZWQnKSByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LWRlZmF1bHQnO1xuICAgIGlmIChpbnZvaWNlLnN0YXR1cyA9PT0gJ3BlbmRpbmdDc20nKSByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LXdhcm5pbmcnO1xuICAgIGlmIChpbnZvaWNlLnN0YXR1cyA9PT0gJ3BlbmRpbmdGaW5hbmNlJykgcmV0dXJuICdiYWRnZSBiYWRnZS1saWdodC1pbmZvJztcbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nQXBwcm92YWwnKSByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LWRhcmsnO1xuICAgIC8vIExlZ2FjeSBwcmUtcGlwZWxpbmUgdmFsdWUgZmFsbHMgYmFjayB0byB0aGUgb3JpZ2luYWwgd2FybmluZyBzdHlsZS5cbiAgICBpZiAoaW52b2ljZS5zdGF0dXMgPT09ICdwZW5kaW5nJykgcmV0dXJuICdiYWRnZSBiYWRnZS1saWdodC13YXJuaW5nJztcbiAgICBpZiAoaW52b2ljZS5wYXltZW50U3RhdHVzID09PSAncGFpZCcpIHJldHVybiAnYmFkZ2UgYmFkZ2UtbGlnaHQtc3VjY2Vzcyc7XG4gICAgaWYgKGludm9pY2UucGF5bWVudFN0YXR1cyA9PT0gJ3BhcnRpYWwnKSByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LXdhcm5pbmcnO1xuICAgIGlmIChpbnZvaWNlLnBheW1lbnRTdGF0dXMgPT09ICd1bnBhaWQnKSByZXR1cm4gJ2JhZGdlIGJhZGdlLWxpZ2h0LXByaW1hcnknO1xuICAgIHJldHVybiAnYmFkZ2UgYmFkZ2UtbGlnaHQtZGFuZ2VyJztcbiAgfVxuXG4gIC8vIE91dHN0YW5kaW5nIGJhbGFuY2Ugb24gdGhpcyBpbnZvaWNlLiBVc2VkIHRvIHJlbmRlciBhbiBpbmxpbmVcbiAgLy8gXCLigrkgWCBwZW5kaW5nXCIgbm90ZSB1bmRlciB0aGUgc3RhdHVzIGJhZGdlIHNvIHJldmlld2VycyBzZWUgdGhlXG4gIC8vIHNob3J0ZmFsbCBhdCBhIGdsYW5jZS5cbiAgcGVuZGluZ0Ftb3VudChpbnZvaWNlOiBhbnkpOiBudW1iZXIge1xuICAgIGNvbnN0IHRvdGFsID0gTnVtYmVyKGludm9pY2U/LnRvdGFsQW1vdW50KSB8fCAwO1xuICAgIGNvbnN0IHBhaWQgPSBOdW1iZXIoaW52b2ljZT8ucGFpZEFtb3VudCkgfHwgMDtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCgodG90YWwgLSBwYWlkKSAqIDEwMCkgLyAxMDApO1xuICB9XG5cbiAgaGFzUGVuZGluZyhpbnZvaWNlOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYWlkID0gTnVtYmVyKGludm9pY2U/LnBhaWRBbW91bnQpIHx8IDA7XG4gICAgcmV0dXJuIHBhaWQgPiAwICYmIHRoaXMucGVuZGluZ0Ftb3VudChpbnZvaWNlKSA+IDA7XG4gIH1cblxuICAvLyBHU1QgY29sdW1uIOKAlCBzYW1lIHJ1bGUgYXMgdGhlIEFsbCBJbnZvaWNlcyBwYWdlOiBpbmNsLiDiiJIgZXhjbC4gR1NULCBhbmRcbiAgLy8gb25seSBJTlIgaW52b2ljZXMgY2FycnkgR1NUIChvdGhlcnMgc2hvdyBhIGRhc2gpLlxuICBnc3RBbW91bnQoaW52b2ljZTogYW55KTogbnVtYmVyIHtcbiAgICBjb25zdCB0b3RhbCA9IE51bWJlcihpbnZvaWNlPy50b3RhbEFtb3VudCkgfHwgMDtcbiAgICBjb25zdCBhbW91bnQgPSBOdW1iZXIoaW52b2ljZT8uYW1vdW50KSB8fCAwO1xuICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKCh0b3RhbCAtIGFtb3VudCkgKiAxMDApIC8gMTAwKTtcbiAgfVxuXG4gIGlzR3N0QXBwbGljYWJsZShpbnZvaWNlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGludm9pY2U/LmN1cnJlbmN5IHx8ICdpbnInKSA9PT0gJ2lucic7XG4gIH1cblxuICAvLyBGb290ZXI6IEdTVCBvbiB0aGUgaW52b2ljZXMsIGFuZCB0aGUgbmV0IHRvdGFsIG9uY2UgdGhlIGNyZWRpdCBub3RlcydcbiAgLy8gY3JlZGl0ICh3aXRoIGl0cyBHU1QpIGlzIHRha2VuIG9mZiB0aGUgaW52b2ljZSB0b3RhbHMuXG4gIGdldCB0b3RhbEdzdCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCh0aGlzLnRvdGFsQW1vdW50SW5jbEdzdCAtIHRoaXMudG90YWxBbW91bnRFeGNsR3N0KSAqIDEwMCkgLyAxMDA7XG4gIH1cblxuICBnZXQgbmV0QW1vdW50RXhjbEdzdCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCh0aGlzLnRvdGFsQW1vdW50RXhjbEdzdCAtIHRoaXMudG90YWxDcmVkaXQpICogMTAwKSAvIDEwMDtcbiAgfVxuXG4gIGdldCBuZXRHc3QoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgodGhpcy50b3RhbEdzdCAtIHRoaXMudG90YWxDcmVkaXRHc3QpICogMTAwKSAvIDEwMDtcbiAgfVxuXG4gIGdldCBuZXRBbW91bnRJbmNsR3N0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoKHRoaXMudG90YWxBbW91bnRJbmNsR3N0IC0gdGhpcy50b3RhbENyZWRpdEluY2xHc3QpICogMTAwKSAvIDEwMDtcbiAgfVxuXG4gIC8vIE1pcnJvciB0aGUgYmFja2VuZCBzeW1ib2wgbWFwIHNvIGVhY2ggaW52b2ljZSByb3cgcmVuZGVycyBpbiBpdHMgb3duXG4gIC8vIGN1cnJlbmN5ICh3YXMgaGFyZGNvZGVkIHRvIOKCuSkuXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVuY3lTeW1ib2xzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGlucjogJ+KCuScsXG4gICAgZG9sbGFyOiAnJCcsXG4gICAgc2luZ2Fwb3JlZG9sbGFyOiAnUyQnLFxuICAgIGV1cm86ICfigqwnLFxuICAgIGFlZDogJ0FFRCcsXG4gIH07XG5cbiAgaW52b2ljZUN1cnJlbmN5U3ltYm9sKGludjogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW5jeVN5bWJvbHNbaW52Py5jdXJyZW5jeSB8fCAnJ10gfHwgJyQnO1xuICB9XG5cbiAgLy8gRWRpdCBsb2NrIOKAlCBhIGZpbmFsLWFwcHJvdmVkIGludm9pY2UgbXVzdCBub3QgYmUgZWRpdGVkLiBUaGUgYmFja2VuZFxuICAvLyAodXBkYXRlSW52b2ljZSkgZW5mb3JjZXMgdGhlIHNhbWUgY2hlY2sgc28gdGhlIGxvY2sgY2FuJ3QgYmUgYnlwYXNzZWQgYnlcbiAgLy8gaGl0dGluZyB0aGUgQVBJIGRpcmVjdGx5LlxuICBpc0ludm9pY2VMb2NrZWQoaW52OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW52Py5zdGF0dXMgPT09ICdhcHByb3ZlZCcgfHwgaW52Py5zdGF0dXMgPT09ICdjYW5jZWxsZWQnO1xuICB9XG5cbiAgLy8gT25jZSB0aGUgQ1NNIGhhcyBhcHByb3ZlZCAoYW5kIHNvIGFsc28gb25jZSBmaW5hbmNlIGFwcHJvdmFsIGlzc3VlcyB0aGVcbiAgLy8gcmVhbCBJTlYvVElOViBudW1iZXIpLCBvbmx5IEZpbmFuY2UgLyBJbnZvaWNlIGFwcHJvdmVycyDigJQgb3Igc3VwZXJhZG1pbnMg4oCUXG4gIC8vIG1heSBlZGl0LiBUaGUgc2VydmVyIGVuZm9yY2VzIHRoZSBzYW1lICh1cGRhdGVJbnZvaWNlIC8gYXBwbHlEaXNjb3VudCAvXG4gIC8vIG9uZS10aW1lIGZlZSkuXG4gIGlzRWRpdEJsb2NrZWQoaW52OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0ludm9pY2VMb2NrZWQoaW52KSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgcGFzdENzbSA9ICFbJ3BlbmRpbmdDc20nLCAncGVuZGluZyddLmluY2x1ZGVzKGludj8uc3RhdHVzKSB8fCAhU3RyaW5nKGludj8uaW52b2ljZSB8fCAnJykuc3RhcnRzV2l0aCgnRFJBRlQtJyk7XG4gICAgcmV0dXJuIHBhc3RDc20gJiYgIXRoaXMuaGFzQXBwcm92ZXJBY2Nlc3M7XG4gIH1cblxuICBlZGl0VG9vbHRpcChpbnY6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNJbnZvaWNlTG9ja2VkKGludikpIHJldHVybiAnQXBwcm92ZWQgaW52b2ljZSDigJQgZWRpdGluZyBpcyBkaXNhYmxlZCc7XG4gICAgaWYgKHRoaXMuaXNFZGl0QmxvY2tlZChpbnYpKSByZXR1cm4gJ0NTTSBhcHByb3ZlZCDigJQgb25seSBGaW5hbmNlIC8gSW52b2ljZSBhcHByb3ZlcnMgY2FuIGVkaXQnO1xuICAgIHJldHVybiAnRWRpdCBJbnZvaWNlJztcbiAgfVxuXG4gIC8vIEZpbmFuY2UgQXBwcm92YWwgT1IgSW52b2ljZSBBcHByb3ZhbCAoZWRpdCksIG9yIHN1cGVyYWRtaW4uIEdhdGVzIGVkaXRpbmdcbiAgLy8gYW4gaXNzdWVkIGludm9pY2UsIFJlZ2VuZXJhdGUsIGFuZCBjcmVkaXQtbm90ZSBlZGl0cyDigJQgdGhlIHNlcnZlciBlbmZvcmNlc1xuICAvLyB0aGUgc2FtZSBvbiB0aG9zZSBlbmRwb2ludHMuXG4gIGdldCBoYXNBcHByb3ZlckFjY2VzcygpOiBib29sZWFuIHtcbiAgICBjb25zdCBhID0gdGhpcy51c2VyQWNjZXNzIHx8IHt9O1xuICAgIHJldHVybiBhLnJvbGUgPT09ICdzdXBlcmFkbWluJyB8fCAhIWEuVGFuZ29BZG1pbl9maW5hbmNlQXBwcm92YWxfaXNFZGl0IHx8ICEhYS5UYW5nb0FkbWluX2ludm9pY2VBcHByb3ZhbF9pc0VkaXQ7XG4gIH1cblxuICAvLyBUaGUgcm93cyBvbmx5IGNhcnJ5IGxpc3QgZmllbGRzOyB0aGUgZWRpdCBmb3JtIG5lZWRzIHRoZSBmdWxsIGNyZWRpdCBub3RlLlxuICBlZGl0Q3JlZGl0Tm90ZShjbjogYW55KSB7XG4gICAgaWYgKCF0aGlzLmhhc0FwcHJvdmVyQWNjZXNzKSByZXR1cm47XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5nZXRDcmVkaXROb3RlKGNuLl9pZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEVkaXRJbnZvaWNlQ29tcG9uZW50LCB7XG4gICAgICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5tb2RlID0gJ2VkaXRDcmVkaXROb3RlJztcbiAgICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xpZW50SWQgPSBjbi5jbGllbnRJZCB8fCB0aGlzLmJyYW5kSWQ7XG4gICAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmludm9pY2VEYXRhID0gcmVzPy5kYXRhO1xuICAgICAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSAndXBkYXRlZCcpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4gdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBsb2FkIGNyZWRpdCBub3RlJyksXG4gICAgfSk7XG4gIH1cblxuICBkb3dubG9hZENyZWRpdE5vdGUoY246IGFueSkge1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZG93bmxvYWRDcmVkaXROb3RlKGNuLl9pZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoYnVmOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnIH0pO1xuICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICAgIGEuZG93bmxvYWQgPSBgJHtjbi5jcmVkaXROb3RlfS5wZGZgO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOyBhLmNsaWNrKCk7IGEucmVtb3ZlKCk7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gZG93bmxvYWQgY3JlZGl0IG5vdGUnKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFNhbWUgRmluYW5jZSAvIEludm9pY2UgYXBwcm92ZXIgcnVsZSBhcyBlZGl0aW5nOyB0aGUgc2VydmVyIGVuZm9yY2VzIGl0LlxuICBkZWxldGVDcmVkaXROb3RlKGNuOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuaGFzQXBwcm92ZXJBY2Nlc3MpIHJldHVybjtcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9ICdEZWxldGUgQ3JlZGl0IE5vdGU/JztcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICR7Y24uY3JlZGl0Tm90ZX0/IFRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuYDtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdZZXMnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZGVsZXRlQ3JlZGl0Tm90ZShjbi5faWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdDcmVkaXQgbm90ZSBkZWxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZGVsZXRlIGNyZWRpdCBub3RlJyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIC8vIERlbGV0ZSBsb2NrIOKAlCBvbmNlIGEgcmVhbCBpbnZvaWNlIG51bWJlciBoYXMgYmVlbiBtaW50ZWQgKGF0IGZpbmFuY2VcbiAgLy8gYXBwcm92YWwpLCB0aGUgaW52b2ljZSBjYW4gbm8gbG9uZ2VyIGJlIGRlbGV0ZWQ7IGRlbGV0aW5nIGl0IHdvdWxkIHJlb3BlbiBhXG4gIC8vIGdhcCBpbiB0aGUgZ2FwbGVzcyBJTlYvVElOViBzZXJpZXMuIE9ubHkgcHJlLWZpbmFuY2UgZHJhZnRzIChudW1iZXIgc3RpbGxcbiAgLy8gc3RhcnRzIHdpdGggRFJBRlQtKSBhcmUgZGVsZXRhYmxlLiBCYWNrZW5kIGRlbGV0ZUludm9pY2UgZW5mb3JjZXMgdGhlIHNhbWUuXG4gIC8vIENhbmNlbGxlZCBpbnZvaWNlcyBhcmUgYWxzbyBsb2NrZWQg4oCUIHRoZXkncmUgdGVybWluYWwsIG5vdCBkZWxldGFibGUuXG4gIGlzRGVsZXRlTG9ja2VkKGludjogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKGludj8uc3RhdHVzID09PSAnY2FuY2VsbGVkJykgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgbnVtID0gaW52Py5pbnZvaWNlIHx8ICcnO1xuICAgIHJldHVybiAhKHR5cGVvZiBudW0gPT09ICdzdHJpbmcnICYmIG51bS5zdGFydHNXaXRoKCdEUkFGVC0nKSk7XG4gIH1cblxuICAvLyBDYW5jZWxsYWJsZSBvbmx5IHdoaWxlIGFwcHJvdmVkIGFuZCBzdGlsbCB1bnBhaWQg4oCUIG1hdGNoZXMgdGhlIGJhY2tlbmQnc1xuICAvLyBvd24gZ2F0ZSBpbiBjYW5jZWxJbnZvaWNlLlxuICBjYW5DYW5jZWxJbnZvaWNlKGludjogYW55KTogYm9vbGVhbiB7XG4gICAgLy8gQ2FuY2VsbGFibGUgb25jZSB0aGUgaW52b2ljZSBudW1iZXIgaXMgbWludGVkIChwZW5kaW5nQXBwcm92YWwgYW5kXG4gICAgLy8gYXBwcm92ZWQpIHdoaWxlIHN0aWxsIHVucGFpZCDigJQgbWlycm9ycyB0aGUgYmFja2VuZCBjYW5jZWxJbnZvaWNlIGd1YXJkLlxuICAgIHJldHVybiAoaW52Py5zdGF0dXMgPT09ICdhcHByb3ZlZCcgfHwgaW52Py5zdGF0dXMgPT09ICdwZW5kaW5nQXBwcm92YWwnKSAmJiBpbnY/LnBheW1lbnRTdGF0dXMgPT09ICd1bnBhaWQnO1xuICB9XG5cbiAgLy8gQ2FuY2VsIGlzIGEgRklOQU5DRSBhY3Rpb246IHNob3duIG9ubHkgdG8gdXNlcnMgd2l0aCBGaW5hbmNlIEFwcHJvdmFsXG4gIC8vIGFjY2Vzcywgb24gcm93cyB0aGF0IGFyZSBjYW5jZWxsYWJsZS4gdXNlckFjY2VzcyBpcyBwYXNzZWQgaW4gZnJvbSB0aGVcbiAgLy8gdGVtcGxhdGUgKHNhbWUgaWRpb20gYXMgY2FuQXBwcm92ZSkgYmVjYXVzZSB0aGUgcHVibGlzaGVkXG4gIC8vIHRhbmdvLWFwcC11aS1nbG9iYWwgdHlwaW5ncyBwcmVkYXRlIHRoZSBmaW5hbmNlQXBwcm92YWwgZmxhZ3MuXG4gIGNhblNob3dDYW5jZWwoaW52OiBhbnksIHVzZXJBY2Nlc3M6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNhbkNhbmNlbEludm9pY2UoaW52KSAmJiAhIXVzZXJBY2Nlc3M/LlRhbmdvQWRtaW5fZmluYW5jZUFwcHJvdmFsX2lzRWRpdDtcbiAgfVxuXG4gIC8vIFRydWUgd2hlbiB0aGUgaW52b2ljZSBpcyBpbiBhIHByZS1hcHByb3ZhbCBzdGFnZSBBTkQgdGhlIGN1cnJlbnQgdXNlclxuICAvLyBoYXMgdGhlIG1hdGNoaW5nIFRhbmdvQWRtaW4gcGVybWlzc2lvbiBmb3IgdGhhdCBzdGFnZS5cbiAgLy8gdXNlckFjY2VzcyBpcyB0aGUgZmxhdCBvYmplY3Qgc2VydmVkIGJ5IEdsb2JhbFN0YXRlU2VydmljZS51c2VyQWNjZXNzJCxcbiAgLy8gZS5nLiB7IFRhbmdvQWRtaW5fY3NtQXBwcm92YWxfaXNFZGl0OiB0cnVlLCAuLi4gfVxuICBjYW5BcHByb3ZlKGludjogYW55LCB1c2VyQWNjZXNzOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIXVzZXJBY2Nlc3MpIHJldHVybiBmYWxzZTtcbiAgICAvLyBTdXBlcmFkbWluIGJ5cGFzczogY2FuIGFwcHJvdmUgYXQgYW55IHN0YWdlIHJlZ2FyZGxlc3Mgb2YgcGVyLW1vZHVsZSBwZXJtaXNzaW9ucy5cbiAgICBpZiAodXNlckFjY2Vzcy5yb2xlID09PSAnc3VwZXJhZG1pbicpIHtcbiAgICAgIHJldHVybiBbJ3BlbmRpbmdDc20nLCAncGVuZGluZ0ZpbmFuY2UnLCAncGVuZGluZ0FwcHJvdmFsJ10uaW5jbHVkZXMoaW52Py5zdGF0dXMpO1xuICAgIH1cbiAgICBpZiAoaW52Py5zdGF0dXMgPT09ICdwZW5kaW5nQ3NtJykgcmV0dXJuICEhdXNlckFjY2Vzcy5UYW5nb0FkbWluX2NzbUFwcHJvdmFsX2lzRWRpdDtcbiAgICBpZiAoaW52Py5zdGF0dXMgPT09ICdwZW5kaW5nRmluYW5jZScpIHJldHVybiAhIXVzZXJBY2Nlc3MuVGFuZ29BZG1pbl9maW5hbmNlQXBwcm92YWxfaXNFZGl0O1xuICAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmdBcHByb3ZhbCcpIHJldHVybiAhIXVzZXJBY2Nlc3MuVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0O1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRvb2x0aXAgLyBidXR0b24gbGFiZWwgZm9yIHRoZSBwZXItcm93IGFwcHJvdmUgaWNvbiwgYnkgY3VycmVudCBzdGFnZS5cbiAgZ2V0QXBwcm92ZVRvb2x0aXAoaW52OiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmdDc20nKSByZXR1cm4gJ0FwcHJvdmUgYXMgQ1NNJztcbiAgICBpZiAoaW52Py5zdGF0dXMgPT09ICdwZW5kaW5nRmluYW5jZScpIHJldHVybiAnQXBwcm92ZSBhcyBGaW5hbmNlJztcbiAgICBpZiAoaW52Py5zdGF0dXMgPT09ICdwZW5kaW5nQXBwcm92YWwnKSByZXR1cm4gJ0ZpbmFsIEFwcHJvdmUnO1xuICAgIHJldHVybiAnQXBwcm92ZSBJbnZvaWNlJztcbiAgfVxuXG4gIC8vIEh1bWFuIGxhYmVsIGZvciBlYWNoIHBpcGVsaW5lIHN0YXR1cyDigJQgdXNlZCBpbiB0aGUgY29uZmlybWF0aW9uIHBvcHVwJ3NcbiAgLy8gXCJmcm9tIOKGkiB0b1wiIGJyZWFrZG93biBzbyB0aGUgdXNlciBzZWVzIGV4YWN0bHkgd2hhdCBlYWNoIGFwcHJvdmUgZG9lcy5cbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnZUxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBwZW5kaW5nQ3NtOiAnUGVuZGluZyBDU00nLFxuICAgIHBlbmRpbmdGaW5hbmNlOiAnUGVuZGluZyBGaW5hbmNlJyxcbiAgICBwZW5kaW5nQXBwcm92YWw6ICdQZW5kaW5nIEFwcHJvdmFsJyxcbiAgICBhcHByb3ZlZDogJ0FwcHJvdmVkJyxcbiAgfTtcblxuICAvLyBUaGUgc2luZ2xlIG5leHQtc3RhZ2Ugc3RlcCBmb3IgZWFjaCBwcmUtYXBwcm92YWwgc3RhdHVzLiBNaXJyb3JzIHRoZVxuICAvLyBiYWNrZW5kIHRyYW5zaXRpb25zIGluIGFwcHJvdmVJbnZvaWNlQ3NtL0ZpbmFuY2UvQXBwcm92YWwuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2VOZXh0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIHBlbmRpbmdDc206ICdwZW5kaW5nRmluYW5jZScsXG4gICAgcGVuZGluZ0ZpbmFuY2U6ICdwZW5kaW5nQXBwcm92YWwnLFxuICAgIHBlbmRpbmdBcHByb3ZhbDogJ2FwcHJvdmVkJyxcbiAgfTtcblxuICAvLyBDb2xsYXBzZSBhIGxpc3Qgb2YgaW52b2ljZXMgaW50byBbe2Zyb20sIHRvLCBjb3VudH0sIC4uLl0gc29ydGVkIGJ5IHRoZVxuICAvLyBwaXBlbGluZSBvcmRlciwgc28gdGhlIHBvcHVwIGxpc3RzIENTTSBmaXJzdCB0aGVuIEZpbmFuY2UgdGhlbiBBcHByb3ZhbC5cbiAgcHJpdmF0ZSBidWlsZFRyYW5zaXRpb25zKGludm9pY2VzOiBhbnlbXSk6IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nOyBjb3VudDogbnVtYmVyIH1bXSB7XG4gICAgY29uc3Qgb3JkZXIgPSBbJ3BlbmRpbmdDc20nLCAncGVuZGluZ0ZpbmFuY2UnLCAncGVuZGluZ0FwcHJvdmFsJ107XG4gICAgY29uc3QgY291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgaW52b2ljZXMuZm9yRWFjaCgoaW52KSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXMgPSBpbnY/LnN0YXR1cztcbiAgICAgIGlmICh0aGlzLnN0YWdlTmV4dFtzdGF0dXNdKSB7XG4gICAgICAgIGNvdW50c1tzdGF0dXNdID0gKGNvdW50c1tzdGF0dXNdIHx8IDApICsgMTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb3JkZXJcbiAgICAgIC5maWx0ZXIoKHMpID0+IGNvdW50c1tzXSlcbiAgICAgIC5tYXAoKHMpID0+ICh7XG4gICAgICAgIGZyb206IHRoaXMuc3RhZ2VMYWJlbHNbc10sXG4gICAgICAgIHRvOiB0aGlzLnN0YWdlTGFiZWxzW3RoaXMuc3RhZ2VOZXh0W3NdXSxcbiAgICAgICAgY291bnQ6IGNvdW50c1tzXSxcbiAgICAgIH0pKTtcbiAgfVxuXG4gIC8vIENhbGxzIHRoZSBkZWRpY2F0ZWQgdHJhbnNpdGlvbiBlbmRwb2ludCBmb3IgZWFjaCBwcmUtYXBwcm92YWwgc3RhZ2UuXG4gIC8vIEZpbmFsLXN0YWdlIGFwcHJvdmFsIChwZW5kaW5nQXBwcm92YWwg4oaSIGFwcHJvdmVkKSBtdXN0IE5PVCBnbyB0aHJvdWdoXG4gIC8vIGludm9pY2VEb3dubG9hZCDigJQgdGhhdCBlbmRwb2ludCBpcyBmb3IgUERGIGdlbmVyYXRpb24gYW5kIG9ubHkgYWR2YW5jZXNcbiAgLy8gc3RhdHVzIGFzIGEgc2lkZSBlZmZlY3QsIHdoaWNoIHNpbGVudGx5IGZhaWxzIHdoZW4gUERGL2VtYWlsIHNldHVwIGlzXG4gIC8vIGJyb2tlbi4gVXNlIGFwcHJvdmVJbnZvaWNlQXBwcm92YWwsIHdoaWNoIGFkdmFuY2VzIHN0YXR1cyB1bmNvbmRpdGlvbmFsbHkuXG4gIHByaXZhdGUgYWR2YW5jZUludm9pY2VCeVN0YXR1cyhpbnY6IGFueSkge1xuICAgIGlmIChpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmdDc20nKSB7XG4gICAgICByZXR1cm4gdGhpcy5iaWxsaW5nU2VydmljZS5hcHByb3ZlSW52b2ljZUNzbShpbnYuX2lkKTtcbiAgICB9XG4gICAgaWYgKGludj8uc3RhdHVzID09PSAncGVuZGluZ0ZpbmFuY2UnKSB7XG4gICAgICByZXR1cm4gdGhpcy5iaWxsaW5nU2VydmljZS5hcHByb3ZlSW52b2ljZUZpbmFuY2UoaW52Ll9pZCk7XG4gICAgfVxuICAgaWYgKGludj8uc3RhdHVzID09PSAncGVuZGluZ0FwcHJvdmFsJykge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IHsgLi4uaW52LCBzZW5kSW52b2ljZTogdHJ1ZSwgc3RhdHVzOiAnYXBwcm92ZWQnIH07XG4gICAgICByZXR1cm4gdGhpcy5iaWxsaW5nU2VydmljZS5pbnZvaWNlRG93bmxvYWQocGF5bG9hZCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXBwcm92ZUludm9pY2UoZGF0YTogYW55KSB7XG4gICAgLy8gVGhlIHBlci1yb3cgaWNvbidzICpuZ0lmIGFscmVhZHkgZ2F0ZXMgYnkgc3RhZ2UgKyBwZXJtaXNzaW9uLiBJZiB0aGVcbiAgICAvLyBpbnZvaWNlJ3Mgc3RhdHVzIGlzbid0IGluIHRoZSBwcmUtYXBwcm92YWwgc2V0LCBhZHZhbmNlSW52b2ljZUJ5U3RhdHVzXG4gICAgLy8gcmV0dXJucyBudWxsIGJlbG93IOKAlCB0aGUgYmFja2VuZCB3b3VsZCBhbHNvIHJlZnVzZSB3aXRoIGEgNDAzLzQwOS5cbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oUmVxdWVzdENvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgLy8gU2hvdyB0aGUgc2luZ2xlLXJvdydzIGZyb20g4oaSIHRvIHRyYW5zaXRpb24gc28gdGhlIHBvcHVwIGlzIGNvbnNpc3RlbnRcbiAgICAvLyB3aXRoIHRoZSBidWxrLWFwcHJvdmUgYnJlYWtkb3duLlxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRyYW5zaXRpb25zID0gdGhpcy5idWlsZFRyYW5zaXRpb25zKFtkYXRhXSk7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnWWVzJykge1xuICAgICAgICBjb25zdCBjYWxsID0gdGhpcy5hZHZhbmNlSW52b2ljZUJ5U3RhdHVzKGRhdGEpO1xuICAgICAgICBpZiAoIWNhbGwpIHJldHVybjtcbiAgICAgICAgY2FsbC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdCgnSW52b2ljZSBhZHZhbmNlZCB0byB0aGUgbmV4dCBzdGFnZScpO1xuICAgICAgICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBhZHZhbmNlIGludm9pY2UnO1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KG1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICByZWdlbmVyYXRlSW52b2ljZShkYXRhOiBhbnkpIHtcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oUmVnZXJhdGVJbnZvaWNlQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdZZXMnKSB7XG4gICAgICAgIGxldCBwYXlsb2FkID0ge1xuICAgICAgICAgIGludm9pY2VJZDogZGF0YS5pbnZvaWNlLFxuICAgICAgICAgIGFsbENsaWVudDogZmFsc2UsXG4gICAgICAgICAgcmVnZW5yYXRlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuaW52b2ljZXJlZ2VyYXRlKHBheWxvYWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdCgnVGhlIGludm9pY2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlZ2VuZXJhdGVkLicpO1xuICAgICAgICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcGF5bWVudHN0YXR1c0NoYW5nZShkYXRhOiBhbnkpIHtcbiAgICAvLyBNb2RhbCBub3cgY29sbGVjdHMgYSByZWFsIHBheW1lbnQgZW50cnkgKGFtb3VudCwgZGF0ZSwgbWV0aG9kLFxuICAgIC8vIHJlZmVyZW5jZSwgbm90ZXMpIGluc3RlYWQgb2YgYSBZZXMvTm8gdG9nZ2xlLiBPbiBzdWJtaXQgdGhlIHNlcnZlclxuICAgIC8vIGFwcGVuZHMgdG8gcGF5bWVudEhpc3RvcnkgYW5kIHJlY29tcHV0ZXMgcGF5bWVudFN0YXR1cy5cbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oUGF5bWVudFN0YXR1c2NoYW5nZUNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaW52b2ljZSA9IGRhdGE7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0Py5hY3Rpb24gPT09ICdyZWNvcmQnICYmIHJlc3VsdC5wYXlsb2FkKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IGludm9pY2VJZDogZGF0YS5pbnZvaWNlLCAuLi5yZXN1bHQucGF5bG9hZCB9O1xuICAgICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLnJlY29yZFBheW1lbnQocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSByZXM/LmRhdGE/LnBheW1lbnRTdGF0dXMgfHwgcmVzPy5wYXltZW50U3RhdHVzIHx8ICd1cGRhdGVkJztcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGBQYXltZW50IHJlY29yZGVkIOKAlCBzdGF0dXM6ICR7c3RhdHVzfWApO1xuICAgICAgICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyPy5lcnJvcj8uZXJyb3IgfHwgJ0ZhaWxlZCB0byByZWNvcmQgcGF5bWVudCc7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QobXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIGRvd25sb2FkSW52b2ljZShkYXRhOiBhbnkpIHtcbiAgICBjb25zdCByZXEgPSB7IC4uLmRhdGEgfTtcbiAgICByZXEuY2xpZW50SWQgPSBbZGF0YS5jbGllbnRJZF07XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5pbnZvaWNlRG93bmxvYWQocmVxKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbcmVzXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vcGRmJyB9KTtcbiAgICAgICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gZGF0YT8uYmlsbGluZ0RhdGUgPyBuZXcgRGF0ZShkYXRhLmJpbGxpbmdEYXRlKS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnbG9uZycgfSkgOiAnJztcbiAgICAgICAgY29uc3QgYnJhbmROYW1lID0gZGF0YT8ucmVnaXN0ZXJlZENvbXBhbnlOYW1lIHx8IGRhdGE/LmNvbXBhbnlOYW1lIHx8ICcnO1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGAke2RhdGE/Lmludm9pY2UgfHwgJ2ludm9pY2UnfS0ke21vbnRofS0ke2JyYW5kTmFtZX0ucGRmYC5yZXBsYWNlKC9bXFxcXC86Kj9cIjw+fFxcclxcbl0vZywgJycpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgbGluay5ocmVmID0gdXJsO1xuICAgICAgICBsaW5rLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIE11bHRpLXNlbGVjdCBhcHByb3ZhbCAvIGRvd25sb2FkLiBDaGVja2JveGVzIGFyZSB1bmNvbmRpdGlvbmFsO1xuICAvLyBBcHByb3ZlIGFkdmFuY2VzIGVhY2ggc2VsZWN0ZWQgcm93IGJ5IG9uZSBwaXBlbGluZSBzdGFnZSBhdCBhY3Rpb24gdGltZS5cbiAgLy8gQSByb3cgdGhlIHVzZXIgY2FuJ3QgYXBwcm92ZSBhdCBpdHMgY3VycmVudCBzdGFnZSBpcyBza2lwcGVkLlxuICBnZXRQZW5kaW5nSW52b2ljZXMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmludm9pY2VMaXN0LmZpbHRlcigoaW52OiBhbnkpID0+IHRoaXMuY2FuQXBwcm92ZShpbnYsIHRoaXMudXNlckFjY2VzcykpO1xuICB9XG5cbiAgZ2V0U2VsZWN0YWJsZUludm9pY2VzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5pbnZvaWNlTGlzdDtcbiAgfVxuXG4gIHBlbmRpbmdJblNlbGVjdGlvbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmludm9pY2VMaXN0LmZpbHRlcigoaW52OiBhbnkpID0+XG4gICAgICB0aGlzLnNlbGVjdGVkSW52b2ljZXMuaGFzKGludi5faWQpICYmIHRoaXMuY2FuQXBwcm92ZShpbnYsIHRoaXMudXNlckFjY2VzcylcbiAgICApLmxlbmd0aDtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdEFsbCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RBbGwpIHtcbiAgICAgIHRoaXMuZ2V0U2VsZWN0YWJsZUludm9pY2VzKCkuZm9yRWFjaCgoaW52OiBhbnkpID0+IHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5hZGQoaW52Ll9pZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSW52b2ljZXMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVJbnZvaWNlU2VsZWN0KGludjogYW55KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5oYXMoaW52Ll9pZCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5kZWxldGUoaW52Ll9pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5hZGQoaW52Ll9pZCk7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGFibGUgPSB0aGlzLmdldFNlbGVjdGFibGVJbnZvaWNlcygpO1xuICAgIHRoaXMuc2VsZWN0QWxsID0gc2VsZWN0YWJsZS5sZW5ndGggPiAwICYmXG4gICAgICBzZWxlY3RhYmxlLmV2ZXJ5KChpOiBhbnkpID0+IHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5oYXMoaS5faWQpKTtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQoaW52OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEludm9pY2VzLmhhcyhpbnYuX2lkKTtcbiAgfVxuXG4gIGFwcHJvdmVTZWxlY3RlZCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEludm9pY2VzLnNpemUgPT09IDApIHJldHVybjtcbiAgICAvLyBDb21wdXRlIHRoZSBhcHByb3ZhYmxlIHN1YnNldCB1cC1mcm9udCBzbyB0aGUgY29uZmlybWF0aW9uIHBvcHVwIGNhblxuICAgIC8vIHNob3cgdGhlIGZyb20g4oaSIHRvIGJyZWFrZG93biBiZWZvcmUgdGhlIHVzZXIgY2xpY2tzIFllcy5cbiAgICBjb25zdCBzZWxlY3RlZExpc3QgPSB0aGlzLmludm9pY2VMaXN0LmZpbHRlcigoaW52OiBhbnkpID0+XG4gICAgICB0aGlzLnNlbGVjdGVkSW52b2ljZXMuaGFzKGludi5faWQpICYmIHRoaXMuY2FuQXBwcm92ZShpbnYsIHRoaXMudXNlckFjY2VzcylcbiAgICApO1xuICAgIGlmIChzZWxlY3RlZExpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ05vIHBlbmRpbmcgaW52b2ljZXMgaW4gc2VsZWN0aW9uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihSZXF1ZXN0Q29uZmlybWF0aW9uQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50cmFuc2l0aW9ucyA9IHRoaXMuYnVpbGRUcmFuc2l0aW9ucyhzZWxlY3RlZExpc3QpO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ1llcycpIHtcbiAgICAgICAgdGhpcy5idWxrQXBwcm92aW5nID0gdHJ1ZTtcbiAgICAgICAgbGV0IGNvbXBsZXRlZCA9IDA7XG4gICAgICAgIGxldCBzdWNjZWVkZWQgPSAwO1xuICAgICAgICBsZXQgZmFpbGVkID0gMDtcbiAgICAgICAgc2VsZWN0ZWRMaXN0LmZvckVhY2goKGludjogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgY2FsbCA9IHRoaXMuYWR2YW5jZUludm9pY2VCeVN0YXR1cyhpbnYpO1xuICAgICAgICAgIGlmICghY2FsbCkge1xuICAgICAgICAgICAgY29tcGxldGVkKys7XG4gICAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FsbC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgY29tcGxldGVkKys7XG4gICAgICAgICAgICAgIHN1Y2NlZWRlZCsrO1xuICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID09PSBzZWxlY3RlZExpc3QubGVuZ3RoKSB0aGlzLmZpbmlzaEJ1bGtBcHByb3ZlKHN1Y2NlZWRlZCwgZmFpbGVkKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgICBjb21wbGV0ZWQrKztcbiAgICAgICAgICAgICAgZmFpbGVkKys7XG4gICAgICAgICAgICAgIGlmIChjb21wbGV0ZWQgPT09IHNlbGVjdGVkTGlzdC5sZW5ndGgpIHRoaXMuZmluaXNoQnVsa0FwcHJvdmUoc3VjY2VlZGVkLCBmYWlsZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmlzaEJ1bGtBcHByb3ZlKHN1Y2NlZWRlZDogbnVtYmVyLCBmYWlsZWQ6IG51bWJlcikge1xuICAgIHRoaXMuYnVsa0FwcHJvdmluZyA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5jbGVhcigpO1xuICAgIHRoaXMuc2VsZWN0QWxsID0gZmFsc2U7XG4gICAgaWYgKGZhaWxlZCA9PT0gMCkge1xuICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoYCR7c3VjY2VlZGVkfSBpbnZvaWNlKHMpIGFkdmFuY2VkIHRvIG5leHQgc3RhZ2VgKTtcbiAgICB9IGVsc2UgaWYgKHN1Y2NlZWRlZCA9PT0gMCkge1xuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGBBbGwgJHtmYWlsZWR9IGludm9pY2UocykgZmFpbGVkIHRvIGFkdmFuY2VgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGAke3N1Y2NlZWRlZH0gYWR2YW5jZWQsICR7ZmFpbGVkfSBmYWlsZWRgKTtcbiAgICB9XG4gICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgfVxuXG4gIGRvd25sb2FkU2VsZWN0ZWQoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5zaXplID09PSAwKSByZXR1cm47XG4gICAgdGhpcy5idWxrRG93bmxvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IGludm9pY2VJZHM6IFsuLi50aGlzLnNlbGVjdGVkSW52b2ljZXNdIH07XG4gICAgY29uc3QgY291bnQgPSBwYXlsb2FkLmludm9pY2VJZHMubGVuZ3RoO1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYnVsa0ludm9pY2VEb3dubG9hZChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3Jlc10sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3ppcCcgfSk7XG4gICAgICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICBjb25zdCByYXdCcmFuZCA9IHRoaXMuY2xpZW50SW5mbz8uY2xpZW50TmFtZSB8fCB0aGlzLmJyYW5kTmFtZSB8fCAnaW52b2ljZXMnO1xuICAgICAgICBjb25zdCBicmFuZCA9IHJhd0JyYW5kLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tfC0kL2csICcnKSB8fCAnaW52b2ljZXMnO1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGBpbnZvaWNlcy0ke2JyYW5kfS0ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCl9LnppcGA7XG4gICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgbGluay5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgIHRoaXMuYnVsa0Rvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLnNlbGVjdEFsbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdChgRG93bmxvYWRlZCAke2NvdW50fSBpbnZvaWNlKHMpYCk7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuYnVsa0Rvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGRvd25sb2FkIGludm9pY2VzJyk7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2VuZEVtYWlsU2VsZWN0ZWQoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbnZvaWNlcy5zaXplID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgcGF5bG9hZCA9IHsgaW52b2ljZUlkczogWy4uLnRoaXMuc2VsZWN0ZWRJbnZvaWNlc10gfTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmJ1bGtJbnZvaWNlRW1haWxQcmV2aWV3KHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpZXcgPSByZXM/LmRhdGE7XG4gICAgICAgIGlmICghcHJldmlldyB8fCAhcHJldmlldy5hcHByb3ZlZElkcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdObyBhcHByb3ZlZCBpbnZvaWNlcyBpbiBzZWxlY3Rpb24nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFNlbmRJbnZvaWNlRW1haWxDb21wb25lbnQsIHtcbiAgICAgICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnByZXZpZXcgPSBwcmV2aWV3O1xuICAgICAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0Py5hY3Rpb24gPT09ICdzZW5kJykge1xuICAgICAgICAgICAgdGhpcy5idWxrRW1haWxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5idWxrSW52b2ljZUVtYWlsU2VuZCh7XG4gICAgICAgICAgICAgIGludm9pY2VJZHM6IHByZXZpZXcuYXBwcm92ZWRJZHMsXG4gICAgICAgICAgICAgIHRvRW1haWxzOiByZXN1bHQudG9FbWFpbHMsXG4gICAgICAgICAgICAgIGNjRW1haWxzOiByZXN1bHQuY2NFbWFpbHMsXG4gICAgICAgICAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogKHNlbmRSZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBzZW5kUmVzPy5kYXRhPy5lbWFpbGVkQ291bnQgPz8gcHJldmlldy5hcHByb3ZlZElkcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2tpcHBlZCA9IHNlbmRSZXM/LmRhdGE/LnNraXBwZWRCdWlsZENvdW50ID8/IDA7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoXG4gICAgICAgICAgICAgICAgICBza2lwcGVkID4gMCA/IGBFbWFpbGVkICR7bn0gaW52b2ljZShzKSwgJHtza2lwcGVkfSBmYWlsZWQgdG8gYnVpbGRgIDogYEVtYWlsZWQgJHtufSBpbnZvaWNlKHMpYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVsa0VtYWlsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEludm9pY2VzLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVsa0VtYWlsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHNlbmQgaW52b2ljZXMnO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChtc2cpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gcHJlcGFyZSBlbWFpbCc7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChtc2cpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG9wZW5JbnZvaWNlUHJldmlldyhpbnY6IGFueSkge1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZ2V0SW52b2ljZUJ5SWQoaW52Ll9pZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaW52b2ljZURhdGEgPSByZXM/LmRhdGEgfHwgaW52O1xuICAgICAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oSW52b2ljZVByZXZpZXdDb21wb25lbnQsIHtcbiAgICAgICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ3hsJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmludm9pY2VEYXRhID0gaW52b2ljZURhdGE7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGxvYWQgaW52b2ljZScpXG4gICAgfSk7XG4gIH1cblxuICBlZGl0SW52b2ljZShpbnY6IGFueSkge1xuICAgIC8vIExvY2tlZCBvbmNlIGZpbmFsLWFwcHJvdmVkLCBvciBvbmNlIHRoZSBudW1iZXIgaXMgaXNzdWVkIGZvciB1c2VycyB3aG9cbiAgICAvLyBhcmVuJ3QgRmluYW5jZSAvIEludm9pY2UgYXBwcm92ZXJzOyB0aGUgaWNvbiBpcyBkaXNhYmxlZCBpbiB0aGUgdGVtcGxhdGVcbiAgICAvLyBidXQgZ3VhcmQgaGVyZSB0b28gaW4gY2FzZSBpdCdzIGNhbGxlZCBmcm9tIGFub3RoZXIgcGF0aC5cbiAgICBpZiAodGhpcy5pc0VkaXRCbG9ja2VkKGludikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmV0Y2ggZnVsbCBpbnZvaWNlIGRhdGEgYnkgX2lkXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5nZXRJbnZvaWNlQnlJZChpbnYuX2lkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBmdWxsSW52b2ljZSA9IHJlcz8uZGF0YSB8fCBpbnY7XG4gICAgICAgIHRoaXMub3BlbkVkaXRNb2RhbChmdWxsSW52b2ljZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgLy8gRmFsbGJhY2s6IG9wZW4gd2l0aCB3aGF0ZXZlciBkYXRhIHdlIGhhdmUgZnJvbSB0aGUgbGlzdFxuICAgICAgICB0aGlzLm9wZW5FZGl0TW9kYWwoaW52KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkVkaXRNb2RhbChpbnZvaWNlRGF0YTogYW55KSB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEVkaXRJbnZvaWNlQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ3hsJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnZvaWNlRGF0YSA9IGludm9pY2VEYXRhO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLm1vZGUgPSAnZWRpdCc7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xpZW50SWQgPSB0aGlzLmJyYW5kSWQ7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAndXBkYXRlZCcgfHwgcmVzdWx0ID09PSAnY3JlZGl0QXBwbGllZCcgfHwgcmVzdWx0ID09PSAnZmVlQXBwbGllZCcpIHtcbiAgICAgICAgdGhpcy5sb2FkSW52b2ljZXMoKTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBjcmVhdGVJbnZvaWNlKCkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihFZGl0SW52b2ljZUNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UubW9kZSA9ICdjcmVhdGUnO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNsaWVudElkID0gdGhpcy5icmFuZElkO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgZGVsZXRlSW52b2ljZShpbnY6IGFueSkge1xuICAgIC8vIExvY2tlZCBvbmNlIGEgcmVhbCBpbnZvaWNlIG51bWJlciBpcyBtaW50ZWQgKGZpbmFuY2UgYXBwcm92YWwpIOKAlCBvbmx5XG4gICAgLy8gcHJlLWZpbmFuY2UgZHJhZnRzIGFyZSBkZWxldGFibGUuIEVuZm9yY2VkIGJ5IHRoZSBiYWNrZW5kIHRvby5cbiAgICBpZiAodGhpcy5pc0RlbGV0ZUxvY2tlZChpbnYpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQsIHtcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ1llcycpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5kZWxldGVJbnZvaWNlKGludi5faWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoJ0ludm9pY2UgZGVsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZGVsZXRlIGludm9pY2UnO1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KG1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICAvLyBDYW5jZWwgYW4gYXBwcm92ZWQrdW5wYWlkIGludm9pY2UuIENvbmZpcm1hdGlvbiBtb2RhbCBjb2xsZWN0cyBhXG4gIC8vIG1hbmRhdG9yeSByZWFzb247IHRoZSBiYWNrZW5kIHJlLXZhbGlkYXRlcyBzdGF0dXMvcGF5bWVudFN0YXR1cyBhbmQgdGhlXG4gIC8vIHJlYXNvbiBiZWZvcmUgZmxpcHBpbmcgc3RhdHVzIHRvICdjYW5jZWxsZWQnLlxuICBjYW5jZWxJbnZvaWNlKGludjogYW55KSB7XG4gICAgaWYgKCF0aGlzLmNhbkNhbmNlbEludm9pY2UoaW52KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oQ2FuY2VsSW52b2ljZUNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0Py5yZWFzb24pIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5jYW5jZWxJbnZvaWNlKGludi5faWQsIHsgcmVhc29uOiByZXN1bHQucmVhc29uIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdJbnZvaWNlIGNhbmNlbGxlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gY2FuY2VsIGludm9pY2UnO1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KG1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICAvLyBPcGVucyB0aGUgYWN0aXZpdHktbG9nIHRpbWVsaW5lIGZvciBhIHNpbmdsZSBpbnZvaWNlIOKAlCB0cmlnZ2VyZWQgYnlcbiAgLy8gY2xpY2tpbmcgaXRzIHN0YXR1cyBiYWRnZS4gUmVhZC1vbmx5OyB0aGUgbW9kYWwgZmV0Y2hlcyBvbiBpbml0LlxuICBvcGVuSW52b2ljZUxvZ3MoaW52OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oSW52b2ljZUxvZ3NDb21wb25lbnQsIHtcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmludm9pY2UgPSBpbnY7XG4gIH1cblxuICBzZWxlY3RUYWIodGFiOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlbGVjdGVkVGFiID0gdGFiO1xuICAgIGlmICh0YWIgPT09ICdpbnZvaWNlcycpIHtcbiAgICAgIHRoaXMubG9hZEludm9pY2VzKCk7XG4gICAgfVxuICB9XG5cbiAgZ29CYWNrKCkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS9iaWxsaW5nJ10pO1xuICB9XG59IiwiPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgICA8IS0tIEJhY2sgQnV0dG9uIOKAlCBoaWRkZW4gZm9yIGNsaWVudCB1c2VycyAobm8gQnJhbmRzIGxpc3QgdG8gZ28gYmFjayB0bykuIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtdC0zIG14LTNcIiAqbmdJZj1cIiFpc0NsaWVudFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGluayB0ZXh0LW11dGVkIHAtMFwiIChjbGljayk9XCJnb0JhY2soKVwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtZS0xXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNSA4SDFNMSA4TDggMTVNMSA4TDggMVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIEJhY2sgdG8gQmlsbGluZ1xuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQnJhbmQgSGVhZGVyIOKAlCBoaWRkZW4gZm9yIGNsaWVudCB1c2Vycy4gLS0+XG4gICAgPGRpdiBjbGFzcz1cImJyYW5kLWhlYWRlciBteC0zIG10LTMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiICpuZ0lmPVwiIWlzQ2xpZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzeW1ib2wgc3ltYm9sLTUwcHggc3ltYm9sLWNpcmNsZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzeW1ib2wtbGFiZWwgYmctcHJpbWFyeSB0ZXh0LXdoaXRlIGJyYW5kLWF2YXRhclwiPlxuICAgICAgICAgICAgICAgIHt7IGNsaWVudEluZm8/LmNsaWVudE5hbWU/LmNoYXJBdCgwKSB8fCBicmFuZE5hbWU/LmNoYXJBdCgwKSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJicmFuZC1uYW1lXCI+e3sgY2xpZW50SW5mbz8uY2xpZW50TmFtZSB8fCBicmFuZE5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJicmFuZC1tZXRhIHRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICB7eyBjbGllbnRJbmZvPy50b3RhbFN0b3JlcyB8fCAwIH19IFN0b3Jlc1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMVwiPiZtaWRkb3Q7PC9zcGFuPlxuICAgICAgICAgICAgICAgIEJpbGxpbmcge3sgY2xpZW50SW5mbz8uc3RhdHVzID09PSAnYWN0aXZlJyA/ICdBY3RpdmUnIDogJ0luYWN0aXZlJyB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdWIgVGFicyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibXQtNCBteC0zIHBheW1lbnRoaXN0b3J5XCI+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJ2aXNpYmxlVGFicy5pbmNsdWRlcygnaW52b2ljZXMnKVwiIGNsYXNzPVwiYnRuIGJ0bi1jb2xvci1ncmF5LTYwMCBidG4tYWN0aXZlIGJ0bi1hY3RpdmUtc2Vjb25kYXJ5IHB4LTYgcHktMyBtZS0yXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiID09PSAnaW52b2ljZXMnID8gJ2FjdGl2ZVBsYW5CdG5wcmltYXJ5JyA6ICdpbmFjdGl2ZVBsYW5CdG4nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIoJ2ludm9pY2VzJylcIj5cbiAgICAgICAgICAgIEludm9pY2VzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwidmlzaWJsZVRhYnMuaW5jbHVkZXMoJ2VzdGltYXRlJylcIiBjbGFzcz1cImJ0biBidG4tY29sb3ItZ3JheS02MDAgYnRuLWFjdGl2ZSBidG4tYWN0aXZlLXNlY29uZGFyeSBweC02IHB5LTMgbWUtMlwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0gJ2VzdGltYXRlJyA/ICdhY3RpdmVQbGFuQnRucHJpbWFyeScgOiAnaW5hY3RpdmVQbGFuQnRuJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGFiKCdlc3RpbWF0ZScpXCI+XG4gICAgICAgICAgICBFc3RpbWF0ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInZpc2libGVUYWJzLmluY2x1ZGVzKCdkYWlseS1wcmljaW5nJylcIiBjbGFzcz1cImJ0biBidG4tY29sb3ItZ3JheS02MDAgYnRuLWFjdGl2ZSBidG4tYWN0aXZlLXNlY29uZGFyeSBweC02IHB5LTMgbWUtMlwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0gJ2RhaWx5LXByaWNpbmcnID8gJ2FjdGl2ZVBsYW5CdG5wcmltYXJ5JyA6ICdpbmFjdGl2ZVBsYW5CdG4nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIoJ2RhaWx5LXByaWNpbmcnKVwiPlxuICAgICAgICAgICAgQmlsbGluZyBCcmVha2Rvd25cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJ2aXNpYmxlVGFicy5pbmNsdWRlcygncGxhbnMtc3Vic2NyaXB0aW9uJylcIiBjbGFzcz1cImJ0biBidG4tY29sb3ItZ3JheS02MDAgYnRuLWFjdGl2ZSBidG4tYWN0aXZlLXNlY29uZGFyeSBweC02IHB5LTMgbWUtMlwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3RlZFRhYiA9PT0gJ3BsYW5zLXN1YnNjcmlwdGlvbicgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRhYigncGxhbnMtc3Vic2NyaXB0aW9uJylcIj5cbiAgICAgICAgICAgIFBsYW5zICZhbXA7IFN1YnNjcmlwdGlvblxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInZpc2libGVUYWJzLmluY2x1ZGVzKCdiaWxsaW5nLWdyb3VwcycpXCIgY2xhc3M9XCJidG4gYnRuLWNvbG9yLWdyYXktNjAwIGJ0bi1hY3RpdmUgYnRuLWFjdGl2ZS1zZWNvbmRhcnkgcHgtNiBweS0zIG1lLTJcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRUYWIgPT09ICdiaWxsaW5nLWdyb3VwcycgPyAnYWN0aXZlUGxhbkJ0bnByaW1hcnknIDogJ2luYWN0aXZlUGxhbkJ0bidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRhYignYmlsbGluZy1ncm91cHMnKVwiPlxuICAgICAgICAgICAgQmlsbGluZyBTZXR0aW5nc1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInZpc2libGVUYWJzLmluY2x1ZGVzKCdwdXJjaGFzZS1vcmRlcicpXCIgY2xhc3M9XCJidG4gYnRuLWNvbG9yLWdyYXktNjAwIGJ0bi1hY3RpdmUgYnRuLWFjdGl2ZS1zZWNvbmRhcnkgcHgtNiBweS0zXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGVkVGFiID09PSAncHVyY2hhc2Utb3JkZXInID8gJ2FjdGl2ZVBsYW5CdG5wcmltYXJ5JyA6ICdpbmFjdGl2ZVBsYW5CdG4nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIoJ3B1cmNoYXNlLW9yZGVyJylcIj5cbiAgICAgICAgICAgIFB1cmNoYXNlIE9yZGVyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQbGFucyAmIFN1YnNjcmlwdGlvbiBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJteC0zIG10LTQgbWItNFwiICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdwbGFucy1zdWJzY3JpcHRpb24nXCI+XG4gICAgICAgIDxsaWItcGxhbnMtc3Vic2NyaXB0aW9uPjwvbGliLXBsYW5zLXN1YnNjcmlwdGlvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRXN0aW1hdGUgU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibXgtMyBtdC00IG1iLTRcIiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnZXN0aW1hdGUnXCI+XG4gICAgICAgIDxsaWItZXN0aW1hdGVzIFtjbGllbnRJZF09XCJicmFuZElkXCI+PC9saWItZXN0aW1hdGVzPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBJbnZvaWNlcyBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlcy1zZWN0aW9uIG14LTMgbXQtNCBtYi00XCIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2ludm9pY2VzJ1wiPlxuICAgICAgICA8IS0tIFN1Yi10b2dnbGU6IHJlZ3VsYXIgaW52b2ljZXMgdnMgYWR2YW5jZSAoVElOVi0qKSBpbnZvaWNlcy4gU2hvd24gZm9yXG4gICAgICAgICAgICAgYm90aCB0YW5nbyBhbmQgY2xpZW50IHZpZXdzLiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtdHlwZS10b2dnbGUgbWItM1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpbnZvaWNlVHlwZSA9PT0gJ2FsbCcgPyAnaW52b2ljZS10eXBlLWJ0biBhY3RpdmUnIDogJ2ludm9pY2UtdHlwZS1idG4nXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SW52b2ljZVR5cGUoJ2FsbCcpXCI+QWxsIEludm9pY2VzPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImludm9pY2VUeXBlID09PSAnYWR2YW5jZScgPyAnaW52b2ljZS10eXBlLWJ0biBhY3RpdmUnIDogJ2ludm9pY2UtdHlwZS1idG4nXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SW52b2ljZVR5cGUoJ2FkdmFuY2UnKVwiPkFkdmFuY2UgSW52b2ljZTwvYnV0dG9uPlxuICAgICAgICAgICAgPCEtLSBDcmVkaXQgbm90ZXMgYXJlIHRhbmdvLW9ubHkgKHRoZSBjcmVkaXQtbm90ZSBBUEkgaXMgdG9vKS4gLS0+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cIiFpc0NsaWVudFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaW52b2ljZVR5cGUgPT09ICdjcmVkaXROb3RlJyA/ICdpbnZvaWNlLXR5cGUtYnRuIGFjdGl2ZScgOiAnaW52b2ljZS10eXBlLWJ0bidcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJbnZvaWNlVHlwZSgnY3JlZGl0Tm90ZScpXCI+Q3JlZGl0IE5vdGVzPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQ3JlZGl0IE5vdGVzOiBvd24gbGlzdCAoc2VwYXJhdGUgY29sbGVjdGlvbikgZm9yIHRoaXMgYnJhbmQuIC0tPlxuICAgICAgICA8bGliLWNyZWRpdC1ub3RlcyAqbmdJZj1cImludm9pY2VUeXBlID09PSAnY3JlZGl0Tm90ZSdcIiBbY2xpZW50SWRdPVwiYnJhbmRJZFwiPjwvbGliLWNyZWRpdC1ub3Rlcz5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW52b2ljZVR5cGUgIT09ICdjcmVkaXROb3RlJ1wiPlxuICAgICAgICA8IS0tIEhlYWRlciBzdW1tYXJ5IGNhcmRzIOKAlCBPdXRzdGFuZGluZyAvIE92ZXJkdWUgLyBQZW5kaW5nIFBheW1lbnQsXG4gICAgICAgICAgICAgZWFjaCBzcGxpdCBpbnRvIEV4Y2wuIEdTVCAvIEluY2wuIEdTVCAo4oK5KS4gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zIG1iLTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtbGFiZWxcIj5PdXRzdGFuZGluZzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1sYWJlbFwiPkV4Y2wuIEdTVDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC12YWx1ZVwiPuKCuXt7IGludm9pY2VDYXJkcy5vdXRzdGFuZGluZ0V4Y2xBbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1sYWJlbFwiPkluY2wuIEdTVDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC12YWx1ZVwiPuKCuXt7IGludm9pY2VDYXJkcy5vdXRzdGFuZGluZ0luY2xBbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXN1YlwiPnt7IGludm9pY2VDYXJkcy5vdXRzdGFuZGluZ0NvdW50IH19IHt7IGludm9pY2VDYXJkcy5vdXRzdGFuZGluZ0NvdW50ID09PSAxID8gJ2ludm9pY2UnIDogJ2ludm9pY2VzJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLWxhYmVsXCI+T3ZlcmR1ZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1sYWJlbFwiPkV4Y2wuIEdTVDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImludm9pY2UtY2FyZC12YWx1ZSB0ZXh0LWRhbmdlclwiPuKCuXt7IGludm9pY2VDYXJkcy5vdmVyZHVlRXhjbEFtb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWxhYmVsXCI+SW5jbC4gR1NUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXZhbHVlIHRleHQtZGFuZ2VyXCI+4oK5e3sgaW52b2ljZUNhcmRzLm92ZXJkdWVJbmNsQW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zdWJcIj57eyBpbnZvaWNlQ2FyZHMub3ZlcmR1ZUNvdW50IH19IHt7IGludm9pY2VDYXJkcy5vdmVyZHVlQ291bnQgPT09IDEgPyAnaW52b2ljZScgOiAnaW52b2ljZXMnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtbGFiZWxcIj5QZW5kaW5nIFBheW1lbnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zcGxpdC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtbGFiZWxcIj5FeGNsLiBHU1Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnZvaWNlLWNhcmQtdmFsdWUgdGV4dC13YXJuaW5nXCI+4oK5e3sgaW52b2ljZUNhcmRzLnBlbmRpbmdQYXltZW50RXhjbEFtb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3BsaXQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXNwbGl0LWxhYmVsXCI+SW5jbC4gR1NUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW52b2ljZS1jYXJkLXZhbHVlIHRleHQtd2FybmluZ1wiPuKCuXt7IGludm9pY2VDYXJkcy5wZW5kaW5nUGF5bWVudEluY2xBbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXN1YlwiPnt7IGludm9pY2VDYXJkcy5wZW5kaW5nUGF5bWVudENvdW50IH19IHt7IGludm9pY2VDYXJkcy5wZW5kaW5nUGF5bWVudENvdW50ID09PSAxID8gJ2ludm9pY2UnIDogJ2ludm9pY2VzJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gSGVhZGVyIFJvdyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi42NjY2NyAxMEgxMy4zMzMzTTYuNjY2NjcgNi42NjY2N0gxMy4zMzMzTTYuNjY2NjcgMTMuMzMzM0gxME01IDE3LjVIMTVDMTUuOTIwNSAxNy41IDE2LjY2NjcgMTYuNzUzOCAxNi42NjY3IDE1LjgzMzNWNC4xNjY2N0MxNi42NjY3IDMuMjQ2MTkgMTUuOTIwNSAyLjUgMTUgMi41SDVDNC4wNzk1MyAyLjUgMy4zMzMzMyAzLjI0NjE5IDMuMzMzMzMgNC4xNjY2N1YxNS44MzMzQzMuMzMzMzMgMTYuNzUzOCA0LjA3OTUzIDE3LjUgNSAxNy41WlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiaWxsaW5naGVhZGVyXCI+SW52b2ljZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctbGlnaHQgdGV4dC1kYXJrIG1zLTFcIj57eyB0b3RhbEludm9pY2VzIH19IHRvdGFsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIj5Ub3RhbCBpbnZvaWNlZDogPHN0cm9uZz7igrl7eyB0b3RhbEludm9pY2VkIHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkb3dubG9hZFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IGJ0bi1zbSBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyIG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0NsaWVudCAmJiBzZWxlY3RlZEludm9pY2VzLnNpemUgPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1bGtEb3dubG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU01LjgzMzMzIDguMzMzMzNMMTAgMTIuNU0xMCAxMi41TDE0LjE2NjcgOC4zMzMzM00xMCAxMi41VjIuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMVwiICpuZ0lmPVwiIWJ1bGtEb3dubG9hZGluZ1wiPkRvd25sb2FkIFNlbGVjdGVkICh7eyBzZWxlY3RlZEludm9pY2VzLnNpemUgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIiAqbmdJZj1cImJ1bGtEb3dubG9hZGluZ1wiPlByZXBhcmluZyBaSVAuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNlbmRFbWFpbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IGJ0bi1zbSBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyIG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0NsaWVudCAmJiBzZWxlY3RlZEludm9pY2VzLnNpemUgPiAwICYmIChncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5UYW5nb0FkbWluX2ludm9pY2VBcHByb3ZhbF9pc0VkaXRcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnVsa0VtYWlsaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yLjUgNS44MzMzM0w5LjA3IDEwLjQyODNDOS42MzUgMTAuODIzNSAxMC4zNjUgMTAuODIzNSAxMC45MyAxMC40MjgzTDE3LjUgNS44MzMzM000LjE2NjY3IDE1LjgzMzNIMTUuODMzM0MxNi43NTM4IDE1LjgzMzMgMTcuNSAxNS4wODcxIDE3LjUgMTQuMTY2N1Y1LjgzMzMzQzE3LjUgNC45MTI4NiAxNi43NTM4IDQuMTY2NjcgMTUuODMzMyA0LjE2NjY3SDQuMTY2NjdDMy4yNDYxOSA0LjE2NjY3IDIuNSA0LjkxMjg2IDIuNSA1LjgzMzMzVjE0LjE2NjdDMi41IDE1LjA4NzEgMy4yNDYxOSAxNS44MzMzIDQuMTY2NjcgMTUuODMzM1pcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIiAqbmdJZj1cIiFidWxrRW1haWxpbmdcIj5TZW5kIEVtYWlsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIiAqbmdJZj1cImJ1bGtFbWFpbGluZ1wiPlNlbmRpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImFwcHJvdmVTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3MgYnRuLXNtIGFsaWduLWl0ZW1zLWVuZCB0ZXh0LW5vd3JhcCBpbnZoZWFkZXIgbWUtMlwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzQ2xpZW50ICYmIHNlbGVjdGVkSW52b2ljZXMuc2l6ZSA+IDAgJiYgKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LlRhbmdvQWRtaW5faW52b2ljZUFwcHJvdmFsX2lzRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidWxrQXBwcm92aW5nIHx8IHBlbmRpbmdJblNlbGVjdGlvbigpID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNi42NjY3IDVMNy41MDAwMSAxNC4xNjY3TDMuMzMzMzQgMTBcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIiAqbmdJZj1cIiFidWxrQXBwcm92aW5nXCI+QXBwcm92ZSBTZWxlY3RlZCAoe3sgcGVuZGluZ0luU2VsZWN0aW9uKCkgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIiAqbmdJZj1cImJ1bGtBcHByb3ZpbmdcIj5BcHByb3ZpbmcuLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPCEtLSBDcmVhdGUgSW52b2ljZSBmb2xsb3dzIFRhbmdvIEJpbGxpbmcgRURJVCBhY2Nlc3MgKG5vdCBpbnZvaWNlIGFwcHJvdmFsKS4gLS0+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNyZWF0ZUludm9pY2UoKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyIG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0NsaWVudCAmJiAoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9FZGl0QmlsbGluZ19pc0VkaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDQuMTY2NjdWMTUuODMzM000LjE2NjY3IDEwSDE1LjgzMzNcIiBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIj5DcmVhdGUgSW52b2ljZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25FeHBvcnQoKVwiICpuZ0lmPVwiIWlzQ2xpZW50XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaW52b2ljZUxpc3QubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0xXCI+RXhwb3J0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRmlsdGVyIFRhYnMgKyBTZWFyY2ggLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwYXltZW50aGlzdG9yeSBib3JkZXItMCBweC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDwhLS0gJ1BlbmRpbmcgQXBwcm92YWwnIGlzIGludGVybmFsIHBpcGVsaW5lIOKAlCBoaWRkZW4gZm9yIGNsaWVudCBsb2dpbi5cbiAgICAgICAgICAgICAgICAgICAgIENsaWVudHMgc3RpbGwgc2VlIEFsbCAvIFBlbmRpbmcgUGF5bWVudCAvIFBhaWQuIC0tPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IHRhYiBvZiBmaWx0ZXJUYWJzXCIgY2xhc3M9XCJidG4gYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJpc0NsaWVudCAmJiB0YWIgPT09ICdQZW5kaW5nIEFwcHJvdmFsJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGl2ZUZpbHRlciA9PT0gdGFiID8gJ2FjdGl2ZVBsYW5CdG5wcmltYXJ5JyA6ICdpbmFjdGl2ZVBsYW5CdG4nXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldEZpbHRlcih0YWIpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRhYiB9fVxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhYiA9PT0gJ1BlbmRpbmcgQXBwcm92YWwnICYmIHBlbmRpbmdBcHByb3ZhbFwiIGNsYXNzPVwibXMtMSBzbWFsbFwiPnt7IHBlbmRpbmdBcHByb3ZhbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YWIgPT09ICdQZW5kaW5nIFBheW1lbnQnICYmIHBlbmRpbmdQYXltZW50XCIgY2xhc3M9XCJtcy0xIHNtYWxsXCI+e3sgcGVuZGluZ1BheW1lbnQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gaW52b2ljZXNlYXJjaCBzdmctaWNvbi0xIHBvc2l0aW9uLWFic29sdXRlIG10LTYgbXMtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBvcGFjaXR5PVwiMC41XCIgeD1cIjE3LjAzNjVcIiB5PVwiMTUuMTIyM1wiIHdpZHRoPVwiOC4xNTU0NlwiIGhlaWdodD1cIjJcIiByeD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKDQ1IDE3LjAzNjUgMTUuMTIyMylcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9yZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMSAxOUM2LjU1NTU2IDE5IDMgMTUuNDQ0NCAzIDExQzMgNi41NTU1NiA2LjU1NTU2IDMgMTEgM0MxNS40NDQ0IDMgMTkgNi41NTU1NiAxOSAxMUMxOSAxNS40NDQ0IDE1LjQ0NDQgMTkgMTEgMTlaTTExIDVDNy41MzMzMyA1IDUgNy41MzMzMyA1IDExQzUgMTQuNDY2NyA3LjUzMzMzIDE3IDExIDE3QzE0LjQ2NjcgMTcgMTcgMTQuNDY2NyAxNyAxMUMxNyA3LjUzMzMzIDE0LjQ2NjcgNSAxMSA1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwibGVuXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBpbnZvaWNlc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkludm9pY2UgIyBvciBiaWxsaW5nIGdyb3VwLi4uXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKGNoYW5nZSk9XCJzZWFyY2hGaWVsZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VhcmNoRGlzYWJsZWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1maWx0ZXJzIFtkYXRhT2JqZWN0XT1cImludm9pY2VGaWx0ZXJPYmplY3RcIiAoYXBwbGllZEZpbHRlcnMpPVwiYXBwbHlJbnZvaWNlRmlsdGVycygkZXZlbnQpXCI+PC9saWItZmlsdGVycz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBMb2FkaW5nIFNoaW1tZXIgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbnZvaWNlTG9hZGluZ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gTm8gRGF0YSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImludm9pY2VOb0RhdGFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjIHctMjVcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGEuc3ZnXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gSW52b2ljZXMgVGFibGUgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhaW52b2ljZUxvYWRpbmcgJiYgIWludm9pY2VOb0RhdGFcIiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGFjY29yZGlvbiB0YWJsZSBib3R0b20tYm9yZGVyIHRleHQtbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0XCIgc3R5bGU9XCJ3aWR0aDogNDBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RBbGxcIiAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgW2Rpc2FibGVkXT1cImludm9pY2VMaXN0Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNvcnREYXRhKCdpbnZvaWNlJylcIj5JTlZPSUNFICNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRDb2x1bU5hbWUgPT09ICdpbnZvaWNlJyAmJiBzb3J0QnkgPT09IDEgPyAncm90YXRlJyA6ICcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAnaW52b2ljZScgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhaXNDbGllbnRcIj5CSUxMSU5HIEdST1VQPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5QRVJJT0Q8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ2JpbGxpbmdEYXRlJylcIj5HRU5FUkFURURcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRDb2x1bU5hbWUgPT09ICdiaWxsaW5nRGF0ZScgJiYgc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydENvbHVtTmFtZSA9PT0gJ2JpbGxpbmdEYXRlJyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5RVFk8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ2Ftb3VudCcpXCI+QU1PVU5UIChleGNsLiBHU1QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbbmdDbGFzc109XCJzb3J0Q29sdW1OYW1lID09PSAnYW1vdW50JyAmJiBzb3J0QnkgPT09IDEgPyAncm90YXRlJyA6ICcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1OYW1lID09PSAnYW1vdW50JyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5HU1Q8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic29ydERhdGEoJ3RvdGFsQW1vdW50JylcIj5BTU9VTlQgKGluY2wuIEdTVClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInNvcnRDb2x1bU5hbWUgPT09ICd0b3RhbEFtb3VudCcgJiYgc29ydEJ5ID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwic29ydENvbHVtTmFtZSA9PT0gJ3RvdGFsQW1vdW50JyA/ICcjMDBBM0ZGJyA6ICcjNjY3MDg1J1wiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TVEFUVVM8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkFDVElPTjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgaW52IG9mIGludm9pY2VMaXN0OyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0XCIgc3R5bGU9XCJ3aWR0aDogNDBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG10LTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKGludilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUludm9pY2VTZWxlY3QoaW52KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGUgdGFibGUtdGl0bGUtcHJpbWFyeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtaW5kaWNhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpbnY/LnN0YXR1cyA9PT0gJ3BlbmRpbmcnID8gJ2luZGljYXRvci13YXJuaW5nJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnY/LnBheW1lbnRTdGF0dXMgPT09ICdwYWlkJyA/ICdpbmRpY2F0b3Itc3VjY2VzcycgOiAnaW5kaWNhdG9yLXByaW1hcnknXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiaW52b2ljZS1saW5rXCIgKGNsaWNrKT1cIm9wZW5JbnZvaWNlUHJldmlldyhpbnYpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj57eyBpbnY/Lmludm9pY2UgfX08L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFpc0NsaWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy41IDEuMTY2NzVWMi45MTY3NU0xMC41IDEuMTY2NzVWMi45MTY3NU0xLjE2NjY3IDUuNTQxNzVIMTIuODMzM00yLjMzMzMzIDIuMDQxNzVIMTEuNjY2N0MxMi4zMTExIDIuMDQxNzUgMTIuODMzMyAyLjU2NDAyIDEyLjgzMzMgMy4yMDg0MVYxMS42NjY3QzEyLjgzMzMgMTIuMzExMSAxMi4zMTExIDEyLjgzMzQgMTEuNjY2NyAxMi44MzM0SDIuMzMzMzNDMS42ODg5OSAxMi44MzM0IDEuMTY2NjcgMTIuMzExMSAxLjE2NjY3IDExLjY2NjdWMy4yMDg0MUMxLjE2NjY3IDIuNTY0MDIgMS42ODg5OSAyLjA0MTc1IDIuMzMzMzMgMi4wNDE3NVpcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaW52Py5ncm91cE5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwibWUtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjUgMS4xNjY3NVYyLjkxNjc1TTEwLjUgMS4xNjY3NVYyLjkxNjc1TTEuMTY2NjcgNS41NDE3NUgxMi44MzMzTTIuMzMzMzMgMi4wNDE3NUgxMS42NjY3QzEyLjMxMTEgMi4wNDE3NSAxMi44MzMzIDIuNTY0MDIgMTIuODMzMyAzLjIwODQxVjExLjY2NjdDMTIuODMzMyAxMi4zMTExIDEyLjMxMTEgMTIuODMzNCAxMS42NjY3IDEyLjgzMzRIMi4zMzMzM0MxLjY4ODk5IDEyLjgzMzQgMS4xNjY2NyAxMi4zMTExIDEuMTY2NjcgMTEuNjY2N1YzLjIwODQxQzEuMTY2NjcgMi41NjQwMiAxLjY4ODk5IDIuMDQxNzUgMi4zMzMzMyAyLjA0MTc1WlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpbnY/LmJpbGxpbmdEYXRlIHwgZGF0ZTogJ01NTSB5eXl5JyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj57eyBpbnY/LmJpbGxpbmdEYXRlIHwgZGF0ZTogJ2RkIE1NTSB5eXl5JyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGUgdGV4dC1jZW50ZXJcIj48c3Ryb25nPnt7IGludj8uc3RvcmVzIH19PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPnt7IGludm9pY2VDdXJyZW5jeVN5bWJvbChpbnYpIH19e3sgaW52Py5hbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiICpuZ0lmPVwiaXNHc3RBcHBsaWNhYmxlKGludik7IGVsc2Ugbm9Hc3RcIj57eyBpbnZvaWNlQ3VycmVuY3lTeW1ib2woaW52KSB9fXt7IGdzdEFtb3VudChpbnYpIHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9Hc3Q+PGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+4oCUPC9kaXY+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+PHN0cm9uZz57eyBpbnZvaWNlQ3VycmVuY3lTeW1ib2woaW52KSB9fXt7IGludj8udG90YWxBbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2xpZW50cyBvbmx5IHNlZSB0aGUgc3RhdHVzIG9uY2UgdGhlIGludm9pY2UgaXMgQVBQUk9WRURcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGVuIGl0J3MgdGhlIHBheW1lbnQgc3RhdHVzOiBQZW5kaW5nIFBheW1lbnQgLyBQYXJ0aWFsIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaWQpLiBBcHByb3ZhbC1waXBlbGluZSBzdGF0dXNlcyBhcmUgaGlkZGVuIGZyb20gY2xpZW50cy4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0NsaWVudCB8fCBpbnY/LnN0YXR1cyA9PT0gJ2FwcHJvdmVkJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdldFN0YXR1c0NsYXNzKGludilcIiBjbGFzcz1cIm10LTMgY3Vyc29yLXBvaW50ZXJcIiB0aXRsZT1cIlZpZXcgYWN0aXZpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5JbnZvaWNlTG9ncyhpbnYpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEludm9pY2VTdGF0dXMoaW52KSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1BlbmRpbmcoaW52KVwiIGNsYXNzPVwicGVuZGluZy1ub3RlIG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGludm9pY2VDdXJyZW5jeVN5bWJvbChpbnYpIH19e3sgcGVuZGluZ0Ftb3VudChpbnYpIHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fSBwZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGUgZC1mbGV4IGp1c3RpZnktY29udGVudC1hcm91bmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNDbGllbnRcIiBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiIWlzRWRpdEJsb2NrZWQoaW52KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubG9ja2VkLWFjdGlvbl09XCJpc0VkaXRCbG9ja2VkKGludilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFpc0VkaXRCbG9ja2VkKGludikgJiYgZWRpdEludm9pY2UoaW52KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCJlZGl0VG9vbHRpcChpbnYpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF9lZGl0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMlwiIHk9XCIxXCIgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgcng9XCI4XCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjIuNVwiIHk9XCIxLjVcIiB3aWR0aD1cIjM5XCIgaGVpZ2h0PVwiMzlcIiByeD1cIjcuNVwiIHN0cm9rZT1cIiNEMEQ1RERcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTI2LjUgMTQuNUwyOS41IDE3LjVNMTQuNSAyOS41SDE3LjVMMjggMTlDMjguMzk3OCAxOC42MDIyIDI4LjYyMTMgMTguMDY2MyAyOC42MjEzIDE3LjVDMjguNjIxMyAxNi45MzM3IDI4LjM5NzggMTYuMzk3OCAyOCAxNkwyOCAxNkMyNy42MDIyIDE1LjYwMjIgMjcuMDY2MyAxNS4zNzg3IDI2LjUgMTUuMzc4N0MyNS45MzM3IDE1LjM3ODcgMjUuMzk3OCAxNS42MDIyIDI1IDE2TDE0LjUgMjYuNVYyOS41WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIGlkPVwiZmlsdGVyMF9kX2VkaXRcIiB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCIgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIiByZXN1bHQ9XCJoYXJkQWxwaGFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlT2Zmc2V0IGR5PVwiMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCIgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd19lZGl0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIiBpbjI9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfZWRpdFwiIHJlc3VsdD1cInNoYXBlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhcHByb3ZlSW52b2ljZShpbnYpXCIgW25nYlRvb2x0aXBdPVwiZ2V0QXBwcm92ZVRvb2x0aXAoaW52KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0NsaWVudCAmJiBjYW5BcHByb3ZlKGludiwgKGdzLnVzZXJBY2Nlc3MgfCBhc3luYykpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzE2NDc4XzQzMDQwKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMlwiIHk9XCIxXCIgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgcng9XCI4XCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjIuNVwiIHk9XCIxLjVcIiB3aWR0aD1cIjM5XCIgaGVpZ2h0PVwiMzlcIiByeD1cIjcuNVwiIHN0cm9rZT1cIiNEMEQ1RERcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzE2NDc4XzQzMDQwKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTMwLjMzNDYgMjAuMjMzNVYyMS4wMDAyQzMwLjMzMzYgMjIuNzk3MiAyOS43NTE3IDI0LjU0NTggMjguNjc1NyAyNS45ODUxQzI3LjU5OTggMjcuNDI0NCAyNi4wODc0IDI4LjQ3NzMgMjQuMzY0MSAyOC45ODY4QzIyLjY0MDggMjkuNDk2MyAyMC43OTkgMjkuNDM1MSAxOS4xMTM0IDI4LjgxMjRDMTcuNDI3NyAyOC4xODk2IDE1Ljk4ODUgMjcuMDM4NiAxNS4wMTA0IDI1LjUzMTFDMTQuMDMyNCAyNC4wMjM2IDEzLjU2NzggMjIuMjQwMyAxMy42ODYgMjAuNDQ3MUMxMy44MDQzIDE4LjY1NCAxNC40OTkgMTYuOTQ3MiAxNS42NjY1IDE1LjU4MTFDMTYuODM0MSAxNC4yMTUxIDE4LjQxMiAxMy4yNjMgMjAuMTY0OCAxMi44NjdDMjEuOTE3NiAxMi40NzEgMjMuNzUxNSAxMi42NTIyIDI1LjM5MyAxMy4zODM1TTMwLjMzNDYgMTQuMzMzNUwyMi4wMDEzIDIyLjY3NTJMMTkuNTAxMyAyMC4xNzUyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF8xNjQ3OF80MzA0MFwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzE2NDc4XzQzMDQwXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd18xNjQ3OF80MzA0MFwiIHJlc3VsdD1cInNoYXBlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE2NDc4XzQzMDQwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxMiAxMSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ2xpZW50ICYmIGludi5zdGF0dXM9PT0nYXBwcm92ZWQnICYmIChncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5UYW5nb0FkbWluX2ludm9pY2VBcHByb3ZhbF9pc0VkaXRcIiBuZ2JUb29sdGlwPVwiQWxyZWFkeSBBcHByb3ZlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCIgdmlld0JveD1cIjAgMCA0NCA0NFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsdGVyPVwidXJsKCNmaWx0ZXIwX2RfMTY2MzBfODA2MilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRUFFQ0YwXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNjYzMF84MDYyKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTMwLjMzNDYgMjAuMjMzNVYyMS4wMDAyQzMwLjMzMzYgMjIuNzk3MiAyOS43NTE3IDI0LjU0NTggMjguNjc1NyAyNS45ODUxQzI3LjU5OTggMjcuNDI0NCAyNi4wODc0IDI4LjQ3NzMgMjQuMzY0MSAyOC45ODY4QzIyLjY0MDggMjkuNDk2MyAyMC43OTkgMjkuNDM1MSAxOS4xMTM0IDI4LjgxMjRDMTcuNDI3NyAyOC4xODk2IDE1Ljk4ODUgMjcuMDM4NiAxNS4wMTA0IDI1LjUzMTFDMTQuMDMyNCAyNC4wMjM2IDEzLjU2NzggMjIuMjQwMyAxMy42ODYgMjAuNDQ3MUMxMy44MDQzIDE4LjY1NCAxNC40OTkgMTYuOTQ3MiAxNS42NjY1IDE1LjU4MTFDMTYuODM0MSAxNC4yMTUxIDE4LjQxMiAxMy4yNjMgMjAuMTY0OCAxMi44NjdDMjEuOTE3NiAxMi40NzEgMjMuNzUxNSAxMi42NTIyIDI1LjM5MyAxMy4zODM1TTMwLjMzNDYgMTQuMzMzNUwyMi4wMDEzIDIyLjY3NTJMMTkuNTAxMyAyMC4xNzUyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRDBENUREXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF8xNjYzMF84MDYyXCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz1cInVzZXJTcGFjZU9uVXNlXCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVwic1JHQlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT1cIjBcIiByZXN1bHQ9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJoYXJkQWxwaGFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlT2Zmc2V0IGR5PVwiMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW4yPVwiQmFja2dyb3VuZEltYWdlRml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfMTY2MzBfODA2MlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjI9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfMTY2MzBfODA2MlwiIHJlc3VsdD1cInNoYXBlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE2NjMwXzgwNjJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEyIDExKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNDbGllbnQgJiYgaGFzQXBwcm92ZXJBY2Nlc3NcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInJlZ2VuZXJhdGVJbnZvaWNlKGludilcIiBuZ2JUb29sdGlwPVwiUmVnZW5lcmF0ZSBJbnZvaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF8xNTUzMF82MDM5NSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMzEuMTY1NCAxNC4zMzMzVjE5LjMzMzNNMzEuMTY1NCAxOS4zMzMzSDI2LjE2NTRNMzEuMTY1NCAxOS4zMzMzTDI3LjI5ODcgMTUuN0MyNi40MDMxIDE0LjgwMzkgMjUuMjk1MSAxNC4xNDkzIDI0LjA3OCAxMy43OTczQzIyLjg2MSAxMy40NDUzIDIxLjU3NDYgMTMuNDA3MyAyMC4zMzg5IDEzLjY4NjlDMTkuMTAzMyAxMy45NjY1IDE3Ljk1ODUgMTQuNTU0NSAxNy4wMTE2IDE1LjM5NjJDMTYuMDY0NiAxNi4yMzc4IDE1LjM0NjMgMTcuMzA1NiAxNC45MjM3IDE4LjVNMTIuODMyIDI3LjY2NjZWMjIuNjY2Nk0xMi44MzIgMjIuNjY2NkgxNy44MzJNMTIuODMyIDIyLjY2NjZMMTYuNjk4NyAyNi4zQzE3LjU5NDMgMjcuMTk2MSAxOC43MDIzIDI3Ljg1MDYgMTkuOTE5NCAyOC4yMDI3QzIxLjEzNjQgMjguNTU0NyAyMi40MjI4IDI4LjU5MjcgMjMuNjU4NSAyOC4zMTMxQzI0Ljg5NDEgMjguMDMzNSAyNi4wMzg5IDI3LjQ0NTUgMjYuOTg1OCAyNi42MDM4QzI3LjkzMjggMjUuNzYyMSAyOC42NTExIDI0LjY5NDMgMjkuMDczNyAyMy41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIGlkPVwiZmlsdGVyMF9kXzE1NTMwXzYwMzk1XCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz1cInVzZXJTcGFjZU9uVXNlXCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVwic1JHQlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT1cIjBcIiByZXN1bHQ9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJoYXJkQWxwaGFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlT2Zmc2V0IGR5PVwiMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW4yPVwiQmFja2dyb3VuZEltYWdlRml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfMTU1MzBfNjAzOTVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93XzE1NTMwXzYwMzk1XCIgcmVzdWx0PVwic2hhcGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0NsaWVudCAmJiAoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uR2xvYmFsX0JpbGxpbmdfaXNFZGl0XCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJwYXltZW50c3RhdHVzQ2hhbmdlKGludilcIiBuZ2JUb29sdGlwPVwiUGF5bWVudCBTdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMi41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMTMsIDExKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIuOTk4NyA4LjAwMDY1VjYuMzMzOThDMi45OTg3IDUuMDA3OSAzLjUyNTQ4IDMuNzM2MTMgNC40NjMxNiAyLjc5ODQ1QzUuNDAwODUgMS44NjA3NyA2LjY3MjYyIDEuMzMzOTggNy45OTg3IDEuMzMzOThDOS4zMjQ3OCAxLjMzMzk4IDEwLjU5NjYgMS44NjA3NyAxMS41MzQyIDIuNzk4NDVDMTIuNDcxOSAzLjczNjEzIDEyLjk5ODcgNS4wMDc5IDEyLjk5ODcgNi4zMzM5OFY4LjAwMDY1TTEuMzMyMDMgMTMuMDAwN0MxLjMzMjAzIDEzLjQ0MjcgMS41MDc2MyAxMy44NjY2IDEuODIwMTkgMTQuMTc5MkMyLjEzMjc1IDE0LjQ5MTcgMi41NTY2NyAxNC42NjczIDIuOTk4NyAxNC42NjczQzMuNDQwNzMgMTQuNjY3MyAzLjg2NDY1IDE0LjQ5MTcgNC4xNzcyMSAxNC4xNzkyQzQuNDg5NzcgMTMuODY2NiA0LjY2NTM2IDEzLjQ0MjcgNC42NjUzNiAxMy4wMDA3QzQuNjY1MzYgMTIuNTU4NiA0LjQ4OTc3IDEyLjEzNDcgNC4xNzcyMSAxMS44MjIxQzMuODY0NjUgMTEuNTA5NiAzLjQ0MDczIDExLjMzNCAyLjk5ODcgMTEuMzM0QzIuNTU2NjcgMTEuMzM0IDIuMTMyNzUgMTEuNTA5NiAxLjgyMDE5IDExLjgyMjFDMS41MDc2MyAxMi4xMzQ3IDEuMzMyMDMgMTIuNTU4NiAxLjMzMjAzIDEzLjAwMDdaTTExLjMzMiAxMy4wMDA3QzExLjMzMiAxMy40NDI3IDExLjUwNzYgMTMuODY2NiAxMS44MjAyIDE0LjE3OTJDMTIuMTMyNyAxNC40OTE3IDEyLjU1NjcgMTQuNjY3MyAxMi45OTg3IDE0LjY2NzNDMTMuNDQwNyAxNC42NjczIDEzLjg2NDYgMTQuNDkxNyAxNC4xNzcyIDE0LjE3OTJDMTQuNDg5OCAxMy44NjY2IDE0LjY2NTQgMTMuNDQyNyAxNC42NjU0IDEzLjAwMDdDMTQuNjY1NCAxMi41NTg2IDE0LjQ4OTggMTIuMTM0NyAxNC4xNzcyIDExLjgyMjFDMTMuODY0NiAxMS41MDk2IDEzLjQ0MDcgMTEuMzM0IDEyLjk5ODcgMTEuMzM0QzEyLjU1NjcgMTEuMzM0IDEyLjEzMjcgMTEuNTA5NiAxMS44MjAyIDExLjgyMjFDMTEuNTA3NiAxMi4xMzQ3IDExLjMzMiAxMi41NTg2IDExLjMzMiAxMy4wMDA3WlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwLjUgNS41TDEzIDhMMTUuNSA1LjVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiZG93bmxvYWRJbnZvaWNlKGludilcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgbmdiVG9vbHRpcD1cIkRvd25sb2FkIEludm9pY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCIgdmlld0JveD1cIjAgMCA0NCA0NFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzE1NTMwXzYwMzk2KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMlwiIHk9XCIxXCIgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgcng9XCI4XCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjIuNVwiIHk9XCIxLjVcIiB3aWR0aD1cIjM5XCIgaGVpZ2h0PVwiMzlcIiByeD1cIjcuNVwiIHN0cm9rZT1cIiNEMEQ1RERcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yOS41IDIzLjVWMjYuODMzM0MyOS41IDI3LjI3NTQgMjkuMzI0NCAyNy42OTkzIDI5LjAxMTggMjguMDExOEMyOC42OTkzIDI4LjMyNDQgMjguMjc1NCAyOC41IDI3LjgzMzMgMjguNUgxNi4xNjY3QzE1LjcyNDYgMjguNSAxNS4zMDA3IDI4LjMyNDQgMTQuOTg4MiAyOC4wMTE4QzE0LjY3NTYgMjcuNjk5MyAxNC41IDI3LjI3NTQgMTQuNSAyNi44MzMzVjIzLjVNMTcuODMzMyAxOS4zMzMzTDIyIDIzLjVNMjIgMjMuNUwyNi4xNjY3IDE5LjMzMzNNMjIgMjMuNVYxMy41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIGlkPVwiZmlsdGVyMF9kXzE1NTMwXzYwMzk2XCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz1cInVzZXJTcGFjZU9uVXNlXCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVwic1JHQlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT1cIjBcIiByZXN1bHQ9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJoYXJkQWxwaGFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlT2Zmc2V0IGR5PVwiMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW4yPVwiQmFja2dyb3VuZEltYWdlRml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfMTU1MzBfNjAzOTZcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93XzE1NTMwXzYwMzk2XCIgcmVzdWx0PVwic2hhcGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENhbmNlbCBpbnZvaWNlIChhcHByb3ZlZCArIHVucGFpZCBvbmx5KSDigJQgcmVwbGFjZXMgdGhlIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNsb3QgZm9yIGNhbmNlbGxhYmxlIHJvd3MuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENhbmNlbGxpbmcgaXMgYSBmaW5hbmNlIGFjdGlvbjogb25seSB1c2VycyB3aXRoIEZpbmFuY2UgQXBwcm92YWwgYWNjZXNzLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNDbGllbnQgJiYgY2FuU2hvd0NhbmNlbChpbnYsIChncy51c2VyQWNjZXNzIHwgYXN5bmMpKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbEludm9pY2UoaW52KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiQ2FuY2VsIEludm9pY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCIgdmlld0JveD1cIjAgMCA0NCA0NFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kX2NhbmNlbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yOC41IDE1LjVMMTUuNSAyOC41TTE1LjUgMTUuNUwyOC41IDI4LjVcIiBzdHJva2U9XCIjRDkyRDIwXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIGlkPVwiZmlsdGVyMF9kX2NhbmNlbFwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiBmaWx0ZXJVbml0cz1cInVzZXJTcGFjZU9uVXNlXCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVwic1JHQlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT1cIjBcIiByZXN1bHQ9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiIHJlc3VsdD1cImhhcmRBbHBoYVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVPZmZzZXQgZHk9XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIiB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW4yPVwiQmFja2dyb3VuZEltYWdlRml4XCIgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93X2NhbmNlbFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCIgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93X2NhbmNlbFwiIHJlc3VsdD1cInNoYXBlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERlbGV0ZSDigJQgSElEREVOIChub3QgZGlzYWJsZWQpIG9uY2UgaXQgbm8gbG9uZ2VyIGFwcGxpZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGFibGUgcm93cyBzaG93IENhbmNlbCBpbnN0ZWFkOyBudW1iZXItbWludGVkL2xvY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3Mgc2hvdyBuZWl0aGVyLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNDbGllbnQgJiYgIWNhbkNhbmNlbEludm9pY2UoaW52KSAmJiAhaXNEZWxldGVMb2NrZWQoaW52KVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUludm9pY2UoaW52KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiRGVsZXRlIEludm9pY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCIgdmlld0JveD1cIjAgMCA0NCA0NFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kX2RlbGV0ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMVwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNyAyMUgyN00xNS41IDE3SDI4LjVNMTkuNSAyNUgyNC41TTE2LjE2NjcgMjguNUgyNy44MzMzQzI4Ljc1MzggMjguNSAyOS41IDI3Ljc1MzggMjkuNSAyNi44MzMzVjE1LjE2NjdDMjkuNSAxNC4yNDYyIDI4Ljc1MzggMTMuNSAyNy44MzMzIDEzLjVIMTYuMTY2N0MxNS4yNDYyIDEzLjUgMTQuNSAxNC4yNDYyIDE0LjUgMTUuMTY2N1YyNi44MzMzQzE0LjUgMjcuNzUzOCAxNS4yNDYyIDI4LjUgMTYuMTY2NyAyOC41WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRDkyRDIwXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIGlkPVwiZmlsdGVyMF9kX2RlbGV0ZVwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cIkJhY2tncm91bmRJbWFnZUZpeFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93X2RlbGV0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjI9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfZGVsZXRlXCIgcmVzdWx0PVwic2hhcGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgIDx0Zm9vdD5cbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiaW52b2ljZS10b3RhbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5UYW5nb0FkbWluX2ludm9pY2VBcHByb3ZhbF9pc0VkaXRcIj48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBMZWFkaW5nIHNwYW4gY292ZXJzIElOVk9JQ0UjICsgUEVSSU9EICsgR0VORVJBVEVELCBwbHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJTExJTkcgR1JPVVAgZm9yIG5vbi1jbGllbnQgdmlld3MgKHRoYXQgY29sdW1uIGlzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY2xpZW50cykuIFdpdGhvdXQgdGhlIGlzQ2xpZW50IGFkanVzdG1lbnQgdGhlIHRvdGFsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdGVkIG9uZSBjb2x1bW4gcmlnaHQgb24gY2xpZW50IGxvZ2luLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImlzQ2xpZW50ID8gMyA6IDRcIj48c3Ryb25nPlRvdGFsIMK3IHt7IHRvdGFsSW52b2ljZXMgfX0gaW52b2ljZXM8L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+e3sgdG90YWxTdG9yZXMgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48c3Ryb25nPuKCuXt7IHRvdGFsQW1vdW50RXhjbEdzdCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+4oK5e3sgdG90YWxHc3QgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48c3Ryb25nPuKCuXt7IHRvdGFsQW1vdW50SW5jbEdzdCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBFYWNoIGNyZWRpdCBub3RlIGdlbmVyYXRlZCBpbiB0aGlzIHBlcmlvZCAoYnkgaXRzIG93biBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCB0aGUgZGF0ZSBvZiB0aGUgaW52b2ljZSBpdCdzIGFnYWluc3QpLCBvbiB0aGUgXCJBbGxcIiB2aWV3OlxuICAgICAgICAgICAgICAgICAgICAgICAgIGl0cyBudW1iZXIgKGFuZCBzb3VyY2UgaW52b2ljZSksIGJpbGxpbmcgZ3JvdXAsIHRoZSBzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvaWNlJ3MgcGVyaW9kLCBpdHMgb3duIGRhdGUsIHN0b3JlcyBjb3ZlcmVkLCBhbmQgY3JlZGl0IC9cbiAgICAgICAgICAgICAgICAgICAgICAgICBHU1QgYXQgdGhlIHNvdXJjZSBpbnZvaWNlJ3MgcmF0ZSAvIGluY2wuIEdTVC4gVGhlbiB0aGUgbmV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgYWZ0ZXIgdGhlbSwgc28gdGhpcyBtb250aCdzIGNyZWRpdCBjb21lcyBvZmYgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoJ3MgaW52b2ljZXMuIENyZWRpdCBkb2Vzbid0IGNoYW5nZSBhbnkgc2luZ2xlIGludm9pY2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgVGFuZ28gb25seSwgbGlrZSBjcmVkaXQgbm90ZXMuIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQ2xpZW50ICYmIGNyZWRpdE5vdGVzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImludm9pY2UtY3JlZGl0LXJvd1wiICpuZ0Zvcj1cImxldCBjbiBvZiBjcmVkaXROb3Rlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5UYW5nb0FkbWluX2ludm9pY2VBcHByb3ZhbF9pc0VkaXRcIj48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+PHN0cm9uZz57eyBjbi5jcmVkaXROb3RlIH19PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcmVkaXQtcmVmXCI+QWdhaW5zdCB7eyBjbi5pbnZvaWNlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhaXNDbGllbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNSAxLjE2Njc1VjIuOTE2NzVNMTAuNSAxLjE2Njc1VjIuOTE2NzVNMS4xNjY2NyA1LjU0MTc1SDEyLjgzMzNNMi4zMzMzMyAyLjA0MTc1SDExLjY2NjdDMTIuMzExMSAyLjA0MTc1IDEyLjgzMzMgMi41NjQwMiAxMi44MzMzIDMuMjA4NDFWMTEuNjY2N0MxMi44MzMzIDEyLjMxMTEgMTIuMzExMSAxMi44MzM0IDExLjY2NjcgMTIuODMzNEgyLjMzMzMzQzEuNjg4OTkgMTIuODMzNCAxLjE2NjY3IDEyLjMxMTEgMS4xNjY2NyAxMS42NjY3VjMuMjA4NDFDMS4xNjY2NyAyLjU2NDAyIDEuNjg4OTkgMi4wNDE3NSAyLjMzMzMzIDIuMDQxNzVaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY24uZ3JvdXBOYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwibWUtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy41IDEuMTY2NzVWMi45MTY3NU0xMC41IDEuMTY2NzVWMi45MTY3NU0xLjE2NjY3IDUuNTQxNzVIMTIuODMzM00yLjMzMzMzIDIuMDQxNzVIMTEuNjY2N0MxMi4zMTExIDIuMDQxNzUgMTIuODMzMyAyLjU2NDAyIDEyLjgzMzMgMy4yMDg0MVYxMS42NjY3QzEyLjgzMzMgMTIuMzExMSAxMi4zMTExIDEyLjgzMzQgMTEuNjY2NyAxMi44MzM0SDIuMzMzMzNDMS42ODg5OSAxMi44MzM0IDEuMTY2NjcgMTIuMzExMSAxLjE2NjY3IDExLjY2NjdWMy4yMDg0MUMxLjE2NjY3IDIuNTY0MDIgMS42ODg5OSAyLjA0MTc1IDIuMzMzMzMgMi4wNDE3NVpcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjbi5wZXJpb2QgfCBkYXRlOiAnTU1NIHl5eXknIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj57eyBjbi5jcmVkaXROb3RlRGF0ZSB8IGRhdGU6ICdkZCBNTU0geXl5eScgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlIHRleHQtY2VudGVyXCI+PHN0cm9uZz57eyBjbi5zdG9yZXMgfX08L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNyZWRpdC1hbW91bnRcIj4tIHt7IGludm9pY2VDdXJyZW5jeVN5bWJvbChjbikgfX17eyBjbi5hbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjcmVkaXQtYW1vdW50XCI+LSB7eyBpbnZvaWNlQ3VycmVuY3lTeW1ib2woY24pIH19e3sgY24uZ3N0IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY3JlZGl0LWFtb3VudFwiPjxzdHJvbmc+LSB7eyBpbnZvaWNlQ3VycmVuY3lTeW1ib2woY24pIH19e3sgY24udG90YWxBbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9XCJjcmVkaXQtYmFkZ2VcIj5DcmVkaXQgbm90ZTwvc3Bhbj48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTYW1lIEVkaXQgLyBEb3dubG9hZCBpY29ucyBhcyB0aGUgaW52b2ljZSByb3dzLiBDcmVkaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlcyBoYXZlIG5vIGFwcHJvdmFsLCBwYXltZW50IG9yIGNhbmNlbCBzdGVwcy4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZSBkLWZsZXggY3JlZGl0LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzcy5jdXJzb3ItcG9pbnRlcl09XCJoYXNBcHByb3ZlckFjY2Vzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmxvY2tlZC1hY3Rpb25dPVwiIWhhc0FwcHJvdmVyQWNjZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdENyZWRpdE5vdGUoY24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCJoYXNBcHByb3ZlckFjY2VzcyA/ICdFZGl0IENyZWRpdCBOb3RlJyA6ICdPbmx5IEZpbmFuY2UgLyBJbnZvaWNlIGFwcHJvdmVycyBjYW4gZWRpdCBjcmVkaXQgbm90ZXMnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBmaWxsPVwid2hpdGVcIiBzdHJva2U9XCIjRDBENUREXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTI2LjUgMTQuNUwyOS41IDE3LjVNMTQuNSAyOS41SDE3LjVMMjggMTlDMjguMzk3OCAxOC42MDIyIDI4LjYyMTMgMTguMDY2MyAyOC42MjEzIDE3LjVDMjguNjIxMyAxNi45MzM3IDI4LjM5NzggMTYuMzk3OCAyOCAxNkMyNy42MDIyIDE1LjYwMjIgMjcuMDY2MyAxNS4zNzg3IDI2LjUgMTUuMzc4N0MyNS45MzM3IDE1LjM3ODcgMjUuMzk3OCAxNS42MDIyIDI1IDE2TDE0LjUgMjYuNVYyOS41WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJkb3dubG9hZENyZWRpdE5vdGUoY24pXCIgbmdiVG9vbHRpcD1cIkRvd25sb2FkIENyZWRpdCBOb3RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDQ0IDQ0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCIzOVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBmaWxsPVwid2hpdGVcIiBzdHJva2U9XCIjRDBENUREXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTI5LjUgMjMuNVYyNi44MzMzQzI5LjUgMjcuMjc1NCAyOS4zMjQ0IDI3LjY5OTMgMjkuMDExOCAyOC4wMTE4QzI4LjY5OTMgMjguMzI0NCAyOC4yNzU0IDI4LjUgMjcuODMzMyAyOC41SDE2LjE2NjdDMTUuNzI0NiAyOC41IDE1LjMwMDcgMjguMzI0NCAxNC45ODgyIDI4LjAxMThDMTQuNjc1NiAyNy42OTkzIDE0LjUgMjcuMjc1NCAxNC41IDI2LjgzMzNWMjMuNU0xNy44MzMzIDE5LjMzMzNMMjIgMjMuNU0yMiAyMy41TDI2LjE2NjcgMTkuMzMzM00yMiAyMy41VjEzLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImhhc0FwcHJvdmVyQWNjZXNzXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJkZWxldGVDcmVkaXROb3RlKGNuKVwiIG5nYlRvb2x0aXA9XCJEZWxldGUgQ3JlZGl0IE5vdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDRcIiBoZWlnaHQ9XCI0NFwiIHZpZXdCb3g9XCIwIDAgNDQgNDRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjIuNVwiIHk9XCIxLjVcIiB3aWR0aD1cIjM5XCIgaGVpZ2h0PVwiMzlcIiByeD1cIjcuNVwiIGZpbGw9XCJ3aGl0ZVwiIHN0cm9rZT1cIiNEMEQ1RERcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcgMjFIMjdNMTUuNSAxN0gyOC41TTE5LjUgMjVIMjQuNU0xNi4xNjY3IDI4LjVIMjcuODMzM0MyOC43NTM4IDI4LjUgMjkuNSAyNy43NTM4IDI5LjUgMjYuODMzM1YxNS4xNjY3QzI5LjUgMTQuMjQ2MiAyOC43NTM4IDEzLjUgMjcuODMzMyAxMy41SDE2LjE2NjdDMTUuMjQ2MiAxMy41IDE0LjUgMTQuMjQ2MiAxNC41IDE1LjE2NjdWMjYuODMzM0MxNC41IDI3Ljc1MzggMTUuMjQ2MiAyOC41IDE2LjE2NjcgMjguNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0Q5MkQyMFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJpbnZvaWNlLW5ldC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uVGFuZ29BZG1pbl9pbnZvaWNlQXBwcm92YWxfaXNFZGl0XCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJpc0NsaWVudCA/IDMgOiA0XCI+PHN0cm9uZz5OZXQgdG90YWwgwrcgYWZ0ZXIgY3JlZGl0IG5vdGVzPC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHN0cm9uZz7igrl7eyBuZXRBbW91bnRFeGNsR3N0IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+4oK5e3sgbmV0R3N0IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+4oK5e3sgbmV0QW1vdW50SW5jbEdzdCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC90Zm9vdD5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWludm9pY2VMb2FkaW5nICYmICFpbnZvaWNlTm9EYXRhXCI+XG4gICAgICAgICAgICAgICAgPGxpYi1wYWdpbmF0aW9uIGNsYXNzPVwidGV4dC1zdGFydFwiIFtpdGVtc1BlclBhZ2VdPVwiaXRlbXNQZXJQYWdlXCIgW2N1cnJlbnRQYWdlXT1cImN1cnJlbnRQYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwidG90YWxJdGVtc1wiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIiAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIERhaWx5IFByaWNpbmcgU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibXgtMyBtdC00IG1iLTRcIiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnZGFpbHktcHJpY2luZydcIj5cbiAgICAgICAgPGxpYi1kYWlseS1wcmljaW5nIFtjbGllbnRJZF09XCJicmFuZElkXCI+PC9saWItZGFpbHktcHJpY2luZz5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQmlsbGluZyBHcm91cHMgU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibXgtMyBtdC00IG1iLTRcIiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnYmlsbGluZy1ncm91cHMnXCI+XG4gICAgICAgIDxsaWItYmlsbGluZy1ncm91cHMgW2NsaWVudElkXT1cImJyYW5kSWRcIj48L2xpYi1iaWxsaW5nLWdyb3Vwcz5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gUHVyY2hhc2UgT3JkZXIgU2VjdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibXgtMyBtdC00IG1iLTRcIiAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAncHVyY2hhc2Utb3JkZXInXCI+XG4gICAgICAgIDxsaWItcHVyY2hhc2Utb3JkZXIgW2NsaWVudElkXT1cImJyYW5kSWRcIj48L2xpYi1wdXJjaGFzZS1vcmRlcj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==