tango-app-ui-store-builder 1.2.4 → 1.2.6

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 (64) 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/custom-select/custom-select.component.mjs +14 -5
  6. package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +3 -2
  7. package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +3 -2
  8. package/esm2022/lib/components/fixture-template-table/find-and-replace/find-and-replace.component.mjs +3 -2
  9. package/esm2022/lib/components/fixture-template-table/fixture-template-table.component.mjs +2 -3
  10. package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +3 -2
  11. package/esm2022/lib/components/manage-plano/verification-table/verification-table.component.mjs +2 -3
  12. package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +87 -13
  13. package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +4 -3
  14. package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +114 -4
  15. package/esm2022/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.mjs +7 -2
  16. package/esm2022/lib/components/onboard-store-plano/onboard-fixture/onboard-fixture.component.mjs +3 -3
  17. package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +255 -25
  18. package/esm2022/lib/components/plano-configurations/plano-configurations.component.mjs +162 -3
  19. package/esm2022/lib/components/plano-library/fixture-library/fixture-library.component.mjs +3 -4
  20. package/esm2022/lib/components/plano-library/vm-library/vm-library.component.mjs +3 -4
  21. package/esm2022/lib/components/plano-tools/cad-files/cad-files.component.mjs +88 -0
  22. package/esm2022/lib/components/plano-tools/cad-render/cad-render.component.mjs +4 -5
  23. package/esm2022/lib/components/plano-tools/move-bucket/move-bucket.component.mjs +239 -0
  24. package/esm2022/lib/components/plano-tools/plano-data-export/plano-data-export.component.mjs +98 -3
  25. package/esm2022/lib/components/plano-tools/plano-migrate/plano-migrate.component.mjs +5 -4
  26. package/esm2022/lib/components/plano-tools/store-exports/store-exports.component.mjs +135 -33
  27. package/esm2022/lib/components/plano-tools/swap-template/swap-template.component.mjs +325 -0
  28. package/esm2022/lib/components/plano-tools/tools-parent/tools-parent.component.mjs +3 -3
  29. package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +3 -2
  30. package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +3 -2
  31. package/esm2022/lib/components/planogram/plano-analytics/plano-analytics.component.mjs +3 -2
  32. package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +1 -1
  33. package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +3 -2
  34. package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +3 -2
  35. package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +2 -3
  36. package/esm2022/lib/components/popups/delete-confirmation/delete-confirmation.component.mjs +10 -3
  37. package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -4
  38. package/esm2022/lib/components/store-plano/store-plano.component.mjs +4 -3
  39. package/esm2022/lib/data/fixture-template.data.mjs +12 -1
  40. package/esm2022/lib/functions/plano.function.mjs +13 -1
  41. package/esm2022/lib/services/store-builder.service.mjs +35 -1
  42. package/esm2022/lib/tango-store-builder-routing.module.mjs +16 -1
  43. package/esm2022/lib/tango-store-builder.module.mjs +10 -1
  44. package/fesm2022/tango-app-ui-store-builder.mjs +1914 -401
  45. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  46. package/lib/components/create-fixture/create-fixture.component.d.ts +3 -0
  47. package/lib/components/custom-select/custom-select.component.d.ts +5 -2
  48. package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +4 -4
  49. package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +5 -5
  50. package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +7 -1
  51. package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +14 -1
  52. package/lib/components/onboard-store-plano/onboard-store-plano.component.d.ts +19 -2
  53. package/lib/components/plano-configurations/plano-configurations.component.d.ts +19 -1
  54. package/lib/components/plano-tools/cad-files/cad-files.component.d.ts +30 -0
  55. package/lib/components/plano-tools/move-bucket/move-bucket.component.d.ts +64 -0
  56. package/lib/components/plano-tools/plano-data-export/plano-data-export.component.d.ts +26 -0
  57. package/lib/components/plano-tools/store-exports/store-exports.component.d.ts +28 -3
  58. package/lib/components/plano-tools/swap-template/swap-template.component.d.ts +83 -0
  59. package/lib/components/popups/delete-confirmation/delete-confirmation.component.d.ts +3 -1
  60. package/lib/data/fixture-template.data.d.ts +8 -0
  61. package/lib/functions/plano.function.d.ts +1 -0
  62. package/lib/services/store-builder.service.d.ts +26 -0
  63. package/lib/tango-store-builder.module.d.ts +56 -53
  64. package/package.json +1 -1
