tango-app-ui-manage-tickets 3.7.0-beta.53 → 3.7.0-beta.54

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.
@@ -1,4 +1,5 @@
1
1
  import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
2
3
  import * as i0 from "@angular/core";
3
4
  import * as i1 from "@angular/forms";
4
5
  import * as i2 from "../../services/ticket.service";
@@ -55,35 +56,44 @@ export class TicketFilterPanelComponent {
55
56
  this.filterForm = this.fb.group({
56
57
  status: [[]],
57
58
  reviewerCondition: [null],
58
- reviewerFrom: [null],
59
- reviewerTo: [null],
59
+ reviewerFrom: [null, [Validators.min(0), Validators.max(100)]],
60
+ reviewerTo: [null, [Validators.min(0), Validators.max(100)]],
60
61
  approverCondition: [null],
61
- approverFrom: [null],
62
- approverTo: [null],
62
+ approverFrom: [null, [Validators.min(0), Validators.max(100)]],
63
+ approverTo: [null, [Validators.min(0), Validators.max(100)]],
63
64
  tangoCondition: [null],
64
- tangoFrom: [null],
65
- tangoTo: [null],
65
+ tangoFrom: [null, [Validators.min(0), Validators.max(100)]],
66
+ tangoTo: [null, [Validators.min(0), Validators.max(100)]],
66
67
  reviewedBy: [[]],
67
68
  approvedBy: [[]],
68
69
  });
69
70
  }
71
+ limitValue(event, controlName) {
72
+ let value = Number(event.target.value);
73
+ if (value < 0)
74
+ value = 0;
75
+ if (value > 100)
76
+ value = 100;
77
+ event.target.value = value;
78
+ this.filterForm.get(controlName)?.setValue(value, { emitEvent: false });
79
+ }
70
80
  get isTango() {
71
81
  return this.userType === 'tango';
72
82
  }
73
83
  // SHOW / HIDE RULES
74
84
  // Reviewer accuracy and "Reviewed by" visible for tango + reviewer
75
85
  get showReviewerAccuracy() {
76
- return this.permissionType === 'review';
86
+ return this.isTango || this.permissionType === 'review';
77
87
  }
78
88
  get showReviewedBy() {
79
- return this.isTango || this.permissionType === 'review';
89
+ return this.permissionType === 'review';
80
90
  }
81
91
  // Approver accuracy and "Approved by" visible for tango + approver
82
92
  get showApproverAccuracy() {
83
- return this.permissionType === 'approve';
93
+ return this.isTango || this.permissionType === 'approve';
84
94
  }
85
95
  get showApprovedBy() {
86
- return this.isTango || this.permissionType === 'approve';
96
+ return this.permissionType === 'approve';
87
97
  }
88
98
  // Tango accuracy only for tango users
