tango-app-ui-manage-billing 3.3.18 → 3.3.19

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.
@@ -210,6 +210,10 @@ export class BillingSummaryComponent {
210
210
  const storeTotals = this.months.map((_, i) => list.reduce((a, r) => a + (r.stores[i] || 0), 0));
211
211
  return {
212
212
  storeTotals,
213
+ outstanding: list.reduce((a, r) => a + (r.outstanding || 0), 0),
214
+ aging0to30: list.reduce((a, r) => a + (r.aging0to30 || 0), 0),
215
+ aging30to60: list.reduce((a, r) => a + (r.aging30to60 || 0), 0),
216
+ agingOver60: list.reduce((a, r) => a + (r.agingOver60 || 0), 0),
213
217
  revPrev: list.reduce((a, r) => a + (r.revPrev || 0), 0),
214
218
  revCur: list.reduce((a, r) => a + (r.revCur || 0), 0),
215
219
  installation: list.reduce((a, r) => a + (r.installationFee || 0), 0),
@@ -239,6 +243,10 @@ export class BillingSummaryComponent {
239
243
  'Client ID': r.clientId,
240
244
  'Client Name': r.clientName,
241
245
  'Registered Entity': r.registeredEntity,
246
+ 'Total Outstanding': num(r.outstanding),
247
+ '< 30 days': num(r.aging0to30),
248
+ '30 to 60 days': num(r.aging30to60),
249
+ '> 60 days': num(r.agingOver60),
242
250
  'Status': r.status,
243
251
  'Product': (r.products || []).join(' + '),
244
252
  'CSM': r.csm,
@@ -259,6 +267,10 @@ export class BillingSummaryComponent {
259
267
  'Client ID': '',
260
268
  'Client Name': 'Total',
261
269
  'Registered Entity': '',
270
+ 'Total Outstanding': sum('Total Outstanding'),
271
+ '< 30 days': sum('< 30 days'),
272
+ '30 to 60 days': sum('30 to 60 days'),
273
+ '> 60 days': sum('> 60 days'),
262
274
  'Status': '',
263
275
  'Product': '',
264
276
  'CSM': '',
@@ -275,10 +287,10 @@ export class BillingSummaryComponent {
275
287
  this.toast.getPrimaryToast(`Exported ${list.length} clients`);
276
288
  }
277
289
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingSummaryComponent, deps: [{ token: i1.BillingService }, { token: i2.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
278
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BillingSummaryComponent, selector: "lib-billing-summary", ngImport: i0, template: "<div class=\"px-4 pb-4\">\n <!-- Header: search + filter + export -->\n <div class=\"d-flex justify-content-between align-items-center mt-4 flex-wrap gap-2\">\n <div class=\"billingheader\">Billing Summary</div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"position-relative\">\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 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)]=\"query\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search client / entity / ID...\" autocomplete=\"off\"\n (change)=\"onSearch()\" />\n </div>\n <!-- Render only once options are built \u2014 lib-filters snapshots its\n dataObject in ngOnInit and never re-reads it, so it must\n initialize against the populated array. -->\n <lib-filters *ngIf=\"summaryFilterObject.length\"\n [dataObject]=\"summaryFilterObject\" (appliedFilters)=\"applySummaryFilters($event)\"></lib-filters>\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!filtered.length\" (click)=\"onExport()\">\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 </div>\n </div>\n\n <!-- Loading shimmer -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center mt-4\">\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 <!-- Empty -->\n <ng-container *ngIf=\"!loading && noData\">\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 <!-- Summary table \u2014 sticky two-row header + sticky totals footer -->\n <div *ngIf=\"!loading && !noData\" class=\"sum-scroll mt-3\">\n <table class=\"table sum-table text-nowrap mb-0\">\n <thead>\n <tr>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientId')\">Client ID\n <span class=\"arr\" [class.on]=\"sortKey === 'clientId'\">{{ sortKey === 'clientId' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientName')\">Client Name\n <span class=\"arr\" [class.on]=\"sortKey === 'clientName'\">{{ sortKey === 'clientName' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\">Registered Entity</th>\n <th rowspan=\"2\">Status</th>\n <th rowspan=\"2\">Product</th>\n <th rowspan=\"2\">CSM</th>\n <th [attr.colspan]=\"months.length\" class=\"group-head\">Store Count</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('pricePerStore')\">Price / Store\n <span class=\"arr\" [class.on]=\"sortKey === 'pricePerStore'\">{{ sortKey === 'pricePerStore' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th colspan=\"2\" class=\"group-head\">Revenue</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('variance')\">Variance\n <span class=\"arr\" [class.on]=\"sortKey === 'variance'\">{{ sortKey === 'variance' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('installationFee')\">Installation Fee\n <span class=\"arr\" [class.on]=\"sortKey === 'installationFee'\">{{ sortKey === 'installationFee' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n </tr>\n <tr>\n <th *ngFor=\"let m of months; let i = index\" class=\"sub-head\"\n [class.sortable]=\"i === months.length - 1\"\n (click)=\"i === months.length - 1 ? sortBy('storesCur') : null\">\n {{ m.label }}<span *ngIf=\"i === months.length - 1\" class=\"arr\" [class.on]=\"sortKey === 'storesCur'\">{{ sortKey === 'storesCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revPrev')\">{{ months[3].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revPrev'\">{{ sortKey === 'revPrev' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revCur')\">{{ months[4].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revCur'\">{{ sortKey === 'revCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let r of filtered\">\n <td>{{ r.clientId || '\u2014' }}</td>\n <td><strong>{{ r.clientName | uppercase }}</strong></td>\n <td>\n <span class=\"entity\" [title]=\"(r.registeredEntities && r.registeredEntities.length ? r.registeredEntities.join('\\n') : r.registeredEntity) || ''\">\n {{ r.registeredEntity || '\u2014' }}\n </span>\n <span *ngIf=\"r.registeredEntities?.length > 1\" class=\"entity-more\"\n [title]=\"r.registeredEntities.join('\\n')\">+{{ r.registeredEntities.length - 1 }}</span>\n </td>\n <td><span class=\"pill\" [ngClass]=\"r.status === 'Paid' ? 'pill-green' : 'pill-amber'\">{{ r.status }}</span></td>\n <td>\n <span *ngFor=\"let p of r.products\" [ngClass]=\"productPillClass(p)\" class=\"me-1\">{{ p }}</span>\n <span *ngIf=\"!r.products?.length\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.csm || '\u2014' }}</td>\n <td *ngFor=\"let s of r.stores; let i = index\" [class.fw-bold]=\"i === r.stores.length - 1\">\n {{ s == null ? '\u2014' : (s | number:'1.0-0':'en-IN') }}\n </td>\n <td [title]=\"r.currency === 'dollar' ? ('USD pricing \u2014 revenue converted to \u20B9 at today\\'s rate (' + (usdRate | number:'1.2-2') + ')') : ''\">\n {{ r.pricePerStore == null ? '\u2014' : (r.currency === 'dollar' ? '$' : '\u20B9') + (r.pricePerStore | number:'1.0-0':'en-IN') }}\n </td>\n <td class=\"text-muted\">{{ r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN') }}</td>\n <td>\n <strong>{{ r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN') }}</strong>\n <span *ngIf=\"r.revCurEstimated\" class=\"est-chip ms-1\"\n title=\"Estimated: current store count \u00D7 base price \u2014 replaced by the invoice amount once generated\">est.</span>\n </td>\n <td>\n <span *ngIf=\"r.variance != null\" class=\"fw-semibold\"\n [class.text-success]=\"r.variance > 0\" [class.text-danger]=\"r.variance < 0\"\n [title]=\"(months[3].label + ' ' + (r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN')) + ' \u2192 ' + months[4].label + ' ' + (r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN')))\">\n {{ r.variance > 0 ? '+' : '' }}{{ r.variance }}%\n </span>\n <span *ngIf=\"r.variance == null\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.installationFee == null ? '\u2014' : '\u20B9' + (r.installationFee | number:'1.0-0':'en-IN') }}</td>\n </tr>\n <tr *ngIf=\"!filtered.length\">\n <td [attr.colspan]=\"11 + months.length\" class=\"text-center text-muted py-5\">No clients match.</td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan=\"6\">Total \u00B7 {{ totals.count }} clients</td>\n <td *ngFor=\"let t of totals.storeTotals\"><strong>{{ t | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.revPrev | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totals.revCur | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.installation | number:'1.0-0':'en-IN' }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n</div>", styles: [":host ::ng-deep lib-filters .dropdown1{z-index:30!important}.sum-scroll{overflow:auto;max-height:64vh;border:1px solid #E4E7EC;border-radius:12px}.sum-table{min-width:1480px}.sum-table thead th{position:sticky;top:0;background:#f4f6f9;font-size:11.5px;letter-spacing:.04em;text-transform:uppercase;color:#8a93a2;font-weight:600;padding:11px 14px;border-bottom:1px solid #E4E7EC;white-space:nowrap;vertical-align:middle}.sum-table thead tr:nth-child(2) th{top:39px}.sum-table .group-head{text-align:center;border-bottom:1px solid #E4E7EC}.sum-table .sub-head{font-size:11px}.sum-table .sortable{cursor:pointer}.sum-table .sortable:hover{color:#1493f5}.sum-table .arr{color:#c2c7d0;margin-left:3px}.sum-table .arr.on{color:#1493f5}.sum-table tbody td{padding:13px 14px;border-bottom:1px solid #eceef1;vertical-align:middle;font-size:13.5px;color:#344054}.sum-table tbody tr:hover{background:#fbfcfe}.sum-table tfoot td{position:sticky;bottom:0;background:#eaf0f6;border-top:2px solid #E4E7EC;font-weight:700;padding:11px 14px;font-size:13px;color:#101828}.entity{display:inline-block;max-width:210px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.pill{display:inline-flex;align-items:center;padding:2px 9px;border-radius:999px;font-size:11px;font-weight:600;white-space:nowrap}.pill-green{background:#e7f7ee;color:#138a52}.pill-amber{background:#fdf0dc;color:#b9740a}.pill-blue{background:#e8f3fe;color:#1573c4}.pill-gray{background:#f1f3f6;color:#667085}.est-chip{font-size:10px;font-weight:700;color:#b9740a;background:#fdf0dc;border-radius:999px;padding:1px 7px;vertical-align:middle;cursor:help}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.status-tab{border:0;border-radius:8px;padding:7px 12px;font-weight:600;color:#5b6472;background:transparent}.status-tab:hover{background:#f4f6f9}.status-tab.active{background:#e8f3fe;color:#1493f5}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}.entity-more{display:inline-block;margin-left:6px;background:#eef1f5;color:#475467;font-size:11px;font-weight:700;border-radius:999px;padding:1px 7px;cursor:help}.svg-icon.invoicesearch.position-absolute{top:50%;transform:translateY(-50%);margin-top:0!important}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "pipe", type: i3.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }] });
290
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BillingSummaryComponent, selector: "lib-billing-summary", ngImport: i0, template: "<div class=\"px-4 pb-4\">\n <!-- Header: search + filter + export -->\n <div class=\"d-flex justify-content-between align-items-center mt-4 flex-wrap gap-2\">\n <div class=\"billingheader\">Billing Summary</div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"position-relative\">\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 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)]=\"query\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search client / entity / ID...\" autocomplete=\"off\"\n (change)=\"onSearch()\" />\n </div>\n <!-- Render only once options are built \u2014 lib-filters snapshots its\n dataObject in ngOnInit and never re-reads it, so it must\n initialize against the populated array. -->\n <lib-filters *ngIf=\"summaryFilterObject.length\"\n [dataObject]=\"summaryFilterObject\" (appliedFilters)=\"applySummaryFilters($event)\"></lib-filters>\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!filtered.length\" (click)=\"onExport()\">\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 </div>\n </div>\n\n <!-- Loading shimmer -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center mt-4\">\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 <!-- Empty -->\n <ng-container *ngIf=\"!loading && noData\">\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 <!-- Summary table \u2014 sticky two-row header + sticky totals footer -->\n <div *ngIf=\"!loading && !noData\" class=\"sum-scroll mt-3\">\n <table class=\"table sum-table text-nowrap mb-0\">\n <thead>\n <tr>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientId')\">Client ID\n <span class=\"arr\" [class.on]=\"sortKey === 'clientId'\">{{ sortKey === 'clientId' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientName')\">Client Name\n <span class=\"arr\" [class.on]=\"sortKey === 'clientName'\">{{ sortKey === 'clientName' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\">Registered Entity</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('outstanding')\">Total Outstanding\n <span class=\"arr\" [class.on]=\"sortKey === 'outstanding'\">{{ sortKey === 'outstanding' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('aging0to30')\">&lt; 30 days\n <span class=\"arr\" [class.on]=\"sortKey === 'aging0to30'\">{{ sortKey === 'aging0to30' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('aging30to60')\">30 to 60 days\n <span class=\"arr\" [class.on]=\"sortKey === 'aging30to60'\">{{ sortKey === 'aging30to60' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('agingOver60')\">&gt; 60 days\n <span class=\"arr\" [class.on]=\"sortKey === 'agingOver60'\">{{ sortKey === 'agingOver60' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\">Status</th>\n <th rowspan=\"2\">Product</th>\n <th rowspan=\"2\">CSM</th>\n <th [attr.colspan]=\"months.length\" class=\"group-head\">Store Count</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('pricePerStore')\">Price / Store\n <span class=\"arr\" [class.on]=\"sortKey === 'pricePerStore'\">{{ sortKey === 'pricePerStore' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th colspan=\"2\" class=\"group-head\">Revenue</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('variance')\">Variance\n <span class=\"arr\" [class.on]=\"sortKey === 'variance'\">{{ sortKey === 'variance' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('installationFee')\">Installation Fee\n <span class=\"arr\" [class.on]=\"sortKey === 'installationFee'\">{{ sortKey === 'installationFee' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n </tr>\n <tr>\n <th *ngFor=\"let m of months; let i = index\" class=\"sub-head\"\n [class.sortable]=\"i === months.length - 1\"\n (click)=\"i === months.length - 1 ? sortBy('storesCur') : null\">\n {{ m.label }}<span *ngIf=\"i === months.length - 1\" class=\"arr\" [class.on]=\"sortKey === 'storesCur'\">{{ sortKey === 'storesCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revPrev')\">{{ months[3].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revPrev'\">{{ sortKey === 'revPrev' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revCur')\">{{ months[4].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revCur'\">{{ sortKey === 'revCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let r of filtered\">\n <td>{{ r.clientId || '\u2014' }}</td>\n <td><strong>{{ r.clientName | uppercase }}</strong></td>\n <td>\n <span class=\"entity\" [title]=\"(r.registeredEntities && r.registeredEntities.length ? r.registeredEntities.join('\\n') : r.registeredEntity) || ''\">\n {{ r.registeredEntity || '\u2014' }}\n </span>\n <span *ngIf=\"r.registeredEntities?.length > 1\" class=\"entity-more\"\n [title]=\"r.registeredEntities.join('\\n')\">+{{ r.registeredEntities.length - 1 }}</span>\n </td>\n <td class=\"text-end\"><strong>{{ r.outstanding ? ('\u20B9' + (r.outstanding | number:'1.0-0':'en-IN')) : '\u2014' }}</strong></td>\n <td class=\"text-end\">{{ r.aging0to30 ? ('\u20B9' + (r.aging0to30 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td class=\"text-end\">{{ r.aging30to60 ? ('\u20B9' + (r.aging30to60 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td class=\"text-end\">{{ r.agingOver60 ? ('\u20B9' + (r.agingOver60 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td><span class=\"pill\" [ngClass]=\"r.status === 'Paid' ? 'pill-green' : 'pill-amber'\">{{ r.status }}</span></td>\n <td>\n <span *ngFor=\"let p of r.products\" [ngClass]=\"productPillClass(p)\" class=\"me-1\">{{ p }}</span>\n <span *ngIf=\"!r.products?.length\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.csm || '\u2014' }}</td>\n <td *ngFor=\"let s of r.stores; let i = index\" [class.fw-bold]=\"i === r.stores.length - 1\">\n {{ s == null ? '\u2014' : (s | number:'1.0-0':'en-IN') }}\n </td>\n <td [title]=\"r.currency === 'dollar' ? ('USD pricing \u2014 revenue converted to \u20B9 at today\\'s rate (' + (usdRate | number:'1.2-2') + ')') : ''\">\n {{ r.pricePerStore == null ? '\u2014' : (r.currency === 'dollar' ? '$' : '\u20B9') + (r.pricePerStore | number:'1.0-0':'en-IN') }}\n </td>\n <td class=\"text-muted\">{{ r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN') }}</td>\n <td>\n <strong>{{ r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN') }}</strong>\n <span *ngIf=\"r.revCurEstimated\" class=\"est-chip ms-1\"\n title=\"Estimated: current store count \u00D7 base price \u2014 replaced by the invoice amount once generated\">est.</span>\n </td>\n <td>\n <span *ngIf=\"r.variance != null\" class=\"fw-semibold\"\n [class.text-success]=\"r.variance > 0\" [class.text-danger]=\"r.variance < 0\"\n [title]=\"(months[3].label + ' ' + (r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN')) + ' \u2192 ' + months[4].label + ' ' + (r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN')))\">\n {{ r.variance > 0 ? '+' : '' }}{{ r.variance }}%\n </span>\n <span *ngIf=\"r.variance == null\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.installationFee == null ? '\u2014' : '\u20B9' + (r.installationFee | number:'1.0-0':'en-IN') }}</td>\n </tr>\n <tr *ngIf=\"!filtered.length\">\n <td [attr.colspan]=\"15 + months.length\" class=\"text-center text-muted py-5\">No clients match.</td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan=\"3\">Total \u00B7 {{ totals.count }} clients</td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.outstanding | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.aging0to30 | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.aging30to60 | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.agingOver60 | number:'1.0-0':'en-IN' }}</strong></td>\n <td colspan=\"3\"></td>\n <td *ngFor=\"let t of totals.storeTotals\"><strong>{{ t | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.revPrev | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totals.revCur | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.installation | number:'1.0-0':'en-IN' }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n</div>", styles: [":host ::ng-deep lib-filters .dropdown1{z-index:30!important}.sum-scroll{overflow:auto;max-height:64vh;border:1px solid #E4E7EC;border-radius:12px}.sum-table{min-width:1480px}.sum-table thead th{position:sticky;top:0;background:#f4f6f9;font-size:11.5px;letter-spacing:.04em;text-transform:uppercase;color:#8a93a2;font-weight:600;padding:11px 14px;border-bottom:1px solid #E4E7EC;white-space:nowrap;vertical-align:middle}.sum-table thead tr:nth-child(2) th{top:39px}.sum-table .group-head{text-align:center;border-bottom:1px solid #E4E7EC}.sum-table .sub-head{font-size:11px}.sum-table .sortable{cursor:pointer}.sum-table .sortable:hover{color:#1493f5}.sum-table .arr{color:#c2c7d0;margin-left:3px}.sum-table .arr.on{color:#1493f5}.sum-table tbody td{padding:13px 14px;border-bottom:1px solid #eceef1;vertical-align:middle;font-size:13.5px;color:#344054}.sum-table tbody tr:hover{background:#fbfcfe}.sum-table tfoot td{position:sticky;bottom:0;background:#eaf0f6;border-top:2px solid #E4E7EC;font-weight:700;padding:11px 14px;font-size:13px;color:#101828}.entity{display:inline-block;max-width:210px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.pill{display:inline-flex;align-items:center;padding:2px 9px;border-radius:999px;font-size:11px;font-weight:600;white-space:nowrap}.pill-green{background:#e7f7ee;color:#138a52}.pill-amber{background:#fdf0dc;color:#b9740a}.pill-blue{background:#e8f3fe;color:#1573c4}.pill-gray{background:#f1f3f6;color:#667085}.est-chip{font-size:10px;font-weight:700;color:#b9740a;background:#fdf0dc;border-radius:999px;padding:1px 7px;vertical-align:middle;cursor:help}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.status-tab{border:0;border-radius:8px;padding:7px 12px;font-weight:600;color:#5b6472;background:transparent}.status-tab:hover{background:#f4f6f9}.status-tab.active{background:#e8f3fe;color:#1493f5}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}.entity-more{display:inline-block;margin-left:6px;background:#eef1f5;color:#475467;font-size:11px;font-weight:700;border-radius:999px;padding:1px 7px;cursor:help}.svg-icon.invoicesearch.position-absolute{top:50%;transform:translateY(-50%);margin-top:0!important}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "pipe", type: i3.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }] });
279
291
  }
280
292
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BillingSummaryComponent, decorators: [{
281
293
  type: Component,
282
- args: [{ selector: 'lib-billing-summary', template: "<div class=\"px-4 pb-4\">\n <!-- Header: search + filter + export -->\n <div class=\"d-flex justify-content-between align-items-center mt-4 flex-wrap gap-2\">\n <div class=\"billingheader\">Billing Summary</div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"position-relative\">\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 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)]=\"query\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search client / entity / ID...\" autocomplete=\"off\"\n (change)=\"onSearch()\" />\n </div>\n <!-- Render only once options are built \u2014 lib-filters snapshots its\n dataObject in ngOnInit and never re-reads it, so it must\n initialize against the populated array. -->\n <lib-filters *ngIf=\"summaryFilterObject.length\"\n [dataObject]=\"summaryFilterObject\" (appliedFilters)=\"applySummaryFilters($event)\"></lib-filters>\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!filtered.length\" (click)=\"onExport()\">\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 </div>\n </div>\n\n <!-- Loading shimmer -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center mt-4\">\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 <!-- Empty -->\n <ng-container *ngIf=\"!loading && noData\">\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 <!-- Summary table \u2014 sticky two-row header + sticky totals footer -->\n <div *ngIf=\"!loading && !noData\" class=\"sum-scroll mt-3\">\n <table class=\"table sum-table text-nowrap mb-0\">\n <thead>\n <tr>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientId')\">Client ID\n <span class=\"arr\" [class.on]=\"sortKey === 'clientId'\">{{ sortKey === 'clientId' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientName')\">Client Name\n <span class=\"arr\" [class.on]=\"sortKey === 'clientName'\">{{ sortKey === 'clientName' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\">Registered Entity</th>\n <th rowspan=\"2\">Status</th>\n <th rowspan=\"2\">Product</th>\n <th rowspan=\"2\">CSM</th>\n <th [attr.colspan]=\"months.length\" class=\"group-head\">Store Count</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('pricePerStore')\">Price / Store\n <span class=\"arr\" [class.on]=\"sortKey === 'pricePerStore'\">{{ sortKey === 'pricePerStore' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th colspan=\"2\" class=\"group-head\">Revenue</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('variance')\">Variance\n <span class=\"arr\" [class.on]=\"sortKey === 'variance'\">{{ sortKey === 'variance' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('installationFee')\">Installation Fee\n <span class=\"arr\" [class.on]=\"sortKey === 'installationFee'\">{{ sortKey === 'installationFee' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n </tr>\n <tr>\n <th *ngFor=\"let m of months; let i = index\" class=\"sub-head\"\n [class.sortable]=\"i === months.length - 1\"\n (click)=\"i === months.length - 1 ? sortBy('storesCur') : null\">\n {{ m.label }}<span *ngIf=\"i === months.length - 1\" class=\"arr\" [class.on]=\"sortKey === 'storesCur'\">{{ sortKey === 'storesCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revPrev')\">{{ months[3].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revPrev'\">{{ sortKey === 'revPrev' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revCur')\">{{ months[4].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revCur'\">{{ sortKey === 'revCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let r of filtered\">\n <td>{{ r.clientId || '\u2014' }}</td>\n <td><strong>{{ r.clientName | uppercase }}</strong></td>\n <td>\n <span class=\"entity\" [title]=\"(r.registeredEntities && r.registeredEntities.length ? r.registeredEntities.join('\\n') : r.registeredEntity) || ''\">\n {{ r.registeredEntity || '\u2014' }}\n </span>\n <span *ngIf=\"r.registeredEntities?.length > 1\" class=\"entity-more\"\n [title]=\"r.registeredEntities.join('\\n')\">+{{ r.registeredEntities.length - 1 }}</span>\n </td>\n <td><span class=\"pill\" [ngClass]=\"r.status === 'Paid' ? 'pill-green' : 'pill-amber'\">{{ r.status }}</span></td>\n <td>\n <span *ngFor=\"let p of r.products\" [ngClass]=\"productPillClass(p)\" class=\"me-1\">{{ p }}</span>\n <span *ngIf=\"!r.products?.length\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.csm || '\u2014' }}</td>\n <td *ngFor=\"let s of r.stores; let i = index\" [class.fw-bold]=\"i === r.stores.length - 1\">\n {{ s == null ? '\u2014' : (s | number:'1.0-0':'en-IN') }}\n </td>\n <td [title]=\"r.currency === 'dollar' ? ('USD pricing \u2014 revenue converted to \u20B9 at today\\'s rate (' + (usdRate | number:'1.2-2') + ')') : ''\">\n {{ r.pricePerStore == null ? '\u2014' : (r.currency === 'dollar' ? '$' : '\u20B9') + (r.pricePerStore | number:'1.0-0':'en-IN') }}\n </td>\n <td class=\"text-muted\">{{ r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN') }}</td>\n <td>\n <strong>{{ r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN') }}</strong>\n <span *ngIf=\"r.revCurEstimated\" class=\"est-chip ms-1\"\n title=\"Estimated: current store count \u00D7 base price \u2014 replaced by the invoice amount once generated\">est.</span>\n </td>\n <td>\n <span *ngIf=\"r.variance != null\" class=\"fw-semibold\"\n [class.text-success]=\"r.variance > 0\" [class.text-danger]=\"r.variance < 0\"\n [title]=\"(months[3].label + ' ' + (r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN')) + ' \u2192 ' + months[4].label + ' ' + (r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN')))\">\n {{ r.variance > 0 ? '+' : '' }}{{ r.variance }}%\n </span>\n <span *ngIf=\"r.variance == null\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.installationFee == null ? '\u2014' : '\u20B9' + (r.installationFee | number:'1.0-0':'en-IN') }}</td>\n </tr>\n <tr *ngIf=\"!filtered.length\">\n <td [attr.colspan]=\"11 + months.length\" class=\"text-center text-muted py-5\">No clients match.</td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan=\"6\">Total \u00B7 {{ totals.count }} clients</td>\n <td *ngFor=\"let t of totals.storeTotals\"><strong>{{ t | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.revPrev | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totals.revCur | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.installation | number:'1.0-0':'en-IN' }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n</div>", styles: [":host ::ng-deep lib-filters .dropdown1{z-index:30!important}.sum-scroll{overflow:auto;max-height:64vh;border:1px solid #E4E7EC;border-radius:12px}.sum-table{min-width:1480px}.sum-table thead th{position:sticky;top:0;background:#f4f6f9;font-size:11.5px;letter-spacing:.04em;text-transform:uppercase;color:#8a93a2;font-weight:600;padding:11px 14px;border-bottom:1px solid #E4E7EC;white-space:nowrap;vertical-align:middle}.sum-table thead tr:nth-child(2) th{top:39px}.sum-table .group-head{text-align:center;border-bottom:1px solid #E4E7EC}.sum-table .sub-head{font-size:11px}.sum-table .sortable{cursor:pointer}.sum-table .sortable:hover{color:#1493f5}.sum-table .arr{color:#c2c7d0;margin-left:3px}.sum-table .arr.on{color:#1493f5}.sum-table tbody td{padding:13px 14px;border-bottom:1px solid #eceef1;vertical-align:middle;font-size:13.5px;color:#344054}.sum-table tbody tr:hover{background:#fbfcfe}.sum-table tfoot td{position:sticky;bottom:0;background:#eaf0f6;border-top:2px solid #E4E7EC;font-weight:700;padding:11px 14px;font-size:13px;color:#101828}.entity{display:inline-block;max-width:210px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.pill{display:inline-flex;align-items:center;padding:2px 9px;border-radius:999px;font-size:11px;font-weight:600;white-space:nowrap}.pill-green{background:#e7f7ee;color:#138a52}.pill-amber{background:#fdf0dc;color:#b9740a}.pill-blue{background:#e8f3fe;color:#1573c4}.pill-gray{background:#f1f3f6;color:#667085}.est-chip{font-size:10px;font-weight:700;color:#b9740a;background:#fdf0dc;border-radius:999px;padding:1px 7px;vertical-align:middle;cursor:help}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.status-tab{border:0;border-radius:8px;padding:7px 12px;font-weight:600;color:#5b6472;background:transparent}.status-tab:hover{background:#f4f6f9}.status-tab.active{background:#e8f3fe;color:#1493f5}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}.entity-more{display:inline-block;margin-left:6px;background:#eef1f5;color:#475467;font-size:11px;font-weight:700;border-radius:999px;padding:1px 7px;cursor:help}.svg-icon.invoicesearch.position-absolute{top:50%;transform:translateY(-50%);margin-top:0!important}\n"] }]
294
+ args: [{ selector: 'lib-billing-summary', template: "<div class=\"px-4 pb-4\">\n <!-- Header: search + filter + export -->\n <div class=\"d-flex justify-content-between align-items-center mt-4 flex-wrap gap-2\">\n <div class=\"billingheader\">Billing Summary</div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"position-relative\">\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 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)]=\"query\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search client / entity / ID...\" autocomplete=\"off\"\n (change)=\"onSearch()\" />\n </div>\n <!-- Render only once options are built \u2014 lib-filters snapshots its\n dataObject in ngOnInit and never re-reads it, so it must\n initialize against the populated array. -->\n <lib-filters *ngIf=\"summaryFilterObject.length\"\n [dataObject]=\"summaryFilterObject\" (appliedFilters)=\"applySummaryFilters($event)\"></lib-filters>\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\n [disabled]=\"!filtered.length\" (click)=\"onExport()\">\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 </div>\n </div>\n\n <!-- Loading shimmer -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center mt-4\">\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 <!-- Empty -->\n <ng-container *ngIf=\"!loading && noData\">\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 <!-- Summary table \u2014 sticky two-row header + sticky totals footer -->\n <div *ngIf=\"!loading && !noData\" class=\"sum-scroll mt-3\">\n <table class=\"table sum-table text-nowrap mb-0\">\n <thead>\n <tr>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientId')\">Client ID\n <span class=\"arr\" [class.on]=\"sortKey === 'clientId'\">{{ sortKey === 'clientId' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('clientName')\">Client Name\n <span class=\"arr\" [class.on]=\"sortKey === 'clientName'\">{{ sortKey === 'clientName' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\">Registered Entity</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('outstanding')\">Total Outstanding\n <span class=\"arr\" [class.on]=\"sortKey === 'outstanding'\">{{ sortKey === 'outstanding' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('aging0to30')\">&lt; 30 days\n <span class=\"arr\" [class.on]=\"sortKey === 'aging0to30'\">{{ sortKey === 'aging0to30' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('aging30to60')\">30 to 60 days\n <span class=\"arr\" [class.on]=\"sortKey === 'aging30to60'\">{{ sortKey === 'aging30to60' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('agingOver60')\">&gt; 60 days\n <span class=\"arr\" [class.on]=\"sortKey === 'agingOver60'\">{{ sortKey === 'agingOver60' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\">Status</th>\n <th rowspan=\"2\">Product</th>\n <th rowspan=\"2\">CSM</th>\n <th [attr.colspan]=\"months.length\" class=\"group-head\">Store Count</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('pricePerStore')\">Price / Store\n <span class=\"arr\" [class.on]=\"sortKey === 'pricePerStore'\">{{ sortKey === 'pricePerStore' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th colspan=\"2\" class=\"group-head\">Revenue</th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('variance')\">Variance\n <span class=\"arr\" [class.on]=\"sortKey === 'variance'\">{{ sortKey === 'variance' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th rowspan=\"2\" class=\"sortable\" (click)=\"sortBy('installationFee')\">Installation Fee\n <span class=\"arr\" [class.on]=\"sortKey === 'installationFee'\">{{ sortKey === 'installationFee' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n </tr>\n <tr>\n <th *ngFor=\"let m of months; let i = index\" class=\"sub-head\"\n [class.sortable]=\"i === months.length - 1\"\n (click)=\"i === months.length - 1 ? sortBy('storesCur') : null\">\n {{ m.label }}<span *ngIf=\"i === months.length - 1\" class=\"arr\" [class.on]=\"sortKey === 'storesCur'\">{{ sortKey === 'storesCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span>\n </th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revPrev')\">{{ months[3].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revPrev'\">{{ sortKey === 'revPrev' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n <th class=\"sub-head sortable\" (click)=\"sortBy('revCur')\">{{ months[4].label }}<span class=\"arr\" [class.on]=\"sortKey === 'revCur'\">{{ sortKey === 'revCur' && sortDir === 1 ? '\u2191' : '\u2193' }}</span></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let r of filtered\">\n <td>{{ r.clientId || '\u2014' }}</td>\n <td><strong>{{ r.clientName | uppercase }}</strong></td>\n <td>\n <span class=\"entity\" [title]=\"(r.registeredEntities && r.registeredEntities.length ? r.registeredEntities.join('\\n') : r.registeredEntity) || ''\">\n {{ r.registeredEntity || '\u2014' }}\n </span>\n <span *ngIf=\"r.registeredEntities?.length > 1\" class=\"entity-more\"\n [title]=\"r.registeredEntities.join('\\n')\">+{{ r.registeredEntities.length - 1 }}</span>\n </td>\n <td class=\"text-end\"><strong>{{ r.outstanding ? ('\u20B9' + (r.outstanding | number:'1.0-0':'en-IN')) : '\u2014' }}</strong></td>\n <td class=\"text-end\">{{ r.aging0to30 ? ('\u20B9' + (r.aging0to30 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td class=\"text-end\">{{ r.aging30to60 ? ('\u20B9' + (r.aging30to60 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td class=\"text-end\">{{ r.agingOver60 ? ('\u20B9' + (r.agingOver60 | number:'1.0-0':'en-IN')) : '\u2014' }}</td>\n <td><span class=\"pill\" [ngClass]=\"r.status === 'Paid' ? 'pill-green' : 'pill-amber'\">{{ r.status }}</span></td>\n <td>\n <span *ngFor=\"let p of r.products\" [ngClass]=\"productPillClass(p)\" class=\"me-1\">{{ p }}</span>\n <span *ngIf=\"!r.products?.length\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.csm || '\u2014' }}</td>\n <td *ngFor=\"let s of r.stores; let i = index\" [class.fw-bold]=\"i === r.stores.length - 1\">\n {{ s == null ? '\u2014' : (s | number:'1.0-0':'en-IN') }}\n </td>\n <td [title]=\"r.currency === 'dollar' ? ('USD pricing \u2014 revenue converted to \u20B9 at today\\'s rate (' + (usdRate | number:'1.2-2') + ')') : ''\">\n {{ r.pricePerStore == null ? '\u2014' : (r.currency === 'dollar' ? '$' : '\u20B9') + (r.pricePerStore | number:'1.0-0':'en-IN') }}\n </td>\n <td class=\"text-muted\">{{ r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN') }}</td>\n <td>\n <strong>{{ r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN') }}</strong>\n <span *ngIf=\"r.revCurEstimated\" class=\"est-chip ms-1\"\n title=\"Estimated: current store count \u00D7 base price \u2014 replaced by the invoice amount once generated\">est.</span>\n </td>\n <td>\n <span *ngIf=\"r.variance != null\" class=\"fw-semibold\"\n [class.text-success]=\"r.variance > 0\" [class.text-danger]=\"r.variance < 0\"\n [title]=\"(months[3].label + ' ' + (r.revPrev == null ? '\u2014' : '\u20B9' + (r.revPrev | number:'1.0-0':'en-IN')) + ' \u2192 ' + months[4].label + ' ' + (r.revCur == null ? '\u2014' : '\u20B9' + (r.revCur | number:'1.0-0':'en-IN')))\">\n {{ r.variance > 0 ? '+' : '' }}{{ r.variance }}%\n </span>\n <span *ngIf=\"r.variance == null\" class=\"text-muted\">\u2014</span>\n </td>\n <td>{{ r.installationFee == null ? '\u2014' : '\u20B9' + (r.installationFee | number:'1.0-0':'en-IN') }}</td>\n </tr>\n <tr *ngIf=\"!filtered.length\">\n <td [attr.colspan]=\"15 + months.length\" class=\"text-center text-muted py-5\">No clients match.</td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan=\"3\">Total \u00B7 {{ totals.count }} clients</td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.outstanding | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.aging0to30 | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.aging30to60 | number:'1.0-0':'en-IN' }}</strong></td>\n <td class=\"text-end\"><strong>\u20B9{{ totals.agingOver60 | number:'1.0-0':'en-IN' }}</strong></td>\n <td colspan=\"3\"></td>\n <td *ngFor=\"let t of totals.storeTotals\"><strong>{{ t | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.revPrev | number:'1.0-0':'en-IN' }}</strong></td>\n <td><strong>\u20B9{{ totals.revCur | number:'1.0-0':'en-IN' }}</strong></td>\n <td></td>\n <td><strong>\u20B9{{ totals.installation | number:'1.0-0':'en-IN' }}</strong></td>\n </tr>\n </tfoot>\n </table>\n </div>\n</div>", styles: [":host ::ng-deep lib-filters .dropdown1{z-index:30!important}.sum-scroll{overflow:auto;max-height:64vh;border:1px solid #E4E7EC;border-radius:12px}.sum-table{min-width:1480px}.sum-table thead th{position:sticky;top:0;background:#f4f6f9;font-size:11.5px;letter-spacing:.04em;text-transform:uppercase;color:#8a93a2;font-weight:600;padding:11px 14px;border-bottom:1px solid #E4E7EC;white-space:nowrap;vertical-align:middle}.sum-table thead tr:nth-child(2) th{top:39px}.sum-table .group-head{text-align:center;border-bottom:1px solid #E4E7EC}.sum-table .sub-head{font-size:11px}.sum-table .sortable{cursor:pointer}.sum-table .sortable:hover{color:#1493f5}.sum-table .arr{color:#c2c7d0;margin-left:3px}.sum-table .arr.on{color:#1493f5}.sum-table tbody td{padding:13px 14px;border-bottom:1px solid #eceef1;vertical-align:middle;font-size:13.5px;color:#344054}.sum-table tbody tr:hover{background:#fbfcfe}.sum-table tfoot td{position:sticky;bottom:0;background:#eaf0f6;border-top:2px solid #E4E7EC;font-weight:700;padding:11px 14px;font-size:13px;color:#101828}.entity{display:inline-block;max-width:210px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.pill{display:inline-flex;align-items:center;padding:2px 9px;border-radius:999px;font-size:11px;font-weight:600;white-space:nowrap}.pill-green{background:#e7f7ee;color:#138a52}.pill-amber{background:#fdf0dc;color:#b9740a}.pill-blue{background:#e8f3fe;color:#1573c4}.pill-gray{background:#f1f3f6;color:#667085}.est-chip{font-size:10px;font-weight:700;color:#b9740a;background:#fdf0dc;border-radius:999px;padding:1px 7px;vertical-align:middle;cursor:help}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.status-tab{border:0;border-radius:8px;padding:7px 12px;font-weight:600;color:#5b6472;background:transparent}.status-tab:hover{background:#f4f6f9}.status-tab.active{background:#e8f3fe;color:#1493f5}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}.entity-more{display:inline-block;margin-left:6px;background:#eef1f5;color:#475467;font-size:11px;font-weight:700;border-radius:999px;padding:1px 7px;cursor:help}.svg-icon.invoicesearch.position-absolute{top:50%;transform:translateY(-50%);margin-top:0!important}\n"] }]
283
295
  }], ctorParameters: () => [{ type: i1.BillingService }, { type: i2.ToastService }, { type: i0.ChangeDetectorRef }] });
284
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLXN1bW1hcnkvYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLXN1bW1hcnkvYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBSTFDLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsdUVBQXVFO0FBQ3ZFLDhDQUE4QztBQU05QyxNQUFNLE9BQU8sdUJBQXVCO0lBdUJ4QjtJQUNBO0lBQ0E7SUF4QlYsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNmLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFZixNQUFNLEdBQXFDLEVBQUUsQ0FBQztJQUM5QyxJQUFJLEdBQVUsRUFBRSxDQUFDO0lBQ2pCLHVFQUF1RTtJQUN2RSxPQUFPLEdBQWtCLElBQUksQ0FBQztJQUU5QixXQUFXO0lBQ1gsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLGNBQWMsR0FBMEMsS0FBSyxDQUFDO0lBRTlELDZEQUE2RDtJQUM3RCxPQUFPLEdBQWtCLFdBQVcsQ0FBQztJQUNyQyxPQUFPLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFFSixRQUFRLEdBQUcsSUFBSSxPQUFP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QUMsZUFBZSxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sVUFBVSxDQUFDLENBQUM7SUFDaEUsQ0FBQzt3R0FsUlUsdUJBQXVCOzRGQUF2Qix1QkFBdUIsMkRDZHBDLGdvVkF1Sk07OzRGRHpJTyx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0UscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XG5pbXBvcnQgeyBCaWxsaW5nU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2JpbGxpbmcuc2VydmljZSc7XG5cbi8vIEJpbGxpbmcgU3VtbWFyeSB0YWIgKHByb3RvdHlwZSBwYXJpdHkpOiBvbmUgcm93IHBlciBjbGllbnQg4oCUIG1vbnRobHkgc3RvcmVcbi8vIGNvdW50cyAoZGFpbHlQcmljaW5nKSwgcmV2ZW51ZSBmb3IgdGhlIGxhc3QgdHdvIG1vbnRocyB3aXRoIHZhcmlhbmNlLCBwcmljZVxuLy8gcGVyIHN0b3JlIGFuZCBpbnN0YWxsYXRpb24gZmVlIChpbnZvaWNlcykuIERhdGEgYXJyaXZlcyBpbiBvbmUgY2FsbDtcbi8vIHNlYXJjaCAvIGZpbHRlciAvIHNvcnQgYWxsIHJ1biBjbGllbnQtc2lkZS5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1iaWxsaW5nLXN1bW1hcnknLFxuICB0ZW1wbGF0ZVVybDogJy4vYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2JpbGxpbmctc3VtbWFyeS5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQmlsbGluZ1N1bW1hcnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGxvYWRpbmcgPSB0cnVlO1xuICBub0RhdGEgPSBmYWxzZTtcblxuICBtb250aHM6IHsga2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XG4gIHJvd3M6IGFueVtdID0gW107XG4gIC8vIFRvZGF5J3MgVVNELT5JTlIgcmF0ZSB1c2VkIGJ5IHRoZSBiYWNrZW5kIGZvciBkb2xsYXItcHJpY2VkIGNsaWVudHMuXG4gIHVzZFJhdGU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8vIEZpbHRlcnMuXG4gIHF1ZXJ5ID0gJyc7XG4gIGZpbHRlck9wZW4gPSBmYWxzZTtcbiAgY3NtRmlsdGVyID0gJ0FsbCc7XG4gIHByb2R1Y3RGaWx0ZXIgPSAnQWxsJztcbiAgdmFyaWFuY2VGaWx0ZXI6ICdBbGwnIHwgJ2dyb3d0aCcgfCAnZGVjbGluZScgfCAnZmxhdCcgPSAnQWxsJztcblxuICAvLyBTb3J0aW5nLiBEZWZhdWx0OiBoaWdoZXN0IGN1cnJlbnQtbW9udGggc3RvcmUgY291bnQgZmlyc3QuXG4gIHNvcnRLZXk6IHN0cmluZyB8IG51bGwgPSAnc3RvcmVzQ3VyJztcbiAgc29ydERpcjogMSB8IC0xID0gLTE7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHt9XG5cbiAgLy8gRnVsbCByZXN1bHQtc2V0IHNpemUgKGJlZm9yZSBmaWx0ZXJzKSDigJQgZm9yIHRoZSBcIk4gb2YgTVwiIGhpbnQgYW5kIHRvIGtub3dcbiAgLy8gd2hlbiBmaWx0ZXJzIGFjdHVhbGx5IG5hcnJvd2VkIGFueXRoaW5nLlxuICB0b3RhbENvdW50ID0gMDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRMaXN0KCk7XG4gIH1cblxuICAvLyBTZXJ2ZXItc2lkZSBsb2FkOiBmaWx0ZXJzIGFyZSBzZW50IHRvIHRoZSBBUEkgYW5kIGl0IHJldHVybnMgb25seSBtYXRjaGluZ1xuICAvLyByb3dzLiBDYWxsZWQgb24gZmlyc3QgbG9hZCBhbmQgd2hlbmV2ZXIgYSBmaWx0ZXIgb3Igc2VhcmNoIGNoYW5nZXMuXG4gIGxvYWRMaXN0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIGNzbTogdGhpcy5jc21GaWx0ZXIsXG4gICAgICBwcm9kdWN0OiB0aGlzLnByb2R1Y3RGaWx0ZXIsXG4gICAgICB2YXJpYW5jZTogdGhpcy52YXJpYW5jZUZpbHRlcixcbiAgICAgIHNlYXJjaDogdGhpcy5xdWVyeSxcbiAgICB9O1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYmlsbGluZ1N1bW1hcnkoZmlsdGVycykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vbnRocyA9IHJlcz8uZGF0YT8ubW9udGhzIHx8IFtdO1xuICAgICAgICB0aGlzLnJvd3MgPSByZXM/LmRhdGE/LmRhdGEgfHwgW107XG4gICAgICAgIHRoaXMudXNkUmF0ZSA9IHJlcz8uZGF0YT8udXNkUmF0ZSB8fCBudWxsO1xuICAgICAgICB0aGlzLnRvdGFsQ291bnQgPSByZXM/LmRhdGE/LnRvdGFsID8/IHRoaXMucm93cy5sZW5ndGg7XG4gICAgICAgIC8vIE9wdGlvbiBsaXN0cyBmb3IgdGhlIHBvcG92ZXIgY29tZSBmcm9tIHRoZSBBUEkncyBmdWxsIHJlc3VsdCBzZXQgc29cbiAgICAgICAgLy8gdGhleSBkb24ndCBzaHJpbmsgYXMgZmlsdGVycyBuYXJyb3cgdGhlIHRhYmxlLlxuICAgICAgICB0aGlzLmNzbUFwaU9wdGlvbnMgPSByZXM/LmRhdGE/LmNzbU9wdGlvbnMgfHwgdGhpcy5jc21BcGlPcHRpb25zO1xuICAgICAgICB0aGlzLnByb2R1Y3RBcGlPcHRpb25zID0gcmVzPy5kYXRhPy5wcm9kdWN0T3B0aW9ucyB8fCB0aGlzLnByb2R1Y3RBcGlPcHRpb25zO1xuICAgICAgICB0aGlzLm5vRGF0YSA9IHRoaXMucm93cy5sZW5ndGggPT09IDA7XG4gICAgICAgIC8vIEJ1aWxkIHRoZSBwb3BvdmVyIG9wdGlvbnMgT05DRSAod2hlbiBvcHRpb24gbGlzdHMgZmlyc3QgYXJyaXZlKS5cbiAgICAgICAgLy8gUmVidWlsZGluZyB0aGUgYXJyYXkgcmVmZXJlbmNlIG9uIGV2ZXJ5IGxvYWQgZGVzeW5jcyBsaWItZmlsdGVycydcbiAgICAgICAgLy8gaW50ZXJuYWwgc25hcHNob3QgKHRha2VuIGluIGl0cyBuZ09uSW5pdCksIHdoaWNoIHNpbGVudGx5IGRyb3BzIHRoZVxuICAgICAgICAvLyBzZWxlY3Rpb24gb24gQXBwbHkuXG4gICAgICAgIGlmICghdGhpcy5zdW1tYXJ5RmlsdGVyT2JqZWN0Lmxlbmd0aCAmJiAodGhpcy5jc21BcGlPcHRpb25zLmxlbmd0aCB8fCB0aGlzLnByb2R1Y3RBcGlPcHRpb25zLmxlbmd0aCkpIHtcbiAgICAgICAgICB0aGlzLmJ1aWxkRmlsdGVyT2JqZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgICAgICB0aGlzLm5vRGF0YSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8vIERpc3RpbmN0IGZpbHRlciBvcHRpb25zIOKAlCBzdXBwbGllZCBieSB0aGUgQVBJIG92ZXIgaXRzIGZ1bGwgcmVzdWx0IHNldCBzb1xuICAvLyB0aGV5IGRvbid0IHNocmluayBhcyBmaWx0ZXJzIG5hcnJvdyB0aGUgdGFibGUuXG4gIGNzbUFwaU9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIHByb2R1Y3RBcGlPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBnZXQgY3NtT3B0aW9ucygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLmNzbUFwaU9wdGlvbnM7IH1cbiAgZ2V0IHByb2R1Y3RPcHRpb25zKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMucHJvZHVjdEFwaU9wdGlvbnM7IH1cblxuICAvLyBTdGFibGUgZmlsdGVyLXBvcG92ZXIgZGF0YSBmb3IgbGliLWZpbHRlcnMuIE1VU1QgYmUgYSBoZWxkIHByb3BlcnR5LCBub3QgYVxuICAvLyBnZXR0ZXI6IGxpYi1maWx0ZXJzIG11dGF0ZXMgdGhpcyBvYmplY3QgKHNldHMgaXNPcGVuIG9uIGEgc2VjdGlvbiB3aGVuIGl0c1xuICAvLyBpbm5lciBkcm9wZG93biBpcyBjbGlja2VkKS4gQSBnZXR0ZXIgd291bGQgaGFuZCBiYWNrIGEgZnJlc2ggYXJyYXkgZWFjaFxuICAvLyBjaGFuZ2UtZGV0ZWN0aW9uIGN5Y2xlLCB3aXBpbmcgaXNPcGVuIHNvIHRoZSBkcm9wZG93biBuZXZlciBzdGF5cyBvcGVuLlxuICAvLyBSZWJ1aWx0IG9ubHkgd2hlbiB0aGUgZGF0YSBzZXQgY2hhbmdlcyAobG9hZExpc3QpIOKAlCBzZWUgYnVpbGRGaWx0ZXJPYmplY3QuXG4gIHN1bW1hcnlGaWx0ZXJPYmplY3Q6IGFueVtdID0gW107XG5cbiAgcHJpdmF0ZSBidWlsZEZpbHRlck9iamVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1bW1hcnlGaWx0ZXJPYmplY3QgPSBbXG4gICAgICB7XG4gICAgICAgIERlc2NyaXB0aW9uOiAnQ1NNJywgdHlwZTogJ3NpbmdsZScsIGlzT3BlbjogZmFsc2UsXG4gICAgICAgIElzc3VlczogW3sgaWQ6ICdBbGwnLCB0ZXh0OiAnQWxsJywgY2hlY2tlZDogdGhpcy5jc21GaWx0ZXIgPT09ICdBbGwnIH1dXG4gICAgICAgICAgLmNvbmNhdCh0aGlzLmNzbU9wdGlvbnMubWFwKGMgPT4gKHsgaWQ6IGMsIHRleHQ6IGMsIGNoZWNrZWQ6IHRoaXMuY3NtRmlsdGVyID09PSBjIH0pKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBEZXNjcmlwdGlvbjogJ1Byb2R1Y3QnLCB0eXBlOiAnc2luZ2xlJywgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgSXNzdWVzOiBbeyBpZDogJ0FsbCcsIHRleHQ6ICdBbGwnLCBjaGVja2VkOiB0aGlzLnByb2R1Y3RGaWx0ZXIgPT09ICdBbGwnIH1dXG4gICAgICAgICAgLmNvbmNhdCh0aGlzLnByb2R1Y3RPcHRpb25zLm1hcChwID0+ICh7IGlkOiBwLCB0ZXh0OiBwLCBjaGVja2VkOiB0aGlzLnByb2R1Y3RGaWx0ZXIgPT09IHAgfSkpKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIERlc2NyaXB0aW9uOiAnVmFyaWFuY2UnLCB0eXBlOiAnc2luZ2xlJywgaXNPcGVuOiBmYWxzZSxcbiAgICAgICAgSXNzdWVzOiBbXG4gICAgICAgICAgeyBpZDogJ0FsbCcsIHRleHQ6ICdBbGwnLCBjaGVja2VkOiB0aGlzLnZhcmlhbmNlRmlsdGVyID09PSAnQWxsJyB9LFxuICAgICAgICAgIHsgaWQ6ICdncm93dGgnLCB0ZXh0OiAnR3Jvd3RoJywgY2hlY2tlZDogdGhpcy52YXJpYW5jZUZpbHRlciA9PT0gJ2dyb3d0aCcgfSxcbiAgICAgICAgICB7IGlkOiAnZGVjbGluZScsIHRleHQ6ICdEZWNsaW5lJywgY2hlY2tlZDogdGhpcy52YXJpYW5jZUZpbHRlciA9PT0gJ2RlY2xpbmUnIH0sXG4gICAgICAgICAgeyBpZDogJ2ZsYXQnLCB0ZXh0OiAnRmxhdCcsIGNoZWNrZWQ6IHRoaXMudmFyaWFuY2VGaWx0ZXIgPT09ICdmbGF0JyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgYXBwbHlTdW1tYXJ5RmlsdGVycyhldmVudDogYW55KSB7XG4gICAgLy8gbGliLWZpbHRlcnMgZW1pdHMgdGhlIGZ1bGwgc2VjdGlvbnMgYXJyYXkuIEZvciBhIHNpbmdsZS1zZWxlY3Qgc2VjdGlvblxuICAgIC8vIHRoZSBwaWNrZWQgb3B0aW9uIGlzIHN0b3JlZCBpbiBJc3N1ZXMg4oCUIGJ1dCBkZXBlbmRpbmcgb24gdGhlIGxpYidzIHBhdGhcbiAgICAvLyBpdCBtYXkgYmUgYSBzaW5nbGUgb2JqZWN0IE9SIGEgb25lLWVsZW1lbnQgYXJyYXksIGFuZCBhIG5vdC15ZXQtcGlja2VkXG4gICAgLy8gc2VjdGlvbiBpcyBhbiBlbXB0eSBhcnJheS4gTm9ybWFsaXplIGFsbCBvZiB0aG9zZSB0byB0aGUgY2hvc2VuIGlkLlxuICAgIGNvbnN0IHBpY2tJZCA9IChzZWN0aW9uOiBhbnkpOiBzdHJpbmcgPT4ge1xuICAgICAgY29uc3QgaXNzID0gc2VjdGlvbj8uSXNzdWVzO1xuICAgICAgY29uc3QgcGlja2VkID0gQXJyYXkuaXNBcnJheShpc3MpID8gaXNzWzBdIDogaXNzO1xuICAgICAgcmV0dXJuIHBpY2tlZD8uaWQgfHwgJyc7XG4gICAgfTtcbiAgICB0aGlzLmNzbUZpbHRlciA9ICdBbGwnO1xuICAgIHRoaXMucHJvZHVjdEZpbHRlciA9ICdBbGwnO1xuICAgIHRoaXMudmFyaWFuY2VGaWx0ZXIgPSAnQWxsJztcbiAgICAoZXZlbnQgfHwgW10pLmZvckVhY2goKHNlY3Rpb246IGFueSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBwaWNrSWQoc2VjdGlvbik7XG4gICAgICBpZiAoIWlkKSByZXR1cm47XG4gICAgICBpZiAoc2VjdGlvbi5EZXNjcmlwdGlvbiA9PT0gJ0NTTScpIHRoaXMuY3NtRmlsdGVyID0gaWQ7XG4gICAgICBlbHNlIGlmIChzZWN0aW9uLkRlc2NyaXB0aW9uID09PSAnUHJvZHVjdCcpIHRoaXMucHJvZHVjdEZpbHRlciA9IGlkO1xuICAgICAgZWxzZSBpZiAoc2VjdGlvbi5EZXNjcmlwdGlvbiA9PT0gJ1ZhcmlhbmNlJykgdGhpcy52YXJpYW5jZUZpbHRlciA9IGlkIGFzIGFueTtcbiAgICB9KTtcbiAgICAvLyBSZS1xdWVyeSB0aGUgQVBJIHdpdGggdGhlIG5ldyBmaWx0ZXJzLiBEbyBOT1QgcmVidWlsZCBzdW1tYXJ5RmlsdGVyT2JqZWN0XG4gICAgLy8gaGVyZSDigJQgcmVhc3NpZ25pbmcgdGhlIGFycmF5IHJlZmVyZW5jZSBkZXN5bmNzIGxpYi1maWx0ZXJzJyBpbnRlcm5hbFxuICAgIC8vIHNuYXBzaG90IGFuZCB3b3VsZCBicmVhayB0aGUgbmV4dCBBcHBseS5cbiAgICB0aGlzLmxvYWRMaXN0KCk7XG4gIH1cblxuICAvLyBTZWFyY2ggYm94IGNoYW5nZSDihpIgcmUtcXVlcnkuXG4gIG9uU2VhcmNoKCkge1xuICAgIHRoaXMubG9hZExpc3QoKTtcbiAgfVxuXG4gIC8vIENsZWFyIGFsbCBmaWx0ZXJzIGFuZCByZWxvYWQuXG4gIGNsZWFyQWxsRmlsdGVycygpIHtcbiAgICB0aGlzLmNzbUZpbHRlciA9ICdBbGwnO1xuICAgIHRoaXMucHJvZHVjdEZpbHRlciA9ICdBbGwnO1xuICAgIHRoaXMudmFyaWFuY2VGaWx0ZXIgPSAnQWxsJztcbiAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgdGhpcy5idWlsZEZpbHRlck9iamVjdCgpO1xuICAgIHRoaXMubG9hZExpc3QoKTtcbiAgfVxuXG4gIC8vIFJvd3MgY29tZSBiYWNrIGFscmVhZHkgZmlsdGVyZWQgYnkgdGhlIEFQSTsgdGhpcyBnZXR0ZXIgb25seSBhcHBsaWVzIHRoZVxuICAvLyBjbGllbnQtc2lkZSBjb2x1bW4gc29ydC5cbiAgZ2V0IGZpbHRlcmVkKCk6IGFueVtdIHtcbiAgICBsZXQgbGlzdCA9IHRoaXMucm93cztcbiAgICBpZiAodGhpcy5zb3J0S2V5KSB7XG4gICAgICBjb25zdCBrID0gdGhpcy5zb3J0S2V5O1xuICAgICAgY29uc3QgZ2V0ID0gKHI6IGFueSkgPT5cbiAgICAgICAgayA9PT0gJ3N0b3Jlc0N1cicgPyByLnN0b3Jlc1tyLnN0b3Jlcy5sZW5ndGggLSAxXSA6IHJba107XG4gICAgICBsaXN0ID0gWy4uLmxpc3RdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgeCA9IGdldChhKSwgeSA9IGdldChiKTtcbiAgICAgICAgaWYgKHggPT0gbnVsbCAmJiB5ID09IG51bGwpIHJldHVybiAwO1xuICAgICAgICBpZiAoeCA9PSBudWxsKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKHkgPT0gbnVsbCkgcmV0dXJuIC0xO1xuICAgICAgICAvLyBjbGllbnRJZCBpcyBhIHN0cmluZyBidXQgbXVzdCBzb3J0IG51bWVyaWNhbGx5ICgnMjAnIGJlZm9yZSAnMTAwJykuXG4gICAgICAgIGlmIChrID09PSAnY2xpZW50SWQnKSByZXR1cm4gdGhpcy5zb3J0RGlyICogKE51bWJlcih4KSAtIE51bWJlcih5KSk7XG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ3N0cmluZycpIHJldHVybiB0aGlzLnNvcnREaXIgKiB4LmxvY2FsZUNvbXBhcmUoeSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnREaXIgKiAoeCAtIHkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgc29ydEJ5KGtleTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuc29ydEtleSA9PT0ga2V5KSB7XG4gICAgICB0aGlzLnNvcnREaXIgPSB0aGlzLnNvcnREaXIgPT09IDEgPyAtMSA6IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc29ydEtleSA9IGtleTtcbiAgICAgIHRoaXMuc29ydERpciA9IChrZXkgPT09ICdjbGllbnROYW1lJyB8fCBrZXkgPT09ICdjbGllbnRJZCcpID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhY3RpdmVGaWx0ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5jc21GaWx0ZXIgIT09ICdBbGwnID8gMSA6IDApICtcbiAgICAgICAgICAgKHRoaXMucHJvZHVjdEZpbHRlciAhPT0gJ0FsbCcgPyAxIDogMCkgK1xuICAgICAgICAgICAodGhpcy52YXJpYW5jZUZpbHRlciAhPT0gJ0FsbCcgPyAxIDogMCk7XG4gIH1cblxuICBjbGVhckZpbHRlcnMoKSB7XG4gICAgdGhpcy5jc21GaWx0ZXIgPSAnQWxsJztcbiAgICB0aGlzLnByb2R1Y3RGaWx0ZXIgPSAnQWxsJztcbiAgICB0aGlzLnZhcmlhbmNlRmlsdGVyID0gJ0FsbCc7XG4gIH1cblxuICAvLyBGb290ZXIgdG90YWxzIG92ZXIgdGhlIGZpbHRlcmVkIHNldC5cbiAgZ2V0IHRvdGFscygpIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5maWx0ZXJlZDtcbiAgICBjb25zdCBzdG9yZVRvdGFscyA9IHRoaXMubW9udGhzLm1hcCgoXywgaSkgPT5cbiAgICAgIGxpc3QucmVkdWNlKChhLCByKSA9PiBhICsgKHIuc3RvcmVzW2ldIHx8IDApLCAwKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0b3JlVG90YWxzLFxuICAgICAgcmV2UHJldjogbGlzdC5yZWR1Y2UoKGEsIHIpID0+IGEgKyAoci5yZXZQcmV2IHx8IDApLCAwKSxcbiAgICAgIHJldkN1cjogbGlzdC5yZWR1Y2UoKGEsIHIpID0+IGEgKyAoci5yZXZDdXIgfHwgMCksIDApLFxuICAgICAgaW5zdGFsbGF0aW9uOiBsaXN0LnJlZHVjZSgoYSwgcikgPT4gYSArIChyLmluc3RhbGxhdGlvbkZlZSB8fCAwKSwgMCksXG4gICAgICBjb3VudDogbGlzdC5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIHByb2R1Y3RQaWxsQ2xhc3MocDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsbyA9IChwIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChsby5pbmNsdWRlcygndHJhZmZpYycpKSByZXR1cm4gJ3BpbGwgcGlsbC1ibHVlJztcbiAgICBpZiAobG8uaW5jbHVkZXMoJ3pvbmUnKSkgcmV0dXJuICdwaWxsIHBpbGwtZ3JlZW4nO1xuICAgIGlmIChsby5pbmNsdWRlcygndHJheCcpKSByZXR1cm4gJ3BpbGwgcGlsbC1hbWJlcic7XG4gICAgcmV0dXJuICdwaWxsIHBpbGwtZ3JheSc7XG4gIH1cblxuICBvbkV4cG9ydCgpIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5maWx0ZXJlZDtcbiAgICBpZiAoIWxpc3QubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ05vdGhpbmcgdG8gZXhwb3J0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENvZXJjZSBibGFuay91bmRlZmluZWQgbnVtZXJpYyBjZWxscyB0byAwIHNvIHRoZSBleHBvcnQgbmV2ZXIgaGFzIGdhcHMuXG4gICAgY29uc3QgbnVtID0gKHY6IGFueSkgPT4gKHYgPT0gbnVsbCB8fCB2ID09PSAnJyB8fCBOdW1iZXIuaXNOYU4oTnVtYmVyKHYpKSA/IDAgOiBOdW1iZXIodikpO1xuICAgIGNvbnN0IHJvd3MgPSBsaXN0Lm1hcChyID0+IHtcbiAgICAgIGNvbnN0IG91dDogYW55ID0ge1xuICAgICAgICAnQ2xpZW50IElEJzogci5jbGllbnRJZCxcbiAgICAgICAgJ0NsaWVudCBOYW1lJzogci5jbGllbnROYW1lLFxuICAgICAgICAnUmVnaXN0ZXJlZCBFbnRpdHknOiByLnJlZ2lzdGVyZWRFbnRpdHksXG4gICAgICAgICdTdGF0dXMnOiByLnN0YXR1cyxcbiAgICAgICAgJ1Byb2R1Y3QnOiAoci5wcm9kdWN0cyB8fCBbXSkuam9pbignICsgJyksXG4gICAgICAgICdDU00nOiByLmNzbSxcbiAgICAgIH07XG4gICAgICB0aGlzLm1vbnRocy5mb3JFYWNoKChtLCBpKSA9PiBvdXRbYFN0b3JlcyAke20ubGFiZWx9YF0gPSBudW0oci5zdG9yZXM/LltpXSkpO1xuICAgICAgb3V0WydQcmljaW5nIEN1cnJlbmN5J10gPSByLmN1cnJlbmN5ID09PSAnZG9sbGFyJyA/ICdVU0QnIDogJ0lOUic7XG4gICAgICBvdXRbYFByaWNlL1N0b3JlYF0gPSBudW0oci5wcmljZVBlclN0b3JlKTtcbiAgICAgIG91dFtgUmV2ZW51ZSAke3RoaXMubW9udGhzWzNdPy5sYWJlbH1gXSA9IG51bShyLnJldlByZXYpO1xuICAgICAgb3V0W2BSZXZlbnVlICR7dGhpcy5tb250aHNbNF0/LmxhYmVsfWBdID0gbnVtKHIucmV2Q3VyKTtcbiAgICAgIG91dFsnVmFyaWFuY2UgJSddID0gbnVtKHIudmFyaWFuY2UpO1xuICAgICAgb3V0WydJbnN0YWxsYXRpb24gRmVlJ10gPSBudW0oci5pbnN0YWxsYXRpb25GZWUpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9KTtcblxuICAgIC8vIEFwcGVuZCBhIFRvdGFsIHJvdyBzdW1taW5nIGV2ZXJ5IG51bWVyaWMgY29sdW1uLiBQZXItcm93IHJhdGVzXG4gICAgLy8gKFByaWNlL1N0b3JlLCBWYXJpYW5jZSAlKSBhcmVuJ3QgYWRkaXRpdmUsIHNvIHRoZXkncmUgbGVmdCBibGFuay5cbiAgICBjb25zdCBzdW0gPSAoa2V5OiBzdHJpbmcpID0+IHJvd3MucmVkdWNlKChhLCByKSA9PiBhICsgKE51bWJlcihyW2tleV0pIHx8IDApLCAwKTtcbiAgICBjb25zdCB0b3RhbFJvdzogYW55ID0ge1xuICAgICAgJ0NsaWVudCBJRCc6ICcnLFxuICAgICAgJ0NsaWVudCBOYW1lJzogJ1RvdGFsJyxcbiAgICAgICdSZWdpc3RlcmVkIEVudGl0eSc6ICcnLFxuICAgICAgJ1N0YXR1cyc6ICcnLFxuICAgICAgJ1Byb2R1Y3QnOiAnJyxcbiAgICAgICdDU00nOiAnJyxcbiAgICB9O1xuICAgIHRoaXMubW9udGhzLmZvckVhY2goKG0pID0+IHRvdGFsUm93W2BTdG9yZXMgJHttLmxhYmVsfWBdID0gc3VtKGBTdG9yZXMgJHttLmxhYmVsfWApKTtcbiAgICB0b3RhbFJvd1snUHJpY2luZyBDdXJyZW5jeSddID0gJyc7XG4gICAgdG90YWxSb3dbYFByaWNlL1N0b3JlYF0gPSAnJztcbiAgICB0b3RhbFJvd1tgUmV2ZW51ZSAke3RoaXMubW9udGhzWzNdPy5sYWJlbH1gXSA9IHN1bShgUmV2ZW51ZSAke3RoaXMubW9udGhzWzNdPy5sYWJlbH1gKTtcbiAgICB0b3RhbFJvd1tgUmV2ZW51ZSAke3RoaXMubW9udGhzWzRdPy5sYWJlbH1gXSA9IHN1bShgUmV2ZW51ZSAke3RoaXMubW9udGhzWzRdPy5sYWJlbH1gKTtcbiAgICB0b3RhbFJvd1snVmFyaWFuY2UgJSddID0gJyc7XG4gICAgdG90YWxSb3dbJ0luc3RhbGxhdGlvbiBGZWUnXSA9IHN1bSgnSW5zdGFsbGF0aW9uIEZlZScpO1xuICAgIHJvd3MucHVzaCh0b3RhbFJvdyk7XG5cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmV4cG9ydEFzRXhjZWxGaWxlKHJvd3MsICdiaWxsaW5nLXN1bW1hcnknKTtcbiAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdChgRXhwb3J0ZWQgJHtsaXN0Lmxlbmd0aH0gY2xpZW50c2ApO1xuICB9XG59IiwiPGRpdiBjbGFzcz1cInB4LTQgcGItNFwiPlxuICAgIDwhLS0gSGVhZGVyOiBzZWFyY2ggKyBmaWx0ZXIgKyBleHBvcnQgLS0+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtNCBmbGV4LXdyYXAgZ2FwLTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJpbGxpbmdoZWFkZXJcIj5CaWxsaW5nIFN1bW1hcnk8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gaW52b2ljZXNlYXJjaCBzdmctaWNvbi0xIHBvc2l0aW9uLWFic29sdXRlIG10LTYgbXMtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IG9wYWNpdHk9XCIwLjVcIiB4PVwiMTcuMDM2NVwiIHk9XCIxNS4xMjIzXCIgd2lkdGg9XCI4LjE1NTQ2XCIgaGVpZ2h0PVwiMlwiIHJ4PVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKDQ1IDE3LjAzNjUgMTUuMTIyMylcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9yZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMSAxOUM2LjU1NTU2IDE5IDMgMTUuNDQ0NCAzIDExQzMgNi41NTU1NiA2LjU1NTU2IDMgMTEgM0MxNS40NDQ0IDMgMTkgNi41NTU1NiAxOSAxMUMxOSAxNS40NDQ0IDE1LjQ0NDQgMTkgMTEgMTlaTTExIDVDNy41MzMzMyA1IDUgNy41MzMzMyA1IDExQzUgMTQuNDY2NyA3LjUzMzMzIDE3IDExIDE3QzE0LjQ2NjcgMTcgMTcgMTQuNDY2NyAxNyAxMUMxNyA3LjUzMzMzIDE0LjQ2NjcgNSAxMSA1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cInF1ZXJ5XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBpbnZvaWNlc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggY2xpZW50IC8gZW50aXR5IC8gSUQuLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VhcmNoKClcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIFJlbmRlciBvbmx5IG9uY2Ugb3B0aW9ucyBhcmUgYnVpbHQg4oCUIGxpYi1maWx0ZXJzIHNuYXBzaG90cyBpdHNcbiAgICAgICAgICAgICAgICAgZGF0YU9iamVjdCBpbiBuZ09uSW5pdCBhbmQgbmV2ZXIgcmUtcmVhZHMgaXQsIHNvIGl0IG11c3RcbiAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZSBhZ2FpbnN0IHRoZSBwb3B1bGF0ZWQgYXJyYXkuIC0tPlxuICAgICAgICAgICAgPGxpYi1maWx0ZXJzICpuZ0lmPVwic3VtbWFyeUZpbHRlck9iamVjdC5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFtkYXRhT2JqZWN0XT1cInN1bW1hcnlGaWx0ZXJPYmplY3RcIiAoYXBwbGllZEZpbHRlcnMpPVwiYXBwbHlTdW1tYXJ5RmlsdGVycygkZXZlbnQpXCI+PC9saWItZmlsdGVycz5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLW91dGxpbmUgYnRuIGFsaWduLWl0ZW1zLWVuZCB0ZXh0LW5vd3JhcCBpbnZoZWFkZXJcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZmlsdGVyZWQubGVuZ3RoXCIgKGNsaWNrKT1cIm9uRXhwb3J0KClcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+RXhwb3J0PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBMb2FkaW5nIHNoaW1tZXIgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIG10LTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBFbXB0eSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmcgJiYgbm9EYXRhXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjIHctMjVcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGEuc3ZnXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFN1bW1hcnkgdGFibGUg4oCUIHN0aWNreSB0d28tcm93IGhlYWRlciArIHN0aWNreSB0b3RhbHMgZm9vdGVyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiAhbm9EYXRhXCIgY2xhc3M9XCJzdW0tc2Nyb2xsIG10LTNcIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgc3VtLXRhYmxlIHRleHQtbm93cmFwIG1iLTBcIj5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdjbGllbnRJZCcpXCI+Q2xpZW50IElEXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAnY2xpZW50SWQnXCI+e3sgc29ydEtleSA9PT0gJ2NsaWVudElkJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCIgY2xhc3M9XCJzb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ2NsaWVudE5hbWUnKVwiPkNsaWVudCBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAnY2xpZW50TmFtZSdcIj57eyBzb3J0S2V5ID09PSAnY2xpZW50TmFtZScgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiPlJlZ2lzdGVyZWQgRW50aXR5PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCI+U3RhdHVzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCI+UHJvZHVjdDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiPkNTTTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBbYXR0ci5jb2xzcGFuXT1cIm1vbnRocy5sZW5ndGhcIiBjbGFzcz1cImdyb3VwLWhlYWRcIj5TdG9yZSBDb3VudDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdwcmljZVBlclN0b3JlJylcIj5QcmljZSAvIFN0b3JlXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAncHJpY2VQZXJTdG9yZSdcIj57eyBzb3J0S2V5ID09PSAncHJpY2VQZXJTdG9yZScgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiMlwiIGNsYXNzPVwiZ3JvdXAtaGVhZFwiPlJldmVudWU8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggcm93c3Bhbj1cIjJcIiBjbGFzcz1cInNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgndmFyaWFuY2UnKVwiPlZhcmlhbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAndmFyaWFuY2UnXCI+e3sgc29ydEtleSA9PT0gJ3ZhcmlhbmNlJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCIgY2xhc3M9XCJzb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ2luc3RhbGxhdGlvbkZlZScpXCI+SW5zdGFsbGF0aW9uIEZlZVxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ2luc3RhbGxhdGlvbkZlZSdcIj57eyBzb3J0S2V5ID09PSAnaW5zdGFsbGF0aW9uRmVlJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBtIG9mIG1vbnRoczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwic3ViLWhlYWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNvcnRhYmxlXT1cImkgPT09IG1vbnRocy5sZW5ndGggLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpID09PSBtb250aHMubGVuZ3RoIC0gMSA/IHNvcnRCeSgnc3RvcmVzQ3VyJykgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBtLmxhYmVsIH19PHNwYW4gKm5nSWY9XCJpID09PSBtb250aHMubGVuZ3RoIC0gMVwiIGNsYXNzPVwiYXJyXCIgW2NsYXNzLm9uXT1cInNvcnRLZXkgPT09ICdzdG9yZXNDdXInXCI+e3sgc29ydEtleSA9PT0gJ3N0b3Jlc0N1cicgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInN1Yi1oZWFkIHNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgncmV2UHJldicpXCI+e3sgbW9udGhzWzNdLmxhYmVsIH19PHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ3JldlByZXYnXCI+e3sgc29ydEtleSA9PT0gJ3JldlByZXYnICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInN1Yi1oZWFkIHNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgncmV2Q3VyJylcIj57eyBtb250aHNbNF0ubGFiZWwgfX08c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAncmV2Q3VyJ1wiPnt7IHNvcnRLZXkgPT09ICdyZXZDdXInICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPjwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByIG9mIGZpbHRlcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57eyByLmNsaWVudElkIHx8ICfigJQnIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+e3sgci5jbGllbnROYW1lIHwgdXBwZXJjYXNlIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbnRpdHlcIiBbdGl0bGVdPVwiKHIucmVnaXN0ZXJlZEVudGl0aWVzICYmIHIucmVnaXN0ZXJlZEVudGl0aWVzLmxlbmd0aCA/IHIucmVnaXN0ZXJlZEVudGl0aWVzLmpvaW4oJ1xcbicpIDogci5yZWdpc3RlcmVkRW50aXR5KSB8fCAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHIucmVnaXN0ZXJlZEVudGl0eSB8fCAn4oCUJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyLnJlZ2lzdGVyZWRFbnRpdGllcz8ubGVuZ3RoID4gMVwiIGNsYXNzPVwiZW50aXR5LW1vcmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJyLnJlZ2lzdGVyZWRFbnRpdGllcy5qb2luKCdcXG4nKVwiPit7eyByLnJlZ2lzdGVyZWRFbnRpdGllcy5sZW5ndGggLSAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9XCJwaWxsXCIgW25nQ2xhc3NdPVwici5zdGF0dXMgPT09ICdQYWlkJyA/ICdwaWxsLWdyZWVuJyA6ICdwaWxsLWFtYmVyJ1wiPnt7IHIuc3RhdHVzIH19PC9zcGFuPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBwIG9mIHIucHJvZHVjdHNcIiBbbmdDbGFzc109XCJwcm9kdWN0UGlsbENsYXNzKHApXCIgY2xhc3M9XCJtZS0xXCI+e3sgcCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXIucHJvZHVjdHM/Lmxlbmd0aFwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPuKAlDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHIuY3NtIHx8ICfigJQnIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBzIG9mIHIuc3RvcmVzOyBsZXQgaSA9IGluZGV4XCIgW2NsYXNzLmZ3LWJvbGRdPVwiaSA9PT0gci5zdG9yZXMubGVuZ3RoIC0gMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgcyA9PSBudWxsID8gJ+KAlCcgOiAocyB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBbdGl0bGVdPVwici5jdXJyZW5jeSA9PT0gJ2RvbGxhcicgPyAoJ1VTRCBwcmljaW5nIOKAlCByZXZlbnVlIGNvbnZlcnRlZCB0byDigrkgYXQgdG9kYXlcXCdzIHJhdGUgKCcgKyAodXNkUmF0ZSB8IG51bWJlcjonMS4yLTInKSArICcpJykgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgci5wcmljZVBlclN0b3JlID09IG51bGwgPyAn4oCUJyA6IChyLmN1cnJlbmN5ID09PSAnZG9sbGFyJyA/ICckJyA6ICfigrknKSArIChyLnByaWNlUGVyU3RvcmUgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+e3sgci5yZXZQcmV2ID09IG51bGwgPyAn4oCUJyA6ICfigrknICsgKHIucmV2UHJldiB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyByLnJldkN1ciA9PSBudWxsID8gJ+KAlCcgOiAn4oK5JyArIChyLnJldkN1ciB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInIucmV2Q3VyRXN0aW1hdGVkXCIgY2xhc3M9XCJlc3QtY2hpcCBtcy0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkVzdGltYXRlZDogY3VycmVudCBzdG9yZSBjb3VudCDDlyBiYXNlIHByaWNlIOKAlCByZXBsYWNlZCBieSB0aGUgaW52b2ljZSBhbW91bnQgb25jZSBnZW5lcmF0ZWRcIj5lc3QuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInIudmFyaWFuY2UgIT0gbnVsbFwiIGNsYXNzPVwiZnctc2VtaWJvbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXN1Y2Nlc3NdPVwici52YXJpYW5jZSA+IDBcIiBbY2xhc3MudGV4dC1kYW5nZXJdPVwici52YXJpYW5jZSA8IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIobW9udGhzWzNdLmxhYmVsICsgJyAnICsgKHIucmV2UHJldiA9PSBudWxsID8gJ+KAlCcgOiAn4oK5JyArIChyLnJldlByZXYgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nKSkgKyAnIOKGkiAnICsgbW9udGhzWzRdLmxhYmVsICsgJyAnICsgKHIucmV2Q3VyID09IG51bGwgPyAn4oCUJyA6ICfigrknICsgKHIucmV2Q3VyIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHIudmFyaWFuY2UgPiAwID8gJysnIDogJycgfX17eyByLnZhcmlhbmNlIH19JVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyLnZhcmlhbmNlID09IG51bGxcIiBjbGFzcz1cInRleHQtbXV0ZWRcIj7igJQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57eyByLmluc3RhbGxhdGlvbkZlZSA9PSBudWxsID8gJ+KAlCcgOiAn4oK5JyArIChyLmluc3RhbGxhdGlvbkZlZSB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpIH19PC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0ciAqbmdJZj1cIiFmaWx0ZXJlZC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiMTEgKyBtb250aHMubGVuZ3RoXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIHB5LTVcIj5ObyBjbGllbnRzIG1hdGNoLjwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8dGZvb3Q+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjZcIj5Ub3RhbCDCtyB7eyB0b3RhbHMuY291bnQgfX0gY2xpZW50czwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdGb3I9XCJsZXQgdCBvZiB0b3RhbHMuc3RvcmVUb3RhbHNcIj48c3Ryb25nPnt7IHQgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD48c3Ryb25nPuKCuXt7IHRvdGFscy5yZXZQcmV2IHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD48c3Ryb25nPuKCuXt7IHRvdGFscy5yZXZDdXIgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD48c3Ryb25nPuKCuXt7IHRvdGFscy5pbnN0YWxsYXRpb24gfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90Zm9vdD5cbiAgICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLXN1bW1hcnkvYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iaWxsaW5nLXN1bW1hcnkvYmlsbGluZy1zdW1tYXJ5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBSTFDLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsdUVBQXVFO0FBQ3ZFLDhDQUE4QztBQU05QyxNQUFNLE9BQU8sdUJBQXVCO0lBdUJ4QjtJQUNBO0lBQ0E7SUF4QlYsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNmLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFZixNQUFNLEdBQXFDLEVBQUUsQ0FBQztJQUM5QyxJQUFJLEdBQVUsRUFBRSxDQUFDO0lBQ2pCLHVFQUF1RTtJQUN2RSxPQUFPLEdBQWtCLElBQUksQ0FBQztJQUU5QixXQUFXO0lBQ1gsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLGNBQWMsR0FBMEMsS0FBSyxDQUFDO0lBRTlELDZEQUE2RDtJQUM3RCxPQUFPLEdBQWtCLFdBQVcsQ0FBQztJQUNyQyxPQUFPLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFFSixRQUFRLEdBQUcsSUFBSSxPQUFP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QU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDM0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxPQUFPO1lBQ0wsV0FBVztZQUNYLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0QsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3RCxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0QsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMs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Q0FBQyxDQUFDO0lBQ2hFLENBQUM7d0dBOVJVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDJEQ2RwQyxzMlpBNEtNOzs0RkQ5Sk8sdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuaW1wb3J0IHsgQmlsbGluZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9iaWxsaW5nLnNlcnZpY2UnO1xuXG4vLyBCaWxsaW5nIFN1bW1hcnkgdGFiIChwcm90b3R5cGUgcGFyaXR5KTogb25lIHJvdyBwZXIgY2xpZW50IOKAlCBtb250aGx5IHN0b3JlXG4vLyBjb3VudHMgKGRhaWx5UHJpY2luZyksIHJldmVudWUgZm9yIHRoZSBsYXN0IHR3byBtb250aHMgd2l0aCB2YXJpYW5jZSwgcHJpY2Vcbi8vIHBlciBzdG9yZSBhbmQgaW5zdGFsbGF0aW9uIGZlZSAoaW52b2ljZXMpLiBEYXRhIGFycml2ZXMgaW4gb25lIGNhbGw7XG4vLyBzZWFyY2ggLyBmaWx0ZXIgLyBzb3J0IGFsbCBydW4gY2xpZW50LXNpZGUuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYmlsbGluZy1zdW1tYXJ5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JpbGxpbmctc3VtbWFyeS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9iaWxsaW5nLXN1bW1hcnkuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIEJpbGxpbmdTdW1tYXJ5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBsb2FkaW5nID0gdHJ1ZTtcbiAgbm9EYXRhID0gZmFsc2U7XG5cbiAgbW9udGhzOiB7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtdO1xuICByb3dzOiBhbnlbXSA9IFtdO1xuICAvLyBUb2RheSdzIFVTRC0+SU5SIHJhdGUgdXNlZCBieSB0aGUgYmFja2VuZCBmb3IgZG9sbGFyLXByaWNlZCBjbGllbnRzLlxuICB1c2RSYXRlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBGaWx0ZXJzLlxuICBxdWVyeSA9ICcnO1xuICBmaWx0ZXJPcGVuID0gZmFsc2U7XG4gIGNzbUZpbHRlciA9ICdBbGwnO1xuICBwcm9kdWN0RmlsdGVyID0gJ0FsbCc7XG4gIHZhcmlhbmNlRmlsdGVyOiAnQWxsJyB8ICdncm93dGgnIHwgJ2RlY2xpbmUnIHwgJ2ZsYXQnID0gJ0FsbCc7XG5cbiAgLy8gU29ydGluZy4gRGVmYXVsdDogaGlnaGVzdCBjdXJyZW50LW1vbnRoIHN0b3JlIGNvdW50IGZpcnN0LlxuICBzb3J0S2V5OiBzdHJpbmcgfCBudWxsID0gJ3N0b3Jlc0N1cic7XG4gIHNvcnREaXI6IDEgfCAtMSA9IC0xO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIC8vIEZ1bGwgcmVzdWx0LXNldCBzaXplIChiZWZvcmUgZmlsdGVycykg4oCUIGZvciB0aGUgXCJOIG9mIE1cIiBoaW50IGFuZCB0byBrbm93XG4gIC8vIHdoZW4gZmlsdGVycyBhY3R1YWxseSBuYXJyb3dlZCBhbnl0aGluZy5cbiAgdG90YWxDb3VudCA9IDA7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkTGlzdCgpO1xuICB9XG5cbiAgLy8gU2VydmVyLXNpZGUgbG9hZDogZmlsdGVycyBhcmUgc2VudCB0byB0aGUgQVBJIGFuZCBpdCByZXR1cm5zIG9ubHkgbWF0Y2hpbmdcbiAgLy8gcm93cy4gQ2FsbGVkIG9uIGZpcnN0IGxvYWQgYW5kIHdoZW5ldmVyIGEgZmlsdGVyIG9yIHNlYXJjaCBjaGFuZ2VzLlxuICBsb2FkTGlzdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IGZpbHRlcnMgPSB7XG4gICAgICBjc206IHRoaXMuY3NtRmlsdGVyLFxuICAgICAgcHJvZHVjdDogdGhpcy5wcm9kdWN0RmlsdGVyLFxuICAgICAgdmFyaWFuY2U6IHRoaXMudmFyaWFuY2VGaWx0ZXIsXG4gICAgICBzZWFyY2g6IHRoaXMucXVlcnksXG4gICAgfTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmJpbGxpbmdTdW1tYXJ5KGZpbHRlcnMpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb250aHMgPSByZXM/LmRhdGE/Lm1vbnRocyB8fCBbXTtcbiAgICAgICAgdGhpcy5yb3dzID0gcmVzPy5kYXRhPy5kYXRhIHx8IFtdO1xuICAgICAgICB0aGlzLnVzZFJhdGUgPSByZXM/LmRhdGE/LnVzZFJhdGUgfHwgbnVsbDtcbiAgICAgICAgdGhpcy50b3RhbENvdW50ID0gcmVzPy5kYXRhPy50b3RhbCA/PyB0aGlzLnJvd3MubGVuZ3RoO1xuICAgICAgICAvLyBPcHRpb24gbGlzdHMgZm9yIHRoZSBwb3BvdmVyIGNvbWUgZnJvbSB0aGUgQVBJJ3MgZnVsbCByZXN1bHQgc2V0IHNvXG4gICAgICAgIC8vIHRoZXkgZG9uJ3Qgc2hyaW5rIGFzIGZpbHRlcnMgbmFycm93IHRoZSB0YWJsZS5cbiAgICAgICAgdGhpcy5jc21BcGlPcHRpb25zID0gcmVzPy5kYXRhPy5jc21PcHRpb25zIHx8IHRoaXMuY3NtQXBpT3B0aW9ucztcbiAgICAgICAgdGhpcy5wcm9kdWN0QXBpT3B0aW9ucyA9IHJlcz8uZGF0YT8ucHJvZHVjdE9wdGlvbnMgfHwgdGhpcy5wcm9kdWN0QXBpT3B0aW9ucztcbiAgICAgICAgdGhpcy5ub0RhdGEgPSB0aGlzLnJvd3MubGVuZ3RoID09PSAwO1xuICAgICAgICAvLyBCdWlsZCB0aGUgcG9wb3ZlciBvcHRpb25zIE9OQ0UgKHdoZW4gb3B0aW9uIGxpc3RzIGZpcnN0IGFycml2ZSkuXG4gICAgICAgIC8vIFJlYnVpbGRpbmcgdGhlIGFycmF5IHJlZmVyZW5jZSBvbiBldmVyeSBsb2FkIGRlc3luY3MgbGliLWZpbHRlcnMnXG4gICAgICAgIC8vIGludGVybmFsIHNuYXBzaG90ICh0YWtlbiBpbiBpdHMgbmdPbkluaXQpLCB3aGljaCBzaWxlbnRseSBkcm9wcyB0aGVcbiAgICAgICAgLy8gc2VsZWN0aW9uIG9uIEFwcGx5LlxuICAgICAgICBpZiAoIXRoaXMuc3VtbWFyeUZpbHRlck9iamVjdC5sZW5ndGggJiYgKHRoaXMuY3NtQXBpT3B0aW9ucy5sZW5ndGggfHwgdGhpcy5wcm9kdWN0QXBpT3B0aW9ucy5sZW5ndGgpKSB7XG4gICAgICAgICAgdGhpcy5idWlsZEZpbHRlck9iamVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICAgICAgdGhpcy5ub0RhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvLyBEaXN0aW5jdCBmaWx0ZXIgb3B0aW9ucyDigJQgc3VwcGxpZWQgYnkgdGhlIEFQSSBvdmVyIGl0cyBmdWxsIHJlc3VsdCBzZXQgc29cbiAgLy8gdGhleSBkb24ndCBzaHJpbmsgYXMgZmlsdGVycyBuYXJyb3cgdGhlIHRhYmxlLlxuICBjc21BcGlPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBwcm9kdWN0QXBpT3B0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgZ2V0IGNzbU9wdGlvbnMoKTogc3RyaW5nW10geyByZXR1cm4gdGhpcy5jc21BcGlPcHRpb25zOyB9XG4gIGdldCBwcm9kdWN0T3B0aW9ucygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLnByb2R1Y3RBcGlPcHRpb25zOyB9XG5cbiAgLy8gU3RhYmxlIGZpbHRlci1wb3BvdmVyIGRhdGEgZm9yIGxpYi1maWx0ZXJzLiBNVVNUIGJlIGEgaGVsZCBwcm9wZXJ0eSwgbm90IGFcbiAgLy8gZ2V0dGVyOiBsaWItZmlsdGVycyBtdXRhdGVzIHRoaXMgb2JqZWN0IChzZXRzIGlzT3BlbiBvbiBhIHNlY3Rpb24gd2hlbiBpdHNcbiAgLy8gaW5uZXIgZHJvcGRvd24gaXMgY2xpY2tlZCkuIEEgZ2V0dGVyIHdvdWxkIGhhbmQgYmFjayBhIGZyZXNoIGFycmF5IGVhY2hcbiAgLy8gY2hhbmdlLWRldGVjdGlvbiBjeWNsZSwgd2lwaW5nIGlzT3BlbiBzbyB0aGUgZHJvcGRvd24gbmV2ZXIgc3RheXMgb3Blbi5cbiAgLy8gUmVidWlsdCBvbmx5IHdoZW4gdGhlIGRhdGEgc2V0IGNoYW5nZXMgKGxvYWRMaXN0KSDigJQgc2VlIGJ1aWxkRmlsdGVyT2JqZWN0LlxuICBzdW1tYXJ5RmlsdGVyT2JqZWN0OiBhbnlbXSA9IFtdO1xuXG4gIHByaXZhdGUgYnVpbGRGaWx0ZXJPYmplY3QoKTogdm9pZCB7XG4gICAgdGhpcy5zdW1tYXJ5RmlsdGVyT2JqZWN0ID0gW1xuICAgICAge1xuICAgICAgICBEZXNjcmlwdGlvbjogJ0NTTScsIHR5cGU6ICdzaW5nbGUnLCBpc09wZW46IGZhbHNlLFxuICAgICAgICBJc3N1ZXM6IFt7IGlkOiAnQWxsJywgdGV4dDogJ0FsbCcsIGNoZWNrZWQ6IHRoaXMuY3NtRmlsdGVyID09PSAnQWxsJyB9XVxuICAgICAgICAgIC5jb25jYXQodGhpcy5jc21PcHRpb25zLm1hcChjID0+ICh7IGlkOiBjLCB0ZXh0OiBjLCBjaGVja2VkOiB0aGlzLmNzbUZpbHRlciA9PT0gYyB9KSkpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgRGVzY3JpcHRpb246ICdQcm9kdWN0JywgdHlwZTogJ3NpbmdsZScsIGlzT3BlbjogZmFsc2UsXG4gICAgICAgIElzc3VlczogW3sgaWQ6ICdBbGwnLCB0ZXh0OiAnQWxsJywgY2hlY2tlZDogdGhpcy5wcm9kdWN0RmlsdGVyID09PSAnQWxsJyB9XVxuICAgICAgICAgIC5jb25jYXQodGhpcy5wcm9kdWN0T3B0aW9ucy5tYXAocCA9PiAoeyBpZDogcCwgdGV4dDogcCwgY2hlY2tlZDogdGhpcy5wcm9kdWN0RmlsdGVyID09PSBwIH0pKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBEZXNjcmlwdGlvbjogJ1ZhcmlhbmNlJywgdHlwZTogJ3NpbmdsZScsIGlzT3BlbjogZmFsc2UsXG4gICAgICAgIElzc3VlczogW1xuICAgICAgICAgIHsgaWQ6ICdBbGwnLCB0ZXh0OiAnQWxsJywgY2hlY2tlZDogdGhpcy52YXJpYW5jZUZpbHRlciA9PT0gJ0FsbCcgfSxcbiAgICAgICAgICB7IGlkOiAnZ3Jvd3RoJywgdGV4dDogJ0dyb3d0aCcsIGNoZWNrZWQ6IHRoaXMudmFyaWFuY2VGaWx0ZXIgPT09ICdncm93dGgnIH0sXG4gICAgICAgICAgeyBpZDogJ2RlY2xpbmUnLCB0ZXh0OiAnRGVjbGluZScsIGNoZWNrZWQ6IHRoaXMudmFyaWFuY2VGaWx0ZXIgPT09ICdkZWNsaW5lJyB9LFxuICAgICAgICAgIHsgaWQ6ICdmbGF0JywgdGV4dDogJ0ZsYXQnLCBjaGVja2VkOiB0aGlzLnZhcmlhbmNlRmlsdGVyID09PSAnZmxhdCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIGFwcGx5U3VtbWFyeUZpbHRlcnMoZXZlbnQ6IGFueSkge1xuICAgIC8vIGxpYi1maWx0ZXJzIGVtaXRzIHRoZSBmdWxsIHNlY3Rpb25zIGFycmF5LiBGb3IgYSBzaW5nbGUtc2VsZWN0IHNlY3Rpb25cbiAgICAvLyB0aGUgcGlja2VkIG9wdGlvbiBpcyBzdG9yZWQgaW4gSXNzdWVzIOKAlCBidXQgZGVwZW5kaW5nIG9uIHRoZSBsaWIncyBwYXRoXG4gICAgLy8gaXQgbWF5IGJlIGEgc2luZ2xlIG9iamVjdCBPUiBhIG9uZS1lbGVtZW50IGFycmF5LCBhbmQgYSBub3QteWV0LXBpY2tlZFxuICAgIC8vIHNlY3Rpb24gaXMgYW4gZW1wdHkgYXJyYXkuIE5vcm1hbGl6ZSBhbGwgb2YgdGhvc2UgdG8gdGhlIGNob3NlbiBpZC5cbiAgICBjb25zdCBwaWNrSWQgPSAoc2VjdGlvbjogYW55KTogc3RyaW5nID0+IHtcbiAgICAgIGNvbnN0IGlzcyA9IHNlY3Rpb24/Lklzc3VlcztcbiAgICAgIGNvbnN0IHBpY2tlZCA9IEFycmF5LmlzQXJyYXkoaXNzKSA/IGlzc1swXSA6IGlzcztcbiAgICAgIHJldHVybiBwaWNrZWQ/LmlkIHx8ICcnO1xuICAgIH07XG4gICAgdGhpcy5jc21GaWx0ZXIgPSAnQWxsJztcbiAgICB0aGlzLnByb2R1Y3RGaWx0ZXIgPSAnQWxsJztcbiAgICB0aGlzLnZhcmlhbmNlRmlsdGVyID0gJ0FsbCc7XG4gICAgKGV2ZW50IHx8IFtdKS5mb3JFYWNoKChzZWN0aW9uOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gcGlja0lkKHNlY3Rpb24pO1xuICAgICAgaWYgKCFpZCkgcmV0dXJuO1xuICAgICAgaWYgKHNlY3Rpb24uRGVzY3JpcHRpb24gPT09ICdDU00nKSB0aGlzLmNzbUZpbHRlciA9IGlkO1xuICAgICAgZWxzZSBpZiAoc2VjdGlvbi5EZXNjcmlwdGlvbiA9PT0gJ1Byb2R1Y3QnKSB0aGlzLnByb2R1Y3RGaWx0ZXIgPSBpZDtcbiAgICAgIGVsc2UgaWYgKHNlY3Rpb24uRGVzY3JpcHRpb24gPT09ICdWYXJpYW5jZScpIHRoaXMudmFyaWFuY2VGaWx0ZXIgPSBpZCBhcyBhbnk7XG4gICAgfSk7XG4gICAgLy8gUmUtcXVlcnkgdGhlIEFQSSB3aXRoIHRoZSBuZXcgZmlsdGVycy4gRG8gTk9UIHJlYnVpbGQgc3VtbWFyeUZpbHRlck9iamVjdFxuICAgIC8vIGhlcmUg4oCUIHJlYXNzaWduaW5nIHRoZSBhcnJheSByZWZlcmVuY2UgZGVzeW5jcyBsaWItZmlsdGVycycgaW50ZXJuYWxcbiAgICAvLyBzbmFwc2hvdCBhbmQgd291bGQgYnJlYWsgdGhlIG5leHQgQXBwbHkuXG4gICAgdGhpcy5sb2FkTGlzdCgpO1xuICB9XG5cbiAgLy8gU2VhcmNoIGJveCBjaGFuZ2Ug4oaSIHJlLXF1ZXJ5LlxuICBvblNlYXJjaCgpIHtcbiAgICB0aGlzLmxvYWRMaXN0KCk7XG4gIH1cblxuICAvLyBDbGVhciBhbGwgZmlsdGVycyBhbmQgcmVsb2FkLlxuICBjbGVhckFsbEZpbHRlcnMoKSB7XG4gICAgdGhpcy5jc21GaWx0ZXIgPSAnQWxsJztcbiAgICB0aGlzLnByb2R1Y3RGaWx0ZXIgPSAnQWxsJztcbiAgICB0aGlzLnZhcmlhbmNlRmlsdGVyID0gJ0FsbCc7XG4gICAgdGhpcy5xdWVyeSA9ICcnO1xuICAgIHRoaXMuYnVpbGRGaWx0ZXJPYmplY3QoKTtcbiAgICB0aGlzLmxvYWRMaXN0KCk7XG4gIH1cblxuICAvLyBSb3dzIGNvbWUgYmFjayBhbHJlYWR5IGZpbHRlcmVkIGJ5IHRoZSBBUEk7IHRoaXMgZ2V0dGVyIG9ubHkgYXBwbGllcyB0aGVcbiAgLy8gY2xpZW50LXNpZGUgY29sdW1uIHNvcnQuXG4gIGdldCBmaWx0ZXJlZCgpOiBhbnlbXSB7XG4gICAgbGV0IGxpc3QgPSB0aGlzLnJvd3M7XG4gICAgaWYgKHRoaXMuc29ydEtleSkge1xuICAgICAgY29uc3QgayA9IHRoaXMuc29ydEtleTtcbiAgICAgIGNvbnN0IGdldCA9IChyOiBhbnkpID0+XG4gICAgICAgIGsgPT09ICdzdG9yZXNDdXInID8gci5zdG9yZXNbci5zdG9yZXMubGVuZ3RoIC0gMV0gOiByW2tdO1xuICAgICAgbGlzdCA9IFsuLi5saXN0XS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IHggPSBnZXQoYSksIHkgPSBnZXQoYik7XG4gICAgICAgIGlmICh4ID09IG51bGwgJiYgeSA9PSBudWxsKSByZXR1cm4gMDtcbiAgICAgICAgaWYgKHggPT0gbnVsbCkgcmV0dXJuIDE7XG4gICAgICAgIGlmICh5ID09IG51bGwpIHJldHVybiAtMTtcbiAgICAgICAgLy8gY2xpZW50SWQgaXMgYSBzdHJpbmcgYnV0IG11c3Qgc29ydCBudW1lcmljYWxseSAoJzIwJyBiZWZvcmUgJzEwMCcpLlxuICAgICAgICBpZiAoayA9PT0gJ2NsaWVudElkJykgcmV0dXJuIHRoaXMuc29ydERpciAqIChOdW1iZXIoeCkgLSBOdW1iZXIoeSkpO1xuICAgICAgICBpZiAodHlwZW9mIHggPT09ICdzdHJpbmcnKSByZXR1cm4gdGhpcy5zb3J0RGlyICogeC5sb2NhbGVDb21wYXJlKHkpO1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGlyICogKHggLSB5KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIHNvcnRCeShrZXk6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnNvcnRLZXkgPT09IGtleSkge1xuICAgICAgdGhpcy5zb3J0RGlyID0gdGhpcy5zb3J0RGlyID09PSAxID8gLTEgOiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvcnRLZXkgPSBrZXk7XG4gICAgICB0aGlzLnNvcnREaXIgPSAoa2V5ID09PSAnY2xpZW50TmFtZScgfHwga2V5ID09PSAnY2xpZW50SWQnKSA/IDEgOiAtMTtcbiAgICB9XG4gIH1cblxuICBnZXQgYWN0aXZlRmlsdGVyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuY3NtRmlsdGVyICE9PSAnQWxsJyA/IDEgOiAwKSArXG4gICAgICAgICAgICh0aGlzLnByb2R1Y3RGaWx0ZXIgIT09ICdBbGwnID8gMSA6IDApICtcbiAgICAgICAgICAgKHRoaXMudmFyaWFuY2VGaWx0ZXIgIT09ICdBbGwnID8gMSA6IDApO1xuICB9XG5cbiAgY2xlYXJGaWx0ZXJzKCkge1xuICAgIHRoaXMuY3NtRmlsdGVyID0gJ0FsbCc7XG4gICAgdGhpcy5wcm9kdWN0RmlsdGVyID0gJ0FsbCc7XG4gICAgdGhpcy52YXJpYW5jZUZpbHRlciA9ICdBbGwnO1xuICB9XG5cbiAgLy8gRm9vdGVyIHRvdGFscyBvdmVyIHRoZSBmaWx0ZXJlZCBzZXQuXG4gIGdldCB0b3RhbHMoKSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMuZmlsdGVyZWQ7XG4gICAgY29uc3Qgc3RvcmVUb3RhbHMgPSB0aGlzLm1vbnRocy5tYXAoKF8sIGkpID0+XG4gICAgICBsaXN0LnJlZHVjZSgoYSwgcikgPT4gYSArIChyLnN0b3Jlc1tpXSB8fCAwKSwgMCkpO1xuICAgIHJldHVybiB7XG4gICAgICBzdG9yZVRvdGFscyxcbiAgICAgIG91dHN0YW5kaW5nOiBsaXN0LnJlZHVjZSgoYSwgcikgPT4gYSArIChyLm91dHN0YW5kaW5nIHx8IDApLCAwKSxcbiAgICAgIGFnaW5nMHRvMzA6IGxpc3QucmVkdWNlKChhLCByKSA9PiBhICsgKHIuYWdpbmcwdG8zMCB8fCAwKSwgMCksXG4gICAgICBhZ2luZzMwdG82MDogbGlzdC5yZWR1Y2UoKGEsIHIpID0+IGEgKyAoci5hZ2luZzMwdG82MCB8fCAwKSwgMCksXG4gICAgICBhZ2luZ092ZXI2MDogbGlzdC5yZWR1Y2UoKGEsIHIpID0+IGEgKyAoci5hZ2luZ092ZXI2MCB8fCAwKSwgMCksXG4gICAgICByZXZQcmV2OiBsaXN0LnJlZHVjZSgoYSwgcikgPT4gYSArIChyLnJldlByZXYgfHwgMCksIDApLFxuICAgICAgcmV2Q3VyOiBsaXN0LnJlZHVjZSgoYSwgcikgPT4gYSArIChyLnJldkN1ciB8fCAwKSwgMCksXG4gICAgICBpbnN0YWxsYXRpb246IGxpc3QucmVkdWNlKChhLCByKSA9PiBhICsgKHIuaW5zdGFsbGF0aW9uRmVlIHx8IDApLCAwKSxcbiAgICAgIGNvdW50OiBsaXN0Lmxlbmd0aCxcbiAgICB9O1xuICB9XG5cbiAgcHJvZHVjdFBpbGxDbGFzcyhwOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvID0gKHAgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvLmluY2x1ZGVzKCd0cmFmZmljJykpIHJldHVybiAncGlsbCBwaWxsLWJsdWUnO1xuICAgIGlmIChsby5pbmNsdWRlcygnem9uZScpKSByZXR1cm4gJ3BpbGwgcGlsbC1ncmVlbic7XG4gICAgaWYgKGxvLmluY2x1ZGVzKCd0cmF4JykpIHJldHVybiAncGlsbCBwaWxsLWFtYmVyJztcbiAgICByZXR1cm4gJ3BpbGwgcGlsbC1ncmF5JztcbiAgfVxuXG4gIG9uRXhwb3J0KCkge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLmZpbHRlcmVkO1xuICAgIGlmICghbGlzdC5sZW5ndGgpIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm90aGluZyB0byBleHBvcnQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ29lcmNlIGJsYW5rL3VuZGVmaW5lZCBudW1lcmljIGNlbGxzIHRvIDAgc28gdGhlIGV4cG9ydCBuZXZlciBoYXMgZ2Fwcy5cbiAgICBjb25zdCBudW0gPSAodjogYW55KSA9PiAodiA9PSBudWxsIHx8IHYgPT09ICcnIHx8IE51bWJlci5pc05hTihOdW1iZXIodikpID8gMCA6IE51bWJlcih2KSk7XG4gICAgY29uc3Qgcm93cyA9IGxpc3QubWFwKHIgPT4ge1xuICAgICAgY29uc3Qgb3V0OiBhbnkgPSB7XG4gICAgICAgICdDbGllbnQgSUQnOiByLmNsaWVudElkLFxuICAgICAgICAnQ2xpZW50IE5hbWUnOiByLmNsaWVudE5hbWUsXG4gICAgICAgICdSZWdpc3RlcmVkIEVudGl0eSc6IHIucmVnaXN0ZXJlZEVudGl0eSxcbiAgICAgICAgJ1RvdGFsIE91dHN0YW5kaW5nJzogbnVtKHIub3V0c3RhbmRpbmcpLFxuICAgICAgICAnPCAzMCBkYXlzJzogbnVtKHIuYWdpbmcwdG8zMCksXG4gICAgICAgICczMCB0byA2MCBkYXlzJzogbnVtKHIuYWdpbmczMHRvNjApLFxuICAgICAgICAnPiA2MCBkYXlzJzogbnVtKHIuYWdpbmdPdmVyNjApLFxuICAgICAgICAnU3RhdHVzJzogci5zdGF0dXMsXG4gICAgICAgICdQcm9kdWN0JzogKHIucHJvZHVjdHMgfHwgW10pLmpvaW4oJyArICcpLFxuICAgICAgICAnQ1NNJzogci5jc20sXG4gICAgICB9O1xuICAgICAgdGhpcy5tb250aHMuZm9yRWFjaCgobSwgaSkgPT4gb3V0W2BTdG9yZXMgJHttLmxhYmVsfWBdID0gbnVtKHIuc3RvcmVzPy5baV0pKTtcbiAgICAgIG91dFsnUHJpY2luZyBDdXJyZW5jeSddID0gci5jdXJyZW5jeSA9PT0gJ2RvbGxhcicgPyAnVVNEJyA6ICdJTlInO1xuICAgICAgb3V0W2BQcmljZS9TdG9yZWBdID0gbnVtKHIucHJpY2VQZXJTdG9yZSk7XG4gICAgICBvdXRbYFJldmVudWUgJHt0aGlzLm1vbnRoc1szXT8ubGFiZWx9YF0gPSBudW0oci5yZXZQcmV2KTtcbiAgICAgIG91dFtgUmV2ZW51ZSAke3RoaXMubW9udGhzWzRdPy5sYWJlbH1gXSA9IG51bShyLnJldkN1cik7XG4gICAgICBvdXRbJ1ZhcmlhbmNlICUnXSA9IG51bShyLnZhcmlhbmNlKTtcbiAgICAgIG91dFsnSW5zdGFsbGF0aW9uIEZlZSddID0gbnVtKHIuaW5zdGFsbGF0aW9uRmVlKTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfSk7XG5cbiAgICAvLyBBcHBlbmQgYSBUb3RhbCByb3cgc3VtbWluZyBldmVyeSBudW1lcmljIGNvbHVtbi4gUGVyLXJvdyByYXRlc1xuICAgIC8vIChQcmljZS9TdG9yZSwgVmFyaWFuY2UgJSkgYXJlbid0IGFkZGl0aXZlLCBzbyB0aGV5J3JlIGxlZnQgYmxhbmsuXG4gICAgY29uc3Qgc3VtID0gKGtleTogc3RyaW5nKSA9PiByb3dzLnJlZHVjZSgoYSwgcikgPT4gYSArIChOdW1iZXIocltrZXldKSB8fCAwKSwgMCk7XG4gICAgY29uc3QgdG90YWxSb3c6IGFueSA9IHtcbiAgICAgICdDbGllbnQgSUQnOiAnJyxcbiAgICAgICdDbGllbnQgTmFtZSc6ICdUb3RhbCcsXG4gICAgICAnUmVnaXN0ZXJlZCBFbnRpdHknOiAnJyxcbiAgICAgICdUb3RhbCBPdXRzdGFuZGluZyc6IHN1bSgnVG90YWwgT3V0c3RhbmRpbmcnKSxcbiAgICAgICc8IDMwIGRheXMnOiBzdW0oJzwgMzAgZGF5cycpLFxuICAgICAgJzMwIHRvIDYwIGRheXMnOiBzdW0oJzMwIHRvIDYwIGRheXMnKSxcbiAgICAgICc+IDYwIGRheXMnOiBzdW0oJz4gNjAgZGF5cycpLFxuICAgICAgJ1N0YXR1cyc6ICcnLFxuICAgICAgJ1Byb2R1Y3QnOiAnJyxcbiAgICAgICdDU00nOiAnJyxcbiAgICB9O1xuICAgIHRoaXMubW9udGhzLmZvckVhY2goKG0pID0+IHRvdGFsUm93W2BTdG9yZXMgJHttLmxhYmVsfWBdID0gc3VtKGBTdG9yZXMgJHttLmxhYmVsfWApKTtcbiAgICB0b3RhbFJvd1snUHJpY2luZyBDdXJyZW5jeSddID0gJyc7XG4gICAgdG90YWxSb3dbYFByaWNlL1N0b3JlYF0gPSAnJztcbiAgICB0b3RhbFJvd1tgUmV2ZW51ZSAke3RoaXMubW9udGhzWzNdPy5sYWJlbH1gXSA9IHN1bShgUmV2ZW51ZSAke3RoaXMubW9udGhzWzNdPy5sYWJlbH1gKTtcbiAgICB0b3RhbFJvd1tgUmV2ZW51ZSAke3RoaXMubW9udGhzWzRdPy5sYWJlbH1gXSA9IHN1bShgUmV2ZW51ZSAke3RoaXMubW9udGhzWzRdPy5sYWJlbH1gKTtcbiAgICB0b3RhbFJvd1snVmFyaWFuY2UgJSddID0gJyc7XG4gICAgdG90YWxSb3dbJ0luc3RhbGxhdGlvbiBGZWUnXSA9IHN1bSgnSW5zdGFsbGF0aW9uIEZlZScpO1xuICAgIHJvd3MucHVzaCh0b3RhbFJvdyk7XG5cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmV4cG9ydEFzRXhjZWxGaWxlKHJvd3MsICdiaWxsaW5nLXN1bW1hcnknKTtcbiAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdChgRXhwb3J0ZWQgJHtsaXN0Lmxlbmd0aH0gY2xpZW50c2ApO1xuICB9XG59IiwiPGRpdiBjbGFzcz1cInB4LTQgcGItNFwiPlxuICAgIDwhLS0gSGVhZGVyOiBzZWFyY2ggKyBmaWx0ZXIgKyBleHBvcnQgLS0+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtNCBmbGV4LXdyYXAgZ2FwLTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJpbGxpbmdoZWFkZXJcIj5CaWxsaW5nIFN1bW1hcnk8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gaW52b2ljZXNlYXJjaCBzdmctaWNvbi0xIHBvc2l0aW9uLWFic29sdXRlIG10LTYgbXMtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IG9wYWNpdHk9XCIwLjVcIiB4PVwiMTcuMDM2NVwiIHk9XCIxNS4xMjIzXCIgd2lkdGg9XCI4LjE1NTQ2XCIgaGVpZ2h0PVwiMlwiIHJ4PVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKDQ1IDE3LjAzNjUgMTUuMTIyMylcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9yZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMSAxOUM2LjU1NTU2IDE5IDMgMTUuNDQ0NCAzIDExQzMgNi41NTU1NiA2LjU1NTU2IDMgMTEgM0MxNS40NDQ0IDMgMTkgNi41NTU1NiAxOSAxMUMxOSAxNS40NDQ0IDE1LjQ0NDQgMTkgMTEgMTlaTTExIDVDNy41MzMzMyA1IDUgNy41MzMzMyA1IDExQzUgMTQuNDY2NyA3LjUzMzMzIDE3IDExIDE3QzE0LjQ2NjcgMTcgMTcgMTQuNDY2NyAxNyAxMUMxNyA3LjUzMzMzIDE0LjQ2NjcgNSAxMSA1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cInF1ZXJ5XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBpbnZvaWNlc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggY2xpZW50IC8gZW50aXR5IC8gSUQuLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VhcmNoKClcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIFJlbmRlciBvbmx5IG9uY2Ugb3B0aW9ucyBhcmUgYnVpbHQg4oCUIGxpYi1maWx0ZXJzIHNuYXBzaG90cyBpdHNcbiAgICAgICAgICAgICAgICAgZGF0YU9iamVjdCBpbiBuZ09uSW5pdCBhbmQgbmV2ZXIgcmUtcmVhZHMgaXQsIHNvIGl0IG11c3RcbiAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZSBhZ2FpbnN0IHRoZSBwb3B1bGF0ZWQgYXJyYXkuIC0tPlxuICAgICAgICAgICAgPGxpYi1maWx0ZXJzICpuZ0lmPVwic3VtbWFyeUZpbHRlck9iamVjdC5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFtkYXRhT2JqZWN0XT1cInN1bW1hcnlGaWx0ZXJPYmplY3RcIiAoYXBwbGllZEZpbHRlcnMpPVwiYXBwbHlTdW1tYXJ5RmlsdGVycygkZXZlbnQpXCI+PC9saWItZmlsdGVycz5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLW91dGxpbmUgYnRuIGFsaWduLWl0ZW1zLWVuZCB0ZXh0LW5vd3JhcCBpbnZoZWFkZXJcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZmlsdGVyZWQubGVuZ3RoXCIgKGNsaWNrKT1cIm9uRXhwb3J0KClcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+RXhwb3J0PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBMb2FkaW5nIHNoaW1tZXIgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIG10LTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBFbXB0eSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmcgJiYgbm9EYXRhXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjIHctMjVcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGEuc3ZnXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFN1bW1hcnkgdGFibGUg4oCUIHN0aWNreSB0d28tcm93IGhlYWRlciArIHN0aWNreSB0b3RhbHMgZm9vdGVyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiAhbm9EYXRhXCIgY2xhc3M9XCJzdW0tc2Nyb2xsIG10LTNcIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgc3VtLXRhYmxlIHRleHQtbm93cmFwIG1iLTBcIj5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdjbGllbnRJZCcpXCI+Q2xpZW50IElEXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAnY2xpZW50SWQnXCI+e3sgc29ydEtleSA9PT0gJ2NsaWVudElkJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCIgY2xhc3M9XCJzb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ2NsaWVudE5hbWUnKVwiPkNsaWVudCBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAnY2xpZW50TmFtZSdcIj57eyBzb3J0S2V5ID09PSAnY2xpZW50TmFtZScgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiPlJlZ2lzdGVyZWQgRW50aXR5PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCIgY2xhc3M9XCJzb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ291dHN0YW5kaW5nJylcIj5Ub3RhbCBPdXRzdGFuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ291dHN0YW5kaW5nJ1wiPnt7IHNvcnRLZXkgPT09ICdvdXRzdGFuZGluZycgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdhZ2luZzB0bzMwJylcIj4mbHQ7IDMwIGRheXNcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyXCIgW2NsYXNzLm9uXT1cInNvcnRLZXkgPT09ICdhZ2luZzB0bzMwJ1wiPnt7IHNvcnRLZXkgPT09ICdhZ2luZzB0bzMwJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCIgY2xhc3M9XCJzb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ2FnaW5nMzB0bzYwJylcIj4zMCB0byA2MCBkYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAnYWdpbmczMHRvNjAnXCI+e3sgc29ydEtleSA9PT0gJ2FnaW5nMzB0bzYwJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCIgY2xhc3M9XCJzb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ2FnaW5nT3ZlcjYwJylcIj4mZ3Q7IDYwIGRheXNcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyXCIgW2NsYXNzLm9uXT1cInNvcnRLZXkgPT09ICdhZ2luZ092ZXI2MCdcIj57eyBzb3J0S2V5ID09PSAnYWdpbmdPdmVyNjAnICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggcm93c3Bhbj1cIjJcIj5TdGF0dXM8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggcm93c3Bhbj1cIjJcIj5Qcm9kdWN0PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCI+Q1NNPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIFthdHRyLmNvbHNwYW5dPVwibW9udGhzLmxlbmd0aFwiIGNsYXNzPVwiZ3JvdXAtaGVhZFwiPlN0b3JlIENvdW50PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHJvd3NwYW49XCIyXCIgY2xhc3M9XCJzb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ3ByaWNlUGVyU3RvcmUnKVwiPlByaWNlIC8gU3RvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyXCIgW2NsYXNzLm9uXT1cInNvcnRLZXkgPT09ICdwcmljZVBlclN0b3JlJ1wiPnt7IHNvcnRLZXkgPT09ICdwcmljZVBlclN0b3JlJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49XCIyXCIgY2xhc3M9XCJncm91cC1oZWFkXCI+UmV2ZW51ZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCByb3dzcGFuPVwiMlwiIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCd2YXJpYW5jZScpXCI+VmFyaWFuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyXCIgW2NsYXNzLm9uXT1cInNvcnRLZXkgPT09ICd2YXJpYW5jZSdcIj57eyBzb3J0S2V5ID09PSAndmFyaWFuY2UnICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggcm93c3Bhbj1cIjJcIiBjbGFzcz1cInNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnaW5zdGFsbGF0aW9uRmVlJylcIj5JbnN0YWxsYXRpb24gRmVlXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAnaW5zdGFsbGF0aW9uRmVlJ1wiPnt7IHNvcnRLZXkgPT09ICdpbnN0YWxsYXRpb25GZWUnICYmIHNvcnREaXIgPT09IDEgPyAn4oaRJyA6ICfihpMnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IG0gb2YgbW9udGhzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJzdWItaGVhZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc29ydGFibGVdPVwiaSA9PT0gbW9udGhzLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImkgPT09IG1vbnRocy5sZW5ndGggLSAxID8gc29ydEJ5KCdzdG9yZXNDdXInKSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG0ubGFiZWwgfX08c3BhbiAqbmdJZj1cImkgPT09IG1vbnRocy5sZW5ndGggLSAxXCIgY2xhc3M9XCJhcnJcIiBbY2xhc3Mub25dPVwic29ydEtleSA9PT0gJ3N0b3Jlc0N1cidcIj57eyBzb3J0S2V5ID09PSAnc3RvcmVzQ3VyJyAmJiBzb3J0RGlyID09PSAxID8gJ+KGkScgOiAn4oaTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic3ViLWhlYWQgc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdyZXZQcmV2JylcIj57eyBtb250aHNbM10ubGFiZWwgfX08c3BhbiBjbGFzcz1cImFyclwiIFtjbGFzcy5vbl09XCJzb3J0S2V5ID09PSAncmV2UHJldidcIj57eyBzb3J0S2V5ID09PSAncmV2UHJldicgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic3ViLWhlYWQgc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdyZXZDdXInKVwiPnt7IG1vbnRoc1s0XS5sYWJlbCB9fTxzcGFuIGNsYXNzPVwiYXJyXCIgW2NsYXNzLm9uXT1cInNvcnRLZXkgPT09ICdyZXZDdXInXCI+e3sgc29ydEtleSA9PT0gJ3JldkN1cicgJiYgc29ydERpciA9PT0gMSA/ICfihpEnIDogJ+KGkycgfX08L3NwYW4+PC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHIgb2YgZmlsdGVyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHIuY2xpZW50SWQgfHwgJ+KAlCcgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+PHN0cm9uZz57eyByLmNsaWVudE5hbWUgfCB1cHBlcmNhc2UgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVudGl0eVwiIFt0aXRsZV09XCIoci5yZWdpc3RlcmVkRW50aXRpZXMgJiYgci5yZWdpc3RlcmVkRW50aXRpZXMubGVuZ3RoID8gci5yZWdpc3RlcmVkRW50aXRpZXMuam9pbignXFxuJykgOiByLnJlZ2lzdGVyZWRFbnRpdHkpIHx8ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgci5yZWdpc3RlcmVkRW50aXR5IHx8ICfigJQnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInIucmVnaXN0ZXJlZEVudGl0aWVzPy5sZW5ndGggPiAxXCIgY2xhc3M9XCJlbnRpdHktbW9yZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInIucmVnaXN0ZXJlZEVudGl0aWVzLmpvaW4oJ1xcbicpXCI+K3t7IHIucmVnaXN0ZXJlZEVudGl0aWVzLmxlbmd0aCAtIDEgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kXCI+PHN0cm9uZz57eyByLm91dHN0YW5kaW5nID8gKCfigrknICsgKHIub3V0c3RhbmRpbmcgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nKSkgOiAn4oCUJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kXCI+e3sgci5hZ2luZzB0bzMwID8gKCfigrknICsgKHIuYWdpbmcwdG8zMCB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpKSA6ICfigJQnIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj57eyByLmFnaW5nMzB0bzYwID8gKCfigrknICsgKHIuYWdpbmczMHRvNjAgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nKSkgOiAn4oCUJyB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kXCI+e3sgci5hZ2luZ092ZXI2MCA/ICgn4oK5JyArIChyLmFnaW5nT3ZlcjYwIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykpIDogJ+KAlCcgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9XCJwaWxsXCIgW25nQ2xhc3NdPVwici5zdGF0dXMgPT09ICdQYWlkJyA/ICdwaWxsLWdyZWVuJyA6ICdwaWxsLWFtYmVyJ1wiPnt7IHIuc3RhdHVzIH19PC9zcGFuPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBwIG9mIHIucHJvZHVjdHNcIiBbbmdDbGFzc109XCJwcm9kdWN0UGlsbENsYXNzKHApXCIgY2xhc3M9XCJtZS0xXCI+e3sgcCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXIucHJvZHVjdHM/Lmxlbmd0aFwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPuKAlDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHIuY3NtIHx8ICfigJQnIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBzIG9mIHIuc3RvcmVzOyBsZXQgaSA9IGluZGV4XCIgW2NsYXNzLmZ3LWJvbGRdPVwiaSA9PT0gci5zdG9yZXMubGVuZ3RoIC0gMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgcyA9PSBudWxsID8gJ+KAlCcgOiAocyB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBbdGl0bGVdPVwici5jdXJyZW5jeSA9PT0gJ2RvbGxhcicgPyAoJ1VTRCBwcmljaW5nIOKAlCByZXZlbnVlIGNvbnZlcnRlZCB0byDigrkgYXQgdG9kYXlcXCdzIHJhdGUgKCcgKyAodXNkUmF0ZSB8IG51bWJlcjonMS4yLTInKSArICcpJykgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgci5wcmljZVBlclN0b3JlID09IG51bGwgPyAn4oCUJyA6IChyLmN1cnJlbmN5ID09PSAnZG9sbGFyJyA/ICckJyA6ICfigrknKSArIChyLnByaWNlUGVyU3RvcmUgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+e3sgci5yZXZQcmV2ID09IG51bGwgPyAn4oCUJyA6ICfigrknICsgKHIucmV2UHJldiB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyByLnJldkN1ciA9PSBudWxsID8gJ+KAlCcgOiAn4oK5JyArIChyLnJldkN1ciB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInIucmV2Q3VyRXN0aW1hdGVkXCIgY2xhc3M9XCJlc3QtY2hpcCBtcy0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkVzdGltYXRlZDogY3VycmVudCBzdG9yZSBjb3VudCDDlyBiYXNlIHByaWNlIOKAlCByZXBsYWNlZCBieSB0aGUgaW52b2ljZSBhbW91bnQgb25jZSBnZW5lcmF0ZWRcIj5lc3QuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInIudmFyaWFuY2UgIT0gbnVsbFwiIGNsYXNzPVwiZnctc2VtaWJvbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXN1Y2Nlc3NdPVwici52YXJpYW5jZSA+IDBcIiBbY2xhc3MudGV4dC1kYW5nZXJdPVwici52YXJpYW5jZSA8IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIobW9udGhzWzNdLmxhYmVsICsgJyAnICsgKHIucmV2UHJldiA9PSBudWxsID8gJ+KAlCcgOiAn4oK5JyArIChyLnJldlByZXYgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nKSkgKyAnIOKGkiAnICsgbW9udGhzWzRdLmxhYmVsICsgJyAnICsgKHIucmV2Q3VyID09IG51bGwgPyAn4oCUJyA6ICfigrknICsgKHIucmV2Q3VyIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJykpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHIudmFyaWFuY2UgPiAwID8gJysnIDogJycgfX17eyByLnZhcmlhbmNlIH19JVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyLnZhcmlhbmNlID09IG51bGxcIiBjbGFzcz1cInRleHQtbXV0ZWRcIj7igJQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57eyByLmluc3RhbGxhdGlvbkZlZSA9PSBudWxsID8gJ+KAlCcgOiAn4oK5JyArIChyLmluc3RhbGxhdGlvbkZlZSB8IG51bWJlcjonMS4wLTAnOidlbi1JTicpIH19PC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0ciAqbmdJZj1cIiFmaWx0ZXJlZC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiMTUgKyBtb250aHMubGVuZ3RoXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIHB5LTVcIj5ObyBjbGllbnRzIG1hdGNoLjwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8dGZvb3Q+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjNcIj5Ub3RhbCDCtyB7eyB0b3RhbHMuY291bnQgfX0gY2xpZW50czwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kXCI+PHN0cm9uZz7igrl7eyB0b3RhbHMub3V0c3RhbmRpbmcgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPuKCuXt7IHRvdGFscy5hZ2luZzB0bzMwIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kXCI+PHN0cm9uZz7igrl7eyB0b3RhbHMuYWdpbmczMHRvNjAgfCBudW1iZXI6JzEuMC0wJzonZW4tSU4nIH19PC9zdHJvbmc+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48c3Ryb25nPuKCuXt7IHRvdGFscy5hZ2luZ092ZXI2MCB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjNcIj48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IHQgb2YgdG90YWxzLnN0b3JlVG90YWxzXCI+PHN0cm9uZz57eyB0IHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+PHN0cm9uZz7igrl7eyB0b3RhbHMucmV2UHJldiB8IG51bWJlcjonMS4wLTAnOidlbi1JTicgfX08L3N0cm9uZz48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+PHN0cm9uZz7igrl7eyB0b3RhbHMucmV2Q3VyIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+PHN0cm9uZz7igrl7eyB0b3RhbHMuaW5zdGFsbGF0aW9uIHwgbnVtYmVyOicxLjAtMCc6J2VuLUlOJyB9fTwvc3Ryb25nPjwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGZvb3Q+XG4gICAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=