@sumaris-net/ngx-components 4.0.0-rc9 → 18.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 (555) hide show
  1. package/README.md +5 -3
  2. package/doc/changelog.md +522 -280
  3. package/esm2022/public_api.mjs +38 -19
  4. package/esm2022/src/app/admin/admin-routing.module.mjs +10 -17
  5. package/esm2022/src/app/admin/admin.module.mjs +7 -9
  6. package/esm2022/src/app/admin/services/filter/person.filter.mjs +3 -3
  7. package/esm2022/src/app/admin/services/person.service.mjs +31 -31
  8. package/esm2022/src/app/admin/services/validator/person.validator.mjs +10 -10
  9. package/esm2022/src/app/admin/users/users.mjs +22 -19
  10. package/esm2022/src/app/admin/users/users.module.mjs +8 -10
  11. package/esm2022/src/app/core/about/about.modal.mjs +7 -7
  12. package/esm2022/src/app/core/about/about.module.mjs +8 -21
  13. package/esm2022/src/app/core/account/account.module.mjs +28 -18
  14. package/esm2022/src/app/core/account/account.page.mjs +19 -5
  15. package/esm2022/src/app/core/account/new-token.form.mjs +106 -0
  16. package/esm2022/src/app/core/account/new-token.modal.mjs +27 -86
  17. package/esm2022/src/app/core/account/password/change-password.form.mjs +60 -0
  18. package/esm2022/src/app/core/account/password/change-password.module.mjs +22 -0
  19. package/esm2022/src/app/core/account/password/change-password.page.mjs +144 -0
  20. package/esm2022/src/app/core/account/token.table.mjs +47 -35
  21. package/esm2022/src/app/core/auth/auth.form.mjs +47 -28
  22. package/esm2022/src/app/core/auth/auth.modal.mjs +6 -6
  23. package/esm2022/src/app/core/auth/auth.module.mjs +22 -13
  24. package/esm2022/src/app/core/auth/reset-password.modal.mjs +77 -0
  25. package/esm2022/src/app/core/core.module.mjs +28 -61
  26. package/esm2022/src/app/core/core.testing.module.mjs +34 -20
  27. package/esm2022/src/app/core/form/array/form-array.mjs +325 -0
  28. package/esm2022/src/app/core/form/array/testing/form-array-test.module.mjs +23 -0
  29. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +94 -0
  30. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +24 -25
  31. package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +9 -13
  32. package/esm2022/src/app/core/form/entity/editor.class.mjs +64 -517
  33. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +26 -42
  34. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +42 -41
  35. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +5 -5
  36. package/esm2022/src/app/core/form/entity/entity.module.mjs +8 -14
  37. package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +194 -0
  38. package/esm2022/src/app/core/form/form-container.class.mjs +327 -0
  39. package/esm2022/src/app/core/form/form.class.mjs +39 -56
  40. package/esm2022/src/app/core/form/form.module.mjs +14 -10
  41. package/esm2022/src/app/core/form/form.utils.mjs +23 -306
  42. package/esm2022/src/app/core/form/list/list.form.mjs +16 -14
  43. package/esm2022/src/app/core/form/list/list.module.mjs +8 -12
  44. package/esm2022/src/app/core/form/properties/properties.form.mjs +139 -57
  45. package/esm2022/src/app/core/form/properties/properties.module.mjs +9 -15
  46. package/esm2022/src/app/core/form/properties/properties.table.mjs +27 -28
  47. package/esm2022/src/app/core/form/properties/properties.utils.mjs +60 -0
  48. package/esm2022/src/app/core/form/properties/property.validator.mjs +23 -9
  49. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +18 -18
  50. package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +8 -24
  51. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +15 -15
  52. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +10 -25
  53. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +7 -7
  54. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +9 -13
  55. package/esm2022/src/app/core/form/username/username.form.mjs +52 -0
  56. package/esm2022/src/app/core/form/username/username.module.mjs +20 -0
  57. package/esm2022/src/app/core/graphql/graphql.module.mjs +8 -16
  58. package/esm2022/src/app/core/graphql/graphql.service.mjs +101 -109
  59. package/esm2022/src/app/core/graphql/graphql.utils.mjs +12 -11
  60. package/esm2022/src/app/core/home/home.mjs +81 -52
  61. package/esm2022/src/app/core/home/home.module.mjs +10 -19
  62. package/esm2022/src/app/core/icon/icon.component.mjs +5 -5
  63. package/esm2022/src/app/core/icon/icon.module.mjs +8 -17
  64. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +33 -37
  65. package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +9 -13
  66. package/esm2022/src/app/core/menu/menu.component.mjs +5 -6
  67. package/esm2022/src/app/core/menu/menu.model.mjs +21 -18
  68. package/esm2022/src/app/core/menu/menu.module.mjs +7 -12
  69. package/esm2022/src/app/core/menu/menu.service.mjs +44 -60
  70. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +4 -4
  71. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +7 -6
  72. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +43 -8
  73. package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +8 -27
  74. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +6 -7
  75. package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +9 -13
  76. package/esm2022/src/app/core/peer/select-peer.modal.mjs +31 -21
  77. package/esm2022/src/app/core/peer/select-peer.module.mjs +11 -23
  78. package/esm2022/src/app/core/register/register-confirm.page.mjs +18 -16
  79. package/esm2022/src/app/core/register/register.form.mjs +7 -7
  80. package/esm2022/src/app/core/register/register.modal.mjs +6 -6
  81. package/esm2022/src/app/core/register/register.module.mjs +8 -29
  82. package/esm2022/src/app/core/services/account.service.mjs +272 -170
  83. package/esm2022/src/app/core/services/auth-guard.service.mjs +13 -15
  84. package/esm2022/src/app/core/services/base-entity-service.class.mjs +55 -64
  85. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +39 -33
  86. package/esm2022/src/app/core/services/base58.mjs +8 -4
  87. package/esm2022/src/app/core/services/config/core.config.mjs +88 -37
  88. package/esm2022/src/app/core/services/config.service.mjs +81 -62
  89. package/esm2022/src/app/core/services/crypto.service.mjs +11 -11
  90. package/esm2022/src/app/core/services/errors.mjs +6 -5
  91. package/esm2022/src/app/core/services/local-settings.service.mjs +58 -44
  92. package/esm2022/src/app/core/services/model/account.model.mjs +12 -17
  93. package/esm2022/src/app/core/services/model/config.model.mjs +7 -7
  94. package/esm2022/src/app/core/services/model/department.model.mjs +3 -2
  95. package/esm2022/src/app/core/services/model/entity.decorators.mjs +6 -6
  96. package/esm2022/src/app/core/services/model/entity.model.mjs +27 -31
  97. package/esm2022/src/app/core/services/model/filter.model.mjs +12 -15
  98. package/esm2022/src/app/core/services/model/history.model.mjs +1 -1
  99. package/esm2022/src/app/core/services/model/model.enum.mjs +2 -2
  100. package/esm2022/src/app/core/services/model/peer.model.mjs +19 -9
  101. package/esm2022/src/app/core/services/model/person.model.mjs +26 -22
  102. package/esm2022/src/app/core/services/model/referential.model.mjs +36 -23
  103. package/esm2022/src/app/core/services/model/settings.model.mjs +2 -1
  104. package/esm2022/src/app/core/services/model/token.model.mjs +7 -3
  105. package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +3 -7
  106. package/esm2022/src/app/core/services/network.service.mjs +99 -76
  107. package/esm2022/src/app/core/services/network.types.mjs +1 -1
  108. package/esm2022/src/app/core/services/network.utils.mjs +3 -3
  109. package/esm2022/src/app/core/services/pipes/account.pipes.mjs +11 -11
  110. package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +6 -6
  111. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +9 -9
  112. package/esm2022/src/app/core/services/pipes/pipes.module.mjs +54 -0
  113. package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +21 -0
  114. package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +11 -11
  115. package/esm2022/src/app/core/services/platform.service.mjs +102 -69
  116. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +32 -39
  117. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +36 -45
  118. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +1 -1
  119. package/esm2022/src/app/core/services/testing/referential.validator.mjs +14 -14
  120. package/esm2022/src/app/core/services/validator/account.validator.mjs +5 -5
  121. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +5 -5
  122. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +34 -20
  123. package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +5 -5
  124. package/esm2022/src/app/core/services/validator/user-token.validator.mjs +12 -9
  125. package/esm2022/src/app/core/settings/settings.module.mjs +9 -21
  126. package/esm2022/src/app/core/settings/settings.page.mjs +76 -63
  127. package/esm2022/src/app/core/table/async-table.class.mjs +219 -201
  128. package/esm2022/src/app/core/table/column/actions-column.component.mjs +127 -0
  129. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +117 -0
  130. package/esm2022/src/app/core/table/column/row-field.component.mjs +116 -0
  131. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +31 -33
  132. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +36 -36
  133. package/esm2022/src/app/core/table/memory-table.class.mjs +5 -5
  134. package/esm2022/src/app/core/table/table-select-columns.component.mjs +8 -8
  135. package/esm2022/src/app/core/table/table.class.mjs +193 -152
  136. package/esm2022/src/app/core/table/table.model.mjs +1 -1
  137. package/esm2022/src/app/core/table/table.module.mjs +35 -24
  138. package/esm2022/src/app/core/table/table.pipes.mjs +77 -0
  139. package/esm2022/src/app/core/table/table.utils.mjs +2 -4
  140. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +9 -5
  141. package/esm2022/src/app/core/table/testing/table.testing.mjs +116 -78
  142. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +8 -33
  143. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +4 -4
  144. package/esm2022/src/app/core/table/testing/table2.testing.mjs +68 -45
  145. package/esm2022/src/app/shared/alerts.mjs +49 -45
  146. package/esm2022/src/app/shared/audio/audio.mjs +25 -27
  147. package/esm2022/src/app/shared/audio/audio.testing.mjs +5 -5
  148. package/esm2022/src/app/shared/audio/audio.testing.module.mjs +10 -25
  149. package/esm2022/src/app/shared/capacitor/keyboard.mjs +5 -5
  150. package/esm2022/src/app/shared/capacitor/plugins.mjs +1 -1
  151. package/esm2022/src/app/shared/constants.mjs +9 -4
  152. package/esm2022/src/app/shared/dates.mjs +18 -16
  153. package/esm2022/src/app/shared/debug/debug-service.class.mjs +1 -1
  154. package/esm2022/src/app/shared/debug/debug.component.mjs +5 -5
  155. package/esm2022/src/app/shared/debug/debug.module.mjs +8 -29
  156. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +8 -15
  157. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +4 -4
  158. package/esm2022/src/app/shared/directives/directives.module.mjs +8 -29
  159. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +4 -4
  160. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +4 -4
  161. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +4 -4
  162. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +4 -4
  163. package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +4 -4
  164. package/esm2022/src/app/shared/events.mjs +6 -8
  165. package/esm2022/src/app/shared/file/csv.utils.mjs +38 -18
  166. package/esm2022/src/app/shared/file/file.service.mjs +11 -15
  167. package/esm2022/src/app/shared/file/file.utils.mjs +13 -11
  168. package/esm2022/src/app/shared/file/images.utils.mjs +29 -4
  169. package/esm2022/src/app/shared/file/json.utils.mjs +11 -4
  170. package/esm2022/src/app/shared/file/uri.utils.mjs +1 -1
  171. package/esm2022/src/app/shared/focusable.mjs +1 -1
  172. package/esm2022/src/app/shared/form/field.component.mjs +69 -43
  173. package/esm2022/src/app/shared/form/field.model.mjs +4 -4
  174. package/esm2022/src/app/shared/form/loading-spinner.mjs +5 -5
  175. package/esm2022/src/app/shared/forms.mjs +116 -43
  176. package/esm2022/src/app/shared/functions.mjs +139 -71
  177. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +14 -14
  178. package/esm2022/src/app/shared/gesture/gesture-config.mjs +10 -10
  179. package/esm2022/src/app/shared/gesture/hammer.utils.mjs +1 -1
  180. package/esm2022/src/app/shared/graph/colors.utils.mjs +14 -18
  181. package/esm2022/src/app/shared/graph/graph-colors.mjs +23 -29
  182. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +4 -4
  183. package/esm2022/src/app/shared/help/help.modal.mjs +6 -6
  184. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +5 -5
  185. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +44 -17
  186. package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +9 -27
  187. package/esm2022/src/app/shared/http/http.utils.mjs +15 -11
  188. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +27 -27
  189. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +13 -10
  190. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +1 -1
  191. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +14 -17
  192. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +9 -13
  193. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +14 -11
  194. package/esm2022/src/app/shared/image/image.model.mjs +1 -1
  195. package/esm2022/src/app/shared/image/image.module.mjs +8 -13
  196. package/esm2022/src/app/shared/image/image.service.mjs +14 -12
  197. package/esm2022/src/app/shared/inputs.mjs +52 -20
  198. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +2 -3
  199. package/esm2022/src/app/shared/logging/log-level.model.mjs +1 -1
  200. package/esm2022/src/app/shared/logging/logger.model.mjs +2 -2
  201. package/esm2022/src/app/shared/logging/logging-service.class.mjs +17 -20
  202. package/esm2022/src/app/shared/logging/logging-service.module.mjs +6 -6
  203. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +7 -10
  204. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +348 -238
  205. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +13 -16
  206. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +5 -4
  207. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +51 -37
  208. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +99 -57
  209. package/esm2022/src/app/shared/material/badge/badge.module.mjs +8 -20
  210. package/esm2022/src/app/shared/material/badge/badge.test.mjs +5 -5
  211. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +19 -20
  212. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +209 -104
  213. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +15 -8
  214. package/esm2022/src/app/shared/material/chips/chips.module.mjs +12 -13
  215. package/esm2022/src/app/shared/material/chips/material.chips.mjs +228 -168
  216. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +20 -21
  217. package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +12 -27
  218. package/esm2022/src/app/shared/material/datetime/material.date.mjs +167 -92
  219. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +128 -77
  220. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +297 -165
  221. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +34 -30
  222. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +31 -27
  223. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +26 -23
  224. package/esm2022/src/app/shared/material/duration/duration.module.mjs +11 -16
  225. package/esm2022/src/app/shared/material/duration/duration.utils.mjs +3 -6
  226. package/esm2022/src/app/shared/material/duration/material.duration.mjs +35 -34
  227. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +23 -22
  228. package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +217 -170
  229. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +182 -241
  230. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +10 -15
  231. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +19 -14
  232. package/esm2022/src/app/shared/material/material.animations.mjs +22 -22
  233. package/esm2022/src/app/shared/material/material.config.mjs +3 -0
  234. package/esm2022/src/app/shared/material/material.module.mjs +16 -16
  235. package/esm2022/src/app/shared/material/material.testing.module.mjs +50 -37
  236. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +12 -9
  237. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +4 -4
  238. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +26 -19
  239. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +7 -11
  240. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +8 -8
  241. package/esm2022/src/app/shared/material/testing/common.test.mjs +30 -24
  242. package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +30 -19
  243. package/esm2022/src/app/shared/material/text/text-form.component.mjs +128 -21
  244. package/esm2022/src/app/shared/material/text/text-form.module.mjs +8 -8
  245. package/esm2022/src/app/shared/modules.mjs +1 -1
  246. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +118 -37
  247. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +1 -1
  248. package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +5 -5
  249. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +8 -8
  250. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +74 -0
  251. package/esm2022/src/app/shared/named-filter/testing/named-filter.testing.module.mjs +28 -0
  252. package/esm2022/src/app/shared/observables.mjs +14 -18
  253. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +53 -38
  254. package/esm2022/src/app/shared/pipes/badge.pipes.mjs +24 -0
  255. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +8 -6
  256. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +8 -10
  257. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +15 -15
  258. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +6 -6
  259. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +6 -6
  260. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +6 -13
  261. package/esm2022/src/app/shared/pipes/form.pipes.mjs +72 -47
  262. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +15 -15
  263. package/esm2022/src/app/shared/pipes/html.pipes.mjs +52 -0
  264. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +14 -14
  265. package/esm2022/src/app/shared/pipes/maps.pipe.mjs +17 -17
  266. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +37 -88
  267. package/esm2022/src/app/shared/pipes/math.pipes.mjs +16 -16
  268. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +5 -5
  269. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +6 -6
  270. package/esm2022/src/app/shared/pipes/pipes.module.mjs +117 -137
  271. package/esm2022/src/app/shared/pipes/property.pipes.mjs +86 -47
  272. package/esm2022/src/app/shared/pipes/selection.pipes.mjs +179 -0
  273. package/esm2022/src/app/shared/pipes/string.pipes.mjs +50 -49
  274. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +11 -11
  275. package/esm2022/src/app/shared/pipes/types.pipes.mjs +33 -17
  276. package/esm2022/src/app/shared/platforms.mjs +7 -5
  277. package/esm2022/src/app/shared/rx-state.module.mjs +7 -11
  278. package/esm2022/src/app/shared/services/entity-service.class.mjs +2 -2
  279. package/esm2022/src/app/shared/services/job.utils.mjs +7 -7
  280. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +43 -41
  281. package/esm2022/src/app/shared/services/progress-bar.service.mjs +4 -4
  282. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +11 -14
  283. package/esm2022/src/app/shared/services/startable-service.class.mjs +11 -17
  284. package/esm2022/src/app/shared/services/translate-context.service.mjs +18 -15
  285. package/esm2022/src/app/shared/services/validator-service.class.mjs +1 -1
  286. package/esm2022/src/app/shared/services.mjs +12 -12
  287. package/esm2022/src/app/shared/shared-routing.module.mjs +19 -18
  288. package/esm2022/src/app/shared/shared.module.mjs +29 -28
  289. package/esm2022/src/app/shared/shared.testing.module.mjs +18 -10
  290. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +39 -46
  291. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +8 -12
  292. package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +9 -17
  293. package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +10 -18
  294. package/esm2022/src/app/shared/storage/storage.service.mjs +4 -4
  295. package/esm2022/src/app/shared/storage/storage.utils.mjs +2 -2
  296. package/esm2022/src/app/shared/testing/maskito.test.mjs +41 -0
  297. package/esm2022/src/app/shared/testing/observable.test.mjs +11 -13
  298. package/esm2022/src/app/shared/testing/tests.page.mjs +6 -6
  299. package/esm2022/src/app/shared/toast/toast.testing.mjs +11 -11
  300. package/esm2022/src/app/shared/toast/toast.testing.module.mjs +10 -25
  301. package/esm2022/src/app/shared/toast/toasts.mjs +9 -9
  302. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +10 -8
  303. package/esm2022/src/app/shared/toolbar/toolbar.mjs +31 -32
  304. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +8 -39
  305. package/esm2022/src/app/shared/types.mjs +1 -1
  306. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +12 -12
  307. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +10 -25
  308. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +7 -8
  309. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +21 -19
  310. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +2 -3
  311. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +64 -56
  312. package/esm2022/src/app/shared/validator/validators.mjs +60 -39
  313. package/esm2022/src/app/shared/version/versions.mjs +2 -2
  314. package/esm2022/src/app/social/job/job.module.mjs +8 -27
  315. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +9 -9
  316. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +49 -46
  317. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +10 -13
  318. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +1 -1
  319. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +39 -21
  320. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +6 -11
  321. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +11 -30
  322. package/esm2022/src/app/social/job/testing/job.testing.module.mjs +8 -21
  323. package/esm2022/src/app/social/message/message.form.mjs +5 -5
  324. package/esm2022/src/app/social/message/message.modal.mjs +8 -8
  325. package/esm2022/src/app/social/message/message.model.mjs +8 -8
  326. package/esm2022/src/app/social/message/message.module.mjs +4 -4
  327. package/esm2022/src/app/social/message/message.service.mjs +7 -7
  328. package/esm2022/src/app/social/social.errors.mjs +2 -2
  329. package/esm2022/src/app/social/social.module.mjs +7 -32
  330. package/esm2022/src/app/social/social.testing.module.mjs +9 -20
  331. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +27 -23
  332. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +19 -22
  333. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +47 -23
  334. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +8 -8
  335. package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +8 -21
  336. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +27 -15
  337. package/esm2022/src/app/social/user-event/user-event.model.mjs +1 -1
  338. package/esm2022/src/app/social/user-event/user-event.module.mjs +8 -28
  339. package/esm2022/src/app/social/user-event/user-event.service.mjs +61 -64
  340. package/esm2022/src/environments/environment.class.mjs +9 -1
  341. package/esm2022/src/environments/environment.loader.mjs +5 -11
  342. package/esm2022/src/environments/environment.mjs +19 -11
  343. package/fesm2022/sumaris-net.ngx-components.mjs +16117 -14592
  344. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  345. package/package.json +33 -18
  346. package/public_api.d.ts +30 -22
  347. package/src/app/admin/services/filter/person.filter.d.ts +1 -1
  348. package/src/app/admin/users/users.d.ts +5 -6
  349. package/src/app/core/account/account.module.d.ts +10 -8
  350. package/src/app/core/account/account.page.d.ts +25 -15
  351. package/src/app/core/account/new-token.form.d.ts +29 -0
  352. package/src/app/core/account/new-token.modal.d.ts +9 -21
  353. package/src/app/core/account/password/change-password.form.d.ts +19 -0
  354. package/src/app/core/account/password/change-password.module.d.ts +11 -0
  355. package/src/app/core/account/password/change-password.page.d.ts +36 -0
  356. package/src/app/core/account/token.table.d.ts +7 -5
  357. package/src/app/core/auth/auth.form.d.ts +11 -9
  358. package/src/app/core/auth/auth.module.d.ts +6 -4
  359. package/src/app/core/auth/reset-password.modal.d.ts +26 -0
  360. package/src/app/core/core.module.d.ts +21 -24
  361. package/src/app/core/core.testing.module.d.ts +2 -1
  362. package/src/app/core/form/array/form-array.d.ts +136 -0
  363. package/src/app/core/form/array/testing/form-array-test.module.d.ts +12 -0
  364. package/src/app/core/form/array/testing/form-array.test.d.ts +26 -0
  365. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +2 -3
  366. package/src/app/core/form/entity/editor.class.d.ts +19 -179
  367. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +10 -13
  368. package/src/app/core/form/entity/entity-editor.class.d.ts +12 -17
  369. package/src/app/core/form/entity/entity-metadata.component.d.ts +1 -1
  370. package/src/app/core/form/entity/tab-editor.class.d.ts +70 -0
  371. package/src/app/core/form/form-container.class.d.ts +126 -0
  372. package/src/app/core/form/form.class.d.ts +13 -26
  373. package/src/app/core/form/form.module.d.ts +2 -1
  374. package/src/app/core/form/form.utils.d.ts +60 -145
  375. package/src/app/core/form/list/list.form.d.ts +2 -2
  376. package/src/app/core/form/properties/properties.form.d.ts +34 -12
  377. package/src/app/core/form/properties/properties.table.d.ts +2 -2
  378. package/src/app/core/form/properties/properties.utils.d.ts +27 -0
  379. package/src/app/core/form/properties/property.validator.d.ts +9 -3
  380. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +3 -1
  381. package/src/app/core/form/username/username.form.d.ts +19 -0
  382. package/src/app/core/form/username/username.module.d.ts +9 -0
  383. package/src/app/core/graphql/graphql.module.d.ts +1 -2
  384. package/src/app/core/graphql/graphql.service.d.ts +2 -4
  385. package/src/app/core/home/home.d.ts +26 -6
  386. package/src/app/core/menu/testing/menu-other.testing.d.ts +1 -1
  387. package/src/app/core/menu/testing/menu.testing.d.ts +11 -3
  388. package/src/app/core/peer/select-peer.modal.d.ts +13 -7
  389. package/src/app/core/peer/select-peer.module.d.ts +3 -4
  390. package/src/app/core/services/account.service.d.ts +9 -0
  391. package/src/app/core/services/base-entity-service.class.d.ts +1 -1
  392. package/src/app/core/services/config/core.config.d.ts +12 -1
  393. package/src/app/core/services/config.service.d.ts +4 -3
  394. package/src/app/core/services/errors.d.ts +11 -0
  395. package/src/app/core/services/local-settings.service.d.ts +8 -4
  396. package/src/app/core/services/model/entity.model.d.ts +6 -5
  397. package/src/app/core/services/model/filter.model.d.ts +1 -1
  398. package/src/app/core/services/model/peer.model.d.ts +1 -0
  399. package/src/app/core/services/model/person.model.d.ts +6 -2
  400. package/src/app/core/services/model/referential.model.d.ts +8 -3
  401. package/src/app/core/services/model/settings.model.d.ts +4 -2
  402. package/src/app/core/services/model/token.model.d.ts +1 -0
  403. package/src/app/core/services/model/tree-item-entity.model.d.ts +1 -1
  404. package/src/app/core/services/network.service.d.ts +11 -7
  405. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +1 -1
  406. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +3 -1
  407. package/src/app/core/services/pipes/pipes.module.d.ts +11 -0
  408. package/src/app/core/services/pipes/referential-to-string.pipe.d.ts +13 -0
  409. package/src/app/core/services/platform.service.d.ts +8 -3
  410. package/src/app/core/services/testing/referential-filter.model.d.ts +1 -1
  411. package/src/app/core/services/validator/local-settings.validator.d.ts +6 -2
  412. package/src/app/core/settings/settings.module.d.ts +2 -1
  413. package/src/app/core/settings/settings.page.d.ts +34 -21
  414. package/src/app/core/table/async-table.class.d.ts +22 -17
  415. package/src/app/core/table/column/actions-column.component.d.ts +59 -0
  416. package/src/app/core/table/column/nav-actions-column.component.d.ts +46 -0
  417. package/src/app/core/table/column/row-field.component.d.ts +40 -0
  418. package/src/app/core/table/entities-async-table-datasource.class.d.ts +1 -0
  419. package/src/app/core/table/entities-table-datasource.class.d.ts +1 -0
  420. package/src/app/core/table/table.class.d.ts +14 -11
  421. package/src/app/core/table/table.module.d.ts +8 -4
  422. package/src/app/core/table/table.pipes.d.ts +28 -0
  423. package/src/app/core/table/testing/table.testing.d.ts +12 -13
  424. package/src/app/core/table/testing/table2.testing.d.ts +13 -10
  425. package/src/app/shared/alerts.d.ts +4 -2
  426. package/src/app/shared/constants.d.ts +5 -0
  427. package/src/app/shared/dates.d.ts +12 -5
  428. package/src/app/shared/directives/autofocus.directive.d.ts +0 -1
  429. package/src/app/shared/events.d.ts +1 -1
  430. package/src/app/shared/file/csv.utils.d.ts +5 -0
  431. package/src/app/shared/file/images.utils.d.ts +17 -0
  432. package/src/app/shared/file/json.utils.d.ts +3 -0
  433. package/src/app/shared/form/field.component.d.ts +6 -3
  434. package/src/app/shared/forms.d.ts +32 -0
  435. package/src/app/shared/functions.d.ts +27 -8
  436. package/src/app/shared/graph/graph-colors.d.ts +1 -1
  437. package/src/app/shared/guard/component-dirty.guard.d.ts +1 -6
  438. package/src/app/shared/hotkeys/hotkeys.service.d.ts +17 -3
  439. package/src/app/shared/http/http.utils.d.ts +1 -0
  440. package/src/app/shared/image/gallery/image-gallery.component.d.ts +10 -10
  441. package/src/app/shared/image/gallery/image-gallery.module.d.ts +2 -1
  442. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +2 -2
  443. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +2 -1
  444. package/src/app/shared/inputs.d.ts +7 -5
  445. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +20 -1
  446. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +56 -16
  447. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +1 -1
  448. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +2 -1
  449. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +3 -2
  450. package/src/app/shared/material/badge/badge.directive.d.ts +10 -4
  451. package/src/app/shared/material/boolean/boolean.module.d.ts +15 -14
  452. package/src/app/shared/material/boolean/material.boolean.d.ts +51 -25
  453. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +1 -0
  454. package/src/app/shared/material/chips/chips.module.d.ts +2 -1
  455. package/src/app/shared/material/chips/material.chips.d.ts +46 -21
  456. package/src/app/shared/material/chips/testing/chips.test.d.ts +1 -0
  457. package/src/app/shared/material/datetime/datetime.module.d.ts +1 -1
  458. package/src/app/shared/material/datetime/material.date.d.ts +33 -18
  459. package/src/app/shared/material/datetime/material.dateshort.d.ts +29 -16
  460. package/src/app/shared/material/datetime/material.datetime.d.ts +41 -28
  461. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +3 -3
  462. package/src/app/shared/material/duration/duration.module.d.ts +1 -1
  463. package/src/app/shared/material/duration/material.duration.d.ts +1 -1
  464. package/src/app/shared/material/latlong/latlong.utils.d.ts +9 -1
  465. package/src/app/shared/material/latlong/material.latlong.d.ts +29 -32
  466. package/src/app/shared/material/latlong/material.latlong.module.d.ts +1 -1
  467. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +5 -1
  468. package/src/app/shared/material/material.config.d.ts +3 -0
  469. package/src/app/shared/material/material.module.d.ts +5 -6
  470. package/src/app/shared/material/material.testing.module.d.ts +8 -7
  471. package/src/app/shared/material/swipe/material.swipe.d.ts +4 -3
  472. package/src/app/shared/material/text/testing/text-form.testing.d.ts +10 -4
  473. package/src/app/shared/material/text/text-form.component.d.ts +42 -8
  474. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +30 -14
  475. package/src/app/shared/named-filter/named-filter.service.d.ts +12 -6
  476. package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +34 -0
  477. package/src/app/shared/named-filter/testing/named-filter.testing.module.d.ts +10 -0
  478. package/src/app/shared/pipes/arrays.pipe.d.ts +5 -0
  479. package/src/app/shared/pipes/badge.pipes.d.ts +7 -0
  480. package/src/app/shared/pipes/date-format.pipe.d.ts +3 -2
  481. package/src/app/shared/pipes/form.pipes.d.ts +18 -8
  482. package/src/app/shared/pipes/html.pipes.d.ts +15 -0
  483. package/src/app/shared/pipes/maps.pipe.d.ts +4 -4
  484. package/src/app/shared/pipes/maskito.pipe.d.ts +7 -9
  485. package/src/app/shared/pipes/pipes.module.d.ts +7 -4
  486. package/src/app/shared/pipes/property.pipes.d.ts +24 -3
  487. package/src/app/shared/pipes/selection.pipes.d.ts +62 -0
  488. package/src/app/shared/pipes/string.pipes.d.ts +6 -6
  489. package/src/app/shared/pipes/types.pipes.d.ts +6 -1
  490. package/src/app/shared/services/entity-service.class.d.ts +0 -2
  491. package/src/app/shared/services/memory-entity-service.class.d.ts +6 -3
  492. package/src/app/shared/services.d.ts +1 -0
  493. package/src/app/shared/shared.testing.module.d.ts +2 -1
  494. package/src/app/shared/storage/storage-explorer.component.d.ts +4 -3
  495. package/src/app/shared/testing/maskito.test.d.ts +10 -0
  496. package/src/app/shared/toolbar/toolbar.d.ts +7 -2
  497. package/src/app/shared/types.d.ts +5 -0
  498. package/src/app/shared/upload-file/upload-file.component.d.ts +1 -0
  499. package/src/app/shared/validator/form-error-adapter.class.d.ts +17 -11
  500. package/src/app/shared/validator/validators.d.ts +20 -9
  501. package/src/app/social/job/progression/job-progression.icon.d.ts +4 -5
  502. package/src/app/social/job/progression/job-progression.list.d.ts +1 -3
  503. package/src/app/social/job/progression/job-progression.service.d.ts +3 -4
  504. package/src/app/social/job/testing/job-progression.testing.d.ts +0 -1
  505. package/src/app/social/job/testing/job-progression.testing.service.d.ts +3 -11
  506. package/src/app/social/message/message.modal.d.ts +2 -2
  507. package/src/app/social/message/message.model.d.ts +1 -1
  508. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -4
  509. package/src/app/social/user-event/testing/user-event.testing.d.ts +1 -0
  510. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +2 -3
  511. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +1 -0
  512. package/src/assets/i18n/en-US.json +48 -19
  513. package/src/assets/i18n/en.json +48 -20
  514. package/src/assets/i18n/fr.json +50 -20
  515. package/src/assets/manifest.json +1 -1
  516. package/src/environments/environment.class.d.ts +10 -0
  517. package/src/environments/environment.d.ts +0 -1
  518. package/src/environments/environment.loader.d.ts +0 -2
  519. package/src/theme/_functions.scss +15 -0
  520. package/src/theme/_icons.scss +1 -1
  521. package/src/theme/_ionic.globals.scss +8 -2
  522. package/src/theme/_ionic.scss +10 -10
  523. package/src/theme/_material.globals.scss +16 -43
  524. package/src/theme/_material.scss +45 -32
  525. package/src/theme/_mixins.scss +99 -18
  526. package/src/theme/_ngx-components.forms.scss +354 -0
  527. package/src/theme/_ngx-components.globals.scss +20 -10
  528. package/src/theme/_ngx-components.scss +194 -400
  529. package/src/theme/_ngx-components.table.scss +200 -207
  530. package/src/theme/_ngx-components.tabs.scss +54 -0
  531. package/src/theme/_responsive.scss +0 -31
  532. package/src/theme/_theme.scss +2 -0
  533. package/src/theme/_theme.variables.scss +172 -0
  534. package/esm2022/src/app/core/table/actions-column.component.mjs +0 -115
  535. package/esm2022/src/app/shared/material/boolean/material-boolean2.mjs +0 -266
  536. package/esm2022/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +0 -104
  537. package/esm2022/src/app/shared/material/numpad/numpad.component.mjs +0 -83
  538. package/esm2022/src/app/shared/material/numpad/numpad.container.mjs +0 -203
  539. package/esm2022/src/app/shared/material/numpad/numpad.content.mjs +0 -19
  540. package/esm2022/src/app/shared/material/numpad/numpad.directive.mjs +0 -168
  541. package/esm2022/src/app/shared/material/numpad/numpad.dom-service.mjs +0 -36
  542. package/esm2022/src/app/shared/material/numpad/numpad.model.mjs +0 -16
  543. package/esm2022/src/app/shared/material/numpad/numpad.module.mjs +0 -60
  544. package/esm2022/src/app/shared/material/numpad/testing/numpad.test.mjs +0 -48
  545. package/src/app/core/table/actions-column.component.d.ts +0 -48
  546. package/src/app/shared/material/boolean/material-boolean2.d.ts +0 -66
  547. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +0 -22
  548. package/src/app/shared/material/numpad/numpad.component.d.ts +0 -26
  549. package/src/app/shared/material/numpad/numpad.container.d.ts +0 -40
  550. package/src/app/shared/material/numpad/numpad.content.d.ts +0 -7
  551. package/src/app/shared/material/numpad/numpad.directive.d.ts +0 -35
  552. package/src/app/shared/material/numpad/numpad.dom-service.d.ts +0 -16
  553. package/src/app/shared/material/numpad/numpad.model.d.ts +0 -30
  554. package/src/app/shared/material/numpad/numpad.module.d.ts +0 -16
  555. package/src/app/shared/material/numpad/testing/numpad.test.d.ts +0 -13
