@sumaris-net/ngx-components 18.12.13 → 18.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1405) hide show
  1. package/.editorconfig +24 -0
  2. package/.eslintrc.json +95 -0
  3. package/.gitattribute +1 -0
  4. package/.github/CONTRIBUTING.md +10 -0
  5. package/.github/ISSUE_TEMPLATE.md +6 -0
  6. package/.github/PULL_REQUEST_TEMPLATE.md +10 -0
  7. package/.github/github_disclaimer.md +14 -0
  8. package/.gitlab-ci.yml +46 -0
  9. package/.graphqlconfig +15 -0
  10. package/.prettierignore +9 -0
  11. package/.prettierrc.json +17 -0
  12. package/angular.json +239 -0
  13. package/capacitor.config.ts +49 -0
  14. package/doc/changelog.md +11 -0
  15. package/doc/feed/feed-en.json +26 -0
  16. package/doc/feed/feed-fr.json +26 -0
  17. package/graphql.config.yml +13 -0
  18. package/ionic.config.json +7 -0
  19. package/karma.conf.js +38 -0
  20. package/ng-package.json +21 -0
  21. package/package.json +133 -19
  22. package/public_api.ts +436 -0
  23. package/resources/README.md +7 -0
  24. package/resources/icon/TODO.md +11 -0
  25. package/resources/icon.png +0 -0
  26. package/resources/icon.png.md5 +1 -0
  27. package/resources/icon.xcf +0 -0
  28. package/resources/ios/icon/icon-1024.png +0 -0
  29. package/resources/ios/icon/icon-108@2x.png +0 -0
  30. package/resources/ios/icon/icon-20.png +0 -0
  31. package/resources/ios/icon/icon-20@2x.png +0 -0
  32. package/resources/ios/icon/icon-20@3x.png +0 -0
  33. package/resources/ios/icon/icon-24@2x.png +0 -0
  34. package/resources/ios/icon/icon-27.5@2x.png +0 -0
  35. package/resources/ios/icon/icon-29.png +0 -0
  36. package/resources/ios/icon/icon-29@2x.png +0 -0
  37. package/resources/ios/icon/icon-29@3x.png +0 -0
  38. package/resources/ios/icon/icon-40.png +0 -0
  39. package/resources/ios/icon/icon-40@2x.png +0 -0
  40. package/resources/ios/icon/icon-40@3x.png +0 -0
  41. package/resources/ios/icon/icon-44@2x.png +0 -0
  42. package/resources/ios/icon/icon-50.png +0 -0
  43. package/resources/ios/icon/icon-50@2x.png +0 -0
  44. package/resources/ios/icon/icon-60.png +0 -0
  45. package/resources/ios/icon/icon-60@2x.png +0 -0
  46. package/resources/ios/icon/icon-60@3x.png +0 -0
  47. package/resources/ios/icon/icon-72.png +0 -0
  48. package/resources/ios/icon/icon-72@2x.png +0 -0
  49. package/resources/ios/icon/icon-76.png +0 -0
  50. package/resources/ios/icon/icon-76@2x.png +0 -0
  51. package/resources/ios/icon/icon-83.5@2x.png +0 -0
  52. package/resources/ios/icon/icon-86@2x.png +0 -0
  53. package/resources/ios/icon/icon-98@2x.png +0 -0
  54. package/resources/ios/icon/icon-small.png +0 -0
  55. package/resources/ios/icon/icon-small@2x.png +0 -0
  56. package/resources/ios/icon/icon-small@3x.png +0 -0
  57. package/resources/ios/icon/icon.png +0 -0
  58. package/resources/ios/icon/icon@2x.png +0 -0
  59. package/resources/ios/splash/Default-1792h~iphone.png +0 -0
  60. package/resources/ios/splash/Default-2436h.png +0 -0
  61. package/resources/ios/splash/Default-2688h~iphone.png +0 -0
  62. package/resources/ios/splash/Default-568h@2x~iphone.png +0 -0
  63. package/resources/ios/splash/Default-667h.png +0 -0
  64. package/resources/ios/splash/Default-736h.png +0 -0
  65. package/resources/ios/splash/Default-Landscape-1792h~iphone.png +0 -0
  66. package/resources/ios/splash/Default-Landscape-2436h.png +0 -0
  67. package/resources/ios/splash/Default-Landscape-2688h~iphone.png +0 -0
  68. package/resources/ios/splash/Default-Landscape-736h.png +0 -0
  69. package/resources/ios/splash/Default-Landscape@2x~ipad.png +0 -0
  70. package/resources/ios/splash/Default-Landscape@~ipadpro.png +0 -0
  71. package/resources/ios/splash/Default-Landscape~ipad.png +0 -0
  72. package/resources/ios/splash/Default-Portrait@2x~ipad.png +0 -0
  73. package/resources/ios/splash/Default-Portrait@~ipadpro.png +0 -0
  74. package/resources/ios/splash/Default-Portrait~ipad.png +0 -0
  75. package/resources/ios/splash/Default@2x~iphone.png +0 -0
  76. package/resources/ios/splash/Default@2x~universal~anyany.png +0 -0
  77. package/resources/ios/splash/Default~iphone.png +0 -0
  78. package/resources/splash.png +0 -0
  79. package/resources/splash.png.md5 +1 -0
  80. package/scripts/build-android.sh +18 -0
  81. package/scripts/docker-start.sh +6 -0
  82. package/scripts/emulate-android.sh +17 -0
  83. package/scripts/env-android.sh +83 -0
  84. package/scripts/env-clean.sh +23 -0
  85. package/scripts/env-global.sh +154 -0
  86. package/scripts/install-android-sdk-tools.sh +73 -0
  87. package/scripts/ionic-update.sh +24 -0
  88. package/scripts/node/build-i18n.js +37 -0
  89. package/scripts/node/playground.ts +9 -0
  90. package/scripts/node/resources.js +108 -0
  91. package/scripts/release.sh +162 -0
  92. package/scripts/run-android.sh +59 -0
  93. package/scripts/test.sh +19 -0
  94. package/src/app/admin/admin-routing.module.ts +26 -0
  95. package/src/app/admin/admin.module.ts +20 -0
  96. package/src/app/admin/services/filter/person.filter.ts +86 -0
  97. package/src/app/admin/services/person.service.ts +244 -0
  98. package/src/app/admin/services/validator/person.validator.ts +86 -0
  99. package/src/app/admin/users/users.html +613 -0
  100. package/src/app/admin/users/users.module.ts +32 -0
  101. package/src/app/admin/users/users.scss +80 -0
  102. package/src/app/admin/users/users.ts +387 -0
  103. package/src/app/app-routing.module.ts +165 -0
  104. package/src/app/app.component.html +18 -0
  105. package/src/app/app.component.scss +4 -0
  106. package/src/app/app.component.ts +257 -0
  107. package/src/app/app.module.ts +366 -0
  108. package/src/app/core/about/about.modal.html +145 -0
  109. package/src/app/core/about/about.modal.scss +22 -0
  110. package/src/app/core/about/about.modal.ts +69 -0
  111. package/src/app/core/about/about.module.ts +14 -0
  112. package/src/app/core/account/account.module.ts +43 -0
  113. package/src/app/core/account/account.page.html +329 -0
  114. package/src/app/core/account/account.page.scss +20 -0
  115. package/src/app/core/account/account.page.ts +389 -0
  116. package/src/app/core/account/new-token.form.html +90 -0
  117. package/src/app/core/account/new-token.form.ts +99 -0
  118. package/src/app/core/account/new-token.modal.html +52 -0
  119. package/src/app/core/account/new-token.modal.ts +68 -0
  120. package/src/app/core/account/password/change-password.form.html +62 -0
  121. package/src/app/core/account/password/change-password.form.scss +0 -0
  122. package/src/app/core/account/password/change-password.form.ts +58 -0
  123. package/src/app/core/account/password/change-password.module.ts +14 -0
  124. package/src/app/core/account/password/change-password.page.html +41 -0
  125. package/src/app/core/account/password/change-password.page.scss +49 -0
  126. package/src/app/core/account/password/change-password.page.ts +158 -0
  127. package/src/app/core/account/token.table.html +160 -0
  128. package/src/app/core/account/token.table.scss +7 -0
  129. package/src/app/core/account/token.table.ts +160 -0
  130. package/src/app/core/auth/auth.form.html +108 -0
  131. package/src/app/core/auth/auth.form.scss +0 -0
  132. package/src/app/core/auth/auth.form.ts +165 -0
  133. package/src/app/core/auth/auth.modal.html +50 -0
  134. package/src/app/core/auth/auth.modal.scss +0 -0
  135. package/src/app/core/auth/auth.modal.ts +78 -0
  136. package/src/app/core/auth/auth.module.ts +35 -0
  137. package/src/app/core/auth/reset-password.modal.html +59 -0
  138. package/src/app/core/auth/reset-password.modal.ts +83 -0
  139. package/src/app/core/core.module.ts +72 -0
  140. package/src/app/core/core.testing.module.ts +80 -0
  141. package/src/app/core/form/array/form-array.ts +409 -0
  142. package/src/app/core/form/array/testing/form-array-test.module.ts +15 -0
  143. package/src/app/core/form/array/testing/form-array.test.html +196 -0
  144. package/src/app/core/form/array/testing/form-array.test.ts +119 -0
  145. package/src/app/core/form/buttons/form-buttons-bar.component.html +82 -0
  146. package/src/app/core/form/buttons/form-buttons-bar.component.scss +19 -0
  147. package/src/app/core/form/buttons/form-buttons-bar.component.ts +89 -0
  148. package/src/app/core/form/buttons/form-buttons-bar.module.ts +20 -0
  149. package/src/app/core/form/entity/editor.class.ts +295 -0
  150. package/src/app/core/form/entity/entity-editor-modal.class.ts +494 -0
  151. package/src/app/core/form/entity/entity-editor.class.ts +894 -0
  152. package/src/app/core/form/entity/entity-metadata.component.html +57 -0
  153. package/src/app/core/form/entity/entity-metadata.component.scss +40 -0
  154. package/src/app/core/form/entity/entity-metadata.component.ts +18 -0
  155. package/src/app/core/form/entity/entity.module.ts +20 -0
  156. package/src/app/core/form/entity/tab-editor.class.ts +224 -0
  157. package/src/app/core/form/form-container.class.ts +381 -0
  158. package/src/app/core/form/form.class.ts +377 -0
  159. package/src/app/core/form/form.module.ts +38 -0
  160. package/src/app/core/form/form.utils.ts +336 -0
  161. package/src/app/core/form/list/list.form.html +68 -0
  162. package/src/app/core/form/list/list.form.scss +40 -0
  163. package/src/app/core/form/list/list.form.ts +266 -0
  164. package/src/app/core/form/list/list.module.ts +20 -0
  165. package/src/app/core/form/properties/properties.form.html +160 -0
  166. package/src/app/core/form/properties/properties.form.scss +21 -0
  167. package/src/app/core/form/properties/properties.form.ts +331 -0
  168. package/src/app/core/form/properties/properties.module.ts +24 -0
  169. package/src/app/core/form/properties/properties.table.html +228 -0
  170. package/src/app/core/form/properties/properties.table.scss +0 -0
  171. package/src/app/core/form/properties/properties.table.ts +275 -0
  172. package/src/app/core/form/properties/properties.utils.ts +391 -0
  173. package/src/app/core/form/properties/property.validator.ts +82 -0
  174. package/src/app/core/form/properties/testing/properties-form.test.html +23 -0
  175. package/src/app/core/form/properties/testing/properties-form.test.ts +109 -0
  176. package/src/app/core/form/properties/testing/properties-form.testing.module.ts +14 -0
  177. package/src/app/core/form/text-popover/testing/text-popover.testing.html +50 -0
  178. package/src/app/core/form/text-popover/testing/text-popover.testing.module.ts +21 -0
  179. package/src/app/core/form/text-popover/testing/text-popover.testing.ts +76 -0
  180. package/src/app/core/form/text-popover/text-popover.component.html +89 -0
  181. package/src/app/core/form/text-popover/text-popover.component.scss +7 -0
  182. package/src/app/core/form/text-popover/text-popover.component.ts +176 -0
  183. package/src/app/core/form/text-popover/text-popover.module.ts +19 -0
  184. package/src/app/core/form/username/username.form.html +27 -0
  185. package/src/app/core/form/username/username.form.ts +44 -0
  186. package/src/app/core/form/username/username.module.ts +12 -0
  187. package/src/app/core/graphql/graphql.module.ts +7 -0
  188. package/src/app/core/graphql/graphql.service.ts +962 -0
  189. package/src/app/core/graphql/graphql.utils.ts +166 -0
  190. package/src/app/core/home/home.html +327 -0
  191. package/src/app/core/home/home.module.ts +31 -0
  192. package/src/app/core/home/home.scss +300 -0
  193. package/src/app/core/home/home.ts +453 -0
  194. package/src/app/core/icon/icon.component.html +19 -0
  195. package/src/app/core/icon/icon.component.ts +22 -0
  196. package/src/app/core/icon/icon.module.ts +13 -0
  197. package/src/app/core/install/install-upgrade-card.component.html +144 -0
  198. package/src/app/core/install/install-upgrade-card.component.scss +3 -0
  199. package/src/app/core/install/install-upgrade-card.component.ts +445 -0
  200. package/src/app/core/install/install-upgrade-card.module.ts +18 -0
  201. package/src/app/core/menu/menu.component.html +219 -0
  202. package/src/app/core/menu/menu.component.scss +304 -0
  203. package/src/app/core/menu/menu.component.ts +251 -0
  204. package/src/app/core/menu/menu.filter.ts +28 -0
  205. package/src/app/core/menu/menu.model.ts +356 -0
  206. package/src/app/core/menu/menu.module.ts +27 -0
  207. package/src/app/core/menu/menu.service.ts +727 -0
  208. package/src/app/core/menu/sub-menu-tab.directive.ts +99 -0
  209. package/src/app/core/menu/testing/menu-other.testing.ts +57 -0
  210. package/src/app/core/menu/testing/menu.testing.html +143 -0
  211. package/src/app/core/menu/testing/menu.testing.module.ts +52 -0
  212. package/src/app/core/menu/testing/menu.testing.scss +5 -0
  213. package/src/app/core/menu/testing/menu.testing.ts +175 -0
  214. package/src/app/core/offline/update-offline-mode-card.component.html +39 -0
  215. package/src/app/core/offline/update-offline-mode-card.component.scss +3 -0
  216. package/src/app/core/offline/update-offline-mode-card.component.ts +23 -0
  217. package/src/app/core/offline/update-offline-mode-card.module.ts +20 -0
  218. package/src/app/core/peer/select-peer.modal.html +317 -0
  219. package/src/app/core/peer/select-peer.modal.scss +41 -0
  220. package/src/app/core/peer/select-peer.modal.ts +366 -0
  221. package/src/app/core/peer/select-peer.module.ts +23 -0
  222. package/src/app/core/register/register-confirm.page.html +51 -0
  223. package/src/app/core/register/register-confirm.page.scss +56 -0
  224. package/src/app/core/register/register-confirm.page.ts +90 -0
  225. package/src/app/core/register/register.form.html +143 -0
  226. package/src/app/core/register/register.form.scss +10 -0
  227. package/src/app/core/register/register.form.ts +218 -0
  228. package/src/app/core/register/register.modal.html +66 -0
  229. package/src/app/core/register/register.modal.ts +50 -0
  230. package/src/app/core/register/register.module.ts +15 -0
  231. package/src/app/core/services/account.service.ts +1567 -0
  232. package/src/app/core/services/auth-guard.service.ts +70 -0
  233. package/src/app/core/services/base-entity-service.class.ts +659 -0
  234. package/src/app/core/services/base-graphql-service.class.ts +319 -0
  235. package/src/app/core/services/base58.ts +90 -0
  236. package/src/app/core/services/config/core.config.ts +263 -0
  237. package/src/app/core/services/config.service.ts +425 -0
  238. package/src/app/core/services/crypto.service.ts +126 -0
  239. package/src/app/core/services/errors.ts +80 -0
  240. package/src/app/core/services/local-settings.service.spec.ts +39 -0
  241. package/src/app/core/services/local-settings.service.ts +610 -0
  242. package/src/app/core/services/model/account.model.ts +188 -0
  243. package/src/app/core/services/model/config.model.ts +116 -0
  244. package/src/app/core/services/model/department.model.ts +34 -0
  245. package/src/app/core/services/model/entity.decorators.ts +110 -0
  246. package/src/app/core/services/model/entity.model.ts +409 -0
  247. package/src/app/core/services/model/filter.model.ts +127 -0
  248. package/src/app/core/services/model/history.model.ts +25 -0
  249. package/src/app/core/services/model/model.enum.ts +10 -0
  250. package/src/app/core/services/model/node-feature.model.ts +31 -0
  251. package/src/app/core/services/model/peer.model.ts +119 -0
  252. package/src/app/core/services/model/person.model.ts +122 -0
  253. package/src/app/core/services/model/referential.model.ts +253 -0
  254. package/src/app/core/services/model/settings.model.ts +37 -0
  255. package/src/app/core/services/model/token.model.ts +60 -0
  256. package/src/app/core/services/model/tree-item-entity.model.ts +256 -0
  257. package/src/app/core/services/network.service.spec.ts +47 -0
  258. package/src/app/core/services/network.service.ts +771 -0
  259. package/src/app/core/services/network.types.ts +7 -0
  260. package/src/app/core/services/network.utils.ts +83 -0
  261. package/src/app/core/services/pipes/account.pipes.ts +22 -0
  262. package/src/app/core/services/pipes/department-to-string.pipe.ts +13 -0
  263. package/src/app/core/services/pipes/person-to-string.pipe.ts +13 -0
  264. package/src/app/core/services/pipes/pipes.module.ts +30 -0
  265. package/src/app/core/services/pipes/referential-to-string.pipe.ts +18 -0
  266. package/src/app/core/services/pipes/usage-mode.pipes.ts +23 -0
  267. package/src/app/core/services/platform.service.spec.ts +50 -0
  268. package/src/app/core/services/platform.service.ts +694 -0
  269. package/src/app/core/services/storage/entities-storage.service.ts +557 -0
  270. package/src/app/core/services/storage/entity-store.class.ts +589 -0
  271. package/src/app/core/services/testing/local-settings.config.ts +35 -0
  272. package/src/app/core/services/testing/referential-filter.model.ts +28 -0
  273. package/src/app/core/services/testing/referential.validator.ts +58 -0
  274. package/src/app/core/services/testing/user-settings.config.ts +77 -0
  275. package/src/app/core/services/validator/account.validator.ts +50 -0
  276. package/src/app/core/services/validator/base.validator.class.ts +51 -0
  277. package/src/app/core/services/validator/local-settings.validator.ts +59 -0
  278. package/src/app/core/services/validator/user-settings.validator.ts +22 -0
  279. package/src/app/core/services/validator/user-token.validator.ts +54 -0
  280. package/src/app/core/settings/settings.module.ts +15 -0
  281. package/src/app/core/settings/settings.page.html +300 -0
  282. package/src/app/core/settings/settings.page.ts +455 -0
  283. package/src/app/core/table/async-table.class.ts +2021 -0
  284. package/src/app/core/table/column/actions-column.component.html +219 -0
  285. package/src/app/core/table/column/actions-column.component.scss +17 -0
  286. package/src/app/core/table/column/actions-column.component.ts +83 -0
  287. package/src/app/core/table/column/nav-actions-column.component.html +119 -0
  288. package/src/app/core/table/column/nav-actions-column.component.ts +108 -0
  289. package/src/app/core/table/column/row-field.component.html +43 -0
  290. package/src/app/core/table/column/row-field.component.scss +0 -0
  291. package/src/app/core/table/column/row-field.component.ts +63 -0
  292. package/src/app/core/table/entities-async-table-datasource.class.ts +515 -0
  293. package/src/app/core/table/entities-table-datasource.class.ts +503 -0
  294. package/src/app/core/table/memory-table.class.ts +56 -0
  295. package/src/app/core/table/table-select-columns.component.html +56 -0
  296. package/src/app/core/table/table-select-columns.component.ts +49 -0
  297. package/src/app/core/table/table.class.ts +2082 -0
  298. package/src/app/core/table/table.model.ts +39 -0
  299. package/src/app/core/table/table.module.ts +28 -0
  300. package/src/app/core/table/table.pipes.ts +87 -0
  301. package/src/app/core/table/table.utils.ts +42 -0
  302. package/src/app/core/table/testing/multi-table.testing.html +456 -0
  303. package/src/app/core/table/testing/multi-table.testing.ts +263 -0
  304. package/src/app/core/table/testing/table-validator.service.ts +29 -0
  305. package/src/app/core/table/testing/table.testing.html +556 -0
  306. package/src/app/core/table/testing/table.testing.module.ts +16 -0
  307. package/src/app/core/table/testing/table.testing.scss +32 -0
  308. package/src/app/core/table/testing/table.testing.ts +329 -0
  309. package/src/app/core/table/testing/table2-validator.service.ts +19 -0
  310. package/src/app/core/table/testing/table2.testing.html +470 -0
  311. package/src/app/core/table/testing/table2.testing.scss +25 -0
  312. package/src/app/core/table/testing/table2.testing.ts +274 -0
  313. package/src/app/shared/alerts.ts +296 -0
  314. package/src/app/shared/audio/audio.testing.html +29 -0
  315. package/src/app/shared/audio/audio.testing.module.ts +21 -0
  316. package/src/app/shared/audio/audio.testing.ts +27 -0
  317. package/src/app/shared/audio/audio.ts +273 -0
  318. package/src/app/shared/base64.utils.ts +66 -0
  319. package/src/app/shared/capacitor/keyboard.ts +38 -0
  320. package/src/app/shared/capacitor/plugins.ts +12 -0
  321. package/src/app/shared/constants.ts +19 -0
  322. package/src/app/shared/dates.ts +206 -0
  323. package/src/app/shared/debug/debug-service.class.ts +7 -0
  324. package/src/app/shared/debug/debug.component.html +13 -0
  325. package/src/app/shared/debug/debug.component.scss +21 -0
  326. package/src/app/shared/debug/debug.component.spec.ts +24 -0
  327. package/src/app/shared/debug/debug.component.ts +25 -0
  328. package/src/app/shared/debug/debug.module.ts +14 -0
  329. package/src/app/shared/directives/autofocus.directive.ts +93 -0
  330. package/src/app/shared/directives/autoresize.directive.ts +67 -0
  331. package/src/app/shared/directives/autotitle.directive.ts +17 -0
  332. package/src/app/shared/directives/directives.module.ts +16 -0
  333. package/src/app/shared/directives/drag-and-drop.directive.ts +46 -0
  334. package/src/app/shared/directives/ng-var.directive.ts +31 -0
  335. package/src/app/shared/directives/resizable/resizable.component.ts +48 -0
  336. package/src/app/shared/directives/resizable/resizable.directive.ts +43 -0
  337. package/src/app/shared/directives/resizable/resizable.module.ts +9 -0
  338. package/src/app/shared/directives/resizable/resizable.style.scss +37 -0
  339. package/src/app/shared/directives/resizable/resizable.template.html +6 -0
  340. package/src/app/shared/directives/throttled-click.directive.ts +36 -0
  341. package/src/app/shared/events.ts +93 -0
  342. package/src/app/shared/file/csv.utils.ts +123 -0
  343. package/src/app/shared/file/file.service.ts +129 -0
  344. package/src/app/shared/file/file.utils.ts +142 -0
  345. package/src/app/shared/file/images.utils.ts +214 -0
  346. package/src/app/shared/file/json.utils.ts +82 -0
  347. package/src/app/shared/file/uri.utils.ts +31 -0
  348. package/src/app/shared/file/url.utils.ts +193 -0
  349. package/src/app/shared/focusable.ts +8 -0
  350. package/src/app/shared/form/field.component.html +380 -0
  351. package/src/app/shared/form/field.component.scss +7 -0
  352. package/src/app/shared/form/field.component.ts +344 -0
  353. package/src/app/shared/form/field.model.ts +158 -0
  354. package/src/app/shared/form/loading-spinner.ts +16 -0
  355. package/src/app/shared/forms.ts +651 -0
  356. package/src/app/shared/functions.spec.ts +197 -0
  357. package/src/app/shared/functions.ts +694 -0
  358. package/src/app/shared/geolocation/geolocation.utils.ts +105 -0
  359. package/src/app/shared/gesture/gesture-config.ts +43 -0
  360. package/src/app/shared/gesture/hammer.utils.ts +14 -0
  361. package/src/app/shared/graph/colors.utils.ts +69 -0
  362. package/src/app/shared/graph/graph-colors.ts +270 -0
  363. package/src/app/shared/guard/component-dirty.guard.ts +67 -0
  364. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.html +11 -0
  365. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.scss +37 -0
  366. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.ts +14 -0
  367. package/src/app/shared/hotkeys/hotkeys.service.ts +165 -0
  368. package/src/app/shared/hotkeys/shared-hotkeys.module.ts +15 -0
  369. package/src/app/shared/http/http.utils.ts +95 -0
  370. package/src/app/shared/image/gallery/image-gallery.component.html +282 -0
  371. package/src/app/shared/image/gallery/image-gallery.component.scss +218 -0
  372. package/src/app/shared/image/gallery/image-gallery.component.ts +434 -0
  373. package/src/app/shared/image/gallery/image-gallery.module.ts +35 -0
  374. package/src/app/shared/image/gallery/testing/gallegry.model.testing.ts +23 -0
  375. package/src/app/shared/image/gallery/testing/gallery.service.testing.ts +99 -0
  376. package/src/app/shared/image/gallery/testing/gallery.testing.html +27 -0
  377. package/src/app/shared/image/gallery/testing/gallery.testing.module.ts +39 -0
  378. package/src/app/shared/image/gallery/testing/gallery.testing.ts +34 -0
  379. package/src/app/shared/image/image.model.ts +8 -0
  380. package/src/app/shared/image/image.module.ts +12 -0
  381. package/src/app/shared/image/image.service.ts +111 -0
  382. package/src/app/shared/image/image.testing.module.ts +16 -0
  383. package/src/app/shared/inputs.ts +330 -0
  384. package/src/app/shared/interceptors/progess.interceptor.ts +24 -0
  385. package/src/app/shared/logging/log-level.model.ts +53 -0
  386. package/src/app/shared/logging/logger.model.ts +117 -0
  387. package/src/app/shared/logging/logging-service.class.ts +131 -0
  388. package/src/app/shared/logging/logging-service.config.ts +29 -0
  389. package/src/app/shared/logging/logging-service.module.ts +19 -0
  390. package/src/app/shared/markdown/markdown.component.html +55 -0
  391. package/src/app/shared/markdown/markdown.component.scss +75 -0
  392. package/src/app/shared/markdown/markdown.component.ts +350 -0
  393. package/src/app/shared/markdown/markdown.directive.ts +28 -0
  394. package/src/app/shared/markdown/markdown.modal.html +42 -0
  395. package/src/app/shared/markdown/markdown.modal.ts +91 -0
  396. package/src/app/shared/markdown/markdown.module.ts +65 -0
  397. package/src/app/shared/markdown/markdown.service.ts +234 -0
  398. package/src/app/shared/markdown/markdown.utils.ts +90 -0
  399. package/src/app/shared/markdown/testing/markdown.test.html +50 -0
  400. package/src/app/shared/markdown/testing/markdown.test.ts +49 -0
  401. package/src/app/shared/markdown/testing/markdown.testing.module.ts +22 -0
  402. package/src/app/shared/material/autocomplete/material.autocomplete.config.ts +127 -0
  403. package/src/app/shared/material/autocomplete/material.autocomplete.html +400 -0
  404. package/src/app/shared/material/autocomplete/material.autocomplete.module.ts +41 -0
  405. package/src/app/shared/material/autocomplete/material.autocomplete.scss +54 -0
  406. package/src/app/shared/material/autocomplete/material.autocomplete.ts +1375 -0
  407. package/src/app/shared/material/autocomplete/material.autocomplete.utils.ts +21 -0
  408. package/src/app/shared/material/autocomplete/testing/autocomplete.test.html +1164 -0
  409. package/src/app/shared/material/autocomplete/testing/autocomplete.test.spec.ts +33 -0
  410. package/src/app/shared/material/autocomplete/testing/autocomplete.test.ts +272 -0
  411. package/src/app/shared/material/badge/badge.directive.ts +217 -0
  412. package/src/app/shared/material/badge/badge.module.ts +12 -0
  413. package/src/app/shared/material/badge/badge.test.html +275 -0
  414. package/src/app/shared/material/badge/badge.test.ts +34 -0
  415. package/src/app/shared/material/boolean/boolean.module.ts +36 -0
  416. package/src/app/shared/material/boolean/material.boolean.html +271 -0
  417. package/src/app/shared/material/boolean/material.boolean.scss +27 -0
  418. package/src/app/shared/material/boolean/material.boolean.ts +343 -0
  419. package/src/app/shared/material/boolean/testing/boolean.test.page.html +469 -0
  420. package/src/app/shared/material/boolean/testing/boolean.test.page.ts +66 -0
  421. package/src/app/shared/material/chips/chips.module.ts +38 -0
  422. package/src/app/shared/material/chips/material.chips.html +233 -0
  423. package/src/app/shared/material/chips/material.chips.scss +67 -0
  424. package/src/app/shared/material/chips/material.chips.ts +834 -0
  425. package/src/app/shared/material/chips/testing/chips.test.html +207 -0
  426. package/src/app/shared/material/chips/testing/chips.test.ts +169 -0
  427. package/src/app/shared/material/datetime/datetime.module.ts +42 -0
  428. package/src/app/shared/material/datetime/material.date.html +186 -0
  429. package/src/app/shared/material/datetime/material.date.scss +17 -0
  430. package/src/app/shared/material/datetime/material.date.ts +512 -0
  431. package/src/app/shared/material/datetime/material.dateshort.html +194 -0
  432. package/src/app/shared/material/datetime/material.dateshort.scss +23 -0
  433. package/src/app/shared/material/datetime/material.dateshort.ts +497 -0
  434. package/src/app/shared/material/datetime/material.datetime.html +325 -0
  435. package/src/app/shared/material/datetime/material.datetime.scss +87 -0
  436. package/src/app/shared/material/datetime/material.datetime.ts +758 -0
  437. package/src/app/shared/material/datetime/testing/mat-date-time.test.html +794 -0
  438. package/src/app/shared/material/datetime/testing/mat-date-time.test.ts +155 -0
  439. package/src/app/shared/material/datetime/testing/mat-date.test.html +564 -0
  440. package/src/app/shared/material/datetime/testing/mat-date.test.ts +145 -0
  441. package/src/app/shared/material/datetime/testing/mat-dateshort.test.html +530 -0
  442. package/src/app/shared/material/datetime/testing/mat-dateshort.test.ts +133 -0
  443. package/src/app/shared/material/duration/duration.module.ts +33 -0
  444. package/src/app/shared/material/duration/duration.utils.ts +18 -0
  445. package/src/app/shared/material/duration/material.duration.html +116 -0
  446. package/src/app/shared/material/duration/material.duration.scss +28 -0
  447. package/src/app/shared/material/duration/material.duration.ts +308 -0
  448. package/src/app/shared/material/duration/testing/mat-duration.test.html +170 -0
  449. package/src/app/shared/material/duration/testing/mat-duration.test.ts +88 -0
  450. package/src/app/shared/material/latlong/latlong.utils.ts +376 -0
  451. package/src/app/shared/material/latlong/material.latlong-input.html +95 -0
  452. package/src/app/shared/material/latlong/material.latlong-input.scss +66 -0
  453. package/src/app/shared/material/latlong/material.latlong-input.ts +445 -0
  454. package/src/app/shared/material/latlong/material.latlong.html +90 -0
  455. package/src/app/shared/material/latlong/material.latlong.module.ts +37 -0
  456. package/src/app/shared/material/latlong/material.latlong.scss +0 -0
  457. package/src/app/shared/material/latlong/material.latlong.ts +203 -0
  458. package/src/app/shared/material/latlong/testing/latlong.test.html +1008 -0
  459. package/src/app/shared/material/latlong/testing/latlong.test.ts +144 -0
  460. package/src/app/shared/material/material.animations.ts +269 -0
  461. package/src/app/shared/material/material.config.ts +5 -0
  462. package/src/app/shared/material/material.module.ts +94 -0
  463. package/src/app/shared/material/material.testing.module.ts +192 -0
  464. package/src/app/shared/material/memory/memory.utils.ts +57 -0
  465. package/src/app/shared/material/numpad/numpad.animation.ts +1 -0
  466. package/src/app/shared/material/numpad/numpad.append-to-input.directive.ts +110 -0
  467. package/src/app/shared/material/numpad/numpad.component.ts +73 -0
  468. package/src/app/shared/material/numpad/numpad.container.html +37 -0
  469. package/src/app/shared/material/numpad/numpad.container.scss +55 -0
  470. package/src/app/shared/material/numpad/numpad.container.ts +152 -0
  471. package/src/app/shared/material/numpad/numpad.content.html +13 -0
  472. package/src/app/shared/material/numpad/numpad.content.ts +10 -0
  473. package/src/app/shared/material/numpad/numpad.directive.ts +159 -0
  474. package/src/app/shared/material/numpad/numpad.dom-service.ts +35 -0
  475. package/src/app/shared/material/numpad/numpad.model.ts +53 -0
  476. package/src/app/shared/material/numpad/numpad.module.ts +18 -0
  477. package/src/app/shared/material/numpad/testing/numpad.test.html +146 -0
  478. package/src/app/shared/material/numpad/testing/numpad.test.ts +44 -0
  479. package/src/app/shared/material/paginator/material.paginator-i18n.ts +47 -0
  480. package/src/app/shared/material/stepper/material.stepper-i18n.ts +17 -0
  481. package/src/app/shared/material/swipe/material.swipe.html +85 -0
  482. package/src/app/shared/material/swipe/material.swipe.scss +55 -0
  483. package/src/app/shared/material/swipe/material.swipe.ts +366 -0
  484. package/src/app/shared/material/swipe/swipe.module.ts +29 -0
  485. package/src/app/shared/material/swipe/testing/swipe.test.html +112 -0
  486. package/src/app/shared/material/swipe/testing/swipe.test.ts +74 -0
  487. package/src/app/shared/material/test/test-component.css +22 -0
  488. package/src/app/shared/material/test/test-component.html +40 -0
  489. package/src/app/shared/material/test/test-component.ts +295 -0
  490. package/src/app/shared/material/testing/common.test.html +227 -0
  491. package/src/app/shared/material/testing/common.test.ts +126 -0
  492. package/src/app/shared/material/text/testing/text-form.testing.html +213 -0
  493. package/src/app/shared/material/text/testing/text-form.testing.ts +30 -0
  494. package/src/app/shared/material/text/text-form.component.html +63 -0
  495. package/src/app/shared/material/text/text-form.component.scss +8 -0
  496. package/src/app/shared/material/text/text-form.component.ts +177 -0
  497. package/src/app/shared/material/text/text-form.module.ts +36 -0
  498. package/src/app/shared/modules.ts +12 -0
  499. package/src/app/shared/named-filter/named-filter-selector.component.html +77 -0
  500. package/src/app/shared/named-filter/named-filter-selector.component.scss +3 -0
  501. package/src/app/shared/named-filter/named-filter-selector.component.ts +287 -0
  502. package/src/app/shared/named-filter/named-filter.model.ts +64 -0
  503. package/src/app/shared/named-filter/named-filter.module.ts +15 -0
  504. package/src/app/shared/named-filter/named-filter.service.ts +100 -0
  505. package/src/app/shared/named-filter/testing/named-filter-selector.testing.html +61 -0
  506. package/src/app/shared/named-filter/testing/named-filter-selector.testing.ts +80 -0
  507. package/src/app/shared/named-filter/testing/named-filter.testing.module.ts +20 -0
  508. package/src/app/shared/named-filter/testing/named-filter.testing.service.ts +83 -0
  509. package/src/app/shared/observables.ts +139 -0
  510. package/src/app/shared/pipes/arrays.pipe.ts +153 -0
  511. package/src/app/shared/pipes/badge.pipes.ts +18 -0
  512. package/src/app/shared/pipes/colors.pipe.ts +24 -0
  513. package/src/app/shared/pipes/date-diff-duration.pipe.ts +53 -0
  514. package/src/app/shared/pipes/date-format.pipe.ts +73 -0
  515. package/src/app/shared/pipes/date-from-now.pipe.ts +17 -0
  516. package/src/app/shared/pipes/dates.pipe.ts +13 -0
  517. package/src/app/shared/pipes/display-with.pipe.ts +13 -0
  518. package/src/app/shared/pipes/duration.pipe.spec.ts +41 -0
  519. package/src/app/shared/pipes/duration.pipe.ts +28 -0
  520. package/src/app/shared/pipes/file-size.pipe.ts +50 -0
  521. package/src/app/shared/pipes/form.pipes.ts +209 -0
  522. package/src/app/shared/pipes/highlight.pipe.ts +41 -0
  523. package/src/app/shared/pipes/html.pipes.ts +49 -0
  524. package/src/app/shared/pipes/latlong-format.pipe.ts +28 -0
  525. package/src/app/shared/pipes/maps.pipe.ts +41 -0
  526. package/src/app/shared/pipes/maskito.pipe.ts +68 -0
  527. package/src/app/shared/pipes/math.pipes.ts +46 -0
  528. package/src/app/shared/pipes/ng-init.pipe.ts +13 -0
  529. package/src/app/shared/pipes/number-format.pipe.ts +11 -0
  530. package/src/app/shared/pipes/observable.pipes.ts +46 -0
  531. package/src/app/shared/pipes/pipes.module.ts +162 -0
  532. package/src/app/shared/pipes/property.pipes.ts +115 -0
  533. package/src/app/shared/pipes/selection.pipes.ts +165 -0
  534. package/src/app/shared/pipes/string.pipes.ts +128 -0
  535. package/src/app/shared/pipes/translate-context.pipe.ts +27 -0
  536. package/src/app/shared/pipes/types.pipes.ts +52 -0
  537. package/src/app/shared/pipes/url.pipes.ts +29 -0
  538. package/src/app/shared/platforms.ts +99 -0
  539. package/src/app/shared/print/print.service.ts +337 -0
  540. package/src/app/shared/regexps.ts +112 -0
  541. package/src/app/shared/rx-state/rx-state.decorators.ts +281 -0
  542. package/src/app/shared/rx-state/rx-state.module.ts +11 -0
  543. package/src/app/shared/rx-state/rx-state.types.ts +5 -0
  544. package/src/app/shared/services/entity-service.class.ts +120 -0
  545. package/src/app/shared/services/job.utils.ts +124 -0
  546. package/src/app/shared/services/memory-entity-service.class.ts +435 -0
  547. package/src/app/shared/services/progress-bar.service.ts +40 -0
  548. package/src/app/shared/services/startable-observable-service.class.ts +129 -0
  549. package/src/app/shared/services/startable-service.class.ts +120 -0
  550. package/src/app/shared/services/storage.utils.ts +53 -0
  551. package/src/app/shared/services/translate-context.service.ts +112 -0
  552. package/src/app/shared/services/validator-service.class.ts +13 -0
  553. package/src/app/shared/services.ts +134 -0
  554. package/src/app/shared/shared-routing.module.ts +69 -0
  555. package/src/app/shared/shared.module.spec.ts +13 -0
  556. package/src/app/shared/shared.module.ts +168 -0
  557. package/src/app/shared/shared.testing.module.ts +61 -0
  558. package/src/app/shared/storage/storage-explorer.component.html +160 -0
  559. package/src/app/shared/storage/storage-explorer.component.scss +37 -0
  560. package/src/app/shared/storage/storage-explorer.component.spec.ts +24 -0
  561. package/src/app/shared/storage/storage-explorer.component.ts +268 -0
  562. package/src/app/shared/storage/storage-explorer.module.ts +24 -0
  563. package/src/app/shared/storage/storage-explorer.testing-routing.module.ts +19 -0
  564. package/src/app/shared/storage/storage-explorer.testing.module.ts +19 -0
  565. package/src/app/shared/storage/storage.service.ts +131 -0
  566. package/src/app/shared/storage/storage.utils.ts +25 -0
  567. package/src/app/shared/testing/maskito.test.html +40 -0
  568. package/src/app/shared/testing/maskito.test.ts +33 -0
  569. package/src/app/shared/testing/observable.test.html +53 -0
  570. package/src/app/shared/testing/observable.test.scss +3 -0
  571. package/src/app/shared/testing/observable.test.ts +101 -0
  572. package/src/app/shared/testing/tests.page.html +22 -0
  573. package/src/app/shared/testing/tests.page.ts +32 -0
  574. package/src/app/shared/toast/toast.testing.html +50 -0
  575. package/src/app/shared/toast/toast.testing.module.ts +22 -0
  576. package/src/app/shared/toast/toast.testing.ts +52 -0
  577. package/src/app/shared/toast/toasts.ts +161 -0
  578. package/src/app/shared/toolbar/modal-toolbar.html +30 -0
  579. package/src/app/shared/toolbar/modal-toolbar.scss +0 -0
  580. package/src/app/shared/toolbar/modal-toolbar.ts +64 -0
  581. package/src/app/shared/toolbar/toolbar.html +68 -0
  582. package/src/app/shared/toolbar/toolbar.module.ts +18 -0
  583. package/src/app/shared/toolbar/toolbar.scss +0 -0
  584. package/src/app/shared/toolbar/toolbar.ts +262 -0
  585. package/src/app/shared/types.ts +44 -0
  586. package/src/app/shared/upload-file/testing/upload-file.testing.html +30 -0
  587. package/src/app/shared/upload-file/testing/upload-file.testing.module.ts +21 -0
  588. package/src/app/shared/upload-file/testing/upload-file.testing.ts +65 -0
  589. package/src/app/shared/upload-file/upload-file-popover.component.html +46 -0
  590. package/src/app/shared/upload-file/upload-file-popover.component.scss +6 -0
  591. package/src/app/shared/upload-file/upload-file-popover.component.ts +115 -0
  592. package/src/app/shared/upload-file/upload-file.component.html +57 -0
  593. package/src/app/shared/upload-file/upload-file.component.scss +60 -0
  594. package/src/app/shared/upload-file/upload-file.component.ts +222 -0
  595. package/src/app/shared/upload-file/upload-file.model.ts +40 -0
  596. package/src/app/shared/validator/form-error-adapter.class.ts +139 -0
  597. package/src/app/shared/validator/validators.ts +725 -0
  598. package/src/app/shared/version/versions.ts +89 -0
  599. package/src/app/social/config/social.config.ts +10 -0
  600. package/src/app/social/feed/discourse/discourse-feed.service.ts +216 -0
  601. package/src/app/social/feed/discourse/discourse.model.ts +9 -0
  602. package/src/app/social/feed/discourse/discourse.utils.ts +210 -0
  603. package/src/app/social/feed/feed.component.html +85 -0
  604. package/src/app/social/feed/feed.component.scss +59 -0
  605. package/src/app/social/feed/feed.component.spec.ts +24 -0
  606. package/src/app/social/feed/feed.component.ts +115 -0
  607. package/src/app/social/feed/feed.directive.ts +164 -0
  608. package/src/app/social/feed/feed.model.ts +139 -0
  609. package/src/app/social/feed/feed.module.ts +13 -0
  610. package/src/app/social/feed/feed.service.ts +14 -0
  611. package/src/app/social/job/job.module.ts +14 -0
  612. package/src/app/social/job/progression/job-progression.component.html +19 -0
  613. package/src/app/social/job/progression/job-progression.component.scss +15 -0
  614. package/src/app/social/job/progression/job-progression.component.ts +39 -0
  615. package/src/app/social/job/progression/job-progression.icon.html +32 -0
  616. package/src/app/social/job/progression/job-progression.icon.scss +7 -0
  617. package/src/app/social/job/progression/job-progression.icon.ts +277 -0
  618. package/src/app/social/job/progression/job-progression.list.html +25 -0
  619. package/src/app/social/job/progression/job-progression.list.scss +17 -0
  620. package/src/app/social/job/progression/job-progression.list.ts +40 -0
  621. package/src/app/social/job/progression/job-progression.model.ts +26 -0
  622. package/src/app/social/job/progression/job-progression.service.ts +97 -0
  623. package/src/app/social/job/testing/job-progression.testing.html +11 -0
  624. package/src/app/social/job/testing/job-progression.testing.service.ts +33 -0
  625. package/src/app/social/job/testing/job-progression.testing.ts +28 -0
  626. package/src/app/social/job/testing/job.testing.module.ts +13 -0
  627. package/src/app/social/message/message.form.html +71 -0
  628. package/src/app/social/message/message.form.scss +6 -0
  629. package/src/app/social/message/message.form.ts +128 -0
  630. package/src/app/social/message/message.modal.html +68 -0
  631. package/src/app/social/message/message.modal.ts +117 -0
  632. package/src/app/social/message/message.model.ts +78 -0
  633. package/src/app/social/message/message.module.ts +14 -0
  634. package/src/app/social/message/message.service.ts +104 -0
  635. package/src/app/social/social.errors.ts +10 -0
  636. package/src/app/social/social.module.ts +23 -0
  637. package/src/app/social/social.testing.module.ts +33 -0
  638. package/src/app/social/user-event/notification/user-event-notification.icon.html +49 -0
  639. package/src/app/social/user-event/notification/user-event-notification.icon.scss +4 -0
  640. package/src/app/social/user-event/notification/user-event-notification.icon.ts +176 -0
  641. package/src/app/social/user-event/notification/user-event-notification.list.html +151 -0
  642. package/src/app/social/user-event/notification/user-event-notification.list.scss +73 -0
  643. package/src/app/social/user-event/notification/user-event-notification.list.ts +282 -0
  644. package/src/app/social/user-event/notification/user-event-notification.modal.html +71 -0
  645. package/src/app/social/user-event/notification/user-event-notification.modal.ts +60 -0
  646. package/src/app/social/user-event/testing/user-event.testing.html +54 -0
  647. package/src/app/social/user-event/testing/user-event.testing.model.ts +142 -0
  648. package/src/app/social/user-event/testing/user-event.testing.module.ts +13 -0
  649. package/src/app/social/user-event/testing/user-event.testing.service.ts +161 -0
  650. package/src/app/social/user-event/testing/user-event.testing.ts +300 -0
  651. package/src/app/social/user-event/user-event.model.ts +55 -0
  652. package/src/app/social/user-event/user-event.module.ts +16 -0
  653. package/src/app/social/user-event/user-event.service.ts +686 -0
  654. package/src/assets/i18n/en-US.json +5 -1
  655. package/src/assets/i18n/en.json +5 -0
  656. package/src/assets/i18n/fr.json +7 -1
  657. package/src/assets/manifest.json +1 -1
  658. package/src/browserslist +9 -0
  659. package/src/environments/environment.class.ts +113 -0
  660. package/src/environments/environment.loader.ts +90 -0
  661. package/src/environments/environment.prod.ts +49 -0
  662. package/src/environments/environment.test.ts +92 -0
  663. package/src/environments/environment.ts +136 -0
  664. package/src/favicon.ico +0 -0
  665. package/src/global.scss +13 -0
  666. package/src/index.html +76 -0
  667. package/src/main.ts +19 -0
  668. package/src/polyfills.ts +34 -0
  669. package/src/schema.graphql +4381 -0
  670. package/src/service-worker.js +31 -0
  671. package/src/test.ts +30 -0
  672. package/src/theme/_ngx-components.scss +4 -1
  673. package/src/theme/_theme.variables.scss +1 -1
  674. package/tsconfig-cs.json +57 -0
  675. package/tsconfig.app.json +15 -0
  676. package/tsconfig.json +48 -0
  677. package/tsconfig.spec.json +18 -0
  678. package/esm2022/public_api.mjs +0 -380
  679. package/esm2022/src/app/admin/admin-routing.module.mjs +0 -34
  680. package/esm2022/src/app/admin/admin.module.mjs +0 -32
  681. package/esm2022/src/app/admin/services/filter/person.filter.mjs +0 -76
  682. package/esm2022/src/app/admin/services/person.service.mjs +0 -184
  683. package/esm2022/src/app/admin/services/validator/person.validator.mjs +0 -72
  684. package/esm2022/src/app/admin/users/users.mjs +0 -379
  685. package/esm2022/src/app/admin/users/users.module.mjs +0 -56
  686. package/esm2022/src/app/core/about/about.modal.mjs +0 -86
  687. package/esm2022/src/app/core/about/about.module.mjs +0 -22
  688. package/esm2022/src/app/core/account/account.module.mjs +0 -75
  689. package/esm2022/src/app/core/account/account.page.mjs +0 -364
  690. package/esm2022/src/app/core/account/new-token.form.mjs +0 -106
  691. package/esm2022/src/app/core/account/new-token.modal.mjs +0 -66
  692. package/esm2022/src/app/core/account/password/change-password.form.mjs +0 -63
  693. package/esm2022/src/app/core/account/password/change-password.module.mjs +0 -22
  694. package/esm2022/src/app/core/account/password/change-password.page.mjs +0 -150
  695. package/esm2022/src/app/core/account/token.table.mjs +0 -157
  696. package/esm2022/src/app/core/auth/auth.form.mjs +0 -159
  697. package/esm2022/src/app/core/auth/auth.modal.mjs +0 -76
  698. package/esm2022/src/app/core/auth/auth.module.mjs +0 -56
  699. package/esm2022/src/app/core/auth/reset-password.modal.mjs +0 -89
  700. package/esm2022/src/app/core/core.module.mjs +0 -151
  701. package/esm2022/src/app/core/core.testing.module.mjs +0 -107
  702. package/esm2022/src/app/core/form/array/form-array.mjs +0 -328
  703. package/esm2022/src/app/core/form/array/testing/form-array-test.module.mjs +0 -23
  704. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +0 -94
  705. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -108
  706. package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +0 -31
  707. package/esm2022/src/app/core/form/entity/editor.class.mjs +0 -268
  708. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -420
  709. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +0 -741
  710. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +0 -24
  711. package/esm2022/src/app/core/form/entity/entity.module.mjs +0 -32
  712. package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +0 -190
  713. package/esm2022/src/app/core/form/form-container.class.mjs +0 -341
  714. package/esm2022/src/app/core/form/form.class.mjs +0 -337
  715. package/esm2022/src/app/core/form/form.module.mjs +0 -70
  716. package/esm2022/src/app/core/form/form.utils.mjs +0 -232
  717. package/esm2022/src/app/core/form/list/list.form.mjs +0 -235
  718. package/esm2022/src/app/core/form/list/list.module.mjs +0 -31
  719. package/esm2022/src/app/core/form/properties/properties.form.mjs +0 -317
  720. package/esm2022/src/app/core/form/properties/properties.module.mjs +0 -37
  721. package/esm2022/src/app/core/form/properties/properties.table.mjs +0 -264
  722. package/esm2022/src/app/core/form/properties/properties.utils.mjs +0 -304
  723. package/esm2022/src/app/core/form/properties/property.validator.mjs +0 -70
  724. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +0 -104
  725. package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +0 -23
  726. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -73
  727. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +0 -30
  728. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +0 -161
  729. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +0 -31
  730. package/esm2022/src/app/core/form/username/username.form.mjs +0 -55
  731. package/esm2022/src/app/core/form/username/username.module.mjs +0 -20
  732. package/esm2022/src/app/core/graphql/graphql.module.mjs +0 -14
  733. package/esm2022/src/app/core/graphql/graphql.service.mjs +0 -781
  734. package/esm2022/src/app/core/graphql/graphql.utils.mjs +0 -119
  735. package/esm2022/src/app/core/home/home.mjs +0 -382
  736. package/esm2022/src/app/core/home/home.module.mjs +0 -46
  737. package/esm2022/src/app/core/icon/icon.component.mjs +0 -40
  738. package/esm2022/src/app/core/icon/icon.module.mjs +0 -20
  739. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +0 -394
  740. package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +0 -31
  741. package/esm2022/src/app/core/menu/menu.component.mjs +0 -258
  742. package/esm2022/src/app/core/menu/menu.model.mjs +0 -272
  743. package/esm2022/src/app/core/menu/menu.module.mjs +0 -47
  744. package/esm2022/src/app/core/menu/menu.service.mjs +0 -666
  745. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +0 -109
  746. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +0 -50
  747. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +0 -158
  748. package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +0 -60
  749. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +0 -28
  750. package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +0 -31
  751. package/esm2022/src/app/core/peer/select-peer.modal.mjs +0 -344
  752. package/esm2022/src/app/core/peer/select-peer.module.mjs +0 -36
  753. package/esm2022/src/app/core/register/register-confirm.page.mjs +0 -90
  754. package/esm2022/src/app/core/register/register.form.mjs +0 -194
  755. package/esm2022/src/app/core/register/register.modal.mjs +0 -55
  756. package/esm2022/src/app/core/register/register.module.mjs +0 -23
  757. package/esm2022/src/app/core/services/account.service.mjs +0 -1358
  758. package/esm2022/src/app/core/services/auth-guard.service.mjs +0 -74
  759. package/esm2022/src/app/core/services/base-entity-service.class.mjs +0 -485
  760. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +0 -230
  761. package/esm2022/src/app/core/services/base58.mjs +0 -83
  762. package/esm2022/src/app/core/services/config/core.config.mjs +0 -258
  763. package/esm2022/src/app/core/services/config.service.mjs +0 -384
  764. package/esm2022/src/app/core/services/crypto.service.mjs +0 -107
  765. package/esm2022/src/app/core/services/errors.mjs +0 -54
  766. package/esm2022/src/app/core/services/local-settings.service.mjs +0 -516
  767. package/esm2022/src/app/core/services/model/account.model.mjs +0 -178
  768. package/esm2022/src/app/core/services/model/config.model.mjs +0 -107
  769. package/esm2022/src/app/core/services/model/department.model.mjs +0 -35
  770. package/esm2022/src/app/core/services/model/entity.decorators.mjs +0 -97
  771. package/esm2022/src/app/core/services/model/entity.model.mjs +0 -338
  772. package/esm2022/src/app/core/services/model/filter.model.mjs +0 -93
  773. package/esm2022/src/app/core/services/model/history.model.mjs +0 -2
  774. package/esm2022/src/app/core/services/model/model.enum.mjs +0 -11
  775. package/esm2022/src/app/core/services/model/node-feature.model.mjs +0 -31
  776. package/esm2022/src/app/core/services/model/peer.model.mjs +0 -113
  777. package/esm2022/src/app/core/services/model/person.model.mjs +0 -114
  778. package/esm2022/src/app/core/services/model/referential.model.mjs +0 -205
  779. package/esm2022/src/app/core/services/model/settings.model.mjs +0 -6
  780. package/esm2022/src/app/core/services/model/token.model.mjs +0 -57
  781. package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +0 -220
  782. package/esm2022/src/app/core/services/network.service.mjs +0 -638
  783. package/esm2022/src/app/core/services/network.types.mjs +0 -2
  784. package/esm2022/src/app/core/services/network.utils.mjs +0 -35
  785. package/esm2022/src/app/core/services/pipes/account.pipes.mjs +0 -38
  786. package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +0 -23
  787. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +0 -23
  788. package/esm2022/src/app/core/services/pipes/pipes.module.mjs +0 -54
  789. package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +0 -21
  790. package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +0 -37
  791. package/esm2022/src/app/core/services/platform.service.mjs +0 -627
  792. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +0 -427
  793. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +0 -450
  794. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +0 -25
  795. package/esm2022/src/app/core/services/testing/referential.validator.mjs +0 -46
  796. package/esm2022/src/app/core/services/validator/account.validator.mjs +0 -45
  797. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +0 -49
  798. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +0 -57
  799. package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +0 -27
  800. package/esm2022/src/app/core/services/validator/user-token.validator.mjs +0 -55
  801. package/esm2022/src/app/core/settings/settings.module.mjs +0 -23
  802. package/esm2022/src/app/core/settings/settings.page.mjs +0 -403
  803. package/esm2022/src/app/core/table/async-table.class.mjs +0 -1813
  804. package/esm2022/src/app/core/table/column/actions-column.component.mjs +0 -130
  805. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +0 -117
  806. package/esm2022/src/app/core/table/column/row-field.component.mjs +0 -116
  807. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +0 -415
  808. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +0 -407
  809. package/esm2022/src/app/core/table/memory-table.class.mjs +0 -57
  810. package/esm2022/src/app/core/table/table-select-columns.component.mjs +0 -46
  811. package/esm2022/src/app/core/table/table.class.mjs +0 -1869
  812. package/esm2022/src/app/core/table/table.model.mjs +0 -21
  813. package/esm2022/src/app/core/table/table.module.mjs +0 -51
  814. package/esm2022/src/app/core/table/table.pipes.mjs +0 -77
  815. package/esm2022/src/app/core/table/table.utils.mjs +0 -34
  816. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +0 -32
  817. package/esm2022/src/app/core/table/testing/table.testing.mjs +0 -329
  818. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +0 -25
  819. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +0 -25
  820. package/esm2022/src/app/core/table/testing/table2.testing.mjs +0 -273
  821. package/esm2022/src/app/shared/alerts.mjs +0 -243
  822. package/esm2022/src/app/shared/audio/audio.mjs +0 -255
  823. package/esm2022/src/app/shared/audio/audio.testing.mjs +0 -32
  824. package/esm2022/src/app/shared/audio/audio.testing.module.mjs +0 -30
  825. package/esm2022/src/app/shared/capacitor/keyboard.mjs +0 -42
  826. package/esm2022/src/app/shared/capacitor/plugins.mjs +0 -9
  827. package/esm2022/src/app/shared/constants.mjs +0 -16
  828. package/esm2022/src/app/shared/dates.mjs +0 -180
  829. package/esm2022/src/app/shared/debug/debug-service.class.mjs +0 -3
  830. package/esm2022/src/app/shared/debug/debug.component.mjs +0 -44
  831. package/esm2022/src/app/shared/debug/debug.module.mjs +0 -23
  832. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +0 -91
  833. package/esm2022/src/app/shared/directives/autoresize.directive.mjs +0 -75
  834. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +0 -30
  835. package/esm2022/src/app/shared/directives/directives.module.mjs +0 -24
  836. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +0 -52
  837. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +0 -33
  838. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +0 -62
  839. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +0 -45
  840. package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +0 -17
  841. package/esm2022/src/app/shared/directives/throttled-click.directive.mjs +0 -43
  842. package/esm2022/src/app/shared/events.mjs +0 -64
  843. package/esm2022/src/app/shared/file/csv.utils.mjs +0 -97
  844. package/esm2022/src/app/shared/file/file.service.mjs +0 -118
  845. package/esm2022/src/app/shared/file/file.utils.mjs +0 -117
  846. package/esm2022/src/app/shared/file/images.utils.mjs +0 -186
  847. package/esm2022/src/app/shared/file/json.utils.mjs +0 -58
  848. package/esm2022/src/app/shared/file/uri.utils.mjs +0 -29
  849. package/esm2022/src/app/shared/file/url.utils.mjs +0 -195
  850. package/esm2022/src/app/shared/focusable.mjs +0 -6
  851. package/esm2022/src/app/shared/form/field.component.mjs +0 -393
  852. package/esm2022/src/app/shared/form/field.model.mjs +0 -82
  853. package/esm2022/src/app/shared/form/loading-spinner.mjs +0 -35
  854. package/esm2022/src/app/shared/forms.mjs +0 -573
  855. package/esm2022/src/app/shared/functions.mjs +0 -672
  856. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +0 -86
  857. package/esm2022/src/app/shared/gesture/gesture-config.mjs +0 -46
  858. package/esm2022/src/app/shared/gesture/hammer.utils.mjs +0 -2
  859. package/esm2022/src/app/shared/graph/colors.utils.mjs +0 -60
  860. package/esm2022/src/app/shared/graph/graph-colors.mjs +0 -214
  861. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +0 -65
  862. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
  863. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +0 -147
  864. package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +0 -24
  865. package/esm2022/src/app/shared/http/http.utils.mjs +0 -56
  866. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +0 -443
  867. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +0 -62
  868. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -26
  869. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -87
  870. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -37
  871. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +0 -59
  872. package/esm2022/src/app/shared/image/image.model.mjs +0 -2
  873. package/esm2022/src/app/shared/image/image.module.mjs +0 -24
  874. package/esm2022/src/app/shared/image/image.service.mjs +0 -109
  875. package/esm2022/src/app/shared/inputs.mjs +0 -279
  876. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
  877. package/esm2022/src/app/shared/logging/log-level.model.mjs +0 -48
  878. package/esm2022/src/app/shared/logging/logger.model.mjs +0 -47
  879. package/esm2022/src/app/shared/logging/logging-service.class.mjs +0 -125
  880. package/esm2022/src/app/shared/logging/logging-service.config.mjs +0 -2
  881. package/esm2022/src/app/shared/logging/logging-service.module.mjs +0 -30
  882. package/esm2022/src/app/shared/markdown/markdown.component.mjs +0 -321
  883. package/esm2022/src/app/shared/markdown/markdown.directive.mjs +0 -34
  884. package/esm2022/src/app/shared/markdown/markdown.modal.mjs +0 -99
  885. package/esm2022/src/app/shared/markdown/markdown.module.mjs +0 -87
  886. package/esm2022/src/app/shared/markdown/markdown.service.mjs +0 -204
  887. package/esm2022/src/app/shared/markdown/markdown.utils.mjs +0 -87
  888. package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +0 -55
  889. package/esm2022/src/app/shared/markdown/testing/markdown.testing.module.mjs +0 -30
  890. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -46
  891. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -1313
  892. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -79
  893. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -18
  894. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -242
  895. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +0 -251
  896. package/esm2022/src/app/shared/material/badge/badge.module.mjs +0 -20
  897. package/esm2022/src/app/shared/material/badge/badge.test.mjs +0 -42
  898. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +0 -67
  899. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +0 -371
  900. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +0 -72
  901. package/esm2022/src/app/shared/material/chips/chips.module.mjs +0 -71
  902. package/esm2022/src/app/shared/material/chips/material.chips.mjs +0 -836
  903. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +0 -151
  904. package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +0 -76
  905. package/esm2022/src/app/shared/material/datetime/material.date.mjs +0 -471
  906. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +0 -457
  907. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +0 -693
  908. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -136
  909. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -127
  910. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -118
  911. package/esm2022/src/app/shared/material/duration/duration.module.mjs +0 -61
  912. package/esm2022/src/app/shared/material/duration/duration.utils.mjs +0 -16
  913. package/esm2022/src/app/shared/material/duration/material.duration.mjs +0 -283
  914. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +0 -85
  915. package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +0 -319
  916. package/esm2022/src/app/shared/material/latlong/material.latlong-input.mjs +0 -432
  917. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +0 -231
  918. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +0 -68
  919. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -137
  920. package/esm2022/src/app/shared/material/material.animations.mjs +0 -200
  921. package/esm2022/src/app/shared/material/material.config.mjs +0 -3
  922. package/esm2022/src/app/shared/material/material.module.mjs +0 -229
  923. package/esm2022/src/app/shared/material/material.testing.module.mjs +0 -245
  924. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -51
  925. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -23
  926. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +0 -379
  927. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +0 -52
  928. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -67
  929. package/esm2022/src/app/shared/material/test/test-component.mjs +0 -264
  930. package/esm2022/src/app/shared/material/testing/common.test.mjs +0 -111
  931. package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +0 -42
  932. package/esm2022/src/app/shared/material/text/text-form.component.mjs +0 -205
  933. package/esm2022/src/app/shared/material/text/text-form.module.mjs +0 -63
  934. package/esm2022/src/app/shared/modules.mjs +0 -12
  935. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -303
  936. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +0 -49
  937. package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +0 -24
  938. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +0 -69
  939. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +0 -74
  940. package/esm2022/src/app/shared/named-filter/testing/named-filter.testing.module.mjs +0 -28
  941. package/esm2022/src/app/shared/observables.mjs +0 -100
  942. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +0 -217
  943. package/esm2022/src/app/shared/pipes/badge.pipes.mjs +0 -24
  944. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +0 -29
  945. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -50
  946. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +0 -72
  947. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +0 -28
  948. package/esm2022/src/app/shared/pipes/dates.pipe.mjs +0 -18
  949. package/esm2022/src/app/shared/pipes/display-with.pipe.mjs +0 -23
  950. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +0 -34
  951. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +0 -53
  952. package/esm2022/src/app/shared/pipes/form.pipes.mjs +0 -219
  953. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +0 -50
  954. package/esm2022/src/app/shared/pipes/html.pipes.mjs +0 -69
  955. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +0 -42
  956. package/esm2022/src/app/shared/pipes/maps.pipe.mjs +0 -65
  957. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +0 -67
  958. package/esm2022/src/app/shared/pipes/math.pipes.mjs +0 -77
  959. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +0 -19
  960. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +0 -17
  961. package/esm2022/src/app/shared/pipes/observable.pipes.mjs +0 -63
  962. package/esm2022/src/app/shared/pipes/pipes.module.mjs +0 -285
  963. package/esm2022/src/app/shared/pipes/property.pipes.mjs +0 -135
  964. package/esm2022/src/app/shared/pipes/selection.pipes.mjs +0 -179
  965. package/esm2022/src/app/shared/pipes/string.pipes.mjs +0 -183
  966. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +0 -44
  967. package/esm2022/src/app/shared/pipes/types.pipes.mjs +0 -74
  968. package/esm2022/src/app/shared/pipes/url.pipes.mjs +0 -35
  969. package/esm2022/src/app/shared/platforms.mjs +0 -81
  970. package/esm2022/src/app/shared/print/print.service.mjs +0 -305
  971. package/esm2022/src/app/shared/regexps.mjs +0 -96
  972. package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +0 -217
  973. package/esm2022/src/app/shared/rx-state/rx-state.module.mjs +0 -19
  974. package/esm2022/src/app/shared/rx-state/rx-state.types.mjs +0 -2
  975. package/esm2022/src/app/shared/services/entity-service.class.mjs +0 -10
  976. package/esm2022/src/app/shared/services/job.utils.mjs +0 -92
  977. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +0 -353
  978. package/esm2022/src/app/shared/services/progress-bar.service.mjs +0 -31
  979. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +0 -118
  980. package/esm2022/src/app/shared/services/startable-service.class.mjs +0 -107
  981. package/esm2022/src/app/shared/services/translate-context.service.mjs +0 -107
  982. package/esm2022/src/app/shared/services/validator-service.class.mjs +0 -2
  983. package/esm2022/src/app/shared/services.mjs +0 -85
  984. package/esm2022/src/app/shared/shared-routing.module.mjs +0 -72
  985. package/esm2022/src/app/shared/shared.module.mjs +0 -229
  986. package/esm2022/src/app/shared/shared.testing.module.mjs +0 -108
  987. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +0 -279
  988. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +0 -42
  989. package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +0 -27
  990. package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +0 -25
  991. package/esm2022/src/app/shared/storage/storage.service.mjs +0 -134
  992. package/esm2022/src/app/shared/storage/storage.utils.mjs +0 -13
  993. package/esm2022/src/app/shared/testing/maskito.test.mjs +0 -41
  994. package/esm2022/src/app/shared/testing/observable.test.mjs +0 -94
  995. package/esm2022/src/app/shared/testing/tests.page.mjs +0 -37
  996. package/esm2022/src/app/shared/toast/toast.testing.mjs +0 -54
  997. package/esm2022/src/app/shared/toast/toast.testing.module.mjs +0 -31
  998. package/esm2022/src/app/shared/toast/toasts.mjs +0 -134
  999. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +0 -62
  1000. package/esm2022/src/app/shared/toolbar/toolbar.mjs +0 -267
  1001. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +0 -26
  1002. package/esm2022/src/app/shared/types.mjs +0 -2
  1003. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -59
  1004. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +0 -30
  1005. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -109
  1006. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +0 -216
  1007. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +0 -26
  1008. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +0 -115
  1009. package/esm2022/src/app/shared/validator/validators.mjs +0 -621
  1010. package/esm2022/src/app/shared/version/versions.mjs +0 -81
  1011. package/esm2022/src/app/social/job/job.module.mjs +0 -23
  1012. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +0 -35
  1013. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +0 -235
  1014. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +0 -47
  1015. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +0 -29
  1016. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +0 -91
  1017. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +0 -38
  1018. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +0 -34
  1019. package/esm2022/src/app/social/job/testing/job.testing.module.mjs +0 -22
  1020. package/esm2022/src/app/social/message/message.form.mjs +0 -141
  1021. package/esm2022/src/app/social/message/message.modal.mjs +0 -110
  1022. package/esm2022/src/app/social/message/message.model.mjs +0 -75
  1023. package/esm2022/src/app/social/message/message.module.mjs +0 -22
  1024. package/esm2022/src/app/social/message/message.service.mjs +0 -110
  1025. package/esm2022/src/app/social/social.errors.mjs +0 -10
  1026. package/esm2022/src/app/social/social.module.mjs +0 -22
  1027. package/esm2022/src/app/social/social.testing.module.mjs +0 -40
  1028. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -127
  1029. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -260
  1030. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +0 -257
  1031. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -129
  1032. package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +0 -22
  1033. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -128
  1034. package/esm2022/src/app/social/user-event/user-event.model.mjs +0 -2
  1035. package/esm2022/src/app/social/user-event/user-event.module.mjs +0 -23
  1036. package/esm2022/src/app/social/user-event/user-event.service.mjs +0 -512
  1037. package/esm2022/src/environments/environment.class.mjs +0 -65
  1038. package/esm2022/src/environments/environment.loader.mjs +0 -77
  1039. package/esm2022/src/environments/environment.mjs +0 -109
  1040. package/esm2022/sumaris-net.ngx-components.mjs +0 -5
  1041. package/fesm2022/sumaris-net.ngx-components.mjs +0 -48900
  1042. package/fesm2022/sumaris-net.ngx-components.mjs.map +0 -1
  1043. package/index.d.ts +0 -5
  1044. package/public_api.d.ts +0 -344
  1045. package/src/app/admin/admin-routing.module.d.ts +0 -9
  1046. package/src/app/admin/admin.module.d.ts +0 -10
  1047. package/src/app/admin/services/filter/person.filter.d.ts +0 -22
  1048. package/src/app/admin/services/person.service.d.ts +0 -37
  1049. package/src/app/admin/services/validator/person.validator.d.ts +0 -23
  1050. package/src/app/admin/users/users.d.ts +0 -61
  1051. package/src/app/admin/users/users.module.d.ts +0 -14
  1052. package/src/app/core/about/about.modal.d.ts +0 -32
  1053. package/src/app/core/about/about.module.d.ts +0 -11
  1054. package/src/app/core/account/account.module.d.ts +0 -18
  1055. package/src/app/core/account/account.page.d.ts +0 -83
  1056. package/src/app/core/account/new-token.form.d.ts +0 -29
  1057. package/src/app/core/account/new-token.modal.d.ts +0 -29
  1058. package/src/app/core/account/password/change-password.form.d.ts +0 -19
  1059. package/src/app/core/account/password/change-password.module.d.ts +0 -11
  1060. package/src/app/core/account/password/change-password.page.d.ts +0 -36
  1061. package/src/app/core/account/token.table.d.ts +0 -27
  1062. package/src/app/core/auth/auth.form.d.ts +0 -38
  1063. package/src/app/core/auth/auth.modal.d.ts +0 -24
  1064. package/src/app/core/auth/auth.module.d.ts +0 -13
  1065. package/src/app/core/auth/reset-password.modal.d.ts +0 -29
  1066. package/src/app/core/core.module.d.ts +0 -28
  1067. package/src/app/core/core.testing.module.d.ts +0 -15
  1068. package/src/app/core/form/array/form-array.d.ts +0 -137
  1069. package/src/app/core/form/array/testing/form-array-test.module.d.ts +0 -12
  1070. package/src/app/core/form/array/testing/form-array.test.d.ts +0 -26
  1071. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +0 -37
  1072. package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +0 -9
  1073. package/src/app/core/form/entity/editor.class.d.ts +0 -84
  1074. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +0 -126
  1075. package/src/app/core/form/entity/entity-editor.class.d.ts +0 -204
  1076. package/src/app/core/form/entity/entity-metadata.component.d.ts +0 -13
  1077. package/src/app/core/form/entity/entity.module.d.ts +0 -10
  1078. package/src/app/core/form/entity/tab-editor.class.d.ts +0 -66
  1079. package/src/app/core/form/form-container.class.d.ts +0 -127
  1080. package/src/app/core/form/form.class.d.ts +0 -144
  1081. package/src/app/core/form/form.module.d.ts +0 -14
  1082. package/src/app/core/form/form.utils.d.ts +0 -287
  1083. package/src/app/core/form/list/list.form.d.ts +0 -81
  1084. package/src/app/core/form/list/list.module.d.ts +0 -9
  1085. package/src/app/core/form/properties/properties.form.d.ts +0 -92
  1086. package/src/app/core/form/properties/properties.module.d.ts +0 -11
  1087. package/src/app/core/form/properties/properties.table.d.ts +0 -72
  1088. package/src/app/core/form/properties/properties.utils.d.ts +0 -59
  1089. package/src/app/core/form/properties/property.validator.d.ts +0 -27
  1090. package/src/app/core/form/properties/testing/properties-form.test.d.ts +0 -22
  1091. package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +0 -12
  1092. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +0 -16
  1093. package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +0 -11
  1094. package/src/app/core/form/text-popover/text-popover.component.d.ts +0 -80
  1095. package/src/app/core/form/text-popover/text-popover.module.d.ts +0 -9
  1096. package/src/app/core/form/username/username.form.d.ts +0 -19
  1097. package/src/app/core/form/username/username.module.d.ts +0 -9
  1098. package/src/app/core/graphql/graphql.module.d.ts +0 -7
  1099. package/src/app/core/graphql/graphql.service.d.ts +0 -142
  1100. package/src/app/core/graphql/graphql.utils.d.ts +0 -47
  1101. package/src/app/core/home/home.d.ts +0 -109
  1102. package/src/app/core/home/home.module.d.ts +0 -14
  1103. package/src/app/core/icon/icon.component.d.ts +0 -13
  1104. package/src/app/core/icon/icon.module.d.ts +0 -9
  1105. package/src/app/core/install/install-upgrade-card.component.d.ts +0 -63
  1106. package/src/app/core/install/install-upgrade-card.module.d.ts +0 -9
  1107. package/src/app/core/menu/menu.component.d.ts +0 -66
  1108. package/src/app/core/menu/menu.model.d.ts +0 -144
  1109. package/src/app/core/menu/menu.module.d.ts +0 -12
  1110. package/src/app/core/menu/menu.service.d.ts +0 -93
  1111. package/src/app/core/menu/sub-menu-tab.directive.d.ts +0 -29
  1112. package/src/app/core/menu/testing/menu-other.testing.d.ts +0 -15
  1113. package/src/app/core/menu/testing/menu.testing.d.ts +0 -51
  1114. package/src/app/core/menu/testing/menu.testing.module.d.ts +0 -12
  1115. package/src/app/core/offline/update-offline-mode-card.component.d.ts +0 -11
  1116. package/src/app/core/offline/update-offline-mode-card.module.d.ts +0 -9
  1117. package/src/app/core/peer/select-peer.modal.d.ts +0 -101
  1118. package/src/app/core/peer/select-peer.module.d.ts +0 -12
  1119. package/src/app/core/register/register-confirm.page.d.ts +0 -24
  1120. package/src/app/core/register/register.form.d.ts +0 -49
  1121. package/src/app/core/register/register.modal.d.ts +0 -14
  1122. package/src/app/core/register/register.module.d.ts +0 -12
  1123. package/src/app/core/services/account.service.d.ts +0 -207
  1124. package/src/app/core/services/auth-guard.service.d.ts +0 -17
  1125. package/src/app/core/services/base-entity-service.class.d.ts +0 -135
  1126. package/src/app/core/services/base-graphql-service.class.d.ts +0 -77
  1127. package/src/app/core/services/base58.d.ts +0 -7
  1128. package/src/app/core/services/config/core.config.d.ts +0 -46
  1129. package/src/app/core/services/config.service.d.ts +0 -63
  1130. package/src/app/core/services/crypto.service.d.ts +0 -44
  1131. package/src/app/core/services/errors.d.ts +0 -65
  1132. package/src/app/core/services/local-settings.service.d.ts +0 -99
  1133. package/src/app/core/services/model/account.model.d.ts +0 -56
  1134. package/src/app/core/services/model/config.model.d.ts +0 -36
  1135. package/src/app/core/services/model/department.model.d.ts +0 -11
  1136. package/src/app/core/services/model/entity.decorators.d.ts +0 -17
  1137. package/src/app/core/services/model/entity.model.d.ts +0 -133
  1138. package/src/app/core/services/model/filter.model.d.ts +0 -37
  1139. package/src/app/core/services/model/history.model.d.ts +0 -20
  1140. package/src/app/core/services/model/model.enum.d.ts +0 -7
  1141. package/src/app/core/services/model/node-feature.model.d.ts +0 -14
  1142. package/src/app/core/services/model/peer.model.d.ts +0 -35
  1143. package/src/app/core/services/model/person.model.d.ts +0 -37
  1144. package/src/app/core/services/model/referential.model.d.ts +0 -84
  1145. package/src/app/core/services/model/settings.model.d.ts +0 -29
  1146. package/src/app/core/services/model/token.model.d.ts +0 -22
  1147. package/src/app/core/services/model/tree-item-entity.model.d.ts +0 -61
  1148. package/src/app/core/services/network.service.d.ts +0 -159
  1149. package/src/app/core/services/network.types.d.ts +0 -4
  1150. package/src/app/core/services/network.utils.d.ts +0 -38
  1151. package/src/app/core/services/pipes/account.pipes.d.ts +0 -15
  1152. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +0 -9
  1153. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +0 -11
  1154. package/src/app/core/services/pipes/pipes.module.d.ts +0 -11
  1155. package/src/app/core/services/pipes/referential-to-string.pipe.d.ts +0 -13
  1156. package/src/app/core/services/pipes/usage-mode.pipes.d.ts +0 -15
  1157. package/src/app/core/services/platform.service.d.ts +0 -110
  1158. package/src/app/core/services/storage/entities-storage.service.d.ts +0 -108
  1159. package/src/app/core/services/storage/entity-store.class.d.ts +0 -113
  1160. package/src/app/core/services/testing/referential-filter.model.d.ts +0 -9
  1161. package/src/app/core/services/testing/referential.validator.d.ts +0 -22
  1162. package/src/app/core/services/validator/account.validator.d.ts +0 -24
  1163. package/src/app/core/services/validator/base.validator.class.d.ts +0 -21
  1164. package/src/app/core/services/validator/local-settings.validator.d.ts +0 -18
  1165. package/src/app/core/services/validator/user-settings.validator.d.ts +0 -10
  1166. package/src/app/core/services/validator/user-token.validator.d.ts +0 -13
  1167. package/src/app/core/settings/settings.module.d.ts +0 -12
  1168. package/src/app/core/settings/settings.page.d.ts +0 -88
  1169. package/src/app/core/table/async-table.class.d.ts +0 -395
  1170. package/src/app/core/table/column/actions-column.component.d.ts +0 -62
  1171. package/src/app/core/table/column/nav-actions-column.component.d.ts +0 -46
  1172. package/src/app/core/table/column/row-field.component.d.ts +0 -40
  1173. package/src/app/core/table/entities-async-table-datasource.class.d.ts +0 -103
  1174. package/src/app/core/table/entities-table-datasource.class.d.ts +0 -102
  1175. package/src/app/core/table/memory-table.class.d.ts +0 -25
  1176. package/src/app/core/table/table-select-columns.component.d.ts +0 -22
  1177. package/src/app/core/table/table.class.d.ts +0 -400
  1178. package/src/app/core/table/table.model.d.ts +0 -31
  1179. package/src/app/core/table/table.module.d.ts +0 -14
  1180. package/src/app/core/table/table.pipes.d.ts +0 -29
  1181. package/src/app/core/table/table.utils.d.ts +0 -13
  1182. package/src/app/core/table/testing/table-validator.service.d.ts +0 -17
  1183. package/src/app/core/table/testing/table.testing.d.ts +0 -54
  1184. package/src/app/core/table/testing/table.testing.module.d.ts +0 -14
  1185. package/src/app/core/table/testing/table2-validator.service.d.ts +0 -15
  1186. package/src/app/core/table/testing/table2.testing.d.ts +0 -48
  1187. package/src/app/shared/alerts.d.ts +0 -55
  1188. package/src/app/shared/audio/audio.d.ts +0 -45
  1189. package/src/app/shared/audio/audio.testing.d.ts +0 -13
  1190. package/src/app/shared/audio/audio.testing.module.d.ts +0 -11
  1191. package/src/app/shared/capacitor/keyboard.d.ts +0 -16
  1192. package/src/app/shared/capacitor/plugins.d.ts +0 -7
  1193. package/src/app/shared/constants.d.ts +0 -13
  1194. package/src/app/shared/dates.d.ts +0 -61
  1195. package/src/app/shared/debug/debug-service.class.d.ts +0 -5
  1196. package/src/app/shared/debug/debug.component.d.ts +0 -14
  1197. package/src/app/shared/debug/debug.module.d.ts +0 -12
  1198. package/src/app/shared/directives/autofocus.directive.d.ts +0 -18
  1199. package/src/app/shared/directives/autoresize.directive.d.ts +0 -20
  1200. package/src/app/shared/directives/autotitle.directive.d.ts +0 -11
  1201. package/src/app/shared/directives/directives.module.d.ts +0 -14
  1202. package/src/app/shared/directives/drag-and-drop.directive.d.ts +0 -17
  1203. package/src/app/shared/directives/ng-var.directive.d.ts +0 -12
  1204. package/src/app/shared/directives/resizable/resizable.component.d.ts +0 -21
  1205. package/src/app/shared/directives/resizable/resizable.directive.d.ts +0 -12
  1206. package/src/app/shared/directives/resizable/resizable.module.d.ts +0 -8
  1207. package/src/app/shared/directives/throttled-click.directive.d.ts +0 -16
  1208. package/src/app/shared/events.d.ts +0 -29
  1209. package/src/app/shared/file/csv.utils.d.ts +0 -30
  1210. package/src/app/shared/file/file.service.d.ts +0 -23
  1211. package/src/app/shared/file/file.utils.d.ts +0 -20
  1212. package/src/app/shared/file/images.utils.d.ts +0 -36
  1213. package/src/app/shared/file/json.utils.d.ts +0 -19
  1214. package/src/app/shared/file/uri.utils.d.ts +0 -8
  1215. package/src/app/shared/file/url.utils.d.ts +0 -99
  1216. package/src/app/shared/focusable.d.ts +0 -4
  1217. package/src/app/shared/form/field.component.d.ts +0 -85
  1218. package/src/app/shared/form/field.model.d.ts +0 -82
  1219. package/src/app/shared/form/loading-spinner.d.ts +0 -8
  1220. package/src/app/shared/forms.d.ts +0 -162
  1221. package/src/app/shared/functions.d.ts +0 -206
  1222. package/src/app/shared/geolocation/geolocation.utils.d.ts +0 -19
  1223. package/src/app/shared/gesture/gesture-config.d.ts +0 -15
  1224. package/src/app/shared/gesture/hammer.utils.d.ts +0 -16
  1225. package/src/app/shared/graph/colors.utils.d.ts +0 -17
  1226. package/src/app/shared/graph/graph-colors.d.ts +0 -63
  1227. package/src/app/shared/guard/component-dirty.guard.d.ts +0 -14
  1228. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +0 -8
  1229. package/src/app/shared/hotkeys/hotkeys.service.d.ts +0 -48
  1230. package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +0 -11
  1231. package/src/app/shared/http/http.utils.d.ts +0 -28
  1232. package/src/app/shared/image/gallery/image-gallery.component.d.ts +0 -137
  1233. package/src/app/shared/image/gallery/image-gallery.module.d.ts +0 -15
  1234. package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +0 -12
  1235. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +0 -33
  1236. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +0 -16
  1237. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +0 -13
  1238. package/src/app/shared/image/image.model.d.ts +0 -7
  1239. package/src/app/shared/image/image.module.d.ts +0 -8
  1240. package/src/app/shared/image/image.service.d.ts +0 -36
  1241. package/src/app/shared/inputs.d.ts +0 -36
  1242. package/src/app/shared/interceptors/progess.interceptor.d.ts +0 -8
  1243. package/src/app/shared/logging/log-level.model.d.ts +0 -38
  1244. package/src/app/shared/logging/logger.model.d.ts +0 -68
  1245. package/src/app/shared/logging/logging-service.class.d.ts +0 -39
  1246. package/src/app/shared/logging/logging-service.config.d.ts +0 -25
  1247. package/src/app/shared/logging/logging-service.module.d.ts +0 -9
  1248. package/src/app/shared/markdown/markdown.component.d.ts +0 -86
  1249. package/src/app/shared/markdown/markdown.directive.d.ts +0 -13
  1250. package/src/app/shared/markdown/markdown.modal.d.ts +0 -49
  1251. package/src/app/shared/markdown/markdown.module.d.ts +0 -17
  1252. package/src/app/shared/markdown/markdown.service.d.ts +0 -37
  1253. package/src/app/shared/markdown/markdown.utils.d.ts +0 -26
  1254. package/src/app/shared/markdown/testing/markdown.test.d.ts +0 -18
  1255. package/src/app/shared/markdown/testing/markdown.testing.module.d.ts +0 -12
  1256. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +0 -74
  1257. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +0 -211
  1258. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +0 -22
  1259. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +0 -5
  1260. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +0 -48
  1261. package/src/app/shared/material/badge/badge.directive.d.ts +0 -43
  1262. package/src/app/shared/material/badge/badge.module.d.ts +0 -10
  1263. package/src/app/shared/material/badge/badge.test.d.ts +0 -21
  1264. package/src/app/shared/material/boolean/boolean.module.d.ts +0 -20
  1265. package/src/app/shared/material/boolean/material.boolean.d.ts +0 -93
  1266. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +0 -26
  1267. package/src/app/shared/material/chips/chips.module.d.ts +0 -21
  1268. package/src/app/shared/material/chips/material.chips.d.ts +0 -164
  1269. package/src/app/shared/material/chips/testing/chips.test.d.ts +0 -32
  1270. package/src/app/shared/material/datetime/datetime.module.d.ts +0 -24
  1271. package/src/app/shared/material/datetime/material.date.d.ts +0 -90
  1272. package/src/app/shared/material/datetime/material.dateshort.d.ts +0 -89
  1273. package/src/app/shared/material/datetime/material.datetime.d.ts +0 -116
  1274. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +0 -37
  1275. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +0 -32
  1276. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +0 -31
  1277. package/src/app/shared/material/duration/duration.module.d.ts +0 -18
  1278. package/src/app/shared/material/duration/duration.utils.d.ts +0 -2
  1279. package/src/app/shared/material/duration/material.duration.d.ts +0 -64
  1280. package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +0 -23
  1281. package/src/app/shared/material/latlong/latlong.utils.d.ts +0 -59
  1282. package/src/app/shared/material/latlong/material.latlong-input.d.ts +0 -85
  1283. package/src/app/shared/material/latlong/material.latlong.d.ts +0 -90
  1284. package/src/app/shared/material/latlong/material.latlong.module.d.ts +0 -21
  1285. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +0 -28
  1286. package/src/app/shared/material/material.animations.d.ts +0 -8
  1287. package/src/app/shared/material/material.config.d.ts +0 -3
  1288. package/src/app/shared/material/material.module.d.ts +0 -45
  1289. package/src/app/shared/material/material.testing.module.d.ts +0 -32
  1290. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +0 -12
  1291. package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +0 -10
  1292. package/src/app/shared/material/swipe/material.swipe.d.ts +0 -89
  1293. package/src/app/shared/material/swipe/swipe.module.d.ts +0 -16
  1294. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +0 -22
  1295. package/src/app/shared/material/test/test-component.d.ts +0 -75
  1296. package/src/app/shared/material/testing/common.test.d.ts +0 -25
  1297. package/src/app/shared/material/text/testing/text-form.testing.d.ts +0 -19
  1298. package/src/app/shared/material/text/text-form.component.d.ts +0 -66
  1299. package/src/app/shared/material/text/text-form.module.d.ts +0 -16
  1300. package/src/app/shared/modules.d.ts +0 -9
  1301. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +0 -62
  1302. package/src/app/shared/named-filter/named-filter.model.d.ts +0 -32
  1303. package/src/app/shared/named-filter/named-filter.module.d.ts +0 -13
  1304. package/src/app/shared/named-filter/named-filter.service.d.ts +0 -32
  1305. package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +0 -34
  1306. package/src/app/shared/named-filter/testing/named-filter.testing.module.d.ts +0 -10
  1307. package/src/app/shared/observables.d.ts +0 -30
  1308. package/src/app/shared/pipes/arrays.pipe.d.ts +0 -82
  1309. package/src/app/shared/pipes/badge.pipes.d.ts +0 -7
  1310. package/src/app/shared/pipes/colors.pipe.d.ts +0 -9
  1311. package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +0 -25
  1312. package/src/app/shared/pipes/date-format.pipe.d.ts +0 -35
  1313. package/src/app/shared/pipes/date-from-now.pipe.d.ts +0 -12
  1314. package/src/app/shared/pipes/dates.pipe.d.ts +0 -10
  1315. package/src/app/shared/pipes/display-with.pipe.d.ts +0 -8
  1316. package/src/app/shared/pipes/duration.pipe.d.ts +0 -23
  1317. package/src/app/shared/pipes/file-size.pipe.d.ts +0 -30
  1318. package/src/app/shared/pipes/form.pipes.d.ts +0 -69
  1319. package/src/app/shared/pipes/highlight.pipe.d.ts +0 -11
  1320. package/src/app/shared/pipes/html.pipes.d.ts +0 -22
  1321. package/src/app/shared/pipes/latlong-format.pipe.d.ts +0 -20
  1322. package/src/app/shared/pipes/maps.pipe.d.ts +0 -23
  1323. package/src/app/shared/pipes/maskito.pipe.d.ts +0 -14
  1324. package/src/app/shared/pipes/math.pipes.d.ts +0 -26
  1325. package/src/app/shared/pipes/ng-init.pipe.d.ts +0 -8
  1326. package/src/app/shared/pipes/number-format.pipe.d.ts +0 -9
  1327. package/src/app/shared/pipes/observable.pipes.d.ts +0 -25
  1328. package/src/app/shared/pipes/pipes.module.d.ts +0 -35
  1329. package/src/app/shared/pipes/property.pipes.d.ts +0 -41
  1330. package/src/app/shared/pipes/selection.pipes.d.ts +0 -62
  1331. package/src/app/shared/pipes/string.pipes.d.ts +0 -68
  1332. package/src/app/shared/pipes/translate-context.pipe.d.ts +0 -17
  1333. package/src/app/shared/pipes/types.pipes.d.ts +0 -30
  1334. package/src/app/shared/pipes/url.pipes.d.ts +0 -27
  1335. package/src/app/shared/platforms.d.ts +0 -16
  1336. package/src/app/shared/print/print.service.d.ts +0 -94
  1337. package/src/app/shared/regexps.d.ts +0 -32
  1338. package/src/app/shared/rx-state/rx-state.decorators.d.ts +0 -43
  1339. package/src/app/shared/rx-state/rx-state.module.d.ts +0 -10
  1340. package/src/app/shared/rx-state/rx-state.types.d.ts +0 -4
  1341. package/src/app/shared/services/entity-service.class.d.ts +0 -75
  1342. package/src/app/shared/services/job.utils.d.ts +0 -20
  1343. package/src/app/shared/services/memory-entity-service.class.d.ts +0 -79
  1344. package/src/app/shared/services/progress-bar.service.d.ts +0 -20
  1345. package/src/app/shared/services/startable-observable-service.class.d.ts +0 -36
  1346. package/src/app/shared/services/startable-service.class.d.ts +0 -37
  1347. package/src/app/shared/services/translate-context.service.d.ts +0 -29
  1348. package/src/app/shared/services/validator-service.class.d.ts +0 -11
  1349. package/src/app/shared/services.d.ts +0 -17
  1350. package/src/app/shared/shared-routing.module.d.ts +0 -23
  1351. package/src/app/shared/shared.module.d.ts +0 -33
  1352. package/src/app/shared/shared.testing.module.d.ts +0 -20
  1353. package/src/app/shared/storage/storage-explorer.component.d.ts +0 -59
  1354. package/src/app/shared/storage/storage-explorer.module.d.ts +0 -13
  1355. package/src/app/shared/storage/storage-explorer.testing-routing.module.d.ts +0 -9
  1356. package/src/app/shared/storage/storage-explorer.testing.module.d.ts +0 -10
  1357. package/src/app/shared/storage/storage.service.d.ts +0 -22
  1358. package/src/app/shared/storage/storage.utils.d.ts +0 -19
  1359. package/src/app/shared/testing/maskito.test.d.ts +0 -10
  1360. package/src/app/shared/testing/observable.test.d.ts +0 -25
  1361. package/src/app/shared/testing/tests.page.d.ts +0 -20
  1362. package/src/app/shared/toast/toast.testing.d.ts +0 -15
  1363. package/src/app/shared/toast/toast.testing.module.d.ts +0 -12
  1364. package/src/app/shared/toast/toasts.d.ts +0 -16
  1365. package/src/app/shared/toolbar/modal-toolbar.d.ts +0 -21
  1366. package/src/app/shared/toolbar/toolbar.d.ts +0 -70
  1367. package/src/app/shared/toolbar/toolbar.module.d.ts +0 -16
  1368. package/src/app/shared/types.d.ts +0 -36
  1369. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +0 -21
  1370. package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +0 -11
  1371. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +0 -41
  1372. package/src/app/shared/upload-file/upload-file.component.d.ts +0 -50
  1373. package/src/app/shared/upload-file/upload-file.model.d.ts +0 -30
  1374. package/src/app/shared/validator/form-error-adapter.class.d.ts +0 -33
  1375. package/src/app/shared/validator/validators.d.ts +0 -139
  1376. package/src/app/shared/version/versions.d.ts +0 -26
  1377. package/src/app/social/job/job.module.d.ts +0 -12
  1378. package/src/app/social/job/progression/job-progression.component.d.ts +0 -23
  1379. package/src/app/social/job/progression/job-progression.icon.d.ts +0 -62
  1380. package/src/app/social/job/progression/job-progression.list.d.ts +0 -19
  1381. package/src/app/social/job/progression/job-progression.model.d.ts +0 -10
  1382. package/src/app/social/job/progression/job-progression.service.d.ts +0 -33
  1383. package/src/app/social/job/testing/job-progression.testing.d.ts +0 -13
  1384. package/src/app/social/job/testing/job-progression.testing.service.d.ts +0 -9
  1385. package/src/app/social/job/testing/job.testing.module.d.ts +0 -11
  1386. package/src/app/social/message/message.form.d.ts +0 -36
  1387. package/src/app/social/message/message.modal.d.ts +0 -43
  1388. package/src/app/social/message/message.model.d.ts +0 -33
  1389. package/src/app/social/message/message.module.d.ts +0 -12
  1390. package/src/app/social/message/message.service.d.ts +0 -32
  1391. package/src/app/social/social.errors.d.ts +0 -9
  1392. package/src/app/social/social.module.d.ts +0 -20
  1393. package/src/app/social/social.testing.module.d.ts +0 -13
  1394. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +0 -32
  1395. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +0 -71
  1396. package/src/app/social/user-event/testing/user-event.testing.d.ts +0 -35
  1397. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +0 -42
  1398. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +0 -11
  1399. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +0 -42
  1400. package/src/app/social/user-event/user-event.model.d.ts +0 -44
  1401. package/src/app/social/user-event/user-event.module.d.ts +0 -13
  1402. package/src/app/social/user-event/user-event.service.d.ts +0 -124
  1403. package/src/environments/environment.class.d.ts +0 -75
  1404. package/src/environments/environment.d.ts +0 -2
  1405. package/src/environments/environment.loader.d.ts +0 -24
