tango-app-ui-store-builder 1.0.46 → 1.0.47

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 (66) hide show
  1. package/esm2022/lib/components/collection-update-ai/collection-update-ai.component.mjs +3 -3
  2. package/esm2022/lib/components/collection-update-ai/components/dynamic-filter/dynamic-filter.component.mjs +183 -0
  3. package/esm2022/lib/components/collection-update-ai/components/store-dropdown/store-dropdown.component.mjs +211 -0
  4. package/esm2022/lib/components/collection-update-ai/components/store-fixture/store-fixture.component.mjs +422 -0
  5. package/esm2022/lib/components/collection-update-ai/components/store-select/store-select.component.mjs +148 -0
  6. package/esm2022/lib/components/collection-update-ai/find-replace-layout/cancel-confirmation-modal/cancel-confirmation-modal.component.mjs +20 -0
  7. package/esm2022/lib/components/collection-update-ai/find-replace-layout/find-replace-layout.component.mjs +359 -0
  8. package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/batch-confirmation-modal/batch-confirmation-modal.component.mjs +23 -0
  9. package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +2524 -0
  10. package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/approve-complete-modal/approve-complete-modal.component.mjs +66 -0
  11. package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/fixture-before-after/fixture-before-after.component.mjs +85 -0
  12. package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.mjs +2039 -0
  13. package/esm2022/lib/components/collection-update-ai/find-replace-table/find-replace-table.component.mjs +433 -0
  14. package/esm2022/lib/components/collection-update-ai/find-replace-table/reschedule-modal/reschedule-modal.component.mjs +76 -0
  15. package/esm2022/lib/components/collection-update-ai/models/find-replace.model.mjs +2 -0
  16. package/esm2022/lib/components/collection-update-ai/services/data.service.mjs +291 -0
  17. package/esm2022/lib/components/fixture-template-table/fixture-template-table.component.mjs +33 -4
  18. package/esm2022/lib/components/manage-plano/rollout-table/rollout-table.component.mjs +25 -3
  19. package/esm2022/lib/components/manage-store-plano/verification-feedback/editable-fixture/editable-fixture.component.mjs +1 -1
  20. package/esm2022/lib/components/planogram/merch-compliance/fixture-products/fixture-products.component.mjs +75 -31
  21. package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +4 -7
  22. package/esm2022/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.mjs +228 -0
  23. package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +1105 -0
  24. package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.mjs +20 -0
  25. package/esm2022/lib/components/planogram/merch-compliance/zone-products/zone-products.component.mjs +22 -9
  26. package/esm2022/lib/components/planogram/plano-analytics/date-range-picker/date-range-picker.component.mjs +92 -0
  27. package/esm2022/lib/components/planogram/plano-analytics/plano-analytics.component.mjs +106 -0
  28. package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +21 -10
  29. package/esm2022/lib/components/planogram/plano-overview/fixture-overview/fixture-overview.component.mjs +41 -35
  30. package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +3 -4
  31. package/esm2022/lib/services/store-builder.service.mjs +46 -1
  32. package/esm2022/lib/tango-store-builder-routing.module.mjs +23 -1
  33. package/esm2022/lib/tango-store-builder.module.mjs +36 -5
  34. package/fesm2022/tango-app-ui-store-builder.mjs +10304 -1827
  35. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  36. package/lib/components/collection-update-ai/components/dynamic-filter/dynamic-filter.component.d.ts +51 -0
  37. package/lib/components/collection-update-ai/components/store-dropdown/store-dropdown.component.d.ts +36 -0
  38. package/lib/components/collection-update-ai/components/store-fixture/store-fixture.component.d.ts +50 -0
  39. package/lib/components/collection-update-ai/components/store-select/store-select.component.d.ts +33 -0
  40. package/lib/components/collection-update-ai/find-replace-layout/cancel-confirmation-modal/cancel-confirmation-modal.component.d.ts +9 -0
  41. package/lib/components/collection-update-ai/find-replace-layout/find-replace-layout.component.d.ts +58 -0
  42. package/lib/components/collection-update-ai/find-replace-layout/prepare-template/batch-confirmation-modal/batch-confirmation-modal.component.d.ts +10 -0
  43. package/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.d.ts +141 -0
  44. package/lib/components/collection-update-ai/find-replace-layout/review-replace/approve-complete-modal/approve-complete-modal.component.d.ts +18 -0
  45. package/lib/components/collection-update-ai/find-replace-layout/review-replace/fixture-before-after/fixture-before-after.component.d.ts +19 -0
  46. package/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.d.ts +116 -0
  47. package/lib/components/collection-update-ai/find-replace-table/find-replace-table.component.d.ts +63 -0
  48. package/lib/components/collection-update-ai/find-replace-table/reschedule-modal/reschedule-modal.component.d.ts +19 -0
  49. package/lib/components/collection-update-ai/models/find-replace.model.d.ts +55 -0
  50. package/lib/components/collection-update-ai/services/data.service.d.ts +70 -0
  51. package/lib/components/fixture-template-table/fixture-template-table.component.d.ts +2 -0
  52. package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +3 -1
  53. package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +2 -2
  54. package/lib/components/planogram/merch-compliance/fixture-products/fixture-products.component.d.ts +8 -2
  55. package/lib/components/planogram/merch-compliance/merch-compliance.component.d.ts +1 -3
  56. package/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.d.ts +45 -0
  57. package/lib/components/planogram/merch-compliance/product-locator/product-locator.component.d.ts +69 -0
  58. package/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.d.ts +9 -0
  59. package/lib/components/planogram/merch-compliance/zone-products/zone-products.component.d.ts +10 -2
  60. package/lib/components/planogram/plano-analytics/date-range-picker/date-range-picker.component.d.ts +24 -0
  61. package/lib/components/planogram/plano-analytics/plano-analytics.component.d.ts +25 -0
  62. package/lib/components/planogram/plano-details-parent/plano-details-parent.component.d.ts +5 -1
  63. package/lib/components/planogram/plano-overview/fixture-overview/fixture-overview.component.d.ts +2 -4
  64. package/lib/services/store-builder.service.d.ts +24 -0
  65. package/lib/tango-store-builder.module.d.ts +29 -21
  66. package/package.json +1 -1