@@ -22,6 +22,9 @@ export class InstanceBasicDetailsComponent {
22
22
  isSubmitted;
23
23
  revertOnEdit = false;
24
24
  zoneEditMode = false;
25
+ libraryCategories = [];
26
+ libraryByCategory = new Map();
27
+ allowCategoryAndWidthEdit = false;
25
28
  submitEvent = new EventEmitter();
26
29
  initialState = 0;
27
30
  shelfTypes = [
@@ -29,6 +32,17 @@ export class InstanceBasicDetailsComponent {
29
32
  { label: "Tray", value: "tray" },
30
33
  { label: "VM Only", value: "vmonly" },
31
34
  ];
35
+ categoryOptions = [];
36
+ widthOptions = [];
37
+ // The initial fixture values are displayed as a "hidden" <option> when they
38
+ // don't exist in the library — keeps the value visible in the control's
39
+ // selected display but absent from the dropdown's open list. Cleared once
40
+ // the user changes the value.
41
+ originalCategory = null;
42
+ originalWidth = null;
43
+ showOriginalCategoryOption = false;
44
+ showOriginalWidthOption = false;
45
+ originalWidthLabel = "";
32
46
  constructor(fb, toast, storeBuilderService) {
33
47
  this.fb = fb;
34
48
  this.toast = toast;
@@ -51,6 +65,53 @@ export class InstanceBasicDetailsComponent {
51
65
  this.submitForm();
52
66
  }
53
67
  }
68
+ if (changes["fixtureData"] ||
69
+ changes["libraryCategories"] ||
70
+ changes["libraryByCategory"]) {
71
+ this.recomputeCategoryOptions();
72
+ this.recomputeWidthOptions(this.fixtureTemplateBasicDetailsForm?.get("fixtureCategory")?.value);
73
+ this.updateOriginalOptionVisibility();
74
+ }
75
+ }
76
+ updateOriginalOptionVisibility() {
77
+ this.showOriginalCategoryOption =
78
+ !!this.originalCategory &&
79
+ !this.libraryCategories?.includes(this.originalCategory);
80
+ this.showOriginalWidthOption =
81
+ this.originalWidth != null &&
82
+ !this.widthOptions.some((w) => w.value === this.originalWidth);
83
+ if (this.originalWidth != null) {
84
+ const widthUnit = this.fixtureTemplateDetails?.fixtureWidth?.unit ?? "";
85
+ this.originalWidthLabel = `${this.originalWidth} ${widthUnit}`.trim();
86
+ }
87
+ else {
88
+ this.originalWidthLabel = "";
89
+ }
90
+ }
91
+ // Category dropdown is strictly library values — if the fixture's current
92
+ // category isn't in the library, it won't appear here; the dropdown will
93
+ // render unselected to force the user to pick a valid one.
94
+ recomputeCategoryOptions() {
95
+ this.categoryOptions = (this.libraryCategories ?? [])
96
+ .slice()
97
+ .sort()
98
+ .map((c) => ({ label: c, value: c }));
99
+ }
100
+ // Width dropdown is filtered to widths available for the currently-selected
101
+ // category in the form. If no category is selected (or it's not in the
102
+ // library), no width options are shown.
103
+ recomputeWidthOptions(selectedCategory) {
104
+ const widthUnit = this.fixtureTemplateDetails?.fixtureWidth?.unit ?? "";
105
+ const widths = selectedCategory
106
+ ? this.libraryByCategory?.get(selectedCategory)
107
+ : null;
108
+ if (!widths) {
109
+ this.widthOptions = [];
110
+ return;
111
+ }
112
+ this.widthOptions = Array.from(widths)
113
+ .sort((a, b) => a - b)
114
+ .map((w) => ({ label: `${w} ${widthUnit}`.trim(), value: w }));
54
115
  }
55
116
  initializeForm() {
56
117
  this.fixtureTemplateBasicDetailsForm = this.fb.group({
@@ -58,7 +119,14 @@ export class InstanceBasicDetailsComponent {
58
119
  this.fixtureTemplateDetails?.description ?? "",
59
120
  generalValidator(),
60
121
  ],
61
- fixtureCategory: [this.getFixtureLibrary(), Validators.required],
122
+ fixtureCategory: [
123
+ this.fixtureTemplateDetails?.fixtureCategory ?? null,
124
+ Validators.required,
125
+ ],
126
+ fixtureWidthValue: [
127
+ this.fixtureTemplateDetails?.fixtureWidth?.value ?? null,
128
+ Validators.required,
129
+ ],
62
130
  headerLabel: [
63
131
  this.fixtureTemplateDetails?.header?.label,
64
132
  [Validators.required, generalValidator()],
@@ -74,6 +142,35 @@ export class InstanceBasicDetailsComponent {
74
142
  ],
75
143
  });
76
144
  this.fixtureTemplateDetails?.shelfConfig?.forEach((i) => this.addShelf(i));
145
+ this.originalCategory =
146
+ this.fixtureTemplateDetails?.fixtureCategory ?? null;
147
+ this.originalWidth =
148
+ this.fixtureTemplateDetails?.fixtureWidth?.value ?? null;
149
+ this.updateOriginalOptionVisibility();
150
+ this.fixtureTemplateBasicDetailsForm
151
+ .get("fixtureCategory")
152
+ ?.valueChanges.subscribe((category) => {
153
+ if (category !== this.originalCategory) {
154
+ this.originalCategory = null;
155
+ }
156
+ this.recomputeWidthOptions(category);
157
+ const widthControl = this.fixtureTemplateBasicDetailsForm.get("fixtureWidthValue");
158
+ const currentWidth = widthControl?.value;
159
+ const validWidths = category ? this.libraryByCategory?.get(category) : null;
160
+ if (currentWidth != null &&
161
+ (!validWidths || !validWidths.has(currentWidth))) {
162
+ widthControl?.setValue(null);
163
+ }
164
+ this.updateOriginalOptionVisibility();
165
+ });
166
+ this.fixtureTemplateBasicDetailsForm
167
+ .get("fixtureWidthValue")
168
+ ?.valueChanges.subscribe((width) => {
169
+ if (width !== this.originalWidth) {
170
+ this.originalWidth = null;
171
+ }
172
+ this.updateOriginalOptionVisibility();
173
+ });
77
174
  if (!this.isEditMode)
78
175
  this.fixtureTemplateBasicDetailsForm?.disable({ emitEvent: false });
79
176
  this.isPageLoading = false;
@@ -153,6 +250,13 @@ export class InstanceBasicDetailsComponent {
153
250
  const payload = {
154
251
  ...this.fixtureTemplateDetails,
155
252
  description: this.fixtureTemplateBasicDetailsForm.value.description,
253
+ ...(this.allowCategoryAndWidthEdit && {
254
+ fixtureCategory: this.fixtureTemplateBasicDetailsForm.value.fixtureCategory,
255
+ fixtureWidth: {
256
+ ...this.fixtureTemplateDetails.fixtureWidth,
257
+ value: this.fixtureTemplateBasicDetailsForm.value.fixtureWidthValue,
258
+ },
259
+ }),
156
260
  header: {
157
261
  ...this.fixtureTemplateDetails.header,
158
262
  label: this.fixtureTemplateBasicDetailsForm.value.headerLabel,
@@ -226,7 +330,7 @@ export class InstanceBasicDetailsComponent {
226
330
  this.submitEvent.emit(this.fixtureTemplateBasicDetailsForm.value);
227
331
  }
228
332
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InstanceBasicDetailsComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ToastService }, { token: i3.StoreBuilderService }], target: i0.ɵɵFactoryTarget.Component });
229
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: InstanceBasicDetailsComponent, isStandalone: true, selector: "lib-instance-basic-details", inputs: { fixtureData: "fixtureData", editMode: "editMode", isSubmitted: "isSubmitted", revertOnEdit: "revertOnEdit", zoneEditMode: "zoneEditMode" }, outputs: { submitEvent: "submitEvent" }, usesOnChanges: true, ngImport: i0, template: "<section id=\"fixture-template-basic-details\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <div class=\"cols col\" style=\"max-width: 380px;\">\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n\r\n <p>Template unique ID: {{ fixtureTemplateDetails?.templateIndex }}</p>\r\n\r\n <form [formGroup]=\"fixtureTemplateBasicDetailsForm\">\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"description\" class=\"form-label mb-1\">Description</label>\r\n <textarea type=\"text\" class=\"form-control\" id=\"description\" formControlName=\"description\"></textarea>\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('description')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('description')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('description')?.hasError('whitespace')\">\r\n Description cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('description')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Select fixture type</label>\r\n <input type=\"text\" class=\"form-control\" id=\"headerLabel\" formControlName=\"fixtureCategory\" readonly />\r\n </div>\r\n\r\n <div class=\"form-group mb-4\" *ngIf=\"fixtureTemplateDetails?.header?.isEnabled\"\r\n [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"templateGroupName\" class=\"form-label mb-1\">Template Group</label>\r\n <input type=\"text\" class=\"form-control\" id=\"templateGroupName\" formControlName=\"templateGroupName\" />\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('templateGroupName')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('templateGroupName')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('templateGroupName')?.hasError('whitespace')\">\r\n Template group cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('templateGroupName')?.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=\"form-group mb-4\" *ngIf=\"zoneEditMode || fixtureTemplateDetails?.header?.isEnabled\">\r\n <label for=\"headerLabel\" class=\"form-label mb-1\">Header: label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"headerLabel\" formControlName=\"headerLabel\" />\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('headerLabel')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('headerLabel')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.hasError('required')\">\r\n Header label is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.hasError('whitespace')\">\r\n Header label cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.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 formArrayName=\"shelf\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"shelf\" class=\"mb-2\">Body: Product Capacity at each shelf</label>\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.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)=\"removeShelf();\">\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();\">\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 </div>\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\">\r\n <div class=\"shelf-container\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <p>\r\n {{ shelf.get(\"shelfType\")?.value === 'vmonly' ? 'VM ONLY SHELF' : (shelf.get(\"shelfType\")?.value || 'panel') | uppercase }}\r\n {{ i + 1 }}\r\n </p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i)\" class=\"cursor-pointer\" *ngIf=\"shelfArray.length > 1\">\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=\"shelfType\">\r\n </lib-reactive-select>\r\n <div *ngIf=\"shelf.get('shelfType')?.value === 'tray'\"\r\n class=\"d-flex justify-content-between align-items-center mt-2\">\r\n <p class=\"m-0\">No of Rows</p>\r\n <counter-input style=\"width: 40%\" formControlName=\"trayRows\" [step]=\"1\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-2\"\r\n *ngIf=\"shelf.get('shelfType')?.value !== 'vmonly'\">\r\n <label>Product capacity</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productPerShelf\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n shelf.get('shelfType')?.value !== 'vmonly' &&\r\n shelf.get('productPerShelf')?.touched &&\r\n shelf.get('productPerShelf')?.errors\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productPerShelf')?.hasError('min')\">\r\n Product capacity must be at least\r\n {{ shelf.get(\"shelfType\")?.value === \"vmonly\" ? \"0\" : \"1\" }}.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"footerLabel\" class=\"form-label mb-1\">Footer: label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"footerLabel\" formControlName=\"footerLabel\" />\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('footerLabel')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('footerLabel')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('footerLabel')?.hasError('whitespace')\">\r\n Footer label cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('footerLabel')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"cols col\">\r\n <div class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>\r\n {{ fixtureTemplateBasicDetailsForm.get(\"headerLabel\")?.value }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"shelfArray.length > 0\">\r\n <div *ngFor=\"let item of shelfArray.controls; let i = index\" class=\"shelfContainer\">\r\n @if(item.get('shelfType')?.value ==='tray'){\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('trayRows')?.value);let j=index\"\r\n class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productPerShelf')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('shelfType')?.value ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productPerShelf')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateBasicDetailsForm.get(\"footerLabel\")?.value }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-basic-details-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>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</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.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.badge.draft{color:#009bf3;background:#eaf8ff}.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}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}.footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}.sub-footer{position:relative;width:48%}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i4.UpperCasePipe, name: "uppercase" }, { kind: "component", type: CounterInputComponent, selector: "counter-input", inputs: ["step", "placeholder", "max"], outputs: ["onIncrement", "onDecrement"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }] });
333
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: InstanceBasicDetailsComponent, isStandalone: true, selector: "lib-instance-basic-details", inputs: { fixtureData: "fixtureData", editMode: "editMode", isSubmitted: "isSubmitted", revertOnEdit: "revertOnEdit", zoneEditMode: "zoneEditMode", libraryCategories: "libraryCategories", libraryByCategory: "libraryByCategory", allowCategoryAndWidthEdit: "allowCategoryAndWidthEdit" }, outputs: { submitEvent: "submitEvent" }, usesOnChanges: true, ngImport: i0, template: "<section id=\"fixture-template-basic-details\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <div class=\"cols col\" style=\"max-width: 380px;\">\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n\r\n <p>Template unique ID: {{ fixtureTemplateDetails?.templateIndex }}</p>\r\n\r\n <form [formGroup]=\"fixtureTemplateBasicDetailsForm\">\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"description\" class=\"form-label mb-1\">Description</label>\r\n <textarea type=\"text\" class=\"form-control\" id=\"description\" formControlName=\"description\"></textarea>\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('description')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('description')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('description')?.hasError('whitespace')\">\r\n Description cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('description')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"allowCategoryAndWidthEdit; else readonlyFixtureType\">\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label class=\"form-label mb-1\">Fixture type</label>\r\n <select class=\"form-select\" formControlName=\"fixtureCategory\">\r\n <option *ngIf=\"showOriginalCategoryOption\" [ngValue]=\"originalCategory\" hidden>{{ originalCategory }}</option>\r\n <option *ngFor=\"let cat of categoryOptions\" [ngValue]=\"cat.value\">{{ cat.label }}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label class=\"form-label mb-1\">Fixture width</label>\r\n <select class=\"form-select\" formControlName=\"fixtureWidthValue\">\r\n <option *ngIf=\"showOriginalWidthOption\" [ngValue]=\"originalWidth\" hidden>{{ originalWidthLabel }}</option>\r\n <option *ngFor=\"let w of widthOptions\" [ngValue]=\"w.value\">{{ w.label }}</option>\r\n </select>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #readonlyFixtureType>\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"fixtureCategoryReadonly\" class=\"form-label mb-1\">Select fixture type</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategoryReadonly\"\r\n [value]=\"getFixtureLibrary()\" readonly />\r\n </div>\r\n </ng-template>\r\n\r\n <div class=\"form-group mb-4\" *ngIf=\"fixtureTemplateDetails?.header?.isEnabled\"\r\n [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"templateGroupName\" class=\"form-label mb-1\">Template Group</label>\r\n <input type=\"text\" class=\"form-control\" id=\"templateGroupName\" formControlName=\"templateGroupName\" />\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('templateGroupName')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('templateGroupName')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('templateGroupName')?.hasError('whitespace')\">\r\n Template group cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('templateGroupName')?.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=\"form-group mb-4\" *ngIf=\"zoneEditMode || fixtureTemplateDetails?.header?.isEnabled\">\r\n <label for=\"headerLabel\" class=\"form-label mb-1\">Header: label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"headerLabel\" formControlName=\"headerLabel\" />\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('headerLabel')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('headerLabel')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.hasError('required')\">\r\n Header label is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.hasError('whitespace')\">\r\n Header label cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.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 formArrayName=\"shelf\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"shelf\" class=\"mb-2\">Body: Product Capacity at each shelf</label>\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.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)=\"removeShelf();\">\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();\">\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 </div>\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\">\r\n <div class=\"shelf-container\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <p>\r\n {{ shelf.get(\"shelfType\")?.value === 'vmonly' ? 'VM ONLY SHELF' : (shelf.get(\"shelfType\")?.value || 'panel') | uppercase }}\r\n {{ i + 1 }}\r\n </p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i)\" class=\"cursor-pointer\" *ngIf=\"shelfArray.length > 1\">\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=\"shelfType\">\r\n </lib-reactive-select>\r\n <div *ngIf=\"shelf.get('shelfType')?.value === 'tray'\"\r\n class=\"d-flex justify-content-between align-items-center mt-2\">\r\n <p class=\"m-0\">No of Rows</p>\r\n <counter-input style=\"width: 40%\" formControlName=\"trayRows\" [step]=\"1\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-2\"\r\n *ngIf=\"shelf.get('shelfType')?.value !== 'vmonly'\">\r\n <label>Product capacity</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productPerShelf\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n shelf.get('shelfType')?.value !== 'vmonly' &&\r\n shelf.get('productPerShelf')?.touched &&\r\n shelf.get('productPerShelf')?.errors\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productPerShelf')?.hasError('min')\">\r\n Product capacity must be at least\r\n {{ shelf.get(\"shelfType\")?.value === \"vmonly\" ? \"0\" : \"1\" }}.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"footerLabel\" class=\"form-label mb-1\">Footer: label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"footerLabel\" formControlName=\"footerLabel\" />\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('footerLabel')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('footerLabel')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('footerLabel')?.hasError('whitespace')\">\r\n Footer label cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('footerLabel')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"cols col\">\r\n <div class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>\r\n {{ fixtureTemplateBasicDetailsForm.get(\"headerLabel\")?.value }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"shelfArray.length > 0\">\r\n <div *ngFor=\"let item of shelfArray.controls; let i = index\" class=\"shelfContainer\">\r\n @if(item.get('shelfType')?.value ==='tray'){\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('trayRows')?.value);let j=index\"\r\n class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productPerShelf')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('shelfType')?.value ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productPerShelf')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateBasicDetailsForm.get(\"footerLabel\")?.value }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-basic-details-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>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</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.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.badge.draft{color:#009bf3;background:#eaf8ff}.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}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}.footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}.sub-footer{position:relative;width:48%}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i4.UpperCasePipe, name: "uppercase" }, { kind: "component", type: CounterInputComponent, selector: "counter-input", inputs: ["step", "placeholder", "max"], outputs: ["onIncrement", "onDecrement"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }] });
230
334
  }
231
335
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InstanceBasicDetailsComponent, decorators: [{
232
336
  type: Component,
@@ -236,7 +340,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
236
340
  CommonModule,
237
341
  CounterInputComponent,
238
342
  ReactiveSelectComponent,
239
- ], standalone: true, template: "<section id=\"fixture-template-basic-details\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <div class=\"cols col\" style=\"max-width: 380px;\">\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n\r\n <p>Template unique ID: {{ fixtureTemplateDetails?.templateIndex }}</p>\r\n\r\n <form [formGroup]=\"fixtureTemplateBasicDetailsForm\">\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"description\" class=\"form-label mb-1\">Description</label>\r\n <textarea type=\"text\" class=\"form-control\" id=\"description\" formControlName=\"description\"></textarea>\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('description')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('description')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('description')?.hasError('whitespace')\">\r\n Description cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('description')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Select fixture type</label>\r\n <input type=\"text\" class=\"form-control\" id=\"headerLabel\" formControlName=\"fixtureCategory\" readonly />\r\n </div>\r\n\r\n <div class=\"form-group mb-4\" *ngIf=\"fixtureTemplateDetails?.header?.isEnabled\"\r\n [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"templateGroupName\" class=\"form-label mb-1\">Template Group</label>\r\n <input type=\"text\" class=\"form-control\" id=\"templateGroupName\" formControlName=\"templateGroupName\" />\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('templateGroupName')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('templateGroupName')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('templateGroupName')?.hasError('whitespace')\">\r\n Template group cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('templateGroupName')?.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=\"form-group mb-4\" *ngIf=\"zoneEditMode || fixtureTemplateDetails?.header?.isEnabled\">\r\n <label for=\"headerLabel\" class=\"form-label mb-1\">Header: label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"headerLabel\" formControlName=\"headerLabel\" />\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('headerLabel')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('headerLabel')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.hasError('required')\">\r\n Header label is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.hasError('whitespace')\">\r\n Header label cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.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 formArrayName=\"shelf\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"shelf\" class=\"mb-2\">Body: Product Capacity at each shelf</label>\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.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)=\"removeShelf();\">\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();\">\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 </div>\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\">\r\n <div class=\"shelf-container\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <p>\r\n {{ shelf.get(\"shelfType\")?.value === 'vmonly' ? 'VM ONLY SHELF' : (shelf.get(\"shelfType\")?.value || 'panel') | uppercase }}\r\n {{ i + 1 }}\r\n </p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i)\" class=\"cursor-pointer\" *ngIf=\"shelfArray.length > 1\">\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=\"shelfType\">\r\n </lib-reactive-select>\r\n <div *ngIf=\"shelf.get('shelfType')?.value === 'tray'\"\r\n class=\"d-flex justify-content-between align-items-center mt-2\">\r\n <p class=\"m-0\">No of Rows</p>\r\n <counter-input style=\"width: 40%\" formControlName=\"trayRows\" [step]=\"1\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-2\"\r\n *ngIf=\"shelf.get('shelfType')?.value !== 'vmonly'\">\r\n <label>Product capacity</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productPerShelf\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n shelf.get('shelfType')?.value !== 'vmonly' &&\r\n shelf.get('productPerShelf')?.touched &&\r\n shelf.get('productPerShelf')?.errors\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productPerShelf')?.hasError('min')\">\r\n Product capacity must be at least\r\n {{ shelf.get(\"shelfType\")?.value === \"vmonly\" ? \"0\" : \"1\" }}.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"footerLabel\" class=\"form-label mb-1\">Footer: label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"footerLabel\" formControlName=\"footerLabel\" />\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('footerLabel')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('footerLabel')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('footerLabel')?.hasError('whitespace')\">\r\n Footer label cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('footerLabel')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"cols col\">\r\n <div class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>\r\n {{ fixtureTemplateBasicDetailsForm.get(\"headerLabel\")?.value }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"shelfArray.length > 0\">\r\n <div *ngFor=\"let item of shelfArray.controls; let i = index\" class=\"shelfContainer\">\r\n @if(item.get('shelfType')?.value ==='tray'){\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('trayRows')?.value);let j=index\"\r\n class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productPerShelf')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('shelfType')?.value ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productPerShelf')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateBasicDetailsForm.get(\"footerLabel\")?.value }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-basic-details-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>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</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.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.badge.draft{color:#009bf3;background:#eaf8ff}.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}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}.footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}.sub-footer{position:relative;width:48%}\n"] }]
343
+ ], standalone: true, template: "<section id=\"fixture-template-basic-details\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <div class=\"cols col\" style=\"max-width: 380px;\">\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n\r\n <p>Template unique ID: {{ fixtureTemplateDetails?.templateIndex }}</p>\r\n\r\n <form [formGroup]=\"fixtureTemplateBasicDetailsForm\">\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"description\" class=\"form-label mb-1\">Description</label>\r\n <textarea type=\"text\" class=\"form-control\" id=\"description\" formControlName=\"description\"></textarea>\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('description')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('description')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('description')?.hasError('whitespace')\">\r\n Description cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('description')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"allowCategoryAndWidthEdit; else readonlyFixtureType\">\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label class=\"form-label mb-1\">Fixture type</label>\r\n <select class=\"form-select\" formControlName=\"fixtureCategory\">\r\n <option *ngIf=\"showOriginalCategoryOption\" [ngValue]=\"originalCategory\" hidden>{{ originalCategory }}</option>\r\n <option *ngFor=\"let cat of categoryOptions\" [ngValue]=\"cat.value\">{{ cat.label }}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label class=\"form-label mb-1\">Fixture width</label>\r\n <select class=\"form-select\" formControlName=\"fixtureWidthValue\">\r\n <option *ngIf=\"showOriginalWidthOption\" [ngValue]=\"originalWidth\" hidden>{{ originalWidthLabel }}</option>\r\n <option *ngFor=\"let w of widthOptions\" [ngValue]=\"w.value\">{{ w.label }}</option>\r\n </select>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #readonlyFixtureType>\r\n <div class=\"form-group mb-4\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"fixtureCategoryReadonly\" class=\"form-label mb-1\">Select fixture type</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategoryReadonly\"\r\n [value]=\"getFixtureLibrary()\" readonly />\r\n </div>\r\n </ng-template>\r\n\r\n <div class=\"form-group mb-4\" *ngIf=\"fixtureTemplateDetails?.header?.isEnabled\"\r\n [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"templateGroupName\" class=\"form-label mb-1\">Template Group</label>\r\n <input type=\"text\" class=\"form-control\" id=\"templateGroupName\" formControlName=\"templateGroupName\" />\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('templateGroupName')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('templateGroupName')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('templateGroupName')?.hasError('whitespace')\">\r\n Template group cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('templateGroupName')?.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=\"form-group mb-4\" *ngIf=\"zoneEditMode || fixtureTemplateDetails?.header?.isEnabled\">\r\n <label for=\"headerLabel\" class=\"form-label mb-1\">Header: label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"headerLabel\" formControlName=\"headerLabel\" />\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('headerLabel')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('headerLabel')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.hasError('required')\">\r\n Header label is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.hasError('whitespace')\">\r\n Header label cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('headerLabel')?.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 formArrayName=\"shelf\" [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"shelf\" class=\"mb-2\">Body: Product Capacity at each shelf</label>\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.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)=\"removeShelf();\">\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();\">\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 </div>\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\">\r\n <div class=\"shelf-container\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <p>\r\n {{ shelf.get(\"shelfType\")?.value === 'vmonly' ? 'VM ONLY SHELF' : (shelf.get(\"shelfType\")?.value || 'panel') | uppercase }}\r\n {{ i + 1 }}\r\n </p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i)\" class=\"cursor-pointer\" *ngIf=\"shelfArray.length > 1\">\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=\"shelfType\">\r\n </lib-reactive-select>\r\n <div *ngIf=\"shelf.get('shelfType')?.value === 'tray'\"\r\n class=\"d-flex justify-content-between align-items-center mt-2\">\r\n <p class=\"m-0\">No of Rows</p>\r\n <counter-input style=\"width: 40%\" formControlName=\"trayRows\" [step]=\"1\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-2\"\r\n *ngIf=\"shelf.get('shelfType')?.value !== 'vmonly'\">\r\n <label>Product capacity</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"productPerShelf\" [step]=\"1\"\r\n placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"\r\n shelf.get('shelfType')?.value !== 'vmonly' &&\r\n shelf.get('productPerShelf')?.touched &&\r\n shelf.get('productPerShelf')?.errors\r\n \">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productPerShelf')?.hasError('min')\">\r\n Product capacity must be at least\r\n {{ shelf.get(\"shelfType\")?.value === \"vmonly\" ? \"0\" : \"1\" }}.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n [class.disabled-click]=\"zoneEditMode\">\r\n <label for=\"footerLabel\" class=\"form-label mb-1\">Footer: label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"footerLabel\" formControlName=\"footerLabel\" />\r\n <ng-container *ngIf=\"\r\n fixtureTemplateBasicDetailsForm.get('footerLabel')?.touched &&\r\n fixtureTemplateBasicDetailsForm.get('footerLabel')?.invalid\r\n \">\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('footerLabel')?.hasError('whitespace')\">\r\n Footer label cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"fixtureTemplateBasicDetailsForm.get('footerLabel')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"cols col\">\r\n <div class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>\r\n {{ fixtureTemplateBasicDetailsForm.get(\"headerLabel\")?.value }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"shelfArray.length > 0\">\r\n <div *ngFor=\"let item of shelfArray.controls; let i = index\" class=\"shelfContainer\">\r\n @if(item.get('shelfType')?.value ==='tray'){\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('trayRows')?.value);let j=index\"\r\n class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productPerShelf')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"block shelf\" [class.vmonly-placeholder]=\"item.get('shelfType')?.value ==='vmonly'\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productPerShelf')?.value)\" class=\"product\">\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateBasicDetailsForm.get(\"footerLabel\")?.value }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-basic-details-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>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</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.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.badge.draft{color:#009bf3;background:#eaf8ff}.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}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}.footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}.sub-footer{position:relative;width:48%}\n"] }]
240
344
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.ToastService }, { type: i3.StoreBuilderService }], propDecorators: { fixtureData: [{
241
345
  type: Input
242
346
  }], editMode: [{
@@ -247,7 +351,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
247
351
  type: Input
248
352
  }], zoneEditMode: [{
249
353
  type: Input
354
+ }], libraryCategories: [{
355
+ type: Input
356
+ }], libraryByCategory: [{
357
+ type: Input
358
+ }], allowCategoryAndWidthEdit: [{
359
+ type: Input
250
360
  }], submitEvent: [{
251
361
  type: Output
252
362
  }] } });
