@seniorsistemas/platform-components 5.3.3 → 6.0.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 (245) hide show
  1. package/esm2022/modules/advanced-filter/advanced-filter.module.mjs +75 -0
  2. package/esm2022/modules/advanced-filter/components/advanced-filter/advanced-filter.component.mjs +128 -0
  3. package/esm2022/modules/advanced-filter/components/form-filter/form-filter.component.mjs +651 -0
  4. package/esm2022/modules/advanced-filter/index.mjs +6 -0
  5. package/esm2022/modules/advanced-filter/locale/fallback.mjs +73 -0
  6. package/esm2022/modules/advanced-filter/models/context.mjs +2 -0
  7. package/esm2022/modules/advanced-filter/models/depends-on.mjs +2 -0
  8. package/esm2022/modules/advanced-filter/models/enum-item.mjs +2 -0
  9. package/esm2022/modules/advanced-filter/models/filter-type.mjs +14 -0
  10. package/esm2022/modules/advanced-filter/models/filter-value.mjs +2 -0
  11. package/esm2022/modules/advanced-filter/models/filter.mjs +41 -0
  12. package/esm2022/modules/advanced-filter/models/form-filter.mjs +28 -0
  13. package/esm2022/modules/advanced-filter/models/index.mjs +11 -0
  14. package/esm2022/modules/advanced-filter/models/scope.mjs +6 -0
  15. package/esm2022/modules/advanced-filter/models/search.mjs +2 -0
  16. package/esm2022/modules/advanced-filter/models/tab-view.mjs +18 -0
  17. package/esm2022/modules/advanced-filter/models/ticked-filter.mjs +2 -0
  18. package/esm2022/modules/advanced-filter/pipes/map-values.pipe.mjs +14 -0
  19. package/esm2022/modules/advanced-filter/pipes/translate.pipe.mjs +19 -0
  20. package/esm2022/modules/advanced-filter/services/advanced-filter.service.mjs +146 -0
  21. package/esm2022/modules/advanced-filter/services/calendar-options.service.mjs +77 -0
  22. package/esm2022/modules/advanced-filter/services/constants.mjs +6 -0
  23. package/esm2022/modules/advanced-filter/shared/constants.mjs +3 -0
  24. package/esm2022/modules/advanced-filter/utils/comparator.mjs +53 -0
  25. package/esm2022/modules/advanced-filter/utils/filter-id/index.mjs +8 -0
  26. package/esm2022/modules/advanced-filter/utils/filter-value/index.mjs +26 -0
  27. package/esm2022/modules/advanced-filter/utils/filterOperators.mjs +9 -0
  28. package/esm2022/modules/advanced-filter/utils/form-field/index.mjs +52 -0
  29. package/esm2022/modules/advanced-filter/utils/index.mjs +57 -0
  30. package/esm2022/modules/advanced-filter/utils/json-path.mjs +13 -0
  31. package/esm2022/modules/cyclic-json-interceptor/cyclic-json-interceptor.module.mjs +14 -0
  32. package/esm2022/modules/cyclic-json-interceptor/cyclic-json-interceptor.service.mjs +29 -0
  33. package/esm2022/modules/cyclic-json-interceptor/index.mjs +2 -0
  34. package/esm2022/modules/feature-toggle/constants/endpoint.constant.mjs +26 -0
  35. package/esm2022/modules/feature-toggle/feature-toggle.module.mjs +15 -0
  36. package/esm2022/modules/feature-toggle/feature-toggle.service.mjs +42 -0
  37. package/esm2022/modules/feature-toggle/index.mjs +4 -0
  38. package/esm2022/modules/feature-toggle/models/feature.mjs +2 -0
  39. package/esm2022/modules/http-interceptor/http-interceptor.module.mjs +16 -0
  40. package/esm2022/modules/http-interceptor/http-interceptor.service.mjs +42 -0
  41. package/esm2022/modules/http-interceptor/index.mjs +4 -0
  42. package/esm2022/modules/http-interceptor/rest-url.service.mjs +15 -0
  43. package/esm2022/modules/http-interceptor/x-services-url.service.mjs +18 -0
  44. package/esm2022/modules/permissions/permissions.config.mjs +17 -0
  45. package/esm2022/modules/permissions/permissions.module.mjs +43 -0
  46. package/esm2022/modules/permissions/permissions.service.mjs +169 -0
  47. package/esm2022/modules/spotlight/component/spotlight.component.mjs +274 -0
  48. package/esm2022/modules/spotlight/index.mjs +3 -0
  49. package/esm2022/modules/spotlight/locale/fallback.mjs +5 -0
  50. package/esm2022/modules/spotlight/models/display-type.enum.mjs +6 -0
  51. package/esm2022/modules/spotlight/models/index.mjs +10 -0
  52. package/esm2022/modules/spotlight/models/spotlight-control-list.interface.mjs +2 -0
  53. package/esm2022/modules/spotlight/models/spotlight-control.interface.mjs +11 -0
  54. package/esm2022/modules/spotlight/models/spotlight-notification.interface.mjs +2 -0
  55. package/esm2022/modules/spotlight/models/spotlight-screen-list.interface.mjs +2 -0
  56. package/esm2022/modules/spotlight/models/spotlight-screen.interface.mjs +2 -0
  57. package/esm2022/modules/spotlight/models/spotlight-status.enum.mjs +8 -0
  58. package/esm2022/modules/spotlight/models/spotlight-user.interface.mjs +2 -0
  59. package/esm2022/modules/spotlight/models/spotlight-users-list.interface.mjs +2 -0
  60. package/esm2022/modules/spotlight/models/spotlight.interface.mjs +2 -0
  61. package/esm2022/modules/spotlight/models/user-action.enum.mjs +7 -0
  62. package/esm2022/modules/spotlight/pipes/translate.pipe.mjs +19 -0
  63. package/esm2022/modules/spotlight/service/spotlight.service.mjs +34 -0
  64. package/esm2022/modules/spotlight/spotlight.module.mjs +53 -0
  65. package/esm2022/modules/translations/translations.module.mjs +192 -0
  66. package/esm2022/public-api.mjs +10 -0
  67. package/esm2022/seniorsistemas-platform-components.mjs +5 -0
  68. package/fesm2022/seniorsistemas-platform-components.mjs +2432 -0
  69. package/fesm2022/seniorsistemas-platform-components.mjs.map +1 -0
  70. package/index.d.ts +5 -0
  71. package/modules/advanced-filter/advanced-filter.module.d.ts +19 -0
  72. package/modules/advanced-filter/components/advanced-filter/advanced-filter.component.d.ts +4 -3
  73. package/modules/advanced-filter/components/form-filter/form-filter.component.d.ts +15 -12
  74. package/modules/advanced-filter/index.d.ts +1 -0
  75. package/modules/advanced-filter/models/tab-view.d.ts +1 -1
  76. package/modules/advanced-filter/pipes/map-values.pipe.d.ts +3 -0
  77. package/modules/advanced-filter/pipes/translate.pipe.d.ts +4 -3
  78. package/modules/advanced-filter/services/advanced-filter.service.d.ts +7 -3
  79. package/modules/advanced-filter/services/calendar-options.service.d.ts +4 -3
  80. package/modules/advanced-filter/services/constants.d.ts +4 -4
  81. package/modules/advanced-filter/utils/comparator.d.ts +1 -1
  82. package/modules/advanced-filter/utils/form-field/index.d.ts +1 -1
  83. package/modules/advanced-filter/utils/json-path.d.ts +1 -1
  84. package/modules/cyclic-json-interceptor/cyclic-json-interceptor.module.d.ts +4 -0
  85. package/modules/cyclic-json-interceptor/cyclic-json-interceptor.service.d.ts +3 -0
  86. package/modules/feature-toggle/feature-toggle.module.d.ts +5 -0
  87. package/modules/feature-toggle/feature-toggle.service.d.ts +4 -3
  88. package/modules/http-interceptor/http-interceptor.module.d.ts +4 -0
  89. package/modules/http-interceptor/http-interceptor.service.d.ts +3 -3
  90. package/modules/http-interceptor/rest-url.service.d.ts +3 -0
  91. package/modules/http-interceptor/x-services-url.service.d.ts +3 -0
  92. package/modules/permissions/permissions.config.d.ts +7 -1
  93. package/modules/permissions/permissions.module.d.ts +4 -0
  94. package/modules/permissions/permissions.service.d.ts +6 -12
  95. package/modules/spotlight/component/spotlight.component.d.ts +6 -7
  96. package/modules/spotlight/pipes/translate.pipe.d.ts +4 -3
  97. package/modules/spotlight/service/spotlight.service.d.ts +4 -3
  98. package/modules/spotlight/spotlight.module.d.ts +11 -0
  99. package/modules/translations/translations.module.d.ts +8 -3
  100. package/package.json +22 -19
  101. package/public-api.d.ts +1 -0
  102. package/bundles/seniorsistemas-platform-components.umd.js +0 -2745
  103. package/bundles/seniorsistemas-platform-components.umd.js.map +0 -1
  104. package/bundles/seniorsistemas-platform-components.umd.min.js +0 -17
  105. package/bundles/seniorsistemas-platform-components.umd.min.js.map +0 -1
  106. package/esm2015/modules/advanced-filter/advanced-filter.module.js +0 -47
  107. package/esm2015/modules/advanced-filter/components/advanced-filter/advanced-filter.component.js +0 -136
  108. package/esm2015/modules/advanced-filter/components/form-filter/form-filter.component.js +0 -578
  109. package/esm2015/modules/advanced-filter/index.js +0 -5
  110. package/esm2015/modules/advanced-filter/locale/fallback.js +0 -73
  111. package/esm2015/modules/advanced-filter/models/context.js +0 -1
  112. package/esm2015/modules/advanced-filter/models/depends-on.js +0 -1
  113. package/esm2015/modules/advanced-filter/models/enum-item.js +0 -1
  114. package/esm2015/modules/advanced-filter/models/filter-type.js +0 -14
  115. package/esm2015/modules/advanced-filter/models/filter-value.js +0 -1
  116. package/esm2015/modules/advanced-filter/models/filter.js +0 -23
  117. package/esm2015/modules/advanced-filter/models/form-filter.js +0 -19
  118. package/esm2015/modules/advanced-filter/models/index.js +0 -5
  119. package/esm2015/modules/advanced-filter/models/scope.js +0 -6
  120. package/esm2015/modules/advanced-filter/models/search.js +0 -1
  121. package/esm2015/modules/advanced-filter/models/tab-view.js +0 -18
  122. package/esm2015/modules/advanced-filter/models/ticked-filter.js +0 -1
  123. package/esm2015/modules/advanced-filter/pipes/map-values.pipe.js +0 -12
  124. package/esm2015/modules/advanced-filter/pipes/translate.pipe.js +0 -22
  125. package/esm2015/modules/advanced-filter/services/advanced-filter.service.js +0 -140
  126. package/esm2015/modules/advanced-filter/services/calendar-options.service.js +0 -81
  127. package/esm2015/modules/advanced-filter/services/constants.js +0 -6
  128. package/esm2015/modules/advanced-filter/shared/constants.js +0 -3
  129. package/esm2015/modules/advanced-filter/utils/comparator.js +0 -55
  130. package/esm2015/modules/advanced-filter/utils/filter-id/index.js +0 -8
  131. package/esm2015/modules/advanced-filter/utils/filter-value/index.js +0 -24
  132. package/esm2015/modules/advanced-filter/utils/filterOperators.js +0 -11
  133. package/esm2015/modules/advanced-filter/utils/form-field/index.js +0 -50
  134. package/esm2015/modules/advanced-filter/utils/index.js +0 -57
  135. package/esm2015/modules/advanced-filter/utils/json-path.js +0 -12
  136. package/esm2015/modules/cyclic-json-interceptor/cyclic-json-interceptor.module.js +0 -14
  137. package/esm2015/modules/cyclic-json-interceptor/cyclic-json-interceptor.service.js +0 -27
  138. package/esm2015/modules/cyclic-json-interceptor/index.js +0 -2
  139. package/esm2015/modules/feature-toggle/constants/endpoint.constant.js +0 -26
  140. package/esm2015/modules/feature-toggle/feature-toggle.module.js +0 -15
  141. package/esm2015/modules/feature-toggle/feature-toggle.service.js +0 -48
  142. package/esm2015/modules/feature-toggle/index.js +0 -3
  143. package/esm2015/modules/feature-toggle/models/feature.js +0 -1
  144. package/esm2015/modules/http-interceptor/http-interceptor.module.js +0 -16
  145. package/esm2015/modules/http-interceptor/http-interceptor.service.js +0 -47
  146. package/esm2015/modules/http-interceptor/index.js +0 -4
  147. package/esm2015/modules/http-interceptor/rest-url.service.js +0 -14
  148. package/esm2015/modules/http-interceptor/x-services-url.service.js +0 -17
  149. package/esm2015/modules/permissions/permissions.config.js +0 -11
  150. package/esm2015/modules/permissions/permissions.module.js +0 -42
  151. package/esm2015/modules/permissions/permissions.service.js +0 -196
  152. package/esm2015/modules/spotlight/component/spotlight.component.js +0 -274
  153. package/esm2015/modules/spotlight/index.js +0 -3
  154. package/esm2015/modules/spotlight/locale/fallback.js +0 -5
  155. package/esm2015/modules/spotlight/models/display-type.enum.js +0 -6
  156. package/esm2015/modules/spotlight/models/index.js +0 -4
  157. package/esm2015/modules/spotlight/models/spotlight-control-list.interface.js +0 -1
  158. package/esm2015/modules/spotlight/models/spotlight-control.interface.js +0 -3
  159. package/esm2015/modules/spotlight/models/spotlight-notification.interface.js +0 -1
  160. package/esm2015/modules/spotlight/models/spotlight-screen-list.interface.js +0 -1
  161. package/esm2015/modules/spotlight/models/spotlight-screen.interface.js +0 -1
  162. package/esm2015/modules/spotlight/models/spotlight-status.enum.js +0 -8
  163. package/esm2015/modules/spotlight/models/spotlight-user.interface.js +0 -1
  164. package/esm2015/modules/spotlight/models/spotlight-users-list.interface.js +0 -1
  165. package/esm2015/modules/spotlight/models/spotlight.interface.js +0 -1
  166. package/esm2015/modules/spotlight/models/user-action.enum.js +0 -7
  167. package/esm2015/modules/spotlight/pipes/translate.pipe.js +0 -22
  168. package/esm2015/modules/spotlight/service/spotlight.service.js +0 -38
  169. package/esm2015/modules/spotlight/spotlight.module.js +0 -37
  170. package/esm2015/modules/translations/translations.module.js +0 -182
  171. package/esm2015/public-api.js +0 -9
  172. package/esm2015/seniorsistemas-platform-components.js +0 -16
  173. package/esm5/modules/advanced-filter/advanced-filter.module.js +0 -54
  174. package/esm5/modules/advanced-filter/components/advanced-filter/advanced-filter.component.js +0 -144
  175. package/esm5/modules/advanced-filter/components/form-filter/form-filter.component.js +0 -626
  176. package/esm5/modules/advanced-filter/index.js +0 -5
  177. package/esm5/modules/advanced-filter/locale/fallback.js +0 -73
  178. package/esm5/modules/advanced-filter/models/context.js +0 -1
  179. package/esm5/modules/advanced-filter/models/depends-on.js +0 -1
  180. package/esm5/modules/advanced-filter/models/enum-item.js +0 -1
  181. package/esm5/modules/advanced-filter/models/filter-type.js +0 -14
  182. package/esm5/modules/advanced-filter/models/filter-value.js +0 -1
  183. package/esm5/modules/advanced-filter/models/filter.js +0 -25
  184. package/esm5/modules/advanced-filter/models/form-filter.js +0 -25
  185. package/esm5/modules/advanced-filter/models/index.js +0 -5
  186. package/esm5/modules/advanced-filter/models/scope.js +0 -6
  187. package/esm5/modules/advanced-filter/models/search.js +0 -1
  188. package/esm5/modules/advanced-filter/models/tab-view.js +0 -29
  189. package/esm5/modules/advanced-filter/models/ticked-filter.js +0 -1
  190. package/esm5/modules/advanced-filter/pipes/map-values.pipe.js +0 -16
  191. package/esm5/modules/advanced-filter/pipes/translate.pipe.js +0 -23
  192. package/esm5/modules/advanced-filter/services/advanced-filter.service.js +0 -151
  193. package/esm5/modules/advanced-filter/services/calendar-options.service.js +0 -82
  194. package/esm5/modules/advanced-filter/services/constants.js +0 -6
  195. package/esm5/modules/advanced-filter/shared/constants.js +0 -3
  196. package/esm5/modules/advanced-filter/utils/comparator.js +0 -55
  197. package/esm5/modules/advanced-filter/utils/filter-id/index.js +0 -8
  198. package/esm5/modules/advanced-filter/utils/filter-value/index.js +0 -25
  199. package/esm5/modules/advanced-filter/utils/filterOperators.js +0 -11
  200. package/esm5/modules/advanced-filter/utils/form-field/index.js +0 -52
  201. package/esm5/modules/advanced-filter/utils/index.js +0 -57
  202. package/esm5/modules/advanced-filter/utils/json-path.js +0 -12
  203. package/esm5/modules/cyclic-json-interceptor/cyclic-json-interceptor.module.js +0 -17
  204. package/esm5/modules/cyclic-json-interceptor/cyclic-json-interceptor.service.js +0 -30
  205. package/esm5/modules/cyclic-json-interceptor/index.js +0 -2
  206. package/esm5/modules/feature-toggle/constants/endpoint.constant.js +0 -27
  207. package/esm5/modules/feature-toggle/feature-toggle.module.js +0 -18
  208. package/esm5/modules/feature-toggle/feature-toggle.service.js +0 -51
  209. package/esm5/modules/feature-toggle/index.js +0 -3
  210. package/esm5/modules/feature-toggle/models/feature.js +0 -1
  211. package/esm5/modules/http-interceptor/http-interceptor.module.js +0 -19
  212. package/esm5/modules/http-interceptor/http-interceptor.service.js +0 -49
  213. package/esm5/modules/http-interceptor/index.js +0 -4
  214. package/esm5/modules/http-interceptor/rest-url.service.js +0 -17
  215. package/esm5/modules/http-interceptor/x-services-url.service.js +0 -20
  216. package/esm5/modules/permissions/permissions.config.js +0 -17
  217. package/esm5/modules/permissions/permissions.module.js +0 -46
  218. package/esm5/modules/permissions/permissions.service.js +0 -212
  219. package/esm5/modules/spotlight/component/spotlight.component.js +0 -300
  220. package/esm5/modules/spotlight/index.js +0 -3
  221. package/esm5/modules/spotlight/locale/fallback.js +0 -5
  222. package/esm5/modules/spotlight/models/display-type.enum.js +0 -6
  223. package/esm5/modules/spotlight/models/index.js +0 -4
  224. package/esm5/modules/spotlight/models/spotlight-control-list.interface.js +0 -1
  225. package/esm5/modules/spotlight/models/spotlight-control.interface.js +0 -7
  226. package/esm5/modules/spotlight/models/spotlight-notification.interface.js +0 -1
  227. package/esm5/modules/spotlight/models/spotlight-screen-list.interface.js +0 -1
  228. package/esm5/modules/spotlight/models/spotlight-screen.interface.js +0 -1
  229. package/esm5/modules/spotlight/models/spotlight-status.enum.js +0 -8
  230. package/esm5/modules/spotlight/models/spotlight-user.interface.js +0 -1
  231. package/esm5/modules/spotlight/models/spotlight-users-list.interface.js +0 -1
  232. package/esm5/modules/spotlight/models/spotlight.interface.js +0 -1
  233. package/esm5/modules/spotlight/models/user-action.enum.js +0 -7
  234. package/esm5/modules/spotlight/pipes/translate.pipe.js +0 -23
  235. package/esm5/modules/spotlight/service/spotlight.service.js +0 -39
  236. package/esm5/modules/spotlight/spotlight.module.js +0 -40
  237. package/esm5/modules/translations/translations.module.js +0 -226
  238. package/esm5/public-api.js +0 -9
  239. package/esm5/seniorsistemas-platform-components.js +0 -16
  240. package/fesm2015/seniorsistemas-platform-components.js +0 -2283
  241. package/fesm2015/seniorsistemas-platform-components.js.map +0 -1
  242. package/fesm5/seniorsistemas-platform-components.js +0 -2506
  243. package/fesm5/seniorsistemas-platform-components.js.map +0 -1
  244. package/seniorsistemas-platform-components.d.ts +0 -15
  245. package/seniorsistemas-platform-components.metadata.json +0 -1