@@ -1,39 +1,61 @@
1
- import { ChangeDetectionStrategy, Component, Input, Optional } from '@angular/core';
1
+ import { booleanAttribute, ChangeDetectionStrategy, Component, Input, Optional } from '@angular/core';
2
2
  import { EntityUtils } from '../../services/model/entity.model';
3
3
  import { isEmptyArray, isNil } from '../../../shared/functions';
4
4
  import { AppForm } from '../form.class';
5
- import { FormArrayHelper } from '../form.utils';
6
5
  import { PropertyValidator } from './property.validator';
6
+ import { FormArrayHelper } from '../array/form-array';
7
+ import { isMobile } from '../../../shared/platforms';
8
+ import { suggestFromArray } from '../../../shared/services';
7
9
  import * as i0 from "@angular/core";
8
10
  import * as i1 from "@angular/forms";
9
11
  import * as i2 from "@angular/material/core";
10
- import * as i3 from "../../services/local-settings.service";
11
- import * as i4 from "./property.validator";
12
- import * as i5 from "@angular/common";
13
- import * as i6 from "@ionic/angular";
14
- import * as i7 from "@ngx-translate/core";
15
- import * as i8 from "@angular/material/form-field";
16
- import * as i9 from "@angular/material/input";
17
- import * as i10 from "@angular/material/icon";
18
- import * as i11 from "@angular/material/button";
19
- import * as i12 from "@angular/material/select";
20
- import * as i13 from "../../../shared/form/field.component";
21
- import * as i14 from "../../../shared/pipes/form.pipes";
12
+ import * as i3 from "./property.validator";
13
+ import * as i4 from "@angular/common";
14
+ import * as i5 from "@ionic/angular";
15
+ import * as i6 from "@ngx-translate/core";
16
+ import * as i7 from "@angular/material/form-field";
17
+ import * as i8 from "@angular/material/input";
18
+ import * as i9 from "@angular/material/icon";
19
+ import * as i10 from "@angular/material/button";
20
+ import * as i11 from "../../../shared/material/autocomplete/material.autocomplete";
21
+ import * as i12 from "../../../shared/form/field.component";
22
+ import * as i13 from "../../../shared/pipes/property.pipes";
23
+ import * as i14 from "../../../shared/pipes/arrays.pipe";
24
+ import * as i15 from "../../../shared/pipes/maps.pipe";
25
+ import * as i16 from "../../../shared/pipes/form.pipes";
26
+ import * as i17 from "../../../shared/pipes/types.pipes";
22
27
  export class AppPropertiesForm extends AppForm {
23
28
  formBuilder;
24
29
  dateAdapter;
25
- settings;
26
30
  cd;
27
31
  validator;
28
32
  formGroupDir;
29
- definitionsMapByKey = {};
30
- definitionsByIndex = {};
31
- helper;
33
+ _definitions;
34
+ _options;
35
+ _definitionsMapByKey = {};
36
+ _definitionsByIndex = {};
37
+ _helper;
38
+ _autocompleteConfig;
32
39
  formArrayName;
33
40
  formArray;
34
41
  options;
35
- definitions;
36
42
  chipColor = 'accent';
43
+ mobile;
44
+ appearance;
45
+ subscriptSizing;
46
+ showHintKey = false;
47
+ hintKeyPrefix = '';
48
+ showMoreButton = true;
49
+ showMoreButtonTitle = 'SETTINGS.BTN_SHOW_MORE_HELP';
50
+ showAddButton = true;
51
+ set definitions(value) {
52
+ this._definitions = value;
53
+ if (this.loaded)
54
+ this.updateDefinitionsMaps();
55
+ }
56
+ get definitions() {
57
+ return this._definitions;
58
+ }
37
59
  set value(data) {
38
60
  this.setValue(data);
39
61
  }
@@ -46,88 +68,128 @@ export class AppPropertiesForm extends AppForm {
46
68
  get fieldForms() {
47
69
  return this.formArray.controls;
48
70
  }
49
- constructor(injector, formBuilder, dateAdapter, settings, cd, validator, formGroupDir) {
71
+ constructor(injector, formBuilder, dateAdapter, cd, validator, formGroupDir) {
50
72
  super(injector, null);
51
73
  this.formBuilder = formBuilder;
52
74
  this.dateAdapter = dateAdapter;
53
- this.settings = settings;
54
75
  this.cd = cd;
55
76
  this.validator = validator;
56
77
  this.formGroupDir = formGroupDir;
78
+ this.tabindex = 20; // For compatibility - TODO remove later
57
79
  //this.debug = !environment.production;
58
80
  }
59
81
  ngOnInit() {
60
- if (isEmptyArray(this.definitions)) {
61
- throw new Error('Missing or invalid attribute \'definitions\'');
82
+ if (this.options?.allowEmptyArray === false && isEmptyArray(this._definitions)) {
83
+ throw new Error("Missing or invalid attribute 'definitions'");
62
84
  }
63
- // Fill options map
64
- this.definitionsMapByKey = {};
65
- this.definitions.forEach(o => {
66
- this.definitionsMapByKey[o.key] = o;
67
- });
85
+ this.mobile = this.mobile ?? isMobile(window);
86
+ this._autocompleteConfig = {
87
+ suggestFn: (value, filter) => this.suggestDefinition(value, filter),
88
+ displayWith: (value) => {
89
+ // Value is an object (a Property)
90
+ if (value && typeof value === 'object') {
91
+ return value.value;
92
+ }
93
+ // Value is a key
94
+ const def = typeof value === 'string' && this._definitionsMapByKey[value];
95
+ if (!def)
96
+ return value;
97
+ return this.translate.instant(def.label);
98
+ },
99
+ attributes: ['value'],
100
+ columnNames: [this.translate.instant('SETTINGS.PROPERTY_KEY')],
101
+ splitSearchText: false,
102
+ showAllOnFocus: true,
103
+ selectInputContentOnFocus: true,
104
+ };
105
+ this.updateDefinitionsMaps();
68
106
  // Retrieve the form
69
- const form = (this.formArray && this.formArray.parent || this.formGroupDir && this.formGroupDir.form || this.formBuilder.group({}));
107
+ const form = (this.formArray && this.formArray.parent) || (this.formGroupDir && this.formGroupDir.form) || this.formBuilder.group({});
70
108
  this.setForm(form);
71
- this.formArray = this.formArray || this.formArrayName && form.get(this.formArrayName);
72
- this.formArrayName = this.formArrayName || this.formArray && Object.keys(form.controls).find(key => form.get(key) === this.formArray) || 'properties';
109
+ this.formArray = this.formArray || (this.formArrayName && form.get(this.formArrayName));
110
+ this.formArrayName =
111
+ this.formArrayName || (this.formArray && Object.keys(form.controls).find((key) => form.get(key) === this.formArray)) || 'properties';
73
112
  if (!this.formArray) {
74
113
  console.warn(`Missing array control '${this.formArrayName}'. Will create it!`);
75
114
  this.formArray = this.formBuilder.array([]);
76
115
  this.form.addControl(this.formArrayName, this.formArray);
77
116
  }
78
- this.helper = new FormArrayHelper(this.formArray, (value) => this.validator.getFormGroup(value), (v1, v2) => (!v1 && !v2) || v1.key === v2.key, (value) => isNil(value) || (isNil(value.key) && isNil(value.value)), this.options);
117
+ this._helper = new FormArrayHelper(this.formArray, (value) => this.validator.getFormGroup(value), (v1, v2) => (!v1 && !v2) || v1.key === v2.key, (value) => this.isEmptyProperty(value), this.options);
79
118
  super.ngOnInit();
80
119
  }
120
+ updateDefinitionsMaps() {
121
+ // Fill options map
122
+ this._definitionsMapByKey = {};
123
+ this._options = (this._definitions || []).map((o) => {
124
+ this._definitionsMapByKey[o.key] = o;
125
+ return { key: o.key, value: this.translate.instant(o.label) };
126
+ });
127
+ }
81
128
  getDefinitionAt(index) {
82
- let definition = this.definitionsByIndex[index];
129
+ let definition = this._definitionsByIndex[index];
83
130
  if (!definition) {
84
- definition = this.updateDefinitionAt(index);
85
- this.definitionsByIndex[index] = definition;
131
+ definition = this.updateDefinitionAt(index, { emitEvent: false });
86
132
  }
87
133
  return definition;
88
134
  }
89
- updateDefinitionAt(index) {
90
- const key = this.formArray.at(index).controls.key.value;
91
- const definition = key && this.definitionsMapByKey[key] || null;
92
- this.definitionsByIndex[index] = definition; // update map by index
93
- this.markForCheck();
135
+ updateDefinitionAt(index, opts) {
136
+ let value = this.formArray.at(index).controls.key.value;
137
+ const key = value?.key || value;
138
+ const definition = (key && this._definitionsMapByKey[key]) || null;
139
+ this._definitionsByIndex[index] = definition; // update map by index
140
+ if (opts?.emitEvent !== false) {
141
+ this.markForCheck();
142
+ }
94
143
  return definition;
95
144
  }
96
145
  removeAt(index) {
97
- this.helper.removeAt(index);
98
- this.definitionsByIndex = {}; // clear map by index
146
+ this._helper.removeAt(index);
147
+ this._definitionsByIndex = {}; // clear map by index
99
148
  this.markForCheck();
100
149
  }
101
150
  isUnknownField(fieldForm) {
102
151
  const keyControl = fieldForm.get('key');
103
152
  const key = keyControl && keyControl.value;
104
- return key && isNil(this.definitionsMapByKey[key]);
153
+ return key && isNil(this._definitionsMapByKey[key]);
105
154
  }
106
155
  setValue(data) {
107
156
  if (!data)
108
157
  return; // Skip
109
158
  // Transform properties map into array
110
159
  const values = EntityUtils.getMapAsArray(data);
111
- this.helper.resize(values.length);
112
- this.helper.formArray.patchValue(values, { emitEvent: false });
160
+ this._helper.resize(values.length);
161
+ this._helper.formArray.patchValue(values, { emitEvent: false });
113
162
  this.markAsPristine();
114
163
  this.markAsLoaded();
115
164
  }
116
165
  /* -- protected methods -- */
166
+ async suggestDefinition(value, filter) {
167
+ value = value ?? '*';
168
+ // Get as key
169
+ if (typeof value === 'string') {
170
+ const obj = (this._options || []).find((o) => o.key === value);
171
+ if (obj)
172
+ return { data: [obj] };
173
+ }
174
+ // Get as object
175
+ if (typeof value === 'object') {
176
+ return { data: value };
177
+ }
178
+ return suggestFromArray(this._options, value, { searchAttribute: 'value', ...filter });
179
+ }
117
180
  markForCheck() {
118
181
  this.cd.markForCheck();
119
182
  }
120
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AppPropertiesForm, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: i2.DateAdapter }, { token: i3.LocalSettingsService }, { token: i0.ChangeDetectorRef }, { token: i4.PropertyValidator }, { token: i1.FormGroupDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
121
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: AppPropertiesForm, selector: "app-properties-form", inputs: { formArrayName: "formArrayName", formArray: "formArray", options: "options", definitions: "definitions", chipColor: "chipColor" }, providers: [
122
- { provide: PropertyValidator, useClass: PropertyValidator }
123
- ], usesInheritance: true, ngImport: i0, template: "\n<!-- Properties -->\n<form [formGroup]=\"form\" class=\"form-container\">\n <ion-grid *ngIf=\"!loading; else propertiesSkeleton\"\n formArrayName=\"properties\" class=\"ion-no-padding\" >\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding ion-align-self-end\" size=\"12\">\n <span class=\"toolbar-spacer\"></span>\n\n <!-- Show more options -->\n <ion-button color=\"light\" *ngIf=\"formArray?.length === 0\"\n [title]=\"'SETTINGS.BTN_SHOW_MORE_HELP'|translate\"\n (click)=\"helper.add()\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n\n <ng-container *ngFor=\"let fieldForm of fieldForms; let i=index\">\n <ion-row class=\"ion-no-padding\" [formGroupName]=\"i\">\n\n <!-- property key -->\n <ion-col size=\"6\" class=\"ion-no-padding\">\n <mat-form-field floatLabel=\"auto\" *ngIf=\"fieldForm|formGetControl:'key' as control\">\n <mat-label>{{'SETTINGS.PROPERTY_KEY'|translate}}</mat-label>\n <mat-select [formControl]=\"control\"\n (selectionChange)=\"updateDefinitionAt(i)\"\n [tabindex]=\"20+i*2\"\n required>\n\n <!-- When option's key not a well known option, add it as first select option -->\n <mat-option *ngIf=\"isUnknownField(fieldForm)\" [value]=\"control.value\">\n {{control.value}}\n </mat-option>\n\n <mat-option *ngFor=\"let item of definitions\" [value]=\"item.key\">{{ item.label | translate }}\n </mat-option>\n\n </mat-select>\n\n <mat-error *ngIf=\"control.hasError('required') && !helper.isLast(i)\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n </ion-col>\n\n <!-- property value -->\n <ion-col class=\"ion-no-padding\" padding-left >\n <app-form-field *ngIf=\"getDefinitionAt(i); let definition; else unknownValue\"\n floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"fieldForm|formGetControl:'value'\"\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [chipColor]=\"chipColor\"\n [required]=\"true\"\n [tabindex]=\"20+i*2 + 1\">\n </app-form-field>\n <ng-template #unknownValue>\n <mat-form-field>\n <mat-label>{{'SETTINGS.PROPERTY_VALUE' | translate}}</mat-label>\n <input type=\"text\" matInput\n [formControl]=\"fieldForm|formGetControl:'value'\"\n [required]=\"true\"\n [tabindex]=\"20+i*2 + 1\">\n </mat-form-field>\n </ng-template>\n </ion-col>\n\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n <button type=\"button\" mat-icon-button color=\"light\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"removeAt(i)\">\n <mat-icon>close</mat-icon>\n </button>\n <button [hidden]=\"!helper.isLast(i)\"\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"disabled\"\n [title]=\"'SETTINGS.BTN_ADD_PROPERTY'|translate\"\n (click)=\"helper.add()\">\n <mat-icon>add</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ng-container>\n </ion-grid>\n</form>\n\n<ng-template #propertiesSkeleton>\n\n <ion-grid class=\"ion-no-padding\">\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n </ion-grid>\n\n</ng-template>\n\n<ng-template #propertyRowSkeleton>\n\n <ion-row>\n <!-- property key -->\n <ion-col>\n <mat-form-field>\n <input matInput hidden>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n <ion-icon name=\"arrow-dropdown\" matSuffix></ion-icon>\n </mat-form-field>\n </ion-col>\n <!-- value -->\n <ion-col>\n <mat-form-field>\n <input matInput hidden>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </mat-form-field>\n </ion-col>\n <!-- buttons -->\n <ion-col size=\"2\">\n <button type=\"button\" mat-icon-button color=\"light\"\n [disabled]=\"true\">\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n\n</ng-template>\n", dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i6.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i6.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i6.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i6.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i6.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i6.IonRow, selector: "ion-row" }, { kind: "component", type: i6.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "directive", type: i7.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "aria-describedby", "panelClass", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i13.AppFormField, selector: "app-form-field", inputs: ["definition", "required", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "floatLabel", "tabindex", "autofocus", "clearable", "chipColor", "debug", "class"], outputs: ["keyup.enter"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }, { kind: "pipe", type: i14.FormGetControlPipe, name: "formGetControl" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
183
+ isEmptyProperty(obj) {
184
+ return isNil(obj?.key) || isNil(obj.value);
185
+ }
186
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AppPropertiesForm, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: i2.DateAdapter }, { token: i0.ChangeDetectorRef }, { token: i3.PropertyValidator }, { token: i1.FormGroupDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
187
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: AppPropertiesForm, selector: "app-properties-form", inputs: { formArrayName: "formArrayName", formArray: "formArray", options: "options", chipColor: "chipColor", mobile: ["mobile", "mobile", booleanAttribute], appearance: "appearance", subscriptSizing: "subscriptSizing", showHintKey: ["showHintKey", "showHintKey", booleanAttribute], hintKeyPrefix: "hintKeyPrefix", showMoreButton: ["showMoreButton", "showMoreButton", booleanAttribute], showMoreButtonTitle: "showMoreButtonTitle", showAddButton: ["showAddButton", "showAddButton", booleanAttribute], definitions: "definitions" }, providers: [{ provide: PropertyValidator, useClass: PropertyValidator }], usesInheritance: true, ngImport: i0, template: "<!-- Properties -->\n<form [formGroup]=\"form\" class=\"form-container\">\n @if (loadingSubject | async) {\n <ion-list [inset]=\"mobile\">\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n </ion-list>\n } @else {\n <ion-list formArrayName=\"properties\" [inset]=\"mobile\">\n <!-- Show more options -->\n @if ((definitions | isNotEmptyArray) && formArray?.length === 0) {\n <ion-item lines=\"none\">\n <ion-button color=\"light\" [title]=\"showMoreButtonTitle | translate\" (click)=\"_helper.add()\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n </ion-item>\n }\n\n @for (fieldForm of fieldForms; track i; let i = $index) {\n <ion-item lines=\"none\" [class.outline]=\"appearance === 'outline'\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row [formGroupName]=\"i\" class=\"ion-no-padding\">\n <!-- property key -->\n @if (fieldForm | formGetControl: 'key'; as control) {\n <ion-col\n size=\"12\"\n size-sm=\"6\"\n [title]=\"(_definitionsMapByKey | mapGet: control?.value | propertyGet: 'label' | translate) || ''\"\n class=\"ion-no-padding\"\n >\n <mat-autocomplete-field\n floatLabel=\"auto\"\n [formControl]=\"control\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"showHintKey ? 'fixed' : subscriptSizing\"\n (selectionChange)=\"updateDefinitionAt(i)\"\n [tabindex]=\"tabindex + i * 2\"\n [config]=\"_autocompleteConfig\"\n [placeholder]=\"'SETTINGS.PROPERTY_KEY' | translate\"\n [required]=\"true\"\n >\n @if (showHintKey) {\n @let keyValue = control.value;\n <mat-hint matHint>{{hintKeyPrefix || ''}}{{keyValue?.key || keyValue || ''}}</mat-hint>\n }\n </mat-autocomplete-field>\n </ion-col>\n }\n\n <!-- property value -->\n <ion-col size=\"\" size-sm=\"\" class=\"ion-no-padding ion-padding-start-xs\">\n @let definition = getDefinitionAt(i);\n @if (definition) {\n <app-form-field\n [floatLabel]=\"mobile ? 'auto' : 'never'\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [definition]=\"definition\"\n [formControl]=\"fieldForm | formGetControl: 'value'\"\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [chipColor]=\"chipColor\"\n [required]=\"true\"\n [tabindex]=\"tabindex + i * 2 + 1\"\n ></app-form-field>\n } @else {\n <!-- unknown definition -->\n <mat-form-field [appearance]=\"appearance\" [subscriptSizing]=\"subscriptSizing\">\n @if (mobile) {\n <mat-label>{{ 'SETTINGS.PROPERTY_VALUE' | translate }}</mat-label>\n }\n <input\n type=\"text\"\n matInput\n [formControl]=\"fieldForm | formGetControl: 'value'\"\n [placeholder]=\"mobile ? '' : ('SETTINGS.PROPERTY_VALUE' | translate)\"\n [required]=\"true\"\n [tabindex]=\"20 + i * 2 + 1\"\n />\n </mat-form-field>\n }\n </ion-col>\n\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n @if (_helper.isLast(i)) {\n <button\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"disabled || (fieldForm.value | asBoolean: isEmptyProperty)\"\n [title]=\"'SETTINGS.BTN_ADD_PROPERTY' | translate\"\n (click)=\"_helper.add()\"\n [tabindex]=\"20 + i * 2 + 2\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n <button\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"removeAt(i)\"\n [tabindex]=\"-1\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n }\n </ion-list>\n }\n</form>\n\n<ng-template #propertyRowSkeleton>\n <ion-item lines=\"none\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <!-- property key -->\n <ion-col size=\"6\" class=\"ion-no-padding\">\n <mat-form-field [subscriptSizing]=\"subscriptSizing\" >\n <input matInput hidden disabled />\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n <ion-icon name=\"arrow-dropdown\" matSuffix></ion-icon>\n </mat-form-field>\n </ion-col>\n <!-- value -->\n <ion-col class=\"ion-no-padding\">\n <mat-form-field [subscriptSizing]=\"subscriptSizing\" >\n <input matInput hidden disabled/>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </mat-form-field>\n </ion-col>\n <!-- buttons -->\n <ion-col size=\"auto\">\n <button type=\"button\" mat-icon-button color=\"light\" disabled>\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n</ng-template>\n", styles: [":host ion-item ion-row ion-col{--ion-padding-start: 0;min-width:48px}:host ion-item.outline{overflow:visible}:host ion-item.outline ion-grid,:host ion-item.outline ion-row,:host ion-item.outline ion-col{overflow:visible}\n"], dependencies: [{ kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i5.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i5.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i5.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i5.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i5.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i5.IonRow, selector: "ion-row" }, { kind: "component", type: i5.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "directive", type: i6.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i11.MatAutocompleteField, selector: "mat-autocomplete-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "appearance", "subscriptSizing", "placeholder", "suggestFn", "required", "mobile", "clearable", "debounceTime", "displaySeparator", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "autofocus", "config", "i18nPrefix", "noResultMessage", "panelClass", "panelWidth", "disableRipple", "matAutocompletePosition", "multiple", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "debug", "showSearchBar", "stickySearchBar", "applyImplicitValue", "dropButtonTitle", "clearButtonTitle", "trimSearchText", "splitSearchText", "selectInputContentOnFocus", "class", "filter", "readonly", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keyup.enter", "selectionChange"] }, { kind: "component", type: i12.AppFormField, selector: "app-form-field", inputs: ["definition", "required", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "floatLabel", "appearance", "subscriptSizing", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug"], outputs: ["keyup.enter"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "pipe", type: i13.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i14.NotEmptyArrayPipe, name: "isNotEmptyArray" }, { kind: "pipe", type: i15.MapGetPipe, name: "mapGet" }, { kind: "pipe", type: i16.FormGetControlPipe, name: "formGetControl" }, { kind: "pipe", type: i17.AsBooleanPipe, name: "asBoolean" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
124
188
  }
125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AppPropertiesForm, decorators: [{
189
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AppPropertiesForm, decorators: [{
126
190
  type: Component,
127
- args: [{ selector: 'app-properties-form', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
128
- { provide: PropertyValidator, useClass: PropertyValidator }
129
- ], template: "\n<!-- Properties -->\n<form [formGroup]=\"form\" class=\"form-container\">\n <ion-grid *ngIf=\"!loading; else propertiesSkeleton\"\n formArrayName=\"properties\" class=\"ion-no-padding\" >\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding ion-align-self-end\" size=\"12\">\n <span class=\"toolbar-spacer\"></span>\n\n <!-- Show more options -->\n <ion-button color=\"light\" *ngIf=\"formArray?.length === 0\"\n [title]=\"'SETTINGS.BTN_SHOW_MORE_HELP'|translate\"\n (click)=\"helper.add()\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n\n <ng-container *ngFor=\"let fieldForm of fieldForms; let i=index\">\n <ion-row class=\"ion-no-padding\" [formGroupName]=\"i\">\n\n <!-- property key -->\n <ion-col size=\"6\" class=\"ion-no-padding\">\n <mat-form-field floatLabel=\"auto\" *ngIf=\"fieldForm|formGetControl:'key' as control\">\n <mat-label>{{'SETTINGS.PROPERTY_KEY'|translate}}</mat-label>\n <mat-select [formControl]=\"control\"\n (selectionChange)=\"updateDefinitionAt(i)\"\n [tabindex]=\"20+i*2\"\n required>\n\n <!-- When option's key not a well known option, add it as first select option -->\n <mat-option *ngIf=\"isUnknownField(fieldForm)\" [value]=\"control.value\">\n {{control.value}}\n </mat-option>\n\n <mat-option *ngFor=\"let item of definitions\" [value]=\"item.key\">{{ item.label | translate }}\n </mat-option>\n\n </mat-select>\n\n <mat-error *ngIf=\"control.hasError('required') && !helper.isLast(i)\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n </ion-col>\n\n <!-- property value -->\n <ion-col class=\"ion-no-padding\" padding-left >\n <app-form-field *ngIf=\"getDefinitionAt(i); let definition; else unknownValue\"\n floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"fieldForm|formGetControl:'value'\"\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [chipColor]=\"chipColor\"\n [required]=\"true\"\n [tabindex]=\"20+i*2 + 1\">\n </app-form-field>\n <ng-template #unknownValue>\n <mat-form-field>\n <mat-label>{{'SETTINGS.PROPERTY_VALUE' | translate}}</mat-label>\n <input type=\"text\" matInput\n [formControl]=\"fieldForm|formGetControl:'value'\"\n [required]=\"true\"\n [tabindex]=\"20+i*2 + 1\">\n </mat-form-field>\n </ng-template>\n </ion-col>\n\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n <button type=\"button\" mat-icon-button color=\"light\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"removeAt(i)\">\n <mat-icon>close</mat-icon>\n </button>\n <button [hidden]=\"!helper.isLast(i)\"\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"disabled\"\n [title]=\"'SETTINGS.BTN_ADD_PROPERTY'|translate\"\n (click)=\"helper.add()\">\n <mat-icon>add</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ng-container>\n </ion-grid>\n</form>\n\n<ng-template #propertiesSkeleton>\n\n <ion-grid class=\"ion-no-padding\">\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n </ion-grid>\n\n</ng-template>\n\n<ng-template #propertyRowSkeleton>\n\n <ion-row>\n <!-- property key -->\n <ion-col>\n <mat-form-field>\n <input matInput hidden>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n <ion-icon name=\"arrow-dropdown\" matSuffix></ion-icon>\n </mat-form-field>\n </ion-col>\n <!-- value -->\n <ion-col>\n <mat-form-field>\n <input matInput hidden>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </mat-form-field>\n </ion-col>\n <!-- buttons -->\n <ion-col size=\"2\">\n <button type=\"button\" mat-icon-button color=\"light\"\n [disabled]=\"true\">\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n\n</ng-template>\n" }]
130
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: i2.DateAdapter }, { type: i3.LocalSettingsService }, { type: i0.ChangeDetectorRef }, { type: i4.PropertyValidator }, { type: i1.FormGroupDirective, decorators: [{
191
+ args: [{ selector: 'app-properties-form', providers: [{ provide: PropertyValidator, useClass: PropertyValidator }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Properties -->\n<form [formGroup]=\"form\" class=\"form-container\">\n @if (loadingSubject | async) {\n <ion-list [inset]=\"mobile\">\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n </ion-list>\n } @else {\n <ion-list formArrayName=\"properties\" [inset]=\"mobile\">\n <!-- Show more options -->\n @if ((definitions | isNotEmptyArray) && formArray?.length === 0) {\n <ion-item lines=\"none\">\n <ion-button color=\"light\" [title]=\"showMoreButtonTitle | translate\" (click)=\"_helper.add()\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n </ion-item>\n }\n\n @for (fieldForm of fieldForms; track i; let i = $index) {\n <ion-item lines=\"none\" [class.outline]=\"appearance === 'outline'\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row [formGroupName]=\"i\" class=\"ion-no-padding\">\n <!-- property key -->\n @if (fieldForm | formGetControl: 'key'; as control) {\n <ion-col\n size=\"12\"\n size-sm=\"6\"\n [title]=\"(_definitionsMapByKey | mapGet: control?.value | propertyGet: 'label' | translate) || ''\"\n class=\"ion-no-padding\"\n >\n <mat-autocomplete-field\n floatLabel=\"auto\"\n [formControl]=\"control\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"showHintKey ? 'fixed' : subscriptSizing\"\n (selectionChange)=\"updateDefinitionAt(i)\"\n [tabindex]=\"tabindex + i * 2\"\n [config]=\"_autocompleteConfig\"\n [placeholder]=\"'SETTINGS.PROPERTY_KEY' | translate\"\n [required]=\"true\"\n >\n @if (showHintKey) {\n @let keyValue = control.value;\n <mat-hint matHint>{{hintKeyPrefix || ''}}{{keyValue?.key || keyValue || ''}}</mat-hint>\n }\n </mat-autocomplete-field>\n </ion-col>\n }\n\n <!-- property value -->\n <ion-col size=\"\" size-sm=\"\" class=\"ion-no-padding ion-padding-start-xs\">\n @let definition = getDefinitionAt(i);\n @if (definition) {\n <app-form-field\n [floatLabel]=\"mobile ? 'auto' : 'never'\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n [definition]=\"definition\"\n [formControl]=\"fieldForm | formGetControl: 'value'\"\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [chipColor]=\"chipColor\"\n [required]=\"true\"\n [tabindex]=\"tabindex + i * 2 + 1\"\n ></app-form-field>\n } @else {\n <!-- unknown definition -->\n <mat-form-field [appearance]=\"appearance\" [subscriptSizing]=\"subscriptSizing\">\n @if (mobile) {\n <mat-label>{{ 'SETTINGS.PROPERTY_VALUE' | translate }}</mat-label>\n }\n <input\n type=\"text\"\n matInput\n [formControl]=\"fieldForm | formGetControl: 'value'\"\n [placeholder]=\"mobile ? '' : ('SETTINGS.PROPERTY_VALUE' | translate)\"\n [required]=\"true\"\n [tabindex]=\"20 + i * 2 + 1\"\n />\n </mat-form-field>\n }\n </ion-col>\n\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n @if (_helper.isLast(i)) {\n <button\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"disabled || (fieldForm.value | asBoolean: isEmptyProperty)\"\n [title]=\"'SETTINGS.BTN_ADD_PROPERTY' | translate\"\n (click)=\"_helper.add()\"\n [tabindex]=\"20 + i * 2 + 2\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n <button\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"removeAt(i)\"\n [tabindex]=\"-1\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n }\n </ion-list>\n }\n</form>\n\n<ng-template #propertyRowSkeleton>\n <ion-item lines=\"none\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <!-- property key -->\n <ion-col size=\"6\" class=\"ion-no-padding\">\n <mat-form-field [subscriptSizing]=\"subscriptSizing\" >\n <input matInput hidden disabled />\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n <ion-icon name=\"arrow-dropdown\" matSuffix></ion-icon>\n </mat-form-field>\n </ion-col>\n <!-- value -->\n <ion-col class=\"ion-no-padding\">\n <mat-form-field [subscriptSizing]=\"subscriptSizing\" >\n <input matInput hidden disabled/>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </mat-form-field>\n </ion-col>\n <!-- buttons -->\n <ion-col size=\"auto\">\n <button type=\"button\" mat-icon-button color=\"light\" disabled>\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n</ng-template>\n", styles: [":host ion-item ion-row ion-col{--ion-padding-start: 0;min-width:48px}:host ion-item.outline{overflow:visible}:host ion-item.outline ion-grid,:host ion-item.outline ion-row,:host ion-item.outline ion-col{overflow:visible}\n"] }]
192
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: i2.DateAdapter }, { type: i0.ChangeDetectorRef }, { type: i3.PropertyValidator }, { type: i1.FormGroupDirective, decorators: [{
131
193
  type: Optional
132
194
  }] }], propDecorators: { formArrayName: [{
133
195
  type: Input
@@ -135,9 +197,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
135
197
  type: Input
136
198
  }], options: [{
137
199
  type: Input
138
- }], definitions: [{
139
- type: Input
140
200
  }], chipColor: [{
141
201
  type: Input
202
+ }], mobile: [{
203
+ type: Input,
204
+ args: [{ transform: booleanAttribute }]
205
+ }], appearance: [{
206
+ type: Input
207
+ }], subscriptSizing: [{
208
+ type: Input
209
+ }], showHintKey: [{
210
+ type: Input,
211
+ args: [{ transform: booleanAttribute }]
212
+ }], hintKeyPrefix: [{
213
+ type: Input
214
+ }], showMoreButton: [{
215
+ type: Input,
216
+ args: [{ transform: booleanAttribute }]
217
+ }], showMoreButtonTitle: [{
218
+ type: Input
219
+ }], showAddButton: [{
220
+ type: Input,
221
+ args: [{ transform: booleanAttribute }]
222
+ }], definitions: [{
223
+ type: Input
142
224
  }] } });
143
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vcHJvcGVydGllcy9wcm9wZXJ0aWVzLmZvcm0udHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvZm9ybS9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMuZm9ybS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyx1QkFBdUIsRUFBcUIsU0FBUyxFQUFZLEtBQUssRUFBVSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFdkgsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBRTlELE9BQU8sRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFJOUQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUMsZUFBZSxFQUF5QixNQUFNLGVBQWUsQ0FBQztBQUV0RSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQVd2RCxNQUFNLE9BQU8saUJBQWdDLFNBQVEsT0FBWTtJQTZCbkQ7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNVO0lBaEN0QixtQkFBbUIsR0FBMkIsRUFBRSxDQUFDO0lBQ2pELGtCQUFrQixHQUE2QyxFQUFFLENBQUM7SUFDbEUsTUFBTSxDQUE0QjtJQUV6QixhQUFhLENBQVM7SUFDdEIsU0FBUyxDQUFtQjtJQUM1QixPQUFPLENBQXlCO0lBQ2hDLFdBQVcsQ0FBd0I7SUFDbkMsU0FBUyxHQUFvQyxRQUFRLENBQUM7SUFFL0QsSUFBSSxLQUFLLENBQUMsSUFBUztRQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxTQUFT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QU8sRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUM7cUJBQzFEOzswQkFvQ0UsUUFBUTt5Q0E1QkYsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtVbnR5cGVkRm9ybUFycmF5LCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXAsIEZvcm1Hcm91cERpcmVjdGl2ZSwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtFbnRpdHlVdGlsc30gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7Rm9ybUZpZWxkRGVmaW5pdGlvbiwgRm9ybUZpZWxkRGVmaW5pdGlvbk1hcH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Zvcm0vZmllbGQubW9kZWwnO1xuaW1wb3J0IHtpc0VtcHR5QXJyYXksIGlzTmlsfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7RGF0ZUFkYXB0ZXIsIFRoZW1lUGFsZXR0ZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQge01vbWVudH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7TG9jYWxTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHtBcHBGb3JtfSBmcm9tICcuLi9mb3JtLmNsYXNzJztcbmltcG9ydCB7Rm9ybUFycmF5SGVscGVyLCBGb3JtQXJyYXlIZWxwZXJPcHRpb25zfSBmcm9tICcuLi9mb3JtLnV0aWxzJztcbmltcG9ydCB7QXBwQ29sb3JzLCBQcm9wZXJ0eX0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3R5cGVzJztcbmltcG9ydCB7UHJvcGVydHlWYWxpZGF0b3J9IGZyb20gJy4vcHJvcGVydHkudmFsaWRhdG9yJztcbmltcG9ydCB7UHJlZGVmaW5lZENvbG9yc30gZnJvbSAnQGlvbmljL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcHJvcGVydGllcy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICdwcm9wZXJ0aWVzLmZvcm0uaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7cHJvdmlkZTogUHJvcGVydHlWYWxpZGF0b3IsIHVzZUNsYXNzOiBQcm9wZXJ0eVZhbGlkYXRvcn1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBcHBQcm9wZXJ0aWVzRm9ybTxUID0gUHJvcGVydHk+IGV4dGVuZHMgQXBwRm9ybTxUW10+IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBkZWZpbml0aW9uc01hcEJ5S2V5OiBGb3JtRmllbGREZWZpbml0aW9uTWFwID0ge307XG4gIGRlZmluaXRpb25zQnlJbmRleDogeyBbaW5kZXg6IG51bWJlcl06IEZvcm1GaWVsZERlZmluaXRpb24gfSA9IHt9O1xuICBoZWxwZXI6IEZvcm1BcnJheUhlbHBlcjxQcm9wZXJ0eT47XG5cbiAgQElucHV0KCkgZm9ybUFycmF5TmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtQXJyYXk6IFVudHlwZWRGb3JtQXJyYXk7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IEZvcm1BcnJheUhlbHBlck9wdGlvbnM7XG4gIEBJbnB1dCgpIGRlZmluaXRpb25zOiBGb3JtRmllbGREZWZpbml0aW9uW107XG4gIEBJbnB1dCgpIGNoaXBDb2xvcjogVGhlbWVQYWxldHRlIHwgUHJlZGVmaW5lZENvbG9ycyA9ICdhY2NlbnQnO1xuXG4gIHNldCB2YWx1ZShkYXRhOiBUW10pIHtcbiAgICB0aGlzLnNldFZhbHVlKGRhdGEpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUFycmF5LnZhbHVlIGFzIFRbXTtcbiAgfVxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUFycmF5Py5sZW5ndGggfHwgMDtcbiAgfVxuXG4gIGdldCBmaWVsZEZvcm1zKCk6IFVudHlwZWRGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUFycmF5LmNvbnRyb2xzIGFzIFVudHlwZWRGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcm90ZWN0ZWQgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPE1vbWVudD4sXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCB2YWxpZGF0b3I6IFByb3BlcnR5VmFsaWRhdG9yLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZm9ybUdyb3VwRGlyOiBGb3JtR3JvdXBEaXJlY3RpdmVcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IsXG4gICAgICBudWxsKTtcblxuICAgIC8vdGhpcy5kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKGlzRW1wdHlBcnJheSh0aGlzLmRlZmluaXRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgYXR0cmlidXRlIFxcJ2RlZmluaXRpb25zXFwnJyk7XG4gICAgfVxuXG4gICAgLy8gRmlsbCBvcHRpb25zIG1hcFxuICAgIHRoaXMuZGVmaW5pdGlvbnNNYXBCeUtleSA9IHt9O1xuICAgIHRoaXMuZGVmaW5pdGlvbnMuZm9yRWFjaChvID0+IHtcbiAgICAgIHRoaXMuZGVmaW5pdGlvbnNNYXBCeUtleVtvLmtleV0gPSBvO1xuICAgIH0pO1xuXG4gICAgLy8gUmV0cmlldmUgdGhlIGZvcm1cbiAgICBjb25zdCBmb3JtID0gKHRoaXMuZm9ybUFycmF5ICYmIHRoaXMuZm9ybUFycmF5LnBhcmVudCBhcyBVbnR5cGVkRm9ybUdyb3VwIHx8IHRoaXMuZm9ybUdyb3VwRGlyICYmIHRoaXMuZm9ybUdyb3VwRGlyLmZvcm0gfHwgdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7fSkpO1xuICAgIHRoaXMuc2V0Rm9ybShmb3JtKTtcblxuICAgIHRoaXMuZm9ybUFycmF5ID0gdGhpcy5mb3JtQXJyYXkgfHwgdGhpcy5mb3JtQXJyYXlOYW1lICYmIGZvcm0uZ2V0KHRoaXMuZm9ybUFycmF5TmFtZSkgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICB0aGlzLmZvcm1BcnJheU5hbWUgPSB0aGlzLmZvcm1BcnJheU5hbWUgfHwgdGhpcy5mb3JtQXJyYXkgJiYgT2JqZWN0LmtleXMoZm9ybS5jb250cm9scykuZmluZChrZXkgPT4gZm9ybS5nZXQoa2V5KSA9PT0gdGhpcy5mb3JtQXJyYXkpIHx8ICdwcm9wZXJ0aWVzJztcbiAgICBpZiAoIXRoaXMuZm9ybUFycmF5KSB7XG4gICAgICBjb25zb2xlLndhcm4oYE1pc3NpbmcgYXJyYXkgY29udHJvbCAnJHt0aGlzLmZvcm1BcnJheU5hbWV9Jy4gV2lsbCBjcmVhdGUgaXQhYCk7XG4gICAgICB0aGlzLmZvcm1BcnJheSA9IHRoaXMuZm9ybUJ1aWxkZXIuYXJyYXkoW10pO1xuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2wodGhpcy5mb3JtQXJyYXlOYW1lLCB0aGlzLmZvcm1BcnJheSk7XG4gICAgfVxuXG4gICAgdGhpcy5oZWxwZXIgPSBuZXcgRm9ybUFycmF5SGVscGVyPFByb3BlcnR5PihcbiAgICAgIHRoaXMuZm9ybUFycmF5LFxuICAgICAgKHZhbHVlKSA9PiB0aGlzLnZhbGlkYXRvci5nZXRGb3JtR3JvdXAodmFsdWUpLFxuICAgICAgKHYxLCB2MikgPT4gKCF2MSAmJiAhdjIpIHx8IHYxLmtleSA9PT0gdjIua2V5LFxuICAgICAgKHZhbHVlKSA9PiBpc05pbCh2YWx1ZSkgfHwgKGlzTmlsKHZhbHVlLmtleSkgJiYgaXNOaWwodmFsdWUudmFsdWUpKSxcbiAgICAgIHRoaXMub3B0aW9uc1xuICAgICk7XG5cbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICB9XG5cbiAgZ2V0RGVmaW5pdGlvbkF0KGluZGV4OiBudW1iZXIpOiBGb3JtRmllbGREZWZpbml0aW9uIHtcbiAgICBsZXQgZGVmaW5pdGlvbiA9IHRoaXMuZGVmaW5pdGlvbnNCeUluZGV4W2luZGV4XTtcbiAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgIGRlZmluaXRpb24gPSB0aGlzLnVwZGF0ZURlZmluaXRpb25BdChpbmRleCk7XG4gICAgICB0aGlzLmRlZmluaXRpb25zQnlJbmRleFtpbmRleF0gPSBkZWZpbml0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIHVwZGF0ZURlZmluaXRpb25BdChpbmRleDogbnVtYmVyKTogRm9ybUZpZWxkRGVmaW5pdGlvbiB7XG4gICAgY29uc3Qga2V5ID0gKHRoaXMuZm9ybUFycmF5LmF0KGluZGV4KSBhcyBVbnR5cGVkRm9ybUdyb3VwKS5jb250cm9scy5rZXkudmFsdWU7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IGtleSAmJiB0aGlzLmRlZmluaXRpb25zTWFwQnlLZXlba2V5XSB8fCBudWxsO1xuICAgIHRoaXMuZGVmaW5pdGlvbnNCeUluZGV4W2luZGV4XSA9IGRlZmluaXRpb247IC8vIHVwZGF0ZSBtYXAgYnkgaW5kZXhcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIHJldHVybiBkZWZpbml0aW9uO1xuICB9XG5cbiAgcmVtb3ZlQXQoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuaGVscGVyLnJlbW92ZUF0KGluZGV4KTtcbiAgICB0aGlzLmRlZmluaXRpb25zQnlJbmRleCA9IHt9OyAvLyBjbGVhciBtYXAgYnkgaW5kZXhcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgaXNVbmtub3duRmllbGQoZmllbGRGb3JtOiBVbnR5cGVkRm9ybUdyb3VwKSB7XG4gICAgY29uc3Qga2V5Q29udHJvbCA9IGZpZWxkRm9ybS5nZXQoJ2tleScpO1xuICAgIGNvbnN0IGtleSA9IGtleUNvbnRyb2wgJiYga2V5Q29udHJvbC52YWx1ZTtcbiAgICByZXR1cm4ga2V5ICYmIGlzTmlsKHRoaXMuZGVmaW5pdGlvbnNNYXBCeUtleVtrZXldKTtcbiAgfVxuXG4gIHNldFZhbHVlKGRhdGE6IFRbXSB8IGFueSkge1xuICAgIGlmICghZGF0YSkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICAvLyBUcmFuc2Zvcm0gcHJvcGVydGllcyBtYXAgaW50byBhcnJheVxuICAgIGNvbnN0IHZhbHVlcyA9IEVudGl0eVV0aWxzLmdldE1hcEFzQXJyYXk8VD4oZGF0YSk7XG4gICAgdGhpcy5oZWxwZXIucmVzaXplKHZhbHVlcy5sZW5ndGgpO1xuICAgIHRoaXMuaGVscGVyLmZvcm1BcnJheS5wYXRjaFZhbHVlKHZhbHVlcywge2VtaXRFdmVudDogZmFsc2V9KTtcblxuICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxufVxuXG4iLCJcbjwhLS0gUHJvcGVydGllcyAtLT5cbjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiZm9ybS1jb250YWluZXJcIj5cbiAgPGlvbi1ncmlkICpuZ0lmPVwiIWxvYWRpbmc7IGVsc2UgcHJvcGVydGllc1NrZWxldG9uXCJcbiAgICAgICAgICAgIGZvcm1BcnJheU5hbWU9XCJwcm9wZXJ0aWVzXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiID5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi1uby1wYWRkaW5nIGlvbi1hbGlnbi1zZWxmLWVuZFwiIHNpemU9XCIxMlwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRvb2xiYXItc3BhY2VyXCI+PC9zcGFuPlxuXG4gICAgICAgIDwhLS0gU2hvdyBtb3JlIG9wdGlvbnMgLS0+XG4gICAgICAgIDxpb24tYnV0dG9uIGNvbG9yPVwibGlnaHRcIiAqbmdJZj1cImZvcm1BcnJheT8ubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidTRVRUSU5HUy5CVE5fU0hPV19NT1JFX0hFTFAnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoZWxwZXIuYWRkKClcIj5cbiAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX1NIT1dfTU9SRTwvaW9uLWxhYmVsPlxuICAgICAgICAgIDxtYXQtaWNvbiBzbG90PVwiZW5kXCI+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cblxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkRm9ybSBvZiBmaWVsZEZvcm1zOyBsZXQgaT1pbmRleFwiPlxuICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiIFtmb3JtR3JvdXBOYW1lXT1cImlcIj5cblxuICAgICAgICA8IS0tIHByb3BlcnR5IGtleSAtLT5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjZcIiBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZsb2F0TGFiZWw9XCJhdXRvXCIgKm5nSWY9XCJmaWVsZEZvcm18Zm9ybUdldENvbnRyb2w6J2tleScgYXMgY29udHJvbFwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD57eydTRVRUSU5HUy5QUk9QRVJUWV9LRVknfHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cInVwZGF0ZURlZmluaXRpb25BdChpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiMjAraSoyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPlxuXG4gICAgICAgICAgICAgIDwhLS0gV2hlbiBvcHRpb24ncyBrZXkgbm90IGEgd2VsbCBrbm93biBvcHRpb24sIGFkZCBpdCBhcyBmaXJzdCBzZWxlY3Qgb3B0aW9uIC0tPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cImlzVW5rbm93bkZpZWxkKGZpZWxkRm9ybSlcIiBbdmFsdWVdPVwiY29udHJvbC52YWx1ZVwiPlxuICAgICAgICAgICAgICAgIHt7Y29udHJvbC52YWx1ZX19XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cblxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkZWZpbml0aW9uc1wiIFt2YWx1ZV09XCJpdGVtLmtleVwiPnt7IGl0ZW0ubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJjb250cm9sLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmICFoZWxwZXIuaXNMYXN0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgPCEtLSBwcm9wZXJ0eSB2YWx1ZSAtLT5cbiAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiIHBhZGRpbmctbGVmdCA+XG4gICAgICAgICAgPGFwcC1mb3JtLWZpZWxkICpuZ0lmPVwiZ2V0RGVmaW5pdGlvbkF0KGkpOyBsZXQgZGVmaW5pdGlvbjsgZWxzZSB1bmtub3duVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmaW5pdGlvbl09XCJkZWZpbml0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZpZWxkRm9ybXxmb3JtR2V0Q29udHJvbDondmFsdWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTRVRUSU5HUy5QUk9QRVJUWV9WQUxVRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hpcENvbG9yXT1cImNoaXBDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIjIwK2kqMiArIDFcIj5cbiAgICAgICAgICA8L2FwcC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdW5rbm93blZhbHVlPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7J1NFVFRJTkdTLlBST1BFUlRZX1ZBTFVFJyB8IHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZmllbGRGb3JtfGZvcm1HZXRDb250cm9sOid2YWx1ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIjIwK2kqMiArIDFcIj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fREVMRVRFJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUF0KGkpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gW2hpZGRlbl09XCIhaGVscGVyLmlzTGFzdChpKVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJsaWdodFwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidTRVRUSU5HUy5CVE5fQUREX1BST1BFUlRZJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhlbHBlci5hZGQoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9pb24tZ3JpZD5cbjwvZm9ybT5cblxuPG5nLXRlbXBsYXRlICNwcm9wZXJ0aWVzU2tlbGV0b24+XG5cbiAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlSb3dTa2VsZXRvblwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eVJvd1NrZWxldG9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5Um93U2tlbGV0b25cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9pb24tZ3JpZD5cblxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwcm9wZXJ0eVJvd1NrZWxldG9uPlxuXG4gIDxpb24tcm93PlxuICAgIDwhLS0gcHJvcGVydHkga2V5IC0tPlxuICAgIDxpb24tY29sPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuPlxuICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgYW5pbWF0ZWQgc3R5bGU9XCJ3aWR0aDogNjAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhcnJvdy1kcm9wZG93blwiIG1hdFN1ZmZpeD48L2lvbi1pY29uPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2lvbi1jb2w+XG4gICAgPCEtLSB2YWx1ZSAtLT5cbiAgICA8aW9uLWNvbD5cbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPGlucHV0IG1hdElucHV0IGhpZGRlbj5cbiAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IGFuaW1hdGVkIHN0eWxlPVwid2lkdGg6IDYwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvaW9uLWNvbD5cbiAgICA8IS0tIGJ1dHRvbnMgLS0+XG4gICAgPGlvbi1jb2wgc2l6ZT1cIjJcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIj5cbiAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvaW9uLWNvbD5cbiAgPC9pb24tcm93PlxuXG48L25nLXRlbXBsYXRlPlxuIl19
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vcHJvcGVydGllcy9wcm9wZXJ0aWVzLmZvcm0udHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvZm9ybS9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMuZm9ybS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFZLEtBQUssRUFBVSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0ksT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRWhFLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHaEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUEwQixNQUFNLHFCQUFxQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVU1RCxNQUFNLE9BQU8saUJBQWdDLFNBQVEsT0FBWTtJQWlEbkQ7SUFDQTtJQUNBO0lBQ0E7SUFDVTtJQXBEWixZQUFZLENBQXdCO0lBQ3BDLFFBQVEsQ0FBYTtJQUNyQixvQkFBb0IsR0FBMkIsRUFBRSxDQUFDO0lBQ2xELG1CQUFtQixHQUE2QyxFQUFFLENBQUM7SUFDbkUsT0FBTyxDQUE0QjtJQUVuQyxtQkFBbUIsQ0FBNkI7SUFFakQsYUFBYSxDQUFTO0lBQ3RCLFNBQVMsQ0FBbUI7SUFDNUIsT0FBTyxDQUF5QjtJQUNoQyxTQUFT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QUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdCLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDa0MsYUFBYTtzQkFBcEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFFekIsV0FBVztzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJvb2xlYW5BdHRyaWJ1dGUsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cERpcmVjdGl2ZSwgVW50eXBlZEZvcm1BcnJheSwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRW50aXR5VXRpbHMgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHsgRm9ybUZpZWxkRGVmaW5pdGlvbiwgRm9ybUZpZWxkRGVmaW5pdGlvbk1hcCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7IGlzRW1wdHlBcnJheSwgaXNOaWwgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IERhdGVBZGFwdGVyLCBUaGVtZVBhbGV0dGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBBcHBGb3JtIH0gZnJvbSAnLi4vZm9ybS5jbGFzcyc7XG5pbXBvcnQgeyBQcm9wZXJ0eSB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQgeyBQcm9wZXJ0eVZhbGlkYXRvciB9IGZyb20gJy4vcHJvcGVydHkudmFsaWRhdG9yJztcbmltcG9ydCB7IFByZWRlZmluZWRDb2xvcnMgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXlIZWxwZXIsIEZvcm1BcnJheUhlbHBlck9wdGlvbnMgfSBmcm9tICcuLi9hcnJheS9mb3JtLWFycmF5JztcbmltcG9ydCB7IGlzTW9iaWxlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3BsYXRmb3Jtcyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRBcHBlYXJhbmNlLCBTdWJzY3JpcHRTaXppbmcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL21hdGVyaWFsL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUuY29uZmlnJztcbmltcG9ydCB7IHN1Z2dlc3RGcm9tQXJyYXkgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMnO1xuaW1wb3J0IHsgTG9hZFJlc3VsdCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wcm9wZXJ0aWVzLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJ3Byb3BlcnRpZXMuZm9ybS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3Byb3BlcnRpZXMuZm9ybS5zY3NzJ10sXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogUHJvcGVydHlWYWxpZGF0b3IsIHVzZUNsYXNzOiBQcm9wZXJ0eVZhbGlkYXRvciB9XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFwcFByb3BlcnRpZXNGb3JtPFQgPSBQcm9wZXJ0eT4gZXh0ZW5kcyBBcHBGb3JtPFRbXT4gaW1wbGVtZW50cyBPbkluaXQge1xuICBwcm90ZWN0ZWQgX2RlZmluaXRpb25zOiBGb3JtRmllbGREZWZpbml0aW9uW107XG4gIHByb3RlY3RlZCBfb3B0aW9uczogUHJvcGVydHlbXTtcbiAgcHJvdGVjdGVkIF9kZWZpbml0aW9uc01hcEJ5S2V5OiBGb3JtRmllbGREZWZpbml0aW9uTWFwID0ge307XG4gIHByb3RlY3RlZCBfZGVmaW5pdGlvbnNCeUluZGV4OiB7IFtpbmRleDogbnVtYmVyXTogRm9ybUZpZWxkRGVmaW5pdGlvbiB9ID0ge307XG4gIHByb3RlY3RlZCBfaGVscGVyOiBGb3JtQXJyYXlIZWxwZXI8UHJvcGVydHk+O1xuXG4gIHByb3RlY3RlZCBfYXV0b2NvbXBsZXRlQ29uZmlnOiBNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZztcblxuICBASW5wdXQoKSBmb3JtQXJyYXlOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1BcnJheTogVW50eXBlZEZvcm1BcnJheTtcbiAgQElucHV0KCkgb3B0aW9uczogRm9ybUFycmF5SGVscGVyT3B0aW9ucztcbiAgQElucHV0KCkgY2hpcENvbG9yOiBUaGVtZVBhbGV0dGUgfCBQcmVkZWZpbmVkQ29sb3JzID0gJ2FjY2VudCc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBtb2JpbGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2U7XG4gIEBJbnB1dCgpIHN1YnNjcmlwdFNpemluZzogU3Vic2NyaXB0U2l6aW5nO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd0hpbnRLZXkgPSBmYWxzZTtcbiAgQElucHV0KCkgaGludEtleVByZWZpeCA9ICcnO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd01vcmVCdXR0b24gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93TW9yZUJ1dHRvblRpdGxlID0gJ1NFVFRJTkdTLkJUTl9TSE9XX01PUkVfSEVMUCc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBzaG93QWRkQnV0dG9uID0gdHJ1ZTtcblxuICBASW5wdXQoKSBzZXQgZGVmaW5pdGlvbnModmFsdWU6IEZvcm1GaWVsZERlZmluaXRpb25bXSkge1xuICAgIHRoaXMuX2RlZmluaXRpb25zID0gdmFsdWU7XG4gICAgaWYgKHRoaXMubG9hZGVkKSB0aGlzLnVwZGF0ZURlZmluaXRpb25zTWFwcygpO1xuICB9XG5cbiAgZ2V0IGRlZmluaXRpb25zKCk6IEZvcm1GaWVsZERlZmluaXRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmluaXRpb25zO1xuICB9XG5cbiAgc2V0IHZhbHVlKGRhdGE6IFRbXSkge1xuICAgIHRoaXMuc2V0VmFsdWUoZGF0YSk7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQXJyYXkudmFsdWUgYXMgVFtdO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmZvcm1BcnJheT8ubGVuZ3RoIHx8IDA7XG4gIH1cblxuICBnZXQgZmllbGRGb3JtcygpOiBVbnR5cGVkRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiB0aGlzLmZvcm1BcnJheS5jb250cm9scyBhcyBVbnR5cGVkRm9ybUdyb3VwW107XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJvdGVjdGVkIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxNb21lbnQ+LFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRvcjogUHJvcGVydHlWYWxpZGF0b3IsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb3JtR3JvdXBEaXI6IEZvcm1Hcm91cERpcmVjdGl2ZVxuICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgbnVsbCk7XG5cbiAgICB0aGlzLnRhYmluZGV4ID0gMjA7IC8vIEZvciBjb21wYXRpYmlsaXR5IC0gVE9ETyByZW1vdmUgbGF0ZXJcbiAgICAvL3RoaXMuZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnM/LmFsbG93RW1wdHlBcnJheSA9PT0gZmFsc2UgJiYgaXNFbXB0eUFycmF5KHRoaXMuX2RlZmluaXRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBvciBpbnZhbGlkIGF0dHJpYnV0ZSAnZGVmaW5pdGlvbnMnXCIpO1xuICAgIH1cblxuICAgIHRoaXMubW9iaWxlID0gdGhpcy5tb2JpbGUgPz8gaXNNb2JpbGUod2luZG93KTtcbiAgICB0aGlzLl9hdXRvY29tcGxldGVDb25maWcgPSB7XG4gICAgICBzdWdnZXN0Rm46ICh2YWx1ZSwgZmlsdGVyKSA9PiB0aGlzLnN1Z2dlc3REZWZpbml0aW9uKHZhbHVlLCBmaWx0ZXIpLFxuICAgICAgZGlzcGxheVdpdGg6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFZhbHVlIGlzIGFuIG9iamVjdCAoYSBQcm9wZXJ0eSlcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICByZXR1cm4gKHZhbHVlIGFzIFByb3BlcnR5KS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbHVlIGlzIGEga2V5XG4gICAgICAgIGNvbnN0IGRlZiA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdGhpcy5fZGVmaW5pdGlvbnNNYXBCeUtleVt2YWx1ZV07XG4gICAgICAgIGlmICghZGVmKSByZXR1cm4gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGRlZi5sYWJlbCk7XG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczogWyd2YWx1ZSddLFxuICAgICAgY29sdW1uTmFtZXM6IFt0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdTRVRUSU5HUy5QUk9QRVJUWV9LRVknKV0sXG4gICAgICBzcGxpdFNlYXJjaFRleHQ6IGZhbHNlLFxuICAgICAgc2hvd0FsbE9uRm9jdXM6IHRydWUsXG4gICAgICBzZWxlY3RJbnB1dENvbnRlbnRPbkZvY3VzOiB0cnVlLFxuICAgIH07XG5cbiAgICB0aGlzLnVwZGF0ZURlZmluaXRpb25zTWFwcygpO1xuXG4gICAgLy8gUmV0cmlldmUgdGhlIGZvcm1cbiAgICBjb25zdCBmb3JtID1cbiAgICAgICh0aGlzLmZvcm1BcnJheSAmJiAodGhpcy5mb3JtQXJyYXkucGFyZW50IGFzIFVudHlwZWRGb3JtR3JvdXApKSB8fCAodGhpcy5mb3JtR3JvdXBEaXIgJiYgdGhpcy5mb3JtR3JvdXBEaXIuZm9ybSkgfHwgdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7fSk7XG4gICAgdGhpcy5zZXRGb3JtKGZvcm0pO1xuXG4gICAgdGhpcy5mb3JtQXJyYXkgPSB0aGlzLmZvcm1BcnJheSB8fCAodGhpcy5mb3JtQXJyYXlOYW1lICYmIChmb3JtLmdldCh0aGlzLmZvcm1BcnJheU5hbWUpIGFzIFVudHlwZWRGb3JtQXJyYXkpKTtcbiAgICB0aGlzLmZvcm1BcnJheU5hbWUgPVxuICAgICAgdGhpcy5mb3JtQXJyYXlOYW1lIHx8ICh0aGlzLmZvcm1BcnJheSAmJiBPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5maW5kKChrZXkpID0+IGZvcm0uZ2V0KGtleSkgPT09IHRoaXMuZm9ybUFycmF5KSkgfHwgJ3Byb3BlcnRpZXMnO1xuICAgIGlmICghdGhpcy5mb3JtQXJyYXkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgTWlzc2luZyBhcnJheSBjb250cm9sICcke3RoaXMuZm9ybUFycmF5TmFtZX0nLiBXaWxsIGNyZWF0ZSBpdCFgKTtcbiAgICAgIHRoaXMuZm9ybUFycmF5ID0gdGhpcy5mb3JtQnVpbGRlci5hcnJheShbXSk7XG4gICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbCh0aGlzLmZvcm1BcnJheU5hbWUsIHRoaXMuZm9ybUFycmF5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9oZWxwZXIgPSBuZXcgRm9ybUFycmF5SGVscGVyPFByb3BlcnR5PihcbiAgICAgIHRoaXMuZm9ybUFycmF5LFxuICAgICAgKHZhbHVlKSA9PiB0aGlzLnZhbGlkYXRvci5nZXRGb3JtR3JvdXAodmFsdWUpLFxuICAgICAgKHYxLCB2MikgPT4gKCF2MSAmJiAhdjIpIHx8IHYxLmtleSA9PT0gdjIua2V5LFxuICAgICAgKHZhbHVlKSA9PiB0aGlzLmlzRW1wdHlQcm9wZXJ0eSh2YWx1ZSksXG4gICAgICB0aGlzLm9wdGlvbnNcbiAgICApO1xuXG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVEZWZpbml0aW9uc01hcHMoKSB7XG4gICAgLy8gRmlsbCBvcHRpb25zIG1hcFxuICAgIHRoaXMuX2RlZmluaXRpb25zTWFwQnlLZXkgPSB7fTtcbiAgICB0aGlzLl9vcHRpb25zID0gKHRoaXMuX2RlZmluaXRpb25zIHx8IFtdKS5tYXAoKG8pID0+IHtcbiAgICAgIHRoaXMuX2RlZmluaXRpb25zTWFwQnlLZXlbby5rZXldID0gbztcbiAgICAgIHJldHVybiB7IGtleTogby5rZXksIHZhbHVlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KG8ubGFiZWwpIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXREZWZpbml0aW9uQXQoaW5kZXg6IG51bWJlcik6IEZvcm1GaWVsZERlZmluaXRpb24ge1xuICAgIGxldCBkZWZpbml0aW9uID0gdGhpcy5fZGVmaW5pdGlvbnNCeUluZGV4W2luZGV4XTtcbiAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgIGRlZmluaXRpb24gPSB0aGlzLnVwZGF0ZURlZmluaXRpb25BdChpbmRleCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIHVwZGF0ZURlZmluaXRpb25BdChpbmRleDogbnVtYmVyLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pOiBGb3JtRmllbGREZWZpbml0aW9uIHtcbiAgICBsZXQgdmFsdWUgPSAodGhpcy5mb3JtQXJyYXkuYXQoaW5kZXgpIGFzIFVudHlwZWRGb3JtR3JvdXApLmNvbnRyb2xzLmtleS52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSB2YWx1ZT8ua2V5IHx8IHZhbHVlO1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSAoa2V5ICYmIHRoaXMuX2RlZmluaXRpb25zTWFwQnlLZXlba2V5XSkgfHwgbnVsbDtcbiAgICB0aGlzLl9kZWZpbml0aW9uc0J5SW5kZXhbaW5kZXhdID0gZGVmaW5pdGlvbjsgLy8gdXBkYXRlIG1hcCBieSBpbmRleFxuICAgIGlmIChvcHRzPy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIHJlbW92ZUF0KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9oZWxwZXIucmVtb3ZlQXQoaW5kZXgpO1xuICAgIHRoaXMuX2RlZmluaXRpb25zQnlJbmRleCA9IHt9OyAvLyBjbGVhciBtYXAgYnkgaW5kZXhcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgaXNVbmtub3duRmllbGQoZmllbGRGb3JtOiBVbnR5cGVkRm9ybUdyb3VwKSB7XG4gICAgY29uc3Qga2V5Q29udHJvbCA9IGZpZWxkRm9ybS5nZXQoJ2tleScpO1xuICAgIGNvbnN0IGtleSA9IGtleUNvbnRyb2wgJiYga2V5Q29udHJvbC52YWx1ZTtcbiAgICByZXR1cm4ga2V5ICYmIGlzTmlsKHRoaXMuX2RlZmluaXRpb25zTWFwQnlLZXlba2V5XSk7XG4gIH1cblxuICBzZXRWYWx1ZShkYXRhOiBUW10gfCBhbnkpIHtcbiAgICBpZiAoIWRhdGEpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgLy8gVHJhbnNmb3JtIHByb3BlcnRpZXMgbWFwIGludG8gYXJyYXlcbiAgICBjb25zdCB2YWx1ZXMgPSBFbnRpdHlVdGlscy5nZXRNYXBBc0FycmF5PFQ+KGRhdGEpO1xuICAgIHRoaXMuX2hlbHBlci5yZXNpemUodmFsdWVzLmxlbmd0aCk7XG4gICAgdGhpcy5faGVscGVyLmZvcm1BcnJheS5wYXRjaFZhbHVlKHZhbHVlcywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBhc3luYyBzdWdnZXN0RGVmaW5pdGlvbih2YWx1ZTogYW55LCBmaWx0ZXI/OiBhbnkpOiBQcm9taXNlPExvYWRSZXN1bHQ8UHJvcGVydHk+PiB7XG4gICAgdmFsdWUgPSB2YWx1ZSA/PyAnKic7XG5cbiAgICAvLyBHZXQgYXMga2V5XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IG9iaiA9ICh0aGlzLl9vcHRpb25zIHx8IFtdKS5maW5kKChvKSA9PiBvLmtleSA9PT0gdmFsdWUpO1xuICAgICAgaWYgKG9iaikgcmV0dXJuIHsgZGF0YTogW29ial0gfSBhcyBMb2FkUmVzdWx0PFByb3BlcnR5PjtcbiAgICB9XG4gICAgLy8gR2V0IGFzIG9iamVjdFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB2YWx1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiBzdWdnZXN0RnJvbUFycmF5KHRoaXMuX29wdGlvbnMsIHZhbHVlLCB7IHNlYXJjaEF0dHJpYnV0ZTogJ3ZhbHVlJywgLi4uZmlsdGVyIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzRW1wdHlQcm9wZXJ0eShvYmo6IFByb3BlcnR5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTmlsKG9iaj8ua2V5KSB8fCBpc05pbChvYmoudmFsdWUpO1xuICB9XG59XG4iLCI8IS0tIFByb3BlcnRpZXMgLS0+XG48Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCI+XG4gIEBpZiAobG9hZGluZ1N1YmplY3QgfCBhc3luYykge1xuICAgIDxpb24tbGlzdCBbaW5zZXRdPVwibW9iaWxlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlSb3dTa2VsZXRvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5Um93U2tlbGV0b25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eVJvd1NrZWxldG9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9pb24tbGlzdD5cbiAgfSBAZWxzZSB7XG4gICAgPGlvbi1saXN0IGZvcm1BcnJheU5hbWU9XCJwcm9wZXJ0aWVzXCIgW2luc2V0XT1cIm1vYmlsZVwiPlxuICAgICAgPCEtLSBTaG93IG1vcmUgb3B0aW9ucyAtLT5cbiAgICAgIEBpZiAoKGRlZmluaXRpb25zIHwgaXNOb3RFbXB0eUFycmF5KSAmJiBmb3JtQXJyYXk/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICA8aW9uLWl0ZW0gbGluZXM9XCJub25lXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gY29sb3I9XCJsaWdodFwiIFt0aXRsZV09XCJzaG93TW9yZUJ1dHRvblRpdGxlIHwgdHJhbnNsYXRlXCIgKGNsaWNrKT1cIl9oZWxwZXIuYWRkKClcIj5cbiAgICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5CVE5fU0hPV19NT1JFPC9pb24tbGFiZWw+XG4gICAgICAgICAgICA8bWF0LWljb24gc2xvdD1cImVuZFwiPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgfVxuXG4gICAgICBAZm9yIChmaWVsZEZvcm0gb2YgZmllbGRGb3JtczsgdHJhY2sgaTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgPGlvbi1pdGVtIGxpbmVzPVwibm9uZVwiIFtjbGFzcy5vdXRsaW5lXT1cImFwcGVhcmFuY2UgPT09ICdvdXRsaW5lJ1wiPlxuICAgICAgICAgIDxpb24tZ3JpZCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgICA8aW9uLXJvdyBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICA8IS0tIHByb3BlcnR5IGtleSAtLT5cbiAgICAgICAgICAgICAgQGlmIChmaWVsZEZvcm0gfCBmb3JtR2V0Q29udHJvbDogJ2tleSc7IGFzIGNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgc2l6ZT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgIHNpemUtc209XCI2XCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoX2RlZmluaXRpb25zTWFwQnlLZXkgfCBtYXBHZXQ6IGNvbnRyb2w/LnZhbHVlIHwgcHJvcGVydHlHZXQ6ICdsYWJlbCcgfCB0cmFuc2xhdGUpIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlLWZpZWxkXG4gICAgICAgICAgICAgICAgICAgIGZsb2F0TGFiZWw9XCJhdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3N1YnNjcmlwdFNpemluZ109XCJzaG93SGludEtleSA/ICdmaXhlZCcgOiBzdWJzY3JpcHRTaXppbmdcIlxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cInVwZGF0ZURlZmluaXRpb25BdChpKVwiXG4gICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleCArIGkgKiAyXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJfYXV0b2NvbXBsZXRlQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTRVRUSU5HUy5QUk9QRVJUWV9LRVknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dIaW50S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGxldCBrZXlWYWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1oaW50IG1hdEhpbnQ+e3toaW50S2V5UHJlZml4IHx8ICcnfX17e2tleVZhbHVlPy5rZXkgfHwga2V5VmFsdWUgfHwgJyd9fTwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZS1maWVsZD5cbiAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICA8IS0tIHByb3BlcnR5IHZhbHVlIC0tPlxuICAgICAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiXCIgc2l6ZS1zbT1cIlwiIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmcgaW9uLXBhZGRpbmctc3RhcnQteHNcIj5cbiAgICAgICAgICAgICAgICBAbGV0IGRlZmluaXRpb24gPSBnZXREZWZpbml0aW9uQXQoaSk7XG4gICAgICAgICAgICAgICAgQGlmIChkZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICA8YXBwLWZvcm0tZmllbGRcbiAgICAgICAgICAgICAgICAgICAgW2Zsb2F0TGFiZWxdPVwibW9iaWxlID8gJ2F1dG8nIDogJ25ldmVyJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgICAgICAgICAgICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cInN1YnNjcmlwdFNpemluZ1wiXG4gICAgICAgICAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImRlZmluaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZmllbGRGb3JtIHwgZm9ybUdldENvbnRyb2w6ICd2YWx1ZSdcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NFVFRJTkdTLlBST1BFUlRZX1ZBTFVFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjaGlwQ29sb3JdPVwiY2hpcENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXggKyBpICogMiArIDFcIlxuICAgICAgICAgICAgICAgICAgPjwvYXBwLWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8IS0tIHVua25vd24gZGVmaW5pdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCIgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdTRVRUSU5HUy5QUk9QRVJUWV9WQUxVRScgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZmllbGRGb3JtIHwgZm9ybUdldENvbnRyb2w6ICd2YWx1ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJtb2JpbGUgPyAnJyA6ICgnU0VUVElOR1MuUFJPUEVSVFlfVkFMVUUnIHwgdHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCIyMCArIGkgKiAyICsgMVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgICAgICAgIEBpZiAoX2hlbHBlci5pc0xhc3QoaSkpIHtcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IChmaWVsZEZvcm0udmFsdWUgfCBhc0Jvb2xlYW46IGlzRW1wdHlQcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1NFVFRJTkdTLkJUTl9BRERfUFJPUEVSVFknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9oZWxwZXIuYWRkKClcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiMjAgKyBpICogMiArIDJcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJsaWdodFwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX0RFTEVURScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUF0KGkpXCJcbiAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgIDwvaW9uLWdyaWQ+XG4gICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICB9XG4gICAgPC9pb24tbGlzdD5cbiAgfVxuPC9mb3JtPlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnR5Um93U2tlbGV0b24+XG4gIDxpb24taXRlbSBsaW5lcz1cIm5vbmVcIj5cbiAgICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICA8IS0tIHByb3BlcnR5IGtleSAtLT5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjZcIiBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFtzdWJzY3JpcHRTaXppbmddPVwic3Vic2NyaXB0U2l6aW5nXCIgPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGhpZGRlbiBkaXNhYmxlZCAvPlxuICAgICAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IGFuaW1hdGVkIHN0eWxlPVwid2lkdGg6IDYwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFycm93LWRyb3Bkb3duXCIgbWF0U3VmZml4PjwvaW9uLWljb24+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8IS0tIHZhbHVlIC0tPlxuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFtzdWJzY3JpcHRTaXppbmddPVwic3Vic2NyaXB0U2l6aW5nXCIgPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGhpZGRlbiBkaXNhYmxlZC8+XG4gICAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgYW5pbWF0ZWQgc3R5bGU9XCJ3aWR0aDogNjAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwhLS0gYnV0dG9ucyAtLT5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJsaWdodFwiIGRpc2FibGVkPlxuICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIDwvaW9uLWdyaWQ+XG4gIDwvaW9uLWl0ZW0+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -7,37 +7,31 @@ import { AppTableModule } from '../../table/table.module';
7
7
  import * as i0 from "@angular/core";
8
8
  import * as i1 from "@ngx-translate/core";
9
9
  export class AppPropertiesFormModule {
10
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AppPropertiesFormModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
11
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.6", ngImport: i0, type: AppPropertiesFormModule, declarations: [
10
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AppPropertiesFormModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
11
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.8", ngImport: i0, type: AppPropertiesFormModule, declarations: [
12
12
  // Other components
13
13
  AppPropertiesForm,
14
14
  AppPropertiesTable], imports: [SharedModule, i1.TranslateModule, AppTableModule], exports: [TranslateModule,
15
15
  // Components
16
16
  AppPropertiesForm,
17
17
  AppPropertiesTable] });
18
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AppPropertiesFormModule, imports: [SharedModule,
19
- TranslateModule.forChild(),
20
- AppTableModule, TranslateModule] });
18
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AppPropertiesFormModule, imports: [SharedModule, TranslateModule.forChild(), AppTableModule, TranslateModule] });
21
19
  }
22
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AppPropertiesFormModule, decorators: [{
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AppPropertiesFormModule, decorators: [{
23
21
  type: NgModule,
24
22
  args: [{
25
- imports: [
26
- SharedModule,
27
- TranslateModule.forChild(),
28
- AppTableModule
29
- ],
23
+ imports: [SharedModule, TranslateModule.forChild(), AppTableModule],
30
24
  declarations: [
31
25
  // Other components
32
26
  AppPropertiesForm,
33
- AppPropertiesTable
27
+ AppPropertiesTable,
34
28
  ],
35
29
  exports: [
36
30
  TranslateModule,
37
31
  // Components
38
32
  AppPropertiesForm,
39
- AppPropertiesTable
40
- ]
33
+ AppPropertiesTable,
34
+ ],
41
35
  }]
42
36
  }] });
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvZm9ybS9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7OztBQXNCeEQsTUFBTSxPQUFPLHVCQUF1Qjt1R0FBdkIsdUJBQXVCO3dHQUF2Qix1QkFBdUI7WUFaaEMsbUJBQW1CO1lBQ25CLGlCQUFpQjtZQUNqQixrQkFBa0IsYUFSbEIsWUFBWSxzQkFFWixjQUFjLGFBU2QsZUFBZTtZQUVmLGFBQWE7WUFDYixpQkFBaUI7WUFDakIsa0JBQWtCO3dHQUdULHVCQUF1QixZQWxCaEMsWUFBWTtZQUNaLGVBQWUsQ0FBQyxRQUFRLEVBQUU7WUFDMUIsY0FBYyxFQVNkLGVBQWU7OzJGQU9OLHVCQUF1QjtrQkFwQm5DLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osZUFBZSxDQUFDLFFBQVEsRUFBRTt3QkFDMUIsY0FBYztxQkFDZjtvQkFFRCxZQUFZLEVBQUU7d0JBQ1osbUJBQW1CO3dCQUNuQixpQkFBaUI7d0JBQ2pCLGtCQUFrQjtxQkFDbkI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLGVBQWU7d0JBRWYsYUFBYTt3QkFDYixpQkFBaUI7d0JBQ2pCLGtCQUFrQjtxQkFDbkI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05nTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2hhcmVkTW9kdWxlfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2hhcmVkLm1vZHVsZSc7XG5pbXBvcnQge0FwcFByb3BlcnRpZXNGb3JtfSBmcm9tICcuL3Byb3BlcnRpZXMuZm9ybSc7XG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0FwcFByb3BlcnRpZXNUYWJsZX0gZnJvbSAnLi9wcm9wZXJ0aWVzLnRhYmxlJztcbmltcG9ydCB7QXBwVGFibGVNb2R1bGV9IGZyb20gJy4uLy4uL3RhYmxlL3RhYmxlLm1vZHVsZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBTaGFyZWRNb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLmZvckNoaWxkKCksXG4gICAgQXBwVGFibGVNb2R1bGVcbiAgXSxcblxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICAvLyBPdGhlciBjb21wb25lbnRzXG4gICAgQXBwUHJvcGVydGllc0Zvcm0sXG4gICAgQXBwUHJvcGVydGllc1RhYmxlXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG5cbiAgICAvLyBDb21wb25lbnRzXG4gICAgQXBwUHJvcGVydGllc0Zvcm0sXG4gICAgQXBwUHJvcGVydGllc1RhYmxlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQXBwUHJvcGVydGllc0Zvcm1Nb2R1bGUge1xuXG59XG4iXX0=
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvZm9ybS9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7OztBQWtCMUQsTUFBTSxPQUFPLHVCQUF1Qjt1R0FBdkIsdUJBQXVCO3dHQUF2Qix1QkFBdUI7WUFaaEMsbUJBQW1CO1lBQ25CLGlCQUFpQjtZQUNqQixrQkFBa0IsYUFMVixZQUFZLHNCQUE4QixjQUFjLGFBUWhFLGVBQWU7WUFFZixhQUFhO1lBQ2IsaUJBQWlCO1lBQ2pCLGtCQUFrQjt3R0FHVCx1QkFBdUIsWUFmeEIsWUFBWSxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxjQUFjLEVBUWhFLGVBQWU7OzJGQU9OLHVCQUF1QjtrQkFoQm5DLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxjQUFjLENBQUM7b0JBRW5FLFlBQVksRUFBRTt3QkFDWixtQkFBbUI7d0JBQ25CLGlCQUFpQjt3QkFDakIsa0JBQWtCO3FCQUNuQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsZUFBZTt3QkFFZixhQUFhO3dCQUNiLGlCQUFpQjt3QkFDakIsa0JBQWtCO3FCQUNuQjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTaGFyZWRNb2R1bGUgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2hhcmVkLm1vZHVsZSc7XG5pbXBvcnQgeyBBcHBQcm9wZXJ0aWVzRm9ybSB9IGZyb20gJy4vcHJvcGVydGllcy5mb3JtJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQXBwUHJvcGVydGllc1RhYmxlIH0gZnJvbSAnLi9wcm9wZXJ0aWVzLnRhYmxlJztcbmltcG9ydCB7IEFwcFRhYmxlTW9kdWxlIH0gZnJvbSAnLi4vLi4vdGFibGUvdGFibGUubW9kdWxlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1NoYXJlZE1vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLmZvckNoaWxkKCksIEFwcFRhYmxlTW9kdWxlXSxcblxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICAvLyBPdGhlciBjb21wb25lbnRzXG4gICAgQXBwUHJvcGVydGllc0Zvcm0sXG4gICAgQXBwUHJvcGVydGllc1RhYmxlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuXG4gICAgLy8gQ29tcG9uZW50c1xuICAgIEFwcFByb3BlcnRpZXNGb3JtLFxuICAgIEFwcFByb3BlcnRpZXNUYWJsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQXBwUHJvcGVydGllc0Zvcm1Nb2R1bGUge31cbiJdfQ==