@@ -1,627 +0,0 @@
1
- import { Inject, Injectable, Optional } from '@angular/core';
2
- import { isNilOrBlank, isNotNil, isNotNilOrBlank, toBoolean } from '../../shared/functions';
3
- import { Toasts } from '../../shared/toast/toasts';
4
- import { BehaviorSubject, combineLatest, from, Observable, of, timer } from 'rxjs';
5
- import { catchError, skip, tap } from 'rxjs/operators';
6
- import { ENVIRONMENT } from '../../../environments/environment.class';
7
- import { CORE_CONFIG_OPTIONS } from './config/core.config';
8
- import { NotificationVisibility } from '@awesome-cordova-plugins/downloader/ngx';
9
- import { StartableService } from '../../shared/services/startable-service.class';
10
- import { isMobile, isWindows } from '../../shared/platforms';
11
- import { VersionUtils } from '../../shared/version/versions';
12
- import { FilesUtils, MimeTypes } from '../../shared/file/file.utils';
13
- import { UriUtils } from '../../shared/file/uri.utils';
14
- import { SplashScreen } from '@capacitor/splash-screen';
15
- import { StatusBar } from '@capacitor/status-bar';
16
- import { Browser } from '@capacitor/browser';
17
- import { Keyboard } from '@capacitor/keyboard';
18
- import { CapacitorPlugins } from '../../shared/capacitor/plugins';
19
- import { locale as momentLocale } from 'moment';
20
- import { APP_LOGGING_SERVICE } from '../../shared/logging/logging-service.class';
21
- import { Clipboard } from '@capacitor/clipboard';
22
- import * as i0 from "@angular/core";
23
- import * as i1 from "@ionic/angular";
24
- import * as i2 from "@angular/cdk/platform";
25
- import * as i3 from "@angular/cdk/clipboard";
26
- import * as i4 from "@ngx-translate/core";
27
- import * as i5 from "@angular/material-moment-adapter";
28
- import * as i6 from "./storage/entities-storage.service";
29
- import * as i7 from "./local-settings.service";
30
- import * as i8 from "./network.service";
31
- import * as i9 from "./account.service";
32
- import * as i10 from "./config.service";
33
- import * as i11 from "ionic-cache";
34
- import * as i12 from "../../shared/audio/audio";
35
- import * as i13 from "@awesome-cordova-plugins/downloader/ngx";
36
- import * as i14 from "../../../environments/environment.class";
37
- export const AndroidOsEnvironment = Object.freeze({
38
- DIRECTORY_DOWNLOADS: 'Download',
39
- DIRECTORY_DOWNLOADS_OLD: 'Downloads', // Old name, for older Android version
40
- // TODO: find value for this. See https://developer.android.com/reference/android/os/Environment#getExternalStorageState(java.io.File)
41
- // DIRECTORY_MUSIC,
42
- // DIRECTORY_PODCASTS,
43
- // DIRECTORY_RINGTONES,
44
- // DIRECTORY_ALARMS,
45
- // DIRECTORY_NOTIFICATIONS,
46
- // DIRECTORY_PICTURES,
47
- // DIRECTORY_MOVIES,
48
- // DIRECTORY_DCIM,
49
- // DIRECTORY_DOCUMENTS,
50
- // DIRECTORY_AUDIOBOOKS,
51
- });
52
- export class PlatformService extends StartableService {
53
- ionicPlatform;
54
- cdkPlatform;
55
- cdkClipboard;
56
- toastController;
57
- translate;
58
- dateAdapter;
59
- entitiesStorage;
60
- settings;
61
- networkService;
62
- accountService;
63
- configService;
64
- cache;
65
- audioProvider;
66
- environment;
67
- downloader;
68
- _logger;
69
- _mobile;
70
- _desktop;
71
- _cordova;
72
- _capacitor;
73
- _android;
74
- _ios;
75
- busySubject = new BehaviorSubject(false);
76
- constructor(ionicPlatform, cdkPlatform, cdkClipboard, toastController, translate, dateAdapter, entitiesStorage, settings, networkService, accountService, configService, cache, audioProvider, environment, loggingService, downloader) {
77
- super(ionicPlatform);
78
- this.ionicPlatform = ionicPlatform;
79
- this.cdkPlatform = cdkPlatform;
80
- this.cdkClipboard = cdkClipboard;
81
- this.toastController = toastController;
82
- this.translate = translate;
83
- this.dateAdapter = dateAdapter;
84
- this.entitiesStorage = entitiesStorage;
85
- this.settings = settings;
86
- this.networkService = networkService;
87
- this.accountService = accountService;
88
- this.configService = configService;
89
- this.cache = cache;
90
- this.audioProvider = audioProvider;
91
- this.environment = environment;
92
- this.downloader = downloader;
93
- this._logger = loggingService?.getLogger('platform');
94
- this._debug = !environment.production;
95
- if (this._debug)
96
- console.debug('[platform] Creating service');
97
- if (this._logger) {
98
- this._logger.debug('ctor', 'Creating service');
99
- ionicPlatform.pause.subscribe(() => {
100
- this._logger.info('ctor', 'Pause app');
101
- });
102
- ionicPlatform.resume.subscribe(() => {
103
- this._logger.info('ctor', 'Resume app');
104
- });
105
- }
106
- }
107
- _downloadingJobs = new Map();
108
- checkAppVersionTimer;
109
- is(platformName) {
110
- switch (platformName) {
111
- case 'mobile':
112
- // Exclude Windows touch screens - see sumaris-app issues #323 and #346
113
- return isMobile(window);
114
- case 'mobileweb':
115
- // Exclude Windows touch screens - see sumaris-app issues #323 and #346
116
- return this.ionicPlatform.is(platformName) && !isWindows(window);
117
- default:
118
- return this.ionicPlatform.is(platformName);
119
- }
120
- }
121
- get mobile() {
122
- return isNotNil(this._mobile) ? this._mobile : this.is('mobile');
123
- }
124
- /**
125
- * Say if opened has been opened inside an Android or iOs App.
126
- * This is used to known if there is cordova features
127
- */
128
- isCapacitor() {
129
- return this._capacitor;
130
- }
131
- /**
132
- * Say if opened has been opened inside an Android or iOs App.
133
- * This is used to known if there is cordova features
134
- */
135
- isCordova() {
136
- return this._cordova;
137
- }
138
- isAndroidCordova() {
139
- return (this._android && this._cordova) || false;
140
- }
141
- isIOSCordova() {
142
- return (this._ios && this._cordova) || false;
143
- }
144
- isAndroid() {
145
- return this._android || false;
146
- }
147
- isIOS() {
148
- return this._ios || false;
149
- }
150
- isMacOSDesktop() {
151
- return this._desktop && this.isCordova();
152
- }
153
- /**
154
- * Is a native App (and NOT a mobile web)
155
- */
156
- isApp() {
157
- return this.isAndroidCordova() || this.isIOSCordova();
158
- }
159
- isWeb() {
160
- return !this.isApp();
161
- }
162
- isMobileWeb() {
163
- return this.mobile && this.isWeb();
164
- }
165
- get canDownload() {
166
- return this.downloader && this.isAndroidCordova();
167
- }
168
- get canOpenFile() {
169
- return false; // TODO: fixme using @capacitor/filesystem ?
170
- }
171
- width() {
172
- return this.ionicPlatform.width();
173
- }
174
- height() {
175
- return this.ionicPlatform.height();
176
- }
177
- async ngOnStart() {
178
- const now = Date.now();
179
- this.accountService.tokenType = undefined;
180
- console.info('[platform] Starting platform...');
181
- this._logger?.info('ngOnStart', 'Starting platform...');
182
- try {
183
- this._mobile = this.is('mobile');
184
- this._desktop = this.is('desktop');
185
- this._cordova = this.is('cordova');
186
- this._capacitor = this.is('capacitor');
187
- this._android = this.is('android');
188
- this._ios = this.is('ios');
189
- const logMessage = `Detected {mobile: ${this._mobile}, desktop: ${this._desktop}, cordova: ${this._cordova}, capacitor: ${this._capacitor}, android: ${this._android}, ios: ${this._ios}}`;
190
- console.info('[platform] ' + logMessage);
191
- this._logger?.info('ngOnStart', logMessage);
192
- // Configure theme
193
- await this.configureTheme(this._mobile);
194
- // Configure Capacitor plugins
195
- await this.configureCapacitorPlugins();
196
- // Configure translation
197
- this.configureTranslate();
198
- // Configure cache
199
- this.configureCache();
200
- // Start root services
201
- await Promise.all([this.entitiesStorage.ready(), this.settings.ready(), this.networkService.ready(), this.audioProvider.ready()]);
202
- // Check if web app has update, and reload page if need
203
- if (this.isWeb() && this.environment.production) {
204
- await this.checkAppVersion({ canReload: true });
205
- }
206
- // Update cache configuration when network changed
207
- this.registerSubscription(this.networkService.onNetworkStatusChanges
208
- .pipe(skip(1) // Already done once, so we skip the first event
209
- )
210
- .subscribe((type) => this.configureCache(type !== 'none')));
211
- console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, capacitor: ${this._capacitor}, web: ${this.isWeb()}, downloader: ${this.canDownload}} in ${Date.now() - now}ms`);
212
- // Pass auth token
213
- this.registerSubscription(this.configService.config.subscribe((config) => {
214
- if (!config)
215
- return; // Skip
216
- // Update authentication type
217
- const tokenType = config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE);
218
- if (isNotNilOrBlank(tokenType) && this.accountService.tokenType !== tokenType) {
219
- console.info(`[platform] Using auth token type {${tokenType}}`);
220
- this.accountService.tokenType = tokenType;
221
- }
222
- // Enable auth API using tokens
223
- const authApiEnabled = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.AUTH_API_TOKEN_ENABLED);
224
- if (isNotNil(authApiEnabled) && authApiEnabled !== this.accountService.apiTokenEnabled) {
225
- console.info(`[platform] Using auth API tokens ? ${authApiEnabled}}`);
226
- this.accountService.apiTokenEnabled = authApiEnabled;
227
- }
228
- }));
229
- // Hide the splashscreen (if mobile or macOS) - after 1s
230
- if (this._mobile || this.isMacOSDesktop()) {
231
- setTimeout(async () => {
232
- await SplashScreen.hide();
233
- // Play startup sound (is mobile)
234
- if (this._mobile) {
235
- await this.audioProvider.playStartupSound();
236
- }
237
- }, 1000);
238
- }
239
- // Check if new version, every 1 min
240
- const checkIntervalMs = (this.environment.checkAppVersionIntervalInSeconds || 0) * 1000;
241
- if (this.isWeb() && this.environment.production && checkIntervalMs > 0) {
242
- this.checkAppVersionTimer?.unsubscribe();
243
- const subscription = timer(checkIntervalMs, checkIntervalMs).subscribe((_) => this.checkAppVersion({ silent: true, canReload: false /*do NOT auto reload, when app is started*/ }));
244
- this.checkAppVersionTimer = subscription;
245
- this.registerSubscription(subscription);
246
- subscription.add(() => this.unregisterSubscription(subscription));
247
- }
248
- }
249
- catch (err) {
250
- // Manage startup error
251
- return this.onStartupError(err);
252
- }
253
- }
254
- /**
255
- * Used to show a backdrop when platform is busy (e.g. from the app.component.ts)
256
- */
257
- markAsBusy() {
258
- if (!this.busySubject.value) {
259
- this.busySubject.next(true);
260
- }
261
- }
262
- markAsNotBusy() {
263
- if (this.busySubject.value) {
264
- this.busySubject.next(false);
265
- }
266
- }
267
- async open(url, opts) {
268
- console.info(`[platform] Opening link: ${url}`);
269
- if (this._mobile && this._capacitor) {
270
- await Browser.open({ url, ...opts });
271
- }
272
- else {
273
- window.open(url, opts?.windowName);
274
- }
275
- }
276
- getDownloadingJob(uri) {
277
- return this._downloadingJobs.get(uri);
278
- }
279
- download(request) {
280
- if (!request || !request.uri)
281
- throw new Error("Missing argument 'request' or 'request.uri'");
282
- if (this.canDownload) {
283
- // Check if not already downloading file
284
- let job$ = this._downloadingJobs.get(request.uri);
285
- if (job$)
286
- return job$;
287
- // Compute subPath (final filename)
288
- let subPath = request.destinationInExternalPublicDir?.subPath ||
289
- request.destinationInExternalFilesDir?.subPath ||
290
- request.filename ||
291
- UriUtils.getFilename(request.uri) ||
292
- request.title ||
293
- 'download';
294
- subPath = subPath
295
- .toLowerCase()
296
- // Remove spaces
297
- .replace(/\s+/g, '-');
298
- // Force APK to finish with '.apk'
299
- if (request.mimeType === MimeTypes.ANDROID_APK && !subPath.toLowerCase().endsWith('.apk')) {
300
- subPath += '.apk';
301
- }
302
- const downloadRequest = {
303
- visibleInDownloadsUi: true,
304
- notificationVisibility: NotificationVisibility.VisibleNotifyCompleted,
305
- ...request,
306
- filename: undefined, // Force unset
307
- destinationInExternalPublicDir: !request.destinationInExternalFilesDir
308
- ? {
309
- dirType: AndroidOsEnvironment.DIRECTORY_DOWNLOADS,
310
- ...request.destinationInExternalPublicDir,
311
- subPath,
312
- }
313
- : undefined,
314
- destinationInExternalFilesDir: request.destinationInExternalFilesDir
315
- ? {
316
- dirType: AndroidOsEnvironment.DIRECTORY_DOWNLOADS,
317
- ...request.destinationInExternalFilesDir,
318
- subPath,
319
- }
320
- : undefined,
321
- };
322
- // Start download
323
- console.debug('[platform] Downloading, using request: ' + JSON.stringify(downloadRequest));
324
- job$ = from(this.downloader.download(downloadRequest));
325
- // Remember this request uri
326
- this._downloadingJobs.set(downloadRequest.uri, job$);
327
- return job$.pipe(tap((location) => {
328
- console.info('[platform] File successfully downloaded at:' + location);
329
- // Forget job
330
- this._downloadingJobs.delete(downloadRequest.uri);
331
- return location;
332
- }), catchError((err) => {
333
- console.error('[platform] Unable to download: ' + ((err && err.message) || err));
334
- // Forget the request
335
- this._downloadingJobs.delete(downloadRequest.uri);
336
- // Retry with another location - issue in older Android version
337
- if (downloadRequest.destinationInExternalPublicDir?.dirType === AndroidOsEnvironment.DIRECTORY_DOWNLOADS) {
338
- downloadRequest.destinationInExternalPublicDir.dirType = AndroidOsEnvironment.DIRECTORY_DOWNLOADS_OLD;
339
- return this.download(downloadRequest);
340
- }
341
- throw err;
342
- }));
343
- }
344
- // Fallback (if not Android and Capacitor): opening the URI
345
- // TODO: find a way to download under iOS (see https://www.c-sharpcorner.com/article/how-to-download-a-file-using-file-transfer-plugin-in-ionic-3/)
346
- else {
347
- FilesUtils.downloadUri(request.uri, request.filename);
348
- return of(undefined);
349
- }
350
- }
351
- async copyToClipboard(data, opts) {
352
- const value = typeof data === 'string' ? data : data.string;
353
- let copied = true;
354
- if (this.isAndroidCordova()) {
355
- const writeOptions = typeof data === 'string' ? { string: value } : data;
356
- await Clipboard.write(writeOptions);
357
- }
358
- else {
359
- copied = this.cdkClipboard.copy(value);
360
- }
361
- if (copied) {
362
- // Show toast
363
- if (opts && isNotNilOrBlank(opts.message)) {
364
- await Toasts.show(this.toastController, this.translate, {
365
- type: 'info',
366
- ...opts,
367
- });
368
- }
369
- }
370
- else {
371
- console.error('[platform] Unable to copy to clipboard: ' + data);
372
- }
373
- }
374
- toggleDarkTheme(enable) {
375
- const wasEnabled = document.documentElement.classList.contains('dark');
376
- if (enable !== wasEnabled) {
377
- console.debug(`[platform] ${enable ? 'Enable' : 'Disable'} dark mode...`);
378
- document.documentElement.classList.toggle('dark', enable);
379
- }
380
- }
381
- toggleHighContrast(enable) {
382
- if (enable && !document.documentElement.classList.contains('high-contrast')) {
383
- console.debug('[platform] Enable high contrast...');
384
- }
385
- document.documentElement.classList.toggle('high-contrast', enable);
386
- }
387
- showToast(opts) {
388
- if (!this.toastController)
389
- throw new Error("Missing toastController in component's constructor");
390
- return new Promise((resolve) => Toasts.show(this.toastController, this.translate, {
391
- ...opts,
392
- onWillPresent: (t) => resolve(t),
393
- }));
394
- }
395
- async closeToast(id) {
396
- return this.toastController?.dismiss(null, null, id);
397
- }
398
- /* -- protected methods -- */
399
- async configureTheme(mobile, win = window) {
400
- // Listen for changes to settings dark mode
401
- if (this.environment.allowDarkMode) {
402
- const isScreen$ = new Observable((observer) => {
403
- const matchMedia = win.matchMedia('screen');
404
- matchMedia.addEventListener('change', (e) => observer.next(e.matches));
405
- observer.next(matchMedia.matches);
406
- });
407
- this.registerSubscription(combineLatest([isScreen$, this.settings.darkMode$]).subscribe(([isScreen, enable]) => this.toggleDarkTheme(isScreen && enable)));
408
- }
409
- // Workaround, for MS Windows touch screen (detected as mobile, but forced as desktop)
410
- if (!mobile &&
411
- (win.document.documentElement?.classList.contains('plt-mobile') || win.document.documentElement.classList?.contains('plt-mobileweb'))) {
412
- console.warn('[platform] Force class list to: <html class="plt-desktop">. Workaround for Windows touch screen.');
413
- win.document.documentElement.classList.remove('plt-mobile', 'plt-mobileweb');
414
- win.document.documentElement.classList.add('plt-desktop');
415
- }
416
- }
417
- async configureCapacitorPlugins() {
418
- if (!this._capacitor)
419
- return; // Skip
420
- console.info('[platform] Configuring Capacitor plugins...');
421
- let pluginName;
422
- try {
423
- pluginName = CapacitorPlugins.StatusBar;
424
- if (this.isApp() && this.isAndroid()) {
425
- await StatusBar.setOverlaysWebView({ overlay: false });
426
- }
427
- // Hide accessory bar (iOS only)
428
- if (this.isApp() && this.isIOS()) {
429
- pluginName = CapacitorPlugins.Keyboard;
430
- await Keyboard.setAccessoryBarVisible({ isVisible: false });
431
- }
432
- }
433
- catch (err) {
434
- const logMessage = `Error while configuring ${pluginName} plugin: ${err.message || err}\n${err?.originalStack || JSON.stringify(err)}`;
435
- console.error('[platform] ' + logMessage);
436
- this._logger?.error('configureCapacitorPlugins', logMessage);
437
- }
438
- }
439
- configureTranslate() {
440
- console.info('[platform] Configuring i18n ...');
441
- // this language will be used as a fallback when a translation isn't found in the current language
442
- this.translate.setDefaultLang(this.environment.defaultLocale);
443
- // apply locale immediately
444
- this.applyLocale(this.environment.defaultLocale);
445
- // When locale changes, apply to date adapter
446
- this.registerSubscription(this.translate.onLangChange.subscribe((event) => {
447
- if (event && event.lang) {
448
- this.applyLocale(event.lang);
449
- }
450
- }));
451
- this.registerSubscription(this.settings.onChange.subscribe((data) => {
452
- if (data) {
453
- // Apply locale
454
- if (data.locale) {
455
- if (data.locale !== this.translate.currentLang) {
456
- this.translate.use(data.locale);
457
- }
458
- }
459
- else {
460
- // Applying default, when settings has no locale property (hotfix - ludovic.pecquot@e-is.pro - 14/11/2021 - since v1.20.42)
461
- console.warn('[platform] No locale found in settings: applying defaultLocale: ', this.environment.defaultLocale);
462
- this.translate.use(this.environment.defaultLocale);
463
- }
464
- }
465
- }));
466
- // Use account's settings, (like locale), when account inheritance enabled
467
- this.registerSubscription(this.accountService.onLogin.subscribe(async (account) => {
468
- if (account.settings && this.settings.settings.accountInheritance) {
469
- console.debug('[platform] Copying account settings into local settings...');
470
- const accountSettings = account.settings.asLocalSettings();
471
- await this.settings.apply(accountSettings);
472
- }
473
- }));
474
- }
475
- applyLocale(locale) {
476
- // force 'en' as 'en_GB'
477
- if (locale === 'en') {
478
- locale = 'en_GB';
479
- }
480
- // config moment lib
481
- try {
482
- momentLocale(locale);
483
- console.debug('[platform] Use locale {' + locale + '}');
484
- }
485
- catch (err) {
486
- // If error, fallback to en
487
- momentLocale('en');
488
- console.warn('[platform] Unknown locale for moment lib. Using default [en]');
489
- }
490
- // Config date adapter
491
- this.dateAdapter.setLocale(momentLocale());
492
- }
493
- configureCache(online) {
494
- online = toBoolean(online, this.cache.isOnline());
495
- const cacheTTL = online ? 3600 /* 1h */ : 3600 * 24 * 30; /* 1 month */
496
- console.info(`[platform] Configuring cache [OK] {online: ${online}, timeToLive: ${cacheTTL / 3600}h, offlineInvalidate: false}`);
497
- this.cache.setDefaultTTL(cacheTTL);
498
- this.cache.setOfflineInvalidate(false); // Do not invalidate cache when offline
499
- }
500
- async checkAppVersion(opts) {
501
- if (this.networkService.offline || !this.isWeb())
502
- return; // Skip
503
- const silent = opts?.silent === true;
504
- const production = this.environment.production;
505
- const canAutoReload = !opts || opts.canReload !== false;
506
- if (!silent)
507
- console.info('[platform] Checking remote app version...');
508
- const actualVersion = this.environment.version;
509
- if (isNilOrBlank(actualVersion)) {
510
- console.error("[platform] Missing required value for 'environment.version'. Cannot check remote app version.");
511
- this.checkAppVersionTimer?.unsubscribe(); // Stop timer if exists
512
- return; // Skip
513
- }
514
- const remoteVersion = await this.networkService.getAppVersion();
515
- if (isNilOrBlank(remoteVersion)) {
516
- if (production && !silent)
517
- console.error('[platform] Cannot load remote app version. Skipping version check');
518
- this.checkAppVersionTimer?.unsubscribe(); // Stop timer if exists
519
- return;
520
- }
521
- if (VersionUtils.isCompatible(remoteVersion, actualVersion)) {
522
- if (!silent)
523
- console.info(`[platform] Checking remote app version [OK] {remote: '${remoteVersion}', actual: '${actualVersion}'}`);
524
- return;
525
- }
526
- // If newer version exists
527
- let reloadPath = location.href.replace(/[&?]version=[^&]*/gi, ''); // Remove old version in query params
528
- reloadPath += reloadPath.indexOf('?') === -1 ? '?' : '&'; // Add query param separator
529
- reloadPath += 'version=' + remoteVersion; // Add version (to avoid a reload infinite loop)
530
- // Already try to reload, but version still bad
531
- if (reloadPath === location.href) {
532
- if (canAutoReload)
533
- console.error(`[platform] Reloaded page failed, because version still mismatch! Please check version.appup file (expected app version: ${actualVersion})`);
534
- // Stop timer, to avoid infinite loop
535
- this.checkAppVersionTimer?.unsubscribe();
536
- return;
537
- }
538
- console.warn(`[platform] More recent version detected (remote: ${remoteVersion}, actual: ${actualVersion}`);
539
- // Auto reload
540
- if (canAutoReload) {
541
- console.info('[platform] Will reloading at ' + reloadPath);
542
- location.href = reloadPath;
543
- // App stop
544
- }
545
- // Ask user to reload
546
- else {
547
- // Stop timer, to avoid infinite loop
548
- this.checkAppVersionTimer?.unsubscribe();
549
- // Display a reload toast
550
- await this.showToast({
551
- message: 'CONFIRM.RELOAD_APP',
552
- messageParams: { version: remoteVersion, name: this.environment.name },
553
- type: 'info',
554
- duration: -1,
555
- showCloseButton: true,
556
- buttons: [
557
- // Reload button
558
- {
559
- text: this.translate.instant('COMMON.BTN_UPDATE'),
560
- side: 'end',
561
- handler: () => {
562
- location.href = reloadPath;
563
- return true;
564
- },
565
- },
566
- ],
567
- });
568
- }
569
- }
570
- async onStartupError(err) {
571
- console.error('[platform] Failed starting the platform! ' + JSON.stringify(err));
572
- let message = (err && err.message) || err;
573
- const detailsMessage = err && ((err.details && err.details.message) || err.details);
574
- // Set specific error when Firefox is in private mode or history never remembered (see Mantis Ifremer #56441)
575
- if (err.code === 11 && this.cdkPlatform.FIREFOX) {
576
- message = 'ERROR.FIREFOX_NO_STORAGE';
577
- }
578
- if (this.translate) {
579
- message = await this.translate.instant(message);
580
- if (err && err.code) {
581
- message += ` {code: ${err.code}}`;
582
- }
583
- }
584
- else {
585
- message = `Fatal error: Please contact your administrator.\n\n{code: ${(err && err.code) || 'null'}, message: "${message}"}`;
586
- }
587
- if (this.toastController) {
588
- if (detailsMessage) {
589
- message += `<br/><small>${detailsMessage}</small>`;
590
- }
591
- await this.showToast({
592
- type: 'error',
593
- duration: -1,
594
- showCloseButton: true,
595
- message,
596
- });
597
- }
598
- else if (window) {
599
- if (detailsMessage) {
600
- message += `\n\n{cause: "${detailsMessage}"}`;
601
- }
602
- window.alert(message);
603
- }
604
- else {
605
- console.error(message);
606
- if (err && err.details)
607
- console.error('cause', err.details);
608
- }
609
- }
610
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlatformService, deps: [{ token: i1.Platform }, { token: i2.Platform }, { token: i3.Clipboard }, { token: i1.ToastController }, { token: i4.TranslateService }, { token: i5.MomentDateAdapter }, { token: i6.EntitiesStorage }, { token: i7.LocalSettingsService }, { token: i8.NetworkService }, { token: i9.AccountService }, { token: i10.ConfigService }, { token: i11.CacheService }, { token: i12.AudioProvider }, { token: ENVIRONMENT }, { token: APP_LOGGING_SERVICE, optional: true }, { token: i13.Downloader, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
611
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlatformService, providedIn: 'root' });
612
- }
613
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlatformService, decorators: [{
614
- type: Injectable,
615
- args: [{ providedIn: 'root' }]
616
- }], ctorParameters: () => [{ type: i1.Platform }, { type: i2.Platform }, { type: i3.Clipboard }, { type: i1.ToastController }, { type: i4.TranslateService }, { type: i5.MomentDateAdapter }, { type: i6.EntitiesStorage }, { type: i7.LocalSettingsService }, { type: i8.NetworkService }, { type: i9.AccountService }, { type: i10.ConfigService }, { type: i11.CacheService }, { type: i12.AudioProvider }, { type: i14.Environment, decorators: [{
617
- type: Inject,
618
- args: [ENVIRONMENT]
619
- }] }, { type: undefined, decorators: [{
620
- type: Optional
621
- }, {
622
- type: Inject,
623
- args: [APP_LOGGING_SERVICE]
624
- }] }, { type: i13.Downloader, decorators: [{
625
- type: Optional
626
- }] }] });
627
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVU3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUYsT0FBTyxFQUFvQixNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZELE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUVuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRCxPQUFPLEVBQStCLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDOUcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFD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LElBQUksQ0FBQyxJQUFJLE1BQU0sZUFBZSxPQUFPLElBQUksQ0FBQztRQUMvSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxJQUFJLGVBQWUsY0FBYyxVQUFVLENBQUM7WUFDckQsQ0FBQztZQUNELE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbkIsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDWixlQUFlLEVBQUUsSUFBSTtnQkFDckIsT0FBTzthQUNSLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sSUFBSSxnQkFBZ0IsY0FBYyxJQUFJLENBQUM7WUFDaEQsQ0FBQztZQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPO2dCQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQzt3R0E1bkJVLGVBQWUsbVpBeUJoQixXQUFXLGFBQ0MsbUJBQW1COzRHQTFCOUIsZUFBZSxjQURGLE1BQU07OzRGQUNuQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBMEI3QixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQ3RDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybSwgVG9hc3RDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgTmV0d29ya1NlcnZpY2UgfSBmcm9tICcuL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoVG9rZW5UeXBlIH0gZnJvbSAnLi9uZXR3b3JrLnR5cGVzJztcbmltcG9ydCB7IFBsYXRmb3JtcyB9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IENhY2hlU2VydmljZSB9IGZyb20gJ2lvbmljLWNhY2hlJztcbmltcG9ydCB7IEF1ZGlvUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9zaGFyZWQvYXVkaW8vYXVkaW8nO1xuaW1wb3J0IHsgUGxhdGZvcm0gYXMgQ2RrUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuXG5pbXBvcnQgeyBpc05pbE9yQmxhbmssIGlzTm90TmlsLCBpc05vdE5pbE9yQmxhbmssIHRvQm9vbGVhbiB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgRW50aXRpZXNTdG9yYWdlIH0gZnJvbSAnLi9zdG9yYWdlL2VudGl0aWVzLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBTaG93VG9hc3RPcHRpb25zLCBUb2FzdHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvdG9hc3QvdG9hc3RzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc2tpcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IENPUkVfQ09ORklHX09QVElPTlMgfSBmcm9tICcuL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQgeyBNb21lbnREYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJztcbmltcG9ydCB7IERvd25sb2FkZXIsIERvd25sb2FkUmVxdWVzdCwgTm90aWZpY2F0aW9uVmlzaWJpbGl0eSB9IGZyb20gJ0Bhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy9kb3dubG9hZGVyL25neCc7XG5pbXBvcnQgeyBTdGFydGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3N0YXJ0YWJsZS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IGlzTW9iaWxlLCBpc1dpbmRvd3MgfSBmcm9tICcuLi8uLi9zaGFyZWQvcGxhdGZvcm1zJztcbmltcG9ydCB7IFZlcnNpb25VdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC92ZXJzaW9uL3ZlcnNpb25zJztcbmltcG9ydCB7IEZpbGVzVXRpbHMsIE1pbWVUeXBlcyB9IGZyb20gJy4uLy4uL3NoYXJlZC9maWxlL2ZpbGUudXRpbHMnO1xuaW1wb3J0IHsgVXJpVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS91cmkudXRpbHMnO1xuaW1wb3J0IHsgU3BsYXNoU2NyZWVuIH0gZnJvbSAnQGNhcGFjaXRvci9zcGxhc2gtc2NyZWVuJztcbmltcG9ydCB7IFN0YXR1c0JhciB9IGZyb20gJ0BjYXBhY2l0b3Ivc3RhdHVzLWJhcic7XG5pbXBvcnQgeyBCcm93c2VyLCBPcGVuT3B0aW9ucyB9IGZyb20gJ0BjYXBhY2l0b3IvYnJvd3Nlcic7XG5pbXBvcnQgeyBLZXlib2FyZCB9IGZyb20gJ0BjYXBhY2l0b3Iva2V5Ym9hcmQnO1xuaW1wb3J0IHsgQ2FwYWNpdG9yUGx1Z2lucyB9IGZyb20gJy4uLy4uL3NoYXJlZC9jYXBhY2l0b3IvcGx1Z2lucyc7XG5pbXBvcnQgeyBsb2NhbGUgYXMgbW9tZW50TG9jYWxlIH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IElMb2dnZXIsIElMb2dnaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9sb2dnaW5nL2xvZ2dlci5tb2RlbCc7XG5pbXBvcnQgeyBBUFBfTE9HR0lOR19TRVJWSUNFIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2xvZ2dpbmcvbG9nZ2luZy1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IENsaXBib2FyZCBhcyBDZGtDbGlwYm9hcmQgfSBmcm9tICdAYW5ndWxhci9jZGsvY2xpcGJvYXJkJztcbmltcG9ydCB7IENsaXBib2FyZCB9IGZyb20gJ0BjYXBhY2l0b3IvY2xpcGJvYXJkJztcbmltcG9ydCB7IFdyaXRlT3B0aW9ucyB9IGZyb20gJ0BjYXBhY2l0b3IvY2xpcGJvYXJkL2Rpc3QvZXNtL2RlZmluaXRpb25zJztcblxuZXhwb3J0IGNvbnN0IEFuZHJvaWRPc0Vudmlyb25tZW50ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIERJUkVDVE9SWV9ET1dOTE9BRFM6ICdEb3dubG9hZCcsXG4gIERJUkVDVE9SWV9ET1dOTE9BRFNfT0xEOiAnRG93bmxvYWRzJywgLy8gT2xkIG5hbWUsIGZvciBvbGRlciBBbmRyb2lkIHZlcnNpb25cbiAgLy8gVE9ETzogZmluZCB2YWx1ZSBmb3IgdGhpcy4gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0Vudmlyb25tZW50I2dldEV4dGVybmFsU3RvcmFnZVN0YXRlKGphdmEuaW8uRmlsZSlcbiAgLy8gRElSRUNUT1JZX01VU0lDLFxuICAvLyBESVJFQ1RPUllfUE9EQ0FTVFMsXG4gIC8vIERJUkVDVE9SWV9SSU5HVE9ORVMsXG4gIC8vIERJUkVDVE9SWV9BTEFSTVMsXG4gIC8vIERJUkVDVE9SWV9OT1RJRklDQVRJT05TLFxuICAvLyBESVJFQ1RPUllfUElDVFVSRVMsXG4gIC8vIERJUkVDVE9SWV9NT1ZJRVMsXG4gIC8vIERJUkVDVE9SWV9EQ0lNLFxuICAvLyBESVJFQ1RPUllfRE9DVU1FTlRTLFxuICAvLyBESVJFQ1RPUllfQVVESU9CT09LUyxcbn0pO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFBsYXRmb3JtU2VydmljZSBleHRlbmRzIFN0YXJ0YWJsZVNlcnZpY2Uge1xuICBwcml2YXRlIF9sb2dnZXI6IElMb2dnZXI7XG4gIHByaXZhdGUgX21vYmlsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZGVza3RvcDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY29yZG92YTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY2FwYWNpdG9yOiBib29sZWFuO1xuICBwcml2YXRlIF9hbmRyb2lkOiBib29sZWFuO1xuICBwcml2YXRlIF9pb3M6IGJvb2xlYW47XG5cbiAgYnVzeVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGlvbmljUGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgY2RrUGxhdGZvcm06IENka1BsYXRmb3JtLFxuICAgIHByaXZhdGUgY2RrQ2xpcGJvYXJkOiBDZGtDbGlwYm9hcmQsXG4gICAgcHJpdmF0ZSB0b2FzdENvbnRyb2xsZXI6IFRvYXN0Q29udHJvbGxlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVBZGFwdGVyOiBNb21lbnREYXRlQWRhcHRlcixcbiAgICBwcml2YXRlIGVudGl0aWVzU3RvcmFnZTogRW50aXRpZXNTdG9yYWdlLFxuICAgIHByaXZhdGUgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmV0d29ya1NlcnZpY2U6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGNhY2hlOiBDYWNoZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdWRpb1Byb3ZpZGVyOiBBdWRpb1Byb3ZpZGVyLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfTE9HR0lOR19TRVJWSUNFKSBsb2dnaW5nU2VydmljZTogSUxvZ2dpbmdTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZG93bmxvYWRlcjogRG93bmxvYWRlclxuICApIHtcbiAgICBzdXBlcihpb25pY1BsYXRmb3JtKTtcblxuICAgIHRoaXMuX2xvZ2dlciA9IGxvZ2dpbmdTZXJ2aWNlPy5nZXRMb2dnZXIoJ3BsYXRmb3JtJyk7XG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gQ3JlYXRpbmcgc2VydmljZScpO1xuXG4gICAgaWYgKHRoaXMuX2xvZ2dlcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdjdG9yJywgJ0NyZWF0aW5nIHNlcnZpY2UnKTtcbiAgICAgIGlvbmljUGxhdGZvcm0ucGF1c2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ2N0b3InLCAnUGF1c2UgYXBwJyk7XG4gICAgICB9KTtcbiAgICAgIGlvbmljUGxhdGZvcm0ucmVzdW1lLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdjdG9yJywgJ1Jlc3VtZSBhcHAnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9kb3dubG9hZGluZ0pvYnM6IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSBjaGVja0FwcFZlcnNpb25UaW1lcjogU3Vic2NyaXB0aW9uO1xuXG4gIGlzKHBsYXRmb3JtTmFtZTogUGxhdGZvcm1zKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybU5hbWUpIHtcbiAgICAgIGNhc2UgJ21vYmlsZSc6XG4gICAgICAgIC8vIEV4Y2x1ZGUgV2luZG93cyB0b3VjaCBzY3JlZW5zIC0gc2VlIHN1bWFyaXMtYXBwIGlzc3VlcyAjMzIzIGFuZCAjMzQ2XG4gICAgICAgIHJldHVybiBpc01vYmlsZSh3aW5kb3cpO1xuICAgICAgY2FzZSAnbW9iaWxld2ViJzpcbiAgICAgICAgLy8gRXhjbHVkZSBXaW5kb3dzIHRvdWNoIHNjcmVlbnMgLSBzZWUgc3VtYXJpcy1hcHAgaXNzdWVzICMzMjMgYW5kICMzNDZcbiAgICAgICAgcmV0dXJuIHRoaXMuaW9uaWNQbGF0Zm9ybS5pcyhwbGF0Zm9ybU5hbWUpICYmICFpc1dpbmRvd3Mod2luZG93KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmlvbmljUGxhdGZvcm0uaXMocGxhdGZvcm1OYW1lKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05vdE5pbCh0aGlzLl9tb2JpbGUpID8gdGhpcy5fbW9iaWxlIDogdGhpcy5pcygnbW9iaWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogU2F5IGlmIG9wZW5lZCBoYXMgYmVlbiBvcGVuZWQgaW5zaWRlIGFuIEFuZHJvaWQgb3IgaU9zIEFwcC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtub3duIGlmIHRoZXJlIGlzIGNvcmRvdmEgZmVhdHVyZXNcbiAgICovXG4gIGlzQ2FwYWNpdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYXBhY2l0b3I7XG4gIH1cblxuICAvKipcbiAgICogU2F5IGlmIG9wZW5lZCBoYXMgYmVlbiBvcGVuZWQgaW5zaWRlIGFuIEFuZHJvaWQgb3IgaU9zIEFwcC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtub3duIGlmIHRoZXJlIGlzIGNvcmRvdmEgZmVhdHVyZXNcbiAgICovXG4gIGlzQ29yZG92YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZG92YTtcbiAgfVxuXG4gIGlzQW5kcm9pZENvcmRvdmEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLl9hbmRyb2lkICYmIHRoaXMuX2NvcmRvdmEpIHx8IGZhbHNlO1xuICB9XG5cbiAgaXNJT1NDb3Jkb3ZhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5faW9zICYmIHRoaXMuX2NvcmRvdmEpIHx8IGZhbHNlO1xuICB9XG5cbiAgaXNBbmRyb2lkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hbmRyb2lkIHx8IGZhbHNlO1xuICB9XG5cbiAgaXNJT1MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lvcyB8fCBmYWxzZTtcbiAgfVxuXG4gIGlzTWFjT1NEZXNrdG9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kZXNrdG9wICYmIHRoaXMuaXNDb3Jkb3ZhKCk7XG4gIH1cblxuICAvKipcbiAgICogSXMgYSBuYXRpdmUgQXBwIChhbmQgTk9UIGEgbW9iaWxlIHdlYilcbiAgICovXG4gIGlzQXBwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQW5kcm9pZENvcmRvdmEoKSB8fCB0aGlzLmlzSU9TQ29yZG92YSgpO1xuICB9XG5cbiAgaXNXZWIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzQXBwKCk7XG4gIH1cblxuICBpc01vYmlsZVdlYigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2JpbGUgJiYgdGhpcy5pc1dlYigpO1xuICB9XG5cbiAgZ2V0IGNhbkRvd25sb2FkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkZXIgJiYgdGhpcy5pc0FuZHJvaWRDb3Jkb3ZhKCk7XG4gIH1cblxuICBnZXQgY2FuT3BlbkZpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBUT0RPOiBmaXhtZSB1c2luZyBAY2FwYWNpdG9yL2ZpbGVzeXN0ZW0gP1xuICB9XG5cbiAgd2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pb25pY1BsYXRmb3JtLndpZHRoKCk7XG4gIH1cblxuICBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pb25pY1BsYXRmb3JtLmhlaWdodCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG5nT25TdGFydCgpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgdGhpcy5hY2NvdW50U2VydmljZS50b2tlblR5cGUgPSB1bmRlZmluZWQ7XG4gICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIFN0YXJ0aW5nIHBsYXRmb3JtLi4uJyk7XG4gICAgdGhpcy5fbG9nZ2VyPy5pbmZvKCduZ09uU3RhcnQnLCAnU3RhcnRpbmcgcGxhdGZvcm0uLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9tb2JpbGUgPSB0aGlzLmlzKCdtb2JpbGUnKTtcbiAgICAgIHRoaXMuX2Rlc2t0b3AgPSB0aGlzLmlzKCdkZXNrdG9wJyk7XG4gICAgICB0aGlzLl9jb3Jkb3ZhID0gdGhpcy5pcygnY29yZG92YScpO1xuICAgICAgdGhpcy5fY2FwYWNpdG9yID0gdGhpcy5pcygnY2FwYWNpdG9yJyk7XG4gICAgICB0aGlzLl9hbmRyb2lkID0gdGhpcy5pcygnYW5kcm9pZCcpO1xuICAgICAgdGhpcy5faW9zID0gdGhpcy5pcygnaW9zJyk7XG5cbiAgICAgIGNvbnN0IGxvZ01lc3NhZ2UgPSBgRGV0ZWN0ZWQge21vYmlsZTogJHt0aGlzLl9tb2JpbGV9LCBkZXNrdG9wOiAke3RoaXMuX2Rlc2t0b3B9LCBjb3Jkb3ZhOiAke3RoaXMuX2NvcmRvdmF9LCBjYXBhY2l0b3I6ICR7dGhpcy5fY2FwYWNpdG9yfSwgYW5kcm9pZDogJHt0aGlzLl9hbmRyb2lkfSwgaW9zOiAke3RoaXMuX2lvc319YDtcbiAgICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSAnICsgbG9nTWVzc2FnZSk7XG4gICAgICB0aGlzLl9sb2dnZXI/LmluZm8oJ25nT25TdGFydCcsIGxvZ01lc3NhZ2UpO1xuXG4gICAgICAvLyBDb25maWd1cmUgdGhlbWVcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJlVGhlbWUodGhpcy5fbW9iaWxlKTtcblxuICAgICAgLy8gQ29uZmlndXJlIENhcGFjaXRvciBwbHVnaW5zXG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyZUNhcGFjaXRvclBsdWdpbnMoKTtcblxuICAgICAgLy8gQ29uZmlndXJlIHRyYW5zbGF0aW9uXG4gICAgICB0aGlzLmNvbmZpZ3VyZVRyYW5zbGF0ZSgpO1xuXG4gICAgICAvLyBDb25maWd1cmUgY2FjaGVcbiAgICAgIHRoaXMuY29uZmlndXJlQ2FjaGUoKTtcblxuICAgICAgLy8gU3RhcnQgcm9vdCBzZXJ2aWNlc1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuZW50aXRpZXNTdG9yYWdlLnJlYWR5KCksIHRoaXMuc2V0dGluZ3MucmVhZHkoKSwgdGhpcy5uZXR3b3JrU2VydmljZS5yZWFkeSgpLCB0aGlzLmF1ZGlvUHJvdmlkZXIucmVhZHkoKV0pO1xuXG4gICAgICAvLyBDaGVjayBpZiB3ZWIgYXBwIGhhcyB1cGRhdGUsIGFuZCByZWxvYWQgcGFnZSBpZiBuZWVkXG4gICAgICBpZiAodGhpcy5pc1dlYigpICYmIHRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbikge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwVmVyc2lvbih7IGNhblJlbG9hZDogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGNhY2hlIGNvbmZpZ3VyYXRpb24gd2hlbiBuZXR3b3JrIGNoYW5nZWRcbiAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICAgIHRoaXMubmV0d29ya1NlcnZpY2Uub25OZXR3b3JrU3RhdHVzQ2hhbmdlc1xuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc2tpcCgxKSAvLyBBbHJlYWR5IGRvbmUgb25jZSwgc28gd2Ugc2tpcCB0aGUgZmlyc3QgZXZlbnRcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgodHlwZSkgPT4gdGhpcy5jb25maWd1cmVDYWNoZSh0eXBlICE9PSAnbm9uZScpKVxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgW3BsYXRmb3JtXSBTdGFydGluZyBwbGF0Zm9ybSBbT0tdIHttb2JpbGU6ICR7dGhpcy5fbW9iaWxlfSwgY2FwYWNpdG9yOiAke3RoaXMuX2NhcGFjaXRvcn0sIHdlYjogJHt0aGlzLmlzV2ViKCl9LCBkb3dubG9hZGVyOiAke3RoaXMuY2FuRG93bmxvYWR9fSBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgXG4gICAgICApO1xuXG4gICAgICAvLyBQYXNzIGF1dGggdG9rZW5cbiAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcuc3Vic2NyaWJlKChjb25maWcpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbmZpZykgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICAgICAgICAvLyBVcGRhdGUgYXV0aGVudGljYXRpb24gdHlwZVxuICAgICAgICAgIGNvbnN0IHRva2VuVHlwZTogQXV0aFRva2VuVHlwZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLkFVVEhfVE9LRU5fVFlQRSkgYXMgQXV0aFRva2VuVHlwZTtcbiAgICAgICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKHRva2VuVHlwZSkgJiYgdGhpcy5hY2NvdW50U2VydmljZS50b2tlblR5cGUgIT09IHRva2VuVHlwZSkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFVzaW5nIGF1dGggdG9rZW4gdHlwZSB7JHt0b2tlblR5cGV9fWApO1xuICAgICAgICAgICAgdGhpcy5hY2NvdW50U2VydmljZS50b2tlblR5cGUgPSB0b2tlblR5cGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW5hYmxlIGF1dGggQVBJIHVzaW5nIHRva2Vuc1xuICAgICAgICAgIGNvbnN0IGF1dGhBcGlFbmFibGVkID0gY29uZmlnLmdldFByb3BlcnR5QXNCb29sZWFuKENPUkVfQ09ORklHX09QVElPTlMuQVVUSF9BUElfVE9LRU5fRU5BQkxFRCk7XG4gICAgICAgICAgaWYgKGlzTm90TmlsKGF1dGhBcGlFbmFibGVkKSAmJiBhdXRoQXBpRW5hYmxlZCAhPT0gdGhpcy5hY2NvdW50U2VydmljZS5hcGlUb2tlbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBVc2luZyBhdXRoIEFQSSB0b2tlbnMgPyAke2F1dGhBcGlFbmFibGVkfX1gKTtcbiAgICAgICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2UuYXBpVG9rZW5FbmFibGVkID0gYXV0aEFwaUVuYWJsZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgLy8gSGlkZSB0aGUgc3BsYXNoc2NyZWVuIChpZiBtb2JpbGUgb3IgbWFjT1MpIC0gYWZ0ZXIgMXNcbiAgICAgIGlmICh0aGlzLl9tb2JpbGUgfHwgdGhpcy5pc01hY09TRGVza3RvcCgpKSB7XG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IFNwbGFzaFNjcmVlbi5oaWRlKCk7XG5cbiAgICAgICAgICAvLyBQbGF5IHN0YXJ0dXAgc291bmQgKGlzIG1vYmlsZSlcbiAgICAgICAgICBpZiAodGhpcy5fbW9iaWxlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmF1ZGlvUHJvdmlkZXIucGxheVN0YXJ0dXBTb3VuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIG5ldyB2ZXJzaW9uLCBldmVyeSAxIG1pblxuICAgICAgY29uc3QgY2hlY2tJbnRlcnZhbE1zID0gKHRoaXMuZW52aXJvbm1lbnQuY2hlY2tBcHBWZXJzaW9uSW50ZXJ2YWxJblNlY29uZHMgfHwgMCkgKiAxMDAwO1xuICAgICAgaWYgKHRoaXMuaXNXZWIoKSAmJiB0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb24gJiYgY2hlY2tJbnRlcnZhbE1zID4gMCkge1xuICAgICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyPy51bnN1YnNjcmliZSgpO1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aW1lcihjaGVja0ludGVydmFsTXMsIGNoZWNrSW50ZXJ2YWxNcykuc3Vic2NyaWJlKChfKSA9PlxuICAgICAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uKHsgc2lsZW50OiB0cnVlLCBjYW5SZWxvYWQ6IGZhbHNlIC8qZG8gTk9UIGF1dG8gcmVsb2FkLCB3aGVuIGFwcCBpcyBzdGFydGVkKi8gfSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb25UaW1lciA9IHN1YnNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgICBzdWJzY3JpcHRpb24uYWRkKCgpID0+IHRoaXMudW5yZWdpc3RlclN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIE1hbmFnZSBzdGFydHVwIGVycm9yXG4gICAgICByZXR1cm4gdGhpcy5vblN0YXJ0dXBFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNob3cgYSBiYWNrZHJvcCB3aGVuIHBsYXRmb3JtIGlzIGJ1c3kgKGUuZy4gZnJvbSB0aGUgYXBwLmNvbXBvbmVudC50cylcbiAgICovXG4gIG1hcmtBc0J1c3koKSB7XG4gICAgaWYgKCF0aGlzLmJ1c3lTdWJqZWN0LnZhbHVlKSB7XG4gICAgICB0aGlzLmJ1c3lTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya0FzTm90QnVzeSgpIHtcbiAgICBpZiAodGhpcy5idXN5U3ViamVjdC52YWx1ZSkge1xuICAgICAgdGhpcy5idXN5U3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvcGVuKHVybDogc3RyaW5nLCBvcHRzPzogT21pdDxPcGVuT3B0aW9ucywgJ3VybCc+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIE9wZW5pbmcgbGluazogJHt1cmx9YCk7XG4gICAgaWYgKHRoaXMuX21vYmlsZSAmJiB0aGlzLl9jYXBhY2l0b3IpIHtcbiAgICAgIGF3YWl0IEJyb3dzZXIub3Blbih7IHVybCwgLi4ub3B0cyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93Lm9wZW4odXJsLCBvcHRzPy53aW5kb3dOYW1lKTtcbiAgICB9XG4gIH1cblxuICBnZXREb3dubG9hZGluZ0pvYih1cmk6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rvd25sb2FkaW5nSm9icy5nZXQodXJpKTtcbiAgfVxuXG4gIGRvd25sb2FkKHJlcXVlc3Q6IHsgdXJpOiBzdHJpbmc7IGZpbGVuYW1lPzogc3RyaW5nIH0gJiBQYXJ0aWFsPERvd25sb2FkUmVxdWVzdD4pOiBPYnNlcnZhYmxlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghcmVxdWVzdCB8fCAhcmVxdWVzdC51cmkpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgYXJndW1lbnQgJ3JlcXVlc3QnIG9yICdyZXF1ZXN0LnVyaSdcIik7XG5cbiAgICBpZiAodGhpcy5jYW5Eb3dubG9hZCkge1xuICAgICAgLy8gQ2hlY2sgaWYgbm90IGFscmVhZHkgZG93bmxvYWRpbmcgZmlsZVxuICAgICAgbGV0IGpvYiQgPSB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZ2V0KHJlcXVlc3QudXJpKTtcbiAgICAgIGlmIChqb2IkKSByZXR1cm4gam9iJDtcblxuICAgICAgLy8gQ29tcHV0ZSBzdWJQYXRoIChmaW5hbCBmaWxlbmFtZSlcbiAgICAgIGxldCBzdWJQYXRoID1cbiAgICAgICAgcmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxQdWJsaWNEaXI/LnN1YlBhdGggfHxcbiAgICAgICAgcmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0Rpcj8uc3ViUGF0aCB8fFxuICAgICAgICByZXF1ZXN0LmZpbGVuYW1lIHx8XG4gICAgICAgIFVyaVV0aWxzLmdldEZpbGVuYW1lKHJlcXVlc3QudXJpKSB8fFxuICAgICAgICByZXF1ZXN0LnRpdGxlIHx8XG4gICAgICAgICdkb3dubG9hZCc7XG5cbiAgICAgIHN1YlBhdGggPSBzdWJQYXRoXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC8vIFJlbW92ZSBzcGFjZXNcbiAgICAgICAgLnJlcGxhY2UoL1xccysvZywgJy0nKTtcblxuICAgICAgLy8gRm9yY2UgQVBLIHRvIGZpbmlzaCB3aXRoICcuYXBrJ1xuICAgICAgaWYgKHJlcXVlc3QubWltZVR5cGUgPT09IE1pbWVUeXBlcy5BTkRST0lEX0FQSyAmJiAhc3ViUGF0aC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcuYXBrJykpIHtcbiAgICAgICAgc3ViUGF0aCArPSAnLmFwayc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRvd25sb2FkUmVxdWVzdCA9IDxEb3dubG9hZFJlcXVlc3Q+e1xuICAgICAgICB2aXNpYmxlSW5Eb3dubG9hZHNVaTogdHJ1ZSxcbiAgICAgICAgbm90aWZpY2F0aW9uVmlzaWJpbGl0eTogTm90aWZpY2F0aW9uVmlzaWJpbGl0eS5WaXNpYmxlTm90aWZ5Q29tcGxldGVkLFxuICAgICAgICAuLi5yZXF1ZXN0LFxuICAgICAgICBmaWxlbmFtZTogdW5kZWZpbmVkLCAvLyBGb3JjZSB1bnNldFxuICAgICAgICBkZXN0aW5hdGlvbkluRXh0ZXJuYWxQdWJsaWNEaXI6ICFyZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbEZpbGVzRGlyXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGRpclR5cGU6IEFuZHJvaWRPc0Vudmlyb25tZW50LkRJUkVDVE9SWV9ET1dOTE9BRFMsXG4gICAgICAgICAgICAgIC4uLnJlcXVlc3QuZGVzdGluYXRpb25JbkV4dGVybmFsUHVibGljRGlyLFxuICAgICAgICAgICAgICBzdWJQYXRoLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBkZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0RpcjogcmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0RpclxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkaXJUeXBlOiBBbmRyb2lkT3NFbnZpcm9ubWVudC5ESVJFQ1RPUllfRE9XTkxPQURTLFxuICAgICAgICAgICAgICAuLi5yZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbEZpbGVzRGlyLFxuICAgICAgICAgICAgICBzdWJQYXRoLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgLy8gU3RhcnQgZG93bmxvYWRcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gRG93bmxvYWRpbmcsIHVzaW5nIHJlcXVlc3Q6ICcgKyBKU09OLnN0cmluZ2lmeShkb3dubG9hZFJlcXVlc3QpKTtcbiAgICAgIGpvYiQgPSBmcm9tKHRoaXMuZG93bmxvYWRlci5kb3dubG9hZChkb3dubG9hZFJlcXVlc3QpKTtcblxuICAgICAgLy8gUmVtZW1iZXIgdGhpcyByZXF1ZXN0IHVyaVxuICAgICAgdGhpcy5fZG93bmxvYWRpbmdKb2JzLnNldChkb3dubG9hZFJlcXVlc3QudXJpLCBqb2IkKTtcbiAgICAgIHJldHVybiBqb2IkLnBpcGUoXG4gICAgICAgIHRhcCgobG9jYXRpb24pID0+IHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gRmlsZSBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCBhdDonICsgbG9jYXRpb24pO1xuICAgICAgICAgIC8vIEZvcmdldCBqb2JcbiAgICAgICAgICB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZGVsZXRlKGRvd25sb2FkUmVxdWVzdC51cmkpO1xuICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gVW5hYmxlIHRvIGRvd25sb2FkOiAnICsgKChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8IGVycikpO1xuICAgICAgICAgIC8vIEZvcmdldCB0aGUgcmVxdWVzdFxuICAgICAgICAgIHRoaXMuX2Rvd25sb2FkaW5nSm9icy5kZWxldGUoZG93bmxvYWRSZXF1ZXN0LnVyaSk7XG5cbiAgICAgICAgICAvLyBSZXRyeSB3aXRoIGFub3RoZXIgbG9jYXRpb24gLSBpc3N1ZSBpbiBvbGRlciBBbmRyb2lkIHZlcnNpb25cbiAgICAgICAgICBpZiAoZG93bmxvYWRSZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0Rpcj8uZGlyVHlwZSA9PT0gQW5kcm9pZE9zRW52aXJvbm1lbnQuRElSRUNUT1JZX0RPV05MT0FEUykge1xuICAgICAgICAgICAgZG93bmxvYWRSZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0Rpci5kaXJUeXBlID0gQW5kcm9pZE9zRW52aXJvbm1lbnQuRElSRUNUT1JZX0RPV05MT0FEU19PTEQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZChkb3dubG9hZFJlcXVlc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIChpZiBub3QgQW5kcm9pZCBhbmQgQ2FwYWNpdG9yKTogb3BlbmluZyB0aGUgVVJJXG4gICAgLy8gVE9ETzogZmluZCBhIHdheSB0byBkb3dubG9hZCB1bmRlciBpT1MgKHNlZSBodHRwczovL3d3dy5jLXNoYXJwY29ybmVyLmNvbS9hcnRpY2xlL2hvdy10by1kb3dubG9hZC1hLWZpbGUtdXNpbmctZmlsZS10cmFuc2Zlci1wbHVnaW4taW4taW9uaWMtMy8pXG4gICAgZWxzZSB7XG4gICAgICBGaWxlc1V0aWxzLmRvd25sb2FkVXJpKHJlcXVlc3QudXJpLCByZXF1ZXN0LmZpbGVuYW1lKTtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNvcHlUb0NsaXBib2FyZChkYXRhOiBzdHJpbmcgfCBXcml0ZU9wdGlvbnMsIG9wdHM/OiBTaG93VG9hc3RPcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgPyBkYXRhIDogZGF0YS5zdHJpbmc7XG4gICAgbGV0IGNvcGllZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuaXNBbmRyb2lkQ29yZG92YSgpKSB7XG4gICAgICBjb25zdCB3cml0ZU9wdGlvbnMgPSB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgPyB7IHN0cmluZzogdmFsdWUgfSA6IGRhdGE7XG4gICAgICBhd2FpdCBDbGlwYm9hcmQud3JpdGUod3JpdGVPcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29waWVkID0gdGhpcy5jZGtDbGlwYm9hcmQuY29weSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGNvcGllZCkge1xuICAgICAgLy8gU2hvdyB0b2FzdFxuICAgICAgaWYgKG9wdHMgJiYgaXNOb3ROaWxPckJsYW5rKG9wdHMubWVzc2FnZSkpIHtcbiAgICAgICAgYXdhaXQgVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCB7XG4gICAgICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIFVuYWJsZSB0byBjb3B5IHRvIGNsaXBib2FyZDogJyArIGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZURhcmtUaGVtZShlbmFibGU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB3YXNFbmFibGVkID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGFyaycpO1xuICAgIGlmIChlbmFibGUgIT09IHdhc0VuYWJsZWQpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFtwbGF0Zm9ybV0gJHtlbmFibGUgPyAnRW5hYmxlJyA6ICdEaXNhYmxlJ30gZGFyayBtb2RlLi4uYCk7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnZGFyaycsIGVuYWJsZSk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlSGlnaENvbnRyYXN0KGVuYWJsZTogYm9vbGVhbikge1xuICAgIGlmIChlbmFibGUgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZ2gtY29udHJhc3QnKSkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW3BsYXRmb3JtXSBFbmFibGUgaGlnaCBjb250cmFzdC4uLicpO1xuICAgIH1cbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlnaC1jb250cmFzdCcsIGVuYWJsZSk7XG4gIH1cblxuICBzaG93VG9hc3Qob3B0czogU2hvd1RvYXN0T3B0aW9ucyk6IFByb21pc2U8SFRNTElvblRvYXN0RWxlbWVudD4ge1xuICAgIGlmICghdGhpcy50b2FzdENvbnRyb2xsZXIpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgdG9hc3RDb250cm9sbGVyIGluIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yXCIpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgIFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBvbldpbGxQcmVzZW50OiAodCkgPT4gcmVzb2x2ZSh0KSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGNsb3NlVG9hc3QoaWQ/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50b2FzdENvbnRyb2xsZXI/LmRpc21pc3MobnVsbCwgbnVsbCwgaWQpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgYXN5bmMgY29uZmlndXJlVGhlbWUobW9iaWxlOiBib29sZWFuLCB3aW46IGFueSA9IHdpbmRvdykge1xuICAgIC8vIExpc3RlbiBmb3IgY2hhbmdlcyB0byBzZXR0aW5ncyBkYXJrIG1vZGVcbiAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5hbGxvd0RhcmtNb2RlKSB7XG4gICAgICBjb25zdCBpc1NjcmVlbiQgPSBuZXcgT2JzZXJ2YWJsZTxib29sZWFuPigob2JzZXJ2ZXIpID0+IHtcbiAgICAgICAgY29uc3QgbWF0Y2hNZWRpYSA9IHdpbi5tYXRjaE1lZGlhKCdzY3JlZW4nKTtcbiAgICAgICAgbWF0Y2hNZWRpYS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4gb2JzZXJ2ZXIubmV4dChlLm1hdGNoZXMpKTtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChtYXRjaE1lZGlhLm1hdGNoZXMpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgICBjb21iaW5lTGF0ZXN0KFtpc1NjcmVlbiQsIHRoaXMuc2V0dGluZ3MuZGFya01vZGUkXSkuc3Vic2NyaWJlKChbaXNTY3JlZW4sIGVuYWJsZV0pID0+IHRoaXMudG9nZ2xlRGFya1RoZW1lKGlzU2NyZWVuICYmIGVuYWJsZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFdvcmthcm91bmQsIGZvciBNUyBXaW5kb3dzIHRvdWNoIHNjcmVlbiAoZGV0ZWN0ZWQgYXMgbW9iaWxlLCBidXQgZm9yY2VkIGFzIGRlc2t0b3ApXG4gICAgaWYgKFxuICAgICAgIW1vYmlsZSAmJlxuICAgICAgKHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygncGx0LW1vYmlsZScpIHx8IHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0Py5jb250YWlucygncGx0LW1vYmlsZXdlYicpKVxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIEZvcmNlIGNsYXNzIGxpc3QgdG86IDxodG1sIGNsYXNzPVwicGx0LWRlc2t0b3BcIj4uIFdvcmthcm91bmQgZm9yIFdpbmRvd3MgdG91Y2ggc2NyZWVuLicpO1xuICAgICAgd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdwbHQtbW9iaWxlJywgJ3BsdC1tb2JpbGV3ZWInKTtcbiAgICAgIHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncGx0LWRlc2t0b3AnKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY29uZmlndXJlQ2FwYWNpdG9yUGx1Z2lucygpIHtcbiAgICBpZiAoIXRoaXMuX2NhcGFjaXRvcikgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gQ29uZmlndXJpbmcgQ2FwYWNpdG9yIHBsdWdpbnMuLi4nKTtcblxuICAgIGxldCBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHBsdWdpbk5hbWUgPSBDYXBhY2l0b3JQbHVnaW5zLlN0YXR1c0JhcjtcbiAgICAgIGlmICh0aGlzLmlzQXBwKCkgJiYgdGhpcy5pc0FuZHJvaWQoKSkge1xuICAgICAgICBhd2FpdCBTdGF0dXNCYXIuc2V0T3ZlcmxheXNXZWJWaWV3KHsgb3ZlcmxheTogZmFsc2UgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhpZGUgYWNjZXNzb3J5IGJhciAoaU9TIG9ubHkpXG4gICAgICBpZiAodGhpcy5pc0FwcCgpICYmIHRoaXMuaXNJT1MoKSkge1xuICAgICAgICBwbHVnaW5OYW1lID0gQ2FwYWNpdG9yUGx1Z2lucy5LZXlib2FyZDtcbiAgICAgICAgYXdhaXQgS2V5Ym9hcmQuc2V0QWNjZXNzb3J5QmFyVmlzaWJsZSh7IGlzVmlzaWJsZTogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBsb2dNZXNzYWdlID0gYEVycm9yIHdoaWxlIGNvbmZpZ3VyaW5nICR7cGx1Z2luTmFtZX0gcGx1Z2luOiAke2Vyci5tZXNzYWdlIHx8IGVycn1cXG4ke2Vycj8ub3JpZ2luYWxTdGFjayB8fCBKU09OLnN0cmluZ2lmeShlcnIpfWA7XG4gICAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dICcgKyBsb2dNZXNzYWdlKTtcbiAgICAgIHRoaXMuX2xvZ2dlcj8uZXJyb3IoJ2NvbmZpZ3VyZUNhcGFjaXRvclBsdWdpbnMnLCBsb2dNZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlVHJhbnNsYXRlKCkge1xuICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBDb25maWd1cmluZyBpMThuIC4uLicpO1xuXG4gICAgLy8gdGhpcyBsYW5ndWFnZSB3aWxsIGJlIHVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIGEgdHJhbnNsYXRpb24gaXNuJ3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICB0aGlzLnRyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZyh0aGlzLmVudmlyb25tZW50LmRlZmF1bHRMb2NhbGUpO1xuICAgIC8vIGFwcGx5IGxvY2FsZSBpbW1lZGlhdGVseVxuICAgIHRoaXMuYXBwbHlMb2NhbGUodGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0TG9jYWxlKTtcblxuICAgIC8vIFdoZW4gbG9jYWxlIGNoYW5nZXMsIGFwcGx5IHRvIGRhdGUgYWRhcHRlclxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQubGFuZykge1xuICAgICAgICAgIHRoaXMuYXBwbHlMb2NhbGUoZXZlbnQubGFuZyk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLnNldHRpbmdzLm9uQ2hhbmdlLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIC8vIEFwcGx5IGxvY2FsZVxuICAgICAgICAgIGlmIChkYXRhLmxvY2FsZSkge1xuICAgICAgICAgICAgaWYgKGRhdGEubG9jYWxlICE9PSB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZykge1xuICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS51c2UoZGF0YS5sb2NhbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBcHBseWluZyBkZWZhdWx0LCB3aGVuIHNldHRpbmdzIGhhcyBubyBsb2NhbGUgcHJvcGVydHkgKGhvdGZpeCAtIGx1ZG92aWMucGVjcXVvdEBlLWlzLnBybyAtIDE0LzExLzIwMjEgLSBzaW5jZSB2MS4yMC40MilcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW3BsYXRmb3JtXSBObyBsb2NhbGUgZm91bmQgaW4gc2V0dGluZ3M6IGFwcGx5aW5nIGRlZmF1bHRMb2NhbGU6ICcsIHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZSk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS51c2UodGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0TG9jYWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFVzZSBhY2NvdW50J3Mgc2V0dGluZ3MsIChsaWtlIGxvY2FsZSksIHdoZW4gYWNjb3VudCBpbmhlcml0YW5jZSBlbmFibGVkXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dpbi5zdWJzY3JpYmUoYXN5bmMgKGFjY291bnQpID0+IHtcbiAgICAgICAgaWYgKGFjY291bnQuc2V0dGluZ3MgJiYgdGhpcy5zZXR0aW5ncy5zZXR0aW5ncy5hY2NvdW50SW5oZXJpdGFuY2UpIHtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIENvcHlpbmcgYWNjb3VudCBzZXR0aW5ncyBpbnRvIGxvY2FsIHNldHRpbmdzLi4uJyk7XG4gICAgICAgICAgY29uc3QgYWNjb3VudFNldHRpbmdzID0gYWNjb3VudC5zZXR0aW5ncy5hc0xvY2FsU2V0dGluZ3MoKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldHRpbmdzLmFwcGx5KGFjY291bnRTZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhcHBseUxvY2FsZShsb2NhbGU6IHN0cmluZykge1xuICAgIC8vIGZvcmNlICdlbicgYXMgJ2VuX0dCJ1xuICAgIGlmIChsb2NhbGUgPT09ICdlbicpIHtcbiAgICAgIGxvY2FsZSA9ICdlbl9HQic7XG4gICAgfVxuXG4gICAgLy8gY29uZmlnIG1vbWVudCBsaWJcbiAgICB0cnkge1xuICAgICAgbW9tZW50TG9jYWxlKGxvY2FsZSk7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIFVzZSBsb2NhbGUgeycgKyBsb2NhbGUgKyAnfScpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gSWYgZXJyb3IsIGZhbGxiYWNrIHRvIGVuXG4gICAgICBtb21lbnRMb2NhbGUoJ2VuJyk7XG4gICAgICBjb25zb2xlLndhcm4oJ1twbGF0Zm9ybV0gVW5rbm93biBsb2NhbGUgZm9yIG1vbWVudCBsaWIuIFVzaW5nIGRlZmF1bHQgW2VuXScpO1xuICAgIH1cblxuICAgIC8vIENvbmZpZyBkYXRlIGFkYXB0ZXJcbiAgICB0aGlzLmRhdGVBZGFwdGVyLnNldExvY2FsZShtb21lbnRMb2NhbGUoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlQ2FjaGUob25saW5lPzogYm9vbGVhbikge1xuICAgIG9ubGluZSA9IHRvQm9vbGVhbihvbmxpbmUsIHRoaXMuY2FjaGUuaXNPbmxpbmUoKSk7XG4gICAgY29uc3QgY2FjaGVUVEwgPSBvbmxpbmUgPyAzNjAwIC8qIDFoICovIDogMzYwMCAqIDI0ICogMzA7IC8qIDEgbW9udGggKi9cbiAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gQ29uZmlndXJpbmcgY2FjaGUgW09LXSB7b25saW5lOiAke29ubGluZX0sIHRpbWVUb0xpdmU6ICR7Y2FjaGVUVEwgLyAzNjAwfWgsIG9mZmxpbmVJbnZhbGlkYXRlOiBmYWxzZX1gKTtcbiAgICB0aGlzLmNhY2hlLnNldERlZmF1bHRUVEwoY2FjaGVUVEwpO1xuICAgIHRoaXMuY2FjaGUuc2V0T2ZmbGluZUludmFsaWRhdGUoZmFsc2UpOyAvLyBEbyBub3QgaW52YWxpZGF0ZSBjYWNoZSB3aGVuIG9mZmxpbmVcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjaGVja0FwcFZlcnNpb24ob3B0cz86IHsgY2FuUmVsb2FkPzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMubmV0d29ya1NlcnZpY2Uub2ZmbGluZSB8fCAhdGhpcy5pc1dlYigpKSByZXR1cm47IC8vIFNraXBcblxuICAgIGNvbnN0IHNpbGVudCA9IG9wdHM/LnNpbGVudCA9PT0gdHJ1ZTtcbiAgICBjb25zdCBwcm9kdWN0aW9uID0gdGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICAgIGNvbnN0IGNhbkF1dG9SZWxvYWQgPSAhb3B0cyB8fCBvcHRzLmNhblJlbG9hZCAhPT0gZmFsc2U7XG5cbiAgICBpZiAoIXNpbGVudCkgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENoZWNraW5nIHJlbW90ZSBhcHAgdmVyc2lvbi4uLicpO1xuXG4gICAgY29uc3QgYWN0dWFsVmVyc2lvbiA9IHRoaXMuZW52aXJvbm1lbnQudmVyc2lvbjtcbiAgICBpZiAoaXNOaWxPckJsYW5rKGFjdHVhbFZlcnNpb24pKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiW3BsYXRmb3JtXSBNaXNzaW5nIHJlcXVpcmVkIHZhbHVlIGZvciAnZW52aXJvbm1lbnQudmVyc2lvbicuIENhbm5vdCBjaGVjayByZW1vdGUgYXBwIHZlcnNpb24uXCIpO1xuICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb25UaW1lcj8udW5zdWJzY3JpYmUoKTsgLy8gU3RvcCB0aW1lciBpZiBleGlzdHNcbiAgICAgIHJldHVybjsgLy8gU2tpcFxuICAgIH1cblxuICAgIGNvbnN0IHJlbW90ZVZlcnNpb24gPSBhd2FpdCB0aGlzLm5ldHdvcmtTZXJ2aWNlLmdldEFwcFZlcnNpb24oKTtcbiAgICBpZiAoaXNOaWxPckJsYW5rKHJlbW90ZVZlcnNpb24pKSB7XG4gICAgICBpZiAocHJvZHVjdGlvbiAmJiAhc2lsZW50KSBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIENhbm5vdCBsb2FkIHJlbW90ZSBhcHAgdmVyc2lvbi4gU2tpcHBpbmcgdmVyc2lvbiBjaGVjaycpO1xuICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb25UaW1lcj8udW5zdWJzY3JpYmUoKTsgLy8gU3RvcCB0aW1lciBpZiBleGlzdHNcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoVmVyc2lvblV0aWxzLmlzQ29tcGF0aWJsZShyZW1vdGVWZXJzaW9uLCBhY3R1YWxWZXJzaW9uKSkge1xuICAgICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBDaGVja2luZyByZW1vdGUgYXBwIHZlcnNpb24gW09LXSB7cmVtb3RlOiAnJHtyZW1vdGVWZXJzaW9ufScsIGFjdHVhbDogJyR7YWN0dWFsVmVyc2lvbn0nfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIG5ld2VyIHZlcnNpb24gZXhpc3RzXG4gICAgbGV0IHJlbG9hZFBhdGggPSBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1smP112ZXJzaW9uPVteJl0qL2dpLCAnJyk7IC8vIFJlbW92ZSBvbGQgdmVyc2lvbiBpbiBxdWVyeSBwYXJhbXNcbiAgICByZWxvYWRQYXRoICs9IHJlbG9hZFBhdGguaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJzsgLy8gQWRkIHF1ZXJ5IHBhcmFtIHNlcGFyYXRvclxuICAgIHJlbG9hZFBhdGggKz0gJ3ZlcnNpb249JyArIHJlbW90ZVZlcnNpb247IC8vIEFkZCB2ZXJzaW9uICh0byBhdm9pZCBhIHJlbG9hZCBpbmZpbml0ZSBsb29wKVxuXG4gICAgLy8gQWxyZWFkeSB0cnkgdG8gcmVsb2FkLCBidXQgdmVyc2lvbiBzdGlsbCBiYWRcbiAgICBpZiAocmVsb2FkUGF0aCA9PT0gbG9jYXRpb24uaHJlZikge1xuICAgICAgaWYgKGNhbkF1dG9SZWxvYWQpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFtwbGF0Zm9ybV0gUmVsb2FkZWQgcGFnZSBmYWlsZWQsIGJlY2F1c2UgdmVyc2lvbiBzdGlsbCBtaXNtYXRjaCEgUGxlYXNlIGNoZWNrIHZlcnNpb24uYXBwdXAgZmlsZSAoZXhwZWN0ZWQgYXBwIHZlcnNpb246ICR7YWN0dWFsVmVyc2lvbn0pYFxuICAgICAgICApO1xuICAgICAgLy8gU3RvcCB0aW1lciwgdG8gYXZvaWQgaW5maW5pdGUgbG9vcFxuICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb25UaW1lcj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLndhcm4oYFtwbGF0Zm9ybV0gTW9yZSByZWNlbnQgdmVyc2lvbiBkZXRlY3RlZCAocmVtb3RlOiAke3JlbW90ZVZlcnNpb259LCBhY3R1YWw6ICR7YWN0dWFsVmVyc2lvbn1gKTtcblxuICAgIC8vIEF1dG8gcmVsb2FkXG4gICAgaWYgKGNhbkF1dG9SZWxvYWQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBXaWxsIHJlbG9hZGluZyBhdCAnICsgcmVsb2FkUGF0aCk7XG4gICAgICBsb2NhdGlvbi5ocmVmID0gcmVsb2FkUGF0aDtcbiAgICAgIC8vIEFwcCBzdG9wXG4gICAgfVxuICAgIC8vIEFzayB1c2VyIHRvIHJlbG9hZFxuICAgIGVsc2Uge1xuICAgICAgLy8gU3RvcCB0aW1lciwgdG8gYXZvaWQgaW5maW5pdGUgbG9vcFxuICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb25UaW1lcj8udW5zdWJzY3JpYmUoKTtcblxuICAgICAgLy8gRGlzcGxheSBhIHJlbG9hZCB0b2FzdFxuICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3Qoe1xuICAgICAgICBtZXNzYWdlOiAnQ09ORklSTS5SRUxPQURfQVBQJyxcbiAgICAgICAgbWVzc2FnZVBhcmFtczogeyB2ZXJzaW9uOiByZW1vdGVWZXJzaW9uLCBuYW1lOiB0aGlzLmVudmlyb25tZW50Lm5hbWUgfSxcbiAgICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgICBkdXJhdGlvbjogLTEsXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIC8vIFJlbG9hZCBidXR0b25cbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdDT01NT04uQlROX1VQREFURScpLFxuICAgICAgICAgICAgc2lkZTogJ2VuZCcsXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSByZWxvYWRQYXRoO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBvblN0YXJ0dXBFcnJvcihlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIEZhaWxlZCBzdGFydGluZyB0aGUgcGxhdGZvcm0hICcgKyBKU09OLnN0cmluZ2lmeShlcnIpKTtcbiAgICBsZXQgbWVzc2FnZSA9IChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8IGVycjtcbiAgICBjb25zdCBkZXRhaWxzTWVzc2FnZSA9IGVyciAmJiAoKGVyci5kZXRhaWxzICYmIGVyci5kZXRhaWxzLm1lc3NhZ2UpIHx8IGVyci5kZXRhaWxzKTtcbiAgICAvLyBTZXQgc3BlY2lmaWMgZXJyb3Igd2hlbiBGaXJlZm94IGlzIGluIHByaXZhdGUgbW9kZSBvciBoaXN0b3J5IG5ldmVyIHJlbWVtYmVyZWQgKHNlZSBNYW50aXMgSWZyZW1lciAjNTY0NDEpXG4gICAgaWYgKGVyci5jb2RlID09PSAxMSAmJiB0aGlzLmNka1BsYXRmb3JtLkZJUkVGT1gpIHtcbiAgICAgIG1lc3NhZ2UgPSAnRVJST1IuRklSRUZPWF9OT19TVE9SQUdFJztcbiAgICB9XG4gICAgaWYgKHRoaXMudHJhbnNsYXRlKSB7XG4gICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy50cmFuc2xhdGUuaW5zdGFudChtZXNzYWdlKTtcbiAgICAgIGlmIChlcnIgJiYgZXJyLmNvZGUpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgIHtjb2RlOiAke2Vyci5jb2RlfX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXNzYWdlID0gYEZhdGFsIGVycm9yOiBQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IuXFxuXFxue2NvZGU6ICR7KGVyciAmJiBlcnIuY29kZSkgfHwgJ251bGwnfSwgbWVzc2FnZTogXCIke21lc3NhZ2V9XCJ9YDtcbiAgICB9XG4gICAgaWYgKHRoaXMudG9hc3RDb250cm9sbGVyKSB7XG4gICAgICBpZiAoZGV0YWlsc01lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgPGJyLz48c21hbGw+JHtkZXRhaWxzTWVzc2FnZX08L3NtYWxsPmA7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgIGR1cmF0aW9uOiAtMSxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh3aW5kb3cpIHtcbiAgICAgIGlmIChkZXRhaWxzTWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlICs9IGBcXG5cXG57Y2F1c2U6IFwiJHtkZXRhaWxzTWVzc2FnZX1cIn1gO1xuICAgICAgfVxuICAgICAgd2luZG93LmFsZXJ0KG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgaWYgKGVyciAmJiBlcnIuZGV0YWlscykgY29uc29sZS5lcnJvcignY2F1c2UnLCBlcnIuZGV0YWlscyk7XG4gICAgfVxuICB9XG59XG4iXX0=