@firestitch/filter 12.3.2 → 12.5.0

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 (203) hide show
  1. package/app/classes/actions-controller.d.ts +38 -38
  2. package/app/components/action-button/action-button.component.d.ts +7 -7
  3. package/app/components/action-kebab-actions/action-kebab-actions.component.d.ts +7 -7
  4. package/app/components/actions/actions.component.d.ts +8 -8
  5. package/app/components/filter/filter.component.d.ts +192 -192
  6. package/app/components/filter-chip/filter-chip.component.d.ts +26 -26
  7. package/app/components/filter-chip-content/filter-chip-content.component.d.ts +18 -18
  8. package/app/components/filter-chips/filter-chips.component.d.ts +8 -8
  9. package/app/components/filter-drawer/filter-drawer.component.d.ts +30 -30
  10. package/app/components/filter-drawer-actions/filter-drawer-actions.component.d.ts +15 -15
  11. package/app/components/filters-item/autocomplete/autocomplete.component.d.ts +13 -13
  12. package/app/components/filters-item/autocompletechips/autocompletechips.component.d.ts +20 -20
  13. package/app/components/filters-item/base-item/base-item.component.d.ts +23 -23
  14. package/app/components/filters-item/checkbox/checkbox.component.d.ts +11 -11
  15. package/app/components/filters-item/chips/chips.component.d.ts +13 -13
  16. package/app/components/filters-item/date/date.component.d.ts +19 -19
  17. package/app/components/filters-item/date-range/date-range.component.d.ts +14 -14
  18. package/app/components/filters-item/filter-item.component.d.ts +15 -15
  19. package/app/components/filters-item/range/range.component.d.ts +15 -15
  20. package/app/components/filters-item/select/backdrop/backdrop.component.d.ts +6 -6
  21. package/app/components/filters-item/select/groups/groups.component.d.ts +12 -12
  22. package/app/components/filters-item/select/multiple/multiple.component.d.ts +14 -14
  23. package/app/components/filters-item/select/select.component.d.ts +16 -16
  24. package/app/components/filters-item/select/simple/simple.component.d.ts +14 -14
  25. package/app/components/filters-item/text/text.component.d.ts +19 -19
  26. package/app/components/filters-item/week/week.component.d.ts +12 -12
  27. package/app/components/saved-filter-edit/saved-filter-edit.component.d.ts +18 -18
  28. package/app/components/saved-filters-menu/saved-filters-menu.component.d.ts +23 -23
  29. package/app/consts/query-param-delimiter.d.ts +1 -1
  30. package/app/directives/focus-to-item/focus-to-item.directive.d.ts +27 -27
  31. package/app/directives/status-bar/status-bar.directive.d.ts +5 -5
  32. package/app/enums/action-mode.enum.d.ts +5 -5
  33. package/app/enums/action-type.enum.d.ts +7 -7
  34. package/app/enums/item-date-mode.enum.d.ts +5 -5
  35. package/app/enums/item-type.enum.d.ts +15 -15
  36. package/app/fs-filter.module.d.ts +64 -65
  37. package/app/helpers/build-query-params.d.ts +3 -3
  38. package/app/helpers/compare.d.ts +2 -2
  39. package/app/helpers/create-filter-item.d.ts +13 -13
  40. package/app/helpers/find-value.d.ts +1 -1
  41. package/app/helpers/get-range-name.d.ts +1 -1
  42. package/app/helpers/parse-date.d.ts +1 -1
  43. package/app/helpers/parse-item-value-from-stored.d.ts +1 -1
  44. package/app/helpers/query-param-transformers.d.ts +2 -2
  45. package/app/helpers/restore-items.d.ts +12 -12
  46. package/app/helpers/try-convert-to-number.d.ts +1 -1
  47. package/app/injectors/filter-config.d.ts +2 -2
  48. package/app/injectors/filter-drawer-data.d.ts +2 -2
  49. package/app/injectors/filter-drawer-overlay.d.ts +2 -2
  50. package/app/interfaces/action.interface.d.ts +69 -69
  51. package/app/interfaces/config.interface.d.ts +61 -61
  52. package/app/interfaces/external-params.interface.d.ts +3 -3
  53. package/app/interfaces/filter.interface.d.ts +4 -4
  54. package/app/interfaces/items/autocomplete-chips.interface.d.ts +12 -12
  55. package/app/interfaces/items/autocomplete.interface.d.ts +6 -6
  56. package/app/interfaces/items/base.interface.d.ts +27 -27
  57. package/app/interfaces/items/checkbox.interface.d.ts +7 -7
  58. package/app/interfaces/items/chips.interface.d.ts +6 -6
  59. package/app/interfaces/items/date-range.interface.d.ts +8 -8
  60. package/app/interfaces/items/date.interface.d.ts +7 -7
  61. package/app/interfaces/items/range.interface.d.ts +13 -13
  62. package/app/interfaces/items/select.interface.d.ts +20 -20
  63. package/app/interfaces/items/text.interface.d.ts +9 -9
  64. package/app/interfaces/items/week.interface.d.ts +7 -7
  65. package/app/interfaces/saved-filters.interface.d.ts +18 -18
  66. package/app/interfaces/update-filter-item.interface.d.ts +4 -4
  67. package/app/models/action-menu-item.model.d.ts +23 -23
  68. package/app/models/action.model.d.ts +45 -45
  69. package/app/models/filter-config.d.ts +30 -30
  70. package/app/models/items/autocomplete/base-autocomplete-item.d.ts +12 -12
  71. package/app/models/items/autocomplete-chips-item.d.ts +19 -19
  72. package/app/models/items/autocomplete-item.d.ts +10 -10
  73. package/app/models/items/base-item.d.ts +75 -75
  74. package/app/models/items/checkbox-item.d.ts +16 -16
  75. package/app/models/items/chips-item.d.ts +17 -17
  76. package/app/models/items/date/base-date-item.d.ts +14 -14
  77. package/app/models/items/date-item.d.ts +7 -7
  78. package/app/models/items/date-range/base-date-range-item.d.ts +21 -21
  79. package/app/models/items/date-range-item.d.ts +5 -5
  80. package/app/models/items/date-time-item.d.ts +6 -6
  81. package/app/models/items/date-time-range-item.d.ts +5 -5
  82. package/app/models/items/range-item.d.ts +22 -22
  83. package/app/models/items/select/base-select-item.d.ts +13 -13
  84. package/app/models/items/select/multiple-select-item.d.ts +12 -12
  85. package/app/models/items/select/simple-select-item.d.ts +12 -12
  86. package/app/models/items/select-item.d.ts +7 -7
  87. package/app/models/items/text-item.d.ts +14 -14
  88. package/app/models/items/week-item.d.ts +17 -17
  89. package/app/pipes/remove-isolate-value.pipe.d.ts +8 -8
  90. package/app/providers/filter-meta.d.ts +5 -5
  91. package/app/services/external-params/persistance-params-controller.service.d.ts +22 -22
  92. package/app/services/external-params/query-params-controller.service.d.ts +22 -22
  93. package/app/services/external-params/saved-filters-controller.service.d.ts +40 -40
  94. package/app/services/external-params-controller.service.d.ts +44 -44
  95. package/app/services/filter-overlay.service.d.ts +34 -34
  96. package/app/services/focus-controller.service.d.ts +18 -18
  97. package/app/services/items-store.service.d.ts +65 -65
  98. package/bundles/firestitch-filter.umd.js +5343 -5346
  99. package/bundles/firestitch-filter.umd.js.map +1 -1
  100. package/esm2015/app/classes/actions-controller.js +122 -123
  101. package/esm2015/app/components/action-button/action-button.component.js +23 -25
  102. package/esm2015/app/components/action-kebab-actions/action-kebab-actions.component.js +22 -22
  103. package/esm2015/app/components/actions/actions.component.js +31 -31
  104. package/esm2015/app/components/filter/filter.component.js +617 -615
  105. package/esm2015/app/components/filter-chip/filter-chip.component.js +89 -91
  106. package/esm2015/app/components/filter-chip-content/filter-chip-content.component.js +83 -84
  107. package/esm2015/app/components/filter-chips/filter-chips.component.js +24 -24
  108. package/esm2015/app/components/filter-drawer/filter-drawer.component.js +73 -76
  109. package/esm2015/app/components/filter-drawer-actions/filter-drawer-actions.component.js +42 -43
  110. package/esm2015/app/components/filters-item/autocomplete/autocomplete.component.js +30 -30
  111. package/esm2015/app/components/filters-item/autocompletechips/autocompletechips.component.js +52 -52
  112. package/esm2015/app/components/filters-item/base-item/base-item.component.js +59 -59
  113. package/esm2015/app/components/filters-item/checkbox/checkbox.component.js +25 -25
  114. package/esm2015/app/components/filters-item/chips/chips.component.js +32 -32
  115. package/esm2015/app/components/filters-item/date/date.component.js +45 -45
  116. package/esm2015/app/components/filters-item/date-range/date-range.component.js +36 -36
  117. package/esm2015/app/components/filters-item/filter-item.component.js +47 -48
  118. package/esm2015/app/components/filters-item/range/range.component.js +49 -51
  119. package/esm2015/app/components/filters-item/select/backdrop/backdrop.component.js +16 -16
  120. package/esm2015/app/components/filters-item/select/groups/groups.component.js +32 -34
  121. package/esm2015/app/components/filters-item/select/multiple/multiple.component.js +59 -61
  122. package/esm2015/app/components/filters-item/select/select.component.js +44 -44
  123. package/esm2015/app/components/filters-item/select/simple/simple.component.js +45 -48
  124. package/esm2015/app/components/filters-item/text/text.component.js +54 -54
  125. package/esm2015/app/components/filters-item/week/week.component.js +28 -28
  126. package/esm2015/app/components/saved-filter-edit/saved-filter-edit.component.js +55 -55
  127. package/esm2015/app/components/saved-filters-menu/saved-filters-menu.component.js +55 -58
  128. package/esm2015/app/consts/query-param-delimiter.js +1 -1
  129. package/esm2015/app/directives/focus-to-item/focus-to-item.directive.js +125 -130
  130. package/esm2015/app/directives/status-bar/status-bar.directive.js +12 -12
  131. package/esm2015/app/enums/action-mode.enum.js +6 -6
  132. package/esm2015/app/enums/action-type.enum.js +8 -8
  133. package/esm2015/app/enums/item-date-mode.enum.js +6 -6
  134. package/esm2015/app/enums/item-type.enum.js +16 -16
  135. package/esm2015/app/fs-filter.module.js +235 -239
  136. package/esm2015/app/helpers/build-query-params.js +31 -31
  137. package/esm2015/app/helpers/compare.js +37 -37
  138. package/esm2015/app/helpers/create-filter-item.js +54 -54
  139. package/esm2015/app/helpers/find-value.js +12 -12
  140. package/esm2015/app/helpers/get-range-name.js +8 -8
  141. package/esm2015/app/helpers/parse-date.js +7 -7
  142. package/esm2015/app/helpers/parse-item-value-from-stored.js +81 -81
  143. package/esm2015/app/helpers/query-param-transformers.js +8 -8
  144. package/esm2015/app/helpers/restore-items.js +48 -48
  145. package/esm2015/app/helpers/try-convert-to-number.js +5 -5
  146. package/esm2015/app/injectors/filter-config.js +2 -2
  147. package/esm2015/app/injectors/filter-drawer-data.js +2 -2
  148. package/esm2015/app/injectors/filter-drawer-overlay.js +2 -2
  149. package/esm2015/app/interfaces/action.interface.js +1 -1
  150. package/esm2015/app/interfaces/config.interface.js +1 -1
  151. package/esm2015/app/interfaces/external-params.interface.js +1 -1
  152. package/esm2015/app/interfaces/filter.interface.js +1 -1
  153. package/esm2015/app/interfaces/items/autocomplete-chips.interface.js +1 -1
  154. package/esm2015/app/interfaces/items/autocomplete.interface.js +1 -1
  155. package/esm2015/app/interfaces/items/base.interface.js +1 -1
  156. package/esm2015/app/interfaces/items/checkbox.interface.js +1 -1
  157. package/esm2015/app/interfaces/items/chips.interface.js +1 -1
  158. package/esm2015/app/interfaces/items/date-range.interface.js +1 -1
  159. package/esm2015/app/interfaces/items/date.interface.js +1 -1
  160. package/esm2015/app/interfaces/items/range.interface.js +1 -1
  161. package/esm2015/app/interfaces/items/select.interface.js +1 -1
  162. package/esm2015/app/interfaces/items/text.interface.js +1 -1
  163. package/esm2015/app/interfaces/items/week.interface.js +1 -1
  164. package/esm2015/app/interfaces/saved-filters.interface.js +1 -1
  165. package/esm2015/app/interfaces/update-filter-item.interface.js +1 -1
  166. package/esm2015/app/models/action-menu-item.model.js +66 -66
  167. package/esm2015/app/models/action.model.js +102 -102
  168. package/esm2015/app/models/filter-config.js +65 -65
  169. package/esm2015/app/models/items/autocomplete/base-autocomplete-item.js +13 -13
  170. package/esm2015/app/models/items/autocomplete-chips-item.js +61 -61
  171. package/esm2015/app/models/items/autocomplete-item.js +31 -31
  172. package/esm2015/app/models/items/base-item.js +233 -233
  173. package/esm2015/app/models/items/checkbox-item.js +47 -47
  174. package/esm2015/app/models/items/chips-item.js +83 -83
  175. package/esm2015/app/models/items/date/base-date-item.js +47 -47
  176. package/esm2015/app/models/items/date-item.js +18 -18
  177. package/esm2015/app/models/items/date-range/base-date-range-item.js +136 -136
  178. package/esm2015/app/models/items/date-range-item.js +6 -6
  179. package/esm2015/app/models/items/date-time-item.js +9 -9
  180. package/esm2015/app/models/items/date-time-range-item.js +6 -6
  181. package/esm2015/app/models/items/range-item.js +88 -88
  182. package/esm2015/app/models/items/select/base-select-item.js +33 -33
  183. package/esm2015/app/models/items/select/multiple-select-item.js +68 -68
  184. package/esm2015/app/models/items/select/simple-select-item.js +62 -62
  185. package/esm2015/app/models/items/select-item.js +12 -12
  186. package/esm2015/app/models/items/text-item.js +29 -29
  187. package/esm2015/app/models/items/week-item.js +96 -96
  188. package/esm2015/app/pipes/remove-isolate-value.pipe.js +22 -22
  189. package/esm2015/app/providers/filter-meta.js +9 -9
  190. package/esm2015/app/services/external-params/persistance-params-controller.service.js +52 -58
  191. package/esm2015/app/services/external-params/query-params-controller.service.js +55 -57
  192. package/esm2015/app/services/external-params/saved-filters-controller.service.js +163 -165
  193. package/esm2015/app/services/external-params-controller.service.js +161 -166
  194. package/esm2015/app/services/filter-overlay.service.js +115 -116
  195. package/esm2015/app/services/focus-controller.service.js +29 -29
  196. package/esm2015/app/services/items-store.service.js +323 -323
  197. package/esm2015/firestitch-filter.js +4 -4
  198. package/esm2015/public_api.js +36 -36
  199. package/fesm2015/firestitch-filter.js +4268 -4272
  200. package/fesm2015/firestitch-filter.js.map +1 -1
  201. package/firestitch-filter.d.ts +5 -5
  202. package/package.json +3 -2
  203. package/public_api.d.ts +40 -40
