tango-app-ui-analyse-trax 4.0.49 → 4.0.50

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.
@@ -2,6 +2,7 @@ import { Component, HostListener } from '@angular/core';
2
2
  import { Subject, debounceTime, takeUntil } from 'rxjs';
3
3
  import dayjs from 'dayjs';
4
4
  import { auditAccess } from '../audit-v2-access';
5
+ import { PICKER_LOCALE, fromPickerRange, pickerRanges, toPickerRange } from '../audit-v2-datepicker';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "@angular/router";
7
8
  import * as i2 from "../../../services/trax.service";
@@ -9,10 +10,11 @@ import * as i3 from "tango-app-ui-global";
9
10
  import * as i4 from "tango-app-ui-shared";
10
11
  import * as i5 from "@angular/common";
11
12
  import * as i6 from "@angular/forms";
12
- import * as i7 from "../tip/audit-v2-tip.directive";
13
- import * as i8 from "../shimmer/audit-v2-shimmer.component";
14
- import * as i9 from "../select/audit-v2-select.component";
15
- import * as i10 from "../sort-icon/audit-v2-sort-icon.component";
13
+ import * as i7 from "ngx-daterangepicker-material";
14
+ import * as i8 from "../tip/audit-v2-tip.directive";
15
+ import * as i9 from "../shimmer/audit-v2-shimmer.component";
16
+ import * as i10 from "../select/audit-v2-select.component";
17
+ import * as i11 from "../sort-icon/audit-v2-sort-icon.component";
16
18
  const EMPTY_CARDS = {
17
19
  visits: 0, submitted: 0, open: 0, inprogress: 0, notSubmitted: 0, activeAudits: 0, flags: 0, completion: null, compliance: null
18
20
  };
@@ -109,13 +111,19 @@ export class AuditV2DetailComponent {
109
111
  return;
110
112
  }
111
113
  const clientChanged = this.headerData?.client !== data.client;
112
- if (!firstHeader) {
114
+ // The header re-emits on start-up (client list load, header switch) with the same dates: only a real change
115
+ // of its range replaces the period this page was opened on / picked here (QA 13 Oct: Not audited -> View
116
+ // stores showed other dates).
117
+ const headerDatesChanged = !!this.headerData && (this.headerData?.date?.startDate !== data?.date?.startDate
118
+ || this.headerData?.date?.endDate !== data?.date?.endDate);
119
+ if (!firstHeader && headerDatesChanged) {
113
120
  this.linkFrom = '';
114
121
  this.linkTo = '';
115
122
  }
116
123
  firstHeader = false;
117
124
  this.headerData = data;
118
125
  this.period = 'Based on ' + this.fmtDay(this.fromDate) + ' - ' + this.fmtDay(this.toDate);
126
+ this.range = toPickerRange(this.fromDate, this.toDate);
119
127
  this.month = '';
120
128
  this.page = 1;
121
129
  this.loading = true;
@@ -220,6 +228,25 @@ export class AuditV2DetailComponent {
220
228
  this.destroy$.complete();
221
229
  }
222
230
  /** ---- Data ---- */
231
+ // ---- In-page date range (QA 13 Oct: the drill-down pages had no calendar of their own) ----
232
+ pickerLocale = PICKER_LOCALE;
233
+ ranges = pickerRanges();
234
+ today = dayjs();
235
+ range = null;
236
+ /** A picked range becomes this page's period (kept in the URL, so refresh and the table's links keep it). */
237
+ onRangePicked(e) {
238
+ const picked = fromPickerRange(e);
239
+ if (!picked || (picked.from === this.fromDate && picked.to === this.toDate)) {
240
+ return;
241
+ }
242
+ this.linkFrom = picked.from;
243
+ this.linkTo = picked.to;
244
+ this.period = 'Based on ' + this.fmtDay(this.fromDate) + ' - ' + this.fmtDay(this.toDate);
245
+ this.month = '';
246
+ this.page = 1;
247
+ this.router.navigate([], { relativeTo: this.route, queryParams: { from: picked.from, to: picked.to }, queryParamsHandling: 'merge', replaceUrl: true });
248
+ this.load();
249
+ }
223
250
  /** The period shown: the Dashboard link's from / to when it passed them, else the header range. */
224
251
  get fromDate() {
225
252
  return this.linkFrom || this.headerData?.date?.startDate || '';
@@ -390,7 +417,11 @@ export class AuditV2DetailComponent {
390
417
  this.page = 1;
391
418
  this.load();
392
419
  }
420
+ /** Open / In Progress / Submitted; a redo reads "Redo" while pending and "Submitted (Redo)" once resubmitted. */
393
421
  statusLabel(row) {
422
+ if (row.redo) {
423
+ return row.status === 'submit' ? 'Submitted (Redo)' : 'Redo';
424
+ }
394
425
  return row.status === 'submit' ? 'Submitted' : (row.status === 'inprogress' ? 'In Progress' : 'Open');
395
426
  }
396
427
  statusBg(row) {
@@ -465,7 +496,7 @@ export class AuditV2DetailComponent {
465
496
  'Store Name': r.storeName,
466
497
  'User Name': r.userName,
467
498
  'Submitted By': r.userEmail,
468
- 'Status': this.statusLabel(r) + (r.redo ? ' (Redo)' : ''),
499
+ 'Status': this.statusLabel(r),
469
500
  'Submitted On': this.fmtTime(r.submittedOn),
470
501
  'Submission Count': r.submissionCount,
471
502
  'Flags': r.flags,
@@ -489,13 +520,13 @@ export class AuditV2DetailComponent {
489
520
  return d.date;
490
521
  }
491
522
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2DetailComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.TraxService }, { token: i3.GlobalStateService }, { token: i4.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
492
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2DetailComponent, selector: "lib-audit-v2-detail", host: { listeners: { "document:keydown.escape": "closeSwitch()" } }, ngImport: i0, template: "<div class=\"av2-page audit-detail\">\r\n <!-- Back + title (audit: owner / stores / schedule chips; user: avatar + tag) -->\r\n <div class=\"sd-head\">\r\n <a class=\"sd-back\" routerLink=\"/manage/trax/audit-v2/dashboard\" title=\"Back to dashboard\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\"></line>\r\n <polyline points=\"12 19 5 12 12 5\"></polyline>\r\n </svg>\r\n </a>\r\n <span *ngIf=\"by === 'user'\" class=\"sd-avatar sd-avatar--lg\">{{ initials || '--' }}</span>\r\n <div class=\"sd-head-text\">\r\n <div class=\"sd-title-row\">\r\n <span *ngIf=\"loading && !info\" class=\"av2-sk av2-sk--title\"></span>\r\n <!-- Audit page: the name is a switcher (prototype: name chip with a chevron) + published dot -->\r\n <div *ngIf=\"by === 'audit' && auditOptions.length > 1 && (!loading || info)\" class=\"sd-switch\" [class.is-open]=\"switchOpen\">\r\n <button type=\"button\" class=\"sd-switch-btn\" (click)=\"toggleSwitch()\" [attr.aria-expanded]=\"switchOpen\"\r\n aria-haspopup=\"listbox\" title=\"Switch audit\">\r\n <span class=\"sd-switch-name\">{{ title }}</span>\r\n <svg class=\"sd-switch-chev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"sd-switch-menu\" *ngIf=\"switchOpen\" role=\"listbox\">\r\n <label class=\"sd-switch-search\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\r\n <input type=\"text\" [(ngModel)]=\"switchQuery\" placeholder=\"Search audits\" autocomplete=\"off\">\r\n </label>\r\n <div class=\"sd-switch-list\">\r\n <button type=\"button\" class=\"sd-switch-item\" *ngFor=\"let a of switchFiltered\" role=\"option\"\r\n [class.is-active]=\"a.id === subjectId\" [attr.aria-selected]=\"a.id === subjectId\" (click)=\"switchAudit(a.id)\">\r\n <span class=\"sd-pubdot\" [class.is-on]=\"a.publish\" [title]=\"a.publish ? 'Published' : 'Draft'\"></span>\r\n <span class=\"sd-switch-label\" [title]=\"a.name\">{{ a.name }}</span>\r\n <svg *ngIf=\"a.id === subjectId\" class=\"sd-switch-check\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </button>\r\n <div class=\"sd-switch-empty\" *ngIf=\"!switchFiltered.length\">No audit matches \"{{ switchQuery }}\"</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-switch-backdrop\" *ngIf=\"switchOpen\" (click)=\"closeSwitch()\"></div>\r\n <span *ngIf=\"(by !== 'audit' || auditOptions.length <= 1) && (!loading || info)\" class=\"sd-title\">{{ title }}</span>\r\n <!-- Live state of the audit: Published (green) or Draft (grey) -->\r\n <span *ngIf=\"by === 'audit' && info\" class=\"sd-pubstate\" [class.is-on]=\"info.publish\"\r\n [title]=\"info.publish ? 'This audit is published' : 'This audit is a draft (not published)'\">\r\n <span class=\"sd-pubdot\" [class.is-on]=\"info.publish\"></span>{{ info.publish ? 'Published' : 'Draft' }}\r\n </span>\r\n <span *ngIf=\"by === 'user'\" class=\"sd-tag\">user</span>\r\n </div>\r\n <div class=\"sd-sub\" *ngIf=\"by !== 'audit'\">\r\n <ng-container *ngIf=\"by === 'user' && subjectId\">{{ subjectId }} \u00B7 </ng-container>{{ period }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"by === 'audit' && info\">\r\n <span class=\"sd-divider\"></span>\r\n <div class=\"sd-chips\">\r\n <span class=\"sd-chip\" *ngIf=\"info.owner\" title=\"Audit owner\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"></path><circle cx=\"12\" cy=\"7\" r=\"4\"></circle></svg>\r\n {{ info.owner }}\r\n </span>\r\n <span class=\"sd-chip\" title=\"Assigned stores\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l1-5h16l1 5\"></path><path d=\"M4 9v11h16V9\"></path><path d=\"M9 20v-6h6v6\"></path></svg>\r\n {{ info.stores }} {{ info.stores === 1 ? 'Store' : 'Stores' }}\r\n </span>\r\n <!-- No schedule-type (\"One time\") or audit-level visit-window chip (QA 10 Oct): audits are scheduled by\r\n Schedules, whose rows carry the visit windows. -->\r\n </div>\r\n </ng-container>\r\n <div class=\"av2-grow\"></div>\r\n <span *ngIf=\"by === 'audit'\" class=\"sd-sub\">{{ period }}</span>\r\n </div>\r\n\r\n <!-- Store page: the prototype's three stat blocks -->\r\n <div class=\"sd-stats\" *ngIf=\"by === 'store'\">\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.activeAudits }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Active Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body\">\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.visits }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">Audit Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.notSubmitted }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Not Submitted Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body sd-stat-body--2\">\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.open }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">Open Audits</div>\r\n </div>\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.inprogress }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">In Progress Audits</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.submitted }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Submitted Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body sd-stat-body--3\">\r\n <div class=\"sd-stat-cell\" *ngFor=\"let k of storeKpis\">\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">{{ k.label }}</div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Audit / user pages: count + score cards beside the month calendar -->\r\n <div class=\"sd-overview\" *ngIf=\"by !== 'store'\">\r\n <!-- Cards in their own grid, stretched to the calendar height: the score row takes what the count row leaves. -->\r\n <div class=\"sd-overview-main\">\r\n <div class=\"sd-kpi\" *ngFor=\"let k of countKpis\">\r\n <div class=\"sd-kpi-title\">{{ k.label }}</div>\r\n <div class=\"sd-kpi-value\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k, center: true }\"></ng-container>\r\n </div>\r\n\r\n <!-- Same look as the count cards (prototype): gradient title, centred value and change -->\r\n <div class=\"sd-kpi sd-kpi--score\" *ngFor=\"let k of scoreKpis\">\r\n <div class=\"sd-kpi-title\">{{ k.label }}</div>\r\n <div class=\"sd-kpi-value\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k, center: true }\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sd-cal\">\r\n <div class=\"sd-cal-title\">\r\n Monthly Performance\r\n <span class=\"sd-cal-info\" title=\"Colour shows each day's visits: all submitted and passing, partly done or below the pass mark, or none submitted\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><path d=\"M12 8h.01M11 12h1v4h1\"></path></svg>\r\n </span>\r\n </div>\r\n <div class=\"sd-cal-nav\">\r\n <button type=\"button\" class=\"sd-cal-step\" title=\"Previous month\" (click)=\"shiftMonth(-1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>\r\n </button>\r\n <span class=\"sd-cal-month\">{{ monthLabel }}</span>\r\n <button type=\"button\" class=\"sd-cal-step\" title=\"Next month\" (click)=\"shiftMonth(1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>\r\n </button>\r\n </div>\r\n <div class=\"sd-cal-week\">\r\n <span *ngFor=\"let w of weekdays\">{{ w }}</span>\r\n </div>\r\n <div class=\"sd-cal-days\">\r\n <span *ngFor=\"let i of calendarLead\" class=\"sd-day sd-day--blank\"></span>\r\n <span *ngFor=\"let d of calendarDays; trackBy: trackByDay\" class=\"sd-day\" [ngClass]=\"'sd-day--' + d.status\"\r\n [title]=\"dayTitle(d)\">{{ d.day }}</span>\r\n </div>\r\n <div class=\"sd-cal-legend\">\r\n <span><i class=\"sd-dot sd-dot--track\"></i>On track</span>\r\n <span><i class=\"sd-dot sd-dot--risk\"></i>At risk</span>\r\n <span><i class=\"sd-dot sd-dot--missed\"></i>Missed</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Visits table -->\r\n <section class=\"sd-card\">\r\n <div class=\"sd-card-head\">\r\n <div class=\"sd-card-text\">\r\n <div class=\"sd-card-title\">\r\n Audit Info\r\n <span class=\"sd-count\">{{ totalCount }} Total</span>\r\n </div>\r\n <div class=\"sd-sub\">{{ period }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <lib-audit-v2-select class=\"sd-status\" [(ngModel)]=\"status\" (ngModelChange)=\"onStatus()\" [options]=\"statusOptions\"\r\n ariaLabel=\"Visit status\"></lib-audit-v2-select>\r\n <label class=\"av2-search sd-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"by === 'store' ? 'Search by audit or auditor' : 'Search by store or user'\"\r\n [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\">\r\n </label>\r\n <!-- Send Alert: reminder email to the auditors of the ticked visits that are not submitted -->\r\n <button type=\"button\" class=\"av2-btn sd-alert\" *ngIf=\"by === 'audit' && access.canEdit\"\r\n [disabled]=\"!alertIds.size || alerting\" (click)=\"sendAlert()\"\r\n [title]=\"alertIds.size ? 'Email a reminder to the auditors of the ticked visits' : 'Tick visits that are not submitted yet'\">\r\n {{ alerting ? 'Sending\u2026' : (alertIds.size ? 'Send Alert (' + alertIds.size + ')' : 'Send Alert') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"exporting || !totalCount\" (click)=\"exportRows()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\r\n <polyline points=\"7 10 12 15 17 10\"></polyline>\r\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\r\n </svg>\r\n {{ exporting ? 'Exporting\u2026' : 'Export' }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"rowsLoading\" [rows]=\"6\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"av2-table-wrap\" *ngIf=\"!rowsLoading && rows.length\">\r\n <table class=\"sd-table\" [ngClass]=\"'sd-table--' + by\">\r\n <thead>\r\n <tr>\r\n <th *ngIf=\"by === 'audit'\" class=\"sd-check\">\r\n <input type=\"checkbox\" class=\"sd-cb\" aria-label=\"Select all visits that are not submitted\"\r\n [checked]=\"allAlertable\" [indeterminate]=\"someAlertable\" [disabled]=\"!alertableRows.length\" (change)=\"toggleAllAlert()\">\r\n </th>\r\n <th *ngIf=\"by !== 'store'\" class=\"av2-sortable\" (click)=\"sortTable('date')\">Date <lib-audit-v2-sort-icon [active]=\"sortColumn === 'date'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'audit'\" class=\"av2-sortable\" (click)=\"sortTable('checkListName')\">Audit Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'checkListName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'store'\" class=\"av2-sortable\" (click)=\"sortTable('storeName')\">Store Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'storeName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'store'\" class=\"av2-sortable\" (click)=\"sortTable('userName')\">User Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'userName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('status')\">Status <lib-audit-v2-sort-icon [active]=\"sortColumn === 'status'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'user'\" class=\"av2-sortable\" (click)=\"sortTable('submittedBy')\">Submitted By <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submittedBy'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('submittedOn')\">Submitted On <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submittedOn'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('submissionCount')\">Submission Count <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submissionCount'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('flags')\">Flags <lib-audit-v2-sort-icon [active]=\"sortColumn === 'flags'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('approvedBy')\">Approved By <lib-audit-v2-sort-icon [active]=\"sortColumn === 'approvedBy'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('approvedOn')\">Approved On <lib-audit-v2-sort-icon [active]=\"sortColumn === 'approvedOn'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of rows; trackBy: trackByRow\">\r\n <td *ngIf=\"by === 'audit'\" class=\"sd-check\">\r\n <input type=\"checkbox\" class=\"sd-cb\" [checked]=\"alertIds.has(row.id)\" [disabled]=\"row.status === 'submit'\"\r\n [title]=\"row.status === 'submit' ? 'Already submitted' : 'Select for Send Alert'\" (change)=\"toggleAlert(row)\">\r\n </td>\r\n <td *ngIf=\"by !== 'store'\" class=\"sd-nowrap\">{{ fmtDate(row.date) }}</td>\r\n <td *ngIf=\"by !== 'audit'\">\r\n <div class=\"sd-name\">\r\n <span class=\"sd-avatar\">{{ rowInitials(row.checkListName) }}</span>\r\n <span class=\"av2-ellipsis\" [av2Tip]=\"row.checkListName\">{{ row.checkListName }}</span>\r\n </div>\r\n </td>\r\n <td *ngIf=\"by !== 'store'\" class=\"av2-ellipsis\">\r\n <a class=\"sd-link sd-link--plain\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.storeId })\" [title]=\"row.storeName || ''\">{{ row.storeName || '\u2014' }}</a>\r\n </td>\r\n <td *ngIf=\"by !== 'store'\" class=\"av2-ellipsis\">\r\n <a *ngIf=\"by !== 'user'\" class=\"sd-link sd-link--plain\" routerLink=\"/manage/trax/audit-v2/dashboard/user\"\r\n [queryParams]=\"detailParams({ email: row.userEmail })\" [title]=\"row.userEmail\">{{ row.userName || row.userEmail }}</a>\r\n <span *ngIf=\"by === 'user'\" [title]=\"row.userEmail\">{{ row.userName || row.userEmail }}</span>\r\n </td>\r\n <td>\r\n <span class=\"sd-pill\" [style.background]=\"statusBg(row)\" [style.color]=\"statusFg(row)\">\r\n <svg *ngIf=\"row.redo\" class=\"sd-redo\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><title>Redo</title><polyline points=\"1 4 1 10 7 10\"></polyline><path d=\"M3.5 15a9 9 0 1 0 2.1-9.4L1 10\"></path></svg>\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td *ngIf=\"by !== 'user'\" class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.userEmail\">{{ row.userEmail || '--' }}</td>\r\n <td class=\"av2-dim sd-nowrap\">{{ fmtTime(row.submittedOn) }}</td>\r\n <td>{{ row.submissionCount }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td class=\"av2-ellipsis\" [class.av2-faint]=\"!row.approvedBy\">{{ row.approvedBy || '--' }}</td>\r\n <td class=\"sd-nowrap\" [class.av2-faint]=\"!row.approvedOn\">{{ fmtTime(row.approvedOn) }}</td>\r\n <td>\r\n <span class=\"sd-actions\" *ngIf=\"row.status === 'submit'\">\r\n <a class=\"sd-link\" routerLink=\"/manage/trax/audit-v2/gallery\" [queryParams]=\"galleryParams(row)\">View</a>\r\n <a class=\"sd-link\" (click)=\"download(row)\">Download</a>\r\n </span>\r\n <span *ngIf=\"row.status !== 'submit'\" class=\"av2-faint\">--</span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!rowsLoading && !rows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ subjectId ? 'There are no audit visits for this filter in the selected period' : 'Open this page from the Dashboard' }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sd-pagination\" *ngIf=\"!rowsLoading && totalCount > pageSize\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"paginationSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"totalCount\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </section>\r\n</div>\r\n\r\n<!-- Change vs the previous period: arrow + % (points for scores) + \"vs last day / previous N days\" -->\r\n<ng-template #deltaTpl let-k let-center=\"center\">\r\n <div class=\"sd-delta\" [class.sd-delta--center]=\"center\" [ngClass]=\"'sd-delta--' + deltaTone(k)\">\r\n <svg *ngIf=\"deltaDir(k) === 'up'\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 16 10 10 14 14 20 8\"></polyline><polyline points=\"15 8 20 8 20 13\"></polyline></svg>\r\n <svg *ngIf=\"deltaDir(k) === 'down'\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 8 10 14 14 10 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n <ng-container *ngIf=\"k.delta !== null; else noPrev\">\r\n <span class=\"sd-delta-val\">{{ deltaText(k) }}</span>\r\n <span class=\"sd-delta-vs\">{{ vsLabel }}</span>\r\n </ng-container>\r\n <ng-template #noPrev><span class=\"sd-delta-vs\" [attr.title]=\"'Nothing was recorded in that period, so there is no change to show'\">{{ noPrevLabel }}</span></ng-template>\r\n </div>\r\n</ng-template>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}::ng-deep .tooltip.av2-tip{--bs-tooltip-bg: #fff;--bs-tooltip-color: #344054;--bs-tooltip-max-width: 320px;--bs-tooltip-opacity: 1}::ng-deep .tooltip.av2-tip .tooltip-inner{background-color:#fff!important;color:#344054!important;padding:8px 12px;border-radius:8px;font-size:13px;line-height:18px;font-weight:500;text-align:left;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,0 0 0 1px #eaecf0}::ng-deep .tooltip.av2-tip .tooltip-arrow:before{border-top-color:#fff;border-bottom-color:#fff}.sd-head{display:flex;align-items:center;gap:16px;padding:14px 20px;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008}.sd-switch{position:relative;z-index:31}.sd-switch.is-open .sd-switch-btn{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #ccedff}.sd-switch.is-open .sd-switch-chev{transform:rotate(180deg)}.sd-switch-btn{display:inline-flex;align-items:center;gap:10px;height:40px;max-width:420px;padding:0 12px 0 14px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;cursor:pointer}.sd-switch-btn:hover{background:#f9fafb}.sd-switch-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;color:#101828}.sd-switch-chev{flex-shrink:0;color:#667085;transition:transform .15s ease}.sd-switch-menu{position:absolute;top:calc(100% + 6px);left:0;width:340px;max-width:90vw;background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;padding:8px;display:flex;flex-direction:column;gap:6px}.sd-switch-search{display:flex;align-items:center;gap:8px;height:36px;padding:0 10px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3}.sd-switch-search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:13px;color:#101828}.sd-switch-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 3px #ccedff}.sd-switch-list{max-height:280px;overflow-y:auto;display:flex;flex-direction:column}.sd-switch-item{display:flex;align-items:center;gap:10px;width:100%;min-height:38px;padding:8px 10px;border:0;border-radius:6px;background:transparent;text-align:left;font:inherit;font-size:14px;color:#344054;cursor:pointer}.sd-switch-item:hover{background:#f9fafb}.sd-switch-item.is-active{background:#f5faff;color:#175cd3;font-weight:600}.sd-switch-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-switch-check{flex-shrink:0;color:#1570ef}.sd-switch-empty{padding:12px 10px;font-size:13px;color:#667085}.sd-switch-backdrop{position:fixed;inset:0;z-index:30}.sd-pubstate{display:inline-flex;align-items:center;gap:6px;padding:2px 10px 2px 8px;border-radius:9999px;background:#f2f4f7;font-size:12px;font-weight:500;color:#344054;white-space:nowrap}.sd-pubstate.is-on{background:#ecfdf3;color:#027a48}.sd-pubdot{width:8px;height:8px;flex-shrink:0;border-radius:9999px;background:#98a2b3}.sd-pubdot.is-on{background:#12b76a}.sd-back{width:38px;height:38px;flex-shrink:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.sd-back:hover{background:#f9fafb;color:#344054}.sd-head-text{display:flex;flex-direction:column;gap:1px}.sd-title{font-size:17px;line-height:26px;font-weight:600;color:#101828}.sd-sub{font-size:13px;color:#667085}.sd-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.sd-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.sd-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.sd-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.sd-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.sd-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.sd-stat-body--2{grid-template-columns:1fr 1fr}.sd-stat-body--3{grid-template-columns:repeat(3,1fr)}.sd-stat-cell{display:flex;flex-direction:column;gap:2px}.sd-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.sd-stat-mid.is-underline{text-decoration:underline}.sd-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.sd-stat-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#d92d20}.sd-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.sd-card-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.sd-card-text{display:flex;flex-direction:column;gap:2px}.sd-card-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.sd-count{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3}.sd-status{width:170px}.sd-search{width:230px}.sd-alert{padding:0 18px;background:#00a3ff;color:#fff}.sd-alert:disabled{background:#99dbff;color:#fff;opacity:1;cursor:not-allowed}.sd-table{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.sd-table thead th{height:auto!important;padding:10px 8px!important;background:#f9fafb!important;border:0!important;font-size:12px!important;line-height:18px;font-weight:500!important;color:#667085!important;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sd-table thead th:first-child{border-radius:8px 0 0 8px;padding-left:16px!important}.sd-table thead th:last-child{border-radius:0 8px 8px 0}.sd-table tbody td{height:auto!important;padding:14px 8px!important;border:0;border-bottom:1px solid #F2F4F7;font-size:14px!important;line-height:20px;font-weight:400!important;color:#344054!important;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.sd-table tbody td:first-child{padding-left:16px!important}.sd-name{display:flex;align-items:center;gap:10px;min-width:0}.sd-avatar{width:30px;height:30px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.sd-pill{display:inline-block;font-size:12px;font-weight:600;border-radius:9999px;padding:3px 10px;white-space:nowrap}.sd-nowrap{white-space:nowrap}.sd-actions{display:flex;align-items:center;gap:12px;white-space:nowrap}.sd-link{font-size:13px;color:#00a3ff;text-decoration:underline;cursor:pointer}.sd-link:hover{color:#009bf3}.sd-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:20px 4px;font-size:13px;color:#475467}.sd-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.sd-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.sd-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.audit-detail :host ::ng-deep lib-pagination{display:block}.audit-detail :host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}.audit-detail :host ::ng-deep lib-pagination .mt-4{margin-top:0!important}.audit-detail :host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}.audit-detail :host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}.audit-detail :host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}.audit-detail :host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}.audit-detail :host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}.audit-detail :host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}.audit-detail :host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination a,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination button,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .current,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination a:hover,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.sd-head{flex-wrap:wrap}.sd-title-row{display:flex;align-items:center;gap:8px}.sd-tag{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#f2f4f7;color:#344054}.sd-avatar--lg{width:40px;height:40px;font-size:14px}.sd-divider{width:1px;height:24px;background:#eaecf0}.sd-chips{display:flex;align-items:center;flex-wrap:wrap;gap:16px}.sd-chip{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:#475467}.sd-chip svg{color:#98a2b3}.sd-overview{display:grid;grid-template-columns:3fr 1.15fr;gap:16px;align-items:stretch}.sd-overview-main{display:grid;grid-template-columns:repeat(6,1fr);grid-template-rows:auto 1fr;gap:16px;align-items:start;min-width:0}.sd-kpi{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;gap:14px}.sd-kpi:not(.sd-kpi--score) .sd-kpi-value{margin-top:auto}.sd-kpi:not(.sd-kpi--score) .sd-delta{margin-bottom:auto}.sd-kpi--score{gap:10px;align-self:stretch}.sd-kpi--score .sd-kpi-value{margin-top:auto}.sd-kpi--score .sd-delta{margin-bottom:auto}.sd-overview-main>.sd-kpi{grid-column:span 2}.sd-overview-main>.sd-kpi--score{grid-column:span 3}.sd-kpi-title{border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;padding:12px;text-align:center;font-size:14px;line-height:20px;font-weight:500;color:#344054}.sd-kpi-label{font-size:14px;font-weight:500;color:#1d2939}.sd-kpi-value{text-align:center;font-size:30px;line-height:38px;font-weight:600;color:#101828}.sd-kpi-value--left{text-align:left}.sd-kpi-value .av2-sk{display:inline-block}.sd-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#667085}.sd-delta--center{justify-content:center}.sd-delta--good svg,.sd-delta--good .sd-delta-val{color:#039855}.sd-delta--bad svg,.sd-delta--bad .sd-delta-val{color:#d92d20}.sd-delta-val{font-weight:600;color:#344054}.sd-stat-cell .sd-delta{margin-top:2px}.sd-cal{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 18px;display:flex;flex-direction:column;gap:10px}.sd-cal-title{display:flex;align-items:center;gap:7px;font-size:17px;font-weight:700;color:#101828}.sd-cal-info{display:flex;color:#98a2b3;cursor:help}.sd-cal-nav{display:flex;align-items:center;justify-content:space-between;color:#667085}.sd-cal-step{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:0;border-radius:6px;background:transparent;color:#667085;cursor:pointer}.sd-cal-step:hover{background:#f9fafb;color:#344054}.sd-cal-month{font-size:16px;font-weight:500;color:#101828}.sd-cal-week,.sd-cal-days{display:grid;grid-template-columns:repeat(7,1fr)}.sd-cal-week{gap:6px 4px;text-align:center;font-size:12px;font-weight:600;color:#475467}.sd-cal-days{gap:4px;justify-items:center}.sd-day{width:30px;height:30px;border-radius:9999px;display:inline-flex;align-items:center;justify-content:center;font-size:13px;font-weight:500;color:#344054}.sd-day--blank{visibility:hidden}.sd-day--track{background:#00a3ff;color:#fff}.sd-day--risk{background:#f79009;color:#fff}.sd-day--missed{background:#f04438;color:#fff}.sd-cal-legend{display:flex;flex-wrap:wrap;gap:14px;font-size:12px;color:#475467}.sd-cal-legend span{display:inline-flex;align-items:center;gap:6px}.sd-dot{width:10px;height:10px;border-radius:9999px;display:inline-block}.sd-dot--track{background:#00a3ff}.sd-dot--risk{background:#f79009}.sd-dot--missed{background:#f04438}.sd-table--store th:nth-child(1){width:17%}.sd-table--store th:nth-child(2){width:8%}.sd-table--store th:nth-child(3){width:20%}.sd-table--store th:nth-child(4){width:12%}.sd-table--store th:nth-child(5){width:9%}.sd-table--store th:nth-child(6){width:5.5%}.sd-table--store th:nth-child(7){width:9%}.sd-table--store th:nth-child(8){width:9%}.sd-table--store th:nth-child(9){width:10.5%}.sd-table--store{min-width:1100px}.sd-table--audit,.sd-table--user{min-width:1320px}.sd-table--audit th:nth-child(1){width:44px}.sd-table--audit th:nth-child(2){width:8%}.sd-table--audit th:nth-child(3){width:8%}.sd-table--audit th:nth-child(4){width:8%}.sd-table--audit th:nth-child(5){width:9%}.sd-table--audit th:nth-child(6){width:13%}.sd-table--audit th:nth-child(7){width:12%}.sd-table--audit th:nth-child(8){width:9%}.sd-table--audit th:nth-child(9){width:5%}.sd-table--audit th:nth-child(10){width:8%}.sd-table--audit th:nth-child(11){width:12%}.sd-table--audit th:nth-child(12){width:8%}.sd-table thead th.sd-check,.sd-table tbody td.sd-check{padding-left:16px!important;padding-right:4px!important;overflow:visible}.sd-cb{appearance:none;-webkit-appearance:none;flex-shrink:0;width:16px;height:16px;margin:0;border:1px solid #D0D5DD;border-radius:4px;background:#fff no-repeat center/12px 12px;cursor:pointer;vertical-align:middle;transition:border-color .12s ease,background-color .12s ease}.sd-cb:hover:not(:disabled){border-color:#00a3ff}.sd-cb:checked{border-color:#00a3ff;background-color:#eaf8ff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2300A3FF' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E\")}.sd-cb:focus-visible{outline:none;box-shadow:0 0 0 3px #eaf8ff}.sd-cb:disabled{cursor:not-allowed;opacity:.45}.sd-table--user th:nth-child(1){width:8%}.sd-table--user th:nth-child(2){width:14%}.sd-table--user th:nth-child(3){width:9%}.sd-table--user th:nth-child(4){width:9%}.sd-table--user th:nth-child(5){width:9%}.sd-table--user th:nth-child(6){width:12%}.sd-table--user th:nth-child(7){width:9%}.sd-table--user th:nth-child(8){width:5%}.sd-table--user th:nth-child(9){width:8%}.sd-table--user th:nth-child(10){width:9%}.sd-table--user th:nth-child(11){width:8%}.sd-pill{display:inline-flex;align-items:center;gap:4px}.sd-link--plain{text-decoration:none}.sd-link--plain:hover{text-decoration:underline}.sd-pagination{padding:4px 0 12px}@media (max-width: 1200px){.sd-overview{grid-template-columns:1fr}.sd-overview-main{grid-template-rows:none}}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i4.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.AuditV2TipDirective, selector: "[av2Tip]", inputs: ["av2Tip"] }, { kind: "component", type: i8.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i9.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }, { kind: "component", type: i10.AuditV2SortIconComponent, selector: "lib-audit-v2-sort-icon", inputs: ["active", "dir"] }] });
523
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2DetailComponent, selector: "lib-audit-v2-detail", host: { listeners: { "document:keydown.escape": "closeSwitch()" } }, ngImport: i0, template: "<div class=\"av2-page audit-detail\">\r\n <!-- Back + title (audit: owner / stores / schedule chips; user: avatar + tag) -->\r\n <div class=\"sd-head\">\r\n <a class=\"sd-back\" routerLink=\"/manage/trax/audit-v2/dashboard\" title=\"Back to dashboard\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\"></line>\r\n <polyline points=\"12 19 5 12 12 5\"></polyline>\r\n </svg>\r\n </a>\r\n <span *ngIf=\"by === 'user'\" class=\"sd-avatar sd-avatar--lg\">{{ initials || '--' }}</span>\r\n <div class=\"sd-head-text\">\r\n <div class=\"sd-title-row\">\r\n <span *ngIf=\"loading && !info\" class=\"av2-sk av2-sk--title\"></span>\r\n <!-- Audit page: the name is a switcher (prototype: name chip with a chevron) + published dot -->\r\n <div *ngIf=\"by === 'audit' && auditOptions.length > 1 && (!loading || info)\" class=\"sd-switch\" [class.is-open]=\"switchOpen\">\r\n <button type=\"button\" class=\"sd-switch-btn\" (click)=\"toggleSwitch()\" [attr.aria-expanded]=\"switchOpen\"\r\n aria-haspopup=\"listbox\" title=\"Switch audit\">\r\n <span class=\"sd-switch-name\">{{ title }}</span>\r\n <svg class=\"sd-switch-chev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"sd-switch-menu\" *ngIf=\"switchOpen\" role=\"listbox\">\r\n <label class=\"sd-switch-search\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\r\n <input type=\"text\" [(ngModel)]=\"switchQuery\" placeholder=\"Search audits\" autocomplete=\"off\">\r\n </label>\r\n <div class=\"sd-switch-list\">\r\n <button type=\"button\" class=\"sd-switch-item\" *ngFor=\"let a of switchFiltered\" role=\"option\"\r\n [class.is-active]=\"a.id === subjectId\" [attr.aria-selected]=\"a.id === subjectId\" (click)=\"switchAudit(a.id)\">\r\n <span class=\"sd-pubdot\" [class.is-on]=\"a.publish\" [title]=\"a.publish ? 'Published' : 'Draft'\"></span>\r\n <span class=\"sd-switch-label\" [title]=\"a.name\">{{ a.name }}</span>\r\n <svg *ngIf=\"a.id === subjectId\" class=\"sd-switch-check\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </button>\r\n <div class=\"sd-switch-empty\" *ngIf=\"!switchFiltered.length\">No audit matches \"{{ switchQuery }}\"</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-switch-backdrop\" *ngIf=\"switchOpen\" (click)=\"closeSwitch()\"></div>\r\n <span *ngIf=\"(by !== 'audit' || auditOptions.length <= 1) && (!loading || info)\" class=\"sd-title\">{{ title }}</span>\r\n <!-- Live state of the audit: Published (green) or Draft (grey) -->\r\n <span *ngIf=\"by === 'audit' && info\" class=\"sd-pubstate\" [class.is-on]=\"info.publish\"\r\n [title]=\"info.publish ? 'This audit is published' : 'This audit is a draft (not published)'\">\r\n <span class=\"sd-pubdot\" [class.is-on]=\"info.publish\"></span>{{ info.publish ? 'Published' : 'Draft' }}\r\n </span>\r\n <span *ngIf=\"by === 'user'\" class=\"sd-tag\">user</span>\r\n </div>\r\n <div class=\"sd-sub\" *ngIf=\"by !== 'audit'\">\r\n <ng-container *ngIf=\"by === 'user' && subjectId\">{{ subjectId }} \u00B7 </ng-container>{{ period }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"by === 'audit' && info\">\r\n <span class=\"sd-divider\"></span>\r\n <div class=\"sd-chips\">\r\n <span class=\"sd-chip\" *ngIf=\"info.owner\" title=\"Audit owner\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"></path><circle cx=\"12\" cy=\"7\" r=\"4\"></circle></svg>\r\n {{ info.owner }}\r\n </span>\r\n <span class=\"sd-chip\" title=\"Assigned stores\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l1-5h16l1 5\"></path><path d=\"M4 9v11h16V9\"></path><path d=\"M9 20v-6h6v6\"></path></svg>\r\n {{ info.stores }} {{ info.stores === 1 ? 'Store' : 'Stores' }}\r\n </span>\r\n <!-- No schedule-type (\"One time\") or audit-level visit-window chip (QA 10 Oct): audits are scheduled by\r\n Schedules, whose rows carry the visit windows. -->\r\n </div>\r\n </ng-container>\r\n <div class=\"av2-grow\"></div>\r\n <span *ngIf=\"by === 'audit'\" class=\"sd-sub\">{{ period }}</span>\r\n <!-- This page's own period (every drill-down page; the header picker is not shown on all of them) -->\r\n <div class=\"av2-datepick sd-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'left'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <!-- Store page: the prototype's three stat blocks -->\r\n <div class=\"sd-stats\" *ngIf=\"by === 'store'\">\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.activeAudits }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Active Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body\">\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.visits }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">Audit Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.notSubmitted }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Not Submitted Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body sd-stat-body--2\">\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.open }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">Open Audits</div>\r\n </div>\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.inprogress }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">In Progress Audits</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.submitted }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Submitted Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body sd-stat-body--3\">\r\n <div class=\"sd-stat-cell\" *ngFor=\"let k of storeKpis\">\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">{{ k.label }}</div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Audit / user pages: count + score cards beside the month calendar -->\r\n <div class=\"sd-overview\" *ngIf=\"by !== 'store'\">\r\n <!-- Cards in their own grid, stretched to the calendar height: the score row takes what the count row leaves. -->\r\n <div class=\"sd-overview-main\">\r\n <div class=\"sd-kpi\" *ngFor=\"let k of countKpis\">\r\n <div class=\"sd-kpi-title\">{{ k.label }}</div>\r\n <div class=\"sd-kpi-value\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k, center: true }\"></ng-container>\r\n </div>\r\n\r\n <!-- Same look as the count cards (prototype): gradient title, centred value and change -->\r\n <div class=\"sd-kpi sd-kpi--score\" *ngFor=\"let k of scoreKpis\">\r\n <div class=\"sd-kpi-title\">{{ k.label }}</div>\r\n <div class=\"sd-kpi-value\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k, center: true }\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sd-cal\">\r\n <div class=\"sd-cal-title\">\r\n Monthly Performance\r\n <span class=\"sd-cal-info\" title=\"Colour shows each day's visits: all submitted and passing, partly done or below the pass mark, or none submitted\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><path d=\"M12 8h.01M11 12h1v4h1\"></path></svg>\r\n </span>\r\n </div>\r\n <div class=\"sd-cal-nav\">\r\n <button type=\"button\" class=\"sd-cal-step\" title=\"Previous month\" (click)=\"shiftMonth(-1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>\r\n </button>\r\n <span class=\"sd-cal-month\">{{ monthLabel }}</span>\r\n <button type=\"button\" class=\"sd-cal-step\" title=\"Next month\" (click)=\"shiftMonth(1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>\r\n </button>\r\n </div>\r\n <div class=\"sd-cal-week\">\r\n <span *ngFor=\"let w of weekdays\">{{ w }}</span>\r\n </div>\r\n <div class=\"sd-cal-days\">\r\n <span *ngFor=\"let i of calendarLead\" class=\"sd-day sd-day--blank\"></span>\r\n <span *ngFor=\"let d of calendarDays; trackBy: trackByDay\" class=\"sd-day\" [ngClass]=\"'sd-day--' + d.status\"\r\n [title]=\"dayTitle(d)\">{{ d.day }}</span>\r\n </div>\r\n <div class=\"sd-cal-legend\">\r\n <span><i class=\"sd-dot sd-dot--track\"></i>On track</span>\r\n <span><i class=\"sd-dot sd-dot--risk\"></i>At risk</span>\r\n <span><i class=\"sd-dot sd-dot--missed\"></i>Missed</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Visits table -->\r\n <section class=\"sd-card\">\r\n <div class=\"sd-card-head\">\r\n <div class=\"sd-card-text\">\r\n <div class=\"sd-card-title\">\r\n Audit Info\r\n <span class=\"sd-count\">{{ totalCount }} Total</span>\r\n </div>\r\n <div class=\"sd-sub\">{{ period }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <lib-audit-v2-select class=\"sd-status\" [(ngModel)]=\"status\" (ngModelChange)=\"onStatus()\" [options]=\"statusOptions\"\r\n ariaLabel=\"Visit status\"></lib-audit-v2-select>\r\n <label class=\"av2-search sd-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"by === 'store' ? 'Search by audit or auditor' : 'Search by store or user'\"\r\n [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\">\r\n </label>\r\n <!-- Send Alert: reminder email to the auditors of the ticked visits that are not submitted -->\r\n <button type=\"button\" class=\"av2-btn sd-alert\" *ngIf=\"by === 'audit' && access.canEdit\"\r\n [disabled]=\"!alertIds.size || alerting\" (click)=\"sendAlert()\"\r\n [title]=\"alertIds.size ? 'Email a reminder to the auditors of the ticked visits' : 'Tick visits that are not submitted yet'\">\r\n {{ alerting ? 'Sending\u2026' : (alertIds.size ? 'Send Alert (' + alertIds.size + ')' : 'Send Alert') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"exporting || !totalCount\" (click)=\"exportRows()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\r\n <polyline points=\"7 10 12 15 17 10\"></polyline>\r\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\r\n </svg>\r\n {{ exporting ? 'Exporting\u2026' : 'Export' }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"rowsLoading\" [rows]=\"6\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"av2-table-wrap\" *ngIf=\"!rowsLoading && rows.length\">\r\n <table class=\"sd-table\" [ngClass]=\"'sd-table--' + by\">\r\n <thead>\r\n <tr>\r\n <th *ngIf=\"by === 'audit'\" class=\"sd-check\">\r\n <input type=\"checkbox\" class=\"sd-cb\" aria-label=\"Select all visits that are not submitted\"\r\n [checked]=\"allAlertable\" [indeterminate]=\"someAlertable\" [disabled]=\"!alertableRows.length\" (change)=\"toggleAllAlert()\">\r\n </th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('date')\">Date <lib-audit-v2-sort-icon [active]=\"sortColumn === 'date'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'audit'\" class=\"av2-sortable\" (click)=\"sortTable('checkListName')\">Audit Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'checkListName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'store'\" class=\"av2-sortable\" (click)=\"sortTable('storeName')\">Store Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'storeName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'store'\" class=\"av2-sortable\" (click)=\"sortTable('userName')\">User Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'userName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('status')\">Status <lib-audit-v2-sort-icon [active]=\"sortColumn === 'status'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'user'\" class=\"av2-sortable\" (click)=\"sortTable('submittedBy')\">Submitted By <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submittedBy'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('submittedOn')\">Submitted On <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submittedOn'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('submissionCount')\">Submission Count <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submissionCount'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('flags')\">Flags <lib-audit-v2-sort-icon [active]=\"sortColumn === 'flags'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('approvedBy')\">Approved By <lib-audit-v2-sort-icon [active]=\"sortColumn === 'approvedBy'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('approvedOn')\">Approved On <lib-audit-v2-sort-icon [active]=\"sortColumn === 'approvedOn'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of rows; trackBy: trackByRow\">\r\n <td *ngIf=\"by === 'audit'\" class=\"sd-check\">\r\n <input type=\"checkbox\" class=\"sd-cb\" [checked]=\"alertIds.has(row.id)\" [disabled]=\"row.status === 'submit'\"\r\n [title]=\"row.status === 'submit' ? 'Already submitted' : 'Select for Send Alert'\" (change)=\"toggleAlert(row)\">\r\n </td>\r\n <td class=\"sd-nowrap\">{{ fmtDate(row.date) }}</td>\r\n <td *ngIf=\"by !== 'audit'\">\r\n <div class=\"sd-name\">\r\n <span class=\"sd-avatar\">{{ rowInitials(row.checkListName) }}</span>\r\n <span class=\"av2-ellipsis\" [av2Tip]=\"row.checkListName\">{{ row.checkListName }}</span>\r\n </div>\r\n </td>\r\n <td *ngIf=\"by !== 'store'\" class=\"av2-ellipsis\">\r\n <a class=\"sd-link sd-link--plain\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.storeId })\" [title]=\"row.storeName || ''\">{{ row.storeName || '\u2014' }}</a>\r\n </td>\r\n <td *ngIf=\"by !== 'store'\" class=\"av2-ellipsis\">\r\n <a *ngIf=\"by !== 'user'\" class=\"sd-link sd-link--plain\" routerLink=\"/manage/trax/audit-v2/dashboard/user\"\r\n [queryParams]=\"detailParams({ email: row.userEmail })\" [title]=\"row.userEmail\">{{ row.userName || row.userEmail }}</a>\r\n <span *ngIf=\"by === 'user'\" [title]=\"row.userEmail\">{{ row.userName || row.userEmail }}</span>\r\n </td>\r\n <td>\r\n <span class=\"sd-pill\" [style.background]=\"statusBg(row)\" [style.color]=\"statusFg(row)\">\r\n <svg *ngIf=\"row.redo\" class=\"sd-redo\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><title>Redo</title><polyline points=\"1 4 1 10 7 10\"></polyline><path d=\"M3.5 15a9 9 0 1 0 2.1-9.4L1 10\"></path></svg>\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td *ngIf=\"by !== 'user'\" class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.userEmail\">{{ row.userEmail || '--' }}</td>\r\n <td class=\"av2-dim sd-nowrap\">{{ fmtTime(row.submittedOn) }}</td>\r\n <td>{{ row.submissionCount }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td class=\"av2-ellipsis\" [class.av2-faint]=\"!row.approvedBy\">{{ row.approvedBy || '--' }}</td>\r\n <td class=\"sd-nowrap\" [class.av2-faint]=\"!row.approvedOn\">{{ fmtTime(row.approvedOn) }}</td>\r\n <td>\r\n <span class=\"sd-actions\" *ngIf=\"row.status === 'submit'\">\r\n <a class=\"sd-link\" routerLink=\"/manage/trax/audit-v2/gallery\" [queryParams]=\"galleryParams(row)\">View</a>\r\n <a class=\"sd-link\" (click)=\"download(row)\">Download</a>\r\n </span>\r\n <span *ngIf=\"row.status !== 'submit'\" class=\"av2-faint\">--</span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!rowsLoading && !rows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ subjectId ? 'There are no audit visits for this filter in the selected period' : 'Open this page from the Dashboard' }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sd-pagination\" *ngIf=\"totalCount\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"paginationSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"totalCount\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </section>\r\n</div>\r\n\r\n<!-- Change vs the previous period: arrow + % (points for scores) + \"vs last day / previous N days\" -->\r\n<ng-template #deltaTpl let-k let-center=\"center\">\r\n <div class=\"sd-delta\" [class.sd-delta--center]=\"center\" [ngClass]=\"'sd-delta--' + deltaTone(k)\">\r\n <svg *ngIf=\"deltaDir(k) === 'up'\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 16 10 10 14 14 20 8\"></polyline><polyline points=\"15 8 20 8 20 13\"></polyline></svg>\r\n <svg *ngIf=\"deltaDir(k) === 'down'\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 8 10 14 14 10 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n <ng-container *ngIf=\"k.delta !== null; else noPrev\">\r\n <span class=\"sd-delta-val\">{{ deltaText(k) }}</span>\r\n <span class=\"sd-delta-vs\">{{ vsLabel }}</span>\r\n </ng-container>\r\n <ng-template #noPrev><span class=\"sd-delta-vs\" [attr.title]=\"'Nothing was recorded in that period, so there is no change to show'\">{{ noPrevLabel }}</span></ng-template>\r\n </div>\r\n</ng-template>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}::ng-deep .tooltip.av2-tip{--bs-tooltip-bg: #fff;--bs-tooltip-color: #344054;--bs-tooltip-max-width: 320px;--bs-tooltip-opacity: 1}::ng-deep .tooltip.av2-tip .tooltip-inner{background-color:#fff!important;color:#344054!important;padding:8px 12px;border-radius:8px;font-size:13px;line-height:18px;font-weight:500;text-align:left;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,0 0 0 1px #eaecf0}::ng-deep .tooltip.av2-tip .tooltip-arrow:before{border-top-color:#fff;border-bottom-color:#fff}.sd-head{display:flex;align-items:center;gap:16px;padding:14px 20px;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008}.sd-switch{position:relative;z-index:31}.sd-switch.is-open .sd-switch-btn{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #ccedff}.sd-switch.is-open .sd-switch-chev{transform:rotate(180deg)}.sd-switch-btn{display:inline-flex;align-items:center;gap:10px;height:40px;max-width:420px;padding:0 12px 0 14px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;cursor:pointer}.sd-switch-btn:hover{background:#f9fafb}.sd-switch-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;color:#101828}.sd-switch-chev{flex-shrink:0;color:#667085;transition:transform .15s ease}.sd-switch-menu{position:absolute;top:calc(100% + 6px);left:0;width:340px;max-width:90vw;background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;padding:8px;display:flex;flex-direction:column;gap:6px}.sd-switch-search{display:flex;align-items:center;gap:8px;height:36px;padding:0 10px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3}.sd-switch-search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:13px;color:#101828}.sd-switch-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 3px #ccedff}.sd-switch-list{max-height:280px;overflow-y:auto;display:flex;flex-direction:column}.sd-switch-item{display:flex;align-items:center;gap:10px;width:100%;min-height:38px;padding:8px 10px;border:0;border-radius:6px;background:transparent;text-align:left;font:inherit;font-size:14px;color:#344054;cursor:pointer}.sd-switch-item:hover{background:#f9fafb}.sd-switch-item.is-active{background:#f5faff;color:#175cd3;font-weight:600}.sd-switch-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-switch-check{flex-shrink:0;color:#1570ef}.sd-switch-empty{padding:12px 10px;font-size:13px;color:#667085}.sd-switch-backdrop{position:fixed;inset:0;z-index:30}.sd-pubstate{display:inline-flex;align-items:center;gap:6px;padding:2px 10px 2px 8px;border-radius:9999px;background:#f2f4f7;font-size:12px;font-weight:500;color:#344054;white-space:nowrap}.sd-pubstate.is-on{background:#ecfdf3;color:#027a48}.sd-pubdot{width:8px;height:8px;flex-shrink:0;border-radius:9999px;background:#98a2b3}.sd-pubdot.is-on{background:#12b76a}.sd-back{width:38px;height:38px;flex-shrink:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.sd-back:hover{background:#f9fafb;color:#344054}.sd-head-text{display:flex;flex-direction:column;gap:1px}.sd-title{font-size:17px;line-height:26px;font-weight:600;color:#101828}.sd-sub{font-size:13px;color:#667085}.sd-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.sd-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.sd-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.sd-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.sd-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.sd-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.sd-stat-body--2{grid-template-columns:1fr 1fr}.sd-stat-body--3{grid-template-columns:repeat(3,1fr)}.sd-stat-cell{display:flex;flex-direction:column;gap:2px}.sd-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.sd-stat-mid.is-underline{text-decoration:underline}.sd-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.sd-stat-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#d92d20}.sd-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.sd-card-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.sd-card-text{display:flex;flex-direction:column;gap:2px}.sd-card-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.sd-count{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3}.sd-status{width:170px}.sd-search{width:230px}.sd-alert{padding:0 18px;background:#00a3ff;color:#fff}.sd-alert:disabled{background:#99dbff;color:#fff;opacity:1;cursor:not-allowed}.sd-table{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.sd-table thead th{height:auto!important;padding:10px 8px!important;background:#f9fafb!important;border:0!important;font-size:12px!important;line-height:18px;font-weight:500!important;color:#667085!important;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sd-table thead th:first-child{border-radius:8px 0 0 8px;padding-left:16px!important}.sd-table thead th:last-child{border-radius:0 8px 8px 0}.sd-table tbody td{height:auto!important;padding:14px 8px!important;border:0;border-bottom:1px solid #F2F4F7;font-size:14px!important;line-height:20px;font-weight:400!important;color:#344054!important;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.sd-table tbody td:first-child{padding-left:16px!important}.sd-name{display:flex;align-items:center;gap:10px;min-width:0}.sd-avatar{width:30px;height:30px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.sd-pill{display:inline-block;font-size:12px;font-weight:600;border-radius:9999px;padding:3px 10px;white-space:nowrap}.sd-nowrap{white-space:nowrap}.sd-actions{display:flex;align-items:center;gap:12px;white-space:nowrap}.sd-link{font-size:13px;color:#00a3ff;text-decoration:underline;cursor:pointer}.sd-link:hover{color:#009bf3}.sd-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:20px 4px;font-size:13px;color:#475467}.sd-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.sd-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.sd-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.audit-detail :host ::ng-deep lib-pagination{display:block}.audit-detail :host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}.audit-detail :host ::ng-deep lib-pagination .mt-4{margin-top:0!important}.audit-detail :host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}.audit-detail :host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}.audit-detail :host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}.audit-detail :host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}.audit-detail :host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}.audit-detail :host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}.audit-detail :host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination a,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination button,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .current,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination a:hover,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.sd-head{flex-wrap:wrap}.sd-title-row{display:flex;align-items:center;gap:8px}.sd-tag{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#f2f4f7;color:#344054}.sd-avatar--lg{width:40px;height:40px;font-size:14px}.sd-divider{width:1px;height:24px;background:#eaecf0}.sd-chips{display:flex;align-items:center;flex-wrap:wrap;gap:16px}.sd-chip{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:#475467}.sd-chip svg{color:#98a2b3}.sd-overview{display:grid;grid-template-columns:3fr 1.15fr;gap:16px;align-items:stretch}.sd-overview-main{display:grid;grid-template-columns:repeat(6,1fr);grid-template-rows:auto 1fr;gap:16px;align-items:start;min-width:0}.sd-kpi{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;gap:14px}.sd-kpi:not(.sd-kpi--score) .sd-kpi-value{margin-top:auto}.sd-kpi:not(.sd-kpi--score) .sd-delta{margin-bottom:auto}.sd-kpi--score{gap:10px;align-self:stretch}.sd-kpi--score .sd-kpi-value{margin-top:auto}.sd-kpi--score .sd-delta{margin-bottom:auto}.sd-overview-main>.sd-kpi{grid-column:span 2}.sd-overview-main>.sd-kpi--score{grid-column:span 3}.sd-kpi-title{border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;padding:12px;text-align:center;font-size:14px;line-height:20px;font-weight:500;color:#344054}.sd-kpi-label{font-size:14px;font-weight:500;color:#1d2939}.sd-kpi-value{text-align:center;font-size:30px;line-height:38px;font-weight:600;color:#101828}.sd-kpi-value--left{text-align:left}.sd-kpi-value .av2-sk{display:inline-block}.sd-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#667085}.sd-delta--center{justify-content:center}.sd-delta--good svg,.sd-delta--good .sd-delta-val{color:#039855}.sd-delta--bad svg,.sd-delta--bad .sd-delta-val{color:#d92d20}.sd-delta-val{font-weight:600;color:#344054}.sd-stat-cell .sd-delta{margin-top:2px}.sd-cal{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 18px;display:flex;flex-direction:column;gap:10px}.sd-cal-title{display:flex;align-items:center;gap:7px;font-size:17px;font-weight:700;color:#101828}.sd-cal-info{display:flex;color:#98a2b3;cursor:help}.sd-cal-nav{display:flex;align-items:center;justify-content:space-between;color:#667085}.sd-cal-step{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:0;border-radius:6px;background:transparent;color:#667085;cursor:pointer}.sd-cal-step:hover{background:#f9fafb;color:#344054}.sd-cal-month{font-size:16px;font-weight:500;color:#101828}.sd-cal-week,.sd-cal-days{display:grid;grid-template-columns:repeat(7,1fr)}.sd-cal-week{gap:6px 4px;text-align:center;font-size:12px;font-weight:600;color:#475467}.sd-cal-days{gap:4px;justify-items:center}.sd-day{width:30px;height:30px;border-radius:9999px;display:inline-flex;align-items:center;justify-content:center;font-size:13px;font-weight:500;color:#344054}.sd-day--blank{visibility:hidden}.sd-day--track{background:#00a3ff;color:#fff}.sd-day--risk{background:#f79009;color:#fff}.sd-day--missed{background:#f04438;color:#fff}.sd-cal-legend{display:flex;flex-wrap:wrap;gap:14px;font-size:12px;color:#475467}.sd-cal-legend span{display:inline-flex;align-items:center;gap:6px}.sd-dot{width:10px;height:10px;border-radius:9999px;display:inline-block}.sd-dot--track{background:#00a3ff}.sd-dot--risk{background:#f79009}.sd-dot--missed{background:#f04438}.sd-table--store th:nth-child(1){width:9%}.sd-table--store th:nth-child(2){width:15%}.sd-table--store th:nth-child(3){width:8%}.sd-table--store th:nth-child(4){width:17%}.sd-table--store th:nth-child(5){width:12%}.sd-table--store th:nth-child(6){width:8%}.sd-table--store th:nth-child(7){width:5.5%}.sd-table--store th:nth-child(8){width:8.5%}.sd-table--store th:nth-child(9){width:9%}.sd-table--store th:nth-child(10){width:8%}.sd-table--store{min-width:1200px}.sd-table--audit,.sd-table--user{min-width:1320px}.sd-table--audit th:nth-child(1){width:44px}.sd-table--audit th:nth-child(2){width:8%}.sd-table--audit th:nth-child(3){width:8%}.sd-table--audit th:nth-child(4){width:8%}.sd-table--audit th:nth-child(5){width:9%}.sd-table--audit th:nth-child(6){width:13%}.sd-table--audit th:nth-child(7){width:12%}.sd-table--audit th:nth-child(8){width:9%}.sd-table--audit th:nth-child(9){width:5%}.sd-table--audit th:nth-child(10){width:8%}.sd-table--audit th:nth-child(11){width:12%}.sd-table--audit th:nth-child(12){width:8%}.sd-table thead th.sd-check,.sd-table tbody td.sd-check{padding-left:16px!important;padding-right:4px!important;overflow:visible}.sd-cb{appearance:none;-webkit-appearance:none;flex-shrink:0;width:16px;height:16px;margin:0;border:1px solid #D0D5DD;border-radius:4px;background:#fff no-repeat center/12px 12px;cursor:pointer;vertical-align:middle;transition:border-color .12s ease,background-color .12s ease}.sd-cb:hover:not(:disabled){border-color:#00a3ff}.sd-cb:checked{border-color:#00a3ff;background-color:#eaf8ff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2300A3FF' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E\")}.sd-cb:focus-visible{outline:none;box-shadow:0 0 0 3px #eaf8ff}.sd-cb:disabled{cursor:not-allowed;opacity:.45}.sd-table--user th:nth-child(1){width:8%}.sd-table--user th:nth-child(2){width:14%}.sd-table--user th:nth-child(3){width:9%}.sd-table--user th:nth-child(4){width:9%}.sd-table--user th:nth-child(5){width:9%}.sd-table--user th:nth-child(6){width:12%}.sd-table--user th:nth-child(7){width:9%}.sd-table--user th:nth-child(8){width:5%}.sd-table--user th:nth-child(9){width:8%}.sd-table--user th:nth-child(10){width:9%}.sd-table--user th:nth-child(11){width:8%}.sd-pill{display:inline-flex;align-items:center;gap:4px}.sd-link--plain{text-decoration:none}.sd-link--plain:hover{text-decoration:underline}.sd-pagination{padding:4px 0 12px}@media (max-width: 1200px){.sd-overview{grid-template-columns:1fr}.sd-overview-main{grid-template-rows:none}}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.sd-datepick{width:230px;flex-shrink:0}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i4.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "directive", type: i8.AuditV2TipDirective, selector: "[av2Tip]", inputs: ["av2Tip"] }, { kind: "component", type: i9.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i10.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }, { kind: "component", type: i11.AuditV2SortIconComponent, selector: "lib-audit-v2-sort-icon", inputs: ["active", "dir"] }] });
493
524
  }
