@sumaris-net/ngx-components 3.0.0-rc1 → 4.0.0-rc2

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 (633) hide show
  1. package/esm2022/public_api.mjs +337 -0
  2. package/{esm2020 → esm2022}/src/app/admin/admin-routing.module.mjs +8 -8
  3. package/{esm2020 → esm2022}/src/app/admin/admin.module.mjs +11 -11
  4. package/esm2022/src/app/admin/services/filter/person.filter.mjs +68 -0
  5. package/esm2022/src/app/admin/services/person.service.mjs +174 -0
  6. package/esm2022/src/app/admin/services/validator/person.validator.mjs +72 -0
  7. package/esm2022/src/app/admin/users/users.mjs +273 -0
  8. package/esm2022/src/app/admin/users/users.module.mjs +58 -0
  9. package/{esm2020 → esm2022}/src/app/core/about/about.modal.mjs +18 -5
  10. package/{esm2020 → esm2022}/src/app/core/about/about.module.mjs +9 -9
  11. package/{esm2020 → esm2022}/src/app/core/account/account.module.mjs +22 -22
  12. package/esm2022/src/app/core/account/account.page.mjs +335 -0
  13. package/esm2022/src/app/core/account/new-token.modal.mjs +125 -0
  14. package/esm2022/src/app/core/account/token.table.mjs +141 -0
  15. package/esm2022/src/app/core/auth/auth.form.mjs +140 -0
  16. package/esm2022/src/app/core/auth/auth.modal.mjs +76 -0
  17. package/{esm2020 → esm2022}/src/app/core/auth/auth.module.mjs +16 -16
  18. package/{esm2020 → esm2022}/src/app/core/core.module.mjs +87 -87
  19. package/{esm2020 → esm2022}/src/app/core/core.testing.module.mjs +23 -23
  20. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +109 -0
  21. package/{esm2020 → esm2022}/src/app/core/form/buttons/form-buttons-bar.module.mjs +10 -10
  22. package/esm2022/src/app/core/form/entity/editor.class.mjs +713 -0
  23. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +436 -0
  24. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +724 -0
  25. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +24 -0
  26. package/{esm2020 → esm2022}/src/app/core/form/entity/entity.module.mjs +11 -11
  27. package/esm2022/src/app/core/form/form.class.mjs +353 -0
  28. package/{esm2020 → esm2022}/src/app/core/form/form.module.mjs +30 -30
  29. package/{esm2020 → esm2022}/src/app/core/form/form.utils.mjs +69 -60
  30. package/esm2022/src/app/core/form/list/list.form.mjs +233 -0
  31. package/{esm2020 → esm2022}/src/app/core/form/list/list.module.mjs +10 -10
  32. package/esm2022/src/app/core/form/properties/properties.form.mjs +143 -0
  33. package/{esm2020 → esm2022}/src/app/core/form/properties/properties.module.mjs +13 -13
  34. package/esm2022/src/app/core/form/properties/properties.table.mjs +269 -0
  35. package/esm2022/src/app/core/form/properties/property.validator.mjs +24 -0
  36. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +95 -0
  37. package/{esm2020 → esm2022}/src/app/core/form/properties/testing/properties-form.testing.module.mjs +11 -11
  38. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +73 -0
  39. package/{esm2020 → esm2022}/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +10 -10
  40. package/esm2022/src/app/core/form/text-popover/text-form.component.mjs +97 -0
  41. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +152 -0
  42. package/{esm2020 → esm2022}/src/app/core/form/text-popover/text-popover.module.mjs +12 -12
  43. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.module.mjs +5 -5
  44. package/esm2022/src/app/core/graphql/graphql.service.mjs +787 -0
  45. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.utils.mjs +2 -1
  46. package/esm2022/src/app/core/home/home.mjs +283 -0
  47. package/esm2022/src/app/core/home/home.module.mjs +51 -0
  48. package/esm2022/src/app/core/icon/icon.component.mjs +40 -0
  49. package/{esm2020 → esm2022}/src/app/core/icon/icon.module.mjs +7 -7
  50. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +358 -0
  51. package/{esm2020 → esm2022}/src/app/core/install/install-upgrade-card.module.mjs +10 -10
  52. package/esm2022/src/app/core/menu/menu.component.mjs +260 -0
  53. package/esm2022/src/app/core/menu/menu.model.mjs +268 -0
  54. package/esm2022/src/app/core/menu/menu.module.mjs +52 -0
  55. package/esm2022/src/app/core/menu/menu.service.mjs +665 -0
  56. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +109 -0
  57. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu-other.testing.mjs +4 -4
  58. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +122 -0
  59. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu.testing.module.mjs +12 -12
  60. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +29 -0
  61. package/{esm2020 → esm2022}/src/app/core/offline/update-offline-mode-card.module.mjs +10 -10
  62. package/esm2022/src/app/core/peer/select-peer.modal.mjs +192 -0
  63. package/{esm2020 → esm2022}/src/app/core/peer/select-peer.module.mjs +13 -13
  64. package/esm2022/src/app/core/register/register-confirm.page.mjs +88 -0
  65. package/esm2022/src/app/core/register/register.form.mjs +194 -0
  66. package/esm2022/src/app/core/register/register.modal.mjs +55 -0
  67. package/{esm2020 → esm2022}/src/app/core/register/register.module.mjs +13 -13
  68. package/esm2022/src/app/core/services/account.service.mjs +1217 -0
  69. package/esm2022/src/app/core/services/auth-guard.service.mjs +76 -0
  70. package/esm2022/src/app/core/services/base-entity-service.class.mjs +482 -0
  71. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +224 -0
  72. package/esm2022/src/app/core/services/base58.mjs +79 -0
  73. package/esm2022/src/app/core/services/config.service.mjs +365 -0
  74. package/esm2022/src/app/core/services/crypto.service.mjs +107 -0
  75. package/esm2022/src/app/core/services/local-settings.service.mjs +468 -0
  76. package/esm2022/src/app/core/services/model/account.model.mjs +153 -0
  77. package/esm2022/src/app/core/services/model/config.model.mjs +105 -0
  78. package/esm2022/src/app/core/services/model/department.model.mjs +33 -0
  79. package/esm2022/src/app/core/services/model/entity.decorators.mjs +97 -0
  80. package/esm2022/src/app/core/services/model/entity.model.mjs +228 -0
  81. package/esm2022/src/app/core/services/model/peer.model.mjs +82 -0
  82. package/esm2022/src/app/core/services/model/person.model.mjs +109 -0
  83. package/esm2022/src/app/core/services/model/referential.model.mjs +185 -0
  84. package/esm2022/src/app/core/services/model/token.model.mjs +52 -0
  85. package/esm2022/src/app/core/services/network.service.mjs +608 -0
  86. package/{esm2020 → esm2022}/src/app/core/services/pipes/account.pipes.mjs +9 -9
  87. package/{esm2020 → esm2022}/src/app/core/services/pipes/department-to-string.pipe.mjs +5 -5
  88. package/{esm2020 → esm2022}/src/app/core/services/pipes/person-to-string.pipe.mjs +5 -5
  89. package/{esm2020 → esm2022}/src/app/core/services/pipes/usage-mode.pipes.mjs +9 -9
  90. package/{esm2020 → esm2022}/src/app/core/services/platform.service.mjs +27 -5
  91. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +434 -0
  92. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +458 -0
  93. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +25 -0
  94. package/esm2022/src/app/core/services/testing/referential.validator.mjs +46 -0
  95. package/esm2022/src/app/core/services/validator/account.validator.mjs +45 -0
  96. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +49 -0
  97. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +67 -0
  98. package/{esm2020 → esm2022}/src/app/core/services/validator/user-settings.validator.mjs +4 -4
  99. package/{esm2020 → esm2022}/src/app/core/services/validator/user-token.validator.mjs +4 -4
  100. package/{esm2020 → esm2022}/src/app/core/settings/settings.module.mjs +9 -9
  101. package/esm2022/src/app/core/settings/settings.page.mjs +328 -0
  102. package/esm2022/src/app/core/table/actions-column.component.mjs +115 -0
  103. package/esm2022/src/app/core/table/async-table.class.mjs +1735 -0
  104. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +386 -0
  105. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +401 -0
  106. package/esm2022/src/app/core/table/memory-table.class.mjs +57 -0
  107. package/esm2022/src/app/core/table/table-select-columns.component.mjs +46 -0
  108. package/esm2022/src/app/core/table/table.class.mjs +1771 -0
  109. package/esm2022/src/app/core/table/table.model.mjs +16 -0
  110. package/{esm2020 → esm2022}/src/app/core/table/table.module.mjs +12 -12
  111. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +28 -0
  112. package/esm2022/src/app/core/table/testing/table.testing.mjs +291 -0
  113. package/{esm2020 → esm2022}/src/app/core/table/testing/table.testing.module.mjs +16 -16
  114. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +25 -0
  115. package/esm2022/src/app/core/table/testing/table2.testing.mjs +250 -0
  116. package/esm2022/src/app/shared/audio/audio.mjs +251 -0
  117. package/esm2022/src/app/shared/audio/audio.testing.mjs +32 -0
  118. package/{esm2020 → esm2022}/src/app/shared/audio/audio.testing.module.mjs +10 -10
  119. package/esm2022/src/app/shared/capacitor/keyboard.mjs +42 -0
  120. package/esm2022/src/app/shared/capacitor/plugins.mjs +9 -0
  121. package/esm2022/src/app/shared/dates.mjs +149 -0
  122. package/esm2022/src/app/shared/debug/debug.component.mjs +40 -0
  123. package/{esm2020 → esm2022}/src/app/shared/debug/debug.module.mjs +14 -14
  124. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +98 -0
  125. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +32 -0
  126. package/{esm2020 → esm2022}/src/app/shared/directives/directives.module.mjs +13 -13
  127. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +52 -0
  128. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +33 -0
  129. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +62 -0
  130. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +45 -0
  131. package/{esm2020 → esm2022}/src/app/shared/directives/resizable/resizable.module.mjs +5 -5
  132. package/esm2022/src/app/shared/file/file.service.mjs +122 -0
  133. package/{esm2020 → esm2022}/src/app/shared/file/file.utils.mjs +2 -2
  134. package/esm2022/src/app/shared/form/field.component.mjs +353 -0
  135. package/esm2022/src/app/shared/form/loading-spinner.mjs +35 -0
  136. package/{esm2020 → esm2022}/src/app/shared/functions.mjs +2 -2
  137. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +82 -0
  138. package/esm2022/src/app/shared/gesture/gesture-config.mjs +46 -0
  139. package/esm2022/src/app/shared/graph/graph-colors.mjs +219 -0
  140. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +59 -0
  141. package/esm2022/src/app/shared/help/help.modal.mjs +63 -0
  142. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +24 -0
  143. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +85 -0
  144. package/{esm2020 → esm2022}/src/app/shared/hotkeys/shared-hotkeys.module.mjs +12 -12
  145. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +388 -0
  146. package/{esm2020 → esm2022}/src/app/shared/image/gallery/image-gallery.module.mjs +22 -22
  147. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +26 -0
  148. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +90 -0
  149. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +41 -0
  150. package/{esm2020 → esm2022}/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +16 -16
  151. package/{esm2020 → esm2022}/src/app/shared/image/image.module.mjs +11 -11
  152. package/esm2022/src/app/shared/image/image.service.mjs +104 -0
  153. package/esm2022/src/app/shared/inputs.mjs +231 -0
  154. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +28 -0
  155. package/esm2022/src/app/shared/logging/logging-service.class.mjs +128 -0
  156. package/{esm2020 → esm2022}/src/app/shared/logging/logging-service.module.mjs +8 -8
  157. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +49 -0
  158. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +961 -0
  159. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +82 -0
  160. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +217 -0
  161. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +209 -0
  162. package/{esm2020 → esm2022}/src/app/shared/material/badge/badge.module.mjs +9 -9
  163. package/esm2022/src/app/shared/material/badge/badge.test.mjs +42 -0
  164. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +72 -0
  165. package/esm2022/src/app/shared/material/boolean/material-boolean2.mjs +266 -0
  166. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +271 -0
  167. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +54 -0
  168. package/{esm2020 → esm2022}/src/app/shared/material/chips/chips.module.mjs +30 -30
  169. package/esm2022/src/app/shared/material/chips/material.chips.mjs +719 -0
  170. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +148 -0
  171. package/{esm2020 → esm2022}/src/app/shared/material/datetime/datetime.module.mjs +38 -38
  172. package/esm2022/src/app/shared/material/datetime/material.date.mjs +396 -0
  173. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +406 -0
  174. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +523 -0
  175. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +125 -0
  176. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +122 -0
  177. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +115 -0
  178. package/esm2022/src/app/shared/material/duration/duration.module.mjs +70 -0
  179. package/{esm2020 → esm2022}/src/app/shared/material/duration/duration.utils.mjs +2 -2
  180. package/esm2022/src/app/shared/material/duration/material.duration.mjs +273 -0
  181. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +79 -0
  182. package/{esm2020 → esm2022}/src/app/shared/material/latlong/latlong.utils.mjs +3 -3
  183. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +415 -0
  184. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +72 -0
  185. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +113 -0
  186. package/{esm2020 → esm2022}/src/app/shared/material/material.module.mjs +131 -131
  187. package/{esm2020 → esm2022}/src/app/shared/material/material.testing.module.mjs +45 -45
  188. package/esm2022/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +104 -0
  189. package/esm2022/src/app/shared/material/numpad/numpad.component.mjs +83 -0
  190. package/esm2022/src/app/shared/material/numpad/numpad.container.mjs +203 -0
  191. package/esm2022/src/app/shared/material/numpad/numpad.content.mjs +19 -0
  192. package/esm2022/src/app/shared/material/numpad/numpad.directive.mjs +168 -0
  193. package/esm2022/src/app/shared/material/numpad/numpad.dom-service.mjs +36 -0
  194. package/esm2022/src/app/shared/material/numpad/numpad.model.mjs +16 -0
  195. package/{esm2020 → esm2022}/src/app/shared/material/numpad/numpad.module.mjs +20 -20
  196. package/esm2022/src/app/shared/material/numpad/testing/numpad.test.mjs +48 -0
  197. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +48 -0
  198. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +23 -0
  199. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +368 -0
  200. package/{esm2020 → esm2022}/src/app/shared/material/swipe/swipe.module.mjs +19 -19
  201. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +67 -0
  202. package/esm2022/src/app/shared/material/testing/common.test.mjs +105 -0
  203. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +212 -0
  204. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +49 -0
  205. package/{esm2020 → esm2022}/src/app/shared/named-filter/named-filter.module.mjs +5 -5
  206. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +69 -0
  207. package/{esm2020 → esm2022}/src/app/shared/pipes/arrays.pipe.mjs +25 -25
  208. package/{esm2020 → esm2022}/src/app/shared/pipes/colors.pipe.mjs +4 -4
  209. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +51 -0
  210. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +72 -0
  211. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +28 -0
  212. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +36 -0
  213. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +60 -0
  214. package/esm2022/src/app/shared/pipes/form.pipes.mjs +194 -0
  215. package/{esm2020 → esm2022}/src/app/shared/pipes/highlight.pipe.mjs +5 -5
  216. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +42 -0
  217. package/{esm2020 → esm2022}/src/app/shared/pipes/maps.pipe.mjs +13 -13
  218. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +118 -0
  219. package/{esm2020 → esm2022}/src/app/shared/pipes/math.pipes.mjs +13 -13
  220. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +19 -0
  221. package/{esm2020 → esm2022}/src/app/shared/pipes/number-format.pipe.mjs +5 -5
  222. package/esm2022/src/app/shared/pipes/pipes.module.mjs +256 -0
  223. package/esm2022/src/app/shared/pipes/property.pipes.mjs +97 -0
  224. package/{esm2020 → esm2022}/src/app/shared/pipes/string.pipes.mjs +31 -31
  225. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +44 -0
  226. package/{esm2020 → esm2022}/src/app/shared/pipes/types.pipes.mjs +14 -14
  227. package/esm2022/src/app/shared/rx-state.module.mjs +23 -0
  228. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +347 -0
  229. package/esm2022/src/app/shared/services/progress-bar.service.mjs +31 -0
  230. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +121 -0
  231. package/esm2022/src/app/shared/services/startable-service.class.mjs +113 -0
  232. package/esm2022/src/app/shared/services/translate-context.service.mjs +104 -0
  233. package/{esm2020 → esm2022}/src/app/shared/shared-routing.module.mjs +11 -11
  234. package/esm2022/src/app/shared/shared.module.mjs +217 -0
  235. package/{esm2020 → esm2022}/src/app/shared/shared.testing.module.mjs +40 -40
  236. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +286 -0
  237. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +46 -0
  238. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +7 -7
  239. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing.module.mjs +6 -6
  240. package/esm2022/src/app/shared/storage/storage.service.mjs +134 -0
  241. package/{esm2020 → esm2022}/src/app/shared/storage/storage.utils.mjs +1 -1
  242. package/esm2022/src/app/shared/testing/observable.test.mjs +96 -0
  243. package/esm2022/src/app/shared/testing/tests.page.mjs +37 -0
  244. package/esm2022/src/app/shared/toast/toast.testing.mjs +52 -0
  245. package/{esm2020 → esm2022}/src/app/shared/toast/toast.testing.module.mjs +10 -10
  246. package/esm2022/src/app/shared/toast/toasts.mjs +144 -0
  247. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +60 -0
  248. package/esm2022/src/app/shared/toolbar/toolbar.mjs +264 -0
  249. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +57 -0
  250. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +59 -0
  251. package/{esm2020 → esm2022}/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +10 -10
  252. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +107 -0
  253. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +211 -0
  254. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +27 -0
  255. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +106 -0
  256. package/esm2022/src/app/shared/validator/validators.mjs +580 -0
  257. package/esm2022/src/app/shared/version/versions.mjs +81 -0
  258. package/{esm2020 → esm2022}/src/app/social/job/job.module.mjs +12 -12
  259. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +35 -0
  260. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +232 -0
  261. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +50 -0
  262. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +28 -0
  263. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +73 -0
  264. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +43 -0
  265. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +53 -0
  266. package/{esm2020 → esm2022}/src/app/social/job/testing/job.testing.module.mjs +9 -9
  267. package/esm2022/src/app/social/message/message.form.mjs +88 -0
  268. package/esm2022/src/app/social/message/message.modal.mjs +102 -0
  269. package/esm2022/src/app/social/message/message.model.mjs +71 -0
  270. package/{esm2020 → esm2022}/src/app/social/message/message.module.mjs +10 -10
  271. package/esm2022/src/app/social/message/message.service.mjs +88 -0
  272. package/{esm2020 → esm2022}/src/app/social/social.module.mjs +19 -19
  273. package/{esm2020 → esm2022}/src/app/social/social.testing.module.mjs +10 -10
  274. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +123 -0
  275. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +263 -0
  276. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +233 -0
  277. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +128 -0
  278. package/{esm2020 → esm2022}/src/app/social/user-event/testing/user-event.testing.module.mjs +9 -9
  279. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +116 -0
  280. package/esm2022/src/app/social/user-event/user-event.module.mjs +43 -0
  281. package/esm2022/src/app/social/user-event/user-event.service.mjs +498 -0
  282. package/esm2022/src/environments/environment.class.mjs +47 -0
  283. package/{fesm2020 → fesm2022}/sumaris-net.ngx-components.mjs +5555 -4021
  284. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -0
  285. package/package.json +11 -17
  286. package/public_api.d.ts +1 -0
  287. package/src/app/admin/users/users.d.ts +1 -1
  288. package/src/app/admin/users/users.module.d.ts +2 -1
  289. package/src/app/core/account/new-token.modal.d.ts +1 -1
  290. package/src/app/core/account/token.table.d.ts +1 -1
  291. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +1 -1
  292. package/src/app/core/form/entity/editor.class.d.ts +1 -1
  293. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +1 -1
  294. package/src/app/core/form/entity/entity-metadata.component.d.ts +1 -1
  295. package/src/app/core/form/form.class.d.ts +1 -1
  296. package/src/app/core/form/list/list.form.d.ts +1 -1
  297. package/src/app/core/form/properties/properties.form.d.ts +1 -1
  298. package/src/app/core/form/properties/properties.table.d.ts +1 -1
  299. package/src/app/core/form/text-popover/text-form.component.d.ts +1 -1
  300. package/src/app/core/form/text-popover/text-popover.component.d.ts +1 -1
  301. package/src/app/core/home/home.module.d.ts +4 -3
  302. package/src/app/core/icon/icon.component.d.ts +1 -1
  303. package/src/app/core/install/install-upgrade-card.component.d.ts +1 -1
  304. package/src/app/core/menu/menu.component.d.ts +1 -1
  305. package/src/app/core/menu/menu.module.d.ts +3 -5
  306. package/src/app/core/menu/menu.service.d.ts +1 -1
  307. package/src/app/core/menu/sub-menu-tab.directive.d.ts +1 -1
  308. package/src/app/core/offline/update-offline-mode-card.component.d.ts +1 -1
  309. package/src/app/core/peer/select-peer.modal.d.ts +1 -1
  310. package/src/app/core/services/base-entity-service.class.d.ts +1 -1
  311. package/src/app/core/services/model/person.model.d.ts +1 -1
  312. package/src/app/core/services/model/settings.model.d.ts +1 -1
  313. package/src/app/core/services/network.types.d.ts +2 -2
  314. package/src/app/core/services/storage/entity-store.class.d.ts +1 -1
  315. package/src/app/core/table/actions-column.component.d.ts +1 -1
  316. package/src/app/core/table/async-table.class.d.ts +1 -1
  317. package/src/app/core/table/memory-table.class.d.ts +1 -1
  318. package/src/app/core/table/table-select-columns.component.d.ts +1 -1
  319. package/src/app/core/table/table.class.d.ts +1 -1
  320. package/src/app/core/table/table.model.d.ts +1 -1
  321. package/src/app/core/table/testing/table.testing.d.ts +1 -1
  322. package/src/app/shared/audio/audio.d.ts +1 -1
  323. package/src/app/shared/debug/debug.component.d.ts +1 -1
  324. package/src/app/shared/directives/autofocus.directive.d.ts +1 -1
  325. package/src/app/shared/directives/ng-var.directive.d.ts +1 -1
  326. package/src/app/shared/directives/resizable/resizable.component.d.ts +1 -1
  327. package/src/app/shared/events.d.ts +1 -1
  328. package/src/app/shared/form/field.component.d.ts +1 -1
  329. package/src/app/shared/form/loading-spinner.d.ts +1 -1
  330. package/src/app/shared/help/help.modal.d.ts +1 -1
  331. package/src/app/shared/image/gallery/image-gallery.component.d.ts +1 -1
  332. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +1 -1
  333. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +10 -9
  334. package/src/app/shared/material/badge/badge.directive.d.ts +1 -1
  335. package/src/app/shared/material/boolean/boolean.module.d.ts +4 -5
  336. package/src/app/shared/material/boolean/material-boolean2.d.ts +1 -1
  337. package/src/app/shared/material/boolean/material.boolean.d.ts +1 -1
  338. package/src/app/shared/material/chips/material.chips.d.ts +1 -1
  339. package/src/app/shared/material/datetime/datetime.module.d.ts +2 -2
  340. package/src/app/shared/material/datetime/material.date.d.ts +2 -2
  341. package/src/app/shared/material/datetime/material.dateshort.d.ts +3 -3
  342. package/src/app/shared/material/datetime/material.datetime.d.ts +5 -4
  343. package/src/app/shared/material/duration/duration.module.d.ts +6 -5
  344. package/src/app/shared/material/duration/material.duration.d.ts +2 -2
  345. package/src/app/shared/material/latlong/material.latlong.d.ts +5 -5
  346. package/src/app/shared/material/latlong/material.latlong.module.d.ts +9 -8
  347. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +2 -0
  348. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +1 -1
  349. package/src/app/shared/material/numpad/numpad.component.d.ts +1 -1
  350. package/src/app/shared/material/numpad/numpad.content.d.ts +1 -1
  351. package/src/app/shared/material/numpad/numpad.directive.d.ts +1 -1
  352. package/src/app/shared/material/swipe/material.swipe.d.ts +1 -1
  353. package/src/app/shared/material/testing/common.test.d.ts +4 -2
  354. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +1 -1
  355. package/src/app/shared/pipes/maskito.pipe.d.ts +16 -0
  356. package/src/app/shared/pipes/pipes.module.d.ts +5 -4
  357. package/src/app/shared/pipes/types.pipes.d.ts +3 -3
  358. package/src/app/shared/rx-state.module.d.ts +1 -1
  359. package/src/app/shared/services/job.utils.d.ts +1 -1
  360. package/src/app/shared/shared.module.d.ts +11 -12
  361. package/src/app/shared/storage/storage-explorer.component.d.ts +1 -1
  362. package/src/app/shared/storage/storage-explorer.module.d.ts +3 -3
  363. package/src/app/shared/storage/storage.service.d.ts +1 -1
  364. package/src/app/shared/storage/storage.utils.d.ts +1 -1
  365. package/src/app/shared/toolbar/modal-toolbar.d.ts +1 -1
  366. package/src/app/shared/toolbar/toolbar.d.ts +1 -1
  367. package/src/app/shared/toolbar/toolbar.module.d.ts +4 -3
  368. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +1 -1
  369. package/src/app/shared/upload-file/upload-file.component.d.ts +1 -1
  370. package/src/app/shared/upload-file/upload-file.model.d.ts +2 -2
  371. package/src/app/social/job/progression/job-progression.component.d.ts +1 -1
  372. package/src/app/social/job/progression/job-progression.icon.d.ts +1 -1
  373. package/src/app/social/job/progression/job-progression.list.d.ts +1 -1
  374. package/src/app/social/message/message.form.d.ts +1 -1
  375. package/src/app/social/message/message.modal.d.ts +1 -1
  376. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -3
  377. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +1 -1
  378. package/src/app/social/user-event/user-event.model.d.ts +2 -2
  379. package/src/app/social/user-event/user-event.module.d.ts +3 -2
  380. package/src/assets/i18n/fr.json +2 -2
  381. package/src/theme/_material.globals.scss +2 -2
  382. package/src/theme/_material.scss +22 -1
  383. package/src/theme/_mixins.scss +2 -2
  384. package/src/theme/_ngx-components.scss +7 -8
  385. package/src/theme/_ngx-components.table.scss +12 -6
  386. package/esm2020/public_api.mjs +0 -336
  387. package/esm2020/src/app/admin/services/filter/person.filter.mjs +0 -59
  388. package/esm2020/src/app/admin/services/person.service.mjs +0 -170
  389. package/esm2020/src/app/admin/services/validator/person.validator.mjs +0 -71
  390. package/esm2020/src/app/admin/users/users.mjs +0 -259
  391. package/esm2020/src/app/admin/users/users.module.mjs +0 -54
  392. package/esm2020/src/app/core/account/account.page.mjs +0 -317
  393. package/esm2020/src/app/core/account/new-token.modal.mjs +0 -115
  394. package/esm2020/src/app/core/account/token.table.mjs +0 -137
  395. package/esm2020/src/app/core/auth/auth.form.mjs +0 -132
  396. package/esm2020/src/app/core/auth/auth.modal.mjs +0 -72
  397. package/esm2020/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -107
  398. package/esm2020/src/app/core/form/entity/editor.class.mjs +0 -679
  399. package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -422
  400. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +0 -690
  401. package/esm2020/src/app/core/form/entity/entity-metadata.component.mjs +0 -25
  402. package/esm2020/src/app/core/form/form.class.mjs +0 -345
  403. package/esm2020/src/app/core/form/list/list.form.mjs +0 -222
  404. package/esm2020/src/app/core/form/properties/properties.form.mjs +0 -132
  405. package/esm2020/src/app/core/form/properties/properties.table.mjs +0 -265
  406. package/esm2020/src/app/core/form/properties/property.validator.mjs +0 -23
  407. package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +0 -90
  408. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -70
  409. package/esm2020/src/app/core/form/text-popover/text-form.component.mjs +0 -89
  410. package/esm2020/src/app/core/form/text-popover/text-popover.component.mjs +0 -146
  411. package/esm2020/src/app/core/graphql/graphql.service.mjs +0 -774
  412. package/esm2020/src/app/core/home/home.mjs +0 -258
  413. package/esm2020/src/app/core/home/home.module.mjs +0 -48
  414. package/esm2020/src/app/core/icon/icon.component.mjs +0 -41
  415. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +0 -344
  416. package/esm2020/src/app/core/menu/menu.component.mjs +0 -239
  417. package/esm2020/src/app/core/menu/menu.model.mjs +0 -247
  418. package/esm2020/src/app/core/menu/menu.module.mjs +0 -57
  419. package/esm2020/src/app/core/menu/menu.service.mjs +0 -654
  420. package/esm2020/src/app/core/menu/sub-menu-tab.directive.mjs +0 -98
  421. package/esm2020/src/app/core/menu/testing/menu.testing.mjs +0 -121
  422. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +0 -27
  423. package/esm2020/src/app/core/peer/select-peer.modal.mjs +0 -183
  424. package/esm2020/src/app/core/register/register-confirm.page.mjs +0 -81
  425. package/esm2020/src/app/core/register/register.form.mjs +0 -183
  426. package/esm2020/src/app/core/register/register.modal.mjs +0 -52
  427. package/esm2020/src/app/core/services/account.service.mjs +0 -1206
  428. package/esm2020/src/app/core/services/auth-guard.service.mjs +0 -71
  429. package/esm2020/src/app/core/services/base-entity-service.class.mjs +0 -468
  430. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +0 -221
  431. package/esm2020/src/app/core/services/base58.mjs +0 -78
  432. package/esm2020/src/app/core/services/config.service.mjs +0 -355
  433. package/esm2020/src/app/core/services/crypto.service.mjs +0 -107
  434. package/esm2020/src/app/core/services/local-settings.service.mjs +0 -460
  435. package/esm2020/src/app/core/services/model/account.model.mjs +0 -147
  436. package/esm2020/src/app/core/services/model/config.model.mjs +0 -92
  437. package/esm2020/src/app/core/services/model/department.model.mjs +0 -30
  438. package/esm2020/src/app/core/services/model/entity.decorators.mjs +0 -97
  439. package/esm2020/src/app/core/services/model/entity.model.mjs +0 -225
  440. package/esm2020/src/app/core/services/model/peer.model.mjs +0 -68
  441. package/esm2020/src/app/core/services/model/person.model.mjs +0 -97
  442. package/esm2020/src/app/core/services/model/referential.model.mjs +0 -164
  443. package/esm2020/src/app/core/services/model/token.model.mjs +0 -48
  444. package/esm2020/src/app/core/services/network.service.mjs +0 -590
  445. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +0 -428
  446. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +0 -449
  447. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +0 -23
  448. package/esm2020/src/app/core/services/testing/referential.validator.mjs +0 -45
  449. package/esm2020/src/app/core/services/validator/account.validator.mjs +0 -41
  450. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +0 -47
  451. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +0 -66
  452. package/esm2020/src/app/core/settings/settings.page.mjs +0 -312
  453. package/esm2020/src/app/core/table/actions-column.component.mjs +0 -102
  454. package/esm2020/src/app/core/table/async-table.class.mjs +0 -1698
  455. package/esm2020/src/app/core/table/entities-async-table-datasource.class.mjs +0 -384
  456. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +0 -399
  457. package/esm2020/src/app/core/table/memory-table.class.mjs +0 -53
  458. package/esm2020/src/app/core/table/table-select-columns.component.mjs +0 -43
  459. package/esm2020/src/app/core/table/table.class.mjs +0 -1733
  460. package/esm2020/src/app/core/table/table.model.mjs +0 -12
  461. package/esm2020/src/app/core/table/testing/table-validator.service.mjs +0 -27
  462. package/esm2020/src/app/core/table/testing/table.testing.mjs +0 -281
  463. package/esm2020/src/app/core/table/testing/table2-validator.service.mjs +0 -24
  464. package/esm2020/src/app/core/table/testing/table2.testing.mjs +0 -242
  465. package/esm2020/src/app/shared/audio/audio.mjs +0 -248
  466. package/esm2020/src/app/shared/audio/audio.testing.mjs +0 -31
  467. package/esm2020/src/app/shared/capacitor/keyboard.mjs +0 -40
  468. package/esm2020/src/app/shared/capacitor/plugins.mjs +0 -9
  469. package/esm2020/src/app/shared/dates.mjs +0 -149
  470. package/esm2020/src/app/shared/debug/debug.component.mjs +0 -39
  471. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +0 -93
  472. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +0 -30
  473. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +0 -53
  474. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +0 -31
  475. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +0 -60
  476. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +0 -40
  477. package/esm2020/src/app/shared/file/file.service.mjs +0 -117
  478. package/esm2020/src/app/shared/form/field.component.mjs +0 -334
  479. package/esm2020/src/app/shared/form/loading-spinner.mjs +0 -36
  480. package/esm2020/src/app/shared/geolocation/geolocation.utils.mjs +0 -80
  481. package/esm2020/src/app/shared/gesture/gesture-config.mjs +0 -49
  482. package/esm2020/src/app/shared/graph/graph-colors.mjs +0 -212
  483. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +0 -57
  484. package/esm2020/src/app/shared/help/help.modal.mjs +0 -53
  485. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
  486. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +0 -81
  487. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +0 -368
  488. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -27
  489. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -90
  490. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -39
  491. package/esm2020/src/app/shared/image/image.service.mjs +0 -98
  492. package/esm2020/src/app/shared/inputs.mjs +0 -231
  493. package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
  494. package/esm2020/src/app/shared/logging/logging-service.class.mjs +0 -121
  495. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -47
  496. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -925
  497. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -78
  498. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -209
  499. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +0 -199
  500. package/esm2020/src/app/shared/material/badge/badge.test.mjs +0 -41
  501. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +0 -76
  502. package/esm2020/src/app/shared/material/boolean/material-boolean2.mjs +0 -248
  503. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +0 -254
  504. package/esm2020/src/app/shared/material/boolean/testing/boolean.test.page.mjs +0 -51
  505. package/esm2020/src/app/shared/material/chips/material.chips.mjs +0 -688
  506. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +0 -143
  507. package/esm2020/src/app/shared/material/datetime/material.date.mjs +0 -378
  508. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +0 -387
  509. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +0 -501
  510. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -120
  511. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -118
  512. package/esm2020/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -111
  513. package/esm2020/src/app/shared/material/duration/duration.module.mjs +0 -67
  514. package/esm2020/src/app/shared/material/duration/material.duration.mjs +0 -258
  515. package/esm2020/src/app/shared/material/duration/testing/mat-duration.test.mjs +0 -76
  516. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +0 -383
  517. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +0 -67
  518. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -102
  519. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +0 -98
  520. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +0 -80
  521. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +0 -190
  522. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +0 -17
  523. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +0 -162
  524. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +0 -32
  525. package/esm2020/src/app/shared/material/numpad/numpad.model.mjs +0 -15
  526. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +0 -46
  527. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -46
  528. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -22
  529. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +0 -345
  530. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -64
  531. package/esm2020/src/app/shared/material/testing/common.test.mjs +0 -95
  532. package/esm2020/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -202
  533. package/esm2020/src/app/shared/named-filter/named-filter.model.mjs +0 -45
  534. package/esm2020/src/app/shared/named-filter/named-filter.service.mjs +0 -63
  535. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -48
  536. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +0 -66
  537. package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +0 -27
  538. package/esm2020/src/app/shared/pipes/duration.pipe.mjs +0 -34
  539. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +0 -62
  540. package/esm2020/src/app/shared/pipes/form.pipes.mjs +0 -187
  541. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +0 -46
  542. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +0 -21
  543. package/esm2020/src/app/shared/pipes/pipes.module.mjs +0 -247
  544. package/esm2020/src/app/shared/pipes/property.pipes.mjs +0 -93
  545. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +0 -43
  546. package/esm2020/src/app/shared/rx-state.module.mjs +0 -23
  547. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +0 -339
  548. package/esm2020/src/app/shared/services/progress-bar.service.mjs +0 -33
  549. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +0 -121
  550. package/esm2020/src/app/shared/services/startable-service.class.mjs +0 -113
  551. package/esm2020/src/app/shared/services/translate-context.service.mjs +0 -103
  552. package/esm2020/src/app/shared/shared.module.mjs +0 -224
  553. package/esm2020/src/app/shared/storage/storage-explorer.component.mjs +0 -268
  554. package/esm2020/src/app/shared/storage/storage-explorer.module.mjs +0 -47
  555. package/esm2020/src/app/shared/storage/storage.service.mjs +0 -132
  556. package/esm2020/src/app/shared/testing/observable.test.mjs +0 -95
  557. package/esm2020/src/app/shared/testing/tests.page.mjs +0 -33
  558. package/esm2020/src/app/shared/toast/toast.testing.mjs +0 -51
  559. package/esm2020/src/app/shared/toast/toasts.mjs +0 -144
  560. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +0 -58
  561. package/esm2020/src/app/shared/toolbar/toolbar.mjs +0 -251
  562. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +0 -53
  563. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -58
  564. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -97
  565. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +0 -204
  566. package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +0 -20
  567. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +0 -104
  568. package/esm2020/src/app/shared/validator/validators.mjs +0 -580
  569. package/esm2020/src/app/shared/version/versions.mjs +0 -81
  570. package/esm2020/src/app/social/job/progression/job-progression.component.mjs +0 -34
  571. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +0 -223
  572. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +0 -46
  573. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +0 -23
  574. package/esm2020/src/app/social/job/progression/job-progression.service.mjs +0 -71
  575. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +0 -41
  576. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +0 -55
  577. package/esm2020/src/app/social/message/message.form.mjs +0 -84
  578. package/esm2020/src/app/social/message/message.modal.mjs +0 -93
  579. package/esm2020/src/app/social/message/message.model.mjs +0 -64
  580. package/esm2020/src/app/social/message/message.service.mjs +0 -84
  581. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -114
  582. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -246
  583. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +0 -227
  584. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -112
  585. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -111
  586. package/esm2020/src/app/social/user-event/user-event.module.mjs +0 -39
  587. package/esm2020/src/app/social/user-event/user-event.service.mjs +0 -488
  588. package/esm2020/src/environments/environment.class.mjs +0 -5
  589. package/fesm2015/sumaris-net.ngx-components.mjs +0 -41541
  590. package/fesm2015/sumaris-net.ngx-components.mjs.map +0 -1
  591. package/fesm2020/sumaris-net.ngx-components.mjs.map +0 -1
  592. /package/{esm2020 → esm2022}/src/app/core/services/config/core.config.mjs +0 -0
  593. /package/{esm2020 → esm2022}/src/app/core/services/errors.mjs +0 -0
  594. /package/{esm2020 → esm2022}/src/app/core/services/model/filter.model.mjs +0 -0
  595. /package/{esm2020 → esm2022}/src/app/core/services/model/history.model.mjs +0 -0
  596. /package/{esm2020 → esm2022}/src/app/core/services/model/model.enum.mjs +0 -0
  597. /package/{esm2020 → esm2022}/src/app/core/services/model/settings.model.mjs +0 -0
  598. /package/{esm2020 → esm2022}/src/app/core/services/model/tree-item-entity.model.mjs +0 -0
  599. /package/{esm2020 → esm2022}/src/app/core/services/network.types.mjs +0 -0
  600. /package/{esm2020 → esm2022}/src/app/core/services/network.utils.mjs +0 -0
  601. /package/{esm2020 → esm2022}/src/app/core/table/table.utils.mjs +0 -0
  602. /package/{esm2020 → esm2022}/src/app/shared/alerts.mjs +0 -0
  603. /package/{esm2020 → esm2022}/src/app/shared/constants.mjs +0 -0
  604. /package/{esm2020 → esm2022}/src/app/shared/debug/debug-service.class.mjs +0 -0
  605. /package/{esm2020 → esm2022}/src/app/shared/events.mjs +0 -0
  606. /package/{esm2020 → esm2022}/src/app/shared/file/csv.utils.mjs +0 -0
  607. /package/{esm2020 → esm2022}/src/app/shared/file/images.utils.mjs +0 -0
  608. /package/{esm2020 → esm2022}/src/app/shared/file/json.utils.mjs +0 -0
  609. /package/{esm2020 → esm2022}/src/app/shared/file/uri.utils.mjs +0 -0
  610. /package/{esm2020 → esm2022}/src/app/shared/focusable.mjs +0 -0
  611. /package/{esm2020 → esm2022}/src/app/shared/form/field.model.mjs +0 -0
  612. /package/{esm2020 → esm2022}/src/app/shared/forms.mjs +0 -0
  613. /package/{esm2020 → esm2022}/src/app/shared/gesture/hammer.utils.mjs +0 -0
  614. /package/{esm2020 → esm2022}/src/app/shared/graph/colors.utils.mjs +0 -0
  615. /package/{esm2020 → esm2022}/src/app/shared/http/http.utils.mjs +0 -0
  616. /package/{esm2020 → esm2022}/src/app/shared/image/image.model.mjs +0 -0
  617. /package/{esm2020 → esm2022}/src/app/shared/logging/log-level.model.mjs +0 -0
  618. /package/{esm2020 → esm2022}/src/app/shared/logging/logger.model.mjs +0 -0
  619. /package/{esm2020 → esm2022}/src/app/shared/logging/logging-service.config.mjs +0 -0
  620. /package/{esm2020 → esm2022}/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -0
  621. /package/{esm2020 → esm2022}/src/app/shared/material/material.animations.mjs +0 -0
  622. /package/{esm2020 → esm2022}/src/app/shared/modules.mjs +0 -0
  623. /package/{esm2020 → esm2022}/src/app/shared/observables.mjs +0 -0
  624. /package/{esm2020 → esm2022}/src/app/shared/platforms.mjs +0 -0
  625. /package/{esm2020 → esm2022}/src/app/shared/services/entity-service.class.mjs +0 -0
  626. /package/{esm2020 → esm2022}/src/app/shared/services/job.utils.mjs +0 -0
  627. /package/{esm2020 → esm2022}/src/app/shared/services/validator-service.class.mjs +0 -0
  628. /package/{esm2020 → esm2022}/src/app/shared/services.mjs +0 -0
  629. /package/{esm2020 → esm2022}/src/app/shared/types.mjs +0 -0
  630. /package/{esm2020 → esm2022}/src/app/social/social.errors.mjs +0 -0
  631. /package/{esm2020 → esm2022}/src/app/social/user-event/user-event.model.mjs +0 -0
  632. /package/{esm2020 → esm2022}/src/environments/environment.mjs +0 -0
  633. /package/{esm2020 → esm2022}/sumaris-net.ngx-components.mjs +0 -0
