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.
Files changed (44) hide show
  1. package/esm2022/lib/components/audit-mapping-list/audit-mapping-list.component.mjs +486 -0
  2. package/esm2022/lib/components/audit-report-popup/audit-report-popup.component.mjs +358 -0
  3. package/esm2022/lib/components/audit-retag/audit-retag.component.mjs +457 -0
  4. package/esm2022/lib/components/custom-select/custom-select.component.mjs +174 -0
  5. package/esm2022/lib/components/filter-options/filter-options.component.mjs +41 -0
  6. package/esm2022/lib/components/footfall-dic/footfall-dic.component.mjs +374 -196
  7. package/esm2022/lib/components/footfall-dicview/footfall-dicview.component.mjs +1014 -0
  8. package/esm2022/lib/components/footfall-popup/footfall-popup.component.mjs +15 -0
  9. package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +3 -3
  10. package/esm2022/lib/components/remove-audit/remove-audit.component.mjs +80 -0
  11. package/esm2022/lib/components/start-audit/start-audit.component.mjs +742 -0
  12. package/esm2022/lib/components/tango-manage-tickets/tango-manage-tickets.component.mjs +7 -3
  13. package/esm2022/lib/components/ticket-footfall-new/ticket-footfall-new.component.mjs +2214 -0
  14. package/esm2022/lib/components/ticketclosepopup/ticketclosepopup.component.mjs +43 -0
  15. package/esm2022/lib/components/tickets/tickets.component.mjs +62 -8
  16. package/esm2022/lib/components/viewcategory/viewcategory.component.mjs +89 -0
  17. package/esm2022/lib/services/audit.service.mjs +88 -0
  18. package/esm2022/lib/services/ticket.service.mjs +128 -33
  19. package/esm2022/lib/services/timer.service.mjs +84 -0
  20. package/esm2022/lib/tango-manage-tickets-routing.module.mjs +22 -2
  21. package/esm2022/lib/tango-manage-tickets.module.mjs +57 -5
  22. package/fesm2022/tango-app-ui-manage-tickets.mjs +6466 -312
  23. package/fesm2022/tango-app-ui-manage-tickets.mjs.map +1 -1
  24. package/lib/components/audit-mapping-list/audit-mapping-list.component.d.ts +73 -0
  25. package/lib/components/audit-metrics/audit-metrics.component.d.ts +1 -1
  26. package/lib/components/audit-report-popup/audit-report-popup.component.d.ts +47 -0
  27. package/lib/components/audit-retag/audit-retag.component.d.ts +59 -0
  28. package/lib/components/custom-select/custom-select.component.d.ts +34 -0
  29. package/lib/components/filter-options/filter-options.component.d.ts +15 -0
  30. package/lib/components/footfall-dic/footfall-dic.component.d.ts +23 -8
  31. package/lib/components/footfall-dicview/footfall-dicview.component.d.ts +132 -0
  32. package/lib/components/footfall-popup/footfall-popup.component.d.ts +8 -0
  33. package/lib/components/remove-audit/remove-audit.component.d.ts +16 -0
  34. package/lib/components/start-audit/start-audit.component.d.ts +86 -0
  35. package/lib/components/tango-manage-tickets/tango-manage-tickets.component.d.ts +1 -0
  36. package/lib/components/ticket-footfall-new/ticket-footfall-new.component.d.ts +256 -0
  37. package/lib/components/ticketclosepopup/ticketclosepopup.component.d.ts +15 -0
  38. package/lib/components/tickets/tickets.component.d.ts +4 -0
  39. package/lib/components/viewcategory/viewcategory.component.d.ts +16 -0
  40. package/lib/services/audit.service.d.ts +36 -0
  41. package/lib/services/ticket.service.d.ts +25 -7
  42. package/lib/services/timer.service.d.ts +22 -0
  43. package/lib/tango-manage-tickets.module.d.ts +21 -5
  44. 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