@c8y/ngx-components 1021.63.2 → 1021.66.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 (146) hide show
  1. package/auth-configuration/sso-configuration/template-parts/signature-configuration.component.d.ts +7 -2
  2. package/auth-configuration/sso-configuration/template-parts/signature-configuration.component.d.ts.map +1 -1
  3. package/core/bottom-drawer/bottom-drawer-ref.d.ts +4 -0
  4. package/core/bottom-drawer/bottom-drawer-ref.d.ts.map +1 -1
  5. package/core/breadcrumb/breadcrumb-item.component.d.ts +1 -1
  6. package/core/breadcrumb/breadcrumb-item.component.d.ts.map +1 -1
  7. package/core/breadcrumb/breadcrumb-outlet.component.d.ts +1 -1
  8. package/core/breadcrumb/breadcrumb-outlet.component.d.ts.map +1 -1
  9. package/core/breadcrumb/breadcrumb.component.d.ts +1 -1
  10. package/core/breadcrumb/breadcrumb.component.d.ts.map +1 -1
  11. package/core/breadcrumb/breadcrumb.module.d.ts +7 -7
  12. package/core/breadcrumb/breadcrumb.module.d.ts.map +1 -1
  13. package/core/common/common.module.d.ts +38 -38
  14. package/core/common/date-format.service.d.ts +30 -0
  15. package/core/common/date-format.service.d.ts.map +1 -0
  16. package/core/common/date.pipe.d.ts +7 -3
  17. package/core/common/date.pipe.d.ts.map +1 -1
  18. package/core/common/index.d.ts +1 -0
  19. package/core/common/index.d.ts.map +1 -1
  20. package/core/common/outlet.directive.d.ts +1 -1
  21. package/core/common/outlet.directive.d.ts.map +1 -1
  22. package/core/common/user-preferences/user-preferences-store-current-user.d.ts +11 -0
  23. package/core/common/user-preferences/user-preferences-store-current-user.d.ts.map +1 -0
  24. package/core/common/user-preferences/user-preferences.service.d.ts +40 -1
  25. package/core/common/user-preferences/user-preferences.service.d.ts.map +1 -1
  26. package/core/date-picker/date-picker.component.d.ts +3 -1
  27. package/core/date-picker/date-picker.component.d.ts.map +1 -1
  28. package/core/date-time-picker/date-time-picker.component.d.ts +6 -3
  29. package/core/date-time-picker/date-time-picker.component.d.ts.map +1 -1
  30. package/core/dynamic-forms/date/date.type.component.d.ts +3 -0
  31. package/core/dynamic-forms/date/date.type.component.d.ts.map +1 -1
  32. package/core/plugins/plugins.model.d.ts +1 -0
  33. package/core/plugins/plugins.model.d.ts.map +1 -1
  34. package/core/plugins/plugins.service.d.ts +7 -2
  35. package/core/plugins/plugins.service.d.ts.map +1 -1
  36. package/core/time-interval/time-interval.component.d.ts +4 -2
  37. package/core/time-interval/time-interval.component.d.ts.map +1 -1
  38. package/ecosystem/application-plugins/application-plugin-readme.component.d.ts +15 -0
  39. package/ecosystem/application-plugins/application-plugin-readme.component.d.ts.map +1 -0
  40. package/ecosystem/application-plugins/application-plugins.component.d.ts +4 -2
  41. package/ecosystem/application-plugins/application-plugins.component.d.ts.map +1 -1
  42. package/ecosystem/application-plugins/application-plugins.module.d.ts +4 -3
  43. package/ecosystem/application-plugins/application-plugins.module.d.ts.map +1 -1
  44. package/ecosystem/application-plugins/install-plugin.component.d.ts +8 -4
  45. package/ecosystem/application-plugins/install-plugin.component.d.ts.map +1 -1
  46. package/ecosystem/application-plugins/plugin-list.component.d.ts +10 -26
  47. package/ecosystem/application-plugins/plugin-list.component.d.ts.map +1 -1
  48. package/ecosystem/application-plugins/plugin-list.service.d.ts +27 -0
  49. package/ecosystem/application-plugins/plugin-list.service.d.ts.map +1 -0
  50. package/ecosystem/ecosystem.module.d.ts +2 -1
  51. package/ecosystem/ecosystem.module.d.ts.map +1 -1
  52. package/ecosystem/packages/package-changelog-tab/package-changelog-tab.component.d.ts +15 -0
  53. package/ecosystem/packages/package-changelog-tab/package-changelog-tab.component.d.ts.map +1 -0
  54. package/ecosystem/packages/package-changelog.guard.d.ts +10 -0
  55. package/ecosystem/packages/package-changelog.guard.d.ts.map +1 -0
  56. package/ecosystem/packages/package-details/package-details.component.d.ts +7 -9
  57. package/ecosystem/packages/package-details/package-details.component.d.ts.map +1 -1
  58. package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts +5 -1
  59. package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts.map +1 -1
  60. package/ecosystem/packages/package-versions/package-contents/packages-contents.component.d.ts +8 -3
  61. package/ecosystem/packages/package-versions/package-contents/packages-contents.component.d.ts.map +1 -1
  62. package/ecosystem/packages/package-versions/packages-versions.component.d.ts +9 -2
  63. package/ecosystem/packages/package-versions/packages-versions.component.d.ts.map +1 -1
  64. package/ecosystem/shared/index.d.ts +1 -0
  65. package/ecosystem/shared/index.d.ts.map +1 -1
  66. package/ecosystem/shared/package-changelog/package-changelog.component.d.ts +24 -0
  67. package/ecosystem/shared/package-changelog/package-changelog.component.d.ts.map +1 -0
  68. package/ecosystem/shared/shared-ecosystem.module.d.ts +2 -1
  69. package/ecosystem/shared/shared-ecosystem.module.d.ts.map +1 -1
  70. package/esm2022/auth-configuration/sso-configuration/template-parts/signature-configuration.component.mjs +11 -7
  71. package/esm2022/core/bottom-drawer/bottom-drawer-ref.mjs +9 -3
  72. package/esm2022/core/breadcrumb/breadcrumb-item.component.mjs +3 -3
  73. package/esm2022/core/breadcrumb/breadcrumb-outlet.component.mjs +19 -9
  74. package/esm2022/core/breadcrumb/breadcrumb.component.mjs +3 -3
  75. package/esm2022/core/breadcrumb/breadcrumb.module.mjs +16 -5
  76. package/esm2022/core/common/common.module.mjs +6 -6
  77. package/esm2022/core/common/date-format.service.mjs +81 -0
  78. package/esm2022/core/common/date.pipe.mjs +29 -6
  79. package/esm2022/core/common/index.mjs +2 -1
  80. package/esm2022/core/common/outlet.directive.mjs +4 -3
  81. package/esm2022/core/common/user-preferences/user-preferences-store-current-user.mjs +22 -0
  82. package/esm2022/core/common/user-preferences/user-preferences.service.mjs +106 -16
  83. package/esm2022/core/date-picker/date-picker.component.mjs +11 -4
  84. package/esm2022/core/date-time-picker/date-time-picker.component.mjs +20 -11
  85. package/esm2022/core/dynamic-forms/date/date.type.component.mjs +12 -4
  86. package/esm2022/core/plugins/plugins.model.mjs +1 -1
  87. package/esm2022/core/plugins/plugins.service.mjs +31 -5
  88. package/esm2022/core/time-interval/time-interval.component.mjs +9 -2
  89. package/esm2022/ecosystem/application-plugins/application-plugin-readme.component.mjs +26 -0
  90. package/esm2022/ecosystem/application-plugins/application-plugins.component.mjs +29 -14
  91. package/esm2022/ecosystem/application-plugins/application-plugins.module.mjs +6 -3
  92. package/esm2022/ecosystem/application-plugins/install-plugin.component.mjs +21 -15
  93. package/esm2022/ecosystem/application-plugins/plugin-list-item.component.mjs +3 -3
  94. package/esm2022/ecosystem/application-plugins/plugin-list.component.mjs +26 -202
  95. package/esm2022/ecosystem/application-plugins/plugin-list.service.mjs +200 -0
  96. package/esm2022/ecosystem/application-plugins/update-plugin-of-app/update-plugin-of-app.component.mjs +3 -3
  97. package/esm2022/ecosystem/application-properties/update-application-modal/update-application-modal.component.mjs +1 -1
  98. package/esm2022/ecosystem/ecosystem.module.mjs +21 -5
  99. package/esm2022/ecosystem/packages/package-changelog-tab/package-changelog-tab.component.mjs +33 -0
  100. package/esm2022/ecosystem/packages/package-changelog.guard.mjs +22 -0
  101. package/esm2022/ecosystem/packages/package-details/package-details.component.mjs +25 -44
  102. package/esm2022/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.mjs +14 -4
  103. package/esm2022/ecosystem/packages/package-versions/package-contents/packages-contents.component.mjs +27 -8
  104. package/esm2022/ecosystem/packages/package-versions/packages-versions.component.mjs +22 -8
  105. package/esm2022/ecosystem/shared/index.mjs +2 -1
  106. package/esm2022/ecosystem/shared/list-filters/list-filters.component.mjs +3 -3
  107. package/esm2022/ecosystem/shared/package-changelog/package-changelog.component.mjs +82 -0
  108. package/esm2022/ecosystem/shared/package-version-select/package-version-select.component.mjs +3 -3
  109. package/esm2022/ecosystem/shared/shared-ecosystem.module.mjs +12 -6
  110. package/esm2022/operations/bulk-operation-scheduler/operation-scheduler.component.mjs +9 -7
  111. package/esm2022/operations/bulk-operations-list/bulk-operations-list.component.mjs +1 -1
  112. package/esm2022/upgrade/ng1/downgraded.services.mjs +3 -2
  113. package/esm2022/upgrade/ng1/index.mjs +3 -2
  114. package/fesm2022/c8y-ngx-components-auth-configuration.mjs +9 -5
  115. package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
  116. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +209 -142
  117. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  118. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +96 -13
  119. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  120. package/fesm2022/c8y-ngx-components-ecosystem.mjs +336 -186
  121. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  122. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs +7 -5
  123. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
  124. package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs +1 -1
  125. package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
  126. package/fesm2022/c8y-ngx-components-upgrade.mjs +3 -1
  127. package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
  128. package/fesm2022/c8y-ngx-components.mjs +833 -550
  129. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  130. package/locales/de.po +45 -6
  131. package/locales/es.po +45 -6
  132. package/locales/fr.po +45 -6
  133. package/locales/ja_JP.po +45 -6
  134. package/locales/ko.po +45 -6
  135. package/locales/locales.pot +42 -6
  136. package/locales/nl.po +45 -6
  137. package/locales/pl.po +45 -6
  138. package/locales/pt_BR.po +45 -6
  139. package/locales/zh_CN.po +45 -6
  140. package/locales/zh_TW.po +45 -6
  141. package/operations/bulk-operation-scheduler/operation-scheduler.component.d.ts +4 -2
  142. package/operations/bulk-operation-scheduler/operation-scheduler.component.d.ts.map +1 -1
  143. package/package.json +1 -1
  144. package/upgrade/ng1/downgraded.services.d.ts +1 -0
  145. package/upgrade/ng1/downgraded.services.d.ts.map +1 -1
  146. package/upgrade/ng1/index.d.ts.map +1 -1
