tango-app-ui-store-builder 1.2.5 → 1.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/esm2022/lib/components/collection-update-ai/collection-update-ai.component.mjs +3 -2
  2. package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +3 -2
  3. package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.mjs +3 -2
  4. package/esm2022/lib/components/create-fixture/create-fixture.component.mjs +41 -4
  5. package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +3 -2
  6. package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +3 -2
  7. package/esm2022/lib/components/fixture-template-table/find-and-replace/find-and-replace.component.mjs +3 -2
  8. package/esm2022/lib/components/fixture-template-table/fixture-template-table.component.mjs +2 -3
  9. package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +3 -2
  10. package/esm2022/lib/components/manage-plano/verification-table/verification-table.component.mjs +2 -3
  11. package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +73 -6
  12. package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +4 -3
  13. package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +114 -4
  14. package/esm2022/lib/components/onboard-store-plano/onboard-fixture/onboard-fixture.component.mjs +3 -3
  15. package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +85 -6
  16. package/esm2022/lib/components/plano-configurations/plano-configurations.component.mjs +162 -3
  17. package/esm2022/lib/components/plano-library/fixture-library/fixture-library.component.mjs +24 -11
  18. package/esm2022/lib/components/plano-library/fixture-library/popups/create-fixture-modal/create-fixture-modal.component.mjs +13 -4
  19. package/esm2022/lib/components/plano-library/vm-library/vm-library.component.mjs +3 -4
  20. package/esm2022/lib/components/plano-tools/cad-files/cad-files.component.mjs +3 -3
  21. package/esm2022/lib/components/plano-tools/cad-render/cad-render.component.mjs +4 -5
  22. package/esm2022/lib/components/plano-tools/move-bucket/move-bucket.component.mjs +3 -3
  23. package/esm2022/lib/components/plano-tools/plano-data-export/plano-data-export.component.mjs +98 -3
  24. package/esm2022/lib/components/plano-tools/plano-migrate/plano-migrate.component.mjs +3 -2
  25. package/esm2022/lib/components/plano-tools/store-exports/store-exports.component.mjs +135 -33
  26. package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +3 -2
  27. package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +3 -2
  28. package/esm2022/lib/components/planogram/plano-analytics/plano-analytics.component.mjs +3 -2
  29. package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +1 -1
  30. package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +3 -2
  31. package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +3 -2
  32. package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +2 -3
  33. package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -4
  34. package/esm2022/lib/components/store-plano/store-plano.component.mjs +4 -3
  35. package/esm2022/lib/data/fixture-template.data.mjs +12 -1
  36. package/esm2022/lib/functions/plano.function.mjs +13 -1
  37. package/esm2022/lib/interfaces/fixture-library.interface.mjs +1 -1
  38. package/esm2022/lib/services/store-builder.service.mjs +21 -1
  39. package/fesm2022/tango-app-ui-store-builder.mjs +1082 -380
  40. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  41. package/lib/components/create-fixture/create-fixture.component.d.ts +3 -0
  42. package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +6 -1
  43. package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +14 -1
  44. package/lib/components/onboard-store-plano/onboard-store-plano.component.d.ts +8 -1
  45. package/lib/components/plano-configurations/plano-configurations.component.d.ts +19 -1
  46. package/lib/components/plano-library/fixture-library/fixture-library.component.d.ts +1 -0
  47. package/lib/components/plano-library/fixture-library/popups/create-fixture-modal/create-fixture-modal.component.d.ts +5 -0
  48. package/lib/components/plano-tools/plano-data-export/plano-data-export.component.d.ts +26 -0
  49. package/lib/components/plano-tools/store-exports/store-exports.component.d.ts +28 -3
  50. package/lib/data/fixture-template.data.d.ts +8 -0
  51. package/lib/functions/plano.function.d.ts +1 -0
  52. package/lib/interfaces/fixture-library.interface.d.ts +1 -0
  53. package/lib/services/store-builder.service.d.ts +10 -0
  54. package/package.json +1 -1
@@ -12,6 +12,7 @@ import { TimeAgoPipe } from "../../pipes/time-ago.pipe";
12
12
  import { CounterInputComponent } from "../counter-input/counter-input.component";
13
13
  import { ReactiveSelectComponent } from "../reactive-select/reactive-select.component";
14
14
  import { generalValidator } from "../../functions/plano.function";
15
+ import { WALL_ZONES, FLOOR_ZONES } from "../../data/fixture-template.data";
15
16
  import * as i0 from "@angular/core";
16
17
  import * as i1 from "@angular/router";
17
18
  import * as i2 from "@angular/forms";
@@ -44,6 +45,8 @@ export class CreateFixtureComponent {
44
45
  { label: "Tray", value: "tray" },
45
46
  { label: "VM Only", value: "vmonly" },
46
47
  ];
48
+ wallZones = WALL_ZONES;
49
+ floorZones = FLOOR_ZONES;
47
50
  destroy$ = new Subject();
48
51
  constructor(route, fb, storeBuilderService, toast, router, ngbModal, pageInfo, gs) {
49
52
  this.route = route;
@@ -245,6 +248,7 @@ export class CreateFixtureComponent {
245
248
  type: [shelf?.shelfType ?? "shelf"],
246
249
  productCapacity: [shelf?.productPerShelf ?? 6],
247
250
  noOfRows: [shelf?.trayRows ?? 1],
251
+ zone: [shelf?.zone ?? null],
248
252
  });
249
253
  this.updateProductPerShelfMinValidator(shelfGroup, shelfGroup.get("type")?.value);
250
254
  this.setupShelfTypeListener(shelfGroup);
@@ -301,9 +305,32 @@ export class CreateFixtureComponent {
301
305
  panel?.trayRows ?? 5,
302
306
  [Validators.required, Validators.min(1)],
303
307
  ],
308
+ zone: [panel?.zone ?? "All"],
304
309
  });
305
310
  this.panelArray.push(panelGroup);
306
311
  }
312
+ autoAssignWallZones() {
313
+ if (!this.isEditMode)
314
+ return;
315
+ const shelfCount = this.shelfArray.controls.length;
316
+ if (shelfCount === 0)
317
+ return;
318
+ const shelvesPerZone = Math.floor(shelfCount / 3);
319
+ const remainder = shelfCount % 3;
320
+ const topCount = shelvesPerZone + (remainder >= 1 ? 1 : 0);
321
+ const midCount = shelvesPerZone + (remainder >= 2 ? 1 : 0);
322
+ this.shelfArray.controls.forEach((shelf, index) => {
323
+ let zone;
324
+ if (index < topCount)
325
+ zone = "Top";
326
+ else if (index < topCount + midCount)
327
+ zone = "Mid";
328
+ else
329
+ zone = "Bottom";
330
+ shelf.get("zone")?.setValue(zone);
331
+ });
332
+ this.wallFixtureForm.markAsDirty();
333
+ }
307
334
  // If index is not given, last panel should be removed
308
335
  removePanel(index = this.panelArray.controls.length - 1) {
309
336
  if (this.panelArray.controls.length == 1)
@@ -378,6 +405,7 @@ export class CreateFixtureComponent {
378
405
  productPerShelf: e.value.productCapacity,
379
406
  trayRows: e?.value?.noOfRows ?? 1,
380
407
  label: e?.value?.panelName ?? "",
408
+ zone: e?.value?.zone ?? null,
381
409
  };
382
410
  }),
383
411
  };
@@ -390,9 +418,18 @@ export class CreateFixtureComponent {
390
418
  this.toast.getErrorToast("Form is invalid");
391
419
  return false;
392
420
  }
393
- if (status === "complete")
421
+ if (status === "complete") {
422
+ const formArray = this.fixtureDetails.fixtureType === "wall"
423
+ ? this.shelfArray
424
+ : this.panelArray;
425
+ const missingZone = formArray.controls.some((c) => !c.value.zone);
426
+ if (missingZone) {
427
+ this.toast.getErrorToast("Each shelf must have a zone before completing.");
428
+ return false;
429
+ }
394
430
  if (!(await this.confirmCompletion()))
395
431
  return false;
432
+ }
396
433
  const transformedData = this.mapFormToApi(form, status);
397
434
  const res = await firstValueFrom(this.storeBuilderService.updateFixtureLibrary(transformedData, this.fixtureDetails?._id));
398
435
  if (res && res?.status === "success") {
@@ -549,7 +586,7 @@ export class CreateFixtureComponent {
549
586
  this.destroy$.complete();
550
587
  }
551
588
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreateFixtureComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.FormBuilder }, { token: i3.StoreBuilderService }, { token: i4.ToastService }, { token: i1.Router }, { token: i5.NgbModal }, { token: i6.PageInfoService }, { token: i6.GlobalStateService }], target: i0.ɵɵFactoryTarget.Component });
552
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CreateFixtureComponent, isStandalone: true, selector: "lib-create-fixture", ngImport: i0, template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0 ellipsis\" style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\"\r\n [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"shelfTypes\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\"\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly'\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly' && shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5 shelfContainer\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='tray'){\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n TRAY {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }@else {\r\n <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('type')?.value ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n {{item.get('type')?.value ==='vmonly' ? 'VM ONLY': 'SHELF'}} {{ i + 1 }} <b\r\n class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addPanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(i)\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"shelfContainer\">\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\" />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;max-width:345px;min-width:234px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .shelfContainer .block{border:1px solid #98a2b3;border-top:none}.wall-viewport .body-block .shelfContainer:first-child .block{border-top:1px solid #98a2b3}.wall-viewport .body-block .block{padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .vmonly-placeholder{background-image:repeating-linear-gradient(45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px),repeating-linear-gradient(-45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px)}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{max-width:590px;width:100%;min-width:480px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"], dependencies: [{ kind: "component", type: CounterInputComponent, selector: "counter-input", inputs: ["step", "placeholder", "max"], outputs: ["onIncrement", "onDecrement"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: TimeAgoPipe, name: "timeAgo" }, { kind: "ngmodule", type: NgbAccordionModule }, { kind: "directive", type: i5.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i5.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i5.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i5.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i5.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i5.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
589
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CreateFixtureComponent, isStandalone: true, selector: "lib-create-fixture", ngImport: i0, template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0 ellipsis\" style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\"\r\n [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <datalist id=\"wallZoneOptions\">\r\n <option *ngFor=\"let zone of wallZones\" [value]=\"zone.value\"></option>\r\n </datalist>\r\n\r\n <div *ngIf=\"shelfArray?.length\"\r\n class=\"d-flex justify-content-end mb-3\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\"\r\n [disabled]=\"!isEditMode\"\r\n (click)=\"autoAssignWallZones()\">\r\n Auto-zone shelves\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"shelfTypes\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <div class=\"mt-3\">\r\n <label class=\"mb-1\">Zone</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n list=\"wallZoneOptions\"\r\n placeholder=\"e.g. Top, Mid, Bottom\" />\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\"\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly'\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly' && shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5 shelfContainer\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='tray'){\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n TRAY {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }@else {\r\n <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('type')?.value ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n {{item.get('type')?.value ==='vmonly' ? 'VM ONLY': 'SHELF'}} {{ i + 1 }} <b\r\n class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addPanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <datalist id=\"floorZoneOptions\">\r\n <option *ngFor=\"let zone of floorZones\" [value]=\"zone.value\"></option>\r\n </datalist>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(i)\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mt-3\">\r\n <label class=\"mb-1\">Zone</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n list=\"floorZoneOptions\"\r\n placeholder=\"e.g. All, Top, Mid, Bottom\" />\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"shelfContainer\">\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\" />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;max-width:345px;min-width:234px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .shelfContainer .block{border:1px solid #98a2b3;border-top:none}.wall-viewport .body-block .shelfContainer:first-child .block{border-top:1px solid #98a2b3}.wall-viewport .body-block .block{padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .vmonly-placeholder{background-image:repeating-linear-gradient(45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px),repeating-linear-gradient(-45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px)}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{max-width:590px;width:100%;min-width:480px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"], dependencies: [{ kind: "component", type: CounterInputComponent, selector: "counter-input", inputs: ["step", "placeholder", "max"], outputs: ["onIncrement", "onDecrement"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: TimeAgoPipe, name: "timeAgo" }, { kind: "ngmodule", type: NgbAccordionModule }, { kind: "directive", type: i5.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i5.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i5.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i5.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i5.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i5.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
553
590
  }
554
591
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreateFixtureComponent, decorators: [{
555
592
  type: Component,
@@ -563,6 +600,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
563
600
  NgbAccordionModule,
564
601
  ReactiveSelectComponent,
565
602
  RouterLink,
566
- ], template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0 ellipsis\" style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\"\r\n [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"shelfTypes\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\"\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly'\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly' && shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5 shelfContainer\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='tray'){\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n TRAY {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }@else {\r\n <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('type')?.value ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n {{item.get('type')?.value ==='vmonly' ? 'VM ONLY': 'SHELF'}} {{ i + 1 }} <b\r\n class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addPanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(i)\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"shelfContainer\">\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\" />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;max-width:345px;min-width:234px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .shelfContainer .block{border:1px solid #98a2b3;border-top:none}.wall-viewport .body-block .shelfContainer:first-child .block{border-top:1px solid #98a2b3}.wall-viewport .body-block .block{padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .vmonly-placeholder{background-image:repeating-linear-gradient(45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px),repeating-linear-gradient(-45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px)}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{max-width:590px;width:100%;min-width:480px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"] }]
603
+ ], template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <h2 class=\"m-0 ellipsis\" style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\">\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\"\r\n [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addShelf(); wallFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <datalist id=\"wallZoneOptions\">\r\n <option *ngFor=\"let zone of wallZones\" [value]=\"zone.value\"></option>\r\n </datalist>\r\n\r\n <div *ngIf=\"shelfArray?.length\"\r\n class=\"d-flex justify-content-end mb-3\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\"\r\n [disabled]=\"!isEditMode\"\r\n (click)=\"autoAssignWallZones()\">\r\n Auto-zone shelves\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"shelfTypes\"\r\n formControlName=\"type\">\r\n </lib-reactive-select>\r\n\r\n <div class=\"mt-3\">\r\n <label class=\"mb-1\">Zone</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n list=\"wallZoneOptions\"\r\n placeholder=\"e.g. Top, Mid, Bottom\" />\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\"\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly'\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container\r\n *ngIf=\"shelf.get('type')?.value !== 'vmonly' && shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input type=\"checkbox\" [disabled]=\"!isEditMode\" [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\" class=\"form-check-input ms-4\" />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5 shelfContainer\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='tray'){\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n TRAY {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }@else {\r\n <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('type')?.value ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n {{item.get('type')?.value ==='vmonly' ? 'VM ONLY': 'SHELF'}} {{ i + 1 }} <b\r\n class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\"\r\n formControlName=\"fixtureCategory\" />\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\">\r\n Fixture name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\">\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg role=\"button\" width=\"15\" height=\"14\" viewBox=\"0 0 15 14\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"addPanel(); floorFixtureForm.markAsDirty()\">\r\n <path d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\" stroke=\"#667085\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <datalist id=\"floorZoneOptions\">\r\n <option *ngFor=\"let zone of floorZones\" [value]=\"zone.value\"></option>\r\n </datalist>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removePanel(i)\" class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mt-3\">\r\n <label class=\"mb-1\">Zone</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"zone\"\r\n list=\"floorZoneOptions\"\r\n placeholder=\"e.g. All, Top, Mid, Bottom\" />\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"noOfRows\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productCapacity\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"shelfContainer\">\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products:\r\n {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\" />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x\r\n {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;max-width:345px;min-width:234px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .shelfContainer .block{border:1px solid #98a2b3;border-top:none}.wall-viewport .body-block .shelfContainer:first-child .block{border-top:1px solid #98a2b3}.wall-viewport .body-block .block{padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .vmonly-placeholder{background-image:repeating-linear-gradient(45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px),repeating-linear-gradient(-45deg,rgba(152,162,179,.2901960784) 0,rgba(152,162,179,.2901960784) .7px,transparent .7px,transparent 8px)}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.draft{background:#f2f4f7;color:#667085}.indicator.draft path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.allocationPending{background:#fef0c7;color:#f79009}.indicator.allocationPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}.restrict-interaction{-webkit-user-select:none;user-select:none;pointer-events:none}.btn .spinner{height:22px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:4px;stroke:#071437;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{max-width:590px;width:100%;min-width:480px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"] }]
567
604
  }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.FormBuilder }, { type: i3.StoreBuilderService }, { type: i4.ToastService }, { type: i1.Router }, { type: i5.NgbModal }, { type: i6.PageInfoService }, { type: i6.GlobalStateService }] });
