tango-app-ui-manage-tickets 3.7.0-beta.4 → 3.7.0-beta.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/audit-mapping-list/audit-mapping-list.component.mjs +486 -0
- package/esm2022/lib/components/audit-report-popup/audit-report-popup.component.mjs +358 -0
- package/esm2022/lib/components/audit-retag/audit-retag.component.mjs +457 -0
- package/esm2022/lib/components/custom-select/custom-select.component.mjs +174 -0
- package/esm2022/lib/components/filter-options/filter-options.component.mjs +41 -0
- package/esm2022/lib/components/footfall-dic/footfall-dic.component.mjs +374 -196
- package/esm2022/lib/components/footfall-dicview/footfall-dicview.component.mjs +1014 -0
- package/esm2022/lib/components/footfall-popup/footfall-popup.component.mjs +15 -0
- package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +3 -3
- package/esm2022/lib/components/remove-audit/remove-audit.component.mjs +80 -0
- package/esm2022/lib/components/start-audit/start-audit.component.mjs +742 -0
- package/esm2022/lib/components/tango-manage-tickets/tango-manage-tickets.component.mjs +7 -3
- package/esm2022/lib/components/ticket-footfall-new/ticket-footfall-new.component.mjs +2214 -0
- package/esm2022/lib/components/ticketclosepopup/ticketclosepopup.component.mjs +43 -0
- package/esm2022/lib/components/tickets/tickets.component.mjs +62 -8
- package/esm2022/lib/components/viewcategory/viewcategory.component.mjs +89 -0
- package/esm2022/lib/services/audit.service.mjs +88 -0
- package/esm2022/lib/services/ticket.service.mjs +128 -33
- package/esm2022/lib/services/timer.service.mjs +84 -0
- package/esm2022/lib/tango-manage-tickets-routing.module.mjs +22 -2
- package/esm2022/lib/tango-manage-tickets.module.mjs +57 -5
- package/fesm2022/tango-app-ui-manage-tickets.mjs +6466 -312
- package/fesm2022/tango-app-ui-manage-tickets.mjs.map +1 -1
- package/lib/components/audit-mapping-list/audit-mapping-list.component.d.ts +73 -0
- package/lib/components/audit-metrics/audit-metrics.component.d.ts +1 -1
- package/lib/components/audit-report-popup/audit-report-popup.component.d.ts +47 -0
- package/lib/components/audit-retag/audit-retag.component.d.ts +59 -0
- package/lib/components/custom-select/custom-select.component.d.ts +34 -0
- package/lib/components/filter-options/filter-options.component.d.ts +15 -0
- package/lib/components/footfall-dic/footfall-dic.component.d.ts +23 -8
- package/lib/components/footfall-dicview/footfall-dicview.component.d.ts +132 -0
- package/lib/components/footfall-popup/footfall-popup.component.d.ts +8 -0
- package/lib/components/remove-audit/remove-audit.component.d.ts +16 -0
- package/lib/components/start-audit/start-audit.component.d.ts +86 -0
- package/lib/components/tango-manage-tickets/tango-manage-tickets.component.d.ts +1 -0
- package/lib/components/ticket-footfall-new/ticket-footfall-new.component.d.ts +256 -0
- package/lib/components/ticketclosepopup/ticketclosepopup.component.d.ts +15 -0
- package/lib/components/tickets/tickets.component.d.ts +4 -0
- package/lib/components/viewcategory/viewcategory.component.d.ts +16 -0
- package/lib/services/audit.service.d.ts +36 -0
- package/lib/services/ticket.service.d.ts +25 -7
- package/lib/services/timer.service.d.ts +22 -0
- package/lib/tango-manage-tickets.module.d.ts +21 -5
- package/package.json +1 -1
|
@@ -0,0 +1,2214 @@
|
|
|
1
|
+
import { Component, EventEmitter, Output, HostListener, ViewChild, } from "@angular/core";
|
|
2
|
+
import { FootfallPopupComponent } from "../footfall-popup/footfall-popup.component";
|
|
3
|
+
import { Subject, takeUntil } from "rxjs";
|
|
4
|
+
import 'dayjs/locale/en';
|
|
5
|
+
import utc from 'dayjs/plugin/utc';
|
|
6
|
+
import timezone from 'dayjs/plugin/timezone';
|
|
7
|
+
import dayjs from 'dayjs';
|
|
8
|
+
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
|
9
|
+
import { TicketclosepopupComponent } from "../ticketclosepopup/ticketclosepopup.component";
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
12
|
+
import * as i2 from "tango-app-ui-global";
|
|
13
|
+
import * as i3 from "../../services/ticket.service";
|
|
14
|
+
import * as i4 from "../../services/excel.service";
|
|
15
|
+
import * as i5 from "tango-app-ui-shared";
|
|
16
|
+
import * as i6 from "@angular/forms";
|
|
17
|
+
import * as i7 from "@angular/router";
|
|
18
|
+
import * as i8 from "../../services/audit.service";
|
|
19
|
+
import * as i9 from "@angular/common";
|
|
20
|
+
import * as i10 from "ngx-daterangepicker-material";
|
|
21
|
+
import * as i11 from "../custom-select/custom-select.component";
|
|
22
|
+
dayjs.extend(utc);
|
|
23
|
+
dayjs.extend(timezone);
|
|
24
|
+
dayjs.extend(customParseFormat);
|
|
25
|
+
export class TicketFootfallNewComponent {
|
|
26
|
+
modalService;
|
|
27
|
+
gs;
|
|
28
|
+
service;
|
|
29
|
+
cd;
|
|
30
|
+
excelService;
|
|
31
|
+
ts;
|
|
32
|
+
fb;
|
|
33
|
+
router;
|
|
34
|
+
auditservice;
|
|
35
|
+
searchValue = "";
|
|
36
|
+
sortedColumn = "";
|
|
37
|
+
sortDirection = 1;
|
|
38
|
+
destroy$ = new Subject();
|
|
39
|
+
constructor(modalService, gs, service, cd, excelService, ts, fb, router, auditservice) {
|
|
40
|
+
this.modalService = modalService;
|
|
41
|
+
this.gs = gs;
|
|
42
|
+
this.service = service;
|
|
43
|
+
this.cd = cd;
|
|
44
|
+
this.excelService = excelService;
|
|
45
|
+
this.ts = ts;
|
|
46
|
+
this.fb = fb;
|
|
47
|
+
this.router = router;
|
|
48
|
+
this.auditservice = auditservice;
|
|
49
|
+
}
|
|
50
|
+
headerFilters;
|
|
51
|
+
footfallList_req;
|
|
52
|
+
usersDetails;
|
|
53
|
+
selectedStore;
|
|
54
|
+
selectedReviewer;
|
|
55
|
+
storeList = [];
|
|
56
|
+
dayjs = dayjs;
|
|
57
|
+
selectedDateRange = {};
|
|
58
|
+
arrowshow = true;
|
|
59
|
+
isCustomDate = (m) => {
|
|
60
|
+
const isValidDate = m > this.dayjs();
|
|
61
|
+
return isValidDate ? 'invalid-date' : false;
|
|
62
|
+
};
|
|
63
|
+
tooltip;
|
|
64
|
+
footfallcount = 0;
|
|
65
|
+
disableAudit = true;
|
|
66
|
+
internalticket;
|
|
67
|
+
ngOnInit() {
|
|
68
|
+
sessionStorage.clear();
|
|
69
|
+
this.imageUrl = this.service?.footfallCDN;
|
|
70
|
+
let userData = localStorage.getItem("user-info");
|
|
71
|
+
this.usersDetails = JSON.parse(userData);
|
|
72
|
+
this.gs.dataRangeValue?.pipe(takeUntil(this.destroy$))?.subscribe({
|
|
73
|
+
next: (data) => {
|
|
74
|
+
if (data) {
|
|
75
|
+
this.headerFilters = data;
|
|
76
|
+
this.footfallList_req = {
|
|
77
|
+
client: this.headerFilters.clients.toString(),
|
|
78
|
+
fromDate: this.headerFilters?.date?.startDate,
|
|
79
|
+
toDate: this.headerFilters?.date?.endDate,
|
|
80
|
+
};
|
|
81
|
+
this.viewTicket('store');
|
|
82
|
+
let payload = {
|
|
83
|
+
clientId: this.headerFilters.clients
|
|
84
|
+
};
|
|
85
|
+
const yesterday = this.dayjs().subtract(1, "days");
|
|
86
|
+
const formattedDate = {
|
|
87
|
+
startDate: yesterday.format("YYYY-MM-DD"),
|
|
88
|
+
endDate: yesterday.format("YYYY-MM-DD"),
|
|
89
|
+
};
|
|
90
|
+
this.selectedDateRange = {
|
|
91
|
+
startDate: yesterday.format("DD-MM-YYYY"),
|
|
92
|
+
endDate: yesterday.format("DD-MM-YYYY"),
|
|
93
|
+
};
|
|
94
|
+
this.service.getstoreList(payload).subscribe({
|
|
95
|
+
next: (e) => {
|
|
96
|
+
if (e) {
|
|
97
|
+
this.storeList = e.data.result;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
viewTicket(type) {
|
|
106
|
+
this.tangoType = type;
|
|
107
|
+
if (this.hasApproverAccess) {
|
|
108
|
+
this.getTicketSummary();
|
|
109
|
+
this.SelectedRole('approver');
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
if (type === 'store') {
|
|
113
|
+
this.getTicketSummary();
|
|
114
|
+
this.getTicketList(this.tangoType);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
this.getTicketSummary();
|
|
118
|
+
this.getTicketList(this.tangoType);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
areAllItemsReviewed(mapping) {
|
|
123
|
+
const revised = mapping?.revisedDetail || [];
|
|
124
|
+
if (!revised.length)
|
|
125
|
+
return false;
|
|
126
|
+
const itemsToCheck = [];
|
|
127
|
+
revised.forEach((detail) => {
|
|
128
|
+
// If duplicate parent → check its duplicateImage children
|
|
129
|
+
if (detail?.revopsType === 'duplicate' &&
|
|
130
|
+
detail?.isParent &&
|
|
131
|
+
Array.isArray(detail?.duplicateImage) &&
|
|
132
|
+
detail.duplicateImage.length) {
|
|
133
|
+
itemsToCheck.push(...detail.duplicateImage);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
// Normal item or non-parent duplicate
|
|
137
|
+
itemsToCheck.push(detail);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
// All must have review approved/rejected
|
|
141
|
+
return itemsToCheck.length > 0 && itemsToCheck.every(item => this.hasReviewDecision(item));
|
|
142
|
+
}
|
|
143
|
+
hasReviewDecision(item) {
|
|
144
|
+
const actions = item?.actions || [];
|
|
145
|
+
return actions.some((a) => a.actionType === 'review' &&
|
|
146
|
+
(a.action === 'approved' || a.action === 'rejected'));
|
|
147
|
+
}
|
|
148
|
+
selectedRole = '';
|
|
149
|
+
statusVal;
|
|
150
|
+
getHeaderStatus() {
|
|
151
|
+
const roleMapping = this.getCurrentRoleMapping();
|
|
152
|
+
this.statusVal = roleMapping;
|
|
153
|
+
if (roleMapping?.status) {
|
|
154
|
+
const allReviewed = this.areAllItemsReviewed(roleMapping);
|
|
155
|
+
if (roleMapping.status === 'In-Progress') {
|
|
156
|
+
this.closeBtn = true;
|
|
157
|
+
this.closeDisabled = !allReviewed;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
this.closeBtn = false;
|
|
161
|
+
this.closeDisabled = true;
|
|
162
|
+
}
|
|
163
|
+
return roleMapping.status; // e.g. "Open", "In-Progress", "Closed"
|
|
164
|
+
}
|
|
165
|
+
// Fallback: ticket status
|
|
166
|
+
this.closeBtn = false;
|
|
167
|
+
this.closeDisabled = true;
|
|
168
|
+
return this.ticketData?.status || '--';
|
|
169
|
+
}
|
|
170
|
+
approverClosed = false;
|
|
171
|
+
getCurrentRoleMapping() {
|
|
172
|
+
if (!this.footfallTicketsData || !this.footfallTicketsData.length) {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
let approverMapping = null;
|
|
176
|
+
let reviewerMapping = null;
|
|
177
|
+
let tangoMapping = null;
|
|
178
|
+
let hasClosedApprove = false; // 👈 track overall condition
|
|
179
|
+
for (const ticket of this.footfallTicketsData) {
|
|
180
|
+
const source = ticket?._source;
|
|
181
|
+
const mappingList = source?.mappingInfo || [];
|
|
182
|
+
for (const m of mappingList) {
|
|
183
|
+
// 👇 overall check for arrowshow (approve + Closed)
|
|
184
|
+
if (m?.type === 'approve' &&
|
|
185
|
+
m?.status?.toLowerCase() === 'closed') {
|
|
186
|
+
this.approverClosed = hasClosedApprove = true;
|
|
187
|
+
this.arrowshow = !hasClosedApprove;
|
|
188
|
+
}
|
|
189
|
+
if (m?.type === 'tangoreview' && m?.revisedDetail?.length) {
|
|
190
|
+
tangoMapping = m; // last tango wins
|
|
191
|
+
}
|
|
192
|
+
if (m?.type === 'approve' && m?.revisedDetail?.length) {
|
|
193
|
+
approverMapping = m; // last approve wins
|
|
194
|
+
}
|
|
195
|
+
if (m?.type === 'review' && m?.revisedDetail?.length) {
|
|
196
|
+
reviewerMapping = m; // last review wins
|
|
197
|
+
this.closeBtn = true;
|
|
198
|
+
this.closeDisabled = false;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// 👇 set arrowshow based on overall array result
|
|
203
|
+
// => false if any approve+Closed found, true otherwise
|
|
204
|
+
// 🔹 1) Tango has highest priority – if present, ignore others
|
|
205
|
+
if (tangoMapping) {
|
|
206
|
+
return tangoMapping;
|
|
207
|
+
}
|
|
208
|
+
// 🔹 2) Then approver / reviewer based on access
|
|
209
|
+
if (this.hasApproverAccess && approverMapping) {
|
|
210
|
+
return approverMapping;
|
|
211
|
+
}
|
|
212
|
+
if (this.hasReviewerAccess && reviewerMapping) {
|
|
213
|
+
return reviewerMapping;
|
|
214
|
+
}
|
|
215
|
+
// 🔹 3) Fallback if nothing found
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
datechange(event) {
|
|
219
|
+
if (event && event.startDate && event.endDate) {
|
|
220
|
+
if (this.dayjs(event.startDate).isValid() &&
|
|
221
|
+
this.dayjs(event.endDate).isValid()) {
|
|
222
|
+
this.selectedDateRange.startDate = event.startDate;
|
|
223
|
+
this.selectedDateRange.endDate = event.endDate;
|
|
224
|
+
var datetime = {
|
|
225
|
+
startDate: this.dayjs(event.startDate, "DD-MM-YYYY").format("YYYY-MM-DD"),
|
|
226
|
+
endDate: this.dayjs(event.endDate, "DD-MM-YYYY").format("YYYY-MM-DD"),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
getStatusBadgeClass(status) {
|
|
232
|
+
const map = {
|
|
233
|
+
'Open': 'badge-light-warning',
|
|
234
|
+
'In-Progress': 'badge-light-primary',
|
|
235
|
+
'Under tangoreview': 'badge-light-primary',
|
|
236
|
+
'Tango review done': 'badge-light-primary',
|
|
237
|
+
'Closed': 'badge-secondary',
|
|
238
|
+
'Pending': 'badge-light-warning',
|
|
239
|
+
'Reviewer-Closed': 'badge-light-warning',
|
|
240
|
+
'Rejected': 'badge-light-danger',
|
|
241
|
+
'Raised': 'badge-light-info'
|
|
242
|
+
};
|
|
243
|
+
return map[status] || 'badge-light-dark'; // fallback
|
|
244
|
+
}
|
|
245
|
+
getFootfallSummaryData;
|
|
246
|
+
getTicketSummary() {
|
|
247
|
+
this.service
|
|
248
|
+
.getTicketSummaryApi(this.footfallList_req.client, this.footfallList_req.fromDate, this.footfallList_req.toDate)
|
|
249
|
+
.pipe(takeUntil(this.destroy$))
|
|
250
|
+
.subscribe({
|
|
251
|
+
next: (res) => {
|
|
252
|
+
if (res && res?.data && res?.data?.result) {
|
|
253
|
+
this.getFootfallSummaryData = res?.data?.result;
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
this.getFootfallSummaryData = [];
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
error: (err) => {
|
|
260
|
+
this.getFootfallSummaryData = [];
|
|
261
|
+
},
|
|
262
|
+
complete: () => {
|
|
263
|
+
this.getFootfallSummaryData.length === 0;
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
this.cd.detectChanges();
|
|
267
|
+
}
|
|
268
|
+
offset = 0;
|
|
269
|
+
limit = 10;
|
|
270
|
+
isExport = false;
|
|
271
|
+
footfallListData;
|
|
272
|
+
totalItems;
|
|
273
|
+
paginationSizes = [10, 20, 30];
|
|
274
|
+
loading = true;
|
|
275
|
+
noData = false;
|
|
276
|
+
tangoType = "store";
|
|
277
|
+
getTicketList(type) {
|
|
278
|
+
console.log("🚀 ~ TicketFootfallNewComponent ~ getTicketList ~ type:", type);
|
|
279
|
+
this.loading = true;
|
|
280
|
+
this.noData = false;
|
|
281
|
+
this.searchValue = this.searchValue?.trim() || "";
|
|
282
|
+
this.offset = this.offset || 1;
|
|
283
|
+
this.limit = this.limit || 10;
|
|
284
|
+
this.isExport = false;
|
|
285
|
+
let permissionType = null;
|
|
286
|
+
if (this.usersDetails?.userType !== 'tango') {
|
|
287
|
+
permissionType =
|
|
288
|
+
this.hasApproverAccess && this.selectedRole === 'approver'
|
|
289
|
+
? 'approve'
|
|
290
|
+
: this.hasReviewerAccess && this.selectedRole === 'reviewer'
|
|
291
|
+
? 'review'
|
|
292
|
+
: null;
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
// if tango user also needs a permissionType:
|
|
296
|
+
permissionType = '';
|
|
297
|
+
}
|
|
298
|
+
this.service.getTicketListApi(this.footfallList_req?.client, this.footfallList_req?.fromDate, this.footfallList_req?.toDate, this.searchValue, this.limit, this.offset, this.isExport, this.sortedColumn, this.sortDirection, type, permissionType).pipe(takeUntil(this.destroy$))
|
|
299
|
+
.subscribe({
|
|
300
|
+
next: (res) => {
|
|
301
|
+
if (res && res.code === 200) {
|
|
302
|
+
this.noData = false;
|
|
303
|
+
this.loading = false;
|
|
304
|
+
this.footfallListData = res?.data?.result;
|
|
305
|
+
if (this.footfallListData.length > 0) {
|
|
306
|
+
this.generateColumns(this.footfallListData[0]);
|
|
307
|
+
}
|
|
308
|
+
this.totalItems = res?.data?.count;
|
|
309
|
+
if (this.totalItems < 10) {
|
|
310
|
+
this.paginationSizes = [this.totalItems];
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
this.paginationSizes = [10, 20, 30];
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
this.totalItems = 0;
|
|
318
|
+
this.noData = true;
|
|
319
|
+
this.loading = false;
|
|
320
|
+
this.footfallListData = [];
|
|
321
|
+
}
|
|
322
|
+
this.cd.detectChanges();
|
|
323
|
+
},
|
|
324
|
+
error: (err) => {
|
|
325
|
+
this.noData = true;
|
|
326
|
+
this.loading = false;
|
|
327
|
+
},
|
|
328
|
+
complete: () => {
|
|
329
|
+
this.loading = false;
|
|
330
|
+
},
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
tableColumns = [];
|
|
334
|
+
labelOverrides = {
|
|
335
|
+
ticketId: 'Ticket ID',
|
|
336
|
+
storeName: 'Store Name',
|
|
337
|
+
storeId: 'Store ID',
|
|
338
|
+
storeRevisedAccuracy: 'Store (Accuracy%)',
|
|
339
|
+
reviewerRevisedAccuracy: 'Reviewer (Accuracy%)',
|
|
340
|
+
approverRevisedAccuracy: 'Approver (Accuracy%)',
|
|
341
|
+
tangoRevisedAccuracy: 'Tango (Accuracy%)',
|
|
342
|
+
ticketRaised: 'Ticket Raised On',
|
|
343
|
+
issueDate: 'Issue Date',
|
|
344
|
+
footfall: 'Actual FF',
|
|
345
|
+
};
|
|
346
|
+
hiddenColumns = [
|
|
347
|
+
'storeName',
|
|
348
|
+
'type',
|
|
349
|
+
];
|
|
350
|
+
generateColumns(firstRow) {
|
|
351
|
+
const keys = Object.keys(firstRow)
|
|
352
|
+
.filter(key => !this.hiddenColumns.includes(key)); // remove unwanted columns
|
|
353
|
+
this.tableColumns = keys.map(key => ({
|
|
354
|
+
key,
|
|
355
|
+
// if key exists in labelOverrides, use that; otherwise auto-format
|
|
356
|
+
label: this.labelOverrides[key] ?? this.formatColumnName(key),
|
|
357
|
+
sortable: true,
|
|
358
|
+
type: this.detectColumnType ? this.detectColumnType(key) : null
|
|
359
|
+
}));
|
|
360
|
+
}
|
|
361
|
+
formatColumnName(key) {
|
|
362
|
+
return key
|
|
363
|
+
.replace(/([A-Z])/g, ' $1')
|
|
364
|
+
.replace(/_/g, ' ')
|
|
365
|
+
.replace(/\b\w/g, c => c.toUpperCase());
|
|
366
|
+
}
|
|
367
|
+
detectColumnType(key) {
|
|
368
|
+
if (key === 'storeName' || key === 'ticketId')
|
|
369
|
+
return 'store';
|
|
370
|
+
if (key.toLowerCase().includes('date') || key === 'ticketRaised')
|
|
371
|
+
return 'date';
|
|
372
|
+
if (key.toLowerCase().includes('status'))
|
|
373
|
+
return 'status';
|
|
374
|
+
return 'text';
|
|
375
|
+
}
|
|
376
|
+
currentPage = 1;
|
|
377
|
+
pageSize = 10;
|
|
378
|
+
onPageChange(pageOffset) {
|
|
379
|
+
this.currentPage = Number(pageOffset);
|
|
380
|
+
this.offset = Number(pageOffset);
|
|
381
|
+
// this.limit = 10;
|
|
382
|
+
this.getTicketList(this.tangoType);
|
|
383
|
+
}
|
|
384
|
+
onPageSizeChange(pageSize) {
|
|
385
|
+
this.pageSize = Number(pageSize);
|
|
386
|
+
this.limit = Number(pageSize);
|
|
387
|
+
this.currentPage = 1;
|
|
388
|
+
this.offset = 1;
|
|
389
|
+
this.getTicketList(this.tangoType);
|
|
390
|
+
}
|
|
391
|
+
setpageSize() {
|
|
392
|
+
if (this.totalItems < 10) {
|
|
393
|
+
return this.totalItems;
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
return this.pageSize;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
searchData() {
|
|
400
|
+
this.currentPage = 1;
|
|
401
|
+
this.offset = 1;
|
|
402
|
+
this.limit = 10;
|
|
403
|
+
this.getTicketList(this.tangoType);
|
|
404
|
+
}
|
|
405
|
+
storeChange(event) {
|
|
406
|
+
this.selectedStore = { storeId: event.storeId, storeName: event.storeName };
|
|
407
|
+
console.log("🚀 ~ TicketFootfallNewComponent ~ storeChange ~ this.selectedStore:", this.selectedDateRange.startDate, this.dayjs(this.selectedDateRange.startDate, "DD-MM-YYYY", true).format("YYYY-MM-DD"));
|
|
408
|
+
this.service
|
|
409
|
+
.getfootfallcount({
|
|
410
|
+
"storeId": this.selectedStore?.storeId,
|
|
411
|
+
"Date": this.dayjs(this.selectedDateRange.startDate, "DD-MM-YYYY").format("YYYY-MM-DD"),
|
|
412
|
+
})
|
|
413
|
+
.pipe(takeUntil(this.destroy$))
|
|
414
|
+
.subscribe({
|
|
415
|
+
next: (res) => {
|
|
416
|
+
if (res && res.code === 200) {
|
|
417
|
+
console.log(res.data);
|
|
418
|
+
this.footfallcount = res?.data[0]?.footfallCount;
|
|
419
|
+
this.disableAudit = false;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
onStartDateChange(event) {
|
|
425
|
+
if (this.dayjs(event.startDate).isValid()) {
|
|
426
|
+
this.isCustomDate = (m) => {
|
|
427
|
+
const isValidDate = m > this.dayjs() || m > this.dayjs(event.startDate.add(90, 'days'));
|
|
428
|
+
return isValidDate ? 'invalid-date' : false;
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
createInternalticket() {
|
|
433
|
+
const modalRef = this.modalService.open(this.internalticket);
|
|
434
|
+
modalRef.result.then((result) => {
|
|
435
|
+
console.log("🚀 ~ TicketFootfallNewComponent ~ createInternalticket ~ result.isConfirmed:", result);
|
|
436
|
+
if (result === 'isConfirmed') {
|
|
437
|
+
let obj = {
|
|
438
|
+
"storeId": this.selectedStore?.storeId,
|
|
439
|
+
"dateString": dayjs(this.selectedDateRange.startDate, "DD-MM-YYYY").format("YYYY-MM-DD"),
|
|
440
|
+
"storeName": this.selectedStore?.storeName,
|
|
441
|
+
"ticketName": "footfall-directory",
|
|
442
|
+
"footfallCount": this.footfallcount,
|
|
443
|
+
"clientId": this.headerFilters?.client,
|
|
444
|
+
"status": "Raised",
|
|
445
|
+
"comments": ""
|
|
446
|
+
};
|
|
447
|
+
this.service
|
|
448
|
+
.CreateinternalTicketApi(obj)
|
|
449
|
+
.pipe(takeUntil(this.destroy$))
|
|
450
|
+
.subscribe({
|
|
451
|
+
next: (res) => {
|
|
452
|
+
if (res && res?.code === 200) {
|
|
453
|
+
this.ts.getSuccessToast("Ticket created successfully");
|
|
454
|
+
this.confirmCloseCancel();
|
|
455
|
+
const data = {
|
|
456
|
+
totalfiles: this.footfallcount,
|
|
457
|
+
filedetails: {
|
|
458
|
+
clientId: this.headerFilters?.client,
|
|
459
|
+
storeId: this.selectedStore?.storeId,
|
|
460
|
+
Date: dayjs(this.selectedDateRange.startDate, "DD-MM-YYYY").format("YYYY-MM-DD"),
|
|
461
|
+
auditId: "",
|
|
462
|
+
userId: "",
|
|
463
|
+
nextToken: "",
|
|
464
|
+
},
|
|
465
|
+
auditId: "",
|
|
466
|
+
storedetails: {
|
|
467
|
+
storeName: this.selectedStore?.storeName
|
|
468
|
+
}
|
|
469
|
+
};
|
|
470
|
+
sessionStorage.setItem("totalfiles", JSON.stringify(data));
|
|
471
|
+
sessionStorage.setItem("ticketType", "internal");
|
|
472
|
+
this.select = 'ticketMethod';
|
|
473
|
+
this.router.navigateByUrl('/manage/tickets/audit');
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
this.ts.getErrorToast("Error closing ticket");
|
|
477
|
+
}
|
|
478
|
+
this.cd.detectChanges();
|
|
479
|
+
},
|
|
480
|
+
error: (err) => {
|
|
481
|
+
const errorMsg = err?.error?.message ||
|
|
482
|
+
err?.error?.error ||
|
|
483
|
+
err?.error ||
|
|
484
|
+
err?.message ||
|
|
485
|
+
"Error closing ticket";
|
|
486
|
+
this.ts.getErrorToast(errorMsg);
|
|
487
|
+
this.isCheckboxEnable = true;
|
|
488
|
+
this.closeBtn = true;
|
|
489
|
+
this.closeDisabled = false;
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
exportXLSX() {
|
|
496
|
+
this.searchValue = this.searchValue?.trim() || "";
|
|
497
|
+
this.offset = 1;
|
|
498
|
+
this.limit = 10000;
|
|
499
|
+
this.isExport = true;
|
|
500
|
+
this.service
|
|
501
|
+
.getTicketListExportApi(this.footfallList_req.client, this.footfallList_req.fromDate, this.footfallList_req.toDate, this.searchValue, this.limit, this.offset, this.isExport, this.sortedColumn, this.sortDirection, this.tangoType)
|
|
502
|
+
.pipe(takeUntil(this.destroy$))
|
|
503
|
+
.subscribe({
|
|
504
|
+
next: (res) => {
|
|
505
|
+
this.excelService.saveAsExcelFile(res, "footfall directory ticket ");
|
|
506
|
+
},
|
|
507
|
+
error: (err) => {
|
|
508
|
+
this.ts.getErrorToast("Error exporting data:" + err.error ? err.error : err.message);
|
|
509
|
+
},
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
onSort(column) {
|
|
513
|
+
if (this.sortedColumn === column) {
|
|
514
|
+
this.sortDirection = this.sortDirection === 1 ? -1 : 1;
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
this.sortedColumn = column;
|
|
518
|
+
this.sortDirection = 1;
|
|
519
|
+
}
|
|
520
|
+
this.getTicketList(this.tangoType);
|
|
521
|
+
}
|
|
522
|
+
select = "ticketList";
|
|
523
|
+
ticketData;
|
|
524
|
+
startAudit() {
|
|
525
|
+
let input = {
|
|
526
|
+
storeId: this.ticketData?.storeId,
|
|
527
|
+
dateString: this.ticketData?.issueDate,
|
|
528
|
+
};
|
|
529
|
+
this.service
|
|
530
|
+
.checkTicketExists(input).pipe(takeUntil(this.destroy$))
|
|
531
|
+
.subscribe({
|
|
532
|
+
next: (res) => {
|
|
533
|
+
if (res && res?.code === 200) {
|
|
534
|
+
console.log(res.data);
|
|
535
|
+
let ticketList = res?.data;
|
|
536
|
+
let findTangoticket = ticketList.filter((data) => data?._source?.type === 'internal' && data?._source?.status === "Closed");
|
|
537
|
+
let findstoreticket = ticketList.filter((data) => data?._source?.type === 'store' && data?._source?.status != "Closed");
|
|
538
|
+
if (findTangoticket.length > 0) {
|
|
539
|
+
const modalRef = this.modalService.open(TicketclosepopupComponent, {
|
|
540
|
+
centered: true,
|
|
541
|
+
size: "md",
|
|
542
|
+
scrollable: true,
|
|
543
|
+
backdrop: "static",
|
|
544
|
+
});
|
|
545
|
+
modalRef.componentInstance.tangoTicket = findTangoticket[0]._source;
|
|
546
|
+
modalRef.componentInstance.storeTicket = findstoreticket[0]._source;
|
|
547
|
+
modalRef.result.then((result) => {
|
|
548
|
+
if (result.type === 'merge') {
|
|
549
|
+
console.log("🚀 ~ TicketFootfallNewComponent ~ startAudit ~ findTangoticket:", findTangoticket);
|
|
550
|
+
let obj = findTangoticket[0]?._source;
|
|
551
|
+
if (obj && obj?.mappingInfo.length > 0) {
|
|
552
|
+
let mapData = obj.mappingInfo.filter((data) => data.type === "tangoreview")[0];
|
|
553
|
+
console.log("🚀 ~ TicketFootfallNewComponent ~ startAudit ~ mapData:", mapData);
|
|
554
|
+
let payload = {
|
|
555
|
+
storeId: this.ticketData?.storeId,
|
|
556
|
+
"dateString": this.ticketData?.issueDate,
|
|
557
|
+
ticketType: 'store',
|
|
558
|
+
mappingInfo: mapData
|
|
559
|
+
};
|
|
560
|
+
console.log("🚀 ~ TicketFootfallNewComponent ~ startAudit ~ payload:", payload);
|
|
561
|
+
this.auditservice
|
|
562
|
+
.saveaudit(payload).pipe(takeUntil(this.destroy$))
|
|
563
|
+
.subscribe({
|
|
564
|
+
next: (res) => {
|
|
565
|
+
if (res && res?.code === 200) {
|
|
566
|
+
this.router.navigate(['/manage/tickets'], { queryParams: { type: 'footfall' } });
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
else if (result.type == '') {
|
|
573
|
+
const data = {
|
|
574
|
+
totalfiles: this.ticketData?.footfall,
|
|
575
|
+
filedetails: {
|
|
576
|
+
clientId: this.headerFilters?.client,
|
|
577
|
+
storeId: this.ticketData?.storeId,
|
|
578
|
+
Date: this.ticketData?.issueDate,
|
|
579
|
+
auditId: "",
|
|
580
|
+
userId: "",
|
|
581
|
+
nextToken: "",
|
|
582
|
+
},
|
|
583
|
+
auditId: "",
|
|
584
|
+
storedetails: {
|
|
585
|
+
storeName: this.ticketData?.storeName
|
|
586
|
+
}
|
|
587
|
+
};
|
|
588
|
+
sessionStorage.setItem("totalfiles", JSON.stringify(data));
|
|
589
|
+
sessionStorage.setItem("ticketType", this.tangoType);
|
|
590
|
+
this.select = 'ticketMethod';
|
|
591
|
+
this.router.navigateByUrl('/manage/tickets/audit');
|
|
592
|
+
}
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
else {
|
|
596
|
+
const data = {
|
|
597
|
+
totalfiles: this.ticketData?.footfall,
|
|
598
|
+
filedetails: {
|
|
599
|
+
clientId: this.headerFilters?.client,
|
|
600
|
+
storeId: this.ticketData?.storeId,
|
|
601
|
+
Date: this.ticketData?.issueDate,
|
|
602
|
+
auditId: "",
|
|
603
|
+
userId: "",
|
|
604
|
+
nextToken: "",
|
|
605
|
+
},
|
|
606
|
+
auditId: "",
|
|
607
|
+
storedetails: {
|
|
608
|
+
storeName: this.ticketData?.storeName
|
|
609
|
+
}
|
|
610
|
+
};
|
|
611
|
+
sessionStorage.setItem("totalfiles", JSON.stringify(data));
|
|
612
|
+
sessionStorage.setItem("ticketType", this.tangoType);
|
|
613
|
+
this.select = 'ticketMethod';
|
|
614
|
+
this.router.navigateByUrl('/manage/tickets/audit');
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
});
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
621
|
+
backToNavigation() {
|
|
622
|
+
this.select = "ticketList";
|
|
623
|
+
this.footfallTicketsData = [];
|
|
624
|
+
this.getTicketSummary();
|
|
625
|
+
this.getTicketList(this.tangoType);
|
|
626
|
+
this.closeBtn = false;
|
|
627
|
+
this.isCheckboxEnable = false;
|
|
628
|
+
}
|
|
629
|
+
isCollapsed = false;
|
|
630
|
+
toggleSidebar() {
|
|
631
|
+
this.isCollapsed = !this.isCollapsed;
|
|
632
|
+
}
|
|
633
|
+
toggleFilter() {
|
|
634
|
+
this.isFilterOpen = !this.isFilterOpen;
|
|
635
|
+
}
|
|
636
|
+
isFilterOpen = false; // controls show/hide panel
|
|
637
|
+
filterForm;
|
|
638
|
+
filterChange = new EventEmitter();
|
|
639
|
+
newForm() {
|
|
640
|
+
this.filterForm = this.fb.group({
|
|
641
|
+
status: [""],
|
|
642
|
+
reviewerCondition: [""],
|
|
643
|
+
reviewerValue: [""],
|
|
644
|
+
approverCondition: [""],
|
|
645
|
+
approverValue: [""],
|
|
646
|
+
tangoCondition: [""],
|
|
647
|
+
tangoValue: [""],
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
applyFilter() {
|
|
651
|
+
this.filterChange.emit(this.filterForm.value);
|
|
652
|
+
this.isFilterOpen = false; // close after apply
|
|
653
|
+
}
|
|
654
|
+
resetFilter() {
|
|
655
|
+
this.filterForm.reset();
|
|
656
|
+
this.filterChange.emit(this.filterForm.value);
|
|
657
|
+
}
|
|
658
|
+
close() {
|
|
659
|
+
this.isFilterOpen = false;
|
|
660
|
+
}
|
|
661
|
+
StoresSearchValue = "";
|
|
662
|
+
sortedColumn1 = "";
|
|
663
|
+
sortDirection1 = 1;
|
|
664
|
+
searchStoresData() { }
|
|
665
|
+
sortValue(column) { }
|
|
666
|
+
openTicketsList = [];
|
|
667
|
+
selectedStores = []; // holds selected rows
|
|
668
|
+
allSelected = false; // top "Select All" checkbox
|
|
669
|
+
get storeCount() {
|
|
670
|
+
return this.openTicketsList?.length || 0;
|
|
671
|
+
}
|
|
672
|
+
// check if a row is selected (used in template)
|
|
673
|
+
isSelected(store) {
|
|
674
|
+
return this.selectedStores.includes(store);
|
|
675
|
+
}
|
|
676
|
+
// when user clicks on a single store checkbox
|
|
677
|
+
toggleStoreSelection(store) {
|
|
678
|
+
if (this.isSelected(store)) {
|
|
679
|
+
// remove
|
|
680
|
+
this.selectedStores = this.selectedStores.filter((s) => s !== store);
|
|
681
|
+
}
|
|
682
|
+
else {
|
|
683
|
+
// add (if you want single select, use: this.selectedStores = [store];)
|
|
684
|
+
this.selectedStores = [...this.selectedStores, store];
|
|
685
|
+
// call API for this store
|
|
686
|
+
// this.handleStoreSelected(store);
|
|
687
|
+
}
|
|
688
|
+
// keep "Select All" in sync
|
|
689
|
+
this.allSelected =
|
|
690
|
+
this.selectedStores.length === this.openTicketsList.length &&
|
|
691
|
+
this.openTicketsList.length > 0;
|
|
692
|
+
}
|
|
693
|
+
// when user clicks on "Select All"
|
|
694
|
+
toggleSelectAll() {
|
|
695
|
+
if (this.allSelected) {
|
|
696
|
+
// unselect everything
|
|
697
|
+
this.selectedStores = [];
|
|
698
|
+
this.allSelected = false;
|
|
699
|
+
}
|
|
700
|
+
else {
|
|
701
|
+
// select all visible stores
|
|
702
|
+
this.selectedStores = [...this.openTicketsList];
|
|
703
|
+
this.allSelected = true;
|
|
704
|
+
// usually no need to call detail API here, but you can if you want
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
ticketViewChanges(store) {
|
|
708
|
+
this.dataStoreView(store);
|
|
709
|
+
// single selection on row click
|
|
710
|
+
this.selectedStores = [store];
|
|
711
|
+
this.allSelected =
|
|
712
|
+
this.selectedStores.length === this.openTicketsList.length &&
|
|
713
|
+
this.openTicketsList.length > 0;
|
|
714
|
+
}
|
|
715
|
+
originalImage = {
|
|
716
|
+
id: 4,
|
|
717
|
+
entryTime: "10:00 AM",
|
|
718
|
+
};
|
|
719
|
+
ticket = [];
|
|
720
|
+
imageUrl;
|
|
721
|
+
getFormattedEntryTime(entryTime) {
|
|
722
|
+
if (!entryTime)
|
|
723
|
+
return "-";
|
|
724
|
+
const [hours, minutes, seconds] = entryTime.split(":").map(Number);
|
|
725
|
+
const date = new Date();
|
|
726
|
+
date.setHours(hours, minutes, seconds);
|
|
727
|
+
return date.toLocaleTimeString("en-US", {
|
|
728
|
+
hour: "2-digit",
|
|
729
|
+
minute: "2-digit",
|
|
730
|
+
// second: '2-digit',
|
|
731
|
+
hour12: true,
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
duplicates;
|
|
735
|
+
// key = parent original.tempId, value = array of selected duplicate tempIds
|
|
736
|
+
selectedDuplicatesByParent = {};
|
|
737
|
+
// is one duplicate selected?
|
|
738
|
+
isDuplicateSelected(parentId, duplicateId) {
|
|
739
|
+
return (this.selectedDuplicatesByParent[parentId]?.includes(duplicateId) || false);
|
|
740
|
+
}
|
|
741
|
+
// select / unselect single duplicate
|
|
742
|
+
onDuplicateCheckboxChange(parentId, duplicateId, event) {
|
|
743
|
+
const checked = event.target.checked;
|
|
744
|
+
if (!this.selectedDuplicatesByParent[parentId]) {
|
|
745
|
+
this.selectedDuplicatesByParent[parentId] = [];
|
|
746
|
+
}
|
|
747
|
+
const list = this.selectedDuplicatesByParent[parentId];
|
|
748
|
+
if (checked) {
|
|
749
|
+
if (!list.includes(duplicateId)) {
|
|
750
|
+
list.push(duplicateId);
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
else {
|
|
754
|
+
this.selectedDuplicatesByParent[parentId] = list.filter((id) => id !== duplicateId);
|
|
755
|
+
}
|
|
756
|
+
this.updateOverallSelectedIds();
|
|
757
|
+
}
|
|
758
|
+
// are *all* duplicates under this parent selected?
|
|
759
|
+
areAllDuplicatesSelected(original) {
|
|
760
|
+
const parentId = original.tempId;
|
|
761
|
+
const duplicates = original?.duplicateImage || [];
|
|
762
|
+
const selected = this.selectedDuplicatesByParent[parentId] || [];
|
|
763
|
+
return duplicates.length > 0 && selected.length === duplicates.length;
|
|
764
|
+
}
|
|
765
|
+
// handle "Select All" toggle for this original
|
|
766
|
+
onToggleSelectAllDuplicates(original, event) {
|
|
767
|
+
const checked = event.target.checked;
|
|
768
|
+
const parentId = original.tempId;
|
|
769
|
+
const duplicates = original?.duplicateImage || [];
|
|
770
|
+
if (checked) {
|
|
771
|
+
this.selectedDuplicatesByParent[parentId] = duplicates.map((d) => d.tempId);
|
|
772
|
+
}
|
|
773
|
+
else {
|
|
774
|
+
this.selectedDuplicatesByParent[parentId] = [];
|
|
775
|
+
}
|
|
776
|
+
this.updateOverallSelectedIds();
|
|
777
|
+
console.log("Selected duplicates map:", this.selectedDuplicatesByParent);
|
|
778
|
+
}
|
|
779
|
+
// comments: any;
|
|
780
|
+
commentModal(obj) {
|
|
781
|
+
const modalRef = this.modalService.open(FootfallPopupComponent, {
|
|
782
|
+
centered: true,
|
|
783
|
+
size: "md",
|
|
784
|
+
scrollable: true,
|
|
785
|
+
backdrop: "static",
|
|
786
|
+
});
|
|
787
|
+
modalRef.componentInstance.ticketId = obj.ticketId;
|
|
788
|
+
modalRef.result.then((result) => { });
|
|
789
|
+
}
|
|
790
|
+
commentsAccordionOpen = false;
|
|
791
|
+
toggleCommentsAccordion() {
|
|
792
|
+
this.commentsAccordionOpen = !this.commentsAccordionOpen;
|
|
793
|
+
}
|
|
794
|
+
ngOnDestroy() {
|
|
795
|
+
this.destroy$.next(true);
|
|
796
|
+
this.destroy$.complete();
|
|
797
|
+
}
|
|
798
|
+
activityData = [
|
|
799
|
+
{
|
|
800
|
+
"category": "duplicate",
|
|
801
|
+
"type": "tagging",
|
|
802
|
+
"parent": 1,
|
|
803
|
+
"comments": [
|
|
804
|
+
{
|
|
805
|
+
"message": "commnets message update here",
|
|
806
|
+
"createdByEmail": "sandeep.pal@yopmail.com",
|
|
807
|
+
"createdByUserName": "sandeep.pal",
|
|
808
|
+
"createdByRole": "user"
|
|
809
|
+
}
|
|
810
|
+
]
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
"category": "duplicate",
|
|
814
|
+
"type": "review",
|
|
815
|
+
"comments": [
|
|
816
|
+
{
|
|
817
|
+
"parent": 1,
|
|
818
|
+
"category": "duplicate",
|
|
819
|
+
"taggedImages": [
|
|
820
|
+
{
|
|
821
|
+
"id": "11-280_2025-12-02_18",
|
|
822
|
+
"tempId": 8,
|
|
823
|
+
"timeRange": "04PM-05PM",
|
|
824
|
+
"entryTime": "16:17:59",
|
|
825
|
+
"exitTime": "16:47:57",
|
|
826
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
827
|
+
"isChecked": true
|
|
828
|
+
},
|
|
829
|
+
{
|
|
830
|
+
"id": "11-280_2025-12-02_18",
|
|
831
|
+
"tempId": 11,
|
|
832
|
+
"timeRange": "04PM-05PM",
|
|
833
|
+
"entryTime": "16:17:59",
|
|
834
|
+
"exitTime": "16:47:57",
|
|
835
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
836
|
+
"isChecked": true
|
|
837
|
+
},
|
|
838
|
+
{
|
|
839
|
+
"id": "11-280_2025-12-02_18",
|
|
840
|
+
"tempId": 21,
|
|
841
|
+
"timeRange": "04PM-05PM",
|
|
842
|
+
"entryTime": "16:17:59",
|
|
843
|
+
"exitTime": "16:47:57",
|
|
844
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
845
|
+
"isChecked": true
|
|
846
|
+
},
|
|
847
|
+
{
|
|
848
|
+
"id": "11-280_2025-12-02_18",
|
|
849
|
+
"tempId": 11,
|
|
850
|
+
"timeRange": "04PM-05PM",
|
|
851
|
+
"entryTime": "16:17:59",
|
|
852
|
+
"exitTime": "16:47:57",
|
|
853
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
854
|
+
"isChecked": true
|
|
855
|
+
},
|
|
856
|
+
{
|
|
857
|
+
"id": "11-280_2025-12-02_18",
|
|
858
|
+
"tempId": 21,
|
|
859
|
+
"timeRange": "04PM-05PM",
|
|
860
|
+
"entryTime": "16:17:59",
|
|
861
|
+
"exitTime": "16:47:57",
|
|
862
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
863
|
+
"isChecked": true
|
|
864
|
+
}
|
|
865
|
+
],
|
|
866
|
+
"createdByEmail": "sandeep.pal@yopmail.com",
|
|
867
|
+
"createdByUserName": "sandeep.pal",
|
|
868
|
+
"createdByRole": "user",
|
|
869
|
+
"status": "approved",
|
|
870
|
+
"message": "commnets message update here"
|
|
871
|
+
},
|
|
872
|
+
{
|
|
873
|
+
"parent": 1,
|
|
874
|
+
"category": "duplicate",
|
|
875
|
+
"taggedImages": [
|
|
876
|
+
{
|
|
877
|
+
"id": "11-280_2025-12-02_18",
|
|
878
|
+
"tempId": 18,
|
|
879
|
+
"timeRange": "04PM-05PM",
|
|
880
|
+
"entryTime": "16:17:59",
|
|
881
|
+
"exitTime": "16:47:57",
|
|
882
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
883
|
+
"isChecked": true
|
|
884
|
+
},
|
|
885
|
+
{
|
|
886
|
+
"id": "11-280_2025-12-02_18",
|
|
887
|
+
"tempId": 19,
|
|
888
|
+
"timeRange": "04PM-05PM",
|
|
889
|
+
"entryTime": "16:17:59",
|
|
890
|
+
"exitTime": "16:47:57",
|
|
891
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
892
|
+
"isChecked": true
|
|
893
|
+
},
|
|
894
|
+
{
|
|
895
|
+
"id": "11-280_2025-12-02_18",
|
|
896
|
+
"tempId": 20,
|
|
897
|
+
"timeRange": "04PM-05PM",
|
|
898
|
+
"entryTime": "16:17:59",
|
|
899
|
+
"exitTime": "16:47:57",
|
|
900
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
901
|
+
"isChecked": true
|
|
902
|
+
}
|
|
903
|
+
],
|
|
904
|
+
"createdByEmail": "sandeep.pal@yopmail.com",
|
|
905
|
+
"createdByUserName": "sandeep.pal",
|
|
906
|
+
"createdByRole": "user",
|
|
907
|
+
"status": "rejected",
|
|
908
|
+
"message": "commnets message update here"
|
|
909
|
+
}
|
|
910
|
+
]
|
|
911
|
+
},
|
|
912
|
+
{
|
|
913
|
+
"category": "duplicate",
|
|
914
|
+
"type": "approve",
|
|
915
|
+
"comments": [
|
|
916
|
+
{
|
|
917
|
+
"parent": 1,
|
|
918
|
+
"category": "duplicate",
|
|
919
|
+
"taggedImages": [
|
|
920
|
+
{
|
|
921
|
+
"id": "11-280_2025-12-02_18",
|
|
922
|
+
"tempId": 18,
|
|
923
|
+
"timeRange": "04PM-05PM",
|
|
924
|
+
"entryTime": "16:17:59",
|
|
925
|
+
"exitTime": "16:47:57",
|
|
926
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
927
|
+
"isChecked": true
|
|
928
|
+
},
|
|
929
|
+
{
|
|
930
|
+
"id": "11-280_2025-12-02_18",
|
|
931
|
+
"tempId": 18,
|
|
932
|
+
"timeRange": "04PM-05PM",
|
|
933
|
+
"entryTime": "16:17:59",
|
|
934
|
+
"exitTime": "16:47:57",
|
|
935
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
936
|
+
"isChecked": true
|
|
937
|
+
},
|
|
938
|
+
{
|
|
939
|
+
"id": "11-280_2025-12-02_18",
|
|
940
|
+
"tempId": 18,
|
|
941
|
+
"timeRange": "04PM-05PM",
|
|
942
|
+
"entryTime": "16:17:59",
|
|
943
|
+
"exitTime": "16:47:57",
|
|
944
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
945
|
+
"isChecked": true
|
|
946
|
+
}
|
|
947
|
+
],
|
|
948
|
+
"createdByEmail": "sandeep.pal@yopmail.com",
|
|
949
|
+
"createdByUserName": "sandeep.pal",
|
|
950
|
+
"createdByRole": "user",
|
|
951
|
+
"status": "approved",
|
|
952
|
+
"message": "commnets message update here"
|
|
953
|
+
}
|
|
954
|
+
]
|
|
955
|
+
}
|
|
956
|
+
];
|
|
957
|
+
activityData1 = [
|
|
958
|
+
{
|
|
959
|
+
"category": "employee",
|
|
960
|
+
"parent": null,
|
|
961
|
+
"type": "tagging",
|
|
962
|
+
"comments": [
|
|
963
|
+
{
|
|
964
|
+
"id": "11-280_2025-12-02_18",
|
|
965
|
+
"tempId": 18,
|
|
966
|
+
"timeRange": "04PM-05PM",
|
|
967
|
+
"entryTime": "16:17:59",
|
|
968
|
+
"exitTime": "16:47:57",
|
|
969
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
970
|
+
"isChecked": true,
|
|
971
|
+
"createdAt": "2025-12-03T06:40:34.485Z",
|
|
972
|
+
"createdByEmail": "sandeep.pal@yopmail.com",
|
|
973
|
+
"createdByUserName": "sandeep.pal",
|
|
974
|
+
"createdByRole": "user",
|
|
975
|
+
"message": "commnets message update here"
|
|
976
|
+
},
|
|
977
|
+
{
|
|
978
|
+
"id": "11-280_2025-12-02_18",
|
|
979
|
+
"tempId": 18,
|
|
980
|
+
"timeRange": "04PM-05PM",
|
|
981
|
+
"entryTime": "16:17:59",
|
|
982
|
+
"exitTime": "16:47:57",
|
|
983
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
984
|
+
"isChecked": true,
|
|
985
|
+
"createdAt": "2025-12-03T06:40:34.485Z",
|
|
986
|
+
"createdByEmail": "sandeep.pal@yopmail.com",
|
|
987
|
+
"createdByUserName": "sandeep.pal",
|
|
988
|
+
"createdByRole": "user",
|
|
989
|
+
"message": "commnets message update here"
|
|
990
|
+
},
|
|
991
|
+
{
|
|
992
|
+
"id": "11-280_2025-12-02_18",
|
|
993
|
+
"tempId": 18,
|
|
994
|
+
"timeRange": "04PM-05PM",
|
|
995
|
+
"entryTime": "16:17:59",
|
|
996
|
+
"exitTime": "16:47:57",
|
|
997
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
998
|
+
"isChecked": true,
|
|
999
|
+
"createdAt": "2025-12-03T06:40:34.485Z",
|
|
1000
|
+
"createdByEmail": "sandeep.pal@yopmail.com",
|
|
1001
|
+
"createdByUserName": "sandeep.pal",
|
|
1002
|
+
"createdByRole": "user",
|
|
1003
|
+
"message": "commnets message update here"
|
|
1004
|
+
}
|
|
1005
|
+
]
|
|
1006
|
+
},
|
|
1007
|
+
{
|
|
1008
|
+
"type": "review",
|
|
1009
|
+
"comments": [
|
|
1010
|
+
{
|
|
1011
|
+
"category": "employee",
|
|
1012
|
+
"taggedImages": [
|
|
1013
|
+
{
|
|
1014
|
+
"id": "11-280_2025-12-02_18",
|
|
1015
|
+
"tempId": 28,
|
|
1016
|
+
"timeRange": "04PM-05PM",
|
|
1017
|
+
"entryTime": "16:17:59",
|
|
1018
|
+
"exitTime": "16:47:57",
|
|
1019
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
1020
|
+
"isChecked": true
|
|
1021
|
+
},
|
|
1022
|
+
{
|
|
1023
|
+
"id": "11-280_2025-12-02_18",
|
|
1024
|
+
"tempId": 22,
|
|
1025
|
+
"timeRange": "04PM-05PM",
|
|
1026
|
+
"entryTime": "16:17:59",
|
|
1027
|
+
"exitTime": "16:47:57",
|
|
1028
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
1029
|
+
"isChecked": true
|
|
1030
|
+
},
|
|
1031
|
+
{
|
|
1032
|
+
"id": "11-280_2025-12-02_18",
|
|
1033
|
+
"tempId": 11,
|
|
1034
|
+
"timeRange": "04PM-05PM",
|
|
1035
|
+
"entryTime": "16:17:59",
|
|
1036
|
+
"exitTime": "16:47:57",
|
|
1037
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
1038
|
+
"isChecked": true
|
|
1039
|
+
},
|
|
1040
|
+
{
|
|
1041
|
+
"id": "11-280_2025-12-02_18",
|
|
1042
|
+
"tempId": 12,
|
|
1043
|
+
"timeRange": "04PM-05PM",
|
|
1044
|
+
"entryTime": "16:17:59",
|
|
1045
|
+
"exitTime": "16:47:57",
|
|
1046
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
1047
|
+
"isChecked": true
|
|
1048
|
+
},
|
|
1049
|
+
{
|
|
1050
|
+
"id": "11-280_2025-12-02_18",
|
|
1051
|
+
"tempId": 13,
|
|
1052
|
+
"timeRange": "04PM-05PM",
|
|
1053
|
+
"entryTime": "16:17:59",
|
|
1054
|
+
"exitTime": "16:47:57",
|
|
1055
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
1056
|
+
"isChecked": true
|
|
1057
|
+
}
|
|
1058
|
+
],
|
|
1059
|
+
"createdByEmail": "sandeep.pal@yopmail.com",
|
|
1060
|
+
"createdByUserName": "sandeep.pal",
|
|
1061
|
+
"createdByRole": "user",
|
|
1062
|
+
"status": "approved",
|
|
1063
|
+
"message": "commnets message update here"
|
|
1064
|
+
}
|
|
1065
|
+
]
|
|
1066
|
+
},
|
|
1067
|
+
{
|
|
1068
|
+
"type": "approve",
|
|
1069
|
+
"comments": [
|
|
1070
|
+
{
|
|
1071
|
+
"category": "employee",
|
|
1072
|
+
"taggedImages": [
|
|
1073
|
+
{
|
|
1074
|
+
"id": "11-280_2025-12-02_18",
|
|
1075
|
+
"tempId": 1,
|
|
1076
|
+
"timeRange": "04PM-05PM",
|
|
1077
|
+
"entryTime": "16:17:59",
|
|
1078
|
+
"exitTime": "16:47:57",
|
|
1079
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
1080
|
+
"isChecked": true
|
|
1081
|
+
},
|
|
1082
|
+
{
|
|
1083
|
+
"id": "11-280_2025-12-02_18",
|
|
1084
|
+
"tempId": 8,
|
|
1085
|
+
"timeRange": "04PM-05PM",
|
|
1086
|
+
"entryTime": "16:17:59",
|
|
1087
|
+
"exitTime": "16:47:57",
|
|
1088
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
1089
|
+
"isChecked": true
|
|
1090
|
+
},
|
|
1091
|
+
{
|
|
1092
|
+
"id": "11-280_2025-12-02_18",
|
|
1093
|
+
"tempId": 22,
|
|
1094
|
+
"timeRange": "04PM-05PM",
|
|
1095
|
+
"entryTime": "16:17:59",
|
|
1096
|
+
"exitTime": "16:47:57",
|
|
1097
|
+
"filePath": "11-280/02-12-2025/18_customer_entry_frame.jpeg",
|
|
1098
|
+
"isChecked": true
|
|
1099
|
+
}
|
|
1100
|
+
],
|
|
1101
|
+
"createdByEmail": "sandeep.pal@yopmail.com",
|
|
1102
|
+
"createdByUserName": "sandeep.pal",
|
|
1103
|
+
"createdByRole": "user",
|
|
1104
|
+
"status": "rejected",
|
|
1105
|
+
"message": "commnets message update here"
|
|
1106
|
+
}
|
|
1107
|
+
]
|
|
1108
|
+
}
|
|
1109
|
+
];
|
|
1110
|
+
comments = [
|
|
1111
|
+
{
|
|
1112
|
+
email: "ryan@lenskart.com",
|
|
1113
|
+
avatar: "assets/avatars/ryan.png",
|
|
1114
|
+
time: "2025-01-20T10:53:34",
|
|
1115
|
+
mainText: "All the three are same.",
|
|
1116
|
+
statusLabel: null,
|
|
1117
|
+
statusType: null,
|
|
1118
|
+
note: null,
|
|
1119
|
+
images: [
|
|
1120
|
+
{
|
|
1121
|
+
url: "assets/img1.jpg",
|
|
1122
|
+
tangoId: 4,
|
|
1123
|
+
entryTime: "10:10 AM",
|
|
1124
|
+
status: "reject",
|
|
1125
|
+
},
|
|
1126
|
+
{
|
|
1127
|
+
url: "assets/img2.jpg",
|
|
1128
|
+
tangoId: 4,
|
|
1129
|
+
entryTime: "10:10 AM",
|
|
1130
|
+
status: "reject",
|
|
1131
|
+
},
|
|
1132
|
+
// more images if you want
|
|
1133
|
+
],
|
|
1134
|
+
moreCount: 12, // for the +12 card
|
|
1135
|
+
},
|
|
1136
|
+
{
|
|
1137
|
+
email: "drew@lenskart.com",
|
|
1138
|
+
avatar: "assets/avatars/drew.png",
|
|
1139
|
+
time: "2025-01-20T10:53:34",
|
|
1140
|
+
mainText: null,
|
|
1141
|
+
statusLabel: "Reject",
|
|
1142
|
+
statusType: "danger",
|
|
1143
|
+
note: "Not agreed, seems not duplicate.",
|
|
1144
|
+
images: [
|
|
1145
|
+
{
|
|
1146
|
+
url: "assets/img1.jpg",
|
|
1147
|
+
tangoId: 4,
|
|
1148
|
+
entryTime: "10:10 AM",
|
|
1149
|
+
status: "reject",
|
|
1150
|
+
},
|
|
1151
|
+
{
|
|
1152
|
+
url: "assets/img2.jpg",
|
|
1153
|
+
tangoId: 4,
|
|
1154
|
+
entryTime: "10:10 AM",
|
|
1155
|
+
status: "reject",
|
|
1156
|
+
},
|
|
1157
|
+
],
|
|
1158
|
+
moreCount: 12,
|
|
1159
|
+
},
|
|
1160
|
+
{
|
|
1161
|
+
email: "orlando@lenskart.com",
|
|
1162
|
+
avatar: "assets/avatars/orlando.png",
|
|
1163
|
+
time: "2025-01-20T10:53:34",
|
|
1164
|
+
mainText: null,
|
|
1165
|
+
statusLabel: "Approved",
|
|
1166
|
+
statusType: "success",
|
|
1167
|
+
note: "Agreed, hence approving the 3",
|
|
1168
|
+
images: [
|
|
1169
|
+
{
|
|
1170
|
+
url: "assets/img1.jpg",
|
|
1171
|
+
tangoId: 4,
|
|
1172
|
+
entryTime: "10:10 AM",
|
|
1173
|
+
status: "approve",
|
|
1174
|
+
},
|
|
1175
|
+
{
|
|
1176
|
+
url: "assets/img2.jpg",
|
|
1177
|
+
tangoId: 4,
|
|
1178
|
+
entryTime: "10:10 AM",
|
|
1179
|
+
status: "approve",
|
|
1180
|
+
},
|
|
1181
|
+
],
|
|
1182
|
+
moreCount: 0,
|
|
1183
|
+
},
|
|
1184
|
+
];
|
|
1185
|
+
showRevisedDetails = false;
|
|
1186
|
+
footfallNoData = false;
|
|
1187
|
+
footfallLoading = false;
|
|
1188
|
+
footfalloffset = 1;
|
|
1189
|
+
footfalllimit = 1;
|
|
1190
|
+
totalItemsFootfall = 0;
|
|
1191
|
+
dataIndexId = "";
|
|
1192
|
+
dateString = "";
|
|
1193
|
+
storeIdValue = [];
|
|
1194
|
+
lastSelectedTicket;
|
|
1195
|
+
selecteValues = "";
|
|
1196
|
+
hasInitialStoreSynced = false;
|
|
1197
|
+
pageSizeFootfall = 10;
|
|
1198
|
+
paginationSizesFootfall = [10, 20, 30];
|
|
1199
|
+
addStoreIfNotExists(store) {
|
|
1200
|
+
if (this.hasInitialStoreSynced)
|
|
1201
|
+
return;
|
|
1202
|
+
const storeId = store?.storeId;
|
|
1203
|
+
if (storeId && !this.selectedStores.includes(storeId)) {
|
|
1204
|
+
this.selectedStores.push(storeId);
|
|
1205
|
+
}
|
|
1206
|
+
this.hasInitialStoreSynced = true;
|
|
1207
|
+
this.allSelected =
|
|
1208
|
+
this.selectedStores.length === this.openTicketsList.length;
|
|
1209
|
+
}
|
|
1210
|
+
revopsTypes = [];
|
|
1211
|
+
buildRevopsTypes(tickets) {
|
|
1212
|
+
const types = new Set();
|
|
1213
|
+
(tickets || []).forEach((ticket) => {
|
|
1214
|
+
const mappingInfo = ticket?._source?.mappingInfo || [];
|
|
1215
|
+
mappingInfo.forEach((mapping) => {
|
|
1216
|
+
(mapping?.revisedDetail || []).forEach((item) => {
|
|
1217
|
+
// 1) Normal entries: have revopsType
|
|
1218
|
+
if (item?.revopsType) {
|
|
1219
|
+
types.add(item.revopsType);
|
|
1220
|
+
}
|
|
1221
|
+
// 2) Summary entries: have type + name (House keeping, Vendor, Technician, etc.)
|
|
1222
|
+
else if (item?.type && item?.name) {
|
|
1223
|
+
types.add(item.type); // e.g. 'vendor', 'technician', 'houseKeeping'
|
|
1224
|
+
}
|
|
1225
|
+
});
|
|
1226
|
+
});
|
|
1227
|
+
});
|
|
1228
|
+
this.revopsTypes = Array.from(types);
|
|
1229
|
+
console.log('Revops types:', this.revopsTypes);
|
|
1230
|
+
}
|
|
1231
|
+
hasRevopsType(type) {
|
|
1232
|
+
console.log(type);
|
|
1233
|
+
return this.revopsTypes.includes(type);
|
|
1234
|
+
}
|
|
1235
|
+
overallSelectedIds;
|
|
1236
|
+
overallSelect(event) {
|
|
1237
|
+
const checked = event.target.checked;
|
|
1238
|
+
this.allSelected = checked;
|
|
1239
|
+
const parents = this.getAllParentItems(); // your existing fn
|
|
1240
|
+
if (checked) {
|
|
1241
|
+
// 🔹 Select ALL for every revops type except 'duplicate'
|
|
1242
|
+
(this.revopsTypes || []).forEach((type) => {
|
|
1243
|
+
if (type === 'duplicate') {
|
|
1244
|
+
return; // handled separately below
|
|
1245
|
+
}
|
|
1246
|
+
const list = this.getListByType(type) || []; // make sure getListByType accepts string
|
|
1247
|
+
this.selectedByType[type] = list.map((i) => i.tempId);
|
|
1248
|
+
this.selectAllByType[type] = list.length > 0;
|
|
1249
|
+
});
|
|
1250
|
+
// 🔹 Duplicate: keep your existing parent + duplicateImage logic
|
|
1251
|
+
this.selectedDuplicatesByParent = {}; // reset first
|
|
1252
|
+
parents
|
|
1253
|
+
.filter((p) => p.revopsType === 'duplicate')
|
|
1254
|
+
.forEach((p) => {
|
|
1255
|
+
const parentId = p.tempId;
|
|
1256
|
+
const duplicates = p.duplicateImage || [];
|
|
1257
|
+
this.selectedDuplicatesByParent[parentId] = duplicates.map((d) => d.tempId);
|
|
1258
|
+
});
|
|
1259
|
+
// build final overall ids
|
|
1260
|
+
this.updateOverallSelectedIds();
|
|
1261
|
+
}
|
|
1262
|
+
else {
|
|
1263
|
+
// 🔹 Clear all non-duplicate types dynamically
|
|
1264
|
+
(this.revopsTypes || []).forEach((type) => {
|
|
1265
|
+
if (type === 'duplicate') {
|
|
1266
|
+
return;
|
|
1267
|
+
}
|
|
1268
|
+
this.selectedByType[type] = [];
|
|
1269
|
+
this.selectAllByType[type] = false;
|
|
1270
|
+
});
|
|
1271
|
+
// 🔹 Clear duplicates
|
|
1272
|
+
this.selectedDuplicatesByParent = {};
|
|
1273
|
+
this.selectAllByType.duplicate = false;
|
|
1274
|
+
// 🔹 Clear overall ids
|
|
1275
|
+
this.overallSelectedIds = [];
|
|
1276
|
+
}
|
|
1277
|
+
console.log('selectedByType:', this.selectedByType);
|
|
1278
|
+
console.log('selectedDuplicatesByParent:', this.selectedDuplicatesByParent);
|
|
1279
|
+
}
|
|
1280
|
+
getAllParentItems() {
|
|
1281
|
+
if (!this.footfallTicketsData) {
|
|
1282
|
+
return [];
|
|
1283
|
+
}
|
|
1284
|
+
const allMappings = [];
|
|
1285
|
+
const allRevised = [];
|
|
1286
|
+
// first level: collect all mappingInfo arrays
|
|
1287
|
+
this.footfallTicketsData.forEach((ticket) => {
|
|
1288
|
+
const mappings = ticket?._source?.mappingInfo || [];
|
|
1289
|
+
allMappings.push.apply(allMappings, mappings); // concat
|
|
1290
|
+
});
|
|
1291
|
+
// second level: collect all revisedDetail arrays
|
|
1292
|
+
allMappings.forEach((mapping) => {
|
|
1293
|
+
const details = mapping?.revisedDetail || [];
|
|
1294
|
+
allRevised.push.apply(allRevised, details); // concat
|
|
1295
|
+
});
|
|
1296
|
+
return allRevised;
|
|
1297
|
+
}
|
|
1298
|
+
isCheckboxEnable = false;
|
|
1299
|
+
closeBtn = false;
|
|
1300
|
+
closeDisabled = false;
|
|
1301
|
+
startReview() {
|
|
1302
|
+
let obj = {
|
|
1303
|
+
"storeId": this.ticketData?.storeId,
|
|
1304
|
+
"dateString": this.ticketData?.issueDate,
|
|
1305
|
+
"mode": "web"
|
|
1306
|
+
};
|
|
1307
|
+
this.service.getUpdateTicketStatusApi(obj).pipe(takeUntil(this.destroy$)).subscribe({
|
|
1308
|
+
next: (res) => {
|
|
1309
|
+
if (res && res.code === 200) {
|
|
1310
|
+
this.isCheckboxEnable = true; // call this on your "Review" button click
|
|
1311
|
+
this.closeBtn = true;
|
|
1312
|
+
this.closeDisabled = false;
|
|
1313
|
+
this.dataStoreView(this.ticketData);
|
|
1314
|
+
}
|
|
1315
|
+
},
|
|
1316
|
+
error: (err) => {
|
|
1317
|
+
},
|
|
1318
|
+
complete: () => {
|
|
1319
|
+
this.cd.detectChanges();
|
|
1320
|
+
}
|
|
1321
|
+
});
|
|
1322
|
+
}
|
|
1323
|
+
closePopup;
|
|
1324
|
+
stopReview() {
|
|
1325
|
+
const modalRef = this.modalService.open(this.closePopup, {
|
|
1326
|
+
centered: true,
|
|
1327
|
+
size: "md",
|
|
1328
|
+
backdrop: "static",
|
|
1329
|
+
keyboard: false,
|
|
1330
|
+
});
|
|
1331
|
+
this.isCheckboxEnable = false;
|
|
1332
|
+
this.closeBtn = false;
|
|
1333
|
+
}
|
|
1334
|
+
ticketView(data) {
|
|
1335
|
+
this.ticketData = data;
|
|
1336
|
+
this.isCheckboxEnable = false;
|
|
1337
|
+
this.closeBtn = false;
|
|
1338
|
+
this.closeDisabled = true;
|
|
1339
|
+
if (!data) {
|
|
1340
|
+
console.warn('No data passed to ticketView');
|
|
1341
|
+
this.getOpenTicketList(data);
|
|
1342
|
+
this.select = 'ticketMethod';
|
|
1343
|
+
return;
|
|
1344
|
+
}
|
|
1345
|
+
const reviewedBy = data.ReviewedBy || data.approvedBy;
|
|
1346
|
+
const currentUserEmail = this.usersDetails?.email;
|
|
1347
|
+
const isSameUser = reviewedBy &&
|
|
1348
|
+
currentUserEmail &&
|
|
1349
|
+
reviewedBy.trim().toLowerCase() === currentUserEmail.trim().toLowerCase();
|
|
1350
|
+
if (!isSameUser) {
|
|
1351
|
+
this.isCheckboxEnable = false;
|
|
1352
|
+
}
|
|
1353
|
+
else {
|
|
1354
|
+
if (data.status === 'In-Progress') {
|
|
1355
|
+
this.closeBtn = true;
|
|
1356
|
+
this.closeDisabled = false;
|
|
1357
|
+
this.isCheckboxEnable = true;
|
|
1358
|
+
}
|
|
1359
|
+
else if (data.status === 'Closed') {
|
|
1360
|
+
this.isCheckboxEnable = false;
|
|
1361
|
+
}
|
|
1362
|
+
else {
|
|
1363
|
+
this.closeBtn = false;
|
|
1364
|
+
this.closeDisabled = true;
|
|
1365
|
+
this.isCheckboxEnable = false;
|
|
1366
|
+
}
|
|
1367
|
+
}
|
|
1368
|
+
this.getOpenTicketList(data);
|
|
1369
|
+
this.select = 'ticketMethod';
|
|
1370
|
+
}
|
|
1371
|
+
dataStoreView(data) {
|
|
1372
|
+
this.footfallTicketsData = [];
|
|
1373
|
+
this.footfallNoData = false;
|
|
1374
|
+
this.footfallLoading = true;
|
|
1375
|
+
const ticket = data?.ticketId;
|
|
1376
|
+
this.lastSelectedTicket = ticket;
|
|
1377
|
+
this.addStoreIfNotExists(ticket);
|
|
1378
|
+
this.imageUrl = this.service?.footfallCDN;
|
|
1379
|
+
this.storeIdValue = this.selectedStores;
|
|
1380
|
+
this.service
|
|
1381
|
+
.getTicketsNewApi(ticket)
|
|
1382
|
+
.pipe(takeUntil(this.destroy$))
|
|
1383
|
+
.subscribe({
|
|
1384
|
+
next: (res) => {
|
|
1385
|
+
if (res && res.code === 200) {
|
|
1386
|
+
if (res?.data?.result?.length === 0) {
|
|
1387
|
+
this.footfallTicketsData = [];
|
|
1388
|
+
this.footfallNoData = true;
|
|
1389
|
+
this.footfallLoading = false;
|
|
1390
|
+
this.ts.getErrorToast("No data found for the selected filters");
|
|
1391
|
+
}
|
|
1392
|
+
else {
|
|
1393
|
+
this.footfallTicketsData = res?.data?.result ?? [];
|
|
1394
|
+
this.buildRevopsTypes(this.footfallTicketsData);
|
|
1395
|
+
this.totalItemsFootfall = res?.data?.count;
|
|
1396
|
+
if (this.footfalllimit === 1) {
|
|
1397
|
+
this.paginationSizes = [1];
|
|
1398
|
+
this.pageSizeFootfall = 1;
|
|
1399
|
+
}
|
|
1400
|
+
else {
|
|
1401
|
+
const limit = this.totalItemsFootfall < 10 ? this.totalItemsFootfall : 10;
|
|
1402
|
+
this.paginationSizes = [limit];
|
|
1403
|
+
this.pageSizeFootfall = limit;
|
|
1404
|
+
}
|
|
1405
|
+
this.footfallNoData = false;
|
|
1406
|
+
this.footfallLoading = false;
|
|
1407
|
+
this.updateCloseButtonFromStore();
|
|
1408
|
+
}
|
|
1409
|
+
}
|
|
1410
|
+
else {
|
|
1411
|
+
this.footfallTicketsData = [];
|
|
1412
|
+
this.footfallNoData = true;
|
|
1413
|
+
this.footfallLoading = false;
|
|
1414
|
+
}
|
|
1415
|
+
},
|
|
1416
|
+
error: (err) => {
|
|
1417
|
+
if (err?.error?.code === 400)
|
|
1418
|
+
this.ts.getErrorToast(err?.error?.message ? err?.error?.message : err?.error?.error);
|
|
1419
|
+
this.footfallTicketsData = [];
|
|
1420
|
+
this.footfallNoData = true;
|
|
1421
|
+
this.footfallLoading = false;
|
|
1422
|
+
},
|
|
1423
|
+
complete: () => {
|
|
1424
|
+
this.cd.detectChanges();
|
|
1425
|
+
},
|
|
1426
|
+
});
|
|
1427
|
+
}
|
|
1428
|
+
footfallTicketsData = [];
|
|
1429
|
+
// ---- SELECTION STATE ----
|
|
1430
|
+
selectedByType = {};
|
|
1431
|
+
selectAllByType = {};
|
|
1432
|
+
// ---- HELPERS ----
|
|
1433
|
+
// Get all revisedDetail items of a given type from footfallTicketsData
|
|
1434
|
+
// Get all revisedDetail items of a given type from footfallTicketsData
|
|
1435
|
+
getListByType(type) {
|
|
1436
|
+
if (!this.footfallTicketsData) {
|
|
1437
|
+
return [];
|
|
1438
|
+
}
|
|
1439
|
+
const allRevised = [];
|
|
1440
|
+
// collect revisedDetail ONLY from mappingInfo with type === 'review'
|
|
1441
|
+
this.footfallTicketsData.forEach((ticket) => {
|
|
1442
|
+
const mappings = ticket?._source?.mappingInfo || [];
|
|
1443
|
+
mappings
|
|
1444
|
+
.filter((m) => m?.type === 'review') // 🔹 IMPORTANT
|
|
1445
|
+
.forEach((mapping) => {
|
|
1446
|
+
const details = mapping?.revisedDetail || [];
|
|
1447
|
+
allRevised.push(...details);
|
|
1448
|
+
});
|
|
1449
|
+
});
|
|
1450
|
+
// filter by type (junk / employee / houseKeeping)
|
|
1451
|
+
const filtered = allRevised.filter((original) => original?.revopsType === type);
|
|
1452
|
+
// 🔹 DEDUPE by tempId (or id) so we don't count same image twice
|
|
1453
|
+
const uniqueByTempId = Array.from(new Map(filtered.map((item) => [item.tempId, item])).values());
|
|
1454
|
+
return uniqueByTempId;
|
|
1455
|
+
}
|
|
1456
|
+
updateOverallSelectedIds() {
|
|
1457
|
+
const ids = [];
|
|
1458
|
+
const parents = this.getAllParentItems();
|
|
1459
|
+
const selectedTypesSet = new Set();
|
|
1460
|
+
(this.revopsTypes || [])
|
|
1461
|
+
.filter((type) => type !== 'duplicate')
|
|
1462
|
+
.forEach((type) => {
|
|
1463
|
+
const list = this.getListByType(type);
|
|
1464
|
+
const selectedTemps = this.selectedByType[type] || [];
|
|
1465
|
+
if (selectedTemps.length > 0) {
|
|
1466
|
+
selectedTypesSet.add(type);
|
|
1467
|
+
}
|
|
1468
|
+
list.forEach((item) => {
|
|
1469
|
+
if (selectedTemps.includes(item.tempId) && item.id) {
|
|
1470
|
+
ids.push(item.id);
|
|
1471
|
+
}
|
|
1472
|
+
});
|
|
1473
|
+
});
|
|
1474
|
+
// duplicate logic unchanged
|
|
1475
|
+
parents
|
|
1476
|
+
.filter((p) => p.revopsType === 'duplicate')
|
|
1477
|
+
.forEach((parent) => {
|
|
1478
|
+
const parentId = parent.tempId;
|
|
1479
|
+
const selectedChildTemps = this.selectedDuplicatesByParent[parentId] || [];
|
|
1480
|
+
if (selectedChildTemps.length > 0) {
|
|
1481
|
+
selectedTypesSet.add('duplicate');
|
|
1482
|
+
}
|
|
1483
|
+
(parent.duplicateImage || []).forEach((child) => {
|
|
1484
|
+
if (selectedChildTemps.includes(child.tempId)) {
|
|
1485
|
+
if (child.id) {
|
|
1486
|
+
ids.push(child.id);
|
|
1487
|
+
}
|
|
1488
|
+
else if (parent.id) {
|
|
1489
|
+
ids.push(parent.id);
|
|
1490
|
+
}
|
|
1491
|
+
}
|
|
1492
|
+
});
|
|
1493
|
+
});
|
|
1494
|
+
this.overallSelectedIds = Array.from(new Set(ids));
|
|
1495
|
+
this.selectedCategories = Array.from(selectedTypesSet);
|
|
1496
|
+
console.log('overallSelectedIds:', this.overallSelectedIds);
|
|
1497
|
+
console.log('selectedCategories:', this.selectedCategories);
|
|
1498
|
+
}
|
|
1499
|
+
selectedCategories = []; // junk, employee, houseKeeping, duplicate
|
|
1500
|
+
labelMap = {};
|
|
1501
|
+
toTitleCase(str) {
|
|
1502
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
1503
|
+
}
|
|
1504
|
+
buildLabelMap(tickets) {
|
|
1505
|
+
tickets.forEach((ticket) => {
|
|
1506
|
+
const mappingInfo = ticket?._source?.mappingInfo || [];
|
|
1507
|
+
mappingInfo.forEach((mapping) => {
|
|
1508
|
+
(mapping?.revisedDetail || []).forEach((item) => {
|
|
1509
|
+
// CASE 1: normal entries (employee, vendor, technician, etc.)
|
|
1510
|
+
if (item?.revopsType) {
|
|
1511
|
+
const key = item.revopsType;
|
|
1512
|
+
if (!this.labelMap[key]) {
|
|
1513
|
+
this.labelMap[key] = this.toTitleCase(key);
|
|
1514
|
+
}
|
|
1515
|
+
}
|
|
1516
|
+
// CASE 2: summary rows with { name, type }
|
|
1517
|
+
if (item?.type && item?.name) {
|
|
1518
|
+
this.labelMap[item.type] = item.name;
|
|
1519
|
+
}
|
|
1520
|
+
});
|
|
1521
|
+
});
|
|
1522
|
+
});
|
|
1523
|
+
console.log("Label Map:", this.labelMap);
|
|
1524
|
+
}
|
|
1525
|
+
get selectedCategoriesLabel() {
|
|
1526
|
+
if (!this.selectedCategories?.length)
|
|
1527
|
+
return "";
|
|
1528
|
+
if (this.selectedCategories.length === 1) {
|
|
1529
|
+
const type = this.selectedCategories[0];
|
|
1530
|
+
return this.labelMap[type] || this.toTitleCase(type);
|
|
1531
|
+
}
|
|
1532
|
+
return this.selectedCategories
|
|
1533
|
+
.map((t) => this.labelMap[t] || this.toTitleCase(t))
|
|
1534
|
+
.join(", ");
|
|
1535
|
+
}
|
|
1536
|
+
type;
|
|
1537
|
+
// "Select all" / "Unselect all" for a type
|
|
1538
|
+
popupvalue;
|
|
1539
|
+
// or just: popupvalue: string = '';
|
|
1540
|
+
onSelectAll(type, event) {
|
|
1541
|
+
const checked = event?.target?.checked;
|
|
1542
|
+
this.selectAllByType[type] = checked;
|
|
1543
|
+
this.type = type;
|
|
1544
|
+
this.popupvalue = type; // 🔴 IMPORTANT
|
|
1545
|
+
const list = this.getListByType(type);
|
|
1546
|
+
this.selectedByType[type] = checked ? list.map((x) => x.tempId) : [];
|
|
1547
|
+
this.updateOverallSelectedIds();
|
|
1548
|
+
console.log(this.selectedByType);
|
|
1549
|
+
}
|
|
1550
|
+
// Single checkbox change for one image
|
|
1551
|
+
onImageCheckboxChange(type, id) {
|
|
1552
|
+
// ensure array exists
|
|
1553
|
+
const current = this.selectedByType[type] || [];
|
|
1554
|
+
const selected = new Set(current);
|
|
1555
|
+
if (selected.has(id)) {
|
|
1556
|
+
selected.delete(id); // uncheck
|
|
1557
|
+
}
|
|
1558
|
+
else {
|
|
1559
|
+
selected.add(id); // check
|
|
1560
|
+
}
|
|
1561
|
+
// assign new array (better for change detection)
|
|
1562
|
+
this.selectedByType[type] = Array.from(selected);
|
|
1563
|
+
// total items for this type (now using deduped list)
|
|
1564
|
+
const total = this.getListByType(type).length;
|
|
1565
|
+
// ✅ auto-check "select all" when all items of that type are selected
|
|
1566
|
+
this.selectAllByType[type] =
|
|
1567
|
+
total > 0 && this.selectedByType[type].length === total;
|
|
1568
|
+
console.log(`type=${type}, total=${total}, selected=${this.selectedByType[type].length}, selectAll=${this.selectAllByType[type]}`);
|
|
1569
|
+
this.updateOverallSelectedIds();
|
|
1570
|
+
this.popupvalue = type;
|
|
1571
|
+
}
|
|
1572
|
+
remarks;
|
|
1573
|
+
zoomPopup;
|
|
1574
|
+
popupType;
|
|
1575
|
+
popupIds = [];
|
|
1576
|
+
popupOpen(type, value) {
|
|
1577
|
+
// store type
|
|
1578
|
+
this.popupType = type;
|
|
1579
|
+
this.popupIds = this.overallSelectedIds || [];
|
|
1580
|
+
const modalRef = this.modalService.open(this.zoomPopup, {
|
|
1581
|
+
centered: true,
|
|
1582
|
+
size: "md",
|
|
1583
|
+
backdrop: "static",
|
|
1584
|
+
keyboard: false,
|
|
1585
|
+
});
|
|
1586
|
+
}
|
|
1587
|
+
houseKeepingACCount;
|
|
1588
|
+
employeeACCount;
|
|
1589
|
+
duplicateACCount;
|
|
1590
|
+
junkACCount;
|
|
1591
|
+
selectedDuplicateImagesList = [];
|
|
1592
|
+
selectedHousekeepingImagesList = [];
|
|
1593
|
+
selectedEmployeeImagesList = [];
|
|
1594
|
+
selectedJunkImagesList = [];
|
|
1595
|
+
submitValue(status = "approved", category = "duplicate") {
|
|
1596
|
+
// Step 1: Validate based on current category
|
|
1597
|
+
let obj = {
|
|
1598
|
+
id: this.popupIds,
|
|
1599
|
+
status: status,
|
|
1600
|
+
type: this.hasApproverAccess && this.selectedRole == 'approver' ? "approve" : "review",
|
|
1601
|
+
...(this.remarks?.trim() && { comments: this.remarks.trim() })
|
|
1602
|
+
};
|
|
1603
|
+
this.service
|
|
1604
|
+
.getUpdateTempStatusApi(obj)
|
|
1605
|
+
.pipe(takeUntil(this.destroy$))
|
|
1606
|
+
.subscribe({
|
|
1607
|
+
next: (res) => {
|
|
1608
|
+
if (res && res?.code === 200) {
|
|
1609
|
+
this.ts.getSuccessToast(`${this.overallSelectedIds?.length ? this.overallSelectedIds?.length : this.popupValue ?
|
|
1610
|
+
this.popupValue : '--'} ${this.selectedCategoriesLabel.charAt(0).toUpperCase() + this.selectedCategoriesLabel.slice(1)} ${status}`);
|
|
1611
|
+
this.cancel();
|
|
1612
|
+
this.dataStoreView(this.ticketData);
|
|
1613
|
+
this.remarks = "";
|
|
1614
|
+
}
|
|
1615
|
+
else {
|
|
1616
|
+
this.ts.getErrorToast("Error updating status");
|
|
1617
|
+
}
|
|
1618
|
+
},
|
|
1619
|
+
error: (err) => {
|
|
1620
|
+
const errorMsg = err?.error?.message ||
|
|
1621
|
+
err?.error?.error ||
|
|
1622
|
+
err?.error ||
|
|
1623
|
+
err?.message ||
|
|
1624
|
+
"Error updating status";
|
|
1625
|
+
this.ts.getErrorToast(errorMsg);
|
|
1626
|
+
},
|
|
1627
|
+
complete: () => {
|
|
1628
|
+
this.cd.detectChanges();
|
|
1629
|
+
},
|
|
1630
|
+
});
|
|
1631
|
+
}
|
|
1632
|
+
resetSelections() {
|
|
1633
|
+
// completely replace the object so change detection sees it
|
|
1634
|
+
this.selectedByType = {};
|
|
1635
|
+
this.selectAllByType = {};
|
|
1636
|
+
this.selectedDuplicatesByParent = {};
|
|
1637
|
+
this.overallSelectedIds = [];
|
|
1638
|
+
this.popupIds = [];
|
|
1639
|
+
console.log("RESET selections:", this.selectedByType, this.selectedDuplicatesByParent);
|
|
1640
|
+
}
|
|
1641
|
+
cancel() {
|
|
1642
|
+
this.modalService.dismissAll();
|
|
1643
|
+
this.resetSelections();
|
|
1644
|
+
this.allSelected = false;
|
|
1645
|
+
}
|
|
1646
|
+
openArrow() {
|
|
1647
|
+
this.arrowshow = !this.arrowshow;
|
|
1648
|
+
}
|
|
1649
|
+
getOpenTicketList(data) {
|
|
1650
|
+
console.log("getOpenTicketList data:", data);
|
|
1651
|
+
// support passing either whole store object or just ticketId
|
|
1652
|
+
const selectedTicketId = data?.ticketId ?? data;
|
|
1653
|
+
const obj = {
|
|
1654
|
+
clientId: [this.headerFilters?.client],
|
|
1655
|
+
fromDate: this.headerFilters?.date?.startDate,
|
|
1656
|
+
toDate: this.headerFilters?.date?.endDate,
|
|
1657
|
+
};
|
|
1658
|
+
this.service
|
|
1659
|
+
.getOpenTicketListApi(obj)
|
|
1660
|
+
.pipe(takeUntil(this.destroy$))
|
|
1661
|
+
.subscribe({
|
|
1662
|
+
next: (res) => {
|
|
1663
|
+
if (res && res?.code === 200) {
|
|
1664
|
+
this.openTicketsList = res?.data ?? [];
|
|
1665
|
+
// reset selection
|
|
1666
|
+
this.selectedStores = [];
|
|
1667
|
+
this.allSelected = false;
|
|
1668
|
+
if (!this.openTicketsList.length) {
|
|
1669
|
+
return;
|
|
1670
|
+
}
|
|
1671
|
+
let storeToSelect;
|
|
1672
|
+
// 👉 1) if data passed, try to match in NEW list by ticketId
|
|
1673
|
+
if (selectedTicketId) {
|
|
1674
|
+
storeToSelect = this.openTicketsList.find((s) => s.ticketId === selectedTicketId);
|
|
1675
|
+
}
|
|
1676
|
+
// 👉 2) if no match or no data → fallback to 0 index
|
|
1677
|
+
if (!storeToSelect) {
|
|
1678
|
+
storeToSelect = this.openTicketsList[0];
|
|
1679
|
+
}
|
|
1680
|
+
// 👉 3) set selection + call handler
|
|
1681
|
+
this.selectedStores = [storeToSelect];
|
|
1682
|
+
this.dataStoreView(storeToSelect);
|
|
1683
|
+
}
|
|
1684
|
+
else {
|
|
1685
|
+
this.openTicketsList = [];
|
|
1686
|
+
this.selectedStores = [];
|
|
1687
|
+
this.allSelected = false;
|
|
1688
|
+
}
|
|
1689
|
+
},
|
|
1690
|
+
error: () => {
|
|
1691
|
+
this.openTicketsList = [];
|
|
1692
|
+
this.selectedStores = [];
|
|
1693
|
+
this.allSelected = false;
|
|
1694
|
+
},
|
|
1695
|
+
complete: () => {
|
|
1696
|
+
this.cd.detectChanges();
|
|
1697
|
+
},
|
|
1698
|
+
});
|
|
1699
|
+
}
|
|
1700
|
+
isLockedByReviewer(original) {
|
|
1701
|
+
// 🔹 Approver flow
|
|
1702
|
+
if (this.hasApproverAccess) {
|
|
1703
|
+
this.getCurrentRoleMapping();
|
|
1704
|
+
// lock if already approved/rejected by APPROVER
|
|
1705
|
+
return this.isApproved1(original) || this.isRejected1(original);
|
|
1706
|
+
}
|
|
1707
|
+
// 🔹 Reviewer flow
|
|
1708
|
+
this.getCurrentReviewMapping();
|
|
1709
|
+
// lock if already approved/rejected by REVIEW
|
|
1710
|
+
return this.isApproved(original) || this.isRejected(original);
|
|
1711
|
+
}
|
|
1712
|
+
isApproved1(original) {
|
|
1713
|
+
const actions = original?.actions || [];
|
|
1714
|
+
return actions.some((a) => a.actionType === "approve" && a.action === "approved");
|
|
1715
|
+
}
|
|
1716
|
+
isRejected1(original) {
|
|
1717
|
+
const actions = original?.actions || [];
|
|
1718
|
+
return actions.some((a) => a.actionType === "approve" && a.action === "rejected");
|
|
1719
|
+
}
|
|
1720
|
+
isApproved(original) {
|
|
1721
|
+
const actions = original?.actions || [];
|
|
1722
|
+
return actions.some((a) => a.actionType === "review" && a.action === "approved");
|
|
1723
|
+
}
|
|
1724
|
+
isRejected(original) {
|
|
1725
|
+
const actions = original?.actions || [];
|
|
1726
|
+
return actions.some((a) => a.actionType === "review" && a.action === "rejected");
|
|
1727
|
+
}
|
|
1728
|
+
resetCheckbox(type, original) {
|
|
1729
|
+
if (!original?.actions || !Array.isArray(original.actions)) {
|
|
1730
|
+
return;
|
|
1731
|
+
}
|
|
1732
|
+
const actions = original.actions;
|
|
1733
|
+
// 1) Check if there is a decision (review/approve → approved/rejected)
|
|
1734
|
+
const hasDecision = actions.some((a) => ((a.actionType === "review" || a.actionType === "approve") &&
|
|
1735
|
+
(a.action === "approved" || a.action === "rejected")));
|
|
1736
|
+
// If NO approved/rejected → do nothing
|
|
1737
|
+
if (!hasDecision) {
|
|
1738
|
+
return;
|
|
1739
|
+
}
|
|
1740
|
+
// 2) Remove only decision actions
|
|
1741
|
+
original.actions = actions.filter((a) => !((a.actionType === "review" || a.actionType === "approve") &&
|
|
1742
|
+
(a.action === "approved" || a.action === "rejected")));
|
|
1743
|
+
// 3) Remove from selected array
|
|
1744
|
+
const tempId = original.tempId;
|
|
1745
|
+
const arr = this.selectedByType[type] || [];
|
|
1746
|
+
const i = arr.indexOf(tempId);
|
|
1747
|
+
if (i > -1)
|
|
1748
|
+
arr.splice(i, 1);
|
|
1749
|
+
// 4) Uncheck select all for that type
|
|
1750
|
+
this.selectAllByType[type] = false;
|
|
1751
|
+
}
|
|
1752
|
+
viewMode = "tagging";
|
|
1753
|
+
getAction(original, type) {
|
|
1754
|
+
return original?.actions?.find((a) => a.actionType === type) || null;
|
|
1755
|
+
}
|
|
1756
|
+
updateCloseButtonFromStore() {
|
|
1757
|
+
const mapping = this.getCurrentReviewMapping();
|
|
1758
|
+
console.log('mapping used for close calc:', mapping);
|
|
1759
|
+
// if no mapping found, keep closeBtn false
|
|
1760
|
+
this.closeBtn = !!mapping && this.isTicketFullyReviewed(mapping);
|
|
1761
|
+
console.log('closeBtn =>', this.closeBtn);
|
|
1762
|
+
}
|
|
1763
|
+
getCurrentReviewMapping() {
|
|
1764
|
+
if (!this.footfallTicketsData || !this.footfallTicketsData.length) {
|
|
1765
|
+
return null;
|
|
1766
|
+
}
|
|
1767
|
+
// Go through all tickets and mappingInfo
|
|
1768
|
+
for (const ticket of this.footfallTicketsData) {
|
|
1769
|
+
const source = ticket?._source;
|
|
1770
|
+
const mappingList = source?.mappingInfo || [];
|
|
1771
|
+
// pick the first mapping with type 'review' that has revisedDetail
|
|
1772
|
+
const found = mappingList.find((m) => m?.type === 'review' && m?.revisedDetail?.length);
|
|
1773
|
+
if (found) {
|
|
1774
|
+
return found;
|
|
1775
|
+
}
|
|
1776
|
+
}
|
|
1777
|
+
return null;
|
|
1778
|
+
}
|
|
1779
|
+
// Decide if ticket is fully reviewed based on ALL mappingInfo[type='review']
|
|
1780
|
+
isTicketFullyReviewed(mapping) {
|
|
1781
|
+
if (!mapping?.revisedDetail)
|
|
1782
|
+
return false;
|
|
1783
|
+
const details = mapping.revisedDetail;
|
|
1784
|
+
const nonDupTypes = ["employee", "junk", "houseKeeping"];
|
|
1785
|
+
const nonDupItems = details.filter(d => nonDupTypes.includes(d.revopsType));
|
|
1786
|
+
const nonDupReviewedCount = nonDupItems.filter(d => {
|
|
1787
|
+
const review = this.getAction(d, "review");
|
|
1788
|
+
return review && (review.action === "approved" || review.action === "rejected");
|
|
1789
|
+
}).length;
|
|
1790
|
+
const parentItems = details.filter(d => d.isParent);
|
|
1791
|
+
const dupChildren = parentItems.reduce((acc, p) => {
|
|
1792
|
+
return acc.concat(p.duplicateImage || []);
|
|
1793
|
+
}, []);
|
|
1794
|
+
const dupReviewedCount = dupChildren.filter(d => {
|
|
1795
|
+
const review = this.getAction(d, "review");
|
|
1796
|
+
return review && (review.action === "approved" || review.action === "rejected");
|
|
1797
|
+
}).length;
|
|
1798
|
+
const totalToReview = nonDupItems.length + dupChildren.length;
|
|
1799
|
+
const totalReviewed = nonDupReviewedCount + dupReviewedCount;
|
|
1800
|
+
return totalToReview > 0 && totalReviewed === totalToReview;
|
|
1801
|
+
}
|
|
1802
|
+
getInitialsFromEmail(email) {
|
|
1803
|
+
if (!email)
|
|
1804
|
+
return "";
|
|
1805
|
+
// take text before @
|
|
1806
|
+
const namePart = email.split("@")[0];
|
|
1807
|
+
// split by . or space (e.g. "sandeep.pal" -> ["sandeep", "pal"])
|
|
1808
|
+
const parts = namePart.split(/[.\s_-]+/).filter(Boolean);
|
|
1809
|
+
if (parts.length >= 2) {
|
|
1810
|
+
return (parts[0][0] + parts[1][0]).toUpperCase(); // S + P = SP
|
|
1811
|
+
}
|
|
1812
|
+
// fallback: first two chars of whole namePart
|
|
1813
|
+
return namePart.substring(0, 2).toUpperCase();
|
|
1814
|
+
}
|
|
1815
|
+
confirmCloseTicket() {
|
|
1816
|
+
let obj = {
|
|
1817
|
+
ticketName: "footfall-directory",
|
|
1818
|
+
storeId: this.footfallTicketsData[0]?._source?.storeId,
|
|
1819
|
+
dateString: this.footfallTicketsData[0]?._source?.dateString,
|
|
1820
|
+
type: this.hasApproverAccess && this.selectedRole == 'approver' ? "approve" : "review",
|
|
1821
|
+
mode: "web",
|
|
1822
|
+
};
|
|
1823
|
+
// console.log("close ticket obj:", obj);
|
|
1824
|
+
// return
|
|
1825
|
+
this.service
|
|
1826
|
+
.getCreateTicketListApi(obj)
|
|
1827
|
+
.pipe(takeUntil(this.destroy$))
|
|
1828
|
+
.subscribe({
|
|
1829
|
+
next: (res) => {
|
|
1830
|
+
if (res && res?.code === 200) {
|
|
1831
|
+
this.ts.getSuccessToast("Ticket closed successfully");
|
|
1832
|
+
this.confirmCloseCancel();
|
|
1833
|
+
this.dataStoreView(this.ticketData);
|
|
1834
|
+
}
|
|
1835
|
+
else {
|
|
1836
|
+
this.ts.getErrorToast("Error closing ticket");
|
|
1837
|
+
}
|
|
1838
|
+
this.cd.detectChanges();
|
|
1839
|
+
},
|
|
1840
|
+
error: (err) => {
|
|
1841
|
+
const errorMsg = err?.error?.message ||
|
|
1842
|
+
err?.error?.error ||
|
|
1843
|
+
err?.error ||
|
|
1844
|
+
err?.message ||
|
|
1845
|
+
"Error closing ticket";
|
|
1846
|
+
this.ts.getErrorToast(errorMsg);
|
|
1847
|
+
this.isCheckboxEnable = true;
|
|
1848
|
+
this.closeBtn = true;
|
|
1849
|
+
this.closeDisabled = false;
|
|
1850
|
+
}
|
|
1851
|
+
});
|
|
1852
|
+
}
|
|
1853
|
+
confirmCloseCancel() {
|
|
1854
|
+
this.modalService.dismissAll();
|
|
1855
|
+
}
|
|
1856
|
+
imagePreviewPopup;
|
|
1857
|
+
previewList = [];
|
|
1858
|
+
currentPreviewIndex = 0;
|
|
1859
|
+
previewTitle = 'Tagged Duplicates';
|
|
1860
|
+
get currentPreviewItem() {
|
|
1861
|
+
if (!this.previewList || !this.previewList.length) {
|
|
1862
|
+
return null;
|
|
1863
|
+
}
|
|
1864
|
+
if (this.currentPreviewIndex == null ||
|
|
1865
|
+
this.currentPreviewIndex < 0 ||
|
|
1866
|
+
this.currentPreviewIndex >= this.previewList.length) {
|
|
1867
|
+
return null;
|
|
1868
|
+
}
|
|
1869
|
+
return this.previewList[this.currentPreviewIndex];
|
|
1870
|
+
}
|
|
1871
|
+
getPreviewImageUrl() {
|
|
1872
|
+
const item = this.currentPreviewItem;
|
|
1873
|
+
console.log(item);
|
|
1874
|
+
return item ? this.imageUrl + item.filePath : '';
|
|
1875
|
+
}
|
|
1876
|
+
overallMapping;
|
|
1877
|
+
openImagePreview(list, target, startIndex, title) {
|
|
1878
|
+
this.overallMapping = list;
|
|
1879
|
+
this.previewTitle = title;
|
|
1880
|
+
// 1) If target has duplicateImage array → use that
|
|
1881
|
+
if (target?.duplicateImage && Array.isArray(target.duplicateImage) && target.duplicateImage.length) {
|
|
1882
|
+
this.previewList = target.duplicateImage;
|
|
1883
|
+
}
|
|
1884
|
+
// 2) Else if target itself is an array (like revisedDetail) → use that
|
|
1885
|
+
else if (Array.isArray(target) && target.length) {
|
|
1886
|
+
this.previewList = target;
|
|
1887
|
+
}
|
|
1888
|
+
// 3) Else treat target as single item
|
|
1889
|
+
else {
|
|
1890
|
+
this.previewList = [target];
|
|
1891
|
+
}
|
|
1892
|
+
console.log('Preview list set:', this.previewList);
|
|
1893
|
+
// make sure index is safe
|
|
1894
|
+
if (startIndex != null &&
|
|
1895
|
+
startIndex >= 0 &&
|
|
1896
|
+
startIndex < this.previewList.length) {
|
|
1897
|
+
this.currentPreviewIndex = startIndex;
|
|
1898
|
+
}
|
|
1899
|
+
else {
|
|
1900
|
+
this.currentPreviewIndex = 0;
|
|
1901
|
+
}
|
|
1902
|
+
this.modalService.open(this.imagePreviewPopup, {
|
|
1903
|
+
centered: true,
|
|
1904
|
+
size: 'lg',
|
|
1905
|
+
backdrop: 'static',
|
|
1906
|
+
});
|
|
1907
|
+
}
|
|
1908
|
+
// 1) Check if there is an APPROVE mapping with status Closed in overall mapping
|
|
1909
|
+
overallApproveClosed() {
|
|
1910
|
+
const list = this.overallMapping || [];
|
|
1911
|
+
return Array.isArray(list) && list.some((m) => m?.type === 'approve' &&
|
|
1912
|
+
m?.status?.toLowerCase() === 'closed');
|
|
1913
|
+
}
|
|
1914
|
+
// 2) Get approve action for a single image
|
|
1915
|
+
getApproveActionForItem(item) {
|
|
1916
|
+
const actions = item?.actions || [];
|
|
1917
|
+
return actions.find((a) => a.actionType === 'approve' &&
|
|
1918
|
+
(a.action === 'approved' || a.action === 'rejected')) || null;
|
|
1919
|
+
}
|
|
1920
|
+
// 3) Final function: can we show Accept / Reject for this image?
|
|
1921
|
+
canShowPreviewActions(item) {
|
|
1922
|
+
// if overall approve is closed -> no buttons
|
|
1923
|
+
if (this.overallApproveClosed()) {
|
|
1924
|
+
return false;
|
|
1925
|
+
}
|
|
1926
|
+
// if this image already has approve approved/rejected -> no buttons
|
|
1927
|
+
const approveAction = this.getApproveActionForItem(item);
|
|
1928
|
+
if (approveAction) {
|
|
1929
|
+
return false;
|
|
1930
|
+
}
|
|
1931
|
+
// otherwise -> show buttons
|
|
1932
|
+
return true;
|
|
1933
|
+
}
|
|
1934
|
+
prevPreview() {
|
|
1935
|
+
if (this.previewList.length <= 1)
|
|
1936
|
+
return;
|
|
1937
|
+
this.currentPreviewIndex =
|
|
1938
|
+
this.currentPreviewIndex === 0
|
|
1939
|
+
? this.previewList.length - 1
|
|
1940
|
+
: this.currentPreviewIndex - 1;
|
|
1941
|
+
}
|
|
1942
|
+
nextPreview() {
|
|
1943
|
+
if (this.previewList.length <= 1)
|
|
1944
|
+
return;
|
|
1945
|
+
this.currentPreviewIndex =
|
|
1946
|
+
this.currentPreviewIndex === this.previewList.length - 1
|
|
1947
|
+
? 0
|
|
1948
|
+
: this.currentPreviewIndex + 1;
|
|
1949
|
+
}
|
|
1950
|
+
popupValue;
|
|
1951
|
+
rejectedPopup(type, value) {
|
|
1952
|
+
this.overallSelectedIds = [value?.id];
|
|
1953
|
+
this.popupValue = 1;
|
|
1954
|
+
this.popupOpen(type);
|
|
1955
|
+
}
|
|
1956
|
+
approvedPopup(type, value) {
|
|
1957
|
+
this.overallSelectedIds = [value?.id];
|
|
1958
|
+
this.popupValue = 1;
|
|
1959
|
+
this.popupOpen(type);
|
|
1960
|
+
}
|
|
1961
|
+
get hasApproverAccess() {
|
|
1962
|
+
const perm = this.usersDetails?.permission;
|
|
1963
|
+
return !!(perm?.FootfallDirectory_approver_isAdd ||
|
|
1964
|
+
perm?.FootfallDirectory_approver_isEdit);
|
|
1965
|
+
}
|
|
1966
|
+
get hasReviewerAccess() {
|
|
1967
|
+
const perm = this.usersDetails?.permission;
|
|
1968
|
+
return !!(perm?.FootfallDirectory_reviewer_isAdd ||
|
|
1969
|
+
perm?.FootfallDirectory_reviewer_isEdit);
|
|
1970
|
+
}
|
|
1971
|
+
// call this in ngOnInit or after usersDetails is loaded
|
|
1972
|
+
setDefaultRole() {
|
|
1973
|
+
if (this.hasApproverAccess) {
|
|
1974
|
+
this.selectedRole = 'approver';
|
|
1975
|
+
}
|
|
1976
|
+
else if (this.hasReviewerAccess) {
|
|
1977
|
+
this.selectedRole = 'reviewer';
|
|
1978
|
+
}
|
|
1979
|
+
else {
|
|
1980
|
+
this.selectedRole = '';
|
|
1981
|
+
}
|
|
1982
|
+
}
|
|
1983
|
+
SelectedRole(role) {
|
|
1984
|
+
if (role === 'approver' && !this.hasApproverAccess)
|
|
1985
|
+
return;
|
|
1986
|
+
if (role === 'reviewer' && !this.hasReviewerAccess)
|
|
1987
|
+
return;
|
|
1988
|
+
this.selectedRole = role;
|
|
1989
|
+
this.getTicketList('store');
|
|
1990
|
+
// 🔹 put your role-based logic here:
|
|
1991
|
+
// e.g. filter mappingInfo, change API call, etc.
|
|
1992
|
+
// this.loadRoleData(role);
|
|
1993
|
+
}
|
|
1994
|
+
showApproveDetails = false;
|
|
1995
|
+
showTangoDetails = false;
|
|
1996
|
+
toggleRevisedDetails(mapping) {
|
|
1997
|
+
if (mapping?.type === 'approve') {
|
|
1998
|
+
this.showApproveDetails = !this.showApproveDetails;
|
|
1999
|
+
}
|
|
2000
|
+
else if (mapping?.type === 'tangoreview') {
|
|
2001
|
+
this.showTangoDetails = !this.showTangoDetails;
|
|
2002
|
+
}
|
|
2003
|
+
}
|
|
2004
|
+
reviwerList;
|
|
2005
|
+
reviewrApi() {
|
|
2006
|
+
this.service.getReviewerApi(this.headerFilters?.client, 'approve').pipe(takeUntil(this.destroy$))
|
|
2007
|
+
.subscribe({
|
|
2008
|
+
next: (res) => {
|
|
2009
|
+
if (res && res?.code === 200) {
|
|
2010
|
+
this.reviwerList = res?.data;
|
|
2011
|
+
}
|
|
2012
|
+
else {
|
|
2013
|
+
this.reviwerList = [];
|
|
2014
|
+
}
|
|
2015
|
+
}, error: (err) => {
|
|
2016
|
+
},
|
|
2017
|
+
});
|
|
2018
|
+
}
|
|
2019
|
+
reviewerChange(event) {
|
|
2020
|
+
this.selectedReviewer = event;
|
|
2021
|
+
}
|
|
2022
|
+
assignTicketView() {
|
|
2023
|
+
let obj = {
|
|
2024
|
+
email: this.selectedReviewer?.email,
|
|
2025
|
+
userName: this.selectedReviewer?.userName,
|
|
2026
|
+
role: this.selectedReviewer?.role,
|
|
2027
|
+
actionType: "review",
|
|
2028
|
+
storeId: this.ticketData?.storeId,
|
|
2029
|
+
dateString: this.ticketData?.issueDate,
|
|
2030
|
+
};
|
|
2031
|
+
this.service.getTicketAssignApi(obj).pipe(takeUntil(this.destroy$))
|
|
2032
|
+
.subscribe({
|
|
2033
|
+
next: (res) => {
|
|
2034
|
+
if (res && res?.code === 200) {
|
|
2035
|
+
this.ts.getSuccessToast('User assigned successfully.');
|
|
2036
|
+
this.cancelassign();
|
|
2037
|
+
}
|
|
2038
|
+
else {
|
|
2039
|
+
this.ts.getErrorToast("Error updating status");
|
|
2040
|
+
}
|
|
2041
|
+
}, error: (err) => {
|
|
2042
|
+
const errorMsg = err?.error?.message ||
|
|
2043
|
+
err?.error?.error ||
|
|
2044
|
+
err?.error ||
|
|
2045
|
+
err?.message ||
|
|
2046
|
+
"Error closing ticket";
|
|
2047
|
+
this.ts.getErrorToast(errorMsg);
|
|
2048
|
+
},
|
|
2049
|
+
});
|
|
2050
|
+
}
|
|
2051
|
+
cancelassign() {
|
|
2052
|
+
this.modalService.dismissAll();
|
|
2053
|
+
this.reviwerList = [];
|
|
2054
|
+
this.selectedReviewer = [];
|
|
2055
|
+
}
|
|
2056
|
+
isTicketMenuOpen = false;
|
|
2057
|
+
toggleTicketMenu(event) {
|
|
2058
|
+
event.stopPropagation();
|
|
2059
|
+
this.isTicketMenuOpen = !this.isTicketMenuOpen;
|
|
2060
|
+
}
|
|
2061
|
+
// close when clicking outside
|
|
2062
|
+
onDocumentClick() {
|
|
2063
|
+
this.isTicketMenuOpen = false;
|
|
2064
|
+
}
|
|
2065
|
+
onReassignClick() {
|
|
2066
|
+
this.isTicketMenuOpen = false;
|
|
2067
|
+
// 🔹 open your popup here
|
|
2068
|
+
this.openReassignPopup(); // implement this
|
|
2069
|
+
}
|
|
2070
|
+
ReassignTicketPopup;
|
|
2071
|
+
openReassignPopup() {
|
|
2072
|
+
const modalRef = this.modalService.open(this.ReassignTicketPopup, {
|
|
2073
|
+
centered: true,
|
|
2074
|
+
size: "md",
|
|
2075
|
+
scrollable: true,
|
|
2076
|
+
backdrop: "static",
|
|
2077
|
+
});
|
|
2078
|
+
this.reviewrApi();
|
|
2079
|
+
}
|
|
2080
|
+
onExportClick() {
|
|
2081
|
+
this.isTicketMenuOpen = false;
|
|
2082
|
+
// 🔹 call your export API / logic here
|
|
2083
|
+
// this.exportTicket();
|
|
2084
|
+
}
|
|
2085
|
+
getMultipleTicketClose() {
|
|
2086
|
+
if (!this.selectedStores || !this.selectedStores.length) {
|
|
2087
|
+
this.ts.getErrorToast('Please select at least one ticket');
|
|
2088
|
+
return;
|
|
2089
|
+
}
|
|
2090
|
+
const ticketList = this.selectedStores.map((store) => ({
|
|
2091
|
+
storeId: store.storeId,
|
|
2092
|
+
dateString: store.dateString || store.issueDate,
|
|
2093
|
+
}));
|
|
2094
|
+
const obj = {
|
|
2095
|
+
ticketList,
|
|
2096
|
+
mode: 'web',
|
|
2097
|
+
};
|
|
2098
|
+
this.service.getMultiCloseTicketApi(obj).subscribe({
|
|
2099
|
+
next: (res) => {
|
|
2100
|
+
if (res && res.code === 200) {
|
|
2101
|
+
// success
|
|
2102
|
+
this.ts.getSuccessToast('Tickets closed successfully');
|
|
2103
|
+
this.dataStoreView(this.selectedStores);
|
|
2104
|
+
this.selectedStores = [];
|
|
2105
|
+
this.allSelected = false;
|
|
2106
|
+
}
|
|
2107
|
+
else {
|
|
2108
|
+
// this.toastService.getErrorToast('Failed to close tickets');
|
|
2109
|
+
}
|
|
2110
|
+
},
|
|
2111
|
+
error: (err) => {
|
|
2112
|
+
console.error('Failed to close tickets', err);
|
|
2113
|
+
this.ts.getErrorToast('Failed to close tickets');
|
|
2114
|
+
},
|
|
2115
|
+
});
|
|
2116
|
+
}
|
|
2117
|
+
isRowSelectable(row) {
|
|
2118
|
+
return row?.status?.toLowerCase() === 'open';
|
|
2119
|
+
}
|
|
2120
|
+
selectedTicketRows = [];
|
|
2121
|
+
// check if a row is currently selected
|
|
2122
|
+
isRowSelected(row) {
|
|
2123
|
+
return this.selectedTicketRows.includes(row);
|
|
2124
|
+
}
|
|
2125
|
+
// rows that CAN be selected (status open)
|
|
2126
|
+
getSelectableRows() {
|
|
2127
|
+
return (this.footfallListData || []).filter((r) => this.isRowSelectable(r));
|
|
2128
|
+
}
|
|
2129
|
+
// header "select all" checkbox state
|
|
2130
|
+
areAllSelectableRowsSelected() {
|
|
2131
|
+
const selectable = this.getSelectableRows();
|
|
2132
|
+
return (selectable.length > 0 &&
|
|
2133
|
+
selectable.every(r => this.selectedTicketRows.includes(r)));
|
|
2134
|
+
}
|
|
2135
|
+
closeMultiple = true;
|
|
2136
|
+
updateCloseDisabled() {
|
|
2137
|
+
this.closeMultiple = this.selectedTicketRows.length === 0;
|
|
2138
|
+
}
|
|
2139
|
+
// single row checkbox toggle
|
|
2140
|
+
toggleRowSelection(row, event) {
|
|
2141
|
+
if (!this.isRowSelectable(row))
|
|
2142
|
+
return;
|
|
2143
|
+
const target = event.target;
|
|
2144
|
+
const checked = target.checked;
|
|
2145
|
+
if (checked) {
|
|
2146
|
+
if (!this.isRowSelected(row)) {
|
|
2147
|
+
this.selectedTicketRows = [...this.selectedTicketRows, row];
|
|
2148
|
+
}
|
|
2149
|
+
}
|
|
2150
|
+
else {
|
|
2151
|
+
this.selectedTicketRows = this.selectedTicketRows.filter(r => r !== row);
|
|
2152
|
+
}
|
|
2153
|
+
this.updateCloseDisabled();
|
|
2154
|
+
// optional: debug
|
|
2155
|
+
// console.log('Selected rows:', this.selectedTicketRows);
|
|
2156
|
+
}
|
|
2157
|
+
// header "Select All" toggle
|
|
2158
|
+
toggleSelectAllRows(event) {
|
|
2159
|
+
const target = event.target;
|
|
2160
|
+
const checked = target.checked;
|
|
2161
|
+
if (checked) {
|
|
2162
|
+
this.selectedTicketRows = this.getSelectableRows().slice();
|
|
2163
|
+
}
|
|
2164
|
+
else {
|
|
2165
|
+
this.selectedTicketRows = [];
|
|
2166
|
+
}
|
|
2167
|
+
this.updateCloseDisabled();
|
|
2168
|
+
}
|
|
2169
|
+
showImagesModal = false;
|
|
2170
|
+
selectedImagesForPopup = [];
|
|
2171
|
+
selectedComment = null;
|
|
2172
|
+
openImagesPopup(comment) {
|
|
2173
|
+
// console.log(comment)
|
|
2174
|
+
// return
|
|
2175
|
+
this.selectedComment = comment;
|
|
2176
|
+
this.selectedImagesForPopup = comment?.taggedImages || [];
|
|
2177
|
+
this.showImagesModal = true;
|
|
2178
|
+
}
|
|
2179
|
+
closeImagesPopup() {
|
|
2180
|
+
this.showImagesModal = false;
|
|
2181
|
+
this.selectedImagesForPopup = [];
|
|
2182
|
+
this.selectedComment = null;
|
|
2183
|
+
}
|
|
2184
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TicketFootfallNewComponent, deps: [{ token: i1.NgbModal }, { token: i2.GlobalStateService }, { token: i3.TicketService }, { token: i0.ChangeDetectorRef }, { token: i4.ExcelService }, { token: i5.ToastService }, { token: i6.FormBuilder }, { token: i7.Router }, { token: i8.AuditService }], target: i0.ɵɵFactoryTarget.Component });
|
|
2185
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TicketFootfallNewComponent, selector: "lib-ticket-footfall-new", outputs: { filterChange: "filterChange" }, host: { listeners: { "document:click": "onDocumentClick()" } }, viewQueries: [{ propertyName: "tooltip", first: true, predicate: ["tooltip"], descendants: true }, { propertyName: "internalticket", first: true, predicate: ["internalticket"], descendants: true }, { propertyName: "closePopup", first: true, predicate: ["closePopup"], descendants: true }, { propertyName: "zoomPopup", first: true, predicate: ["zoomPopup"], descendants: true }, { propertyName: "imagePreviewPopup", first: true, predicate: ["imagePreviewPopup"], descendants: true }, { propertyName: "ReassignTicketPopup", first: true, predicate: ["ReassignTicketPopup"], descendants: true }], ngImport: i0, template: "<section *ngIf=\"select ==='ticketList'\">\r\n <div class=\"row ms-3 my-3\">\r\n <ul *ngIf=\"usersDetails?.userType === 'tango'\"\r\n class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item\">\r\n <a [ngClass]=\"tangoType === 'store' ? 'active' : ''\" (click)=\"viewTicket('store')\"\r\n class=\"nav-link cursor-pointer no-border me-3\">\r\n Tickets\r\n </a>\r\n </li>\r\n <li class=\"nav-item\">\r\n <a [ngClass]=\"tangoType === 'internal' ? 'active' : ''\" (click)=\"viewTicket('internal')\"\r\n class=\"nav-link cursor-pointer no-border me-3\"> Internal audit\r\n </a>\r\n </li>\r\n </ul>\r\n <ul *ngIf=\"hasApproverAccess && hasReviewerAccess && usersDetails?.userType !== 'tango'\"\r\n class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <!-- Approver tab -->\r\n <li class=\"nav-item\" *ngIf=\"hasApproverAccess\">\r\n <a [ngClass]=\"selectedRole === 'approver' ? 'active' : ''\"\r\n class=\"nav-link cursor-pointer no-border me-3\" (click)=\"SelectedRole('approver')\">\r\n Approver\r\n </a>\r\n </li>\r\n\r\n <!-- Reviewer tab -->\r\n <li class=\"nav-item\" *ngIf=\"hasReviewerAccess\">\r\n <a [ngClass]=\"selectedRole === 'reviewer' ? 'active' : ''\"\r\n class=\"nav-link cursor-pointer no-border me-3\" (click)=\"SelectedRole('reviewer')\">\r\n Reviewer\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-9 mb-3\">\r\n <div class=\"card\">\r\n <div class=\"card-header ellipse1 px-5\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title my-0\">{{ getFootfallSummaryData?.totalTickets !== null ?\r\n getFootfallSummaryData?.totalTickets : '--' }}</h5>\r\n <span class=\"sub-header\">Total tickets</span>\r\n </div>\r\n <div *ngIf=\"getFootfallSummaryData?.averageAccuracyOverAll !== null &&\r\n getFootfallSummaryData?.averageAccuracyOverAll !== undefined\" class=\"card-toolbar\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title my-0\">{{ getFootfallSummaryData?.averageAccuracyOverAll !== null ?\r\n getFootfallSummaryData?.averageAccuracyOverAll + '%' : '--' }}</h5>\r\n <span class=\"sub-header\">Average accuracy (Overall)</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div *ngIf=\"getFootfallSummaryData?.openTickets !== null &&\r\n getFootfallSummaryData?.openTickets !== undefined\" class=\"col my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.openTickets !== null ?\r\n getFootfallSummaryData?.openTickets : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Open</span>\r\n </div>\r\n <div *ngIf=\"getFootfallSummaryData?.openInfraIssues !== null &&\r\n getFootfallSummaryData?.openInfraIssues !== undefined\" class=\"col my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.openInfraIssues !== null ?\r\n getFootfallSummaryData?.openInfraIssues : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Open-Infra Issue</span>\r\n </div>\r\n <div *ngIf=\"getFootfallSummaryData?.inprogress !== null &&\r\n getFootfallSummaryData?.inprogress !== undefined\" class=\"col my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.inprogress !== null ?\r\n getFootfallSummaryData?.inprogress : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">In-progress</span>\r\n </div>\r\n <div *ngIf=\"getFootfallSummaryData?.closedTickets !== null &&\r\n getFootfallSummaryData?.closedTickets !== undefined\" class=\"col my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.closedTickets !== null ?\r\n getFootfallSummaryData?.closedTickets : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Closed</span>\r\n </div>\r\n\r\n <div *ngIf=\"getFootfallSummaryData?.dueToday !== null &&\r\n getFootfallSummaryData?.dueToday !== undefined\" class=\"col my-3 \">\r\n <h5 style=\"color:#DC6803 !important\" class=\"card-title\">{{ getFootfallSummaryData?.dueToday\r\n !== null ?\r\n getFootfallSummaryData?.dueToday : '--' }}</h5>\r\n <span class=\"card-title-sub-header\" style=\"color:#DC6803 !important\">Due today</span>\r\n </div>\r\n\r\n <div *ngIf=\"getFootfallSummaryData?.Expired !== null &&\r\n getFootfallSummaryData?.Expired !== undefined\" class=\"col my-3 \">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.Expired !== null ?\r\n getFootfallSummaryData?.Expired : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Expired</span>\r\n </div>\r\n\r\n <div *ngIf=\"getFootfallSummaryData?.underTangoReview !== null &&\r\n getFootfallSummaryData?.underTangoReview !== undefined\" class=\"col my-3 \">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.underTangoReview !== null ?\r\n getFootfallSummaryData?.underTangoReview : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Under tango review</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-3 mb-3\">\r\n <div class=\"card\">\r\n <div class=\"card-header ellipse1 py-1 px-5\">\r\n <div *ngIf=\"getFootfallSummaryData?.ticketAccuracyAbove !== null &&\r\n getFootfallSummaryData?.ticketAccuracyAbove !== undefined\" class=\"my-0\">\r\n <h5 class=\"card-title mt-0\">{{ getFootfallSummaryData?.ticketAccuracyAbove !== null ?\r\n getFootfallSummaryData?.ticketAccuracyAbove : '--' }}</h5>\r\n <div class=\"sub-header\">Tickets with Accuracy Above 85%</div>\r\n </div>\r\n <div *ngIf=\"getFootfallSummaryData?.avgTicket !== null &&\r\n getFootfallSummaryData?.avgTicket !== undefined\" class=\"my-0\">\r\n <h5 class=\"card-title mt-0\">{{ getFootfallSummaryData?.avgTicket !== null ?\r\n getFootfallSummaryData?.avgTicket : '--' }}</h5>\r\n <div class=\"sub-header\">Average ticket %</div>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div *ngIf=\"getFootfallSummaryData?.ticketAccuracyBelow !== null &&\r\n getFootfallSummaryData?.ticketAccuracyBelow !== undefined\"\r\n class=\"col-lg-12 col-xl-12 col-md-12 my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.ticketAccuracyBelow !== null ?\r\n getFootfallSummaryData?.ticketAccuracyBelow : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Tickets with Accuracy Below 85%</span>\r\n </div>\r\n <div *ngIf=\"getFootfallSummaryData?.avgAccuracy !== null &&\r\n getFootfallSummaryData?.avgAccuracy !== undefined\" class=\"col-lg-12 col-xl-12 col-md-12 my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.avgAccuracy !== null ?\r\n getFootfallSummaryData?.avgAccuracy : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Average accuracy%</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card\">\r\n <div class=\"card-header border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\" *ngIf=\"tangoType==='store'\"><span *ngIf=\"usersDetails?.userType !== 'tango'\">Ticket Info</span> <span *ngIf=\"usersDetails?.userType === 'tango'\">Showing tickets with Accuracy Below 85% </span><span\r\n class=\"ms-2 px-3 badge badge-light-primary\">{{totalItems}} Total</span></span>\r\n <span class=\"card-label mb-2\" *ngIf=\"tangoType==='internal'\">Internal Tickets <span\r\n class=\"ms-2 px-3 badge badge-light-primary\">{{totalItems}} Total</span></span>\r\n <span class=\"text-sub mb-2\">Based on {{headerFilters?.date?.startDate | date:'dd MMM, yyyy'}} \u2013\r\n {{headerFilters?.date?.endDate | date:'dd MMM, yyyy'}} </span>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input type=\"text\" class=\"form-control ps-14 me-2\" placeholder=\"Search by store\"\r\n autocomplete=\"off\" (change)=\"searchData()\" [(ngModel)]=\"searchValue\" />\r\n\r\n <button type=\"button\" (click)=\"exportXLSX()\"\r\n class=\"btn btn-default mx-2 btn-outline btn-outline-default rounded-3 text-nowrap border-val\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-2\">Export</span>\r\n </button>\r\n <button\r\n class=\"btn btn-default btn-primary btn-outline btn-outline-default rounded-3 text-nowrap border-val\"\r\n *ngIf=\"tangoType==='internal'\" (click)=\"createInternalticket()\">Start Audit</button>\r\n <button *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\" [disabled]=\"closeMultiple\" class=\"btn btn-sm btn-primary mx-2 text-nowrap\"\r\n (click)=\"getMultipleTicketClose()\">\r\n Close Ticket\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"table-responsive\" *ngIf=\"!loading && !noData\">\r\n <table class=\"table custom-table bottom-border text-nowrap\">\r\n <thead>\r\n <tr>\r\n <!-- NEW: checkbox column for approver only -->\r\n <th *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"areAllSelectableRowsSelected()\"\r\n (change)=\"toggleSelectAllRows($event)\"\r\n />\r\n </th>\r\n\r\n <th\r\n *ngFor=\"let col of tableColumns\"\r\n [class.cursor-pointer]=\"col.sortable && col.type !== 'store'\"\r\n (click)=\"col.sortable && col.type !== 'store' && onSort(col.key)\"\r\n >\r\n {{ col.label }}\r\n\r\n <!-- Sorting Icon -->\r\n <svg\r\n *ngIf=\"col.sortable && col.type !== 'store'\"\r\n [ngClass]=\"sortedColumn === col.key && sortDirection === 1 ? 'rotate' : ''\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M8 3.333V12.667L12.667 8 8 12.667 3.333 8\"\r\n [attr.stroke]=\"sortedColumn === col.key ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.333\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <tr *ngFor=\"let row of footfallListData\">\r\n <!-- NEW: per-row checkbox (approver only) -->\r\n <td *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\">\r\n <input \r\n type=\"checkbox\"\r\n [disabled]=\"!isRowSelectable(row)\" \r\n [checked]=\"isRowSelected(row)\"\r\n [style.cursor]=\"isRowSelectable(row) ? 'pointer' : 'not-allowed text-muted'\"\r\n (change)=\"toggleRowSelection(row, $event)\"\r\n />\r\n </td>\r\n\r\n <td *ngFor=\"let col of tableColumns\">\r\n <!-- Store + ticket clickable -->\r\n <ng-container *ngIf=\"col.type === 'store'\">\r\n <div\r\n class=\"text-primary ellipsis-underline\"\r\n (click)=\"ticketView(row)\"\r\n >\r\n {{ row.ticketId }}\r\n </div>\r\n <div class=\"pt-2\">{{ row.storeName }}</div>\r\n </ng-container>\r\n\r\n <!-- Date -->\r\n <ng-container\r\n class=\"pt-5\"\r\n *ngIf=\"col.type === 'date' || col.type === 'ticketRaised'\"\r\n >\r\n {{ row[col.key] | date: 'dd MMM, yyyy' }}\r\n </ng-container>\r\n\r\n <!-- Status -->\r\n <ng-container class=\"pt-5\" *ngIf=\"col.type === 'status'\">\r\n <span\r\n class=\"badge mx-2\"\r\n [ngClass]=\"getStatusBadgeClass(row[col.key])\"\r\n >\r\n {{ row[col.key] | titlecase }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Default Text -->\r\n <ng-container class=\"pt-5\" *ngIf=\"col.type === 'text'\">\r\n {{ row[col.key] ?? '--' }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n\r\n\r\n </div>\r\n <div *ngIf=\"!loading && !noData\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\"\r\n [paginationSizes]=\"paginationSizes\" [pageSize]=\"setpageSize()\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </div>\r\n <div *ngIf=\"loading\" class=\"card mt-5\">\r\n <div class=\"card-body h-500px\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"noData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for this conversion funnel</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</section>\r\n<!-- -->\r\n<section *ngIf=\"select ==='ticketMethod'\">\r\n <div class=\"row my-2\">\r\n <div class=\"position-relative\" [ngClass]=\"isCollapsed ? 'd-none' : 'col-md-3 h-auto'\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-header border-0 pt-3 ps-1 pe-5\">\r\n <span class=\"ms-2\"><span class=\"cursor-pointer\" (click)=\"backToNavigation()\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"44\" viewBox=\"0 0 56 44\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_887_4505)\">\r\n <rect x=\"2\" y=\"1\" width=\"52\" height=\"40\" rx=\"8\" fill=\"white\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"51\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\r\n <path d=\"M30.5 26L25.5 21L30.5 16\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_887_4505\" x=\"0\" y=\"0\" width=\"56\" height=\"44\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_887_4505\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_887_4505\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg></span><span class=\"card-title-foot pt-15 ms-3\">Tickets</span></span>\r\n <span class=\"cursor-pointer\" (click)=\"toggleSidebar()\"\r\n style=\"position: absolute; top: 15px; right: -25px;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"68\" height=\"68\" viewBox=\"0 0 68 68\" fill=\"none\">\r\n <g filter=\"url(#filter0_dd_778_34282)\">\r\n <rect x=\"12\" width=\"44\" height=\"44\" rx=\"22\" fill=\"white\" />\r\n <path d=\"M33 27L28 22L33 17M40 27L35 22L40 17\" stroke=\"#101828\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_dd_778_34282\" x=\"0\" y=\"0\" width=\"68\" height=\"68\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feMorphology radius=\"2\" operator=\"erode\" in=\"SourceAlpha\"\r\n result=\"effect1_dropShadow_778_34282\" />\r\n <feOffset dy=\"4\" />\r\n <feGaussianBlur stdDeviation=\"3\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.03 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_778_34282\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feMorphology radius=\"4\" operator=\"erode\" in=\"SourceAlpha\"\r\n result=\"effect2_dropShadow_778_34282\" />\r\n <feOffset dy=\"12\" />\r\n <feGaussianBlur stdDeviation=\"8\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.08 0\" />\r\n <feBlend mode=\"normal\" in2=\"effect1_dropShadow_778_34282\"\r\n result=\"effect2_dropShadow_778_34282\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_778_34282\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"p-4 w-100 overflow-auto\">\r\n <div class=\"row my-1\">\r\n <div class=\"col-8\">\r\n\r\n <span class=\"svg-icon svg-icon-1 position-absolute py-2 ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input class=\"form-control form-control-sm mb-2 ps-14 pe-2 w-100\" type=\"text\"\r\n placeholder=\"Search\" [(ngModel)]=\"StoresSearchValue\" (change)=\"searchStoresData()\" />\r\n </div>\r\n <div class=\"col-4 p-0 btn\">\r\n <button class=\"btn-filter btn btn-sm btn-outline\" (click)=\"toggleFilter()\">\r\n <span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n Filter\r\n </button>\r\n\r\n <!-- Overlay (click outside to close) -->\r\n <div class=\"overlay\" *ngIf=\"isFilterOpen\" (click)=\"close()\"></div>\r\n\r\n <form [formGroup]=\"filterForm\">\r\n <!-- Filter card -->\r\n <div class=\"filter-card text-start\" *ngIf=\"isFilterOpen\"\r\n (click)=\"$event.stopPropagation()\">\r\n <h3 class=\"mb-3\">Filter Options</h3>\r\n\r\n <!-- Status -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label mb-1\">Status</label>\r\n <select class=\"form-select form-select-sm\" formControlName=\"status\">\r\n <option value=\"\">Select</option>\r\n <option>Open</option>\r\n <option>In-Progress</option>\r\n <option>Close</option>\r\n <option>Under tango review</option>\r\n <option>Tango review done</option>\r\n <option>Expired</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Reviewer accuracy -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-9\">\r\n <!-- label in same row -->\r\n <label class=\"form-label mb-0 fs-8 reviewer-label\">\r\n Reviewer accuracy (%) by condition\r\n </label>\r\n\r\n <!-- condition dropdown -->\r\n <select class=\"form-select form-select-sm reviewer-select\"\r\n formControlName=\"reviewerCondition\">\r\n <option value=\"\">Select</option>\r\n <option>>= Greater than or equal to</option>\r\n <option>\r\n < Less than</option>\r\n <option>> Greater than</option>\r\n <option>\r\n <= Lesser than or equal to</option>\r\n <option>Between</option>\r\n </select>\r\n </div>\r\n <!-- single value -->\r\n <div class=\"col-3\">\r\n <!-- <ng-container *ngIf=\"filterForm.value.reviewerCondition !== 'Between'; else betweenTpl\"> -->\r\n <label class=\"small ms-1\">% </label>\r\n <input type=\"number\"\r\n class=\"form-control form-control-sm reviewer-input text-end\"\r\n formControlName=\"reviewerValue\" min=\"1\" max=\"100\">\r\n <!-- </ng-container> -->\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n <!-- TODO: same block for Approver & Tango -->\r\n <!-- Reviewer accuracy -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-9\">\r\n <!-- label in same row -->\r\n <label class=\"form-label mb-0 fs-8 reviewer-label\">\r\n Approver accuracy (%) by condition\r\n </label>\r\n\r\n <!-- condition dropdown -->\r\n <select class=\"form-select form-select-sm reviewer-select\"\r\n formControlName=\"reviewerCondition\">\r\n <option value=\"\">Select</option>\r\n <option>>= Greater than or equal to</option>\r\n <option>\r\n < Less than</option>\r\n <option>> Greater than</option>\r\n <option>\r\n <= Lesser than or equal to</option>\r\n <option>Between</option>\r\n </select>\r\n </div>\r\n <!-- single value -->\r\n <div class=\"col-3\">\r\n <!-- <ng-container *ngIf=\"filterForm.value.reviewerCondition !== 'Between'; else betweenTpl\"> -->\r\n <label class=\"small ms-1\">% </label>\r\n <input type=\"number\"\r\n class=\"form-control form-control-sm reviewer-input text-end\"\r\n formControlName=\"reviewerValue\" min=\"1\" max=\"100\">\r\n <!-- </ng-container> -->\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n <!-- Reviewer accuracy -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-9\">\r\n <!-- label in same row -->\r\n <label class=\"form-label mb-0 fs-8 reviewer-label\">\r\n Tango accuracy (%) by condition\r\n </label>\r\n\r\n <!-- condition dropdown -->\r\n <select class=\"form-select form-select-sm reviewer-select\"\r\n formControlName=\"reviewerCondition\">\r\n <option value=\"\">Select</option>\r\n <option>>= Greater than or equal to</option>\r\n <option>\r\n < Less than</option>\r\n <option>> Greater than</option>\r\n <option>\r\n <= Lesser than or equal to</option>\r\n <option>Between</option>\r\n </select>\r\n </div>\r\n <!-- single value -->\r\n <div class=\"col-3\">\r\n <!-- <ng-container *ngIf=\"filterForm.value.reviewerCondition !== 'Between'; else betweenTpl\"> -->\r\n <label class=\"small ms-1\">% </label>\r\n <input type=\"number\"\r\n class=\"form-control form-control-sm reviewer-input text-end\"\r\n formControlName=\"reviewerValue\" min=\"1\" max=\"100\">\r\n <!-- </ng-container> -->\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\"\r\n (click)=\"resetFilter()\">Reset</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\"\r\n (click)=\"applyFilter()\">Apply</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"text-end text-nowrp ms-3 mt-2\">\r\n <button *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\" [disabled]=\"closeMultiple\" class=\"btn btn-sm btn-primary mx-2\"\r\n (click)=\"getMultipleTicketClose()\">\r\n Close Ticket\r\n </button>\r\n </div>\r\n \r\n </div>\r\n\r\n <div *ngIf=\"openTicketsList.length\" class=\"mb-2 border-selectall\">\r\n <div class=\"d-flex justify-content-between align-items-center w-100\">\r\n\r\n <!-- LEFT: checkbox + text -->\r\n <div class=\"d-flex align-items-center\">\r\n <input *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\" type=\"checkbox\" class=\"me-2\" [checked]=\"allSelected\"\r\n (change)=\"toggleSelectAll()\" />\r\n <label class=\"m-0 font-semibold\">\r\n Select <span *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\">all {{ storeCount }}</span> stores\r\n </label>\r\n </div>\r\n\r\n <!-- RIGHT: Reviewer(%) + optional sort icon -->\r\n <div class=\"d-flex align-items-center reviewer-label\">\r\n <span class=\"me-1\">Reviewer(%)</span>\r\n <!-- if you want arrow icon -->\r\n <span class=\"sort-arrow cursor-pointer\"><svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path\r\n d=\"M6.83464 1L6.83463 12.6667M6.83463 12.6667L12.668 6.83333M6.83463 12.6667L1.0013 6.83333\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <!-- or use an <i> from font-awesome/bootstrap icon instead -->\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <ul class=\"list-unstyled ps-0\">\r\n <li *ngFor=\"let store of openTicketsList\" class=\"mb-2\"\r\n [ngClass]=\"{ 'store-item-active': isSelected(store), 'store-item': true }\">\r\n\r\n <div class=\"d-flex justify-content-between align-items-center w-100\">\r\n <!-- LEFT: checkbox + text -->\r\n <div class=\"d-flex align-items-start\">\r\n <input *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\" type=\"checkbox\" class=\"me-2 my-3\" [checked]=\"isSelected(store)\"\r\n (change)=\"toggleStoreSelection(store)\" />\r\n\r\n <div class=\"store-text ms-1 cursor-pointer\" (click)=\"ticketViewChanges(store)\">\r\n <div class=\"ticket-id\" [ngClass]=\"{ 'active-text': isSelected(store) }\">\r\n {{ store?.ticketId }}\r\n </div>\r\n <div class=\"store-name mt-1\">\r\n {{ store?.storeName }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT: pill badge -->\r\n <span\r\n class=\"ms-2 px-3 py-1 rounded-pill d-inline-flex align-items-center justify-content-center perc-badge\"\r\n [ngClass]=\"{\r\n 'perc-badge-active': isSelected(store),\r\n 'perc-badge-normal': !isSelected(store)\r\n }\">\r\n {{ store?.revicedPerc }}\r\n </span>\r\n </div>\r\n </li>\r\n\r\n </ul>\r\n\r\n\r\n\r\n <div *ngIf=\"!openTicketsList.length\" class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n\r\n <div class=\"card-body mx-0 d-flex justify-content-center align-items-center flex-column \"\r\n style=\"margin: 64px;border-radius: 8px;\r\n background: var(--Gray-50, #F9FAFB);\">\r\n <svg class=\"my-5\" xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\"\r\n viewBox=\"0 0 94 94\" fill=\"none\">\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\"\r\n stroke-width=\"13.3333\" />\r\n <g clip-path=\"url(#clip0_730_75095)\">\r\n <path\r\n d=\"M55.3327 62V58.6667C55.3327 56.8986 54.6303 55.2029 53.3801 53.9526C52.1298 52.7024 50.4341 52 48.666 52H35.3327C33.5646 52 31.8689 52.7024 30.6186 53.9526C29.3684 55.2029 28.666 56.8986 28.666 58.6667V62M65.3327 62V58.6667C65.3316 57.1895 64.8399 55.7546 63.935 54.5872C63.03 53.4198 61.7629 52.5859 60.3327 52.2167M53.666 32.2167C55.1 32.5838 56.3711 33.4178 57.2787 34.5872C58.1864 35.7565 58.6791 37.1947 58.6791 38.675C58.6791 40.1553 58.1864 41.5935 57.2787 42.7628C56.3711 43.9322 55.1 44.7662 53.666 45.1333M48.666 38.6667C48.666 42.3486 45.6812 45.3333 41.9993 45.3333C38.3174 45.3333 35.3327 42.3486 35.3327 38.6667C35.3327 34.9848 38.3174 32 41.9993 32C45.6812 32 48.666 34.9848 48.666 38.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"4\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_75095\">\r\n <rect width=\"40\" height=\"40\" fill=\"white\" transform=\"translate(27 27)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <div class=\"nodata-title my-3\">No Stores Found</div>\r\n <div class=\"nodata-sub mb-3\">Looks like there is no stores </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div [ngClass]=\"isCollapsed ? 'col-12' : 'col-md-9'\">\r\n <div class=\"card bg-light-primary p-1 h-100\">\r\n <div class=\"card-header border-0 pt-3 px-5\">\r\n <div class=\"d-flex justify-content-start\">\r\n <div *ngIf=\"isCollapsed\" class=\"cursor-pointer\"><span (click)=\"toggleSidebar()\"\r\n style=\"position: absolute; top: 10px; left: 10px;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\"\r\n fill=\"none\">\r\n <path d=\"M22.5 25L17.5 20L22.5 15\" stroke=\"#667085\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> </span>\r\n <span class=\"card-title-foot ms-15\">Footfall Directory</span>\r\n </div>\r\n </div>\r\n <div class=\"card-toolbar\">\r\n <!-- Start Review -->\r\n \r\n <span *ngIf=\"statusVal?.type !== 'tangoreview' && (ticketData?.status === 'Raised' || getHeaderStatus() === 'Open')\">\r\n \r\n <button *ngIf=\"!closeBtn\" class=\"btn btn-sm btn-primary mx-2\" (click)=\"startReview()\">\r\n Start Review\r\n </button>\r\n </span>\r\n <section *ngIf=\"ticketData?.ReviewedBy === usersDetails?.email \r\n || ticketData?.approvedBy === usersDetails?.email\">\r\n \r\n <!-- Close Ticket -->\r\n <span *ngIf=\"ticketData?.status === 'In-Progress'\">\r\n \r\n <button *ngIf=\"closeBtn\" [disabled]=\"closeDisabled\" class=\"btn btn-sm btn-primary mx-2\"\r\n (click)=\"stopReview()\">\r\n Close Ticket\r\n </button>\r\n </span>\r\n </section>\r\n\r\n\r\n <span\r\n *ngIf=\"usersDetails?.userType ==='tango' && statusVal?.type === 'tangoreview' && statusVal?.status ==='Open'||usersDetails?.userType ==='tango'&&ticketData?.type === 'internal'\"><button\r\n class=\"btn btn-sm btn-primary mx-2\" (click)=\"startAudit()\">Start\r\n Audit</button></span>\r\n <span>\r\n <span class=\"ticket-actions-wrapper\" (click)=\"$event.stopPropagation()\">\r\n\r\n <span class=\"icon-btn\" (click)=\"toggleTicketMenu($event)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5C11 5.55228 11.4477 6 12 6Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19C11 19.5523 11.4477 20 12 20Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"ticket-menu\" *ngIf=\"isTicketMenuOpen\">\r\n <div class=\"ticket-menu-item\" (click)=\"onReassignClick()\">\r\n Re-Assign Ticket\r\n </div>\r\n <!-- <div class=\"ticket-menu-item\" (click)=\"onExportClick()\">\r\n Export\r\n </div> -->\r\n </div>\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-4 \">\r\n <div class=\"row mb-6\">\r\n\r\n <div class=\"col-2 card-title-label my-2\">Store Name</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">{{footfallTicketsData[0]?._source?.storeName}}</div>\r\n <div class=\"col-2 card-title-label my-2\">Ticket ID</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">{{footfallTicketsData[0]?._source?.ticketId}}</div>\r\n <div class=\"col-2 card-title-label my-2\">Status</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n\r\n <div class=\"col-3 my-2\"> <span class=\"badge mx-2\"\r\n [ngClass]=\"getStatusBadgeClass(getHeaderStatus())\">\r\n {{ getHeaderStatus() | titlecase }}\r\n </span></div>\r\n\r\n <div class=\"col-2 card-title-label my-2\">Due Date</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">06 Dec 2025</div>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"card-layer\">\r\n <div class=\"d-flex justify-content-between align-items-start w-100\">\r\n\r\n <!-- LEFT SIDE -->\r\n <h3 class=\"card-title align-items-start flex-column mb-0\">\r\n <div class=\"card-label\">Ticket Status</div>\r\n <div class=\"text-sub mb-2\">Logs for each revision of the ticket.</div>\r\n </h3>\r\n\r\n <!-- RIGHT SIDE -->\r\n <div class=\"cursor-pointer\">\r\n <span (click)=\"openArrow()\"> <svg *ngIf=\"arrowshow\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_486_91902)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\" />\r\n <path d=\"M15 16.5L20 21.5L25 16.5\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_486_91902\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_486_91902\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_486_91902\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg></span>\r\n <span (click)=\"openArrow()\">\r\n <svg *ngIf=\"!arrowshow\" xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\"\r\n fill=\"none\">\r\n <g filter=\"url(#filter0_d_486_91893)\">\r\n <rect x=\"38\" y=\"37\" width=\"36\" height=\"36\" rx=\"8\"\r\n transform=\"rotate(180 38 37)\" fill=\"white\" />\r\n <rect x=\"37.5\" y=\"36.5\" width=\"35\" height=\"35\" rx=\"7.5\"\r\n transform=\"rotate(180 37.5 36.5)\" stroke=\"#D0D5DD\" />\r\n <path d=\"M25 21.5L20 16.5L15 21.5\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_486_91893\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_486_91893\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_486_91893\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n <section *ngIf=\"!arrowshow\">\r\n \r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n \r\n <div *ngIf=\"ticket?._source as source\" class=\"ticket-container\">\r\n \r\n <!-- Actual Footfall Header -->\r\n <div class=\"ticket-header\">\r\n <div class=\"footfall-value\">{{source?.footfallCount}} <span class=\"footfall-label ms-3\">Actual\r\n Footfall</span>\r\n </div>\r\n <div class=\"issue-date\">Issue date : {{source?.createdAt | date:'dd MMM yyyy'}}\r\n </div>\r\n </div>\r\n \r\n <!-- Timeline Line -->\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n \r\n <!-- When ticket is CLOSED, skip the tagging row -->\r\n <ng-container *ngIf=\"mapping?.status === 'Closed' \r\n && ['tagging','review','approve','tangoreview'].includes(mapping?.type)\">\r\n \r\n <div class=\"timeline\"></div>\r\n <div class=\"user-info ms-4\">\r\n \r\n <div class=\"avatar avatar-text light-primary p-3\">\r\n {{ getInitialsFromEmail(mapping?.createdByEmail ||\r\n source?.createdByEmail) }}\r\n </div>\r\n \r\n <div>\r\n <div class=\"user-name\">\r\n <span *ngIf=\"mapping?.type === 'tagging'\">\r\n Ticket created by\r\n </span>\r\n <span *ngIf=\"mapping?.type === 'review'\">\r\n Reviewed by\r\n </span>\r\n <span *ngIf=\"mapping?.type === 'approve'\">\r\n Approved by\r\n </span>\r\n \r\n <span *ngIf=\"mapping?.type === 'tangoreview'\">\r\n Tango\r\n </span>\r\n </div>\r\n \r\n <div class=\"user-email\">\r\n {{ mapping?.createdByEmail || source?.createdByEmail }} {{(mapping?.createdAt ||\r\n source?.createdAt)\r\n | date:'HH:mm:ss \u2013dd MMM yyyy' }}\r\n </div>\r\n </div>\r\n \r\n </div>\r\n \r\n \r\n <div class=\"timeline\"></div>\r\n \r\n <!-- Show revision card only when NOT closed & type is tagging -->\r\n <div class=\"revision-card\"\r\n [ngClass]=\"{'revision-card-approve-closed':mapping?.status === 'Closed' && (mapping?.type === 'approve' || mapping?.type === 'tangoreview'),}\">\r\n <div class=\"values-row\">\r\n <div class=\"value-block\">\r\n <div class=\"value\">\r\n {{ mapping?.revicedFootfall === null ? '--' :\r\n mapping?.revicedFootfall }}\r\n </div>\r\n <div class=\"label fw-bold\">Revised Footfall</div>\r\n </div>\r\n \r\n <div class=\"value-block\">\r\n <div class=\"value accuracy down\">\r\n {{ mapping?.revicedPerc || source?.revicedPerc || '--' }}\r\n <span class=\"ms-1\">\r\n <!-- arrow svg -->\r\n </span>\r\n </div>\r\n <div class=\"label fw-bold pt-1\">Accuracy</div>\r\n </div>\r\n \r\n <div class=\"timeline-new my-2\"></div>\r\n \r\n <div class=\"value-block\" *ngFor=\"let item of mapping?.count\">\r\n <div class=\"value\">\r\n {{ item?.value ?? '--' }}\r\n </div>\r\n <div class=\"label\">\r\n {{ item?.name }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n </ng-container>\r\n \r\n <div *ngIf=\"mapping?.status === 'Closed' && ['approve'].includes(mapping?.type)\"\r\n class=\"card-footer revision-card-approve py-1 bg-light-primary\">\r\n <div *ngIf=\"!showApproveDetails\"\r\n class=\"details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2\"\r\n (click)=\"toggleRevisedDetails(mapping)\">\r\n <span class=\"text-primary \">\r\n Show in details\r\n </span>\r\n <span class=\"chevron ms-3 cursor-pointer\" [class.rotate-180]=\"showRevisedDetails\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M18 9L12 15L6 9\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span *ngIf=\"showApproveDetails\" class=\"chevron ms-3 cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M6 15L12 9L18 15\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n \r\n <div class=\"details-body mt-2\" *ngIf=\"showApproveDetails\">\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n <div *ngIf=\"ticket?._source as source\" class=\"my-5\">\r\n<ng-container *ngFor=\"let type of revopsTypes\">\r\n<section *ngIf=\"type ==='duplicate'\">\r\n\r\n <div *ngIf=\"hasRevopsType(type)\" class=\"layers\">\r\n <!-- Header Section -->\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <h3 class=\"text-lg font-semibold mb-4\">\r\n <span class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_730_76157)\">\r\n <path\r\n d=\"M3.75 11.25H3C2.60218 11.25 2.22064 11.092 1.93934 10.8107C1.65804 10.5294 1.5 10.1478 1.5 9.75V3C1.5 2.60218 1.65804 2.22064 1.93934 1.93934C2.22064 1.65804 2.60218 1.5 3 1.5H9.75C10.1478 1.5 10.5294 1.65804 10.8107 1.93934C11.092 2.22064 11.25 2.60218 11.25 3V3.75M8.25 6.75H15C15.8284 6.75 16.5 7.42157 16.5 8.25V15C16.5 15.8284 15.8284 16.5 15 16.5H8.25C7.42157 16.5 6.75 15.8284 6.75 15V8.25C6.75 7.42157 7.42157 6.75 8.25 6.75Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_76157\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n Duplicates\r\n </h3>\r\n </div>\r\n\r\n\r\n <!-- Body Section -->\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <ng-container *ngIf=\"mapping?.type ===viewMode\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n <div *ngIf=\"original?.isParent && original?.revopsType ==='duplicate'\"\r\n class=\"card-body bg-white layers py-5 px-0 m-3\">\r\n <div class=\"my-4\">\r\n <!-- Original Image -->\r\n <div class=\"duplicate-head px-5 my-3\">Original image\r\n </div>\r\n <div class=\"row px-5\">\r\n <div class=\"col-md-4 relative\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3\">\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"separator separator-dashed mt-3 mb-5\"></div>\r\n <div class=\"row px-5\">\r\n <h5 class=\"duplicate-head my-3 fs-6\">Tagged Duplicates</h5>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"my-3\">\r\n <input type=\"checkbox\" [checked]=\"areAllDuplicatesSelected(original)\"\r\n (change)=\"onToggleSelectAllDuplicates(original, $event)\" />\r\n <label class=\"ms-2\">Select All</label>\r\n </div>\r\n <div *ngFor=\"let duplicate of original?.duplicateImage; let i = index\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n 'layer-approved': isApproved(duplicate),\r\n 'layer-rejected': isRejected(duplicate),\r\n 'img-border border border-1': !isApproved(duplicate) && !isRejected(duplicate)}\">\r\n <!-- Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n <input type=\"checkbox\" *ngIf=\"!isLockedByReviewer(duplicate)\"\r\n style=\"right: 5px ; margin: 10px 5px 4px !important;\"\r\n [checked]=\"isDuplicateSelected(original.tempId, duplicate.tempId)\"\r\n (change)=\"onDuplicateCheckboxChange(original.tempId, duplicate.tempId, $event)\"\r\n class=\"position-absolute form-check-input duplicate-checkbox\" />\r\n <span class=\"position-absolute absolute\" \r\n *ngIf=\"isLockedByReviewer(duplicate)\"\r\n (click)=\"resetCheckbox('duplicate', duplicate)\">\r\n\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\"\r\n viewBox=\"0 0 19 19\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_2023_13718)\">\r\n <rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\"\r\n rx=\"2\" fill=\"white\" />\r\n <rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\"\r\n height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\"\r\n stroke-width=\"0.555556\" />\r\n <path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\"\r\n stroke-width=\"0.927778\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_2023_13718\" x=\"0.00021708\"\r\n y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\"\r\n filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\"\r\n result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"0.555556\" />\r\n <feGaussianBlur stdDeviation=\"0.555556\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_2023_13718\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_2023_13718\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n\r\n </span>\r\n </div>\r\n <!-- (change)=\"onImageCheckboxChange(duplicate.tempId, 'duplicate', 'original')\" -->\r\n <!-- Duplicate Image -->\r\n <img [src]=\"imageUrl + duplicate.filePath\" alt=\"\"\r\n (click)=\"openImagePreview(mapping,original.duplicateImage, i, 'Tagged Duplicates')\"\r\n class=\"w-100 rounded border duplicate-image cursor-pointer\" />\r\n\r\n <!-- Duplicate Info -->\r\n <div class=\"row my-2\">\r\n <div class=\"col-9\">\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ duplicate.tempId }}\r\n\r\n <span\r\n *ngIf=\"getAction(duplicate, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(duplicate, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n\r\n </div>\r\n\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(duplicate.entryTime)\r\n }}\r\n </div>\r\n </div>\r\n <div class=\"col-3\">\r\n <span\r\n *ngIf=\"getAction(duplicate, 'approve')?.action === 'approved'\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"37\"\r\n height=\"37\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n </span>\r\n <span\r\n *ngIf=\"getAction(duplicate, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"37\"\r\n height=\"37\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg> </span>\r\n </div>\r\n </div>\r\n <!-- Duplicate Reason -->\r\n <!-- <div class=\"duplicate-reason ms-2 mt-2\">\r\n <small class=\"text-muted\">{{ duplicate.reason }}</small>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n \r\n <!-- Accordion Body -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n \r\n <!-- Loop each block: tagging / review / approve -->\r\n <ng-container *ngFor=\"let block of activityData\">\r\n \r\n <!-- Loop inside comments -->\r\n <div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n \r\n <!-- avatar -->\r\n <div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n <div class=\"w-100\">\r\n \r\n <!-- email -->\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n \r\n <!-- message text -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n \r\n <!-- Review / Approve only -->\r\n <ng-container *ngIf=\"block.type === 'review' || block.type === 'approve'\">\r\n <!-- Tagged images -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n \r\n <div *ngFor=\"let img of c.taggedImages; let i = index\">\r\n \r\n <!-- Show only first 4 -->\r\n <ng-container *ngIf=\"i < 3\">\r\n <div class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url('+ imageUrl + img.filePath + ')'\"></div>\r\n \r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n \r\n <!-- status dots -->\r\n <span *ngIf=\"c.status === 'approved'\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg></span>\r\n \r\n <span *ngIf=\"c.status === 'rejected'\"\r\n ><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n \r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n \r\n <!-- +N more -->\r\n <div\r\n class=\"tango-card more-card text-center\"\r\n *ngIf=\"c.taggedImages.length > 3\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.taggedImages[3].filePath + ')'\"\r\n (click)=\"openImagesPopup(c)\"\r\n >\r\n <div class=\"more-overlay\"></div>\r\n \r\n <!-- vertical container -->\r\n <div class=\"more-wrapper my-10 d-flex flex-column align-items-center justify-content-center\">\r\n <div class=\"more-text fw-semibold\">+{{ c.taggedImages.length - 3 }}</div>\r\n <div class=\"text-primary text-dark text-decoration-underline small\">\r\n View all\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n \r\n </div>\r\n \r\n </ng-container>\r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n \r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n <!-- Status Icons -->\r\n\r\n\r\n </div>\r\n</section>\r\n<section *ngIf=\"type !=='duplicate'\">\r\n <div class=\"layers my-2\" *ngIf=\"hasRevopsType(type)\">\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <div class=\"duplicate-head text-lg my-3\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.51995 0.613065C8.33739 -0.204355 9.66267 -0.204355 10.4801 0.613065L17.387 7.51995C18.2043 8.33739 18.2043 9.66267 17.387 10.4801L10.4801 17.387C9.66267 18.2043 8.33739 18.2043 7.51995 17.387L5.54626 15.4133L3.73708 17.2224C2.91966 18.0399 1.59436 18.0399 0.776944 17.2224C-0.0404767 16.4051 -0.0404767 15.0797 0.776944 14.2624L2.58612 12.4531L0.613065 10.4801C-0.204355 9.66267 -0.204355 8.33739 0.613065 7.51995L7.51995 0.613065ZM9.49336 1.59978C9.22088 1.32731 8.77909 1.32731 8.50661 1.59978L3.57286 6.53357L11.4665 14.4272L16.4002 9.49336C16.6727 9.22088 16.6727 8.77909 16.4002 8.5067L12.9465 5.05286L11.7952 6.20403C11.5228 6.4765 11.0811 6.4765 10.8086 6.20403C10.5361 5.93155 10.5361 5.48978 10.8086 5.21731L11.9597 4.06614L10.9732 3.07964L8.17757 5.87533C7.90509 6.1478 7.46329 6.1478 7.19081 5.87533C6.91833 5.60286 6.91833 5.16109 7.19081 4.88862L9.9865 2.09293L9.49336 1.59978ZM10.4797 15.4139L2.58615 7.52028L1.59978 8.5067C1.3273 8.77909 1.3273 9.22088 1.59978 9.49336L8.50661 16.4002C8.77909 16.6727 9.22088 16.6727 9.49336 16.4002L10.4797 15.4139ZM3.57275 13.4399L1.76366 15.249C1.49119 15.5215 1.49119 15.9633 1.76366 16.2358C2.03613 16.5082 2.4779 16.5082 2.75037 16.2358L4.55946 14.4266L3.57275 13.4399Z\"\r\n fill=\"#475467\" />\r\n </svg></span> {{type}}\r\n\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"ms-3 my-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"selectAllByType[type]\"\r\n (change)=\"onSelectAll(type, $event)\">\r\n <label>Select All</label>\r\n </div>\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <div *ngIf=\"mapping?.type ===viewMode\" class=\"card-body bg-white layers p-5 m-3\">\r\n\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail;let i=index\">\r\n <div *ngIf=\"original?.revopsType ===type\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n'layer-approved': isApproved(original),\r\n'layer-rejected': isRejected(original),\r\n'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n\r\n\r\n <!-- Top-right Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n\r\n <input *ngIf=\"!isLockedByReviewer(original)\" type=\"checkbox\"\r\n class=\"position-absolute absolute form-check-input\"\r\n [checked]=\"(selectedByType[type] || []).includes(original?.tempId)\"\r\n (change)=\"onImageCheckboxChange(type, original.tempId)\" />\r\n <span class=\"position-absolute absolute\" \r\n *ngIf=\"isLockedByReviewer(original)\"\r\n (click)=\"resetCheckbox(type, original)\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\"\r\n viewBox=\"0 0 19 19\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_2023_13718)\">\r\n <rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\"\r\n fill=\"white\" />\r\n <rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\"\r\n rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\" />\r\n <path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\"\r\n stroke-width=\"0.927778\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\"\r\n width=\"18.2222\" height=\"18.2222\"\r\n filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"0.555556\" />\r\n <feGaussianBlur stdDeviation=\"0.555556\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_2023_13718\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_2023_13718\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\" (click)=\"openImagePreview(mapping,original, i, selectedByType[type])\"\r\n class=\"w-100 rounded border cursor-pointer\" />\r\n <div class=\"row my-2\">\r\n <div class=\"col-9\">\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}\r\n <span *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\nheight: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(original, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\nheight: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n <div class=\"col-3 ms-3\">\r\n <span *ngIf=\"getAction(original, 'approve')?.action === 'approved'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"37\" height=\"37\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(original, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"37\" height=\"37\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <div class=\"comments-title\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n\r\n </div>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Content -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n\r\n<!-- loop each block: tagging / review / approve -->\r\n<ng-container *ngFor=\"let block of activityData1\">\r\n\r\n<!-- TAGGING COMMENTS (each comment = one image + message) -->\r\n<ng-container *ngIf=\"block.type === 'tagging'\">\r\n<div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n\r\n<!-- avatar -->\r\n<div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n\r\n<!-- content -->\r\n<div>\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n\r\n <!-- single image card -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div class=\"tango-card\" *ngIf=\"c.filePath\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.filePath + ')'\">\r\n </div>\r\n\r\n <div class=\"tango-meta small\">\r\n <div>Tango ID: {{ c.tempId }}</div>\r\n <div class=\"text-muted\">Entry time: {{ c.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n</ng-container>\r\n\r\n<!-- REVIEW / APPROVE COMMENTS (with taggedImages + +N View all) -->\r\n<ng-container *ngIf=\"block.type === 'review' || block.type === 'approve'\">\r\n<div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n\r\n<!-- avatar -->\r\n<div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n\r\n<!-- content -->\r\n<div class=\"w-100\">\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- main review/approve message -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n\r\n \r\n\r\n <!-- image list + +N View all -->\r\n <div class=\"d-flex gap-2 flex-wrap\" *ngIf=\"c.taggedImages?.length\">\r\n\r\n <!-- first 3 images -->\r\n <div *ngFor=\"let img of c.taggedImages; let i = index\">\r\n <ng-container *ngIf=\"i < 3\">\r\n <div class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + img.filePath + ')'\">\r\n </div>\r\n\r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n <span *ngIf=\"c.status === 'approved'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"c.status === 'rejected'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- +N View all card -->\r\n <div\r\n class=\"tango-card more-card text-center\"\r\n *ngIf=\"c.taggedImages.length > 3\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.taggedImages[3].filePath + ')'\"\r\n (click)=\"openImagesPopup(c)\"\r\n >\r\n <div class=\"more-overlay\"></div>\r\n\r\n <div class=\"more-wrapper d-flex flex-column align-items-center justify-content-center\">\r\n <div class=\"more-text fw-semibold\">\r\n +{{ c.taggedImages.length - 3 }}\r\n </div>\r\n <div class=\"text-primary text-decoration-underline small\">\r\n View all\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n</div>\r\n</ng-container>\r\n\r\n</ng-container>\r\n</div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n</ng-container>\r\n \r\n\r\n\r\n </div>\r\n </ng-container>\r\n </div>\r\n \r\n \r\n <div *ngIf=\"showApproveDetails\"\r\n class=\"details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2\"\r\n (click)=\"toggleRevisedDetails(mapping)\">\r\n <span class=\"text-primary \">\r\n Show in details\r\n </span>\r\n \r\n <span *ngIf=\"showApproveDetails\" class=\"chevron ms-3 cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M6 15L12 9L18 15\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n \r\n \r\n <div *ngIf=\"mapping?.status === 'Closed' && ['tangoreview'].includes(mapping?.type)\"\r\n class=\"card-footer revision-card-approve py-1 bg-light-primary\">\r\n <div *ngIf=\"!showTangoDetails\"\r\n class=\"details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2\"\r\n (click)=\"toggleRevisedDetails(mapping)\">\r\n <span class=\"text-primary \">\r\n Show in details\r\n </span>\r\n <span class=\"chevron ms-3 cursor-pointer\" [class.rotate-180]=\"showRevisedDetails\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M18 9L12 15L6 9\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n \r\n </div>\r\n \r\n <div class=\"details-body mt-2\" *ngIf=\"showTangoDetails\">\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n <div *ngIf=\"ticket?._source as source\" class=\"my-5\">\r\n<ng-container *ngFor=\"let type of revopsTypes\">\r\n<section *ngIf=\"type ==='duplicate'\">\r\n\r\n <div *ngIf=\"hasRevopsType(type)\" class=\"layers\">\r\n <!-- Header Section -->\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <h3 class=\"text-lg font-semibold mb-4\">\r\n <span class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_730_76157)\">\r\n <path\r\n d=\"M3.75 11.25H3C2.60218 11.25 2.22064 11.092 1.93934 10.8107C1.65804 10.5294 1.5 10.1478 1.5 9.75V3C1.5 2.60218 1.65804 2.22064 1.93934 1.93934C2.22064 1.65804 2.60218 1.5 3 1.5H9.75C10.1478 1.5 10.5294 1.65804 10.8107 1.93934C11.092 2.22064 11.25 2.60218 11.25 3V3.75M8.25 6.75H15C15.8284 6.75 16.5 7.42157 16.5 8.25V15C16.5 15.8284 15.8284 16.5 15 16.5H8.25C7.42157 16.5 6.75 15.8284 6.75 15V8.25C6.75 7.42157 7.42157 6.75 8.25 6.75Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_76157\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n Duplicates\r\n </h3>\r\n </div>\r\n\r\n\r\n <!-- Body Section -->\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <ng-container *ngIf=\"mapping?.type ===viewMode\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n <div *ngIf=\"original?.isParent && original?.revopsType ==='duplicate'\"\r\n class=\"card-body bg-white layers py-5 px-0 m-3\">\r\n <div class=\"my-4\">\r\n <!-- Original Image -->\r\n <div class=\"duplicate-head px-5 my-3\">Original image\r\n </div>\r\n <div class=\"row px-5\">\r\n <div class=\"col-md-4 relative\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3\">\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"separator separator-dashed mt-3 mb-5\"></div>\r\n <div class=\"row px-5\">\r\n <h5 class=\"duplicate-head my-3 fs-6\">Tagged Duplicates</h5>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"my-3\">\r\n <input type=\"checkbox\" [checked]=\"areAllDuplicatesSelected(original)\"\r\n (change)=\"onToggleSelectAllDuplicates(original, $event)\" />\r\n <label class=\"ms-2\">Select All</label>\r\n </div>\r\n <div *ngFor=\"let duplicate of original?.duplicateImage; let i = index\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n 'layer-approved': isApproved(duplicate),\r\n 'layer-rejected': isRejected(duplicate),\r\n 'img-border border border-1': !isApproved(duplicate) && !isRejected(duplicate)}\">\r\n <!-- Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n <input type=\"checkbox\" *ngIf=\"!isLockedByReviewer(duplicate)\"\r\n style=\"right: 5px ; margin: 10px 5px 4px !important;\"\r\n [checked]=\"isDuplicateSelected(original.tempId, duplicate.tempId)\"\r\n (change)=\"onDuplicateCheckboxChange(original.tempId, duplicate.tempId, $event)\"\r\n class=\"position-absolute form-check-input duplicate-checkbox\" />\r\n <span class=\"position-absolute absolute\" \r\n *ngIf=\"isLockedByReviewer(duplicate)\"\r\n (click)=\"resetCheckbox('duplicate', duplicate)\">\r\n\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\"\r\n viewBox=\"0 0 19 19\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_2023_13718)\">\r\n <rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\"\r\n rx=\"2\" fill=\"white\" />\r\n <rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\"\r\n height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\"\r\n stroke-width=\"0.555556\" />\r\n <path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\"\r\n stroke-width=\"0.927778\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_2023_13718\" x=\"0.00021708\"\r\n y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\"\r\n filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\"\r\n result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"0.555556\" />\r\n <feGaussianBlur stdDeviation=\"0.555556\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_2023_13718\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_2023_13718\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n\r\n </span>\r\n </div>\r\n <!-- (change)=\"onImageCheckboxChange(duplicate.tempId, 'duplicate', 'original')\" -->\r\n <!-- Duplicate Image -->\r\n <img [src]=\"imageUrl + duplicate.filePath\" alt=\"\"\r\n (click)=\"openImagePreview(mapping,original.duplicateImage, i, 'Tagged Duplicates')\"\r\n class=\"w-100 rounded border duplicate-image cursor-pointer\" />\r\n\r\n <!-- Duplicate Info -->\r\n <div class=\"row my-2\">\r\n <div class=\"col-9\">\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ duplicate.tempId }}\r\n\r\n <span\r\n *ngIf=\"getAction(duplicate, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(duplicate, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n\r\n </div>\r\n\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(duplicate.entryTime)\r\n }}\r\n </div>\r\n </div>\r\n <div class=\"col-3\">\r\n <span\r\n *ngIf=\"getAction(duplicate, 'approve')?.action === 'approved'\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"37\"\r\n height=\"37\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n </span>\r\n <span\r\n *ngIf=\"getAction(duplicate, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"37\"\r\n height=\"37\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg> </span>\r\n </div>\r\n </div>\r\n <!-- Duplicate Reason -->\r\n <!-- <div class=\"duplicate-reason ms-2 mt-2\">\r\n <small class=\"text-muted\">{{ duplicate.reason }}</small>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n \r\n <!-- Accordion Body -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n \r\n <!-- Loop each block: tagging / review / approve -->\r\n <ng-container *ngFor=\"let block of activityData\">\r\n \r\n <!-- Loop inside comments -->\r\n <div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n \r\n <!-- avatar -->\r\n <div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n <div class=\"w-100\">\r\n \r\n <!-- email -->\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n \r\n <!-- message text -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n \r\n <!-- Review / Approve only -->\r\n <ng-container *ngIf=\"block.type === 'review' || block.type === 'approve'\">\r\n <!-- Tagged images -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n \r\n <div *ngFor=\"let img of c.taggedImages; let i = index\">\r\n \r\n <!-- Show only first 4 -->\r\n <ng-container *ngIf=\"i < 3\">\r\n <div class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url('+ imageUrl + img.filePath + ')'\"></div>\r\n \r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n \r\n <!-- status dots -->\r\n <span *ngIf=\"c.status === 'approved'\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg></span>\r\n \r\n <span *ngIf=\"c.status === 'rejected'\"\r\n ><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n \r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n \r\n <!-- +N more -->\r\n <div\r\n class=\"tango-card more-card text-center\"\r\n *ngIf=\"c.taggedImages.length > 3\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.taggedImages[3].filePath + ')'\"\r\n (click)=\"openImagesPopup(c)\"\r\n >\r\n <div class=\"more-overlay\"></div>\r\n \r\n <!-- vertical container -->\r\n <div class=\"more-wrapper my-10 d-flex flex-column align-items-center justify-content-center\">\r\n <div class=\"more-text fw-semibold\">+{{ c.taggedImages.length - 3 }}</div>\r\n <div class=\"text-primary text-dark text-decoration-underline small\">\r\n View all\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n \r\n </div>\r\n \r\n </ng-container>\r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n \r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n <!-- Status Icons -->\r\n\r\n\r\n </div>\r\n</section>\r\n<section *ngIf=\"type !=='duplicate'\">\r\n <div class=\"layers my-2\" *ngIf=\"hasRevopsType(type)\">\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <div class=\"duplicate-head text-lg my-3\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.51995 0.613065C8.33739 -0.204355 9.66267 -0.204355 10.4801 0.613065L17.387 7.51995C18.2043 8.33739 18.2043 9.66267 17.387 10.4801L10.4801 17.387C9.66267 18.2043 8.33739 18.2043 7.51995 17.387L5.54626 15.4133L3.73708 17.2224C2.91966 18.0399 1.59436 18.0399 0.776944 17.2224C-0.0404767 16.4051 -0.0404767 15.0797 0.776944 14.2624L2.58612 12.4531L0.613065 10.4801C-0.204355 9.66267 -0.204355 8.33739 0.613065 7.51995L7.51995 0.613065ZM9.49336 1.59978C9.22088 1.32731 8.77909 1.32731 8.50661 1.59978L3.57286 6.53357L11.4665 14.4272L16.4002 9.49336C16.6727 9.22088 16.6727 8.77909 16.4002 8.5067L12.9465 5.05286L11.7952 6.20403C11.5228 6.4765 11.0811 6.4765 10.8086 6.20403C10.5361 5.93155 10.5361 5.48978 10.8086 5.21731L11.9597 4.06614L10.9732 3.07964L8.17757 5.87533C7.90509 6.1478 7.46329 6.1478 7.19081 5.87533C6.91833 5.60286 6.91833 5.16109 7.19081 4.88862L9.9865 2.09293L9.49336 1.59978ZM10.4797 15.4139L2.58615 7.52028L1.59978 8.5067C1.3273 8.77909 1.3273 9.22088 1.59978 9.49336L8.50661 16.4002C8.77909 16.6727 9.22088 16.6727 9.49336 16.4002L10.4797 15.4139ZM3.57275 13.4399L1.76366 15.249C1.49119 15.5215 1.49119 15.9633 1.76366 16.2358C2.03613 16.5082 2.4779 16.5082 2.75037 16.2358L4.55946 14.4266L3.57275 13.4399Z\"\r\n fill=\"#475467\" />\r\n </svg></span> {{type}}\r\n\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"ms-3 my-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"selectAllByType[type]\"\r\n (change)=\"onSelectAll(type, $event)\">\r\n <label>Select All</label>\r\n </div>\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <div *ngIf=\"mapping?.type ===viewMode\" class=\"card-body bg-white layers p-5 m-3\">\r\n\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail;let i=index\">\r\n <div *ngIf=\"original?.revopsType ===type\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n'layer-approved': isApproved(original),\r\n'layer-rejected': isRejected(original),\r\n'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n\r\n\r\n <!-- Top-right Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n\r\n <input *ngIf=\"!isLockedByReviewer(original)\" type=\"checkbox\"\r\n class=\"position-absolute absolute form-check-input\"\r\n [checked]=\"(selectedByType[type] || []).includes(original?.tempId)\"\r\n (change)=\"onImageCheckboxChange(type, original.tempId)\" />\r\n <span class=\"position-absolute absolute\" \r\n *ngIf=\"isLockedByReviewer(original)\"\r\n (click)=\"resetCheckbox(type, original)\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\"\r\n viewBox=\"0 0 19 19\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_2023_13718)\">\r\n <rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\"\r\n fill=\"white\" />\r\n <rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\"\r\n rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\" />\r\n <path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\"\r\n stroke-width=\"0.927778\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\"\r\n width=\"18.2222\" height=\"18.2222\"\r\n filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"0.555556\" />\r\n <feGaussianBlur stdDeviation=\"0.555556\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_2023_13718\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_2023_13718\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\" (click)=\"openImagePreview(mapping,original, i, selectedByType[type])\"\r\n class=\"w-100 rounded border cursor-pointer\" />\r\n <div class=\"row my-2\">\r\n <div class=\"col-9\">\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}\r\n <span *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\nheight: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(original, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\nheight: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n <div class=\"col-3 ms-3\">\r\n <span *ngIf=\"getAction(original, 'approve')?.action === 'approved'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"37\" height=\"37\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(original, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"37\" height=\"37\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <div class=\"comments-title\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n\r\n </div>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Content -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n\r\n<!-- loop each block: tagging / review / approve -->\r\n<ng-container *ngFor=\"let block of activityData1\">\r\n\r\n<!-- TAGGING COMMENTS (each comment = one image + message) -->\r\n<ng-container *ngIf=\"block.type === 'tagging'\">\r\n<div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n\r\n<!-- avatar -->\r\n<div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n\r\n<!-- content -->\r\n<div>\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n\r\n <!-- single image card -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div class=\"tango-card\" *ngIf=\"c.filePath\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.filePath + ')'\">\r\n </div>\r\n\r\n <div class=\"tango-meta small\">\r\n <div>Tango ID: {{ c.tempId }}</div>\r\n <div class=\"text-muted\">Entry time: {{ c.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n</ng-container>\r\n\r\n<!-- REVIEW / APPROVE COMMENTS (with taggedImages + +N View all) -->\r\n<ng-container *ngIf=\"block.type === 'review' || block.type === 'approve'\">\r\n<div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n\r\n<!-- avatar -->\r\n<div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n\r\n<!-- content -->\r\n<div class=\"w-100\">\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- main review/approve message -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n\r\n \r\n\r\n <!-- image list + +N View all -->\r\n <div class=\"d-flex gap-2 flex-wrap\" *ngIf=\"c.taggedImages?.length\">\r\n\r\n <!-- first 3 images -->\r\n <div *ngFor=\"let img of c.taggedImages; let i = index\">\r\n <ng-container *ngIf=\"i < 3\">\r\n <div class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + img.filePath + ')'\">\r\n </div>\r\n\r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n <span *ngIf=\"c.status === 'approved'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"c.status === 'rejected'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- +N View all card -->\r\n <div\r\n class=\"tango-card more-card text-center\"\r\n *ngIf=\"c.taggedImages.length > 3\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.taggedImages[3].filePath + ')'\"\r\n (click)=\"openImagesPopup(c)\"\r\n >\r\n <div class=\"more-overlay\"></div>\r\n\r\n <div class=\"more-wrapper d-flex flex-column align-items-center justify-content-center\">\r\n <div class=\"more-text fw-semibold\">\r\n +{{ c.taggedImages.length - 3 }}\r\n </div>\r\n <div class=\"text-primary text-decoration-underline small\">\r\n View all\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n</div>\r\n</ng-container>\r\n\r\n</ng-container>\r\n</div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n</ng-container>\r\n \r\n\r\n\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"showTangoDetails\"\r\n class=\"details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2\"\r\n (click)=\"toggleRevisedDetails(mapping)\">\r\n <span class=\"text-primary \">\r\n Show in details\r\n </span>\r\n \r\n <span class=\"chevron ms-3 cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M6 15L12 9L18 15\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n \r\n \r\n </ng-container>\r\n \r\n \r\n \r\n <!-- <div class=\"timeline\"></div> -->\r\n \r\n </div>\r\n </ng-container>\r\n </section>\r\n </div>\r\n\r\n </div>\r\n<div class=\"row\">\r\n <div class=\"col-md-6 position-relative\">\r\n <div *ngIf=\"isCheckboxEnable\" class=\"pb-3 my-3 h-100 rounded-3 position-relative\">\r\n\r\n <input type=\"checkbox\" class=\"position-absolute absolute1 form-check-input\" [(ngModel)]=\"allSelected\"\r\n (change)=\"overallSelect($event)\" /><span class=\"ms-12\"> Select\r\n All</span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"col-md-6 pe-8\">\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <select class=\"form-select\" aria-placeholder=\"show all\">\r\n <option value=\"all\">Show all</option>\r\n <option value=\"accept\">Accept</option>\r\n <option value=\"reject\">Reject</option>\r\n <option value=\"pending\">Pending</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <button [disabled]=\"!overallSelectedIds?.length\" class=\"btn btn-outline bg-white w-100\"\r\n (click)=\"popupOpen('rejected')\">\r\n\r\n {{ (selectedRole === 'approver' || selectedRole === 'reviewer') ? 'Deny' : 'Reject'\r\n }}\r\n\r\n </button>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <button [disabled]=\"!overallSelectedIds?.length\" class=\"btn btn-outline bg-white w-100\"\r\n (click)=\"popupOpen('approved')\">\r\n\r\n {{ (selectedRole === 'approver' || selectedRole === 'reviewer') ? 'Approve' :\r\n 'Accept' }}\r\n\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<div *ngIf=\"!approverClosed\" class=\"bg-white\">\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n <div *ngIf=\"ticket?._source as source\" class=\"my-5\">\r\n<ng-container *ngFor=\"let type of revopsTypes\">\r\n<section *ngIf=\"type ==='duplicate'\">\r\n\r\n <div *ngIf=\"hasRevopsType(type)\" class=\"layers\">\r\n <!-- Header Section -->\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <h3 class=\"text-lg font-semibold mb-4\">\r\n <span class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_730_76157)\">\r\n <path\r\n d=\"M3.75 11.25H3C2.60218 11.25 2.22064 11.092 1.93934 10.8107C1.65804 10.5294 1.5 10.1478 1.5 9.75V3C1.5 2.60218 1.65804 2.22064 1.93934 1.93934C2.22064 1.65804 2.60218 1.5 3 1.5H9.75C10.1478 1.5 10.5294 1.65804 10.8107 1.93934C11.092 2.22064 11.25 2.60218 11.25 3V3.75M8.25 6.75H15C15.8284 6.75 16.5 7.42157 16.5 8.25V15C16.5 15.8284 15.8284 16.5 15 16.5H8.25C7.42157 16.5 6.75 15.8284 6.75 15V8.25C6.75 7.42157 7.42157 6.75 8.25 6.75Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_76157\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n Duplicates\r\n </h3>\r\n </div>\r\n\r\n\r\n <!-- Body Section -->\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <ng-container *ngIf=\"mapping?.type ===viewMode\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n <div *ngIf=\"original?.isParent && original?.revopsType ==='duplicate'\"\r\n class=\"card-body bg-white layers py-5 px-0 m-3\">\r\n <div class=\"my-4\">\r\n <!-- Original Image -->\r\n <div class=\"duplicate-head px-5 my-3\">Original image\r\n </div>\r\n <div class=\"row px-5\">\r\n <div class=\"col-md-4 relative\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3\">\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"separator separator-dashed mt-3 mb-5\"></div>\r\n <div class=\"row px-5\">\r\n <h5 class=\"duplicate-head my-3 fs-6\">Tagged Duplicates</h5>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"my-3\">\r\n <input type=\"checkbox\" [checked]=\"areAllDuplicatesSelected(original)\"\r\n (change)=\"onToggleSelectAllDuplicates(original, $event)\" />\r\n <label class=\"ms-2\">Select All</label>\r\n </div>\r\n <div *ngFor=\"let duplicate of original?.duplicateImage; let i = index\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n 'layer-approved': isApproved(duplicate),\r\n 'layer-rejected': isRejected(duplicate),\r\n 'img-border border border-1': !isApproved(duplicate) && !isRejected(duplicate)}\">\r\n <!-- Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n <input type=\"checkbox\" *ngIf=\"!isLockedByReviewer(duplicate)\"\r\n style=\"right: 5px ; margin: 10px 5px 4px !important;\"\r\n [checked]=\"isDuplicateSelected(original.tempId, duplicate.tempId)\"\r\n (change)=\"onDuplicateCheckboxChange(original.tempId, duplicate.tempId, $event)\"\r\n class=\"position-absolute form-check-input duplicate-checkbox\" />\r\n <span class=\"position-absolute absolute\" \r\n *ngIf=\"isLockedByReviewer(duplicate)\"\r\n (click)=\"resetCheckbox('duplicate', duplicate)\">\r\n\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\"\r\n viewBox=\"0 0 19 19\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_2023_13718)\">\r\n <rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\"\r\n rx=\"2\" fill=\"white\" />\r\n <rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\"\r\n height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\"\r\n stroke-width=\"0.555556\" />\r\n <path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\"\r\n stroke-width=\"0.927778\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_2023_13718\" x=\"0.00021708\"\r\n y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\"\r\n filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\"\r\n result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"0.555556\" />\r\n <feGaussianBlur stdDeviation=\"0.555556\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_2023_13718\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_2023_13718\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n\r\n </span>\r\n </div>\r\n <!-- (change)=\"onImageCheckboxChange(duplicate.tempId, 'duplicate', 'original')\" -->\r\n <!-- Duplicate Image -->\r\n <img [src]=\"imageUrl + duplicate.filePath\" alt=\"\"\r\n (click)=\"openImagePreview(mapping,original.duplicateImage, i, 'Tagged Duplicates')\"\r\n class=\"w-100 rounded border duplicate-image cursor-pointer\" />\r\n\r\n <!-- Duplicate Info -->\r\n <div class=\"row my-2\">\r\n <div class=\"col-9\">\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ duplicate.tempId }}\r\n\r\n <span\r\n *ngIf=\"getAction(duplicate, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(duplicate, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n\r\n </div>\r\n\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(duplicate.entryTime)\r\n }}\r\n </div>\r\n </div>\r\n <div class=\"col-3\">\r\n <span\r\n *ngIf=\"getAction(duplicate, 'approve')?.action === 'approved'\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"37\"\r\n height=\"37\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n </span>\r\n <span\r\n *ngIf=\"getAction(duplicate, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"37\"\r\n height=\"37\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg> </span>\r\n </div>\r\n </div>\r\n <!-- Duplicate Reason -->\r\n <!-- <div class=\"duplicate-reason ms-2 mt-2\">\r\n <small class=\"text-muted\">{{ duplicate.reason }}</small>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n \r\n <!-- Accordion Body -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n \r\n <!-- Loop each block: tagging / review / approve -->\r\n <ng-container *ngFor=\"let block of activityData\">\r\n \r\n <!-- Loop inside comments -->\r\n <div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n \r\n <!-- avatar -->\r\n <div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n <div class=\"w-100\">\r\n \r\n <!-- email -->\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n \r\n <!-- message text -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n \r\n <!-- Review / Approve only -->\r\n <ng-container *ngIf=\"block.type === 'review' || block.type === 'approve'\">\r\n <!-- Tagged images -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n \r\n <div *ngFor=\"let img of c.taggedImages; let i = index\">\r\n \r\n <!-- Show only first 4 -->\r\n <ng-container *ngIf=\"i < 3\">\r\n <div class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url('+ imageUrl + img.filePath + ')'\"></div>\r\n \r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n \r\n <!-- status dots -->\r\n <span *ngIf=\"c.status === 'approved'\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg></span>\r\n \r\n <span *ngIf=\"c.status === 'rejected'\"\r\n ><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n \r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n \r\n <!-- +N more -->\r\n <div\r\n class=\"tango-card more-card text-center\"\r\n *ngIf=\"c.taggedImages.length > 3\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.taggedImages[3].filePath + ')'\"\r\n (click)=\"openImagesPopup(c)\"\r\n >\r\n <div class=\"more-overlay\"></div>\r\n \r\n <!-- vertical container -->\r\n <div class=\"more-wrapper my-10 d-flex flex-column align-items-center justify-content-center\">\r\n <div class=\"more-text fw-semibold\">+{{ c.taggedImages.length - 3 }}</div>\r\n <div class=\"text-primary text-dark text-decoration-underline small\">\r\n View all\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n \r\n </div>\r\n \r\n </ng-container>\r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n \r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n <!-- Status Icons -->\r\n\r\n\r\n </div>\r\n</section>\r\n<section *ngIf=\"type !=='duplicate'\">\r\n <div class=\"layers my-2\" *ngIf=\"hasRevopsType(type)\">\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <div class=\"duplicate-head text-lg my-3\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.51995 0.613065C8.33739 -0.204355 9.66267 -0.204355 10.4801 0.613065L17.387 7.51995C18.2043 8.33739 18.2043 9.66267 17.387 10.4801L10.4801 17.387C9.66267 18.2043 8.33739 18.2043 7.51995 17.387L5.54626 15.4133L3.73708 17.2224C2.91966 18.0399 1.59436 18.0399 0.776944 17.2224C-0.0404767 16.4051 -0.0404767 15.0797 0.776944 14.2624L2.58612 12.4531L0.613065 10.4801C-0.204355 9.66267 -0.204355 8.33739 0.613065 7.51995L7.51995 0.613065ZM9.49336 1.59978C9.22088 1.32731 8.77909 1.32731 8.50661 1.59978L3.57286 6.53357L11.4665 14.4272L16.4002 9.49336C16.6727 9.22088 16.6727 8.77909 16.4002 8.5067L12.9465 5.05286L11.7952 6.20403C11.5228 6.4765 11.0811 6.4765 10.8086 6.20403C10.5361 5.93155 10.5361 5.48978 10.8086 5.21731L11.9597 4.06614L10.9732 3.07964L8.17757 5.87533C7.90509 6.1478 7.46329 6.1478 7.19081 5.87533C6.91833 5.60286 6.91833 5.16109 7.19081 4.88862L9.9865 2.09293L9.49336 1.59978ZM10.4797 15.4139L2.58615 7.52028L1.59978 8.5067C1.3273 8.77909 1.3273 9.22088 1.59978 9.49336L8.50661 16.4002C8.77909 16.6727 9.22088 16.6727 9.49336 16.4002L10.4797 15.4139ZM3.57275 13.4399L1.76366 15.249C1.49119 15.5215 1.49119 15.9633 1.76366 16.2358C2.03613 16.5082 2.4779 16.5082 2.75037 16.2358L4.55946 14.4266L3.57275 13.4399Z\"\r\n fill=\"#475467\" />\r\n </svg></span> {{type}}\r\n\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"ms-3 my-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"selectAllByType[type]\"\r\n (change)=\"onSelectAll(type, $event)\">\r\n <label>Select All</label>\r\n </div>\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <div *ngIf=\"mapping?.type ===viewMode\" class=\"card-body bg-white layers p-5 m-3\">\r\n\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail;let i=index\">\r\n <div *ngIf=\"original?.revopsType ===type\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n'layer-approved': isApproved(original),\r\n'layer-rejected': isRejected(original),\r\n'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n\r\n\r\n <!-- Top-right Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n\r\n <input *ngIf=\"!isLockedByReviewer(original)\" type=\"checkbox\"\r\n class=\"position-absolute absolute form-check-input\"\r\n [checked]=\"(selectedByType[type] || []).includes(original?.tempId)\"\r\n (change)=\"onImageCheckboxChange(type, original.tempId)\" />\r\n <span class=\"position-absolute absolute\" \r\n *ngIf=\"isLockedByReviewer(original)\"\r\n (click)=\"resetCheckbox(type, original)\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\"\r\n viewBox=\"0 0 19 19\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_2023_13718)\">\r\n <rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\"\r\n fill=\"white\" />\r\n <rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\"\r\n rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\" />\r\n <path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\"\r\n stroke-width=\"0.927778\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\"\r\n width=\"18.2222\" height=\"18.2222\"\r\n filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"0.555556\" />\r\n <feGaussianBlur stdDeviation=\"0.555556\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_2023_13718\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_2023_13718\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\" (click)=\"openImagePreview(mapping,original, i, selectedByType[type])\"\r\n class=\"w-100 rounded border cursor-pointer\" />\r\n <div class=\"row my-2\">\r\n <div class=\"col-9\">\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}\r\n <span *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\nheight: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(original, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\nheight: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n <div class=\"col-3 ms-3\">\r\n <span *ngIf=\"getAction(original, 'approve')?.action === 'approved'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"37\" height=\"37\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(original, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"37\" height=\"37\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <div class=\"comments-title\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n\r\n </div>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Content -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n\r\n<!-- loop each block: tagging / review / approve -->\r\n<ng-container *ngFor=\"let block of activityData1\">\r\n\r\n<!-- TAGGING COMMENTS (each comment = one image + message) -->\r\n<ng-container *ngIf=\"block.type === 'tagging'\">\r\n<div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n\r\n<!-- avatar -->\r\n<div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n\r\n<!-- content -->\r\n<div>\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n\r\n <!-- single image card -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div class=\"tango-card\" *ngIf=\"c.filePath\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.filePath + ')'\">\r\n </div>\r\n\r\n <div class=\"tango-meta small\">\r\n <div>Tango ID: {{ c.tempId }}</div>\r\n <div class=\"text-muted\">Entry time: {{ c.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n</ng-container>\r\n\r\n<!-- REVIEW / APPROVE COMMENTS (with taggedImages + +N View all) -->\r\n<ng-container *ngIf=\"block.type === 'review' || block.type === 'approve'\">\r\n<div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n\r\n<!-- avatar -->\r\n<div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n\r\n<!-- content -->\r\n<div class=\"w-100\">\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- main review/approve message -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n\r\n \r\n\r\n <!-- image list + +N View all -->\r\n <div class=\"d-flex gap-2 flex-wrap\" *ngIf=\"c.taggedImages?.length\">\r\n\r\n <!-- first 3 images -->\r\n <div *ngFor=\"let img of c.taggedImages; let i = index\">\r\n <ng-container *ngIf=\"i < 3\">\r\n <div class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + img.filePath + ')'\">\r\n </div>\r\n\r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n <span *ngIf=\"c.status === 'approved'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"c.status === 'rejected'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- +N View all card -->\r\n <div\r\n class=\"tango-card more-card text-center\"\r\n *ngIf=\"c.taggedImages.length > 3\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.taggedImages[3].filePath + ')'\"\r\n (click)=\"openImagesPopup(c)\"\r\n >\r\n <div class=\"more-overlay\"></div>\r\n\r\n <div class=\"more-wrapper d-flex flex-column align-items-center justify-content-center\">\r\n <div class=\"more-text fw-semibold\">\r\n +{{ c.taggedImages.length - 3 }}\r\n </div>\r\n <div class=\"text-primary text-decoration-underline small\">\r\n View all\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n</div>\r\n</ng-container>\r\n\r\n</ng-container>\r\n</div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n</ng-container>\r\n \r\n\r\n\r\n </div>\r\n </ng-container>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n\r\n</section>\r\n\r\n\r\n<ng-template #zoomPopup let-model>\r\n <div class=\"p-4 m-4\">\r\n <div class=\"modal-header border-0 p-0 w-100 flex-column align-items-start\">\r\n\r\n <!-- Heading -->\r\n <h5 class=\"modal-title mb-2\">\r\n {{ popupType === 'approved' ? 'Approve' : 'Reject' }} Selected Images\r\n </h5>\r\n\r\n <!-- Description -->\r\n <p class=\"mb-3 test-appvalue\">\r\n You're about to {{ popupType === 'approved' ? 'Approve' : 'Reject' }} {{ this.overallSelectedIds?.length ? this.overallSelectedIds?.length : this.popupValue ?\r\n this.popupValue:'--' }} <span class=\"fw-bold\">{{ selectedCategoriesLabel | titlecase }}</span>\r\n </p>\r\n <!-- Count Box -->\r\n <div *ngIf=\"selectedCategories?.length === 1\" class=\"w-100 mb-4\">\r\n <label class=\"mb-2\">Remarks (Optional)</label>\r\n <textarea class=\"form-control\" rows=\"3\" [(ngModel)]=\"remarks\"></textarea>\r\n\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"w-100 d-flex justify-content-end\">\r\n <button class=\"btn btn-outline me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary\" (click)=\"submitValue(popupType, popupvalue)\">\r\n {{ popupType === 'approved' ? 'Approve' : 'Reject' }}\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #closePopup let-model>\r\n <div class=\"p-4 m-4\">\r\n <div class=\"modal-header border-0 p-0 w-100 flex-column align-items-start\">\r\n <h5 class=\"modal-title mb-2\">\r\n Close ticket\r\n </h5>\r\n <p class=\"mb-3 test-appvalue\">\r\n You are about to close the ticket, Are you sure want to continue?\r\n </p>\r\n <div class=\"w-100 d-flex justify-content-end\">\r\n <button class=\"btn btn-outline me-2\" (click)=\"confirmCloseCancel()\">Cancel</button>\r\n <button class=\"btn btn-primary\" (click)=\"confirmCloseTicket()\">\r\n Close ticket\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #ReassignTicketPopup let-model>\r\n <div class=\"p-4 m-4\">\r\n <div class=\"modal-header border-0 p-0 w-100 flex-column align-items-start\">\r\n\r\n <!-- Heading -->\r\n <h5 class=\"modal-title mb-2\">\r\n Re-Assign Ticket\r\n </h5>\r\n\r\n <!-- Description -->\r\n <p class=\"mb-3 test-appvalue\">\r\n Transfer the ticket to another user\r\n </p>\r\n\r\n <!-- Count Box -->\r\n <div class=\"row w-100 my-3\">\r\n <div class=\"col-md-12 mb-4\">\r\n <label class=\"label mb-2\">Choose User</label>\r\n <team-select [items]=\"reviwerList\" [multi]=\"false\" [searchField]=\"'userName'\" [idField]=\"'email'\"\r\n (selected)=\"reviewerChange($event)\" [selectedValues]=\"[selectedReviewer]\"></team-select>\r\n </div>\r\n </div>\r\n`\r\n <!-- Action Buttons -->\r\n <div class=\"w-100 d-flex justify-content-end\">\r\n <button class=\"btn btn-outline me-2\" (click)=\"cancelassign()\">Cancel</button>\r\n <button class=\"btn btn-primary\" (click)=\"assignTicketView()\">\r\n Re-Assign\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n\r\n\r\n\r\n<ng-template #imagePreviewPopup let-model>\r\n <div class=\"p-4 m-4\">\r\n <div class=\"modal-header border-0 my-2 p-0 w-100 d-flex justify-content-between align-items-center\">\r\n\r\n <h5 class=\"modal-title mb-2 m-0\">{{ previewTitle }}</h5>\r\n\r\n <!-- Close Button -->\r\n <button type=\"button\"\r\n class=\"btn-close fs-4\"\r\n aria-label=\"Close\"\r\n (click)=\"model.close()\">\r\n \r\n </button>\r\n\r\n </div>\r\n\r\n <div class=\"w-100 position-relative mb-4\">\r\n\r\n <button class=\"btn btn-light position-absolute ms-3 start-0 top-50 translate-middle-y\"\r\n (click)=\"prevPreview()\" [disabled]=\"previewList.length <= 1\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" fill=\"none\">\r\n<path d=\"M15.5615 6.22429L9.33724 12.4486L15.5615 18.6729\" stroke=\"#344054\" stroke-width=\"2.07891\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n </button>\r\n\r\n <img [src]=\"getPreviewImageUrl()\" class=\"w-100 rounded border\" />\r\n <div class=\"row my-2\">\r\n <div class=\"col-10\">\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ currentPreviewItem.tempId }}\r\n\r\n <span *ngIf=\"getAction(currentPreviewItem, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(currentPreviewItem, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n\r\n </div>\r\n\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(currentPreviewItem.entryTime) }}</div>\r\n </div>\r\n <div class=\"col-2 mt-2 text-end\">\r\n <span *ngIf=\"getAction(currentPreviewItem, 'approve')?.action === 'approved'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"42\" height=\"42\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(currentPreviewItem, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"42\" height=\"42\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n </div>\r\n\r\n <!-- Duplicate Reason -->\r\n <!-- <div class=\"duplicate-reason ms-2 mt-2\">\r\n <small class=\"text-muted\">{{ currentPreviewItem.reason }}</small>\r\n </div> -->\r\n\r\n <button class=\"btn btn-light position-absolute me-3 end-0 top-50 translate-middle-y\" (click)=\"nextPreview()\"\r\n [disabled]=\"previewList.length <= 1\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" fill=\"none\">\r\n<path d=\"M9.33594 18.6732L15.5602 12.4489L9.33594 6.22461\" stroke=\"#344054\" stroke-width=\"2.07891\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n </button>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"canShowPreviewActions(currentPreviewItem)\" class=\"w-100 d-flex justify-content-end\">\r\n <button class=\"btn btn-outline me-2\" (click)=\"rejectedPopup('rejected',currentPreviewItem)\">\r\n\r\n {{ (selectedRole === 'approver' || selectedRole === 'reviewer') ? 'Deny' : 'Reject'\r\n }}</button>\r\n <button class=\"btn btn-primary\" (click)=\"approvedPopup('approved',currentPreviewItem)\">\r\n\r\n {{ (selectedRole === 'approver' || selectedRole === 'reviewer') ? 'Approve' :\r\n 'Accept' }}</button>\r\n </div>\r\n\r\n </div>\r\n \r\n</ng-template>\r\n\r\n\r\n<ng-template #internalticket let-modal>\r\n <div class=\"h-auto p-10\">\r\n <div class=\"card-header border-0\">\r\n <div class=\"card-title\">Start audit</div>\r\n <div class=\"card-sub\">Please select a store and date range to start audit</div>\r\n </div>\r\n <div class=\"row my-3\">\r\n <div class=\"col-md-7 mb-4\">\r\n <label class=\"label\">Store</label>\r\n <lib-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeName'\" [idField]=\"'storeId'\"\r\n (selected)=\"storeChange($event)\" [selectedValues]=\"[selectedStore]\"></lib-select>\r\n </div>\r\n <div class=\"col-md-5 mt-7\">\r\n\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <input class=\"fx-date-range form-control ps-14\" style=\"width:165px !important\" type=\"text\" matInput\r\n ngxDaterangepickerMd [singleDatePicker]=\"true\" [drops]=\"'down'\" [opens]=\"'left'\"\r\n [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\"\r\n autocomplete=\"off\" [(ngModel)]=\"selectedDateRange\"\r\n (startDateChanged)=\"onStartDateChange($event)\" [isCustomDate]=\"isCustomDate\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" [readonly]=\"true\" [autoApply]=\"true\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mt-3\" *ngIf=\"footfallcount>0\">\r\n <div>{{footfallcount}}</div>\r\n <div class=\"mt-2\">Total footfall</div>\r\n </div>\r\n <div class=\"card-body mt-5\">\r\n <div class=\"w-100 d-flex mt-5\">\r\n\r\n <button class=\"btn btn-outline w-50 me-2\" (click)=\"modal.close('isDenied')\">Cancel</button>\r\n <button [disabled]=\"disableAudit&&footfallcount>0\" class=\"btn btn-primary w-50 ms-2\"\r\n (click)=\"modal.close('isConfirmed')\">start</button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Simple overlay modal -->\r\n<div class=\"images-modal-backdrop\" *ngIf=\"showImagesModal\">\r\n <div class=\"images-modal\">\r\n <div class=\"modal-header d-flex justify-content-between align-items-start mb-3\">\r\n <div>\r\n <h6 class=\"mb-1\">All Images</h6>\r\n\r\n <!-- email -->\r\n <div class=\"small fw-semibold\">\r\n {{ selectedComment?.createdByEmail }}\r\n </div>\r\n\r\n <!-- time -->\r\n <div class=\"small text-muted\" *ngIf=\"selectedComment?.createdAt\">\r\n {{ selectedComment?.createdAt | date: 'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- optional comment text under time -->\r\n <p class=\"mb-0 mt-2\" *ngIf=\"selectedComment?.message\">\r\n {{ selectedComment?.message }}\r\n </p>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"btn-close ms-3\"\r\n (click)=\"closeImagesPopup()\">\r\n </button>\r\n</div>\r\n\r\n\r\n <div class=\"modal-body d-flex flex-wrap gap-3\">\r\n <div *ngFor=\"let img of selectedImagesForPopup\" class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url('+ imageUrl + img.filePath + ')'\">\r\n </div>\r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n\r\n <!-- status dots -->\r\n <span *ngIf=\"img.status === 'approved'\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg></span>\r\n\r\n <span *ngIf=\"img.status === 'rejected'\"\r\n ><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n\r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".card-header,.header{color:var(--Gray-900, #101828);font-size:20px!important;font-style:normal;font-weight:700;line-height:27px}.sub-header{color:var(--Gray-700, #344054);font-size:14px!important;font-style:normal;font-weight:600;line-height:20px}.ellipse1{border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.card-title-foot{color:var(--Gray-800, #1D2939)!important;font-size:18px;font-weight:600;line-height:28px}.card-title-label{color:var(--Gray-800, #1D2939)!important;font-size:16px;font-weight:600;line-height:28px}.card-title-value{color:var(--Gray-800, #1D2939)!important;font-size:16px;font-weight:400;line-height:28px}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}.rotate{rotate:180deg;transition:1s}.border-selectall{border-radius:6px;border-bottom:1px solid var(--Gray-200, #EAECF0);background:#f9fafb;padding:8px 12px}.border-selectall1{border-radius:6px!important;background:var(--White, #FFF)!important;padding:8px 2px}.border-totalfootfall{border-radius:12px;padding:4px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF)}.vl{border-left:2px solid #000;height:50px}.duplicate-head{color:var(--Gray-700, #344054);font-size:16px;font-weight:600;line-height:20px}.img-border{border-radius:5px!important;border:2px solid var(--Gray-300, #D0D5DD)}.desc-title{color:var(--Gray-900, #101828);font-size:12px;font-weight:500;line-height:20px}.desc-value{color:var(--Gray-900, #475467);font-size:10px;font-weight:500;line-height:10px}.img-border{overflow:hidden;position:relative}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:1px!important}.absolute{top:5px;right:5px;z-index:2}.absolute1{top:5px;left:8px;z-index:2}.img-src{width:25%;height:20%}.backButtonright{border-radius:1000px!important;background:var(--text-primary, #FFF)!important;padding:12px!important;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808!important;box-shadow:0 8.727px 11.636px -2.909px #10182814,0 2.909px 4.364px -1.455px #10182808!important;position:absolute;top:30px;right:-10px;z-index:0}.backButtonleft{border-radius:1000px!important;background:#fff;padding:14px!important;border:var(--Gray-300, #D0D5DD);box-shadow:0 8.727px 11.636px -2.909px #10182814,0 2.909px 4.364px -1.455px #10182808;position:absolute;top:30px;left:-20px;z-index:5}.select-wrapper{position:relative;display:inline-block;width:100%}.placeholder-overlay{position:absolute;color:var(--Gray-500, #667085);font-family:Inter;font-size:16px!important;font-style:normal;font-weight:400;top:10px;left:15px;pointer-events:none;font-size:1.1rem;z-index:1}.card-title{color:var(--Black, #101828)!important;font-size:20px!important;font-weight:700!important;line-height:30px}.card-title-sub-header{color:var(--Black, #101828);font-size:14px;font-weight:500;line-height:30px}.separator.separator-dashed{border-bottom-style:double!important}.border-1{border-radius:4px!important;border:1px solid var(--Gray-300, #D0D5DD)!important}.store-item{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-radius:8px;transition:background-color .3s ease}.store-item-active{background:#eaf8ff}.left{display:flex;align-items:center;gap:8px;overflow:hidden;color:var(--Gray-700, #344054);text-overflow:ellipsis;font-size:14px;font-style:normal;font-weight:400;line-height:24px}.left .active-text{overflow:hidden;color:var(--Primary-700, #EAF8FF);font-size:14px;font-style:normal;font-weight:400;line-height:24px}.badge-active{border-radius:16px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);text-align:center;font-size:12px;font-style:normal;font-weight:500;line-height:20px;mix-blend-mode:multiply}.badge-normal{color:var(--Gray-700, #344054);text-align:center;font-size:12px;font-style:normal;font-weight:500;line-height:20px;border-radius:16px;background:var(--Gray-100, #F2F4F7)}.bg-light-primary{background:#f6fcff!important}.card-layer{gap:16px!important;opacity:1!important;padding:16px!important;border-radius:16px!important;border-width:1px!important;background:#fff;border:1px solid #EAECF0!important}.ticket-container{width:100%;background:#fff;border-radius:12px;padding:0;font-family:Inter,sans-serif}.ticket-header{display:flex;justify-content:space-between;align-items:center;border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;padding:16px 20px;font-weight:600}.footfall-value{font-weight:600;font-size:20px;line-height:30px;letter-spacing:0%;vertical-align:middle;color:#101828}.issue-date{font-size:14px;color:#666}.timeline{width:1.5px;height:15px;background:#d0d5dd;margin-left:33px}.timeline-new{width:1px;height:70px;background:#d0d5dd;margin-left:30px;font-weight:600}.revision-card{background:#fff;border:1px solid #eaeaea;border-radius:12px;padding:0 20px}.user-info{display:flex;align-items:center}.avatar{width:42px;height:40px;border-radius:50%;margin-right:15px;font-size:14px;color:#1d2939;font-weight:600}.user-name{font-size:13px;color:#555}.user-email{font-size:12px;color:#888;margin-top:2px}.values-row{display:flex;justify-content:space-between;flex-wrap:wrap}.value-block{min-width:90px;margin:10px 0}.value{font-size:20px;font-weight:700}.label{font-size:14px;color:#1d2939;margin-top:3px}.accuracy{font-size:18px!important}.accuracy.up,.accuracy.down{color:#00a3ff}.footfall-label{font-weight:700;font-size:14px;line-height:20px;letter-spacing:0%;vertical-align:middle;color:#344054!important}.duplicate-layer{gap:10px;opacity:1;padding:16px;border-bottom-width:1px;border-bottom:1px solid #F2F4F7;background:#fff}.layer-approved{border-color:#a6f4c5!important;box-shadow:0 0 0 2.29px #a6f4c5}.layer-rejected{border-color:#fda29b!important;box-shadow:0 0 0 2.29px #fda29b}.layers{border-radius:8px;border-width:1px;opacity:1;border:1px solid #EAECF0;background:#fcfcfd;margin:12px}.accordion-header{cursor:pointer}svg.rotated{transform:rotate(180deg);transition:transform .3s ease}.accordion-body{animation:fadeIn .25s ease}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.ellipsis-underline{max-width:120px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:underline;cursor:pointer;display:inline-block}table td{line-height:14px!important}.btn-filter{font-weight:600;font-size:14px;line-height:20px;letter-spacing:0%;text-transform:capitalize;color:#344054}.overlay{position:fixed;inset:0;background:#0000001a}.filter-card{position:absolute;right:0;background:#fff;border-radius:8px;padding:16px 20px;box-shadow:0 8px 24px #0000001f;font-size:13px}.border-primary-layers{opacity:1;gap:12px;padding-bottom:16px;background:#eaf8ff;border-radius:8px!important}.border-primary-layers .label-title{opacity:1;gap:10px;padding:8px;border-bottom-right-radius:8px!important;background:#daf1ff;font-weight:500!important;font-size:18px!important;line-height:28px!important;letter-spacing:0%;color:#000!important}.border-primary-layers .label-desc{font-weight:500;font-size:16px;line-height:28px;letter-spacing:0%;color:#008edf!important}.comment-thread{border-left:1px solid #e5e5e5;padding-left:16px}.comment-avatar{width:32px;height:32px;border-radius:50%;object-fit:cover}.tango-card{width:140px;border-radius:8px;border:1px solid #e5e5e5;overflow:hidden;background:#fff;cursor:pointer}.tango-image{height:80px;background-size:cover;background-position:center}.tango-meta{padding:6px 8px}.more-card{background:#00000008;font-weight:600}.status-dot{display:inline-block;width:10px;height:10px;border-radius:50%;margin-left:4px}.status-approve{background:#22c55e}.status-reject{background:#ef4444}.page-content{padding:16px}.filter-backdrop{position:fixed;inset:0;background:#0f172a40;z-index:998}.filter-modal{position:fixed;inset:0;display:flex;justify-content:center;align-items:center;z-index:999}.store-item-active{background-color:#eaf8ff}.store-item{padding:8px 12px 8px 10px;border-radius:6px;padding:8px 12px;gap:12px;opacity:1}.ticket-id{font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#1d2939}.store-name{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}.perc-badge{font-size:12px;min-width:48px;text-align:center}.perc-badge-normal{background-color:#f3f3f3;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;color:#344054}.perc-badge-active{background-color:#d9ecff;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;color:#009bf3}.border-selectall{padding:8px 10px;border-radius:12px;background:#f7f7f7}.reviewer-label{font-size:12px;color:gray}.sort-arrow{font-size:10px;line-height:1}.modal-title{font-weight:600;font-size:18px;line-height:28px;letter-spacing:0%;color:#1d2939}.test-appvalue{color:#1d2939;font-weight:400;font-size:16px;line-height:24px;letter-spacing:0%}.light-primary{background:#eaf8ff!important}.nav-item .nav-link.active{border:none;border-radius:6px;background:var(--Primary-50, #EAF8FF);padding:8px 12px}.revision-card-approve-closed{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.ticket-actions-wrapper{position:relative;display:inline-block}.icon-btn{border:none;background:transparent;cursor:pointer;padding:4px 6px;border-radius:999px}.ticket-menu{position:absolute;right:0;top:100%;margin-top:4px;background:#fff;border-radius:10px;box-shadow:0 8px 20px #0f172a26;min-width:160px;overflow:hidden;z-index:1000}.ticket-menu-item{padding:8px 16px;font-size:13px;color:#111827;border-bottom:1px solid #f3f4f6;cursor:pointer}.ticket-menu-item:last-child{border-bottom:none}.revision-card-approve{border-top:none!important;border:1px solid #eaeaea!important;border-radius:0 0 12px 12px!important}input[type=checkbox]:disabled{cursor:not-allowed;opacity:.6;outline:1px solid var(--primary-600, #dddddd)!important;background-color:var(--primary-50, #e9e9ea)}.card-title{font-weight:600;font-size:18px;line-height:28px;letter-spacing:0%;color:#1d2939}.card-sub{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#475467}.daterangepicker{display:block!important;top:153.85px!important;left:900px!important;right:0}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize}::ng-deep .applyBtn{display:none!important}::ng-deep .md-drppicker .btn{line-height:10px!important}::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:365px!important}::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}::ng-deep .md-drppicker td.active,::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}::ng-deep .md-drppicker table th,::ng-deep .md-drppicker table td{width:40px!important;height:40px!important;padding:10px 8px!important}::ng-deep .md-drppicker td.available.prev,::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}::ng-deep .md-drppicker td.available.next,::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}::ng-deep .md-drppicker table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px;font-weight:500!important;line-height:24px}::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.custom-table thead tr{background:var(--Gray-50, #F9FAFB)!important;font-size:12px!important;text-align:start!important}.more-overlay{position:absolute;inset:0;background:#ffffffbf;z-index:1}.more-wrapper{position:relative;z-index:2;color:#000}.tango-card.more-card{position:relative;background-size:cover;background-position:center;cursor:pointer;overflow:hidden}.tango-card.more-card .more-overlay{position:absolute;inset:0;background:#ffffffbf}.tango-card.more-card .more-text{position:relative;font-weight:600;font-size:14px}.images-modal-backdrop{position:fixed;inset:0;background:#0f172a59;display:flex;align-items:center;justify-content:center;z-index:1050}.images-modal{background:#fff;border-radius:12px;padding:16px 20px;max-width:900px;max-height:80vh;overflow-y:auto}.text-underline{text-decoration:underline}\n"], dependencies: [{ kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i5.CustomSelectComponent, selector: "lib-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected"] }, { kind: "directive", type: i10.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "component", type: i11.CustomSelectComponent, selector: "team-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected"] }, { kind: "pipe", type: i9.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i9.DatePipe, name: "date" }] });
|
|
2186
|
+
}
|
|
2187
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TicketFootfallNewComponent, decorators: [{
|
|
2188
|
+
type: Component,
|
|
2189
|
+
args: [{ selector: "lib-ticket-footfall-new", template: "<section *ngIf=\"select ==='ticketList'\">\r\n <div class=\"row ms-3 my-3\">\r\n <ul *ngIf=\"usersDetails?.userType === 'tango'\"\r\n class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <li class=\"nav-item\">\r\n <a [ngClass]=\"tangoType === 'store' ? 'active' : ''\" (click)=\"viewTicket('store')\"\r\n class=\"nav-link cursor-pointer no-border me-3\">\r\n Tickets\r\n </a>\r\n </li>\r\n <li class=\"nav-item\">\r\n <a [ngClass]=\"tangoType === 'internal' ? 'active' : ''\" (click)=\"viewTicket('internal')\"\r\n class=\"nav-link cursor-pointer no-border me-3\"> Internal audit\r\n </a>\r\n </li>\r\n </ul>\r\n <ul *ngIf=\"hasApproverAccess && hasReviewerAccess && usersDetails?.userType !== 'tango'\"\r\n class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap\">\r\n <!-- Approver tab -->\r\n <li class=\"nav-item\" *ngIf=\"hasApproverAccess\">\r\n <a [ngClass]=\"selectedRole === 'approver' ? 'active' : ''\"\r\n class=\"nav-link cursor-pointer no-border me-3\" (click)=\"SelectedRole('approver')\">\r\n Approver\r\n </a>\r\n </li>\r\n\r\n <!-- Reviewer tab -->\r\n <li class=\"nav-item\" *ngIf=\"hasReviewerAccess\">\r\n <a [ngClass]=\"selectedRole === 'reviewer' ? 'active' : ''\"\r\n class=\"nav-link cursor-pointer no-border me-3\" (click)=\"SelectedRole('reviewer')\">\r\n Reviewer\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-9 mb-3\">\r\n <div class=\"card\">\r\n <div class=\"card-header ellipse1 px-5\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title my-0\">{{ getFootfallSummaryData?.totalTickets !== null ?\r\n getFootfallSummaryData?.totalTickets : '--' }}</h5>\r\n <span class=\"sub-header\">Total tickets</span>\r\n </div>\r\n <div *ngIf=\"getFootfallSummaryData?.averageAccuracyOverAll !== null &&\r\n getFootfallSummaryData?.averageAccuracyOverAll !== undefined\" class=\"card-toolbar\">\r\n <div class=\"my-0\">\r\n <h5 class=\"card-title my-0\">{{ getFootfallSummaryData?.averageAccuracyOverAll !== null ?\r\n getFootfallSummaryData?.averageAccuracyOverAll + '%' : '--' }}</h5>\r\n <span class=\"sub-header\">Average accuracy (Overall)</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div *ngIf=\"getFootfallSummaryData?.openTickets !== null &&\r\n getFootfallSummaryData?.openTickets !== undefined\" class=\"col my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.openTickets !== null ?\r\n getFootfallSummaryData?.openTickets : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Open</span>\r\n </div>\r\n <div *ngIf=\"getFootfallSummaryData?.openInfraIssues !== null &&\r\n getFootfallSummaryData?.openInfraIssues !== undefined\" class=\"col my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.openInfraIssues !== null ?\r\n getFootfallSummaryData?.openInfraIssues : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Open-Infra Issue</span>\r\n </div>\r\n <div *ngIf=\"getFootfallSummaryData?.inprogress !== null &&\r\n getFootfallSummaryData?.inprogress !== undefined\" class=\"col my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.inprogress !== null ?\r\n getFootfallSummaryData?.inprogress : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">In-progress</span>\r\n </div>\r\n <div *ngIf=\"getFootfallSummaryData?.closedTickets !== null &&\r\n getFootfallSummaryData?.closedTickets !== undefined\" class=\"col my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.closedTickets !== null ?\r\n getFootfallSummaryData?.closedTickets : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Closed</span>\r\n </div>\r\n\r\n <div *ngIf=\"getFootfallSummaryData?.dueToday !== null &&\r\n getFootfallSummaryData?.dueToday !== undefined\" class=\"col my-3 \">\r\n <h5 style=\"color:#DC6803 !important\" class=\"card-title\">{{ getFootfallSummaryData?.dueToday\r\n !== null ?\r\n getFootfallSummaryData?.dueToday : '--' }}</h5>\r\n <span class=\"card-title-sub-header\" style=\"color:#DC6803 !important\">Due today</span>\r\n </div>\r\n\r\n <div *ngIf=\"getFootfallSummaryData?.Expired !== null &&\r\n getFootfallSummaryData?.Expired !== undefined\" class=\"col my-3 \">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.Expired !== null ?\r\n getFootfallSummaryData?.Expired : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Expired</span>\r\n </div>\r\n\r\n <div *ngIf=\"getFootfallSummaryData?.underTangoReview !== null &&\r\n getFootfallSummaryData?.underTangoReview !== undefined\" class=\"col my-3 \">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.underTangoReview !== null ?\r\n getFootfallSummaryData?.underTangoReview : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Under tango review</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-3 mb-3\">\r\n <div class=\"card\">\r\n <div class=\"card-header ellipse1 py-1 px-5\">\r\n <div *ngIf=\"getFootfallSummaryData?.ticketAccuracyAbove !== null &&\r\n getFootfallSummaryData?.ticketAccuracyAbove !== undefined\" class=\"my-0\">\r\n <h5 class=\"card-title mt-0\">{{ getFootfallSummaryData?.ticketAccuracyAbove !== null ?\r\n getFootfallSummaryData?.ticketAccuracyAbove : '--' }}</h5>\r\n <div class=\"sub-header\">Tickets with Accuracy Above 85%</div>\r\n </div>\r\n <div *ngIf=\"getFootfallSummaryData?.avgTicket !== null &&\r\n getFootfallSummaryData?.avgTicket !== undefined\" class=\"my-0\">\r\n <h5 class=\"card-title mt-0\">{{ getFootfallSummaryData?.avgTicket !== null ?\r\n getFootfallSummaryData?.avgTicket : '--' }}</h5>\r\n <div class=\"sub-header\">Average ticket %</div>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-2 px-5\">\r\n <div class=\"row\">\r\n <div *ngIf=\"getFootfallSummaryData?.ticketAccuracyBelow !== null &&\r\n getFootfallSummaryData?.ticketAccuracyBelow !== undefined\"\r\n class=\"col-lg-12 col-xl-12 col-md-12 my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.ticketAccuracyBelow !== null ?\r\n getFootfallSummaryData?.ticketAccuracyBelow : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Tickets with Accuracy Below 85%</span>\r\n </div>\r\n <div *ngIf=\"getFootfallSummaryData?.avgAccuracy !== null &&\r\n getFootfallSummaryData?.avgAccuracy !== undefined\" class=\"col-lg-12 col-xl-12 col-md-12 my-3\">\r\n <h5 class=\"card-title\">{{ getFootfallSummaryData?.avgAccuracy !== null ?\r\n getFootfallSummaryData?.avgAccuracy : '--' }}</h5>\r\n <span class=\"card-title-sub-header\">Average accuracy%</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card\">\r\n <div class=\"card-header border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\" *ngIf=\"tangoType==='store'\"><span *ngIf=\"usersDetails?.userType !== 'tango'\">Ticket Info</span> <span *ngIf=\"usersDetails?.userType === 'tango'\">Showing tickets with Accuracy Below 85% </span><span\r\n class=\"ms-2 px-3 badge badge-light-primary\">{{totalItems}} Total</span></span>\r\n <span class=\"card-label mb-2\" *ngIf=\"tangoType==='internal'\">Internal Tickets <span\r\n class=\"ms-2 px-3 badge badge-light-primary\">{{totalItems}} Total</span></span>\r\n <span class=\"text-sub mb-2\">Based on {{headerFilters?.date?.startDate | date:'dd MMM, yyyy'}} \u2013\r\n {{headerFilters?.date?.endDate | date:'dd MMM, yyyy'}} </span>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input type=\"text\" class=\"form-control ps-14 me-2\" placeholder=\"Search by store\"\r\n autocomplete=\"off\" (change)=\"searchData()\" [(ngModel)]=\"searchValue\" />\r\n\r\n <button type=\"button\" (click)=\"exportXLSX()\"\r\n class=\"btn btn-default mx-2 btn-outline btn-outline-default rounded-3 text-nowrap border-val\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-2\">Export</span>\r\n </button>\r\n <button\r\n class=\"btn btn-default btn-primary btn-outline btn-outline-default rounded-3 text-nowrap border-val\"\r\n *ngIf=\"tangoType==='internal'\" (click)=\"createInternalticket()\">Start Audit</button>\r\n <button *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\" [disabled]=\"closeMultiple\" class=\"btn btn-sm btn-primary mx-2 text-nowrap\"\r\n (click)=\"getMultipleTicketClose()\">\r\n Close Ticket\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"table-responsive\" *ngIf=\"!loading && !noData\">\r\n <table class=\"table custom-table bottom-border text-nowrap\">\r\n <thead>\r\n <tr>\r\n <!-- NEW: checkbox column for approver only -->\r\n <th *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"areAllSelectableRowsSelected()\"\r\n (change)=\"toggleSelectAllRows($event)\"\r\n />\r\n </th>\r\n\r\n <th\r\n *ngFor=\"let col of tableColumns\"\r\n [class.cursor-pointer]=\"col.sortable && col.type !== 'store'\"\r\n (click)=\"col.sortable && col.type !== 'store' && onSort(col.key)\"\r\n >\r\n {{ col.label }}\r\n\r\n <!-- Sorting Icon -->\r\n <svg\r\n *ngIf=\"col.sortable && col.type !== 'store'\"\r\n [ngClass]=\"sortedColumn === col.key && sortDirection === 1 ? 'rotate' : ''\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M8 3.333V12.667L12.667 8 8 12.667 3.333 8\"\r\n [attr.stroke]=\"sortedColumn === col.key ? '#00A3FF' : '#667085'\"\r\n stroke-width=\"1.333\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <tr *ngFor=\"let row of footfallListData\">\r\n <!-- NEW: per-row checkbox (approver only) -->\r\n <td *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\">\r\n <input \r\n type=\"checkbox\"\r\n [disabled]=\"!isRowSelectable(row)\" \r\n [checked]=\"isRowSelected(row)\"\r\n [style.cursor]=\"isRowSelectable(row) ? 'pointer' : 'not-allowed text-muted'\"\r\n (change)=\"toggleRowSelection(row, $event)\"\r\n />\r\n </td>\r\n\r\n <td *ngFor=\"let col of tableColumns\">\r\n <!-- Store + ticket clickable -->\r\n <ng-container *ngIf=\"col.type === 'store'\">\r\n <div\r\n class=\"text-primary ellipsis-underline\"\r\n (click)=\"ticketView(row)\"\r\n >\r\n {{ row.ticketId }}\r\n </div>\r\n <div class=\"pt-2\">{{ row.storeName }}</div>\r\n </ng-container>\r\n\r\n <!-- Date -->\r\n <ng-container\r\n class=\"pt-5\"\r\n *ngIf=\"col.type === 'date' || col.type === 'ticketRaised'\"\r\n >\r\n {{ row[col.key] | date: 'dd MMM, yyyy' }}\r\n </ng-container>\r\n\r\n <!-- Status -->\r\n <ng-container class=\"pt-5\" *ngIf=\"col.type === 'status'\">\r\n <span\r\n class=\"badge mx-2\"\r\n [ngClass]=\"getStatusBadgeClass(row[col.key])\"\r\n >\r\n {{ row[col.key] | titlecase }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Default Text -->\r\n <ng-container class=\"pt-5\" *ngIf=\"col.type === 'text'\">\r\n {{ row[col.key] ?? '--' }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n\r\n\r\n </div>\r\n <div *ngIf=\"!loading && !noData\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\"\r\n [paginationSizes]=\"paginationSizes\" [pageSize]=\"setpageSize()\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </div>\r\n <div *ngIf=\"loading\" class=\"card mt-5\">\r\n <div class=\"card-body h-500px\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"noData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n <div class=\"nodata-sub\">There is no result for this conversion funnel</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</section>\r\n<!-- -->\r\n<section *ngIf=\"select ==='ticketMethod'\">\r\n <div class=\"row my-2\">\r\n <div class=\"position-relative\" [ngClass]=\"isCollapsed ? 'd-none' : 'col-md-3 h-auto'\">\r\n <div class=\"card h-100\">\r\n <div class=\"card-header border-0 pt-3 ps-1 pe-5\">\r\n <span class=\"ms-2\"><span class=\"cursor-pointer\" (click)=\"backToNavigation()\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"44\" viewBox=\"0 0 56 44\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_887_4505)\">\r\n <rect x=\"2\" y=\"1\" width=\"52\" height=\"40\" rx=\"8\" fill=\"white\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"51\" height=\"39\" rx=\"7.5\" stroke=\"#D0D5DD\" />\r\n <path d=\"M30.5 26L25.5 21L30.5 16\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_887_4505\" x=\"0\" y=\"0\" width=\"56\" height=\"44\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_887_4505\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_887_4505\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg></span><span class=\"card-title-foot pt-15 ms-3\">Tickets</span></span>\r\n <span class=\"cursor-pointer\" (click)=\"toggleSidebar()\"\r\n style=\"position: absolute; top: 15px; right: -25px;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"68\" height=\"68\" viewBox=\"0 0 68 68\" fill=\"none\">\r\n <g filter=\"url(#filter0_dd_778_34282)\">\r\n <rect x=\"12\" width=\"44\" height=\"44\" rx=\"22\" fill=\"white\" />\r\n <path d=\"M33 27L28 22L33 17M40 27L35 22L40 17\" stroke=\"#101828\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_dd_778_34282\" x=\"0\" y=\"0\" width=\"68\" height=\"68\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feMorphology radius=\"2\" operator=\"erode\" in=\"SourceAlpha\"\r\n result=\"effect1_dropShadow_778_34282\" />\r\n <feOffset dy=\"4\" />\r\n <feGaussianBlur stdDeviation=\"3\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.03 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_778_34282\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\" />\r\n <feMorphology radius=\"4\" operator=\"erode\" in=\"SourceAlpha\"\r\n result=\"effect2_dropShadow_778_34282\" />\r\n <feOffset dy=\"12\" />\r\n <feGaussianBlur stdDeviation=\"8\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.08 0\" />\r\n <feBlend mode=\"normal\" in2=\"effect1_dropShadow_778_34282\"\r\n result=\"effect2_dropShadow_778_34282\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_778_34282\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"p-4 w-100 overflow-auto\">\r\n <div class=\"row my-1\">\r\n <div class=\"col-8\">\r\n\r\n <span class=\"svg-icon svg-icon-1 position-absolute py-2 ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\r\n <path\r\n d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input class=\"form-control form-control-sm mb-2 ps-14 pe-2 w-100\" type=\"text\"\r\n placeholder=\"Search\" [(ngModel)]=\"StoresSearchValue\" (change)=\"searchStoresData()\" />\r\n </div>\r\n <div class=\"col-4 p-0 btn\">\r\n <button class=\"btn-filter btn btn-sm btn-outline\" (click)=\"toggleFilter()\">\r\n <span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n Filter\r\n </button>\r\n\r\n <!-- Overlay (click outside to close) -->\r\n <div class=\"overlay\" *ngIf=\"isFilterOpen\" (click)=\"close()\"></div>\r\n\r\n <form [formGroup]=\"filterForm\">\r\n <!-- Filter card -->\r\n <div class=\"filter-card text-start\" *ngIf=\"isFilterOpen\"\r\n (click)=\"$event.stopPropagation()\">\r\n <h3 class=\"mb-3\">Filter Options</h3>\r\n\r\n <!-- Status -->\r\n <div class=\"mb-3\">\r\n <label class=\"form-label mb-1\">Status</label>\r\n <select class=\"form-select form-select-sm\" formControlName=\"status\">\r\n <option value=\"\">Select</option>\r\n <option>Open</option>\r\n <option>In-Progress</option>\r\n <option>Close</option>\r\n <option>Under tango review</option>\r\n <option>Tango review done</option>\r\n <option>Expired</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Reviewer accuracy -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-9\">\r\n <!-- label in same row -->\r\n <label class=\"form-label mb-0 fs-8 reviewer-label\">\r\n Reviewer accuracy (%) by condition\r\n </label>\r\n\r\n <!-- condition dropdown -->\r\n <select class=\"form-select form-select-sm reviewer-select\"\r\n formControlName=\"reviewerCondition\">\r\n <option value=\"\">Select</option>\r\n <option>>= Greater than or equal to</option>\r\n <option>\r\n < Less than</option>\r\n <option>> Greater than</option>\r\n <option>\r\n <= Lesser than or equal to</option>\r\n <option>Between</option>\r\n </select>\r\n </div>\r\n <!-- single value -->\r\n <div class=\"col-3\">\r\n <!-- <ng-container *ngIf=\"filterForm.value.reviewerCondition !== 'Between'; else betweenTpl\"> -->\r\n <label class=\"small ms-1\">% </label>\r\n <input type=\"number\"\r\n class=\"form-control form-control-sm reviewer-input text-end\"\r\n formControlName=\"reviewerValue\" min=\"1\" max=\"100\">\r\n <!-- </ng-container> -->\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n <!-- TODO: same block for Approver & Tango -->\r\n <!-- Reviewer accuracy -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-9\">\r\n <!-- label in same row -->\r\n <label class=\"form-label mb-0 fs-8 reviewer-label\">\r\n Approver accuracy (%) by condition\r\n </label>\r\n\r\n <!-- condition dropdown -->\r\n <select class=\"form-select form-select-sm reviewer-select\"\r\n formControlName=\"reviewerCondition\">\r\n <option value=\"\">Select</option>\r\n <option>>= Greater than or equal to</option>\r\n <option>\r\n < Less than</option>\r\n <option>> Greater than</option>\r\n <option>\r\n <= Lesser than or equal to</option>\r\n <option>Between</option>\r\n </select>\r\n </div>\r\n <!-- single value -->\r\n <div class=\"col-3\">\r\n <!-- <ng-container *ngIf=\"filterForm.value.reviewerCondition !== 'Between'; else betweenTpl\"> -->\r\n <label class=\"small ms-1\">% </label>\r\n <input type=\"number\"\r\n class=\"form-control form-control-sm reviewer-input text-end\"\r\n formControlName=\"reviewerValue\" min=\"1\" max=\"100\">\r\n <!-- </ng-container> -->\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n <!-- Reviewer accuracy -->\r\n <div class=\"row mb-3\">\r\n <div class=\"col-9\">\r\n <!-- label in same row -->\r\n <label class=\"form-label mb-0 fs-8 reviewer-label\">\r\n Tango accuracy (%) by condition\r\n </label>\r\n\r\n <!-- condition dropdown -->\r\n <select class=\"form-select form-select-sm reviewer-select\"\r\n formControlName=\"reviewerCondition\">\r\n <option value=\"\">Select</option>\r\n <option>>= Greater than or equal to</option>\r\n <option>\r\n < Less than</option>\r\n <option>> Greater than</option>\r\n <option>\r\n <= Lesser than or equal to</option>\r\n <option>Between</option>\r\n </select>\r\n </div>\r\n <!-- single value -->\r\n <div class=\"col-3\">\r\n <!-- <ng-container *ngIf=\"filterForm.value.reviewerCondition !== 'Between'; else betweenTpl\"> -->\r\n <label class=\"small ms-1\">% </label>\r\n <input type=\"number\"\r\n class=\"form-control form-control-sm reviewer-input text-end\"\r\n formControlName=\"reviewerValue\" min=\"1\" max=\"100\">\r\n <!-- </ng-container> -->\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-end gap-2 mt-3\">\r\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\"\r\n (click)=\"resetFilter()\">Reset</button>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\"\r\n (click)=\"applyFilter()\">Apply</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"text-end text-nowrp ms-3 mt-2\">\r\n <button *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\" [disabled]=\"closeMultiple\" class=\"btn btn-sm btn-primary mx-2\"\r\n (click)=\"getMultipleTicketClose()\">\r\n Close Ticket\r\n </button>\r\n </div>\r\n \r\n </div>\r\n\r\n <div *ngIf=\"openTicketsList.length\" class=\"mb-2 border-selectall\">\r\n <div class=\"d-flex justify-content-between align-items-center w-100\">\r\n\r\n <!-- LEFT: checkbox + text -->\r\n <div class=\"d-flex align-items-center\">\r\n <input *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\" type=\"checkbox\" class=\"me-2\" [checked]=\"allSelected\"\r\n (change)=\"toggleSelectAll()\" />\r\n <label class=\"m-0 font-semibold\">\r\n Select <span *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\">all {{ storeCount }}</span> stores\r\n </label>\r\n </div>\r\n\r\n <!-- RIGHT: Reviewer(%) + optional sort icon -->\r\n <div class=\"d-flex align-items-center reviewer-label\">\r\n <span class=\"me-1\">Reviewer(%)</span>\r\n <!-- if you want arrow icon -->\r\n <span class=\"sort-arrow cursor-pointer\"><svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path\r\n d=\"M6.83464 1L6.83463 12.6667M6.83463 12.6667L12.668 6.83333M6.83463 12.6667L1.0013 6.83333\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <!-- or use an <i> from font-awesome/bootstrap icon instead -->\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <ul class=\"list-unstyled ps-0\">\r\n <li *ngFor=\"let store of openTicketsList\" class=\"mb-2\"\r\n [ngClass]=\"{ 'store-item-active': isSelected(store), 'store-item': true }\">\r\n\r\n <div class=\"d-flex justify-content-between align-items-center w-100\">\r\n <!-- LEFT: checkbox + text -->\r\n <div class=\"d-flex align-items-start\">\r\n <input *ngIf=\"usersDetails.userType !=='tango' && (hasApproverAccess && selectedRole ==='approver')\" type=\"checkbox\" class=\"me-2 my-3\" [checked]=\"isSelected(store)\"\r\n (change)=\"toggleStoreSelection(store)\" />\r\n\r\n <div class=\"store-text ms-1 cursor-pointer\" (click)=\"ticketViewChanges(store)\">\r\n <div class=\"ticket-id\" [ngClass]=\"{ 'active-text': isSelected(store) }\">\r\n {{ store?.ticketId }}\r\n </div>\r\n <div class=\"store-name mt-1\">\r\n {{ store?.storeName }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- RIGHT: pill badge -->\r\n <span\r\n class=\"ms-2 px-3 py-1 rounded-pill d-inline-flex align-items-center justify-content-center perc-badge\"\r\n [ngClass]=\"{\r\n 'perc-badge-active': isSelected(store),\r\n 'perc-badge-normal': !isSelected(store)\r\n }\">\r\n {{ store?.revicedPerc }}\r\n </span>\r\n </div>\r\n </li>\r\n\r\n </ul>\r\n\r\n\r\n\r\n <div *ngIf=\"!openTicketsList.length\" class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n\r\n <div class=\"card-body mx-0 d-flex justify-content-center align-items-center flex-column \"\r\n style=\"margin: 64px;border-radius: 8px;\r\n background: var(--Gray-50, #F9FAFB);\">\r\n <svg class=\"my-5\" xmlns=\"http://www.w3.org/2000/svg\" width=\"94\" height=\"94\"\r\n viewBox=\"0 0 94 94\" fill=\"none\">\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" fill=\"#DAF1FF\" />\r\n <rect x=\"7\" y=\"7\" width=\"80\" height=\"80\" rx=\"40\" stroke=\"#EAF8FF\"\r\n stroke-width=\"13.3333\" />\r\n <g clip-path=\"url(#clip0_730_75095)\">\r\n <path\r\n d=\"M55.3327 62V58.6667C55.3327 56.8986 54.6303 55.2029 53.3801 53.9526C52.1298 52.7024 50.4341 52 48.666 52H35.3327C33.5646 52 31.8689 52.7024 30.6186 53.9526C29.3684 55.2029 28.666 56.8986 28.666 58.6667V62M65.3327 62V58.6667C65.3316 57.1895 64.8399 55.7546 63.935 54.5872C63.03 53.4198 61.7629 52.5859 60.3327 52.2167M53.666 32.2167C55.1 32.5838 56.3711 33.4178 57.2787 34.5872C58.1864 35.7565 58.6791 37.1947 58.6791 38.675C58.6791 40.1553 58.1864 41.5935 57.2787 42.7628C56.3711 43.9322 55.1 44.7662 53.666 45.1333M48.666 38.6667C48.666 42.3486 45.6812 45.3333 41.9993 45.3333C38.3174 45.3333 35.3327 42.3486 35.3327 38.6667C35.3327 34.9848 38.3174 32 41.9993 32C45.6812 32 48.666 34.9848 48.666 38.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"4\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_75095\">\r\n <rect width=\"40\" height=\"40\" fill=\"white\" transform=\"translate(27 27)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <div class=\"nodata-title my-3\">No Stores Found</div>\r\n <div class=\"nodata-sub mb-3\">Looks like there is no stores </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div [ngClass]=\"isCollapsed ? 'col-12' : 'col-md-9'\">\r\n <div class=\"card bg-light-primary p-1 h-100\">\r\n <div class=\"card-header border-0 pt-3 px-5\">\r\n <div class=\"d-flex justify-content-start\">\r\n <div *ngIf=\"isCollapsed\" class=\"cursor-pointer\"><span (click)=\"toggleSidebar()\"\r\n style=\"position: absolute; top: 10px; left: 10px;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\"\r\n fill=\"none\">\r\n <path d=\"M22.5 25L17.5 20L22.5 15\" stroke=\"#667085\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> </span>\r\n <span class=\"card-title-foot ms-15\">Footfall Directory</span>\r\n </div>\r\n </div>\r\n <div class=\"card-toolbar\">\r\n <!-- Start Review -->\r\n \r\n <span *ngIf=\"statusVal?.type !== 'tangoreview' && (ticketData?.status === 'Raised' || getHeaderStatus() === 'Open')\">\r\n \r\n <button *ngIf=\"!closeBtn\" class=\"btn btn-sm btn-primary mx-2\" (click)=\"startReview()\">\r\n Start Review\r\n </button>\r\n </span>\r\n <section *ngIf=\"ticketData?.ReviewedBy === usersDetails?.email \r\n || ticketData?.approvedBy === usersDetails?.email\">\r\n \r\n <!-- Close Ticket -->\r\n <span *ngIf=\"ticketData?.status === 'In-Progress'\">\r\n \r\n <button *ngIf=\"closeBtn\" [disabled]=\"closeDisabled\" class=\"btn btn-sm btn-primary mx-2\"\r\n (click)=\"stopReview()\">\r\n Close Ticket\r\n </button>\r\n </span>\r\n </section>\r\n\r\n\r\n <span\r\n *ngIf=\"usersDetails?.userType ==='tango' && statusVal?.type === 'tangoreview' && statusVal?.status ==='Open'||usersDetails?.userType ==='tango'&&ticketData?.type === 'internal'\"><button\r\n class=\"btn btn-sm btn-primary mx-2\" (click)=\"startAudit()\">Start\r\n Audit</button></span>\r\n <span>\r\n <span class=\"ticket-actions-wrapper\" (click)=\"$event.stopPropagation()\">\r\n\r\n <span class=\"icon-btn\" (click)=\"toggleTicketMenu($event)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path\r\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5C11 5.55228 11.4477 6 12 6Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19C11 19.5523 11.4477 20 12 20Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"ticket-menu\" *ngIf=\"isTicketMenuOpen\">\r\n <div class=\"ticket-menu-item\" (click)=\"onReassignClick()\">\r\n Re-Assign Ticket\r\n </div>\r\n <!-- <div class=\"ticket-menu-item\" (click)=\"onExportClick()\">\r\n Export\r\n </div> -->\r\n </div>\r\n </span>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-4 \">\r\n <div class=\"row mb-6\">\r\n\r\n <div class=\"col-2 card-title-label my-2\">Store Name</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">{{footfallTicketsData[0]?._source?.storeName}}</div>\r\n <div class=\"col-2 card-title-label my-2\">Ticket ID</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">{{footfallTicketsData[0]?._source?.ticketId}}</div>\r\n <div class=\"col-2 card-title-label my-2\">Status</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n\r\n <div class=\"col-3 my-2\"> <span class=\"badge mx-2\"\r\n [ngClass]=\"getStatusBadgeClass(getHeaderStatus())\">\r\n {{ getHeaderStatus() | titlecase }}\r\n </span></div>\r\n\r\n <div class=\"col-2 card-title-label my-2\">Due Date</div>\r\n <div class=\"col-1 font-bold my-2\">:</div>\r\n <div class=\"col-3 card-title-value my-2\">06 Dec 2025</div>\r\n </div>\r\n\r\n\r\n\r\n <div class=\"card-layer\">\r\n <div class=\"d-flex justify-content-between align-items-start w-100\">\r\n\r\n <!-- LEFT SIDE -->\r\n <h3 class=\"card-title align-items-start flex-column mb-0\">\r\n <div class=\"card-label\">Ticket Status</div>\r\n <div class=\"text-sub mb-2\">Logs for each revision of the ticket.</div>\r\n </h3>\r\n\r\n <!-- RIGHT SIDE -->\r\n <div class=\"cursor-pointer\">\r\n <span (click)=\"openArrow()\"> <svg *ngIf=\"arrowshow\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_486_91902)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\" />\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\" />\r\n <path d=\"M15 16.5L20 21.5L25 16.5\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_486_91902\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_486_91902\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_486_91902\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg></span>\r\n <span (click)=\"openArrow()\">\r\n <svg *ngIf=\"!arrowshow\" xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\"\r\n fill=\"none\">\r\n <g filter=\"url(#filter0_d_486_91893)\">\r\n <rect x=\"38\" y=\"37\" width=\"36\" height=\"36\" rx=\"8\"\r\n transform=\"rotate(180 38 37)\" fill=\"white\" />\r\n <rect x=\"37.5\" y=\"36.5\" width=\"35\" height=\"35\" rx=\"7.5\"\r\n transform=\"rotate(180 37.5 36.5)\" stroke=\"#D0D5DD\" />\r\n <path d=\"M25 21.5L20 16.5L15 21.5\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_486_91893\" x=\"0\" y=\"0\" width=\"40\" height=\"40\"\r\n filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"1\" />\r\n <feGaussianBlur stdDeviation=\"1\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_486_91893\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_486_91893\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n <section *ngIf=\"!arrowshow\">\r\n \r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n \r\n <div *ngIf=\"ticket?._source as source\" class=\"ticket-container\">\r\n \r\n <!-- Actual Footfall Header -->\r\n <div class=\"ticket-header\">\r\n <div class=\"footfall-value\">{{source?.footfallCount}} <span class=\"footfall-label ms-3\">Actual\r\n Footfall</span>\r\n </div>\r\n <div class=\"issue-date\">Issue date : {{source?.createdAt | date:'dd MMM yyyy'}}\r\n </div>\r\n </div>\r\n \r\n <!-- Timeline Line -->\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n \r\n <!-- When ticket is CLOSED, skip the tagging row -->\r\n <ng-container *ngIf=\"mapping?.status === 'Closed' \r\n && ['tagging','review','approve','tangoreview'].includes(mapping?.type)\">\r\n \r\n <div class=\"timeline\"></div>\r\n <div class=\"user-info ms-4\">\r\n \r\n <div class=\"avatar avatar-text light-primary p-3\">\r\n {{ getInitialsFromEmail(mapping?.createdByEmail ||\r\n source?.createdByEmail) }}\r\n </div>\r\n \r\n <div>\r\n <div class=\"user-name\">\r\n <span *ngIf=\"mapping?.type === 'tagging'\">\r\n Ticket created by\r\n </span>\r\n <span *ngIf=\"mapping?.type === 'review'\">\r\n Reviewed by\r\n </span>\r\n <span *ngIf=\"mapping?.type === 'approve'\">\r\n Approved by\r\n </span>\r\n \r\n <span *ngIf=\"mapping?.type === 'tangoreview'\">\r\n Tango\r\n </span>\r\n </div>\r\n \r\n <div class=\"user-email\">\r\n {{ mapping?.createdByEmail || source?.createdByEmail }} {{(mapping?.createdAt ||\r\n source?.createdAt)\r\n | date:'HH:mm:ss \u2013dd MMM yyyy' }}\r\n </div>\r\n </div>\r\n \r\n </div>\r\n \r\n \r\n <div class=\"timeline\"></div>\r\n \r\n <!-- Show revision card only when NOT closed & type is tagging -->\r\n <div class=\"revision-card\"\r\n [ngClass]=\"{'revision-card-approve-closed':mapping?.status === 'Closed' && (mapping?.type === 'approve' || mapping?.type === 'tangoreview'),}\">\r\n <div class=\"values-row\">\r\n <div class=\"value-block\">\r\n <div class=\"value\">\r\n {{ mapping?.revicedFootfall === null ? '--' :\r\n mapping?.revicedFootfall }}\r\n </div>\r\n <div class=\"label fw-bold\">Revised Footfall</div>\r\n </div>\r\n \r\n <div class=\"value-block\">\r\n <div class=\"value accuracy down\">\r\n {{ mapping?.revicedPerc || source?.revicedPerc || '--' }}\r\n <span class=\"ms-1\">\r\n <!-- arrow svg -->\r\n </span>\r\n </div>\r\n <div class=\"label fw-bold pt-1\">Accuracy</div>\r\n </div>\r\n \r\n <div class=\"timeline-new my-2\"></div>\r\n \r\n <div class=\"value-block\" *ngFor=\"let item of mapping?.count\">\r\n <div class=\"value\">\r\n {{ item?.value ?? '--' }}\r\n </div>\r\n <div class=\"label\">\r\n {{ item?.name }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n </ng-container>\r\n \r\n <div *ngIf=\"mapping?.status === 'Closed' && ['approve'].includes(mapping?.type)\"\r\n class=\"card-footer revision-card-approve py-1 bg-light-primary\">\r\n <div *ngIf=\"!showApproveDetails\"\r\n class=\"details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2\"\r\n (click)=\"toggleRevisedDetails(mapping)\">\r\n <span class=\"text-primary \">\r\n Show in details\r\n </span>\r\n <span class=\"chevron ms-3 cursor-pointer\" [class.rotate-180]=\"showRevisedDetails\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M18 9L12 15L6 9\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span *ngIf=\"showApproveDetails\" class=\"chevron ms-3 cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M6 15L12 9L18 15\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n \r\n <div class=\"details-body mt-2\" *ngIf=\"showApproveDetails\">\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n <div *ngIf=\"ticket?._source as source\" class=\"my-5\">\r\n<ng-container *ngFor=\"let type of revopsTypes\">\r\n<section *ngIf=\"type ==='duplicate'\">\r\n\r\n <div *ngIf=\"hasRevopsType(type)\" class=\"layers\">\r\n <!-- Header Section -->\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <h3 class=\"text-lg font-semibold mb-4\">\r\n <span class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_730_76157)\">\r\n <path\r\n d=\"M3.75 11.25H3C2.60218 11.25 2.22064 11.092 1.93934 10.8107C1.65804 10.5294 1.5 10.1478 1.5 9.75V3C1.5 2.60218 1.65804 2.22064 1.93934 1.93934C2.22064 1.65804 2.60218 1.5 3 1.5H9.75C10.1478 1.5 10.5294 1.65804 10.8107 1.93934C11.092 2.22064 11.25 2.60218 11.25 3V3.75M8.25 6.75H15C15.8284 6.75 16.5 7.42157 16.5 8.25V15C16.5 15.8284 15.8284 16.5 15 16.5H8.25C7.42157 16.5 6.75 15.8284 6.75 15V8.25C6.75 7.42157 7.42157 6.75 8.25 6.75Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_76157\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n Duplicates\r\n </h3>\r\n </div>\r\n\r\n\r\n <!-- Body Section -->\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <ng-container *ngIf=\"mapping?.type ===viewMode\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n <div *ngIf=\"original?.isParent && original?.revopsType ==='duplicate'\"\r\n class=\"card-body bg-white layers py-5 px-0 m-3\">\r\n <div class=\"my-4\">\r\n <!-- Original Image -->\r\n <div class=\"duplicate-head px-5 my-3\">Original image\r\n </div>\r\n <div class=\"row px-5\">\r\n <div class=\"col-md-4 relative\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3\">\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"separator separator-dashed mt-3 mb-5\"></div>\r\n <div class=\"row px-5\">\r\n <h5 class=\"duplicate-head my-3 fs-6\">Tagged Duplicates</h5>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"my-3\">\r\n <input type=\"checkbox\" [checked]=\"areAllDuplicatesSelected(original)\"\r\n (change)=\"onToggleSelectAllDuplicates(original, $event)\" />\r\n <label class=\"ms-2\">Select All</label>\r\n </div>\r\n <div *ngFor=\"let duplicate of original?.duplicateImage; let i = index\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n 'layer-approved': isApproved(duplicate),\r\n 'layer-rejected': isRejected(duplicate),\r\n 'img-border border border-1': !isApproved(duplicate) && !isRejected(duplicate)}\">\r\n <!-- Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n <input type=\"checkbox\" *ngIf=\"!isLockedByReviewer(duplicate)\"\r\n style=\"right: 5px ; margin: 10px 5px 4px !important;\"\r\n [checked]=\"isDuplicateSelected(original.tempId, duplicate.tempId)\"\r\n (change)=\"onDuplicateCheckboxChange(original.tempId, duplicate.tempId, $event)\"\r\n class=\"position-absolute form-check-input duplicate-checkbox\" />\r\n <span class=\"position-absolute absolute\" \r\n *ngIf=\"isLockedByReviewer(duplicate)\"\r\n (click)=\"resetCheckbox('duplicate', duplicate)\">\r\n\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\"\r\n viewBox=\"0 0 19 19\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_2023_13718)\">\r\n <rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\"\r\n rx=\"2\" fill=\"white\" />\r\n <rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\"\r\n height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\"\r\n stroke-width=\"0.555556\" />\r\n <path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\"\r\n stroke-width=\"0.927778\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_2023_13718\" x=\"0.00021708\"\r\n y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\"\r\n filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\"\r\n result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"0.555556\" />\r\n <feGaussianBlur stdDeviation=\"0.555556\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_2023_13718\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_2023_13718\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n\r\n </span>\r\n </div>\r\n <!-- (change)=\"onImageCheckboxChange(duplicate.tempId, 'duplicate', 'original')\" -->\r\n <!-- Duplicate Image -->\r\n <img [src]=\"imageUrl + duplicate.filePath\" alt=\"\"\r\n (click)=\"openImagePreview(mapping,original.duplicateImage, i, 'Tagged Duplicates')\"\r\n class=\"w-100 rounded border duplicate-image cursor-pointer\" />\r\n\r\n <!-- Duplicate Info -->\r\n <div class=\"row my-2\">\r\n <div class=\"col-9\">\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ duplicate.tempId }}\r\n\r\n <span\r\n *ngIf=\"getAction(duplicate, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(duplicate, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n\r\n </div>\r\n\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(duplicate.entryTime)\r\n }}\r\n </div>\r\n </div>\r\n <div class=\"col-3\">\r\n <span\r\n *ngIf=\"getAction(duplicate, 'approve')?.action === 'approved'\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"37\"\r\n height=\"37\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n </span>\r\n <span\r\n *ngIf=\"getAction(duplicate, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"37\"\r\n height=\"37\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg> </span>\r\n </div>\r\n </div>\r\n <!-- Duplicate Reason -->\r\n <!-- <div class=\"duplicate-reason ms-2 mt-2\">\r\n <small class=\"text-muted\">{{ duplicate.reason }}</small>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n \r\n <!-- Accordion Body -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n \r\n <!-- Loop each block: tagging / review / approve -->\r\n <ng-container *ngFor=\"let block of activityData\">\r\n \r\n <!-- Loop inside comments -->\r\n <div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n \r\n <!-- avatar -->\r\n <div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n <div class=\"w-100\">\r\n \r\n <!-- email -->\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n \r\n <!-- message text -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n \r\n <!-- Review / Approve only -->\r\n <ng-container *ngIf=\"block.type === 'review' || block.type === 'approve'\">\r\n <!-- Tagged images -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n \r\n <div *ngFor=\"let img of c.taggedImages; let i = index\">\r\n \r\n <!-- Show only first 4 -->\r\n <ng-container *ngIf=\"i < 3\">\r\n <div class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url('+ imageUrl + img.filePath + ')'\"></div>\r\n \r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n \r\n <!-- status dots -->\r\n <span *ngIf=\"c.status === 'approved'\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg></span>\r\n \r\n <span *ngIf=\"c.status === 'rejected'\"\r\n ><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n \r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n \r\n <!-- +N more -->\r\n <div\r\n class=\"tango-card more-card text-center\"\r\n *ngIf=\"c.taggedImages.length > 3\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.taggedImages[3].filePath + ')'\"\r\n (click)=\"openImagesPopup(c)\"\r\n >\r\n <div class=\"more-overlay\"></div>\r\n \r\n <!-- vertical container -->\r\n <div class=\"more-wrapper my-10 d-flex flex-column align-items-center justify-content-center\">\r\n <div class=\"more-text fw-semibold\">+{{ c.taggedImages.length - 3 }}</div>\r\n <div class=\"text-primary text-dark text-decoration-underline small\">\r\n View all\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n \r\n </div>\r\n \r\n </ng-container>\r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n \r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n <!-- Status Icons -->\r\n\r\n\r\n </div>\r\n</section>\r\n<section *ngIf=\"type !=='duplicate'\">\r\n <div class=\"layers my-2\" *ngIf=\"hasRevopsType(type)\">\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <div class=\"duplicate-head text-lg my-3\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.51995 0.613065C8.33739 -0.204355 9.66267 -0.204355 10.4801 0.613065L17.387 7.51995C18.2043 8.33739 18.2043 9.66267 17.387 10.4801L10.4801 17.387C9.66267 18.2043 8.33739 18.2043 7.51995 17.387L5.54626 15.4133L3.73708 17.2224C2.91966 18.0399 1.59436 18.0399 0.776944 17.2224C-0.0404767 16.4051 -0.0404767 15.0797 0.776944 14.2624L2.58612 12.4531L0.613065 10.4801C-0.204355 9.66267 -0.204355 8.33739 0.613065 7.51995L7.51995 0.613065ZM9.49336 1.59978C9.22088 1.32731 8.77909 1.32731 8.50661 1.59978L3.57286 6.53357L11.4665 14.4272L16.4002 9.49336C16.6727 9.22088 16.6727 8.77909 16.4002 8.5067L12.9465 5.05286L11.7952 6.20403C11.5228 6.4765 11.0811 6.4765 10.8086 6.20403C10.5361 5.93155 10.5361 5.48978 10.8086 5.21731L11.9597 4.06614L10.9732 3.07964L8.17757 5.87533C7.90509 6.1478 7.46329 6.1478 7.19081 5.87533C6.91833 5.60286 6.91833 5.16109 7.19081 4.88862L9.9865 2.09293L9.49336 1.59978ZM10.4797 15.4139L2.58615 7.52028L1.59978 8.5067C1.3273 8.77909 1.3273 9.22088 1.59978 9.49336L8.50661 16.4002C8.77909 16.6727 9.22088 16.6727 9.49336 16.4002L10.4797 15.4139ZM3.57275 13.4399L1.76366 15.249C1.49119 15.5215 1.49119 15.9633 1.76366 16.2358C2.03613 16.5082 2.4779 16.5082 2.75037 16.2358L4.55946 14.4266L3.57275 13.4399Z\"\r\n fill=\"#475467\" />\r\n </svg></span> {{type}}\r\n\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"ms-3 my-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"selectAllByType[type]\"\r\n (change)=\"onSelectAll(type, $event)\">\r\n <label>Select All</label>\r\n </div>\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <div *ngIf=\"mapping?.type ===viewMode\" class=\"card-body bg-white layers p-5 m-3\">\r\n\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail;let i=index\">\r\n <div *ngIf=\"original?.revopsType ===type\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n'layer-approved': isApproved(original),\r\n'layer-rejected': isRejected(original),\r\n'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n\r\n\r\n <!-- Top-right Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n\r\n <input *ngIf=\"!isLockedByReviewer(original)\" type=\"checkbox\"\r\n class=\"position-absolute absolute form-check-input\"\r\n [checked]=\"(selectedByType[type] || []).includes(original?.tempId)\"\r\n (change)=\"onImageCheckboxChange(type, original.tempId)\" />\r\n <span class=\"position-absolute absolute\" \r\n *ngIf=\"isLockedByReviewer(original)\"\r\n (click)=\"resetCheckbox(type, original)\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\"\r\n viewBox=\"0 0 19 19\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_2023_13718)\">\r\n <rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\"\r\n fill=\"white\" />\r\n <rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\"\r\n rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\" />\r\n <path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\"\r\n stroke-width=\"0.927778\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\"\r\n width=\"18.2222\" height=\"18.2222\"\r\n filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"0.555556\" />\r\n <feGaussianBlur stdDeviation=\"0.555556\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_2023_13718\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_2023_13718\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\" (click)=\"openImagePreview(mapping,original, i, selectedByType[type])\"\r\n class=\"w-100 rounded border cursor-pointer\" />\r\n <div class=\"row my-2\">\r\n <div class=\"col-9\">\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}\r\n <span *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\nheight: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(original, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\nheight: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n <div class=\"col-3 ms-3\">\r\n <span *ngIf=\"getAction(original, 'approve')?.action === 'approved'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"37\" height=\"37\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(original, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"37\" height=\"37\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <div class=\"comments-title\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n\r\n </div>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Content -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n\r\n<!-- loop each block: tagging / review / approve -->\r\n<ng-container *ngFor=\"let block of activityData1\">\r\n\r\n<!-- TAGGING COMMENTS (each comment = one image + message) -->\r\n<ng-container *ngIf=\"block.type === 'tagging'\">\r\n<div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n\r\n<!-- avatar -->\r\n<div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n\r\n<!-- content -->\r\n<div>\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n\r\n <!-- single image card -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div class=\"tango-card\" *ngIf=\"c.filePath\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.filePath + ')'\">\r\n </div>\r\n\r\n <div class=\"tango-meta small\">\r\n <div>Tango ID: {{ c.tempId }}</div>\r\n <div class=\"text-muted\">Entry time: {{ c.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n</ng-container>\r\n\r\n<!-- REVIEW / APPROVE COMMENTS (with taggedImages + +N View all) -->\r\n<ng-container *ngIf=\"block.type === 'review' || block.type === 'approve'\">\r\n<div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n\r\n<!-- avatar -->\r\n<div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n\r\n<!-- content -->\r\n<div class=\"w-100\">\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- main review/approve message -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n\r\n \r\n\r\n <!-- image list + +N View all -->\r\n <div class=\"d-flex gap-2 flex-wrap\" *ngIf=\"c.taggedImages?.length\">\r\n\r\n <!-- first 3 images -->\r\n <div *ngFor=\"let img of c.taggedImages; let i = index\">\r\n <ng-container *ngIf=\"i < 3\">\r\n <div class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + img.filePath + ')'\">\r\n </div>\r\n\r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n <span *ngIf=\"c.status === 'approved'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"c.status === 'rejected'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- +N View all card -->\r\n <div\r\n class=\"tango-card more-card text-center\"\r\n *ngIf=\"c.taggedImages.length > 3\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.taggedImages[3].filePath + ')'\"\r\n (click)=\"openImagesPopup(c)\"\r\n >\r\n <div class=\"more-overlay\"></div>\r\n\r\n <div class=\"more-wrapper d-flex flex-column align-items-center justify-content-center\">\r\n <div class=\"more-text fw-semibold\">\r\n +{{ c.taggedImages.length - 3 }}\r\n </div>\r\n <div class=\"text-primary text-decoration-underline small\">\r\n View all\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n</div>\r\n</ng-container>\r\n\r\n</ng-container>\r\n</div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n</ng-container>\r\n \r\n\r\n\r\n </div>\r\n </ng-container>\r\n </div>\r\n \r\n \r\n <div *ngIf=\"showApproveDetails\"\r\n class=\"details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2\"\r\n (click)=\"toggleRevisedDetails(mapping)\">\r\n <span class=\"text-primary \">\r\n Show in details\r\n </span>\r\n \r\n <span *ngIf=\"showApproveDetails\" class=\"chevron ms-3 cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M6 15L12 9L18 15\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n \r\n \r\n <div *ngIf=\"mapping?.status === 'Closed' && ['tangoreview'].includes(mapping?.type)\"\r\n class=\"card-footer revision-card-approve py-1 bg-light-primary\">\r\n <div *ngIf=\"!showTangoDetails\"\r\n class=\"details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2\"\r\n (click)=\"toggleRevisedDetails(mapping)\">\r\n <span class=\"text-primary \">\r\n Show in details\r\n </span>\r\n <span class=\"chevron ms-3 cursor-pointer\" [class.rotate-180]=\"showRevisedDetails\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M18 9L12 15L6 9\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n \r\n </div>\r\n \r\n <div class=\"details-body mt-2\" *ngIf=\"showTangoDetails\">\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n <div *ngIf=\"ticket?._source as source\" class=\"my-5\">\r\n<ng-container *ngFor=\"let type of revopsTypes\">\r\n<section *ngIf=\"type ==='duplicate'\">\r\n\r\n <div *ngIf=\"hasRevopsType(type)\" class=\"layers\">\r\n <!-- Header Section -->\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <h3 class=\"text-lg font-semibold mb-4\">\r\n <span class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_730_76157)\">\r\n <path\r\n d=\"M3.75 11.25H3C2.60218 11.25 2.22064 11.092 1.93934 10.8107C1.65804 10.5294 1.5 10.1478 1.5 9.75V3C1.5 2.60218 1.65804 2.22064 1.93934 1.93934C2.22064 1.65804 2.60218 1.5 3 1.5H9.75C10.1478 1.5 10.5294 1.65804 10.8107 1.93934C11.092 2.22064 11.25 2.60218 11.25 3V3.75M8.25 6.75H15C15.8284 6.75 16.5 7.42157 16.5 8.25V15C16.5 15.8284 15.8284 16.5 15 16.5H8.25C7.42157 16.5 6.75 15.8284 6.75 15V8.25C6.75 7.42157 7.42157 6.75 8.25 6.75Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_76157\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n Duplicates\r\n </h3>\r\n </div>\r\n\r\n\r\n <!-- Body Section -->\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <ng-container *ngIf=\"mapping?.type ===viewMode\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n <div *ngIf=\"original?.isParent && original?.revopsType ==='duplicate'\"\r\n class=\"card-body bg-white layers py-5 px-0 m-3\">\r\n <div class=\"my-4\">\r\n <!-- Original Image -->\r\n <div class=\"duplicate-head px-5 my-3\">Original image\r\n </div>\r\n <div class=\"row px-5\">\r\n <div class=\"col-md-4 relative\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3\">\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"separator separator-dashed mt-3 mb-5\"></div>\r\n <div class=\"row px-5\">\r\n <h5 class=\"duplicate-head my-3 fs-6\">Tagged Duplicates</h5>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"my-3\">\r\n <input type=\"checkbox\" [checked]=\"areAllDuplicatesSelected(original)\"\r\n (change)=\"onToggleSelectAllDuplicates(original, $event)\" />\r\n <label class=\"ms-2\">Select All</label>\r\n </div>\r\n <div *ngFor=\"let duplicate of original?.duplicateImage; let i = index\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n 'layer-approved': isApproved(duplicate),\r\n 'layer-rejected': isRejected(duplicate),\r\n 'img-border border border-1': !isApproved(duplicate) && !isRejected(duplicate)}\">\r\n <!-- Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n <input type=\"checkbox\" *ngIf=\"!isLockedByReviewer(duplicate)\"\r\n style=\"right: 5px ; margin: 10px 5px 4px !important;\"\r\n [checked]=\"isDuplicateSelected(original.tempId, duplicate.tempId)\"\r\n (change)=\"onDuplicateCheckboxChange(original.tempId, duplicate.tempId, $event)\"\r\n class=\"position-absolute form-check-input duplicate-checkbox\" />\r\n <span class=\"position-absolute absolute\" \r\n *ngIf=\"isLockedByReviewer(duplicate)\"\r\n (click)=\"resetCheckbox('duplicate', duplicate)\">\r\n\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\"\r\n viewBox=\"0 0 19 19\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_2023_13718)\">\r\n <rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\"\r\n rx=\"2\" fill=\"white\" />\r\n <rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\"\r\n height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\"\r\n stroke-width=\"0.555556\" />\r\n <path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\"\r\n stroke-width=\"0.927778\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_2023_13718\" x=\"0.00021708\"\r\n y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\"\r\n filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\"\r\n result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"0.555556\" />\r\n <feGaussianBlur stdDeviation=\"0.555556\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_2023_13718\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_2023_13718\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n\r\n </span>\r\n </div>\r\n <!-- (change)=\"onImageCheckboxChange(duplicate.tempId, 'duplicate', 'original')\" -->\r\n <!-- Duplicate Image -->\r\n <img [src]=\"imageUrl + duplicate.filePath\" alt=\"\"\r\n (click)=\"openImagePreview(mapping,original.duplicateImage, i, 'Tagged Duplicates')\"\r\n class=\"w-100 rounded border duplicate-image cursor-pointer\" />\r\n\r\n <!-- Duplicate Info -->\r\n <div class=\"row my-2\">\r\n <div class=\"col-9\">\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ duplicate.tempId }}\r\n\r\n <span\r\n *ngIf=\"getAction(duplicate, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(duplicate, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n\r\n </div>\r\n\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(duplicate.entryTime)\r\n }}\r\n </div>\r\n </div>\r\n <div class=\"col-3\">\r\n <span\r\n *ngIf=\"getAction(duplicate, 'approve')?.action === 'approved'\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"37\"\r\n height=\"37\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n </span>\r\n <span\r\n *ngIf=\"getAction(duplicate, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"37\"\r\n height=\"37\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg> </span>\r\n </div>\r\n </div>\r\n <!-- Duplicate Reason -->\r\n <!-- <div class=\"duplicate-reason ms-2 mt-2\">\r\n <small class=\"text-muted\">{{ duplicate.reason }}</small>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n \r\n <!-- Accordion Body -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n \r\n <!-- Loop each block: tagging / review / approve -->\r\n <ng-container *ngFor=\"let block of activityData\">\r\n \r\n <!-- Loop inside comments -->\r\n <div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n \r\n <!-- avatar -->\r\n <div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n <div class=\"w-100\">\r\n \r\n <!-- email -->\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n \r\n <!-- message text -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n \r\n <!-- Review / Approve only -->\r\n <ng-container *ngIf=\"block.type === 'review' || block.type === 'approve'\">\r\n <!-- Tagged images -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n \r\n <div *ngFor=\"let img of c.taggedImages; let i = index\">\r\n \r\n <!-- Show only first 4 -->\r\n <ng-container *ngIf=\"i < 3\">\r\n <div class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url('+ imageUrl + img.filePath + ')'\"></div>\r\n \r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n \r\n <!-- status dots -->\r\n <span *ngIf=\"c.status === 'approved'\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg></span>\r\n \r\n <span *ngIf=\"c.status === 'rejected'\"\r\n ><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n \r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n \r\n <!-- +N more -->\r\n <div\r\n class=\"tango-card more-card text-center\"\r\n *ngIf=\"c.taggedImages.length > 3\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.taggedImages[3].filePath + ')'\"\r\n (click)=\"openImagesPopup(c)\"\r\n >\r\n <div class=\"more-overlay\"></div>\r\n \r\n <!-- vertical container -->\r\n <div class=\"more-wrapper my-10 d-flex flex-column align-items-center justify-content-center\">\r\n <div class=\"more-text fw-semibold\">+{{ c.taggedImages.length - 3 }}</div>\r\n <div class=\"text-primary text-dark text-decoration-underline small\">\r\n View all\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n \r\n </div>\r\n \r\n </ng-container>\r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n \r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n <!-- Status Icons -->\r\n\r\n\r\n </div>\r\n</section>\r\n<section *ngIf=\"type !=='duplicate'\">\r\n <div class=\"layers my-2\" *ngIf=\"hasRevopsType(type)\">\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <div class=\"duplicate-head text-lg my-3\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.51995 0.613065C8.33739 -0.204355 9.66267 -0.204355 10.4801 0.613065L17.387 7.51995C18.2043 8.33739 18.2043 9.66267 17.387 10.4801L10.4801 17.387C9.66267 18.2043 8.33739 18.2043 7.51995 17.387L5.54626 15.4133L3.73708 17.2224C2.91966 18.0399 1.59436 18.0399 0.776944 17.2224C-0.0404767 16.4051 -0.0404767 15.0797 0.776944 14.2624L2.58612 12.4531L0.613065 10.4801C-0.204355 9.66267 -0.204355 8.33739 0.613065 7.51995L7.51995 0.613065ZM9.49336 1.59978C9.22088 1.32731 8.77909 1.32731 8.50661 1.59978L3.57286 6.53357L11.4665 14.4272L16.4002 9.49336C16.6727 9.22088 16.6727 8.77909 16.4002 8.5067L12.9465 5.05286L11.7952 6.20403C11.5228 6.4765 11.0811 6.4765 10.8086 6.20403C10.5361 5.93155 10.5361 5.48978 10.8086 5.21731L11.9597 4.06614L10.9732 3.07964L8.17757 5.87533C7.90509 6.1478 7.46329 6.1478 7.19081 5.87533C6.91833 5.60286 6.91833 5.16109 7.19081 4.88862L9.9865 2.09293L9.49336 1.59978ZM10.4797 15.4139L2.58615 7.52028L1.59978 8.5067C1.3273 8.77909 1.3273 9.22088 1.59978 9.49336L8.50661 16.4002C8.77909 16.6727 9.22088 16.6727 9.49336 16.4002L10.4797 15.4139ZM3.57275 13.4399L1.76366 15.249C1.49119 15.5215 1.49119 15.9633 1.76366 16.2358C2.03613 16.5082 2.4779 16.5082 2.75037 16.2358L4.55946 14.4266L3.57275 13.4399Z\"\r\n fill=\"#475467\" />\r\n </svg></span> {{type}}\r\n\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"ms-3 my-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"selectAllByType[type]\"\r\n (change)=\"onSelectAll(type, $event)\">\r\n <label>Select All</label>\r\n </div>\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <div *ngIf=\"mapping?.type ===viewMode\" class=\"card-body bg-white layers p-5 m-3\">\r\n\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail;let i=index\">\r\n <div *ngIf=\"original?.revopsType ===type\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n'layer-approved': isApproved(original),\r\n'layer-rejected': isRejected(original),\r\n'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n\r\n\r\n <!-- Top-right Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n\r\n <input *ngIf=\"!isLockedByReviewer(original)\" type=\"checkbox\"\r\n class=\"position-absolute absolute form-check-input\"\r\n [checked]=\"(selectedByType[type] || []).includes(original?.tempId)\"\r\n (change)=\"onImageCheckboxChange(type, original.tempId)\" />\r\n <span class=\"position-absolute absolute\" \r\n *ngIf=\"isLockedByReviewer(original)\"\r\n (click)=\"resetCheckbox(type, original)\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\"\r\n viewBox=\"0 0 19 19\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_2023_13718)\">\r\n <rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\"\r\n fill=\"white\" />\r\n <rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\"\r\n rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\" />\r\n <path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\"\r\n stroke-width=\"0.927778\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\"\r\n width=\"18.2222\" height=\"18.2222\"\r\n filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"0.555556\" />\r\n <feGaussianBlur stdDeviation=\"0.555556\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_2023_13718\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_2023_13718\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\" (click)=\"openImagePreview(mapping,original, i, selectedByType[type])\"\r\n class=\"w-100 rounded border cursor-pointer\" />\r\n <div class=\"row my-2\">\r\n <div class=\"col-9\">\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}\r\n <span *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\nheight: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(original, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\nheight: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n <div class=\"col-3 ms-3\">\r\n <span *ngIf=\"getAction(original, 'approve')?.action === 'approved'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"37\" height=\"37\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(original, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"37\" height=\"37\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <div class=\"comments-title\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n\r\n </div>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Content -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n\r\n<!-- loop each block: tagging / review / approve -->\r\n<ng-container *ngFor=\"let block of activityData1\">\r\n\r\n<!-- TAGGING COMMENTS (each comment = one image + message) -->\r\n<ng-container *ngIf=\"block.type === 'tagging'\">\r\n<div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n\r\n<!-- avatar -->\r\n<div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n\r\n<!-- content -->\r\n<div>\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n\r\n <!-- single image card -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div class=\"tango-card\" *ngIf=\"c.filePath\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.filePath + ')'\">\r\n </div>\r\n\r\n <div class=\"tango-meta small\">\r\n <div>Tango ID: {{ c.tempId }}</div>\r\n <div class=\"text-muted\">Entry time: {{ c.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n</ng-container>\r\n\r\n<!-- REVIEW / APPROVE COMMENTS (with taggedImages + +N View all) -->\r\n<ng-container *ngIf=\"block.type === 'review' || block.type === 'approve'\">\r\n<div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n\r\n<!-- avatar -->\r\n<div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n\r\n<!-- content -->\r\n<div class=\"w-100\">\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- main review/approve message -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n\r\n \r\n\r\n <!-- image list + +N View all -->\r\n <div class=\"d-flex gap-2 flex-wrap\" *ngIf=\"c.taggedImages?.length\">\r\n\r\n <!-- first 3 images -->\r\n <div *ngFor=\"let img of c.taggedImages; let i = index\">\r\n <ng-container *ngIf=\"i < 3\">\r\n <div class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + img.filePath + ')'\">\r\n </div>\r\n\r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n <span *ngIf=\"c.status === 'approved'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"c.status === 'rejected'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- +N View all card -->\r\n <div\r\n class=\"tango-card more-card text-center\"\r\n *ngIf=\"c.taggedImages.length > 3\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.taggedImages[3].filePath + ')'\"\r\n (click)=\"openImagesPopup(c)\"\r\n >\r\n <div class=\"more-overlay\"></div>\r\n\r\n <div class=\"more-wrapper d-flex flex-column align-items-center justify-content-center\">\r\n <div class=\"more-text fw-semibold\">\r\n +{{ c.taggedImages.length - 3 }}\r\n </div>\r\n <div class=\"text-primary text-decoration-underline small\">\r\n View all\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n</div>\r\n</ng-container>\r\n\r\n</ng-container>\r\n</div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n</ng-container>\r\n \r\n\r\n\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"showTangoDetails\"\r\n class=\"details-toggle d-flex justify-content-start bg-light-primary align-items-start mt-2\"\r\n (click)=\"toggleRevisedDetails(mapping)\">\r\n <span class=\"text-primary \">\r\n Show in details\r\n </span>\r\n \r\n <span class=\"chevron ms-3 cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <path d=\"M6 15L12 9L18 15\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n \r\n \r\n </ng-container>\r\n \r\n \r\n \r\n <!-- <div class=\"timeline\"></div> -->\r\n \r\n </div>\r\n </ng-container>\r\n </section>\r\n </div>\r\n\r\n </div>\r\n<div class=\"row\">\r\n <div class=\"col-md-6 position-relative\">\r\n <div *ngIf=\"isCheckboxEnable\" class=\"pb-3 my-3 h-100 rounded-3 position-relative\">\r\n\r\n <input type=\"checkbox\" class=\"position-absolute absolute1 form-check-input\" [(ngModel)]=\"allSelected\"\r\n (change)=\"overallSelect($event)\" /><span class=\"ms-12\"> Select\r\n All</span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"col-md-6 pe-8\">\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <select class=\"form-select\" aria-placeholder=\"show all\">\r\n <option value=\"all\">Show all</option>\r\n <option value=\"accept\">Accept</option>\r\n <option value=\"reject\">Reject</option>\r\n <option value=\"pending\">Pending</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <button [disabled]=\"!overallSelectedIds?.length\" class=\"btn btn-outline bg-white w-100\"\r\n (click)=\"popupOpen('rejected')\">\r\n\r\n {{ (selectedRole === 'approver' || selectedRole === 'reviewer') ? 'Deny' : 'Reject'\r\n }}\r\n\r\n </button>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <button [disabled]=\"!overallSelectedIds?.length\" class=\"btn btn-outline bg-white w-100\"\r\n (click)=\"popupOpen('approved')\">\r\n\r\n {{ (selectedRole === 'approver' || selectedRole === 'reviewer') ? 'Approve' :\r\n 'Accept' }}\r\n\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<div *ngIf=\"!approverClosed\" class=\"bg-white\">\r\n <ng-container *ngFor=\"let ticket of footfallTicketsData\">\r\n <div *ngIf=\"ticket?._source as source\" class=\"my-5\">\r\n<ng-container *ngFor=\"let type of revopsTypes\">\r\n<section *ngIf=\"type ==='duplicate'\">\r\n\r\n <div *ngIf=\"hasRevopsType(type)\" class=\"layers\">\r\n <!-- Header Section -->\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <h3 class=\"text-lg font-semibold mb-4\">\r\n <span class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_730_76157)\">\r\n <path\r\n d=\"M3.75 11.25H3C2.60218 11.25 2.22064 11.092 1.93934 10.8107C1.65804 10.5294 1.5 10.1478 1.5 9.75V3C1.5 2.60218 1.65804 2.22064 1.93934 1.93934C2.22064 1.65804 2.60218 1.5 3 1.5H9.75C10.1478 1.5 10.5294 1.65804 10.8107 1.93934C11.092 2.22064 11.25 2.60218 11.25 3V3.75M8.25 6.75H15C15.8284 6.75 16.5 7.42157 16.5 8.25V15C16.5 15.8284 15.8284 16.5 15 16.5H8.25C7.42157 16.5 6.75 15.8284 6.75 15V8.25C6.75 7.42157 7.42157 6.75 8.25 6.75Z\"\r\n stroke=\"#475467\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_730_76157\">\r\n <rect width=\"18\" height=\"18\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n Duplicates\r\n </h3>\r\n </div>\r\n\r\n\r\n <!-- Body Section -->\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <ng-container *ngIf=\"mapping?.type ===viewMode\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail\">\r\n <div *ngIf=\"original?.isParent && original?.revopsType ==='duplicate'\"\r\n class=\"card-body bg-white layers py-5 px-0 m-3\">\r\n <div class=\"my-4\">\r\n <!-- Original Image -->\r\n <div class=\"duplicate-head px-5 my-3\">Original image\r\n </div>\r\n <div class=\"row px-5\">\r\n <div class=\"col-md-4 relative\">\r\n <div class=\"pb-3 img-border border border-1 h-100 rounded-3\">\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\"\r\n class=\"w-100 rounded border\" />\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}</div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"separator separator-dashed mt-3 mb-5\"></div>\r\n <div class=\"row px-5\">\r\n <h5 class=\"duplicate-head my-3 fs-6\">Tagged Duplicates</h5>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"my-3\">\r\n <input type=\"checkbox\" [checked]=\"areAllDuplicatesSelected(original)\"\r\n (change)=\"onToggleSelectAllDuplicates(original, $event)\" />\r\n <label class=\"ms-2\">Select All</label>\r\n </div>\r\n <div *ngFor=\"let duplicate of original?.duplicateImage; let i = index\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n 'layer-approved': isApproved(duplicate),\r\n 'layer-rejected': isRejected(duplicate),\r\n 'img-border border border-1': !isApproved(duplicate) && !isRejected(duplicate)}\">\r\n <!-- Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n <input type=\"checkbox\" *ngIf=\"!isLockedByReviewer(duplicate)\"\r\n style=\"right: 5px ; margin: 10px 5px 4px !important;\"\r\n [checked]=\"isDuplicateSelected(original.tempId, duplicate.tempId)\"\r\n (change)=\"onDuplicateCheckboxChange(original.tempId, duplicate.tempId, $event)\"\r\n class=\"position-absolute form-check-input duplicate-checkbox\" />\r\n <span class=\"position-absolute absolute\" \r\n *ngIf=\"isLockedByReviewer(duplicate)\"\r\n (click)=\"resetCheckbox('duplicate', duplicate)\">\r\n\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\"\r\n viewBox=\"0 0 19 19\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_2023_13718)\">\r\n <rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\"\r\n rx=\"2\" fill=\"white\" />\r\n <rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\"\r\n height=\"15.4444\" rx=\"1.72222\" stroke=\"#D0D5DD\"\r\n stroke-width=\"0.555556\" />\r\n <path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\"\r\n stroke-width=\"0.927778\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_2023_13718\" x=\"0.00021708\"\r\n y=\"0.00010854\" width=\"18.2222\" height=\"18.2222\"\r\n filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\"\r\n result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"0.555556\" />\r\n <feGaussianBlur stdDeviation=\"0.555556\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_2023_13718\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_2023_13718\"\r\n result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n\r\n </span>\r\n </div>\r\n <!-- (change)=\"onImageCheckboxChange(duplicate.tempId, 'duplicate', 'original')\" -->\r\n <!-- Duplicate Image -->\r\n <img [src]=\"imageUrl + duplicate.filePath\" alt=\"\"\r\n (click)=\"openImagePreview(mapping,original.duplicateImage, i, 'Tagged Duplicates')\"\r\n class=\"w-100 rounded border duplicate-image cursor-pointer\" />\r\n\r\n <!-- Duplicate Info -->\r\n <div class=\"row my-2\">\r\n <div class=\"col-9\">\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ duplicate.tempId }}\r\n\r\n <span\r\n *ngIf=\"getAction(duplicate, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span\r\n *ngIf=\"getAction(duplicate, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n\r\n </div>\r\n\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(duplicate.entryTime)\r\n }}\r\n </div>\r\n </div>\r\n <div class=\"col-3\">\r\n <span\r\n *ngIf=\"getAction(duplicate, 'approve')?.action === 'approved'\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"37\"\r\n height=\"37\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n </span>\r\n <span\r\n *ngIf=\"getAction(duplicate, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"37\"\r\n height=\"37\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg> </span>\r\n </div>\r\n </div>\r\n <!-- Duplicate Reason -->\r\n <!-- <div class=\"duplicate-reason ms-2 mt-2\">\r\n <small class=\"text-muted\">{{ duplicate.reason }}</small>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n \r\n <!-- Accordion Body -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n \r\n <!-- Loop each block: tagging / review / approve -->\r\n <ng-container *ngFor=\"let block of activityData\">\r\n \r\n <!-- Loop inside comments -->\r\n <div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n \r\n <!-- avatar -->\r\n <div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n <div class=\"w-100\">\r\n \r\n <!-- email -->\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n \r\n <!-- message text -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n \r\n <!-- Review / Approve only -->\r\n <ng-container *ngIf=\"block.type === 'review' || block.type === 'approve'\">\r\n <!-- Tagged images -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n \r\n <div *ngFor=\"let img of c.taggedImages; let i = index\">\r\n \r\n <!-- Show only first 4 -->\r\n <ng-container *ngIf=\"i < 3\">\r\n <div class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url('+ imageUrl + img.filePath + ')'\"></div>\r\n \r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n \r\n <!-- status dots -->\r\n <span *ngIf=\"c.status === 'approved'\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg></span>\r\n \r\n <span *ngIf=\"c.status === 'rejected'\"\r\n ><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n \r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n \r\n <!-- +N more -->\r\n <div\r\n class=\"tango-card more-card text-center\"\r\n *ngIf=\"c.taggedImages.length > 3\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.taggedImages[3].filePath + ')'\"\r\n (click)=\"openImagesPopup(c)\"\r\n >\r\n <div class=\"more-overlay\"></div>\r\n \r\n <!-- vertical container -->\r\n <div class=\"more-wrapper my-10 d-flex flex-column align-items-center justify-content-center\">\r\n <div class=\"more-text fw-semibold\">+{{ c.taggedImages.length - 3 }}</div>\r\n <div class=\"text-primary text-dark text-decoration-underline small\">\r\n View all\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n \r\n </div>\r\n \r\n </ng-container>\r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n \r\n \r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n <!-- Status Icons -->\r\n\r\n\r\n </div>\r\n</section>\r\n<section *ngIf=\"type !=='duplicate'\">\r\n <div class=\"layers my-2\" *ngIf=\"hasRevopsType(type)\">\r\n <div class=\"card-header min-h-25px pt-3\">\r\n <div class=\"duplicate-head text-lg my-3\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.51995 0.613065C8.33739 -0.204355 9.66267 -0.204355 10.4801 0.613065L17.387 7.51995C18.2043 8.33739 18.2043 9.66267 17.387 10.4801L10.4801 17.387C9.66267 18.2043 8.33739 18.2043 7.51995 17.387L5.54626 15.4133L3.73708 17.2224C2.91966 18.0399 1.59436 18.0399 0.776944 17.2224C-0.0404767 16.4051 -0.0404767 15.0797 0.776944 14.2624L2.58612 12.4531L0.613065 10.4801C-0.204355 9.66267 -0.204355 8.33739 0.613065 7.51995L7.51995 0.613065ZM9.49336 1.59978C9.22088 1.32731 8.77909 1.32731 8.50661 1.59978L3.57286 6.53357L11.4665 14.4272L16.4002 9.49336C16.6727 9.22088 16.6727 8.77909 16.4002 8.5067L12.9465 5.05286L11.7952 6.20403C11.5228 6.4765 11.0811 6.4765 10.8086 6.20403C10.5361 5.93155 10.5361 5.48978 10.8086 5.21731L11.9597 4.06614L10.9732 3.07964L8.17757 5.87533C7.90509 6.1478 7.46329 6.1478 7.19081 5.87533C6.91833 5.60286 6.91833 5.16109 7.19081 4.88862L9.9865 2.09293L9.49336 1.59978ZM10.4797 15.4139L2.58615 7.52028L1.59978 8.5067C1.3273 8.77909 1.3273 9.22088 1.59978 9.49336L8.50661 16.4002C8.77909 16.6727 9.22088 16.6727 9.49336 16.4002L10.4797 15.4139ZM3.57275 13.4399L1.76366 15.249C1.49119 15.5215 1.49119 15.9633 1.76366 16.2358C2.03613 16.5082 2.4779 16.5082 2.75037 16.2358L4.55946 14.4266L3.57275 13.4399Z\"\r\n fill=\"#475467\" />\r\n </svg></span> {{type}}\r\n\r\n </div>\r\n </div>\r\n <div *ngIf=\"isCheckboxEnable\" class=\"ms-3 my-3\">\r\n <input type=\"checkbox\" [(ngModel)]=\"selectAllByType[type]\"\r\n (change)=\"onSelectAll(type, $event)\">\r\n <label>Select All</label>\r\n </div>\r\n <ng-container *ngFor=\"let mapping of source?.mappingInfo\">\r\n <!-- Body Section -->\r\n <div *ngIf=\"mapping?.type ===viewMode\" class=\"card-body bg-white layers p-5 m-3\">\r\n\r\n <div class=\"row\">\r\n <ng-container *ngFor=\"let original of mapping?.revisedDetail;let i=index\">\r\n <div *ngIf=\"original?.revopsType ===type\"\r\n class=\"col-md-3 mb-3 position-relative\">\r\n <div class=\"pb-3 h-100 rounded-3 position-relative\" [ngClass]=\"{\r\n'layer-approved': isApproved(original),\r\n'layer-rejected': isRejected(original),\r\n'img-border border border-1': !isApproved(original) && !isRejected(original)}\">\r\n\r\n\r\n <!-- Top-right Checkbox -->\r\n <div *ngIf=\"isCheckboxEnable\">\r\n\r\n <input *ngIf=\"!isLockedByReviewer(original)\" type=\"checkbox\"\r\n class=\"position-absolute absolute form-check-input\"\r\n [checked]=\"(selectedByType[type] || []).includes(original?.tempId)\"\r\n (change)=\"onImageCheckboxChange(type, original.tempId)\" />\r\n <span class=\"position-absolute absolute\" \r\n *ngIf=\"isLockedByReviewer(original)\"\r\n (click)=\"resetCheckbox(type, original)\">\r\n\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"19\"\r\n viewBox=\"0 0 19 19\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_2023_13718)\">\r\n <rect x=\"1.11133\" y=\"0.555664\" width=\"16\" height=\"16\" rx=\"2\"\r\n fill=\"white\" />\r\n <rect x=\"1.38911\" y=\"0.833442\" width=\"15.4444\" height=\"15.4444\"\r\n rx=\"1.72222\" stroke=\"#D0D5DD\" stroke-width=\"0.555556\" />\r\n <path d=\"M5.87109 8.55566H12.3526\" stroke=\"#344054\"\r\n stroke-width=\"0.927778\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_2023_13718\" x=\"0.00021708\" y=\"0.00010854\"\r\n width=\"18.2222\" height=\"18.2222\"\r\n filterUnits=\"userSpaceOnUse\"\r\n color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\"\r\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\r\n result=\"hardAlpha\" />\r\n <feOffset dy=\"0.555556\" />\r\n <feGaussianBlur stdDeviation=\"0.555556\" />\r\n <feColorMatrix type=\"matrix\"\r\n values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\" />\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\"\r\n result=\"effect1_dropShadow_2023_13718\" />\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\"\r\n in2=\"effect1_dropShadow_2023_13718\" result=\"shape\" />\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n\r\n <img [src]=\"imageUrl + original?.filePath\" alt=\"\" (click)=\"openImagePreview(mapping,original, i, selectedByType[type])\"\r\n class=\"w-100 rounded border cursor-pointer\" />\r\n <div class=\"row my-2\">\r\n <div class=\"col-9\">\r\n <div class=\"desc-title ms-2 my-2\">Tango ID: {{\r\n original.tempId\r\n }}\r\n <span *ngIf=\"getAction(original, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\nheight: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(original, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\nheight: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(original?.entryTime) }}</div>\r\n </div>\r\n <div class=\"col-3 ms-3\">\r\n <span *ngIf=\"getAction(original, 'approve')?.action === 'approved'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"37\" height=\"37\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(original, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"37\" height=\"37\"\r\n viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div class=\"card-footer py-5\">\r\n <div class=\"comments-accordion\">\r\n <!-- Accordion Header -->\r\n <div class=\"accordion-header\" (click)=\"toggleCommentsAccordion()\">\r\n <div class=\"d-flex justify-content-start align-items-center w-100\">\r\n <div class=\"comments-title\">\r\n <span class=\"comments-count\">{{ comments?.length }} Comments</span>\r\n\r\n </div>\r\n <div class=\"accordion-arrow ms-3\">\r\n <svg [class.rotated]=\"commentsAccordionOpen\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Accordion Content -->\r\n <div class=\"accordion-body\" *ngIf=\"commentsAccordionOpen\">\r\n\r\n<!-- loop each block: tagging / review / approve -->\r\n<ng-container *ngFor=\"let block of activityData1\">\r\n\r\n<!-- TAGGING COMMENTS (each comment = one image + message) -->\r\n<ng-container *ngIf=\"block.type === 'tagging'\">\r\n<div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n\r\n<!-- avatar -->\r\n<div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n\r\n<!-- content -->\r\n<div>\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n\r\n <!-- single image card -->\r\n <div class=\"d-flex gap-2 flex-wrap\">\r\n <div class=\"tango-card\" *ngIf=\"c.filePath\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.filePath + ')'\">\r\n </div>\r\n\r\n <div class=\"tango-meta small\">\r\n <div>Tango ID: {{ c.tempId }}</div>\r\n <div class=\"text-muted\">Entry time: {{ c.entryTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n</div>\r\n</ng-container>\r\n\r\n<!-- REVIEW / APPROVE COMMENTS (with taggedImages + +N View all) -->\r\n<ng-container *ngIf=\"block.type === 'review' || block.type === 'approve'\">\r\n<div *ngFor=\"let c of block.comments\" class=\"comment-thread d-flex mb-4\">\r\n\r\n<!-- avatar -->\r\n<div class=\"avatar avatar-text light-primary p-3\">\r\n\r\n {{ getInitialsFromEmail(c.createdByEmail) }}\r\n </div>\r\n\r\n<!-- content -->\r\n<div class=\"w-100\">\r\n <div class=\"fw-semibold\">\r\n {{ c.createdByEmail }}\r\n </div>\r\n\r\n <div class=\"text-muted small\" *ngIf=\"c.createdAt\">\r\n {{ c.createdAt | date:'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- main review/approve message -->\r\n <p class=\"mb-2 mt-2\" *ngIf=\"c.message\">\r\n {{ c.message }}\r\n </p>\r\n\r\n \r\n\r\n <!-- image list + +N View all -->\r\n <div class=\"d-flex gap-2 flex-wrap\" *ngIf=\"c.taggedImages?.length\">\r\n\r\n <!-- first 3 images -->\r\n <div *ngFor=\"let img of c.taggedImages; let i = index\">\r\n <ng-container *ngIf=\"i < 3\">\r\n <div class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + img.filePath + ')'\">\r\n </div>\r\n\r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n <span *ngIf=\"c.status === 'approved'\"\r\n class=\"status-dot status-approve\"></span>\r\n <span *ngIf=\"c.status === 'rejected'\"\r\n class=\"status-dot status-reject\"></span>\r\n </div>\r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- +N View all card -->\r\n <div\r\n class=\"tango-card more-card text-center\"\r\n *ngIf=\"c.taggedImages.length > 3\"\r\n [style.backgroundImage]=\"'url(' + imageUrl + c.taggedImages[3].filePath + ')'\"\r\n (click)=\"openImagesPopup(c)\"\r\n >\r\n <div class=\"more-overlay\"></div>\r\n\r\n <div class=\"more-wrapper d-flex flex-column align-items-center justify-content-center\">\r\n <div class=\"more-text fw-semibold\">\r\n +{{ c.taggedImages.length - 3 }}\r\n </div>\r\n <div class=\"text-primary text-decoration-underline small\">\r\n View all\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n</div>\r\n</ng-container>\r\n\r\n</ng-container>\r\n</div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n</ng-container>\r\n \r\n\r\n\r\n </div>\r\n </ng-container>\r\n</div>\r\n</div>\r\n</div>\r\n</div>\r\n\r\n</section>\r\n\r\n\r\n<ng-template #zoomPopup let-model>\r\n <div class=\"p-4 m-4\">\r\n <div class=\"modal-header border-0 p-0 w-100 flex-column align-items-start\">\r\n\r\n <!-- Heading -->\r\n <h5 class=\"modal-title mb-2\">\r\n {{ popupType === 'approved' ? 'Approve' : 'Reject' }} Selected Images\r\n </h5>\r\n\r\n <!-- Description -->\r\n <p class=\"mb-3 test-appvalue\">\r\n You're about to {{ popupType === 'approved' ? 'Approve' : 'Reject' }} {{ this.overallSelectedIds?.length ? this.overallSelectedIds?.length : this.popupValue ?\r\n this.popupValue:'--' }} <span class=\"fw-bold\">{{ selectedCategoriesLabel | titlecase }}</span>\r\n </p>\r\n <!-- Count Box -->\r\n <div *ngIf=\"selectedCategories?.length === 1\" class=\"w-100 mb-4\">\r\n <label class=\"mb-2\">Remarks (Optional)</label>\r\n <textarea class=\"form-control\" rows=\"3\" [(ngModel)]=\"remarks\"></textarea>\r\n\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"w-100 d-flex justify-content-end\">\r\n <button class=\"btn btn-outline me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary\" (click)=\"submitValue(popupType, popupvalue)\">\r\n {{ popupType === 'approved' ? 'Approve' : 'Reject' }}\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #closePopup let-model>\r\n <div class=\"p-4 m-4\">\r\n <div class=\"modal-header border-0 p-0 w-100 flex-column align-items-start\">\r\n <h5 class=\"modal-title mb-2\">\r\n Close ticket\r\n </h5>\r\n <p class=\"mb-3 test-appvalue\">\r\n You are about to close the ticket, Are you sure want to continue?\r\n </p>\r\n <div class=\"w-100 d-flex justify-content-end\">\r\n <button class=\"btn btn-outline me-2\" (click)=\"confirmCloseCancel()\">Cancel</button>\r\n <button class=\"btn btn-primary\" (click)=\"confirmCloseTicket()\">\r\n Close ticket\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #ReassignTicketPopup let-model>\r\n <div class=\"p-4 m-4\">\r\n <div class=\"modal-header border-0 p-0 w-100 flex-column align-items-start\">\r\n\r\n <!-- Heading -->\r\n <h5 class=\"modal-title mb-2\">\r\n Re-Assign Ticket\r\n </h5>\r\n\r\n <!-- Description -->\r\n <p class=\"mb-3 test-appvalue\">\r\n Transfer the ticket to another user\r\n </p>\r\n\r\n <!-- Count Box -->\r\n <div class=\"row w-100 my-3\">\r\n <div class=\"col-md-12 mb-4\">\r\n <label class=\"label mb-2\">Choose User</label>\r\n <team-select [items]=\"reviwerList\" [multi]=\"false\" [searchField]=\"'userName'\" [idField]=\"'email'\"\r\n (selected)=\"reviewerChange($event)\" [selectedValues]=\"[selectedReviewer]\"></team-select>\r\n </div>\r\n </div>\r\n`\r\n <!-- Action Buttons -->\r\n <div class=\"w-100 d-flex justify-content-end\">\r\n <button class=\"btn btn-outline me-2\" (click)=\"cancelassign()\">Cancel</button>\r\n <button class=\"btn btn-primary\" (click)=\"assignTicketView()\">\r\n Re-Assign\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n\r\n\r\n\r\n<ng-template #imagePreviewPopup let-model>\r\n <div class=\"p-4 m-4\">\r\n <div class=\"modal-header border-0 my-2 p-0 w-100 d-flex justify-content-between align-items-center\">\r\n\r\n <h5 class=\"modal-title mb-2 m-0\">{{ previewTitle }}</h5>\r\n\r\n <!-- Close Button -->\r\n <button type=\"button\"\r\n class=\"btn-close fs-4\"\r\n aria-label=\"Close\"\r\n (click)=\"model.close()\">\r\n \r\n </button>\r\n\r\n </div>\r\n\r\n <div class=\"w-100 position-relative mb-4\">\r\n\r\n <button class=\"btn btn-light position-absolute ms-3 start-0 top-50 translate-middle-y\"\r\n (click)=\"prevPreview()\" [disabled]=\"previewList.length <= 1\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" fill=\"none\">\r\n<path d=\"M15.5615 6.22429L9.33724 12.4486L15.5615 18.6729\" stroke=\"#344054\" stroke-width=\"2.07891\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n </button>\r\n\r\n <img [src]=\"getPreviewImageUrl()\" class=\"w-100 rounded border\" />\r\n <div class=\"row my-2\">\r\n <div class=\"col-10\">\r\n <div class=\"desc-title ms-2 my-2\">\r\n Tango ID: {{ currentPreviewItem.tempId }}\r\n\r\n <span *ngIf=\"getAction(currentPreviewItem, 'review')?.action === 'approved'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\" fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(currentPreviewItem, 'review')?.action === 'rejected'\"\r\n class=\"ms-2\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n\r\n </div>\r\n\r\n <div class=\"desc-value ms-2\">Entry Time: {{\r\n getFormattedEntryTime(currentPreviewItem.entryTime) }}</div>\r\n </div>\r\n <div class=\"col-2 mt-2 text-end\">\r\n <span *ngIf=\"getAction(currentPreviewItem, 'approve')?.action === 'approved'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"42\" height=\"42\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#D1FADF\" />\r\n <g clip-path=\"url(#clip0_486_94051)\">\r\n <path\r\n d=\"M9.5 17H8C7.73478 17 7.48043 16.8946 7.29289 16.7071C7.10536 16.5196 7 16.2652 7 16V12.5C7 12.2348 7.10536 11.9804 7.29289 11.7929C7.48043 11.6054 7.73478 11.5 8 11.5H9.5M13 10.5V8.5C13 8.10218 12.842 7.72064 12.5607 7.43934C12.2794 7.15804 11.8978 7 11.5 7L9.5 11.5V17H15.14C15.3812 17.0027 15.6152 16.9182 15.799 16.762C15.9827 16.6058 16.1038 16.3885 16.14 16.15L16.83 11.65C16.8518 11.5067 16.8421 11.3603 16.8017 11.2211C16.7613 11.0819 16.6911 10.9531 16.5959 10.8438C16.5008 10.7344 16.383 10.647 16.2508 10.5876C16.1185 10.5283 15.975 10.4984 15.83 10.5H13Z\"\r\n stroke=\"#039855\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94051\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"getAction(currentPreviewItem, 'approve')?.action === 'rejected'\"><svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"42\" height=\"42\" viewBox=\"0 0 24 24\"\r\n fill=\"none\">\r\n <rect width=\"24\" height=\"24\" rx=\"12\" fill=\"#FEE4E2\" />\r\n <g clip-path=\"url(#clip0_486_94090)\">\r\n <path\r\n d=\"M14.5015 7.00006H15.8365C16.1195 6.99505 16.3944 7.09413 16.6092 7.27847C16.8239 7.46281 16.9635 7.71959 17.0015 8.00006V11.5001C16.9635 11.7805 16.8239 12.0373 16.6092 12.2216C16.3944 12.406 16.1195 12.5051 15.8365 12.5001H14.5015M11.0015 13.5001V15.5001C11.0015 15.8979 11.1595 16.2794 11.4408 16.5607C11.7221 16.842 12.1037 17.0001 12.5015 17.0001L14.5015 12.5001V7.00006H8.86148C8.62032 6.99733 8.38629 7.08186 8.20253 7.23806C8.01876 7.39426 7.89764 7.61161 7.86148 7.85006L7.17148 12.3501C7.14973 12.4934 7.15939 12.6397 7.19981 12.7789C7.24023 12.9181 7.31043 13.0469 7.40555 13.1563C7.50067 13.2657 7.61844 13.3531 7.75069 13.4124C7.88295 13.4718 8.02653 13.5017 8.17148 13.5001H11.0015Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_486_94090\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" transform=\"translate(6 6)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n </div>\r\n\r\n <!-- Duplicate Reason -->\r\n <!-- <div class=\"duplicate-reason ms-2 mt-2\">\r\n <small class=\"text-muted\">{{ currentPreviewItem.reason }}</small>\r\n </div> -->\r\n\r\n <button class=\"btn btn-light position-absolute me-3 end-0 top-50 translate-middle-y\" (click)=\"nextPreview()\"\r\n [disabled]=\"previewList.length <= 1\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" fill=\"none\">\r\n<path d=\"M9.33594 18.6732L15.5602 12.4489L9.33594 6.22461\" stroke=\"#344054\" stroke-width=\"2.07891\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n </button>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"canShowPreviewActions(currentPreviewItem)\" class=\"w-100 d-flex justify-content-end\">\r\n <button class=\"btn btn-outline me-2\" (click)=\"rejectedPopup('rejected',currentPreviewItem)\">\r\n\r\n {{ (selectedRole === 'approver' || selectedRole === 'reviewer') ? 'Deny' : 'Reject'\r\n }}</button>\r\n <button class=\"btn btn-primary\" (click)=\"approvedPopup('approved',currentPreviewItem)\">\r\n\r\n {{ (selectedRole === 'approver' || selectedRole === 'reviewer') ? 'Approve' :\r\n 'Accept' }}</button>\r\n </div>\r\n\r\n </div>\r\n \r\n</ng-template>\r\n\r\n\r\n<ng-template #internalticket let-modal>\r\n <div class=\"h-auto p-10\">\r\n <div class=\"card-header border-0\">\r\n <div class=\"card-title\">Start audit</div>\r\n <div class=\"card-sub\">Please select a store and date range to start audit</div>\r\n </div>\r\n <div class=\"row my-3\">\r\n <div class=\"col-md-7 mb-4\">\r\n <label class=\"label\">Store</label>\r\n <lib-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeName'\" [idField]=\"'storeId'\"\r\n (selected)=\"storeChange($event)\" [selectedValues]=\"[selectedStore]\"></lib-select>\r\n </div>\r\n <div class=\"col-md-5 mt-7\">\r\n\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <input class=\"fx-date-range form-control ps-14\" style=\"width:165px !important\" type=\"text\" matInput\r\n ngxDaterangepickerMd [singleDatePicker]=\"true\" [drops]=\"'down'\" [opens]=\"'left'\"\r\n [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\"\r\n autocomplete=\"off\" [(ngModel)]=\"selectedDateRange\"\r\n (startDateChanged)=\"onStartDateChange($event)\" [isCustomDate]=\"isCustomDate\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" [readonly]=\"true\" [autoApply]=\"true\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mt-3\" *ngIf=\"footfallcount>0\">\r\n <div>{{footfallcount}}</div>\r\n <div class=\"mt-2\">Total footfall</div>\r\n </div>\r\n <div class=\"card-body mt-5\">\r\n <div class=\"w-100 d-flex mt-5\">\r\n\r\n <button class=\"btn btn-outline w-50 me-2\" (click)=\"modal.close('isDenied')\">Cancel</button>\r\n <button [disabled]=\"disableAudit&&footfallcount>0\" class=\"btn btn-primary w-50 ms-2\"\r\n (click)=\"modal.close('isConfirmed')\">start</button>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Simple overlay modal -->\r\n<div class=\"images-modal-backdrop\" *ngIf=\"showImagesModal\">\r\n <div class=\"images-modal\">\r\n <div class=\"modal-header d-flex justify-content-between align-items-start mb-3\">\r\n <div>\r\n <h6 class=\"mb-1\">All Images</h6>\r\n\r\n <!-- email -->\r\n <div class=\"small fw-semibold\">\r\n {{ selectedComment?.createdByEmail }}\r\n </div>\r\n\r\n <!-- time -->\r\n <div class=\"small text-muted\" *ngIf=\"selectedComment?.createdAt\">\r\n {{ selectedComment?.createdAt | date: 'hh:mm:ss a - dd MMM yyyy' }}\r\n </div>\r\n\r\n <!-- optional comment text under time -->\r\n <p class=\"mb-0 mt-2\" *ngIf=\"selectedComment?.message\">\r\n {{ selectedComment?.message }}\r\n </p>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"btn-close ms-3\"\r\n (click)=\"closeImagesPopup()\">\r\n </button>\r\n</div>\r\n\r\n\r\n <div class=\"modal-body d-flex flex-wrap gap-3\">\r\n <div *ngFor=\"let img of selectedImagesForPopup\" class=\"tango-card\">\r\n <div class=\"tango-image\"\r\n [style.backgroundImage]=\"'url('+ imageUrl + img.filePath + ')'\">\r\n </div>\r\n <div class=\"tango-meta small\">\r\n <div>\r\n Tango ID: {{ img.tempId }}\r\n\r\n <!-- status dots -->\r\n <span *ngIf=\"img.status === 'approved'\"><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"11\" viewBox=\"0 0 10 11\" fill=\"none\">\r\n <rect y=\"0.5\" width=\"10\" height=\"10\" rx=\"5\"\r\n fill=\"#D1FADF\" />\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.1222 3.57919L4.13887 6.45836L3.3472 5.61253C3.20137 5.47503 2.9722 5.46669 2.80553 5.58336C2.64303 5.70419 2.5972 5.91669 2.6972 6.08753L3.6347 7.61253C3.72637 7.75419 3.8847 7.84169 4.06387 7.84169C4.2347 7.84169 4.3972 7.75419 4.48887 7.61253C4.63887 7.41669 7.50137 4.00419 7.50137 4.00419C7.87637 3.62086 7.4222 3.28336 7.1222 3.57503V3.57919Z\"\r\n fill=\"#12B76A\" />\r\n </svg></span>\r\n\r\n <span *ngIf=\"img.status === 'rejected'\"\r\n ><svg style=\"width: 20px;\r\n height: 20px;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 13 13\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1428_59484)\">\r\n <path\r\n d=\"M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n fill=\"#FEE4E2\" />\r\n <path\r\n d=\"M8.09961 5L5.09961 8M5.09961 5L8.09961 8M4.52961 1.5H8.66961L11.5996 4.43V8.57L8.66961 11.5H4.52961L1.59961 8.57V4.43L4.52961 1.5Z\"\r\n stroke=\"#D92D20\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1428_59484\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\"\r\n transform=\"translate(0.599609 0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg></span>\r\n </div>\r\n\r\n <div class=\"text-muted\">\r\n Entry time: {{ img.entryTime }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".card-header,.header{color:var(--Gray-900, #101828);font-size:20px!important;font-style:normal;font-weight:700;line-height:27px}.sub-header{color:var(--Gray-700, #344054);font-size:14px!important;font-style:normal;font-weight:600;line-height:20px}.ellipse1{border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.card-title-foot{color:var(--Gray-800, #1D2939)!important;font-size:18px;font-weight:600;line-height:28px}.card-title-label{color:var(--Gray-800, #1D2939)!important;font-size:16px;font-weight:600;line-height:28px}.card-title-value{color:var(--Gray-800, #1D2939)!important;font-size:16px;font-weight:400;line-height:28px}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}.rotate{rotate:180deg;transition:1s}.border-selectall{border-radius:6px;border-bottom:1px solid var(--Gray-200, #EAECF0);background:#f9fafb;padding:8px 12px}.border-selectall1{border-radius:6px!important;background:var(--White, #FFF)!important;padding:8px 2px}.border-totalfootfall{border-radius:12px;padding:4px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF)}.vl{border-left:2px solid #000;height:50px}.duplicate-head{color:var(--Gray-700, #344054);font-size:16px;font-weight:600;line-height:20px}.img-border{border-radius:5px!important;border:2px solid var(--Gray-300, #D0D5DD)}.desc-title{color:var(--Gray-900, #101828);font-size:12px;font-weight:500;line-height:20px}.desc-value{color:var(--Gray-900, #475467);font-size:10px;font-weight:500;line-height:10px}.img-border{overflow:hidden;position:relative}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:1px!important}.absolute{top:5px;right:5px;z-index:2}.absolute1{top:5px;left:8px;z-index:2}.img-src{width:25%;height:20%}.backButtonright{border-radius:1000px!important;background:var(--text-primary, #FFF)!important;padding:12px!important;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808!important;box-shadow:0 8.727px 11.636px -2.909px #10182814,0 2.909px 4.364px -1.455px #10182808!important;position:absolute;top:30px;right:-10px;z-index:0}.backButtonleft{border-radius:1000px!important;background:#fff;padding:14px!important;border:var(--Gray-300, #D0D5DD);box-shadow:0 8.727px 11.636px -2.909px #10182814,0 2.909px 4.364px -1.455px #10182808;position:absolute;top:30px;left:-20px;z-index:5}.select-wrapper{position:relative;display:inline-block;width:100%}.placeholder-overlay{position:absolute;color:var(--Gray-500, #667085);font-family:Inter;font-size:16px!important;font-style:normal;font-weight:400;top:10px;left:15px;pointer-events:none;font-size:1.1rem;z-index:1}.card-title{color:var(--Black, #101828)!important;font-size:20px!important;font-weight:700!important;line-height:30px}.card-title-sub-header{color:var(--Black, #101828);font-size:14px;font-weight:500;line-height:30px}.separator.separator-dashed{border-bottom-style:double!important}.border-1{border-radius:4px!important;border:1px solid var(--Gray-300, #D0D5DD)!important}.store-item{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-radius:8px;transition:background-color .3s ease}.store-item-active{background:#eaf8ff}.left{display:flex;align-items:center;gap:8px;overflow:hidden;color:var(--Gray-700, #344054);text-overflow:ellipsis;font-size:14px;font-style:normal;font-weight:400;line-height:24px}.left .active-text{overflow:hidden;color:var(--Primary-700, #EAF8FF);font-size:14px;font-style:normal;font-weight:400;line-height:24px}.badge-active{border-radius:16px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);text-align:center;font-size:12px;font-style:normal;font-weight:500;line-height:20px;mix-blend-mode:multiply}.badge-normal{color:var(--Gray-700, #344054);text-align:center;font-size:12px;font-style:normal;font-weight:500;line-height:20px;border-radius:16px;background:var(--Gray-100, #F2F4F7)}.bg-light-primary{background:#f6fcff!important}.card-layer{gap:16px!important;opacity:1!important;padding:16px!important;border-radius:16px!important;border-width:1px!important;background:#fff;border:1px solid #EAECF0!important}.ticket-container{width:100%;background:#fff;border-radius:12px;padding:0;font-family:Inter,sans-serif}.ticket-header{display:flex;justify-content:space-between;align-items:center;border-radius:6px;border-bottom:2px solid var(--Gray-200, #EAECF0);background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;padding:16px 20px;font-weight:600}.footfall-value{font-weight:600;font-size:20px;line-height:30px;letter-spacing:0%;vertical-align:middle;color:#101828}.issue-date{font-size:14px;color:#666}.timeline{width:1.5px;height:15px;background:#d0d5dd;margin-left:33px}.timeline-new{width:1px;height:70px;background:#d0d5dd;margin-left:30px;font-weight:600}.revision-card{background:#fff;border:1px solid #eaeaea;border-radius:12px;padding:0 20px}.user-info{display:flex;align-items:center}.avatar{width:42px;height:40px;border-radius:50%;margin-right:15px;font-size:14px;color:#1d2939;font-weight:600}.user-name{font-size:13px;color:#555}.user-email{font-size:12px;color:#888;margin-top:2px}.values-row{display:flex;justify-content:space-between;flex-wrap:wrap}.value-block{min-width:90px;margin:10px 0}.value{font-size:20px;font-weight:700}.label{font-size:14px;color:#1d2939;margin-top:3px}.accuracy{font-size:18px!important}.accuracy.up,.accuracy.down{color:#00a3ff}.footfall-label{font-weight:700;font-size:14px;line-height:20px;letter-spacing:0%;vertical-align:middle;color:#344054!important}.duplicate-layer{gap:10px;opacity:1;padding:16px;border-bottom-width:1px;border-bottom:1px solid #F2F4F7;background:#fff}.layer-approved{border-color:#a6f4c5!important;box-shadow:0 0 0 2.29px #a6f4c5}.layer-rejected{border-color:#fda29b!important;box-shadow:0 0 0 2.29px #fda29b}.layers{border-radius:8px;border-width:1px;opacity:1;border:1px solid #EAECF0;background:#fcfcfd;margin:12px}.accordion-header{cursor:pointer}svg.rotated{transform:rotate(180deg);transition:transform .3s ease}.accordion-body{animation:fadeIn .25s ease}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.ellipsis-underline{max-width:120px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:underline;cursor:pointer;display:inline-block}table td{line-height:14px!important}.btn-filter{font-weight:600;font-size:14px;line-height:20px;letter-spacing:0%;text-transform:capitalize;color:#344054}.overlay{position:fixed;inset:0;background:#0000001a}.filter-card{position:absolute;right:0;background:#fff;border-radius:8px;padding:16px 20px;box-shadow:0 8px 24px #0000001f;font-size:13px}.border-primary-layers{opacity:1;gap:12px;padding-bottom:16px;background:#eaf8ff;border-radius:8px!important}.border-primary-layers .label-title{opacity:1;gap:10px;padding:8px;border-bottom-right-radius:8px!important;background:#daf1ff;font-weight:500!important;font-size:18px!important;line-height:28px!important;letter-spacing:0%;color:#000!important}.border-primary-layers .label-desc{font-weight:500;font-size:16px;line-height:28px;letter-spacing:0%;color:#008edf!important}.comment-thread{border-left:1px solid #e5e5e5;padding-left:16px}.comment-avatar{width:32px;height:32px;border-radius:50%;object-fit:cover}.tango-card{width:140px;border-radius:8px;border:1px solid #e5e5e5;overflow:hidden;background:#fff;cursor:pointer}.tango-image{height:80px;background-size:cover;background-position:center}.tango-meta{padding:6px 8px}.more-card{background:#00000008;font-weight:600}.status-dot{display:inline-block;width:10px;height:10px;border-radius:50%;margin-left:4px}.status-approve{background:#22c55e}.status-reject{background:#ef4444}.page-content{padding:16px}.filter-backdrop{position:fixed;inset:0;background:#0f172a40;z-index:998}.filter-modal{position:fixed;inset:0;display:flex;justify-content:center;align-items:center;z-index:999}.store-item-active{background-color:#eaf8ff}.store-item{padding:8px 12px 8px 10px;border-radius:6px;padding:8px 12px;gap:12px;opacity:1}.ticket-id{font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;color:#1d2939}.store-name{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#667085}.perc-badge{font-size:12px;min-width:48px;text-align:center}.perc-badge-normal{background-color:#f3f3f3;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;color:#344054}.perc-badge-active{background-color:#d9ecff;font-weight:500;font-size:14px;line-height:20px;letter-spacing:0%;text-align:center;color:#009bf3}.border-selectall{padding:8px 10px;border-radius:12px;background:#f7f7f7}.reviewer-label{font-size:12px;color:gray}.sort-arrow{font-size:10px;line-height:1}.modal-title{font-weight:600;font-size:18px;line-height:28px;letter-spacing:0%;color:#1d2939}.test-appvalue{color:#1d2939;font-weight:400;font-size:16px;line-height:24px;letter-spacing:0%}.light-primary{background:#eaf8ff!important}.nav-item .nav-link.active{border:none;border-radius:6px;background:var(--Primary-50, #EAF8FF);padding:8px 12px}.revision-card-approve-closed{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.ticket-actions-wrapper{position:relative;display:inline-block}.icon-btn{border:none;background:transparent;cursor:pointer;padding:4px 6px;border-radius:999px}.ticket-menu{position:absolute;right:0;top:100%;margin-top:4px;background:#fff;border-radius:10px;box-shadow:0 8px 20px #0f172a26;min-width:160px;overflow:hidden;z-index:1000}.ticket-menu-item{padding:8px 16px;font-size:13px;color:#111827;border-bottom:1px solid #f3f4f6;cursor:pointer}.ticket-menu-item:last-child{border-bottom:none}.revision-card-approve{border-top:none!important;border:1px solid #eaeaea!important;border-radius:0 0 12px 12px!important}input[type=checkbox]:disabled{cursor:not-allowed;opacity:.6;outline:1px solid var(--primary-600, #dddddd)!important;background-color:var(--primary-50, #e9e9ea)}.card-title{font-weight:600;font-size:18px;line-height:28px;letter-spacing:0%;color:#1d2939}.card-sub{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#475467}.daterangepicker{display:block!important;top:153.85px!important;left:900px!important;right:0}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize}::ng-deep .applyBtn{display:none!important}::ng-deep .md-drppicker .btn{line-height:10px!important}::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:365px!important}::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}::ng-deep .md-drppicker td.active,::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}::ng-deep .md-drppicker table th,::ng-deep .md-drppicker table td{width:40px!important;height:40px!important;padding:10px 8px!important}::ng-deep .md-drppicker td.available.prev,::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}::ng-deep .md-drppicker td.available.next,::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}::ng-deep .md-drppicker table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px;font-weight:500!important;line-height:24px}::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.custom-table thead tr{background:var(--Gray-50, #F9FAFB)!important;font-size:12px!important;text-align:start!important}.more-overlay{position:absolute;inset:0;background:#ffffffbf;z-index:1}.more-wrapper{position:relative;z-index:2;color:#000}.tango-card.more-card{position:relative;background-size:cover;background-position:center;cursor:pointer;overflow:hidden}.tango-card.more-card .more-overlay{position:absolute;inset:0;background:#ffffffbf}.tango-card.more-card .more-text{position:relative;font-weight:600;font-size:14px}.images-modal-backdrop{position:fixed;inset:0;background:#0f172a59;display:flex;align-items:center;justify-content:center;z-index:1050}.images-modal{background:#fff;border-radius:12px;padding:16px 20px;max-width:900px;max-height:80vh;overflow-y:auto}.text-underline{text-decoration:underline}\n"] }]
|
|
2190
|
+
}], ctorParameters: () => [{ type: i1.NgbModal }, { type: i2.GlobalStateService }, { type: i3.TicketService }, { type: i0.ChangeDetectorRef }, { type: i4.ExcelService }, { type: i5.ToastService }, { type: i6.FormBuilder }, { type: i7.Router }, { type: i8.AuditService }], propDecorators: { tooltip: [{
|
|
2191
|
+
type: ViewChild,
|
|
2192
|
+
args: ['tooltip']
|
|
2193
|
+
}], internalticket: [{
|
|
2194
|
+
type: ViewChild,
|
|
2195
|
+
args: ['internalticket']
|
|
2196
|
+
}], filterChange: [{
|
|
2197
|
+
type: Output
|
|
2198
|
+
}], closePopup: [{
|
|
2199
|
+
type: ViewChild,
|
|
2200
|
+
args: ["closePopup"]
|
|
2201
|
+
}], zoomPopup: [{
|
|
2202
|
+
type: ViewChild,
|
|
2203
|
+
args: ["zoomPopup"]
|
|
2204
|
+
}], imagePreviewPopup: [{
|
|
2205
|
+
type: ViewChild,
|
|
2206
|
+
args: ["imagePreviewPopup"]
|
|
2207
|
+
}], onDocumentClick: [{
|
|
2208
|
+
type: HostListener,
|
|
2209
|
+
args: ['document:click']
|
|
2210
|
+
}], ReassignTicketPopup: [{
|
|
2211
|
+
type: ViewChild,
|
|
2212
|
+
args: ["ReassignTicketPopup"]
|
|
2213
|
+
}] } });
|
|
2214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0LWZvb3RmYWxsLW5ldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2UtdGlja2V0cy9zcmMvbGliL2NvbXBvbmVudHMvdGlja2V0LWZvb3RmYWxsLW5ldy90aWNrZXQtZm9vdGZhbGwtbmV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS10aWNrZXRzL3NyYy9saWIvY29tcG9uZW50cy90aWNrZXQtZm9vdGZhbGwtbmV3L3RpY2tldC1mb290ZmFsbC1uZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFLVCxZQUFZLEVBQ1osTUFBTSxFQUNOLFlBQVksRUFFWixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFHcEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFNMUMsT0FBTyxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQztBQUNuQyxPQUFPLFFBQVEsTUFBTSx1QkFBdUIsQ0FBQztBQUk3QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7Ozs7Ozs7Ozs7OztBQUwzRixLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7QUFNdEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0FBTy9CLE1BQU0sT0FBTywwQkFBMEI7SUFNM0I7SUFDRDtJ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QjtrQkFMdEMsU0FBUzsrQkFDRSx5QkFBeUI7MFNBaUNaLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFHUSxjQUFjO3NCQUExQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFrcEJqQixZQUFZO3NCQUFyQixNQUFNO2dCQTg0QmtCLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFrVEMsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQTZYVSxpQkFBaUI7c0JBQWhELFNBQVM7dUJBQUMsbUJBQW1CO2dCQWlQOUIsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQjtnQkFVSSxtQkFBbUI7c0JBQXBELFNBQVM7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPdXRwdXQsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCAqIGFzIGFtNGNvcmUgZnJvbSBcIkBhbWNoYXJ0cy9hbWNoYXJ0czQvY29yZVwiO1xyXG5pbXBvcnQgKiBhcyBhbTRjaGFydHMgZnJvbSBcIkBhbWNoYXJ0cy9hbWNoYXJ0czQvY2hhcnRzXCI7XHJcbmltcG9ydCBhbTR0aGVtZXNfYW5pbWF0ZWQgZnJvbSBcIkBhbWNoYXJ0cy9hbWNoYXJ0czQvdGhlbWVzL2FuaW1hdGVkXCI7XHJcbmltcG9ydCB7IEZvb3RmYWxsUG9wdXBDb21wb25lbnQgfSBmcm9tIFwiLi4vZm9vdGZhbGwtcG9wdXAvZm9vdGZhbGwtcG9wdXAuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktZ2xvYmFsXCI7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFRpY2tldFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvdGlja2V0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRXhjZWxTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2V4Y2VsLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1zaGFyZWRcIjtcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuJztcclxuaW1wb3J0IHV0YyBmcm9tICdkYXlqcy9wbHVnaW4vdXRjJztcclxuaW1wb3J0IHRpbWV6b25lIGZyb20gJ2RheWpzL3BsdWdpbi90aW1lem9uZSc7XHJcbmRheWpzLmV4dGVuZCh1dGMpO1xyXG5kYXlqcy5leHRlbmQodGltZXpvbmUpXHJcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcclxuaW1wb3J0IGN1c3RvbVBhcnNlRm9ybWF0IGZyb20gJ2RheWpzL3BsdWdpbi9jdXN0b21QYXJzZUZvcm1hdCc7XHJcbmltcG9ydCB7IFRpY2tldGNsb3NlcG9wdXBDb21wb25lbnQgfSBmcm9tIFwiLi4vdGlja2V0Y2xvc2Vwb3B1cC90aWNrZXRjbG9zZXBvcHVwLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBBdWRpdFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYXVkaXQuc2VydmljZVwiO1xyXG5kYXlqcy5leHRlbmQoY3VzdG9tUGFyc2VGb3JtYXQpXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItdGlja2V0LWZvb3RmYWxsLW5ld1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vdGlja2V0LWZvb3RmYWxsLW5ldy5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vdGlja2V0LWZvb3RmYWxsLW5ldy5jb21wb25lbnQuc2Nzc1wiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGlja2V0Rm9vdGZhbGxOZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgc2VhcmNoVmFsdWU6IGFueSA9IFwiXCI7XHJcbiAgc29ydGVkQ29sdW1uOiBzdHJpbmcgPSBcIlwiO1xyXG4gIHNvcnREaXJlY3Rpb246IG51bWJlciA9IDE7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXHJcbiAgICBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgc2VydmljZTogVGlja2V0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBleGNlbFNlcnZpY2U6IEV4Y2VsU2VydmljZSxcclxuICAgIHByaXZhdGUgdHM6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgYXVkaXRzZXJ2aWNlOiBBdWRpdFNlcnZpY2UsXHJcbiAgKSB7IH1cclxuICBoZWFkZXJGaWx0ZXJzOiBhbnk7XHJcbiAgZm9vdGZhbGxMaXN0X3JlcTogYW55O1xyXG4gIHVzZXJzRGV0YWlsczogYW55O1xyXG4gIHNlbGVjdGVkU3RvcmU6IGFueTtcclxuICBzZWxlY3RlZFJldmlld2VyOmFueTtcclxuICBzdG9yZUxpc3Q6IGFueSA9IFtdXHJcbiAgZGF5anMgPSBkYXlqc1xyXG4gIHNlbGVjdGVkRGF0ZVJhbmdlOiBhbnkgPSB7fTsgIFxyXG4gIGFycm93c2hvdyA9IHRydWU7XHJcbiAgaXNDdXN0b21EYXRlID0gKG06IGRheWpzLkRheWpzKSA9PiB7XHJcbiAgICBjb25zdCBpc1ZhbGlkRGF0ZSA9IG0gPiB0aGlzLmRheWpzKCk7XHJcbiAgICByZXR1cm4gaXNWYWxpZERhdGUgPyAnaW52YWxpZC1kYXRlJyA6IGZhbHNlO1xyXG4gIH1cclxuICAgQFZpZXdDaGlsZCgndG9vbHRpcCcpIHRvb2x0aXA6IE1hdFRvb2x0aXA7XHJcbiAgZm9vdGZhbGxjb3VudDphbnk9MFxyXG4gIGRpc2FibGVBdWRpdDpib29sZWFuID0gdHJ1ZVxyXG4gIEBWaWV3Q2hpbGQoJ2ludGVybmFsdGlja2V0JykgaW50ZXJuYWx0aWNrZXQ6IGFueTtcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHNlc3Npb25TdG9yYWdlLmNsZWFyKCk7XHJcbiAgICB0aGlzLmltYWdlVXJsID0gdGhpcy5zZXJ2aWNlPy5mb290ZmFsbENETjtcclxuICAgIGxldCB1c2VyRGF0YTogYW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ1c2VyLWluZm9cIik7XHJcbiAgICB0aGlzLnVzZXJzRGV0YWlscyA9IEpTT04ucGFyc2UodXNlckRhdGEpO1xyXG4gICAgXHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlPy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSk/LnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgdGhpcy5oZWFkZXJGaWx0ZXJzID0gZGF0YTtcclxuICAgICAgICAgIHRoaXMuZm9vdGZhbGxMaXN0X3JlcSA9IHtcclxuICAgICAgICAgICAgY2xpZW50OiB0aGlzLmhlYWRlckZpbHRlcnMuY2xpZW50cy50b1N0cmluZygpLFxyXG4gICAgICAgICAgICBmcm9tRGF0ZTogdGhpcy5oZWFkZXJGaWx0ZXJzPy5kYXRlPy5zdGFydERhdGUsXHJcbiAgICAgICAgICAgIHRvRGF0ZTogdGhpcy5oZWFkZXJGaWx0ZXJzPy5kYXRlPy5lbmREYXRlLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgdGhpcy52aWV3VGlja2V0KCdzdG9yZScpO1xyXG4gICAgICAgICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckZpbHRlcnMuY2xpZW50c1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgeWVzdGVyZGF5ID0gdGhpcy5kYXlqcygpLnN1YnRyYWN0KDEsIFwiZGF5c1wiKTtcclxuICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB7XHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogeWVzdGVyZGF5LmZvcm1hdChcIllZWVktTU0tRERcIiksXHJcbiAgICAgICAgICAgIGVuZERhdGU6IHllc3RlcmRheS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSB7XHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogeWVzdGVyZGF5LmZvcm1hdChcIkRELU1NLVlZWVlcIiksXHJcbiAgICAgICAgICAgIGVuZERhdGU6IHllc3RlcmRheS5mb3JtYXQoXCJERC1NTS1ZWVlZXCIpLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuc2VydmljZS5nZXRzdG9yZUxpc3QocGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IGUuZGF0YS5yZXN1bHQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuICB2aWV3VGlja2V0KHR5cGU6IGFueSkge1xyXG4gICAgdGhpcy50YW5nb1R5cGUgPSB0eXBlO1xyXG4gICAgIGlmKHRoaXMuaGFzQXBwcm92ZXJBY2Nlc3Mpe1xyXG4gICAgICB0aGlzLmdldFRpY2tldFN1bW1hcnkoKTtcclxuICAgICAgIHRoaXMuU2VsZWN0ZWRSb2xlKCdhcHByb3ZlcicpO1xyXG4gICAgIH0gZWxzZSB7XHJcbiAgICBpZiAodHlwZSA9PT0gJ3N0b3JlJykge1xyXG4gICAgICB0aGlzLmdldFRpY2tldFN1bW1hcnkoKTtcclxuICAgICAgdGhpcy5nZXRUaWNrZXRMaXN0KHRoaXMudGFuZ29UeXBlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZ2V0VGlja2V0U3VtbWFyeSgpO1xyXG4gICAgICB0aGlzLmdldFRpY2tldExpc3QodGhpcy50YW5nb1R5cGUpO1xyXG4gICAgfVxyXG4gIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBhcmVBbGxJdGVtc1Jldmlld2VkKG1hcHBpbmc6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcmV2aXNlZCA9IG1hcHBpbmc/LnJldmlzZWREZXRhaWwgfHwgW107XHJcbiAgICBpZiAoIXJldmlzZWQubGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgaXRlbXNUb0NoZWNrOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIHJldmlzZWQuZm9yRWFjaCgoZGV0YWlsOiBhbnkpID0+IHtcclxuICAgICAgLy8gSWYgZHVwbGljYXRlIHBhcmVudCDihpIgY2hlY2sgaXRzIGR1cGxpY2F0ZUltYWdlIGNoaWxkcmVuXHJcbiAgICAgIGlmIChcclxuICAgICAgICBkZXRhaWw/LnJldm9wc1R5cGUgPT09ICdkdXBsaWNhdGUnICYmXHJcbiAgICAgICAgZGV0YWlsPy5pc1BhcmVudCAmJlxyXG4gICAgICAgIEFycmF5LmlzQXJyYXkoZGV0YWlsPy5kdXBsaWNhdGVJbWFnZSkgJiZcclxuICAgICAgICBkZXRhaWwuZHVwbGljYXRlSW1hZ2UubGVuZ3RoXHJcbiAgICAgICkge1xyXG4gICAgICAgIGl0ZW1zVG9DaGVjay5wdXNoKC4uLmRldGFpbC5kdXBsaWNhdGVJbWFnZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gTm9ybWFsIGl0ZW0gb3Igbm9uLXBhcmVudCBkdXBsaWNhdGVcclxuICAgICAgICBpdGVtc1RvQ2hlY2sucHVzaChkZXRhaWwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBBbGwgbXVzdCBoYXZlIHJldmlldyBhcHByb3ZlZC9yZWplY3RlZFxyXG4gICAgcmV0dXJuIGl0ZW1zVG9DaGVjay5sZW5ndGggPiAwICYmIGl0ZW1zVG9DaGVjay5ldmVyeShpdGVtID0+IHRoaXMuaGFzUmV2aWV3RGVjaXNpb24oaXRlbSkpO1xyXG4gIH1cclxuICBwcml2YXRlIGhhc1Jldmlld0RlY2lzaW9uKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYWN0aW9ucyA9IGl0ZW0/LmFjdGlvbnMgfHwgW107XHJcbiAgICByZXR1cm4gYWN0aW9ucy5zb21lKFxyXG4gICAgICAoYTogYW55KSA9PlxyXG4gICAgICAgIGEuYWN0aW9uVHlwZSA9PT0gJ3JldmlldycgJiZcclxuICAgICAgICAoYS5hY3Rpb24gPT09ICdhcHByb3ZlZCcgfHwgYS5hY3Rpb24gPT09ICdyZWplY3RlZCcpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRSb2xlOiAnYXBwcm92ZXInIHwgJ3Jldmlld2VyJyB8ICcnID0gJyc7XHJcbiAgc3RhdHVzVmFsOiBhbnk7XHJcbiAgZ2V0SGVhZGVyU3RhdHVzKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByb2xlTWFwcGluZyA9IHRoaXMuZ2V0Q3VycmVudFJvbGVNYXBwaW5nKCk7XHJcbiAgICB0aGlzLnN0YXR1c1ZhbCA9IHJvbGVNYXBwaW5nO1xyXG5cclxuICAgIGlmIChyb2xlTWFwcGluZz8uc3RhdHVzKSB7XHJcbiAgICAgIGNvbnN0IGFsbFJldmlld2VkID0gdGhpcy5hcmVBbGxJdGVtc1Jldmlld2VkKHJvbGVNYXBwaW5nKTtcclxuICAgICAgaWYgKHJvbGVNYXBwaW5nLnN0YXR1cyA9PT0gJ0luLVByb2dyZXNzJykge1xyXG4gICAgICAgIHRoaXMuY2xvc2VCdG4gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY2xvc2VEaXNhYmxlZCA9ICFhbGxSZXZpZXdlZDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmNsb3NlQnRuID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jbG9zZURpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHJvbGVNYXBwaW5nLnN0YXR1czsgLy8gZS5nLiBcIk9wZW5cIiwgXCJJbi1Qcm9ncmVzc1wiLCBcIkNsb3NlZFwiXHJcbiAgICB9XHJcblxyXG4gICAgLy8gRmFsbGJhY2s6IHRpY2tldCBzdGF0dXNcclxuICAgIHRoaXMuY2xvc2VCdG4gPSBmYWxzZTtcclxuICAgIHRoaXMuY2xvc2VEaXNhYmxlZCA9IHRydWU7XHJcbiAgICByZXR1cm4gdGhpcy50aWNrZXREYXRhPy5zdGF0dXMgfHwgJy0tJztcclxuICB9XHJcbiAgYXBwcm92ZXJDbG9zZWQ6IGFueSA9IGZhbHNlO1xyXG4gIGdldEN1cnJlbnRSb2xlTWFwcGluZygpOiBhbnkge1xyXG4gICAgaWYgKCF0aGlzLmZvb3RmYWxsVGlja2V0c0RhdGEgfHwgIXRoaXMuZm9vdGZhbGxUaWNrZXRzRGF0YS5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGFwcHJvdmVyTWFwcGluZzogYW55ID0gbnVsbDtcclxuICAgIGxldCByZXZpZXdlck1hcHBpbmc6IGFueSA9IG51bGw7XHJcbiAgICBsZXQgdGFuZ29NYXBwaW5nOiBhbnkgPSBudWxsO1xyXG4gICAgbGV0IGhhc0Nsb3NlZEFwcHJvdmUgPSBmYWxzZTsgICAvLyDwn5GIIHRyYWNrIG92ZXJhbGwgY29uZGl0aW9uXHJcblxyXG4gICAgZm9yIChjb25zdCB0aWNrZXQgb2YgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhKSB7XHJcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHRpY2tldD8uX3NvdXJjZTtcclxuICAgICAgY29uc3QgbWFwcGluZ0xpc3QgPSBzb3VyY2U/Lm1hcHBpbmdJbmZvIHx8IFtdO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBtIG9mIG1hcHBpbmdMaXN0KSB7XHJcblxyXG4gICAgICAgIC8vIPCfkYcgb3ZlcmFsbCBjaGVjayBmb3IgYXJyb3dzaG93IChhcHByb3ZlICsgQ2xvc2VkKVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIG0/LnR5cGUgPT09ICdhcHByb3ZlJyAmJlxyXG4gICAgICAgICAgbT8uc3RhdHVzPy50b0xvd2VyQ2FzZSgpID09PSAnY2xvc2VkJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5hcHByb3ZlckNsb3NlZCA9IGhhc0Nsb3NlZEFwcHJvdmUgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5hcnJvd3Nob3cgPSAhaGFzQ2xvc2VkQXBwcm92ZTtcclxuICAgICAgICB9IFxyXG5cclxuICAgICAgICBpZiAobT8udHlwZSA9PT0gJ3RhbmdvcmV2aWV3JyAmJiBtPy5yZXZpc2VkRGV0YWlsPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRhbmdvTWFwcGluZyA9IG07ICAgICAgICAgIC8vIGxhc3QgdGFuZ28gd2luc1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG0/LnR5cGUgPT09ICdhcHByb3ZlJyAmJiBtPy5yZXZpc2VkRGV0YWlsPy5sZW5ndGgpIHtcclxuICAgICAgICAgIGFwcHJvdmVyTWFwcGluZyA9IG07ICAgICAgIC8vIGxhc3QgYXBwcm92ZSB3aW5zXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobT8udHlwZSA9PT0gJ3JldmlldycgJiYgbT8ucmV2aXNlZERldGFpbD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZXZpZXdlck1hcHBpbmcgPSBtOyAgICAgICAvLyBsYXN0IHJldmlldyB3aW5zXHJcbiAgICAgICAgICB0aGlzLmNsb3NlQnRuID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuY2xvc2VEaXNhYmxlZCA9ZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g8J+RhyBzZXQgYXJyb3dzaG93IGJhc2VkIG9uIG92ZXJhbGwgYXJyYXkgcmVzdWx0XHJcbiAgICAvLyA9PiBmYWxzZSBpZiBhbnkgYXBwcm92ZStDbG9zZWQgZm91bmQsIHRydWUgb3RoZXJ3aXNlXHJcbiAgICAvLyDwn5S5IDEpIFRhbmdvIGhhcyBoaWdoZXN0IHByaW9yaXR5IOKAkyBpZiBwcmVzZW50LCBpZ25vcmUgb3RoZXJzXHJcbiAgICBpZiAodGFuZ29NYXBwaW5nKSB7XHJcbiAgICAgIHJldHVybiB0YW5nb01hcHBpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g8J+UuSAyKSBUaGVuIGFwcHJvdmVyIC8gcmV2aWV3ZXIgYmFzZWQgb24gYWNjZXNzXHJcbiAgICBpZiAodGhpcy5oYXNBcHByb3ZlckFjY2VzcyAmJiBhcHByb3Zlck1hcHBpbmcpIHtcclxuICAgICAgcmV0dXJuIGFwcHJvdmVyTWFwcGluZztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5oYXNSZXZpZXdlckFjY2VzcyAmJiByZXZpZXdlck1hcHBpbmcpIHtcclxuICAgICAgcmV0dXJuIHJldmlld2VyTWFwcGluZztcclxuICAgIH1cclxuXHJcbiAgICAvLyDwn5S5IDMpIEZhbGxiYWNrIGlmIG5vdGhpbmcgZm91bmRcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgZGF0ZWNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQuc3RhcnREYXRlICYmIGV2ZW50LmVuZERhdGUpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuZGF5anMoZXZlbnQuc3RhcnREYXRlKS5pc1ZhbGlkKCkgJiZcclxuICAgICAgICB0aGlzLmRheWpzKGV2ZW50LmVuZERhdGUpLmlzVmFsaWQoKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLnN0YXJ0RGF0ZSA9IGV2ZW50LnN0YXJ0RGF0ZVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UuZW5kRGF0ZSA9IGV2ZW50LmVuZERhdGVcclxuICAgICAgICB2YXIgZGF0ZXRpbWUgPSB7XHJcbiAgICAgICAgICBzdGFydERhdGU6IHRoaXMuZGF5anMoZXZlbnQuc3RhcnREYXRlLCBcIkRELU1NLVlZWVlcIikuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSxcclxuICAgICAgICAgIGVuZERhdGU6IHRoaXMuZGF5anMoZXZlbnQuZW5kRGF0ZSwgXCJERC1NTS1ZWVlZXCIpLmZvcm1hdChcIllZWVktTU0tRERcIiksXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdHVzQmFkZ2VDbGFzcyhzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBtYXA6IGFueSA9IHtcclxuICAgICAgJ09wZW4nOiAnYmFkZ2UtbGlnaHQtd2FybmluZycsXHJcbiAgICAgICdJbi1Qcm9ncmVzcyc6ICdiYWRnZS1saWdodC1wcmltYXJ5JyxcclxuICAgICAgJ1VuZGVyIHRhbmdvcmV2aWV3JzogJ2JhZGdlLWxpZ2h0LXByaW1hcnknLFxyXG4gICAgICAnVGFuZ28gcmV2aWV3IGRvbmUnOiAnYmFkZ2UtbGlnaHQtcHJpbWFyeScsXHJcbiAgICAgICdDbG9zZWQnOiAnYmFkZ2Utc2Vjb25kYXJ5JyxcclxuICAgICAgJ1BlbmRpbmcnOiAnYmFkZ2UtbGlnaHQtd2FybmluZycsXHJcbiAgICAgICdSZXZpZXdlci1DbG9zZWQnOiAnYmFkZ2UtbGlnaHQtd2FybmluZycsXHJcbiAgICAgICdSZWplY3RlZCc6ICdiYWRnZS1saWdodC1kYW5nZXInLFxyXG4gICAgICAnUmFpc2VkJzogJ2JhZGdlLWxpZ2h0LWluZm8nXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBtYXBbc3RhdHVzXSB8fCAnYmFkZ2UtbGlnaHQtZGFyayc7IC8vIGZhbGxiYWNrXHJcbiAgfVxyXG5cclxuICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhOiBhbnk7XHJcbiAgZ2V0VGlja2V0U3VtbWFyeSgpIHtcclxuICAgIHRoaXMuc2VydmljZVxyXG4gICAgICAuZ2V0VGlja2V0U3VtbWFyeUFwaShcclxuICAgICAgICB0aGlzLmZvb3RmYWxsTGlzdF9yZXEuY2xpZW50LFxyXG4gICAgICAgIHRoaXMuZm9vdGZhbGxMaXN0X3JlcS5mcm9tRGF0ZSxcclxuICAgICAgICB0aGlzLmZvb3RmYWxsTGlzdF9yZXEudG9EYXRlXHJcbiAgICAgIClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzPy5kYXRhICYmIHJlcz8uZGF0YT8ucmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YSA9IHJlcz8uZGF0YT8ucmVzdWx0O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRGb290ZmFsbFN1bW1hcnlEYXRhID0gW107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdldEZvb3RmYWxsU3VtbWFyeURhdGEgPSBbXTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdldEZvb3RmYWxsU3VtbWFyeURhdGEubGVuZ3RoID09PSAwO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIG9mZnNldCA9IDA7XHJcbiAgbGltaXQgPSAxMDtcclxuICBpc0V4cG9ydDogYW55ID0gZmFsc2U7XHJcbiAgZm9vdGZhbGxMaXN0RGF0YTogYW55O1xyXG4gIHRvdGFsSXRlbXM6IGFueTtcclxuICBwYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCAzMF07XHJcbiAgbG9hZGluZyA9IHRydWU7XHJcbiAgbm9EYXRhID0gZmFsc2U7XHJcbiAgdGFuZ29UeXBlOiBhbnkgPSBcInN0b3JlXCI7XHJcbiAgZ2V0VGlja2V0TGlzdCh0eXBlOiBhbnkpIHtcclxuICAgIGNvbnNvbGUubG9nKFwi8J+agCB+IFRpY2tldEZvb3RmYWxsTmV3Q29tcG9uZW50IH4gZ2V0VGlja2V0TGlzdCB+IHR5cGU6XCIsIHR5cGUpXHJcblxyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMubm9EYXRhID0gZmFsc2VcclxuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB0aGlzLnNlYXJjaFZhbHVlPy50cmltKCkgfHwgXCJcIjtcclxuICAgIHRoaXMub2Zmc2V0ID0gdGhpcy5vZmZzZXQgfHwgMTtcclxuICAgIHRoaXMubGltaXQgPSB0aGlzLmxpbWl0IHx8IDEwO1xyXG4gICAgdGhpcy5pc0V4cG9ydCA9IGZhbHNlO1xyXG5sZXQgcGVybWlzc2lvblR5cGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuaWYgKHRoaXMudXNlcnNEZXRhaWxzPy51c2VyVHlwZSAhPT0gJ3RhbmdvJykge1xyXG4gIHBlcm1pc3Npb25UeXBlID1cclxuICAgIHRoaXMuaGFzQXBwcm92ZXJBY2Nlc3MgJiYgdGhpcy5zZWxlY3RlZFJvbGUgPT09ICdhcHByb3ZlcidcclxuICAgICAgPyAnYXBwcm92ZSdcclxuICAgICAgOiB0aGlzLmhhc1Jldmlld2VyQWNjZXNzICYmIHRoaXMuc2VsZWN0ZWRSb2xlID09PSAncmV2aWV3ZXInXHJcbiAgICAgID8gJ3JldmlldydcclxuICAgICAgOiBudWxsO1xyXG59IGVsc2Uge1xyXG4gIC8vIGlmIHRhbmdvIHVzZXIgYWxzbyBuZWVkcyBhIHBlcm1pc3Npb25UeXBlOlxyXG4gIHBlcm1pc3Npb25UeXBlID0gJyc7XHJcbn1cclxuXHJcbnRoaXMuc2VydmljZS5nZXRUaWNrZXRMaXN0QXBpKFxyXG4gIHRoaXMuZm9vdGZhbGxMaXN0X3JlcT8uY2xpZW50LFxyXG4gIHRoaXMuZm9vdGZhbGxMaXN0X3JlcT8uZnJvbURhdGUsXHJcbiAgdGhpcy5mb290ZmFsbExpc3RfcmVxPy50b0RhdGUsXHJcbiAgdGhpcy5zZWFyY2hWYWx1ZSxcclxuICB0aGlzLmxpbWl0LFxyXG4gIHRoaXMub2Zmc2V0LFxyXG4gIHRoaXMuaXNFeHBvcnQsXHJcbiAgdGhpcy5zb3J0ZWRDb2x1bW4sXHJcbiAgdGhpcy5zb3J0RGlyZWN0aW9uLFxyXG4gIHR5cGUsXHJcbiAgcGVybWlzc2lvblR5cGVcclxuKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy5ub0RhdGEgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZm9vdGZhbGxMaXN0RGF0YSA9IHJlcz8uZGF0YT8ucmVzdWx0O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb290ZmFsbExpc3REYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlQ29sdW1ucyh0aGlzLmZvb3RmYWxsTGlzdERhdGFbMF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IHJlcz8uZGF0YT8uY291bnQ7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRvdGFsSXRlbXMgPCAxMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNpemVzID0gW3RoaXMudG90YWxJdGVtc107XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCAzMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IDBcclxuICAgICAgICAgICAgdGhpcy5ub0RhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5mb290ZmFsbExpc3REYXRhID0gW107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMubm9EYXRhID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICB0YWJsZUNvbHVtbnM6IGFueVtdID0gW107XHJcbiAgbGFiZWxPdmVycmlkZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICB0aWNrZXRJZDogJ1RpY2tldCBJRCcsXHJcbiAgICBzdG9yZU5hbWU6ICdTdG9yZSBOYW1lJyxcclxuICAgIHN0b3JlSWQ6ICdTdG9yZSBJRCcsICAgICAgICAgICAgICAgICAgIC8vIG9yIGp1c3QgJ1N0b3JlJ1xyXG4gICAgc3RvcmVSZXZpc2VkQWNjdXJhY3k6ICdTdG9yZSAoQWNjdXJhY3klKScsXHJcbiAgICByZXZpZXdlclJldmlzZWRBY2N1cmFjeTogJ1Jldmlld2VyIChBY2N1cmFjeSUpJyxcclxuICAgIGFwcHJvdmVyUmV2aXNlZEFjY3VyYWN5OiAnQXBwcm92ZXIgKEFjY3VyYWN5JSknLFxyXG4gICAgdGFuZ29SZXZpc2VkQWNjdXJhY3k6ICdUYW5nbyAoQWNjdXJhY3klKScsXHJcbiAgICB0aWNrZXRSYWlzZWQ6ICdUaWNrZXQgUmFpc2VkIE9uJyxcclxuICAgIGlzc3VlRGF0ZTogJ0lzc3VlIERhdGUnLFxyXG4gICAgZm9vdGZhbGw6ICdBY3R1YWwgRkYnLFxyXG4gIH07XHJcbiAgaGlkZGVuQ29sdW1uczogc3RyaW5nW10gPSBbXHJcbiAgICAnc3RvcmVOYW1lJywgIC8vIHVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBSRU1PVkUgdGhlIGV4dHJhIFwiU3RvcmUgTmFtZVwiIGNvbHVtblxyXG4gICAgJ3R5cGUnLFxyXG4gIF07XHJcbiAgZ2VuZXJhdGVDb2x1bW5zKGZpcnN0Um93OiBhbnkpIHtcclxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhmaXJzdFJvdylcclxuICAgICAgLmZpbHRlcihrZXkgPT4gIXRoaXMuaGlkZGVuQ29sdW1ucy5pbmNsdWRlcyhrZXkpKTsgIC8vIHJlbW92ZSB1bndhbnRlZCBjb2x1bW5zXHJcblxyXG4gICAgdGhpcy50YWJsZUNvbHVtbnMgPSBrZXlzLm1hcChrZXkgPT4gKHtcclxuICAgICAga2V5LFxyXG4gICAgICAvLyBpZiBrZXkgZXhpc3RzIGluIGxhYmVsT3ZlcnJpZGVzLCB1c2UgdGhhdDsgb3RoZXJ3aXNlIGF1dG8tZm9ybWF0XHJcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsT3ZlcnJpZGVzW2tleV0gPz8gdGhpcy5mb3JtYXRDb2x1bW5OYW1lKGtleSksXHJcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxyXG4gICAgICB0eXBlOiB0aGlzLmRldGVjdENvbHVtblR5cGUgPyB0aGlzLmRldGVjdENvbHVtblR5cGUoa2V5KSA6IG51bGxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGZvcm1hdENvbHVtbk5hbWUoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGtleVxyXG4gICAgICAucmVwbGFjZSgvKFtBLVpdKS9nLCAnICQxJylcclxuICAgICAgLnJlcGxhY2UoL18vZywgJyAnKVxyXG4gICAgICAucmVwbGFjZSgvXFxiXFx3L2csIGMgPT4gYy50b1VwcGVyQ2FzZSgpKTtcclxuICB9XHJcblxyXG4gIGRldGVjdENvbHVtblR5cGUoa2V5OiBzdHJpbmcpIHtcclxuICAgIGlmIChrZXkgPT09ICdzdG9yZU5hbWUnIHx8IGtleSA9PT0gJ3RpY2tldElkJykgcmV0dXJuICdzdG9yZSc7XHJcbiAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2RhdGUnKSB8fCBrZXkgPT09ICd0aWNrZXRSYWlzZWQnKSByZXR1cm4gJ2RhdGUnO1xyXG4gICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdzdGF0dXMnKSkgcmV0dXJuICdzdGF0dXMnO1xyXG4gICAgcmV0dXJuICd0ZXh0JztcclxuICB9XHJcbiAgY3VycmVudFBhZ2U6IGFueSA9IDE7XHJcbiAgcGFnZVNpemU6IGFueSA9IDEwO1xyXG4gIG9uUGFnZUNoYW5nZShwYWdlT2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBOdW1iZXIocGFnZU9mZnNldCk7XHJcbiAgICB0aGlzLm9mZnNldCA9IE51bWJlcihwYWdlT2Zmc2V0KTtcclxuICAgIC8vIHRoaXMubGltaXQgPSAxMDtcclxuICAgIHRoaXMuZ2V0VGlja2V0TGlzdCh0aGlzLnRhbmdvVHlwZSk7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKHBhZ2VTaXplOiBudW1iZXIpIHtcclxuICAgIHRoaXMucGFnZVNpemUgPSBOdW1iZXIocGFnZVNpemUpO1xyXG4gICAgdGhpcy5saW1pdCA9IE51bWJlcihwYWdlU2l6ZSk7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgIHRoaXMub2Zmc2V0ID0gMTtcclxuICAgIHRoaXMuZ2V0VGlja2V0TGlzdCh0aGlzLnRhbmdvVHlwZSk7XHJcbiAgfVxyXG5cclxuICBzZXRwYWdlU2l6ZSgpIHtcclxuICAgIGlmICh0aGlzLnRvdGFsSXRlbXMgPCAxMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50b3RhbEl0ZW1zO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGFnZVNpemU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNlYXJjaERhdGEoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgIHRoaXMub2Zmc2V0ID0gMTtcclxuICAgIHRoaXMubGltaXQgPSAxMDtcclxuICAgIHRoaXMuZ2V0VGlja2V0TGlzdCh0aGlzLnRhbmdvVHlwZSk7XHJcbiAgfVxyXG4gIHN0b3JlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZSA9IHsgc3RvcmVJZDogZXZlbnQuc3RvcmVJZCwgc3RvcmVOYW1lOiBldmVudC5zdG9yZU5hbWUgfVxyXG4gICAgY29uc29sZS5sb2coXCLwn5qAIH4gVGlja2V0Rm9vdGZhbGxOZXdDb21wb25lbnQgfiBzdG9yZUNoYW5nZSB+IHRoaXMuc2VsZWN0ZWRTdG9yZTpcIiwgdGhpcy5zZWxlY3RlZERhdGVSYW5nZS5zdGFydERhdGUsIHRoaXMuZGF5anModGhpcy5zZWxlY3RlZERhdGVSYW5nZS5zdGFydERhdGUsIFwiREQtTU0tWVlZWVwiLCB0cnVlKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpKVxyXG4gICAgdGhpcy5zZXJ2aWNlXHJcbiAgICAgIC5nZXRmb290ZmFsbGNvdW50KHtcclxuICAgICAgICBcInN0b3JlSWRcIjogdGhpcy5zZWxlY3RlZFN0b3JlPy5zdG9yZUlkLFxyXG4gICAgICAgIFwiRGF0ZVwiOiB0aGlzLmRheWpzKHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2Uuc3RhcnREYXRlLCBcIkRELU1NLVlZWVlcIikuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSxcclxuICAgICAgfSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMuZGF0YSlcclxuICAgICAgICAgICAgdGhpcy5mb290ZmFsbGNvdW50ID0gcmVzPy5kYXRhWzBdPy5mb290ZmFsbENvdW50XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUF1ZGl0ID0gZmFsc2VcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG5cclxuICB9XHJcbiAgb25TdGFydERhdGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF5anMoZXZlbnQuc3RhcnREYXRlKS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy5pc0N1c3RvbURhdGUgPSAobTogZGF5anMuRGF5anMpID0+IHtcclxuICAgICAgICBjb25zdCBpc1ZhbGlkRGF0ZSA9IG0gPiB0aGlzLmRheWpzKCkgfHwgbSA+IHRoaXMuZGF5anMoZXZlbnQuc3RhcnREYXRlLmFkZCg5MCwgJ2RheXMnKSk7XHJcbiAgICAgICAgcmV0dXJuIGlzVmFsaWREYXRlID8gJ2ludmFsaWQtZGF0ZScgOiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBjcmVhdGVJbnRlcm5hbHRpY2tldCgpIHtcclxuXHJcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5pbnRlcm5hbHRpY2tldClcclxuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coXCLwn5qAIH4gVGlja2V0Rm9vdGZhbGxOZXdDb21wb25lbnQgfiBjcmVhdGVJbnRlcm5hbHRpY2tldCB+IHJlc3VsdC5pc0NvbmZpcm1lZDpcIiwgcmVzdWx0KVxyXG4gICAgICBpZiAocmVzdWx0ID09PSAnaXNDb25maXJtZWQnKSB7XHJcbiAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgIFwic3RvcmVJZFwiOiB0aGlzLnNlbGVjdGVkU3RvcmU/LnN0b3JlSWQsXHJcbiAgICAgICAgICBcImRhdGVTdHJpbmdcIjogZGF5anModGhpcy5zZWxlY3RlZERhdGVSYW5nZS5zdGFydERhdGUsIFwiREQtTU0tWVlZWVwiKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpLFxyXG4gICAgICAgICAgXCJzdG9yZU5hbWVcIjogdGhpcy5zZWxlY3RlZFN0b3JlPy5zdG9yZU5hbWUsXHJcbiAgICAgICAgICBcInRpY2tldE5hbWVcIjogXCJmb290ZmFsbC1kaXJlY3RvcnlcIixcclxuICAgICAgICAgIFwiZm9vdGZhbGxDb3VudFwiOiB0aGlzLmZvb3RmYWxsY291bnQsXHJcbiAgICAgICAgICBcImNsaWVudElkXCI6IHRoaXMuaGVhZGVyRmlsdGVycz8uY2xpZW50LFxyXG4gICAgICAgICAgXCJzdGF0dXNcIjogXCJSYWlzZWRcIixcclxuICAgICAgICAgIFwiY29tbWVudHNcIjogXCJcIlxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgICAgIC5DcmVhdGVpbnRlcm5hbFRpY2tldEFwaShvYmopXHJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlcyAmJiByZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoXCJUaWNrZXQgY3JlYXRlZCBzdWNjZXNzZnVsbHlcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpcm1DbG9zZUNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgICAgdG90YWxmaWxlczogdGhpcy5mb290ZmFsbGNvdW50LFxyXG4gICAgICAgICAgICAgICAgICBmaWxlZGV0YWlsczoge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckZpbHRlcnM/LmNsaWVudCxcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZUlkOiB0aGlzLnNlbGVjdGVkU3RvcmU/LnN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgRGF0ZTogZGF5anModGhpcy5zZWxlY3RlZERhdGVSYW5nZS5zdGFydERhdGUsIFwiREQtTU0tWVlZWVwiKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIGF1ZGl0SWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcklkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG5leHRUb2tlbjogXCJcIixcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgYXVkaXRJZDogXCJcIixcclxuICAgICAgICAgICAgICAgICAgc3RvcmVkZXRhaWxzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVOYW1lOiB0aGlzLnNlbGVjdGVkU3RvcmU/LnN0b3JlTmFtZVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInRvdGFsZmlsZXNcIiwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInRpY2tldFR5cGVcIiwgXCJpbnRlcm5hbFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ID0gJ3RpY2tldE1ldGhvZCc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcvbWFuYWdlL3RpY2tldHMvYXVkaXQnKVxyXG5cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiRXJyb3IgY2xvc2luZyB0aWNrZXRcIik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3JNc2cgPVxyXG4gICAgICAgICAgICAgICAgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fFxyXG4gICAgICAgICAgICAgICAgZXJyPy5lcnJvcj8uZXJyb3IgfHxcclxuICAgICAgICAgICAgICAgIGVycj8uZXJyb3IgfHxcclxuICAgICAgICAgICAgICAgIGVycj8ubWVzc2FnZSB8fFxyXG4gICAgICAgICAgICAgICAgXCJFcnJvciBjbG9zaW5nIHRpY2tldFwiO1xyXG4gICAgICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnJvck1zZyk7XHJcbiAgICAgICAgICAgICAgdGhpcy5pc0NoZWNrYm94RW5hYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLmNsb3NlQnRuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB0aGlzLmNsb3NlRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG5cclxuXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG5cclxuXHJcblxyXG4gIH1cclxuICBleHBvcnRYTFNYKCkge1xyXG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHRoaXMuc2VhcmNoVmFsdWU/LnRyaW0oKSB8fCBcIlwiO1xyXG4gICAgdGhpcy5vZmZzZXQgPSAxO1xyXG4gICAgdGhpcy5saW1pdCA9IDEwMDAwO1xyXG4gICAgdGhpcy5pc0V4cG9ydCA9IHRydWU7XHJcbiAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgLmdldFRpY2tldExpc3RFeHBvcnRBcGkoXHJcbiAgICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLmNsaWVudCxcclxuICAgICAgICB0aGlzLmZvb3RmYWxsTGlzdF9yZXEuZnJvbURhdGUsXHJcbiAgICAgICAgdGhpcy5mb290ZmFsbExpc3RfcmVxLnRvRGF0ZSxcclxuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlLFxyXG4gICAgICAgIHRoaXMubGltaXQsXHJcbiAgICAgICAgdGhpcy5vZmZzZXQsXHJcbiAgICAgICAgdGhpcy5pc0V4cG9ydCxcclxuICAgICAgICB0aGlzLnNvcnRlZENvbHVtbixcclxuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb24sXHJcbiAgICAgICAgdGhpcy50YW5nb1R5cGVcclxuICAgICAgKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5leGNlbFNlcnZpY2Uuc2F2ZUFzRXhjZWxGaWxlKHJlcywgXCJmb290ZmFsbCBkaXJlY3RvcnkgdGlja2V0IFwiKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcclxuICAgICAgICAgICAgXCJFcnJvciBleHBvcnRpbmcgZGF0YTpcIiArIGVyci5lcnJvciA/IGVyci5lcnJvciA6IGVyci5tZXNzYWdlXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25Tb3J0KGNvbHVtbjogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5zb3J0ZWRDb2x1bW4gPT09IGNvbHVtbikge1xyXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSB0aGlzLnNvcnREaXJlY3Rpb24gPT09IDEgPyAtMSA6IDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNvcnRlZENvbHVtbiA9IGNvbHVtbjtcclxuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gMTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0VGlja2V0TGlzdCh0aGlzLnRhbmdvVHlwZSk7XHJcbiAgfVxyXG4gIHNlbGVjdCA9IFwidGlja2V0TGlzdFwiO1xyXG4gIHRpY2tldERhdGE6IGFueTtcclxuXHJcbiAgc3RhcnRBdWRpdCgpIHtcclxuICAgIGxldCBpbnB1dCA9IHtcclxuICAgICAgc3RvcmVJZDogdGhpcy50aWNrZXREYXRhPy5zdG9yZUlkLFxyXG4gICAgICBkYXRlU3RyaW5nOiB0aGlzLnRpY2tldERhdGE/Lmlzc3VlRGF0ZSxcclxuICAgIH1cclxuICAgIHRoaXMuc2VydmljZVxyXG4gICAgICAuY2hlY2tUaWNrZXRFeGlzdHMoaW5wdXQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzPy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzLmRhdGEpXHJcbiAgICAgICAgICAgIGxldCB0aWNrZXRMaXN0ID0gcmVzPy5kYXRhXHJcbiAgICAgICAgICAgIGxldCBmaW5kVGFuZ290aWNrZXQgPSB0aWNrZXRMaXN0LmZpbHRlcigoZGF0YTogYW55KSA9PiBkYXRhPy5fc291cmNlPy50eXBlID09PSAnaW50ZXJuYWwnICYmIGRhdGE/Ll9zb3VyY2U/LnN0YXR1cyA9PT0gXCJDbG9zZWRcIilcclxuICAgICAgICAgICAgbGV0IGZpbmRzdG9yZXRpY2tldCA9IHRpY2tldExpc3QuZmlsdGVyKChkYXRhOiBhbnkpID0+IGRhdGE/Ll9zb3VyY2U/LnR5cGUgPT09ICdzdG9yZScgJiYgZGF0YT8uX3NvdXJjZT8uc3RhdHVzICE9IFwiQ2xvc2VkXCIpXHJcblxyXG4gICAgICAgICAgICBpZiAoZmluZFRhbmdvdGlja2V0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oVGlja2V0Y2xvc2Vwb3B1cENvbXBvbmVudCwge1xyXG4gICAgICAgICAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzaXplOiBcIm1kXCIsXHJcbiAgICAgICAgICAgICAgICBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgYmFja2Ryb3A6IFwic3RhdGljXCIsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGFuZ29UaWNrZXQgPSBmaW5kVGFuZ290aWNrZXRbMF0uX3NvdXJjZTtcclxuICAgICAgICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5zdG9yZVRpY2tldCA9IGZpbmRzdG9yZXRpY2tldFswXS5fc291cmNlO1xyXG4gICAgICAgICAgICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnR5cGUgPT09ICdtZXJnZScpIHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLwn5qAIH4gVGlja2V0Rm9vdGZhbGxOZXdDb21wb25lbnQgfiBzdGFydEF1ZGl0IH4gZmluZFRhbmdvdGlja2V0OlwiLCBmaW5kVGFuZ290aWNrZXQpXHJcblxyXG4gICAgICAgICAgICAgICAgICBsZXQgb2JqID0gZmluZFRhbmdvdGlja2V0WzBdPy5fc291cmNlXHJcbiAgICAgICAgICAgICAgICAgIGlmIChvYmogJiYgb2JqPy5tYXBwaW5nSW5mby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcERhdGEgPSBvYmoubWFwcGluZ0luZm8uZmlsdGVyKChkYXRhOiBhbnkpID0+IGRhdGEudHlwZSA9PT0gXCJ0YW5nb3Jldmlld1wiKVswXVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi8J+agCB+IFRpY2tldEZvb3RmYWxsTmV3Q29tcG9uZW50IH4gc3RhcnRBdWRpdCB+IG1hcERhdGE6XCIsIG1hcERhdGEpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgc3RvcmVJZDogdGhpcy50aWNrZXREYXRhPy5zdG9yZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJkYXRlU3RyaW5nXCI6IHRoaXMudGlja2V0RGF0YT8uaXNzdWVEYXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdGlja2V0VHlwZTogJ3N0b3JlJyxcclxuICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdJbmZvOiBtYXBEYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi8J+agCB+IFRpY2tldEZvb3RmYWxsTmV3Q29tcG9uZW50IH4gc3RhcnRBdWRpdCB+IHBheWxvYWQ6XCIsIHBheWxvYWQpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdWRpdHNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAgIC5zYXZlYXVkaXQocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAmJiByZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL3RpY2tldHMnXSwgeyBxdWVyeVBhcmFtczogeyB0eXBlOiAnZm9vdGZhbGwnIH0gfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnR5cGUgPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbGZpbGVzOiB0aGlzLnRpY2tldERhdGE/LmZvb3RmYWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVkZXRhaWxzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJGaWx0ZXJzPy5jbGllbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdG9yZUlkOiB0aGlzLnRpY2tldERhdGE/LnN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBEYXRlOiB0aGlzLnRpY2tldERhdGE/Lmlzc3VlRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgIGF1ZGl0SWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0VG9rZW46IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBhdWRpdElkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlZGV0YWlsczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgc3RvcmVOYW1lOiB0aGlzLnRpY2tldERhdGE/LnN0b3JlTmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcInRvdGFsZmlsZXNcIiwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwidGlja2V0VHlwZVwiLCB0aGlzLnRhbmdvVHlwZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCA9ICd0aWNrZXRNZXRob2QnO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcvbWFuYWdlL3RpY2tldHMvYXVkaXQnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbGZpbGVzOiB0aGlzLnRpY2tldERhdGE/LmZvb3RmYWxsLFxyXG4gICAgICAgICAgICAgICAgZmlsZWRldGFpbHM6IHtcclxuICAgICAgICAgICAgICAgICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRmlsdGVycz8uY2xpZW50LFxyXG4gICAgICAgICAgICAgICAgICBzdG9yZUlkOiB0aGlzLnRpY2tldERhdGE/LnN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICAgIERhdGU6IHRoaXMudGlja2V0RGF0YT8uaXNzdWVEYXRlLFxyXG4gICAgICAgICAgICAgICAgICBhdWRpdElkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICB1c2VySWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgIG5leHRUb2tlbjogXCJcIixcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBhdWRpdElkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgc3RvcmVkZXRhaWxzOiB7XHJcbiAgICAgICAgICAgICAgICAgIHN0b3JlTmFtZTogdGhpcy50aWNrZXREYXRhPy5zdG9yZU5hbWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJ0b3RhbGZpbGVzXCIsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwidGlja2V0VHlwZVwiLCB0aGlzLnRhbmdvVHlwZSk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ID0gJ3RpY2tldE1ldGhvZCc7XHJcbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnL21hbmFnZS90aWNrZXRzL2F1ZGl0JylcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcblxyXG5cclxuICAgIHJldHVyblxyXG5cclxuXHJcbiAgfVxyXG5cclxuICBiYWNrVG9OYXZpZ2F0aW9uKCkge1xyXG4gICAgdGhpcy5zZWxlY3QgPSBcInRpY2tldExpc3RcIjtcclxuICAgIHRoaXMuZm9vdGZhbGxUaWNrZXRzRGF0YSA9IFtdO1xyXG4gICAgdGhpcy5nZXRUaWNrZXRTdW1tYXJ5KCk7XHJcbiAgICB0aGlzLmdldFRpY2tldExpc3QodGhpcy50YW5nb1R5cGUpO1xyXG4gICAgdGhpcy5jbG9zZUJ0biA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0NoZWNrYm94RW5hYmxlID0gZmFsc2U7XHJcbiAgfVxyXG4gIGlzQ29sbGFwc2VkID0gZmFsc2U7XHJcbiAgdG9nZ2xlU2lkZWJhcigpIHtcclxuICAgIHRoaXMuaXNDb2xsYXBzZWQgPSAhdGhpcy5pc0NvbGxhcHNlZDtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUZpbHRlcigpIHtcclxuICAgIHRoaXMuaXNGaWx0ZXJPcGVuID0gIXRoaXMuaXNGaWx0ZXJPcGVuO1xyXG4gIH1cclxuICBpc0ZpbHRlck9wZW4gPSBmYWxzZTsgLy8gY29udHJvbHMgc2hvdy9oaWRlIHBhbmVsXHJcbiAgZmlsdGVyRm9ybTogRm9ybUdyb3VwO1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBuZXdGb3JtKCkge1xyXG4gICAgdGhpcy5maWx0ZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHN0YXR1czogW1wiXCJdLFxyXG4gICAgICByZXZpZXdlckNvbmRpdGlvbjogW1wiXCJdLFxyXG4gICAgICByZXZpZXdlclZhbHVlOiBbXCJcIl0sXHJcbiAgICAgIGFwcHJvdmVyQ29uZGl0aW9uOiBbXCJcIl0sXHJcbiAgICAgIGFwcHJvdmVyVmFsdWU6IFtcIlwiXSxcclxuICAgICAgdGFuZ29Db25kaXRpb246IFtcIlwiXSxcclxuICAgICAgdGFuZ29WYWx1ZTogW1wiXCJdLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhcHBseUZpbHRlcigpIHtcclxuICAgIHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQodGhpcy5maWx0ZXJGb3JtLnZhbHVlKTtcclxuICAgIHRoaXMuaXNGaWx0ZXJPcGVuID0gZmFsc2U7IC8vIGNsb3NlIGFmdGVyIGFwcGx5XHJcbiAgfVxyXG5cclxuICByZXNldEZpbHRlcigpIHtcclxuICAgIHRoaXMuZmlsdGVyRm9ybS5yZXNldCgpO1xyXG4gICAgdGhpcy5maWx0ZXJDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlckZvcm0udmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLmlzRmlsdGVyT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuICBTdG9yZXNTZWFyY2hWYWx1ZTogYW55ID0gXCJcIjtcclxuICBzb3J0ZWRDb2x1bW4xOiBzdHJpbmcgPSBcIlwiO1xyXG4gIHNvcnREaXJlY3Rpb24xOiBudW1iZXIgPSAxO1xyXG5cclxuICBzZWFyY2hTdG9yZXNEYXRhKCkgeyB9XHJcbiAgc29ydFZhbHVlKGNvbHVtbjogc3RyaW5nKSB7IH1cclxuICBvcGVuVGlja2V0c0xpc3Q6IGFueVtdID0gW107XHJcbiAgc2VsZWN0ZWRTdG9yZXM6IGFueVtdID0gW107IC8vIGhvbGRzIHNlbGVjdGVkIHJvd3NcclxuICBhbGxTZWxlY3RlZCA9IGZhbHNlOyAvLyB0b3AgXCJTZWxlY3QgQWxsXCIgY2hlY2tib3hcclxuXHJcbiAgZ2V0IHN0b3JlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLm9wZW5UaWNrZXRzTGlzdD8ubGVuZ3RoIHx8IDA7XHJcbiAgfVxyXG5cclxuICAvLyBjaGVjayBpZiBhIHJvdyBpcyBzZWxlY3RlZCAodXNlZCBpbiB0ZW1wbGF0ZSlcclxuICBpc1NlbGVjdGVkKHN0b3JlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkU3RvcmVzLmluY2x1ZGVzKHN0b3JlKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8gd2hlbiB1c2VyIGNsaWNrcyBvbiBhIHNpbmdsZSBzdG9yZSBjaGVja2JveFxyXG4gIHRvZ2dsZVN0b3JlU2VsZWN0aW9uKHN0b3JlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzU2VsZWN0ZWQoc3RvcmUpKSB7XHJcbiAgICAgIC8vIHJlbW92ZVxyXG4gICAgICB0aGlzLnNlbGVjdGVkU3RvcmVzID0gdGhpcy5zZWxlY3RlZFN0b3Jlcy5maWx0ZXIoKHMpID0+IHMgIT09IHN0b3JlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGFkZCAoaWYgeW91IHdhbnQgc2luZ2xlIHNlbGVjdCwgdXNlOiB0aGlzLnNlbGVjdGVkU3RvcmVzID0gW3N0b3JlXTspXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZXMgPSBbLi4udGhpcy5zZWxlY3RlZFN0b3Jlcywgc3RvcmVdO1xyXG5cclxuICAgICAgLy8gY2FsbCBBUEkgZm9yIHRoaXMgc3RvcmVcclxuICAgICAgLy8gdGhpcy5oYW5kbGVTdG9yZVNlbGVjdGVkKHN0b3JlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBrZWVwIFwiU2VsZWN0IEFsbFwiIGluIHN5bmNcclxuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPVxyXG4gICAgICB0aGlzLnNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gdGhpcy5vcGVuVGlja2V0c0xpc3QubGVuZ3RoICYmXHJcbiAgICAgIHRoaXMub3BlblRpY2tldHNMaXN0Lmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICAvLyB3aGVuIHVzZXIgY2xpY2tzIG9uIFwiU2VsZWN0IEFsbFwiXHJcbiAgdG9nZ2xlU2VsZWN0QWxsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYWxsU2VsZWN0ZWQpIHtcclxuICAgICAgLy8gdW5zZWxlY3QgZXZlcnl0aGluZ1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU3RvcmVzID0gW107XHJcbiAgICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHNlbGVjdCBhbGwgdmlzaWJsZSBzdG9yZXNcclxuICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlcyA9IFsuLi50aGlzLm9wZW5UaWNrZXRzTGlzdF07XHJcbiAgICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAvLyB1c3VhbGx5IG5vIG5lZWQgdG8gY2FsbCBkZXRhaWwgQVBJIGhlcmUsIGJ1dCB5b3UgY2FuIGlmIHlvdSB3YW50XHJcbiAgICB9XHJcbiAgfVxyXG50aWNrZXRWaWV3Q2hhbmdlcyhzdG9yZTogYW55KSB7XHJcbiAgdGhpcy5kYXRhU3RvcmVWaWV3KHN0b3JlKTtcclxuXHJcbiAgLy8gc2luZ2xlIHNlbGVjdGlvbiBvbiByb3cgY2xpY2tcclxuICB0aGlzLnNlbGVjdGVkU3RvcmVzID0gW3N0b3JlXTtcclxuXHJcbiAgdGhpcy5hbGxTZWxlY3RlZCA9XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gdGhpcy5vcGVuVGlja2V0c0xpc3QubGVuZ3RoICYmXHJcbiAgICB0aGlzLm9wZW5UaWNrZXRzTGlzdC5sZW5ndGggPiAwO1xyXG59XHJcblxyXG4gIG9yaWdpbmFsSW1hZ2U6IGFueSA9IHtcclxuICAgIGlkOiA0LFxyXG4gICAgZW50cnlUaW1lOiBcIjEwOjAwIEFNXCIsXHJcbiAgfTtcclxuICB0aWNrZXQ6IGFueSA9IFtdO1xyXG4gIGltYWdlVXJsOiBhbnk7XHJcbiAgZ2V0Rm9ybWF0dGVkRW50cnlUaW1lKGVudHJ5VGltZTogYW55KSB7XHJcbiAgICBpZiAoIWVudHJ5VGltZSkgcmV0dXJuIFwiLVwiO1xyXG4gICAgY29uc3QgW2hvdXJzLCBtaW51dGVzLCBzZWNvbmRzXSA9IGVudHJ5VGltZS5zcGxpdChcIjpcIikubWFwKE51bWJlcik7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgIGRhdGUuc2V0SG91cnMoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpO1xyXG4gICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVUaW1lU3RyaW5nKFwiZW4tVVNcIiwge1xyXG4gICAgICBob3VyOiBcIjItZGlnaXRcIixcclxuICAgICAgbWludXRlOiBcIjItZGlnaXRcIixcclxuICAgICAgLy8gc2Vjb25kOiAnMi1kaWdpdCcsXHJcbiAgICAgIGhvdXIxMjogdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuICBkdXBsaWNhdGVzOiBhbnk7XHJcblxyXG4gIC8vIGtleSA9IHBhcmVudCBvcmlnaW5hbC50ZW1wSWQsIHZhbHVlID0gYXJyYXkgb2Ygc2VsZWN0ZWQgZHVwbGljYXRlIHRlbXBJZHNcclxuICBzZWxlY3RlZER1cGxpY2F0ZXNCeVBhcmVudDogeyBbcGFyZW50SWQ6IG51bWJlcl06IG51bWJlcltdIH0gPSB7fTtcclxuXHJcbiAgLy8gaXMgb25lIGR1cGxpY2F0ZSBzZWxlY3RlZD9cclxuICBpc0R1cGxpY2F0ZVNlbGVjdGVkKHBhcmVudElkOiBudW1iZXIsIGR1cGxpY2F0ZUlkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnRbcGFyZW50SWRdPy5pbmNsdWRlcyhkdXBsaWNhdGVJZCkgfHwgZmFsc2VcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBzZWxlY3QgLyB1bnNlbGVjdCBzaW5nbGUgZHVwbGljYXRlXHJcbiAgb25EdXBsaWNhdGVDaGVja2JveENoYW5nZShcclxuICAgIHBhcmVudElkOiBudW1iZXIsXHJcbiAgICBkdXBsaWNhdGVJZDogbnVtYmVyLFxyXG4gICAgZXZlbnQ6IEV2ZW50XHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBjaGVja2VkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG5cclxuICAgIGlmICghdGhpcy5zZWxlY3RlZER1cGxpY2F0ZXNCeVBhcmVudFtwYXJlbnRJZF0pIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZER1cGxpY2F0ZXNCeVBhcmVudFtwYXJlbnRJZF0gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5zZWxlY3RlZER1cGxpY2F0ZXNCeVBhcmVudFtwYXJlbnRJZF07XHJcblxyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgaWYgKCFsaXN0LmluY2x1ZGVzKGR1cGxpY2F0ZUlkKSkge1xyXG4gICAgICAgIGxpc3QucHVzaChkdXBsaWNhdGVJZCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnRbcGFyZW50SWRdID0gbGlzdC5maWx0ZXIoXHJcbiAgICAgICAgKGlkKSA9PiBpZCAhPT0gZHVwbGljYXRlSWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlT3ZlcmFsbFNlbGVjdGVkSWRzKCk7XHJcbiAgfVxyXG5cclxuICAvLyBhcmUgKmFsbCogZHVwbGljYXRlcyB1bmRlciB0aGlzIHBhcmVudCBzZWxlY3RlZD9cclxuICBhcmVBbGxEdXBsaWNhdGVzU2VsZWN0ZWQob3JpZ2luYWw6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcGFyZW50SWQgPSBvcmlnaW5hbC50ZW1wSWQ7XHJcbiAgICBjb25zdCBkdXBsaWNhdGVzID0gb3JpZ2luYWw/LmR1cGxpY2F0ZUltYWdlIHx8IFtdO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkRHVwbGljYXRlc0J5UGFyZW50W3BhcmVudElkXSB8fCBbXTtcclxuXHJcbiAgICByZXR1cm4gZHVwbGljYXRlcy5sZW5ndGggPiAwICYmIHNlbGVjdGVkLmxlbmd0aCA9PT0gZHVwbGljYXRlcy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvLyBoYW5kbGUgXCJTZWxlY3QgQWxsXCIgdG9nZ2xlIGZvciB0aGlzIG9yaWdpbmFsXHJcbiAgb25Ub2dnbGVTZWxlY3RBbGxEdXBsaWNhdGVzKG9yaWdpbmFsOiBhbnksIGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcclxuICAgIGNvbnN0IHBhcmVudElkID0gb3JpZ2luYWwudGVtcElkO1xyXG4gICAgY29uc3QgZHVwbGljYXRlcyA9IG9yaWdpbmFsPy5kdXBsaWNhdGVJbWFnZSB8fCBbXTtcclxuXHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRHVwbGljYXRlc0J5UGFyZW50W3BhcmVudElkXSA9IGR1cGxpY2F0ZXMubWFwKFxyXG4gICAgICAgIChkOiBhbnkpID0+IGQudGVtcElkXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRHVwbGljYXRlc0J5UGFyZW50W3BhcmVudElkXSA9IFtdO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVPdmVyYWxsU2VsZWN0ZWRJZHMoKTtcclxuICAgIGNvbnNvbGUubG9nKFwiU2VsZWN0ZWQgZHVwbGljYXRlcyBtYXA6XCIsIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8gY29tbWVudHM6IGFueTtcclxuXHJcbiAgY29tbWVudE1vZGFsKG9iajogYW55KSB7XHJcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRm9vdGZhbGxQb3B1cENvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgICBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgIH0pO1xyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGlja2V0SWQgPSBvYmoudGlja2V0SWQ7XHJcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0KSA9PiB7IH0pO1xyXG4gIH1cclxuXHJcbiAgY29tbWVudHNBY2NvcmRpb25PcGVuID0gZmFsc2U7XHJcblxyXG4gIHRvZ2dsZUNvbW1lbnRzQWNjb3JkaW9uKCkge1xyXG4gICAgdGhpcy5jb21tZW50c0FjY29yZGlvbk9wZW4gPSAhdGhpcy5jb21tZW50c0FjY29yZGlvbk9wZW47XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbmFjdGl2aXR5RGF0YTphbnkgPVtcclxuICAgIHtcclxuICAgIFwiY2F0ZWdvcnlcIjpcImR1cGxpY2F0ZVwiLFxyXG4gICAgXCJ0eXBlXCI6XCJ0YWdnaW5nXCIsXHJcbiAgICAgIFwicGFyZW50XCI6MSxcclxuICAgIFwiY29tbWVudHNcIjpbXHJcbiAgICAge1xyXG4gICAgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VcIjpcImNvbW1uZXRzIG1lc3NhZ2UgdXBkYXRlIGhlcmVcIixcclxuICAgICAgICAgICAgICAgIFwiY3JlYXRlZEJ5RW1haWxcIjogXCJzYW5kZWVwLnBhbEB5b3BtYWlsLmNvbVwiLFxyXG4gICAgICAgIFwiY3JlYXRlZEJ5VXNlck5hbWVcIjogXCJzYW5kZWVwLnBhbFwiLFxyXG4gICAgICAgIFwiY3JlYXRlZEJ5Um9sZVwiOiBcInVzZXJcIlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBcclxuICAgIF1cclxuICB9LFxyXG4gIHtcclxuICAgIFwiY2F0ZWdvcnlcIjpcImR1cGxpY2F0ZVwiLFxyXG4gICAgXCJ0eXBlXCI6XCJyZXZpZXdcIixcclxuICAgIFwiY29tbWVudHNcIjpbXHJcbiAgICAgIHtcclxuICAgICAgICBcInBhcmVudFwiOjEsXHJcbiAgICAgICAgIFwiY2F0ZWdvcnlcIjpcImR1cGxpY2F0ZVwiLFxyXG4gIFwidGFnZ2VkSW1hZ2VzXCI6W1xyXG4gICAgIHtcclxuICAgICAgICAgICAgICAgIFwiaWRcIjogXCIxMS0yODBfMjAyNS0xMi0wMl8xOFwiLFxyXG4gICAgICAgICAgICAgICAgXCJ0ZW1wSWRcIjogOCxcclxuICAgICAgICAgICAgICAgIFwidGltZVJhbmdlXCI6IFwiMDRQTS0wNVBNXCIsXHJcbiAgICAgICAgICAgICAgICBcImVudHJ5VGltZVwiOiBcIjE2OjE3OjU5XCIsXHJcbiAgICAgICAgICAgICAgICBcImV4aXRUaW1lXCI6IFwiMTY6NDc6NTdcIixcclxuICAgICAgICAgICAgICAgIFwiZmlsZVBhdGhcIjogXCIxMS0yODAvMDItMTItMjAyNS8xOF9jdXN0b21lcl9lbnRyeV9mcmFtZS5qcGVnXCIsXHJcbiAgICAgICAgICAgICAgICBcImlzQ2hlY2tlZFwiOiB0cnVlXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgXCJpZFwiOiBcIjExLTI4MF8yMDI1LTEyLTAyXzE4XCIsXHJcbiAgICAgICAgICAgICAgICBcInRlbXBJZFwiOiAxMSxcclxuICAgICAgICAgICAgICAgIFwidGltZVJhbmdlXCI6IFwiMDRQTS0wNVBNXCIsXHJcbiAgICAgICAgICAgICAgICBcImVudHJ5VGltZVwiOiBcIjE2OjE3OjU5XCIsXHJcbiAgICAgICAgICAgICAgICBcImV4aXRUaW1lXCI6IFwiMTY6NDc6NTdcIixcclxuICAgICAgICAgICAgICAgIFwiZmlsZVBhdGhcIjogXCIxMS0yODAvMDItMTItMjAyNS8xOF9jdXN0b21lcl9lbnRyeV9mcmFtZS5qcGVnXCIsXHJcbiAgICAgICAgICAgICAgICBcImlzQ2hlY2tlZFwiOiB0cnVlXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgXCJpZFwiOiBcIjExLTI4MF8yMDI1LTEyLTAyXzE4XCIsXHJcbiAgICAgICAgICAgICAgICBcInRlbXBJZFwiOiAyMSxcclxuICAgICAgICAgICAgICAgIFwidGltZVJhbmdlXCI6IFwiMDRQTS0wNVBNXCIsXHJcbiAgICAgICAgICAgICAgICBcImVudHJ5VGltZVwiOiBcIjE2OjE3OjU5XCIsXHJcbiAgICAgICAgICAgICAgICBcImV4aXRUaW1lXCI6IFwiMTY6NDc6NTdcIixcclxuICAgICAgICAgICAgICAgIFwiZmlsZVBhdGhcIjogXCIxMS0yODAvMDItMTItMjAyNS8xOF9jdXN0b21lcl9lbnRyeV9mcmFtZS5qcGVnXCIsXHJcbiAgICAgICAgICAgICAgICBcImlzQ2hlY2tlZFwiOiB0cnVlXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBcImlkXCI6IFwiMTEtMjgwXzIwMjUtMTItMDJfMThcIixcclxuICAgICAgICAgICAgICAgIFwidGVtcElkXCI6IDExLFxyXG4gICAgICAgICAgICAgICAgXCJ0aW1lUmFuZ2VcIjogXCIwNFBNLTA1UE1cIixcclxuICAgICAgICAgICAgICAgIFwiZW50cnlUaW1lXCI6IFwiMTY6MTc6NTlcIixcclxuICAgICAgICAgICAgICAgIFwiZXhpdFRpbWVcIjogXCIxNjo0Nzo1N1wiLFxyXG4gICAgICAgICAgICAgICAgXCJmaWxlUGF0aFwiOiBcIjExLTI4MC8wMi0xMi0yMDI1LzE4X2N1c3RvbWVyX2VudHJ5X2ZyYW1lLmpwZWdcIixcclxuICAgICAgICAgICAgICAgIFwiaXNDaGVja2VkXCI6IHRydWVcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBcImlkXCI6IFwiMTEtMjgwXzIwMjUtMTItMDJfMThcIixcclxuICAgICAgICAgICAgICAgIFwidGVtcElkXCI6IDIxLFxyXG4gICAgICAgICAgICAgICAgXCJ0aW1lUmFuZ2VcIjogXCIwNFBNLTA1UE1cIixcclxuICAgICAgICAgICAgICAgIFwiZW50cnlUaW1lXCI6IFwiMTY6MTc6NTlcIixcclxuICAgICAgICAgICAgICAgIFwiZXhpdFRpbWVcIjogXCIxNjo0Nzo1N1wiLFxyXG4gICAgICAgICAgICAgICAgXCJmaWxlUGF0aFwiOiBcIjExLTI4MC8wMi0xMi0yMDI1LzE4X2N1c3RvbWVyX2VudHJ5X2ZyYW1lLmpwZWdcIixcclxuICAgICAgICAgICAgICAgIFwiaXNDaGVja2VkXCI6IHRydWVcclxuICAgICAgICAgICAgICB9XHJcbiAgICBdLFxyXG4gICAgICBcImNyZWF0ZWRCeUVtYWlsXCI6IFwic2FuZGVlcC5wYWxAeW9wbWFpbC5jb21cIixcclxuICAgICAgICBcImNyZWF0ZWRCeVVzZXJOYW1lXCI6IFwic2FuZGVlcC5wYWxcIixcclxuICAgICAgICBcImNyZWF0ZWRCeVJvbGVcIjogXCJ1c2VyXCIsXHJcbiAgICAgICAgXCJzdGF0dXNcIjpcImFwcHJvdmVkXCIsXHJcbiAgICAgICAgIFwibWVzc2FnZVwiOlwiY29tbW5ldHMgbWVzc2FnZSB1cGRhdGUgaGVyZVwiXHJcbiAgICAgIH0sXHJcbiAgICAgICB7XHJcbiAgICAgICAgXCJwYXJlbnRcIjoxLFxyXG4gICAgICAgICBcImNhdGVnb3J5XCI6XCJkdXBsaWNhdGVcIixcclxuICBcInRhZ2dlZEltYWdlc1wiOltcclxuICAgICB7XHJcbiAgICAgICAgICAgICAgICBcImlkXCI6IFwiMTEtMjgwXzIwMjUtMTItMDJfMThcIixcclxuICAgICAgICAgICAgICAgIFwidGVtcElkXCI6IDE4LFxyXG4gICAgICAgICAgICAgICAgXCJ0aW1lUmFuZ2VcIjogXCIwNFBNLTA1UE1cIixcclxuICAgICAgICAgICAgICAgIFwiZW50cnlUaW1lXCI6IFwiMTY6MTc6NTlcIixcclxuICAgICAgICAgICAgICAgIFwiZXhpdFRpbWVcIjogXCIxNjo0Nzo1N1wiLFxyXG4gICAgICAgICAgICAgICAgXCJmaWxlUGF0aFwiOiBcIjExLTI4MC8wMi0xMi0yMDI1LzE4X2N1c3RvbWVyX2VudHJ5X2ZyYW1lLmpwZWdcIixcclxuICAgICAgICAgICAgICAgIFwiaXNDaGVja2VkXCI6IHRydWVcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBcImlkXCI6IFwiMTEtMjgwXzIwMjUtMTItMDJfMThcIixcclxuICAgICAgICAgICAgICAgIFwidGVtcElkXCI6IDE5LFxyXG4gICAgICAgICAgICAgICAgXCJ0aW1lUmFuZ2VcIjogXCIwNFBNLTA1UE1cIixcclxuICAgICAgICAgICAgICAgIFwiZW50cnlUaW1lXCI6IFwiMTY6MTc6NTlcIixcclxuICAgICAgICAgICAgICAgIFwiZXhpdFRpbWVcIjogXCIxNjo0Nzo1N1wiLFxyXG4gICAgICAgICAgICAgICAgXCJmaWxlUGF0aFwiOiBcIjExLTI4MC8wMi0xMi0yMDI1LzE4X2N1c3RvbWVyX2VudHJ5X2ZyYW1lLmpwZWdcIixcclxuICAgICAgICAgICAgICAgIFwiaXNDaGVja2VkXCI6IHRydWVcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBcImlkXCI6IFwiMTEtMjgwXzIwMjUtMTItMDJfMThcIixcclxuICAgICAgICAgICAgICAgIFwidGVtcElkXCI6IDIwLFxyXG4gICAgICAgICAgICAgICAgXCJ0aW1lUmFuZ2VcIjogXCIwNFBNLTA1UE1cIixcclxuICAgICAgICAgICAgICAgIFwiZW50cnlUaW1lXCI6IFwiMTY6MTc6NTlcIixcclxuICAgICAgICAgICAgICAgIFwiZXhpdFRpbWVcIjogXCIxNjo0Nzo1N1wiLFxyXG4gICAgICAgICAgICAgICAgXCJmaWxlUGF0aFwiOiBcIjExLTI4MC8wMi0xMi0yMDI1LzE4X2N1c3RvbWVyX2VudHJ5X2ZyYW1lLmpwZWdcIixcclxuICAgICAgICAgICAgICAgIFwiaXNDaGVja2VkXCI6IHRydWVcclxuICAgICAgICAgICAgICB9XHJcbiAgICBdLFxyXG4gICAgICBcImNyZWF0ZWRCeUVtYWlsXCI6IFwic2FuZGVlcC5wYWxAeW9wbWFpbC5jb21cIixcclxuICAgICAgICBcImNyZWF0ZWRCeVVzZXJOYW1lXCI6IFwic2FuZGVlcC5wYWxcIixcclxuICAgICAgICBcImNyZWF0ZWRCeVJvbGVcIjogXCJ1c2VyXCIsXHJcbiAgICAgICAgXCJzdGF0dXNcIjpcInJlamVjdGVkXCIsXHJcbiAgICAgICAgIFwibWVzc2FnZVwiOlwiY29tbW5ldHMgbWVzc2FnZSB1cGRhdGUgaGVyZVwiXHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICBdXHJcbiAgfSxcclxuICB7XHJcbiAgICBcImNhdGVnb3J5XCI6XCJkdXBsaWNhdGVcIixcclxuICAgIFwidHlwZVwiOlwiYXBwcm92ZVwiLFxyXG4gICAgXCJjb21tZW50c1wiOltcclxuICAgICAge1xyXG4gICAgICAgIFwicGFyZW50XCI6MSxcclxuICAgICAgICAgXCJjYXRlZ29yeVwiOlwiZHVwbGljYXRlXCIsXHJcbiAgXCJ0YWdnZWRJbWFnZXNcIjpbXHJcbiAgICAge1xyXG4gICAgICAgICAgICAgICAgXCJpZFwiOiBcIjExLTI4MF8yMDI1LTEyLTAyXzE4XCIsXHJcbiAgICAgICAgICAgICAgICBcInRlbXBJZFwiOiAxOCxcclxuICAgICAgICAgICAgICAgIFwidGltZVJhbmdlXCI6IFwiMDRQTS0wNVBNXCIsXHJcbiAgICAgICAgICAgICAgICBcImVudHJ5VGltZVwiOiBcIjE2OjE3OjU5XCIsXHJcbiAgICAgICAgICAgICAgICBcImV4aXRUaW1lXCI6IFwiMTY6NDc6NTdcIixcclxuICAgICAgICAgICAgICAgIFwiZmlsZVBhdGhcIjogXCIxMS0yODAvMDItMTItMjAyNS8xOF9jdXN0b21lcl9lbnRyeV9mcmFtZS5qcGVnXCIsXHJcbiAgICAgICAgICAgICAgICBcImlzQ2hlY2tlZFwiOiB0cnVlXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgXCJpZFwiOiBcIjExLTI4MF8yMDI1LTEyLTAyXzE4XCIsXHJcbiAgICAgICAgICAgICAgICBcInRlbXBJZFwiOiAxOCxcclxuICAgICAgICAgICAgICAgIFwidGltZVJhbmdlXCI6IFwiMDRQTS0wNVBNXCIsXHJcbiAgICAgICAgICAgICAgICBcImVudHJ5VGltZVwiOiBcIjE2OjE3OjU5XCIsXHJcbiAgICAgICAgICAgICAgICBcImV4aXRUaW1lXCI6IFwiMTY6NDc6NTdcIixcclxuICAgICAgICAgICAgICAgIFwiZmlsZVBhdGhcIjogXCIxMS0yODAvMDItMTItMjAyNS8xOF9jdXN0b21lcl9lbnRyeV9mcmFtZS5qcGVnXCIsXHJcbiAgICAgICAgICAgICAgICBcImlzQ2hlY2tlZFwiOiB0cnVlXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgXCJpZFwiOiBcIjExLTI4MF8yMDI1LTEyLTAyXzE4XCIsXHJcbiAgICAgICAgICAgICAgICBcInRlbXBJZFwiOiAxOCxcclxuICAgICAgICAgICAgICAgIFwidGltZVJhbmdlXCI6IFwiMDRQTS0wNVBNXCIsXHJcbiAgICAgICAgICAgICAgICBcImVudHJ5VGltZVwiOiBcIjE2OjE3OjU5XCIsXHJcbiAgICAgICAgICAgICAgICBcImV4aXRUaW1lXCI6IFwiMTY6NDc6NTdcIixcclxuICAgICAgICAgICAgICAgIFwiZmlsZVBhdGhcIjogXCIxMS0yODAvMDItMTItMjAyNS8xOF9jdXN0b21lcl9lbnRyeV9mcmFtZS5qcGVnXCIsXHJcbiAgICAgICAgICAgICAgICBcImlzQ2hlY2tlZFwiOiB0cnVlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgXSxcclxuICAgICAgXCJjcmVhdGVkQnlFbWFpbFwiOiBcInNhbmRlZXAucGFsQHlvcG1haWwuY29tXCIsXHJcbiAgICAgICAgXCJjcmVhdGVkQnlVc2VyTmFtZVwiOiBcInNhbmRlZXAucGFsXCIsXHJcbiAgICAgICAgXCJjcmVhdGVkQnlSb2xlXCI6IFwidXNlclwiLFxyXG4gICAgICAgIFwic3RhdHVzXCI6XCJhcHByb3ZlZFwiLFxyXG4gICAgICAgICBcIm1lc3NhZ2VcIjpcImNvbW1uZXRzIG1lc3NhZ2UgdXBkYXRlIGhlcmVcIlxyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgXVxyXG4gIH1cclxuXVxyXG5cclxuYWN0aXZpdHlEYXRhMTphbnkgPVtcclxuXHJcbiAge1xyXG5cclxuICAgIFwiY2F0ZWdvcnlcIjpcImVtcGxveWVlXCIsXHJcblxyXG4gICAgXCJwYXJlbnRcIjpudWxsLFxyXG5cclxuICAgIFwidHlwZVwiOlwidGFnZ2luZ1wiLFxyXG5cclxuICAgIFwiY29tbWVudHNcIjpbXHJcblxyXG4gICAgIHtcclxuXHJcbiAgICAgICAgICAgICAgICBcImlkXCI6IFwiMTEtMjgwXzIwMjUtMTItMDJfMThcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcInRlbXBJZFwiOiAxOCxcclxuXHJcbiAgICAgICAgICAgICAgICBcInRpbWVSYW5nZVwiOiBcIjA0UE0tMDVQTVwiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwiZW50cnlUaW1lXCI6IFwiMTY6MTc6NTlcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImV4aXRUaW1lXCI6IFwiMTY6NDc6NTdcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImZpbGVQYXRoXCI6IFwiMTEtMjgwLzAyLTEyLTIwMjUvMThfY3VzdG9tZXJfZW50cnlfZnJhbWUuanBlZ1wiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwiaXNDaGVja2VkXCI6IHRydWUsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJjcmVhdGVkQXRcIjpcIjIwMjUtMTItMDNUMDY6NDA6MzQuNDg1WlwiLFxyXG5cclxuICAgICAgICAgICAgICAgXCJjcmVhdGVkQnlFbWFpbFwiOiBcInNhbmRlZXAucGFsQHlvcG1haWwuY29tXCIsXHJcblxyXG4gICAgICAgIFwiY3JlYXRlZEJ5VXNlck5hbWVcIjogXCJzYW5kZWVwLnBhbFwiLFxyXG5cclxuICAgICAgICBcImNyZWF0ZWRCeVJvbGVcIjogXCJ1c2VyXCIsXHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICBcIm1lc3NhZ2VcIjpcImNvbW1uZXRzIG1lc3NhZ2UgdXBkYXRlIGhlcmVcIlxyXG5cclxuICAgICAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgICAgICAge1xyXG5cclxuICAgICAgICAgICAgICAgIFwiaWRcIjogXCIxMS0yODBfMjAyNS0xMi0wMl8xOFwiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwidGVtcElkXCI6IDE4LFxyXG5cclxuICAgICAgICAgICAgICAgIFwidGltZVJhbmdlXCI6IFwiMDRQTS0wNVBNXCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJlbnRyeVRpbWVcIjogXCIxNjoxNzo1OVwiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwiZXhpdFRpbWVcIjogXCIxNjo0Nzo1N1wiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwiZmlsZVBhdGhcIjogXCIxMS0yODAvMDItMTItMjAyNS8xOF9jdXN0b21lcl9lbnRyeV9mcmFtZS5qcGVnXCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJpc0NoZWNrZWRcIjogdHJ1ZSxcclxuXHJcbiAgICAgICAgICAgICAgICBcImNyZWF0ZWRBdFwiOlwiMjAyNS0xMi0wM1QwNjo0MDozNC40ODVaXCIsXHJcblxyXG4gICAgICAgICAgICAgICBcImNyZWF0ZWRCeUVtYWlsXCI6IFwic2FuZGVlcC5wYWxAeW9wbWFpbC5jb21cIixcclxuXHJcbiAgICAgICAgXCJjcmVhdGVkQnlVc2VyTmFtZVwiOiBcInNhbmRlZXAucGFsXCIsXHJcblxyXG4gICAgICAgIFwiY3JlYXRlZEJ5Um9sZVwiOiBcInVzZXJcIixcclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICAgIFwibWVzc2FnZVwiOlwiY29tbW5ldHMgbWVzc2FnZSB1cGRhdGUgaGVyZVwiXHJcblxyXG4gICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICAgICAgXCJpZFwiOiBcIjExLTI4MF8yMDI1LTEyLTAyXzE4XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJ0ZW1wSWRcIjogMTgsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJ0aW1lUmFuZ2VcIjogXCIwNFBNLTA1UE1cIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImVudHJ5VGltZVwiOiBcIjE2OjE3OjU5XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJleGl0VGltZVwiOiBcIjE2OjQ3OjU3XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJmaWxlUGF0aFwiOiBcIjExLTI4MC8wMi0xMi0yMDI1LzE4X2N1c3RvbWVyX2VudHJ5X2ZyYW1lLmpwZWdcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImlzQ2hlY2tlZFwiOiB0cnVlLFxyXG5cclxuICAgICAgICAgICAgICAgIFwiY3JlYXRlZEF0XCI6XCIyMDI1LTEyLTAzVDA2OjQwOjM0LjQ4NVpcIixcclxuXHJcbiAgICAgICAgICAgICAgIFwiY3JlYXRlZEJ5RW1haWxcIjogXCJzYW5kZWVwLnBhbEB5b3BtYWlsLmNvbVwiLFxyXG5cclxuICAgICAgICBcImNyZWF0ZWRCeVVzZXJOYW1lXCI6IFwic2FuZGVlcC5wYWxcIixcclxuXHJcbiAgICAgICAgXCJjcmVhdGVkQnlSb2xlXCI6IFwidXNlclwiLFxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgXCJtZXNzYWdlXCI6XCJjb21tbmV0cyBtZXNzYWdlIHVwZGF0ZSBoZXJlXCJcclxuXHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgIF1cclxuXHJcbiAgfSxcclxuXHJcbiAge1xyXG5cclxuICAgIFwidHlwZVwiOlwicmV2aWV3XCIsXHJcblxyXG4gICAgXCJjb21tZW50c1wiOltcclxuXHJcbiAgICAgIHtcclxuXHJcbiAgICAgICAgIFwiY2F0ZWdvcnlcIjpcImVtcGxveWVlXCIsXHJcblxyXG4gIFwidGFnZ2VkSW1hZ2VzXCI6W1xyXG5cclxuICAgICB7XHJcblxyXG4gICAgICAgICAgICAgICAgXCJpZFwiOiBcIjExLTI4MF8yMDI1LTEyLTAyXzE4XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJ0ZW1wSWRcIjogMjgsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJ0aW1lUmFuZ2VcIjogXCIwNFBNLTA1UE1cIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImVudHJ5VGltZVwiOiBcIjE2OjE3OjU5XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJleGl0VGltZVwiOiBcIjE2OjQ3OjU3XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJmaWxlUGF0aFwiOiBcIjExLTI4MC8wMi0xMi0yMDI1LzE4X2N1c3RvbWVyX2VudHJ5X2ZyYW1lLmpwZWdcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImlzQ2hlY2tlZFwiOiB0cnVlXHJcblxyXG4gICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICAgICAgXCJpZFwiOiBcIjExLTI4MF8yMDI1LTEyLTAyXzE4XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJ0ZW1wSWRcIjogMjIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJ0aW1lUmFuZ2VcIjogXCIwNFBNLTA1UE1cIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImVudHJ5VGltZVwiOiBcIjE2OjE3OjU5XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJleGl0VGltZVwiOiBcIjE2OjQ3OjU3XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJmaWxlUGF0aFwiOiBcIjExLTI4MC8wMi0xMi0yMDI1LzE4X2N1c3RvbWVyX2VudHJ5X2ZyYW1lLmpwZWdcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImlzQ2hlY2tlZFwiOiB0cnVlXHJcblxyXG4gICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICAgICAgXCJpZFwiOiBcIjExLTI4MF8yMDI1LTEyLTAyXzE4XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJ0ZW1wSWRcIjogMTEsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJ0aW1lUmFuZ2VcIjogXCIwNFBNLTA1UE1cIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImVudHJ5VGltZVwiOiBcIjE2OjE3OjU5XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJleGl0VGltZVwiOiBcIjE2OjQ3OjU3XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJmaWxlUGF0aFwiOiBcIjExLTI4MC8wMi0xMi0yMDI1LzE4X2N1c3RvbWVyX2VudHJ5X2ZyYW1lLmpwZWdcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImlzQ2hlY2tlZFwiOiB0cnVlXHJcblxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgICAgICBcImlkXCI6IFwiMTEtMjgwXzIwMjUtMTItMDJfMThcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcInRlbXBJZFwiOiAxMixcclxuXHJcbiAgICAgICAgICAgICAgICBcInRpbWVSYW5nZVwiOiBcIjA0UE0tMDVQTVwiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwiZW50cnlUaW1lXCI6IFwiMTY6MTc6NTlcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImV4aXRUaW1lXCI6IFwiMTY6NDc6NTdcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImZpbGVQYXRoXCI6IFwiMTEtMjgwLzAyLTEyLTIwMjUvMThfY3VzdG9tZXJfZW50cnlfZnJhbWUuanBlZ1wiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwiaXNDaGVja2VkXCI6IHRydWVcclxuXHJcbiAgICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgICAgICBcImlkXCI6IFwiMTEtMjgwXzIwMjUtMTItMDJfMThcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcInRlbXBJZFwiOiAxMyxcclxuXHJcbiAgICAgICAgICAgICAgICBcInRpbWVSYW5nZVwiOiBcIjA0UE0tMDVQTVwiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwiZW50cnlUaW1lXCI6IFwiMTY6MTc6NTlcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImV4aXRUaW1lXCI6IFwiMTY6NDc6NTdcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImZpbGVQYXRoXCI6IFwiMTEtMjgwLzAyLTEyLTIwMjUvMThfY3VzdG9tZXJfZW50cnlfZnJhbWUuanBlZ1wiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwiaXNDaGVja2VkXCI6IHRydWVcclxuXHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgIF0sXHJcblxyXG4gICAgICBcImNyZWF0ZWRCeUVtYWlsXCI6IFwic2FuZGVlcC5wYWxAeW9wbWFpbC5jb21cIixcclxuXHJcbiAgICAgICAgXCJjcmVhdGVkQnlVc2VyTmFtZVwiOiBcInNhbmRlZXAucGFsXCIsXHJcblxyXG4gICAgICAgIFwiY3JlYXRlZEJ5Um9sZVwiOiBcInVzZXJcIixcclxuXHJcbiAgICAgICAgXCJzdGF0dXNcIjpcImFwcHJvdmVkXCIsXHJcblxyXG4gICAgICAgICBcIm1lc3NhZ2VcIjpcImNvbW1uZXRzIG1lc3NhZ2UgdXBkYXRlIGhlcmVcIlxyXG5cclxuICAgICAgfVxyXG5cclxuICAgIF1cclxuXHJcbiAgfSxcclxuICAge1xyXG5cclxuICAgIFwidHlwZVwiOlwiYXBwcm92ZVwiLFxyXG5cclxuICAgIFwiY29tbWVudHNcIjpbXHJcblxyXG4gICAgICB7XHJcblxyXG4gICAgICAgICBcImNhdGVnb3J5XCI6XCJlbXBsb3llZVwiLFxyXG5cclxuICBcInRhZ2dlZEltYWdlc1wiOltcclxuXHJcbiAgICAge1xyXG5cclxuICAgICAgICAgICAgICAgIFwiaWRcIjogXCIxMS0yODBfMjAyNS0xMi0wMl8xOFwiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwidGVtcElkXCI6IDEsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJ0aW1lUmFuZ2VcIjogXCIwNFBNLTA1UE1cIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImVudHJ5VGltZVwiOiBcIjE2OjE3OjU5XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJleGl0VGltZVwiOiBcIjE2OjQ3OjU3XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJmaWxlUGF0aFwiOiBcIjExLTI4MC8wMi0xMi0yMDI1LzE4X2N1c3RvbWVyX2VudHJ5X2ZyYW1lLmpwZWdcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImlzQ2hlY2tlZFwiOiB0cnVlXHJcblxyXG4gICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICAgICAgXCJpZFwiOiBcIjExLTI4MF8yMDI1LTEyLTAyXzE4XCIsXHJcblxyXG4gICAgICAgICAgICAgICAgXCJ0ZW1wSWRcIjogOCxcclxuXHJcbiAgICAgICAgICAgICAgICBcInRpbWVSYW5nZVwiOiBcIjA0UE0tMDVQTVwiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwiZW50cnlUaW1lXCI6IFwiMTY6MTc6NTlcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImV4aXRUaW1lXCI6IFwiMTY6NDc6NTdcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImZpbGVQYXRoXCI6IFwiMTEtMjgwLzAyLTEyLTIwMjUvMThfY3VzdG9tZXJfZW50cnlfZnJhbWUuanBlZ1wiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwiaXNDaGVja2VkXCI6IHRydWVcclxuXHJcbiAgICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgICAgICBcImlkXCI6IFwiMTEtMjgwXzIwMjUtMTItMDJfMThcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcInRlbXBJZFwiOiAyMixcclxuXHJcbiAgICAgICAgICAgICAgICBcInRpbWVSYW5nZVwiOiBcIjA0UE0tMDVQTVwiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwiZW50cnlUaW1lXCI6IFwiMTY6MTc6NTlcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImV4aXRUaW1lXCI6IFwiMTY6NDc6NTdcIixcclxuXHJcbiAgICAgICAgICAgICAgICBcImZpbGVQYXRoXCI6IFwiMTEtMjgwLzAyLTEyLTIwMjUvMThfY3VzdG9tZXJfZW50cnlfZnJhbWUuanBlZ1wiLFxyXG5cclxuICAgICAgICAgICAgICAgIFwiaXNDaGVja2VkXCI6IHRydWVcclxuXHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgIF0sXHJcblxyXG4gICAgICBcImNyZWF0ZWRCeUVtYWlsXCI6IFwic2FuZGVlcC5wYWxAeW9wbWFpbC5jb21cIixcclxuXHJcbiAgICAgICAgXCJjcmVhdGVkQnlVc2VyTmFtZVwiOiBcInNhbmRlZXAucGFsXCIsXHJcblxyXG4gICAgICAgIFwiY3JlYXRlZEJ5Um9sZVwiOiBcInVzZXJcIixcclxuXHJcbiAgICAgICAgXCJzdGF0dXNcIjpcInJlamVjdGVkXCIsXHJcblxyXG4gICAgICAgICBcIm1lc3NhZ2VcIjpcImNvbW1uZXRzIG1lc3NhZ2UgdXBkYXRlIGhlcmVcIlxyXG5cclxuICAgICAgfVxyXG5cclxuICAgIF1cclxuXHJcbiAgfVxyXG5cclxuXVxyXG4gIGNvbW1lbnRzOiBhbnkgPSBbXHJcbiAgICB7XHJcbiAgICAgIGVtYWlsOiBcInJ5YW5AbGVuc2thcnQuY29tXCIsXHJcbiAgICAgIGF2YXRhcjogXCJhc3NldHMvYXZhdGFycy9yeWFuLnBuZ1wiLFxyXG4gICAgICB0aW1lOiBcIjIwMjUtMDEtMjBUMTA6NTM6MzRcIixcclxuICAgICAgbWFpblRleHQ6IFwiQWxsIHRoZSB0aHJlZSBhcmUgc2FtZS5cIixcclxuICAgICAgc3RhdHVzTGFiZWw6IG51bGwsIC8vIG5vIOKAnE1hcmtlZCBhcyDigKbigJ0gbGluZVxyXG4gICAgICBzdGF0dXNUeXBlOiBudWxsLFxyXG4gICAgICBub3RlOiBudWxsLFxyXG4gICAgICBpbWFnZXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICB1cmw6IFwiYXNzZXRzL2ltZzEuanBnXCIsXHJcbiAgICAgICAgICB0YW5nb0lkOiA0LFxyXG4gICAgICAgICAgZW50cnlUaW1lOiBcIjEwOjEwIEFNXCIsXHJcbiAgICAgICAgICBzdGF0dXM6IFwicmVqZWN0XCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB1cmw6IFwiYXNzZXRzL2ltZzIuanBnXCIsXHJcbiAgICAgICAgICB0YW5nb0lkOiA0LFxyXG4gICAgICAgICAgZW50cnlUaW1lOiBcIjEwOjEwIEFNXCIsXHJcbiAgICAgICAgICBzdGF0dXM6IFwicmVqZWN0XCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyBtb3JlIGltYWdlcyBpZiB5b3Ugd2FudFxyXG4gICAgICBdLFxyXG4gICAgICBtb3JlQ291bnQ6IDEyLCAvLyBmb3IgdGhlICsxMiBjYXJkXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBlbWFpbDogXCJkcmV3QGxlbnNrYXJ0LmNvbVwiLFxyXG4gICAgICBhdmF0YXI6IFwiYXNzZXRzL2F2YXRhcnMvZHJldy5wbmdcIixcclxuICAgICAgdGltZTogXCIyMDI1LTAxLTIwVDEwOjUzOjM0XCIsXHJcbiAgICAgIG1haW5UZXh0OiBudWxsLFxyXG4gICAgICBzdGF0dXNMYWJlbDogXCJSZWplY3RcIixcclxuICAgICAgc3RhdHVzVHlwZTogXCJkYW5nZXJcIiwgLy8gZm9yIHJlZCB0ZXh0XHJcbiAgICAgIG5vdGU6IFwiTm90IGFncmVlZCwgc2VlbXMgbm90IGR1cGxpY2F0ZS5cIixcclxuICAgICAgaW1hZ2VzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdXJsOiBcImFzc2V0cy9pbWcxLmpwZ1wiLFxyXG4gICAgICAgICAgdGFuZ29JZDogNCxcclxuICAgICAgICAgIGVudHJ5VGltZTogXCIxMDoxMCBBTVwiLFxyXG4gICAgICAgICAgc3RhdHVzOiBcInJlamVjdFwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdXJsOiBcImFzc2V0cy9pbWcyLmpwZ1wiLFxyXG4gICAgICAgICAgdGFuZ29JZDogNCxcclxuICAgICAgICAgIGVudHJ5VGltZTogXCIxMDoxMCBBTVwiLFxyXG4gICAgICAgICAgc3RhdHVzOiBcInJlamVjdFwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIG1vcmVDb3VudDogMTIsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBlbWFpbDogXCJvcmxhbmRvQGxlbnNrYXJ0LmNvbVwiLFxyXG4gICAgICBhdmF0YXI6IFwiYXNzZXRzL2F2YXRhcnMvb3JsYW5kby5wbmdcIixcclxuICAgICAgdGltZTogXCIyMDI1LTAxLTIwVDEwOjUzOjM0XCIsXHJcbiAgICAgIG1haW5UZXh0OiBudWxsLFxyXG4gICAgICBzdGF0dXNMYWJlbDogXCJBcHByb3ZlZFwiLFxyXG4gICAgICBzdGF0dXNUeXBlOiBcInN1Y2Nlc3NcIiwgLy8gZ3JlZW5cclxuICAgICAgbm90ZTogXCJBZ3JlZWQsIGhlbmNlIGFwcHJvdmluZyB0aGUgM1wiLFxyXG4gICAgICBpbWFnZXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICB1cmw6IFwiYXNzZXRzL2ltZzEuanBnXCIsXHJcbiAgICAgICAgICB0YW5nb0lkOiA0LFxyXG4gICAgICAgICAgZW50cnlUaW1lOiBcIjEwOjEwIEFNXCIsXHJcbiAgICAgICAgICBzdGF0dXM6IFwiYXBwcm92ZVwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdXJsOiBcImFzc2V0cy9pbWcyLmpwZ1wiLFxyXG4gICAgICAgICAgdGFuZ29JZDogNCxcclxuICAgICAgICAgIGVudHJ5VGltZTogXCIxMDoxMCBBTVwiLFxyXG4gICAgICAgICAgc3RhdHVzOiBcImFwcHJvdmVcIixcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgICBtb3JlQ291bnQ6IDAsXHJcbiAgICB9LFxyXG4gIF07XHJcblxyXG4gIHNob3dSZXZpc2VkRGV0YWlscyA9IGZhbHNlO1xyXG4gIGZvb3RmYWxsTm9EYXRhOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZm9vdGZhbGxMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZm9vdGZhbGxvZmZzZXQgPSAxO1xyXG4gIGZvb3RmYWxsbGltaXQgPSAxO1xyXG4gIHRvdGFsSXRlbXNGb290ZmFsbDogYW55ID0gMDtcclxuICBkYXRhSW5kZXhJZDogc3RyaW5nID0gXCJcIjtcclxuICBkYXRlU3RyaW5nOiBzdHJpbmcgPSBcIlwiO1xyXG4gIHN0b3JlSWRWYWx1ZTogYW55ID0gW107XHJcbiAgbGFzdFNlbGVjdGVkVGlja2V0OiBhbnk7XHJcbiAgc2VsZWN0ZVZhbHVlczogYW55ID0gXCJcIjtcclxuICBoYXNJbml0aWFsU3RvcmVTeW5jZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcGFnZVNpemVGb290ZmFsbDogbnVtYmVyID0gMTA7XHJcbiAgcGFnaW5hdGlvblNpemVzRm9vdGZhbGw6IG51bWJlcltdID0gWzEwLCAyMCwgMzBdO1xyXG4gIGFkZFN0b3JlSWZOb3RFeGlzdHMoc3RvcmU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuaGFzSW5pdGlhbFN0b3JlU3luY2VkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc3RvcmVJZCA9IHN0b3JlPy5zdG9yZUlkO1xyXG4gICAgaWYgKHN0b3JlSWQgJiYgIXRoaXMuc2VsZWN0ZWRTdG9yZXMuaW5jbHVkZXMoc3RvcmVJZCkpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFN0b3Jlcy5wdXNoKHN0b3JlSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFzSW5pdGlhbFN0b3JlU3luY2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPVxyXG4gICAgICB0aGlzLnNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gdGhpcy5vcGVuVGlja2V0c0xpc3QubGVuZ3RoO1xyXG4gIH1cclxuICByZXZvcHNUeXBlczogc3RyaW5nW10gPSBbXTtcclxuYnVpbGRSZXZvcHNUeXBlcyh0aWNrZXRzOiBhbnlbXSkge1xyXG4gIGNvbnN0IHR5cGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gICh0aWNrZXRzIHx8IFtdKS5mb3JFYWNoKCh0aWNrZXQ6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgbWFwcGluZ0luZm8gPSB0aWNrZXQ/Ll9zb3VyY2U/Lm1hcHBpbmdJbmZvIHx8IFtdO1xyXG5cclxuICAgIG1hcHBpbmdJbmZvLmZvckVhY2goKG1hcHBpbmc6IGFueSkgPT4ge1xyXG4gICAgICAobWFwcGluZz8ucmV2aXNlZERldGFpbCB8fCBbXSkuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcblxyXG4gICAgICAgIC8vIDEpIE5vcm1hbCBlbnRyaWVzOiBoYXZlIHJldm9wc1R5cGVcclxuICAgICAgICBpZiAoaXRlbT8ucmV2b3BzVHlwZSkge1xyXG4gICAgICAgICAgdHlwZXMuYWRkKGl0ZW0ucmV2b3BzVHlwZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAyKSBTdW1tYXJ5IGVudHJpZXM6IGhhdmUgdHlwZSArIG5hbWUgKEhvdXNlIGtlZXBpbmcsIFZlbmRvciwgVGVjaG5pY2lhbiwgZXRjLilcclxuICAgICAgICBlbHNlIGlmIChpdGVtPy50eXBlICYmIGl0ZW0/Lm5hbWUpIHtcclxuICAgICAgICAgIHR5cGVzLmFkZChpdGVtLnR5cGUpOyAvLyBlLmcuICd2ZW5kb3InLCAndGVjaG5pY2lhbicsICdob3VzZUtlZXBpbmcnXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgdGhpcy5yZXZvcHNUeXBlcyA9IEFycmF5LmZyb20odHlwZXMpO1xyXG4gIGNvbnNvbGUubG9nKCdSZXZvcHMgdHlwZXM6JywgdGhpcy5yZXZvcHNUeXBlcyk7XHJcbn1cclxuaGFzUmV2b3BzVHlwZSh0eXBlOiBhbnkpIHtcclxuICBjb25zb2xlLmxvZyh0eXBlKVxyXG4gIHJldHVybiB0aGlzLnJldm9wc1R5cGVzLmluY2x1ZGVzKHR5cGUpO1xyXG59XHJcblxyXG4gIG92ZXJhbGxTZWxlY3RlZElkczogYW55O1xyXG5vdmVyYWxsU2VsZWN0KGV2ZW50OiBhbnkpIHtcclxuICBjb25zdCBjaGVja2VkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG4gIHRoaXMuYWxsU2VsZWN0ZWQgPSBjaGVja2VkO1xyXG5cclxuICBjb25zdCBwYXJlbnRzID0gdGhpcy5nZXRBbGxQYXJlbnRJdGVtcygpOyAvLyB5b3VyIGV4aXN0aW5nIGZuXHJcblxyXG4gIGlmIChjaGVja2VkKSB7XHJcbiAgICAvLyDwn5S5IFNlbGVjdCBBTEwgZm9yIGV2ZXJ5IHJldm9wcyB0eXBlIGV4Y2VwdCAnZHVwbGljYXRlJ1xyXG4gICAgKHRoaXMucmV2b3BzVHlwZXMgfHwgW10pLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAodHlwZSA9PT0gJ2R1cGxpY2F0ZScpIHtcclxuICAgICAgICByZXR1cm47IC8vIGhhbmRsZWQgc2VwYXJhdGVseSBiZWxvd1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBsaXN0ID0gdGhpcy5nZXRMaXN0QnlUeXBlKHR5cGUpIHx8IFtdOyAvLyBtYWtlIHN1cmUgZ2V0TGlzdEJ5VHlwZSBhY2NlcHRzIHN0cmluZ1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQnlUeXBlW3R5cGVdID0gbGlzdC5tYXAoKGk6IGFueSkgPT4gaS50ZW1wSWQpO1xyXG4gICAgICB0aGlzLnNlbGVjdEFsbEJ5VHlwZVt0eXBlXSA9IGxpc3QubGVuZ3RoID4gMDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIPCflLkgRHVwbGljYXRlOiBrZWVwIHlvdXIgZXhpc3RpbmcgcGFyZW50ICsgZHVwbGljYXRlSW1hZ2UgbG9naWNcclxuICAgIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnQgPSB7fTsgLy8gcmVzZXQgZmlyc3RcclxuXHJcbiAgICBwYXJlbnRzXHJcbiAgICAgIC5maWx0ZXIoKHA6IGFueSkgPT4gcC5yZXZvcHNUeXBlID09PSAnZHVwbGljYXRlJylcclxuICAgICAgLmZvckVhY2goKHA6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudElkID0gcC50ZW1wSWQ7XHJcbiAgICAgICAgY29uc3QgZHVwbGljYXRlcyA9IHAuZHVwbGljYXRlSW1hZ2UgfHwgW107XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZER1cGxpY2F0ZXNCeVBhcmVudFtwYXJlbnRJZF0gPSBkdXBsaWNhdGVzLm1hcChcclxuICAgICAgICAgIChkOiBhbnkpID0+IGQudGVtcElkXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8gYnVpbGQgZmluYWwgb3ZlcmFsbCBpZHNcclxuICAgIHRoaXMudXBkYXRlT3ZlcmFsbFNlbGVjdGVkSWRzKCk7XHJcblxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyDwn5S5IENsZWFyIGFsbCBub24tZHVwbGljYXRlIHR5cGVzIGR5bmFtaWNhbGx5XHJcbiAgICAodGhpcy5yZXZvcHNUeXBlcyB8fCBbXSkuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmICh0eXBlID09PSAnZHVwbGljYXRlJykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZEJ5VHlwZVt0eXBlXSA9IFtdO1xyXG4gICAgICB0aGlzLnNlbGVjdEFsbEJ5VHlwZVt0eXBlXSA9IGZhbHNlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g8J+UuSBDbGVhciBkdXBsaWNhdGVzXHJcbiAgICB0aGlzLnNlbGVjdGVkRHVwbGljYXRlc0J5UGFyZW50ID0ge307XHJcbiAgICB0aGlzLnNlbGVjdEFsbEJ5VHlwZS5kdXBsaWNhdGUgPSBmYWxzZTtcclxuXHJcbiAgICAvLyDwn5S5IENsZWFyIG92ZXJhbGwgaWRzXHJcbiAgICB0aGlzLm92ZXJhbGxTZWxlY3RlZElkcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgY29uc29sZS5sb2coJ3NlbGVjdGVkQnlUeXBlOicsIHRoaXMuc2VsZWN0ZWRCeVR5cGUpO1xyXG4gIGNvbnNvbGUubG9nKCdzZWxlY3RlZER1cGxpY2F0ZXNCeVBhcmVudDonLCB0aGlzLnNlbGVjdGVkRHVwbGljYXRlc0J5UGFyZW50KTtcclxufVxyXG5cclxuICBnZXRBbGxQYXJlbnRJdGVtcygpIHtcclxuICAgIGlmICghdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhbGxNYXBwaW5nczogYW55W10gPSBbXTtcclxuICAgIGNvbnN0IGFsbFJldmlzZWQ6IGFueVtdID0gW107XHJcblxyXG4gICAgLy8gZmlyc3QgbGV2ZWw6IGNvbGxlY3QgYWxsIG1hcHBpbmdJbmZvIGFycmF5c1xyXG4gICAgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhLmZvckVhY2goKHRpY2tldDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IG1hcHBpbmdzID0gdGlja2V0Py5fc291cmNlPy5tYXBwaW5nSW5mbyB8fCBbXTtcclxuICAgICAgYWxsTWFwcGluZ3MucHVzaC5hcHBseShhbGxNYXBwaW5ncywgbWFwcGluZ3MpOyAvLyBjb25jYXRcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIHNlY29uZCBsZXZlbDogY29sbGVjdCBhbGwgcmV2aXNlZERldGFpbCBhcnJheXNcclxuICAgIGFsbE1hcHBpbmdzLmZvckVhY2goKG1hcHBpbmc6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBkZXRhaWxzID0gbWFwcGluZz8ucmV2aXNlZERldGFpbCB8fCBbXTtcclxuICAgICAgYWxsUmV2aXNlZC5wdXNoLmFwcGx5KGFsbFJldmlzZWQsIGRldGFpbHMpOyAvLyBjb25jYXRcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBhbGxSZXZpc2VkO1xyXG4gIH1cclxuXHJcbiAgaXNDaGVja2JveEVuYWJsZSA9IGZhbHNlO1xyXG4gIGNsb3NlQnRuID0gZmFsc2U7XHJcbiAgY2xvc2VEaXNhYmxlZCA9IGZhbHNlO1xyXG4gIHN0YXJ0UmV2aWV3KCkge1xyXG4gICAgbGV0IG9iaiA9IHtcclxuICAgICAgXCJzdG9yZUlkXCI6IHRoaXMudGlja2V0RGF0YT8uc3RvcmVJZCxcclxuICAgICAgXCJkYXRlU3RyaW5nXCI6IHRoaXMudGlja2V0RGF0YT8uaXNzdWVEYXRlLFxyXG4gICAgICBcIm1vZGVcIjogXCJ3ZWJcIlxyXG4gICAgfVxyXG4gICAgdGhpcy5zZXJ2aWNlLmdldFVwZGF0ZVRpY2tldFN0YXR1c0FwaShvYmopLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMuaXNDaGVja2JveEVuYWJsZSA9IHRydWU7IC8vIGNhbGwgdGhpcyBvbiB5b3VyIFwiUmV2aWV3XCIgYnV0dG9uIGNsaWNrXHJcbiAgICAgICAgICB0aGlzLmNsb3NlQnRuID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuY2xvc2VEaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5kYXRhU3RvcmVWaWV3KHRoaXMudGlja2V0RGF0YSlcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbiAgQFZpZXdDaGlsZChcImNsb3NlUG9wdXBcIikgY2xvc2VQb3B1cDogRWxlbWVudFJlZjtcclxuICBzdG9wUmV2aWV3KCkge1xyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuY2xvc2VQb3B1cCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogXCJtZFwiLFxyXG4gICAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICAgICAga2V5Ym9hcmQ6IGZhbHNlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmlzQ2hlY2tib3hFbmFibGUgPSBmYWxzZTtcclxuICAgIHRoaXMuY2xvc2VCdG4gPSBmYWxzZTtcclxuICB9XHJcblxyXG50aWNrZXRWaWV3KGRhdGE/OiBhbnkpIHtcclxuICB0aGlzLnRpY2tldERhdGEgPSBkYXRhO1xyXG4gIHRoaXMuaXNDaGVja2JveEVuYWJsZSA9IGZhbHNlO1xyXG4gIHRoaXMuY2xvc2VCdG4gPSBmYWxzZTtcclxuICB0aGlzLmNsb3NlRGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICBpZiAoIWRhdGEpIHtcclxuICAgIGNvbnNvbGUud2FybignTm8gZGF0YSBwYXNzZWQgdG8gdGlja2V0VmlldycpO1xyXG4gICAgdGhpcy5nZXRPcGVuVGlja2V0TGlzdChkYXRhKTtcclxuICAgIHRoaXMuc2VsZWN0ID0gJ3RpY2tldE1ldGhvZCc7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCByZXZpZXdlZEJ5ID0gZGF0YS5SZXZpZXdlZEJ5IHx8IGRhdGEuYXBwcm92ZWRCeTtcclxuICBjb25zdCBjdXJyZW50VXNlckVtYWlsID0gdGhpcy51c2Vyc0RldGFpbHM/LmVtYWlsO1xyXG5cclxuXHJcbiAgY29uc3QgaXNTYW1lVXNlciA9XHJcbiAgICByZXZpZXdlZEJ5ICYmXHJcbiAgICBjdXJyZW50VXNlckVtYWlsICYmXHJcbiAgICByZXZpZXdlZEJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSBjdXJyZW50VXNlckVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICBpZiAoIWlzU2FtZVVzZXIpIHtcclxuICAgIHRoaXMuaXNDaGVja2JveEVuYWJsZSA9IGZhbHNlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBpZiAoZGF0YS5zdGF0dXMgPT09ICdJbi1Qcm9ncmVzcycpIHtcclxuICAgICAgdGhpcy5jbG9zZUJ0biA9IHRydWU7XHJcbiAgICAgIHRoaXMuY2xvc2VEaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzQ2hlY2tib3hFbmFibGUgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChkYXRhLnN0YXR1cyA9PT0gJ0Nsb3NlZCcpIHtcclxuICAgICAgdGhpcy5pc0NoZWNrYm94RW5hYmxlID0gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsb3NlQnRuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2xvc2VEaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuaXNDaGVja2JveEVuYWJsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICB0aGlzLmdldE9wZW5UaWNrZXRMaXN0KGRhdGEpO1xyXG4gIHRoaXMuc2VsZWN0ID0gJ3RpY2tldE1ldGhvZCc7XHJcbn1cclxuXHJcbiAgZGF0YVN0b3JlVmlldyhkYXRhPzogYW55KSB7XHJcbiAgICB0aGlzLmZvb3RmYWxsVGlja2V0c0RhdGEgPSBbXTtcclxuICAgIHRoaXMuZm9vdGZhbGxOb0RhdGEgPSBmYWxzZTtcclxuICAgIHRoaXMuZm9vdGZhbGxMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHRpY2tldCA9IGRhdGE/LnRpY2tldElkO1xyXG5cclxuICAgIHRoaXMubGFzdFNlbGVjdGVkVGlja2V0ID0gdGlja2V0O1xyXG4gICAgdGhpcy5hZGRTdG9yZUlmTm90RXhpc3RzKHRpY2tldCk7XHJcbiAgICB0aGlzLmltYWdlVXJsID0gdGhpcy5zZXJ2aWNlPy5mb290ZmFsbENETjtcclxuICAgIHRoaXMuc3RvcmVJZFZhbHVlID0gdGhpcy5zZWxlY3RlZFN0b3JlcztcclxuXHJcbiAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgLmdldFRpY2tldHNOZXdBcGkodGlja2V0KVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXM/LmRhdGE/LnJlc3VsdD8ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhID0gW107XHJcbiAgICAgICAgICAgICAgdGhpcy5mb290ZmFsbE5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5mb290ZmFsbExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJObyBkYXRhIGZvdW5kIGZvciB0aGUgc2VsZWN0ZWQgZmlsdGVyc1wiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmZvb3RmYWxsVGlja2V0c0RhdGEgPSByZXM/LmRhdGE/LnJlc3VsdCA/PyBbXTtcclxuICAgICAgICAgICAgICB0aGlzLmJ1aWxkUmV2b3BzVHlwZXModGhpcy5mb290ZmFsbFRpY2tldHNEYXRhKTtcclxuICAgICAgICAgICAgICB0aGlzLnRvdGFsSXRlbXNGb290ZmFsbCA9IHJlcz8uZGF0YT8uY291bnQ7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZm9vdGZhbGxsaW1pdCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbMV07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VTaXplRm9vdGZhbGwgPSAxO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsaW1pdCA9XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudG90YWxJdGVtc0Zvb3RmYWxsIDwgMTAgPyB0aGlzLnRvdGFsSXRlbXNGb290ZmFsbCA6IDEwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBbbGltaXRdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZUZvb3RmYWxsID0gbGltaXQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuZm9vdGZhbGxOb0RhdGEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLmZvb3RmYWxsTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2xvc2VCdXR0b25Gcm9tU3RvcmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuZm9vdGZhbGxOb0RhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmZvb3RmYWxsTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGVycj8uZXJyb3I/LmNvZGUgPT09IDQwMClcclxuICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgICAgICAgIGVycj8uZXJyb3I/Lm1lc3NhZ2UgPyBlcnI/LmVycm9yPy5tZXNzYWdlIDogZXJyPy5lcnJvcj8uZXJyb3JcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuZm9vdGZhbGxUaWNrZXRzRGF0YSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5mb290ZmFsbE5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmZvb3RmYWxsTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICBmb290ZmFsbFRpY2tldHNEYXRhOiBhbnlbXSA9IFtdO1xyXG4gIC8vIC0tLS0gU0VMRUNUSU9OIFNUQVRFIC0tLS1cclxuXHJcbiAgc2VsZWN0ZWRCeVR5cGU/OiBhbnkgPSB7fTtcclxuXHJcbiAgc2VsZWN0QWxsQnlUeXBlOiBhbnkgPSB7fVxyXG4gICBcclxuICAvLyAtLS0tIEhFTFBFUlMgLS0tLVxyXG5cclxuICAvLyBHZXQgYWxsIHJldmlzZWREZXRhaWwgaXRlbXMgb2YgYSBnaXZlbiB0eXBlIGZyb20gZm9vdGZhbGxUaWNrZXRzRGF0YVxyXG4gIC8vIEdldCBhbGwgcmV2aXNlZERldGFpbCBpdGVtcyBvZiBhIGdpdmVuIHR5cGUgZnJvbSBmb290ZmFsbFRpY2tldHNEYXRhXHJcbiAgZ2V0TGlzdEJ5VHlwZSh0eXBlOiBhbnkpIHtcclxuICAgIGlmICghdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhbGxSZXZpc2VkOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIC8vIGNvbGxlY3QgcmV2aXNlZERldGFpbCBPTkxZIGZyb20gbWFwcGluZ0luZm8gd2l0aCB0eXBlID09PSAncmV2aWV3J1xyXG4gICAgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhLmZvckVhY2goKHRpY2tldDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IG1hcHBpbmdzID0gdGlja2V0Py5fc291cmNlPy5tYXBwaW5nSW5mbyB8fCBbXTtcclxuXHJcbiAgICAgIG1hcHBpbmdzXHJcbiAgICAgICAgLmZpbHRlcigobTogYW55KSA9PiBtPy50eXBlID09PSAncmV2aWV3JykgLy8g8J+UuSBJTVBPUlRBTlRcclxuICAgICAgICAuZm9yRWFjaCgobWFwcGluZzogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gbWFwcGluZz8ucmV2aXNlZERldGFpbCB8fCBbXTtcclxuICAgICAgICAgIGFsbFJldmlzZWQucHVzaCguLi5kZXRhaWxzKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGZpbHRlciBieSB0eXBlIChqdW5rIC8gZW1wbG95ZWUgLyBob3VzZUtlZXBpbmcpXHJcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGFsbFJldmlzZWQuZmlsdGVyKFxyXG4gICAgICAob3JpZ2luYWw6IGFueSkgPT4gb3JpZ2luYWw/LnJldm9wc1R5cGUgPT09IHR5cGVcclxuICAgICk7XHJcblxyXG4gICAgLy8g8J+UuSBERURVUEUgYnkgdGVtcElkIChvciBpZCkgc28gd2UgZG9uJ3QgY291bnQgc2FtZSBpbWFnZSB0d2ljZVxyXG4gICAgY29uc3QgdW5pcXVlQnlUZW1wSWQgPSBBcnJheS5mcm9tKFxyXG4gICAgICBuZXcgTWFwKGZpbHRlcmVkLm1hcCgoaXRlbTogYW55KSA9PiBbaXRlbS50ZW1wSWQsIGl0ZW1dKSkudmFsdWVzKClcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHVuaXF1ZUJ5VGVtcElkO1xyXG4gIH1cclxuXHJcblxyXG5wcml2YXRlIHVwZGF0ZU92ZXJhbGxTZWxlY3RlZElkcygpOiB2b2lkIHtcclxuICBjb25zdCBpZHM6IHN0cmluZ1tdID0gW107XHJcbiAgY29uc3QgcGFyZW50cyA9IHRoaXMuZ2V0QWxsUGFyZW50SXRlbXMoKTtcclxuICBjb25zdCBzZWxlY3RlZFR5cGVzU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gICh0aGlzLnJldm9wc1R5cGVzIHx8IFtdKVxyXG4gICAgLmZpbHRlcigodHlwZSkgPT4gdHlwZSAhPT0gJ2R1cGxpY2F0ZScpXHJcbiAgICAuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLmdldExpc3RCeVR5cGUodHlwZSk7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkVGVtcHMgPSB0aGlzLnNlbGVjdGVkQnlUeXBlW3R5cGVdIHx8IFtdO1xyXG5cclxuICAgICAgaWYgKHNlbGVjdGVkVGVtcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHNlbGVjdGVkVHlwZXNTZXQuYWRkKHR5cGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsaXN0LmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChzZWxlY3RlZFRlbXBzLmluY2x1ZGVzKGl0ZW0udGVtcElkKSAmJiBpdGVtLmlkKSB7XHJcbiAgICAgICAgICBpZHMucHVzaChpdGVtLmlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIC8vIGR1cGxpY2F0ZSBsb2dpYyB1bmNoYW5nZWRcclxuICBwYXJlbnRzXHJcbiAgICAuZmlsdGVyKChwOiBhbnkpID0+IHAucmV2b3BzVHlwZSA9PT0gJ2R1cGxpY2F0ZScpXHJcbiAgICAuZm9yRWFjaCgocGFyZW50OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgcGFyZW50SWQgPSBwYXJlbnQudGVtcElkO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZENoaWxkVGVtcHMgPVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREdXBsaWNhdGVzQnlQYXJlbnRbcGFyZW50SWRdIHx8IFtdO1xyXG5cclxuICAgICAgaWYgKHNlbGVjdGVkQ2hpbGRUZW1wcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgc2VsZWN0ZWRUeXBlc1NldC5hZGQoJ2R1cGxpY2F0ZScpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAocGFyZW50LmR1cGxpY2F0ZUltYWdlIHx8IFtdKS5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkQ2hpbGRUZW1wcy5pbmNsdWRlcyhjaGlsZC50ZW1wSWQpKSB7XHJcbiAgICAgICAgICBpZiAoY2hpbGQuaWQpIHtcclxuICAgICAgICAgICAgaWRzLnB1c2goY2hpbGQuaWQpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQuaWQpIHtcclxuICAgICAgICAgICAgaWRzLnB1c2gocGFyZW50LmlkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIHRoaXMub3ZlcmFsbFNlbGVjdGVkSWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KGlkcykpO1xyXG4gIHRoaXMuc2VsZWN0ZWRDYXRlZ29yaWVzID0gQXJyYXkuZnJvbShzZWxlY3RlZFR5cGVzU2V0KTtcclxuXHJcbiAgY29uc29sZS5sb2coJ292ZXJhbGxTZWxlY3RlZElkczonLCB0aGlzLm92ZXJhbGxTZWxlY3RlZElkcyk7XHJcbiAgY29uc29sZS5sb2coJ3NlbGVjdGVkQ2F0ZWdvcmllczonLCB0aGlzLnNlbGVjdGVkQ2F0ZWdvcmllcyk7XHJcbn1cclxuXHJcblxyXG4gIHNlbGVjdGVkQ2F0ZWdvcmllczogYW55ID0gW107IC8vIGp1bmssIGVtcGxveWVlLCBob3VzZUtlZXBpbmcsIGR1cGxpY2F0ZVxyXG5sYWJlbE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xyXG50b1RpdGxlQ2FzZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcclxufVxyXG5cclxuYnVpbGRMYWJlbE1hcCh0aWNrZXRzOiBhbnlbXSkge1xyXG4gIHRpY2tldHMuZm9yRWFjaCgodGlja2V0OiBhbnkpID0+IHtcclxuICAgIGNvbnN0IG1hcHBpbmdJbmZvID0gdGlja2V0Py5fc291cmNlPy5tYXBwaW5nSW5mbyB8fCBbXTtcclxuXHJcbiAgICBtYXBwaW5nSW5mby5mb3JFYWNoKChtYXBwaW5nOiBhbnkpID0+IHtcclxuICAgICAgKG1hcHBpbmc/LnJldmlzZWREZXRhaWwgfHwgW10pLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENBU0UgMTogbm9ybWFsIGVudHJpZXMgKGVtcGxveWVlLCB2ZW5kb3IsIHRlY2huaWNpYW4sIGV0Yy4pXHJcbiAgICAgICAgaWYgKGl0ZW0/LnJldm9wc1R5cGUpIHtcclxuICAgICAgICAgIGNvbnN0IGtleSA9IGl0ZW0ucmV2b3BzVHlwZTtcclxuICAgICAgICAgIGlmICghdGhpcy5sYWJlbE1hcFtrZXldKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGFiZWxNYXBba2V5XSA9IHRoaXMudG9UaXRsZUNhc2Uoa2V5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENBU0UgMjogc3VtbWFyeSByb3dzIHdpdGggeyBuYW1lLCB0eXBlIH1cclxuICAgICAgICBpZiAoaXRlbT8udHlwZSAmJiBpdGVtPy5uYW1lKSB7XHJcbiAgICAgICAgICB0aGlzLmxhYmVsTWFwW2l0ZW0udHlwZV0gPSBpdGVtLm5hbWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgY29uc29sZS5sb2coXCJMYWJlbCBNYXA6XCIsIHRoaXMubGFiZWxNYXApO1xyXG59XHJcbmdldCBzZWxlY3RlZENhdGVnb3JpZXNMYWJlbCgpOiBzdHJpbmcge1xyXG4gIGlmICghdGhpcy5zZWxlY3RlZENhdGVnb3JpZXM/Lmxlbmd0aCkgcmV0dXJuIFwiXCI7XHJcblxyXG4gIGlmICh0aGlzLnNlbGVjdGVkQ2F0ZWdvcmllcy5sZW5ndGggPT09IDEpIHtcclxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnNlbGVjdGVkQ2F0ZWdvcmllc1swXTtcclxuICAgIHJldHVybiB0aGlzLmxhYmVsTWFwW3R5cGVdIHx8IHRoaXMudG9UaXRsZUNhc2UodHlwZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdGhpcy5zZWxlY3RlZENhdGVnb3JpZXNcclxuICAgIC5tYXAoKHQ6YW55KSA9PiB0aGlzLmxhYmVsTWFwW3RdIHx8IHRoaXMudG9UaXRsZUNhc2UodCkpXHJcbiAgICAuam9pbihcIiwgXCIpO1xyXG59XHJcbiAgdHlwZTogYW55O1xyXG4gIC8vIFwiU2VsZWN0IGFsbFwiIC8gXCJVbnNlbGVjdCBhbGxcIiBmb3IgYSB0eXBlXHJcbiAgcG9wdXB2YWx1ZTogYW55O1xyXG4gIC8vIG9yIGp1c3Q6IHBvcHVwdmFsdWU6IHN0cmluZyA9ICcnO1xyXG5cclxuICBvblNlbGVjdEFsbCh0eXBlOiBhbnksIGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGNoZWNrZWQgPSBldmVudD8udGFyZ2V0Py5jaGVja2VkO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0QWxsQnlUeXBlW3R5cGVdID0gY2hlY2tlZDtcclxuICAgIHRoaXMudHlwZSA9IHR5cGU7XHJcbiAgICB0aGlzLnBvcHVwdmFsdWUgPSB0eXBlOyAvLyDwn5S0IElNUE9SVEFOVFxyXG5cclxuICAgIGNvbnN0IGxpc3QgPSB0aGlzLmdldExpc3RCeVR5cGUodHlwZSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEJ5VHlwZVt0eXBlXSA9IGNoZWNrZWQgPyBsaXN0Lm1hcCgoeDogYW55KSA9PiB4LnRlbXBJZCkgOiBbXTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZU92ZXJhbGxTZWxlY3RlZElkcygpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5zZWxlY3RlZEJ5VHlwZSk7XHJcbiAgfVxyXG5cclxuICAvLyBTaW5nbGUgY2hlY2tib3ggY2hhbmdlIGZvciBvbmUgaW1hZ2VcclxuICBvbkltYWdlQ2hlY2tib3hDaGFuZ2UodHlwZTogYW55LCBpZDogYW55KSB7XHJcbiAgICAvLyBlbnN1cmUgYXJyYXkgZXhpc3RzXHJcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zZWxlY3RlZEJ5VHlwZVt0eXBlXSB8fCBbXTtcclxuXHJcbiAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQoY3VycmVudCk7XHJcbiAgICBpZiAoc2VsZWN0ZWQuaGFzKGlkKSkge1xyXG4gICAgICBzZWxlY3RlZC5kZWxldGUoaWQpOyAgIC8vIHVuY2hlY2tcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbGVjdGVkLmFkZChpZCk7ICAgICAgLy8gY2hlY2tcclxuICAgIH1cclxuXHJcbiAgICAvLyBhc3NpZ24gbmV3IGFycmF5IChiZXR0ZXIgZm9yIGNoYW5nZSBkZXRlY3Rpb24pXHJcbiAgICB0aGlzLnNlbGVjdGVkQnlUeXBlW3R5cGVdID0gQXJyYXkuZnJvbShzZWxlY3RlZCk7XHJcblxyXG4gICAgLy8gdG90YWwgaXRlbXMgZm9yIHRoaXMgdHlwZSAobm93IHVzaW5nIGRlZHVwZWQgbGlzdClcclxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5nZXRMaXN0QnlUeXBlKHR5cGUpLmxlbmd0aDtcclxuXHJcbiAgICAvLyDinIUgYXV0by1jaGVjayBcInNlbGVjdCBhbGxcIiB3aGVuIGFsbCBpdGVtcyBvZiB0aGF0IHR5cGUgYXJlIHNlbGVjdGVkXHJcbiAgICB0aGlzLnNlbGVjdEFsbEJ5VHlwZVt0eXBlXSA9XHJcbiAgICAgIHRvdGFsID4gMCAmJiB0aGlzLnNlbGVjdGVkQnlUeXBlW3R5cGVdLmxlbmd0aCA9PT0gdG90YWw7XHJcblxyXG4gICAgY29uc29sZS5sb2coXHJcbiAgICAgIGB0eXBlPSR7dHlwZX0sIHRvdGFsPSR7dG90YWx9LCBzZWxlY3RlZD0ke3RoaXMuc2VsZWN0ZWRCeVR5cGVbdHlwZV0ubGVuZ3RofSwgc2VsZWN0QWxsPSR7dGhpcy5zZWxlY3RBbGxCeVR5cGVbdHlwZV19YFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZU92ZXJhbGxTZWxlY3RlZElkcygpO1xyXG4gICAgdGhpcy5wb3B1cHZhbHVlID0gdHlwZTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgcmVtYXJrczogYW55O1xyXG4gIEBWaWV3Q2hpbGQoXCJ6b29tUG9wdXBcIikgem9vbVBvcHVwOiBFbGVtZW50UmVmO1xyXG4gIHBvcHVwVHlwZTogYW55O1xyXG4gIHBvcHVwSWRzOiBhbnlbXSA9IFtdO1xyXG4gIHBvcHVwT3BlbihcclxuICAgIHR5cGU6IGFueSxcclxuICAgIHZhbHVlPzogYW55IHwgXCJlbXBsb3llZVwiIHwgXCJqdW5rXCIgfCBcImhvdXNlS2VlcGluZ1wiIHwgXCJkdXBsaWNhdGVcIlxyXG4gICkge1xyXG4gICAgLy8gc3RvcmUgdHlwZVxyXG4gICAgdGhpcy5wb3B1cFR5cGUgPSB0eXBlO1xyXG4gICAgdGhpcy5wb3B1cElkcyA9IHRoaXMub3ZlcmFsbFNlbGVjdGVkSWRzIHx8IFtdO1xyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuem9vbVBvcHVwLCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICBzaXplOiBcIm1kXCIsXHJcbiAgICAgIGJhY2tkcm9wOiBcInN0YXRpY1wiLFxyXG4gICAgICBrZXlib2FyZDogZmFsc2UsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhvdXNlS2VlcGluZ0FDQ291bnQ6IGFueTtcclxuICBlbXBsb3llZUFDQ291bnQ6IGFueTtcclxuICBkdXBsaWNhdGVBQ0NvdW50OiBhbnk7XHJcbiAganVua0FDQ291bnQ6IGFueTtcclxuXHJcbiAgc2VsZWN0ZWREdXBsaWNhdGVJbWFnZXNMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHNlbGVjdGVkSG91c2VrZWVwaW5nSW1hZ2VzTGlzdDogYW55W10gPSBbXTtcclxuICBzZWxlY3RlZEVtcGxveWVlSW1hZ2VzTGlzdDogYW55W10gPSBbXTtcclxuICBzZWxlY3RlZEp1bmtJbWFnZXNMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHN1Ym1pdFZhbHVlKHN0YXR1czogc3RyaW5nID0gXCJhcHByb3ZlZFwiLCBjYXRlZ29yeTogc3RyaW5nID0gXCJkdXBsaWNhdGVcIikge1xyXG4gICAgLy8gU3RlcCAxOiBWYWxpZGF0ZSBiYXNlZCBvbiBjdXJyZW50IGNhdGVnb3J5XHJcbiAgICBsZXQgb2JqID0ge1xyXG4gICAgICBpZDogdGhpcy5wb3B1cElkcyxcclxuICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgIHR5cGU6IHRoaXMuaGFzQXBwcm92ZXJBY2Nlc3MmJnRoaXMuc2VsZWN0ZWRSb2xlPT0nYXBwcm92ZXInID8gXCJhcHByb3ZlXCIgOiAgXCJyZXZpZXdcIiAsXHJcbiAgICAgIC4uLih0aGlzLnJlbWFya3M/LnRyaW0oKSAmJiB7IGNvbW1lbnRzOiB0aGlzLnJlbWFya3MudHJpbSgpIH0pXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zZXJ2aWNlXHJcbiAgICAgIC5nZXRVcGRhdGVUZW1wU3RhdHVzQXBpKG9iailcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzPy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoYCR7dGhpcy5vdmVyYWxsU2VsZWN0ZWRJZHM/Lmxlbmd0aCA/ICB0aGlzLm92ZXJhbGxTZWxlY3RlZElkcz8ubGVuZ3RoIDogdGhpcy5wb3B1cFZhbHVlID9cclxuICAgICAgICAgICAgICAgdGhpcy5wb3B1cFZhbHVlOictLSd9ICR7dGhpcy5zZWxlY3RlZENhdGVnb3JpZXNMYWJlbC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRoaXMuc2VsZWN0ZWRDYXRlZ29yaWVzTGFiZWwuc2xpY2UoMSl9ICR7c3RhdHVzfWAgKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5kYXRhU3RvcmVWaWV3KHRoaXMudGlja2V0RGF0YSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbWFya3MgPSBcIlwiO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiRXJyb3IgdXBkYXRpbmcgc3RhdHVzXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZXJyb3JNc2cgPVxyXG4gICAgICAgICAgICBlcnI/LmVycm9yPy5tZXNzYWdlIHx8XHJcbiAgICAgICAgICAgIGVycj8uZXJyb3I/LmVycm9yIHx8XHJcbiAgICAgICAgICAgIGVycj8uZXJyb3IgfHxcclxuICAgICAgICAgICAgZXJyPy5tZXNzYWdlIHx8XHJcbiAgICAgICAgICAgIFwiRXJyb3IgdXBkYXRpbmcgc3RhdHVzXCI7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyb3JNc2cpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICByZXNldFNlbGVjdGlvbnMoKSB7XHJcbiAgICAvLyBjb21wbGV0ZWx5IHJlcGxhY2UgdGhlIG9iamVjdCBzbyBjaGFuZ2UgZGV0ZWN0aW9uIHNlZXMgaXRcclxuICAgIHRoaXMuc2VsZWN0ZWRCeVR5cGUgPSB7XHJcbiAgICAgXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuc2VsZWN0QWxsQnlUeXBlID0ge1xyXG4gICAgIFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkRHVwbGljYXRlc0J5UGFyZW50ID0ge307XHJcblxyXG4gICAgdGhpcy5vdmVyYWxsU2VsZWN0ZWRJZHMgPSBbXTtcclxuICAgIHRoaXMucG9wdXBJZHMgPSBbXTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgXCJSRVNFVCBzZWxlY3Rpb25zOlwiLFxyXG4gICAgICB0aGlzLnNlbGVjdGVkQnlUeXBlLFxyXG4gICAgICB0aGlzLnNlbGVjdGVkRHVwbGljYXRlc0J5UGFyZW50XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsKCkge1xyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gICB0aGlzLnJlc2V0U2VsZWN0aW9ucygpO1xyXG4gICAgICAgICAgICB0aGlzLmFsbFNlbGVjdGVkID0gZmFsc2U7XHJcbiAgfVxyXG4gIG9wZW5BcnJvdygpIHtcclxuICAgICB0aGlzLmFycm93c2hvdyA9ICF0aGlzLmFycm93c2hvdztcclxuICB9XHJcbiAgXHJcblxyXG4gIGdldE9wZW5UaWNrZXRMaXN0KGRhdGE/OiBhbnkpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiZ2V0T3BlblRpY2tldExpc3QgZGF0YTpcIiwgZGF0YSk7XHJcblxyXG4gICAgLy8gc3VwcG9ydCBwYXNzaW5nIGVpdGhlciB3aG9sZSBzdG9yZSBvYmplY3Qgb3IganVzdCB0aWNrZXRJZFxyXG4gICAgY29uc3Qgc2VsZWN0ZWRUaWNrZXRJZCA9IGRhdGE/LnRpY2tldElkID8/IGRhdGE7XHJcblxyXG4gICAgY29uc3Qgb2JqID0ge1xyXG4gICAgICBjbGllbnRJZDogW3RoaXMuaGVhZGVyRmlsdGVycz8uY2xpZW50XSxcclxuICAgICAgZnJvbURhdGU6IHRoaXMuaGVhZGVyRmlsdGVycz8uZGF0ZT8uc3RhcnREYXRlLFxyXG4gICAgICB0b0RhdGU6IHRoaXMuaGVhZGVyRmlsdGVycz8uZGF0ZT8uZW5kRGF0ZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5zZXJ2aWNlXHJcbiAgICAgIC5nZXRPcGVuVGlja2V0TGlzdEFwaShvYmopXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3BlblRpY2tldHNMaXN0ID0gcmVzPy5kYXRhID8/IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVzZXQgc2VsZWN0aW9uXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZXMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5hbGxTZWxlY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5UaWNrZXRzTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBzdG9yZVRvU2VsZWN0OiBhbnkgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICAvLyDwn5GJIDEpIGlmIGRhdGEgcGFzc2VkLCB0cnkgdG8gbWF0Y2ggaW4gTkVXIGxpc3QgYnkgdGlja2V0SWRcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkVGlja2V0SWQpIHtcclxuICAgICAgICAgICAgICBzdG9yZVRvU2VsZWN0ID0gdGhpcy5vcGVuVGlja2V0c0xpc3QuZmluZChcclxuICAgICAgICAgICAgICAgIChzOiBhbnkpID0+IHMudGlja2V0SWQgPT09IHNlbGVjdGVkVGlja2V0SWRcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyDwn5GJIDIpIGlmIG5vIG1hdGNoIG9yIG5vIGRhdGEg4oaSIGZhbGxiYWNrIHRvIDAgaW5kZXhcclxuICAgICAgICAgICAgaWYgKCFzdG9yZVRvU2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgc3RvcmVUb1NlbGVjdCA9IHRoaXMub3BlblRpY2tldHNMaXN0WzBdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyDwn5GJIDMpIHNldCBzZWxlY3Rpb24gKyBjYWxsIGhhbmRsZXJcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlcyA9IFtzdG9yZVRvU2VsZWN0XTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhU3RvcmVWaWV3KHN0b3JlVG9TZWxlY3QpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5vcGVuVGlja2V0c0xpc3QgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlcyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmFsbFNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vcGVuVGlja2V0c0xpc3QgPSBbXTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZXMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcbiAgaXNMb2NrZWRCeVJldmlld2VyKG9yaWdpbmFsOiBhbnkpOiBib29sZWFuIHtcclxuICAgIC8vIPCflLkgQXBwcm92ZXIgZmxvd1xyXG4gICAgaWYgKHRoaXMuaGFzQXBwcm92ZXJBY2Nlc3MpIHtcclxuICAgICAgdGhpcy5nZXRDdXJyZW50Um9sZU1hcHBpbmcoKTtcclxuXHJcbiAgICAgIC8vIGxvY2sgaWYgYWxyZWFkeSBhcHByb3ZlZC9yZWplY3RlZCBieSBBUFBST1ZFUlxyXG4gICAgICByZXR1cm4gdGhpcy5pc0FwcHJvdmVkMShvcmlnaW5hbCkgfHwgdGhpcy5pc1JlamVjdGVkMShvcmlnaW5hbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g8J+UuSBSZXZpZXdlciBmbG93XHJcbiAgICB0aGlzLmdldEN1cnJlbnRSZXZpZXdNYXBwaW5nKCk7XHJcblxyXG4gICAgLy8gbG9jayBpZiBhbHJlYWR5IGFwcHJvdmVkL3JlamVjdGVkIGJ5IFJFVklFV1xyXG4gICAgcmV0dXJuIHRoaXMuaXNBcHByb3ZlZChvcmlnaW5hbCkgfHwgdGhpcy5pc1JlamVjdGVkKG9yaWdpbmFsKTtcclxuICB9XHJcblxyXG4gIGlzQXBwcm92ZWQxKG9yaWdpbmFsOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGFjdGlvbnMgPSBvcmlnaW5hbD8uYWN0aW9ucyB8fCBbXTtcclxuICAgIHJldHVybiBhY3Rpb25zLnNvbWUoXHJcbiAgICAgIChhOiBhbnkpID0+IGEuYWN0aW9uVHlwZSA9PT0gXCJhcHByb3ZlXCIgJiYgYS5hY3Rpb24gPT09IFwiYXBwcm92ZWRcIlxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGlzUmVqZWN0ZWQxKG9yaWdpbmFsOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGFjdGlvbnMgPSBvcmlnaW5hbD8uYWN0aW9ucyB8fCBbXTtcclxuICAgIHJldHVybiBhY3Rpb25zLnNvbWUoXHJcbiAgICAgIChhOiBhbnkpID0+IGEuYWN0aW9uVHlwZSA9PT0gXCJhcHByb3ZlXCIgJiYgYS5hY3Rpb24gPT09IFwicmVqZWN0ZWRcIlxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGlzQXBwcm92ZWQob3JpZ2luYWw6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYWN0aW9ucyA9IG9yaWdpbmFsPy5hY3Rpb25zIHx8IFtdO1xyXG4gICAgcmV0dXJuIGFjdGlvbnMuc29tZShcclxuICAgICAgKGE6IGFueSkgPT4gYS5hY3Rpb25UeXBlID09PSBcInJldmlld1wiICYmIGEuYWN0aW9uID09PSBcImFwcHJvdmVkXCJcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBpc1JlamVjdGVkKG9yaWdpbmFsOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGFjdGlvbnMgPSBvcmlnaW5hbD8uYWN0aW9ucyB8fCBbXTtcclxuICAgIHJldHVybiBhY3Rpb25zLnNvbWUoXHJcbiAgICAgIChhOiBhbnkpID0+IGEuYWN0aW9uVHlwZSA9PT0gXCJyZXZpZXdcIiAmJiBhLmFjdGlvbiA9PT0gXCJyZWplY3RlZFwiXHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG4gIHJlc2V0Q2hlY2tib3goXHJcbiAgICB0eXBlOiBhbnksXHJcbiAgICBvcmlnaW5hbDogYW55XHJcbiAgKSB7XHJcbiAgICBpZiAoIW9yaWdpbmFsPy5hY3Rpb25zIHx8ICFBcnJheS5pc0FycmF5KG9yaWdpbmFsLmFjdGlvbnMpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhY3Rpb25zID0gb3JpZ2luYWwuYWN0aW9ucztcclxuXHJcbiAgICAvLyAxKSBDaGVjayBpZiB0aGVyZSBpcyBhIGRlY2lzaW9uIChyZXZpZXcvYXBwcm92ZSDihpIgYXBwcm92ZWQvcmVqZWN0ZWQpXHJcbiAgICBjb25zdCBoYXNEZWNpc2lvbiA9IGFjdGlvbnMuc29tZSgoYTogYW55KSA9PlxyXG4gICAgKFxyXG4gICAgICAoYS5hY3Rpb25UeXBlID09PSBcInJldmlld1wiIHx8IGEuYWN0aW9uVHlwZSA9PT0gXCJhcHByb3ZlXCIpICYmXHJcbiAgICAgIChhLmFjdGlvbiA9PT0gXCJhcHByb3ZlZFwiIHx8IGEuYWN0aW9uID09PSBcInJlamVjdGVkXCIpXHJcbiAgICApXHJcbiAgICApO1xyXG5cclxuICAgIC8vIElmIE5PIGFwcHJvdmVkL3JlamVjdGVkIOKGkiBkbyBub3RoaW5nXHJcbiAgICBpZiAoIWhhc0RlY2lzaW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyAyKSBSZW1vdmUgb25seSBkZWNpc2lvbiBhY3Rpb25zXHJcbiAgICBvcmlnaW5hbC5hY3Rpb25zID0gYWN0aW9ucy5maWx0ZXIoXHJcbiAgICAgIChhOiBhbnkpID0+XHJcbiAgICAgICAgIShcclxuICAgICAgICAgIChhLmFjdGlvblR5cGUgPT09IFwicmV2aWV3XCIgfHwgYS5hY3Rpb25UeXBlID09PSBcImFwcHJvdmVcIikgJiZcclxuICAgICAgICAgIChhLmFjdGlvbiA9PT0gXCJhcHByb3ZlZFwiIHx8IGEuYWN0aW9uID09PSBcInJlamVjdGVkXCIpXHJcbiAgICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyAzKSBSZW1vdmUgZnJvbSBzZWxlY3RlZCBhcnJheVxyXG4gICAgY29uc3QgdGVtcElkID0gb3JpZ2luYWwudGVtcElkO1xyXG4gICAgY29uc3QgYXJyID0gdGhpcy5zZWxlY3RlZEJ5VHlwZVt0eXBlXSB8fCBbXTtcclxuICAgIGNvbnN0IGkgPSBhcnIuaW5kZXhPZih0ZW1wSWQpO1xyXG4gICAgaWYgKGkgPiAtMSkgYXJyLnNwbGljZShpLCAxKTtcclxuXHJcbiAgICAvLyA0KSBVbmNoZWNrIHNlbGVjdCBhbGwgZm9yIHRoYXQgdHlwZVxyXG4gICAgdGhpcy5zZWxlY3RBbGxCeVR5cGVbdHlwZV0gPSBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICB2aWV3TW9kZTogXCJ0YW5nb3Jldmlld1wiIHwgXCJhcHByb3ZlXCIgfCBcInJldmlld1wiIHwgXCJ0YWdnaW5nXCIgPSBcInRhZ2dpbmdcIjtcclxuICBnZXRBY3Rpb24ob3JpZ2luYWw6IGFueSwgdHlwZTogXCJ0YWdnaW5nXCIgfCBcInJldmlld1wiIHwgXCJ0YW5nb3Jldmlld1wiIHwgXCJhcHByb3ZlXCIpIHtcclxuICAgIHJldHVybiBvcmlnaW5hbD8uYWN0aW9ucz8uZmluZCgoYTogYW55KSA9PiBhLmFjdGlvblR5cGUgPT09IHR5cGUpIHx8IG51bGw7XHJcbiAgfVxyXG4gIHVwZGF0ZUNsb3NlQnV0dG9uRnJvbVN0b3JlKCkge1xyXG4gICAgY29uc3QgbWFwcGluZyA9IHRoaXMuZ2V0Q3VycmVudFJldmlld01hcHBpbmcoKTtcclxuICAgIGNvbnNvbGUubG9nKCdtYXBwaW5nIHVzZWQgZm9yIGNsb3NlIGNhbGM6JywgbWFwcGluZyk7XHJcblxyXG4gICAgLy8gaWYgbm8gbWFwcGluZyBmb3VuZCwga2VlcCBjbG9zZUJ0biBmYWxzZVxyXG4gICAgdGhpcy5jbG9zZUJ0biA9ICEhbWFwcGluZyAmJiB0aGlzLmlzVGlja2V0RnVsbHlSZXZpZXdlZChtYXBwaW5nKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnY2xvc2VCdG4gPT4nLCB0aGlzLmNsb3NlQnRuKTtcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRSZXZpZXdNYXBwaW5nKCk6IGFueSB7XHJcbiAgICBpZiAoIXRoaXMuZm9vdGZhbGxUaWNrZXRzRGF0YSB8fCAhdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHbyB0aHJvdWdoIGFsbCB0aWNrZXRzIGFuZCBtYXBwaW5nSW5mb1xyXG4gICAgZm9yIChjb25zdCB0aWNrZXQgb2YgdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhKSB7XHJcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHRpY2tldD8uX3NvdXJjZTtcclxuICAgICAgY29uc3QgbWFwcGluZ0xpc3QgPSBzb3VyY2U/Lm1hcHBpbmdJbmZvIHx8IFtdO1xyXG5cclxuICAgICAgLy8gcGljayB0aGUgZmlyc3QgbWFwcGluZyB3aXRoIHR5cGUgJ3JldmlldycgdGhhdCBoYXMgcmV2aXNlZERldGFpbFxyXG4gICAgICBjb25zdCBmb3VuZCA9IG1hcHBpbmdMaXN0LmZpbmQoXHJcbiAgICAgICAgKG06IGFueSkgPT4gbT8udHlwZSA9PT0gJ3JldmlldycgJiYgbT8ucmV2aXNlZERldGFpbD8ubGVuZ3RoXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICByZXR1cm4gZm91bmQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8gRGVjaWRlIGlmIHRpY2tldCBpcyBmdWxseSByZXZpZXdlZCBiYXNlZCBvbiBBTEwgbWFwcGluZ0luZm9bdHlwZT0ncmV2aWV3J11cclxuICBpc1RpY2tldEZ1bGx5UmV2aWV3ZWQobWFwcGluZzogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIW1hcHBpbmc/LnJldmlzZWREZXRhaWwpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBkZXRhaWxzID0gbWFwcGluZy5yZXZpc2VkRGV0YWlsIGFzIGFueVtdO1xyXG5cclxuICAgIGNvbnN0IG5vbkR1cFR5cGVzID0gW1wiZW1wbG95ZWVcIiwgXCJqdW5rXCIsIFwiaG91c2VLZWVwaW5nXCJdO1xyXG5cclxuICAgIGNvbnN0IG5vbkR1cEl0ZW1zID0gZGV0YWlscy5maWx0ZXIoZCA9PlxyXG4gICAgICBub25EdXBUeXBlcy5pbmNsdWRlcyhkLnJldm9wc1R5cGUpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IG5vbkR1cFJldmlld2VkQ291bnQgPSBub25EdXBJdGVtcy5maWx0ZXIoZCA9PiB7XHJcbiAgICAgIGNvbnN0IHJldmlldyA9IHRoaXMuZ2V0QWN0aW9uKGQsIFwicmV2aWV3XCIpO1xyXG4gICAgICByZXR1cm4gcmV2aWV3ICYmIChyZXZpZXcuYWN0aW9uID09PSBcImFwcHJvdmVkXCIgfHwgcmV2aWV3LmFjdGlvbiA9PT0gXCJyZWplY3RlZFwiKTtcclxuICAgIH0pLmxlbmd0aDtcclxuXHJcbiAgICBjb25zdCBwYXJlbnRJdGVtcyA9IGRldGFpbHMuZmlsdGVyKGQgPT4gZC5pc1BhcmVudCk7XHJcblxyXG4gICAgY29uc3QgZHVwQ2hpbGRyZW4gPSBwYXJlbnRJdGVtcy5yZWR1Y2UoKGFjYzogYW55W10sIHA6IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4gYWNjLmNvbmNhdChwLmR1cGxpY2F0ZUltYWdlIHx8IFtdKTtcclxuICAgIH0sIFtdKTtcclxuXHJcbiAgICBjb25zdCBkdXBSZXZpZXdlZENvdW50ID0gZHVwQ2hpbGRyZW4uZmlsdGVyKGQgPT4ge1xyXG4gICAgICBjb25zdCByZXZpZXcgPSB0aGlzLmdldEFjdGlvbihkLCBcInJldmlld1wiKTtcclxuICAgICAgcmV0dXJuIHJldmlldyAmJiAocmV2aWV3LmFjdGlvbiA9PT0gXCJhcHByb3ZlZFwiIHx8IHJldmlldy5hY3Rpb24gPT09IFwicmVqZWN0ZWRcIik7XHJcbiAgICB9KS5sZW5ndGg7XHJcblxyXG4gICAgY29uc3QgdG90YWxUb1JldmlldyA9IG5vbkR1cEl0ZW1zLmxlbmd0aCArIGR1cENoaWxkcmVuLmxlbmd0aDtcclxuICAgIGNvbnN0IHRvdGFsUmV2aWV3ZWQgPSBub25EdXBSZXZpZXdlZENvdW50ICsgZHVwUmV2aWV3ZWRDb3VudDtcclxuXHJcbiAgICByZXR1cm4gdG90YWxUb1JldmlldyA+IDAgJiYgdG90YWxSZXZpZXdlZCA9PT0gdG90YWxUb1JldmlldztcclxuICB9XHJcblxyXG5cclxuICBnZXRJbml0aWFsc0Zyb21FbWFpbChlbWFpbD86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWVtYWlsKSByZXR1cm4gXCJcIjtcclxuXHJcbiAgICAvLyB0YWtlIHRleHQgYmVmb3JlIEBcclxuICAgIGNvbnN0IG5hbWVQYXJ0ID0gZW1haWwuc3BsaXQoXCJAXCIpWzBdO1xyXG5cclxuICAgIC8vIHNwbGl0IGJ5IC4gb3Igc3BhY2UgKGUuZy4gXCJzYW5kZWVwLnBhbFwiIC0+IFtcInNhbmRlZXBcIiwgXCJwYWxcIl0pXHJcbiAgICBjb25zdCBwYXJ0cyA9IG5hbWVQYXJ0LnNwbGl0KC9bLlxcc18tXSsvKS5maWx0ZXIoQm9vbGVhbik7XHJcblxyXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgIHJldHVybiAocGFydHNbMF1bMF0gKyBwYXJ0c1sxXVswXSkudG9VcHBlckNhc2UoKTsgLy8gUyArIFAgPSBTUFxyXG4gICAgfVxyXG5cclxuICAgIC8vIGZhbGxiYWNrOiBmaXJzdCB0d28gY2hhcnMgb2Ygd2hvbGUgbmFtZVBhcnRcclxuICAgIHJldHVybiBuYW1lUGFydC5zdWJzdHJpbmcoMCwgMikudG9VcHBlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIGNvbmZpcm1DbG9zZVRpY2tldCgpIHtcclxuICAgIGxldCBvYmogPSB7XHJcbiAgICAgIHRpY2tldE5hbWU6IFwiZm9vdGZhbGwtZGlyZWN0b3J5XCIsXHJcbiAgICAgIHN0b3JlSWQ6IHRoaXMuZm9vdGZhbGxUaWNrZXRzRGF0YVswXT8uX3NvdXJjZT8uc3RvcmVJZCxcclxuICAgICAgZGF0ZVN0cmluZzogdGhpcy5mb290ZmFsbFRpY2tldHNEYXRhWzBdPy5fc291cmNlPy5kYXRlU3RyaW5nLFxyXG4gICAgICB0eXBlOiB0aGlzLmhhc0FwcHJvdmVyQWNjZXNzJiZ0aGlzLnNlbGVjdGVkUm9sZT09J2FwcHJvdmVyJyA/IFwiYXBwcm92ZVwiIDogXCJyZXZpZXdcIixcclxuICAgICAgbW9kZTogXCJ3ZWJcIixcclxuICAgIH07XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcImNsb3NlIHRpY2tldCBvYmo6XCIsIG9iaik7XHJcbiAgICAvLyByZXR1cm5cclxuICAgIHRoaXMuc2VydmljZVxyXG4gICAgICAuZ2V0Q3JlYXRlVGlja2V0TGlzdEFwaShvYmopXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHMuZ2V0U3VjY2Vzc1RvYXN0KFwiVGlja2V0IGNsb3NlZCBzdWNjZXNzZnVsbHlcIik7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlybUNsb3NlQ2FuY2VsKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YVN0b3JlVmlldyh0aGlzLnRpY2tldERhdGEpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiRXJyb3IgY2xvc2luZyB0aWNrZXRcIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID1cclxuICAgICAgICAgICAgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fFxyXG4gICAgICAgICAgICBlcnI/LmVycm9yPy5lcnJvciB8fFxyXG4gICAgICAgICAgICBlcnI/LmVycm9yIHx8XHJcbiAgICAgICAgICAgIGVycj8ubWVzc2FnZSB8fFxyXG4gICAgICAgICAgICBcIkVycm9yIGNsb3NpbmcgdGlja2V0XCI7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyb3JNc2cpO1xyXG4gICAgICAgICAgdGhpcy5pc0NoZWNrYm94RW5hYmxlID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuY2xvc2VCdG4gPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5jbG9zZURpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGNvbmZpcm1DbG9zZUNhbmNlbCgpIHtcclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICB9XHJcbiAgQFZpZXdDaGlsZChcImltYWdlUHJldmlld1BvcHVwXCIpIGltYWdlUHJldmlld1BvcHVwOiBFbGVtZW50UmVmO1xyXG4gIHByZXZpZXdMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIGN1cnJlbnRQcmV2aWV3SW5kZXggPSAwO1xyXG4gIHByZXZpZXdUaXRsZSA9ICdUYWdnZWQgRHVwbGljYXRlcyc7XHJcbmdldCBjdXJyZW50UHJldmlld0l0ZW0oKSB7XHJcbiAgaWYgKCF0aGlzLnByZXZpZXdMaXN0IHx8ICF0aGlzLnByZXZpZXdMaXN0Lmxlbmd0aCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBpZiAoXHJcbiAgICB0aGlzLmN1cnJlbnRQcmV2aWV3SW5kZXggPT0gbnVsbCB8fFxyXG4gICAgdGhpcy5jdXJyZW50UHJldmlld0luZGV4IDwgMCB8fFxyXG4gICAgdGhpcy5jdXJyZW50UHJldmlld0luZGV4ID49IHRoaXMucHJldmlld0xpc3QubGVuZ3RoXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHJldHVybiB0aGlzLnByZXZpZXdMaXN0W3RoaXMuY3VycmVudFByZXZpZXdJbmRleF07XHJcbn1cclxuXHJcblxyXG5cclxuICBnZXRQcmV2aWV3SW1hZ2VVcmwoKSB7XHJcbiAgICBjb25zdCBpdGVtID0gdGhpcy5jdXJyZW50UHJldmlld0l0ZW07XHJcbiAgICBjb25zb2xlLmxvZyhpdGVtKVxyXG4gICAgcmV0dXJuIGl0ZW0gPyB0aGlzLmltYWdlVXJsICsgaXRlbS5maWxlUGF0aCA6ICcnO1xyXG4gIH1cclxub3ZlcmFsbE1hcHBpbmc6YW55O1xyXG5vcGVuSW1hZ2VQcmV2aWV3KGxpc3Q6IGFueSwgdGFyZ2V0OiBhbnksIHN0YXJ0SW5kZXg6IG51bWJlciwgdGl0bGU6IHN0cmluZykge1xyXG4gICAgdGhpcy5vdmVyYWxsTWFwcGluZyA9IGxpc3Q7XHJcbiAgICB0aGlzLnByZXZpZXdUaXRsZSA9IHRpdGxlO1xyXG5cclxuICAgIC8vIDEpIElmIHRhcmdldCBoYXMgZHVwbGljYXRlSW1hZ2UgYXJyYXkg4oaSIHVzZSB0aGF0XHJcbiAgICBpZiAodGFyZ2V0Py5kdXBsaWNhdGVJbWFnZSAmJiBBcnJheS5pc0FycmF5KHRhcmdldC5kdXBsaWNhdGVJbWFnZSkgJiYgdGFyZ2V0LmR1cGxpY2F0ZUltYWdlLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnByZXZpZXdMaXN0ID0gdGFyZ2V0LmR1cGxpY2F0ZUltYWdlO1xyXG4gICAgfVxyXG4gICAgLy8gMikgRWxzZSBpZiB0YXJnZXQgaXRzZWxmIGlzIGFuIGFycmF5IChsaWtlIHJldmlzZWREZXRhaWwpIOKGkiB1c2UgdGhhdFxyXG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIHRhcmdldC5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5wcmV2aWV3TGlzdCA9IHRhcmdldDtcclxuICAgIH1cclxuICAgIC8vIDMpIEVsc2UgdHJlYXQgdGFyZ2V0IGFzIHNpbmdsZSBpdGVtXHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5wcmV2aWV3TGlzdCA9IFt0YXJnZXRdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUubG9nKCdQcmV2aWV3IGxpc3Qgc2V0OicsIHRoaXMucHJldmlld0xpc3QpO1xyXG5cclxuICAgIC8vIG1ha2Ugc3VyZSBpbmRleCBpcyBzYWZlXHJcbiAgICBpZiAoXHJcbiAgICAgIHN0YXJ0SW5kZXggIT0gbnVsbCAmJlxyXG4gICAgICBzdGFydEluZGV4ID49IDAgJiZcclxuICAgICAgc3RhcnRJbmRleCA8IHRoaXMucHJldmlld0xpc3QubGVuZ3RoXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5jdXJyZW50UHJldmlld0luZGV4ID0gc3RhcnRJbmRleDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFByZXZpZXdJbmRleCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmltYWdlUHJldmlld1BvcHVwLCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICBzaXplOiAnbGcnLFxyXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4vLyAxKSBDaGVjayBpZiB0aGVyZSBpcyBhbiBBUFBST1ZFIG1hcHBpbmcgd2l0aCBzdGF0dXMgQ2xvc2VkIGluIG92ZXJhbGwgbWFwcGluZ1xyXG5vdmVyYWxsQXBwcm92ZUNsb3NlZCgpOiBib29sZWFuIHtcclxuICBjb25zdCBsaXN0ID0gdGhpcy5vdmVyYWxsTWFwcGluZyB8fCBbXTtcclxuXHJcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkobGlzdCkgJiYgbGlzdC5zb21lKChtOiBhbnkpID0+XHJcbiAgICBtPy50eXBlID09PSAnYXBwcm92ZScgJiZcclxuICAgIG0/LnN0YXR1cz8udG9Mb3dlckNhc2UoKSA9PT0gJ2Nsb3NlZCdcclxuICApO1xyXG59XHJcblxyXG4vLyAyKSBHZXQgYXBwcm92ZSBhY3Rpb24gZm9yIGEgc2luZ2xlIGltYWdlXHJcbmdldEFwcHJvdmVBY3Rpb25Gb3JJdGVtKGl0ZW06IGFueSk6IGFueSB8IG51bGwge1xyXG4gIGNvbnN0IGFjdGlvbnMgPSBpdGVtPy5hY3Rpb25zIHx8IFtdO1xyXG4gIHJldHVybiBhY3Rpb25zLmZpbmQoXHJcbiAgICAoYTogYW55KSA9PlxyXG4gICAgICBhLmFjdGlvblR5cGUgPT09ICdhcHByb3ZlJyAmJlxyXG4gICAgICAoYS5hY3Rpb24gPT09ICdhcHByb3ZlZCcgfHwgYS5hY3Rpb24gPT09ICdyZWplY3RlZCcpXHJcbiAgKSB8fCBudWxsO1xyXG59XHJcblxyXG4vLyAzKSBGaW5hbCBmdW5jdGlvbjogY2FuIHdlIHNob3cgQWNjZXB0IC8gUmVqZWN0IGZvciB0aGlzIGltYWdlP1xyXG5jYW5TaG93UHJldmlld0FjdGlvbnMoaXRlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgLy8gaWYgb3ZlcmFsbCBhcHByb3ZlIGlzIGNsb3NlZCAtPiBubyBidXR0b25zXHJcbiAgaWYgKHRoaXMub3ZlcmFsbEFwcHJvdmVDbG9zZWQoKSkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gaWYgdGhpcyBpbWFnZSBhbHJlYWR5IGhhcyBhcHByb3ZlIGFwcHJvdmVkL3JlamVjdGVkIC0+IG5vIGJ1dHRvbnNcclxuICBjb25zdCBhcHByb3ZlQWN0aW9uID0gdGhpcy5nZXRBcHByb3ZlQWN0aW9uRm9ySXRlbShpdGVtKTtcclxuICBpZiAoYXBwcm92ZUFjdGlvbikge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gb3RoZXJ3aXNlIC0+IHNob3cgYnV0dG9uc1xyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG4gIHByZXZQcmV2aWV3KCkge1xyXG4gICAgaWYgKHRoaXMucHJldmlld0xpc3QubGVuZ3RoIDw9IDEpIHJldHVybjtcclxuICAgIHRoaXMuY3VycmVudFByZXZpZXdJbmRleCA9XHJcbiAgICAgIHRoaXMuY3VycmVudFByZXZpZXdJbmRleCA9PT0gMFxyXG4gICAgICAgID8gdGhpcy5wcmV2aWV3TGlzdC5sZW5ndGggLSAxXHJcbiAgICAgICAgOiB0aGlzLmN1cnJlbnRQcmV2aWV3SW5kZXggLSAxO1xyXG4gIH1cclxuXHJcbiAgbmV4dFByZXZpZXcoKSB7XHJcbiAgICBpZiAodGhpcy5wcmV2aWV3TGlzdC5sZW5ndGggPD0gMSkgcmV0dXJuO1xyXG4gICAgdGhpcy5jdXJyZW50UHJldmlld0luZGV4ID1cclxuICAgICAgdGhpcy5jdXJyZW50UHJldmlld0luZGV4ID09PSB0aGlzLnByZXZpZXdMaXN0Lmxlbmd0aCAtIDFcclxuICAgICAgICA/IDBcclxuICAgICAgICA6IHRoaXMuY3VycmVudFByZXZpZXdJbmRleCArIDE7XHJcbiAgfVxyXG5wb3B1cFZhbHVlOmFueTtcclxucmVqZWN0ZWRQb3B1cCh0eXBlOmFueSx2YWx1ZTphbnkpe1xyXG4gIHRoaXMub3ZlcmFsbFNlbGVjdGVkSWRzID0gW3ZhbHVlPy5pZF07XHJcbiAgdGhpcy5wb3B1cFZhbHVlID0xO1xyXG50aGlzLnBvcHVwT3Blbih0eXBlKVxyXG59XHJcbmFwcHJvdmVkUG9wdXAodHlwZTphbnksdmFsdWU6YW55KXtcclxuICB0aGlzLm92ZXJhbGxTZWxlY3RlZElkcyA9IFt2YWx1ZT8uaWRdXHJcbiAgIHRoaXMucG9wdXBWYWx1ZSA9MTtcclxuICB0aGlzLnBvcHVwT3Blbih0eXBlKVxyXG59XHJcbiAgZ2V0IGhhc0FwcHJvdmVyQWNjZXNzKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcGVybSA9IHRoaXMudXNlcnNEZXRhaWxzPy5wZXJtaXNzaW9uO1xyXG4gICAgcmV0dXJuICEhKFxyXG4gICAgICBwZXJtPy5Gb290ZmFsbERpcmVjdG9yeV9hcHByb3Zlcl9pc0FkZCB8fFxyXG4gICAgICBwZXJtPy5Gb290ZmFsbERpcmVjdG9yeV9hcHByb3Zlcl9pc0VkaXRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzUmV2aWV3ZXJBY2Nlc3MoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBwZXJtID0gdGhpcy51c2Vyc0RldGFpbHM/LnBlcm1pc3Npb247XHJcbiAgICByZXR1cm4gISEoXHJcbiAgICAgIHBlcm0/LkZvb3RmYWxsRGlyZWN0b3J5X3Jldmlld2VyX2lzQWRkIHx8XHJcbiAgICAgIHBlcm0/LkZvb3RmYWxsRGlyZWN0b3J5X3Jldmlld2VyX2lzRWRpdFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIGNhbGwgdGhpcyBpbiBuZ09uSW5pdCBvciBhZnRlciB1c2Vyc0RldGFpbHMgaXMgbG9hZGVkXHJcbiAgc2V0RGVmYXVsdFJvbGUoKSB7XHJcbiAgICBpZiAodGhpcy5oYXNBcHByb3ZlckFjY2Vzcykge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUm9sZSA9ICdhcHByb3Zlcic7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaGFzUmV2aWV3ZXJBY2Nlc3MpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFJvbGUgPSAncmV2aWV3ZXInO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFJvbGUgPSAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIFNlbGVjdGVkUm9sZShyb2xlOiAnYXBwcm92ZXInIHwgJ3Jldmlld2VyJykge1xyXG4gICAgaWYgKHJvbGUgPT09ICdhcHByb3ZlcicgJiYgIXRoaXMuaGFzQXBwcm92ZXJBY2Nlc3MpIHJldHVybjtcclxuICAgIGlmIChyb2xlID09PSAncmV2aWV3ZXInICYmICF0aGlzLmhhc1Jldmlld2VyQWNjZXNzKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZFJvbGUgPSByb2xlO1xyXG50aGlzLmdldFRpY2tldExpc3QoJ3N0b3JlJyk7XHJcbiAgICAvLyDwn5S5IHB1dCB5b3VyIHJvbGUtYmFzZWQgbG9naWMgaGVyZTpcclxuICAgIC8vIGUuZy4gZmlsdGVyIG1hcHBpbmdJbmZvLCBjaGFuZ2UgQVBJIGNhbGwsIGV0Yy5cclxuICAgIC8vIHRoaXMubG9hZFJvbGVEYXRhKHJvbGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIHNob3dBcHByb3ZlRGV0YWlscyA9IGZhbHNlO1xyXG4gIHNob3dUYW5nb0RldGFpbHMgPSBmYWxzZTtcclxuXHJcbiAgdG9nZ2xlUmV2aXNlZERldGFpbHMobWFwcGluZzogYW55KSB7XHJcbiAgICBpZiAobWFwcGluZz8udHlwZSA9PT0gJ2FwcHJvdmUnKSB7XHJcbiAgICAgIHRoaXMuc2hvd0FwcHJvdmVEZXRhaWxzID0gIXRoaXMuc2hvd0FwcHJvdmVEZXRhaWxzO1xyXG4gICAgfSBlbHNlIGlmIChtYXBwaW5nPy50eXBlID09PSAndGFuZ29yZXZpZXcnKSB7XHJcbiAgICAgIHRoaXMuc2hvd1RhbmdvRGV0YWlscyA9ICF0aGlzLnNob3dUYW5nb0RldGFpbHM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxucmV2aXdlckxpc3Q6YW55O1xyXG5yZXZpZXdyQXBpKCl7XHJcbnRoaXMuc2VydmljZS5nZXRSZXZpZXdlckFwaSh0aGlzLmhlYWRlckZpbHRlcnM/LmNsaWVudCwnYXBwcm92ZScpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzPy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy5yZXZpd2VyTGlzdCA9IHJlcz8uZGF0YVxyXG4gICAgICAgICAgfSBlbHNle1xyXG4gICAgICAgICAgICB0aGlzLnJldml3ZXJMaXN0ID1bXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCBlcnJvcjooZXJyKT0+IHtcclxuICAgICAgICAgIFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcblxyXG59XHJcbiByZXZpZXdlckNoYW5nZShldmVudDogYW55KSB7XHJcbiB0aGlzLnNlbGVjdGVkUmV2aWV3ZXIgPSBldmVudDtcclxuIH1cclxuYXNzaWduVGlja2V0Vmlldygpe1xyXG4gICAgbGV0IG9iaiA9IHtcclxuICBlbWFpbDogdGhpcy5zZWxlY3RlZFJldmlld2VyPy5lbWFpbCxcclxuICB1c2VyTmFtZTogdGhpcy5zZWxlY3RlZFJldmlld2VyPy51c2VyTmFtZSxcclxuICByb2xlOiB0aGlzLnNlbGVjdGVkUmV2aWV3ZXI/LnJvbGUsXHJcbiAgYWN0aW9uVHlwZTogXCJyZXZpZXdcIixcclxuICBzdG9yZUlkOiB0aGlzLnRpY2tldERhdGE/LnN0b3JlSWQsXHJcbiAgZGF0ZVN0cmluZzogdGhpcy50aWNrZXREYXRhPy5pc3N1ZURhdGUsXHJcbiAgICAgIH07XHJcbiAgICB0aGlzLnNlcnZpY2UuZ2V0VGlja2V0QXNzaWduQXBpKG9iaikucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdCgnVXNlciBhc3NpZ25lZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsYXNzaWduKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJFcnJvciB1cGRhdGluZyBzdGF0dXNcIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxlcnJvcjooZXJyKT0+e1xyXG4gICAgICAgICAgY29uc3QgZXJyb3JNc2cgPVxyXG4gICAgICAgICAgICBlcnI/LmVycm9yPy5tZXNzYWdlIHx8XHJcbiAgICAgICAgICAgIGVycj8uZXJyb3I/LmVycm9yIHx8XHJcbiAgICAgICAgICAgIGVycj8uZXJyb3IgfHxcclxuICAgICAgICAgICAgZXJyPy5tZXNzYWdlIHx8XHJcbiAgICAgICAgICAgIFwiRXJyb3IgY2xvc2luZyB0aWNrZXRcIjtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnJvck1zZyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxufVxyXG5jYW5jZWxhc3NpZ24oKXtcclxuICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XHJcbiAgdGhpcy5yZXZpd2VyTGlzdCA9W107XHJcbiAgdGhpcy5zZWxlY3RlZFJldmlld2VyID1bXTtcclxufVxyXG5pc1RpY2tldE1lbnVPcGVuID0gZmFsc2U7XHJcblxyXG4gIHRvZ2dsZVRpY2tldE1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5pc1RpY2tldE1lbnVPcGVuID0gIXRoaXMuaXNUaWNrZXRNZW51T3BlbjtcclxuICB9XHJcblxyXG4gIC8vIGNsb3NlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZVxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcclxuICBvbkRvY3VtZW50Q2xpY2soKSB7XHJcbiAgICB0aGlzLmlzVGlja2V0TWVudU9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG5vblJlYXNzaWduQ2xpY2soKSB7XHJcbiAgdGhpcy5pc1RpY2tldE1lbnVPcGVuID0gZmFsc2U7XHJcbiAgLy8g8J+UuSBvcGVuIHlvdXIgcG9wdXAgaGVyZVxyXG4gIHRoaXMub3BlblJlYXNzaWduUG9wdXAoKTsgICAvLyBpbXBsZW1lbnQgdGhpc1xyXG59XHJcbiAgQFZpZXdDaGlsZChcIlJlYXNzaWduVGlja2V0UG9wdXBcIikgUmVhc3NpZ25UaWNrZXRQb3B1cDogRWxlbWVudFJlZjtcclxub3BlblJlYXNzaWduUG9wdXAoKXtcclxuICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5SZWFzc2lnblRpY2tldFBvcHVwLCB7XHJcbiAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgIHNpemU6IFwibWRcIixcclxuICAgIHNjcm9sbGFibGU6IHRydWUsXHJcbiAgICBiYWNrZHJvcDogXCJzdGF0aWNcIixcclxuICB9KTtcclxuICB0aGlzLnJldmlld3JBcGkoKTtcclxufVxyXG5vbkV4cG9ydENsaWNrKCkge1xyXG4gIHRoaXMuaXNUaWNrZXRNZW51T3BlbiA9IGZhbHNlO1xyXG4gIC8vIPCflLkgY2FsbCB5b3VyIGV4cG9ydCBBUEkgLyBsb2dpYyBoZXJlXHJcbiAgLy8gdGhpcy5leHBvcnRUaWNrZXQoKTtcclxufVxyXG5cclxuZ2V0TXVsdGlwbGVUaWNrZXRDbG9zZSgpIHtcclxuICBpZiAoIXRoaXMuc2VsZWN0ZWRTdG9yZXMgfHwgIXRoaXMuc2VsZWN0ZWRTdG9yZXMubGVuZ3RoKSB7XHJcbiAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoJ1BsZWFzZSBzZWxlY3QgYXQgbGVhc3Qgb25lIHRpY2tldCcpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdGlja2V0TGlzdCA9IHRoaXMuc2VsZWN0ZWRTdG9yZXMubWFwKChzdG9yZTogYW55KSA9PiAoe1xyXG4gICAgc3RvcmVJZDogc3RvcmUuc3RvcmVJZCxcclxuICAgIGRhdGVTdHJpbmc6IHN0b3JlLmRhdGVTdHJpbmcgfHwgc3RvcmUuaXNzdWVEYXRlLFxyXG4gIH0pKTtcclxuXHJcbiAgY29uc3Qgb2JqID0ge1xyXG4gICAgdGlja2V0TGlzdCxcclxuICAgIG1vZGU6ICd3ZWInLFxyXG4gIH07XHJcblxyXG4gIHRoaXMuc2VydmljZS5nZXRNdWx0aUNsb3NlVGlja2V0QXBpKG9iaikuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAvLyBzdWNjZXNzXHJcbiAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoJ1RpY2tldHMgY2xvc2VkIHN1Y2Nlc3NmdWxseScpO1xyXG4gICAgICAgdGhpcy5kYXRhU3RvcmVWaWV3KHRoaXMuc2VsZWN0ZWRTdG9yZXMpO1xyXG4gICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlcyA9IFtdO1xyXG4gICAgICAgdGhpcy5hbGxTZWxlY3RlZCA9ZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIGNsb3NlIHRpY2tldHMnKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjbG9zZSB0aWNrZXRzJywgZXJyKTtcclxuICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gY2xvc2UgdGlja2V0cycpO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG5pc1Jvd1NlbGVjdGFibGUocm93OiBhbnkpOiBib29sZWFuIHtcclxuICByZXR1cm4gcm93Py5zdGF0dXM/LnRvTG93ZXJDYXNlKCkgPT09ICdvcGVuJztcclxufVxyXG5zZWxlY3RlZFRpY2tldFJvd3M6IGFueVtdID0gW107XHJcbi8vIGNoZWNrIGlmIGEgcm93IGlzIGN1cnJlbnRseSBzZWxlY3RlZFxyXG5pc1Jvd1NlbGVjdGVkKHJvdzogYW55KTogYm9vbGVhbiB7XHJcbiAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUaWNrZXRSb3dzLmluY2x1ZGVzKHJvdyk7XHJcbn1cclxuXHJcbi8vIHJvd3MgdGhhdCBDQU4gYmUgc2VsZWN0ZWQgKHN0YXR1cyBvcGVuKVxyXG5nZXRTZWxlY3RhYmxlUm93cygpOiBhbnlbXSB7XHJcbiAgcmV0dXJuICh0aGlzLmZvb3RmYWxsTGlzdERhdGEgfHwgW10pLmZpbHRlcigocjphbnkpID0+IHRoaXMuaXNSb3dTZWxlY3RhYmxlKHIpKTtcclxufVxyXG5cclxuLy8gaGVhZGVyIFwic2VsZWN0IGFsbFwiIGNoZWNrYm94IHN0YXRlXHJcbmFyZUFsbFNlbGVjdGFibGVSb3dzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgY29uc3Qgc2VsZWN0YWJsZSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVJvd3MoKTtcclxuICByZXR1cm4gKFxyXG4gICAgc2VsZWN0YWJsZS5sZW5ndGggPiAwICYmXHJcbiAgICBzZWxlY3RhYmxlLmV2ZXJ5KHIgPT4gdGhpcy5zZWxlY3RlZFRpY2tldFJvd3MuaW5jbHVkZXMocikpXHJcbiAgKTtcclxufVxyXG5jbG9zZU11bHRpcGxlID0gdHJ1ZTsgXHJcbnByaXZhdGUgdXBkYXRlQ2xvc2VEaXNhYmxlZCgpIHtcclxuICB0aGlzLmNsb3NlTXVsdGlwbGUgPSB0aGlzLnNlbGVjdGVkVGlja2V0Um93cy5sZW5ndGggPT09IDA7XHJcbn1cclxuLy8gc2luZ2xlIHJvdyBjaGVja2JveCB0b2dnbGVcclxudG9nZ2xlUm93U2VsZWN0aW9uKHJvdzogYW55LCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICBpZiAoIXRoaXMuaXNSb3dTZWxlY3RhYmxlKHJvdykpIHJldHVybjtcclxuXHJcbiAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgY29uc3QgY2hlY2tlZCA9IHRhcmdldC5jaGVja2VkO1xyXG5cclxuICBpZiAoY2hlY2tlZCkge1xyXG4gICAgaWYgKCF0aGlzLmlzUm93U2VsZWN0ZWQocm93KSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGlja2V0Um93cyA9IFsuLi50aGlzLnNlbGVjdGVkVGlja2V0Um93cywgcm93XTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5zZWxlY3RlZFRpY2tldFJvd3MgPSB0aGlzLnNlbGVjdGVkVGlja2V0Um93cy5maWx0ZXIociA9PiByICE9PSByb3cpO1xyXG4gIH1cclxudGhpcy51cGRhdGVDbG9zZURpc2FibGVkKCk7XHJcbiAgLy8gb3B0aW9uYWw6IGRlYnVnXHJcbiAgLy8gY29uc29sZS5sb2coJ1NlbGVjdGVkIHJvd3M6JywgdGhpcy5zZWxlY3RlZFRpY2tldFJvd3MpO1xyXG59XHJcblxyXG4vLyBoZWFkZXIgXCJTZWxlY3QgQWxsXCIgdG9nZ2xlXHJcbnRvZ2dsZVNlbGVjdEFsbFJvd3MoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgY29uc3QgY2hlY2tlZCA9IHRhcmdldC5jaGVja2VkO1xyXG5cclxuICBpZiAoY2hlY2tlZCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFRpY2tldFJvd3MgPSB0aGlzLmdldFNlbGVjdGFibGVSb3dzKCkuc2xpY2UoKTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5zZWxlY3RlZFRpY2tldFJvd3MgPSBbXTtcclxuICB9XHJcbiAgdGhpcy51cGRhdGVDbG9zZURpc2FibGVkKCk7XHJcbn1cclxuc2hvd0ltYWdlc01vZGFsID0gZmFsc2U7XHJcbnNlbGVjdGVkSW1hZ2VzRm9yUG9wdXA6IGFueVtdID0gW107XHJcbnNlbGVjdGVkQ29tbWVudDogYW55IHwgbnVsbCA9IG51bGw7XHJcblxyXG5vcGVuSW1hZ2VzUG9wdXAoY29tbWVudDogYW55KTogdm9pZCB7XHJcbiAgLy8gY29uc29sZS5sb2coY29tbWVudClcclxuICAvLyByZXR1cm5cclxuICB0aGlzLnNlbGVjdGVkQ29tbWVudCA9IGNvbW1lbnQ7XHJcbiAgdGhpcy5zZWxlY3RlZEltYWdlc0ZvclBvcHVwID0gY29tbWVudD8udGFnZ2VkSW1hZ2VzIHx8IFtdO1xyXG4gIHRoaXMuc2hvd0ltYWdlc01vZGFsID0gdHJ1ZTtcclxufVxyXG5cclxuY2xvc2VJbWFnZXNQb3B1cCgpOiB2b2lkIHtcclxuICB0aGlzLnNob3dJbWFnZXNNb2RhbCA9IGZhbHNlO1xyXG4gIHRoaXMuc2VsZWN0ZWRJbWFnZXNGb3JQb3B1cCA9IFtdO1xyXG4gIHRoaXMuc2VsZWN0ZWRDb21tZW50ID0gbnVsbDtcclxufVxyXG59XHJcbiIsIjxzZWN0aW9uICpuZ0lmPVwic2VsZWN0ID09PSd0aWNrZXRMaXN0J1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBtcy0zIG15LTNcIj5cclxuICAgICAgICA8dWwgKm5nSWY9XCJ1c2Vyc0RldGFpbHM/LnVzZXJUeXBlID09PSAndGFuZ28nXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJuYXYgbmF2LXN0cmV0Y2ggbmF2LWxpbmUtdGFiczEgbmF2LWxpbmUtdGFicyBib3JkZXItdHJhbnNwYXJlbnQgZmxleC1ub3dyYXBcIj5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxhIFtuZ0NsYXNzXT1cInRhbmdvVHlwZSA9PT0gJ3N0b3JlJyA/ICdhY3RpdmUnIDogJydcIiAoY2xpY2spPVwidmlld1RpY2tldCgnc3RvcmUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuYXYtbGluayBjdXJzb3ItcG9pbnRlciBuby1ib3JkZXIgbWUtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIFRpY2tldHNcclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxhIFtuZ0NsYXNzXT1cInRhbmdvVHlwZSA9PT0gJ2ludGVybmFsJyA/ICdhY3RpdmUnIDogJydcIiAoY2xpY2spPVwidmlld1RpY2tldCgnaW50ZXJuYWwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJuYXYtbGluayBjdXJzb3ItcG9pbnRlciBuby1ib3JkZXIgbWUtM1wiPiBJbnRlcm5hbCBhdWRpdFxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgICAgPHVsICpuZ0lmPVwiaGFzQXBwcm92ZXJBY2Nlc3MgJiYgaGFzUmV2aWV3ZXJBY2Nlc3MgJiYgdXNlcnNEZXRhaWxzPy51c2VyVHlwZSAhPT0gJ3RhbmdvJ1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibmF2IG5hdi1zdHJldGNoIG5hdi1saW5lLXRhYnMxIG5hdi1saW5lLXRhYnMgYm9yZGVyLXRyYW5zcGFyZW50IGZsZXgtbm93cmFwXCI+XHJcbiAgICAgICAgICAgIDwhLS0gQXBwcm92ZXIgdGFiIC0tPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiICpuZ0lmPVwiaGFzQXBwcm92ZXJBY2Nlc3NcIj5cclxuICAgICAgICAgICAgICAgIDxhIFtuZ0NsYXNzXT1cInNlbGVjdGVkUm9sZSA9PT0gJ2FwcHJvdmVyJyA/ICdhY3RpdmUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibmF2LWxpbmsgY3Vyc29yLXBvaW50ZXIgbm8tYm9yZGVyIG1lLTNcIiAoY2xpY2spPVwiU2VsZWN0ZWRSb2xlKCdhcHByb3ZlcicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQXBwcm92ZXJcclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC9saT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gUmV2aWV3ZXIgdGFiIC0tPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiICpuZ0lmPVwiaGFzUmV2aWV3ZXJBY2Nlc3NcIj5cclxuICAgICAgICAgICAgICAgIDxhIFtuZ0NsYXNzXT1cInNlbGVjdGVkUm9sZSA9PT0gJ3Jldmlld2VyJyA/ICdhY3RpdmUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibmF2LWxpbmsgY3Vyc29yLXBvaW50ZXIgbm8tYm9yZGVyIG1lLTNcIiAoY2xpY2spPVwiU2VsZWN0ZWRSb2xlKCdyZXZpZXdlcicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUmV2aWV3ZXJcclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOSBtYi0zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgZWxsaXBzZTEgcHgtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGUgbXktMFwiPnt7IGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LnRvdGFsVGlja2V0cyAhPT0gbnVsbCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy50b3RhbFRpY2tldHMgOiAnLS0nIH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdWItaGVhZGVyXCI+VG90YWwgdGlja2V0czwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8uYXZlcmFnZUFjY3VyYWN5T3ZlckFsbCAgIT09IG51bGwgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmF2ZXJhZ2VBY2N1cmFjeU92ZXJBbGwgIT09IHVuZGVmaW5lZFwiIGNsYXNzPVwiY2FyZC10b29sYmFyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlIG15LTBcIj57eyBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5hdmVyYWdlQWNjdXJhY3lPdmVyQWxsICE9PSBudWxsID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5hdmVyYWdlQWNjdXJhY3lPdmVyQWxsICsgJyUnIDogJy0tJyB9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1Yi1oZWFkZXJcIj5BdmVyYWdlIGFjY3VyYWN5IChPdmVyYWxsKTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktMiBweC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8ub3BlblRpY2tldHMgIT09IG51bGwgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/Lm9wZW5UaWNrZXRzICE9PSB1bmRlZmluZWRcIiBjbGFzcz1cImNvbCBteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8ub3BlblRpY2tldHMgIT09IG51bGwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/Lm9wZW5UaWNrZXRzIDogJy0tJyB9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdGl0bGUtc3ViLWhlYWRlclwiPk9wZW48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8ub3BlbkluZnJhSXNzdWVzICE9PSBudWxsICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5vcGVuSW5mcmFJc3N1ZXMgIT09IHVuZGVmaW5lZFwiIGNsYXNzPVwiY29sIG15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5vcGVuSW5mcmFJc3N1ZXMgIT09IG51bGwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/Lm9wZW5JbmZyYUlzc3VlcyA6ICctLScgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLXRpdGxlLXN1Yi1oZWFkZXJcIj5PcGVuLUluZnJhIElzc3VlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmlucHJvZ3Jlc3MgIT09IG51bGwgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmlucHJvZ3Jlc3MgIT09IHVuZGVmaW5lZFwiIGNsYXNzPVwiY29sIG15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5pbnByb2dyZXNzICE9PSBudWxsID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5pbnByb2dyZXNzIDogJy0tJyB9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdGl0bGUtc3ViLWhlYWRlclwiPkluLXByb2dyZXNzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmNsb3NlZFRpY2tldHMgIT09IG51bGwgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmNsb3NlZFRpY2tldHMgIT09IHVuZGVmaW5lZFwiIGNsYXNzPVwiY29sIG15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImNhcmQtdGl0bGVcIj57eyBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5jbG9zZWRUaWNrZXRzICE9PSBudWxsID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5jbG9zZWRUaWNrZXRzIDogJy0tJyB9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdGl0bGUtc3ViLWhlYWRlclwiPkNsb3NlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8uZHVlVG9kYXkgIT09IG51bGwgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmR1ZVRvZGF5ICE9PSB1bmRlZmluZWRcIiBjbGFzcz1cImNvbCBteS0zIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IHN0eWxlPVwiY29sb3I6I0RDNjgwMyAhaW1wb3J0YW50XCIgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8uZHVlVG9kYXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPT0gbnVsbCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8uZHVlVG9kYXkgOiAnLS0nIH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC10aXRsZS1zdWItaGVhZGVyXCIgc3R5bGU9XCJjb2xvcjojREM2ODAzICFpbXBvcnRhbnRcIj5EdWUgdG9kYXk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdldEZvb3RmYWxsU3VtbWFyeURhdGE/LkV4cGlyZWQgIT09IG51bGwgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LkV4cGlyZWQgIT09IHVuZGVmaW5lZFwiIGNsYXNzPVwiY29sIG15LTMgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8uRXhwaXJlZCAhPT0gbnVsbCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8uRXhwaXJlZCA6ICctLScgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLXRpdGxlLXN1Yi1oZWFkZXJcIj5FeHBpcmVkPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy51bmRlclRhbmdvUmV2aWV3ICE9PSBudWxsICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy51bmRlclRhbmdvUmV2aWV3ICE9PSB1bmRlZmluZWRcIiBjbGFzcz1cImNvbCBteS0zIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZVwiPnt7IGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LnVuZGVyVGFuZ29SZXZpZXcgIT09IG51bGwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LnVuZGVyVGFuZ29SZXZpZXcgOiAnLS0nIH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC10aXRsZS1zdWItaGVhZGVyXCI+VW5kZXIgdGFuZ28gcmV2aWV3PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBtYi0zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgZWxsaXBzZTEgcHktMSBweC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdldEZvb3RmYWxsU3VtbWFyeURhdGE/LnRpY2tldEFjY3VyYWN5QWJvdmUgIT09IG51bGwgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LnRpY2tldEFjY3VyYWN5QWJvdmUgIT09IHVuZGVmaW5lZFwiIGNsYXNzPVwibXktMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlIG10LTBcIj57eyBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy50aWNrZXRBY2N1cmFjeUFib3ZlICE9PSBudWxsID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LnRpY2tldEFjY3VyYWN5QWJvdmUgOiAnLS0nIH19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkZXJcIj5UaWNrZXRzIHdpdGggQWNjdXJhY3kgQWJvdmUgODUlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmF2Z1RpY2tldCAhPT0gbnVsbCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8uYXZnVGlja2V0ICE9PSB1bmRlZmluZWRcIiBjbGFzcz1cIm15LTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZSBtdC0wXCI+e3sgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8uYXZnVGlja2V0ICE9PSBudWxsID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmF2Z1RpY2tldCA6ICctLScgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRlclwiPkF2ZXJhZ2UgdGlja2V0ICU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0yIHB4LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy50aWNrZXRBY2N1cmFjeUJlbG93ICE9PSBudWxsICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy50aWNrZXRBY2N1cmFjeUJlbG93ICE9PSB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGctMTIgY29sLXhsLTEyIGNvbC1tZC0xMiBteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8udGlja2V0QWNjdXJhY3lCZWxvdyAhPT0gbnVsbCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8udGlja2V0QWNjdXJhY3lCZWxvdyA6ICctLScgfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLXRpdGxlLXN1Yi1oZWFkZXJcIj5UaWNrZXRzIHdpdGggQWNjdXJhY3kgQmVsb3cgODUlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmF2Z0FjY3VyYWN5ICE9PSBudWxsICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICBnZXRGb290ZmFsbFN1bW1hcnlEYXRhPy5hdmdBY2N1cmFjeSAhPT0gdW5kZWZpbmVkXCIgY2xhc3M9XCJjb2wtbGctMTIgY29sLXhsLTEyIGNvbC1tZC0xMiBteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgZ2V0Rm9vdGZhbGxTdW1tYXJ5RGF0YT8uYXZnQWNjdXJhY3kgIT09IG51bGwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvb3RmYWxsU3VtbWFyeURhdGE/LmF2Z0FjY3VyYWN5IDogJy0tJyB9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtdGl0bGUtc3ViLWhlYWRlclwiPkF2ZXJhZ2UgYWNjdXJhY3klPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJvcmRlci0wIHB0LTNcIj5cclxuICAgICAgICAgICAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZSBhbGlnbi1pdGVtcy1zdGFydCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLWxhYmVsIG1iLTJcIiAqbmdJZj1cInRhbmdvVHlwZT09PSdzdG9yZSdcIj48c3BhbiAqbmdJZj1cInVzZXJzRGV0YWlscz8udXNlclR5cGUgIT09ICd0YW5nbydcIj5UaWNrZXQgSW5mbzwvc3Bhbj4gPHNwYW4gKm5nSWY9XCJ1c2Vyc0RldGFpbHM/LnVzZXJUeXBlID09PSAndGFuZ28nXCI+U2hvd2luZyB0aWNrZXRzIHdpdGggQWNjdXJhY3kgQmVsb3cgODUlIDwvc3Bhbj48c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLTIgcHgtMyBiYWRnZSBiYWRnZS1saWdodC1wcmltYXJ5XCI+e3t0b3RhbEl0ZW1zfX0gVG90YWw8L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLWxhYmVsIG1iLTJcIiAqbmdJZj1cInRhbmdvVHlwZT09PSdpbnRlcm5hbCdcIj5JbnRlcm5hbCBUaWNrZXRzIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtMiBweC0zIGJhZGdlIGJhZGdlLWxpZ2h0LXByaW1hcnlcIj57e3RvdGFsSXRlbXN9fSBUb3RhbDwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc3ViIG1iLTJcIj5CYXNlZCBvbiB7e2hlYWRlckZpbHRlcnM/LmRhdGU/LnN0YXJ0RGF0ZSB8IGRhdGU6J2RkIE1NTSwgeXl5eSd9fSDigJNcclxuICAgICAgICAgICAgICAgICAgICB7e2hlYWRlckZpbHRlcnM/LmRhdGU/LmVuZERhdGUgfCBkYXRlOidkZCBNTU0sIHl5eXknfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10b29sYmFyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgbXktMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLTEgcG9zaXRpb24tYWJzb2x1dGUgbXMtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBvcGFjaXR5PVwiMC41XCIgeD1cIjE3LjAzNjVcIiB5PVwiMTUuMTIyM1wiIHdpZHRoPVwiOC4xNTU0NlwiIGhlaWdodD1cIjJcIiByeD1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoNDUgMTcuMDM2NSAxNS4xMjIzKVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3JlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMSAxOUM2LjU1NTU2IDE5IDMgMTUuNDQ0NCAzIDExQzMgNi41NTU1NiA2LjU1NTU2IDMgMTEgM0MxNS40NDQ0IDMgMTkgNi41NTU1NiAxOSAxMUMxOSAxNS40NDQ0IDE1LjQ0NDQgMTkgMTEgMTlaTTExIDVDNy41MzMzMyA1IDUgNy41MzMzMyA1IDExQzUgMTQuNDY2NyA3LjUzMzMzIDE3IDExIDE3QzE0LjQ2NjcgMTcgMTcgMTQuNDY2NyAxNyAxMUMxNyA3LjUzMzMzIDE0LjQ2NjcgNSAxMSA1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBtZS0yXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYnkgc3RvcmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKGNoYW5nZSk9XCJzZWFyY2hEYXRhKClcIiBbKG5nTW9kZWwpXT1cInNlYXJjaFZhbHVlXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJleHBvcnRYTFNYKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgbXgtMiBidG4tb3V0bGluZSBidG4tb3V0bGluZS1kZWZhdWx0IHJvdW5kZWQtMyB0ZXh0LW5vd3JhcCBib3JkZXItdmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiPkV4cG9ydDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1wcmltYXJ5IGJ0bi1vdXRsaW5lIGJ0bi1vdXRsaW5lLWRlZmF1bHQgcm91bmRlZC0zIHRleHQtbm93cmFwIGJvcmRlci12YWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0YW5nb1R5cGU9PT0naW50ZXJuYWwnXCIgKGNsaWNrKT1cImNyZWF0ZUludGVybmFsdGlja2V0KClcIj5TdGFydCBBdWRpdDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJ1c2Vyc0RldGFpbHMudXNlclR5cGUgIT09J3RhbmdvJyAmJiAoaGFzQXBwcm92ZXJBY2Nlc3MgJiYgc2VsZWN0ZWRSb2xlID09PSdhcHByb3ZlcicpXCIgW2Rpc2FibGVkXT1cImNsb3NlTXVsdGlwbGVcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnkgbXgtMiB0ZXh0LW5vd3JhcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0TXVsdGlwbGVUaWNrZXRDbG9zZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9zZSBUaWNrZXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIiAqbmdJZj1cIiFsb2FkaW5nICYmICFub0RhdGFcIj5cclxuICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgY3VzdG9tLXRhYmxlIGJvdHRvbS1ib3JkZXIgdGV4dC1ub3dyYXBcIj5cclxuICA8dGhlYWQ+XHJcbiAgICA8dHI+XHJcbiAgICAgIDwhLS0gTkVXOiBjaGVja2JveCBjb2x1bW4gZm9yIGFwcHJvdmVyIG9ubHkgLS0+XHJcbiAgICAgIDx0aCAqbmdJZj1cInVzZXJzRGV0YWlscy51c2VyVHlwZSAhPT0ndGFuZ28nICYmIChoYXNBcHByb3ZlckFjY2VzcyAmJiBzZWxlY3RlZFJvbGUgPT09J2FwcHJvdmVyJylcIj5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICBbY2hlY2tlZF09XCJhcmVBbGxTZWxlY3RhYmxlUm93c1NlbGVjdGVkKClcIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGxSb3dzKCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvdGg+XHJcblxyXG4gICAgICA8dGhcclxuICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIHRhYmxlQ29sdW1uc1wiXHJcbiAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cImNvbC5zb3J0YWJsZSAmJiBjb2wudHlwZSAhPT0gJ3N0b3JlJ1wiXHJcbiAgICAgICAgKGNsaWNrKT1cImNvbC5zb3J0YWJsZSAmJiBjb2wudHlwZSAhPT0gJ3N0b3JlJyAmJiBvblNvcnQoY29sLmtleSlcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgY29sLmxhYmVsIH19XHJcblxyXG4gICAgICAgIDwhLS0gU29ydGluZyBJY29uIC0tPlxyXG4gICAgICAgIDxzdmdcclxuICAgICAgICAgICpuZ0lmPVwiY29sLnNvcnRhYmxlICYmIGNvbC50eXBlICE9PSAnc3RvcmUnXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cInNvcnRlZENvbHVtbiA9PT0gY29sLmtleSAmJiBzb3J0RGlyZWN0aW9uID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiXHJcbiAgICAgICAgICB3aWR0aD1cIjE2XCJcclxuICAgICAgICAgIGhlaWdodD1cIjE2XCJcclxuICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgIGQ9XCJNOCAzLjMzM1YxMi42NjdMMTIuNjY3IDggOCAxMi42NjcgMy4zMzMgOFwiXHJcbiAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0ZWRDb2x1bW4gPT09IGNvbC5rZXkgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIlxyXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjMzM1wiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICA8L3RoPlxyXG4gICAgPC90cj5cclxuICA8L3RoZWFkPlxyXG5cclxuICA8dGJvZHk+XHJcbiAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBmb290ZmFsbExpc3REYXRhXCI+XHJcbiAgICAgIDwhLS0gTkVXOiBwZXItcm93IGNoZWNrYm94IChhcHByb3ZlciBvbmx5KSAtLT5cclxuICAgICAgPHRkICpuZ0lmPVwidXNlcnNEZXRhaWxzLnVzZXJUeXBlICE9PSd0YW5nbycgJiYgKGhhc0FwcHJvdmVyQWNjZXNzICYmIHNlbGVjdGVkUm9sZSA9PT0nYXBwcm92ZXInKVwiPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzUm93U2VsZWN0YWJsZShyb3cpXCIgICAgIFxyXG4gICAgICAgICAgW2NoZWNrZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcclxuICAgICAgICAgIFtzdHlsZS5jdXJzb3JdPVwiaXNSb3dTZWxlY3RhYmxlKHJvdykgPyAncG9pbnRlcicgOiAnbm90LWFsbG93ZWQgdGV4dC1tdXRlZCdcIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVSb3dTZWxlY3Rpb24ocm93LCAkZXZlbnQpXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L3RkPlxyXG5cclxuICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2wgb2YgdGFibGVDb2x1bW5zXCI+XHJcbiAgICAgICAgPCEtLSBTdG9yZSArIHRpY2tldCBjbGlja2FibGUgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09PSAnc3RvcmUnXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1wcmltYXJ5IGVsbGlwc2lzLXVuZGVybGluZVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJ0aWNrZXRWaWV3KHJvdylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyByb3cudGlja2V0SWQgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTJcIj57eyByb3cuc3RvcmVOYW1lIH19PC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRGF0ZSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICBjbGFzcz1cInB0LTVcIlxyXG4gICAgICAgICAgKm5nSWY9XCJjb2wudHlwZSA9PT0gJ2RhdGUnIHx8IGNvbC50eXBlID09PSAndGlja2V0UmFpc2VkJ1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgcm93W2NvbC5rZXldIHwgZGF0ZTogJ2RkIE1NTSwgeXl5eScgfX1cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBTdGF0dXMgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBjbGFzcz1cInB0LTVcIiAqbmdJZj1cImNvbC50eXBlID09PSAnc3RhdHVzJ1wiPlxyXG4gICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgY2xhc3M9XCJiYWRnZSBteC0yXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQmFkZ2VDbGFzcyhyb3dbY29sLmtleV0pXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgcm93W2NvbC5rZXldIHwgdGl0bGVjYXNlIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRGVmYXVsdCBUZXh0IC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgY2xhc3M9XCJwdC01XCIgKm5nSWY9XCJjb2wudHlwZSA9PT0gJ3RleHQnXCI+XHJcbiAgICAgICAgICB7eyByb3dbY29sLmtleV0gPz8gJy0tJyB9fVxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3RkPlxyXG4gICAgPC90cj5cclxuICA8L3Rib2R5PlxyXG48L3RhYmxlPlxyXG5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmcgJiYgIW5vRGF0YVwiIGNsYXNzPVwibXktM1wiPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1wYWdpbmF0aW9uIFtpdGVtc1BlclBhZ2VdPVwicGFnZVNpemVcIiBbY3VycmVudFBhZ2VdPVwiY3VycmVudFBhZ2VcIiBbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJzZXRwYWdlU2l6ZSgpXCIgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiY2FyZCBtdC01XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgaC01MDBweFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9EYXRhXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctbm9kYXRhXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YS1zdWJcIj5UaGVyZSBpcyBubyByZXN1bHQgZm9yIHRoaXMgY29udmVyc2lvbiBmdW5uZWw8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcbjwhLS0gIC0tPlxyXG48c2VjdGlvbiAqbmdJZj1cInNlbGVjdCA9PT0ndGlja2V0TWV0aG9kJ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBteS0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCIgW25nQ2xhc3NdPVwiaXNDb2xsYXBzZWQgPyAnZC1ub25lJyA6ICdjb2wtbWQtMyBoLWF1dG8nXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGgtMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgcHQtMyBwcy0xIHBlLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIj48c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImJhY2tUb05hdmlnYXRpb24oKVwiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNDRcIiB2aWV3Qm94PVwiMCAwIDU2IDQ0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzg4N180NTA1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjFcIiB3aWR0aD1cIjUyXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjhcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyLjVcIiB5PVwiMS41XCIgd2lkdGg9XCI1MVwiIGhlaWdodD1cIjM5XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMwLjUgMjZMMjUuNSAyMUwzMC41IDE2XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF84ODdfNDUwNVwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz1cInVzZXJTcGFjZU9uVXNlXCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVwic1JHQlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCIgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlT2Zmc2V0IGR5PVwiMVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIxXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93Xzg4N180NTA1XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd184ODdfNDUwNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJzaGFwZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj48c3BhbiBjbGFzcz1cImNhcmQtdGl0bGUtZm9vdCBwdC0xNSBtcy0zXCI+VGlja2V0czwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJ0b2dnbGVTaWRlYmFyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAxNXB4OyByaWdodDogLTI1cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNjhcIiBoZWlnaHQ9XCI2OFwiIHZpZXdCb3g9XCIwIDAgNjggNjhcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsdGVyPVwidXJsKCNmaWx0ZXIwX2RkXzc3OF8zNDI4MilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMTJcIiB3aWR0aD1cIjQ0XCIgaGVpZ2h0PVwiNDRcIiByeD1cIjIyXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMzIDI3TDI4IDIyTDMzIDE3TTQwIDI3TDM1IDIyTDQwIDE3XCIgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZGRfNzc4XzM0MjgyXCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiNjhcIiBoZWlnaHQ9XCI2OFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIiByZXN1bHQ9XCJoYXJkQWxwaGFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVNb3JwaG9sb2d5IHJhZGl1cz1cIjJcIiBvcGVyYXRvcj1cImVyb2RlXCIgaW49XCJTb3VyY2VBbHBoYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfNzc4XzM0MjgyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlT2Zmc2V0IGR5PVwiNFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDMgMFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93Xzc3OF8zNDI4MlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCIgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlTW9ycGhvbG9neSByYWRpdXM9XCI0XCIgb3BlcmF0b3I9XCJlcm9kZVwiIGluPVwiU291cmNlQWxwaGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0Ml9kcm9wU2hhZG93Xzc3OF8zNDI4MlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjEyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wOCAwXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd183NzhfMzQyODJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0Ml9kcm9wU2hhZG93Xzc3OF8zNDI4MlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIiBpbjI9XCJlZmZlY3QyX2Ryb3BTaGFkb3dfNzc4XzM0MjgyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cInNoYXBlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC00IHctMTAwIG92ZXJmbG93LWF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG15LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC04XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xIHBvc2l0aW9uLWFic29sdXRlIHB5LTIgbXMtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBvcGFjaXR5PVwiMC41XCIgeD1cIjE3LjAzNjVcIiB5PVwiMTUuMTIyM1wiIHdpZHRoPVwiOC4xNTU0NlwiIGhlaWdodD1cIjJcIiByeD1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKDQ1IDE3LjAzNjUgMTUuMTIyMylcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9yZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMSAxOUM2LjU1NTU2IDE5IDMgMTUuNDQ0NCAzIDExQzMgNi41NTU1NiA2LjU1NTU2IDMgMTEgM0MxNS40NDQ0IDMgMTkgNi41NTU1NiAxOSAxMUMxOSAxNS40NDQ0IDE1LjQ0NDQgMTkgMTEgMTlaTTExIDVDNy41MzMzMyA1IDUgNy41MzMzMyA1IDExQzUgMTQuNDY2NyA3LjUzMzMzIDE3IDExIDE3QzE0LjQ2NjcgMTcgMTcgMTQuNDY2NyAxNyAxMUMxNyA3LjUzMzMzIDE0LjQ2NjcgNSAxMSA1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSBtYi0yIHBzLTE0IHBlLTIgdy0xMDBcIiB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBbKG5nTW9kZWwpXT1cIlN0b3Jlc1NlYXJjaFZhbHVlXCIgKGNoYW5nZSk9XCJzZWFyY2hTdG9yZXNEYXRhKClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IHAtMCBidG5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tZmlsdGVyIGJ0biBidG4tc20gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwidG9nZ2xlRmlsdGVyKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTJcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUgMTBIMTVNMi41IDVIMTcuNU03LjUgMTVIMTIuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE92ZXJsYXkgKGNsaWNrIG91dHNpZGUgdG8gY2xvc2UpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXlcIiAqbmdJZj1cImlzRmlsdGVyT3BlblwiIChjbGljayk9XCJjbG9zZSgpXCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWx0ZXIgY2FyZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWNhcmQgdGV4dC1zdGFydFwiICpuZ0lmPVwiaXNGaWx0ZXJPcGVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJtYi0zXCI+RmlsdGVyIE9wdGlvbnM8L2gzPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTdGF0dXMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5TdGF0dXM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhdHVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+T3Blbjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+SW4tUHJvZ3Jlc3M8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkNsb3NlPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5VbmRlciB0YW5nbyByZXZpZXc8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlRhbmdvIHJldmlldyBkb25lPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5FeHBpcmVkPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJldmlld2VyIGFjY3VyYWN5IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbGFiZWwgaW4gc2FtZSByb3cgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0wIGZzLTggcmV2aWV3ZXItbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2aWV3ZXIgYWNjdXJhY3kgKCUpIGJ5IGNvbmRpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gY29uZGl0aW9uIGRyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbSByZXZpZXdlci1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZXZpZXdlckNvbmRpdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+Pj0gR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IExlc3MgdGhhbjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPj4gR3JlYXRlciB0aGFuPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBMZXNzZXIgdGhhbiBvciBlcXVhbCB0bzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkJldHdlZW48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBzaW5nbGUgdmFsdWUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlLnJldmlld2VyQ29uZGl0aW9uICE9PSAnQmV0d2Vlbic7IGVsc2UgYmV0d2VlblRwbFwiPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtcy0xXCI+JSA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIHJldmlld2VyLWlucHV0IHRleHQtZW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmV2aWV3ZXJWYWx1ZVwiIG1pbj1cIjFcIiBtYXg9XCIxMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDwvbmctY29udGFpbmVyPiAtLT5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRPRE86IHNhbWUgYmxvY2sgZm9yIEFwcHJvdmVyICYgVGFuZ28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmV2aWV3ZXIgYWNjdXJhY3kgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBsYWJlbCBpbiBzYW1lIHJvdyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTAgZnMtOCByZXZpZXdlci1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHByb3ZlciBhY2N1cmFjeSAoJSkgYnkgY29uZGl0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjb25kaXRpb24gZHJvcGRvd24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtIHJldmlld2VyLXNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJldmlld2VyQ29uZGl0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3Q8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj4+PSBHcmVhdGVyIHRoYW4gb3IgZXF1YWwgdG88L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgTGVzcyB0aGFuPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+PiBHcmVhdGVyIHRoYW48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IExlc3NlciB0aGFuIG9yIGVxdWFsIHRvPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+QmV0d2Vlbjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHNpbmdsZSB2YWx1ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlckZvcm0udmFsdWUucmV2aWV3ZXJDb25kaXRpb24gIT09ICdCZXR3ZWVuJzsgZWxzZSBiZXR3ZWVuVHBsXCI+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNtYWxsIG1zLTFcIj4lIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gcmV2aWV3ZXItaW5wdXQgdGV4dC1lbmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZXZpZXdlclZhbHVlXCIgbWluPVwiMVwiIG1heD1cIjEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPC9uZy1jb250YWluZXI+IC0tPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJldmlld2VyIGFjY3VyYWN5IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbGFiZWwgaW4gc2FtZSByb3cgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0wIGZzLTggcmV2aWV3ZXItbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFuZ28gYWNjdXJhY3kgKCUpIGJ5IGNvbmRpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gY29uZGl0aW9uIGRyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbSByZXZpZXdlci1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZXZpZXdlckNvbmRpdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+Pj0gR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IExlc3MgdGhhbjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPj4gR3JlYXRlciB0aGFuPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBMZXNzZXIgdGhhbiBvciBlcXVhbCB0bzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkJldHdlZW48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBzaW5nbGUgdmFsdWUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlLnJldmlld2VyQ29uZGl0aW9uICE9PSAnQmV0d2Vlbic7IGVsc2UgYmV0d2VlblRwbFwiPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtcy0xXCI+JSA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIHJldmlld2VyLWlucHV0IHRleHQtZW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmV2aWV3ZXJWYWx1ZVwiIG1pbj1cIjFcIiBtYXg9XCIxMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDwvbmctY29udGFpbmVyPiAtLT5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBnYXAtMiBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVzZXRGaWx0ZXIoKVwiPlJlc2V0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhcHBseUZpbHRlcigpXCI+QXBwbHk8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1lbmQgdGV4dC1ub3dycCBtcy0zIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJ1c2Vyc0RldGFpbHMudXNlclR5cGUgIT09J3RhbmdvJyAmJiAoaGFzQXBwcm92ZXJBY2Nlc3MgJiYgc2VsZWN0ZWRSb2xlID09PSdhcHByb3ZlcicpXCIgW2Rpc2FibGVkXT1cImNsb3NlTXVsdGlwbGVcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnkgbXgtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0TXVsdGlwbGVUaWNrZXRDbG9zZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9zZSBUaWNrZXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm9wZW5UaWNrZXRzTGlzdC5sZW5ndGhcIiBjbGFzcz1cIm1iLTIgYm9yZGVyLXNlbGVjdGFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTEVGVDogY2hlY2tib3ggKyB0ZXh0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwidXNlcnNEZXRhaWxzLnVzZXJUeXBlICE9PSd0YW5nbycgJiYgKGhhc0FwcHJvdmVyQWNjZXNzICYmIHNlbGVjdGVkUm9sZSA9PT0nYXBwcm92ZXInKVwiIHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwibWUtMlwiIFtjaGVja2VkXT1cImFsbFNlbGVjdGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGwoKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibS0wIGZvbnQtc2VtaWJvbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IDxzcGFuICpuZ0lmPVwidXNlcnNEZXRhaWxzLnVzZXJUeXBlICE9PSd0YW5nbycgJiYgKGhhc0FwcHJvdmVyQWNjZXNzICYmIHNlbGVjdGVkUm9sZSA9PT0nYXBwcm92ZXInKVwiPmFsbCB7eyBzdG9yZUNvdW50IH19PC9zcGFuPiBzdG9yZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSSUdIVDogUmV2aWV3ZXIoJSkgKyBvcHRpb25hbCBzb3J0IGljb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciByZXZpZXdlci1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMVwiPlJldmlld2VyKCUpPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gaWYgeW91IHdhbnQgYXJyb3cgaWNvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnQtYXJyb3cgY3Vyc29yLXBvaW50ZXJcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi44MzQ2NCAxTDYuODM0NjMgMTIuNjY2N002LjgzNDYzIDEyLjY2NjdMMTIuNjY4IDYuODMzMzNNNi44MzQ2MyAxMi42NjY3TDEuMDAxMyA2LjgzMzMzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gb3IgdXNlIGFuIDxpPiBmcm9tIGZvbnQtYXdlc29tZS9ib290c3RyYXAgaWNvbiBpbnN0ZWFkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgcHMtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHN0b3JlIG9mIG9wZW5UaWNrZXRzTGlzdFwiIGNsYXNzPVwibWItMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzdG9yZS1pdGVtLWFjdGl2ZSc6IGlzU2VsZWN0ZWQoc3RvcmUpLCAnc3RvcmUtaXRlbSc6IHRydWUgfVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBMRUZUOiBjaGVja2JveCArIHRleHQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJ1c2Vyc0RldGFpbHMudXNlclR5cGUgIT09J3RhbmdvJyAmJiAoaGFzQXBwcm92ZXJBY2Nlc3MgJiYgc2VsZWN0ZWRSb2xlID09PSdhcHByb3ZlcicpXCIgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJtZS0yIG15LTNcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKHN0b3JlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVN0b3JlU2VsZWN0aW9uKHN0b3JlKVwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmUtdGV4dCBtcy0xIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInRpY2tldFZpZXdDaGFuZ2VzKHN0b3JlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpY2tldC1pZFwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZS10ZXh0JzogaXNTZWxlY3RlZChzdG9yZSkgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHN0b3JlPy50aWNrZXRJZCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmUtbmFtZSBtdC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc3RvcmU/LnN0b3JlTmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJJR0hUOiBwaWxsIGJhZGdlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtMiBweC0zIHB5LTEgcm91bmRlZC1waWxsIGQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcGVyYy1iYWRnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAncGVyYy1iYWRnZS1hY3RpdmUnOiBpc1NlbGVjdGVkKHN0b3JlKSxcclxuICAgICAgICAncGVyYy1iYWRnZS1ub3JtYWwnOiAhaXNTZWxlY3RlZChzdG9yZSlcclxuICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzdG9yZT8ucmV2aWNlZFBlcmMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIW9wZW5UaWNrZXRzTGlzdC5sZW5ndGhcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG1iLTNcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IG14LTAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW46IDY0cHg7Ym9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgYmFja2dyb3VuZDogdmFyKC0tR3JheS01MCwgI0Y5RkFGQik7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm15LTVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI5NFwiIGhlaWdodD1cIjk0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCA5NCA5NFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI3XCIgeT1cIjdcIiB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiByeD1cIjQwXCIgZmlsbD1cIiNEQUYxRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiN1wiIHk9XCI3XCIgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgcng9XCI0MFwiIHN0cm9rZT1cIiNFQUY4RkZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMTMuMzMzM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNzMwXzc1MDk1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTU1LjMzMjcgNjJWNTguNjY2N0M1NS4zMzI3IDU2Ljg5ODYgNTQuNjMwMyA1NS4yMDI5IDUzLjM4MDEgNTMuOTUyNkM1Mi4xMjk4IDUyLjcwMjQgNTAuNDM0MSA1MiA0OC42NjYgNTJIMzUuMzMyN0MzMy41NjQ2IDUyIDMxLjg2ODkgNTIuNzAyNCAzMC42MTg2IDUzLjk1MjZDMjkuMzY4NCA1NS4yMDI5IDI4LjY2NiA1Ni44OTg2IDI4LjY2NiA1OC42NjY3VjYyTTY1LjMzMjcgNjJWNTguNjY2N0M2NS4zMzE2IDU3LjE4OTUgNjQuODM5OSA1NS43NTQ2IDYzLjkzNSA1NC41ODcyQzYzLjAzIDUzLjQxOTggNjEuNzYyOSA1Mi41ODU5IDYwLjMzMjcgNTIuMjE2N001My42NjYgMzIuMjE2N0M1NS4xIDMyLjU4MzggNTYuMzcxMSAzMy40MTc4IDU3LjI3ODcgMzQuNTg3MkM1OC4xODY0IDM1Ljc1NjUgNTguNjc5MSAzNy4xOTQ3IDU4LjY3OTEgMzguNjc1QzU4LjY3OTEgNDAuMTU1MyA1OC4xODY0IDQxLjU5MzUgNTcuMjc4NyA0Mi43NjI4QzU2LjM3MTEgNDMuOTMyMiA1NS4xIDQ0Ljc2NjIgNTMuNjY2IDQ1LjEzMzNNNDguNjY2IDM4LjY2NjdDNDguNjY2IDQyLjM0ODYgNDUuNjgxMiA0NS4zMzMzIDQxLjk5OTMgNDUuMzMzM0MzOC4zMTc0IDQ1LjMzMzMgMzUuMzMyNyA0Mi4zNDg2IDM1LjMzMjcgMzguNjY2N0MzNS4zMzI3IDM0Ljk4NDggMzguMzE3NCAzMiA0MS45OTkzIDMyQzQ1LjY4MTIgMzIgNDguNjY2IDM0Ljk4NDggNDguNjY2IDM4LjY2NjdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiNFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzczMF83NTA5NVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIGZpbGw9XCJ3aGl0ZVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgyNyAyNylcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtdGl0bGUgbXktM1wiPk5vIFN0b3JlcyBGb3VuZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtc3ViIG1iLTNcIj5Mb29rcyBsaWtlIHRoZXJlIGlzIG5vIHN0b3JlcyA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJpc0NvbGxhcHNlZCA/ICdjb2wtMTInIDogJ2NvbC1tZC05J1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBiZy1saWdodC1wcmltYXJ5IHAtMSBoLTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJvcmRlci0wIHB0LTMgcHgtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvbGxhcHNlZFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIj48c3BhbiAoY2xpY2spPVwidG9nZ2xlU2lkZWJhcigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAxMHB4OyBsZWZ0OiAxMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHZpZXdCb3g9XCIwIDAgNDAgNDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjUgMjVMMTcuNSAyMEwyMi41IDE1XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLXRpdGxlLWZvb3QgbXMtMTVcIj5Gb290ZmFsbCBEaXJlY3Rvcnk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTdGFydCBSZXZpZXcgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInN0YXR1c1ZhbD8udHlwZSAhPT0gJ3RhbmdvcmV2aWV3JyAmJiAodGlja2V0RGF0YT8uc3RhdHVzID09PSAnUmFpc2VkJyB8fCBnZXRIZWFkZXJTdGF0dXMoKSA9PT0gJ09wZW4nKVwiPlxyXG4gICAgIFxyXG4gICAgIDxidXR0b24gKm5nSWY9XCIhY2xvc2VCdG5cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnkgbXgtMlwiIChjbGljayk9XCJzdGFydFJldmlldygpXCI+XHJcbiAgICAgICAgIFN0YXJ0IFJldmlld1xyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPHNlY3Rpb24gKm5nSWY9XCJ0aWNrZXREYXRhPy5SZXZpZXdlZEJ5ID09PSB1c2Vyc0RldGFpbHM/LmVtYWlsIFxyXG4gICAgfHwgdGlja2V0RGF0YT8uYXBwcm92ZWRCeSA9PT0gdXNlcnNEZXRhaWxzPy5lbWFpbFwiPlxyXG4gICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2xvc2UgVGlja2V0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGlja2V0RGF0YT8uc3RhdHVzID09PSAnSW4tUHJvZ3Jlc3MnXCI+XHJcbiAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJjbG9zZUJ0blwiIFtkaXNhYmxlZF09XCJjbG9zZURpc2FibGVkXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5IG14LTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN0b3BSZXZpZXcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvc2UgVGlja2V0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ1c2Vyc0RldGFpbHM/LnVzZXJUeXBlID09PSd0YW5nbycgJiYgc3RhdHVzVmFsPy50eXBlID09PSAndGFuZ29yZXZpZXcnICYmIHN0YXR1c1ZhbD8uc3RhdHVzID09PSdPcGVuJ3x8dXNlcnNEZXRhaWxzPy51c2VyVHlwZSA9PT0ndGFuZ28nJiZ0aWNrZXREYXRhPy50eXBlID09PSAnaW50ZXJuYWwnXCI+PGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeSBteC0yXCIgKGNsaWNrKT1cInN0YXJ0QXVkaXQoKVwiPlN0YXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaXQ8L2J1dHRvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aWNrZXQtYWN0aW9ucy13cmFwcGVyXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tYnRuXCIgKGNsaWNrKT1cInRvZ2dsZVRpY2tldE1lbnUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgMTNDMTIuNTUyMyAxMyAxMyAxMi41NTIzIDEzIDEyQzEzIDExLjQ0NzcgMTIuNTUyMyAxMSAxMiAxMUMxMS40NDc3IDExIDExIDExLjQ0NzcgMTEgMTJDMTEgMTIuNTUyMyAxMS40NDc3IDEzIDEyIDEzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgNkMxMi41NTIzIDYgMTMgNS41NTIyOCAxMyA1QzEzIDQuNDQ3NzIgMTIuNTUyMyA0IDEyIDRDMTEuNDQ3NyA0IDExIDQuNDQ3NzIgMTEgNUMxMSA1LjU1MjI4IDExLjQ0NzcgNiAxMiA2WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgMjBDMTIuNTUyMyAyMCAxMyAxOS41NTIzIDEzIDE5QzEzIDE4LjQ0NzcgMTIuNTUyMyAxOCAxMiAxOEMxMS40NDc3IDE4IDExIDE4LjQ0NzcgMTEgMTlDMTEgMTkuNTUyMyAxMS40NDc3IDIwIDEyIDIwWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGlja2V0LW1lbnVcIiAqbmdJZj1cImlzVGlja2V0TWVudU9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpY2tldC1tZW51LWl0ZW1cIiAoY2xpY2spPVwib25SZWFzc2lnbkNsaWNrKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlLUFzc2lnbiBUaWNrZXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInRpY2tldC1tZW51LWl0ZW1cIiAoY2xpY2spPVwib25FeHBvcnRDbGljaygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBvcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC00IFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItNlwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIGNhcmQtdGl0bGUtbGFiZWwgbXktMlwiPlN0b3JlIE5hbWU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xIGZvbnQtYm9sZCBteS0yXCI+OjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgY2FyZC10aXRsZS12YWx1ZSBteS0yXCI+e3tmb290ZmFsbFRpY2tldHNEYXRhWzBdPy5fc291cmNlPy5zdG9yZU5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgY2FyZC10aXRsZS1sYWJlbCBteS0yXCI+VGlja2V0IElEPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMSBmb250LWJvbGQgbXktMlwiPjo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIGNhcmQtdGl0bGUtdmFsdWUgbXktMlwiPnt7Zm9vdGZhbGxUaWNrZXRzRGF0YVswXT8uX3NvdXJjZT8udGlja2V0SWR9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgY2FyZC10aXRsZS1sYWJlbCBteS0yXCI+U3RhdHVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMSBmb250LWJvbGQgbXktMlwiPjo8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyBteS0yXCI+IDxzcGFuIGNsYXNzPVwiYmFkZ2UgbXgtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQmFkZ2VDbGFzcyhnZXRIZWFkZXJTdGF0dXMoKSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRIZWFkZXJTdGF0dXMoKSB8IHRpdGxlY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIGNhcmQtdGl0bGUtbGFiZWwgbXktMlwiPkR1ZSBEYXRlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMSBmb250LWJvbGQgbXktMlwiPjo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIGNhcmQtdGl0bGUtdmFsdWUgbXktMlwiPjA2IERlYyAyMDI1PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtbGF5ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydCB3LTEwMFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTEVGVCBTSURFIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZSBhbGlnbi1pdGVtcy1zdGFydCBmbGV4LWNvbHVtbiBtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtbGFiZWxcIj5UaWNrZXQgU3RhdHVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc3ViIG1iLTJcIj5Mb2dzIGZvciBlYWNoIHJldmlzaW9uIG9mIHRoZSB0aWNrZXQuPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUklHSFQgU0lERSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJvcGVuQXJyb3coKVwiPiA8c3ZnICpuZ0lmPVwiYXJyb3dzaG93XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiB2aWV3Qm94PVwiMCAwIDQwIDQwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzQ4Nl85MTkwMilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMlwiIHk9XCIxXCIgd2lkdGg9XCIzNlwiIGhlaWdodD1cIjM2XCIgcng9XCI4XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMi41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMzVcIiBoZWlnaHQ9XCIzNVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNSAxNi41TDIwIDIxLjVMMjUgMTYuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfNDg2XzkxOTAyXCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclVuaXRzPVwidXNlclNwYWNlT25Vc2VcIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCIgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlT2Zmc2V0IGR5PVwiMVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIxXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzQ4Nl85MTkwMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4yPVwiZWZmZWN0MV9kcm9wU2hhZG93XzQ4Nl85MTkwMlwiIHJlc3VsdD1cInNoYXBlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJvcGVuQXJyb3coKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIWFycm93c2hvd1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiB2aWV3Qm94PVwiMCAwIDQwIDQwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF80ODZfOTE4OTMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjM4XCIgeT1cIjM3XCIgd2lkdGg9XCIzNlwiIGhlaWdodD1cIjM2XCIgcng9XCI4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKDE4MCAzOCAzNylcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzNy41XCIgeT1cIjM2LjVcIiB3aWR0aD1cIjM1XCIgaGVpZ2h0PVwiMzVcIiByeD1cIjcuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSgxODAgMzcuNSAzNi41KVwiIHN0cm9rZT1cIiNEMEQ1RERcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjUgMjEuNUwyMCAxNi41TDE1IDIxLjVcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIGlkPVwiZmlsdGVyMF9kXzQ4Nl85MTg5M1wiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz1cInVzZXJTcGFjZU9uVXNlXCIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVwic1JHQlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImhhcmRBbHBoYVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVwiMVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW4yPVwiQmFja2dyb3VuZEltYWdlRml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd180ODZfOTE4OTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd180ODZfOTE4OTNcIiByZXN1bHQ9XCJzaGFwZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24gKm5nSWY9XCIhYXJyb3dzaG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGlja2V0IG9mIGZvb3RmYWxsVGlja2V0c0RhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRpY2tldD8uX3NvdXJjZSBhcyBzb3VyY2VcIiBjbGFzcz1cInRpY2tldC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWN0dWFsIEZvb3RmYWxsIEhlYWRlciAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpY2tldC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZmFsbC12YWx1ZVwiPnt7c291cmNlPy5mb290ZmFsbENvdW50fX0gPHNwYW4gY2xhc3M9XCJmb290ZmFsbC1sYWJlbCBtcy0zXCI+QWN0dWFsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvb3RmYWxsPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXNzdWUtZGF0ZVwiPklzc3VlIGRhdGUgOiB7e3NvdXJjZT8uY3JlYXRlZEF0IHwgZGF0ZTonZGQgTU1NIHl5eXknfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGltZWxpbmUgTGluZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbWFwcGluZyBvZiBzb3VyY2U/Lm1hcHBpbmdJbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXaGVuIHRpY2tldCBpcyBDTE9TRUQsIHNraXAgdGhlIHRhZ2dpbmcgcm93IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1hcHBpbmc/LnN0YXR1cyA9PT0gJ0Nsb3NlZCcgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBbJ3RhZ2dpbmcnLCdyZXZpZXcnLCdhcHByb3ZlJywndGFuZ29yZXZpZXcnXS5pbmNsdWRlcyhtYXBwaW5nPy50eXBlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZWxpbmVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1pbmZvIG1zLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXIgYXZhdGFyLXRleHQgbGlnaHQtcHJpbWFyeSBwLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEluaXRpYWxzRnJvbUVtYWlsKG1hcHBpbmc/LmNyZWF0ZWRCeUVtYWlsIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U/LmNyZWF0ZWRCeUVtYWlsKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtYXBwaW5nPy50eXBlID09PSAndGFnZ2luZydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0IGNyZWF0ZWQgYnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtYXBwaW5nPy50eXBlID09PSAncmV2aWV3J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZpZXdlZCBieVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1hcHBpbmc/LnR5cGUgPT09ICdhcHByb3ZlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHByb3ZlZCBieVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtYXBwaW5nPy50eXBlID09PSAndGFuZ29yZXZpZXcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhbmdvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItZW1haWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtYXBwaW5nPy5jcmVhdGVkQnlFbWFpbCB8fCBzb3VyY2U/LmNyZWF0ZWRCeUVtYWlsIH19IHt7KG1hcHBpbmc/LmNyZWF0ZWRBdCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT8uY3JlYXRlZEF0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGF0ZTonSEg6bW06c3Mg4oCTZGQgTU1NIHl5eXknIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVsaW5lXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2hvdyByZXZpc2lvbiBjYXJkIG9ubHkgd2hlbiBOT1QgY2xvc2VkICYgdHlwZSBpcyB0YWdnaW5nIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpc2lvbi1jYXJkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydyZXZpc2lvbi1jYXJkLWFwcHJvdmUtY2xvc2VkJzptYXBwaW5nPy5zdGF0dXMgPT09ICdDbG9zZWQnICYmIChtYXBwaW5nPy50eXBlID09PSAnYXBwcm92ZScgfHwgbWFwcGluZz8udHlwZSA9PT0gJ3RhbmdvcmV2aWV3JyksfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWVzLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlLWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1hcHBpbmc/LnJldmljZWRGb290ZmFsbCA9PT0gbnVsbCA/ICctLScgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nPy5yZXZpY2VkRm9vdGZhbGwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwgZnctYm9sZFwiPlJldmlzZWQgRm9vdGZhbGw8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZS1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBhY2N1cmFjeSBkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1hcHBpbmc/LnJldmljZWRQZXJjIHx8IHNvdXJjZT8ucmV2aWNlZFBlcmMgfHwgJy0tJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYXJyb3cgc3ZnIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsIGZ3LWJvbGQgcHQtMVwiPkFjY3VyYWN5PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZWxpbmUtbmV3IG15LTJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUtYmxvY2tcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtYXBwaW5nPy5jb3VudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtPy52YWx1ZSA/PyAnLS0nIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0/Lm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm1hcHBpbmc/LnN0YXR1cyA9PT0gJ0Nsb3NlZCcgJiYgWydhcHByb3ZlJ10uaW5jbHVkZXMobWFwcGluZz8udHlwZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1mb290ZXIgcmV2aXNpb24tY2FyZC1hcHByb3ZlIHB5LTEgYmctbGlnaHQtcHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd0FwcHJvdmVEZXRhaWxzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLXRvZ2dsZSBkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGJnLWxpZ2h0LXByaW1hcnkgYWxpZ24taXRlbXMtc3RhcnQgbXQtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVSZXZpc2VkRGV0YWlscyhtYXBwaW5nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtcHJpbWFyeSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgaW4gZGV0YWlsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hldnJvbiBtcy0zIGN1cnNvci1wb2ludGVyXCIgW2NsYXNzLnJvdGF0ZS0xODBdPVwic2hvd1JldmlzZWREZXRhaWxzXCI+PHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTggOUwxMiAxNUw2IDlcIiBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0FwcHJvdmVEZXRhaWxzXCIgY2xhc3M9XCJjaGV2cm9uIG1zLTMgY3Vyc29yLXBvaW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02IDE1TDEyIDlMMTggMTVcIiBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1ib2R5IG10LTJcIiAqbmdJZj1cInNob3dBcHByb3ZlRGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0aWNrZXQgb2YgZm9vdGZhbGxUaWNrZXRzRGF0YVwiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0aWNrZXQ/Ll9zb3VyY2UgYXMgc291cmNlXCIgY2xhc3M9XCJteS01XCI+XHJcbjxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHR5cGUgb2YgcmV2b3BzVHlwZXNcIj5cclxuPHNlY3Rpb24gKm5nSWY9XCJ0eXBlID09PSdkdXBsaWNhdGUnXCI+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cImhhc1Jldm9wc1R5cGUodHlwZSlcIiBjbGFzcz1cImxheWVyc1wiPlxyXG4gICAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIG1pbi1oLTI1cHggcHQtM1wiPlxyXG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAxOCAxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNzMwXzc2MTU3KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTMuNzUgMTEuMjVIM0MyLjYwMjE4IDExLjI1IDIuMjIwNjQgMTEuMDkyIDEuOTM5MzQgMTAuODEwN0MxLjY1ODA0IDEwLjUyOTQgMS41IDEwLjE0NzggMS41IDkuNzVWM0MxLjUgMi42MDIxOCAxLjY1ODA0IDIuMjIwNjQgMS45MzkzNCAxLjkzOTM0QzIuMjIwNjQgMS42NTgwNCAyLjYwMjE4IDEuNSAzIDEuNUg5Ljc1QzEwLjE0NzggMS41IDEwLjUyOTQgMS42NTgwNCAxMC44MTA3IDEuOTM5MzRDMTEuMDkyIDIuMjIwNjQgMTEuMjUgMi42MDIxOCAxMS4yNSAzVjMuNzVNOC4yNSA2Ljc1SDE1QzE1LjgyODQgNi43NSAxNi41IDcuNDIxNTcgMTYuNSA4LjI1VjE1QzE2LjUgMTUuODI4NCAxNS44Mjg0IDE2LjUgMTUgMTYuNUg4LjI1QzcuNDIxNTcgMTYuNSA2Ljc1IDE1LjgyODQgNi43NSAxNVY4LjI1QzYuNzUgNy40MjE1NyA3LjQyMTU3IDYuNzUgOC4yNSA2Ljc1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF83MzBfNzYxNTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgRHVwbGljYXRlc1xyXG4gICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEJvZHkgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG1hcHBpbmcgb2Ygc291cmNlPy5tYXBwaW5nSW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQm9keSBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtYXBwaW5nPy50eXBlID09PXZpZXdNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9yaWdpbmFsIG9mIG1hcHBpbmc/LnJldmlzZWREZXRhaWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcmlnaW5hbD8uaXNQYXJlbnQgJiYgb3JpZ2luYWw/LnJldm9wc1R5cGUgPT09J2R1cGxpY2F0ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1ib2R5IGJnLXdoaXRlIGxheWVycyBweS01IHB4LTAgbS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPcmlnaW5hbCBJbWFnZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR1cGxpY2F0ZS1oZWFkIHB4LTUgbXktM1wiPk9yaWdpbmFsIGltYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHB4LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCByZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi0zIGltZy1ib3JkZXIgYm9yZGVyIGJvcmRlci0xIGgtMTAwIHJvdW5kZWQtM1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlVXJsICsgb3JpZ2luYWw/LmZpbGVQYXRoXCIgYWx0PVwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMDAgcm91bmRlZCBib3JkZXJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy10aXRsZSBtcy0yIG15LTJcIj5UYW5nbyBJRDoge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLnRlbXBJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdmFsdWUgbXMtMlwiPkVudHJ5IFRpbWU6IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb3JtYXR0ZWRFbnRyeVRpbWUob3JpZ2luYWw/LmVudHJ5VGltZSkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VwYXJhdG9yIHNlcGFyYXRvci1kYXNoZWQgbXQtMyBtYi01XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHgtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiZHVwbGljYXRlLWhlYWQgbXktMyBmcy02XCI+VGFnZ2VkIER1cGxpY2F0ZXM8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hlY2tib3hFbmFibGVcIiBjbGFzcz1cIm15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiYXJlQWxsRHVwbGljYXRlc1NlbGVjdGVkKG9yaWdpbmFsKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVTZWxlY3RBbGxEdXBsaWNhdGVzKG9yaWdpbmFsLCAkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtcy0yXCI+U2VsZWN0IEFsbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGR1cGxpY2F0ZSBvZiBvcmlnaW5hbD8uZHVwbGljYXRlSW1hZ2U7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1kLTMgbWItMyBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi0zIGgtMTAwIHJvdW5kZWQtMyBwb3NpdGlvbi1yZWxhdGl2ZVwiIFtuZ0NsYXNzXT1cIntcclxuICAgICdsYXllci1hcHByb3ZlZCc6IGlzQXBwcm92ZWQoZHVwbGljYXRlKSxcclxuICAgICdsYXllci1yZWplY3RlZCc6IGlzUmVqZWN0ZWQoZHVwbGljYXRlKSxcclxuICAgICdpbWctYm9yZGVyIGJvcmRlciBib3JkZXItMSc6ICFpc0FwcHJvdmVkKGR1cGxpY2F0ZSkgJiYgIWlzUmVqZWN0ZWQoZHVwbGljYXRlKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDaGVja2JveCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hlY2tib3hFbmFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAqbmdJZj1cIiFpc0xvY2tlZEJ5UmV2aWV3ZXIoZHVwbGljYXRlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJyaWdodDogNXB4IDsgbWFyZ2luOiAxMHB4IDVweCA0cHggIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzRHVwbGljYXRlU2VsZWN0ZWQob3JpZ2luYWwudGVtcElkLCBkdXBsaWNhdGUudGVtcElkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkR1cGxpY2F0ZUNoZWNrYm94Q2hhbmdlKG9yaWdpbmFsLnRlbXBJZCwgZHVwbGljYXRlLnRlbXBJZCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSBmb3JtLWNoZWNrLWlucHV0IGR1cGxpY2F0ZS1jaGVja2JveFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIGFic29sdXRlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0xvY2tlZEJ5UmV2aWV3ZXIoZHVwbGljYXRlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0Q2hlY2tib3goJ2R1cGxpY2F0ZScsIGR1cGxpY2F0ZSlcIj5cclxuXHJcblxyXG4gICAgPHN2ZyAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMTlcIlxyXG4gICAgICAgIHZpZXdCb3g9XCIwIDAgMTkgMTlcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzIwMjNfMTM3MTgpXCI+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCIxLjExMTMzXCIgeT1cIjAuNTU1NjY0XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcclxuICAgICAgICAgICAgICAgIHJ4PVwiMlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCIxLjM4OTExXCIgeT1cIjAuODMzNDQyXCIgd2lkdGg9XCIxNS40NDQ0XCJcclxuICAgICAgICAgICAgICAgIGhlaWdodD1cIjE1LjQ0NDRcIiByeD1cIjEuNzIyMjJcIiBzdHJva2U9XCIjRDBENUREXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuNTU1NTU2XCIgLz5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk01Ljg3MTA5IDguNTU1NjZIMTIuMzUyNlwiIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMC45Mjc3NzhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L2c+XHJcbiAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgIDxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfMjAyM18xMzcxOFwiIHg9XCIwLjAwMDIxNzA4XCJcclxuICAgICAgICAgICAgICAgIHk9XCIwLjAwMDEwODU0XCIgd2lkdGg9XCIxOC4yMjIyXCIgaGVpZ2h0PVwiMTguMjIyMlwiXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcclxuICAgICAgICAgICAgICAgIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cclxuICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCJcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJoYXJkQWxwaGFcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGZlT2Zmc2V0IGR5PVwiMC41NTU1NTZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjAuNTU1NTU2XCIgLz5cclxuICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cclxuICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd18yMDIzXzEzNzE4XCIgLz5cclxuICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIlxyXG4gICAgICAgICAgICAgICAgICAgIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd18yMDIzXzEzNzE4XCJcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJzaGFwZVwiIC8+XHJcbiAgICAgICAgICAgIDwvZmlsdGVyPlxyXG4gICAgICAgIDwvZGVmcz5cclxuICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gKGNoYW5nZSk9XCJvbkltYWdlQ2hlY2tib3hDaGFuZ2UoZHVwbGljYXRlLnRlbXBJZCwgJ2R1cGxpY2F0ZScsICdvcmlnaW5hbCcpXCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHVwbGljYXRlIEltYWdlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1hZ2VVcmwgKyBkdXBsaWNhdGUuZmlsZVBhdGhcIiBhbHQ9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5JbWFnZVByZXZpZXcobWFwcGluZyxvcmlnaW5hbC5kdXBsaWNhdGVJbWFnZSwgaSwgJ1RhZ2dlZCBEdXBsaWNhdGVzJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMCByb3VuZGVkIGJvcmRlciBkdXBsaWNhdGUtaW1hZ2UgY3Vyc29yLXBvaW50ZXJcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEdXBsaWNhdGUgSW5mbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBteS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy10aXRsZSBtcy0yIG15LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFuZ28gSUQ6IHt7IGR1cGxpY2F0ZS50ZW1wSWQgfX1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEFjdGlvbihkdXBsaWNhdGUsICdyZXZpZXcnKT8uYWN0aW9uID09PSAnYXBwcm92ZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtMlwiPjxzdmcgc3R5bGU9XCJ3aWR0aDogMjBweDtcclxuICAgICAgICBoZWlnaHQ6IDIwcHg7XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMTAgMTFcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHk9XCIwLjVcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiByeD1cIjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0QxRkFERlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMTIyMiAzLjU3OTE5TDQuMTM4ODcgNi40NTgzNkwzLjM0NzIgNS42MTI1M0MzLjIwMTM3IDUuNDc1MDMgMi45NzIyIDUuNDY2NjkgMi44MDU1MyA1LjU4MzM2QzIuNjQzMDMgNS43MDQxOSAyLjU5NzIgNS45MTY2OSAyLjY5NzIgNi4wODc1M0wzLjYzNDcgNy42MTI1M0MzLjcyNjM3IDcuNzU0MTkgMy44ODQ3IDcuODQxNjkgNC4wNjM4NyA3Ljg0MTY5QzQuMjM0NyA3Ljg0MTY5IDQuMzk3MiA3Ljc1NDE5IDQuNDg4ODcgNy42MTI1M0M0LjYzODg3IDcuNDE2NjkgNy41MDEzNyA0LjAwNDE5IDcuNTAxMzcgNC4wMDQxOUM3Ljg3NjM3IDMuNjIwODYgNy40MjIyIDMuMjgzMzYgNy4xMjIyIDMuNTc1MDNWMy41NzkxOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzEyQjc2QVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRBY3Rpb24oZHVwbGljYXRlLCAncmV2aWV3Jyk/LmFjdGlvbiA9PT0gJ3JlamVjdGVkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLTJcIj48c3ZnIHN0eWxlPVwid2lkdGg6IDIwcHg7XHJcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEzIDEzXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzE0MjhfNTk0ODQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTQuNTI5NjEgMS41SDguNjY5NjFMMTEuNTk5NiA0LjQzVjguNTdMOC42Njk2MSAxMS41SDQuNTI5NjFMMS41OTk2MSA4LjU3VjQuNDNMNC41Mjk2MSAxLjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkVFNEUyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wOTk2MSA1TDUuMDk5NjEgOE01LjA5OTYxIDVMOC4wOTk2MSA4TTQuNTI5NjEgMS41SDguNjY5NjFMMTEuNTk5NiA0LjQzVjguNTdMOC42Njk2MSAxMS41SDQuNTI5NjFMMS41OTk2MSA4LjU3VjQuNDNMNC41Mjk2MSAxLjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE0MjhfNTk0ODRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDAuNTk5NjA5IDAuNSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXZhbHVlIG1zLTJcIj5FbnRyeSBUaW1lOiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb3JtYXR0ZWRFbnRyeVRpbWUoZHVwbGljYXRlLmVudHJ5VGltZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRBY3Rpb24oZHVwbGljYXRlLCAnYXBwcm92ZScpPy5hY3Rpb24gPT09ICdhcHByb3ZlZCdcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMzdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMzdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHJ4PVwiMTJcIiBmaWxsPVwiI0QxRkFERlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzQ4Nl85NDA1MSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkuNSAxN0g4QzcuNzM0NzggMTcgNy40ODA0MyAxNi44OTQ2IDcuMjkyODkgMTYuNzA3MUM3LjEwNTM2IDE2LjUxOTYgNyAxNi4yNjUyIDcgMTZWMTIuNUM3IDEyLjIzNDggNy4xMDUzNiAxMS45ODA0IDcuMjkyODkgMTEuNzkyOUM3LjQ4MDQzIDExLjYwNTQgNy43MzQ3OCAxMS41IDggMTEuNUg5LjVNMTMgMTAuNVY4LjVDMTMgOC4xMDIxOCAxMi44NDIgNy43MjA2NCAxMi41NjA3IDcuNDM5MzRDMTIuMjc5NCA3LjE1ODA0IDExLjg5NzggNyAxMS41IDdMOS41IDExLjVWMTdIMTUuMTRDMTUuMzgxMiAxNy4wMDI3IDE1LjYxNTIgMTYuOTE4MiAxNS43OTkgMTYuNzYyQzE1Ljk4MjcgMTYuNjA1OCAxNi4xMDM4IDE2LjM4ODUgMTYuMTQgMTYuMTVMMTYuODMgMTEuNjVDMTYuODUxOCAxMS41MDY3IDE2Ljg0MjEgMTEuMzYwMyAxNi44MDE3IDExLjIyMTFDMTYuNzYxMyAxMS4wODE5IDE2LjY5MTEgMTAuOTUzMSAxNi41OTU5IDEwLjg0MzhDMTYuNTAwOCAxMC43MzQ0IDE2LjM4MyAxMC42NDcgMTYuMjUwOCAxMC41ODc2QzE2LjExODUgMTAuNTI4MyAxNS45NzUgMTAuNDk4NCAxNS44MyAxMC41SDEzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMzk4NTVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDg2Xzk0MDUxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNiA2KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEFjdGlvbihkdXBsaWNhdGUsICdhcHByb3ZlJyk/LmFjdGlvbiA9PT0gJ3JlamVjdGVkJ1wiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjM3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjM3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiByeD1cIjEyXCIgZmlsbD1cIiNGRUU0RTJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80ODZfOTQwOTApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNC41MDE1IDcuMDAwMDZIMTUuODM2NUMxNi4xMTk1IDYuOTk1MDUgMTYuMzk0NCA3LjA5NDEzIDE2LjYwOTIgNy4yNzg0N0MxNi44MjM5IDcuNDYyODEgMTYuOTYzNSA3LjcxOTU5IDE3LjAwMTUgOC4wMDAwNlYxMS41MDAxQzE2Ljk2MzUgMTEuNzgwNSAxNi44MjM5IDEyLjAzNzMgMTYuNjA5MiAxMi4yMjE2QzE2LjM5NDQgMTIuNDA2IDE2LjExOTUgMTIuNTA1MSAxNS44MzY1IDEyLjUwMDFIMTQuNTAxNU0xMS4wMDE1IDEzLjUwMDFWMTUuNTAwMUMxMS4wMDE1IDE1Ljg5NzkgMTEuMTU5NSAxNi4yNzk0IDExLjQ0MDggMTYuNTYwN0MxMS43MjIxIDE2Ljg0MiAxMi4xMDM3IDE3LjAwMDEgMTIuNTAxNSAxNy4wMDAxTDE0LjUwMTUgMTIuNTAwMVY3LjAwMDA2SDguODYxNDhDOC42MjAzMiA2Ljk5NzMzIDguMzg2MjkgNy4wODE4NiA4LjIwMjUzIDcuMjM4MDZDOC4wMTg3NiA3LjM5NDI2IDcuODk3NjQgNy42MTE2MSA3Ljg2MTQ4IDcuODUwMDZMNy4xNzE0OCAxMi4zNTAxQzcuMTQ5NzMgMTIuNDkzNCA3LjE1OTM5IDEyLjYzOTcgNy4xOTk4MSAxMi43Nzg5QzcuMjQwMjMgMTIuOTE4MSA3LjMxMDQzIDEzLjA0NjkgNy40MDU1NSAxMy4xNTYzQzcuNTAwNjcgMTMuMjY1NyA3LjYxODQ0IDEzLjM1MzEgNy43NTA2OSAxMy40MTI0QzcuODgyOTUgMTMuNDcxOCA4LjAyNjUzIDEzLjUwMTcgOC4xNzE0OCAxMy41MDAxSDExLjAwMTVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0Q5MkQyMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF80ODZfOTQwOTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSg2IDYpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIER1cGxpY2F0ZSBSZWFzb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImR1cGxpY2F0ZS1yZWFzb24gbXMtMiBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj57eyBkdXBsaWNhdGUucmVhc29uIH19PC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIHB5LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50cy1hY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjY29yZGlvbiBIZWFkZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlQ29tbWVudHNBY2NvcmRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tbWVudHMtY291bnRcIj57eyBjb21tZW50cz8ubGVuZ3RoIH19IENvbW1lbnRzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1hcnJvdyBtcy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbY2xhc3Mucm90YXRlZF09XCJjb21tZW50c0FjY29yZGlvbk9wZW5cIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBY2NvcmRpb24gQm9keSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1ib2R5XCIgKm5nSWY9XCJjb21tZW50c0FjY29yZGlvbk9wZW5cIj5cclxuICAgICAgICBcclxuICAgICAgICAgIDwhLS0gTG9vcCBlYWNoIGJsb2NrOiB0YWdnaW5nIC8gcmV2aWV3IC8gYXBwcm92ZSAtLT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJsb2NrIG9mIGFjdGl2aXR5RGF0YVwiPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICA8IS0tIExvb3AgaW5zaWRlIGNvbW1lbnRzIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjIG9mIGJsb2NrLmNvbW1lbnRzXCIgY2xhc3M9XCJjb21tZW50LXRocmVhZCBkLWZsZXggbWItNFwiPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgIDwhLS0gYXZhdGFyIC0tPlxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyIGF2YXRhci10ZXh0IGxpZ2h0LXByaW1hcnkgcC0zXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAge3sgZ2V0SW5pdGlhbHNGcm9tRW1haWwoYy5jcmVhdGVkQnlFbWFpbCkgfX1cclxuICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8IS0tIGVtYWlsIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGMuY3JlYXRlZEJ5RW1haWwgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCIgKm5nSWY9XCJjLmNyZWF0ZWRBdFwiPlxyXG4gICAgICAgICAgICB7eyBjLmNyZWF0ZWRBdCB8IGRhdGU6J2hoOm1tOnNzIGEgLSBkZCBNTU0geXl5eScgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgXHJcbiAgICAgICAgICAgICAgICA8IS0tIG1lc3NhZ2UgdGV4dCAtLT5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMiBtdC0yXCIgKm5nSWY9XCJjLm1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAge3sgYy5tZXNzYWdlIH19XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8IS0tIFJldmlldyAvIEFwcHJvdmUgb25seSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJibG9jay50eXBlID09PSAncmV2aWV3JyB8fCBibG9jay50eXBlID09PSAnYXBwcm92ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUYWdnZWQgaW1hZ2VzIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGltZyBvZiBjLnRhZ2dlZEltYWdlczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNob3cgb25seSBmaXJzdCA0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgPCAzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhbmdvLWltYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kSW1hZ2VdPVwiJ3VybCgnKyBpbWFnZVVybCArIGltZy5maWxlUGF0aCArICcpJ1wiPjwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1tZXRhIHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYW5nbyBJRDoge3sgaW1nLnRlbXBJZCB9fVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHN0YXR1cyBkb3RzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImMuc3RhdHVzID09PSAnYXBwcm92ZWQnXCI+PHN2ZyBzdHlsZT1cIndpZHRoOiAyMHB4O1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAyMHB4O1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDEwIDExXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHk9XCIwLjVcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiByeD1cIjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMTIyMiAzLjU3OTE5TDQuMTM4ODcgNi40NTgzNkwzLjM0NzIgNS42MTI1M0MzLjIwMTM3IDUuNDc1MDMgMi45NzIyIDUuNDY2NjkgMi44MDU1MyA1LjU4MzM2QzIuNjQzMDMgNS43MDQxOSAyLjU5NzIgNS45MTY2OSAyLjY5NzIgNi4wODc1M0wzLjYzNDcgNy42MTI1M0MzLjcyNjM3IDcuNzU0MTkgMy44ODQ3IDcuODQxNjkgNC4wNjM4NyA3Ljg0MTY5QzQuMjM0NyA3Ljg0MTY5IDQuMzk3MiA3Ljc1NDE5IDQuNDg4ODcgNy42MTI1M0M0LjYzODg3IDcuNDE2NjkgNy41MDEzNyA0LjAwNDE5IDcuNTAxMzcgNC4wMDQxOUM3Ljg3NjM3IDMuNjIwODYgNy40MjIyIDMuMjgzMzYgNy4xMjIyIDMuNTc1MDNWMy41NzkxOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMTJCNzZBXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImMuc3RhdHVzID09PSAncmVqZWN0ZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjxzdmcgc3R5bGU9XCJ3aWR0aDogMjBweDtcclxuICAgICAgICAgICAgICAgIGhlaWdodDogMjBweDtcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzE0MjhfNTk0ODQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00LjUyOTYxIDEuNUg4LjY2OTYxTDExLjU5OTYgNC40M1Y4LjU3TDguNjY5NjEgMTEuNUg0LjUyOTYxTDEuNTk5NjEgOC41N1Y0LjQzTDQuNTI5NjEgMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkVFNEUyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDk5NjEgNUw1LjA5OTYxIDhNNS4wOTk2MSA1TDguMDk5NjEgOE00LjUyOTYxIDEuNUg4LjY2OTYxTDExLjU5OTYgNC40M1Y4LjU3TDguNjY5NjEgMTEuNUg0LjUyOTYxTDEuNTk5NjEgOC41N1Y0LjQzTDQuNTI5NjEgMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTQyOF81OTQ4NFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDAuNTk5NjA5IDAuNSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnkgdGltZToge3sgaW1nLmVudHJ5VGltZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSArTiBtb3JlIC0tPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwidGFuZ28tY2FyZCBtb3JlLWNhcmQgdGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgKm5nSWY9XCJjLnRhZ2dlZEltYWdlcy5sZW5ndGggPiAzXCJcclxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kSW1hZ2VdPVwiJ3VybCgnICsgaW1hZ2VVcmwgKyBjLnRhZ2dlZEltYWdlc1szXS5maWxlUGF0aCArICcpJ1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkltYWdlc1BvcHVwKGMpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9yZS1vdmVybGF5XCI+PC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICA8IS0tIHZlcnRpY2FsIGNvbnRhaW5lciAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb3JlLXdyYXBwZXIgbXktMTAgZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb3JlLXRleHQgZnctc2VtaWJvbGRcIj4re3sgYy50YWdnZWRJbWFnZXMubGVuZ3RoIC0gMyB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1wcmltYXJ5IHRleHQtZGFyayB0ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5lIHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgVmlldyBhbGxcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBTdGF0dXMgSWNvbnMgLS0+XHJcblxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuPHNlY3Rpb24gKm5nSWY9XCJ0eXBlICE9PSdkdXBsaWNhdGUnXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGF5ZXJzIG15LTJcIiAqbmdJZj1cImhhc1Jldm9wc1R5cGUodHlwZSlcIj5cclxuICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBtaW4taC0yNXB4IHB0LTNcIj5cclxuICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHVwbGljYXRlLWhlYWQgdGV4dC1sZyBteS0zXCI+PHNwYW4gY2xhc3M9XCJtZS0yXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy41MTk5NSAwLjYxMzA2NUM4LjMzNzM5IC0wLjIwNDM1NSA5LjY2MjY3IC0wLjIwNDM1NSAxMC40ODAxIDAuNjEzMDY1TDE3LjM4NyA3LjUxOTk1QzE4LjIwNDMgOC4zMzczOSAxOC4yMDQzIDkuNjYyNjcgMTcuMzg3IDEwLjQ4MDFMMTAuNDgwMSAxNy4zODdDOS42NjI2NyAxOC4yMDQzIDguMzM3MzkgMTguMjA0MyA3LjUxOTk1IDE3LjM4N0w1LjU0NjI2IDE1LjQxMzNMMy43MzcwOCAxNy4yMjI0QzIuOTE5NjYgMTguMDM5OSAxLjU5NDM2IDE4LjAzOTkgMC43NzY5NDQgMTcuMjIyNEMtMC4wNDA0NzY3IDE2LjQwNTEgLTAuMDQwNDc2NyAxNS4wNzk3IDAuNzc2OTQ0IDE0LjI2MjRMMi41ODYxMiAxMi40NTMxTDAuNjEzMDY1IDEwLjQ4MDFDLTAuMjA0MzU1IDkuNjYyNjcgLTAuMjA0MzU1IDguMzM3MzkgMC42MTMwNjUgNy41MTk5NUw3LjUxOTk1IDAuNjEzMDY1Wk05LjQ5MzM2IDEuNTk5NzhDOS4yMjA4OCAxLjMyNzMxIDguNzc5MDkgMS4zMjczMSA4LjUwNjYxIDEuNTk5NzhMMy41NzI4NiA2LjUzMzU3TDExLjQ2NjUgMTQuNDI3MkwxNi40MDAyIDkuNDkzMzZDMTYuNjcyNyA5LjIyMDg4IDE2LjY3MjcgOC43NzkwOSAxNi40MDAyIDguNTA2N0wxMi45NDY1IDUuMDUyODZMMTEuNzk1MiA2LjIwNDAzQzExLjUyMjggNi40NzY1IDExLjA4MTEgNi40NzY1IDEwLjgwODYgNi4yMDQwM0MxMC41MzYxIDUuOTMxNTUgMTAuNTM2MSA1LjQ4OTc4IDEwLjgwODYgNS4yMTczMUwxMS45NTk3IDQuMDY2MTRMMTAuOTczMiAzLjA3OTY0TDguMTc3NTcgNS44NzUzM0M3LjkwNTA5IDYuMTQ3OCA3LjQ2MzI5IDYuMTQ3OCA3LjE5MDgxIDUuODc1MzNDNi45MTgzMyA1LjYwMjg2IDYuOTE4MzMgNS4xNjEwOSA3LjE5MDgxIDQuODg4NjJMOS45ODY1IDIuMDkyOTNMOS40OTMzNiAxLjU5OTc4Wk0xMC40Nzk3IDE1LjQxMzlMMi41ODYxNSA3LjUyMDI4TDEuNTk5NzggOC41MDY3QzEuMzI3MyA4Ljc3OTA5IDEuMzI3MyA5LjIyMDg4IDEuNTk5NzggOS40OTMzNkw4LjUwNjYxIDE2LjQwMDJDOC43NzkwOSAxNi42NzI3IDkuMjIwODggMTYuNjcyNyA5LjQ5MzM2IDE2LjQwMDJMMTAuNDc5NyAxNS40MTM5Wk0zLjU3Mjc1IDEzLjQzOTlMMS43NjM2NiAxNS4yNDlDMS40OTExOSAxNS41MjE1IDEuNDkxMTkgMTUuOTYzMyAxLjc2MzY2IDE2LjIzNThDMi4wMzYxMyAxNi41MDgyIDIuNDc3OSAxNi41MDgyIDIuNzUwMzcgMTYuMjM1OEw0LjU1OTQ2IDE0LjQyNjZMMy41NzI3NSAxMy40Mzk5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCIgLz5cclxuICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj4ge3t0eXBlfX1cclxuXHJcbiAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICA8L2Rpdj5cclxuICAgICAgIDxkaXYgKm5nSWY9XCJpc0NoZWNrYm94RW5hYmxlXCIgY2xhc3M9XCJtcy0zIG15LTNcIj5cclxuICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RBbGxCeVR5cGVbdHlwZV1cIlxyXG4gICAgKGNoYW5nZSk9XCJvblNlbGVjdEFsbCh0eXBlLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgPGxhYmVsPlNlbGVjdCBBbGw8L2xhYmVsPlxyXG4gICAgICAgPC9kaXY+XHJcbiAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBtYXBwaW5nIG9mIHNvdXJjZT8ubWFwcGluZ0luZm9cIj5cclxuICAgICAgICAgICA8IS0tIEJvZHkgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibWFwcGluZz8udHlwZSA9PT12aWV3TW9kZVwiIGNsYXNzPVwiY2FyZC1ib2R5IGJnLXdoaXRlIGxheWVycyBwLTUgbS0zXCI+XHJcblxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcmlnaW5hbCBvZiBtYXBwaW5nPy5yZXZpc2VkRGV0YWlsO2xldCBpPWluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm9yaWdpbmFsPy5yZXZvcHNUeXBlID09PXR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1tZC0zIG1iLTMgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBiLTMgaC0xMDAgcm91bmRlZC0zIHBvc2l0aW9uLXJlbGF0aXZlXCIgW25nQ2xhc3NdPVwie1xyXG4nbGF5ZXItYXBwcm92ZWQnOiBpc0FwcHJvdmVkKG9yaWdpbmFsKSxcclxuJ2xheWVyLXJlamVjdGVkJzogaXNSZWplY3RlZChvcmlnaW5hbCksXHJcbidpbWctYm9yZGVyIGJvcmRlciBib3JkZXItMSc6ICFpc0FwcHJvdmVkKG9yaWdpbmFsKSAmJiAhaXNSZWplY3RlZChvcmlnaW5hbCl9XCI+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVG9wLXJpZ2h0IENoZWNrYm94IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hlY2tib3hFbmFibGVcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiIWlzTG9ja2VkQnlSZXZpZXdlcihvcmlnaW5hbClcIiB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIGFic29sdXRlIGZvcm0tY2hlY2staW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiKHNlbGVjdGVkQnlUeXBlW3R5cGVdIHx8IFtdKS5pbmNsdWRlcyhvcmlnaW5hbD8udGVtcElkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25JbWFnZUNoZWNrYm94Q2hhbmdlKHR5cGUsIG9yaWdpbmFsLnRlbXBJZClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgYWJzb2x1dGVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0xvY2tlZEJ5UmV2aWV3ZXIob3JpZ2luYWwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0Q2hlY2tib3godHlwZSwgb3JpZ2luYWwpXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMTlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxOSAxOVwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF8yMDIzXzEzNzE4KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxLjExMTMzXCIgeT1cIjAuNTU1NjY0XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgcng9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMS4zODkxMVwiIHk9XCIwLjgzMzQ0MlwiIHdpZHRoPVwiMTUuNDQ0NFwiIGhlaWdodD1cIjE1LjQ0NDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeD1cIjEuNzIyMjJcIiBzdHJva2U9XCIjRDBENUREXCIgc3Ryb2tlLXdpZHRoPVwiMC41NTU1NTZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS44NzEwOSA4LjU1NTY2SDEyLjM1MjZcIiBzdHJva2U9XCIjMzQ0MDU0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMC45Mjc3NzhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF8yMDIzXzEzNzE4XCIgeD1cIjAuMDAwMjE3MDhcIiB5PVwiMC4wMDAxMDg1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTguMjIyMlwiIGhlaWdodD1cIjE4LjIyMjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVwic1JHQlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImhhcmRBbHBoYVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjAuNTU1NTU2XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjAuNTU1NTU2XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzIwMjNfMTM3MThcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd18yMDIzXzEzNzE4XCIgcmVzdWx0PVwic2hhcGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlVXJsICsgb3JpZ2luYWw/LmZpbGVQYXRoXCIgYWx0PVwiXCIgKGNsaWNrKT1cIm9wZW5JbWFnZVByZXZpZXcobWFwcGluZyxvcmlnaW5hbCwgaSwgc2VsZWN0ZWRCeVR5cGVbdHlwZV0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwIHJvdW5kZWQgYm9yZGVyIGN1cnNvci1wb2ludGVyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy10aXRsZSBtcy0yIG15LTJcIj5UYW5nbyBJRDoge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLnRlbXBJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2V0QWN0aW9uKG9yaWdpbmFsLCAncmV2aWV3Jyk/LmFjdGlvbiA9PT0gJ2FwcHJvdmVkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0yXCI+PHN2ZyBzdHlsZT1cIndpZHRoOiAyMHB4O1xyXG5oZWlnaHQ6IDIwcHg7XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMTAgMTFcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB5PVwiMC41XCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgcng9XCI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjEyMjIgMy41NzkxOUw0LjEzODg3IDYuNDU4MzZMMy4zNDcyIDUuNjEyNTNDMy4yMDEzNyA1LjQ3NTAzIDIuOTcyMiA1LjQ2NjY5IDIuODA1NTMgNS41ODMzNkMyLjY0MzAzIDUuNzA0MTkgMi41OTcyIDUuOTE2NjkgMi42OTcyIDYuMDg3NTNMMy42MzQ3IDcuNjEyNTNDMy43MjYzNyA3Ljc1NDE5IDMuODg0NyA3Ljg0MTY5IDQuMDYzODcgNy44NDE2OUM0LjIzNDcgNy44NDE2OSA0LjM5NzIgNy43NTQxOSA0LjQ4ODg3IDcuNjEyNTNDNC42Mzg4NyA3LjQxNjY5IDcuNTAxMzcgNC4wMDQxOSA3LjUwMTM3IDQuMDA0MTlDNy44NzYzNyAzLjYyMDg2IDcuNDIyMiAzLjI4MzM2IDcuMTIyMiAzLjU3NTAzVjMuNTc5MTlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMTJCNzZBXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2V0QWN0aW9uKG9yaWdpbmFsLCAncmV2aWV3Jyk/LmFjdGlvbiA9PT0gJ3JlamVjdGVkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0yXCI+PHN2ZyBzdHlsZT1cIndpZHRoOiAyMHB4O1xyXG5oZWlnaHQ6IDIwcHg7XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTMgMTNcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzE0MjhfNTk0ODQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNC41Mjk2MSAxLjVIOC42Njk2MUwxMS41OTk2IDQuNDNWOC41N0w4LjY2OTYxIDExLjVINC41Mjk2MUwxLjU5OTYxIDguNTdWNC40M0w0LjUyOTYxIDEuNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkVFNEUyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjA5OTYxIDVMNS4wOTk2MSA4TTUuMDk5NjEgNUw4LjA5OTYxIDhNNC41Mjk2MSAxLjVIOC42Njk2MUwxMS41OTk2IDQuNDNWOC41N0w4LjY2OTYxIDExLjVINC41Mjk2MUwxLjU5OTYxIDguNTdWNC40M0w0LjUyOTYxIDEuNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNDI4XzU5NDg0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDAuNTk5NjA5IDAuNSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXZhbHVlIG1zLTJcIj5FbnRyeSBUaW1lOiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9ybWF0dGVkRW50cnlUaW1lKG9yaWdpbmFsPy5lbnRyeVRpbWUpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIG1zLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnZXRBY3Rpb24ob3JpZ2luYWwsICdhcHByb3ZlJyk/LmFjdGlvbiA9PT0gJ2FwcHJvdmVkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIzN1wiIGhlaWdodD1cIjM3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiByeD1cIjEyXCIgZmlsbD1cIiNEMUZBREZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDg2Xzk0MDUxKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05LjUgMTdIOEM3LjczNDc4IDE3IDcuNDgwNDMgMTYuODk0NiA3LjI5Mjg5IDE2LjcwNzFDNy4xMDUzNiAxNi41MTk2IDcgMTYuMjY1MiA3IDE2VjEyLjVDNyAxMi4yMzQ4IDcuMTA1MzYgMTEuOTgwNCA3LjI5Mjg5IDExLjc5MjlDNy40ODA0MyAxMS42MDU0IDcuNzM0NzggMTEuNSA4IDExLjVIOS41TTEzIDEwLjVWOC41QzEzIDguMTAyMTggMTIuODQyIDcuNzIwNjQgMTIuNTYwNyA3LjQzOTM0QzEyLjI3OTQgNy4xNTgwNCAxMS44OTc4IDcgMTEuNSA3TDkuNSAxMS41VjE3SDE1LjE0QzE1LjM4MTIgMTcuMDAyNyAxNS42MTUyIDE2LjkxODIgMTUuNzk5IDE2Ljc2MkMxNS45ODI3IDE2LjYwNTggMTYuMTAzOCAxNi4zODg1IDE2LjE0IDE2LjE1TDE2LjgzIDExLjY1QzE2Ljg1MTggMTEuNTA2NyAxNi44NDIxIDExLjM2MDMgMTYuODAxNyAxMS4yMjExQzE2Ljc2MTMgMTEuMDgxOSAxNi42OTExIDEwLjk1MzEgMTYuNTk1OSAxMC44NDM4QzE2LjUwMDggMTAuNzM0NCAxNi4zODMgMTAuNjQ3IDE2LjI1MDggMTAuNTg3NkMxNi4xMTg1IDEwLjUyODMgMTUuOTc1IDEwLjQ5ODQgMTUuODMgMTAuNUgxM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAzOTg1NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDg2Xzk0MDUxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSg2IDYpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdldEFjdGlvbihvcmlnaW5hbCwgJ2FwcHJvdmUnKT8uYWN0aW9uID09PSAncmVqZWN0ZWQnXCI+PHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjM3XCIgaGVpZ2h0PVwiMzdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHJ4PVwiMTJcIiBmaWxsPVwiI0ZFRTRFMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80ODZfOTQwOTApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0LjUwMTUgNy4wMDAwNkgxNS44MzY1QzE2LjExOTUgNi45OTUwNSAxNi4zOTQ0IDcuMDk0MTMgMTYuNjA5MiA3LjI3ODQ3QzE2LjgyMzkgNy40NjI4MSAxNi45NjM1IDcuNzE5NTkgMTcuMDAxNSA4LjAwMDA2VjExLjUwMDFDMTYuOTYzNSAxMS43ODA1IDE2LjgyMzkgMTIuMDM3MyAxNi42MDkyIDEyLjIyMTZDMTYuMzk0NCAxMi40MDYgMTYuMTE5NSAxMi41MDUxIDE1LjgzNjUgMTIuNTAwMUgxNC41MDE1TTExLjAwMTUgMTMuNTAwMVYxNS41MDAxQzExLjAwMTUgMTUuODk3OSAxMS4xNTk1IDE2LjI3OTQgMTEuNDQwOCAxNi41NjA3QzExLjcyMjEgMTYuODQyIDEyLjEwMzcgMTcuMDAwMSAxMi41MDE1IDE3LjAwMDFMMTQuNTAxNSAxMi41MDAxVjcuMDAwMDZIOC44NjE0OEM4LjYyMDMyIDYuOTk3MzMgOC4zODYyOSA3LjA4MTg2IDguMjAyNTMgNy4yMzgwNkM4LjAxODc2IDcuMzk0MjYgNy44OTc2NCA3LjYxMTYxIDcuODYxNDggNy44NTAwNkw3LjE3MTQ4IDEyLjM1MDFDNy4xNDk3MyAxMi40OTM0IDcuMTU5MzkgMTIuNjM5NyA3LjE5OTgxIDEyLjc3ODlDNy4yNDAyMyAxMi45MTgxIDcuMzEwNDMgMTMuMDQ2OSA3LjQwNTU1IDEzLjE1NjNDNy41MDA2NyAxMy4yNjU3IDcuNjE4NDQgMTMuMzUzMSA3Ljc1MDY5IDEzLjQxMjRDNy44ODI5NSAxMy40NzE4IDguMDI2NTMgMTMuNTAxNyA4LjE3MTQ4IDEzLjUwMDFIMTEuMDAxNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0Q5MkQyMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDg2Xzk0MDkwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSg2IDYpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBweS01XCI+XHJcbiAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnRzLWFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICAgICA8IS0tIEFjY29yZGlvbiBIZWFkZXIgLS0+XHJcbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZUNvbW1lbnRzQWNjb3JkaW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50cy10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbW1lbnRzLWNvdW50XCI+e3sgY29tbWVudHM/Lmxlbmd0aCB9fSBDb21tZW50czwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1hcnJvdyBtcy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW2NsYXNzLnJvdGF0ZWRdPVwiY29tbWVudHNBY2NvcmRpb25PcGVuXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgIDwhLS0gQWNjb3JkaW9uIENvbnRlbnQgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1ib2R5XCIgKm5nSWY9XCJjb21tZW50c0FjY29yZGlvbk9wZW5cIj5cclxuXHJcbjwhLS0gbG9vcCBlYWNoIGJsb2NrOiB0YWdnaW5nIC8gcmV2aWV3IC8gYXBwcm92ZSAtLT5cclxuPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYmxvY2sgb2YgYWN0aXZpdHlEYXRhMVwiPlxyXG5cclxuPCEtLSBUQUdHSU5HIENPTU1FTlRTIChlYWNoIGNvbW1lbnQgPSBvbmUgaW1hZ2UgKyBtZXNzYWdlKSAtLT5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImJsb2NrLnR5cGUgPT09ICd0YWdnaW5nJ1wiPlxyXG48ZGl2ICpuZ0Zvcj1cImxldCBjIG9mIGJsb2NrLmNvbW1lbnRzXCIgY2xhc3M9XCJjb21tZW50LXRocmVhZCBkLWZsZXggbWItNFwiPlxyXG5cclxuPCEtLSBhdmF0YXIgLS0+XHJcbjxkaXYgY2xhc3M9XCJhdmF0YXIgYXZhdGFyLXRleHQgbGlnaHQtcHJpbWFyeSBwLTNcIj5cclxuXHJcbiAgICAgICAgICB7eyBnZXRJbml0aWFsc0Zyb21FbWFpbChjLmNyZWF0ZWRCeUVtYWlsKSB9fVxyXG4gICAgICA8L2Rpdj5cclxuXHJcbjwhLS0gY29udGVudCAtLT5cclxuPGRpdj5cclxuIDxkaXYgY2xhc3M9XCJmdy1zZW1pYm9sZFwiPlxyXG4gICB7eyBjLmNyZWF0ZWRCeUVtYWlsIH19XHJcbiA8L2Rpdj5cclxuXHJcbiA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiICpuZ0lmPVwiYy5jcmVhdGVkQXRcIj5cclxuICAge3sgYy5jcmVhdGVkQXQgfCBkYXRlOidoaDptbTpzcyBhIC0gZGQgTU1NIHl5eXknIH19XHJcbiA8L2Rpdj5cclxuXHJcbiA8cCBjbGFzcz1cIm1iLTIgbXQtMlwiICpuZ0lmPVwiYy5tZXNzYWdlXCI+XHJcbiAgIHt7IGMubWVzc2FnZSB9fVxyXG4gPC9wPlxyXG5cclxuIDwhLS0gc2luZ2xlIGltYWdlIGNhcmQgLS0+XHJcbiA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICA8ZGl2IGNsYXNzPVwidGFuZ28tY2FyZFwiICpuZ0lmPVwiYy5maWxlUGF0aFwiPlxyXG4gICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1pbWFnZVwiXHJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZEltYWdlXT1cIid1cmwoJyArIGltYWdlVXJsICsgYy5maWxlUGF0aCArICcpJ1wiPlxyXG4gICAgIDwvZGl2PlxyXG5cclxuICAgICA8ZGl2IGNsYXNzPVwidGFuZ28tbWV0YSBzbWFsbFwiPlxyXG4gICAgICAgPGRpdj5UYW5nbyBJRDoge3sgYy50ZW1wSWQgfX08L2Rpdj5cclxuICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+RW50cnkgdGltZToge3sgYy5lbnRyeVRpbWUgfX08L2Rpdj5cclxuICAgICA8L2Rpdj5cclxuICAgPC9kaXY+XHJcbiA8L2Rpdj5cclxuPC9kaXY+XHJcbjwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjwhLS0gUkVWSUVXIC8gQVBQUk9WRSBDT01NRU5UUyAod2l0aCB0YWdnZWRJbWFnZXMgKyArTiBWaWV3IGFsbCkgLS0+XHJcbjxuZy1jb250YWluZXIgKm5nSWY9XCJibG9jay50eXBlID09PSAncmV2aWV3JyB8fCBibG9jay50eXBlID09PSAnYXBwcm92ZSdcIj5cclxuPGRpdiAqbmdGb3I9XCJsZXQgYyBvZiBibG9jay5jb21tZW50c1wiIGNsYXNzPVwiY29tbWVudC10aHJlYWQgZC1mbGV4IG1iLTRcIj5cclxuXHJcbjwhLS0gYXZhdGFyIC0tPlxyXG48ZGl2IGNsYXNzPVwiYXZhdGFyIGF2YXRhci10ZXh0IGxpZ2h0LXByaW1hcnkgcC0zXCI+XHJcblxyXG4gICAgICAgICAge3sgZ2V0SW5pdGlhbHNGcm9tRW1haWwoYy5jcmVhdGVkQnlFbWFpbCkgfX1cclxuICAgICAgPC9kaXY+XHJcblxyXG48IS0tIGNvbnRlbnQgLS0+XHJcbjxkaXYgY2xhc3M9XCJ3LTEwMFwiPlxyXG4gPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+XHJcbiAgIHt7IGMuY3JlYXRlZEJ5RW1haWwgfX1cclxuIDwvZGl2PlxyXG5cclxuIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCIgKm5nSWY9XCJjLmNyZWF0ZWRBdFwiPlxyXG4gICB7eyBjLmNyZWF0ZWRBdCB8IGRhdGU6J2hoOm1tOnNzIGEgLSBkZCBNTU0geXl5eScgfX1cclxuIDwvZGl2PlxyXG5cclxuIDwhLS0gbWFpbiByZXZpZXcvYXBwcm92ZSBtZXNzYWdlIC0tPlxyXG4gPHAgY2xhc3M9XCJtYi0yIG10LTJcIiAqbmdJZj1cImMubWVzc2FnZVwiPlxyXG4gICB7eyBjLm1lc3NhZ2UgfX1cclxuIDwvcD5cclxuXHJcbiBcclxuXHJcbiA8IS0tIGltYWdlIGxpc3QgKyArTiBWaWV3IGFsbCAtLT5cclxuIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTIgZmxleC13cmFwXCIgKm5nSWY9XCJjLnRhZ2dlZEltYWdlcz8ubGVuZ3RoXCI+XHJcblxyXG4gICA8IS0tIGZpcnN0IDMgaW1hZ2VzIC0tPlxyXG4gICA8ZGl2ICpuZ0Zvcj1cImxldCBpbWcgb2YgYy50YWdnZWRJbWFnZXM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaSA8IDNcIj5cclxuICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1jYXJkXCI+XHJcbiAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1pbWFnZVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRJbWFnZV09XCIndXJsKCcgKyBpbWFnZVVybCArIGltZy5maWxlUGF0aCArICcpJ1wiPlxyXG4gICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1tZXRhIHNtYWxsXCI+XHJcbiAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgIFRhbmdvIElEOiB7eyBpbWcudGVtcElkIH19XHJcbiAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImMuc3RhdHVzID09PSAnYXBwcm92ZWQnXCJcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtYXBwcm92ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYy5zdGF0dXMgPT09ICdyZWplY3RlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdGF0dXMtZG90IHN0YXR1cy1yZWplY3RcIj48L3NwYW4+XHJcbiAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgIEVudHJ5IHRpbWU6IHt7IGltZy5lbnRyeVRpbWUgfX1cclxuICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgPC9kaXY+XHJcbiAgICAgICA8L2Rpdj5cclxuICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgPC9kaXY+XHJcblxyXG4gICA8IS0tICtOIFZpZXcgYWxsIGNhcmQgLS0+XHJcbiAgIDxkaXZcclxuICAgICBjbGFzcz1cInRhbmdvLWNhcmQgbW9yZS1jYXJkIHRleHQtY2VudGVyXCJcclxuICAgICAqbmdJZj1cImMudGFnZ2VkSW1hZ2VzLmxlbmd0aCA+IDNcIlxyXG4gICAgIFtzdHlsZS5iYWNrZ3JvdW5kSW1hZ2VdPVwiJ3VybCgnICsgaW1hZ2VVcmwgKyBjLnRhZ2dlZEltYWdlc1szXS5maWxlUGF0aCArICcpJ1wiXHJcbiAgICAgKGNsaWNrKT1cIm9wZW5JbWFnZXNQb3B1cChjKVwiXHJcbiAgID5cclxuICAgICA8ZGl2IGNsYXNzPVwibW9yZS1vdmVybGF5XCI+PC9kaXY+XHJcblxyXG4gICAgIDxkaXYgY2xhc3M9XCJtb3JlLXdyYXBwZXIgZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICA8ZGl2IGNsYXNzPVwibW9yZS10ZXh0IGZ3LXNlbWlib2xkXCI+XHJcbiAgICAgICAgICt7eyBjLnRhZ2dlZEltYWdlcy5sZW5ndGggLSAzIH19XHJcbiAgICAgICA8L2Rpdj5cclxuICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXByaW1hcnkgdGV4dC1kZWNvcmF0aW9uLXVuZGVybGluZSBzbWFsbFwiPlxyXG4gICAgICAgICBWaWV3IGFsbFxyXG4gICAgICAgPC9kaXY+XHJcbiAgICAgPC9kaXY+XHJcbiAgIDwvZGl2PlxyXG5cclxuIDwvZGl2PlxyXG48L2Rpdj5cclxuPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgIDwvZGl2PlxyXG4gICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgXHJcblxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dBcHByb3ZlRGV0YWlsc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlscy10b2dnbGUgZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBiZy1saWdodC1wcmltYXJ5IGFsaWduLWl0ZW1zLXN0YXJ0IG10LTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUmV2aXNlZERldGFpbHMobWFwcGluZylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXByaW1hcnkgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93IGluIGRldGFpbHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93QXBwcm92ZURldGFpbHNcIiBjbGFzcz1cImNoZXZyb24gbXMtMyBjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYgMTVMMTIgOUwxOCAxNVwiIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm1hcHBpbmc/LnN0YXR1cyA9PT0gJ0Nsb3NlZCcgJiYgWyd0YW5nb3JldmlldyddLmluY2x1ZGVzKG1hcHBpbmc/LnR5cGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtZm9vdGVyIHJldmlzaW9uLWNhcmQtYXBwcm92ZSBweS0xIGJnLWxpZ2h0LXByaW1hcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dUYW5nb0RldGFpbHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldGFpbHMtdG9nZ2xlIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgYmctbGlnaHQtcHJpbWFyeSBhbGlnbi1pdGVtcy1zdGFydCBtdC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVJldmlzZWREZXRhaWxzKG1hcHBpbmcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1wcmltYXJ5IFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdyBpbiBkZXRhaWxzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGV2cm9uIG1zLTMgY3Vyc29yLXBvaW50ZXJcIiBbY2xhc3Mucm90YXRlLTE4MF09XCJzaG93UmV2aXNlZERldGFpbHNcIj48c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xOCA5TDEyIDE1TDYgOVwiIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWJvZHkgbXQtMlwiICpuZ0lmPVwic2hvd1RhbmdvRGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0aWNrZXQgb2YgZm9vdGZhbGxUaWNrZXRzRGF0YVwiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0aWNrZXQ/Ll9zb3VyY2UgYXMgc291cmNlXCIgY2xhc3M9XCJteS01XCI+XHJcbjxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHR5cGUgb2YgcmV2b3BzVHlwZXNcIj5cclxuPHNlY3Rpb24gKm5nSWY9XCJ0eXBlID09PSdkdXBsaWNhdGUnXCI+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cImhhc1Jldm9wc1R5cGUodHlwZSlcIiBjbGFzcz1cImxheWVyc1wiPlxyXG4gICAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIG1pbi1oLTI1cHggcHQtM1wiPlxyXG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAxOCAxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNzMwXzc2MTU3KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTMuNzUgMTEuMjVIM0MyLjYwMjE4IDExLjI1IDIuMjIwNjQgMTEuMDkyIDEuOTM5MzQgMTAuODEwN0MxLjY1ODA0IDEwLjUyOTQgMS41IDEwLjE0NzggMS41IDkuNzVWM0MxLjUgMi42MDIxOCAxLjY1ODA0IDIuMjIwNjQgMS45MzkzNCAxLjkzOTM0QzIuMjIwNjQgMS42NTgwNCAyLjYwMjE4IDEuNSAzIDEuNUg5Ljc1QzEwLjE0NzggMS41IDEwLjUyOTQgMS42NTgwNCAxMC44MTA3IDEuOTM5MzRDMTEuMDkyIDIuMjIwNjQgMTEuMjUgMi42MDIxOCAxMS4yNSAzVjMuNzVNOC4yNSA2Ljc1SDE1QzE1LjgyODQgNi43NSAxNi41IDcuNDIxNTcgMTYuNSA4LjI1VjE1QzE2LjUgMTUuODI4NCAxNS44Mjg0IDE2LjUgMTUgMTYuNUg4LjI1QzcuNDIxNTcgMTYuNSA2Ljc1IDE1LjgyODQgNi43NSAxNVY4LjI1QzYuNzUgNy40MjE1NyA3LjQyMTU3IDYuNzUgOC4yNSA2Ljc1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF83MzBfNzYxNTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgRHVwbGljYXRlc1xyXG4gICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEJvZHkgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG1hcHBpbmcgb2Ygc291cmNlPy5tYXBwaW5nSW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQm9keSBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtYXBwaW5nPy50eXBlID09PXZpZXdNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9yaWdpbmFsIG9mIG1hcHBpbmc/LnJldmlzZWREZXRhaWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcmlnaW5hbD8uaXNQYXJlbnQgJiYgb3JpZ2luYWw/LnJldm9wc1R5cGUgPT09J2R1cGxpY2F0ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1ib2R5IGJnLXdoaXRlIGxheWVycyBweS01IHB4LTAgbS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPcmlnaW5hbCBJbWFnZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR1cGxpY2F0ZS1oZWFkIHB4LTUgbXktM1wiPk9yaWdpbmFsIGltYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHB4LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCByZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi0zIGltZy1ib3JkZXIgYm9yZGVyIGJvcmRlci0xIGgtMTAwIHJvdW5kZWQtM1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlVXJsICsgb3JpZ2luYWw/LmZpbGVQYXRoXCIgYWx0PVwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMDAgcm91bmRlZCBib3JkZXJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy10aXRsZSBtcy0yIG15LTJcIj5UYW5nbyBJRDoge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLnRlbXBJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdmFsdWUgbXMtMlwiPkVudHJ5IFRpbWU6IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb3JtYXR0ZWRFbnRyeVRpbWUob3JpZ2luYWw/LmVudHJ5VGltZSkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VwYXJhdG9yIHNlcGFyYXRvci1kYXNoZWQgbXQtMyBtYi01XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHgtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiZHVwbGljYXRlLWhlYWQgbXktMyBmcy02XCI+VGFnZ2VkIER1cGxpY2F0ZXM8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hlY2tib3hFbmFibGVcIiBjbGFzcz1cIm15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiYXJlQWxsRHVwbGljYXRlc1NlbGVjdGVkKG9yaWdpbmFsKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVTZWxlY3RBbGxEdXBsaWNhdGVzKG9yaWdpbmFsLCAkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtcy0yXCI+U2VsZWN0IEFsbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGR1cGxpY2F0ZSBvZiBvcmlnaW5hbD8uZHVwbGljYXRlSW1hZ2U7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1kLTMgbWItMyBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi0zIGgtMTAwIHJvdW5kZWQtMyBwb3NpdGlvbi1yZWxhdGl2ZVwiIFtuZ0NsYXNzXT1cIntcclxuICAgICdsYXllci1hcHByb3ZlZCc6IGlzQXBwcm92ZWQoZHVwbGljYXRlKSxcclxuICAgICdsYXllci1yZWplY3RlZCc6IGlzUmVqZWN0ZWQoZHVwbGljYXRlKSxcclxuICAgICdpbWctYm9yZGVyIGJvcmRlciBib3JkZXItMSc6ICFpc0FwcHJvdmVkKGR1cGxpY2F0ZSkgJiYgIWlzUmVqZWN0ZWQoZHVwbGljYXRlKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDaGVja2JveCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hlY2tib3hFbmFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAqbmdJZj1cIiFpc0xvY2tlZEJ5UmV2aWV3ZXIoZHVwbGljYXRlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJyaWdodDogNXB4IDsgbWFyZ2luOiAxMHB4IDVweCA0cHggIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzRHVwbGljYXRlU2VsZWN0ZWQob3JpZ2luYWwudGVtcElkLCBkdXBsaWNhdGUudGVtcElkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkR1cGxpY2F0ZUNoZWNrYm94Q2hhbmdlKG9yaWdpbmFsLnRlbXBJZCwgZHVwbGljYXRlLnRlbXBJZCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSBmb3JtLWNoZWNrLWlucHV0IGR1cGxpY2F0ZS1jaGVja2JveFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIGFic29sdXRlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0xvY2tlZEJ5UmV2aWV3ZXIoZHVwbGljYXRlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0Q2hlY2tib3goJ2R1cGxpY2F0ZScsIGR1cGxpY2F0ZSlcIj5cclxuXHJcblxyXG4gICAgPHN2ZyAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMTlcIlxyXG4gICAgICAgIHZpZXdCb3g9XCIwIDAgMTkgMTlcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgIDxnIGZpbHRlcj1cInVybCgjZmlsdGVyMF9kXzIwMjNfMTM3MTgpXCI+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCIxLjExMTMzXCIgeT1cIjAuNTU1NjY0XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcclxuICAgICAgICAgICAgICAgIHJ4PVwiMlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCIxLjM4OTExXCIgeT1cIjAuODMzNDQyXCIgd2lkdGg9XCIxNS40NDQ0XCJcclxuICAgICAgICAgICAgICAgIGhlaWdodD1cIjE1LjQ0NDRcIiByeD1cIjEuNzIyMjJcIiBzdHJva2U9XCIjRDBENUREXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuNTU1NTU2XCIgLz5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk01Ljg3MTA5IDguNTU1NjZIMTIuMzUyNlwiIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMC45Mjc3NzhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L2c+XHJcbiAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgIDxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfMjAyM18xMzcxOFwiIHg9XCIwLjAwMDIxNzA4XCJcclxuICAgICAgICAgICAgICAgIHk9XCIwLjAwMDEwODU0XCIgd2lkdGg9XCIxOC4yMjIyXCIgaGVpZ2h0PVwiMTguMjIyMlwiXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcclxuICAgICAgICAgICAgICAgIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cclxuICAgICAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggaW49XCJTb3VyY2VBbHBoYVwiIHR5cGU9XCJtYXRyaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCJcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJoYXJkQWxwaGFcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGZlT2Zmc2V0IGR5PVwiMC41NTU1NTZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjAuNTU1NTU2XCIgLz5cclxuICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMC4wNjI3NDUxIDAgMCAwIDAgMC4wOTQxMTc2IDAgMCAwIDAgMC4xNTY4NjMgMCAwIDAgMC4wNSAwXCIgLz5cclxuICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd18yMDIzXzEzNzE4XCIgLz5cclxuICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbj1cIlNvdXJjZUdyYXBoaWNcIlxyXG4gICAgICAgICAgICAgICAgICAgIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd18yMDIzXzEzNzE4XCJcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJzaGFwZVwiIC8+XHJcbiAgICAgICAgICAgIDwvZmlsdGVyPlxyXG4gICAgICAgIDwvZGVmcz5cclxuICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gKGNoYW5nZSk9XCJvbkltYWdlQ2hlY2tib3hDaGFuZ2UoZHVwbGljYXRlLnRlbXBJZCwgJ2R1cGxpY2F0ZScsICdvcmlnaW5hbCcpXCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHVwbGljYXRlIEltYWdlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1hZ2VVcmwgKyBkdXBsaWNhdGUuZmlsZVBhdGhcIiBhbHQ9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5JbWFnZVByZXZpZXcobWFwcGluZyxvcmlnaW5hbC5kdXBsaWNhdGVJbWFnZSwgaSwgJ1RhZ2dlZCBEdXBsaWNhdGVzJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMCByb3VuZGVkIGJvcmRlciBkdXBsaWNhdGUtaW1hZ2UgY3Vyc29yLXBvaW50ZXJcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEdXBsaWNhdGUgSW5mbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBteS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy10aXRsZSBtcy0yIG15LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFuZ28gSUQ6IHt7IGR1cGxpY2F0ZS50ZW1wSWQgfX1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEFjdGlvbihkdXBsaWNhdGUsICdyZXZpZXcnKT8uYWN0aW9uID09PSAnYXBwcm92ZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtMlwiPjxzdmcgc3R5bGU9XCJ3aWR0aDogMjBweDtcclxuICAgICAgICBoZWlnaHQ6IDIwcHg7XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMTAgMTFcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHk9XCIwLjVcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiByeD1cIjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0QxRkFERlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMTIyMiAzLjU3OTE5TDQuMTM4ODcgNi40NTgzNkwzLjM0NzIgNS42MTI1M0MzLjIwMTM3IDUuNDc1MDMgMi45NzIyIDUuNDY2NjkgMi44MDU1MyA1LjU4MzM2QzIuNjQzMDMgNS43MDQxOSAyLjU5NzIgNS45MTY2OSAyLjY5NzIgNi4wODc1M0wzLjYzNDcgNy42MTI1M0MzLjcyNjM3IDcuNzU0MTkgMy44ODQ3IDcuODQxNjkgNC4wNjM4NyA3Ljg0MTY5QzQuMjM0NyA3Ljg0MTY5IDQuMzk3MiA3Ljc1NDE5IDQuNDg4ODcgNy42MTI1M0M0LjYzODg3IDcuNDE2NjkgNy41MDEzNyA0LjAwNDE5IDcuNTAxMzcgNC4wMDQxOUM3Ljg3NjM3IDMuNjIwODYgNy40MjIyIDMuMjgzMzYgNy4xMjIyIDMuNTc1MDNWMy41NzkxOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzEyQjc2QVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRBY3Rpb24oZHVwbGljYXRlLCAncmV2aWV3Jyk/LmFjdGlvbiA9PT0gJ3JlamVjdGVkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLTJcIj48c3ZnIHN0eWxlPVwid2lkdGg6IDIwcHg7XHJcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEzIDEzXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzE0MjhfNTk0ODQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTQuNTI5NjEgMS41SDguNjY5NjFMMTEuNTk5NiA0LjQzVjguNTdMOC42Njk2MSAxMS41SDQuNTI5NjFMMS41OTk2MSA4LjU3VjQuNDNMNC41Mjk2MSAxLjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkVFNEUyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wOTk2MSA1TDUuMDk5NjEgOE01LjA5OTYxIDVMOC4wOTk2MSA4TTQuNTI5NjEgMS41SDguNjY5NjFMMTEuNTk5NiA0LjQzVjguNTdMOC42Njk2MSAxMS41SDQuNTI5NjFMMS41OTk2MSA4LjU3VjQuNDNMNC41Mjk2MSAxLjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE0MjhfNTk0ODRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDAuNTk5NjA5IDAuNSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXZhbHVlIG1zLTJcIj5FbnRyeSBUaW1lOiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb3JtYXR0ZWRFbnRyeVRpbWUoZHVwbGljYXRlLmVudHJ5VGltZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRBY3Rpb24oZHVwbGljYXRlLCAnYXBwcm92ZScpPy5hY3Rpb24gPT09ICdhcHByb3ZlZCdcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMzdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMzdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHJ4PVwiMTJcIiBmaWxsPVwiI0QxRkFERlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzQ4Nl85NDA1MSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkuNSAxN0g4QzcuNzM0NzggMTcgNy40ODA0MyAxNi44OTQ2IDcuMjkyODkgMTYuNzA3MUM3LjEwNTM2IDE2LjUxOTYgNyAxNi4yNjUyIDcgMTZWMTIuNUM3IDEyLjIzNDggNy4xMDUzNiAxMS45ODA0IDcuMjkyODkgMTEuNzkyOUM3LjQ4MDQzIDExLjYwNTQgNy43MzQ3OCAxMS41IDggMTEuNUg5LjVNMTMgMTAuNVY4LjVDMTMgOC4xMDIxOCAxMi44NDIgNy43MjA2NCAxMi41NjA3IDcuNDM5MzRDMTIuMjc5NCA3LjE1ODA0IDExLjg5NzggNyAxMS41IDdMOS41IDExLjVWMTdIMTUuMTRDMTUuMzgxMiAxNy4wMDI3IDE1LjYxNTIgMTYuOTE4MiAxNS43OTkgMTYuNzYyQzE1Ljk4MjcgMTYuNjA1OCAxNi4xMDM4IDE2LjM4ODUgMTYuMTQgMTYuMTVMMTYuODMgMTEuNjVDMTYuODUxOCAxMS41MDY3IDE2Ljg0MjEgMTEuMzYwMyAxNi44MDE3IDExLjIyMTFDMTYuNzYxMyAxMS4wODE5IDE2LjY5MTEgMTAuOTUzMSAxNi41OTU5IDEwLjg0MzhDMTYuNTAwOCAxMC43MzQ0IDE2LjM4MyAxMC42NDcgMTYuMjUwOCAxMC41ODc2QzE2LjExODUgMTAuNTI4MyAxNS45NzUgMTAuNDk4NCAxNS44MyAxMC41SDEzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMzk4NTVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDg2Xzk0MDUxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNiA2KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEFjdGlvbihkdXBsaWNhdGUsICdhcHByb3ZlJyk/LmFjdGlvbiA9PT0gJ3JlamVjdGVkJ1wiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjM3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjM3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiByeD1cIjEyXCIgZmlsbD1cIiNGRUU0RTJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80ODZfOTQwOTApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNC41MDE1IDcuMDAwMDZIMTUuODM2NUMxNi4xMTk1IDYuOTk1MDUgMTYuMzk0NCA3LjA5NDEzIDE2LjYwOTIgNy4yNzg0N0MxNi44MjM5IDcuNDYyODEgMTYuOTYzNSA3LjcxOTU5IDE3LjAwMTUgOC4wMDAwNlYxMS41MDAxQzE2Ljk2MzUgMTEuNzgwNSAxNi44MjM5IDEyLjAzNzMgMTYuNjA5MiAxMi4yMjE2QzE2LjM5NDQgMTIuNDA2IDE2LjExOTUgMTIuNTA1MSAxNS44MzY1IDEyLjUwMDFIMTQuNTAxNU0xMS4wMDE1IDEzLjUwMDFWMTUuNTAwMUMxMS4wMDE1IDE1Ljg5NzkgMTEuMTU5NSAxNi4yNzk0IDExLjQ0MDggMTYuNTYwN0MxMS43MjIxIDE2Ljg0MiAxMi4xMDM3IDE3LjAwMDEgMTIuNTAxNSAxNy4wMDAxTDE0LjUwMTUgMTIuNTAwMVY3LjAwMDA2SDguODYxNDhDOC42MjAzMiA2Ljk5NzMzIDguMzg2MjkgNy4wODE4NiA4LjIwMjUzIDcuMjM4MDZDOC4wMTg3NiA3LjM5NDI2IDcuODk3NjQgNy42MTE2MSA3Ljg2MTQ4IDcuODUwMDZMNy4xNzE0OCAxMi4zNTAxQzcuMTQ5NzMgMTIuNDkzNCA3LjE1OTM5IDEyLjYzOTcgNy4xOTk4MSAxMi43Nzg5QzcuMjQwMjMgMTIuOTE4MSA3LjMxMDQzIDEzLjA0NjkgNy40MDU1NSAxMy4xNTYzQzcuNTAwNjcgMTMuMjY1NyA3LjYxODQ0IDEzLjM1MzEgNy43NTA2OSAxMy40MTI0QzcuODgyOTUgMTMuNDcxOCA4LjAyNjUzIDEzLjUwMTcgOC4xNzE0OCAxMy41MDAxSDExLjAwMTVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0Q5MkQyMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF80ODZfOTQwOTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSg2IDYpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIER1cGxpY2F0ZSBSZWFzb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImR1cGxpY2F0ZS1yZWFzb24gbXMtMiBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj57eyBkdXBsaWNhdGUucmVhc29uIH19PC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIHB5LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50cy1hY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjY29yZGlvbiBIZWFkZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlQ29tbWVudHNBY2NvcmRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tbWVudHMtY291bnRcIj57eyBjb21tZW50cz8ubGVuZ3RoIH19IENvbW1lbnRzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1hcnJvdyBtcy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBbY2xhc3Mucm90YXRlZF09XCJjb21tZW50c0FjY29yZGlvbk9wZW5cIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBY2NvcmRpb24gQm9keSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1ib2R5XCIgKm5nSWY9XCJjb21tZW50c0FjY29yZGlvbk9wZW5cIj5cclxuICAgICAgICBcclxuICAgICAgICAgIDwhLS0gTG9vcCBlYWNoIGJsb2NrOiB0YWdnaW5nIC8gcmV2aWV3IC8gYXBwcm92ZSAtLT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJsb2NrIG9mIGFjdGl2aXR5RGF0YVwiPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICA8IS0tIExvb3AgaW5zaWRlIGNvbW1lbnRzIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjIG9mIGJsb2NrLmNvbW1lbnRzXCIgY2xhc3M9XCJjb21tZW50LXRocmVhZCBkLWZsZXggbWItNFwiPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgIDwhLS0gYXZhdGFyIC0tPlxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyIGF2YXRhci10ZXh0IGxpZ2h0LXByaW1hcnkgcC0zXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAge3sgZ2V0SW5pdGlhbHNGcm9tRW1haWwoYy5jcmVhdGVkQnlFbWFpbCkgfX1cclxuICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8IS0tIGVtYWlsIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGMuY3JlYXRlZEJ5RW1haWwgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCIgKm5nSWY9XCJjLmNyZWF0ZWRBdFwiPlxyXG4gICAgICAgICAgICB7eyBjLmNyZWF0ZWRBdCB8IGRhdGU6J2hoOm1tOnNzIGEgLSBkZCBNTU0geXl5eScgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgXHJcbiAgICAgICAgICAgICAgICA8IS0tIG1lc3NhZ2UgdGV4dCAtLT5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMiBtdC0yXCIgKm5nSWY9XCJjLm1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAge3sgYy5tZXNzYWdlIH19XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8IS0tIFJldmlldyAvIEFwcHJvdmUgb25seSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJibG9jay50eXBlID09PSAncmV2aWV3JyB8fCBibG9jay50eXBlID09PSAnYXBwcm92ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUYWdnZWQgaW1hZ2VzIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGltZyBvZiBjLnRhZ2dlZEltYWdlczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNob3cgb25seSBmaXJzdCA0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgPCAzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhbmdvLWltYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kSW1hZ2VdPVwiJ3VybCgnKyBpbWFnZVVybCArIGltZy5maWxlUGF0aCArICcpJ1wiPjwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1tZXRhIHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYW5nbyBJRDoge3sgaW1nLnRlbXBJZCB9fVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHN0YXR1cyBkb3RzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImMuc3RhdHVzID09PSAnYXBwcm92ZWQnXCI+PHN2ZyBzdHlsZT1cIndpZHRoOiAyMHB4O1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAyMHB4O1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDEwIDExXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHk9XCIwLjVcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiByeD1cIjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMTIyMiAzLjU3OTE5TDQuMTM4ODcgNi40NTgzNkwzLjM0NzIgNS42MTI1M0MzLjIwMTM3IDUuNDc1MDMgMi45NzIyIDUuNDY2NjkgMi44MDU1MyA1LjU4MzM2QzIuNjQzMDMgNS43MDQxOSAyLjU5NzIgNS45MTY2OSAyLjY5NzIgNi4wODc1M0wzLjYzNDcgNy42MTI1M0MzLjcyNjM3IDcuNzU0MTkgMy44ODQ3IDcuODQxNjkgNC4wNjM4NyA3Ljg0MTY5QzQuMjM0NyA3Ljg0MTY5IDQuMzk3MiA3Ljc1NDE5IDQuNDg4ODcgNy42MTI1M0M0LjYzODg3IDcuNDE2NjkgNy41MDEzNyA0LjAwNDE5IDcuNTAxMzcgNC4wMDQxOUM3Ljg3NjM3IDMuNjIwODYgNy40MjIyIDMuMjgzMzYgNy4xMjIyIDMuNTc1MDNWMy41NzkxOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMTJCNzZBXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImMuc3RhdHVzID09PSAncmVqZWN0ZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjxzdmcgc3R5bGU9XCJ3aWR0aDogMjBweDtcclxuICAgICAgICAgICAgICAgIGhlaWdodDogMjBweDtcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzE0MjhfNTk0ODQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00LjUyOTYxIDEuNUg4LjY2OTYxTDExLjU5OTYgNC40M1Y4LjU3TDguNjY5NjEgMTEuNUg0LjUyOTYxTDEuNTk5NjEgOC41N1Y0LjQzTDQuNTI5NjEgMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkVFNEUyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDk5NjEgNUw1LjA5OTYxIDhNNS4wOTk2MSA1TDguMDk5NjEgOE00LjUyOTYxIDEuNUg4LjY2OTYxTDExLjU5OTYgNC40M1Y4LjU3TDguNjY5NjEgMTEuNUg0LjUyOTYxTDEuNTk5NjEgOC41N1Y0LjQzTDQuNTI5NjEgMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTQyOF81OTQ4NFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDAuNTk5NjA5IDAuNSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnkgdGltZToge3sgaW1nLmVudHJ5VGltZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSArTiBtb3JlIC0tPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwidGFuZ28tY2FyZCBtb3JlLWNhcmQgdGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgKm5nSWY9XCJjLnRhZ2dlZEltYWdlcy5sZW5ndGggPiAzXCJcclxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kSW1hZ2VdPVwiJ3VybCgnICsgaW1hZ2VVcmwgKyBjLnRhZ2dlZEltYWdlc1szXS5maWxlUGF0aCArICcpJ1wiXHJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkltYWdlc1BvcHVwKGMpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9yZS1vdmVybGF5XCI+PC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICA8IS0tIHZlcnRpY2FsIGNvbnRhaW5lciAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb3JlLXdyYXBwZXIgbXktMTAgZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb3JlLXRleHQgZnctc2VtaWJvbGRcIj4re3sgYy50YWdnZWRJbWFnZXMubGVuZ3RoIC0gMyB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1wcmltYXJ5IHRleHQtZGFyayB0ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5lIHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgVmlldyBhbGxcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBTdGF0dXMgSWNvbnMgLS0+XHJcblxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuPHNlY3Rpb24gKm5nSWY9XCJ0eXBlICE9PSdkdXBsaWNhdGUnXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGF5ZXJzIG15LTJcIiAqbmdJZj1cImhhc1Jldm9wc1R5cGUodHlwZSlcIj5cclxuICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBtaW4taC0yNXB4IHB0LTNcIj5cclxuICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHVwbGljYXRlLWhlYWQgdGV4dC1sZyBteS0zXCI+PHNwYW4gY2xhc3M9XCJtZS0yXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy41MTk5NSAwLjYxMzA2NUM4LjMzNzM5IC0wLjIwNDM1NSA5LjY2MjY3IC0wLjIwNDM1NSAxMC40ODAxIDAuNjEzMDY1TDE3LjM4NyA3LjUxOTk1QzE4LjIwNDMgOC4zMzczOSAxOC4yMDQzIDkuNjYyNjcgMTcuMzg3IDEwLjQ4MDFMMTAuNDgwMSAxNy4zODdDOS42NjI2NyAxOC4yMDQzIDguMzM3MzkgMTguMjA0MyA3LjUxOTk1IDE3LjM4N0w1LjU0NjI2IDE1LjQxMzNMMy43MzcwOCAxNy4yMjI0QzIuOTE5NjYgMTguMDM5OSAxLjU5NDM2IDE4LjAzOTkgMC43NzY5NDQgMTcuMjIyNEMtMC4wNDA0NzY3IDE2LjQwNTEgLTAuMDQwNDc2NyAxNS4wNzk3IDAuNzc2OTQ0IDE0LjI2MjRMMi41ODYxMiAxMi40NTMxTDAuNjEzMDY1IDEwLjQ4MDFDLTAuMjA0MzU1IDkuNjYyNjcgLTAuMjA0MzU1IDguMzM3MzkgMC42MTMwNjUgNy41MTk5NUw3LjUxOTk1IDAuNjEzMDY1Wk05LjQ5MzM2IDEuNTk5NzhDOS4yMjA4OCAxLjMyNzMxIDguNzc5MDkgMS4zMjczMSA4LjUwNjYxIDEuNTk5NzhMMy41NzI4NiA2LjUzMzU3TDExLjQ2NjUgMTQuNDI3MkwxNi40MDAyIDkuNDkzMzZDMTYuNjcyNyA5LjIyMDg4IDE2LjY3MjcgOC43NzkwOSAxNi40MDAyIDguNTA2N0wxMi45NDY1IDUuMDUyODZMMTEuNzk1MiA2LjIwNDAzQzExLjUyMjggNi40NzY1IDExLjA4MTEgNi40NzY1IDEwLjgwODYgNi4yMDQwM0MxMC41MzYxIDUuOTMxNTUgMTAuNTM2MSA1LjQ4OTc4IDEwLjgwODYgNS4yMTczMUwxMS45NTk3IDQuMDY2MTRMMTAuOTczMiAzLjA3OTY0TDguMTc3NTcgNS44NzUzM0M3LjkwNTA5IDYuMTQ3OCA3LjQ2MzI5IDYuMTQ3OCA3LjE5MDgxIDUuODc1MzNDNi45MTgzMyA1LjYwMjg2IDYuOTE4MzMgNS4xNjEwOSA3LjE5MDgxIDQuODg4NjJMOS45ODY1IDIuMDkyOTNMOS40OTMzNiAxLjU5OTc4Wk0xMC40Nzk3IDE1LjQxMzlMMi41ODYxNSA3LjUyMDI4TDEuNTk5NzggOC41MDY3QzEuMzI3MyA4Ljc3OTA5IDEuMzI3MyA5LjIyMDg4IDEuNTk5NzggOS40OTMzNkw4LjUwNjYxIDE2LjQwMDJDOC43NzkwOSAxNi42NzI3IDkuMjIwODggMTYuNjcyNyA5LjQ5MzM2IDE2LjQwMDJMMTAuNDc5NyAxNS40MTM5Wk0zLjU3Mjc1IDEzLjQzOTlMMS43NjM2NiAxNS4yNDlDMS40OTExOSAxNS41MjE1IDEuNDkxMTkgMTUuOTYzMyAxLjc2MzY2IDE2LjIzNThDMi4wMzYxMyAxNi41MDgyIDIuNDc3OSAxNi41MDgyIDIuNzUwMzcgMTYuMjM1OEw0LjU1OTQ2IDE0LjQyNjZMMy41NzI3NSAxMy40Mzk5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCIgLz5cclxuICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj4ge3t0eXBlfX1cclxuXHJcbiAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICA8L2Rpdj5cclxuICAgICAgIDxkaXYgKm5nSWY9XCJpc0NoZWNrYm94RW5hYmxlXCIgY2xhc3M9XCJtcy0zIG15LTNcIj5cclxuICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RBbGxCeVR5cGVbdHlwZV1cIlxyXG4gICAgKGNoYW5nZSk9XCJvblNlbGVjdEFsbCh0eXBlLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgPGxhYmVsPlNlbGVjdCBBbGw8L2xhYmVsPlxyXG4gICAgICAgPC9kaXY+XHJcbiAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBtYXBwaW5nIG9mIHNvdXJjZT8ubWFwcGluZ0luZm9cIj5cclxuICAgICAgICAgICA8IS0tIEJvZHkgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibWFwcGluZz8udHlwZSA9PT12aWV3TW9kZVwiIGNsYXNzPVwiY2FyZC1ib2R5IGJnLXdoaXRlIGxheWVycyBwLTUgbS0zXCI+XHJcblxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcmlnaW5hbCBvZiBtYXBwaW5nPy5yZXZpc2VkRGV0YWlsO2xldCBpPWluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm9yaWdpbmFsPy5yZXZvcHNUeXBlID09PXR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1tZC0zIG1iLTMgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBiLTMgaC0xMDAgcm91bmRlZC0zIHBvc2l0aW9uLXJlbGF0aXZlXCIgW25nQ2xhc3NdPVwie1xyXG4nbGF5ZXItYXBwcm92ZWQnOiBpc0FwcHJvdmVkKG9yaWdpbmFsKSxcclxuJ2xheWVyLXJlamVjdGVkJzogaXNSZWplY3RlZChvcmlnaW5hbCksXHJcbidpbWctYm9yZGVyIGJvcmRlciBib3JkZXItMSc6ICFpc0FwcHJvdmVkKG9yaWdpbmFsKSAmJiAhaXNSZWplY3RlZChvcmlnaW5hbCl9XCI+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVG9wLXJpZ2h0IENoZWNrYm94IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hlY2tib3hFbmFibGVcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiIWlzTG9ja2VkQnlSZXZpZXdlcihvcmlnaW5hbClcIiB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIGFic29sdXRlIGZvcm0tY2hlY2staW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiKHNlbGVjdGVkQnlUeXBlW3R5cGVdIHx8IFtdKS5pbmNsdWRlcyhvcmlnaW5hbD8udGVtcElkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25JbWFnZUNoZWNrYm94Q2hhbmdlKHR5cGUsIG9yaWdpbmFsLnRlbXBJZClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgYWJzb2x1dGVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0xvY2tlZEJ5UmV2aWV3ZXIob3JpZ2luYWwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0Q2hlY2tib3godHlwZSwgb3JpZ2luYWwpXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMTlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxOSAxOVwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF8yMDIzXzEzNzE4KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxLjExMTMzXCIgeT1cIjAuNTU1NjY0XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgcng9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMS4zODkxMVwiIHk9XCIwLjgzMzQ0MlwiIHdpZHRoPVwiMTUuNDQ0NFwiIGhlaWdodD1cIjE1LjQ0NDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeD1cIjEuNzIyMjJcIiBzdHJva2U9XCIjRDBENUREXCIgc3Ryb2tlLXdpZHRoPVwiMC41NTU1NTZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS44NzEwOSA4LjU1NTY2SDEyLjM1MjZcIiBzdHJva2U9XCIjMzQ0MDU0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMC45Mjc3NzhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBpZD1cImZpbHRlcjBfZF8yMDIzXzEzNzE4XCIgeD1cIjAuMDAwMjE3MDhcIiB5PVwiMC4wMDAxMDg1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTguMjIyMlwiIGhlaWdodD1cIjE4LjIyMjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPVwic1JHQlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiIHJlc3VsdD1cIkJhY2tncm91bmRJbWFnZUZpeFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1cIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImhhcmRBbHBoYVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjAuNTU1NTU2XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cIjAuNTU1NTU2XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT1cIm1hdHJpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9XCJub3JtYWxcIiBpbjI9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiZWZmZWN0MV9kcm9wU2hhZG93XzIwMjNfMTM3MThcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMj1cImVmZmVjdDFfZHJvcFNoYWRvd18yMDIzXzEzNzE4XCIgcmVzdWx0PVwic2hhcGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlVXJsICsgb3JpZ2luYWw/LmZpbGVQYXRoXCIgYWx0PVwiXCIgKGNsaWNrKT1cIm9wZW5JbWFnZVByZXZpZXcobWFwcGluZyxvcmlnaW5hbCwgaSwgc2VsZWN0ZWRCeVR5cGVbdHlwZV0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwIHJvdW5kZWQgYm9yZGVyIGN1cnNvci1wb2ludGVyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy10aXRsZSBtcy0yIG15LTJcIj5UYW5nbyBJRDoge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLnRlbXBJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2V0QWN0aW9uKG9yaWdpbmFsLCAncmV2aWV3Jyk/LmFjdGlvbiA9PT0gJ2FwcHJvdmVkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0yXCI+PHN2ZyBzdHlsZT1cIndpZHRoOiAyMHB4O1xyXG5oZWlnaHQ6IDIwcHg7XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMTAgMTFcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB5PVwiMC41XCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgcng9XCI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjEyMjIgMy41NzkxOUw0LjEzODg3IDYuNDU4MzZMMy4zNDcyIDUuNjEyNTNDMy4yMDEzNyA1LjQ3NTAzIDIuOTcyMiA1LjQ2NjY5IDIuODA1NTMgNS41ODMzNkMyLjY0MzAzIDUuNzA0MTkgMi41OTcyIDUuOTE2NjkgMi42OTcyIDYuMDg3NTNMMy42MzQ3IDcuNjEyNTNDMy43MjYzNyA3Ljc1NDE5IDMuODg0NyA3Ljg0MTY5IDQuMDYzODcgNy44NDE2OUM0LjIzNDcgNy44NDE2OSA0LjM5NzIgNy43NTQxOSA0LjQ4ODg3IDcuNjEyNTNDNC42Mzg4NyA3LjQxNjY5IDcuNTAxMzcgNC4wMDQxOSA3LjUwMTM3IDQuMDA0MTlDNy44NzYzNyAzLjYyMDg2IDcuNDIyMiAzLjI4MzM2IDcuMTIyMiAzLjU3NTAzVjMuNTc5MTlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMTJCNzZBXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2V0QWN0aW9uKG9yaWdpbmFsLCAncmV2aWV3Jyk/LmFjdGlvbiA9PT0gJ3JlamVjdGVkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0yXCI+PHN2ZyBzdHlsZT1cIndpZHRoOiAyMHB4O1xyXG5oZWlnaHQ6IDIwcHg7XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTMgMTNcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzE0MjhfNTk0ODQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNC41Mjk2MSAxLjVIOC42Njk2MUwxMS41OTk2IDQuNDNWOC41N0w4LjY2OTYxIDExLjVINC41Mjk2MUwxLjU5OTYxIDguNTdWNC40M0w0LjUyOTYxIDEuNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkVFNEUyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjA5OTYxIDVMNS4wOTk2MSA4TTUuMDk5NjEgNUw4LjA5OTYxIDhNNC41Mjk2MSAxLjVIOC42Njk2MUwxMS41OTk2IDQuNDNWOC41N0w4LjY2OTYxIDExLjVINC41Mjk2MUwxLjU5OTYxIDguNTdWNC40M0w0LjUyOTYxIDEuNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNDI4XzU5NDg0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDAuNTk5NjA5IDAuNSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXZhbHVlIG1zLTJcIj5FbnRyeSBUaW1lOiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9ybWF0dGVkRW50cnlUaW1lKG9yaWdpbmFsPy5lbnRyeVRpbWUpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIG1zLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnZXRBY3Rpb24ob3JpZ2luYWwsICdhcHByb3ZlJyk/LmFjdGlvbiA9PT0gJ2FwcHJvdmVkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIzN1wiIGhlaWdodD1cIjM3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiByeD1cIjEyXCIgZmlsbD1cIiNEMUZBREZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDg2Xzk0MDUxKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05LjUgMTdIOEM3LjczNDc4IDE3IDcuNDgwNDMgMTYuODk0NiA3LjI5Mjg5IDE2LjcwNzFDNy4xMDUzNiAxNi41MTk2IDcgMTYuMjY1MiA3IDE2VjEyLjVDNyAxMi4yMzQ4IDcuMTA1MzYgMTEuOTgwNCA3LjI5Mjg5IDExLjc5MjlDNy40ODA0MyAxMS42MDU0IDcuNzM0NzggMTEuNSA4IDExLjVIOS41TTEzIDEwLjVWOC41QzEzIDguMTAyMTggMTIuODQyIDcuNzIwNjQgMTIuNTYwNyA3LjQzOTM0QzEyLjI3OTQgNy4xNTgwNCAxMS44OTc4IDcgMTEuNSA3TDkuNSAxMS41VjE3SDE1LjE0QzE1LjM4MTIgMTcuMDAyNyAxNS42MTUyIDE2LjkxODIgMTUuNzk5IDE2Ljc2MkMxNS45ODI3IDE2LjYwNTggMTYuMTAzOCAxNi4zODg1IDE2LjE0IDE2LjE1TDE2LjgzIDExLjY1QzE2Ljg1MTggMTEuNTA2NyAxNi44NDIxIDExLjM2MDMgMTYuODAxNyAxMS4yMjExQzE2Ljc2MTMgMTEuMDgxOSAxNi42OTExIDEwLjk1MzEgMTYuNTk1OSAxMC44NDM4QzE2LjUwMDggMTAuNzM0NCAxNi4zODMgMTAuNjQ3IDE2LjI1MDggMTAuNTg3NkMxNi4xMTg1IDEwLjUyODMgMTUuOTc1IDEwLjQ5ODQgMTUuODMgMTAuNUgxM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAzOTg1NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDg2Xzk0MDUxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSg2IDYpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdldEFjdGlvbihvcmlnaW5hbCwgJ2FwcHJvdmUnKT8uYWN0aW9uID09PSAncmVqZWN0ZWQnXCI+PHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjM3XCIgaGVpZ2h0PVwiMzdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHJ4PVwiMTJcIiBmaWxsPVwiI0ZFRTRFMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80ODZfOTQwOTApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0LjUwMTUgNy4wMDAwNkgxNS44MzY1QzE2LjExOTUgNi45OTUwNSAxNi4zOTQ0IDcuMDk0MTMgMTYuNjA5MiA3LjI3ODQ3QzE2LjgyMzkgNy40NjI4MSAxNi45NjM1IDcuNzE5NTkgMTcuMDAxNSA4LjAwMDA2VjExLjUwMDFDMTYuOTYzNSAxMS43ODA1IDE2LjgyMzkgMTIuMDM3MyAxNi42MDkyIDEyLjIyMTZDMTYuMzk0NCAxMi40MDYgMTYuMTE5NSAxMi41MDUxIDE1LjgzNjUgMTIuNTAwMUgxNC41MDE1TTExLjAwMTUgMTMuNTAwMVYxNS41MDAxQzExLjAwMTUgMTUuODk3OSAxMS4xNTk1IDE2LjI3OTQgMTEuNDQwOCAxNi41NjA3QzExLjcyMjEgMTYuODQyIDEyLjEwMzcgMTcuMDAwMSAxMi41MDE1IDE3LjAwMDFMMTQuNTAxNSAxMi41MDAxVjcuMDAwMDZIOC44NjE0OEM4LjYyMDMyIDYuOTk3MzMgOC4zODYyOSA3LjA4MTg2IDguMjAyNTMgNy4yMzgwNkM4LjAxODc2IDcuMzk0MjYgNy44OTc2NCA3LjYxMTYxIDcuODYxNDggNy44NTAwNkw3LjE3MTQ4IDEyLjM1MDFDNy4xNDk3MyAxMi40OTM0IDcuMTU5MzkgMTIuNjM5NyA3LjE5OTgxIDEyLjc3ODlDNy4yNDAyMyAxMi45MTgxIDcuMzEwNDMgMTMuMDQ2OSA3LjQwNTU1IDEzLjE1NjNDNy41MDA2NyAxMy4yNjU3IDcuNjE4NDQgMTMuMzUzMSA3Ljc1MDY5IDEzLjQxMjRDNy44ODI5NSAxMy40NzE4IDguMDI2NTMgMTMuNTAxNyA4LjE3MTQ4IDEzLjUwMDFIMTEuMDAxNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0Q5MkQyMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDg2Xzk0MDkwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSg2IDYpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBweS01XCI+XHJcbiAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnRzLWFjY29yZGlvblwiPlxyXG4gICAgICAgICAgICAgICA8IS0tIEFjY29yZGlvbiBIZWFkZXIgLS0+XHJcbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZUNvbW1lbnRzQWNjb3JkaW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50cy10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbW1lbnRzLWNvdW50XCI+e3sgY29tbWVudHM/Lmxlbmd0aCB9fSBDb21tZW50czwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1hcnJvdyBtcy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW2NsYXNzLnJvdGF0ZWRdPVwiY29tbWVudHNBY2NvcmRpb25PcGVuXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgIDwhLS0gQWNjb3JkaW9uIENvbnRlbnQgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1ib2R5XCIgKm5nSWY9XCJjb21tZW50c0FjY29yZGlvbk9wZW5cIj5cclxuXHJcbjwhLS0gbG9vcCBlYWNoIGJsb2NrOiB0YWdnaW5nIC8gcmV2aWV3IC8gYXBwcm92ZSAtLT5cclxuPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYmxvY2sgb2YgYWN0aXZpdHlEYXRhMVwiPlxyXG5cclxuPCEtLSBUQUdHSU5HIENPTU1FTlRTIChlYWNoIGNvbW1lbnQgPSBvbmUgaW1hZ2UgKyBtZXNzYWdlKSAtLT5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImJsb2NrLnR5cGUgPT09ICd0YWdnaW5nJ1wiPlxyXG48ZGl2ICpuZ0Zvcj1cImxldCBjIG9mIGJsb2NrLmNvbW1lbnRzXCIgY2xhc3M9XCJjb21tZW50LXRocmVhZCBkLWZsZXggbWItNFwiPlxyXG5cclxuPCEtLSBhdmF0YXIgLS0+XHJcbjxkaXYgY2xhc3M9XCJhdmF0YXIgYXZhdGFyLXRleHQgbGlnaHQtcHJpbWFyeSBwLTNcIj5cclxuXHJcbiAgICAgICAgICB7eyBnZXRJbml0aWFsc0Zyb21FbWFpbChjLmNyZWF0ZWRCeUVtYWlsKSB9fVxyXG4gICAgICA8L2Rpdj5cclxuXHJcbjwhLS0gY29udGVudCAtLT5cclxuPGRpdj5cclxuIDxkaXYgY2xhc3M9XCJmdy1zZW1pYm9sZFwiPlxyXG4gICB7eyBjLmNyZWF0ZWRCeUVtYWlsIH19XHJcbiA8L2Rpdj5cclxuXHJcbiA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiICpuZ0lmPVwiYy5jcmVhdGVkQXRcIj5cclxuICAge3sgYy5jcmVhdGVkQXQgfCBkYXRlOidoaDptbTpzcyBhIC0gZGQgTU1NIHl5eXknIH19XHJcbiA8L2Rpdj5cclxuXHJcbiA8cCBjbGFzcz1cIm1iLTIgbXQtMlwiICpuZ0lmPVwiYy5tZXNzYWdlXCI+XHJcbiAgIHt7IGMubWVzc2FnZSB9fVxyXG4gPC9wPlxyXG5cclxuIDwhLS0gc2luZ2xlIGltYWdlIGNhcmQgLS0+XHJcbiA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICA8ZGl2IGNsYXNzPVwidGFuZ28tY2FyZFwiICpuZ0lmPVwiYy5maWxlUGF0aFwiPlxyXG4gICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1pbWFnZVwiXHJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZEltYWdlXT1cIid1cmwoJyArIGltYWdlVXJsICsgYy5maWxlUGF0aCArICcpJ1wiPlxyXG4gICAgIDwvZGl2PlxyXG5cclxuICAgICA8ZGl2IGNsYXNzPVwidGFuZ28tbWV0YSBzbWFsbFwiPlxyXG4gICAgICAgPGRpdj5UYW5nbyBJRDoge3sgYy50ZW1wSWQgfX08L2Rpdj5cclxuICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+RW50cnkgdGltZToge3sgYy5lbnRyeVRpbWUgfX08L2Rpdj5cclxuICAgICA8L2Rpdj5cclxuICAgPC9kaXY+XHJcbiA8L2Rpdj5cclxuPC9kaXY+XHJcbjwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjwhLS0gUkVWSUVXIC8gQVBQUk9WRSBDT01NRU5UUyAod2l0aCB0YWdnZWRJbWFnZXMgKyArTiBWaWV3IGFsbCkgLS0+XHJcbjxuZy1jb250YWluZXIgKm5nSWY9XCJibG9jay50eXBlID09PSAncmV2aWV3JyB8fCBibG9jay50eXBlID09PSAnYXBwcm92ZSdcIj5cclxuPGRpdiAqbmdGb3I9XCJsZXQgYyBvZiBibG9jay5jb21tZW50c1wiIGNsYXNzPVwiY29tbWVudC10aHJlYWQgZC1mbGV4IG1iLTRcIj5cclxuXHJcbjwhLS0gYXZhdGFyIC0tPlxyXG48ZGl2IGNsYXNzPVwiYXZhdGFyIGF2YXRhci10ZXh0IGxpZ2h0LXByaW1hcnkgcC0zXCI+XHJcblxyXG4gICAgICAgICAge3sgZ2V0SW5pdGlhbHNGcm9tRW1haWwoYy5jcmVhdGVkQnlFbWFpbCkgfX1cclxuICAgICAgPC9kaXY+XHJcblxyXG48IS0tIGNvbnRlbnQgLS0+XHJcbjxkaXYgY2xhc3M9XCJ3LTEwMFwiPlxyXG4gPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+XHJcbiAgIHt7IGMuY3JlYXRlZEJ5RW1haWwgfX1cclxuIDwvZGl2PlxyXG5cclxuIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCIgKm5nSWY9XCJjLmNyZWF0ZWRBdFwiPlxyXG4gICB7eyBjLmNyZWF0ZWRBdCB8IGRhdGU6J2hoOm1tOnNzIGEgLSBkZCBNTU0geXl5eScgfX1cclxuIDwvZGl2PlxyXG5cclxuIDwhLS0gbWFpbiByZXZpZXcvYXBwcm92ZSBtZXNzYWdlIC0tPlxyXG4gPHAgY2xhc3M9XCJtYi0yIG10LTJcIiAqbmdJZj1cImMubWVzc2FnZVwiPlxyXG4gICB7eyBjLm1lc3NhZ2UgfX1cclxuIDwvcD5cclxuXHJcbiBcclxuXHJcbiA8IS0tIGltYWdlIGxpc3QgKyArTiBWaWV3IGFsbCAtLT5cclxuIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTIgZmxleC13cmFwXCIgKm5nSWY9XCJjLnRhZ2dlZEltYWdlcz8ubGVuZ3RoXCI+XHJcblxyXG4gICA8IS0tIGZpcnN0IDMgaW1hZ2VzIC0tPlxyXG4gICA8ZGl2ICpuZ0Zvcj1cImxldCBpbWcgb2YgYy50YWdnZWRJbWFnZXM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaSA8IDNcIj5cclxuICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1jYXJkXCI+XHJcbiAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1pbWFnZVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRJbWFnZV09XCIndXJsKCcgKyBpbWFnZVVybCArIGltZy5maWxlUGF0aCArICcpJ1wiPlxyXG4gICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1tZXRhIHNtYWxsXCI+XHJcbiAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgIFRhbmdvIElEOiB7eyBpbWcudGVtcElkIH19XHJcbiAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImMuc3RhdHVzID09PSAnYXBwcm92ZWQnXCJcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtYXBwcm92ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYy5zdGF0dXMgPT09ICdyZWplY3RlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdGF0dXMtZG90IHN0YXR1cy1yZWplY3RcIj48L3NwYW4+XHJcbiAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgIEVudHJ5IHRpbWU6IHt7IGltZy5lbnRyeVRpbWUgfX1cclxuICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgPC9kaXY+XHJcbiAgICAgICA8L2Rpdj5cclxuICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgPC9kaXY+XHJcblxyXG4gICA8IS0tICtOIFZpZXcgYWxsIGNhcmQgLS0+XHJcbiAgIDxkaXZcclxuICAgICBjbGFzcz1cInRhbmdvLWNhcmQgbW9yZS1jYXJkIHRleHQtY2VudGVyXCJcclxuICAgICAqbmdJZj1cImMudGFnZ2VkSW1hZ2VzLmxlbmd0aCA+IDNcIlxyXG4gICAgIFtzdHlsZS5iYWNrZ3JvdW5kSW1hZ2VdPVwiJ3VybCgnICsgaW1hZ2VVcmwgKyBjLnRhZ2dlZEltYWdlc1szXS5maWxlUGF0aCArICcpJ1wiXHJcbiAgICAgKGNsaWNrKT1cIm9wZW5JbWFnZXNQb3B1cChjKVwiXHJcbiAgID5cclxuICAgICA8ZGl2IGNsYXNzPVwibW9yZS1vdmVybGF5XCI+PC9kaXY+XHJcblxyXG4gICAgIDxkaXYgY2xhc3M9XCJtb3JlLXdyYXBwZXIgZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICA8ZGl2IGNsYXNzPVwibW9yZS10ZXh0IGZ3LXNlbWlib2xkXCI+XHJcbiAgICAgICAgICt7eyBjLnRhZ2dlZEltYWdlcy5sZW5ndGggLSAzIH19XHJcbiAgICAgICA8L2Rpdj5cclxuICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXByaW1hcnkgdGV4dC1kZWNvcmF0aW9uLXVuZGVybGluZSBzbWFsbFwiPlxyXG4gICAgICAgICBWaWV3IGFsbFxyXG4gICAgICAgPC9kaXY+XHJcbiAgICAgPC9kaXY+XHJcbiAgIDwvZGl2PlxyXG5cclxuIDwvZGl2PlxyXG48L2Rpdj5cclxuPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgIDwvZGl2PlxyXG4gICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgXHJcblxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93VGFuZ29EZXRhaWxzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWxzLXRvZ2dsZSBkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGJnLWxpZ2h0LXByaW1hcnkgYWxpZ24taXRlbXMtc3RhcnQgbXQtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVSZXZpc2VkRGV0YWlscyhtYXBwaW5nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtcHJpbWFyeSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgaW4gZGV0YWlsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZXZyb24gbXMtMyBjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYgMTVMMTIgOUwxOCAxNVwiIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwidGltZWxpbmVcIj48L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImlzQ2hlY2tib3hFbmFibGVcIiBjbGFzcz1cInBiLTMgbXktMyBoLTEwMCByb3VuZGVkLTMgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuXHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIGFic29sdXRlMSBmb3JtLWNoZWNrLWlucHV0XCIgWyhuZ01vZGVsKV09XCJhbGxTZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm92ZXJhbGxTZWxlY3QoJGV2ZW50KVwiIC8+PHNwYW4gY2xhc3M9XCJtcy0xMlwiPiBTZWxlY3RcclxuICAgICAgICAgICAgICAgIEFsbDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cImlzQ2hlY2tib3hFbmFibGVcIiBjbGFzcz1cImNvbC1tZC02IHBlLThcIj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGFyaWEtcGxhY2Vob2xkZXI9XCJzaG93IGFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhbGxcIj5TaG93IGFsbDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhY2NlcHRcIj5BY2NlcHQ8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVqZWN0XCI+UmVqZWN0PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInBlbmRpbmdcIj5QZW5kaW5nPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiIW92ZXJhbGxTZWxlY3RlZElkcz8ubGVuZ3RoXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgYmctd2hpdGUgdy0xMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwb3B1cE9wZW4oJ3JlamVjdGVkJylcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAge3sgKHNlbGVjdGVkUm9sZSA9PT0gJ2FwcHJvdmVyJyB8fCBzZWxlY3RlZFJvbGUgPT09ICdyZXZpZXdlcicpID8gJ0RlbnknIDogJ1JlamVjdCdcclxuICAgICAgICAgICAgICAgICAgICB9fVxyXG5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCIhb3ZlcmFsbFNlbGVjdGVkSWRzPy5sZW5ndGhcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBiZy13aGl0ZSB3LTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBvcHVwT3BlbignYXBwcm92ZWQnKVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICB7eyAoc2VsZWN0ZWRSb2xlID09PSAnYXBwcm92ZXInIHx8IHNlbGVjdGVkUm9sZSA9PT0gJ3Jldmlld2VyJykgPyAnQXBwcm92ZScgOlxyXG4gICAgICAgICAgICAgICAgICAgICdBY2NlcHQnIH19XHJcblxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwiIWFwcHJvdmVyQ2xvc2VkXCIgY2xhc3M9XCJiZy13aGl0ZVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGlja2V0IG9mIGZvb3RmYWxsVGlja2V0c0RhdGFcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwidGlja2V0Py5fc291cmNlIGFzIHNvdXJjZVwiIGNsYXNzPVwibXktNVwiPlxyXG48bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0eXBlIG9mIHJldm9wc1R5cGVzXCI+XHJcbjxzZWN0aW9uICpuZ0lmPVwidHlwZSA9PT0nZHVwbGljYXRlJ1wiPlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJoYXNSZXZvcHNUeXBlKHR5cGUpXCIgY2xhc3M9XCJsYXllcnNcIj5cclxuICAgICAgICA8IS0tIEhlYWRlciBTZWN0aW9uIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBtaW4taC0yNXB4IHB0LTNcIj5cclxuICAgICAgICAgICAgPGgzIGNsYXNzPVwidGV4dC1sZyBmb250LXNlbWlib2xkIG1iLTRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzczMF83NjE1NylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zLjc1IDExLjI1SDNDMi42MDIxOCAxMS4yNSAyLjIyMDY0IDExLjA5MiAxLjkzOTM0IDEwLjgxMDdDMS42NTgwNCAxMC41Mjk0IDEuNSAxMC4xNDc4IDEuNSA5Ljc1VjNDMS41IDIuNjAyMTggMS42NTgwNCAyLjIyMDY0IDEuOTM5MzQgMS45MzkzNEMyLjIyMDY0IDEuNjU4MDQgMi42MDIxOCAxLjUgMyAxLjVIOS43NUMxMC4xNDc4IDEuNSAxMC41Mjk0IDEuNjU4MDQgMTAuODEwNyAxLjkzOTM0QzExLjA5MiAyLjIyMDY0IDExLjI1IDIuNjAyMTggMTEuMjUgM1YzLjc1TTguMjUgNi43NUgxNUMxNS44Mjg0IDYuNzUgMTYuNSA3LjQyMTU3IDE2LjUgOC4yNVYxNUMxNi41IDE1LjgyODQgMTUuODI4NCAxNi41IDE1IDE2LjVIOC4yNUM3LjQyMTU3IDE2LjUgNi43NSAxNS44Mjg0IDYuNzUgMTVWOC4yNUM2Ljc1IDcuNDIxNTcgNy40MjE1NyA2Ljc1IDguMjUgNi43NVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNzMwXzc2MTU3XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIER1cGxpY2F0ZXNcclxuICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBCb2R5IFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBtYXBwaW5nIG9mIHNvdXJjZT8ubWFwcGluZ0luZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIEJvZHkgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWFwcGluZz8udHlwZSA9PT12aWV3TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcmlnaW5hbCBvZiBtYXBwaW5nPy5yZXZpc2VkRGV0YWlsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwib3JpZ2luYWw/LmlzUGFyZW50ICYmIG9yaWdpbmFsPy5yZXZvcHNUeXBlID09PSdkdXBsaWNhdGUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtYm9keSBiZy13aGl0ZSBsYXllcnMgcHktNSBweC0wIG0tM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3JpZ2luYWwgSW1hZ2UgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkdXBsaWNhdGUtaGVhZCBweC01IG15LTNcIj5PcmlnaW5hbCBpbWFnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBweC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItMyBpbWctYm9yZGVyIGJvcmRlciBib3JkZXItMSBoLTEwMCByb3VuZGVkLTNcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZVVybCArIG9yaWdpbmFsPy5maWxlUGF0aFwiIGFsdD1cIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwIHJvdW5kZWQgYm9yZGVyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdGl0bGUgbXMtMiBteS0yXCI+VGFuZ28gSUQ6IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbC50ZW1wSWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjLXZhbHVlIG1zLTJcIj5FbnRyeSBUaW1lOiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9ybWF0dGVkRW50cnlUaW1lKG9yaWdpbmFsPy5lbnRyeVRpbWUpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcGFyYXRvciBzZXBhcmF0b3ItZGFzaGVkIG10LTMgbWItNVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHB4LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImR1cGxpY2F0ZS1oZWFkIG15LTMgZnMtNlwiPlRhZ2dlZCBEdXBsaWNhdGVzPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NoZWNrYm94RW5hYmxlXCIgY2xhc3M9XCJteS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImFyZUFsbER1cGxpY2F0ZXNTZWxlY3RlZChvcmlnaW5hbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlU2VsZWN0QWxsRHVwbGljYXRlcyhvcmlnaW5hbCwgJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibXMtMlwiPlNlbGVjdCBBbGw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBkdXBsaWNhdGUgb2Ygb3JpZ2luYWw/LmR1cGxpY2F0ZUltYWdlOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1tZC0zIG1iLTMgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItMyBoLTEwMCByb3VuZGVkLTMgcG9zaXRpb24tcmVsYXRpdmVcIiBbbmdDbGFzc109XCJ7XHJcbiAgICAnbGF5ZXItYXBwcm92ZWQnOiBpc0FwcHJvdmVkKGR1cGxpY2F0ZSksXHJcbiAgICAnbGF5ZXItcmVqZWN0ZWQnOiBpc1JlamVjdGVkKGR1cGxpY2F0ZSksXHJcbiAgICAnaW1nLWJvcmRlciBib3JkZXIgYm9yZGVyLTEnOiAhaXNBcHByb3ZlZChkdXBsaWNhdGUpICYmICFpc1JlamVjdGVkKGR1cGxpY2F0ZSl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2hlY2tib3ggLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NoZWNrYm94RW5hYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKm5nSWY9XCIhaXNMb2NrZWRCeVJldmlld2VyKGR1cGxpY2F0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicmlnaHQ6IDVweCA7IG1hcmdpbjogMTBweCA1cHggNHB4ICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0R1cGxpY2F0ZVNlbGVjdGVkKG9yaWdpbmFsLnRlbXBJZCwgZHVwbGljYXRlLnRlbXBJZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25EdXBsaWNhdGVDaGVja2JveENoYW5nZShvcmlnaW5hbC50ZW1wSWQsIGR1cGxpY2F0ZS50ZW1wSWQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgZm9ybS1jaGVjay1pbnB1dCBkdXBsaWNhdGUtY2hlY2tib3hcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSBhYnNvbHV0ZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNMb2NrZWRCeVJldmlld2VyKGR1cGxpY2F0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldENoZWNrYm94KCdkdXBsaWNhdGUnLCBkdXBsaWNhdGUpXCI+XHJcblxyXG5cclxuICAgIDxzdmcgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOVwiIGhlaWdodD1cIjE5XCJcclxuICAgICAgICB2aWV3Qm94PVwiMCAwIDE5IDE5XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICA8ZyBmaWx0ZXI9XCJ1cmwoI2ZpbHRlcjBfZF8yMDIzXzEzNzE4KVwiPlxyXG4gICAgICAgICAgICA8cmVjdCB4PVwiMS4xMTEzM1wiIHk9XCIwLjU1NTY2NFwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICByeD1cIjJcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICA8cmVjdCB4PVwiMS4zODkxMVwiIHk9XCIwLjgzMzQ0MlwiIHdpZHRoPVwiMTUuNDQ0NFwiXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNS40NDQ0XCIgcng9XCIxLjcyMjIyXCIgc3Ryb2tlPVwiI0QwRDVERFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIwLjU1NTU1NlwiIC8+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS44NzEwOSA4LjU1NTY2SDEyLjM1MjZcIiBzdHJva2U9XCIjMzQ0MDU0XCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuOTI3Nzc4XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9nPlxyXG4gICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICA8ZmlsdGVyIGlkPVwiZmlsdGVyMF9kXzIwMjNfMTM3MThcIiB4PVwiMC4wMDAyMTcwOFwiXHJcbiAgICAgICAgICAgICAgICB5PVwiMC4wMDAxMDg1NFwiIHdpZHRoPVwiMTguMjIyMlwiIGhlaWdodD1cIjE4LjIyMjJcIlxyXG4gICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXHJcbiAgICAgICAgICAgICAgICBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9XCJzUkdCXCI+XHJcbiAgICAgICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiQmFja2dyb3VuZEltYWdlRml4XCIgLz5cclxuICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPVwiU291cmNlQWxwaGFcIiB0eXBlPVwibWF0cml4XCJcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwiaGFyZEFscGhhXCIgLz5cclxuICAgICAgICAgICAgICAgIDxmZU9mZnNldCBkeT1cIjAuNTU1NTU2XCIgLz5cclxuICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIwLjU1NTU1NlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB0eXBlPVwibWF0cml4XCJcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAuMDYyNzQ1MSAwIDAgMCAwIDAuMDk0MTE3NiAwIDAgMCAwIDAuMTU2ODYzIDAgMCAwIDAuMDUgMFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW4yPVwiQmFja2dyb3VuZEltYWdlRml4XCJcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfMjAyM18xMzcxOFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW49XCJTb3VyY2VHcmFwaGljXCJcclxuICAgICAgICAgICAgICAgICAgICBpbjI9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfMjAyM18xMzcxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0PVwic2hhcGVcIiAvPlxyXG4gICAgICAgICAgICA8L2ZpbHRlcj5cclxuICAgICAgICA8L2RlZnM+XHJcbiAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIChjaGFuZ2UpPVwib25JbWFnZUNoZWNrYm94Q2hhbmdlKGR1cGxpY2F0ZS50ZW1wSWQsICdkdXBsaWNhdGUnLCAnb3JpZ2luYWwnKVwiIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIER1cGxpY2F0ZSBJbWFnZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlVXJsICsgZHVwbGljYXRlLmZpbGVQYXRoXCIgYWx0PVwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuSW1hZ2VQcmV2aWV3KG1hcHBpbmcsb3JpZ2luYWwuZHVwbGljYXRlSW1hZ2UsIGksICdUYWdnZWQgRHVwbGljYXRlcycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMDAgcm91bmRlZCBib3JkZXIgZHVwbGljYXRlLWltYWdlIGN1cnNvci1wb2ludGVyXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRHVwbGljYXRlIEluZm8gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdGl0bGUgbXMtMiBteS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhbmdvIElEOiB7eyBkdXBsaWNhdGUudGVtcElkIH19XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRBY3Rpb24oZHVwbGljYXRlLCAncmV2aWV3Jyk/LmFjdGlvbiA9PT0gJ2FwcHJvdmVkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLTJcIj48c3ZnIHN0eWxlPVwid2lkdGg6IDIwcHg7XHJcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDEwIDExXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB5PVwiMC41XCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgcng9XCI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNEMUZBREZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjEyMjIgMy41NzkxOUw0LjEzODg3IDYuNDU4MzZMMy4zNDcyIDUuNjEyNTNDMy4yMDEzNyA1LjQ3NTAzIDIuOTcyMiA1LjQ2NjY5IDIuODA1NTMgNS41ODMzNkMyLjY0MzAzIDUuNzA0MTkgMi41OTcyIDUuOTE2NjkgMi42OTcyIDYuMDg3NTNMMy42MzQ3IDcuNjEyNTNDMy43MjYzNyA3Ljc1NDE5IDMuODg0NyA3Ljg0MTY5IDQuMDYzODcgNy44NDE2OUM0LjIzNDcgNy44NDE2OSA0LjM5NzIgNy43NTQxOSA0LjQ4ODg3IDcuNjEyNTNDNC42Mzg4NyA3LjQxNjY5IDcuNTAxMzcgNC4wMDQxOSA3LjUwMTM3IDQuMDA0MTlDNy44NzYzNyAzLjYyMDg2IDcuNDIyMiAzLjI4MzM2IDcuMTIyMiAzLjU3NTAzVjMuNTc5MTlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxMkI3NkFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0QWN0aW9uKGR1cGxpY2F0ZSwgJ3JldmlldycpPy5hY3Rpb24gPT09ICdyZWplY3RlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0yXCI+PHN2ZyBzdHlsZT1cIndpZHRoOiAyMHB4O1xyXG4gICAgICAgIGhlaWdodDogMjBweDtcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNDI4XzU5NDg0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00LjUyOTYxIDEuNUg4LjY2OTYxTDExLjU5OTYgNC40M1Y4LjU3TDguNjY5NjEgMTEuNUg0LjUyOTYxTDEuNTk5NjEgOC41N1Y0LjQzTDQuNTI5NjEgMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0ZFRTRFMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDk5NjEgNUw1LjA5OTYxIDhNNS4wOTk2MSA1TDguMDk5NjEgOE00LjUyOTYxIDEuNUg4LjY2OTYxTDExLjU5OTYgNC40M1Y4LjU3TDguNjY5NjEgMTEuNUg0LjUyOTYxTDEuNTk5NjEgOC41N1Y0LjQzTDQuNTI5NjEgMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRDkyRDIwXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNDI4XzU5NDg0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgwLjU5OTYwOSAwLjUpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy12YWx1ZSBtcy0yXCI+RW50cnkgVGltZToge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rm9ybWF0dGVkRW50cnlUaW1lKGR1cGxpY2F0ZS5lbnRyeVRpbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0QWN0aW9uKGR1cGxpY2F0ZSwgJ2FwcHJvdmUnKT8uYWN0aW9uID09PSAnYXBwcm92ZWQnXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjM3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjM3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiByeD1cIjEyXCIgZmlsbD1cIiNEMUZBREZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80ODZfOTQwNTEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05LjUgMTdIOEM3LjczNDc4IDE3IDcuNDgwNDMgMTYuODk0NiA3LjI5Mjg5IDE2LjcwNzFDNy4xMDUzNiAxNi41MTk2IDcgMTYuMjY1MiA3IDE2VjEyLjVDNyAxMi4yMzQ4IDcuMTA1MzYgMTEuOTgwNCA3LjI5Mjg5IDExLjc5MjlDNy40ODA0MyAxMS42MDU0IDcuNzM0NzggMTEuNSA4IDExLjVIOS41TTEzIDEwLjVWOC41QzEzIDguMTAyMTggMTIuODQyIDcuNzIwNjQgMTIuNTYwNyA3LjQzOTM0QzEyLjI3OTQgNy4xNTgwNCAxMS44OTc4IDcgMTEuNSA3TDkuNSAxMS41VjE3SDE1LjE0QzE1LjM4MTIgMTcuMDAyNyAxNS42MTUyIDE2LjkxODIgMTUuNzk5IDE2Ljc2MkMxNS45ODI3IDE2LjYwNTggMTYuMTAzOCAxNi4zODg1IDE2LjE0IDE2LjE1TDE2LjgzIDExLjY1QzE2Ljg1MTggMTEuNTA2NyAxNi44NDIxIDExLjM2MDMgMTYuODAxNyAxMS4yMjExQzE2Ljc2MTMgMTEuMDgxOSAxNi42OTExIDEwLjk1MzEgMTYuNTk1OSAxMC44NDM4QzE2LjUwMDggMTAuNzM0NCAxNi4zODMgMTAuNjQ3IDE2LjI1MDggMTAuNTg3NkMxNi4xMTg1IDEwLjUyODMgMTUuOTc1IDEwLjQ5ODQgMTUuODMgMTAuNUgxM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDM5ODU1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzQ4Nl85NDA1MVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDYgNilcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRBY3Rpb24oZHVwbGljYXRlLCAnYXBwcm92ZScpPy5hY3Rpb24gPT09ICdyZWplY3RlZCdcIj48c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIzN1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIzN1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgcng9XCIxMlwiIGZpbGw9XCIjRkVFNEUyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDg2Xzk0MDkwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQuNTAxNSA3LjAwMDA2SDE1LjgzNjVDMTYuMTE5NSA2Ljk5NTA1IDE2LjM5NDQgNy4wOTQxMyAxNi42MDkyIDcuMjc4NDdDMTYuODIzOSA3LjQ2MjgxIDE2Ljk2MzUgNy43MTk1OSAxNy4wMDE1IDguMDAwMDZWMTEuNTAwMUMxNi45NjM1IDExLjc4MDUgMTYuODIzOSAxMi4wMzczIDE2LjYwOTIgMTIuMjIxNkMxNi4zOTQ0IDEyLjQwNiAxNi4xMTk1IDEyLjUwNTEgMTUuODM2NSAxMi41MDAxSDE0LjUwMTVNMTEuMDAxNSAxMy41MDAxVjE1LjUwMDFDMTEuMDAxNSAxNS44OTc5IDExLjE1OTUgMTYuMjc5NCAxMS40NDA4IDE2LjU2MDdDMTEuNzIyMSAxNi44NDIgMTIuMTAzNyAxNy4wMDAxIDEyLjUwMTUgMTcuMDAwMUwxNC41MDE1IDEyLjUwMDFWNy4wMDAwNkg4Ljg2MTQ4QzguNjIwMzIgNi45OTczMyA4LjM4NjI5IDcuMDgxODYgOC4yMDI1MyA3LjIzODA2QzguMDE4NzYgNy4zOTQyNiA3Ljg5NzY0IDcuNjExNjEgNy44NjE0OCA3Ljg1MDA2TDcuMTcxNDggMTIuMzUwMUM3LjE0OTczIDEyLjQ5MzQgNy4xNTkzOSAxMi42Mzk3IDcuMTk5ODEgMTIuNzc4OUM3LjI0MDIzIDEyLjkxODEgNy4zMTA0MyAxMy4wNDY5IDcuNDA1NTUgMTMuMTU2M0M3LjUwMDY3IDEzLjI2NTcgNy42MTg0NCAxMy4zNTMxIDcuNzUwNjkgMTMuNDEyNEM3Ljg4Mjk1IDEzLjQ3MTggOC4wMjY1MyAxMy41MDE3IDguMTcxNDggMTMuNTAwMUgxMS4wMDE1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDg2Xzk0MDkwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNiA2KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEdXBsaWNhdGUgUmVhc29uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJkdXBsaWNhdGUtcmVhc29uIG1zLTIgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+e3sgZHVwbGljYXRlLnJlYXNvbiB9fTwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBweS01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tbWVudHMtYWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBY2NvcmRpb24gSGVhZGVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZUNvbW1lbnRzQWNjb3JkaW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgYWxpZ24taXRlbXMtY2VudGVyIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbW1lbnRzLWNvdW50XCI+e3sgY29tbWVudHM/Lmxlbmd0aCB9fSBDb21tZW50czwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tYXJyb3cgbXMtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgW2NsYXNzLnJvdGF0ZWRdPVwiY29tbWVudHNBY2NvcmRpb25PcGVuXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWNjb3JkaW9uIEJvZHkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tYm9keVwiICpuZ0lmPVwiY29tbWVudHNBY2NvcmRpb25PcGVuXCI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICA8IS0tIExvb3AgZWFjaCBibG9jazogdGFnZ2luZyAvIHJldmlldyAvIGFwcHJvdmUgLS0+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBibG9jayBvZiBhY3Rpdml0eURhdGFcIj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgPCEtLSBMb29wIGluc2lkZSBjb21tZW50cyAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYyBvZiBibG9jay5jb21tZW50c1wiIGNsYXNzPVwiY29tbWVudC10aHJlYWQgZC1mbGV4IG1iLTRcIj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICA8IS0tIGF2YXRhciAtLT5cclxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhciBhdmF0YXItdGV4dCBsaWdodC1wcmltYXJ5IHAtM1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgIHt7IGdldEluaXRpYWxzRnJvbUVtYWlsKGMuY3JlYXRlZEJ5RW1haWwpIH19XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMFwiPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPCEtLSBlbWFpbCAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1zZW1pYm9sZFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBjLmNyZWF0ZWRCeUVtYWlsIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiICpuZ0lmPVwiYy5jcmVhdGVkQXRcIj5cclxuICAgICAgICAgICAge3sgYy5jcmVhdGVkQXQgfCBkYXRlOidoaDptbTpzcyBhIC0gZGQgTU1NIHl5eXknIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPCEtLSBtZXNzYWdlIHRleHQgLS0+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTIgbXQtMlwiICpuZ0lmPVwiYy5tZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGMubWVzc2FnZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPCEtLSBSZXZpZXcgLyBBcHByb3ZlIG9ubHkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYmxvY2sudHlwZSA9PT0gJ3JldmlldycgfHwgYmxvY2sudHlwZSA9PT0gJ2FwcHJvdmUnXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVGFnZ2VkIGltYWdlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMiBmbGV4LXdyYXBcIj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpbWcgb2YgYy50YWdnZWRJbWFnZXM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaG93IG9ubHkgZmlyc3QgNCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpIDwgM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFuZ28tY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1pbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZEltYWdlXT1cIid1cmwoJysgaW1hZ2VVcmwgKyBpbWcuZmlsZVBhdGggKyAnKSdcIj48L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFuZ28tbWV0YSBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFuZ28gSUQ6IHt7IGltZy50ZW1wSWQgfX1cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBzdGF0dXMgZG90cyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjLnN0YXR1cyA9PT0gJ2FwcHJvdmVkJ1wiPjxzdmcgc3R5bGU9XCJ3aWR0aDogMjBweDtcclxuICAgICAgICAgICAgICAgIGhlaWdodDogMjBweDtcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAxMCAxMVwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB5PVwiMC41XCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgcng9XCI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0QxRkFERlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjEyMjIgMy41NzkxOUw0LjEzODg3IDYuNDU4MzZMMy4zNDcyIDUuNjEyNTNDMy4yMDEzNyA1LjQ3NTAzIDIuOTcyMiA1LjQ2NjY5IDIuODA1NTMgNS41ODMzNkMyLjY0MzAzIDUuNzA0MTkgMi41OTcyIDUuOTE2NjkgMi42OTcyIDYuMDg3NTNMMy42MzQ3IDcuNjEyNTNDMy43MjYzNyA3Ljc1NDE5IDMuODg0NyA3Ljg0MTY5IDQuMDYzODcgNy44NDE2OUM0LjIzNDcgNy44NDE2OSA0LjM5NzIgNy43NTQxOSA0LjQ4ODg3IDcuNjEyNTNDNC42Mzg4NyA3LjQxNjY5IDcuNTAxMzcgNC4wMDQxOSA3LjUwMTM3IDQuMDA0MTlDNy44NzYzNyAzLjYyMDg2IDcuNDIyMiAzLjI4MzM2IDcuMTIyMiAzLjU3NTAzVjMuNTc5MTlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzEyQjc2QVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjLnN0YXR1cyA9PT0gJ3JlamVjdGVkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48c3ZnIHN0eWxlPVwid2lkdGg6IDIwcHg7XHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDIwcHg7XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTMgMTNcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNDI4XzU5NDg0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNC41Mjk2MSAxLjVIOC42Njk2MUwxMS41OTk2IDQuNDNWOC41N0w4LjY2OTYxIDExLjVINC41Mjk2MUwxLjU5OTYxIDguNTdWNC40M0w0LjUyOTYxIDEuNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0ZFRTRFMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjA5OTYxIDVMNS4wOTk2MSA4TTUuMDk5NjEgNUw4LjA5OTYxIDhNNC41Mjk2MSAxLjVIOC42Njk2MUwxMS41OTk2IDQuNDNWOC41N0w4LjY2OTYxIDExLjVINC41Mjk2MUwxLjU5OTYxIDguNTdWNC40M0w0LjUyOTYxIDEuNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRDkyRDIwXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE0MjhfNTk0ODRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgwLjU5OTYwOSAwLjUpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5IHRpbWU6IHt7IGltZy5lbnRyeVRpbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gK04gbW9yZSAtLT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cInRhbmdvLWNhcmQgbW9yZS1jYXJkIHRleHQtY2VudGVyXCJcclxuICAgICAgICAgICpuZ0lmPVwiYy50YWdnZWRJbWFnZXMubGVuZ3RoID4gM1wiXHJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZEltYWdlXT1cIid1cmwoJyArIGltYWdlVXJsICsgYy50YWdnZWRJbWFnZXNbM10uZmlsZVBhdGggKyAnKSdcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5JbWFnZXNQb3B1cChjKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vcmUtb3ZlcmxheVwiPjwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgPCEtLSB2ZXJ0aWNhbCBjb250YWluZXIgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9yZS13cmFwcGVyIG15LTEwIGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9yZS10ZXh0IGZ3LXNlbWlib2xkXCI+K3t7IGMudGFnZ2VkSW1hZ2VzLmxlbmd0aCAtIDMgfX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtcHJpbWFyeSB0ZXh0LWRhcmsgdGV4dC1kZWNvcmF0aW9uLXVuZGVybGluZSBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgIFZpZXcgYWxsXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwhLS0gU3RhdHVzIEljb25zIC0tPlxyXG5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcbjxzZWN0aW9uICpuZ0lmPVwidHlwZSAhPT0nZHVwbGljYXRlJ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImxheWVycyBteS0yXCIgKm5nSWY9XCJoYXNSZXZvcHNUeXBlKHR5cGUpXCI+XHJcbiAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgbWluLWgtMjVweCBwdC0zXCI+XHJcbiAgICAgICAgICAgPGRpdiBjbGFzcz1cImR1cGxpY2F0ZS1oZWFkIHRleHQtbGcgbXktM1wiPjxzcGFuIGNsYXNzPVwibWUtMlwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNTE5OTUgMC42MTMwNjVDOC4zMzczOSAtMC4yMDQzNTUgOS42NjI2NyAtMC4yMDQzNTUgMTAuNDgwMSAwLjYxMzA2NUwxNy4zODcgNy41MTk5NUMxOC4yMDQzIDguMzM3MzkgMTguMjA0MyA5LjY2MjY3IDE3LjM4NyAxMC40ODAxTDEwLjQ4MDEgMTcuMzg3QzkuNjYyNjcgMTguMjA0MyA4LjMzNzM5IDE4LjIwNDMgNy41MTk5NSAxNy4zODdMNS41NDYyNiAxNS40MTMzTDMuNzM3MDggMTcuMjIyNEMyLjkxOTY2IDE4LjAzOTkgMS41OTQzNiAxOC4wMzk5IDAuNzc2OTQ0IDE3LjIyMjRDLTAuMDQwNDc2NyAxNi40MDUxIC0wLjA0MDQ3NjcgMTUuMDc5NyAwLjc3Njk0NCAxNC4yNjI0TDIuNTg2MTIgMTIuNDUzMUwwLjYxMzA2NSAxMC40ODAxQy0wLjIwNDM1NSA5LjY2MjY3IC0wLjIwNDM1NSA4LjMzNzM5IDAuNjEzMDY1IDcuNTE5OTVMNy41MTk5NSAwLjYxMzA2NVpNOS40OTMzNiAxLjU5OTc4QzkuMjIwODggMS4zMjczMSA4Ljc3OTA5IDEuMzI3MzEgOC41MDY2MSAxLjU5OTc4TDMuNTcyODYgNi41MzM1N0wxMS40NjY1IDE0LjQyNzJMMTYuNDAwMiA5LjQ5MzM2QzE2LjY3MjcgOS4yMjA4OCAxNi42NzI3IDguNzc5MDkgMTYuNDAwMiA4LjUwNjdMMTIuOTQ2NSA1LjA1Mjg2TDExLjc5NTIgNi4yMDQwM0MxMS41MjI4IDYuNDc2NSAxMS4wODExIDYuNDc2NSAxMC44MDg2IDYuMjA0MDNDMTAuNTM2MSA1LjkzMTU1IDEwLjUzNjEgNS40ODk3OCAxMC44MDg2IDUuMjE3MzFMMTEuOTU5NyA0LjA2NjE0TDEwLjk3MzIgMy4wNzk2NEw4LjE3NzU3IDUuODc1MzNDNy45MDUwOSA2LjE0NzggNy40NjMyOSA2LjE0NzggNy4xOTA4MSA1Ljg3NTMzQzYuOTE4MzMgNS42MDI4NiA2LjkxODMzIDUuMTYxMDkgNy4xOTA4MSA0Ljg4ODYyTDkuOTg2NSAyLjA5MjkzTDkuNDkzMzYgMS41OTk3OFpNMTAuNDc5NyAxNS40MTM5TDIuNTg2MTUgNy41MjAyOEwxLjU5OTc4IDguNTA2N0MxLjMyNzMgOC43NzkwOSAxLjMyNzMgOS4yMjA4OCAxLjU5OTc4IDkuNDkzMzZMOC41MDY2MSAxNi40MDAyQzguNzc5MDkgMTYuNjcyNyA5LjIyMDg4IDE2LjY3MjcgOS40OTMzNiAxNi40MDAyTDEwLjQ3OTcgMTUuNDEzOVpNMy41NzI3NSAxMy40Mzk5TDEuNzYzNjYgMTUuMjQ5QzEuNDkxMTkgMTUuNTIxNSAxLjQ5MTE5IDE1Ljk2MzMgMS43NjM2NiAxNi4yMzU4QzIuMDM2MTMgMTYuNTA4MiAyLjQ3NzkgMTYuNTA4MiAyLjc1MDM3IDE2LjIzNThMNC41NTk0NiAxNC40MjY2TDMuNTcyNzUgMTMuNDM5OVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+IHt7dHlwZX19XHJcblxyXG4gICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgPC9kaXY+XHJcbiAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDaGVja2JveEVuYWJsZVwiIGNsYXNzPVwibXMtMyBteS0zXCI+XHJcbiAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwic2VsZWN0QWxsQnlUeXBlW3R5cGVdXCJcclxuICAgIChjaGFuZ2UpPVwib25TZWxlY3RBbGwodHlwZSwgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgIDxsYWJlbD5TZWxlY3QgQWxsPC9sYWJlbD5cclxuICAgICAgIDwvZGl2PlxyXG4gICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbWFwcGluZyBvZiBzb3VyY2U/Lm1hcHBpbmdJbmZvXCI+XHJcbiAgICAgICAgICAgPCEtLSBCb2R5IFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgPGRpdiAqbmdJZj1cIm1hcHBpbmc/LnR5cGUgPT09dmlld01vZGVcIiBjbGFzcz1cImNhcmQtYm9keSBiZy13aGl0ZSBsYXllcnMgcC01IG0tM1wiPlxyXG5cclxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3JpZ2luYWwgb2YgbWFwcGluZz8ucmV2aXNlZERldGFpbDtsZXQgaT1pbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcmlnaW5hbD8ucmV2b3BzVHlwZSA9PT10eXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbWQtMyBtYi0zIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi0zIGgtMTAwIHJvdW5kZWQtMyBwb3NpdGlvbi1yZWxhdGl2ZVwiIFtuZ0NsYXNzXT1cIntcclxuJ2xheWVyLWFwcHJvdmVkJzogaXNBcHByb3ZlZChvcmlnaW5hbCksXHJcbidsYXllci1yZWplY3RlZCc6IGlzUmVqZWN0ZWQob3JpZ2luYWwpLFxyXG4naW1nLWJvcmRlciBib3JkZXIgYm9yZGVyLTEnOiAhaXNBcHByb3ZlZChvcmlnaW5hbCkgJiYgIWlzUmVqZWN0ZWQob3JpZ2luYWwpfVwiPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRvcC1yaWdodCBDaGVja2JveCAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NoZWNrYm94RW5hYmxlXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiFpc0xvY2tlZEJ5UmV2aWV3ZXIob3JpZ2luYWwpXCIgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSBhYnNvbHV0ZSBmb3JtLWNoZWNrLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIihzZWxlY3RlZEJ5VHlwZVt0eXBlXSB8fCBbXSkuaW5jbHVkZXMob3JpZ2luYWw/LnRlbXBJZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uSW1hZ2VDaGVja2JveENoYW5nZSh0eXBlLCBvcmlnaW5hbC50ZW1wSWQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIGFic29sdXRlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNMb2NrZWRCeVJldmlld2VyKG9yaWdpbmFsKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldENoZWNrYm94KHR5cGUsIG9yaWdpbmFsKVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOVwiIGhlaWdodD1cIjE5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTkgMTlcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsdGVyPVwidXJsKCNmaWx0ZXIwX2RfMjAyM18xMzcxOClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMS4xMTEzM1wiIHk9XCIwLjU1NTY2NFwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHJ4PVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjEuMzg5MTFcIiB5PVwiMC44MzM0NDJcIiB3aWR0aD1cIjE1LjQ0NDRcIiBoZWlnaHQ9XCIxNS40NDQ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcng9XCIxLjcyMjIyXCIgc3Ryb2tlPVwiI0QwRDVERFwiIHN0cm9rZS13aWR0aD1cIjAuNTU1NTU2XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUuODcxMDkgOC41NTU2NkgxMi4zNTI2XCIgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuOTI3Nzc4XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgaWQ9XCJmaWx0ZXIwX2RfMjAyM18xMzcxOFwiIHg9XCIwLjAwMDIxNzA4XCIgeT1cIjAuMDAwMTA4NTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE4LjIyMjJcIiBoZWlnaHQ9XCIxOC4yMjIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz1cInNSR0JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT1cIjBcIiByZXN1bHQ9XCJCYWNrZ3JvdW5kSW1hZ2VGaXhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCBpbj1cIlNvdXJjZUFscGhhXCIgdHlwZT1cIm1hdHJpeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9XCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ9XCJoYXJkQWxwaGFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVPZmZzZXQgZHk9XCIwLjU1NTU1NlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249XCIwLjU1NTU1NlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHR5cGU9XCJtYXRyaXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPVwiMCAwIDAgMCAwLjA2Mjc0NTEgMCAwIDAgMCAwLjA5NDExNzYgMCAwIDAgMCAwLjE1Njg2MyAwIDAgMCAwLjA1IDBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPVwibm9ybWFsXCIgaW4yPVwiQmFja2dyb3VuZEltYWdlRml4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD1cImVmZmVjdDFfZHJvcFNoYWRvd18yMDIzXzEzNzE4XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT1cIm5vcm1hbFwiIGluPVwiU291cmNlR3JhcGhpY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjI9XCJlZmZlY3QxX2Ryb3BTaGFkb3dfMjAyM18xMzcxOFwiIHJlc3VsdD1cInNoYXBlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZVVybCArIG9yaWdpbmFsPy5maWxlUGF0aFwiIGFsdD1cIlwiIChjbGljayk9XCJvcGVuSW1hZ2VQcmV2aWV3KG1hcHBpbmcsb3JpZ2luYWwsIGksIHNlbGVjdGVkQnlUeXBlW3R5cGVdKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMCByb3VuZGVkIGJvcmRlciBjdXJzb3ItcG9pbnRlclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG15LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdGl0bGUgbXMtMiBteS0yXCI+VGFuZ28gSUQ6IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbC50ZW1wSWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdldEFjdGlvbihvcmlnaW5hbCwgJ3JldmlldycpPy5hY3Rpb24gPT09ICdhcHByb3ZlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtMlwiPjxzdmcgc3R5bGU9XCJ3aWR0aDogMjBweDtcclxuaGVpZ2h0OiAyMHB4O1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDEwIDExXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeT1cIjAuNVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHJ4PVwiNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0QxRkFERlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4xMjIyIDMuNTc5MTlMNC4xMzg4NyA2LjQ1ODM2TDMuMzQ3MiA1LjYxMjUzQzMuMjAxMzcgNS40NzUwMyAyLjk3MjIgNS40NjY2OSAyLjgwNTUzIDUuNTgzMzZDMi42NDMwMyA1LjcwNDE5IDIuNTk3MiA1LjkxNjY5IDIuNjk3MiA2LjA4NzUzTDMuNjM0NyA3LjYxMjUzQzMuNzI2MzcgNy43NTQxOSAzLjg4NDcgNy44NDE2OSA0LjA2Mzg3IDcuODQxNjlDNC4yMzQ3IDcuODQxNjkgNC4zOTcyIDcuNzU0MTkgNC40ODg4NyA3LjYxMjUzQzQuNjM4ODcgNy40MTY2OSA3LjUwMTM3IDQuMDA0MTkgNy41MDEzNyA0LjAwNDE5QzcuODc2MzcgMy42MjA4NiA3LjQyMjIgMy4yODMzNiA3LjEyMjIgMy41NzUwM1YzLjU3OTE5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzEyQjc2QVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdldEFjdGlvbihvcmlnaW5hbCwgJ3JldmlldycpPy5hY3Rpb24gPT09ICdyZWplY3RlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtMlwiPjxzdmcgc3R5bGU9XCJ3aWR0aDogMjBweDtcclxuaGVpZ2h0OiAyMHB4O1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDEzIDEzXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNDI4XzU5NDg0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTQuNTI5NjEgMS41SDguNjY5NjFMMTEuNTk5NiA0LjQzVjguNTdMOC42Njk2MSAxMS41SDQuNTI5NjFMMS41OTk2MSA4LjU3VjQuNDNMNC41Mjk2MSAxLjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0ZFRTRFMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wOTk2MSA1TDUuMDk5NjEgOE01LjA5OTYxIDVMOC4wOTk2MSA4TTQuNTI5NjEgMS41SDguNjY5NjFMMTEuNTk5NiA0LjQzVjguNTdMOC42Njk2MSAxMS41SDQuNTI5NjFMMS41OTk2MSA4LjU3VjQuNDNMNC41Mjk2MSAxLjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRDkyRDIwXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTQyOF81OTQ4NFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgwLjU5OTYwOSAwLjUpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy12YWx1ZSBtcy0yXCI+RW50cnkgVGltZToge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZvcm1hdHRlZEVudHJ5VGltZShvcmlnaW5hbD8uZW50cnlUaW1lKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyBtcy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2V0QWN0aW9uKG9yaWdpbmFsLCAnYXBwcm92ZScpPy5hY3Rpb24gPT09ICdhcHByb3ZlZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMzdcIiBoZWlnaHQ9XCIzN1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgcng9XCIxMlwiIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzQ4Nl85NDA1MSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOS41IDE3SDhDNy43MzQ3OCAxNyA3LjQ4MDQzIDE2Ljg5NDYgNy4yOTI4OSAxNi43MDcxQzcuMTA1MzYgMTYuNTE5NiA3IDE2LjI2NTIgNyAxNlYxMi41QzcgMTIuMjM0OCA3LjEwNTM2IDExLjk4MDQgNy4yOTI4OSAxMS43OTI5QzcuNDgwNDMgMTEuNjA1NCA3LjczNDc4IDExLjUgOCAxMS41SDkuNU0xMyAxMC41VjguNUMxMyA4LjEwMjE4IDEyLjg0MiA3LjcyMDY0IDEyLjU2MDcgNy40MzkzNEMxMi4yNzk0IDcuMTU4MDQgMTEuODk3OCA3IDExLjUgN0w5LjUgMTEuNVYxN0gxNS4xNEMxNS4zODEyIDE3LjAwMjcgMTUuNjE1MiAxNi45MTgyIDE1Ljc5OSAxNi43NjJDMTUuOTgyNyAxNi42MDU4IDE2LjEwMzggMTYuMzg4NSAxNi4xNCAxNi4xNUwxNi44MyAxMS42NUMxNi44NTE4IDExLjUwNjcgMTYuODQyMSAxMS4zNjAzIDE2LjgwMTcgMTEuMjIxMUMxNi43NjEzIDExLjA4MTkgMTYuNjkxMSAxMC45NTMxIDE2LjU5NTkgMTAuODQzOEMxNi41MDA4IDEwLjczNDQgMTYuMzgzIDEwLjY0NyAxNi4yNTA4IDEwLjU4NzZDMTYuMTE4NSAxMC41MjgzIDE1Ljk3NSAxMC40OTg0IDE1LjgzIDEwLjVIMTNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMzk4NTVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzQ4Nl85NDA1MVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNiA2KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnZXRBY3Rpb24ob3JpZ2luYWwsICdhcHByb3ZlJyk/LmFjdGlvbiA9PT0gJ3JlamVjdGVkJ1wiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIzN1wiIGhlaWdodD1cIjM3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiByeD1cIjEyXCIgZmlsbD1cIiNGRUU0RTJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDg2Xzk0MDkwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNC41MDE1IDcuMDAwMDZIMTUuODM2NUMxNi4xMTk1IDYuOTk1MDUgMTYuMzk0NCA3LjA5NDEzIDE2LjYwOTIgNy4yNzg0N0MxNi44MjM5IDcuNDYyODEgMTYuOTYzNSA3LjcxOTU5IDE3LjAwMTUgOC4wMDAwNlYxMS41MDAxQzE2Ljk2MzUgMTEuNzgwNSAxNi44MjM5IDEyLjAzNzMgMTYuNjA5MiAxMi4yMjE2QzE2LjM5NDQgMTIuNDA2IDE2LjExOTUgMTIuNTA1MSAxNS44MzY1IDEyLjUwMDFIMTQuNTAxNU0xMS4wMDE1IDEzLjUwMDFWMTUuNTAwMUMxMS4wMDE1IDE1Ljg5NzkgMTEuMTU5NSAxNi4yNzk0IDExLjQ0MDggMTYuNTYwN0MxMS43MjIxIDE2Ljg0MiAxMi4xMDM3IDE3LjAwMDEgMTIuNTAxNSAxNy4wMDAxTDE0LjUwMTUgMTIuNTAwMVY3LjAwMDA2SDguODYxNDhDOC42MjAzMiA2Ljk5NzMzIDguMzg2MjkgNy4wODE4NiA4LjIwMjUzIDcuMjM4MDZDOC4wMTg3NiA3LjM5NDI2IDcuODk3NjQgNy42MTE2MSA3Ljg2MTQ4IDcuODUwMDZMNy4xNzE0OCAxMi4zNTAxQzcuMTQ5NzMgMTIuNDkzNCA3LjE1OTM5IDEyLjYzOTcgNy4xOTk4MSAxMi43Nzg5QzcuMjQwMjMgMTIuOTE4MSA3LjMxMDQzIDEzLjA0NjkgNy40MDU1NSAxMy4xNTYzQzcuNTAwNjcgMTMuMjY1NyA3LjYxODQ0IDEzLjM1MzEgNy43NTA2OSAxMy40MTI0QzcuODgyOTUgMTMuNDcxOCA4LjAyNjUzIDEzLjUwMTcgOC4xNzE0OCAxMy41MDAxSDExLjAwMTVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzQ4Nl85NDA5MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNiA2KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgcHktNVwiPlxyXG4gICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50cy1hY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgICAgPCEtLSBBY2NvcmRpb24gSGVhZGVyIC0tPlxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVDb21tZW50c0FjY29yZGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tbWVudHMtdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21tZW50cy1jb3VudFwiPnt7IGNvbW1lbnRzPy5sZW5ndGggfX0gQ29tbWVudHM8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tYXJyb3cgbXMtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIFtjbGFzcy5yb3RhdGVkXT1cImNvbW1lbnRzQWNjb3JkaW9uT3BlblwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICA8IS0tIEFjY29yZGlvbiBDb250ZW50IC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tYm9keVwiICpuZ0lmPVwiY29tbWVudHNBY2NvcmRpb25PcGVuXCI+XHJcblxyXG48IS0tIGxvb3AgZWFjaCBibG9jazogdGFnZ2luZyAvIHJldmlldyAvIGFwcHJvdmUgLS0+XHJcbjxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJsb2NrIG9mIGFjdGl2aXR5RGF0YTFcIj5cclxuXHJcbjwhLS0gVEFHR0lORyBDT01NRU5UUyAoZWFjaCBjb21tZW50ID0gb25lIGltYWdlICsgbWVzc2FnZSkgLS0+XHJcbjxuZy1jb250YWluZXIgKm5nSWY9XCJibG9jay50eXBlID09PSAndGFnZ2luZydcIj5cclxuPGRpdiAqbmdGb3I9XCJsZXQgYyBvZiBibG9jay5jb21tZW50c1wiIGNsYXNzPVwiY29tbWVudC10aHJlYWQgZC1mbGV4IG1iLTRcIj5cclxuXHJcbjwhLS0gYXZhdGFyIC0tPlxyXG48ZGl2IGNsYXNzPVwiYXZhdGFyIGF2YXRhci10ZXh0IGxpZ2h0LXByaW1hcnkgcC0zXCI+XHJcblxyXG4gICAgICAgICAge3sgZ2V0SW5pdGlhbHNGcm9tRW1haWwoYy5jcmVhdGVkQnlFbWFpbCkgfX1cclxuICAgICAgPC9kaXY+XHJcblxyXG48IS0tIGNvbnRlbnQgLS0+XHJcbjxkaXY+XHJcbiA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGRcIj5cclxuICAge3sgYy5jcmVhdGVkQnlFbWFpbCB9fVxyXG4gPC9kaXY+XHJcblxyXG4gPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIiAqbmdJZj1cImMuY3JlYXRlZEF0XCI+XHJcbiAgIHt7IGMuY3JlYXRlZEF0IHwgZGF0ZTonaGg6bW06c3MgYSAtIGRkIE1NTSB5eXl5JyB9fVxyXG4gPC9kaXY+XHJcblxyXG4gPHAgY2xhc3M9XCJtYi0yIG10LTJcIiAqbmdJZj1cImMubWVzc2FnZVwiPlxyXG4gICB7eyBjLm1lc3NhZ2UgfX1cclxuIDwvcD5cclxuXHJcbiA8IS0tIHNpbmdsZSBpbWFnZSBjYXJkIC0tPlxyXG4gPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMiBmbGV4LXdyYXBcIj5cclxuICAgPGRpdiBjbGFzcz1cInRhbmdvLWNhcmRcIiAqbmdJZj1cImMuZmlsZVBhdGhcIj5cclxuICAgICA8ZGl2IGNsYXNzPVwidGFuZ28taW1hZ2VcIlxyXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRJbWFnZV09XCIndXJsKCcgKyBpbWFnZVVybCArIGMuZmlsZVBhdGggKyAnKSdcIj5cclxuICAgICA8L2Rpdj5cclxuXHJcbiAgICAgPGRpdiBjbGFzcz1cInRhbmdvLW1ldGEgc21hbGxcIj5cclxuICAgICAgIDxkaXY+VGFuZ28gSUQ6IHt7IGMudGVtcElkIH19PC9kaXY+XHJcbiAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZFwiPkVudHJ5IHRpbWU6IHt7IGMuZW50cnlUaW1lIH19PC9kaXY+XHJcbiAgICAgPC9kaXY+XHJcbiAgIDwvZGl2PlxyXG4gPC9kaXY+XHJcbjwvZGl2PlxyXG48L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcblxyXG48IS0tIFJFVklFVyAvIEFQUFJPVkUgQ09NTUVOVFMgKHdpdGggdGFnZ2VkSW1hZ2VzICsgK04gVmlldyBhbGwpIC0tPlxyXG48bmctY29udGFpbmVyICpuZ0lmPVwiYmxvY2sudHlwZSA9PT0gJ3JldmlldycgfHwgYmxvY2sudHlwZSA9PT0gJ2FwcHJvdmUnXCI+XHJcbjxkaXYgKm5nRm9yPVwibGV0IGMgb2YgYmxvY2suY29tbWVudHNcIiBjbGFzcz1cImNvbW1lbnQtdGhyZWFkIGQtZmxleCBtYi00XCI+XHJcblxyXG48IS0tIGF2YXRhciAtLT5cclxuPGRpdiBjbGFzcz1cImF2YXRhciBhdmF0YXItdGV4dCBsaWdodC1wcmltYXJ5IHAtM1wiPlxyXG5cclxuICAgICAgICAgIHt7IGdldEluaXRpYWxzRnJvbUVtYWlsKGMuY3JlYXRlZEJ5RW1haWwpIH19XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuPCEtLSBjb250ZW50IC0tPlxyXG48ZGl2IGNsYXNzPVwidy0xMDBcIj5cclxuIDxkaXYgY2xhc3M9XCJmdy1zZW1pYm9sZFwiPlxyXG4gICB7eyBjLmNyZWF0ZWRCeUVtYWlsIH19XHJcbiA8L2Rpdj5cclxuXHJcbiA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiICpuZ0lmPVwiYy5jcmVhdGVkQXRcIj5cclxuICAge3sgYy5jcmVhdGVkQXQgfCBkYXRlOidoaDptbTpzcyBhIC0gZGQgTU1NIHl5eXknIH19XHJcbiA8L2Rpdj5cclxuXHJcbiA8IS0tIG1haW4gcmV2aWV3L2FwcHJvdmUgbWVzc2FnZSAtLT5cclxuIDxwIGNsYXNzPVwibWItMiBtdC0yXCIgKm5nSWY9XCJjLm1lc3NhZ2VcIj5cclxuICAge3sgYy5tZXNzYWdlIH19XHJcbiA8L3A+XHJcblxyXG4gXHJcblxyXG4gPCEtLSBpbWFnZSBsaXN0ICsgK04gVmlldyBhbGwgLS0+XHJcbiA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGZsZXgtd3JhcFwiICpuZ0lmPVwiYy50YWdnZWRJbWFnZXM/Lmxlbmd0aFwiPlxyXG5cclxuICAgPCEtLSBmaXJzdCAzIGltYWdlcyAtLT5cclxuICAgPGRpdiAqbmdGb3I9XCJsZXQgaW1nIG9mIGMudGFnZ2VkSW1hZ2VzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgPCAzXCI+XHJcbiAgICAgICA8ZGl2IGNsYXNzPVwidGFuZ28tY2FyZFwiPlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwidGFuZ28taW1hZ2VcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kSW1hZ2VdPVwiJ3VybCgnICsgaW1hZ2VVcmwgKyBpbWcuZmlsZVBhdGggKyAnKSdcIj5cclxuICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwidGFuZ28tbWV0YSBzbWFsbFwiPlxyXG4gICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICBUYW5nbyBJRDoge3sgaW1nLnRlbXBJZCB9fVxyXG4gICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjLnN0YXR1cyA9PT0gJ2FwcHJvdmVkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0YXR1cy1kb3Qgc3RhdHVzLWFwcHJvdmVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImMuc3RhdHVzID09PSAncmVqZWN0ZWQnXCJcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtcmVqZWN0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICBFbnRyeSB0aW1lOiB7eyBpbWcuZW50cnlUaW1lIH19XHJcbiAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgPC9kaXY+XHJcbiAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgIDwvZGl2PlxyXG5cclxuICAgPCEtLSArTiBWaWV3IGFsbCBjYXJkIC0tPlxyXG4gICA8ZGl2XHJcbiAgICAgY2xhc3M9XCJ0YW5nby1jYXJkIG1vcmUtY2FyZCB0ZXh0LWNlbnRlclwiXHJcbiAgICAgKm5nSWY9XCJjLnRhZ2dlZEltYWdlcy5sZW5ndGggPiAzXCJcclxuICAgICBbc3R5bGUuYmFja2dyb3VuZEltYWdlXT1cIid1cmwoJyArIGltYWdlVXJsICsgYy50YWdnZWRJbWFnZXNbM10uZmlsZVBhdGggKyAnKSdcIlxyXG4gICAgIChjbGljayk9XCJvcGVuSW1hZ2VzUG9wdXAoYylcIlxyXG4gICA+XHJcbiAgICAgPGRpdiBjbGFzcz1cIm1vcmUtb3ZlcmxheVwiPjwvZGl2PlxyXG5cclxuICAgICA8ZGl2IGNsYXNzPVwibW9yZS13cmFwcGVyIGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgPGRpdiBjbGFzcz1cIm1vcmUtdGV4dCBmdy1zZW1pYm9sZFwiPlxyXG4gICAgICAgICAre3sgYy50YWdnZWRJbWFnZXMubGVuZ3RoIC0gMyB9fVxyXG4gICAgICAgPC9kaXY+XHJcbiAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1wcmltYXJ5IHRleHQtZGVjb3JhdGlvbi11bmRlcmxpbmUgc21hbGxcIj5cclxuICAgICAgICAgVmlldyBhbGxcclxuICAgICAgIDwvZGl2PlxyXG4gICAgIDwvZGl2PlxyXG4gICA8L2Rpdj5cclxuXHJcbiA8L2Rpdj5cclxuPC9kaXY+XHJcbjwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuXHJcbiAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICA8L2Rpdj5cclxuICAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgIFxyXG5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbjwvZGl2PlxyXG48L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48L3NlY3Rpb24+XHJcblxyXG5cclxuPG5nLXRlbXBsYXRlICN6b29tUG9wdXAgbGV0LW1vZGVsPlxyXG4gICAgPGRpdiBjbGFzcz1cInAtNCBtLTRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGJvcmRlci0wIHAtMCB3LTEwMCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1zdGFydFwiPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBIZWFkaW5nIC0tPlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZSBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBwb3B1cFR5cGUgPT09ICdhcHByb3ZlZCcgPyAnQXBwcm92ZScgOiAnUmVqZWN0JyB9fSBTZWxlY3RlZCBJbWFnZXNcclxuICAgICAgICAgICAgPC9oNT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRGVzY3JpcHRpb24gLS0+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMyB0ZXN0LWFwcHZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICBZb3UncmUgYWJvdXQgdG8ge3sgcG9wdXBUeXBlID09PSAnYXBwcm92ZWQnID8gJ0FwcHJvdmUnIDogJ1JlamVjdCcgfX0ge3sgdGhpcy5vdmVyYWxsU2VsZWN0ZWRJZHM/Lmxlbmd0aCA/ICB0aGlzLm92ZXJhbGxTZWxlY3RlZElkcz8ubGVuZ3RoIDogdGhpcy5wb3B1cFZhbHVlID9cclxuICAgICAgICAgICAgICAgdGhpcy5wb3B1cFZhbHVlOictLScgIH19IDxzcGFuIGNsYXNzPVwiZnctYm9sZFwiPnt7IHNlbGVjdGVkQ2F0ZWdvcmllc0xhYmVsIHwgdGl0bGVjYXNlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDwhLS0gQ291bnQgQm94IC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yaWVzPy5sZW5ndGggPT09IDFcIiBjbGFzcz1cInctMTAwIG1iLTRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1iLTJcIj5SZW1hcmtzIChPcHRpb25hbCk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcm93cz1cIjNcIiBbKG5nTW9kZWwpXT1cInJlbWFya3NcIj48L3RleHRhcmVhPlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgbWUtMlwiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJzdWJtaXRWYWx1ZShwb3B1cFR5cGUsIHBvcHVwdmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgcG9wdXBUeXBlID09PSAnYXBwcm92ZWQnID8gJ0FwcHJvdmUnIDogJ1JlamVjdCcgfX1cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjY2xvc2VQb3B1cCBsZXQtbW9kZWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwicC00IG0tNFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgYm9yZGVyLTAgcC0wIHctMTAwIGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0XCI+XHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgIENsb3NlIHRpY2tldFxyXG4gICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTMgdGVzdC1hcHB2YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgWW91IGFyZSBhYm91dCB0byBjbG9zZSB0aGUgdGlja2V0LCBBcmUgeW91IHN1cmUgd2FudCB0byBjb250aW51ZT9cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgbWUtMlwiIChjbGljayk9XCJjb25maXJtQ2xvc2VDYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJjb25maXJtQ2xvc2VUaWNrZXQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIENsb3NlIHRpY2tldFxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI1JlYXNzaWduVGlja2V0UG9wdXAgbGV0LW1vZGVsPlxyXG4gICAgPGRpdiBjbGFzcz1cInAtNCBtLTRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGJvcmRlci0wIHAtMCB3LTEwMCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1zdGFydFwiPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBIZWFkaW5nIC0tPlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZSBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICBSZS1Bc3NpZ24gVGlja2V0XHJcbiAgICAgICAgICAgIDwvaDU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIERlc2NyaXB0aW9uIC0tPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTMgdGVzdC1hcHB2YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgVHJhbnNmZXIgdGhlIHRpY2tldCB0byBhbm90aGVyIHVzZXJcclxuICAgICAgICAgICAgPC9wPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBDb3VudCBCb3ggLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIG15LTNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBtYi0yXCI+Q2hvb3NlIFVzZXI8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPHRlYW0tc2VsZWN0IFtpdGVtc109XCJyZXZpd2VyTGlzdFwiIFttdWx0aV09XCJmYWxzZVwiIFtzZWFyY2hGaWVsZF09XCIndXNlck5hbWUnXCIgW2lkRmllbGRdPVwiJ2VtYWlsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkKT1cInJldmlld2VyQ2hhbmdlKCRldmVudClcIiBbc2VsZWN0ZWRWYWx1ZXNdPVwiW3NlbGVjdGVkUmV2aWV3ZXJdXCI+PC90ZWFtLXNlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5gXHJcbiAgICAgICAgICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtZS0yXCIgKGNsaWNrKT1cImNhbmNlbGFzc2lnbigpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImFzc2lnblRpY2tldFZpZXcoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgUmUtQXNzaWduXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjaW1hZ2VQcmV2aWV3UG9wdXAgbGV0LW1vZGVsPlxyXG4gICAgPGRpdiBjbGFzcz1cInAtNCBtLTRcIj5cclxuICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBib3JkZXItMCBteS0yIHAtMCB3LTEwMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcblxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZSBtYi0yIG0tMFwiPnt7IHByZXZpZXdUaXRsZSB9fTwvaDU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIENsb3NlIEJ1dHRvbiAtLT5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1jbG9zZSBmcy00XCJcclxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb2RlbC5jbG9zZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBwb3NpdGlvbi1yZWxhdGl2ZSBtYi00XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgcG9zaXRpb24tYWJzb2x1dGUgbXMtMyBzdGFydC0wIHRvcC01MCB0cmFuc2xhdGUtbWlkZGxlLXlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwcmV2UHJldmlldygpXCIgW2Rpc2FibGVkXT1cInByZXZpZXdMaXN0Lmxlbmd0aCA8PSAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI1XCIgaGVpZ2h0PVwiMjVcIiB2aWV3Qm94PVwiMCAwIDI1IDI1XCIgZmlsbD1cIm5vbmVcIj5cclxuPHBhdGggZD1cIk0xNS41NjE1IDYuMjI0MjlMOS4zMzcyNCAxMi40NDg2TDE1LjU2MTUgMTguNjcyOVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyLjA3ODkxXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG48L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJnZXRQcmV2aWV3SW1hZ2VVcmwoKVwiIGNsYXNzPVwidy0xMDAgcm91bmRlZCBib3JkZXJcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBteS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYy10aXRsZSBtcy0yIG15LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhbmdvIElEOiB7eyBjdXJyZW50UHJldmlld0l0ZW0udGVtcElkIH19XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnZXRBY3Rpb24oY3VycmVudFByZXZpZXdJdGVtLCAncmV2aWV3Jyk/LmFjdGlvbiA9PT0gJ2FwcHJvdmVkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0yXCI+PHN2ZyBzdHlsZT1cIndpZHRoOiAyMHB4O1xyXG4gICAgaGVpZ2h0OiAyMHB4O1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDEwIDExXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeT1cIjAuNVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHJ4PVwiNVwiIGZpbGw9XCIjRDFGQURGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjEyMjIgMy41NzkxOUw0LjEzODg3IDYuNDU4MzZMMy4zNDcyIDUuNjEyNTNDMy4yMDEzNyA1LjQ3NTAzIDIuOTcyMiA1LjQ2NjY5IDIuODA1NTMgNS41ODMzNkMyLjY0MzAzIDUuNzA0MTkgMi41OTcyIDUuOTE2NjkgMi42OTcyIDYuMDg3NTNMMy42MzQ3IDcuNjEyNTNDMy43MjYzNyA3Ljc1NDE5IDMuODg0NyA3Ljg0MTY5IDQuMDYzODcgNy44NDE2OUM0LjIzNDcgNy44NDE2OSA0LjM5NzIgNy43NTQxOSA0LjQ4ODg3IDcuNjEyNTNDNC42Mzg4NyA3LjQxNjY5IDcuNTAxMzcgNC4wMDQxOSA3LjUwMTM3IDQuMDA0MTlDNy44NzYzNyAzLjYyMDg2IDcuNDIyMiAzLjI4MzM2IDcuMTIyMiAzLjU3NTAzVjMuNTc5MTlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMTJCNzZBXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2V0QWN0aW9uKGN1cnJlbnRQcmV2aWV3SXRlbSwgJ3JldmlldycpPy5hY3Rpb24gPT09ICdyZWplY3RlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtMlwiPjxzdmcgc3R5bGU9XCJ3aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTQyOF81OTQ4NClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00LjUyOTYxIDEuNUg4LjY2OTYxTDExLjU5OTYgNC40M1Y4LjU3TDguNjY5NjEgMTEuNUg0LjUyOTYxTDEuNTk5NjEgOC41N1Y0LjQzTDQuNTI5NjEgMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGRUU0RTJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDk5NjEgNUw1LjA5OTYxIDhNNS4wOTk2MSA1TDguMDk5NjEgOE00LjUyOTYxIDEuNUg4LjY2OTYxTDExLjU5OTYgNC40M1Y4LjU3TDguNjY5NjEgMTEuNUg0LjUyOTYxTDEuNTk5NjEgOC41N1Y0LjQzTDQuNTI5NjEgMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0Q5MkQyMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNDI4XzU5NDg0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDAuNTk5NjA5IDAuNSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MtdmFsdWUgbXMtMlwiPkVudHJ5IFRpbWU6IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGb3JtYXR0ZWRFbnRyeVRpbWUoY3VycmVudFByZXZpZXdJdGVtLmVudHJ5VGltZSkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgbXQtMiB0ZXh0LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdldEFjdGlvbihjdXJyZW50UHJldmlld0l0ZW0sICdhcHByb3ZlJyk/LmFjdGlvbiA9PT0gJ2FwcHJvdmVkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0MlwiIGhlaWdodD1cIjQyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiByeD1cIjEyXCIgZmlsbD1cIiNEMUZBREZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDg2Xzk0MDUxKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05LjUgMTdIOEM3LjczNDc4IDE3IDcuNDgwNDMgMTYuODk0NiA3LjI5Mjg5IDE2LjcwNzFDNy4xMDUzNiAxNi41MTk2IDcgMTYuMjY1MiA3IDE2VjEyLjVDNyAxMi4yMzQ4IDcuMTA1MzYgMTEuOTgwNCA3LjI5Mjg5IDExLjc5MjlDNy40ODA0MyAxMS42MDU0IDcuNzM0NzggMTEuNSA4IDExLjVIOS41TTEzIDEwLjVWOC41QzEzIDguMTAyMTggMTIuODQyIDcuNzIwNjQgMTIuNTYwNyA3LjQzOTM0QzEyLjI3OTQgNy4xNTgwNCAxMS44OTc4IDcgMTEuNSA3TDkuNSAxMS41VjE3SDE1LjE0QzE1LjM4MTIgMTcuMDAyNyAxNS42MTUyIDE2LjkxODIgMTUuNzk5IDE2Ljc2MkMxNS45ODI3IDE2LjYwNTggMTYuMTAzOCAxNi4zODg1IDE2LjE0IDE2LjE1TDE2LjgzIDExLjY1QzE2Ljg1MTggMTEuNTA2NyAxNi44NDIxIDExLjM2MDMgMTYuODAxNyAxMS4yMjExQzE2Ljc2MTMgMTEuMDgxOSAxNi42OTExIDEwLjk1MzEgMTYuNTk1OSAxMC44NDM4QzE2LjUwMDggMTAuNzM0NCAxNi4zODMgMTAuNjQ3IDE2LjI1MDggMTAuNTg3NkMxNi4xMTg1IDEwLjUyODMgMTUuOTc1IDEwLjQ5ODQgMTUuODMgMTAuNUgxM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAzOTg1NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF80ODZfOTQwNTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSg2IDYpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdldEFjdGlvbihjdXJyZW50UHJldmlld0l0ZW0sICdhcHByb3ZlJyk/LmFjdGlvbiA9PT0gJ3JlamVjdGVkJ1wiPjxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI0MlwiIGhlaWdodD1cIjQyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiByeD1cIjEyXCIgZmlsbD1cIiNGRUU0RTJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDg2Xzk0MDkwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNC41MDE1IDcuMDAwMDZIMTUuODM2NUMxNi4xMTk1IDYuOTk1MDUgMTYuMzk0NCA3LjA5NDEzIDE2LjYwOTIgNy4yNzg0N0MxNi44MjM5IDcuNDYyODEgMTYuOTYzNSA3LjcxOTU5IDE3LjAwMTUgOC4wMDAwNlYxMS41MDAxQzE2Ljk2MzUgMTEuNzgwNSAxNi44MjM5IDEyLjAzNzMgMTYuNjA5MiAxMi4yMjE2QzE2LjM5NDQgMTIuNDA2IDE2LjExOTUgMTIuNTA1MSAxNS44MzY1IDEyLjUwMDFIMTQuNTAxNU0xMS4wMDE1IDEzLjUwMDFWMTUuNTAwMUMxMS4wMDE1IDE1Ljg5NzkgMTEuMTU5NSAxNi4yNzk0IDExLjQ0MDggMTYuNTYwN0MxMS43MjIxIDE2Ljg0MiAxMi4xMDM3IDE3LjAwMDEgMTIuNTAxNSAxNy4wMDAxTDE0LjUwMTUgMTIuNTAwMVY3LjAwMDA2SDguODYxNDhDOC42MjAzMiA2Ljk5NzMzIDguMzg2MjkgNy4wODE4NiA4LjIwMjUzIDcuMjM4MDZDOC4wMTg3NiA3LjM5NDI2IDcuODk3NjQgNy42MTE2MSA3Ljg2MTQ4IDcuODUwMDZMNy4xNzE0OCAxMi4zNTAxQzcuMTQ5NzMgMTIuNDkzNCA3LjE1OTM5IDEyLjYzOTcgNy4xOTk4MSAxMi43Nzg5QzcuMjQwMjMgMTIuOTE4MSA3LjMxMDQzIDEzLjA0NjkgNy40MDU1NSAxMy4xNTYzQzcuNTAwNjcgMTMuMjY1NyA3LjYxODQ0IDEzLjM1MzEgNy43NTA2OSAxMy40MTI0QzcuODgyOTUgMTMuNDcxOCA4LjAyNjUzIDEzLjUwMTcgOC4xNzE0OCAxMy41MDAxSDExLjAwMTVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDg2Xzk0MDkwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNiA2KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBEdXBsaWNhdGUgUmVhc29uIC0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZHVwbGljYXRlLXJlYXNvbiBtcy0yIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiPnt7IGN1cnJlbnRQcmV2aWV3SXRlbS5yZWFzb24gfX08L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBwb3NpdGlvbi1hYnNvbHV0ZSBtZS0zIGVuZC0wIHRvcC01MCB0cmFuc2xhdGUtbWlkZGxlLXlcIiAoY2xpY2spPVwibmV4dFByZXZpZXcoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInByZXZpZXdMaXN0Lmxlbmd0aCA8PSAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNVwiIGhlaWdodD1cIjI1XCIgdmlld0JveD1cIjAgMCAyNSAyNVwiIGZpbGw9XCJub25lXCI+XHJcbjxwYXRoIGQ9XCJNOS4zMzU5NCAxOC42NzMyTDE1LjU2MDIgMTIuNDQ4OUw5LjMzNTk0IDYuMjI0NjFcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMi4wNzg5MVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNhblNob3dQcmV2aWV3QWN0aW9ucyhjdXJyZW50UHJldmlld0l0ZW0pXCIgY2xhc3M9XCJ3LTEwMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtZS0yXCIgKGNsaWNrKT1cInJlamVjdGVkUG9wdXAoJ3JlamVjdGVkJyxjdXJyZW50UHJldmlld0l0ZW0pXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHt7IChzZWxlY3RlZFJvbGUgPT09ICdhcHByb3ZlcicgfHwgc2VsZWN0ZWRSb2xlID09PSAncmV2aWV3ZXInKSA/ICdEZW55JyA6ICdSZWplY3QnXHJcbiAgICAgICAgICAgICAgICAgICAgfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiYXBwcm92ZWRQb3B1cCgnYXBwcm92ZWQnLGN1cnJlbnRQcmV2aWV3SXRlbSlcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAge3sgKHNlbGVjdGVkUm9sZSA9PT0gJ2FwcHJvdmVyJyB8fCBzZWxlY3RlZFJvbGUgPT09ICdyZXZpZXdlcicpID8gJ0FwcHJvdmUnIDpcclxuICAgICAgICAgICAgICAgICAgICAnQWNjZXB0JyB9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICBcclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG48bmctdGVtcGxhdGUgI2ludGVybmFsdGlja2V0IGxldC1tb2RhbD5cclxuICAgIDxkaXYgY2xhc3M9XCJoLWF1dG8gcC0xMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZVwiPlN0YXJ0IGF1ZGl0PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXN1YlwiPlBsZWFzZSBzZWxlY3QgYSBzdG9yZSBhbmQgZGF0ZSByYW5nZSB0byBzdGFydCBhdWRpdDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXktM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTcgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj5TdG9yZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bGliLXNlbGVjdCBbaXRlbXNdPVwic3RvcmVMaXN0XCIgW211bHRpXT1cImZhbHNlXCIgW3NlYXJjaEZpZWxkXT1cIidzdG9yZU5hbWUnXCIgW2lkRmllbGRdPVwiJ3N0b3JlSWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic3RvcmVDaGFuZ2UoJGV2ZW50KVwiIFtzZWxlY3RlZFZhbHVlc109XCJbc2VsZWN0ZWRTdG9yZV1cIj48L2xpYi1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTUgbXQtN1wiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLTEgcG9zaXRpb24tYWJzb2x1dGUgbXMtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMy4zMzMzIDEuNjY2NjNWNC45OTk5Nk02LjY2NjY3IDEuNjY2NjNWNC45OTk5Nk0yLjUgOC4zMzMyOUgxNy41TTQuMTY2NjcgMy4zMzMyOUgxNS44MzMzQzE2Ljc1MzggMy4zMzMyOSAxNy41IDQuMDc5NDggMTcuNSA0Ljk5OTk2VjE2LjY2NjZDMTcuNSAxNy41ODcxIDE2Ljc1MzggMTguMzMzMyAxNS44MzMzIDE4LjMzMzNINC4xNjY2N0MzLjI0NjE5IDE4LjMzMzMgMi41IDE3LjU4NzEgMi41IDE2LjY2NjZWNC45OTk5NkMyLjUgNC4wNzk0OCAzLjI0NjE5IDMuMzMzMjkgNC4xNjY2NyAzLjMzMzI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZngtZGF0ZS1yYW5nZSBmb3JtLWNvbnRyb2wgcHMtMTRcIiBzdHlsZT1cIndpZHRoOjE2NXB4ICFpbXBvcnRhbnRcIiB0eXBlPVwidGV4dFwiIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5neERhdGVyYW5nZXBpY2tlck1kIFtzaW5nbGVEYXRlUGlja2VyXT1cInRydWVcIiBbZHJvcHNdPVwiJ2Rvd24nXCIgW29wZW5zXT1cIidsZWZ0J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbHdheXNTaG93Q2FsZW5kYXJzXT1cImZhbHNlXCIgW2tlZXBDYWxlbmRhck9wZW5pbmdXaXRoUmFuZ2VdPVwidHJ1ZVwiIFtzaG93Q2FuY2VsXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRGF0ZVJhbmdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXJ0RGF0ZUNoYW5nZWQpPVwib25TdGFydERhdGVDaGFuZ2UoJGV2ZW50KVwiIFtpc0N1c3RvbURhdGVdPVwiaXNDdXN0b21EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2xvY2FsZV09XCJ7IGZvcm1hdDogJ0RELU1NLVlZWVknLCBmaXJzdERheTogMSwgbW9udGhOYW1lczogWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ10gfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlc1VwZGF0ZWQpPVwiZGF0ZWNoYW5nZSgkZXZlbnQpXCIgbmFtZT1cImRhdGVyYW5nZVwiIFtyZWFkb25seV09XCJ0cnVlXCIgW2F1dG9BcHBseV09XCJ0cnVlXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiICpuZ0lmPVwiZm9vdGZhbGxjb3VudD4wXCI+XHJcbiAgICAgICAgICAgIDxkaXY+e3tmb290ZmFsbGNvdW50fX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIj5Ub3RhbCBmb290ZmFsbDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgbXQtNVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IG10LTVcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctNTAgbWUtMlwiIChjbGljayk9XCJtb2RhbC5jbG9zZSgnaXNEZW5pZWQnKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZUF1ZGl0JiZmb290ZmFsbGNvdW50PjBcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTUwIG1zLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb2RhbC5jbG9zZSgnaXNDb25maXJtZWQnKVwiPnN0YXJ0PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIFNpbXBsZSBvdmVybGF5IG1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwiaW1hZ2VzLW1vZGFsLWJhY2tkcm9wXCIgKm5nSWY9XCJzaG93SW1hZ2VzTW9kYWxcIj5cclxuICA8ZGl2IGNsYXNzPVwiaW1hZ2VzLW1vZGFsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydCBtYi0zXCI+XHJcbiAgPGRpdj5cclxuICAgIDxoNiBjbGFzcz1cIm1iLTFcIj5BbGwgSW1hZ2VzPC9oNj5cclxuXHJcbiAgICA8IS0tIGVtYWlsIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInNtYWxsIGZ3LXNlbWlib2xkXCI+XHJcbiAgICAgIHt7IHNlbGVjdGVkQ29tbWVudD8uY3JlYXRlZEJ5RW1haWwgfX1cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gdGltZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWFsbCB0ZXh0LW11dGVkXCIgKm5nSWY9XCJzZWxlY3RlZENvbW1lbnQ/LmNyZWF0ZWRBdFwiPlxyXG4gICAgICB7eyBzZWxlY3RlZENvbW1lbnQ/LmNyZWF0ZWRBdCB8IGRhdGU6ICdoaDptbTpzcyBhIC0gZGQgTU1NIHl5eXknIH19XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIG9wdGlvbmFsIGNvbW1lbnQgdGV4dCB1bmRlciB0aW1lIC0tPlxyXG4gICAgPHAgY2xhc3M9XCJtYi0wIG10LTJcIiAqbmdJZj1cInNlbGVjdGVkQ29tbWVudD8ubWVzc2FnZVwiPlxyXG4gICAgICB7eyBzZWxlY3RlZENvbW1lbnQ/Lm1lc3NhZ2UgfX1cclxuICAgIDwvcD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGJ1dHRvblxyXG4gICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICBjbGFzcz1cImJ0bi1jbG9zZSBtcy0zXCJcclxuICAgIChjbGljayk9XCJjbG9zZUltYWdlc1BvcHVwKClcIj5cclxuICA8L2J1dHRvbj5cclxuPC9kaXY+XHJcblxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IGQtZmxleCBmbGV4LXdyYXAgZ2FwLTNcIj5cclxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaW1nIG9mIHNlbGVjdGVkSW1hZ2VzRm9yUG9wdXBcIiBjbGFzcz1cInRhbmdvLWNhcmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFuZ28taW1hZ2VcIlxyXG4gICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRJbWFnZV09XCIndXJsKCcrIGltYWdlVXJsICsgaW1nLmZpbGVQYXRoICsgJyknXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFuZ28tbWV0YSBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICBUYW5nbyBJRDoge3sgaW1nLnRlbXBJZCB9fVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gc3RhdHVzIGRvdHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImltZy5zdGF0dXMgPT09ICdhcHByb3ZlZCdcIj48c3ZnIHN0eWxlPVwid2lkdGg6IDIwcHg7XHJcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDEwIDExXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB5PVwiMC41XCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgcng9XCI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNEMUZBREZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjEyMjIgMy41NzkxOUw0LjEzODg3IDYuNDU4MzZMMy4zNDcyIDUuNjEyNTNDMy4yMDEzNyA1LjQ3NTAzIDIuOTcyMiA1LjQ2NjY5IDIuODA1NTMgNS41ODMzNkMyLjY0MzAzIDUuNzA0MTkgMi41OTcyIDUuOTE2NjkgMi42OTcyIDYuMDg3NTNMMy42MzQ3IDcuNjEyNTNDMy43MjYzNyA3Ljc1NDE5IDMuODg0NyA3Ljg0MTY5IDQuMDYzODcgNy44NDE2OUM0LjIzNDcgNy44NDE2OSA0LjM5NzIgNy43NTQxOSA0LjQ4ODg3IDcuNjEyNTNDNC42Mzg4NyA3LjQxNjY5IDcuNTAxMzcgNC4wMDQxOSA3LjUwMTM3IDQuMDA0MTlDNy44NzYzNyAzLjYyMDg2IDcuNDIyMiAzLjI4MzM2IDcuMTIyMiAzLjU3NTAzVjMuNTc5MTlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxMkI3NkFcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaW1nLnN0YXR1cyA9PT0gJ3JlamVjdGVkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PHN2ZyBzdHlsZT1cIndpZHRoOiAyMHB4O1xyXG4gICAgICAgIGhlaWdodDogMjBweDtcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxMyAxM1wiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNDI4XzU5NDg0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00LjUyOTYxIDEuNUg4LjY2OTYxTDExLjU5OTYgNC40M1Y4LjU3TDguNjY5NjEgMTEuNUg0LjUyOTYxTDEuNTk5NjEgOC41N1Y0LjQzTDQuNTI5NjEgMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0ZFRTRFMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDk5NjEgNUw1LjA5OTYxIDhNNS4wOTk2MSA1TDguMDk5NjEgOE00LjUyOTYxIDEuNUg4LjY2OTYxTDExLjU5OTYgNC40M1Y4LjU3TDguNjY5NjEgMTEuNUg0LjUyOTYxTDEuNTk5NjEgOC41N1Y0LjQzTDQuNTI5NjEgMS41WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRDkyRDIwXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNDI4XzU5NDg0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgwLjU5OTYwOSAwLjUpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBFbnRyeSB0aW1lOiB7eyBpbWcuZW50cnlUaW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|