tango-app-ui-manage-tickets 3.7.0-beta.58 → 3.7.0-beta.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +37 -0
- package/ng-package.json +7 -0
- package/package.json +12 -25
- package/src/lib/components/add-csm-modal/add-csm-modal.component.html +32 -0
- package/src/lib/components/add-csm-modal/add-csm-modal.component.scss +14 -0
- package/src/lib/components/add-csm-modal/add-csm-modal.component.spec.ts +23 -0
- package/src/lib/components/add-csm-modal/add-csm-modal.component.ts +94 -0
- package/src/lib/components/audit-log/audit-log.component.html +1 -0
- package/src/lib/components/audit-log/audit-log.component.scss +0 -0
- package/src/lib/components/audit-log/audit-log.component.spec.ts +23 -0
- package/src/lib/components/audit-log/audit-log.component.ts +10 -0
- package/src/lib/components/audit-mapping-list/audit-mapping-list.component.html +234 -0
- package/src/lib/components/audit-mapping-list/audit-mapping-list.component.scss +186 -0
- package/src/lib/components/audit-mapping-list/audit-mapping-list.component.spec.ts +23 -0
- package/src/lib/components/audit-mapping-list/audit-mapping-list.component.ts +520 -0
- package/src/lib/components/audit-metrics/audit-metrics.component.html +345 -0
- package/src/lib/components/audit-metrics/audit-metrics.component.scss +34 -0
- package/src/lib/components/audit-metrics/audit-metrics.component.spec.ts +23 -0
- package/src/lib/components/audit-metrics/audit-metrics.component.ts +292 -0
- package/src/lib/components/audit-report-popup/audit-report-popup.component.html +111 -0
- package/src/lib/components/audit-report-popup/audit-report-popup.component.scss +101 -0
- package/src/lib/components/audit-report-popup/audit-report-popup.component.spec.ts +23 -0
- package/src/lib/components/audit-report-popup/audit-report-popup.component.ts +397 -0
- package/src/lib/components/audit-retag/audit-retag.component.html +129 -0
- package/src/lib/components/audit-retag/audit-retag.component.scss +146 -0
- package/src/lib/components/audit-retag/audit-retag.component.spec.ts +23 -0
- package/src/lib/components/audit-retag/audit-retag.component.ts +489 -0
- package/src/lib/components/comment-model/comment-model.component.html +24 -0
- package/src/lib/components/comment-model/comment-model.component.scss +20 -0
- package/src/lib/components/comment-model/comment-model.component.spec.ts +23 -0
- package/src/lib/components/comment-model/comment-model.component.ts +53 -0
- package/src/lib/components/count/count.component.html +54 -0
- package/src/lib/components/count/count.component.scss +14 -0
- package/src/lib/components/count/count.component.spec.ts +23 -0
- package/src/lib/components/count/count.component.ts +82 -0
- package/src/lib/components/custom-select/custom-select.component.html +134 -0
- package/src/lib/components/custom-select/custom-select.component.scss +204 -0
- package/src/lib/components/custom-select/custom-select.component.spec.ts +23 -0
- package/src/lib/components/custom-select/custom-select.component.ts +189 -0
- package/src/lib/components/filter-options/filter-options.component.html +51 -0
- package/src/lib/components/filter-options/filter-options.component.scss +102 -0
- package/src/lib/components/filter-options/filter-options.component.spec.ts +23 -0
- package/src/lib/components/filter-options/filter-options.component.ts +38 -0
- package/src/lib/components/footfall-dic/footfall-dic.component.html +1275 -0
- package/src/lib/components/footfall-dic/footfall-dic.component.scss +273 -0
- package/src/lib/components/footfall-dic/footfall-dic.component.spec.ts +23 -0
- package/src/lib/components/footfall-dic/footfall-dic.component.ts +1206 -0
- package/src/lib/components/footfall-dicview/footfall-dicview.component.html +1136 -0
- package/src/lib/components/footfall-dicview/footfall-dicview.component.scss +416 -0
- package/src/lib/components/footfall-dicview/footfall-dicview.component.spec.ts +23 -0
- package/src/lib/components/footfall-dicview/footfall-dicview.component.ts +1168 -0
- package/src/lib/components/footfall-popup/footfall-popup.component.html +61 -0
- package/src/lib/components/footfall-popup/footfall-popup.component.scss +20 -0
- package/src/lib/components/footfall-popup/footfall-popup.component.spec.ts +23 -0
- package/src/lib/components/footfall-popup/footfall-popup.component.ts +12 -0
- package/src/lib/components/group-select/group-select.component.html +44 -0
- package/src/lib/components/group-select/group-select.component.scss +144 -0
- package/src/lib/components/group-select/group-select.component.spec.ts +23 -0
- package/src/lib/components/group-select/group-select.component.ts +145 -0
- package/src/lib/components/re-trigger/re-trigger.component.html +53 -0
- package/src/lib/components/re-trigger/re-trigger.component.scss +16 -0
- package/src/lib/components/re-trigger/re-trigger.component.spec.ts +23 -0
- package/src/lib/components/re-trigger/re-trigger.component.ts +96 -0
- package/src/lib/components/reactive-select/reactive-select.component.html +18 -0
- package/src/lib/components/reactive-select/reactive-select.component.scss +52 -0
- package/src/lib/components/reactive-select/reactive-select.component.spec.ts +23 -0
- package/src/lib/components/reactive-select/reactive-select.component.ts +104 -0
- package/src/lib/components/remove-audit/remove-audit.component.html +38 -0
- package/src/lib/components/remove-audit/remove-audit.component.scss +27 -0
- package/src/lib/components/remove-audit/remove-audit.component.spec.ts +23 -0
- package/src/lib/components/remove-audit/remove-audit.component.ts +81 -0
- package/src/lib/components/start-audit/start-audit.component.html +174 -0
- package/src/lib/components/start-audit/start-audit.component.scss +185 -0
- package/src/lib/components/start-audit/start-audit.component.spec.ts +23 -0
- package/src/lib/components/start-audit/start-audit.component.ts +761 -0
- package/src/lib/components/tango-manage-tickets/tango-manage-tickets.component.html +43 -0
- package/src/lib/components/tango-manage-tickets/tango-manage-tickets.component.scss +35 -0
- package/src/lib/components/tango-manage-tickets/tango-manage-tickets.component.spec.ts +23 -0
- package/src/lib/components/tango-manage-tickets/tango-manage-tickets.component.ts +118 -0
- package/src/lib/components/ticket-filter-panel/ticket-filter-panel.component.html +386 -0
- package/src/lib/components/ticket-filter-panel/ticket-filter-panel.component.scss +87 -0
- package/src/lib/components/ticket-filter-panel/ticket-filter-panel.component.spec.ts +23 -0
- package/src/lib/components/ticket-filter-panel/ticket-filter-panel.component.ts +494 -0
- package/src/lib/components/ticket-footfall-new/ticket-footfall-new.component.html +4743 -0
- package/src/lib/components/ticket-footfall-new/ticket-footfall-new.component.scss +1208 -0
- package/src/lib/components/ticket-footfall-new/ticket-footfall-new.component.spec.ts +23 -0
- package/src/lib/components/ticket-footfall-new/ticket-footfall-new.component.ts +3351 -0
- package/src/lib/components/ticketclosepopup/ticketclosepopup.component.html +100 -0
- package/src/lib/components/ticketclosepopup/ticketclosepopup.component.scss +34 -0
- package/src/lib/components/ticketclosepopup/ticketclosepopup.component.spec.ts +23 -0
- package/src/lib/components/ticketclosepopup/ticketclosepopup.component.ts +48 -0
- package/src/lib/components/tickets/tickets.component.html +451 -0
- package/src/lib/components/tickets/tickets.component.scss +131 -0
- package/src/lib/components/tickets/tickets.component.spec.ts +23 -0
- package/src/lib/components/tickets/tickets.component.ts +809 -0
- package/src/lib/components/viewcategory/viewcategory.component.html +38 -0
- package/src/lib/components/viewcategory/viewcategory.component.scss +29 -0
- package/src/lib/components/viewcategory/viewcategory.component.spec.ts +23 -0
- package/src/lib/components/viewcategory/viewcategory.component.ts +79 -0
- package/src/lib/services/audit.service.spec.ts +16 -0
- package/src/lib/services/audit.service.ts +98 -0
- package/src/lib/services/excel.service.ts +48 -0
- package/src/lib/services/ticket.service.spec.ts +16 -0
- package/src/lib/services/ticket.service.ts +501 -0
- package/src/lib/services/timer.service.spec.ts +16 -0
- package/src/lib/services/timer.service.ts +92 -0
- package/src/lib/tango-manage-tickets-routing.module.ts +37 -0
- package/src/lib/tango-manage-tickets.module.ts +68 -0
- package/{public-api.d.ts → src/public-api.ts} +8 -2
- package/tsconfig.lib.json +14 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +14 -0
- package/esm2022/lib/components/add-csm-modal/add-csm-modal.component.mjs +0 -98
- package/esm2022/lib/components/audit-log/audit-log.component.mjs +0 -11
- package/esm2022/lib/components/audit-mapping-list/audit-mapping-list.component.mjs +0 -486
- package/esm2022/lib/components/audit-metrics/audit-metrics.component.mjs +0 -298
- package/esm2022/lib/components/audit-report-popup/audit-report-popup.component.mjs +0 -389
- package/esm2022/lib/components/audit-retag/audit-retag.component.mjs +0 -470
- package/esm2022/lib/components/comment-model/comment-model.component.mjs +0 -58
- package/esm2022/lib/components/count/count.component.mjs +0 -89
- package/esm2022/lib/components/custom-select/custom-select.component.mjs +0 -187
- package/esm2022/lib/components/filter-options/filter-options.component.mjs +0 -41
- package/esm2022/lib/components/footfall-dic/footfall-dic.component.mjs +0 -1061
- package/esm2022/lib/components/footfall-dicview/footfall-dicview.component.mjs +0 -1014
- package/esm2022/lib/components/footfall-popup/footfall-popup.component.mjs +0 -15
- package/esm2022/lib/components/group-select/group-select.component.mjs +0 -155
- package/esm2022/lib/components/re-trigger/re-trigger.component.mjs +0 -96
- package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +0 -108
- package/esm2022/lib/components/remove-audit/remove-audit.component.mjs +0 -81
- package/esm2022/lib/components/start-audit/start-audit.component.mjs +0 -761
- package/esm2022/lib/components/tango-manage-tickets/tango-manage-tickets.component.mjs +0 -131
- package/esm2022/lib/components/ticket-filter-panel/ticket-filter-panel.component.mjs +0 -435
- package/esm2022/lib/components/ticket-footfall-new/ticket-footfall-new.component.mjs +0 -2673
- package/esm2022/lib/components/ticketclosepopup/ticketclosepopup.component.mjs +0 -43
- package/esm2022/lib/components/tickets/tickets.component.mjs +0 -847
- package/esm2022/lib/components/viewcategory/viewcategory.component.mjs +0 -89
- package/esm2022/lib/services/audit.service.mjs +0 -88
- package/esm2022/lib/services/excel.service.mjs +0 -45
- package/esm2022/lib/services/ticket.service.mjs +0 -314
- package/esm2022/lib/services/timer.service.mjs +0 -84
- package/esm2022/lib/tango-manage-tickets-routing.module.mjs +0 -44
- package/esm2022/lib/tango-manage-tickets.module.mjs +0 -109
- package/esm2022/public-api.mjs +0 -6
- package/esm2022/tango-app-ui-manage-tickets.mjs +0 -5
- package/fesm2022/tango-app-ui-manage-tickets.mjs +0 -10083
- package/fesm2022/tango-app-ui-manage-tickets.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/components/add-csm-modal/add-csm-modal.component.d.ts +0 -30
- package/lib/components/audit-log/audit-log.component.d.ts +0 -5
- package/lib/components/audit-mapping-list/audit-mapping-list.component.d.ts +0 -73
- package/lib/components/audit-metrics/audit-metrics.component.d.ts +0 -59
- package/lib/components/audit-report-popup/audit-report-popup.component.d.ts +0 -52
- package/lib/components/audit-retag/audit-retag.component.d.ts +0 -59
- package/lib/components/comment-model/comment-model.component.d.ts +0 -17
- package/lib/components/count/count.component.d.ts +0 -23
- package/lib/components/custom-select/custom-select.component.d.ts +0 -35
- package/lib/components/filter-options/filter-options.component.d.ts +0 -15
- package/lib/components/footfall-dic/footfall-dic.component.d.ts +0 -143
- package/lib/components/footfall-dicview/footfall-dicview.component.d.ts +0 -132
- package/lib/components/footfall-popup/footfall-popup.component.d.ts +0 -8
- package/lib/components/group-select/group-select.component.d.ts +0 -33
- package/lib/components/re-trigger/re-trigger.component.d.ts +0 -32
- package/lib/components/reactive-select/reactive-select.component.d.ts +0 -32
- package/lib/components/remove-audit/remove-audit.component.d.ts +0 -16
- package/lib/components/start-audit/start-audit.component.d.ts +0 -86
- package/lib/components/tango-manage-tickets/tango-manage-tickets.component.d.ts +0 -28
- package/lib/components/ticket-filter-panel/ticket-filter-panel.component.d.ts +0 -79
- package/lib/components/ticket-footfall-new/ticket-footfall-new.component.d.ts +0 -286
- package/lib/components/ticketclosepopup/ticketclosepopup.component.d.ts +0 -15
- package/lib/components/tickets/tickets.component.d.ts +0 -88
- package/lib/components/viewcategory/viewcategory.component.d.ts +0 -16
- package/lib/services/audit.service.d.ts +0 -36
- package/lib/services/excel.service.d.ts +0 -10
- package/lib/services/ticket.service.d.ts +0 -85
- package/lib/services/timer.service.d.ts +0 -22
- package/lib/tango-manage-tickets-routing.module.d.ts +0 -7
- package/lib/tango-manage-tickets.module.d.ts +0 -38
|
@@ -1,435 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
|
|
2
|
-
import { Validators } from '@angular/forms';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/forms";
|
|
5
|
-
import * as i2 from "../../services/ticket.service";
|
|
6
|
-
import * as i3 from "@angular/common";
|
|
7
|
-
export class TicketFilterPanelComponent {
|
|
8
|
-
fb;
|
|
9
|
-
eRef;
|
|
10
|
-
service;
|
|
11
|
-
apply = new EventEmitter();
|
|
12
|
-
panelClosed = new EventEmitter(); // ✅ not `close`
|
|
13
|
-
permissionType = null;
|
|
14
|
-
userType = null; // e.g. 'tango' or others
|
|
15
|
-
client;
|
|
16
|
-
onDocumentClick(event) {
|
|
17
|
-
// 1️⃣ Always close dropdowns first
|
|
18
|
-
this.dropdownState.status = false;
|
|
19
|
-
this.dropdownState.reviewer = false;
|
|
20
|
-
this.dropdownState.approver = false;
|
|
21
|
-
// 2️⃣ If filter is not open → nothing to close
|
|
22
|
-
if (!this.isOpen)
|
|
23
|
-
return;
|
|
24
|
-
// 3️⃣ Check if clicked inside filter card
|
|
25
|
-
const clickedInside = this.eRef.nativeElement.contains(event.target);
|
|
26
|
-
// 4️⃣ If clicked OUTSIDE → close entire filter panel
|
|
27
|
-
if (!clickedInside) {
|
|
28
|
-
this.isOpen = false;
|
|
29
|
-
this.panelClosed.emit();
|
|
30
|
-
this.filterForm.reset({
|
|
31
|
-
status: [],
|
|
32
|
-
reviewerCondition: null,
|
|
33
|
-
reviewerFrom: null,
|
|
34
|
-
reviewerTo: null,
|
|
35
|
-
approverCondition: null,
|
|
36
|
-
approverFrom: null,
|
|
37
|
-
approverTo: null,
|
|
38
|
-
tangoCondition: null,
|
|
39
|
-
tangoFrom: null,
|
|
40
|
-
tangoTo: null,
|
|
41
|
-
reviewedBy: [],
|
|
42
|
-
approvedBy: []
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
isOpen = false; // controls visibility
|
|
47
|
-
// called from parent via #filterPanel.open()
|
|
48
|
-
open() {
|
|
49
|
-
this.isOpen = true;
|
|
50
|
-
}
|
|
51
|
-
// called from close button inside the panel
|
|
52
|
-
close() {
|
|
53
|
-
this.isOpen = false;
|
|
54
|
-
this.panelClosed.emit();
|
|
55
|
-
}
|
|
56
|
-
showPanel = false; // you can also control this from parent
|
|
57
|
-
statusOptions = [
|
|
58
|
-
'Open',
|
|
59
|
-
'In-Progress',
|
|
60
|
-
'Closed',
|
|
61
|
-
'Under Tango Review',
|
|
62
|
-
'Tango Review Done',
|
|
63
|
-
'Expired',
|
|
64
|
-
'Tango Expired',
|
|
65
|
-
];
|
|
66
|
-
conditionOptions = [
|
|
67
|
-
{ value: 'gt', label: '> Greater than' },
|
|
68
|
-
{ value: 'lt', label: '< Lesser than' },
|
|
69
|
-
{ value: 'gte', label: '>= Greater than or equal to' },
|
|
70
|
-
{ value: 'lte', label: '<= Lesser than or equal to' },
|
|
71
|
-
{ value: 'between', label: 'Between' },
|
|
72
|
-
];
|
|
73
|
-
filterForm;
|
|
74
|
-
constructor(fb, eRef, service) {
|
|
75
|
-
this.fb = fb;
|
|
76
|
-
this.eRef = eRef;
|
|
77
|
-
this.service = service;
|
|
78
|
-
this.filterForm = this.fb.group({
|
|
79
|
-
status: [[]],
|
|
80
|
-
reviewerCondition: [null],
|
|
81
|
-
reviewerFrom: [null, [Validators.min(0), Validators.max(100)]],
|
|
82
|
-
reviewerTo: [null, [Validators.min(0), Validators.max(100)]],
|
|
83
|
-
approverCondition: [null],
|
|
84
|
-
approverFrom: [null, [Validators.min(0), Validators.max(100)]],
|
|
85
|
-
approverTo: [null, [Validators.min(0), Validators.max(100)]],
|
|
86
|
-
tangoCondition: [null],
|
|
87
|
-
tangoFrom: [null, [Validators.min(0), Validators.max(100)]],
|
|
88
|
-
tangoTo: [null, [Validators.min(0), Validators.max(100)]],
|
|
89
|
-
reviewedBy: [[]],
|
|
90
|
-
approvedBy: [[]],
|
|
91
|
-
});
|
|
92
|
-
this.onReset();
|
|
93
|
-
}
|
|
94
|
-
limitValue(event, controlName) {
|
|
95
|
-
let value = Number(event.target.value);
|
|
96
|
-
if (value < 0)
|
|
97
|
-
value = 0;
|
|
98
|
-
if (value > 100)
|
|
99
|
-
value = 100;
|
|
100
|
-
event.target.value = value;
|
|
101
|
-
this.filterForm.get(controlName)?.setValue(value, { emitEvent: false });
|
|
102
|
-
}
|
|
103
|
-
get isTango() {
|
|
104
|
-
return this.userType === 'tango';
|
|
105
|
-
}
|
|
106
|
-
// SHOW / HIDE RULES
|
|
107
|
-
// Reviewer accuracy and "Reviewed by" visible for tango + reviewer
|
|
108
|
-
get showReviewerAccuracy() {
|
|
109
|
-
return this.isTango || this.permissionType === 'review';
|
|
110
|
-
}
|
|
111
|
-
get showReviewedBy() {
|
|
112
|
-
return this.permissionType === 'review';
|
|
113
|
-
}
|
|
114
|
-
// Approver accuracy and "Approved by" visible for tango + approver
|
|
115
|
-
get showApproverAccuracy() {
|
|
116
|
-
return this.isTango || this.permissionType === 'approve';
|
|
117
|
-
}
|
|
118
|
-
get showApprovedBy() {
|
|
119
|
-
return this.permissionType === 'approve';
|
|
120
|
-
}
|
|
121
|
-
// Tango accuracy only for tango users
|
|
122
|
-
get showTangoAccuracy() {
|
|
123
|
-
return this.isTango;
|
|
124
|
-
}
|
|
125
|
-
statusDropdownOpen = false;
|
|
126
|
-
isStatusSelected(status) {
|
|
127
|
-
const selected = this.filterForm.value.status || [];
|
|
128
|
-
return selected.includes(status);
|
|
129
|
-
}
|
|
130
|
-
onStatusChange(event, status) {
|
|
131
|
-
const checkbox = event.target;
|
|
132
|
-
const selected = this.filterForm.value.status || [];
|
|
133
|
-
let next;
|
|
134
|
-
if (checkbox.checked) {
|
|
135
|
-
next = selected.includes(status) ? selected : [...selected, status];
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
next = selected.filter(s => s !== status);
|
|
139
|
-
}
|
|
140
|
-
this.filterForm.patchValue({ status: next });
|
|
141
|
-
}
|
|
142
|
-
toggleStatusDropdown(event) {
|
|
143
|
-
if (event) {
|
|
144
|
-
event.stopPropagation(); // avoid document click closing it
|
|
145
|
-
}
|
|
146
|
-
this.statusDropdownOpen = !this.statusDropdownOpen;
|
|
147
|
-
}
|
|
148
|
-
// Are all statuses currently selected?
|
|
149
|
-
areAllStatusesSelected() {
|
|
150
|
-
const selected = this.filterForm.value.status || [];
|
|
151
|
-
return selected.length > 0 && selected.length === this.statusOptions.length;
|
|
152
|
-
}
|
|
153
|
-
// Handle "Select All" checkbox change
|
|
154
|
-
onStatusSelectAllChange(event) {
|
|
155
|
-
const checkbox = event.target;
|
|
156
|
-
if (checkbox.checked) {
|
|
157
|
-
// Select every status
|
|
158
|
-
this.filterForm.patchValue({ status: [...this.statusOptions] });
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
// Clear all
|
|
162
|
-
this.filterForm.patchValue({ status: [] });
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
get selectedStatuses() {
|
|
166
|
-
return this.filterForm.value.status || [];
|
|
167
|
-
}
|
|
168
|
-
isBetween(controlName) {
|
|
169
|
-
return this.filterForm.get(controlName)?.value === 'between';
|
|
170
|
-
}
|
|
171
|
-
ngOnChanges(changes) {
|
|
172
|
-
if (changes['client'] || changes['permissionType'] || changes['userType']) {
|
|
173
|
-
this.loadReviewerList();
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// full user list you already have
|
|
177
|
-
userList = [];
|
|
178
|
-
reviewerSearchTerm = '';
|
|
179
|
-
// ✅ simple computed list for *ngFor
|
|
180
|
-
get filteredReviewerList() {
|
|
181
|
-
const term = (this.reviewerSearchTerm || '').trim().toLowerCase();
|
|
182
|
-
if (!term) {
|
|
183
|
-
return this.userList;
|
|
184
|
-
}
|
|
185
|
-
return this.userList.filter(u => {
|
|
186
|
-
const email = (u.email || '').toLowerCase();
|
|
187
|
-
const name = (u.name || '').toLowerCase();
|
|
188
|
-
return email.includes(term) || name.includes(term);
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
approverSearchTerm;
|
|
192
|
-
get filteredApproverList() {
|
|
193
|
-
const term = (this.approverSearchTerm || '').trim().toLowerCase();
|
|
194
|
-
if (!term) {
|
|
195
|
-
return this.userList;
|
|
196
|
-
}
|
|
197
|
-
return this.userList.filter((u) => {
|
|
198
|
-
const email = (u.email || '').toLowerCase();
|
|
199
|
-
const name = (u.name || '').toLowerCase();
|
|
200
|
-
return email.includes(term) || name.includes(term);
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
onApproverSearch(value) {
|
|
204
|
-
this.approverSearchTerm = value;
|
|
205
|
-
}
|
|
206
|
-
loadReviewerList() {
|
|
207
|
-
if (!this.client) {
|
|
208
|
-
this.userList = [];
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
let type;
|
|
212
|
-
if (this.userType === 'tango') {
|
|
213
|
-
type = 'tango'; // or 'all'
|
|
214
|
-
}
|
|
215
|
-
else if (this.permissionType === 'review') {
|
|
216
|
-
type = 'review';
|
|
217
|
-
}
|
|
218
|
-
else if (this.permissionType === 'approve') {
|
|
219
|
-
type = 'approve';
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
this.userList = [];
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
this.service.getReviewerApi(this.client, type).subscribe({
|
|
226
|
-
next: (res) => {
|
|
227
|
-
if (res && res.code === 200) {
|
|
228
|
-
this.userList = res.data;
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
this.userList = [];
|
|
232
|
-
}
|
|
233
|
-
},
|
|
234
|
-
error: () => {
|
|
235
|
-
this.userList = [];
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
// open flags
|
|
240
|
-
reviewerDropdownOpen = false;
|
|
241
|
-
approverDropdownOpen = false;
|
|
242
|
-
// convenience getters
|
|
243
|
-
get selectedReviewedBy() {
|
|
244
|
-
return this.filterForm.value.reviewedBy || [];
|
|
245
|
-
}
|
|
246
|
-
get selectedApprovedBy() {
|
|
247
|
-
return this.filterForm.value.approvedBy || [];
|
|
248
|
-
}
|
|
249
|
-
// --- Reviewed By helpers ---
|
|
250
|
-
toggleReviewerDropdown(event) {
|
|
251
|
-
if (event)
|
|
252
|
-
event.stopPropagation();
|
|
253
|
-
this.reviewerDropdownOpen = !this.reviewerDropdownOpen;
|
|
254
|
-
}
|
|
255
|
-
isReviewerSelected(email) {
|
|
256
|
-
return this.selectedReviewedBy.includes(email);
|
|
257
|
-
}
|
|
258
|
-
onReviewerChange(event, email) {
|
|
259
|
-
const checkbox = event.target;
|
|
260
|
-
const selected = [...this.selectedReviewedBy];
|
|
261
|
-
if (checkbox.checked) {
|
|
262
|
-
if (!selected.includes(email))
|
|
263
|
-
selected.push(email);
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
const i = selected.indexOf(email);
|
|
267
|
-
if (i >= 0)
|
|
268
|
-
selected.splice(i, 1);
|
|
269
|
-
}
|
|
270
|
-
this.filterForm.patchValue({ reviewedBy: selected });
|
|
271
|
-
}
|
|
272
|
-
areAllReviewersSelected() {
|
|
273
|
-
return (this.userList.length > 0 &&
|
|
274
|
-
this.selectedReviewedBy.length === this.userList.length);
|
|
275
|
-
}
|
|
276
|
-
onReviewerSelectAll(event) {
|
|
277
|
-
const checkbox = event.target;
|
|
278
|
-
if (checkbox.checked) {
|
|
279
|
-
this.filterForm.patchValue({
|
|
280
|
-
reviewedBy: this.userList.map((u) => u.email),
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
this.filterForm.patchValue({ reviewedBy: [] });
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
// --- Approved By helpers ---
|
|
288
|
-
toggleApproverDropdown(event) {
|
|
289
|
-
if (event)
|
|
290
|
-
event.stopPropagation();
|
|
291
|
-
this.approverDropdownOpen = !this.approverDropdownOpen;
|
|
292
|
-
}
|
|
293
|
-
isApproverSelected(email) {
|
|
294
|
-
return this.selectedApprovedBy.includes(email);
|
|
295
|
-
}
|
|
296
|
-
onApproverChange(event, email) {
|
|
297
|
-
const checkbox = event.target;
|
|
298
|
-
const selected = [...this.selectedApprovedBy];
|
|
299
|
-
if (checkbox.checked) {
|
|
300
|
-
if (!selected.includes(email))
|
|
301
|
-
selected.push(email);
|
|
302
|
-
}
|
|
303
|
-
else {
|
|
304
|
-
const i = selected.indexOf(email);
|
|
305
|
-
if (i >= 0)
|
|
306
|
-
selected.splice(i, 1);
|
|
307
|
-
}
|
|
308
|
-
this.filterForm.patchValue({ approvedBy: selected });
|
|
309
|
-
}
|
|
310
|
-
areAllApproversSelected() {
|
|
311
|
-
return (this.userList.length > 0 &&
|
|
312
|
-
this.selectedApprovedBy.length === this.userList.length);
|
|
313
|
-
}
|
|
314
|
-
onApproverSelectAll(event) {
|
|
315
|
-
const checkbox = event.target;
|
|
316
|
-
if (checkbox.checked) {
|
|
317
|
-
this.filterForm.patchValue({
|
|
318
|
-
approvedBy: this.userList.map((u) => u.email),
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
this.filterForm.patchValue({ approvedBy: [] });
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
onReset() {
|
|
326
|
-
this.filterForm.reset({
|
|
327
|
-
status: [],
|
|
328
|
-
reviewerCondition: null,
|
|
329
|
-
reviewerFrom: null,
|
|
330
|
-
reviewerTo: null,
|
|
331
|
-
approverCondition: null,
|
|
332
|
-
approverFrom: null,
|
|
333
|
-
approverTo: null,
|
|
334
|
-
tangoCondition: null,
|
|
335
|
-
tangoFrom: null,
|
|
336
|
-
tangoTo: null,
|
|
337
|
-
reviewedBy: [],
|
|
338
|
-
approvedBy: []
|
|
339
|
-
});
|
|
340
|
-
// 2️⃣ Reset search terms
|
|
341
|
-
this.reviewerSearchTerm = '';
|
|
342
|
-
this.approverSearchTerm = '';
|
|
343
|
-
// 3️⃣ Build empty payload to send back
|
|
344
|
-
const payload = {
|
|
345
|
-
filterByStatus: [],
|
|
346
|
-
filterByReviewer: null,
|
|
347
|
-
filterByApprover: null,
|
|
348
|
-
filterByTango: null,
|
|
349
|
-
filterByReviewedBy: [],
|
|
350
|
-
fileterByApprovedBy: []
|
|
351
|
-
};
|
|
352
|
-
// 4️⃣ Emit the now-empty filter result
|
|
353
|
-
this.apply.emit(payload);
|
|
354
|
-
// 5️⃣ Close the filter panel
|
|
355
|
-
this.close();
|
|
356
|
-
}
|
|
357
|
-
mapAccuracy(condition, from, to) {
|
|
358
|
-
// nothing selected
|
|
359
|
-
if (!condition || from == null)
|
|
360
|
-
return null;
|
|
361
|
-
// "between" → "90 to 100"
|
|
362
|
-
if (condition === 'between') {
|
|
363
|
-
if (to == null)
|
|
364
|
-
return null;
|
|
365
|
-
return `${from} to ${to}`;
|
|
366
|
-
}
|
|
367
|
-
// other conditions (gt, lt, gte, lte)
|
|
368
|
-
const opMap = {
|
|
369
|
-
gt: '>',
|
|
370
|
-
lt: '<',
|
|
371
|
-
gte: '>=',
|
|
372
|
-
lte: '<=',
|
|
373
|
-
between: '', // already handled above
|
|
374
|
-
};
|
|
375
|
-
return `${opMap[condition]} ${from}`; // e.g. ">= 90"
|
|
376
|
-
}
|
|
377
|
-
onApply() {
|
|
378
|
-
const raw = this.filterForm.value;
|
|
379
|
-
const reviewerStr = this.mapAccuracy(raw.reviewerCondition, raw.reviewerFrom, raw.reviewerTo);
|
|
380
|
-
const approverStr = this.mapAccuracy(raw.approverCondition, raw.approverFrom, raw.approverTo);
|
|
381
|
-
const tangoStr = this.mapAccuracy(raw.tangoCondition, raw.tangoFrom, raw.tangoTo);
|
|
382
|
-
const payload = {
|
|
383
|
-
filterByStatus: raw.status || [],
|
|
384
|
-
filterByReviewer: reviewerStr,
|
|
385
|
-
filterByApprover: approverStr,
|
|
386
|
-
filterByTango: tangoStr,
|
|
387
|
-
filterByReviewedBy: raw.reviewedBy || [],
|
|
388
|
-
fileterByApprovedBy: raw.approvedBy || [],
|
|
389
|
-
};
|
|
390
|
-
this.apply.emit(payload);
|
|
391
|
-
this.close();
|
|
392
|
-
this.showPanel = false;
|
|
393
|
-
}
|
|
394
|
-
dropdownState = {
|
|
395
|
-
status: false,
|
|
396
|
-
reviewer: false,
|
|
397
|
-
approver: false
|
|
398
|
-
};
|
|
399
|
-
// @HostListener('document:click')
|
|
400
|
-
closeAll() {
|
|
401
|
-
this.dropdownState.status = false;
|
|
402
|
-
this.dropdownState.reviewer = false;
|
|
403
|
-
this.dropdownState.approver = false;
|
|
404
|
-
}
|
|
405
|
-
toggleDropdown(type, event) {
|
|
406
|
-
event.stopPropagation();
|
|
407
|
-
// Close all before opening a new one
|
|
408
|
-
this.closeAll();
|
|
409
|
-
// Toggle only the selected one
|
|
410
|
-
this.dropdownState[type] = !this.dropdownState[type];
|
|
411
|
-
}
|
|
412
|
-
isDropdownOpen(type) {
|
|
413
|
-
return this.dropdownState[type];
|
|
414
|
-
}
|
|
415
|
-
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 });
|
|
416
|
-
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)=\"toggleDropdown('status', $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=\"isDropdownOpen('status')\"\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\" (click)=\"closeAll()\">\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\" (click)=\"closeAll()\">\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\" (click)=\"closeAll()\">\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)=\"toggleDropdown('reviewer', $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=\"isDropdownOpen('reviewer')\"\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)=\"toggleDropdown('approver', $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=\"isDropdownOpen('approver')\"\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.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
|
|
417
|
-
}
|
|
418
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TicketFilterPanelComponent, decorators: [{
|
|
419
|
-
type: Component,
|
|
420
|
-
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)=\"toggleDropdown('status', $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=\"isDropdownOpen('status')\"\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\" (click)=\"closeAll()\">\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\" (click)=\"closeAll()\">\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\" (click)=\"closeAll()\">\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)=\"toggleDropdown('reviewer', $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=\"isDropdownOpen('reviewer')\"\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)=\"toggleDropdown('approver', $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=\"isDropdownOpen('approver')\"\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"] }]
|
|
421
|
-
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ElementRef }, { type: i2.TicketService }], propDecorators: { apply: [{
|
|
422
|
-
type: Output
|
|
423
|
-
}], panelClosed: [{
|
|
424
|
-
type: Output
|
|
425
|
-
}], permissionType: [{
|
|
426
|
-
type: Input
|
|
427
|
-
}], userType: [{
|
|
428
|
-
type: Input
|
|
429
|
-
}], client: [{
|
|
430
|
-
type: Input
|
|
431
|
-
}], onDocumentClick: [{
|
|
432
|
-
type: HostListener,
|
|
433
|
-
args: ['document:click', ['$event']]
|
|
434
|
-
}] } });
|
|
435
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0LWZpbHRlci1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtdGlja2V0cy9zcmMvbGliL2NvbXBvbmVudHMvdGlja2V0LWZpbHRlci1wYW5lbC90aWNrZXQtZmlsdGVyLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS10aWNrZXRzL3NyYy9saWIvY29tcG9uZW50cy90aWNrZXQtZmlsdGVyLXBhbmVsL3RpY2tldC1maWx0ZXItcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBVXBFLE1BQU0sT0FBTywwQkFBMEI7SUFnRmpCO0lBQXdCO0lBQXlCO0lBL0UxRCxLQUFLLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUNqQyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQyxDQUFHLGdCQUFnQjtJQUMzRCxjQUFjLEdBQWtCLElBQUksQ0FBQztJQUN2QyxRQUFRLEdBQWtCLElBQUksQ0FBQyxDQUFDLHlCQUF5QjtJQUN6RCxNQUFNLENBQU07SUFFckIsZUFBZSxDQUFDLEtBQWlCO1FBRS9CLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUVwQywrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUV6QiwwQ0FBMEM7UUFDMUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVyRSxxREFBcUQ7UUFDckQsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO2dCQUNyQixNQUFNLEVBQUUsRUFBRTtnQkFDVixpQkFBaUIsRUFBRSxJQUFJO2dCQUN2QixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLElBQUk7Z0JBRWhCLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsSUFBSTtnQkFFaEIsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLE9BQU8sRUFBRSxJQUFJO2dCQUViLFVBQVUsRUFBRSxFQUFFO2dCQUNkLFVBQVUsRUFBRSxFQUFFO2FBQ2YsQ0FBQyxDQUFDO1NBRUY7SUFDSCxDQUFDO0lBQ0MsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFxQyxzQkFBc0I7SUFFMUUsNkNBQTZDO0lBQzdDLElBQUk7UUFDRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsNENBQTRDO0lBQzVDLEtBQUs7UUFDSCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQVcsd0NBQXdDO0lBRXZFLGFBQWEsR0FBVTtRQUNyQixNQUFNO1FBQ04sYUFBYTtRQUNiLFFBQVE7UUFDUixvQkFBb0I7UUFDcEIsbUJBQW1CO1FBQ25CLFNBQVM7UUFDVCxlQUFlO0tBQ2hCLENBQUM7SUFHQSxnQkFBZ0IsR0FBRztRQUNqQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFO1FBQ3hDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFO1FBQ3ZDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsNkJBQTZCLEVBQUU7UUFDdEQsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSw0QkFBNEIsRUFBRTtRQUNyRCxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtLQUN2QyxDQUFDO0lBRUYsVUFBVSxDQUFZO0lBRXRCLFlBQW9CLEVBQWUsRUFBUyxJQUFnQixFQUFTLE9BQXFCO1FBQXRFLE9BQUUsR0FBRixFQUFFLENBQWE7UUFBUyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVMsWUFBTyxHQUFQLE9BQU8sQ0FBYztRQUN4RixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQzlCLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUVaLGlCQUFpQixFQUFFLENBQUMsSUFBd0IsQ0FBQztZQUM3QyxZQUFZLEVBQUUsQ0FBQyxJQUFJLEVBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3RCxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUUzRCxpQkFBaUIsRUFBRSxDQUFDLElBQXdCLENBQUM7WUFDN0MsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDN0QsVUFBVSxFQUFFLENBQUMsSUFBSSxFQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFM0QsY0FBYyxFQUFFLENBQUMsSUFBd0IsQ0FBQztZQUMxQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV4RCxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDcEIsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDO1NBQ2IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFDSCxVQUFVLENBQUMsS0FBVSxFQUFFLFdBQW1CO1FBQ3hDLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXZDLElBQUksS0FBSyxHQUFHLENBQUM7WUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksS0FBSyxHQUFHLEdBQUc7WUFBRSxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBRTdCLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUM7SUFDbkMsQ0FBQztJQUVELG9CQUFvQjtJQUVwQixtRUFBbUU7SUFDbkUsSUFBSSxvQkFBb0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssUUFBUSxDQUFDO0lBQzFELENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBUSxJQUFJLENBQUMsY0FBYyxLQUFLLFFBQVEsQ0FBQztJQUMzQyxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLElBQUksb0JBQW9CO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQVEsSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLENBQUM7SUFDNUMsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUNELGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUMzQixnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLE1BQU0sUUFBUSxHQUFhLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDOUQsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBWSxFQUFFLE1BQWM7UUFDekMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQTBCLENBQUM7UUFDbEQsTUFBTSxRQUFRLEdBQWEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUM5RCxJQUFJLElBQWMsQ0FBQztRQUVuQixJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDcEIsSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNyRTthQUFNO1lBQ0wsSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUM7U0FDM0M7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFrQjtRQUNyQyxJQUFJLEtBQUssRUFBRTtZQUNULEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLGtDQUFrQztTQUM1RDtRQUNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNyRCxDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLHNCQUFzQjtRQUNwQixNQUFNLFFBQVEsR0FBYSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO1FBQzlELE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztJQUM5RSxDQUFDO0lBRUQsc0NBQXNDO0lBQ3RDLHVCQUF1QixDQUFDLEtBQVk7UUFDbEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQTBCLENBQUM7UUFFbEQsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQ3BCLHNCQUFzQjtZQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNqRTthQUFNO1lBQ0wsWUFBWTtZQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFQyxTQUFTLENBQUMsV0FBbUI7UUFDM0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLEtBQUssU0FBUyxDQUFDO0lBQy9ELENBQUM7SUFDSCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3pFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUNELGtDQUFrQztJQUNsQyxRQUFRLEdBQVUsRUFBRSxDQUFDO0lBR3JCLGtCQUFrQixHQUFXLEVBQUUsQ0FBQztJQUVoQyxvQ0FBb0M7SUFDcEMsSUFBSSxvQkFBb0I7UUFDdEIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbEUsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUN0QjtRQUVELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDOUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMxQyxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxrQkFBa0IsQ0FBSztJQUN2QixJQUFJLG9CQUFvQjtRQUN0QixNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ3RCO1FBRUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDMUMsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYTtRQUM1QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFDTyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDbkIsT0FBTztTQUNSO1FBRUQsSUFBSSxJQUFZLENBQUM7UUFFakIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRTtZQUM3QixJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUksV0FBVztTQUMvQjthQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxRQUFRLEVBQUU7WUFDM0MsSUFBSSxHQUFHLFFBQVEsQ0FBQztTQUNqQjthQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUU7WUFDNUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztTQUNsQjthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDbkIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdkQsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxFQUFFO29CQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7aUJBQzFCO3FCQUFNO29CQUNMLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO2lCQUNwQjtZQUNILENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYTtJQUNiLG9CQUFvQixHQUFHLEtBQUssQ0FBQztJQUM3QixvQkFBb0IsR0FBRyxLQUFLLENBQUM7SUFFN0Isc0JBQXNCO0lBQ3RCLElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCw4QkFBOEI7SUFFOUIsc0JBQXNCLENBQUMsS0FBa0I7UUFDdkMsSUFBSSxLQUFLO1lBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUN6RCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBYTtRQUM5QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQVksRUFBRSxLQUFhO1FBQzFDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUEwQixDQUFDO1FBQ2xELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUU5QyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNMLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNuQztRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixPQUFPLENBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUN4QixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUN4RCxDQUFDO0lBQ0osQ0FBQztJQUVELG1CQUFtQixDQUFDLEtBQVk7UUFDOUIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQTBCLENBQUM7UUFFbEQsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO2dCQUN6QixVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDbEQsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDaEQ7SUFDSCxDQUFDO0lBRUQsOEJBQThCO0lBRTlCLHNCQUFzQixDQUFDLEtBQWtCO1FBQ3ZDLElBQUksS0FBSztZQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDekQsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQWE7UUFDOUIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFZLEVBQUUsS0FBYTtRQUMxQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBMEIsQ0FBQztRQUNsRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFOUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDTCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDbkM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCx1QkFBdUI7UUFDckIsT0FBTyxDQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDeEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FDeEQsQ0FBQztJQUNKLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFZO1FBQzlCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUEwQixDQUFDO1FBRWxELElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtZQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztnQkFDekIsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ2xELENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2hEO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUNwQixNQUFNLEVBQUUsRUFBRTtZQUNWLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFFaEIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUVoQixjQUFjLEVBQUUsSUFBSTtZQUNwQixTQUFTLEVBQUUsSUFBSTtZQUNmLE9BQU8sRUFBRSxJQUFJO1lBRWIsVUFBVSxFQUFFLEVBQUU7WUFDZCxVQUFVLEVBQUUsRUFBRTtTQUNmLENBQUMsQ0FBQztRQUVILHlCQUF5QjtRQUN6QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFFN0IsdUNBQXVDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHO1lBQ2QsY0FBYyxFQUFFLEVBQUU7WUFDbEIsZ0JBQWdCLEVBQUUsSUFBSTtZQUN0QixnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLGFBQWEsRUFBRSxJQUFJO1lBQ25CLGtCQUFrQixFQUFFLEVBQUU7WUFDdEIsbUJBQW1CLEVBQUUsRUFBRTtTQUN4QixDQUFDO1FBRUYsdUNBQXVDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXpCLDZCQUE2QjtRQUM3QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRU8sV0FBVyxDQUNqQixTQUEyQixFQUMzQixJQUFtQixFQUNuQixFQUFpQjtRQUdqQixtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTVDLDBCQUEwQjtRQUMxQixJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDM0IsSUFBSSxFQUFFLElBQUksSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUM1QixPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsRUFBRSxDQUFDO1NBQzNCO1FBRUQsc0NBQXNDO1FBQ3RDLE1BQU0sS0FBSyxHQUE4QjtZQUN2QyxFQUFFLEVBQUUsR0FBRztZQUNQLEVBQUUsRUFBRSxHQUFHO1lBQ1AsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLEVBQUUsSUFBSTtZQUNULE9BQU8sRUFBRSxFQUFFLEVBQUUsd0JBQXdCO1NBQ3RDLENBQUM7UUFFRixPQUFPLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUUsZUFBZTtJQUN4RCxDQUFDO0lBRUMsT0FBTztRQUVOLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBRW5DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sUUFBUSxHQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVyRixNQUFNLE9BQU8sR0FBRztZQUNkLGNBQWMsRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUU7WUFFaEMsZ0JBQWdCLEVBQUUsV0FBVztZQUM3QixnQkFBZ0IsRUFBRSxXQUFXO1lBQzdCLGFBQWEsRUFBRSxRQUFRO1lBRXZCLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxVQUFVLElBQUksRUFBRTtZQUN4QyxtQkFBbUIsRUFBRSxHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUU7U0FDMUMsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFSCxhQUFhLEdBQUc7UUFDZCxNQUFNLEVBQUUsS0FBSztRQUNiLFFBQVEsRUFBRSxLQUFLO1FBQ2YsUUFBUSxFQUFFLEtBQUs7S0FDaEIsQ0FBQztJQUNGLGtDQUFrQztJQUNsQyxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDdEMsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUF3QyxFQUFFLEtBQWlCO1FBQ3hFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWhCLCtCQUErQjtRQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQXdDO1FBQ3JELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO3dHQWplWSwwQkFBMEI7NEZBQTFCLDBCQUEwQix5U0NYdkMseTNaQWtZQTs7NEZEdlhhLDBCQUEwQjtrQkFMdEMsU0FBUzsrQkFDRSx5QkFBeUI7cUlBS3hCLEtBQUs7c0JBQWQsTUFBTTtnQkFDRSxXQUFXO3NCQUFwQixNQUFNO2dCQUNFLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0MsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRU4sZUFBZTtzQkFEYixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFRpY2tldFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aWNrZXQuc2VydmljZSc7XHJcblxyXG50eXBlIENvbmRpdGlvbiA9ICdndCcgfCAnbHQnIHwgJ2d0ZScgfCAnbHRlJyB8ICdiZXR3ZWVuJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXRpY2tldC1maWx0ZXItcGFuZWwnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90aWNrZXQtZmlsdGVyLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vdGlja2V0LWZpbHRlci1wYW5lbC5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFRpY2tldEZpbHRlclBhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICAgQE91dHB1dCgpIGFwcGx5ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHBhbmVsQ2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpOyAgIC8vIOKchSBub3QgYGNsb3NlYFxyXG4gIEBJbnB1dCgpIHBlcm1pc3Npb25UeXBlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuQElucHV0KCkgdXNlclR5cGU6IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyBlLmcuICd0YW5nbycgb3Igb3RoZXJzXHJcbkBJbnB1dCgpIGNsaWVudCA6YW55O1xyXG4gQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG5vbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuXHJcbiAgLy8gMe+4j+KDoyBBbHdheXMgY2xvc2UgZHJvcGRvd25zIGZpcnN0XHJcbiAgdGhpcy5kcm9wZG93blN0YXRlLnN0YXR1cyA9IGZhbHNlO1xyXG4gIHRoaXMuZHJvcGRvd25TdGF0ZS5yZXZpZXdlciA9IGZhbHNlO1xyXG4gIHRoaXMuZHJvcGRvd25TdGF0ZS5hcHByb3ZlciA9IGZhbHNlO1xyXG5cclxuICAvLyAy77iP4oOjIElmIGZpbHRlciBpcyBub3Qgb3BlbiDihpIgbm90aGluZyB0byBjbG9zZVxyXG4gIGlmICghdGhpcy5pc09wZW4pIHJldHVybjtcclxuXHJcbiAgLy8gM++4j+KDoyBDaGVjayBpZiBjbGlja2VkIGluc2lkZSBmaWx0ZXIgY2FyZFxyXG4gIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0aGlzLmVSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xyXG5cclxuICAvLyA077iP4oOjIElmIGNsaWNrZWQgT1VUU0lERSDihpIgY2xvc2UgZW50aXJlIGZpbHRlciBwYW5lbFxyXG4gIGlmICghY2xpY2tlZEluc2lkZSkge1xyXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMucGFuZWxDbG9zZWQuZW1pdCgpO1xyXG4gICB0aGlzLmZpbHRlckZvcm0ucmVzZXQoe1xyXG4gICAgc3RhdHVzOiBbXSxcclxuICAgIHJldmlld2VyQ29uZGl0aW9uOiBudWxsLFxyXG4gICAgcmV2aWV3ZXJGcm9tOiBudWxsLFxyXG4gICAgcmV2aWV3ZXJUbzogbnVsbCxcclxuXHJcbiAgICBhcHByb3ZlckNvbmRpdGlvbjogbnVsbCxcclxuICAgIGFwcHJvdmVyRnJvbTogbnVsbCxcclxuICAgIGFwcHJvdmVyVG86IG51bGwsXHJcblxyXG4gICAgdGFuZ29Db25kaXRpb246IG51bGwsXHJcbiAgICB0YW5nb0Zyb206IG51bGwsXHJcbiAgICB0YW5nb1RvOiBudWxsLFxyXG5cclxuICAgIHJldmlld2VkQnk6IFtdLFxyXG4gICAgYXBwcm92ZWRCeTogW11cclxuICB9KTtcclxuXHJcbiAgfVxyXG59XHJcbiAgaXNPcGVuID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRyb2xzIHZpc2liaWxpdHlcclxuXHJcbiAgLy8gY2FsbGVkIGZyb20gcGFyZW50IHZpYSAjZmlsdGVyUGFuZWwub3BlbigpXHJcbiAgb3BlbigpIHtcclxuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIGNhbGxlZCBmcm9tIGNsb3NlIGJ1dHRvbiBpbnNpZGUgdGhlIHBhbmVsXHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5wYW5lbENsb3NlZC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBzaG93UGFuZWwgPSBmYWxzZTsgICAgICAgICAgIC8vIHlvdSBjYW4gYWxzbyBjb250cm9sIHRoaXMgZnJvbSBwYXJlbnRcclxuXHJcbnN0YXR1c09wdGlvbnM6IGFueVtdID0gW1xyXG4gICdPcGVuJyxcclxuICAnSW4tUHJvZ3Jlc3MnLFxyXG4gICdDbG9zZWQnLFxyXG4gICdVbmRlciBUYW5nbyBSZXZpZXcnLFxyXG4gICdUYW5nbyBSZXZpZXcgRG9uZScsXHJcbiAgJ0V4cGlyZWQnLFxyXG4gICdUYW5nbyBFeHBpcmVkJyxcclxuXTtcclxuXHJcblxyXG4gIGNvbmRpdGlvbk9wdGlvbnMgPSBbXHJcbiAgICB7IHZhbHVlOiAnZ3QnLCBsYWJlbDogJz4gR3JlYXRlciB0aGFuJyB9LFxyXG4gICAgeyB2YWx1ZTogJ2x0JywgbGFiZWw6ICc8IExlc3NlciB0aGFuJyB9LFxyXG4gICAgeyB2YWx1ZTogJ2d0ZScsIGxhYmVsOiAnPj0gR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvJyB9LFxyXG4gICAgeyB2YWx1ZTogJ2x0ZScsIGxhYmVsOiAnPD0gTGVzc2VyIHRoYW4gb3IgZXF1YWwgdG8nIH0sXHJcbiAgICB7IHZhbHVlOiAnYmV0d2VlbicsIGxhYmVsOiAnQmV0d2VlbicgfSxcclxuICBdO1xyXG5cclxuICBmaWx0ZXJGb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLHByaXZhdGUgZVJlZjogRWxlbWVudFJlZixwcml2YXRlIHNlcnZpY2U6VGlja2V0U2VydmljZSkge1xyXG4gICAgdGhpcy5maWx0ZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHN0YXR1czogW1tdXSxcclxuXHJcbiAgICAgIHJldmlld2VyQ29uZGl0aW9uOiBbbnVsbCBhcyBDb25kaXRpb24gfCBudWxsXSxcclxuICAgICAgcmV2aWV3ZXJGcm9tOiBbbnVsbCxbVmFsaWRhdG9ycy5taW4oMCksIFZhbGlkYXRvcnMubWF4KDEwMCldXSxcclxuICAgICAgcmV2aWV3ZXJUbzogW251bGwsW1ZhbGlkYXRvcnMubWluKDApLCBWYWxpZGF0b3JzLm1heCgxMDApXV0sXHJcblxyXG4gICAgICBhcHByb3ZlckNvbmRpdGlvbjogW251bGwgYXMgQ29uZGl0aW9uIHwgbnVsbF0sXHJcbiAgICAgIGFwcHJvdmVyRnJvbTogW251bGwsW1ZhbGlkYXRvcnMubWluKDApLCBWYWxpZGF0b3JzLm1heCgxMDApXV0sXHJcbiAgICAgIGFwcHJvdmVyVG86IFtudWxsLFtWYWxpZGF0b3JzLm1pbigwKSwgVmFsaWRhdG9ycy5tYXgoMTAwKV1dLFxyXG5cclxuICAgICAgdGFuZ29Db25kaXRpb246IFtudWxsIGFzIENvbmRpdGlvbiB8IG51bGxdLFxyXG4gICAgICB0YW5nb0Zyb206IFtudWxsLFtWYWxpZGF0b3JzLm1pbigwKSwgVmFsaWRhdG9ycy5tYXgoMTAwKV1dLFxyXG4gICAgICB0YW5nb1RvOiBbbnVsbCxbVmFsaWRhdG9ycy5taW4oMCksIFZhbGlkYXRvcnMubWF4KDEwMCldXSxcclxuXHJcbiAgICAgIHJldmlld2VkQnk6IFtbXV0sXHJcbiAgYXBwcm92ZWRCeTogW1tdXSwgIFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm9uUmVzZXQoKTtcclxuICB9XHJcbmxpbWl0VmFsdWUoZXZlbnQ6IGFueSwgY29udHJvbE5hbWU6IHN0cmluZykge1xyXG4gIGxldCB2YWx1ZSA9IE51bWJlcihldmVudC50YXJnZXQudmFsdWUpO1xyXG5cclxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDA7XHJcbiAgaWYgKHZhbHVlID4gMTAwKSB2YWx1ZSA9IDEwMDtcclxuXHJcbiAgZXZlbnQudGFyZ2V0LnZhbHVlID0gdmFsdWU7XHJcbiAgdGhpcy5maWx0ZXJGb3JtLmdldChjb250cm9sTmFtZSk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbn1cclxuXHJcbmdldCBpc1RhbmdvKCk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiB0aGlzLnVzZXJUeXBlID09PSAndGFuZ28nO1xyXG59XHJcblxyXG4vLyBTSE9XIC8gSElERSBSVUxFU1xyXG5cclxuLy8gUmV2aWV3ZXIgYWNjdXJhY3kgYW5kIFwiUmV2aWV3ZWQgYnlcIiB2aXNpYmxlIGZvciB0YW5nbyArIHJldmlld2VyXHJcbmdldCBzaG93UmV2aWV3ZXJBY2N1cmFjeSgpOiBib29sZWFuIHtcclxuICByZXR1cm4gdGhpcy5pc1RhbmdvIHx8IHRoaXMucGVybWlzc2lvblR5cGUgPT09ICdyZXZpZXcnO1xyXG59XHJcblxyXG5nZXQgc2hvd1Jldmlld2VkQnkoKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuICB0aGlzLnBlcm1pc3Npb25UeXBlID09PSAncmV2aWV3JztcclxufVxyXG5cclxuLy8gQXBwcm92ZXIgYWNjdXJhY3kgYW5kIFwiQXBwcm92ZWQgYnlcIiB2aXNpYmxlIGZvciB0YW5nbyArIGFwcHJvdmVyXHJcbmdldCBzaG93QXBwcm92ZXJBY2N1cmFjeSgpOiBib29sZWFuIHtcclxuICByZXR1cm4gdGhpcy5pc1RhbmdvIHx8IHRoaXMucGVybWlzc2lvblR5cGUgPT09ICdhcHByb3ZlJztcclxufVxyXG5cclxuZ2V0IHNob3dBcHByb3ZlZEJ5KCk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiAgdGhpcy5wZXJtaXNzaW9uVHlwZSA9PT0gJ2FwcHJvdmUnO1xyXG59XHJcblxyXG4vLyBUYW5nbyBhY2N1cmFjeSBvbmx5IGZvciB0YW5nbyB1c2Vyc1xyXG5nZXQgc2hvd1RhbmdvQWNjdXJhY3koKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHRoaXMuaXNUYW5nbztcclxufVxyXG5zdGF0dXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuaXNTdGF0dXNTZWxlY3RlZChzdGF0dXM6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gIGNvbnN0IHNlbGVjdGVkOiBzdHJpbmdbXSA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZS5zdGF0dXMgfHwgW107XHJcbiAgcmV0dXJuIHNlbGVjdGVkLmluY2x1ZGVzKHN0YXR1cyk7XHJcbn1cclxuXHJcbm9uU3RhdHVzQ2hhbmdlKGV2ZW50OiBFdmVudCwgc3RhdHVzOiBzdHJpbmcpIHtcclxuICBjb25zdCBjaGVja2JveCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gIGNvbnN0IHNlbGVjdGVkOiBzdHJpbmdbXSA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZS5zdGF0dXMgfHwgW107XHJcbiAgbGV0IG5leHQ6IHN0cmluZ1tdO1xyXG5cclxuICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xyXG4gICAgbmV4dCA9IHNlbGVjdGVkLmluY2x1ZGVzKHN0YXR1cykgPyBzZWxlY3RlZCA6IFsuLi5zZWxlY3RlZCwgc3RhdHVzXTtcclxuICB9IGVsc2Uge1xyXG4gICAgbmV4dCA9IHNlbGVjdGVkLmZpbHRlcihzID0+IHMgIT09IHN0YXR1cyk7XHJcbiAgfVxyXG5cclxuICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZSh7IHN0YXR1czogbmV4dCB9KTtcclxufVxyXG5cclxudG9nZ2xlU3RhdHVzRHJvcGRvd24oZXZlbnQ/OiBNb3VzZUV2ZW50KSB7XHJcbiAgaWYgKGV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gYXZvaWQgZG9jdW1lbnQgY2xpY2sgY2xvc2luZyBpdFxyXG4gIH1cclxuICB0aGlzLnN0YXR1c0Ryb3Bkb3duT3BlbiA9ICF0aGlzLnN0YXR1c0Ryb3Bkb3duT3BlbjtcclxufVxyXG5cclxuLy8gQXJlIGFsbCBzdGF0dXNlcyBjdXJyZW50bHkgc2VsZWN0ZWQ/XHJcbmFyZUFsbFN0YXR1c2VzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgY29uc3Qgc2VsZWN0ZWQ6IHN0cmluZ1tdID0gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLnN0YXR1cyB8fCBbXTtcclxuICByZXR1cm4gc2VsZWN0ZWQubGVuZ3RoID4gMCAmJiBzZWxlY3RlZC5sZW5ndGggPT09IHRoaXMuc3RhdHVzT3B0aW9ucy5sZW5ndGg7XHJcbn1cclxuXHJcbi8vIEhhbmRsZSBcIlNlbGVjdCBBbGxcIiBjaGVja2JveCBjaGFuZ2Vcclxub25TdGF0dXNTZWxlY3RBbGxDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgY29uc3QgY2hlY2tib3ggPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuXHJcbiAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcclxuICAgIC8vIFNlbGVjdCBldmVyeSBzdGF0dXNcclxuICAgIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKHsgc3RhdHVzOiBbLi4udGhpcy5zdGF0dXNPcHRpb25zXSB9KTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gQ2xlYXIgYWxsXHJcbiAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZSh7IHN0YXR1czogW10gfSk7XHJcbiAgfVxyXG59XHJcbmdldCBzZWxlY3RlZFN0YXR1c2VzKCk6IHN0cmluZ1tdIHtcclxuICByZXR1cm4gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLnN0YXR1cyB8fCBbXTtcclxufVxyXG5cclxuICBpc0JldHdlZW4oY29udHJvbE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyRm9ybS5nZXQoY29udHJvbE5hbWUpPy52YWx1ZSA9PT0gJ2JldHdlZW4nO1xyXG4gIH1cclxubmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gIGlmIChjaGFuZ2VzWydjbGllbnQnXSB8fCBjaGFuZ2VzWydwZXJtaXNzaW9uVHlwZSddIHx8IGNoYW5nZXNbJ3VzZXJUeXBlJ10pIHtcclxuICAgIHRoaXMubG9hZFJldmlld2VyTGlzdCgpO1xyXG4gIH1cclxufVxyXG4vLyBmdWxsIHVzZXIgbGlzdCB5b3UgYWxyZWFkeSBoYXZlXHJcbnVzZXJMaXN0OiBhbnlbXSA9IFtdO1xyXG5cclxuXHJcbnJldmlld2VyU2VhcmNoVGVybTogc3RyaW5nID0gJyc7XHJcblxyXG4vLyDinIUgc2ltcGxlIGNvbXB1dGVkIGxpc3QgZm9yICpuZ0ZvclxyXG5nZXQgZmlsdGVyZWRSZXZpZXdlckxpc3QoKTogeyBlbWFpbDogc3RyaW5nOyBuYW1lPzogc3RyaW5nIH1bXSB7XHJcbiAgY29uc3QgdGVybSA9ICh0aGlzLnJldmlld2VyU2VhcmNoVGVybSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gIGlmICghdGVybSkge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlckxpc3Q7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdGhpcy51c2VyTGlzdC5maWx0ZXIodSA9PiB7XHJcbiAgICBjb25zdCBlbWFpbCA9ICh1LmVtYWlsIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgY29uc3QgbmFtZSA9ICh1Lm5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gZW1haWwuaW5jbHVkZXModGVybSkgfHwgbmFtZS5pbmNsdWRlcyh0ZXJtKTtcclxuICB9KTtcclxufVxyXG5hcHByb3ZlclNlYXJjaFRlcm06YW55O1xyXG5nZXQgZmlsdGVyZWRBcHByb3Zlckxpc3QoKTogYW55W10ge1xyXG4gIGNvbnN0IHRlcm0gPSAodGhpcy5hcHByb3ZlclNlYXJjaFRlcm0gfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gIGlmICghdGVybSkge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlckxpc3Q7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdGhpcy51c2VyTGlzdC5maWx0ZXIoKHU6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgZW1haWwgPSAodS5lbWFpbCB8fCAnJykudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IG5hbWUgPSAodS5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIGVtYWlsLmluY2x1ZGVzKHRlcm0pIHx8IG5hbWUuaW5jbHVkZXModGVybSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbm9uQXBwcm92ZXJTZWFyY2godmFsdWU6IHN0cmluZykge1xyXG4gIHRoaXMuYXBwcm92ZXJTZWFyY2hUZXJtID0gdmFsdWU7XHJcbn1cclxucHJpdmF0ZSBsb2FkUmV2aWV3ZXJMaXN0KCk6IHZvaWQge1xyXG4gIGlmICghdGhpcy5jbGllbnQpIHtcclxuICAgIHRoaXMudXNlckxpc3QgPSBbXTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGxldCB0eXBlOiBzdHJpbmc7XHJcblxyXG4gIGlmICh0aGlzLnVzZXJUeXBlID09PSAndGFuZ28nKSB7XHJcbiAgICB0eXBlID0gJ3RhbmdvJzsgICAgLy8gb3IgJ2FsbCdcclxuICB9IGVsc2UgaWYgKHRoaXMucGVybWlzc2lvblR5cGUgPT09ICdyZXZpZXcnKSB7XHJcbiAgICB0eXBlID0gJ3Jldmlldyc7XHJcbiAgfSBlbHNlIGlmICh0aGlzLnBlcm1pc3Npb25UeXBlID09PSAnYXBwcm92ZScpIHtcclxuICAgIHR5cGUgPSAnYXBwcm92ZSc7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMudXNlckxpc3QgPSBbXTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIHRoaXMuc2VydmljZS5nZXRSZXZpZXdlckFwaSh0aGlzLmNsaWVudCwgdHlwZSkuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICB0aGlzLnVzZXJMaXN0ID0gcmVzLmRhdGE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51c2VyTGlzdCA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgdGhpcy51c2VyTGlzdCA9IFtdO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG4vLyBvcGVuIGZsYWdzXHJcbnJldmlld2VyRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbmFwcHJvdmVyRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcblxyXG4vLyBjb252ZW5pZW5jZSBnZXR0ZXJzXHJcbmdldCBzZWxlY3RlZFJldmlld2VkQnkoKTogc3RyaW5nW10ge1xyXG4gIHJldHVybiB0aGlzLmZpbHRlckZvcm0udmFsdWUucmV2aWV3ZWRCeSB8fCBbXTtcclxufVxyXG5cclxuZ2V0IHNlbGVjdGVkQXBwcm92ZWRCeSgpOiBzdHJpbmdbXSB7XHJcbiAgcmV0dXJuIHRoaXMuZmlsdGVyRm9ybS52YWx1ZS5hcHByb3ZlZEJ5IHx8IFtdO1xyXG59XHJcblxyXG4vLyAtLS0gUmV2aWV3ZWQgQnkgaGVscGVycyAtLS1cclxuXHJcbnRvZ2dsZVJldmlld2VyRHJvcGRvd24oZXZlbnQ/OiBNb3VzZUV2ZW50KSB7XHJcbiAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB0aGlzLnJldmlld2VyRHJvcGRvd25PcGVuID0gIXRoaXMucmV2aWV3ZXJEcm9wZG93bk9wZW47XHJcbn1cclxuXHJcbmlzUmV2aWV3ZXJTZWxlY3RlZChlbWFpbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRSZXZpZXdlZEJ5LmluY2x1ZGVzKGVtYWlsKTtcclxufVxyXG5cclxub25SZXZpZXdlckNoYW5nZShldmVudDogRXZlbnQsIGVtYWlsOiBzdHJpbmcpIHtcclxuICBjb25zdCBjaGVja2JveCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gIGNvbnN0IHNlbGVjdGVkID0gWy4uLnRoaXMuc2VsZWN0ZWRSZXZpZXdlZEJ5XTtcclxuXHJcbiAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcclxuICAgIGlmICghc2VsZWN0ZWQuaW5jbHVkZXMoZW1haWwpKSBzZWxlY3RlZC5wdXNoKGVtYWlsKTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgaSA9IHNlbGVjdGVkLmluZGV4T2YoZW1haWwpO1xyXG4gICAgaWYgKGkgPj0gMCkgc2VsZWN0ZWQuc3BsaWNlKGksIDEpO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5maWx0ZXJGb3JtLnBhdGNoVmFsdWUoeyByZXZpZXdlZEJ5OiBzZWxlY3RlZCB9KTtcclxufVxyXG5cclxuYXJlQWxsUmV2aWV3ZXJzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIChcclxuICAgIHRoaXMudXNlckxpc3QubGVuZ3RoID4gMCAmJlxyXG4gICAgdGhpcy5zZWxlY3RlZFJldmlld2VkQnkubGVuZ3RoID09PSB0aGlzLnVzZXJMaXN0Lmxlbmd0aFxyXG4gICk7XHJcbn1cclxuXHJcbm9uUmV2aWV3ZXJTZWxlY3RBbGwoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgY29uc3QgY2hlY2tib3ggPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuXHJcbiAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcclxuICAgIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgcmV2aWV3ZWRCeTogdGhpcy51c2VyTGlzdC5tYXAoKHU6YW55KSA9PiB1LmVtYWlsKSxcclxuICAgIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZSh7IHJldmlld2VkQnk6IFtdIH0pO1xyXG4gIH1cclxufVxyXG5cclxuLy8gLS0tIEFwcHJvdmVkIEJ5IGhlbHBlcnMgLS0tXHJcblxyXG50b2dnbGVBcHByb3ZlckRyb3Bkb3duKGV2ZW50PzogTW91c2VFdmVudCkge1xyXG4gIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgdGhpcy5hcHByb3ZlckRyb3Bkb3duT3BlbiA9ICF0aGlzLmFwcHJvdmVyRHJvcGRvd25PcGVuO1xyXG59XHJcblxyXG5pc0FwcHJvdmVyU2VsZWN0ZWQoZW1haWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiB0aGlzLnNlbGVjdGVkQXBwcm92ZWRCeS5pbmNsdWRlcyhlbWFpbCk7XHJcbn1cclxuXHJcbm9uQXBwcm92ZXJDaGFuZ2UoZXZlbnQ6IEV2ZW50LCBlbWFpbDogc3RyaW5nKSB7XHJcbiAgY29uc3QgY2hlY2tib3ggPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICBjb25zdCBzZWxlY3RlZCA9IFsuLi50aGlzLnNlbGVjdGVkQXBwcm92ZWRCeV07XHJcblxyXG4gIGlmIChjaGVja2JveC5jaGVja2VkKSB7XHJcbiAgICBpZiAoIXNlbGVjdGVkLmluY2x1ZGVzKGVtYWlsKSkgc2VsZWN0ZWQucHVzaChlbWFpbCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGkgPSBzZWxlY3RlZC5pbmRleE9mKGVtYWlsKTtcclxuICAgIGlmIChpID49IDApIHNlbGVjdGVkLnNwbGljZShpLCAxKTtcclxuICB9XHJcblxyXG4gIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKHsgYXBwcm92ZWRCeTogc2VsZWN0ZWQgfSk7XHJcbn1cclxuXHJcbmFyZUFsbEFwcHJvdmVyc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiAoXHJcbiAgICB0aGlzLnVzZXJMaXN0Lmxlbmd0aCA+IDAgJiZcclxuICAgIHRoaXMuc2VsZWN0ZWRBcHByb3ZlZEJ5Lmxlbmd0aCA9PT0gdGhpcy51c2VyTGlzdC5sZW5ndGhcclxuICApO1xyXG59XHJcblxyXG5vbkFwcHJvdmVyU2VsZWN0QWxsKGV2ZW50OiBFdmVudCkge1xyXG4gIGNvbnN0IGNoZWNrYm94ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcblxyXG4gIGlmIChjaGVja2JveC5jaGVja2VkKSB7XHJcbiAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgIGFwcHJvdmVkQnk6IHRoaXMudXNlckxpc3QubWFwKCh1OmFueSkgPT4gdS5lbWFpbCksXHJcbiAgICB9KTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5maWx0ZXJGb3JtLnBhdGNoVmFsdWUoeyBhcHByb3ZlZEJ5OiBbXSB9KTtcclxuICB9XHJcbn1cclxuXHJcbm9uUmVzZXQoKTogdm9pZCB7XHJcbiAgdGhpcy5maWx0ZXJGb3JtLnJlc2V0KHtcclxuICAgIHN0YXR1czogW10sXHJcbiAgICByZXZpZXdlckNvbmRpdGlvbjogbnVsbCxcclxuICAgIHJldmlld2VyRnJvbTogbnVsbCxcclxuICAgIHJldmlld2VyVG86IG51bGwsXHJcblxyXG4gICAgYXBwcm92ZXJDb25kaXRpb246IG51bGwsXHJcbiAgICBhcHByb3ZlckZyb206IG51bGwsXHJcbiAgICBhcHByb3ZlclRvOiBudWxsLFxyXG5cclxuICAgIHRhbmdvQ29uZGl0aW9uOiBudWxsLFxyXG4gICAgdGFuZ29Gcm9tOiBudWxsLFxyXG4gICAgdGFuZ29UbzogbnVsbCxcclxuXHJcbiAgICByZXZpZXdlZEJ5OiBbXSxcclxuICAgIGFwcHJvdmVkQnk6IFtdXHJcbiAgfSk7XHJcblxyXG4gIC8vIDLvuI/ig6MgUmVzZXQgc2VhcmNoIHRlcm1zXHJcbiAgdGhpcy5yZXZpZXdlclNlYXJjaFRlcm0gPSAnJztcclxuICB0aGlzLmFwcHJvdmVyU2VhcmNoVGVybSA9ICcnO1xyXG5cclxuICAvLyAz77iP4oOjIEJ1aWxkIGVtcHR5IHBheWxvYWQgdG8gc2VuZCBiYWNrXHJcbiAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgIGZpbHRlckJ5U3RhdHVzOiBbXSxcclxuICAgIGZpbHRlckJ5UmV2aWV3ZXI6IG51bGwsXHJcbiAgICBmaWx0ZXJCeUFwcHJvdmVyOiBudWxsLFxyXG4gICAgZmlsdGVyQnlUYW5nbzogbnVsbCxcclxuICAgIGZpbHRlckJ5UmV2aWV3ZWRCeTogW10sXHJcbiAgICBmaWxldGVyQnlBcHByb3ZlZEJ5OiBbXVxyXG4gIH07XHJcblxyXG4gIC8vIDTvuI/ig6MgRW1pdCB0aGUgbm93LWVtcHR5IGZpbHRlciByZXN1bHRcclxuICB0aGlzLmFwcGx5LmVtaXQocGF5bG9hZCk7XHJcblxyXG4gIC8vIDXvuI/ig6MgQ2xvc2UgdGhlIGZpbHRlciBwYW5lbFxyXG4gIHRoaXMuY2xvc2UoKTtcclxufVxyXG5cclxucHJpdmF0ZSBtYXBBY2N1cmFjeShcclxuICBjb25kaXRpb246IENvbmRpdGlvbiB8IG51bGwsXHJcbiAgZnJvbTogbnVtYmVyIHwgbnVsbCxcclxuICB0bzogbnVtYmVyIHwgbnVsbFxyXG4pOiBzdHJpbmcgfCBudWxsIHtcclxuXHJcbiAgLy8gbm90aGluZyBzZWxlY3RlZFxyXG4gIGlmICghY29uZGl0aW9uIHx8IGZyb20gPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcblxyXG4gIC8vIFwiYmV0d2VlblwiIOKGkiBcIjkwIHRvIDEwMFwiXHJcbiAgaWYgKGNvbmRpdGlvbiA9PT0gJ2JldHdlZW4nKSB7XHJcbiAgICBpZiAodG8gPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gYCR7ZnJvbX0gdG8gJHt0b31gO1xyXG4gIH1cclxuXHJcbiAgLy8gb3RoZXIgY29uZGl0aW9ucyAoZ3QsIGx0LCBndGUsIGx0ZSlcclxuICBjb25zdCBvcE1hcDogUmVjb3JkPENvbmRpdGlvbiwgc3RyaW5nPiA9IHtcclxuICAgIGd0OiAnPicsXHJcbiAgICBsdDogJzwnLFxyXG4gICAgZ3RlOiAnPj0nLFxyXG4gICAgbHRlOiAnPD0nLFxyXG4gICAgYmV0d2VlbjogJycsIC8vIGFscmVhZHkgaGFuZGxlZCBhYm92ZVxyXG4gIH07XHJcblxyXG4gIHJldHVybiBgJHtvcE1hcFtjb25kaXRpb25dfSAke2Zyb219YDsgIC8vIGUuZy4gXCI+PSA5MFwiXHJcbn1cclxuXHJcbiAgb25BcHBseSgpOiB2b2lkIHtcclxuXHJcbiAgIGNvbnN0IHJhdyA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZTtcclxuXHJcbiAgY29uc3QgcmV2aWV3ZXJTdHIgPSB0aGlzLm1hcEFjY3VyYWN5KHJhdy5yZXZpZXdlckNvbmRpdGlvbiwgcmF3LnJldmlld2VyRnJvbSwgcmF3LnJldmlld2VyVG8pO1xyXG4gIGNvbnN0IGFwcHJvdmVyU3RyID0gdGhpcy5tYXBBY2N1cmFjeShyYXcuYXBwcm92ZXJDb25kaXRpb24sIHJhdy5hcHByb3ZlckZyb20sIHJhdy5hcHByb3ZlclRvKTtcclxuICBjb25zdCB0YW5nb1N0ciAgICA9IHRoaXMubWFwQWNjdXJhY3kocmF3LnRhbmdvQ29uZGl0aW9uLCByYXcudGFuZ29Gcm9tLCByYXcudGFuZ29Ubyk7XHJcblxyXG4gIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICBmaWx0ZXJCeVN0YXR1czogcmF3LnN0YXR1cyB8fCBbXSxcclxuXHJcbiAgICBmaWx0ZXJCeVJldmlld2VyOiByZXZpZXdlclN0cixcclxuICAgIGZpbHRlckJ5QXBwcm92ZXI6IGFwcHJvdmVyU3RyLFxyXG4gICAgZmlsdGVyQnlUYW5nbzogdGFuZ29TdHIsXHJcblxyXG4gICAgZmlsdGVyQnlSZXZpZXdlZEJ5OiByYXcucmV2aWV3ZWRCeSB8fCBbXSwgICAgICAgIFxyXG4gICAgZmlsZXRlckJ5QXBwcm92ZWRCeTogcmF3LmFwcHJvdmVkQnkgfHwgW10sICAgICAgICBcclxuICB9O1xyXG4gIHRoaXMuYXBwbHkuZW1pdChwYXlsb2FkKTtcclxuICB0aGlzLmNsb3NlKCk7XHJcbiAgICB0aGlzLnNob3dQYW5lbCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbmRyb3Bkb3duU3RhdGUgPSB7XHJcbiAgc3RhdHVzOiBmYWxzZSxcclxuICByZXZpZXdlcjogZmFsc2UsXHJcbiAgYXBwcm92ZXI6IGZhbHNlXHJcbn07XHJcbi8vIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcclxuY2xvc2VBbGwoKSB7XHJcbiAgdGhpcy5kcm9wZG93blN0YXRlLnN0YXR1cyA9IGZhbHNlO1xyXG4gIHRoaXMuZHJvcGRvd25TdGF0ZS5yZXZpZXdlciA9IGZhbHNlO1xyXG4gIHRoaXMuZHJvcGRvd25TdGF0ZS5hcHByb3ZlciA9IGZhbHNlO1xyXG59XHJcblxyXG50b2dnbGVEcm9wZG93bih0eXBlOiAnc3RhdHVzJyB8ICdyZXZpZXdlcicgfCAnYXBwcm92ZXInLCBldmVudDogTW91c2VFdmVudCkge1xyXG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAvLyBDbG9zZSBhbGwgYmVmb3JlIG9wZW5pbmcgYSBuZXcgb25lXHJcbiAgdGhpcy5jbG9zZUFsbCgpO1xyXG5cclxuICAvLyBUb2dnbGUgb25seSB0aGUgc2VsZWN0ZWQgb25lXHJcbiAgdGhpcy5kcm9wZG93blN0YXRlW3R5cGVdID0gIXRoaXMuZHJvcGRvd25TdGF0ZVt0eXBlXTtcclxufVxyXG5cclxuaXNEcm9wZG93bk9wZW4odHlwZTogJ3N0YXR1cycgfCAncmV2aWV3ZXInIHwgJ2FwcHJvdmVyJykge1xyXG4gIHJldHVybiB0aGlzLmRyb3Bkb3duU3RhdGVbdHlwZV07XHJcbn1cclxufVxyXG4iLCI8IS0tIHRpY2tldC1maWx0ZXItcGFuZWwuY29tcG9uZW50Lmh0bWwgLS0+XHJcbjxkaXYgY2xhc3M9XCJmaWx0ZXItd3JhcHBlclwiICpuZ0lmPVwiaXNPcGVuXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZpbHRlci1jYXJkXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWhlYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5GaWx0ZXIgT3B0aW9uczwvZGl2PlxyXG4gICAgICA8IS0tIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgKGNsaWNrKT1cImNsb3NlKClcIj7inJU8L2J1dHRvbj4gLS0+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIj5cclxuICAgICAgPCEtLSBTdGF0dXMgLS0+XHJcbjxkaXYgY2xhc3M9XCJtYi0zIHBvc2l0aW9uLXJlbGF0aXZlXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5TdGF0dXM8L2xhYmVsPlxyXG5cclxuICA8IS0tIEhlYWRlciAvIHRyaWdnZXIgLS0+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJzdGF0dXMtc2VsZWN0IGJvcmRlciByb3VuZGVkIHB4LTMgcHktMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bignc3RhdHVzJywgJGV2ZW50KVwiXHJcbiAgPlxyXG4gICAgPHNwYW4gKm5nSWY9XCIhc2VsZWN0ZWRTdGF0dXNlcy5sZW5ndGhcIj5TZWxlY3Q8L3NwYW4+XHJcblxyXG4gICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RlZFN0YXR1c2VzLmxlbmd0aCA9PT0gMVwiPlxyXG4gICAgICB7eyBzZWxlY3RlZFN0YXR1c2VzWzBdIH19XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RlZFN0YXR1c2VzLmxlbmd0aCA+IDFcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgPHNwYW4+e3sgc2VsZWN0ZWRTdGF0dXNlc1swXSB9fTwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBtcy0yXCI+XHJcbiAgICAgICAgK3t7IHNlbGVjdGVkU3RhdHVzZXMubGVuZ3RoIC0gMSB9fVxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIERST1BET1dOIFBBTkVMIChPVkVSTEFZKSAtLT5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cInN0YXR1cy1kcm9wZG93biBwb3NpdGlvbi1hYnNvbHV0ZSB3LTEwMCBtdC0xIGJvcmRlciByb3VuZGVkIHAtMSBiZy13aGl0ZVwiXHJcbiAgICBzdHlsZT1cInotaW5kZXg6IDEwMDA7IG1heC1oZWlnaHQ6IDIyMHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiXHJcbiAgICpuZ0lmPVwiaXNEcm9wZG93bk9wZW4oJ3N0YXR1cycpXCJcclxuICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gID5cclxuICAgIDwhLS0gU2VsZWN0IEFsbCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIHB4LTAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XHJcbiAgICAgIDxpbnB1dFxyXG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IFwiXHJcbiAgICAgICAgaWQ9XCJzdGF0dXMtc2VsZWN0LWFsbFwiXHJcbiAgICAgICAgW2NoZWNrZWRdPVwiYXJlQWxsU3RhdHVzZXNTZWxlY3RlZCgpXCJcclxuICAgICAgICAoY2hhbmdlKT1cIm9uU3RhdHVzU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAvPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIHRleHQtZGFyayBtcy0yXCIgZm9yPVwic3RhdHVzLXNlbGVjdC1hbGxcIj5cclxuICAgICAgICBTZWxlY3QgQWxsXHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPCEtLSBPcHRpb25zIC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImZvcm0tY2hlY2sgcHgtMCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTFcIlxyXG4gICAgICAqbmdGb3I9XCJsZXQgcyBvZiBzdGF0dXNPcHRpb25zXCJcclxuICAgID5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgXCJcclxuICAgICAgICBbaWRdPVwiJ3N0YXR1cy0nICsgc1wiXHJcbiAgICAgICAgW2NoZWNrZWRdPVwiaXNTdGF0dXNTZWxlY3RlZChzKVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJvblN0YXR1c0NoYW5nZSgkZXZlbnQsIHMpXCJcclxuICAgICAgLz5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCB0ZXh0LWRhcmsgbXMtMlwiIFtmb3JdPVwiJ3N0YXR1cy0nICsgc1wiPlxyXG4gICAgICAgIHt7IHMgfX1cclxuICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcblxyXG5cclxuICAgICAgPCEtLSBSZXZpZXdlciBhY2N1cmFjeSAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdJZj1cInNob3dSZXZpZXdlckFjY3VyYWN5XCIgKGNsaWNrKT1cImNsb3NlQWxsKClcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UmV2aWV3ZXIgYWNjdXJhY3kgKCUpIGJ5IGNvbmRpdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxyXG4gICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IHctMTAwXCIgZm9ybUNvbnRyb2xOYW1lPVwicmV2aWV3ZXJDb25kaXRpb25cIj5cclxuICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+U2VsZWN0PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGMgb2YgY29uZGl0aW9uT3B0aW9uc1wiIFtuZ1ZhbHVlXT1cImMudmFsdWVcIj5cclxuICAgICAgICAgICAgICB7eyBjLmxhYmVsIH19XHJcbiAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgPC9zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgPCEtLSBvbmUgb3IgdHdvIGlucHV0cyAtLT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0JldHdlZW4oJ3Jldmlld2VyQ29uZGl0aW9uJyk7IGVsc2Ugc2luZ2xlUmV2aWV3ZXJcIj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgbWluPVwiMVwiXHJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmV2aWV3ZXJGcm9tXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZyb21cIiAoaW5wdXQpPVwibGltaXRWYWx1ZSgkZXZlbnQsICdyZXZpZXdlckZyb20nKVwiIC8+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgIG1pbj1cIjFcIlxyXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJldmlld2VyVG9cIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVG9cIiAoaW5wdXQpPVwibGltaXRWYWx1ZSgkZXZlbnQsICdyZXZpZXdlclRvJylcIiAvPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3NpbmdsZVJldmlld2VyPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICBtaW49XCIxXCJcclxuICAgICAgICAgICAgICBtYXg9XCIxMDBcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZXZpZXdlckZyb21cIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMSB0byAxMDAlXCIgKGlucHV0KT1cImxpbWl0VmFsdWUoJGV2ZW50LCAncmV2aWV3ZXJGcm9tJylcIiAvPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIEFwcHJvdmVyIGFjY3VyYWN5IC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItM1wiICpuZ0lmPVwic2hvd0FwcHJvdmVyQWNjdXJhY3lcIiAoY2xpY2spPVwiY2xvc2VBbGwoKVwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5BcHByb3ZlciBhY2N1cmFjeSAoJSkgYnkgY29uZGl0aW9uPC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3Qgdy0xMDBcIiBmb3JtQ29udHJvbE5hbWU9XCJhcHByb3ZlckNvbmRpdGlvblwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj5TZWxlY3Q8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYyBvZiBjb25kaXRpb25PcHRpb25zXCIgW25nVmFsdWVdPVwiYy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgIHt7IGMubGFiZWwgfX1cclxuICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICA8L3NlbGVjdD5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNCZXR3ZWVuKCdhcHByb3ZlckNvbmRpdGlvbicpOyBlbHNlIHNpbmdsZUFwcHJvdmVyXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgIG1pbj1cIjFcIlxyXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFwcHJvdmVyRnJvbVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGcm9tXCIgXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cImxpbWl0VmFsdWUoJGV2ZW50LCAnYXBwcm92ZXJGcm9tJylcIi8+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgIG1pbj1cIjFcIlxyXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFwcHJvdmVyVG9cIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVG9cIiAoaW5wdXQpPVwibGltaXRWYWx1ZSgkZXZlbnQsICdhcHByb3ZlclRvJylcIiAvPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3NpbmdsZUFwcHJvdmVyPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICBtaW49XCIxXCJcclxuICAgICAgICAgICAgICBtYXg9XCIxMDBcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhcHByb3ZlckZyb21cIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMSB0byAxMDAlXCIgKGlucHV0KT1cImxpbWl0VmFsdWUoJGV2ZW50LCAnYXBwcm92ZXJGcm9tJylcIiAvPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIFRhbmdvIGFjY3VyYWN5IC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItM1wiICpuZ0lmPVwic2hvd1RhbmdvQWNjdXJhY3lcIiAoY2xpY2spPVwiY2xvc2VBbGwoKVwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5UYW5nbyBhY2N1cmFjeSAoJSkgYnkgY29uZGl0aW9uPC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XHJcbiAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3Qgdy0xMDBcIiBmb3JtQ29udHJvbE5hbWU9XCJ0YW5nb0NvbmRpdGlvblwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj5TZWxlY3Q8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYyBvZiBjb25kaXRpb25PcHRpb25zXCIgW25nVmFsdWVdPVwiYy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgIHt7IGMubGFiZWwgfX1cclxuICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICA8L3NlbGVjdD5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNCZXR3ZWVuKCd0YW5nb0NvbmRpdGlvbicpOyBlbHNlIHNpbmdsZVRhbmdvXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgIG1pbj1cIjFcIlxyXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRhbmdvRnJvbVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGcm9tXCIgKGlucHV0KT1cImxpbWl0VmFsdWUoJGV2ZW50LCAndGFuZ29Gcm9tJylcIiAvPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICBtaW49XCIxXCJcclxuICAgICAgICAgICAgICBtYXg9XCIxMDBcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0YW5nb1RvXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlRvXCIgKGlucHV0KT1cImxpbWl0VmFsdWUoJGV2ZW50LCAndGFuZ29UbycpXCIgLz5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGVUYW5nbz5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgbWluPVwiMVwiXHJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGFuZ29Gcm9tXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjEgdG8gMTAwJVwiIChpbnB1dCk9XCJsaW1pdFZhbHVlKCRldmVudCwgJ3RhbmdvRnJvbScpXCIgLz5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG48ZGl2XHJcbiAgY2xhc3M9XCJtYi0zIHBvc2l0aW9uLXJlbGF0aXZlXCJcclxuICAqbmdJZj1cInNob3dSZXZpZXdlZEJ5XCJcclxuICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuPlxyXG4gIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5SZXZpZXdlZCBieTwvbGFiZWw+XHJcblxyXG4gIDwhLS0gVHJpZ2dlciAvIGRpc3BsYXkgLS0+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJib3JkZXIgcm91bmRlZCBweC0zIHB5LTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJ3Jldmlld2VyJywgJGV2ZW50KVwiXHJcbiAgPlxyXG4gICAgPCEtLSAwIHNlbGVjdGVkIC0tPlxyXG4gICAgPHNwYW4gKm5nSWY9XCIhc2VsZWN0ZWRSZXZpZXdlZEJ5Lmxlbmd0aFwiPlxyXG4gICAgICBTZWxlY3RcclxuICAgIDwvc3Bhbj5cclxuXHJcbiAgICA8IS0tIDEgc2VsZWN0ZWQgLS0+XHJcbiAgICA8c3BhbiAqbmdJZj1cInNlbGVjdGVkUmV2aWV3ZWRCeS5sZW5ndGggPT09IDFcIj5cclxuICAgICAge3sgc2VsZWN0ZWRSZXZpZXdlZEJ5WzBdIH19XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPCEtLSA+MSBzZWxlY3RlZCAtLT5cclxuICAgIDxzcGFuXHJcbiAgICAgICpuZ0lmPVwic2VsZWN0ZWRSZXZpZXdlZEJ5Lmxlbmd0aCA+IDFcIlxyXG4gICAgICBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgPlxyXG4gICAgICA8c3Bhbj57eyBzZWxlY3RlZFJldmlld2VkQnlbMF0gfX08L3NwYW4+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgbXMtMlwiPlxyXG4gICAgICAgICt7eyBzZWxlY3RlZFJldmlld2VkQnkubGVuZ3RoIC0gMSB9fVxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9kaXY+XHJcblxyXG48ZGl2XHJcbiAgKm5nSWY9XCJpc0Ryb3Bkb3duT3BlbigncmV2aWV3ZXInKVwiXHJcbiAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSB3LTEwMCBib3JkZXIgcm91bmRlZCBiZy13aGl0ZSBwLTEgbXQtMVwiXHJcbiAgc3R5bGU9XCJ6LWluZGV4OiAxMDAwOyBtYXgtaGVpZ2h0OiAyMjBweDsgb3ZlcmZsb3cteTogYXV0bztcIlxyXG4gIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4+XHJcblxyXG4gIDwhLS0g8J+UjSBTZWFyY2ggYm94IC0tPlxyXG4gIDwhLS0gPGRpdiBjbGFzcz1cIm1iLTIgcHgtMFwiPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCJcclxuICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYnkgZW1haWxcIlxyXG4gICAgICBbKG5nTW9kZWwpXT1cInJldmlld2VyU2VhcmNoVGVybVwiXHJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgLz5cclxuICA8L2Rpdj4gLS0+XHJcblxyXG4gIDwhLS0gU2VsZWN0IEFsbCAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBweC0wIG1iLTIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiXHJcbiAgICAgIGlkPVwicmV2aWV3ZXItYWxsXCJcclxuICAgICAgW2NoZWNrZWRdPVwiYXJlQWxsUmV2aWV3ZXJzU2VsZWN0ZWQoKVwiXHJcbiAgICAgIChjaGFuZ2UpPVwib25SZXZpZXdlclNlbGVjdEFsbCgkZXZlbnQpXCJcclxuICAgIC8+XHJcbiAgICA8bGFiZWwgZm9yPVwicmV2aWV3ZXItYWxsXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIHRleHQtZGFyayBtcy0yXCI+XHJcbiAgICAgIFNlbGVjdCBBbGxcclxuICAgIDwvbGFiZWw+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gT3B0aW9ucyDigJMgbm93IHVzZSBnZXR0ZXIgZmlsdGVyZWRSZXZpZXdlckxpc3QgLS0+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJmb3JtLWNoZWNrIG1iLTEgcHgtMCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICpuZ0Zvcj1cImxldCB1IG9mIGZpbHRlcmVkUmV2aWV3ZXJMaXN0XCJcclxuICA+XHJcbiAgICA8aW5wdXRcclxuICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgW2lkXT1cIidyZXYtJyArIHUuZW1haWxcIlxyXG4gICAgICBbY2hlY2tlZF09XCJpc1Jldmlld2VyU2VsZWN0ZWQodS5lbWFpbClcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uUmV2aWV3ZXJDaGFuZ2UoJGV2ZW50LCB1LmVtYWlsKVwiXHJcbiAgICAvPlxyXG4gICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCB0ZXh0LWRhcmsgbXMtMlwiIFtmb3JdPVwiJ3Jldi0nICsgdS5lbWFpbFwiPlxyXG4gICAgICB7eyB1LmVtYWlsIH19XHJcbiAgICA8L2xhYmVsPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcblxyXG48L2Rpdj5cclxuXHJcblxyXG4gICAgICA8IS0tIEFwcHJvdmVkIEJ5IC0tPlxyXG48ZGl2XHJcbiAgY2xhc3M9XCJtYi0zIHBvc2l0aW9uLXJlbGF0aXZlXCJcclxuICAqbmdJZj1cInNob3dBcHByb3ZlZEJ5XCJcclxuICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuPlxyXG4gIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5BcHByb3ZlZCBieTwvbGFiZWw+XHJcblxyXG4gIDwhLS0gVHJpZ2dlciAvIGRpc3BsYXkgLS0+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJib3JkZXIgcm91bmRlZCBweC0zIHB5LTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJ2FwcHJvdmVyJywgJGV2ZW50KVwiXHJcbiAgPlxyXG4gICAgPCEtLSAwIHNlbGVjdGVkIC0tPlxyXG4gICAgPHNwYW4gKm5nSWY9XCIhc2VsZWN0ZWRBcHByb3ZlZEJ5Lmxlbmd0aFwiPlxyXG4gICAgICBTZWxlY3RcclxuICAgIDwvc3Bhbj5cclxuXHJcbiAgICA8IS0tIDEgc2VsZWN0ZWQgLS0+XHJcbiAgICA8c3BhbiAqbmdJZj1cInNlbGVjdGVkQXBwcm92ZWRCeS5sZW5ndGggPT09IDFcIj5cclxuICAgICAge3sgc2VsZWN0ZWRBcHByb3ZlZEJ5WzBdIH19XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPCEtLSA+MSBzZWxlY3RlZCAtLT5cclxuICAgIDxzcGFuXHJcbiAgICAgICpuZ0lmPVwic2VsZWN0ZWRBcHByb3ZlZEJ5Lmxlbmd0aCA+IDFcIlxyXG4gICAgICBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgPlxyXG4gICAgICA8c3Bhbj57eyBzZWxlY3RlZEFwcHJvdmVkQnlbMF0gfX08L3NwYW4+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgbXMtMlwiPlxyXG4gICAgICAgICt7eyBzZWxlY3RlZEFwcHJvdmVkQnkubGVuZ3RoIC0gMSB9fVxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gIDwvZGl2PlxyXG48IS0tIERyb3Bkb3duIHBhbmVsIC0tPlxyXG48ZGl2XHJcbiAqbmdJZj1cImlzRHJvcGRvd25PcGVuKCdhcHByb3ZlcicpXCJcclxuICBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIHctMTAwIGJvcmRlciByb3VuZGVkIGJnLXdoaXRlIHAtMSBtdC0xXCJcclxuICBzdHlsZT1cInotaW5kZXg6IDEwMDA7IG1heC1oZWlnaHQ6IDIyMHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiXHJcbiAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbj5cclxuXHJcbiAgPCEtLSDwn5SNIFNlYXJjaCBib3ggLS0+XHJcbiAgPCEtLSA8ZGl2IGNsYXNzPVwibWItMiBweC0wXCI+XHJcbiAgICA8aW5wdXRcclxuICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIlxyXG4gICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBieSBlbWFpbFwiXHJcbiAgICAgIFtuZ01vZGVsXT1cImFwcHJvdmVyU2VhcmNoVGVybVwiXHJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uUmV2aWV3ZXJTZWFyY2goJGV2ZW50KVwiXHJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgLz5cclxuICA8L2Rpdj4gLS0+XHJcblxyXG4gIDwhLS0gU2VsZWN0IEFsbCAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBweC0wIG1iLTIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiXHJcbiAgICAgIGlkPVwicmV2aWV3ZXItYWxsXCJcclxuICAgICAgW2NoZWNrZWRdPVwiYXJlQWxsUmV2aWV3ZXJzU2VsZWN0ZWQoKVwiXHJcbiAgICAgIChjaGFuZ2UpPVwib25SZXZpZXdlclNlbGVjdEFsbCgkZXZlbnQpXCJcclxuICAgIC8+XHJcbiAgICA8bGFiZWwgZm9yPVwicmV2aWV3ZXItYWxsXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIHRleHQtZGFyayBtcy0yXCI+XHJcbiAgICAgIFNlbGVjdCBBbGxcclxuICAgIDwvbGFiZWw+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gT3B0aW9ucyAodXNlIGZpbHRlcmVkUmV2aWV3ZXJMaXN0IGluc3RlYWQgb2YgdXNlckxpc3QpIC0tPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiZm9ybS1jaGVjayBtYi0xIHB4LTAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAqbmdGb3I9XCJsZXQgdSBvZiBmaWx0ZXJlZEFwcHJvdmVyTGlzdFwiXHJcbiAgPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiXHJcbiAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgIFtpZF09XCIncmV2LScgKyB1LmVtYWlsXCJcclxuICAgICAgW2NoZWNrZWRdPVwiaXNSZXZpZXdlclNlbGVjdGVkKHUuZW1haWwpXCJcclxuICAgICAgKGNoYW5nZSk9XCJvblJldmlld2VyQ2hhbmdlKCRldmVudCwgdS5lbWFpbClcIlxyXG4gICAgLz5cclxuICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgdGV4dC1kYXJrIG1zLTJcIiBbZm9yXT1cIidyZXYtJyArIHUuZW1haWxcIj5cclxuICAgICAge3sgdS5lbWFpbCB9fVxyXG4gICAgPC9sYWJlbD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG4gIDwhLS0gRHJvcGRvd24gcGFuZWwgLS0+XHJcblxyXG48L2Rpdj5cclxuXHJcblxyXG4gICAgICA8IS0tIEZvb3RlciBidXR0b25zIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHctMTAwIG10LTRcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTUwIG1lLTFcIiAoY2xpY2spPVwib25SZXNldCgpXCI+XHJcbiAgICAgICAgICBSZXNldFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctNTAgbXMtMVwiIChjbGljayk9XCJvbkFwcGx5KClcIj5cclxuICAgICAgICAgIEFwcGx5XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|