@@ -1,378 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, forwardRef, Input, Optional, ViewChild } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
3
- import { isMoment } from 'moment';
4
- import { DEFAULT_PLACEHOLDER_CHAR } from '../../constants';
5
- import { SharedValidators } from '../../validator/validators';
6
- import { isBlankString, isNil, isNotNil, isNotNilBoolean, isNotNilOrBlank } from '../../functions';
7
- import { filter } from 'rxjs/operators';
8
- import { setTabIndex } from '../../inputs';
9
- import { Subscription } from 'rxjs';
10
- import { isFocusableElement } from '../../focusable';
11
- import { DateUtils, fromDateISOString, toDateISOString } from '../../dates';
12
- import { isMobile } from '../../platforms';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@angular/material-moment-adapter";
15
- import * as i2 from "@ngx-translate/core";
16
- import * as i3 from "@angular/forms";
17
- import * as i4 from "@angular/common";
18
- import * as i5 from "@ionic/angular";
19
- import * as i6 from "@angular/material/form-field";
20
- import * as i7 from "@angular/material/input";
21
- import * as i8 from "@angular/material/icon";
22
- import * as i9 from "@angular/material/button";
23
- import * as i10 from "@angular/material/datepicker";
24
- import * as i11 from "angular2-text-mask";
25
- import * as i12 from "../../directives/autofocus.directive";
26
- import * as i13 from "../../pipes/date-format.pipe";
27
- import * as i14 from "../../pipes/arrays.pipe";
28
- import * as i15 from "../../pipes/maps.pipe";
29
- import * as i16 from "../../pipes/types.pipes";
30
- const DEFAULT_VALUE_ACCESSOR = {
31
- provide: NG_VALUE_ACCESSOR,
32
- useExisting: forwardRef(() => MatDate),
33
- multi: true
34
- };
35
- const TEXT_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
36
- const noop = () => { };
37
- export class MatDate {
38
- constructor(dateAdapter, translate, formBuilder, cd, formGroupDir) {
39
- this.dateAdapter = dateAdapter;
40
- this.translate = translate;
41
- this.formBuilder = formBuilder;
42
- this.cd = cd;
43
- this.formGroupDir = formGroupDir;
44
- this._onChangeCallback = noop;
45
- this._onTouchedCallback = noop;
46
- this._subscription = new Subscription();
47
- this._writing = true;
48
- this._disabling = false;
49
- this._readonly = false;
50
- this.mask = TEXT_MASK;
51
- this.floatLabel = 'auto';
52
- this.appearance = 'fill';
53
- this.compact = false;
54
- this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
55
- this.autofocus = false;
56
- this.startDate = null;
57
- this.clearable = false;
58
- this.timezone = null;
59
- this.locale = (translate.currentLang || translate.defaultLang).substring(0, 2);
60
- }
61
- set readonly(value) {
62
- this._readonly = value;
63
- this.markForCheck();
64
- }
65
- get readonly() {
66
- return this._readonly;
67
- }
68
- set tabindex(value) {
69
- if (this._tabindex !== value) {
70
- this._tabindex = value;
71
- if (!this._writing)
72
- this.updateTabIndex();
73
- }
74
- }
75
- get tabindex() {
76
- return this._tabindex;
77
- }
78
- get value() {
79
- return this.formControl.value;
80
- }
81
- get disabled() {
82
- return this.formControl.disabled;
83
- }
84
- ngOnInit() {
85
- this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
86
- if (!this.formControl)
87
- throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-field>.');
88
- this.mobile = isNotNil(this.mobile) ? this.mobile : isMobile(window);
89
- this.required = isNotNilBoolean(this.required) ? this.required : (this.formControl.validator === Validators.required || isBlankString(this.required));
90
- // Add 'validDate' validator (when existing validator are null or required, to be sure to keep it)
91
- if (!this.formControl.validator || this.formControl.validator === Validators.required) {
92
- this.formControl.setValidators(this.required ? [Validators.required, SharedValidators.validDate] : SharedValidators.validDate);
93
- }
94
- else {
95
- this.formControl.setValidators(this.required ? [this.formControl.validator, Validators.required, SharedValidators.validDate] :
96
- [this.formControl.validator, SharedValidators.validDate]);
97
- }
98
- // Create the text control
99
- this.textControl = this.formBuilder.control(null,
100
- // Important: should copy errors from the model formControl
101
- () => this.formControl.errors);
102
- // Get patterns to display date
103
- this.updatePattern(this.translate.instant('COMMON.DATE_PATTERN'));
104
- this._subscription.add(this.translate.get('COMMON.DATE_PATTERN')
105
- .subscribe((pattern) => this.updatePattern(pattern)));
106
- this._subscription.add(this.textControl.valueChanges
107
- .subscribe((value) => this.onFormChange(value)));
108
- // Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
109
- this._subscription.add(this.formControl.statusChanges
110
- .pipe(filter((_) => !this.readonly && !this._writing && !this._disabling) // Skip
111
- )
112
- .subscribe(() => {
113
- this.textControl.updateValueAndValidity({ emitEvent: false });
114
- if (this.formControl.touched && !this.textControl.touched) {
115
- this.textControl.markAsTouched();
116
- }
117
- this.markForCheck();
118
- }));
119
- this._writing = false;
120
- }
121
- ngAfterViewInit() {
122
- this.updateTabIndex();
123
- }
124
- ngOnDestroy() {
125
- this._subscription.unsubscribe();
126
- }
127
- writeValue(value) {
128
- if (this._writing)
129
- return; // Skip
130
- this._writing = true;
131
- // DEBUG
132
- //console.debug("[mat-date] writeValue() with:", value);
133
- // Convert into date
134
- // Important: clone, because startOf will update the existing date
135
- const date = isMoment(value) ? value.clone() : fromDateISOString(value);
136
- if (!date || !date.isValid()) {
137
- this.textControl.patchValue(null, { emitEvent: false });
138
- if (this.formControl.value) {
139
- this.formControl.patchValue(null, { emitEvent: false });
140
- this._onChangeCallback(null);
141
- }
142
- }
143
- else {
144
- // Move to the expected TZ (keeping local hour - e.g. midnight)
145
- const day = (this.timezone && date.tz(this.timezone) || date)
146
- // Reset hour
147
- .startOf('day');
148
- const dayStr = this.dateAdapter.format(day, this.datePattern);
149
- if (this.textControl.value !== dayStr) {
150
- // Update text control
151
- this.textControl.patchValue(dayStr, { emitEvent: false });
152
- }
153
- }
154
- this._writing = false;
155
- this.markForCheck();
156
- }
157
- registerOnChange(fn) {
158
- this._onChangeCallback = fn;
159
- }
160
- registerOnTouched(fn) {
161
- this._onTouchedCallback = fn;
162
- }
163
- setDisabledState(isDisabled) {
164
- if (this._disabling)
165
- return;
166
- this._disabling = true;
167
- if (isDisabled) {
168
- this.textControl.disable({ emitEvent: false });
169
- }
170
- else {
171
- this.textControl.enable({ emitEvent: false });
172
- }
173
- this._disabling = false;
174
- this.markForCheck();
175
- }
176
- openDatePicker() {
177
- if (!this.datePicker)
178
- return;
179
- if (!this.datePicker.opened) {
180
- // DEBUG
181
- //console.debug('[mat-date] Opening date picker...');
182
- this.datePicker.open();
183
- }
184
- }
185
- focus() {
186
- if (!this._matInput)
187
- return;
188
- setTimeout(() => {
189
- if (isFocusableElement(this._matInput.nativeElement)) {
190
- this._matInput.nativeElement.focus();
191
- }
192
- });
193
- }
194
- clear() {
195
- this.textControl.patchValue(null, { emitEvent: false });
196
- this.formControl.setValue(null, { emitEvent: false });
197
- this._onChangeCallback(null);
198
- this.markAsTouched();
199
- this.markAsDirty();
200
- }
201
- /* -- protected methods -- */
202
- _onDatePickerChange(event) {
203
- // Make sure event is valid
204
- if (!event || (event.value !== null && !isMoment(event.value))) {
205
- console.warn('Invalid MatDatepicker event. Skipping', event);
206
- return; // Skip
207
- }
208
- let value = event.value;
209
- // No value, but mobile mode: use the current date
210
- if (!value && this.mobile) {
211
- value = DateUtils.resetTime(DateUtils.moment().locale(this.locale), this.timezone);
212
- this.formControl.setValue(toDateISOString(value), {
213
- emitEvent: false // Will call writeValue()
214
- });
215
- return;
216
- }
217
- const date = value?.clone()
218
- .locale(this.locale) // set as time as locale time
219
- .startOf('day') // reset hour
220
- .utc(true);
221
- const dateStr = date && this.dateAdapter.format(date, this.datePattern) || null;
222
- if (this.textControl.value !== dateStr) {
223
- // DEBUG
224
- //console.debug("[mat-date] onDatePickerChange() new value:", dateStr);
225
- this.textControl.setValue(dateStr, {
226
- emitEvent: true // Will call onFormChange
227
- });
228
- }
229
- }
230
- _openDatePickerIfMobile(event) {
231
- if (!this.mobile
232
- || event?.defaultPrevented
233
- || this.datePicker?.opened
234
- || this.disabled)
235
- return;
236
- //console.debug('[mat-date] Preparing to open date picker... ');
237
- this._preventEvent(event);
238
- // Open the picker
239
- this.openDatePicker();
240
- }
241
- _checkIfTouched(opts) {
242
- if (this.textControl.touched) {
243
- this._onTouchedCallback();
244
- if (!opts || opts.emitEvent !== false) {
245
- this.markForCheck();
246
- }
247
- }
248
- }
249
- _preventEvent(event) {
250
- if (!event)
251
- return;
252
- event.preventDefault();
253
- if (event.stopPropagation)
254
- event.stopPropagation();
255
- if (event.stopImmediatePropagation)
256
- event.stopImmediatePropagation();
257
- }
258
- /* -- private methods -- */
259
- updatePattern(pattern) {
260
- pattern = pattern !== 'COMMON.DATE_PATTERN' ? pattern : 'L';
261
- if (this.datePattern !== pattern) {
262
- this.datePattern = pattern;
263
- this.markForCheck();
264
- }
265
- }
266
- onFormChange(value) {
267
- if (this._writing)
268
- return; // Skip if call by self
269
- this._writing = true;
270
- if (value) {
271
- // Make to remove placeholder chars
272
- while (value.indexOf(this.placeholderChar) !== -1) {
273
- value = value.replace(this.placeholderChar, '');
274
- }
275
- // Force '0' for empty month (otherwise moment will use the current month)
276
- value = value.replace('//', '/0/')
277
- // Force '0' for empty year (otherwise moment will use the current year)
278
- .replace(/\/$/, '/0');
279
- }
280
- // Parse date (strict = false)
281
- let date = isNotNilOrBlank(value) && this.dateAdapter.parse(value, this.datePattern) || null;
282
- // Move to the expected TZ, and keep the local hour (= midnight) to have midnight at local time
283
- date = date && (this.timezone ? date.tz(this.timezone, true) : date) || null;
284
- date = date && date
285
- .startOf('day') // Reset hour
286
- .utc() // Convert to UTC (avoid TZ offset in final string)
287
- || null;
288
- // Convert to model value (ISO date string)
289
- // IMPORTANT: If date is invalid, then keep the invalid string value
290
- // to allow SharedValidators.validDate() to raise an error
291
- const formControlValue = date && date.isValid() ? toDateISOString(date) : (value || null);
292
- if (this.formControl.value !== formControlValue) {
293
- // DEBUG
294
- //console.debug('[mat-date] Emit new value: ' + dateStr);
295
- // Apply to form control. => Will call writeValue()
296
- // NOT NEED, because a formControl should NOT be used by multiple fields
297
- //this.formControl.setValue(dateStr, {emitEvent: false})
298
- // Changes comes from inside function: use the callback
299
- this._onChangeCallback(formControlValue);
300
- // Check if need to update controls
301
- this._checkIfTouched();
302
- }
303
- // Force the day control to update its validity (same errors as formControl - see ngOnInit())
304
- this.textControl.updateValueAndValidity();
305
- this._writing = false;
306
- }
307
- updateTabIndex() {
308
- if (isNil(this._tabindex) || this._tabindex === -1)
309
- return; // skip
310
- // Focus to input
311
- setTimeout(() => {
312
- setTabIndex(this._matInput, this._tabindex);
313
- this.markForCheck();
314
- });
315
- }
316
- markAsTouched(opts) {
317
- this.textControl.markAsTouched(opts);
318
- this._onTouchedCallback();
319
- this.markForCheck();
320
- }
321
- markAsDirty(opts) {
322
- this.formControl.markAsDirty(opts);
323
- }
324
- markForCheck() {
325
- this.cd.markForCheck();
326
- }
327
- }
328
- MatDate.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatDate, deps: [{ token: i1.MomentDateAdapter }, { token: i2.TranslateService }, { token: i3.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }, { token: i3.FormGroupDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
329
- MatDate.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: MatDate, selector: "mat-date-field", inputs: { mobile: "mobile", formControl: "formControl", formControlName: "formControlName", placeholder: "placeholder", floatLabel: "floatLabel", appearance: "appearance", required: "required", compact: "compact", placeholderChar: "placeholderChar", autofocus: "autofocus", startDate: "startDate", clearable: "clearable", timezone: "timezone", datePickerFilter: "datePickerFilter", readonly: "readonly", tabindex: "tabindex" }, providers: [
330
- DEFAULT_VALUE_ACCESSOR,
331
- ], viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["datePicker"], descendants: true }, { propertyName: "_matInput", first: true, predicate: ["matInput"], descendants: true }], ngImport: i0, template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\n <mat-label *ngIf=\"floatLabel !== 'never' && !!placeholder\">{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: datePattern} }}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n\n <mat-form-field [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\">\n\n <mat-label *ngIf=\"floatLabel !== 'never' && !!placeholder\">{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <!-- Desktop -->\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"textControl\"\n [textMask]=\"{mask: mask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"_checkIfTouched()\"\n (keyup.arrowDown)=\"openDatePicker()\"\n (keyup.escape)=\"_preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input type=\"text\" [formControl]=\"formControl\" hidden\n *ngIf=\"!mobile\"\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly>\n\n <!-- Mobile -->\n <input #matInput autocomplete=\"off\" type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n *ngIf=\"mobile\"\n [formControl]=\"textControl\"\n (focus)=\"_openDatePickerIfMobile($event)\"\n (click)=\"_openDatePickerIfMobile($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n <input matInput type=\"text\" [formControl]=\"formControl\" hidden\n *ngIf=\"mobile\"\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly>\n\n <button matSuffix type=\"button\" mat-icon-button tabindex=\"-1\"\n (click)=\"openDatePicker()\"\n [disabled]=\"disabled\">\n <mat-icon>{{mobile?'date_range':'keyboard_arrow_down'}}</mat-icon>\n </button>\n\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"disabled\"\n [startAt]=\"startDate\">\n <!-- Date picker buttons -->\n <mat-datepicker-actions *ngIf=\"mobile\">\n <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </mat-datepicker-actions>\n </mat-datepicker>\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors|mapKeys|arrayFirst; let errorKey\"\n [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE</span>\n <span *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</span>\n <span *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</span>\n <span *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n <span *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n <span *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </mat-form-field>\n\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative}mat-form-field input[readonly]{-webkit-user-select:none!important;user-select:none!important}mat-form-field .datetime-md{padding:0!important}mat-form-field button[hidden]{display:none}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { 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.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.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: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i10.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i10.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatDatepickerActions, selector: "mat-datepicker-actions, mat-date-range-picker-actions" }, { kind: "directive", type: i10.MatDatepickerCancel, selector: "[matDatepickerCancel], [matDateRangePickerCancel]" }, { kind: "directive", type: i10.MatDatepickerApply, selector: "[matDatepickerApply], [matDateRangePickerApply]" }, { kind: "directive", type: i11.MaskedInputDirective, selector: "[textMask]", inputs: ["textMask"], exportAs: ["textMask"] }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "pipe", type: i13.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i14.ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: i15.MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: i16.AsFloatLabelType, name: "asFloatLabelType" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
332
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MatDate, decorators: [{
333
- type: Component,
334
- args: [{ selector: 'mat-date-field', providers: [
335
- DEFAULT_VALUE_ACCESSOR,
336
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\n <mat-label *ngIf=\"floatLabel !== 'never' && !!placeholder\">{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: datePattern} }}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n\n <mat-form-field [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\">\n\n <mat-label *ngIf=\"floatLabel !== 'never' && !!placeholder\">{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <!-- Desktop -->\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"textControl\"\n [textMask]=\"{mask: mask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"_checkIfTouched()\"\n (keyup.arrowDown)=\"openDatePicker()\"\n (keyup.escape)=\"_preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input type=\"text\" [formControl]=\"formControl\" hidden\n *ngIf=\"!mobile\"\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly>\n\n <!-- Mobile -->\n <input #matInput autocomplete=\"off\" type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n *ngIf=\"mobile\"\n [formControl]=\"textControl\"\n (focus)=\"_openDatePickerIfMobile($event)\"\n (click)=\"_openDatePickerIfMobile($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n <input matInput type=\"text\" [formControl]=\"formControl\" hidden\n *ngIf=\"mobile\"\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly>\n\n <button matSuffix type=\"button\" mat-icon-button tabindex=\"-1\"\n (click)=\"openDatePicker()\"\n [disabled]=\"disabled\">\n <mat-icon>{{mobile?'date_range':'keyboard_arrow_down'}}</mat-icon>\n </button>\n\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"disabled\"\n [startAt]=\"startDate\">\n <!-- Date picker buttons -->\n <mat-datepicker-actions *ngIf=\"mobile\">\n <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </mat-datepicker-actions>\n </mat-datepicker>\n\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors|mapKeys|arrayFirst; let errorKey\"\n [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE</span>\n <span *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</span>\n <span *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</span>\n <span *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n <span *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n <span *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </mat-form-field>\n\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative}mat-form-field input[readonly]{-webkit-user-select:none!important;user-select:none!important}mat-form-field .datetime-md{padding:0!important}mat-form-field button[hidden]{display:none}\n"] }]
337
- }], ctorParameters: function () { return [{ type: i1.MomentDateAdapter }, { type: i2.TranslateService }, { type: i3.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }, { type: i3.FormGroupDirective, decorators: [{
338
- type: Optional
339
- }] }]; }, propDecorators: { mobile: [{
340
- type: Input
341
- }], formControl: [{
342
- type: Input
343
- }], formControlName: [{
344
- type: Input
345
- }], placeholder: [{
346
- type: Input
347
- }], floatLabel: [{
348
- type: Input
349
- }], appearance: [{
350
- type: Input
351
- }], required: [{
352
- type: Input
353
- }], compact: [{
354
- type: Input
355
- }], placeholderChar: [{
356
- type: Input
357
- }], autofocus: [{
358
- type: Input
359
- }], startDate: [{
360
- type: Input
361
- }], clearable: [{
362
- type: Input
363
- }], timezone: [{
364
- type: Input
365
- }], datePickerFilter: [{
366
- type: Input
367
- }], readonly: [{
368
- type: Input
369
- }], tabindex: [{
370
- type: Input
371
- }], datePicker: [{
372
- type: ViewChild,
373
- args: ['datePicker']
374
- }], _matInput: [{
375
- type: ViewChild,
376
- args: ['matInput', { static: false }]
377
- }] } });
378
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuZGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2RhdGV0aW1lL21hdGVyaWFsLmRhdGUudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC9kYXRldGltZS9tYXRlcmlhbC5kYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQix1QkFBdUIsRUFBcUIsU0FBUyxFQUFjLFVBQVUsRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBWSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDcEwsT0FBTyxFQUEyQyxpQkFBaUIsRUFBMEMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0ksT0FBTyxFQUFDLFFBQVEsRUFBUyxNQUFNLFFBQVEsQ0FBQztBQUN4QyxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2pHLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQWUsV0FBVyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHbEMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDMUUsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJ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Tzt5RkFBUCxPQUFPLHFkQUxQO1FBQ1Qsc0JBQXNCO0tBQ3ZCLDROQ2xDSCxtN0tBb0lBOzRGRC9GYSxPQUFPO2tCQVRuQixTQUFTOytCQUNFLGdCQUFnQixhQUdmO3dCQUNULHNCQUFzQjtxQkFDdkIsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07OzBCQW1FNUMsUUFBUTs0Q0FuREYsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBU08sUUFBUTtzQkFBcEIsS0FBSztnQkFtQm1CLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFDaUIsU0FBUztzQkFBaEQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgUHJvdmlkZXIsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7aXNNb21lbnQsIE1vbWVudH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7REVGQVVMVF9QTEFDRUhPTERFUl9DSEFSfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHtTaGFyZWRWYWxpZGF0b3JzfSBmcm9tICcuLi8uLi92YWxpZGF0b3IvdmFsaWRhdG9ycyc7XG5pbXBvcnQge2lzQmxhbmtTdHJpbmcsIGlzTmlsLCBpc05vdE5pbCwgaXNOb3ROaWxCb29sZWFuLCBpc05vdE5pbE9yQmxhbmt9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQge2ZpbHRlcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtJbnB1dEVsZW1lbnQsIHNldFRhYkluZGV4fSBmcm9tICcuLi8uLi9pbnB1dHMnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtNYXRGb3JtRmllbGRBcHBlYXJhbmNlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7RGF0ZUZpbHRlckZuLCBNYXREYXRlcGlja2VyLCBNYXREYXRlcGlja2VySW5wdXRFdmVudH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQge2lzRm9jdXNhYmxlRWxlbWVudH0gZnJvbSAnLi4vLi4vZm9jdXNhYmxlJztcbmltcG9ydCB7RGF0ZVV0aWxzLCBmcm9tRGF0ZUlTT1N0cmluZywgdG9EYXRlSVNPU3RyaW5nfSBmcm9tICcuLi8uLi9kYXRlcyc7XG5pbXBvcnQge2lzTW9iaWxlfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHtNb21lbnREYXRlQWRhcHRlcn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwtbW9tZW50LWFkYXB0ZXInO1xuaW1wb3J0IHtBcHBGbG9hdExhYmVsVHlwZX0gZnJvbSAnLi4vLi4vZm9ybS9maWVsZC5tb2RlbCc7XG5cbmNvbnN0IERFRkFVTFRfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0RGF0ZSksXG4gIG11bHRpOiB0cnVlXG59O1xuXG5jb25zdCBURVhUX01BU0sgPSBbL1xcZC8sIC9cXGQvLCAnLycsIC9cXGQvLCAvXFxkLywgJy8nLCAvXFxkLywgL1xcZC8sIC9cXGQvLCAvXFxkL107XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWF0LWRhdGUtZmllbGQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWF0ZXJpYWwuZGF0ZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWF0ZXJpYWwuZGF0ZS5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIERFRkFVTFRfVkFMVUVfQUNDRVNTT1IsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1hdERhdGUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIElucHV0RWxlbWVudCB7XG4gIHByaXZhdGUgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIF9vblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBfd3JpdGluZyA9IHRydWU7XG4gIHByaXZhdGUgX2Rpc2FibGluZyA9IGZhbHNlO1xuICBwcml2YXRlIF90YWJpbmRleDogbnVtYmVyO1xuICBwcml2YXRlIF9yZWFkb25seSA9IGZhbHNlO1xuXG4gIHRleHRDb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIGRhdGVQYXR0ZXJuOiBzdHJpbmc7XG4gIGxvY2FsZTogc3RyaW5nO1xuICByZWFkb25seSBtYXNrID0gVEVYVF9NQVNLO1xuXG4gIEBJbnB1dCgpIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgQElucHV0KCkgZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZsb2F0TGFiZWw6IEFwcEZsb2F0TGFiZWxUeXBlID0gJ2F1dG8nO1xuICBASW5wdXQoKSBhcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlID0gJ2ZpbGwnO1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcbiAgQElucHV0KCkgY29tcGFjdCA9IGZhbHNlO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlckNoYXI6IHN0cmluZyA9IERFRkFVTFRfUExBQ0VIT0xERVJfQ0hBUjtcbiAgQElucHV0KCkgYXV0b2ZvY3VzID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGNsZWFyYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSB0aW1lem9uZTogc3RyaW5nID0gbnVsbDtcbiAgQElucHV0KCkgZGF0ZVBpY2tlckZpbHRlcjogRGF0ZUZpbHRlckZuPE1vbWVudD47XG5cbiAgQElucHV0KCkgc2V0IHJlYWRvbmx5KHZhbHVlOiBib29sZWFuKXtcbiAgICB0aGlzLl9yZWFkb25seSA9IHZhbHVlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRhYmluZGV4KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5fdGFiaW5kZXggIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl90YWJpbmRleCA9IHZhbHVlO1xuICAgICAgaWYgKCF0aGlzLl93cml0aW5nKSB0aGlzLnVwZGF0ZVRhYkluZGV4KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRhYmluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmluZGV4O1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbnRyb2wudmFsdWU7XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbnRyb2wuZGlzYWJsZWQ7XG4gIH1cblxuICBAVmlld0NoaWxkKCdkYXRlUGlja2VyJykgZGF0ZVBpY2tlciE6IE1hdERhdGVwaWNrZXI8TW9tZW50PjtcbiAgQFZpZXdDaGlsZCgnbWF0SW5wdXQnLCB7c3RhdGljOiBmYWxzZX0pIF9tYXRJbnB1dDogRWxlbWVudFJlZjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRhdGVBZGFwdGVyOiBNb21lbnREYXRlQWRhcHRlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb3JtR3JvdXBEaXI6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgKSB7XG4gICAgdGhpcy5sb2NhbGUgPSAodHJhbnNsYXRlLmN1cnJlbnRMYW5nIHx8IHRyYW5zbGF0ZS5kZWZhdWx0TGFuZykuc3Vic3RyaW5nKDAsIDIpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuZm9ybUNvbnRyb2wgfHwgdGhpcy5mb3JtQ29udHJvbE5hbWUgJiYgdGhpcy5mb3JtR3JvdXBEaXIgJiYgdGhpcy5mb3JtR3JvdXBEaXIuZm9ybS5nZXQodGhpcy5mb3JtQ29udHJvbE5hbWUpIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcbiAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBtYW5kYXRvcnkgYXR0cmlidXRlIFxcJ2Zvcm1Db250cm9sXFwnIG9yIFxcJ2Zvcm1Db250cm9sTmFtZVxcJyBpbiA8bWF0LWRhdGUtZmllbGQ+LicpO1xuXG4gICAgdGhpcy5tb2JpbGUgPSBpc05vdE5pbCh0aGlzLm1vYmlsZSkgPyB0aGlzLm1vYmlsZSA6IGlzTW9iaWxlKHdpbmRvdyk7XG5cbiAgICB0aGlzLnJlcXVpcmVkID0gaXNOb3ROaWxCb29sZWFuKHRoaXMucmVxdWlyZWQpID8gdGhpcy5yZXF1aXJlZCA6ICh0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciA9PT0gVmFsaWRhdG9ycy5yZXF1aXJlZCB8fCBpc0JsYW5rU3RyaW5nKHRoaXMucmVxdWlyZWQpKTtcblxuICAgIC8vIEFkZCAndmFsaWREYXRlJyB2YWxpZGF0b3IgKHdoZW4gZXhpc3RpbmcgdmFsaWRhdG9yIGFyZSBudWxsIG9yIHJlcXVpcmVkLCB0byBiZSBzdXJlIHRvIGtlZXAgaXQpXG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciB8fCB0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciA9PT0gVmFsaWRhdG9ycy5yZXF1aXJlZCkge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMucmVxdWlyZWQgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGVdIDogU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLnJlcXVpcmVkID8gW3RoaXMuZm9ybUNvbnRyb2wudmFsaWRhdG9yLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZV0gOlxuICAgICAgICBbdGhpcy5mb3JtQ29udHJvbC52YWxpZGF0b3IsIFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlXSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSB0ZXh0IGNvbnRyb2xcbiAgICB0aGlzLnRleHRDb250cm9sID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG51bGwsXG4gICAgICAvLyBJbXBvcnRhbnQ6IHNob3VsZCBjb3B5IGVycm9ycyBmcm9tIHRoZSBtb2RlbCBmb3JtQ29udHJvbFxuICAgICAgKCkgPT4gdGhpcy5mb3JtQ29udHJvbC5lcnJvcnNcbiAgICApO1xuXG4gICAgLy8gR2V0IHBhdHRlcm5zIHRvIGRpc3BsYXkgZGF0ZVxuICAgIHRoaXMudXBkYXRlUGF0dGVybih0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdDT01NT04uREFURV9QQVRURVJOJykpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZS5nZXQoJ0NPTU1PTi5EQVRFX1BBVFRFUk4nKVxuICAgICAgICAuc3Vic2NyaWJlKChwYXR0ZXJuKSA9PiB0aGlzLnVwZGF0ZVBhdHRlcm4ocGF0dGVybikpXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLnRleHRDb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB0aGlzLm9uRm9ybUNoYW5nZSh2YWx1ZSkpKTtcblxuICAgIC8vIExpc3RlbiBzdGF0dXMgY2hhbmdlcyAod2hlbiBkb25lIG91dHNpZGUgdGhlIGNvbXBvbmVudCAgLSBlLmcuIHdoZW4gc2V0RXJyb3JzKCkgaXMgY2FsbGluZyBvbiB0aGUgZm9ybUNvbnRyb2wpXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKF8pID0+ICF0aGlzLnJlYWRvbmx5ICYmICF0aGlzLl93cml0aW5nICYmICF0aGlzLl9kaXNhYmxpbmcpIC8vIFNraXBcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnRleHRDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICBpZiAodGhpcy5mb3JtQ29udHJvbC50b3VjaGVkICYmICF0aGlzLnRleHRDb250cm9sLnRvdWNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dENvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fd3JpdGluZykgcmV0dXJuOyAvLyBTa2lwXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1ZyhcIlttYXQtZGF0ZV0gd3JpdGVWYWx1ZSgpIHdpdGg6XCIsIHZhbHVlKTtcblxuICAgIC8vIENvbnZlcnQgaW50byBkYXRlXG4gICAgLy8gSW1wb3J0YW50OiBjbG9uZSwgYmVjYXVzZSBzdGFydE9mIHdpbGwgdXBkYXRlIHRoZSBleGlzdGluZyBkYXRlXG4gICAgY29uc3QgZGF0ZSA9IGlzTW9tZW50KHZhbHVlKSA/IHZhbHVlLmNsb25lKCkgOiBmcm9tRGF0ZUlTT1N0cmluZyh2YWx1ZSk7XG5cbiAgICBpZiAoIWRhdGUgfHwgIWRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICB0aGlzLnRleHRDb250cm9sLnBhdGNoVmFsdWUobnVsbCwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShudWxsLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIE1vdmUgdG8gdGhlIGV4cGVjdGVkIFRaIChrZWVwaW5nIGxvY2FsIGhvdXIgLSBlLmcuIG1pZG5pZ2h0KVxuICAgICAgY29uc3QgZGF5ID0gKHRoaXMudGltZXpvbmUgJiYgZGF0ZS50eih0aGlzLnRpbWV6b25lKSB8fCBkYXRlKVxuICAgICAgICAvLyBSZXNldCBob3VyXG4gICAgICAgIC5zdGFydE9mKCdkYXknKTtcbiAgICAgIGNvbnN0IGRheVN0ciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZm9ybWF0KGRheSwgdGhpcy5kYXRlUGF0dGVybik7XG5cbiAgICAgIGlmICh0aGlzLnRleHRDb250cm9sLnZhbHVlICE9PSBkYXlTdHIpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRleHQgY29udHJvbFxuICAgICAgICB0aGlzLnRleHRDb250cm9sLnBhdGNoVmFsdWUoZGF5U3RyLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGlzYWJsaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLl9kaXNhYmxpbmcgPSB0cnVlO1xuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLnRleHRDb250cm9sLmRpc2FibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXh0Q29udHJvbC5lbmFibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gICAgdGhpcy5fZGlzYWJsaW5nID0gZmFsc2U7XG5cbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb3BlbkRhdGVQaWNrZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGVQaWNrZXIpIHJldHVybjtcblxuICAgIGlmICghdGhpcy5kYXRlUGlja2VyLm9wZW5lZCkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vY29uc29sZS5kZWJ1ZygnW21hdC1kYXRlXSBPcGVuaW5nIGRhdGUgcGlja2VyLi4uJyk7XG5cbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5vcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXMoKSB7XG4gICAgaWYgKCF0aGlzLl9tYXRJbnB1dCkgcmV0dXJuO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoaXNGb2N1c2FibGVFbGVtZW50KHRoaXMuX21hdElucHV0Lm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX21hdElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMudGV4dENvbnRyb2wucGF0Y2hWYWx1ZShudWxsLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUobnVsbCwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKG51bGwpO1xuICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIF9vbkRhdGVQaWNrZXJDaGFuZ2UoZXZlbnQ6IE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50PE1vbWVudD4pOiB2b2lkIHtcbiAgICAvLyBNYWtlIHN1cmUgZXZlbnQgaXMgdmFsaWRcbiAgICBpZiAoIWV2ZW50IHx8IChldmVudC52YWx1ZSAhPT0gbnVsbCAmJiAhaXNNb21lbnQoZXZlbnQudmFsdWUpKSkge1xuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIE1hdERhdGVwaWNrZXIgZXZlbnQuIFNraXBwaW5nJywgZXZlbnQpO1xuICAgICAgcmV0dXJuOyAvLyBTa2lwXG4gICAgfVxuXG4gICAgbGV0IHZhbHVlID0gZXZlbnQudmFsdWU7XG5cbiAgICAvLyBObyB2YWx1ZSwgYnV0IG1vYmlsZSBtb2RlOiB1c2UgdGhlIGN1cnJlbnQgZGF0ZVxuICAgIGlmICghdmFsdWUgJiYgdGhpcy5tb2JpbGUpIHtcbiAgICAgIHZhbHVlID0gRGF0ZVV0aWxzLnJlc2V0VGltZShEYXRlVXRpbHMubW9tZW50KCkubG9jYWxlKHRoaXMubG9jYWxlKSwgdGhpcy50aW1lem9uZSk7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHRvRGF0ZUlTT1N0cmluZyh2YWx1ZSksIHtcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSAvLyBXaWxsIGNhbGwgd3JpdGVWYWx1ZSgpXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRlID0gdmFsdWU/LmNsb25lKClcbiAgICAgIC5sb2NhbGUodGhpcy5sb2NhbGUpIC8vIHNldCBhcyB0aW1lIGFzIGxvY2FsZSB0aW1lXG4gICAgICAuc3RhcnRPZignZGF5JykvLyByZXNldCBob3VyXG4gICAgICAudXRjKHRydWUpO1xuICAgIGNvbnN0IGRhdGVTdHIgPSBkYXRlICYmIHRoaXMuZGF0ZUFkYXB0ZXIuZm9ybWF0KGRhdGUsIHRoaXMuZGF0ZVBhdHRlcm4pIHx8IG51bGw7XG5cbiAgICBpZiAodGhpcy50ZXh0Q29udHJvbC52YWx1ZSAhPT0gZGF0ZVN0cikge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlttYXQtZGF0ZV0gb25EYXRlUGlja2VyQ2hhbmdlKCkgbmV3IHZhbHVlOlwiLCBkYXRlU3RyKTtcblxuICAgICAgdGhpcy50ZXh0Q29udHJvbC5zZXRWYWx1ZShkYXRlU3RyLCB7XG4gICAgICAgIGVtaXRFdmVudDogdHJ1ZSAvLyBXaWxsIGNhbGwgb25Gb3JtQ2hhbmdlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX29wZW5EYXRlUGlja2VySWZNb2JpbGUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLm1vYmlsZVxuICAgICAgfHwgZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWRcbiAgICAgIHx8IHRoaXMuZGF0ZVBpY2tlcj8ub3BlbmVkXG4gICAgICB8fCB0aGlzLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICAvL2NvbnNvbGUuZGVidWcoJ1ttYXQtZGF0ZV0gUHJlcGFyaW5nIHRvIG9wZW4gZGF0ZSBwaWNrZXIuLi4gJyk7XG5cbiAgICB0aGlzLl9wcmV2ZW50RXZlbnQoZXZlbnQpO1xuXG4gICAgLy8gT3BlbiB0aGUgcGlja2VyXG4gICAgdGhpcy5vcGVuRGF0ZVBpY2tlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jaGVja0lmVG91Y2hlZChvcHRzPzoge2VtaXRFdmVudD86IGJvb2xlYW59KSB7XG4gICAgaWYgKHRoaXMudGV4dENvbnRyb2wudG91Y2hlZCkge1xuICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcblxuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfcHJldmVudEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghZXZlbnQpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyogLS0gcHJpdmF0ZSBtZXRob2RzIC0tICovXG5cbiAgcHJpdmF0ZSB1cGRhdGVQYXR0ZXJuKHBhdHRlcm46IHN0cmluZykge1xuICAgIHBhdHRlcm4gPSBwYXR0ZXJuICE9PSAnQ09NTU9OLkRBVEVfUEFUVEVSTicgPyBwYXR0ZXJuIDogJ0wnO1xuICAgIGlmICh0aGlzLmRhdGVQYXR0ZXJuICE9PSBwYXR0ZXJuKSB7XG4gICAgICB0aGlzLmRhdGVQYXR0ZXJuID0gcGF0dGVybjtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkZvcm1DaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSByZXR1cm47IC8vIFNraXAgaWYgY2FsbCBieSBzZWxmXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIC8vIE1ha2UgdG8gcmVtb3ZlIHBsYWNlaG9sZGVyIGNoYXJzXG4gICAgICB3aGlsZSAodmFsdWUuaW5kZXhPZih0aGlzLnBsYWNlaG9sZGVyQ2hhcikgIT09IC0xKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSh0aGlzLnBsYWNlaG9sZGVyQ2hhciwgJycpO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JjZSAnMCcgZm9yIGVtcHR5IG1vbnRoIChvdGhlcndpc2UgbW9tZW50IHdpbGwgdXNlIHRoZSBjdXJyZW50IG1vbnRoKVxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCcvLycsICcvMC8nKVxuICAgICAgICAvLyBGb3JjZSAnMCcgZm9yIGVtcHR5IHllYXIgKG90aGVyd2lzZSBtb21lbnQgd2lsbCB1c2UgdGhlIGN1cnJlbnQgeWVhcilcbiAgICAgICAgLnJlcGxhY2UoL1xcLyQvLCAnLzAnKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBkYXRlIChzdHJpY3QgPSBmYWxzZSlcbiAgICBsZXQgZGF0ZTogTW9tZW50ID0gaXNOb3ROaWxPckJsYW5rKHZhbHVlKSAmJiB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKHZhbHVlLCB0aGlzLmRhdGVQYXR0ZXJuKSB8fCBudWxsO1xuXG4gICAgLy8gTW92ZSB0byB0aGUgZXhwZWN0ZWQgVFosIGFuZCBrZWVwIHRoZSBsb2NhbCBob3VyICg9IG1pZG5pZ2h0KSB0byBoYXZlIG1pZG5pZ2h0IGF0IGxvY2FsIHRpbWVcbiAgICBkYXRlID0gZGF0ZSAmJiAodGhpcy50aW1lem9uZSA/IGRhdGUudHoodGhpcy50aW1lem9uZSwgdHJ1ZSkgOiBkYXRlKSB8fCBudWxsO1xuXG4gICAgZGF0ZSA9IGRhdGUgJiYgZGF0ZVxuICAgICAgLnN0YXJ0T2YoJ2RheScpIC8vIFJlc2V0IGhvdXJcbiAgICAgIC51dGMoKSAvLyBDb252ZXJ0IHRvIFVUQyAoYXZvaWQgVFogb2Zmc2V0IGluIGZpbmFsIHN0cmluZylcbiAgICAgIHx8IG51bGw7XG5cbiAgICAvLyBDb252ZXJ0IHRvIG1vZGVsIHZhbHVlIChJU08gZGF0ZSBzdHJpbmcpXG4gICAgLy8gSU1QT1JUQU5UOiBJZiBkYXRlIGlzIGludmFsaWQsIHRoZW4ga2VlcCB0aGUgaW52YWxpZCBzdHJpbmcgdmFsdWVcbiAgICAvLyB0byBhbGxvdyBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZSgpIHRvIHJhaXNlIGFuIGVycm9yXG4gICAgY29uc3QgZm9ybUNvbnRyb2xWYWx1ZSA9IGRhdGUgJiYgZGF0ZS5pc1ZhbGlkKCkgPyB0b0RhdGVJU09TdHJpbmcoZGF0ZSkgOiAodmFsdWUgfHwgbnVsbCk7XG5cbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC52YWx1ZSAhPT0gZm9ybUNvbnRyb2xWYWx1ZSkge1xuXG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKCdbbWF0LWRhdGVdIEVtaXQgbmV3IHZhbHVlOiAnICsgZGF0ZVN0cik7XG5cbiAgICAgIC8vIEFwcGx5IHRvIGZvcm0gY29udHJvbC4gPT4gV2lsbCBjYWxsIHdyaXRlVmFsdWUoKVxuICAgICAgLy8gTk9UIE5FRUQsIGJlY2F1c2UgYSBmb3JtQ29udHJvbCBzaG91bGQgTk9UIGJlIHVzZWQgYnkgbXVsdGlwbGUgZmllbGRzXG4gICAgICAvL3RoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUoZGF0ZVN0ciwge2VtaXRFdmVudDogZmFsc2V9KVxuXG4gICAgICAvLyBDaGFuZ2VzIGNvbWVzIGZyb20gaW5zaWRlIGZ1bmN0aW9uOiB1c2UgdGhlIGNhbGxiYWNrXG4gICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKGZvcm1Db250cm9sVmFsdWUpO1xuXG4gICAgICAvLyBDaGVjayBpZiBuZWVkIHRvIHVwZGF0ZSBjb250cm9sc1xuICAgICAgdGhpcy5fY2hlY2tJZlRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICAvLyBGb3JjZSB0aGUgZGF5IGNvbnRyb2wgdG8gdXBkYXRlIGl0cyB2YWxpZGl0eSAoc2FtZSBlcnJvcnMgYXMgZm9ybUNvbnRyb2wgLSBzZWUgbmdPbkluaXQoKSlcbiAgICB0aGlzLnRleHRDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcblxuICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFiSW5kZXgoKSB7XG4gICAgaWYgKGlzTmlsKHRoaXMuX3RhYmluZGV4KSB8fCB0aGlzLl90YWJpbmRleCA9PT0gLTEpIHJldHVybjsgLy8gc2tpcFxuXG4gICAgLy8gRm9jdXMgdG8gaW5wdXRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNldFRhYkluZGV4KHRoaXMuX21hdElucHV0LCB0aGlzLl90YWJpbmRleCk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQXNUb3VjaGVkKG9wdHM/OiB7b25seVNlbGY/OiBib29sZWFufSkge1xuICAgIHRoaXMudGV4dENvbnRyb2wubWFya0FzVG91Y2hlZChvcHRzKTtcbiAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtBc0RpcnR5KG9wdHM/OiBhbnkpIHtcbiAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KG9wdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuXG4iLCI8IS0tIHJlYWRvbmx5IC0tPlxuPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwicmVhZG9ubHk7IGVsc2Ugd3JpdGFibGVcIlxuICAgICAgICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICAgICAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkXCI+XG4gIDxtYXQtbGFiZWwgKm5nSWY9XCJmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXJcIj57e3BsYWNlaG9sZGVyfX08L21hdC1sYWJlbD5cblxuICA8ZGl2IG1hdFByZWZpeD5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPGlucHV0IG1hdElucHV0IGhpZGRlbiB0eXBlPVwidGV4dFwiXG4gICAgICAgICByZWFkb25seVxuICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCI+XG4gIDxpb24tdGV4dD57e2Zvcm1Db250cm9sLnZhbHVlfGRhdGVGb3JtYXQ6IHtwYXR0ZXJuOiBkYXRlUGF0dGVybn0gfX08L2lvbi10ZXh0PlxuXG4gIDxkaXYgbWF0U3VmZml4PlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbWF0LWZvcm0tZmllbGQ+XG5cbjwhLS0gd3JpdGFibGUgLS0+XG48bmctdGVtcGxhdGUgI3dyaXRhYmxlPlxuXG4gIDxtYXQtZm9ybS1maWVsZCBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgICAgICAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCI+XG5cbiAgICA8bWF0LWxhYmVsICpuZ0lmPVwiZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiAhIXBsYWNlaG9sZGVyXCI+e3twbGFjZWhvbGRlcn19PC9tYXQtbGFiZWw+XG5cbiAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBEZXNrdG9wIC0tPlxuICAgIDxpbnB1dCBtYXRJbnB1dCAjbWF0SW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAqbmdJZj1cIiFtb2JpbGVcIlxuICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwidGV4dENvbnRyb2xcIlxuICAgICAgICAgICBbdGV4dE1hc2tdPVwie21hc2s6IG1hc2ssIGtlZXBDaGFyUG9zaXRpb25zOiB0cnVlLCBwbGFjZWhvbGRlckNoYXI6IHBsYWNlaG9sZGVyQ2hhcn1cIlxuICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0NPTU1PTi5EQVRFX1BMQUNFSE9MREVSJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAoYmx1cik9XCJfY2hlY2tJZlRvdWNoZWQoKVwiXG4gICAgICAgICAgIChrZXl1cC5hcnJvd0Rvd24pPVwib3BlbkRhdGVQaWNrZXIoKVwiXG4gICAgICAgICAgIChrZXl1cC5lc2NhcGUpPVwiX3ByZXZlbnRFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgICAgW2FwcEF1dG9mb2N1c109XCJhdXRvZm9jdXNcIj5cbiAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIiBoaWRkZW5cbiAgICAgICAgICAgKm5nSWY9XCIhbW9iaWxlXCJcbiAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwiZGF0ZVBpY2tlclwiXG4gICAgICAgICAgIFttYXREYXRlcGlja2VyRmlsdGVyXT1cImRhdGVQaWNrZXJGaWx0ZXJcIlxuICAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJfb25EYXRlUGlja2VyQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICByZWFkb25seT5cblxuICAgIDwhLS0gTW9iaWxlIC0tPlxuICAgIDxpbnB1dCAjbWF0SW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIlxuICAgICAgICAgICBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1pbnB1dC1jb250cm9sIG1kYy10ZXh0LWZpZWxkX19pbnB1dFwiXG4gICAgICAgICAgICpuZ0lmPVwibW9iaWxlXCJcbiAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInRleHRDb250cm9sXCJcbiAgICAgICAgICAgKGZvY3VzKT1cIl9vcGVuRGF0ZVBpY2tlcklmTW9iaWxlKCRldmVudClcIlxuICAgICAgICAgICAoY2xpY2spPVwiX29wZW5EYXRlUGlja2VySWZNb2JpbGUoJGV2ZW50KVwiXG4gICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgICAgIHJlYWRvbmx5PlxuICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiIGhpZGRlblxuICAgICAgICAgICAqbmdJZj1cIm1vYmlsZVwiXG4gICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cImRhdGVQaWNrZXJcIlxuICAgICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJkYXRlUGlja2VyRmlsdGVyXCJcbiAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiX29uRGF0ZVBpY2tlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgcmVhZG9ubHk+XG5cbiAgICA8YnV0dG9uIG1hdFN1ZmZpeCB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5EYXRlUGlja2VyKClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICA8bWF0LWljb24+e3ttb2JpbGU/J2RhdGVfcmFuZ2UnOidrZXlib2FyZF9hcnJvd19kb3duJ319PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxtYXQtZGF0ZXBpY2tlciAjZGF0ZVBpY2tlclxuICAgICAgICAgICAgICAgICAgICBbdG91Y2hVaV09XCJtb2JpbGVcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbc3RhcnRBdF09XCJzdGFydERhdGVcIj5cbiAgICAgIDwhLS0gRGF0ZSBwaWNrZXIgYnV0dG9ucyAtLT5cbiAgICAgIDxtYXQtZGF0ZXBpY2tlci1hY3Rpb25zICpuZ0lmPVwibW9iaWxlXCI+XG4gICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIG1hdERhdGVwaWNrZXJDYW5jZWw+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9DQU5DRUw8L2lvbi1sYWJlbD5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwic29saWRcIiBjb2xvcj1cInRlcnRpYXJ5XCIgbWF0RGF0ZXBpY2tlckFwcGx5PlxuICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5CVE5fVkFMSURBVEU8L2lvbi1sYWJlbD5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9tYXQtZGF0ZXBpY2tlci1hY3Rpb25zPlxuICAgIDwvbWF0LWRhdGVwaWNrZXI+XG5cbiAgICA8YnV0dG9uIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICpuZ0lmPVwiY2xlYXJhYmxlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigpXCJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZm9ybUNvbnRyb2wuZGlzYWJsZWQgfHwgIWZvcm1Db250cm9sLnZhbHVlXCI+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBlcnJvcnMgLS0+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm1Db250cm9sLnRvdWNoZWQgJiYgZm9ybUNvbnRyb2wuZXJyb3JzfG1hcEtleXN8YXJyYXlGaXJzdDsgbGV0IGVycm9yS2V5XCJcbiAgICAgICAgICAgICAgIFtuZ1N3aXRjaF09XCJlcnJvcktleVwiPlxuICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidyZXF1aXJlZCdcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L3NwYW4+XG4gICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3ZhbGlkRGF0ZSdcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEU8L3NwYW4+XG4gICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGVJc0FmdGVyJ1wiPnt7J0VSUk9SLkZJRUxEX05PVF9WQUxJRF9EQVRFX0FGVEVSJyB8IHRyYW5zbGF0ZTogZm9ybUNvbnRyb2wuZXJyb3JzLmRhdGVJc0FmdGVyIH19PC9zcGFuPlxuICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidkYXRlSXNCZWZvcmUnXCI+e3snRVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfQkVGT1JFJyB8IHRyYW5zbGF0ZTogZm9ybUNvbnRyb2wuZXJyb3JzLmRhdGVJc0JlZm9yZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZGF0ZVJhbmdlJ1wiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9SQU5HRTwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZGF0ZU1heER1cmF0aW9uJ1wiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9NQVhfRFVSQVRJT048L3NwYW4+XG4gICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGVNaW5EdXJhdGlvbidcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfTUlOX0RVUkFUSU9OPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidtc2cnXCI+e3soZm9ybUNvbnRyb2wuZXJyb3JzLm1zZz8ua2V5IHx8IGZvcm1Db250cm9sLmVycm9ycy5tc2cpIHwgdHJhbnNsYXRlOiBmb3JtQ29udHJvbC5lcnJvcnMubXNnPy5wYXJhbXN9fTwvc3Bhbj5cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtZXJyb3JcIj48L25nLWNvbnRlbnQ+XG5cbiAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBtYXQgaGludCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWF0LWZvcm0tZmllbGQtaGludC13cmFwcGVyXCIgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiZm9ybUNvbnRyb2wuaW52YWxpZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWhpbnQtc3BhY2VyXCI+PC9kaXY+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtaGludFwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRQcmVmaXhUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFByZWZpeF1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21hdFN1ZmZpeFRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0U3VmZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=