@@ -1,23 +1,28 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import { InventoryService, UserService } from '@c8y/client';
3
- import { concat, from, Subject } from 'rxjs';
3
+ import { concat, firstValueFrom, from, Subject } from 'rxjs';
4
4
  import { filter, first, map, switchMap } from 'rxjs/operators';
5
5
  import { AppStateService } from '../ui-state.service';
6
6
  import { UserPreferencesStorageLocal } from './user-preferences-storage-local';
7
7
  import { UserPreferencesStorageInventory } from './user-preferences-store-inventory';
8
8
  import { Permissions } from '../permissions.service';
9
+ import { AlertService } from '../../alert/alert.service';
10
+ import { UserPreferencesStorageCurrentUser } from './user-preferences-store-current-user';
9
11
  import * as i0 from "@angular/core";
10
12
  import * as i1 from "@c8y/client";
11
13
  import * as i2 from "../ui-state.service";
14
+ import * as i3 from "../../alert/alert.service";
12
15
  export class UserPreferencesService {
13
- constructor(user, inventory, appState) {
16
+ constructor(user, inventory, appState, alert) {
14
17
  this.user = user;
15
18
  this.inventory = inventory;
16
19
  this.appState = appState;
20
+ this.alert = alert;
17
21
  this.preferenceChanges$ = new Subject();
18
22
  this.storage = {
19
23
  local: new UserPreferencesStorageLocal(),
20
- inventory: new UserPreferencesStorageInventory(this.inventory)
24
+ inventory: new UserPreferencesStorageInventory(this.inventory),
25
+ currentUser: new UserPreferencesStorageCurrentUser(this.user, this.appState)
21
26
  };
22
27
  this.currentUser = this.appState.currentUser.pipe(filter(currentUser => currentUser !== null));
23
28
  }
@@ -36,7 +41,7 @@ export class UserPreferencesService {
36
41
  * @returns An Observable with the value of preference.
37
42
  */
38
43
  get(key) {
39
- return this.currentUser.pipe(first(), switchMap(user => this.getForUser(key, user)));
44
+ return this.currentUser.pipe(first(), switchMap(user => this.getForCurrentUser(key, user)));
40
45
  }
41
46
  /**
42
47
  * Sets a value in storage for current user.
@@ -45,21 +50,19 @@ export class UserPreferencesService {
45
50
  * @returns A promise with saved value.
46
51
  */
47
52
  set(key, value) {
48
- return new Promise((resolve, reject) => {
49
- this.currentUser.pipe(first()).subscribe(user => {
50
- this.preferenceChanges$.next({ key, value });
51
- resolve(this.setForUser(key, value, user));
52
- }, reject);
53
- });
53
+ this.preferenceChanges$.next({ key, value });
54
+ return this.setForCurrentUser(key, value);
54
55
  }
55
56
  /**
56
57
  * Get an Observable value of searched key for a specific user.
57
58
  * @param key The storage key for searched value.
58
59
  * @param user The user for whom the search is done.
59
60
  * @returns An Observable with the value of preference.
61
+ *
62
+ * @deprecated Uses depracted inventory approach. Use get instead.
60
63
  */
61
64
  getForUser(key, user) {
62
- const rawKey = this.getRawKey(key, user);
65
+ const rawKey = this.getTransformedRawKey(key, user);
63
66
  const storage = this.getStorage(user);
64
67
  return from(storage.get(rawKey));
65
68
  }
@@ -68,22 +71,100 @@ export class UserPreferencesService {
68
71
  * @param key The storage key for the value to be set.
69
72
  * @param value The storage value to be set.
70
73
  * @returns A promise with saved value.
74
+ *
75
+ * @deprecated Uses deprecated inventory approach. Use set instead.
71
76
  */
72
77
  setForUser(key, value, user) {
73
- const rawKey = this.getRawKey(key, user);
78
+ const rawKey = this.getTransformedRawKey(key, user);
74
79
  const storage = this.getStorage(user);
75
80
  return Promise.resolve(storage.set(rawKey, value));
76
81
  }
82
+ /**
83
+ * Get value of searched key for current user.
84
+ * If preference is not found in user's customProperties, it will try to get it from inventory or local storage and
85
+ * update user's customProperties with the value and return that value.
86
+ * @param key The preference key for searched value.
87
+ * @param user The user for whom the search is done.
88
+ * @returns A Promise with the value of preference.
89
+ */
90
+ async getForCurrentUser(key, user) {
91
+ const currentUserStorage = await this.getCurrentUserStorage();
92
+ const customPropertiesKey = this.getCustomPropertiesKey(key);
93
+ const currentUserHasKeyProperty = currentUserStorage && (await currentUserStorage.hasKey(customPropertiesKey));
94
+ if (currentUserHasKeyProperty) {
95
+ return await currentUserStorage.get(customPropertiesKey);
96
+ }
97
+ else {
98
+ const localOrInventoryStorage = this.getStorage(user);
99
+ const transformedRawKey = this.getTransformedRawKey(key, user);
100
+ const rawKey = this.getRawKey(key, user);
101
+ const valueFromStorage = (await localOrInventoryStorage.get(transformedRawKey)) ||
102
+ (await localOrInventoryStorage.get(rawKey));
103
+ if (valueFromStorage === undefined) {
104
+ return undefined;
105
+ }
106
+ try {
107
+ await currentUserStorage?.set(customPropertiesKey, valueFromStorage);
108
+ }
109
+ catch (e) {
110
+ // do nothing
111
+ }
112
+ return valueFromStorage;
113
+ }
114
+ }
115
+ /**
116
+ * Sets a value for current user.
117
+ * @param key The preference key for the value to be set.
118
+ * @param value The preference value to be set.
119
+ */
120
+ async setForCurrentUser(key, value) {
121
+ const currentUserStorage = await this.getCurrentUserStorage();
122
+ const userPreferencesKey = this.getCustomPropertiesKey(key);
123
+ if (currentUserStorage) {
124
+ try {
125
+ await currentUserStorage.set(userPreferencesKey, value);
126
+ }
127
+ catch (e) {
128
+ this.alert.addServerFailure(e);
129
+ }
130
+ }
131
+ else {
132
+ const user = await firstValueFrom(this.currentUser);
133
+ const rawKey = this.getRawKey(key, user);
134
+ this.storage.local.set(rawKey, value);
135
+ }
136
+ }
77
137
  /**
78
138
  * Get a string of key concatenated with username.
139
+ * Used by deprecated invetory storage approach and for leftovers in local storage.
140
+ * It was used to store preferences for specific users and it as replacing "." with "__"
141
+ * because of MongoDB restrictions.
79
142
  * @param key The storage key for searched value.
80
143
  * @param user The user for whom the search is done.
81
144
  * @returns A string of key concatenated with username.
82
145
  */
83
- getRawKey(key, user) {
146
+ getTransformedRawKey(key, user) {
84
147
  const username = user.userName.replace(/\./g, '__');
85
148
  return `${key}${username}`;
86
149
  }
150
+ /**
151
+ * Get a string of key concatenated with username.
152
+ * Used by local storage.
153
+ * @param key The storage key for searched value.
154
+ * @param user The user for whom the search is done.
155
+ * @returns A string of key concatenated with username.
156
+ */
157
+ getRawKey(key, user) {
158
+ return `${key}${user.userName}`;
159
+ }
160
+ /**
161
+ * Get a key for user preferences. Used current user customProperties.
162
+ * @param key The storage key for searched value.
163
+ * @returns A key for user preferences.
164
+ */
165
+ getCustomPropertiesKey(key) {
166
+ return `c8y_UserPreference-${key}`;
167
+ }
87
168
  /**
88
169
  * Gets a proper storage depending on the user roles.
89
170
  * @param user The user for whom the role check is done.
@@ -101,11 +182,20 @@ export class UserPreferencesService {
101
182
  ? this.storage.inventory
102
183
  : this.storage.local;
103
184
  }
104
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserPreferencesService, deps: [{ token: i1.UserService }, { token: i1.InventoryService }, { token: i2.AppStateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
185
+ async getCurrentUserStorage() {
186
+ const currentUser = await firstValueFrom(this.currentUser);
187
+ const hasRoleToEditCurrentUser = this.user.hasRole(currentUser, Permissions.ROLE_USER_MANAGEMENT_OWN_ADMIN);
188
+ const isExternalUser = currentUser.customProperties?.userOrigin === 'OAUTH2';
189
+ if (!hasRoleToEditCurrentUser || isExternalUser) {
190
+ return null;
191
+ }
192
+ return this.storage.currentUser;
193
+ }
194
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserPreferencesService, deps: [{ token: i1.UserService }, { token: i1.InventoryService }, { token: i2.AppStateService }, { token: i3.AlertService }], target: i0.ɵɵFactoryTarget.Injectable }); }
105
195
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserPreferencesService, providedIn: 'root' }); }
106
196
  }
107
197
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserPreferencesService, decorators: [{
108
198
  type: Injectable,
109
199
  args: [{ providedIn: 'root' }]
110
- }], ctorParameters: () => [{ type: i1.UserService }, { type: i1.InventoryService }, { type: i2.AppStateService }] });
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vY29yZS9jb21tb24vdXNlci1wcmVmZXJlbmNlcy91c2VyLXByZWZlcmVuY2VzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQVMsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXJGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7OztBQUdyRCxNQUFNLE9BQU8sc0JBQXNCO0lBUWpDLFlBQ1UsSUFBaUIsRUFDakIsU0FBMkIsRUFDM0IsUUFBeUI7UUFGekIsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNqQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQVRuQyx1QkFBa0IsR0FBNEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVcxRCxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsS0FBSyxFQUFFLElBQUksMkJBQTJCLEVBQUU7WUFDeEMsU0FBUyxFQUFFLElBQUksK0JBQStCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUMvRCxDQUFDO1FBQ0YsSUFBSSxDQUFD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QUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRTtnQkFDMUIsV0FBVyxDQUFDLHlCQUF5QjtnQkFDckMsV0FBVyxDQUFDLHdCQUF3QjthQUNyQyxDQUFDO1lBQ0YsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUztZQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDekIsQ0FBQzsrR0FsSFUsc0JBQXNCO21IQUF0QixzQkFBc0IsY0FEVCxNQUFNOzs0RkFDbkIsc0JBQXNCO2tCQURsQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEludmVudG9yeVNlcnZpY2UsIElVc2VyLCBVc2VyU2VydmljZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IGNvbmNhdCwgZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBmaXJzdCwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi91aS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlc1N0b3JhZ2VMb2NhbCB9IGZyb20gJy4vdXNlci1wcmVmZXJlbmNlcy1zdG9yYWdlLWxvY2FsJztcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlc1N0b3JhZ2VJbnZlbnRvcnkgfSBmcm9tICcuL3VzZXItcHJlZmVyZW5jZXMtc3RvcmUtaW52ZW50b3J5JztcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlIH0gZnJvbSAnLi91c2VyLXByZWZlcmVuY2UubW9kZWwnO1xuaW1wb3J0IHsgUGVybWlzc2lvbnMgfSBmcm9tICcuLi9wZXJtaXNzaW9ucy5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlIHtcbiAgY3VycmVudFVzZXI6IE9ic2VydmFibGU8SVVzZXI+O1xuICBwcmVmZXJlbmNlQ2hhbmdlcyQ6IFN1YmplY3Q8VXNlclByZWZlcmVuY2U+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBzdG9yYWdlOiB7XG4gICAgbG9jYWw6IFVzZXJQcmVmZXJlbmNlc1N0b3JhZ2VMb2NhbDtcbiAgICBpbnZlbnRvcnk6IFVzZXJQcmVmZXJlbmNlc1N0b3JhZ2VJbnZlbnRvcnk7XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB1c2VyOiBVc2VyU2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGFwcFN0YXRlOiBBcHBTdGF0ZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zdG9yYWdlID0ge1xuICAgICAgbG9jYWw6IG5ldyBVc2VyUHJlZmVyZW5jZXNTdG9yYWdlTG9jYWwoKSxcbiAgICAgIGludmVudG9yeTogbmV3IFVzZXJQcmVmZXJlbmNlc1N0b3JhZ2VJbnZlbnRvcnkodGhpcy5pbnZlbnRvcnkpXG4gICAgfTtcbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gdGhpcy5hcHBTdGF0ZS5jdXJyZW50VXNlci5waXBlKGZpbHRlcihjdXJyZW50VXNlciA9PiBjdXJyZW50VXNlciAhPT0gbnVsbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBvZiBhIHVzZXIgcHJlZmVyZW5jZSB3aXRoIGdpdmVuIGtleS5cbiAgICogRW1pdHMgaXRzIGluaXRpYWwgdmFsdWUgZmlyc3QgYW5kIHRoZW4gdXBkYXRlZCB2YWx1ZXMgd2hlbiBzZXQgYnkgdXNlci5cbiAgICogQHBhcmFtIGtleSBUaGUgc3RvcmFnZSBrZXkgZm9yIHNlYXJjaGVkIHZhbHVlLlxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIG9mIGEgdXNlciBwcmVmZXJlbmNlLlxuICAgKi9cbiAgb2JzZXJ2ZTxUPihrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiBjb25jYXQoXG4gICAgICB0aGlzLmdldChrZXkpLFxuICAgICAgdGhpcy5wcmVmZXJlbmNlQ2hhbmdlcyQucGlwZShcbiAgICAgICAgZmlsdGVyKGNoYW5nZSA9PiBjaGFuZ2Uua2V5ID09PSBrZXkpLFxuICAgICAgICBtYXAoY2hhbmdlID0+IGNoYW5nZS52YWx1ZSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBPYnNlcnZhYmxlIHZhbHVlIGZvciBzZWFyY2hlZCBrZXkgZm9yIGN1cnJlbnQgdXNlci5cbiAgICogQHBhcmFtIGtleSBUaGUgc3RvcmFnZSBrZXkgZm9yIHNlYXJjaGVkIHZhbHVlLlxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIHdpdGggdGhlIHZhbHVlIG9mIHByZWZlcmVuY2UuXG4gICAqL1xuICBnZXQoa2V5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyLnBpcGUoXG4gICAgICBmaXJzdCgpLFxuICAgICAgc3dpdGNoTWFwKHVzZXIgPT4gdGhpcy5nZXRGb3JVc2VyKGtleSwgdXNlcikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgdmFsdWUgaW4gc3RvcmFnZSBmb3IgY3VycmVudCB1c2VyLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBzdG9yYWdlIGtleSBmb3IgdGhlIHZhbHVlIHRvIGJlIHNldC5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSBzdG9yYWdlIHZhbHVlIHRvIGJlIHNldC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdpdGggc2F2ZWQgdmFsdWUuXG4gICAqL1xuICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKHVzZXIgPT4ge1xuICAgICAgICB0aGlzLnByZWZlcmVuY2VDaGFuZ2VzJC5uZXh0KHsga2V5LCB2YWx1ZSB9KTtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnNldEZvclVzZXIoa2V5LCB2YWx1ZSwgdXNlcikpO1xuICAgICAgfSwgcmVqZWN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gT2JzZXJ2YWJsZSB2YWx1ZSBvZiBzZWFyY2hlZCBrZXkgZm9yIGEgc3BlY2lmaWMgdXNlci5cbiAgICogQHBhcmFtIGtleSBUaGUgc3RvcmFnZSBrZXkgZm9yIHNlYXJjaGVkIHZhbHVlLlxuICAgKiBAcGFyYW0gdXNlciBUaGUgdXNlciBmb3Igd2hvbSB0aGUgc2VhcmNoIGlzIGRvbmUuXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgd2l0aCB0aGUgdmFsdWUgb2YgcHJlZmVyZW5jZS5cbiAgICovXG4gIGdldEZvclVzZXIoa2V5OiBzdHJpbmcsIHVzZXI6IElVc2VyKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCByYXdLZXkgPSB0aGlzLmdldFJhd0tleShrZXksIHVzZXIpO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmdldFN0b3JhZ2UodXNlcik7XG4gICAgcmV0dXJuIGZyb20oc3RvcmFnZS5nZXQocmF3S2V5KSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHZhbHVlIGluIHN0b3JhZ2UgZm9yIGEgc3BlY2lmaWMgdXNlci5cbiAgICogQHBhcmFtIGtleSBUaGUgc3RvcmFnZSBrZXkgZm9yIHRoZSB2YWx1ZSB0byBiZSBzZXQuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RvcmFnZSB2YWx1ZSB0byBiZSBzZXQuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aXRoIHNhdmVkIHZhbHVlLlxuICAgKi9cbiAgc2V0Rm9yVXNlcihrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgdXNlcjogSVVzZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHJhd0tleSA9IHRoaXMuZ2V0UmF3S2V5KGtleSwgdXNlcik7XG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuZ2V0U3RvcmFnZSh1c2VyKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0b3JhZ2Uuc2V0KHJhd0tleSwgdmFsdWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgb2Yga2V5IGNvbmNhdGVuYXRlZCB3aXRoIHVzZXJuYW1lLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBzdG9yYWdlIGtleSBmb3Igc2VhcmNoZWQgdmFsdWUuXG4gICAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIGZvciB3aG9tIHRoZSBzZWFyY2ggaXMgZG9uZS5cbiAgICogQHJldHVybnMgQSBzdHJpbmcgb2Yga2V5IGNvbmNhdGVuYXRlZCB3aXRoIHVzZXJuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSYXdLZXkoa2V5OiBzdHJpbmcsIHVzZXI6IElVc2VyKTogc3RyaW5nIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IHVzZXIudXNlck5hbWUucmVwbGFjZSgvXFwuL2csICdfXycpO1xuICAgIHJldHVybiBgJHtrZXl9JHt1c2VybmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBwcm9wZXIgc3RvcmFnZSBkZXBlbmRpbmcgb24gdGhlIHVzZXIgcm9sZXMuXG4gICAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIGZvciB3aG9tIHRoZSByb2xlIGNoZWNrIGlzIGRvbmUuXG4gICAqIEByZXR1cm5zIEEgcHJvcGVyIHN0b3JhZ2UuXG4gICAqL1xuICBwcml2YXRlIGdldFN0b3JhZ2UodXNlcjogSVVzZXIpOiBVc2VyUHJlZmVyZW5jZXNTdG9yYWdlSW52ZW50b3J5IHwgVXNlclByZWZlcmVuY2VzU3RvcmFnZUxvY2FsIHtcbiAgICByZXR1cm4gdGhpcy51c2VyLmhhc0FsbFJvbGVzKHVzZXIsIFtcbiAgICAgIFBlcm1pc3Npb25zLlJPTEVfSU5WRU5UT1JZX1JFQUQsXG4gICAgICBQZXJtaXNzaW9ucy5ST0xFX0lOVkVOVE9SWV9BRE1JTlxuICAgIF0pIHx8XG4gICAgICB0aGlzLnVzZXIuaGFzQWxsUm9sZXModXNlciwgW1xuICAgICAgICBQZXJtaXNzaW9ucy5ST0xFX01BTkFHRURfT0JKRUNUX0FETUlOLFxuICAgICAgICBQZXJtaXNzaW9ucy5ST0xFX01BTkFHRURfT0JKRUNUX1JFQURcbiAgICAgIF0pXG4gICAgICA/IHRoaXMuc3RvcmFnZS5pbnZlbnRvcnlcbiAgICAgIDogdGhpcy5zdG9yYWdlLmxvY2FsO1xuICB9XG59XG4iXX0=
200
+ }], ctorParameters: () => [{ type: i1.UserService }, { type: i1.InventoryService }, { type: i2.AppStateService }, { type: i3.AlertService }] });
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vY29yZS9jb21tb24vdXNlci1wcmVmZXJlbmNlcy91c2VyLXByZWZlcmVuY2VzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQVMsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVyRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7OztBQUcxRixNQUFNLE9BQU8sc0JBQXNCO0lBU2pDLFlBQ1UsSUFBaUIsRUFDakIsU0FBMkIsRUFDM0IsUUFBeUIsRUFDekIsS0FBbUI7UUFIbkIsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNqQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixVQUFLLEdBQUwsS0FBSyxDQUFjO1FBWDdCLHVCQUFrQixHQUE0QixJQUFJLE9BQU8sRUFBRSxDQUFD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Qyx5QkFBeUI7Z0JBQ3JDLFdBQVcsQ0FBQyx3QkFBd0I7YUFDckMsQ0FBQztZQUNGLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7WUFDeEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFTyxLQUFLLENBQUMscUJBQXFCO1FBQ2pDLE1BQU0sV0FBVyxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzRCxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUNoRCxXQUFXLEVBQ1gsV0FBVyxDQUFDLDhCQUE4QixDQUMzQyxDQUFDO1FBQ0YsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsS0FBSyxRQUFRLENBQUM7UUFDN0UsSUFBSSxDQUFDLHdCQUF3QixJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ2hELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFDbEMsQ0FBQzsrR0FqTlUsc0JBQXNCO21IQUF0QixzQkFBc0IsY0FEVCxNQUFNOzs0RkFDbkIsc0JBQXNCO2tCQURsQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEludmVudG9yeVNlcnZpY2UsIElVc2VyLCBVc2VyU2VydmljZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IGNvbmNhdCwgZmlyc3RWYWx1ZUZyb20sIGZyb20sIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgZmlyc3QsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQXBwU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vdWktc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZXNTdG9yYWdlTG9jYWwgfSBmcm9tICcuL3VzZXItcHJlZmVyZW5jZXMtc3RvcmFnZS1sb2NhbCc7XG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZXNTdG9yYWdlSW52ZW50b3J5IH0gZnJvbSAnLi91c2VyLXByZWZlcmVuY2VzLXN0b3JlLWludmVudG9yeSc7XG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZSB9IGZyb20gJy4vdXNlci1wcmVmZXJlbmNlLm1vZGVsJztcbmltcG9ydCB7IFBlcm1pc3Npb25zIH0gZnJvbSAnLi4vcGVybWlzc2lvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hbGVydC9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlc1N0b3JhZ2VDdXJyZW50VXNlciB9IGZyb20gJy4vdXNlci1wcmVmZXJlbmNlcy1zdG9yZS1jdXJyZW50LXVzZXInO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFVzZXJQcmVmZXJlbmNlc1NlcnZpY2Uge1xuICBjdXJyZW50VXNlcjogT2JzZXJ2YWJsZTxJVXNlcj47XG4gIHByZWZlcmVuY2VDaGFuZ2VzJDogU3ViamVjdDxVc2VyUHJlZmVyZW5jZT4gPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHN0b3JhZ2U6IHtcbiAgICBsb2NhbDogVXNlclByZWZlcmVuY2VzU3RvcmFnZUxvY2FsO1xuICAgIGludmVudG9yeTogVXNlclByZWZlcmVuY2VzU3RvcmFnZUludmVudG9yeTtcbiAgICBjdXJyZW50VXNlcjogVXNlclByZWZlcmVuY2VzU3RvcmFnZUN1cnJlbnRVc2VyO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdXNlcjogVXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbnZlbnRvcnk6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcHBTdGF0ZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnQ6IEFsZXJ0U2VydmljZVxuICApIHtcbiAgICB0aGlzLnN0b3JhZ2UgPSB7XG4gICAgICBsb2NhbDogbmV3IFVzZXJQcmVmZXJlbmNlc1N0b3JhZ2VMb2NhbCgpLFxuICAgICAgaW52ZW50b3J5OiBuZXcgVXNlclByZWZlcmVuY2VzU3RvcmFnZUludmVudG9yeSh0aGlzLmludmVudG9yeSksXG4gICAgICBjdXJyZW50VXNlcjogbmV3IFVzZXJQcmVmZXJlbmNlc1N0b3JhZ2VDdXJyZW50VXNlcih0aGlzLnVzZXIsIHRoaXMuYXBwU3RhdGUpXG4gICAgfTtcbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gdGhpcy5hcHBTdGF0ZS5jdXJyZW50VXNlci5waXBlKGZpbHRlcihjdXJyZW50VXNlciA9PiBjdXJyZW50VXNlciAhPT0gbnVsbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSBvZiBhIHVzZXIgcHJlZmVyZW5jZSB3aXRoIGdpdmVuIGtleS5cbiAgICogRW1pdHMgaXRzIGluaXRpYWwgdmFsdWUgZmlyc3QgYW5kIHRoZW4gdXBkYXRlZCB2YWx1ZXMgd2hlbiBzZXQgYnkgdXNlci5cbiAgICogQHBhcmFtIGtleSBUaGUgc3RvcmFnZSBrZXkgZm9yIHNlYXJjaGVkIHZhbHVlLlxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIG9mIGEgdXNlciBwcmVmZXJlbmNlLlxuICAgKi9cbiAgb2JzZXJ2ZTxUPihrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiBjb25jYXQoXG4gICAgICB0aGlzLmdldChrZXkpLFxuICAgICAgdGhpcy5wcmVmZXJlbmNlQ2hhbmdlcyQucGlwZShcbiAgICAgICAgZmlsdGVyKGNoYW5nZSA9PiBjaGFuZ2Uua2V5ID09PSBrZXkpLFxuICAgICAgICBtYXAoY2hhbmdlID0+IGNoYW5nZS52YWx1ZSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBPYnNlcnZhYmxlIHZhbHVlIGZvciBzZWFyY2hlZCBrZXkgZm9yIGN1cnJlbnQgdXNlci5cbiAgICogQHBhcmFtIGtleSBUaGUgc3RvcmFnZSBrZXkgZm9yIHNlYXJjaGVkIHZhbHVlLlxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIHdpdGggdGhlIHZhbHVlIG9mIHByZWZlcmVuY2UuXG4gICAqL1xuICBnZXQoa2V5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyLnBpcGUoXG4gICAgICBmaXJzdCgpLFxuICAgICAgc3dpdGNoTWFwKHVzZXIgPT4gdGhpcy5nZXRGb3JDdXJyZW50VXNlcihrZXksIHVzZXIpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHZhbHVlIGluIHN0b3JhZ2UgZm9yIGN1cnJlbnQgdXNlci5cbiAgICogQHBhcmFtIGtleSBUaGUgc3RvcmFnZSBrZXkgZm9yIHRoZSB2YWx1ZSB0byBiZSBzZXQuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RvcmFnZSB2YWx1ZSB0byBiZSBzZXQuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aXRoIHNhdmVkIHZhbHVlLlxuICAgKi9cbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLnByZWZlcmVuY2VDaGFuZ2VzJC5uZXh0KHsga2V5LCB2YWx1ZSB9KTtcbiAgICByZXR1cm4gdGhpcy5zZXRGb3JDdXJyZW50VXNlcihrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gT2JzZXJ2YWJsZSB2YWx1ZSBvZiBzZWFyY2hlZCBrZXkgZm9yIGEgc3BlY2lmaWMgdXNlci5cbiAgICogQHBhcmFtIGtleSBUaGUgc3RvcmFnZSBrZXkgZm9yIHNlYXJjaGVkIHZhbHVlLlxuICAgKiBAcGFyYW0gdXNlciBUaGUgdXNlciBmb3Igd2hvbSB0aGUgc2VhcmNoIGlzIGRvbmUuXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgd2l0aCB0aGUgdmFsdWUgb2YgcHJlZmVyZW5jZS5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlcyBkZXByYWN0ZWQgaW52ZW50b3J5IGFwcHJvYWNoLiBVc2UgZ2V0IGluc3RlYWQuXG4gICAqL1xuICBnZXRGb3JVc2VyKGtleTogc3RyaW5nLCB1c2VyOiBJVXNlcik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgcmF3S2V5ID0gdGhpcy5nZXRUcmFuc2Zvcm1lZFJhd0tleShrZXksIHVzZXIpO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmdldFN0b3JhZ2UodXNlcik7XG4gICAgcmV0dXJuIGZyb20oc3RvcmFnZS5nZXQocmF3S2V5KSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHZhbHVlIGluIHN0b3JhZ2UgZm9yIGEgc3BlY2lmaWMgdXNlci5cbiAgICogQHBhcmFtIGtleSBUaGUgc3RvcmFnZSBrZXkgZm9yIHRoZSB2YWx1ZSB0byBiZSBzZXQuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RvcmFnZSB2YWx1ZSB0byBiZSBzZXQuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aXRoIHNhdmVkIHZhbHVlLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2VzIGRlcHJlY2F0ZWQgaW52ZW50b3J5IGFwcHJvYWNoLiBVc2Ugc2V0IGluc3RlYWQuXG4gICAqL1xuICBzZXRGb3JVc2VyKGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCB1c2VyOiBJVXNlcik6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcmF3S2V5ID0gdGhpcy5nZXRUcmFuc2Zvcm1lZFJhd0tleShrZXksIHVzZXIpO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmdldFN0b3JhZ2UodXNlcik7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdG9yYWdlLnNldChyYXdLZXksIHZhbHVlKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZhbHVlIG9mIHNlYXJjaGVkIGtleSBmb3IgY3VycmVudCB1c2VyLlxuICAgKiBJZiBwcmVmZXJlbmNlIGlzIG5vdCBmb3VuZCBpbiB1c2VyJ3MgY3VzdG9tUHJvcGVydGllcywgaXQgd2lsbCB0cnkgdG8gZ2V0IGl0IGZyb20gaW52ZW50b3J5IG9yIGxvY2FsIHN0b3JhZ2UgYW5kXG4gICAqIHVwZGF0ZSB1c2VyJ3MgY3VzdG9tUHJvcGVydGllcyB3aXRoIHRoZSB2YWx1ZSBhbmQgcmV0dXJuIHRoYXQgdmFsdWUuXG4gICAqIEBwYXJhbSBrZXkgVGhlIHByZWZlcmVuY2Uga2V5IGZvciBzZWFyY2hlZCB2YWx1ZS5cbiAgICogQHBhcmFtIHVzZXIgVGhlIHVzZXIgZm9yIHdob20gdGhlIHNlYXJjaCBpcyBkb25lLlxuICAgKiBAcmV0dXJucyBBIFByb21pc2Ugd2l0aCB0aGUgdmFsdWUgb2YgcHJlZmVyZW5jZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0Rm9yQ3VycmVudFVzZXIoa2V5OiBzdHJpbmcsIHVzZXI6IElVc2VyKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlclN0b3JhZ2UgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRVc2VyU3RvcmFnZSgpO1xuICAgIGNvbnN0IGN1c3RvbVByb3BlcnRpZXNLZXkgPSB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNLZXkoa2V5KTtcbiAgICBjb25zdCBjdXJyZW50VXNlckhhc0tleVByb3BlcnR5ID1cbiAgICAgIGN1cnJlbnRVc2VyU3RvcmFnZSAmJiAoYXdhaXQgY3VycmVudFVzZXJTdG9yYWdlLmhhc0tleShjdXN0b21Qcm9wZXJ0aWVzS2V5KSk7XG4gICAgaWYgKGN1cnJlbnRVc2VySGFzS2V5UHJvcGVydHkpIHtcbiAgICAgIHJldHVybiBhd2FpdCBjdXJyZW50VXNlclN0b3JhZ2UuZ2V0KGN1c3RvbVByb3BlcnRpZXNLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsb2NhbE9ySW52ZW50b3J5U3RvcmFnZSA9IHRoaXMuZ2V0U3RvcmFnZSh1c2VyKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUmF3S2V5ID0gdGhpcy5nZXRUcmFuc2Zvcm1lZFJhd0tleShrZXksIHVzZXIpO1xuICAgICAgY29uc3QgcmF3S2V5ID0gdGhpcy5nZXRSYXdLZXkoa2V5LCB1c2VyKTtcblxuICAgICAgY29uc3QgdmFsdWVGcm9tU3RvcmFnZSA9XG4gICAgICAgIChhd2FpdCBsb2NhbE9ySW52ZW50b3J5U3RvcmFnZS5nZXQodHJhbnNmb3JtZWRSYXdLZXkpKSB8fFxuICAgICAgICAoYXdhaXQgbG9jYWxPckludmVudG9yeVN0b3JhZ2UuZ2V0KHJhd0tleSkpO1xuICAgICAgaWYgKHZhbHVlRnJvbVN0b3JhZ2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY3VycmVudFVzZXJTdG9yYWdlPy5zZXQoY3VzdG9tUHJvcGVydGllc0tleSwgdmFsdWVGcm9tU3RvcmFnZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZUZyb21TdG9yYWdlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgdmFsdWUgZm9yIGN1cnJlbnQgdXNlci5cbiAgICogQHBhcmFtIGtleSBUaGUgcHJlZmVyZW5jZSBrZXkgZm9yIHRoZSB2YWx1ZSB0byBiZSBzZXQuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgcHJlZmVyZW5jZSB2YWx1ZSB0byBiZSBzZXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNldEZvckN1cnJlbnRVc2VyKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJTdG9yYWdlID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXNlclN0b3JhZ2UoKTtcbiAgICBjb25zdCB1c2VyUHJlZmVyZW5jZXNLZXkgPSB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNLZXkoa2V5KTtcbiAgICBpZiAoY3VycmVudFVzZXJTdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjdXJyZW50VXNlclN0b3JhZ2Uuc2V0KHVzZXJQcmVmZXJlbmNlc0tleSwgdmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmFsZXJ0LmFkZFNlcnZlckZhaWx1cmUoZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICAgIGNvbnN0IHJhd0tleSA9IHRoaXMuZ2V0UmF3S2V5KGtleSwgdXNlcik7XG4gICAgICB0aGlzLnN0b3JhZ2UubG9jYWwuc2V0KHJhd0tleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgb2Yga2V5IGNvbmNhdGVuYXRlZCB3aXRoIHVzZXJuYW1lLlxuICAgKiBVc2VkIGJ5IGRlcHJlY2F0ZWQgaW52ZXRvcnkgc3RvcmFnZSBhcHByb2FjaCBhbmQgZm9yIGxlZnRvdmVycyBpbiBsb2NhbCBzdG9yYWdlLlxuICAgKiBJdCB3YXMgdXNlZCB0byBzdG9yZSBwcmVmZXJlbmNlcyBmb3Igc3BlY2lmaWMgdXNlcnMgYW5kIGl0IGFzIHJlcGxhY2luZyBcIi5cIiB3aXRoIFwiX19cIlxuICAgKiBiZWNhdXNlIG9mIE1vbmdvREIgcmVzdHJpY3Rpb25zLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBzdG9yYWdlIGtleSBmb3Igc2VhcmNoZWQgdmFsdWUuXG4gICAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIGZvciB3aG9tIHRoZSBzZWFyY2ggaXMgZG9uZS5cbiAgICogQHJldHVybnMgQSBzdHJpbmcgb2Yga2V5IGNvbmNhdGVuYXRlZCB3aXRoIHVzZXJuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUcmFuc2Zvcm1lZFJhd0tleShrZXk6IHN0cmluZywgdXNlcjogSVVzZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gdXNlci51c2VyTmFtZS5yZXBsYWNlKC9cXC4vZywgJ19fJyk7XG4gICAgcmV0dXJuIGAke2tleX0ke3VzZXJuYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RyaW5nIG9mIGtleSBjb25jYXRlbmF0ZWQgd2l0aCB1c2VybmFtZS5cbiAgICogVXNlZCBieSBsb2NhbCBzdG9yYWdlLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBzdG9yYWdlIGtleSBmb3Igc2VhcmNoZWQgdmFsdWUuXG4gICAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIGZvciB3aG9tIHRoZSBzZWFyY2ggaXMgZG9uZS5cbiAgICogQHJldHVybnMgQSBzdHJpbmcgb2Yga2V5IGNvbmNhdGVuYXRlZCB3aXRoIHVzZXJuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSYXdLZXkoa2V5OiBzdHJpbmcsIHVzZXI6IElVc2VyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7a2V5fSR7dXNlci51c2VyTmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGtleSBmb3IgdXNlciBwcmVmZXJlbmNlcy4gVXNlZCBjdXJyZW50IHVzZXIgY3VzdG9tUHJvcGVydGllcy5cbiAgICogQHBhcmFtIGtleSBUaGUgc3RvcmFnZSBrZXkgZm9yIHNlYXJjaGVkIHZhbHVlLlxuICAgKiBAcmV0dXJucyBBIGtleSBmb3IgdXNlciBwcmVmZXJlbmNlcy5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q3VzdG9tUHJvcGVydGllc0tleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBjOHlfVXNlclByZWZlcmVuY2UtJHtrZXl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcHJvcGVyIHN0b3JhZ2UgZGVwZW5kaW5nIG9uIHRoZSB1c2VyIHJvbGVzLlxuICAgKiBAcGFyYW0gdXNlciBUaGUgdXNlciBmb3Igd2hvbSB0aGUgcm9sZSBjaGVjayBpcyBkb25lLlxuICAgKiBAcmV0dXJucyBBIHByb3BlciBzdG9yYWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTdG9yYWdlKHVzZXI6IElVc2VyKTogVXNlclByZWZlcmVuY2VzU3RvcmFnZUludmVudG9yeSB8IFVzZXJQcmVmZXJlbmNlc1N0b3JhZ2VMb2NhbCB7XG4gICAgcmV0dXJuIHRoaXMudXNlci5oYXNBbGxSb2xlcyh1c2VyLCBbXG4gICAgICBQZXJtaXNzaW9ucy5ST0xFX0lOVkVOVE9SWV9SRUFELFxuICAgICAgUGVybWlzc2lvbnMuUk9MRV9JTlZFTlRPUllfQURNSU5cbiAgICBdKSB8fFxuICAgICAgdGhpcy51c2VyLmhhc0FsbFJvbGVzKHVzZXIsIFtcbiAgICAgICAgUGVybWlzc2lvbnMuUk9MRV9NQU5BR0VEX09CSkVDVF9BRE1JTixcbiAgICAgICAgUGVybWlzc2lvbnMuUk9MRV9NQU5BR0VEX09CSkVDVF9SRUFEXG4gICAgICBdKVxuICAgICAgPyB0aGlzLnN0b3JhZ2UuaW52ZW50b3J5XG4gICAgICA6IHRoaXMuc3RvcmFnZS5sb2NhbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q3VycmVudFVzZXJTdG9yYWdlKCk6IFByb21pc2U8VXNlclByZWZlcmVuY2VzU3RvcmFnZUN1cnJlbnRVc2VyPiB7XG4gICAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICBjb25zdCBoYXNSb2xlVG9FZGl0Q3VycmVudFVzZXIgPSB0aGlzLnVzZXIuaGFzUm9sZShcbiAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgUGVybWlzc2lvbnMuUk9MRV9VU0VSX01BTkFHRU1FTlRfT1dOX0FETUlOXG4gICAgKTtcbiAgICBjb25zdCBpc0V4dGVybmFsVXNlciA9IGN1cnJlbnRVc2VyLmN1c3RvbVByb3BlcnRpZXM/LnVzZXJPcmlnaW4gPT09ICdPQVVUSDInO1xuICAgIGlmICghaGFzUm9sZVRvRWRpdEN1cnJlbnRVc2VyIHx8IGlzRXh0ZXJuYWxVc2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5jdXJyZW50VXNlcjtcbiAgfVxufVxuIl19
@@ -1,4 +1,4 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
1
+ import { Component, EventEmitter, Input, Output, inject } from '@angular/core';
2
2
  import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
3
3
  import { gettext } from '../i18n';
4
4
  import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
@@ -10,6 +10,7 @@ import { C8yTranslateDirective } from '../i18n/c8y-translate.directive';
10
10
  import { RequiredInputPlaceholderDirective } from '../forms/required-input-placeholder.directive';
11
11
  import { BsDatepickerModule } from 'ngx-bootstrap/datepicker';
12
12
  import { C8yTranslatePipe } from '../i18n/c8y-translate.pipe';
13
+ import { DateFormatService } from '../common/date-format.service';
13
14
  import * as i0 from "@angular/core";
14
15
  import * as i1 from "ngx-bootstrap/dropdown";
15
16
  import * as i2 from "@angular/forms";
@@ -18,8 +19,12 @@ export class DatePickerComponent {
18
19
  constructor() {
19
20
  this.onDateSelected = new EventEmitter();
20
21
  this.placeholder = gettext('Filter by date…');
22
+ this.dateFormatService = inject(DateFormatService);
21
23
  }
22
24
  ngOnInit() {
25
+ if (!this.dateInputFormat) {
26
+ this.dateInputFormat = this.dateFormatService.getDateFormat();
27
+ }
23
28
  this.fgDatePicker = new FormGroup({
24
29
  dateFrom: new FormControl(),
25
30
  dateTo: new FormControl()
@@ -40,7 +45,7 @@ export class DatePickerComponent {
40
45
  this.dateTo = null;
41
46
  }
42
47
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
43
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatePickerComponent, isStandalone: true, selector: "c8y-date-picker", inputs: { placeholder: "placeholder" }, outputs: { onDateSelected: "onDateSelected" }, ngImport: i0, template: "<div\n dropdown\n class=\"c8y-child-assets-selector dropdown\"\n #datefilter=\"bs-dropdown\"\n [insideClick]=\"true\"\n placement=\"bottom left\"\n [cdkTrapFocus]=\"datefilter.isOpen\"\n >\n <button\n id=\"date-range\"\n dropdownToggle\n title=\"{{ 'Date filter' | translate }}\"\n type=\"button\"\n class=\"btn dropdown-toggle d-flex a-i-center c8y-dropdown\"\n >\n <i c8yIcon=\"calendar-o\" class=\"m-r-4 text-primary\"></i>\n <span class=\"text-truncate\">\n <span *ngIf=\"dateFrom\">\n <span class=\"text-label-small\">{{ 'From`date`' | translate }}</span>\n {{ dateFrom | date }}\n </span>\n <span *ngIf=\"dateTo\">\n <span class=\"text-label-small\">{{ 'To`date`' | translate }}</span>\n {{ dateTo | date }}\n </span>\n <em *ngIf=\"!dateFrom && !dateTo\" class=\"text-muted\">\n {{ placeholder }}\n </em>\n </span>\n </button>\n\n <form [formGroup]=\"fgDatePicker\"\n id=\"dropdown-date-range\"\n *dropdownMenu\n class=\"dropdown-menu\">\n <div class=\"dropdown-form p-b-0\">\n <c8y-form-group class=\"form-group-sm\">\n <label for=\"dateFrom\" class=\"text-medium m-b-4\" translate>Date from</label>\n <div class=\"form-group datepicker d-block m-b-0\">\n <input\n id=\"dateFrom\"\n formControlName=\"dateFrom\"\n class=\"form-control fit-w text-left\"\n placeholder=\"{{ 'Date from' | translate }}\"\n bsDatepicker\n [maxDate]=\"dateTo\"\n (bsValueChange)=\"dateFrom = $event\"\n [bsConfig]=\"{ customTodayClass: 'today', returnFocusToInput: true }\"\n />\n </div>\n </c8y-form-group>\n <c8y-form-group class=\"form-group form-group-sm \">\n <label for=\"dateTo\" translate>Date to</label>\n <div class=\"form-group datepicker m-l-0 d-block m-b-0 \">\n <input\n name=\"dateTo\"\n id=\"dateTo\"\n formControlName=\"dateTo\"\n class=\"form-control fit-w text-left\"\n placeholder=\"{{ 'Date to' | translate }}\"\n bsDatepicker\n [minDate]=\"dateFrom\"\n (bsValueChange)=\"dateTo = $event\"\n [bsConfig]=\"{ customTodayClass: 'today', returnFocusToInput: true }\"\n />\n </div>\n </c8y-form-group>\n </div>\n <div class=\"p-16 d-flex separator-top gap-8\">\n <button\n title=\"{{ 'Clear selection' | translate }}\"\n type=\"button\"\n class=\"btn btn-default btn-sm flex-grow\"\n (click)=\"clearFilter(); datefilter.isOpen = !datefilter.isOpen\"\n >\n {{ 'Clear`selection`' | translate }}\n </button>\n <button\n [disabled]=\"!fgDatePicker.get('dateFrom').value && !fgDatePicker.get('dateTo').value\"\n title=\"{{ 'Apply selection' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary btn-sm flex-grow\"\n (click)=\"filter(); datefilter.isOpen = !datefilter.isOpen\"\n >\n {{ 'Apply`selection`' | translate }}\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "ngmodule", type: BsDropdownModule }, { kind: "directive", type: i1.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "ngmodule", type: BsDatepickerModule }, { kind: "directive", type: i3.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i3.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
48
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatePickerComponent, isStandalone: true, selector: "c8y-date-picker", inputs: { placeholder: "placeholder", dateInputFormat: "dateInputFormat" }, outputs: { onDateSelected: "onDateSelected" }, ngImport: i0, template: "<div\n dropdown\n class=\"c8y-child-assets-selector dropdown\"\n #datefilter=\"bs-dropdown\"\n [insideClick]=\"true\"\n placement=\"bottom left\"\n [cdkTrapFocus]=\"datefilter.isOpen\"\n >\n <button\n id=\"date-range\"\n dropdownToggle\n title=\"{{ 'Date filter' | translate }}\"\n type=\"button\"\n class=\"btn dropdown-toggle d-flex a-i-center c8y-dropdown\"\n >\n <i c8yIcon=\"calendar-o\" class=\"m-r-4 text-primary\"></i>\n <span class=\"text-truncate\">\n <span *ngIf=\"dateFrom\">\n <span class=\"text-label-small\">{{ 'From`date`' | translate }}</span>\n {{ dateFrom | date }}\n </span>\n <span *ngIf=\"dateTo\">\n <span class=\"text-label-small\">{{ 'To`date`' | translate }}</span>\n {{ dateTo | date }}\n </span>\n <em *ngIf=\"!dateFrom && !dateTo\" class=\"text-muted\">\n {{ placeholder }}\n </em>\n </span>\n </button>\n\n <form [formGroup]=\"fgDatePicker\"\n id=\"dropdown-date-range\"\n *dropdownMenu\n class=\"dropdown-menu\">\n <div class=\"dropdown-form p-b-0\">\n <c8y-form-group class=\"form-group-sm\">\n <label for=\"dateFrom\" class=\"text-medium m-b-4\" translate>Date from</label>\n <div class=\"form-group datepicker d-block m-b-0\">\n <input\n id=\"dateFrom\"\n formControlName=\"dateFrom\"\n class=\"form-control fit-w text-left\"\n placeholder=\"{{ 'Date from' | translate }}\"\n bsDatepicker\n [maxDate]=\"dateTo\"\n (bsValueChange)=\"dateFrom = $event\"\n [bsConfig]=\"{ customTodayClass: 'today', returnFocusToInput: true, dateInputFormat: dateInputFormat }\"\n />\n </div>\n </c8y-form-group>\n <c8y-form-group class=\"form-group form-group-sm \">\n <label for=\"dateTo\" translate>Date to</label>\n <div class=\"form-group datepicker m-l-0 d-block m-b-0 \">\n <input\n name=\"dateTo\"\n id=\"dateTo\"\n formControlName=\"dateTo\"\n class=\"form-control fit-w text-left\"\n placeholder=\"{{ 'Date to' | translate }}\"\n bsDatepicker\n [minDate]=\"dateFrom\"\n (bsValueChange)=\"dateTo = $event\"\n [bsConfig]=\"{ customTodayClass: 'today', returnFocusToInput: true, dateInputFormat: dateInputFormat }\"\n />\n </div>\n </c8y-form-group>\n </div>\n <div class=\"p-16 d-flex separator-top gap-8\">\n <button\n title=\"{{ 'Clear selection' | translate }}\"\n type=\"button\"\n class=\"btn btn-default btn-sm flex-grow\"\n (click)=\"clearFilter(); datefilter.isOpen = !datefilter.isOpen\"\n >\n {{ 'Clear`selection`' | translate }}\n </button>\n <button\n [disabled]=\"!fgDatePicker.get('dateFrom').value && !fgDatePicker.get('dateTo').value\"\n title=\"{{ 'Apply selection' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary btn-sm flex-grow\"\n (click)=\"filter(); datefilter.isOpen = !datefilter.isOpen\"\n >\n {{ 'Apply`selection`' | translate }}\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "ngmodule", type: BsDropdownModule }, { kind: "directive", type: i1.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "ngmodule", type: BsDatepickerModule }, { kind: "directive", type: i3.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i3.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
44
49
  }
45
50
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatePickerComponent, decorators: [{
46
51
  type: Component,
@@ -57,10 +62,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
57
62
  BsDatepickerModule,
58
63
  DatePipe,
59
64
  C8yTranslatePipe
60
- ], template: "<div\n dropdown\n class=\"c8y-child-assets-selector dropdown\"\n #datefilter=\"bs-dropdown\"\n [insideClick]=\"true\"\n placement=\"bottom left\"\n [cdkTrapFocus]=\"datefilter.isOpen\"\n >\n <button\n id=\"date-range\"\n dropdownToggle\n title=\"{{ 'Date filter' | translate }}\"\n type=\"button\"\n class=\"btn dropdown-toggle d-flex a-i-center c8y-dropdown\"\n >\n <i c8yIcon=\"calendar-o\" class=\"m-r-4 text-primary\"></i>\n <span class=\"text-truncate\">\n <span *ngIf=\"dateFrom\">\n <span class=\"text-label-small\">{{ 'From`date`' | translate }}</span>\n {{ dateFrom | date }}\n </span>\n <span *ngIf=\"dateTo\">\n <span class=\"text-label-small\">{{ 'To`date`' | translate }}</span>\n {{ dateTo | date }}\n </span>\n <em *ngIf=\"!dateFrom && !dateTo\" class=\"text-muted\">\n {{ placeholder }}\n </em>\n </span>\n </button>\n\n <form [formGroup]=\"fgDatePicker\"\n id=\"dropdown-date-range\"\n *dropdownMenu\n class=\"dropdown-menu\">\n <div class=\"dropdown-form p-b-0\">\n <c8y-form-group class=\"form-group-sm\">\n <label for=\"dateFrom\" class=\"text-medium m-b-4\" translate>Date from</label>\n <div class=\"form-group datepicker d-block m-b-0\">\n <input\n id=\"dateFrom\"\n formControlName=\"dateFrom\"\n class=\"form-control fit-w text-left\"\n placeholder=\"{{ 'Date from' | translate }}\"\n bsDatepicker\n [maxDate]=\"dateTo\"\n (bsValueChange)=\"dateFrom = $event\"\n [bsConfig]=\"{ customTodayClass: 'today', returnFocusToInput: true }\"\n />\n </div>\n </c8y-form-group>\n <c8y-form-group class=\"form-group form-group-sm \">\n <label for=\"dateTo\" translate>Date to</label>\n <div class=\"form-group datepicker m-l-0 d-block m-b-0 \">\n <input\n name=\"dateTo\"\n id=\"dateTo\"\n formControlName=\"dateTo\"\n class=\"form-control fit-w text-left\"\n placeholder=\"{{ 'Date to' | translate }}\"\n bsDatepicker\n [minDate]=\"dateFrom\"\n (bsValueChange)=\"dateTo = $event\"\n [bsConfig]=\"{ customTodayClass: 'today', returnFocusToInput: true }\"\n />\n </div>\n </c8y-form-group>\n </div>\n <div class=\"p-16 d-flex separator-top gap-8\">\n <button\n title=\"{{ 'Clear selection' | translate }}\"\n type=\"button\"\n class=\"btn btn-default btn-sm flex-grow\"\n (click)=\"clearFilter(); datefilter.isOpen = !datefilter.isOpen\"\n >\n {{ 'Clear`selection`' | translate }}\n </button>\n <button\n [disabled]=\"!fgDatePicker.get('dateFrom').value && !fgDatePicker.get('dateTo').value\"\n title=\"{{ 'Apply selection' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary btn-sm flex-grow\"\n (click)=\"filter(); datefilter.isOpen = !datefilter.isOpen\"\n >\n {{ 'Apply`selection`' | translate }}\n </button>\n </div>\n </form>\n</div>\n" }]
65
+ ], template: "<div\n dropdown\n class=\"c8y-child-assets-selector dropdown\"\n #datefilter=\"bs-dropdown\"\n [insideClick]=\"true\"\n placement=\"bottom left\"\n [cdkTrapFocus]=\"datefilter.isOpen\"\n >\n <button\n id=\"date-range\"\n dropdownToggle\n title=\"{{ 'Date filter' | translate }}\"\n type=\"button\"\n class=\"btn dropdown-toggle d-flex a-i-center c8y-dropdown\"\n >\n <i c8yIcon=\"calendar-o\" class=\"m-r-4 text-primary\"></i>\n <span class=\"text-truncate\">\n <span *ngIf=\"dateFrom\">\n <span class=\"text-label-small\">{{ 'From`date`' | translate }}</span>\n {{ dateFrom | date }}\n </span>\n <span *ngIf=\"dateTo\">\n <span class=\"text-label-small\">{{ 'To`date`' | translate }}</span>\n {{ dateTo | date }}\n </span>\n <em *ngIf=\"!dateFrom && !dateTo\" class=\"text-muted\">\n {{ placeholder }}\n </em>\n </span>\n </button>\n\n <form [formGroup]=\"fgDatePicker\"\n id=\"dropdown-date-range\"\n *dropdownMenu\n class=\"dropdown-menu\">\n <div class=\"dropdown-form p-b-0\">\n <c8y-form-group class=\"form-group-sm\">\n <label for=\"dateFrom\" class=\"text-medium m-b-4\" translate>Date from</label>\n <div class=\"form-group datepicker d-block m-b-0\">\n <input\n id=\"dateFrom\"\n formControlName=\"dateFrom\"\n class=\"form-control fit-w text-left\"\n placeholder=\"{{ 'Date from' | translate }}\"\n bsDatepicker\n [maxDate]=\"dateTo\"\n (bsValueChange)=\"dateFrom = $event\"\n [bsConfig]=\"{ customTodayClass: 'today', returnFocusToInput: true, dateInputFormat: dateInputFormat }\"\n />\n </div>\n </c8y-form-group>\n <c8y-form-group class=\"form-group form-group-sm \">\n <label for=\"dateTo\" translate>Date to</label>\n <div class=\"form-group datepicker m-l-0 d-block m-b-0 \">\n <input\n name=\"dateTo\"\n id=\"dateTo\"\n formControlName=\"dateTo\"\n class=\"form-control fit-w text-left\"\n placeholder=\"{{ 'Date to' | translate }}\"\n bsDatepicker\n [minDate]=\"dateFrom\"\n (bsValueChange)=\"dateTo = $event\"\n [bsConfig]=\"{ customTodayClass: 'today', returnFocusToInput: true, dateInputFormat: dateInputFormat }\"\n />\n </div>\n </c8y-form-group>\n </div>\n <div class=\"p-16 d-flex separator-top gap-8\">\n <button\n title=\"{{ 'Clear selection' | translate }}\"\n type=\"button\"\n class=\"btn btn-default btn-sm flex-grow\"\n (click)=\"clearFilter(); datefilter.isOpen = !datefilter.isOpen\"\n >\n {{ 'Clear`selection`' | translate }}\n </button>\n <button\n [disabled]=\"!fgDatePicker.get('dateFrom').value && !fgDatePicker.get('dateTo').value\"\n title=\"{{ 'Apply selection' | translate }}\"\n type=\"submit\"\n class=\"btn btn-primary btn-sm flex-grow\"\n (click)=\"filter(); datefilter.isOpen = !datefilter.isOpen\"\n >\n {{ 'Apply`selection`' | translate }}\n </button>\n </div>\n </form>\n</div>\n" }]
61
66
  }], propDecorators: { onDateSelected: [{
62
67
  type: Output
63
68
  }], placeholder: [{
64
69
  type: Input
70
+ }], dateInputFormat: [{
71
+ type: Input
65
72
  }] } });
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDbEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7O0FBcUI5RCxNQUFNLE9BQU8sbUJBQW1CO0lBbkJoQztRQW9CWSxtQkFBYyxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXpFLGdCQUFXLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7S0E0QjFDO0lBdEJDLFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksU0FBUyxDQUFDO1lBQ2hDLFFBQVEsRUFBRSxJQUFJLFdBQVcsRUFBRTtZQUMzQixNQUFNLEVBQUUsSUFBSSxXQUFXLEVBQUU7U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3hELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3RELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7WUFDekIsUUFBUSxFQUFFLElBQUk7WUFDZCxNQUFNLEVBQUUsSUFBSTtTQUNiLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7K0dBOUJVLG1CQUFtQjttR0FBbkIsbUJBQW1CLGtLQ2pDaEMsMm1HQXlGQSwyQ0R0RUksZ0JBQWdCLHVsQkFDaEIsWUFBWSw0SUFDWixhQUFhLDJFQUNiLElBQUksNEZBQ0osV0FBVywycEJBQ1gsbUJBQW1CLGdWQUNuQixrQkFBa0IsdUlBQ2xCLHFCQUFxQix3RUFDckIsaUNBQWlDLG1GQUNqQyxrQkFBa0IsaWhCQUNsQixRQUFRLHdDQUNSLGdCQUFnQjs7NEZBR1AsbUJBQW1CO2tCQW5CL0IsU0FBUzsrQkFDRSxpQkFBaUIsY0FFZixJQUFJLFdBQ1A7d0JBQ1AsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsSUFBSTt3QkFDSixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsa0JBQWtCO3dCQUNsQixxQkFBcUI7d0JBQ3JCLGlDQUFpQzt3QkFDakMsa0JBQWtCO3dCQUNsQixRQUFRO3dCQUNSLGdCQUFnQjtxQkFDakI7OEJBR1MsY0FBYztzQkFBdkIsTUFBTTtnQkFFUCxXQUFXO3NCQURWLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFBpY2tlZERhdGVzIH0gZnJvbSAnLi9kYXRlLXBpY2tlci5tb2RlbCc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vaTE4bic7XG5pbXBvcnQgeyBCc0Ryb3Bkb3duTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9kcm9wZG93bic7XG5pbXBvcnQgeyBDZGtUcmFwRm9jdXMgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBJY29uRGlyZWN0aXZlIH0gZnJvbSAnLi4vY29tbW9uL2ljb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IE5nSWYsIERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1Hcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm1zL2Zvcm0tZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IEM4eVRyYW5zbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4uL2kxOG4vYzh5LXRyYW5zbGF0ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgUmVxdWlyZWRJbnB1dFBsYWNlaG9sZGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vZm9ybXMvcmVxdWlyZWQtaW5wdXQtcGxhY2Vob2xkZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEJzRGF0ZXBpY2tlck1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBDOHlUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi4vaTE4bi9jOHktdHJhbnNsYXRlLnBpcGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGF0ZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQnNEcm9wZG93bk1vZHVsZSxcbiAgICBDZGtUcmFwRm9jdXMsXG4gICAgSWNvbkRpcmVjdGl2ZSxcbiAgICBOZ0lmLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybUdyb3VwQ29tcG9uZW50LFxuICAgIEM4eVRyYW5zbGF0ZURpcmVjdGl2ZSxcbiAgICBSZXF1aXJlZElucHV0UGxhY2Vob2xkZXJEaXJlY3RpdmUsXG4gICAgQnNEYXRlcGlja2VyTW9kdWxlLFxuICAgIERhdGVQaXBlLFxuICAgIEM4eVRyYW5zbGF0ZVBpcGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQE91dHB1dCgpIG9uRGF0ZVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8UGlja2VkRGF0ZXM+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlciA9IGdldHRleHQoJ0ZpbHRlciBieSBkYXRl4oCmJyk7XG5cbiAgZGF0ZUZyb206IHN0cmluZztcbiAgZGF0ZVRvOiBzdHJpbmc7XG4gIGZnRGF0ZVBpY2tlcjogRm9ybUdyb3VwO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZmdEYXRlUGlja2VyID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICBkYXRlRnJvbTogbmV3IEZvcm1Db250cm9sKCksXG4gICAgICBkYXRlVG86IG5ldyBGb3JtQ29udHJvbCgpXG4gICAgfSk7XG4gIH1cblxuICBmaWx0ZXIoKSB7XG4gICAgdGhpcy5vbkRhdGVTZWxlY3RlZC5lbWl0KHRoaXMuZmdEYXRlUGlja2VyLnZhbHVlKTtcbiAgICB0aGlzLmRhdGVGcm9tID0gdGhpcy5mZ0RhdGVQaWNrZXIuZ2V0KCdkYXRlRnJvbScpLnZhbHVlO1xuICAgIHRoaXMuZGF0ZVRvID0gdGhpcy5mZ0RhdGVQaWNrZXIuZ2V0KCdkYXRlVG8nKS52YWx1ZTtcbiAgfVxuXG4gIGNsZWFyRmlsdGVyKCkge1xuICAgIHRoaXMuZmdEYXRlUGlja2VyLnNldFZhbHVlKHtcbiAgICAgIGRhdGVGcm9tOiBudWxsLFxuICAgICAgZGF0ZVRvOiBudWxsXG4gICAgfSk7XG4gICAgdGhpcy5vbkRhdGVTZWxlY3RlZC5lbWl0KG51bGwpO1xuICAgIHRoaXMuZGF0ZUZyb20gPSBudWxsO1xuICAgIHRoaXMuZGF0ZVRvID0gbnVsbDtcbiAgfVxufVxuIiwiPGRpdlxuICBkcm9wZG93blxuICBjbGFzcz1cImM4eS1jaGlsZC1hc3NldHMtc2VsZWN0b3IgZHJvcGRvd25cIlxuICAjZGF0ZWZpbHRlcj1cImJzLWRyb3Bkb3duXCJcbiAgW2luc2lkZUNsaWNrXT1cInRydWVcIlxuICBwbGFjZW1lbnQ9XCJib3R0b20gbGVmdFwiXG4gIFtjZGtUcmFwRm9jdXNdPVwiZGF0ZWZpbHRlci5pc09wZW5cIlxuICA+XG4gIDxidXR0b25cbiAgICBpZD1cImRhdGUtcmFuZ2VcIlxuICAgIGRyb3Bkb3duVG9nZ2xlXG4gICAgdGl0bGU9XCJ7eyAnRGF0ZSBmaWx0ZXInIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cImJ0biBkcm9wZG93bi10b2dnbGUgZC1mbGV4IGEtaS1jZW50ZXIgYzh5LWRyb3Bkb3duXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJjYWxlbmRhci1vXCIgY2xhc3M9XCJtLXItNCB0ZXh0LXByaW1hcnlcIj48L2k+XG4gICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cImRhdGVGcm9tXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbFwiPnt7ICdGcm9tYGRhdGVgJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAge3sgZGF0ZUZyb20gfCBkYXRlIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cImRhdGVUb1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGxcIj57eyAnVG9gZGF0ZWAnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICB7eyBkYXRlVG8gfCBkYXRlIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8ZW0gKm5nSWY9XCIhZGF0ZUZyb20gJiYgIWRhdGVUb1wiIGNsYXNzPVwidGV4dC1tdXRlZFwiPlxuICAgICAgICB7eyBwbGFjZWhvbGRlciB9fVxuICAgICAgPC9lbT5cbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuXG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZmdEYXRlUGlja2VyXCJcbiAgICBpZD1cImRyb3Bkb3duLWRhdGUtcmFuZ2VcIlxuICAgICpkcm9wZG93bk1lbnVcbiAgICBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZm9ybSBwLWItMFwiPlxuICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwiZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiZGF0ZUZyb21cIiBjbGFzcz1cInRleHQtbWVkaXVtIG0tYi00XCIgdHJhbnNsYXRlPkRhdGUgZnJvbTwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGRhdGVwaWNrZXIgZC1ibG9jayBtLWItMFwiPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgaWQ9XCJkYXRlRnJvbVwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkYXRlRnJvbVwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmaXQtdyB0ZXh0LWxlZnRcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnRGF0ZSBmcm9tJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBic0RhdGVwaWNrZXJcbiAgICAgICAgICAgIFttYXhEYXRlXT1cImRhdGVUb1wiXG4gICAgICAgICAgICAoYnNWYWx1ZUNoYW5nZSk9XCJkYXRlRnJvbSA9ICRldmVudFwiXG4gICAgICAgICAgICBbYnNDb25maWddPVwieyBjdXN0b21Ub2RheUNsYXNzOiAndG9kYXknLCByZXR1cm5Gb2N1c1RvSW5wdXQ6IHRydWUgfVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwiZm9ybS1ncm91cCBmb3JtLWdyb3VwLXNtIFwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiZGF0ZVRvXCIgdHJhbnNsYXRlPkRhdGUgdG88L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBkYXRlcGlja2VyIG0tbC0wIGQtYmxvY2sgbS1iLTAgXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBuYW1lPVwiZGF0ZVRvXCJcbiAgICAgICAgICAgIGlkPVwiZGF0ZVRvXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRhdGVUb1wiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmaXQtdyB0ZXh0LWxlZnRcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnRGF0ZSB0bycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgYnNEYXRlcGlja2VyXG4gICAgICAgICAgICBbbWluRGF0ZV09XCJkYXRlRnJvbVwiXG4gICAgICAgICAgICAoYnNWYWx1ZUNoYW5nZSk9XCJkYXRlVG8gPSAkZXZlbnRcIlxuICAgICAgICAgICAgW2JzQ29uZmlnXT1cInsgY3VzdG9tVG9kYXlDbGFzczogJ3RvZGF5JywgcmV0dXJuRm9jdXNUb0lucHV0OiB0cnVlIH1cIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicC0xNiBkLWZsZXggc2VwYXJhdG9yLXRvcCBnYXAtOFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0aXRsZT1cInt7ICdDbGVhciBzZWxlY3Rpb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBmbGV4LWdyb3dcIlxuICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWx0ZXIoKTsgZGF0ZWZpbHRlci5pc09wZW4gPSAhZGF0ZWZpbHRlci5pc09wZW5cIlxuICAgICAgPlxuICAgICAgICB7eyAnQ2xlYXJgc2VsZWN0aW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBbZGlzYWJsZWRdPVwiIWZnRGF0ZVBpY2tlci5nZXQoJ2RhdGVGcm9tJykudmFsdWUgJiYgIWZnRGF0ZVBpY2tlci5nZXQoJ2RhdGVUbycpLnZhbHVlXCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnQXBwbHkgc2VsZWN0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gZmxleC1ncm93XCJcbiAgICAgICAgKGNsaWNrKT1cImZpbHRlcigpOyBkYXRlZmlsdGVyLmlzT3BlbiA9ICFkYXRlZmlsdGVyLmlzT3BlblwiXG4gICAgICA+XG4gICAgICAgIHt7ICdBcHBseWBzZWxlY3Rpb25gJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvZGl2PlxuIl19
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTFGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7OztBQXFCbEUsTUFBTSxPQUFPLG1CQUFtQjtJQW5CaEM7UUFvQlksbUJBQWMsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV6RSxnQkFBVyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBUWpDLHNCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0tBMkJ2RDtJQXpCQyxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFNBQVMsQ0FBQztZQUNoQyxRQUFRLEVBQUUsSUFBSSxXQUFXLEVBQUU7WUFDM0IsTUFBTSxFQUFFLElBQUksV0FBVyxFQUFFO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN4RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN0RCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO1lBQ3pCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsTUFBTSxFQUFFLElBQUk7U0FDYixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDOytHQXJDVSxtQkFBbUI7bUdBQW5CLG1CQUFtQixzTUNsQ2hDLCtxR0F5RkEsMkNEckVJLGdCQUFnQix1bEJBQ2hCLFlBQVksNElBQ1osYUFBYSwyRUFDYixJQUFJLDRGQUNKLFdBQVcsMnBCQUNYLG1CQUFtQixnVkFDbkIsa0JBQWtCLHVJQUNsQixxQkFBcUIsd0VBQ3JCLGlDQUFpQyxtRkFDakMsa0JBQWtCLGloQkFDbEIsUUFBUSx3Q0FDUixnQkFBZ0I7OzRGQUdQLG1CQUFtQjtrQkFuQi9CLFNBQVM7K0JBQ0UsaUJBQWlCLGNBRWYsSUFBSSxXQUNQO3dCQUNQLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixhQUFhO3dCQUNiLElBQUk7d0JBQ0osV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIscUJBQXFCO3dCQUNyQixpQ0FBaUM7d0JBQ2pDLGtCQUFrQjt3QkFDbEIsUUFBUTt3QkFDUixnQkFBZ0I7cUJBQ2pCOzhCQUdTLGNBQWM7c0JBQXZCLE1BQU07Z0JBRVAsV0FBVztzQkFEVixLQUFLO2dCQUdOLGVBQWU7c0JBRGQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIElucHV0LCBPdXRwdXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBQaWNrZWREYXRlcyB9IGZyb20gJy4vZGF0ZS1waWNrZXIubW9kZWwnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJy4uL2kxOG4nO1xuaW1wb3J0IHsgQnNEcm9wZG93bk1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvZHJvcGRvd24nO1xuaW1wb3J0IHsgQ2RrVHJhcEZvY3VzIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgSWNvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2NvbW1vbi9pY29uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOZ0lmLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3JtR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9mb3Jtcy9mb3JtLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDOHlUcmFuc2xhdGVEaXJlY3RpdmUgfSBmcm9tICcuLi9pMThuL2M4eS10cmFuc2xhdGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IFJlcXVpcmVkSW5wdXRQbGFjZWhvbGRlckRpcmVjdGl2ZSB9IGZyb20gJy4uL2Zvcm1zL3JlcXVpcmVkLWlucHV0LXBsYWNlaG9sZGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBCc0RhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgQzh5VHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uL2kxOG4vYzh5LXRyYW5zbGF0ZS5waXBlJztcbmltcG9ydCB7IERhdGVGb3JtYXRTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL2RhdGUtZm9ybWF0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGF0ZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQnNEcm9wZG93bk1vZHVsZSxcbiAgICBDZGtUcmFwRm9jdXMsXG4gICAgSWNvbkRpcmVjdGl2ZSxcbiAgICBOZ0lmLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybUdyb3VwQ29tcG9uZW50LFxuICAgIEM4eVRyYW5zbGF0ZURpcmVjdGl2ZSxcbiAgICBSZXF1aXJlZElucHV0UGxhY2Vob2xkZXJEaXJlY3RpdmUsXG4gICAgQnNEYXRlcGlja2VyTW9kdWxlLFxuICAgIERhdGVQaXBlLFxuICAgIEM4eVRyYW5zbGF0ZVBpcGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQE91dHB1dCgpIG9uRGF0ZVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8UGlja2VkRGF0ZXM+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlciA9IGdldHRleHQoJ0ZpbHRlciBieSBkYXRl4oCmJyk7XG4gIEBJbnB1dCgpXG4gIGRhdGVJbnB1dEZvcm1hdDogc3RyaW5nO1xuXG4gIGRhdGVGcm9tOiBzdHJpbmc7XG4gIGRhdGVUbzogc3RyaW5nO1xuICBmZ0RhdGVQaWNrZXI6IEZvcm1Hcm91cDtcblxuICBwcml2YXRlIGRhdGVGb3JtYXRTZXJ2aWNlID0gaW5qZWN0KERhdGVGb3JtYXRTZXJ2aWNlKTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuZGF0ZUlucHV0Rm9ybWF0KSB7XG4gICAgICB0aGlzLmRhdGVJbnB1dEZvcm1hdCA9IHRoaXMuZGF0ZUZvcm1hdFNlcnZpY2UuZ2V0RGF0ZUZvcm1hdCgpO1xuICAgIH1cbiAgICB0aGlzLmZnRGF0ZVBpY2tlciA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgZGF0ZUZyb206IG5ldyBGb3JtQ29udHJvbCgpLFxuICAgICAgZGF0ZVRvOiBuZXcgRm9ybUNvbnRyb2woKVxuICAgIH0pO1xuICB9XG5cbiAgZmlsdGVyKCkge1xuICAgIHRoaXMub25EYXRlU2VsZWN0ZWQuZW1pdCh0aGlzLmZnRGF0ZVBpY2tlci52YWx1ZSk7XG4gICAgdGhpcy5kYXRlRnJvbSA9IHRoaXMuZmdEYXRlUGlja2VyLmdldCgnZGF0ZUZyb20nKS52YWx1ZTtcbiAgICB0aGlzLmRhdGVUbyA9IHRoaXMuZmdEYXRlUGlja2VyLmdldCgnZGF0ZVRvJykudmFsdWU7XG4gIH1cblxuICBjbGVhckZpbHRlcigpIHtcbiAgICB0aGlzLmZnRGF0ZVBpY2tlci5zZXRWYWx1ZSh7XG4gICAgICBkYXRlRnJvbTogbnVsbCxcbiAgICAgIGRhdGVUbzogbnVsbFxuICAgIH0pO1xuICAgIHRoaXMub25EYXRlU2VsZWN0ZWQuZW1pdChudWxsKTtcbiAgICB0aGlzLmRhdGVGcm9tID0gbnVsbDtcbiAgICB0aGlzLmRhdGVUbyA9IG51bGw7XG4gIH1cbn1cbiIsIjxkaXZcbiAgZHJvcGRvd25cbiAgY2xhc3M9XCJjOHktY2hpbGQtYXNzZXRzLXNlbGVjdG9yIGRyb3Bkb3duXCJcbiAgI2RhdGVmaWx0ZXI9XCJicy1kcm9wZG93blwiXG4gIFtpbnNpZGVDbGlja109XCJ0cnVlXCJcbiAgcGxhY2VtZW50PVwiYm90dG9tIGxlZnRcIlxuICBbY2RrVHJhcEZvY3VzXT1cImRhdGVmaWx0ZXIuaXNPcGVuXCJcbiAgPlxuICA8YnV0dG9uXG4gICAgaWQ9XCJkYXRlLXJhbmdlXCJcbiAgICBkcm9wZG93blRvZ2dsZVxuICAgIHRpdGxlPVwie3sgJ0RhdGUgZmlsdGVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJidG4gZHJvcGRvd24tdG9nZ2xlIGQtZmxleCBhLWktY2VudGVyIGM4eS1kcm9wZG93blwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwiY2FsZW5kYXItb1wiIGNsYXNzPVwibS1yLTQgdGV4dC1wcmltYXJ5XCI+PC9pPlxuICAgIDxzcGFuIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPlxuICAgICAgPHNwYW4gKm5nSWY9XCJkYXRlRnJvbVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGxcIj57eyAnRnJvbWBkYXRlYCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIHt7IGRhdGVGcm9tIHwgZGF0ZSB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJkYXRlVG9cIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCI+e3sgJ1RvYGRhdGVgJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAge3sgZGF0ZVRvIHwgZGF0ZSB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPGVtICpuZ0lmPVwiIWRhdGVGcm9tICYmICFkYXRlVG9cIiBjbGFzcz1cInRleHQtbXV0ZWRcIj5cbiAgICAgICAge3sgcGxhY2Vob2xkZXIgfX1cbiAgICAgIDwvZW0+XG4gICAgPC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZnRGF0ZVBpY2tlclwiXG4gICAgaWQ9XCJkcm9wZG93bi1kYXRlLXJhbmdlXCJcbiAgICAqZHJvcGRvd25NZW51XG4gICAgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWZvcm0gcC1iLTBcIj5cbiAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cImZvcm0tZ3JvdXAtc21cIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImRhdGVGcm9tXCIgY2xhc3M9XCJ0ZXh0LW1lZGl1bSBtLWItNFwiIHRyYW5zbGF0ZT5EYXRlIGZyb208L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBkYXRlcGlja2VyIGQtYmxvY2sgbS1iLTBcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGlkPVwiZGF0ZUZyb21cIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0ZUZyb21cIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZml0LXcgdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ0RhdGUgZnJvbScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgYnNEYXRlcGlja2VyXG4gICAgICAgICAgICBbbWF4RGF0ZV09XCJkYXRlVG9cIlxuICAgICAgICAgICAgKGJzVmFsdWVDaGFuZ2UpPVwiZGF0ZUZyb20gPSAkZXZlbnRcIlxuICAgICAgICAgICAgW2JzQ29uZmlnXT1cInsgY3VzdG9tVG9kYXlDbGFzczogJ3RvZGF5JywgcmV0dXJuRm9jdXNUb0lucHV0OiB0cnVlLCBkYXRlSW5wdXRGb3JtYXQ6IGRhdGVJbnB1dEZvcm1hdCB9XCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJmb3JtLWdyb3VwIGZvcm0tZ3JvdXAtc20gXCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJkYXRlVG9cIiB0cmFuc2xhdGU+RGF0ZSB0bzwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGRhdGVwaWNrZXIgbS1sLTAgZC1ibG9jayBtLWItMCBcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG5hbWU9XCJkYXRlVG9cIlxuICAgICAgICAgICAgaWQ9XCJkYXRlVG9cIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0ZVRvXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZpdC13IHRleHQtbGVmdFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdEYXRlIHRvJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBic0RhdGVwaWNrZXJcbiAgICAgICAgICAgIFttaW5EYXRlXT1cImRhdGVGcm9tXCJcbiAgICAgICAgICAgIChic1ZhbHVlQ2hhbmdlKT1cImRhdGVUbyA9ICRldmVudFwiXG4gICAgICAgICAgICBbYnNDb25maWddPVwieyBjdXN0b21Ub2RheUNsYXNzOiAndG9kYXknLCByZXR1cm5Gb2N1c1RvSW5wdXQ6IHRydWUsIGRhdGVJbnB1dEZvcm1hdDogZGF0ZUlucHV0Rm9ybWF0IH1cIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicC0xNiBkLWZsZXggc2VwYXJhdG9yLXRvcCBnYXAtOFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0aXRsZT1cInt7ICdDbGVhciBzZWxlY3Rpb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBmbGV4LWdyb3dcIlxuICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWx0ZXIoKTsgZGF0ZWZpbHRlci5pc09wZW4gPSAhZGF0ZWZpbHRlci5pc09wZW5cIlxuICAgICAgPlxuICAgICAgICB7eyAnQ2xlYXJgc2VsZWN0aW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBbZGlzYWJsZWRdPVwiIWZnRGF0ZVBpY2tlci5nZXQoJ2RhdGVGcm9tJykudmFsdWUgJiYgIWZnRGF0ZVBpY2tlci5nZXQoJ2RhdGVUbycpLnZhbHVlXCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnQXBwbHkgc2VsZWN0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gZmxleC1ncm93XCJcbiAgICAgICAgKGNsaWNrKT1cImZpbHRlcigpOyBkYXRlZmlsdGVyLmlzT3BlbiA9ICFkYXRlZmlsdGVyLmlzT3BlblwiXG4gICAgICA+XG4gICAgICAgIHt7ICdBcHBseWBzZWxlY3Rpb25gJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvZGl2PlxuIl19