spiderly 0.0.2

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 (302) hide show
  1. package/README.md +3 -0
  2. package/esm2022/lib/components/auth/auth.module.mjs +65 -0
  3. package/esm2022/lib/components/auth/login/login.component.mjs +60 -0
  4. package/esm2022/lib/components/auth/partials/auth.component.mjs +53 -0
  5. package/esm2022/lib/components/auth/partials/login-verification.component.mjs +39 -0
  6. package/esm2022/lib/components/auth/partials/registration-verification.component.mjs +37 -0
  7. package/esm2022/lib/components/auth/partials/verification-wrapper.component.mjs +74 -0
  8. package/esm2022/lib/components/auth/registration/registration.component.mjs +59 -0
  9. package/esm2022/lib/components/base-details/role-base-details.component.mjs +171 -0
  10. package/esm2022/lib/components/base-form/base-form copy.mjs +247 -0
  11. package/esm2022/lib/components/card-skeleton/card-skeleton.component.mjs +25 -0
  12. package/esm2022/lib/components/footer/footer.component.mjs +16 -0
  13. package/esm2022/lib/components/index-card/index-card.component.mjs +57 -0
  14. package/esm2022/lib/components/info-card/info-card.component.mjs +29 -0
  15. package/esm2022/lib/components/layout/layout-base.component.mjs +120 -0
  16. package/esm2022/lib/components/layout/sidebar/menuitem.component.mjs +161 -0
  17. package/esm2022/lib/components/layout/sidebar/sidebar-menu.component.mjs +34 -0
  18. package/esm2022/lib/components/layout/sidebar/sidebar-menu.service.mjs +26 -0
  19. package/esm2022/lib/components/layout/sidebar/sidebar.component.mjs +21 -0
  20. package/esm2022/lib/components/layout/topbar/topbar.component.mjs +115 -0
  21. package/esm2022/lib/components/not-found/not-found.component.mjs +20 -0
  22. package/esm2022/lib/components/required/required.component.mjs +12 -0
  23. package/esm2022/lib/components/spiderly-buttons/google-button/google-button.component.mjs +43 -0
  24. package/esm2022/lib/components/spiderly-buttons/return-button/return-button.component.mjs +37 -0
  25. package/esm2022/lib/components/spiderly-buttons/spiderly-button/spiderly-button.component.mjs +20 -0
  26. package/esm2022/lib/components/spiderly-buttons/spiderly-button-base/spiderly-button-base.mjs +68 -0
  27. package/esm2022/lib/components/spiderly-buttons/spiderly-split-button/spiderly-split-button.component.mjs +22 -0
  28. package/esm2022/lib/components/spiderly-data-table/spiderly-data-table.component.mjs +502 -0
  29. package/esm2022/lib/components/spiderly-delete-dialog/spiderly-delete-confirmation.component.mjs +42 -0
  30. package/esm2022/lib/components/spiderly-form-control/spiderly-form-control.mjs +36 -0
  31. package/esm2022/lib/components/spiderly-panels/panel-body/panel-body.component.mjs +19 -0
  32. package/esm2022/lib/components/spiderly-panels/panel-footer/panel-footer.component.mjs +14 -0
  33. package/esm2022/lib/components/spiderly-panels/panel-header/panel-header.component.mjs +49 -0
  34. package/esm2022/lib/components/spiderly-panels/spiderly-card/spiderly-card.component.mjs +20 -0
  35. package/esm2022/lib/components/spiderly-panels/spiderly-panel/spiderly-panel.component.mjs +63 -0
  36. package/esm2022/lib/components/spiderly-panels/spiderly-panels.module.mjs +49 -0
  37. package/esm2022/lib/controls/base-autocomplete-control.mjs +18 -0
  38. package/esm2022/lib/controls/base-control.mjs +62 -0
  39. package/esm2022/lib/controls/base-dropdown-control.mjs +37 -0
  40. package/esm2022/lib/controls/spiderly-autocomplete/spiderly-autocomplete.component.mjs +60 -0
  41. package/esm2022/lib/controls/spiderly-calendar/spiderly-calendar.component.mjs +39 -0
  42. package/esm2022/lib/controls/spiderly-checkbox/spiderly-checkbox.component.mjs +45 -0
  43. package/esm2022/lib/controls/spiderly-colorpick/spiderly-colorpick.component.mjs +40 -0
  44. package/esm2022/lib/controls/spiderly-controls.module.mjs +112 -0
  45. package/esm2022/lib/controls/spiderly-dropdown/spiderly-dropdown.component.mjs +40 -0
  46. package/esm2022/lib/controls/spiderly-editor/spiderly-editor.component.mjs +59 -0
  47. package/esm2022/lib/controls/spiderly-file/spiderly-file.component.mjs +106 -0
  48. package/esm2022/lib/controls/spiderly-multiautocomplete/spiderly-multiautocomplete.component.mjs +38 -0
  49. package/esm2022/lib/controls/spiderly-multiselect/spiderly-multiselect.component.mjs +34 -0
  50. package/esm2022/lib/controls/spiderly-number/spiderly-number.component.mjs +44 -0
  51. package/esm2022/lib/controls/spiderly-password/spiderly-password.component.mjs +37 -0
  52. package/esm2022/lib/controls/spiderly-textarea/spiderly-textarea.component.mjs +34 -0
  53. package/esm2022/lib/controls/spiderly-textbox/spiderly-textbox.component.mjs +45 -0
  54. package/esm2022/lib/entities/base-entity.mjs +18 -0
  55. package/esm2022/lib/entities/codebook.mjs +10 -0
  56. package/esm2022/lib/entities/init-company-auth-dialog-details.mjs +9 -0
  57. package/esm2022/lib/entities/init-top-bar-data.mjs +12 -0
  58. package/esm2022/lib/entities/is-authorized-for-save-event.mjs +9 -0
  59. package/esm2022/lib/entities/last-menu-icon-index-clicked.mjs +8 -0
  60. package/esm2022/lib/entities/lazy-load-selected-ids-result.mjs +11 -0
  61. package/esm2022/lib/entities/menuchangeevent.mjs +3 -0
  62. package/esm2022/lib/entities/mime-type.mjs +15 -0
  63. package/esm2022/lib/entities/namebook.mjs +9 -0
  64. package/esm2022/lib/entities/primeng-option.mjs +9 -0
  65. package/esm2022/lib/entities/security-entities.mjs +169 -0
  66. package/esm2022/lib/entities/simple-save-result.mjs +9 -0
  67. package/esm2022/lib/entities/spiderly-button.mjs +11 -0
  68. package/esm2022/lib/entities/table-filter-context.mjs +3 -0
  69. package/esm2022/lib/entities/table-filter-sort-meta.mjs +3 -0
  70. package/esm2022/lib/entities/table-filter.mjs +15 -0
  71. package/esm2022/lib/entities/table-response.mjs +3 -0
  72. package/esm2022/lib/enums/security-enums.mjs +26 -0
  73. package/esm2022/lib/enums/verification-type-codes.mjs +6 -0
  74. package/esm2022/lib/guards/auth.guard.mjs +40 -0
  75. package/esm2022/lib/guards/not-auth.guard.mjs +32 -0
  76. package/esm2022/lib/handlers/spiderly-error-handler.mjs +30 -0
  77. package/esm2022/lib/handlers/spiderly-transloco-fallback-strategy.mjs +24 -0
  78. package/esm2022/lib/interceptors/http-loading.interceptor.mjs +27 -0
  79. package/esm2022/lib/interceptors/json-parser.interceptor.mjs +47 -0
  80. package/esm2022/lib/interceptors/jwt.interceptor.mjs +27 -0
  81. package/esm2022/lib/interceptors/unauthorized.interceptor.mjs +64 -0
  82. package/esm2022/lib/modules/core.module.mjs +140 -0
  83. package/esm2022/lib/modules/primeng.module.mjs +278 -0
  84. package/esm2022/lib/modules/spiderly-transloco.module.mjs +44 -0
  85. package/esm2022/lib/services/api.service.security.mjs +86 -0
  86. package/esm2022/lib/services/app-initializer.mjs +6 -0
  87. package/esm2022/lib/services/app-layout-base.service.mjs +132 -0
  88. package/esm2022/lib/services/auth-base.service.mjs +220 -0
  89. package/esm2022/lib/services/base-form.service.mjs +124 -0
  90. package/esm2022/lib/services/config-base.service.mjs +33 -0
  91. package/esm2022/lib/services/helper-functions.mjs +229 -0
  92. package/esm2022/lib/services/spiderly-message.service.mjs +64 -0
  93. package/esm2022/lib/services/spiderly-transloco-loader.mjs +20 -0
  94. package/esm2022/lib/services/translate-labels-abstract.service.mjs +15 -0
  95. package/esm2022/lib/services/validator-abstract.service.mjs +51 -0
  96. package/esm2022/public-api.mjs +94 -0
  97. package/esm2022/spiderly.mjs +5 -0
  98. package/fesm2022/spiderly.mjs +4807 -0
  99. package/fesm2022/spiderly.mjs.map +1 -0
  100. package/index.d.ts +5 -0
  101. package/lib/components/auth/auth.module.d.ts +17 -0
  102. package/lib/components/auth/login/login.component.d.ts +35 -0
  103. package/lib/components/auth/partials/auth.component.d.ts +21 -0
  104. package/lib/components/auth/partials/login-verification.component.d.ts +18 -0
  105. package/lib/components/auth/partials/registration-verification.component.d.ts +17 -0
  106. package/lib/components/auth/partials/verification-wrapper.component.d.ts +31 -0
  107. package/lib/components/auth/registration/registration.component.d.ts +34 -0
  108. package/lib/components/base-details/role-base-details.component.d.ts +50 -0
  109. package/lib/components/base-form/base-form copy.d.ts +54 -0
  110. package/lib/components/card-skeleton/card-skeleton.component.d.ts +12 -0
  111. package/lib/components/footer/footer.component.d.ts +9 -0
  112. package/lib/components/index-card/index-card.component.d.ts +22 -0
  113. package/lib/components/info-card/info-card.component.d.ts +11 -0
  114. package/lib/components/layout/layout-base.component.d.ts +37 -0
  115. package/lib/components/layout/sidebar/menuitem.component.d.ts +43 -0
  116. package/lib/components/layout/sidebar/sidebar-menu.component.d.ts +23 -0
  117. package/lib/components/layout/sidebar/sidebar-menu.service.d.ts +12 -0
  118. package/lib/components/layout/sidebar/sidebar.component.d.ts +11 -0
  119. package/lib/components/layout/topbar/topbar.component.d.ts +45 -0
  120. package/lib/components/not-found/not-found.component.d.ts +9 -0
  121. package/lib/components/required/required.component.d.ts +6 -0
  122. package/lib/components/spiderly-buttons/google-button/google-button.component.d.ts +17 -0
  123. package/lib/components/spiderly-buttons/return-button/return-button.component.d.ts +10 -0
  124. package/lib/components/spiderly-buttons/spiderly-button/spiderly-button.component.d.ts +6 -0
  125. package/lib/components/spiderly-buttons/spiderly-button-base/spiderly-button-base.d.ts +27 -0
  126. package/lib/components/spiderly-buttons/spiderly-split-button/spiderly-split-button.component.d.ts +8 -0
  127. package/lib/components/spiderly-data-table/spiderly-data-table.component.d.ts +157 -0
  128. package/lib/components/spiderly-delete-dialog/spiderly-delete-confirmation.component.d.ts +11 -0
  129. package/lib/components/spiderly-form-control/spiderly-form-control.d.ts +37 -0
  130. package/lib/components/spiderly-panels/panel-body/panel-body.component.d.ts +9 -0
  131. package/lib/components/spiderly-panels/panel-footer/panel-footer.component.d.ts +8 -0
  132. package/lib/components/spiderly-panels/panel-header/panel-header.component.d.ts +29 -0
  133. package/lib/components/spiderly-panels/spiderly-card/spiderly-card.component.d.ts +10 -0
  134. package/lib/components/spiderly-panels/spiderly-panel/spiderly-panel.component.d.ts +25 -0
  135. package/lib/components/spiderly-panels/spiderly-panels.module.d.ts +13 -0
  136. package/lib/controls/base-autocomplete-control.d.ts +9 -0
  137. package/lib/controls/base-control.d.ts +23 -0
  138. package/lib/controls/base-dropdown-control.d.ts +18 -0
  139. package/lib/controls/spiderly-autocomplete/spiderly-autocomplete.component.d.ts +18 -0
  140. package/lib/controls/spiderly-calendar/spiderly-calendar.component.d.ts +13 -0
  141. package/lib/controls/spiderly-checkbox/spiderly-checkbox.component.d.ts +14 -0
  142. package/lib/controls/spiderly-colorpick/spiderly-colorpick.component.d.ts +11 -0
  143. package/lib/controls/spiderly-controls.module.d.ts +22 -0
  144. package/lib/controls/spiderly-dropdown/spiderly-dropdown.component.d.ts +14 -0
  145. package/lib/controls/spiderly-editor/spiderly-editor.component.d.ts +16 -0
  146. package/lib/controls/spiderly-file/spiderly-file.component.d.ts +36 -0
  147. package/lib/controls/spiderly-multiautocomplete/spiderly-multiautocomplete.component.d.ts +13 -0
  148. package/lib/controls/spiderly-multiselect/spiderly-multiselect.component.d.ts +11 -0
  149. package/lib/controls/spiderly-number/spiderly-number.component.d.ts +15 -0
  150. package/lib/controls/spiderly-password/spiderly-password.component.d.ts +12 -0
  151. package/lib/controls/spiderly-textarea/spiderly-textarea.component.d.ts +11 -0
  152. package/lib/controls/spiderly-textbox/spiderly-textbox.component.d.ts +15 -0
  153. package/lib/entities/base-entity.d.ts +14 -0
  154. package/lib/entities/codebook.d.ts +9 -0
  155. package/lib/entities/init-company-auth-dialog-details.d.ts +9 -0
  156. package/lib/entities/init-top-bar-data.d.ts +16 -0
  157. package/lib/entities/is-authorized-for-save-event.d.ts +9 -0
  158. package/lib/entities/last-menu-icon-index-clicked.d.ts +7 -0
  159. package/lib/entities/lazy-load-selected-ids-result.d.ts +9 -0
  160. package/lib/entities/menuchangeevent.d.ts +4 -0
  161. package/lib/entities/mime-type.d.ts +11 -0
  162. package/lib/entities/namebook.d.ts +9 -0
  163. package/lib/entities/primeng-option.d.ts +9 -0
  164. package/lib/entities/security-entities.d.ts +211 -0
  165. package/lib/entities/simple-save-result.d.ts +7 -0
  166. package/lib/entities/spiderly-button.d.ts +13 -0
  167. package/lib/entities/table-filter-context.d.ts +5 -0
  168. package/lib/entities/table-filter-sort-meta.d.ts +4 -0
  169. package/lib/entities/table-filter.d.ts +23 -0
  170. package/lib/entities/table-response.d.ts +4 -0
  171. package/lib/enums/security-enums.d.ts +22 -0
  172. package/lib/enums/verification-type-codes.d.ts +4 -0
  173. package/lib/guards/auth.guard.d.ts +15 -0
  174. package/lib/guards/not-auth.guard.d.ts +12 -0
  175. package/lib/handlers/spiderly-error-handler.d.ts +14 -0
  176. package/lib/handlers/spiderly-transloco-fallback-strategy.d.ts +13 -0
  177. package/lib/interceptors/http-loading.interceptor.d.ts +11 -0
  178. package/lib/interceptors/json-parser.interceptor.d.ts +11 -0
  179. package/lib/interceptors/jwt.interceptor.d.ts +11 -0
  180. package/lib/interceptors/unauthorized.interceptor.d.ts +16 -0
  181. package/lib/modules/core.module.d.ts +13 -0
  182. package/lib/modules/primeng.module.d.ts +42 -0
  183. package/lib/modules/spiderly-transloco.module.d.ts +9 -0
  184. package/lib/services/api.service.security.d.ts +35 -0
  185. package/lib/services/app-initializer.d.ts +4 -0
  186. package/lib/services/app-layout-base.service.d.ts +60 -0
  187. package/lib/services/auth-base.service.d.ts +55 -0
  188. package/lib/services/base-form.service.d.ts +27 -0
  189. package/lib/services/config-base.service.d.ts +24 -0
  190. package/lib/services/helper-functions.d.ts +37 -0
  191. package/lib/services/spiderly-message.service.d.ts +17 -0
  192. package/lib/services/spiderly-transloco-loader.d.ts +10 -0
  193. package/lib/services/translate-labels-abstract.service.d.ts +7 -0
  194. package/lib/services/validator-abstract.service.d.ts +13 -0
  195. package/package.json +60 -0
  196. package/public-api.d.ts +90 -0
  197. package/styles/components/spiderly-data-table/spiderly-data-table.component.scss +34 -0
  198. package/styles/components/spiderly-panels/panel-footer/panel-footer.component.scss +10 -0
  199. package/styles/styles/layout/_config.scss +42 -0
  200. package/styles/styles/layout/_content.scss +12 -0
  201. package/styles/styles/layout/_footer.scss +9 -0
  202. package/styles/styles/layout/_main.scss +28 -0
  203. package/styles/styles/layout/_menu.scss +135 -0
  204. package/styles/styles/layout/_mixins.scss +13 -0
  205. package/styles/styles/layout/_preloading.scss +47 -0
  206. package/styles/styles/layout/_responsive.scss +100 -0
  207. package/styles/styles/layout/_spiderly-controls.scss +12 -0
  208. package/styles/styles/layout/_topbar.scss +231 -0
  209. package/styles/styles/layout/_typography.scss +63 -0
  210. package/styles/styles/layout/_utils.scss +20 -0
  211. package/styles/styles/layout/_variables.scss +903 -0
  212. package/styles/styles/layout/layout.scss +13 -0
  213. package/styles/styles/shared.scss +519 -0
  214. package/styles/styles/styles.scss +6 -0
  215. package/styles/styles/theme/base/_colors.scss +18 -0
  216. package/styles/styles/theme/base/_common.scss +75 -0
  217. package/styles/styles/theme/base/_components.scss +106 -0
  218. package/styles/styles/theme/base/_mixins.scss +343 -0
  219. package/styles/styles/theme/base/components/button/_button.scss +564 -0
  220. package/styles/styles/theme/base/components/button/_speeddial.scss +96 -0
  221. package/styles/styles/theme/base/components/button/_splitbutton.scss +381 -0
  222. package/styles/styles/theme/base/components/data/_carousel.scss +37 -0
  223. package/styles/styles/theme/base/components/data/_datatable.scss +338 -0
  224. package/styles/styles/theme/base/components/data/_dataview.scss +55 -0
  225. package/styles/styles/theme/base/components/data/_filter.scss +138 -0
  226. package/styles/styles/theme/base/components/data/_orderlist.scss +103 -0
  227. package/styles/styles/theme/base/components/data/_organizationchart.scss +50 -0
  228. package/styles/styles/theme/base/components/data/_paginator.scss +92 -0
  229. package/styles/styles/theme/base/components/data/_picklist.scss +103 -0
  230. package/styles/styles/theme/base/components/data/_timeline.scss +81 -0
  231. package/styles/styles/theme/base/components/data/_tree.scss +149 -0
  232. package/styles/styles/theme/base/components/data/_treetable.scss +256 -0
  233. package/styles/styles/theme/base/components/data/_virtualscroller.scss +28 -0
  234. package/styles/styles/theme/base/components/file/_fileupload.scss +64 -0
  235. package/styles/styles/theme/base/components/input/_autocomplete.scss +118 -0
  236. package/styles/styles/theme/base/components/input/_calendar.scss +263 -0
  237. package/styles/styles/theme/base/components/input/_cascadeselect.scss +130 -0
  238. package/styles/styles/theme/base/components/input/_checkbox.scss +90 -0
  239. package/styles/styles/theme/base/components/input/_chips.scss +55 -0
  240. package/styles/styles/theme/base/components/input/_colorpicker.scss +26 -0
  241. package/styles/styles/theme/base/components/input/_dropdown.scss +152 -0
  242. package/styles/styles/theme/base/components/input/_editor.scss +122 -0
  243. package/styles/styles/theme/base/components/input/_inputgroup.scss +75 -0
  244. package/styles/styles/theme/base/components/input/_inputmask.scss +16 -0
  245. package/styles/styles/theme/base/components/input/_inputnumber.scss +28 -0
  246. package/styles/styles/theme/base/components/input/_inputswitch.scss +60 -0
  247. package/styles/styles/theme/base/components/input/_inputtext.scss +100 -0
  248. package/styles/styles/theme/base/components/input/_listbox.scss +82 -0
  249. package/styles/styles/theme/base/components/input/_multiselect.scss +173 -0
  250. package/styles/styles/theme/base/components/input/_password.scss +52 -0
  251. package/styles/styles/theme/base/components/input/_radiobutton.scss +78 -0
  252. package/styles/styles/theme/base/components/input/_rating.scss +55 -0
  253. package/styles/styles/theme/base/components/input/_selectbutton.scss +50 -0
  254. package/styles/styles/theme/base/components/input/_slider.scss +71 -0
  255. package/styles/styles/theme/base/components/input/_togglebutton.scss +48 -0
  256. package/styles/styles/theme/base/components/input/_treeselect.scss +139 -0
  257. package/styles/styles/theme/base/components/menu/_breadcrumb.scss +42 -0
  258. package/styles/styles/theme/base/components/menu/_contextmenu.scss +39 -0
  259. package/styles/styles/theme/base/components/menu/_dock.scss +95 -0
  260. package/styles/styles/theme/base/components/menu/_megamenu.scss +55 -0
  261. package/styles/styles/theme/base/components/menu/_menu.scss +37 -0
  262. package/styles/styles/theme/base/components/menu/_menubar.scss +141 -0
  263. package/styles/styles/theme/base/components/menu/_panelmenu.scss +153 -0
  264. package/styles/styles/theme/base/components/menu/_slidemenu.scss +59 -0
  265. package/styles/styles/theme/base/components/menu/_steps.scss +56 -0
  266. package/styles/styles/theme/base/components/menu/_tabmenu.scss +74 -0
  267. package/styles/styles/theme/base/components/menu/_tieredmenu.scss +43 -0
  268. package/styles/styles/theme/base/components/messages/_inlinemessage.scss +69 -0
  269. package/styles/styles/theme/base/components/messages/_message.scss +107 -0
  270. package/styles/styles/theme/base/components/messages/_toast.scss +103 -0
  271. package/styles/styles/theme/base/components/misc/_avatar.scss +30 -0
  272. package/styles/styles/theme/base/components/misc/_badge.scss +48 -0
  273. package/styles/styles/theme/base/components/misc/_blockui.scss +0 -0
  274. package/styles/styles/theme/base/components/misc/_chip.scss +42 -0
  275. package/styles/styles/theme/base/components/misc/_inplace.scss +17 -0
  276. package/styles/styles/theme/base/components/misc/_progressbar.scss +17 -0
  277. package/styles/styles/theme/base/components/misc/_scrolltop.scss +25 -0
  278. package/styles/styles/theme/base/components/misc/_skeleton.scss +8 -0
  279. package/styles/styles/theme/base/components/misc/_tag.scss +40 -0
  280. package/styles/styles/theme/base/components/misc/_terminal.scss +12 -0
  281. package/styles/styles/theme/base/components/multimedia/_galleria.scss +155 -0
  282. package/styles/styles/theme/base/components/multimedia/_image.scss +49 -0
  283. package/styles/styles/theme/base/components/overlay/_confirmpopup.scss +72 -0
  284. package/styles/styles/theme/base/components/overlay/_dialog.scss +73 -0
  285. package/styles/styles/theme/base/components/overlay/_overlaypanel.scss +64 -0
  286. package/styles/styles/theme/base/components/overlay/_sidebar.scss +27 -0
  287. package/styles/styles/theme/base/components/overlay/_tooltip.scss +33 -0
  288. package/styles/styles/theme/base/components/panel/_accordion.scss +119 -0
  289. package/styles/styles/theme/base/components/panel/_card.scss +30 -0
  290. package/styles/styles/theme/base/components/panel/_divider.scss +31 -0
  291. package/styles/styles/theme/base/components/panel/_fieldset.scss +47 -0
  292. package/styles/styles/theme/base/components/panel/_panel.scss +58 -0
  293. package/styles/styles/theme/base/components/panel/_scrollpanel.scss +6 -0
  294. package/styles/styles/theme/base/components/panel/_splitter.scss +19 -0
  295. package/styles/styles/theme/base/components/panel/_tabview.scss +82 -0
  296. package/styles/styles/theme/base/components/panel/_toolbar.scss +11 -0
  297. package/styles/styles/theme/saga/_extensions.scss +27 -0
  298. package/styles/styles/theme/saga/_variables.scss +1 -0
  299. package/styles/styles/theme/saga/saga-blue/_extensions.scss +2 -0
  300. package/styles/styles/theme/saga/saga-blue/_fonts.scss +1 -0
  301. package/styles/styles/theme/saga/saga-blue/_variables.scss +1 -0
  302. package/styles/styles/theme/saga/saga-blue/theme.scss +4 -0