494
525
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2DetailComponent, decorators: [{
495
526
  type: Component,
496
- args: [{ selector: 'lib-audit-v2-detail', template: "<div class=\"av2-page audit-detail\">\r\n <!-- Back + title (audit: owner / stores / schedule chips; user: avatar + tag) -->\r\n <div class=\"sd-head\">\r\n <a class=\"sd-back\" routerLink=\"/manage/trax/audit-v2/dashboard\" title=\"Back to dashboard\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\"></line>\r\n <polyline points=\"12 19 5 12 12 5\"></polyline>\r\n </svg>\r\n </a>\r\n <span *ngIf=\"by === 'user'\" class=\"sd-avatar sd-avatar--lg\">{{ initials || '--' }}</span>\r\n <div class=\"sd-head-text\">\r\n <div class=\"sd-title-row\">\r\n <span *ngIf=\"loading && !info\" class=\"av2-sk av2-sk--title\"></span>\r\n <!-- Audit page: the name is a switcher (prototype: name chip with a chevron) + published dot -->\r\n <div *ngIf=\"by === 'audit' && auditOptions.length > 1 && (!loading || info)\" class=\"sd-switch\" [class.is-open]=\"switchOpen\">\r\n <button type=\"button\" class=\"sd-switch-btn\" (click)=\"toggleSwitch()\" [attr.aria-expanded]=\"switchOpen\"\r\n aria-haspopup=\"listbox\" title=\"Switch audit\">\r\n <span class=\"sd-switch-name\">{{ title }}</span>\r\n <svg class=\"sd-switch-chev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"sd-switch-menu\" *ngIf=\"switchOpen\" role=\"listbox\">\r\n <label class=\"sd-switch-search\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\r\n <input type=\"text\" [(ngModel)]=\"switchQuery\" placeholder=\"Search audits\" autocomplete=\"off\">\r\n </label>\r\n <div class=\"sd-switch-list\">\r\n <button type=\"button\" class=\"sd-switch-item\" *ngFor=\"let a of switchFiltered\" role=\"option\"\r\n [class.is-active]=\"a.id === subjectId\" [attr.aria-selected]=\"a.id === subjectId\" (click)=\"switchAudit(a.id)\">\r\n <span class=\"sd-pubdot\" [class.is-on]=\"a.publish\" [title]=\"a.publish ? 'Published' : 'Draft'\"></span>\r\n <span class=\"sd-switch-label\" [title]=\"a.name\">{{ a.name }}</span>\r\n <svg *ngIf=\"a.id === subjectId\" class=\"sd-switch-check\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </button>\r\n <div class=\"sd-switch-empty\" *ngIf=\"!switchFiltered.length\">No audit matches \"{{ switchQuery }}\"</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-switch-backdrop\" *ngIf=\"switchOpen\" (click)=\"closeSwitch()\"></div>\r\n <span *ngIf=\"(by !== 'audit' || auditOptions.length <= 1) && (!loading || info)\" class=\"sd-title\">{{ title }}</span>\r\n <!-- Live state of the audit: Published (green) or Draft (grey) -->\r\n <span *ngIf=\"by === 'audit' && info\" class=\"sd-pubstate\" [class.is-on]=\"info.publish\"\r\n [title]=\"info.publish ? 'This audit is published' : 'This audit is a draft (not published)'\">\r\n <span class=\"sd-pubdot\" [class.is-on]=\"info.publish\"></span>{{ info.publish ? 'Published' : 'Draft' }}\r\n </span>\r\n <span *ngIf=\"by === 'user'\" class=\"sd-tag\">user</span>\r\n </div>\r\n <div class=\"sd-sub\" *ngIf=\"by !== 'audit'\">\r\n <ng-container *ngIf=\"by === 'user' && subjectId\">{{ subjectId }} \u00B7 </ng-container>{{ period }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"by === 'audit' && info\">\r\n <span class=\"sd-divider\"></span>\r\n <div class=\"sd-chips\">\r\n <span class=\"sd-chip\" *ngIf=\"info.owner\" title=\"Audit owner\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"></path><circle cx=\"12\" cy=\"7\" r=\"4\"></circle></svg>\r\n {{ info.owner }}\r\n </span>\r\n <span class=\"sd-chip\" title=\"Assigned stores\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l1-5h16l1 5\"></path><path d=\"M4 9v11h16V9\"></path><path d=\"M9 20v-6h6v6\"></path></svg>\r\n {{ info.stores }} {{ info.stores === 1 ? 'Store' : 'Stores' }}\r\n </span>\r\n <!-- No schedule-type (\"One time\") or audit-level visit-window chip (QA 10 Oct): audits are scheduled by\r\n Schedules, whose rows carry the visit windows. -->\r\n </div>\r\n </ng-container>\r\n <div class=\"av2-grow\"></div>\r\n <span *ngIf=\"by === 'audit'\" class=\"sd-sub\">{{ period }}</span>\r\n </div>\r\n\r\n <!-- Store page: the prototype's three stat blocks -->\r\n <div class=\"sd-stats\" *ngIf=\"by === 'store'\">\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.activeAudits }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Active Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body\">\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.visits }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">Audit Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.notSubmitted }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Not Submitted Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body sd-stat-body--2\">\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.open }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">Open Audits</div>\r\n </div>\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.inprogress }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">In Progress Audits</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.submitted }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Submitted Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body sd-stat-body--3\">\r\n <div class=\"sd-stat-cell\" *ngFor=\"let k of storeKpis\">\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">{{ k.label }}</div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Audit / user pages: count + score cards beside the month calendar -->\r\n <div class=\"sd-overview\" *ngIf=\"by !== 'store'\">\r\n <!-- Cards in their own grid, stretched to the calendar height: the score row takes what the count row leaves. -->\r\n <div class=\"sd-overview-main\">\r\n <div class=\"sd-kpi\" *ngFor=\"let k of countKpis\">\r\n <div class=\"sd-kpi-title\">{{ k.label }}</div>\r\n <div class=\"sd-kpi-value\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k, center: true }\"></ng-container>\r\n </div>\r\n\r\n <!-- Same look as the count cards (prototype): gradient title, centred value and change -->\r\n <div class=\"sd-kpi sd-kpi--score\" *ngFor=\"let k of scoreKpis\">\r\n <div class=\"sd-kpi-title\">{{ k.label }}</div>\r\n <div class=\"sd-kpi-value\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k, center: true }\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sd-cal\">\r\n <div class=\"sd-cal-title\">\r\n Monthly Performance\r\n <span class=\"sd-cal-info\" title=\"Colour shows each day's visits: all submitted and passing, partly done or below the pass mark, or none submitted\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><path d=\"M12 8h.01M11 12h1v4h1\"></path></svg>\r\n </span>\r\n </div>\r\n <div class=\"sd-cal-nav\">\r\n <button type=\"button\" class=\"sd-cal-step\" title=\"Previous month\" (click)=\"shiftMonth(-1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>\r\n </button>\r\n <span class=\"sd-cal-month\">{{ monthLabel }}</span>\r\n <button type=\"button\" class=\"sd-cal-step\" title=\"Next month\" (click)=\"shiftMonth(1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>\r\n </button>\r\n </div>\r\n <div class=\"sd-cal-week\">\r\n <span *ngFor=\"let w of weekdays\">{{ w }}</span>\r\n </div>\r\n <div class=\"sd-cal-days\">\r\n <span *ngFor=\"let i of calendarLead\" class=\"sd-day sd-day--blank\"></span>\r\n <span *ngFor=\"let d of calendarDays; trackBy: trackByDay\" class=\"sd-day\" [ngClass]=\"'sd-day--' + d.status\"\r\n [title]=\"dayTitle(d)\">{{ d.day }}</span>\r\n </div>\r\n <div class=\"sd-cal-legend\">\r\n <span><i class=\"sd-dot sd-dot--track\"></i>On track</span>\r\n <span><i class=\"sd-dot sd-dot--risk\"></i>At risk</span>\r\n <span><i class=\"sd-dot sd-dot--missed\"></i>Missed</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Visits table -->\r\n <section class=\"sd-card\">\r\n <div class=\"sd-card-head\">\r\n <div class=\"sd-card-text\">\r\n <div class=\"sd-card-title\">\r\n Audit Info\r\n <span class=\"sd-count\">{{ totalCount }} Total</span>\r\n </div>\r\n <div class=\"sd-sub\">{{ period }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <lib-audit-v2-select class=\"sd-status\" [(ngModel)]=\"status\" (ngModelChange)=\"onStatus()\" [options]=\"statusOptions\"\r\n ariaLabel=\"Visit status\"></lib-audit-v2-select>\r\n <label class=\"av2-search sd-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"by === 'store' ? 'Search by audit or auditor' : 'Search by store or user'\"\r\n [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\">\r\n </label>\r\n <!-- Send Alert: reminder email to the auditors of the ticked visits that are not submitted -->\r\n <button type=\"button\" class=\"av2-btn sd-alert\" *ngIf=\"by === 'audit' && access.canEdit\"\r\n [disabled]=\"!alertIds.size || alerting\" (click)=\"sendAlert()\"\r\n [title]=\"alertIds.size ? 'Email a reminder to the auditors of the ticked visits' : 'Tick visits that are not submitted yet'\">\r\n {{ alerting ? 'Sending\u2026' : (alertIds.size ? 'Send Alert (' + alertIds.size + ')' : 'Send Alert') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"exporting || !totalCount\" (click)=\"exportRows()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\r\n <polyline points=\"7 10 12 15 17 10\"></polyline>\r\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\r\n </svg>\r\n {{ exporting ? 'Exporting\u2026' : 'Export' }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"rowsLoading\" [rows]=\"6\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"av2-table-wrap\" *ngIf=\"!rowsLoading && rows.length\">\r\n <table class=\"sd-table\" [ngClass]=\"'sd-table--' + by\">\r\n <thead>\r\n <tr>\r\n <th *ngIf=\"by === 'audit'\" class=\"sd-check\">\r\n <input type=\"checkbox\" class=\"sd-cb\" aria-label=\"Select all visits that are not submitted\"\r\n [checked]=\"allAlertable\" [indeterminate]=\"someAlertable\" [disabled]=\"!alertableRows.length\" (change)=\"toggleAllAlert()\">\r\n </th>\r\n <th *ngIf=\"by !== 'store'\" class=\"av2-sortable\" (click)=\"sortTable('date')\">Date <lib-audit-v2-sort-icon [active]=\"sortColumn === 'date'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'audit'\" class=\"av2-sortable\" (click)=\"sortTable('checkListName')\">Audit Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'checkListName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'store'\" class=\"av2-sortable\" (click)=\"sortTable('storeName')\">Store Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'storeName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'store'\" class=\"av2-sortable\" (click)=\"sortTable('userName')\">User Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'userName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('status')\">Status <lib-audit-v2-sort-icon [active]=\"sortColumn === 'status'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'user'\" class=\"av2-sortable\" (click)=\"sortTable('submittedBy')\">Submitted By <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submittedBy'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('submittedOn')\">Submitted On <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submittedOn'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('submissionCount')\">Submission Count <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submissionCount'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('flags')\">Flags <lib-audit-v2-sort-icon [active]=\"sortColumn === 'flags'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('approvedBy')\">Approved By <lib-audit-v2-sort-icon [active]=\"sortColumn === 'approvedBy'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('approvedOn')\">Approved On <lib-audit-v2-sort-icon [active]=\"sortColumn === 'approvedOn'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of rows; trackBy: trackByRow\">\r\n <td *ngIf=\"by === 'audit'\" class=\"sd-check\">\r\n <input type=\"checkbox\" class=\"sd-cb\" [checked]=\"alertIds.has(row.id)\" [disabled]=\"row.status === 'submit'\"\r\n [title]=\"row.status === 'submit' ? 'Already submitted' : 'Select for Send Alert'\" (change)=\"toggleAlert(row)\">\r\n </td>\r\n <td *ngIf=\"by !== 'store'\" class=\"sd-nowrap\">{{ fmtDate(row.date) }}</td>\r\n <td *ngIf=\"by !== 'audit'\">\r\n <div class=\"sd-name\">\r\n <span class=\"sd-avatar\">{{ rowInitials(row.checkListName) }}</span>\r\n <span class=\"av2-ellipsis\" [av2Tip]=\"row.checkListName\">{{ row.checkListName }}</span>\r\n </div>\r\n </td>\r\n <td *ngIf=\"by !== 'store'\" class=\"av2-ellipsis\">\r\n <a class=\"sd-link sd-link--plain\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.storeId })\" [title]=\"row.storeName || ''\">{{ row.storeName || '\u2014' }}</a>\r\n </td>\r\n <td *ngIf=\"by !== 'store'\" class=\"av2-ellipsis\">\r\n <a *ngIf=\"by !== 'user'\" class=\"sd-link sd-link--plain\" routerLink=\"/manage/trax/audit-v2/dashboard/user\"\r\n [queryParams]=\"detailParams({ email: row.userEmail })\" [title]=\"row.userEmail\">{{ row.userName || row.userEmail }}</a>\r\n <span *ngIf=\"by === 'user'\" [title]=\"row.userEmail\">{{ row.userName || row.userEmail }}</span>\r\n </td>\r\n <td>\r\n <span class=\"sd-pill\" [style.background]=\"statusBg(row)\" [style.color]=\"statusFg(row)\">\r\n <svg *ngIf=\"row.redo\" class=\"sd-redo\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><title>Redo</title><polyline points=\"1 4 1 10 7 10\"></polyline><path d=\"M3.5 15a9 9 0 1 0 2.1-9.4L1 10\"></path></svg>\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td *ngIf=\"by !== 'user'\" class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.userEmail\">{{ row.userEmail || '--' }}</td>\r\n <td class=\"av2-dim sd-nowrap\">{{ fmtTime(row.submittedOn) }}</td>\r\n <td>{{ row.submissionCount }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td class=\"av2-ellipsis\" [class.av2-faint]=\"!row.approvedBy\">{{ row.approvedBy || '--' }}</td>\r\n <td class=\"sd-nowrap\" [class.av2-faint]=\"!row.approvedOn\">{{ fmtTime(row.approvedOn) }}</td>\r\n <td>\r\n <span class=\"sd-actions\" *ngIf=\"row.status === 'submit'\">\r\n <a class=\"sd-link\" routerLink=\"/manage/trax/audit-v2/gallery\" [queryParams]=\"galleryParams(row)\">View</a>\r\n <a class=\"sd-link\" (click)=\"download(row)\">Download</a>\r\n </span>\r\n <span *ngIf=\"row.status !== 'submit'\" class=\"av2-faint\">--</span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!rowsLoading && !rows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ subjectId ? 'There are no audit visits for this filter in the selected period' : 'Open this page from the Dashboard' }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sd-pagination\" *ngIf=\"!rowsLoading && totalCount > pageSize\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"paginationSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"totalCount\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </section>\r\n</div>\r\n\r\n<!-- Change vs the previous period: arrow + % (points for scores) + \"vs last day / previous N days\" -->\r\n<ng-template #deltaTpl let-k let-center=\"center\">\r\n <div class=\"sd-delta\" [class.sd-delta--center]=\"center\" [ngClass]=\"'sd-delta--' + deltaTone(k)\">\r\n <svg *ngIf=\"deltaDir(k) === 'up'\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 16 10 10 14 14 20 8\"></polyline><polyline points=\"15 8 20 8 20 13\"></polyline></svg>\r\n <svg *ngIf=\"deltaDir(k) === 'down'\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 8 10 14 14 10 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n <ng-container *ngIf=\"k.delta !== null; else noPrev\">\r\n <span class=\"sd-delta-val\">{{ deltaText(k) }}</span>\r\n <span class=\"sd-delta-vs\">{{ vsLabel }}</span>\r\n </ng-container>\r\n <ng-template #noPrev><span class=\"sd-delta-vs\" [attr.title]=\"'Nothing was recorded in that period, so there is no change to show'\">{{ noPrevLabel }}</span></ng-template>\r\n </div>\r\n</ng-template>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}::ng-deep .tooltip.av2-tip{--bs-tooltip-bg: #fff;--bs-tooltip-color: #344054;--bs-tooltip-max-width: 320px;--bs-tooltip-opacity: 1}::ng-deep .tooltip.av2-tip .tooltip-inner{background-color:#fff!important;color:#344054!important;padding:8px 12px;border-radius:8px;font-size:13px;line-height:18px;font-weight:500;text-align:left;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,0 0 0 1px #eaecf0}::ng-deep .tooltip.av2-tip .tooltip-arrow:before{border-top-color:#fff;border-bottom-color:#fff}.sd-head{display:flex;align-items:center;gap:16px;padding:14px 20px;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008}.sd-switch{position:relative;z-index:31}.sd-switch.is-open .sd-switch-btn{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #ccedff}.sd-switch.is-open .sd-switch-chev{transform:rotate(180deg)}.sd-switch-btn{display:inline-flex;align-items:center;gap:10px;height:40px;max-width:420px;padding:0 12px 0 14px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;cursor:pointer}.sd-switch-btn:hover{background:#f9fafb}.sd-switch-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;color:#101828}.sd-switch-chev{flex-shrink:0;color:#667085;transition:transform .15s ease}.sd-switch-menu{position:absolute;top:calc(100% + 6px);left:0;width:340px;max-width:90vw;background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;padding:8px;display:flex;flex-direction:column;gap:6px}.sd-switch-search{display:flex;align-items:center;gap:8px;height:36px;padding:0 10px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3}.sd-switch-search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:13px;color:#101828}.sd-switch-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 3px #ccedff}.sd-switch-list{max-height:280px;overflow-y:auto;display:flex;flex-direction:column}.sd-switch-item{display:flex;align-items:center;gap:10px;width:100%;min-height:38px;padding:8px 10px;border:0;border-radius:6px;background:transparent;text-align:left;font:inherit;font-size:14px;color:#344054;cursor:pointer}.sd-switch-item:hover{background:#f9fafb}.sd-switch-item.is-active{background:#f5faff;color:#175cd3;font-weight:600}.sd-switch-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-switch-check{flex-shrink:0;color:#1570ef}.sd-switch-empty{padding:12px 10px;font-size:13px;color:#667085}.sd-switch-backdrop{position:fixed;inset:0;z-index:30}.sd-pubstate{display:inline-flex;align-items:center;gap:6px;padding:2px 10px 2px 8px;border-radius:9999px;background:#f2f4f7;font-size:12px;font-weight:500;color:#344054;white-space:nowrap}.sd-pubstate.is-on{background:#ecfdf3;color:#027a48}.sd-pubdot{width:8px;height:8px;flex-shrink:0;border-radius:9999px;background:#98a2b3}.sd-pubdot.is-on{background:#12b76a}.sd-back{width:38px;height:38px;flex-shrink:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.sd-back:hover{background:#f9fafb;color:#344054}.sd-head-text{display:flex;flex-direction:column;gap:1px}.sd-title{font-size:17px;line-height:26px;font-weight:600;color:#101828}.sd-sub{font-size:13px;color:#667085}.sd-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.sd-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.sd-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.sd-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.sd-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.sd-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.sd-stat-body--2{grid-template-columns:1fr 1fr}.sd-stat-body--3{grid-template-columns:repeat(3,1fr)}.sd-stat-cell{display:flex;flex-direction:column;gap:2px}.sd-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.sd-stat-mid.is-underline{text-decoration:underline}.sd-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.sd-stat-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#d92d20}.sd-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.sd-card-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.sd-card-text{display:flex;flex-direction:column;gap:2px}.sd-card-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.sd-count{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3}.sd-status{width:170px}.sd-search{width:230px}.sd-alert{padding:0 18px;background:#00a3ff;color:#fff}.sd-alert:disabled{background:#99dbff;color:#fff;opacity:1;cursor:not-allowed}.sd-table{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.sd-table thead th{height:auto!important;padding:10px 8px!important;background:#f9fafb!important;border:0!important;font-size:12px!important;line-height:18px;font-weight:500!important;color:#667085!important;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sd-table thead th:first-child{border-radius:8px 0 0 8px;padding-left:16px!important}.sd-table thead th:last-child{border-radius:0 8px 8px 0}.sd-table tbody td{height:auto!important;padding:14px 8px!important;border:0;border-bottom:1px solid #F2F4F7;font-size:14px!important;line-height:20px;font-weight:400!important;color:#344054!important;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.sd-table tbody td:first-child{padding-left:16px!important}.sd-name{display:flex;align-items:center;gap:10px;min-width:0}.sd-avatar{width:30px;height:30px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.sd-pill{display:inline-block;font-size:12px;font-weight:600;border-radius:9999px;padding:3px 10px;white-space:nowrap}.sd-nowrap{white-space:nowrap}.sd-actions{display:flex;align-items:center;gap:12px;white-space:nowrap}.sd-link{font-size:13px;color:#00a3ff;text-decoration:underline;cursor:pointer}.sd-link:hover{color:#009bf3}.sd-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:20px 4px;font-size:13px;color:#475467}.sd-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.sd-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.sd-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.audit-detail :host ::ng-deep lib-pagination{display:block}.audit-detail :host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}.audit-detail :host ::ng-deep lib-pagination .mt-4{margin-top:0!important}.audit-detail :host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}.audit-detail :host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}.audit-detail :host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}.audit-detail :host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}.audit-detail :host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}.audit-detail :host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}.audit-detail :host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination a,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination button,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .current,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination a:hover,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.sd-head{flex-wrap:wrap}.sd-title-row{display:flex;align-items:center;gap:8px}.sd-tag{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#f2f4f7;color:#344054}.sd-avatar--lg{width:40px;height:40px;font-size:14px}.sd-divider{width:1px;height:24px;background:#eaecf0}.sd-chips{display:flex;align-items:center;flex-wrap:wrap;gap:16px}.sd-chip{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:#475467}.sd-chip svg{color:#98a2b3}.sd-overview{display:grid;grid-template-columns:3fr 1.15fr;gap:16px;align-items:stretch}.sd-overview-main{display:grid;grid-template-columns:repeat(6,1fr);grid-template-rows:auto 1fr;gap:16px;align-items:start;min-width:0}.sd-kpi{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;gap:14px}.sd-kpi:not(.sd-kpi--score) .sd-kpi-value{margin-top:auto}.sd-kpi:not(.sd-kpi--score) .sd-delta{margin-bottom:auto}.sd-kpi--score{gap:10px;align-self:stretch}.sd-kpi--score .sd-kpi-value{margin-top:auto}.sd-kpi--score .sd-delta{margin-bottom:auto}.sd-overview-main>.sd-kpi{grid-column:span 2}.sd-overview-main>.sd-kpi--score{grid-column:span 3}.sd-kpi-title{border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;padding:12px;text-align:center;font-size:14px;line-height:20px;font-weight:500;color:#344054}.sd-kpi-label{font-size:14px;font-weight:500;color:#1d2939}.sd-kpi-value{text-align:center;font-size:30px;line-height:38px;font-weight:600;color:#101828}.sd-kpi-value--left{text-align:left}.sd-kpi-value .av2-sk{display:inline-block}.sd-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#667085}.sd-delta--center{justify-content:center}.sd-delta--good svg,.sd-delta--good .sd-delta-val{color:#039855}.sd-delta--bad svg,.sd-delta--bad .sd-delta-val{color:#d92d20}.sd-delta-val{font-weight:600;color:#344054}.sd-stat-cell .sd-delta{margin-top:2px}.sd-cal{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 18px;display:flex;flex-direction:column;gap:10px}.sd-cal-title{display:flex;align-items:center;gap:7px;font-size:17px;font-weight:700;color:#101828}.sd-cal-info{display:flex;color:#98a2b3;cursor:help}.sd-cal-nav{display:flex;align-items:center;justify-content:space-between;color:#667085}.sd-cal-step{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:0;border-radius:6px;background:transparent;color:#667085;cursor:pointer}.sd-cal-step:hover{background:#f9fafb;color:#344054}.sd-cal-month{font-size:16px;font-weight:500;color:#101828}.sd-cal-week,.sd-cal-days{display:grid;grid-template-columns:repeat(7,1fr)}.sd-cal-week{gap:6px 4px;text-align:center;font-size:12px;font-weight:600;color:#475467}.sd-cal-days{gap:4px;justify-items:center}.sd-day{width:30px;height:30px;border-radius:9999px;display:inline-flex;align-items:center;justify-content:center;font-size:13px;font-weight:500;color:#344054}.sd-day--blank{visibility:hidden}.sd-day--track{background:#00a3ff;color:#fff}.sd-day--risk{background:#f79009;color:#fff}.sd-day--missed{background:#f04438;color:#fff}.sd-cal-legend{display:flex;flex-wrap:wrap;gap:14px;font-size:12px;color:#475467}.sd-cal-legend span{display:inline-flex;align-items:center;gap:6px}.sd-dot{width:10px;height:10px;border-radius:9999px;display:inline-block}.sd-dot--track{background:#00a3ff}.sd-dot--risk{background:#f79009}.sd-dot--missed{background:#f04438}.sd-table--store th:nth-child(1){width:17%}.sd-table--store th:nth-child(2){width:8%}.sd-table--store th:nth-child(3){width:20%}.sd-table--store th:nth-child(4){width:12%}.sd-table--store th:nth-child(5){width:9%}.sd-table--store th:nth-child(6){width:5.5%}.sd-table--store th:nth-child(7){width:9%}.sd-table--store th:nth-child(8){width:9%}.sd-table--store th:nth-child(9){width:10.5%}.sd-table--store{min-width:1100px}.sd-table--audit,.sd-table--user{min-width:1320px}.sd-table--audit th:nth-child(1){width:44px}.sd-table--audit th:nth-child(2){width:8%}.sd-table--audit th:nth-child(3){width:8%}.sd-table--audit th:nth-child(4){width:8%}.sd-table--audit th:nth-child(5){width:9%}.sd-table--audit th:nth-child(6){width:13%}.sd-table--audit th:nth-child(7){width:12%}.sd-table--audit th:nth-child(8){width:9%}.sd-table--audit th:nth-child(9){width:5%}.sd-table--audit th:nth-child(10){width:8%}.sd-table--audit th:nth-child(11){width:12%}.sd-table--audit th:nth-child(12){width:8%}.sd-table thead th.sd-check,.sd-table tbody td.sd-check{padding-left:16px!important;padding-right:4px!important;overflow:visible}.sd-cb{appearance:none;-webkit-appearance:none;flex-shrink:0;width:16px;height:16px;margin:0;border:1px solid #D0D5DD;border-radius:4px;background:#fff no-repeat center/12px 12px;cursor:pointer;vertical-align:middle;transition:border-color .12s ease,background-color .12s ease}.sd-cb:hover:not(:disabled){border-color:#00a3ff}.sd-cb:checked{border-color:#00a3ff;background-color:#eaf8ff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2300A3FF' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E\")}.sd-cb:focus-visible{outline:none;box-shadow:0 0 0 3px #eaf8ff}.sd-cb:disabled{cursor:not-allowed;opacity:.45}.sd-table--user th:nth-child(1){width:8%}.sd-table--user th:nth-child(2){width:14%}.sd-table--user th:nth-child(3){width:9%}.sd-table--user th:nth-child(4){width:9%}.sd-table--user th:nth-child(5){width:9%}.sd-table--user th:nth-child(6){width:12%}.sd-table--user th:nth-child(7){width:9%}.sd-table--user th:nth-child(8){width:5%}.sd-table--user th:nth-child(9){width:8%}.sd-table--user th:nth-child(10){width:9%}.sd-table--user th:nth-child(11){width:8%}.sd-pill{display:inline-flex;align-items:center;gap:4px}.sd-link--plain{text-decoration:none}.sd-link--plain:hover{text-decoration:underline}.sd-pagination{padding:4px 0 12px}@media (max-width: 1200px){.sd-overview{grid-template-columns:1fr}.sd-overview-main{grid-template-rows:none}}\n"] }]
527
+ args: [{ selector: 'lib-audit-v2-detail', template: "<div class=\"av2-page audit-detail\">\r\n <!-- Back + title (audit: owner / stores / schedule chips; user: avatar + tag) -->\r\n <div class=\"sd-head\">\r\n <a class=\"sd-back\" routerLink=\"/manage/trax/audit-v2/dashboard\" title=\"Back to dashboard\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\"></line>\r\n <polyline points=\"12 19 5 12 12 5\"></polyline>\r\n </svg>\r\n </a>\r\n <span *ngIf=\"by === 'user'\" class=\"sd-avatar sd-avatar--lg\">{{ initials || '--' }}</span>\r\n <div class=\"sd-head-text\">\r\n <div class=\"sd-title-row\">\r\n <span *ngIf=\"loading && !info\" class=\"av2-sk av2-sk--title\"></span>\r\n <!-- Audit page: the name is a switcher (prototype: name chip with a chevron) + published dot -->\r\n <div *ngIf=\"by === 'audit' && auditOptions.length > 1 && (!loading || info)\" class=\"sd-switch\" [class.is-open]=\"switchOpen\">\r\n <button type=\"button\" class=\"sd-switch-btn\" (click)=\"toggleSwitch()\" [attr.aria-expanded]=\"switchOpen\"\r\n aria-haspopup=\"listbox\" title=\"Switch audit\">\r\n <span class=\"sd-switch-name\">{{ title }}</span>\r\n <svg class=\"sd-switch-chev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"sd-switch-menu\" *ngIf=\"switchOpen\" role=\"listbox\">\r\n <label class=\"sd-switch-search\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\r\n <input type=\"text\" [(ngModel)]=\"switchQuery\" placeholder=\"Search audits\" autocomplete=\"off\">\r\n </label>\r\n <div class=\"sd-switch-list\">\r\n <button type=\"button\" class=\"sd-switch-item\" *ngFor=\"let a of switchFiltered\" role=\"option\"\r\n [class.is-active]=\"a.id === subjectId\" [attr.aria-selected]=\"a.id === subjectId\" (click)=\"switchAudit(a.id)\">\r\n <span class=\"sd-pubdot\" [class.is-on]=\"a.publish\" [title]=\"a.publish ? 'Published' : 'Draft'\"></span>\r\n <span class=\"sd-switch-label\" [title]=\"a.name\">{{ a.name }}</span>\r\n <svg *ngIf=\"a.id === subjectId\" class=\"sd-switch-check\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </button>\r\n <div class=\"sd-switch-empty\" *ngIf=\"!switchFiltered.length\">No audit matches \"{{ switchQuery }}\"</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-switch-backdrop\" *ngIf=\"switchOpen\" (click)=\"closeSwitch()\"></div>\r\n <span *ngIf=\"(by !== 'audit' || auditOptions.length <= 1) && (!loading || info)\" class=\"sd-title\">{{ title }}</span>\r\n <!-- Live state of the audit: Published (green) or Draft (grey) -->\r\n <span *ngIf=\"by === 'audit' && info\" class=\"sd-pubstate\" [class.is-on]=\"info.publish\"\r\n [title]=\"info.publish ? 'This audit is published' : 'This audit is a draft (not published)'\">\r\n <span class=\"sd-pubdot\" [class.is-on]=\"info.publish\"></span>{{ info.publish ? 'Published' : 'Draft' }}\r\n </span>\r\n <span *ngIf=\"by === 'user'\" class=\"sd-tag\">user</span>\r\n </div>\r\n <div class=\"sd-sub\" *ngIf=\"by !== 'audit'\">\r\n <ng-container *ngIf=\"by === 'user' && subjectId\">{{ subjectId }} \u00B7 </ng-container>{{ period }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"by === 'audit' && info\">\r\n <span class=\"sd-divider\"></span>\r\n <div class=\"sd-chips\">\r\n <span class=\"sd-chip\" *ngIf=\"info.owner\" title=\"Audit owner\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"></path><circle cx=\"12\" cy=\"7\" r=\"4\"></circle></svg>\r\n {{ info.owner }}\r\n </span>\r\n <span class=\"sd-chip\" title=\"Assigned stores\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l1-5h16l1 5\"></path><path d=\"M4 9v11h16V9\"></path><path d=\"M9 20v-6h6v6\"></path></svg>\r\n {{ info.stores }} {{ info.stores === 1 ? 'Store' : 'Stores' }}\r\n </span>\r\n <!-- No schedule-type (\"One time\") or audit-level visit-window chip (QA 10 Oct): audits are scheduled by\r\n Schedules, whose rows carry the visit windows. -->\r\n </div>\r\n </ng-container>\r\n <div class=\"av2-grow\"></div>\r\n <span *ngIf=\"by === 'audit'\" class=\"sd-sub\">{{ period }}</span>\r\n <!-- This page's own period (every drill-down page; the header picker is not shown on all of them) -->\r\n <div class=\"av2-datepick sd-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'left'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <!-- Store page: the prototype's three stat blocks -->\r\n <div class=\"sd-stats\" *ngIf=\"by === 'store'\">\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.activeAudits }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Active Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body\">\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.visits }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">Audit Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.notSubmitted }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Not Submitted Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body sd-stat-body--2\">\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.open }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">Open Audits</div>\r\n </div>\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.inprogress }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">In Progress Audits</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.submitted }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Submitted Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body sd-stat-body--3\">\r\n <div class=\"sd-stat-cell\" *ngFor=\"let k of storeKpis\">\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">{{ k.label }}</div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Audit / user pages: count + score cards beside the month calendar -->\r\n <div class=\"sd-overview\" *ngIf=\"by !== 'store'\">\r\n <!-- Cards in their own grid, stretched to the calendar height: the score row takes what the count row leaves. -->\r\n <div class=\"sd-overview-main\">\r\n <div class=\"sd-kpi\" *ngFor=\"let k of countKpis\">\r\n <div class=\"sd-kpi-title\">{{ k.label }}</div>\r\n <div class=\"sd-kpi-value\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k, center: true }\"></ng-container>\r\n </div>\r\n\r\n <!-- Same look as the count cards (prototype): gradient title, centred value and change -->\r\n <div class=\"sd-kpi sd-kpi--score\" *ngFor=\"let k of scoreKpis\">\r\n <div class=\"sd-kpi-title\">{{ k.label }}</div>\r\n <div class=\"sd-kpi-value\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k, center: true }\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sd-cal\">\r\n <div class=\"sd-cal-title\">\r\n Monthly Performance\r\n <span class=\"sd-cal-info\" title=\"Colour shows each day's visits: all submitted and passing, partly done or below the pass mark, or none submitted\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><path d=\"M12 8h.01M11 12h1v4h1\"></path></svg>\r\n </span>\r\n </div>\r\n <div class=\"sd-cal-nav\">\r\n <button type=\"button\" class=\"sd-cal-step\" title=\"Previous month\" (click)=\"shiftMonth(-1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>\r\n </button>\r\n <span class=\"sd-cal-month\">{{ monthLabel }}</span>\r\n <button type=\"button\" class=\"sd-cal-step\" title=\"Next month\" (click)=\"shiftMonth(1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>\r\n </button>\r\n </div>\r\n <div class=\"sd-cal-week\">\r\n <span *ngFor=\"let w of weekdays\">{{ w }}</span>\r\n </div>\r\n <div class=\"sd-cal-days\">\r\n <span *ngFor=\"let i of calendarLead\" class=\"sd-day sd-day--blank\"></span>\r\n <span *ngFor=\"let d of calendarDays; trackBy: trackByDay\" class=\"sd-day\" [ngClass]=\"'sd-day--' + d.status\"\r\n [title]=\"dayTitle(d)\">{{ d.day }}</span>\r\n </div>\r\n <div class=\"sd-cal-legend\">\r\n <span><i class=\"sd-dot sd-dot--track\"></i>On track</span>\r\n <span><i class=\"sd-dot sd-dot--risk\"></i>At risk</span>\r\n <span><i class=\"sd-dot sd-dot--missed\"></i>Missed</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Visits table -->\r\n <section class=\"sd-card\">\r\n <div class=\"sd-card-head\">\r\n <div class=\"sd-card-text\">\r\n <div class=\"sd-card-title\">\r\n Audit Info\r\n <span class=\"sd-count\">{{ totalCount }} Total</span>\r\n </div>\r\n <div class=\"sd-sub\">{{ period }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <lib-audit-v2-select class=\"sd-status\" [(ngModel)]=\"status\" (ngModelChange)=\"onStatus()\" [options]=\"statusOptions\"\r\n ariaLabel=\"Visit status\"></lib-audit-v2-select>\r\n <label class=\"av2-search sd-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"by === 'store' ? 'Search by audit or auditor' : 'Search by store or user'\"\r\n [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\">\r\n </label>\r\n <!-- Send Alert: reminder email to the auditors of the ticked visits that are not submitted -->\r\n <button type=\"button\" class=\"av2-btn sd-alert\" *ngIf=\"by === 'audit' && access.canEdit\"\r\n [disabled]=\"!alertIds.size || alerting\" (click)=\"sendAlert()\"\r\n [title]=\"alertIds.size ? 'Email a reminder to the auditors of the ticked visits' : 'Tick visits that are not submitted yet'\">\r\n {{ alerting ? 'Sending\u2026' : (alertIds.size ? 'Send Alert (' + alertIds.size + ')' : 'Send Alert') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"exporting || !totalCount\" (click)=\"exportRows()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\r\n <polyline points=\"7 10 12 15 17 10\"></polyline>\r\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\r\n </svg>\r\n {{ exporting ? 'Exporting\u2026' : 'Export' }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"rowsLoading\" [rows]=\"6\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"av2-table-wrap\" *ngIf=\"!rowsLoading && rows.length\">\r\n <table class=\"sd-table\" [ngClass]=\"'sd-table--' + by\">\r\n <thead>\r\n <tr>\r\n <th *ngIf=\"by === 'audit'\" class=\"sd-check\">\r\n <input type=\"checkbox\" class=\"sd-cb\" aria-label=\"Select all visits that are not submitted\"\r\n [checked]=\"allAlertable\" [indeterminate]=\"someAlertable\" [disabled]=\"!alertableRows.length\" (change)=\"toggleAllAlert()\">\r\n </th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('date')\">Date <lib-audit-v2-sort-icon [active]=\"sortColumn === 'date'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'audit'\" class=\"av2-sortable\" (click)=\"sortTable('checkListName')\">Audit Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'checkListName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'store'\" class=\"av2-sortable\" (click)=\"sortTable('storeName')\">Store Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'storeName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'store'\" class=\"av2-sortable\" (click)=\"sortTable('userName')\">User Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'userName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('status')\">Status <lib-audit-v2-sort-icon [active]=\"sortColumn === 'status'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'user'\" class=\"av2-sortable\" (click)=\"sortTable('submittedBy')\">Submitted By <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submittedBy'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('submittedOn')\">Submitted On <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submittedOn'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('submissionCount')\">Submission Count <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submissionCount'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('flags')\">Flags <lib-audit-v2-sort-icon [active]=\"sortColumn === 'flags'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('approvedBy')\">Approved By <lib-audit-v2-sort-icon [active]=\"sortColumn === 'approvedBy'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('approvedOn')\">Approved On <lib-audit-v2-sort-icon [active]=\"sortColumn === 'approvedOn'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of rows; trackBy: trackByRow\">\r\n <td *ngIf=\"by === 'audit'\" class=\"sd-check\">\r\n <input type=\"checkbox\" class=\"sd-cb\" [checked]=\"alertIds.has(row.id)\" [disabled]=\"row.status === 'submit'\"\r\n [title]=\"row.status === 'submit' ? 'Already submitted' : 'Select for Send Alert'\" (change)=\"toggleAlert(row)\">\r\n </td>\r\n <td class=\"sd-nowrap\">{{ fmtDate(row.date) }}</td>\r\n <td *ngIf=\"by !== 'audit'\">\r\n <div class=\"sd-name\">\r\n <span class=\"sd-avatar\">{{ rowInitials(row.checkListName) }}</span>\r\n <span class=\"av2-ellipsis\" [av2Tip]=\"row.checkListName\">{{ row.checkListName }}</span>\r\n </div>\r\n </td>\r\n <td *ngIf=\"by !== 'store'\" class=\"av2-ellipsis\">\r\n <a class=\"sd-link sd-link--plain\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.storeId })\" [title]=\"row.storeName || ''\">{{ row.storeName || '\u2014' }}</a>\r\n </td>\r\n <td *ngIf=\"by !== 'store'\" class=\"av2-ellipsis\">\r\n <a *ngIf=\"by !== 'user'\" class=\"sd-link sd-link--plain\" routerLink=\"/manage/trax/audit-v2/dashboard/user\"\r\n [queryParams]=\"detailParams({ email: row.userEmail })\" [title]=\"row.userEmail\">{{ row.userName || row.userEmail }}</a>\r\n <span *ngIf=\"by === 'user'\" [title]=\"row.userEmail\">{{ row.userName || row.userEmail }}</span>\r\n </td>\r\n <td>\r\n <span class=\"sd-pill\" [style.background]=\"statusBg(row)\" [style.color]=\"statusFg(row)\">\r\n <svg *ngIf=\"row.redo\" class=\"sd-redo\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><title>Redo</title><polyline points=\"1 4 1 10 7 10\"></polyline><path d=\"M3.5 15a9 9 0 1 0 2.1-9.4L1 10\"></path></svg>\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td *ngIf=\"by !== 'user'\" class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.userEmail\">{{ row.userEmail || '--' }}</td>\r\n <td class=\"av2-dim sd-nowrap\">{{ fmtTime(row.submittedOn) }}</td>\r\n <td>{{ row.submissionCount }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td class=\"av2-ellipsis\" [class.av2-faint]=\"!row.approvedBy\">{{ row.approvedBy || '--' }}</td>\r\n <td class=\"sd-nowrap\" [class.av2-faint]=\"!row.approvedOn\">{{ fmtTime(row.approvedOn) }}</td>\r\n <td>\r\n <span class=\"sd-actions\" *ngIf=\"row.status === 'submit'\">\r\n <a class=\"sd-link\" routerLink=\"/manage/trax/audit-v2/gallery\" [queryParams]=\"galleryParams(row)\">View</a>\r\n <a class=\"sd-link\" (click)=\"download(row)\">Download</a>\r\n </span>\r\n <span *ngIf=\"row.status !== 'submit'\" class=\"av2-faint\">--</span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!rowsLoading && !rows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ subjectId ? 'There are no audit visits for this filter in the selected period' : 'Open this page from the Dashboard' }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sd-pagination\" *ngIf=\"totalCount\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"paginationSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"totalCount\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </section>\r\n</div>\r\n\r\n<!-- Change vs the previous period: arrow + % (points for scores) + \"vs last day / previous N days\" -->\r\n<ng-template #deltaTpl let-k let-center=\"center\">\r\n <div class=\"sd-delta\" [class.sd-delta--center]=\"center\" [ngClass]=\"'sd-delta--' + deltaTone(k)\">\r\n <svg *ngIf=\"deltaDir(k) === 'up'\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 16 10 10 14 14 20 8\"></polyline><polyline points=\"15 8 20 8 20 13\"></polyline></svg>\r\n <svg *ngIf=\"deltaDir(k) === 'down'\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 8 10 14 14 10 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n <ng-container *ngIf=\"k.delta !== null; else noPrev\">\r\n <span class=\"sd-delta-val\">{{ deltaText(k) }}</span>\r\n <span class=\"sd-delta-vs\">{{ vsLabel }}</span>\r\n </ng-container>\r\n <ng-template #noPrev><span class=\"sd-delta-vs\" [attr.title]=\"'Nothing was recorded in that period, so there is no change to show'\">{{ noPrevLabel }}</span></ng-template>\r\n </div>\r\n</ng-template>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}::ng-deep .tooltip.av2-tip{--bs-tooltip-bg: #fff;--bs-tooltip-color: #344054;--bs-tooltip-max-width: 320px;--bs-tooltip-opacity: 1}::ng-deep .tooltip.av2-tip .tooltip-inner{background-color:#fff!important;color:#344054!important;padding:8px 12px;border-radius:8px;font-size:13px;line-height:18px;font-weight:500;text-align:left;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,0 0 0 1px #eaecf0}::ng-deep .tooltip.av2-tip .tooltip-arrow:before{border-top-color:#fff;border-bottom-color:#fff}.sd-head{display:flex;align-items:center;gap:16px;padding:14px 20px;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008}.sd-switch{position:relative;z-index:31}.sd-switch.is-open .sd-switch-btn{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #ccedff}.sd-switch.is-open .sd-switch-chev{transform:rotate(180deg)}.sd-switch-btn{display:inline-flex;align-items:center;gap:10px;height:40px;max-width:420px;padding:0 12px 0 14px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;cursor:pointer}.sd-switch-btn:hover{background:#f9fafb}.sd-switch-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;color:#101828}.sd-switch-chev{flex-shrink:0;color:#667085;transition:transform .15s ease}.sd-switch-menu{position:absolute;top:calc(100% + 6px);left:0;width:340px;max-width:90vw;background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;padding:8px;display:flex;flex-direction:column;gap:6px}.sd-switch-search{display:flex;align-items:center;gap:8px;height:36px;padding:0 10px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3}.sd-switch-search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:13px;color:#101828}.sd-switch-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 3px #ccedff}.sd-switch-list{max-height:280px;overflow-y:auto;display:flex;flex-direction:column}.sd-switch-item{display:flex;align-items:center;gap:10px;width:100%;min-height:38px;padding:8px 10px;border:0;border-radius:6px;background:transparent;text-align:left;font:inherit;font-size:14px;color:#344054;cursor:pointer}.sd-switch-item:hover{background:#f9fafb}.sd-switch-item.is-active{background:#f5faff;color:#175cd3;font-weight:600}.sd-switch-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-switch-check{flex-shrink:0;color:#1570ef}.sd-switch-empty{padding:12px 10px;font-size:13px;color:#667085}.sd-switch-backdrop{position:fixed;inset:0;z-index:30}.sd-pubstate{display:inline-flex;align-items:center;gap:6px;padding:2px 10px 2px 8px;border-radius:9999px;background:#f2f4f7;font-size:12px;font-weight:500;color:#344054;white-space:nowrap}.sd-pubstate.is-on{background:#ecfdf3;color:#027a48}.sd-pubdot{width:8px;height:8px;flex-shrink:0;border-radius:9999px;background:#98a2b3}.sd-pubdot.is-on{background:#12b76a}.sd-back{width:38px;height:38px;flex-shrink:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.sd-back:hover{background:#f9fafb;color:#344054}.sd-head-text{display:flex;flex-direction:column;gap:1px}.sd-title{font-size:17px;line-height:26px;font-weight:600;color:#101828}.sd-sub{font-size:13px;color:#667085}.sd-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.sd-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.sd-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.sd-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.sd-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.sd-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.sd-stat-body--2{grid-template-columns:1fr 1fr}.sd-stat-body--3{grid-template-columns:repeat(3,1fr)}.sd-stat-cell{display:flex;flex-direction:column;gap:2px}.sd-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.sd-stat-mid.is-underline{text-decoration:underline}.sd-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.sd-stat-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#d92d20}.sd-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.sd-card-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.sd-card-text{display:flex;flex-direction:column;gap:2px}.sd-card-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.sd-count{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3}.sd-status{width:170px}.sd-search{width:230px}.sd-alert{padding:0 18px;background:#00a3ff;color:#fff}.sd-alert:disabled{background:#99dbff;color:#fff;opacity:1;cursor:not-allowed}.sd-table{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.sd-table thead th{height:auto!important;padding:10px 8px!important;background:#f9fafb!important;border:0!important;font-size:12px!important;line-height:18px;font-weight:500!important;color:#667085!important;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sd-table thead th:first-child{border-radius:8px 0 0 8px;padding-left:16px!important}.sd-table thead th:last-child{border-radius:0 8px 8px 0}.sd-table tbody td{height:auto!important;padding:14px 8px!important;border:0;border-bottom:1px solid #F2F4F7;font-size:14px!important;line-height:20px;font-weight:400!important;color:#344054!important;vertical-align:middle;overflow:hidden;text-overflow:ellipsis}.sd-table tbody td:first-child{padding-left:16px!important}.sd-name{display:flex;align-items:center;gap:10px;min-width:0}.sd-avatar{width:30px;height:30px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.sd-pill{display:inline-block;font-size:12px;font-weight:600;border-radius:9999px;padding:3px 10px;white-space:nowrap}.sd-nowrap{white-space:nowrap}.sd-actions{display:flex;align-items:center;gap:12px;white-space:nowrap}.sd-link{font-size:13px;color:#00a3ff;text-decoration:underline;cursor:pointer}.sd-link:hover{color:#009bf3}.sd-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:20px 4px;font-size:13px;color:#475467}.sd-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.sd-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.sd-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.audit-detail :host ::ng-deep lib-pagination{display:block}.audit-detail :host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}.audit-detail :host ::ng-deep lib-pagination .mt-4{margin-top:0!important}.audit-detail :host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}.audit-detail :host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}.audit-detail :host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}.audit-detail :host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}.audit-detail :host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}.audit-detail :host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}.audit-detail :host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination a,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination button,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .current,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination a:hover,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}.audit-detail :host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.sd-head{flex-wrap:wrap}.sd-title-row{display:flex;align-items:center;gap:8px}.sd-tag{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#f2f4f7;color:#344054}.sd-avatar--lg{width:40px;height:40px;font-size:14px}.sd-divider{width:1px;height:24px;background:#eaecf0}.sd-chips{display:flex;align-items:center;flex-wrap:wrap;gap:16px}.sd-chip{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:#475467}.sd-chip svg{color:#98a2b3}.sd-overview{display:grid;grid-template-columns:3fr 1.15fr;gap:16px;align-items:stretch}.sd-overview-main{display:grid;grid-template-columns:repeat(6,1fr);grid-template-rows:auto 1fr;gap:16px;align-items:start;min-width:0}.sd-kpi{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;gap:14px}.sd-kpi:not(.sd-kpi--score) .sd-kpi-value{margin-top:auto}.sd-kpi:not(.sd-kpi--score) .sd-delta{margin-bottom:auto}.sd-kpi--score{gap:10px;align-self:stretch}.sd-kpi--score .sd-kpi-value{margin-top:auto}.sd-kpi--score .sd-delta{margin-bottom:auto}.sd-overview-main>.sd-kpi{grid-column:span 2}.sd-overview-main>.sd-kpi--score{grid-column:span 3}.sd-kpi-title{border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;padding:12px;text-align:center;font-size:14px;line-height:20px;font-weight:500;color:#344054}.sd-kpi-label{font-size:14px;font-weight:500;color:#1d2939}.sd-kpi-value{text-align:center;font-size:30px;line-height:38px;font-weight:600;color:#101828}.sd-kpi-value--left{text-align:left}.sd-kpi-value .av2-sk{display:inline-block}.sd-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#667085}.sd-delta--center{justify-content:center}.sd-delta--good svg,.sd-delta--good .sd-delta-val{color:#039855}.sd-delta--bad svg,.sd-delta--bad .sd-delta-val{color:#d92d20}.sd-delta-val{font-weight:600;color:#344054}.sd-stat-cell .sd-delta{margin-top:2px}.sd-cal{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 18px;display:flex;flex-direction:column;gap:10px}.sd-cal-title{display:flex;align-items:center;gap:7px;font-size:17px;font-weight:700;color:#101828}.sd-cal-info{display:flex;color:#98a2b3;cursor:help}.sd-cal-nav{display:flex;align-items:center;justify-content:space-between;color:#667085}.sd-cal-step{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:0;border-radius:6px;background:transparent;color:#667085;cursor:pointer}.sd-cal-step:hover{background:#f9fafb;color:#344054}.sd-cal-month{font-size:16px;font-weight:500;color:#101828}.sd-cal-week,.sd-cal-days{display:grid;grid-template-columns:repeat(7,1fr)}.sd-cal-week{gap:6px 4px;text-align:center;font-size:12px;font-weight:600;color:#475467}.sd-cal-days{gap:4px;justify-items:center}.sd-day{width:30px;height:30px;border-radius:9999px;display:inline-flex;align-items:center;justify-content:center;font-size:13px;font-weight:500;color:#344054}.sd-day--blank{visibility:hidden}.sd-day--track{background:#00a3ff;color:#fff}.sd-day--risk{background:#f79009;color:#fff}.sd-day--missed{background:#f04438;color:#fff}.sd-cal-legend{display:flex;flex-wrap:wrap;gap:14px;font-size:12px;color:#475467}.sd-cal-legend span{display:inline-flex;align-items:center;gap:6px}.sd-dot{width:10px;height:10px;border-radius:9999px;display:inline-block}.sd-dot--track{background:#00a3ff}.sd-dot--risk{background:#f79009}.sd-dot--missed{background:#f04438}.sd-table--store th:nth-child(1){width:9%}.sd-table--store th:nth-child(2){width:15%}.sd-table--store th:nth-child(3){width:8%}.sd-table--store th:nth-child(4){width:17%}.sd-table--store th:nth-child(5){width:12%}.sd-table--store th:nth-child(6){width:8%}.sd-table--store th:nth-child(7){width:5.5%}.sd-table--store th:nth-child(8){width:8.5%}.sd-table--store th:nth-child(9){width:9%}.sd-table--store th:nth-child(10){width:8%}.sd-table--store{min-width:1200px}.sd-table--audit,.sd-table--user{min-width:1320px}.sd-table--audit th:nth-child(1){width:44px}.sd-table--audit th:nth-child(2){width:8%}.sd-table--audit th:nth-child(3){width:8%}.sd-table--audit th:nth-child(4){width:8%}.sd-table--audit th:nth-child(5){width:9%}.sd-table--audit th:nth-child(6){width:13%}.sd-table--audit th:nth-child(7){width:12%}.sd-table--audit th:nth-child(8){width:9%}.sd-table--audit th:nth-child(9){width:5%}.sd-table--audit th:nth-child(10){width:8%}.sd-table--audit th:nth-child(11){width:12%}.sd-table--audit th:nth-child(12){width:8%}.sd-table thead th.sd-check,.sd-table tbody td.sd-check{padding-left:16px!important;padding-right:4px!important;overflow:visible}.sd-cb{appearance:none;-webkit-appearance:none;flex-shrink:0;width:16px;height:16px;margin:0;border:1px solid #D0D5DD;border-radius:4px;background:#fff no-repeat center/12px 12px;cursor:pointer;vertical-align:middle;transition:border-color .12s ease,background-color .12s ease}.sd-cb:hover:not(:disabled){border-color:#00a3ff}.sd-cb:checked{border-color:#00a3ff;background-color:#eaf8ff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2300A3FF' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E\")}.sd-cb:focus-visible{outline:none;box-shadow:0 0 0 3px #eaf8ff}.sd-cb:disabled{cursor:not-allowed;opacity:.45}.sd-table--user th:nth-child(1){width:8%}.sd-table--user th:nth-child(2){width:14%}.sd-table--user th:nth-child(3){width:9%}.sd-table--user th:nth-child(4){width:9%}.sd-table--user th:nth-child(5){width:9%}.sd-table--user th:nth-child(6){width:12%}.sd-table--user th:nth-child(7){width:9%}.sd-table--user th:nth-child(8){width:5%}.sd-table--user th:nth-child(9){width:8%}.sd-table--user th:nth-child(10){width:9%}.sd-table--user th:nth-child(11){width:8%}.sd-pill{display:inline-flex;align-items:center;gap:4px}.sd-link--plain{text-decoration:none}.sd-link--plain:hover{text-decoration:underline}.sd-pagination{padding:4px 0 12px}@media (max-width: 1200px){.sd-overview{grid-template-columns:1fr}.sd-overview-main{grid-template-rows:none}}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.sd-datepick{width:230px;flex-shrink:0}\n"] }]
497
528
  }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.TraxService }, { type: i3.GlobalStateService }, { type: i4.ToastService }, { type: i0.ChangeDetectorRef }], propDecorators: { closeSwitch: [{
498
529
  type: HostListener,
499
530
  args: ['document:keydown.escape']
500
531
  }] } });
