tango-app-ui-manage-billing 3.3.2 → 3.3.4
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.
- package/esm2022/lib/components/billing-groups/billing-group-form/billing-group-form.component.mjs +17 -5
- package/esm2022/lib/components/billing-groups/billing-groups.component.mjs +82 -6
- package/esm2022/lib/components/billing-groups/bulk-upload-error/bulk-upload-error.component.mjs +54 -0
- package/esm2022/lib/components/billing-groups/delete-warning/delete-warning.component.mjs +19 -0
- package/esm2022/lib/components/brand-invoices/brand-invoices.component.mjs +216 -38
- package/esm2022/lib/components/brands-billing/brands-billing.component.mjs +26 -8
- package/esm2022/lib/components/daily-pricing/daily-pricing.component.mjs +9 -6
- package/esm2022/lib/components/invoice-preview/amount-in-words.util.mjs +19 -0
- package/esm2022/lib/components/invoice-preview/invoice-preview.component.mjs +119 -0
- package/esm2022/lib/components/invoice-settings-modal/invoice-settings-modal.component.mjs +133 -0
- package/esm2022/lib/components/services/billing.service.mjs +35 -1
- package/esm2022/lib/components/setup-billing/setup-billing.component.mjs +4 -2
- package/esm2022/lib/components/tango-manage-billing/delete-confirmation/delete-confirmation.component.mjs +16 -0
- package/esm2022/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.mjs +10 -4
- package/esm2022/lib/components/tango-manage-billing/tango-manage-billing.component.mjs +10 -3
- package/esm2022/lib/tango-manage-billing.module.mjs +18 -3
- package/fesm2022/tango-app-ui-manage-billing.mjs +737 -62
- package/fesm2022/tango-app-ui-manage-billing.mjs.map +1 -1
- package/lib/components/billing-groups/billing-group-form/billing-group-form.component.d.ts +1 -0
- package/lib/components/billing-groups/billing-groups.component.d.ts +6 -1
- package/lib/components/billing-groups/bulk-upload-error/bulk-upload-error.component.d.ts +19 -0
- package/lib/components/billing-groups/delete-warning/delete-warning.component.d.ts +9 -0
- package/lib/components/brand-invoices/brand-invoices.component.d.ts +11 -0
- package/lib/components/brands-billing/brands-billing.component.d.ts +5 -1
- package/lib/components/invoice-preview/amount-in-words.util.d.ts +1 -0
- package/lib/components/invoice-preview/invoice-preview.component.d.ts +29 -0
- package/lib/components/invoice-settings-modal/invoice-settings-modal.component.d.ts +32 -0
- package/lib/components/services/billing.service.d.ts +15 -0
- package/lib/components/tango-manage-billing/delete-confirmation/delete-confirmation.component.d.ts +8 -0
- package/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.d.ts +1 -0
- package/lib/tango-manage-billing.module.d.ts +11 -6
- package/package.json +1 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
1
|
+
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
2
|
import { Subject, takeUntil } from 'rxjs';
|
|
3
3
|
import { BillingGroupFormComponent } from './billing-group-form/billing-group-form.component';
|
|
4
|
-
import {
|
|
4
|
+
import { DeleteWarningComponent } from './delete-warning/delete-warning.component';
|
|
5
|
+
import { BulkUploadErrorComponent } from './bulk-upload-error/bulk-upload-error.component';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
import * as i1 from "../services/billing.service";
|
|
7
8
|
import * as i2 from "tango-app-ui-shared";
|
|
@@ -17,6 +18,9 @@ export class BillingGroupsComponent {
|
|
|
17
18
|
clientId = '';
|
|
18
19
|
len;
|
|
19
20
|
searchDisabled = false;
|
|
21
|
+
bulkDownloading = false;
|
|
22
|
+
bulkUploading = false;
|
|
23
|
+
bulkUploadInput;
|
|
20
24
|
// Summary
|
|
21
25
|
summary = {};
|
|
22
26
|
// Table
|
|
@@ -126,9 +130,10 @@ export class BillingGroupsComponent {
|
|
|
126
130
|
}).catch(() => { });
|
|
127
131
|
}
|
|
128
132
|
deleteBillingGroup(group) {
|
|
129
|
-
const modalRef = this.modalService.open(
|
|
133
|
+
const modalRef = this.modalService.open(DeleteWarningComponent, {
|
|
130
134
|
centered: true, size: 'md', scrollable: true,
|
|
131
135
|
});
|
|
136
|
+
modalRef.componentInstance.groupName = group?.groupName || '';
|
|
132
137
|
modalRef.result.then((result) => {
|
|
133
138
|
if (result === 'Yes') {
|
|
134
139
|
this.billingService.deleteBillingGroup(group._id).pipe(takeUntil(this.destroy$)).subscribe({
|
|
@@ -193,13 +198,84 @@ export class BillingGroupsComponent {
|
|
|
193
198
|
}
|
|
194
199
|
});
|
|
195
200
|
}
|
|
201
|
+
bulkDownload() {
|
|
202
|
+
if (this.bulkDownloading)
|
|
203
|
+
return;
|
|
204
|
+
if (!this.clientId) {
|
|
205
|
+
this.toast.getErrorToast('Select a brand first');
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
this.bulkDownloading = true;
|
|
209
|
+
this.billingService.bulkDownloadBillingGroups(this.clientId).pipe(takeUntil(this.destroy$)).subscribe({
|
|
210
|
+
next: (res) => {
|
|
211
|
+
this.billingService.saveAsTemplate(res, `billing-groups-${this.clientId}-${new Date().toISOString().slice(0, 10)}`);
|
|
212
|
+
this.bulkDownloading = false;
|
|
213
|
+
this.changeDetector.detectChanges();
|
|
214
|
+
},
|
|
215
|
+
error: () => {
|
|
216
|
+
this.bulkDownloading = false;
|
|
217
|
+
this.toast.getErrorToast('Bulk download failed');
|
|
218
|
+
this.changeDetector.detectChanges();
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
onBulkUploadFileSelected(event) {
|
|
223
|
+
const file = event?.target?.files?.[0];
|
|
224
|
+
if (!file)
|
|
225
|
+
return;
|
|
226
|
+
event.target.value = '';
|
|
227
|
+
if (!this.clientId) {
|
|
228
|
+
this.toast.getErrorToast('Select a brand first');
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
this.bulkUploading = true;
|
|
232
|
+
this.billingService.bulkUpdateBillingGroups(file, this.clientId).pipe(takeUntil(this.destroy$)).subscribe({
|
|
233
|
+
next: (res) => {
|
|
234
|
+
this.bulkUploading = false;
|
|
235
|
+
const updated = res?.data?.summary?.updated ?? 0;
|
|
236
|
+
this.toast.getPrimaryToast(`Updated ${updated} billing group(s)`);
|
|
237
|
+
this.loadBillingGroups();
|
|
238
|
+
},
|
|
239
|
+
error: (err) => {
|
|
240
|
+
this.bulkUploading = false;
|
|
241
|
+
const errPayload = err?.error?.data || err?.error;
|
|
242
|
+
if (err?.status === 422 && errPayload?.errors) {
|
|
243
|
+
const modalRef = this.modalService.open(BulkUploadErrorComponent, {
|
|
244
|
+
centered: true, size: 'lg', scrollable: true,
|
|
245
|
+
});
|
|
246
|
+
modalRef.componentInstance.errors = errPayload.errors;
|
|
247
|
+
modalRef.componentInstance.total = errPayload.summary?.total ?? 0;
|
|
248
|
+
modalRef.componentInstance.failed = errPayload.summary?.failed ?? 0;
|
|
249
|
+
}
|
|
250
|
+
else if (err?.status === 413) {
|
|
251
|
+
this.toast.getErrorToast('File too large (max 5MB)');
|
|
252
|
+
}
|
|
253
|
+
else if (err?.status === 400) {
|
|
254
|
+
const msg = err?.error?.message || errPayload?.message || 'Invalid file format — use XLSX';
|
|
255
|
+
this.toast.getErrorToast(msg);
|
|
256
|
+
}
|
|
257
|
+
else if (err?.status === 207) {
|
|
258
|
+
const updated = errPayload?.summary?.updated ?? 0;
|
|
259
|
+
this.toast.getErrorToast(`Bulk upload partially applied: ${updated} updated, then aborted. Please re-upload.`);
|
|
260
|
+
this.loadBillingGroups();
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
this.toast.getErrorToast('Bulk upload failed');
|
|
264
|
+
}
|
|
265
|
+
this.changeDetector.detectChanges();
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
}
|
|
196
269
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingGroupsComponent, deps: [{ token: i1.BillingService }, { token: i0.ChangeDetectorRef }, { token: i2.ToastService }, { token: i3.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
|
|
197
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BillingGroupsComponent, selector: "lib-billing-groups", inputs: { clientId: "clientId" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"invoices-section\">\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\">Billing Groups</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ summary?.totalGroups || 0 }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Manage GST entities for consolidated invoicing. Each group gets its own invoice.</div>\n </div>\n <div></div>\n </div>\n\n <!-- Summary Cards -->\n <div class=\"row g-3 mb-4\" *ngIf=\"summary?.totalGroups\">\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Groups</div>\n <div class=\"summary-value-sm\">{{ summary?.totalGroups }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Active</div>\n <div class=\"summary-value-sm text-primary\">{{ summary?.active }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Inactive</div>\n <div class=\"summary-value-sm\">{{ summary?.inactive }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Receivers</div>\n <div class=\"summary-value-sm\">{{ summary?.totalReceivers }}</div>\n </div>\n </div>\n </div>\n\n <!-- Search + Filter + Export + Add Row -->\n <div class=\"card-header paymenthistory border-0 px-0\">\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=\"Search...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"groupFilterObject\" (appliedFilters)=\"applyGroupFilters($event)\"></lib-filters>\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!groupList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\">Export</span>\n </button>\n <button type=\"button\" class=\"btn btn-primary text-nowrap ms-3\" (click)=\"addBillingGroup()\">\n + Add Billing Group\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"groupLoading\">\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=\"groupNoData\">\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 <!-- Groups List -->\n <div *ngIf=\"!groupLoading && !groupNoData\">\n <div *ngFor=\"let group of groupList\" class=\"group-card mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"d-flex align-items-center gap-3\">\n <div class=\"group-icon\">\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=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"group-name\">{{ group?.groupName }}</span>\n <span class=\"badge badge-light-success\">Active</span>\n </div>\n <div class=\"text-muted small\">\n <span *ngIf=\"group?.gst\">GST: {{ group?.gst }}</span>\n <span *ngIf=\"group?.gst && group?.registeredCompanyName\" class=\"mx-2\">·</span>\n <span *ngIf=\"group?.registeredCompanyName\">{{ group?.registeredCompanyName }}</span>\n </div>\n </div>\n </div>\n <div class=\"d-flex gap-2\">\n <button class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"editBillingGroup(group)\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M11.3333 2.00004C11.5083 1.82494 11.7163 1.68605 11.9451 1.59129C12.1739 1.49653 12.4191 1.44775 12.6667 1.44775C12.9143 1.44775 13.1594 1.49653 13.3882 1.59129C13.617 1.68605 13.825 1.82494 14 2.00004C14.1751 2.17513 14.314 2.38318 14.4088 2.61197C14.5035 2.84076 14.5523 3.08586 14.5523 3.33337C14.5523 3.58089 14.5035 3.82599 14.4088 4.05478C14.314 4.28357 14.1751 4.49162 14 4.66671L5 13.6667L1.33333 14.6667L2.33333 11L11.3333 2.00004Z\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"deleteBillingGroup(group)\" title=\"Delete\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M2 4H3.33333H14M12.6667 4V13.3333C12.6667 13.687 12.5262 14.0261 12.2761 14.2761C12.0261 14.5262 11.687 14.6667 11.3333 14.6667H4.66667C4.31304 14.6667 3.97391 14.5262 3.72386 14.2761C3.47381 14.0261 3.33333 13.687 3.33333 13.3333V4M5.33333 4V2.66667C5.33333 2.31304 5.47381 1.97391 5.72386 1.72386C5.97391 1.47381 6.31304 1.33333 6.66667 1.33333H9.33333C9.68696 1.33333 10.0261 1.47381 10.2761 1.72386C10.5262 1.97391 10.6667 2.31304 10.6667 2.66667V4\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n <div class=\"row g-3 mt-2\">\n <div class=\"col\">\n <div class=\"group-detail-label\">Contact Email</div>\n <div class=\"group-detail-value\">\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=\"M1.16667 4.08325L6.14617 7.40617C6.50533 7.64558 6.685 7.76525 6.87933 7.81042C7.05133 7.85042 7.23033 7.85042 7.40233 7.81042C7.59667 7.76525 7.77633 7.64558 8.1355 7.40617L13.115 4.08325M3.96667 11.6666H10.3147C11.1948 11.6666 11.6348 11.6666 11.9717 11.4951C12.2687 11.3439 12.5105 11.1021 12.6617 10.8051C12.8333 10.4682 12.8333 10.0282 12.8333 9.14808V5.13508C12.8333 4.25499 12.8333 3.81499 12.6617 3.47808C12.5105 3.18108 12.2687 2.93933 11.9717 2.78808C11.6348 2.61658 11.1948 2.61658 10.3147 2.61658H3.96667C3.08658 2.61658 2.64658 2.61658 2.30967 2.78808C2.01267 2.93933 1.77092 3.18108 1.61967 3.47808C1.44817 3.81499 1.44817 4.25499 1.44817 5.13508V9.14808C1.44817 10.0282 1.44817 10.4682 1.61967 10.8051C1.77092 11.1021 2.01267 11.3439 2.30967 11.4951C2.64658 11.6666 3.08658 11.6666 3.96667 11.6666Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span *ngIf=\"group?.generateInvoiceTo?.length\">{{ group?.generateInvoiceTo[0] }}</span>\n <span *ngIf=\"!group?.generateInvoiceTo?.length\" class=\"text-muted\">\u2014</span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Stores</div>\n <div class=\"group-detail-value\">\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=\"M1.16667 7.00008L6.56483 1.60192C6.78683 1.37992 6.89783 1.26892 7.02583 1.22192C7.13883 1.18025 7.26283 1.18025 7.37583 1.22192C7.50383 1.26892 7.61483 1.37992 7.83683 1.60192L13.235 7.00008M2.91667 5.54175V11.0251C2.91667 11.4651 2.91667 11.6851 3.00242 11.8536C3.07808 12.0021 3.19825 12.1223 3.34675 12.1979C3.51533 12.2837 3.73533 12.2837 4.17533 12.2837H5.83333V9.33342C5.83333 8.87508 5.83333 8.64592 5.92208 8.46892C6.00033 8.31308 6.12617 8.18725 6.282 8.10908C6.459 8.02025 6.68817 8.02025 7.14667 8.02025H7.25417C7.71267 8.02025 7.94183 8.02025 8.11883 8.10908C8.27467 8.18725 8.40067 8.31308 8.47883 8.46892C8.5675 8.64592 8.5675 8.87508 8.5675 9.33342V12.2837H10.226C10.666 12.2837 10.886 12.2837 11.0545 12.1979C11.203 12.1223 11.3232 12.0021 11.3988 11.8536C11.4847 11.6851 11.4847 11.4651 11.4847 11.0251V5.54175\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.storeCount || 0 }}\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Annexure Attachment</div>\n <div class=\"group-detail-value\">\n <span class=\"badge\" [ngClass]=\"group?.attachAnnexure ? 'badge-light-success' : 'badge-light-secondary'\">\n {{ group?.attachAnnexure ? 'Attached' : 'Not attached' }}\n </span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Invoice Receivers</div>\n <div class=\"group-detail-value\">\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=\"M9.33333 12.25V11.0833C9.33333 10.4645 9.08735 9.871 8.64976 9.43342C8.21218 8.99583 7.61868 8.75 7 8.75H2.91667C2.29799 8.75 1.70449 8.99583 1.2669 9.43342C0.829316 9.871 0.583333 10.4645 0.583333 11.0833V12.25M12.8333 12.25V11.0833C12.833 10.5735 12.6688 10.0778 12.3654 9.66858C12.0621 9.25933 11.636 8.95858 11.1458 8.81083M9.04167 1.81083C9.53308 1.95792 9.96058 2.25858 10.265 2.66825C10.5694 3.07792 10.734 3.57467 10.734 4.08542C10.734 4.59617 10.5694 5.09292 10.265 5.50258C9.96058 5.91225 9.53308 6.21292 9.04167 6.36M7.29167 4.08333C7.29167 5.37242 6.24742 6.41667 4.95833 6.41667C3.66925 6.41667 2.625 5.37242 2.625 4.08333C2.625 2.79425 3.66925 1.75 4.95833 1.75C6.24742 1.75 7.29167 2.79425 7.29167 4.08333Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.receiverCount || 0 }} recipients\n </div>\n </div>\n </div>\n </div>\n\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>", styles: [".paymenthistory{padding:0px 1.25rem!important}.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}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important}.summary-card-sm{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:8px;padding:16px 20px}.summary-label-sm{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085)}.summary-value-sm{font-family:Inter;font-size:24px;font-weight:600;color:var(--Gray-900, #101828);margin-top:4px}.group-card{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:20px 24px}.group-icon{width:40px;height:40px;border-radius:8px;background:var(--Primary-50, #EAF8FF);display:flex;align-items:center;justify-content:center}.group-name{font-family:Inter;font-size:16px;font-weight:600;color:var(--Gray-900, #101828)}.group-detail-label{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085);margin-bottom:4px}.group-detail-value{font-family:Inter;font-size:14px;font-weight:500;color:var(--Gray-700, #344054)}.badge-light-secondary{background:var(--Gray-100, #F2F4F7);color:var(--Gray-500, #667085)}.btn-icon{width:36px;height:36px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:8px;border:1px solid var(--Gray-200, #EAECF0)}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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"] }] });
|
|
270
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BillingGroupsComponent, selector: "lib-billing-groups", inputs: { clientId: "clientId" }, viewQueries: [{ propertyName: "bulkUploadInput", first: true, predicate: ["bulkUploadInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"invoices-section\">\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\">Billing Groups</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ summary?.totalGroups || 0 }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Manage GST entities for consolidated invoicing. Each group gets its own invoice.</div>\n </div>\n <div></div>\n </div>\n\n <!-- Summary Cards -->\n <div class=\"row g-3 mb-4\" *ngIf=\"summary?.totalGroups\">\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Groups</div>\n <div class=\"summary-value-sm\">{{ summary?.totalGroups }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Active</div>\n <div class=\"summary-value-sm text-primary\">{{ summary?.active }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Inactive</div>\n <div class=\"summary-value-sm\">{{ summary?.inactive }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Receivers</div>\n <div class=\"summary-value-sm\">{{ summary?.totalReceivers }}</div>\n </div>\n </div>\n </div>\n\n <!-- Search + Filter + Export + Add Row -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar w-100\">\n <div class=\"d-flex justify-content-end\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"groupFilterObject\" (appliedFilters)=\"applyGroupFilters($event)\"></lib-filters>\n <button type=\"button\" (click)=\"bulkDownload()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader me-2\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\" *ngIf=\"!bulkDownloading\">Bulk Download</span>\n <span class=\"ms-2\" *ngIf=\"bulkDownloading\">Downloading...</span>\n </button>\n <button type=\"button\" (click)=\"bulkUploadInput.click()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader me-2\"\n [disabled]=\"bulkUploading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\" *ngIf=\"!bulkUploading\">Bulk Upload</span>\n <span class=\"ms-2\" *ngIf=\"bulkUploading\">Uploading...</span>\n </button>\n <input #bulkUploadInput type=\"file\" accept=\".xlsx,.xls\" hidden (change)=\"onBulkUploadFileSelected($event)\">\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!groupList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\">Export</span>\n </button>\n <button type=\"button\" class=\"btn btn-primary text-nowrap ms-3\" (click)=\"addBillingGroup()\">\n + Add Billing Group\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"groupLoading\">\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=\"groupNoData\">\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 <!-- Groups List -->\n <div *ngIf=\"!groupLoading && !groupNoData\">\n <div *ngFor=\"let group of groupList\" class=\"group-card mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"d-flex align-items-center gap-3\">\n <div class=\"group-icon\">\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=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"group-name\">{{ group?.groupName }}</span>\n <span class=\"badge badge-light-success\">Active</span>\n </div>\n <div class=\"text-muted small\">\n <span *ngIf=\"group?.gst\">GST: {{ group?.gst }}</span>\n <span *ngIf=\"group?.gst && group?.registeredCompanyName\" class=\"mx-2\">·</span>\n <span *ngIf=\"group?.registeredCompanyName\">{{ group?.registeredCompanyName }}</span>\n </div>\n </div>\n </div>\n <div class=\"d-flex gap-2\">\n <button class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"editBillingGroup(group)\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M11.3333 2.00004C11.5083 1.82494 11.7163 1.68605 11.9451 1.59129C12.1739 1.49653 12.4191 1.44775 12.6667 1.44775C12.9143 1.44775 13.1594 1.49653 13.3882 1.59129C13.617 1.68605 13.825 1.82494 14 2.00004C14.1751 2.17513 14.314 2.38318 14.4088 2.61197C14.5035 2.84076 14.5523 3.08586 14.5523 3.33337C14.5523 3.58089 14.5035 3.82599 14.4088 4.05478C14.314 4.28357 14.1751 4.49162 14 4.66671L5 13.6667L1.33333 14.6667L2.33333 11L11.3333 2.00004Z\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button *ngIf=\"!group?.isPrimary\" class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"deleteBillingGroup(group)\" title=\"Delete\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M2 4H3.33333H14M12.6667 4V13.3333C12.6667 13.687 12.5262 14.0261 12.2761 14.2761C12.0261 14.5262 11.687 14.6667 11.3333 14.6667H4.66667C4.31304 14.6667 3.97391 14.5262 3.72386 14.2761C3.47381 14.0261 3.33333 13.687 3.33333 13.3333V4M5.33333 4V2.66667C5.33333 2.31304 5.47381 1.97391 5.72386 1.72386C5.97391 1.47381 6.31304 1.33333 6.66667 1.33333H9.33333C9.68696 1.33333 10.0261 1.47381 10.2761 1.72386C10.5262 1.97391 10.6667 2.31304 10.6667 2.66667V4\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n <div class=\"row g-3 mt-2\">\n <div class=\"col\">\n <div class=\"group-detail-label\">Contact Email</div>\n <div class=\"group-detail-value\">\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=\"M1.16667 4.08325L6.14617 7.40617C6.50533 7.64558 6.685 7.76525 6.87933 7.81042C7.05133 7.85042 7.23033 7.85042 7.40233 7.81042C7.59667 7.76525 7.77633 7.64558 8.1355 7.40617L13.115 4.08325M3.96667 11.6666H10.3147C11.1948 11.6666 11.6348 11.6666 11.9717 11.4951C12.2687 11.3439 12.5105 11.1021 12.6617 10.8051C12.8333 10.4682 12.8333 10.0282 12.8333 9.14808V5.13508C12.8333 4.25499 12.8333 3.81499 12.6617 3.47808C12.5105 3.18108 12.2687 2.93933 11.9717 2.78808C11.6348 2.61658 11.1948 2.61658 10.3147 2.61658H3.96667C3.08658 2.61658 2.64658 2.61658 2.30967 2.78808C2.01267 2.93933 1.77092 3.18108 1.61967 3.47808C1.44817 3.81499 1.44817 4.25499 1.44817 5.13508V9.14808C1.44817 10.0282 1.44817 10.4682 1.61967 10.8051C1.77092 11.1021 2.01267 11.3439 2.30967 11.4951C2.64658 11.6666 3.08658 11.6666 3.96667 11.6666Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span *ngIf=\"group?.generateInvoiceTo?.length\">{{ group?.generateInvoiceTo[0] }}</span>\n <span *ngIf=\"!group?.generateInvoiceTo?.length\" class=\"text-muted\">\u2014</span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Stores</div>\n <div class=\"group-detail-value\">\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=\"M1.16667 7.00008L6.56483 1.60192C6.78683 1.37992 6.89783 1.26892 7.02583 1.22192C7.13883 1.18025 7.26283 1.18025 7.37583 1.22192C7.50383 1.26892 7.61483 1.37992 7.83683 1.60192L13.235 7.00008M2.91667 5.54175V11.0251C2.91667 11.4651 2.91667 11.6851 3.00242 11.8536C3.07808 12.0021 3.19825 12.1223 3.34675 12.1979C3.51533 12.2837 3.73533 12.2837 4.17533 12.2837H5.83333V9.33342C5.83333 8.87508 5.83333 8.64592 5.92208 8.46892C6.00033 8.31308 6.12617 8.18725 6.282 8.10908C6.459 8.02025 6.68817 8.02025 7.14667 8.02025H7.25417C7.71267 8.02025 7.94183 8.02025 8.11883 8.10908C8.27467 8.18725 8.40067 8.31308 8.47883 8.46892C8.5675 8.64592 8.5675 8.87508 8.5675 9.33342V12.2837H10.226C10.666 12.2837 10.886 12.2837 11.0545 12.1979C11.203 12.1223 11.3232 12.0021 11.3988 11.8536C11.4847 11.6851 11.4847 11.4651 11.4847 11.0251V5.54175\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.storeCount || 0 }}\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Annexure Attachment</div>\n <div class=\"group-detail-value\">\n <span class=\"badge\" [ngClass]=\"group?.attachAnnexure ? 'badge-light-success' : 'badge-light-secondary'\">\n {{ group?.attachAnnexure ? 'Attached' : 'Not attached' }}\n </span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Invoice Receivers</div>\n <div class=\"group-detail-value\">\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=\"M9.33333 12.25V11.0833C9.33333 10.4645 9.08735 9.871 8.64976 9.43342C8.21218 8.99583 7.61868 8.75 7 8.75H2.91667C2.29799 8.75 1.70449 8.99583 1.2669 9.43342C0.829316 9.871 0.583333 10.4645 0.583333 11.0833V12.25M12.8333 12.25V11.0833C12.833 10.5735 12.6688 10.0778 12.3654 9.66858C12.0621 9.25933 11.636 8.95858 11.1458 8.81083M9.04167 1.81083C9.53308 1.95792 9.96058 2.25858 10.265 2.66825C10.5694 3.07792 10.734 3.57467 10.734 4.08542C10.734 4.59617 10.5694 5.09292 10.265 5.50258C9.96058 5.91225 9.53308 6.21292 9.04167 6.36M7.29167 4.08333C7.29167 5.37242 6.24742 6.41667 4.95833 6.41667C3.66925 6.41667 2.625 5.37242 2.625 4.08333C2.625 2.79425 3.66925 1.75 4.95833 1.75C6.24742 1.75 7.29167 2.79425 7.29167 4.08333Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.receiverCount || 0 }} recipients\n </div>\n </div>\n </div>\n </div>\n\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>", styles: [".paymenthistory{padding:0px 1.25rem!important}.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}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important}.summary-card-sm{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:8px;padding:16px 20px}.summary-label-sm{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085)}.summary-value-sm{font-family:Inter;font-size:24px;font-weight:600;color:var(--Gray-900, #101828);margin-top:4px}.group-card{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:20px 24px}.group-icon{width:40px;height:40px;border-radius:8px;background:var(--Primary-50, #EAF8FF);display:flex;align-items:center;justify-content:center}.group-name{font-family:Inter;font-size:16px;font-weight:600;color:var(--Gray-900, #101828)}.group-detail-label{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085);margin-bottom:4px}.group-detail-value{font-family:Inter;font-size:14px;font-weight:500;color:var(--Gray-700, #344054)}.badge-light-secondary{background:var(--Gray-100, #F2F4F7);color:var(--Gray-500, #667085)}.btn-icon{width:36px;height:36px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:8px;border:1px solid var(--Gray-200, #EAECF0)}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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"] }] });
|
|
198
271
|
}
|
|
199
272
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingGroupsComponent, decorators: [{
|
|
200
273
|
type: Component,
|
|
201
|
-
args: [{ selector: 'lib-billing-groups', template: "<div class=\"invoices-section\">\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\">Billing Groups</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ summary?.totalGroups || 0 }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Manage GST entities for consolidated invoicing. Each group gets its own invoice.</div>\n </div>\n <div></div>\n </div>\n\n <!-- Summary Cards -->\n <div class=\"row g-3 mb-4\" *ngIf=\"summary?.totalGroups\">\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Groups</div>\n <div class=\"summary-value-sm\">{{ summary?.totalGroups }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Active</div>\n <div class=\"summary-value-sm text-primary\">{{ summary?.active }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Inactive</div>\n <div class=\"summary-value-sm\">{{ summary?.inactive }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Receivers</div>\n <div class=\"summary-value-sm\">{{ summary?.totalReceivers }}</div>\n </div>\n </div>\n </div>\n\n <!-- Search + Filter + Export + Add Row -->\n <div class=\"card-header paymenthistory border-0 px-0\">\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=\"Search...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"groupFilterObject\" (appliedFilters)=\"applyGroupFilters($event)\"></lib-filters>\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!groupList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\">Export</span>\n </button>\n <button type=\"button\" class=\"btn btn-primary text-nowrap ms-3\" (click)=\"addBillingGroup()\">\n + Add Billing Group\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"groupLoading\">\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=\"groupNoData\">\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 <!-- Groups List -->\n <div *ngIf=\"!groupLoading && !groupNoData\">\n <div *ngFor=\"let group of groupList\" class=\"group-card mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"d-flex align-items-center gap-3\">\n <div class=\"group-icon\">\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=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"group-name\">{{ group?.groupName }}</span>\n <span class=\"badge badge-light-success\">Active</span>\n </div>\n <div class=\"text-muted small\">\n <span *ngIf=\"group?.gst\">GST: {{ group?.gst }}</span>\n <span *ngIf=\"group?.gst && group?.registeredCompanyName\" class=\"mx-2\">·</span>\n <span *ngIf=\"group?.registeredCompanyName\">{{ group?.registeredCompanyName }}</span>\n </div>\n </div>\n </div>\n <div class=\"d-flex gap-2\">\n <button class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"editBillingGroup(group)\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M11.3333 2.00004C11.5083 1.82494 11.7163 1.68605 11.9451 1.59129C12.1739 1.49653 12.4191 1.44775 12.6667 1.44775C12.9143 1.44775 13.1594 1.49653 13.3882 1.59129C13.617 1.68605 13.825 1.82494 14 2.00004C14.1751 2.17513 14.314 2.38318 14.4088 2.61197C14.5035 2.84076 14.5523 3.08586 14.5523 3.33337C14.5523 3.58089 14.5035 3.82599 14.4088 4.05478C14.314 4.28357 14.1751 4.49162 14 4.66671L5 13.6667L1.33333 14.6667L2.33333 11L11.3333 2.00004Z\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"deleteBillingGroup(group)\" title=\"Delete\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M2 4H3.33333H14M12.6667 4V13.3333C12.6667 13.687 12.5262 14.0261 12.2761 14.2761C12.0261 14.5262 11.687 14.6667 11.3333 14.6667H4.66667C4.31304 14.6667 3.97391 14.5262 3.72386 14.2761C3.47381 14.0261 3.33333 13.687 3.33333 13.3333V4M5.33333 4V2.66667C5.33333 2.31304 5.47381 1.97391 5.72386 1.72386C5.97391 1.47381 6.31304 1.33333 6.66667 1.33333H9.33333C9.68696 1.33333 10.0261 1.47381 10.2761 1.72386C10.5262 1.97391 10.6667 2.31304 10.6667 2.66667V4\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n <div class=\"row g-3 mt-2\">\n <div class=\"col\">\n <div class=\"group-detail-label\">Contact Email</div>\n <div class=\"group-detail-value\">\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=\"M1.16667 4.08325L6.14617 7.40617C6.50533 7.64558 6.685 7.76525 6.87933 7.81042C7.05133 7.85042 7.23033 7.85042 7.40233 7.81042C7.59667 7.76525 7.77633 7.64558 8.1355 7.40617L13.115 4.08325M3.96667 11.6666H10.3147C11.1948 11.6666 11.6348 11.6666 11.9717 11.4951C12.2687 11.3439 12.5105 11.1021 12.6617 10.8051C12.8333 10.4682 12.8333 10.0282 12.8333 9.14808V5.13508C12.8333 4.25499 12.8333 3.81499 12.6617 3.47808C12.5105 3.18108 12.2687 2.93933 11.9717 2.78808C11.6348 2.61658 11.1948 2.61658 10.3147 2.61658H3.96667C3.08658 2.61658 2.64658 2.61658 2.30967 2.78808C2.01267 2.93933 1.77092 3.18108 1.61967 3.47808C1.44817 3.81499 1.44817 4.25499 1.44817 5.13508V9.14808C1.44817 10.0282 1.44817 10.4682 1.61967 10.8051C1.77092 11.1021 2.01267 11.3439 2.30967 11.4951C2.64658 11.6666 3.08658 11.6666 3.96667 11.6666Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span *ngIf=\"group?.generateInvoiceTo?.length\">{{ group?.generateInvoiceTo[0] }}</span>\n <span *ngIf=\"!group?.generateInvoiceTo?.length\" class=\"text-muted\">\u2014</span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Stores</div>\n <div class=\"group-detail-value\">\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=\"M1.16667 7.00008L6.56483 1.60192C6.78683 1.37992 6.89783 1.26892 7.02583 1.22192C7.13883 1.18025 7.26283 1.18025 7.37583 1.22192C7.50383 1.26892 7.61483 1.37992 7.83683 1.60192L13.235 7.00008M2.91667 5.54175V11.0251C2.91667 11.4651 2.91667 11.6851 3.00242 11.8536C3.07808 12.0021 3.19825 12.1223 3.34675 12.1979C3.51533 12.2837 3.73533 12.2837 4.17533 12.2837H5.83333V9.33342C5.83333 8.87508 5.83333 8.64592 5.92208 8.46892C6.00033 8.31308 6.12617 8.18725 6.282 8.10908C6.459 8.02025 6.68817 8.02025 7.14667 8.02025H7.25417C7.71267 8.02025 7.94183 8.02025 8.11883 8.10908C8.27467 8.18725 8.40067 8.31308 8.47883 8.46892C8.5675 8.64592 8.5675 8.87508 8.5675 9.33342V12.2837H10.226C10.666 12.2837 10.886 12.2837 11.0545 12.1979C11.203 12.1223 11.3232 12.0021 11.3988 11.8536C11.4847 11.6851 11.4847 11.4651 11.4847 11.0251V5.54175\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.storeCount || 0 }}\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Annexure Attachment</div>\n <div class=\"group-detail-value\">\n <span class=\"badge\" [ngClass]=\"group?.attachAnnexure ? 'badge-light-success' : 'badge-light-secondary'\">\n {{ group?.attachAnnexure ? 'Attached' : 'Not attached' }}\n </span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Invoice Receivers</div>\n <div class=\"group-detail-value\">\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=\"M9.33333 12.25V11.0833C9.33333 10.4645 9.08735 9.871 8.64976 9.43342C8.21218 8.99583 7.61868 8.75 7 8.75H2.91667C2.29799 8.75 1.70449 8.99583 1.2669 9.43342C0.829316 9.871 0.583333 10.4645 0.583333 11.0833V12.25M12.8333 12.25V11.0833C12.833 10.5735 12.6688 10.0778 12.3654 9.66858C12.0621 9.25933 11.636 8.95858 11.1458 8.81083M9.04167 1.81083C9.53308 1.95792 9.96058 2.25858 10.265 2.66825C10.5694 3.07792 10.734 3.57467 10.734 4.08542C10.734 4.59617 10.5694 5.09292 10.265 5.50258C9.96058 5.91225 9.53308 6.21292 9.04167 6.36M7.29167 4.08333C7.29167 5.37242 6.24742 6.41667 4.95833 6.41667C3.66925 6.41667 2.625 5.37242 2.625 4.08333C2.625 2.79425 3.66925 1.75 4.95833 1.75C6.24742 1.75 7.29167 2.79425 7.29167 4.08333Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.receiverCount || 0 }} recipients\n </div>\n </div>\n </div>\n </div>\n\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>", styles: [".paymenthistory{padding:0px 1.25rem!important}.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}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important}.summary-card-sm{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:8px;padding:16px 20px}.summary-label-sm{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085)}.summary-value-sm{font-family:Inter;font-size:24px;font-weight:600;color:var(--Gray-900, #101828);margin-top:4px}.group-card{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:20px 24px}.group-icon{width:40px;height:40px;border-radius:8px;background:var(--Primary-50, #EAF8FF);display:flex;align-items:center;justify-content:center}.group-name{font-family:Inter;font-size:16px;font-weight:600;color:var(--Gray-900, #101828)}.group-detail-label{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085);margin-bottom:4px}.group-detail-value{font-family:Inter;font-size:14px;font-weight:500;color:var(--Gray-700, #344054)}.badge-light-secondary{background:var(--Gray-100, #F2F4F7);color:var(--Gray-500, #667085)}.btn-icon{width:36px;height:36px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:8px;border:1px solid var(--Gray-200, #EAECF0)}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}\n"] }]
|
|
274
|
+
args: [{ selector: 'lib-billing-groups', template: "<div class=\"invoices-section\">\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\">Billing Groups</span>\n <span class=\"badge bg-light text-dark ms-1\">{{ summary?.totalGroups || 0 }} total</span>\n </div>\n <div class=\"text-muted small mt-1\">Manage GST entities for consolidated invoicing. Each group gets its own invoice.</div>\n </div>\n <div></div>\n </div>\n\n <!-- Summary Cards -->\n <div class=\"row g-3 mb-4\" *ngIf=\"summary?.totalGroups\">\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Groups</div>\n <div class=\"summary-value-sm\">{{ summary?.totalGroups }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Active</div>\n <div class=\"summary-value-sm text-primary\">{{ summary?.active }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Inactive</div>\n <div class=\"summary-value-sm\">{{ summary?.inactive }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"summary-card-sm\">\n <div class=\"summary-label-sm\">Total Receivers</div>\n <div class=\"summary-value-sm\">{{ summary?.totalReceivers }}</div>\n </div>\n </div>\n </div>\n\n <!-- Search + Filter + Export + Add Row -->\n <div class=\"card-header paymenthistory border-0 px-0\">\n <div class=\"card-toolbar w-100\">\n <div class=\"d-flex justify-content-end\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"len\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search...\" autocomplete=\"off\" (change)=\"searchField()\"\n [disabled]=\"searchDisabled\" />\n <lib-filters [dataObject]=\"groupFilterObject\" (appliedFilters)=\"applyGroupFilters($event)\"></lib-filters>\n <button type=\"button\" (click)=\"bulkDownload()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader me-2\"\n [disabled]=\"bulkDownloading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\" *ngIf=\"!bulkDownloading\">Bulk Download</span>\n <span class=\"ms-2\" *ngIf=\"bulkDownloading\">Downloading...</span>\n </button>\n <button type=\"button\" (click)=\"bulkUploadInput.click()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader me-2\"\n [disabled]=\"bulkUploading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\" *ngIf=\"!bulkUploading\">Bulk Upload</span>\n <span class=\"ms-2\" *ngIf=\"bulkUploading\">Uploading...</span>\n </button>\n <input #bulkUploadInput type=\"file\" accept=\".xlsx,.xls\" hidden (change)=\"onBulkUploadFileSelected($event)\">\n <button type=\"button\" (click)=\"onExport()\"\n class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!groupList.length\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" 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-2\">Export</span>\n </button>\n <button type=\"button\" class=\"btn btn-primary text-nowrap ms-3\" (click)=\"addBillingGroup()\">\n + Add Billing Group\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Loading Shimmer -->\n <ng-container *ngIf=\"groupLoading\">\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=\"groupNoData\">\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 <!-- Groups List -->\n <div *ngIf=\"!groupLoading && !groupNoData\">\n <div *ngFor=\"let group of groupList\" class=\"group-card mb-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"d-flex align-items-center gap-3\">\n <div class=\"group-icon\">\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=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div>\n <div class=\"d-flex align-items-center gap-2\">\n <span class=\"group-name\">{{ group?.groupName }}</span>\n <span class=\"badge badge-light-success\">Active</span>\n </div>\n <div class=\"text-muted small\">\n <span *ngIf=\"group?.gst\">GST: {{ group?.gst }}</span>\n <span *ngIf=\"group?.gst && group?.registeredCompanyName\" class=\"mx-2\">·</span>\n <span *ngIf=\"group?.registeredCompanyName\">{{ group?.registeredCompanyName }}</span>\n </div>\n </div>\n </div>\n <div class=\"d-flex gap-2\">\n <button class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"editBillingGroup(group)\" title=\"Edit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M11.3333 2.00004C11.5083 1.82494 11.7163 1.68605 11.9451 1.59129C12.1739 1.49653 12.4191 1.44775 12.6667 1.44775C12.9143 1.44775 13.1594 1.49653 13.3882 1.59129C13.617 1.68605 13.825 1.82494 14 2.00004C14.1751 2.17513 14.314 2.38318 14.4088 2.61197C14.5035 2.84076 14.5523 3.08586 14.5523 3.33337C14.5523 3.58089 14.5035 3.82599 14.4088 4.05478C14.314 4.28357 14.1751 4.49162 14 4.66671L5 13.6667L1.33333 14.6667L2.33333 11L11.3333 2.00004Z\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button *ngIf=\"!group?.isPrimary\" class=\"btn btn-sm btn-outline-secondary btn-icon\" (click)=\"deleteBillingGroup(group)\" title=\"Delete\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M2 4H3.33333H14M12.6667 4V13.3333C12.6667 13.687 12.5262 14.0261 12.2761 14.2761C12.0261 14.5262 11.687 14.6667 11.3333 14.6667H4.66667C4.31304 14.6667 3.97391 14.5262 3.72386 14.2761C3.47381 14.0261 3.33333 13.687 3.33333 13.3333V4M5.33333 4V2.66667C5.33333 2.31304 5.47381 1.97391 5.72386 1.72386C5.97391 1.47381 6.31304 1.33333 6.66667 1.33333H9.33333C9.68696 1.33333 10.0261 1.47381 10.2761 1.72386C10.5262 1.97391 10.6667 2.31304 10.6667 2.66667V4\" stroke=\"#667085\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n <div class=\"row g-3 mt-2\">\n <div class=\"col\">\n <div class=\"group-detail-label\">Contact Email</div>\n <div class=\"group-detail-value\">\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=\"M1.16667 4.08325L6.14617 7.40617C6.50533 7.64558 6.685 7.76525 6.87933 7.81042C7.05133 7.85042 7.23033 7.85042 7.40233 7.81042C7.59667 7.76525 7.77633 7.64558 8.1355 7.40617L13.115 4.08325M3.96667 11.6666H10.3147C11.1948 11.6666 11.6348 11.6666 11.9717 11.4951C12.2687 11.3439 12.5105 11.1021 12.6617 10.8051C12.8333 10.4682 12.8333 10.0282 12.8333 9.14808V5.13508C12.8333 4.25499 12.8333 3.81499 12.6617 3.47808C12.5105 3.18108 12.2687 2.93933 11.9717 2.78808C11.6348 2.61658 11.1948 2.61658 10.3147 2.61658H3.96667C3.08658 2.61658 2.64658 2.61658 2.30967 2.78808C2.01267 2.93933 1.77092 3.18108 1.61967 3.47808C1.44817 3.81499 1.44817 4.25499 1.44817 5.13508V9.14808C1.44817 10.0282 1.44817 10.4682 1.61967 10.8051C1.77092 11.1021 2.01267 11.3439 2.30967 11.4951C2.64658 11.6666 3.08658 11.6666 3.96667 11.6666Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span *ngIf=\"group?.generateInvoiceTo?.length\">{{ group?.generateInvoiceTo[0] }}</span>\n <span *ngIf=\"!group?.generateInvoiceTo?.length\" class=\"text-muted\">\u2014</span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Stores</div>\n <div class=\"group-detail-value\">\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=\"M1.16667 7.00008L6.56483 1.60192C6.78683 1.37992 6.89783 1.26892 7.02583 1.22192C7.13883 1.18025 7.26283 1.18025 7.37583 1.22192C7.50383 1.26892 7.61483 1.37992 7.83683 1.60192L13.235 7.00008M2.91667 5.54175V11.0251C2.91667 11.4651 2.91667 11.6851 3.00242 11.8536C3.07808 12.0021 3.19825 12.1223 3.34675 12.1979C3.51533 12.2837 3.73533 12.2837 4.17533 12.2837H5.83333V9.33342C5.83333 8.87508 5.83333 8.64592 5.92208 8.46892C6.00033 8.31308 6.12617 8.18725 6.282 8.10908C6.459 8.02025 6.68817 8.02025 7.14667 8.02025H7.25417C7.71267 8.02025 7.94183 8.02025 8.11883 8.10908C8.27467 8.18725 8.40067 8.31308 8.47883 8.46892C8.5675 8.64592 8.5675 8.87508 8.5675 9.33342V12.2837H10.226C10.666 12.2837 10.886 12.2837 11.0545 12.1979C11.203 12.1223 11.3232 12.0021 11.3988 11.8536C11.4847 11.6851 11.4847 11.4651 11.4847 11.0251V5.54175\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.storeCount || 0 }}\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Annexure Attachment</div>\n <div class=\"group-detail-value\">\n <span class=\"badge\" [ngClass]=\"group?.attachAnnexure ? 'badge-light-success' : 'badge-light-secondary'\">\n {{ group?.attachAnnexure ? 'Attached' : 'Not attached' }}\n </span>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"group-detail-label\">Invoice Receivers</div>\n <div class=\"group-detail-value\">\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=\"M9.33333 12.25V11.0833C9.33333 10.4645 9.08735 9.871 8.64976 9.43342C8.21218 8.99583 7.61868 8.75 7 8.75H2.91667C2.29799 8.75 1.70449 8.99583 1.2669 9.43342C0.829316 9.871 0.583333 10.4645 0.583333 11.0833V12.25M12.8333 12.25V11.0833C12.833 10.5735 12.6688 10.0778 12.3654 9.66858C12.0621 9.25933 11.636 8.95858 11.1458 8.81083M9.04167 1.81083C9.53308 1.95792 9.96058 2.25858 10.265 2.66825C10.5694 3.07792 10.734 3.57467 10.734 4.08542C10.734 4.59617 10.5694 5.09292 10.265 5.50258C9.96058 5.91225 9.53308 6.21292 9.04167 6.36M7.29167 4.08333C7.29167 5.37242 6.24742 6.41667 4.95833 6.41667C3.66925 6.41667 2.625 5.37242 2.625 4.08333C2.625 2.79425 3.66925 1.75 4.95833 1.75C6.24742 1.75 7.29167 2.79425 7.29167 4.08333Z\" stroke=\"#667085\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n {{ group?.receiverCount || 0 }} recipients\n </div>\n </div>\n </div>\n </div>\n\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>", styles: [".paymenthistory{padding:0px 1.25rem!important}.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}.invoices-section{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:24px}.form-control{display:block;padding:.5rem 1rem;font-family:Inter;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important}.summary-card-sm{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:8px;padding:16px 20px}.summary-label-sm{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085)}.summary-value-sm{font-family:Inter;font-size:24px;font-weight:600;color:var(--Gray-900, #101828);margin-top:4px}.group-card{background:#fff;border:1px solid var(--Gray-200, #EAECF0);border-radius:12px;padding:20px 24px}.group-icon{width:40px;height:40px;border-radius:8px;background:var(--Primary-50, #EAF8FF);display:flex;align-items:center;justify-content:center}.group-name{font-family:Inter;font-size:16px;font-weight:600;color:var(--Gray-900, #101828)}.group-detail-label{font-family:Inter;font-size:13px;font-weight:400;color:var(--Gray-500, #667085);margin-bottom:4px}.group-detail-value{font-family:Inter;font-size:14px;font-weight:500;color:var(--Gray-700, #344054)}.badge-light-secondary{background:var(--Gray-100, #F2F4F7);color:var(--Gray-500, #667085)}.btn-icon{width:36px;height:36px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:8px;border:1px solid var(--Gray-200, #EAECF0)}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}\n"] }]
|
|
202
275
|
}], ctorParameters: () => [{ type: i1.BillingService }, { type: i0.ChangeDetectorRef }, { type: i2.ToastService }, { type: i3.NgbModal }], propDecorators: { clientId: [{
|
|
203
276
|
type: Input
|
|
277
|
+
}], bulkUploadInput: [{
|
|
278
|
+
type: ViewChild,
|
|
279
|
+
args: ['bulkUploadInput']
|
|
204
280
|
}] } });
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1ncm91cHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2JpbGxpbmctZ3JvdXBzL2JpbGxpbmctZ3JvdXBzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3Vwcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxLQUFLLEVBQStDLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSTFDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzlGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDZFQUE2RSxDQUFDOzs7Ozs7O0FBTzNILE1BQU0sT0FBTyxzQkFBc0I7SUE4QnZCO0lBQ0E7SUFDQTtJQUNBO0lBaENPLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRWpDLFFBQVEsR0FBVyxFQUFFLENBQUM7SUFFL0IsR0FBRyxDQUFNO0lBQ1QsY0FBYyxHQUFZLEtBQUssQ0FBQztJQUVoQyxVQUFVO0lBQ1YsT0FBTyxHQUFRLEVBQUUsQ0FBQztJQUVsQixRQUFRO0lBQ1IsU0FBUyxHQUFRLEVBQUUsQ0FBQztJQUNwQixZQUFZLEdBQVksSUFBSSxDQUFDO0lBQzdCLFdBQVcsR0FBWSxLQUFLLENBQUM7SUFDN0IsVUFBVSxHQUFXLENBQUMsQ0FBQztJQUN2QixRQUFRLEdBQVcsRUFBRSxDQUFDO0lBQ3RCLFdBQVcsR0FBVyxDQUFDLENBQUM7SUFDeEIsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixlQUFlLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLGFBQWEsR0FBVyxXQUFXLENBQUM7SUFDcEMsTUFBTSxHQUFXLENBQUMsQ0FBQyxDQUFDO0lBRXBCLFNBQVM7SUFDVCxpQkFBaUIsR0FBRztRQUNsQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBRTtLQUN6SSxDQUFDO0lBQ0YsY0FBYyxHQUFXLEVBQUUsQ0FBQztJQUU1QixZQUNVLGNBQThCLEVBQzlCLGNBQWlDLEVBQ2pDLEtBQW1CLEVBQ25CLFlBQXNCO1FBSHRCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixpQkFBWSxHQUFaLFlBQVksQ0FBVTtJQUM3QixDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDNUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXpCLElBQUksT0FBTyxHQUF3QjtZQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3BCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVztZQUN4QixXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDckIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsTUFBTSxFQUFFLEtBQUs7U0FDZCxDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN2RixJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDVixJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO29CQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztvQkFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7b0JBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO29CQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUNyQztxQkFBTTtvQkFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztvQkFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUMzQixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFO3dCQUNwQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztxQkFDN0I7b0JBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO29CQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUNyQztZQUNILENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO1lBQ2pFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSTtTQUM3QyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDcEQsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDNUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUNuQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQzFCO1FBQ0gsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFVO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFO1lBQ2pFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSTtTQUM3QyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDcEQsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDM0MsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDN0MsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUNuQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQzFCO1FBQ0gsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFVO1FBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFO1lBQ3BFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSTtTQUM3QyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ25DLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRTtnQkFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQ3pGLElBQUksRUFBRSxHQUFHLEVBQUU7d0JBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsb0NBQW9DLENBQUMsQ0FBQzt3QkFDakUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQzNCLENBQUM7b0JBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTt3QkFDVixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO29CQUM3RCxDQUFDO2lCQUNGLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUFVO1FBQzFCLElBQUksS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUNqQixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7Z0JBQzdCLElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxVQUFVLEVBQUU7b0JBQ3RDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUNoRDtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsUUFBUSxDQUFDLE1BQWM7UUFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxZQUFZLENBQUMsVUFBZTtRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsUUFBYTtRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksT0FBTyxHQUF3QjtZQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ3JCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsTUFBTSxFQUFFLElBQUk7U0FDYixDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM3RixJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDVixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQ3JELENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQXhNVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixpSENibkMsdW9kQTZMTTs7NEZEaExPLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxvQkFBb0I7cUtBT3JCLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuaW1wb3J0IHsgQmlsbGluZ0dyb3VwRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vYmlsbGluZy1ncm91cC1mb3JtL2JpbGxpbmctZ3JvdXAtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVxdWVzdENvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3JlcXVlc3QtY29uZmlybWF0aW9uL3JlcXVlc3QtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1iaWxsaW5nLWdyb3VwcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9iaWxsaW5nLWdyb3Vwcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9iaWxsaW5nLWdyb3Vwcy5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQmlsbGluZ0dyb3Vwc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nID0gJyc7XG5cbiAgbGVuOiBhbnk7XG4gIHNlYXJjaERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gU3VtbWFyeVxuICBzdW1tYXJ5OiBhbnkgPSB7fTtcblxuICAvLyBUYWJsZVxuICBncm91cExpc3Q6IGFueSA9IFtdO1xuICBncm91cExvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBncm91cE5vRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICB0b3RhbEl0ZW1zOiBudW1iZXIgPSAwO1xuICBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIGN1cnJlbnRQYWdlOiBudW1iZXIgPSAxO1xuICBpdGVtc1BlclBhZ2U6IG51bWJlciA9IDEwO1xuICBwYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCAzMF07XG4gIHNvcnRDb2x1bU5hbWU6IHN0cmluZyA9ICdjcmVhdGVkQXQnO1xuICBzb3J0Qnk6IG51bWJlciA9IC0xO1xuXG4gIC8vIEZpbHRlclxuICBncm91cEZpbHRlck9iamVjdCA9IFtcbiAgICB7IERlc2NyaXB0aW9uOiAnQW5uZXh1cmUnLCB0eXBlOiAnc2luZ2xlJywgSXNzdWVzOiBbeyBpZDogJ2F0dGFjaGVkJywgdGV4dDogJ0F0dGFjaGVkJyB9LCB7IGlkOiAnbm90QXR0YWNoZWQnLCB0ZXh0OiAnTm90IEF0dGFjaGVkJyB9XSB9LFxuICBdO1xuICBhbm5leHVyZUZpbHRlcjogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xpZW50SWQpIHtcbiAgICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NsaWVudElkJ10gJiYgIWNoYW5nZXNbJ2NsaWVudElkJ10uZmlyc3RDaGFuZ2UgJiYgdGhpcy5jbGllbnRJZCkge1xuICAgICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBsb2FkQmlsbGluZ0dyb3VwcygpIHtcbiAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5ncm91cExvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZ3JvdXBOb0RhdGEgPSBmYWxzZTtcblxuICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIG9mZnNldDogdGhpcy5jdXJyZW50UGFnZSxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmxlbixcbiAgICAgIHNvcnRDb2x1bU5hbWU6IHRoaXMuc29ydENvbHVtTmFtZSxcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICBhbm5leHVyZUZpbHRlcjogdGhpcy5hbm5leHVyZUZpbHRlcixcbiAgICAgIGV4cG9ydDogZmFsc2VcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5icmFuZEJpbGxpbmdHcm91cHMoZmlsdGVycykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZSkgPT4ge1xuICAgICAgICBpZiAoZT8uZGF0YT8uY291bnQpIHtcbiAgICAgICAgICB0aGlzLmdyb3VwTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZ3JvdXBOb0RhdGEgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmdyb3VwTGlzdCA9IGUuZGF0YT8uZGF0YTtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSBlLmRhdGE/LmNvdW50O1xuICAgICAgICAgIHRoaXMuc3VtbWFyeSA9IGUuZGF0YT8uc3VtbWFyeSB8fCB7fTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdyb3VwTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZ3JvdXBOb0RhdGEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIGlmICh0aGlzLmxlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZ3JvdXBMaXN0ID0gW107XG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMDtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZ3JvdXBMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZ3JvdXBOb0RhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLmdyb3VwTGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFkZEJpbGxpbmdHcm91cCgpIHtcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oQmlsbGluZ0dyb3VwRm9ybUNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdsZycsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xpZW50SWQgPSB0aGlzLmNsaWVudElkO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmVkaXRNb2RlID0gZmFsc2U7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIGVkaXRCaWxsaW5nR3JvdXAoZ3JvdXA6IGFueSkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihCaWxsaW5nR3JvdXBGb3JtQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ2xnJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jbGllbnRJZCA9IHRoaXMuY2xpZW50SWQ7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZWRpdE1vZGUgPSB0cnVlO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmdyb3VwRGF0YSA9IGdyb3VwO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBkZWxldGVCaWxsaW5nR3JvdXAoZ3JvdXA6IGFueSkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihSZXF1ZXN0Q29uZmlybWF0aW9uQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdZZXMnKSB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZGVsZXRlQmlsbGluZ0dyb3VwKGdyb3VwLl9pZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoJ0JpbGxpbmcgZ3JvdXAgZGVsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBkZWxldGUgYmlsbGluZyBncm91cCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgYXBwbHlHcm91cEZpbHRlcnMoZXZlbnQ6IGFueSkge1xuICAgIGlmIChldmVudD8ubGVuZ3RoKSB7XG4gICAgICBldmVudC5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuRGVzY3JpcHRpb24gPT09ICdBbm5leHVyZScpIHtcbiAgICAgICAgICB0aGlzLmFubmV4dXJlRmlsdGVyID0gZWxlbWVudC5Jc3N1ZXM/LmlkIHx8ICcnO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hbm5leHVyZUZpbHRlciA9ICcnO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gIH1cblxuICBzZWFyY2hGaWVsZCgpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gIH1cblxuICBzb3J0RGF0YShjb2x1bW46IHN0cmluZykge1xuICAgIHRoaXMuc29ydENvbHVtTmFtZSA9IGNvbHVtbjtcbiAgICB0aGlzLnNvcnRCeSAqPSAtMTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gIH1cblxuICBvblBhZ2VDaGFuZ2UocGFnZU9mZnNldDogYW55KSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhcnNlSW50KHBhZ2VPZmZzZXQpO1xuICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgfVxuXG4gIG9uUGFnZVNpemVDaGFuZ2UocGFnZVNpemU6IGFueSkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMucGFnZVNpemUgPSBwYXJzZUludChwYWdlU2l6ZSk7XG4gICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICB9XG5cbiAgb25FeHBvcnQoKSB7XG4gICAgbGV0IGZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmxlbixcbiAgICAgIHNvcnRDb2x1bU5hbWU6IHRoaXMuc29ydENvbHVtTmFtZSxcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICBleHBvcnQ6IHRydWVcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5icmFuZEJpbGxpbmdHcm91cHNFeHBvcnQoZmlsdGVycykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2Uuc2F2ZUFzRXhjZWxGaWxlKHJlcywgJ2JpbGxpbmctZ3JvdXBzJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdTb21ldGhpbmcgd2VudCBXcm9uZy4uJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwiaW52b2ljZXMtc2VjdGlvblwiPlxuICAgIDwhLS0gSGVhZGVyIFJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuNjY2NjcgMTBIMTMuMzMzM002LjY2NjY3IDYuNjY2NjdIMTMuMzMzM002LjY2NjY3IDEzLjMzMzNIMTBNNSAxNy41SDE1QzE1LjkyMDUgMTcuNSAxNi42NjY3IDE2Ljc1MzggMTYuNjY2NyAxNS44MzMzVjQuMTY2NjdDMTYuNjY2NyAzLjI0NjE5IDE1LjkyMDUgMi41IDE1IDIuNUg1QzQuMDc5NTMgMi41IDMuMzMzMzMgMy4yNDYxOSAzLjMzMzMzIDQuMTY2NjdWMTUuODMzM0MzLjMzMzMzIDE2Ljc1MzggNC4wNzk1MyAxNy41IDUgMTcuNVpcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJpbGxpbmdoZWFkZXJcIj5CaWxsaW5nIEdyb3Vwczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLWxpZ2h0IHRleHQtZGFyayBtcy0xXCI+e3sgc3VtbWFyeT8udG90YWxHcm91cHMgfHwgMCB9fSB0b3RhbDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgbXQtMVwiPk1hbmFnZSBHU1QgZW50aXRpZXMgZm9yIGNvbnNvbGlkYXRlZCBpbnZvaWNpbmcuIEVhY2ggZ3JvdXAgZ2V0cyBpdHMgb3duIGludm9pY2UuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdW1tYXJ5IENhcmRzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zIG1iLTRcIiAqbmdJZj1cInN1bW1hcnk/LnRvdGFsR3JvdXBzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWNhcmQtc21cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbC1zbVwiPlRvdGFsIEdyb3VwczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlLXNtXCI+e3sgc3VtbWFyeT8udG90YWxHcm91cHMgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktY2FyZC1zbVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsLXNtXCI+QWN0aXZlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWUtc20gdGV4dC1wcmltYXJ5XCI+e3sgc3VtbWFyeT8uYWN0aXZlIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWNhcmQtc21cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbC1zbVwiPkluYWN0aXZlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWUtc21cIj57eyBzdW1tYXJ5Py5pbmFjdGl2ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1jYXJkLXNtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWwtc21cIj5Ub3RhbCBSZWNlaXZlcnM8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZS1zbVwiPnt7IHN1bW1hcnk/LnRvdGFsUmVjZWl2ZXJzIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFNlYXJjaCArIEZpbHRlciArIEV4cG9ydCArIEFkZCBSb3cgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHBheW1lbnRoaXN0b3J5IGJvcmRlci0wIHB4LTBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9vbGJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBpbnZvaWNlc2VhcmNoIHN2Zy1pY29uLTEgcG9zaXRpb24tYWJzb2x1dGUgbXQtNiBtcy0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBvcGFjaXR5PVwiMC41XCIgeD1cIjE3LjAzNjVcIiB5PVwiMTUuMTIyM1wiIHdpZHRoPVwiOC4xNTU0NlwiIGhlaWdodD1cIjJcIiByeD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoNDUgMTcuMDM2NSAxNS4xMjIzKVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3JlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMSAxOUM2LjU1NTU2IDE5IDMgMTUuNDQ0NCAzIDExQzMgNi41NTU1NiA2LjU1NTU2IDMgMTEgM0MxNS40NDQ0IDMgMTkgNi41NTU1NiAxOSAxMUMxOSAxNS40NDQ0IDE1LjQ0NDQgMTkgMTEgMTlaTTExIDVDNy41MzMzMyA1IDUgNy41MzMzMyA1IDExQzUgMTQuNDY2NyA3LjUzMzMzIDE3IDExIDE3QzE0LjQ2NjcgMTcgMTcgMTQuNDY2NyAxNyAxMUMxNyA3LjUzMzMzIDE0LjQ2NjcgNSAxMSA1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJsZW5cIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBzLTE0IGludm9pY2VzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIiAoY2hhbmdlKT1cInNlYXJjaEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNlYXJjaERpc2FibGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1maWx0ZXJzIFtkYXRhT2JqZWN0XT1cImdyb3VwRmlsdGVyT2JqZWN0XCIgKGFwcGxpZWRGaWx0ZXJzKT1cImFwcGx5R3JvdXBGaWx0ZXJzKCRldmVudClcIj48L2xpYi1maWx0ZXJzPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25FeHBvcnQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZ3JvdXBMaXN0Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+RXhwb3J0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGV4dC1ub3dyYXAgbXMtM1wiIChjbGljayk9XCJhZGRCaWxsaW5nR3JvdXAoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgKyBBZGQgQmlsbGluZyBHcm91cFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTG9hZGluZyBTaGltbWVyIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncm91cExvYWRpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIE5vIERhdGEgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyb3VwTm9EYXRhXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjIHctMjVcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGEuc3ZnXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEdyb3VwcyBMaXN0IC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhZ3JvdXBMb2FkaW5nICYmICFncm91cE5vRGF0YVwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBncm91cCBvZiBncm91cExpc3RcIiBjbGFzcz1cImdyb3VwLWNhcmQgbWItM1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjY2NjY3IDEwSDEzLjMzMzNNNi42NjY2NyA2LjY2NjY3SDEzLjMzMzNNNi42NjY2NyAxMy4zMzMzSDEwTTUgMTcuNUgxNUMxNS45MjA1IDE3LjUgMTYuNjY2NyAxNi43NTM4IDE2LjY2NjcgMTUuODMzM1Y0LjE2NjY3QzE2LjY2NjcgMy4yNDYxOSAxNS45MjA1IDIuNSAxNSAyLjVINUM0LjA3OTUzIDIuNSAzLjMzMzMzIDMuMjQ2MTkgMy4zMzMzMyA0LjE2NjY3VjE1LjgzMzNDMy4zMzMzMyAxNi43NTM4IDQuMDc5NTMgMTcuNSA1IDE3LjVaXCIgc3Ryb2tlPVwiIzAwOUJGM1wiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3JvdXAtbmFtZVwiPnt7IGdyb3VwPy5ncm91cE5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1zdWNjZXNzXCI+QWN0aXZlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXA/LmdzdFwiPkdTVDoge3sgZ3JvdXA/LmdzdCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdyb3VwPy5nc3QgJiYgZ3JvdXA/LnJlZ2lzdGVyZWRDb21wYW55TmFtZVwiIGNsYXNzPVwibXgtMlwiPiZtaWRkb3Q7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXA/LnJlZ2lzdGVyZWRDb21wYW55TmFtZVwiPnt7IGdyb3VwPy5yZWdpc3RlcmVkQ29tcGFueU5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkgYnRuLWljb25cIiAoY2xpY2spPVwiZWRpdEJpbGxpbmdHcm91cChncm91cClcIiB0aXRsZT1cIkVkaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEuMzMzMyAyLjAwMDA0QzExLjUwODMgMS44MjQ5NCAxMS43MTYzIDEuNjg2MDUgMTEuOTQ1MSAxLjU5MTI5QzEyLjE3MzkgMS40OTY1MyAxMi40MTkxIDEuNDQ3NzUgMTIuNjY2NyAxLjQ0Nzc1QzEyLjkxNDMgMS40NDc3NSAxMy4xNTk0IDEuNDk2NTMgMTMuMzg4MiAxLjU5MTI5QzEzLjYxNyAxLjY4NjA1IDEzLjgyNSAxLjgyNDk0IDE0IDIuMDAwMDRDMTQuMTc1MSAyLjE3NTEzIDE0LjMxNCAyLjM4MzE4IDE0LjQwODggMi42MTE5N0MxNC41MDM1IDIuODQwNzYgMTQuNTUyMyAzLjA4NTg2IDE0LjU1MjMgMy4zMzMzN0MxNC41NTIzIDMuNTgwODkgMTQuNTAzNSAzLjgyNTk5IDE0LjQwODggNC4wNTQ3OEMxNC4zMTQgNC4yODM1NyAxNC4xNzUxIDQuNDkxNjIgMTQgNC42NjY3MUw1IDEzLjY2NjdMMS4zMzMzMyAxNC42NjY3TDIuMzMzMzMgMTFMMTEuMzMzMyAyLjAwMDA0WlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkgYnRuLWljb25cIiAoY2xpY2spPVwiZGVsZXRlQmlsbGluZ0dyb3VwKGdyb3VwKVwiIHRpdGxlPVwiRGVsZXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIgNEgzLjMzMzMzSDE0TTEyLjY2NjcgNFYxMy4zMzMzQzEyLjY2NjcgMTMuNjg3IDEyLjUyNjIgMTQuMDI2MSAxMi4yNzYxIDE0LjI3NjFDMTIuMDI2MSAxNC41MjYyIDExLjY4NyAxNC42NjY3IDExLjMzMzMgMTQuNjY2N0g0LjY2NjY3QzQuMzEzMDQgMTQuNjY2NyAzLjk3MzkxIDE0LjUyNjIgMy43MjM4NiAxNC4yNzYxQzMuNDczODEgMTQuMDI2MSAzLjMzMzMzIDEzLjY4NyAzLjMzMzMzIDEzLjMzMzNWNE01LjMzMzMzIDRWMi42NjY2N0M1LjMzMzMzIDIuMzEzMDQgNS40NzM4MSAxLjk3MzkxIDUuNzIzODYgMS43MjM4NkM1Ljk3MzkxIDEuNDczODEgNi4zMTMwNCAxLjMzMzMzIDYuNjY2NjcgMS4zMzMzM0g5LjMzMzMzQzkuNjg2OTYgMS4zMzMzMyAxMC4wMjYxIDEuNDczODEgMTAuMjc2MSAxLjcyMzg2QzEwLjUyNjIgMS45NzM5MSAxMC42NjY3IDIuMzEzMDQgMTAuNjY2NyAyLjY2NjY3VjRcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4zM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTMgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWRldGFpbC1sYWJlbFwiPkNvbnRhY3QgRW1haWw8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWRldGFpbC12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtZS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjE2NjY3IDQuMDgzMjVMNi4xNDYxNyA3LjQwNjE3QzYuNTA1MzMgNy42NDU1OCA2LjY4NSA3Ljc2NTI1IDYuODc5MzMgNy44MTA0MkM3LjA1MTMzIDcuODUwNDIgNy4yMzAzMyA3Ljg1MDQyIDcuNDAyMzMgNy44MTA0MkM3LjU5NjY3IDcuNzY1MjUgNy43NzYzMyA3LjY0NTU4IDguMTM1NSA3LjQwNjE3TDEzLjExNSA0LjA4MzI1TTMuOTY2NjcgMTEuNjY2NkgxMC4zMTQ3QzExLjE5NDggMTEuNjY2NiAxMS42MzQ4IDExLjY2NjYgMTEuOTcxNyAxMS40OTUxQzEyLjI2ODcgMTEuMzQzOSAxMi41MTA1IDExLjEwMjEgMTIuNjYxNyAxMC44MDUxQzEyLjgzMzMgMTAuNDY4MiAxMi44MzMzIDEwLjAyODIgMTIuODMzMyA5LjE0ODA4VjUuMTM1MDhDMTIuODMzMyA0LjI1NDk5IDEyLjgzMzMgMy44MTQ5OSAxMi42NjE3IDMuNDc4MDhDMTIuNTEwNSAzLjE4MTA4IDEyLjI2ODcgMi45MzkzMyAxMS45NzE3IDIuNzg4MDhDMTEuNjM0OCAyLjYxNjU4IDExLjE5NDggMi42MTY1OCAxMC4zMTQ3IDIuNjE2NThIMy45NjY2N0MzLjA4NjU4IDIuNjE2NTggMi42NDY1OCAyLjYxNjU4IDIuMzA5NjcgMi43ODgwOEMyLjAxMjY3IDIuOTM5MzMgMS43NzA5MiAzLjE4MTA4IDEuNjE5NjcgMy40NzgwOEMxLjQ0ODE3IDMuODE0OTkgMS40NDgxNyA0LjI1NDk5IDEuNDQ4MTcgNS4xMzUwOFY5LjE0ODA4QzEuNDQ4MTcgMTAuMDI4MiAxLjQ0ODE3IDEwLjQ2ODIgMS42MTk2NyAxMC44MDUxQzEuNzcwOTIgMTEuMTAyMSAyLjAxMjY3IDExLjM0MzkgMi4zMDk2NyAxMS40OTUxQzIuNjQ2NTggMTEuNjY2NiAzLjA4NjU4IDExLjY2NjYgMy45NjY2NyAxMS42NjY2WlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXA/LmdlbmVyYXRlSW52b2ljZVRvPy5sZW5ndGhcIj57eyBncm91cD8uZ2VuZXJhdGVJbnZvaWNlVG9bMF0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFncm91cD8uZ2VuZXJhdGVJbnZvaWNlVG8/Lmxlbmd0aFwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPuKAlDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtZGV0YWlsLWxhYmVsXCI+U3RvcmVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1kZXRhaWwtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwibWUtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS4xNjY2NyA3LjAwMDA4TDYuNTY0ODMgMS42MDE5MkM2Ljc4NjgzIDEuMzc5OTIgNi44OTc4MyAxLjI2ODkyIDcuMDI1ODMgMS4yMjE5MkM3LjEzODgzIDEuMTgwMjUgNy4yNjI4MyAxLjE4MDI1IDcuMzc1ODMgMS4yMjE5MkM3LjUwMzgzIDEuMjY4OTIgNy42MTQ4MyAxLjM3OTkyIDcuODM2ODMgMS42MDE5MkwxMy4yMzUgNy4wMDAwOE0yLjkxNjY3IDUuNTQxNzVWMTEuMDI1MUMyLjkxNjY3IDExLjQ2NTEgMi45MTY2NyAxMS42ODUxIDMuMDAyNDIgMTEuODUzNkMzLjA3ODA4IDEyLjAwMjEgMy4xOTgyNSAxMi4xMjIzIDMuMzQ2NzUgMTIuMTk3OUMzLjUxNTMzIDEyLjI4MzcgMy43MzUzMyAxMi4yODM3IDQuMTc1MzMgMTIuMjgzN0g1LjgzMzMzVjkuMzMzNDJDNS44MzMzMyA4Ljg3NTA4IDUuODMzMzMgOC42NDU5MiA1LjkyMjA4IDguNDY4OTJDNi4wMDAzMyA4LjMxMzA4IDYuMTI2MTcgOC4xODcyNSA2LjI4MiA4LjEwOTA4QzYuNDU5IDguMDIwMjUgNi42ODgxNyA4LjAyMDI1IDcuMTQ2NjcgOC4wMjAyNUg3LjI1NDE3QzcuNzEyNjcgOC4wMjAyNSA3Ljk0MTgzIDguMDIwMjUgOC4xMTg4MyA4LjEwOTA4QzguMjc0NjcgOC4xODcyNSA4LjQwMDY3IDguMzEzMDggOC40Nzg4MyA4LjQ2ODkyQzguNTY3NSA4LjY0NTkyIDguNTY3NSA4Ljg3NTA4IDguNTY3NSA5LjMzMzQyVjEyLjI4MzdIMTAuMjI2QzEwLjY2NiAxMi4yODM3IDEwLjg4NiAxMi4yODM3IDExLjA1NDUgMTIuMTk3OUMxMS4yMDMgMTIuMTIyMyAxMS4zMjMyIDEyLjAwMjEgMTEuMzk4OCAxMS44NTM2QzExLjQ4NDcgMTEuNjg1MSAxMS40ODQ3IDExLjQ2NTEgMTEuNDg0NyAxMS4wMjUxVjUuNTQxNzVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cD8uc3RvcmVDb3VudCB8fCAwIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWRldGFpbC1sYWJlbFwiPkFubmV4dXJlIEF0dGFjaG1lbnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWRldGFpbC12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZVwiIFtuZ0NsYXNzXT1cImdyb3VwPy5hdHRhY2hBbm5leHVyZSA/ICdiYWRnZS1saWdodC1zdWNjZXNzJyA6ICdiYWRnZS1saWdodC1zZWNvbmRhcnknXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ3JvdXA/LmF0dGFjaEFubmV4dXJlID8gJ0F0dGFjaGVkJyA6ICdOb3QgYXR0YWNoZWQnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWRldGFpbC1sYWJlbFwiPkludm9pY2UgUmVjZWl2ZXJzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1kZXRhaWwtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwibWUtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOS4zMzMzMyAxMi4yNVYxMS4wODMzQzkuMzMzMzMgMTAuNDY0NSA5LjA4NzM1IDkuODcxIDguNjQ5NzYgOS40MzM0MkM4LjIxMjE4IDguOTk1ODMgNy42MTg2OCA4Ljc1IDcgOC43NUgyLjkxNjY3QzIuMjk3OTkgOC43NSAxLjcwNDQ5IDguOTk1ODMgMS4yNjY5IDkuNDMzNDJDMC44MjkzMTYgOS44NzEgMC41ODMzMzMgMTAuNDY0NSAwLjU4MzMzMyAxMS4wODMzVjEyLjI1TTEyLjgzMzMgMTIuMjVWMTEuMDgzM0MxMi44MzMgMTAuNTczNSAxMi42Njg4IDEwLjA3NzggMTIuMzY1NCA5LjY2ODU4QzEyLjA2MjEgOS4yNTkzMyAxMS42MzYgOC45NTg1OCAxMS4xNDU4IDguODEwODNNOS4wNDE2NyAxLjgxMDgzQzkuNTMzMDggMS45NTc5MiA5Ljk2MDU4IDIuMjU4NTggMTAuMjY1IDIuNjY4MjVDMTAuNTY5NCAzLjA3NzkyIDEwLjczNCAzLjU3NDY3IDEwLjczNCA0LjA4NTQyQzEwLjczNCA0LjU5NjE3IDEwLjU2OTQgNS4wOTI5MiAxMC4yNjUgNS41MDI1OEM5Ljk2MDU4IDUuOTEyMjUgOS41MzMwOCA2LjIxMjkyIDkuMDQxNjcgNi4zNk03LjI5MTY3IDQuMDgzMzNDNy4yOTE2NyA1LjM3MjQyIDYuMjQ3NDIgNi40MTY2NyA0Ljk1ODMzIDYuNDE2NjdDMy42NjkyNSA2LjQxNjY3IDIuNjI1IDUuMzcyNDIgMi42MjUgNC4wODMzM0MyLjYyNSAyLjc5NDI1IDMuNjY5MjUgMS43NSA0Ljk1ODMzIDEuNzVDNi4yNDc0MiAxLjc1IDcuMjkxNjcgMi43OTQyNSA3LjI5MTY3IDQuMDgzMzNaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ3JvdXA/LnJlY2VpdmVyQ291bnQgfHwgMCB9fSByZWNpcGllbnRzXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxsaWItcGFnaW5hdGlvbiBjbGFzcz1cInRleHQtc3RhcnRcIiBbaXRlbXNQZXJQYWdlXT1cIml0ZW1zUGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZVwiXG4gICAgICAgICAgICBbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zXCIgW3BhZ2luYXRpb25TaXplc109XCJwYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIiAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1ncm91cHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2JpbGxpbmctZ3JvdXBzL2JpbGxpbmctZ3JvdXBzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLWdyb3Vwcy9iaWxsaW5nLWdyb3Vwcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBYyxLQUFLLEVBQStDLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkxQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM5RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQzs7Ozs7OztBQU8zRixNQUFNLE9BQU8sc0JBQXNCO0lBaUN2QjtJQUNBO0lBQ0E7SUFDQTtJQW5DTyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUVqQyxRQUFRLEdBQVcsRUFBRSxDQUFDO0lBRS9CLEdBQUcsQ0FBTTtJQUNULGNBQWMsR0FBWSxLQUFLLENBQUM7SUFDaEMsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUNqQyxhQUFhLEdBQVksS0FBSyxDQUFDO0lBQ0QsZUFBZSxDQUFnQztJQUU3RSxVQUFVO0lBQ1YsT0FBTyxHQUFRLEVBQUUsQ0FBQztJQUVsQixRQUFRO0lBQ1IsU0FBUyxHQUFRLEVBQUUsQ0FBQztJQUNwQixZQUFZLEdBQVksSUFBSSxDQUFDO0lBQzdC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QyxPQUFPLDJDQUEyQyxDQUFDLENBQUM7b0JBQy9HLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2lCQUMxQjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2lCQUNoRDtnQkFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQTVRVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixxT0NkbkMsNjFoQkFrTk07OzRGRHBNTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CO3FLQU9yQixRQUFRO3NCQUFoQixLQUFLO2dCQU13QixlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBCaWxsaW5nU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2JpbGxpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IEJpbGxpbmdHcm91cEZvcm1Db21wb25lbnQgfSBmcm9tICcuL2JpbGxpbmctZ3JvdXAtZm9ybS9iaWxsaW5nLWdyb3VwLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IERlbGV0ZVdhcm5pbmdDb21wb25lbnQgfSBmcm9tICcuL2RlbGV0ZS13YXJuaW5nL2RlbGV0ZS13YXJuaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCdWxrVXBsb2FkRXJyb3JDb21wb25lbnQgfSBmcm9tICcuL2J1bGstdXBsb2FkLWVycm9yL2J1bGstdXBsb2FkLWVycm9yLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1iaWxsaW5nLWdyb3VwcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9iaWxsaW5nLWdyb3Vwcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9iaWxsaW5nLWdyb3Vwcy5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQmlsbGluZ0dyb3Vwc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nID0gJyc7XG5cbiAgbGVuOiBhbnk7XG4gIHNlYXJjaERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGJ1bGtEb3dubG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBidWxrVXBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBWaWV3Q2hpbGQoJ2J1bGtVcGxvYWRJbnB1dCcpIGJ1bGtVcGxvYWRJbnB1dCE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgLy8gU3VtbWFyeVxuICBzdW1tYXJ5OiBhbnkgPSB7fTtcblxuICAvLyBUYWJsZVxuICBncm91cExpc3Q6IGFueSA9IFtdO1xuICBncm91cExvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBncm91cE5vRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICB0b3RhbEl0ZW1zOiBudW1iZXIgPSAwO1xuICBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIGN1cnJlbnRQYWdlOiBudW1iZXIgPSAxO1xuICBpdGVtc1BlclBhZ2U6IG51bWJlciA9IDEwO1xuICBwYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCAzMF07XG4gIHNvcnRDb2x1bU5hbWU6IHN0cmluZyA9ICdjcmVhdGVkQXQnO1xuICBzb3J0Qnk6IG51bWJlciA9IC0xO1xuXG4gIC8vIEZpbHRlclxuICBncm91cEZpbHRlck9iamVjdCA9IFtcbiAgICB7IERlc2NyaXB0aW9uOiAnQW5uZXh1cmUnLCB0eXBlOiAnc2luZ2xlJywgSXNzdWVzOiBbeyBpZDogJ2F0dGFjaGVkJywgdGV4dDogJ0F0dGFjaGVkJyB9LCB7IGlkOiAnbm90QXR0YWNoZWQnLCB0ZXh0OiAnTm90IEF0dGFjaGVkJyB9XSB9LFxuICBdO1xuICBhbm5leHVyZUZpbHRlcjogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xpZW50SWQpIHtcbiAgICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NsaWVudElkJ10gJiYgIWNoYW5nZXNbJ2NsaWVudElkJ10uZmlyc3RDaGFuZ2UgJiYgdGhpcy5jbGllbnRJZCkge1xuICAgICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBsb2FkQmlsbGluZ0dyb3VwcygpIHtcbiAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5ncm91cExvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZ3JvdXBOb0RhdGEgPSBmYWxzZTtcblxuICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXG4gICAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIG9mZnNldDogdGhpcy5jdXJyZW50UGFnZSxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLmxlbixcbiAgICAgIHNvcnRDb2x1bU5hbWU6IHRoaXMuc29ydENvbHVtTmFtZSxcbiAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICBhbm5leHVyZUZpbHRlcjogdGhpcy5hbm5leHVyZUZpbHRlcixcbiAgICAgIGV4cG9ydDogZmFsc2VcbiAgICB9O1xuXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5icmFuZEJpbGxpbmdHcm91cHMoZmlsdGVycykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZSkgPT4ge1xuICAgICAgICBpZiAoZT8uZGF0YT8uY291bnQpIHtcbiAgICAgICAgICB0aGlzLmdyb3VwTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZ3JvdXBOb0RhdGEgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmdyb3VwTGlzdCA9IGUuZGF0YT8uZGF0YTtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSBlLmRhdGE/LmNvdW50O1xuICAgICAgICAgIHRoaXMuc3VtbWFyeSA9IGUuZGF0YT8uc3VtbWFyeSB8fCB7fTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdyb3VwTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZ3JvdXBOb0RhdGEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc2VhcmNoRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIGlmICh0aGlzLmxlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZ3JvdXBMaXN0ID0gW107XG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMDtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZ3JvdXBMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZ3JvdXBOb0RhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLmdyb3VwTGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFkZEJpbGxpbmdHcm91cCgpIHtcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oQmlsbGluZ0dyb3VwRm9ybUNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdsZycsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xpZW50SWQgPSB0aGlzLmNsaWVudElkO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmVkaXRNb2RlID0gZmFsc2U7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIGVkaXRCaWxsaW5nR3JvdXAoZ3JvdXA6IGFueSkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihCaWxsaW5nR3JvdXBGb3JtQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ2xnJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jbGllbnRJZCA9IHRoaXMuY2xpZW50SWQ7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZWRpdE1vZGUgPSB0cnVlO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmdyb3VwRGF0YSA9IGdyb3VwO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBkZWxldGVCaWxsaW5nR3JvdXAoZ3JvdXA6IGFueSkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihEZWxldGVXYXJuaW5nQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5ncm91cE5hbWUgPSBncm91cD8uZ3JvdXBOYW1lIHx8ICcnO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ1llcycpIHtcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5kZWxldGVCaWxsaW5nR3JvdXAoZ3JvdXAuX2lkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdCgnQmlsbGluZyBncm91cCBkZWxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGRlbGV0ZSBiaWxsaW5nIGdyb3VwJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBhcHBseUdyb3VwRmlsdGVycyhldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50Py5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5EZXNjcmlwdGlvbiA9PT0gJ0FubmV4dXJlJykge1xuICAgICAgICAgIHRoaXMuYW5uZXh1cmVGaWx0ZXIgPSBlbGVtZW50Lklzc3Vlcz8uaWQgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFubmV4dXJlRmlsdGVyID0gJyc7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgfVxuXG4gIHNlYXJjaEZpZWxkKCkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgfVxuXG4gIHNvcnREYXRhKGNvbHVtbjogc3RyaW5nKSB7XG4gICAgdGhpcy5zb3J0Q29sdW1OYW1lID0gY29sdW1uO1xuICAgIHRoaXMuc29ydEJ5ICo9IC0xO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMubG9hZEJpbGxpbmdHcm91cHMoKTtcbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShwYWdlT2Zmc2V0OiBhbnkpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFyc2VJbnQocGFnZU9mZnNldCk7XG4gICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogYW55KSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IHBhcnNlSW50KHBhZ2VTaXplKTtcbiAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gIH1cblxuICBvbkV4cG9ydCgpIHtcbiAgICBsZXQgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgc2VhcmNoVmFsdWU6IHRoaXMubGVuLFxuICAgICAgc29ydENvbHVtTmFtZTogdGhpcy5zb3J0Q29sdW1OYW1lLFxuICAgICAgc29ydEJ5OiB0aGlzLnNvcnRCeSxcbiAgICAgIGV4cG9ydDogdHJ1ZVxuICAgIH07XG5cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmJyYW5kQmlsbGluZ0dyb3Vwc0V4cG9ydChmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5zYXZlQXNFeGNlbEZpbGUocmVzLCAnYmlsbGluZy1ncm91cHMnKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1NvbWV0aGluZyB3ZW50IFdyb25nLi4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGJ1bGtEb3dubG9hZCgpIHtcbiAgICBpZiAodGhpcy5idWxrRG93bmxvYWRpbmcpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY2xpZW50SWQpIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnU2VsZWN0IGEgYnJhbmQgZmlyc3QnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5idWxrRG93bmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYnVsa0Rvd25sb2FkQmlsbGluZ0dyb3Vwcyh0aGlzLmNsaWVudElkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLnNhdmVBc1RlbXBsYXRlKHJlcywgYGJpbGxpbmctZ3JvdXBzLSR7dGhpcy5jbGllbnRJZH0tJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApfWApO1xuICAgICAgICB0aGlzLmJ1bGtEb3dubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmJ1bGtEb3dubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0J1bGsgZG93bmxvYWQgZmFpbGVkJyk7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25CdWxrVXBsb2FkRmlsZVNlbGVjdGVkKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBmaWxlID0gZXZlbnQ/LnRhcmdldD8uZmlsZXM/LlswXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBldmVudC50YXJnZXQudmFsdWUgPSAnJztcbiAgICBpZiAoIXRoaXMuY2xpZW50SWQpIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnU2VsZWN0IGEgYnJhbmQgZmlyc3QnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5idWxrVXBsb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmJ1bGtVcGRhdGVCaWxsaW5nR3JvdXBzKGZpbGUsIHRoaXMuY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYnVsa1VwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBjb25zdCB1cGRhdGVkID0gcmVzPy5kYXRhPy5zdW1tYXJ5Py51cGRhdGVkID8/IDA7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGBVcGRhdGVkICR7dXBkYXRlZH0gYmlsbGluZyBncm91cChzKWApO1xuICAgICAgICB0aGlzLmxvYWRCaWxsaW5nR3JvdXBzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmJ1bGtVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgZXJyUGF5bG9hZCA9IGVycj8uZXJyb3I/LmRhdGEgfHwgZXJyPy5lcnJvcjtcbiAgICAgICAgaWYgKGVycj8uc3RhdHVzID09PSA0MjIgJiYgZXJyUGF5bG9hZD8uZXJyb3JzKSB7XG4gICAgICAgICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEJ1bGtVcGxvYWRFcnJvckNvbXBvbmVudCwge1xuICAgICAgICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdsZycsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZXJyb3JzID0gZXJyUGF5bG9hZC5lcnJvcnM7XG4gICAgICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudG90YWwgPSBlcnJQYXlsb2FkLnN1bW1hcnk/LnRvdGFsID8/IDA7XG4gICAgICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZmFpbGVkID0gZXJyUGF5bG9hZC5zdW1tYXJ5Py5mYWlsZWQgPz8gMDtcbiAgICAgICAgfSBlbHNlIGlmIChlcnI/LnN0YXR1cyA9PT0gNDEzKSB7XG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdGaWxlIHRvbyBsYXJnZSAobWF4IDVNQiknKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnI/LnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnJQYXlsb2FkPy5tZXNzYWdlIHx8ICdJbnZhbGlkIGZpbGUgZm9ybWF0IOKAlCB1c2UgWExTWCc7XG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KG1zZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyPy5zdGF0dXMgPT09IDIwNykge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBlcnJQYXlsb2FkPy5zdW1tYXJ5Py51cGRhdGVkID8/IDA7XG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGBCdWxrIHVwbG9hZCBwYXJ0aWFsbHkgYXBwbGllZDogJHt1cGRhdGVkfSB1cGRhdGVkLCB0aGVuIGFib3J0ZWQuIFBsZWFzZSByZS11cGxvYWQuYCk7XG4gICAgICAgICAgdGhpcy5sb2FkQmlsbGluZ0dyb3VwcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQnVsayB1cGxvYWQgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwiaW52b2ljZXMtc2VjdGlvblwiPlxuICAgIDwhLS0gSGVhZGVyIFJvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuNjY2NjcgMTBIMTMuMzMzM002LjY2NjY3IDYuNjY2NjdIMTMuMzMzM002LjY2NjY3IDEzLjMzMzNIMTBNNSAxNy41SDE1QzE1LjkyMDUgMTcuNSAxNi42NjY3IDE2Ljc1MzggMTYuNjY2NyAxNS44MzMzVjQuMTY2NjdDMTYuNjY2NyAzLjI0NjE5IDE1LjkyMDUgMi41IDE1IDIuNUg1QzQuMDc5NTMgMi41IDMuMzMzMzMgMy4yNDYxOSAzLjMzMzMzIDQuMTY2NjdWMTUuODMzM0MzLjMzMzMzIDE2Ljc1MzggNC4wNzk1MyAxNy41IDUgMTcuNVpcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJpbGxpbmdoZWFkZXJcIj5CaWxsaW5nIEdyb3Vwczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLWxpZ2h0IHRleHQtZGFyayBtcy0xXCI+e3sgc3VtbWFyeT8udG90YWxHcm91cHMgfHwgMCB9fSB0b3RhbDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgbXQtMVwiPk1hbmFnZSBHU1QgZW50aXRpZXMgZm9yIGNvbnNvbGlkYXRlZCBpbnZvaWNpbmcuIEVhY2ggZ3JvdXAgZ2V0cyBpdHMgb3duIGludm9pY2UuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdW1tYXJ5IENhcmRzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zIG1iLTRcIiAqbmdJZj1cInN1bW1hcnk/LnRvdGFsR3JvdXBzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWNhcmQtc21cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbC1zbVwiPlRvdGFsIEdyb3VwczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlLXNtXCI+e3sgc3VtbWFyeT8udG90YWxHcm91cHMgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktY2FyZC1zbVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsLXNtXCI+QWN0aXZlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWUtc20gdGV4dC1wcmltYXJ5XCI+e3sgc3VtbWFyeT8uYWN0aXZlIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWNhcmQtc21cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbC1zbVwiPkluYWN0aXZlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWUtc21cIj57eyBzdW1tYXJ5Py5pbmFjdGl2ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1jYXJkLXNtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWwtc21cIj5Ub3RhbCBSZWNlaXZlcnM8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZS1zbVwiPnt7IHN1bW1hcnk/LnRvdGFsUmVjZWl2ZXJzIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFNlYXJjaCArIEZpbHRlciArIEV4cG9ydCArIEFkZCBSb3cgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHBheW1lbnRoaXN0b3J5IGJvcmRlci0wIHB4LTBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9vbGJhciB3LTEwMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgbXktMVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIGludm9pY2VzZWFyY2ggc3ZnLWljb24tMSBwb3NpdGlvbi1hYnNvbHV0ZSBtdC02IG1zLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IG9wYWNpdHk9XCIwLjVcIiB4PVwiMTcuMDM2NVwiIHk9XCIxNS4xMjIzXCIgd2lkdGg9XCI4LjE1NTQ2XCIgaGVpZ2h0PVwiMlwiIHJ4PVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSg0NSAxNy4wMzY1IDE1LjEyMjMpXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcmVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExIDE5QzYuNTU1NTYgMTkgMyAxNS40NDQ0IDMgMTFDMyA2LjU1NTU2IDYuNTU1NTYgMyAxMSAzQzE1LjQ0NDQgMyAxOSA2LjU1NTU2IDE5IDExQzE5IDE1LjQ0NDQgMTUuNDQ0NCAxOSAxMSAxOVpNMTEgNUM3LjUzMzMzIDUgNSA3LjUzMzMzIDUgMTFDNSAxNC40NjY3IDcuNTMzMzMgMTcgMTEgMTdDMTQuNDY2NyAxNyAxNyAxNC40NjY3IDE3IDExQzE3IDcuNTMzMzMgMTQuNDY2NyA1IDExIDVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImxlblwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcHMtMTQgaW52b2ljZXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChjaGFuZ2UpPVwic2VhcmNoRmllbGQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VhcmNoRGlzYWJsZWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWZpbHRlcnMgW2RhdGFPYmplY3RdPVwiZ3JvdXBGaWx0ZXJPYmplY3RcIiAoYXBwbGllZEZpbHRlcnMpPVwiYXBwbHlHcm91cEZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJidWxrRG93bmxvYWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyIG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1bGtEb3dubG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTUuODMzMzMgOC4zMzMzM0wxMCAxMi41TTEwIDEyLjVMMTQuMTY2NyA4LjMzMzMzTTEwIDEyLjVWMi41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIiAqbmdJZj1cIiFidWxrRG93bmxvYWRpbmdcIj5CdWxrIERvd25sb2FkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCIgKm5nSWY9XCJidWxrRG93bmxvYWRpbmdcIj5Eb3dubG9hZGluZy4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJidWxrVXBsb2FkSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyIG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1bGtVcGxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiICpuZ0lmPVwiIWJ1bGtVcGxvYWRpbmdcIj5CdWxrIFVwbG9hZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiICpuZ0lmPVwiYnVsa1VwbG9hZGluZ1wiPlVwbG9hZGluZy4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjYnVsa1VwbG9hZElucHV0IHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiLnhsc3gsLnhsc1wiIGhpZGRlbiAoY2hhbmdlKT1cIm9uQnVsa1VwbG9hZEZpbGVTZWxlY3RlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkV4cG9ydCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLW91dGxpbmUgYnRuIGFsaWduLWl0ZW1zLWVuZCB0ZXh0LW5vd3JhcCBpbnZoZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFncm91cExpc3QubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIj5FeHBvcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LW5vd3JhcCBtcy0zXCIgKGNsaWNrKT1cImFkZEJpbGxpbmdHcm91cCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICArIEFkZCBCaWxsaW5nIEdyb3VwXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBMb2FkaW5nIFNoaW1tZXIgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyb3VwTG9hZGluZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gTm8gRGF0YSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JvdXBOb0RhdGFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmMgdy0yNVwiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YS5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gR3JvdXBzIExpc3QgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFncm91cExvYWRpbmcgJiYgIWdyb3VwTm9EYXRhXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGdyb3VwTGlzdFwiIGNsYXNzPVwiZ3JvdXAtY2FyZCBtYi0zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1pY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuNjY2NjcgMTBIMTMuMzMzM002LjY2NjY3IDYuNjY2NjdIMTMuMzMzM002LjY2NjY3IDEzLjMzMzNIMTBNNSAxNy41SDE1QzE1LjkyMDUgMTcuNSAxNi42NjY3IDE2Ljc1MzggMTYuNjY2NyAxNS44MzMzVjQuMTY2NjdDMTYuNjY2NyAzLjI0NjE5IDE1LjkyMDUgMi41IDE1IDIuNUg1QzQuMDc5NTMgMi41IDMuMzMzMzMgMy4yNDYxOSAzLjMzMzMzIDQuMTY2NjdWMTUuODMzM0MzLjMzMzMzIDE2Ljc1MzggNC4wNzk1MyAxNy41IDUgMTcuNVpcIiBzdHJva2U9XCIjMDA5QkYzXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJncm91cC1uYW1lXCI+e3sgZ3JvdXA/Lmdyb3VwTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LXN1Y2Nlc3NcIj5BY3RpdmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJncm91cD8uZ3N0XCI+R1NUOiB7eyBncm91cD8uZ3N0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXA/LmdzdCAmJiBncm91cD8ucmVnaXN0ZXJlZENvbXBhbnlOYW1lXCIgY2xhc3M9XCJteC0yXCI+Jm1pZGRvdDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJncm91cD8ucmVnaXN0ZXJlZENvbXBhbnlOYW1lXCI+e3sgZ3JvdXA/LnJlZ2lzdGVyZWRDb21wYW55TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4taWNvblwiIChjbGljayk9XCJlZGl0QmlsbGluZ0dyb3VwKGdyb3VwKVwiIHRpdGxlPVwiRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMS4zMzMzIDIuMDAwMDRDMTEuNTA4MyAxLjgyNDk0IDExLjcxNjMgMS42ODYwNSAxMS45NDUxIDEuNTkxMjlDMTIuMTczOSAxLjQ5NjUzIDEyLjQxOTEgMS40NDc3NSAxMi42NjY3IDEuNDQ3NzVDMTIuOTE0MyAxLjQ0Nzc1IDEzLjE1OTQgMS40OTY1MyAxMy4zODgyIDEuNTkxMjlDMTMuNjE3IDEuNjg2MDUgMTMuODI1IDEuODI0OTQgMTQgMi4wMDAwNEMxNC4xNzUxIDIuMTc1MTMgMTQuMzE0IDIuMzgzMTggMTQuNDA4OCAyLjYxMTk3QzE0LjUwMzUgMi44NDA3NiAxNC41NTIzIDMuMDg1ODYgMTQuNTUyMyAzLjMzMzM3QzE0LjU1MjMgMy41ODA4OSAxNC41MDM1IDMuODI1OTkgMTQuNDA4OCA0LjA1NDc4QzE0LjMxNCA0LjI4MzU3IDE0LjE3NTEgNC40OTE2MiAxNCA0LjY2NjcxTDUgMTMuNjY2N0wxLjMzMzMzIDE0LjY2NjdMMi4zMzMzMyAxMUwxMS4zMzMzIDIuMDAwMDRaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZ3JvdXA/LmlzUHJpbWFyeVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnkgYnRuLWljb25cIiAoY2xpY2spPVwiZGVsZXRlQmlsbGluZ0dyb3VwKGdyb3VwKVwiIHRpdGxlPVwiRGVsZXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIgNEgzLjMzMzMzSDE0TTEyLjY2NjcgNFYxMy4zMzMzQzEyLjY2NjcgMTMuNjg3IDEyLjUyNjIgMTQuMDI2MSAxMi4yNzYxIDE0LjI3NjFDMTIuMDI2MSAxNC41MjYyIDExLjY4NyAxNC42NjY3IDExLjMzMzMgMTQuNjY2N0g0LjY2NjY3QzQuMzEzMDQgMTQuNjY2NyAzLjk3MzkxIDE0LjUyNjIgMy43MjM4NiAxNC4yNzYxQzMuNDczODEgMTQuMDI2MSAzLjMzMzMzIDEzLjY4NyAzLjMzMzMzIDEzLjMzMzNWNE01LjMzMzMzIDRWMi42NjY2N0M1LjMzMzMzIDIuMzEzMDQgNS40NzM4MSAxLjk3MzkxIDUuNzIzODYgMS43MjM4NkM1Ljk3MzkxIDEuNDczODEgNi4zMTMwNCAxLjMzMzMzIDYuNjY2NjcgMS4zMzMzM0g5LjMzMzMzQzkuNjg2OTYgMS4zMzMzMyAxMC4wMjYxIDEuNDczODEgMTAuMjc2MSAxLjcyMzg2QzEwLjUyNjIgMS45NzM5MSAxMC42NjY3IDIuMzEzMDQgMTAuNjY2NyAyLjY2NjY3VjRcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4zM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTMgbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWRldGFpbC1sYWJlbFwiPkNvbnRhY3QgRW1haWw8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWRldGFpbC12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtZS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjE2NjY3IDQuMDgzMjVMNi4xNDYxNyA3LjQwNjE3QzYuNTA1MzMgNy42NDU1OCA2LjY4NSA3Ljc2NTI1IDYuODc5MzMgNy44MTA0MkM3LjA1MTMzIDcuODUwNDIgNy4yMzAzMyA3Ljg1MDQyIDcuNDAyMzMgNy44MTA0MkM3LjU5NjY3IDcuNzY1MjUgNy43NzYzMyA3LjY0NTU4IDguMTM1NSA3LjQwNjE3TDEzLjExNSA0LjA4MzI1TTMuOTY2NjcgMTEuNjY2NkgxMC4zMTQ3QzExLjE5NDggMTEuNjY2NiAxMS42MzQ4IDExLjY2NjYgMTEuOTcxNyAxMS40OTUxQzEyLjI2ODcgMTEuMzQzOSAxMi41MTA1IDExLjEwMjEgMTIuNjYxNyAxMC44MDUxQzEyLjgzMzMgMTAuNDY4MiAxMi44MzMzIDEwLjAyODIgMTIuODMzMyA5LjE0ODA4VjUuMTM1MDhDMTIuODMzMyA0LjI1NDk5IDEyLjgzMzMgMy44MTQ5OSAxMi42NjE3IDMuNDc4MDhDMTIuNTEwNSAzLjE4MTA4IDEyLjI2ODcgMi45MzkzMyAxMS45NzE3IDIuNzg4MDhDMTEuNjM0OCAyLjYxNjU4IDExLjE5NDggMi42MTY1OCAxMC4zMTQ3IDIuNjE2NThIMy45NjY2N0MzLjA4NjU4IDIuNjE2NTggMi42NDY1OCAyLjYxNjU4IDIuMzA5NjcgMi43ODgwOEMyLjAxMjY3IDIuOTM5MzMgMS43NzA5MiAzLjE4MTA4IDEuNjE5NjcgMy40NzgwOEMxLjQ0ODE3IDMuODE0OTkgMS40NDgxNyA0LjI1NDk5IDEuNDQ4MTcgNS4xMzUwOFY5LjE0ODA4QzEuNDQ4MTcgMTAuMDI4MiAxLjQ0ODE3IDEwLjQ2ODIgMS42MTk2NyAxMC44MDUxQzEuNzcwOTIgMTEuMTAyMSAyLjAxMjY3IDExLjM0MzkgMi4zMDk2NyAxMS40OTUxQzIuNjQ2NTggMTEuNjY2NiAzLjA4NjU4IDExLjY2NjYgMy45NjY2NyAxMS42NjY2WlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXA/LmdlbmVyYXRlSW52b2ljZVRvPy5sZW5ndGhcIj57eyBncm91cD8uZ2VuZXJhdGVJbnZvaWNlVG9bMF0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFncm91cD8uZ2VuZXJhdGVJbnZvaWNlVG8/Lmxlbmd0aFwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPuKAlDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtZGV0YWlsLWxhYmVsXCI+U3RvcmVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1kZXRhaWwtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwibWUtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS4xNjY2NyA3LjAwMDA4TDYuNTY0ODMgMS42MDE5MkM2Ljc4NjgzIDEuMzc5OTIgNi44OTc4MyAxLjI2ODkyIDcuMDI1ODMgMS4yMjE5MkM3LjEzODgzIDEuMTgwMjUgNy4yNjI4MyAxLjE4MDI1IDcuMzc1ODMgMS4yMjE5MkM3LjUwMzgzIDEuMjY4OTIgNy42MTQ4MyAxLjM3OTkyIDcuODM2ODMgMS42MDE5MkwxMy4yMzUgNy4wMDAwOE0yLjkxNjY3IDUuNTQxNzVWMTEuMDI1MUMyLjkxNjY3IDExLjQ2NTEgMi45MTY2NyAxMS42ODUxIDMuMDAyNDIgMTEuODUzNkMzLjA3ODA4IDEyLjAwMjEgMy4xOTgyNSAxMi4xMjIzIDMuMzQ2NzUgMTIuMTk3OUMzLjUxNTMzIDEyLjI4MzcgMy43MzUzMyAxMi4yODM3IDQuMTc1MzMgMTIuMjgzN0g1LjgzMzMzVjkuMzMzNDJDNS44MzMzMyA4Ljg3NTA4IDUuODMzMzMgOC42NDU5MiA1LjkyMjA4IDguNDY4OTJDNi4wMDAzMyA4LjMxMzA4IDYuMTI2MTcgOC4xODcyNSA2LjI4MiA4LjEwOTA4QzYuNDU5IDguMDIwMjUgNi42ODgxNyA4LjAyMDI1IDcuMTQ2NjcgOC4wMjAyNUg3LjI1NDE3QzcuNzEyNjcgOC4wMjAyNSA3Ljk0MTgzIDguMDIwMjUgOC4xMTg4MyA4LjEwOTA4QzguMjc0NjcgOC4xODcyNSA4LjQwMDY3IDguMzEzMDggOC40Nzg4MyA4LjQ2ODkyQzguNTY3NSA4LjY0NTkyIDguNTY3NSA4Ljg3NTA4IDguNTY3NSA5LjMzMzQyVjEyLjI4MzdIMTAuMjI2QzEwLjY2NiAxMi4yODM3IDEwLjg4NiAxMi4yODM3IDExLjA1NDUgMTIuMTk3OUMxMS4yMDMgMTIuMTIyMyAxMS4zMjMyIDEyLjAwMjEgMTEuMzk4OCAxMS44NTM2QzExLjQ4NDcgMTEuNjg1MSAxMS40ODQ3IDExLjQ2NTEgMTEuNDg0NyAxMS4wMjUxVjUuNTQxNzVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cD8uc3RvcmVDb3VudCB8fCAwIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWRldGFpbC1sYWJlbFwiPkFubmV4dXJlIEF0dGFjaG1lbnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWRldGFpbC12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZVwiIFtuZ0NsYXNzXT1cImdyb3VwPy5hdHRhY2hBbm5leHVyZSA/ICdiYWRnZS1saWdodC1zdWNjZXNzJyA6ICdiYWRnZS1saWdodC1zZWNvbmRhcnknXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ3JvdXA/LmF0dGFjaEFubmV4dXJlID8gJ0F0dGFjaGVkJyA6ICdOb3QgYXR0YWNoZWQnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLWRldGFpbC1sYWJlbFwiPkludm9pY2UgUmVjZWl2ZXJzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1kZXRhaWwtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwibWUtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOS4zMzMzMyAxMi4yNVYxMS4wODMzQzkuMzMzMzMgMTAuNDY0NSA5LjA4NzM1IDkuODcxIDguNjQ5NzYgOS40MzM0MkM4LjIxMjE4IDguOTk1ODMgNy42MTg2OCA4Ljc1IDcgOC43NUgyLjkxNjY3QzIuMjk3OTkgOC43NSAxLjcwNDQ5IDguOTk1ODMgMS4yNjY5IDkuNDMzNDJDMC44MjkzMTYgOS44NzEgMC41ODMzMzMgMTAuNDY0NSAwLjU4MzMzMyAxMS4wODMzVjEyLjI1TTEyLjgzMzMgMTIuMjVWMTEuMDgzM0MxMi44MzMgMTAuNTczNSAxMi42Njg4IDEwLjA3NzggMTIuMzY1NCA5LjY2ODU4QzEyLjA2MjEgOS4yNTkzMyAxMS42MzYgOC45NTg1OCAxMS4xNDU4IDguODEwODNNOS4wNDE2NyAxLjgxMDgzQzkuNTMzMDggMS45NTc5MiA5Ljk2MDU4IDIuMjU4NTggMTAuMjY1IDIuNjY4MjVDMTAuNTY5NCAzLjA3NzkyIDEwLjczNCAzLjU3NDY3IDEwLjczNCA0LjA4NTQyQzEwLjczNCA0LjU5NjE3IDEwLjU2OTQgNS4wOTI5MiAxMC4yNjUgNS41MDI1OEM5Ljk2MDU4IDUuOTEyMjUgOS41MzMwOCA2LjIxMjkyIDkuMDQxNjcgNi4zNk03LjI5MTY3IDQuMDgzMzNDNy4yOTE2NyA1LjM3MjQyIDYuMjQ3NDIgNi40MTY2NyA0Ljk1ODMzIDYuNDE2NjdDMy42NjkyNSA2LjQxNjY3IDIuNjI1IDUuMzcyNDIgMi42MjUgNC4wODMzM0MyLjYyNSAyLjc5NDI1IDMuNjY5MjUgMS43NSA0Ljk1ODMzIDEuNzVDNi4yNDc0MiAxLjc1IDcuMjkxNjcgMi43OTQyNSA3LjI5MTY3IDQuMDgzMzNaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ3JvdXA/LnJlY2VpdmVyQ291bnQgfHwgMCB9fSByZWNpcGllbnRzXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxsaWItcGFnaW5hdGlvbiBjbGFzcz1cInRleHQtc3RhcnRcIiBbaXRlbXNQZXJQYWdlXT1cIml0ZW1zUGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZVwiXG4gICAgICAgICAgICBbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zXCIgW3BhZ2luYXRpb25TaXplc109XCJwYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIiAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|