tango-app-ui-analyse-traffic 3.8.0-alpha.62 → 3.8.0-alpha.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
- import { Component, Input, ViewChild } from '@angular/core';
1
+ import { Component, Input, ViewChild, } from "@angular/core";
2
2
  import { Subject, takeUntil } from "rxjs";
3
- import * as XLSX from 'xlsx';
4
- import { DatePipe } from '@angular/common';
3
+ import * as XLSX from "xlsx";
4
+ import { DatePipe } from "@angular/common";
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "@angular/forms";
7
7
  import * as i2 from "../../services/traffic.service";
@@ -36,7 +36,7 @@ export class AddNobComponent {
36
36
  this.destroy$.complete();
37
37
  }
38
38
  clientId;
39
- maxDate = '';
39
+ maxDate = "";
40
40
  isEditEnabled = false;
41
41
  clientData;
42
42
  ngOnInit() {
@@ -46,16 +46,16 @@ export class AddNobComponent {
46
46
  this.clientData = client;
47
47
  this.getNobStoreList(data.client);
48
48
  this.setMaxDate();
49
- if (this.type === 'editView' || this.type === 'view') {
49
+ if (this.type === "editView" || this.type === "view") {
50
50
  this.storeName = this.viewData.storeName;
51
51
  this.storeId = this.viewData.storeId;
52
52
  this.storeCode = this.viewData.storeCode;
53
53
  this.dateValue = this.viewData.nobDate
54
- ? new Date(this.viewData.nobDate).toISOString().split('T')[0]
54
+ ? new Date(this.viewData.nobDate).toISOString().split("T")[0]
55
55
  : null;
56
56
  this.nobCount = this.viewData.nobCount;
57
57
  this.zoneList = this.viewData.zonewisenob; // keep values
58
- if (this.type === 'editView') {
58
+ if (this.type === "editView") {
59
59
  this.isEditEnabled = true;
60
60
  }
61
61
  else {
@@ -75,15 +75,16 @@ export class AddNobComponent {
75
75
  }
76
76
  storeList = [];
77
77
  getNobStoreList(client) {
78
- this.service.getNOBStoreList(client)?.pipe(takeUntil(this.destroy$))
78
+ this.service
79
+ .getNOBStoreList(client)
80
+ ?.pipe(takeUntil(this.destroy$))
79
81
  .subscribe({
80
82
  next: (res) => {
81
83
  if (res && res.code === 200) {
82
84
  this.storeList = res.data.result;
83
85
  }
84
86
  },
85
- error: (err) => {
86
- }
87
+ error: (err) => { },
87
88
  });
88
89
  }
89
90
  storeName;
@@ -94,31 +95,31 @@ export class AddNobComponent {
94
95
  zoneShow = false;
95
96
  onNOBStoreSelect(event, type) {
96
97
  if (!event) {
97
- this.ts.getErrorToast('storeName or storeId is undefined or invalid');
98
+ this.ts.getErrorToast("storeName or storeId is undefined or invalid");
98
99
  return;
99
100
  }
100
- if (type === 'storeName') {
101
+ if (type === "storeName") {
101
102
  this.storeName = event.storeName;
102
- const store = this.storeList.find(store => store.storeName === event.storeName);
103
+ const store = this.storeList.find((store) => store.storeName === event.storeName);
103
104
  if (store) {
104
105
  this.storeId = store.storeId;
105
106
  this.storeCode = store.storeCode;
106
107
  }
107
108
  else {
108
- this.storeId = '';
109
- this.storeCode = '';
109
+ this.storeId = "";
110
+ this.storeCode = "";
110
111
  }
111
112
  }
112
- else if (type === 'storeId') {
113
+ else if (type === "storeId") {
113
114
  this.storeId = event.storeId;
114
- const store = this.storeList.find(store => store.storeId === event.storeId);
115
+ const store = this.storeList.find((store) => store.storeId === event.storeId);
115
116
  if (store) {
116
117
  this.storeName = store.storeName;
117
118
  this.storeCode = store.storeCode;
118
119
  }
119
120
  else {
120
- this.storeName = '';
121
- this.storeCode = '';
121
+ this.storeName = "";
122
+ this.storeCode = "";
122
123
  }
123
124
  }
124
125
  this.zoneShow = true;
@@ -136,20 +137,20 @@ export class AddNobComponent {
136
137
  const today = new Date();
137
138
  const yesterday = new Date(today);
138
139
  yesterday.setDate(today.getDate() - 1); // Set the max date to yesterday
139
- this.dateValue = yesterday.toISOString().split('T')[0];
140
+ this.dateValue = yesterday.toISOString().split("T")[0];
140
141
  // Format the date as yyyy-MM-dd
141
- this.maxDate = yesterday.toISOString().split('T')[0];
142
+ this.maxDate = yesterday.toISOString().split("T")[0];
142
143
  }
143
144
  onDateChange(event) {
144
145
  const selectedDate = event.target.value;
145
146
  if (selectedDate > this.maxDate) {
146
- this.ts.getErrorToast('Invalid date selected!');
147
+ this.ts.getErrorToast("Invalid date selected!");
147
148
  }
148
149
  }
149
150
  cancel() {
150
- this.activeModal.close('close');
151
+ this.activeModal.close("close");
151
152
  }
152
- erroShow = '';
153
+ erroShow = "";
153
154
  isSubmitting = false;
154
155
  onSubmit() {
155
156
  // ⛔ STOP if already submitting
@@ -159,7 +160,7 @@ export class AddNobComponent {
159
160
  const overallNob = Number(this.nobCount) || 0;
160
161
  const zoneTotal = this.zonewisenob.reduce((sum, z) => sum + (Number(z.nobCount) || 0), 0);
161
162
  if (zoneTotal > overallNob) {
162
- this.erroShow = 'Zone-wise NoB cannot exceed overall NoB count';
163
+ this.erroShow = "Zone-wise NoB cannot exceed overall NoB count";
163
164
  return;
164
165
  }
165
166
  // ✅ LOCK BUTTON
@@ -170,35 +171,36 @@ export class AddNobComponent {
170
171
  storeCode: this.storeCode ? this.storeCode : this.storeId,
171
172
  nobDate: this.dateValue,
172
173
  nobCount: Number(this.nobCount),
173
- zonewisenob: this.zonewisenob
174
- }
174
+ zonewisenob: this.zonewisenob,
175
+ },
175
176
  ],
176
- clientId: this.clientId
177
+ clientId: this.clientId,
177
178
  };
178
- this.service.getNOBDataList(obj)
179
+ this.service
180
+ .getNOBDataList(obj)
179
181
  ?.pipe(takeUntil(this.destroy$))
180
182
  .subscribe({
181
183
  next: (res) => {
182
184
  if (res?.code === 200) {
183
185
  this.ts.getSuccessToast(res.message);
184
- this.activeModal.close('submit');
186
+ this.activeModal.close("submit");
185
187
  }
186
188
  else {
187
189
  this.isSubmitting = false;
188
- this.ts.getErrorToast('Unexpected response format');
190
+ this.ts.getErrorToast("Unexpected response format");
189
191
  }
190
192
  },
191
193
  error: (err) => {
192
194
  this.isSubmitting = false;
193
- this.ts.getErrorToast(err?.error?.error || 'Something went wrong');
195
+ this.ts.getErrorToast(err?.error?.error || "Something went wrong");
194
196
  },
195
197
  complete: () => {
196
198
  // 🔓 UNLOCK BUTTON
197
199
  this.isSubmitting = false;
198
- }
200
+ },
199
201
  });
200
202
  }
201
- typeNOB = 'single';
203
+ typeNOB = "single";
202
204
  nobStore(type) {
203
205
  this.typeNOB = type;
204
206
  }
@@ -216,66 +218,69 @@ export class AddNobComponent {
216
218
  try {
217
219
  const binaryData = e.target.result;
218
220
  const workbook = XLSX.read(binaryData, {
219
- type: 'binary'
221
+ type: "binary",
220
222
  });
221
223
  const sheetName = workbook.SheetNames[0];
222
224
  const sheet = workbook.Sheets[sheetName];
225
+ if (sheetName !== "NOB") {
226
+ this.ts.getErrorToast("Please upload a valid NOB Excel file");
227
+ this.resetFileInput();
228
+ return;
229
+ }
223
230
  const sheetData = XLSX.utils.sheet_to_json(sheet, {
224
231
  header: 1,
225
- defval: null
232
+ defval: null,
226
233
  });
227
234
  if (!sheetData || sheetData.length < 2) {
228
- this.ts.getErrorToast('Excel file is empty');
235
+ this.ts.getErrorToast("Excel file is empty");
229
236
  return;
230
237
  }
231
- const STORE_ID_HEADERS = ['storeid', 'store id', 'StoreId'];
232
- const DATE_HEADERS = ['date', 'nobdate', 'nob date', 'NOBDate'];
233
- const NOB_HEADERS = ['nobcount', 'overallnobcount', 'overall nob count', 'NOBCount'];
234
- const normalize = (h) => String(h ?? '')
235
- .toLowerCase()
236
- .replace(/\s+/g, '');
238
+ const STORE_ID_HEADERS = ["storeid", "store id", "StoreId", "Store Id"];
239
+ const DATE_HEADERS = [
240
+ "date",
241
+ "nobdate",
242
+ "nob date",
243
+ "NOBDate",
244
+ "NoB Date",
245
+ ];
246
+ const NOB_HEADERS = [
247
+ "nobcount",
248
+ "overallnobcount",
249
+ "overall nob count",
250
+ "NOBCount",
251
+ "Overall NoB Count",
252
+ ];
237
253
  const rawHeaders = sheetData[0];
238
- const headers = rawHeaders.map(h => normalize(h));
254
+ const headers = rawHeaders.map((h) => h);
239
255
  const isStoreValid = STORE_ID_HEADERS.includes(headers[0]);
240
256
  const isDateValid = DATE_HEADERS.includes(headers[1]);
241
257
  const isNobValid = NOB_HEADERS.includes(headers[2]);
242
258
  if (!isStoreValid || !isDateValid || !isNobValid) {
243
- this.ts.getErrorToast('Invalid Excel file. First columns must be Store Id, NoB Date, Overall NoB Count');
259
+ this.ts.getErrorToast("Invalid Excel file. First columns must be Store Id, NoB Date, Overall NoB Count");
244
260
  return;
245
261
  }
246
262
  const rows = sheetData.slice(1);
247
- // ===============================
248
- // 2️⃣ PROCESS ROWS
249
- // ===============================
250
263
  const bills = rows
251
264
  .map((row, rowIndex) => {
252
- // 🔹 SKIP COMPLETELY EMPTY ROWS (SAFE)
253
- const isEmptyRow = row.every(cell => cell === null ||
265
+ const isEmptyRow = row.every((cell) => cell === null ||
254
266
  cell === undefined ||
255
- (typeof cell === 'string' && cell.trim() === ''));
267
+ (typeof cell === "string" && cell === ""));
256
268
  if (isEmptyRow)
257
269
  return null;
258
- // ===============================
259
- // 3️⃣ STORE CODE
260
- // ===============================
261
- const storeId = String(row[0] ?? '').trim();
270
+ const storeId = String(row[0] ?? "");
262
271
  if (!storeId) {
263
272
  throw new Error(`Missing Store Code at row ${rowIndex + 2}`);
264
273
  }
265
- // ===============================
266
- // 4️⃣ DATE
267
- // ===============================
268
274
  let nobDate = row[1];
269
- if (nobDate === null || nobDate === undefined || nobDate === '') {
275
+ if (nobDate === null || nobDate === undefined || nobDate === "") {
270
276
  throw new Error(`Missing Date at row ${rowIndex + 2}`);
271
277
  }
272
- if (typeof nobDate === 'number') {
278
+ if (typeof nobDate === "number") {
273
279
  nobDate = this.convertExcelDate(nobDate);
274
280
  }
275
281
  else if (nobDate instanceof Date) {
276
- // ok
277
282
  }
278
- else if (typeof nobDate === 'string') {
283
+ else if (typeof nobDate === "string") {
279
284
  const parsed = new Date(nobDate);
280
285
  if (isNaN(parsed.getTime())) {
281
286
  throw new Error(`Invalid Date format at row ${rowIndex + 2}`);
@@ -285,26 +290,28 @@ export class AddNobComponent {
285
290
  else {
286
291
  throw new Error(`Invalid Date format at row ${rowIndex + 2}`);
287
292
  }
288
- // ===============================
289
- // 5️⃣ NoB COUNT
290
- // ===============================
293
+ const MIN_NOB = 0;
294
+ const MAX_NOB = 9999;
291
295
  let nobCount = row[2];
292
- if (nobCount === null || nobCount === undefined || nobCount === '') {
296
+ if (nobCount === null ||
297
+ nobCount === undefined ||
298
+ nobCount === "") {
293
299
  throw new Error(`Missing NoB count at row ${rowIndex + 2}`);
294
300
  }
295
301
  nobCount = Number(nobCount);
296
302
  if (isNaN(nobCount)) {
297
303
  throw new Error(`Invalid NoB count at row ${rowIndex + 2}`);
298
304
  }
299
- // ===============================
300
- // 6️⃣ ZONE WISE NoB
301
- // ===============================
302
- const zonewisenob = headers.slice(3)
305
+ if (nobCount < MIN_NOB || nobCount > MAX_NOB) {
306
+ throw new Error(`NoB count must be between ${MIN_NOB} and ${MAX_NOB} at row`);
307
+ }
308
+ const zonewisenob = headers
309
+ .slice(3)
303
310
  .map((zoneName, index) => {
304
311
  const raw = row[index + 3];
305
312
  if (raw === null ||
306
313
  raw === undefined ||
307
- (typeof raw === 'string' && raw.trim() === '')) {
314
+ (typeof raw === "string" && raw === "")) {
308
315
  return null;
309
316
  }
310
317
  const value = Number(raw);
@@ -313,7 +320,7 @@ export class AddNobComponent {
313
320
  }
314
321
  return {
315
322
  zoneName,
316
- nobCount: value
323
+ nobCount: value,
317
324
  };
318
325
  })
319
326
  .filter(Boolean);
@@ -321,34 +328,28 @@ export class AddNobComponent {
321
328
  if (zoneTotal > nobCount) {
322
329
  throw new Error(`Zone-wise NoB cannot exceed overall NoB (Row ${rowIndex + 2})`);
323
330
  }
324
- // ===============================
325
- // 7️⃣ FINAL OBJECT
326
- // ===============================
327
331
  return {
328
332
  storeCode: storeId,
329
- nobDate: this.datePipe.transform(nobDate, 'yyyy-MM-dd'),
333
+ nobDate: this.datePipe.transform(nobDate, "yyyy-MM-dd"),
330
334
  nobCount,
331
- zonewisenob
335
+ zonewisenob,
332
336
  };
333
337
  })
334
338
  .filter(Boolean);
335
339
  if (!bills.length) {
336
- this.ts.getErrorToast('No valid rows found in Excel');
340
+ this.ts.getErrorToast("No valid rows found in Excel");
337
341
  return;
338
342
  }
339
- // ===============================
340
- // 8️⃣ FINAL PAYLOAD
341
- // ===============================
342
343
  this.convertedData = {
343
344
  clientId: this.clientId,
344
- bills
345
+ bills,
345
346
  };
346
347
  this.dataTableShow = true;
347
- this.ts.getSuccessToast('File uploaded successfully');
348
+ this.ts.getSuccessToast("File uploaded successfully");
348
349
  }
349
350
  catch (err) {
350
351
  console.error(err);
351
- this.ts.getErrorToast(err.message || 'Invalid Excel file');
352
+ this.ts.getErrorToast(err.message || "Invalid Excel file");
352
353
  }
353
354
  finally {
354
355
  this.resetFileInput();
@@ -359,7 +360,7 @@ export class AddNobComponent {
359
360
  }
360
361
  resetFileInput() {
361
362
  if (this.inputFile && this.inputFile.nativeElement) {
362
- this.inputFile.nativeElement.value = '';
363
+ this.inputFile.nativeElement.value = "";
363
364
  }
364
365
  }
365
366
  convertExcelDate(excelDate) {
@@ -368,16 +369,18 @@ export class AddNobComponent {
368
369
  return correctedDate.toISOString().split("T")[0];
369
370
  }
370
371
  proceed() {
371
- this.service.getNOBDataList(this.convertedData)?.pipe(takeUntil(this.destroy$))
372
+ this.service
373
+ .getNOBDataList(this.convertedData)
374
+ ?.pipe(takeUntil(this.destroy$))
372
375
  .subscribe({
373
376
  next: (res) => {
374
377
  if (res.code === 200 && res) {
375
378
  const allMessages = res.message;
376
379
  this.ts.getSuccessToast(allMessages);
377
- this.activeModal.close('submit');
380
+ this.activeModal.close("submit");
378
381
  }
379
382
  else {
380
- this.ts.getErrorToast('Unexpected response format');
383
+ this.ts.getErrorToast("Unexpected response format");
381
384
  }
382
385
  },
383
386
  error: (err) => {
@@ -397,7 +400,9 @@ export class AddNobComponent {
397
400
  }
398
401
  }
399
402
  getZoneList(store) {
400
- this.service.getZoneList({ "storeId": [store] })?.pipe(takeUntil(this.destroy$))
403
+ this.service
404
+ .getZoneList({ storeId: [store] })
405
+ ?.pipe(takeUntil(this.destroy$))
401
406
  .subscribe({
402
407
  next: (res) => {
403
408
  if (res && res.code === 200) {
@@ -409,44 +414,42 @@ export class AddNobComponent {
409
414
  },
410
415
  error: (err) => {
411
416
  this.zoneList = [];
412
- }
417
+ },
413
418
  });
414
419
  }
415
420
  zonewisenob = [];
416
421
  onNobChange() {
417
422
  this.zonewisenob = this.zoneList.map((zone) => ({
418
423
  zoneName: zone.tagName ? zone.tagName : zone.zoneName,
419
- nobCount: Number(zone.nobCount) || 0
424
+ nobCount: Number(zone.nobCount) || 0,
420
425
  }));
421
- console.log('Updated zonewisenob:', this.zonewisenob);
422
426
  }
423
427
  download() {
424
428
  this.service
425
- .getZoneTemplate({ clientId: this.clientId || '' })
429
+ .getZoneTemplate({ clientId: this.clientId || "" })
426
430
  .pipe(takeUntil(this.destroy$))
427
431
  .subscribe({
428
432
  next: (res) => {
429
433
  if (res) {
430
- this.excelService.saveAsExcelFile(res, 'NOB Upload Template');
434
+ this.excelService.saveAsExcelFile1(res, "NOB Upload Template");
431
435
  }
432
436
  else {
433
- this.ts.getErrorToast('File is empty');
437
+ this.ts.getErrorToast("File is empty");
434
438
  }
435
439
  },
436
440
  error: (err) => {
437
- const errorMsg = err.error?.error ||
438
- err.error?.message || err.message || err.error;
439
- 'An error occurred while downloading file';
441
+ const errorMsg = err.error?.error || err.error?.message || err.message || err.error;
442
+ ("An error occurred while downloading file");
440
443
  this.ts.getErrorToast(errorMsg);
441
- }
444
+ },
442
445
  });
443
446
  }
444
447
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddNobComponent, deps: [{ token: i1.FormBuilder }, { token: i2.TrafficService }, { token: i3.ExcelService }, { token: i4.NgbActiveModal }, { token: i5.ToastService }, { token: i0.ChangeDetectorRef }, { token: i6.DatePipe }], target: i0.ɵɵFactoryTarget.Component });
445
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AddNobComponent, selector: "lib-add-nob", inputs: { type: "type", viewData: "viewData" }, providers: [DatePipe], viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["inputFile"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"type !=='editView' && type !== 'view'\" class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div *ngIf=\"type ==='add'\" class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n <div *ngIf=\"type ==='reupload'\" class=\"symbol symbol-75px symbol-circle\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\"/>\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\"/>\r\n <path d=\"M37 31V35C37 35.5304 36.7893 36.0391 36.4142 36.4142C36.0391 36.7893 35.5304 37 35 37H21C20.4696 37 19.9609 36.7893 19.5858 36.4142C19.2107 36.0391 19 35.5304 19 35V31M33 24L28 19M28 19L23 24M28 19V31\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n \r\n </div>\r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type ==='add'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add Single NoB</a>\r\n </div>\r\n <div *ngIf=\"type ==='reupload'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Upload NoB for</a>\r\n </div>\r\n<div *ngIf=\"type ==='reupload'\" class=\"d-flex align-items-center mt-5\">\r\n <div class=\"form-check w-50 cursor-pointer ps-5\" (click)=\"nobStore('single')\" [ngClass]=\"typeNOB ==='single' ? 'form-check-inline':'form-check-inline-none'\" >\r\n <svg *ngIf=\"typeNOB ==='single'\" style=\"margin-top: -5px !important;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"#EAF8FF\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#00A3FF\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"#00A3FF\"/>\r\n </svg>\r\n\r\n <svg *ngIf=\"typeNOB !=='single'\" style=\"margin-top: -5px !important;\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"white\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n </svg>\r\n <!-- <input class=\"form-check-input ms-10\" type=\"radio\" name=\"inlineRadioOptions\" id=\"inlineRadio1\" value=\"option1\"> -->\r\n <span class=\"ms-3 pt-12\" [ngClass]=\"typeNOB ==='single' ? 'form-text-primary ':'form-defult'\">Single Store</span>\r\n </div>\r\n <div class=\"form-check w-50 cursor-pointer ps-5\" (click)=\"nobStore('multiple')\" [ngClass]=\"typeNOB ==='multiple' ? 'form-check-inline':'form-check-inline-none'\">\r\n <svg *ngIf=\"typeNOB ==='multiple'\" style=\"margin-top: -5px !important;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"#EAF8FF\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#00A3FF\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"#00A3FF\"/>\r\n </svg>\r\n\r\n <svg *ngIf=\"typeNOB !=='multiple'\" style=\"margin-top: -5px !important;\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"white\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n </svg>\r\n <span class=\"ms-3 pt-12\" [ngClass]=\"typeNOB ==='multiple' ? 'form-text-primary':'form-defult'\">Multiple Stores</span>\r\n \r\n </div>\r\n </div>\r\n <div *ngIf=\"typeNOB ==='single'\" class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\">\r\n <div class=\"row px-0 me-3\">\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"storeName\" class=\"form-label\">Store Name<span\r\n class=\"alert-required text-danger\"> *</span></label>\r\n <lib-custom-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeName'\"\r\n [idField]=\"'storeName'\" (selected)=\"onNOBStoreSelect($event, 'storeName')\"\r\n [selectedValues]=\"[{ storeName: storeName }]\">\r\n </lib-custom-select>\r\n </div>\r\n\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"storeID\" class=\"form-label\">Store ID /<span *ngIf=\"type !=='add'\"> Store Code</span><span *ngIf=\"type ==='add'\"> Reference Code</span> <span\r\n class=\"alert-required text-danger\"> *</span></label>\r\n <lib-custom-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeId'\"\r\n [idField]=\"'storeId'\" (selected)=\"onNOBStoreSelect($event, 'storeId')\"\r\n [selectedValues]=\"[{ storeId: storeId }]\">\r\n </lib-custom-select>\r\n </div>\r\n\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"Date\" class=\"form-label\">Select Date <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"date\" class=\"form-control\" id=\"myDate\" [(ngModel)]=\"dateValue\"\r\n (change)=\"onDateChange($event)\" [max]=\"maxDate\">\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"count\" class=\"form-label\">NOB Count <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"nobCount\"\r\n (keypress)=\"omit_special_char($event)\">\r\n </div>\r\n <div *ngIf=\"zoneShow\" class=\"col-12\">\r\n <div *ngIf=\"clientData?.isZonewiseNOB\" class=\"toggle-wrapper\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isEnabled\" (change)=\"onCheckboxChange($event)\" />\r\n <span class=\"slider\"></span>\r\n </label>\r\n\r\n <span class=\"toggle-label\">\r\n Add Zone-wise NoB Count\r\n </span>\r\n</div>\r\n\r\n </div>\r\n <div *ngIf=\"isEnabled\" class=\"table-responsive\">\r\n <table *ngIf=\"zoneList?.length\" class=\"table bottom-border text-nowrap mt-5\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">Zone Name</th>\r\n <th scope=\"col\">NoB Count</th>\r\n </tr>\r\n </thead>\r\n <tbody >\r\n <tr *ngFor=\"let zone of zoneList\">\r\n <td class=\"py-3 mt-10\">{{zone.tagName}}</td>\r\n <td class=\"py-2\"><input type=\"text\" class=\"form-control form-control-sm mb-0 py-0\" [(ngModel)]=\"zone.nobCount\" (ngModelChange)=\"onNobChange()\" \r\n (keypress)=\"omit_special_char($event)\"></td>\r\n </tr>\r\n </tbody>\r\n \r\n \r\n </table>\r\n <div *ngIf=\"!zoneList?.length\" class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata-table\" 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 Zone-wise NoB count</div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"erroShow\" class=\"text-danger mt-2\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n<g clip-path=\"url(#clip0_15055_156438)\">\r\n<path d=\"M9 6V9M9 12H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\" stroke=\"#B42318\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<clipPath id=\"clip0_15055_156438\">\r\n<rect width=\"18\" height=\"18\" fill=\"white\"/>\r\n</clipPath>\r\n</defs>\r\n</svg></span>{{ erroShow }}</div>\r\n\r\n <div class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button\r\n class=\"btn btn-primary w-100 ms-3\"\r\n id=\"alert-toast\"\r\n (click)=\"onSubmit()\"\r\n [disabled]=\"\r\n !dateValue ||\r\n !nobCount ||\r\n !storeId ||\r\n !storeName ||\r\n isSubmitting\r\n \"\r\n>\r\n <span *ngIf=\"!isSubmitting && type !== 'add'\">Proceed</span>\r\n <span *ngIf=\"!isSubmitting && type === 'add'\">Add</span>\r\n <span *ngIf=\"isSubmitting\">Please wait...</span>\r\n</button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div *ngIf=\"typeNOB ==='multiple'\" class=\"d-flex justify-content\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ul class=\"text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple NoB\u2019s at once.</li>\r\n <li class=\"user-text \">Download the template here - <a *ngIf=\"!clientData?.isZonewiseNOB\" href=\"../../assets/files/nobUploadTemplate.xlsx\" download><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"21\" viewBox=\"0 0 20 21\" fill=\"none\">\r\n <path d=\"M17.5 13V16.3333C17.5 16.7754 17.3244 17.1993 17.0118 17.5118C16.6993 17.8244 16.2754 18 15.8333 18H4.16667C3.72464 18 3.30072 17.8244 2.98816 17.5118C2.67559 17.1993 2.5 16.7754 2.5 16.3333V13M5.83333 8.83333L10 13M10 13L14.1667 8.83333M10 13V3\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"ms-2 text-download text-primary\">Download Template</span></a> <span *ngIf=\"clientData?.isZonewiseNOB\" class=\" text-active-primary\" (click)=\"download()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"21\" viewBox=\"0 0 20 21\" fill=\"none\">\r\n <path d=\"M17.5 13V16.3333C17.5 16.7754 17.3244 17.1993 17.0118 17.5118C16.6993 17.8244 16.2754 18 15.8333 18H4.16667C3.72464 18 3.30072 17.8244 2.98816 17.5118C2.67559 17.1993 2.5 16.7754 2.5 16.3333V13M5.83333 8.83333L10 13M10 13L14.1667 8.83333M10 13V3\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"ms-2 text-download text-primary cursor-pointer\">Download Template</span></span></li>\r\n <li class=\"user-text \">Add your data to the Template File</li>\r\n <li class=\"user-text\">Upload it below for processing</li>\r\n \r\n </ul>\r\n </div>\r\n </div>\r\n <div *ngIf=\"typeNOB ==='multiple'\"\r\n class=\"mt-3 ms-3 right-bar py-10 d-flex justify-content-center align-items-center flex-column\">\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_create_account_form_account_type_personal\"\r\n value=\"personal\" class=\"btn-check\" ng-reflect-name=\"accountType\"\r\n ng-reflect-form-control-name=\"accountType\" (change)=\"onUpload($event)\"\r\n ng-reflect-value=\"personal\" type=\"file\" #inputFile />\r\n <label for=\"kt_create_account_form_account_type_personal\" class=\" w-50 p-4 mt-5\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n<div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload </span>\r\n <!-- <span class=\"drag-drop\"> or drag and drop the template</span> -->\r\n </div>\r\n \r\n </span>\r\n </label>\r\n </div>\r\n\r\n <div *ngIf=\"typeNOB ==='multiple'\" class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"proceed()\"\r\n >Proceed</button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n<div *ngIf=\"type ==='editView' || type === 'view'\" class=\"card pt-0 pb-3 \">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n \r\n <div class=\"row w-100 mt-5\">\r\n \r\n <div class=\"col-md-6\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Zone-wise NoB\r\n Count</a>\r\n </div>\r\n <div *ngIf=\"type === 'view'\" class=\"col-md-6 text-end\">\r\n <span class=\"cursor-pointer\" (click)=\"cancel()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n<path d=\"M13 1L1 13M1 1L13 13\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg></span>\r\n </div>\r\n \r\n <div *ngIf=\"zoneList?.length\" class=\"table-responsive max-h-500\">\r\n <table class=\"table bottom-border text-nowrap mt-5\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">Zone Name</th>\r\n <th scope=\"col\">NoB Count</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let zone of zoneList;let i = index\">\r\n <td class=\"py-3 mt-10\">{{zone.zoneName}}</td>\r\n <td class=\"py-2\"><span *ngIf=\"type === 'view' || !isEditEnabled\">\r\n {{ zone.nobCount }}\r\n </span>\r\n\r\n <!-- EDIT MODE -->\r\n <input *ngIf=\"type === 'editView' && isEditEnabled\" type=\"text\" class=\"form-control form-control-sm\"\r\n [(ngModel)]=\"zone.nobCount\" (ngModelChange)=\"onNobChange()\"\r\n (keypress)=\"omit_special_char($event)\" />\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div *ngIf=\"!zoneList?.length\" 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-table\" 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 Zone-wise NoB count</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"erroShow\" class=\"text-danger mt-2\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n<g clip-path=\"url(#clip0_15055_156438)\">\r\n<path d=\"M9 6V9M9 12H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\" stroke=\"#B42318\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<clipPath id=\"clip0_15055_156438\">\r\n<rect width=\"18\" height=\"18\" fill=\"white\"/>\r\n</clipPath>\r\n</defs>\r\n</svg></span>{{ erroShow }}</div>\r\n\r\n <div *ngIf=\"type ==='editView' && isEditEnabled\" class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancelEdit()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"onSubmit()\"\r\n [disabled]=\"!dateValue || !nobCount || !storeId || !storeName\"><span\r\n *ngIf=\"type !=='add'\">Save</span><span *ngIf=\"type ==='add'\">Add</span></button>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n</div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);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:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}input.form-control{margin-bottom:10px}.dropdown-menu{max-height:200px;overflow-y:auto}.dropdown-item{cursor:pointer}.btn-outline-primary{width:100%;text-align:left}.form-check-inline{border-radius:8px;border:1px solid var(--Primary-700, #009BF3);background:var(--Primary-25, #F6FCFF);padding:16px}.form-check-label{color:var(--Gray-900, #101828)!important;font-size:16px!important;font-weight:600;line-height:24px}.form-check-inline-none{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);padding:16px;margin-right:1rem}.right-bar{border-radius:8px!important;border:1px solid var(--Gray-200, #EAECF0)!important;background:var(--White, #FFF);padding:16px 24px!important}.drag-drop{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400;line-height:20px}.click-upload{color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;text-transform:capitalize}.user-text{color:var(--Gray-500, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:28px;list-style:decimal!important}.form-text-primary{color:var(--Primary-700, #009BF3)!important;font-size:16px!important;font-weight:600;line-height:24px}.form-defult{color:var(--Gray-900, #101828)!important;font-size:16px!important;font-weight:600;line-height:24px}table td{height:24px!important;align-items:center}.toggle-wrapper{display:flex;align-items:center;gap:12px}.switch{position:relative;display:inline-block;width:46px;height:24px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#f2f4f7;transition:.3s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;transition:.3s;border-radius:50%}.switch input:checked+.slider{background-color:#0d6efd}.switch input:checked+.slider:before{transform:translate(22px)}.text-danger{color:#b42318!important}.max-h-500{max-height:500px;overflow-y:auto}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.CustomSelectComponent, selector: "lib-custom-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected"] }] });
448
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AddNobComponent, selector: "lib-add-nob", inputs: { type: "type", viewData: "viewData" }, providers: [DatePipe], viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["inputFile"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"type !=='editView' && type !== 'view'\" class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div *ngIf=\"type ==='add'\" class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n <div *ngIf=\"type ==='reupload'\" class=\"symbol symbol-75px symbol-circle\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\"/>\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\"/>\r\n <path d=\"M37 31V35C37 35.5304 36.7893 36.0391 36.4142 36.4142C36.0391 36.7893 35.5304 37 35 37H21C20.4696 37 19.9609 36.7893 19.5858 36.4142C19.2107 36.0391 19 35.5304 19 35V31M33 24L28 19M28 19L23 24M28 19V31\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n \r\n </div>\r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type ==='add'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add Single NoB</a>\r\n </div>\r\n <div *ngIf=\"type ==='reupload'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Upload NoB for</a>\r\n </div>\r\n<div *ngIf=\"type ==='reupload'\" class=\"d-flex align-items-center mt-5\">\r\n <div class=\"form-check w-50 cursor-pointer ps-5\" (click)=\"nobStore('single')\" [ngClass]=\"typeNOB ==='single' ? 'form-check-inline':'form-check-inline-none'\" >\r\n <svg *ngIf=\"typeNOB ==='single'\" style=\"margin-top: -5px !important;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"#EAF8FF\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#00A3FF\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"#00A3FF\"/>\r\n </svg>\r\n\r\n <svg *ngIf=\"typeNOB !=='single'\" style=\"margin-top: -5px !important;\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"white\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n </svg>\r\n <!-- <input class=\"form-check-input ms-10\" type=\"radio\" name=\"inlineRadioOptions\" id=\"inlineRadio1\" value=\"option1\"> -->\r\n <span class=\"ms-3 pt-12\" [ngClass]=\"typeNOB ==='single' ? 'form-text-primary ':'form-defult'\">Single Store</span>\r\n </div>\r\n <div class=\"form-check w-50 cursor-pointer ps-5\" (click)=\"nobStore('multiple')\" [ngClass]=\"typeNOB ==='multiple' ? 'form-check-inline':'form-check-inline-none'\">\r\n <svg *ngIf=\"typeNOB ==='multiple'\" style=\"margin-top: -5px !important;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"#EAF8FF\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#00A3FF\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"#00A3FF\"/>\r\n </svg>\r\n\r\n <svg *ngIf=\"typeNOB !=='multiple'\" style=\"margin-top: -5px !important;\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"white\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n </svg>\r\n <span class=\"ms-3 pt-12\" [ngClass]=\"typeNOB ==='multiple' ? 'form-text-primary':'form-defult'\">Multiple Stores</span>\r\n \r\n </div>\r\n </div>\r\n <div *ngIf=\"typeNOB ==='single'\" class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\">\r\n <div class=\"row px-0 me-3\">\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"storeName\" class=\"form-label\">Store Name<span\r\n class=\"alert-required text-danger\"> *</span></label>\r\n <lib-custom-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeName'\"\r\n [idField]=\"'storeName'\" (selected)=\"onNOBStoreSelect($event, 'storeName')\"\r\n [selectedValues]=\"[{ storeName: storeName }]\">\r\n </lib-custom-select>\r\n </div>\r\n\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"storeID\" class=\"form-label\">Store ID /<span *ngIf=\"type !=='add'\"> Store Code</span><span *ngIf=\"type ==='add'\"> Reference Code</span> <span\r\n class=\"alert-required text-danger\"> *</span></label>\r\n <lib-custom-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeId'\"\r\n [idField]=\"'storeId'\" (selected)=\"onNOBStoreSelect($event, 'storeId')\"\r\n [selectedValues]=\"[{ storeId: storeId }]\">\r\n </lib-custom-select>\r\n </div>\r\n\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"Date\" class=\"form-label\">Select Date <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"date\" class=\"form-control\" id=\"myDate\" [(ngModel)]=\"dateValue\"\r\n (change)=\"onDateChange($event)\" [max]=\"maxDate\">\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"count\" class=\"form-label\">NOB Count <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"nobCount\" maxlength=\"4\"\r\n minlength=\"1\"\r\n pattern=\"^[0-9]{1,4}$\"\r\n inputmode=\"numeric\"\r\n (keypress)=\"omit_special_char($event)\">\r\n </div>\r\n <div *ngIf=\"zoneShow\" class=\"col-12\">\r\n <div *ngIf=\"clientData?.isZonewiseNOB\" class=\"toggle-wrapper\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isEnabled\" (change)=\"onCheckboxChange($event)\" />\r\n <span class=\"slider\"></span>\r\n </label>\r\n\r\n <span class=\"toggle-label\">\r\n Add Zone-wise NoB Count\r\n </span>\r\n</div>\r\n\r\n </div>\r\n <div *ngIf=\"isEnabled\" class=\"table-responsive\">\r\n <table *ngIf=\"zoneList?.length\" class=\"table bottom-border text-nowrap mt-5\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">Zone Name</th>\r\n <th scope=\"col\">NoB Count</th>\r\n </tr>\r\n </thead>\r\n <tbody >\r\n <tr *ngFor=\"let zone of zoneList\">\r\n <td class=\"py-3 mt-10\">{{zone.tagName}}</td>\r\n <td class=\"py-2\"><input type=\"text\" class=\"form-control form-control-sm mb-0 py-0\" [(ngModel)]=\"zone.nobCount\" (ngModelChange)=\"onNobChange()\" \r\n (keypress)=\"omit_special_char($event)\"></td>\r\n </tr>\r\n </tbody>\r\n \r\n \r\n </table>\r\n <div *ngIf=\"!zoneList?.length\" class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata-table\" 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 Zone-wise NoB count</div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"erroShow\" class=\"text-danger mt-2\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n<g clip-path=\"url(#clip0_15055_156438)\">\r\n<path d=\"M9 6V9M9 12H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\" stroke=\"#B42318\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<clipPath id=\"clip0_15055_156438\">\r\n<rect width=\"18\" height=\"18\" fill=\"white\"/>\r\n</clipPath>\r\n</defs>\r\n</svg></span>{{ erroShow }}</div>\r\n\r\n <div class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button\r\n class=\"btn btn-primary w-100 ms-3\"\r\n id=\"alert-toast\"\r\n (click)=\"onSubmit()\"\r\n [disabled]=\"\r\n !dateValue ||\r\n !nobCount ||\r\n !storeId ||\r\n !storeName ||\r\n isSubmitting\r\n \"\r\n>\r\n <span *ngIf=\"!isSubmitting && type !== 'add'\">Proceed</span>\r\n <span *ngIf=\"!isSubmitting && type === 'add'\">Add</span>\r\n <span *ngIf=\"isSubmitting\">Please wait...</span>\r\n</button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div *ngIf=\"typeNOB ==='multiple'\" class=\"d-flex justify-content\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ul class=\"text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple NoB\u2019s at once.</li>\r\n <li class=\"user-text \">Download the template here - <a *ngIf=\"!clientData?.isZonewiseNOB\" href=\"../../assets/files/nobUploadTemplate.xlsx\" download><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"21\" viewBox=\"0 0 20 21\" fill=\"none\">\r\n <path d=\"M17.5 13V16.3333C17.5 16.7754 17.3244 17.1993 17.0118 17.5118C16.6993 17.8244 16.2754 18 15.8333 18H4.16667C3.72464 18 3.30072 17.8244 2.98816 17.5118C2.67559 17.1993 2.5 16.7754 2.5 16.3333V13M5.83333 8.83333L10 13M10 13L14.1667 8.83333M10 13V3\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"ms-2 text-download text-primary\">Download Template</span></a> <span *ngIf=\"clientData?.isZonewiseNOB\" class=\" text-active-primary\" (click)=\"download()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"21\" viewBox=\"0 0 20 21\" fill=\"none\">\r\n <path d=\"M17.5 13V16.3333C17.5 16.7754 17.3244 17.1993 17.0118 17.5118C16.6993 17.8244 16.2754 18 15.8333 18H4.16667C3.72464 18 3.30072 17.8244 2.98816 17.5118C2.67559 17.1993 2.5 16.7754 2.5 16.3333V13M5.83333 8.83333L10 13M10 13L14.1667 8.83333M10 13V3\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"ms-2 text-download text-primary cursor-pointer\">Download Template</span></span></li>\r\n <li class=\"user-text \">Add your data to the Template File</li>\r\n <li class=\"user-text\">Upload it below for processing</li>\r\n \r\n </ul>\r\n </div>\r\n </div>\r\n <div *ngIf=\"typeNOB ==='multiple'\"\r\n class=\"mt-3 ms-3 right-bar py-10 d-flex justify-content-center align-items-center flex-column\">\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_create_account_form_account_type_personal\"\r\n value=\"personal\" class=\"btn-check\" ng-reflect-name=\"accountType\"\r\n ng-reflect-form-control-name=\"accountType\" (change)=\"onUpload($event)\"\r\n ng-reflect-value=\"personal\" type=\"file\" #inputFile />\r\n <label for=\"kt_create_account_form_account_type_personal\" class=\" w-50 p-4 mt-5\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n<div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload </span>\r\n <!-- <span class=\"drag-drop\"> or drag and drop the template</span> -->\r\n </div>\r\n \r\n </span>\r\n </label>\r\n </div>\r\n\r\n <div *ngIf=\"typeNOB ==='multiple'\" class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"proceed()\"\r\n >Proceed</button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n<div *ngIf=\"type ==='editView' || type === 'view'\" class=\"card pt-0 pb-3 \">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n \r\n <div class=\"row w-100 mt-5\">\r\n \r\n <div class=\"col-md-6\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Zone-wise NoB\r\n Count</a>\r\n </div>\r\n <div *ngIf=\"type === 'view'\" class=\"col-md-6 text-end\">\r\n <span class=\"cursor-pointer\" (click)=\"cancel()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n<path d=\"M13 1L1 13M1 1L13 13\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg></span>\r\n </div>\r\n \r\n <div *ngIf=\"zoneList?.length\" class=\"table-responsive max-h-500\">\r\n <table class=\"table bottom-border text-nowrap mt-5\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">Zone Name</th>\r\n <th scope=\"col\">NoB Count</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let zone of zoneList;let i = index\">\r\n <td class=\"py-3 mt-10\">{{zone.zoneName}}</td>\r\n <td class=\"py-2\"><span *ngIf=\"type === 'view' || !isEditEnabled\">\r\n {{ zone.nobCount }}\r\n </span>\r\n\r\n <!-- EDIT MODE -->\r\n <input *ngIf=\"type === 'editView' && isEditEnabled\" type=\"text\" class=\"form-control form-control-sm\"\r\n [(ngModel)]=\"zone.nobCount\" (ngModelChange)=\"onNobChange()\" maxlength=\"4\"\r\n minlength=\"1\"\r\n pattern=\"^[0-9]{1,4}$\"\r\n inputmode=\"numeric\"\r\n (keypress)=\"omit_special_char($event)\" />\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div *ngIf=\"!zoneList?.length\" 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-table\" 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 Zone-wise NoB count</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"erroShow\" class=\"text-danger mt-2\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n<g clip-path=\"url(#clip0_15055_156438)\">\r\n<path d=\"M9 6V9M9 12H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\" stroke=\"#B42318\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<clipPath id=\"clip0_15055_156438\">\r\n<rect width=\"18\" height=\"18\" fill=\"white\"/>\r\n</clipPath>\r\n</defs>\r\n</svg></span>{{ erroShow }}</div>\r\n<ng-container *ngIf=\"zoneList?.length\">\r\n <div *ngIf=\"type ==='editView' && isEditEnabled\" class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancelEdit()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"onSubmit()\"\r\n [disabled]=\"!dateValue || !nobCount || !storeId || !storeName\"><span\r\n *ngIf=\"type !=='add'\">Save</span><span *ngIf=\"type ==='add'\">Add</span></button>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </div>\r\n</div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);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:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}input.form-control{margin-bottom:10px}.dropdown-menu{max-height:200px;overflow-y:auto}.dropdown-item{cursor:pointer}.btn-outline-primary{width:100%;text-align:left}.form-check-inline{border-radius:8px;border:1px solid var(--Primary-700, #009BF3);background:var(--Primary-25, #F6FCFF);padding:16px}.form-check-label{color:var(--Gray-900, #101828)!important;font-size:16px!important;font-weight:600;line-height:24px}.form-check-inline-none{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);padding:16px;margin-right:1rem}.right-bar{border-radius:8px!important;border:1px solid var(--Gray-200, #EAECF0)!important;background:var(--White, #FFF);padding:16px 24px!important}.drag-drop{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400;line-height:20px}.click-upload{color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;text-transform:capitalize}.user-text{color:var(--Gray-500, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:28px;list-style:decimal!important}.form-text-primary{color:var(--Primary-700, #009BF3)!important;font-size:16px!important;font-weight:600;line-height:24px}.form-defult{color:var(--Gray-900, #101828)!important;font-size:16px!important;font-weight:600;line-height:24px}table td{height:24px!important;align-items:center}.toggle-wrapper{display:flex;align-items:center;gap:12px}.switch{position:relative;display:inline-block;width:46px;height:24px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#f2f4f7;transition:.3s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;transition:.3s;border-radius:50%}.switch input:checked+.slider{background-color:#0d6efd}.switch input:checked+.slider:before{transform:translate(22px)}.text-danger{color:#b42318!important}.max-h-500{max-height:500px;overflow-y:auto}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.CustomSelectComponent, selector: "lib-custom-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected"] }] });
446
449
  }
447
450
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddNobComponent, decorators: [{
448
451
  type: Component,
449
- args: [{ selector: 'lib-add-nob', providers: [DatePipe], template: "<div *ngIf=\"type !=='editView' && type !== 'view'\" class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div *ngIf=\"type ==='add'\" class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n <div *ngIf=\"type ==='reupload'\" class=\"symbol symbol-75px symbol-circle\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\"/>\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\"/>\r\n <path d=\"M37 31V35C37 35.5304 36.7893 36.0391 36.4142 36.4142C36.0391 36.7893 35.5304 37 35 37H21C20.4696 37 19.9609 36.7893 19.5858 36.4142C19.2107 36.0391 19 35.5304 19 35V31M33 24L28 19M28 19L23 24M28 19V31\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n \r\n </div>\r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type ==='add'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add Single NoB</a>\r\n </div>\r\n <div *ngIf=\"type ==='reupload'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Upload NoB for</a>\r\n </div>\r\n<div *ngIf=\"type ==='reupload'\" class=\"d-flex align-items-center mt-5\">\r\n <div class=\"form-check w-50 cursor-pointer ps-5\" (click)=\"nobStore('single')\" [ngClass]=\"typeNOB ==='single' ? 'form-check-inline':'form-check-inline-none'\" >\r\n <svg *ngIf=\"typeNOB ==='single'\" style=\"margin-top: -5px !important;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"#EAF8FF\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#00A3FF\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"#00A3FF\"/>\r\n </svg>\r\n\r\n <svg *ngIf=\"typeNOB !=='single'\" style=\"margin-top: -5px !important;\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"white\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n </svg>\r\n <!-- <input class=\"form-check-input ms-10\" type=\"radio\" name=\"inlineRadioOptions\" id=\"inlineRadio1\" value=\"option1\"> -->\r\n <span class=\"ms-3 pt-12\" [ngClass]=\"typeNOB ==='single' ? 'form-text-primary ':'form-defult'\">Single Store</span>\r\n </div>\r\n <div class=\"form-check w-50 cursor-pointer ps-5\" (click)=\"nobStore('multiple')\" [ngClass]=\"typeNOB ==='multiple' ? 'form-check-inline':'form-check-inline-none'\">\r\n <svg *ngIf=\"typeNOB ==='multiple'\" style=\"margin-top: -5px !important;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"#EAF8FF\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#00A3FF\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"#00A3FF\"/>\r\n </svg>\r\n\r\n <svg *ngIf=\"typeNOB !=='multiple'\" style=\"margin-top: -5px !important;\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"white\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n </svg>\r\n <span class=\"ms-3 pt-12\" [ngClass]=\"typeNOB ==='multiple' ? 'form-text-primary':'form-defult'\">Multiple Stores</span>\r\n \r\n </div>\r\n </div>\r\n <div *ngIf=\"typeNOB ==='single'\" class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\">\r\n <div class=\"row px-0 me-3\">\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"storeName\" class=\"form-label\">Store Name<span\r\n class=\"alert-required text-danger\"> *</span></label>\r\n <lib-custom-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeName'\"\r\n [idField]=\"'storeName'\" (selected)=\"onNOBStoreSelect($event, 'storeName')\"\r\n [selectedValues]=\"[{ storeName: storeName }]\">\r\n </lib-custom-select>\r\n </div>\r\n\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"storeID\" class=\"form-label\">Store ID /<span *ngIf=\"type !=='add'\"> Store Code</span><span *ngIf=\"type ==='add'\"> Reference Code</span> <span\r\n class=\"alert-required text-danger\"> *</span></label>\r\n <lib-custom-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeId'\"\r\n [idField]=\"'storeId'\" (selected)=\"onNOBStoreSelect($event, 'storeId')\"\r\n [selectedValues]=\"[{ storeId: storeId }]\">\r\n </lib-custom-select>\r\n </div>\r\n\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"Date\" class=\"form-label\">Select Date <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"date\" class=\"form-control\" id=\"myDate\" [(ngModel)]=\"dateValue\"\r\n (change)=\"onDateChange($event)\" [max]=\"maxDate\">\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"count\" class=\"form-label\">NOB Count <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"nobCount\"\r\n (keypress)=\"omit_special_char($event)\">\r\n </div>\r\n <div *ngIf=\"zoneShow\" class=\"col-12\">\r\n <div *ngIf=\"clientData?.isZonewiseNOB\" class=\"toggle-wrapper\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isEnabled\" (change)=\"onCheckboxChange($event)\" />\r\n <span class=\"slider\"></span>\r\n </label>\r\n\r\n <span class=\"toggle-label\">\r\n Add Zone-wise NoB Count\r\n </span>\r\n</div>\r\n\r\n </div>\r\n <div *ngIf=\"isEnabled\" class=\"table-responsive\">\r\n <table *ngIf=\"zoneList?.length\" class=\"table bottom-border text-nowrap mt-5\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">Zone Name</th>\r\n <th scope=\"col\">NoB Count</th>\r\n </tr>\r\n </thead>\r\n <tbody >\r\n <tr *ngFor=\"let zone of zoneList\">\r\n <td class=\"py-3 mt-10\">{{zone.tagName}}</td>\r\n <td class=\"py-2\"><input type=\"text\" class=\"form-control form-control-sm mb-0 py-0\" [(ngModel)]=\"zone.nobCount\" (ngModelChange)=\"onNobChange()\" \r\n (keypress)=\"omit_special_char($event)\"></td>\r\n </tr>\r\n </tbody>\r\n \r\n \r\n </table>\r\n <div *ngIf=\"!zoneList?.length\" class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata-table\" 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 Zone-wise NoB count</div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"erroShow\" class=\"text-danger mt-2\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n<g clip-path=\"url(#clip0_15055_156438)\">\r\n<path d=\"M9 6V9M9 12H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\" stroke=\"#B42318\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<clipPath id=\"clip0_15055_156438\">\r\n<rect width=\"18\" height=\"18\" fill=\"white\"/>\r\n</clipPath>\r\n</defs>\r\n</svg></span>{{ erroShow }}</div>\r\n\r\n <div class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button\r\n class=\"btn btn-primary w-100 ms-3\"\r\n id=\"alert-toast\"\r\n (click)=\"onSubmit()\"\r\n [disabled]=\"\r\n !dateValue ||\r\n !nobCount ||\r\n !storeId ||\r\n !storeName ||\r\n isSubmitting\r\n \"\r\n>\r\n <span *ngIf=\"!isSubmitting && type !== 'add'\">Proceed</span>\r\n <span *ngIf=\"!isSubmitting && type === 'add'\">Add</span>\r\n <span *ngIf=\"isSubmitting\">Please wait...</span>\r\n</button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div *ngIf=\"typeNOB ==='multiple'\" class=\"d-flex justify-content\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ul class=\"text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple NoB\u2019s at once.</li>\r\n <li class=\"user-text \">Download the template here - <a *ngIf=\"!clientData?.isZonewiseNOB\" href=\"../../assets/files/nobUploadTemplate.xlsx\" download><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"21\" viewBox=\"0 0 20 21\" fill=\"none\">\r\n <path d=\"M17.5 13V16.3333C17.5 16.7754 17.3244 17.1993 17.0118 17.5118C16.6993 17.8244 16.2754 18 15.8333 18H4.16667C3.72464 18 3.30072 17.8244 2.98816 17.5118C2.67559 17.1993 2.5 16.7754 2.5 16.3333V13M5.83333 8.83333L10 13M10 13L14.1667 8.83333M10 13V3\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"ms-2 text-download text-primary\">Download Template</span></a> <span *ngIf=\"clientData?.isZonewiseNOB\" class=\" text-active-primary\" (click)=\"download()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"21\" viewBox=\"0 0 20 21\" fill=\"none\">\r\n <path d=\"M17.5 13V16.3333C17.5 16.7754 17.3244 17.1993 17.0118 17.5118C16.6993 17.8244 16.2754 18 15.8333 18H4.16667C3.72464 18 3.30072 17.8244 2.98816 17.5118C2.67559 17.1993 2.5 16.7754 2.5 16.3333V13M5.83333 8.83333L10 13M10 13L14.1667 8.83333M10 13V3\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"ms-2 text-download text-primary cursor-pointer\">Download Template</span></span></li>\r\n <li class=\"user-text \">Add your data to the Template File</li>\r\n <li class=\"user-text\">Upload it below for processing</li>\r\n \r\n </ul>\r\n </div>\r\n </div>\r\n <div *ngIf=\"typeNOB ==='multiple'\"\r\n class=\"mt-3 ms-3 right-bar py-10 d-flex justify-content-center align-items-center flex-column\">\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_create_account_form_account_type_personal\"\r\n value=\"personal\" class=\"btn-check\" ng-reflect-name=\"accountType\"\r\n ng-reflect-form-control-name=\"accountType\" (change)=\"onUpload($event)\"\r\n ng-reflect-value=\"personal\" type=\"file\" #inputFile />\r\n <label for=\"kt_create_account_form_account_type_personal\" class=\" w-50 p-4 mt-5\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n<div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload </span>\r\n <!-- <span class=\"drag-drop\"> or drag and drop the template</span> -->\r\n </div>\r\n \r\n </span>\r\n </label>\r\n </div>\r\n\r\n <div *ngIf=\"typeNOB ==='multiple'\" class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"proceed()\"\r\n >Proceed</button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n<div *ngIf=\"type ==='editView' || type === 'view'\" class=\"card pt-0 pb-3 \">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n \r\n <div class=\"row w-100 mt-5\">\r\n \r\n <div class=\"col-md-6\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Zone-wise NoB\r\n Count</a>\r\n </div>\r\n <div *ngIf=\"type === 'view'\" class=\"col-md-6 text-end\">\r\n <span class=\"cursor-pointer\" (click)=\"cancel()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n<path d=\"M13 1L1 13M1 1L13 13\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg></span>\r\n </div>\r\n \r\n <div *ngIf=\"zoneList?.length\" class=\"table-responsive max-h-500\">\r\n <table class=\"table bottom-border text-nowrap mt-5\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">Zone Name</th>\r\n <th scope=\"col\">NoB Count</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let zone of zoneList;let i = index\">\r\n <td class=\"py-3 mt-10\">{{zone.zoneName}}</td>\r\n <td class=\"py-2\"><span *ngIf=\"type === 'view' || !isEditEnabled\">\r\n {{ zone.nobCount }}\r\n </span>\r\n\r\n <!-- EDIT MODE -->\r\n <input *ngIf=\"type === 'editView' && isEditEnabled\" type=\"text\" class=\"form-control form-control-sm\"\r\n [(ngModel)]=\"zone.nobCount\" (ngModelChange)=\"onNobChange()\"\r\n (keypress)=\"omit_special_char($event)\" />\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div *ngIf=\"!zoneList?.length\" 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-table\" 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 Zone-wise NoB count</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"erroShow\" class=\"text-danger mt-2\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n<g clip-path=\"url(#clip0_15055_156438)\">\r\n<path d=\"M9 6V9M9 12H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\" stroke=\"#B42318\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<clipPath id=\"clip0_15055_156438\">\r\n<rect width=\"18\" height=\"18\" fill=\"white\"/>\r\n</clipPath>\r\n</defs>\r\n</svg></span>{{ erroShow }}</div>\r\n\r\n <div *ngIf=\"type ==='editView' && isEditEnabled\" class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancelEdit()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"onSubmit()\"\r\n [disabled]=\"!dateValue || !nobCount || !storeId || !storeName\"><span\r\n *ngIf=\"type !=='add'\">Save</span><span *ngIf=\"type ==='add'\">Add</span></button>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n</div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);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:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}input.form-control{margin-bottom:10px}.dropdown-menu{max-height:200px;overflow-y:auto}.dropdown-item{cursor:pointer}.btn-outline-primary{width:100%;text-align:left}.form-check-inline{border-radius:8px;border:1px solid var(--Primary-700, #009BF3);background:var(--Primary-25, #F6FCFF);padding:16px}.form-check-label{color:var(--Gray-900, #101828)!important;font-size:16px!important;font-weight:600;line-height:24px}.form-check-inline-none{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);padding:16px;margin-right:1rem}.right-bar{border-radius:8px!important;border:1px solid var(--Gray-200, #EAECF0)!important;background:var(--White, #FFF);padding:16px 24px!important}.drag-drop{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400;line-height:20px}.click-upload{color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;text-transform:capitalize}.user-text{color:var(--Gray-500, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:28px;list-style:decimal!important}.form-text-primary{color:var(--Primary-700, #009BF3)!important;font-size:16px!important;font-weight:600;line-height:24px}.form-defult{color:var(--Gray-900, #101828)!important;font-size:16px!important;font-weight:600;line-height:24px}table td{height:24px!important;align-items:center}.toggle-wrapper{display:flex;align-items:center;gap:12px}.switch{position:relative;display:inline-block;width:46px;height:24px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#f2f4f7;transition:.3s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;transition:.3s;border-radius:50%}.switch input:checked+.slider{background-color:#0d6efd}.switch input:checked+.slider:before{transform:translate(22px)}.text-danger{color:#b42318!important}.max-h-500{max-height:500px;overflow-y:auto}\n"] }]
452
+ args: [{ selector: "lib-add-nob", providers: [DatePipe], template: "<div *ngIf=\"type !=='editView' && type !== 'view'\" class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div *ngIf=\"type ==='add'\" class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n <div *ngIf=\"type ==='reupload'\" class=\"symbol symbol-75px symbol-circle\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\"/>\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\"/>\r\n <path d=\"M37 31V35C37 35.5304 36.7893 36.0391 36.4142 36.4142C36.0391 36.7893 35.5304 37 35 37H21C20.4696 37 19.9609 36.7893 19.5858 36.4142C19.2107 36.0391 19 35.5304 19 35V31M33 24L28 19M28 19L23 24M28 19V31\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n \r\n </div>\r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type ==='add'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add Single NoB</a>\r\n </div>\r\n <div *ngIf=\"type ==='reupload'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Upload NoB for</a>\r\n </div>\r\n<div *ngIf=\"type ==='reupload'\" class=\"d-flex align-items-center mt-5\">\r\n <div class=\"form-check w-50 cursor-pointer ps-5\" (click)=\"nobStore('single')\" [ngClass]=\"typeNOB ==='single' ? 'form-check-inline':'form-check-inline-none'\" >\r\n <svg *ngIf=\"typeNOB ==='single'\" style=\"margin-top: -5px !important;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"#EAF8FF\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#00A3FF\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"#00A3FF\"/>\r\n </svg>\r\n\r\n <svg *ngIf=\"typeNOB !=='single'\" style=\"margin-top: -5px !important;\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"white\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n </svg>\r\n <!-- <input class=\"form-check-input ms-10\" type=\"radio\" name=\"inlineRadioOptions\" id=\"inlineRadio1\" value=\"option1\"> -->\r\n <span class=\"ms-3 pt-12\" [ngClass]=\"typeNOB ==='single' ? 'form-text-primary ':'form-defult'\">Single Store</span>\r\n </div>\r\n <div class=\"form-check w-50 cursor-pointer ps-5\" (click)=\"nobStore('multiple')\" [ngClass]=\"typeNOB ==='multiple' ? 'form-check-inline':'form-check-inline-none'\">\r\n <svg *ngIf=\"typeNOB ==='multiple'\" style=\"margin-top: -5px !important;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"#EAF8FF\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#00A3FF\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"#00A3FF\"/>\r\n </svg>\r\n\r\n <svg *ngIf=\"typeNOB !=='multiple'\" style=\"margin-top: -5px !important;\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"white\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n </svg>\r\n <span class=\"ms-3 pt-12\" [ngClass]=\"typeNOB ==='multiple' ? 'form-text-primary':'form-defult'\">Multiple Stores</span>\r\n \r\n </div>\r\n </div>\r\n <div *ngIf=\"typeNOB ==='single'\" class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\">\r\n <div class=\"row px-0 me-3\">\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"storeName\" class=\"form-label\">Store Name<span\r\n class=\"alert-required text-danger\"> *</span></label>\r\n <lib-custom-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeName'\"\r\n [idField]=\"'storeName'\" (selected)=\"onNOBStoreSelect($event, 'storeName')\"\r\n [selectedValues]=\"[{ storeName: storeName }]\">\r\n </lib-custom-select>\r\n </div>\r\n\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"storeID\" class=\"form-label\">Store ID /<span *ngIf=\"type !=='add'\"> Store Code</span><span *ngIf=\"type ==='add'\"> Reference Code</span> <span\r\n class=\"alert-required text-danger\"> *</span></label>\r\n <lib-custom-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeId'\"\r\n [idField]=\"'storeId'\" (selected)=\"onNOBStoreSelect($event, 'storeId')\"\r\n [selectedValues]=\"[{ storeId: storeId }]\">\r\n </lib-custom-select>\r\n </div>\r\n\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"Date\" class=\"form-label\">Select Date <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"date\" class=\"form-control\" id=\"myDate\" [(ngModel)]=\"dateValue\"\r\n (change)=\"onDateChange($event)\" [max]=\"maxDate\">\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"count\" class=\"form-label\">NOB Count <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"nobCount\" maxlength=\"4\"\r\n minlength=\"1\"\r\n pattern=\"^[0-9]{1,4}$\"\r\n inputmode=\"numeric\"\r\n (keypress)=\"omit_special_char($event)\">\r\n </div>\r\n <div *ngIf=\"zoneShow\" class=\"col-12\">\r\n <div *ngIf=\"clientData?.isZonewiseNOB\" class=\"toggle-wrapper\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"isEnabled\" (change)=\"onCheckboxChange($event)\" />\r\n <span class=\"slider\"></span>\r\n </label>\r\n\r\n <span class=\"toggle-label\">\r\n Add Zone-wise NoB Count\r\n </span>\r\n</div>\r\n\r\n </div>\r\n <div *ngIf=\"isEnabled\" class=\"table-responsive\">\r\n <table *ngIf=\"zoneList?.length\" class=\"table bottom-border text-nowrap mt-5\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">Zone Name</th>\r\n <th scope=\"col\">NoB Count</th>\r\n </tr>\r\n </thead>\r\n <tbody >\r\n <tr *ngFor=\"let zone of zoneList\">\r\n <td class=\"py-3 mt-10\">{{zone.tagName}}</td>\r\n <td class=\"py-2\"><input type=\"text\" class=\"form-control form-control-sm mb-0 py-0\" [(ngModel)]=\"zone.nobCount\" (ngModelChange)=\"onNobChange()\" \r\n (keypress)=\"omit_special_char($event)\"></td>\r\n </tr>\r\n </tbody>\r\n \r\n \r\n </table>\r\n <div *ngIf=\"!zoneList?.length\" class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata-table\" 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 Zone-wise NoB count</div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"erroShow\" class=\"text-danger mt-2\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n<g clip-path=\"url(#clip0_15055_156438)\">\r\n<path d=\"M9 6V9M9 12H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\" stroke=\"#B42318\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<clipPath id=\"clip0_15055_156438\">\r\n<rect width=\"18\" height=\"18\" fill=\"white\"/>\r\n</clipPath>\r\n</defs>\r\n</svg></span>{{ erroShow }}</div>\r\n\r\n <div class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button\r\n class=\"btn btn-primary w-100 ms-3\"\r\n id=\"alert-toast\"\r\n (click)=\"onSubmit()\"\r\n [disabled]=\"\r\n !dateValue ||\r\n !nobCount ||\r\n !storeId ||\r\n !storeName ||\r\n isSubmitting\r\n \"\r\n>\r\n <span *ngIf=\"!isSubmitting && type !== 'add'\">Proceed</span>\r\n <span *ngIf=\"!isSubmitting && type === 'add'\">Add</span>\r\n <span *ngIf=\"isSubmitting\">Please wait...</span>\r\n</button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div *ngIf=\"typeNOB ==='multiple'\" class=\"d-flex justify-content\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ul class=\"text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple NoB\u2019s at once.</li>\r\n <li class=\"user-text \">Download the template here - <a *ngIf=\"!clientData?.isZonewiseNOB\" href=\"../../assets/files/nobUploadTemplate.xlsx\" download><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"21\" viewBox=\"0 0 20 21\" fill=\"none\">\r\n <path d=\"M17.5 13V16.3333C17.5 16.7754 17.3244 17.1993 17.0118 17.5118C16.6993 17.8244 16.2754 18 15.8333 18H4.16667C3.72464 18 3.30072 17.8244 2.98816 17.5118C2.67559 17.1993 2.5 16.7754 2.5 16.3333V13M5.83333 8.83333L10 13M10 13L14.1667 8.83333M10 13V3\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"ms-2 text-download text-primary\">Download Template</span></a> <span *ngIf=\"clientData?.isZonewiseNOB\" class=\" text-active-primary\" (click)=\"download()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"21\" viewBox=\"0 0 20 21\" fill=\"none\">\r\n <path d=\"M17.5 13V16.3333C17.5 16.7754 17.3244 17.1993 17.0118 17.5118C16.6993 17.8244 16.2754 18 15.8333 18H4.16667C3.72464 18 3.30072 17.8244 2.98816 17.5118C2.67559 17.1993 2.5 16.7754 2.5 16.3333V13M5.83333 8.83333L10 13M10 13L14.1667 8.83333M10 13V3\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"ms-2 text-download text-primary cursor-pointer\">Download Template</span></span></li>\r\n <li class=\"user-text \">Add your data to the Template File</li>\r\n <li class=\"user-text\">Upload it below for processing</li>\r\n \r\n </ul>\r\n </div>\r\n </div>\r\n <div *ngIf=\"typeNOB ==='multiple'\"\r\n class=\"mt-3 ms-3 right-bar py-10 d-flex justify-content-center align-items-center flex-column\">\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_create_account_form_account_type_personal\"\r\n value=\"personal\" class=\"btn-check\" ng-reflect-name=\"accountType\"\r\n ng-reflect-form-control-name=\"accountType\" (change)=\"onUpload($event)\"\r\n ng-reflect-value=\"personal\" type=\"file\" #inputFile />\r\n <label for=\"kt_create_account_form_account_type_personal\" class=\" w-50 p-4 mt-5\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n<div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload </span>\r\n <!-- <span class=\"drag-drop\"> or drag and drop the template</span> -->\r\n </div>\r\n \r\n </span>\r\n </label>\r\n </div>\r\n\r\n <div *ngIf=\"typeNOB ==='multiple'\" class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"proceed()\"\r\n >Proceed</button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n<div *ngIf=\"type ==='editView' || type === 'view'\" class=\"card pt-0 pb-3 \">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n \r\n <div class=\"row w-100 mt-5\">\r\n \r\n <div class=\"col-md-6\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Zone-wise NoB\r\n Count</a>\r\n </div>\r\n <div *ngIf=\"type === 'view'\" class=\"col-md-6 text-end\">\r\n <span class=\"cursor-pointer\" (click)=\"cancel()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n<path d=\"M13 1L1 13M1 1L13 13\" stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg></span>\r\n </div>\r\n \r\n <div *ngIf=\"zoneList?.length\" class=\"table-responsive max-h-500\">\r\n <table class=\"table bottom-border text-nowrap mt-5\">\r\n <thead>\r\n <tr>\r\n <th scope=\"col\">Zone Name</th>\r\n <th scope=\"col\">NoB Count</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let zone of zoneList;let i = index\">\r\n <td class=\"py-3 mt-10\">{{zone.zoneName}}</td>\r\n <td class=\"py-2\"><span *ngIf=\"type === 'view' || !isEditEnabled\">\r\n {{ zone.nobCount }}\r\n </span>\r\n\r\n <!-- EDIT MODE -->\r\n <input *ngIf=\"type === 'editView' && isEditEnabled\" type=\"text\" class=\"form-control form-control-sm\"\r\n [(ngModel)]=\"zone.nobCount\" (ngModelChange)=\"onNobChange()\" maxlength=\"4\"\r\n minlength=\"1\"\r\n pattern=\"^[0-9]{1,4}$\"\r\n inputmode=\"numeric\"\r\n (keypress)=\"omit_special_char($event)\" />\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div *ngIf=\"!zoneList?.length\" 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-table\" 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 Zone-wise NoB count</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"erroShow\" class=\"text-danger mt-2\"><span class=\"me-2\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n<g clip-path=\"url(#clip0_15055_156438)\">\r\n<path d=\"M9 6V9M9 12H9.0075M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85786 16.5 1.5 13.1421 1.5 9C1.5 4.85786 4.85786 1.5 9 1.5C13.1421 1.5 16.5 4.85786 16.5 9Z\" stroke=\"#B42318\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</g>\r\n<defs>\r\n<clipPath id=\"clip0_15055_156438\">\r\n<rect width=\"18\" height=\"18\" fill=\"white\"/>\r\n</clipPath>\r\n</defs>\r\n</svg></span>{{ erroShow }}</div>\r\n<ng-container *ngIf=\"zoneList?.length\">\r\n <div *ngIf=\"type ==='editView' && isEditEnabled\" class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancelEdit()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"onSubmit()\"\r\n [disabled]=\"!dateValue || !nobCount || !storeId || !storeName\"><span\r\n *ngIf=\"type !=='add'\">Save</span><span *ngIf=\"type ==='add'\">Add</span></button>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </div>\r\n</div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);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:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}input.form-control{margin-bottom:10px}.dropdown-menu{max-height:200px;overflow-y:auto}.dropdown-item{cursor:pointer}.btn-outline-primary{width:100%;text-align:left}.form-check-inline{border-radius:8px;border:1px solid var(--Primary-700, #009BF3);background:var(--Primary-25, #F6FCFF);padding:16px}.form-check-label{color:var(--Gray-900, #101828)!important;font-size:16px!important;font-weight:600;line-height:24px}.form-check-inline-none{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);padding:16px;margin-right:1rem}.right-bar{border-radius:8px!important;border:1px solid var(--Gray-200, #EAECF0)!important;background:var(--White, #FFF);padding:16px 24px!important}.drag-drop{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400;line-height:20px}.click-upload{color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;text-transform:capitalize}.user-text{color:var(--Gray-500, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:28px;list-style:decimal!important}.form-text-primary{color:var(--Primary-700, #009BF3)!important;font-size:16px!important;font-weight:600;line-height:24px}.form-defult{color:var(--Gray-900, #101828)!important;font-size:16px!important;font-weight:600;line-height:24px}table td{height:24px!important;align-items:center}.toggle-wrapper{display:flex;align-items:center;gap:12px}.switch{position:relative;display:inline-block;width:46px;height:24px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#f2f4f7;transition:.3s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;transition:.3s;border-radius:50%}.switch input:checked+.slider{background-color:#0d6efd}.switch input:checked+.slider:before{transform:translate(22px)}.text-danger{color:#b42318!important}.max-h-500{max-height:500px;overflow-y:auto}\n"] }]
450
453
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.TrafficService }, { type: i3.ExcelService }, { type: i4.NgbActiveModal }, { type: i5.ToastService }, { type: i0.ChangeDetectorRef }, { type: i6.DatePipe }], propDecorators: { type: [{
451
454
  type: Input
452
455
  }], viewData: [{
@@ -455,4 +458,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
455
458
  type: ViewChild,
456
459
  args: ["inputFile"]
457
460
  }] } });
458
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLW5vYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYWZmaWMvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1ub2IvYWRkLW5vYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYWZmaWMvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1ub2IvYWRkLW5vYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBYyxLQUFLLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc5RyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcxQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7OztBQVMzQyxNQUFNLE9BQU8sZUFBZTtJQUtSO0lBQXVCO0lBQStCO0lBQ2hFO0lBQW9DO0lBQXlCO0lBQTZCO0lBTDNGLElBQUksQ0FBSztJQUNULFFBQVEsQ0FBSztJQUN0QixPQUFPLENBQVk7SUFDRixRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUMxQyxZQUFvQixFQUFjLEVBQVMsT0FBc0IsRUFBUyxZQUF5QixFQUN6RixXQUEyQixFQUFTLEVBQWdCLEVBQVMsRUFBb0IsRUFBUyxRQUFrQjtRQURsRyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVMsWUFBTyxHQUFQLE9BQU8sQ0FBZTtRQUFTLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3pGLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUFTLE9BQUUsR0FBRixFQUFFLENBQWM7UUFBUyxPQUFFLEdBQUYsRUFBRSxDQUFrQjtRQUFTLGFBQVEsR0FBUixRQUFRLENB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QUs7Z0JBMk1rQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUcmFmZmljU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYWZmaWMuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0ICogYXMgWExTWCBmcm9tICd4bHN4JztcclxuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBFeGNlbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leGNlbC5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWFkZC1ub2InLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGQtbm9iLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYWRkLW5vYi5jb21wb25lbnQuc2NzcycsXHJcbiAgcHJvdmlkZXJzOiBbRGF0ZVBpcGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBZGROb2JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsT25EZXN0cm95IHtcclxuQElucHV0KCkgdHlwZTphbnk7XHJcbkBJbnB1dCgpIHZpZXdEYXRhOmFueTtcclxubm9iRm9ybTogRm9ybUdyb3VwO1xyXG5wcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuY29uc3RydWN0b3IocHJpdmF0ZSBmYjpGb3JtQnVpbGRlcixwcml2YXRlIHNlcnZpY2U6VHJhZmZpY1NlcnZpY2UscHJpdmF0ZSBleGNlbFNlcnZpY2U6RXhjZWxTZXJ2aWNlLFxyXG4gIHByaXZhdGUgYWN0aXZlTW9kYWwgOk5nYkFjdGl2ZU1vZGFsLHByaXZhdGUgdHM6IFRvYXN0U2VydmljZSxwcml2YXRlIGNkOkNoYW5nZURldGVjdG9yUmVmLHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlKXtcclxuXHJcbn1cclxubmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxufVxyXG5jbGllbnRJZDphbnk7XHJcbm1heERhdGU6IHN0cmluZyA9ICcnO1xyXG5pc0VkaXRFbmFibGVkID0gZmFsc2U7XHJcbmNsaWVudERhdGE6YW55O1xyXG5uZ09uSW5pdCgpOiB2b2lkIHtcclxubGV0IGRhdGE6IGFueSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSB8fCBcIlwiKTtcclxudGhpcy5jbGllbnRJZCA9ZGF0YS5jbGllbnRcclxubGV0IGNsaWVudDogYW55ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNsaWVudC1kZXRhaWxzXCIpIHx8IFwiXCIpO1xyXG50aGlzLmNsaWVudERhdGEgPSBjbGllbnRcclxudGhpcy5nZXROb2JTdG9yZUxpc3QoZGF0YS5jbGllbnQpO1xyXG50aGlzLnNldE1heERhdGUoKTtcclxuaWYgKHRoaXMudHlwZSA9PT0gJ2VkaXRWaWV3JyB8fCB0aGlzLnR5cGUgPT09ICd2aWV3Jykge1xyXG4gIHRoaXMuc3RvcmVOYW1lID0gdGhpcy52aWV3RGF0YS5zdG9yZU5hbWU7XHJcbiAgdGhpcy5zdG9yZUlkID0gdGhpcy52aWV3RGF0YS5zdG9yZUlkO1xyXG4gIHRoaXMuc3RvcmVDb2RlID0gdGhpcy52aWV3RGF0YS5zdG9yZUNvZGU7XHJcbiB0aGlzLmRhdGVWYWx1ZSA9IHRoaXMudmlld0RhdGEubm9iRGF0ZVxyXG4gID8gbmV3IERhdGUodGhpcy52aWV3RGF0YS5ub2JEYXRlKS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF1cclxuICA6IG51bGw7XHJcblxyXG4gIHRoaXMubm9iQ291bnQgPSB0aGlzLnZpZXdEYXRhLm5vYkNvdW50O1xyXG5cclxuICB0aGlzLnpvbmVMaXN0ID0gdGhpcy52aWV3RGF0YS56b25ld2lzZW5vYjsgLy8ga2VlcCB2YWx1ZXNcclxuICBpZih0aGlzLnR5cGUgPT09ICdlZGl0Vmlldycpe1xyXG4gICAgdGhpcy5pc0VkaXRFbmFibGVkID0gdHJ1ZTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5pc0VkaXRFbmFibGVkID0gZmFsc2U7XHJcbiAgfVxyXG59XHJcblxyXG59XHJcblxyXG5jYW5jZWxFZGl0KCkge1xyXG4gIHRoaXMuaXNFZGl0RW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuICBpZiAodGhpcy52aWV3RGF0YT8uem9uZUxpc3QpIHtcclxuICAgIHRoaXMuem9uZUxpc3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMudmlld0RhdGEuem9uZUxpc3QpKTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy56b25lTGlzdCA9IFtdO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5jYW5jZWwoKTtcclxufVxyXG5cclxuc3RvcmVMaXN0OmFueVtdPVtdO1xyXG5nZXROb2JTdG9yZUxpc3QoY2xpZW50OmFueSl7XHJcbiAgdGhpcy5zZXJ2aWNlLmdldE5PQlN0b3JlTGlzdChjbGllbnQpPy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZihyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCl7XHJcbiAgICAgICAgdGhpcy5zdG9yZUxpc3QgPXJlcy5kYXRhLnJlc3VsdFxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgXHJcbiAgICB9XHJcbiAgfSlcclxufVxyXG5cclxuc3RvcmVOYW1lOmFueTtcclxuc3RvcmVJZDphbnk7XHJcbmRhdGVWYWx1ZTphbnk7XHJcbnN0b3JlQ29kZTphbnk7XHJcbm5vYkNvdW50OmFueTtcclxuem9uZVNob3cgPWZhbHNlO1xyXG5vbk5PQlN0b3JlU2VsZWN0KGV2ZW50OiBhbnksIHR5cGU6ICdzdG9yZU5hbWUnIHwgJ3N0b3JlSWQnKTogdm9pZCB7XHJcbiAgaWYgKCFldmVudCkge1xyXG4gICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KCdzdG9yZU5hbWUgb3Igc3RvcmVJZCBpcyB1bmRlZmluZWQgb3IgaW52YWxpZCcpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBpZiAodHlwZSA9PT0gJ3N0b3JlTmFtZScpIHtcclxuICAgIHRoaXMuc3RvcmVOYW1lID0gZXZlbnQuc3RvcmVOYW1lO1xyXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlTGlzdC5maW5kKHN0b3JlID0+IHN0b3JlLnN0b3JlTmFtZSA9PT0gZXZlbnQuc3RvcmVOYW1lKTtcclxuICAgIGlmIChzdG9yZSkge1xyXG4gICAgICB0aGlzLnN0b3JlSWQgPSBzdG9yZS5zdG9yZUlkO1xyXG4gICAgICB0aGlzLnN0b3JlQ29kZSA9IHN0b3JlLnN0b3JlQ29kZTsgXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0b3JlSWQgPSAnJztcclxuICAgICAgdGhpcy5zdG9yZUNvZGUgPSAnJztcclxuICAgIH1cclxuICB9XHJcbiAgZWxzZSBpZiAodHlwZSA9PT0gJ3N0b3JlSWQnKSB7XHJcbiAgICB0aGlzLnN0b3JlSWQgPSBldmVudC5zdG9yZUlkO1xyXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlTGlzdC5maW5kKHN0b3JlID0+IHN0b3JlLnN0b3JlSWQgPT09IGV2ZW50LnN0b3JlSWQpO1xyXG4gICAgaWYgKHN0b3JlKSB7XHJcbiAgICAgIHRoaXMuc3RvcmVOYW1lID0gc3RvcmUuc3RvcmVOYW1lO1xyXG4gICAgICB0aGlzLnN0b3JlQ29kZSA9IHN0b3JlLnN0b3JlQ29kZTsgXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0b3JlTmFtZSA9ICcnO1xyXG4gICAgICB0aGlzLnN0b3JlQ29kZSA9ICcnOyBcclxuICAgIH1cclxuICB9XHJcbiAgdGhpcy56b25lU2hvdyA9IHRydWU7XHJcbiAgaWYodGhpcy5pc0VuYWJsZWQpe1xyXG4gICB0aGlzLmdldFpvbmVMaXN0KHRoaXMuc3RvcmVJZCk7XHJcbiAgfVxyXG4gIC8vIGNvbnNvbGUubG9nKCdzdG9yZU5hbWUnLHRoaXMuc3RvcmVJZCk7XHJcblxyXG4gIFxyXG59XHJcbm9taXRfc3BlY2lhbF9jaGFyKGV2ZW50OiBhbnkpIHtcclxuICB2YXIgaztcclxuICBrID0gZXZlbnQuY2hhckNvZGU7IC8vICAgICAgICAgayA9IGV2ZW50LmtleUNvZGU7ICAoQm90aCBjYW4gYmUgdXNlZClcclxuICByZXR1cm4gayA9PSA4IHx8IGsgPT0gMzIgfHwgKGsgPj0gNDggJiYgayA8PSA1Nyk7XHJcbn1cclxuc2V0TWF4RGF0ZSgpOiB2b2lkIHtcclxuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgY29uc3QgeWVzdGVyZGF5ID0gbmV3IERhdGUodG9kYXkpO1xyXG4gIHllc3RlcmRheS5zZXREYXRlKHRvZGF5LmdldERhdGUoKSAtIDEpOyAvLyBTZXQgdGhlIG1heCBkYXRlIHRvIHllc3RlcmRheVxyXG4gIHRoaXMuZGF0ZVZhbHVlID0geWVzdGVyZGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcclxuICAvLyBGb3JtYXQgdGhlIGRhdGUgYXMgeXl5eS1NTS1kZFxyXG4gIHRoaXMubWF4RGF0ZSA9IHllc3RlcmRheS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07XHJcbn1cclxub25EYXRlQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICBjb25zdCBzZWxlY3RlZERhdGUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgaWYgKHNlbGVjdGVkRGF0ZSA+IHRoaXMubWF4RGF0ZSkge1xyXG4gICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KCdJbnZhbGlkIGRhdGUgc2VsZWN0ZWQhJyk7XHJcbiAgfVxyXG59XHJcbmNhbmNlbCgpe1xyXG4gIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ2Nsb3NlJyk7XHJcbn1cclxuZXJyb1Nob3c6YW55ID0nJztcclxuaXNTdWJtaXR0aW5nID0gZmFsc2U7XHJcbm9uU3VibWl0KCkge1xyXG5cclxuICAvLyDim5QgU1RPUCBpZiBhbHJlYWR5IHN1Ym1pdHRpbmdcclxuICBpZiAodGhpcy5pc1N1Ym1pdHRpbmcpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGNvbnN0IG92ZXJhbGxOb2IgPSBOdW1iZXIodGhpcy5ub2JDb3VudCkgfHwgMDtcclxuXHJcbiAgY29uc3Qgem9uZVRvdGFsID0gdGhpcy56b25ld2lzZW5vYi5yZWR1Y2UoXHJcbiAgICAoc3VtOiBudW1iZXIsIHo6IGFueSkgPT4gc3VtICsgKE51bWJlcih6Lm5vYkNvdW50KSB8fCAwKSxcclxuICAgIDBcclxuICApO1xyXG5cclxuICBpZiAoem9uZVRvdGFsID4gb3ZlcmFsbE5vYikge1xyXG4gICAgdGhpcy5lcnJvU2hvdyA9ICdab25lLXdpc2UgTm9CIGNhbm5vdCBleGNlZWQgb3ZlcmFsbCBOb0IgY291bnQnO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8g4pyFIExPQ0sgQlVUVE9OXHJcbiAgdGhpcy5pc1N1Ym1pdHRpbmcgPSB0cnVlO1xyXG5cclxuICBjb25zdCBvYmogPSB7XHJcbiAgICBiaWxsczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgc3RvcmVDb2RlOiB0aGlzLnN0b3JlQ29kZSA/IHRoaXMuc3RvcmVDb2RlIDogdGhpcy5zdG9yZUlkLFxyXG4gICAgICAgIG5vYkRhdGU6IHRoaXMuZGF0ZVZhbHVlLFxyXG4gICAgICAgIG5vYkNvdW50OiBOdW1iZXIodGhpcy5ub2JDb3VudCksXHJcbiAgICAgICAgem9uZXdpc2Vub2I6IHRoaXMuem9uZXdpc2Vub2JcclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkXHJcbiAgfTtcclxuXHJcbiAgdGhpcy5zZXJ2aWNlLmdldE5PQkRhdGFMaXN0KG9iailcclxuICAgID8ucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdChyZXMubWVzc2FnZSk7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPWZhbHNlO1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KCdVbmV4cGVjdGVkIHJlc3BvbnNlIGZvcm1hdCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID1mYWxzZTtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICBlcnI/LmVycm9yPy5lcnJvciB8fCAnU29tZXRoaW5nIHdlbnQgd3JvbmcnXHJcbiAgICAgICAgKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAvLyDwn5STIFVOTE9DSyBCVVRUT05cclxuICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuXHJcblxyXG50eXBlTk9CID0nc2luZ2xlJ1xyXG5ub2JTdG9yZSh0eXBlOmFueSl7XHJcbiAgdGhpcy50eXBlTk9CID10eXBlXHJcbn1cclxuZGF0YVRhYmxlU2hvdyA9ZmFsc2U7XHJcbmRhdGFUYWJsZVNob3cxID1mYWxzZTtcclxudGFibGVIZWFkZXJzOmFueTtcclxuY29udmVydGVkRGF0YTphbnk7XHJcbkBWaWV3Q2hpbGQoXCJpbnB1dEZpbGVcIikgaW5wdXRGaWxlOiBFbGVtZW50UmVmO1xyXG5vblVwbG9hZChldmVudDogYW55KTogdm9pZCB7XHJcbiAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlcz8uWzBdO1xyXG4gIGlmICghZmlsZSkgcmV0dXJuO1xyXG5cclxuICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgYmluYXJ5RGF0YSA9IGUudGFyZ2V0LnJlc3VsdDtcclxuXHJcbiAgICAgIGNvbnN0IHdvcmtib29rOiBYTFNYLldvcmtCb29rID0gWExTWC5yZWFkKGJpbmFyeURhdGEsIHtcclxuICAgICAgICB0eXBlOiAnYmluYXJ5J1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHNoZWV0TmFtZSA9IHdvcmtib29rLlNoZWV0TmFtZXNbMF07XHJcbiAgICAgIGNvbnN0IHNoZWV0ID0gd29ya2Jvb2suU2hlZXRzW3NoZWV0TmFtZV07XHJcblxyXG4gICAgICBjb25zdCBzaGVldERhdGE6IGFueVtdW10gPSBYTFNYLnV0aWxzLnNoZWV0X3RvX2pzb24oc2hlZXQsIHtcclxuICAgICAgICBoZWFkZXI6IDEsXHJcbiAgICAgICAgZGVmdmFsOiBudWxsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKCFzaGVldERhdGEgfHwgc2hlZXREYXRhLmxlbmd0aCA8IDIpIHtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoJ0V4Y2VsIGZpbGUgaXMgZW1wdHknKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiBjb25zdCBTVE9SRV9JRF9IRUFERVJTID0gWydzdG9yZWlkJywgJ3N0b3JlIGlkJywnU3RvcmVJZCddO1xyXG5jb25zdCBEQVRFX0hFQURFUlMgPSBbJ2RhdGUnLCAnbm9iZGF0ZScsICdub2IgZGF0ZScsJ05PQkRhdGUnXTtcclxuY29uc3QgTk9CX0hFQURFUlMgPSBbJ25vYmNvdW50JywgJ292ZXJhbGxub2Jjb3VudCcsICdvdmVyYWxsIG5vYiBjb3VudCcsJ05PQkNvdW50J107XHJcbmNvbnN0IG5vcm1hbGl6ZSA9IChoOiBhbnkpID0+XHJcbiAgU3RyaW5nKGggPz8gJycpXHJcbiAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgLnJlcGxhY2UoL1xccysvZywgJycpO1xyXG4gICAgICAgY29uc3QgcmF3SGVhZGVycyA9IHNoZWV0RGF0YVswXTtcclxuXHJcbmNvbnN0IGhlYWRlcnMgPSByYXdIZWFkZXJzLm1hcChoID0+IG5vcm1hbGl6ZShoKSk7XHJcblxyXG5jb25zdCBpc1N0b3JlVmFsaWQgPSBTVE9SRV9JRF9IRUFERVJTLmluY2x1ZGVzKGhlYWRlcnNbMF0pO1xyXG5jb25zdCBpc0RhdGVWYWxpZCA9IERBVEVfSEVBREVSUy5pbmNsdWRlcyhoZWFkZXJzWzFdKTtcclxuY29uc3QgaXNOb2JWYWxpZCA9IE5PQl9IRUFERVJTLmluY2x1ZGVzKGhlYWRlcnNbMl0pO1xyXG5cclxuaWYgKCFpc1N0b3JlVmFsaWQgfHwgIWlzRGF0ZVZhbGlkIHx8ICFpc05vYlZhbGlkKSB7XHJcbiAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFxyXG4gICAgJ0ludmFsaWQgRXhjZWwgZmlsZS4gRmlyc3QgY29sdW1ucyBtdXN0IGJlIFN0b3JlIElkLCBOb0IgRGF0ZSwgT3ZlcmFsbCBOb0IgQ291bnQnXHJcbiAgKTtcclxuICByZXR1cm47XHJcbn1cclxuICAgICAgY29uc3Qgcm93cyA9IHNoZWV0RGF0YS5zbGljZSgxKTtcclxuXHJcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgLy8gMu+4j+KDoyBQUk9DRVNTIFJPV1NcclxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgICBjb25zdCBiaWxscyA9IHJvd3NcclxuICAgICAgICAubWFwKChyb3c6IGFueVtdLCByb3dJbmRleDogbnVtYmVyKSA9PiB7XHJcblxyXG4gICAgICAgICAgLy8g8J+UuSBTS0lQIENPTVBMRVRFTFkgRU1QVFkgUk9XUyAoU0FGRSlcclxuICAgICAgICAgIGNvbnN0IGlzRW1wdHlSb3cgPSByb3cuZXZlcnkoY2VsbCA9PlxyXG4gICAgICAgICAgICBjZWxsID09PSBudWxsIHx8XHJcbiAgICAgICAgICAgIGNlbGwgPT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICAgICAgICAodHlwZW9mIGNlbGwgPT09ICdzdHJpbmcnICYmIGNlbGwudHJpbSgpID09PSAnJylcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoaXNFbXB0eVJvdykgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgICAgICAgLy8gM++4j+KDoyBTVE9SRSBDT0RFXHJcbiAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgICAgICBjb25zdCBzdG9yZUlkID0gU3RyaW5nKHJvd1swXSA/PyAnJykudHJpbSgpO1xyXG4gICAgICAgICAgaWYgKCFzdG9yZUlkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBTdG9yZSBDb2RlIGF0IHJvdyAke3Jvd0luZGV4ICsgMn1gKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgICAgICAvLyA077iP4oOjIERBVEVcclxuICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgICAgIGxldCBub2JEYXRlOiBhbnkgPSByb3dbMV07XHJcbiAgICAgICAgICBpZiAobm9iRGF0ZSA9PT0gbnVsbCB8fCBub2JEYXRlID09PSB1bmRlZmluZWQgfHwgbm9iRGF0ZSA9PT0gJycpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIERhdGUgYXQgcm93ICR7cm93SW5kZXggKyAyfWApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0eXBlb2Ygbm9iRGF0ZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgbm9iRGF0ZSA9IHRoaXMuY29udmVydEV4Y2VsRGF0ZShub2JEYXRlKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobm9iRGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICAgICAgLy8gb2tcclxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5vYkRhdGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKG5vYkRhdGUpO1xyXG4gICAgICAgICAgICBpZiAoaXNOYU4ocGFyc2VkLmdldFRpbWUoKSkpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgRGF0ZSBmb3JtYXQgYXQgcm93ICR7cm93SW5kZXggKyAyfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5vYkRhdGUgPSBwYXJzZWQ7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgRGF0ZSBmb3JtYXQgYXQgcm93ICR7cm93SW5kZXggKyAyfWApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgICAgIC8vIDXvuI/ig6MgTm9CIENPVU5UXHJcbiAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgICAgICBsZXQgbm9iQ291bnQ6IGFueSA9IHJvd1syXTtcclxuICAgICAgICAgIGlmIChub2JDb3VudCA9PT0gbnVsbCB8fCBub2JDb3VudCA9PT0gdW5kZWZpbmVkIHx8IG5vYkNvdW50ID09PSAnJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgTm9CIGNvdW50IGF0IHJvdyAke3Jvd0luZGV4ICsgMn1gKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBub2JDb3VudCA9IE51bWJlcihub2JDb3VudCk7XHJcbiAgICAgICAgICBpZiAoaXNOYU4obm9iQ291bnQpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBOb0IgY291bnQgYXQgcm93ICR7cm93SW5kZXggKyAyfWApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgICAgIC8vIDbvuI/ig6MgWk9ORSBXSVNFIE5vQlxyXG4gICAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgICAgICAgY29uc3Qgem9uZXdpc2Vub2IgPSBoZWFkZXJzLnNsaWNlKDMpXHJcbiAgICAgICAgICAgIC5tYXAoKHpvbmVOYW1lLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHJvd1tpbmRleCArIDNdO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICByYXcgPT09IG51bGwgfHxcclxuICAgICAgICAgICAgICAgIHJhdyA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgICAgICAgICAodHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgJiYgcmF3LnRyaW0oKSA9PT0gJycpXHJcbiAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gTnVtYmVyKHJhdyk7XHJcbiAgICAgICAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICBgSW52YWxpZCBab25lIE5vQiBhdCByb3cgJHtyb3dJbmRleCArIDJ9ICgke3pvbmVOYW1lfSlgXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHpvbmVOYW1lLFxyXG4gICAgICAgICAgICAgICAgbm9iQ291bnQ6IHZhbHVlXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcclxuXHJcbiAgICAgICAgICBjb25zdCB6b25lVG90YWwgPSB6b25ld2lzZW5vYi5yZWR1Y2UoXHJcbiAgICAgICAgICAgIChzdW06IG51bWJlciwgejogYW55KSA9PiBzdW0gKyB6Lm5vYkNvdW50LFxyXG4gICAgICAgICAgICAwXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGlmICh6b25lVG90YWwgPiBub2JDb3VudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgYFpvbmUtd2lzZSBOb0IgY2Fubm90IGV4Y2VlZCBvdmVyYWxsIE5vQiAoUm93ICR7cm93SW5kZXggKyAyfSlgXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgICAgICAgLy8gN++4j+KDoyBGSU5BTCBPQkpFQ1RcclxuICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHN0b3JlQ29kZTogc3RvcmVJZCxcclxuICAgICAgICAgICAgbm9iRGF0ZTogdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0obm9iRGF0ZSwgJ3l5eXktTU0tZGQnKSxcclxuICAgICAgICAgICAgbm9iQ291bnQsXHJcbiAgICAgICAgICAgIHpvbmV3aXNlbm9iXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcclxuXHJcbiAgICAgIGlmICghYmlsbHMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KCdObyB2YWxpZCByb3dzIGZvdW5kIGluIEV4Y2VsJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgIC8vIDjvuI/ig6MgRklOQUwgUEFZTE9BRFxyXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgIHRoaXMuY29udmVydGVkRGF0YSA9IHtcclxuICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgICBiaWxsc1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmRhdGFUYWJsZVNob3cgPSB0cnVlO1xyXG4gICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdCgnRmlsZSB1cGxvYWRlZCBzdWNjZXNzZnVsbHknKTtcclxuXHJcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnIubWVzc2FnZSB8fCAnSW52YWxpZCBFeGNlbCBmaWxlJyk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLnJlc2V0RmlsZUlucHV0KCk7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoZmlsZSk7XHJcbn1cclxuXHJcbnJlc2V0RmlsZUlucHV0KCk6IHZvaWQge1xyXG4gIGlmICh0aGlzLmlucHV0RmlsZSAmJiB0aGlzLmlucHV0RmlsZS5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICB0aGlzLmlucHV0RmlsZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgfVxyXG59XHJcblxyXG5jb252ZXJ0RXhjZWxEYXRlKGV4Y2VsRGF0ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICBjb25zdCBiYXNlRGF0ZSA9IG5ldyBEYXRlKDE5MDAsIDAsIDEpOyBcclxuICBjb25zdCBjb3JyZWN0ZWREYXRlID0gbmV3IERhdGUoYmFzZURhdGUuZ2V0VGltZSgpICsgKGV4Y2VsRGF0ZSAtIDEpICogODY0MDAwMDApO1xyXG4gIHJldHVybiBjb3JyZWN0ZWREYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdOyBcclxufVxyXG5cclxucHJvY2VlZCgpe1xyXG4gIHRoaXMuc2VydmljZS5nZXROT0JEYXRhTGlzdCh0aGlzLmNvbnZlcnRlZERhdGEpPy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwICYmIHJlcykge1xyXG4gICAgICAgICAgY29uc3QgYWxsTWVzc2FnZXMgPSByZXMubWVzc2FnZVxyXG4gICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoYWxsTWVzc2FnZXMpO1xyXG4gICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0JylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KCdVbmV4cGVjdGVkIHJlc3BvbnNlIGZvcm1hdCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnIuZXJyb3IuZXJyb3IpO1xyXG4gICAgICB9LFxyXG4gIFxyXG4gIH0pXHJcbn1cclxuXHJcbmlzRW5hYmxlZCA9IGZhbHNlO1xyXG56b25lTGlzdDphbnk9W107XHJcbm9uQ2hlY2tib3hDaGFuZ2UoZXZlbnQ6YW55KXtcclxuICB0aGlzLmlzRW5hYmxlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xyXG4gIGlmKHRoaXMuaXNFbmFibGVkKXtcclxuICAgIHRoaXMuZ2V0Wm9uZUxpc3QodGhpcy5zdG9yZUlkKTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy56b25lTGlzdCA9W107XHJcbiAgfVxyXG59XHJcblxyXG5nZXRab25lTGlzdChzdG9yZTphbnkpe1xyXG4gIHRoaXMuc2VydmljZS5nZXRab25lTGlzdCh7IFwic3RvcmVJZFwiOiBbc3RvcmVdIH0pPy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZihyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCl7XHJcbiAgICAgICAgdGhpcy56b25lTGlzdCA9IHJlcz8uZGF0YVxyXG4gICAgICB9IGVsc2V7XHJcbiAgICAgICAgdGhpcy56b25lTGlzdCA9W107XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICB0aGlzLnpvbmVMaXN0ID1bXTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuXHJcbnpvbmV3aXNlbm9iOiBhbnlbXSA9IFtdO1xyXG5cclxub25Ob2JDaGFuZ2UoKSB7XHJcbiAgdGhpcy56b25ld2lzZW5vYiA9IHRoaXMuem9uZUxpc3QubWFwKCh6b25lOiBhbnkpID0+ICh7XHJcbiAgICB6b25lTmFtZTogem9uZS50YWdOYW1lID8gem9uZS50YWdOYW1lIDogem9uZS56b25lTmFtZSxcclxuICAgIG5vYkNvdW50OiBOdW1iZXIoem9uZS5ub2JDb3VudCkgfHwgMFxyXG4gIH0pKTtcclxuXHJcbiAgY29uc29sZS5sb2coJ1VwZGF0ZWQgem9uZXdpc2Vub2I6JywgdGhpcy56b25ld2lzZW5vYik7XHJcbn1cclxuIGRvd25sb2FkKCkge1xyXG4gIHRoaXMuc2VydmljZVxyXG4gICAgLmdldFpvbmVUZW1wbGF0ZSh7IGNsaWVudElkOiB0aGlzLmNsaWVudElkIHx8ICcnIH0pXHJcbiAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgdGhpcy5leGNlbFNlcnZpY2Uuc2F2ZUFzRXhjZWxGaWxlKFxyXG4gICAgICAgICAgICByZXMsXHJcbiAgICAgICAgICAgICdOT0IgVXBsb2FkIFRlbXBsYXRlJ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KCdGaWxlIGlzIGVtcHR5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBlcnIuZXJyb3I/LmVycm9yIHx8IFxyXG4gICAgICAgIGVyci5lcnJvcj8ubWVzc2FnZSB8fCBlcnIubWVzc2FnZSB8fCBlcnIuZXJyb3JcclxuICAgICAgICAgICdBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBkb3dubG9hZGluZyBmaWxlJztcclxuXHJcbiAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGVycm9yTXNnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuXHJcbn0iLCI8ZGl2ICpuZ0lmPVwidHlwZSAhPT0nZWRpdFZpZXcnICYmIHR5cGUgIT09ICd2aWV3J1wiIGNsYXNzPVwiY2FyZCBwdC0wIHBiLTMgc2Nyb2xsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTAgZC1mbGV4IGZsZXgtc3RhcnQgZmxleC1jb2x1bW4gcC05IFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJteS01IGQtZmxleFwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZSA9PT0nYWRkJ1wiIGNsYXNzPVwic3ltYm9sIHN5bWJvbC03NXB4IHN5bWJvbC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgYWx0PVwiUGljXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvYWRkLXN0b3JlLWljb24uc3ZnXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZSA9PT0ncmV1cGxvYWQnXCIgY2xhc3M9XCJzeW1ib2wgc3ltYm9sLTc1cHggc3ltYm9sLWNpcmNsZVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0RBRjFGRlwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNFQUY4RkZcIiBzdHJva2Utd2lkdGg9XCI4XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzcgMzFWMzVDMzcgMzUuNTMwNCAzNi43ODkzIDM2LjAzOTEgMzYuNDE0MiAzNi40MTQyQzM2LjAzOTEgMzYuNzg5MyAzNS41MzA0IDM3IDM1IDM3SDIxQzIwLjQ2OTYgMzcgMTkuOTYwOSAzNi43ODkzIDE5LjU4NTggMzYuNDE0MkMxOS4yMTA3IDM2LjAzOTEgMTkgMzUuNTMwNCAxOSAzNVYzMU0zMyAyNEwyOCAxOU0yOCAxOUwyMyAyNE0yOCAxOVYzMVwiIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlID09PSdhZGQnXCIgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZnMtNCB0ZXh0LWdyYXktODAwIHRleHQtaG92ZXItcHJpbWFyeSBmdy1ib2xkIG1iLTAgdGl0bGUgY3Vyc29yLXBvaW50ZXJcIj5BZGQgU2luZ2xlIE5vQjwvYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlID09PSdyZXVwbG9hZCdcIiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmcy00IHRleHQtZ3JheS04MDAgdGV4dC1ob3Zlci1wcmltYXJ5IGZ3LWJvbGQgbWItMCB0aXRsZSBjdXJzb3ItcG9pbnRlclwiPlVwbG9hZCBOb0IgZm9yPC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuPGRpdiAgKm5nSWY9XCJ0eXBlID09PSdyZXVwbG9hZCdcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtNVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayB3LTUwIGN1cnNvci1wb2ludGVyIHBzLTVcIiAoY2xpY2spPVwibm9iU3RvcmUoJ3NpbmdsZScpXCIgW25nQ2xhc3NdPVwidHlwZU5PQiA9PT0nc2luZ2xlJyA/ICdmb3JtLWNoZWNrLWlubGluZSc6J2Zvcm0tY2hlY2staW5saW5lLW5vbmUnXCIgPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInR5cGVOT0IgPT09J3NpbmdsZSdcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC01cHggIWltcG9ydGFudDtcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjAuNVwiIHk9XCIwLjVcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiByeD1cIjcuNVwiIGZpbGw9XCIjRUFGOEZGXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwLjVcIiB5PVwiMC41XCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjMDBBM0ZGXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjNcIiBmaWxsPVwiIzAwQTNGRlwiLz5cclxuICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwidHlwZU5PQiAhPT0nc2luZ2xlJ1wiIHN0eWxlPVwibWFyZ2luLXRvcDogLTVweCAhaW1wb3J0YW50O1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMC41XCIgeT1cIjAuNVwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHJ4PVwiNy41XCIgZmlsbD1cIndoaXRlXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwLjVcIiB5PVwiMC41XCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1zLTEwXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cImlubGluZVJhZGlvT3B0aW9uc1wiIGlkPVwiaW5saW5lUmFkaW8xXCIgdmFsdWU9XCJvcHRpb24xXCI+IC0tPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0zIHB0LTEyXCIgW25nQ2xhc3NdPVwidHlwZU5PQiA9PT0nc2luZ2xlJyA/ICdmb3JtLXRleHQtcHJpbWFyeSAnOidmb3JtLWRlZnVsdCdcIj5TaW5nbGUgU3RvcmU8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayAgdy01MCBjdXJzb3ItcG9pbnRlciBwcy01XCIgKGNsaWNrKT1cIm5vYlN0b3JlKCdtdWx0aXBsZScpXCIgW25nQ2xhc3NdPVwidHlwZU5PQiA9PT0nbXVsdGlwbGUnID8gJ2Zvcm0tY2hlY2staW5saW5lJzonZm9ybS1jaGVjay1pbmxpbmUtbm9uZSdcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJ0eXBlTk9CID09PSdtdWx0aXBsZSdcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC01cHggIWltcG9ydGFudDtcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjAuNVwiIHk9XCIwLjVcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiByeD1cIjcuNVwiIGZpbGw9XCIjRUFGOEZGXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwLjVcIiB5PVwiMC41XCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjMDBBM0ZGXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjNcIiBmaWxsPVwiIzAwQTNGRlwiLz5cclxuICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwidHlwZU5PQiAhPT0nbXVsdGlwbGUnXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAtNXB4ICFpbXBvcnRhbnQ7XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwLjVcIiB5PVwiMC41XCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgcng9XCI3LjVcIiBmaWxsPVwid2hpdGVcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjAuNVwiIHk9XCIwLjVcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiByeD1cIjcuNVwiIHN0cm9rZT1cIiNEMEQ1RERcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0zIHB0LTEyXCIgW25nQ2xhc3NdPVwidHlwZU5PQiA9PT0nbXVsdGlwbGUnID8gJ2Zvcm0tdGV4dC1wcmltYXJ5JzonZm9ybS1kZWZ1bHQnXCI+TXVsdGlwbGUgU3RvcmVzPC9zcGFuPlxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlTk9CID09PSdzaW5nbGUnXCIgY2xhc3M9XCJ3LTEwMCBoLTBweCBzY3JvbGxcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBweC0wIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0b3JlTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0b3JlIE5hbWU8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkIHRleHQtZGFuZ2VyXCI+ICo8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItY3VzdG9tLXNlbGVjdCBbaXRlbXNdPVwic3RvcmVMaXN0XCIgW211bHRpXT1cImZhbHNlXCIgW3NlYXJjaEZpZWxkXT1cIidzdG9yZU5hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCInc3RvcmVOYW1lJ1wiIChzZWxlY3RlZCk9XCJvbk5PQlN0b3JlU2VsZWN0KCRldmVudCwgJ3N0b3JlTmFtZScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRWYWx1ZXNdPVwiW3sgc3RvcmVOYW1lOiBzdG9yZU5hbWUgfV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLWN1c3RvbS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0b3JlSURcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5TdG9yZSBJRCAvPHNwYW4gKm5nSWY9XCJ0eXBlICE9PSdhZGQnXCI+IFN0b3JlIENvZGU8L3NwYW4+PHNwYW4gKm5nSWY9XCJ0eXBlID09PSdhZGQnXCI+IFJlZmVyZW5jZSBDb2RlPC9zcGFuPiAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydC1yZXF1aXJlZCB0ZXh0LWRhbmdlclwiPiAqPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWN1c3RvbS1zZWxlY3QgW2l0ZW1zXT1cInN0b3JlTGlzdFwiIFttdWx0aV09XCJmYWxzZVwiIFtzZWFyY2hGaWVsZF09XCInc3RvcmVJZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIidzdG9yZUlkJ1wiIChzZWxlY3RlZCk9XCJvbk5PQlN0b3JlU2VsZWN0KCRldmVudCwgJ3N0b3JlSWQnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVzXT1cIlt7IHN0b3JlSWQ6IHN0b3JlSWQgfV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLWN1c3RvbS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIkRhdGVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5TZWxlY3QgRGF0ZSA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkIHRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cIm15RGF0ZVwiIFsobmdNb2RlbCldPVwiZGF0ZVZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRGF0ZUNoYW5nZSgkZXZlbnQpXCIgIFttYXhdPVwibWF4RGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvdW50XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Tk9CIENvdW50IDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwibm9iQ291bnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlwcmVzcyk9XCJvbWl0X3NwZWNpYWxfY2hhcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiem9uZVNob3dcIiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNsaWVudERhdGE/LmlzWm9uZXdpc2VOT0JcIiBjbGFzcz1cInRvZ2dsZS13cmFwcGVyXCI+XHJcbiAgPGxhYmVsIGNsYXNzPVwic3dpdGNoXCI+XHJcbiAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJpc0VuYWJsZWRcIiAoY2hhbmdlKT1cIm9uQ2hlY2tib3hDaGFuZ2UoJGV2ZW50KVwiIC8+XHJcbiAgICA8c3BhbiBjbGFzcz1cInNsaWRlclwiPjwvc3Bhbj5cclxuICA8L2xhYmVsPlxyXG5cclxuICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiPlxyXG4gICAgQWRkIFpvbmUtd2lzZSBOb0IgQ291bnRcclxuICA8L3NwYW4+XHJcbjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0VuYWJsZWRcIiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSAqbmdJZj1cInpvbmVMaXN0Py5sZW5ndGhcIiAgY2xhc3M9XCJ0YWJsZSBib3R0b20tYm9yZGVyIHRleHQtbm93cmFwIG10LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPlpvbmUgTmFtZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5Ob0IgQ291bnQ8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5ID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCB6b25lIG9mIHpvbmVMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJweS0zIG10LTEwXCI+e3t6b25lLnRhZ05hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJweS0yXCI+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIG1iLTAgcHktMFwiIFsobmdNb2RlbCldPVwiem9uZS5ub2JDb3VudFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uTm9iQ2hhbmdlKClcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXByZXNzKT1cIm9taXRfc3BlY2lhbF9jaGFyKCRldmVudClcIj48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhem9uZUxpc3Q/Lmxlbmd0aFwiIGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctbm9kYXRhLXRhYmxlXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhLXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtc3ViXCI+VGhlcmUgaXMgbm8gcmVzdWx0IGZvciB0aGlzIFpvbmUtd2lzZSBOb0IgY291bnQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJlcnJvU2hvd1wiIGNsYXNzPVwidGV4dC1kYW5nZXIgbXQtMlwiPjxzcGFuIGNsYXNzPVwibWUtMlwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMTggMThcIiBmaWxsPVwibm9uZVwiPlxyXG48ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzE1MDU1XzE1NjQzOClcIj5cclxuPHBhdGggZD1cIk05IDZWOU05IDEySDkuMDA3NU0xNi41IDlDMTYuNSAxMy4xNDIxIDEzLjE0MjEgMTYuNSA5IDE2LjVDNC44NTc4NiAxNi41IDEuNSAxMy4xNDIxIDEuNSA5QzEuNSA0Ljg1Nzg2IDQuODU3ODYgMS41IDkgMS41QzEzLjE0MjEgMS41IDE2LjUgNC44NTc4NiAxNi41IDlaXCIgc3Ryb2tlPVwiI0I0MjMxOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbjwvZz5cclxuPGRlZnM+XHJcbjxjbGlwUGF0aCBpZD1cImNsaXAwXzE1MDU1XzE1NjQzOFwiPlxyXG48cmVjdCB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiBmaWxsPVwid2hpdGVcIi8+XHJcbjwvY2xpcFBhdGg+XHJcbjwvZGVmcz5cclxuPC9zdmc+PC9zcGFuPnt7IGVycm9TaG93IH19PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG10LTMgbWItMTBcIiByb2xlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgdy0xMDAgbWUtM1wiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwIG1zLTNcIlxyXG4gIGlkPVwiYWxlcnQtdG9hc3RcIlxyXG4gIChjbGljayk9XCJvblN1Ym1pdCgpXCJcclxuICBbZGlzYWJsZWRdPVwiXHJcbiAgICAhZGF0ZVZhbHVlIHx8XHJcbiAgICAhbm9iQ291bnQgfHxcclxuICAgICFzdG9yZUlkIHx8XHJcbiAgICAhc3RvcmVOYW1lIHx8XHJcbiAgICBpc1N1Ym1pdHRpbmdcclxuICBcIlxyXG4+XHJcbiAgPHNwYW4gKm5nSWY9XCIhaXNTdWJtaXR0aW5nICYmIHR5cGUgIT09ICdhZGQnXCI+UHJvY2VlZDwvc3Bhbj5cclxuICA8c3BhbiAqbmdJZj1cIiFpc1N1Ym1pdHRpbmcgJiYgdHlwZSA9PT0gJ2FkZCdcIj5BZGQ8L3NwYW4+XHJcbiAgPHNwYW4gKm5nSWY9XCJpc1N1Ym1pdHRpbmdcIj5QbGVhc2Ugd2FpdC4uLjwvc3Bhbj5cclxuPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlTk9CID09PSdtdWx0aXBsZSdcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1ib2xkIHRleHQtZ3JheS01MDAgbXktNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInRleHQtZ3JheS00MDAgZnctYm9sZCBmcy02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInVzZXItdGV4dFwiPlVzZSB0aGUgdGVtcGxhdGUgdG8gdXBsb2FkIG11bHRpcGxlIE5vQuKAmXMgYXQgb25jZS48L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ1c2VyLXRleHQgXCI+RG93bmxvYWQgdGhlIHRlbXBsYXRlIGhlcmUgLSA8YSAqbmdJZj1cIiFjbGllbnREYXRhPy5pc1pvbmV3aXNlTk9CXCIgaHJlZj1cIi4uLy4uL2Fzc2V0cy9maWxlcy9ub2JVcGxvYWRUZW1wbGF0ZS54bHN4XCIgZG93bmxvYWQ+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIxXCIgdmlld0JveD1cIjAgMCAyMCAyMVwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTNWMTYuMzMzM0MxNy41IDE2Ljc3NTQgMTcuMzI0NCAxNy4xOTkzIDE3LjAxMTggMTcuNTExOEMxNi42OTkzIDE3LjgyNDQgMTYuMjc1NCAxOCAxNS44MzMzIDE4SDQuMTY2NjdDMy43MjQ2NCAxOCAzLjMwMDcyIDE3LjgyNDQgMi45ODgxNiAxNy41MTE4QzIuNjc1NTkgMTcuMTk5MyAyLjUgMTYuNzc1NCAyLjUgMTYuMzMzM1YxM001LjgzMzMzIDguODMzMzNMMTAgMTNNMTAgMTNMMTQuMTY2NyA4LjgzMzMzTTEwIDEzVjNcIiBzdHJva2U9XCIjMDA5QkYzXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz48c3BhbiBjbGFzcz1cIm1zLTIgdGV4dC1kb3dubG9hZCB0ZXh0LXByaW1hcnlcIj5Eb3dubG9hZCBUZW1wbGF0ZTwvc3Bhbj48L2E+IDxzcGFuICpuZ0lmPVwiY2xpZW50RGF0YT8uaXNab25ld2lzZU5PQlwiIGNsYXNzPVwiIHRleHQtYWN0aXZlLXByaW1hcnlcIiAgKGNsaWNrKT1cImRvd25sb2FkKClcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjFcIiB2aWV3Qm94PVwiMCAwIDIwIDIxXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxM1YxNi4zMzMzQzE3LjUgMTYuNzc1NCAxNy4zMjQ0IDE3LjE5OTMgMTcuMDExOCAxNy41MTE4QzE2LjY5OTMgMTcuODI0NCAxNi4yNzU0IDE4IDE1LjgzMzMgMThINC4xNjY2N0MzLjcyNDY0IDE4IDMuMzAwNzIgMTcuODI0NCAyLjk4ODE2IDE3LjUxMThDMi42NzU1OSAxNy4xOTkzIDIuNSAxNi43NzU0IDIuNSAxNi4zMzMzVjEzTTUuODMzMzMgOC44MzMzM0wxMCAxM00xMCAxM0wxNC4xNjY3IDguODMzMzNNMTAgMTNWM1wiIHN0cm9rZT1cIiMwMDlCRjNcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjxzcGFuIGNsYXNzPVwibXMtMiB0ZXh0LWRvd25sb2FkIHRleHQtcHJpbWFyeSBjdXJzb3ItcG9pbnRlclwiPkRvd25sb2FkIFRlbXBsYXRlPC9zcGFuPjwvc3Bhbj48L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ1c2VyLXRleHQgXCI+QWRkIHlvdXIgZGF0YSB0byB0aGUgVGVtcGxhdGUgRmlsZTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInVzZXItdGV4dFwiPlVwbG9hZCBpdCBiZWxvdyBmb3IgcHJvY2Vzc2luZzwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGVOT0IgPT09J211bHRpcGxlJ1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm10LTMgbXMtMyByaWdodC1iYXIgcHktMTAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT1cImFjY291bnRUeXBlXCIgdHlwZT1cInJhZGlvXCIgaWQ9XCJrdF9jcmVhdGVfYWNjb3VudF9mb3JtX2FjY291bnRfdHlwZV9wZXJzb25hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJwZXJzb25hbFwiIGNsYXNzPVwiYnRuLWNoZWNrXCIgbmctcmVmbGVjdC1uYW1lPVwiYWNjb3VudFR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIG5nLXJlZmxlY3QtZm9ybS1jb250cm9sLW5hbWU9XCJhY2NvdW50VHlwZVwiICAgKGNoYW5nZSk9XCJvblVwbG9hZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICBuZy1yZWZsZWN0LXZhbHVlPVwicGVyc29uYWxcIiB0eXBlPVwiZmlsZVwiICNpbnB1dEZpbGUgLz5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJrdF9jcmVhdGVfYWNjb3VudF9mb3JtX2FjY291bnRfdHlwZV9wZXJzb25hbFwiIGNsYXNzPVwiIHctNTAgcC00IG10LTVcIj48c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZ3LWJvbGQgdGV4dC1jZW50ZXIgdy0xMDAgZnMtNFwiPlxyXG48ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0NlwiIGhlaWdodD1cIjQ2XCIgdmlld0JveD1cIjAgMCA0NiA0NlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjNcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiByeD1cIjIwXCIgZmlsbD1cIiNGMkY0RjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjNcIiB5PVwiM1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiMjBcIiBzdHJva2U9XCIjRjlGQUZCXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCI2XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfNDA0N180MDU2NilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTI2LjMzMzMgMjYuMzMzNEwyMyAyM00yMyAyM0wxOS42NjY2IDI2LjMzMzRNMjMgMjNWMzAuNU0yOS45OTE2IDI4LjMyNUMzMC44MDQ0IDI3Ljg4MTkgMzEuNDQ2NSAyNy4xODA4IDMxLjgxNjUgMjYuMzMyMkMzMi4xODY2IDI1LjQ4MzcgMzIuMjYzNSAyNC41MzYxIDMyLjAzNTEgMjMuNjM4OUMzMS44MDY4IDIyLjc0MTggMzEuMjg2MiAyMS45NDYzIDMwLjU1NTUgMjEuMzc3OUMyOS44MjQ4IDIwLjgwOTUgMjguOTI1NyAyMC41MDA2IDI4IDIwLjVIMjYuOTVDMjYuNjk3NyAxOS41MjQ0IDI2LjIyNzYgMTguNjE4NiAyNS41NzQ5IDE3Ljg1MDlDMjQuOTIyMiAxNy4wODMxIDI0LjEwNCAxNi40NzMyIDIzLjE4MTcgMTYuMDY3MkMyMi4yNTk0IDE1LjY2MTIgMjEuMjU3MSAxNS40Njk1IDIwLjI1MDEgMTUuNTA2NkMxOS4yNDMgMTUuNTQzNyAxOC4yNTc1IDE1LjgwODYgMTcuMzY3NiAxNi4yODE0QzE2LjQ3NzcgMTYuNzU0MiAxNS43MDY2IDE3LjQyMjYgMTUuMTEyMiAxOC4yMzYzQzE0LjUxNzcgMTkuMDUwMSAxNC4xMTU1IDE5Ljk4OCAxMy45MzU4IDIwLjk3OTVDMTMuNzU2IDIxLjk3MTEgMTMuODAzNCAyMi45OTA1IDE0LjA3NDMgMjMuOTYxMUMxNC4zNDUyIDI0LjkzMTcgMTQuODMyNyAyNS44MjgyIDE1LjUgMjYuNTgzNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzQwNDdfNDA1NjZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxMyAxMylcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhLXRpdGxlXCI+PHNwYW4gY2xhc3M9XCJjbGljay11cGxvYWQgY3Vyc29yLXBvaW50ZXJcIj5DbGljayB0b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cImRyYWctZHJvcFwiPiBvciBkcmFnIGFuZCBkcm9wIHRoZSB0ZW1wbGF0ZTwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgICpuZ0lmPVwidHlwZU5PQiA9PT0nbXVsdGlwbGUnXCIgY2xhc3M9XCJkLWZsZXggbXQtMyBtYi0xMFwiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTEwMCBtZS0zXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwIG1zLTNcIiBpZD1cImFsZXJ0LXRvYXN0XCIgKGNsaWNrKT1cInByb2NlZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgID5Qcm9jZWVkPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiAqbmdJZj1cInR5cGUgPT09J2VkaXRWaWV3JyB8fCB0eXBlID09PSAndmlldydcIiBjbGFzcz1cImNhcmQgcHQtMCAgcGItMyBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktMCBkLWZsZXggZmxleC1zdGFydCBmbGV4LWNvbHVtbiBwLTkgXCI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMCBtdC01XCI+XHJcbiAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImZzLTQgdGV4dC1ncmF5LTgwMCB0ZXh0LWhvdmVyLXByaW1hcnkgZnctYm9sZCBtYi0wIHRpdGxlIGN1cnNvci1wb2ludGVyXCI+Wm9uZS13aXNlIE5vQlxyXG4gICAgICAgICAgICAgICAgICAgIENvdW50PC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGUgPT09ICd2aWV3J1wiIGNsYXNzPVwiY29sLW1kLTYgdGV4dC1lbmRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiY2FuY2VsKClcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cclxuPHBhdGggZD1cIk0xMyAxTDEgMTNNMSAxTDEzIDEzXCIgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbjwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInpvbmVMaXN0Py5sZW5ndGhcIiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmUgbWF4LWgtNTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBib3R0b20tYm9yZGVyIHRleHQtbm93cmFwIG10LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPlpvbmUgTmFtZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5Ob0IgQ291bnQ8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHpvbmUgb2Ygem9uZUxpc3Q7bGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicHktMyBtdC0xMFwiPnt7em9uZS56b25lTmFtZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInB5LTJcIj48c3BhbiAqbmdJZj1cInR5cGUgPT09ICd2aWV3JyB8fCAhaXNFZGl0RW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB6b25lLm5vYkNvdW50IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVESVQgTU9ERSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJ0eXBlID09PSAnZWRpdFZpZXcnICYmIGlzRWRpdEVuYWJsZWRcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiem9uZS5ub2JDb3VudFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uTm9iQ2hhbmdlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwib21pdF9zcGVjaWFsX2NoYXIoJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiF6b25lTGlzdD8ubGVuZ3RoXCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctbm9kYXRhLXRhYmxlXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhLXN1YlwiPlRoZXJlIGlzIG5vIHJlc3VsdCBmb3IgdGhpcyBab25lLXdpc2UgTm9CIGNvdW50PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZXJyb1Nob3dcIiBjbGFzcz1cInRleHQtZGFuZ2VyIG10LTJcIj48c3BhbiBjbGFzcz1cIm1lLTJcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNTA1NV8xNTY0MzgpXCI+XHJcbjxwYXRoIGQ9XCJNOSA2VjlNOSAxMkg5LjAwNzVNMTYuNSA5QzE2LjUgMTMuMTQyMSAxMy4xNDIxIDE2LjUgOSAxNi41QzQuODU3ODYgMTYuNSAxLjUgMTMuMTQyMSAxLjUgOUMxLjUgNC44NTc4NiA0Ljg1Nzg2IDEuNSA5IDEuNUMxMy4xNDIxIDEuNSAxNi41IDQuODU3ODYgMTYuNSA5WlwiIHN0cm9rZT1cIiNCNDIzMThcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG48L2c+XHJcbjxkZWZzPlxyXG48Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNTA1NV8xNTY0MzhcIj5cclxuPHJlY3Qgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIndoaXRlXCIvPlxyXG48L2NsaXBQYXRoPlxyXG48L2RlZnM+XHJcbjwvc3ZnPjwvc3Bhbj57eyBlcnJvU2hvdyB9fTwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlID09PSdlZGl0VmlldycgJiYgaXNFZGl0RW5hYmxlZFwiIGNsYXNzPVwiZC1mbGV4IG10LTMgbWItMTBcIiByb2xlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwIG1lLTNcIiAoY2xpY2spPVwiY2FuY2VsRWRpdCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTEwMCBtcy0zXCIgaWQ9XCJhbGVydC10b2FzdFwiIChjbGljayk9XCJvblN1Ym1pdCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFkYXRlVmFsdWUgfHwgIW5vYkNvdW50IHx8ICFzdG9yZUlkIHx8ICFzdG9yZU5hbWVcIj48c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0eXBlICE9PSdhZGQnXCI+U2F2ZTwvc3Bhbj48c3BhbiAqbmdJZj1cInR5cGUgPT09J2FkZCdcIj5BZGQ8L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19
461
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLW5vYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYWZmaWMvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1ub2IvYWRkLW5vYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYWZmaWMvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1ub2IvYWRkLW5vYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULEtBQUssRUFHTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHMUMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7QUFTM0MsTUFBTSxPQUFPLGVBQWU7SUFNaEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFYRCxJQUFJLENBQU07SUFDVixRQUFRLENBQU07SUFDdkIsT0FBTyxDQUFZO0lBQ0YsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDMUMsWUFDVSxFQUFlLEVBQ2YsT0FBdUIsRUFDdkIsWUFBMEIsRUFDMUIsV0FBMkIsRUFDM0IsRUFBZ0IsRUFDaEIsRUFBcUIsRUFDckIsUUFBa0I7UUFObEIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMzQixPQUFFLEdBQUYsRUFBRSxDQUFjO1FBQ2hCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQVU7SUFDekIsQ0FBQztJQUNKLFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFDRCxRQUFRLENBQU07SUFDZCxPQUFPLEdBQVcsRUFBRSxDQUFDO0lBQ3JCLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDdEIsVUFBVSxDQUFNO0lBQ2hCLFFBQVE7UUFDTixJQUFJLElBQUksR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxNQUFNLEdBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDcEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU87Z0JBQ3BDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdELENBQUMsQ0FBQyxJQUFJLENBQUM7WUFFVCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBRXZDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxjQUFjO1lBQ3pELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2FBQzNCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO2FBQzVCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBRTNCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ3BFO2FBQU07WUFDTCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztTQUNwQjtRQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsU0FBUyxHQUFVLEVBQUUsQ0FBQztJQUN0QixlQUFlLENBQUMsTUFBVztRQUN6QixJQUFJLENBQUMsT0FBTzthQUNULGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDeEIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUMvQixTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLEVBQUU7b0JBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7aUJBQ2xDO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUUsQ0FBQztTQUNuQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsU0FBUyxDQUFNO0lBQ2YsT0FBTyxDQUFNO0lBQ2IsU0FBUyxDQUFNO0lBQ2YsU0FBUyxDQUFNO0lBQ2YsUUFBUSxDQUFNO0lBQ2QsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixnQkFBZ0IsQ0FBQyxLQUFVLEVBQUUsSUFBNkI7UUFDeEQsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7WUFDdEUsT0FBTztTQUNSO1FBQ0QsSUFBSSxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDL0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLFNBQVMsQ0FDL0MsQ0FBQztZQUNGLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO2FBQ2xDO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQzthQUNyQjtTQUNGO2FBQU0sSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDL0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FDM0MsQ0FBQztZQUNGLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO2FBQ2xDO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQzthQUNyQjtTQUNGO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QseUNBQXlDO0lBQzNDLENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxLQUFVO1FBQzFCLElBQUksQ0FBQyxDQUFDO1FBQ04sQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxpREFBaUQ7UUFDckUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsVUFBVTtRQUNSLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDekIsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0M7UUFDeEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELGdDQUFnQztRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELFlBQVksQ0FBQyxLQUFVO1FBQ3JCLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3hDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDL0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUNqRDtJQUNILENBQUM7SUFDRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELFFBQVEsR0FBUSxFQUFFLENBQUM7SUFDbkIsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixRQUFRO1FBQ04sK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixPQUFPO1NBQ1I7UUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FDdkMsQ0FBQyxHQUFXLEVBQUUsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUN4RCxDQUFDLENBQ0YsQ0FBQztRQUVGLElBQUksU0FBUyxHQUFHLFVBQVUsRUFBRTtZQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLCtDQUErQyxDQUFDO1lBQ2hFLE9BQU87U0FDUjtRQUVELGdCQUFnQjtRQUNoQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUV6QixNQUFNLEdBQUcsR0FBRztZQUNWLEtBQUssRUFBRTtnQkFDTDtvQkFDRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU87b0JBQ3pELE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDdkIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUMvQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7aUJBQzlCO2FBQ0Y7WUFDRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDeEIsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPO2FBQ1QsY0FBYyxDQUFDLEdBQUcsQ0FBQztZQUNwQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQy9CLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLEdBQUcsRUFBRSxJQUFJLEtBQUssR0FBRyxFQUFFO29CQUNyQixJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUNsQztxQkFBTTtvQkFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztvQkFDMUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQUMsQ0FBQztpQkFDckQ7WUFDSCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssSUFBSSxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7WUFDRCxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUNiLG1CQUFtQjtnQkFDbkIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDNUIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxPQUFPLEdBQUcsUUFBUSxDQUFDO0lBQ25CLFFBQVEsQ0FBQyxJQUFTO1FBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsWUFBWSxDQUFNO0lBQ2xCLGFBQWEsQ0FBTTtJQUNLLFNBQVMsQ0FBYTtJQUM5QyxRQUFRLENBQUMsS0FBVTtRQUNqQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUVsQixNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBRWhDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUN6QixJQUFJO2dCQUNGLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUVuQyxNQUFNLFFBQVEsR0FBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ3BELElBQUksRUFBRSxRQUFRO2lCQUNmLENBQUMsQ0FBQztnQkFFSCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLFNBQVMsS0FBSyxLQUFLLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7b0JBQzlELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdEIsT0FBTztpQkFDUjtnQkFDRCxNQUFNLFNBQVMsR0FBWSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUU7b0JBQ3pELE1BQU0sRUFBRSxDQUFDO29CQUNULE1BQU0sRUFBRSxJQUFJO2lCQUNiLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN0QyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO29CQUM3QyxPQUFPO2lCQUNSO2dCQUVELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDeEUsTUFBTSxZQUFZLEdBQUc7b0JBQ25CLE1BQU07b0JBQ04sU0FBUztvQkFDVCxVQUFVO29CQUNWLFNBQVM7b0JBQ1QsVUFBVTtpQkFDWCxDQUFDO2dCQUNGLE1BQU0sV0FBVyxHQUFHO29CQUNsQixVQUFVO29CQUNWLGlCQUFpQjtvQkFDakIsbUJBQW1CO29CQUNuQixVQUFVO29CQUNWLG1CQUFtQjtpQkFDcEIsQ0FBQztnQkFFRixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRWhDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV6QyxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNELE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RELE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ2hELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUNuQixpRkFBaUYsQ0FDbEYsQ0FBQztvQkFDRixPQUFPO2lCQUNSO2dCQUNELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRWhDLE1BQU0sS0FBSyxHQUFHLElBQUk7cUJBQ2YsR0FBRyxDQUFDLENBQUMsR0FBVSxFQUFFLFFBQWdCLEVBQUUsRUFBRTtvQkFDcEMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FDMUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNQLElBQUksS0FBSyxJQUFJO3dCQUNiLElBQUksS0FBSyxTQUFTO3dCQUNsQixDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDLENBQzVDLENBQUM7b0JBQ0YsSUFBSSxVQUFVO3dCQUFFLE9BQU8sSUFBSSxDQUFDO29CQUU1QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLENBQUMsT0FBTyxFQUFFO3dCQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3FCQUM5RDtvQkFFRCxJQUFJLE9BQU8sR0FBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFCLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxFQUFFLEVBQUU7d0JBQy9ELE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3FCQUN4RDtvQkFFRCxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRTt3QkFDL0IsT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDMUM7eUJBQU0sSUFBSSxPQUFPLFlBQVksSUFBSSxFQUFFO3FCQUNuQzt5QkFBTSxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRTt3QkFDdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ2pDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFOzRCQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzt5QkFDL0Q7d0JBQ0QsT0FBTyxHQUFHLE1BQU0sQ0FBQztxQkFDbEI7eUJBQU07d0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQy9EO29CQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztvQkFDbEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNyQixJQUFJLFFBQVEsR0FBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBRTNCLElBQ0UsUUFBUSxLQUFLLElBQUk7d0JBQ2pCLFFBQVEsS0FBSyxTQUFTO3dCQUN0QixRQUFRLEtBQUssRUFBRSxFQUNmO3dCQUNBLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3FCQUM3RDtvQkFFRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUU1QixJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQzdEO29CQUVELElBQUksUUFBUSxHQUFHLE9BQU8sSUFBSSxRQUFRLEdBQUcsT0FBTyxFQUFFO3dCQUM1QyxNQUFNLElBQUksS0FBSyxDQUNiLDZCQUE2QixPQUFPLFFBQVEsT0FBTyxTQUFTLENBQzdELENBQUM7cUJBQ0g7b0JBRUQsTUFBTSxXQUFXLEdBQUcsT0FBTzt5QkFDeEIsS0FBSyxDQUFDLENBQUMsQ0FBQzt5QkFDUixHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUU7d0JBQ3ZCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBRTNCLElBQ0UsR0FBRyxLQUFLLElBQUk7NEJBQ1osR0FBRyxLQUFLLFNBQVM7NEJBQ2pCLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFDdkM7NEJBQ0EsT0FBTyxJQUFJLENBQUM7eUJBQ2I7d0JBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUMxQixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTs0QkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FDYiwyQkFBMkIsUUFBUSxHQUFHLENBQUMsS0FBSyxRQUFRLEdBQUcsQ0FDeEQsQ0FBQzt5QkFDSDt3QkFFRCxPQUFPOzRCQUNMLFFBQVE7NEJBQ1IsUUFBUSxFQUFFLEtBQUs7eUJBQ2hCLENBQUM7b0JBQ0osQ0FBQyxDQUFDO3lCQUNELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFFbkIsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxHQUFXLEVBQUUsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFDekMsQ0FBQyxDQUNGLENBQUM7b0JBRUYsSUFBSSxTQUFTLEdBQUcsUUFBUSxFQUFFO3dCQUN4QixNQUFNLElBQUksS0FBSyxDQUNiLGdEQUFnRCxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQ2hFLENBQUM7cUJBQ0g7b0JBRUQsT0FBTzt3QkFDTCxTQUFTLEVBQUUsT0FBTzt3QkFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7d0JBQ3ZELFFBQVE7d0JBQ1IsV0FBVztxQkFDWixDQUFDO2dCQUNKLENBQUMsQ0FBQztxQkFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRW5CLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO29CQUNqQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO29CQUN0RCxPQUFPO2lCQUNSO2dCQUVELElBQUksQ0FBQyxhQUFhLEdBQUc7b0JBQ25CLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDdkIsS0FBSztpQkFDTixDQUFDO2dCQUNGLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2FBQ3ZEO1lBQUMsT0FBTyxHQUFRLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksb0JBQW9CLENBQUMsQ0FBQzthQUM1RDtvQkFBUztnQkFDUixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDekI7UUFDSCxDQUFDLENBQUM7UUFFRixNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUU7WUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztTQUN6QztJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUFpQjtRQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLElBQUksSUFBSSxDQUM1QixRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUNoRCxDQUFDO1FBQ0YsT0FBTyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE9BQU87YUFDVCxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNuQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQy9CLFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRTtvQkFDM0IsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztvQkFDaEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUNsQztxQkFBTTtvQkFDTCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2lCQUNyRDtZQUNILENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsUUFBUSxHQUFRLEVBQUUsQ0FBQztJQUNuQixnQkFBZ0IsQ0FBQyxLQUFVO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2hDO2FBQU07WUFDTCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsS0FBVTtRQUNwQixJQUFJLENBQUMsT0FBTzthQUNULFdBQVcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUMvQixTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLEVBQUU7b0JBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxFQUFFLElBQUksQ0FBQztpQkFDM0I7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7aUJBQ3BCO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsV0FBVyxHQUFVLEVBQUUsQ0FBQztJQUV4QixXQUFXO1FBQ1QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRCxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDckQsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztTQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFDRCxRQUFRO1FBQ04sSUFBSSxDQUFDLE9BQU87YUFDVCxlQUFlLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FBQzthQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxHQUFHLEVBQUU7b0JBQ1AsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLENBQUMsQ0FBQztpQkFDaEU7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7aUJBQ3hDO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNsQixNQUFNLFFBQVEsR0FDWixHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQ3JFLENBQUMsMENBQTBDLENBQUMsQ0FBQztnQkFFN0MsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNQLENBQUM7d0dBdmVVLGVBQWU7NEZBQWYsZUFBZSxzRkFGZixDQUFDLFFBQVEsQ0FBQyxrSUN0QnZCLHM5b0JBc1NNOzs0RkQ5UU8sZUFBZTtrQkFOM0IsU0FBUzsrQkFDRSxhQUFhLGFBR1osQ0FBQyxRQUFRLENBQUM7dVBBR1osSUFBSTtzQkFBWixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBNE1rQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgVHJhZmZpY1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvdHJhZmZpYy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktc2hhcmVkXCI7XHJcbmltcG9ydCAqIGFzIFhMU1ggZnJvbSBcInhsc3hcIjtcclxuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IEV4Y2VsU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9leGNlbC5zZXJ2aWNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItYWRkLW5vYlwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vYWRkLW5vYi5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vYWRkLW5vYi5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHByb3ZpZGVyczogW0RhdGVQaXBlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFkZE5vYkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSB0eXBlOiBhbnk7XHJcbiAgQElucHV0KCkgdmlld0RhdGE6IGFueTtcclxuICBub2JGb3JtOiBGb3JtR3JvdXA7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgc2VydmljZTogVHJhZmZpY1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGV4Y2VsU2VydmljZTogRXhjZWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXHJcbiAgICBwcml2YXRlIHRzOiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlXHJcbiAgKSB7fVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuICBjbGllbnRJZDogYW55O1xyXG4gIG1heERhdGU6IHN0cmluZyA9IFwiXCI7XHJcbiAgaXNFZGl0RW5hYmxlZCA9IGZhbHNlO1xyXG4gIGNsaWVudERhdGE6IGFueTtcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCBkYXRhOiBhbnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgfHwgXCJcIik7XHJcbiAgICB0aGlzLmNsaWVudElkID0gZGF0YS5jbGllbnQ7XHJcbiAgICBsZXQgY2xpZW50OiBhbnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY2xpZW50LWRldGFpbHNcIikgfHwgXCJcIik7XHJcbiAgICB0aGlzLmNsaWVudERhdGEgPSBjbGllbnQ7XHJcbiAgICB0aGlzLmdldE5vYlN0b3JlTGlzdChkYXRhLmNsaWVudCk7XHJcbiAgICB0aGlzLnNldE1heERhdGUoKTtcclxuICAgIGlmICh0aGlzLnR5cGUgPT09IFwiZWRpdFZpZXdcIiB8fCB0aGlzLnR5cGUgPT09IFwidmlld1wiKSB7XHJcbiAgICAgIHRoaXMuc3RvcmVOYW1lID0gdGhpcy52aWV3RGF0YS5zdG9yZU5hbWU7XHJcbiAgICAgIHRoaXMuc3RvcmVJZCA9IHRoaXMudmlld0RhdGEuc3RvcmVJZDtcclxuICAgICAgdGhpcy5zdG9yZUNvZGUgPSB0aGlzLnZpZXdEYXRhLnN0b3JlQ29kZTtcclxuICAgICAgdGhpcy5kYXRlVmFsdWUgPSB0aGlzLnZpZXdEYXRhLm5vYkRhdGVcclxuICAgICAgICA/IG5ldyBEYXRlKHRoaXMudmlld0RhdGEubm9iRGF0ZSkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF1cclxuICAgICAgICA6IG51bGw7XHJcblxyXG4gICAgICB0aGlzLm5vYkNvdW50ID0gdGhpcy52aWV3RGF0YS5ub2JDb3VudDtcclxuXHJcbiAgICAgIHRoaXMuem9uZUxpc3QgPSB0aGlzLnZpZXdEYXRhLnpvbmV3aXNlbm9iOyAvLyBrZWVwIHZhbHVlc1xyXG4gICAgICBpZiAodGhpcy50eXBlID09PSBcImVkaXRWaWV3XCIpIHtcclxuICAgICAgICB0aGlzLmlzRWRpdEVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaXNFZGl0RW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5jZWxFZGl0KCkge1xyXG4gICAgdGhpcy5pc0VkaXRFbmFibGVkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMudmlld0RhdGE/LnpvbmVMaXN0KSB7XHJcbiAgICAgIHRoaXMuem9uZUxpc3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMudmlld0RhdGEuem9uZUxpc3QpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuem9uZUxpc3QgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbmNlbCgpO1xyXG4gIH1cclxuXHJcbiAgc3RvcmVMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIGdldE5vYlN0b3JlTGlzdChjbGllbnQ6IGFueSkge1xyXG4gICAgdGhpcy5zZXJ2aWNlXHJcbiAgICAgIC5nZXROT0JTdG9yZUxpc3QoY2xpZW50KVxyXG4gICAgICA/LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IHJlcy5kYXRhLnJlc3VsdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7fSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdG9yZU5hbWU6IGFueTtcclxuICBzdG9yZUlkOiBhbnk7XHJcbiAgZGF0ZVZhbHVlOiBhbnk7XHJcbiAgc3RvcmVDb2RlOiBhbnk7XHJcbiAgbm9iQ291bnQ6IGFueTtcclxuICB6b25lU2hvdyA9IGZhbHNlO1xyXG4gIG9uTk9CU3RvcmVTZWxlY3QoZXZlbnQ6IGFueSwgdHlwZTogXCJzdG9yZU5hbWVcIiB8IFwic3RvcmVJZFwiKTogdm9pZCB7XHJcbiAgICBpZiAoIWV2ZW50KSB7XHJcbiAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcInN0b3JlTmFtZSBvciBzdG9yZUlkIGlzIHVuZGVmaW5lZCBvciBpbnZhbGlkXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZSA9PT0gXCJzdG9yZU5hbWVcIikge1xyXG4gICAgICB0aGlzLnN0b3JlTmFtZSA9IGV2ZW50LnN0b3JlTmFtZTtcclxuICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlTGlzdC5maW5kKFxyXG4gICAgICAgIChzdG9yZSkgPT4gc3RvcmUuc3RvcmVOYW1lID09PSBldmVudC5zdG9yZU5hbWVcclxuICAgICAgKTtcclxuICAgICAgaWYgKHN0b3JlKSB7XHJcbiAgICAgICAgdGhpcy5zdG9yZUlkID0gc3RvcmUuc3RvcmVJZDtcclxuICAgICAgICB0aGlzLnN0b3JlQ29kZSA9IHN0b3JlLnN0b3JlQ29kZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0b3JlSWQgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc3RvcmVDb2RlID0gXCJcIjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcInN0b3JlSWRcIikge1xyXG4gICAgICB0aGlzLnN0b3JlSWQgPSBldmVudC5zdG9yZUlkO1xyXG4gICAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmVMaXN0LmZpbmQoXHJcbiAgICAgICAgKHN0b3JlKSA9PiBzdG9yZS5zdG9yZUlkID09PSBldmVudC5zdG9yZUlkXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChzdG9yZSkge1xyXG4gICAgICAgIHRoaXMuc3RvcmVOYW1lID0gc3RvcmUuc3RvcmVOYW1lO1xyXG4gICAgICAgIHRoaXMuc3RvcmVDb2RlID0gc3RvcmUuc3RvcmVDb2RlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RvcmVOYW1lID0gXCJcIjtcclxuICAgICAgICB0aGlzLnN0b3JlQ29kZSA9IFwiXCI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuem9uZVNob3cgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaXNFbmFibGVkKSB7XHJcbiAgICAgIHRoaXMuZ2V0Wm9uZUxpc3QodGhpcy5zdG9yZUlkKTtcclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUubG9nKCdzdG9yZU5hbWUnLHRoaXMuc3RvcmVJZCk7XHJcbiAgfVxyXG4gIG9taXRfc3BlY2lhbF9jaGFyKGV2ZW50OiBhbnkpIHtcclxuICAgIHZhciBrO1xyXG4gICAgayA9IGV2ZW50LmNoYXJDb2RlOyAvLyAgICAgICAgIGsgPSBldmVudC5rZXlDb2RlOyAgKEJvdGggY2FuIGJlIHVzZWQpXHJcbiAgICByZXR1cm4gayA9PSA4IHx8IGsgPT0gMzIgfHwgKGsgPj0gNDggJiYgayA8PSA1Nyk7XHJcbiAgfVxyXG4gIHNldE1heERhdGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgICBjb25zdCB5ZXN0ZXJkYXkgPSBuZXcgRGF0ZSh0b2RheSk7XHJcbiAgICB5ZXN0ZXJkYXkuc2V0RGF0ZSh0b2RheS5nZXREYXRlKCkgLSAxKTsgLy8gU2V0IHRoZSBtYXggZGF0ZSB0byB5ZXN0ZXJkYXlcclxuICAgIHRoaXMuZGF0ZVZhbHVlID0geWVzdGVyZGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdO1xyXG4gICAgLy8gRm9ybWF0IHRoZSBkYXRlIGFzIHl5eXktTU0tZGRcclxuICAgIHRoaXMubWF4RGF0ZSA9IHllc3RlcmRheS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXTtcclxuICB9XHJcbiAgb25EYXRlQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgIGlmIChzZWxlY3RlZERhdGUgPiB0aGlzLm1heERhdGUpIHtcclxuICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiSW52YWxpZCBkYXRlIHNlbGVjdGVkIVwiKTtcclxuICAgIH1cclxuICB9XHJcbiAgY2FuY2VsKCkge1xyXG4gICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZShcImNsb3NlXCIpO1xyXG4gIH1cclxuICBlcnJvU2hvdzogYW55ID0gXCJcIjtcclxuICBpc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICBvblN1Ym1pdCgpIHtcclxuICAgIC8vIOKblCBTVE9QIGlmIGFscmVhZHkgc3VibWl0dGluZ1xyXG4gICAgaWYgKHRoaXMuaXNTdWJtaXR0aW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvdmVyYWxsTm9iID0gTnVtYmVyKHRoaXMubm9iQ291bnQpIHx8IDA7XHJcblxyXG4gICAgY29uc3Qgem9uZVRvdGFsID0gdGhpcy56b25ld2lzZW5vYi5yZWR1Y2UoXHJcbiAgICAgIChzdW06IG51bWJlciwgejogYW55KSA9PiBzdW0gKyAoTnVtYmVyKHoubm9iQ291bnQpIHx8IDApLFxyXG4gICAgICAwXHJcbiAgICApO1xyXG5cclxuICAgIGlmICh6b25lVG90YWwgPiBvdmVyYWxsTm9iKSB7XHJcbiAgICAgIHRoaXMuZXJyb1Nob3cgPSBcIlpvbmUtd2lzZSBOb0IgY2Fubm90IGV4Y2VlZCBvdmVyYWxsIE5vQiBjb3VudFwiO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g4pyFIExPQ0sgQlVUVE9OXHJcbiAgICB0aGlzLmlzU3VibWl0dGluZyA9IHRydWU7XHJcblxyXG4gICAgY29uc3Qgb2JqID0ge1xyXG4gICAgICBiaWxsczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHN0b3JlQ29kZTogdGhpcy5zdG9yZUNvZGUgPyB0aGlzLnN0b3JlQ29kZSA6IHRoaXMuc3RvcmVJZCxcclxuICAgICAgICAgIG5vYkRhdGU6IHRoaXMuZGF0ZVZhbHVlLFxyXG4gICAgICAgICAgbm9iQ291bnQ6IE51bWJlcih0aGlzLm5vYkNvdW50KSxcclxuICAgICAgICAgIHpvbmV3aXNlbm9iOiB0aGlzLnpvbmV3aXNlbm9iLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgLmdldE5PQkRhdGFMaXN0KG9iailcclxuICAgICAgPy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzPy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKFwic3VibWl0XCIpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiVW5leHBlY3RlZCByZXNwb25zZSBmb3JtYXRcIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yIHx8IFwiU29tZXRoaW5nIHdlbnQgd3JvbmdcIik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgLy8g8J+UkyBVTkxPQ0sgQlVUVE9OXHJcbiAgICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdHlwZU5PQiA9IFwic2luZ2xlXCI7XHJcbiAgbm9iU3RvcmUodHlwZTogYW55KSB7XHJcbiAgICB0aGlzLnR5cGVOT0IgPSB0eXBlO1xyXG4gIH1cclxuICBkYXRhVGFibGVTaG93ID0gZmFsc2U7XHJcbiAgZGF0YVRhYmxlU2hvdzEgPSBmYWxzZTtcclxuICB0YWJsZUhlYWRlcnM6IGFueTtcclxuICBjb252ZXJ0ZWREYXRhOiBhbnk7XHJcbiAgQFZpZXdDaGlsZChcImlucHV0RmlsZVwiKSBpbnB1dEZpbGU6IEVsZW1lbnRSZWY7XHJcbiAgb25VcGxvYWQoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlcz8uWzBdO1xyXG4gICAgaWYgKCFmaWxlKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuXHJcbiAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGJpbmFyeURhdGEgPSBlLnRhcmdldC5yZXN1bHQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHdvcmtib29rOiBYTFNYLldvcmtCb29rID0gWExTWC5yZWFkKGJpbmFyeURhdGEsIHtcclxuICAgICAgICAgIHR5cGU6IFwiYmluYXJ5XCIsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNoZWV0TmFtZSA9IHdvcmtib29rLlNoZWV0TmFtZXNbMF07XHJcbiAgICAgICAgY29uc3Qgc2hlZXQgPSB3b3JrYm9vay5TaGVldHNbc2hlZXROYW1lXTtcclxuICAgICAgICBpZiAoc2hlZXROYW1lICE9PSBcIk5PQlwiKSB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJQbGVhc2UgdXBsb2FkIGEgdmFsaWQgTk9CIEV4Y2VsIGZpbGVcIik7XHJcbiAgICAgICAgICB0aGlzLnJlc2V0RmlsZUlucHV0KCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNoZWV0RGF0YTogYW55W11bXSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihzaGVldCwge1xyXG4gICAgICAgICAgaGVhZGVyOiAxLFxyXG4gICAgICAgICAgZGVmdmFsOiBudWxsLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoIXNoZWV0RGF0YSB8fCBzaGVldERhdGEubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiRXhjZWwgZmlsZSBpcyBlbXB0eVwiKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IFNUT1JFX0lEX0hFQURFUlMgPSBbXCJzdG9yZWlkXCIsIFwic3RvcmUgaWRcIiwgXCJTdG9yZUlkXCIsIFwiU3RvcmUgSWRcIl07XHJcbiAgICAgICAgY29uc3QgREFURV9IRUFERVJTID0gW1xyXG4gICAgICAgICAgXCJkYXRlXCIsXHJcbiAgICAgICAgICBcIm5vYmRhdGVcIixcclxuICAgICAgICAgIFwibm9iIGRhdGVcIixcclxuICAgICAgICAgIFwiTk9CRGF0ZVwiLFxyXG4gICAgICAgICAgXCJOb0IgRGF0ZVwiLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3QgTk9CX0hFQURFUlMgPSBbXHJcbiAgICAgICAgICBcIm5vYmNvdW50XCIsXHJcbiAgICAgICAgICBcIm92ZXJhbGxub2Jjb3VudFwiLFxyXG4gICAgICAgICAgXCJvdmVyYWxsIG5vYiBjb3VudFwiLFxyXG4gICAgICAgICAgXCJOT0JDb3VudFwiLFxyXG4gICAgICAgICAgXCJPdmVyYWxsIE5vQiBDb3VudFwiLFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGNvbnN0IHJhd0hlYWRlcnMgPSBzaGVldERhdGFbMF07XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSByYXdIZWFkZXJzLm1hcCgoaCkgPT4gaCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGlzU3RvcmVWYWxpZCA9IFNUT1JFX0lEX0hFQURFUlMuaW5jbHVkZXMoaGVhZGVyc1swXSk7XHJcbiAgICAgICAgY29uc3QgaXNEYXRlVmFsaWQgPSBEQVRFX0hFQURFUlMuaW5jbHVkZXMoaGVhZGVyc1sxXSk7XHJcbiAgICAgICAgY29uc3QgaXNOb2JWYWxpZCA9IE5PQl9IRUFERVJTLmluY2x1ZGVzKGhlYWRlcnNbMl0pO1xyXG4gICAgICAgIGlmICghaXNTdG9yZVZhbGlkIHx8ICFpc0RhdGVWYWxpZCB8fCAhaXNOb2JWYWxpZCkge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgICAgICBcIkludmFsaWQgRXhjZWwgZmlsZS4gRmlyc3QgY29sdW1ucyBtdXN0IGJlIFN0b3JlIElkLCBOb0IgRGF0ZSwgT3ZlcmFsbCBOb0IgQ291bnRcIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgcm93cyA9IHNoZWV0RGF0YS5zbGljZSgxKTtcclxuXHJcbiAgICAgICAgY29uc3QgYmlsbHMgPSByb3dzXHJcbiAgICAgICAgICAubWFwKChyb3c6IGFueVtdLCByb3dJbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzRW1wdHlSb3cgPSByb3cuZXZlcnkoXHJcbiAgICAgICAgICAgICAgKGNlbGwpID0+XHJcbiAgICAgICAgICAgICAgICBjZWxsID09PSBudWxsIHx8XHJcbiAgICAgICAgICAgICAgICBjZWxsID09PSB1bmRlZmluZWQgfHxcclxuICAgICAgICAgICAgICAgICh0eXBlb2YgY2VsbCA9PT0gXCJzdHJpbmdcIiAmJiBjZWxsID09PSBcIlwiKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoaXNFbXB0eVJvdykgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdG9yZUlkID0gU3RyaW5nKHJvd1swXSA/PyBcIlwiKTtcclxuICAgICAgICAgICAgaWYgKCFzdG9yZUlkKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIFN0b3JlIENvZGUgYXQgcm93ICR7cm93SW5kZXggKyAyfWApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgbm9iRGF0ZTogYW55ID0gcm93WzFdO1xyXG4gICAgICAgICAgICBpZiAobm9iRGF0ZSA9PT0gbnVsbCB8fCBub2JEYXRlID09PSB1bmRlZmluZWQgfHwgbm9iRGF0ZSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBEYXRlIGF0IHJvdyAke3Jvd0luZGV4ICsgMn1gKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBub2JEYXRlID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgICAgbm9iRGF0ZSA9IHRoaXMuY29udmVydEV4Y2VsRGF0ZShub2JEYXRlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChub2JEYXRlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBub2JEYXRlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gbmV3IERhdGUobm9iRGF0ZSk7XHJcbiAgICAgICAgICAgICAgaWYgKGlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgRGF0ZSBmb3JtYXQgYXQgcm93ICR7cm93SW5kZXggKyAyfWApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBub2JEYXRlID0gcGFyc2VkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBEYXRlIGZvcm1hdCBhdCByb3cgJHtyb3dJbmRleCArIDJ9YCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IE1JTl9OT0IgPSAwO1xyXG4gICAgICAgICAgICBjb25zdCBNQVhfTk9CID0gOTk5OTtcclxuICAgICAgICAgICAgbGV0IG5vYkNvdW50OiBhbnkgPSByb3dbMl07XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgbm9iQ291bnQgPT09IG51bGwgfHxcclxuICAgICAgICAgICAgICBub2JDb3VudCA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgICAgICAgbm9iQ291bnQgPT09IFwiXCJcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIE5vQiBjb3VudCBhdCByb3cgJHtyb3dJbmRleCArIDJ9YCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG5vYkNvdW50ID0gTnVtYmVyKG5vYkNvdW50KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc05hTihub2JDb3VudCkpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgTm9CIGNvdW50IGF0IHJvdyAke3Jvd0luZGV4ICsgMn1gKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG5vYkNvdW50IDwgTUlOX05PQiB8fCBub2JDb3VudCA+IE1BWF9OT0IpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICBgTm9CIGNvdW50IG11c3QgYmUgYmV0d2VlbiAke01JTl9OT0J9IGFuZCAke01BWF9OT0J9IGF0IHJvd2BcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCB6b25ld2lzZW5vYiA9IGhlYWRlcnNcclxuICAgICAgICAgICAgICAuc2xpY2UoMylcclxuICAgICAgICAgICAgICAubWFwKCh6b25lTmFtZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHJvd1tpbmRleCArIDNdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgcmF3ID09PSBudWxsIHx8XHJcbiAgICAgICAgICAgICAgICAgIHJhdyA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgICAgICAgICAgICh0eXBlb2YgcmF3ID09PSBcInN0cmluZ1wiICYmIHJhdyA9PT0gXCJcIilcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE51bWJlcihyYXcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgYEludmFsaWQgWm9uZSBOb0IgYXQgcm93ICR7cm93SW5kZXggKyAyfSAoJHt6b25lTmFtZX0pYFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgIHpvbmVOYW1lLFxyXG4gICAgICAgICAgICAgICAgICBub2JDb3VudDogdmFsdWUsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHpvbmVUb3RhbCA9IHpvbmV3aXNlbm9iLnJlZHVjZShcclxuICAgICAgICAgICAgICAoc3VtOiBudW1iZXIsIHo6IGFueSkgPT4gc3VtICsgei5ub2JDb3VudCxcclxuICAgICAgICAgICAgICAwXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBpZiAoem9uZVRvdGFsID4gbm9iQ291bnQpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICBgWm9uZS13aXNlIE5vQiBjYW5ub3QgZXhjZWVkIG92ZXJhbGwgTm9CIChSb3cgJHtyb3dJbmRleCArIDJ9KWBcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIHN0b3JlQ29kZTogc3RvcmVJZCxcclxuICAgICAgICAgICAgICBub2JEYXRlOiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShub2JEYXRlLCBcInl5eXktTU0tZGRcIiksXHJcbiAgICAgICAgICAgICAgbm9iQ291bnQsXHJcbiAgICAgICAgICAgICAgem9uZXdpc2Vub2IsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcclxuXHJcbiAgICAgICAgaWYgKCFiaWxscy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIk5vIHZhbGlkIHJvd3MgZm91bmQgaW4gRXhjZWxcIik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNvbnZlcnRlZERhdGEgPSB7XHJcbiAgICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgICAgIGJpbGxzLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5kYXRhVGFibGVTaG93ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdChcIkZpbGUgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyLm1lc3NhZ2UgfHwgXCJJbnZhbGlkIEV4Y2VsIGZpbGVcIik7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgdGhpcy5yZXNldEZpbGVJbnB1dCgpO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoZmlsZSk7XHJcbiAgfVxyXG5cclxuICByZXNldEZpbGVJbnB1dCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlucHV0RmlsZSAmJiB0aGlzLmlucHV0RmlsZS5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIlwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29udmVydEV4Y2VsRGF0ZShleGNlbERhdGU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBiYXNlRGF0ZSA9IG5ldyBEYXRlKDE5MDAsIDAsIDEpO1xyXG4gICAgY29uc3QgY29ycmVjdGVkRGF0ZSA9IG5ldyBEYXRlKFxyXG4gICAgICBiYXNlRGF0ZS5nZXRUaW1lKCkgKyAoZXhjZWxEYXRlIC0gMSkgKiA4NjQwMDAwMFxyXG4gICAgKTtcclxuICAgIHJldHVybiBjb3JyZWN0ZWREYXRlLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdO1xyXG4gIH1cclxuXHJcbiAgcHJvY2VlZCgpIHtcclxuICAgIHRoaXMuc2VydmljZVxyXG4gICAgICAuZ2V0Tk9CRGF0YUxpc3QodGhpcy5jb252ZXJ0ZWREYXRhKVxyXG4gICAgICA/LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwICYmIHJlcykge1xyXG4gICAgICAgICAgICBjb25zdCBhbGxNZXNzYWdlcyA9IHJlcy5tZXNzYWdlO1xyXG4gICAgICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdChhbGxNZXNzYWdlcyk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoXCJzdWJtaXRcIik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJVbmV4cGVjdGVkIHJlc3BvbnNlIGZvcm1hdFwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnIuZXJyb3IuZXJyb3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaXNFbmFibGVkID0gZmFsc2U7XHJcbiAgem9uZUxpc3Q6IGFueSA9IFtdO1xyXG4gIG9uQ2hlY2tib3hDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5pc0VuYWJsZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcclxuICAgIGlmICh0aGlzLmlzRW5hYmxlZCkge1xyXG4gICAgICB0aGlzLmdldFpvbmVMaXN0KHRoaXMuc3RvcmVJZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnpvbmVMaXN0ID0gW107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRab25lTGlzdChzdG9yZTogYW55KSB7XHJcbiAgICB0aGlzLnNlcnZpY2VcclxuICAgICAgLmdldFpvbmVMaXN0KHsgc3RvcmVJZDogW3N0b3JlXSB9KVxyXG4gICAgICA/LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnpvbmVMaXN0ID0gcmVzPy5kYXRhO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy56b25lTGlzdCA9IFtdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIHRoaXMuem9uZUxpc3QgPSBbXTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHpvbmV3aXNlbm9iOiBhbnlbXSA9IFtdO1xyXG5cclxuICBvbk5vYkNoYW5nZSgpIHtcclxuICAgIHRoaXMuem9uZXdpc2Vub2IgPSB0aGlzLnpvbmVMaXN0Lm1hcCgoem9uZTogYW55KSA9PiAoe1xyXG4gICAgICB6b25lTmFtZTogem9uZS50YWdOYW1lID8gem9uZS50YWdOYW1lIDogem9uZS56b25lTmFtZSxcclxuICAgICAgbm9iQ291bnQ6IE51bWJlcih6b25lLm5vYkNvdW50KSB8fCAwLFxyXG4gICAgfSkpO1xyXG4gIH1cclxuICBkb3dubG9hZCgpIHtcclxuICAgIHRoaXMuc2VydmljZVxyXG4gICAgICAuZ2V0Wm9uZVRlbXBsYXRlKHsgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQgfHwgXCJcIiB9KVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgICB0aGlzLmV4Y2VsU2VydmljZS5zYXZlQXNFeGNlbEZpbGUxKHJlcywgXCJOT0IgVXBsb2FkIFRlbXBsYXRlXCIpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiRmlsZSBpcyBlbXB0eVwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID1cclxuICAgICAgICAgICAgZXJyLmVycm9yPy5lcnJvciB8fCBlcnIuZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyLm1lc3NhZ2UgfHwgZXJyLmVycm9yO1xyXG4gICAgICAgICAgKFwiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZG93bmxvYWRpbmcgZmlsZVwiKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyb3JNc2cpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICpuZ0lmPVwidHlwZSAhPT0nZWRpdFZpZXcnICYmIHR5cGUgIT09ICd2aWV3J1wiIGNsYXNzPVwiY2FyZCBwdC0wIHBiLTMgc2Nyb2xsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTAgZC1mbGV4IGZsZXgtc3RhcnQgZmxleC1jb2x1bW4gcC05IFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJteS01IGQtZmxleFwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZSA9PT0nYWRkJ1wiIGNsYXNzPVwic3ltYm9sIHN5bWJvbC03NXB4IHN5bWJvbC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgYWx0PVwiUGljXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvYWRkLXN0b3JlLWljb24uc3ZnXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZSA9PT0ncmV1cGxvYWQnXCIgY2xhc3M9XCJzeW1ib2wgc3ltYm9sLTc1cHggc3ltYm9sLWNpcmNsZVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0RBRjFGRlwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNFQUY4RkZcIiBzdHJva2Utd2lkdGg9XCI4XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzcgMzFWMzVDMzcgMzUuNTMwNCAzNi43ODkzIDM2LjAzOTEgMzYuNDE0MiAzNi40MTQyQzM2LjAzOTEgMzYuNzg5MyAzNS41MzA0IDM3IDM1IDM3SDIxQzIwLjQ2OTYgMzcgMTkuOTYwOSAzNi43ODkzIDE5LjU4NTggMzYuNDE0MkMxOS4yMTA3IDM2LjAzOTEgMTkgMzUuNTMwNCAxOSAzNVYzMU0zMyAyNEwyOCAxOU0yOCAxOUwyMyAyNE0yOCAxOVYzMVwiIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlID09PSdhZGQnXCIgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZnMtNCB0ZXh0LWdyYXktODAwIHRleHQtaG92ZXItcHJpbWFyeSBmdy1ib2xkIG1iLTAgdGl0bGUgY3Vyc29yLXBvaW50ZXJcIj5BZGQgU2luZ2xlIE5vQjwvYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlID09PSdyZXVwbG9hZCdcIiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmcy00IHRleHQtZ3JheS04MDAgdGV4dC1ob3Zlci1wcmltYXJ5IGZ3LWJvbGQgbWItMCB0aXRsZSBjdXJzb3ItcG9pbnRlclwiPlVwbG9hZCBOb0IgZm9yPC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuPGRpdiAgKm5nSWY9XCJ0eXBlID09PSdyZXVwbG9hZCdcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtNVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayB3LTUwIGN1cnNvci1wb2ludGVyIHBzLTVcIiAoY2xpY2spPVwibm9iU3RvcmUoJ3NpbmdsZScpXCIgW25nQ2xhc3NdPVwidHlwZU5PQiA9PT0nc2luZ2xlJyA/ICdmb3JtLWNoZWNrLWlubGluZSc6J2Zvcm0tY2hlY2staW5saW5lLW5vbmUnXCIgPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInR5cGVOT0IgPT09J3NpbmdsZSdcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC01cHggIWltcG9ydGFudDtcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjAuNVwiIHk9XCIwLjVcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiByeD1cIjcuNVwiIGZpbGw9XCIjRUFGOEZGXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwLjVcIiB5PVwiMC41XCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjMDBBM0ZGXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjNcIiBmaWxsPVwiIzAwQTNGRlwiLz5cclxuICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwidHlwZU5PQiAhPT0nc2luZ2xlJ1wiIHN0eWxlPVwibWFyZ2luLXRvcDogLTVweCAhaW1wb3J0YW50O1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMC41XCIgeT1cIjAuNVwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHJ4PVwiNy41XCIgZmlsbD1cIndoaXRlXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwLjVcIiB5PVwiMC41XCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1zLTEwXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cImlubGluZVJhZGlvT3B0aW9uc1wiIGlkPVwiaW5saW5lUmFkaW8xXCIgdmFsdWU9XCJvcHRpb24xXCI+IC0tPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0zIHB0LTEyXCIgW25nQ2xhc3NdPVwidHlwZU5PQiA9PT0nc2luZ2xlJyA/ICdmb3JtLXRleHQtcHJpbWFyeSAnOidmb3JtLWRlZnVsdCdcIj5TaW5nbGUgU3RvcmU8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayAgdy01MCBjdXJzb3ItcG9pbnRlciBwcy01XCIgKGNsaWNrKT1cIm5vYlN0b3JlKCdtdWx0aXBsZScpXCIgW25nQ2xhc3NdPVwidHlwZU5PQiA9PT0nbXVsdGlwbGUnID8gJ2Zvcm0tY2hlY2staW5saW5lJzonZm9ybS1jaGVjay1pbmxpbmUtbm9uZSdcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJ0eXBlTk9CID09PSdtdWx0aXBsZSdcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC01cHggIWltcG9ydGFudDtcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjAuNVwiIHk9XCIwLjVcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiByeD1cIjcuNVwiIGZpbGw9XCIjRUFGOEZGXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwLjVcIiB5PVwiMC41XCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjMDBBM0ZGXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjNcIiBmaWxsPVwiIzAwQTNGRlwiLz5cclxuICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwidHlwZU5PQiAhPT0nbXVsdGlwbGUnXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAtNXB4ICFpbXBvcnRhbnQ7XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwLjVcIiB5PVwiMC41XCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgcng9XCI3LjVcIiBmaWxsPVwid2hpdGVcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjAuNVwiIHk9XCIwLjVcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiByeD1cIjcuNVwiIHN0cm9rZT1cIiNEMEQ1RERcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0zIHB0LTEyXCIgW25nQ2xhc3NdPVwidHlwZU5PQiA9PT0nbXVsdGlwbGUnID8gJ2Zvcm0tdGV4dC1wcmltYXJ5JzonZm9ybS1kZWZ1bHQnXCI+TXVsdGlwbGUgU3RvcmVzPC9zcGFuPlxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0eXBlTk9CID09PSdzaW5nbGUnXCIgY2xhc3M9XCJ3LTEwMCBoLTBweCBzY3JvbGxcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBweC0wIG1lLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0b3JlTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0b3JlIE5hbWU8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkIHRleHQtZGFuZ2VyXCI+ICo8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItY3VzdG9tLXNlbGVjdCBbaXRlbXNdPVwic3RvcmVMaXN0XCIgW211bHRpXT1cImZhbHNlXCIgW3NlYXJjaEZpZWxkXT1cIidzdG9yZU5hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCInc3RvcmVOYW1lJ1wiIChzZWxlY3RlZCk9XCJvbk5PQlN0b3JlU2VsZWN0KCRldmVudCwgJ3N0b3JlTmFtZScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRWYWx1ZXNdPVwiW3sgc3RvcmVOYW1lOiBzdG9yZU5hbWUgfV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLWN1c3RvbS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0b3JlSURcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5TdG9yZSBJRCAvPHNwYW4gKm5nSWY9XCJ0eXBlICE9PSdhZGQnXCI+IFN0b3JlIENvZGU8L3NwYW4+PHNwYW4gKm5nSWY9XCJ0eXBlID09PSdhZGQnXCI+IFJlZmVyZW5jZSBDb2RlPC9zcGFuPiAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydC1yZXF1aXJlZCB0ZXh0LWRhbmdlclwiPiAqPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWN1c3RvbS1zZWxlY3QgW2l0ZW1zXT1cInN0b3JlTGlzdFwiIFttdWx0aV09XCJmYWxzZVwiIFtzZWFyY2hGaWVsZF09XCInc3RvcmVJZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIidzdG9yZUlkJ1wiIChzZWxlY3RlZCk9XCJvbk5PQlN0b3JlU2VsZWN0KCRldmVudCwgJ3N0b3JlSWQnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVzXT1cIlt7IHN0b3JlSWQ6IHN0b3JlSWQgfV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLWN1c3RvbS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIkRhdGVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5TZWxlY3QgRGF0ZSA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkIHRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cIm15RGF0ZVwiIFsobmdNb2RlbCldPVwiZGF0ZVZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRGF0ZUNoYW5nZSgkZXZlbnQpXCIgIFttYXhdPVwibWF4RGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBjb2wteGwtNiBjb2wteHhsLTYgbWItN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvdW50XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Tk9CIENvdW50IDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4qPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwibm9iQ291bnRcIiAgbWF4bGVuZ3RoPVwiNFwiXHJcbiAgbWlubGVuZ3RoPVwiMVwiXHJcbiAgcGF0dGVybj1cIl5bMC05XXsxLDR9JFwiXHJcbiAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXByZXNzKT1cIm9taXRfc3BlY2lhbF9jaGFyKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ6b25lU2hvd1wiIGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2xpZW50RGF0YT8uaXNab25ld2lzZU5PQlwiIGNsYXNzPVwidG9nZ2xlLXdyYXBwZXJcIj5cclxuICA8bGFiZWwgY2xhc3M9XCJzd2l0Y2hcIj5cclxuICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImlzRW5hYmxlZFwiIChjaGFuZ2UpPVwib25DaGVja2JveENoYW5nZSgkZXZlbnQpXCIgLz5cclxuICAgIDxzcGFuIGNsYXNzPVwic2xpZGVyXCI+PC9zcGFuPlxyXG4gIDwvbGFiZWw+XHJcblxyXG4gIDxzcGFuIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCI+XHJcbiAgICBBZGQgWm9uZS13aXNlIE5vQiBDb3VudFxyXG4gIDwvc3Bhbj5cclxuPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzRW5hYmxlZFwiIGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlICpuZ0lmPVwiem9uZUxpc3Q/Lmxlbmd0aFwiICBjbGFzcz1cInRhYmxlIGJvdHRvbS1ib3JkZXIgdGV4dC1ub3dyYXAgbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+Wm9uZSBOYW1lPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPk5vQiBDb3VudDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHpvbmUgb2Ygem9uZUxpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInB5LTMgbXQtMTBcIj57e3pvbmUudGFnTmFtZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInB5LTJcIj48aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gbWItMCBweS0wXCIgWyhuZ01vZGVsKV09XCJ6b25lLm5vYkNvdW50XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Ob2JDaGFuZ2UoKVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwib21pdF9zcGVjaWFsX2NoYXIoJGV2ZW50KVwiPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiF6b25lTGlzdD8ubGVuZ3RoXCIgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1ub2RhdGEtdGFibGVcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YS1zdWJcIj5UaGVyZSBpcyBubyByZXN1bHQgZm9yIHRoaXMgWm9uZS13aXNlIE5vQiBjb3VudDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImVycm9TaG93XCIgY2xhc3M9XCJ0ZXh0LWRhbmdlciBtdC0yXCI+PHNwYW4gY2xhc3M9XCJtZS0yXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbjxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTUwNTVfMTU2NDM4KVwiPlxyXG48cGF0aCBkPVwiTTkgNlY5TTkgMTJIOS4wMDc1TTE2LjUgOUMxNi41IDEzLjE0MjEgMTMuMTQyMSAxNi41IDkgMTYuNUM0Ljg1Nzg2IDE2LjUgMS41IDEzLjE0MjEgMS41IDlDMS41IDQuODU3ODYgNC44NTc4NiAxLjUgOSAxLjVDMTMuMTQyMSAxLjUgMTYuNSA0Ljg1Nzg2IDE2LjUgOVpcIiBzdHJva2U9XCIjQjQyMzE4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuPC9nPlxyXG48ZGVmcz5cclxuPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTUwNTVfMTU2NDM4XCI+XHJcbjxyZWN0IHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJ3aGl0ZVwiLz5cclxuPC9jbGlwUGF0aD5cclxuPC9kZWZzPlxyXG48L3N2Zz48L3NwYW4+e3sgZXJyb1Nob3cgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbXQtMyBtYi0xMFwiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTEwMCBtZS0zXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDAgbXMtM1wiXHJcbiAgaWQ9XCJhbGVydC10b2FzdFwiXHJcbiAgKGNsaWNrKT1cIm9uU3VibWl0KClcIlxyXG4gIFtkaXNhYmxlZF09XCJcclxuICAgICFkYXRlVmFsdWUgfHxcclxuICAgICFub2JDb3VudCB8fFxyXG4gICAgIXN0b3JlSWQgfHxcclxuICAgICFzdG9yZU5hbWUgfHxcclxuICAgIGlzU3VibWl0dGluZ1xyXG4gIFwiXHJcbj5cclxuICA8c3BhbiAqbmdJZj1cIiFpc1N1Ym1pdHRpbmcgJiYgdHlwZSAhPT0gJ2FkZCdcIj5Qcm9jZWVkPC9zcGFuPlxyXG4gIDxzcGFuICpuZ0lmPVwiIWlzU3VibWl0dGluZyAmJiB0eXBlID09PSAnYWRkJ1wiPkFkZDwvc3Bhbj5cclxuICA8c3BhbiAqbmdJZj1cImlzU3VibWl0dGluZ1wiPlBsZWFzZSB3YWl0Li4uPC9zcGFuPlxyXG48L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGVOT0IgPT09J211bHRpcGxlJ1wiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LWJvbGQgdGV4dC1ncmF5LTUwMCBteS02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwidGV4dC1ncmF5LTQwMCBmdy1ib2xkIGZzLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwidXNlci10ZXh0XCI+VXNlIHRoZSB0ZW1wbGF0ZSB0byB1cGxvYWQgbXVsdGlwbGUgTm9C4oCZcyBhdCBvbmNlLjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInVzZXItdGV4dCBcIj5Eb3dubG9hZCB0aGUgdGVtcGxhdGUgaGVyZSAtIDxhICpuZ0lmPVwiIWNsaWVudERhdGE/LmlzWm9uZXdpc2VOT0JcIiBocmVmPVwiLi4vLi4vYXNzZXRzL2ZpbGVzL25vYlVwbG9hZFRlbXBsYXRlLnhsc3hcIiBkb3dubG9hZD48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjFcIiB2aWV3Qm94PVwiMCAwIDIwIDIxXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxM1YxNi4zMzMzQzE3LjUgMTYuNzc1NCAxNy4zMjQ0IDE3LjE5OTMgMTcuMDExOCAxNy41MTE4QzE2LjY5OTMgMTcuODI0NCAxNi4yNzU0IDE4IDE1LjgzMzMgMThINC4xNjY2N0MzLjcyNDY0IDE4IDMuMzAwNzIgMTcuODI0NCAyLjk4ODE2IDE3LjUxMThDMi42NzU1OSAxNy4xOTkzIDIuNSAxNi43NzU0IDIuNSAxNi4zMzMzVjEzTTUuODMzMzMgOC44MzMzM0wxMCAxM00xMCAxM0wxNC4xNjY3IDguODMzMzNNMTAgMTNWM1wiIHN0cm9rZT1cIiMwMDlCRjNcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjxzcGFuIGNsYXNzPVwibXMtMiB0ZXh0LWRvd25sb2FkIHRleHQtcHJpbWFyeVwiPkRvd25sb2FkIFRlbXBsYXRlPC9zcGFuPjwvYT4gPHNwYW4gKm5nSWY9XCJjbGllbnREYXRhPy5pc1pvbmV3aXNlTk9CXCIgY2xhc3M9XCIgdGV4dC1hY3RpdmUtcHJpbWFyeVwiICAoY2xpY2spPVwiZG93bmxvYWQoKVwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMVwiIHZpZXdCb3g9XCIwIDAgMjAgMjFcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy41IDEzVjE2LjMzMzNDMTcuNSAxNi43NzU0IDE3LjMyNDQgMTcuMTk5MyAxNy4wMTE4IDE3LjUxMThDMTYuNjk5MyAxNy44MjQ0IDE2LjI3NTQgMTggMTUuODMzMyAxOEg0LjE2NjY3QzMuNzI0NjQgMTggMy4zMDA3MiAxNy44MjQ0IDIuOTg4MTYgMTcuNTExOEMyLjY3NTU5IDE3LjE5OTMgMi41IDE2Ljc3NTQgMi41IDE2LjMzMzNWMTNNNS44MzMzMyA4LjgzMzMzTDEwIDEzTTEwIDEzTDE0LjE2NjcgOC44MzMzM00xMCAxM1YzXCIgc3Ryb2tlPVwiIzAwOUJGM1wiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PHNwYW4gY2xhc3M9XCJtcy0yIHRleHQtZG93bmxvYWQgdGV4dC1wcmltYXJ5IGN1cnNvci1wb2ludGVyXCI+RG93bmxvYWQgVGVtcGxhdGU8L3NwYW4+PC9zcGFuPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInVzZXItdGV4dCBcIj5BZGQgeW91ciBkYXRhIHRvIHRoZSBUZW1wbGF0ZSBGaWxlPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwidXNlci10ZXh0XCI+VXBsb2FkIGl0IGJlbG93IGZvciBwcm9jZXNzaW5nPC9saT5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZU5PQiA9PT0nbXVsdGlwbGUnXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtMyBtcy0zIHJpZ2h0LWJhciBweS0xMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPVwiYWNjb3VudFR5cGVcIiB0eXBlPVwicmFkaW9cIiBpZD1cImt0X2NyZWF0ZV9hY2NvdW50X2Zvcm1fYWNjb3VudF90eXBlX3BlcnNvbmFsXCJcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInBlcnNvbmFsXCIgY2xhc3M9XCJidG4tY2hlY2tcIiBuZy1yZWZsZWN0LW5hbWU9XCJhY2NvdW50VHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmctcmVmbGVjdC1mb3JtLWNvbnRyb2wtbmFtZT1cImFjY291bnRUeXBlXCIgICAoY2hhbmdlKT1cIm9uVXBsb2FkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIG5nLXJlZmxlY3QtdmFsdWU9XCJwZXJzb25hbFwiIHR5cGU9XCJmaWxlXCIgI2lucHV0RmlsZSAvPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImt0X2NyZWF0ZV9hY2NvdW50X2Zvcm1fYWNjb3VudF90eXBlX3BlcnNvbmFsXCIgY2xhc3M9XCIgdy01MCBwLTQgbXQtNVwiPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZnctYm9sZCB0ZXh0LWNlbnRlciB3LTEwMCBmcy00XCI+XHJcbjxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ2XCIgaGVpZ2h0PVwiNDZcIiB2aWV3Qm94PVwiMCAwIDQ2IDQ2XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjNcIiB5PVwiM1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiMjBcIiBmaWxsPVwiI0YyRjRGN1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCIzXCIgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgcng9XCIyMFwiIHN0cm9rZT1cIiNGOUZBRkJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80MDQ3XzQwNTY2KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjYuMzMzMyAyNi4zMzM0TDIzIDIzTTIzIDIzTDE5LjY2NjYgMjYuMzMzNE0yMyAyM1YzMC41TTI5Ljk5MTYgMjguMzI1QzMwLjgwNDQgMjcuODgxOSAzMS40NDY1IDI3LjE4MDggMzEuODE2NSAyNi4zMzIyQzMyLjE4NjYgMjUuNDgzNyAzMi4yNjM1IDI0LjUzNjEgMzIuMDM1MSAyMy42Mzg5QzMxLjgwNjggMjIuNzQxOCAzMS4yODYyIDIxLjk0NjMgMzAuNTU1NSAyMS4zNzc5QzI5LjgyNDggMjAuODA5NSAyOC45MjU3IDIwLjUwMDYgMjggMjAuNUgyNi45NUMyNi42OTc3IDE5LjUyNDQgMjYuMjI3NiAxOC42MTg2IDI1LjU3NDkgMTcuODUwOUMyNC45MjIyIDE3LjA4MzEgMjQuMTA0IDE2LjQ3MzIgMjMuMTgxNyAxNi4wNjcyQzIyLjI1OTQgMTUuNjYxMiAyMS4yNTcxIDE1LjQ2OTUgMjAuMjUwMSAxNS41MDY2QzE5LjI0MyAxNS41NDM3IDE4LjI1NzUgMTUuODA4NiAxNy4zNjc2IDE2LjI4MTRDMTYuNDc3NyAxNi43NTQyIDE1LjcwNjYgMTcuNDIyNiAxNS4xMTIyIDE4LjIzNjNDMTQuNTE3NyAxOS4wNTAxIDE0LjExNTUgMTkuOTg4IDEzLjkzNTggMjAuOTc5NUMxMy43NTYgMjEuOTcxMSAxMy44MDM0IDIyLjk5MDUgMTQuMDc0MyAyMy45NjExQzE0LjM0NTIgMjQuOTMxNyAxNC44MzI3IDI1LjgyODIgMTUuNSAyNi41ODM0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDA0N180MDU2NlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEzIDEzKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtdGl0bGVcIj48c3BhbiBjbGFzcz1cImNsaWNrLXVwbG9hZCBjdXJzb3ItcG9pbnRlclwiPkNsaWNrIHRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwiZHJhZy1kcm9wXCI+IG9yIGRyYWcgYW5kIGRyb3AgdGhlIHRlbXBsYXRlPC9zcGFuPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiAgKm5nSWY9XCJ0eXBlTk9CID09PSdtdWx0aXBsZSdcIiBjbGFzcz1cImQtZmxleCBtdC0zIG1iLTEwXCIgcm9sZT1cImdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwIG1lLTNcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDAgbXMtM1wiIGlkPVwiYWxlcnQtdG9hc3RcIiAoY2xpY2spPVwicHJvY2VlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgPlByb2NlZWQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2ICpuZ0lmPVwidHlwZSA9PT0nZWRpdFZpZXcnIHx8IHR5cGUgPT09ICd2aWV3J1wiIGNsYXNzPVwiY2FyZCBwdC0wICBwYi0zIFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0wIGQtZmxleCBmbGV4LXN0YXJ0IGZsZXgtY29sdW1uIHAtOSBcIj5cclxuICAgICAgICBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHctMTAwIG10LTVcIj5cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZnMtNCB0ZXh0LWdyYXktODAwIHRleHQtaG92ZXItcHJpbWFyeSBmdy1ib2xkIG1iLTAgdGl0bGUgY3Vyc29yLXBvaW50ZXJcIj5ab25lLXdpc2UgTm9CXHJcbiAgICAgICAgICAgICAgICAgICAgQ291bnQ8L2E+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZSA9PT0gJ3ZpZXcnXCIgY2xhc3M9XCJjb2wtbWQtNiB0ZXh0LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJjYW5jZWwoKVwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxyXG48cGF0aCBkPVwiTTEzIDFMMSAxM00xIDFMMTMgMTNcIiBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiem9uZUxpc3Q/Lmxlbmd0aFwiIGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZSBtYXgtaC01MDBcIj5cclxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGJvdHRvbS1ib3JkZXIgdGV4dC1ub3dyYXAgbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+Wm9uZSBOYW1lPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPk5vQiBDb3VudDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgem9uZSBvZiB6b25lTGlzdDtsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJweS0zIG10LTEwXCI+e3t6b25lLnpvbmVOYW1lfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicHktMlwiPjxzcGFuICpuZ0lmPVwidHlwZSA9PT0gJ3ZpZXcnIHx8ICFpc0VkaXRFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHpvbmUubm9iQ291bnQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRURJVCBNT0RFIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInR5cGUgPT09ICdlZGl0VmlldycgJiYgaXNFZGl0RW5hYmxlZFwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ6b25lLm5vYkNvdW50XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Ob2JDaGFuZ2UoKVwiIG1heGxlbmd0aD1cIjRcIlxyXG4gIG1pbmxlbmd0aD1cIjFcIlxyXG4gIHBhdHRlcm49XCJeWzAtOV17MSw0fSRcIlxyXG4gIGlucHV0bW9kZT1cIm51bWVyaWNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwib21pdF9zcGVjaWFsX2NoYXIoJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiF6b25lTGlzdD8ubGVuZ3RoXCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctbm9kYXRhLXRhYmxlXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhLXN1YlwiPlRoZXJlIGlzIG5vIHJlc3VsdCBmb3IgdGhpcyBab25lLXdpc2UgTm9CIGNvdW50PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZXJyb1Nob3dcIiBjbGFzcz1cInRleHQtZGFuZ2VyIG10LTJcIj48c3BhbiBjbGFzcz1cIm1lLTJcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNTA1NV8xNTY0MzgpXCI+XHJcbjxwYXRoIGQ9XCJNOSA2VjlNOSAxMkg5LjAwNzVNMTYuNSA5QzE2LjUgMTMuMTQyMSAxMy4xNDIxIDE2LjUgOSAxNi41QzQuODU3ODYgMTYuNSAxLjUgMTMuMTQyMSAxLjUgOUMxLjUgNC44NTc4NiA0Ljg1Nzg2IDEuNSA5IDEuNUMxMy4xNDIxIDEuNSAxNi41IDQuODU3ODYgMTYuNSA5WlwiIHN0cm9rZT1cIiNCNDIzMThcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG48L2c+XHJcbjxkZWZzPlxyXG48Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNTA1NV8xNTY0MzhcIj5cclxuPHJlY3Qgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIndoaXRlXCIvPlxyXG48L2NsaXBQYXRoPlxyXG48L2RlZnM+XHJcbjwvc3ZnPjwvc3Bhbj57eyBlcnJvU2hvdyB9fTwvZGl2PlxyXG48bmctY29udGFpbmVyICpuZ0lmPVwiem9uZUxpc3Q/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGUgPT09J2VkaXRWaWV3JyAmJiBpc0VkaXRFbmFibGVkXCIgY2xhc3M9XCJkLWZsZXggbXQtMyBtYi0xMFwiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgdy0xMDAgbWUtM1wiIChjbGljayk9XCJjYW5jZWxFZGl0KClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwIG1zLTNcIiBpZD1cImFsZXJ0LXRvYXN0XCIgKGNsaWNrKT1cIm9uU3VibWl0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWRhdGVWYWx1ZSB8fCAhbm9iQ291bnQgfHwgIXN0b3JlSWQgfHwgIXN0b3JlTmFtZVwiPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInR5cGUgIT09J2FkZCdcIj5TYXZlPC9zcGFuPjxzcGFuICpuZ0lmPVwidHlwZSA9PT0nYWRkJ1wiPkFkZDwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==