@@ -0,0 +1,183 @@
1
+ import { Component, EventEmitter, HostListener, Input, Output, } from "@angular/core";
2
+ import { FormsModule } from "@angular/forms";
3
+ import { CommonModule } from "@angular/common";
4
+ import { Subject } from "rxjs";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ export class DynamicFilterComponent {
8
+ filterObject = [];
9
+ isFilterOpen = false;
10
+ displayedOptions = [];
11
+ isFilterApplied = false;
12
+ filters = [];
13
+ applyFilters = new EventEmitter();
14
+ resetFilters = new EventEmitter();
15
+ filterChanged = new EventEmitter();
16
+ destroy$ = new Subject();
17
+ ngOnInit() {
18
+ this.initializeFilters();
19
+ }
20
+ ngOnChanges(changes) {
21
+ if (changes["filterObject"]?.currentValue) {
22
+ this.initializeFilters();
23
+ }
24
+ }
25
+ initializeFilters() {
26
+ // Deep clone the filterObject to avoid mutating the input
27
+ this.filters = this.filterObject.map((filter) => ({
28
+ ...filter,
29
+ isOpened: false,
30
+ options: filter.options.map((opt) => ({ ...opt })),
31
+ }));
32
+ this.displayedOptions = this.filters.map((f) => f.options ? [...f.options] : []);
33
+ this.checkIfFilterApplied();
34
+ }
35
+ handleDocumentClick(event) {
36
+ const target = event.target;
37
+ if (target.closest(".item-button") || target.closest(".item-dropdown"))
38
+ return;
39
+ this.filters.forEach((f, i) => {
40
+ if (f.isOpened)
41
+ this.resetSearch(i);
42
+ f.isOpened = false;
43
+ });
44
+ if (target.closest(".filter-dropdown"))
45
+ return;
46
+ this.isFilterOpen = false;
47
+ }
48
+ toggleFilter(event) {
49
+ event.stopPropagation();
50
+ this.isFilterOpen = !this.isFilterOpen;
51
+ }
52
+ toggleItem(event, itemIndex) {
53
+ event.stopPropagation();
54
+ this.filters.forEach((f, i) => {
55
+ if (i === itemIndex) {
56
+ f.isOpened = !f.isOpened;
57
+ if (!f.isOpened)
58
+ this.resetSearch(i);
59
+ }
60
+ else {
61
+ if (f.isOpened)
62
+ this.resetSearch(i);
63
+ f.isOpened = false;
64
+ }
65
+ });
66
+ }
67
+ resetSearch(filterIndex) {
68
+ this.displayedOptions[filterIndex] = [...this.filters[filterIndex].options];
69
+ }
70
+ onSingleSelect(filter, option) {
71
+ const index = this.filters.indexOf(filter);
72
+ if (index === -1)
73
+ return;
74
+ this.filters[index].options.forEach((o) => (o.checked = false));
75
+ option.checked = true;
76
+ this.displayedOptions[index] = [...this.filters[index].options];
77
+ this.filters[index].isOpened = false;
78
+ this.emitFilterChanges();
79
+ }
80
+ onOptionChange(filter, option) {
81
+ this.emitFilterChanges();
82
+ }
83
+ isAllVisibleSelected(filterIndex) {
84
+ const visible = this.displayedOptions[filterIndex];
85
+ return visible.length > 0 && visible.every((v) => v.checked);
86
+ }
87
+ isAllVisibleSelectedByFilter(filter) {
88
+ const i = this.filters.indexOf(filter);
89
+ if (i === -1)
90
+ return false;
91
+ return this.isAllVisibleSelected(i);
92
+ }
93
+ toggleSelectAllVisible(event, filterIndex) {
94
+ const checked = event.target.checked;
95
+ this.displayedOptions[filterIndex].forEach((opt) => (opt.checked = checked));
96
+ this.emitFilterChanges();
97
+ }
98
+ toggleSelectAllVisibleByFilter(event, filter) {
99
+ const i = this.filters.indexOf(filter);
100
+ if (i === -1)
101
+ return;
102
+ this.toggleSelectAllVisible(event, i);
103
+ }
104
+ onSearch(event, filterIndex) {
105
+ const term = event.target.value.toLowerCase().trim();
106
+ const fullList = this.filters[filterIndex].options;
107
+ if (!term) {
108
+ this.displayedOptions[filterIndex] = [...fullList];
109
+ return;
110
+ }
111
+ this.displayedOptions[filterIndex] = fullList.filter((o) => o.name.toLowerCase().includes(term));
112
+ }
113
+ getSelectedData() {
114
+ return this.filters.map((f) => {
115
+ if (f.type === "single") {
116
+ const sel = f.options.find((o) => o.checked);
117
+ return { title: f.title, selected: sel ? sel.value : null };
118
+ }
119
+ return {
120
+ title: f.title,
121
+ selected: f.options.filter((o) => o.checked).map((o) => o.value),
122
+ };
123
+ });
124
+ }
125
+ emitFilterChanges() {
126
+ this.filterChanged.emit(this.getSelectedData());
127
+ this.checkIfFilterApplied();
128
+ }
129
+ checkIfFilterApplied() {
130
+ const selectedData = this.getSelectedData();
131
+ this.isFilterApplied = selectedData.some((data) => {
132
+ if (data.selected === null)
133
+ return false;
134
+ if (Array.isArray(data.selected))
135
+ return data.selected.length > 0;
136
+ return true;
137
+ });
138
+ }
139
+ onApplyFilter() {
140
+ this.isFilterOpen = false;
141
+ this.filters.forEach((f) => (f.isOpened = false));
142
+ const finalData = this.getSelectedData();
143
+ this.applyFilters.emit(finalData);
144
+ }
145
+ onResetFilter() {
146
+ this.filters.forEach((f) => f.options.forEach((o) => (o.checked = false)));
147
+ this.filters.forEach((_, i) => {
148
+ this.displayedOptions[i] = [...this.filters[i].options];
149
+ });
150
+ this.isFilterOpen = false;
151
+ this.filters.forEach((f) => (f.isOpened = false));
152
+ this.resetFilters.emit(this.getSelectedData());
153
+ this.isFilterApplied = false;
154
+ }
155
+ getSelectedCount(index) {
156
+ return this.filters[index].options.filter((o) => o.checked).length;
157
+ }
158
+ getSelectedItem(index) {
159
+ return this.filters[index].options.find((o) => o.checked) ?? null;
160
+ }
161
+ ngOnDestroy() {
162
+ this.destroy$.next();
163
+ this.destroy$.complete();
164
+ }
165
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
166
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DynamicFilterComponent, isStandalone: true, selector: "lib-dynamic-filter", inputs: { filterObject: "filterObject" }, outputs: { applyFilters: "applyFilters", resetFilters: "resetFilters", filterChanged: "filterChanged" }, host: { listeners: { "document:click": "handleDocumentClick($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"position-relative\">\r\n <button type=\"button\" class=\"btn btn-outline filter-button position-relative\" (click)=\"toggleFilter($event)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n Filter\r\n @if(isFilterApplied){\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\" class=\"active-filter\">\r\n <circle cx=\"10\" cy=\"10\" r=\"5\" fill=\"red\" />\r\n </svg>\r\n }\r\n\r\n </button>\r\n\r\n @if(isFilterOpen){\r\n <div class=\"filter-dropdown\">\r\n\r\n <div class=\"filter-header\">\r\n <h2>Filter Options</h2>\r\n <div class=\"d-flex gap-2\">\r\n <button class=\"btn btn-outline\" type=\"button\" (click)=\"onResetFilter()\">Reset</button>\r\n <button class=\"btn btn-primary\" type=\"submit\" (click)=\"onApplyFilter()\">Apply</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filter-body\">\r\n\r\n @for (filter of filters; let fi = $index; track fi) {\r\n\r\n <div class=\"item-wrapper\">\r\n\r\n <div class=\"d-flex gap-1 align-items-center\">\r\n\r\n <div class=\"item-button form-select\" (click)=\"toggleItem($event, fi)\">\r\n @if(filter.type === 'multi'){\r\n {{filter.title}}\r\n @if(getSelectedCount(fi) > 0){\r\n <span class=\"badge-count\">{{ getSelectedCount(fi) }}</span>\r\n }\r\n }\r\n @else {\r\n {{ getSelectedItem(fi)?.name ?? filter.title }}\r\n }\r\n </div>\r\n\r\n </div>\r\n\r\n @if(filter.isOpened){\r\n <div class=\"item-dropdown\">\r\n\r\n @if(filter.type === 'multi'){\r\n <div>\r\n <input type=\"checkbox\" [id]=\"'selectAll' + fi\" [checked]=\"isAllVisibleSelectedByFilter(filter)\"\r\n (change)=\"toggleSelectAllVisibleByFilter($event, filter)\">\r\n <label [for]=\"'selectAll' + fi\">Select all</label>\r\n </div>\r\n\r\n <hr>\r\n\r\n <div class=\"my-2\">\r\n <span class=\"search-icon\">\r\n <svg width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n <path\r\n d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\"\r\n stroke=\"#667085\" stroke-width=\"1.3\" />\r\n </svg>\r\n </span>\r\n <input type=\"search\" class=\"form-control search-field\" placeholder=\"Search\"\r\n (input)=\"onSearch($event, fi)\">\r\n </div>\r\n }\r\n\r\n @if(displayedOptions[fi].length == 0){\r\n <span class=\"no-data\">No Data</span>\r\n }\r\n @else {\r\n\r\n @for(option of displayedOptions[fi]; let oi = $index; track oi){\r\n\r\n @if(filter.type === 'single'){\r\n <div class=\"single-option\" (click)=\"onSingleSelect(filter, option)\">\r\n <span class=\"radio-circle\" [class.selected]=\"option.checked\"></span>\r\n <label>{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n @if(filter.type === 'multi'){\r\n <div class=\"mb-4\">\r\n <input type=\"checkbox\" [id]=\"'option-' + fi + '-' + oi\" [(ngModel)]=\"option.checked\"\r\n (change)=\"onOptionChange(filter, option)\">\r\n <label [for]=\"'option-' + fi + '-' + oi\">{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n }\r\n }\r\n\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n }\r\n\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".active-filter{position:absolute;top:-6px;right:-6px;height:14px;width:14px}.filter-dropdown{padding:16px;min-width:350px;box-shadow:2px 4px 10px #0000001a;border-radius:12px;background-color:#fff;position:absolute;width:320px;top:50px;right:0;z-index:100}.filter-dropdown .filter-header{display:flex;justify-content:space-between;align-items:center}.filter-dropdown .filter-header h2{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px;margin:0}.filter-dropdown .filter-header .btn{font-size:13px!important;height:30px!important;line-height:10px!important;padding:8px 16px!important}.filter-dropdown .filter-body{margin-top:12px}.filter-dropdown .filter-body .item-wrapper{margin-top:12px;position:relative}.filter-dropdown .filter-body .item-button{cursor:pointer;background-color:#fff;padding:.775rem 3rem .775rem 1rem;border:1px solid #dbdfe9;border-radius:6px;color:#344054;font-size:14px;font-weight:600;line-height:20px;display:flex;justify-content:space-between}.filter-dropdown .filter-body .item-button .badge-count{background:#f2f4f7;color:#344054;padding:0 8px;border-radius:20px;font-size:12px;font-weight:600;margin-left:8px}.filter-dropdown .filter-body .item-dropdown{position:absolute;top:50px;width:100%;z-index:1;padding:10px;background-color:#fff;border-radius:8px;box-shadow:0 8px 16px #0003;max-height:200px;overflow:auto}.filter-dropdown .filter-body .item-dropdown .no-data{text-align:center;width:100%;display:block;font-size:14px}.filter-dropdown .filter-body .item-dropdown .search-field{padding-left:34px}.filter-dropdown .filter-body .item-dropdown .search-icon{margin-left:12px;margin-top:11px;position:absolute}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #d0d5dd);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff);background-color:var(--primary-50, #eaf8ff)}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.filter-dropdown .filter-body .item-dropdown label{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px;margin-left:4px}.filter-dropdown .filter-body .item-dropdown .single-option{display:flex;align-items:center;cursor:pointer;padding:8px 6px}.filter-dropdown .filter-body .item-dropdown .radio-circle{width:14px;height:14px;border:2px solid #667085;border-radius:50%;margin-right:8px}.filter-dropdown .filter-body .item-dropdown .radio-circle.selected{background-color:#00a3ff;border-color:#00a3ff}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }] });
167
+ }
168
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DynamicFilterComponent, decorators: [{
169
+ type: Component,
170
+ args: [{ selector: "lib-dynamic-filter", standalone: true, imports: [FormsModule, CommonModule], template: "<div class=\"position-relative\">\r\n <button type=\"button\" class=\"btn btn-outline filter-button position-relative\" (click)=\"toggleFilter($event)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n Filter\r\n @if(isFilterApplied){\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\" class=\"active-filter\">\r\n <circle cx=\"10\" cy=\"10\" r=\"5\" fill=\"red\" />\r\n </svg>\r\n }\r\n\r\n </button>\r\n\r\n @if(isFilterOpen){\r\n <div class=\"filter-dropdown\">\r\n\r\n <div class=\"filter-header\">\r\n <h2>Filter Options</h2>\r\n <div class=\"d-flex gap-2\">\r\n <button class=\"btn btn-outline\" type=\"button\" (click)=\"onResetFilter()\">Reset</button>\r\n <button class=\"btn btn-primary\" type=\"submit\" (click)=\"onApplyFilter()\">Apply</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filter-body\">\r\n\r\n @for (filter of filters; let fi = $index; track fi) {\r\n\r\n <div class=\"item-wrapper\">\r\n\r\n <div class=\"d-flex gap-1 align-items-center\">\r\n\r\n <div class=\"item-button form-select\" (click)=\"toggleItem($event, fi)\">\r\n @if(filter.type === 'multi'){\r\n {{filter.title}}\r\n @if(getSelectedCount(fi) > 0){\r\n <span class=\"badge-count\">{{ getSelectedCount(fi) }}</span>\r\n }\r\n }\r\n @else {\r\n {{ getSelectedItem(fi)?.name ?? filter.title }}\r\n }\r\n </div>\r\n\r\n </div>\r\n\r\n @if(filter.isOpened){\r\n <div class=\"item-dropdown\">\r\n\r\n @if(filter.type === 'multi'){\r\n <div>\r\n <input type=\"checkbox\" [id]=\"'selectAll' + fi\" [checked]=\"isAllVisibleSelectedByFilter(filter)\"\r\n (change)=\"toggleSelectAllVisibleByFilter($event, filter)\">\r\n <label [for]=\"'selectAll' + fi\">Select all</label>\r\n </div>\r\n\r\n <hr>\r\n\r\n <div class=\"my-2\">\r\n <span class=\"search-icon\">\r\n <svg width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n <path\r\n d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\"\r\n stroke=\"#667085\" stroke-width=\"1.3\" />\r\n </svg>\r\n </span>\r\n <input type=\"search\" class=\"form-control search-field\" placeholder=\"Search\"\r\n (input)=\"onSearch($event, fi)\">\r\n </div>\r\n }\r\n\r\n @if(displayedOptions[fi].length == 0){\r\n <span class=\"no-data\">No Data</span>\r\n }\r\n @else {\r\n\r\n @for(option of displayedOptions[fi]; let oi = $index; track oi){\r\n\r\n @if(filter.type === 'single'){\r\n <div class=\"single-option\" (click)=\"onSingleSelect(filter, option)\">\r\n <span class=\"radio-circle\" [class.selected]=\"option.checked\"></span>\r\n <label>{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n @if(filter.type === 'multi'){\r\n <div class=\"mb-4\">\r\n <input type=\"checkbox\" [id]=\"'option-' + fi + '-' + oi\" [(ngModel)]=\"option.checked\"\r\n (change)=\"onOptionChange(filter, option)\">\r\n <label [for]=\"'option-' + fi + '-' + oi\">{{ option.name }}</label>\r\n </div>\r\n }\r\n\r\n }\r\n }\r\n\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n }\r\n\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: [".active-filter{position:absolute;top:-6px;right:-6px;height:14px;width:14px}.filter-dropdown{padding:16px;min-width:350px;box-shadow:2px 4px 10px #0000001a;border-radius:12px;background-color:#fff;position:absolute;width:320px;top:50px;right:0;z-index:100}.filter-dropdown .filter-header{display:flex;justify-content:space-between;align-items:center}.filter-dropdown .filter-header h2{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px;margin:0}.filter-dropdown .filter-header .btn{font-size:13px!important;height:30px!important;line-height:10px!important;padding:8px 16px!important}.filter-dropdown .filter-body{margin-top:12px}.filter-dropdown .filter-body .item-wrapper{margin-top:12px;position:relative}.filter-dropdown .filter-body .item-button{cursor:pointer;background-color:#fff;padding:.775rem 3rem .775rem 1rem;border:1px solid #dbdfe9;border-radius:6px;color:#344054;font-size:14px;font-weight:600;line-height:20px;display:flex;justify-content:space-between}.filter-dropdown .filter-body .item-button .badge-count{background:#f2f4f7;color:#344054;padding:0 8px;border-radius:20px;font-size:12px;font-weight:600;margin-left:8px}.filter-dropdown .filter-body .item-dropdown{position:absolute;top:50px;width:100%;z-index:1;padding:10px;background-color:#fff;border-radius:8px;box-shadow:0 8px 16px #0003;max-height:200px;overflow:auto}.filter-dropdown .filter-body .item-dropdown .no-data{text-align:center;width:100%;display:block;font-size:14px}.filter-dropdown .filter-body .item-dropdown .search-field{padding-left:34px}.filter-dropdown .filter-body .item-dropdown .search-icon{margin-left:12px;margin-top:11px;position:absolute}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #d0d5dd);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff);background-color:var(--primary-50, #eaf8ff)}.filter-dropdown .filter-body .item-dropdown input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.filter-dropdown .filter-body .item-dropdown label{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px;margin-left:4px}.filter-dropdown .filter-body .item-dropdown .single-option{display:flex;align-items:center;cursor:pointer;padding:8px 6px}.filter-dropdown .filter-body .item-dropdown .radio-circle{width:14px;height:14px;border:2px solid #667085;border-radius:50%;margin-right:8px}.filter-dropdown .filter-body .item-dropdown .radio-circle.selected{background-color:#00a3ff;border-color:#00a3ff}\n"] }]
171
+ }], propDecorators: { filterObject: [{
172
+ type: Input
173
+ }], applyFilters: [{
174
+ type: Output
175
+ }], resetFilters: [{
176
+ type: Output
177
+ }], filterChanged: [{
178
+ type: Output
179
+ }], handleDocumentClick: [{
180
+ type: HostListener,
181
+ args: ["document:click", ["$event"]]
182
+ }] } });
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY29sbGVjdGlvbi11cGRhdGUtYWkvY29tcG9uZW50cy9keW5hbWljLWZpbHRlci9keW5hbWljLWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9jb2xsZWN0aW9uLXVwZGF0ZS1haS9jb21wb25lbnRzL2R5bmFtaWMtZmlsdGVyL2R5bmFtaWMtZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBc0IvQixNQUFNLE9BQU8sc0JBQXNCO0lBQ3hCLFlBQVksR0FBbUIsRUFBRSxDQUFDO0lBRTNDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsZ0JBQWdCLEdBQXFCLEVBQUUsQ0FBQztJQUN4QyxlQUFlLEdBQVksS0FBSyxDQUFDO0lBQ2pDLE9BQU8sR0FBbUIsRUFBRSxDQUFDO0lBRW5CLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3ZDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3ZDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBRWpDLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRWhELFFBQVE7UUFDTixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFlBQVksRUFBRTtZQUN6QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFRCxpQkFBaUI7UUFDZiwwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRCxHQUFHLE1BQU07WUFDVCxRQUFRLEVBQUUsS0FBSztZQUNmLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVKLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzdDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDaEMsQ0FBQztRQUVGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFHRCxtQkFBbUIsQ0FBQyxLQUFpQjtRQUNuQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztRQUUzQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztZQUNwRSxPQUFPO1FBRVQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLENBQUMsUUFBUTtnQkFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1lBQUUsT0FBTztRQUUvQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWlCO1FBQzVCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUN6QyxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWlCLEVBQUUsU0FBaUI7UUFDN0MsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDbkIsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUTtvQkFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3RDO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxDQUFDLFFBQVE7b0JBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7YUFDcEI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsV0FBbUI7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBb0IsRUFBRSxNQUFvQjtRQUN2RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPO1FBRXpCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDaEUsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUVyQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQW9CLEVBQUUsTUFBb0I7UUFDdkQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELG9CQUFvQixDQUFDLFdBQW1CO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsNEJBQTRCLENBQUMsTUFBb0I7UUFDL0MsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELHNCQUFzQixDQUFDLEtBQVUsRUFBRSxXQUFtQjtRQUNwRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUU3RSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsOEJBQThCLENBQUMsS0FBVSxFQUFFLE1BQW9CO1FBQzdELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUFFLE9BQU87UUFDckIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQVUsRUFBRSxXQUFtQjtRQUN0QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUVuRCxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztZQUNuRCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3pELENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUNwQyxDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDdkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzdEO1lBRUQsT0FBTztnQkFDTCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2QsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ2pFLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSTtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN6QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUNsRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYTtRQUM1QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyRSxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWE7UUFDM0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDcEUsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzt3R0FsTVUsc0JBQXNCOzRGQUF0QixzQkFBc0IsZ1VDbkNuQyx1b0pBNkdBLDI5RkQ5RVksV0FBVywrZ0JBQUUsWUFBWTs7NEZBSXhCLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxXQUNQLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQzs4QkFLM0IsWUFBWTtzQkFBcEIsS0FBSztnQkFPSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkE4QlAsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJPcHRpb24ge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB2YWx1ZTogYW55O1xyXG4gIGNoZWNrZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyQ29uZmlnIHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIHR5cGU6IFwibXVsdGlcIiB8IFwic2luZ2xlXCI7XHJcbiAgaXNPcGVuZWQ6IGJvb2xlYW47XHJcbiAgb3B0aW9uczogRmlsdGVyT3B0aW9uW107XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi1keW5hbWljLWZpbHRlclwiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0Zvcm1zTW9kdWxlLCBDb21tb25Nb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vZHluYW1pYy1maWx0ZXIuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybDogXCIuL2R5bmFtaWMtZmlsdGVyLmNvbXBvbmVudC5zY3NzXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEeW5hbWljRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgZmlsdGVyT2JqZWN0OiBGaWx0ZXJDb25maWdbXSA9IFtdO1xyXG5cclxuICBpc0ZpbHRlck9wZW4gPSBmYWxzZTtcclxuICBkaXNwbGF5ZWRPcHRpb25zOiBGaWx0ZXJPcHRpb25bXVtdID0gW107XHJcbiAgaXNGaWx0ZXJBcHBsaWVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZmlsdGVyczogRmlsdGVyQ29uZmlnW10gPSBbXTtcclxuXHJcbiAgQE91dHB1dCgpIGFwcGx5RmlsdGVycyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSByZXNldEZpbHRlcnMgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZmlsdGVyQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRpYWxpemVGaWx0ZXJzKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1tcImZpbHRlck9iamVjdFwiXT8uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZpbHRlcnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgLy8gRGVlcCBjbG9uZSB0aGUgZmlsdGVyT2JqZWN0IHRvIGF2b2lkIG11dGF0aW5nIHRoZSBpbnB1dFxyXG4gICAgdGhpcy5maWx0ZXJzID0gdGhpcy5maWx0ZXJPYmplY3QubWFwKChmaWx0ZXIpID0+ICh7XHJcbiAgICAgIC4uLmZpbHRlcixcclxuICAgICAgaXNPcGVuZWQ6IGZhbHNlLFxyXG4gICAgICBvcHRpb25zOiBmaWx0ZXIub3B0aW9ucy5tYXAoKG9wdCkgPT4gKHsgLi4ub3B0IH0pKSxcclxuICAgIH0pKTtcclxuXHJcbiAgICB0aGlzLmRpc3BsYXllZE9wdGlvbnMgPSB0aGlzLmZpbHRlcnMubWFwKChmKSA9PlxyXG4gICAgICBmLm9wdGlvbnMgPyBbLi4uZi5vcHRpb25zXSA6IFtdXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuY2hlY2tJZkZpbHRlckFwcGxpZWQoKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJkb2N1bWVudDpjbGlja1wiLCBbXCIkZXZlbnRcIl0pXHJcbiAgaGFuZGxlRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGlmICh0YXJnZXQuY2xvc2VzdChcIi5pdGVtLWJ1dHRvblwiKSB8fCB0YXJnZXQuY2xvc2VzdChcIi5pdGVtLWRyb3Bkb3duXCIpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGYsIGkpID0+IHtcclxuICAgICAgaWYgKGYuaXNPcGVuZWQpIHRoaXMucmVzZXRTZWFyY2goaSk7XHJcbiAgICAgIGYuaXNPcGVuZWQgPSBmYWxzZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0YXJnZXQuY2xvc2VzdChcIi5maWx0ZXItZHJvcGRvd25cIikpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmlzRmlsdGVyT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRmlsdGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuaXNGaWx0ZXJPcGVuID0gIXRoaXMuaXNGaWx0ZXJPcGVuO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlSXRlbShldmVudDogTW91c2VFdmVudCwgaXRlbUluZGV4OiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmLCBpKSA9PiB7XHJcbiAgICAgIGlmIChpID09PSBpdGVtSW5kZXgpIHtcclxuICAgICAgICBmLmlzT3BlbmVkID0gIWYuaXNPcGVuZWQ7XHJcbiAgICAgICAgaWYgKCFmLmlzT3BlbmVkKSB0aGlzLnJlc2V0U2VhcmNoKGkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChmLmlzT3BlbmVkKSB0aGlzLnJlc2V0U2VhcmNoKGkpO1xyXG4gICAgICAgIGYuaXNPcGVuZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXNldFNlYXJjaChmaWx0ZXJJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmRpc3BsYXllZE9wdGlvbnNbZmlsdGVySW5kZXhdID0gWy4uLnRoaXMuZmlsdGVyc1tmaWx0ZXJJbmRleF0ub3B0aW9uc107XHJcbiAgfVxyXG5cclxuICBvblNpbmdsZVNlbGVjdChmaWx0ZXI6IEZpbHRlckNvbmZpZywgb3B0aW9uOiBGaWx0ZXJPcHRpb24pIHtcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5maWx0ZXJzLmluZGV4T2YoZmlsdGVyKTtcclxuICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmZpbHRlcnNbaW5kZXhdLm9wdGlvbnMuZm9yRWFjaCgobykgPT4gKG8uY2hlY2tlZCA9IGZhbHNlKSk7XHJcbiAgICBvcHRpb24uY2hlY2tlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zW2luZGV4XSA9IFsuLi50aGlzLmZpbHRlcnNbaW5kZXhdLm9wdGlvbnNdO1xyXG4gICAgdGhpcy5maWx0ZXJzW2luZGV4XS5pc09wZW5lZCA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuZW1pdEZpbHRlckNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG9uT3B0aW9uQ2hhbmdlKGZpbHRlcjogRmlsdGVyQ29uZmlnLCBvcHRpb246IEZpbHRlck9wdGlvbikge1xyXG4gICAgdGhpcy5lbWl0RmlsdGVyQ2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgaXNBbGxWaXNpYmxlU2VsZWN0ZWQoZmlsdGVySW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuZGlzcGxheWVkT3B0aW9uc1tmaWx0ZXJJbmRleF07XHJcbiAgICByZXR1cm4gdmlzaWJsZS5sZW5ndGggPiAwICYmIHZpc2libGUuZXZlcnkoKHYpID0+IHYuY2hlY2tlZCk7XHJcbiAgfVxyXG5cclxuICBpc0FsbFZpc2libGVTZWxlY3RlZEJ5RmlsdGVyKGZpbHRlcjogRmlsdGVyQ29uZmlnKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBpID0gdGhpcy5maWx0ZXJzLmluZGV4T2YoZmlsdGVyKTtcclxuICAgIGlmIChpID09PSAtMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHRoaXMuaXNBbGxWaXNpYmxlU2VsZWN0ZWQoaSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWxlY3RBbGxWaXNpYmxlKGV2ZW50OiBhbnksIGZpbHRlckluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcclxuICAgIHRoaXMuZGlzcGxheWVkT3B0aW9uc1tmaWx0ZXJJbmRleF0uZm9yRWFjaCgob3B0KSA9PiAob3B0LmNoZWNrZWQgPSBjaGVja2VkKSk7XHJcblxyXG4gICAgdGhpcy5lbWl0RmlsdGVyQ2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0QWxsVmlzaWJsZUJ5RmlsdGVyKGV2ZW50OiBhbnksIGZpbHRlcjogRmlsdGVyQ29uZmlnKSB7XHJcbiAgICBjb25zdCBpID0gdGhpcy5maWx0ZXJzLmluZGV4T2YoZmlsdGVyKTtcclxuICAgIGlmIChpID09PSAtMSkgcmV0dXJuO1xyXG4gICAgdGhpcy50b2dnbGVTZWxlY3RBbGxWaXNpYmxlKGV2ZW50LCBpKTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoKGV2ZW50OiBhbnksIGZpbHRlckluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHRlcm0gPSBldmVudC50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XHJcbiAgICBjb25zdCBmdWxsTGlzdCA9IHRoaXMuZmlsdGVyc1tmaWx0ZXJJbmRleF0ub3B0aW9ucztcclxuXHJcbiAgICBpZiAoIXRlcm0pIHtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zW2ZpbHRlckluZGV4XSA9IFsuLi5mdWxsTGlzdF07XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRpc3BsYXllZE9wdGlvbnNbZmlsdGVySW5kZXhdID0gZnVsbExpc3QuZmlsdGVyKChvKSA9PlxyXG4gICAgICBvLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldFNlbGVjdGVkRGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmKSA9PiB7XHJcbiAgICAgIGlmIChmLnR5cGUgPT09IFwic2luZ2xlXCIpIHtcclxuICAgICAgICBjb25zdCBzZWwgPSBmLm9wdGlvbnMuZmluZCgobykgPT4gby5jaGVja2VkKTtcclxuICAgICAgICByZXR1cm4geyB0aXRsZTogZi50aXRsZSwgc2VsZWN0ZWQ6IHNlbCA/IHNlbC52YWx1ZSA6IG51bGwgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0aXRsZTogZi50aXRsZSxcclxuICAgICAgICBzZWxlY3RlZDogZi5vcHRpb25zLmZpbHRlcigobykgPT4gby5jaGVja2VkKS5tYXAoKG8pID0+IG8udmFsdWUpLFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBlbWl0RmlsdGVyQ2hhbmdlcygpIHtcclxuICAgIHRoaXMuZmlsdGVyQ2hhbmdlZC5lbWl0KHRoaXMuZ2V0U2VsZWN0ZWREYXRhKCkpO1xyXG4gICAgdGhpcy5jaGVja0lmRmlsdGVyQXBwbGllZCgpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tJZkZpbHRlckFwcGxpZWQoKSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZERhdGEgPSB0aGlzLmdldFNlbGVjdGVkRGF0YSgpO1xyXG4gICAgdGhpcy5pc0ZpbHRlckFwcGxpZWQgPSBzZWxlY3RlZERhdGEuc29tZSgoZGF0YSkgPT4ge1xyXG4gICAgICBpZiAoZGF0YS5zZWxlY3RlZCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnNlbGVjdGVkKSkgcmV0dXJuIGRhdGEuc2VsZWN0ZWQubGVuZ3RoID4gMDtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQXBwbHlGaWx0ZXIoKSB7XHJcbiAgICB0aGlzLmlzRmlsdGVyT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGYpID0+IChmLmlzT3BlbmVkID0gZmFsc2UpKTtcclxuICAgIGNvbnN0IGZpbmFsRGF0YSA9IHRoaXMuZ2V0U2VsZWN0ZWREYXRhKCk7XHJcbiAgICB0aGlzLmFwcGx5RmlsdGVycy5lbWl0KGZpbmFsRGF0YSk7XHJcbiAgfVxyXG5cclxuICBvblJlc2V0RmlsdGVyKCkge1xyXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGYpID0+IGYub3B0aW9ucy5mb3JFYWNoKChvKSA9PiAoby5jaGVja2VkID0gZmFsc2UpKSk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKF8sIGkpID0+IHtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRPcHRpb25zW2ldID0gWy4uLnRoaXMuZmlsdGVyc1tpXS5vcHRpb25zXTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaXNGaWx0ZXJPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmZpbHRlcnMuZm9yRWFjaCgoZikgPT4gKGYuaXNPcGVuZWQgPSBmYWxzZSkpO1xyXG5cclxuICAgIHRoaXMucmVzZXRGaWx0ZXJzLmVtaXQodGhpcy5nZXRTZWxlY3RlZERhdGEoKSk7XHJcbiAgICB0aGlzLmlzRmlsdGVyQXBwbGllZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRDb3VudChpbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzW2luZGV4XS5vcHRpb25zLmZpbHRlcigobykgPT4gby5jaGVja2VkKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZEl0ZW0oaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyc1tpbmRleF0ub3B0aW9ucy5maW5kKChvKSA9PiBvLmNoZWNrZWQpID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGZpbHRlci1idXR0b24gcG9zaXRpb24tcmVsYXRpdmVcIiAoY2xpY2spPVwidG9nZ2xlRmlsdGVyKCRldmVudClcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUgMTBIMTVNMi41IDVIMTcuNU03LjUgMTVIMTIuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgRmlsdGVyXHJcbiAgICAgICAgQGlmKGlzRmlsdGVyQXBwbGllZCl7XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGNsYXNzPVwiYWN0aXZlLWZpbHRlclwiPlxyXG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTBcIiBjeT1cIjEwXCIgcj1cIjVcIiBmaWxsPVwicmVkXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICB9XHJcblxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgQGlmKGlzRmlsdGVyT3Blbil7XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWRyb3Bkb3duXCI+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxoMj5GaWx0ZXIgT3B0aW9uczwvaDI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uUmVzZXRGaWx0ZXIoKVwiPlJlc2V0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIChjbGljayk9XCJvbkFwcGx5RmlsdGVyKClcIj5BcHBseTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1ib2R5XCI+XHJcblxyXG4gICAgICAgICAgICBAZm9yIChmaWx0ZXIgb2YgZmlsdGVyczsgbGV0IGZpID0gJGluZGV4OyB0cmFjayBmaSkge1xyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0td3JhcHBlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTEgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWJ1dHRvbiBmb3JtLXNlbGVjdFwiIChjbGljayk9XCJ0b2dnbGVJdGVtKCRldmVudCwgZmkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihmaWx0ZXIudHlwZSA9PT0gJ211bHRpJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ZmlsdGVyLnRpdGxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFNlbGVjdGVkQ291bnQoZmkpID4gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UtY291bnRcIj57eyBnZXRTZWxlY3RlZENvdW50KGZpKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0U2VsZWN0ZWRJdGVtKGZpKT8ubmFtZSA/PyBmaWx0ZXIudGl0bGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIEBpZihmaWx0ZXIuaXNPcGVuZWQpe1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tZHJvcGRvd25cIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgQGlmKGZpbHRlci50eXBlID09PSAnbXVsdGknKXtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2lkXT1cIidzZWxlY3RBbGwnICsgZmlcIiBbY2hlY2tlZF09XCJpc0FsbFZpc2libGVTZWxlY3RlZEJ5RmlsdGVyKGZpbHRlcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGxWaXNpYmxlQnlGaWx0ZXIoJGV2ZW50LCBmaWx0ZXIpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidzZWxlY3RBbGwnICsgZmlcIj5TZWxlY3QgYWxsPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGhyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlYXJjaC1pY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxN1wiIHZpZXdCb3g9XCIwIDAgMTYgMTdcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQgMTQuNUwxMS4xIDExLjZNMTIuNjY2NyA3LjgzMzMzQzEyLjY2NjcgMTAuNzc4OSAxMC4yNzg5IDEzLjE2NjcgNy4zMzMzMyAxMy4xNjY3QzQuMzg3ODEgMTMuMTY2NyAyIDEwLjc3ODkgMiA3LjgzMzMzQzIgNC44ODc4MSA0LjM4NzgxIDIuNSA3LjMzMzMzIDIuNUMxMC4yNzg5IDIuNSAxMi42NjY3IDQuODg3ODEgMTIuNjY2NyA3LjgzMzMzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJzZWFyY2hcIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtZmllbGRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25TZWFyY2goJGV2ZW50LCBmaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihkaXNwbGF5ZWRPcHRpb25zW2ZpXS5sZW5ndGggPT0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuby1kYXRhXCI+Tm8gRGF0YTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgQGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBAZm9yKG9wdGlvbiBvZiBkaXNwbGF5ZWRPcHRpb25zW2ZpXTsgbGV0IG9pID0gJGluZGV4OyB0cmFjayBvaSl7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihmaWx0ZXIudHlwZSA9PT0gJ3NpbmdsZScpe1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtb3B0aW9uXCIgKGNsaWNrKT1cIm9uU2luZ2xlU2VsZWN0KGZpbHRlciwgb3B0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhZGlvLWNpcmNsZVwiIFtjbGFzcy5zZWxlY3RlZF09XCJvcHRpb24uY2hlY2tlZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IG9wdGlvbi5uYW1lIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihmaWx0ZXIudHlwZSA9PT0gJ211bHRpJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtpZF09XCInb3B0aW9uLScgKyBmaSArICctJyArIG9pXCIgWyhuZ01vZGVsKV09XCJvcHRpb24uY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uT3B0aW9uQ2hhbmdlKGZpbHRlciwgb3B0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInb3B0aW9uLScgKyBmaSArICctJyArIG9pXCI+e3sgb3B0aW9uLm5hbWUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG48L2Rpdj5cclxuIl19
@@ -0,0 +1,211 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { Subject, takeUntil } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../../../services/store-builder.service";
7
+ import * as i2 from "@angular/common";
8
+ import * as i3 from "@angular/forms";
9
+ export class StoreDropdownComponent {
10
+ cd;
11
+ authService;
12
+ onClick(event) {
13
+ const target = event.target;
14
+ if (!target.closest('.dropdown')) {
15
+ this.showDropdown = false;
16
+ }
17
+ }
18
+ items;
19
+ searchField;
20
+ multi;
21
+ idField;
22
+ selectedValues = [];
23
+ disabled;
24
+ label;
25
+ selected = new EventEmitter();
26
+ filteredValues = [];
27
+ showDropdown;
28
+ searchValue;
29
+ instanceId;
30
+ destroy$ = new Subject();
31
+ isUpdating = false;
32
+ constructor(cd, authService) {
33
+ this.cd = cd;
34
+ this.authService = authService;
35
+ }
36
+ ngOnInit() {
37
+ this.instanceId = crypto.randomUUID();
38
+ this.authService.dropDownTrigger
39
+ .pipe(takeUntil(this.destroy$))
40
+ .subscribe((e) => {
41
+ if (e !== this.instanceId) {
42
+ this.showDropdown = false;
43
+ this.cd.detectChanges();
44
+ }
45
+ });
46
+ }
47
+ ngOnDestroy() {
48
+ this.destroy$.next();
49
+ this.destroy$.complete();
50
+ }
51
+ ngOnChanges(changes) {
52
+ // Prevent infinite loops
53
+ if (this.isUpdating) {
54
+ return;
55
+ }
56
+ if (changes['items']) {
57
+ const itemsChanged = JSON.stringify(changes['items'].currentValue) !== JSON.stringify(changes['items'].previousValue);
58
+ if (itemsChanged && this.items?.length) {
59
+ this.initializeItems();
60
+ }
61
+ }
62
+ if (changes['selectedValues']) {
63
+ const selectedChanged = JSON.stringify(changes['selectedValues'].currentValue) !== JSON.stringify(changes['selectedValues'].previousValue);
64
+ if (selectedChanged && Array.isArray(changes['selectedValues']?.currentValue)) {
65
+ if (changes['selectedValues'].currentValue.length > 0) {
66
+ this.updateSelectedValues();
67
+ }
68
+ else {
69
+ // Clear selections if empty array
70
+ this.filteredValues.forEach((item) => {
71
+ item.isSelected = false;
72
+ });
73
+ }
74
+ }
75
+ }
76
+ }
77
+ initializeItems() {
78
+ this.isUpdating = true;
79
+ this.filteredValues = this.items.map((item) => ({ ...item, isSelected: false }));
80
+ this.updateSelectedValues();
81
+ this.isUpdating = false;
82
+ this.cd.detectChanges();
83
+ }
84
+ updateSelectedValues() {
85
+ if (!this.filteredValues || !this.selectedValues) {
86
+ return;
87
+ }
88
+ // First, clear all selections
89
+ this.filteredValues.forEach((item) => {
90
+ item.isSelected = false;
91
+ });
92
+ // Then, set selected items
93
+ this.selectedValues?.forEach((selectedItem) => {
94
+ const item = this.filteredValues?.find((filteredItem) => filteredItem?.[this.idField] === selectedItem?.[this.idField]);
95
+ if (item) {
96
+ item.isSelected = true;
97
+ }
98
+ });
99
+ }
100
+ openDropdown(event) {
101
+ this.authService.dropDownTrigger.next(this.instanceId);
102
+ event.stopPropagation();
103
+ this.showDropdown = !this.showDropdown;
104
+ }
105
+ onInput(event) {
106
+ if (!event.target.value) {
107
+ this.filteredValues = this.items.map((item) => ({ ...item }));
108
+ }
109
+ else {
110
+ const searchTerm = event.target.value.toLowerCase();
111
+ this.filteredValues = this.items
112
+ .filter((item) => item[this.searchField]?.toLowerCase().includes(searchTerm))
113
+ .map((item) => ({ ...item }));
114
+ }
115
+ // Preserve selection state when filtering
116
+ this.updateSelectedValues();
117
+ this.cd.detectChanges();
118
+ }
119
+ onSelect(event, item) {
120
+ this.isUpdating = true;
121
+ let newSelectedValues;
122
+ if (this.multi) {
123
+ if (event.currentTarget.checked) {
124
+ // Create new array instead of mutating input
125
+ newSelectedValues = [...this.selectedValues, item];
126
+ }
127
+ else {
128
+ newSelectedValues = this.selectedValues.filter((elem) => elem[this.idField] !== item[this.idField]);
129
+ }
130
+ }
131
+ else {
132
+ newSelectedValues = [{ ...item }];
133
+ this.filteredValues.forEach((element) => {
134
+ if (element[this.idField] !== item[this.idField]) {
135
+ element.isSelected = false;
136
+ }
137
+ else {
138
+ element.isSelected = true;
139
+ }
140
+ });
141
+ this.showDropdown = false;
142
+ }
143
+ // Update internal state
144
+ this.selectedValues = newSelectedValues;
145
+ this.updateSelectedValues();
146
+ const valuesToEmit = newSelectedValues.map((value) => {
147
+ const selectedItem = { ...value };
148
+ delete selectedItem.isSelected;
149
+ return selectedItem;
150
+ });
151
+ this.isUpdating = false;
152
+ this.cd.detectChanges();
153
+ this.emitSelectedValues(valuesToEmit);
154
+ }
155
+ onSelectAll(event) {
156
+ this.isUpdating = true;
157
+ const selectAll = event.currentTarget.checked;
158
+ this.filteredValues.forEach((item) => item.isSelected = selectAll);
159
+ // Create new array instead of mutating input
160
+ if (selectAll) {
161
+ this.selectedValues = [...this.filteredValues];
162
+ }
163
+ else {
164
+ this.selectedValues = [];
165
+ }
166
+ const valuesToEmit = this.selectedValues.map((value) => {
167
+ const { isSelected, ...selectedItem } = value;
168
+ return selectedItem;
169
+ });
170
+ this.isUpdating = false;
171
+ this.cd.detectChanges();
172
+ this.emitSelectedValues(valuesToEmit);
173
+ }
174
+ emitSelectedValues(values) {
175
+ if (this.multi) {
176
+ this.selected.emit(values);
177
+ }
178
+ else {
179
+ this.selected.emit(values[0]);
180
+ }
181
+ }
182
+ checkIfAllSelected() {
183
+ return this.filteredValues.every((item) => item.isSelected);
184
+ }
185
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreDropdownComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.StoreBuilderService }], target: i0.ɵɵFactoryTarget.Component });
186
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StoreDropdownComponent, isStandalone: true, selector: "lib-store-dropdown", inputs: { items: "items", searchField: "searchField", multi: "multi", idField: "idField", selectedValues: "selectedValues", disabled: "disabled", label: "label" }, outputs: { selected: "selected" }, host: { listeners: { "document:click": "onClick($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"outer-container\">\r\n <div [ngClass]=\"disabled ? 'disable-input':''\" (click)=\"openDropdown($event)\" class=\"form-select\">\r\n <span class=\"select-text\">\r\n <ng-container *ngIf=\"multi\" >\r\n {{selectedValues?.length}} {{label}} Selected \r\n </ng-container>\r\n <ng-container *ngIf=\"!multi\" >\r\n {{selectedValues?.[0]?.[searchField] || 'Select store'}}\r\n </ng-container>\r\n </span>\r\n <svg class=\"chevron-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div [ngClass]=\"showDropdown ? '' : 'd-none'\" class=\"input-container dropdown\" >\r\n <div class=\"w-100 input-wrapper\">\r\n <input [(ngModel)]=\"searchValue\" placeholder=\"Search\" (input)=\"onInput($event)\" type=\"text\"> \r\n <svg class=\"search-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n <path d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\" stroke=\"#667085\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> \r\n </div>\r\n <ul>\r\n <li *ngIf=\"multi && filteredValues?.length\">\r\n <label class=\"form-check\" for=\"selectAll\">\r\n <input (change)=\"onSelectAll($event)\" [checked]=\"checkIfAllSelected()\" class=\"form-check-input me-3\" type=\"checkbox\"\r\n id=\"selectAll\">\r\n <span class=\"form-check-label\" >\r\n Select All\r\n </span>\r\n </label>\r\n </li>\r\n <li *ngFor=\"let item of filteredValues\" [ngClass]=\"item.isSelected && !multi ? 'selected' : ''\" >\r\n <label [for]=\"item[idField] + instanceId\" [ngClass]=\"multi ? '': 'ps-0'\" class=\"form-check\">\r\n <input [ngClass]=\"multi ? '': 'd-none'\" (change)=\"onSelect($event, item)\" [(ngModel)]=\"item.isSelected\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\"\r\n [id]=\"item[idField] + instanceId\">\r\n <span class=\"form-check-label\" >\r\n {{item[searchField]}}\r\n </span>\r\n </label>\r\n </li>\r\n <li *ngIf=\"!filteredValues?.length\" >\r\n <span class=\"d-flex align-items-center justify-content-center\" >No data found</span>\r\n </li>\r\n </ul> \r\n </div> \r\n \r\n</div>\r\n", styles: [":host{display:inline-block;width:auto;height:auto}.outer-container{position:relative;background-color:#fff;width:100%;border-radius:8px}.outer-container .form-select{font-size:14px;font-weight:500;border-radius:8px!important;color:var(--Gray-700, #344054);border:1px solid var(--Gray-300, #D0D5DD)!important;height:40px;padding:8px 12px;display:flex;align-items:center;justify-content:space-between;cursor:pointer;background:#fff}.outer-container .form-select .select-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.outer-container .form-select .chevron-icon{flex-shrink:0;margin-left:8px;transition:transform .2s ease}.outer-container .form-select:hover{border-color:var(--Gray-400, #98A2B3)!important}.outer-container .disable-input{pointer-events:none;background-color:#f9fafb!important}.outer-container .input-container{position:absolute;width:100%;z-index:1}.outer-container .input-container .input-wrapper{padding:8px 10px;background-color:#fff;border-top-right-radius:8px;border-top-left-radius:8px;border-top:1px solid rgba(16,24,40,.08);border-right:1px solid rgba(16,24,40,.08);border-left:1px solid rgba(16,24,40,.08)}.outer-container .input-container .input-wrapper input{width:100%;border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);box-shadow:0 1px 2px #1018280d;padding:10px 14px 10px 30px;outline:none}.outer-container .input-container .input-wrapper input ::placeholder{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .input-wrapper .search-icon{position:absolute;left:20px;top:20px}.outer-container .input-container ul{position:relative;background-color:#fff;margin:0;padding:0;max-height:200px;min-height:auto;overflow-y:auto;border-bottom-right-radius:8px;border-bottom-left-radius:8px;border-bottom:1px solid rgba(16,24,40,.08);border-right:1px solid rgba(16,24,40,.08);border-left:1px solid rgba(16,24,40,.08)}.outer-container .input-container ul .selected{background:#f9fafb}.outer-container .input-container ul li{list-style:none;padding:10px 16px;cursor:pointer}.outer-container .input-container ul li label{cursor:pointer}.outer-container .input-container ul li:hover{background:#f9fafb}.form-check{display:flex;align-items:center}.form-check-input{height:16px;width:16px;border-radius:4px;border:1px solid var(--Primary-600, #00A3FF)}.form-check-input:checked{--bs-form-check-bg-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAB4SURBVHgBhY7NDUBQEIRnqcJNKXTg6qYTStCB+Isy6IQSNMDa9SLh5eWZZPcw+81kCX/quABhD73QyKXsGoyIvNCJSto2hEhNtY4N9cwYeMXEsVqB1GaSauRQOpty2tSmO3FgloAmF5nEhgyoesMO6CuFW66fn2xdFyA3ZzcRLrMAAAAASUVORK5CYII=);background-color:#eaf8ff;border-color:#00a3ff}.form-check-label{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.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: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
187
+ }
188
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreDropdownComponent, decorators: [{
189
+ type: Component,
190
+ args: [{ selector: 'lib-store-dropdown', standalone: true, imports: [CommonModule, FormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"outer-container\">\r\n <div [ngClass]=\"disabled ? 'disable-input':''\" (click)=\"openDropdown($event)\" class=\"form-select\">\r\n <span class=\"select-text\">\r\n <ng-container *ngIf=\"multi\" >\r\n {{selectedValues?.length}} {{label}} Selected \r\n </ng-container>\r\n <ng-container *ngIf=\"!multi\" >\r\n {{selectedValues?.[0]?.[searchField] || 'Select store'}}\r\n </ng-container>\r\n </span>\r\n <svg class=\"chevron-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div [ngClass]=\"showDropdown ? '' : 'd-none'\" class=\"input-container dropdown\" >\r\n <div class=\"w-100 input-wrapper\">\r\n <input [(ngModel)]=\"searchValue\" placeholder=\"Search\" (input)=\"onInput($event)\" type=\"text\"> \r\n <svg class=\"search-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n <path d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\" stroke=\"#667085\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> \r\n </div>\r\n <ul>\r\n <li *ngIf=\"multi && filteredValues?.length\">\r\n <label class=\"form-check\" for=\"selectAll\">\r\n <input (change)=\"onSelectAll($event)\" [checked]=\"checkIfAllSelected()\" class=\"form-check-input me-3\" type=\"checkbox\"\r\n id=\"selectAll\">\r\n <span class=\"form-check-label\" >\r\n Select All\r\n </span>\r\n </label>\r\n </li>\r\n <li *ngFor=\"let item of filteredValues\" [ngClass]=\"item.isSelected && !multi ? 'selected' : ''\" >\r\n <label [for]=\"item[idField] + instanceId\" [ngClass]=\"multi ? '': 'ps-0'\" class=\"form-check\">\r\n <input [ngClass]=\"multi ? '': 'd-none'\" (change)=\"onSelect($event, item)\" [(ngModel)]=\"item.isSelected\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\"\r\n [id]=\"item[idField] + instanceId\">\r\n <span class=\"form-check-label\" >\r\n {{item[searchField]}}\r\n </span>\r\n </label>\r\n </li>\r\n <li *ngIf=\"!filteredValues?.length\" >\r\n <span class=\"d-flex align-items-center justify-content-center\" >No data found</span>\r\n </li>\r\n </ul> \r\n </div> \r\n \r\n</div>\r\n", styles: [":host{display:inline-block;width:auto;height:auto}.outer-container{position:relative;background-color:#fff;width:100%;border-radius:8px}.outer-container .form-select{font-size:14px;font-weight:500;border-radius:8px!important;color:var(--Gray-700, #344054);border:1px solid var(--Gray-300, #D0D5DD)!important;height:40px;padding:8px 12px;display:flex;align-items:center;justify-content:space-between;cursor:pointer;background:#fff}.outer-container .form-select .select-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.outer-container .form-select .chevron-icon{flex-shrink:0;margin-left:8px;transition:transform .2s ease}.outer-container .form-select:hover{border-color:var(--Gray-400, #98A2B3)!important}.outer-container .disable-input{pointer-events:none;background-color:#f9fafb!important}.outer-container .input-container{position:absolute;width:100%;z-index:1}.outer-container .input-container .input-wrapper{padding:8px 10px;background-color:#fff;border-top-right-radius:8px;border-top-left-radius:8px;border-top:1px solid rgba(16,24,40,.08);border-right:1px solid rgba(16,24,40,.08);border-left:1px solid rgba(16,24,40,.08)}.outer-container .input-container .input-wrapper input{width:100%;border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);box-shadow:0 1px 2px #1018280d;padding:10px 14px 10px 30px;outline:none}.outer-container .input-container .input-wrapper input ::placeholder{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .input-wrapper .search-icon{position:absolute;left:20px;top:20px}.outer-container .input-container ul{position:relative;background-color:#fff;margin:0;padding:0;max-height:200px;min-height:auto;overflow-y:auto;border-bottom-right-radius:8px;border-bottom-left-radius:8px;border-bottom:1px solid rgba(16,24,40,.08);border-right:1px solid rgba(16,24,40,.08);border-left:1px solid rgba(16,24,40,.08)}.outer-container .input-container ul .selected{background:#f9fafb}.outer-container .input-container ul li{list-style:none;padding:10px 16px;cursor:pointer}.outer-container .input-container ul li label{cursor:pointer}.outer-container .input-container ul li:hover{background:#f9fafb}.form-check{display:flex;align-items:center}.form-check-input{height:16px;width:16px;border-radius:4px;border:1px solid var(--Primary-600, #00A3FF)}.form-check-input:checked{--bs-form-check-bg-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAB4SURBVHgBhY7NDUBQEIRnqcJNKXTg6qYTStCB+Isy6IQSNMDa9SLh5eWZZPcw+81kCX/quABhD73QyKXsGoyIvNCJSto2hEhNtY4N9cwYeMXEsVqB1GaSauRQOpty2tSmO3FgloAmF5nEhgyoesMO6CuFW66fn2xdFyA3ZzcRLrMAAAAASUVORK5CYII=);background-color:#eaf8ff;border-color:#00a3ff}.form-check-label{color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}\n"] }]
191
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.StoreBuilderService }], propDecorators: { onClick: [{
192
+ type: HostListener,
193
+ args: ['document:click', ['$event']]
194
+ }], items: [{
195
+ type: Input
196
+ }], searchField: [{
197
+ type: Input
198
+ }], multi: [{
199
+ type: Input
200
+ }], idField: [{
201
+ type: Input
202
+ }], selectedValues: [{
203
+ type: Input
204
+ }], disabled: [{
205
+ type: Input
206
+ }], label: [{
207
+ type: Input
208
+ }], selected: [{
209
+ type: Output
210
+ }] } });
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY29sbGVjdGlvbi11cGRhdGUtYWkvY29tcG9uZW50cy9zdG9yZS1kcm9wZG93bi9zdG9yZS1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9jb2xsZWN0aW9uLXVwZGF0ZS1haS9jb21wb25lbnRzL3N0b3JlLWRyb3Bkb3duL3N0b3JlLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQzlLLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBVTFDLE1BQU0sT0FBTyxzQkFBc0I7SUEwQmI7SUFBK0I7SUF2Qm5ELE9BQU8sQ0FBQyxLQUFpQjtRQUN2QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztTQUMzQjtJQUNILENBQUM7SUFFUSxLQUFLLENBQUs7SUFDVixXQUFXLENBQVE7SUFDbkIsS0FBSyxDQUFTO0lBQ2QsT0FBTyxDQUFR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c0I7NEZBQXRCLHNCQUFzQix3V0NkbkMsdTdGQStDQSxvOUZEcENZLFlBQVksNlZBQUUsV0FBVzs7NEZBR3hCLHNCQUFzQjtrQkFSbEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FHbEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxtQkFDbkIsdUJBQXVCLENBQUMsTUFBTTt3SEFLL0MsT0FBTztzQkFETixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVFqQyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItc3RvcmUtZHJvcGRvd24nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdG9yZS1kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3N0b3JlLWRyb3Bkb3duLmNvbXBvbmVudC5zY3NzJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFN0b3JlRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghdGFyZ2V0LmNsb3Nlc3QoJy5kcm9wZG93bicpKSB7XHJcbiAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBpdGVtczogYW55XHJcbiAgQElucHV0KCkgc2VhcmNoRmllbGQ6IHN0cmluZ1xyXG4gIEBJbnB1dCgpIG11bHRpOiBib29sZWFuXHJcbiAgQElucHV0KCkgaWRGaWVsZDogc3RyaW5nXHJcbiAgQElucHV0KCkgc2VsZWN0ZWRWYWx1ZXM6IGFueSA9IFtdXHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWRcclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nXHJcblxyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXHJcbiAgZmlsdGVyZWRWYWx1ZXM6IGFueSA9IFtdXHJcbiAgc2hvd0Ryb3Bkb3duOiBib29sZWFuXHJcbiAgc2VhcmNoVmFsdWU6IHN0cmluZ1xyXG4gIGluc3RhbmNlSWQ6IGFueTtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcml2YXRlIGlzVXBkYXRpbmcgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgYXV0aFNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2UpIHsgfVxyXG4gIFxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbnN0YW5jZUlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcclxuICAgIHRoaXMuYXV0aFNlcnZpY2UuZHJvcERvd25UcmlnZ2VyXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICAgIGlmIChlICE9PSB0aGlzLmluc3RhbmNlSWQpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2VcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcHNcclxuICAgIGlmICh0aGlzLmlzVXBkYXRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzWydpdGVtcyddKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1zQ2hhbmdlZCA9IEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ2l0ZW1zJ10uY3VycmVudFZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1snaXRlbXMnXS5wcmV2aW91c1ZhbHVlKTtcclxuICAgICAgaWYgKGl0ZW1zQ2hhbmdlZCAmJiB0aGlzLml0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVJdGVtcygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFZhbHVlcyddKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2hhbmdlZCA9IEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ3NlbGVjdGVkVmFsdWVzJ10uY3VycmVudFZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1snc2VsZWN0ZWRWYWx1ZXMnXS5wcmV2aW91c1ZhbHVlKTtcclxuICAgICAgaWYgKHNlbGVjdGVkQ2hhbmdlZCAmJiBBcnJheS5pc0FycmF5KGNoYW5nZXNbJ3NlbGVjdGVkVmFsdWVzJ10/LmN1cnJlbnRWYWx1ZSkpIHtcclxuICAgICAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWRWYWx1ZXMnXS5jdXJyZW50VmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZFZhbHVlcygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBDbGVhciBzZWxlY3Rpb25zIGlmIGVtcHR5IGFycmF5XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkVmFsdWVzLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZUl0ZW1zKCkge1xyXG4gICAgdGhpcy5pc1VwZGF0aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZmlsdGVyZWRWYWx1ZXMgPSB0aGlzLml0ZW1zLm1hcCgoaXRlbTogYW55KSA9PiAoeyAuLi5pdGVtLCBpc1NlbGVjdGVkOiBmYWxzZSB9KSk7XHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkVmFsdWVzKCk7XHJcbiAgICB0aGlzLmlzVXBkYXRpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2VsZWN0ZWRWYWx1ZXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyZWRWYWx1ZXMgfHwgIXRoaXMuc2VsZWN0ZWRWYWx1ZXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBGaXJzdCwgY2xlYXIgYWxsIHNlbGVjdGlvbnNcclxuICAgIHRoaXMuZmlsdGVyZWRWYWx1ZXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIGl0ZW0uaXNTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIC8vIFRoZW4sIHNldCBzZWxlY3RlZCBpdGVtc1xyXG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlcz8uZm9yRWFjaCgoc2VsZWN0ZWRJdGVtOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZmlsdGVyZWRWYWx1ZXM/LmZpbmQoKGZpbHRlcmVkSXRlbTogYW55KSA9PiBmaWx0ZXJlZEl0ZW0/Llt0aGlzLmlkRmllbGRdID09PSBzZWxlY3RlZEl0ZW0/Llt0aGlzLmlkRmllbGRdKTtcclxuICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9wZW5Ecm9wZG93bihldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmRyb3BEb3duVHJpZ2dlci5uZXh0KHRoaXMuaW5zdGFuY2VJZClcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5zaG93RHJvcGRvd24gPSAhdGhpcy5zaG93RHJvcGRvd247XHJcbiAgfVxyXG5cclxuICBvbklucHV0KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICghZXZlbnQudGFyZ2V0LnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRWYWx1ZXMgPSB0aGlzLml0ZW1zLm1hcCgoaXRlbTogYW55KSA9PiAoeyAuLi5pdGVtIH0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSBldmVudC50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgdGhpcy5maWx0ZXJlZFZhbHVlcyA9IHRoaXMuaXRlbXNcclxuICAgICAgICAuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW1bdGhpcy5zZWFyY2hGaWVsZF0/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybSkpXHJcbiAgICAgICAgLm1hcCgoaXRlbTogYW55KSA9PiAoeyAuLi5pdGVtIH0pKTtcclxuICAgIH1cclxuICAgIC8vIFByZXNlcnZlIHNlbGVjdGlvbiBzdGF0ZSB3aGVuIGZpbHRlcmluZ1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZFZhbHVlcygpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdChldmVudDogYW55LCBpdGVtOiBhbnkpIHtcclxuICAgIHRoaXMuaXNVcGRhdGluZyA9IHRydWU7XHJcbiAgICBcclxuICAgIGxldCBuZXdTZWxlY3RlZFZhbHVlczogYW55W107XHJcbiAgICBcclxuICAgIGlmICh0aGlzLm11bHRpKSB7XHJcbiAgICAgIGlmIChldmVudC5jdXJyZW50VGFyZ2V0LmNoZWNrZWQpIHtcclxuICAgICAgICAvLyBDcmVhdGUgbmV3IGFycmF5IGluc3RlYWQgb2YgbXV0YXRpbmcgaW5wdXRcclxuICAgICAgICBuZXdTZWxlY3RlZFZhbHVlcyA9IFsuLi50aGlzLnNlbGVjdGVkVmFsdWVzLCBpdGVtXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXdTZWxlY3RlZFZhbHVlcyA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMuZmlsdGVyKChlbGVtOiBhbnkpID0+IGVsZW1bdGhpcy5pZEZpZWxkXSAhPT0gaXRlbVt0aGlzLmlkRmllbGRdKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbmV3U2VsZWN0ZWRWYWx1ZXMgPSBbeyAuLi5pdGVtIH1dO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkVmFsdWVzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChlbGVtZW50W3RoaXMuaWRGaWVsZF0gIT09IGl0ZW1bdGhpcy5pZEZpZWxkXSkge1xyXG4gICAgICAgICAgZWxlbWVudC5pc1NlbGVjdGVkID0gZmFsc2VcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZWxlbWVudC5pc1NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNob3dEcm9wZG93biA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSBpbnRlcm5hbCBzdGF0ZVxyXG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlcyA9IG5ld1NlbGVjdGVkVmFsdWVzO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZFZhbHVlcygpO1xyXG5cclxuICAgIGNvbnN0IHZhbHVlc1RvRW1pdCA9IG5ld1NlbGVjdGVkVmFsdWVzLm1hcCgodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSB7IC4uLnZhbHVlIH07XHJcbiAgICAgIGRlbGV0ZSBzZWxlY3RlZEl0ZW0uaXNTZWxlY3RlZDtcclxuICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaXNVcGRhdGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLmVtaXRTZWxlY3RlZFZhbHVlcyh2YWx1ZXNUb0VtaXQpO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RBbGwoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5pc1VwZGF0aW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHNlbGVjdEFsbCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hlY2tlZDtcclxuICAgIHRoaXMuZmlsdGVyZWRWYWx1ZXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiBpdGVtLmlzU2VsZWN0ZWQgPSBzZWxlY3RBbGwpO1xyXG5cclxuICAgIC8vIENyZWF0ZSBuZXcgYXJyYXkgaW5zdGVhZCBvZiBtdXRhdGluZyBpbnB1dFxyXG4gICAgaWYgKHNlbGVjdEFsbCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzID0gWy4uLnRoaXMuZmlsdGVyZWRWYWx1ZXNdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZhbHVlc1RvRW1pdCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMubWFwKCh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgaXNTZWxlY3RlZCwgLi4uc2VsZWN0ZWRJdGVtIH0gPSB2YWx1ZTtcclxuICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaXNVcGRhdGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLmVtaXRTZWxlY3RlZFZhbHVlcyh2YWx1ZXNUb0VtaXQpO1xyXG4gIH1cclxuXHJcblxyXG4gIGVtaXRTZWxlY3RlZFZhbHVlcyh2YWx1ZXM6IGFueVtdKSB7XHJcbiAgICBpZiAodGhpcy5tdWx0aSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkLmVtaXQodmFsdWVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdCh2YWx1ZXNbMF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hlY2tJZkFsbFNlbGVjdGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRWYWx1ZXMuZXZlcnkoKGl0ZW06IGFueSkgPT4gaXRlbS5pc1NlbGVjdGVkKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm91dGVyLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBbbmdDbGFzc109XCJkaXNhYmxlZCA/ICdkaXNhYmxlLWlucHV0JzonJ1wiICAoY2xpY2spPVwib3BlbkRyb3Bkb3duKCRldmVudClcIiAgY2xhc3M9XCJmb3JtLXNlbGVjdFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LXRleHRcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm11bHRpXCIgPlxyXG4gICAgICAgICAgICAgICAge3tzZWxlY3RlZFZhbHVlcz8ubGVuZ3RofX0ge3tsYWJlbH19IFNlbGVjdGVkICAgIFxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtdWx0aVwiID5cclxuICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWRWYWx1ZXM/LlswXT8uW3NlYXJjaEZpZWxkXSB8fCAnU2VsZWN0IHN0b3JlJ319XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8c3ZnIGNsYXNzPVwiY2hldnJvbi1pY29uXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInNob3dEcm9wZG93biA/ICcnIDogJ2Qtbm9uZSdcIiBjbGFzcz1cImlucHV0LWNvbnRhaW5lciBkcm9wZG93blwiID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgaW5wdXQtd3JhcHBlclwiPlxyXG4gICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cInNlYXJjaFZhbHVlXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50KVwiIHR5cGU9XCJ0ZXh0XCI+ICBcclxuICAgICAgICA8c3ZnIGNsYXNzPVwic2VhcmNoLWljb25cIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAxNiAxN1wiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTQgMTQuNUwxMS4xIDExLjZNMTIuNjY2NyA3LjgzMzMzQzEyLjY2NjcgMTAuNzc4OSAxMC4yNzg5IDEzLjE2NjcgNy4zMzMzMyAxMy4xNjY3QzQuMzg3ODEgMTMuMTY2NyAyIDEwLjc3ODkgMiA3LjgzMzMzQzIgNC44ODc4MSA0LjM4NzgxIDIuNSA3LjMzMzMzIDIuNUMxMC4yNzg5IDIuNSAxMi42NjY3IDQuODg3ODEgMTIuNjY2NyA3LjgzMzMzWlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICA8L3N2Zz4gIFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDx1bD5cclxuICAgICAgICAgICAgPGxpICpuZ0lmPVwibXVsdGkgJiYgZmlsdGVyZWRWYWx1ZXM/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVja1wiIGZvcj1cInNlbGVjdEFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsKCRldmVudClcIiBbY2hlY2tlZF09XCJjaGVja0lmQWxsU2VsZWN0ZWQoKVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0zXCIgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJzZWxlY3RBbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBBbGxcclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRWYWx1ZXNcIiBbbmdDbGFzc109XCJpdGVtLmlzU2VsZWN0ZWQgJiYgIW11bHRpID8gJ3NlbGVjdGVkJyA6ICcnXCIgPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiaXRlbVtpZEZpZWxkXSArIGluc3RhbmNlSWRcIiBbbmdDbGFzc109XCJtdWx0aSAgPyAnJzogJ3BzLTAnXCIgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtuZ0NsYXNzXT1cIm11bHRpICA/ICcnOiAnZC1ub25lJ1wiIChjaGFuZ2UpPVwib25TZWxlY3QoJGV2ZW50LCBpdGVtKVwiIFsobmdNb2RlbCldPVwiaXRlbS5pc1NlbGVjdGVkXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTNcIiB0eXBlPVwiY2hlY2tib3hcIiB2YWx1ZT1cIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJpdGVtW2lkRmllbGRdICsgaW5zdGFuY2VJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtW3NlYXJjaEZpZWxkXX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPGxpICpuZ0lmPVwiIWZpbHRlcmVkVmFsdWVzPy5sZW5ndGhcIiA+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiID5ObyBkYXRhIGZvdW5kPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+ICBcclxuICAgIDwvZGl2PiAgXHJcbiAgIFxyXG48L2Rpdj5cclxuIl19