@@ -0,0 +1,171 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
3
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
4
+ import { TranslocoDirective } from '@jsverse/transloco';
5
+ import { combineLatest, forkJoin, map, of } from 'rxjs';
6
+ import { PrimengModule } from '../../modules/primeng.module';
7
+ import { CardSkeletonComponent } from '../card-skeleton/card-skeleton.component';
8
+ import { SpiderlyFormControl } from '../spiderly-form-control/spiderly-form-control';
9
+ import { Role, RoleSaveBody } from '../../entities/security-entities';
10
+ import { getControl, getPrimengAutocompleteNamebookOptions, getPrimengDropdownNamebookOptions, nameof } from '../../services/helper-functions';
11
+ import { IsAuthorizedForSaveEvent } from '../../entities/is-authorized-for-save-event';
12
+ import { SpiderlyTextboxComponent } from '../../controls/spiderly-textbox/spiderly-textbox.component';
13
+ import { SpiderlyTextareaComponent } from '../../controls/spiderly-textarea/spiderly-textarea.component';
14
+ import { SpiderlyMultiAutocompleteComponent } from '../../controls/spiderly-multiautocomplete/spiderly-multiautocomplete.component';
15
+ import { SpiderlyMultiSelectComponent } from '../../controls/spiderly-multiselect/spiderly-multiselect.component';
16
+ import { SpiderlyPanelsModule } from '../spiderly-panels/spiderly-panels.module';
17
+ import { SpiderlyButtonComponent } from '../spiderly-buttons/spiderly-button/spiderly-button.component';
18
+ import { SpiderlyReturnButtonComponent } from '../spiderly-buttons/return-button/return-button.component';
19
+ import * as i0 from "@angular/core";
20
+ import * as i1 from "../../services/api.service.security";
21
+ import * as i2 from "@angular/router";
22
+ import * as i3 from "../../services/base-form.service";
23
+ import * as i4 from "../../services/auth-base.service";
24
+ import * as i5 from "@angular/common";
25
+ import * as i6 from "@angular/forms";
26
+ import * as i7 from "../spiderly-panels/panel-header/panel-header.component";
27
+ import * as i8 from "../spiderly-panels/panel-body/panel-body.component";
28
+ import * as i9 from "../spiderly-panels/panel-footer/panel-footer.component";
29
+ import * as i10 from "../spiderly-panels/spiderly-panel/spiderly-panel.component";
30
+ export class RoleBaseDetailsComponent {
31
+ constructor(apiService, route, baseFormService, authService) {
32
+ this.apiService = apiService;
33
+ this.route = route;
34
+ this.baseFormService = baseFormService;
35
+ this.authService = authService;
36
+ this.onSave = new EventEmitter();
37
+ this.onRoleFormGroupInitFinish = new EventEmitter();
38
+ this.additionalButtons = [];
39
+ this.authorizedForSaveObservable = () => of(false);
40
+ this.isAuthorizedForSave = false;
41
+ this.onIsAuthorizedForSaveChange = new EventEmitter();
42
+ this.loading = true;
43
+ this.roleSaveBodyName = nameof('roleDTO');
44
+ this.selectedUsersForRole = new SpiderlyFormControl(null, { updateOn: 'change' });
45
+ this.selectedPermissionsForRole = new SpiderlyFormControl(null, { updateOn: 'change' });
46
+ this.handleAuthorizationForSave = () => {
47
+ return combineLatest([this.authService.currentUserPermissionCodes$, this.authorizedForSaveObservable()]).pipe(map(([currentUserPermissionCodes, isAuthorizedForSave]) => {
48
+ if (currentUserPermissionCodes != null && isAuthorizedForSave != null) {
49
+ this.isAuthorizedForSave =
50
+ (currentUserPermissionCodes.includes('InsertRole') && this.modelId <= 0) ||
51
+ (currentUserPermissionCodes.includes('UpdateRole') && this.modelId > 0) ||
52
+ isAuthorizedForSave;
53
+ if (this.isAuthorizedForSave) {
54
+ this.roleFormGroup.controls.name.enable();
55
+ this.roleFormGroup.controls.description.enable();
56
+ this.selectedUsersForRole.enable();
57
+ this.selectedPermissionsForRole.enable();
58
+ }
59
+ else {
60
+ this.roleFormGroup.controls.name.disable();
61
+ this.roleFormGroup.controls.description.disable();
62
+ this.selectedUsersForRole.disable();
63
+ this.selectedPermissionsForRole.disable();
64
+ }
65
+ this.onIsAuthorizedForSaveChange.next(new IsAuthorizedForSaveEvent({
66
+ isAuthorizedForSave: this.isAuthorizedForSave,
67
+ currentUserPermissionCodes: currentUserPermissionCodes
68
+ }));
69
+ }
70
+ }));
71
+ };
72
+ }
73
+ ngOnInit() {
74
+ this.formGroup.initSaveBody = () => {
75
+ let saveBody = new RoleSaveBody();
76
+ saveBody.roleDTO = this.roleFormGroup.getRawValue();
77
+ saveBody.selectedPermissionsIds = this.selectedPermissionsForRole.getRawValue();
78
+ saveBody.selectedUsersIds = this.selectedUsersForRole.getRawValue()?.map(n => n.value);
79
+ return saveBody;
80
+ };
81
+ this.formGroup.saveObservableMethod = this.apiService.saveRole;
82
+ this.formGroup.mainDTOName = this.roleSaveBodyName;
83
+ this.route.params.subscribe(async (params) => {
84
+ this.modelId = params['id'];
85
+ getPrimengDropdownNamebookOptions(this.apiService.getPermissionsDropdownListForRole).subscribe(po => {
86
+ this.permissionsForRoleOptions = po;
87
+ });
88
+ if (this.modelId > 0) {
89
+ forkJoin({
90
+ mainUIFormDTO: this.apiService.getRoleMainUIFormDTO(this.modelId)
91
+ })
92
+ .subscribe(({ mainUIFormDTO }) => {
93
+ this.initRoleFormGroup(new Role(mainUIFormDTO.roleDTO));
94
+ this.selectedPermissionsForRole.setValue(mainUIFormDTO.permissionsNamebookDTOList.map(n => { return n.id; }));
95
+ this.selectedUsersForRole.setValue(mainUIFormDTO.usersNamebookDTOList.map(n => ({ label: n.displayName, value: n.id })));
96
+ this.authorizationForSaveSubscription = this.handleAuthorizationForSave().subscribe();
97
+ this.loading = false;
98
+ });
99
+ }
100
+ else {
101
+ this.initRoleFormGroup(new Role({ id: 0 }));
102
+ this.authorizationForSaveSubscription = this.handleAuthorizationForSave().subscribe();
103
+ this.loading = false;
104
+ }
105
+ });
106
+ }
107
+ initRoleFormGroup(role) {
108
+ this.baseFormService.addFormGroup(this.roleFormGroup, this.formGroup, role, this.roleSaveBodyName, []);
109
+ this.roleFormGroup.mainDTOName = this.roleSaveBodyName;
110
+ this.onRoleFormGroupInitFinish.next();
111
+ }
112
+ searchUsersForRole(event) {
113
+ getPrimengAutocompleteNamebookOptions(this.apiService.getUsersAutocompleteListForRole, 50, event?.query ?? '').subscribe(po => {
114
+ this.usersForRoleOptions = po;
115
+ });
116
+ }
117
+ control(formControlName, formGroup) {
118
+ return getControl(formControlName, formGroup);
119
+ }
120
+ getFormArrayGroups(formArray) {
121
+ return this.baseFormService.getFormArrayGroups(formArray);
122
+ }
123
+ save() {
124
+ this.onSave.next();
125
+ }
126
+ ngOnDestroy() {
127
+ if (this.authorizationForSaveSubscription) {
128
+ this.authorizationForSaveSubscription.unsubscribe();
129
+ }
130
+ }
131
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RoleBaseDetailsComponent, deps: [{ token: i1.ApiSecurityService }, { token: i2.ActivatedRoute }, { token: i3.BaseFormService }, { token: i4.AuthBaseService }], target: i0.ɵɵFactoryTarget.Component }); }
132
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: RoleBaseDetailsComponent, isStandalone: true, selector: "role-base-details", inputs: { getCrudMenuForOrderedData: "getCrudMenuForOrderedData", formGroup: "formGroup", roleFormGroup: "roleFormGroup", additionalButtons: "additionalButtons", authorizedForSaveObservable: "authorizedForSaveObservable" }, outputs: { onSave: "onSave", onRoleFormGroupInitFinish: "onRoleFormGroupInitFinish", onIsAuthorizedForSaveChange: "onIsAuthorizedForSaveChange" }, ngImport: i0, template: "<ng-container *transloco=\"let t\">\r\n <spiderly-panel>\r\n <panel-header></panel-header>\r\n\r\n <panel-body>\r\n <form *ngIf=\"loading === false\" class=\"grid\"> <!-- FT: Don't put @deffer it's not working as expected -->\r\n <div class=\"col-12\">\r\n <spiderly-textbox [control]=\"control('name', roleFormGroup)\"></spiderly-textbox>\r\n </div>\r\n <div class=\"col-12\">\r\n <spiderly-textarea [control]=\"control('description', roleFormGroup)\"></spiderly-textarea>\r\n </div>\r\n <div class=\"col-12\">\r\n <spiderly-multiautocomplete [control]=\"selectedUsersForRole\" [options]=\"usersForRoleOptions\" (onTextInput)=\"searchUsersForRole($event)\" [label]=\"t('Users')\"></spiderly-multiautocomplete>\r\n </div>\r\n <div class=\"col-12\">\r\n <spiderly-multiselect [control]=\"selectedPermissionsForRole\" [options]=\"permissionsForRoleOptions\" [label]=\"t('Permissions')\"></spiderly-multiselect>\r\n </div>\r\n </form>\r\n\r\n <card-skeleton *ngIf=\"loading === true\" [height]=\"502\"></card-skeleton>\r\n\r\n </panel-body>\r\n\r\n <panel-footer>\r\n <spiderly-button [disabled]=\"!isAuthorizedForSave\" (onClick)=\"save()\" [label]=\"t('Save')\" icon=\"pi pi-save\"></spiderly-button>\r\n @for (button of additionalButtons; track button.label) {\r\n <spiderly-button (onClick)=\"button.onClick()\" [disabled]=\"button.disabled\" [label]=\"button.label\" [icon]=\"button.icon\"></spiderly-button>\r\n }\r\n <return-button></return-button>\r\n </panel-footer>\r\n </spiderly-panel>\r\n</ng-container>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: PrimengModule }, { kind: "directive", type:
133
+ // SpiderlyControlsModule,
134
+ TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: CardSkeletonComponent, selector: "card-skeleton", inputs: ["height"] }, { kind: "component", type: SpiderlyTextboxComponent, selector: "spiderly-textbox", inputs: ["showButton", "buttonIcon"], outputs: ["onButtonClick"] }, { kind: "component", type: SpiderlyTextareaComponent, selector: "spiderly-textarea" }, { kind: "component", type: SpiderlyMultiAutocompleteComponent, selector: "spiderly-multiautocomplete" }, { kind: "component", type: SpiderlyMultiSelectComponent, selector: "spiderly-multiselect" }, { kind: "ngmodule", type: SpiderlyPanelsModule }, { kind: "component", type: i7.PanelHeaderComponent, selector: "panel-header", inputs: ["title", "showBigTitle", "showIcon", "icon", "index", "tabs"] }, { kind: "component", type: i8.PanelBodyComponent, selector: "panel-body", inputs: ["normalBottomPadding"] }, { kind: "component", type: i9.PanelFooterComponent, selector: "panel-footer" }, { kind: "component", type: i10.SpiderlyPanelComponent, selector: "spiderly-panel", inputs: ["isFirstMultiplePanel", "isMiddleMultiplePanel", "isLastMultiplePanel", "toggleable", "collapsed", "crudMenu", "showCrudMenu", "showRemoveIcon", "index", "showPanelHeader"], outputs: ["onMenuIconClick", "onRemoveIconClick"] }, { kind: "component", type: SpiderlyButtonComponent, selector: "spiderly-button" }, { kind: "component", type: SpiderlyReturnButtonComponent, selector: "return-button", inputs: ["navigateUrl"] }] }); }
135
+ }
136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RoleBaseDetailsComponent, decorators: [{
137
+ type: Component,
138
+ args: [{ selector: 'role-base-details', standalone: true, imports: [
139
+ CommonModule,
140
+ FormsModule,
141
+ ReactiveFormsModule,
142
+ PrimengModule,
143
+ // SpiderlyControlsModule,
144
+ TranslocoDirective,
145
+ CardSkeletonComponent,
146
+ SpiderlyTextboxComponent,
147
+ SpiderlyTextareaComponent,
148
+ SpiderlyMultiAutocompleteComponent,
149
+ SpiderlyMultiSelectComponent,
150
+ SpiderlyPanelsModule,
151
+ SpiderlyButtonComponent,
152
+ SpiderlyReturnButtonComponent
153
+ ], template: "<ng-container *transloco=\"let t\">\r\n <spiderly-panel>\r\n <panel-header></panel-header>\r\n\r\n <panel-body>\r\n <form *ngIf=\"loading === false\" class=\"grid\"> <!-- FT: Don't put @deffer it's not working as expected -->\r\n <div class=\"col-12\">\r\n <spiderly-textbox [control]=\"control('name', roleFormGroup)\"></spiderly-textbox>\r\n </div>\r\n <div class=\"col-12\">\r\n <spiderly-textarea [control]=\"control('description', roleFormGroup)\"></spiderly-textarea>\r\n </div>\r\n <div class=\"col-12\">\r\n <spiderly-multiautocomplete [control]=\"selectedUsersForRole\" [options]=\"usersForRoleOptions\" (onTextInput)=\"searchUsersForRole($event)\" [label]=\"t('Users')\"></spiderly-multiautocomplete>\r\n </div>\r\n <div class=\"col-12\">\r\n <spiderly-multiselect [control]=\"selectedPermissionsForRole\" [options]=\"permissionsForRoleOptions\" [label]=\"t('Permissions')\"></spiderly-multiselect>\r\n </div>\r\n </form>\r\n\r\n <card-skeleton *ngIf=\"loading === true\" [height]=\"502\"></card-skeleton>\r\n\r\n </panel-body>\r\n\r\n <panel-footer>\r\n <spiderly-button [disabled]=\"!isAuthorizedForSave\" (onClick)=\"save()\" [label]=\"t('Save')\" icon=\"pi pi-save\"></spiderly-button>\r\n @for (button of additionalButtons; track button.label) {\r\n <spiderly-button (onClick)=\"button.onClick()\" [disabled]=\"button.disabled\" [label]=\"button.label\" [icon]=\"button.icon\"></spiderly-button>\r\n }\r\n <return-button></return-button>\r\n </panel-footer>\r\n </spiderly-panel>\r\n</ng-container>" }]
154
+ }], ctorParameters: () => [{ type: i1.ApiSecurityService }, { type: i2.ActivatedRoute }, { type: i3.BaseFormService }, { type: i4.AuthBaseService }], propDecorators: { onSave: [{
155
+ type: Output
156
+ }], onRoleFormGroupInitFinish: [{
157
+ type: Output
158
+ }], getCrudMenuForOrderedData: [{
159
+ type: Input
160
+ }], formGroup: [{
161
+ type: Input
162
+ }], roleFormGroup: [{
163
+ type: Input
164
+ }], additionalButtons: [{
165
+ type: Input
166
+ }], authorizedForSaveObservable: [{
167
+ type: Input
168
+ }], onIsAuthorizedForSaveChange: [{
169
+ type: Output
170
+ }] } });
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1iYXNlLWRldGFpbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BpZGVybHkvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtZGV0YWlscy9yb2xlLWJhc2UtZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGlkZXJseS9zcmMvbGliL2NvbXBvbmVudHMvYmFzZS1kZXRhaWxzL3JvbGUtYmFzZS1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUVsRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDakYsT0FBTyxFQUFxQixtQkFBbUIsRUFBcUIsTUFBTSxnREFBZ0QsQ0FBQztBQUczSCxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXRFLE9BQU8sRUFBRSxVQUFVLEVBQUUscUNBQXFDLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFLL0ksT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNkNBQTZDLENB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QUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksSUFBSSxDQUFDLGdDQUFnQyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN2RDtJQUNMLENBQUM7K0dBL0lRLHdCQUF3QjttR0FBeEIsd0JBQXdCLGdjQ25EckMsb3pEQWdDZSwyQ0RHUCxZQUFZLGtJQUNaLFdBQVcsdWRBQ1gsbUJBQW1CLDhCQUNuQixhQUFhO2dCQUNiLDBCQUEwQjtnQkFDMUIsa0JBQWtCLGdNQUNsQixxQkFBcUIsOEVBQ3JCLHdCQUF3QiwrSEFDeEIseUJBQXlCLDhEQUN6QixrQ0FBa0MsdUVBQ2xDLDRCQUE0QixnRUFDNUIsb0JBQW9CLG1yQkFDcEIsdUJBQXVCLDREQUN2Qiw2QkFBNkI7OzRGQUd4Qix3QkFBd0I7a0JBckJwQyxTQUFTOytCQUNJLG1CQUFtQixjQUVqQixJQUFJLFdBQ1A7d0JBQ0wsWUFBWTt3QkFDWixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsYUFBYTt3QkFDYiwwQkFBMEI7d0JBQzFCLGtCQUFrQjt3QkFDbEIscUJBQXFCO3dCQUNyQix3QkFBd0I7d0JBQ3hCLHlCQUF5Qjt3QkFDekIsa0NBQWtDO3dCQUNsQyw0QkFBNEI7d0JBQzVCLG9CQUFvQjt3QkFDcEIsdUJBQXVCO3dCQUN2Qiw2QkFBNkI7cUJBQ2hDO2dMQUdTLE1BQU07c0JBQWYsTUFBTTtnQkFDRyx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBQ0UseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBR0csMkJBQTJCO3NCQUFuQyxLQUFLO2dCQUVJLDJCQUEyQjtzQkFBcEMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xvY29EaXJlY3RpdmUgfSBmcm9tICdAanN2ZXJzZS90cmFuc2xvY28nO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIGZvcmtKb2luLCBtYXAsIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFByaW1lbmdNb2R1bGUgfSBmcm9tICcuLi8uLi9tb2R1bGVzL3ByaW1lbmcubW9kdWxlJztcclxuaW1wb3J0IHsgU3BpZGVybHlDb250cm9sc01vZHVsZSB9IGZyb20gJy4uLy4uL2NvbnRyb2xzL3NwaWRlcmx5LWNvbnRyb2xzLm1vZHVsZSc7XHJcbmltcG9ydCB7IENhcmRTa2VsZXRvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NhcmQtc2tlbGV0b24vY2FyZC1za2VsZXRvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTcGlkZXJseUZvcm1BcnJheSwgU3BpZGVybHlGb3JtQ29udHJvbCwgU3BpZGVybHlGb3JtR3JvdXAgfSBmcm9tICcuLi9zcGlkZXJseS1mb3JtLWNvbnRyb2wvc3BpZGVybHktZm9ybS1jb250cm9sJztcclxuaW1wb3J0IHsgQmFzZUVudGl0eSB9IGZyb20gJy4uLy4uL2VudGl0aWVzL2Jhc2UtZW50aXR5JztcclxuaW1wb3J0IHsgTGFzdE1lbnVJY29uSW5kZXhDbGlja2VkIH0gZnJvbSAnLi4vLi4vZW50aXRpZXMvbGFzdC1tZW51LWljb24taW5kZXgtY2xpY2tlZCc7XHJcbmltcG9ydCB7IFJvbGUsIFJvbGVTYXZlQm9keSB9IGZyb20gJy4uLy4uL2VudGl0aWVzL3NlY3VyaXR5LWVudGl0aWVzJztcclxuaW1wb3J0IHsgU3BpZGVybHlCdXR0b24gfSBmcm9tICcuLi8uLi9lbnRpdGllcy9zcGlkZXJseS1idXR0b24nO1xyXG5pbXBvcnQgeyBnZXRDb250cm9sLCBnZXRQcmltZW5nQXV0b2NvbXBsZXRlTmFtZWJvb2tPcHRpb25zLCBnZXRQcmltZW5nRHJvcGRvd25OYW1lYm9va09wdGlvbnMsIG5hbWVvZiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2hlbHBlci1mdW5jdGlvbnMnO1xyXG5pbXBvcnQgeyBCYXNlRm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9iYXNlLWZvcm0uc2VydmljZSc7XHJcbmltcG9ydCB7IEFwaVNlY3VyaXR5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwaS5zZXJ2aWNlLnNlY3VyaXR5JztcclxuaW1wb3J0IHsgUHJpbWVuZ09wdGlvbiB9IGZyb20gJy4uLy4uL2VudGl0aWVzL3ByaW1lbmctb3B0aW9uJztcclxuaW1wb3J0IHsgQXV0b0NvbXBsZXRlQ29tcGxldGVFdmVudCB9IGZyb20gJ3ByaW1lbmcvYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHsgSXNBdXRob3JpemVkRm9yU2F2ZUV2ZW50IH0gZnJvbSAnLi4vLi4vZW50aXRpZXMvaXMtYXV0aG9yaXplZC1mb3Itc2F2ZS1ldmVudCc7XHJcbmltcG9ydCB7IEF1dGhCYXNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGgtYmFzZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3BpZGVybHlUZXh0Ym94Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29udHJvbHMvc3BpZGVybHktdGV4dGJveC9zcGlkZXJseS10ZXh0Ym94LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNwaWRlcmx5VGV4dGFyZWFDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb250cm9scy9zcGlkZXJseS10ZXh0YXJlYS9zcGlkZXJseS10ZXh0YXJlYS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTcGlkZXJseU11bHRpQXV0b2NvbXBsZXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29udHJvbHMvc3BpZGVybHktbXVsdGlhdXRvY29tcGxldGUvc3BpZGVybHktbXVsdGlhdXRvY29tcGxldGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU3BpZGVybHlNdWx0aVNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbnRyb2xzL3NwaWRlcmx5LW11bHRpc2VsZWN0L3NwaWRlcmx5LW11bHRpc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNwaWRlcmx5UGFuZWxzTW9kdWxlIH0gZnJvbSAnLi4vc3BpZGVybHktcGFuZWxzL3NwaWRlcmx5LXBhbmVscy5tb2R1bGUnO1xyXG5pbXBvcnQgeyBTcGlkZXJseUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uL3NwaWRlcmx5LWJ1dHRvbnMvc3BpZGVybHktYnV0dG9uL3NwaWRlcmx5LWJ1dHRvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTcGlkZXJseVJldHVybkJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uL3NwaWRlcmx5LWJ1dHRvbnMvcmV0dXJuLWJ1dHRvbi9yZXR1cm4tYnV0dG9uLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAncm9sZS1iYXNlLWRldGFpbHMnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICdyb2xlLWJhc2UtZGV0YWlscy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW1xyXG4gICAgICAgIENvbW1vbk1vZHVsZSwgXHJcbiAgICAgICAgRm9ybXNNb2R1bGUsXHJcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgICAgICBQcmltZW5nTW9kdWxlLFxyXG4gICAgICAgIC8vIFNwaWRlcmx5Q29udHJvbHNNb2R1bGUsXHJcbiAgICAgICAgVHJhbnNsb2NvRGlyZWN0aXZlLFxyXG4gICAgICAgIENhcmRTa2VsZXRvbkNvbXBvbmVudCxcclxuICAgICAgICBTcGlkZXJseVRleHRib3hDb21wb25lbnQsXHJcbiAgICAgICAgU3BpZGVybHlUZXh0YXJlYUNvbXBvbmVudCxcclxuICAgICAgICBTcGlkZXJseU11bHRpQXV0b2NvbXBsZXRlQ29tcG9uZW50LFxyXG4gICAgICAgIFNwaWRlcmx5TXVsdGlTZWxlY3RDb21wb25lbnQsXHJcbiAgICAgICAgU3BpZGVybHlQYW5lbHNNb2R1bGUsXHJcbiAgICAgICAgU3BpZGVybHlCdXR0b25Db21wb25lbnQsXHJcbiAgICAgICAgU3BpZGVybHlSZXR1cm5CdXR0b25Db21wb25lbnRcclxuICAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFJvbGVCYXNlRGV0YWlsc0NvbXBvbmVudCB7XHJcbiAgICBAT3V0cHV0KCkgb25TYXZlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gICAgQE91dHB1dCgpIG9uUm9sZUZvcm1Hcm91cEluaXRGaW5pc2ggPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgICBASW5wdXQoKSBnZXRDcnVkTWVudUZvck9yZGVyZWREYXRhOiAoZm9ybUFycmF5OiBTcGlkZXJseUZvcm1BcnJheSwgbW9kZWxDb25zdHJ1Y3RvcjogQmFzZUVudGl0eSwgbGFzdE1lbnVJY29uSW5kZXhDbGlja2VkOiBMYXN0TWVudUljb25JbmRleENsaWNrZWQsIGFkanVzdEZvcm1BcnJheU1hbnVhbGx5OiBib29sZWFuKSA9PiBNZW51SXRlbVtdO1xyXG4gICAgQElucHV0KCkgZm9ybUdyb3VwOiBTcGlkZXJseUZvcm1Hcm91cDtcclxuICAgIEBJbnB1dCgpIHJvbGVGb3JtR3JvdXA6IFNwaWRlcmx5Rm9ybUdyb3VwPFJvbGU+O1xyXG4gICAgQElucHV0KCkgYWRkaXRpb25hbEJ1dHRvbnM6IFNwaWRlcmx5QnV0dG9uW10gPSBbXTtcclxuXHJcbiAgICBhdXRob3JpemF0aW9uRm9yU2F2ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gICAgQElucHV0KCkgYXV0aG9yaXplZEZvclNhdmVPYnNlcnZhYmxlOiAoKSA9PiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gKCkgPT4gb2YoZmFsc2UpO1xyXG4gICAgaXNBdXRob3JpemVkRm9yU2F2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQE91dHB1dCgpIG9uSXNBdXRob3JpemVkRm9yU2F2ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SXNBdXRob3JpemVkRm9yU2F2ZUV2ZW50PigpOyBcclxuICAgIFxyXG4gICAgbW9kZWxJZDogbnVtYmVyO1xyXG4gICAgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICByb2xlU2F2ZUJvZHlOYW1lOiBzdHJpbmcgPSBuYW1lb2Y8Um9sZVNhdmVCb2R5Pigncm9sZURUTycpO1xyXG5cclxuICAgIHVzZXJzRm9yUm9sZU9wdGlvbnM6IFByaW1lbmdPcHRpb25bXTtcclxuICAgIHBlcm1pc3Npb25zRm9yUm9sZU9wdGlvbnM6IFByaW1lbmdPcHRpb25bXTtcclxuXHJcbiAgICBzZWxlY3RlZFVzZXJzRm9yUm9sZSA9IG5ldyBTcGlkZXJseUZvcm1Db250cm9sPFByaW1lbmdPcHRpb25bXT4obnVsbCwge3VwZGF0ZU9uOiAnY2hhbmdlJ30pO1xyXG4gICAgc2VsZWN0ZWRQZXJtaXNzaW9uc0ZvclJvbGUgPSBuZXcgU3BpZGVybHlGb3JtQ29udHJvbDxudW1iZXJbXT4obnVsbCwge3VwZGF0ZU9uOiAnY2hhbmdlJ30pO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgYXBpU2VydmljZTogQXBpU2VjdXJpdHlTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgIHByaXZhdGUgYmFzZUZvcm1TZXJ2aWNlOiBCYXNlRm9ybVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aEJhc2VTZXJ2aWNlXHJcbiAgICApIHt9XHJcblxyXG4gICAgbmdPbkluaXQoKXtcclxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5pbml0U2F2ZUJvZHkgPSAoKSA9PiB7IFxyXG4gICAgICAgICAgICBsZXQgc2F2ZUJvZHkgPSBuZXcgUm9sZVNhdmVCb2R5KCk7XHJcbiAgICAgICAgICAgIHNhdmVCb2R5LnJvbGVEVE8gPSB0aGlzLnJvbGVGb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKTtcclxuXHJcbiAgICAgICAgICAgIHNhdmVCb2R5LnNlbGVjdGVkUGVybWlzc2lvbnNJZHMgPSB0aGlzLnNlbGVjdGVkUGVybWlzc2lvbnNGb3JSb2xlLmdldFJhd1ZhbHVlKCk7XHJcbiAgICAgICAgICAgIHNhdmVCb2R5LnNlbGVjdGVkVXNlcnNJZHMgPSB0aGlzLnNlbGVjdGVkVXNlcnNGb3JSb2xlLmdldFJhd1ZhbHVlKCk/Lm1hcChuID0+IG4udmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHNhdmVCb2R5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuc2F2ZU9ic2VydmFibGVNZXRob2QgPSB0aGlzLmFwaVNlcnZpY2Uuc2F2ZVJvbGU7XHJcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAubWFpbkRUT05hbWUgPSB0aGlzLnJvbGVTYXZlQm9keU5hbWU7XHJcblxyXG4gICAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZShhc3luYyAocGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWxJZCA9IHBhcmFtc1snaWQnXTtcclxuXHJcbiAgICAgICAgICAgIGdldFByaW1lbmdEcm9wZG93bk5hbWVib29rT3B0aW9ucyh0aGlzLmFwaVNlcnZpY2UuZ2V0UGVybWlzc2lvbnNEcm9wZG93bkxpc3RGb3JSb2xlKS5zdWJzY3JpYmUocG8gPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uc0ZvclJvbGVPcHRpb25zID0gcG87XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYodGhpcy5tb2RlbElkID4gMCl7XHJcbiAgICAgICAgICAgICAgICBmb3JrSm9pbih7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFpblVJRm9ybURUTzogdGhpcy5hcGlTZXJ2aWNlLmdldFJvbGVNYWluVUlGb3JtRFRPKHRoaXMubW9kZWxJZClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh7IG1haW5VSUZvcm1EVE8gfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFJvbGVGb3JtR3JvdXAobmV3IFJvbGUobWFpblVJRm9ybURUTy5yb2xlRFRPKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQZXJtaXNzaW9uc0ZvclJvbGUuc2V0VmFsdWUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1haW5VSUZvcm1EVE8ucGVybWlzc2lvbnNOYW1lYm9va0RUT0xpc3QubWFwKG4gPT4geyByZXR1cm4gbi5pZCB9KVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJzRm9yUm9sZS5zZXRWYWx1ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFpblVJRm9ybURUTy51c2Vyc05hbWVib29rRFRPTGlzdC5tYXAobiA9PiAoeyBsYWJlbDogbi5kaXNwbGF5TmFtZSwgdmFsdWU6IG4uaWQgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRob3JpemF0aW9uRm9yU2F2ZVN1YnNjcmlwdGlvbiA9IHRoaXMuaGFuZGxlQXV0aG9yaXphdGlvbkZvclNhdmUoKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRSb2xlRm9ybUdyb3VwKG5ldyBSb2xlKHtpZDogMH0pKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhvcml6YXRpb25Gb3JTYXZlU3Vic2NyaXB0aW9uID0gdGhpcy5oYW5kbGVBdXRob3JpemF0aW9uRm9yU2F2ZSgpLnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0Um9sZUZvcm1Hcm91cChyb2xlOiBSb2xlKSB7XHJcbiAgICAgICAgdGhpcy5iYXNlRm9ybVNlcnZpY2UuYWRkRm9ybUdyb3VwPFJvbGU+KFxyXG4gICAgICAgICAgICB0aGlzLnJvbGVGb3JtR3JvdXAsIFxyXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cCwgXHJcbiAgICAgICAgICAgIHJvbGUsIFxyXG4gICAgICAgICAgICB0aGlzLnJvbGVTYXZlQm9keU5hbWUsXHJcbiAgICAgICAgICAgIFtdXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnJvbGVGb3JtR3JvdXAubWFpbkRUT05hbWUgPSB0aGlzLnJvbGVTYXZlQm9keU5hbWU7XHJcbiAgICAgICAgdGhpcy5vblJvbGVGb3JtR3JvdXBJbml0RmluaXNoLm5leHQoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaGFuZGxlQXV0aG9yaXphdGlvbkZvclNhdmUgPSAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW3RoaXMuYXV0aFNlcnZpY2UuY3VycmVudFVzZXJQZXJtaXNzaW9uQ29kZXMkLCB0aGlzLmF1dGhvcml6ZWRGb3JTYXZlT2JzZXJ2YWJsZSgpXSkucGlwZShcclxuICAgICAgICAgICAgbWFwKChbY3VycmVudFVzZXJQZXJtaXNzaW9uQ29kZXMsIGlzQXV0aG9yaXplZEZvclNhdmVdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFVzZXJQZXJtaXNzaW9uQ29kZXMgIT0gbnVsbCAmJiBpc0F1dGhvcml6ZWRGb3JTYXZlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQXV0aG9yaXplZEZvclNhdmUgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudFVzZXJQZXJtaXNzaW9uQ29kZXMuaW5jbHVkZXMoJ0luc2VydFJvbGUnKSAmJiB0aGlzLm1vZGVsSWQgPD0gMCkgfHwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50VXNlclBlcm1pc3Npb25Db2Rlcy5pbmNsdWRlcygnVXBkYXRlUm9sZScpICYmIHRoaXMubW9kZWxJZCA+IDApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQXV0aG9yaXplZEZvclNhdmU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQXV0aG9yaXplZEZvclNhdmUpIHsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9sZUZvcm1Hcm91cC5jb250cm9scy5uYW1lLmVuYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvbGVGb3JtR3JvdXAuY29udHJvbHMuZGVzY3JpcHRpb24uZW5hYmxlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2Vyc0ZvclJvbGUuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQZXJtaXNzaW9uc0ZvclJvbGUuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9sZUZvcm1Hcm91cC5jb250cm9scy5uYW1lLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb2xlRm9ybUdyb3VwLmNvbnRyb2xzLmRlc2NyaXB0aW9uLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJzRm9yUm9sZS5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQZXJtaXNzaW9uc0ZvclJvbGUuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbklzQXV0aG9yaXplZEZvclNhdmVDaGFuZ2UubmV4dChuZXcgSXNBdXRob3JpemVkRm9yU2F2ZUV2ZW50KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBdXRob3JpemVkRm9yU2F2ZTogdGhpcy5pc0F1dGhvcml6ZWRGb3JTYXZlLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFVzZXJQZXJtaXNzaW9uQ29kZXM6IGN1cnJlbnRVc2VyUGVybWlzc2lvbkNvZGVzXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpOyBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHNlYXJjaFVzZXJzRm9yUm9sZShldmVudDogQXV0b0NvbXBsZXRlQ29tcGxldGVFdmVudCkge1xyXG4gICAgICAgIGdldFByaW1lbmdBdXRvY29tcGxldGVOYW1lYm9va09wdGlvbnModGhpcy5hcGlTZXJ2aWNlLmdldFVzZXJzQXV0b2NvbXBsZXRlTGlzdEZvclJvbGUsIDUwLCBldmVudD8ucXVlcnkgPz8gJycpLnN1YnNjcmliZShwbyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXNlcnNGb3JSb2xlT3B0aW9ucyA9IHBvO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnRyb2woZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmcsIGZvcm1Hcm91cDogU3BpZGVybHlGb3JtR3JvdXApe1xyXG4gICAgICAgIHJldHVybiBnZXRDb250cm9sKGZvcm1Db250cm9sTmFtZSwgZm9ybUdyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGb3JtQXJyYXlHcm91cHM8VD4oZm9ybUFycmF5OiBTcGlkZXJseUZvcm1BcnJheSk6IFNwaWRlcmx5Rm9ybUdyb3VwPFQ+W117XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUZvcm1TZXJ2aWNlLmdldEZvcm1BcnJheUdyb3VwczxUPihmb3JtQXJyYXkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmUoKXtcclxuICAgICAgICB0aGlzLm9uU2F2ZS5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKXtcclxuICAgICAgICBpZiAodGhpcy5hdXRob3JpemF0aW9uRm9yU2F2ZVN1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmF1dGhvcml6YXRpb25Gb3JTYXZlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufVxyXG4iLCI8bmctY29udGFpbmVyICp0cmFuc2xvY289XCJsZXQgdFwiPlxyXG4gICAgPHNwaWRlcmx5LXBhbmVsPlxyXG4gICAgICAgIDxwYW5lbC1oZWFkZXI+PC9wYW5lbC1oZWFkZXI+XHJcblxyXG4gICAgICAgIDxwYW5lbC1ib2R5PlxyXG4gICAgICAgICAgICA8Zm9ybSAqbmdJZj1cImxvYWRpbmcgPT09IGZhbHNlXCIgY2xhc3M9XCJncmlkXCI+IDwhLS0gRlQ6IERvbid0IHB1dCBAZGVmZmVyIGl0J3Mgbm90IHdvcmtpbmcgYXMgZXhwZWN0ZWQgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwaWRlcmx5LXRleHRib3ggW2NvbnRyb2xdPVwiY29udHJvbCgnbmFtZScsIHJvbGVGb3JtR3JvdXApXCI+PC9zcGlkZXJseS10ZXh0Ym94PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwaWRlcmx5LXRleHRhcmVhIFtjb250cm9sXT1cImNvbnRyb2woJ2Rlc2NyaXB0aW9uJywgcm9sZUZvcm1Hcm91cClcIj48L3NwaWRlcmx5LXRleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwaWRlcmx5LW11bHRpYXV0b2NvbXBsZXRlIFtjb250cm9sXT1cInNlbGVjdGVkVXNlcnNGb3JSb2xlXCIgW29wdGlvbnNdPVwidXNlcnNGb3JSb2xlT3B0aW9uc1wiIChvblRleHRJbnB1dCk9XCJzZWFyY2hVc2Vyc0ZvclJvbGUoJGV2ZW50KVwiIFtsYWJlbF09XCJ0KCdVc2VycycpXCI+PC9zcGlkZXJseS1tdWx0aWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGlkZXJseS1tdWx0aXNlbGVjdCBbY29udHJvbF09XCJzZWxlY3RlZFBlcm1pc3Npb25zRm9yUm9sZVwiIFtvcHRpb25zXT1cInBlcm1pc3Npb25zRm9yUm9sZU9wdGlvbnNcIiBbbGFiZWxdPVwidCgnUGVybWlzc2lvbnMnKVwiPjwvc3BpZGVybHktbXVsdGlzZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9mb3JtPlxyXG5cclxuICAgICAgICAgICAgPGNhcmQtc2tlbGV0b24gKm5nSWY9XCJsb2FkaW5nID09PSB0cnVlXCIgW2hlaWdodF09XCI1MDJcIj48L2NhcmQtc2tlbGV0b24+XHJcblxyXG4gICAgICAgIDwvcGFuZWwtYm9keT5cclxuXHJcbiAgICAgICAgPHBhbmVsLWZvb3Rlcj5cclxuICAgICAgICAgICAgPHNwaWRlcmx5LWJ1dHRvbiBbZGlzYWJsZWRdPVwiIWlzQXV0aG9yaXplZEZvclNhdmVcIiAob25DbGljayk9XCJzYXZlKClcIiBbbGFiZWxdPVwidCgnU2F2ZScpXCIgaWNvbj1cInBpIHBpLXNhdmVcIj48L3NwaWRlcmx5LWJ1dHRvbj5cclxuICAgICAgICAgICAgQGZvciAoYnV0dG9uIG9mIGFkZGl0aW9uYWxCdXR0b25zOyB0cmFjayBidXR0b24ubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIDxzcGlkZXJseS1idXR0b24gKG9uQ2xpY2spPVwiYnV0dG9uLm9uQ2xpY2soKVwiIFtkaXNhYmxlZF09XCJidXR0b24uZGlzYWJsZWRcIiBbbGFiZWxdPVwiYnV0dG9uLmxhYmVsXCIgW2ljb25dPVwiYnV0dG9uLmljb25cIj48L3NwaWRlcmx5LWJ1dHRvbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8cmV0dXJuLWJ1dHRvbj48L3JldHVybi1idXR0b24+XHJcbiAgICAgICAgPC9wYW5lbC1mb290ZXI+XHJcbiAgICA8L3NwaWRlcmx5LXBhbmVsPlxyXG48L25nLWNvbnRhaW5lcj4iXX0=
@@ -0,0 +1,247 @@
1
+ import { Component, } from '@angular/core';
2
+ import { SpiderlyFormArray, SpiderlyFormControl, SpiderlyFormGroup } from '../spiderly-form-control/spiderly-form-control';
3
+ import { getControl, getParentUrl } from '../../services/helper-functions';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common/http";
6
+ import * as i2 from "../../services/spiderly-message.service";
7
+ import * as i3 from "@angular/router";
8
+ import * as i4 from "@jsverse/transloco";
9
+ import * as i5 from "./../../services/base-form.service";
10
+ export class BaseFormCopy {
11
+ constructor(differs, http, messageService, changeDetectorRef, router, route, translocoService, baseFormService) {
12
+ this.differs = differs;
13
+ this.http = http;
14
+ this.messageService = messageService;
15
+ this.changeDetectorRef = changeDetectorRef;
16
+ this.router = router;
17
+ this.route = route;
18
+ this.translocoService = translocoService;
19
+ this.baseFormService = baseFormService;
20
+ this.formGroup = new SpiderlyFormGroup({});
21
+ this.successfulSaveToastDescription = this.translocoService.translate('SuccessfulSaveToastDescription');
22
+ this.loading = true;
23
+ //#region Model
24
+ this.initFormGroup = (formGroup, parentFormGroup, modelConstructor, propertyNameInSaveBody, updateOnChangeControls) => {
25
+ return this.baseFormService.addFormGroup(formGroup, parentFormGroup, modelConstructor, propertyNameInSaveBody, updateOnChangeControls);
26
+ };
27
+ this.createFormGroup = (formGroup, modelConstructor, updateOnChangeControls) => {
28
+ return this.baseFormService.initFormGroup(formGroup, modelConstructor, updateOnChangeControls);
29
+ };
30
+ this.control = (formControlName, formGroup) => {
31
+ return getControl(formControlName, formGroup);
32
+ };
33
+ this.onSave = (reroute = true) => {
34
+ this.saveBody = this.formGroup.initSaveBody();
35
+ this.onBeforeSave(this.saveBody);
36
+ this.saveBody = this.saveBody ?? this.formGroup.getRawValue();
37
+ let isValid = this.areFormGroupsFromParentFormGroupValid();
38
+ let isFormArrayValid = this.areFormArraysValid();
39
+ if (isValid && isFormArrayValid) {
40
+ this.formGroup.saveObservableMethod(this.saveBody).subscribe(res => {
41
+ this.messageService.successMessage(this.successfulSaveToastDescription);
42
+ Object.keys(res).forEach((key) => {
43
+ const formControl = this.formGroup.get(key);
44
+ if (formControl) {
45
+ if (formControl instanceof SpiderlyFormArray) {
46
+ const formArray = formControl;
47
+ if (res[key].length !== 0) {
48
+ formArray.clear();
49
+ }
50
+ else {
51
+ // FT: This is okay because when we have M2M association with additional fields, we will not give back the list because we are not checking version on the server.
52
+ // console.error(`You returned empty array for control: ${formArray.translationKey}.`);
53
+ }
54
+ res[key].forEach((model) => {
55
+ if (typeof model === 'object' && model !== null) {
56
+ Object.assign(formArray.modelConstructor, model);
57
+ let helperFormGroup = new SpiderlyFormGroup({});
58
+ this.baseFormService.initFormGroup(helperFormGroup, formArray.modelConstructor);
59
+ formArray.push(helperFormGroup);
60
+ }
61
+ else {
62
+ console.error('Can not add primitive form control inside form array.');
63
+ }
64
+ });
65
+ }
66
+ else {
67
+ formControl.patchValue(res[key]);
68
+ }
69
+ }
70
+ else {
71
+ // FT: It's okay to do this.
72
+ // console.error('You returned something that is not in the save DTO.');
73
+ }
74
+ });
75
+ if (reroute) {
76
+ const savedObjectId = res[this.formGroup.mainDTOName]?.id;
77
+ this.rerouteToSavedObject(savedObjectId); // You always need to have id, because of id == 0 and version change
78
+ }
79
+ this.onAfterSave();
80
+ });
81
+ this.onAfterSaveRequest();
82
+ }
83
+ else {
84
+ this.baseFormService.showInvalidFieldsMessage();
85
+ }
86
+ };
87
+ this.rerouteToSavedObject = (rerouteId) => {
88
+ if (rerouteId == null) {
89
+ // console.error('You do not have rerouteId in your DTO.')
90
+ const currentUrl = this.router.url;
91
+ const parentUrl = getParentUrl(currentUrl);
92
+ this.router.navigateByUrl(parentUrl);
93
+ return;
94
+ }
95
+ const segments = this.router.url.split('/');
96
+ segments[segments.length - 1] = rerouteId.toString();
97
+ const newUrl = segments.join('/');
98
+ this.router.navigateByUrl(newUrl);
99
+ };
100
+ this.onBeforeSave = (saveBody) => { };
101
+ this.onAfterSave = () => { };
102
+ this.onAfterSaveRequest = () => { };
103
+ // FT: Sending LastMenuIconIndexClicked class because of reference type
104
+ this.getCrudMenuForOrderedData = (formArray, modelConstructor, lastMenuIconIndexClicked, adjustFormArrayManually = false) => {
105
+ let crudMenuForOrderedData = [
106
+ { label: this.translocoService.translate('Remove'), icon: 'pi pi-minus', command: () => {
107
+ this.onBeforeRemove(formArray, modelConstructor, lastMenuIconIndexClicked.index);
108
+ if (adjustFormArrayManually === false) {
109
+ this.removeFormControlFromTheFormArray(formArray, lastMenuIconIndexClicked.index);
110
+ }
111
+ } },
112
+ { label: this.translocoService.translate('AddAbove'), icon: 'pi pi-arrow-up', command: () => {
113
+ this.onBeforeAddAbove(formArray, modelConstructor, lastMenuIconIndexClicked.index);
114
+ if (adjustFormArrayManually === false) {
115
+ this.baseFormService.addNewFormGroupToFormArray(formArray, modelConstructor, lastMenuIconIndexClicked.index);
116
+ }
117
+ } },
118
+ { label: this.translocoService.translate('AddBelow'), icon: 'pi pi-arrow-down', command: () => {
119
+ this.onBeforeAddBelow(formArray, modelConstructor, lastMenuIconIndexClicked.index);
120
+ if (adjustFormArrayManually === false) {
121
+ this.baseFormService.addNewFormGroupToFormArray(formArray, modelConstructor, lastMenuIconIndexClicked.index + 1);
122
+ }
123
+ } },
124
+ ];
125
+ return crudMenuForOrderedData;
126
+ };
127
+ this.onBeforeRemove = (formArray, modelConstructor, lastMenuIconIndexClicked) => { };
128
+ this.onBeforeAddAbove = (formArray, modelConstructor, lastMenuIconIndexClicked) => { };
129
+ this.onBeforeAddBelow = (formArray, modelConstructor, lastMenuIconIndexClicked) => { };
130
+ }
131
+ ngOnInit() {
132
+ }
133
+ areFormGroupsFromParentFormGroupValid() {
134
+ if (this.formGroup.controls == null)
135
+ return true;
136
+ let invalid = false;
137
+ Object.keys(this.formGroup.controls).forEach(key => {
138
+ const formGroupOrControl = this.formGroup.controls[key];
139
+ if (formGroupOrControl instanceof SpiderlyFormGroup) {
140
+ Object.keys(formGroupOrControl.controls).forEach(key => {
141
+ const formControl = formGroupOrControl.controls[key]; // this.formArray.markAsDirty(); // FT: For some reason this doesnt work
142
+ if (formGroupOrControl.controlNamesFromHtml.includes(formControl.label) && formControl.invalid) {
143
+ formControl.markAsDirty();
144
+ invalid = true;
145
+ }
146
+ });
147
+ }
148
+ else if (formGroupOrControl instanceof SpiderlyFormControl) {
149
+ if (formGroupOrControl.invalid) {
150
+ formGroupOrControl.markAsDirty();
151
+ invalid = true;
152
+ }
153
+ }
154
+ });
155
+ if (invalid) {
156
+ return false;
157
+ }
158
+ return true;
159
+ }
160
+ //#endregion
161
+ //#region Model List
162
+ getFormArrayControlByIndex(formControlName, formArray, index, filter) {
163
+ if (formArray.controlNamesFromHtml.findIndex(x => x === formControlName) === -1)
164
+ formArray.controlNamesFromHtml.push(formControlName);
165
+ let filteredFormGroups;
166
+ if (filter) {
167
+ filteredFormGroups = filter(formArray.controls);
168
+ }
169
+ else {
170
+ return formArray.controls[index].controls[formControlName];
171
+ }
172
+ return filteredFormGroups[index]?.controls[formControlName]; // FT: Don't change this. It's always possible that change detection occurs before something.
173
+ }
174
+ getFormArrayControls(formControlName, formArray, filter) {
175
+ if (formArray.controlNamesFromHtml.findIndex(x => x === formControlName) === -1)
176
+ formArray.controlNamesFromHtml.push(formControlName);
177
+ let filteredFormGroups;
178
+ if (filter) {
179
+ filteredFormGroups = filter(formArray.controls);
180
+ }
181
+ else {
182
+ return formArray.controls.map(x => x.controls[formControlName]);
183
+ }
184
+ return filteredFormGroups.map(x => x.controls[formControlName]);
185
+ }
186
+ getFormArrayGroups(formArray) {
187
+ return this.baseFormService.getFormArrayGroups(formArray);
188
+ }
189
+ addNewFormGroupToFormArray(formArray, modelConstructor, index) {
190
+ return this.baseFormService.addNewFormGroupToFormArray(formArray, modelConstructor, index);
191
+ }
192
+ initFormArray(parentFormGroup, modelList, modelConstructor, formArraySaveBodyName, formArrayTranslationKey, required = false) {
193
+ return this.baseFormService.initFormArray(parentFormGroup, modelList, modelConstructor, formArraySaveBodyName, formArrayTranslationKey, required);
194
+ }
195
+ removeFormControlFromTheFormArray(formArray, index) {
196
+ if (index == null)
197
+ throw new Error('Can not pass null index.');
198
+ formArray.removeAt(index);
199
+ }
200
+ removeFormControlsFromTheFormArray(formArray, indexes) {
201
+ // Sort indexes in descending order to avoid index shifts when removing controls
202
+ const sortedIndexes = indexes.sort((a, b) => b - a);
203
+ sortedIndexes.forEach(index => {
204
+ if (index >= 0 && index < formArray.length) {
205
+ formArray.removeAt(index);
206
+ }
207
+ });
208
+ }
209
+ areFormArraysValid() {
210
+ if (this.formGroup.controls == null)
211
+ return true;
212
+ let invalid = false;
213
+ Object.keys(this.formGroup.controls).forEach(key => {
214
+ const formArray = this.formGroup.controls[key];
215
+ if (formArray instanceof SpiderlyFormArray) {
216
+ formArray.controls.forEach(formGroup => {
217
+ Object.keys(formGroup.controls).forEach(key => {
218
+ const formControl = formGroup.controls[key]; // this.formArray.markAsDirty(); // FT: For some reason this doesn't work
219
+ if ((formGroup.controlNamesFromHtml.includes(formControl.label) || formArray.controlNamesFromHtml.includes(formControl.label)) &&
220
+ formControl.invalid) {
221
+ formControl.markAsDirty();
222
+ invalid = true;
223
+ }
224
+ });
225
+ });
226
+ if (formArray.required == true && formArray.length == 0) {
227
+ invalid = true;
228
+ this.messageService.warningMessage(this.translocoService.translate('ListCanNotBeEmpty'));
229
+ }
230
+ }
231
+ });
232
+ if (invalid) {
233
+ return false;
234
+ }
235
+ return true;
236
+ }
237
+ onBeforeSaveList() { }
238
+ onAfterSaveList() { }
239
+ onAfterSaveListRequest() { }
240
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseFormCopy, deps: [{ token: i0.KeyValueDiffers }, { token: i1.HttpClient }, { token: i2.SpiderlyMessageService }, { token: i0.ChangeDetectorRef }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.TranslocoService }, { token: i5.BaseFormService }], target: i0.ɵɵFactoryTarget.Component }); }
241
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BaseFormCopy, selector: "base-form", ngImport: i0, template: '', isInline: true }); }
242
+ }
243
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseFormCopy, decorators: [{
244
+ type: Component,
245
+ args: [{ selector: 'base-form', template: '' }]
246
+ }], ctorParameters: () => [{ type: i0.KeyValueDiffers }, { type: i1.HttpClient }, { type: i2.SpiderlyMessageService }, { type: i0.ChangeDetectorRef }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.TranslocoService }, { type: i5.BaseFormService }] });
247
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtIGNvcHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGlkZXJseS9zcmMvbGliL2NvbXBvbmVudHMvYmFzZS1mb3JtL2Jhc2UtZm9ybSBjb3B5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFFTCxTQUFTLEdBSVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFLM0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7OztBQVUzRSxNQUFNLE9BQU8sWUFBWTtJQVF2QixZQUNZLE9BQXdCLEVBQ3hCLElBQWdCLEVBQ2hCLGNBQXNDLEVBQ3RDLGlCQUFvQyxFQUNwQyxNQUFjLEVBQ2QsS0FBcUIsRUFDckIsZ0JBQWtDLEVBQ2xDLGVBQWdDO1FBUGhDLFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQ3hCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsbUJBQWMsR0FBZCxjQUFjLENBQXdCO1FBQ3RDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBZjVDLGNBQVMsR0FBc0IsSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV6RCxtQ0FBOEIsR0FBVyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDM0csWUFBTyxHQUFZLElBQUksQ0FBQztRQW1CeEIsZUFBZTtRQUVmLGtCQUFhLEdBQUcsQ0FDZCxTQUErQixFQUMvQixlQUFrQyxFQUNsQyxnQkFBcUIsRUFD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LE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxnQkFBZ0IsS0FBRyxDQUFDO0lBQ3BCLGVBQWUsS0FBRyxDQUFDO0lBQ25CLHNCQUFzQixLQUFHLENBQUM7K0dBOVJmLFlBQVk7bUdBQVosWUFBWSxpREFIYixFQUFFOzs0RkFHRCxZQUFZO2tCQUx4QixTQUFTOytCQUNFLFdBQVcsWUFDWCxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUZvcm1TZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9iYXNlLWZvcm0uc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEtleVZhbHVlRGlmZmVyLFxyXG4gIEtleVZhbHVlRGlmZmVycyxcclxuICBPbkluaXQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNwaWRlcmx5Rm9ybUFycmF5LCBTcGlkZXJseUZvcm1Db250cm9sLCBTcGlkZXJseUZvcm1Hcm91cCB9IGZyb20gJy4uL3NwaWRlcmx5LWZvcm0tY29udHJvbC9zcGlkZXJseS1mb3JtLWNvbnRyb2wnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBTcGlkZXJseU1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3BpZGVybHktbWVzc2FnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBnZXRDb250cm9sLCBnZXRQYXJlbnRVcmwgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9oZWxwZXItZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJ0Bqc3ZlcnNlL3RyYW5zbG9jbyc7XHJcbmltcG9ydCB7IEJhc2VFbnRpdHkgfSBmcm9tICcuLi8uLi9lbnRpdGllcy9iYXNlLWVudGl0eSc7XHJcbmltcG9ydCB7IExhc3RNZW51SWNvbkluZGV4Q2xpY2tlZCB9IGZyb20gJy4uLy4uL2VudGl0aWVzL2xhc3QtbWVudS1pY29uLWluZGV4LWNsaWNrZWQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdiYXNlLWZvcm0nLFxyXG4gIHRlbXBsYXRlOiAnJyxcclxuICBzdHlsZXM6IFtdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFzZUZvcm1Db3B5IGltcGxlbWVudHMgT25Jbml0IHsgXHJcbiAgZm9ybUdyb3VwOiBTcGlkZXJseUZvcm1Hcm91cCA9IG5ldyBTcGlkZXJseUZvcm1Hcm91cCh7fSk7XHJcbiAgc2F2ZUJvZHk6IGFueTtcclxuICBzdWNjZXNzZnVsU2F2ZVRvYXN0RGVzY3JpcHRpb246IHN0cmluZyA9IHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUoJ1N1Y2Nlc3NmdWxTYXZlVG9hc3REZXNjcmlwdGlvbicpO1xyXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIG1vZGVsRGlmZmVyOiBLZXlWYWx1ZURpZmZlcjxzdHJpbmcsIGFueT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIGRpZmZlcnM6IEtleVZhbHVlRGlmZmVycywgXHJcbiAgICBwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCwgXHJcbiAgICBwcm90ZWN0ZWQgbWVzc2FnZVNlcnZpY2U6IFNwaWRlcmx5TWVzc2FnZVNlcnZpY2UsIFxyXG4gICAgcHJvdGVjdGVkIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlciwgXHJcbiAgICBwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJvdGVjdGVkIHRyYW5zbG9jb1NlcnZpY2U6IFRyYW5zbG9jb1NlcnZpY2UsXHJcbiAgICBwcm90ZWN0ZWQgYmFzZUZvcm1TZXJ2aWNlOiBCYXNlRm9ybVNlcnZpY2UsXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpe1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIE1vZGVsXHJcblxyXG4gIGluaXRGb3JtR3JvdXAgPSA8VD4oXHJcbiAgICBmb3JtR3JvdXA6IFNwaWRlcmx5Rm9ybUdyb3VwPFQ+LCBcclxuICAgIHBhcmVudEZvcm1Hcm91cDogU3BpZGVybHlGb3JtR3JvdXAsIFxyXG4gICAgbW9kZWxDb25zdHJ1Y3RvcjogYW55LCBcclxuICAgIHByb3BlcnR5TmFtZUluU2F2ZUJvZHk6IHN0cmluZyxcclxuICAgIHVwZGF0ZU9uQ2hhbmdlQ29udHJvbHM/OiAoa2V5b2YgVClbXVxyXG4gICkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYmFzZUZvcm1TZXJ2aWNlLmFkZEZvcm1Hcm91cChcclxuICAgICAgZm9ybUdyb3VwLCBwYXJlbnRGb3JtR3JvdXAsIG1vZGVsQ29uc3RydWN0b3IsIHByb3BlcnR5TmFtZUluU2F2ZUJvZHksIHVwZGF0ZU9uQ2hhbmdlQ29udHJvbHNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVGb3JtR3JvdXAgPSA8VD4oXHJcbiAgICBmb3JtR3JvdXA6IFNwaWRlcmx5Rm9ybUdyb3VwPFQ+LCBcclxuICAgIG1vZGVsQ29uc3RydWN0b3I6IFQgJiBCYXNlRW50aXR5LCBcclxuICAgIHVwZGF0ZU9uQ2hhbmdlQ29udHJvbHM/OiAoa2V5b2YgVClbXVxyXG4gICkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYmFzZUZvcm1TZXJ2aWNlLmluaXRGb3JtR3JvdXAoXHJcbiAgICAgIGZvcm1Hcm91cCwgbW9kZWxDb25zdHJ1Y3RvciwgdXBkYXRlT25DaGFuZ2VDb250cm9sc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNvbnRyb2wgPSA8VCBleHRlbmRzIEJhc2VFbnRpdHk+KGZvcm1Db250cm9sTmFtZTogc3RyaW5nICYga2V5b2YgVCwgZm9ybUdyb3VwOiBTcGlkZXJseUZvcm1Hcm91cDxUPikgPT4ge1xyXG4gICAgcmV0dXJuIGdldENvbnRyb2woZm9ybUNvbnRyb2xOYW1lLCBmb3JtR3JvdXApO1xyXG4gIH1cclxuXHJcbiAgb25TYXZlID0gKHJlcm91dGU6IGJvb2xlYW4gPSB0cnVlKSA9PiB7XHJcbiAgICB0aGlzLnNhdmVCb2R5ID0gdGhpcy5mb3JtR3JvdXAuaW5pdFNhdmVCb2R5KCk7XHJcbiAgICB0aGlzLm9uQmVmb3JlU2F2ZSh0aGlzLnNhdmVCb2R5KTtcclxuXHJcbiAgICB0aGlzLnNhdmVCb2R5ID0gdGhpcy5zYXZlQm9keSA/PyB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xyXG5cclxuICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gdGhpcy5hcmVGb3JtR3JvdXBzRnJvbVBhcmVudEZvcm1Hcm91cFZhbGlkKCk7XHJcbiAgICBsZXQgaXNGb3JtQXJyYXlWYWxpZDogYm9vbGVhbiA9IHRoaXMuYXJlRm9ybUFycmF5c1ZhbGlkKCk7XHJcblxyXG4gICAgaWYoaXNWYWxpZCAmJiBpc0Zvcm1BcnJheVZhbGlkKXtcclxuICAgICAgdGhpcy5mb3JtR3JvdXAuc2F2ZU9ic2VydmFibGVNZXRob2QodGhpcy5zYXZlQm9keSkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5zdWNjZXNzTWVzc2FnZSh0aGlzLnN1Y2Nlc3NmdWxTYXZlVG9hc3REZXNjcmlwdGlvbik7XHJcblxyXG4gICAgICAgIE9iamVjdC5rZXlzKHJlcykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmdldChrZXkpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBpZiAoZm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgaWYgKGZvcm1Db250cm9sIGluc3RhbmNlb2YgU3BpZGVybHlGb3JtQXJyYXkpIHtcclxuICAgICAgICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSBmb3JtQ29udHJvbCBhcyBTcGlkZXJseUZvcm1BcnJheTtcclxuICAgICAgICAgICAgICBpZiAocmVzW2tleV0ubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtQXJyYXkuY2xlYXIoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIC8vIEZUOiBUaGlzIGlzIG9rYXkgYmVjYXVzZSB3aGVuIHdlIGhhdmUgTTJNIGFzc29jaWF0aW9uIHdpdGggYWRkaXRpb25hbCBmaWVsZHMsIHdlIHdpbGwgbm90IGdpdmUgYmFjayB0aGUgbGlzdCBiZWNhdXNlIHdlIGFyZSBub3QgY2hlY2tpbmcgdmVyc2lvbiBvbiB0aGUgc2VydmVyLlxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5lcnJvcihgWW91IHJldHVybmVkIGVtcHR5IGFycmF5IGZvciBjb250cm9sOiAke2Zvcm1BcnJheS50cmFuc2xhdGlvbktleX0uYCk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICByZXNba2V5XS5mb3JFYWNoKChtb2RlbDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1vZGVsID09PSAnb2JqZWN0JyAmJiBtb2RlbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGZvcm1BcnJheS5tb2RlbENvbnN0cnVjdG9yLCBtb2RlbCk7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBoZWxwZXJGb3JtR3JvdXAgPSBuZXcgU3BpZGVybHlGb3JtR3JvdXAoe30pO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmJhc2VGb3JtU2VydmljZS5pbml0Rm9ybUdyb3VwKGhlbHBlckZvcm1Hcm91cCwgZm9ybUFycmF5Lm1vZGVsQ29uc3RydWN0b3IpXHJcbiAgICAgICAgICAgICAgICAgIGZvcm1BcnJheS5wdXNoKGhlbHBlckZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW4gbm90IGFkZCBwcmltaXRpdmUgZm9ybSBjb250cm9sIGluc2lkZSBmb3JtIGFycmF5LicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbC5wYXRjaFZhbHVlKHJlc1trZXldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIC8vIEZUOiBJdCdzIG9rYXkgdG8gZG8gdGhpcy5cclxuICAgICAgICAgICAgLy8gY29uc29sZS5lcnJvcignWW91IHJldHVybmVkIHNvbWV0aGluZyB0aGF0IGlzIG5vdCBpbiB0aGUgc2F2ZSBEVE8uJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChyZXJvdXRlKSB7XHJcbiAgICAgICAgICBjb25zdCBzYXZlZE9iamVjdElkID0gKHJlcyBhcyBhbnkpW3RoaXMuZm9ybUdyb3VwLm1haW5EVE9OYW1lXT8uaWQ7XHJcbiAgICAgICAgICB0aGlzLnJlcm91dGVUb1NhdmVkT2JqZWN0KHNhdmVkT2JqZWN0SWQpOyAvLyBZb3UgYWx3YXlzIG5lZWQgdG8gaGF2ZSBpZCwgYmVjYXVzZSBvZiBpZCA9PSAwIGFuZCB2ZXJzaW9uIGNoYW5nZVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLm9uQWZ0ZXJTYXZlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBcclxuICAgICAgdGhpcy5vbkFmdGVyU2F2ZVJlcXVlc3QoKTtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLmJhc2VGb3JtU2VydmljZS5zaG93SW52YWxpZEZpZWxkc01lc3NhZ2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlcm91dGVUb1NhdmVkT2JqZWN0ID0gKHJlcm91dGVJZDogbnVtYmVyIHwgc3RyaW5nKTogdm9pZCA9PiB7XHJcbiAgICBpZihyZXJvdXRlSWQgPT0gbnVsbCl7XHJcbiAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ1lvdSBkbyBub3QgaGF2ZSByZXJvdXRlSWQgaW4geW91ciBEVE8uJylcclxuICAgICAgY29uc3QgY3VycmVudFVybCA9IHRoaXMucm91dGVyLnVybDtcclxuICAgICAgY29uc3QgcGFyZW50VXJsOiBzdHJpbmcgPSBnZXRQYXJlbnRVcmwoY3VycmVudFVybCk7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwocGFyZW50VXJsKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgICBcclxuICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KCcvJyk7XHJcbiAgICBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXSA9IHJlcm91dGVJZC50b1N0cmluZygpO1xyXG5cclxuICAgIGNvbnN0IG5ld1VybCA9IHNlZ21lbnRzLmpvaW4oJy8nKTtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwobmV3VXJsKTtcclxuICB9XHJcblxyXG4gIG9uQmVmb3JlU2F2ZSA9IChzYXZlQm9keT86IGFueSkgPT4ge31cclxuICBvbkFmdGVyU2F2ZSA9ICgpID0+IHt9XHJcbiAgb25BZnRlclNhdmVSZXF1ZXN0ID0gKCkgPT4ge31cclxuXHJcbiAgYXJlRm9ybUdyb3Vwc0Zyb21QYXJlbnRGb3JtR3JvdXBWYWxpZCgpOiBib29sZWFuIHtcclxuICAgIGlmKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzID09IG51bGwpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgIGxldCBpbnZhbGlkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgT2JqZWN0LmtleXModGhpcy5mb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgY29uc3QgZm9ybUdyb3VwT3JDb250cm9sID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHNba2V5XTtcclxuXHJcbiAgICAgIGlmIChmb3JtR3JvdXBPckNvbnRyb2wgaW5zdGFuY2VvZiBTcGlkZXJseUZvcm1Hcm91cCl7XHJcbiAgICAgICAgT2JqZWN0LmtleXMoZm9ybUdyb3VwT3JDb250cm9sLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IGZvcm1Hcm91cE9yQ29udHJvbC5jb250cm9sc1trZXldIGFzIFNwaWRlcmx5Rm9ybUNvbnRyb2w7IC8vIHRoaXMuZm9ybUFycmF5Lm1hcmtBc0RpcnR5KCk7IC8vIEZUOiBGb3Igc29tZSByZWFzb24gdGhpcyBkb2VzbnQgd29ya1xyXG5cclxuICAgICAgICAgIGlmIChmb3JtR3JvdXBPckNvbnRyb2wuY29udHJvbE5hbWVzRnJvbUh0bWwuaW5jbHVkZXMoZm9ybUNvbnRyb2wubGFiZWwpICYmIGZvcm1Db250cm9sLmludmFsaWQpIHtcclxuICAgICAgICAgICAgZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgICAgaW52YWxpZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoZm9ybUdyb3VwT3JDb250cm9sIGluc3RhbmNlb2YgU3BpZGVybHlGb3JtQ29udHJvbCl7XHJcbiAgICAgICAgaWYgKGZvcm1Hcm91cE9yQ29udHJvbC5pbnZhbGlkKSB7XHJcbiAgICAgICAgICBmb3JtR3JvdXBPckNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgIGludmFsaWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChpbnZhbGlkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gTW9kZWwgTGlzdFxyXG4gIFxyXG4gIGdldEZvcm1BcnJheUNvbnRyb2xCeUluZGV4PFQ+KGZvcm1Db250cm9sTmFtZToga2V5b2YgVCAmIHN0cmluZywgZm9ybUFycmF5OiBTcGlkZXJseUZvcm1BcnJheTxUPiwgaW5kZXg6IG51bWJlciwgZmlsdGVyPzogKGZvcm1Hcm91cHM6IFNwaWRlcmx5Rm9ybUdyb3VwPFQ+W10pID0+IFNwaWRlcmx5Rm9ybUdyb3VwPFQ+W10pOiBTcGlkZXJseUZvcm1Db250cm9sIHtcclxuICAgIGlmKGZvcm1BcnJheS5jb250cm9sTmFtZXNGcm9tSHRtbC5maW5kSW5kZXgoeCA9PiB4ID09PSBmb3JtQ29udHJvbE5hbWUpID09PSAtMSlcclxuICAgICAgZm9ybUFycmF5LmNvbnRyb2xOYW1lc0Zyb21IdG1sLnB1c2goZm9ybUNvbnRyb2xOYW1lKTtcclxuXHJcbiAgICBsZXQgZmlsdGVyZWRGb3JtR3JvdXBzOiBTcGlkZXJseUZvcm1Hcm91cDxUPltdO1xyXG5cclxuICAgIGlmIChmaWx0ZXIpIHtcclxuICAgICAgZmlsdGVyZWRGb3JtR3JvdXBzID0gZmlsdGVyKGZvcm1BcnJheS5jb250cm9scyBhcyBTcGlkZXJseUZvcm1Hcm91cDxUPltdKTtcclxuICAgIH1cclxuICAgIGVsc2V7XHJcbiAgICAgIHJldHVybiAoZm9ybUFycmF5LmNvbnRyb2xzW2luZGV4XSBhcyBTcGlkZXJseUZvcm1Hcm91cDxUPikuY29udHJvbHNbZm9ybUNvbnRyb2xOYW1lXSBhcyBTcGlkZXJseUZvcm1Db250cm9sO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmaWx0ZXJlZEZvcm1Hcm91cHNbaW5kZXhdPy5jb250cm9sc1tmb3JtQ29udHJvbE5hbWVdIGFzIFNwaWRlcmx5Rm9ybUNvbnRyb2w7IC8vIEZUOiBEb24ndCBjaGFuZ2UgdGhpcy4gSXQncyBhbHdheXMgcG9zc2libGUgdGhhdCBjaGFuZ2UgZGV0ZWN0aW9uIG9jY3VycyBiZWZvcmUgc29tZXRoaW5nLlxyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybUFycmF5Q29udHJvbHM8VD4oZm9ybUNvbnRyb2xOYW1lOiBrZXlvZiBUICYgc3RyaW5nLCBmb3JtQXJyYXk6IFNwaWRlcmx5Rm9ybUFycmF5PFQ+LCBmaWx0ZXI/OiAoZm9ybUdyb3VwczogU3BpZGVybHlGb3JtR3JvdXA8VD5bXSkgPT4gU3BpZGVybHlGb3JtR3JvdXA8VD5bXSk6IFNwaWRlcmx5Rm9ybUNvbnRyb2xbXSB7XHJcbiAgICBpZihmb3JtQXJyYXkuY29udHJvbE5hbWVzRnJvbUh0bWwuZmluZEluZGV4KHggPT4geCA9PT0gZm9ybUNvbnRyb2xOYW1lKSA9PT0gLTEpXHJcbiAgICAgIGZvcm1BcnJheS5jb250cm9sTmFtZXNGcm9tSHRtbC5wdXNoKGZvcm1Db250cm9sTmFtZSk7XHJcblxyXG4gICAgbGV0IGZpbHRlcmVkRm9ybUdyb3VwczogU3BpZGVybHlGb3JtR3JvdXA8VD5bXTtcclxuXHJcbiAgICBpZiAoZmlsdGVyKSB7XHJcbiAgICAgIGZpbHRlcmVkRm9ybUdyb3VwcyA9IGZpbHRlcihmb3JtQXJyYXkuY29udHJvbHMgYXMgU3BpZGVybHlGb3JtR3JvdXA8VD5bXSk7XHJcbiAgICB9XHJcbiAgICBlbHNle1xyXG4gICAgICByZXR1cm4gKGZvcm1BcnJheS5jb250cm9scyBhcyBTcGlkZXJseUZvcm1Hcm91cDxUPltdKS5tYXAoeCA9PiB4LmNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0gYXMgU3BpZGVybHlGb3JtQ29udHJvbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZpbHRlcmVkRm9ybUdyb3Vwcy5tYXAoeCA9PiB4LmNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0gYXMgU3BpZGVybHlGb3JtQ29udHJvbCk7XHJcbiAgfVxyXG5cclxuICBnZXRGb3JtQXJyYXlHcm91cHM8VD4oZm9ybUFycmF5OiBTcGlkZXJseUZvcm1BcnJheTxUPik6IFNwaWRlcmx5Rm9ybUdyb3VwPFQ+W117XHJcbiAgICByZXR1cm4gdGhpcy5iYXNlRm9ybVNlcnZpY2UuZ2V0Rm9ybUFycmF5R3JvdXBzKGZvcm1BcnJheSk7XHJcbiAgfVxyXG5cclxuICBhZGROZXdGb3JtR3JvdXBUb0Zvcm1BcnJheTxUPihcclxuICAgIGZvcm1BcnJheTogU3BpZGVybHlGb3JtQXJyYXk8VD4sIFxyXG4gICAgbW9kZWxDb25zdHJ1Y3RvcjogVCAmIEJhc2VFbnRpdHksXHJcbiAgICBpbmRleDogbnVtYmVyLFxyXG4gICkgOiBTcGlkZXJseUZvcm1Hcm91cCB7XHJcbiAgICByZXR1cm4gdGhpcy5iYXNlRm9ybVNlcnZpY2UuYWRkTmV3Rm9ybUdyb3VwVG9Gb3JtQXJyYXkoZm9ybUFycmF5LCBtb2RlbENvbnN0cnVjdG9yLCBpbmRleClcclxuICB9XHJcblxyXG4gIGluaXRGb3JtQXJyYXk8VD4oXHJcbiAgICBwYXJlbnRGb3JtR3JvdXA6IFNwaWRlcmx5Rm9ybUdyb3VwLCBcclxuICAgIG1vZGVsTGlzdDogKFQgJiBCYXNlRW50aXR5KVtdLCBcclxuICAgIG1vZGVsQ29uc3RydWN0b3I6IFQgJiBCYXNlRW50aXR5LCBcclxuICAgIGZvcm1BcnJheVNhdmVCb2R5TmFtZTogc3RyaW5nLCBcclxuICAgIGZvcm1BcnJheVRyYW5zbGF0aW9uS2V5OiBzdHJpbmcsIFxyXG4gICAgcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZSlcclxuICB7XHJcbiAgICByZXR1cm4gdGhpcy5iYXNlRm9ybVNlcnZpY2UuaW5pdEZvcm1BcnJheTxUPihcclxuICAgICAgcGFyZW50Rm9ybUdyb3VwLCBtb2RlbExpc3QsIG1vZGVsQ29uc3RydWN0b3IsIGZvcm1BcnJheVNhdmVCb2R5TmFtZSwgZm9ybUFycmF5VHJhbnNsYXRpb25LZXksIHJlcXVpcmVkXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRm9ybUNvbnRyb2xGcm9tVGhlRm9ybUFycmF5KGZvcm1BcnJheTogU3BpZGVybHlGb3JtQXJyYXksIGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmKGluZGV4ID09IG51bGwpXHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBwYXNzIG51bGwgaW5kZXguJyk7XHJcblxyXG4gICAgZm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUZvcm1Db250cm9sc0Zyb21UaGVGb3JtQXJyYXkoZm9ybUFycmF5OiBTcGlkZXJseUZvcm1BcnJheSwgaW5kZXhlczogbnVtYmVyW10pIHtcclxuICAgIC8vIFNvcnQgaW5kZXhlcyBpbiBkZXNjZW5kaW5nIG9yZGVyIHRvIGF2b2lkIGluZGV4IHNoaWZ0cyB3aGVuIHJlbW92aW5nIGNvbnRyb2xzXHJcbiAgICBjb25zdCBzb3J0ZWRJbmRleGVzID0gaW5kZXhlcy5zb3J0KChhLCBiKSA9PiBiIC0gYSk7XHJcblxyXG4gICAgc29ydGVkSW5kZXhlcy5mb3JFYWNoKGluZGV4ID0+IHtcclxuICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBmb3JtQXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgICAgZm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhcmVGb3JtQXJyYXlzVmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICBpZih0aGlzLmZvcm1Hcm91cC5jb250cm9scyA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBsZXQgaW52YWxpZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2tleV0gYXMgdW5rbm93biBhcyBTcGlkZXJseUZvcm1BcnJheTtcclxuICAgICAgXHJcbiAgICAgIGlmIChmb3JtQXJyYXkgaW5zdGFuY2VvZiBTcGlkZXJseUZvcm1BcnJheSl7XHJcbiAgICAgICAgKGZvcm1BcnJheS5jb250cm9scyBhcyBTcGlkZXJseUZvcm1Hcm91cFtdKS5mb3JFYWNoKGZvcm1Hcm91cCA9PiB7XHJcbiAgICAgICAgICBPYmplY3Qua2V5cyhmb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSBmb3JtR3JvdXAuY29udHJvbHNba2V5XSBhcyBTcGlkZXJseUZvcm1Db250cm9sOyAvLyB0aGlzLmZvcm1BcnJheS5tYXJrQXNEaXJ0eSgpOyAvLyBGVDogRm9yIHNvbWUgcmVhc29uIHRoaXMgZG9lc24ndCB3b3JrXHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgKGZvcm1Hcm91cC5jb250cm9sTmFtZXNGcm9tSHRtbC5pbmNsdWRlcyhmb3JtQ29udHJvbC5sYWJlbCkgfHwgZm9ybUFycmF5LmNvbnRyb2xOYW1lc0Zyb21IdG1sLmluY2x1ZGVzKGZvcm1Db250cm9sLmxhYmVsKSkgJiYgXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2wuaW52YWxpZFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgICAgICAgIGludmFsaWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGZvcm1BcnJheS5yZXF1aXJlZCA9PSB0cnVlICYmIGZvcm1BcnJheS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgaW52YWxpZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLndhcm5pbmdNZXNzYWdlKHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUoJ0xpc3RDYW5Ob3RCZUVtcHR5JykpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGludmFsaWQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb25CZWZvcmVTYXZlTGlzdCgpe31cclxuICBvbkFmdGVyU2F2ZUxpc3QoKXt9XHJcbiAgb25BZnRlclNhdmVMaXN0UmVxdWVzdCgpe31cclxuXHJcbiAgLy8gRlQ6IFNlbmRpbmcgTGFzdE1lbnVJY29uSW5kZXhDbGlja2VkIGNsYXNzIGJlY2F1c2Ugb2YgcmVmZXJlbmNlIHR5cGVcclxuICBnZXRDcnVkTWVudUZvck9yZGVyZWREYXRhID0gKFxyXG4gICAgZm9ybUFycmF5OiBTcGlkZXJseUZvcm1BcnJheSwgXHJcbiAgICBtb2RlbENvbnN0cnVjdG9yOiBCYXNlRW50aXR5LCBcclxuICAgIGxhc3RNZW51SWNvbkluZGV4Q2xpY2tlZDogTGFzdE1lbnVJY29uSW5kZXhDbGlja2VkLCBcclxuICAgIGFkanVzdEZvcm1BcnJheU1hbnVhbGx5OiBib29sZWFuID0gZmFsc2VcclxuICApOiBNZW51SXRlbVtdID0+IHtcclxuICAgIGxldCBjcnVkTWVudUZvck9yZGVyZWREYXRhOiBNZW51SXRlbVtdID0gW1xyXG4gICAgICAgIHtsYWJlbDogdGhpcy50cmFuc2xvY29TZXJ2aWNlLnRyYW5zbGF0ZSgnUmVtb3ZlJyksIGljb246ICdwaSBwaS1taW51cycsIGNvbW1hbmQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMub25CZWZvcmVSZW1vdmUoZm9ybUFycmF5LCBtb2RlbENvbnN0cnVjdG9yLCBsYXN0TWVudUljb25JbmRleENsaWNrZWQuaW5kZXgpO1xyXG4gICAgICAgICAgaWYgKGFkanVzdEZvcm1BcnJheU1hbnVhbGx5ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZvcm1Db250cm9sRnJvbVRoZUZvcm1BcnJheShmb3JtQXJyYXksIGxhc3RNZW51SWNvbkluZGV4Q2xpY2tlZC5pbmRleCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfX0sXHJcbiAgICAgICAge2xhYmVsOiB0aGlzLnRyYW5zbG9jb1NlcnZpY2UudHJhbnNsYXRlKCdBZGRBYm92ZScpLCBpY29uOiAncGkgcGktYXJyb3ctdXAnLCBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9uQmVmb3JlQWRkQWJvdmUoZm9ybUFycmF5LCBtb2RlbENvbnN0cnVjdG9yLCBsYXN0TWVudUljb25JbmRleENsaWNrZWQuaW5kZXgpO1xyXG4gICAgICAgICAgaWYgKGFkanVzdEZvcm1BcnJheU1hbnVhbGx5ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLmJhc2VGb3JtU2VydmljZS5hZGROZXdGb3JtR3JvdXBUb0Zvcm1BcnJheShcclxuICAgICAgICAgICAgICBmb3JtQXJyYXksIG1vZGVsQ29uc3RydWN0b3IsIGxhc3RNZW51SWNvbkluZGV4Q2xpY2tlZC5pbmRleFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH19LFxyXG4gICAgICAgIHtsYWJlbDogdGhpcy50cmFuc2xvY29TZXJ2aWNlLnRyYW5zbGF0ZSgnQWRkQmVsb3cnKSwgaWNvbjogJ3BpIHBpLWFycm93LWRvd24nLCBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9uQmVmb3JlQWRkQmVsb3coZm9ybUFycmF5LCBtb2RlbENvbnN0cnVjdG9yLCBsYXN0TWVudUljb25JbmRleENsaWNrZWQuaW5kZXgpO1xyXG4gICAgICAgICAgaWYgKGFkanVzdEZvcm1BcnJheU1hbnVhbGx5ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLmJhc2VGb3JtU2VydmljZS5hZGROZXdGb3JtR3JvdXBUb0Zvcm1BcnJheShcclxuICAgICAgICAgICAgICBmb3JtQXJyYXksIG1vZGVsQ29uc3RydWN0b3IsIGxhc3RNZW51SWNvbkluZGV4Q2xpY2tlZC5pbmRleCArIDFcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9fSxcclxuICAgIF07XHJcblxyXG4gICAgcmV0dXJuIGNydWRNZW51Rm9yT3JkZXJlZERhdGE7XHJcbiAgfVxyXG5cclxuICBvbkJlZm9yZVJlbW92ZSA9IChmb3JtQXJyYXk6IFNwaWRlcmx5Rm9ybUFycmF5LCBtb2RlbENvbnN0cnVjdG9yOiBhbnksIGxhc3RNZW51SWNvbkluZGV4Q2xpY2tlZDogbnVtYmVyKSA9PiB7fVxyXG5cclxuICBvbkJlZm9yZUFkZEFib3ZlID0gKGZvcm1BcnJheTogU3BpZGVybHlGb3JtQXJyYXksIG1vZGVsQ29uc3RydWN0b3I6IGFueSwgbGFzdE1lbnVJY29uSW5kZXhDbGlja2VkOiBudW1iZXIpID0+IHt9XHJcblxyXG4gIG9uQmVmb3JlQWRkQmVsb3cgPSAoZm9ybUFycmF5OiBTcGlkZXJseUZvcm1BcnJheSwgbW9kZWxDb25zdHJ1Y3RvcjogYW55LCBsYXN0TWVudUljb25JbmRleENsaWNrZWQ6IG51bWJlcikgPT4ge31cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG59XHJcbiJdfQ==
@@ -0,0 +1,25 @@
1
+ import { Component, Input } from "@angular/core";
2
+ import { SkeletonModule } from 'primeng/skeleton';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "primeng/skeleton";
5
+ export class CardSkeletonComponent {
6
+ constructor() {
7
+ this.height = 400;
8
+ this.titleHeight = 23;
9
+ this.padding = 21;
10
+ this.titleMarginBottom = 14;
11
+ this.titleMarginTop = 4;
12
+ }
13
+ ngOnInit() {
14
+ this.dataHeight = this.height - (this.titleHeight + this.padding * 2 + this.titleMarginBottom + this.titleMarginTop);
15
+ }
16
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CardSkeletonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CardSkeletonComponent, isStandalone: true, selector: "card-skeleton", inputs: { height: "height" }, ngImport: i0, template: "<div class=\"border-round border-1 surface-border p-4 surface-card\" [style]=\"'height: ' + height + 'px;'\">\r\n <div [style]=\"'margin-bottom:' + titleMarginBottom + 'px; margin-top:' + titleMarginTop + 'px;'\">\r\n <p-skeleton width=\"160px\" [height]=\"titleHeight + 'px'\"></p-skeleton>\r\n </div>\r\n <div [style]=\"'height: ' + dataHeight + 'px;'\">\r\n <p-skeleton width=\"100%\" height=\"100%\"/>\r\n </div>\r\n</div>", dependencies: [{ kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i1.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }] }); }
18
+ }
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CardSkeletonComponent, decorators: [{
20
+ type: Component,
21
+ args: [{ selector: 'card-skeleton', standalone: true, imports: [SkeletonModule], template: "<div class=\"border-round border-1 surface-border p-4 surface-card\" [style]=\"'height: ' + height + 'px;'\">\r\n <div [style]=\"'margin-bottom:' + titleMarginBottom + 'px; margin-top:' + titleMarginTop + 'px;'\">\r\n <p-skeleton width=\"160px\" [height]=\"titleHeight + 'px'\"></p-skeleton>\r\n </div>\r\n <div [style]=\"'height: ' + dataHeight + 'px;'\">\r\n <p-skeleton width=\"100%\" height=\"100%\"/>\r\n </div>\r\n</div>" }]
22
+ }], propDecorators: { height: [{
23
+ type: Input
24
+ }] } });
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1za2VsZXRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGlkZXJseS9zcmMvbGliL2NvbXBvbmVudHMvY2FyZC1za2VsZXRvbi9jYXJkLXNrZWxldG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwaWRlcmx5L3NyYy9saWIvY29tcG9uZW50cy9jYXJkLXNrZWxldG9uL2NhcmQtc2tlbGV0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7QUFTbEQsTUFBTSxPQUFPLHFCQUFxQjtJQVBsQztRQVFXLFdBQU0sR0FBVyxHQUFHLENBQUM7UUFDOUIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFFekIsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUNyQixzQkFBaUIsR0FBVyxFQUFFLENBQUM7UUFDL0IsbUJBQWMsR0FBVyxDQUFDLENBQUM7S0FLNUI7SUFIQyxRQUFRO1FBQ04sSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ3RILENBQUM7K0dBVlUscUJBQXFCO21HQUFyQixxQkFBcUIsdUdDVmxDLHNjQU9NLDJDRENNLGNBQWM7OzRGQUViLHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDRSxlQUFlLGNBR2IsSUFBSSxXQUNQLENBQUMsY0FBYyxDQUFDOzhCQUdoQixNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgU2tlbGV0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL3NrZWxldG9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2FyZC1za2VsZXRvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhcmQtc2tlbGV0b24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlczogW10sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbU2tlbGV0b25Nb2R1bGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYXJkU2tlbGV0b25Db21wb25lbnQge1xyXG4gIEBJbnB1dCgpIGhlaWdodDogbnVtYmVyID0gNDAwO1xyXG4gIHRpdGxlSGVpZ2h0OiBudW1iZXIgPSAyMztcclxuICBkYXRhSGVpZ2h0OiBudW1iZXI7XHJcbiAgcGFkZGluZzogbnVtYmVyID0gMjE7XHJcbiAgdGl0bGVNYXJnaW5Cb3R0b206IG51bWJlciA9IDE0O1xyXG4gIHRpdGxlTWFyZ2luVG9wOiBudW1iZXIgPSA0O1xyXG5cclxuICBuZ09uSW5pdCgpe1xyXG4gICAgdGhpcy5kYXRhSGVpZ2h0ID0gdGhpcy5oZWlnaHQgLSAodGhpcy50aXRsZUhlaWdodCArIHRoaXMucGFkZGluZyAqIDIgKyB0aGlzLnRpdGxlTWFyZ2luQm90dG9tICsgdGhpcy50aXRsZU1hcmdpblRvcClcclxuICB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwiYm9yZGVyLXJvdW5kIGJvcmRlci0xIHN1cmZhY2UtYm9yZGVyIHAtNCBzdXJmYWNlLWNhcmRcIiBbc3R5bGVdPVwiJ2hlaWdodDogJyArIGhlaWdodCArICdweDsnXCI+XHJcbiAgICA8ZGl2IFtzdHlsZV09XCInbWFyZ2luLWJvdHRvbTonICsgdGl0bGVNYXJnaW5Cb3R0b20gKyAncHg7IG1hcmdpbi10b3A6JyArIHRpdGxlTWFyZ2luVG9wICsgJ3B4OydcIj5cclxuICAgICAgICA8cC1za2VsZXRvbiB3aWR0aD1cIjE2MHB4XCIgW2hlaWdodF09XCJ0aXRsZUhlaWdodCArICdweCdcIj48L3Atc2tlbGV0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgW3N0eWxlXT1cIidoZWlnaHQ6ICcgKyBkYXRhSGVpZ2h0ICsgJ3B4OydcIj5cclxuICAgICAgICA8cC1za2VsZXRvbiB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxMDAlXCIvPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,16 @@
1
+ import { Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../services/config-base.service";
4
+ export class FooterComponent {
5
+ constructor(config) {
6
+ this.config = config;
7
+ this.companyName = this.config.companyName;
8
+ }
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FooterComponent, deps: [{ token: i1.ConfigBaseService }], target: i0.ɵɵFactoryTarget.Component }); }
10
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FooterComponent, isStandalone: true, selector: "footer", ngImport: i0, template: "<div class=\"layout-footer\">\r\n <span class=\"font-medium ml-2\">{{companyName}}</span>\r\n</div>\r\n" }); }
11
+ }
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FooterComponent, decorators: [{
13
+ type: Component,
14
+ args: [{ selector: 'footer', standalone: true, template: "<div class=\"layout-footer\">\r\n <span class=\"font-medium ml-2\">{{companyName}}</span>\r\n</div>\r\n" }]
15
+ }], ctorParameters: () => [{ type: i1.ConfigBaseService }] });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9vdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwaWRlcmx5L3NyYy9saWIvY29tcG9uZW50cy9mb290ZXIvZm9vdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwaWRlcmx5L3NyYy9saWIvY29tcG9uZW50cy9mb290ZXIvZm9vdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQVExQyxNQUFNLE9BQU8sZUFBZTtJQUd4QixZQUNZLE1BQXlCO1FBQXpCLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBSHJDLGdCQUFXLEdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFNOUMsQ0FBQzsrR0FQUSxlQUFlO21HQUFmLGVBQWUsa0VDUjVCLDRHQUdBOzs0RkRLYSxlQUFlO2tCQUwzQixTQUFTOytCQUNJLFFBQVEsY0FFTixJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbmZpZ0Jhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnLWJhc2Uuc2VydmljZSdcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdmb290ZXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvb3Rlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGb290ZXJDb21wb25lbnQge1xyXG4gICAgY29tcGFueU5hbWU6IHN0cmluZyA9IHRoaXMuY29uZmlnLmNvbXBhbnlOYW1lO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgY29uZmlnOiBDb25maWdCYXNlU2VydmljZVxyXG4gICAgKSB7IFxyXG5cclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibGF5b3V0LWZvb3RlclwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJmb250LW1lZGl1bSBtbC0yXCI+e3tjb21wYW55TmFtZX19PC9zcGFuPlxyXG48L2Rpdj5cclxuIl19