@@ -1,626 +0,0 @@
1
- import { __assign, __decorate, __read, __spread } from "tslib";
2
- import { MessageService } from "primeng/api";
3
- import { ChangeDetectorRef, Component, EventEmitter, HostListener, Input, OnDestroy, OnInit, Output } from '@angular/core';
4
- import { BehaviorSubject, from, Subject } from 'rxjs';
5
- import { filter as rxFilter, map, mergeMap, takeUntil, tap } from 'rxjs/operators';
6
- import { FilterType, Scope } from '../../models';
7
- import { ContextTab, TabView } from '../../models/tab-view';
8
- import { AdvancedFilterService } from '../../services/advanced-filter.service';
9
- import { FormFilter } from '../../models/form-filter';
10
- import { filterOperators, fromJson, getFilterId, getSearchType, getTabId, jsonPath, parseFilterValue, toFilterFormat, toUserFormat } from '../../utils/index';
11
- import { createFormControl } from '../../utils/form-field';
12
- import { clone, equals } from 'ramda';
13
- import { compare, isSupportedType, isValidOperator } from '../../utils/comparator';
14
- import { AutocompleteField, CalendarField, RadioButtonField, CurrencyField, FieldType, NumberField, SelectField, TextField } from '@seniorsistemas/angular-components';
15
- import { searchDisplayName, searchKeyName } from '../../shared/constants';
16
- import { TranslateService } from '@ngx-translate/core';
17
- import { CalendarOptionsService } from '../../services/calendar-options.service';
18
- var TRANSLATE_PREFIX = 'platform.filter_service';
19
- var TOAST_LIFE = 5000;
20
- var FormFilterComponent = /** @class */ (function () {
21
- function FormFilterComponent(filterService, translate, messageService, calendarOptionsService, changeDetectorRef) {
22
- this.filterService = filterService;
23
- this.translate = translate;
24
- this.messageService = messageService;
25
- this.calendarOptionsService = calendarOptionsService;
26
- this.changeDetectorRef = changeDetectorRef;
27
- this.destroy$ = new Subject();
28
- this.contexts = [];
29
- this.formFilters = [];
30
- this.oldFormFilters = [];
31
- this.actualFormFilters = [];
32
- this.general = new TabView({ name: 'Geral' });
33
- this.totalFiltersActive = 0;
34
- this.isMobile = false;
35
- this.tabViewOrientation = 'left';
36
- this.error = false;
37
- this.errorMessages = {
38
- min: this.translate.instant(TRANSLATE_PREFIX + ".error_min_value"),
39
- max: this.translate.instant(TRANSLATE_PREFIX + ".error_max_value"),
40
- pattern: this.translate.instant(TRANSLATE_PREFIX + ".invalid_pattern")
41
- };
42
- this.showMessages = true;
43
- this.isModal = false;
44
- this.contextId = '';
45
- this.totalFiltersActiveOutput = new EventEmitter();
46
- this.errorOutput = new EventEmitter();
47
- this.showDialogOutput = new EventEmitter();
48
- this.closeModalOutput = new EventEmitter();
49
- }
50
- FormFilterComponent.prototype.onResizeWindow = function (event) {
51
- var innerWidth = event.target.innerWidth;
52
- this.isMobile = innerWidth <= 640;
53
- this.tabViewOrientation = this.isMobile ? 'top' : 'left';
54
- };
55
- FormFilterComponent.prototype.ngOnInit = function () {
56
- var _this = this;
57
- this.isMobile = innerWidth <= 640;
58
- this.tabViewOrientation = this.isMobile ? 'top' : 'left';
59
- this.subscribeContextsObservable();
60
- this.subscribeFiltersObservable();
61
- window.addEventListener('message', function (event) {
62
- var _a;
63
- var data = event.data;
64
- var message = data.message && data.message.split(':')[1];
65
- if (message === 'addContext') {
66
- (_a = _this.filterService).addContexts.apply(_a, __spread(data.payload));
67
- }
68
- });
69
- };
70
- FormFilterComponent.prototype.ngOnDestroy = function () {
71
- this.destroy$.next(true);
72
- };
73
- FormFilterComponent.prototype.hasChanges = function () {
74
- var _this = this;
75
- var keys = Object.keys(this.formFilters);
76
- var oldKeys = Object.keys(this.oldFormFilters);
77
- if (!oldKeys.length) {
78
- return true;
79
- }
80
- var filtered = keys.filter(function (key) {
81
- var currentValue = _this.formFilters[key].value;
82
- var oldValue = _this.oldFormFilters[key] && _this.oldFormFilters[key].value;
83
- return !equals(currentValue, oldValue);
84
- });
85
- return filtered.length > 0;
86
- };
87
- FormFilterComponent.prototype.onApplyFilters = function () {
88
- this.hasChanges() && this.closeModalOutput.emit();
89
- };
90
- FormFilterComponent.prototype.getFilters = function () {
91
- this.hasChanges() && this.filterService.tryAgain(this.contexts);
92
- };
93
- FormFilterComponent.prototype.applyFilters = function (showToast) {
94
- if (showToast === void 0) { showToast = false; }
95
- if (this.hasChanges()) {
96
- this.showDialogOutput.emit(false);
97
- this.counterUpdate();
98
- var filters = this.getFiltersValues(this.formFilters);
99
- this.filterService.saveTickedFilters(filters);
100
- }
101
- else if (showToast) {
102
- var message = {
103
- key: 'filterServiceToastKey',
104
- severity: 'info',
105
- life: TOAST_LIFE,
106
- detail: this.translate.instant(TRANSLATE_PREFIX + ".applied_filter_nochange", { activeFilters: this.totalFiltersActive })
107
- };
108
- this.sendMessage(message);
109
- }
110
- this.oldFormFilters = clone(this.formFilters);
111
- };
112
- FormFilterComponent.prototype.getDefaultValue = function (defaultValue, isMultiple) {
113
- if (defaultValue === undefined || (isMultiple && defaultValue[0] === '')) {
114
- return [];
115
- }
116
- return defaultValue;
117
- };
118
- FormFilterComponent.prototype.clearFilters = function () {
119
- var _this = this;
120
- var keys = Object.keys(this.formFilters);
121
- keys.forEach(function (key) { return _this.cleanFieldAndSetDefaultValue(key); });
122
- };
123
- FormFilterComponent.prototype.sendCloseMessage = function () {
124
- window.parent.postMessage({
125
- message: 'dashboard:close-modal',
126
- payload: {
127
- modalName: 'advanced-filter-1'
128
- }
129
- }, '*');
130
- };
131
- FormFilterComponent.prototype.sendMessage = function (message) {
132
- if (this.showMessages) {
133
- this.messageService.add(message);
134
- }
135
- else {
136
- window.parent.postMessage({
137
- message: 'dashboard:toastr',
138
- payload: {
139
- type: 'success',
140
- message: message.detail
141
- }
142
- }, '*');
143
- }
144
- };
145
- FormFilterComponent.prototype.saveFilters = function (forceSave) {
146
- var _this = this;
147
- if (forceSave === void 0) { forceSave = false; }
148
- var filters = this.parseToUserFilters(this.formFilters);
149
- var savedFilterSuccess = function () {
150
- if (!forceSave) {
151
- var message = {
152
- key: 'filterServiceToastKey',
153
- severity: 'info',
154
- life: TOAST_LIFE,
155
- detail: _this.translate.instant(TRANSLATE_PREFIX + ".saved_filters_success", { activeFilters: _this.totalFiltersActive })
156
- };
157
- _this.sendMessage(message);
158
- }
159
- _this.counterUpdate();
160
- };
161
- var savedFiltersError = function () {
162
- var message = {
163
- key: 'filterServiceToastKey',
164
- severity: 'error',
165
- life: TOAST_LIFE,
166
- detail: _this.translate.instant(TRANSLATE_PREFIX + ".saved_filters_error", { activeFilters: _this.totalFiltersActive })
167
- };
168
- _this.sendMessage(message);
169
- };
170
- this.filterService
171
- .saveFilters(filters)
172
- .subscribe(savedFilterSuccess, savedFiltersError);
173
- };
174
- FormFilterComponent.prototype.saveFiltersWithCallbackFunction = function (callbackFunction) {
175
- var filters = this.parseToUserFilters(this.formFilters);
176
- this.filterService
177
- .saveFilters(filters)
178
- .subscribe(callbackFunction);
179
- };
180
- FormFilterComponent.prototype.counterUpdate = function () {
181
- this.totalFiltersActive = this.countActiveFilters(this.tabs);
182
- this.totalFiltersActiveOutput.emit(this.totalFiltersActive);
183
- };
184
- FormFilterComponent.prototype.countActiveFilters = function (tabs) {
185
- var totalFiltersActive = 0;
186
- tabs.forEach(function (tabView) {
187
- var value = tabView.form.value;
188
- tabView.activeFilters = Object.keys(value).reduce(function (appliedFilters, key) {
189
- var filterValue = value[key];
190
- var isArray = Array.isArray(filterValue);
191
- var isValidArray = isArray && filterValue.length > 0;
192
- if (isValidArray || (!isArray && filterValue)) {
193
- appliedFilters++;
194
- }
195
- return appliedFilters;
196
- }, 0);
197
- totalFiltersActive += tabView.activeFilters;
198
- });
199
- return totalFiltersActive;
200
- };
201
- FormFilterComponent.prototype.parseToUserFilters = function (filters) {
202
- var ids = Object.keys(filters);
203
- return ids.reduce(function (all, filterId) {
204
- var _a = filters[filterId], type = _a.type, services = _a.services, name = _a.name, value = _a.value, domain = _a.domain, contexts = _a.contexts;
205
- var filterValue = toUserFormat(value, type);
206
- var values = services.map(function (service) { return ({ name: name, service: service, value: filterValue, domain: domain, contexts: contexts }); });
207
- return __spread(all, values);
208
- }, []);
209
- };
210
- FormFilterComponent.prototype.getFiltersValues = function (filters) {
211
- var ids = Object.keys(filters);
212
- return ids.reduce(function (all, filterId) {
213
- var _a = filters[filterId], type = _a.type, services = _a.services, name = _a.name, value = _a.value, domain = _a.domain;
214
- var filterValue = toFilterFormat(value, type);
215
- var values = services.map(function (service) { return ({ name: name, service: service, value: filterValue, domain: domain }); });
216
- return __spread(all, values);
217
- }, []);
218
- };
219
- FormFilterComponent.prototype.subscribeContextsObservable = function () {
220
- var _this = this;
221
- var contextsObserver = this.filterService.contextsObserver;
222
- contextsObserver.pipe(takeUntil(this.destroy$)).subscribe(function (contexts) { return (_this.contexts = contexts); });
223
- };
224
- FormFilterComponent.prototype.errorStateAction = function () {
225
- this.filterService.tryAgain(this.contexts);
226
- };
227
- FormFilterComponent.prototype.subscribeFiltersObservable = function () {
228
- var _this = this;
229
- var filtersObserver = this.filterService.filtersObserver;
230
- filtersObserver
231
- .pipe(takeUntil(this.destroy$))
232
- .subscribe(function (_a) {
233
- var filters = _a.filters, applyFilter = _a.applyFilter, error = _a.error, message = _a.message;
234
- _this.errorOutput.emit(error);
235
- _this.error = error;
236
- _this.errorState = message;
237
- if (!error) {
238
- _this.createForm(filters, applyFilter);
239
- }
240
- });
241
- };
242
- FormFilterComponent.prototype.createForm = function (filters, applyFilter) {
243
- this.tabs = this.createTabs(filters);
244
- this.counterUpdate();
245
- this.setDependencies(this.formFilters);
246
- this.createChildArray();
247
- if (filters.length > 0 && applyFilter) {
248
- this.applyFilters();
249
- }
250
- };
251
- FormFilterComponent.prototype.setDependencies = function (filters) {
252
- var _this = this;
253
- var names = Object.keys(filters);
254
- var dependencies = from(names).pipe(map(function (key) { return filters[key]; }), rxFilter(function (_a) {
255
- var dependsOn = _a.dependsOn;
256
- return dependsOn && dependsOn.length > 0;
257
- }), tap(function (_a) {
258
- var dependsOn = _a.dependsOn, domain = _a.domain, filterControl = _a.filterControl;
259
- var invalidFilters = dependsOn
260
- .filter(function (dep) { return dep.required; })
261
- .filter(function (dep) {
262
- var id = getFilterId(domain, dep.filterName);
263
- var formFilter = filters[id];
264
- var value = formFilter.value, type = formFilter.type;
265
- var comparator = dep.comparator;
266
- if (comparator && isValidOperator(comparator.operator) && isSupportedType(type)) {
267
- var fieldValue = parseFilterValue(value, type);
268
- return !compare(comparator.operator, comparator.value, fieldValue);
269
- }
270
- return dep.required ? !formFilter.value : formFilter.value;
271
- });
272
- if (invalidFilters.length > 0) {
273
- filterControl.disable();
274
- }
275
- }), map(function (_a) {
276
- var domain = _a.domain, dependsOn = _a.dependsOn, filterControl = _a.filterControl;
277
- return ({ domain: domain, dependsOn: dependsOn, filterControl: filterControl });
278
- }));
279
- dependencies.subscribe(function (_a) {
280
- var dependsOn = _a.dependsOn, domain = _a.domain, filterControl = _a.filterControl;
281
- return from(dependsOn)
282
- .pipe(rxFilter(function (dep) { return dep.required; }), map(function (_a) {
283
- var filterName = _a.filterName;
284
- return getFilterId(domain, filterName);
285
- }), map(function (filterId) { return filters[filterId]; }), mergeMap(function (formFilter) { return from(formFilter.valueChanges); }), map(function (val) {
286
- var comparation = dependsOn.every(function (dep) {
287
- var filterId = getFilterId(domain, dep.filterName);
288
- if (_this.formFilters[filterId]) {
289
- var type = _this.formFilters[filterId].type;
290
- var comparator = dep.comparator;
291
- if (comparator && isValidOperator(comparator.operator) && isSupportedType(type)) {
292
- var value = parseFilterValue(val, type);
293
- return compare(comparator.operator, comparator.value, value);
294
- }
295
- return true;
296
- }
297
- });
298
- return !_this.IsEmpty(val) && comparation ? 'enable' : 'disable';
299
- }))
300
- .subscribe(function (status) { return filterControl[status](); });
301
- });
302
- };
303
- FormFilterComponent.prototype.addGeneralField = function (filter) {
304
- var _this = this;
305
- var name = filter.name, domain = filter.domain, type = filter.type;
306
- var controlName = getFilterId(domain, name);
307
- var fieldControl = createFormControl(filter);
308
- fieldControl.valueChanges
309
- .pipe(takeUntil(this.destroy$), map(function (v) { return parseFilterValue(v, type); }), tap(function (value) { return (_this.formFilters[controlName].value = value); }))
310
- .subscribe(function (val) {
311
- return _this.tabs.forEach(function (tab) {
312
- var control = tab.form.controls[name];
313
- if (control && tab.domain === domain) {
314
- control.setValue(val, { emitEvent: false });
315
- }
316
- });
317
- });
318
- var newFilter = __assign(__assign({}, filter), { name: controlName });
319
- var newField = this.createField(newFilter);
320
- this.general.form.addControl(controlName, fieldControl);
321
- this.general.fields.push(newField);
322
- };
323
- /*
324
- * Verifica os contextos de cada filtro, caso todos os contextos foram informados:
325
- * @return true
326
- * Caso não tenha nenhum contexto, considera-se por padrão que é todos:
327
- * @return true
328
- */
329
- FormFilterComponent.prototype.containsAllContexts = function (myContexts) {
330
- if (!myContexts.length) {
331
- return true;
332
- }
333
- var allContexts = this.contexts.map(function (data) { return data.contextId; });
334
- return equals(myContexts.sort(), allContexts.sort());
335
- };
336
- /**
337
- *
338
- * @todo Refatorar. O método possui muitas responsabilidades
339
- *
340
- */
341
- FormFilterComponent.prototype.createTabs = function (filters) {
342
- var _this = this;
343
- return filters.reduce(function (tabs, filter) {
344
- var domain = filter.domain, services = filter.services, name = filter.name, type = filter.type, scope = filter.scope, contexts = filter.contexts, dependsOn = filter.dependsOn, value = filter.value, search = filter.search, defaultValue = filter.defaultValue;
345
- var isNotMultiple = search && getSearchType(search).output.maxSelectedItems === 1;
346
- var field = _this.createField(filter);
347
- var filterId = getFilterId(domain, name);
348
- var filterConfig = {
349
- domain: domain,
350
- contexts: contexts,
351
- services: services,
352
- name: name,
353
- dependsOn: dependsOn,
354
- value: fromJson(value, type, isNotMultiple),
355
- type: type,
356
- isMultiple: !isNotMultiple,
357
- defaultValue: fromJson(defaultValue, type, isNotMultiple)
358
- };
359
- _this.formFilters[filterId] = new FormFilter(filterConfig);
360
- var formFilter = _this.formFilters[filterId];
361
- if (scope === Scope.DOMAIN && _this.containsAllContexts(contexts)) {
362
- _this.addGeneralField(filter);
363
- }
364
- contexts.forEach(function (contextId) {
365
- if ((contextId === _this.contextId) || (_this.contextId === '')) {
366
- var tabId_1 = getTabId(domain, contextId);
367
- var fieldControl = createFormControl(filter);
368
- if (!tabs.has(tabId_1)) {
369
- var contextLabel = _this.contexts.find(function (context) { return context.contextId === contextId; }).contextLabel;
370
- var tab = new ContextTab({ domain: domain, name: contextLabel });
371
- tabs.set(tabId_1, tab);
372
- }
373
- fieldControl.valueChanges
374
- .pipe(takeUntil(_this.destroy$))
375
- .subscribe(function (val) { return _this.updateFilterValue(tabId_1, name, val, domain, type); });
376
- var contextTab = tabs.get(tabId_1);
377
- contextTab.fields.push(field);
378
- contextTab.form.addControl(filter.name, fieldControl);
379
- if (!formFilter.filterControl) {
380
- formFilter.filterControl = fieldControl;
381
- }
382
- }
383
- });
384
- return tabs;
385
- }, new Map());
386
- };
387
- FormFilterComponent.prototype.updateFilterValue = function (tabId, filterName, value, domain, type) {
388
- var _this = this;
389
- var controlOpts = { emitEvent: false };
390
- var fieldValue = parseFilterValue(value, type);
391
- var filterId = getFilterId(domain, filterName);
392
- var generalFieldControl = this.general.form.controls[filterId];
393
- this.tabs.forEach(function (_a, key) {
394
- var form = _a.form;
395
- var control = form.controls[filterName];
396
- if (tabId !== key && control) {
397
- control.setValue(value, controlOpts);
398
- }
399
- });
400
- var childs = this.formFilters[filterId].childs;
401
- childs && childs.forEach(function (child) { return _this.cleanFieldAndSetDefaultValue(child.filter.key); });
402
- generalFieldControl && generalFieldControl.setValue(value, controlOpts);
403
- this.formFilters[filterId].value = fieldValue;
404
- };
405
- FormFilterComponent.prototype.cleanFieldAndSetDefaultValue = function (key) {
406
- var _a = this.formFilters[key], isMultiple = _a.isMultiple, defaultValue = _a.defaultValue, filterControl = _a.filterControl, type = _a.type;
407
- var finalValue = this.getDefaultValue(defaultValue, isMultiple);
408
- if (filterControl) {
409
- if (type === 'DATE' || (type === 'SEARCH' && isMultiple)) {
410
- filterControl.setValue(finalValue);
411
- }
412
- if (type === 'INTEGER' || type === 'DOUBLE' || type === 'MONEY') {
413
- finalValue === '' ? filterControl.setValue(null) : filterControl.setValue(finalValue);
414
- }
415
- else {
416
- filterControl.setValue(finalValue, { onlySelf: true });
417
- }
418
- }
419
- };
420
- FormFilterComponent.prototype.createChildArray = function () {
421
- var _this = this;
422
- var keys = Object.keys(this.formFilters);
423
- keys.forEach(function (key) {
424
- var _a = _this.formFilters[key], dependsOn = _a.dependsOn, domain = _a.domain;
425
- dependsOn.forEach(function (field) {
426
- var filterId = getFilterId(domain, field.filterName);
427
- if (_this.formFilters[filterId]) {
428
- if (!_this.formFilters[filterId].childs) {
429
- _this.formFilters[filterId].childs = [];
430
- }
431
- _this.formFilters[filterId].childs.push({ filter: { key: key, required: field.required } });
432
- }
433
- });
434
- });
435
- };
436
- FormFilterComponent.prototype.createField = function (filter) {
437
- var _a;
438
- var _this = this;
439
- var name = filter.name, label = filter.label, enumItems = filter.enumItems, type = filter.type, mask = filter.mask;
440
- var translatedEnumItems = enumItems && enumItems.map(function (item) { return ({ label: _this.translate.instant(item.label), value: item.value }); });
441
- var field = { name: name, label: this.translate.instant(label), placeholder: '' };
442
- var creators = (_a = {},
443
- _a[FilterType.STRING] = function () { return new TextField(__assign(__assign({}, field), { mask: mask ? function () { return mask; } : null, type: FieldType.String })); },
444
- _a[FilterType.MONEY] = function () { return new CurrencyField(__assign(__assign({}, field), { type: FieldType.Money })); },
445
- _a[FilterType.BOOLEAN] = function () { return _this.createRadioButton(__assign({}, field)); },
446
- _a[FilterType.DATE] = function () { return _this.createCalendar(__assign(__assign({}, field), { type: FieldType.Date })); },
447
- _a[FilterType.DATETIME] = function () { return _this.createCalendar(__assign(__assign({}, field), { type: FieldType.DateTime })); },
448
- _a[FilterType.TIME] = function () { return _this.createCalendar(__assign(__assign({}, field), { type: FieldType.Time })); },
449
- _a[FilterType.ENUMERATION] = function () {
450
- return new SelectField(__assign(__assign({}, field), { placeholder: _this.translate.instant('platform.filter_service.select'), options: __spread(translatedEnumItems), type: FieldType.Enum }));
451
- },
452
- _a[FilterType.INTEGER] = function () {
453
- return new NumberField(__assign(__assign({}, field), { numberLocaleOptions: _this.optionsInteger(), mask: mask ? function () { return mask; } : null, type: FieldType.Integer }));
454
- },
455
- _a[FilterType.DOUBLE] = function () { return new CurrencyField(__assign(__assign({}, field), { type: FieldType.Double })); },
456
- _a[FilterType.SEARCH] = function () { return _this.createAutocompleteField(field, filter); },
457
- _a);
458
- return creators[type]();
459
- };
460
- FormFilterComponent.prototype.createRadioButton = function (field) {
461
- var options = [
462
- { label: this.translate.instant(TRANSLATE_PREFIX + ".yes"), value: true },
463
- { label: this.translate.instant(TRANSLATE_PREFIX + ".no"), value: false }
464
- ];
465
- return new RadioButtonField(__assign(__assign({}, field), { type: FieldType.Radio, options: options }));
466
- };
467
- FormFilterComponent.prototype.createCalendar = function (config) {
468
- var calendar = new CalendarField(config);
469
- calendar.calendarLocaleOptions = this.calendarOptionsService.getOptions();
470
- if (!this.isModal)
471
- calendar.appendTo = 'body';
472
- return calendar;
473
- };
474
- FormFilterComponent.prototype.createAutocompleteField = function (field, _a) {
475
- var _this = this;
476
- var dependsOn = _a.dependsOn, search = _a.search, domain = _a.domain, name = _a.name;
477
- var suggestionsObservable = new BehaviorSubject([]);
478
- var queryParam = getSearchType(search).input.queryParam;
479
- var _b = getSearchType(search).output, displayFields = _b.displayFields, keyFields = _b.keyFields, resultDataJsonPath = _b.resultDataJsonPath, displayFieldConcatToken = _b.displayFieldConcatToken, maxSelectedItems = _b.maxSelectedItems;
480
- var filterId = getFilterId(domain, name);
481
- var suggestionsError = function (messageError) {
482
- var messageDetail = messageError ? messageError : _this.translate.instant(TRANSLATE_PREFIX + ".find_suggestions_error", { activeFilters: _this.totalFiltersActive });
483
- var message = {
484
- key: 'filterServiceToastKey',
485
- severity: 'error',
486
- life: TOAST_LIFE,
487
- detail: messageDetail
488
- };
489
- _this.sendMessage(message);
490
- };
491
- var onSearch = function (val) {
492
- var _a;
493
- var params = (_a = {}, _a[queryParam] = val, _a);
494
- dependsOn && Object.assign(params, _this.getDependenciesValues(dependsOn, domain));
495
- var searchUrl = search && search.type === 'ENTITY'
496
- ? _this.getEntitySearchUrl(search.entitySearch.input, val, dependsOn)
497
- : getSearchType(search).input.url;
498
- _this.filterService
499
- .searchFieldSuggestions(searchUrl, params, search.type)
500
- .pipe(map(function (response) { return jsonPath(response, resultDataJsonPath); }), map(function (suggestions) { return _this.addSuggestionFields(suggestions, displayFields, keyFields, displayFieldConcatToken, filterId); }))
501
- .subscribe(function (result) {
502
- suggestionsObservable.next(result);
503
- _this.changeDetectorRef.detectChanges();
504
- }, function (error) {
505
- var messageError = undefined;
506
- if (error && error.error.message)
507
- messageError = error.error.message;
508
- suggestionsError(messageError);
509
- });
510
- };
511
- return new AutocompleteField(__assign(__assign({}, field), { onSearch: onSearch, appendTo: 'body', suggestionsObservable: suggestionsObservable, displayField: searchDisplayName, dataKey: searchKeyName, multiple: maxSelectedItems > 1, size: { lg: 12, md: 12, xl: 12 }, emptyMessage: this.translate.instant(TRANSLATE_PREFIX + ".search_empty_message") }));
512
- };
513
- FormFilterComponent.prototype.getEntitySearchUrl = function (search, value, dependsOn) {
514
- var _this = this;
515
- var attributes = search.attributes, domainName = search.domainName, entityName = search.entityName, serviceName = search.serviceName;
516
- var url = domainName + "/" + serviceName + "/entities/" + entityName + "/?filter=";
517
- var filters = attributes.map(function (attr) { return filterOperators[attr.comparator](attr.name, value); });
518
- dependsOn &&
519
- dependsOn.forEach(function (obj) {
520
- var filterId = getFilterId(domainName, obj.filterName);
521
- var fieldValue = _this.formFilters[filterId].value[searchKeyName];
522
- filters.push(obj.entityAttribute + " eq '" + fieldValue + "'");
523
- });
524
- // O regex apenas seleciona as virgulas ignorando as que estiverem dentro do ()
525
- return url.concat(filters).replace(/[,]+(?![^(]*[)])/g, " " + search.operator + " ");
526
- };
527
- FormFilterComponent.prototype.addSuggestionFields = function (suggestions, displayFields, keyFields, separator, filterId) {
528
- var _this = this;
529
- var addValue = function (acc, value, token) { return (acc ? "" + acc + token + value : value); };
530
- var result = suggestions.map(function (suggestion) {
531
- var _a;
532
- return (__assign(__assign({}, suggestion), (_a = {}, _a[searchDisplayName] = displayFields.reduce(function (value, display) {
533
- return addValue(value, _this.translate.instant(suggestion[display]), separator);
534
- }, ''), _a[searchKeyName] = keyFields.reduce(function (value, key) { return addValue(value, suggestion[key], ', '); }, ''), _a)));
535
- });
536
- this.formFilters[filterId].invalidValue = result.length === 0;
537
- return result.filter(function (item) {
538
- var value = _this.formFilters[filterId].value;
539
- if (Array.isArray(value)) {
540
- var index = value.findIndex(function (i) { return i.$$__keyValue__ === item.$$__keyValue__; });
541
- if (index === -1) {
542
- return item;
543
- }
544
- }
545
- else {
546
- return item;
547
- }
548
- });
549
- };
550
- FormFilterComponent.prototype.getDependenciesValues = function (dependencies, domain) {
551
- var _this = this;
552
- return dependencies.reduce(function (params, _a) {
553
- var filterName = _a.filterName;
554
- var filterId = getFilterId(domain, filterName);
555
- if (_this.formFilters[filterId]) {
556
- var _b = _this.formFilters[filterId], value = _b.value, type = _b.type;
557
- if (type === 'ENUMERATION') {
558
- params[filterName] = value;
559
- }
560
- else {
561
- if (Array.isArray(value)) {
562
- params[filterName] = value.map(function (arr) { return arr[searchKeyName]; });
563
- }
564
- else {
565
- params[filterName] = value ? value[searchKeyName] : [''];
566
- }
567
- }
568
- _this.IsEmpty(params[filterName]) && delete params[filterName];
569
- return params;
570
- }
571
- }, {});
572
- };
573
- /*
574
- * Verifica se o valor informado é falso, em arrays, é verificado cada item
575
- */
576
- FormFilterComponent.prototype.IsEmpty = function (value) {
577
- return Array.isArray(value) ? value.every(function (data) { return !data; }) : !value;
578
- };
579
- /**
580
- * Return format to specify for integer type field
581
- */
582
- FormFilterComponent.prototype.optionsInteger = function () {
583
- return { currencySymbol: '', decimalSeparator: '', thousandsSeparator: '' };
584
- };
585
- FormFilterComponent.ctorParameters = function () { return [
586
- { type: AdvancedFilterService },
587
- { type: TranslateService },
588
- { type: MessageService },
589
- { type: CalendarOptionsService },
590
- { type: ChangeDetectorRef }
591
- ]; };
592
- __decorate([
593
- Input()
594
- ], FormFilterComponent.prototype, "showMessages", void 0);
595
- __decorate([
596
- Input()
597
- ], FormFilterComponent.prototype, "isModal", void 0);
598
- __decorate([
599
- Input()
600
- ], FormFilterComponent.prototype, "contextId", void 0);
601
- __decorate([
602
- Output()
603
- ], FormFilterComponent.prototype, "totalFiltersActiveOutput", void 0);
604
- __decorate([
605
- Output()
606
- ], FormFilterComponent.prototype, "errorOutput", void 0);
607
- __decorate([
608
- Output()
609
- ], FormFilterComponent.prototype, "showDialogOutput", void 0);
610
- __decorate([
611
- Output()
612
- ], FormFilterComponent.prototype, "closeModalOutput", void 0);
613
- __decorate([
614
- HostListener('window:resize', ['$event'])
615
- ], FormFilterComponent.prototype, "onResizeWindow", null);
616
- FormFilterComponent = __decorate([
617
- Component({
618
- selector: 's-app-form-filter',
619
- template: "<s-empty-state\n *ngIf=\"error\"\n iconClass=\"fa fa-exclamation-triangle\"\n title=\"{{ errorState?.status }} - {{ errorState?.statusText }}\"\n (primaryAction)=\"errorStateAction()\"\n [primaryActionLabel]=\"translate.instant('platform.filter_service.try')\"\n [description]=\"translate.instant('platform.filter_service.error_state')\"\n></s-empty-state>\n\n<div *ngIf=\"!error\">\n <p-tabView *ngIf=\"tabs && tabs.size > 1\" [orientation]=\"tabViewOrientation\" selected=\"false\">\n <p-tabPanel *ngIf=\"general.fields.length\" [selected]=\"false\" [header]=\"general.name\">\n <s-dynamic-form [errorMessages]=\"errorMessages\" [fields]=\"general.fields\" [form]=\"general.form\"></s-dynamic-form>\n </p-tabPanel>\n\n <p-tabPanel *ngFor=\"let tab of (tabs | mapValues); let i = index\" [selected]=\"i === 0\" [header]=\"tab.label\">\n <s-dynamic-form [errorMessages]=\"errorMessages\" [fields]=\"tab.fields\" [form]=\"tab.form\"></s-dynamic-form>\n </p-tabPanel>\n </p-tabView>\n\n <div *ngIf=\"tabs && tabs.size === 1\">\n <s-dynamic-form\n *ngFor=\"let tab of (tabs | mapValues)\"\n [errorMessages]=\"errorMessages\"\n [fields]=\"tab.fields\"\n [form]=\"tab.form\"\n ></s-dynamic-form>\n </div>\n</div>\n",
620
- styles: [".filter-dialog{width:800px;top:100px}.filter-dialog>.ui-dialog-content{height:300px;padding:10px!important}@media (min-width:641px) and (max-width:1024px){.filter-dialog{width:75%}.filter-dialog>.ui-dialog-content{height:300px}}@media only screen and (min-device-width:481px) and (max-device-width:1024px) and (orientation:portrait){.filter-dialog{width:75%}.filter-dialog>.ui-dialog-content{height:90%}}@media (min-width:320px) and (max-width:640px){.filter-dialog{width:95%;left:0;top:0;opacity:1;margin:auto;height:93%}.filter-dialog>.ui-dialog-content{height:85%}}@media (min-width:320px) and (max-width:640px) and (max-width:360px){.filter-dialog button{padding:0!important}.filter-dialog>.ui-dialog-content{height:81%}}"]
621
- })
622
- ], FormFilterComponent);
623
- return FormFilterComponent;
624
- }());
625
- export { FormFilterComponent };
626
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNlbmlvcnNpc3RlbWFzL3BsYXRmb3JtLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJtb2R1bGVzL2FkdmFuY2VkLWZpbHRlci9jb21wb25lbnRzL2Zvcm0tZmlsdGVyL2Zvcm0tZmlsdGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRixPQUFPLEVBQTJELFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUcsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUNMLGVBQWUsRUFDZixRQUFRLEVBQ1IsV0FBVyxFQUNYLGFBQWEsRUFDYixRQUFRLEVBQ1IsUUFBUSxFQUNSLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsWUFBWSxFQUNiLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUFF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fSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gXCJwcmltZW5nL2FwaVwiO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb20sIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciBhcyByeEZpbHRlciwgbWFwLCBtZXJnZU1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IENvbnRleHQsIERlcGVuZHNPbiwgRW50aXR5U2VhcmNoSW5wdXQsIEVudW1JdGVtLCBGaWx0ZXIsIEZpbHRlclR5cGUsIFNjb3BlIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IENvbnRleHRUYWIsIFRhYlZpZXcgfSBmcm9tICcuLi8uLi9tb2RlbHMvdGFiLXZpZXcnO1xuaW1wb3J0IHsgQWR2YW5jZWRGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWR2YW5jZWQtZmlsdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUZpbHRlciB9IGZyb20gJy4uLy4uL21vZGVscy9mb3JtLWZpbHRlcic7XG5pbXBvcnQge1xuICBmaWx0ZXJPcGVyYXRvcnMsXG4gIGZyb21Kc29uLFxuICBnZXRGaWx0ZXJJZCxcbiAgZ2V0U2VhcmNoVHlwZSxcbiAgZ2V0VGFiSWQsXG4gIGpzb25QYXRoLFxuICBwYXJzZUZpbHRlclZhbHVlLFxuICB0b0ZpbHRlckZvcm1hdCxcbiAgdG9Vc2VyRm9ybWF0XG59IGZyb20gJy4uLy4uL3V0aWxzL2luZGV4JztcbmltcG9ydCB7IGNyZWF0ZUZvcm1Db250cm9sIH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBjbG9uZSwgZXF1YWxzIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgY29tcGFyZSwgaXNTdXBwb3J0ZWRUeXBlLCBpc1ZhbGlkT3BlcmF0b3IgfSBmcm9tICcuLi8uLi91dGlscy9jb21wYXJhdG9yJztcblxuaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlRmllbGQsXG4gIENhbGVuZGFyRmllbGQsXG4gIFJhZGlvQnV0dG9uRmllbGQsXG4gIEN1cnJlbmN5RmllbGQsXG4gIEZpZWxkLFxuICBGaWVsZENvbmZpZyxcbiAgRmllbGRUeXBlLFxuICBOdW1iZXJGaWVsZCxcbiAgU2VsZWN0RmllbGQsXG4gIFRleHRGaWVsZCxcbiAgUmF0aW9uQnV0dG9uT3B0aW9uLFxuICBDYWxlbmRhckZpZWxkQ29uZmlnXG59IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQgeyBzZWFyY2hEaXNwbGF5TmFtZSwgc2VhcmNoS2V5TmFtZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9jb25zdGFudHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IENhbGVuZGFyT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYWxlbmRhci1vcHRpb25zLnNlcnZpY2UnO1xuXG5jb25zdCBUUkFOU0xBVEVfUFJFRklYID0gJ3BsYXRmb3JtLmZpbHRlcl9zZXJ2aWNlJztcbmNvbnN0IFRPQVNUX0xJRkUgPSA1MDAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzLWFwcC1mb3JtLWZpbHRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zvcm0tZmlsdGVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuICBlcnJvclN0YXRlOiBIdHRwRXJyb3JSZXNwb25zZTtcbiAgdGFiczogTWFwPHN0cmluZywgQ29udGV4dFRhYj47XG4gIGNvbnRleHRzOiBDb250ZXh0W10gPSBbXTtcbiAgZm9ybUZpbHRlcnM6IEZvcm1GaWx0ZXJbXSA9IFtdO1xuICBvbGRGb3JtRmlsdGVyczogYW55W10gPSBbXTtcbiAgYWN0dWFsRm9ybUZpbHRlcnM6IGFueVtdID0gW107XG4gIGdlbmVyYWwgPSBuZXcgVGFiVmlldyh7IG5hbWU6ICdHZXJhbCcgfSk7XG4gIHRvdGFsRmlsdGVyc0FjdGl2ZSA9IDA7XG4gIGlzTW9iaWxlID0gZmFsc2U7XG4gIHRhYlZpZXdPcmllbnRhdGlvbiA9ICdsZWZ0JztcbiAgZXJyb3IgPSBmYWxzZTtcblxuICBlcnJvck1lc3NhZ2VzID0ge1xuICAgIG1pbjogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtUUkFOU0xBVEVfUFJFRklYfS5lcnJvcl9taW5fdmFsdWVgKSxcbiAgICBtYXg6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7VFJBTlNMQVRFX1BSRUZJWH0uZXJyb3JfbWF4X3ZhbHVlYCksXG4gICAgcGF0dGVybjogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtUUkFOU0xBVEVfUFJFRklYfS5pbnZhbGlkX3BhdHRlcm5gKVxuICB9O1xuXG4gIEBJbnB1dCgpIHNob3dNZXNzYWdlcyA9IHRydWU7XG4gIEBJbnB1dCgpIGlzTW9kYWwgPSBmYWxzZTtcbiAgQElucHV0KCkgY29udGV4dElkID0gJyc7XG5cblxuICBAT3V0cHV0KCkgdG90YWxGaWx0ZXJzQWN0aXZlT3V0cHV0ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBlcnJvck91dHB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIHNob3dEaWFsb2dPdXRwdXQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBjbG9zZU1vZGFsT3V0cHV0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmlsdGVyU2VydmljZTogQWR2YW5jZWRGaWx0ZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjYWxlbmRhck9wdGlvbnNTZXJ2aWNlOiBDYWxlbmRhck9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmXG4gICkgeyB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gIG9uUmVzaXplV2luZG93KGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7IGlubmVyV2lkdGggfSA9IGV2ZW50LnRhcmdldDtcbiAgICB0aGlzLmlzTW9iaWxlID0gaW5uZXJXaWR0aCA8PSA2NDA7XG4gICAgdGhpcy50YWJWaWV3T3JpZW50YXRpb24gPSB0aGlzLmlzTW9iaWxlID8gJ3RvcCcgOiAnbGVmdCc7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmlzTW9iaWxlID0gaW5uZXJXaWR0aCA8PSA2NDA7XG4gICAgdGhpcy50YWJWaWV3T3JpZW50YXRpb24gPSB0aGlzLmlzTW9iaWxlID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgdGhpcy5zdWJzY3JpYmVDb250ZXh0c09ic2VydmFibGUoKTtcbiAgICB0aGlzLnN1YnNjcmliZUZpbHRlcnNPYnNlcnZhYmxlKCk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGRhdGEubWVzc2FnZSAmJiBkYXRhLm1lc3NhZ2Uuc3BsaXQoJzonKVsxXTtcbiAgICAgIGlmIChtZXNzYWdlID09PSAnYWRkQ29udGV4dCcpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmFkZENvbnRleHRzKC4uLmRhdGEucGF5bG9hZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBoYXNDaGFuZ2VzKCkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmZvcm1GaWx0ZXJzKTtcbiAgICBjb25zdCBvbGRLZXlzID0gT2JqZWN0LmtleXModGhpcy5vbGRGb3JtRmlsdGVycyk7XG4gICAgaWYgKCFvbGRLZXlzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlcmVkID0ga2V5cy5maWx0ZXIoa2V5ID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZm9ybUZpbHRlcnNba2V5XS52YWx1ZTtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5vbGRGb3JtRmlsdGVyc1trZXldICYmIHRoaXMub2xkRm9ybUZpbHRlcnNba2V5XS52YWx1ZTtcbiAgICAgIHJldHVybiAhZXF1YWxzKGN1cnJlbnRWYWx1ZSwgb2xkVmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJlZC5sZW5ndGggPiAwO1xuICB9XG5cbiAgb25BcHBseUZpbHRlcnMoKSB7XG4gICAgdGhpcy5oYXNDaGFuZ2VzKCkgJiYgdGhpcy5jbG9zZU1vZGFsT3V0cHV0LmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzKCkge1xuICAgIHRoaXMuaGFzQ2hhbmdlcygpICYmIHRoaXMuZmlsdGVyU2VydmljZS50cnlBZ2Fpbih0aGlzLmNvbnRleHRzKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVycyhzaG93VG9hc3QgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmhhc0NoYW5nZXMoKSkge1xuICAgICAgdGhpcy5zaG93RGlhbG9nT3V0cHV0LmVtaXQoZmFsc2UpO1xuICAgICAgdGhpcy5jb3VudGVyVXBkYXRlKCk7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5nZXRGaWx0ZXJzVmFsdWVzKHRoaXMuZm9ybUZpbHRlcnMpO1xuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnNhdmVUaWNrZWRGaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0gZWxzZSBpZiAoc2hvd1RvYXN0KSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBrZXk6ICdmaWx0ZXJTZXJ2aWNlVG9hc3RLZXknLFxuICAgICAgICBzZXZlcml0eTogJ2luZm8nLFxuICAgICAgICBsaWZlOiBUT0FTVF9MSUZFLFxuICAgICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7VFJBTlNMQVRFX1BSRUZJWH0uYXBwbGllZF9maWx0ZXJfbm9jaGFuZ2VgLCB7IGFjdGl2ZUZpbHRlcnM6IHRoaXMudG90YWxGaWx0ZXJzQWN0aXZlIH0pXG4gICAgICB9O1xuICAgICAgdGhpcy5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG4gICAgdGhpcy5vbGRGb3JtRmlsdGVycyA9IGNsb25lKHRoaXMuZm9ybUZpbHRlcnMpO1xuICB9XG5cbiAgZ2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZTogYW55LCBpc011bHRpcGxlOiBib29sZWFuKSB7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IChpc011bHRpcGxlICYmIGRlZmF1bHRWYWx1ZVswXSA9PT0gJycpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIGNsZWFyRmlsdGVycygpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5mb3JtRmlsdGVycyk7XG4gICAga2V5cy5mb3JFYWNoKGtleSA9PiB0aGlzLmNsZWFuRmllbGRBbmRTZXREZWZhdWx0VmFsdWUoa2V5KSk7XG4gIH1cblxuICBzZW5kQ2xvc2VNZXNzYWdlKCkge1xuICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoXG4gICAgICB7XG4gICAgICAgIG1lc3NhZ2U6ICdkYXNoYm9hcmQ6Y2xvc2UtbW9kYWwnLFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgbW9kYWxOYW1lOiAnYWR2YW5jZWQtZmlsdGVyLTEnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnKidcbiAgICApO1xuICB9XG5cbiAgc2VuZE1lc3NhZ2UobWVzc2FnZTogTWVzc2FnZSkge1xuICAgIGlmICh0aGlzLnNob3dNZXNzYWdlcykge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiAnZGFzaGJvYXJkOnRvYXN0cicsXG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZS5kZXRhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICcqJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzYXZlRmlsdGVycyhmb3JjZVNhdmUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLnBhcnNlVG9Vc2VyRmlsdGVycyh0aGlzLmZvcm1GaWx0ZXJzKTtcbiAgICBjb25zdCBzYXZlZEZpbHRlclN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICBpZiAoIWZvcmNlU2F2ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgIGtleTogJ2ZpbHRlclNlcnZpY2VUb2FzdEtleScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdpbmZvJyxcbiAgICAgICAgICBsaWZlOiBUT0FTVF9MSUZFLFxuICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtUUkFOU0xBVEVfUFJFRklYfS5zYXZlZF9maWx0ZXJzX3N1Y2Nlc3NgLCB7IGFjdGl2ZUZpbHRlcnM6IHRoaXMudG90YWxGaWx0ZXJzQWN0aXZlIH0pXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY291bnRlclVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBzYXZlZEZpbHRlcnNFcnJvciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGtleTogJ2ZpbHRlclNlcnZpY2VUb2FzdEtleScsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICBsaWZlOiBUT0FTVF9MSUZFLFxuICAgICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7VFJBTlNMQVRFX1BSRUZJWH0uc2F2ZWRfZmlsdGVyc19lcnJvcmAsIHsgYWN0aXZlRmlsdGVyczogdGhpcy50b3RhbEZpbHRlcnNBY3RpdmUgfSlcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZmlsdGVyU2VydmljZVxuICAgICAgLnNhdmVGaWx0ZXJzKGZpbHRlcnMpXG4gICAgICAuc3Vic2NyaWJlKHNhdmVkRmlsdGVyU3VjY2Vzcywgc2F2ZWRGaWx0ZXJzRXJyb3IpO1xuICB9XG5cbiAgc2F2ZUZpbHRlcnNXaXRoQ2FsbGJhY2tGdW5jdGlvbihjYWxsYmFja0Z1bmN0aW9uOiBhbnkpIHtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5wYXJzZVRvVXNlckZpbHRlcnModGhpcy5mb3JtRmlsdGVycyk7XG5cbiAgICB0aGlzLmZpbHRlclNlcnZpY2VcbiAgICAgIC5zYXZlRmlsdGVycyhmaWx0ZXJzKVxuICAgICAgLnN1YnNjcmliZShjYWxsYmFja0Z1bmN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgY291bnRlclVwZGF0ZSgpIHtcbiAgICB0aGlzLnRvdGFsRmlsdGVyc0FjdGl2ZSA9IHRoaXMuY291bnRBY3RpdmVGaWx0ZXJzKHRoaXMudGFicyk7XG4gICAgdGhpcy50b3RhbEZpbHRlcnNBY3RpdmVPdXRwdXQuZW1pdCh0aGlzLnRvdGFsRmlsdGVyc0FjdGl2ZSk7XG4gIH1cblxuICBwcml2YXRlIGNvdW50QWN0aXZlRmlsdGVycyh0YWJzOiBNYXA8c3RyaW5nLCBDb250ZXh0VGFiPikge1xuICAgIGxldCB0b3RhbEZpbHRlcnNBY3RpdmUgPSAwO1xuXG4gICAgdGFicy5mb3JFYWNoKHRhYlZpZXcgPT4ge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGFiVmlldy5mb3JtO1xuICAgICAgdGFiVmlldy5hY3RpdmVGaWx0ZXJzID0gT2JqZWN0LmtleXModmFsdWUpLnJlZHVjZSgoYXBwbGllZEZpbHRlcnMsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGZpbHRlclZhbHVlKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZEFycmF5ID0gaXNBcnJheSAmJiBmaWx0ZXJWYWx1ZS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmIChpc1ZhbGlkQXJyYXkgfHwgKCFpc0FycmF5ICYmIGZpbHRlclZhbHVlKSkge1xuICAgICAgICAgIGFwcGxpZWRGaWx0ZXJzKys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXBwbGllZEZpbHRlcnM7XG4gICAgICB9LCAwKTtcbiAgICAgIHRvdGFsRmlsdGVyc0FjdGl2ZSArPSB0YWJWaWV3LmFjdGl2ZUZpbHRlcnM7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdG90YWxGaWx0ZXJzQWN0aXZlO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVRvVXNlckZpbHRlcnMoZmlsdGVyczogRm9ybUZpbHRlcltdKSB7XG4gICAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMoZmlsdGVycyk7XG5cbiAgICByZXR1cm4gaWRzLnJlZHVjZSgoYWxsLCBmaWx0ZXJJZCkgPT4ge1xuICAgICAgY29uc3QgeyB0eXBlLCBzZXJ2aWNlcywgbmFtZSwgdmFsdWUsIGRvbWFpbiwgY29udGV4dHMgfSA9IGZpbHRlcnNbZmlsdGVySWRdIGFzIEZpbHRlcjtcbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdG9Vc2VyRm9ybWF0KHZhbHVlLCB0eXBlKTtcblxuICAgICAgY29uc3QgdmFsdWVzID0gc2VydmljZXMubWFwKHNlcnZpY2UgPT4gKHsgbmFtZSwgc2VydmljZSwgdmFsdWU6IGZpbHRlclZhbHVlLCBkb21haW4sIGNvbnRleHRzIH0pKTtcblxuICAgICAgcmV0dXJuIFsuLi5hbGwsIC4uLnZhbHVlc107XG4gICAgfSwgW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaWx0ZXJzVmFsdWVzKGZpbHRlcnM6IEZvcm1GaWx0ZXJbXSkge1xuICAgIGNvbnN0IGlkcyA9IE9iamVjdC5rZXlzKGZpbHRlcnMpO1xuXG4gICAgcmV0dXJuIGlkcy5yZWR1Y2UoKGFsbCwgZmlsdGVySWQpID0+IHtcbiAgICAgIGNvbnN0IHsgdHlwZSwgc2VydmljZXMsIG5hbWUsIHZhbHVlLCBkb21haW4gfSA9IGZpbHRlcnNbZmlsdGVySWRdIGFzIEZpbHRlcjtcbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdG9GaWx0ZXJGb3JtYXQodmFsdWUsIHR5cGUpO1xuICAgICAgY29uc3QgdmFsdWVzID0gc2VydmljZXMubWFwKHNlcnZpY2UgPT4gKHsgbmFtZSwgc2VydmljZSwgdmFsdWU6IGZpbHRlclZhbHVlLCBkb21haW4gfSkpO1xuXG4gICAgICByZXR1cm4gWy4uLmFsbCwgLi4udmFsdWVzXTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZUNvbnRleHRzT2JzZXJ2YWJsZSgpIHtcbiAgICBjb25zdCB7IGNvbnRleHRzT2JzZXJ2ZXIgfSA9IHRoaXMuZmlsdGVyU2VydmljZTtcbiAgICBjb250ZXh0c09ic2VydmVyLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGNvbnRleHRzOiBDb250ZXh0W10pID0+ICh0aGlzLmNvbnRleHRzID0gY29udGV4dHMpKTtcbiAgfVxuXG4gIGVycm9yU3RhdGVBY3Rpb24oKSB7XG4gICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnRyeUFnYWluKHRoaXMuY29udGV4dHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVGaWx0ZXJzT2JzZXJ2YWJsZSgpIHtcbiAgICBjb25zdCB7IGZpbHRlcnNPYnNlcnZlciB9ID0gdGhpcy5maWx0ZXJTZXJ2aWNlO1xuXG4gICAgZmlsdGVyc09ic2VydmVyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZpbHRlcnMsIGFwcGx5RmlsdGVyLCBlcnJvciwgbWVzc2FnZSB9KSA9PiB7XG4gICAgICAgIHRoaXMuZXJyb3JPdXRwdXQuZW1pdChlcnJvcik7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5lcnJvclN0YXRlID0gbWVzc2FnZTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybShmaWx0ZXJzLCBhcHBseUZpbHRlcilcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm0oZmlsdGVyczogYW55LCBhcHBseUZpbHRlcjogYW55KSB7XG4gICAgdGhpcy50YWJzID0gdGhpcy5jcmVhdGVUYWJzKGZpbHRlcnMpO1xuICAgIHRoaXMuY291bnRlclVwZGF0ZSgpO1xuICAgIHRoaXMuc2V0RGVwZW5kZW5jaWVzKHRoaXMuZm9ybUZpbHRlcnMpO1xuICAgIHRoaXMuY3JlYXRlQ2hpbGRBcnJheSgpO1xuICAgIGlmIChmaWx0ZXJzLmxlbmd0aCA+IDAgJiYgYXBwbHlGaWx0ZXIpIHtcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXREZXBlbmRlbmNpZXMoZmlsdGVyczogRm9ybUZpbHRlcltdKSB7XG4gICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhmaWx0ZXJzKTtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBmcm9tKG5hbWVzKS5waXBlKFxuICAgICAgbWFwKGtleSA9PiBmaWx0ZXJzW2tleV0gYXMgRm9ybUZpbHRlciksXG4gICAgICByeEZpbHRlcigoeyBkZXBlbmRzT24gfSkgPT4gZGVwZW5kc09uICYmIGRlcGVuZHNPbi5sZW5ndGggPiAwKSxcbiAgICAgIHRhcCgoeyBkZXBlbmRzT24sIGRvbWFpbiwgZmlsdGVyQ29udHJvbCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGludmFsaWRGaWx0ZXJzID0gZGVwZW5kc09uXG4gICAgICAgICAgLmZpbHRlcihkZXAgPT4gZGVwLnJlcXVpcmVkKVxuICAgICAgICAgIC5maWx0ZXIoZGVwID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBkZXAuZmlsdGVyTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBmb3JtRmlsdGVyID0gZmlsdGVyc1tpZF07XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCB0eXBlIH0gPSBmb3JtRmlsdGVyO1xuICAgICAgICAgICAgY29uc3QgeyBjb21wYXJhdG9yIH0gPSBkZXA7XG4gICAgICAgICAgICBpZiAoY29tcGFyYXRvciAmJiBpc1ZhbGlkT3BlcmF0b3IoY29tcGFyYXRvci5vcGVyYXRvcikgJiYgaXNTdXBwb3J0ZWRUeXBlKHR5cGUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBwYXJzZUZpbHRlclZhbHVlKHZhbHVlLCB0eXBlKTtcbiAgICAgICAgICAgICAgcmV0dXJuICFjb21wYXJlKGNvbXBhcmF0b3Iub3BlcmF0b3IsIGNvbXBhcmF0b3IudmFsdWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlcC5yZXF1aXJlZCA/ICFmb3JtRmlsdGVyLnZhbHVlIDogZm9ybUZpbHRlci52YWx1ZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW52YWxpZEZpbHRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZpbHRlckNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG1hcCgoeyBkb21haW4sIGRlcGVuZHNPbiwgZmlsdGVyQ29udHJvbCB9KSA9PiAoeyBkb21haW4sIGRlcGVuZHNPbiwgZmlsdGVyQ29udHJvbCB9KSlcbiAgICApO1xuXG4gICAgZGVwZW5kZW5jaWVzLnN1YnNjcmliZSgoeyBkZXBlbmRzT24sIGRvbWFpbiwgZmlsdGVyQ29udHJvbCB9KSA9PlxuICAgICAgZnJvbShkZXBlbmRzT24pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHJ4RmlsdGVyKGRlcCA9PiBkZXAucmVxdWlyZWQpLFxuICAgICAgICAgIG1hcCgoeyBmaWx0ZXJOYW1lIH0pID0+IGdldEZpbHRlcklkKGRvbWFpbiwgZmlsdGVyTmFtZSkpLFxuICAgICAgICAgIG1hcChmaWx0ZXJJZCA9PiBmaWx0ZXJzW2ZpbHRlcklkXSBhcyBGb3JtRmlsdGVyKSxcbiAgICAgICAgICBtZXJnZU1hcChmb3JtRmlsdGVyID0+IGZyb20oZm9ybUZpbHRlci52YWx1ZUNoYW5nZXMpKSxcbiAgICAgICAgICBtYXAodmFsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBhcmF0aW9uID0gZGVwZW5kc09uLmV2ZXJ5KGRlcCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBkZXAuZmlsdGVyTmFtZSk7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXS50eXBlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29tcGFyYXRvciB9ID0gZGVwO1xuICAgICAgICAgICAgICAgIGlmIChjb21wYXJhdG9yICYmIGlzVmFsaWRPcGVyYXRvcihjb21wYXJhdG9yLm9wZXJhdG9yKSAmJiBpc1N1cHBvcnRlZFR5cGUodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VGaWx0ZXJWYWx1ZSh2YWwsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUoY29tcGFyYXRvci5vcGVyYXRvciwgY29tcGFyYXRvci52YWx1ZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuSXNFbXB0eSh2YWwpICYmIGNvbXBhcmF0aW9uID8gJ2VuYWJsZScgOiAnZGlzYWJsZSc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHN0YXR1cyA9PiBmaWx0ZXJDb250cm9sW3N0YXR1c10oKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRHZW5lcmFsRmllbGQoZmlsdGVyOiBGaWx0ZXIpIHtcbiAgICBjb25zdCB7IG5hbWUsIGRvbWFpbiwgdHlwZSB9ID0gZmlsdGVyO1xuICAgIGNvbnN0IGNvbnRyb2xOYW1lID0gZ2V0RmlsdGVySWQoZG9tYWluLCBuYW1lKTtcbiAgICBjb25zdCBmaWVsZENvbnRyb2wgPSBjcmVhdGVGb3JtQ29udHJvbChmaWx0ZXIpO1xuXG4gICAgZmllbGRDb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgbWFwKHYgPT4gcGFyc2VGaWx0ZXJWYWx1ZSh2LCB0eXBlKSksXG4gICAgICAgIHRhcCh2YWx1ZSA9PiAodGhpcy5mb3JtRmlsdGVyc1tjb250cm9sTmFtZV0udmFsdWUgPSB2YWx1ZSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHZhbCA9PlxuICAgICAgICB0aGlzLnRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0YWIuZm9ybS5jb250cm9sc1tuYW1lXTtcbiAgICAgICAgICBpZiAoY29udHJvbCAmJiB0YWIuZG9tYWluID09PSBkb21haW4pIHtcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgIGNvbnN0IG5ld0ZpbHRlciA9IHsgLi4uZmlsdGVyLCAuLi57IG5hbWU6IGNvbnRyb2xOYW1lIH0gfTtcbiAgICBjb25zdCBuZXdGaWVsZCA9IHRoaXMuY3JlYXRlRmllbGQobmV3RmlsdGVyKTtcbiAgICB0aGlzLmdlbmVyYWwuZm9ybS5hZGRDb250cm9sKGNvbnRyb2xOYW1lLCBmaWVsZENvbnRyb2wpO1xuICAgIHRoaXMuZ2VuZXJhbC5maWVsZHMucHVzaChuZXdGaWVsZCk7XG4gIH1cblxuICAvKlxuICAgKiBWZXJpZmljYSBvcyBjb250ZXh0b3MgZGUgY2FkYSBmaWx0cm8sIGNhc28gdG9kb3Mgb3MgY29udGV4dG9zIGZvcmFtIGluZm9ybWFkb3M6XG4gICAqIEByZXR1cm4gdHJ1ZVxuICAgKiBDYXNvIG7Do28gdGVuaGEgbmVuaHVtIGNvbnRleHRvLCBjb25zaWRlcmEtc2UgcG9yIHBhZHLDo28gcXVlIMOpIHRvZG9zOlxuICAgKiBAcmV0dXJuIHRydWVcbiAgICovXG4gIHByaXZhdGUgY29udGFpbnNBbGxDb250ZXh0cyhteUNvbnRleHRzOiBzdHJpbmdbXSkge1xuICAgIGlmICghbXlDb250ZXh0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBhbGxDb250ZXh0cyA9IHRoaXMuY29udGV4dHMubWFwKGRhdGEgPT4gZGF0YS5jb250ZXh0SWQpO1xuICAgIHJldHVybiBlcXVhbHMobXlDb250ZXh0cy5zb3J0KCksIGFsbENvbnRleHRzLnNvcnQoKSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHRvZG8gUmVmYXRvcmFyLiBPIG3DqXRvZG8gcG9zc3VpIG11aXRhcyByZXNwb25zYWJpbGlkYWRlc1xuICAgKiBcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlVGFicyhmaWx0ZXJzOiBGaWx0ZXJbXSkge1xuICAgIHJldHVybiBmaWx0ZXJzLnJlZHVjZSgodGFicywgZmlsdGVyKSA9PiB7XG4gICAgICBjb25zdCB7IGRvbWFpbiwgc2VydmljZXMsIG5hbWUsIHR5cGUsIHNjb3BlLCBjb250ZXh0cywgZGVwZW5kc09uLCB2YWx1ZSwgc2VhcmNoLCBkZWZhdWx0VmFsdWUgfSA9IGZpbHRlcjtcbiAgICAgIGNvbnN0IGlzTm90TXVsdGlwbGUgPSBzZWFyY2ggJiYgZ2V0U2VhcmNoVHlwZShzZWFyY2gpLm91dHB1dC5tYXhTZWxlY3RlZEl0ZW1zID09PSAxO1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmNyZWF0ZUZpZWxkKGZpbHRlcik7XG4gICAgICBjb25zdCBmaWx0ZXJJZCA9IGdldEZpbHRlcklkKGRvbWFpbiwgbmFtZSk7XG4gICAgICBjb25zdCBmaWx0ZXJDb25maWcgPSB7XG4gICAgICAgIGRvbWFpbixcbiAgICAgICAgY29udGV4dHMsXG4gICAgICAgIHNlcnZpY2VzLFxuICAgICAgICBuYW1lLFxuICAgICAgICBkZXBlbmRzT24sXG4gICAgICAgIHZhbHVlOiBmcm9tSnNvbih2YWx1ZSwgdHlwZSwgaXNOb3RNdWx0aXBsZSksXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGlzTXVsdGlwbGU6ICFpc05vdE11bHRpcGxlLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGZyb21Kc29uKGRlZmF1bHRWYWx1ZSwgdHlwZSwgaXNOb3RNdWx0aXBsZSlcbiAgICAgIH07XG4gICAgICB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXSA9IG5ldyBGb3JtRmlsdGVyKGZpbHRlckNvbmZpZyk7XG4gICAgICBjb25zdCBmb3JtRmlsdGVyID0gdGhpcy5mb3JtRmlsdGVyc1tmaWx0ZXJJZF07XG4gICAgICBpZiAoc2NvcGUgPT09IFNjb3BlLkRPTUFJTiAmJiB0aGlzLmNvbnRhaW5zQWxsQ29udGV4dHMoY29udGV4dHMpKSB7XG4gICAgICAgIHRoaXMuYWRkR2VuZXJhbEZpZWxkKGZpbHRlcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHRzLmZvckVhY2goY29udGV4dElkID0+IHtcbiAgICAgICAgaWYgKChjb250ZXh0SWQgPT09IHRoaXMuY29udGV4dElkKSB8fCAodGhpcy5jb250ZXh0SWQgPT09ICcnKSkge1xuICAgICAgICAgIGNvbnN0IHRhYklkID0gZ2V0VGFiSWQoZG9tYWluLCBjb250ZXh0SWQpO1xuICAgICAgICAgIGNvbnN0IGZpZWxkQ29udHJvbCA9IGNyZWF0ZUZvcm1Db250cm9sKGZpbHRlcik7XG5cbiAgICAgICAgICBpZiAoIXRhYnMuaGFzKHRhYklkKSkge1xuICAgICAgICAgICAgY29uc3QgeyBjb250ZXh0TGFiZWwgfSA9IHRoaXMuY29udGV4dHMuZmluZChjb250ZXh0ID0+IGNvbnRleHQuY29udGV4dElkID09PSBjb250ZXh0SWQpO1xuICAgICAgICAgICAgY29uc3QgdGFiID0gbmV3IENvbnRleHRUYWIoeyBkb21haW4sIG5hbWU6IGNvbnRleHRMYWJlbCB9KTtcbiAgICAgICAgICAgIHRhYnMuc2V0KHRhYklkLCB0YWIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpZWxkQ29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbDogYW55KSA9PiB0aGlzLnVwZGF0ZUZpbHRlclZhbHVlKHRhYklkLCBuYW1lLCB2YWwsIGRvbWFpbiwgdHlwZSkpO1xuXG4gICAgICAgICAgY29uc3QgY29udGV4dFRhYiA9IHRhYnMuZ2V0KHRhYklkKTtcblxuICAgICAgICAgIGNvbnRleHRUYWIuZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICAgIGNvbnRleHRUYWIuZm9ybS5hZGRDb250cm9sKGZpbHRlci5uYW1lLCBmaWVsZENvbnRyb2wpO1xuXG4gICAgICAgICAgaWYgKCFmb3JtRmlsdGVyLmZpbHRlckNvbnRyb2wpIHtcbiAgICAgICAgICAgIGZvcm1GaWx0ZXIuZmlsdGVyQ29udHJvbCA9IGZpZWxkQ29udHJvbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG5cbiAgICAgIHJldHVybiB0YWJzO1xuICAgIH0sIG5ldyBNYXA8c3RyaW5nLCBDb250ZXh0VGFiPigpKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyVmFsdWUodGFiSWQ6IHN0cmluZywgZmlsdGVyTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBkb21haW46IHN0cmluZywgdHlwZTogRmlsdGVyVHlwZSkge1xuICAgIGNvbnN0IGNvbnRyb2xPcHRzID0geyBlbWl0RXZlbnQ6IGZhbHNlIH07XG4gICAgY29uc3QgZmllbGRWYWx1ZSA9IHBhcnNlRmlsdGVyVmFsdWUodmFsdWUsIHR5cGUpO1xuICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBmaWx0ZXJOYW1lKTtcbiAgICBjb25zdCBnZW5lcmFsRmllbGRDb250cm9sID0gdGhpcy5nZW5lcmFsLmZvcm0uY29udHJvbHNbZmlsdGVySWRdO1xuXG4gICAgdGhpcy50YWJzLmZvckVhY2goKHsgZm9ybSB9LCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmNvbnRyb2xzW2ZpbHRlck5hbWVdO1xuXG4gICAgICBpZiAodGFiSWQgIT09IGtleSAmJiBjb250cm9sKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIGNvbnRyb2xPcHRzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCB7IGNoaWxkcyB9ID0gdGhpcy5mb3JtRmlsdGVyc1tmaWx0ZXJJZF07XG4gICAgY2hpbGRzICYmIGNoaWxkcy5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB0aGlzLmNsZWFuRmllbGRBbmRTZXREZWZhdWx0VmFsdWUoY2hpbGQuZmlsdGVyLmtleSkpO1xuICAgIGdlbmVyYWxGaWVsZENvbnRyb2wgJiYgZ2VuZXJhbEZpZWxkQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgY29udHJvbE9wdHMpO1xuICAgIHRoaXMuZm9ybUZpbHRlcnNbZmlsdGVySWRdLnZhbHVlID0gZmllbGRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5GaWVsZEFuZFNldERlZmF1bHRWYWx1ZShrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IHsgaXNNdWx0aXBsZSwgZGVmYXVsdFZhbHVlLCBmaWx0ZXJDb250cm9sLCB0eXBlIH0gPSB0aGlzLmZvcm1GaWx0ZXJzW2tleV0gYXMgRm9ybUZpbHRlcjtcbiAgICBjb25zdCBmaW5hbFZhbHVlID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlLCBpc011bHRpcGxlKTtcblxuICAgIGlmIChmaWx0ZXJDb250cm9sKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ0RBVEUnIHx8ICh0eXBlID09PSAnU0VBUkNIJyAmJiBpc011bHRpcGxlKSkge1xuICAgICAgICBmaWx0ZXJDb250cm9sLnNldFZhbHVlKGZpbmFsVmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09ICdJTlRFR0VSJyB8fCB0eXBlID09PSAnRE9VQkxFJyB8fCB0eXBlID09PSAnTU9ORVknKSB7XG4gICAgICAgIGZpbmFsVmFsdWUgPT09ICcnID8gZmlsdGVyQ29udHJvbC5zZXRWYWx1ZShudWxsKSA6IGZpbHRlckNvbnRyb2wuc2V0VmFsdWUoZmluYWxWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWx0ZXJDb250cm9sLnNldFZhbHVlKGZpbmFsVmFsdWUsIHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDaGlsZEFycmF5KCkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmZvcm1GaWx0ZXJzKTtcbiAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IHsgZGVwZW5kc09uLCBkb21haW4gfSA9IHRoaXMuZm9ybUZpbHRlcnNba2V5XTtcbiAgICAgIGRlcGVuZHNPbi5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBmaWVsZC5maWx0ZXJOYW1lKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybUZpbHRlcnNbZmlsdGVySWRdKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXS5jaGlsZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUZpbHRlcnNbZmlsdGVySWRdLmNoaWxkcyA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXS5jaGlsZHMucHVzaCh7IGZpbHRlcjogeyBrZXksIHJlcXVpcmVkOiBmaWVsZC5yZXF1aXJlZCB9IH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRmllbGQoZmlsdGVyOiBGaWx0ZXIpOiBGaWVsZCB7XG4gICAgY29uc3QgeyBuYW1lLCBsYWJlbCwgZW51bUl0ZW1zLCB0eXBlLCBtYXNrIH0gPSBmaWx0ZXI7XG4gICAgY29uc3QgdHJhbnNsYXRlZEVudW1JdGVtcyA9XG4gICAgICBlbnVtSXRlbXMgJiYgZW51bUl0ZW1zLm1hcCgoaXRlbTogRW51bUl0ZW0pID0+ICh7IGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGl0ZW0ubGFiZWwpLCB2YWx1ZTogaXRlbS52YWx1ZSB9KSk7XG4gICAgY29uc3QgZmllbGQgPSB7IG5hbWUsIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGxhYmVsKSwgcGxhY2Vob2xkZXI6ICcnIH07XG5cbiAgICBjb25zdCBjcmVhdG9ycyA9IHtcbiAgICAgIFtGaWx0ZXJUeXBlLlNUUklOR106ICgpID0+IG5ldyBUZXh0RmllbGQoeyAuLi5maWVsZCwgbWFzazogbWFzayA/ICgpID0+IG1hc2sgOiBudWxsLCB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nIH0pLFxuICAgICAgW0ZpbHRlclR5cGUuTU9ORVldOiAoKSA9PiBuZXcgQ3VycmVuY3lGaWVsZCh7IC4uLmZpZWxkLCB0eXBlOiBGaWVsZFR5cGUuTW9uZXkgfSksXG4gICAgICBbRmlsdGVyVHlwZS5CT09MRUFOXTogKCkgPT4gdGhpcy5jcmVhdGVSYWRpb0J1dHRvbih7IC4uLmZpZWxkIH0pLFxuICAgICAgW0ZpbHRlclR5cGUuREFURV06ICgpID0+IHRoaXMuY3JlYXRlQ2FsZW5kYXIoeyAuLi5maWVsZCwgdHlwZTogRmllbGRUeXBlLkRhdGUgfSksXG4gICAgICBbRmlsdGVyVHlwZS5EQVRFVElNRV06ICgpID0+IHRoaXMuY3JlYXRlQ2FsZW5kYXIoeyAuLi5maWVsZCwgdHlwZTogRmllbGRUeXBlLkRhdGVUaW1lIH0pLFxuICAgICAgW0ZpbHRlclR5cGUuVElNRV06ICgpID0+IHRoaXMuY3JlYXRlQ2FsZW5kYXIoeyAuLi5maWVsZCwgdHlwZTogRmllbGRUeXBlLlRpbWUgfSksXG4gICAgICBbRmlsdGVyVHlwZS5FTlVNRVJBVElPTl06ICgpID0+XG4gICAgICAgIG5ldyBTZWxlY3RGaWVsZCh7XG4gICAgICAgICAgLi4uZmllbGQsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3BsYXRmb3JtLmZpbHRlcl9zZXJ2aWNlLnNlbGVjdCcpLFxuICAgICAgICAgIG9wdGlvbnM6IFsuLi50cmFuc2xhdGVkRW51bUl0ZW1zXSBhcyBhbnksXG4gICAgICAgICAgdHlwZTogRmllbGRUeXBlLkVudW1cbiAgICAgICAgfSksXG4gICAgICBbRmlsdGVyVHlwZS5JTlRFR0VSXTogKCkgPT5cbiAgICAgICAgbmV3IE51bWJlckZpZWxkKHtcbiAgICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgICBudW1iZXJMb2NhbGVPcHRpb25zOiB0aGlzLm9wdGlvbnNJbnRlZ2VyKCksXG4gICAgICAgICAgbWFzazogbWFzayA/ICgpID0+IG1hc2sgOiBudWxsLFxuICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5JbnRlZ2VyXG4gICAgICAgIH0pLFxuICAgICAgW0ZpbHRlclR5cGUuRE9VQkxFXTogKCkgPT4gbmV3IEN1cnJlbmN5RmllbGQoeyAuLi5maWVsZCwgdHlwZTogRmllbGRUeXBlLkRvdWJsZSB9KSxcbiAgICAgIFtGaWx0ZXJUeXBlLlNFQVJDSF06ICgpID0+IHRoaXMuY3JlYXRlQXV0b2NvbXBsZXRlRmllbGQoZmllbGQsIGZpbHRlcilcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNyZWF0b3JzW3R5cGVdKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJhZGlvQnV0dG9uKGZpZWxkOiBGaWVsZENvbmZpZykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBbXG4gICAgICB7IGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke1RSQU5TTEFURV9QUkVGSVh9Lnllc2ApLCB2YWx1ZTogdHJ1ZSB9LFxuICAgICAgeyBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtUUkFOU0xBVEVfUFJFRklYfS5ub2ApLCB2YWx1ZTogZmFsc2UgfVxuICAgIF0gYXMgUmF0aW9uQnV0dG9uT3B0aW9uW107XG5cbiAgICByZXR1cm4gbmV3IFJhZGlvQnV0dG9uRmllbGQoeyAuLi5maWVsZCwgdHlwZTogRmllbGRUeXBlLlJhZGlvLCBvcHRpb25zIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDYWxlbmRhcihjb25maWc6IENhbGVuZGFyRmllbGRDb25maWcpIHtcbiAgICBjb25zdCBjYWxlbmRhciA9IG5ldyBDYWxlbmRhckZpZWxkKGNvbmZpZyk7XG4gICAgY2FsZW5kYXIuY2FsZW5kYXJMb2NhbGVPcHRpb25zID0gdGhpcy5jYWxlbmRhck9wdGlvbnNTZXJ2aWNlLmdldE9wdGlvbnMoKTtcbiAgICBpZiAoIXRoaXMuaXNNb2RhbCkgY2FsZW5kYXIuYXBwZW5kVG8gPSAnYm9keSc7XG4gICAgcmV0dXJuIGNhbGVuZGFyO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBdXRvY29tcGxldGVGaWVsZChmaWVsZDogRmllbGRDb25maWcsIHsgZGVwZW5kc09uLCBzZWFyY2gsIGRvbWFpbiwgbmFtZSB9OiBGaWx0ZXIpIHtcbiAgICBjb25zdCBzdWdnZXN0aW9uc09ic2VydmFibGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgY29uc3QgeyBxdWVyeVBhcmFtIH0gPSBnZXRTZWFyY2hUeXBlKHNlYXJjaCkuaW5wdXQ7XG4gICAgY29uc3QgeyBkaXNwbGF5RmllbGRzLCBrZXlGaWVsZHMsIHJlc3VsdERhdGFKc29uUGF0aCwgZGlzcGxheUZpZWxkQ29uY2F0VG9rZW4sIG1heFNlbGVjdGVkSXRlbXMgfSA9IGdldFNlYXJjaFR5cGUoc2VhcmNoKS5vdXRwdXQ7XG4gICAgY29uc3QgZmlsdGVySWQgPSBnZXRGaWx0ZXJJZChkb21haW4sIG5hbWUpO1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zRXJyb3IgPSAobWVzc2FnZUVycm9yPzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlRGV0YWlsID0gbWVzc2FnZUVycm9yID8gbWVzc2FnZUVycm9yIDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtUUkFOU0xBVEVfUFJFRklYfS5maW5kX3N1Z2dlc3Rpb25zX2Vycm9yYCwgeyBhY3RpdmVGaWx0ZXJzOiB0aGlzLnRvdGFsRmlsdGVyc0FjdGl2ZSB9KVxuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAga2V5OiAnZmlsdGVyU2VydmljZVRvYXN0S2V5JyxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgIGxpZmU6IFRPQVNUX0xJRkUsXG4gICAgICAgIGRldGFpbDogbWVzc2FnZURldGFpbFxuICAgICAgfTtcbiAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfTtcbiAgICBjb25zdCBvblNlYXJjaCA9ICh2YWw6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgcGFyYW1zID0geyBbcXVlcnlQYXJhbV06IHZhbCB9O1xuICAgICAgZGVwZW5kc09uICYmIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB0aGlzLmdldERlcGVuZGVuY2llc1ZhbHVlcyhkZXBlbmRzT24sIGRvbWFpbikpO1xuXG4gICAgICBjb25zdCBzZWFyY2hVcmwgPVxuICAgICAgICBzZWFyY2ggJiYgc2VhcmNoLnR5cGUgPT09ICdFTlRJVFknXG4gICAgICAgICAgPyB0aGlzLmdldEVudGl0eVNlYXJjaFVybChzZWFyY2guZW50aXR5U2VhcmNoLmlucHV0LCB2YWwsIGRlcGVuZHNPbilcbiAgICAgICAgICA6IGdldFNlYXJjaFR5cGUoc2VhcmNoKS5pbnB1dC51cmw7XG5cbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZVxuICAgICAgICAuc2VhcmNoRmllbGRTdWdnZXN0aW9ucyhzZWFyY2hVcmwsIHBhcmFtcywgc2VhcmNoLnR5cGUpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcChyZXNwb25zZSA9PiBqc29uUGF0aChyZXNwb25zZSwgcmVzdWx0RGF0YUpzb25QYXRoKSksXG4gICAgICAgICAgbWFwKChzdWdnZXN0aW9uczogYW55W10pID0+IHRoaXMuYWRkU3VnZ2VzdGlvbkZpZWxkcyhzdWdnZXN0aW9ucywgZGlzcGxheUZpZWxkcywga2V5RmllbGRzLCBkaXNwbGF5RmllbGRDb25jYXRUb2tlbiwgZmlsdGVySWQpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICBzdWdnZXN0aW9uc09ic2VydmFibGUubmV4dChyZXN1bHQpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICBsZXQgbWVzc2FnZUVycm9yID0gdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLmVycm9yLm1lc3NhZ2UpIG1lc3NhZ2VFcnJvciA9IGVycm9yLmVycm9yLm1lc3NhZ2VcbiAgICAgICAgICBzdWdnZXN0aW9uc0Vycm9yKG1lc3NhZ2VFcnJvcilcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgQXV0b2NvbXBsZXRlRmllbGQoe1xuICAgICAgLi4uZmllbGQsXG4gICAgICBvblNlYXJjaCxcbiAgICAgIGFwcGVuZFRvOiAnYm9keScsXG4gICAgICBzdWdnZXN0aW9uc09ic2VydmFibGUsXG4gICAgICBkaXNwbGF5RmllbGQ6IHNlYXJjaERpc3BsYXlOYW1lLFxuICAgICAgZGF0YUtleTogc2VhcmNoS2V5TmFtZSxcbiAgICAgIG11bHRpcGxlOiBtYXhTZWxlY3RlZEl0ZW1zID4gMSxcbiAgICAgIHNpemU6IHsgbGc6IDEyLCBtZDogMTIsIHhsOiAxMiB9LFxuICAgICAgZW1wdHlNZXNzYWdlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke1RSQU5TTEFURV9QUkVGSVh9LnNlYXJjaF9lbXB0eV9tZXNzYWdlYClcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW50aXR5U2VhcmNoVXJsKHNlYXJjaDogRW50aXR5U2VhcmNoSW5wdXQsIHZhbHVlOiBzdHJpbmcsIGRlcGVuZHNPbjogRGVwZW5kc09uW10pIHtcbiAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIGRvbWFpbk5hbWUsIGVudGl0eU5hbWUsIHNlcnZpY2VOYW1lIH0gPSBzZWFyY2g7XG4gICAgY29uc3QgdXJsID0gYCR7ZG9tYWluTmFtZX0vJHtzZXJ2aWNlTmFtZX0vZW50aXRpZXMvJHtlbnRpdHlOYW1lfS8/ZmlsdGVyPWA7XG4gICAgY29uc3QgZmlsdGVyczogYW55ID0gYXR0cmlidXRlcy5tYXAoYXR0ciA9PiBmaWx0ZXJPcGVyYXRvcnNbYXR0ci5jb21wYXJhdG9yXShhdHRyLm5hbWUsIHZhbHVlKSk7XG5cbiAgICBkZXBlbmRzT24gJiZcbiAgICAgIGRlcGVuZHNPbi5mb3JFYWNoKG9iaiA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluTmFtZSwgb2JqLmZpbHRlck5hbWUpO1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5mb3JtRmlsdGVyc1tmaWx0ZXJJZF0udmFsdWVbc2VhcmNoS2V5TmFtZV07XG4gICAgICAgIGZpbHRlcnMucHVzaChgJHtvYmouZW50aXR5QXR0cmlidXRlfSBlcSAnJHtmaWVsZFZhbHVlfSdgKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gTyByZWdleCBhcGVuYXMgc2VsZWNpb25hIGFzIHZpcmd1bGFzIGlnbm9yYW5kbyBhcyBxdWUgZXN0aXZlcmVtIGRlbnRybyBkbyAoKVxuICAgIHJldHVybiB1cmwuY29uY2F0KGZpbHRlcnMpLnJlcGxhY2UoL1ssXSsoPyFbXihdKlspXSkvZywgYCAke3NlYXJjaC5vcGVyYXRvcn0gYCk7XG4gIH1cblxuICBwcml2YXRlIGFkZFN1Z2dlc3Rpb25GaWVsZHMoc3VnZ2VzdGlvbnM6IGFueVtdLCBkaXNwbGF5RmllbGRzOiBzdHJpbmdbXSwga2V5RmllbGRzOiBzdHJpbmdbXSwgc2VwYXJhdG9yOiBzdHJpbmcsIGZpbHRlcklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhZGRWYWx1ZSA9IChhY2M6IHN0cmluZywgdmFsdWU6IGFueSwgdG9rZW46IHN0cmluZykgPT4gKGFjYyA/IGAke2FjY30ke3Rva2VufSR7dmFsdWV9YCA6IHZhbHVlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHN1Z2dlc3Rpb25zLm1hcChzdWdnZXN0aW9uID0+ICh7XG4gICAgICAuLi5zdWdnZXN0aW9uLFxuICAgICAgW3NlYXJjaERpc3BsYXlOYW1lXTogZGlzcGxheUZpZWxkcy5yZWR1Y2UoKHZhbHVlLCBkaXNwbGF5KSA9PiB7XG4gICAgICAgIHJldHVybiBhZGRWYWx1ZSh2YWx1ZSwgdGhpcy50cmFuc2xhdGUuaW5zdGFudChzdWdnZXN0aW9uW2Rpc3BsYXldKSwgc2VwYXJhdG9yKTtcbiAgICAgIH0sICcnKSxcbiAgICAgIFtzZWFyY2hLZXlOYW1lXToga2V5RmllbGRzLnJlZHVjZSgodmFsdWUsIGtleSkgPT4gYWRkVmFsdWUodmFsdWUsIHN1Z2dlc3Rpb25ba2V5XSwgJywgJyksICcnKVxuICAgIH0pKTtcbiAgICB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXS5pbnZhbGlkVmFsdWUgPSByZXN1bHQubGVuZ3RoID09PSAwO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHZhbHVlLmZpbmRJbmRleCgoaTogYW55KSA9PiBpLiQkX19rZXlWYWx1ZV9fID09PSBpdGVtLiQkX19rZXlWYWx1ZV9fKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVwZW5kZW5jaWVzVmFsdWVzKGRlcGVuZGVuY2llczogRGVwZW5kc09uW10sIGRvbWFpbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcy5yZWR1Y2UoKHBhcmFtcywgeyBmaWx0ZXJOYW1lIH0pID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBmaWx0ZXJOYW1lKTtcbiAgICAgIGlmICh0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXSkge1xuICAgICAgICBjb25zdCB7IHZhbHVlLCB0eXBlIH0gPSB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdFTlVNRVJBVElPTicpIHtcbiAgICAgICAgICBwYXJhbXNbZmlsdGVyTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHBhcmFtc1tmaWx0ZXJOYW1lXSA9IHZhbHVlLm1hcChhcnIgPT4gYXJyW3NlYXJjaEtleU5hbWVdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyYW1zW2ZpbHRlck5hbWVdID0gdmFsdWUgPyB2YWx1ZVtzZWFyY2hLZXlOYW1lXSA6IFsnJ107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuSXNFbXB0eShwYXJhbXNbZmlsdGVyTmFtZV0pICYmIGRlbGV0ZSBwYXJhbXNbZmlsdGVyTmFtZV07XG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICB9XG4gICAgfSwge30pO1xuICB9XG5cbiAgLypcbiAgICogVmVyaWZpY2Egc2UgbyB2YWxvciBpbmZvcm1hZG8gw6kgZmFsc28sIGVtIGFycmF5cywgw6kgdmVyaWZpY2FkbyBjYWRhIGl0ZW1cbiAgICovXG4gIHByaXZhdGUgSXNFbXB0eSh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuZXZlcnkoZGF0YSA9PiAhZGF0YSkgOiAhdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGZvcm1hdCB0byBzcGVjaWZ5IGZvciBpbnRlZ2VyIHR5cGUgZmllbGRcbiAgICovXG4gIHByaXZhdGUgb3B0aW9uc0ludGVnZXIoKSB7XG4gICAgcmV0dXJuIHsgY3VycmVuY3lTeW1ib2w6ICcnLCBkZWNpbWFsU2VwYXJhdG9yOiAnJywgdGhvdXNhbmRzU2VwYXJhdG9yOiAnJyB9O1xuICB9XG59XG4iXX0=