568
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUlMLFVBQVUsRUFDVixXQUFXLEVBQ1gsbUJBQW1CLEdBQ3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsa0JBQWtCLEVBRWxCLFVBQVUsR0FDWCxNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixjQUFjLEVBQ2QsR0FBRyxFQUNILE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFRZCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMxRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUVwRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUUzRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFD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UUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzt3R0FobUJVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLDhFQzVEbkMsazd6Q0FvdUJjLCt2Y0RuckJWLHFCQUFxQiwySUFDckIsVUFBVSwwVEFDVixXQUFXLDJwQkFDWCxtQkFBbUIsNmhCQUNuQixZQUFZLGtoQkFDWixXQUFXLCtDQUNYLGtCQUFrQiw2MUJBQ2xCLHVCQUF1Qix5TkFDdkIsVUFBVTs7NEZBR0Qsc0JBQXNCO2tCQWpCbEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FHbEIsSUFBSSxXQUNQO3dCQUNQLHFCQUFxQjt3QkFDckIsVUFBVTt3QkFDVixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGtCQUFrQjt3QkFDbEIsdUJBQXVCO3dCQUN2QixVQUFVO3FCQUNYIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIEZvcm1BcnJheSxcclxuICBWYWxpZGF0b3JzLFxyXG4gIEZvcm1zTW9kdWxlLFxyXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIsIFJvdXRlckxpbmsgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7XHJcbiAgTmdiQWNjb3JkaW9uTW9kdWxlLFxyXG4gIE5nYk1vZGFsLFxyXG4gIE5nYlRvb2x0aXAsXHJcbn0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7XHJcbiAgZGVib3VuY2VUaW1lLFxyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gIGZpbHRlcixcclxuICBmaXJzdFZhbHVlRnJvbSxcclxuICBtYXAsXHJcbiAgU3ViamVjdCxcclxuICB0YWtlVW50aWwsXHJcbn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1zaGFyZWRcIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtcclxuICBGaXh0dXJlTGlicmFyeURldGFpbHMsXHJcbiAgRml4dHVyZUxpYnJhcnlTaGVsZkNvbmZpZyxcclxufSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9maXh0dXJlLWxpYnJhcnkuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duSUYgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9wbGFuby1nZW5lcmFsLmludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyBDb21wbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9wb3B1cHMvY29tcGxldGUtY29uZmlybWF0aW9uL2NvbXBsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4uL3BvcHVwcy9kZWxldGUtY29uZmlybWF0aW9uL2RlbGV0ZS1jb25maXJtYXRpb24uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEV4aXRDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vcG9wdXBzL2V4aXQtY29uZmlybWF0aW9uL2V4aXQtY29uZmlybWF0aW9uLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDYW5FeGl0R3VhcmQgfSBmcm9tIFwiLi4vLi4vZnVuY3Rpb25zL2V4aXQuZ3VhcmRcIjtcclxuaW1wb3J0IHsgQ2Fubm90UGVyZm9ybUNvbXBvbmVudCB9IGZyb20gXCIuLi9wb3B1cHMvY2Fubm90LXBlcmZvcm0vY2Fubm90LXBlcmZvcm0uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSwgUGFnZUluZm9TZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBUaW1lQWdvUGlwZSB9IGZyb20gXCIuLi8uLi9waXBlcy90aW1lLWFnby5waXBlXCI7XHJcbmltcG9ydCB7IENvdW50ZXJJbnB1dENvbXBvbmVudCB9IGZyb20gXCIuLi9jb3VudGVyLWlucHV0L2NvdW50ZXItaW5wdXQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IFJlYWN0aXZlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3JlYWN0aXZlLXNlbGVjdC9yZWFjdGl2ZS1zZWxlY3QuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IGdlbmVyYWxWYWxpZGF0b3IgfSBmcm9tIFwiLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJsaWItY3JlYXRlLWZpeHR1cmVcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2NyZWF0ZS1maXh0dXJlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9jcmVhdGUtZml4dHVyZS5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ291bnRlcklucHV0Q29tcG9uZW50LFxyXG4gICAgTmdiVG9vbHRpcCxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIFRpbWVBZ29QaXBlLFxyXG4gICAgTmdiQWNjb3JkaW9uTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQsXHJcbiAgICBSb3V0ZXJMaW5rLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDcmVhdGVGaXh0dXJlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENhbkV4aXRHdWFyZCB7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuXHJcbiAgd2FsbEZpeHR1cmVGb3JtOiBGb3JtR3JvdXA7XHJcbiAgZmxvb3JGaXh0dXJlRm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBpc1BhZ2VMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgZml4dHVyZURldGFpbHM6IEZpeHR1cmVMaWJyYXJ5RGV0YWlscyA9IHt9O1xyXG4gIGlzRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgaXNIZWFkZXJFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0Zvb3RlckVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzQm9keUVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBjYW5Hb0JhY2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcmVhZG9ubHkgc2hlbGZUeXBlczogRHJvcGRvd25JRltdID0gW1xyXG4gICAgeyBsYWJlbDogXCJTaGVsZlwiLCB2YWx1ZTogXCJzaGVsZlwiIH0sXHJcbiAgICB7IGxhYmVsOiBcIlRyYXlcIiwgdmFsdWU6IFwidHJheVwiIH0sXHJcbiAgICB7IGxhYmVsOiBcIlZNIE9ubHlcIiwgdmFsdWU6IFwidm1vbmx5XCIgfSxcclxuICBdO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBzdG9yZUJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgbmdiTW9kYWw6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSBwYWdlSW5mbzogUGFnZUluZm9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XHJcbiAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcztcclxuICAgIHRoaXMuZml4dHVyZURldGFpbHMuX2lkID0gcGFyYW1zW1wiZml4dHVyZUlkXCJdID8/IFwiXCI7XHJcblxyXG4gICAgdGhpcy5pc0VkaXRNb2RlID0gcGFyYW1zW1wiaXNFZGl0XCJdID09IFwidHJ1ZVwiO1xyXG5cclxuICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5faWQpIHtcclxuICAgICAgdGhpcy5jYW5Hb0JhY2sgPSB0cnVlO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCIvbWFuYWdlL3BsYW5vZ3JhbS9saWJyYXJ5L2ZpeHR1cmVzXCJdKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ2V0Q2xpZW50SWQoKTtcclxuXHJcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocGFyYW1zKSA9PiBwYXJhbXNbXCJmaXh0dXJlSWRcIl0pLFxyXG4gICAgICAgIGZpbHRlcigoaWQpID0+ICEhaWQpLFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGlkKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldEZpeHR1cmVMaWJyYXJ5RGV0YWlscyhpZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZGV0YWlscyA9IHJlcy5kYXRhO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWlscykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi5kZXRhaWxzLFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FuR29CYWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgICAgZXJyPy5lcnJvcj8uZXJyb3IgPz8gXCJGYWlsZWQgdG8gZmV0Y2ggZml4dHVyZSBkZXRhaWxzXCIsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmlzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRQYWdlRGF0YSgpIHtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0VGl0bGUoXCJDcmVhdGUgRml4dHVyZVwiKTtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoW1xyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiUGxhbm9ncmFtXCIsXHJcbiAgICAgICAgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtc1wiLFxyXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcclxuICAgICAgICBpc1NlcGFyYXRvcjogZmFsc2UsXHJcbiAgICAgIH0sXHJcbiAgICAgIHsgdGl0bGU6IFwiXCIsIHBhdGg6IFwiXCIsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkxpYnJhcnlcIixcclxuICAgICAgICBwYXRoOiBcIi9tYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXNcIixcclxuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgaXNTZXBhcmF0b3I6IGZhbHNlLFxyXG4gICAgICB9LFxyXG4gICAgICB7IHRpdGxlOiBcIlwiLCBwYXRoOiBcIlwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIGdldENsaWVudElkKCkge1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksIC8vIFN1YnNjcmlwdGlvbiB3aWxsIGJlIGNhbmNlbGxlZCBvbiBjb21wb25lbnQgZGVzdHJveS5cclxuICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSwgLy8gVG8gYXZvaWQgaW1tZWRpYXRlIGZyZXF1ZW50IGNhbGxzLlxyXG4gICAgICAgIGZpbHRlcigoZGF0YSkgPT4gISFkYXRhKSwgLy8gRmlsdGVyaW5nIG51bGwvdW5kZWZpbmVkLlxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIC8vIEVtaXR0aW5nIG9ubHkgZGlmZmVyZW50IHZhbHVlcy4gKElnbm9yZXMgc2FtZSBjbGllbnRJZCkuXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShhc3luYyAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGE/LmNsaWVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IGhlYWRlckRhdGEgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIGFzIHN0cmluZyxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gaGVhZGVyRGF0YT8uY2xpZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRm9ybSgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIikge1xyXG4gICAgICB0aGlzLmluaXRXYWxsRml4dHVyZUZvcm0oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW5pdEZsb29yUGFuZWxGaXh0dXJlRm9ybSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzRWRpdE1vZGUpIHtcclxuICAgICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaXNFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb24oXCJoZWFkZXJcIik7XHJcbiAgICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5mb290ZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uKFwiZm9vdGVyXCIpO1xyXG4gICAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuaXNCb2R5RW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uKFwiYm9keVwiKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgdGhpcy5mbG9vckZpeHR1cmVGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICAgIHRoaXMuaXNIZWFkZXJFbmFibGVkID0gdGhpcy5maXh0dXJlRGV0YWlscy5oZWFkZXI/LmlzRW5hYmxlZCA/PyBmYWxzZTtcclxuICAgICAgdGhpcy5pc0JvZHlFbmFibGVkID0gdGhpcy5maXh0dXJlRGV0YWlscy5pc0JvZHlFbmFibGVkID8/IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzRm9vdGVyRW5hYmxlZCA9IHRoaXMuZml4dHVyZURldGFpbHMuZm9vdGVyPy5pc0VuYWJsZWQgPz8gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRGb3JtKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09IFwid2FsbFwiXHJcbiAgICAgID8gdGhpcy53YWxsRml4dHVyZUZvcm1cclxuICAgICAgOiB0aGlzLmZsb29yRml4dHVyZUZvcm07XHJcbiAgfVxyXG5cclxuICBnZXQgc2hlbGZBcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMud2FsbEZpeHR1cmVGb3JtLmdldChcImJvZHkuc2hlbGZcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhbmVsQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZsb29yRml4dHVyZUZvcm0uZ2V0KFwicGFuZWxcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvdGFsUHJvZHVjdENhcGFjaXR5KCk6IG51bWJlciB7XHJcbiAgICBjb25zdCBmb3JtQXJyYXkgPVxyXG4gICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIlxyXG4gICAgICAgID8gdGhpcy5zaGVsZkFycmF5XHJcbiAgICAgICAgOiB0aGlzLnBhbmVsQXJyYXk7XHJcblxyXG4gICAgcmV0dXJuIGZvcm1BcnJheS5jb250cm9scy5yZWR1Y2UoKHRvdGFsLCBpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvdW50ID0gaXRlbS5nZXQoXCJwcm9kdWN0Q2FwYWNpdHlcIik/LnZhbHVlIHx8IDA7XHJcbiAgICAgIGNvbnN0IGlzVHJheSA9IGl0ZW0uZ2V0KFwidHlwZVwiKT8udmFsdWUgPT09IFwidHJheVwiO1xyXG4gICAgICBjb25zdCByb3dzID0gaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgfHwgMTtcclxuXHJcbiAgICAgIC8vIElmIHRoZSBmaXh0dXJlIGlzIGEgZmxvb3IgcGFuZWwgb3IgdHJheSwgd2UgbmVlZCB0byBtdWx0aXBseSB0aGUgcHJvZHVjdCBjYXBhY2l0eSBieSB0aGUgbnVtYmVyIG9mIHJvd3NcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0b3RhbCArXHJcbiAgICAgICAgKGlzVHJheSB8fCB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSBcImZsb29yXCJcclxuICAgICAgICAgID8gY291bnQgKiByb3dzXHJcbiAgICAgICAgICA6IGNvdW50KVxyXG4gICAgICApO1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICBpbml0V2FsbEZpeHR1cmVGb3JtKCkge1xyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYmFzaWNEZXRhaWxzOiB0aGlzLmdldEJhc2ljRGV0YWlsc0Zvcm1Hcm91cCgpLFxyXG4gICAgICBoZWFkZXI6IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIGhlaWdodDogW3RoaXMuZml4dHVyZURldGFpbHM/LmhlYWRlcj8uaGVpZ2h0Py52YWx1ZSA/PyAzMDBdLFxyXG4gICAgICB9KSxcclxuICAgICAgYm9keTogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgc2hlbGY6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICB9KSxcclxuICAgICAgZm9vdGVyOiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBoZWlnaHQ6IFt0aGlzLmZpeHR1cmVEZXRhaWxzPy5mb290ZXI/LmhlaWdodD8udmFsdWUgPz8gMzAwXSxcclxuICAgICAgfSksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5mb3JFYWNoKChzKSA9PiB0aGlzLmFkZFNoZWxmKHMpKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuc2hlbGZDb25maWc/Lmxlbmd0aCA9PT0gMCAmJlxyXG4gICAgICAhdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnlcclxuICAgICkge1xyXG4gICAgICB0aGlzLmFkZFNoZWxmKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm1cclxuICAgICAgLmdldChcImJhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnlcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtXHJcbiAgICAgIC5nZXQoXCJiYXNpY0RldGFpbHMud2lkdGhcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aCkge1xyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdEZsb29yUGFuZWxGaXh0dXJlRm9ybSgpIHtcclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBiYXNpY0RldGFpbHM6IHRoaXMuZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCksXHJcbiAgICAgIHBhbmVsOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZURldGFpbHMuc2hlbGZDb25maWc/LmZvckVhY2goKHMpID0+IHRoaXMuYWRkUGFuZWwocykpO1xyXG5cclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybVxyXG4gICAgICAuZ2V0KFwiYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnkgPSB2YWx1ZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5mbG9vckZpeHR1cmVGb3JtXHJcbiAgICAgIC5nZXQoXCJiYXNpY0RldGFpbHMud2lkdGhcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aCkge1xyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBmaXh0dXJlQ2F0ZWdvcnk6IFtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzPy5maXh0dXJlQ2F0ZWdvcnkgfHwgXCJVbnRpdGxlZFwiLFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBnZW5lcmFsVmFsaWRhdG9yKCldLFxyXG4gICAgICBdLFxyXG4gICAgICB3aWR0aDogW1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udmFsdWUgPz8gNixcclxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMC41KV0sXHJcbiAgICAgIF0sXHJcbiAgICAgIGxlbmd0aDogW1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnZhbHVlID8/IDEyLFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwLjUpXSxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkU2hlbGYoc2hlbGY/OiBhbnkpIHtcclxuICAgIGNvbnN0IHNoZWxmR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdHlwZTogW3NoZWxmPy5zaGVsZlR5cGUgPz8gXCJzaGVsZlwiXSxcclxuICAgICAgcHJvZHVjdENhcGFjaXR5OiBbc2hlbGY/LnByb2R1Y3RQZXJTaGVsZiA/PyA2XSxcclxuICAgICAgbm9PZlJvd3M6IFtzaGVsZj8udHJheVJvd3MgPz8gMV0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMudXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKFxyXG4gICAgICBzaGVsZkdyb3VwLFxyXG4gICAgICBzaGVsZkdyb3VwLmdldChcInR5cGVcIik/LnZhbHVlLFxyXG4gICAgKTtcclxuICAgIHRoaXMuc2V0dXBTaGVsZlR5cGVMaXN0ZW5lcihzaGVsZkdyb3VwKTtcclxuICAgIHRoaXMuc2hlbGZBcnJheS5wdXNoKHNoZWxmR3JvdXApO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKHNoZWxmR3JvdXA6IEZvcm1Hcm91cCwgc2hlbGZUeXBlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHByb2R1Y3RQZXJTaGVsZkNvbnRyb2wgPSBzaGVsZkdyb3VwLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKTtcclxuICAgIGNvbnN0IG1pblZhbHVlID0gc2hlbGZUeXBlID09PSBcInZtb25seVwiID8gMCA6IDE7XHJcblxyXG4gICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5taW4obWluVmFsdWUpXSk7XHJcbiAgICBwcm9kdWN0UGVyU2hlbGZDb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIC8vICB3ZSBuZWVkIHRvIHNldHVwIGEgbGlzdGVuZXIgdG8gdGhlIHR5cGUgb2YgdGhlIHNoZWxmIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBub09mUm93cyBmaWVsZFxyXG4gIHNldHVwU2hlbGZUeXBlTGlzdGVuZXIoc2hlbGZHcm91cDogRm9ybUdyb3VwKSB7XHJcbiAgICBsZXQgcHJldmlvdXNUeXBlID0gc2hlbGZHcm91cC5nZXQoXCJ0eXBlXCIpPy52YWx1ZTtcclxuICAgIHNoZWxmR3JvdXAuZ2V0KFwidHlwZVwiKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodHlwZSkgPT4ge1xyXG4gICAgICBjb25zdCBwcm9kdWN0UGVyU2hlbGZDb250cm9sID0gc2hlbGZHcm91cC5nZXQoXCJwcm9kdWN0Q2FwYWNpdHlcIik7XHJcbiAgICAgIGlmICh0eXBlID09PSBcInZtb25seVwiKSB7XHJcbiAgICAgICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsdWUoMCk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNUeXBlID09PSBcInZtb25seVwiKSB7XHJcbiAgICAgICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsdWUoMSk7XHJcbiAgICAgIH1cclxuICAgICAgcHJldmlvdXNUeXBlID0gdHlwZTtcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKHNoZWxmR3JvdXAsIHR5cGUpO1xyXG4gICAgICBjb25zdCBub09mUm93c0NvbnRyb2wgPSBzaGVsZkdyb3VwLmdldChcIm5vT2ZSb3dzXCIpO1xyXG4gICAgICBpZiAodHlwZSA9PT0gXCJ0cmF5XCIpIHtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbGlkYXRvcnMoW1xyXG4gICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgIFZhbGlkYXRvcnMubWluKDEpLFxyXG4gICAgICAgIF0pO1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uc2V0VmFsdWUoMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbm9PZlJvd3NDb250cm9sPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIG5vT2ZSb3dzQ29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBJZiBpbmRleCBpcyBub3QgZ2l2ZW4sIGxhc3Qgc2hlbGYgc2hvdWxkIGJlIHJlbW92ZWRcclxuICByZW1vdmVTaGVsZihpbmRleDogbnVtYmVyID0gdGhpcy5zaGVsZkFycmF5LmNvbnRyb2xzLmxlbmd0aCAtIDEpIHtcclxuICAgIGlmICh0aGlzLnNoZWxmQXJyYXkuY29udHJvbHMubGVuZ3RoID09IDEpIHJldHVybjtcclxuICAgIHRoaXMuc2hlbGZBcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgfVxyXG5cclxuICBhZGRQYW5lbChwYW5lbD86IEZpeHR1cmVMaWJyYXJ5U2hlbGZDb25maWcpIHtcclxuICAgIGNvbnN0IHBhbmVsR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcGFuZWxOYW1lOiBbcGFuZWw/LmxhYmVsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZ2VuZXJhbFZhbGlkYXRvcigpXV0sXHJcbiAgICAgIHByb2R1Y3RDYXBhY2l0eTogW1xyXG4gICAgICAgIHBhbmVsPy5wcm9kdWN0UGVyU2hlbGYgPz8gNixcclxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMCldLFxyXG4gICAgICBdLFxyXG4gICAgICBub09mUm93czogW1xyXG4gICAgICAgIHBhbmVsPy50cmF5Um93cyA/PyA1LFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV0sXHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnBhbmVsQXJyYXkucHVzaChwYW5lbEdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8vIElmIGluZGV4IGlzIG5vdCBnaXZlbiwgbGFzdCBwYW5lbCBzaG91bGQgYmUgcmVtb3ZlZFxyXG4gIHJlbW92ZVBhbmVsKGluZGV4OiBudW1iZXIgPSB0aGlzLnBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoIC0gMSkge1xyXG4gICAgaWYgKHRoaXMucGFuZWxBcnJheS5jb250cm9scy5sZW5ndGggPT0gMSkgcmV0dXJuO1xyXG4gICAgdGhpcy5wYW5lbEFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb24oc2VjdGlvbjogXCJoZWFkZXJcIiB8IFwiYm9keVwiIHwgXCJmb290ZXJcIikge1xyXG4gICAgdGhpcy50b2dnbGVTZWN0aW9uRm9ybShzZWN0aW9uKTtcclxuICAgIHRoaXMudG9nZ2xlU2VjdGlvbkNoZWNrQm94KHNlY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VjdGlvbkZvcm0oc2VjdGlvbjogXCJoZWFkZXJcIiB8IFwiYm9keVwiIHwgXCJmb290ZXJcIikge1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybSgpO1xyXG4gICAgY29uc3QgZ3JvdXAgPSBmb3JtLmdldChzZWN0aW9uKTtcclxuICAgIGlmIChncm91cCkge1xyXG4gICAgICBncm91cC5lbmFibGVkXHJcbiAgICAgICAgPyBncm91cC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxyXG4gICAgICAgIDogZ3JvdXAuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb25DaGVja0JveChzZWN0aW9uOiBcImhlYWRlclwiIHwgXCJib2R5XCIgfCBcImZvb3RlclwiKSB7XHJcbiAgICBzd2l0Y2ggKHNlY3Rpb24pIHtcclxuICAgICAgY2FzZSBcImhlYWRlclwiOlxyXG4gICAgICAgIHRoaXMuaXNIZWFkZXJFbmFibGVkID0gIXRoaXMuaXNIZWFkZXJFbmFibGVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiYm9keVwiOlxyXG4gICAgICAgIHRoaXMuaXNCb2R5RW5hYmxlZCA9ICF0aGlzLmlzQm9keUVuYWJsZWQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJmb290ZXJcIjpcclxuICAgICAgICB0aGlzLmlzRm9vdGVyRW5hYmxlZCA9ICF0aGlzLmlzRm9vdGVyRW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1hcEZvcm1Ub0FwaShmb3JtOiBGb3JtR3JvdXAsIHN0YXR1czogc3RyaW5nKTogYW55IHtcclxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm0udmFsdWU7XHJcbiAgICBjb25zdCBmb3JtQXJyYXkgPVxyXG4gICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIlxyXG4gICAgICAgID8gdGhpcy5zaGVsZkFycmF5XHJcbiAgICAgICAgOiB0aGlzLnBhbmVsQXJyYXk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBmaXh0dXJlQ2F0ZWdvcnk6IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5LFxyXG4gICAgICBmaXh0dXJlQ2FwYWNpdHk6IHRoaXMudG90YWxQcm9kdWN0Q2FwYWNpdHksXHJcbiAgICAgIGZpeHR1cmVMZW5ndGg6IHtcclxuICAgICAgICB2YWx1ZTogZm9ybVZhbHVlLmJhc2ljRGV0YWlscy5sZW5ndGgsXHJcbiAgICAgICAgdW5pdDogXCJmdFwiLFxyXG4gICAgICB9LFxyXG4gICAgICBmaXh0dXJlV2lkdGg6IHtcclxuICAgICAgICB2YWx1ZTogZm9ybVZhbHVlLmJhc2ljRGV0YWlscy53aWR0aCxcclxuICAgICAgICB1bml0OiBcImZ0XCIsXHJcbiAgICAgIH0sXHJcbiAgICAgIGhlYWRlcjoge1xyXG4gICAgICAgIGhlaWdodDoge1xyXG4gICAgICAgICAgdmFsdWU6IGZvcm0uZ2V0KFwiaGVhZGVyLmhlaWdodFwiKT8udmFsdWUsXHJcbiAgICAgICAgICB1bml0OiBcIm1tXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsYWJlbDogXCJcIixcclxuICAgICAgICBpc0VuYWJsZWQ6ICFmb3JtLmdldChcImhlYWRlclwiKT8uZGlzYWJsZWQsXHJcbiAgICAgIH0sXHJcbiAgICAgIGZvb3Rlcjoge1xyXG4gICAgICAgIGhlaWdodDoge1xyXG4gICAgICAgICAgdmFsdWU6IGZvcm0uZ2V0KFwiZm9vdGVyLmhlaWdodFwiKT8udmFsdWUsXHJcbiAgICAgICAgICB1bml0OiBcIm1tXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBsYWJlbDogXCJcIixcclxuICAgICAgICBpc0VuYWJsZWQ6ICFmb3JtLmdldChcImZvb3RlclwiKT8uZGlzYWJsZWQsXHJcbiAgICAgIH0sXHJcbiAgICAgIGlzQm9keUVuYWJsZWQ6ICFmb3JtLmdldChcImJvZHlcIik/LmRpc2FibGVkLFxyXG4gICAgICBzaGVsZkNvbmZpZzogZm9ybUFycmF5LmNvbnRyb2xzLm1hcCgoZSwgaSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBzaGVsZk51bWJlcjogaSArIDEsXHJcbiAgICAgICAgICBzaGVsZlR5cGU6IGU/LnZhbHVlPy50eXBlID8/IFwidHJheVwiLFxyXG4gICAgICAgICAgcHJvZHVjdFBlclNoZWxmOiBlLnZhbHVlLnByb2R1Y3RDYXBhY2l0eSxcclxuICAgICAgICAgIHRyYXlSb3dzOiBlPy52YWx1ZT8ubm9PZlJvd3MgPz8gMSxcclxuICAgICAgICAgIGxhYmVsOiBlPy52YWx1ZT8ucGFuZWxOYW1lID8/IFwiXCIsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdWJtaXQoc3RhdHVzOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldEZvcm0oKTtcclxuXHJcbiAgICAgIGlmIChmb3JtLmludmFsaWQpIHtcclxuICAgICAgICBmb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXCJGb3JtIGlzIGludmFsaWRcIik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc3RhdHVzID09PSBcImNvbXBsZXRlXCIpXHJcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jb25maXJtQ29tcGxldGlvbigpKSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgY29uc3QgdHJhbnNmb3JtZWREYXRhID0gdGhpcy5tYXBGb3JtVG9BcGkoZm9ybSwgc3RhdHVzKTtcclxuXHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVMaWJyYXJ5KFxyXG4gICAgICAgICAgdHJhbnNmb3JtZWREYXRhLFxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscz8uX2lkISxcclxuICAgICAgICApLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHJlcyAmJiByZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnN0YXR1cyA9IHN0YXR1cztcclxuICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChyZXMubWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5jYW5Hb0JhY2sgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIm1hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiXSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChcclxuICAgICAgICBlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBzYXZlIEZpeHR1cmUgZGV0YWlsc1wiLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gdXBkYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVMaWJyYXJ5KHRyYW5zZm9ybWVkRGF0YSwgdGhpcy5maXh0dXJlRGV0YWlscz8uX2lkISkuc3Vic2NyaWJlKHtcclxuICAgIC8vICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAvLyAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnc3VjY2VzcycpIHtcclxuICAgIC8vICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgLy8gICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydtYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXMnXSk7XHJcbiAgICAvLyAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAvLyAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8/IFwiRmFpbGVkIHRvIHNhdmUgRml4dHVyZSBkZXRhaWxzXCIpO1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwiQEAgfiB1cGRhdGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycik7XHJcbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FuRGVhY3RpdmF0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLmNhbkdvQmFjaykgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybSgpO1xyXG5cclxuICAgIGlmIChmb3JtLmRpcnR5KSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybUV4aXQoKTtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vblN1Ym1pdChcImRyYWZ0XCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1FeGl0KCk6IFByb21pc2U8Ym9vbGVhbiB8IG51bGw+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKEV4aXRDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09IFwib2tcIik7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1Db21wbGV0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ29tcGxldGVDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gXCJDb21wbGV0ZSBmaXh0dXJlXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgIFwiRml4dHVyZSBpcyBub3cgcmVhZHkgYW5kIGF2YWlsYWJsZSB0byBjcmVhdGUgYXMgdGVtcGxhdGUuXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5ub3RlID1cclxuICAgICAgXCJZb3UgY2FuJ3QgZWRpdCBpdCBvbmNlIGFzc2lnbmVkIHRvIHRoZSB0ZW1wbGF0ZS5cIjtcclxuXHJcbiAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSBcIm9rXCIpO1xyXG4gIH1cclxuXHJcbiAgb25EdXBsaWNhdGUoKSB7XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmR1cGxpY2F0ZUZpeHR1cmVMaWJyYXJ5KHtcclxuICAgICAgICBmaXh0dXJlSWQ6IHRoaXMuZml4dHVyZURldGFpbHMuX2lkLFxyXG4gICAgICB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLmRhdGEubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuR29CYWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL21hbmFnZS9wbGFub2dyYW0vY3JlYXRlLWxpYnJhcnktZml4dHVyZVwiXSwge1xyXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGZpeHR1cmVJZDogcmVzPy5kYXRhPy5pZCB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgIGVycj8uZXJyb3I/LmVycm9yIHx8IFwiRmFpbGVkIHRvIGR1cGxpY2F0ZSBGaXh0dXJlXCIsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJAQCB+IGR1cGxpY2F0ZUZpeHR1cmVMaWJyYXJ5IGVycjpcIiwgZXJyKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1EZWxldGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBcIkRlbGV0ZSBmaXh0dXJlXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGZpeHR1cmUgP1wiO1xyXG5cclxuICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09IFwib2tcIik7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkRlbGV0ZSgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLnRlbXBsYXRlSWQpIHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ2Fubm90UGVyZm9ybUNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBgQ2Fu4oCZdCBkZWxldGUgZml4dHVyZSFgO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9IGBTaW5jZSB0aGlzIGZpeHR1cmUgaXMgbGl2ZSBpbiBcIiR7dGhpcy5maXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkfSB0ZW1wbGF0ZXMsXCIgZGVsZXRpbmcgaXMgbm90IGFsbG93ZWQuYDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghKGF3YWl0IHRoaXMuY29uZmlybURlbGV0aW9uKCkpKSByZXR1cm47XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmRlbGV0ZUZpeHR1cmVMaWJyYXJ5KHsgZml4dHVyZUlkOiB0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIm1hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgICAgICBlcnI/LmVycm9yPy5lcnJvciB8fCBcIkZhaWxlZCB0byBkZWxldGUgRml4dHVyZVwiLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBkZWxldGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrRWRpdCgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLnRlbXBsYXRlSWQpIHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ2Fubm90UGVyZm9ybUNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBgQ2Fu4oCZdCBlZGl0IGZpeHR1cmUhYDtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSBgU2luY2UgdGhpcyBmaXh0dXJlIGlzIGxpdmUgaW4gXCIke3RoaXMuZml4dHVyZURldGFpbHMudGVtcGxhdGVJZH0gdGVtcGxhdGVzLFwiIGVkaXRpbmcgaXMgbm90IGFsbG93ZWQuYDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNFZGl0TW9kZSA9IHRydWU7XHJcbiAgICB0aGlzLmZsb29yRml4dHVyZUZvcm0/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuaGVhZGVyPy5pc0VuYWJsZWQpXHJcbiAgICAgIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oXCJoZWFkZXJcIik7XHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuZm9vdGVyPy5pc0VuYWJsZWQpXHJcbiAgICAgIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oXCJmb290ZXJcIik7XHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuaXNCb2R5RW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uRm9ybShcImJvZHlcIik7XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcclxuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcclxuICAgICAgcXVlcnlQYXJhbXM6IHsgaXNFZGl0OiB0cnVlIH0sXHJcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlXCIgKm5nSWY9XCIhaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDwhLS0gSGVhZGVyIHNlY3Rpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50cy1jZW50ZXIgZ2FwLTVcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcC0zXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXNcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuODMzNCA5Ljk5OTg0SDQuMTY2NzVNNC4xNjY3NSA5Ljk5OTg0TDEwLjAwMDEgMTUuODMzMk00LjE2Njc1IDkuOTk5ODRMMTAuMDAwMSA0LjE2NjVcIlxyXG4gICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8aDIgY2xhc3M9XCJtLTAgZWxsaXBzaXNcIiBzdHlsZT1cIm1heC13aWR0aDogY2FsYygxMDB2dyAtIDg2MHB4KVwiXHJcbiAgICAgICAgW25nYlRvb2x0aXBdPVwiZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ICsgJyAtICcgKyBmaXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGg/LnZhbHVlICsgJ2Z0J1wiPlxyXG4gICAgICAgIHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeSB9fSAtIHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udmFsdWUgfX1cclxuICAgICAgICB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgIDwvaDI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZSBkcmFmdFwiPnt7IGZpeHR1cmVEZXRhaWxzLnN0YXR1cyB8IHRpdGxlY2FzZSB9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnRzLWNlbnRlciBnYXAtNVwiPlxyXG4gICAgICA8cCBjbGFzcz1cIm0tMCB0ZXh0LW5vd3JhcFwiICpuZ0lmPVwiZml4dHVyZURldGFpbHM/LnVwZGF0ZWRBdFwiXHJcbiAgICAgICAgW25nYlRvb2x0aXBdPVwiZml4dHVyZURldGFpbHMudXBkYXRlZEF0IHwgZGF0ZSA6ICdtZWRpdW0nXCI+XHJcbiAgICAgICAgTGFzdCB1cGRhdGU6IHt7IGZpeHR1cmVEZXRhaWxzLnVwZGF0ZWRBdCB8IHRpbWVBZ28gfX1cclxuICAgICAgPC9wPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCIgKGNsaWNrKT1cIm9uQ2xpY2tFZGl0KClcIj5cclxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzEzMjJfNTMyNSlcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xNC4xNjY3IDIuNDk5OTNDMTQuMzg1NiAyLjI4MTA2IDE0LjY0NTUgMi4xMDc0NCAxNC45MzE0IDEuOTg4OTlDMTUuMjE3NCAxLjg3MDU0IDE1LjUyMzkgMS44MDk1NyAxNS44MzM0IDEuODA5NTdDMTYuMTQyOSAxLjgwOTU3IDE2LjQ0OTQgMS44NzA1NCAxNi43MzU0IDEuOTg4OTlDMTcuMDIxNCAyLjEwNzQ0IDE3LjI4MTIgMi4yODEwNiAxNy41MDAxIDIuNDk5OTNDMTcuNzE5IDIuNzE4OCAxNy44OTI2IDIuOTc4NjMgMTguMDExIDMuMjY0NkMxOC4xMjk1IDMuNTUwNTcgMTguMTkwNCAzLjg1NzA2IDE4LjE5MDQgNC4xNjY1OUMxOC4xOTA0IDQuNDc2MTIgMTguMTI5NSA0Ljc4MjYyIDE4LjAxMSA1LjA2ODU5QzE3Ljg5MjYgNS4zNTQ1NSAxNy43MTkgNS42MTQzOSAxNy41MDAxIDUuODMzMjZMNi4yNTAwOCAxNy4wODMzTDEuNjY2NzUgMTguMzMzM0wyLjkxNjc1IDEzLjc0OTlMMTQuMTY2NyAyLjQ5OTkzWlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTMyMl81MzI1XCI+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgRWRpdFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJpc0VkaXRNb2RlXCIgY2xhc3M9XCJkLWZsZXggZ2FwLTUganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvblN1Ym1pdCgnZHJhZnQnKVwiPlNhdmUgYXMgZHJhZnQ8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvblN1Ym1pdCgnY29tcGxldGUnKVwiPkNvbXBsZXRlPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscz8uX2lkXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBwLTNcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSAxMkMxMSAxMi41NTIzIDExLjQ0NzcgMTMgMTIgMTNDMTIuNTUyMyAxMyAxMyAxMi41NTIzIDEzIDEyQzEzIDExLjQ0NzcgMTIuNTUyMyAxMSAxMiAxMUMxMS40NDc3IDExIDExIDExLjQ0NzcgMTEgMTJaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSAxOUMxMSAxOS41NTIzIDExLjQ0NzcgMjAgMTIgMjBDMTIuNTUyMyAyMCAxMyAxOS41NTIzIDEzIDE5QzEzIDE4LjQ0NzcgMTIuNTUyMyAxOCAxMiAxOEMxMS40NDc3IDE4IDExIDE4LjQ0NzcgMTEgMTlaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSA1QzExIDUuNTUyMjggMTEuNDQ3NyA2IDEyIDZDMTIuNTUyMyA2IDEzIDUuNTUyMjggMTMgNUMxMyA0LjQ0NzcyIDEyLjU1MjMgNCAxMiA0QzExLjQ0NzcgNCAxMSA0LjQ0NzcyIDExIDVaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxyXG4gICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvbkR1cGxpY2F0ZSgpXCIgKm5nSWY9XCIhaXNFZGl0TW9kZVwiPkR1cGxpY2F0ZTwvYT48L2xpPlxyXG4gICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gY3Vyc29yLXBvaW50ZXIgdGV4dC1kYW5nZXJcIiAoY2xpY2spPVwib25EZWxldGUoKVwiPiBEZWxldGUgPC9hPlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFdhbGwgdHlwZSBmaXh0dXJlIGNyZWF0aW9uIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiICpuZ0lmPVwiZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiPlxyXG4gICAgPCEtLSBXYWxsIEZpeHR1cmUgRm9ybSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxoMj5GaXh0dXJlIERldGFpbHM8L2gyPlxyXG4gICAgICAgIDxwPkNvbmZpZ3VyZSB5b3VyIGZpeHR1cmUgZGV0YWlscyBoZXJlPC9wPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwid2FsbEZpeHR1cmVGb3JtXCI+XHJcbiAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbiAjYWNjb3JkaW9uPVwibmdiQWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgIDwhLS0gQmFzaWMgRGV0YWlscyAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZGV0YWlsc1wiIFtjb2xsYXBzZWRdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+QkFTSUMgREVUQUlMUzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYmFzaWNEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZml4dHVyZUNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5GaXh0dXJlIG5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZml4dHVyZUNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaW52YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4dHVyZSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBjYW5ub3QgYmUgb25seSB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgd2lkdGggKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cIndpZHRoXCIgW3N0ZXBdPVwiMC41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8uaW52YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIHdpZHRoIGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgaGVpZ2h0IChcIiArIChmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwibGVuZ3RoXCIgW3N0ZXBdPVwiMC41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmFsbCBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNIZWFkZXJFbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWN0aW9uKCdoZWFkZXInKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbXMtNFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+SEVBREVSPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgZm9ybUdyb3VwTmFtZT1cImhlYWRlclwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNIZWFkZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIkhlaWdodCAoXCIgKyAoZml4dHVyZURldGFpbHMuaGVhZGVyPy5oZWlnaHQ/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwiaGVpZ2h0XCIgW3N0ZXBdPVwiMC41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdoZWFkZXIuaGVpZ2h0Jyk/LnRvdWNoZWQgJiYgd2FsbEZpeHR1cmVGb3JtLmdldCgnaGVhZGVyLmhlaWdodCcpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdoZWFkZXIuaGVpZ2h0Jyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQm9keSBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJib2R5XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIiBbY2hlY2tlZF09XCJpc0JvZHlFbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWN0aW9uKCdib2R5Jyk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1zLTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkJPRFk8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYm9keVwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNCb2R5RW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5ObyBvZiBzaGVsdmVzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1jb250YWluZXJcIiBbY2xhc3MuZGlzYWJsZS1jb3VudGVyXT1cIiFpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cInJlbW92ZVNoZWxmKCk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy43NjI5NCA3SDExLjkyOTZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2hlbGZBcnJheS5sZW5ndGggfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cImFkZFNoZWxmKCk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4xNTM4OSAyLjkxNjVWMTEuMDgzMk0zLjA3MDU2IDYuOTk5ODRIMTEuMjM3MlwiIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwic2hlbGZBcnJheS5sZW5ndGggPCAxICYmIGlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgc2hlbGYgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hlbGZBcnJheT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInNoZWxmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc2hlbGYgb2Ygc2hlbGZBcnJheT8uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJyYXktZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2hlbGYtdGl0bGVcIj5TaGVsZiB7eyBpICsgMSB9fTwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlU2hlbGYoaSk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cIiFpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwic2hlbGZUeXBlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hlbGYuZ2V0KCd0eXBlJyk/LnZhbHVlID09PSAndHJheSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+Tm8gb2Ygcm93czwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJub09mUm93c1wiIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaGVsZi5nZXQoJ25vT2ZSb3dzJyk/LnRvdWNoZWQgJiYgc2hlbGYuZ2V0KCdub09mUm93cycpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInNoZWxmLmdldCgnbm9PZlJvd3MnKT8uaGFzRXJyb3IoJ21pbicpXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGF0IGxlYXN0IDEgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaGVsZi5nZXQoJ3R5cGUnKT8udmFsdWUgIT09ICd2bW9ubHknXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Qcm9kdWN0IGNhcGFjaXR5IGZvciBlYWNoIHJvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RDYXBhY2l0eVwiIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaGVsZi5nZXQoJ3R5cGUnKT8udmFsdWUgIT09ICd2bW9ubHknICYmIHNoZWxmLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnRvdWNoZWQgJiYgc2hlbGYuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8uZXJyb3JzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzaGVsZi5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0IGNhcGFjaXR5IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZvb3RlciBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJmb290ZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiIFtjaGVja2VkXT1cImlzRm9vdGVyRW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VjdGlvbignZm9vdGVyJyk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1zLTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkZPT1RFUjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJmb290ZXJcIiBbY2xhc3MuZGlzYWJsZWRdPVwiIWlzRm9vdGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgXCJIZWlnaHQgKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZvb3Rlcj8uaGVpZ2h0Py51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cImhlaWdodFwiIFtzdGVwXT1cIjAuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnZm9vdGVyLmhlaWdodCcpPy50b3VjaGVkICYmIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Zvb3Rlci5oZWlnaHQnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnZm9vdGVyLmhlaWdodCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBGb290ZXIgaGVpZ2h0IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBXYWxsIEZpeHR1cmUgUHJldmlldyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbC04XCI+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoNzV2aCAtIDEyMHB4KTsgb3ZlcmZsb3cteTogYXV0b1wiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0JvZHlFbmFibGVkIHx8IGlzSGVhZGVyRW5hYmxlZCB8fCBpc0Zvb3RlckVuYWJsZWQ7IGVsc2UgZW1wdHlGaXh0dXJlXCJcclxuICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAge3sgbGVuZ3RoIH19IHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LnZhbHVlXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBnYXAtNVwiICpuZ0lmPVwiaXNIZWFkZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYmxvY2tcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWluZm9cIj5cclxuICAgICAgICAgICAgICAgIDxwPkhFQURFUjwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEJvZHkgUHJldmlldyAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktYmxvY2tcIiAqbmdJZj1cImlzQm9keUVuYWJsZWQgJiYgc2hlbGZBcnJheS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBnYXAtNSBzaGVsZkNvbnRhaW5lclwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNoZWxmQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIEBpZihpdGVtLmdldCgndHlwZScpPy52YWx1ZSA9PT0ndHJheScpe1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSlcIiBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgVFJBWSB7eyBpICsgMSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5nZXQoXCJwcm9kdWN0Q2FwYWNpdHlcIik/LnZhbHVlICogKGl0ZW0uZ2V0KFwibm9PZlJvd3NcIik/LnZhbHVlID8/IDEpIH19PC9iPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibG9jayBzaGVsZlwiIFtjbGFzcy52bW9ubHktcGxhY2Vob2xkZXJdPVwiaXRlbS5nZXQoJ3R5cGUnKT8udmFsdWUgPT09J3Ztb25seSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udmFsdWUpXCIgY2xhc3M9XCJwcm9kdWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uZ2V0KCd0eXBlJyk/LnZhbHVlID09PSd2bW9ubHknID8gICdWTSBPTkxZJzogJ1NIRUxGJ319IHt7IGkgKyAxIH19IDxiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOiB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgfX08L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZvb3RlciBQcmV2aWV3IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC01XCIgKm5nSWY9XCJpc0Zvb3RlckVuYWJsZWRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlciBmb290ZXItYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbS0wIGgtMTAwIGdhcC0zIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc3ViLWZvb3RlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIHN1Yi1mb290ZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXItaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgPHA+Rk9PVEVSPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlGaXh0dXJlPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW4gaC0xMDBcIj5cclxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+UHJldmlldyByZXF1aXJlcyBoZWFkZXIsIGZvb3Rlciwgb3IgYm9keSBibG9jayBlbmFibGVkLjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhc3VidGV4dFwiPlBsZWFzZSBlbmFibGUgZWl0aGVyIHRoZSBoZWFkZXIsIGZvb3Rlciwgb3IgYm9keSB0byB2aWV3IHRoZSBwcmV2aWV3Li48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBJbmZvIENhcmRzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyBzaGVsZkFycmF5Lmxlbmd0aCB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5ObyBvZiBTaGVsdmVzPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgdG90YWxQcm9kdWN0Q2FwYWNpdHkgfX08L2gzPlxyXG4gICAgICAgICAgPHA+UHJvZHVjdCBDYXBhY2l0eTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPnt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlIHwgdGl0bGVjYXNlIH19IGZpeHR1cmU8L2gzPlxyXG4gICAgICAgICAgPHA+VHlwZTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPlxyXG4gICAgICAgICAgICB7eyB3YWxsRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpPy52YWx1ZSB9fSB4XHJcbiAgICAgICAgICAgIHt7IHdhbGxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMubGVuZ3RoXCIpPy52YWx1ZSB9fSBmZWV0XHJcbiAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgPHA+T3ZlcmFsbCBEaW1lbnNpb248L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gRmxvb3IgdHlwZSBmaXh0dXJlIGNyZWF0aW9uIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiICpuZ0lmPVwiZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICdmbG9vcidcIj5cclxuICAgIDwhLS0gRmxvb3IgUGFuZWwgRm9ybSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxoMj5GaXh0dXJlIERldGFpbHM8L2gyPlxyXG4gICAgICAgIDxwPlRoZSBzZXR0aW5ncyBhcmUgcHJlLWNvbmZpZ3VyZWQgYW5kIGNhbm5vdCBiZSBlZGl0ZWQ8L3A+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmbG9vckZpeHR1cmVGb3JtXCI+XHJcbiAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbiAjYWNjb3JkaW9uPVwibmdiQWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgIDwhLS0gQmFzaWMgRGV0YWlscyAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZGV0YWlsc1wiIFtjb2xsYXBzZWRdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+QkFTSUMgREVUQUlMUzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYmFzaWNEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZml4dHVyZUNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5GaXh0dXJlIG5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZml4dHVyZUNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4dHVyZSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXh0dXJlIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCB3aWR0aCAoXCIgKyAoZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwid2lkdGhcIiBbc3RlcF09XCIwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LmludmFsaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIHdpZHRoIGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCBsZW5ndGggKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJsZW5ndGhcIiBbc3RlcF09XCIwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8uaW52YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIGhlaWdodCBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBQYW5lbCBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJwYW5lbFwiPlxyXG4gICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5QQU5FTDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5ObyBvZiBwYW5lbHM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1jb250YWluZXJcIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIChjbGljayk9XCJyZW1vdmVQYW5lbCgpOyBmbG9vckZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy43NjI5NCA3SDExLjkyOTZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHBhbmVsQXJyYXkubGVuZ3RoIH19PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIChjbGljayk9XCJhZGRQYW5lbCgpOyBmbG9vckZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4xNTM4OSAyLjkxNjVWMTEuMDgzMk0zLjA3MDU2IDYuOTk5ODRIMTEuMjM3MlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbEFycmF5Lmxlbmd0aCA8IDEgJiYgaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFuZWwgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGFuZWxBcnJheT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJwYW5lbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwYW5lbCBvZiBwYW5lbEFycmF5Py5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJyYXktZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJzaGVsZi10aXRsZVwiPlBhbmVsIHt7IGkgKyAxIH19PC9oNj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIChjbGljayk9XCJyZW1vdmVQYW5lbChpKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBhbmVsTmFtZVwiIGZvcm1Db250cm9sTmFtZT1cInBhbmVsTmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuZ2V0KCdwYW5lbE5hbWUnKT8udG91Y2hlZCAmJiBwYW5lbC5nZXQoJ3BhbmVsTmFtZScpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsLmdldCgncGFuZWxOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZWwgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsLmdldCgncGFuZWxOYW1lJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lbCBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ3BhbmVsTmFtZScpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHJvd3M8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwibm9PZlJvd3NcIiBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuZ2V0KCdub09mUm93cycpPy50b3VjaGVkICYmIHBhbmVsLmdldCgnbm9PZlJvd3MnKT8uZXJyb3JzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWwuZ2V0KCdub09mUm93cycpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBhdCBsZWFzdCAxIHJvdy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Qcm9kdWN0IGNhcGFjaXR5IGZvciBlYWNoIHJvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2FwYWNpdHlcIiBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicGFuZWwuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udG91Y2hlZCAmJiBwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdCBjYXBhY2l0eSBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGbG9vciBQYW5lbCBQcmV2aWV3IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogY2FsYyg3NXZoIC0gMTIwcHgpOyBvdmVyZmxvdy15OiBhdXRvXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoOyBlbHNlIG5vUGFuZWxcIiBjbGFzcz1cImZsb29yLXBhbmVsLXZpZXdwb3J0IHctMTAwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFuZWxBcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZC1mbGV4IGdhcC01XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGxlbmd0aCB9fSB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIiB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udmFsdWVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIFwiPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGVsZkNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSlcIiBjbGFzcz1cInBhbmVsIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy52YWx1ZSlcIiBjbGFzcz1cInByb2R1Y3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgUEFORUwge3sgaSArIDEgfX1cclxuICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOlxyXG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgKiAoaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgPz8gMSkgfX08L2I+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTUgbXQtNVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDI0cHhcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDY0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDUzMCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk01MjIuNjUzIDAuMjkyODkzQzUyMi4yNjMgLTAuMDk3NjMxNSA1MjEuNjMgLTAuMDk3NjMxNCA1MjEuMjM5IDAuMjkyODkzTDUxNC44NzUgNi42NTY4NUM1MTQuNDg1IDcuMDQ3MzggNTE0LjQ4NSA3LjY4MDU0IDUxNC44NzUgOC4wNzEwN0M1MTUuMjY2IDguNDYxNTkgNTE1Ljg5OSA4LjQ2MTU5IDUxNi4yODkgOC4wNzEwN0w1MjEuOTQ2IDIuNDE0MjFMNTI3LjYwMyA4LjA3MTA3QzUyNy45OTQgOC40NjE1OSA1MjguNjI3IDguNDYxNTkgNTI5LjAxNyA4LjA3MTA3QzUyOS40MDggNy42ODA1NCA1MjkuNDA4IDcuMDQ3MzggNTI5LjAxNyA2LjY1Njg1TDUyMi42NTMgMC4yOTI4OTNaTTUyMi45NDYgMTRMNTIyLjk0NiAxTDUyMC45NDYgMUw1MjAuOTQ2IDE0TDUyMi45NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0zOTQuMTUzIDAuMjkyODkzQzM5My43NjMgLTAuMDk3NjMxNSAzOTMuMTMgLTAuMDk3NjMxNCAzOTIuNzM5IDAuMjkyODkzTDM4Ni4zNzUgNi42NTY4NUMzODUuOTg1IDcuMDQ3MzggMzg1Ljk4NSA3LjY4MDU0IDM4Ni4zNzUgOC4wNzEwN0MzODYuNzY2IDguNDYxNTkgMzg3LjM5OSA4LjQ2MTU5IDM4Ny43ODkgOC4wNzEwN0wzOTMuNDQ2IDIuNDE0MjFMMzk5LjEwMyA4LjA3MTA3QzM5OS40OTQgOC40NjE1OSA0MDAuMTI3IDguNDYxNTkgNDAwLjUxNyA4LjA3MTA3QzQwMC45MDggNy42ODA1NCA0MDAuOTA4IDcuMDQ3MzggNDAwLjUxNyA2LjY1Njg1TDM5NC4xNTMgMC4yOTI4OTNaTTM5NC40NDYgMTRMMzk0LjQ0NiAxTDM5Mi40NDYgMUwzOTIuNDQ2IDE0TDM5NC40NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0yNjUuNjUzIDAuMjkyODkzQzI2NS4yNjMgLTAuMDk3NjMxNSAyNjQuNjMgLTAuMDk3NjMxNCAyNjQuMjM5IDAuMjkyODkzTDI1Ny44NzUgNi42NTY4NUMyNTcuNDg1IDcuMDQ3MzggMjU3LjQ4NSA3LjY4MDU0IDI1Ny44NzUgOC4wNzEwN0MyNTguMjY2IDguNDYxNTkgMjU4Ljg5OSA4LjQ2MTU5IDI1OS4yODkgOC4wNzEwN0wyNjQuOTQ2IDIuNDE0MjFMMjcwLjYwMyA4LjA3MTA3QzI3MC45OTQgOC40NjE1OSAyNzEuNjI3IDguNDYxNTkgMjcyLjAxNyA4LjA3MTA3QzI3Mi40MDggNy42ODA1NCAyNzIuNDA4IDcuMDQ3MzggMjcyLjAxNyA2LjY1Njg1TDI2NS42NTMgMC4yOTI4OTNaTTI2NS45NDYgMTRMMjY1Ljk0NiAxTDI2My45NDYgMUwyNjMuOTQ2IDE0TDI2NS45NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0xMzcuMTUzIDAuMjkyODkzQzEzNi43NjMgLTAuMDk3NjMxNSAxMzYuMTMgLTAuMDk3NjMxNCAxMzUuNzM5IDAuMjkyODkzTDEyOS4zNzUgNi42NTY4NUMxMjguOTg1IDcuMDQ3MzggMTI4Ljk4NSA3LjY4MDU0IDEyOS4zNzUgOC4wNzEwN0MxMjkuNzY2IDguNDYxNTkgMTMwLjM5OSA4LjQ2MTU5IDEzMC43ODkgOC4wNzEwN0wxMzYuNDQ2IDIuNDE0MjFMMTQyLjEwMyA4LjA3MTA3QzE0Mi40OTQgOC40NjE1OSAxNDMuMTI3IDguNDYxNTkgMTQzLjUxNyA4LjA3MTA3QzE0My45MDggNy42ODA1NCAxNDMuOTA4IDcuMDQ3MzggMTQzLjUxNyA2LjY1Njg1TDEzNy4xNTMgMC4yOTI4OTNaTTEzNy40NDYgMTRMMTM3LjQ0NiAxTDEzNS40NDYgMUwxMzUuNDQ2IDE0TDEzNy40NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk04LjY1MzQgMC4yOTI4OTNDOC4yNjI4NyAtMC4wOTc2MzE1IDcuNjI5NzEgLTAuMDk3NjMxNCA3LjIzOTE4IDAuMjkyODkzTDAuODc1MjIxIDYuNjU2ODVDMC40ODQ2OTcgNy4wNDczOCAwLjQ4NDY5NyA3LjY4MDU0IDAuODc1MjIxIDguMDcxMDdDMS4yNjU3NSA4LjQ2MTU5IDEuODk4OTEgOC40NjE1OSAyLjI4OTQzIDguMDcxMDdMNy45NDYyOSAyLjQxNDIxTDEzLjYwMzEgOC4wNzEwN0MxMy45OTM3IDguNDYxNTkgMTQuNjI2OCA4LjQ2MTU5IDE1LjAxNzQgOC4wNzEwN0MxNS40MDc5IDcuNjgwNTQgMTUuNDA3OSA3LjA0NzM4IDE1LjAxNzQgNi42NTY4NUw4LjY1MzQgMC4yOTI4OTNaTTguOTQ2MjkgMTRMOC45NDYyOSAxTDYuOTQ2MjkgMUw2Ljk0NjI5IDE0TDguOTQ2MjkgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTdcIiBoZWlnaHQ9XCI0M1wiIHZpZXdCb3g9XCIwIDAgNTcgNDNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMC40Mzk2OTcgMzEuODA4N0MwLjQzOTY5NyAyNi44NjQgNC40NDgyIDIyLjg1NTUgOS4zOTI5NCAyMi44NTU1SDQ3LjQ2ODFDNTIuNDIzIDIyLjg1NTUgNTYuNDM5NyAyNi44NzIyIDU2LjQzOTcgMzEuODI3QzU2LjQzOTcgMzcuMzI1NSA1MS41MzczIDQxLjQ5OTQgNDYuMDc2NSA0MC44NTcxQzMzLjYzMTggMzkuMzkzNSAyMy43MjY3IDM5LjMyMDYgMTAuODE4NiA0MC44Mzc2QzUuMzU1NDIgNDEuNDc5NiAwLjQzOTY5NyAzNy4zMDk1IDAuNDM5Njk3IDMxLjgwODdaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxRDI5MzlcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjI4LjQ0MDhcIiBjeT1cIjE2LjU3MTRcIiByPVwiMTUuMDcxNFwiIGZpbGw9XCIjMUQyOTM5XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIzXCIgLz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub1BhbmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW4gaC0xMDBcIj5cclxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+QWRkIGEgcGFuZWwgdG8gc2VlIHlvdXIgcHJldmlldy48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YXN1YnRleHRcIj5UbyBzZWUgeW91ciBwcmV2aWV3LCBwbGVhc2UgYWRkIGF0IGxlYXN0IG9uZSBwYW5lbC48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBJbmZvIENhcmRzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyBwYW5lbEFycmF5Lmxlbmd0aCB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5ObyBvZiBQYW5lbHM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpPy52YWx1ZSB9fSB4XHJcbiAgICAgICAgICAgIHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLmxlbmd0aFwiKT8udmFsdWUgfX1cclxuICAgICAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX1cclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlLXNrZWxldG9uXCIgKm5nSWY9XCJpc1BhZ2VMb2FkaW5nXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjwhLS0gQ29tbW9uIGRpbWVuc2lvbiBhcnJvd3MgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZGltZW5zaW9uQXJyb3dzIGxldC1sYWJlbD1cImxhYmVsXCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cclxuICA8ZGl2IGNsYXNzPVwiaG9yaXpvbnRhbC1kaW1lbnNpb25cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBsZWZ0XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInZhbHVlXCI+e3sgdmFsdWUgfX0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyByaWdodFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
605
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUlMLFVBQVUsRUFDVixXQUFXLEVBQ1gsbUJBQW1CLEdBQ3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsa0JBQWtCLEVBRWxCLFVBQVUsR0FDWCxNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixjQUFjLEVBQ2QsR0FBRyxFQUNILE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7QUFRZCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMxRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUVwRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUUzRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFD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O3dCQUNuQixZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsa0JBQWtCO3dCQUNsQix1QkFBdUI7d0JBQ3ZCLFVBQVU7cUJBQ1giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtR3JvdXAsXHJcbiAgRm9ybUFycmF5LFxyXG4gIFZhbGlkYXRvcnMsXHJcbiAgRm9ybXNNb2R1bGUsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciwgUm91dGVyTGluayB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHtcclxuICBOZ2JBY2NvcmRpb25Nb2R1bGUsXHJcbiAgTmdiTW9kYWwsXHJcbiAgTmdiVG9vbHRpcCxcclxufSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHtcclxuICBkZWJvdW5jZVRpbWUsXHJcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXHJcbiAgZmlsdGVyLFxyXG4gIGZpcnN0VmFsdWVGcm9tLFxyXG4gIG1hcCxcclxuICBTdWJqZWN0LFxyXG4gIHRha2VVbnRpbCxcclxufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZVwiO1xyXG5pbXBvcnQge1xyXG4gIEZpeHR1cmVMaWJyYXJ5RGV0YWlscyxcclxuICBGaXh0dXJlTGlicmFyeVNoZWxmQ29uZmlnLFxyXG59IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL2ZpeHR1cmUtbGlicmFyeS5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3BsYW5vLWdlbmVyYWwuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IENvbXBsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4uL3BvcHVwcy9jb21wbGV0ZS1jb25maXJtYXRpb24vY29tcGxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vcG9wdXBzL2RlbGV0ZS1jb25maXJtYXRpb24vZGVsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRXhpdENvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9wb3B1cHMvZXhpdC1jb25maXJtYXRpb24vZXhpdC1jb25maXJtYXRpb24uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENhbkV4aXRHdWFyZCB9IGZyb20gXCIuLi8uLi9mdW5jdGlvbnMvZXhpdC5ndWFyZFwiO1xyXG5pbXBvcnQgeyBDYW5ub3RQZXJmb3JtQ29tcG9uZW50IH0gZnJvbSBcIi4uL3BvcHVwcy9jYW5ub3QtcGVyZm9ybS9jYW5ub3QtcGVyZm9ybS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlLCBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLWdsb2JhbFwiO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IFRpbWVBZ29QaXBlIH0gZnJvbSBcIi4uLy4uL3BpcGVzL3RpbWUtYWdvLnBpcGVcIjtcclxuaW1wb3J0IHsgQ291bnRlcklucHV0Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NvdW50ZXItaW5wdXQvY291bnRlci1pbnB1dC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgZ2VuZXJhbFZhbGlkYXRvciB9IGZyb20gXCIuLi8uLi9mdW5jdGlvbnMvcGxhbm8uZnVuY3Rpb25cIjtcclxuaW1wb3J0IHsgV0FMTF9aT05FUywgRkxPT1JfWk9ORVMgfSBmcm9tIFwiLi4vLi4vZGF0YS9maXh0dXJlLXRlbXBsYXRlLmRhdGFcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi1jcmVhdGUtZml4dHVyZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL2NyZWF0ZS1maXh0dXJlLmNvbXBvbmVudC5zY3NzXCIsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb3VudGVySW5wdXRDb21wb25lbnQsXHJcbiAgICBOZ2JUb29sdGlwLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgVGltZUFnb1BpcGUsXHJcbiAgICBOZ2JBY2NvcmRpb25Nb2R1bGUsXHJcbiAgICBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCxcclxuICAgIFJvdXRlckxpbmssXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENyZWF0ZUZpeHR1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ2FuRXhpdEd1YXJkIHtcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG5cclxuICB3YWxsRml4dHVyZUZvcm06IEZvcm1Hcm91cDtcclxuICBmbG9vckZpeHR1cmVGb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGlzUGFnZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBmaXh0dXJlRGV0YWlsczogRml4dHVyZUxpYnJhcnlEZXRhaWxzID0ge307XHJcbiAgaXNFZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpc0hlYWRlckVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzRm9vdGVyRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNCb2R5RW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNhbkdvQmFjazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICByZWFkb25seSBzaGVsZlR5cGVzOiBEcm9wZG93bklGW10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIlNoZWxmXCIsIHZhbHVlOiBcInNoZWxmXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiVHJheVwiLCB2YWx1ZTogXCJ0cmF5XCIgfSxcclxuICAgIHsgbGFiZWw6IFwiVk0gT25seVwiLCB2YWx1ZTogXCJ2bW9ubHlcIiB9LFxyXG4gIF07XHJcblxyXG4gIHJlYWRvbmx5IHdhbGxab25lczogRHJvcGRvd25JRltdID0gV0FMTF9aT05FUztcclxuICByZWFkb25seSBmbG9vclpvbmVzOiBEcm9wZG93bklGW10gPSBGTE9PUl9aT05FUztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgc3RvcmVCdWlsZGVyU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIG5nYk1vZGFsOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgcGFnZUluZm86IFBhZ2VJbmZvU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpO1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCA9IHBhcmFtc1tcImZpeHR1cmVJZFwiXSA/PyBcIlwiO1xyXG5cclxuICAgIHRoaXMuaXNFZGl0TW9kZSA9IHBhcmFtc1tcImlzRWRpdFwiXSA9PSBcInRydWVcIjtcclxuXHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuX2lkKSB7XHJcbiAgICAgIHRoaXMuY2FuR29CYWNrID0gdHJ1ZTtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL21hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiXSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdldENsaWVudElkKCk7XHJcblxyXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHBhcmFtcykgPT4gcGFyYW1zW1wiZml4dHVyZUlkXCJdKSxcclxuICAgICAgICBmaWx0ZXIoKGlkKSA9PiAhIWlkKSxcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIChpZCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5nZXRGaXh0dXJlTGlicmFyeURldGFpbHMoaWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldGFpbHMgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgaWYgKGRldGFpbHMpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzID0ge1xyXG4gICAgICAgICAgICAgICAgLi4uZGV0YWlscyxcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcclxuICAgICAgICAgICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLmNhbkdvQmFjayA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgICAgICAgIGVycj8uZXJyb3I/LmVycm9yID8/IFwiRmFpbGVkIHRvIGZldGNoIGZpeHR1cmUgZGV0YWlsc1wiLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gdGhpcy5pc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiQ3JlYXRlIEZpeHR1cmVcIik7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldEJyZWFkY3J1bWJzKFtcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlBsYW5vZ3JhbVwiLFxyXG4gICAgICAgIHBhdGg6IFwiL21hbmFnZS9wbGFub2dyYW0vbWFuYWdlLXBsYW5vZ3JhbXNcIixcclxuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgaXNTZXBhcmF0b3I6IGZhbHNlLFxyXG4gICAgICB9LFxyXG4gICAgICB7IHRpdGxlOiBcIlwiLCBwYXRoOiBcIlwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogXCJMaWJyYXJ5XCIsXHJcbiAgICAgICAgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9saWJyYXJ5L2ZpeHR1cmVzXCIsXHJcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VwYXJhdG9yOiBmYWxzZSxcclxuICAgICAgfSxcclxuICAgICAgeyB0aXRsZTogXCJcIiwgcGF0aDogXCJcIiwgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogdHJ1ZSB9LFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBnZXRDbGllbnRJZCgpIHtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCAvLyBTdWJzY3JpcHRpb24gd2lsbCBiZSBjYW5jZWxsZWQgb24gY29tcG9uZW50IGRlc3Ryb3kuXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksIC8vIFRvIGF2b2lkIGltbWVkaWF0ZSBmcmVxdWVudCBjYWxscy5cclxuICAgICAgICBmaWx0ZXIoKGRhdGEpID0+ICEhZGF0YSksIC8vIEZpbHRlcmluZyBudWxsL3VuZGVmaW5lZC5cclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCAvLyBFbWl0dGluZyBvbmx5IGRpZmZlcmVudCB2YWx1ZXMuIChJZ25vcmVzIHNhbWUgY2xpZW50SWQpLlxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZUZvcm0oKSB7XHJcbiAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCIpIHtcclxuICAgICAgdGhpcy5pbml0V2FsbEZpeHR1cmVGb3JtKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRGbG9vclBhbmVsRml4dHVyZUZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlKSB7XHJcbiAgICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5oZWFkZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uKFwiaGVhZGVyXCIpO1xyXG4gICAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuZm9vdGVyPy5pc0VuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbihcImZvb3RlclwiKTtcclxuICAgICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmlzQm9keUVuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbihcImJvZHlcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLndhbGxGaXh0dXJlRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblxyXG4gICAgICB0aGlzLmlzSGVhZGVyRW5hYmxlZCA9IHRoaXMuZml4dHVyZURldGFpbHMuaGVhZGVyPy5pc0VuYWJsZWQgPz8gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNCb2R5RW5hYmxlZCA9IHRoaXMuZml4dHVyZURldGFpbHMuaXNCb2R5RW5hYmxlZCA/PyBmYWxzZTtcclxuICAgICAgdGhpcy5pc0Zvb3RlckVuYWJsZWQgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmZvb3Rlcj8uaXNFbmFibGVkID8/IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybSgpIHtcclxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSBcIndhbGxcIlxyXG4gICAgICA/IHRoaXMud2FsbEZpeHR1cmVGb3JtXHJcbiAgICAgIDogdGhpcy5mbG9vckZpeHR1cmVGb3JtO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNoZWxmQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLndhbGxGaXh0dXJlRm9ybS5nZXQoXCJib2R5LnNoZWxmXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCBwYW5lbEFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5mbG9vckZpeHR1cmVGb3JtLmdldChcInBhbmVsXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbFByb2R1Y3RDYXBhY2l0eSgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgZm9ybUFycmF5ID1cclxuICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCJcclxuICAgICAgICA/IHRoaXMuc2hlbGZBcnJheVxyXG4gICAgICAgIDogdGhpcy5wYW5lbEFycmF5O1xyXG5cclxuICAgIHJldHVybiBmb3JtQXJyYXkuY29udHJvbHMucmVkdWNlKCh0b3RhbCwgaXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCBjb3VudCA9IGl0ZW0uZ2V0KFwicHJvZHVjdENhcGFjaXR5XCIpPy52YWx1ZSB8fCAwO1xyXG4gICAgICBjb25zdCBpc1RyYXkgPSBpdGVtLmdldChcInR5cGVcIik/LnZhbHVlID09PSBcInRyYXlcIjtcclxuICAgICAgY29uc3Qgcm93cyA9IGl0ZW0uZ2V0KFwibm9PZlJvd3NcIik/LnZhbHVlIHx8IDE7XHJcblxyXG4gICAgICAvLyBJZiB0aGUgZml4dHVyZSBpcyBhIGZsb29yIHBhbmVsIG9yIHRyYXksIHdlIG5lZWQgdG8gbXVsdGlwbHkgdGhlIHByb2R1Y3QgY2FwYWNpdHkgYnkgdGhlIG51bWJlciBvZiByb3dzXHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdG90YWwgK1xyXG4gICAgICAgIChpc1RyYXkgfHwgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gXCJmbG9vclwiXHJcbiAgICAgICAgICA/IGNvdW50ICogcm93c1xyXG4gICAgICAgICAgOiBjb3VudClcclxuICAgICAgKTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgaW5pdFdhbGxGaXh0dXJlRm9ybSgpIHtcclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGJhc2ljRGV0YWlsczogdGhpcy5nZXRCYXNpY0RldGFpbHNGb3JtR3JvdXAoKSxcclxuICAgICAgaGVhZGVyOiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBoZWlnaHQ6IFt0aGlzLmZpeHR1cmVEZXRhaWxzPy5oZWFkZXI/LmhlaWdodD8udmFsdWUgPz8gMzAwXSxcclxuICAgICAgfSksXHJcbiAgICAgIGJvZHk6IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIHNoZWxmOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgfSksXHJcbiAgICAgIGZvb3RlcjogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgaGVpZ2h0OiBbdGhpcy5maXh0dXJlRGV0YWlscz8uZm9vdGVyPy5oZWlnaHQ/LnZhbHVlID8/IDMwMF0sXHJcbiAgICAgIH0pLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5maXh0dXJlRGV0YWlscy5zaGVsZkNvbmZpZz8uZm9yRWFjaCgocykgPT4gdGhpcy5hZGRTaGVsZihzKSk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5sZW5ndGggPT09IDAgJiZcclxuICAgICAgIXRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5XHJcbiAgICApIHtcclxuICAgICAgdGhpcy5hZGRTaGVsZigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtXHJcbiAgICAgIC5nZXQoXCJiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5XCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeSA9IHZhbHVlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybVxyXG4gICAgICAuZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgpIHtcclxuICAgICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGluaXRGbG9vclBhbmVsRml4dHVyZUZvcm0oKSB7XHJcbiAgICB0aGlzLmZsb29yRml4dHVyZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYmFzaWNEZXRhaWxzOiB0aGlzLmdldEJhc2ljRGV0YWlsc0Zvcm1Hcm91cCgpLFxyXG4gICAgICBwYW5lbDogdGhpcy5mYi5hcnJheShbXSksXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5mb3JFYWNoKChzKSA9PiB0aGlzLmFkZFBhbmVsKHMpKTtcclxuXHJcbiAgICB0aGlzLmZsb29yRml4dHVyZUZvcm1cclxuICAgICAgLmdldChcImJhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnlcIilcclxuICAgICAgPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybVxyXG4gICAgICAuZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgpIHtcclxuICAgICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEJhc2ljRGV0YWlsc0Zvcm1Hcm91cCgpIHtcclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgZml4dHVyZUNhdGVnb3J5OiBbXHJcbiAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscz8uZml4dHVyZUNhdGVnb3J5IHx8IFwiVW50aXRsZWRcIixcclxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZ2VuZXJhbFZhbGlkYXRvcigpXSxcclxuICAgICAgXSxcclxuICAgICAgd2lkdGg6IFtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzPy5maXh0dXJlV2lkdGg/LnZhbHVlID8/IDYsXHJcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDAuNSldLFxyXG4gICAgICBdLFxyXG4gICAgICBsZW5ndGg6IFtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy52YWx1ZSA/PyAxMixcclxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMC41KV0sXHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFkZFNoZWxmKHNoZWxmPzogYW55KSB7XHJcbiAgICBjb25zdCBzaGVsZkdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHR5cGU6IFtzaGVsZj8uc2hlbGZUeXBlID8/IFwic2hlbGZcIl0sXHJcbiAgICAgIHByb2R1Y3RDYXBhY2l0eTogW3NoZWxmPy5wcm9kdWN0UGVyU2hlbGYgPz8gNl0sXHJcbiAgICAgIG5vT2ZSb3dzOiBbc2hlbGY/LnRyYXlSb3dzID8/IDFdLFxyXG4gICAgICB6b25lOiBbc2hlbGY/LnpvbmUgPz8gbnVsbF0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMudXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKFxyXG4gICAgICBzaGVsZkdyb3VwLFxyXG4gICAgICBzaGVsZkdyb3VwLmdldChcInR5cGVcIik/LnZhbHVlLFxyXG4gICAgKTtcclxuICAgIHRoaXMuc2V0dXBTaGVsZlR5cGVMaXN0ZW5lcihzaGVsZkdyb3VwKTtcclxuICAgIHRoaXMuc2hlbGZBcnJheS5wdXNoKHNoZWxmR3JvdXApO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKHNoZWxmR3JvdXA6IEZvcm1Hcm91cCwgc2hlbGZUeXBlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHByb2R1Y3RQZXJTaGVsZkNvbnRyb2wgPSBzaGVsZkdyb3VwLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKTtcclxuICAgIGNvbnN0IG1pblZhbHVlID0gc2hlbGZUeXBlID09PSBcInZtb25seVwiID8gMCA6IDE7XHJcblxyXG4gICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5taW4obWluVmFsdWUpXSk7XHJcbiAgICBwcm9kdWN0UGVyU2hlbGZDb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIC8vICB3ZSBuZWVkIHRvIHNldHVwIGEgbGlzdGVuZXIgdG8gdGhlIHR5cGUgb2YgdGhlIHNoZWxmIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBub09mUm93cyBmaWVsZFxyXG4gIHNldHVwU2hlbGZUeXBlTGlzdGVuZXIoc2hlbGZHcm91cDogRm9ybUdyb3VwKSB7XHJcbiAgICBsZXQgcHJldmlvdXNUeXBlID0gc2hlbGZHcm91cC5nZXQoXCJ0eXBlXCIpPy52YWx1ZTtcclxuICAgIHNoZWxmR3JvdXAuZ2V0KFwidHlwZVwiKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodHlwZSkgPT4ge1xyXG4gICAgICBjb25zdCBwcm9kdWN0UGVyU2hlbGZDb250cm9sID0gc2hlbGZHcm91cC5nZXQoXCJwcm9kdWN0Q2FwYWNpdHlcIik7XHJcbiAgICAgIGlmICh0eXBlID09PSBcInZtb25seVwiKSB7XHJcbiAgICAgICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsdWUoMCk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNUeXBlID09PSBcInZtb25seVwiKSB7XHJcbiAgICAgICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsdWUoMSk7XHJcbiAgICAgIH1cclxuICAgICAgcHJldmlvdXNUeXBlID0gdHlwZTtcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKHNoZWxmR3JvdXAsIHR5cGUpO1xyXG4gICAgICBjb25zdCBub09mUm93c0NvbnRyb2wgPSBzaGVsZkdyb3VwLmdldChcIm5vT2ZSb3dzXCIpO1xyXG4gICAgICBpZiAodHlwZSA9PT0gXCJ0cmF5XCIpIHtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbGlkYXRvcnMoW1xyXG4gICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgIFZhbGlkYXRvcnMubWluKDEpLFxyXG4gICAgICAgIF0pO1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uc2V0VmFsdWUoMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbm9PZlJvd3NDb250cm9sPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIG5vT2ZSb3dzQ29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBJZiBpbmRleCBpcyBub3QgZ2l2ZW4sIGxhc3Qgc2hlbGYgc2hvdWxkIGJlIHJlbW92ZWRcclxuICByZW1vdmVTaGVsZihpbmRleDogbnVtYmVyID0gdGhpcy5zaGVsZkFycmF5LmNvbnRyb2xzLmxlbmd0aCAtIDEpIHtcclxuICAgIGlmICh0aGlzLnNoZWxmQXJyYXkuY29udHJvbHMubGVuZ3RoID09IDEpIHJldHVybjtcclxuICAgIHRoaXMuc2hlbGZBcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgfVxyXG5cclxuICBhZGRQYW5lbChwYW5lbD86IEZpeHR1cmVMaWJyYXJ5U2hlbGZDb25maWcpIHtcclxuICAgIGNvbnN0IHBhbmVsR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcGFuZWxOYW1lOiBbcGFuZWw/LmxhYmVsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZ2VuZXJhbFZhbGlkYXRvcigpXV0sXHJcbiAgICAgIHByb2R1Y3RDYXBhY2l0eTogW1xyXG4gICAgICAgIHBhbmVsPy5wcm9kdWN0UGVyU2hlbGYgPz8gNixcclxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMCldLFxyXG4gICAgICBdLFxyXG4gICAgICBub09mUm93czogW1xyXG4gICAgICAgIHBhbmVsPy50cmF5Um93cyA/PyA1LFxyXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV0sXHJcbiAgICAgIF0sXHJcbiAgICAgIHpvbmU6IFsocGFuZWwgYXMgYW55KT8uem9uZSA/PyBcIkFsbFwiXSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucGFuZWxBcnJheS5wdXNoKHBhbmVsR3JvdXApO1xyXG4gIH1cclxuXHJcbiAgYXV0b0Fzc2lnbldhbGxab25lcygpIHtcclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSByZXR1cm47XHJcbiAgICBjb25zdCBzaGVsZkNvdW50ID0gdGhpcy5zaGVsZkFycmF5LmNvbnRyb2xzLmxlbmd0aDtcclxuICAgIGlmIChzaGVsZkNvdW50ID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc2hlbHZlc1BlclpvbmUgPSBNYXRoLmZsb29yKHNoZWxmQ291bnQgLyAzKTtcclxuICAgIGNvbnN0IHJlbWFpbmRlciA9IHNoZWxmQ291bnQgJSAzO1xyXG4gICAgY29uc3QgdG9wQ291bnQgPSBzaGVsdmVzUGVyWm9uZSArIChyZW1haW5kZXIgPj0gMSA/IDEgOiAwKTtcclxuICAgIGNvbnN0IG1pZENvdW50ID0gc2hlbHZlc1BlclpvbmUgKyAocmVtYWluZGVyID49IDIgPyAxIDogMCk7XHJcblxyXG4gICAgdGhpcy5zaGVsZkFycmF5LmNvbnRyb2xzLmZvckVhY2goKHNoZWxmLCBpbmRleCkgPT4ge1xyXG4gICAgICBsZXQgem9uZTogc3RyaW5nO1xyXG4gICAgICBpZiAoaW5kZXggPCB0b3BDb3VudCkgem9uZSA9IFwiVG9wXCI7XHJcbiAgICAgIGVsc2UgaWYgKGluZGV4IDwgdG9wQ291bnQgKyBtaWRDb3VudCkgem9uZSA9IFwiTWlkXCI7XHJcbiAgICAgIGVsc2Ugem9uZSA9IFwiQm90dG9tXCI7XHJcbiAgICAgIHNoZWxmLmdldChcInpvbmVcIik/LnNldFZhbHVlKHpvbmUpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gSWYgaW5kZXggaXMgbm90IGdpdmVuLCBsYXN0IHBhbmVsIHNob3VsZCBiZSByZW1vdmVkXHJcbiAgcmVtb3ZlUGFuZWwoaW5kZXg6IG51bWJlciA9IHRoaXMucGFuZWxBcnJheS5jb250cm9scy5sZW5ndGggLSAxKSB7XHJcbiAgICBpZiAodGhpcy5wYW5lbEFycmF5LmNvbnRyb2xzLmxlbmd0aCA9PSAxKSByZXR1cm47XHJcbiAgICB0aGlzLnBhbmVsQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VjdGlvbihzZWN0aW9uOiBcImhlYWRlclwiIHwgXCJib2R5XCIgfCBcImZvb3RlclwiKSB7XHJcbiAgICB0aGlzLnRvZ2dsZVNlY3Rpb25Gb3JtKHNlY3Rpb24pO1xyXG4gICAgdGhpcy50b2dnbGVTZWN0aW9uQ2hlY2tCb3goc2VjdGlvbik7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWN0aW9uRm9ybShzZWN0aW9uOiBcImhlYWRlclwiIHwgXCJib2R5XCIgfCBcImZvb3RlclwiKSB7XHJcbiAgICBjb25zdCBmb3JtID0gdGhpcy5nZXRGb3JtKCk7XHJcbiAgICBjb25zdCBncm91cCA9IGZvcm0uZ2V0KHNlY3Rpb24pO1xyXG4gICAgaWYgKGdyb3VwKSB7XHJcbiAgICAgIGdyb3VwLmVuYWJsZWRcclxuICAgICAgICA/IGdyb3VwLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgICAgICAgOiBncm91cC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VjdGlvbkNoZWNrQm94KHNlY3Rpb246IFwiaGVhZGVyXCIgfCBcImJvZHlcIiB8IFwiZm9vdGVyXCIpIHtcclxuICAgIHN3aXRjaCAoc2VjdGlvbikge1xyXG4gICAgICBjYXNlIFwiaGVhZGVyXCI6XHJcbiAgICAgICAgdGhpcy5pc0hlYWRlckVuYWJsZWQgPSAhdGhpcy5pc0hlYWRlckVuYWJsZWQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJib2R5XCI6XHJcbiAgICAgICAgdGhpcy5pc0JvZHlFbmFibGVkID0gIXRoaXMuaXNCb2R5RW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImZvb3RlclwiOlxyXG4gICAgICAgIHRoaXMuaXNGb290ZXJFbmFibGVkID0gIXRoaXMuaXNGb290ZXJFbmFibGVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWFwRm9ybVRvQXBpKGZvcm06IEZvcm1Hcm91cCwgc3RhdHVzOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgY29uc3QgZm9ybVZhbHVlID0gZm9ybS52YWx1ZTtcclxuICAgIGNvbnN0IGZvcm1BcnJheSA9XHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09IFwid2FsbFwiXHJcbiAgICAgICAgPyB0aGlzLnNoZWxmQXJyYXlcclxuICAgICAgICA6IHRoaXMucGFuZWxBcnJheTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIGZpeHR1cmVDYXRlZ29yeTogdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnksXHJcbiAgICAgIGZpeHR1cmVDYXBhY2l0eTogdGhpcy50b3RhbFByb2R1Y3RDYXBhY2l0eSxcclxuICAgICAgZml4dHVyZUxlbmd0aDoge1xyXG4gICAgICAgIHZhbHVlOiBmb3JtVmFsdWUuYmFzaWNEZXRhaWxzLmxlbmd0aCxcclxuICAgICAgICB1bml0OiBcImZ0XCIsXHJcbiAgICAgIH0sXHJcbiAgICAgIGZpeHR1cmVXaWR0aDoge1xyXG4gICAgICAgIHZhbHVlOiBmb3JtVmFsdWUuYmFzaWNEZXRhaWxzLndpZHRoLFxyXG4gICAgICAgIHVuaXQ6IFwiZnRcIixcclxuICAgICAgfSxcclxuICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgaGVpZ2h0OiB7XHJcbiAgICAgICAgICB2YWx1ZTogZm9ybS5nZXQoXCJoZWFkZXIuaGVpZ2h0XCIpPy52YWx1ZSxcclxuICAgICAgICAgIHVuaXQ6IFwibW1cIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxhYmVsOiBcIlwiLFxyXG4gICAgICAgIGlzRW5hYmxlZDogIWZvcm0uZ2V0KFwiaGVhZGVyXCIpPy5kaXNhYmxlZCxcclxuICAgICAgfSxcclxuICAgICAgZm9vdGVyOiB7XHJcbiAgICAgICAgaGVpZ2h0OiB7XHJcbiAgICAgICAgICB2YWx1ZTogZm9ybS5nZXQoXCJmb290ZXIuaGVpZ2h0XCIpPy52YWx1ZSxcclxuICAgICAgICAgIHVuaXQ6IFwibW1cIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGxhYmVsOiBcIlwiLFxyXG4gICAgICAgIGlzRW5hYmxlZDogIWZvcm0uZ2V0KFwiZm9vdGVyXCIpPy5kaXNhYmxlZCxcclxuICAgICAgfSxcclxuICAgICAgaXNCb2R5RW5hYmxlZDogIWZvcm0uZ2V0KFwiYm9keVwiKT8uZGlzYWJsZWQsXHJcbiAgICAgIHNoZWxmQ29uZmlnOiBmb3JtQXJyYXkuY29udHJvbHMubWFwKChlLCBpKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHNoZWxmTnVtYmVyOiBpICsgMSxcclxuICAgICAgICAgIHNoZWxmVHlwZTogZT8udmFsdWU/LnR5cGUgPz8gXCJ0cmF5XCIsXHJcbiAgICAgICAgICBwcm9kdWN0UGVyU2hlbGY6IGUudmFsdWUucHJvZHVjdENhcGFjaXR5LFxyXG4gICAgICAgICAgdHJheVJvd3M6IGU/LnZhbHVlPy5ub09mUm93cyA/PyAxLFxyXG4gICAgICAgICAgbGFiZWw6IGU/LnZhbHVlPy5wYW5lbE5hbWUgPz8gXCJcIixcclxuICAgICAgICAgIHpvbmU6IGU/LnZhbHVlPy56b25lID8/IG51bGwsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdWJtaXQoc3RhdHVzOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldEZvcm0oKTtcclxuXHJcbiAgICAgIGlmIChmb3JtLmludmFsaWQpIHtcclxuICAgICAgICBmb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXCJGb3JtIGlzIGludmFsaWRcIik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc3RhdHVzID09PSBcImNvbXBsZXRlXCIpIHtcclxuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPVxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gXCJ3YWxsXCJcclxuICAgICAgICAgICAgPyB0aGlzLnNoZWxmQXJyYXlcclxuICAgICAgICAgICAgOiB0aGlzLnBhbmVsQXJyYXk7XHJcbiAgICAgICAgY29uc3QgbWlzc2luZ1pvbmUgPSBmb3JtQXJyYXkuY29udHJvbHMuc29tZSgoYykgPT4gIWMudmFsdWUuem9uZSk7XHJcbiAgICAgICAgaWYgKG1pc3Npbmdab25lKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgIFwiRWFjaCBzaGVsZiBtdXN0IGhhdmUgYSB6b25lIGJlZm9yZSBjb21wbGV0aW5nLlwiLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuY29uZmlybUNvbXBsZXRpb24oKSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdHJhbnNmb3JtZWREYXRhID0gdGhpcy5tYXBGb3JtVG9BcGkoZm9ybSwgc3RhdHVzKTtcclxuXHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVMaWJyYXJ5KFxyXG4gICAgICAgICAgdHJhbnNmb3JtZWREYXRhLFxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlRGV0YWlscz8uX2lkISxcclxuICAgICAgICApLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHJlcyAmJiByZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnN0YXR1cyA9IHN0YXR1cztcclxuICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChyZXMubWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5jYW5Hb0JhY2sgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIm1hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiXSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChcclxuICAgICAgICBlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBzYXZlIEZpeHR1cmUgZGV0YWlsc1wiLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gdXBkYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVMaWJyYXJ5KHRyYW5zZm9ybWVkRGF0YSwgdGhpcy5maXh0dXJlRGV0YWlscz8uX2lkISkuc3Vic2NyaWJlKHtcclxuICAgIC8vICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAvLyAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnc3VjY2VzcycpIHtcclxuICAgIC8vICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgLy8gICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydtYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXMnXSk7XHJcbiAgICAvLyAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAvLyAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yID8/IFwiRmFpbGVkIHRvIHNhdmUgRml4dHVyZSBkZXRhaWxzXCIpO1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwiQEAgfiB1cGRhdGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycik7XHJcbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FuRGVhY3RpdmF0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLmNhbkdvQmFjaykgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybSgpO1xyXG5cclxuICAgIGlmIChmb3JtLmRpcnR5KSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybUV4aXQoKTtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5vblN1Ym1pdChcImRyYWZ0XCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1FeGl0KCk6IFByb21pc2U8Ym9vbGVhbiB8IG51bGw+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKEV4aXRDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09IFwib2tcIik7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1Db21wbGV0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ29tcGxldGVDb25maXJtYXRpb25Db21wb25lbnQsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gXCJDb21wbGV0ZSBmaXh0dXJlXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgIFwiRml4dHVyZSBpcyBub3cgcmVhZHkgYW5kIGF2YWlsYWJsZSB0byBjcmVhdGUgYXMgdGVtcGxhdGUuXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5ub3RlID1cclxuICAgICAgXCJZb3UgY2FuJ3QgZWRpdCBpdCBvbmNlIGFzc2lnbmVkIHRvIHRoZSB0ZW1wbGF0ZS5cIjtcclxuXHJcbiAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSBcIm9rXCIpO1xyXG4gIH1cclxuXHJcbiAgb25EdXBsaWNhdGUoKSB7XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmR1cGxpY2F0ZUZpeHR1cmVMaWJyYXJ5KHtcclxuICAgICAgICBmaXh0dXJlSWQ6IHRoaXMuZml4dHVyZURldGFpbHMuX2lkLFxyXG4gICAgICB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLmRhdGEubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuR29CYWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL21hbmFnZS9wbGFub2dyYW0vY3JlYXRlLWxpYnJhcnktZml4dHVyZVwiXSwge1xyXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGZpeHR1cmVJZDogcmVzPy5kYXRhPy5pZCB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgICAgIGVycj8uZXJyb3I/LmVycm9yIHx8IFwiRmFpbGVkIHRvIGR1cGxpY2F0ZSBGaXh0dXJlXCIsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJAQCB+IGR1cGxpY2F0ZUZpeHR1cmVMaWJyYXJ5IGVycjpcIiwgZXJyKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNvbmZpcm1EZWxldGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBcIkRlbGV0ZSBmaXh0dXJlXCI7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XHJcbiAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGZpeHR1cmUgP1wiO1xyXG5cclxuICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09IFwib2tcIik7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkRlbGV0ZSgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLnRlbXBsYXRlSWQpIHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ2Fubm90UGVyZm9ybUNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBgQ2Fu4oCZdCBkZWxldGUgZml4dHVyZSFgO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9IGBTaW5jZSB0aGlzIGZpeHR1cmUgaXMgbGl2ZSBpbiBcIiR7dGhpcy5maXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkfSB0ZW1wbGF0ZXMsXCIgZGVsZXRpbmcgaXMgbm90IGFsbG93ZWQuYDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghKGF3YWl0IHRoaXMuY29uZmlybURlbGV0aW9uKCkpKSByZXR1cm47XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2VcclxuICAgICAgLmRlbGV0ZUZpeHR1cmVMaWJyYXJ5KHsgZml4dHVyZUlkOiB0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIm1hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgICAgICBlcnI/LmVycm9yPy5lcnJvciB8fCBcIkZhaWxlZCB0byBkZWxldGUgRml4dHVyZVwiLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBkZWxldGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrRWRpdCgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLnRlbXBsYXRlSWQpIHtcclxuICAgICAgY29uc3QgbW9kZWxSZWYgPSB0aGlzLm5nYk1vZGFsLm9wZW4oQ2Fubm90UGVyZm9ybUNvbXBvbmVudCwge1xyXG4gICAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSBgQ2Fu4oCZdCBlZGl0IGZpeHR1cmUhYDtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSBgU2luY2UgdGhpcyBmaXh0dXJlIGlzIGxpdmUgaW4gXCIke3RoaXMuZml4dHVyZURldGFpbHMudGVtcGxhdGVJZH0gdGVtcGxhdGVzLFwiIGVkaXRpbmcgaXMgbm90IGFsbG93ZWQuYDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNFZGl0TW9kZSA9IHRydWU7XHJcbiAgICB0aGlzLmZsb29yRml4dHVyZUZvcm0/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuaGVhZGVyPy5pc0VuYWJsZWQpXHJcbiAgICAgIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oXCJoZWFkZXJcIik7XHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuZm9vdGVyPy5pc0VuYWJsZWQpXHJcbiAgICAgIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oXCJmb290ZXJcIik7XHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuaXNCb2R5RW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uRm9ybShcImJvZHlcIik7XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcclxuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcclxuICAgICAgcXVlcnlQYXJhbXM6IHsgaXNFZGl0OiB0cnVlIH0sXHJcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlXCIgKm5nSWY9XCIhaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDwhLS0gSGVhZGVyIHNlY3Rpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50cy1jZW50ZXIgZ2FwLTVcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcC0zXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXNcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuODMzNCA5Ljk5OTg0SDQuMTY2NzVNNC4xNjY3NSA5Ljk5OTg0TDEwLjAwMDEgMTUuODMzMk00LjE2Njc1IDkuOTk5ODRMMTAuMDAwMSA0LjE2NjVcIlxyXG4gICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8aDIgY2xhc3M9XCJtLTAgZWxsaXBzaXNcIiBzdHlsZT1cIm1heC13aWR0aDogY2FsYygxMDB2dyAtIDg2MHB4KVwiXHJcbiAgICAgICAgW25nYlRvb2x0aXBdPVwiZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ICsgJyAtICcgKyBmaXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGg/LnZhbHVlICsgJ2Z0J1wiPlxyXG4gICAgICAgIHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeSB9fSAtIHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udmFsdWUgfX1cclxuICAgICAgICB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgIDwvaDI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZSBkcmFmdFwiPnt7IGZpeHR1cmVEZXRhaWxzLnN0YXR1cyB8IHRpdGxlY2FzZSB9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnRzLWNlbnRlciBnYXAtNVwiPlxyXG4gICAgICA8cCBjbGFzcz1cIm0tMCB0ZXh0LW5vd3JhcFwiICpuZ0lmPVwiZml4dHVyZURldGFpbHM/LnVwZGF0ZWRBdFwiXHJcbiAgICAgICAgW25nYlRvb2x0aXBdPVwiZml4dHVyZURldGFpbHMudXBkYXRlZEF0IHwgZGF0ZSA6ICdtZWRpdW0nXCI+XHJcbiAgICAgICAgTGFzdCB1cGRhdGU6IHt7IGZpeHR1cmVEZXRhaWxzLnVwZGF0ZWRBdCB8IHRpbWVBZ28gfX1cclxuICAgICAgPC9wPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCIgKGNsaWNrKT1cIm9uQ2xpY2tFZGl0KClcIj5cclxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzEzMjJfNTMyNSlcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xNC4xNjY3IDIuNDk5OTNDMTQuMzg1NiAyLjI4MTA2IDE0LjY0NTUgMi4xMDc0NCAxNC45MzE0IDEuOTg4OTlDMTUuMjE3NCAxLjg3MDU0IDE1LjUyMzkgMS44MDk1NyAxNS44MzM0IDEuODA5NTdDMTYuMTQyOSAxLjgwOTU3IDE2LjQ0OTQgMS44NzA1NCAxNi43MzU0IDEuOTg4OTlDMTcuMDIxNCAyLjEwNzQ0IDE3LjI4MTIgMi4yODEwNiAxNy41MDAxIDIuNDk5OTNDMTcuNzE5IDIuNzE4OCAxNy44OTI2IDIuOTc4NjMgMTguMDExIDMuMjY0NkMxOC4xMjk1IDMuNTUwNTcgMTguMTkwNCAzLjg1NzA2IDE4LjE5MDQgNC4xNjY1OUMxOC4xOTA0IDQuNDc2MTIgMTguMTI5NSA0Ljc4MjYyIDE4LjAxMSA1LjA2ODU5QzE3Ljg5MjYgNS4zNTQ1NSAxNy43MTkgNS42MTQzOSAxNy41MDAxIDUuODMzMjZMNi4yNTAwOCAxNy4wODMzTDEuNjY2NzUgMTguMzMzM0wyLjkxNjc1IDEzLjc0OTlMMTQuMTY2NyAyLjQ5OTkzWlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTMyMl81MzI1XCI+XHJcbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgRWRpdFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJpc0VkaXRNb2RlXCIgY2xhc3M9XCJkLWZsZXggZ2FwLTUganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvblN1Ym1pdCgnZHJhZnQnKVwiPlNhdmUgYXMgZHJhZnQ8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJvblN1Ym1pdCgnY29tcGxldGUnKVwiPkNvbXBsZXRlPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscz8uX2lkXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBwLTNcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSAxMkMxMSAxMi41NTIzIDExLjQ0NzcgMTMgMTIgMTNDMTIuNTUyMyAxMyAxMyAxMi41NTIzIDEzIDEyQzEzIDExLjQ0NzcgMTIuNTUyMyAxMSAxMiAxMUMxMS40NDc3IDExIDExIDExLjQ0NzcgMTEgMTJaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSAxOUMxMSAxOS41NTIzIDExLjQ0NzcgMjAgMTIgMjBDMTIuNTUyMyAyMCAxMyAxOS41NTIzIDEzIDE5QzEzIDE4LjQ0NzcgMTIuNTUyMyAxOCAxMiAxOEMxMS40NDc3IDE4IDExIDE4LjQ0NzcgMTEgMTlaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0xMSA1QzExIDUuNTUyMjggMTEuNDQ3NyA2IDEyIDZDMTIuNTUyMyA2IDEzIDUuNTUyMjggMTMgNUMxMyA0LjQ0NzcyIDEyLjU1MjMgNCAxMiA0QzExLjQ0NzcgNCAxMSA0LjQ0NzcyIDExIDVaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiPlxyXG4gICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvbkR1cGxpY2F0ZSgpXCIgKm5nSWY9XCIhaXNFZGl0TW9kZVwiPkR1cGxpY2F0ZTwvYT48L2xpPlxyXG4gICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gY3Vyc29yLXBvaW50ZXIgdGV4dC1kYW5nZXJcIiAoY2xpY2spPVwib25EZWxldGUoKVwiPiBEZWxldGUgPC9hPlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFdhbGwgdHlwZSBmaXh0dXJlIGNyZWF0aW9uIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiICpuZ0lmPVwiZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiPlxyXG4gICAgPCEtLSBXYWxsIEZpeHR1cmUgRm9ybSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxoMj5GaXh0dXJlIERldGFpbHM8L2gyPlxyXG4gICAgICAgIDxwPkNvbmZpZ3VyZSB5b3VyIGZpeHR1cmUgZGV0YWlscyBoZXJlPC9wPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwid2FsbEZpeHR1cmVGb3JtXCI+XHJcbiAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbiAjYWNjb3JkaW9uPVwibmdiQWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgIDwhLS0gQmFzaWMgRGV0YWlscyAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZGV0YWlsc1wiIFtjb2xsYXBzZWRdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+QkFTSUMgREVUQUlMUzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYmFzaWNEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZml4dHVyZUNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5GaXh0dXJlIG5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZml4dHVyZUNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaW52YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4dHVyZSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBjYW5ub3QgYmUgb25seSB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgd2lkdGggKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cIndpZHRoXCIgW3N0ZXBdPVwiMC41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8uaW52YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIHdpZHRoIGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgaGVpZ2h0IChcIiArIChmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwibGVuZ3RoXCIgW3N0ZXBdPVwiMC41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmFsbCBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNIZWFkZXJFbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWN0aW9uKCdoZWFkZXInKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbXMtNFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+SEVBREVSPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgZm9ybUdyb3VwTmFtZT1cImhlYWRlclwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNIZWFkZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIkhlaWdodCAoXCIgKyAoZml4dHVyZURldGFpbHMuaGVhZGVyPy5oZWlnaHQ/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwiaGVpZ2h0XCIgW3N0ZXBdPVwiMC41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdoZWFkZXIuaGVpZ2h0Jyk/LnRvdWNoZWQgJiYgd2FsbEZpeHR1cmVGb3JtLmdldCgnaGVhZGVyLmhlaWdodCcpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdoZWFkZXIuaGVpZ2h0Jyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQm9keSBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJib2R5XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIiBbY2hlY2tlZF09XCJpc0JvZHlFbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWN0aW9uKCdib2R5Jyk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1zLTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkJPRFk8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYm9keVwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNCb2R5RW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5ObyBvZiBzaGVsdmVzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1jb250YWluZXJcIiBbY2xhc3MuZGlzYWJsZS1jb3VudGVyXT1cIiFpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cInJlbW92ZVNoZWxmKCk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy43NjI5NCA3SDExLjkyOTZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2hlbGZBcnJheS5sZW5ndGggfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cImFkZFNoZWxmKCk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4xNTM4OSAyLjkxNjVWMTEuMDgzMk0zLjA3MDU2IDYuOTk5ODRIMTEuMjM3MlwiIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwic2hlbGZBcnJheS5sZW5ndGggPCAxICYmIGlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgc2hlbGYgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGF0YWxpc3QgaWQ9XCJ3YWxsWm9uZU9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgem9uZSBvZiB3YWxsWm9uZXNcIiBbdmFsdWVdPVwiem9uZS52YWx1ZVwiPjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kYXRhbGlzdD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hlbGZBcnJheT8ubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHRleHQtbm93cmFwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhdXRvQXNzaWduV2FsbFpvbmVzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRvLXpvbmUgc2hlbHZlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaGVsZkFycmF5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwic2hlbGZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzaGVsZiBvZiBzaGVsZkFycmF5Py5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcnJheS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJzaGVsZi10aXRsZVwiPlNoZWxmIHt7IGkgKyAxIH19PC9oNj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTaGVsZihpKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE4IDZMNiAxOE02IDZMMTggMThcIiBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJzaGVsZlR5cGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1iLTFcIj5ab25lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ6b25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0PVwid2FsbFpvbmVPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gVG9wLCBNaWQsIEJvdHRvbVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hlbGYuZ2V0KCd0eXBlJyk/LnZhbHVlID09PSAndHJheSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+Tm8gb2Ygcm93czwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJub09mUm93c1wiIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaGVsZi5nZXQoJ25vT2ZSb3dzJyk/LnRvdWNoZWQgJiYgc2hlbGYuZ2V0KCdub09mUm93cycpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInNoZWxmLmdldCgnbm9PZlJvd3MnKT8uaGFzRXJyb3IoJ21pbicpXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGF0IGxlYXN0IDEgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaGVsZi5nZXQoJ3R5cGUnKT8udmFsdWUgIT09ICd2bW9ubHknXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Qcm9kdWN0IGNhcGFjaXR5IGZvciBlYWNoIHJvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RDYXBhY2l0eVwiIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaGVsZi5nZXQoJ3R5cGUnKT8udmFsdWUgIT09ICd2bW9ubHknICYmIHNoZWxmLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnRvdWNoZWQgJiYgc2hlbGYuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8uZXJyb3JzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzaGVsZi5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0IGNhcGFjaXR5IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZvb3RlciBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJmb290ZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiIFtjaGVja2VkXT1cImlzRm9vdGVyRW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VjdGlvbignZm9vdGVyJyk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1zLTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkZPT1RFUjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJmb290ZXJcIiBbY2xhc3MuZGlzYWJsZWRdPVwiIWlzRm9vdGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgXCJIZWlnaHQgKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZvb3Rlcj8uaGVpZ2h0Py51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cImhlaWdodFwiIFtzdGVwXT1cIjAuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnZm9vdGVyLmhlaWdodCcpPy50b3VjaGVkICYmIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Zvb3Rlci5oZWlnaHQnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnZm9vdGVyLmhlaWdodCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBGb290ZXIgaGVpZ2h0IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBXYWxsIEZpeHR1cmUgUHJldmlldyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbC04XCI+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoNzV2aCAtIDEyMHB4KTsgb3ZlcmZsb3cteTogYXV0b1wiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0JvZHlFbmFibGVkIHx8IGlzSGVhZGVyRW5hYmxlZCB8fCBpc0Zvb3RlckVuYWJsZWQ7IGVsc2UgZW1wdHlGaXh0dXJlXCJcclxuICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAge3sgbGVuZ3RoIH19IHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LnZhbHVlXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBnYXAtNVwiICpuZ0lmPVwiaXNIZWFkZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYmxvY2tcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWluZm9cIj5cclxuICAgICAgICAgICAgICAgIDxwPkhFQURFUjwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEJvZHkgUHJldmlldyAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktYmxvY2tcIiAqbmdJZj1cImlzQm9keUVuYWJsZWQgJiYgc2hlbGZBcnJheS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBnYXAtNSBzaGVsZkNvbnRhaW5lclwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNoZWxmQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIEBpZihpdGVtLmdldCgndHlwZScpPy52YWx1ZSA9PT0ndHJheScpe1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSlcIiBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgVFJBWSB7eyBpICsgMSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5nZXQoXCJwcm9kdWN0Q2FwYWNpdHlcIik/LnZhbHVlICogKGl0ZW0uZ2V0KFwibm9PZlJvd3NcIik/LnZhbHVlID8/IDEpIH19PC9iPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibG9jayBzaGVsZlwiIFtjbGFzcy52bW9ubHktcGxhY2Vob2xkZXJdPVwiaXRlbS5nZXQoJ3R5cGUnKT8udmFsdWUgPT09J3Ztb25seSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udmFsdWUpXCIgY2xhc3M9XCJwcm9kdWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uZ2V0KCd0eXBlJyk/LnZhbHVlID09PSd2bW9ubHknID8gICdWTSBPTkxZJzogJ1NIRUxGJ319IHt7IGkgKyAxIH19IDxiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOiB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgfX08L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZvb3RlciBQcmV2aWV3IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC01XCIgKm5nSWY9XCJpc0Zvb3RlckVuYWJsZWRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlciBmb290ZXItYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbS0wIGgtMTAwIGdhcC0zIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc3ViLWZvb3RlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIHN1Yi1mb290ZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXItaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgPHA+Rk9PVEVSPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlGaXh0dXJlPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW4gaC0xMDBcIj5cclxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+UHJldmlldyByZXF1aXJlcyBoZWFkZXIsIGZvb3Rlciwgb3IgYm9keSBibG9jayBlbmFibGVkLjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhc3VidGV4dFwiPlBsZWFzZSBlbmFibGUgZWl0aGVyIHRoZSBoZWFkZXIsIGZvb3Rlciwgb3IgYm9keSB0byB2aWV3IHRoZSBwcmV2aWV3Li48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBJbmZvIENhcmRzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyBzaGVsZkFycmF5Lmxlbmd0aCB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5ObyBvZiBTaGVsdmVzPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgdG90YWxQcm9kdWN0Q2FwYWNpdHkgfX08L2gzPlxyXG4gICAgICAgICAgPHA+UHJvZHVjdCBDYXBhY2l0eTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPnt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlIHwgdGl0bGVjYXNlIH19IGZpeHR1cmU8L2gzPlxyXG4gICAgICAgICAgPHA+VHlwZTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPlxyXG4gICAgICAgICAgICB7eyB3YWxsRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpPy52YWx1ZSB9fSB4XHJcbiAgICAgICAgICAgIHt7IHdhbGxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMubGVuZ3RoXCIpPy52YWx1ZSB9fSBmZWV0XHJcbiAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgPHA+T3ZlcmFsbCBEaW1lbnNpb248L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gRmxvb3IgdHlwZSBmaXh0dXJlIGNyZWF0aW9uIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiICpuZ0lmPVwiZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICdmbG9vcidcIj5cclxuICAgIDwhLS0gRmxvb3IgUGFuZWwgRm9ybSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxoMj5GaXh0dXJlIERldGFpbHM8L2gyPlxyXG4gICAgICAgIDxwPlRoZSBzZXR0aW5ncyBhcmUgcHJlLWNvbmZpZ3VyZWQgYW5kIGNhbm5vdCBiZSBlZGl0ZWQ8L3A+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmbG9vckZpeHR1cmVGb3JtXCI+XHJcbiAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbiAjYWNjb3JkaW9uPVwibmdiQWNjb3JkaW9uXCI+XHJcbiAgICAgICAgICAgIDwhLS0gQmFzaWMgRGV0YWlscyAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZGV0YWlsc1wiIFtjb2xsYXBzZWRdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+QkFTSUMgREVUQUlMUzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIiBmb3JtR3JvdXBOYW1lPVwiYmFzaWNEZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZml4dHVyZUNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5GaXh0dXJlIG5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZml4dHVyZUNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4dHVyZSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXh0dXJlIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCB3aWR0aCAoXCIgKyAoZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwid2lkdGhcIiBbc3RlcF09XCIwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LmludmFsaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIHdpZHRoIGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCBsZW5ndGggKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJsZW5ndGhcIiBbc3RlcF09XCIwLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8uaW52YWxpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIGhlaWdodCBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBQYW5lbCBTZWN0aW9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJwYW5lbFwiPlxyXG4gICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5QQU5FTDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvaDI+XHJcbiAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Db2xsYXBzZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQm9keT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5ObyBvZiBwYW5lbHM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1jb250YWluZXJcIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIChjbGljayk9XCJyZW1vdmVQYW5lbCgpOyBmbG9vckZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy43NjI5NCA3SDExLjkyOTZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHBhbmVsQXJyYXkubGVuZ3RoIH19PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHJvbGU9XCJidXR0b25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE1IDE0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIChjbGljayk9XCJhZGRQYW5lbCgpOyBmbG9vckZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4xNTM4OSAyLjkxNjVWMTEuMDgzMk0zLjA3MDU2IDYuOTk5ODRIMTEuMjM3MlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbEFycmF5Lmxlbmd0aCA8IDEgJiYgaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFuZWwgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGF0YWxpc3QgaWQ9XCJmbG9vclpvbmVPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB6b25lIG9mIGZsb29yWm9uZXNcIiBbdmFsdWVdPVwiem9uZS52YWx1ZVwiPjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGF0YWxpc3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYW5lbEFycmF5Py5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInBhbmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHBhbmVsIG9mIHBhbmVsQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcnJheS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cInNoZWxmLXRpdGxlXCI+UGFuZWwge3sgaSArIDEgfX08L2g2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgKGNsaWNrKT1cInJlbW92ZVBhbmVsKGkpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE4IDZMNiAxOE02IDZMMTggMThcIiBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicGFuZWxOYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwicGFuZWxOYW1lXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbC5nZXQoJ3BhbmVsTmFtZScpPy50b3VjaGVkICYmIHBhbmVsLmdldCgncGFuZWxOYW1lJyk/LmVycm9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWwuZ2V0KCdwYW5lbE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lbCBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWwuZ2V0KCdwYW5lbE5hbWUnKT8uaGFzRXJyb3IoJ3doaXRlc3BhY2UnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhbmVsIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsLmdldCgncGFuZWxOYW1lJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWxsb3dlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMVwiPlpvbmU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ6b25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdD1cImZsb29yWm9uZU9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQWxsLCBUb3AsIE1pZCwgQm90dG9tXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHJvd3M8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwibm9PZlJvd3NcIiBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuZ2V0KCdub09mUm93cycpPy50b3VjaGVkICYmIHBhbmVsLmdldCgnbm9PZlJvd3MnKT8uZXJyb3JzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWwuZ2V0KCdub09mUm93cycpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBhdCBsZWFzdCAxIHJvdy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Qcm9kdWN0IGNhcGFjaXR5IGZvciBlYWNoIHJvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2FwYWNpdHlcIiBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicGFuZWwuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udG91Y2hlZCAmJiBwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdCBjYXBhY2l0eSBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGbG9vciBQYW5lbCBQcmV2aWV3IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogY2FsYyg3NXZoIC0gMTIwcHgpOyBvdmVyZmxvdy15OiBhdXRvXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoOyBlbHNlIG5vUGFuZWxcIiBjbGFzcz1cImZsb29yLXBhbmVsLXZpZXdwb3J0IHctMTAwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFuZWxBcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZC1mbGV4IGdhcC01XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGxlbmd0aCB9fSB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIiB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udmFsdWVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIFwiPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGVsZkNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSlcIiBjbGFzcz1cInBhbmVsIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy52YWx1ZSlcIiBjbGFzcz1cInByb2R1Y3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgUEFORUwge3sgaSArIDEgfX1cclxuICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOlxyXG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgKiAoaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgPz8gMSkgfX08L2I+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTUgbXQtNVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDI0cHhcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDY0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDUzMCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk01MjIuNjUzIDAuMjkyODkzQzUyMi4yNjMgLTAuMDk3NjMxNSA1MjEuNjMgLTAuMDk3NjMxNCA1MjEuMjM5IDAuMjkyODkzTDUxNC44NzUgNi42NTY4NUM1MTQuNDg1IDcuMDQ3MzggNTE0LjQ4NSA3LjY4MDU0IDUxNC44NzUgOC4wNzEwN0M1MTUuMjY2IDguNDYxNTkgNTE1Ljg5OSA4LjQ2MTU5IDUxNi4yODkgOC4wNzEwN0w1MjEuOTQ2IDIuNDE0MjFMNTI3LjYwMyA4LjA3MTA3QzUyNy45OTQgOC40NjE1OSA1MjguNjI3IDguNDYxNTkgNTI5LjAxNyA4LjA3MTA3QzUyOS40MDggNy42ODA1NCA1MjkuNDA4IDcuMDQ3MzggNTI5LjAxNyA2LjY1Njg1TDUyMi42NTMgMC4yOTI4OTNaTTUyMi45NDYgMTRMNTIyLjk0NiAxTDUyMC45NDYgMUw1MjAuOTQ2IDE0TDUyMi45NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0zOTQuMTUzIDAuMjkyODkzQzM5My43NjMgLTAuMDk3NjMxNSAzOTMuMTMgLTAuMDk3NjMxNCAzOTIuNzM5IDAuMjkyODkzTDM4Ni4zNzUgNi42NTY4NUMzODUuOTg1IDcuMDQ3MzggMzg1Ljk4NSA3LjY4MDU0IDM4Ni4zNzUgOC4wNzEwN0MzODYuNzY2IDguNDYxNTkgMzg3LjM5OSA4LjQ2MTU5IDM4Ny43ODkgOC4wNzEwN0wzOTMuNDQ2IDIuNDE0MjFMMzk5LjEwMyA4LjA3MTA3QzM5OS40OTQgOC40NjE1OSA0MDAuMTI3IDguNDYxNTkgNDAwLjUxNyA4LjA3MTA3QzQwMC45MDggNy42ODA1NCA0MDAuOTA4IDcuMDQ3MzggNDAwLjUxNyA2LjY1Njg1TDM5NC4xNTMgMC4yOTI4OTNaTTM5NC40NDYgMTRMMzk0LjQ0NiAxTDM5Mi40NDYgMUwzOTIuNDQ2IDE0TDM5NC40NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0yNjUuNjUzIDAuMjkyODkzQzI2NS4yNjMgLTAuMDk3NjMxNSAyNjQuNjMgLTAuMDk3NjMxNCAyNjQuMjM5IDAuMjkyODkzTDI1Ny44NzUgNi42NTY4NUMyNTcuNDg1IDcuMDQ3MzggMjU3LjQ4NSA3LjY4MDU0IDI1Ny44NzUgOC4wNzEwN0MyNTguMjY2IDguNDYxNTkgMjU4Ljg5OSA4LjQ2MTU5IDI1OS4yODkgOC4wNzEwN0wyNjQuOTQ2IDIuNDE0MjFMMjcwLjYwMyA4LjA3MTA3QzI3MC45OTQgOC40NjE1OSAyNzEuNjI3IDguNDYxNTkgMjcyLjAxNyA4LjA3MTA3QzI3Mi40MDggNy42ODA1NCAyNzIuNDA4IDcuMDQ3MzggMjcyLjAxNyA2LjY1Njg1TDI2NS42NTMgMC4yOTI4OTNaTTI2NS45NDYgMTRMMjY1Ljk0NiAxTDI2My45NDYgMUwyNjMuOTQ2IDE0TDI2NS45NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0xMzcuMTUzIDAuMjkyODkzQzEzNi43NjMgLTAuMDk3NjMxNSAxMzYuMTMgLTAuMDk3NjMxNCAxMzUuNzM5IDAuMjkyODkzTDEyOS4zNzUgNi42NTY4NUMxMjguOTg1IDcuMDQ3MzggMTI4Ljk4NSA3LjY4MDU0IDEyOS4zNzUgOC4wNzEwN0MxMjkuNzY2IDguNDYxNTkgMTMwLjM5OSA4LjQ2MTU5IDEzMC43ODkgOC4wNzEwN0wxMzYuNDQ2IDIuNDE0MjFMMTQyLjEwMyA4LjA3MTA3QzE0Mi40OTQgOC40NjE1OSAxNDMuMTI3IDguNDYxNTkgMTQzLjUxNyA4LjA3MTA3QzE0My45MDggNy42ODA1NCAxNDMuOTA4IDcuMDQ3MzggMTQzLjUxNyA2LjY1Njg1TDEzNy4xNTMgMC4yOTI4OTNaTTEzNy40NDYgMTRMMTM3LjQ0NiAxTDEzNS40NDYgMUwxMzUuNDQ2IDE0TDEzNy40NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk04LjY1MzQgMC4yOTI4OTNDOC4yNjI4NyAtMC4wOTc2MzE1IDcuNjI5NzEgLTAuMDk3NjMxNCA3LjIzOTE4IDAuMjkyODkzTDAuODc1MjIxIDYuNjU2ODVDMC40ODQ2OTcgNy4wNDczOCAwLjQ4NDY5NyA3LjY4MDU0IDAuODc1MjIxIDguMDcxMDdDMS4yNjU3NSA4LjQ2MTU5IDEuODk4OTEgOC40NjE1OSAyLjI4OTQzIDguMDcxMDdMNy45NDYyOSAyLjQxNDIxTDEzLjYwMzEgOC4wNzEwN0MxMy45OTM3IDguNDYxNTkgMTQuNjI2OCA4LjQ2MTU5IDE1LjAxNzQgOC4wNzEwN0MxNS40MDc5IDcuNjgwNTQgMTUuNDA3OSA3LjA0NzM4IDE1LjAxNzQgNi42NTY4NUw4LjY1MzQgMC4yOTI4OTNaTTguOTQ2MjkgMTRMOC45NDYyOSAxTDYuOTQ2MjkgMUw2Ljk0NjI5IDE0TDguOTQ2MjkgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTdcIiBoZWlnaHQ9XCI0M1wiIHZpZXdCb3g9XCIwIDAgNTcgNDNcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMC40Mzk2OTcgMzEuODA4N0MwLjQzOTY5NyAyNi44NjQgNC40NDgyIDIyLjg1NTUgOS4zOTI5NCAyMi44NTU1SDQ3LjQ2ODFDNTIuNDIzIDIyLjg1NTUgNTYuNDM5NyAyNi44NzIyIDU2LjQzOTcgMzEuODI3QzU2LjQzOTcgMzcuMzI1NSA1MS41MzczIDQxLjQ5OTQgNDYuMDc2NSA0MC44NTcxQzMzLjYzMTggMzkuMzkzNSAyMy43MjY3IDM5LjMyMDYgMTAuODE4NiA0MC44Mzc2QzUuMzU1NDIgNDEuNDc5NiAwLjQzOTY5NyAzNy4zMDk1IDAuNDM5Njk3IDMxLjgwODdaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxRDI5MzlcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjI4LjQ0MDhcIiBjeT1cIjE2LjU3MTRcIiByPVwiMTUuMDcxNFwiIGZpbGw9XCIjMUQyOTM5XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIzXCIgLz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub1BhbmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW4gaC0xMDBcIj5cclxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+QWRkIGEgcGFuZWwgdG8gc2VlIHlvdXIgcHJldmlldy48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YXN1YnRleHRcIj5UbyBzZWUgeW91ciBwcmV2aWV3LCBwbGVhc2UgYWRkIGF0IGxlYXN0IG9uZSBwYW5lbC48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBJbmZvIENhcmRzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyBwYW5lbEFycmF5Lmxlbmd0aCB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5ObyBvZiBQYW5lbHM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpPy52YWx1ZSB9fSB4XHJcbiAgICAgICAgICAgIHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLmxlbmd0aFwiKT8udmFsdWUgfX1cclxuICAgICAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX1cclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlLXNrZWxldG9uXCIgKm5nSWY9XCJpc1BhZ2VMb2FkaW5nXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjwhLS0gQ29tbW9uIGRpbWVuc2lvbiBhcnJvd3MgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZGltZW5zaW9uQXJyb3dzIGxldC1sYWJlbD1cImxhYmVsXCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cclxuICA8ZGl2IGNsYXNzPVwiaG9yaXpvbnRhbC1kaW1lbnNpb25cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBsZWZ0XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInZhbHVlXCI+e3sgdmFsdWUgfX0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyByaWdodFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==