501
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvZGV0YWlsL2F1ZGl0LXYyLWRldGFpbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2RldGFpbC9hdWRpdC12Mi1kZXRhaWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUU5RixPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHeEQsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7O0FBMkQ5RCxNQUFNLFdBQVcsR0FBZ0I7SUFDL0IsTUFBTSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJO0NBQ2hJLENBQUM7QUFPRixNQUFNLE9BQU8sc0JBQXNCO0lBNER2QjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFoRVYsRUFBRSxHQUFhLE9BQU8sQ0FBQztJQUN2QixvRUFBb0U7SUFDcEUsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUNmLElBQUksR0FBUSxJQUFJLENBQUM7SUFFakIsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNmLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDbkIsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ1osT0FBTyxHQUFHLGFBQWEsQ0FBQztJQUN4QiwyR0FBMkc7SUFDM0csV0FBVyxHQUFHLDhCQUE4QixDQUFDO0lBRTdDLEtBQUssR0FBZ0IsRUFBRSxHQUFHLFdBQVcsRUFBRSxDQUFDO0lBQ3hDLE1BQU0sR0FBa0MsRUFBRSxDQUFDO0lBRTNDLElBQUksR0FBZ0IsRUFBRSxDQUFDO0lBQ3ZCLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ1QsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNMLGVBQWUsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFeEMsa0lBQWtJO0lBQ2xJLE1BQU0sR0FBaUMsS0FBSyxDQUFDO0lBQ3BDLGFBQWEsR0FBa0U7UUFDdEYsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7UUFDOUIsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7UUFDdkMsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7UUFDN0MsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7UUFDaEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7S0FDakMsQ0FBQztJQUNGLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFWixzR0FBc0c7SUFDdEcsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBQ2pDLFlBQVksR0FBYSxFQUFFLENBQUM7SUFDbkIsUUFBUSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFL0QsbUdBQW1HO0lBQ25HLFlBQVksR0FBMEQsRUFBRSxDQUFDO0lBQ3pFLDREQUE0RDtJQUM1RCxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDakIsNkZBQTZGO0lBQzdGLE1BQU0sR0FBZ0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN4RCw0RUFBNEU7SUFDNUUsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDN0IsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUVULFVBQVUsQ0FBTTtJQUN4Qiw4R0FBOEc7SUFDdEcsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNkLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDSCxXQUFXLEdBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7SUFDcEYsT0FBTyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDOUIsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFaEQsWUFDVSxLQUFxQixFQUNyQixNQUFjLEVBQ2QsV0FBd0IsRUFDeEIsRUFBc0IsRUFDdEIsS0FBbUIsRUFDbkIsRUFBcUI7UUFMckIsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQ3RCLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDbkIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7SUFDM0IsQ0FBQztJQUVMLFFBQVE7UUFDTixXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUgsSUFBSSxDQUFDLEVBQUUsR0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFjLElBQUksT0FBTyxDQUFDO1FBQ2xFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUM1QyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5SCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsNkVBQTZFO1FBQzdFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxNQUFNLEVBQUU7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FBRTtRQUUzQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDNUUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUNILDJHQUEyRztRQUMzRyx1RkFBdUY7UUFDdkYsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYzthQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDakQsU0FBUyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDdkIsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7Z0JBQUUsT0FBTzthQUFFO1lBQzlCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDOUQsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztnQkFBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQzthQUFFO1lBQzNELFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsSUFBSSxhQUFhLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7YUFBRTtZQUN0RSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCwrRUFBK0U7SUFDdkUsZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDL0UsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFO1NBQ2xDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxQyxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztxQkFDbEUsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxhQUFhLElBQUksR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7cUJBQzVGLElBQUksQ0FBQyxDQUFDLENBQW1CLEVBQUUsQ0FBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BGLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUIsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHVCQUF1QjtJQUV2QixpRUFBaUU7SUFDakUsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUN0RCxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQWM7UUFDeEIsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUN4QyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBRUQsMkdBQTJHO0lBQzNHLFNBQVM7UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQ3BHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7YUFDMUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDeEMsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixJQUFJLEdBQUcsRUFBRSxJQUFJLEtBQUssR0FBRyxFQUFFO29CQUNyQixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3hDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUM1SSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7aUJBQ25DO3FCQUFNO29CQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLENBQUM7aUJBQ3REO2dCQUNELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLDBCQUEwQixDQUFDLENBQUM7Z0JBQ3RHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoRCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ2pHLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUdELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsNEZBQTRGO0lBQzVGLFdBQVcsQ0FBQyxFQUFVO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFDN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2SSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxxQkFBcUI7SUFFckIsbUdBQW1HO0lBQ25HLElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDO0lBQ2pFLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBRUQsK0RBQStEO0lBQy9ELFlBQVksQ0FBQyxPQUE0QjtRQUN2QyxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM5RCxDQUFDO0lBRU8sT0FBTyxDQUFDLFFBQTZCLEVBQUU7UUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdEYsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU07WUFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDakcsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLEdBQUcsT0FBTztZQUNWLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQy9CLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDakIsMEZBQTBGO1lBQzFGLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoRixHQUFHLEtBQUs7U0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVPLElBQUk7UUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzdGLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25FLEtBQUssRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLElBQUksNEJBQTRCLENBQUMsQ0FBQztZQUN4RyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxDQUFNO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3JELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQztRQUN2RSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQywyQkFBMkIsSUFBSSxPQUFPLENBQUM7UUFDeEcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlGLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsdUJBQXVCO0lBRXZCLElBQUksS0FBSztRQUNQLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLE9BQU8sQ0FBQztTQUFFO1FBQy9ELElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUFFO1FBQy9HLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZHLENBQUM7SUFFRCxzQkFBc0I7SUFFZCxHQUFHLENBQUMsQ0FBZ0I7UUFDMUIsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUN2RCxDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLElBQUksU0FBUztRQUNYLE9BQU87WUFDTCxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUU7WUFDcEksRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUU7WUFDOUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO1NBQzNILENBQUM7SUFDSixDQUFDO0lBRUQsK0RBQStEO0lBQy9ELElBQUksU0FBUztRQUNYLE9BQU87WUFDTCxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUU7WUFDakosRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO1NBQ2pKLENBQUM7SUFDSixDQUFDO0lBRUQsMkRBQTJEO0lBQzNELElBQUksU0FBUztRQUNYLE9BQU87WUFDTCxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUU7WUFDakosRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO1lBQ2pKLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtTQUNqSSxDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVMsQ0FBQyxDQUFZO1FBQ3BCLE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzFELENBQUM7SUFFRCxRQUFRLENBQUMsQ0FBWTtRQUNuQixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQUUsT0FBTyxNQUFNLENBQUM7U0FBRTtRQUN6RCxPQUFPLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQyxDQUFDO0lBRUQsbUZBQW1GO0lBQ25GLFNBQVMsQ0FBQyxDQUFZO1FBQ3BCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsSUFBSSxHQUFHLEtBQUssTUFBTSxFQUFFO1lBQUUsT0FBTyxNQUFNLENBQUM7U0FBRTtRQUN0QyxPQUFPLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzNELENBQUM7SUFFRCx5QkFBeUI7SUFFekIsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVk7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsUUFBUSxDQUFDLENBQWM7UUFDckIsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPLFdBQVcsQ0FBQztTQUFFO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDO1FBQzdELE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBTSxTQUFTLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsU0FBUyxhQUFhLEtBQUssRUFBRSxDQUFDO0lBQzVGLENBQUM7SUFFRCxzQkFBc0I7SUFFdEIsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBWTtRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsd0ZBQXdGO0lBQ3hGLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDaEIsTUFBTSxHQUFXLENBQUMsQ0FBQztJQUVuQixTQUFTLENBQUMsTUFBYztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQVM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFjO1FBQ3hCLE9BQU8sR0FBRyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQWM7UUFDckIsT0FBTyxHQUFHLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFRCxRQUFRLENBQUMsR0FBYztRQUNyQixPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckcsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFZO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNwRSxDQUFDO0lBRUQsTUFBTSxDQUFDLENBQU07UUFDWCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ25ELENBQUM7SUFFRCxPQUFPLENBQUMsQ0FBUztRQUNmLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbkQsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFnQjtRQUN0QixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUQsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUFjO1FBQzFCLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hFLENBQUM7SUFFRCx5R0FBeUc7SUFDekcsUUFBUSxDQUFDLEdBQWM7UUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUM7WUFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLGtCQUFrQixFQUFFLEVBQUU7WUFDdEIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxhQUFhO1lBQ2hDLFFBQVEsRUFBRSxLQUFLO1lBQ2YsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUN2QixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUc7WUFDakIsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTTtZQUNqQyxrQkFBa0IsRUFBRSxXQUFXO1lBQy9CLFVBQVUsRUFBRSxXQUFXO1lBQ3ZCLGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYSxJQUFJLFFBQVE7U0FDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFDLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLEdBQUcsRUFBRSxJQUFJLEtBQUssR0FBRyxFQUFFO29CQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO2lCQUNqRztxQkFBTTtvQkFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDLENBQUM7aUJBQ25GO1lBQ0gsQ0FBQztZQUNELDBHQUEwRztZQUMxRyxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1NBQzlHLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxhQUFhLENBQUMsSUFBUyxFQUFFLFFBQWdCO1FBQy9DLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFBRSxLQUFLLElBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQztRQUN2QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0UsT0FBTyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDakQsQ0FBQztJQUVELGdFQUFnRTtJQUNoRSxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUNuRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdkgsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixNQUFNLElBQUksR0FBZ0IsR0FBRyxFQUFFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDMUUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQzVCLFlBQVksRUFBRSxDQUFDLENBQUMsYUFBYTtvQkFDN0IsVUFBVSxFQUFFLENBQUMsQ0FBQyxPQUFPO29CQUNyQixZQUFZLEVBQUUsQ0FBQyxDQUFDLFNBQVM7b0JBQ3pCLFdBQVcsRUFBRSxDQUFDLENBQUMsUUFBUTtvQkFDdkIsY0FBYyxFQUFFLENBQUMsQ0FBQyxTQUFTO29CQUMzQixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN6RCxjQUFjLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO29CQUMzQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsZUFBZTtvQkFDckMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLO29CQUNoQixhQUFhLEVBQUUsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJO29CQUNuQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO2lCQUMxQyxDQUFDLENBQUMsQ0FBQztnQkFDSixJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLGVBQWUsQ0FBQyxDQUFDO2dCQUNyRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFCLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVSxDQUFDLENBQVMsRUFBRSxHQUFjO1FBQ2xDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsVUFBVSxDQUFDLENBQVMsRUFBRSxDQUFjO1FBQ2xDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO3dHQWxmVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixnSUMzRW5DLDR0c0JBd1RBOzs0RkQ3T2Esc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLHFCQUFxQjs4TkE2TC9CLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCB7IFRyYXhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJheC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXVkaXRBY2Nlc3MsIGF1ZGl0QWNjZXNzIH0gZnJvbSAnLi4vYXVkaXQtdjItYWNjZXNzJztcclxuXHJcbi8qKlxyXG4gKiBEYXNoYm9hcmQgZGV0YWlsIHBhZ2VzIGZvciBvbmUgYXVkaXQgKD9jaGVja2xpc3RJZD0pLCBzdG9yZSAoP3N0b3JlPTxzdG9yZUlkPikgb3IgYXVkaXRvciAoP2VtYWlsPSk6XHJcbiAqIHRoZSBwcm90b3R5cGUncyBcIkRhc2hib2FyZCDigJQgYXVkaXQgLyBzdG9yZSAvIHVzZXIgZGV0YWlsXCIgc2NyZWVucy4gT25lIGNvbXBvbmVudCwgdGhlIG1vZGUgY29tZXMgZnJvbSB0aGVcclxuICogcm91dGUncyBkYXRhLmJ5LiBFdmVyeXRoaW5nIGlzIHJlYWQgZnJvbSBQT1NUIC90cmF4L2F1ZGl0L2Rhc2hib2FyZC9kZXRhaWwgaW4gdGhlIGhlYWRlcidzIGRhdGUgcmFuZ2UuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBEZXRhaWxCeSA9ICdhdWRpdCcgfCAnc3RvcmUnIHwgJ3VzZXInO1xyXG5leHBvcnQgdHlwZSBWaXNpdFN0YXR1cyA9ICdzdWJtaXQnIHwgJ2lucHJvZ3Jlc3MnIHwgJ29wZW4nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEZXRhaWxSb3cge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgZGF0ZTogc3RyaW5nO1xyXG4gIGNoZWNrbGlzdElkOiBzdHJpbmc7XHJcbiAgY2hlY2tMaXN0TmFtZTogc3RyaW5nO1xyXG4gIGNoZWNrTGlzdFR5cGU6IHN0cmluZztcclxuICBzdG9yZUlkOiBzdHJpbmc7XHJcbiAgc3RvcmVOYW1lOiBzdHJpbmc7XHJcbiAgdXNlck5hbWU6IHN0cmluZztcclxuICB1c2VyRW1haWw6IHN0cmluZztcclxuICBzdGF0dXM6IFZpc2l0U3RhdHVzO1xyXG4gIHJlZG86IGJvb2xlYW47XHJcbiAgc3VibWl0dGVkT246IHN0cmluZyB8IG51bGw7XHJcbiAgc3VibWlzc2lvbkNvdW50OiBudW1iZXI7XHJcbiAgZmxhZ3M6IG51bWJlcjtcclxuICBhcHByb3ZlZEJ5OiBzdHJpbmc7XHJcbiAgYXBwcm92ZWRPbjogc3RyaW5nIHwgbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEZXRhaWxDYXJkcyB7XHJcbiAgdmlzaXRzOiBudW1iZXI7XHJcbiAgc3VibWl0dGVkOiBudW1iZXI7XHJcbiAgb3BlbjogbnVtYmVyO1xyXG4gIGlucHJvZ3Jlc3M6IG51bWJlcjtcclxuICBub3RTdWJtaXR0ZWQ6IG51bWJlcjtcclxuICBhY3RpdmVBdWRpdHM6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIGNvbXBsZXRpb246IG51bWJlciB8IG51bGw7XHJcbiAgY29tcGxpYW5jZTogbnVtYmVyIHwgbnVsbDtcclxufVxyXG5cclxuLyoqIE9uZSBLUEk6IHZhbHVlIHRleHQgYW5kIGl0cyBjaGFuZ2UgdnMgdGhlIHByZXZpb3VzIHBlcmlvZCAoaGlnaGVySXNCYWQgZmxpcHMgdGhlIGNvbG91ciwgZS5nLiBmbGFncykuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGV0YWlsS3BpIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgZGVsdGE6IG51bWJlciB8IG51bGw7XHJcbiAgcG9pbnRzOiBib29sZWFuO1xyXG4gIGhpZ2hlcklzQmFkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyRGF5IHtcclxuICBkYXRlOiBzdHJpbmc7XHJcbiAgZGF5OiBudW1iZXI7XHJcbiAgdmlzaXRzOiBudW1iZXI7XHJcbiAgc3VibWl0dGVkOiBudW1iZXI7XHJcbiAgc2NvcmU6IG51bWJlciB8IG51bGw7XHJcbiAgc3RhdHVzOiAndHJhY2snIHwgJ3Jpc2snIHwgJ21pc3NlZCcgfCAnbm9uZSc7XHJcbn1cclxuXHJcbmNvbnN0IEVNUFRZX0NBUkRTOiBEZXRhaWxDYXJkcyA9IHtcclxuICB2aXNpdHM6IDAsIHN1Ym1pdHRlZDogMCwgb3BlbjogMCwgaW5wcm9ncmVzczogMCwgbm90U3VibWl0dGVkOiAwLCBhY3RpdmVBdWRpdHM6IDAsIGZsYWdzOiAwLCBjb21wbGV0aW9uOiBudWxsLCBjb21wbGlhbmNlOiBudWxsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hdWRpdC12Mi1kZXRhaWwnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdWRpdC12Mi1kZXRhaWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hdWRpdC12Mi1kZXRhaWwuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpdFYyRGV0YWlsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGJ5OiBEZXRhaWxCeSA9ICdzdG9yZSc7XHJcbiAgLyoqIGNoZWNrbGlzdElkLCBzdG9yZUlkIG9yIGF1ZGl0b3IgZW1haWwsIGZyb20gdGhlIHF1ZXJ5IHN0cmluZy4gKi9cclxuICBzdWJqZWN0SWQgPSAnJztcclxuICBpbmZvOiBhbnkgPSBudWxsO1xyXG5cclxuICBsb2FkaW5nID0gdHJ1ZTtcclxuICByb3dzTG9hZGluZyA9IHRydWU7XHJcbiAgZXhwb3J0aW5nID0gZmFsc2U7XHJcbiAgcGVyaW9kID0gJyc7XHJcbiAgdnNMYWJlbCA9ICd2cyBsYXN0IGRheSc7XHJcbiAgLyoqIFNob3duIGluc3RlYWQgb2YgYSBjaGFuZ2Ugd2hlbiB0aGUgcHJldmlvdXMgcGVyaW9kIGhhZCBub3RoaW5nIHRvIGNvbXBhcmUgd2l0aCAodGhlIEFQSSBzZW5kcyBudWxsKS4gKi9cclxuICBub1ByZXZMYWJlbCA9ICdObyBkYXRhIGZvciB0aGUgcHJldmlvdXMgZGF5JztcclxuXHJcbiAgY2FyZHM6IERldGFpbENhcmRzID0geyAuLi5FTVBUWV9DQVJEUyB9O1xyXG4gIGRlbHRhczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgbnVsbD4gPSB7fTtcclxuXHJcbiAgcm93czogRGV0YWlsUm93W10gPSBbXTtcclxuICB0b3RhbENvdW50ID0gMDtcclxuICBwYWdlID0gMTtcclxuICBwYWdlU2l6ZSA9IDEwO1xyXG4gIHJlYWRvbmx5IHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcclxuXHJcbiAgLyoqICdyZWRvJyA9IHZpc2l0cyBzZW50IGJhY2sgZm9yIGEgcmVkbyAoYW55IHN0YXR1cyk7IHRoZSBvdGhlcnMgZmlsdGVyIGJ5IHRoZSB2aXNpdCdzIHN0YXR1cyAobm8gRGlzcHV0ZWQgZmlsdGVyLCBRQSAxMCBPY3QpLiAqL1xyXG4gIHN0YXR1czogJ2FsbCcgfCAncmVkbycgfCBWaXNpdFN0YXR1cyA9ICdhbGwnO1xyXG4gIHJlYWRvbmx5IHN0YXR1c09wdGlvbnM6IEFycmF5PHsgdmFsdWU6ICdhbGwnIHwgJ3JlZG8nIHwgVmlzaXRTdGF0dXM7IGxhYmVsOiBzdHJpbmcgfT4gPSBbXHJcbiAgICB7IHZhbHVlOiAnYWxsJywgbGFiZWw6ICdBbGwnIH0sXHJcbiAgICB7IHZhbHVlOiAnc3VibWl0JywgbGFiZWw6ICdTdWJtaXR0ZWQnIH0sXHJcbiAgICB7IHZhbHVlOiAnaW5wcm9ncmVzcycsIGxhYmVsOiAnSW4gUHJvZ3Jlc3MnIH0sXHJcbiAgICB7IHZhbHVlOiAnb3BlbicsIGxhYmVsOiAnT3BlbicgfSxcclxuICAgIHsgdmFsdWU6ICdyZWRvJywgbGFiZWw6ICdSZWRvJyB9XHJcbiAgXTtcclxuICBzZWFyY2ggPSAnJztcclxuXHJcbiAgLyoqIE1vbnRoIHNob3duIGluIHRoZSBNb250aGx5IFBlcmZvcm1hbmNlIGNhbGVuZGFyIChZWVlZLU1NKTsgZW1wdHkgPSB0aGUgbW9udGggb2YgdGhlIHBlcmlvZCBlbmQuICovXHJcbiAgbW9udGggPSAnJztcclxuICBjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5W10gPSBbXTtcclxuICBjYWxlbmRhckxlYWQ6IG51bWJlcltdID0gW107XHJcbiAgcmVhZG9ubHkgd2Vla2RheXMgPSBbJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJywgJ1N1J107XHJcblxyXG4gIC8qKiBBdWRpdCBwYWdlOiB0aGUgY2xpZW50J3MgYXVkaXRzIGZvciB0aGUgbmFtZSBzd2l0Y2hlciAocHJvdG90eXBlOiBuYW1lIGNoaXAgd2l0aCBhIGNoZXZyb24pLiAqL1xyXG4gIGF1ZGl0T3B0aW9uczogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHB1Ymxpc2g6IGJvb2xlYW4gfT4gPSBbXTtcclxuICAvKiogQ3VzdG9tIHN3aXRjaGVyIG1lbnU6IG9wZW4gc3RhdGUgYW5kIGl0cyBzZWFyY2ggdGV4dC4gKi9cclxuICBzd2l0Y2hPcGVuID0gZmFsc2U7XHJcbiAgc3dpdGNoUXVlcnkgPSAnJztcclxuICAvKiogU2VuZCBBbGVydCBuZWVkcyB0aGUgQ2hlY2tsaXN0IGVkaXQgcGVybWlzc2lvbiAoUE9TVCAvdHJheC9hdWRpdC9hbGVydCBjaGVja3MgaXQgdG9vKS4gKi9cclxuICBhY2Nlc3M6IEF1ZGl0QWNjZXNzID0geyBjYW5BZGQ6IGZhbHNlLCBjYW5FZGl0OiBmYWxzZSB9O1xyXG4gIC8qKiBWaXNpdHMgdGlja2VkIGZvciBTZW5kIEFsZXJ0IChvbmx5IG5vdC1zdWJtaXR0ZWQgb25lcyBjYW4gYmUgdGlja2VkKS4gKi9cclxuICBhbGVydElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gIGFsZXJ0aW5nID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgaGVhZGVyRGF0YTogYW55O1xyXG4gIC8qKiBQZXJpb2QgcGFzc2VkIGJ5IHRoZSBEYXNoYm9hcmQgbGluayAoZnJvbSAvIHRvKTogdGhlIGRheXMgb2YgdGhlIHJvdyBjbGlja2VkOyBlbXB0eSA9IHRoZSBoZWFkZXIgcmFuZ2UuICovXHJcbiAgcHJpdmF0ZSBsaW5rRnJvbSA9ICcnO1xyXG4gIHByaXZhdGUgbGlua1RvID0gJyc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyRW1haWxlczogc3RyaW5nW10gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2Vyc0VtYWlsLWluZm8nKSB8fCAnW10nKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNlYXJjaCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgdHJheFNlcnZpY2U6IFRyYXhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGF1ZGl0QWNjZXNzKHRoaXMuZ3MpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoYWNjZXNzID0+IHsgdGhpcy5hY2Nlc3MgPSBhY2Nlc3M7IHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpOyB9KTtcclxuICAgIHRoaXMuYnkgPSAodGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhWydieSddIGFzIERldGFpbEJ5KSB8fCAnc3RvcmUnO1xyXG4gICAgY29uc3QgcSA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcDtcclxuICAgIHRoaXMuc3ViamVjdElkID0gKHRoaXMuYnkgPT09ICdhdWRpdCcgPyBxLmdldCgnY2hlY2tsaXN0SWQnKSA6ICh0aGlzLmJ5ID09PSAnc3RvcmUnID8gcS5nZXQoJ3N0b3JlJykgOiBxLmdldCgnZW1haWwnKSkpIHx8ICcnO1xyXG4gICAgaWYgKHEuZ2V0KCdmcm9tJykgJiYgcS5nZXQoJ3RvJykpIHtcclxuICAgICAgdGhpcy5saW5rRnJvbSA9IFN0cmluZyhxLmdldCgnZnJvbScpKTtcclxuICAgICAgdGhpcy5saW5rVG8gPSBTdHJpbmcocS5nZXQoJ3RvJykpO1xyXG4gICAgfVxyXG4gICAgLy8gRGFzaGJvYXJkIFN1Ym1pdHRlZCBjb3VudCBvcGVucyB0aGUgdGFibGUgb24gdGhhdCBzdGF0dXMgKD9zdGF0dXM9c3VibWl0KS5cclxuICAgIGNvbnN0IGxpbmtlZCA9IHRoaXMuc3RhdHVzT3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PT0gcS5nZXQoJ3N0YXR1cycpKTtcclxuICAgIGlmIChsaW5rZWQpIHsgdGhpcy5zdGF0dXMgPSBsaW5rZWQudmFsdWU7IH1cclxuXHJcbiAgICB0aGlzLnNlYXJjaCQucGlwZShkZWJvdW5jZVRpbWUoNDAwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgICB0aGlzLmxvYWQoKTtcclxuICAgIH0pO1xyXG4gICAgLy8gVGhlIHBhZ2Ugb3BlbnMgb24gdGhlIHBlcmlvZCBvZiB0aGUgbGluayAodGhlIERhc2hib2FyZCdzKSwgdGhlbiBmb2xsb3dzIHRoZSBwb3J0YWwgaGVhZGVyJ3MgZGF0ZSBwaWNrZXJcclxuICAgIC8vIGFzIHNvb24gYXMgaXQgY2hhbmdlcyB0aGVyZSAoUUEgMTAgT2N0OiB0aGUgaGVhZGVyIHBpY2tlciBkaWQgbm90aGluZyBvbiB0aGlzIHBhZ2UpLlxyXG4gICAgbGV0IGZpcnN0SGVhZGVyID0gdHJ1ZTtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCBkZWJvdW5jZVRpbWUoMzAwKSlcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFkYXRhPy5jbGllbnQpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgY29uc3QgY2xpZW50Q2hhbmdlZCA9IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50ICE9PSBkYXRhLmNsaWVudDtcclxuICAgICAgICBpZiAoIWZpcnN0SGVhZGVyKSB7IHRoaXMubGlua0Zyb20gPSAnJzsgdGhpcy5saW5rVG8gPSAnJzsgfVxyXG4gICAgICAgIGZpcnN0SGVhZGVyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJEYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLnBlcmlvZCA9ICdCYXNlZCBvbiAnICsgdGhpcy5mbXREYXkodGhpcy5mcm9tRGF0ZSkgKyAnIC0gJyArIHRoaXMuZm10RGF5KHRoaXMudG9EYXRlKTtcclxuICAgICAgICB0aGlzLm1vbnRoID0gJyc7XHJcbiAgICAgICAgdGhpcy5wYWdlID0gMTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjbGllbnRDaGFuZ2VkICYmIHRoaXMuYnkgPT09ICdhdWRpdCcpIHsgdGhpcy5sb2FkQXVkaXRPcHRpb25zKCk7IH1cclxuICAgICAgICB0aGlzLmxvYWQoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGF1ZGl0cyBvZiB0aGUgY2xpZW50IChQT1NUIC90cmF4L2F1ZGl0L2xpc3QpLCBmb3IgdGhlIG5hbWUgc3dpdGNoZXIuICovXHJcbiAgcHJpdmF0ZSBsb2FkQXVkaXRPcHRpb25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdExpc3Qoe1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsIGZyb21EYXRlOiB0aGlzLmZyb21EYXRlLCB0b0RhdGU6IHRoaXMudG9EYXRlLFxyXG4gICAgICBsaW1pdDogNTAwLCBvZmZzZXQ6IDEsIHNlYXJjaDogJydcclxuICAgIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmF1ZGl0T3B0aW9ucyA9IChyZXM/LmNvZGUgPT09IDIwMCA/IHJlcy5kYXRhPy5yZXN1bHQgfHwgW10gOiBbXSlcclxuICAgICAgICAgIC5tYXAoKGE6IGFueSkgPT4gKHsgaWQ6IFN0cmluZyhhLl9pZCksIG5hbWU6IGEuY2hlY2tMaXN0TmFtZSB8fCAn4oCUJywgcHVibGlzaDogISFhLnB1Ymxpc2ggfSkpXHJcbiAgICAgICAgICAuc29ydCgoYTogeyBuYW1lOiBzdHJpbmcgfSwgYjogeyBuYW1lOiBzdHJpbmcgfSkgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMuYXVkaXRPcHRpb25zID0gW107IH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSBTZW5kIEFsZXJ0IC0tLS1cclxuXHJcbiAgLyoqIFJvd3Mgb2YgdGhpcyBwYWdlIHRoYXQgY2FuIGJlIGFsZXJ0ZWQgKG5vdCBzdWJtaXR0ZWQgeWV0KS4gKi9cclxuICBnZXQgYWxlcnRhYmxlUm93cygpOiBEZXRhaWxSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc3RhdHVzICE9PSAnc3VibWl0Jyk7XHJcbiAgfVxyXG5cclxuICBnZXQgYWxsQWxlcnRhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuYWxlcnRhYmxlUm93cztcclxuICAgIHJldHVybiByb3dzLmxlbmd0aCA+IDAgJiYgcm93cy5ldmVyeShyID0+IHRoaXMuYWxlcnRJZHMuaGFzKHIuaWQpKTtcclxuICB9XHJcblxyXG4gIGdldCBzb21lQWxlcnRhYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWxlcnRJZHMuc2l6ZSA+IDAgJiYgIXRoaXMuYWxsQWxlcnRhYmxlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQWxlcnQocm93OiBEZXRhaWxSb3cpOiB2b2lkIHtcclxuICAgIGlmIChyb3cuc3RhdHVzID09PSAnc3VibWl0JykgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IG5leHQgPSBuZXcgU2V0KHRoaXMuYWxlcnRJZHMpO1xyXG4gICAgbmV4dC5oYXMocm93LmlkKSA/IG5leHQuZGVsZXRlKHJvdy5pZCkgOiBuZXh0LmFkZChyb3cuaWQpO1xyXG4gICAgdGhpcy5hbGVydElkcyA9IG5leHQ7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBbGxBbGVydCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWxlcnRJZHMgPSB0aGlzLmFsbEFsZXJ0YWJsZSA/IG5ldyBTZXQ8c3RyaW5nPigpIDogbmV3IFNldCh0aGlzLmFsZXJ0YWJsZVJvd3MubWFwKHIgPT4gci5pZCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlbWluZGVyIGVtYWlsIHRvIHRoZSBhdWRpdG9ycyBvZiB0aGUgdGlja2VkIHZpc2l0cyAoUE9TVCAvdHJheC9hdWRpdC9hbGVydCk7IG9uZSBlbWFpbCBwZXIgYXVkaXRvci4gKi9cclxuICBzZW5kQWxlcnQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYWxlcnRJZHMuc2l6ZSB8fCB0aGlzLmFsZXJ0aW5nIHx8IHRoaXMuYnkgIT09ICdhdWRpdCcgfHwgIXRoaXMuYWNjZXNzLmNhbkVkaXQpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmFsZXJ0aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRBbGVydCh7IGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCwgY2hlY2tsaXN0SWQ6IHRoaXMuc3ViamVjdElkLCB2aXNpdElkczogWy4uLnRoaXMuYWxlcnRJZHNdIH0pXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuYWxlcnRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIGlmIChyZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICBjb25zdCBuID0gTnVtYmVyKHJlcy5kYXRhPy5lbWFpbHMpIHx8IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IHYgPSBOdW1iZXIocmVzLmRhdGE/LnZpc2l0cykgfHwgMDtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ1JlbWluZGVyIHNlbnQgdG8gJyArIG4gKyAobiA9PT0gMSA/ICcgYXVkaXRvcicgOiAnIGF1ZGl0b3JzJykgKyAnIGZvciAnICsgdiArICh2ID09PSAxID8gJyB2aXNpdCcgOiAnIHZpc2l0cycpKTtcclxuICAgICAgICAgICAgdGhpcy5hbGVydElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdDb3VsZCBub3Qgc2VuZCB0aGUgYWxlcnQnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuYWxlcnRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZT8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0NvdWxkIG5vdCBzZW5kIHRoZSBhbGVydCcpO1xyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBzd2l0Y2hGaWx0ZXJlZCgpOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgcHVibGlzaDogYm9vbGVhbiB9PiB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5zd2l0Y2hRdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiBxID8gdGhpcy5hdWRpdE9wdGlvbnMuZmlsdGVyKGEgPT4gYS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIDogdGhpcy5hdWRpdE9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTd2l0Y2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnN3aXRjaE9wZW4gPSAhdGhpcy5zd2l0Y2hPcGVuO1xyXG4gICAgdGhpcy5zd2l0Y2hRdWVyeSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnKVxyXG4gIGNsb3NlU3dpdGNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zd2l0Y2hPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKiogU3dpdGNoIHRvIGFub3RoZXIgYXVkaXQ6IHNhbWUgcGFnZSBhbmQgcGVyaW9kLCB0aGUgVVJMIGZvbGxvd3Mgc28gYSByZWZyZXNoIGtlZXBzIGl0LiAqL1xyXG4gIHN3aXRjaEF1ZGl0KGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc3dpdGNoT3BlbiA9IGZhbHNlO1xyXG4gICAgaWYgKCFpZCB8fCBpZCA9PT0gdGhpcy5zdWJqZWN0SWQpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnN1YmplY3RJZCA9IGlkO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSwgcXVlcnlQYXJhbXM6IHsgY2hlY2tsaXN0SWQ6IGlkIH0sIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsIHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgICB0aGlzLm1vbnRoID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMubG9hZCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKiAtLS0tIERhdGEgLS0tLSAqL1xyXG5cclxuICAvKiogVGhlIHBlcmlvZCBzaG93bjogdGhlIERhc2hib2FyZCBsaW5rJ3MgZnJvbSAvIHRvIHdoZW4gaXQgcGFzc2VkIHRoZW0sIGVsc2UgdGhlIGhlYWRlciByYW5nZS4gKi9cclxuICBnZXQgZnJvbURhdGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmxpbmtGcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvRGF0ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubGlua1RvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCAnJztcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZSAvIHVzZXIgbGlua3MgaW4gdGhlIHRhYmxlIGtlZXAgdGhpcyBwYWdlJ3MgcGVyaW9kLiAqL1xyXG4gIGRldGFpbFBhcmFtcyhzdWJqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICByZXR1cm4geyAuLi5zdWJqZWN0LCBmcm9tOiB0aGlzLmZyb21EYXRlLCB0bzogdGhpcy50b0RhdGUgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGF5bG9hZChleHRyYTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9KTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5ieSA9PT0gJ2F1ZGl0JyA/IHsgY2hlY2tsaXN0SWQ6IHRoaXMuc3ViamVjdElkIH1cclxuICAgICAgOiAodGhpcy5ieSA9PT0gJ3N0b3JlJyA/IHsgc3RvcmU6IHRoaXMuc3ViamVjdElkIH0gOiB7IHVzZXJFbWFpbDogdGhpcy5zdWJqZWN0SWQgfSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgIGZyb21EYXRlOiB0aGlzLmZyb21EYXRlLFxyXG4gICAgICB0b0RhdGU6IHRoaXMudG9EYXRlLFxyXG4gICAgICBzdG9yZUlkOiAodGhpcy5oZWFkZXJEYXRhPy5zdG9yZXMgfHwgW10pLmZpbHRlcigoczogYW55KSA9PiBzLmNoZWNrZWQpLm1hcCgoczogYW55KSA9PiBzLnN0b3JlSWQpLFxyXG4gICAgICB1c2VyRW1haWxlczogdGhpcy51c2VyRW1haWxlcyxcclxuICAgICAgYnk6IHRoaXMuYnksXHJcbiAgICAgIC4uLnN1YmplY3QsXHJcbiAgICAgIC4uLih0aGlzLm1vbnRoID8geyBtb250aDogdGhpcy5tb250aCB9IDoge30pLFxyXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxyXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5zZWFyY2gudHJpbSgpLFxyXG4gICAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgb2Zmc2V0OiB0aGlzLnBhZ2UsXHJcbiAgICAgIC8vIFNlbnQgb25seSBvbmNlIGEgY29sdW1uIGlzIHBpY2tlZCwgc28gYW4gQVBJIHdpdGhvdXQgc29ydGluZyBzdGlsbCBzZXJ2ZXMgbmV3ZXN0IGZpcnN0LlxyXG4gICAgICAuLi4odGhpcy5zb3J0Q29sdW1uID8geyBzb3J0Q29sdW1uOiB0aGlzLnNvcnRDb2x1bW4sIHNvcnRCeTogdGhpcy5zb3J0QnkgfSA6IHt9KSxcclxuICAgICAgLi4uZXh0cmFcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaGVhZGVyRGF0YSkgeyByZXR1cm47IH1cclxuICAgIGlmICghdGhpcy5zdWJqZWN0SWQpIHtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMucm93c0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yb3dzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0RGFzaGJvYXJkRGV0YWlsKHRoaXMucGF5bG9hZCgpKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB0aGlzLmFwcGx5KHJlcz8uY29kZSA9PT0gMjAwID8gcmVzLmRhdGEgOiBudWxsKSxcclxuICAgICAgZXJyb3I6IChlOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5KG51bGwpO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZT8uZXJyb3I/LmVycm9yIHx8ICdVbmFibGUgdG8gbG9hZCB0aGUgZGV0YWlscycpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHkoZDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmluZm8gPSBkPy5pbmZvIHx8IHRoaXMuaW5mbztcclxuICAgIHRoaXMuY2FyZHMgPSB7IC4uLkVNUFRZX0NBUkRTLCAuLi4oZD8uY2FyZHMgfHwge30pIH07XHJcbiAgICB0aGlzLmRlbHRhcyA9IGQ/LmRlbHRhcyB8fCB7fTtcclxuICAgIGNvbnN0IGRheXMgPSBOdW1iZXIoZD8ucGVyaW9kPy5wcmV2aW91cz8uZGF5cykgfHwgMTtcclxuICAgIHRoaXMudnNMYWJlbCA9IGRheXMgPT09IDEgPyAndnMgbGFzdCBkYXknIDogYHZzIHByZXZpb3VzICR7ZGF5c30gZGF5c2A7XHJcbiAgICB0aGlzLm5vUHJldkxhYmVsID0gZGF5cyA9PT0gMSA/ICdObyBkYXRhIGZvciB0aGUgcHJldmlvdXMgZGF5JyA6IGBObyBkYXRhIGluIHRoZSBwcmV2aW91cyAke2RheXN9IGRheXNgO1xyXG4gICAgdGhpcy5yb3dzID0gZD8ucm93cyB8fCBbXTtcclxuICAgIHRoaXMuYWxlcnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIHRoaXMudG90YWxDb3VudCA9IE51bWJlcihkPy50b3RhbENvdW50KSB8fCAwO1xyXG4gICAgaWYgKGQ/LmNhbGVuZGFyKSB7XHJcbiAgICAgIHRoaXMubW9udGggPSBkLmNhbGVuZGFyLm1vbnRoO1xyXG4gICAgICB0aGlzLmNhbGVuZGFyTGVhZCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IE51bWJlcihkLmNhbGVuZGFyLmZpcnN0V2Vla2RheSkgfHwgMCB9LCAoXywgaSkgPT4gaSk7XHJcbiAgICAgIHRoaXMuY2FsZW5kYXJEYXlzID0gZC5jYWxlbmRhci5kYXlzIHx8IFtdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnJvd3NMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKiAtLS0tIEhlYWRlciAtLS0tICovXHJcblxyXG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuYnkgPT09ICdhdWRpdCcpIHsgcmV0dXJuIHRoaXMuaW5mbz8ubmFtZSB8fCAnQXVkaXQnOyB9XHJcbiAgICBpZiAodGhpcy5ieSA9PT0gJ3N0b3JlJykgeyByZXR1cm4gdGhpcy5pbmZvPy5uYW1lID8gYCR7dGhpcy5pbmZvLm5hbWV9ICgke3RoaXMuc3ViamVjdElkfSlgIDogdGhpcy5zdWJqZWN0SWQ7IH1cclxuICAgIHJldHVybiB0aGlzLmluZm8/Lm5hbWUgfHwgdGhpcy5zdWJqZWN0SWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5pdGlhbHMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAodGhpcy5pbmZvPy5uYW1lIHx8IHRoaXMuc3ViamVjdElkIHx8ICcnKS5yZXBsYWNlKC9bXkEtWmEtel0vZywgJycpLnNsaWNlKDAsIDIpLnRvVXBwZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogLS0tLSBDYXJkcyAtLS0tICovXHJcblxyXG4gIHByaXZhdGUgcGN0KHY6IG51bWJlciB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkID8gJ+KAlCcgOiB2ICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgLyoqIEF1ZGl0IC8gdXNlciBwYWdlczogdGhlIHRocmVlIGNvdW50IGNhcmRzIGFib3ZlIHRoZSBjYWxlbmRhci4gKi9cclxuICBnZXQgY291bnRLcGlzKCk6IERldGFpbEtwaVtdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsgbGFiZWw6ICdUb3RhbCBBdWRpdHMnLCB2YWx1ZTogU3RyaW5nKHRoaXMuY2FyZHMudmlzaXRzKSwgZGVsdGE6IHRoaXMuZGVsdGFzWyd2aXNpdHMnXSA/PyBudWxsLCBwb2ludHM6IGZhbHNlLCBoaWdoZXJJc0JhZDogZmFsc2UgfSxcclxuICAgICAgeyBsYWJlbDogJ0NvbXBsZXRlZCBBdWRpdHMnLCB2YWx1ZTogU3RyaW5nKHRoaXMuY2FyZHMuc3VibWl0dGVkKSwgZGVsdGE6IHRoaXMuZGVsdGFzWydzdWJtaXR0ZWQnXSA/PyBudWxsLCBwb2ludHM6IGZhbHNlLCBoaWdoZXJJc0JhZDogZmFsc2UgfSxcclxuICAgICAgeyBsYWJlbDogJ0ZsYWdzJywgdmFsdWU6IFN0cmluZyh0aGlzLmNhcmRzLmZsYWdzKSwgZGVsdGE6IHRoaXMuZGVsdGFzWydmbGFncyddID8/IG51bGwsIHBvaW50czogZmFsc2UsIGhpZ2hlcklzQmFkOiB0cnVlIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICAvKiogQXVkaXQgLyB1c2VyIHBhZ2VzOiB0aGUgc2NvcmUgY2FyZHMgYmVzaWRlIHRoZSBjYWxlbmRhci4gKi9cclxuICBnZXQgc2NvcmVLcGlzKCk6IERldGFpbEtwaVtdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsgbGFiZWw6ICdDb21wbGV0aW9uIFNjb3JlJywgdmFsdWU6IHRoaXMucGN0KHRoaXMuY2FyZHMuY29tcGxldGlvbiksIGRlbHRhOiB0aGlzLmRlbHRhc1snY29tcGxldGlvbiddID8/IG51bGwsIHBvaW50czogdHJ1ZSwgaGlnaGVySXNCYWQ6IGZhbHNlIH0sXHJcbiAgICAgIHsgbGFiZWw6ICdDb21wbGlhbmNlIFJhdGUnLCB2YWx1ZTogdGhpcy5wY3QodGhpcy5jYXJkcy5jb21wbGlhbmNlKSwgZGVsdGE6IHRoaXMuZGVsdGFzWydjb21wbGlhbmNlJ10gPz8gbnVsbCwgcG9pbnRzOiB0cnVlLCBoaWdoZXJJc0JhZDogZmFsc2UgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZSBwYWdlOiB0aGUgdGhyZWUgZmlndXJlcyBpbiB0aGUgU3VibWl0dGVkIGNhcmQuICovXHJcbiAgZ2V0IHN0b3JlS3BpcygpOiBEZXRhaWxLcGlbXSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGxhYmVsOiAnQ29tcGxldGlvbiBTY29yZScsIHZhbHVlOiB0aGlzLnBjdCh0aGlzLmNhcmRzLmNvbXBsZXRpb24pLCBkZWx0YTogdGhpcy5kZWx0YXNbJ2NvbXBsZXRpb24nXSA/PyBudWxsLCBwb2ludHM6IHRydWUsIGhpZ2hlcklzQmFkOiBmYWxzZSB9LFxyXG4gICAgICB7IGxhYmVsOiAnQ29tcGxpYW5jZSBTY29yZScsIHZhbHVlOiB0aGlzLnBjdCh0aGlzLmNhcmRzLmNvbXBsaWFuY2UpLCBkZWx0YTogdGhpcy5kZWx0YXNbJ2NvbXBsaWFuY2UnXSA/PyBudWxsLCBwb2ludHM6IHRydWUsIGhpZ2hlcklzQmFkOiBmYWxzZSB9LFxyXG4gICAgICB7IGxhYmVsOiAnVG90YWwgRmxhZ3MnLCB2YWx1ZTogU3RyaW5nKHRoaXMuY2FyZHMuZmxhZ3MpLCBkZWx0YTogdGhpcy5kZWx0YXNbJ2ZsYWdzJ10gPz8gbnVsbCwgcG9pbnRzOiBmYWxzZSwgaGlnaGVySXNCYWQ6IHRydWUgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGRlbHRhVGV4dChrOiBEZXRhaWxLcGkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGsuZGVsdGEgPT09IG51bGwgPyAn4oCUJyA6IE1hdGguYWJzKGsuZGVsdGEpICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgZGVsdGFEaXIoazogRGV0YWlsS3BpKTogJ3VwJyB8ICdkb3duJyB8ICdmbGF0JyB7XHJcbiAgICBpZiAoay5kZWx0YSA9PT0gbnVsbCB8fCBrLmRlbHRhID09PSAwKSB7IHJldHVybiAnZmxhdCc7IH1cclxuICAgIHJldHVybiBrLmRlbHRhID4gMCA/ICd1cCcgOiAnZG93bic7XHJcbiAgfVxyXG5cclxuICAvKiogR3JlZW4gd2hlbiB0aGUgY2hhbmdlIGlzIGdvb2QsIHJlZCB3aGVuIGJhZCwgZ3JleSB3aGVuIHVuY2hhbmdlZCBvciB1bmtub3duLiAqL1xyXG4gIGRlbHRhVG9uZShrOiBEZXRhaWxLcGkpOiAnZ29vZCcgfCAnYmFkJyB8ICdmbGF0JyB7XHJcbiAgICBjb25zdCBkaXIgPSB0aGlzLmRlbHRhRGlyKGspO1xyXG4gICAgaWYgKGRpciA9PT0gJ2ZsYXQnKSB7IHJldHVybiAnZmxhdCc7IH1cclxuICAgIHJldHVybiAoZGlyID09PSAndXAnKSAhPT0gay5oaWdoZXJJc0JhZCA/ICdnb29kJyA6ICdiYWQnO1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0gQ2FsZW5kYXIgLS0tLSAqL1xyXG5cclxuICBnZXQgbW9udGhMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubW9udGggPyBkYXlqcyh0aGlzLm1vbnRoICsgJy0wMScpLmZvcm1hdCgnTU1NTSBZWVlZJykgOiAnJztcclxuICB9XHJcblxyXG4gIHNoaWZ0TW9udGgoc3RlcDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMubW9udGgpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLm1vbnRoID0gZGF5anModGhpcy5tb250aCArICctMDEnKS5hZGQoc3RlcCwgJ21vbnRoJykuZm9ybWF0KCdZWVlZLU1NJyk7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICB9XHJcblxyXG4gIGRheVRpdGxlKGQ6IENhbGVuZGFyRGF5KTogc3RyaW5nIHtcclxuICAgIGlmICghZC52aXNpdHMpIHsgcmV0dXJuICdObyB2aXNpdHMnOyB9XHJcbiAgICBjb25zdCBzY29yZSA9IGQuc2NvcmUgPT09IG51bGwgPyAnJyA6IGAgwrcgc2NvcmUgJHtkLnNjb3JlfSVgO1xyXG4gICAgcmV0dXJuIGAke2QudmlzaXRzfSB2aXNpdCR7ZC52aXNpdHMgPT09IDEgPyAnJyA6ICdzJ30gwrcgJHtkLnN1Ym1pdHRlZH0gc3VibWl0dGVkJHtzY29yZX1gO1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0gVGFibGUgLS0tLSAqL1xyXG5cclxuICBvblNlYXJjaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VhcmNoJC5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBvblN0YXR1cygpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICB9XHJcblxyXG4gIG9uUGFnZUNoYW5nZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZSA9IHBhZ2U7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBDb2x1bW4gc29ydCwgZG9uZSBieSB0aGUgQVBJICh0aGUgdGFibGUgaXMgcGFnZWQgdGhlcmUpOyAnJyA9IG5ld2VzdCB2aXNpdCBmaXJzdC4gKi9cclxuICBzb3J0Q29sdW1uID0gJyc7XHJcbiAgc29ydEJ5OiAxIHwgLTEgPSAxO1xyXG5cclxuICBzb3J0VGFibGUoY29sdW1uOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc29ydEJ5ID0gdGhpcy5zb3J0Q29sdW1uID09PSBjb2x1bW4gJiYgdGhpcy5zb3J0QnkgPT09IDEgPyAtMSA6IDE7XHJcbiAgICB0aGlzLnNvcnRDb2x1bW4gPSBjb2x1bW47XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgdGhpcy5sb2FkKCk7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKHNpemU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IE51bWJlcihzaXplKSB8fCAxMDtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICB9XHJcblxyXG4gIHN0YXR1c0xhYmVsKHJvdzogRGV0YWlsUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cuc3RhdHVzID09PSAnc3VibWl0JyA/ICdTdWJtaXR0ZWQnIDogKHJvdy5zdGF0dXMgPT09ICdpbnByb2dyZXNzJyA/ICdJbiBQcm9ncmVzcycgOiAnT3BlbicpO1xyXG4gIH1cclxuXHJcbiAgc3RhdHVzQmcocm93OiBEZXRhaWxSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5zdGF0dXMgPT09ICdzdWJtaXQnID8gJyNFQ0ZERjMnIDogKHJvdy5zdGF0dXMgPT09ICdpbnByb2dyZXNzJyA/ICcjRkZGQUVCJyA6ICcjRUZGOEZGJyk7XHJcbiAgfVxyXG5cclxuICBzdGF0dXNGZyhyb3c6IERldGFpbFJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnN0YXR1cyA9PT0gJ3N1Ym1pdCcgPyAnIzAyN0E0OCcgOiAocm93LnN0YXR1cyA9PT0gJ2lucHJvZ3Jlc3MnID8gJyNCNTQ3MDgnIDogJyMxNzVDRDMnKTtcclxuICB9XHJcblxyXG4gIHJvd0luaXRpYWxzKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKG5hbWUgfHwgJycpLnJlcGxhY2UoL1teQS1aYS16XS9nLCAnJykuc2xpY2UoMCwgMikgfHwgJy0tJztcclxuICB9XHJcblxyXG4gIGZtdERheSh2OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPyBkYXlqcyh2KS5mb3JtYXQoJ01NTSBERCwgWVlZWScpIDogJ+KAlCc7XHJcbiAgfVxyXG5cclxuICBmbXREYXRlKHY6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdiA/IGRheWpzKHYpLmZvcm1hdCgnREQgTU1NIFlZWVknKSA6ICctLSc7XHJcbiAgfVxyXG5cclxuICBmbXRUaW1lKHY6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPyBkYXlqcyh2KS5mb3JtYXQoJ2hoOm1tIEEsIEREIE1NTSBZWVlZJykgOiAnLS0nO1xyXG4gIH1cclxuXHJcbiAgZ2FsbGVyeVBhcmFtcyhyb3c6IERldGFpbFJvdyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHsgYXVkaXQ6IHJvdy5jaGVja2xpc3RJZCwgc3RvcmU6IHJvdy5zdG9yZUlkLCBkYXRlOiByb3cuZGF0ZSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFNhbWUgUERGIGRvd25sb2FkIGFzIHRoZSBDaGVja2xpc3QgZGFzaGJvYXJkOiBxdWV1ZWQsIHRoZW4gbGlzdGVkIHVuZGVyIE5vdGlmaWNhdGlvbnMgPiBEb3dubG9hZHMuICovXHJcbiAgZG93bmxvYWQocm93OiBEZXRhaWxSb3cpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVzZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSB8fCAne30nKTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UucmVwb3J0VGFibGVFeHBvcnQoe1xyXG4gICAgICBmcm9tRGF0ZTogdGhpcy5mcm9tRGF0ZSxcclxuICAgICAgdG9EYXRlOiB0aGlzLnRvRGF0ZSxcclxuICAgICAgY2hlY2tsaXN0SWQ6IFtyb3cuaWRdLFxyXG4gICAgICBzb3VyY2VDaGVja0xpc3RfaWQ6ICcnLFxyXG4gICAgICBjaGVja2xpc3ROYW1lOiByb3cuY2hlY2tMaXN0TmFtZSxcclxuICAgICAgZmlsZVR5cGU6ICdwZGYnLFxyXG4gICAgICBzdG9yZUlkczogW3Jvdy5zdG9yZUlkXSxcclxuICAgICAgdXNlcklkOiB1c2VyPy5faWQsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCxcclxuICAgICAgZG93bmxvYWRJbnNlcnRGcm9tOiAnZGFzaGJvYXJkJyxcclxuICAgICAgaW5zZXJ0VHlwZTogJ2NoZWNrbGlzdCcsXHJcbiAgICAgIGNoZWNrTGlzdFR5cGU6IHJvdy5jaGVja0xpc3RUeXBlIHx8ICdjdXN0b20nXHJcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnRG93bmxvYWRpbmcgeW91ciByZXBvcnQuIEZpbmQgaXQgdW5kZXIgTm90aWZpY2F0aW9ucyA+IERvd25sb2Fkcy4nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHRoaXMuZG93bmxvYWRFcnJvcihyZXMsICdDb3VsZCBub3Qgc3RhcnQgdGhlIGRvd25sb2FkJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgLy8gVGhlIEFQSSdzIG93biByZWFzb24gKGUuZy4gdGhlIGRvd25sb2FkIGNvdWxkIG5vdCBiZSBxdWV1ZWQpIGluc3RlYWQgb2YgYSBiYXJlIFwiU29tZXRoaW5nIHdlbnQgd3JvbmchXCIuXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCh0aGlzLmRvd25sb2FkRXJyb3IoZXJyPy5lcnJvciwgJ0NvdWxkIG5vdCBzdGFydCB0aGUgZG93bmxvYWQnKSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkb3dubG9hZEVycm9yKGJvZHk6IGFueSwgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBlID0gYm9keT8uZXJyb3IgPz8gYm9keT8ubWVzc2FnZTtcclxuICAgIGNvbnN0IHRleHQgPSB0eXBlb2YgZSA9PT0gJ3N0cmluZycgPyBlIDogKGU/Lm1lc3NhZ2UgfHwgZT8uZGV0YWlscz8ubWVzc2FnZSk7XHJcbiAgICByZXR1cm4gdGV4dCAmJiB0ZXh0ICE9PSAne30nID8gdGV4dCA6IGZhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqIEV2ZXJ5IHZpc2l0IHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBmaWx0ZXJzLCBhcyBhbiB4bHN4LiAqL1xyXG4gIGV4cG9ydFJvd3MoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5leHBvcnRpbmcgfHwgIXRoaXMudG90YWxDb3VudCkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuZXhwb3J0aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXREYXNoYm9hcmREZXRhaWwodGhpcy5wYXlsb2FkKHsgbGltaXQ6IDUwMDAsIG9mZnNldDogMSB9KSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZXhwb3J0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgY29uc3Qgcm93czogRGV0YWlsUm93W10gPSByZXM/LmNvZGUgPT09IDIwMCA/IChyZXMuZGF0YT8ucm93cyB8fCBbXSkgOiBbXTtcclxuICAgICAgICBjb25zdCBzaGVldCA9IHJvd3MubWFwKHIgPT4gKHtcclxuICAgICAgICAgICdEYXRlJzogdGhpcy5mbXREYXRlKHIuZGF0ZSksXHJcbiAgICAgICAgICAnQXVkaXQgTmFtZSc6IHIuY2hlY2tMaXN0TmFtZSxcclxuICAgICAgICAgICdTdG9yZSBJRCc6IHIuc3RvcmVJZCxcclxuICAgICAgICAgICdTdG9yZSBOYW1lJzogci5zdG9yZU5hbWUsXHJcbiAgICAgICAgICAnVXNlciBOYW1lJzogci51c2VyTmFtZSxcclxuICAgICAgICAgICdTdWJtaXR0ZWQgQnknOiByLnVzZXJFbWFpbCxcclxuICAgICAgICAgICdTdGF0dXMnOiB0aGlzLnN0YXR1c0xhYmVsKHIpICsgKHIucmVkbyA/ICcgKFJlZG8pJyA6ICcnKSxcclxuICAgICAgICAgICdTdWJtaXR0ZWQgT24nOiB0aGlzLmZtdFRpbWUoci5zdWJtaXR0ZWRPbiksXHJcbiAgICAgICAgICAnU3VibWlzc2lvbiBDb3VudCc6IHIuc3VibWlzc2lvbkNvdW50LFxyXG4gICAgICAgICAgJ0ZsYWdzJzogci5mbGFncyxcclxuICAgICAgICAgICdBcHByb3ZlZCBCeSc6IHIuYXBwcm92ZWRCeSB8fCAnLS0nLFxyXG4gICAgICAgICAgJ0FwcHJvdmVkIE9uJzogdGhpcy5mbXRUaW1lKHIuYXBwcm92ZWRPbilcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRXb3JrYm9vayhbeyBuYW1lOiAnQXVkaXQgSW5mbycsIHJvd3M6IHNoZWV0IH1dLCBgJHt0aGlzLnRpdGxlfSAtIGF1ZGl0IGluZm9gKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmV4cG9ydGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVW5hYmxlIHRvIGV4cG9ydCcpO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlSb3coXzogbnVtYmVyLCByb3c6IERldGFpbFJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LmlkO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeURheShfOiBudW1iZXIsIGQ6IENhbGVuZGFyRGF5KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBkLmRhdGU7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJhdjItcGFnZSBhdWRpdC1kZXRhaWxcIj5cclxuICA8IS0tIEJhY2sgKyB0aXRsZSAoYXVkaXQ6IG93bmVyIC8gc3RvcmVzIC8gc2NoZWR1bGUgY2hpcHM7IHVzZXI6IGF2YXRhciArIHRhZykgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInNkLWhlYWRcIj5cclxuICAgIDxhIGNsYXNzPVwic2QtYmFja1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkXCIgdGl0bGU9XCJCYWNrIHRvIGRhc2hib2FyZFwiPlxyXG4gICAgICA8c3ZnIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgIDxsaW5lIHgxPVwiMTlcIiB5MT1cIjEyXCIgeDI9XCI1XCIgeTI9XCIxMlwiPjwvbGluZT5cclxuICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiMTIgMTkgNSAxMiAxMiA1XCI+PC9wb2x5bGluZT5cclxuICAgICAgPC9zdmc+XHJcbiAgICA8L2E+XHJcbiAgICA8c3BhbiAqbmdJZj1cImJ5ID09PSAndXNlcidcIiBjbGFzcz1cInNkLWF2YXRhciBzZC1hdmF0YXItLWxnXCI+e3sgaW5pdGlhbHMgfHwgJy0tJyB9fTwvc3Bhbj5cclxuICAgIDxkaXYgY2xhc3M9XCJzZC1oZWFkLXRleHRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNkLXRpdGxlLXJvd1wiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibG9hZGluZyAmJiAhaW5mb1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdGl0bGVcIj48L3NwYW4+XHJcbiAgICAgICAgPCEtLSBBdWRpdCBwYWdlOiB0aGUgbmFtZSBpcyBhIHN3aXRjaGVyIChwcm90b3R5cGU6IG5hbWUgY2hpcCB3aXRoIGEgY2hldnJvbikgKyBwdWJsaXNoZWQgZG90IC0tPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJieSA9PT0gJ2F1ZGl0JyAmJiBhdWRpdE9wdGlvbnMubGVuZ3RoID4gMSAmJiAoIWxvYWRpbmcgfHwgaW5mbylcIiBjbGFzcz1cInNkLXN3aXRjaFwiIFtjbGFzcy5pcy1vcGVuXT1cInN3aXRjaE9wZW5cIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2Qtc3dpdGNoLWJ0blwiIChjbGljayk9XCJ0b2dnbGVTd2l0Y2goKVwiIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwic3dpdGNoT3BlblwiXHJcbiAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCIgdGl0bGU9XCJTd2l0Y2ggYXVkaXRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZC1zd2l0Y2gtbmFtZVwiPnt7IHRpdGxlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwic2Qtc3dpdGNoLWNoZXZcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNiA5IDEyIDE1IDE4IDlcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Qtc3dpdGNoLW1lbnVcIiAqbmdJZj1cInN3aXRjaE9wZW5cIiByb2xlPVwibGlzdGJveFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZC1zd2l0Y2gtc2VhcmNoXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjdcIj48L2NpcmNsZT48bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInN3aXRjaFF1ZXJ5XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYXVkaXRzXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zd2l0Y2gtbGlzdFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2Qtc3dpdGNoLWl0ZW1cIiAqbmdGb3I9XCJsZXQgYSBvZiBzd2l0Y2hGaWx0ZXJlZFwiIHJvbGU9XCJvcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJhLmlkID09PSBzdWJqZWN0SWRcIiBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImEuaWQgPT09IHN1YmplY3RJZFwiIChjbGljayk9XCJzd2l0Y2hBdWRpdChhLmlkKVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZC1wdWJkb3RcIiBbY2xhc3MuaXMtb25dPVwiYS5wdWJsaXNoXCIgW3RpdGxlXT1cImEucHVibGlzaCA/ICdQdWJsaXNoZWQnIDogJ0RyYWZ0J1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Qtc3dpdGNoLWxhYmVsXCIgW3RpdGxlXT1cImEubmFtZVwiPnt7IGEubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJhLmlkID09PSBzdWJqZWN0SWRcIiBjbGFzcz1cInNkLXN3aXRjaC1jaGVja1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkLXN3aXRjaC1lbXB0eVwiICpuZ0lmPVwiIXN3aXRjaEZpbHRlcmVkLmxlbmd0aFwiPk5vIGF1ZGl0IG1hdGNoZXMgXCJ7eyBzd2l0Y2hRdWVyeSB9fVwiPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkLXN3aXRjaC1iYWNrZHJvcFwiICpuZ0lmPVwic3dpdGNoT3BlblwiIChjbGljayk9XCJjbG9zZVN3aXRjaCgpXCI+PC9kaXY+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCIoYnkgIT09ICdhdWRpdCcgfHwgYXVkaXRPcHRpb25zLmxlbmd0aCA8PSAxKSAmJiAoIWxvYWRpbmcgfHwgaW5mbylcIiBjbGFzcz1cInNkLXRpdGxlXCI+e3sgdGl0bGUgfX08L3NwYW4+XHJcbiAgICAgICAgPCEtLSBMaXZlIHN0YXRlIG9mIHRoZSBhdWRpdDogUHVibGlzaGVkIChncmVlbikgb3IgRHJhZnQgKGdyZXkpIC0tPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiYnkgPT09ICdhdWRpdCcgJiYgaW5mb1wiIGNsYXNzPVwic2QtcHVic3RhdGVcIiBbY2xhc3MuaXMtb25dPVwiaW5mby5wdWJsaXNoXCJcclxuICAgICAgICAgIFt0aXRsZV09XCJpbmZvLnB1Ymxpc2ggPyAnVGhpcyBhdWRpdCBpcyBwdWJsaXNoZWQnIDogJ1RoaXMgYXVkaXQgaXMgYSBkcmFmdCAobm90IHB1Ymxpc2hlZCknXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkLXB1YmRvdFwiIFtjbGFzcy5pcy1vbl09XCJpbmZvLnB1Ymxpc2hcIj48L3NwYW4+e3sgaW5mby5wdWJsaXNoID8gJ1B1Ymxpc2hlZCcgOiAnRHJhZnQnIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiYnkgPT09ICd1c2VyJ1wiIGNsYXNzPVwic2QtdGFnXCI+dXNlcjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdWJcIiAqbmdJZj1cImJ5ICE9PSAnYXVkaXQnXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJ5ID09PSAndXNlcicgJiYgc3ViamVjdElkXCI+e3sgc3ViamVjdElkIH19IMK3IDwvbmctY29udGFpbmVyPnt7IHBlcmlvZCB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJ5ID09PSAnYXVkaXQnICYmIGluZm9cIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJzZC1kaXZpZGVyXCI+PC9zcGFuPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2QtY2hpcHNcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInNkLWNoaXBcIiAqbmdJZj1cImluZm8ub3duZXJcIiB0aXRsZT1cIkF1ZGl0IG93bmVyXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMjAgMjF2LTJhNCA0IDAgMCAwLTQtNEg4YTQgNCAwIDAgMC00IDR2MlwiPjwvcGF0aD48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjdcIiByPVwiNFwiPjwvY2lyY2xlPjwvc3ZnPlxyXG4gICAgICAgICAge3sgaW5mby5vd25lciB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInNkLWNoaXBcIiB0aXRsZT1cIkFzc2lnbmVkIHN0b3Jlc1wiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTMgOWwxLTVoMTZsMSA1XCI+PC9wYXRoPjxwYXRoIGQ9XCJNNCA5djExaDE2VjlcIj48L3BhdGg+PHBhdGggZD1cIk05IDIwdi02aDZ2NlwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgIHt7IGluZm8uc3RvcmVzIH19IHt7IGluZm8uc3RvcmVzID09PSAxID8gJ1N0b3JlJyA6ICdTdG9yZXMnIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwhLS0gTm8gc2NoZWR1bGUtdHlwZSAoXCJPbmUgdGltZVwiKSBvciBhdWRpdC1sZXZlbCB2aXNpdC13aW5kb3cgY2hpcCAoUUEgMTAgT2N0KTogYXVkaXRzIGFyZSBzY2hlZHVsZWQgYnlcclxuICAgICAgICAgICAgIFNjaGVkdWxlcywgd2hvc2Ugcm93cyBjYXJyeSB0aGUgdmlzaXQgd2luZG93cy4gLS0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgIDxzcGFuICpuZ0lmPVwiYnkgPT09ICdhdWRpdCdcIiBjbGFzcz1cInNkLXN1YlwiPnt7IHBlcmlvZCB9fTwvc3Bhbj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBTdG9yZSBwYWdlOiB0aGUgcHJvdG90eXBlJ3MgdGhyZWUgc3RhdCBibG9ja3MgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInNkLXN0YXRzXCIgKm5nSWY9XCJieSA9PT0gJ3N0b3JlJ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNkLXN0YXRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtaGVhZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LWJpZ1wiPjxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWVcIj48L3NwYW4+PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+e3sgY2FyZHMuYWN0aXZlQXVkaXRzIH19PC9uZy1jb250YWluZXI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtbGFiZWxcIj5BY3RpdmUgQXVkaXRzPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2Qtc3RhdC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LW1pZFwiPjxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWVcIj48L3NwYW4+PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+e3sgY2FyZHMudmlzaXRzIH19PC9uZy1jb250YWluZXI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Qtc3RhdC1zdWJcIj5BdWRpdCBJbnN0YW5jZXM8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LWhlYWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Qtc3RhdC1iaWdcIj48c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlXCI+PC9zcGFuPjxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPnt7IGNhcmRzLm5vdFN1Ym1pdHRlZCB9fTwvbmctY29udGFpbmVyPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LWxhYmVsXCI+Tm90IFN1Ym1pdHRlZCBBdWRpdHM8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LWJvZHkgc2Qtc3RhdC1ib2R5LS0yXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LW1pZFwiPjxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWVcIj48L3NwYW4+PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+e3sgY2FyZHMub3BlbiB9fTwvbmctY29udGFpbmVyPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtc3ViXCI+T3BlbiBBdWRpdHM8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtbWlkXCI+PHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZVwiPjwvc3Bhbj48bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj57eyBjYXJkcy5pbnByb2dyZXNzIH19PC9uZy1jb250YWluZXI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Qtc3RhdC1zdWJcIj5JbiBQcm9ncmVzcyBBdWRpdHM8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LWhlYWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Qtc3RhdC1iaWdcIj48c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlXCI+PC9zcGFuPjxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPnt7IGNhcmRzLnN1Ym1pdHRlZCB9fTwvbmctY29udGFpbmVyPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LWxhYmVsXCI+U3VibWl0dGVkIEF1ZGl0czwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtYm9keSBzZC1zdGF0LWJvZHktLTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Qtc3RhdC1jZWxsXCIgKm5nRm9yPVwibGV0IGsgb2Ygc3RvcmVLcGlzXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Qtc3RhdC1taWRcIj48c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlXCI+PC9zcGFuPjxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPnt7IGsudmFsdWUgfX08L25nLWNvbnRhaW5lcj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LXN1YlwiPnt7IGsubGFiZWwgfX08L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWx0YVRwbDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGsgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIEF1ZGl0IC8gdXNlciBwYWdlczogY291bnQgKyBzY29yZSBjYXJkcyBiZXNpZGUgdGhlIG1vbnRoIGNhbGVuZGFyIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJzZC1vdmVydmlld1wiICpuZ0lmPVwiYnkgIT09ICdzdG9yZSdcIj5cclxuICAgIDwhLS0gQ2FyZHMgaW4gdGhlaXIgb3duIGdyaWQsIHN0cmV0Y2hlZCB0byB0aGUgY2FsZW5kYXIgaGVpZ2h0OiB0aGUgc2NvcmUgcm93IHRha2VzIHdoYXQgdGhlIGNvdW50IHJvdyBsZWF2ZXMuIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInNkLW92ZXJ2aWV3LW1haW5cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNkLWtwaVwiICpuZ0Zvcj1cImxldCBrIG9mIGNvdW50S3Bpc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZC1rcGktdGl0bGVcIj57eyBrLmxhYmVsIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkLWtwaS12YWx1ZVwiPjxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWVcIj48L3NwYW4+PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+e3sgay52YWx1ZSB9fTwvbmctY29udGFpbmVyPjwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWx0YVRwbDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGssIGNlbnRlcjogdHJ1ZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBTYW1lIGxvb2sgYXMgdGhlIGNvdW50IGNhcmRzIChwcm90b3R5cGUpOiBncmFkaWVudCB0aXRsZSwgY2VudHJlZCB2YWx1ZSBhbmQgY2hhbmdlIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2Qta3BpIHNkLWtwaS0tc2NvcmVcIiAqbmdGb3I9XCJsZXQgayBvZiBzY29yZUtwaXNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Qta3BpLXRpdGxlXCI+e3sgay5sYWJlbCB9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZC1rcGktdmFsdWVcIj48c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlXCI+PC9zcGFuPjxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPnt7IGsudmFsdWUgfX08L25nLWNvbnRhaW5lcj48L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVsdGFUcGw7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBrLCBjZW50ZXI6IHRydWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJzZC1jYWxcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNkLWNhbC10aXRsZVwiPlxyXG4gICAgICAgIE1vbnRobHkgUGVyZm9ybWFuY2VcclxuICAgICAgICA8c3BhbiBjbGFzcz1cInNkLWNhbC1pbmZvXCIgdGl0bGU9XCJDb2xvdXIgc2hvd3MgZWFjaCBkYXkncyB2aXNpdHM6IGFsbCBzdWJtaXR0ZWQgYW5kIHBhc3NpbmcsIHBhcnRseSBkb25lIG9yIGJlbG93IHRoZSBwYXNzIG1hcmssIG9yIG5vbmUgc3VibWl0dGVkXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiOVwiPjwvY2lyY2xlPjxwYXRoIGQ9XCJNMTIgOGguMDFNMTEgMTJoMXY0aDFcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNkLWNhbC1uYXZcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNkLWNhbC1zdGVwXCIgdGl0bGU9XCJQcmV2aW91cyBtb250aFwiIChjbGljayk9XCJzaGlmdE1vbnRoKC0xKVwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjE1IDE4IDkgMTIgMTUgNlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZC1jYWwtbW9udGhcIj57eyBtb250aExhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2QtY2FsLXN0ZXBcIiB0aXRsZT1cIk5leHQgbW9udGhcIiAoY2xpY2spPVwic2hpZnRNb250aCgxKVwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjkgMTggMTUgMTIgOSA2XCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzZC1jYWwtd2Vla1wiPlxyXG4gICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCB3IG9mIHdlZWtkYXlzXCI+e3sgdyB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzZC1jYWwtZGF5c1wiPlxyXG4gICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBpIG9mIGNhbGVuZGFyTGVhZFwiIGNsYXNzPVwic2QtZGF5IHNkLWRheS0tYmxhbmtcIj48L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGQgb2YgY2FsZW5kYXJEYXlzOyB0cmFja0J5OiB0cmFja0J5RGF5XCIgY2xhc3M9XCJzZC1kYXlcIiBbbmdDbGFzc109XCInc2QtZGF5LS0nICsgZC5zdGF0dXNcIlxyXG4gICAgICAgICAgW3RpdGxlXT1cImRheVRpdGxlKGQpXCI+e3sgZC5kYXkgfX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2QtY2FsLWxlZ2VuZFwiPlxyXG4gICAgICAgIDxzcGFuPjxpIGNsYXNzPVwic2QtZG90IHNkLWRvdC0tdHJhY2tcIj48L2k+T24gdHJhY2s8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4+PGkgY2xhc3M9XCJzZC1kb3Qgc2QtZG90LS1yaXNrXCI+PC9pPkF0IHJpc2s8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4+PGkgY2xhc3M9XCJzZC1kb3Qgc2QtZG90LS1taXNzZWRcIj48L2k+TWlzc2VkPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFZpc2l0cyB0YWJsZSAtLT5cclxuICA8c2VjdGlvbiBjbGFzcz1cInNkLWNhcmRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzZC1jYXJkLWhlYWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNkLWNhcmQtdGV4dFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZC1jYXJkLXRpdGxlXCI+XHJcbiAgICAgICAgICBBdWRpdCBJbmZvXHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkLWNvdW50XCI+e3sgdG90YWxDb3VudCB9fSBUb3RhbDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Qtc3ViXCI+e3sgcGVyaW9kIH19PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgY2xhc3M9XCJzZC1zdGF0dXNcIiBbKG5nTW9kZWwpXT1cInN0YXR1c1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU3RhdHVzKClcIiBbb3B0aW9uc109XCJzdGF0dXNPcHRpb25zXCJcclxuICAgICAgICBhcmlhTGFiZWw9XCJWaXNpdCBzdGF0dXNcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImF2Mi1zZWFyY2ggc2Qtc2VhcmNoXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj5cclxuICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiN1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCIxNi41XCIgeTE9XCIxNi41XCIgeDI9XCIyMVwiIHkyPVwiMjFcIj48L2xpbmU+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cImJ5ID09PSAnc3RvcmUnID8gJ1NlYXJjaCBieSBhdWRpdCBvciBhdWRpdG9yJyA6ICdTZWFyY2ggYnkgc3RvcmUgb3IgdXNlcidcIlxyXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hcIiAobmdNb2RlbENoYW5nZSk9XCJvblNlYXJjaCgpXCI+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDwhLS0gU2VuZCBBbGVydDogcmVtaW5kZXIgZW1haWwgdG8gdGhlIGF1ZGl0b3JzIG9mIHRoZSB0aWNrZWQgdmlzaXRzIHRoYXQgYXJlIG5vdCBzdWJtaXR0ZWQgLS0+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBzZC1hbGVydFwiICpuZ0lmPVwiYnkgPT09ICdhdWRpdCcgJiYgYWNjZXNzLmNhbkVkaXRcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCIhYWxlcnRJZHMuc2l6ZSB8fCBhbGVydGluZ1wiIChjbGljayk9XCJzZW5kQWxlcnQoKVwiXHJcbiAgICAgICAgW3RpdGxlXT1cImFsZXJ0SWRzLnNpemUgPyAnRW1haWwgYSByZW1pbmRlciB0byB0aGUgYXVkaXRvcnMgb2YgdGhlIHRpY2tlZCB2aXNpdHMnIDogJ1RpY2sgdmlzaXRzIHRoYXQgYXJlIG5vdCBzdWJtaXR0ZWQgeWV0J1wiPlxyXG4gICAgICAgIHt7IGFsZXJ0aW5nID8gJ1NlbmRpbmfigKYnIDogKGFsZXJ0SWRzLnNpemUgPyAnU2VuZCBBbGVydCAoJyArIGFsZXJ0SWRzLnNpemUgKyAnKScgOiAnU2VuZCBBbGVydCcpIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3RcIiBbZGlzYWJsZWRdPVwiZXhwb3J0aW5nIHx8ICF0b3RhbENvdW50XCIgKGNsaWNrKT1cImV4cG9ydFJvd3MoKVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00XCI+PC9wYXRoPlxyXG4gICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjcgMTAgMTIgMTUgMTcgMTBcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCIxMlwiIHkxPVwiMTVcIiB4Mj1cIjEyXCIgeTI9XCIzXCI+PC9saW5lPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIHt7IGV4cG9ydGluZyA/ICdFeHBvcnRpbmfigKYnIDogJ0V4cG9ydCcgfX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bGliLWF1ZGl0LXYyLXNoaW1tZXIgKm5nSWY9XCJyb3dzTG9hZGluZ1wiIFtyb3dzXT1cIjZcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiICpuZ0lmPVwiIXJvd3NMb2FkaW5nICYmIHJvd3MubGVuZ3RoXCI+XHJcbiAgICAgIDx0YWJsZSBjbGFzcz1cInNkLXRhYmxlXCIgW25nQ2xhc3NdPVwiJ3NkLXRhYmxlLS0nICsgYnlcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdJZj1cImJ5ID09PSAnYXVkaXQnXCIgY2xhc3M9XCJzZC1jaGVja1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInNkLWNiXCIgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbGwgdmlzaXRzIHRoYXQgYXJlIG5vdCBzdWJtaXR0ZWRcIlxyXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsQWxlcnRhYmxlXCIgW2luZGV0ZXJtaW5hdGVdPVwic29tZUFsZXJ0YWJsZVwiIFtkaXNhYmxlZF09XCIhYWxlcnRhYmxlUm93cy5sZW5ndGhcIiAoY2hhbmdlKT1cInRvZ2dsZUFsbEFsZXJ0KClcIj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiYnkgIT09ICdzdG9yZSdcIiBjbGFzcz1cImF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0VGFibGUoJ2RhdGUnKVwiPkRhdGUgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0Q29sdW1uID09PSAnZGF0ZSdcIiBbZGlyXT1cInNvcnRCeSA9PT0gMSA/ICdhc2MnIDogJ2Rlc2MnXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCAqbmdJZj1cImJ5ICE9PSAnYXVkaXQnXCIgY2xhc3M9XCJhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydFRhYmxlKCdjaGVja0xpc3ROYW1lJylcIj5BdWRpdCBOYW1lIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydENvbHVtbiA9PT0gJ2NoZWNrTGlzdE5hbWUnXCIgW2Rpcl09XCJzb3J0QnkgPT09IDEgPyAnYXNjJyA6ICdkZXNjJ1wiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGggKm5nSWY9XCJieSAhPT0gJ3N0b3JlJ1wiIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRUYWJsZSgnc3RvcmVOYW1lJylcIj5TdG9yZSBOYW1lIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydENvbHVtbiA9PT0gJ3N0b3JlTmFtZSdcIiBbZGlyXT1cInNvcnRCeSA9PT0gMSA/ICdhc2MnIDogJ2Rlc2MnXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCAqbmdJZj1cImJ5ICE9PSAnc3RvcmUnXCIgY2xhc3M9XCJhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydFRhYmxlKCd1c2VyTmFtZScpXCI+VXNlciBOYW1lIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydENvbHVtbiA9PT0gJ3VzZXJOYW1lJ1wiIFtkaXJdPVwic29ydEJ5ID09PSAxID8gJ2FzYycgOiAnZGVzYydcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRUYWJsZSgnc3RhdHVzJylcIj5TdGF0dXMgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0Q29sdW1uID09PSAnc3RhdHVzJ1wiIFtkaXJdPVwic29ydEJ5ID09PSAxID8gJ2FzYycgOiAnZGVzYydcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiYnkgIT09ICd1c2VyJ1wiIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRUYWJsZSgnc3VibWl0dGVkQnknKVwiPlN1Ym1pdHRlZCBCeSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRDb2x1bW4gPT09ICdzdWJtaXR0ZWRCeSdcIiBbZGlyXT1cInNvcnRCeSA9PT0gMSA/ICdhc2MnIDogJ2Rlc2MnXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0VGFibGUoJ3N1Ym1pdHRlZE9uJylcIj5TdWJtaXR0ZWQgT24gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0Q29sdW1uID09PSAnc3VibWl0dGVkT24nXCIgW2Rpcl09XCJzb3J0QnkgPT09IDEgPyAnYXNjJyA6ICdkZXNjJ1wiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydFRhYmxlKCdzdWJtaXNzaW9uQ291bnQnKVwiPlN1Ym1pc3Npb24gQ291bnQgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0Q29sdW1uID09PSAnc3VibWlzc2lvbkNvdW50J1wiIFtkaXJdPVwic29ydEJ5ID09PSAxID8gJ2FzYycgOiAnZGVzYydcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRUYWJsZSgnZmxhZ3MnKVwiPkZsYWdzIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydENvbHVtbiA9PT0gJ2ZsYWdzJ1wiIFtkaXJdPVwic29ydEJ5ID09PSAxID8gJ2FzYycgOiAnZGVzYydcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRUYWJsZSgnYXBwcm92ZWRCeScpXCI+QXBwcm92ZWQgQnkgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0Q29sdW1uID09PSAnYXBwcm92ZWRCeSdcIiBbZGlyXT1cInNvcnRCeSA9PT0gMSA/ICdhc2MnIDogJ2Rlc2MnXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0VGFibGUoJ2FwcHJvdmVkT24nKVwiPkFwcHJvdmVkIE9uIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydENvbHVtbiA9PT0gJ2FwcHJvdmVkT24nXCIgW2Rpcl09XCJzb3J0QnkgPT09IDEgPyAnYXNjJyA6ICdkZXNjJ1wiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyB0cmFja0J5OiB0cmFja0J5Um93XCI+XHJcbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImJ5ID09PSAnYXVkaXQnXCIgY2xhc3M9XCJzZC1jaGVja1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInNkLWNiXCIgW2NoZWNrZWRdPVwiYWxlcnRJZHMuaGFzKHJvdy5pZClcIiBbZGlzYWJsZWRdPVwicm93LnN0YXR1cyA9PT0gJ3N1Ym1pdCdcIlxyXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cInJvdy5zdGF0dXMgPT09ICdzdWJtaXQnID8gJ0FscmVhZHkgc3VibWl0dGVkJyA6ICdTZWxlY3QgZm9yIFNlbmQgQWxlcnQnXCIgKGNoYW5nZSk9XCJ0b2dnbGVBbGVydChyb3cpXCI+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImJ5ICE9PSAnc3RvcmUnXCIgY2xhc3M9XCJzZC1ub3dyYXBcIj57eyBmbXREYXRlKHJvdy5kYXRlKSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImJ5ICE9PSAnYXVkaXQnXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2QtYXZhdGFyXCI+e3sgcm93SW5pdGlhbHMocm93LmNoZWNrTGlzdE5hbWUpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdjItZWxsaXBzaXNcIiBbYXYyVGlwXT1cInJvdy5jaGVja0xpc3ROYW1lXCI+e3sgcm93LmNoZWNrTGlzdE5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImJ5ICE9PSAnc3RvcmUnXCIgY2xhc3M9XCJhdjItZWxsaXBzaXNcIj5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cInNkLWxpbmsgc2QtbGluay0tcGxhaW5cIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9zdG9yZVwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgc3RvcmU6IHJvdy5zdG9yZUlkIH0pXCIgW3RpdGxlXT1cInJvdy5zdG9yZU5hbWUgfHwgJydcIj57eyByb3cuc3RvcmVOYW1lIHx8ICfigJQnIH19PC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJieSAhPT0gJ3N0b3JlJ1wiIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+XHJcbiAgICAgICAgICAgICAgPGEgKm5nSWY9XCJieSAhPT0gJ3VzZXInXCIgY2xhc3M9XCJzZC1saW5rIHNkLWxpbmstLXBsYWluXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvdXNlclwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgZW1haWw6IHJvdy51c2VyRW1haWwgfSlcIiBbdGl0bGVdPVwicm93LnVzZXJFbWFpbFwiPnt7IHJvdy51c2VyTmFtZSB8fCByb3cudXNlckVtYWlsIH19PC9hPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYnkgPT09ICd1c2VyJ1wiIFt0aXRsZV09XCJyb3cudXNlckVtYWlsXCI+e3sgcm93LnVzZXJOYW1lIHx8IHJvdy51c2VyRW1haWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkLXBpbGxcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJzdGF0dXNCZyhyb3cpXCIgW3N0eWxlLmNvbG9yXT1cInN0YXR1c0ZnKHJvdylcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJyb3cucmVkb1wiIGNsYXNzPVwic2QtcmVkb1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjIuMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjx0aXRsZT5SZWRvPC90aXRsZT48cG9seWxpbmUgcG9pbnRzPVwiMSA0IDEgMTAgNyAxMFwiPjwvcG9seWxpbmU+PHBhdGggZD1cIk0zLjUgMTVhOSA5IDAgMSAwIDIuMS05LjRMMSAxMFwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgIHt7IHN0YXR1c0xhYmVsKHJvdykgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImJ5ICE9PSAndXNlcidcIiBjbGFzcz1cImF2Mi1lbGxpcHNpcyBhdjItZGltXCIgW2F2MlRpcF09XCJyb3cudXNlckVtYWlsXCI+e3sgcm93LnVzZXJFbWFpbCB8fCAnLS0nIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWRpbSBzZC1ub3dyYXBcIj57eyBmbXRUaW1lKHJvdy5zdWJtaXR0ZWRPbikgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LnN1Ym1pc3Npb25Db3VudCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuZmxhZ3MgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXNcIiBbY2xhc3MuYXYyLWZhaW50XT1cIiFyb3cuYXBwcm92ZWRCeVwiPnt7IHJvdy5hcHByb3ZlZEJ5IHx8ICctLScgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJzZC1ub3dyYXBcIiBbY2xhc3MuYXYyLWZhaW50XT1cIiFyb3cuYXBwcm92ZWRPblwiPnt7IGZtdFRpbWUocm93LmFwcHJvdmVkT24pIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2QtYWN0aW9uc1wiICpuZ0lmPVwicm93LnN0YXR1cyA9PT0gJ3N1Ym1pdCdcIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwic2QtbGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZ2FsbGVyeVwiIFtxdWVyeVBhcmFtc109XCJnYWxsZXJ5UGFyYW1zKHJvdylcIj5WaWV3PC9hPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJzZC1saW5rXCIgKGNsaWNrKT1cImRvd25sb2FkKHJvdylcIj5Eb3dubG9hZDwvYT5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuc3RhdHVzICE9PSAnc3VibWl0J1wiIGNsYXNzPVwiYXYyLWZhaW50XCI+LS08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiIXJvd3NMb2FkaW5nICYmICFyb3dzLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPnt7IHN1YmplY3RJZCA/ICdUaGVyZSBhcmUgbm8gYXVkaXQgdmlzaXRzIGZvciB0aGlzIGZpbHRlciBpbiB0aGUgc2VsZWN0ZWQgcGVyaW9kJyA6ICdPcGVuIHRoaXMgcGFnZSBmcm9tIHRoZSBEYXNoYm9hcmQnIH19PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInNkLXBhZ2luYXRpb25cIiAqbmdJZj1cIiFyb3dzTG9hZGluZyAmJiB0b3RhbENvdW50ID4gcGFnZVNpemVcIj5cclxuICAgICAgPGxpYi1wYWdpbmF0aW9uIFtpdGVtc1BlclBhZ2VdPVwicGFnZVNpemVcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiXHJcbiAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBhZ2VcIiBbdG90YWxJdGVtc109XCJ0b3RhbENvdW50XCIgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9zZWN0aW9uPlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gQ2hhbmdlIHZzIHRoZSBwcmV2aW91cyBwZXJpb2Q6IGFycm93ICsgJSAocG9pbnRzIGZvciBzY29yZXMpICsgXCJ2cyBsYXN0IGRheSAvIHByZXZpb3VzIE4gZGF5c1wiIC0tPlxyXG48bmctdGVtcGxhdGUgI2RlbHRhVHBsIGxldC1rIGxldC1jZW50ZXI9XCJjZW50ZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwic2QtZGVsdGFcIiBbY2xhc3Muc2QtZGVsdGEtLWNlbnRlcl09XCJjZW50ZXJcIiBbbmdDbGFzc109XCInc2QtZGVsdGEtLScgKyBkZWx0YVRvbmUoaylcIj5cclxuICAgIDxzdmcgKm5nSWY9XCJkZWx0YURpcihrKSA9PT0gJ3VwJ1wiIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjIuMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCI0IDE2IDEwIDEwIDE0IDE0IDIwIDhcIj48L3BvbHlsaW5lPjxwb2x5bGluZSBwb2ludHM9XCIxNSA4IDIwIDggMjAgMTNcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgPHN2ZyAqbmdJZj1cImRlbHRhRGlyKGspID09PSAnZG93bidcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICBzdHJva2Utd2lkdGg9XCIyLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNCA4IDEwIDE0IDE0IDEwIDIwIDE2XCI+PC9wb2x5bGluZT48cG9seWxpbmUgcG9pbnRzPVwiMTUgMTYgMjAgMTYgMjAgMTFcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImsuZGVsdGEgIT09IG51bGw7IGVsc2Ugbm9QcmV2XCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwic2QtZGVsdGEtdmFsXCI+e3sgZGVsdGFUZXh0KGspIH19PC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInNkLWRlbHRhLXZzXCI+e3sgdnNMYWJlbCB9fTwvc3Bhbj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLXRlbXBsYXRlICNub1ByZXY+PHNwYW4gY2xhc3M9XCJzZC1kZWx0YS12c1wiIFthdHRyLnRpdGxlXT1cIidOb3RoaW5nIHdhcyByZWNvcmRlZCBpbiB0aGF0IHBlcmlvZCwgc28gdGhlcmUgaXMgbm8gY2hhbmdlIHRvIHNob3cnXCI+e3sgbm9QcmV2TGFiZWwgfX08L3NwYW4+PC9uZy10ZW1wbGF0ZT5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
532
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItZGV0YWlsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvZGV0YWlsL2F1ZGl0LXYyLWRldGFpbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2RldGFpbC9hdWRpdC12Mi1kZXRhaWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUU5RixPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHeEQsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUE0QixlQUFlLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7O0FBMkQvSCxNQUFNLFdBQVcsR0FBZ0I7SUFDL0IsTUFBTSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJO0NBQ2hJLENBQUM7QUFPRixNQUFNLE9BQU8sc0JBQXNCO0lBNER2QjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFoRVYsRUFBRSxHQUFhLE9BQU8sQ0FB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QyxDQUFDLElBQUksQ0FBQztJQUNoQixDQUFDO3dHQTlnQlUsc0JBQXNCOzRGQUF0QixzQkFBc0IsZ0lDNUVuQyxpdnVCQW1VQTs7NEZEdlBhLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxxQkFBcUI7OE5BbU0vQixXQUFXO3NCQURWLFlBQVk7dUJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgU3ViamVjdCwgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xyXG5pbXBvcnQgeyBUcmF4U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYXguc2VydmljZSc7XHJcbmltcG9ydCB7IEF1ZGl0QWNjZXNzLCBhdWRpdEFjY2VzcyB9IGZyb20gJy4uL2F1ZGl0LXYyLWFjY2Vzcyc7XHJcbmltcG9ydCB7IFBJQ0tFUl9MT0NBTEUsIFBpY2tlZERhdGVzLCBQaWNrZXJSYW5nZSwgZnJvbVBpY2tlclJhbmdlLCBwaWNrZXJSYW5nZXMsIHRvUGlja2VyUmFuZ2UgfSBmcm9tICcuLi9hdWRpdC12Mi1kYXRlcGlja2VyJztcclxuXHJcbi8qKlxyXG4gKiBEYXNoYm9hcmQgZGV0YWlsIHBhZ2VzIGZvciBvbmUgYXVkaXQgKD9jaGVja2xpc3RJZD0pLCBzdG9yZSAoP3N0b3JlPTxzdG9yZUlkPikgb3IgYXVkaXRvciAoP2VtYWlsPSk6XHJcbiAqIHRoZSBwcm90b3R5cGUncyBcIkRhc2hib2FyZCDigJQgYXVkaXQgLyBzdG9yZSAvIHVzZXIgZGV0YWlsXCIgc2NyZWVucy4gT25lIGNvbXBvbmVudCwgdGhlIG1vZGUgY29tZXMgZnJvbSB0aGVcclxuICogcm91dGUncyBkYXRhLmJ5LiBFdmVyeXRoaW5nIGlzIHJlYWQgZnJvbSBQT1NUIC90cmF4L2F1ZGl0L2Rhc2hib2FyZC9kZXRhaWwgaW4gdGhlIGhlYWRlcidzIGRhdGUgcmFuZ2UuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBEZXRhaWxCeSA9ICdhdWRpdCcgfCAnc3RvcmUnIHwgJ3VzZXInO1xyXG5leHBvcnQgdHlwZSBWaXNpdFN0YXR1cyA9ICdzdWJtaXQnIHwgJ2lucHJvZ3Jlc3MnIHwgJ29wZW4nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEZXRhaWxSb3cge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgZGF0ZTogc3RyaW5nO1xyXG4gIGNoZWNrbGlzdElkOiBzdHJpbmc7XHJcbiAgY2hlY2tMaXN0TmFtZTogc3RyaW5nO1xyXG4gIGNoZWNrTGlzdFR5cGU6IHN0cmluZztcclxuICBzdG9yZUlkOiBzdHJpbmc7XHJcbiAgc3RvcmVOYW1lOiBzdHJpbmc7XHJcbiAgdXNlck5hbWU6IHN0cmluZztcclxuICB1c2VyRW1haWw6IHN0cmluZztcclxuICBzdGF0dXM6IFZpc2l0U3RhdHVzO1xyXG4gIHJlZG86IGJvb2xlYW47XHJcbiAgc3VibWl0dGVkT246IHN0cmluZyB8IG51bGw7XHJcbiAgc3VibWlzc2lvbkNvdW50OiBudW1iZXI7XHJcbiAgZmxhZ3M6IG51bWJlcjtcclxuICBhcHByb3ZlZEJ5OiBzdHJpbmc7XHJcbiAgYXBwcm92ZWRPbjogc3RyaW5nIHwgbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEZXRhaWxDYXJkcyB7XHJcbiAgdmlzaXRzOiBudW1iZXI7XHJcbiAgc3VibWl0dGVkOiBudW1iZXI7XHJcbiAgb3BlbjogbnVtYmVyO1xyXG4gIGlucHJvZ3Jlc3M6IG51bWJlcjtcclxuICBub3RTdWJtaXR0ZWQ6IG51bWJlcjtcclxuICBhY3RpdmVBdWRpdHM6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIGNvbXBsZXRpb246IG51bWJlciB8IG51bGw7XHJcbiAgY29tcGxpYW5jZTogbnVtYmVyIHwgbnVsbDtcclxufVxyXG5cclxuLyoqIE9uZSBLUEk6IHZhbHVlIHRleHQgYW5kIGl0cyBjaGFuZ2UgdnMgdGhlIHByZXZpb3VzIHBlcmlvZCAoaGlnaGVySXNCYWQgZmxpcHMgdGhlIGNvbG91ciwgZS5nLiBmbGFncykuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGV0YWlsS3BpIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgZGVsdGE6IG51bWJlciB8IG51bGw7XHJcbiAgcG9pbnRzOiBib29sZWFuO1xyXG4gIGhpZ2hlcklzQmFkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyRGF5IHtcclxuICBkYXRlOiBzdHJpbmc7XHJcbiAgZGF5OiBudW1iZXI7XHJcbiAgdmlzaXRzOiBudW1iZXI7XHJcbiAgc3VibWl0dGVkOiBudW1iZXI7XHJcbiAgc2NvcmU6IG51bWJlciB8IG51bGw7XHJcbiAgc3RhdHVzOiAndHJhY2snIHwgJ3Jpc2snIHwgJ21pc3NlZCcgfCAnbm9uZSc7XHJcbn1cclxuXHJcbmNvbnN0IEVNUFRZX0NBUkRTOiBEZXRhaWxDYXJkcyA9IHtcclxuICB2aXNpdHM6IDAsIHN1Ym1pdHRlZDogMCwgb3BlbjogMCwgaW5wcm9ncmVzczogMCwgbm90U3VibWl0dGVkOiAwLCBhY3RpdmVBdWRpdHM6IDAsIGZsYWdzOiAwLCBjb21wbGV0aW9uOiBudWxsLCBjb21wbGlhbmNlOiBudWxsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hdWRpdC12Mi1kZXRhaWwnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdWRpdC12Mi1kZXRhaWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hdWRpdC12Mi1kZXRhaWwuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpdFYyRGV0YWlsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGJ5OiBEZXRhaWxCeSA9ICdzdG9yZSc7XHJcbiAgLyoqIGNoZWNrbGlzdElkLCBzdG9yZUlkIG9yIGF1ZGl0b3IgZW1haWwsIGZyb20gdGhlIHF1ZXJ5IHN0cmluZy4gKi9cclxuICBzdWJqZWN0SWQgPSAnJztcclxuICBpbmZvOiBhbnkgPSBudWxsO1xyXG5cclxuICBsb2FkaW5nID0gdHJ1ZTtcclxuICByb3dzTG9hZGluZyA9IHRydWU7XHJcbiAgZXhwb3J0aW5nID0gZmFsc2U7XHJcbiAgcGVyaW9kID0gJyc7XHJcbiAgdnNMYWJlbCA9ICd2cyBsYXN0IGRheSc7XHJcbiAgLyoqIFNob3duIGluc3RlYWQgb2YgYSBjaGFuZ2Ugd2hlbiB0aGUgcHJldmlvdXMgcGVyaW9kIGhhZCBub3RoaW5nIHRvIGNvbXBhcmUgd2l0aCAodGhlIEFQSSBzZW5kcyBudWxsKS4gKi9cclxuICBub1ByZXZMYWJlbCA9ICdObyBkYXRhIGZvciB0aGUgcHJldmlvdXMgZGF5JztcclxuXHJcbiAgY2FyZHM6IERldGFpbENhcmRzID0geyAuLi5FTVBUWV9DQVJEUyB9O1xyXG4gIGRlbHRhczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgbnVsbD4gPSB7fTtcclxuXHJcbiAgcm93czogRGV0YWlsUm93W10gPSBbXTtcclxuICB0b3RhbENvdW50ID0gMDtcclxuICBwYWdlID0gMTtcclxuICBwYWdlU2l6ZSA9IDEwO1xyXG4gIHJlYWRvbmx5IHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcclxuXHJcbiAgLyoqICdyZWRvJyA9IHZpc2l0cyBzZW50IGJhY2sgZm9yIGEgcmVkbyAoYW55IHN0YXR1cyk7IHRoZSBvdGhlcnMgZmlsdGVyIGJ5IHRoZSB2aXNpdCdzIHN0YXR1cyAobm8gRGlzcHV0ZWQgZmlsdGVyLCBRQSAxMCBPY3QpLiAqL1xyXG4gIHN0YXR1czogJ2FsbCcgfCAncmVkbycgfCBWaXNpdFN0YXR1cyA9ICdhbGwnO1xyXG4gIHJlYWRvbmx5IHN0YXR1c09wdGlvbnM6IEFycmF5PHsgdmFsdWU6ICdhbGwnIHwgJ3JlZG8nIHwgVmlzaXRTdGF0dXM7IGxhYmVsOiBzdHJpbmcgfT4gPSBbXHJcbiAgICB7IHZhbHVlOiAnYWxsJywgbGFiZWw6ICdBbGwnIH0sXHJcbiAgICB7IHZhbHVlOiAnc3VibWl0JywgbGFiZWw6ICdTdWJtaXR0ZWQnIH0sXHJcbiAgICB7IHZhbHVlOiAnaW5wcm9ncmVzcycsIGxhYmVsOiAnSW4gUHJvZ3Jlc3MnIH0sXHJcbiAgICB7IHZhbHVlOiAnb3BlbicsIGxhYmVsOiAnT3BlbicgfSxcclxuICAgIHsgdmFsdWU6ICdyZWRvJywgbGFiZWw6ICdSZWRvJyB9XHJcbiAgXTtcclxuICBzZWFyY2ggPSAnJztcclxuXHJcbiAgLyoqIE1vbnRoIHNob3duIGluIHRoZSBNb250aGx5IFBlcmZvcm1hbmNlIGNhbGVuZGFyIChZWVlZLU1NKTsgZW1wdHkgPSB0aGUgbW9udGggb2YgdGhlIHBlcmlvZCBlbmQuICovXHJcbiAgbW9udGggPSAnJztcclxuICBjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5W10gPSBbXTtcclxuICBjYWxlbmRhckxlYWQ6IG51bWJlcltdID0gW107XHJcbiAgcmVhZG9ubHkgd2Vla2RheXMgPSBbJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJywgJ1N1J107XHJcblxyXG4gIC8qKiBBdWRpdCBwYWdlOiB0aGUgY2xpZW50J3MgYXVkaXRzIGZvciB0aGUgbmFtZSBzd2l0Y2hlciAocHJvdG90eXBlOiBuYW1lIGNoaXAgd2l0aCBhIGNoZXZyb24pLiAqL1xyXG4gIGF1ZGl0T3B0aW9uczogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHB1Ymxpc2g6IGJvb2xlYW4gfT4gPSBbXTtcclxuICAvKiogQ3VzdG9tIHN3aXRjaGVyIG1lbnU6IG9wZW4gc3RhdGUgYW5kIGl0cyBzZWFyY2ggdGV4dC4gKi9cclxuICBzd2l0Y2hPcGVuID0gZmFsc2U7XHJcbiAgc3dpdGNoUXVlcnkgPSAnJztcclxuICAvKiogU2VuZCBBbGVydCBuZWVkcyB0aGUgQ2hlY2tsaXN0IGVkaXQgcGVybWlzc2lvbiAoUE9TVCAvdHJheC9hdWRpdC9hbGVydCBjaGVja3MgaXQgdG9vKS4gKi9cclxuICBhY2Nlc3M6IEF1ZGl0QWNjZXNzID0geyBjYW5BZGQ6IGZhbHNlLCBjYW5FZGl0OiBmYWxzZSB9O1xyXG4gIC8qKiBWaXNpdHMgdGlja2VkIGZvciBTZW5kIEFsZXJ0IChvbmx5IG5vdC1zdWJtaXR0ZWQgb25lcyBjYW4gYmUgdGlja2VkKS4gKi9cclxuICBhbGVydElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gIGFsZXJ0aW5nID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgaGVhZGVyRGF0YTogYW55O1xyXG4gIC8qKiBQZXJpb2QgcGFzc2VkIGJ5IHRoZSBEYXNoYm9hcmQgbGluayAoZnJvbSAvIHRvKTogdGhlIGRheXMgb2YgdGhlIHJvdyBjbGlja2VkOyBlbXB0eSA9IHRoZSBoZWFkZXIgcmFuZ2UuICovXHJcbiAgcHJpdmF0ZSBsaW5rRnJvbSA9ICcnO1xyXG4gIHByaXZhdGUgbGlua1RvID0gJyc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyRW1haWxlczogc3RyaW5nW10gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2Vyc0VtYWlsLWluZm8nKSB8fCAnW10nKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNlYXJjaCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgdHJheFNlcnZpY2U6IFRyYXhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGF1ZGl0QWNjZXNzKHRoaXMuZ3MpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoYWNjZXNzID0+IHsgdGhpcy5hY2Nlc3MgPSBhY2Nlc3M7IHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpOyB9KTtcclxuICAgIHRoaXMuYnkgPSAodGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhWydieSddIGFzIERldGFpbEJ5KSB8fCAnc3RvcmUnO1xyXG4gICAgY29uc3QgcSA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcDtcclxuICAgIHRoaXMuc3ViamVjdElkID0gKHRoaXMuYnkgPT09ICdhdWRpdCcgPyBxLmdldCgnY2hlY2tsaXN0SWQnKSA6ICh0aGlzLmJ5ID09PSAnc3RvcmUnID8gcS5nZXQoJ3N0b3JlJykgOiBxLmdldCgnZW1haWwnKSkpIHx8ICcnO1xyXG4gICAgaWYgKHEuZ2V0KCdmcm9tJykgJiYgcS5nZXQoJ3RvJykpIHtcclxuICAgICAgdGhpcy5saW5rRnJvbSA9IFN0cmluZyhxLmdldCgnZnJvbScpKTtcclxuICAgICAgdGhpcy5saW5rVG8gPSBTdHJpbmcocS5nZXQoJ3RvJykpO1xyXG4gICAgfVxyXG4gICAgLy8gRGFzaGJvYXJkIFN1Ym1pdHRlZCBjb3VudCBvcGVucyB0aGUgdGFibGUgb24gdGhhdCBzdGF0dXMgKD9zdGF0dXM9c3VibWl0KS5cclxuICAgIGNvbnN0IGxpbmtlZCA9IHRoaXMuc3RhdHVzT3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PT0gcS5nZXQoJ3N0YXR1cycpKTtcclxuICAgIGlmIChsaW5rZWQpIHsgdGhpcy5zdGF0dXMgPSBsaW5rZWQudmFsdWU7IH1cclxuXHJcbiAgICB0aGlzLnNlYXJjaCQucGlwZShkZWJvdW5jZVRpbWUoNDAwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgICB0aGlzLmxvYWQoKTtcclxuICAgIH0pO1xyXG4gICAgLy8gVGhlIHBhZ2Ugb3BlbnMgb24gdGhlIHBlcmlvZCBvZiB0aGUgbGluayAodGhlIERhc2hib2FyZCdzKSwgdGhlbiBmb2xsb3dzIHRoZSBwb3J0YWwgaGVhZGVyJ3MgZGF0ZSBwaWNrZXJcclxuICAgIC8vIGFzIHNvb24gYXMgaXQgY2hhbmdlcyB0aGVyZSAoUUEgMTAgT2N0OiB0aGUgaGVhZGVyIHBpY2tlciBkaWQgbm90aGluZyBvbiB0aGlzIHBhZ2UpLlxyXG4gICAgbGV0IGZpcnN0SGVhZGVyID0gdHJ1ZTtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCBkZWJvdW5jZVRpbWUoMzAwKSlcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFkYXRhPy5jbGllbnQpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgY29uc3QgY2xpZW50Q2hhbmdlZCA9IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50ICE9PSBkYXRhLmNsaWVudDtcclxuICAgICAgICAvLyBUaGUgaGVhZGVyIHJlLWVtaXRzIG9uIHN0YXJ0LXVwIChjbGllbnQgbGlzdCBsb2FkLCBoZWFkZXIgc3dpdGNoKSB3aXRoIHRoZSBzYW1lIGRhdGVzOiBvbmx5IGEgcmVhbCBjaGFuZ2VcclxuICAgICAgICAvLyBvZiBpdHMgcmFuZ2UgcmVwbGFjZXMgdGhlIHBlcmlvZCB0aGlzIHBhZ2Ugd2FzIG9wZW5lZCBvbiAvIHBpY2tlZCBoZXJlIChRQSAxMyBPY3Q6IE5vdCBhdWRpdGVkIC0+IFZpZXdcclxuICAgICAgICAvLyBzdG9yZXMgc2hvd2VkIG90aGVyIGRhdGVzKS5cclxuICAgICAgICBjb25zdCBoZWFkZXJEYXRlc0NoYW5nZWQgPSAhIXRoaXMuaGVhZGVyRGF0YSAmJiAodGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUgIT09IGRhdGE/LmRhdGU/LnN0YXJ0RGF0ZVxyXG4gICAgICAgICAgfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlICE9PSBkYXRhPy5kYXRlPy5lbmREYXRlKTtcclxuICAgICAgICBpZiAoIWZpcnN0SGVhZGVyICYmIGhlYWRlckRhdGVzQ2hhbmdlZCkgeyB0aGlzLmxpbmtGcm9tID0gJyc7IHRoaXMubGlua1RvID0gJyc7IH1cclxuICAgICAgICBmaXJzdEhlYWRlciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaGVhZGVyRGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5wZXJpb2QgPSAnQmFzZWQgb24gJyArIHRoaXMuZm10RGF5KHRoaXMuZnJvbURhdGUpICsgJyAtICcgKyB0aGlzLmZtdERheSh0aGlzLnRvRGF0ZSk7XHJcbiAgICAgICAgdGhpcy5yYW5nZSA9IHRvUGlja2VyUmFuZ2UodGhpcy5mcm9tRGF0ZSwgdGhpcy50b0RhdGUpO1xyXG4gICAgICAgIHRoaXMubW9udGggPSAnJztcclxuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNsaWVudENoYW5nZWQgJiYgdGhpcy5ieSA9PT0gJ2F1ZGl0JykgeyB0aGlzLmxvYWRBdWRpdE9wdGlvbnMoKTsgfVxyXG4gICAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgYXVkaXRzIG9mIHRoZSBjbGllbnQgKFBPU1QgL3RyYXgvYXVkaXQvbGlzdCksIGZvciB0aGUgbmFtZSBzd2l0Y2hlci4gKi9cclxuICBwcml2YXRlIGxvYWRBdWRpdE9wdGlvbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0TGlzdCh7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCwgZnJvbURhdGU6IHRoaXMuZnJvbURhdGUsIHRvRGF0ZTogdGhpcy50b0RhdGUsXHJcbiAgICAgIGxpbWl0OiA1MDAsIG9mZnNldDogMSwgc2VhcmNoOiAnJ1xyXG4gICAgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXVkaXRPcHRpb25zID0gKHJlcz8uY29kZSA9PT0gMjAwID8gcmVzLmRhdGE/LnJlc3VsdCB8fCBbXSA6IFtdKVxyXG4gICAgICAgICAgLm1hcCgoYTogYW55KSA9PiAoeyBpZDogU3RyaW5nKGEuX2lkKSwgbmFtZTogYS5jaGVja0xpc3ROYW1lIHx8ICfigJQnLCBwdWJsaXNoOiAhIWEucHVibGlzaCB9KSlcclxuICAgICAgICAgIC5zb3J0KChhOiB7IG5hbWU6IHN0cmluZyB9LCBiOiB7IG5hbWU6IHN0cmluZyB9KSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5hdWRpdE9wdGlvbnMgPSBbXTsgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIFNlbmQgQWxlcnQgLS0tLVxyXG5cclxuICAvKiogUm93cyBvZiB0aGlzIHBhZ2UgdGhhdCBjYW4gYmUgYWxlcnRlZCAobm90IHN1Ym1pdHRlZCB5ZXQpLiAqL1xyXG4gIGdldCBhbGVydGFibGVSb3dzKCk6IERldGFpbFJvd1tdIHtcclxuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zdGF0dXMgIT09ICdzdWJtaXQnKTtcclxuICB9XHJcblxyXG4gIGdldCBhbGxBbGVydGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCByb3dzID0gdGhpcy5hbGVydGFibGVSb3dzO1xyXG4gICAgcmV0dXJuIHJvd3MubGVuZ3RoID4gMCAmJiByb3dzLmV2ZXJ5KHIgPT4gdGhpcy5hbGVydElkcy5oYXMoci5pZCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNvbWVBbGVydGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hbGVydElkcy5zaXplID4gMCAmJiAhdGhpcy5hbGxBbGVydGFibGU7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBbGVydChyb3c6IERldGFpbFJvdyk6IHZvaWQge1xyXG4gICAgaWYgKHJvdy5zdGF0dXMgPT09ICdzdWJtaXQnKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQodGhpcy5hbGVydElkcyk7XHJcbiAgICBuZXh0Lmhhcyhyb3cuaWQpID8gbmV4dC5kZWxldGUocm93LmlkKSA6IG5leHQuYWRkKHJvdy5pZCk7XHJcbiAgICB0aGlzLmFsZXJ0SWRzID0gbmV4dDtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUFsbEFsZXJ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hbGVydElkcyA9IHRoaXMuYWxsQWxlcnRhYmxlID8gbmV3IFNldDxzdHJpbmc+KCkgOiBuZXcgU2V0KHRoaXMuYWxlcnRhYmxlUm93cy5tYXAociA9PiByLmlkKSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVtaW5kZXIgZW1haWwgdG8gdGhlIGF1ZGl0b3JzIG9mIHRoZSB0aWNrZWQgdmlzaXRzIChQT1NUIC90cmF4L2F1ZGl0L2FsZXJ0KTsgb25lIGVtYWlsIHBlciBhdWRpdG9yLiAqL1xyXG4gIHNlbmRBbGVydCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5hbGVydElkcy5zaXplIHx8IHRoaXMuYWxlcnRpbmcgfHwgdGhpcy5ieSAhPT0gJ2F1ZGl0JyB8fCAhdGhpcy5hY2Nlc3MuY2FuRWRpdCkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuYWxlcnRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdEFsZXJ0KHsgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50LCBjaGVja2xpc3RJZDogdGhpcy5zdWJqZWN0SWQsIHZpc2l0SWRzOiBbLi4udGhpcy5hbGVydElkc10gfSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hbGVydGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG4gPSBOdW1iZXIocmVzLmRhdGE/LmVtYWlscykgfHwgMDtcclxuICAgICAgICAgICAgY29uc3QgdiA9IE51bWJlcihyZXMuZGF0YT8udmlzaXRzKSB8fCAwO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnUmVtaW5kZXIgc2VudCB0byAnICsgbiArIChuID09PSAxID8gJyBhdWRpdG9yJyA6ICcgYXVkaXRvcnMnKSArICcgZm9yICcgKyB2ICsgKHYgPT09IDEgPyAnIHZpc2l0JyA6ICcgdmlzaXRzJykpO1xyXG4gICAgICAgICAgICB0aGlzLmFsZXJ0SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0NvdWxkIG5vdCBzZW5kIHRoZSBhbGVydCcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hbGVydGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGU/LmVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCBlPy5lcnJvcj8ubWVzc2FnZSB8fCAnQ291bGQgbm90IHNlbmQgdGhlIGFsZXJ0Jyk7XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN3aXRjaEZpbHRlcmVkKCk6IEFycmF5PHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBwdWJsaXNoOiBib29sZWFuIH0+IHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnN3aXRjaFF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHEgPyB0aGlzLmF1ZGl0T3B0aW9ucy5maWx0ZXIoYSA9PiBhLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiB0aGlzLmF1ZGl0T3B0aW9ucztcclxuICB9XHJcblxyXG4gIHRvZ2dsZVN3aXRjaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3dpdGNoT3BlbiA9ICF0aGlzLnN3aXRjaE9wZW47XHJcbiAgICB0aGlzLnN3aXRjaFF1ZXJ5ID0gJyc7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScpXHJcbiAgY2xvc2VTd2l0Y2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnN3aXRjaE9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBTd2l0Y2ggdG8gYW5vdGhlciBhdWRpdDogc2FtZSBwYWdlIGFuZCBwZXJpb2QsIHRoZSBVUkwgZm9sbG93cyBzbyBhIHJlZnJlc2gga2VlcHMgaXQuICovXHJcbiAgc3dpdGNoQXVkaXQoaWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zd2l0Y2hPcGVuID0gZmFsc2U7XHJcbiAgICBpZiAoIWlkIHx8IGlkID09PSB0aGlzLnN1YmplY3RJZCkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuc3ViamVjdElkID0gaWQ7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLCBxdWVyeVBhcmFtczogeyBjaGVja2xpc3RJZDogaWQgfSwgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJywgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICAgIHRoaXMubW9udGggPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5sb2FkKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0gRGF0YSAtLS0tICovXHJcblxyXG4gIC8vIC0tLS0gSW4tcGFnZSBkYXRlIHJhbmdlIChRQSAxMyBPY3Q6IHRoZSBkcmlsbC1kb3duIHBhZ2VzIGhhZCBubyBjYWxlbmRhciBvZiB0aGVpciBvd24pIC0tLS1cclxuXHJcbiAgcmVhZG9ubHkgcGlja2VyTG9jYWxlID0gUElDS0VSX0xPQ0FMRTtcclxuICByZWFkb25seSByYW5nZXMgPSBwaWNrZXJSYW5nZXMoKTtcclxuICByZWFkb25seSB0b2RheSA9IGRheWpzKCk7XHJcbiAgcmFuZ2U6IFBpY2tlclJhbmdlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBBIHBpY2tlZCByYW5nZSBiZWNvbWVzIHRoaXMgcGFnZSdzIHBlcmlvZCAoa2VwdCBpbiB0aGUgVVJMLCBzbyByZWZyZXNoIGFuZCB0aGUgdGFibGUncyBsaW5rcyBrZWVwIGl0KS4gKi9cclxuICBvblJhbmdlUGlja2VkKGU6IFBpY2tlZERhdGVzIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGlja2VkID0gZnJvbVBpY2tlclJhbmdlKGUpO1xyXG4gICAgaWYgKCFwaWNrZWQgfHwgKHBpY2tlZC5mcm9tID09PSB0aGlzLmZyb21EYXRlICYmIHBpY2tlZC50byA9PT0gdGhpcy50b0RhdGUpKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5saW5rRnJvbSA9IHBpY2tlZC5mcm9tO1xyXG4gICAgdGhpcy5saW5rVG8gPSBwaWNrZWQudG87XHJcbiAgICB0aGlzLnBlcmlvZCA9ICdCYXNlZCBvbiAnICsgdGhpcy5mbXREYXkodGhpcy5mcm9tRGF0ZSkgKyAnIC0gJyArIHRoaXMuZm10RGF5KHRoaXMudG9EYXRlKTtcclxuICAgIHRoaXMubW9udGggPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLCBxdWVyeVBhcmFtczogeyBmcm9tOiBwaWNrZWQuZnJvbSwgdG86IHBpY2tlZC50byB9LCBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLCByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5sb2FkKCk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHBlcmlvZCBzaG93bjogdGhlIERhc2hib2FyZCBsaW5rJ3MgZnJvbSAvIHRvIHdoZW4gaXQgcGFzc2VkIHRoZW0sIGVsc2UgdGhlIGhlYWRlciByYW5nZS4gKi9cclxuICBnZXQgZnJvbURhdGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmxpbmtGcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvRGF0ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubGlua1RvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCAnJztcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZSAvIHVzZXIgbGlua3MgaW4gdGhlIHRhYmxlIGtlZXAgdGhpcyBwYWdlJ3MgcGVyaW9kLiAqL1xyXG4gIGRldGFpbFBhcmFtcyhzdWJqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICByZXR1cm4geyAuLi5zdWJqZWN0LCBmcm9tOiB0aGlzLmZyb21EYXRlLCB0bzogdGhpcy50b0RhdGUgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGF5bG9hZChleHRyYTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9KTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5ieSA9PT0gJ2F1ZGl0JyA/IHsgY2hlY2tsaXN0SWQ6IHRoaXMuc3ViamVjdElkIH1cclxuICAgICAgOiAodGhpcy5ieSA9PT0gJ3N0b3JlJyA/IHsgc3RvcmU6IHRoaXMuc3ViamVjdElkIH0gOiB7IHVzZXJFbWFpbDogdGhpcy5zdWJqZWN0SWQgfSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgIGZyb21EYXRlOiB0aGlzLmZyb21EYXRlLFxyXG4gICAgICB0b0RhdGU6IHRoaXMudG9EYXRlLFxyXG4gICAgICBzdG9yZUlkOiAodGhpcy5oZWFkZXJEYXRhPy5zdG9yZXMgfHwgW10pLmZpbHRlcigoczogYW55KSA9PiBzLmNoZWNrZWQpLm1hcCgoczogYW55KSA9PiBzLnN0b3JlSWQpLFxyXG4gICAgICB1c2VyRW1haWxlczogdGhpcy51c2VyRW1haWxlcyxcclxuICAgICAgYnk6IHRoaXMuYnksXHJcbiAgICAgIC4uLnN1YmplY3QsXHJcbiAgICAgIC4uLih0aGlzLm1vbnRoID8geyBtb250aDogdGhpcy5tb250aCB9IDoge30pLFxyXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxyXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5zZWFyY2gudHJpbSgpLFxyXG4gICAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgb2Zmc2V0OiB0aGlzLnBhZ2UsXHJcbiAgICAgIC8vIFNlbnQgb25seSBvbmNlIGEgY29sdW1uIGlzIHBpY2tlZCwgc28gYW4gQVBJIHdpdGhvdXQgc29ydGluZyBzdGlsbCBzZXJ2ZXMgbmV3ZXN0IGZpcnN0LlxyXG4gICAgICAuLi4odGhpcy5zb3J0Q29sdW1uID8geyBzb3J0Q29sdW1uOiB0aGlzLnNvcnRDb2x1bW4sIHNvcnRCeTogdGhpcy5zb3J0QnkgfSA6IHt9KSxcclxuICAgICAgLi4uZXh0cmFcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaGVhZGVyRGF0YSkgeyByZXR1cm47IH1cclxuICAgIGlmICghdGhpcy5zdWJqZWN0SWQpIHtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMucm93c0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yb3dzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0RGFzaGJvYXJkRGV0YWlsKHRoaXMucGF5bG9hZCgpKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB0aGlzLmFwcGx5KHJlcz8uY29kZSA9PT0gMjAwID8gcmVzLmRhdGEgOiBudWxsKSxcclxuICAgICAgZXJyb3I6IChlOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmFwcGx5KG51bGwpO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZT8uZXJyb3I/LmVycm9yIHx8ICdVbmFibGUgdG8gbG9hZCB0aGUgZGV0YWlscycpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHkoZDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmluZm8gPSBkPy5pbmZvIHx8IHRoaXMuaW5mbztcclxuICAgIHRoaXMuY2FyZHMgPSB7IC4uLkVNUFRZX0NBUkRTLCAuLi4oZD8uY2FyZHMgfHwge30pIH07XHJcbiAgICB0aGlzLmRlbHRhcyA9IGQ/LmRlbHRhcyB8fCB7fTtcclxuICAgIGNvbnN0IGRheXMgPSBOdW1iZXIoZD8ucGVyaW9kPy5wcmV2aW91cz8uZGF5cykgfHwgMTtcclxuICAgIHRoaXMudnNMYWJlbCA9IGRheXMgPT09IDEgPyAndnMgbGFzdCBkYXknIDogYHZzIHByZXZpb3VzICR7ZGF5c30gZGF5c2A7XHJcbiAgICB0aGlzLm5vUHJldkxhYmVsID0gZGF5cyA9PT0gMSA/ICdObyBkYXRhIGZvciB0aGUgcHJldmlvdXMgZGF5JyA6IGBObyBkYXRhIGluIHRoZSBwcmV2aW91cyAke2RheXN9IGRheXNgO1xyXG4gICAgdGhpcy5yb3dzID0gZD8ucm93cyB8fCBbXTtcclxuICAgIHRoaXMuYWxlcnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIHRoaXMudG90YWxDb3VudCA9IE51bWJlcihkPy50b3RhbENvdW50KSB8fCAwO1xyXG4gICAgaWYgKGQ/LmNhbGVuZGFyKSB7XHJcbiAgICAgIHRoaXMubW9udGggPSBkLmNhbGVuZGFyLm1vbnRoO1xyXG4gICAgICB0aGlzLmNhbGVuZGFyTGVhZCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IE51bWJlcihkLmNhbGVuZGFyLmZpcnN0V2Vla2RheSkgfHwgMCB9LCAoXywgaSkgPT4gaSk7XHJcbiAgICAgIHRoaXMuY2FsZW5kYXJEYXlzID0gZC5jYWxlbmRhci5kYXlzIHx8IFtdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnJvd3NMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKiAtLS0tIEhlYWRlciAtLS0tICovXHJcblxyXG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuYnkgPT09ICdhdWRpdCcpIHsgcmV0dXJuIHRoaXMuaW5mbz8ubmFtZSB8fCAnQXVkaXQnOyB9XHJcbiAgICBpZiAodGhpcy5ieSA9PT0gJ3N0b3JlJykgeyByZXR1cm4gdGhpcy5pbmZvPy5uYW1lID8gYCR7dGhpcy5pbmZvLm5hbWV9ICgke3RoaXMuc3ViamVjdElkfSlgIDogdGhpcy5zdWJqZWN0SWQ7IH1cclxuICAgIHJldHVybiB0aGlzLmluZm8/Lm5hbWUgfHwgdGhpcy5zdWJqZWN0SWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5pdGlhbHMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAodGhpcy5pbmZvPy5uYW1lIHx8IHRoaXMuc3ViamVjdElkIHx8ICcnKS5yZXBsYWNlKC9bXkEtWmEtel0vZywgJycpLnNsaWNlKDAsIDIpLnRvVXBwZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogLS0tLSBDYXJkcyAtLS0tICovXHJcblxyXG4gIHByaXZhdGUgcGN0KHY6IG51bWJlciB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkID8gJ+KAlCcgOiB2ICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgLyoqIEF1ZGl0IC8gdXNlciBwYWdlczogdGhlIHRocmVlIGNvdW50IGNhcmRzIGFib3ZlIHRoZSBjYWxlbmRhci4gKi9cclxuICBnZXQgY291bnRLcGlzKCk6IERldGFpbEtwaVtdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsgbGFiZWw6ICdUb3RhbCBBdWRpdHMnLCB2YWx1ZTogU3RyaW5nKHRoaXMuY2FyZHMudmlzaXRzKSwgZGVsdGE6IHRoaXMuZGVsdGFzWyd2aXNpdHMnXSA/PyBudWxsLCBwb2ludHM6IGZhbHNlLCBoaWdoZXJJc0JhZDogZmFsc2UgfSxcclxuICAgICAgeyBsYWJlbDogJ0NvbXBsZXRlZCBBdWRpdHMnLCB2YWx1ZTogU3RyaW5nKHRoaXMuY2FyZHMuc3VibWl0dGVkKSwgZGVsdGE6IHRoaXMuZGVsdGFzWydzdWJtaXR0ZWQnXSA/PyBudWxsLCBwb2ludHM6IGZhbHNlLCBoaWdoZXJJc0JhZDogZmFsc2UgfSxcclxuICAgICAgeyBsYWJlbDogJ0ZsYWdzJywgdmFsdWU6IFN0cmluZyh0aGlzLmNhcmRzLmZsYWdzKSwgZGVsdGE6IHRoaXMuZGVsdGFzWydmbGFncyddID8/IG51bGwsIHBvaW50czogZmFsc2UsIGhpZ2hlcklzQmFkOiB0cnVlIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICAvKiogQXVkaXQgLyB1c2VyIHBhZ2VzOiB0aGUgc2NvcmUgY2FyZHMgYmVzaWRlIHRoZSBjYWxlbmRhci4gKi9cclxuICBnZXQgc2NvcmVLcGlzKCk6IERldGFpbEtwaVtdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsgbGFiZWw6ICdDb21wbGV0aW9uIFNjb3JlJywgdmFsdWU6IHRoaXMucGN0KHRoaXMuY2FyZHMuY29tcGxldGlvbiksIGRlbHRhOiB0aGlzLmRlbHRhc1snY29tcGxldGlvbiddID8/IG51bGwsIHBvaW50czogdHJ1ZSwgaGlnaGVySXNCYWQ6IGZhbHNlIH0sXHJcbiAgICAgIHsgbGFiZWw6ICdDb21wbGlhbmNlIFJhdGUnLCB2YWx1ZTogdGhpcy5wY3QodGhpcy5jYXJkcy5jb21wbGlhbmNlKSwgZGVsdGE6IHRoaXMuZGVsdGFzWydjb21wbGlhbmNlJ10gPz8gbnVsbCwgcG9pbnRzOiB0cnVlLCBoaWdoZXJJc0JhZDogZmFsc2UgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZSBwYWdlOiB0aGUgdGhyZWUgZmlndXJlcyBpbiB0aGUgU3VibWl0dGVkIGNhcmQuICovXHJcbiAgZ2V0IHN0b3JlS3BpcygpOiBEZXRhaWxLcGlbXSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGxhYmVsOiAnQ29tcGxldGlvbiBTY29yZScsIHZhbHVlOiB0aGlzLnBjdCh0aGlzLmNhcmRzLmNvbXBsZXRpb24pLCBkZWx0YTogdGhpcy5kZWx0YXNbJ2NvbXBsZXRpb24nXSA/PyBudWxsLCBwb2ludHM6IHRydWUsIGhpZ2hlcklzQmFkOiBmYWxzZSB9LFxyXG4gICAgICB7IGxhYmVsOiAnQ29tcGxpYW5jZSBTY29yZScsIHZhbHVlOiB0aGlzLnBjdCh0aGlzLmNhcmRzLmNvbXBsaWFuY2UpLCBkZWx0YTogdGhpcy5kZWx0YXNbJ2NvbXBsaWFuY2UnXSA/PyBudWxsLCBwb2ludHM6IHRydWUsIGhpZ2hlcklzQmFkOiBmYWxzZSB9LFxyXG4gICAgICB7IGxhYmVsOiAnVG90YWwgRmxhZ3MnLCB2YWx1ZTogU3RyaW5nKHRoaXMuY2FyZHMuZmxhZ3MpLCBkZWx0YTogdGhpcy5kZWx0YXNbJ2ZsYWdzJ10gPz8gbnVsbCwgcG9pbnRzOiBmYWxzZSwgaGlnaGVySXNCYWQ6IHRydWUgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGRlbHRhVGV4dChrOiBEZXRhaWxLcGkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGsuZGVsdGEgPT09IG51bGwgPyAn4oCUJyA6IE1hdGguYWJzKGsuZGVsdGEpICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgZGVsdGFEaXIoazogRGV0YWlsS3BpKTogJ3VwJyB8ICdkb3duJyB8ICdmbGF0JyB7XHJcbiAgICBpZiAoay5kZWx0YSA9PT0gbnVsbCB8fCBrLmRlbHRhID09PSAwKSB7IHJldHVybiAnZmxhdCc7IH1cclxuICAgIHJldHVybiBrLmRlbHRhID4gMCA/ICd1cCcgOiAnZG93bic7XHJcbiAgfVxyXG5cclxuICAvKiogR3JlZW4gd2hlbiB0aGUgY2hhbmdlIGlzIGdvb2QsIHJlZCB3aGVuIGJhZCwgZ3JleSB3aGVuIHVuY2hhbmdlZCBvciB1bmtub3duLiAqL1xyXG4gIGRlbHRhVG9uZShrOiBEZXRhaWxLcGkpOiAnZ29vZCcgfCAnYmFkJyB8ICdmbGF0JyB7XHJcbiAgICBjb25zdCBkaXIgPSB0aGlzLmRlbHRhRGlyKGspO1xyXG4gICAgaWYgKGRpciA9PT0gJ2ZsYXQnKSB7IHJldHVybiAnZmxhdCc7IH1cclxuICAgIHJldHVybiAoZGlyID09PSAndXAnKSAhPT0gay5oaWdoZXJJc0JhZCA/ICdnb29kJyA6ICdiYWQnO1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0gQ2FsZW5kYXIgLS0tLSAqL1xyXG5cclxuICBnZXQgbW9udGhMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubW9udGggPyBkYXlqcyh0aGlzLm1vbnRoICsgJy0wMScpLmZvcm1hdCgnTU1NTSBZWVlZJykgOiAnJztcclxuICB9XHJcblxyXG4gIHNoaWZ0TW9udGgoc3RlcDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMubW9udGgpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLm1vbnRoID0gZGF5anModGhpcy5tb250aCArICctMDEnKS5hZGQoc3RlcCwgJ21vbnRoJykuZm9ybWF0KCdZWVlZLU1NJyk7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICB9XHJcblxyXG4gIGRheVRpdGxlKGQ6IENhbGVuZGFyRGF5KTogc3RyaW5nIHtcclxuICAgIGlmICghZC52aXNpdHMpIHsgcmV0dXJuICdObyB2aXNpdHMnOyB9XHJcbiAgICBjb25zdCBzY29yZSA9IGQuc2NvcmUgPT09IG51bGwgPyAnJyA6IGAgwrcgc2NvcmUgJHtkLnNjb3JlfSVgO1xyXG4gICAgcmV0dXJuIGAke2QudmlzaXRzfSB2aXNpdCR7ZC52aXNpdHMgPT09IDEgPyAnJyA6ICdzJ30gwrcgJHtkLnN1Ym1pdHRlZH0gc3VibWl0dGVkJHtzY29yZX1gO1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0gVGFibGUgLS0tLSAqL1xyXG5cclxuICBvblNlYXJjaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VhcmNoJC5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBvblN0YXR1cygpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICB9XHJcblxyXG4gIG9uUGFnZUNoYW5nZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZSA9IHBhZ2U7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBDb2x1bW4gc29ydCwgZG9uZSBieSB0aGUgQVBJICh0aGUgdGFibGUgaXMgcGFnZWQgdGhlcmUpOyAnJyA9IG5ld2VzdCB2aXNpdCBmaXJzdC4gKi9cclxuICBzb3J0Q29sdW1uID0gJyc7XHJcbiAgc29ydEJ5OiAxIHwgLTEgPSAxO1xyXG5cclxuICBzb3J0VGFibGUoY29sdW1uOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc29ydEJ5ID0gdGhpcy5zb3J0Q29sdW1uID09PSBjb2x1bW4gJiYgdGhpcy5zb3J0QnkgPT09IDEgPyAtMSA6IDE7XHJcbiAgICB0aGlzLnNvcnRDb2x1bW4gPSBjb2x1bW47XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgdGhpcy5sb2FkKCk7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKHNpemU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IE51bWJlcihzaXplKSB8fCAxMDtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICB9XHJcblxyXG4gIC8qKiBPcGVuIC8gSW4gUHJvZ3Jlc3MgLyBTdWJtaXR0ZWQ7IGEgcmVkbyByZWFkcyBcIlJlZG9cIiB3aGlsZSBwZW5kaW5nIGFuZCBcIlN1Ym1pdHRlZCAoUmVkbylcIiBvbmNlIHJlc3VibWl0dGVkLiAqL1xyXG4gIHN0YXR1c0xhYmVsKHJvdzogRGV0YWlsUm93KTogc3RyaW5nIHtcclxuICAgIGlmIChyb3cucmVkbykgeyByZXR1cm4gcm93LnN0YXR1cyA9PT0gJ3N1Ym1pdCcgPyAnU3VibWl0dGVkIChSZWRvKScgOiAnUmVkbyc7IH1cclxuICAgIHJldHVybiByb3cuc3RhdHVzID09PSAnc3VibWl0JyA/ICdTdWJtaXR0ZWQnIDogKHJvdy5zdGF0dXMgPT09ICdpbnByb2dyZXNzJyA/ICdJbiBQcm9ncmVzcycgOiAnT3BlbicpO1xyXG4gIH1cclxuXHJcbiAgc3RhdHVzQmcocm93OiBEZXRhaWxSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5zdGF0dXMgPT09ICdzdWJtaXQnID8gJyNFQ0ZERjMnIDogKHJvdy5zdGF0dXMgPT09ICdpbnByb2dyZXNzJyA/ICcjRkZGQUVCJyA6ICcjRUZGOEZGJyk7XHJcbiAgfVxyXG5cclxuICBzdGF0dXNGZyhyb3c6IERldGFpbFJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnN0YXR1cyA9PT0gJ3N1Ym1pdCcgPyAnIzAyN0E0OCcgOiAocm93LnN0YXR1cyA9PT0gJ2lucHJvZ3Jlc3MnID8gJyNCNTQ3MDgnIDogJyMxNzVDRDMnKTtcclxuICB9XHJcblxyXG4gIHJvd0luaXRpYWxzKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKG5hbWUgfHwgJycpLnJlcGxhY2UoL1teQS1aYS16XS9nLCAnJykuc2xpY2UoMCwgMikgfHwgJy0tJztcclxuICB9XHJcblxyXG4gIGZtdERheSh2OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPyBkYXlqcyh2KS5mb3JtYXQoJ01NTSBERCwgWVlZWScpIDogJ+KAlCc7XHJcbiAgfVxyXG5cclxuICBmbXREYXRlKHY6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdiA/IGRheWpzKHYpLmZvcm1hdCgnREQgTU1NIFlZWVknKSA6ICctLSc7XHJcbiAgfVxyXG5cclxuICBmbXRUaW1lKHY6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPyBkYXlqcyh2KS5mb3JtYXQoJ2hoOm1tIEEsIEREIE1NTSBZWVlZJykgOiAnLS0nO1xyXG4gIH1cclxuXHJcbiAgZ2FsbGVyeVBhcmFtcyhyb3c6IERldGFpbFJvdyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHsgYXVkaXQ6IHJvdy5jaGVja2xpc3RJZCwgc3RvcmU6IHJvdy5zdG9yZUlkLCBkYXRlOiByb3cuZGF0ZSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFNhbWUgUERGIGRvd25sb2FkIGFzIHRoZSBDaGVja2xpc3QgZGFzaGJvYXJkOiBxdWV1ZWQsIHRoZW4gbGlzdGVkIHVuZGVyIE5vdGlmaWNhdGlvbnMgPiBEb3dubG9hZHMuICovXHJcbiAgZG93bmxvYWQocm93OiBEZXRhaWxSb3cpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVzZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSB8fCAne30nKTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UucmVwb3J0VGFibGVFeHBvcnQoe1xyXG4gICAgICBmcm9tRGF0ZTogdGhpcy5mcm9tRGF0ZSxcclxuICAgICAgdG9EYXRlOiB0aGlzLnRvRGF0ZSxcclxuICAgICAgY2hlY2tsaXN0SWQ6IFtyb3cuaWRdLFxyXG4gICAgICBzb3VyY2VDaGVja0xpc3RfaWQ6ICcnLFxyXG4gICAgICBjaGVja2xpc3ROYW1lOiByb3cuY2hlY2tMaXN0TmFtZSxcclxuICAgICAgZmlsZVR5cGU6ICdwZGYnLFxyXG4gICAgICBzdG9yZUlkczogW3Jvdy5zdG9yZUlkXSxcclxuICAgICAgdXNlcklkOiB1c2VyPy5faWQsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCxcclxuICAgICAgZG93bmxvYWRJbnNlcnRGcm9tOiAnZGFzaGJvYXJkJyxcclxuICAgICAgaW5zZXJ0VHlwZTogJ2NoZWNrbGlzdCcsXHJcbiAgICAgIGNoZWNrTGlzdFR5cGU6IHJvdy5jaGVja0xpc3RUeXBlIHx8ICdjdXN0b20nXHJcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnRG93bmxvYWRpbmcgeW91ciByZXBvcnQuIEZpbmQgaXQgdW5kZXIgTm90aWZpY2F0aW9ucyA+IERvd25sb2Fkcy4nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHRoaXMuZG93bmxvYWRFcnJvcihyZXMsICdDb3VsZCBub3Qgc3RhcnQgdGhlIGRvd25sb2FkJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgLy8gVGhlIEFQSSdzIG93biByZWFzb24gKGUuZy4gdGhlIGRvd25sb2FkIGNvdWxkIG5vdCBiZSBxdWV1ZWQpIGluc3RlYWQgb2YgYSBiYXJlIFwiU29tZXRoaW5nIHdlbnQgd3JvbmchXCIuXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCh0aGlzLmRvd25sb2FkRXJyb3IoZXJyPy5lcnJvciwgJ0NvdWxkIG5vdCBzdGFydCB0aGUgZG93bmxvYWQnKSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkb3dubG9hZEVycm9yKGJvZHk6IGFueSwgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBlID0gYm9keT8uZXJyb3IgPz8gYm9keT8ubWVzc2FnZTtcclxuICAgIGNvbnN0IHRleHQgPSB0eXBlb2YgZSA9PT0gJ3N0cmluZycgPyBlIDogKGU/Lm1lc3NhZ2UgfHwgZT8uZGV0YWlscz8ubWVzc2FnZSk7XHJcbiAgICByZXR1cm4gdGV4dCAmJiB0ZXh0ICE9PSAne30nID8gdGV4dCA6IGZhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqIEV2ZXJ5IHZpc2l0IHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBmaWx0ZXJzLCBhcyBhbiB4bHN4LiAqL1xyXG4gIGV4cG9ydFJvd3MoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5leHBvcnRpbmcgfHwgIXRoaXMudG90YWxDb3VudCkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuZXhwb3J0aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXREYXNoYm9hcmREZXRhaWwodGhpcy5wYXlsb2FkKHsgbGltaXQ6IDUwMDAsIG9mZnNldDogMSB9KSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZXhwb3J0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgY29uc3Qgcm93czogRGV0YWlsUm93W10gPSByZXM/LmNvZGUgPT09IDIwMCA/IChyZXMuZGF0YT8ucm93cyB8fCBbXSkgOiBbXTtcclxuICAgICAgICBjb25zdCBzaGVldCA9IHJvd3MubWFwKHIgPT4gKHtcclxuICAgICAgICAgICdEYXRlJzogdGhpcy5mbXREYXRlKHIuZGF0ZSksXHJcbiAgICAgICAgICAnQXVkaXQgTmFtZSc6IHIuY2hlY2tMaXN0TmFtZSxcclxuICAgICAgICAgICdTdG9yZSBJRCc6IHIuc3RvcmVJZCxcclxuICAgICAgICAgICdTdG9yZSBOYW1lJzogci5zdG9yZU5hbWUsXHJcbiAgICAgICAgICAnVXNlciBOYW1lJzogci51c2VyTmFtZSxcclxuICAgICAgICAgICdTdWJtaXR0ZWQgQnknOiByLnVzZXJFbWFpbCxcclxuICAgICAgICAgICdTdGF0dXMnOiB0aGlzLnN0YXR1c0xhYmVsKHIpLFxyXG4gICAgICAgICAgJ1N1Ym1pdHRlZCBPbic6IHRoaXMuZm10VGltZShyLnN1Ym1pdHRlZE9uKSxcclxuICAgICAgICAgICdTdWJtaXNzaW9uIENvdW50Jzogci5zdWJtaXNzaW9uQ291bnQsXHJcbiAgICAgICAgICAnRmxhZ3MnOiByLmZsYWdzLFxyXG4gICAgICAgICAgJ0FwcHJvdmVkIEJ5Jzogci5hcHByb3ZlZEJ5IHx8ICctLScsXHJcbiAgICAgICAgICAnQXBwcm92ZWQgT24nOiB0aGlzLmZtdFRpbWUoci5hcHByb3ZlZE9uKVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICB0aGlzLnRyYXhTZXJ2aWNlLmV4cG9ydFdvcmtib29rKFt7IG5hbWU6ICdBdWRpdCBJbmZvJywgcm93czogc2hlZXQgfV0sIGAke3RoaXMudGl0bGV9IC0gYXVkaXQgaW5mb2ApO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZXhwb3J0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdVbmFibGUgdG8gZXhwb3J0Jyk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVJvdyhfOiBudW1iZXIsIHJvdzogRGV0YWlsUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cuaWQ7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5RGF5KF86IG51bWJlciwgZDogQ2FsZW5kYXJEYXkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGQuZGF0ZTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImF2Mi1wYWdlIGF1ZGl0LWRldGFpbFwiPlxyXG4gIDwhLS0gQmFjayArIHRpdGxlIChhdWRpdDogb3duZXIgLyBzdG9yZXMgLyBzY2hlZHVsZSBjaGlwczsgdXNlcjogYXZhdGFyICsgdGFnKSAtLT5cclxuICA8ZGl2IGNsYXNzPVwic2QtaGVhZFwiPlxyXG4gICAgPGEgY2xhc3M9XCJzZC1iYWNrXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmRcIiB0aXRsZT1cIkJhY2sgdG8gZGFzaGJvYXJkXCI+XHJcbiAgICAgIDxzdmcgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIxOVwiIHkxPVwiMTJcIiB4Mj1cIjVcIiB5Mj1cIjEyXCI+PC9saW5lPlxyXG4gICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIxMiAxOSA1IDEyIDEyIDVcIj48L3BvbHlsaW5lPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYT5cclxuICAgIDxzcGFuICpuZ0lmPVwiYnkgPT09ICd1c2VyJ1wiIGNsYXNzPVwic2QtYXZhdGFyIHNkLWF2YXRhci0tbGdcIj57eyBpbml0aWFscyB8fCAnLS0nIH19PC9zcGFuPlxyXG4gICAgPGRpdiBjbGFzcz1cInNkLWhlYWQtdGV4dFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2QtdGl0bGUtcm93XCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJsb2FkaW5nICYmICFpbmZvXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS10aXRsZVwiPjwvc3Bhbj5cclxuICAgICAgICA8IS0tIEF1ZGl0IHBhZ2U6IHRoZSBuYW1lIGlzIGEgc3dpdGNoZXIgKHByb3RvdHlwZTogbmFtZSBjaGlwIHdpdGggYSBjaGV2cm9uKSArIHB1Ymxpc2hlZCBkb3QgLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImJ5ID09PSAnYXVkaXQnICYmIGF1ZGl0T3B0aW9ucy5sZW5ndGggPiAxICYmICghbG9hZGluZyB8fCBpbmZvKVwiIGNsYXNzPVwic2Qtc3dpdGNoXCIgW2NsYXNzLmlzLW9wZW5dPVwic3dpdGNoT3BlblwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZC1zd2l0Y2gtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZVN3aXRjaCgpXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJzd2l0Y2hPcGVuXCJcclxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIiB0aXRsZT1cIlN3aXRjaCBhdWRpdFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkLXN3aXRjaC1uYW1lXCI+e3sgdGl0bGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJzZC1zd2l0Y2gtY2hldlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCI2IDkgMTIgMTUgMTggOVwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zd2l0Y2gtbWVudVwiICpuZ0lmPVwic3dpdGNoT3BlblwiIHJvbGU9XCJsaXN0Ym94XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNkLXN3aXRjaC1zZWFyY2hcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiN1wiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTYuNVwiIHkxPVwiMTYuNVwiIHgyPVwiMjFcIiB5Mj1cIjIxXCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic3dpdGNoUXVlcnlcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBhdWRpdHNcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkLXN3aXRjaC1saXN0XCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZC1zd2l0Y2gtaXRlbVwiICpuZ0Zvcj1cImxldCBhIG9mIHN3aXRjaEZpbHRlcmVkXCIgcm9sZT1cIm9wdGlvblwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cImEuaWQgPT09IHN1YmplY3RJZFwiIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiYS5pZCA9PT0gc3ViamVjdElkXCIgKGNsaWNrKT1cInN3aXRjaEF1ZGl0KGEuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkLXB1YmRvdFwiIFtjbGFzcy5pcy1vbl09XCJhLnB1Ymxpc2hcIiBbdGl0bGVdPVwiYS5wdWJsaXNoID8gJ1B1Ymxpc2hlZCcgOiAnRHJhZnQnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZC1zd2l0Y2gtbGFiZWxcIiBbdGl0bGVdPVwiYS5uYW1lXCI+e3sgYS5uYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImEuaWQgPT09IHN1YmplY3RJZFwiIGNsYXNzPVwic2Qtc3dpdGNoLWNoZWNrXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Qtc3dpdGNoLWVtcHR5XCIgKm5nSWY9XCIhc3dpdGNoRmlsdGVyZWQubGVuZ3RoXCI+Tm8gYXVkaXQgbWF0Y2hlcyBcInt7IHN3aXRjaFF1ZXJ5IH19XCI8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Qtc3dpdGNoLWJhY2tkcm9wXCIgKm5nSWY9XCJzd2l0Y2hPcGVuXCIgKGNsaWNrKT1cImNsb3NlU3dpdGNoKClcIj48L2Rpdj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cIihieSAhPT0gJ2F1ZGl0JyB8fCBhdWRpdE9wdGlvbnMubGVuZ3RoIDw9IDEpICYmICghbG9hZGluZyB8fCBpbmZvKVwiIGNsYXNzPVwic2QtdGl0bGVcIj57eyB0aXRsZSB9fTwvc3Bhbj5cclxuICAgICAgICA8IS0tIExpdmUgc3RhdGUgb2YgdGhlIGF1ZGl0OiBQdWJsaXNoZWQgKGdyZWVuKSBvciBEcmFmdCAoZ3JleSkgLS0+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJieSA9PT0gJ2F1ZGl0JyAmJiBpbmZvXCIgY2xhc3M9XCJzZC1wdWJzdGF0ZVwiIFtjbGFzcy5pcy1vbl09XCJpbmZvLnB1Ymxpc2hcIlxyXG4gICAgICAgICAgW3RpdGxlXT1cImluZm8ucHVibGlzaCA/ICdUaGlzIGF1ZGl0IGlzIHB1Ymxpc2hlZCcgOiAnVGhpcyBhdWRpdCBpcyBhIGRyYWZ0IChub3QgcHVibGlzaGVkKSdcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2QtcHViZG90XCIgW2NsYXNzLmlzLW9uXT1cImluZm8ucHVibGlzaFwiPjwvc3Bhbj57eyBpbmZvLnB1Ymxpc2ggPyAnUHVibGlzaGVkJyA6ICdEcmFmdCcgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJieSA9PT0gJ3VzZXInXCIgY2xhc3M9XCJzZC10YWdcIj51c2VyPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNkLXN1YlwiICpuZ0lmPVwiYnkgIT09ICdhdWRpdCdcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYnkgPT09ICd1c2VyJyAmJiBzdWJqZWN0SWRcIj57eyBzdWJqZWN0SWQgfX0gwrcgPC9uZy1jb250YWluZXI+e3sgcGVyaW9kIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYnkgPT09ICdhdWRpdCcgJiYgaW5mb1wiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInNkLWRpdmlkZXJcIj48L3NwYW4+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzZC1jaGlwc1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2QtY2hpcFwiICpuZ0lmPVwiaW5mby5vd25lclwiIHRpdGxlPVwiQXVkaXQgb3duZXJcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0yMCAyMXYtMmE0IDQgMCAwIDAtNC00SDhhNCA0IDAgMCAwLTQgNHYyXCI+PC9wYXRoPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiN1wiIHI9XCI0XCI+PC9jaXJjbGU+PC9zdmc+XHJcbiAgICAgICAgICB7eyBpbmZvLm93bmVyIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2QtY2hpcFwiIHRpdGxlPVwiQXNzaWduZWQgc3RvcmVzXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMyA5bDEtNWgxNmwxIDVcIj48L3BhdGg+PHBhdGggZD1cIk00IDl2MTFoMTZWOVwiPjwvcGF0aD48cGF0aCBkPVwiTTkgMjB2LTZoNnY2XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAge3sgaW5mby5zdG9yZXMgfX0ge3sgaW5mby5zdG9yZXMgPT09IDEgPyAnU3RvcmUnIDogJ1N0b3JlcycgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPCEtLSBObyBzY2hlZHVsZS10eXBlIChcIk9uZSB0aW1lXCIpIG9yIGF1ZGl0LWxldmVsIHZpc2l0LXdpbmRvdyBjaGlwIChRQSAxMCBPY3QpOiBhdWRpdHMgYXJlIHNjaGVkdWxlZCBieVxyXG4gICAgICAgICAgICAgU2NoZWR1bGVzLCB3aG9zZSByb3dzIGNhcnJ5IHRoZSB2aXNpdCB3aW5kb3dzLiAtLT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgPHNwYW4gKm5nSWY9XCJieSA9PT0gJ2F1ZGl0J1wiIGNsYXNzPVwic2Qtc3ViXCI+e3sgcGVyaW9kIH19PC9zcGFuPlxyXG4gICAgPCEtLSBUaGlzIHBhZ2UncyBvd24gcGVyaW9kIChldmVyeSBkcmlsbC1kb3duIHBhZ2U7IHRoZSBoZWFkZXIgcGlja2VyIGlzIG5vdCBzaG93biBvbiBhbGwgb2YgdGhlbSkgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLWRhdGVwaWNrIHNkLWRhdGVwaWNrXCI+XHJcbiAgICAgIDxzdmcgY2xhc3M9XCJhdjItZGF0ZXBpY2staWNvblwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxyZWN0IHg9XCIzXCIgeT1cIjRcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiByeD1cIjJcIj48L3JlY3Q+XHJcbiAgICAgICAgPGxpbmUgeDE9XCIxNlwiIHkxPVwiMlwiIHgyPVwiMTZcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCI4XCIgeTE9XCIyXCIgeDI9XCI4XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiM1wiIHkxPVwiMTBcIiB4Mj1cIjIxXCIgeTI9XCIxMFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhdjItZGF0ZXBpY2staW5wdXRcIiBuZ3hEYXRlcmFuZ2VwaWNrZXJNZCByZWFkb25seSBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGRhdGUgcmFuZ2VcIiBbKG5nTW9kZWwpXT1cInJhbmdlXCIgW2xvY2FsZV09XCJwaWNrZXJMb2NhbGVcIiBbbWF4RGF0ZV09XCJ0b2RheVwiXHJcbiAgICAgICAgW3Jhbmdlc109XCJyYW5nZXNcIiBbc2hvd0N1c3RvbVJhbmdlTGFiZWxdPVwidHJ1ZVwiIFthbHdheXNTaG93Q2FsZW5kYXJzXT1cImZhbHNlXCJcclxuICAgICAgICBba2VlcENhbGVuZGFyT3BlbmluZ1dpdGhSYW5nZV09XCJ0cnVlXCIgW2F1dG9BcHBseV09XCJ0cnVlXCIgW3Nob3dDYW5jZWxdPVwiZmFsc2VcIiBbZHJvcHNdPVwiJ2Rvd24nXCIgW29wZW5zXT1cIidsZWZ0J1wiXHJcbiAgICAgICAgKGRhdGVzVXBkYXRlZCk9XCJvblJhbmdlUGlja2VkKCRldmVudClcIj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFN0b3JlIHBhZ2U6IHRoZSBwcm90b3R5cGUncyB0aHJlZSBzdGF0IGJsb2NrcyAtLT5cclxuICA8ZGl2IGNsYXNzPVwic2Qtc3RhdHNcIiAqbmdJZj1cImJ5ID09PSAnc3RvcmUnXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2Qtc3RhdFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2Qtc3RhdC1oZWFkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtYmlnXCI+PHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZVwiPjwvc3Bhbj48bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj57eyBjYXJkcy5hY3RpdmVBdWRpdHMgfX08L25nLWNvbnRhaW5lcj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Qtc3RhdC1sYWJlbFwiPkFjdGl2ZSBBdWRpdHM8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LWJvZHlcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtbWlkXCI+PHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZVwiPjwvc3Bhbj48bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj57eyBjYXJkcy52aXNpdHMgfX08L25nLWNvbnRhaW5lcj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LXN1YlwiPkF1ZGl0IEluc3RhbmNlczwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNkLXN0YXRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtaGVhZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LWJpZ1wiPjxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWVcIj48L3NwYW4+PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+e3sgY2FyZHMubm90U3VibWl0dGVkIH19PC9uZy1jb250YWluZXI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtbGFiZWxcIj5Ob3QgU3VibWl0dGVkIEF1ZGl0czwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtYm9keSBzZC1zdGF0LWJvZHktLTJcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtbWlkXCI+PHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZVwiPjwvc3Bhbj48bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj57eyBjYXJkcy5vcGVuIH19PC9uZy1jb250YWluZXI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Qtc3RhdC1zdWJcIj5PcGVuIEF1ZGl0czwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Qtc3RhdC1taWRcIj48c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlXCI+PC9zcGFuPjxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPnt7IGNhcmRzLmlucHJvZ3Jlc3MgfX08L25nLWNvbnRhaW5lcj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LXN1YlwiPkluIFByb2dyZXNzIEF1ZGl0czwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNkLXN0YXRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtaGVhZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LWJpZ1wiPjxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWVcIj48L3NwYW4+PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+e3sgY2FyZHMuc3VibWl0dGVkIH19PC9uZy1jb250YWluZXI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtbGFiZWxcIj5TdWJtaXR0ZWQgQXVkaXRzPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2Qtc3RhdC1ib2R5IHNkLXN0YXQtYm9keS0tM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LWNlbGxcIiAqbmdGb3I9XCJsZXQgayBvZiBzdG9yZUtwaXNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdGF0LW1pZFwiPjxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWVcIj48L3NwYW4+PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+e3sgay52YWx1ZSB9fTwvbmctY29udGFpbmVyPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNkLXN0YXQtc3ViXCI+e3sgay5sYWJlbCB9fTwvZGl2PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlbHRhVHBsOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogayB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gQXVkaXQgLyB1c2VyIHBhZ2VzOiBjb3VudCArIHNjb3JlIGNhcmRzIGJlc2lkZSB0aGUgbW9udGggY2FsZW5kYXIgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInNkLW92ZXJ2aWV3XCIgKm5nSWY9XCJieSAhPT0gJ3N0b3JlJ1wiPlxyXG4gICAgPCEtLSBDYXJkcyBpbiB0aGVpciBvd24gZ3JpZCwgc3RyZXRjaGVkIHRvIHRoZSBjYWxlbmRhciBoZWlnaHQ6IHRoZSBzY29yZSByb3cgdGFrZXMgd2hhdCB0aGUgY291bnQgcm93IGxlYXZlcy4gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2Qtb3ZlcnZpZXctbWFpblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2Qta3BpXCIgKm5nRm9yPVwibGV0IGsgb2YgY291bnRLcGlzXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkLWtwaS10aXRsZVwiPnt7IGsubGFiZWwgfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Qta3BpLXZhbHVlXCI+PHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZVwiPjwvc3Bhbj48bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj57eyBrLnZhbHVlIH19PC9uZy1jb250YWluZXI+PC9kaXY+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlbHRhVHBsOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaywgY2VudGVyOiB0cnVlIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIFNhbWUgbG9vayBhcyB0aGUgY291bnQgY2FyZHMgKHByb3RvdHlwZSk6IGdyYWRpZW50IHRpdGxlLCBjZW50cmVkIHZhbHVlIGFuZCBjaGFuZ2UgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzZC1rcGkgc2Qta3BpLS1zY29yZVwiICpuZ0Zvcj1cImxldCBrIG9mIHNjb3JlS3Bpc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZC1rcGktdGl0bGVcIj57eyBrLmxhYmVsIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkLWtwaS12YWx1ZVwiPjxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWVcIj48L3NwYW4+PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+e3sgay52YWx1ZSB9fTwvbmctY29udGFpbmVyPjwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWx0YVRwbDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGssIGNlbnRlcjogdHJ1ZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInNkLWNhbFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2QtY2FsLXRpdGxlXCI+XHJcbiAgICAgICAgTW9udGhseSBQZXJmb3JtYW5jZVxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2QtY2FsLWluZm9cIiB0aXRsZT1cIkNvbG91ciBzaG93cyBlYWNoIGRheSdzIHZpc2l0czogYWxsIHN1Ym1pdHRlZCBhbmQgcGFzc2luZywgcGFydGx5IGRvbmUgb3IgYmVsb3cgdGhlIHBhc3MgbWFyaywgb3Igbm9uZSBzdWJtaXR0ZWRcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCI5XCI+PC9jaXJjbGU+PHBhdGggZD1cIk0xMiA4aC4wMU0xMSAxMmgxdjRoMVwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2QtY2FsLW5hdlwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2QtY2FsLXN0ZXBcIiB0aXRsZT1cIlByZXZpb3VzIG1vbnRoXCIgKGNsaWNrKT1cInNoaWZ0TW9udGgoLTEpXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMTUgMTggOSAxMiAxNSA2XCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInNkLWNhbC1tb250aFwiPnt7IG1vbnRoTGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZC1jYWwtc3RlcFwiIHRpdGxlPVwiTmV4dCBtb250aFwiIChjbGljayk9XCJzaGlmdE1vbnRoKDEpXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiOSAxOCAxNSAxMiA5IDZcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNkLWNhbC13ZWVrXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHcgb2Ygd2Vla2RheXNcIj57eyB3IH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNkLWNhbC1kYXlzXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGkgb2YgY2FsZW5kYXJMZWFkXCIgY2xhc3M9XCJzZC1kYXkgc2QtZGF5LS1ibGFua1wiPjwvc3Bhbj5cclxuICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgZCBvZiBjYWxlbmRhckRheXM7IHRyYWNrQnk6IHRyYWNrQnlEYXlcIiBjbGFzcz1cInNkLWRheVwiIFtuZ0NsYXNzXT1cIidzZC1kYXktLScgKyBkLnN0YXR1c1wiXHJcbiAgICAgICAgICBbdGl0bGVdPVwiZGF5VGl0bGUoZClcIj57eyBkLmRheSB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzZC1jYWwtbGVnZW5kXCI+XHJcbiAgICAgICAgPHNwYW4+PGkgY2xhc3M9XCJzZC1kb3Qgc2QtZG90LS10cmFja1wiPjwvaT5PbiB0cmFjazwvc3Bhbj5cclxuICAgICAgICA8c3Bhbj48aSBjbGFzcz1cInNkLWRvdCBzZC1kb3QtLXJpc2tcIj48L2k+QXQgcmlzazwvc3Bhbj5cclxuICAgICAgICA8c3Bhbj48aSBjbGFzcz1cInNkLWRvdCBzZC1kb3QtLW1pc3NlZFwiPjwvaT5NaXNzZWQ8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gVmlzaXRzIHRhYmxlIC0tPlxyXG4gIDxzZWN0aW9uIGNsYXNzPVwic2QtY2FyZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNkLWNhcmQtaGVhZFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2QtY2FyZC10ZXh0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkLWNhcmQtdGl0bGVcIj5cclxuICAgICAgICAgIEF1ZGl0IEluZm9cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2QtY291bnRcIj57eyB0b3RhbENvdW50IH19IFRvdGFsPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZC1zdWJcIj57eyBwZXJpb2QgfX08L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBjbGFzcz1cInNkLXN0YXR1c1wiIFsobmdNb2RlbCldPVwic3RhdHVzXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TdGF0dXMoKVwiIFtvcHRpb25zXT1cInN0YXR1c09wdGlvbnNcIlxyXG4gICAgICAgIGFyaWFMYWJlbD1cIlZpc2l0IHN0YXR1c1wiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiYXYyLXNlYXJjaCBzZC1zZWFyY2hcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI3XCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICA8bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwiYnkgPT09ICdzdG9yZScgPyAnU2VhcmNoIGJ5IGF1ZGl0IG9yIGF1ZGl0b3InIDogJ1NlYXJjaCBieSBzdG9yZSBvciB1c2VyJ1wiXHJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoKClcIj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPCEtLSBTZW5kIEFsZXJ0OiByZW1pbmRlciBlbWFpbCB0byB0aGUgYXVkaXRvcnMgb2YgdGhlIHRpY2tlZCB2aXNpdHMgdGhhdCBhcmUgbm90IHN1Ym1pdHRlZCAtLT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIHNkLWFsZXJ0XCIgKm5nSWY9XCJieSA9PT0gJ2F1ZGl0JyAmJiBhY2Nlc3MuY2FuRWRpdFwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFhbGVydElkcy5zaXplIHx8IGFsZXJ0aW5nXCIgKGNsaWNrKT1cInNlbmRBbGVydCgpXCJcclxuICAgICAgICBbdGl0bGVdPVwiYWxlcnRJZHMuc2l6ZSA/ICdFbWFpbCBhIHJlbWluZGVyIHRvIHRoZSBhdWRpdG9ycyBvZiB0aGUgdGlja2VkIHZpc2l0cycgOiAnVGljayB2aXNpdHMgdGhhdCBhcmUgbm90IHN1Ym1pdHRlZCB5ZXQnXCI+XHJcbiAgICAgICAge3sgYWxlcnRpbmcgPyAnU2VuZGluZ+KApicgOiAoYWxlcnRJZHMuc2l6ZSA/ICdTZW5kIEFsZXJ0ICgnICsgYWxlcnRJZHMuc2l6ZSArICcpJyA6ICdTZW5kIEFsZXJ0JykgfX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdFwiIFtkaXNhYmxlZF09XCJleHBvcnRpbmcgfHwgIXRvdGFsQ291bnRcIiAoY2xpY2spPVwiZXhwb3J0Um93cygpXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTIxIDE1djRhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJ2LTRcIj48L3BhdGg+XHJcbiAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiNyAxMCAxMiAxNSAxNyAxMFwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICA8bGluZSB4MT1cIjEyXCIgeTE9XCIxNVwiIHgyPVwiMTJcIiB5Mj1cIjNcIj48L2xpbmU+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAge3sgZXhwb3J0aW5nID8gJ0V4cG9ydGluZ+KApicgOiAnRXhwb3J0JyB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciAqbmdJZj1cInJvd3NMb2FkaW5nXCIgW3Jvd3NdPVwiNlwiPjwvbGliLWF1ZGl0LXYyLXNoaW1tZXI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCIhcm93c0xvYWRpbmcgJiYgcm93cy5sZW5ndGhcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwic2QtdGFibGVcIiBbbmdDbGFzc109XCInc2QtdGFibGUtLScgKyBieVwiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiYnkgPT09ICdhdWRpdCdcIiBjbGFzcz1cInNkLWNoZWNrXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwic2QtY2JcIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGFsbCB2aXNpdHMgdGhhdCBhcmUgbm90IHN1Ym1pdHRlZFwiXHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhbGxBbGVydGFibGVcIiBbaW5kZXRlcm1pbmF0ZV09XCJzb21lQWxlcnRhYmxlXCIgW2Rpc2FibGVkXT1cIiFhbGVydGFibGVSb3dzLmxlbmd0aFwiIChjaGFuZ2UpPVwidG9nZ2xlQWxsQWxlcnQoKVwiPlxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydFRhYmxlKCdkYXRlJylcIj5EYXRlIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydENvbHVtbiA9PT0gJ2RhdGUnXCIgW2Rpcl09XCJzb3J0QnkgPT09IDEgPyAnYXNjJyA6ICdkZXNjJ1wiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGggKm5nSWY9XCJieSAhPT0gJ2F1ZGl0J1wiIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRUYWJsZSgnY2hlY2tMaXN0TmFtZScpXCI+QXVkaXQgTmFtZSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRDb2x1bW4gPT09ICdjaGVja0xpc3ROYW1lJ1wiIFtkaXJdPVwic29ydEJ5ID09PSAxID8gJ2FzYycgOiAnZGVzYydcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiYnkgIT09ICdzdG9yZSdcIiBjbGFzcz1cImF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0VGFibGUoJ3N0b3JlTmFtZScpXCI+U3RvcmUgTmFtZSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRDb2x1bW4gPT09ICdzdG9yZU5hbWUnXCIgW2Rpcl09XCJzb3J0QnkgPT09IDEgPyAnYXNjJyA6ICdkZXNjJ1wiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGggKm5nSWY9XCJieSAhPT0gJ3N0b3JlJ1wiIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRUYWJsZSgndXNlck5hbWUnKVwiPlVzZXIgTmFtZSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRDb2x1bW4gPT09ICd1c2VyTmFtZSdcIiBbZGlyXT1cInNvcnRCeSA9PT0gMSA/ICdhc2MnIDogJ2Rlc2MnXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0VGFibGUoJ3N0YXR1cycpXCI+U3RhdHVzIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydENvbHVtbiA9PT0gJ3N0YXR1cydcIiBbZGlyXT1cInNvcnRCeSA9PT0gMSA/ICdhc2MnIDogJ2Rlc2MnXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCAqbmdJZj1cImJ5ICE9PSAndXNlcidcIiBjbGFzcz1cImF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0VGFibGUoJ3N1Ym1pdHRlZEJ5JylcIj5TdWJtaXR0ZWQgQnkgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0Q29sdW1uID09PSAnc3VibWl0dGVkQnknXCIgW2Rpcl09XCJzb3J0QnkgPT09IDEgPyAnYXNjJyA6ICdkZXNjJ1wiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydFRhYmxlKCdzdWJtaXR0ZWRPbicpXCI+U3VibWl0dGVkIE9uIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydENvbHVtbiA9PT0gJ3N1Ym1pdHRlZE9uJ1wiIFtkaXJdPVwic29ydEJ5ID09PSAxID8gJ2FzYycgOiAnZGVzYydcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRUYWJsZSgnc3VibWlzc2lvbkNvdW50JylcIj5TdWJtaXNzaW9uIENvdW50IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydENvbHVtbiA9PT0gJ3N1Ym1pc3Npb25Db3VudCdcIiBbZGlyXT1cInNvcnRCeSA9PT0gMSA/ICdhc2MnIDogJ2Rlc2MnXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0VGFibGUoJ2ZsYWdzJylcIj5GbGFncyA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRDb2x1bW4gPT09ICdmbGFncydcIiBbZGlyXT1cInNvcnRCeSA9PT0gMSA/ICdhc2MnIDogJ2Rlc2MnXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0VGFibGUoJ2FwcHJvdmVkQnknKVwiPkFwcHJvdmVkIEJ5IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydENvbHVtbiA9PT0gJ2FwcHJvdmVkQnknXCIgW2Rpcl09XCJzb3J0QnkgPT09IDEgPyAnYXNjJyA6ICdkZXNjJ1wiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydFRhYmxlKCdhcHByb3ZlZE9uJylcIj5BcHByb3ZlZCBPbiA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRDb2x1bW4gPT09ICdhcHByb3ZlZE9uJ1wiIFtkaXJdPVwic29ydEJ5ID09PSAxID8gJ2FzYycgOiAnZGVzYydcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2Ygcm93czsgdHJhY2tCeTogdHJhY2tCeVJvd1wiPlxyXG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJieSA9PT0gJ2F1ZGl0J1wiIGNsYXNzPVwic2QtY2hlY2tcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzZC1jYlwiIFtjaGVja2VkXT1cImFsZXJ0SWRzLmhhcyhyb3cuaWQpXCIgW2Rpc2FibGVkXT1cInJvdy5zdGF0dXMgPT09ICdzdWJtaXQnXCJcclxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJyb3cuc3RhdHVzID09PSAnc3VibWl0JyA/ICdBbHJlYWR5IHN1Ym1pdHRlZCcgOiAnU2VsZWN0IGZvciBTZW5kIEFsZXJ0J1wiIChjaGFuZ2UpPVwidG9nZ2xlQWxlcnQocm93KVwiPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJzZC1ub3dyYXBcIj57eyBmbXREYXRlKHJvdy5kYXRlKSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImJ5ICE9PSAnYXVkaXQnXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2QtYXZhdGFyXCI+e3sgcm93SW5pdGlhbHMocm93LmNoZWNrTGlzdE5hbWUpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdjItZWxsaXBzaXNcIiBbYXYyVGlwXT1cInJvdy5jaGVja0xpc3ROYW1lXCI+e3sgcm93LmNoZWNrTGlzdE5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImJ5ICE9PSAnc3RvcmUnXCIgY2xhc3M9XCJhdjItZWxsaXBzaXNcIj5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cInNkLWxpbmsgc2QtbGluay0tcGxhaW5cIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9zdG9yZVwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgc3RvcmU6IHJvdy5zdG9yZUlkIH0pXCIgW3RpdGxlXT1cInJvdy5zdG9yZU5hbWUgfHwgJydcIj57eyByb3cuc3RvcmVOYW1lIHx8ICfigJQnIH19PC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJieSAhPT0gJ3N0b3JlJ1wiIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+XHJcbiAgICAgICAgICAgICAgPGEgKm5nSWY9XCJieSAhPT0gJ3VzZXInXCIgY2xhc3M9XCJzZC1saW5rIHNkLWxpbmstLXBsYWluXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvdXNlclwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgZW1haWw6IHJvdy51c2VyRW1haWwgfSlcIiBbdGl0bGVdPVwicm93LnVzZXJFbWFpbFwiPnt7IHJvdy51c2VyTmFtZSB8fCByb3cudXNlckVtYWlsIH19PC9hPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYnkgPT09ICd1c2VyJ1wiIFt0aXRsZV09XCJyb3cudXNlckVtYWlsXCI+e3sgcm93LnVzZXJOYW1lIHx8IHJvdy51c2VyRW1haWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkLXBpbGxcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJzdGF0dXNCZyhyb3cpXCIgW3N0eWxlLmNvbG9yXT1cInN0YXR1c0ZnKHJvdylcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJyb3cucmVkb1wiIGNsYXNzPVwic2QtcmVkb1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjIuMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjx0aXRsZT5SZWRvPC90aXRsZT48cG9seWxpbmUgcG9pbnRzPVwiMSA0IDEgMTAgNyAxMFwiPjwvcG9seWxpbmU+PHBhdGggZD1cIk0zLjUgMTVhOSA5IDAgMSAwIDIuMS05LjRMMSAxMFwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgIHt7IHN0YXR1c0xhYmVsKHJvdykgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImJ5ICE9PSAndXNlcidcIiBjbGFzcz1cImF2Mi1lbGxpcHNpcyBhdjItZGltXCIgW2F2MlRpcF09XCJyb3cudXNlckVtYWlsXCI+e3sgcm93LnVzZXJFbWFpbCB8fCAnLS0nIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWRpbSBzZC1ub3dyYXBcIj57eyBmbXRUaW1lKHJvdy5zdWJtaXR0ZWRPbikgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LnN1Ym1pc3Npb25Db3VudCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuZmxhZ3MgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXNcIiBbY2xhc3MuYXYyLWZhaW50XT1cIiFyb3cuYXBwcm92ZWRCeVwiPnt7IHJvdy5hcHByb3ZlZEJ5IHx8ICctLScgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJzZC1ub3dyYXBcIiBbY2xhc3MuYXYyLWZhaW50XT1cIiFyb3cuYXBwcm92ZWRPblwiPnt7IGZtdFRpbWUocm93LmFwcHJvdmVkT24pIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2QtYWN0aW9uc1wiICpuZ0lmPVwicm93LnN0YXR1cyA9PT0gJ3N1Ym1pdCdcIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwic2QtbGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZ2FsbGVyeVwiIFtxdWVyeVBhcmFtc109XCJnYWxsZXJ5UGFyYW1zKHJvdylcIj5WaWV3PC9hPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJzZC1saW5rXCIgKGNsaWNrKT1cImRvd25sb2FkKHJvdylcIj5Eb3dubG9hZDwvYT5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuc3RhdHVzICE9PSAnc3VibWl0J1wiIGNsYXNzPVwiYXYyLWZhaW50XCI+LS08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiIXJvd3NMb2FkaW5nICYmICFyb3dzLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPnt7IHN1YmplY3RJZCA/ICdUaGVyZSBhcmUgbm8gYXVkaXQgdmlzaXRzIGZvciB0aGlzIGZpbHRlciBpbiB0aGUgc2VsZWN0ZWQgcGVyaW9kJyA6ICdPcGVuIHRoaXMgcGFnZSBmcm9tIHRoZSBEYXNoYm9hcmQnIH19PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInNkLXBhZ2luYXRpb25cIiAqbmdJZj1cInRvdGFsQ291bnRcIj5cclxuICAgICAgPGxpYi1wYWdpbmF0aW9uIFtpdGVtc1BlclBhZ2VdPVwicGFnZVNpemVcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiXHJcbiAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBhZ2VcIiBbdG90YWxJdGVtc109XCJ0b3RhbENvdW50XCIgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9zZWN0aW9uPlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gQ2hhbmdlIHZzIHRoZSBwcmV2aW91cyBwZXJpb2Q6IGFycm93ICsgJSAocG9pbnRzIGZvciBzY29yZXMpICsgXCJ2cyBsYXN0IGRheSAvIHByZXZpb3VzIE4gZGF5c1wiIC0tPlxyXG48bmctdGVtcGxhdGUgI2RlbHRhVHBsIGxldC1rIGxldC1jZW50ZXI9XCJjZW50ZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwic2QtZGVsdGFcIiBbY2xhc3Muc2QtZGVsdGEtLWNlbnRlcl09XCJjZW50ZXJcIiBbbmdDbGFzc109XCInc2QtZGVsdGEtLScgKyBkZWx0YVRvbmUoaylcIj5cclxuICAgIDxzdmcgKm5nSWY9XCJkZWx0YURpcihrKSA9PT0gJ3VwJ1wiIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjIuMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCI0IDE2IDEwIDEwIDE0IDE0IDIwIDhcIj48L3BvbHlsaW5lPjxwb2x5bGluZSBwb2ludHM9XCIxNSA4IDIwIDggMjAgMTNcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgPHN2ZyAqbmdJZj1cImRlbHRhRGlyKGspID09PSAnZG93bidcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICBzdHJva2Utd2lkdGg9XCIyLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNCA4IDEwIDE0IDE0IDEwIDIwIDE2XCI+PC9wb2x5bGluZT48cG9seWxpbmUgcG9pbnRzPVwiMTUgMTYgMjAgMTYgMjAgMTFcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImsuZGVsdGEgIT09IG51bGw7IGVsc2Ugbm9QcmV2XCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwic2QtZGVsdGEtdmFsXCI+e3sgZGVsdGFUZXh0KGspIH19PC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInNkLWRlbHRhLXZzXCI+e3sgdnNMYWJlbCB9fTwvc3Bhbj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLXRlbXBsYXRlICNub1ByZXY+PHNwYW4gY2xhc3M9XCJzZC1kZWx0YS12c1wiIFthdHRyLnRpdGxlXT1cIidOb3RoaW5nIHdhcyByZWNvcmRlZCBpbiB0aGF0IHBlcmlvZCwgc28gdGhlcmUgaXMgbm8gY2hhbmdlIHRvIHNob3cnXCI+e3sgbm9QcmV2TGFiZWwgfX08L3NwYW4+PC9uZy10ZW1wbGF0ZT5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19