89
99
  get showTangoAccuracy() {
@@ -142,26 +152,16 @@ export class TicketFilterPanelComponent {
142
152
  }
143
153
  // full user list you already have
144
154
  userList = [];
145
- // search text for reviewer dropdown
146
- filteredReviewerList = [];
147
- // search text
148
155
  reviewerSearchTerm = '';
149
- // computed list used in *ngFor
150
- initReviewerList(users) {
151
- this.userList = users || [];
152
- this.filteredReviewerList = [...this.userList];
153
- }
154
- onReviewerSearch(value) {
155
- this.reviewerSearchTerm = value || '';
156
- const term = this.reviewerSearchTerm.trim().toLowerCase();
156
+ // ✅ simple computed list for *ngFor
157
+ get filteredReviewerList() {
158
+ const term = (this.reviewerSearchTerm || '').trim().toLowerCase();
157
159
  if (!term) {
158
- // reset
159
- this.filteredReviewerList = [...this.userList];
160
- return;
160
+ return this.userList;
161
161
  }
162
- this.filteredReviewerList = this.userList.filter((u) => {
162
+ return this.userList.filter(u => {
163
163
  const email = (u.email || '').toLowerCase();
164
- const name = (u.name || '').toLowerCase(); // optional
164
+ const name = (u.name || '').toLowerCase();
165
165
  return email.includes(term) || name.includes(term);
166
166
  });
167
167
  }
@@ -203,7 +203,6 @@ export class TicketFilterPanelComponent {
203
203
  next: (res) => {
204
204
  if (res && res.code === 200) {
205
205
  this.userList = res.data;
206
- this.initReviewerList(res.data);
207
206
  }
208
207
  else {
209
208
  this.userList = [];
@@ -313,8 +312,23 @@ export class TicketFilterPanelComponent {
313
312
  tangoFrom: null,
314
313
  tangoTo: null,
315
314
  reviewedBy: [],
316
- approvedBy: [],
315
+ approvedBy: []
317
316
  });
317
+ // 2️⃣ Reset search terms
318
+ this.reviewerSearchTerm = '';
319
+ this.approverSearchTerm = '';
320
+ // 3️⃣ Build empty payload to send back
321
+ const payload = {
322
+ filterByStatus: [],
323
+ filterByReviewer: null,
324
+ filterByApprover: null,
325
+ filterByTango: null,
326
+ filterByReviewedBy: [],
327
+ fileterByApprovedBy: []
328
+ };
329
+ // 4️⃣ Emit the now-empty filter result
330
+ this.apply.emit(payload);
331
+ // 5️⃣ Close the filter panel
318
332
  this.close();
319
333
  }
320
334
  mapAccuracy(condition, from, to) {
@@ -350,17 +364,16 @@ export class TicketFilterPanelComponent {
350
364
  filterByReviewedBy: raw.reviewedBy || [],
351
365
  fileterByApprovedBy: raw.approvedBy || [],
352
366
  };
353
- console.log();
354
367
  this.apply.emit(payload);
355
368
  this.close();
356
369
  this.showPanel = false;
357
370
  }
358
371
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TicketFilterPanelComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ElementRef }, { token: i2.TicketService }], target: i0.ɵɵFactoryTarget.Component });
359
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TicketFilterPanelComponent, selector: "lib-ticket-filter-panel", inputs: { permissionType: "permissionType", userType: "userType", client: "client" }, outputs: { apply: "apply", panelClosed: "panelClosed" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, usesOnChanges: true, ngImport: i0, template: "<!-- ticket-filter-panel.component.html -->\r\n<div class=\"filter-wrapper\" *ngIf=\"isOpen\">\r\n <div class=\"filter-card\">\r\n <div class=\"filter-header d-flex justify-content-between align-items-center mb-3\">\r\n <div class=\"title\">Filter Options</div>\r\n <!-- <button type=\"button\" class=\"btn-close\" (click)=\"close()\">\u2715</button> -->\r\n </div>\r\n\r\n <form [formGroup]=\"filterForm\">\r\n <!-- Status -->\r\n<div class=\"mb-3 position-relative\" (click)=\"$event.stopPropagation()\">\r\n <label class=\"form-label\">Status</label>\r\n\r\n <!-- Header / trigger -->\r\n <div\r\n class=\"status-select border rounded px-3 py-2 d-flex justify-content-between align-items-center\"\r\n (click)=\"toggleStatusDropdown($event)\"\r\n >\r\n <span *ngIf=\"!selectedStatuses.length\">Select</span>\r\n\r\n <span *ngIf=\"selectedStatuses.length === 1\">\r\n {{ selectedStatuses[0] }}\r\n </span>\r\n\r\n <span *ngIf=\"selectedStatuses.length > 1\" class=\"d-flex align-items-center\">\r\n <span>{{ selectedStatuses[0] }}</span>\r\n <span class=\"badge ms-2\">\r\n +{{ selectedStatuses.length - 1 }}\r\n </span>\r\n </span>\r\n\r\n </div>\r\n\r\n <!-- DROPDOWN PANEL (OVERLAY) -->\r\n <div\r\n class=\"status-dropdown position-absolute w-100 mt-1 border rounded p-1 bg-white\"\r\n style=\"z-index: 1000; max-height: 220px; overflow-y: auto;\"\r\n *ngIf=\"statusDropdownOpen\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <!-- Select All -->\r\n <div class=\"form-check px-0 d-flex align-items-center mb-2\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input text-dark\"\r\n id=\"status-select-all\"\r\n [checked]=\"areAllStatusesSelected()\"\r\n (change)=\"onStatusSelectAllChange($event)\"\r\n />\r\n <label class=\"form-check-label ms-2\" for=\"status-select-all\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n\r\n <!-- Options -->\r\n <div\r\n class=\"form-check px-0 d-flex align-items-center mb-1\"\r\n *ngFor=\"let s of statusOptions\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input text-dark\"\r\n [id]=\"'status-' + s\"\r\n [checked]=\"isStatusSelected(s)\"\r\n (change)=\"onStatusChange($event, s)\"\r\n />\r\n <label class=\"form-check-label ms-2\" [for]=\"'status-' + s\">\r\n {{ s }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n <!-- Reviewer accuracy -->\r\n <div class=\"mb-3\" *ngIf=\"showReviewerAccuracy\">\r\n <label class=\"form-label\">Reviewer accuracy (%) by condition</label>\r\n <div class=\"d-flex gap-2\">\r\n <select class=\"form-select w-100\" formControlName=\"reviewerCondition\">\r\n <option [ngValue]=\"null\">Select</option>\r\n <option *ngFor=\"let c of conditionOptions\" [ngValue]=\"c.value\">\r\n {{ c.label }}\r\n </option>\r\n </select>\r\n\r\n <!-- one or two inputs -->\r\n <ng-container *ngIf=\"isBetween('reviewerCondition'); else singleReviewer\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"reviewerFrom\"\r\n placeholder=\"From\" />\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"reviewerTo\"\r\n placeholder=\"To\" />\r\n </ng-container>\r\n <ng-template #singleReviewer>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"reviewerFrom\"\r\n placeholder=\"1 to 100%\" />\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Approver accuracy -->\r\n <div class=\"mb-3\" *ngIf=\"showApproverAccuracy\">\r\n <label class=\"form-label\">Approver accuracy (%) by condition</label>\r\n <div class=\"d-flex gap-2\">\r\n <select class=\"form-select w-100\" formControlName=\"approverCondition\">\r\n <option [ngValue]=\"null\">Select</option>\r\n <option *ngFor=\"let c of conditionOptions\" [ngValue]=\"c.value\">\r\n {{ c.label }}\r\n </option>\r\n </select>\r\n\r\n <ng-container *ngIf=\"isBetween('approverCondition'); else singleApprover\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"approverFrom\"\r\n placeholder=\"From\" />\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"approverTo\"\r\n placeholder=\"To\" />\r\n </ng-container>\r\n <ng-template #singleApprover>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"approverFrom\"\r\n placeholder=\"1 to 100%\" />\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Tango accuracy -->\r\n <div class=\"mb-3\" *ngIf=\"showTangoAccuracy\">\r\n <label class=\"form-label\">Tango accuracy (%) by condition</label>\r\n <div class=\"d-flex gap-2\">\r\n <select class=\"form-select w-50\" formControlName=\"tangoCondition\">\r\n <option [ngValue]=\"null\">Select</option>\r\n <option *ngFor=\"let c of conditionOptions\" [ngValue]=\"c.value\">\r\n {{ c.label }}\r\n </option>\r\n </select>\r\n\r\n <ng-container *ngIf=\"isBetween('tangoCondition'); else singleTango\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"tangoFrom\"\r\n placeholder=\"From\" />\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"tangoTo\"\r\n placeholder=\"To\" />\r\n </ng-container>\r\n <ng-template #singleTango>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"tangoFrom\"\r\n placeholder=\"1 to 100%\" />\r\n </ng-template>\r\n </div>\r\n </div>\r\n<div\r\n class=\"mb-3 position-relative\"\r\n *ngIf=\"showReviewedBy\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n <label class=\"form-label\">Reviewed by</label>\r\n\r\n <!-- Trigger / display -->\r\n <div\r\n class=\"border rounded px-3 py-2 d-flex justify-content-between align-items-center\"\r\n (click)=\"toggleReviewerDropdown($event)\"\r\n >\r\n <!-- 0 selected -->\r\n <span *ngIf=\"!selectedReviewedBy.length\">\r\n Select\r\n </span>\r\n\r\n <!-- 1 selected -->\r\n <span *ngIf=\"selectedReviewedBy.length === 1\">\r\n {{ selectedReviewedBy[0] }}\r\n </span>\r\n\r\n <!-- >1 selected -->\r\n <span\r\n *ngIf=\"selectedReviewedBy.length > 1\"\r\n class=\"d-flex align-items-center\"\r\n >\r\n <span>{{ selectedReviewedBy[0] }}</span>\r\n <span class=\"badge ms-2\">\r\n +{{ selectedReviewedBy.length - 1 }}\r\n </span>\r\n </span>\r\n </div>\r\n\r\n <!-- Dropdown panel -->\r\n <!-- Dropdown panel -->\r\n<div\r\n *ngIf=\"reviewerDropdownOpen\"\r\n class=\"position-absolute w-100 border rounded bg-white p-1 mt-1\"\r\n style=\"z-index: 1000; max-height: 220px; overflow-y: auto;\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n\r\n <!-- \uD83D\uDD0D Search box -->\r\n <div class=\"mb-2 px-0\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search by email\"\r\n [(ngModel)]=\"reviewerSearchTerm\"\r\n (ngModelChange)=\"onReviewerSearch($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div>\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check px-0 mb-2 d-flex align-items-center\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"reviewer-all\"\r\n [checked]=\"areAllReviewersSelected()\"\r\n (change)=\"onReviewerSelectAll($event)\"\r\n />\r\n <label for=\"reviewer-all\" class=\"form-check-label ms-2\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options \u2013 \uD83D\uDD25 now use filteredReviewerList -->\r\n <div\r\n class=\"form-check mb-1 px-0 d-flex align-items-center\"\r\n *ngFor=\"let u of filteredReviewerList\"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [id]=\"'rev-' + u.email\"\r\n [checked]=\"isReviewerSelected(u.email)\"\r\n (change)=\"onReviewerChange($event, u.email)\"\r\n />\r\n <label class=\"form-check-label ms-2\" [for]=\"'rev-' + u.email\">\r\n {{ u.email }}\r\n </label>\r\n </div>\r\n</div>\r\n\r\n</div>\r\n\r\n\r\n <!-- Approved By -->\r\n<div\r\n class=\"mb-3 position-relative\"\r\n *ngIf=\"showApprovedBy\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n <label class=\"form-label\">Approved by</label>\r\n\r\n <!-- Trigger / display -->\r\n <div\r\n class=\"border rounded px-3 py-2 d-flex justify-content-between align-items-center\"\r\n (click)=\"toggleApproverDropdown($event)\"\r\n >\r\n <!-- 0 selected -->\r\n <span *ngIf=\"!selectedApprovedBy.length\">\r\n Select\r\n </span>\r\n\r\n <!-- 1 selected -->\r\n <span *ngIf=\"selectedApprovedBy.length === 1\">\r\n {{ selectedApprovedBy[0] }}\r\n </span>\r\n\r\n <!-- >1 selected -->\r\n <span\r\n *ngIf=\"selectedApprovedBy.length > 1\"\r\n class=\"d-flex align-items-center\"\r\n >\r\n <span>{{ selectedApprovedBy[0] }}</span>\r\n <span class=\"badge ms-2\">\r\n +{{ selectedApprovedBy.length - 1 }}\r\n </span>\r\n </span>\r\n\r\n </div>\r\n<!-- Dropdown panel -->\r\n<div\r\n *ngIf=\"approverDropdownOpen\"\r\n class=\"position-absolute w-100 border rounded bg-white p-1 mt-1\"\r\n style=\"z-index: 1000; max-height: 220px; overflow-y: auto;\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n\r\n <!-- \uD83D\uDD0D Search box -->\r\n <div class=\"mb-2 px-0\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search by email\"\r\n [ngModel]=\"approverSearchTerm\"\r\n (ngModelChange)=\"onReviewerSearch($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div>\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check px-0 mb-2 d-flex align-items-center\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"reviewer-all\"\r\n [checked]=\"areAllReviewersSelected()\"\r\n (change)=\"onReviewerSelectAll($event)\"\r\n />\r\n <label for=\"reviewer-all\" class=\"form-check-label ms-2\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options (use filteredReviewerList instead of userList) -->\r\n <div\r\n class=\"form-check mb-1 px-0 d-flex align-items-center\"\r\n *ngFor=\"let u of filteredApproverList\"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [id]=\"'rev-' + u.email\"\r\n [checked]=\"isReviewerSelected(u.email)\"\r\n (change)=\"onReviewerChange($event, u.email)\"\r\n />\r\n <label class=\"form-check-label ms-2\" [for]=\"'rev-' + u.email\">\r\n {{ u.email }}\r\n </label>\r\n </div>\r\n</div>\r\n\r\n <!-- Dropdown panel -->\r\n\r\n</div>\r\n\r\n\r\n <!-- Footer buttons -->\r\n <div class=\"d-flex justify-content-between w-100 mt-4\">\r\n <button type=\"button\" class=\"btn btn-outline w-50 me-1\" (click)=\"onReset()\">\r\n Reset\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary w-50 ms-1\" (click)=\"onApply()\">\r\n Apply\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n</div>\r\n", styles: [".filter-wrapper{position:absolute;top:0;right:0;padding:16px;z-index:1050}.filter-card{width:350px;background:#fff;border-radius:12px;padding:16px 18px;box-shadow:0 8px 30px #00000014;font-size:13px}.filter-header .title{font-weight:600;font-size:14px}.btn-close{border:none;background:transparent;font-size:16px;cursor:pointer}.form-label{font-size:12px;margin-bottom:4px}.form-select,.form-control{font-size:13px}.gap-2{gap:4px}.badge{padding:0 6px;border-radius:999px;font-size:11px;background:#e5f3ff;color:#007bff}input[type=checkbox]{width:16px!important;height:16px!important;margin:-2px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.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: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
372
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TicketFilterPanelComponent, selector: "lib-ticket-filter-panel", inputs: { permissionType: "permissionType", userType: "userType", client: "client" }, outputs: { apply: "apply", panelClosed: "panelClosed" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, usesOnChanges: true, ngImport: i0, template: "<!-- ticket-filter-panel.component.html -->\r\n<div class=\"filter-wrapper\" *ngIf=\"isOpen\">\r\n <div class=\"filter-card\">\r\n <div class=\"filter-header d-flex justify-content-between align-items-center mb-3\">\r\n <div class=\"title\">Filter Options</div>\r\n <!-- <button type=\"button\" class=\"btn-close\" (click)=\"close()\">\u2715</button> -->\r\n </div>\r\n\r\n <form [formGroup]=\"filterForm\">\r\n <!-- Status -->\r\n<div class=\"mb-3 position-relative\" (click)=\"$event.stopPropagation()\">\r\n <label class=\"form-label\">Status</label>\r\n\r\n <!-- Header / trigger -->\r\n <div\r\n class=\"status-select border rounded px-3 py-2 d-flex justify-content-between align-items-center\"\r\n (click)=\"toggleStatusDropdown($event)\"\r\n >\r\n <span *ngIf=\"!selectedStatuses.length\">Select</span>\r\n\r\n <span *ngIf=\"selectedStatuses.length === 1\">\r\n {{ selectedStatuses[0] }}\r\n </span>\r\n\r\n <span *ngIf=\"selectedStatuses.length > 1\" class=\"d-flex align-items-center\">\r\n <span>{{ selectedStatuses[0] }}</span>\r\n <span class=\"badge ms-2\">\r\n +{{ selectedStatuses.length - 1 }}\r\n </span>\r\n </span>\r\n\r\n </div>\r\n\r\n <!-- DROPDOWN PANEL (OVERLAY) -->\r\n <div\r\n class=\"status-dropdown position-absolute w-100 mt-1 border rounded p-1 bg-white\"\r\n style=\"z-index: 1000; max-height: 220px; overflow-y: auto;\"\r\n *ngIf=\"statusDropdownOpen\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <!-- Select All -->\r\n <div class=\"form-check px-0 d-flex align-items-center mb-2\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input \"\r\n id=\"status-select-all\"\r\n [checked]=\"areAllStatusesSelected()\"\r\n (change)=\"onStatusSelectAllChange($event)\"\r\n />\r\n <label class=\"form-check-label text-dark ms-2\" for=\"status-select-all\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n\r\n <!-- Options -->\r\n <div\r\n class=\"form-check px-0 d-flex align-items-center mb-1\"\r\n *ngFor=\"let s of statusOptions\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input \"\r\n [id]=\"'status-' + s\"\r\n [checked]=\"isStatusSelected(s)\"\r\n (change)=\"onStatusChange($event, s)\"\r\n />\r\n <label class=\"form-check-label text-dark ms-2\" [for]=\"'status-' + s\">\r\n {{ s }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n <!-- Reviewer accuracy -->\r\n <div class=\"mb-3\" *ngIf=\"showReviewerAccuracy\">\r\n <label class=\"form-label\">Reviewer accuracy (%) by condition</label>\r\n <div class=\"d-flex gap-2\">\r\n <select class=\"form-select w-100\" formControlName=\"reviewerCondition\">\r\n <option [ngValue]=\"null\">Select</option>\r\n <option *ngFor=\"let c of conditionOptions\" [ngValue]=\"c.value\">\r\n {{ c.label }}\r\n </option>\r\n </select>\r\n\r\n <!-- one or two inputs -->\r\n <ng-container *ngIf=\"isBetween('reviewerCondition'); else singleReviewer\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"reviewerFrom\"\r\n placeholder=\"From\" (input)=\"limitValue($event, 'reviewerFrom')\" />\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"reviewerTo\"\r\n placeholder=\"To\" (input)=\"limitValue($event, 'reviewerTo')\" />\r\n </ng-container>\r\n <ng-template #singleReviewer>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"reviewerFrom\"\r\n placeholder=\"1 to 100%\" (input)=\"limitValue($event, 'reviewerFrom')\" />\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Approver accuracy -->\r\n <div class=\"mb-3\" *ngIf=\"showApproverAccuracy\">\r\n <label class=\"form-label\">Approver accuracy (%) by condition</label>\r\n <div class=\"d-flex gap-2\">\r\n <select class=\"form-select w-100\" formControlName=\"approverCondition\">\r\n <option [ngValue]=\"null\">Select</option>\r\n <option *ngFor=\"let c of conditionOptions\" [ngValue]=\"c.value\">\r\n {{ c.label }}\r\n </option>\r\n </select>\r\n\r\n <ng-container *ngIf=\"isBetween('approverCondition'); else singleApprover\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"approverFrom\"\r\n placeholder=\"From\" \r\n (input)=\"limitValue($event, 'approverFrom')\"/>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"approverTo\"\r\n placeholder=\"To\" (input)=\"limitValue($event, 'approverTo')\" />\r\n </ng-container>\r\n <ng-template #singleApprover>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"approverFrom\"\r\n placeholder=\"1 to 100%\" (input)=\"limitValue($event, 'approverFrom')\" />\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Tango accuracy -->\r\n <div class=\"mb-3\" *ngIf=\"showTangoAccuracy\">\r\n <label class=\"form-label\">Tango accuracy (%) by condition</label>\r\n <div class=\"d-flex gap-2\">\r\n <select class=\"form-select w-100\" formControlName=\"tangoCondition\">\r\n <option [ngValue]=\"null\">Select</option>\r\n <option *ngFor=\"let c of conditionOptions\" [ngValue]=\"c.value\">\r\n {{ c.label }}\r\n </option>\r\n </select>\r\n\r\n <ng-container *ngIf=\"isBetween('tangoCondition'); else singleTango\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"tangoFrom\"\r\n placeholder=\"From\" (input)=\"limitValue($event, 'tangoFrom')\" />\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"tangoTo\"\r\n placeholder=\"To\" (input)=\"limitValue($event, 'tangoTo')\" />\r\n </ng-container>\r\n <ng-template #singleTango>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"tangoFrom\"\r\n placeholder=\"1 to 100%\" (input)=\"limitValue($event, 'tangoFrom')\" />\r\n </ng-template>\r\n </div>\r\n </div>\r\n<div\r\n class=\"mb-3 position-relative\"\r\n *ngIf=\"showReviewedBy\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n <label class=\"form-label\">Reviewed by</label>\r\n\r\n <!-- Trigger / display -->\r\n <div\r\n class=\"border rounded px-3 py-2 d-flex justify-content-between align-items-center\"\r\n (click)=\"toggleReviewerDropdown($event)\"\r\n >\r\n <!-- 0 selected -->\r\n <span *ngIf=\"!selectedReviewedBy.length\">\r\n Select\r\n </span>\r\n\r\n <!-- 1 selected -->\r\n <span *ngIf=\"selectedReviewedBy.length === 1\">\r\n {{ selectedReviewedBy[0] }}\r\n </span>\r\n\r\n <!-- >1 selected -->\r\n <span\r\n *ngIf=\"selectedReviewedBy.length > 1\"\r\n class=\"d-flex align-items-center\"\r\n >\r\n <span>{{ selectedReviewedBy[0] }}</span>\r\n <span class=\"badge ms-2\">\r\n +{{ selectedReviewedBy.length - 1 }}\r\n </span>\r\n </span>\r\n </div>\r\n\r\n<div\r\n *ngIf=\"reviewerDropdownOpen\"\r\n class=\"position-absolute w-100 border rounded bg-white p-1 mt-1\"\r\n style=\"z-index: 1000; max-height: 220px; overflow-y: auto;\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n\r\n <!-- \uD83D\uDD0D Search box -->\r\n <div class=\"mb-2 px-0\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search by email\"\r\n [(ngModel)]=\"reviewerSearchTerm\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div>\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check px-0 mb-2 d-flex align-items-center\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"reviewer-all\"\r\n [checked]=\"areAllReviewersSelected()\"\r\n (change)=\"onReviewerSelectAll($event)\"\r\n />\r\n <label for=\"reviewer-all\" class=\"form-check-label text-dark ms-2\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options \u2013 now use getter filteredReviewerList -->\r\n <div\r\n class=\"form-check mb-1 px-0 d-flex align-items-center\"\r\n *ngFor=\"let u of filteredReviewerList\"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [id]=\"'rev-' + u.email\"\r\n [checked]=\"isReviewerSelected(u.email)\"\r\n (change)=\"onReviewerChange($event, u.email)\"\r\n />\r\n <label class=\"form-check-label text-dark ms-2\" [for]=\"'rev-' + u.email\">\r\n {{ u.email }}\r\n </label>\r\n </div>\r\n</div>\r\n\r\n\r\n</div>\r\n\r\n\r\n <!-- Approved By -->\r\n<div\r\n class=\"mb-3 position-relative\"\r\n *ngIf=\"showApprovedBy\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n <label class=\"form-label\">Approved by</label>\r\n\r\n <!-- Trigger / display -->\r\n <div\r\n class=\"border rounded px-3 py-2 d-flex justify-content-between align-items-center\"\r\n (click)=\"toggleApproverDropdown($event)\"\r\n >\r\n <!-- 0 selected -->\r\n <span *ngIf=\"!selectedApprovedBy.length\">\r\n Select\r\n </span>\r\n\r\n <!-- 1 selected -->\r\n <span *ngIf=\"selectedApprovedBy.length === 1\">\r\n {{ selectedApprovedBy[0] }}\r\n </span>\r\n\r\n <!-- >1 selected -->\r\n <span\r\n *ngIf=\"selectedApprovedBy.length > 1\"\r\n class=\"d-flex align-items-center\"\r\n >\r\n <span>{{ selectedApprovedBy[0] }}</span>\r\n <span class=\"badge ms-2\">\r\n +{{ selectedApprovedBy.length - 1 }}\r\n </span>\r\n </span>\r\n\r\n </div>\r\n<!-- Dropdown panel -->\r\n<div\r\n *ngIf=\"approverDropdownOpen\"\r\n class=\"position-absolute w-100 border rounded bg-white p-1 mt-1\"\r\n style=\"z-index: 1000; max-height: 220px; overflow-y: auto;\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n\r\n <!-- \uD83D\uDD0D Search box -->\r\n <!-- <div class=\"mb-2 px-0\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search by email\"\r\n [ngModel]=\"approverSearchTerm\"\r\n (ngModelChange)=\"onReviewerSearch($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div> -->\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check px-0 mb-2 d-flex align-items-center\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"reviewer-all\"\r\n [checked]=\"areAllReviewersSelected()\"\r\n (change)=\"onReviewerSelectAll($event)\"\r\n />\r\n <label for=\"reviewer-all\" class=\"form-check-label text-dark ms-2\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options (use filteredReviewerList instead of userList) -->\r\n <div\r\n class=\"form-check mb-1 px-0 d-flex align-items-center\"\r\n *ngFor=\"let u of filteredApproverList\"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [id]=\"'rev-' + u.email\"\r\n [checked]=\"isReviewerSelected(u.email)\"\r\n (change)=\"onReviewerChange($event, u.email)\"\r\n />\r\n <label class=\"form-check-label text-dark ms-2\" [for]=\"'rev-' + u.email\">\r\n {{ u.email }}\r\n </label>\r\n </div>\r\n</div>\r\n\r\n <!-- Dropdown panel -->\r\n\r\n</div>\r\n\r\n\r\n <!-- Footer buttons -->\r\n <div class=\"d-flex justify-content-between w-100 mt-4\">\r\n <button type=\"button\" class=\"btn btn-outline w-50 me-1\" (click)=\"onReset()\">\r\n Reset\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary w-50 ms-1\" (click)=\"onApply()\">\r\n Apply\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n</div>\r\n", styles: [".filter-wrapper{position:absolute;top:0;right:0;padding:16px;z-index:1050}.filter-card{width:350px;background:#fff;border-radius:12px;padding:16px 18px;box-shadow:0 8px 30px #00000014;font-size:13px}.filter-header .title{font-weight:600;font-size:14px}.btn-close{border:none;background:transparent;font-size:16px;cursor:pointer}.form-label{font-size:12px;margin-bottom:4px}.form-select,.form-control{font-size:13px}.gap-2{gap:4px}.badge{padding:0 6px;border-radius:999px;font-size:11px;background:#e5f3ff;color:#007bff}input[type=checkbox]{width:16px!important;height:16px!important;margin:-2px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.text-dark{color:#344054!important}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.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: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
360
373
  }
361
374
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TicketFilterPanelComponent, decorators: [{
362
375
  type: Component,
363
- args: [{ selector: 'lib-ticket-filter-panel', template: "<!-- ticket-filter-panel.component.html -->\r\n<div class=\"filter-wrapper\" *ngIf=\"isOpen\">\r\n <div class=\"filter-card\">\r\n <div class=\"filter-header d-flex justify-content-between align-items-center mb-3\">\r\n <div class=\"title\">Filter Options</div>\r\n <!-- <button type=\"button\" class=\"btn-close\" (click)=\"close()\">\u2715</button> -->\r\n </div>\r\n\r\n <form [formGroup]=\"filterForm\">\r\n <!-- Status -->\r\n<div class=\"mb-3 position-relative\" (click)=\"$event.stopPropagation()\">\r\n <label class=\"form-label\">Status</label>\r\n\r\n <!-- Header / trigger -->\r\n <div\r\n class=\"status-select border rounded px-3 py-2 d-flex justify-content-between align-items-center\"\r\n (click)=\"toggleStatusDropdown($event)\"\r\n >\r\n <span *ngIf=\"!selectedStatuses.length\">Select</span>\r\n\r\n <span *ngIf=\"selectedStatuses.length === 1\">\r\n {{ selectedStatuses[0] }}\r\n </span>\r\n\r\n <span *ngIf=\"selectedStatuses.length > 1\" class=\"d-flex align-items-center\">\r\n <span>{{ selectedStatuses[0] }}</span>\r\n <span class=\"badge ms-2\">\r\n +{{ selectedStatuses.length - 1 }}\r\n </span>\r\n </span>\r\n\r\n </div>\r\n\r\n <!-- DROPDOWN PANEL (OVERLAY) -->\r\n <div\r\n class=\"status-dropdown position-absolute w-100 mt-1 border rounded p-1 bg-white\"\r\n style=\"z-index: 1000; max-height: 220px; overflow-y: auto;\"\r\n *ngIf=\"statusDropdownOpen\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <!-- Select All -->\r\n <div class=\"form-check px-0 d-flex align-items-center mb-2\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input text-dark\"\r\n id=\"status-select-all\"\r\n [checked]=\"areAllStatusesSelected()\"\r\n (change)=\"onStatusSelectAllChange($event)\"\r\n />\r\n <label class=\"form-check-label ms-2\" for=\"status-select-all\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n\r\n <!-- Options -->\r\n <div\r\n class=\"form-check px-0 d-flex align-items-center mb-1\"\r\n *ngFor=\"let s of statusOptions\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input text-dark\"\r\n [id]=\"'status-' + s\"\r\n [checked]=\"isStatusSelected(s)\"\r\n (change)=\"onStatusChange($event, s)\"\r\n />\r\n <label class=\"form-check-label ms-2\" [for]=\"'status-' + s\">\r\n {{ s }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n <!-- Reviewer accuracy -->\r\n <div class=\"mb-3\" *ngIf=\"showReviewerAccuracy\">\r\n <label class=\"form-label\">Reviewer accuracy (%) by condition</label>\r\n <div class=\"d-flex gap-2\">\r\n <select class=\"form-select w-100\" formControlName=\"reviewerCondition\">\r\n <option [ngValue]=\"null\">Select</option>\r\n <option *ngFor=\"let c of conditionOptions\" [ngValue]=\"c.value\">\r\n {{ c.label }}\r\n </option>\r\n </select>\r\n\r\n <!-- one or two inputs -->\r\n <ng-container *ngIf=\"isBetween('reviewerCondition'); else singleReviewer\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"reviewerFrom\"\r\n placeholder=\"From\" />\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"reviewerTo\"\r\n placeholder=\"To\" />\r\n </ng-container>\r\n <ng-template #singleReviewer>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"reviewerFrom\"\r\n placeholder=\"1 to 100%\" />\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Approver accuracy -->\r\n <div class=\"mb-3\" *ngIf=\"showApproverAccuracy\">\r\n <label class=\"form-label\">Approver accuracy (%) by condition</label>\r\n <div class=\"d-flex gap-2\">\r\n <select class=\"form-select w-100\" formControlName=\"approverCondition\">\r\n <option [ngValue]=\"null\">Select</option>\r\n <option *ngFor=\"let c of conditionOptions\" [ngValue]=\"c.value\">\r\n {{ c.label }}\r\n </option>\r\n </select>\r\n\r\n <ng-container *ngIf=\"isBetween('approverCondition'); else singleApprover\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"approverFrom\"\r\n placeholder=\"From\" />\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"approverTo\"\r\n placeholder=\"To\" />\r\n </ng-container>\r\n <ng-template #singleApprover>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"approverFrom\"\r\n placeholder=\"1 to 100%\" />\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Tango accuracy -->\r\n <div class=\"mb-3\" *ngIf=\"showTangoAccuracy\">\r\n <label class=\"form-label\">Tango accuracy (%) by condition</label>\r\n <div class=\"d-flex gap-2\">\r\n <select class=\"form-select w-50\" formControlName=\"tangoCondition\">\r\n <option [ngValue]=\"null\">Select</option>\r\n <option *ngFor=\"let c of conditionOptions\" [ngValue]=\"c.value\">\r\n {{ c.label }}\r\n </option>\r\n </select>\r\n\r\n <ng-container *ngIf=\"isBetween('tangoCondition'); else singleTango\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"tangoFrom\"\r\n placeholder=\"From\" />\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"tangoTo\"\r\n placeholder=\"To\" />\r\n </ng-container>\r\n <ng-template #singleTango>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"tangoFrom\"\r\n placeholder=\"1 to 100%\" />\r\n </ng-template>\r\n </div>\r\n </div>\r\n<div\r\n class=\"mb-3 position-relative\"\r\n *ngIf=\"showReviewedBy\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n <label class=\"form-label\">Reviewed by</label>\r\n\r\n <!-- Trigger / display -->\r\n <div\r\n class=\"border rounded px-3 py-2 d-flex justify-content-between align-items-center\"\r\n (click)=\"toggleReviewerDropdown($event)\"\r\n >\r\n <!-- 0 selected -->\r\n <span *ngIf=\"!selectedReviewedBy.length\">\r\n Select\r\n </span>\r\n\r\n <!-- 1 selected -->\r\n <span *ngIf=\"selectedReviewedBy.length === 1\">\r\n {{ selectedReviewedBy[0] }}\r\n </span>\r\n\r\n <!-- >1 selected -->\r\n <span\r\n *ngIf=\"selectedReviewedBy.length > 1\"\r\n class=\"d-flex align-items-center\"\r\n >\r\n <span>{{ selectedReviewedBy[0] }}</span>\r\n <span class=\"badge ms-2\">\r\n +{{ selectedReviewedBy.length - 1 }}\r\n </span>\r\n </span>\r\n </div>\r\n\r\n <!-- Dropdown panel -->\r\n <!-- Dropdown panel -->\r\n<div\r\n *ngIf=\"reviewerDropdownOpen\"\r\n class=\"position-absolute w-100 border rounded bg-white p-1 mt-1\"\r\n style=\"z-index: 1000; max-height: 220px; overflow-y: auto;\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n\r\n <!-- \uD83D\uDD0D Search box -->\r\n <div class=\"mb-2 px-0\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search by email\"\r\n [(ngModel)]=\"reviewerSearchTerm\"\r\n (ngModelChange)=\"onReviewerSearch($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div>\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check px-0 mb-2 d-flex align-items-center\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"reviewer-all\"\r\n [checked]=\"areAllReviewersSelected()\"\r\n (change)=\"onReviewerSelectAll($event)\"\r\n />\r\n <label for=\"reviewer-all\" class=\"form-check-label ms-2\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options \u2013 \uD83D\uDD25 now use filteredReviewerList -->\r\n <div\r\n class=\"form-check mb-1 px-0 d-flex align-items-center\"\r\n *ngFor=\"let u of filteredReviewerList\"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [id]=\"'rev-' + u.email\"\r\n [checked]=\"isReviewerSelected(u.email)\"\r\n (change)=\"onReviewerChange($event, u.email)\"\r\n />\r\n <label class=\"form-check-label ms-2\" [for]=\"'rev-' + u.email\">\r\n {{ u.email }}\r\n </label>\r\n </div>\r\n</div>\r\n\r\n</div>\r\n\r\n\r\n <!-- Approved By -->\r\n<div\r\n class=\"mb-3 position-relative\"\r\n *ngIf=\"showApprovedBy\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n <label class=\"form-label\">Approved by</label>\r\n\r\n <!-- Trigger / display -->\r\n <div\r\n class=\"border rounded px-3 py-2 d-flex justify-content-between align-items-center\"\r\n (click)=\"toggleApproverDropdown($event)\"\r\n >\r\n <!-- 0 selected -->\r\n <span *ngIf=\"!selectedApprovedBy.length\">\r\n Select\r\n </span>\r\n\r\n <!-- 1 selected -->\r\n <span *ngIf=\"selectedApprovedBy.length === 1\">\r\n {{ selectedApprovedBy[0] }}\r\n </span>\r\n\r\n <!-- >1 selected -->\r\n <span\r\n *ngIf=\"selectedApprovedBy.length > 1\"\r\n class=\"d-flex align-items-center\"\r\n >\r\n <span>{{ selectedApprovedBy[0] }}</span>\r\n <span class=\"badge ms-2\">\r\n +{{ selectedApprovedBy.length - 1 }}\r\n </span>\r\n </span>\r\n\r\n </div>\r\n<!-- Dropdown panel -->\r\n<div\r\n *ngIf=\"approverDropdownOpen\"\r\n class=\"position-absolute w-100 border rounded bg-white p-1 mt-1\"\r\n style=\"z-index: 1000; max-height: 220px; overflow-y: auto;\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n\r\n <!-- \uD83D\uDD0D Search box -->\r\n <div class=\"mb-2 px-0\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search by email\"\r\n [ngModel]=\"approverSearchTerm\"\r\n (ngModelChange)=\"onReviewerSearch($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div>\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check px-0 mb-2 d-flex align-items-center\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"reviewer-all\"\r\n [checked]=\"areAllReviewersSelected()\"\r\n (change)=\"onReviewerSelectAll($event)\"\r\n />\r\n <label for=\"reviewer-all\" class=\"form-check-label ms-2\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options (use filteredReviewerList instead of userList) -->\r\n <div\r\n class=\"form-check mb-1 px-0 d-flex align-items-center\"\r\n *ngFor=\"let u of filteredApproverList\"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [id]=\"'rev-' + u.email\"\r\n [checked]=\"isReviewerSelected(u.email)\"\r\n (change)=\"onReviewerChange($event, u.email)\"\r\n />\r\n <label class=\"form-check-label ms-2\" [for]=\"'rev-' + u.email\">\r\n {{ u.email }}\r\n </label>\r\n </div>\r\n</div>\r\n\r\n <!-- Dropdown panel -->\r\n\r\n</div>\r\n\r\n\r\n <!-- Footer buttons -->\r\n <div class=\"d-flex justify-content-between w-100 mt-4\">\r\n <button type=\"button\" class=\"btn btn-outline w-50 me-1\" (click)=\"onReset()\">\r\n Reset\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary w-50 ms-1\" (click)=\"onApply()\">\r\n Apply\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n</div>\r\n", styles: [".filter-wrapper{position:absolute;top:0;right:0;padding:16px;z-index:1050}.filter-card{width:350px;background:#fff;border-radius:12px;padding:16px 18px;box-shadow:0 8px 30px #00000014;font-size:13px}.filter-header .title{font-weight:600;font-size:14px}.btn-close{border:none;background:transparent;font-size:16px;cursor:pointer}.form-label{font-size:12px;margin-bottom:4px}.form-select,.form-control{font-size:13px}.gap-2{gap:4px}.badge{padding:0 6px;border-radius:999px;font-size:11px;background:#e5f3ff;color:#007bff}input[type=checkbox]{width:16px!important;height:16px!important;margin:-2px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}\n"] }]
376
+ args: [{ selector: 'lib-ticket-filter-panel', template: "<!-- ticket-filter-panel.component.html -->\r\n<div class=\"filter-wrapper\" *ngIf=\"isOpen\">\r\n <div class=\"filter-card\">\r\n <div class=\"filter-header d-flex justify-content-between align-items-center mb-3\">\r\n <div class=\"title\">Filter Options</div>\r\n <!-- <button type=\"button\" class=\"btn-close\" (click)=\"close()\">\u2715</button> -->\r\n </div>\r\n\r\n <form [formGroup]=\"filterForm\">\r\n <!-- Status -->\r\n<div class=\"mb-3 position-relative\" (click)=\"$event.stopPropagation()\">\r\n <label class=\"form-label\">Status</label>\r\n\r\n <!-- Header / trigger -->\r\n <div\r\n class=\"status-select border rounded px-3 py-2 d-flex justify-content-between align-items-center\"\r\n (click)=\"toggleStatusDropdown($event)\"\r\n >\r\n <span *ngIf=\"!selectedStatuses.length\">Select</span>\r\n\r\n <span *ngIf=\"selectedStatuses.length === 1\">\r\n {{ selectedStatuses[0] }}\r\n </span>\r\n\r\n <span *ngIf=\"selectedStatuses.length > 1\" class=\"d-flex align-items-center\">\r\n <span>{{ selectedStatuses[0] }}</span>\r\n <span class=\"badge ms-2\">\r\n +{{ selectedStatuses.length - 1 }}\r\n </span>\r\n </span>\r\n\r\n </div>\r\n\r\n <!-- DROPDOWN PANEL (OVERLAY) -->\r\n <div\r\n class=\"status-dropdown position-absolute w-100 mt-1 border rounded p-1 bg-white\"\r\n style=\"z-index: 1000; max-height: 220px; overflow-y: auto;\"\r\n *ngIf=\"statusDropdownOpen\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <!-- Select All -->\r\n <div class=\"form-check px-0 d-flex align-items-center mb-2\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input \"\r\n id=\"status-select-all\"\r\n [checked]=\"areAllStatusesSelected()\"\r\n (change)=\"onStatusSelectAllChange($event)\"\r\n />\r\n <label class=\"form-check-label text-dark ms-2\" for=\"status-select-all\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n\r\n <!-- Options -->\r\n <div\r\n class=\"form-check px-0 d-flex align-items-center mb-1\"\r\n *ngFor=\"let s of statusOptions\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input \"\r\n [id]=\"'status-' + s\"\r\n [checked]=\"isStatusSelected(s)\"\r\n (change)=\"onStatusChange($event, s)\"\r\n />\r\n <label class=\"form-check-label text-dark ms-2\" [for]=\"'status-' + s\">\r\n {{ s }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n <!-- Reviewer accuracy -->\r\n <div class=\"mb-3\" *ngIf=\"showReviewerAccuracy\">\r\n <label class=\"form-label\">Reviewer accuracy (%) by condition</label>\r\n <div class=\"d-flex gap-2\">\r\n <select class=\"form-select w-100\" formControlName=\"reviewerCondition\">\r\n <option [ngValue]=\"null\">Select</option>\r\n <option *ngFor=\"let c of conditionOptions\" [ngValue]=\"c.value\">\r\n {{ c.label }}\r\n </option>\r\n </select>\r\n\r\n <!-- one or two inputs -->\r\n <ng-container *ngIf=\"isBetween('reviewerCondition'); else singleReviewer\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"reviewerFrom\"\r\n placeholder=\"From\" (input)=\"limitValue($event, 'reviewerFrom')\" />\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"reviewerTo\"\r\n placeholder=\"To\" (input)=\"limitValue($event, 'reviewerTo')\" />\r\n </ng-container>\r\n <ng-template #singleReviewer>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"reviewerFrom\"\r\n placeholder=\"1 to 100%\" (input)=\"limitValue($event, 'reviewerFrom')\" />\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Approver accuracy -->\r\n <div class=\"mb-3\" *ngIf=\"showApproverAccuracy\">\r\n <label class=\"form-label\">Approver accuracy (%) by condition</label>\r\n <div class=\"d-flex gap-2\">\r\n <select class=\"form-select w-100\" formControlName=\"approverCondition\">\r\n <option [ngValue]=\"null\">Select</option>\r\n <option *ngFor=\"let c of conditionOptions\" [ngValue]=\"c.value\">\r\n {{ c.label }}\r\n </option>\r\n </select>\r\n\r\n <ng-container *ngIf=\"isBetween('approverCondition'); else singleApprover\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"approverFrom\"\r\n placeholder=\"From\" \r\n (input)=\"limitValue($event, 'approverFrom')\"/>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"approverTo\"\r\n placeholder=\"To\" (input)=\"limitValue($event, 'approverTo')\" />\r\n </ng-container>\r\n <ng-template #singleApprover>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"approverFrom\"\r\n placeholder=\"1 to 100%\" (input)=\"limitValue($event, 'approverFrom')\" />\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Tango accuracy -->\r\n <div class=\"mb-3\" *ngIf=\"showTangoAccuracy\">\r\n <label class=\"form-label\">Tango accuracy (%) by condition</label>\r\n <div class=\"d-flex gap-2\">\r\n <select class=\"form-select w-100\" formControlName=\"tangoCondition\">\r\n <option [ngValue]=\"null\">Select</option>\r\n <option *ngFor=\"let c of conditionOptions\" [ngValue]=\"c.value\">\r\n {{ c.label }}\r\n </option>\r\n </select>\r\n\r\n <ng-container *ngIf=\"isBetween('tangoCondition'); else singleTango\">\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"tangoFrom\"\r\n placeholder=\"From\" (input)=\"limitValue($event, 'tangoFrom')\" />\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"tangoTo\"\r\n placeholder=\"To\" (input)=\"limitValue($event, 'tangoTo')\" />\r\n </ng-container>\r\n <ng-template #singleTango>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n max=\"100\"\r\n class=\"form-control\"\r\n formControlName=\"tangoFrom\"\r\n placeholder=\"1 to 100%\" (input)=\"limitValue($event, 'tangoFrom')\" />\r\n </ng-template>\r\n </div>\r\n </div>\r\n<div\r\n class=\"mb-3 position-relative\"\r\n *ngIf=\"showReviewedBy\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n <label class=\"form-label\">Reviewed by</label>\r\n\r\n <!-- Trigger / display -->\r\n <div\r\n class=\"border rounded px-3 py-2 d-flex justify-content-between align-items-center\"\r\n (click)=\"toggleReviewerDropdown($event)\"\r\n >\r\n <!-- 0 selected -->\r\n <span *ngIf=\"!selectedReviewedBy.length\">\r\n Select\r\n </span>\r\n\r\n <!-- 1 selected -->\r\n <span *ngIf=\"selectedReviewedBy.length === 1\">\r\n {{ selectedReviewedBy[0] }}\r\n </span>\r\n\r\n <!-- >1 selected -->\r\n <span\r\n *ngIf=\"selectedReviewedBy.length > 1\"\r\n class=\"d-flex align-items-center\"\r\n >\r\n <span>{{ selectedReviewedBy[0] }}</span>\r\n <span class=\"badge ms-2\">\r\n +{{ selectedReviewedBy.length - 1 }}\r\n </span>\r\n </span>\r\n </div>\r\n\r\n<div\r\n *ngIf=\"reviewerDropdownOpen\"\r\n class=\"position-absolute w-100 border rounded bg-white p-1 mt-1\"\r\n style=\"z-index: 1000; max-height: 220px; overflow-y: auto;\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n\r\n <!-- \uD83D\uDD0D Search box -->\r\n <div class=\"mb-2 px-0\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search by email\"\r\n [(ngModel)]=\"reviewerSearchTerm\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div>\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check px-0 mb-2 d-flex align-items-center\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"reviewer-all\"\r\n [checked]=\"areAllReviewersSelected()\"\r\n (change)=\"onReviewerSelectAll($event)\"\r\n />\r\n <label for=\"reviewer-all\" class=\"form-check-label text-dark ms-2\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options \u2013 now use getter filteredReviewerList -->\r\n <div\r\n class=\"form-check mb-1 px-0 d-flex align-items-center\"\r\n *ngFor=\"let u of filteredReviewerList\"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [id]=\"'rev-' + u.email\"\r\n [checked]=\"isReviewerSelected(u.email)\"\r\n (change)=\"onReviewerChange($event, u.email)\"\r\n />\r\n <label class=\"form-check-label text-dark ms-2\" [for]=\"'rev-' + u.email\">\r\n {{ u.email }}\r\n </label>\r\n </div>\r\n</div>\r\n\r\n\r\n</div>\r\n\r\n\r\n <!-- Approved By -->\r\n<div\r\n class=\"mb-3 position-relative\"\r\n *ngIf=\"showApprovedBy\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n <label class=\"form-label\">Approved by</label>\r\n\r\n <!-- Trigger / display -->\r\n <div\r\n class=\"border rounded px-3 py-2 d-flex justify-content-between align-items-center\"\r\n (click)=\"toggleApproverDropdown($event)\"\r\n >\r\n <!-- 0 selected -->\r\n <span *ngIf=\"!selectedApprovedBy.length\">\r\n Select\r\n </span>\r\n\r\n <!-- 1 selected -->\r\n <span *ngIf=\"selectedApprovedBy.length === 1\">\r\n {{ selectedApprovedBy[0] }}\r\n </span>\r\n\r\n <!-- >1 selected -->\r\n <span\r\n *ngIf=\"selectedApprovedBy.length > 1\"\r\n class=\"d-flex align-items-center\"\r\n >\r\n <span>{{ selectedApprovedBy[0] }}</span>\r\n <span class=\"badge ms-2\">\r\n +{{ selectedApprovedBy.length - 1 }}\r\n </span>\r\n </span>\r\n\r\n </div>\r\n<!-- Dropdown panel -->\r\n<div\r\n *ngIf=\"approverDropdownOpen\"\r\n class=\"position-absolute w-100 border rounded bg-white p-1 mt-1\"\r\n style=\"z-index: 1000; max-height: 220px; overflow-y: auto;\"\r\n (click)=\"$event.stopPropagation()\"\r\n>\r\n\r\n <!-- \uD83D\uDD0D Search box -->\r\n <!-- <div class=\"mb-2 px-0\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n placeholder=\"Search by email\"\r\n [ngModel]=\"approverSearchTerm\"\r\n (ngModelChange)=\"onReviewerSearch($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n </div> -->\r\n\r\n <!-- Select All -->\r\n <div class=\"form-check px-0 mb-2 d-flex align-items-center\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"reviewer-all\"\r\n [checked]=\"areAllReviewersSelected()\"\r\n (change)=\"onReviewerSelectAll($event)\"\r\n />\r\n <label for=\"reviewer-all\" class=\"form-check-label text-dark ms-2\">\r\n Select All\r\n </label>\r\n </div>\r\n\r\n <!-- Options (use filteredReviewerList instead of userList) -->\r\n <div\r\n class=\"form-check mb-1 px-0 d-flex align-items-center\"\r\n *ngFor=\"let u of filteredApproverList\"\r\n >\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [id]=\"'rev-' + u.email\"\r\n [checked]=\"isReviewerSelected(u.email)\"\r\n (change)=\"onReviewerChange($event, u.email)\"\r\n />\r\n <label class=\"form-check-label text-dark ms-2\" [for]=\"'rev-' + u.email\">\r\n {{ u.email }}\r\n </label>\r\n </div>\r\n</div>\r\n\r\n <!-- Dropdown panel -->\r\n\r\n</div>\r\n\r\n\r\n <!-- Footer buttons -->\r\n <div class=\"d-flex justify-content-between w-100 mt-4\">\r\n <button type=\"button\" class=\"btn btn-outline w-50 me-1\" (click)=\"onReset()\">\r\n Reset\r\n </button>\r\n <button type=\"button\" class=\"btn btn-primary w-50 ms-1\" (click)=\"onApply()\">\r\n Apply\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n</div>\r\n", styles: [".filter-wrapper{position:absolute;top:0;right:0;padding:16px;z-index:1050}.filter-card{width:350px;background:#fff;border-radius:12px;padding:16px 18px;box-shadow:0 8px 30px #00000014;font-size:13px}.filter-header .title{font-weight:600;font-size:14px}.btn-close{border:none;background:transparent;font-size:16px;cursor:pointer}.form-label{font-size:12px;margin-bottom:4px}.form-select,.form-control{font-size:13px}.gap-2{gap:4px}.badge{padding:0 6px;border-radius:999px;font-size:11px;background:#e5f3ff;color:#007bff}input[type=checkbox]{width:16px!important;height:16px!important;margin:-2px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #D0D5DD)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]{outline:1px solid var(--primary-600, #00A3FF)!important;background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.text-dark{color:#344054!important}\n"] }]
364
377
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ElementRef }, { type: i2.TicketService }], propDecorators: { apply: [{
365
378
  type: Output
366
379
  }], panelClosed: [{
@@ -375,4 +388,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
375
388
  type: HostListener,
376
389
  args: ['document:click', ['$event']]
377
390
  }] } });
378
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0LWZpbHRlci1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtdGlja2V0cy9zcmMvbGliL2NvbXBvbmVudHMvdGlja2V0LWZpbHRlci1wYW5lbC90aWNrZXQtZmlsdGVyLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS10aWNrZXRzL3NyYy9saWIvY29tcG9uZW50cy90aWNrZXQtZmlsdGVyLXBhbmVsL3RpY2tldC1maWx0ZXItcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDOzs7OztBQVczSCxNQUFNLE9BQU8sMEJBQTBCO0lBbURqQjtJQUF3QjtJQUF5QjtJQWxEMUQsS0FBSyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDakMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUMsQ0FBRyxnQkFBZ0I7SUFDM0QsY0FBYyxHQUFrQixJQUFJLENBQUM7SUFDdkMsUUFBUSxHQUFrQixJQUFJLENBQUMsQ0FBQyx5QkFBeUI7SUFDekQsTUFBTSxDQUFNO0lBRW5CLGVBQWUsQ0FBQyxLQUFpQjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRXpCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDZDtJQUNILENBQUM7SUFDRCxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQXFDLHNC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LEtBQUssRUFBRSxDQUFDO1FBQ1gsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQzt3R0F0WlUsMEJBQTBCOzRGQUExQiwwQkFBMEIseVNDWHZDLG02WUFtWUE7OzRGRHhYYSwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UseUJBQXlCO3FJQUt4QixLQUFLO3NCQUFkLE1BQU07Z0JBQ0UsV0FBVztzQkFBcEIsTUFBTTtnQkFDRSxjQUFjO3NCQUF0QixLQUFLO2dCQUNDLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUVKLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUaWNrZXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGlja2V0LnNlcnZpY2UnO1xyXG5cclxudHlwZSBDb25kaXRpb24gPSAnZ3QnIHwgJ2x0JyB8ICdndGUnIHwgJ2x0ZScgfCAnYmV0d2Vlbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi10aWNrZXQtZmlsdGVyLXBhbmVsJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGlja2V0LWZpbHRlci1wYW5lbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3RpY2tldC1maWx0ZXItcGFuZWwuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUaWNrZXRGaWx0ZXJQYW5lbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgIEBPdXRwdXQoKSBhcHBseSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBwYW5lbENsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTsgICAvLyDinIUgbm90IGBjbG9zZWBcclxuICBASW5wdXQoKSBwZXJtaXNzaW9uVHlwZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbkBJbnB1dCgpIHVzZXJUeXBlOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gZS5nLiAndGFuZ28nIG9yIG90aGVyc1xyXG5ASW5wdXQoKSBjbGllbnQgOmFueTtcclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY2xpY2tlZEluc2lkZSA9IHRoaXMuZVJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7XHJcbiAgICBpZiAoIWNsaWNrZWRJbnNpZGUpIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBpc09wZW4gPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udHJvbHMgdmlzaWJpbGl0eVxyXG5cclxuICAvLyBjYWxsZWQgZnJvbSBwYXJlbnQgdmlhICNmaWx0ZXJQYW5lbC5vcGVuKClcclxuICBvcGVuKCkge1xyXG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gY2FsbGVkIGZyb20gY2xvc2UgYnV0dG9uIGluc2lkZSB0aGUgcGFuZWxcclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLnBhbmVsQ2xvc2VkLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHNob3dQYW5lbCA9IGZhbHNlOyAgICAgICAgICAgLy8geW91IGNhbiBhbHNvIGNvbnRyb2wgdGhpcyBmcm9tIHBhcmVudFxyXG5cclxuc3RhdHVzT3B0aW9uczogYW55W10gPSBbXHJcbiAgJ09wZW4nLFxyXG4gICdJbi1Qcm9ncmVzcycsXHJcbiAgJ0Nsb3NlZCcsXHJcbiAgJ1VuZGVyIHRhbmdvIHJldmlldycsXHJcbiAgJ1RhbmdvIHJldmlldyBkb25lJyxcclxuICAnRXhwaXJlZCcsXHJcbiAgJ1RhbmdvIEV4cGlyZWQnLFxyXG5dO1xyXG5cclxuXHJcbiAgY29uZGl0aW9uT3B0aW9ucyA9IFtcclxuICAgIHsgdmFsdWU6ICdndCcsIGxhYmVsOiAnPiBHcmVhdGVyIHRoYW4nIH0sXHJcbiAgICB7IHZhbHVlOiAnbHQnLCBsYWJlbDogJzwgTGVzc2VyIHRoYW4nIH0sXHJcbiAgICB7IHZhbHVlOiAnZ3RlJywgbGFiZWw6ICc+PSBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8nIH0sXHJcbiAgICB7IHZhbHVlOiAnbHRlJywgbGFiZWw6ICc8PSBMZXNzZXIgdGhhbiBvciBlcXVhbCB0bycgfSxcclxuICAgIHsgdmFsdWU6ICdiZXR3ZWVuJywgbGFiZWw6ICdCZXR3ZWVuJyB9LFxyXG4gIF07XHJcblxyXG4gIGZpbHRlckZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIscHJpdmF0ZSBlUmVmOiBFbGVtZW50UmVmLHByaXZhdGUgc2VydmljZTpUaWNrZXRTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLmZpbHRlckZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgc3RhdHVzOiBbW11dLFxyXG5cclxuICAgICAgcmV2aWV3ZXJDb25kaXRpb246IFtudWxsIGFzIENvbmRpdGlvbiB8IG51bGxdLFxyXG4gICAgICByZXZpZXdlckZyb206IFtudWxsXSxcclxuICAgICAgcmV2aWV3ZXJUbzogW251bGxdLFxyXG5cclxuICAgICAgYXBwcm92ZXJDb25kaXRpb246IFtudWxsIGFzIENvbmRpdGlvbiB8IG51bGxdLFxyXG4gICAgICBhcHByb3ZlckZyb206IFtudWxsXSxcclxuICAgICAgYXBwcm92ZXJUbzogW251bGxdLFxyXG5cclxuICAgICAgdGFuZ29Db25kaXRpb246IFtudWxsIGFzIENvbmRpdGlvbiB8IG51bGxdLFxyXG4gICAgICB0YW5nb0Zyb206IFtudWxsXSxcclxuICAgICAgdGFuZ29UbzogW251bGxdLFxyXG5cclxuICAgICAgcmV2aWV3ZWRCeTogW1tdXSxcclxuICBhcHByb3ZlZEJ5OiBbW11dLCAgXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5nZXQgaXNUYW5nbygpOiBib29sZWFuIHtcclxuICByZXR1cm4gdGhpcy51c2VyVHlwZSA9PT0gJ3RhbmdvJztcclxufVxyXG5cclxuLy8gU0hPVyAvIEhJREUgUlVMRVNcclxuXHJcbi8vIFJldmlld2VyIGFjY3VyYWN5IGFuZCBcIlJldmlld2VkIGJ5XCIgdmlzaWJsZSBmb3IgdGFuZ28gKyByZXZpZXdlclxyXG5nZXQgc2hvd1Jldmlld2VyQWNjdXJhY3koKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHRoaXMucGVybWlzc2lvblR5cGUgPT09ICdyZXZpZXcnO1xyXG59XHJcblxyXG5nZXQgc2hvd1Jldmlld2VkQnkoKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHRoaXMuaXNUYW5nbyB8fCB0aGlzLnBlcm1pc3Npb25UeXBlID09PSAncmV2aWV3JztcclxufVxyXG5cclxuLy8gQXBwcm92ZXIgYWNjdXJhY3kgYW5kIFwiQXBwcm92ZWQgYnlcIiB2aXNpYmxlIGZvciB0YW5nbyArIGFwcHJvdmVyXHJcbmdldCBzaG93QXBwcm92ZXJBY2N1cmFjeSgpOiBib29sZWFuIHtcclxuICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uVHlwZSA9PT0gJ2FwcHJvdmUnO1xyXG59XHJcblxyXG5nZXQgc2hvd0FwcHJvdmVkQnkoKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHRoaXMuaXNUYW5nbyB8fCB0aGlzLnBlcm1pc3Npb25UeXBlID09PSAnYXBwcm92ZSc7XHJcbn1cclxuXHJcbi8vIFRhbmdvIGFjY3VyYWN5IG9ubHkgZm9yIHRhbmdvIHVzZXJzXHJcbmdldCBzaG93VGFuZ29BY2N1cmFjeSgpOiBib29sZWFuIHtcclxuICByZXR1cm4gdGhpcy5pc1RhbmdvO1xyXG59XHJcbnN0YXR1c0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG5pc1N0YXR1c1NlbGVjdGVkKHN0YXR1czogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgY29uc3Qgc2VsZWN0ZWQ6IHN0cmluZ1tdID0gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLnN0YXR1cyB8fCBbXTtcclxuICByZXR1cm4gc2VsZWN0ZWQuaW5jbHVkZXMoc3RhdHVzKTtcclxufVxyXG5cclxub25TdGF0dXNDaGFuZ2UoZXZlbnQ6IEV2ZW50LCBzdGF0dXM6IHN0cmluZykge1xyXG4gIGNvbnN0IGNoZWNrYm94ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgY29uc3Qgc2VsZWN0ZWQ6IHN0cmluZ1tdID0gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLnN0YXR1cyB8fCBbXTtcclxuICBsZXQgbmV4dDogc3RyaW5nW107XHJcblxyXG4gIGlmIChjaGVja2JveC5jaGVja2VkKSB7XHJcbiAgICBuZXh0ID0gc2VsZWN0ZWQuaW5jbHVkZXMoc3RhdHVzKSA/IHNlbGVjdGVkIDogWy4uLnNlbGVjdGVkLCBzdGF0dXNdO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBuZXh0ID0gc2VsZWN0ZWQuZmlsdGVyKHMgPT4gcyAhPT0gc3RhdHVzKTtcclxuICB9XHJcblxyXG4gIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKHsgc3RhdHVzOiBuZXh0IH0pO1xyXG59XHJcblxyXG50b2dnbGVTdGF0dXNEcm9wZG93bihldmVudD86IE1vdXNlRXZlbnQpIHtcclxuICBpZiAoZXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBhdm9pZCBkb2N1bWVudCBjbGljayBjbG9zaW5nIGl0XHJcbiAgfVxyXG4gIHRoaXMuc3RhdHVzRHJvcGRvd25PcGVuID0gIXRoaXMuc3RhdHVzRHJvcGRvd25PcGVuO1xyXG59XHJcblxyXG4vLyBBcmUgYWxsIHN0YXR1c2VzIGN1cnJlbnRseSBzZWxlY3RlZD9cclxuYXJlQWxsU3RhdHVzZXNTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICBjb25zdCBzZWxlY3RlZDogc3RyaW5nW10gPSB0aGlzLmZpbHRlckZvcm0udmFsdWUuc3RhdHVzIHx8IFtdO1xyXG4gIHJldHVybiBzZWxlY3RlZC5sZW5ndGggPiAwICYmIHNlbGVjdGVkLmxlbmd0aCA9PT0gdGhpcy5zdGF0dXNPcHRpb25zLmxlbmd0aDtcclxufVxyXG5cclxuLy8gSGFuZGxlIFwiU2VsZWN0IEFsbFwiIGNoZWNrYm94IGNoYW5nZVxyXG5vblN0YXR1c1NlbGVjdEFsbENoYW5nZShldmVudDogRXZlbnQpIHtcclxuICBjb25zdCBjaGVja2JveCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxuICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xyXG4gICAgLy8gU2VsZWN0IGV2ZXJ5IHN0YXR1c1xyXG4gICAgdGhpcy5maWx0ZXJGb3JtLnBhdGNoVmFsdWUoeyBzdGF0dXM6IFsuLi50aGlzLnN0YXR1c09wdGlvbnNdIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBDbGVhciBhbGxcclxuICAgIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKHsgc3RhdHVzOiBbXSB9KTtcclxuICB9XHJcbn1cclxuZ2V0IHNlbGVjdGVkU3RhdHVzZXMoKTogc3RyaW5nW10ge1xyXG4gIHJldHVybiB0aGlzLmZpbHRlckZvcm0udmFsdWUuc3RhdHVzIHx8IFtdO1xyXG59XHJcblxyXG4gIGlzQmV0d2Vlbihjb250cm9sTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJGb3JtLmdldChjb250cm9sTmFtZSk/LnZhbHVlID09PSAnYmV0d2Vlbic7XHJcbiAgfVxyXG5uZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgaWYgKGNoYW5nZXNbJ2NsaWVudCddIHx8IGNoYW5nZXNbJ3Blcm1pc3Npb25UeXBlJ10gfHwgY2hhbmdlc1sndXNlclR5cGUnXSkge1xyXG4gICAgdGhpcy5sb2FkUmV2aWV3ZXJMaXN0KCk7XHJcbiAgfVxyXG59XHJcbi8vIGZ1bGwgdXNlciBsaXN0IHlvdSBhbHJlYWR5IGhhdmVcclxudXNlckxpc3Q6IGFueVtdID0gW107XHJcblxyXG4vLyBzZWFyY2ggdGV4dCBmb3IgcmV2aWV3ZXIgZHJvcGRvd25cclxuZmlsdGVyZWRSZXZpZXdlckxpc3Q6IGFueVtdID0gW107XHJcblxyXG4vLyBzZWFyY2ggdGV4dFxyXG5yZXZpZXdlclNlYXJjaFRlcm0gPSAnJztcclxuLy8gY29tcHV0ZWQgbGlzdCB1c2VkIGluICpuZ0ZvclxyXG5pbml0UmV2aWV3ZXJMaXN0KHVzZXJzOiBhbnlbXSkge1xyXG4gIHRoaXMudXNlckxpc3QgPSB1c2VycyB8fCBbXTtcclxuICB0aGlzLmZpbHRlcmVkUmV2aWV3ZXJMaXN0ID0gWy4uLnRoaXMudXNlckxpc3RdO1xyXG59XHJcblxyXG5vblJldmlld2VyU2VhcmNoKHZhbHVlOiBzdHJpbmcpIHtcclxuICB0aGlzLnJldmlld2VyU2VhcmNoVGVybSA9IHZhbHVlIHx8ICcnO1xyXG4gIGNvbnN0IHRlcm0gPSB0aGlzLnJldmlld2VyU2VhcmNoVGVybS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgaWYgKCF0ZXJtKSB7XHJcbiAgICAvLyByZXNldFxyXG4gICAgdGhpcy5maWx0ZXJlZFJldmlld2VyTGlzdCA9IFsuLi50aGlzLnVzZXJMaXN0XTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIHRoaXMuZmlsdGVyZWRSZXZpZXdlckxpc3QgPSB0aGlzLnVzZXJMaXN0LmZpbHRlcigodTogYW55KSA9PiB7XHJcbiAgICBjb25zdCBlbWFpbCA9ICh1LmVtYWlsIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgY29uc3QgbmFtZSA9ICh1Lm5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7IC8vIG9wdGlvbmFsXHJcbiAgICByZXR1cm4gZW1haWwuaW5jbHVkZXModGVybSkgfHwgbmFtZS5pbmNsdWRlcyh0ZXJtKTtcclxuICB9KTtcclxufVxyXG5hcHByb3ZlclNlYXJjaFRlcm06YW55O1xyXG5nZXQgZmlsdGVyZWRBcHByb3Zlckxpc3QoKTogYW55W10ge1xyXG4gIGNvbnN0IHRlcm0gPSAodGhpcy5hcHByb3ZlclNlYXJjaFRlcm0gfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gIGlmICghdGVybSkge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlckxpc3Q7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdGhpcy51c2VyTGlzdC5maWx0ZXIoKHU6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgZW1haWwgPSAodS5lbWFpbCB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IG5hbWUgPSAodS5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIGVtYWlsLmluY2x1ZGVzKHRlcm0pIHx8IG5hbWUuaW5jbHVkZXModGVybSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbm9uQXBwcm92ZXJTZWFyY2godmFsdWU6IHN0cmluZykge1xyXG4gIHRoaXMuYXBwcm92ZXJTZWFyY2hUZXJtID0gdmFsdWU7XHJcbn1cclxucHJpdmF0ZSBsb2FkUmV2aWV3ZXJMaXN0KCk6IHZvaWQge1xyXG4gIGlmICghdGhpcy5jbGllbnQpIHtcclxuICAgIHRoaXMudXNlckxpc3QgPSBbXTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGxldCB0eXBlOiBzdHJpbmc7XHJcblxyXG4gIGlmICh0aGlzLnVzZXJUeXBlID09PSAndGFuZ28nKSB7XHJcbiAgICB0eXBlID0gJ3RhbmdvJzsgICAgLy8gb3IgJ2FsbCdcclxuICB9IGVsc2UgaWYgKHRoaXMucGVybWlzc2lvblR5cGUgPT09ICdyZXZpZXcnKSB7XHJcbiAgICB0eXBlID0gJ3Jldmlldyc7XHJcbiAgfSBlbHNlIGlmICh0aGlzLnBlcm1pc3Npb25UeXBlID09PSAnYXBwcm92ZScpIHtcclxuICAgIHR5cGUgPSAnYXBwcm92ZSc7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMudXNlckxpc3QgPSBbXTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIHRoaXMuc2VydmljZS5nZXRSZXZpZXdlckFwaSh0aGlzLmNsaWVudCwgdHlwZSkuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICB0aGlzLnVzZXJMaXN0ID0gcmVzLmRhdGE7XHJcbiAgICAgICAgdGhpcy5pbml0UmV2aWV3ZXJMaXN0KHJlcy5kYXRhKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnVzZXJMaXN0ID0gW107XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICB0aGlzLnVzZXJMaXN0ID0gW107XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8vIG9wZW4gZmxhZ3NcclxucmV2aWV3ZXJEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuYXBwcm92ZXJEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuXHJcbi8vIGNvbnZlbmllbmNlIGdldHRlcnNcclxuZ2V0IHNlbGVjdGVkUmV2aWV3ZWRCeSgpOiBzdHJpbmdbXSB7XHJcbiAgcmV0dXJuIHRoaXMuZmlsdGVyRm9ybS52YWx1ZS5yZXZpZXdlZEJ5IHx8IFtdO1xyXG59XHJcblxyXG5nZXQgc2VsZWN0ZWRBcHByb3ZlZEJ5KCk6IHN0cmluZ1tdIHtcclxuICByZXR1cm4gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLmFwcHJvdmVkQnkgfHwgW107XHJcbn1cclxuXHJcbi8vIC0tLSBSZXZpZXdlZCBCeSBoZWxwZXJzIC0tLVxyXG5cclxudG9nZ2xlUmV2aWV3ZXJEcm9wZG93bihldmVudD86IE1vdXNlRXZlbnQpIHtcclxuICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIHRoaXMucmV2aWV3ZXJEcm9wZG93bk9wZW4gPSAhdGhpcy5yZXZpZXdlckRyb3Bkb3duT3BlbjtcclxufVxyXG5cclxuaXNSZXZpZXdlclNlbGVjdGVkKGVtYWlsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICByZXR1cm4gdGhpcy5zZWxlY3RlZFJldmlld2VkQnkuaW5jbHVkZXMoZW1haWwpO1xyXG59XHJcblxyXG5vblJldmlld2VyQ2hhbmdlKGV2ZW50OiBFdmVudCwgZW1haWw6IHN0cmluZykge1xyXG4gIGNvbnN0IGNoZWNrYm94ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgY29uc3Qgc2VsZWN0ZWQgPSBbLi4udGhpcy5zZWxlY3RlZFJldmlld2VkQnldO1xyXG5cclxuICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xyXG4gICAgaWYgKCFzZWxlY3RlZC5pbmNsdWRlcyhlbWFpbCkpIHNlbGVjdGVkLnB1c2goZW1haWwpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBpID0gc2VsZWN0ZWQuaW5kZXhPZihlbWFpbCk7XHJcbiAgICBpZiAoaSA+PSAwKSBzZWxlY3RlZC5zcGxpY2UoaSwgMSk7XHJcbiAgfVxyXG5cclxuICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZSh7IHJldmlld2VkQnk6IHNlbGVjdGVkIH0pO1xyXG59XHJcblxyXG5hcmVBbGxSZXZpZXdlcnNTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICByZXR1cm4gKFxyXG4gICAgdGhpcy51c2VyTGlzdC5sZW5ndGggPiAwICYmXHJcbiAgICB0aGlzLnNlbGVjdGVkUmV2aWV3ZWRCeS5sZW5ndGggPT09IHRoaXMudXNlckxpc3QubGVuZ3RoXHJcbiAgKTtcclxufVxyXG5cclxub25SZXZpZXdlclNlbGVjdEFsbChldmVudDogRXZlbnQpIHtcclxuICBjb25zdCBjaGVja2JveCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxuICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xyXG4gICAgdGhpcy5maWx0ZXJGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICByZXZpZXdlZEJ5OiB0aGlzLnVzZXJMaXN0Lm1hcCgodTphbnkpID0+IHUuZW1haWwpLFxyXG4gICAgfSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKHsgcmV2aWV3ZWRCeTogW10gfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyAtLS0gQXBwcm92ZWQgQnkgaGVscGVycyAtLS1cclxuXHJcbnRvZ2dsZUFwcHJvdmVyRHJvcGRvd24oZXZlbnQ/OiBNb3VzZUV2ZW50KSB7XHJcbiAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB0aGlzLmFwcHJvdmVyRHJvcGRvd25PcGVuID0gIXRoaXMuYXBwcm92ZXJEcm9wZG93bk9wZW47XHJcbn1cclxuXHJcbmlzQXBwcm92ZXJTZWxlY3RlZChlbWFpbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRBcHByb3ZlZEJ5LmluY2x1ZGVzKGVtYWlsKTtcclxufVxyXG5cclxub25BcHByb3ZlckNoYW5nZShldmVudDogRXZlbnQsIGVtYWlsOiBzdHJpbmcpIHtcclxuICBjb25zdCBjaGVja2JveCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gIGNvbnN0IHNlbGVjdGVkID0gWy4uLnRoaXMuc2VsZWN0ZWRBcHByb3ZlZEJ5XTtcclxuXHJcbiAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcclxuICAgIGlmICghc2VsZWN0ZWQuaW5jbHVkZXMoZW1haWwpKSBzZWxlY3RlZC5wdXNoKGVtYWlsKTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgaSA9IHNlbGVjdGVkLmluZGV4T2YoZW1haWwpO1xyXG4gICAgaWYgKGkgPj0gMCkgc2VsZWN0ZWQuc3BsaWNlKGksIDEpO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5maWx0ZXJGb3JtLnBhdGNoVmFsdWUoeyBhcHByb3ZlZEJ5OiBzZWxlY3RlZCB9KTtcclxufVxyXG5cclxuYXJlQWxsQXBwcm92ZXJzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIChcclxuICAgIHRoaXMudXNlckxpc3QubGVuZ3RoID4gMCAmJlxyXG4gICAgdGhpcy5zZWxlY3RlZEFwcHJvdmVkQnkubGVuZ3RoID09PSB0aGlzLnVzZXJMaXN0Lmxlbmd0aFxyXG4gICk7XHJcbn1cclxuXHJcbm9uQXBwcm92ZXJTZWxlY3RBbGwoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgY29uc3QgY2hlY2tib3ggPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuXHJcbiAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcclxuICAgIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgYXBwcm92ZWRCeTogdGhpcy51c2VyTGlzdC5tYXAoKHU6YW55KSA9PiB1LmVtYWlsKSxcclxuICAgIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZSh7IGFwcHJvdmVkQnk6IFtdIH0pO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbiAgb25SZXNldCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVyRm9ybS5yZXNldCh7XHJcbiAgICAgIHN0YXR1czogW10sXHJcbiAgcmV2aWV3ZXJDb25kaXRpb246IG51bGwsXHJcbiAgcmV2aWV3ZXJGcm9tOiBudWxsLFxyXG4gIHJldmlld2VyVG86IG51bGwsXHJcbiAgYXBwcm92ZXJDb25kaXRpb246IG51bGwsXHJcbiAgYXBwcm92ZXJGcm9tOiBudWxsLFxyXG4gIGFwcHJvdmVyVG86IG51bGwsXHJcbiAgdGFuZ29Db25kaXRpb246IG51bGwsXHJcbiAgdGFuZ29Gcm9tOiBudWxsLFxyXG4gIHRhbmdvVG86IG51bGwsXHJcbiAgcmV2aWV3ZWRCeTogW10sXHJcbiAgYXBwcm92ZWRCeTogW10sXHJcbiAgICB9KTtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gIH1cclxucHJpdmF0ZSBtYXBBY2N1cmFjeShcclxuICBjb25kaXRpb246IENvbmRpdGlvbiB8IG51bGwsXHJcbiAgZnJvbTogbnVtYmVyIHwgbnVsbCxcclxuICB0bzogbnVtYmVyIHwgbnVsbFxyXG4pOiBzdHJpbmcgfCBudWxsIHtcclxuXHJcbiAgLy8gbm90aGluZyBzZWxlY3RlZFxyXG4gIGlmICghY29uZGl0aW9uIHx8IGZyb20gPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcblxyXG4gIC8vIFwiYmV0d2VlblwiIOKGkiBcIjkwIHRvIDEwMFwiXHJcbiAgaWYgKGNvbmRpdGlvbiA9PT0gJ2JldHdlZW4nKSB7XHJcbiAgICBpZiAodG8gPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gYCR7ZnJvbX0gdG8gJHt0b31gO1xyXG4gIH1cclxuXHJcbiAgLy8gb3RoZXIgY29uZGl0aW9ucyAoZ3QsIGx0LCBndGUsIGx0ZSlcclxuICBjb25zdCBvcE1hcDogUmVjb3JkPENvbmRpdGlvbiwgc3RyaW5nPiA9IHtcclxuICAgIGd0OiAnPicsXHJcbiAgICBsdDogJzwnLFxyXG4gICAgZ3RlOiAnPj0nLFxyXG4gICAgbHRlOiAnPD0nLFxyXG4gICAgYmV0d2VlbjogJycsIC8vIGFscmVhZHkgaGFuZGxlZCBhYm92ZVxyXG4gIH07XHJcblxyXG4gIHJldHVybiBgJHtvcE1hcFtjb25kaXRpb25dfSAke2Zyb219YDsgIC8vIGUuZy4gXCI+PSA5MFwiXHJcbn1cclxuXHJcbiAgb25BcHBseSgpOiB2b2lkIHtcclxuXHJcbiAgIGNvbnN0IHJhdyA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZTtcclxuXHJcbiAgY29uc3QgcmV2aWV3ZXJTdHIgPSB0aGlzLm1hcEFjY3VyYWN5KHJhdy5yZXZpZXdlckNvbmRpdGlvbiwgcmF3LnJldmlld2VyRnJvbSwgcmF3LnJldmlld2VyVG8pO1xyXG4gIGNvbnN0IGFwcHJvdmVyU3RyID0gdGhpcy5tYXBBY2N1cmFjeShyYXcuYXBwcm92ZXJDb25kaXRpb24sIHJhdy5hcHByb3ZlckZyb20sIHJhdy5hcHByb3ZlclRvKTtcclxuICBjb25zdCB0YW5nb1N0ciAgICA9IHRoaXMubWFwQWNjdXJhY3kocmF3LnRhbmdvQ29uZGl0aW9uLCByYXcudGFuZ29Gcm9tLCByYXcudGFuZ29Ubyk7XHJcblxyXG4gIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICBmaWx0ZXJCeVN0YXR1czogcmF3LnN0YXR1cyB8fCBbXSxcclxuXHJcbiAgICBmaWx0ZXJCeVJldmlld2VyOiByZXZpZXdlclN0cixcclxuICAgIGZpbHRlckJ5QXBwcm92ZXI6IGFwcHJvdmVyU3RyLFxyXG4gICAgZmlsdGVyQnlUYW5nbzogdGFuZ29TdHIsXHJcblxyXG4gICAgZmlsdGVyQnlSZXZpZXdlZEJ5OiByYXcucmV2aWV3ZWRCeSB8fCBbXSwgICAgICAgIFxyXG4gICAgZmlsZXRlckJ5QXBwcm92ZWRCeTogcmF3LmFwcHJvdmVkQnkgfHwgW10sICAgICAgICBcclxuICB9O1xyXG5jb25zb2xlLmxvZygpXHJcbiAgdGhpcy5hcHBseS5lbWl0KHBheWxvYWQpO1xyXG4gIHRoaXMuY2xvc2UoKTtcclxuICAgIHRoaXMuc2hvd1BhbmVsID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuIiwiPCEtLSB0aWNrZXQtZmlsdGVyLXBhbmVsLmNvbXBvbmVudC5odG1sIC0tPlxyXG48ZGl2IGNsYXNzPVwiZmlsdGVyLXdyYXBwZXJcIiAqbmdJZj1cImlzT3BlblwiPlxyXG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItY2FyZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZpbHRlci1oZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XHJcbiAgPGRpdiBjbGFzcz1cInRpdGxlXCI+RmlsdGVyIE9wdGlvbnM8L2Rpdj5cclxuICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIChjbGljayk9XCJjbG9zZSgpXCI+4pyVPC9idXR0b24+IC0tPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCI+XHJcbiAgICAgIDwhLS0gU3RhdHVzIC0tPlxyXG48ZGl2IGNsYXNzPVwibWItMyBwb3NpdGlvbi1yZWxhdGl2ZVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U3RhdHVzPC9sYWJlbD5cclxuXHJcbiAgPCEtLSBIZWFkZXIgLyB0cmlnZ2VyIC0tPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwic3RhdHVzLXNlbGVjdCBib3JkZXIgcm91bmRlZCBweC0zIHB5LTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAoY2xpY2spPVwidG9nZ2xlU3RhdHVzRHJvcGRvd24oJGV2ZW50KVwiXHJcbiAgPlxyXG4gICAgPHNwYW4gKm5nSWY9XCIhc2VsZWN0ZWRTdGF0dXNlcy5sZW5ndGhcIj5TZWxlY3Q8L3NwYW4+XHJcblxyXG4gICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RlZFN0YXR1c2VzLmxlbmd0aCA9PT0gMVwiPlxyXG4gICAgICB7eyBzZWxlY3RlZFN0YXR1c2VzWzBdIH19XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RlZFN0YXR1c2VzLmxlbmd0aCA+IDFcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgPHNwYW4+e3sgc2VsZWN0ZWRTdGF0dXNlc1swXSB9fTwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBtcy0yXCI+XHJcbiAgICAgICAgK3t7IHNlbGVjdGVkU3RhdHVzZXMubGVuZ3RoIC0gMSB9fVxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIERST1BET1dOIFBBTkVMIChPVkVSTEFZKSAtLT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cInN0YXR1cy1kcm9wZG93biBwb3NpdGlvbi1hYnNvbHV0ZSB3LTEwMCBtdC0xIGJvcmRlciByb3VuZGVkIHAtMSBiZy13aGl0ZVwiXHJcbiAgICBzdHlsZT1cInotaW5kZXg6IDEwMDA7IG1heC1oZWlnaHQ6IDIyMHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiXHJcbiAgICAqbmdJZj1cInN0YXR1c0Ryb3Bkb3duT3BlblwiXHJcbiAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICA+XHJcbiAgICA8IS0tIFNlbGVjdCBBbGwgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBweC0wIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCB0ZXh0LWRhcmtcIlxyXG4gICAgICAgIGlkPVwic3RhdHVzLXNlbGVjdC1hbGxcIlxyXG4gICAgICAgIFtjaGVja2VkXT1cImFyZUFsbFN0YXR1c2VzU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJvblN0YXR1c1NlbGVjdEFsbENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgLz5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtcy0yXCIgZm9yPVwic3RhdHVzLXNlbGVjdC1hbGxcIj5cclxuICAgICAgICBTZWxlY3QgQWxsXHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPCEtLSBPcHRpb25zIC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImZvcm0tY2hlY2sgcHgtMCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTFcIlxyXG4gICAgICAqbmdGb3I9XCJsZXQgcyBvZiBzdGF0dXNPcHRpb25zXCJcclxuICAgID5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgdGV4dC1kYXJrXCJcclxuICAgICAgICBbaWRdPVwiJ3N0YXR1cy0nICsgc1wiXHJcbiAgICAgICAgW2NoZWNrZWRdPVwiaXNTdGF0dXNTZWxlY3RlZChzKVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJvblN0YXR1c0NoYW5nZSgkZXZlbnQsIHMpXCJcclxuICAgICAgLz5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtcy0yXCIgW2Zvcl09XCInc3RhdHVzLScgKyBzXCI+XHJcbiAgICAgICAge3sgcyB9fVxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcblxyXG4gICAgICA8IS0tIFJldmlld2VyIGFjY3VyYWN5IC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItM1wiICpuZ0lmPVwic2hvd1Jldmlld2VyQWNjdXJhY3lcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UmV2aWV3ZXIgYWNjdXJhY3kgKCUpIGJ5IGNvbmRpdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxyXG4gICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IHctMTAwXCIgZm9ybUNvbnRyb2xOYW1lPVwicmV2aWV3ZXJDb25kaXRpb25cIj5cclxuICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+U2VsZWN0PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGMgb2YgY29uZGl0aW9uT3B0aW9uc1wiIFtuZ1ZhbHVlXT1cImMudmFsdWVcIj5cclxuICAgICAgICAgICAgICB7eyBjLmxhYmVsIH19XHJcbiAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgPC9zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgPCEtLSBvbmUgb3IgdHdvIGlucHV0cyAtLT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0JldHdlZW4oJ3Jldmlld2VyQ29uZGl0aW9uJyk7IGVsc2Ugc2luZ2xlUmV2aWV3ZXJcIj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgbWluPVwiMVwiXHJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmV2aWV3ZXJGcm9tXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZyb21cIiAvPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICBtaW49XCIxXCJcclxuICAgICAgICAgICAgICBtYXg9XCIxMDBcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZXZpZXdlclRvXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlRvXCIgLz5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGVSZXZpZXdlcj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgbWluPVwiMVwiXHJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmV2aWV3ZXJGcm9tXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjEgdG8gMTAwJVwiIC8+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gQXBwcm92ZXIgYWNjdXJhY3kgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCIgKm5nSWY9XCJzaG93QXBwcm92ZXJBY2N1cmFjeVwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5BcHByb3ZlciBhY2N1cmFjeSAoJSkgYnkgY29uZGl0aW9uPC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3Qgdy0xMDBcIiBmb3JtQ29udHJvbE5hbWU9XCJhcHByb3ZlckNvbmRpdGlvblwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj5TZWxlY3Q8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYyBvZiBjb25kaXRpb25PcHRpb25zXCIgW25nVmFsdWVdPVwiYy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgIHt7IGMubGFiZWwgfX1cclxuICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICA8L3NlbGVjdD5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNCZXR3ZWVuKCdhcHByb3ZlckNvbmRpdGlvbicpOyBlbHNlIHNpbmdsZUFwcHJvdmVyXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgIG1pbj1cIjFcIlxyXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFwcHJvdmVyRnJvbVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGcm9tXCIgLz5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgbWluPVwiMVwiXHJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYXBwcm92ZXJUb1wiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUb1wiIC8+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlQXBwcm92ZXI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgIG1pbj1cIjFcIlxyXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFwcHJvdmVyRnJvbVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIxIHRvIDEwMCVcIiAvPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIFRhbmdvIGFjY3VyYWN5IC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItM1wiICpuZ0lmPVwic2hvd1RhbmdvQWNjdXJhY3lcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+VGFuZ28gYWNjdXJhY3kgKCUpIGJ5IGNvbmRpdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxyXG4gICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IHctNTBcIiBmb3JtQ29udHJvbE5hbWU9XCJ0YW5nb0NvbmRpdGlvblwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj5TZWxlY3Q8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYyBvZiBjb25kaXRpb25PcHRpb25zXCIgW25nVmFsdWVdPVwiYy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgIHt7IGMubGFiZWwgfX1cclxuICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICA8L3NlbGVjdD5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNCZXR3ZWVuKCd0YW5nb0NvbmRpdGlvbicpOyBlbHNlIHNpbmdsZVRhbmdvXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgIG1pbj1cIjFcIlxyXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRhbmdvRnJvbVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGcm9tXCIgLz5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgbWluPVwiMVwiXHJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGFuZ29Ub1wiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUb1wiIC8+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlVGFuZ28+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgIG1pbj1cIjFcIlxyXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRhbmdvRnJvbVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIxIHRvIDEwMCVcIiAvPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbjxkaXZcclxuICBjbGFzcz1cIm1iLTMgcG9zaXRpb24tcmVsYXRpdmVcIlxyXG4gICpuZ0lmPVwic2hvd1Jldmlld2VkQnlcIlxyXG4gIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4+XHJcbiAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlJldmlld2VkIGJ5PC9sYWJlbD5cclxuXHJcbiAgPCEtLSBUcmlnZ2VyIC8gZGlzcGxheSAtLT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImJvcmRlciByb3VuZGVkIHB4LTMgcHktMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgIChjbGljayk9XCJ0b2dnbGVSZXZpZXdlckRyb3Bkb3duKCRldmVudClcIlxyXG4gID5cclxuICAgIDwhLS0gMCBzZWxlY3RlZCAtLT5cclxuICAgIDxzcGFuICpuZ0lmPVwiIXNlbGVjdGVkUmV2aWV3ZWRCeS5sZW5ndGhcIj5cclxuICAgICAgU2VsZWN0XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPCEtLSAxIHNlbGVjdGVkIC0tPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RlZFJldmlld2VkQnkubGVuZ3RoID09PSAxXCI+XHJcbiAgICAgIHt7IHNlbGVjdGVkUmV2aWV3ZWRCeVswXSB9fVxyXG4gICAgPC9zcGFuPlxyXG5cclxuICAgIDwhLS0gPjEgc2VsZWN0ZWQgLS0+XHJcbiAgICA8c3BhblxyXG4gICAgICAqbmdJZj1cInNlbGVjdGVkUmV2aWV3ZWRCeS5sZW5ndGggPiAxXCJcclxuICAgICAgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgID5cclxuICAgICAgPHNwYW4+e3sgc2VsZWN0ZWRSZXZpZXdlZEJ5WzBdIH19PC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIG1zLTJcIj5cclxuICAgICAgICAre3sgc2VsZWN0ZWRSZXZpZXdlZEJ5Lmxlbmd0aCAtIDEgfX1cclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9zcGFuPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIERyb3Bkb3duIHBhbmVsIC0tPlxyXG4gPCEtLSBEcm9wZG93biBwYW5lbCAtLT5cclxuPGRpdlxyXG4gICpuZ0lmPVwicmV2aWV3ZXJEcm9wZG93bk9wZW5cIlxyXG4gIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgdy0xMDAgYm9yZGVyIHJvdW5kZWQgYmctd2hpdGUgcC0xIG10LTFcIlxyXG4gIHN0eWxlPVwiei1pbmRleDogMTAwMDsgbWF4LWhlaWdodDogMjIwcHg7IG92ZXJmbG93LXk6IGF1dG87XCJcclxuICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuPlxyXG5cclxuICA8IS0tIPCflI0gU2VhcmNoIGJveCAtLT5cclxuICA8ZGl2IGNsYXNzPVwibWItMiBweC0wXCI+XHJcbiAgICA8aW5wdXRcclxuICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIlxyXG4gICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBieSBlbWFpbFwiXHJcbiAgICAgIFsobmdNb2RlbCldPVwicmV2aWV3ZXJTZWFyY2hUZXJtXCJcclxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25SZXZpZXdlclNlYXJjaCgkZXZlbnQpXCJcclxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAvPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFNlbGVjdCBBbGwgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgcHgtMCBtYi0yIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgIDxpbnB1dFxyXG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIlxyXG4gICAgICBpZD1cInJldmlld2VyLWFsbFwiXHJcbiAgICAgIFtjaGVja2VkXT1cImFyZUFsbFJldmlld2Vyc1NlbGVjdGVkKClcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uUmV2aWV3ZXJTZWxlY3RBbGwoJGV2ZW50KVwiXHJcbiAgICAvPlxyXG4gICAgPGxhYmVsIGZvcj1cInJldmlld2VyLWFsbFwiIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtcy0yXCI+XHJcbiAgICAgIFNlbGVjdCBBbGxcclxuICAgIDwvbGFiZWw+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gT3B0aW9ucyDigJMg8J+UpSBub3cgdXNlIGZpbHRlcmVkUmV2aWV3ZXJMaXN0IC0tPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiZm9ybS1jaGVjayBtYi0xIHB4LTAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAqbmdGb3I9XCJsZXQgdSBvZiBmaWx0ZXJlZFJldmlld2VyTGlzdFwiXHJcbiAgPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiXHJcbiAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgIFtpZF09XCIncmV2LScgKyB1LmVtYWlsXCJcclxuICAgICAgW2NoZWNrZWRdPVwiaXNSZXZpZXdlclNlbGVjdGVkKHUuZW1haWwpXCJcclxuICAgICAgKGNoYW5nZSk9XCJvblJldmlld2VyQ2hhbmdlKCRldmVudCwgdS5lbWFpbClcIlxyXG4gICAgLz5cclxuICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbXMtMlwiIFtmb3JdPVwiJ3Jldi0nICsgdS5lbWFpbFwiPlxyXG4gICAgICB7eyB1LmVtYWlsIH19XHJcbiAgICA8L2xhYmVsPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG5cclxuXHJcbiAgICAgIDwhLS0gQXBwcm92ZWQgQnkgLS0+XHJcbjxkaXZcclxuICBjbGFzcz1cIm1iLTMgcG9zaXRpb24tcmVsYXRpdmVcIlxyXG4gICpuZ0lmPVwic2hvd0FwcHJvdmVkQnlcIlxyXG4gIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4+XHJcbiAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFwcHJvdmVkIGJ5PC9sYWJlbD5cclxuXHJcbiAgPCEtLSBUcmlnZ2VyIC8gZGlzcGxheSAtLT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImJvcmRlciByb3VuZGVkIHB4LTMgcHktMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgIChjbGljayk9XCJ0b2dnbGVBcHByb3ZlckRyb3Bkb3duKCRldmVudClcIlxyXG4gID5cclxuICAgIDwhLS0gMCBzZWxlY3RlZCAtLT5cclxuICAgIDxzcGFuICpuZ0lmPVwiIXNlbGVjdGVkQXBwcm92ZWRCeS5sZW5ndGhcIj5cclxuICAgICAgU2VsZWN0XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPCEtLSAxIHNlbGVjdGVkIC0tPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RlZEFwcHJvdmVkQnkubGVuZ3RoID09PSAxXCI+XHJcbiAgICAgIHt7IHNlbGVjdGVkQXBwcm92ZWRCeVswXSB9fVxyXG4gICAgPC9zcGFuPlxyXG5cclxuICAgIDwhLS0gPjEgc2VsZWN0ZWQgLS0+XHJcbiAgICA8c3BhblxyXG4gICAgICAqbmdJZj1cInNlbGVjdGVkQXBwcm92ZWRCeS5sZW5ndGggPiAxXCJcclxuICAgICAgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgID5cclxuICAgICAgPHNwYW4+e3sgc2VsZWN0ZWRBcHByb3ZlZEJ5WzBdIH19PC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIG1zLTJcIj5cclxuICAgICAgICAre3sgc2VsZWN0ZWRBcHByb3ZlZEJ5Lmxlbmd0aCAtIDEgfX1cclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9zcGFuPlxyXG5cclxuICA8L2Rpdj5cclxuPCEtLSBEcm9wZG93biBwYW5lbCAtLT5cclxuPGRpdlxyXG4gICpuZ0lmPVwiYXBwcm92ZXJEcm9wZG93bk9wZW5cIlxyXG4gIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgdy0xMDAgYm9yZGVyIHJvdW5kZWQgYmctd2hpdGUgcC0xIG10LTFcIlxyXG4gIHN0eWxlPVwiei1pbmRleDogMTAwMDsgbWF4LWhlaWdodDogMjIwcHg7IG92ZXJmbG93LXk6IGF1dG87XCJcclxuICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuPlxyXG5cclxuICA8IS0tIPCflI0gU2VhcmNoIGJveCAtLT5cclxuICA8ZGl2IGNsYXNzPVwibWItMiBweC0wXCI+XHJcbiAgICA8aW5wdXRcclxuICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIlxyXG4gICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBieSBlbWFpbFwiXHJcbiAgICAgIFtuZ01vZGVsXT1cImFwcHJvdmVyU2VhcmNoVGVybVwiXHJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uUmV2aWV3ZXJTZWFyY2goJGV2ZW50KVwiXHJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBTZWxlY3QgQWxsIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIHB4LTAgbWItMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8aW5wdXRcclxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgaWQ9XCJyZXZpZXdlci1hbGxcIlxyXG4gICAgICBbY2hlY2tlZF09XCJhcmVBbGxSZXZpZXdlcnNTZWxlY3RlZCgpXCJcclxuICAgICAgKGNoYW5nZSk9XCJvblJldmlld2VyU2VsZWN0QWxsKCRldmVudClcIlxyXG4gICAgLz5cclxuICAgIDxsYWJlbCBmb3I9XCJyZXZpZXdlci1hbGxcIiBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbXMtMlwiPlxyXG4gICAgICBTZWxlY3QgQWxsXHJcbiAgICA8L2xhYmVsPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIE9wdGlvbnMgKHVzZSBmaWx0ZXJlZFJldmlld2VyTGlzdCBpbnN0ZWFkIG9mIHVzZXJMaXN0KSAtLT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImZvcm0tY2hlY2sgbWItMSBweC0wIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgKm5nRm9yPVwibGV0IHUgb2YgZmlsdGVyZWRBcHByb3Zlckxpc3RcIlxyXG4gID5cclxuICAgIDxpbnB1dFxyXG4gICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIlxyXG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICBbaWRdPVwiJ3Jldi0nICsgdS5lbWFpbFwiXHJcbiAgICAgIFtjaGVja2VkXT1cImlzUmV2aWV3ZXJTZWxlY3RlZCh1LmVtYWlsKVwiXHJcbiAgICAgIChjaGFuZ2UpPVwib25SZXZpZXdlckNoYW5nZSgkZXZlbnQsIHUuZW1haWwpXCJcclxuICAgIC8+XHJcbiAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1zLTJcIiBbZm9yXT1cIidyZXYtJyArIHUuZW1haWxcIj5cclxuICAgICAge3sgdS5lbWFpbCB9fVxyXG4gICAgPC9sYWJlbD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG4gIDwhLS0gRHJvcGRvd24gcGFuZWwgLS0+XHJcblxyXG48L2Rpdj5cclxuXHJcblxyXG4gICAgICA8IS0tIEZvb3RlciBidXR0b25zIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHctMTAwIG10LTRcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTUwIG1lLTFcIiAoY2xpY2spPVwib25SZXNldCgpXCI+XHJcbiAgICAgICAgICBSZXNldFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctNTAgbXMtMVwiIChjbGljayk9XCJvbkFwcGx5KClcIj5cclxuICAgICAgICAgIEFwcGx5XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
391
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0LWZpbHRlci1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtdGlja2V0cy9zcmMvbGliL2NvbXBvbmVudHMvdGlja2V0LWZpbHRlci1wYW5lbC90aWNrZXQtZmlsdGVyLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS10aWNrZXRzL3NyYy9saWIvY29tcG9uZW50cy90aWNrZXQtZmlsdGVyLXBhbmVsL3RpY2tldC1maWx0ZXItcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBVXBFLE1BQU0sT0FBTywwQkFBMEI7SUFtRGpCO0lBQXdCO0lBQXlCO0lBbEQxRCxLQUFLLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUNqQyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQyxDQUFHLGdCQUFnQjtJQUMzRCxjQUFjLEdBQWtCLElBQUksQ0FBQztJQUN2QyxRQUFRLEdBQWtCLElBQUksQ0FBQyxDQUFDLHlCQUF5QjtJQUN6RCxNQUFNLENBQU07SUFFbkIsZUFBZSxDQUFDLEtBQWlCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFFekIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUNELE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBcUMsc0JBQXNCO0lBRTFFLDZDQUE2QztJQUM3QyxJQUFJO1FBQ0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxLQUFLO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFXLHdDQUF3QztJQUV2RSxhQUFhLEdBQVU7UUFDckIsTUFBTTtRQUNOLGFBQWE7UUFDYixRQUFRO1FBQ1Isb0JBQW9CO1FBQ3BCLG1CQUFtQjtRQUNuQixTQUFTO1FBQ1QsZUFBZTtLQUNoQixDQUFDO0lBR0EsZ0JBQWdCLEdBQUc7UUFDakIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtRQUN4QyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRTtRQUN2QyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLDZCQUE2QixFQUFFO1FBQ3RELEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsNEJBQTRCLEVBQUU7UUFDckQsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7S0FDdkMsQ0FBQztJQUVGLFVBQVUsQ0FBWTtJQUV0QixZQUFvQixFQUFlLEVBQVMsSUFBZ0IsRUFBUyxPQUFxQjtRQUF0RSxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQVMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFTLFlBQU8sR0FBUCxPQUFPLENBQWM7UUFDeEYsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUM5QixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFFWixpQkFBaUIsRUFBRSxDQUFDLElBQXdCLENBQUM7WUFDN0MsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDN0QsVUFBVSxFQUFFLENBQUMsSUFBSSxFQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFM0QsaUJBQWlCLEVBQUUsQ0FBQyxJQUF3QixDQUFDO1lBQzdDLFlBQVksRUFBRSxDQUFDLElBQUksRUFBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzdELFVBQVUsRUFBRSxDQUFDLElBQUksRUFBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRTNELGNBQWMsRUFBRSxDQUFDLElBQXdCLENBQUM7WUFDMUMsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUQsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFeEQsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3BCLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQztTQUNiLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDSCxVQUFVLENBQUMsS0FBVSxFQUFFLFdBQW1CO1FBQ3hDLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMs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emFVLDBCQUEwQjs0RkFBMUIsMEJBQTBCLHlTQ1h2Qywrd1pBa1lBOzs0RkR2WGEsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHlCQUF5QjtxSUFLeEIsS0FBSztzQkFBZCxNQUFNO2dCQUNFLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0UsY0FBYztzQkFBdEIsS0FBSztnQkFDQyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFFSixlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVGlja2V0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RpY2tldC5zZXJ2aWNlJztcclxuXHJcbnR5cGUgQ29uZGl0aW9uID0gJ2d0JyB8ICdsdCcgfCAnZ3RlJyB8ICdsdGUnIHwgJ2JldHdlZW4nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItdGlja2V0LWZpbHRlci1wYW5lbCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RpY2tldC1maWx0ZXItcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi90aWNrZXQtZmlsdGVyLXBhbmVsLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGlja2V0RmlsdGVyUGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gICBAT3V0cHV0KCkgYXBwbHkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgcGFuZWxDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7ICAgLy8g4pyFIG5vdCBgY2xvc2VgXHJcbiAgQElucHV0KCkgcGVybWlzc2lvblR5cGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5ASW5wdXQoKSB1c2VyVHlwZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIGUuZy4gJ3RhbmdvJyBvciBvdGhlcnNcclxuQElucHV0KCkgY2xpZW50IDphbnk7XHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0aGlzLmVSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xyXG4gICAgaWYgKCFjbGlja2VkSW5zaWRlKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcbiAgaXNPcGVuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRyb2xzIHZpc2liaWxpdHlcclxuXHJcbiAgLy8gY2FsbGVkIGZyb20gcGFyZW50IHZpYSAjZmlsdGVyUGFuZWwub3BlbigpXHJcbiAgb3BlbigpIHtcclxuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIGNhbGxlZCBmcm9tIGNsb3NlIGJ1dHRvbiBpbnNpZGUgdGhlIHBhbmVsXHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5wYW5lbENsb3NlZC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBzaG93UGFuZWwgPSBmYWxzZTsgICAgICAgICAgIC8vIHlvdSBjYW4gYWxzbyBjb250cm9sIHRoaXMgZnJvbSBwYXJlbnRcclxuXHJcbnN0YXR1c09wdGlvbnM6IGFueVtdID0gW1xyXG4gICdPcGVuJyxcclxuICAnSW4tUHJvZ3Jlc3MnLFxyXG4gICdDbG9zZWQnLFxyXG4gICdVbmRlciB0YW5nbyByZXZpZXcnLFxyXG4gICdUYW5nbyByZXZpZXcgZG9uZScsXHJcbiAgJ0V4cGlyZWQnLFxyXG4gICdUYW5nbyBFeHBpcmVkJyxcclxuXTtcclxuXHJcblxyXG4gIGNvbmRpdGlvbk9wdGlvbnMgPSBbXHJcbiAgICB7IHZhbHVlOiAnZ3QnLCBsYWJlbDogJz4gR3JlYXRlciB0aGFuJyB9LFxyXG4gICAgeyB2YWx1ZTogJ2x0JywgbGFiZWw6ICc8IExlc3NlciB0aGFuJyB9LFxyXG4gICAgeyB2YWx1ZTogJ2d0ZScsIGxhYmVsOiAnPj0gR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvJyB9LFxyXG4gICAgeyB2YWx1ZTogJ2x0ZScsIGxhYmVsOiAnPD0gTGVzc2VyIHRoYW4gb3IgZXF1YWwgdG8nIH0sXHJcbiAgICB7IHZhbHVlOiAnYmV0d2VlbicsIGxhYmVsOiAnQmV0d2VlbicgfSxcclxuICBdO1xyXG5cclxuICBmaWx0ZXJGb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLHByaXZhdGUgZVJlZjogRWxlbWVudFJlZixwcml2YXRlIHNlcnZpY2U6VGlja2V0U2VydmljZSkge1xyXG4gICAgdGhpcy5maWx0ZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHN0YXR1czogW1tdXSxcclxuXHJcbiAgICAgIHJldmlld2VyQ29uZGl0aW9uOiBbbnVsbCBhcyBDb25kaXRpb24gfCBudWxsXSxcclxuICAgICAgcmV2aWV3ZXJGcm9tOiBbbnVsbCxbVmFsaWRhdG9ycy5taW4oMCksIFZhbGlkYXRvcnMubWF4KDEwMCldXSxcclxuICAgICAgcmV2aWV3ZXJUbzogW251bGwsW1ZhbGlkYXRvcnMubWluKDApLCBWYWxpZGF0b3JzLm1heCgxMDApXV0sXHJcblxyXG4gICAgICBhcHByb3ZlckNvbmRpdGlvbjogW251bGwgYXMgQ29uZGl0aW9uIHwgbnVsbF0sXHJcbiAgICAgIGFwcHJvdmVyRnJvbTogW251bGwsW1ZhbGlkYXRvcnMubWluKDApLCBWYWxpZGF0b3JzLm1heCgxMDApXV0sXHJcbiAgICAgIGFwcHJvdmVyVG86IFtudWxsLFtWYWxpZGF0b3JzLm1pbigwKSwgVmFsaWRhdG9ycy5tYXgoMTAwKV1dLFxyXG5cclxuICAgICAgdGFuZ29Db25kaXRpb246IFtudWxsIGFzIENvbmRpdGlvbiB8IG51bGxdLFxyXG4gICAgICB0YW5nb0Zyb206IFtudWxsLFtWYWxpZGF0b3JzLm1pbigwKSwgVmFsaWRhdG9ycy5tYXgoMTAwKV1dLFxyXG4gICAgICB0YW5nb1RvOiBbbnVsbCxbVmFsaWRhdG9ycy5taW4oMCksIFZhbGlkYXRvcnMubWF4KDEwMCldXSxcclxuXHJcbiAgICAgIHJldmlld2VkQnk6IFtbXV0sXHJcbiAgYXBwcm92ZWRCeTogW1tdXSwgIFxyXG4gICAgfSk7XHJcbiAgfVxyXG5saW1pdFZhbHVlKGV2ZW50OiBhbnksIGNvbnRyb2xOYW1lOiBzdHJpbmcpIHtcclxuICBsZXQgdmFsdWUgPSBOdW1iZXIoZXZlbnQudGFyZ2V0LnZhbHVlKTtcclxuXHJcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAwO1xyXG4gIGlmICh2YWx1ZSA+IDEwMCkgdmFsdWUgPSAxMDA7XHJcblxyXG4gIGV2ZW50LnRhcmdldC52YWx1ZSA9IHZhbHVlO1xyXG4gIHRoaXMuZmlsdGVyRm9ybS5nZXQoY29udHJvbE5hbWUpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG59XHJcblxyXG5nZXQgaXNUYW5nbygpOiBib29sZWFuIHtcclxuICByZXR1cm4gdGhpcy51c2VyVHlwZSA9PT0gJ3RhbmdvJztcclxufVxyXG5cclxuLy8gU0hPVyAvIEhJREUgUlVMRVNcclxuXHJcbi8vIFJldmlld2VyIGFjY3VyYWN5IGFuZCBcIlJldmlld2VkIGJ5XCIgdmlzaWJsZSBmb3IgdGFuZ28gKyByZXZpZXdlclxyXG5nZXQgc2hvd1Jldmlld2VyQWNjdXJhY3koKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHRoaXMuaXNUYW5nbyB8fCB0aGlzLnBlcm1pc3Npb25UeXBlID09PSAncmV2aWV3JztcclxufVxyXG5cclxuZ2V0IHNob3dSZXZpZXdlZEJ5KCk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiAgdGhpcy5wZXJtaXNzaW9uVHlwZSA9PT0gJ3Jldmlldyc7XHJcbn1cclxuXHJcbi8vIEFwcHJvdmVyIGFjY3VyYWN5IGFuZCBcIkFwcHJvdmVkIGJ5XCIgdmlzaWJsZSBmb3IgdGFuZ28gKyBhcHByb3ZlclxyXG5nZXQgc2hvd0FwcHJvdmVyQWNjdXJhY3koKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHRoaXMuaXNUYW5nbyB8fCB0aGlzLnBlcm1pc3Npb25UeXBlID09PSAnYXBwcm92ZSc7XHJcbn1cclxuXHJcbmdldCBzaG93QXBwcm92ZWRCeSgpOiBib29sZWFuIHtcclxuICByZXR1cm4gIHRoaXMucGVybWlzc2lvblR5cGUgPT09ICdhcHByb3ZlJztcclxufVxyXG5cclxuLy8gVGFuZ28gYWNjdXJhY3kgb25seSBmb3IgdGFuZ28gdXNlcnNcclxuZ2V0IHNob3dUYW5nb0FjY3VyYWN5KCk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiB0aGlzLmlzVGFuZ287XHJcbn1cclxuc3RhdHVzRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbmlzU3RhdHVzU2VsZWN0ZWQoc3RhdHVzOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICBjb25zdCBzZWxlY3RlZDogc3RyaW5nW10gPSB0aGlzLmZpbHRlckZvcm0udmFsdWUuc3RhdHVzIHx8IFtdO1xyXG4gIHJldHVybiBzZWxlY3RlZC5pbmNsdWRlcyhzdGF0dXMpO1xyXG59XHJcblxyXG5vblN0YXR1c0NoYW5nZShldmVudDogRXZlbnQsIHN0YXR1czogc3RyaW5nKSB7XHJcbiAgY29uc3QgY2hlY2tib3ggPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICBjb25zdCBzZWxlY3RlZDogc3RyaW5nW10gPSB0aGlzLmZpbHRlckZvcm0udmFsdWUuc3RhdHVzIHx8IFtdO1xyXG4gIGxldCBuZXh0OiBzdHJpbmdbXTtcclxuXHJcbiAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcclxuICAgIG5leHQgPSBzZWxlY3RlZC5pbmNsdWRlcyhzdGF0dXMpID8gc2VsZWN0ZWQgOiBbLi4uc2VsZWN0ZWQsIHN0YXR1c107XHJcbiAgfSBlbHNlIHtcclxuICAgIG5leHQgPSBzZWxlY3RlZC5maWx0ZXIocyA9PiBzICE9PSBzdGF0dXMpO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5maWx0ZXJGb3JtLnBhdGNoVmFsdWUoeyBzdGF0dXM6IG5leHQgfSk7XHJcbn1cclxuXHJcbnRvZ2dsZVN0YXR1c0Ryb3Bkb3duKGV2ZW50PzogTW91c2VFdmVudCkge1xyXG4gIGlmIChldmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIGF2b2lkIGRvY3VtZW50IGNsaWNrIGNsb3NpbmcgaXRcclxuICB9XHJcbiAgdGhpcy5zdGF0dXNEcm9wZG93bk9wZW4gPSAhdGhpcy5zdGF0dXNEcm9wZG93bk9wZW47XHJcbn1cclxuXHJcbi8vIEFyZSBhbGwgc3RhdHVzZXMgY3VycmVudGx5IHNlbGVjdGVkP1xyXG5hcmVBbGxTdGF0dXNlc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gIGNvbnN0IHNlbGVjdGVkOiBzdHJpbmdbXSA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZS5zdGF0dXMgfHwgW107XHJcbiAgcmV0dXJuIHNlbGVjdGVkLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWQubGVuZ3RoID09PSB0aGlzLnN0YXR1c09wdGlvbnMubGVuZ3RoO1xyXG59XHJcblxyXG4vLyBIYW5kbGUgXCJTZWxlY3QgQWxsXCIgY2hlY2tib3ggY2hhbmdlXHJcbm9uU3RhdHVzU2VsZWN0QWxsQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xyXG4gIGNvbnN0IGNoZWNrYm94ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcblxyXG4gIGlmIChjaGVja2JveC5jaGVja2VkKSB7XHJcbiAgICAvLyBTZWxlY3QgZXZlcnkgc3RhdHVzXHJcbiAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZSh7IHN0YXR1czogWy4uLnRoaXMuc3RhdHVzT3B0aW9uc10gfSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIENsZWFyIGFsbFxyXG4gICAgdGhpcy5maWx0ZXJGb3JtLnBhdGNoVmFsdWUoeyBzdGF0dXM6IFtdIH0pO1xyXG4gIH1cclxufVxyXG5nZXQgc2VsZWN0ZWRTdGF0dXNlcygpOiBzdHJpbmdbXSB7XHJcbiAgcmV0dXJuIHRoaXMuZmlsdGVyRm9ybS52YWx1ZS5zdGF0dXMgfHwgW107XHJcbn1cclxuXHJcbiAgaXNCZXR3ZWVuKGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlckZvcm0uZ2V0KGNvbnRyb2xOYW1lKT8udmFsdWUgPT09ICdiZXR3ZWVuJztcclxuICB9XHJcbm5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICBpZiAoY2hhbmdlc1snY2xpZW50J10gfHwgY2hhbmdlc1sncGVybWlzc2lvblR5cGUnXSB8fCBjaGFuZ2VzWyd1c2VyVHlwZSddKSB7XHJcbiAgICB0aGlzLmxvYWRSZXZpZXdlckxpc3QoKTtcclxuICB9XHJcbn1cclxuLy8gZnVsbCB1c2VyIGxpc3QgeW91IGFscmVhZHkgaGF2ZVxyXG51c2VyTGlzdDogYW55W10gPSBbXTtcclxuXHJcblxyXG5yZXZpZXdlclNlYXJjaFRlcm06IHN0cmluZyA9ICcnO1xyXG5cclxuLy8g4pyFIHNpbXBsZSBjb21wdXRlZCBsaXN0IGZvciAqbmdGb3JcclxuZ2V0IGZpbHRlcmVkUmV2aWV3ZXJMaXN0KCk6IHsgZW1haWw6IHN0cmluZzsgbmFtZT86IHN0cmluZyB9W10ge1xyXG4gIGNvbnN0IHRlcm0gPSAodGhpcy5yZXZpZXdlclNlYXJjaFRlcm0gfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICBpZiAoIXRlcm0pIHtcclxuICAgIHJldHVybiB0aGlzLnVzZXJMaXN0O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRoaXMudXNlckxpc3QuZmlsdGVyKHUgPT4ge1xyXG4gICAgY29uc3QgZW1haWwgPSAodS5lbWFpbCB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IG5hbWUgPSAodS5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIGVtYWlsLmluY2x1ZGVzKHRlcm0pIHx8IG5hbWUuaW5jbHVkZXModGVybSk7XHJcbiAgfSk7XHJcbn1cclxuYXBwcm92ZXJTZWFyY2hUZXJtOmFueTtcclxuZ2V0IGZpbHRlcmVkQXBwcm92ZXJMaXN0KCk6IGFueVtdIHtcclxuICBjb25zdCB0ZXJtID0gKHRoaXMuYXBwcm92ZXJTZWFyY2hUZXJtIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICBpZiAoIXRlcm0pIHtcclxuICAgIHJldHVybiB0aGlzLnVzZXJMaXN0O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRoaXMudXNlckxpc3QuZmlsdGVyKCh1OiBhbnkpID0+IHtcclxuICAgIGNvbnN0IGVtYWlsID0gKHUuZW1haWwgfHwgJycpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBuYW1lID0gKHUubmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiBlbWFpbC5pbmNsdWRlcyh0ZXJtKSB8fCBuYW1lLmluY2x1ZGVzKHRlcm0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG5vbkFwcHJvdmVyU2VhcmNoKHZhbHVlOiBzdHJpbmcpIHtcclxuICB0aGlzLmFwcHJvdmVyU2VhcmNoVGVybSA9IHZhbHVlO1xyXG59XHJcbnByaXZhdGUgbG9hZFJldmlld2VyTGlzdCgpOiB2b2lkIHtcclxuICBpZiAoIXRoaXMuY2xpZW50KSB7XHJcbiAgICB0aGlzLnVzZXJMaXN0ID0gW107XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBsZXQgdHlwZTogc3RyaW5nO1xyXG5cclxuICBpZiAodGhpcy51c2VyVHlwZSA9PT0gJ3RhbmdvJykge1xyXG4gICAgdHlwZSA9ICd0YW5nbyc7ICAgIC8vIG9yICdhbGwnXHJcbiAgfSBlbHNlIGlmICh0aGlzLnBlcm1pc3Npb25UeXBlID09PSAncmV2aWV3Jykge1xyXG4gICAgdHlwZSA9ICdyZXZpZXcnO1xyXG4gIH0gZWxzZSBpZiAodGhpcy5wZXJtaXNzaW9uVHlwZSA9PT0gJ2FwcHJvdmUnKSB7XHJcbiAgICB0eXBlID0gJ2FwcHJvdmUnO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB0aGlzLnVzZXJMaXN0ID0gW107XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICB0aGlzLnNlcnZpY2UuZ2V0UmV2aWV3ZXJBcGkodGhpcy5jbGllbnQsIHR5cGUpLnN1YnNjcmliZSh7XHJcbiAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgdGhpcy51c2VyTGlzdCA9IHJlcy5kYXRhO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXNlckxpc3QgPSBbXTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgIHRoaXMudXNlckxpc3QgPSBbXTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuLy8gb3BlbiBmbGFnc1xyXG5yZXZpZXdlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG5hcHByb3ZlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG5cclxuLy8gY29udmVuaWVuY2UgZ2V0dGVyc1xyXG5nZXQgc2VsZWN0ZWRSZXZpZXdlZEJ5KCk6IHN0cmluZ1tdIHtcclxuICByZXR1cm4gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLnJldmlld2VkQnkgfHwgW107XHJcbn1cclxuXHJcbmdldCBzZWxlY3RlZEFwcHJvdmVkQnkoKTogc3RyaW5nW10ge1xyXG4gIHJldHVybiB0aGlzLmZpbHRlckZvcm0udmFsdWUuYXBwcm92ZWRCeSB8fCBbXTtcclxufVxyXG5cclxuLy8gLS0tIFJldmlld2VkIEJ5IGhlbHBlcnMgLS0tXHJcblxyXG50b2dnbGVSZXZpZXdlckRyb3Bkb3duKGV2ZW50PzogTW91c2VFdmVudCkge1xyXG4gIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgdGhpcy5yZXZpZXdlckRyb3Bkb3duT3BlbiA9ICF0aGlzLnJldmlld2VyRHJvcGRvd25PcGVuO1xyXG59XHJcblxyXG5pc1Jldmlld2VyU2VsZWN0ZWQoZW1haWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiB0aGlzLnNlbGVjdGVkUmV2aWV3ZWRCeS5pbmNsdWRlcyhlbWFpbCk7XHJcbn1cclxuXHJcbm9uUmV2aWV3ZXJDaGFuZ2UoZXZlbnQ6IEV2ZW50LCBlbWFpbDogc3RyaW5nKSB7XHJcbiAgY29uc3QgY2hlY2tib3ggPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICBjb25zdCBzZWxlY3RlZCA9IFsuLi50aGlzLnNlbGVjdGVkUmV2aWV3ZWRCeV07XHJcblxyXG4gIGlmIChjaGVja2JveC5jaGVja2VkKSB7XHJcbiAgICBpZiAoIXNlbGVjdGVkLmluY2x1ZGVzKGVtYWlsKSkgc2VsZWN0ZWQucHVzaChlbWFpbCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGkgPSBzZWxlY3RlZC5pbmRleE9mKGVtYWlsKTtcclxuICAgIGlmIChpID49IDApIHNlbGVjdGVkLnNwbGljZShpLCAxKTtcclxuICB9XHJcblxyXG4gIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKHsgcmV2aWV3ZWRCeTogc2VsZWN0ZWQgfSk7XHJcbn1cclxuXHJcbmFyZUFsbFJldmlld2Vyc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiAoXHJcbiAgICB0aGlzLnVzZXJMaXN0Lmxlbmd0aCA+IDAgJiZcclxuICAgIHRoaXMuc2VsZWN0ZWRSZXZpZXdlZEJ5Lmxlbmd0aCA9PT0gdGhpcy51c2VyTGlzdC5sZW5ndGhcclxuICApO1xyXG59XHJcblxyXG5vblJldmlld2VyU2VsZWN0QWxsKGV2ZW50OiBFdmVudCkge1xyXG4gIGNvbnN0IGNoZWNrYm94ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcblxyXG4gIGlmIChjaGVja2JveC5jaGVja2VkKSB7XHJcbiAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgIHJldmlld2VkQnk6IHRoaXMudXNlckxpc3QubWFwKCh1OmFueSkgPT4gdS5lbWFpbCksXHJcbiAgICB9KTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5maWx0ZXJGb3JtLnBhdGNoVmFsdWUoeyByZXZpZXdlZEJ5OiBbXSB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8vIC0tLSBBcHByb3ZlZCBCeSBoZWxwZXJzIC0tLVxyXG5cclxudG9nZ2xlQXBwcm92ZXJEcm9wZG93bihldmVudD86IE1vdXNlRXZlbnQpIHtcclxuICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIHRoaXMuYXBwcm92ZXJEcm9wZG93bk9wZW4gPSAhdGhpcy5hcHByb3ZlckRyb3Bkb3duT3BlbjtcclxufVxyXG5cclxuaXNBcHByb3ZlclNlbGVjdGVkKGVtYWlsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICByZXR1cm4gdGhpcy5zZWxlY3RlZEFwcHJvdmVkQnkuaW5jbHVkZXMoZW1haWwpO1xyXG59XHJcblxyXG5vbkFwcHJvdmVyQ2hhbmdlKGV2ZW50OiBFdmVudCwgZW1haWw6IHN0cmluZykge1xyXG4gIGNvbnN0IGNoZWNrYm94ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgY29uc3Qgc2VsZWN0ZWQgPSBbLi4udGhpcy5zZWxlY3RlZEFwcHJvdmVkQnldO1xyXG5cclxuICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xyXG4gICAgaWYgKCFzZWxlY3RlZC5pbmNsdWRlcyhlbWFpbCkpIHNlbGVjdGVkLnB1c2goZW1haWwpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBpID0gc2VsZWN0ZWQuaW5kZXhPZihlbWFpbCk7XHJcbiAgICBpZiAoaSA+PSAwKSBzZWxlY3RlZC5zcGxpY2UoaSwgMSk7XHJcbiAgfVxyXG5cclxuICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZSh7IGFwcHJvdmVkQnk6IHNlbGVjdGVkIH0pO1xyXG59XHJcblxyXG5hcmVBbGxBcHByb3ZlcnNTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICByZXR1cm4gKFxyXG4gICAgdGhpcy51c2VyTGlzdC5sZW5ndGggPiAwICYmXHJcbiAgICB0aGlzLnNlbGVjdGVkQXBwcm92ZWRCeS5sZW5ndGggPT09IHRoaXMudXNlckxpc3QubGVuZ3RoXHJcbiAgKTtcclxufVxyXG5cclxub25BcHByb3ZlclNlbGVjdEFsbChldmVudDogRXZlbnQpIHtcclxuICBjb25zdCBjaGVja2JveCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxuICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xyXG4gICAgdGhpcy5maWx0ZXJGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICBhcHByb3ZlZEJ5OiB0aGlzLnVzZXJMaXN0Lm1hcCgodTphbnkpID0+IHUuZW1haWwpLFxyXG4gICAgfSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKHsgYXBwcm92ZWRCeTogW10gfSk7XHJcbiAgfVxyXG59XHJcblxyXG5vblJlc2V0KCk6IHZvaWQge1xyXG4gIHRoaXMuZmlsdGVyRm9ybS5yZXNldCh7XHJcbiAgICBzdGF0dXM6IFtdLFxyXG4gICAgcmV2aWV3ZXJDb25kaXRpb246IG51bGwsXHJcbiAgICByZXZpZXdlckZyb206IG51bGwsXHJcbiAgICByZXZpZXdlclRvOiBudWxsLFxyXG5cclxuICAgIGFwcHJvdmVyQ29uZGl0aW9uOiBudWxsLFxyXG4gICAgYXBwcm92ZXJGcm9tOiBudWxsLFxyXG4gICAgYXBwcm92ZXJUbzogbnVsbCxcclxuXHJcbiAgICB0YW5nb0NvbmRpdGlvbjogbnVsbCxcclxuICAgIHRhbmdvRnJvbTogbnVsbCxcclxuICAgIHRhbmdvVG86IG51bGwsXHJcblxyXG4gICAgcmV2aWV3ZWRCeTogW10sXHJcbiAgICBhcHByb3ZlZEJ5OiBbXVxyXG4gIH0pO1xyXG5cclxuICAvLyAy77iP4oOjIFJlc2V0IHNlYXJjaCB0ZXJtc1xyXG4gIHRoaXMucmV2aWV3ZXJTZWFyY2hUZXJtID0gJyc7XHJcbiAgdGhpcy5hcHByb3ZlclNlYXJjaFRlcm0gPSAnJztcclxuXHJcbiAgLy8gM++4j+KDoyBCdWlsZCBlbXB0eSBwYXlsb2FkIHRvIHNlbmQgYmFja1xyXG4gIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICBmaWx0ZXJCeVN0YXR1czogW10sXHJcbiAgICBmaWx0ZXJCeVJldmlld2VyOiBudWxsLFxyXG4gICAgZmlsdGVyQnlBcHByb3ZlcjogbnVsbCxcclxuICAgIGZpbHRlckJ5VGFuZ286IG51bGwsXHJcbiAgICBmaWx0ZXJCeVJldmlld2VkQnk6IFtdLFxyXG4gICAgZmlsZXRlckJ5QXBwcm92ZWRCeTogW11cclxuICB9O1xyXG5cclxuICAvLyA077iP4oOjIEVtaXQgdGhlIG5vdy1lbXB0eSBmaWx0ZXIgcmVzdWx0XHJcbiAgdGhpcy5hcHBseS5lbWl0KHBheWxvYWQpO1xyXG5cclxuICAvLyA177iP4oOjIENsb3NlIHRoZSBmaWx0ZXIgcGFuZWxcclxuICB0aGlzLmNsb3NlKCk7XHJcbn1cclxuXHJcbnByaXZhdGUgbWFwQWNjdXJhY3koXHJcbiAgY29uZGl0aW9uOiBDb25kaXRpb24gfCBudWxsLFxyXG4gIGZyb206IG51bWJlciB8IG51bGwsXHJcbiAgdG86IG51bWJlciB8IG51bGxcclxuKTogc3RyaW5nIHwgbnVsbCB7XHJcblxyXG4gIC8vIG5vdGhpbmcgc2VsZWN0ZWRcclxuICBpZiAoIWNvbmRpdGlvbiB8fCBmcm9tID09IG51bGwpIHJldHVybiBudWxsO1xyXG5cclxuICAvLyBcImJldHdlZW5cIiDihpIgXCI5MCB0byAxMDBcIlxyXG4gIGlmIChjb25kaXRpb24gPT09ICdiZXR3ZWVuJykge1xyXG4gICAgaWYgKHRvID09IG51bGwpIHJldHVybiBudWxsO1xyXG4gICAgcmV0dXJuIGAke2Zyb219IHRvICR7dG99YDtcclxuICB9XHJcblxyXG4gIC8vIG90aGVyIGNvbmRpdGlvbnMgKGd0LCBsdCwgZ3RlLCBsdGUpXHJcbiAgY29uc3Qgb3BNYXA6IFJlY29yZDxDb25kaXRpb24sIHN0cmluZz4gPSB7XHJcbiAgICBndDogJz4nLFxyXG4gICAgbHQ6ICc8JyxcclxuICAgIGd0ZTogJz49JyxcclxuICAgIGx0ZTogJzw9JyxcclxuICAgIGJldHdlZW46ICcnLCAvLyBhbHJlYWR5IGhhbmRsZWQgYWJvdmVcclxuICB9O1xyXG5cclxuICByZXR1cm4gYCR7b3BNYXBbY29uZGl0aW9uXX0gJHtmcm9tfWA7ICAvLyBlLmcuIFwiPj0gOTBcIlxyXG59XHJcblxyXG4gIG9uQXBwbHkoKTogdm9pZCB7XHJcblxyXG4gICBjb25zdCByYXcgPSB0aGlzLmZpbHRlckZvcm0udmFsdWU7XHJcblxyXG4gIGNvbnN0IHJldmlld2VyU3RyID0gdGhpcy5tYXBBY2N1cmFjeShyYXcucmV2aWV3ZXJDb25kaXRpb24sIHJhdy5yZXZpZXdlckZyb20sIHJhdy5yZXZpZXdlclRvKTtcclxuICBjb25zdCBhcHByb3ZlclN0ciA9IHRoaXMubWFwQWNjdXJhY3kocmF3LmFwcHJvdmVyQ29uZGl0aW9uLCByYXcuYXBwcm92ZXJGcm9tLCByYXcuYXBwcm92ZXJUbyk7XHJcbiAgY29uc3QgdGFuZ29TdHIgICAgPSB0aGlzLm1hcEFjY3VyYWN5KHJhdy50YW5nb0NvbmRpdGlvbiwgcmF3LnRhbmdvRnJvbSwgcmF3LnRhbmdvVG8pO1xyXG5cclxuICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgZmlsdGVyQnlTdGF0dXM6IHJhdy5zdGF0dXMgfHwgW10sXHJcblxyXG4gICAgZmlsdGVyQnlSZXZpZXdlcjogcmV2aWV3ZXJTdHIsXHJcbiAgICBmaWx0ZXJCeUFwcHJvdmVyOiBhcHByb3ZlclN0cixcclxuICAgIGZpbHRlckJ5VGFuZ286IHRhbmdvU3RyLFxyXG5cclxuICAgIGZpbHRlckJ5UmV2aWV3ZWRCeTogcmF3LnJldmlld2VkQnkgfHwgW10sICAgICAgICBcclxuICAgIGZpbGV0ZXJCeUFwcHJvdmVkQnk6IHJhdy5hcHByb3ZlZEJ5IHx8IFtdLCAgICAgICAgXHJcbiAgfTtcclxuICB0aGlzLmFwcGx5LmVtaXQocGF5bG9hZCk7XHJcbiAgdGhpcy5jbG9zZSgpO1xyXG4gICAgdGhpcy5zaG93UGFuZWwgPSBmYWxzZTtcclxuICB9XHJcblxyXG5cclxufVxyXG4iLCI8IS0tIHRpY2tldC1maWx0ZXItcGFuZWwuY29tcG9uZW50Lmh0bWwgLS0+XHJcbjxkaXYgY2xhc3M9XCJmaWx0ZXItd3JhcHBlclwiICpuZ0lmPVwiaXNPcGVuXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZpbHRlci1jYXJkXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWhlYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5GaWx0ZXIgT3B0aW9uczwvZGl2PlxyXG4gICAgICA8IS0tIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgKGNsaWNrKT1cImNsb3NlKClcIj7inJU8L2J1dHRvbj4gLS0+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIj5cclxuICAgICAgPCEtLSBTdGF0dXMgLS0+XHJcbjxkaXYgY2xhc3M9XCJtYi0zIHBvc2l0aW9uLXJlbGF0aXZlXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5TdGF0dXM8L2xhYmVsPlxyXG5cclxuICA8IS0tIEhlYWRlciAvIHRyaWdnZXIgLS0+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJzdGF0dXMtc2VsZWN0IGJvcmRlciByb3VuZGVkIHB4LTMgcHktMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgIChjbGljayk9XCJ0b2dnbGVTdGF0dXNEcm9wZG93bigkZXZlbnQpXCJcclxuICA+XHJcbiAgICA8c3BhbiAqbmdJZj1cIiFzZWxlY3RlZFN0YXR1c2VzLmxlbmd0aFwiPlNlbGVjdDwvc3Bhbj5cclxuXHJcbiAgICA8c3BhbiAqbmdJZj1cInNlbGVjdGVkU3RhdHVzZXMubGVuZ3RoID09PSAxXCI+XHJcbiAgICAgIHt7IHNlbGVjdGVkU3RhdHVzZXNbMF0gfX1cclxuICAgIDwvc3Bhbj5cclxuXHJcbiAgICA8c3BhbiAqbmdJZj1cInNlbGVjdGVkU3RhdHVzZXMubGVuZ3RoID4gMVwiIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICA8c3Bhbj57eyBzZWxlY3RlZFN0YXR1c2VzWzBdIH19PC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIG1zLTJcIj5cclxuICAgICAgICAre3sgc2VsZWN0ZWRTdGF0dXNlcy5sZW5ndGggLSAxIH19XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvc3Bhbj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gRFJPUERPV04gUEFORUwgKE9WRVJMQVkpIC0tPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwic3RhdHVzLWRyb3Bkb3duIHBvc2l0aW9uLWFic29sdXRlIHctMTAwIG10LTEgYm9yZGVyIHJvdW5kZWQgcC0xIGJnLXdoaXRlXCJcclxuICAgIHN0eWxlPVwiei1pbmRleDogMTAwMDsgbWF4LWhlaWdodDogMjIwcHg7IG92ZXJmbG93LXk6IGF1dG87XCJcclxuICAgICpuZ0lmPVwic3RhdHVzRHJvcGRvd25PcGVuXCJcclxuICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gID5cclxuICAgIDwhLS0gU2VsZWN0IEFsbCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIHB4LTAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XHJcbiAgICAgIDxpbnB1dFxyXG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IFwiXHJcbiAgICAgICAgaWQ9XCJzdGF0dXMtc2VsZWN0LWFsbFwiXHJcbiAgICAgICAgW2NoZWNrZWRdPVwiYXJlQWxsU3RhdHVzZXNTZWxlY3RlZCgpXCJcclxuICAgICAgICAoY2hhbmdlKT1cIm9uU3RhdHVzU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAvPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIHRleHQtZGFyayBtcy0yXCIgZm9yPVwic3RhdHVzLXNlbGVjdC1hbGxcIj5cclxuICAgICAgICBTZWxlY3QgQWxsXHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPCEtLSBPcHRpb25zIC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImZvcm0tY2hlY2sgcHgtMCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTFcIlxyXG4gICAgICAqbmdGb3I9XCJsZXQgcyBvZiBzdGF0dXNPcHRpb25zXCJcclxuICAgID5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgXCJcclxuICAgICAgICBbaWRdPVwiJ3N0YXR1cy0nICsgc1wiXHJcbiAgICAgICAgW2NoZWNrZWRdPVwiaXNTdGF0dXNTZWxlY3RlZChzKVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJvblN0YXR1c0NoYW5nZSgkZXZlbnQsIHMpXCJcclxuICAgICAgLz5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCB0ZXh0LWRhcmsgbXMtMlwiIFtmb3JdPVwiJ3N0YXR1cy0nICsgc1wiPlxyXG4gICAgICAgIHt7IHMgfX1cclxuICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcblxyXG5cclxuICAgICAgPCEtLSBSZXZpZXdlciBhY2N1cmFjeSAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdJZj1cInNob3dSZXZpZXdlckFjY3VyYWN5XCI+XHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlJldmlld2VyIGFjY3VyYWN5ICglKSBieSBjb25kaXRpb248L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cclxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCB3LTEwMFwiIGZvcm1Db250cm9sTmFtZT1cInJldmlld2VyQ29uZGl0aW9uXCI+XHJcbiAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiPlNlbGVjdDwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjIG9mIGNvbmRpdGlvbk9wdGlvbnNcIiBbbmdWYWx1ZV09XCJjLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAge3sgYy5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG5cclxuICAgICAgICAgIDwhLS0gb25lIG9yIHR3byBpbnB1dHMgLS0+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNCZXR3ZWVuKCdyZXZpZXdlckNvbmRpdGlvbicpOyBlbHNlIHNpbmdsZVJldmlld2VyXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgIG1pbj1cIjFcIlxyXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJldmlld2VyRnJvbVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGcm9tXCIgKGlucHV0KT1cImxpbWl0VmFsdWUoJGV2ZW50LCAncmV2aWV3ZXJGcm9tJylcIiAvPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICBtaW49XCIxXCJcclxuICAgICAgICAgICAgICBtYXg9XCIxMDBcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZXZpZXdlclRvXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlRvXCIgKGlucHV0KT1cImxpbWl0VmFsdWUoJGV2ZW50LCAncmV2aWV3ZXJUbycpXCIgLz5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGVSZXZpZXdlcj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgbWluPVwiMVwiXHJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmV2aWV3ZXJGcm9tXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjEgdG8gMTAwJVwiIChpbnB1dCk9XCJsaW1pdFZhbHVlKCRldmVudCwgJ3Jldmlld2VyRnJvbScpXCIgLz5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBBcHByb3ZlciBhY2N1cmFjeSAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdJZj1cInNob3dBcHByb3ZlckFjY3VyYWN5XCI+XHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFwcHJvdmVyIGFjY3VyYWN5ICglKSBieSBjb25kaXRpb248L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cclxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCB3LTEwMFwiIGZvcm1Db250cm9sTmFtZT1cImFwcHJvdmVyQ29uZGl0aW9uXCI+XHJcbiAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiPlNlbGVjdDwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjIG9mIGNvbmRpdGlvbk9wdGlvbnNcIiBbbmdWYWx1ZV09XCJjLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAge3sgYy5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0JldHdlZW4oJ2FwcHJvdmVyQ29uZGl0aW9uJyk7IGVsc2Ugc2luZ2xlQXBwcm92ZXJcIj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgbWluPVwiMVwiXHJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYXBwcm92ZXJGcm9tXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZyb21cIiBcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwibGltaXRWYWx1ZSgkZXZlbnQsICdhcHByb3ZlckZyb20nKVwiLz5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgbWluPVwiMVwiXHJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYXBwcm92ZXJUb1wiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUb1wiIChpbnB1dCk9XCJsaW1pdFZhbHVlKCRldmVudCwgJ2FwcHJvdmVyVG8nKVwiIC8+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlQXBwcm92ZXI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgIG1pbj1cIjFcIlxyXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFwcHJvdmVyRnJvbVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIxIHRvIDEwMCVcIiAoaW5wdXQpPVwibGltaXRWYWx1ZSgkZXZlbnQsICdhcHByb3ZlckZyb20nKVwiIC8+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gVGFuZ28gYWNjdXJhY3kgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCIgKm5nSWY9XCJzaG93VGFuZ29BY2N1cmFjeVwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5UYW5nbyBhY2N1cmFjeSAoJSkgYnkgY29uZGl0aW9uPC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3Qgdy0xMDBcIiBmb3JtQ29udHJvbE5hbWU9XCJ0YW5nb0NvbmRpdGlvblwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj5TZWxlY3Q8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYyBvZiBjb25kaXRpb25PcHRpb25zXCIgW25nVmFsdWVdPVwiYy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgIHt7IGMubGFiZWwgfX1cclxuICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICA8L3NlbGVjdD5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNCZXR3ZWVuKCd0YW5nb0NvbmRpdGlvbicpOyBlbHNlIHNpbmdsZVRhbmdvXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgIG1pbj1cIjFcIlxyXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRhbmdvRnJvbVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGcm9tXCIgKGlucHV0KT1cImxpbWl0VmFsdWUoJGV2ZW50LCAndGFuZ29Gcm9tJylcIiAvPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICBtaW49XCIxXCJcclxuICAgICAgICAgICAgICBtYXg9XCIxMDBcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0YW5nb1RvXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlRvXCIgKGlucHV0KT1cImxpbWl0VmFsdWUoJGV2ZW50LCAndGFuZ29UbycpXCIgLz5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGVUYW5nbz5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgbWluPVwiMVwiXHJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGFuZ29Gcm9tXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjEgdG8gMTAwJVwiIChpbnB1dCk9XCJsaW1pdFZhbHVlKCRldmVudCwgJ3RhbmdvRnJvbScpXCIgLz5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG48ZGl2XHJcbiAgY2xhc3M9XCJtYi0zIHBvc2l0aW9uLXJlbGF0aXZlXCJcclxuICAqbmdJZj1cInNob3dSZXZpZXdlZEJ5XCJcclxuICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuPlxyXG4gIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5SZXZpZXdlZCBieTwvbGFiZWw+XHJcblxyXG4gIDwhLS0gVHJpZ2dlciAvIGRpc3BsYXkgLS0+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJib3JkZXIgcm91bmRlZCBweC0zIHB5LTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAoY2xpY2spPVwidG9nZ2xlUmV2aWV3ZXJEcm9wZG93bigkZXZlbnQpXCJcclxuICA+XHJcbiAgICA8IS0tIDAgc2VsZWN0ZWQgLS0+XHJcbiAgICA8c3BhbiAqbmdJZj1cIiFzZWxlY3RlZFJldmlld2VkQnkubGVuZ3RoXCI+XHJcbiAgICAgIFNlbGVjdFxyXG4gICAgPC9zcGFuPlxyXG5cclxuICAgIDwhLS0gMSBzZWxlY3RlZCAtLT5cclxuICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0ZWRSZXZpZXdlZEJ5Lmxlbmd0aCA9PT0gMVwiPlxyXG4gICAgICB7eyBzZWxlY3RlZFJldmlld2VkQnlbMF0gfX1cclxuICAgIDwvc3Bhbj5cclxuXHJcbiAgICA8IS0tID4xIHNlbGVjdGVkIC0tPlxyXG4gICAgPHNwYW5cclxuICAgICAgKm5nSWY9XCJzZWxlY3RlZFJldmlld2VkQnkubGVuZ3RoID4gMVwiXHJcbiAgICAgIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICA+XHJcbiAgICAgIDxzcGFuPnt7IHNlbGVjdGVkUmV2aWV3ZWRCeVswXSB9fTwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBtcy0yXCI+XHJcbiAgICAgICAgK3t7IHNlbGVjdGVkUmV2aWV3ZWRCeS5sZW5ndGggLSAxIH19XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvc3Bhbj5cclxuICA8L2Rpdj5cclxuXHJcbjxkaXZcclxuICAqbmdJZj1cInJldmlld2VyRHJvcGRvd25PcGVuXCJcclxuICBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIHctMTAwIGJvcmRlciByb3VuZGVkIGJnLXdoaXRlIHAtMSBtdC0xXCJcclxuICBzdHlsZT1cInotaW5kZXg6IDEwMDA7IG1heC1oZWlnaHQ6IDIyMHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiXHJcbiAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbj5cclxuXHJcbiAgPCEtLSDwn5SNIFNlYXJjaCBib3ggLS0+XHJcbiAgPGRpdiBjbGFzcz1cIm1iLTIgcHgtMFwiPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCJcclxuICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYnkgZW1haWxcIlxyXG4gICAgICBbKG5nTW9kZWwpXT1cInJldmlld2VyU2VhcmNoVGVybVwiXHJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBTZWxlY3QgQWxsIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIHB4LTAgbWItMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8aW5wdXRcclxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgaWQ9XCJyZXZpZXdlci1hbGxcIlxyXG4gICAgICBbY2hlY2tlZF09XCJhcmVBbGxSZXZpZXdlcnNTZWxlY3RlZCgpXCJcclxuICAgICAgKGNoYW5nZSk9XCJvblJldmlld2VyU2VsZWN0QWxsKCRldmVudClcIlxyXG4gICAgLz5cclxuICAgIDxsYWJlbCBmb3I9XCJyZXZpZXdlci1hbGxcIiBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgdGV4dC1kYXJrIG1zLTJcIj5cclxuICAgICAgU2VsZWN0IEFsbFxyXG4gICAgPC9sYWJlbD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBPcHRpb25zIOKAkyBub3cgdXNlIGdldHRlciBmaWx0ZXJlZFJldmlld2VyTGlzdCAtLT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImZvcm0tY2hlY2sgbWItMSBweC0wIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgKm5nRm9yPVwibGV0IHUgb2YgZmlsdGVyZWRSZXZpZXdlckxpc3RcIlxyXG4gID5cclxuICAgIDxpbnB1dFxyXG4gICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIlxyXG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICBbaWRdPVwiJ3Jldi0nICsgdS5lbWFpbFwiXHJcbiAgICAgIFtjaGVja2VkXT1cImlzUmV2aWV3ZXJTZWxlY3RlZCh1LmVtYWlsKVwiXHJcbiAgICAgIChjaGFuZ2UpPVwib25SZXZpZXdlckNoYW5nZSgkZXZlbnQsIHUuZW1haWwpXCJcclxuICAgIC8+XHJcbiAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIHRleHQtZGFyayBtcy0yXCIgW2Zvcl09XCIncmV2LScgKyB1LmVtYWlsXCI+XHJcbiAgICAgIHt7IHUuZW1haWwgfX1cclxuICAgIDwvbGFiZWw+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjwvZGl2PlxyXG5cclxuXHJcbiAgICAgIDwhLS0gQXBwcm92ZWQgQnkgLS0+XHJcbjxkaXZcclxuICBjbGFzcz1cIm1iLTMgcG9zaXRpb24tcmVsYXRpdmVcIlxyXG4gICpuZ0lmPVwic2hvd0FwcHJvdmVkQnlcIlxyXG4gIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4+XHJcbiAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFwcHJvdmVkIGJ5PC9sYWJlbD5cclxuXHJcbiAgPCEtLSBUcmlnZ2VyIC8gZGlzcGxheSAtLT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cImJvcmRlciByb3VuZGVkIHB4LTMgcHktMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgIChjbGljayk9XCJ0b2dnbGVBcHByb3ZlckRyb3Bkb3duKCRldmVudClcIlxyXG4gID5cclxuICAgIDwhLS0gMCBzZWxlY3RlZCAtLT5cclxuICAgIDxzcGFuICpuZ0lmPVwiIXNlbGVjdGVkQXBwcm92ZWRCeS5sZW5ndGhcIj5cclxuICAgICAgU2VsZWN0XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPCEtLSAxIHNlbGVjdGVkIC0tPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RlZEFwcHJvdmVkQnkubGVuZ3RoID09PSAxXCI+XHJcbiAgICAgIHt7IHNlbGVjdGVkQXBwcm92ZWRCeVswXSB9fVxyXG4gICAgPC9zcGFuPlxyXG5cclxuICAgIDwhLS0gPjEgc2VsZWN0ZWQgLS0+XHJcbiAgICA8c3BhblxyXG4gICAgICAqbmdJZj1cInNlbGVjdGVkQXBwcm92ZWRCeS5sZW5ndGggPiAxXCJcclxuICAgICAgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgID5cclxuICAgICAgPHNwYW4+e3sgc2VsZWN0ZWRBcHByb3ZlZEJ5WzBdIH19PC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIG1zLTJcIj5cclxuICAgICAgICAre3sgc2VsZWN0ZWRBcHByb3ZlZEJ5Lmxlbmd0aCAtIDEgfX1cclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9zcGFuPlxyXG5cclxuICA8L2Rpdj5cclxuPCEtLSBEcm9wZG93biBwYW5lbCAtLT5cclxuPGRpdlxyXG4gICpuZ0lmPVwiYXBwcm92ZXJEcm9wZG93bk9wZW5cIlxyXG4gIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgdy0xMDAgYm9yZGVyIHJvdW5kZWQgYmctd2hpdGUgcC0xIG10LTFcIlxyXG4gIHN0eWxlPVwiei1pbmRleDogMTAwMDsgbWF4LWhlaWdodDogMjIwcHg7IG92ZXJmbG93LXk6IGF1dG87XCJcclxuICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuPlxyXG5cclxuICA8IS0tIPCflI0gU2VhcmNoIGJveCAtLT5cclxuICA8IS0tIDxkaXYgY2xhc3M9XCJtYi0yIHB4LTBcIj5cclxuICAgIDxpbnB1dFxyXG4gICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiXHJcbiAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGJ5IGVtYWlsXCJcclxuICAgICAgW25nTW9kZWxdPVwiYXBwcm92ZXJTZWFyY2hUZXJtXCJcclxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25SZXZpZXdlclNlYXJjaCgkZXZlbnQpXCJcclxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAvPlxyXG4gIDwvZGl2PiAtLT5cclxuXHJcbiAgPCEtLSBTZWxlY3QgQWxsIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIHB4LTAgbWItMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8aW5wdXRcclxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgaWQ9XCJyZXZpZXdlci1hbGxcIlxyXG4gICAgICBbY2hlY2tlZF09XCJhcmVBbGxSZXZpZXdlcnNTZWxlY3RlZCgpXCJcclxuICAgICAgKGNoYW5nZSk9XCJvblJldmlld2VyU2VsZWN0QWxsKCRldmVudClcIlxyXG4gICAgLz5cclxuICAgIDxsYWJlbCBmb3I9XCJyZXZpZXdlci1hbGxcIiBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgdGV4dC1kYXJrIG1zLTJcIj5cclxuICAgICAgU2VsZWN0IEFsbFxyXG4gICAgPC9sYWJlbD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBPcHRpb25zICh1c2UgZmlsdGVyZWRSZXZpZXdlckxpc3QgaW5zdGVhZCBvZiB1c2VyTGlzdCkgLS0+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJmb3JtLWNoZWNrIG1iLTEgcHgtMCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICpuZ0Zvcj1cImxldCB1IG9mIGZpbHRlcmVkQXBwcm92ZXJMaXN0XCJcclxuICA+XHJcbiAgICA8aW5wdXRcclxuICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgW2lkXT1cIidyZXYtJyArIHUuZW1haWxcIlxyXG4gICAgICBbY2hlY2tlZF09XCJpc1Jldmlld2VyU2VsZWN0ZWQodS5lbWFpbClcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uUmV2aWV3ZXJDaGFuZ2UoJGV2ZW50LCB1LmVtYWlsKVwiXHJcbiAgICAvPlxyXG4gICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCB0ZXh0LWRhcmsgbXMtMlwiIFtmb3JdPVwiJ3Jldi0nICsgdS5lbWFpbFwiPlxyXG4gICAgICB7eyB1LmVtYWlsIH19XHJcbiAgICA8L2xhYmVsPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbiAgPCEtLSBEcm9wZG93biBwYW5lbCAtLT5cclxuXHJcbjwvZGl2PlxyXG5cclxuXHJcbiAgICAgIDwhLS0gRm9vdGVyIGJ1dHRvbnMgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gdy0xMDAgbXQtNFwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctNTAgbWUtMVwiIChjbGljayk9XCJvblJlc2V0KClcIj5cclxuICAgICAgICAgIFJlc2V0XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy01MCBtcy0xXCIgKGNsaWNrKT1cIm9uQXBwbHkoKVwiPlxyXG4gICAgICAgICAgQXBwbHlcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=