@@ -1,615 +1,617 @@
1
- import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, NgZone, ViewChild, ViewEncapsulation, Output, Optional, Inject, ContentChild, TemplateRef, HostBinding, } from '@angular/core';
2
- import { FormControl } from '@angular/forms';
3
- import { MatInput } from '@angular/material/input';
4
- import { BehaviorSubject, combineLatest, fromEvent, Subject } from 'rxjs';
5
- import { debounceTime, distinctUntilChanged, filter, map, takeUntil } from 'rxjs/operators';
6
- import { FS_FILTER_CONFIG } from './../../injectors/filter-config';
7
- import { FsFilterConfig } from '../../models/filter-config';
8
- import { objectsAreEquals } from '../../helpers/compare';
9
- import { FsFilterOverlayService } from '../../services/filter-overlay.service';
10
- import { FilterStatusBarDirective } from './../../directives/status-bar/status-bar.directive';
11
- import { FsFilterItemsStore } from '../../services/items-store.service';
12
- import { ExternalParamsController } from '../../services/external-params-controller.service';
13
- import { PersistanceParamsController } from '../../services/external-params/persistance-params-controller.service';
14
- import { QueryParamsController } from '../../services/external-params/query-params-controller.service';
15
- import { FocusControllerService } from '../../services/focus-controller.service';
16
- import { SavedFiltersController } from '../../services/external-params/saved-filters-controller.service';
17
- import { ActionsController } from '../../classes/actions-controller';
18
- import * as i0 from "@angular/core";
19
- import * as i1 from "../../services/filter-overlay.service";
20
- import * as i2 from "../../services/external-params-controller.service";
21
- import * as i3 from "../../services/items-store.service";
22
- import * as i4 from "../../classes/actions-controller";
23
- import * as i5 from "@angular/material/form-field";
24
- import * as i6 from "@angular/material/icon";
25
- import * as i7 from "@angular/material/button";
26
- import * as i8 from "../actions/actions.component";
27
- import * as i9 from "../filter-chips/filter-chips.component";
28
- import * as i10 from "@angular/common";
29
- import * as i11 from "@angular/forms";
30
- import * as i12 from "@angular/material/input";
31
- import * as i13 from "@angular/flex-layout/extended";
32
- import * as i14 from "../../models/filter-config";
33
- export class FilterComponent {
34
- constructor(_filterOverlay, _zone, _externalParams, _filterItems, _actions, _defaultConfig) {
35
- this._filterOverlay = _filterOverlay;
36
- this._zone = _zone;
37
- this._externalParams = _externalParams;
38
- this._filterItems = _filterItems;
39
- this._actions = _actions;
40
- this._defaultConfig = _defaultConfig;
41
- this.showSortBy = true;
42
- this.showFilterInput = true;
43
- this.closed = new EventEmitter();
44
- this.opened = new EventEmitter();
45
- this.ready = new EventEmitter();
46
- this.showFilterMenu = false;
47
- this.windowDesktop = false;
48
- this.fsFilterClass = true;
49
- this.searchText = new FormControl();
50
- this.searchPlaceholder = 'Search';
51
- this._config = null;
52
- this._filtersBtnVisible$ = new BehaviorSubject(true);
53
- this._keywordVisible$ = new BehaviorSubject(true);
54
- this._hasFilterChips$ = new BehaviorSubject(false);
55
- this._destroy$ = new Subject();
56
- this._listenWhenFilterReady();
57
- this._updateWindowWidth();
58
- this._filterOverlay.attach$
59
- .pipe(takeUntil(this._destroy$))
60
- .subscribe(() => {
61
- this.showFilterMenu = true;
62
- });
63
- this._filterOverlay.detach$
64
- .pipe(takeUntil(this._destroy$))
65
- .subscribe(() => {
66
- this.showFilterMenu = false;
67
- });
68
- this._listenWindowResize();
69
- }
70
- set setConfig(config) {
71
- this._initFilterWithConfig(config);
72
- }
73
- set setFilter(config) {
74
- this._initFilterWithConfig(config);
75
- }
76
- get config() {
77
- return this._config;
78
- }
79
- get filterParams() {
80
- return this._filterItems.values();
81
- }
82
- get filterParamsQuery() {
83
- return this._filterItems.valuesAsQuery();
84
- }
85
- get items() {
86
- return this._filterItems.items;
87
- }
88
- get visibleItems() {
89
- return this._filterItems.visibleItems;
90
- }
91
- get itemsReady$() {
92
- return this._filterItems.ready$;
93
- }
94
- get hasFilterChips$() {
95
- return this._hasFilterChips$.asObservable();
96
- }
97
- get hasVisibleItemOrSorting() {
98
- return this.visibleItems.length > 0 || !!this._filterItems.sortByItem;
99
- }
100
- get hasKeyword() {
101
- return this._filterItems.hasKeyword;
102
- }
103
- get filtersBtnVisible$() {
104
- return this._filtersBtnVisible$.asObservable();
105
- }
106
- get keywordVisible$() {
107
- return this._keywordVisible$.asObservable();
108
- }
109
- get actionsVisible$() {
110
- return this._actions.visible$;
111
- }
112
- get actions$() {
113
- return this._actions.actions$;
114
- }
115
- get menuActions$() {
116
- return this._actions.menuActions$;
117
- }
118
- ngOnInit() {
119
- // Avoid ngChanges error
120
- setTimeout(() => {
121
- if (this.config.autofocus) {
122
- this.focus();
123
- }
124
- });
125
- this._listenInternalItemsChange();
126
- this._initOverlay();
127
- }
128
- ngAfterViewInit() {
129
- this._listenInputKeyEvents();
130
- // FIXME prevent fire change after init
131
- setTimeout(() => {
132
- this._listenInputChanges();
133
- });
134
- }
135
- ngOnDestroy() {
136
- this._destroyFilterDrawer();
137
- this._destroy$.next();
138
- this._destroy$.complete();
139
- }
140
- focus() {
141
- if (this.searchTextMatInput) {
142
- this.searchTextMatInput.focus();
143
- }
144
- }
145
- updateSort(sort) {
146
- this._filterItems.updateSort(sort);
147
- }
148
- /**
149
- *
150
- * Do update value of some field
151
- *
152
- * @param values - values for update
153
- *
154
- * To update text value just pass new text value
155
- *
156
- * public updateSelectValue(val) {
157
- * this.filterEl.updateValues({ keyword: val });
158
- * }
159
- *
160
- * To update select or observable select you could pass suitable value
161
- *
162
- * public updateSelectValue(val: number) {
163
- * this.filterEl.updateValues({ simple_select: val }, { observable_select: val });
164
- * }
165
- *
166
- * To update checkbox value just pass true/false as value
167
- *
168
- * public updateCheckox(val: boolean) {
169
- * this.filterEl.updateValues({ checkbox: val });
170
- * }
171
- *
172
- * To update range value just pass object with min&max object or just with one of targets
173
- *
174
- * Ex.: { min: 10, max 15 }, { min: 5 }, { max 5 }
175
- *
176
- * public updateRange(val) {
177
- * this.filterEl.updateValues({ range: val });
178
- * }
179
- *
180
- * To update autocomplete just pass object with name/value fields
181
- *
182
- * Ex.: { name: 'John Doe', value: 1 }
183
- *
184
- * public updateAutocomplete(val) {
185
- * this.filterEl.updateValues({ autocomplete_user_id: val });
186
- * }
187
- *
188
- * To update autocompletechips just pass:
189
- *
190
- * 1) object with name/value fields - will be appended to existing set of values
191
- *
192
- * { name: 'John Doe', value: 1 }
193
- *
194
- * 2) array of objects - will be appended to existing set of values
195
- *
196
- * [{ name: 'John Doe', value: 1 }, { name: 'Darya Filipova', value: 2 }]
197
- *
198
- * 3) null - clear existing set of values
199
- *
200
- * public updateAutocomplete(val) {
201
- * this.filterEl.updateValues({ autocompletechips_user_id: val });
202
- * }
203
- *
204
- */
205
- updateValues(values) {
206
- Object.keys(values).forEach((key) => {
207
- const filterItem = this.items
208
- .find((item) => item.name === key);
209
- if (!filterItem) {
210
- return;
211
- }
212
- filterItem.model = values[key];
213
- });
214
- }
215
- hide() {
216
- this.changeVisibility(false);
217
- }
218
- show() {
219
- this.changeVisibility(true);
220
- }
221
- changeVisibilityClick(value, event = null) {
222
- if (event) {
223
- event.stopPropagation();
224
- }
225
- this.changeVisibility(value);
226
- }
227
- filterInputEvent(event) {
228
- if (!this.windowDesktop) {
229
- return;
230
- }
231
- if (['Enter', 'NumpadEnter', 'Escape'].indexOf(event.code) >= 0) {
232
- this.changeVisibility(false);
233
- if (this.searchTextInput) {
234
- this.searchTextInput.nativeElement.blur();
235
- }
236
- }
237
- }
238
- getItemValue(name) {
239
- const item = this.items
240
- .find((item) => item.name === name);
241
- if (item) {
242
- return item.model;
243
- }
244
- else {
245
- return null;
246
- }
247
- }
248
- showItem(name) {
249
- const item = this.getItem(name);
250
- if (item) {
251
- item.hide = false;
252
- this._filterItems.updateVisibleItems();
253
- }
254
- }
255
- hideItem(name) {
256
- const item = this.getItem(name);
257
- if (!item) {
258
- return;
259
- }
260
- item.hide = true;
261
- this._filterItems.updateVisibleItems();
262
- }
263
- clearItem(name) {
264
- const item = this.getItem(name);
265
- if (!item) {
266
- return;
267
- }
268
- item.clear();
269
- }
270
- updateItemConfig(name, params) {
271
- var _a, _b;
272
- const item = this.getItem(name);
273
- if (!item) {
274
- return;
275
- }
276
- item.label = (_a = params.label) !== null && _a !== void 0 ? _a : item.label;
277
- item.chipLabel = (_b = params.chipLabel) !== null && _b !== void 0 ? _b : item.chipLabel;
278
- this._filterItems.updateVisibleItems();
279
- }
280
- getItemValueChange$(name) {
281
- const item = this.items.find((i) => i.name === name);
282
- if (item) {
283
- return item.value$
284
- .pipe(map(() => {
285
- return item.model;
286
- }));
287
- }
288
- else {
289
- return null;
290
- }
291
- }
292
- changeVisibility(state) {
293
- if (state === this.showFilterMenu) {
294
- return;
295
- }
296
- if (!state) {
297
- this.closed.emit();
298
- return this._destroyFilterDrawer();
299
- }
300
- if (!this.hasVisibleItemOrSorting) {
301
- return;
302
- }
303
- this._listenEscButton();
304
- this.opened.emit();
305
- this._filterOverlay.open();
306
- }
307
- clearSearchText(event) {
308
- event.stopPropagation();
309
- this._filterItems.keywordItem.clear();
310
- this.searchTextInput.nativeElement.focus();
311
- }
312
- init() {
313
- const data = this._filterItems.valuesAsQuery();
314
- this._sort = this._filterItems.getSort();
315
- if (this.config.init) {
316
- this.config.init(data, this._sort);
317
- }
318
- this._updateChipsVisibility();
319
- }
320
- clear(event = null) {
321
- if (event) {
322
- event.stopPropagation();
323
- }
324
- this._filterItems.filtersClear();
325
- if (this.config.clear) {
326
- this.config.clear();
327
- }
328
- }
329
- /**
330
- * Close filter window and do change callback
331
- */
332
- search(event) {
333
- this.changeVisibilityClick(false, event);
334
- }
335
- reload(event = null) {
336
- if (event) {
337
- event.preventDefault();
338
- event.stopPropagation();
339
- }
340
- const data = this._filterItems.valuesAsQuery();
341
- if (this.config.reload) {
342
- this.config.reload(data, this._filterItems.getSort());
343
- }
344
- }
345
- getItem(name) {
346
- return this.items
347
- .find((item) => item.name === name);
348
- }
349
- fetchQueryParams() {
350
- this._externalParams.fetchQueryParams();
351
- }
352
- /**
353
- * Call change callback and apply new filter values
354
- */
355
- change() {
356
- const data = this._filterItems.valuesAsQuery();
357
- const sort = this._filterItems.getSort();
358
- const sortingChanged = ((!sort || !this._sort) && sort !== this._sort)
359
- || (sort && this._sort && !objectsAreEquals(this._sort, sort));
360
- if (sortingChanged) {
361
- this._sort = sort;
362
- if (this.config.sortChange) {
363
- this.config.sortChange(data, sort);
364
- }
365
- }
366
- if (this.config.change) {
367
- this.config.change(data, sort);
368
- }
369
- this._updateChipsVisibility();
370
- }
371
- /**
372
- * Update filter actions config
373
- * @param actions
374
- */
375
- updateActions(actions) {
376
- this._actions.initActions(actions);
377
- }
378
- /**
379
- * Show "Filters" button
380
- */
381
- showFiltersBtn() {
382
- this._filtersBtnVisible$.next(true);
383
- }
384
- /**
385
- * Hide "Filters" button
386
- */
387
- hideFiltersBtn() {
388
- this._filtersBtnVisible$.next(false);
389
- }
390
- /**
391
- * Show "Keyword" field if it present
392
- */
393
- showKeywordField() {
394
- this._keywordVisible$.next(true);
395
- }
396
- /**
397
- * Hide "Keyword" field if it present
398
- */
399
- hideKeywordField() {
400
- this._keywordVisible$.next(false);
401
- }
402
- /**
403
- * Go through actions and check show() callback and update visible actions
404
- */
405
- updateActionsVisibility() {
406
- this._actions.updateActionsVisibility();
407
- }
408
- /**
409
- * Go through actions and check disabled() callback and update disabled state
410
- */
411
- updateDisabledState() {
412
- this._actions.updateDisabledState();
413
- }
414
- setItems(items) {
415
- this._filterItems.destroyItems();
416
- this.config.items = items;
417
- this._filterItems.setConfig(this._config);
418
- this._externalParams.initItems();
419
- this._syncSearchInputWithKeyword();
420
- this._listenKeywordItemClear();
421
- }
422
- _initFilterWithConfig(config) {
423
- if (this.config) {
424
- this._filterItems.destroyItems();
425
- }
426
- config = Object.assign(Object.assign({}, (this._defaultConfig || {})), config);
427
- this._config = new FsFilterConfig(config);
428
- this._actions.initActions(this._config.actions);
429
- this._filterItems.setConfig(this._config);
430
- this._externalParams.setConfig(this._config);
431
- this._syncSearchInputWithKeyword();
432
- if (!!this.config.reloadWhenConfigChanged) {
433
- this.change();
434
- }
435
- this._listenKeywordItemClear();
436
- }
437
- _destroyFilterDrawer() {
438
- this._filterOverlay.close();
439
- }
440
- _updateWindowWidth() {
441
- this.windowDesktop = window.innerWidth > 1200;
442
- }
443
- _listenEscButton() {
444
- this._zone.runOutsideAngular(() => {
445
- fromEvent(window, 'keyup')
446
- .pipe(filter((event) => event.code === 'Escape'), takeUntil(this.closed), takeUntil(this._destroy$))
447
- .subscribe(() => {
448
- this._zone.run(() => {
449
- this.changeVisibility(false);
450
- });
451
- });
452
- });
453
- }
454
- _listenInputKeyEvents() {
455
- if (!this.searchTextInput) {
456
- return;
457
- }
458
- this._zone.runOutsideAngular(() => {
459
- fromEvent(this.searchTextInput.nativeElement, 'keydown')
460
- .pipe(debounceTime(500), filter((event) => {
461
- return ['Enter', 'NumpadEnter', 'Escape'].indexOf(event.code) > -1;
462
- }), takeUntil(this._destroy$))
463
- .subscribe((event) => {
464
- this._zone.run(() => {
465
- this.filterInputEvent(event);
466
- });
467
- });
468
- });
469
- }
470
- _listenWindowResize() {
471
- this._zone.runOutsideAngular(() => {
472
- fromEvent(window, 'resize')
473
- .pipe(debounceTime(100), takeUntil(this._destroy$))
474
- .subscribe(() => {
475
- this._zone.run(() => {
476
- this._updateWindowWidth();
477
- });
478
- });
479
- });
480
- }
481
- _listenInputChanges() {
482
- this._zone.runOutsideAngular(() => {
483
- this.searchText.valueChanges
484
- .pipe(debounceTime(200), distinctUntilChanged(), filter((value) => {
485
- var _a;
486
- return value !== ((_a = this._filterItems.keywordItem) === null || _a === void 0 ? void 0 : _a.model);
487
- }), takeUntil(this._destroy$))
488
- .subscribe((value) => {
489
- this._zone.run(() => {
490
- const keywordItem = this._filterItems.keywordItem;
491
- if (keywordItem && keywordItem.value !== value) {
492
- keywordItem.model = value;
493
- }
494
- });
495
- });
496
- });
497
- }
498
- _syncSearchInputWithKeyword() {
499
- const keywordItem = this._filterItems.keywordItem;
500
- if (keywordItem) {
501
- this.searchText.setValue(keywordItem.model);
502
- this.searchPlaceholder = keywordItem.label || 'Search';
503
- }
504
- }
505
- _listenKeywordItemClear() {
506
- var _a;
507
- (_a = this._filterItems
508
- .keywordItem) === null || _a === void 0 ? void 0 : _a.clear$.pipe(takeUntil(this._filterItems.keywordItem.destroy$), takeUntil(this._destroy$)).subscribe(() => {
509
- this.searchText.setValue('');
510
- });
511
- }
512
- _listenInternalItemsChange() {
513
- this._filterItems
514
- .itemsChange$
515
- .pipe(takeUntil(this._destroy$))
516
- .subscribe(() => {
517
- this.change();
518
- });
519
- }
520
- _initOverlay() {
521
- this._filterOverlay.setClearFn(this.clear.bind(this));
522
- this._filterOverlay.setDoneFn(this.hide.bind(this));
523
- }
524
- // We may need some time to recieve external params and after that ready can be emitted
525
- _listenWhenFilterReady() {
526
- combineLatest([
527
- this._externalParams.pending$,
528
- this.itemsReady$,
529
- ])
530
- .pipe(filter(([pendingParams, itemsReady]) => !pendingParams && itemsReady), takeUntil(this._destroy$))
531
- .subscribe(() => {
532
- this.init();
533
- this._syncSearchInputWithKeyword();
534
- this.ready.emit();
535
- });
536
- }
537
- _updateChipsVisibility() {
538
- const hasFilterChips = this._filterItems.items
539
- .some((item) => {
540
- return item.isChipVisible;
541
- });
542
- this._hasFilterChips$.next(hasFilterChips);
543
- }
544
- }
545
- FilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FilterComponent, deps: [{ token: i1.FsFilterOverlayService }, { token: i0.NgZone }, { token: i2.ExternalParamsController }, { token: i3.FsFilterItemsStore }, { token: i4.ActionsController }, { token: FS_FILTER_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
546
- FilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: FilterComponent, selector: "fs-filter", inputs: { setConfig: ["config", "setConfig"], setFilter: ["filter", "setFilter"], showSortBy: "showSortBy", showFilterInput: "showFilterInput" }, outputs: { closed: "closed", opened: "opened", ready: "ready" }, host: { properties: { "class.filters-open": "this.showFilterMenu", "class.window-desktop": "this.windowDesktop", "class.fs-filter": "this.fsFilterClass" } }, providers: [
547
- FsFilterOverlayService,
548
- ExternalParamsController,
549
- PersistanceParamsController,
550
- QueryParamsController,
551
- FocusControllerService,
552
- FsFilterItemsStore,
553
- SavedFiltersController,
554
- ActionsController,
555
- ], queries: [{ propertyName: "statusBar", first: true, predicate: FilterStatusBarDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "searchTextInput", first: true, predicate: ["searchTextInput"], descendants: true }, { propertyName: "searchTextMatInput", first: true, predicate: ["searchTextInput"], descendants: true, read: MatInput }], ngImport: i0, template: "<ng-container *ngIf=\"hasKeyword; else noKeywordFilter\">\n <div class=\"filter-search-container\">\n <div class=\"filter-input-field\">\n <form autocomplete=\"off\" role=\"presentation\" *ngIf=\"keywordVisible$ | async\">\n <mat-form-field floatLabel=\"never\">\n <span matPrefix>\n <mat-icon matPrefix>search</mat-icon>\n </span>\n\n <input\n #searchTextInput\n matInput\n [formControl]=\"searchText\"\n [placeholder]=\"searchPlaceholder\"\n name=\"filter-input\"\n (click)=\"filterInputEvent($event)\"\n class=\"filter-input\">\n\n <a matSuffix\n *ngIf=\"searchText.value && showFilterInput && config.clear\"\n (click)=\"clearSearchText($event)\"\n href=\"javascript:void(0)\"\n class=\"clear\">\n <mat-icon>clear</mat-icon>\n </a>\n\n <a matSuffix\n (click)=\"reload($event)\"\n class=\"reload\"\n *ngIf=\"config.reload\">\n <mat-icon>refresh</mat-icon>\n </a>\n </mat-form-field>\n </form>\n </div>\n <ng-container *ngTemplateOutlet=\"filterActions\"></ng-container>\n </div>\n <div class=\"status-actions\" *ngIf=\"keywordVisible$ | async\">\n <ng-container *ngTemplateOutlet=\"statusBarContainer\"></ng-container>\n <ng-container *ngTemplateOutlet=\"filterChips\"></ng-container>\n </div>\n</ng-container>\n\n<ng-template #noKeywordFilter>\n <div class=\"filter-searchless-container\">\n <div class=\"status-actions\">\n <ng-container *ngTemplateOutlet=\"statusBarContainer\"></ng-container>\n <ng-container *ngTemplateOutlet=\"filterChips\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"filterActions\"></ng-container>\n </div>\n</ng-template>\n\n\n<ng-template #filterActions>\n <div class=\"filter-actions\">\n <ng-container *ngIf=\"hasVisibleItemOrSorting && filtersBtnVisible$ | async\">\n <button\n mat-button\n class=\"filters-button\"\n [ngClass]=\"{\n 'mat-raised-button': config.button.style == 'raised',\n 'mat-button': config.button.style == 'basic',\n 'mat-icon-button': config.button.style == 'icon'\n }\"\n (click)=\"changeVisibilityClick(!showFilterMenu, $event)\"\n type=\"button\"\n [color]=\"config.button.color\">\n <mat-icon *ngIf=\"config.button.icon\">{{config.button.icon}}</mat-icon>\n {{ config.button.label }}\n </button>\n </ng-container>\n\n <fs-filter-actions\n *ngIf=\"actionsVisible$ | async\"\n [actions]=\"actions$ | async\"\n [kebabActions]=\"menuActions$ | async\">\n </fs-filter-actions>\n </div>\n</ng-template>\n\n<ng-template #filterChips>\n <fs-filter-chips\n *ngIf=\"config.chips && hasFilterChips$ | async\"\n class=\"filter-chips\"\n [filters]=\"items\">\n </fs-filter-chips>\n</ng-template>\n\n<ng-template #statusBarContainer>\n <div class=\"status-bar\" *ngIf=\"statusBar\">\n <small><ng-container *ngTemplateOutlet=\"statusBar\"></ng-container></small>\n </div>\n</ng-template>\n", styles: ["fs-filter{display:block}.fs-filter{margin-bottom:20px;display:block}.fs-filter .results{min-height:90px;position:relative;overflow-x:auto;overflow-y:hidden}.fs-filter .status-bar{overflow:hidden;text-overflow:ellipsis;line-height:17px;margin:4px 0}.fs-filter .filter-chips{display:block}.fs-filter .filter-searchless-container{display:flex}.fs-filter .filter-searchless-container .status-actions{flex-grow:1}.fs-filter .filter-searchless-container .status-actions>*:first-child{margin-top:0}.fs-filter fs-filter-chips{margin:5px 0}.fs-filter .filter-search-container{flex-direction:row;box-sizing:border-box;display:flex;flex:1 1 0;position:relative}.fs-filter .filter-search-container .search{top:8px;position:absolute;margin-left:1px;left:0}.fs-filter .filter-search-container .search mat-icon{transform:scale(.9)}.fs-filter .filter-search-container form{width:100%;height:100%}.fs-filter .filter-search-container .filter-input-field{flex-direction:row;box-sizing:border-box;display:flex;align-items:center;flex:1}.fs-filter .filter-search-container .filter-input-field .mat-form-field{width:100%;height:100%;font-size:103%}.fs-filter .filter-search-container .filter-input-field .mat-form-field .mat-form-field-underline{bottom:auto}.fs-filter .filter-search-container .filter-input-field .mat-form-field .mat-form-field-infix{border-top:0}.fs-filter .filter-search-container .filter-input-field .mat-form-field .mat-form-field-wrapper{padding-bottom:0;height:100%}.fs-filter .filter-search-container .filter-input-field .mat-form-field .mat-form-field-flex{align-items:center;height:100%}.fs-filter .filter-search-container .filter-input-field .mat-form-field-prefix,.fs-filter .filter-search-container .filter-input-field .mat-form-field-suffix{align-self:center;display:flex;align-items:center;white-space:nowrap}.fs-filter .filter-search-container .filter-input-field .mat-form-field-prefix mat-icon,.fs-filter .filter-search-container .filter-input-field .mat-form-field-prefix a,.fs-filter .filter-search-container .filter-input-field .mat-form-field-suffix mat-icon,.fs-filter .filter-search-container .filter-input-field .mat-form-field-suffix a{display:flex;cursor:pointer;color:initial}.fs-filter .filter-search-container .filter-input-field .mat-form-field-prefix mat-icon:hover,.fs-filter .filter-search-container .filter-input-field .mat-form-field-prefix a:hover,.fs-filter .filter-search-container .filter-input-field .mat-form-field-suffix mat-icon:hover,.fs-filter .filter-search-container .filter-input-field .mat-form-field-suffix a:hover{color:inherit}.fs-filter .filter-search-container .filter-input-field .mat-form-field-infix{width:auto}.fs-filter .filter-actions{display:flex;align-items:center}.fs-filter button.reload{margin-left:-40px;right:-9px}@media screen and (min-width: 599px){.filter-actions{margin-left:10px}.filters-button+fs-filter-actions:not(:empty){margin-left:5px}}@media screen and (max-width: 600px){.filter-actions{margin-left:5px}.filter-actions .filters-button{font-size:0;padding:0;min-width:unset;width:36px;height:36px;border-radius:50%;box-shadow:unset!important}}@media screen and (min-width: 1200px){body.fs-filter-open{margin-right:350px}.fs-filter-backdrop{display:none}}body.fs-filter-open::-webkit-scrollbar{width:0;background:transparent}\n"], components: [{ type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i8.FsFilterActionsComponent, selector: "fs-filter-actions", inputs: ["kebabActions", "actions"] }, { type: i9.FsFilterChipsComponent, selector: "fs-filter-chips", inputs: ["filters"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i11.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.MatPrefix, selector: "[matPrefix]" }, { type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i11.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i11.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i5.MatSuffix, selector: "[matSuffix]" }, { type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i13.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }], pipes: { "async": i10.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
556
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FilterComponent, decorators: [{
557
- type: Component,
558
- args: [{
559
- selector: 'fs-filter',
560
- styleUrls: ['./filter.component.scss'],
561
- templateUrl: './filter.component.html',
562
- encapsulation: ViewEncapsulation.None,
563
- providers: [
564
- FsFilterOverlayService,
565
- ExternalParamsController,
566
- PersistanceParamsController,
567
- QueryParamsController,
568
- FocusControllerService,
569
- FsFilterItemsStore,
570
- SavedFiltersController,
571
- ActionsController,
572
- ],
573
- changeDetection: ChangeDetectionStrategy.OnPush,
574
- }]
575
- }], ctorParameters: function () { return [{ type: i1.FsFilterOverlayService }, { type: i0.NgZone }, { type: i2.ExternalParamsController }, { type: i3.FsFilterItemsStore }, { type: i4.ActionsController }, { type: i14.FsFilterConfig, decorators: [{
576
- type: Optional
577
- }, {
578
- type: Inject,
579
- args: [FS_FILTER_CONFIG]
580
- }] }]; }, propDecorators: { setConfig: [{
581
- type: Input,
582
- args: ['config']
583
- }], setFilter: [{
584
- type: Input,
585
- args: ['filter']
586
- }], showSortBy: [{
587
- type: Input
588
- }], showFilterInput: [{
589
- type: Input
590
- }], closed: [{
591
- type: Output
592
- }], opened: [{
593
- type: Output
594
- }], ready: [{
595
- type: Output
596
- }], statusBar: [{
597
- type: ContentChild,
598
- args: [FilterStatusBarDirective, { read: TemplateRef }]
599
- }], searchTextInput: [{
600
- type: ViewChild,
601
- args: ['searchTextInput']
602
- }], searchTextMatInput: [{
603
- type: ViewChild,
604
- args: ['searchTextInput', { read: MatInput }]
605
- }], showFilterMenu: [{
606
- type: HostBinding,
607
- args: ['class.filters-open']
608
- }], windowDesktop: [{
609
- type: HostBinding,
610
- args: ['class.window-desktop']
611
- }], fsFilterClass: [{
612
- type: HostBinding,
613
- args: ['class.fs-filter']
614
- }] } });
615
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFHTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFlBQVksRUFDWixXQUFXLEVBQ1gsV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBRzlGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFv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YUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7b0JBQ3JDLFNBQVMsRUFBRTt3QkFDVCxzQkFBc0I7d0JBQ3RCLHdCQUF3Qjt3QkFDeEIsMkJBQTJCO3dCQUMzQixxQkFBcUI7d0JBQ3JCLHNCQUFzQjt3QkFDdEIsa0JBQWtCO3dCQUNsQixzQkFBc0I7d0JBQ3RCLGlCQUFpQjtxQkFDbEI7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEOzswQkFzREksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxnQkFBZ0I7NENBbERsQyxTQUFTO3NCQURaLEtBQUs7dUJBQUMsUUFBUTtnQkFNWCxTQUFTO3NCQURaLEtBQUs7dUJBQUMsUUFBUTtnQkFLQyxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQ1csTUFBTTtzQkFBdEIsTUFBTTtnQkFDVSxNQUFNO3NCQUF0QixNQUFNO2dCQUNVLEtBQUs7c0JBQXJCLE1BQU07Z0JBR0EsU0FBUztzQkFEZixZQUFZO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFJdEQsZUFBZTtzQkFEckIsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBSXJCLGtCQUFrQjtzQkFEeEIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7Z0JBSXpDLGNBQWM7c0JBRHBCLFdBQVc7dUJBQUMsb0JBQW9CO2dCQUkxQixhQUFhO3NCQURuQixXQUFXO3VCQUFDLHNCQUFzQjtnQkFJNUIsYUFBYTtzQkFEbkIsV0FBVzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBPdXRwdXQsXG4gIE9wdGlvbmFsLFxuICBJbmplY3QsXG4gIENvbnRlbnRDaGlsZCxcbiAgVGVtcGxhdGVSZWYsXG4gIEhvc3RCaW5kaW5nLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0SW5wdXQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBGU19GSUxURVJfQ09ORklHIH0gZnJvbSAnLi8uLi8uLi9pbmplY3RvcnMvZmlsdGVyLWNvbmZpZyc7XG5pbXBvcnQgeyBGc0ZpbHRlckNvbmZpZyB9IGZyb20gJy4uLy4uL21vZGVscy9maWx0ZXItY29uZmlnJztcbmltcG9ydCB7IG9iamVjdHNBcmVFcXVhbHMgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2NvbXBhcmUnO1xuaW1wb3J0IHsgRnNGaWx0ZXJPdmVybGF5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpbHRlci1vdmVybGF5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU3RhdHVzQmFyRGlyZWN0aXZlIH0gZnJvbSAnLi8uLi8uLi9kaXJlY3RpdmVzL3N0YXR1cy1iYXIvc3RhdHVzLWJhci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRmlsdGVyQ29uZmlnLCBGaWx0ZXJTb3J0LCBJRmlsdGVyQ29uZmlnSXRlbSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBCYXNlSXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9pdGVtcy9iYXNlLWl0ZW0nO1xuaW1wb3J0IHsgRnNGaWx0ZXJJdGVtc1N0b3JlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaXRlbXMtc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBFeHRlcm5hbFBhcmFtc0NvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leHRlcm5hbC1wYXJhbXMtY29udHJvbGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IFBlcnNpc3RhbmNlUGFyYW1zQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V4dGVybmFsLXBhcmFtcy9wZXJzaXN0YW5jZS1wYXJhbXMtY29udHJvbGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IFF1ZXJ5UGFyYW1zQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V4dGVybmFsLXBhcmFtcy9xdWVyeS1wYXJhbXMtY29udHJvbGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IEZvY3VzQ29udHJvbGxlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mb2N1cy1jb250cm9sbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2F2ZWRGaWx0ZXJzQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2V4dGVybmFsLXBhcmFtcy9zYXZlZC1maWx0ZXJzLWNvbnRyb2xsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBJU29ydGluZ0NoYW5nZUV2ZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maWx0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZzRmlsdGVyQWN0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IEFjdGlvbnNDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9hY3Rpb25zLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVVwZGF0ZUZpbHRlckl0ZW1Db25maWcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3VwZGF0ZS1maWx0ZXItaXRlbS5pbnRlcmZhY2UnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZzLWZpbHRlcicsXG4gIHN0eWxlVXJsczogWyAnLi9maWx0ZXIuY29tcG9uZW50LnNjc3MnIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtcbiAgICBGc0ZpbHRlck92ZXJsYXlTZXJ2aWNlLFxuICAgIEV4dGVybmFsUGFyYW1zQ29udHJvbGxlcixcbiAgICBQZXJzaXN0YW5jZVBhcmFtc0NvbnRyb2xsZXIsXG4gICAgUXVlcnlQYXJhbXNDb250cm9sbGVyLFxuICAgIEZvY3VzQ29udHJvbGxlclNlcnZpY2UsXG4gICAgRnNGaWx0ZXJJdGVtc1N0b3JlLFxuICAgIFNhdmVkRmlsdGVyc0NvbnRyb2xsZXIsXG4gICAgQWN0aW9uc0NvbnRyb2xsZXIsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCdjb25maWcnKVxuICBzZXQgc2V0Q29uZmlnKGNvbmZpZykge1xuICAgIHRoaXMuX2luaXRGaWx0ZXJXaXRoQ29uZmlnKGNvbmZpZyk7XG4gIH1cblxuICBASW5wdXQoJ2ZpbHRlcicpXG4gIHNldCBzZXRGaWx0ZXIoY29uZmlnKSB7XG4gICAgdGhpcy5faW5pdEZpbHRlcldpdGhDb25maWcoY29uZmlnKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93U29ydEJ5OiBhbnkgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgc2hvd0ZpbHRlcklucHV0ID0gdHJ1ZTtcbiAgQE91dHB1dCgpIHB1YmxpYyBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAQ29udGVudENoaWxkKEZpbHRlclN0YXR1c0JhckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBwdWJsaWMgc3RhdHVzQmFyO1xuXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaFRleHRJbnB1dCcpXG4gIHB1YmxpYyBzZWFyY2hUZXh0SW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZCgnc2VhcmNoVGV4dElucHV0JywgeyByZWFkOiBNYXRJbnB1dCB9KVxuICBwdWJsaWMgc2VhcmNoVGV4dE1hdElucHV0OiBNYXRJbnB1dDtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZpbHRlcnMtb3BlbicpXG4gIHB1YmxpYyBzaG93RmlsdGVyTWVudSA9IGZhbHNlO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3Mud2luZG93LWRlc2t0b3AnKVxuICBwdWJsaWMgd2luZG93RGVza3RvcCA9IGZhbHNlO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZnMtZmlsdGVyJylcbiAgcHVibGljIGZzRmlsdGVyQ2xhc3MgPSB0cnVlO1xuXG4gIHB1YmxpYyBzZWFyY2hUZXh0ID0gbmV3IEZvcm1Db250cm9sKCk7XG4gIHB1YmxpYyBzZWFyY2hQbGFjZWhvbGRlciA9ICdTZWFyY2gnO1xuXG4gIHByb3RlY3RlZCBfY29uZmlnOiBGc0ZpbHRlckNvbmZpZyA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfc29ydDogRmlsdGVyU29ydDtcbiAgcHJpdmF0ZSBfZmlsdGVyc0J0blZpc2libGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgcHJpdmF0ZSBfa2V5d29yZFZpc2libGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgcHJpdmF0ZSBfaGFzRmlsdGVyQ2hpcHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWx0ZXJPdmVybGF5OiBGc0ZpbHRlck92ZXJsYXlTZXJ2aWNlLFxuICAgIHByaXZhdGUgX3pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIF9leHRlcm5hbFBhcmFtczogRXh0ZXJuYWxQYXJhbXNDb250cm9sbGVyLFxuICAgIHByaXZhdGUgX2ZpbHRlckl0ZW1zOiBGc0ZpbHRlckl0ZW1zU3RvcmUsXG4gICAgcHJpdmF0ZSBfYWN0aW9uczogQWN0aW9uc0NvbnRyb2xsZXIsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChGU19GSUxURVJfQ09ORklHKSBwcml2YXRlIF9kZWZhdWx0Q29uZmlnOiBGc0ZpbHRlckNvbmZpZ1xuICApIHtcbiAgICB0aGlzLl9saXN0ZW5XaGVuRmlsdGVyUmVhZHkoKTtcbiAgICB0aGlzLl91cGRhdGVXaW5kb3dXaWR0aCgpO1xuXG4gICAgdGhpcy5fZmlsdGVyT3ZlcmxheS5hdHRhY2gkXG4gICAgLnBpcGUoXG4gICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JClcbiAgICApXG4gICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNob3dGaWx0ZXJNZW51ID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2ZpbHRlck92ZXJsYXkuZGV0YWNoJFxuICAgIC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgIClcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2hvd0ZpbHRlck1lbnUgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2xpc3RlbldpbmRvd1Jlc2l6ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBjb25maWcoKTogRnNGaWx0ZXJDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlclBhcmFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVySXRlbXMudmFsdWVzKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlclBhcmFtc1F1ZXJ5KCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVySXRlbXMudmFsdWVzQXNRdWVyeSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVySXRlbXMuaXRlbXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZpc2libGVJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVySXRlbXMudmlzaWJsZUl0ZW1zO1xuICB9XG5cbiAgcHVibGljIGdldCBpdGVtc1JlYWR5JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVySXRlbXMucmVhZHkkO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNGaWx0ZXJDaGlwcyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0ZpbHRlckNoaXBzJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzVmlzaWJsZUl0ZW1PclNvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUl0ZW1zLmxlbmd0aCA+IDAgfHwgISF0aGlzLl9maWx0ZXJJdGVtcy5zb3J0QnlJdGVtXG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0tleXdvcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckl0ZW1zLmhhc0tleXdvcmQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlcnNCdG5WaXNpYmxlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyc0J0blZpc2libGUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBrZXl3b3JkVmlzaWJsZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2tleXdvcmRWaXNpYmxlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aW9uc1Zpc2libGUkKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb25zLnZpc2libGUkO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3Rpb25zJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9ucy5hY3Rpb25zJDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWVudUFjdGlvbnMkKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb25zLm1lbnVBY3Rpb25zJDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcblxuICAgIC8vIEF2b2lkIG5nQ2hhbmdlcyBlcnJvclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9saXN0ZW5JbnRlcm5hbEl0ZW1zQ2hhbmdlKCk7XG4gICAgdGhpcy5faW5pdE92ZXJsYXkoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fbGlzdGVuSW5wdXRLZXlFdmVudHMoKTtcbiAgICAvLyBGSVhNRSBwcmV2ZW50IGZpcmUgY2hhbmdlIGFmdGVyIGluaXRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2xpc3RlbklucHV0Q2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuXG4gICAgdGhpcy5fZGVzdHJveUZpbHRlckRyYXdlcigpO1xuXG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXMoKSB7XG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dE1hdElucHV0KSB7XG4gICAgICB0aGlzLnNlYXJjaFRleHRNYXRJbnB1dC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVTb3J0KHNvcnQ6IElTb3J0aW5nQ2hhbmdlRXZlbnQpIHtcbiAgICB0aGlzLl9maWx0ZXJJdGVtcy51cGRhdGVTb3J0KHNvcnQpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogRG8gdXBkYXRlIHZhbHVlIG9mIHNvbWUgZmllbGRcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlcyAtIHZhbHVlcyBmb3IgdXBkYXRlXG4gICAqXG4gICAqIFRvIHVwZGF0ZSB0ZXh0IHZhbHVlIGp1c3QgcGFzcyBuZXcgdGV4dCB2YWx1ZVxuICAgKlxuICAgKiBwdWJsaWMgdXBkYXRlU2VsZWN0VmFsdWUodmFsKSB7XG4gICAqICAgdGhpcy5maWx0ZXJFbC51cGRhdGVWYWx1ZXMoeyBrZXl3b3JkOiB2YWwgfSk7XG4gICAqIH1cbiAgICpcbiAgICogVG8gdXBkYXRlIHNlbGVjdCBvciBvYnNlcnZhYmxlIHNlbGVjdCB5b3UgY291bGQgcGFzcyBzdWl0YWJsZSB2YWx1ZVxuICAgKlxuICAgKiBwdWJsaWMgdXBkYXRlU2VsZWN0VmFsdWUodmFsOiBudW1iZXIpIHtcbiAgICogICB0aGlzLmZpbHRlckVsLnVwZGF0ZVZhbHVlcyh7IHNpbXBsZV9zZWxlY3Q6IHZhbCB9LCB7IG9ic2VydmFibGVfc2VsZWN0OiB2YWwgfSk7XG4gICAqIH1cbiAgICpcbiAgICogVG8gdXBkYXRlIGNoZWNrYm94IHZhbHVlIGp1c3QgcGFzcyB0cnVlL2ZhbHNlIGFzIHZhbHVlXG4gICAqXG4gICAqIHB1YmxpYyB1cGRhdGVDaGVja294KHZhbDogYm9vbGVhbikge1xuICAgKiAgIHRoaXMuZmlsdGVyRWwudXBkYXRlVmFsdWVzKHsgY2hlY2tib3g6IHZhbCB9KTtcbiAgICogfVxuICAgKlxuICAgKiBUbyB1cGRhdGUgcmFuZ2UgdmFsdWUganVzdCBwYXNzIG9iamVjdCB3aXRoIG1pbiZtYXggb2JqZWN0IG9yIGp1c3Qgd2l0aCBvbmUgb2YgdGFyZ2V0c1xuICAgKlxuICAgKiBFeC46IHsgbWluOiAxMCwgbWF4IDE1IH0sIHsgbWluOiA1IH0sIHsgbWF4IDUgfVxuICAgKlxuICAgKiBwdWJsaWMgdXBkYXRlUmFuZ2UodmFsKSB7XG4gICAqICAgdGhpcy5maWx0ZXJFbC51cGRhdGVWYWx1ZXMoeyByYW5nZTogdmFsIH0pO1xuICAgKiB9XG4gICAqXG4gICAqIFRvIHVwZGF0ZSBhdXRvY29tcGxldGUganVzdCBwYXNzIG9iamVjdCB3aXRoIG5hbWUvdmFsdWUgZmllbGRzXG4gICAqXG4gICAqIEV4LjogeyBuYW1lOiAnSm9obiBEb2UnLCB2YWx1ZTogMSB9XG4gICAqXG4gICAqIHB1YmxpYyB1cGRhdGVBdXRvY29tcGxldGUodmFsKSB7XG4gICAqICAgdGhpcy5maWx0ZXJFbC51cGRhdGVWYWx1ZXMoeyBhdXRvY29tcGxldGVfdXNlcl9pZDogdmFsIH0pO1xuICAgKiB9XG4gICAqXG4gICAqIFRvIHVwZGF0ZSBhdXRvY29tcGxldGVjaGlwcyBqdXN0IHBhc3M6XG4gICAqXG4gICAqIDEpIG9iamVjdCB3aXRoIG5hbWUvdmFsdWUgZmllbGRzIC0gd2lsbCBiZSBhcHBlbmRlZCB0byBleGlzdGluZyBzZXQgb2YgdmFsdWVzXG4gICAqXG4gICAqIHsgbmFtZTogJ0pvaG4gRG9lJywgdmFsdWU6IDEgfVxuICAgKlxuICAgKiAyKSBhcnJheSBvZiBvYmplY3RzIC0gd2lsbCBiZSBhcHBlbmRlZCB0byBleGlzdGluZyBzZXQgb2YgdmFsdWVzXG4gICAqXG4gICAqIFt7IG5hbWU6ICdKb2huIERvZScsIHZhbHVlOiAxIH0sIHsgbmFtZTogJ0RhcnlhIEZpbGlwb3ZhJywgdmFsdWU6IDIgfV1cbiAgICpcbiAgICogMykgbnVsbCAtIGNsZWFyIGV4aXN0aW5nIHNldCBvZiB2YWx1ZXNcbiAgICpcbiAgICogcHVibGljIHVwZGF0ZUF1dG9jb21wbGV0ZSh2YWwpIHtcbiAgICogICB0aGlzLmZpbHRlckVsLnVwZGF0ZVZhbHVlcyh7IGF1dG9jb21wbGV0ZWNoaXBzX3VzZXJfaWQ6IHZhbCB9KTtcbiAgICogfVxuICAgKlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVZhbHVlcyh2YWx1ZXMpIHtcbiAgICBPYmplY3Qua2V5cyh2YWx1ZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVySXRlbSA9IHRoaXMuaXRlbXNcbiAgICAgICAgLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0ga2V5KTtcblxuICAgICAgaWYgKCFmaWx0ZXJJdGVtKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZmlsdGVySXRlbS5tb2RlbCA9IHZhbHVlc1trZXldO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGhpZGUoKSB7XG4gICAgdGhpcy5jaGFuZ2VWaXNpYmlsaXR5KGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93KCkge1xuICAgIHRoaXMuY2hhbmdlVmlzaWJpbGl0eSh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWaXNpYmlsaXR5Q2xpY2sodmFsdWUsIGV2ZW50ID0gbnVsbCkge1xuXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5nZVZpc2liaWxpdHkodmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGZpbHRlcklucHV0RXZlbnQoZXZlbnQpIHtcblxuICAgIGlmICghdGhpcy53aW5kb3dEZXNrdG9wKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChbJ0VudGVyJywgJ051bXBhZEVudGVyJywgJ0VzY2FwZSddLmluZGV4T2YoZXZlbnQuY29kZSkgPj0gMCkge1xuICAgICAgdGhpcy5jaGFuZ2VWaXNpYmlsaXR5KGZhbHNlKTtcblxuICAgICAgaWYgKHRoaXMuc2VhcmNoVGV4dElucHV0KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dElucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEl0ZW1WYWx1ZShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtc1xuICAgICAgLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gbmFtZSk7XG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0ubW9kZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzaG93SXRlbShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKG5hbWUpO1xuXG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIGl0ZW0uaGlkZSA9IGZhbHNlO1xuXG4gICAgICB0aGlzLl9maWx0ZXJJdGVtcy51cGRhdGVWaXNpYmxlSXRlbXMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGlkZUl0ZW0obmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbShuYW1lKTtcblxuICAgIGlmICghaXRlbSkgeyByZXR1cm4gfVxuXG4gICAgaXRlbS5oaWRlID0gdHJ1ZTtcblxuICAgIHRoaXMuX2ZpbHRlckl0ZW1zLnVwZGF0ZVZpc2libGVJdGVtcygpO1xuICB9XG5cbiAgcHVibGljIGNsZWFySXRlbShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKG5hbWUpO1xuXG4gICAgaWYgKCFpdGVtKSB7IHJldHVybiB9XG5cbiAgICBpdGVtLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlSXRlbUNvbmZpZyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBJVXBkYXRlRmlsdGVySXRlbUNvbmZpZ1xuICApOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKG5hbWUpO1xuXG4gICAgaWYgKCFpdGVtKSB7IHJldHVybiB9XG5cbiAgICBpdGVtLmxhYmVsID0gcGFyYW1zLmxhYmVsID8/IGl0ZW0ubGFiZWw7XG4gICAgaXRlbS5jaGlwTGFiZWwgPSBwYXJhbXMuY2hpcExhYmVsID8/IGl0ZW0uY2hpcExhYmVsO1xuXG4gICAgdGhpcy5fZmlsdGVySXRlbXMudXBkYXRlVmlzaWJsZUl0ZW1zKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbVZhbHVlQ2hhbmdlJChuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4gfCBudWxsIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtcy5maW5kKChpKSA9PiBpLm5hbWUgPT09IG5hbWUpO1xuXG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLnZhbHVlJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubW9kZWw7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWaXNpYmlsaXR5KHN0YXRlOiBib29sZWFuKSB7XG5cbiAgICBpZiAoc3RhdGUgPT09IHRoaXMuc2hvd0ZpbHRlck1lbnUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXN0YXRlKSB7XG4gICAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gICAgICByZXR1cm4gdGhpcy5fZGVzdHJveUZpbHRlckRyYXdlcigpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5oYXNWaXNpYmxlSXRlbU9yU29ydGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RlbkVzY0J1dHRvbigpO1xuXG4gICAgdGhpcy5vcGVuZWQuZW1pdCgpO1xuXG4gICAgdGhpcy5fZmlsdGVyT3ZlcmxheS5vcGVuKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWFyY2hUZXh0KGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5fZmlsdGVySXRlbXMua2V5d29yZEl0ZW0uY2xlYXIoKTtcbiAgICB0aGlzLnNlYXJjaFRleHRJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdCgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZmlsdGVySXRlbXMudmFsdWVzQXNRdWVyeSgpO1xuICAgIHRoaXMuX3NvcnQgPSB0aGlzLl9maWx0ZXJJdGVtcy5nZXRTb3J0KCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcuaW5pdCkge1xuICAgICAgdGhpcy5jb25maWcuaW5pdChkYXRhLCB0aGlzLl9zb3J0KTtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVDaGlwc1Zpc2liaWxpdHkoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcihldmVudCA9IG51bGwpIHtcblxuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZmlsdGVySXRlbXMuZmlsdGVyc0NsZWFyKCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcuY2xlYXIpIHtcbiAgICAgIHRoaXMuY29uZmlnLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGZpbHRlciB3aW5kb3cgYW5kIGRvIGNoYW5nZSBjYWxsYmFja1xuICAgKi9cbiAgcHVibGljIHNlYXJjaChldmVudCkge1xuICAgIHRoaXMuY2hhbmdlVmlzaWJpbGl0eUNsaWNrKGZhbHNlLCBldmVudCk7XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKGV2ZW50ID0gbnVsbCkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9maWx0ZXJJdGVtcy52YWx1ZXNBc1F1ZXJ5KCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcucmVsb2FkKSB7XG4gICAgICB0aGlzLmNvbmZpZy5yZWxvYWQoZGF0YSwgdGhpcy5fZmlsdGVySXRlbXMuZ2V0U29ydCgpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbShuYW1lKTogQmFzZUl0ZW08YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNcbiAgICAgIC5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgcHVibGljIGZldGNoUXVlcnlQYXJhbXMoKTogdm9pZCB7XG4gICAgdGhpcy5fZXh0ZXJuYWxQYXJhbXMuZmV0Y2hRdWVyeVBhcmFtcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgY2hhbmdlIGNhbGxiYWNrIGFuZCBhcHBseSBuZXcgZmlsdGVyIHZhbHVlc1xuICAgKi9cbiAgcHVibGljIGNoYW5nZSgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZmlsdGVySXRlbXMudmFsdWVzQXNRdWVyeSgpO1xuICAgIGNvbnN0IHNvcnQgPSB0aGlzLl9maWx0ZXJJdGVtcy5nZXRTb3J0KCk7XG5cbiAgICBjb25zdCBzb3J0aW5nQ2hhbmdlZCA9ICgoIXNvcnQgfHwgIXRoaXMuX3NvcnQpICYmIHNvcnQgIT09IHRoaXMuX3NvcnQpXG4gICAgICB8fCAoc29ydCAmJiB0aGlzLl9zb3J0ICYmICFvYmplY3RzQXJlRXF1YWxzKHRoaXMuX3NvcnQsIHNvcnQpKTtcblxuICAgIGlmIChzb3J0aW5nQ2hhbmdlZCkge1xuICAgICAgdGhpcy5fc29ydCA9IHNvcnQ7XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zb3J0Q2hhbmdlKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnNvcnRDaGFuZ2UoZGF0YSwgc29ydCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLmNoYW5nZSkge1xuICAgICAgdGhpcy5jb25maWcuY2hhbmdlKGRhdGEsIHNvcnQpO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZUNoaXBzVmlzaWJpbGl0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBmaWx0ZXIgYWN0aW9ucyBjb25maWdcbiAgICogQHBhcmFtIGFjdGlvbnNcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVBY3Rpb25zKGFjdGlvbnM6IEZzRmlsdGVyQWN0aW9uW10pOiB2b2lkIHtcbiAgICB0aGlzLl9hY3Rpb25zLmluaXRBY3Rpb25zKGFjdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgXCJGaWx0ZXJzXCIgYnV0dG9uXG4gICAqL1xuICBwdWJsaWMgc2hvd0ZpbHRlcnNCdG4oKTogdm9pZCB7XG4gICAgdGhpcy5fZmlsdGVyc0J0blZpc2libGUkLm5leHQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSBcIkZpbHRlcnNcIiBidXR0b25cbiAgICovXG4gIHB1YmxpYyBoaWRlRmlsdGVyc0J0bigpOiB2b2lkIHtcbiAgICB0aGlzLl9maWx0ZXJzQnRuVmlzaWJsZSQubmV4dChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBcIktleXdvcmRcIiBmaWVsZCBpZiBpdCBwcmVzZW50XG4gICAqL1xuICBwdWJsaWMgc2hvd0tleXdvcmRGaWVsZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9rZXl3b3JkVmlzaWJsZSQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIFwiS2V5d29yZFwiIGZpZWxkIGlmIGl0IHByZXNlbnRcbiAgICovXG4gIHB1YmxpYyBoaWRlS2V5d29yZEZpZWxkKCk6IHZvaWQge1xuICAgIHRoaXMuX2tleXdvcmRWaXNpYmxlJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0aHJvdWdoIGFjdGlvbnMgYW5kIGNoZWNrIHNob3coKSBjYWxsYmFjayBhbmQgdXBkYXRlIHZpc2libGUgYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZUFjdGlvbnNWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGlvbnMudXBkYXRlQWN0aW9uc1Zpc2liaWxpdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0aHJvdWdoIGFjdGlvbnMgYW5kIGNoZWNrIGRpc2FibGVkKCkgY2FsbGJhY2sgYW5kIHVwZGF0ZSBkaXNhYmxlZCBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZURpc2FibGVkU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aW9ucy51cGRhdGVEaXNhYmxlZFN0YXRlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0SXRlbXMoaXRlbXM6IElGaWx0ZXJDb25maWdJdGVtW10pIHtcbiAgICB0aGlzLl9maWx0ZXJJdGVtcy5kZXN0cm95SXRlbXMoKTtcblxuICAgIHRoaXMuY29uZmlnLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5fZmlsdGVySXRlbXMuc2V0Q29uZmlnKHRoaXMuX2NvbmZpZyk7XG4gICAgdGhpcy5fZXh0ZXJuYWxQYXJhbXMuaW5pdEl0ZW1zKCk7XG4gICAgdGhpcy5fc3luY1NlYXJjaElucHV0V2l0aEtleXdvcmQoKTtcbiAgICB0aGlzLl9saXN0ZW5LZXl3b3JkSXRlbUNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0RmlsdGVyV2l0aENvbmZpZyhjb25maWc6IEZpbHRlckNvbmZpZykge1xuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5fZmlsdGVySXRlbXMuZGVzdHJveUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uKHRoaXMuX2RlZmF1bHRDb25maWcgfHwge30pLFxuICAgICAgLi4uY29uZmlnLFxuICAgIH07XG5cbiAgICB0aGlzLl9jb25maWcgPSBuZXcgRnNGaWx0ZXJDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLl9hY3Rpb25zLmluaXRBY3Rpb25zKHRoaXMuX2NvbmZpZy5hY3Rpb25zKTtcbiAgICB0aGlzLl9maWx0ZXJJdGVtcy5zZXRDb25maWcodGhpcy5fY29uZmlnKTtcbiAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5zZXRDb25maWcodGhpcy5fY29uZmlnKTtcblxuICAgIHRoaXMuX3N5bmNTZWFyY2hJbnB1dFdpdGhLZXl3b3JkKCk7XG5cbiAgICBpZiAoISF0aGlzLmNvbmZpZy5yZWxvYWRXaGVuQ29uZmlnQ2hhbmdlZCkge1xuICAgICAgdGhpcy5jaGFuZ2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0ZW5LZXl3b3JkSXRlbUNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIF9kZXN0cm95RmlsdGVyRHJhd2VyKCkge1xuICAgIHRoaXMuX2ZpbHRlck92ZXJsYXkuY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVdpbmRvd1dpZHRoKCkge1xuICAgIHRoaXMud2luZG93RGVza3RvcCA9IHdpbmRvdy5pbm5lcldpZHRoID4gMTIwMDtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbkVzY0J1dHRvbigpIHtcbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZyb21FdmVudCh3aW5kb3csICdrZXl1cCcpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5jbG9zZWQpLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VWaXNpYmlsaXR5KGZhbHNlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5JbnB1dEtleUV2ZW50cygpIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoVGV4dElucHV0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQodGhpcy5zZWFyY2hUZXh0SW5wdXQubmF0aXZlRWxlbWVudCwgJ2tleWRvd24nKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoNTAwKSxcbiAgICAgICAgICBmaWx0ZXIoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gWydFbnRlcicsICdOdW1wYWRFbnRlcicsICdFc2NhcGUnXS5pbmRleE9mKGV2ZW50LmNvZGUpID4gLTE7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySW5wdXRFdmVudChldmVudClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5XaW5kb3dSZXNpemUoKSB7XG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDEwMCksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVXaW5kb3dXaWR0aCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuSW5wdXRDaGFuZ2VzKCkge1xuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5zZWFyY2hUZXh0LnZhbHVlQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgIGZpbHRlcigodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdGhpcy5fZmlsdGVySXRlbXMua2V5d29yZEl0ZW0/Lm1vZGVsO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXl3b3JkSXRlbSA9IHRoaXMuX2ZpbHRlckl0ZW1zLmtleXdvcmRJdGVtO1xuXG4gICAgICAgICAgICBpZiAoa2V5d29yZEl0ZW0gJiYga2V5d29yZEl0ZW0udmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIGtleXdvcmRJdGVtLm1vZGVsID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jU2VhcmNoSW5wdXRXaXRoS2V5d29yZCgpOiB2b2lkIHtcbiAgICBjb25zdCBrZXl3b3JkSXRlbSA9IHRoaXMuX2ZpbHRlckl0ZW1zLmtleXdvcmRJdGVtO1xuICAgIGlmIChrZXl3b3JkSXRlbSkge1xuICAgICAgdGhpcy5zZWFyY2hUZXh0LnNldFZhbHVlKGtleXdvcmRJdGVtLm1vZGVsKTtcbiAgICAgIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXIgPSBrZXl3b3JkSXRlbS5sYWJlbCBhcyBzdHJpbmcgfHwgJ1NlYXJjaCc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuS2V5d29yZEl0ZW1DbGVhcigpIHtcbiAgICB0aGlzLl9maWx0ZXJJdGVtc1xuICAgICAgLmtleXdvcmRJdGVtXG4gICAgICA/LmNsZWFyJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9maWx0ZXJJdGVtcy5rZXl3b3JkSXRlbS5kZXN0cm95JCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0LnNldFZhbHVlKCcnKTtcbiAgICAgIH0pXG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5JbnRlcm5hbEl0ZW1zQ2hhbmdlKCkge1xuICAgIHRoaXMuX2ZpbHRlckl0ZW1zXG4gICAgICAuaXRlbXNDaGFuZ2UkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNoYW5nZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0T3ZlcmxheSgpIHtcbiAgICB0aGlzLl9maWx0ZXJPdmVybGF5LnNldENsZWFyRm4odGhpcy5jbGVhci5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9maWx0ZXJPdmVybGF5LnNldERvbmVGbih0aGlzLmhpZGUuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvLyBXZSBtYXkgbmVlZCBzb21lIHRpbWUgdG8gcmVjaWV2ZSBleHRlcm5hbCBwYXJhbXMgYW5kIGFmdGVyIHRoYXQgcmVhZHkgY2FuIGJlIGVtaXR0ZWRcbiAgcHJpdmF0ZSBfbGlzdGVuV2hlbkZpbHRlclJlYWR5KCkge1xuICAgIGNvbWJpbmVMYXRlc3QoXG4gICAgW1xuICAgICAgdGhpcy5fZXh0ZXJuYWxQYXJhbXMucGVuZGluZyQsXG4gICAgICB0aGlzLml0ZW1zUmVhZHkkLFxuICAgIF0pXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKChbcGVuZGluZ1BhcmFtcywgaXRlbXNSZWFkeV0pID0+ICFwZW5kaW5nUGFyYW1zICYmIGl0ZW1zUmVhZHkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICB0aGlzLl9zeW5jU2VhcmNoSW5wdXRXaXRoS2V5d29yZCgpO1xuXG4gICAgICAgIHRoaXMucmVhZHkuZW1pdCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVDaGlwc1Zpc2liaWxpdHkoKSB7XG4gICAgY29uc3QgaGFzRmlsdGVyQ2hpcHMgPSB0aGlzLl9maWx0ZXJJdGVtcy5pdGVtc1xuICAgICAgLnNvbWUoKGl0ZW06IEJhc2VJdGVtPGFueT4pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uaXNDaGlwVmlzaWJsZTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5faGFzRmlsdGVyQ2hpcHMkLm5leHQoaGFzRmlsdGVyQ2hpcHMpO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzS2V5d29yZDsgZWxzZSBub0tleXdvcmRGaWx0ZXJcIj5cbiAgPGRpdiBjbGFzcz1cImZpbHRlci1zZWFyY2gtY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImZpbHRlci1pbnB1dC1maWVsZFwiPlxuICAgICAgPGZvcm0gYXV0b2NvbXBsZXRlPVwib2ZmXCIgcm9sZT1cInByZXNlbnRhdGlvblwiICpuZ0lmPVwia2V5d29yZFZpc2libGUkIHwgYXN5bmNcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XCJuZXZlclwiPlxuICAgICAgICAgICAgPHNwYW4gbWF0UHJlZml4PlxuICAgICAgICAgICAgICA8bWF0LWljb24gbWF0UHJlZml4PnNlYXJjaDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNzZWFyY2hUZXh0SW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgbmFtZT1cImZpbHRlci1pbnB1dFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZmlsdGVySW5wdXRFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLWlucHV0XCI+XG5cbiAgICAgICAgICA8YSBtYXRTdWZmaXhcbiAgICAgICAgICAgICAqbmdJZj1cInNlYXJjaFRleHQudmFsdWUgJiYgc2hvd0ZpbHRlcklucHV0ICYmIGNvbmZpZy5jbGVhclwiXG4gICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VhcmNoVGV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCJcbiAgICAgICAgICAgICBjbGFzcz1cImNsZWFyXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxuICAgICAgICAgIDwvYT5cblxuICAgICAgICAgIDxhIG1hdFN1ZmZpeFxuICAgICAgICAgICAgIChjbGljayk9XCJyZWxvYWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgY2xhc3M9XCJyZWxvYWRcIlxuICAgICAgICAgICAgICpuZ0lmPVwiY29uZmlnLnJlbG9hZFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPnJlZnJlc2g8L21hdC1pY29uPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmlsdGVyQWN0aW9uc1wiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInN0YXR1cy1hY3Rpb25zXCIgKm5nSWY9XCJrZXl3b3JkVmlzaWJsZSQgfCBhc3luY1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGF0dXNCYXJDb250YWluZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmlsdGVyQ2hpcHNcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNub0tleXdvcmRGaWx0ZXI+XG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItc2VhcmNobGVzcy1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWFjdGlvbnNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGF0dXNCYXJDb250YWluZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWx0ZXJDaGlwc1wiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWx0ZXJBY3Rpb25zXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuXG48bmctdGVtcGxhdGUgI2ZpbHRlckFjdGlvbnM+XG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItYWN0aW9uc1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNWaXNpYmxlSXRlbU9yU29ydGluZyAmJiBmaWx0ZXJzQnRuVmlzaWJsZSQgfCBhc3luY1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIGNsYXNzPVwiZmlsdGVycy1idXR0b25cIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgJ21hdC1yYWlzZWQtYnV0dG9uJzogY29uZmlnLmJ1dHRvbi5zdHlsZSA9PSAncmFpc2VkJyxcbiAgICAgICAgICAnbWF0LWJ1dHRvbic6IGNvbmZpZy5idXR0b24uc3R5bGUgPT0gJ2Jhc2ljJyxcbiAgICAgICAgICAnbWF0LWljb24tYnV0dG9uJzogY29uZmlnLmJ1dHRvbi5zdHlsZSA9PSAnaWNvbidcbiAgICAgICAgfVwiXG4gICAgICAgIChjbGljayk9XCJjaGFuZ2VWaXNpYmlsaXR5Q2xpY2soIXNob3dGaWx0ZXJNZW51LCAkZXZlbnQpXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtjb2xvcl09XCJjb25maWcuYnV0dG9uLmNvbG9yXCI+XG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImNvbmZpZy5idXR0b24uaWNvblwiPnt7Y29uZmlnLmJ1dHRvbi5pY29ufX08L21hdC1pY29uPlxuICAgICAgICB7eyBjb25maWcuYnV0dG9uLmxhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxmcy1maWx0ZXItYWN0aW9uc1xuICAgICAgKm5nSWY9XCJhY3Rpb25zVmlzaWJsZSQgfCBhc3luY1wiXG4gICAgICBbYWN0aW9uc109XCJhY3Rpb25zJCB8IGFzeW5jXCJcbiAgICAgIFtrZWJhYkFjdGlvbnNdPVwibWVudUFjdGlvbnMkIHwgYXN5bmNcIj5cbiAgICA8L2ZzLWZpbHRlci1hY3Rpb25zPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZmlsdGVyQ2hpcHM+XG4gIDxmcy1maWx0ZXItY2hpcHNcbiAgICAqbmdJZj1cImNvbmZpZy5jaGlwcyAmJiBoYXNGaWx0ZXJDaGlwcyQgfCBhc3luY1wiXG4gICAgY2xhc3M9XCJmaWx0ZXItY2hpcHNcIlxuICAgIFtmaWx0ZXJzXT1cIml0ZW1zXCI+XG4gIDwvZnMtZmlsdGVyLWNoaXBzPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzdGF0dXNCYXJDb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJzdGF0dXMtYmFyXCIgKm5nSWY9XCJzdGF0dXNCYXJcIj5cbiAgICA8c21hbGw+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0YXR1c0JhclwiPjwvbmctY29udGFpbmVyPjwvc21hbGw+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, ViewChild, ViewEncapsulation, Output, Optional, Inject, ContentChild, TemplateRef, HostBinding, } from '@angular/core';
2
+ import { FormControl } from '@angular/forms';
3
+ import { MatInput } from '@angular/material/input';
4
+ import { BehaviorSubject, combineLatest, fromEvent, Subject } from 'rxjs';
5
+ import { debounceTime, distinctUntilChanged, filter, map, takeUntil } from 'rxjs/operators';
6
+ import { FS_FILTER_CONFIG } from './../../injectors/filter-config';
7
+ import { FsFilterConfig } from '../../models/filter-config';
8
+ import { objectsAreEquals } from '../../helpers/compare';
9
+ import { FsFilterOverlayService } from '../../services/filter-overlay.service';
10
+ import { FilterStatusBarDirective } from './../../directives/status-bar/status-bar.directive';
11
+ import { FsFilterItemsStore } from '../../services/items-store.service';
12
+ import { ExternalParamsController } from '../../services/external-params-controller.service';
13
+ import { PersistanceParamsController } from '../../services/external-params/persistance-params-controller.service';
14
+ import { QueryParamsController } from '../../services/external-params/query-params-controller.service';
15
+ import { FocusControllerService } from '../../services/focus-controller.service';
16
+ import { SavedFiltersController } from '../../services/external-params/saved-filters-controller.service';
17
+ import { ActionsController } from '../../classes/actions-controller';
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "../../services/filter-overlay.service";
20
+ import * as i2 from "../../services/external-params-controller.service";
21
+ import * as i3 from "../../services/items-store.service";
22
+ import * as i4 from "../../classes/actions-controller";
23
+ import * as i5 from "@angular/material/form-field";
24
+ import * as i6 from "@angular/material/icon";
25
+ import * as i7 from "@angular/material/button";
26
+ import * as i8 from "../actions/actions.component";
27
+ import * as i9 from "../filter-chips/filter-chips.component";
28
+ import * as i10 from "@angular/common";
29
+ import * as i11 from "@angular/forms";
30
+ import * as i12 from "@angular/material/input";
31
+ import * as i13 from "../../models/filter-config";
32
+ export class FilterComponent {
33
+ constructor(_filterOverlay, _zone, _externalParams, _filterItems, _actions, _defaultConfig) {
34
+ this._filterOverlay = _filterOverlay;
35
+ this._zone = _zone;
36
+ this._externalParams = _externalParams;
37
+ this._filterItems = _filterItems;
38
+ this._actions = _actions;
39
+ this._defaultConfig = _defaultConfig;
40
+ this.showSortBy = true;
41
+ this.showFilterInput = true;
42
+ this.closed = new EventEmitter();
43
+ this.opened = new EventEmitter();
44
+ this.ready = new EventEmitter();
45
+ this.showFilterMenu = false;
46
+ this.windowDesktop = false;
47
+ this.fsFilterClass = true;
48
+ this.searchText = new FormControl();
49
+ this.searchPlaceholder = 'Search';
50
+ this._config = null;
51
+ this._filtersBtnVisible$ = new BehaviorSubject(true);
52
+ this._keywordVisible$ = new BehaviorSubject(true);
53
+ this._hasFilterChips$ = new BehaviorSubject(false);
54
+ this._destroy$ = new Subject();
55
+ this._listenWhenFilterReady();
56
+ this._updateWindowWidth();
57
+ this._filterOverlay.attach$
58
+ .pipe(takeUntil(this._destroy$))
59
+ .subscribe(() => {
60
+ this.showFilterMenu = true;
61
+ });
62
+ this._filterOverlay.detach$
63
+ .pipe(takeUntil(this._destroy$))
64
+ .subscribe(() => {
65
+ this.showFilterMenu = false;
66
+ });
67
+ this._listenWindowResize();
68
+ }
69
+ set setConfig(config) {
70
+ this._initFilterWithConfig(config);
71
+ }
72
+ set setFilter(config) {
73
+ this._initFilterWithConfig(config);
74
+ }
75
+ get hasKeyword() {
76
+ return this._filterItems.hasKeyword;
77
+ }
78
+ get config() {
79
+ return this._config;
80
+ }
81
+ get filterParams() {
82
+ return this._filterItems.values();
83
+ }
84
+ get filterParamsQuery() {
85
+ return this._filterItems.valuesAsQuery();
86
+ }
87
+ get items() {
88
+ return this._filterItems.items;
89
+ }
90
+ get visibleItems() {
91
+ return this._filterItems.visibleItems;
92
+ }
93
+ get itemsReady$() {
94
+ return this._filterItems.ready$;
95
+ }
96
+ get hasFilterChips$() {
97
+ return this._hasFilterChips$.asObservable();
98
+ }
99
+ get hasVisibleItemOrSorting() {
100
+ return this.visibleItems.length > 0 || !!this._filterItems.sortByItem;
101
+ }
102
+ get filtersBtnVisible$() {
103
+ return this._filtersBtnVisible$.asObservable();
104
+ }
105
+ get keywordVisible$() {
106
+ return this._keywordVisible$.asObservable();
107
+ }
108
+ get actionsVisible$() {
109
+ return this._actions.visible$;
110
+ }
111
+ get actions$() {
112
+ return this._actions.actions$;
113
+ }
114
+ get menuActions$() {
115
+ return this._actions.menuActions$;
116
+ }
117
+ ngOnInit() {
118
+ // Avoid ngChanges error
119
+ setTimeout(() => {
120
+ if (this.config.autofocus) {
121
+ this.focus();
122
+ }
123
+ });
124
+ this._listenInternalItemsChange();
125
+ this._initOverlay();
126
+ }
127
+ ngAfterViewInit() {
128
+ this._listenInputKeyEvents();
129
+ // FIXME prevent fire change after init
130
+ setTimeout(() => {
131
+ this._listenInputChanges();
132
+ });
133
+ }
134
+ ngOnDestroy() {
135
+ this._destroyFilterDrawer();
136
+ this._destroy$.next();
137
+ this._destroy$.complete();
138
+ }
139
+ focus() {
140
+ if (this.searchTextMatInput) {
141
+ this.searchTextMatInput.focus();
142
+ }
143
+ }
144
+ updateSort(sort) {
145
+ this._filterItems.updateSort(sort);
146
+ }
147
+ /**
148
+ *
149
+ * Do update value of some field
150
+ *
151
+ * @param values - values for update
152
+ *
153
+ * To update text value just pass new text value
154
+ *
155
+ * public updateSelectValue(val) {
156
+ * this.filterEl.updateValues({ keyword: val });
157
+ * }
158
+ *
159
+ * To update select or observable select you could pass suitable value
160
+ *
161
+ * public updateSelectValue(val: number) {
162
+ * this.filterEl.updateValues({ simple_select: val }, { observable_select: val });
163
+ * }
164
+ *
165
+ * To update checkbox value just pass true/false as value
166
+ *
167
+ * public updateCheckox(val: boolean) {
168
+ * this.filterEl.updateValues({ checkbox: val });
169
+ * }
170
+ *
171
+ * To update range value just pass object with min&max object or just with one of targets
172
+ *
173
+ * Ex.: { min: 10, max 15 }, { min: 5 }, { max 5 }
174
+ *
175
+ * public updateRange(val) {
176
+ * this.filterEl.updateValues({ range: val });
177
+ * }
178
+ *
179
+ * To update autocomplete just pass object with name/value fields
180
+ *
181
+ * Ex.: { name: 'John Doe', value: 1 }
182
+ *
183
+ * public updateAutocomplete(val) {
184
+ * this.filterEl.updateValues({ autocomplete_user_id: val });
185
+ * }
186
+ *
187
+ * To update autocompletechips just pass:
188
+ *
189
+ * 1) object with name/value fields - will be appended to existing set of values
190
+ *
191
+ * { name: 'John Doe', value: 1 }
192
+ *
193
+ * 2) array of objects - will be appended to existing set of values
194
+ *
195
+ * [{ name: 'John Doe', value: 1 }, { name: 'Darya Filipova', value: 2 }]
196
+ *
197
+ * 3) null - clear existing set of values
198
+ *
199
+ * public updateAutocomplete(val) {
200
+ * this.filterEl.updateValues({ autocompletechips_user_id: val });
201
+ * }
202
+ *
203
+ */
204
+ updateValues(values) {
205
+ Object.keys(values).forEach((key) => {
206
+ const filterItem = this.items
207
+ .find((item) => item.name === key);
208
+ if (!filterItem) {
209
+ return;
210
+ }
211
+ filterItem.model = values[key];
212
+ });
213
+ }
214
+ hide() {
215
+ this.changeVisibility(false);
216
+ }
217
+ show() {
218
+ this.changeVisibility(true);
219
+ }
220
+ changeVisibilityClick(value, event = null) {
221
+ if (event) {
222
+ event.stopPropagation();
223
+ }
224
+ this.changeVisibility(value);
225
+ }
226
+ filterInputEvent(event) {
227
+ if (!this.windowDesktop) {
228
+ return;
229
+ }
230
+ if (['Enter', 'NumpadEnter', 'Escape'].indexOf(event.code) >= 0) {
231
+ this.changeVisibility(false);
232
+ if (this.searchTextInput) {
233
+ this.searchTextInput.nativeElement.blur();
234
+ }
235
+ }
236
+ }
237
+ getItemValue(name) {
238
+ const item = this.items
239
+ .find((item) => item.name === name);
240
+ if (item) {
241
+ return item.model;
242
+ }
243
+ else {
244
+ return null;
245
+ }
246
+ }
247
+ showItem(name) {
248
+ const item = this.getItem(name);
249
+ if (item) {
250
+ item.hide = false;
251
+ this._filterItems.updateVisibleItems();
252
+ }
253
+ }
254
+ hideItem(name) {
255
+ const item = this.getItem(name);
256
+ if (!item) {
257
+ return;
258
+ }
259
+ item.hide = true;
260
+ this._filterItems.updateVisibleItems();
261
+ }
262
+ clearItem(name) {
263
+ const item = this.getItem(name);
264
+ if (!item) {
265
+ return;
266
+ }
267
+ item.clear();
268
+ }
269
+ updateItemConfig(name, params) {
270
+ var _a, _b;
271
+ const item = this.getItem(name);
272
+ if (!item) {
273
+ return;
274
+ }
275
+ item.label = (_a = params.label) !== null && _a !== void 0 ? _a : item.label;
276
+ item.chipLabel = (_b = params.chipLabel) !== null && _b !== void 0 ? _b : item.chipLabel;
277
+ this._filterItems.updateVisibleItems();
278
+ }
279
+ getItemValueChange$(name) {
280
+ const item = this.items.find((i) => i.name === name);
281
+ if (item) {
282
+ return item.value$
283
+ .pipe(map(() => {
284
+ return item.model;
285
+ }));
286
+ }
287
+ else {
288
+ return null;
289
+ }
290
+ }
291
+ changeVisibility(state) {
292
+ if (state === this.showFilterMenu) {
293
+ return;
294
+ }
295
+ if (!state) {
296
+ this.closed.emit();
297
+ return this._destroyFilterDrawer();
298
+ }
299
+ if (!this.hasVisibleItemOrSorting) {
300
+ return;
301
+ }
302
+ this._listenEscButton();
303
+ this.opened.emit();
304
+ this._filterOverlay.open();
305
+ }
306
+ clearSearchText(event) {
307
+ event.stopPropagation();
308
+ this._filterItems.keywordItem.clear();
309
+ this.searchTextInput.nativeElement.focus();
310
+ }
311
+ init() {
312
+ const data = this._filterItems.valuesAsQuery();
313
+ this._sort = this._filterItems.getSort();
314
+ if (this.config.init) {
315
+ this.config.init(data, this._sort);
316
+ }
317
+ this._updateChipsVisibility();
318
+ }
319
+ clear(event = null) {
320
+ if (event) {
321
+ event.stopPropagation();
322
+ }
323
+ this._filterItems.filtersClear();
324
+ if (this.config.clear) {
325
+ this.config.clear();
326
+ }
327
+ }
328
+ /**
329
+ * Close filter window and do change callback
330
+ */
331
+ search(event) {
332
+ this.changeVisibilityClick(false, event);
333
+ }
334
+ reload(event = null) {
335
+ if (event) {
336
+ event.preventDefault();
337
+ event.stopPropagation();
338
+ }
339
+ const data = this._filterItems.valuesAsQuery();
340
+ if (this.config.reload) {
341
+ this.config.reload(data, this._filterItems.getSort());
342
+ }
343
+ }
344
+ getItem(name) {
345
+ return this.items
346
+ .find((item) => item.name === name);
347
+ }
348
+ fetchQueryParams() {
349
+ this._externalParams.fetchQueryParams();
350
+ }
351
+ /**
352
+ * Call change callback and apply new filter values
353
+ */
354
+ change() {
355
+ const data = this._filterItems.valuesAsQuery();
356
+ const sort = this._filterItems.getSort();
357
+ const sortingChanged = ((!sort || !this._sort) && sort !== this._sort)
358
+ || (sort && this._sort && !objectsAreEquals(this._sort, sort));
359
+ if (sortingChanged) {
360
+ this._sort = sort;
361
+ if (this.config.sortChange) {
362
+ this.config.sortChange(data, sort);
363
+ }
364
+ }
365
+ if (this.config.change) {
366
+ this.config.change(data, sort);
367
+ }
368
+ this._updateChipsVisibility();
369
+ }
370
+ /**
371
+ * Update filter actions config
372
+ * @param actions
373
+ */
374
+ updateActions(actions) {
375
+ this._actions.initActions(actions);
376
+ }
377
+ /**
378
+ * Show "Filters" button
379
+ */
380
+ showFiltersBtn() {
381
+ this._filtersBtnVisible$.next(true);
382
+ }
383
+ /**
384
+ * Hide "Filters" button
385
+ */
386
+ hideFiltersBtn() {
387
+ this._filtersBtnVisible$.next(false);
388
+ }
389
+ /**
390
+ * Show "Keyword" field if it present
391
+ */
392
+ showKeywordField() {
393
+ this._keywordVisible$.next(true);
394
+ }
395
+ /**
396
+ * Hide "Keyword" field if it present
397
+ */
398
+ hideKeywordField() {
399
+ this._keywordVisible$.next(false);
400
+ }
401
+ /**
402
+ * Go through actions and check show() callback and update visible actions
403
+ */
404
+ updateActionsVisibility() {
405
+ this._actions.updateActionsVisibility();
406
+ }
407
+ /**
408
+ * Go through actions and check disabled() callback and update disabled state
409
+ */
410
+ updateDisabledState() {
411
+ this._actions.updateDisabledState();
412
+ }
413
+ setItems(items) {
414
+ this._filterItems.destroyItems();
415
+ this.config.items = items;
416
+ this._filterItems.setConfig(this._config);
417
+ this._externalParams.initItems();
418
+ this._syncSearchInputWithKeyword();
419
+ this._listenKeywordItemClear();
420
+ }
421
+ _initFilterWithConfig(config) {
422
+ if (this.config) {
423
+ this._filterItems.destroyItems();
424
+ }
425
+ config = Object.assign(Object.assign({}, (this._defaultConfig || {})), config);
426
+ this._config = new FsFilterConfig(config);
427
+ this._actions.initActions(this._config.actions);
428
+ this._filterItems.setConfig(this._config);
429
+ this._externalParams.setConfig(this._config);
430
+ this._syncSearchInputWithKeyword();
431
+ if (!!this.config.reloadWhenConfigChanged) {
432
+ this.change();
433
+ }
434
+ this._listenKeywordItemClear();
435
+ }
436
+ _destroyFilterDrawer() {
437
+ this._filterOverlay.close();
438
+ }
439
+ _updateWindowWidth() {
440
+ this.windowDesktop = window.innerWidth > 1200;
441
+ }
442
+ _listenEscButton() {
443
+ this._zone.runOutsideAngular(() => {
444
+ fromEvent(window, 'keyup')
445
+ .pipe(filter((event) => event.code === 'Escape'), takeUntil(this.closed), takeUntil(this._destroy$))
446
+ .subscribe(() => {
447
+ this._zone.run(() => {
448
+ this.changeVisibility(false);
449
+ });
450
+ });
451
+ });
452
+ }
453
+ _listenInputKeyEvents() {
454
+ if (!this.searchTextInput) {
455
+ return;
456
+ }
457
+ this._zone.runOutsideAngular(() => {
458
+ fromEvent(this.searchTextInput.nativeElement, 'keydown')
459
+ .pipe(debounceTime(500), filter((event) => {
460
+ return ['Enter', 'NumpadEnter', 'Escape'].indexOf(event.code) > -1;
461
+ }), takeUntil(this._destroy$))
462
+ .subscribe((event) => {
463
+ this._zone.run(() => {
464
+ this.filterInputEvent(event);
465
+ });
466
+ });
467
+ });
468
+ }
469
+ _listenWindowResize() {
470
+ this._zone.runOutsideAngular(() => {
471
+ fromEvent(window, 'resize')
472
+ .pipe(debounceTime(100), takeUntil(this._destroy$))
473
+ .subscribe(() => {
474
+ this._zone.run(() => {
475
+ this._updateWindowWidth();
476
+ });
477
+ });
478
+ });
479
+ }
480
+ _listenInputChanges() {
481
+ this._zone.runOutsideAngular(() => {
482
+ this.searchText.valueChanges
483
+ .pipe(debounceTime(200), distinctUntilChanged(), filter((value) => {
484
+ var _a;
485
+ return value !== ((_a = this._filterItems.keywordItem) === null || _a === void 0 ? void 0 : _a.model);
486
+ }), takeUntil(this._destroy$))
487
+ .subscribe((value) => {
488
+ this._zone.run(() => {
489
+ const keywordItem = this._filterItems.keywordItem;
490
+ if (keywordItem && keywordItem.value !== value) {
491
+ keywordItem.model = value;
492
+ }
493
+ });
494
+ });
495
+ });
496
+ }
497
+ _syncSearchInputWithKeyword() {
498
+ const keywordItem = this._filterItems.keywordItem;
499
+ if (keywordItem) {
500
+ this.searchText.setValue(keywordItem.model);
501
+ this.searchPlaceholder = keywordItem.label || 'Search';
502
+ }
503
+ }
504
+ _listenKeywordItemClear() {
505
+ var _a;
506
+ (_a = this._filterItems
507
+ .keywordItem) === null || _a === void 0 ? void 0 : _a.clear$.pipe(takeUntil(this._filterItems.keywordItem.destroy$), takeUntil(this._destroy$)).subscribe(() => {
508
+ this.searchText.setValue('');
509
+ });
510
+ }
511
+ _listenInternalItemsChange() {
512
+ this._filterItems
513
+ .itemsChange$
514
+ .pipe(takeUntil(this._destroy$))
515
+ .subscribe(() => {
516
+ this.change();
517
+ });
518
+ }
519
+ _initOverlay() {
520
+ this._filterOverlay.setClearFn(this.clear.bind(this));
521
+ this._filterOverlay.setDoneFn(this.hide.bind(this));
522
+ }
523
+ // We may need some time to recieve external params and after that ready can be emitted
524
+ _listenWhenFilterReady() {
525
+ combineLatest([
526
+ this._externalParams.pending$,
527
+ this.itemsReady$,
528
+ ])
529
+ .pipe(filter(([pendingParams, itemsReady]) => !pendingParams && itemsReady), takeUntil(this._destroy$))
530
+ .subscribe(() => {
531
+ this.init();
532
+ this._syncSearchInputWithKeyword();
533
+ this.ready.emit();
534
+ });
535
+ }
536
+ _updateChipsVisibility() {
537
+ const hasFilterChips = this._filterItems.items
538
+ .some((item) => {
539
+ return item.isChipVisible;
540
+ });
541
+ this._hasFilterChips$.next(hasFilterChips);
542
+ }
543
+ }
544
+ FilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FilterComponent, deps: [{ token: i1.FsFilterOverlayService }, { token: i0.NgZone }, { token: i2.ExternalParamsController }, { token: i3.FsFilterItemsStore }, { token: i4.ActionsController }, { token: FS_FILTER_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
545
+ FilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: FilterComponent, selector: "fs-filter", inputs: { setConfig: ["config", "setConfig"], setFilter: ["filter", "setFilter"], showSortBy: "showSortBy", showFilterInput: "showFilterInput" }, outputs: { closed: "closed", opened: "opened", ready: "ready" }, host: { properties: { "class.filters-open": "this.showFilterMenu", "class.window-desktop": "this.windowDesktop", "class.fs-filter": "this.fsFilterClass", "class.has-keyword": "this.hasKeyword" } }, providers: [
546
+ FsFilterOverlayService,
547
+ ExternalParamsController,
548
+ PersistanceParamsController,
549
+ QueryParamsController,
550
+ FocusControllerService,
551
+ FsFilterItemsStore,
552
+ SavedFiltersController,
553
+ ActionsController,
554
+ ], queries: [{ propertyName: "statusBar", first: true, predicate: FilterStatusBarDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "searchTextInput", first: true, predicate: ["searchTextInput"], descendants: true }, { propertyName: "searchTextMatInput", first: true, predicate: ["searchTextInput"], descendants: true, read: MatInput }], ngImport: i0, template: "<ng-container>\n <div class=\"filter-container\">\n <ng-container *ngIf=\"hasKeyword\">\n <div class=\"filter-keyword\">\n <form autocomplete=\"off\" role=\"presentation\" *ngIf=\"keywordVisible$ | async\">\n <mat-form-field floatLabel=\"never\">\n <span matPrefix>\n <mat-icon matPrefix>search</mat-icon>\n </span>\n\n <input\n #searchTextInput\n matInput\n [formControl]=\"searchText\"\n [placeholder]=\"searchPlaceholder\"\n name=\"filter-input\"\n (click)=\"filterInputEvent($event)\"\n class=\"filter-input\">\n\n <a matSuffix\n *ngIf=\"searchText.value && showFilterInput && config.clear\"\n (click)=\"clearSearchText($event)\"\n href=\"javascript:void(0)\"\n class=\"clear\">\n <mat-icon>clear</mat-icon>\n </a>\n\n <a matSuffix\n (click)=\"reload($event)\"\n class=\"reload\"\n *ngIf=\"config.reload\">\n <mat-icon>refresh</mat-icon>\n </a>\n </mat-form-field>\n </form>\n </div>\n </ng-container>\n\n <div class=\"filter-actions\">\n <ng-container *ngIf=\"hasVisibleItemOrSorting && filtersBtnVisible$ | async\">\n <button\n mat-button\n class=\"filters-button\"\n [ngClass]=\"{\n 'mat-raised-button': config.button.style == 'raised',\n 'mat-button': config.button.style == 'basic',\n 'mat-icon-button': config.button.style == 'icon'\n }\"\n (click)=\"changeVisibilityClick(!showFilterMenu, $event)\"\n type=\"button\"\n [color]=\"config.button.color\">\n <mat-icon *ngIf=\"config.button.icon\">{{config.button.icon}}</mat-icon>\n {{ config.button.label }}\n </button>\n </ng-container>\n \n <fs-filter-actions\n *ngIf=\"actionsVisible$ | async\"\n [actions]=\"actions$ | async\"\n [kebabActions]=\"menuActions$ | async\">\n </fs-filter-actions>\n </div>\n </div>\n <div class=\"filter-status-container\">\n <div class=\"filter-status\" *ngIf=\"statusBar\">\n <small><ng-container *ngTemplateOutlet=\"statusBar\"></ng-container></small>\n </div>\n <fs-filter-chips\n *ngIf=\"config.chips && hasFilterChips$ | async\"\n class=\"filter-chips\"\n [filters]=\"items\">\n </fs-filter-chips>\n </div>\n</ng-container>", styles: ["fs-filter{display:block}.fs-filter{margin-bottom:20px;display:block}.fs-filter:not(.has-keyword){display:flex;flex-direction:row-reverse}.fs-filter:not(.has-keyword) .filter-status-container{margin-bottom:4px}.fs-filter .results{min-height:90px;position:relative;overflow-x:auto;overflow-y:hidden}.fs-filter .filter-status-container{flex-grow:1;display:flex;justify-content:center;flex-direction:column;margin-top:4px}.fs-filter .filter-status-container .filter-status{overflow:hidden;text-overflow:ellipsis;line-height:17px}.fs-filter .filter-status-container .filter-status+fs-filter-chips{margin-top:4px}.fs-filter .filter-status-container fs-filter-chips{display:block}.fs-filter .filter-container{flex-direction:row;box-sizing:border-box;display:flex;position:relative}.fs-filter .filter-container .search{top:8px;position:absolute;margin-left:1px;left:0}.fs-filter .filter-container .search mat-icon{transform:scale(.9)}.fs-filter .filter-container form{width:100%;height:100%}.fs-filter .filter-container .filter-keyword{flex-direction:row;box-sizing:border-box;display:flex;align-items:center;flex:1}.fs-filter .filter-container .filter-keyword .mat-form-field{width:100%;height:100%;font-size:103%}.fs-filter .filter-container .filter-keyword .mat-form-field .mat-form-field-underline{bottom:auto}.fs-filter .filter-container .filter-keyword .mat-form-field .mat-form-field-infix{border-top:0}.fs-filter .filter-container .filter-keyword .mat-form-field .mat-form-field-wrapper{padding-bottom:0;height:100%}.fs-filter .filter-container .filter-keyword .mat-form-field .mat-form-field-flex{align-items:center;height:100%}.fs-filter .filter-container .filter-keyword .mat-form-field-prefix,.fs-filter .filter-container .filter-keyword .mat-form-field-suffix{align-self:center;display:flex;align-items:center;white-space:nowrap}.fs-filter .filter-container .filter-keyword .mat-form-field-prefix mat-icon,.fs-filter .filter-container .filter-keyword .mat-form-field-prefix a,.fs-filter .filter-container .filter-keyword .mat-form-field-suffix mat-icon,.fs-filter .filter-container .filter-keyword .mat-form-field-suffix a{display:flex;cursor:pointer;color:initial}.fs-filter .filter-container .filter-keyword .mat-form-field-prefix mat-icon:hover,.fs-filter .filter-container .filter-keyword .mat-form-field-prefix a:hover,.fs-filter .filter-container .filter-keyword .mat-form-field-suffix mat-icon:hover,.fs-filter .filter-container .filter-keyword .mat-form-field-suffix a:hover{color:inherit}.fs-filter .filter-container .filter-keyword .mat-form-field-infix{width:auto}.fs-filter .filter-actions{display:flex;align-items:center}.fs-filter button.reload{margin-left:-40px;right:-9px}@media screen and (min-width: 599px){.filter-actions{margin-left:10px}.filters-button+fs-filter-actions:not(:empty){margin-left:5px}}@media screen and (max-width: 600px){.filter-actions{margin-left:5px}.filter-actions .filters-button{font-size:0;padding:0;min-width:unset;width:36px;height:36px;border-radius:50%;box-shadow:unset!important}}@media screen and (min-width: 1200px){body.fs-filter-open{margin-right:350px}.fs-filter-backdrop{display:none}}body.fs-filter-open::-webkit-scrollbar{width:0;background:transparent}\n"], components: [{ type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i8.FsFilterActionsComponent, selector: "fs-filter-actions", inputs: ["kebabActions", "actions"] }, { type: i9.FsFilterChipsComponent, selector: "fs-filter-chips", inputs: ["filters"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i11.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.MatPrefix, selector: "[matPrefix]" }, { type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i11.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i11.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i5.MatSuffix, selector: "[matSuffix]" }, { type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "async": i10.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
555
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FilterComponent, decorators: [{
556
+ type: Component,
557
+ args: [{
558
+ selector: 'fs-filter',
559
+ styleUrls: ['./filter.component.scss'],
560
+ templateUrl: './filter.component.html',
561
+ encapsulation: ViewEncapsulation.None,
562
+ providers: [
563
+ FsFilterOverlayService,
564
+ ExternalParamsController,
565
+ PersistanceParamsController,
566
+ QueryParamsController,
567
+ FocusControllerService,
568
+ FsFilterItemsStore,
569
+ SavedFiltersController,
570
+ ActionsController,
571
+ ],
572
+ changeDetection: ChangeDetectionStrategy.OnPush,
573
+ }]
574
+ }], ctorParameters: function () { return [{ type: i1.FsFilterOverlayService }, { type: i0.NgZone }, { type: i2.ExternalParamsController }, { type: i3.FsFilterItemsStore }, { type: i4.ActionsController }, { type: i13.FsFilterConfig, decorators: [{
575
+ type: Optional
576
+ }, {
577
+ type: Inject,
578
+ args: [FS_FILTER_CONFIG]
579
+ }] }]; }, propDecorators: { setConfig: [{
580
+ type: Input,
581
+ args: ['config']
582
+ }], setFilter: [{
583
+ type: Input,
584
+ args: ['filter']
585
+ }], showSortBy: [{
586
+ type: Input
587
+ }], showFilterInput: [{
588
+ type: Input
589
+ }], closed: [{
590
+ type: Output
591
+ }], opened: [{
592
+ type: Output
593
+ }], ready: [{
594
+ type: Output
595
+ }], statusBar: [{
596
+ type: ContentChild,
597
+ args: [FilterStatusBarDirective, { read: TemplateRef }]
598
+ }], searchTextInput: [{
599
+ type: ViewChild,
600
+ args: ['searchTextInput']
601
+ }], searchTextMatInput: [{
602
+ type: ViewChild,
603
+ args: ['searchTextInput', { read: MatInput }]
604
+ }], showFilterMenu: [{
605
+ type: HostBinding,
606
+ args: ['class.filters-open']
607
+ }], windowDesktop: [{
608
+ type: HostBinding,
609
+ args: ['class.window-desktop']
610
+ }], fsFilterClass: [{
611
+ type: HostBinding,
612
+ args: ['class.fs-filter']
613
+ }], hasKeyword: [{
614
+ type: HostBinding,
615
+ args: ['class.has-keyword']
616
+ }] } });
617
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBSUwsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixZQUFZLEVBQ1osV0FBVyxFQUNYLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUc5RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVB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LElBQUk7b0JBQ3JDLFNBQVMsRUFBRTt3QkFDVCxzQkFBc0I7d0JBQ3RCLHdCQUF3Qjt3QkFDeEIsMkJBQTJCO3dCQUMzQixxQkFBcUI7d0JBQ3JCLHNCQUFzQjt3QkFDdEIsa0JBQWtCO3dCQUNsQixzQkFBc0I7d0JBQ3RCLGlCQUFpQjtxQkFDbEI7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEOzswQkEyREksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxnQkFBZ0I7NENBdkRsQyxTQUFTO3NCQURaLEtBQUs7dUJBQUMsUUFBUTtnQkFNWCxTQUFTO3NCQURaLEtBQUs7dUJBQUMsUUFBUTtnQkFLQyxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQ1csTUFBTTtzQkFBdEIsTUFBTTtnQkFDVSxNQUFNO3NCQUF0QixNQUFNO2dCQUNVLEtBQUs7c0JBQXJCLE1BQU07Z0JBR0EsU0FBUztzQkFEZixZQUFZO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFJdEQsZUFBZTtzQkFEckIsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBSXJCLGtCQUFrQjtzQkFEeEIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7Z0JBSXpDLGNBQWM7c0JBRHBCLFdBQVc7dUJBQUMsb0JBQW9CO2dCQUkxQixhQUFhO3NCQURuQixXQUFXO3VCQUFDLHNCQUFzQjtnQkFJNUIsYUFBYTtzQkFEbkIsV0FBVzt1QkFBQyxpQkFBaUI7Z0JBSW5CLFVBQVU7c0JBRHBCLFdBQVc7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgT3V0cHV0LFxuICBPcHRpb25hbCxcbiAgSW5qZWN0LFxuICBDb250ZW50Q2hpbGQsXG4gIFRlbXBsYXRlUmVmLFxuICBIb3N0QmluZGluZyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRlNfRklMVEVSX0NPTkZJRyB9IGZyb20gJy4vLi4vLi4vaW5qZWN0b3JzL2ZpbHRlci1jb25maWcnO1xuaW1wb3J0IHsgRnNGaWx0ZXJDb25maWcgfSBmcm9tICcuLi8uLi9tb2RlbHMvZmlsdGVyLWNvbmZpZyc7XG5pbXBvcnQgeyBvYmplY3RzQXJlRXF1YWxzIH0gZnJvbSAnLi4vLi4vaGVscGVycy9jb21wYXJlJztcbmltcG9ydCB7IEZzRmlsdGVyT3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWx0ZXItb3ZlcmxheS5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlclN0YXR1c0JhckRpcmVjdGl2ZSB9IGZyb20gJy4vLi4vLi4vZGlyZWN0aXZlcy9zdGF0dXMtYmFyL3N0YXR1cy1iYXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZpbHRlckNvbmZpZywgRmlsdGVyU29ydCwgSUZpbHRlckNvbmZpZ0l0ZW0gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQmFzZUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaXRlbXMvYmFzZS1pdGVtJztcbmltcG9ydCB7IEZzRmlsdGVySXRlbXNTdG9yZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2l0ZW1zLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXh0ZXJuYWxQYXJhbXNDb250cm9sbGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXh0ZXJuYWwtcGFyYW1zLWNvbnRyb2xsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQZXJzaXN0YW5jZVBhcmFtc0NvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leHRlcm5hbC1wYXJhbXMvcGVyc2lzdGFuY2UtcGFyYW1zLWNvbnRyb2xsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBRdWVyeVBhcmFtc0NvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leHRlcm5hbC1wYXJhbXMvcXVlcnktcGFyYW1zLWNvbnRyb2xsZXIuc2VydmljZSc7XG5pbXBvcnQgeyBGb2N1c0NvbnRyb2xsZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9jdXMtY29udHJvbGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNhdmVkRmlsdGVyc0NvbnRyb2xsZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leHRlcm5hbC1wYXJhbXMvc2F2ZWQtZmlsdGVycy1jb250cm9sbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgSVNvcnRpbmdDaGFuZ2VFdmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGc0ZpbHRlckFjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBBY3Rpb25zQ29udHJvbGxlciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvYWN0aW9ucy1jb250cm9sbGVyJztcbmltcG9ydCB7IElVcGRhdGVGaWx0ZXJJdGVtQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy91cGRhdGUtZmlsdGVyLWl0ZW0uaW50ZXJmYWNlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1maWx0ZXInLFxuICBzdHlsZVVybHM6IFsgJy4vZmlsdGVyLmNvbXBvbmVudC5zY3NzJyBdLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgRnNGaWx0ZXJPdmVybGF5U2VydmljZSxcbiAgICBFeHRlcm5hbFBhcmFtc0NvbnRyb2xsZXIsXG4gICAgUGVyc2lzdGFuY2VQYXJhbXNDb250cm9sbGVyLFxuICAgIFF1ZXJ5UGFyYW1zQ29udHJvbGxlcixcbiAgICBGb2N1c0NvbnRyb2xsZXJTZXJ2aWNlLFxuICAgIEZzRmlsdGVySXRlbXNTdG9yZSxcbiAgICBTYXZlZEZpbHRlcnNDb250cm9sbGVyLFxuICAgIEFjdGlvbnNDb250cm9sbGVyLFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgnY29uZmlnJylcbiAgc2V0IHNldENvbmZpZyhjb25maWcpIHtcbiAgICB0aGlzLl9pbml0RmlsdGVyV2l0aENvbmZpZyhjb25maWcpO1xuICB9XG5cbiAgQElucHV0KCdmaWx0ZXInKVxuICBzZXQgc2V0RmlsdGVyKGNvbmZpZykge1xuICAgIHRoaXMuX2luaXRGaWx0ZXJXaXRoQ29uZmlnKGNvbmZpZyk7XG4gIH1cblxuICBASW5wdXQoKSBwdWJsaWMgc2hvd1NvcnRCeTogYW55ID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIHNob3dGaWx0ZXJJbnB1dCA9IHRydWU7XG4gIEBPdXRwdXQoKSBwdWJsaWMgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQENvbnRlbnRDaGlsZChGaWx0ZXJTdGF0dXNCYXJEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgcHVibGljIHN0YXR1c0JhcjtcblxuICBAVmlld0NoaWxkKCdzZWFyY2hUZXh0SW5wdXQnKVxuICBwdWJsaWMgc2VhcmNoVGV4dElucHV0OiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaFRleHRJbnB1dCcsIHsgcmVhZDogTWF0SW5wdXQgfSlcbiAgcHVibGljIHNlYXJjaFRleHRNYXRJbnB1dDogTWF0SW5wdXQ7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5maWx0ZXJzLW9wZW4nKVxuICBwdWJsaWMgc2hvd0ZpbHRlck1lbnUgPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLndpbmRvdy1kZXNrdG9wJylcbiAgcHVibGljIHdpbmRvd0Rlc2t0b3AgPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZzLWZpbHRlcicpXG4gIHB1YmxpYyBmc0ZpbHRlckNsYXNzID0gdHJ1ZTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhhcy1rZXl3b3JkJylcbiAgcHVibGljIGdldCBoYXNLZXl3b3JkKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy5oYXNLZXl3b3JkO1xuICB9XG5cbiAgcHVibGljIHNlYXJjaFRleHQgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAgcHVibGljIHNlYXJjaFBsYWNlaG9sZGVyID0gJ1NlYXJjaCc7XG5cbiAgcHJvdGVjdGVkIF9jb25maWc6IEZzRmlsdGVyQ29uZmlnID0gbnVsbDtcblxuICBwcml2YXRlIF9zb3J0OiBGaWx0ZXJTb3J0O1xuICBwcml2YXRlIF9maWx0ZXJzQnRuVmlzaWJsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICBwcml2YXRlIF9rZXl3b3JkVmlzaWJsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICBwcml2YXRlIF9oYXNGaWx0ZXJDaGlwcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2ZpbHRlck92ZXJsYXk6IEZzRmlsdGVyT3ZlcmxheVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfem9uZTogTmdab25lLFxuICAgIHByaXZhdGUgX2V4dGVybmFsUGFyYW1zOiBFeHRlcm5hbFBhcmFtc0NvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSBfZmlsdGVySXRlbXM6IEZzRmlsdGVySXRlbXNTdG9yZSxcbiAgICBwcml2YXRlIF9hY3Rpb25zOiBBY3Rpb25zQ29udHJvbGxlcixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEZTX0ZJTFRFUl9DT05GSUcpIHByaXZhdGUgX2RlZmF1bHRDb25maWc6IEZzRmlsdGVyQ29uZmlnXG4gICkge1xuICAgIHRoaXMuX2xpc3RlbldoZW5GaWx0ZXJSZWFkeSgpO1xuICAgIHRoaXMuX3VwZGF0ZVdpbmRvd1dpZHRoKCk7XG5cbiAgICB0aGlzLl9maWx0ZXJPdmVybGF5LmF0dGFjaCRcbiAgICAucGlwZShcbiAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgIClcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2hvd0ZpbHRlck1lbnUgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fZmlsdGVyT3ZlcmxheS5kZXRhY2gkXG4gICAgLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93RmlsdGVyTWVudSA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fbGlzdGVuV2luZG93UmVzaXplKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpOiBGc0ZpbHRlckNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVyUGFyYW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy52YWx1ZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVyUGFyYW1zUXVlcnkoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy52YWx1ZXNBc1F1ZXJ5KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy5pdGVtcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy52aXNpYmxlSXRlbXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGl0ZW1zUmVhZHkkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJJdGVtcy5yZWFkeSQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0ZpbHRlckNoaXBzJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5faGFzRmlsdGVyQ2hpcHMkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNWaXNpYmxlSXRlbU9yU29ydGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlSXRlbXMubGVuZ3RoID4gMCB8fCAhIXRoaXMuX2ZpbHRlckl0ZW1zLnNvcnRCeUl0ZW1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVyc0J0blZpc2libGUkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJzQnRuVmlzaWJsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGtleXdvcmRWaXNpYmxlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fa2V5d29yZFZpc2libGUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3Rpb25zVmlzaWJsZSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbnMudmlzaWJsZSQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGlvbnMkKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb25zLmFjdGlvbnMkO1xuICB9XG5cbiAgcHVibGljIGdldCBtZW51QWN0aW9ucyQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbnMubWVudUFjdGlvbnMkO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuXG4gICAgLy8gQXZvaWQgbmdDaGFuZ2VzIGVycm9yXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jb25maWcuYXV0b2ZvY3VzKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuX2xpc3RlbkludGVybmFsSXRlbXNDaGFuZ2UoKTtcbiAgICB0aGlzLl9pbml0T3ZlcmxheSgpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9saXN0ZW5JbnB1dEtleUV2ZW50cygpO1xuICAgIC8vIEZJWE1FIHByZXZlbnQgZmlyZSBjaGFuZ2UgYWZ0ZXIgaW5pdFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fbGlzdGVuSW5wdXRDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG5cbiAgICB0aGlzLl9kZXN0cm95RmlsdGVyRHJhd2VyKCk7XG5cbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBmb2N1cygpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hUZXh0TWF0SW5wdXQpIHtcbiAgICAgIHRoaXMuc2VhcmNoVGV4dE1hdElucHV0LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNvcnQoc29ydDogSVNvcnRpbmdDaGFuZ2VFdmVudCkge1xuICAgIHRoaXMuX2ZpbHRlckl0ZW1zLnVwZGF0ZVNvcnQoc29ydClcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBEbyB1cGRhdGUgdmFsdWUgb2Ygc29tZSBmaWVsZFxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVzIC0gdmFsdWVzIGZvciB1cGRhdGVcbiAgICpcbiAgICogVG8gdXBkYXRlIHRleHQgdmFsdWUganVzdCBwYXNzIG5ldyB0ZXh0IHZhbHVlXG4gICAqXG4gICAqIHB1YmxpYyB1cGRhdGVTZWxlY3RWYWx1ZSh2YWwpIHtcbiAgICogICB0aGlzLmZpbHRlckVsLnVwZGF0ZVZhbHVlcyh7IGtleXdvcmQ6IHZhbCB9KTtcbiAgICogfVxuICAgKlxuICAgKiBUbyB1cGRhdGUgc2VsZWN0IG9yIG9ic2VydmFibGUgc2VsZWN0IHlvdSBjb3VsZCBwYXNzIHN1aXRhYmxlIHZhbHVlXG4gICAqXG4gICAqIHB1YmxpYyB1cGRhdGVTZWxlY3RWYWx1ZSh2YWw6IG51bWJlcikge1xuICAgKiAgIHRoaXMuZmlsdGVyRWwudXBkYXRlVmFsdWVzKHsgc2ltcGxlX3NlbGVjdDogdmFsIH0sIHsgb2JzZXJ2YWJsZV9zZWxlY3Q6IHZhbCB9KTtcbiAgICogfVxuICAgKlxuICAgKiBUbyB1cGRhdGUgY2hlY2tib3ggdmFsdWUganVzdCBwYXNzIHRydWUvZmFsc2UgYXMgdmFsdWVcbiAgICpcbiAgICogcHVibGljIHVwZGF0ZUNoZWNrb3godmFsOiBib29sZWFuKSB7XG4gICAqICAgdGhpcy5maWx0ZXJFbC51cGRhdGVWYWx1ZXMoeyBjaGVja2JveDogdmFsIH0pO1xuICAgKiB9XG4gICAqXG4gICAqIFRvIHVwZGF0ZSByYW5nZSB2YWx1ZSBqdXN0IHBhc3Mgb2JqZWN0IHdpdGggbWluJm1heCBvYmplY3Qgb3IganVzdCB3aXRoIG9uZSBvZiB0YXJnZXRzXG4gICAqXG4gICAqIEV4LjogeyBtaW46IDEwLCBtYXggMTUgfSwgeyBtaW46IDUgfSwgeyBtYXggNSB9XG4gICAqXG4gICAqIHB1YmxpYyB1cGRhdGVSYW5nZSh2YWwpIHtcbiAgICogICB0aGlzLmZpbHRlckVsLnVwZGF0ZVZhbHVlcyh7IHJhbmdlOiB2YWwgfSk7XG4gICAqIH1cbiAgICpcbiAgICogVG8gdXBkYXRlIGF1dG9jb21wbGV0ZSBqdXN0IHBhc3Mgb2JqZWN0IHdpdGggbmFtZS92YWx1ZSBmaWVsZHNcbiAgICpcbiAgICogRXguOiB7IG5hbWU6ICdKb2huIERvZScsIHZhbHVlOiAxIH1cbiAgICpcbiAgICogcHVibGljIHVwZGF0ZUF1dG9jb21wbGV0ZSh2YWwpIHtcbiAgICogICB0aGlzLmZpbHRlckVsLnVwZGF0ZVZhbHVlcyh7IGF1dG9jb21wbGV0ZV91c2VyX2lkOiB2YWwgfSk7XG4gICAqIH1cbiAgICpcbiAgICogVG8gdXBkYXRlIGF1dG9jb21wbGV0ZWNoaXBzIGp1c3QgcGFzczpcbiAgICpcbiAgICogMSkgb2JqZWN0IHdpdGggbmFtZS92YWx1ZSBmaWVsZHMgLSB3aWxsIGJlIGFwcGVuZGVkIHRvIGV4aXN0aW5nIHNldCBvZiB2YWx1ZXNcbiAgICpcbiAgICogeyBuYW1lOiAnSm9obiBEb2UnLCB2YWx1ZTogMSB9XG4gICAqXG4gICAqIDIpIGFycmF5IG9mIG9iamVjdHMgLSB3aWxsIGJlIGFwcGVuZGVkIHRvIGV4aXN0aW5nIHNldCBvZiB2YWx1ZXNcbiAgICpcbiAgICogW3sgbmFtZTogJ0pvaG4gRG9lJywgdmFsdWU6IDEgfSwgeyBuYW1lOiAnRGFyeWEgRmlsaXBvdmEnLCB2YWx1ZTogMiB9XVxuICAgKlxuICAgKiAzKSBudWxsIC0gY2xlYXIgZXhpc3Rpbmcgc2V0IG9mIHZhbHVlc1xuICAgKlxuICAgKiBwdWJsaWMgdXBkYXRlQXV0b2NvbXBsZXRlKHZhbCkge1xuICAgKiAgIHRoaXMuZmlsdGVyRWwudXBkYXRlVmFsdWVzKHsgYXV0b2NvbXBsZXRlY2hpcHNfdXNlcl9pZDogdmFsIH0pO1xuICAgKiB9XG4gICAqXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlVmFsdWVzKHZhbHVlcykge1xuICAgIE9iamVjdC5rZXlzKHZhbHVlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJJdGVtID0gdGhpcy5pdGVtc1xuICAgICAgICAuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBrZXkpO1xuXG4gICAgICBpZiAoIWZpbHRlckl0ZW0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmaWx0ZXJJdGVtLm1vZGVsID0gdmFsdWVzW2tleV07XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaGlkZSgpIHtcbiAgICB0aGlzLmNoYW5nZVZpc2liaWxpdHkoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHNob3coKSB7XG4gICAgdGhpcy5jaGFuZ2VWaXNpYmlsaXR5KHRydWUpO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVZpc2liaWxpdHlDbGljayh2YWx1ZSwgZXZlbnQgPSBudWxsKSB7XG5cbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlVmlzaWJpbGl0eSh2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZmlsdGVySW5wdXRFdmVudChldmVudCkge1xuXG4gICAgaWYgKCF0aGlzLndpbmRvd0Rlc2t0b3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFsnRW50ZXInLCAnTnVtcGFkRW50ZXInLCAnRXNjYXBlJ10uaW5kZXhPZihldmVudC5jb2RlKSA+PSAwKSB7XG4gICAgICB0aGlzLmNoYW5nZVZpc2liaWxpdHkoZmFsc2UpO1xuXG4gICAgICBpZiAodGhpcy5zZWFyY2hUZXh0SW5wdXQpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0SW5wdXQubmF0aXZlRWxlbWVudC5ibHVyKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbVZhbHVlKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zXG4gICAgICAuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBuYW1lKTtcblxuICAgIGlmIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS5tb2RlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNob3dJdGVtKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0obmFtZSk7XG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgaXRlbS5oaWRlID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuX2ZpbHRlckl0ZW1zLnVwZGF0ZVZpc2libGVJdGVtcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoaWRlSXRlbShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKG5hbWUpO1xuXG4gICAgaWYgKCFpdGVtKSB7IHJldHVybiB9XG5cbiAgICBpdGVtLmhpZGUgPSB0cnVlO1xuXG4gICAgdGhpcy5fZmlsdGVySXRlbXMudXBkYXRlVmlzaWJsZUl0ZW1zKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJJdGVtKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0obmFtZSk7XG5cbiAgICBpZiAoIWl0ZW0pIHsgcmV0dXJuIH1cblxuICAgIGl0ZW0uY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVJdGVtQ29uZmlnKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IElVcGRhdGVGaWx0ZXJJdGVtQ29uZmlnXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0obmFtZSk7XG5cbiAgICBpZiAoIWl0ZW0pIHsgcmV0dXJuIH1cblxuICAgIGl0ZW0ubGFiZWwgPSBwYXJhbXMubGFiZWwgPz8gaXRlbS5sYWJlbDtcbiAgICBpdGVtLmNoaXBMYWJlbCA9IHBhcmFtcy5jaGlwTGFiZWwgPz8gaXRlbS5jaGlwTGFiZWw7XG5cbiAgICB0aGlzLl9maWx0ZXJJdGVtcy51cGRhdGVWaXNpYmxlSXRlbXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJdGVtVmFsdWVDaGFuZ2UkKG5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB8IG51bGwge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQoKGkpID0+IGkubmFtZSA9PT0gbmFtZSk7XG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0udmFsdWUkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbS5tb2RlbDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNoYW5nZVZpc2liaWxpdHkoc3RhdGU6IGJvb2xlYW4pIHtcblxuICAgIGlmIChzdGF0ZSA9PT0gdGhpcy5zaG93RmlsdGVyTWVudSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgICAgIHJldHVybiB0aGlzLl9kZXN0cm95RmlsdGVyRHJhd2VyKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhhc1Zpc2libGVJdGVtT3JTb3J0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdGVuRXNjQnV0dG9uKCk7XG5cbiAgICB0aGlzLm9wZW5lZC5lbWl0KCk7XG5cbiAgICB0aGlzLl9maWx0ZXJPdmVybGF5Lm9wZW4oKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNlYXJjaFRleHQoZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLl9maWx0ZXJJdGVtcy5rZXl3b3JkSXRlbS5jbGVhcigpO1xuICAgIHRoaXMuc2VhcmNoVGV4dElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9maWx0ZXJJdGVtcy52YWx1ZXNBc1F1ZXJ5KCk7XG4gICAgdGhpcy5fc29ydCA9IHRoaXMuX2ZpbHRlckl0ZW1zLmdldFNvcnQoKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5pbml0KSB7XG4gICAgICB0aGlzLmNvbmZpZy5pbml0KGRhdGEsIHRoaXMuX3NvcnQpO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZUNoaXBzVmlzaWJpbGl0eSgpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKGV2ZW50ID0gbnVsbCkge1xuXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICB0aGlzLl9maWx0ZXJJdGVtcy5maWx0ZXJzQ2xlYXIoKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5jbGVhcikge1xuICAgICAgdGhpcy5jb25maWcuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgZmlsdGVyIHdpbmRvdyBhbmQgZG8gY2hhbmdlIGNhbGxiYWNrXG4gICAqL1xuICBwdWJsaWMgc2VhcmNoKGV2ZW50KSB7XG4gICAgdGhpcy5jaGFuZ2VWaXNpYmlsaXR5Q2xpY2soZmFsc2UsIGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyByZWxvYWQoZXZlbnQgPSBudWxsKSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2ZpbHRlckl0ZW1zLnZhbHVlc0FzUXVlcnkoKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5yZWxvYWQpIHtcbiAgICAgIHRoaXMuY29uZmlnLnJlbG9hZChkYXRhLCB0aGlzLl9maWx0ZXJJdGVtcy5nZXRTb3J0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRJdGVtKG5hbWUpOiBCYXNlSXRlbTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5pdGVtc1xuICAgICAgLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZmV0Y2hRdWVyeVBhcmFtcygpOiB2b2lkIHtcbiAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5mZXRjaFF1ZXJ5UGFyYW1zKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBjaGFuZ2UgY2FsbGJhY2sgYW5kIGFwcGx5IG5ldyBmaWx0ZXIgdmFsdWVzXG4gICAqL1xuICBwdWJsaWMgY2hhbmdlKCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9maWx0ZXJJdGVtcy52YWx1ZXNBc1F1ZXJ5KCk7XG4gICAgY29uc3Qgc29ydCA9IHRoaXMuX2ZpbHRlckl0ZW1zLmdldFNvcnQoKTtcblxuICAgIGNvbnN0IHNvcnRpbmdDaGFuZ2VkID0gKCghc29ydCB8fCAhdGhpcy5fc29ydCkgJiYgc29ydCAhPT0gdGhpcy5fc29ydClcbiAgICAgIHx8IChzb3J0ICYmIHRoaXMuX3NvcnQgJiYgIW9iamVjdHNBcmVFcXVhbHModGhpcy5fc29ydCwgc29ydCkpO1xuXG4gICAgaWYgKHNvcnRpbmdDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9zb3J0ID0gc29ydDtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLnNvcnRDaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5jb25maWcuc29ydENoYW5nZShkYXRhLCBzb3J0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcuY2hhbmdlKSB7XG4gICAgICB0aGlzLmNvbmZpZy5jaGFuZ2UoZGF0YSwgc29ydCk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlQ2hpcHNWaXNpYmlsaXR5KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGZpbHRlciBhY3Rpb25zIGNvbmZpZ1xuICAgKiBAcGFyYW0gYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZUFjdGlvbnMoYWN0aW9uczogRnNGaWx0ZXJBY3Rpb25bXSk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGlvbnMuaW5pdEFjdGlvbnMoYWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBcIkZpbHRlcnNcIiBidXR0b25cbiAgICovXG4gIHB1YmxpYyBzaG93RmlsdGVyc0J0bigpOiB2b2lkIHtcbiAgICB0aGlzLl9maWx0ZXJzQnRuVmlzaWJsZSQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIFwiRmlsdGVyc1wiIGJ1dHRvblxuICAgKi9cbiAgcHVibGljIGhpZGVGaWx0ZXJzQnRuKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZpbHRlcnNCdG5WaXNpYmxlJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IFwiS2V5d29yZFwiIGZpZWxkIGlmIGl0IHByZXNlbnRcbiAgICovXG4gIHB1YmxpYyBzaG93S2V5d29yZEZpZWxkKCk6IHZvaWQge1xuICAgIHRoaXMuX2tleXdvcmRWaXNpYmxlJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgXCJLZXl3b3JkXCIgZmllbGQgaWYgaXQgcHJlc2VudFxuICAgKi9cbiAgcHVibGljIGhpZGVLZXl3b3JkRmllbGQoKTogdm9pZCB7XG4gICAgdGhpcy5fa2V5d29yZFZpc2libGUkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdvIHRocm91Z2ggYWN0aW9ucyBhbmQgY2hlY2sgc2hvdygpIGNhbGxiYWNrIGFuZCB1cGRhdGUgdmlzaWJsZSBhY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQWN0aW9uc1Zpc2liaWxpdHkoKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aW9ucy51cGRhdGVBY3Rpb25zVmlzaWJpbGl0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdvIHRocm91Z2ggYWN0aW9ucyBhbmQgY2hlY2sgZGlzYWJsZWQoKSBjYWxsYmFjayBhbmQgdXBkYXRlIGRpc2FibGVkIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlRGlzYWJsZWRTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3Rpb25zLnVwZGF0ZURpc2FibGVkU3RhdGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRJdGVtcyhpdGVtczogSUZpbHRlckNvbmZpZ0l0ZW1bXSkge1xuICAgIHRoaXMuX2ZpbHRlckl0ZW1zLmRlc3Ryb3lJdGVtcygpO1xuXG4gICAgdGhpcy5jb25maWcuaXRlbXMgPSBpdGVtcztcbiAgICB0aGlzLl9maWx0ZXJJdGVtcy5zZXRDb25maWcodGhpcy5fY29uZmlnKTtcbiAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5pbml0SXRlbXMoKTtcbiAgICB0aGlzLl9zeW5jU2VhcmNoSW5wdXRXaXRoS2V5d29yZCgpO1xuICAgIHRoaXMuX2xpc3RlbktleXdvcmRJdGVtQ2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRGaWx0ZXJXaXRoQ29uZmlnKGNvbmZpZzogRmlsdGVyQ29uZmlnKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICB0aGlzLl9maWx0ZXJJdGVtcy5kZXN0cm95SXRlbXMoKTtcbiAgICB9XG5cbiAgICBjb25maWcgPSB7XG4gICAgICAuLi4odGhpcy5fZGVmYXVsdENvbmZpZyB8fCB7fSksXG4gICAgICAuLi5jb25maWcsXG4gICAgfTtcblxuICAgIHRoaXMuX2NvbmZpZyA9IG5ldyBGc0ZpbHRlckNvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX2FjdGlvbnMuaW5pdEFjdGlvbnModGhpcy5fY29uZmlnLmFjdGlvbnMpO1xuICAgIHRoaXMuX2ZpbHRlckl0ZW1zLnNldENvbmZpZyh0aGlzLl9jb25maWcpO1xuICAgIHRoaXMuX2V4dGVybmFsUGFyYW1zLnNldENvbmZpZyh0aGlzLl9jb25maWcpO1xuXG4gICAgdGhpcy5fc3luY1NlYXJjaElucHV0V2l0aEtleXdvcmQoKTtcblxuICAgIGlmICghIXRoaXMuY29uZmlnLnJlbG9hZFdoZW5Db25maWdDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmNoYW5nZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RlbktleXdvcmRJdGVtQ2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Rlc3Ryb3lGaWx0ZXJEcmF3ZXIoKSB7XG4gICAgdGhpcy5fZmlsdGVyT3ZlcmxheS5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlV2luZG93V2lkdGgoKSB7XG4gICAgdGhpcy53aW5kb3dEZXNrdG9wID0gd2luZG93LmlubmVyV2lkdGggPiAxMjAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuRXNjQnV0dG9uKCkge1xuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ2tleXVwJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gZXZlbnQuY29kZSA9PT0gJ0VzY2FwZScpLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmNsb3NlZCksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZVZpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbklucHV0S2V5RXZlbnRzKCkge1xuICAgIGlmICghdGhpcy5zZWFyY2hUZXh0SW5wdXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZyb21FdmVudCh0aGlzLnNlYXJjaFRleHRJbnB1dC5uYXRpdmVFbGVtZW50LCAna2V5ZG93bicpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlYm91bmNlVGltZSg1MDApLFxuICAgICAgICAgIGZpbHRlcigoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbJ0VudGVyJywgJ051bXBhZEVudGVyJywgJ0VzY2FwZSddLmluZGV4T2YoZXZlbnQuY29kZSkgPiAtMTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJJbnB1dEV2ZW50KGV2ZW50KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbldpbmRvd1Jlc2l6ZSgpIHtcbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMTAwKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVdpbmRvd1dpZHRoKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5JbnB1dENoYW5nZXMoKSB7XG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLnNlYXJjaFRleHQudmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlYm91bmNlVGltZSgyMDApLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgZmlsdGVyKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB0aGlzLl9maWx0ZXJJdGVtcy5rZXl3b3JkSXRlbT8ubW9kZWw7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleXdvcmRJdGVtID0gdGhpcy5fZmlsdGVySXRlbXMua2V5d29yZEl0ZW07XG5cbiAgICAgICAgICAgIGlmIChrZXl3b3JkSXRlbSAmJiBrZXl3b3JkSXRlbS52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAga2V5d29yZEl0ZW0ubW9kZWwgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNTZWFyY2hJbnB1dFdpdGhLZXl3b3JkKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleXdvcmRJdGVtID0gdGhpcy5fZmlsdGVySXRlbXMua2V5d29yZEl0ZW07XG4gICAgaWYgKGtleXdvcmRJdGVtKSB7XG4gICAgICB0aGlzLnNlYXJjaFRleHQuc2V0VmFsdWUoa2V5d29yZEl0ZW0ubW9kZWwpO1xuICAgICAgdGhpcy5zZWFyY2hQbGFjZWhvbGRlciA9IGtleXdvcmRJdGVtLmxhYmVsIGFzIHN0cmluZyB8fCAnU2VhcmNoJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5LZXl3b3JkSXRlbUNsZWFyKCkge1xuICAgIHRoaXMuX2ZpbHRlckl0ZW1zXG4gICAgICAua2V5d29yZEl0ZW1cbiAgICAgID8uY2xlYXIkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2ZpbHRlckl0ZW1zLmtleXdvcmRJdGVtLmRlc3Ryb3kkKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNlYXJjaFRleHQuc2V0VmFsdWUoJycpO1xuICAgICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbkludGVybmFsSXRlbXNDaGFuZ2UoKSB7XG4gICAgdGhpcy5fZmlsdGVySXRlbXNcbiAgICAgIC5pdGVtc0NoYW5nZSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2hhbmdlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRPdmVybGF5KCkge1xuICAgIHRoaXMuX2ZpbHRlck92ZXJsYXkuc2V0Q2xlYXJGbih0aGlzLmNsZWFyLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX2ZpbHRlck92ZXJsYXkuc2V0RG9uZUZuKHRoaXMuaGlkZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8vIFdlIG1heSBuZWVkIHNvbWUgdGltZSB0byByZWNpZXZlIGV4dGVybmFsIHBhcmFtcyBhbmQgYWZ0ZXIgdGhhdCByZWFkeSBjYW4gYmUgZW1pdHRlZFxuICBwcml2YXRlIF9saXN0ZW5XaGVuRmlsdGVyUmVhZHkoKSB7XG4gICAgY29tYmluZUxhdGVzdChcbiAgICBbXG4gICAgICB0aGlzLl9leHRlcm5hbFBhcmFtcy5wZW5kaW5nJCxcbiAgICAgIHRoaXMuaXRlbXNSZWFkeSQsXG4gICAgXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKFtwZW5kaW5nUGFyYW1zLCBpdGVtc1JlYWR5XSkgPT4gIXBlbmRpbmdQYXJhbXMgJiYgaXRlbXNSZWFkeSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgIHRoaXMuX3N5bmNTZWFyY2hJbnB1dFdpdGhLZXl3b3JkKCk7XG5cbiAgICAgICAgdGhpcy5yZWFkeS5lbWl0KCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUNoaXBzVmlzaWJpbGl0eSgpIHtcbiAgICBjb25zdCBoYXNGaWx0ZXJDaGlwcyA9IHRoaXMuX2ZpbHRlckl0ZW1zLml0ZW1zXG4gICAgICAuc29tZSgoaXRlbTogQmFzZUl0ZW08YW55PikgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5pc0NoaXBWaXNpYmxlO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9oYXNGaWx0ZXJDaGlwcyQubmV4dChoYXNGaWx0ZXJDaGlwcyk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItY29udGFpbmVyXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0tleXdvcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXIta2V5d29yZFwiPlxuICAgICAgICA8Zm9ybSBhdXRvY29tcGxldGU9XCJvZmZcIiByb2xlPVwicHJlc2VudGF0aW9uXCIgKm5nSWY9XCJrZXl3b3JkVmlzaWJsZSQgfCBhc3luY1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwibmV2ZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gbWF0UHJlZml4PlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRQcmVmaXg+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgI3NlYXJjaFRleHRJbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIG5hbWU9XCJmaWx0ZXItaW5wdXRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZmlsdGVySW5wdXRFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXItaW5wdXRcIj5cblxuICAgICAgICAgICAgPGEgbWF0U3VmZml4XG4gICAgICAgICAgICAgICpuZ0lmPVwic2VhcmNoVGV4dC52YWx1ZSAmJiBzaG93RmlsdGVySW5wdXQgJiYgY29uZmlnLmNsZWFyXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VhcmNoVGV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY2xlYXJcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYT5cblxuICAgICAgICAgICAgPGEgbWF0U3VmZml4XG4gICAgICAgICAgICAgIChjbGljayk9XCJyZWxvYWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicmVsb2FkXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb25maWcucmVsb2FkXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Zvcm0+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItYWN0aW9uc1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1Zpc2libGVJdGVtT3JTb3J0aW5nICYmIGZpbHRlcnNCdG5WaXNpYmxlJCB8IGFzeW5jXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJmaWx0ZXJzLWJ1dHRvblwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ21hdC1yYWlzZWQtYnV0dG9uJzogY29uZmlnLmJ1dHRvbi5zdHlsZSA9PSAncmFpc2VkJyxcbiAgICAgICAgICAgICdtYXQtYnV0dG9uJzogY29uZmlnLmJ1dHRvbi5zdHlsZSA9PSAnYmFzaWMnLFxuICAgICAgICAgICAgJ21hdC1pY29uLWJ1dHRvbic6IGNvbmZpZy5idXR0b24uc3R5bGUgPT0gJ2ljb24nXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVZpc2liaWxpdHlDbGljayghc2hvd0ZpbHRlck1lbnUsICRldmVudClcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtjb2xvcl09XCJjb25maWcuYnV0dG9uLmNvbG9yXCI+XG4gICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiY29uZmlnLmJ1dHRvbi5pY29uXCI+e3tjb25maWcuYnV0dG9uLmljb259fTwvbWF0LWljb24+XG4gICAgICAgICAge3sgY29uZmlnLmJ1dHRvbi5sYWJlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICBcbiAgICAgIDxmcy1maWx0ZXItYWN0aW9uc1xuICAgICAgICAqbmdJZj1cImFjdGlvbnNWaXNpYmxlJCB8IGFzeW5jXCJcbiAgICAgICAgW2FjdGlvbnNdPVwiYWN0aW9ucyQgfCBhc3luY1wiXG4gICAgICAgIFtrZWJhYkFjdGlvbnNdPVwibWVudUFjdGlvbnMkIHwgYXN5bmNcIj5cbiAgICAgIDwvZnMtZmlsdGVyLWFjdGlvbnM+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXN0YXR1cy1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXN0YXR1c1wiICpuZ0lmPVwic3RhdHVzQmFyXCI+XG4gICAgICA8c21hbGw+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0YXR1c0JhclwiPjwvbmctY29udGFpbmVyPjwvc21hbGw+XG4gICAgPC9kaXY+XG4gICAgPGZzLWZpbHRlci1jaGlwc1xuICAgICAgKm5nSWY9XCJjb25maWcuY2hpcHMgJiYgaGFzRmlsdGVyQ2hpcHMkIHwgYXN5bmNcIlxuICAgICAgY2xhc3M9XCJmaWx0ZXItY2hpcHNcIlxuICAgICAgW2ZpbHRlcnNdPVwiaXRlbXNcIj5cbiAgICA8L2ZzLWZpbHRlci1jaGlwcz5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj4iXX0=