253
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtYmFzaWMtZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2Utc3RvcmUtcGxhbm8vdGVtcGxhdGUtYmFzaWMtZGV0YWlscy90ZW1wbGF0ZS1iYXNpYy1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby90ZW1wbGF0ZS1iYXNpYy1kZXRhaWxzL3RlbXBsYXRlLWJhc2ljLWRldGFpbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBS0wsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHL0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDcEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFckUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saURBQWlELENBQUM7Ozs7OztBQWUxRixNQUFNLE9BQU8sNkJBQTZCO0lBc0I5QjtJQUNBO0lBQ0E7SUF2QlYsc0JBQXNCLENBQWdDO0lBQ3RELCtCQUErQixDQUFZO0lBRTNDLGFBQWEsR0FBWSxJQUFJLENBQUM7SUFDOUIsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUVuQixXQUFXLENBQU07SUFDakIsUUFBUSxDQUFVO0lBQ2xCLFdBQVcs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NmhCQUNuQixZQUFZLG9lQUNaLHFCQUFxQiwySUFDckIsdUJBQXVCOzs0RkFJZCw2QkFBNkI7a0JBYnpDLFNBQVM7K0JBQ0UsNEJBQTRCLFdBRzdCO3dCQUNQLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixZQUFZO3dCQUNaLHFCQUFxQjt3QkFDckIsdUJBQXVCO3FCQUN4QixjQUNXLElBQUk7NklBU1AsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1xyXG4gIEZvcm0sXHJcbiAgRm9ybUFycmF5LFxyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1Hcm91cCxcclxuICBGb3Jtc01vZHVsZSxcclxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktc2hhcmVkXCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgRml4dHVyZVRlbXBsYXRlRGV0YWlscyB9IGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL2ZpeHR1cmUtdGVtcGxhdGUuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENvdW50ZXJJbnB1dENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb3VudGVyLWlucHV0L2NvdW50ZXItaW5wdXQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IGdlbmVyYWxWYWxpZGF0b3IgfSBmcm9tIFwiLi4vLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duSUYgfSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9wbGFuby1nZW5lcmFsLmludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9yZWFjdGl2ZS1zZWxlY3QvcmVhY3RpdmUtc2VsZWN0LmNvbXBvbmVudFwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwibGliLWluc3RhbmNlLWJhc2ljLWRldGFpbHNcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3RlbXBsYXRlLWJhc2ljLWRldGFpbHMuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL3RlbXBsYXRlLWJhc2ljLWRldGFpbHMuY29tcG9uZW50LnNjc3NcIixcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBDb3VudGVySW5wdXRDb21wb25lbnQsXHJcbiAgICBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCxcclxuICBdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbnN0YW5jZUJhc2ljRGV0YWlsc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzOiBGaXh0dXJlVGVtcGxhdGVEZXRhaWxzIHwgbnVsbDtcclxuICBmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGlzUGFnZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgZml4dHVyZURhdGE6IGFueTtcclxuICBASW5wdXQoKSBlZGl0TW9kZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBpc1N1Ym1pdHRlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSByZXZlcnRPbkVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSB6b25lRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgc3VibWl0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgaW5pdGlhbFN0YXRlOiBhbnkgPSAwO1xyXG5cclxuICByZWFkb25seSBzaGVsZlR5cGVzOiBEcm9wZG93bklGW10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIlNoZWxmXCIsIHZhbHVlOiBcInNoZWxmXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiVHJheVwiLCB2YWx1ZTogXCJ0cmF5XCIgfSxcclxuICAgIHsgbGFiZWw6IFwiVk0gT25seVwiLCB2YWx1ZTogXCJ2bW9ubHlcIiB9LFxyXG4gIF07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JlQnVpbGRlclNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzW1wiZml4dHVyZURhdGFcIl0pIHtcclxuICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzID0gY2hhbmdlc1tcImZpeHR1cmVEYXRhXCJdLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbXCJlZGl0TW9kZVwiXSkge1xyXG4gICAgICB0aGlzLmlzRWRpdE1vZGUgPSBjaGFuZ2VzW1wiZWRpdE1vZGVcIl0uY3VycmVudFZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5pc0VkaXRNb2RlKSB7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1tcImlzU3VibWl0dGVkXCJdKSB7XHJcbiAgICAgIGlmIChjaGFuZ2VzW1wiaXNTdWJtaXR0ZWRcIl0uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zdWJtaXRGb3JtKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVGb3JtKCkge1xyXG4gICAgdGhpcy5maXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGRlc2NyaXB0aW9uOiBbXHJcbiAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5kZXNjcmlwdGlvbiA/PyBcIlwiLFxyXG4gICAgICAgIGdlbmVyYWxWYWxpZGF0b3IoKSxcclxuICAgICAgXSxcclxuICAgICAgZml4dHVyZUNhdGVnb3J5OiBbdGhpcy5nZXRGaXh0dXJlTGlicmFyeSgpLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgaGVhZGVyTGFiZWw6IFtcclxuICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8ubGFiZWwsXHJcbiAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGdlbmVyYWxWYWxpZGF0b3IoKV0sXHJcbiAgICAgIF0sXHJcbiAgICAgIHNoZWxmOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgZm9vdGVyTGFiZWw6IFtcclxuICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8ubGFiZWwsXHJcbiAgICAgICAgZ2VuZXJhbFZhbGlkYXRvcigpLFxyXG4gICAgICBdLFxyXG4gICAgICB0ZW1wbGF0ZUdyb3VwTmFtZTogW1xyXG4gICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8udGVtcGxhdGVHcm91cE5hbWUsXHJcbiAgICAgICAgZ2VuZXJhbFZhbGlkYXRvcigpLFxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8uZm9yRWFjaCgoaSkgPT4gdGhpcy5hZGRTaGVsZihpKSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzRWRpdE1vZGUpXHJcbiAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB0aGlzLmlzUGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGFkZFNoZWxmKHNoZWxmPzogYW55KSB7XHJcbiAgICBjb25zdCBzaGVsZkdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHNoZWxmVHlwZTogW3NoZWxmPy5zaGVsZlR5cGUgPz8gXCJzaGVsZlwiXSxcclxuICAgICAgcHJvZHVjdFBlclNoZWxmOiBbc2hlbGY/LnByb2R1Y3RQZXJTaGVsZiA/PyAxXSxcclxuICAgICAgdHJheVJvd3M6IFtzaGVsZj8udHJheVJvd3MgPz8gMV0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMudXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKFxyXG4gICAgICBzaGVsZkdyb3VwLFxyXG4gICAgICBzaGVsZkdyb3VwLmdldChcInNoZWxmVHlwZVwiKT8udmFsdWVcclxuICAgICk7XHJcbiAgICB0aGlzLnNldHVwU2hlbGZUeXBlTGlzdGVuZXIoc2hlbGZHcm91cCk7XHJcbiAgICB0aGlzLnNoZWxmQXJyYXkucHVzaChzaGVsZkdyb3VwKTtcclxuICB9XHJcblxyXG4gIHNldHVwU2hlbGZUeXBlTGlzdGVuZXIoc2hlbGZHcm91cDogRm9ybUdyb3VwKSB7XHJcbiAgICBsZXQgcHJldmlvdXNUeXBlID0gc2hlbGZHcm91cC5nZXQoXCJzaGVsZlR5cGVcIik/LnZhbHVlO1xyXG4gICAgc2hlbGZHcm91cC5nZXQoXCJzaGVsZlR5cGVcIik/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHR5cGUpID0+IHtcclxuICAgICAgY29uc3QgcHJvZHVjdFBlclNoZWxmQ29udHJvbCA9IHNoZWxmR3JvdXAuZ2V0KFwicHJvZHVjdFBlclNoZWxmXCIpO1xyXG4gICAgICBpZiAodHlwZSA9PT0gXCJ2bW9ubHlcIikge1xyXG4gICAgICAgIHByb2R1Y3RQZXJTaGVsZkNvbnRyb2w/LnNldFZhbHVlKDApO1xyXG4gICAgICB9IGVsc2UgaWYgKHByZXZpb3VzVHlwZSA9PT0gXCJ2bW9ubHlcIikge1xyXG4gICAgICAgIHByb2R1Y3RQZXJTaGVsZkNvbnRyb2w/LnNldFZhbHVlKDEpO1xyXG4gICAgICB9XHJcbiAgICAgIHByZXZpb3VzVHlwZSA9IHR5cGU7XHJcblxyXG4gICAgICB0aGlzLnVwZGF0ZVByb2R1Y3RQZXJTaGVsZk1pblZhbGlkYXRvcihzaGVsZkdyb3VwLCB0eXBlKTtcclxuICAgICAgY29uc3Qgbm9PZlJvd3NDb250cm9sID0gc2hlbGZHcm91cC5nZXQoXCJub09mUm93c1wiKTtcclxuICAgICAgaWYgKHR5cGUgPT09IFwidHJheVwiKSB7XHJcbiAgICAgICAgbm9PZlJvd3NDb250cm9sPy5zZXRWYWxpZGF0b3JzKFtcclxuICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICBWYWxpZGF0b3JzLm1pbigxKSxcclxuICAgICAgICBdKTtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbHVlKDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgbm9PZlJvd3NDb250cm9sPy5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgfVxyXG4gICAgICBub09mUm93c0NvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKHNoZWxmR3JvdXA6IEZvcm1Hcm91cCwgc2hlbGZUeXBlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHByb2R1Y3RQZXJTaGVsZkNvbnRyb2wgPSBzaGVsZkdyb3VwLmdldChcInByb2R1Y3RQZXJTaGVsZlwiKTtcclxuICAgIGNvbnN0IG1pblZhbHVlID0gc2hlbGZUeXBlID09PSBcInZtb25seVwiID8gMCA6IDE7XHJcblxyXG4gICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5taW4obWluVmFsdWUpXSk7XHJcbiAgICBwcm9kdWN0UGVyU2hlbGZDb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICB9XHJcblxyXG4gIC8vIElmIGluZGV4IGlzIG5vdCBnaXZlbiwgbGFzdCBzaGVsZiBzaG91bGQgYmUgcmVtb3ZlZFxyXG4gIHJlbW92ZVNoZWxmKGluZGV4OiBudW1iZXIgPSB0aGlzLnNoZWxmQXJyYXkuY29udHJvbHMubGVuZ3RoIC0gMSkge1xyXG4gICAgdGhpcy5zaGVsZkFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICB9XHJcblxyXG4gIGdldCBzaGVsZkFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5maXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLmdldChcInNoZWxmXCIpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbFByb2R1Y3RDYXBhY2l0eSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hlbGZBcnJheS5jb250cm9scy5yZWR1Y2UoKHRvdGFsLCBpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvdW50ID0gaXRlbS5nZXQoXCJwcm9kdWN0UGVyU2hlbGZcIik/LnZhbHVlIHx8IDA7XHJcbiAgICAgIGNvbnN0IGlzVHJheSA9IGl0ZW0uZ2V0KFwic2hlbGZUeXBlXCIpPy52YWx1ZSA9PT0gXCJ0cmF5XCI7XHJcbiAgICAgIGNvbnN0IHJvd3MgPSBpdGVtLmdldChcInRyYXlSb3dzXCIpPy52YWx1ZSB8fCAxO1xyXG5cclxuICAgICAgLy8gSWYgdGhlIGZpeHR1cmUgaXMgYSBmbG9vciBwYW5lbCBvciB0cmF5LCB3ZSBuZWVkIHRvIG11bHRpcGx5IHRoZSBwcm9kdWN0IGNhcGFjaXR5IGJ5IHRoZSBudW1iZXIgb2Ygcm93c1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHRvdGFsICtcclxuICAgICAgICAoaXNUcmF5IHx8IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09IFwiZmxvb3JcIlxyXG4gICAgICAgICAgPyBjb3VudCAqIHJvd3NcclxuICAgICAgICAgIDogY291bnQpXHJcbiAgICAgICk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHN1Ym1pdEZvcm0oKSB7XHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscykgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLmZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uaW52YWxpZCkge1xyXG4gICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXCJGb3JtIGlzIGludmFsaWRcIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGVGaXh0dXJlRGF0YSgpO1xyXG4gICAgICBjb25zdCBwYXlsb2FkOiBGaXh0dXJlVGVtcGxhdGVEZXRhaWxzID0ge1xyXG4gICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyxcclxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5maXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLnZhbHVlLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgIGhlYWRlcjoge1xyXG4gICAgICAgICAgLi4udGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLmhlYWRlcixcclxuICAgICAgICAgIGxhYmVsOiB0aGlzLmZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0udmFsdWUuaGVhZGVyTGFiZWwsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBmb290ZXI6IHtcclxuICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5mb290ZXIsXHJcbiAgICAgICAgICBsYWJlbDogdGhpcy5maXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLnZhbHVlLmZvb3RlckxhYmVsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZml4dHVyZUNhcGFjaXR5OiB0aGlzLnRvdGFsUHJvZHVjdENhcGFjaXR5LFxyXG4gICAgICAgIHRlbXBsYXRlR3JvdXBOYW1lOlxyXG4gICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLnZhbHVlLnRlbXBsYXRlR3JvdXBOYW1lLFxyXG4gICAgICAgIHNoZWxmQ29uZmlnOiB0aGlzLmZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0udmFsdWUuc2hlbGYubWFwKFxyXG4gICAgICAgICAgKGVsZTogYW55LCBpbmRleDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGVsZS5zaGVsZk51bWJlciA9IGluZGV4ICsgMTtcclxuICAgICAgICAgICAgZWxlID0ge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXM/LmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5baW5kZXhdLFxyXG4gICAgICAgICAgICAgIC4uLmVsZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYgKCFlbGU/LnByb2R1Y3RCcmFuZE5hbWUpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcz8uZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc/LltpbmRleCAtIDFdKSB7XHJcbiAgICAgICAgICAgICAgICBlbGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXM/LmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5baW5kZXggLSAxXSxcclxuICAgICAgICAgICAgICAgICAgLi4uZWxlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGVsZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApLFxyXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoRGF0ZS5ub3coKSkudG9JU09TdHJpbmcoKSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHJlcSA9IHtcclxuICAgICAgICBmaXh0dXJlSWQ6IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5faWQsXHJcbiAgICAgICAgZGF0YTogcGF5bG9hZCxcclxuICAgICAgICAuLi4oIXRoaXMuZml4dHVyZURhdGE/LnRhc2tUeXBlICYmIHtcclxuICAgICAgICAgIGVkaXRNb2RlOiB0aGlzLmlzRWRpdE1vZGUsXHJcbiAgICAgICAgICByZXZlcnRPbkVkaXQ6IHRoaXMucmV2ZXJ0T25FZGl0LFxyXG4gICAgICAgIH0pLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZVN0b3JlRml4dHVyZShyZXEpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzPy5kYXRhPy5pZCkge1xyXG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBGaXh0dXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCB0ZW1wbGF0ZSBpcyBjcmVhdGVkIDxhIGhyZWY9J21hbmFnZS9wbGFub2dyYW0vZml4dHVyZS10ZW1wbGF0ZS9iYXNpYy1kZXRhaWxzP3RlbXBsYXRlSWQ9JHtyZXMuZGF0YS5pZH0maXNFZGl0PWZhbHNlJz5WaWV3PC9hPmA7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KG1lc3NhZ2UpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoXCJGaXh0dXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zdWJtaXRFdmVudC5lbWl0KHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVGaXh0dXJlRGF0YSgpIHtcclxuICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8udm1Db25maWc/LmZvckVhY2goKHZtKSA9PiB7XHJcbiAgICAgIGlmICgodm0/LnN0YXJ0WVBvc2l0aW9uID8/IDEpID4gKHRoaXMuc2hlbGZBcnJheS5sZW5ndGggPz8gMSkpIHtcclxuICAgICAgICB2bS5zdGFydFlQb3NpdGlvbiA9IHRoaXMuc2hlbGZBcnJheS5sZW5ndGggPz8gMTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCh2bT8uZW5kWVBvc2l0aW9uID8/IDEpID4gKHRoaXMuc2hlbGZBcnJheS5sZW5ndGggPz8gMSkpIHtcclxuICAgICAgICB2bS5lbmRZUG9zaXRpb24gPSB0aGlzLnNoZWxmQXJyYXkubGVuZ3RoID8/IDE7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2hlbGZUaXRsZShzaGVsZjogRm9ybUdyb3VwLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNoZWxmVHlwZSA9IHNoZWxmLmdldChcInNoZWxmVHlwZVwiKT8udmFsdWUgPz8gXCJwYW5lbFwiO1xyXG4gICAgY29uc3QgbGFiZWwgPVxyXG4gICAgICBzaGVsZlR5cGUgPT09IFwidm1vbmx5XCIgPyBcInZtb25seSBTSEVMRlwiIDogU3RyaW5nKHNoZWxmVHlwZSkudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgICByZXR1cm4gYCR7bGFiZWx9ICR7aW5kZXggKyAxfWA7XHJcbiAgfVxyXG5cclxuICBnZXRGaXh0dXJlTGlicmFyeSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZCA9IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscztcclxuICAgIHJldHVybiBgJHtkPy5maXh0dXJlQ2F0ZWdvcnl9ICR7ZD8uZml4dHVyZVdpZHRoPy52YWx1ZX0gJHtkPy5maXh0dXJlV2lkdGg/LnVuaXR9YDtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJtaXRFdmVudC5lbWl0KHRoaXMuZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS52YWx1ZSk7XHJcbiAgfVxyXG59XHJcbiIsIjxzZWN0aW9uIGlkPVwiZml4dHVyZS10ZW1wbGF0ZS1iYXNpYy1kZXRhaWxzXCIgKm5nSWY9XCIhaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sXCIgc3R5bGU9XCJtYXgtd2lkdGg6IDM4MHB4O1wiPlxyXG4gICAgICA8aDI+Rml4dHVyZSBEZXRhaWxzPC9oMj5cclxuICAgICAgPHA+Q29uZmlndXJlIHlvdXIgZml4dHVyZSBkZXRhaWxzIGhlcmU8L3A+XHJcblxyXG4gICAgICA8cD5UZW1wbGF0ZSB1bmlxdWUgSUQ6IHt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnRlbXBsYXRlSW5kZXggfX08L3A+XHJcblxyXG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cInpvbmVFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImRlc2NyaXB0aW9uXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5EZXNjcmlwdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgICA8dGV4dGFyZWEgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZGVzY3JpcHRpb25cIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICBmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLmdldCgnZGVzY3JpcHRpb24nKT8uaW52YWxpZFxyXG4gICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBjYW5ub3QgYmUgb25seSB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLmdldCgnZGVzY3JpcHRpb24nKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJ6b25lRWRpdE1vZGVcIj5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlNlbGVjdCBmaXh0dXJlIHR5cGU8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImhlYWRlckxhYmVsXCIgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZUNhdGVnb3J5XCIgcmVhZG9ubHkgLz5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5pc0VuYWJsZWRcIlxyXG4gICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cInpvbmVFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInRlbXBsYXRlR3JvdXBOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5UZW1wbGF0ZSBHcm91cDwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwidGVtcGxhdGVHcm91cE5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJ0ZW1wbGF0ZUdyb3VwTmFtZVwiIC8+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5nZXQoJ3RlbXBsYXRlR3JvdXBOYW1lJyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICBmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLmdldCgndGVtcGxhdGVHcm91cE5hbWUnKT8uaW52YWxpZFxyXG4gICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5nZXQoJ3RlbXBsYXRlR3JvdXBOYW1lJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICBUZW1wbGF0ZSBncm91cCBjYW5ub3QgYmUgb25seSB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLmdldCgndGVtcGxhdGVHcm91cE5hbWUnKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG1iLTRcIiAqbmdJZj1cInpvbmVFZGl0TW9kZSB8fCBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmlzRW5hYmxlZFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImhlYWRlckxhYmVsXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5IZWFkZXI6IGxhYmVsPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJoZWFkZXJMYWJlbFwiIGZvcm1Db250cm9sTmFtZT1cImhlYWRlckxhYmVsXCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICBmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLmdldCgnaGVhZGVyTGFiZWwnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgIGZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KCdoZWFkZXJMYWJlbCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLmdldCgnaGVhZGVyTGFiZWwnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBIZWFkZXIgbGFiZWwgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KCdoZWFkZXJMYWJlbCcpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgSGVhZGVyIGxhYmVsIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KCdoZWFkZXJMYWJlbCcpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwic2hlbGZcIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiem9uZUVkaXRNb2RlXCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwic2hlbGZcIiBjbGFzcz1cIm1iLTJcIj5Cb2R5OiBQcm9kdWN0IENhcGFjaXR5IGF0IGVhY2ggc2hlbGY8L2xhYmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbD5ObyBvZiBzaGVsdmVzPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1jb250YWluZXJcIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgcm9sZT1cImJ1dHRvblwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTUgMTRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiAoY2xpY2spPVwicmVtb3ZlU2hlbGYoKTtcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjc2Mjk0IDdIMTEuOTI5NlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBzaGVsZkFycmF5Lmxlbmd0aCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzdmcgcm9sZT1cImJ1dHRvblwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTUgMTRcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiAoY2xpY2spPVwiYWRkU2hlbGYoKTtcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjE1Mzg5IDIuOTE2NVYxMS4wODMyTTMuMDcwNTYgNi45OTk4NEgxMS4yMzcyXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNoZWxmIG9mIHNoZWxmQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hlbGYtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHNoZWxmLmdldChcInNoZWxmVHlwZVwiKT8udmFsdWUgPT09ICd2bW9ubHknID8gJ1ZNIE9OTFkgU0hFTEYnIDogKHNoZWxmLmdldChcInNoZWxmVHlwZVwiKT8udmFsdWUgfHwgJ3BhbmVsJykgfCB1cHBlcmNhc2UgfX1cclxuICAgICAgICAgICAgICAgICAge3sgaSArIDEgfX1cclxuICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTaGVsZihpKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cInNoZWxmQXJyYXkubGVuZ3RoID4gMVwiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE4IDZMNiAxOE02IDZMMTggMThcIiBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwic2hlbGZUeXBlc1wiXHJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzaGVsZlR5cGVcIj5cclxuICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNoZWxmLmdldCgnc2hlbGZUeXBlJyk/LnZhbHVlID09PSAndHJheSdcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTJcIj5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibS0wXCI+Tm8gb2YgUm93czwvcD5cclxuICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cInRyYXlSb3dzXCIgW3N0ZXBdPVwiMVwiIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hlbGYuZ2V0KCdzaGVsZlR5cGUnKT8udmFsdWUgIT09ICd2bW9ubHknXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+UHJvZHVjdCBjYXBhY2l0eTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0UGVyU2hlbGZcIiBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgc2hlbGYuZ2V0KCdzaGVsZlR5cGUnKT8udmFsdWUgIT09ICd2bW9ubHknICYmXHJcbiAgICAgICAgICAgICAgICAgIHNoZWxmLmdldCgncHJvZHVjdFBlclNoZWxmJyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgc2hlbGYuZ2V0KCdwcm9kdWN0UGVyU2hlbGYnKT8uZXJyb3JzXHJcbiAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzaGVsZi5nZXQoJ3Byb2R1Y3RQZXJTaGVsZicpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgUHJvZHVjdCBjYXBhY2l0eSBtdXN0IGJlIGF0IGxlYXN0XHJcbiAgICAgICAgICAgICAgICAgIHt7IHNoZWxmLmdldChcInNoZWxmVHlwZVwiKT8udmFsdWUgPT09IFwidm1vbmx5XCIgPyBcIjBcIiA6IFwiMVwiIH19LlxyXG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiXHJcbiAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIlxyXG4gICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cInpvbmVFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImZvb3RlckxhYmVsXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5Gb290ZXI6IGxhYmVsPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJmb290ZXJMYWJlbFwiIGZvcm1Db250cm9sTmFtZT1cImZvb3RlckxhYmVsXCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICBmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLmdldCgnZm9vdGVyTGFiZWwnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgIGZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KCdmb290ZXJMYWJlbCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLmdldCgnZm9vdGVyTGFiZWwnKT8uaGFzRXJyb3IoJ3doaXRlc3BhY2UnKVwiPlxyXG4gICAgICAgICAgICAgIEZvb3RlciBsYWJlbCBjYW5ub3QgYmUgb25seSB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLmdldCgnZm9vdGVyTGFiZWwnKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZm9ybT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgIDwhLS0gVmVydGljYWwgYXJyb3dzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyB1cFwiPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgICAgICAgPHNwYW4+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udmFsdWUgfX17eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy51bml0IH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgZG93blwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPCEtLSBIb3Jpem9udGFsIGFycm93cyAtLT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udmFsdWVcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFwiPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIj5cclxuICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgIHt7IGZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KFwiaGVhZGVyTGFiZWxcIik/LnZhbHVlIH19XHJcbiAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQm9keSBibG9jayAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktYmxvY2tcIiAqbmdJZj1cInNoZWxmQXJyYXkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2hlbGZBcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwic2hlbGZDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIEBpZihpdGVtLmdldCgnc2hlbGZUeXBlJyk/LnZhbHVlID09PSd0cmF5Jyl7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ3RyYXlSb3dzJyk/LnZhbHVlKTtsZXQgaj1pbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdFBlclNoZWxmJyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsb2NrIHNoZWxmXCIgW2NsYXNzLnZtb25seS1wbGFjZWhvbGRlcl09XCJpdGVtLmdldCgnc2hlbGZUeXBlJyk/LnZhbHVlID09PSd2bW9ubHknXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdFBlclNoZWxmJyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZvb3RlciBibG9jayAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5mb290ZXI/LmlzRW5hYmxlZCAmJiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1mb290ZXIgbGVmdC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciByaWdodC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8cD57eyBmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLmdldChcImZvb3RlckxhYmVsXCIpPy52YWx1ZSB9fTwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPHNlY3Rpb24gaWQ9XCJmaXh0dXJlLXRlbXBsYXRlLWJhc2ljLWRldGFpbHMtc2tlbGV0b25cIiAqbmdJZj1cImlzUGFnZUxvYWRpbmdcIj5cclxuICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPCEtLSBDb21tb24gZGltZW5zaW9uIGFycm93cyAtLT5cclxuPG5nLXRlbXBsYXRlICNkaW1lbnNpb25BcnJvd3MgbGV0LWxhYmVsPVwibGFiZWxcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJob3Jpem9udGFsLWRpbWVuc2lvblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImFycm93IGxlZnRcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgIDxzcGFuPnt7IHZhbHVlIH19IHt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udW5pdCB9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFycm93IHJpZ2h0XCI+PC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
363
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtYmFzaWMtZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2Utc3RvcmUtcGxhbm8vdGVtcGxhdGUtYmFzaWMtZGV0YWlscy90ZW1wbGF0ZS1iYXNpYy1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL21hbmFnZS1zdG9yZS1wbGFuby90ZW1wbGF0ZS1iYXNpYy1kZXRhaWxzL3RlbXBsYXRlLWJhc2ljLWRldGFpbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBS0wsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHL0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDcEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFckUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saURBQWlELENBQUM7Ozs7OztBQWUxRixNQUFNLE9BQU8sNkJBQTZCO0lBc0M5QjtJQUNBO0lBQ0E7SUF2Q1Ysc0JBQXNCLENBQWdDO0lBQ3RELCtCQUErQixDQUFZO0lBRTNDLGFBQWEsR0FBWSxJQUFJLENBQUM7SUFDOUIsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUVuQixXQUFXLENBQU07SUFDakIsUUFBUSxDQUFVO0lBQ2xCLFdBQVcs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QUk7NklBU1AsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1xyXG4gIEZvcm0sXHJcbiAgRm9ybUFycmF5LFxyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1Hcm91cCxcclxuICBGb3Jtc01vZHVsZSxcclxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktc2hhcmVkXCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgRml4dHVyZVRlbXBsYXRlRGV0YWlscyB9IGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL2ZpeHR1cmUtdGVtcGxhdGUuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENvdW50ZXJJbnB1dENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb3VudGVyLWlucHV0L2NvdW50ZXItaW5wdXQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IGdlbmVyYWxWYWxpZGF0b3IgfSBmcm9tIFwiLi4vLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duSUYgfSBmcm9tIFwiLi4vLi4vLi4vaW50ZXJmYWNlcy9wbGFuby1nZW5lcmFsLmludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9yZWFjdGl2ZS1zZWxlY3QvcmVhY3RpdmUtc2VsZWN0LmNvbXBvbmVudFwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwibGliLWluc3RhbmNlLWJhc2ljLWRldGFpbHNcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3RlbXBsYXRlLWJhc2ljLWRldGFpbHMuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL3RlbXBsYXRlLWJhc2ljLWRldGFpbHMuY29tcG9uZW50LnNjc3NcIixcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBDb3VudGVySW5wdXRDb21wb25lbnQsXHJcbiAgICBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCxcclxuICBdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbnN0YW5jZUJhc2ljRGV0YWlsc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzOiBGaXh0dXJlVGVtcGxhdGVEZXRhaWxzIHwgbnVsbDtcclxuICBmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGlzUGFnZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgZml4dHVyZURhdGE6IGFueTtcclxuICBASW5wdXQoKSBlZGl0TW9kZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBpc1N1Ym1pdHRlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSByZXZlcnRPbkVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSB6b25lRWRpdE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBsaWJyYXJ5Q2F0ZWdvcmllczogc3RyaW5nW10gPSBbXTtcclxuICBASW5wdXQoKSBsaWJyYXJ5QnlDYXRlZ29yeTogTWFwPHN0cmluZywgU2V0PG51bWJlcj4+ID0gbmV3IE1hcCgpO1xyXG4gIEBJbnB1dCgpIGFsbG93Q2F0ZWdvcnlBbmRXaWR0aEVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgc3VibWl0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgaW5pdGlhbFN0YXRlOiBhbnkgPSAwO1xyXG5cclxuICByZWFkb25seSBzaGVsZlR5cGVzOiBEcm9wZG93bklGW10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIlNoZWxmXCIsIHZhbHVlOiBcInNoZWxmXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiVHJheVwiLCB2YWx1ZTogXCJ0cmF5XCIgfSxcclxuICAgIHsgbGFiZWw6IFwiVk0gT25seVwiLCB2YWx1ZTogXCJ2bW9ubHlcIiB9LFxyXG4gIF07XHJcblxyXG4gIGNhdGVnb3J5T3B0aW9uczogRHJvcGRvd25JRltdID0gW107XHJcbiAgd2lkdGhPcHRpb25zOiBEcm9wZG93bklGW10gPSBbXTtcclxuXHJcbiAgLy8gVGhlIGluaXRpYWwgZml4dHVyZSB2YWx1ZXMgYXJlIGRpc3BsYXllZCBhcyBhIFwiaGlkZGVuXCIgPG9wdGlvbj4gd2hlbiB0aGV5XHJcbiAgLy8gZG9uJ3QgZXhpc3QgaW4gdGhlIGxpYnJhcnkg4oCUIGtlZXBzIHRoZSB2YWx1ZSB2aXNpYmxlIGluIHRoZSBjb250cm9sJ3NcclxuICAvLyBzZWxlY3RlZCBkaXNwbGF5IGJ1dCBhYnNlbnQgZnJvbSB0aGUgZHJvcGRvd24ncyBvcGVuIGxpc3QuIENsZWFyZWQgb25jZVxyXG4gIC8vIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHZhbHVlLlxyXG4gIG9yaWdpbmFsQ2F0ZWdvcnk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIG9yaWdpbmFsV2lkdGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHNob3dPcmlnaW5hbENhdGVnb3J5T3B0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd09yaWdpbmFsV2lkdGhPcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBvcmlnaW5hbFdpZHRoTGFiZWw6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JlQnVpbGRlclNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzW1wiZml4dHVyZURhdGFcIl0pIHtcclxuICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzID0gY2hhbmdlc1tcImZpeHR1cmVEYXRhXCJdLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbXCJlZGl0TW9kZVwiXSkge1xyXG4gICAgICB0aGlzLmlzRWRpdE1vZGUgPSBjaGFuZ2VzW1wiZWRpdE1vZGVcIl0uY3VycmVudFZhbHVlO1xyXG4gICAgICBpZiAodGhpcy5pc0VkaXRNb2RlKSB7XHJcbiAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1tcImlzU3VibWl0dGVkXCJdKSB7XHJcbiAgICAgIGlmIChjaGFuZ2VzW1wiaXNTdWJtaXR0ZWRcIl0uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zdWJtaXRGb3JtKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgY2hhbmdlc1tcImZpeHR1cmVEYXRhXCJdIHx8XHJcbiAgICAgIGNoYW5nZXNbXCJsaWJyYXJ5Q2F0ZWdvcmllc1wiXSB8fFxyXG4gICAgICBjaGFuZ2VzW1wibGlicmFyeUJ5Q2F0ZWdvcnlcIl1cclxuICAgICkge1xyXG4gICAgICB0aGlzLnJlY29tcHV0ZUNhdGVnb3J5T3B0aW9ucygpO1xyXG4gICAgICB0aGlzLnJlY29tcHV0ZVdpZHRoT3B0aW9ucyhcclxuICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0/LmdldChcImZpeHR1cmVDYXRlZ29yeVwiKT8udmFsdWUsXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMudXBkYXRlT3JpZ2luYWxPcHRpb25WaXNpYmlsaXR5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU9yaWdpbmFsT3B0aW9uVmlzaWJpbGl0eSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2hvd09yaWdpbmFsQ2F0ZWdvcnlPcHRpb24gPVxyXG4gICAgICAhIXRoaXMub3JpZ2luYWxDYXRlZ29yeSAmJlxyXG4gICAgICAhdGhpcy5saWJyYXJ5Q2F0ZWdvcmllcz8uaW5jbHVkZXModGhpcy5vcmlnaW5hbENhdGVnb3J5KTtcclxuXHJcbiAgICB0aGlzLnNob3dPcmlnaW5hbFdpZHRoT3B0aW9uID1cclxuICAgICAgdGhpcy5vcmlnaW5hbFdpZHRoICE9IG51bGwgJiZcclxuICAgICAgIXRoaXMud2lkdGhPcHRpb25zLnNvbWUoKHcpID0+IHcudmFsdWUgPT09IHRoaXMub3JpZ2luYWxXaWR0aCk7XHJcblxyXG4gICAgaWYgKHRoaXMub3JpZ2luYWxXaWR0aCAhPSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IHdpZHRoVW5pdCA9XHJcbiAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlV2lkdGg/LnVuaXQgPz8gXCJcIjtcclxuICAgICAgdGhpcy5vcmlnaW5hbFdpZHRoTGFiZWwgPSBgJHt0aGlzLm9yaWdpbmFsV2lkdGh9ICR7d2lkdGhVbml0fWAudHJpbSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcmlnaW5hbFdpZHRoTGFiZWwgPSBcIlwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ2F0ZWdvcnkgZHJvcGRvd24gaXMgc3RyaWN0bHkgbGlicmFyeSB2YWx1ZXMg4oCUIGlmIHRoZSBmaXh0dXJlJ3MgY3VycmVudFxyXG4gIC8vIGNhdGVnb3J5IGlzbid0IGluIHRoZSBsaWJyYXJ5LCBpdCB3b24ndCBhcHBlYXIgaGVyZTsgdGhlIGRyb3Bkb3duIHdpbGxcclxuICAvLyByZW5kZXIgdW5zZWxlY3RlZCB0byBmb3JjZSB0aGUgdXNlciB0byBwaWNrIGEgdmFsaWQgb25lLlxyXG4gIHByaXZhdGUgcmVjb21wdXRlQ2F0ZWdvcnlPcHRpb25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jYXRlZ29yeU9wdGlvbnMgPSAodGhpcy5saWJyYXJ5Q2F0ZWdvcmllcyA/PyBbXSlcclxuICAgICAgLnNsaWNlKClcclxuICAgICAgLnNvcnQoKVxyXG4gICAgICAubWFwKChjKSA9PiAoeyBsYWJlbDogYywgdmFsdWU6IGMgfSkpO1xyXG4gIH1cclxuXHJcbiAgLy8gV2lkdGggZHJvcGRvd24gaXMgZmlsdGVyZWQgdG8gd2lkdGhzIGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnRseS1zZWxlY3RlZFxyXG4gIC8vIGNhdGVnb3J5IGluIHRoZSBmb3JtLiBJZiBubyBjYXRlZ29yeSBpcyBzZWxlY3RlZCAob3IgaXQncyBub3QgaW4gdGhlXHJcbiAgLy8gbGlicmFyeSksIG5vIHdpZHRoIG9wdGlvbnMgYXJlIHNob3duLlxyXG4gIHByaXZhdGUgcmVjb21wdXRlV2lkdGhPcHRpb25zKHNlbGVjdGVkQ2F0ZWdvcnk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHdpZHRoVW5pdCA9IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy51bml0ID8/IFwiXCI7XHJcbiAgICBjb25zdCB3aWR0aHMgPSBzZWxlY3RlZENhdGVnb3J5XHJcbiAgICAgID8gdGhpcy5saWJyYXJ5QnlDYXRlZ29yeT8uZ2V0KHNlbGVjdGVkQ2F0ZWdvcnkpXHJcbiAgICAgIDogbnVsbDtcclxuICAgIGlmICghd2lkdGhzKSB7XHJcbiAgICAgIHRoaXMud2lkdGhPcHRpb25zID0gW107XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMud2lkdGhPcHRpb25zID0gQXJyYXkuZnJvbSh3aWR0aHMpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhIC0gYilcclxuICAgICAgLm1hcCgodykgPT4gKHsgbGFiZWw6IGAke3d9ICR7d2lkdGhVbml0fWAudHJpbSgpLCB2YWx1ZTogdyB9KSk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRm9ybSgpIHtcclxuICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBkZXNjcmlwdGlvbjogW1xyXG4gICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZGVzY3JpcHRpb24gPz8gXCJcIixcclxuICAgICAgICBnZW5lcmFsVmFsaWRhdG9yKCksXHJcbiAgICAgIF0sXHJcbiAgICAgIGZpeHR1cmVDYXRlZ29yeTogW1xyXG4gICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUNhdGVnb3J5ID8/IG51bGwsXHJcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgXSxcclxuICAgICAgZml4dHVyZVdpZHRoVmFsdWU6IFtcclxuICAgICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udmFsdWUgPz8gbnVsbCxcclxuICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBdLFxyXG4gICAgICBoZWFkZXJMYWJlbDogW1xyXG4gICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5sYWJlbCxcclxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgZ2VuZXJhbFZhbGlkYXRvcigpXSxcclxuICAgICAgXSxcclxuICAgICAgc2hlbGY6IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBmb290ZXJMYWJlbDogW1xyXG4gICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5sYWJlbCxcclxuICAgICAgICBnZW5lcmFsVmFsaWRhdG9yKCksXHJcbiAgICAgIF0sXHJcbiAgICAgIHRlbXBsYXRlR3JvdXBOYW1lOiBbXHJcbiAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy50ZW1wbGF0ZUdyb3VwTmFtZSxcclxuICAgICAgICBnZW5lcmFsVmFsaWRhdG9yKCksXHJcbiAgICAgIF0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5mb3JFYWNoKChpKSA9PiB0aGlzLmFkZFNoZWxmKGkpKTtcclxuXHJcbiAgICB0aGlzLm9yaWdpbmFsQ2F0ZWdvcnkgPVxyXG4gICAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVDYXRlZ29yeSA/PyBudWxsO1xyXG4gICAgdGhpcy5vcmlnaW5hbFdpZHRoID1cclxuICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlV2lkdGg/LnZhbHVlID8/IG51bGw7XHJcbiAgICB0aGlzLnVwZGF0ZU9yaWdpbmFsT3B0aW9uVmlzaWJpbGl0eSgpO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybVxyXG4gICAgICAuZ2V0KFwiZml4dHVyZUNhdGVnb3J5XCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoY2F0ZWdvcnk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmIChjYXRlZ29yeSAhPT0gdGhpcy5vcmlnaW5hbENhdGVnb3J5KSB7XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsQ2F0ZWdvcnkgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlY29tcHV0ZVdpZHRoT3B0aW9ucyhjYXRlZ29yeSk7XHJcbiAgICAgICAgY29uc3Qgd2lkdGhDb250cm9sID1cclxuICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5nZXQoXCJmaXh0dXJlV2lkdGhWYWx1ZVwiKTtcclxuICAgICAgICBjb25zdCBjdXJyZW50V2lkdGggPSB3aWR0aENvbnRyb2w/LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IHZhbGlkV2lkdGhzID0gY2F0ZWdvcnkgPyB0aGlzLmxpYnJhcnlCeUNhdGVnb3J5Py5nZXQoY2F0ZWdvcnkpIDogbnVsbDtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBjdXJyZW50V2lkdGggIT0gbnVsbCAmJlxyXG4gICAgICAgICAgKCF2YWxpZFdpZHRocyB8fCAhdmFsaWRXaWR0aHMuaGFzKGN1cnJlbnRXaWR0aCkpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB3aWR0aENvbnRyb2w/LnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwZGF0ZU9yaWdpbmFsT3B0aW9uVmlzaWJpbGl0eSgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm1cclxuICAgICAgLmdldChcImZpeHR1cmVXaWR0aFZhbHVlXCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgod2lkdGg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGlmICh3aWR0aCAhPT0gdGhpcy5vcmlnaW5hbFdpZHRoKSB7XHJcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsV2lkdGggPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwZGF0ZU9yaWdpbmFsT3B0aW9uVmlzaWJpbGl0eSgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNFZGl0TW9kZSlcclxuICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYWRkU2hlbGYoc2hlbGY/OiBhbnkpIHtcclxuICAgIGNvbnN0IHNoZWxmR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgc2hlbGZUeXBlOiBbc2hlbGY/LnNoZWxmVHlwZSA/PyBcInNoZWxmXCJdLFxyXG4gICAgICBwcm9kdWN0UGVyU2hlbGY6IFtzaGVsZj8ucHJvZHVjdFBlclNoZWxmID8/IDFdLFxyXG4gICAgICB0cmF5Um93czogW3NoZWxmPy50cmF5Um93cyA/PyAxXSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVQcm9kdWN0UGVyU2hlbGZNaW5WYWxpZGF0b3IoXHJcbiAgICAgIHNoZWxmR3JvdXAsXHJcbiAgICAgIHNoZWxmR3JvdXAuZ2V0KFwic2hlbGZUeXBlXCIpPy52YWx1ZVxyXG4gICAgKTtcclxuICAgIHRoaXMuc2V0dXBTaGVsZlR5cGVMaXN0ZW5lcihzaGVsZkdyb3VwKTtcclxuICAgIHRoaXMuc2hlbGZBcnJheS5wdXNoKHNoZWxmR3JvdXApO1xyXG4gIH1cclxuXHJcbiAgc2V0dXBTaGVsZlR5cGVMaXN0ZW5lcihzaGVsZkdyb3VwOiBGb3JtR3JvdXApIHtcclxuICAgIGxldCBwcmV2aW91c1R5cGUgPSBzaGVsZkdyb3VwLmdldChcInNoZWxmVHlwZVwiKT8udmFsdWU7XHJcbiAgICBzaGVsZkdyb3VwLmdldChcInNoZWxmVHlwZVwiKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodHlwZSkgPT4ge1xyXG4gICAgICBjb25zdCBwcm9kdWN0UGVyU2hlbGZDb250cm9sID0gc2hlbGZHcm91cC5nZXQoXCJwcm9kdWN0UGVyU2hlbGZcIik7XHJcbiAgICAgIGlmICh0eXBlID09PSBcInZtb25seVwiKSB7XHJcbiAgICAgICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsdWUoMCk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNUeXBlID09PSBcInZtb25seVwiKSB7XHJcbiAgICAgICAgcHJvZHVjdFBlclNoZWxmQ29udHJvbD8uc2V0VmFsdWUoMSk7XHJcbiAgICAgIH1cclxuICAgICAgcHJldmlvdXNUeXBlID0gdHlwZTtcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlUHJvZHVjdFBlclNoZWxmTWluVmFsaWRhdG9yKHNoZWxmR3JvdXAsIHR5cGUpO1xyXG4gICAgICBjb25zdCBub09mUm93c0NvbnRyb2wgPSBzaGVsZkdyb3VwLmdldChcIm5vT2ZSb3dzXCIpO1xyXG4gICAgICBpZiAodHlwZSA9PT0gXCJ0cmF5XCIpIHtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbGlkYXRvcnMoW1xyXG4gICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgIFZhbGlkYXRvcnMubWluKDEpLFxyXG4gICAgICAgIF0pO1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uc2V0VmFsdWUoMSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbm9PZlJvd3NDb250cm9sPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIG5vT2ZSb3dzQ29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQcm9kdWN0UGVyU2hlbGZNaW5WYWxpZGF0b3Ioc2hlbGZHcm91cDogRm9ybUdyb3VwLCBzaGVsZlR5cGU6IHN0cmluZykge1xyXG4gICAgY29uc3QgcHJvZHVjdFBlclNoZWxmQ29udHJvbCA9IHNoZWxmR3JvdXAuZ2V0KFwicHJvZHVjdFBlclNoZWxmXCIpO1xyXG4gICAgY29uc3QgbWluVmFsdWUgPSBzaGVsZlR5cGUgPT09IFwidm1vbmx5XCIgPyAwIDogMTtcclxuXHJcbiAgICBwcm9kdWN0UGVyU2hlbGZDb250cm9sPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLm1pbihtaW5WYWx1ZSldKTtcclxuICAgIHByb2R1Y3RQZXJTaGVsZkNvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gSWYgaW5kZXggaXMgbm90IGdpdmVuLCBsYXN0IHNoZWxmIHNob3VsZCBiZSByZW1vdmVkXHJcbiAgcmVtb3ZlU2hlbGYoaW5kZXg6IG51bWJlciA9IHRoaXMuc2hlbGZBcnJheS5jb250cm9scy5sZW5ndGggLSAxKSB7XHJcbiAgICB0aGlzLnNoZWxmQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNoZWxmQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KFwic2hlbGZcIikgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvdGFsUHJvZHVjdENhcGFjaXR5KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5zaGVsZkFycmF5LmNvbnRyb2xzLnJlZHVjZSgodG90YWwsIGl0ZW0pID0+IHtcclxuICAgICAgY29uc3QgY291bnQgPSBpdGVtLmdldChcInByb2R1Y3RQZXJTaGVsZlwiKT8udmFsdWUgfHwgMDtcclxuICAgICAgY29uc3QgaXNUcmF5ID0gaXRlbS5nZXQoXCJzaGVsZlR5cGVcIik/LnZhbHVlID09PSBcInRyYXlcIjtcclxuICAgICAgY29uc3Qgcm93cyA9IGl0ZW0uZ2V0KFwidHJheVJvd3NcIik/LnZhbHVlIHx8IDE7XHJcblxyXG4gICAgICAvLyBJZiB0aGUgZml4dHVyZSBpcyBhIGZsb29yIHBhbmVsIG9yIHRyYXksIHdlIG5lZWQgdG8gbXVsdGlwbHkgdGhlIHByb2R1Y3QgY2FwYWNpdHkgYnkgdGhlIG51bWJlciBvZiByb3dzXHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdG90YWwgK1xyXG4gICAgICAgIChpc1RyYXkgfHwgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlVHlwZSA9PT0gXCJmbG9vclwiXHJcbiAgICAgICAgICA/IGNvdW50ICogcm93c1xyXG4gICAgICAgICAgOiBjb3VudClcclxuICAgICAgKTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0Rm9ybSgpIHtcclxuICAgIGlmICghdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzKSByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChcIkZvcm0gaXMgaW52YWxpZFwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0udmFsaWQpIHtcclxuICAgICAgdGhpcy52YWxpZGF0ZUZpeHR1cmVEYXRhKCk7XHJcbiAgICAgIGNvbnN0IHBheWxvYWQ6IEZpeHR1cmVUZW1wbGF0ZURldGFpbHMgPSB7XHJcbiAgICAgICAgLi4udGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0udmFsdWUuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgLi4uKHRoaXMuYWxsb3dDYXRlZ29yeUFuZFdpZHRoRWRpdCAmJiB7XHJcbiAgICAgICAgICBmaXh0dXJlQ2F0ZWdvcnk6XHJcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS52YWx1ZS5maXh0dXJlQ2F0ZWdvcnksXHJcbiAgICAgICAgICBmaXh0dXJlV2lkdGg6IHtcclxuICAgICAgICAgICAgLi4udGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLmZpeHR1cmVXaWR0aCxcclxuICAgICAgICAgICAgdmFsdWU6XHJcbiAgICAgICAgICAgICAgdGhpcy5maXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLnZhbHVlLmZpeHR1cmVXaWR0aFZhbHVlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KSxcclxuICAgICAgICBoZWFkZXI6IHtcclxuICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5oZWFkZXIsXHJcbiAgICAgICAgICBsYWJlbDogdGhpcy5maXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLnZhbHVlLmhlYWRlckxhYmVsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZm9vdGVyOiB7XHJcbiAgICAgICAgICAuLi50aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMuZm9vdGVyLFxyXG4gICAgICAgICAgbGFiZWw6IHRoaXMuZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS52YWx1ZS5mb290ZXJMYWJlbCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZpeHR1cmVDYXBhY2l0eTogdGhpcy50b3RhbFByb2R1Y3RDYXBhY2l0eSxcclxuICAgICAgICB0ZW1wbGF0ZUdyb3VwTmFtZTpcclxuICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS52YWx1ZS50ZW1wbGF0ZUdyb3VwTmFtZSxcclxuICAgICAgICBzaGVsZkNvbmZpZzogdGhpcy5maXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLnZhbHVlLnNoZWxmLm1hcChcclxuICAgICAgICAgIChlbGU6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBlbGUuc2hlbGZOdW1iZXIgPSBpbmRleCArIDE7XHJcbiAgICAgICAgICAgIGVsZSA9IHtcclxuICAgICAgICAgICAgICAuLi50aGlzPy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8uW2luZGV4XSxcclxuICAgICAgICAgICAgICAuLi5lbGUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmICghZWxlPy5wcm9kdWN0QnJhbmROYW1lKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXM/LmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5baW5kZXggLSAxXSkge1xyXG4gICAgICAgICAgICAgICAgZWxlID0ge1xyXG4gICAgICAgICAgICAgICAgICAuLi50aGlzPy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8uW2luZGV4IC0gMV0sXHJcbiAgICAgICAgICAgICAgICAgIC4uLmVsZSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBlbGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKSxcclxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKERhdGUubm93KCkpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCByZXEgPSB7XHJcbiAgICAgICAgZml4dHVyZUlkOiB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMuX2lkLFxyXG4gICAgICAgIGRhdGE6IHBheWxvYWQsXHJcbiAgICAgICAgLi4uKCF0aGlzLmZpeHR1cmVEYXRhPy50YXNrVHlwZSAmJiB7XHJcbiAgICAgICAgICBlZGl0TW9kZTogdGhpcy5pc0VkaXRNb2RlLFxyXG4gICAgICAgICAgcmV2ZXJ0T25FZGl0OiB0aGlzLnJldmVydE9uRWRpdCxcclxuICAgICAgICB9KSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS51cGRhdGVTdG9yZUZpeHR1cmUocmVxKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcz8uZGF0YT8uaWQpIHtcclxuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRml4dHVyZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBhbmQgdGVtcGxhdGUgaXMgY3JlYXRlZCA8YSBocmVmPSdtYW5hZ2UvcGxhbm9ncmFtL2ZpeHR1cmUtdGVtcGxhdGUvYmFzaWMtZGV0YWlscz90ZW1wbGF0ZUlkPSR7cmVzLmRhdGEuaWR9JmlzRWRpdD1mYWxzZSc+VmlldzwvYT5gO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChtZXNzYWdlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KFwiRml4dHVyZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuc3VibWl0RXZlbnQuZW1pdCh0cnVlKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbGlkYXRlRml4dHVyZURhdGEoKSB7XHJcbiAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnZtQ29uZmlnPy5mb3JFYWNoKCh2bSkgPT4ge1xyXG4gICAgICBpZiAoKHZtPy5zdGFydFlQb3NpdGlvbiA/PyAxKSA+ICh0aGlzLnNoZWxmQXJyYXkubGVuZ3RoID8/IDEpKSB7XHJcbiAgICAgICAgdm0uc3RhcnRZUG9zaXRpb24gPSB0aGlzLnNoZWxmQXJyYXkubGVuZ3RoID8/IDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgodm0/LmVuZFlQb3NpdGlvbiA/PyAxKSA+ICh0aGlzLnNoZWxmQXJyYXkubGVuZ3RoID8/IDEpKSB7XHJcbiAgICAgICAgdm0uZW5kWVBvc2l0aW9uID0gdGhpcy5zaGVsZkFycmF5Lmxlbmd0aCA/PyAxO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldFNoZWxmVGl0bGUoc2hlbGY6IEZvcm1Hcm91cCwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzaGVsZlR5cGUgPSBzaGVsZi5nZXQoXCJzaGVsZlR5cGVcIik/LnZhbHVlID8/IFwicGFuZWxcIjtcclxuICAgIGNvbnN0IGxhYmVsID1cclxuICAgICAgc2hlbGZUeXBlID09PSBcInZtb25seVwiID8gXCJ2bW9ubHkgU0hFTEZcIiA6IFN0cmluZyhzaGVsZlR5cGUpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgcmV0dXJuIGAke2xhYmVsfSAke2luZGV4ICsgMX1gO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rml4dHVyZUxpYnJhcnkoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGQgPSB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM7XHJcbiAgICByZXR1cm4gYCR7ZD8uZml4dHVyZUNhdGVnb3J5fSAke2Q/LmZpeHR1cmVXaWR0aD8udmFsdWV9ICR7ZD8uZml4dHVyZVdpZHRoPy51bml0fWA7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3VibWl0RXZlbnQuZW1pdCh0aGlzLmZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0udmFsdWUpO1xyXG4gIH1cclxufVxyXG4iLCI8c2VjdGlvbiBpZD1cImZpeHR1cmUtdGVtcGxhdGUtYmFzaWMtZGV0YWlsc1wiICpuZ0lmPVwiIWlzUGFnZUxvYWRpbmdcIj5cclxuICA8ZGl2IGNsYXNzPVwicm93IGdhcC00IGJ1aWxkZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiIHN0eWxlPVwibWF4LXdpZHRoOiAzODBweDtcIj5cclxuICAgICAgPGgyPkZpeHR1cmUgRGV0YWlsczwvaDI+XHJcbiAgICAgIDxwPkNvbmZpZ3VyZSB5b3VyIGZpeHR1cmUgZGV0YWlscyBoZXJlPC9wPlxyXG5cclxuICAgICAgPHA+VGVtcGxhdGUgdW5pcXVlIElEOiB7eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy50ZW1wbGF0ZUluZGV4IH19PC9wPlxyXG5cclxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJ6b25lRWRpdE1vZGVcIj5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJkZXNjcmlwdGlvblwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+RGVzY3JpcHRpb248L2xhYmVsPlxyXG4gICAgICAgICAgPHRleHRhcmVhIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImRlc2NyaXB0aW9uXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgIGZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KCdkZXNjcmlwdGlvbicpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJyk/LmludmFsaWRcclxuICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KCdkZXNjcmlwdGlvbicpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgRGVzY3JpcHRpb24gY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5nZXQoJ2Rlc2NyaXB0aW9uJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICBObyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWxsb3dlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhbGxvd0NhdGVnb3J5QW5kV2lkdGhFZGl0OyBlbHNlIHJlYWRvbmx5Rml4dHVyZVR5cGVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG1iLTRcIiBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiem9uZUVkaXRNb2RlXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkZpeHR1cmUgdHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGZvcm1Db250cm9sTmFtZT1cImZpeHR1cmVDYXRlZ29yeVwiPlxyXG4gICAgICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCJzaG93T3JpZ2luYWxDYXRlZ29yeU9wdGlvblwiIFtuZ1ZhbHVlXT1cIm9yaWdpbmFsQ2F0ZWdvcnlcIiBoaWRkZW4+e3sgb3JpZ2luYWxDYXRlZ29yeSB9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNhdCBvZiBjYXRlZ29yeU9wdGlvbnNcIiBbbmdWYWx1ZV09XCJjYXQudmFsdWVcIj57eyBjYXQubGFiZWwgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cInpvbmVFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5GaXh0dXJlIHdpZHRoPC9sYWJlbD5cclxuICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZVdpZHRoVmFsdWVcIj5cclxuICAgICAgICAgICAgICA8b3B0aW9uICpuZ0lmPVwic2hvd09yaWdpbmFsV2lkdGhPcHRpb25cIiBbbmdWYWx1ZV09XCJvcmlnaW5hbFdpZHRoXCIgaGlkZGVuPnt7IG9yaWdpbmFsV2lkdGhMYWJlbCB9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHcgb2Ygd2lkdGhPcHRpb25zXCIgW25nVmFsdWVdPVwidy52YWx1ZVwiPnt7IHcubGFiZWwgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNyZWFkb25seUZpeHR1cmVUeXBlPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJ6b25lRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZpeHR1cmVDYXRlZ29yeVJlYWRvbmx5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5TZWxlY3QgZml4dHVyZSB0eXBlPC9sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImZpeHR1cmVDYXRlZ29yeVJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0Rml4dHVyZUxpYnJhcnkoKVwiIHJlYWRvbmx5IC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCIgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmlzRW5hYmxlZFwiXHJcbiAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiem9uZUVkaXRNb2RlXCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwidGVtcGxhdGVHcm91cE5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlRlbXBsYXRlIEdyb3VwPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJ0ZW1wbGF0ZUdyb3VwTmFtZVwiIGZvcm1Db250cm9sTmFtZT1cInRlbXBsYXRlR3JvdXBOYW1lXCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICBmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLmdldCgndGVtcGxhdGVHcm91cE5hbWUnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgIGZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KCd0ZW1wbGF0ZUdyb3VwTmFtZScpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVCYXNpY0RldGFpbHNGb3JtLmdldCgndGVtcGxhdGVHcm91cE5hbWUnKT8uaGFzRXJyb3IoJ3doaXRlc3BhY2UnKVwiPlxyXG4gICAgICAgICAgICAgIFRlbXBsYXRlIGdyb3VwIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KCd0ZW1wbGF0ZUdyb3VwTmFtZScpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiICpuZ0lmPVwiem9uZUVkaXRNb2RlIHx8IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8uaXNFbmFibGVkXCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwiaGVhZGVyTGFiZWxcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkhlYWRlcjogbGFiZWw8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImhlYWRlckxhYmVsXCIgZm9ybUNvbnRyb2xOYW1lPVwiaGVhZGVyTGFiZWxcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgIGZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KCdoZWFkZXJMYWJlbCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5nZXQoJ2hlYWRlckxhYmVsJyk/LmludmFsaWRcclxuICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KCdoZWFkZXJMYWJlbCcpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgIEhlYWRlciBsYWJlbCBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5nZXQoJ2hlYWRlckxhYmVsJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICBIZWFkZXIgbGFiZWwgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5nZXQoJ2hlYWRlckxhYmVsJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICBObyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWxsb3dlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJzaGVsZlwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCJ6b25lRWRpdE1vZGVcIj5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzaGVsZlwiIGNsYXNzPVwibWItMlwiPkJvZHk6IFByb2R1Y3QgQ2FwYWNpdHkgYXQgZWFjaCBzaGVsZjwvbGFiZWw+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHNoZWx2ZXM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWNvbnRhaW5lclwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyByb2xlPVwiYnV0dG9uXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNSAxNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIChjbGljayk9XCJyZW1vdmVTaGVsZigpO1wiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNzYyOTQgN0gxMS45Mjk2XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHNoZWxmQXJyYXkubGVuZ3RoIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyByb2xlPVwiYnV0dG9uXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNSAxNFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIChjbGljayk9XCJhZGRTaGVsZigpO1wiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcuMTUzODkgMi45MTY1VjExLjA4MzJNMy4wNzA1NiA2Ljk5OTg0SDExLjIzNzJcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc2hlbGYgb2Ygc2hlbGZBcnJheT8uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGVsZi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAge3sgc2hlbGYuZ2V0KFwic2hlbGZUeXBlXCIpPy52YWx1ZSA9PT0gJ3Ztb25seScgPyAnVk0gT05MWSBTSEVMRicgOiAoc2hlbGYuZ2V0KFwic2hlbGZUeXBlXCIpPy52YWx1ZSB8fCAncGFuZWwnKSB8IHVwcGVyY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgICB7eyBpICsgMSB9fVxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVNoZWxmKGkpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiICpuZ0lmPVwic2hlbGZBcnJheS5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTggNkw2IDE4TTYgNkwxOCAxOFwiIHN0cm9rZT1cIiM5OEEyQjNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJzaGVsZlR5cGVzXCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNoZWxmVHlwZVwiPlxyXG4gICAgICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hlbGYuZ2V0KCdzaGVsZlR5cGUnKT8udmFsdWUgPT09ICd0cmF5J1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtLTBcIj5ObyBvZiBSb3dzPC9wPlxyXG4gICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwidHJheVJvd3NcIiBbc3RlcF09XCIxXCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTJcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzaGVsZi5nZXQoJ3NoZWxmVHlwZScpPy52YWx1ZSAhPT0gJ3Ztb25seSdcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5Qcm9kdWN0IGNhcGFjaXR5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RQZXJTaGVsZlwiIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICBzaGVsZi5nZXQoJ3NoZWxmVHlwZScpPy52YWx1ZSAhPT0gJ3Ztb25seScgJiZcclxuICAgICAgICAgICAgICAgICAgc2hlbGYuZ2V0KCdwcm9kdWN0UGVyU2hlbGYnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICBzaGVsZi5nZXQoJ3Byb2R1Y3RQZXJTaGVsZicpPy5lcnJvcnNcclxuICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInNoZWxmLmdldCgncHJvZHVjdFBlclNoZWxmJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICBQcm9kdWN0IGNhcGFjaXR5IG11c3QgYmUgYXQgbGVhc3RcclxuICAgICAgICAgICAgICAgICAge3sgc2hlbGYuZ2V0KFwic2hlbGZUeXBlXCIpPy52YWx1ZSA9PT0gXCJ2bW9ubHlcIiA/IFwiMFwiIDogXCIxXCIgfX0uXHJcbiAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCJcclxuICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiXHJcbiAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2xpY2tdPVwiem9uZUVkaXRNb2RlXCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZm9vdGVyTGFiZWxcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkZvb3RlcjogbGFiZWw8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImZvb3RlckxhYmVsXCIgZm9ybUNvbnRyb2xOYW1lPVwiZm9vdGVyTGFiZWxcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgIGZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KCdmb290ZXJMYWJlbCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5nZXQoJ2Zvb3RlckxhYmVsJyk/LmludmFsaWRcclxuICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KCdmb290ZXJMYWJlbCcpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgRm9vdGVyIGxhYmVsIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KCdmb290ZXJMYWJlbCcpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9mb3JtPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29scyBjb2xcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgPCEtLSBWZXJ0aWNhbCBhcnJvd3MgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy52YWx1ZSB9fXt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnVuaXQgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8IS0tIEhvcml6b250YWwgYXJyb3dzIC0tPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgIGRpbWVuc2lvbkFycm93cztcclxuICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy52YWx1ZVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXCI+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndhbGwtdmlld3BvcnRcIj5cclxuICAgICAgICAgICAgPCEtLSBIZWFkZXIgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYmxvY2tcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiPlxyXG4gICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAge3sgZml4dHVyZVRlbXBsYXRlQmFzaWNEZXRhaWxzRm9ybS5nZXQoXCJoZWFkZXJMYWJlbFwiKT8udmFsdWUgfX1cclxuICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBCb2R5IGJsb2NrIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1ibG9ja1wiICpuZ0lmPVwic2hlbGZBcnJheS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzaGVsZkFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJzaGVsZkNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgQGlmKGl0ZW0uZ2V0KCdzaGVsZlR5cGUnKT8udmFsdWUgPT09J3RyYXknKXtcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgndHJheVJvd3MnKT8udmFsdWUpO2xldCBqPWluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHJheSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdwcm9kdWN0UGVyU2hlbGYnKT8udmFsdWUpXCIgY2xhc3M9XCJwcm9kdWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2sgc2hlbGZcIiBbY2xhc3Mudm1vbmx5LXBsYWNlaG9sZGVyXT1cIml0ZW0uZ2V0KCdzaGVsZlR5cGUnKT8udmFsdWUgPT09J3Ztb25seSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdwcm9kdWN0UGVyU2hlbGYnKT8udmFsdWUpXCIgY2xhc3M9XCJwcm9kdWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRm9vdGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciBsZWZ0LWJveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIHJpZ2h0LWJveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDxwPnt7IGZpeHR1cmVUZW1wbGF0ZUJhc2ljRGV0YWlsc0Zvcm0uZ2V0KFwiZm9vdGVyTGFiZWxcIik/LnZhbHVlIH19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcblxyXG48c2VjdGlvbiBpZD1cImZpeHR1cmUtdGVtcGxhdGUtYmFzaWMtZGV0YWlscy1za2VsZXRvblwiICpuZ0lmPVwiaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcblxyXG48IS0tIENvbW1vbiBkaW1lbnNpb24gYXJyb3dzIC0tPlxyXG48bmctdGVtcGxhdGUgI2RpbWVuc2lvbkFycm93cyBsZXQtbGFiZWw9XCJsYWJlbFwiIGxldC12YWx1ZT1cInZhbHVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhvcml6b250YWwtZGltZW5zaW9uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgbGVmdFwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgPHNwYW4+e3sgdmFsdWUgfX0ge3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy51bml0IH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgcmlnaHRcIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=