@bravobit/bb-foundation 0.26.2 → 0.27.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 (493) hide show
  1. package/auth/lib/directives/authenticated.directive.d.ts +1 -1
  2. package/collections/lib/components/collections-pager/collections-pager.component.d.ts +1 -1
  3. package/collections/lib/components/collections-viewer/collections-viewer.component.d.ts +1 -1
  4. package/controls/lib/checkbox/checkbox/checkbox.component.d.ts +1 -1
  5. package/controls/lib/checkbox/checkbox-group/checkbox-group.component.d.ts +1 -1
  6. package/controls/lib/control-error/control-error/control-error.component.d.ts +1 -1
  7. package/controls/lib/form-control/form-control/form-control.component.d.ts +1 -1
  8. package/controls/lib/form-control/form-control-addon/form-control-addon.component.d.ts +1 -1
  9. package/controls/lib/form-control/form-control-input.directive.d.ts +1 -1
  10. package/controls/lib/radio/radio-button/radio-button.component.d.ts +1 -1
  11. package/controls/lib/radio/radio-group/radio-group.component.d.ts +1 -1
  12. package/controls/lib/toggle/toggle/toggle.component.d.ts +1 -1
  13. package/controls/lib/toggle/toggle-group/toggle-group.component.d.ts +1 -1
  14. package/dashboard/lib/dashboard/dashboard.component.d.ts +1 -1
  15. package/dashboard/lib/dashboard-menu/dashboard-menu.component.d.ts +1 -1
  16. package/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.d.ts +1 -1
  17. package/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.d.ts +1 -1
  18. package/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.d.ts +1 -1
  19. package/dialog/lib/dialog-modal/dialog-modal.component.d.ts +1 -1
  20. package/elements/lib/avatar/avatar.component.d.ts +1 -1
  21. package/elements/lib/button/button.component.d.ts +2 -2
  22. package/elements/lib/checkbox/checkbox.component.d.ts +1 -1
  23. package/elements/lib/date-picker/date-picker.component.d.ts +1 -1
  24. package/elements/lib/directives/input.directive.d.ts +2 -2
  25. package/elements/lib/dropdown/dropdown.component.d.ts +1 -1
  26. package/elements/lib/file-picker/file-picker.component.d.ts +2 -2
  27. package/elements/lib/form-control/form-control.component.d.ts +1 -1
  28. package/elements/lib/form-error/form-error.component.d.ts +1 -1
  29. package/elements/lib/form-group/form-group.component.d.ts +1 -1
  30. package/elements/lib/icon/icon.component.d.ts +1 -1
  31. package/elements/lib/image-picker/image-picker.component.d.ts +1 -1
  32. package/elements/lib/spinner/spinner.component.d.ts +1 -1
  33. package/esm2022/auth/lib/auth.interceptor.mjs +91 -0
  34. package/esm2022/auth/lib/auth.module.mjs +36 -0
  35. package/esm2022/auth/lib/auth.service.mjs +271 -0
  36. package/esm2022/auth/lib/directives/authenticated.directive.mjs +43 -0
  37. package/esm2022/auth/lib/guards/anonymous.guard.mjs +54 -0
  38. package/esm2022/auth/lib/guards/authenticated.guard.mjs +57 -0
  39. package/esm2022/collections/lib/collections.module.mjs +55 -0
  40. package/esm2022/collections/lib/components/collections-pager/collections-pager.component.mjs +124 -0
  41. package/esm2022/collections/lib/components/collections-viewer/collections-viewer.component.mjs +32 -0
  42. package/esm2022/collections/lib/components/collections.directive.mjs +47 -0
  43. package/esm2022/controls/lib/checkbox/checkbox/checkbox.component.mjs +179 -0
  44. package/esm2022/controls/lib/checkbox/checkbox-group/checkbox-group.component.mjs +69 -0
  45. package/esm2022/controls/lib/checkbox/checkbox.module.mjs +21 -0
  46. package/esm2022/controls/lib/control-error/control-error/control-error.component.mjs +64 -0
  47. package/esm2022/controls/lib/control-error/control-error-submit.directive.mjs +48 -0
  48. package/esm2022/controls/lib/control-error/control-error.module.mjs +20 -0
  49. package/esm2022/controls/lib/controls.module.mjs +63 -0
  50. package/esm2022/controls/lib/form-control/form-control/form-control.component.mjs +80 -0
  51. package/esm2022/controls/lib/form-control/form-control-addon/form-control-addon.component.mjs +23 -0
  52. package/esm2022/controls/lib/form-control/form-control-input.directive.mjs +125 -0
  53. package/esm2022/controls/lib/form-control/form-control.module.mjs +35 -0
  54. package/esm2022/controls/lib/radio/radio-button/radio-button.component.mjs +76 -0
  55. package/esm2022/controls/lib/radio/radio-group/radio-group.component.mjs +169 -0
  56. package/esm2022/controls/lib/radio/radio.module.mjs +22 -0
  57. package/esm2022/controls/lib/toggle/toggle/toggle.component.mjs +154 -0
  58. package/esm2022/controls/lib/toggle/toggle-group/toggle-group.component.mjs +63 -0
  59. package/esm2022/controls/lib/toggle/toggle.module.mjs +21 -0
  60. package/esm2022/dashboard/lib/dashboard/dashboard.component.mjs +58 -0
  61. package/{esm2020 → esm2022}/dashboard/lib/dashboard-header/dashboard-header.component.mjs +6 -5
  62. package/esm2022/dashboard/lib/dashboard-menu/dashboard-menu.component.mjs +32 -0
  63. package/esm2022/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.mjs +30 -0
  64. package/esm2022/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.mjs +76 -0
  65. package/esm2022/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.mjs +100 -0
  66. package/esm2022/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.mjs +63 -0
  67. package/esm2022/dashboard/lib/dashboard.module.mjs +48 -0
  68. package/esm2022/dialog/lib/dialog-actions/dialog-actions.component.mjs +13 -0
  69. package/esm2022/dialog/lib/dialog-confirm/dialog-confirm.component.mjs +47 -0
  70. package/esm2022/dialog/lib/dialog-container/dialog-container.component.mjs +78 -0
  71. package/esm2022/dialog/lib/dialog-header/dialog-header.component.mjs +19 -0
  72. package/esm2022/dialog/lib/dialog-link/dialog-link.component.mjs +12 -0
  73. package/esm2022/dialog/lib/dialog-modal/dialog-modal.component.mjs +68 -0
  74. package/esm2022/dialog/lib/dialog-overlay/dialog-overlay.component.mjs +80 -0
  75. package/esm2022/dialog/lib/dialog.insertion.mjs +17 -0
  76. package/esm2022/dialog/lib/dialog.module.mjs +69 -0
  77. package/esm2022/dialog/lib/dialog.service.mjs +69 -0
  78. package/esm2022/elements/lib/avatar/avatar.component.mjs +150 -0
  79. package/esm2022/elements/lib/button/button.component.mjs +63 -0
  80. package/esm2022/elements/lib/checkbox/checkbox.component.mjs +74 -0
  81. package/esm2022/elements/lib/date-picker/date-picker.component.mjs +308 -0
  82. package/esm2022/elements/lib/directives/addon.directive.mjs +31 -0
  83. package/esm2022/elements/lib/directives/form-submit.directive.mjs +51 -0
  84. package/esm2022/elements/lib/directives/form-submitter.directive.mjs +26 -0
  85. package/esm2022/elements/lib/directives/input.directive.mjs +138 -0
  86. package/esm2022/elements/lib/dropdown/dropdown.component.mjs +102 -0
  87. package/esm2022/elements/lib/elements.module.mjs +178 -0
  88. package/esm2022/elements/lib/file-picker/file-picker.component.mjs +237 -0
  89. package/esm2022/elements/lib/form-control/form-control.component.mjs +50 -0
  90. package/esm2022/elements/lib/form-error/form-error.component.mjs +124 -0
  91. package/esm2022/elements/lib/form-group/form-group.component.mjs +19 -0
  92. package/esm2022/elements/lib/icon/icon.component.mjs +103 -0
  93. package/esm2022/elements/lib/image-picker/image-picker.component.mjs +107 -0
  94. package/esm2022/elements/lib/pipes/file-image.pipe.mjs +44 -0
  95. package/esm2022/elements/lib/pipes/file-size.pipe.mjs +29 -0
  96. package/esm2022/elements/lib/pipes/relative-time.pipe.mjs +97 -0
  97. package/esm2022/elements/lib/spinner/spinner.component.mjs +26 -0
  98. package/esm2022/elements/lib/tag/tag.component.mjs +19 -0
  99. package/esm2022/http/lib/http.module.mjs +44 -0
  100. package/esm2022/http/lib/interceptors/base-url.interceptor.mjs +51 -0
  101. package/esm2022/http/lib/interceptors/error.interceptor.mjs +33 -0
  102. package/esm2022/lib/core/services/clipboard.service.mjs +71 -0
  103. package/esm2022/lib/core/services/exif.service.mjs +164 -0
  104. package/esm2022/lib/core/services/file-loader.service.mjs +88 -0
  105. package/esm2022/lib/core/services/image-converter.service.mjs +124 -0
  106. package/esm2022/lib/core/services/languages.service.mjs +75 -0
  107. package/esm2022/lib/core/services/network.service.mjs +56 -0
  108. package/esm2022/lib/core/services/patch.service.mjs +64 -0
  109. package/esm2022/localize/lib/localize.module.mjs +82 -0
  110. package/esm2022/localize/lib/localize.pipe.mjs +47 -0
  111. package/esm2022/localize/lib/localize.service.mjs +186 -0
  112. package/{esm2020 → esm2022}/localize/lib/transforms/interpolate.transform.mjs +1 -1
  113. package/{esm2020 → esm2022}/localize/lib/transforms/reference.transform.mjs +1 -1
  114. package/esm2022/localize/lib/views/localize-string/localize-string.component.mjs +89 -0
  115. package/esm2022/localize/lib/views/localize-template.directive.mjs +22 -0
  116. package/esm2022/masking/lib/directives/currency-mask.directive.mjs +36 -0
  117. package/esm2022/masking/lib/directives/date-mask.directive.mjs +36 -0
  118. package/esm2022/masking/lib/directives/input-mask.directive.mjs +119 -0
  119. package/esm2022/masking/lib/masking.module.mjs +31 -0
  120. package/esm2022/masking/lib/masking.service.mjs +104 -0
  121. package/esm2022/notifications/lib/notifications-item/notifications-item.component.mjs +101 -0
  122. package/esm2022/notifications/lib/notifications-list/notifications-list.component.mjs +48 -0
  123. package/esm2022/notifications/lib/notifications.module.mjs +31 -0
  124. package/esm2022/notifications/lib/notifications.service.mjs +142 -0
  125. package/esm2022/permissions/lib/directives/permission.directive.mjs +89 -0
  126. package/esm2022/permissions/lib/guards/permission.guard.mjs +57 -0
  127. package/esm2022/permissions/lib/permissions.module.mjs +40 -0
  128. package/esm2022/permissions/lib/permissions.service.mjs +97 -0
  129. package/esm2022/recaptcha/lib/recaptcha/recaptcha.component.mjs +220 -0
  130. package/esm2022/recaptcha/lib/recaptcha-loader.service.mjs +96 -0
  131. package/esm2022/recaptcha/lib/recaptcha.module.mjs +28 -0
  132. package/esm2022/storage/lib/storage.service.mjs +110 -0
  133. package/esm2022/table/lib/components/table/table.component.mjs +194 -0
  134. package/esm2022/table/lib/components/table-cell/table-cell.component.mjs +12 -0
  135. package/esm2022/table/lib/components/table-header-cell/table-header-cell.component.mjs +132 -0
  136. package/esm2022/table/lib/components/table-pager/table-pager.component.mjs +137 -0
  137. package/esm2022/table/lib/data/generic.data.mjs +82 -0
  138. package/esm2022/table/lib/table.module.mjs +43 -0
  139. package/esm2022/theming/lib/theming.directive.mjs +39 -0
  140. package/esm2022/theming/lib/theming.module.mjs +17 -0
  141. package/esm2022/tooltip/lib/tooltip-container/tooltip-container.component.mjs +32 -0
  142. package/esm2022/tooltip/lib/tooltip.directive.mjs +141 -0
  143. package/esm2022/tooltip/lib/tooltip.module.mjs +32 -0
  144. package/esm2022/utils/lib/directives/autosize.directive.mjs +73 -0
  145. package/esm2022/utils/lib/directives/focus-trap.directive.mjs +78 -0
  146. package/esm2022/utils/lib/directives/focus.directive.mjs +38 -0
  147. package/esm2022/utils/lib/directives/template.directive.mjs +29 -0
  148. package/esm2022/utils/lib/functions/parse-date.function.mjs +19 -0
  149. package/esm2022/utils/lib/utils.module.mjs +36 -0
  150. package/esm2022/utils/public_api.mjs +7 -0
  151. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-auth.mjs +19 -19
  152. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-auth.mjs.map +1 -1
  153. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-collections.mjs +38 -38
  154. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-collections.mjs.map +1 -1
  155. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-controls.mjs +83 -83
  156. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-controls.mjs.map +1 -1
  157. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-dashboard.mjs +37 -37
  158. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-dashboard.mjs.map +1 -1
  159. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-dialog.mjs +46 -46
  160. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-dialog.mjs.map +1 -1
  161. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-elements.mjs +185 -185
  162. package/fesm2022/bravobit-bb-foundation-elements.mjs.map +1 -0
  163. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-http.mjs +10 -10
  164. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-http.mjs.map +1 -1
  165. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-localize.mjs +20 -20
  166. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-localize.mjs.map +1 -1
  167. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-masking.mjs +20 -20
  168. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-masking.mjs.map +1 -1
  169. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-notifications.mjs +13 -13
  170. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-notifications.mjs.map +1 -1
  171. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-permissions.mjs +13 -13
  172. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-permissions.mjs.map +1 -1
  173. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-recaptcha.mjs +16 -16
  174. package/{fesm2015 → fesm2022}/bravobit-bb-foundation-recaptcha.mjs.map +1 -1
  175. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-storage.mjs +3 -3
  176. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-storage.mjs.map +1 -1
  177. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-table.mjs +46 -36
  178. package/fesm2022/bravobit-bb-foundation-table.mjs.map +1 -0
  179. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-theming.mjs +7 -7
  180. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-theming.mjs.map +1 -1
  181. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-tooltip.mjs +13 -13
  182. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-tooltip.mjs.map +1 -1
  183. package/{fesm2020 → fesm2022}/bravobit-bb-foundation-utils.mjs +42 -23
  184. package/fesm2022/bravobit-bb-foundation-utils.mjs.map +1 -0
  185. package/{fesm2020 → fesm2022}/bravobit-bb-foundation.mjs +21 -21
  186. package/{fesm2020 → fesm2022}/bravobit-bb-foundation.mjs.map +1 -1
  187. package/localize/lib/views/localize-string/localize-string.component.d.ts +1 -1
  188. package/localize/lib/views/localize-template.directive.d.ts +1 -1
  189. package/masking/lib/directives/currency-mask.directive.d.ts +1 -1
  190. package/masking/lib/directives/date-mask.directive.d.ts +1 -1
  191. package/masking/lib/directives/input-mask.directive.d.ts +1 -1
  192. package/notifications/lib/notifications-item/notifications-item.component.d.ts +1 -1
  193. package/package.json +70 -112
  194. package/permissions/lib/directives/permission.directive.d.ts +1 -1
  195. package/recaptcha/lib/recaptcha/recaptcha.component.d.ts +1 -1
  196. package/table/lib/components/table/table.component.d.ts +1 -1
  197. package/table/lib/components/table-header-cell/table-header-cell.component.d.ts +1 -1
  198. package/table/lib/components/table-pager/table-pager.component.d.ts +1 -1
  199. package/table/lib/data/generic.data.d.ts +2 -0
  200. package/theming/lib/theming.directive.d.ts +1 -1
  201. package/tooltip/lib/tooltip.directive.d.ts +1 -1
  202. package/utils/lib/directives/autosize.directive.d.ts +1 -1
  203. package/utils/lib/directives/template.directive.d.ts +1 -1
  204. package/utils/lib/functions/parse-date.function.d.ts +1 -0
  205. package/utils/public_api.d.ts +1 -0
  206. package/esm2020/auth/lib/auth.interceptor.mjs +0 -90
  207. package/esm2020/auth/lib/auth.module.mjs +0 -35
  208. package/esm2020/auth/lib/auth.service.mjs +0 -270
  209. package/esm2020/auth/lib/directives/authenticated.directive.mjs +0 -42
  210. package/esm2020/auth/lib/guards/anonymous.guard.mjs +0 -53
  211. package/esm2020/auth/lib/guards/authenticated.guard.mjs +0 -56
  212. package/esm2020/collections/lib/collections.module.mjs +0 -54
  213. package/esm2020/collections/lib/components/collections-pager/collections-pager.component.mjs +0 -123
  214. package/esm2020/collections/lib/components/collections-viewer/collections-viewer.component.mjs +0 -31
  215. package/esm2020/collections/lib/components/collections.directive.mjs +0 -43
  216. package/esm2020/controls/lib/checkbox/checkbox/checkbox.component.mjs +0 -178
  217. package/esm2020/controls/lib/checkbox/checkbox-group/checkbox-group.component.mjs +0 -68
  218. package/esm2020/controls/lib/checkbox/checkbox.module.mjs +0 -20
  219. package/esm2020/controls/lib/control-error/control-error/control-error.component.mjs +0 -63
  220. package/esm2020/controls/lib/control-error/control-error-submit.directive.mjs +0 -47
  221. package/esm2020/controls/lib/control-error/control-error.module.mjs +0 -19
  222. package/esm2020/controls/lib/controls.module.mjs +0 -62
  223. package/esm2020/controls/lib/form-control/form-control/form-control.component.mjs +0 -79
  224. package/esm2020/controls/lib/form-control/form-control-addon/form-control-addon.component.mjs +0 -22
  225. package/esm2020/controls/lib/form-control/form-control-input.directive.mjs +0 -124
  226. package/esm2020/controls/lib/form-control/form-control.module.mjs +0 -34
  227. package/esm2020/controls/lib/radio/radio-button/radio-button.component.mjs +0 -75
  228. package/esm2020/controls/lib/radio/radio-group/radio-group.component.mjs +0 -168
  229. package/esm2020/controls/lib/radio/radio.module.mjs +0 -21
  230. package/esm2020/controls/lib/toggle/toggle/toggle.component.mjs +0 -153
  231. package/esm2020/controls/lib/toggle/toggle-group/toggle-group.component.mjs +0 -62
  232. package/esm2020/controls/lib/toggle/toggle.module.mjs +0 -20
  233. package/esm2020/dashboard/lib/dashboard/dashboard.component.mjs +0 -57
  234. package/esm2020/dashboard/lib/dashboard-menu/dashboard-menu.component.mjs +0 -31
  235. package/esm2020/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.mjs +0 -29
  236. package/esm2020/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.mjs +0 -75
  237. package/esm2020/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.mjs +0 -99
  238. package/esm2020/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.mjs +0 -62
  239. package/esm2020/dashboard/lib/dashboard.module.mjs +0 -47
  240. package/esm2020/dialog/lib/dialog-actions/dialog-actions.component.mjs +0 -12
  241. package/esm2020/dialog/lib/dialog-confirm/dialog-confirm.component.mjs +0 -46
  242. package/esm2020/dialog/lib/dialog-container/dialog-container.component.mjs +0 -77
  243. package/esm2020/dialog/lib/dialog-header/dialog-header.component.mjs +0 -18
  244. package/esm2020/dialog/lib/dialog-link/dialog-link.component.mjs +0 -11
  245. package/esm2020/dialog/lib/dialog-modal/dialog-modal.component.mjs +0 -67
  246. package/esm2020/dialog/lib/dialog-overlay/dialog-overlay.component.mjs +0 -79
  247. package/esm2020/dialog/lib/dialog.insertion.mjs +0 -16
  248. package/esm2020/dialog/lib/dialog.module.mjs +0 -68
  249. package/esm2020/dialog/lib/dialog.service.mjs +0 -68
  250. package/esm2020/elements/lib/avatar/avatar.component.mjs +0 -149
  251. package/esm2020/elements/lib/button/button.component.mjs +0 -61
  252. package/esm2020/elements/lib/checkbox/checkbox.component.mjs +0 -73
  253. package/esm2020/elements/lib/date-picker/date-picker.component.mjs +0 -307
  254. package/esm2020/elements/lib/directives/addon.directive.mjs +0 -29
  255. package/esm2020/elements/lib/directives/form-submit.directive.mjs +0 -50
  256. package/esm2020/elements/lib/directives/form-submitter.directive.mjs +0 -25
  257. package/esm2020/elements/lib/directives/input.directive.mjs +0 -136
  258. package/esm2020/elements/lib/dropdown/dropdown.component.mjs +0 -100
  259. package/esm2020/elements/lib/elements.module.mjs +0 -177
  260. package/esm2020/elements/lib/file-picker/file-picker.component.mjs +0 -236
  261. package/esm2020/elements/lib/form-control/form-control.component.mjs +0 -49
  262. package/esm2020/elements/lib/form-error/form-error.component.mjs +0 -123
  263. package/esm2020/elements/lib/form-group/form-group.component.mjs +0 -18
  264. package/esm2020/elements/lib/icon/icon.component.mjs +0 -102
  265. package/esm2020/elements/lib/image-picker/image-picker.component.mjs +0 -106
  266. package/esm2020/elements/lib/pipes/file-image.pipe.mjs +0 -43
  267. package/esm2020/elements/lib/pipes/file-size.pipe.mjs +0 -28
  268. package/esm2020/elements/lib/pipes/relative-time.pipe.mjs +0 -96
  269. package/esm2020/elements/lib/spinner/spinner.component.mjs +0 -25
  270. package/esm2020/elements/lib/tag/tag.component.mjs +0 -18
  271. package/esm2020/http/lib/http.module.mjs +0 -43
  272. package/esm2020/http/lib/interceptors/base-url.interceptor.mjs +0 -50
  273. package/esm2020/http/lib/interceptors/error.interceptor.mjs +0 -32
  274. package/esm2020/lib/core/services/clipboard.service.mjs +0 -70
  275. package/esm2020/lib/core/services/exif.service.mjs +0 -163
  276. package/esm2020/lib/core/services/file-loader.service.mjs +0 -87
  277. package/esm2020/lib/core/services/image-converter.service.mjs +0 -123
  278. package/esm2020/lib/core/services/languages.service.mjs +0 -74
  279. package/esm2020/lib/core/services/network.service.mjs +0 -55
  280. package/esm2020/lib/core/services/patch.service.mjs +0 -63
  281. package/esm2020/localize/lib/localize.module.mjs +0 -81
  282. package/esm2020/localize/lib/localize.pipe.mjs +0 -46
  283. package/esm2020/localize/lib/localize.service.mjs +0 -185
  284. package/esm2020/localize/lib/views/localize-string/localize-string.component.mjs +0 -88
  285. package/esm2020/localize/lib/views/localize-template.directive.mjs +0 -21
  286. package/esm2020/masking/lib/directives/currency-mask.directive.mjs +0 -35
  287. package/esm2020/masking/lib/directives/date-mask.directive.mjs +0 -35
  288. package/esm2020/masking/lib/directives/input-mask.directive.mjs +0 -118
  289. package/esm2020/masking/lib/masking.module.mjs +0 -30
  290. package/esm2020/masking/lib/masking.service.mjs +0 -103
  291. package/esm2020/notifications/lib/notifications-item/notifications-item.component.mjs +0 -100
  292. package/esm2020/notifications/lib/notifications-list/notifications-list.component.mjs +0 -47
  293. package/esm2020/notifications/lib/notifications.module.mjs +0 -30
  294. package/esm2020/notifications/lib/notifications.service.mjs +0 -141
  295. package/esm2020/permissions/lib/directives/permission.directive.mjs +0 -88
  296. package/esm2020/permissions/lib/guards/permission.guard.mjs +0 -56
  297. package/esm2020/permissions/lib/permissions.module.mjs +0 -39
  298. package/esm2020/permissions/lib/permissions.service.mjs +0 -96
  299. package/esm2020/recaptcha/lib/recaptcha/recaptcha.component.mjs +0 -219
  300. package/esm2020/recaptcha/lib/recaptcha-loader.service.mjs +0 -95
  301. package/esm2020/recaptcha/lib/recaptcha.module.mjs +0 -27
  302. package/esm2020/storage/lib/storage.service.mjs +0 -109
  303. package/esm2020/table/lib/components/table/table.component.mjs +0 -191
  304. package/esm2020/table/lib/components/table-cell/table-cell.component.mjs +0 -11
  305. package/esm2020/table/lib/components/table-header-cell/table-header-cell.component.mjs +0 -131
  306. package/esm2020/table/lib/components/table-pager/table-pager.component.mjs +0 -136
  307. package/esm2020/table/lib/data/generic.data.mjs +0 -72
  308. package/esm2020/table/lib/table.module.mjs +0 -42
  309. package/esm2020/theming/lib/theming.directive.mjs +0 -38
  310. package/esm2020/theming/lib/theming.module.mjs +0 -16
  311. package/esm2020/tooltip/lib/tooltip-container/tooltip-container.component.mjs +0 -31
  312. package/esm2020/tooltip/lib/tooltip.directive.mjs +0 -140
  313. package/esm2020/tooltip/lib/tooltip.module.mjs +0 -31
  314. package/esm2020/utils/lib/directives/autosize.directive.mjs +0 -72
  315. package/esm2020/utils/lib/directives/focus-trap.directive.mjs +0 -77
  316. package/esm2020/utils/lib/directives/focus.directive.mjs +0 -37
  317. package/esm2020/utils/lib/directives/template.directive.mjs +0 -28
  318. package/esm2020/utils/lib/utils.module.mjs +0 -35
  319. package/esm2020/utils/public_api.mjs +0 -6
  320. package/fesm2015/bravobit-bb-foundation-auth.mjs +0 -851
  321. package/fesm2015/bravobit-bb-foundation-auth.mjs.map +0 -1
  322. package/fesm2015/bravobit-bb-foundation-collections.mjs +0 -474
  323. package/fesm2015/bravobit-bb-foundation-collections.mjs.map +0 -1
  324. package/fesm2015/bravobit-bb-foundation-controls.mjs +0 -1217
  325. package/fesm2015/bravobit-bb-foundation-controls.mjs.map +0 -1
  326. package/fesm2015/bravobit-bb-foundation-dashboard.mjs +0 -417
  327. package/fesm2015/bravobit-bb-foundation-dashboard.mjs.map +0 -1
  328. package/fesm2015/bravobit-bb-foundation-dialog.mjs +0 -512
  329. package/fesm2015/bravobit-bb-foundation-dialog.mjs.map +0 -1
  330. package/fesm2015/bravobit-bb-foundation-elements.mjs +0 -1883
  331. package/fesm2015/bravobit-bb-foundation-elements.mjs.map +0 -1
  332. package/fesm2015/bravobit-bb-foundation-http.mjs +0 -176
  333. package/fesm2015/bravobit-bb-foundation-http.mjs.map +0 -1
  334. package/fesm2015/bravobit-bb-foundation-localize.mjs +0 -835
  335. package/fesm2015/bravobit-bb-foundation-localize.mjs.map +0 -1
  336. package/fesm2015/bravobit-bb-foundation-masking.mjs +0 -334
  337. package/fesm2015/bravobit-bb-foundation-masking.mjs.map +0 -1
  338. package/fesm2015/bravobit-bb-foundation-notifications.mjs +0 -357
  339. package/fesm2015/bravobit-bb-foundation-notifications.mjs.map +0 -1
  340. package/fesm2015/bravobit-bb-foundation-permissions.mjs +0 -310
  341. package/fesm2015/bravobit-bb-foundation-permissions.mjs.map +0 -1
  342. package/fesm2015/bravobit-bb-foundation-recaptcha.mjs +0 -349
  343. package/fesm2015/bravobit-bb-foundation-rxjs.mjs +0 -22
  344. package/fesm2015/bravobit-bb-foundation-rxjs.mjs.map +0 -1
  345. package/fesm2015/bravobit-bb-foundation-storage.mjs +0 -418
  346. package/fesm2015/bravobit-bb-foundation-storage.mjs.map +0 -1
  347. package/fesm2015/bravobit-bb-foundation-table.mjs +0 -603
  348. package/fesm2015/bravobit-bb-foundation-table.mjs.map +0 -1
  349. package/fesm2015/bravobit-bb-foundation-theming.mjs +0 -382
  350. package/fesm2015/bravobit-bb-foundation-theming.mjs.map +0 -1
  351. package/fesm2015/bravobit-bb-foundation-tooltip.mjs +0 -210
  352. package/fesm2015/bravobit-bb-foundation-tooltip.mjs.map +0 -1
  353. package/fesm2015/bravobit-bb-foundation-utils.mjs +0 -246
  354. package/fesm2015/bravobit-bb-foundation-utils.mjs.map +0 -1
  355. package/fesm2015/bravobit-bb-foundation.mjs +0 -929
  356. package/fesm2015/bravobit-bb-foundation.mjs.map +0 -1
  357. package/fesm2020/bravobit-bb-foundation-elements.mjs.map +0 -1
  358. package/fesm2020/bravobit-bb-foundation-recaptcha.mjs.map +0 -1
  359. package/fesm2020/bravobit-bb-foundation-table.mjs.map +0 -1
  360. package/fesm2020/bravobit-bb-foundation-utils.mjs.map +0 -1
  361. /package/{esm2020 → esm2022}/auth/bravobit-bb-foundation-auth.mjs +0 -0
  362. /package/{esm2020 → esm2022}/auth/lib/auth.session.mjs +0 -0
  363. /package/{esm2020 → esm2022}/auth/lib/directives/abstract.directive.mjs +0 -0
  364. /package/{esm2020 → esm2022}/auth/lib/helpers/jwt.helper.mjs +0 -0
  365. /package/{esm2020 → esm2022}/auth/lib/interfaces/config.interface.mjs +0 -0
  366. /package/{esm2020 → esm2022}/auth/lib/interfaces/provider.interface.mjs +0 -0
  367. /package/{esm2020 → esm2022}/auth/lib/interfaces/token.interface.mjs +0 -0
  368. /package/{esm2020 → esm2022}/auth/lib/providers/email.provider.mjs +0 -0
  369. /package/{esm2020 → esm2022}/auth/lib/providers/verify.provider.mjs +0 -0
  370. /package/{esm2020 → esm2022}/auth/lib/tokens/use-authorization.token.mjs +0 -0
  371. /package/{esm2020 → esm2022}/auth/public_api.mjs +0 -0
  372. /package/{esm2020 → esm2022}/bravobit-bb-foundation.mjs +0 -0
  373. /package/{esm2020 → esm2022}/collections/bravobit-bb-foundation-collections.mjs +0 -0
  374. /package/{esm2020 → esm2022}/collections/lib/collection.mjs +0 -0
  375. /package/{esm2020 → esm2022}/collections/lib/interfaces/collection.interface.mjs +0 -0
  376. /package/{esm2020 → esm2022}/collections/lib/providers/api-collection.provider.mjs +0 -0
  377. /package/{esm2020 → esm2022}/collections/lib/providers/collection.provider.mjs +0 -0
  378. /package/{esm2020 → esm2022}/collections/lib/providers/local-collection.provider.mjs +0 -0
  379. /package/{esm2020 → esm2022}/collections/public_api.mjs +0 -0
  380. /package/{esm2020 → esm2022}/controls/bravobit-bb-foundation-controls.mjs +0 -0
  381. /package/{esm2020 → esm2022}/controls/lib/control-error/control-error/control-error.animation.mjs +0 -0
  382. /package/{esm2020 → esm2022}/controls/lib/control-error/control-error.defaults.mjs +0 -0
  383. /package/{esm2020 → esm2022}/controls/lib/control-error/control-error.interface.mjs +0 -0
  384. /package/{esm2020 → esm2022}/controls/lib/control-error/control-error.utils.mjs +0 -0
  385. /package/{esm2020 → esm2022}/controls/lib/controls.interfaces.mjs +0 -0
  386. /package/{esm2020 → esm2022}/controls/public_api.mjs +0 -0
  387. /package/{esm2020 → esm2022}/dashboard/bravobit-bb-foundation-dashboard.mjs +0 -0
  388. /package/{esm2020 → esm2022}/dashboard/public_api.mjs +0 -0
  389. /package/{esm2020 → esm2022}/dialog/bravobit-bb-foundation-dialog.mjs +0 -0
  390. /package/{esm2020 → esm2022}/dialog/lib/dialog-container/dialog-container.animations.mjs +0 -0
  391. /package/{esm2020 → esm2022}/dialog/lib/dialog-overlay/dialog-overlay.animations.mjs +0 -0
  392. /package/{esm2020 → esm2022}/dialog/lib/dialog.interfaces.mjs +0 -0
  393. /package/{esm2020 → esm2022}/dialog/lib/dialog.ref.mjs +0 -0
  394. /package/{esm2020 → esm2022}/dialog/public_api.mjs +0 -0
  395. /package/{esm2020 → esm2022}/elements/bravobit-bb-foundation-elements.mjs +0 -0
  396. /package/{esm2020 → esm2022}/elements/lib/elements.interfaces.mjs +0 -0
  397. /package/{esm2020 → esm2022}/elements/public_api.mjs +0 -0
  398. /package/{esm2020 → esm2022}/http/bravobit-bb-foundation-http.mjs +0 -0
  399. /package/{esm2020 → esm2022}/http/lib/classes/http.config.mjs +0 -0
  400. /package/{esm2020 → esm2022}/http/lib/classes/http.error.mjs +0 -0
  401. /package/{esm2020 → esm2022}/http/lib/http.interfaces.mjs +0 -0
  402. /package/{esm2020 → esm2022}/http/public_api.mjs +0 -0
  403. /package/{esm2020 → esm2022}/lib/core/functions/date.utils.mjs +0 -0
  404. /package/{esm2020 → esm2022}/lib/core/functions/password.utils.mjs +0 -0
  405. /package/{esm2020 → esm2022}/lib/core/miscellaneous/regex.mjs +0 -0
  406. /package/{esm2020 → esm2022}/lib/core/miscellaneous/validator.mjs +0 -0
  407. /package/{esm2020 → esm2022}/lib/core/mixins/can-disable.mjs +0 -0
  408. /package/{esm2020 → esm2022}/lib/core/mixins/can-hide-errors.mjs +0 -0
  409. /package/{esm2020 → esm2022}/lib/core/mixins/can-load.mjs +0 -0
  410. /package/{esm2020 → esm2022}/lib/core/mixins/constructor.mjs +0 -0
  411. /package/{esm2020 → esm2022}/lib/core/mixins/has-error.mjs +0 -0
  412. /package/{esm2020 → esm2022}/lib/core/mixins/is-focused.mjs +0 -0
  413. /package/{esm2020 → esm2022}/lib/core/mixins/is-grouped.mjs +0 -0
  414. /package/{esm2020 → esm2022}/lib/core/mixins/is-readonly.mjs +0 -0
  415. /package/{esm2020 → esm2022}/lib/core/mixins/is-required.mjs +0 -0
  416. /package/{esm2020 → esm2022}/lib/core/tokens/accept-language.token.mjs +0 -0
  417. /package/{esm2020 → esm2022}/lib/core/tokens/base-url.token.mjs +0 -0
  418. /package/{esm2020 → esm2022}/lib/core/tokens/cookie.token.mjs +0 -0
  419. /package/{esm2020 → esm2022}/lib/core/tokens/location.token.mjs +0 -0
  420. /package/{esm2020 → esm2022}/lib/core/tokens/navigator.token.mjs +0 -0
  421. /package/{esm2020 → esm2022}/lib/core/tokens/window.token.mjs +0 -0
  422. /package/{esm2020 → esm2022}/localize/bravobit-bb-foundation-localize.mjs +0 -0
  423. /package/{esm2020 → esm2022}/localize/lib/dictionary/dictionary.class.mjs +0 -0
  424. /package/{esm2020 → esm2022}/localize/lib/dictionary/dictionary.context.mjs +0 -0
  425. /package/{esm2020 → esm2022}/localize/lib/dictionary/dictionary.data.mjs +0 -0
  426. /package/{esm2020 → esm2022}/localize/lib/functions/date.function.mjs +0 -0
  427. /package/{esm2020 → esm2022}/localize/lib/functions/lowercase.function.mjs +0 -0
  428. /package/{esm2020 → esm2022}/localize/lib/functions/uppercase.function.mjs +0 -0
  429. /package/{esm2020 → esm2022}/localize/lib/handlers/missing.handler.mjs +0 -0
  430. /package/{esm2020 → esm2022}/localize/lib/interfaces/config.interfaces.mjs +0 -0
  431. /package/{esm2020 → esm2022}/localize/lib/interfaces/functions.interfaces.mjs +0 -0
  432. /package/{esm2020 → esm2022}/localize/lib/interfaces/handlers.interfaces.mjs +0 -0
  433. /package/{esm2020 → esm2022}/localize/lib/interfaces/options.interfaces.mjs +0 -0
  434. /package/{esm2020 → esm2022}/localize/lib/interfaces/transforms.interfaces.mjs +0 -0
  435. /package/{esm2020 → esm2022}/localize/lib/locale.token.mjs +0 -0
  436. /package/{esm2020 → esm2022}/localize/lib/localizations/dutch.localization.mjs +0 -0
  437. /package/{esm2020 → esm2022}/localize/lib/localizations/english.localization.mjs +0 -0
  438. /package/{esm2020 → esm2022}/localize/lib/transforms/abstract.transform.mjs +0 -0
  439. /package/{esm2020 → esm2022}/localize/public_api.mjs +0 -0
  440. /package/{esm2020 → esm2022}/masking/bravobit-bb-foundation-masking.mjs +0 -0
  441. /package/{esm2020 → esm2022}/masking/lib/input-mask.interface.mjs +0 -0
  442. /package/{esm2020 → esm2022}/masking/public_api.mjs +0 -0
  443. /package/{esm2020 → esm2022}/notifications/bravobit-bb-foundation-notifications.mjs +0 -0
  444. /package/{esm2020 → esm2022}/notifications/lib/notifications.animations.mjs +0 -0
  445. /package/{esm2020 → esm2022}/notifications/lib/notifications.interfaces.mjs +0 -0
  446. /package/{esm2020 → esm2022}/notifications/public_api.mjs +0 -0
  447. /package/{esm2020 → esm2022}/permissions/bravobit-bb-foundation-permissions.mjs +0 -0
  448. /package/{esm2020 → esm2022}/permissions/lib/handlers/abstract.handler.mjs +0 -0
  449. /package/{esm2020 → esm2022}/permissions/lib/handlers/local.handler.mjs +0 -0
  450. /package/{esm2020 → esm2022}/permissions/lib/permissions.interface.mjs +0 -0
  451. /package/{esm2020 → esm2022}/permissions/public_api.mjs +0 -0
  452. /package/{esm2020 → esm2022}/public_api.mjs +0 -0
  453. /package/{esm2020 → esm2022}/recaptcha/bravobit-bb-foundation-recaptcha.mjs +0 -0
  454. /package/{esm2020 → esm2022}/recaptcha/lib/recaptcha.interface.mjs +0 -0
  455. /package/{esm2020 → esm2022}/recaptcha/public_api.mjs +0 -0
  456. /package/{esm2020 → esm2022}/rxjs/bravobit-bb-foundation-rxjs.mjs +0 -0
  457. /package/{esm2020 → esm2022}/rxjs/lib/observables/get-control-value.observable.mjs +0 -0
  458. /package/{esm2020 → esm2022}/rxjs/lib/operators/combine-latest-map.operator.mjs +0 -0
  459. /package/{esm2020 → esm2022}/rxjs/lib/operators/filter-nil.operator.mjs +0 -0
  460. /package/{esm2020 → esm2022}/rxjs/public_api.mjs +0 -0
  461. /package/{esm2020 → esm2022}/storage/bravobit-bb-foundation-storage.mjs +0 -0
  462. /package/{esm2020 → esm2022}/storage/lib/interfaces/attributes.interface.mjs +0 -0
  463. /package/{esm2020 → esm2022}/storage/lib/interfaces/memory.interface.mjs +0 -0
  464. /package/{esm2020 → esm2022}/storage/lib/interfaces/strategy.interface.mjs +0 -0
  465. /package/{esm2020 → esm2022}/storage/lib/strategies/cookie-storage.strategy.mjs +0 -0
  466. /package/{esm2020 → esm2022}/storage/lib/strategies/memory-storage.strategy.mjs +0 -0
  467. /package/{esm2020 → esm2022}/storage/lib/strategies/polyfill-storage.strategy.mjs +0 -0
  468. /package/{esm2020 → esm2022}/storage/public_api.mjs +0 -0
  469. /package/{esm2020 → esm2022}/table/bravobit-bb-foundation-table.mjs +0 -0
  470. /package/{esm2020 → esm2022}/table/lib/data/datasource.data.mjs +0 -0
  471. /package/{esm2020 → esm2022}/table/lib/interfaces/datasource.interface.mjs +0 -0
  472. /package/{esm2020 → esm2022}/table/lib/interfaces/table.interfaces.mjs +0 -0
  473. /package/{esm2020 → esm2022}/table/public_api.mjs +0 -0
  474. /package/{esm2020 → esm2022}/theming/bravobit-bb-foundation-theming.mjs +0 -0
  475. /package/{esm2020 → esm2022}/theming/lib/themes/checkbox-group.theme.mjs +0 -0
  476. /package/{esm2020 → esm2022}/theming/lib/themes/checkbox.theme.mjs +0 -0
  477. /package/{esm2020 → esm2022}/theming/lib/themes/control-error.theme.mjs +0 -0
  478. /package/{esm2020 → esm2022}/theming/lib/themes/form-control-addon.theme.mjs +0 -0
  479. /package/{esm2020 → esm2022}/theming/lib/themes/form-control.theme.mjs +0 -0
  480. /package/{esm2020 → esm2022}/theming/lib/themes/radio-button.theme.mjs +0 -0
  481. /package/{esm2020 → esm2022}/theming/lib/themes/radio-group.theme.mjs +0 -0
  482. /package/{esm2020 → esm2022}/theming/lib/themes/toggle-group.theme.mjs +0 -0
  483. /package/{esm2020 → esm2022}/theming/lib/themes/toggle.theme.mjs +0 -0
  484. /package/{esm2020 → esm2022}/theming/lib/theming.data.mjs +0 -0
  485. /package/{esm2020 → esm2022}/theming/lib/theming.interface.mjs +0 -0
  486. /package/{esm2020 → esm2022}/theming/lib/utils/theming.variable.mjs +0 -0
  487. /package/{esm2020 → esm2022}/theming/public_api.mjs +0 -0
  488. /package/{esm2020 → esm2022}/tooltip/bravobit-bb-foundation-tooltip.mjs +0 -0
  489. /package/{esm2020 → esm2022}/tooltip/lib/tooltip.interfaces.mjs +0 -0
  490. /package/{esm2020 → esm2022}/tooltip/public_api.mjs +0 -0
  491. /package/{esm2020 → esm2022}/utils/bravobit-bb-foundation-utils.mjs +0 -0
  492. /package/{fesm2020 → fesm2022}/bravobit-bb-foundation-rxjs.mjs +0 -0
  493. /package/{fesm2020 → fesm2022}/bravobit-bb-foundation-rxjs.mjs.map +0 -0
@@ -0,0 +1,51 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../classes/http.config";
4
+ class BaseUrlInterceptor {
5
+ constructor(_config) {
6
+ this._config = _config;
7
+ // Aliases.
8
+ this._aliases = this._config?.aliases;
9
+ this._prefix = this._config?.prefix;
10
+ this._extractRegex = new RegExp(`\\${this._prefix}[a-zA-Z]+`);
11
+ }
12
+ intercept(request, next) {
13
+ const url = this.getUrlBasedOnAlias(request.url);
14
+ const modified = request.clone({ url });
15
+ return next.handle(modified);
16
+ }
17
+ getUrlBasedOnAlias(url) {
18
+ const matches = this._extractRegex.exec(url);
19
+ if (!matches) {
20
+ return url;
21
+ }
22
+ return matches.reduce((previous, current) => {
23
+ const alias = this.getAlias(current);
24
+ if (!alias) {
25
+ return previous;
26
+ }
27
+ return previous.replace(current, alias);
28
+ }, url);
29
+ }
30
+ getAlias(value) {
31
+ const alias = value.replace(this._prefix, '');
32
+ const fetched = this._aliases?.[alias] ?? null;
33
+ if (fetched) {
34
+ return fetched;
35
+ }
36
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
37
+ const available = Object.keys(this._aliases)
38
+ .map(item => `\$${item}`)
39
+ .join(', ');
40
+ console?.warn?.(`[HttpModule]: Used an invalid HTTP-alias named "${value}", skipped parsing; Available aliases is one of (${available}).`);
41
+ }
42
+ return null;
43
+ }
44
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: BaseUrlInterceptor, deps: [{ token: i1.HttpConfig }], target: i0.ɵɵFactoryTarget.Injectable }); }
45
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: BaseUrlInterceptor }); }
46
+ }
47
+ export { BaseUrlInterceptor };
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: BaseUrlInterceptor, decorators: [{
49
+ type: Injectable
50
+ }], ctorParameters: function () { return [{ type: i1.HttpConfig }]; } });
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS11cmwuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYi1mb3VuZGF0aW9uL2h0dHAvc3JjL2xpYi9pbnRlcmNlcHRvcnMvYmFzZS11cmwuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7O0FBSXpDLE1BQ2Esa0JBQWtCO0lBTzNCLFlBQW9CLE9BQW1CO1FBQW5CLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFMdkMsV0FBVztRQUNNLGFBQVEsR0FBc0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7UUFDcEQsWUFBTyxHQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDO1FBQ3ZDLGtCQUFhLEdBQVcsSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxXQUFXLENBQUMsQ0FBQztJQUdsRixDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQTZCLEVBQUUsSUFBaUI7UUFDdEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztRQUV0QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEdBQVc7UUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLE9BQU8sR0FBRyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDeEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNSLE9BQU8sUUFBUSxDQUFDO2FBQ25CO1lBRUQsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWixDQUFDO0lBRU8sUUFBUSxDQUFDLEtBQWE7UUFDMUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUM7UUFDL0MsSUFBSSxPQUFPLEVBQUU7WUFDVCxPQUFPLE9BQU8sQ0FBQztTQUNsQjtRQUVELElBQUksT0FBTyxTQUFTLEtBQUssV0FBVyxJQUFJLFNBQVMsRUFBRTtZQUMvQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7aUJBQ3ZDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7aUJBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQixPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsbURBQW1ELEtBQUssb0RBQW9ELFNBQVMsSUFBSSxDQUFDLENBQUM7U0FDOUk7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzhHQWhEUSxrQkFBa0I7a0hBQWxCLGtCQUFrQjs7U0FBbEIsa0JBQWtCOzJGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0fSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0h0dHBDb25maWdBbGlhc2VzfSBmcm9tICcuLi9odHRwLmludGVyZmFjZXMnO1xuaW1wb3J0IHtIdHRwQ29uZmlnfSBmcm9tICcuLi9jbGFzc2VzL2h0dHAuY29uZmlnJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmRlY2xhcmUgbGV0IG5nRGV2TW9kZTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJhc2VVcmxJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG5cbiAgICAvLyBBbGlhc2VzLlxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2FsaWFzZXM6IEh0dHBDb25maWdBbGlhc2VzID0gdGhpcy5fY29uZmlnPy5hbGlhc2VzO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ByZWZpeDogc3RyaW5nID0gdGhpcy5fY29uZmlnPy5wcmVmaXg7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZXh0cmFjdFJlZ2V4OiBSZWdFeHAgPSBuZXcgUmVnRXhwKGBcXFxcJHt0aGlzLl9wcmVmaXh9W2EtekEtWl0rYCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb25maWc6IEh0dHBDb25maWcpIHtcbiAgICB9XG5cbiAgICBpbnRlcmNlcHQocmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIG5leHQ6IEh0dHBIYW5kbGVyKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsQmFzZWRPbkFsaWFzKHJlcXVlc3QudXJsKTtcbiAgICAgICAgY29uc3QgbW9kaWZpZWQgPSByZXF1ZXN0LmNsb25lKHt1cmx9KTtcblxuICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUobW9kaWZpZWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VXJsQmFzZWRPbkFsaWFzKHVybDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLl9leHRyYWN0UmVnZXguZXhlYyh1cmwpO1xuICAgICAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF0Y2hlcy5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbGlhcyA9IHRoaXMuZ2V0QWxpYXMoY3VycmVudCk7XG4gICAgICAgICAgICBpZiAoIWFsaWFzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXMucmVwbGFjZShjdXJyZW50LCBhbGlhcyk7XG4gICAgICAgIH0sIHVybCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRBbGlhcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGFsaWFzID0gdmFsdWUucmVwbGFjZSh0aGlzLl9wcmVmaXgsICcnKTtcbiAgICAgICAgY29uc3QgZmV0Y2hlZCA9IHRoaXMuX2FsaWFzZXM/LlthbGlhc10gPz8gbnVsbDtcbiAgICAgICAgaWYgKGZldGNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmZXRjaGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkge1xuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlID0gT2JqZWN0LmtleXModGhpcy5fYWxpYXNlcylcbiAgICAgICAgICAgICAgICAubWFwKGl0ZW0gPT4gYFxcJCR7aXRlbX1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICAgICAgY29uc29sZT8ud2Fybj8uKGBbSHR0cE1vZHVsZV06IFVzZWQgYW4gaW52YWxpZCBIVFRQLWFsaWFzIG5hbWVkIFwiJHt2YWx1ZX1cIiwgc2tpcHBlZCBwYXJzaW5nOyBBdmFpbGFibGUgYWxpYXNlcyBpcyBvbmUgb2YgKCR7YXZhaWxhYmxlfSkuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbn1cbiJdfQ==
@@ -0,0 +1,33 @@
1
+ import { HttpErrorResponse } from '@angular/common/http';
2
+ import { HttpError } from '../classes/http.error';
3
+ import { catchError } from 'rxjs/operators';
4
+ import { Injectable } from '@angular/core';
5
+ import { throwError } from 'rxjs';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../classes/http.config";
8
+ class ErrorInterceptor {
9
+ constructor(_config) {
10
+ this._config = _config;
11
+ // State.
12
+ this._disabled = this._config?.disableErrorParsing ?? false;
13
+ }
14
+ intercept(request, next) {
15
+ return next.handle(request).pipe(catchError(error => {
16
+ // If we have a matching http error response
17
+ // re-map it with our custom class (if not disabled).
18
+ if (!this._disabled && error instanceof HttpErrorResponse) {
19
+ const parsed = new HttpError(error);
20
+ return throwError(() => parsed);
21
+ }
22
+ // We did not match anything, just re-trow the error.
23
+ return throwError(() => error);
24
+ }));
25
+ }
26
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ErrorInterceptor, deps: [{ token: i1.HttpConfig }], target: i0.ɵɵFactoryTarget.Injectable }); }
27
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ErrorInterceptor }); }
28
+ }
29
+ export { ErrorInterceptor };
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ErrorInterceptor, decorators: [{
31
+ type: Injectable
32
+ }], ctorParameters: function () { return [{ type: i1.HttpConfig }]; } });
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYi1mb3VuZGF0aW9uL2h0dHAvc3JjL2xpYi9pbnRlcmNlcHRvcnMvZXJyb3IuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGlCQUFpQixFQUE0QyxNQUFNLHNCQUFzQixDQUFDO0FBRWxHLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7QUFFaEMsTUFDYSxnQkFBZ0I7SUFLekIsWUFBb0IsT0FBbUI7UUFBbkIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUh2QyxTQUFTO1FBQ1EsY0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLElBQUksS0FBSyxDQUFDO0lBR3hFLENBQUM7SUFFRCxTQUFTLENBQUMsT0FBNkIsRUFBRSxJQUFpQjtRQUN0RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUM1QixVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDZiw0Q0FBNEM7WUFDNUMscURBQXFEO1lBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssWUFBWSxpQkFBaUIsRUFBRTtnQkFDdkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ25DO1lBRUQscURBQXFEO1lBQ3JELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDTixDQUFDOzhHQXRCUSxnQkFBZ0I7a0hBQWhCLGdCQUFnQjs7U0FBaEIsZ0JBQWdCOzJGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGFuZGxlciwgSHR0cEludGVyY2VwdG9yLCBIdHRwUmVxdWVzdH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtIdHRwQ29uZmlnfSBmcm9tICcuLi9jbGFzc2VzL2h0dHAuY29uZmlnJztcbmltcG9ydCB7SHR0cEVycm9yfSBmcm9tICcuLi9jbGFzc2VzL2h0dHAuZXJyb3InO1xuaW1wb3J0IHtjYXRjaEVycm9yfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEVycm9ySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuXG4gICAgLy8gU3RhdGUuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGlzYWJsZWQgPSB0aGlzLl9jb25maWc/LmRpc2FibGVFcnJvclBhcnNpbmcgPz8gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb25maWc6IEh0dHBDb25maWcpIHtcbiAgICB9XG5cbiAgICBpbnRlcmNlcHQocmVxdWVzdDogSHR0cFJlcXVlc3Q8dW5rbm93bj4sIG5leHQ6IEh0dHBIYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KS5waXBlKFxuICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIG1hdGNoaW5nIGh0dHAgZXJyb3IgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAvLyByZS1tYXAgaXQgd2l0aCBvdXIgY3VzdG9tIGNsYXNzIChpZiBub3QgZGlzYWJsZWQpLlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZGlzYWJsZWQgJiYgZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgSHR0cEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gcGFyc2VkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBXZSBkaWQgbm90IG1hdGNoIGFueXRoaW5nLCBqdXN0IHJlLXRyb3cgdGhlIGVycm9yLlxuICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG59XG4iXX0=
@@ -0,0 +1,71 @@
1
+ import { Inject, Injectable, Optional } from '@angular/core';
2
+ import { DOCUMENT } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ class Clipboard {
5
+ constructor(_document) {
6
+ this._document = _document;
7
+ }
8
+ copy(text) {
9
+ const pendingCopy = this.beginCopy(text);
10
+ const successful = pendingCopy.copy();
11
+ pendingCopy.destroy();
12
+ return successful;
13
+ }
14
+ beginCopy(text) {
15
+ return new ClipboardCopy(text, this._document);
16
+ }
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: Clipboard, deps: [{ token: DOCUMENT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
18
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: Clipboard, providedIn: 'root' }); }
19
+ }
20
+ export { Clipboard };
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: Clipboard, decorators: [{
22
+ type: Injectable,
23
+ args: [{
24
+ providedIn: 'root'
25
+ }]
26
+ }], ctorParameters: function () { return [{ type: Document, decorators: [{
27
+ type: Optional
28
+ }, {
29
+ type: Inject,
30
+ args: [DOCUMENT]
31
+ }] }]; } });
32
+ export class ClipboardCopy {
33
+ constructor(_text, _document) {
34
+ this._text = _text;
35
+ this._document = _document;
36
+ this.initialize();
37
+ }
38
+ copy() {
39
+ const textarea = this._textarea;
40
+ let successful = false;
41
+ try {
42
+ const currentFocus = this._document.activeElement;
43
+ textarea?.select?.();
44
+ textarea?.setSelectionRange?.(0, textarea?.value?.length);
45
+ successful = this._document?.execCommand?.('copy');
46
+ currentFocus?.focus?.();
47
+ }
48
+ catch {
49
+ // Do nothing.
50
+ }
51
+ return successful;
52
+ }
53
+ destroy() {
54
+ this._textarea?.parentNode?.removeChild?.(this._textarea);
55
+ this._textarea = undefined;
56
+ }
57
+ initialize() {
58
+ const textarea = this._textarea = this._document.createElement('textarea');
59
+ const styles = textarea.style;
60
+ // Hide the element for display and accessibility. Set a fixed position so the page layout
61
+ // isn't affected. We use `fixed` with `top: 0`, because focus is moved into the textarea
62
+ // for a split second and if it's off-screen, some browsers will attempt to scroll it into view.
63
+ styles.position = 'fixed';
64
+ styles.top = styles.opacity = '0';
65
+ styles.left = '-999em';
66
+ textarea.setAttribute('aria-hidden', 'true');
67
+ textarea.value = this._text;
68
+ this._document.body.appendChild(textarea);
69
+ }
70
+ }
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpcGJvYXJkLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYi1mb3VuZGF0aW9uL3NyYy9saWIvY29yZS9zZXJ2aWNlcy9jbGlwYm9hcmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDOztBQUV6QyxNQUdhLFNBQVM7SUFFbEIsWUFBa0QsU0FBb0I7UUFBcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztJQUN0RSxDQUFDO0lBRUQsSUFBSSxDQUFDLElBQVk7UUFDYixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFdEIsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFZO1FBQ2xCLE9BQU8sSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuRCxDQUFDOzhHQWZRLFNBQVMsa0JBRWMsUUFBUTtrSEFGL0IsU0FBUyxjQUZOLE1BQU07O1NBRVQsU0FBUzsyRkFBVCxTQUFTO2tCQUhyQixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7MEJBR2dCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsUUFBUTs7QUFrQjVDLE1BQU0sT0FBTyxhQUFhO0lBSXRCLFlBQW9CLEtBQWEsRUFDSixTQUFtQjtRQUQ1QixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ0osY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUM1QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUk7UUFDQSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztRQUV2QixJQUFJO1lBQ0EsTUFBTSxZQUFZLEdBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUF3QyxDQUFDO1lBRXRGLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3JCLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzFELFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRW5ELFlBQVksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1NBQzNCO1FBQUMsTUFBTTtZQUNKLGNBQWM7U0FDakI7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRUQsT0FBTztRQUNILElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRU8sVUFBVTtRQUNkLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0UsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUU5QiwwRkFBMEY7UUFDMUYseUZBQXlGO1FBQ3pGLGdHQUFnRztRQUNoRyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUMxQixNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3ZCLFFBQVEsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztDQUVKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ2xpcGJvYXJkIHtcblxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50PzogRG9jdW1lbnQpIHtcbiAgICB9XG5cbiAgICBjb3B5KHRleHQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBwZW5kaW5nQ29weSA9IHRoaXMuYmVnaW5Db3B5KHRleHQpO1xuICAgICAgICBjb25zdCBzdWNjZXNzZnVsID0gcGVuZGluZ0NvcHkuY29weSgpO1xuICAgICAgICBwZW5kaW5nQ29weS5kZXN0cm95KCk7XG5cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NmdWw7XG4gICAgfVxuXG4gICAgYmVnaW5Db3B5KHRleHQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IENsaXBib2FyZENvcHkodGV4dCwgdGhpcy5fZG9jdW1lbnQpO1xuICAgIH1cblxufVxuXG5cbmV4cG9ydCBjbGFzcyBDbGlwYm9hcmRDb3B5IHtcblxuICAgIHByaXZhdGUgX3RleHRhcmVhPzogSFRNTFRleHRBcmVhRWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3RleHQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudDogRG9jdW1lbnQpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgfVxuXG4gICAgY29weSgpIHtcbiAgICAgICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLl90ZXh0YXJlYTtcbiAgICAgICAgbGV0IHN1Y2Nlc3NmdWwgPSBmYWxzZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEZvY3VzID0gPHVua25vd24+dGhpcy5fZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MT3JTVkdFbGVtZW50IHwgbnVsbDtcblxuICAgICAgICAgICAgdGV4dGFyZWE/LnNlbGVjdD8uKCk7XG4gICAgICAgICAgICB0ZXh0YXJlYT8uc2V0U2VsZWN0aW9uUmFuZ2U/LigwLCB0ZXh0YXJlYT8udmFsdWU/Lmxlbmd0aCk7XG4gICAgICAgICAgICBzdWNjZXNzZnVsID0gdGhpcy5fZG9jdW1lbnQ/LmV4ZWNDb21tYW5kPy4oJ2NvcHknKTtcblxuICAgICAgICAgICAgY3VycmVudEZvY3VzPy5mb2N1cz8uKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gRG8gbm90aGluZy5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdWNjZXNzZnVsO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX3RleHRhcmVhPy5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZD8uKHRoaXMuX3RleHRhcmVhKTtcbiAgICAgICAgdGhpcy5fdGV4dGFyZWEgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplKCkge1xuICAgICAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMuX3RleHRhcmVhID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gdGV4dGFyZWEuc3R5bGU7XG5cbiAgICAgICAgLy8gSGlkZSB0aGUgZWxlbWVudCBmb3IgZGlzcGxheSBhbmQgYWNjZXNzaWJpbGl0eS4gU2V0IGEgZml4ZWQgcG9zaXRpb24gc28gdGhlIHBhZ2UgbGF5b3V0XG4gICAgICAgIC8vIGlzbid0IGFmZmVjdGVkLiBXZSB1c2UgYGZpeGVkYCB3aXRoIGB0b3A6IDBgLCBiZWNhdXNlIGZvY3VzIGlzIG1vdmVkIGludG8gdGhlIHRleHRhcmVhXG4gICAgICAgIC8vIGZvciBhIHNwbGl0IHNlY29uZCBhbmQgaWYgaXQncyBvZmYtc2NyZWVuLCBzb21lIGJyb3dzZXJzIHdpbGwgYXR0ZW1wdCB0byBzY3JvbGwgaXQgaW50byB2aWV3LlxuICAgICAgICBzdHlsZXMucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgICAgICBzdHlsZXMudG9wID0gc3R5bGVzLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHN0eWxlcy5sZWZ0ID0gJy05OTllbSc7XG4gICAgICAgIHRleHRhcmVhLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgICAgICB0ZXh0YXJlYS52YWx1ZSA9IHRoaXMuX3RleHQ7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dGFyZWEpO1xuICAgIH1cblxufVxuIl19
@@ -0,0 +1,164 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/cdk/platform";
4
+ import * as i2 from "./file-loader.service";
5
+ class Exif {
6
+ constructor(_platform, _fileLoader) {
7
+ this._platform = _platform;
8
+ this._fileLoader = _fileLoader;
9
+ this.transformImage = (image, type, orientation, quality = 100) => {
10
+ // Create the canvas and context.
11
+ const canvas = document.createElement('canvas');
12
+ const context = canvas.getContext('2d');
13
+ // Validate the context exists.
14
+ if (!context) {
15
+ return null;
16
+ }
17
+ // Set the canvas size based on the image.
18
+ const { width, height } = image;
19
+ canvas.width = width;
20
+ canvas.height = height;
21
+ // Validate the orientation is correct
22
+ // else flip the canvas sizes.
23
+ if (4 < orientation && orientation < 9) {
24
+ canvas.width = height;
25
+ canvas.height = width;
26
+ }
27
+ // Transform the context based on the orientation.
28
+ switch (orientation) {
29
+ case 2:
30
+ context.transform(-1, 0, 0, 1, width, 0);
31
+ break;
32
+ case 3:
33
+ context.transform(-1, 0, 0, -1, width, height);
34
+ break;
35
+ case 4:
36
+ context.transform(1, 0, 0, -1, 0, height);
37
+ break;
38
+ case 5:
39
+ context.transform(0, 1, 1, 0, 0, 0);
40
+ break;
41
+ case 6:
42
+ context.transform(0, 1, -1, 0, height, 0);
43
+ break;
44
+ case 7:
45
+ context.transform(0, -1, -1, 0, height, width);
46
+ break;
47
+ case 8:
48
+ context.transform(0, -1, 1, 0, 0, width);
49
+ break;
50
+ default:
51
+ break;
52
+ }
53
+ // Draw the image on the context and return the data URL.
54
+ context.drawImage(image, 0, 0, width, height);
55
+ return canvas.toDataURL(type, quality / 100);
56
+ };
57
+ this.getSupportedCanvasType = (fileType) => {
58
+ switch (fileType) {
59
+ case 'image/jpeg':
60
+ case 'image/jpg':
61
+ return 'image/jpeg';
62
+ case 'image/x-windows-bmp':
63
+ case 'image/bmp':
64
+ return 'image/bmp';
65
+ default:
66
+ return 'image/png';
67
+ }
68
+ };
69
+ this.getOrientation = (buffer) => {
70
+ // Create a new data view.
71
+ const view = new DataView(buffer);
72
+ if (view.getUint16(0, false) !== 0xFFD8) {
73
+ return -2;
74
+ }
75
+ const length = view.byteLength;
76
+ let offset = 2;
77
+ while (offset < length) {
78
+ if (view.getUint16(offset + 2, false) <= 8) {
79
+ return -1;
80
+ }
81
+ const marker = view.getUint16(offset, false);
82
+ offset += 2;
83
+ if (marker === 0xFFE1) {
84
+ if (view.getUint32(offset += 2, false) !== 0x45786966) {
85
+ return -1;
86
+ }
87
+ const little = view.getUint16(offset += 6, false) === 0x4949;
88
+ offset += view.getUint32(offset + 4, little);
89
+ const tags = view.getUint16(offset, little);
90
+ offset += 2;
91
+ for (let index = 0; index < tags; index++) {
92
+ if (view.getUint16(offset + index * 12, little) === 0x0112) {
93
+ return view.getUint16(offset + index * 12 + 8, little);
94
+ }
95
+ }
96
+ }
97
+ else if ((marker & 0xFF00) !== 0xFF00) {
98
+ break;
99
+ }
100
+ else {
101
+ offset += view.getUint16(offset, false);
102
+ }
103
+ }
104
+ return -1;
105
+ };
106
+ }
107
+ async strip(file, quality = 100) {
108
+ // Validate we are on a browser.
109
+ if (!this._platform.isBrowser) {
110
+ return file;
111
+ }
112
+ // Validate the file exists and is
113
+ // an instance of a File object.
114
+ if (!file || !(file instanceof File)) {
115
+ return file;
116
+ }
117
+ // Only jpeg images need correction.
118
+ if (!['image/jpeg'].includes(file.type)) {
119
+ return file;
120
+ }
121
+ try {
122
+ // Read the file as an array buffer and data url.
123
+ const arrayBuffer = await this._fileLoader.asArrayBuffer(file);
124
+ const dataUrl = await this._fileLoader.asDataUrl(file);
125
+ // Create an image element.
126
+ const imageElement = await this.createImageElement(dataUrl);
127
+ // Get the orientation by using the buffer.
128
+ const orientation = this.getOrientation(arrayBuffer);
129
+ // Transform the image to remove the orientation.
130
+ const canvasType = this.getSupportedCanvasType(file.type);
131
+ const imageUrl = this.transformImage(imageElement, canvasType, orientation, quality);
132
+ // Validate the image url exists.
133
+ if (!imageUrl) {
134
+ return file;
135
+ }
136
+ // Transform the image url to a file.
137
+ return this._fileLoader.fromDataUrl(imageUrl, file.name);
138
+ }
139
+ catch {
140
+ // When something goes wrong we
141
+ // just return the default file.
142
+ return file;
143
+ }
144
+ }
145
+ async createImageElement(dataUrl) {
146
+ return new Promise((resolve, reject) => {
147
+ const image = new Image();
148
+ image.src = dataUrl;
149
+ image.onerror = () => reject('Error image create');
150
+ image.onabort = () => reject('Abort image create');
151
+ image.onload = () => resolve(image);
152
+ });
153
+ }
154
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: Exif, deps: [{ token: i1.Platform }, { token: i2.FileLoader }], target: i0.ɵɵFactoryTarget.Injectable }); }
155
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: Exif, providedIn: 'root' }); }
156
+ }
157
+ export { Exif };
158
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: Exif, decorators: [{
159
+ type: Injectable,
160
+ args: [{
161
+ providedIn: 'root'
162
+ }]
163
+ }], ctorParameters: function () { return [{ type: i1.Platform }, { type: i2.FileLoader }]; } });
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhpZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmItZm91bmRhdGlvbi9zcmMvbGliL2NvcmUvc2VydmljZXMvZXhpZi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7Ozs7QUFFekMsTUFHYSxJQUFJO0lBRWIsWUFBb0IsU0FBbUIsRUFDbkIsV0FBdUI7UUFEdkIsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQTJEbkMsbUJBQWMsR0FBRyxDQUFDLEtBQXVCLEVBQUUsSUFBWSxFQUFFLFdBQW1CLEVBQUUsVUFBa0IsR0FBRyxFQUFFLEVBQUU7WUFDM0csaUNBQWlDO1lBQ2pDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV4QywrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDVixPQUFPLElBQUksQ0FBQzthQUNmO1lBRUQsMENBQTBDO1lBQzFDLE1BQU0sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBRXZCLHNDQUFzQztZQUN0Qyw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLEdBQUcsV0FBVyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7Z0JBQ3BDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO2dCQUN0QixNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUN6QjtZQUVELGtEQUFrRDtZQUNsRCxRQUFRLFdBQVcsRUFB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VyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUQ7UUFBQyxNQUFNO1lBQ0osK0JBQStCO1lBQy9CLGdDQUFnQztZQUNoQyxPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFlO1FBQzVDLE9BQU8sSUFBSSxPQUFPLENBQW1CLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFDMUIsS0FBSyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7WUFDcEIsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNuRCxLQUFLLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ25ELEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs4R0E1RFEsSUFBSTtrSEFBSixJQUFJLGNBRkQsTUFBTTs7U0FFVCxJQUFJOzJGQUFKLElBQUk7a0JBSGhCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtGaWxlTG9hZGVyfSBmcm9tICcuL2ZpbGUtbG9hZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtQbGF0Zm9ybX0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRXhpZiB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9wbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfZmlsZUxvYWRlcjogRmlsZUxvYWRlcikge1xuICAgIH1cblxuICAgIGFzeW5jIHN0cmlwKGZpbGU6IEZpbGUsIHF1YWxpdHk6IG51bWJlciA9IDEwMCkge1xuICAgICAgICAvLyBWYWxpZGF0ZSB3ZSBhcmUgb24gYSBicm93c2VyLlxuICAgICAgICBpZiAoIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZmlsZSBleGlzdHMgYW5kIGlzXG4gICAgICAgIC8vIGFuIGluc3RhbmNlIG9mIGEgRmlsZSBvYmplY3QuXG4gICAgICAgIGlmICghZmlsZSB8fCAhKGZpbGUgaW5zdGFuY2VvZiBGaWxlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IGpwZWcgaW1hZ2VzIG5lZWQgY29ycmVjdGlvbi5cbiAgICAgICAgaWYgKCFbJ2ltYWdlL2pwZWcnXS5pbmNsdWRlcyhmaWxlLnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBmaWxlIGFzIGFuIGFycmF5IGJ1ZmZlciBhbmQgZGF0YSB1cmwuXG4gICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IHRoaXMuX2ZpbGVMb2FkZXIuYXNBcnJheUJ1ZmZlcihmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFVcmwgPSBhd2FpdCB0aGlzLl9maWxlTG9hZGVyLmFzRGF0YVVybChmaWxlKTtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGltYWdlIGVsZW1lbnQuXG4gICAgICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBhd2FpdCB0aGlzLmNyZWF0ZUltYWdlRWxlbWVudChkYXRhVXJsKTtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBvcmllbnRhdGlvbiBieSB1c2luZyB0aGUgYnVmZmVyLlxuICAgICAgICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSB0aGlzLmdldE9yaWVudGF0aW9uKGFycmF5QnVmZmVyKTtcblxuICAgICAgICAgICAgLy8gVHJhbnNmb3JtIHRoZSBpbWFnZSB0byByZW1vdmUgdGhlIG9yaWVudGF0aW9uLlxuICAgICAgICAgICAgY29uc3QgY2FudmFzVHlwZSA9IHRoaXMuZ2V0U3VwcG9ydGVkQ2FudmFzVHlwZShmaWxlLnR5cGUpO1xuICAgICAgICAgICAgY29uc3QgaW1hZ2VVcmwgPSB0aGlzLnRyYW5zZm9ybUltYWdlKGltYWdlRWxlbWVudCwgY2FudmFzVHlwZSwgb3JpZW50YXRpb24sIHF1YWxpdHkpO1xuXG4gICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgaW1hZ2UgdXJsIGV4aXN0cy5cbiAgICAgICAgICAgIGlmICghaW1hZ2VVcmwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJhbnNmb3JtIHRoZSBpbWFnZSB1cmwgdG8gYSBmaWxlLlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVMb2FkZXIuZnJvbURhdGFVcmwoaW1hZ2VVcmwsIGZpbGUubmFtZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gV2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3ZVxuICAgICAgICAgICAgLy8ganVzdCByZXR1cm4gdGhlIGRlZmF1bHQgZmlsZS5cbiAgICAgICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVJbWFnZUVsZW1lbnQoZGF0YVVybDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gZGF0YVVybDtcbiAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoJ0Vycm9yIGltYWdlIGNyZWF0ZScpO1xuICAgICAgICAgICAgaW1hZ2Uub25hYm9ydCA9ICgpID0+IHJlamVjdCgnQWJvcnQgaW1hZ2UgY3JlYXRlJyk7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1JbWFnZSA9IChpbWFnZTogSFRNTEltYWdlRWxlbWVudCwgdHlwZTogc3RyaW5nLCBvcmllbnRhdGlvbjogbnVtYmVyLCBxdWFsaXR5OiBudW1iZXIgPSAxMDApID0+IHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjYW52YXMgYW5kIGNvbnRleHQuXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGNvbnRleHQgZXhpc3RzLlxuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBjYW52YXMgc2l6ZSBiYXNlZCBvbiB0aGUgaW1hZ2UuXG4gICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGltYWdlO1xuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcblxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgb3JpZW50YXRpb24gaXMgY29ycmVjdFxuICAgICAgICAvLyBlbHNlIGZsaXAgdGhlIGNhbnZhcyBzaXplcy5cbiAgICAgICAgaWYgKDQgPCBvcmllbnRhdGlvbiAmJiBvcmllbnRhdGlvbiA8IDkpIHtcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGhlaWdodDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSB3aWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgY29udGV4dCBiYXNlZCBvbiB0aGUgb3JpZW50YXRpb24uXG4gICAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBjb250ZXh0LnRyYW5zZm9ybSgtMSwgMCwgMCwgMSwgd2lkdGgsIDApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIGNvbnRleHQudHJhbnNmb3JtKC0xLCAwLCAwLCAtMSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgY29udGV4dC50cmFuc2Zvcm0oMSwgMCwgMCwgLTEsIDAsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgY29udGV4dC50cmFuc2Zvcm0oMCwgMSwgMSwgMCwgMCwgMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgY29udGV4dC50cmFuc2Zvcm0oMCwgMSwgLTEsIDAsIGhlaWdodCwgMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgY29udGV4dC50cmFuc2Zvcm0oMCwgLTEsIC0xLCAwLCBoZWlnaHQsIHdpZHRoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICBjb250ZXh0LnRyYW5zZm9ybSgwLCAtMSwgMSwgMCwgMCwgd2lkdGgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERyYXcgdGhlIGltYWdlIG9uIHRoZSBjb250ZXh0IGFuZCByZXR1cm4gdGhlIGRhdGEgVVJMLlxuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKHR5cGUsIHF1YWxpdHkgLyAxMDApO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGdldFN1cHBvcnRlZENhbnZhc1R5cGUgPSAoZmlsZVR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICBzd2l0Y2ggKGZpbGVUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICdpbWFnZS9qcGVnJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlL2pwZyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdpbWFnZS9qcGVnJztcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlL3gtd2luZG93cy1ibXAnOlxuICAgICAgICAgICAgY2FzZSAnaW1hZ2UvYm1wJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2ltYWdlL2JtcCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnaW1hZ2UvcG5nJztcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGdldE9yaWVudGF0aW9uID0gKGJ1ZmZlcjogQXJyYXlCdWZmZXIpID0+IHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRhdGEgdmlldy5cbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpO1xuXG4gICAgICAgIGlmICh2aWV3LmdldFVpbnQxNigwLCBmYWxzZSkgIT09IDB4RkZEOCkge1xuICAgICAgICAgICAgcmV0dXJuIC0yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdmlldy5ieXRlTGVuZ3RoO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMjtcblxuICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodmlldy5nZXRVaW50MTYob2Zmc2V0ICsgMiwgZmFsc2UpIDw9IDgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IHZpZXcuZ2V0VWludDE2KG9mZnNldCwgZmFsc2UpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG5cbiAgICAgICAgICAgIGlmIChtYXJrZXIgPT09IDB4RkZFMSkge1xuICAgICAgICAgICAgICAgIGlmICh2aWV3LmdldFVpbnQzMihvZmZzZXQgKz0gMiwgZmFsc2UpICE9PSAweDQ1Nzg2OTY2KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsaXR0bGUgPSB2aWV3LmdldFVpbnQxNihvZmZzZXQgKz0gNiwgZmFsc2UpID09PSAweDQ5NDk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIGxpdHRsZSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0YWdzID0gdmlldy5nZXRVaW50MTYob2Zmc2V0LCBsaXR0bGUpO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSAyO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRhZ3M7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcuZ2V0VWludDE2KG9mZnNldCArIGluZGV4ICogMTIsIGxpdHRsZSkgPT09IDB4MDExMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpZXcuZ2V0VWludDE2KG9mZnNldCArIGluZGV4ICogMTIgKyA4LCBsaXR0bGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICgobWFya2VyICYgMHhGRjAwKSAhPT0gMHhGRjAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSB2aWV3LmdldFVpbnQxNihvZmZzZXQsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9O1xuXG59XG4iXX0=
@@ -0,0 +1,88 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ class FileLoader {
4
+ constructor() {
5
+ this.isFile = (input) => {
6
+ return 'File' in window && input instanceof File;
7
+ };
8
+ this.isBlob = (input) => {
9
+ return 'Blob' in window && input instanceof Blob;
10
+ };
11
+ this.blobToFile = (blob, fileName) => {
12
+ const anyBlob = blob;
13
+ anyBlob.lastModifiedDate = new Date();
14
+ anyBlob.name = fileName;
15
+ return anyBlob;
16
+ };
17
+ }
18
+ fromDataUrl(value, name = 'file') {
19
+ if (!value) {
20
+ return null;
21
+ }
22
+ try {
23
+ // Convert base64 to raw binary data held in a string.
24
+ const byteString = window.atob(value.split(',')[1]);
25
+ // Separate out the mime component.
26
+ const mimeString = value
27
+ .split(',')[0]
28
+ .split(':')[1]
29
+ .split(';')[0];
30
+ // Write the bytes of the string to an ArrayBuffer.
31
+ const arrayBuffer = new ArrayBuffer(byteString.length);
32
+ const uint8Array = new Uint8Array(arrayBuffer);
33
+ for (let index = 0; index < byteString.length; index++) {
34
+ uint8Array[index] = byteString.charCodeAt(index);
35
+ }
36
+ const dataView = new DataView(arrayBuffer);
37
+ const blob = new Blob([dataView.buffer], { type: mimeString });
38
+ return this.createFile(blob, name);
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ asDataUrl(file) {
45
+ return this.read(file, 'dataurl');
46
+ }
47
+ asArrayBuffer(file) {
48
+ return this.read(file, 'arraybuffer');
49
+ }
50
+ async read(file, type) {
51
+ return new Promise((resolve, reject) => {
52
+ const isFileLike = this.isFile(file) || this.isBlob(file);
53
+ if (!file || !isFileLike) {
54
+ return reject('Invalid file');
55
+ }
56
+ const reader = new FileReader();
57
+ reader.onerror = () => reject('Error file read');
58
+ reader.onabort = () => reject('Abort file read');
59
+ reader.onload = () => {
60
+ const result = reader.result;
61
+ return resolve(result);
62
+ };
63
+ if (type === 'dataurl') {
64
+ reader.readAsDataURL(file);
65
+ }
66
+ else if (type === 'arraybuffer') {
67
+ reader.readAsArrayBuffer(file);
68
+ }
69
+ });
70
+ }
71
+ createFile(blob, name) {
72
+ if (!navigator['msSaveBlob']) {
73
+ return new File([blob], name, { lastModified: Date.now(), type: blob?.type });
74
+ }
75
+ const blobFile = new Blob([blob], { type: blob?.type });
76
+ return this.blobToFile(blobFile, name);
77
+ }
78
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FileLoader, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
79
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FileLoader, providedIn: 'root' }); }
80
+ }
81
+ export { FileLoader };
82
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: FileLoader, decorators: [{
83
+ type: Injectable,
84
+ args: [{
85
+ providedIn: 'root'
86
+ }]
87
+ }] });
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1sb2FkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JiLWZvdW5kYXRpb24vc3JjL2xpYi9jb3JlL3NlcnZpY2VzL2ZpbGUtbG9hZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7QUFFekMsTUFHYSxVQUFVO0lBSHZCO1FBbUVZLFdBQU0sR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFO1lBQ2hDLE9BQU8sTUFBTSxJQUFJLE1BQU0sSUFBSSxLQUFLLFlBQVksSUFBSSxDQUFDO1FBQ3JELENBQUMsQ0FBQztRQUVNLFdBQU0sR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFO1lBQ2hDLE9BQU8sTUFBTSxJQUFJLE1BQU0sSUFBSSxLQUFLLFlBQVksSUFBSSxDQUFDO1FBQ3JELENBQUMsQ0FBQztRQVdNLGVBQVUsR0FBRyxDQUFDLElBQVUsRUFBRSxRQUFnQixFQUFFLEVBQUU7WUFDbEQsTUFBTSxPQUFPLEdBQVEsSUFBSSxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3RDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1lBQ3hCLE9BQU8sT0FBZSxDQUFDO1FBQzNCLENBQUMsQ0FBQztLQUVMO0lBdEZHLFdBQVcsQ0FBQyxLQUFhLEVBQUUsT0FBZSxNQUFNO1FBQzVDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSTtZQUNBLHNEQUFzRDtZQUN0RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVwRCxtQ0FBbUM7WUFDbkMsTUFBTSxVQUFVLEdBQUcsS0FBSztp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QUFJLEVBQUMsQ0FBQyxDQUFDO1NBQy9FO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7OEdBL0VRLFVBQVU7a0hBQVYsVUFBVSxjQUZQLE1BQU07O1NBRVQsVUFBVTsyRkFBVixVQUFVO2tCQUh0QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRmlsZUxvYWRlciB7XG5cbiAgICBmcm9tRGF0YVVybCh2YWx1ZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcgPSAnZmlsZScpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQ29udmVydCBiYXNlNjQgdG8gcmF3IGJpbmFyeSBkYXRhIGhlbGQgaW4gYSBzdHJpbmcuXG4gICAgICAgICAgICBjb25zdCBieXRlU3RyaW5nID0gd2luZG93LmF0b2IodmFsdWUuc3BsaXQoJywnKVsxXSk7XG5cbiAgICAgICAgICAgIC8vIFNlcGFyYXRlIG91dCB0aGUgbWltZSBjb21wb25lbnQuXG4gICAgICAgICAgICBjb25zdCBtaW1lU3RyaW5nID0gdmFsdWVcbiAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVswXVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnOicpWzFdXG4gICAgICAgICAgICAgICAgLnNwbGl0KCc7JylbMF07XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBieXRlcyBvZiB0aGUgc3RyaW5nIHRvIGFuIEFycmF5QnVmZmVyLlxuICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBieXRlU3RyaW5nLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIHVpbnQ4QXJyYXlbaW5kZXhdID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtkYXRhVmlldy5idWZmZXJdLCB7dHlwZTogbWltZVN0cmluZ30pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGaWxlKGJsb2IsIG5hbWUpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXNEYXRhVXJsKGZpbGU6IEZpbGUgfCBCbG9iKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWQ8c3RyaW5nPihmaWxlLCAnZGF0YXVybCcpO1xuICAgIH1cblxuICAgIGFzQXJyYXlCdWZmZXIoZmlsZTogRmlsZSB8IEJsb2IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZDxBcnJheUJ1ZmZlcj4oZmlsZSwgJ2FycmF5YnVmZmVyJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkPFQgPSBzdHJpbmcgfCBBcnJheUJ1ZmZlcj4oZmlsZTogRmlsZSB8IEJsb2IsIHR5cGU6ICdkYXRhdXJsJyB8ICdhcnJheWJ1ZmZlcicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzRmlsZUxpa2UgPSB0aGlzLmlzRmlsZShmaWxlKSB8fCB0aGlzLmlzQmxvYihmaWxlKTtcbiAgICAgICAgICAgIGlmICghZmlsZSB8fCAhaXNGaWxlTGlrZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoJ0ludmFsaWQgZmlsZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoJ0Vycm9yIGZpbGUgcmVhZCcpO1xuICAgICAgICAgICAgcmVhZGVyLm9uYWJvcnQgPSAoKSA9PiByZWplY3QoJ0Fib3J0IGZpbGUgcmVhZCcpO1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZWFkZXIucmVzdWx0IGFzIHVua25vd247XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0IGFzIFQpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdkYXRhdXJsJykge1xuICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXJyYXlidWZmZXInKSB7XG4gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRmlsZSA9IChpbnB1dDogdW5rbm93bikgPT4ge1xuICAgICAgICByZXR1cm4gJ0ZpbGUnIGluIHdpbmRvdyAmJiBpbnB1dCBpbnN0YW5jZW9mIEZpbGU7XG4gICAgfTtcblxuICAgIHByaXZhdGUgaXNCbG9iID0gKGlucHV0OiB1bmtub3duKSA9PiB7XG4gICAgICAgIHJldHVybiAnQmxvYicgaW4gd2luZG93ICYmIGlucHV0IGluc3RhbmNlb2YgQmxvYjtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjcmVhdGVGaWxlKGJsb2I6IEJsb2IsIG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIW5hdmlnYXRvclsnbXNTYXZlQmxvYiddKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoW2Jsb2JdLCBuYW1lLCB7bGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpLCB0eXBlOiBibG9iPy50eXBlfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBibG9iRmlsZSA9IG5ldyBCbG9iKFtibG9iXSwge3R5cGU6IGJsb2I/LnR5cGV9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvYlRvRmlsZShibG9iRmlsZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBibG9iVG9GaWxlID0gKGJsb2I6IEJsb2IsIGZpbGVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgYW55QmxvYjogYW55ID0gYmxvYjtcbiAgICAgICAgYW55QmxvYi5sYXN0TW9kaWZpZWREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgYW55QmxvYi5uYW1lID0gZmlsZU5hbWU7XG4gICAgICAgIHJldHVybiBhbnlCbG9iIGFzIEZpbGU7XG4gICAgfTtcblxufVxuIl19
@@ -0,0 +1,124 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "./exif.service";
4
+ import * as i2 from "@angular/cdk/platform";
5
+ import * as i3 from "./file-loader.service";
6
+ class ImageConverter {
7
+ constructor(_exif, _platform, _fileLoader) {
8
+ this._exif = _exif;
9
+ this._platform = _platform;
10
+ this._fileLoader = _fileLoader;
11
+ // Data.
12
+ this._types = ['image/png', 'image/jpeg'];
13
+ this.calculateOffsetAndDimensions = (image, canvasWidth, canvasHeight) => {
14
+ const originalWidth = image.width;
15
+ const originalHeight = image.height;
16
+ const widthRatio = canvasWidth / originalWidth;
17
+ const heightRatio = canvasHeight / originalHeight;
18
+ let width;
19
+ let height;
20
+ if (originalWidth > originalHeight) {
21
+ height = originalHeight * heightRatio;
22
+ width = (originalWidth / originalHeight) * height;
23
+ }
24
+ else {
25
+ width = originalWidth * widthRatio;
26
+ height = (originalHeight / originalWidth) * width;
27
+ }
28
+ let xOffset = 0;
29
+ let yOffset = 0;
30
+ if (canvasHeight === height) {
31
+ xOffset = -((width - canvasWidth) / 2);
32
+ }
33
+ else if (canvasWidth === width) {
34
+ yOffset = -((height - canvasHeight) / 2);
35
+ }
36
+ return { xOffset, yOffset, width, height };
37
+ };
38
+ }
39
+ async toDataUri(contents, options = null) {
40
+ // Check if the current platform is a browser.
41
+ if (!this._platform.isBrowser) {
42
+ return null;
43
+ }
44
+ // Get the image.
45
+ const image = await this.getImage(contents);
46
+ // Get the canvas width and height.
47
+ const canvasWidth = options?.width || image?.width;
48
+ const canvasHeight = options?.height || image?.height;
49
+ // Get the canvas and context.
50
+ const canvas = document.createElement('canvas');
51
+ const context = canvas.getContext('2d');
52
+ // Validate the context exists.
53
+ if (!context) {
54
+ return null;
55
+ }
56
+ // Set the width and height.
57
+ canvas.width = canvasWidth;
58
+ canvas.height = canvasHeight;
59
+ // When the canvas sizes are 0 we have failed.
60
+ if (canvas?.width === 0 && canvas?.height === 0) {
61
+ return null;
62
+ }
63
+ // Check if dimensions where supplied, else create the image.
64
+ if (!options) {
65
+ // Draw the image.
66
+ context.drawImage(image, 0, 0);
67
+ // Convert the canvas to a data url.
68
+ return canvas.toDataURL(this._types[0]);
69
+ }
70
+ // Get the dimensions and offsets.
71
+ const { width, height, xOffset, yOffset } = this.calculateOffsetAndDimensions(image, canvasWidth, canvasHeight);
72
+ // Draw the image.
73
+ context.drawImage(image, 0, 0, image.width, image.height, xOffset, yOffset, width, height);
74
+ // Convert the canvas to a data url.
75
+ return canvas.toDataURL(this._types[0]);
76
+ }
77
+ async fileToImage(file, types = this._types) {
78
+ // Check if the file matches an image.
79
+ if (!types.includes(file.type)) {
80
+ throw new Error('The selected file does not meet the required format.');
81
+ }
82
+ let stripped = null;
83
+ try {
84
+ stripped = await this._exif.strip(file, 90);
85
+ }
86
+ catch {
87
+ // Do nothing.
88
+ }
89
+ // Ge the data uri.
90
+ const dataUri = await this._fileLoader.asDataUrl(stripped ?? file);
91
+ // Convert the data URI to a image element.
92
+ return await this.stringToImage(dataUri);
93
+ }
94
+ stringToImage(src) {
95
+ return new Promise((resolve, reject) => {
96
+ const image = new Image();
97
+ image.src = src;
98
+ image.onload = () => resolve(image);
99
+ image.onerror = error => reject(error);
100
+ });
101
+ }
102
+ async getImage(contents) {
103
+ // If the contents is already an HTML image element just return it.
104
+ if (contents instanceof HTMLImageElement) {
105
+ return contents;
106
+ }
107
+ // If the contents is a file convert it to an HTML image element.
108
+ if (contents instanceof File) {
109
+ return this.fileToImage(contents);
110
+ }
111
+ // If the contents is a string convert it to an HTML image element.
112
+ return this.stringToImage(contents);
113
+ }
114
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ImageConverter, deps: [{ token: i1.Exif }, { token: i2.Platform }, { token: i3.FileLoader }], target: i0.ɵɵFactoryTarget.Injectable }); }
115
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ImageConverter, providedIn: 'root' }); }
116
+ }
117
+ export { ImageConverter };
118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: ImageConverter, decorators: [{
119
+ type: Injectable,
120
+ args: [{
121
+ providedIn: 'root'
122
+ }]
123
+ }], ctorParameters: function () { return [{ type: i1.Exif }, { type: i2.Platform }, { type: i3.FileLoader }]; } });
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY29udmVydGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYi1mb3VuZGF0aW9uL3NyYy9saWIvY29yZS9zZXJ2aWNlcy9pbWFnZS1jb252ZXJ0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDOzs7OztBQUd6QyxNQUdhLGNBQWM7SUFLdkIsWUFBb0IsS0FBVyxFQUNYLFNBQW1CLEVBQ25CLFdBQXVCO1FBRnZCLFVBQUssR0FBTCxLQUFLLENBQU07UUFDWCxjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ25CLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBTDNDLFFBQVE7UUFDUyxXQUFNLEdBQUcsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFxRzlDLGlDQUE0QixHQUFHLENBQUMsS0FBdUIsRUFBRSxXQUFtQixFQUFFLFlBQW9CLEVBQUUsRUFBRTtZQUMxRyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ2xDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFFcEMsTUFBTSxVQUFVLEdBQUcsV0FBVyxHQUFHLGFBQWEsQ0FBQztZQUMvQyxNQUFNLFdBQVcsR0FBRyxZQUFZLEdBQUcsY0FBYyxDQUFDO1lBRWxELElBQUksS0FBYSxDQUFDO1lBQ2xCLElBQUksTUFBYyxDQUFDO1lBRW5CLElBQUksYUFBYSxHQUFHLGNBQWMsRUFBRTtnQkFDaEMsTUFBTSxHQUFHLGNBQWMsR0FBRyxXQUFXLENBQUM7Z0JBQ3RDLEtBQUssR0FBRyxDQUFDLGFBQWEsR0FBRyxjQUFjLENBQUMsR0FBRyxNQUFNLENBQUM7YUFDckQ7aUJBQU07Z0JBQ0gsS0FBSyxHQUFHLGFBQWEsR0FBRyxVQUFVLENBQUM7Z0JBQ25DLE1BQU0sR0FBRyxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUM7YUFDckQ7WUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDaEIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBRWhCLElBQUksWUFBWSxLQUFLLE1BQU0sRUFBRTtnQkFDekIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMxQztpQkFBTSxJQUFJLFdBQVcsS0FBSyxLQUFLLEVBQUU7Z0JBQzlCLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDNUM7WUFFRCxPQUFPLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDO0lBNUhGLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQTBDLEVBQUUsVUFBb0QsSUFBSTtRQUNoSCw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxpQkFBaUI7UUFDakIsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVDLG1DQUFtQztRQUNuQyxNQUFNLFdBQVcsR0FBRyxPQUFPLEVBQUUsS0FBSyxJQUFJLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDbkQsTUFBTSxZQUFZLEdBQUcsT0FBTyxFQUFFLE1BQU0sSUFBSSxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBRXRELDhCQUE4QjtRQUM5QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEMsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDVixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsNEJBQTRCO1FBQzVCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO1FBRTdCLDhDQUE4QztRQUM5QyxJQUFJLE1BQU0sRUFBRSxLQUFLLEtBQUssQ0FBQyxJQUFJLE1BQU0sRUFBRSxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzdDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLGtCQUFrQjtZQUNsQixPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFL0Isb0NBQW9DO1lBQ3BDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0M7UUFFRCxrQ0FBa0M7UUFDbEMsTUFBTSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRTlHLGtCQUFrQjtRQUNsQixPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzRixvQ0FBb0M7UUFDcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFVLEVBQUUsUUFBa0IsSUFBSSxDQUFDLE1BQU07UUFDdkQsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7U0FDM0U7UUFFRCxJQUFJLFFBQVEsR0FBZ0IsSUFBSSxDQUFDO1FBQ2pDLElBQUk7WUFDQSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDL0M7UUFBQyxNQUFNO1lBQ0osY0FBYztTQUNqQjtRQUVELG1CQUFtQjtRQUNuQixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUVuRSwyQ0FBMkM7UUFDM0MsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUFXO1FBQ3JCLE9BQU8sSUFBSSxPQUFPLENBQW1CLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFDMUIsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDaEIsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQTBDO1FBQzdELG1FQUFtRTtRQUNuRSxJQUFJLFFBQVEsWUFBWSxnQkFBZ0IsRUFBRTtZQUN0QyxPQUFPLFFBQVEsQ0FBQztTQUNuQjtRQUVELGlFQUFpRTtRQUNqRSxJQUFJLFFBQVEsWUFBWSxJQUFJLEVBQUU7WUFDMUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3JDO1FBRUQsbUVBQW1FO1FBQ25FLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4QyxDQUFDOzhHQXRHUSxjQUFjO2tIQUFkLGNBQWMsY0FGWCxNQUFNOztTQUVULGNBQWM7MkZBQWQsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0ZpbGVMb2FkZXJ9IGZyb20gJy4vZmlsZS1sb2FkZXIuc2VydmljZSc7XG5pbXBvcnQge1BsYXRmb3JtfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RXhpZn0gZnJvbSAnLi9leGlmLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlQ29udmVydGVyIHtcblxuICAgIC8vIERhdGEuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdHlwZXMgPSBbJ2ltYWdlL3BuZycsICdpbWFnZS9qcGVnJ107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9leGlmOiBFeGlmLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX3BsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9maWxlTG9hZGVyOiBGaWxlTG9hZGVyKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgdG9EYXRhVXJpKGNvbnRlbnRzOiBzdHJpbmcgfCBGaWxlIHwgSFRNTEltYWdlRWxlbWVudCwgb3B0aW9uczogeyB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCA9IG51bGwpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgYSBicm93c2VyLlxuICAgICAgICBpZiAoIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIGltYWdlLlxuICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuZ2V0SW1hZ2UoY29udGVudHMpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgY2FudmFzIHdpZHRoIGFuZCBoZWlnaHQuXG4gICAgICAgIGNvbnN0IGNhbnZhc1dpZHRoID0gb3B0aW9ucz8ud2lkdGggfHwgaW1hZ2U/LndpZHRoO1xuICAgICAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBvcHRpb25zPy5oZWlnaHQgfHwgaW1hZ2U/LmhlaWdodDtcblxuICAgICAgICAvLyBHZXQgdGhlIGNhbnZhcyBhbmQgY29udGV4dC5cbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgY29udGV4dCBleGlzdHMuXG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQuXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhc1dpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gY2FudmFzSGVpZ2h0O1xuXG4gICAgICAgIC8vIFdoZW4gdGhlIGNhbnZhcyBzaXplcyBhcmUgMCB3ZSBoYXZlIGZhaWxlZC5cbiAgICAgICAgaWYgKGNhbnZhcz8ud2lkdGggPT09IDAgJiYgY2FudmFzPy5oZWlnaHQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgZGltZW5zaW9ucyB3aGVyZSBzdXBwbGllZCwgZWxzZSBjcmVhdGUgdGhlIGltYWdlLlxuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIERyYXcgdGhlIGltYWdlLlxuICAgICAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApO1xuXG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBjYW52YXMgdG8gYSBkYXRhIHVybC5cbiAgICAgICAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKHRoaXMuX3R5cGVzWzBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBhbmQgb2Zmc2V0cy5cbiAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIHhPZmZzZXQsIHlPZmZzZXR9ID0gdGhpcy5jYWxjdWxhdGVPZmZzZXRBbmREaW1lbnNpb25zKGltYWdlLCBjYW52YXNXaWR0aCwgY2FudmFzSGVpZ2h0KTtcblxuICAgICAgICAvLyBEcmF3IHRoZSBpbWFnZS5cbiAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIHhPZmZzZXQsIHlPZmZzZXQsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgdGhlIGNhbnZhcyB0byBhIGRhdGEgdXJsLlxuICAgICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCh0aGlzLl90eXBlc1swXSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZmlsZVRvSW1hZ2UoZmlsZTogRmlsZSwgdHlwZXM6IHN0cmluZ1tdID0gdGhpcy5fdHlwZXMpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgbWF0Y2hlcyBhbiBpbWFnZS5cbiAgICAgICAgaWYgKCF0eXBlcy5pbmNsdWRlcyhmaWxlLnR5cGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzZWxlY3RlZCBmaWxlIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVkIGZvcm1hdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHJpcHBlZDogRmlsZSB8IG51bGwgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RyaXBwZWQgPSBhd2FpdCB0aGlzLl9leGlmLnN0cmlwKGZpbGUsIDkwKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBEbyBub3RoaW5nLlxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2UgdGhlIGRhdGEgdXJpLlxuICAgICAgICBjb25zdCBkYXRhVXJpID0gYXdhaXQgdGhpcy5fZmlsZUxvYWRlci5hc0RhdGFVcmwoc3RyaXBwZWQgPz8gZmlsZSk7XG5cbiAgICAgICAgLy8gQ29udmVydCB0aGUgZGF0YSBVUkkgdG8gYSBpbWFnZSBlbGVtZW50LlxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdHJpbmdUb0ltYWdlKGRhdGFVcmkpO1xuICAgIH1cblxuICAgIHN0cmluZ1RvSW1hZ2Uoc3JjOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSBzcmM7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltYWdlKTtcbiAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEltYWdlKGNvbnRlbnRzOiBzdHJpbmcgfCBGaWxlIHwgSFRNTEltYWdlRWxlbWVudCkge1xuICAgICAgICAvLyBJZiB0aGUgY29udGVudHMgaXMgYWxyZWFkeSBhbiBIVE1MIGltYWdlIGVsZW1lbnQganVzdCByZXR1cm4gaXQuXG4gICAgICAgIGlmIChjb250ZW50cyBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBjb250ZW50cyBpcyBhIGZpbGUgY29udmVydCBpdCB0byBhbiBIVE1MIGltYWdlIGVsZW1lbnQuXG4gICAgICAgIGlmIChjb250ZW50cyBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGVUb0ltYWdlKGNvbnRlbnRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBjb250ZW50cyBpcyBhIHN0cmluZyBjb252ZXJ0IGl0IHRvIGFuIEhUTUwgaW1hZ2UgZWxlbWVudC5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nVG9JbWFnZShjb250ZW50cyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVPZmZzZXRBbmREaW1lbnNpb25zID0gKGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50LCBjYW52YXNXaWR0aDogbnVtYmVyLCBjYW52YXNIZWlnaHQ6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbFdpZHRoID0gaW1hZ2Uud2lkdGg7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsSGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xuXG4gICAgICAgIGNvbnN0IHdpZHRoUmF0aW8gPSBjYW52YXNXaWR0aCAvIG9yaWdpbmFsV2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodFJhdGlvID0gY2FudmFzSGVpZ2h0IC8gb3JpZ2luYWxIZWlnaHQ7XG5cbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXI7XG4gICAgICAgIGxldCBoZWlnaHQ6IG51bWJlcjtcblxuICAgICAgICBpZiAob3JpZ2luYWxXaWR0aCA+IG9yaWdpbmFsSGVpZ2h0KSB7XG4gICAgICAgICAgICBoZWlnaHQgPSBvcmlnaW5hbEhlaWdodCAqIGhlaWdodFJhdGlvO1xuICAgICAgICAgICAgd2lkdGggPSAob3JpZ2luYWxXaWR0aCAvIG9yaWdpbmFsSGVpZ2h0KSAqIGhlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpZHRoID0gb3JpZ2luYWxXaWR0aCAqIHdpZHRoUmF0aW87XG4gICAgICAgICAgICBoZWlnaHQgPSAob3JpZ2luYWxIZWlnaHQgLyBvcmlnaW5hbFdpZHRoKSAqIHdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHhPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgeU9mZnNldCA9IDA7XG5cbiAgICAgICAgaWYgKGNhbnZhc0hlaWdodCA9PT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICB4T2Zmc2V0ID0gLSgod2lkdGggLSBjYW52YXNXaWR0aCkgLyAyKTtcbiAgICAgICAgfSBlbHNlIGlmIChjYW52YXNXaWR0aCA9PT0gd2lkdGgpIHtcbiAgICAgICAgICAgIHlPZmZzZXQgPSAtKChoZWlnaHQgLSBjYW52YXNIZWlnaHQpIC8gMik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge3hPZmZzZXQsIHlPZmZzZXQsIHdpZHRoLCBoZWlnaHR9O1xuICAgIH07XG5cbn1cbiJdfQ==