@mediusinc/mng-commons 2.6.0 → 3.0.0-rc.1

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 (287) hide show
  1. package/README.md +17 -6
  2. package/dev-scripts/version-info.js +1 -0
  3. package/esm2022/lib/api/models/filter-param.model.mjs +33 -0
  4. package/esm2022/lib/api/models/query-param.model.mjs +68 -0
  5. package/esm2022/lib/api/models/query-result.model.mjs +24 -0
  6. package/esm2022/lib/api/utils/medius-rest.util.mjs +255 -0
  7. package/esm2022/lib/api/utils/object-serializer.util.mjs +258 -0
  8. package/esm2022/lib/components/action/action.component.mjs +304 -0
  9. package/esm2022/lib/components/action/editor/action-editor.component.mjs +386 -0
  10. package/esm2022/lib/components/action/localization/data-language-dropdown.component.mjs +54 -0
  11. package/{esm2020 → esm2022}/lib/components/action/models/action-execution.model.mjs +1 -1
  12. package/esm2022/lib/components/action/models/tableview-action-default-categories.model.mjs +11 -0
  13. package/{esm2020 → esm2022}/lib/components/action/route/action-route.component.mjs +4 -4
  14. package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +300 -0
  15. package/{esm2020 → esm2022}/lib/components/form/date-range/date-range.component.mjs +5 -5
  16. package/esm2022/lib/components/form/dropdown/dropdown.component.mjs +212 -0
  17. package/esm2022/lib/components/form/editor/form-editor.component.mjs +288 -0
  18. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +4 -4
  19. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +5 -5
  20. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-custom/formly-custom-field-base.model.mjs +4 -4
  21. package/esm2022/lib/components/form/formly/fields/formly-field-custom/formly-field-custom.component.mjs +39 -0
  22. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +4 -4
  23. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +4 -4
  24. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +5 -5
  25. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +4 -4
  26. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +7 -7
  27. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +4 -4
  28. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +4 -4
  29. package/esm2022/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +19 -0
  30. package/{esm2020 → esm2022}/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +4 -4
  31. package/{esm2020 → esm2022}/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +4 -4
  32. package/esm2022/lib/components/form/models/form-editor.event.mjs +49 -0
  33. package/esm2022/lib/components/layout/breadcrumb.component.mjs +34 -0
  34. package/{esm2020 → esm2022}/lib/components/layout/footer.component.mjs +4 -4
  35. package/{esm2020 → esm2022}/lib/components/layout/main-layout.component.mjs +4 -4
  36. package/esm2022/lib/components/layout/menu-item.component.mjs +296 -0
  37. package/{esm2020 → esm2022}/lib/components/layout/menu.component.mjs +4 -4
  38. package/{esm2020 → esm2022}/lib/components/layout/services/main-layout.component.service.mjs +4 -4
  39. package/{esm2020 → esm2022}/lib/components/layout/topbar-user.component.mjs +4 -4
  40. package/{esm2020 → esm2022}/lib/components/layout/topbar.component.mjs +4 -4
  41. package/{esm2020 → esm2022}/lib/components/layout/version.component.mjs +4 -4
  42. package/{esm2020 → esm2022}/lib/components/pages/error/error-page.component.mjs +4 -4
  43. package/{esm2020 → esm2022}/lib/components/pages/not-found/not-found-page.component.mjs +4 -4
  44. package/{esm2020 → esm2022}/lib/components/tableview/models/table.event.mjs +1 -1
  45. package/{esm2020 → esm2022}/lib/components/tableview/route/tableview-route.abstract.component.mjs +5 -5
  46. package/{esm2020 → esm2022}/lib/components/tableview/route/tableview-route.component.mjs +4 -4
  47. package/esm2022/lib/components/tableview/table/column-filter/column-filter.component.mjs +124 -0
  48. package/esm2022/lib/components/tableview/table/column-value/column-value.component.mjs +110 -0
  49. package/esm2022/lib/components/tableview/table/table.component.mjs +747 -0
  50. package/esm2022/lib/components/tableview/tableview.component.mjs +147 -0
  51. package/esm2022/lib/descriptors/action/action.descriptor.mjs +634 -0
  52. package/esm2022/lib/descriptors/editor/editor.descriptor.mjs +304 -0
  53. package/esm2022/lib/descriptors/editor/field.descriptor.mjs +1088 -0
  54. package/esm2022/lib/descriptors/table/table.descriptor.mjs +542 -0
  55. package/esm2022/lib/descriptors/tableview/tableview.descriptor.mjs +352 -0
  56. package/{esm2020 → esm2022}/lib/descriptors/types/table.type.mjs +1 -5
  57. package/{esm2020 → esm2022}/lib/directives/component.directive.mjs +5 -5
  58. package/{esm2020 → esm2022}/lib/directives/template.directive.mjs +5 -5
  59. package/esm2022/lib/mng-commons.module.mjs +465 -0
  60. package/{esm2020 → esm2022}/lib/pipes/boolean.pipe.mjs +4 -4
  61. package/{esm2020 → esm2022}/lib/pipes/class-map.pipe.mjs +4 -4
  62. package/{esm2020 → esm2022}/lib/pipes/enum.pipe.mjs +4 -4
  63. package/{esm2020 → esm2022}/lib/pipes/enumerate-async.pipe.mjs +4 -4
  64. package/{esm2020 → esm2022}/lib/pipes/enumerate.pipe.mjs +4 -4
  65. package/{esm2020 → esm2022}/lib/pipes/getter.pipe.mjs +4 -4
  66. package/{esm2020 → esm2022}/lib/pipes/i18n-property.pipe.mjs +4 -4
  67. package/{esm2020 → esm2022}/lib/pipes/json-path.pipe.mjs +4 -4
  68. package/{esm2020 → esm2022}/lib/pipes/locale-default-row-class.pipe.mjs +4 -4
  69. package/{esm2020 → esm2022}/lib/pipes/parametrize.pipe.mjs +4 -4
  70. package/{esm2020 → esm2022}/lib/pipes/template.pipe.mjs +4 -4
  71. package/esm2022/lib/router/route-builder.mjs +308 -0
  72. package/esm2022/lib/router/routes-builder.mjs +61 -0
  73. package/esm2022/lib/security/authorization.guard.mjs +15 -0
  74. package/{esm2020 → esm2022}/lib/security/authorization.service.mjs +4 -4
  75. package/esm2022/lib/services/action-executor.service.mjs +703 -0
  76. package/{esm2020 → esm2022}/lib/services/commons.service.mjs +4 -4
  77. package/esm2022/lib/services/configuration.service.mjs +150 -0
  78. package/{esm2020 → esm2022}/lib/services/internal/commons-init.service.mjs +4 -4
  79. package/{esm2020 → esm2022}/lib/services/mng-localstorage-config.service.mjs +4 -4
  80. package/{esm2020 → esm2022}/lib/services/navigation.service.mjs +4 -4
  81. package/{esm2020 → esm2022}/lib/services/router.service.mjs +4 -4
  82. package/{esm2020 → esm2022}/lib/services/version.service.mjs +4 -4
  83. package/{esm2020 → esm2022}/lib/services/view-container.component.service.mjs +4 -4
  84. package/esm2022/lib/styles/styles.util.mjs +42 -0
  85. package/esm2022/lib/types/type.model.mjs +2 -0
  86. package/esm2022/lib/utils/date.util.mjs +120 -0
  87. package/esm2022/lib/utils/tableview.util.mjs +193 -0
  88. package/esm2022/lib/utils/type.util.mjs +94 -0
  89. package/{fesm2020 → fesm2022}/mediusinc-mng-commons.mjs +952 -940
  90. package/fesm2022/mediusinc-mng-commons.mjs.map +1 -0
  91. package/lib/api/utils/medius-rest.util.d.ts +4 -3
  92. package/lib/components/action/action.component.d.ts +1 -1
  93. package/lib/components/action/editor/action-editor.component.d.ts +6 -9
  94. package/lib/components/action/localization/data-language-dropdown.component.d.ts +1 -1
  95. package/lib/components/form/autocomplete/autocomplete.component.d.ts +4 -4
  96. package/lib/components/form/date-range/date-range.component.d.ts +1 -1
  97. package/lib/components/form/dropdown/dropdown.component.d.ts +3 -3
  98. package/lib/components/form/editor/form-editor.component.d.ts +1 -1
  99. package/lib/components/form/formly/fields/formly-field-custom/formly-custom-field-base.model.d.ts +1 -1
  100. package/lib/components/form/formly/fields/formly-field-custom/formly-field-custom.component.d.ts +1 -0
  101. package/lib/components/layout/breadcrumb.component.d.ts +5 -0
  102. package/lib/components/layout/menu-item.component.d.ts +1 -1
  103. package/lib/components/layout/version.component.d.ts +1 -1
  104. package/lib/components/tableview/models/table.event.d.ts +2 -2
  105. package/lib/components/tableview/route/tableview-route.component.d.ts +1 -1
  106. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +2 -2
  107. package/lib/components/tableview/table/column-value/column-value.component.d.ts +1 -1
  108. package/lib/components/tableview/table/table.component.d.ts +6 -7
  109. package/lib/components/tableview/tableview.component.d.ts +7 -11
  110. package/lib/descriptors/editor/editor.descriptor.d.ts +1 -1
  111. package/lib/descriptors/editor/field.descriptor.d.ts +3 -1
  112. package/lib/descriptors/table/table.descriptor.d.ts +8 -3
  113. package/lib/descriptors/tableview/tableview.descriptor.d.ts +4 -4
  114. package/lib/descriptors/types/table.type.d.ts +1 -5
  115. package/lib/directives/component.directive.d.ts +1 -1
  116. package/lib/directives/template.directive.d.ts +1 -1
  117. package/lib/router/route-builder.d.ts +6 -10
  118. package/lib/router/routes-builder.d.ts +0 -5
  119. package/lib/security/authorization.guard.d.ts +2 -11
  120. package/lib/services/action-executor.service.d.ts +1 -15
  121. package/lib/utils/route.util.d.ts +8 -19
  122. package/lib/utils/tableview.util.d.ts +5 -0
  123. package/package.json +12 -19
  124. package/esm2020/lib/api/models/filter-param.model.mjs +0 -33
  125. package/esm2020/lib/api/models/query-param.model.mjs +0 -68
  126. package/esm2020/lib/api/models/query-result.model.mjs +0 -24
  127. package/esm2020/lib/api/utils/medius-rest.util.mjs +0 -246
  128. package/esm2020/lib/api/utils/object-serializer.util.mjs +0 -258
  129. package/esm2020/lib/components/action/action.component.mjs +0 -303
  130. package/esm2020/lib/components/action/editor/action-editor.component.mjs +0 -390
  131. package/esm2020/lib/components/action/localization/data-language-dropdown.component.mjs +0 -47
  132. package/esm2020/lib/components/action/models/tableview-action-default-categories.model.mjs +0 -11
  133. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +0 -303
  134. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +0 -214
  135. package/esm2020/lib/components/form/editor/form-editor.component.mjs +0 -288
  136. package/esm2020/lib/components/form/formly/fields/formly-field-custom/formly-field-custom.component.mjs +0 -54
  137. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +0 -19
  138. package/esm2020/lib/components/form/models/form-editor.event.mjs +0 -49
  139. package/esm2020/lib/components/layout/breadcrumb.component.mjs +0 -19
  140. package/esm2020/lib/components/layout/menu-item.component.mjs +0 -294
  141. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +0 -126
  142. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +0 -108
  143. package/esm2020/lib/components/tableview/table/table.component.mjs +0 -749
  144. package/esm2020/lib/components/tableview/tableview.component.mjs +0 -146
  145. package/esm2020/lib/descriptors/action/action.descriptor.mjs +0 -634
  146. package/esm2020/lib/descriptors/editor/editor.descriptor.mjs +0 -304
  147. package/esm2020/lib/descriptors/editor/field.descriptor.mjs +0 -1083
  148. package/esm2020/lib/descriptors/table/table.descriptor.mjs +0 -521
  149. package/esm2020/lib/descriptors/tableview/tableview.descriptor.mjs +0 -347
  150. package/esm2020/lib/mng-commons.module.mjs +0 -469
  151. package/esm2020/lib/router/route-builder.mjs +0 -312
  152. package/esm2020/lib/router/routes-builder.mjs +0 -68
  153. package/esm2020/lib/security/authorization.guard.mjs +0 -30
  154. package/esm2020/lib/services/action-executor.service.mjs +0 -722
  155. package/esm2020/lib/services/configuration.service.mjs +0 -150
  156. package/esm2020/lib/styles/styles.util.mjs +0 -42
  157. package/esm2020/lib/types/type.model.mjs +0 -2
  158. package/esm2020/lib/utils/date.util.mjs +0 -120
  159. package/esm2020/lib/utils/tableview.util.mjs +0 -171
  160. package/esm2020/lib/utils/type.util.mjs +0 -94
  161. package/fesm2015/mediusinc-mng-commons.mjs +0 -15900
  162. package/fesm2015/mediusinc-mng-commons.mjs.map +0 -1
  163. package/fesm2020/mediusinc-mng-commons.mjs.map +0 -1
  164. /package/{esm2020 → esm2022}/index.mjs +0 -0
  165. /package/{esm2020 → esm2022}/lib/api/models/builders/query-param.builder.mjs +0 -0
  166. /package/{esm2020 → esm2022}/lib/api/models/filter-match-type.model.mjs +0 -0
  167. /package/{esm2020 → esm2022}/lib/api/models/index.mjs +0 -0
  168. /package/{esm2020 → esm2022}/lib/api/models/mappers.mjs +0 -0
  169. /package/{esm2020 → esm2022}/lib/api/models/query-mode.model.mjs +0 -0
  170. /package/{esm2020 → esm2022}/lib/api/models/serialization.model.mjs +0 -0
  171. /package/{esm2020 → esm2022}/lib/api/services/api.abstract.service.mjs +0 -0
  172. /package/{esm2020 → esm2022}/lib/api/services/crud-api.abstract.service.mjs +0 -0
  173. /package/{esm2020 → esm2022}/lib/api/services/get-all-api.abstract.service.mjs +0 -0
  174. /package/{esm2020 → esm2022}/lib/api/services/index.mjs +0 -0
  175. /package/{esm2020 → esm2022}/lib/api/utils/index.mjs +0 -0
  176. /package/{esm2020 → esm2022}/lib/components/action/index.mjs +0 -0
  177. /package/{esm2020 → esm2022}/lib/components/action/models/action-component.model.mjs +0 -0
  178. /package/{esm2020 → esm2022}/lib/components/action/models/action-confirmation-service.model.mjs +0 -0
  179. /package/{esm2020 → esm2022}/lib/components/action/models/index.mjs +0 -0
  180. /package/{esm2020 → esm2022}/lib/components/form/formly/fields/index.mjs +0 -0
  181. /package/{esm2020 → esm2022}/lib/components/form/formly/formly.config.mjs +0 -0
  182. /package/{esm2020 → esm2022}/lib/components/form/formly/index.mjs +0 -0
  183. /package/{esm2020 → esm2022}/lib/components/form/formly/models/formly-config.model.mjs +0 -0
  184. /package/{esm2020 → esm2022}/lib/components/form/formly/models/formly-field.model.mjs +0 -0
  185. /package/{esm2020 → esm2022}/lib/components/form/formly/models/index.mjs +0 -0
  186. /package/{esm2020 → esm2022}/lib/components/form/formly/wrappers/index.mjs +0 -0
  187. /package/{esm2020 → esm2022}/lib/components/form/index.mjs +0 -0
  188. /package/{esm2020 → esm2022}/lib/components/form/models/field-action-context.model.mjs +0 -0
  189. /package/{esm2020 → esm2022}/lib/components/form/models/form-editor.interface.mjs +0 -0
  190. /package/{esm2020 → esm2022}/lib/components/form/models/index.mjs +0 -0
  191. /package/{esm2020 → esm2022}/lib/components/layout/index.mjs +0 -0
  192. /package/{esm2020 → esm2022}/lib/components/layout/services/index.mjs +0 -0
  193. /package/{esm2020 → esm2022}/lib/components/pages/index.mjs +0 -0
  194. /package/{esm2020 → esm2022}/lib/components/tableview/index.mjs +0 -0
  195. /package/{esm2020 → esm2022}/lib/components/tableview/models/index.mjs +0 -0
  196. /package/{esm2020 → esm2022}/lib/components/tableview/table/models/index.mjs +0 -0
  197. /package/{esm2020 → esm2022}/lib/components/tableview/table/models/table.interface.mjs +0 -0
  198. /package/{esm2020 → esm2022}/lib/data-providers/base.data-provider.mjs +0 -0
  199. /package/{esm2020 → esm2022}/lib/data-providers/editor.data-provider.mjs +0 -0
  200. /package/{esm2020 → esm2022}/lib/data-providers/index.mjs +0 -0
  201. /package/{esm2020 → esm2022}/lib/data-providers/lookup.data-provider.mjs +0 -0
  202. /package/{esm2020 → esm2022}/lib/data-providers/table.data-provider.mjs +0 -0
  203. /package/{esm2020 → esm2022}/lib/data-providers/tableview-crud.data-provider.mjs +0 -0
  204. /package/{esm2020 → esm2022}/lib/data-providers/tableview.data-provider.mjs +0 -0
  205. /package/{esm2020 → esm2022}/lib/descriptors/action/action-button.descriptor.mjs +0 -0
  206. /package/{esm2020 → esm2022}/lib/descriptors/action/action-confirmation.descriptor.mjs +0 -0
  207. /package/{esm2020 → esm2022}/lib/descriptors/action/index.mjs +0 -0
  208. /package/{esm2020 → esm2022}/lib/descriptors/editor/field-validation.descriptor.mjs +0 -0
  209. /package/{esm2020 → esm2022}/lib/descriptors/editor/index.mjs +0 -0
  210. /package/{esm2020 → esm2022}/lib/descriptors/filter/filter.descriptor.mjs +0 -0
  211. /package/{esm2020 → esm2022}/lib/descriptors/filter/index.mjs +0 -0
  212. /package/{esm2020 → esm2022}/lib/descriptors/index.mjs +0 -0
  213. /package/{esm2020 → esm2022}/lib/descriptors/interfaces/field-config.interface.mjs +0 -0
  214. /package/{esm2020 → esm2022}/lib/descriptors/interfaces/index.mjs +0 -0
  215. /package/{esm2020 → esm2022}/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +0 -0
  216. /package/{esm2020 → esm2022}/lib/descriptors/model.descriptor.mjs +0 -0
  217. /package/{esm2020 → esm2022}/lib/descriptors/table/column.descriptor.mjs +0 -0
  218. /package/{esm2020 → esm2022}/lib/descriptors/table/index.mjs +0 -0
  219. /package/{esm2020 → esm2022}/lib/descriptors/tableview/index.mjs +0 -0
  220. /package/{esm2020 → esm2022}/lib/descriptors/types/action.type.mjs +0 -0
  221. /package/{esm2020 → esm2022}/lib/descriptors/types/column.type.mjs +0 -0
  222. /package/{esm2020 → esm2022}/lib/descriptors/types/editor.type.mjs +0 -0
  223. /package/{esm2020 → esm2022}/lib/descriptors/types/field.type.mjs +0 -0
  224. /package/{esm2020 → esm2022}/lib/descriptors/types/filter.type.mjs +0 -0
  225. /package/{esm2020 → esm2022}/lib/descriptors/types/index.mjs +0 -0
  226. /package/{esm2020 → esm2022}/lib/directives/index.mjs +0 -0
  227. /package/{esm2020 → esm2022}/lib/models/column-value.model.mjs +0 -0
  228. /package/{esm2020 → esm2022}/lib/models/config.model.mjs +0 -0
  229. /package/{esm2020 → esm2022}/lib/models/enum.model.mjs +0 -0
  230. /package/{esm2020 → esm2022}/lib/models/error-internal.model.mjs +0 -0
  231. /package/{esm2020 → esm2022}/lib/models/error.model.mjs +0 -0
  232. /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
  233. /package/{esm2020 → esm2022}/lib/models/menu.model.mjs +0 -0
  234. /package/{esm2020 → esm2022}/lib/models/tableview-attr.model.mjs +0 -0
  235. /package/{esm2020 → esm2022}/lib/models/user.model.mjs +0 -0
  236. /package/{esm2020 → esm2022}/lib/models/version.model.mjs +0 -0
  237. /package/{esm2020 → esm2022}/lib/models/view-container.model.mjs +0 -0
  238. /package/{esm2020 → esm2022}/lib/pipes/index.mjs +0 -0
  239. /package/{esm2020 → esm2022}/lib/pipes/models/internal/enumrate-pipe-i18n.model.mjs +0 -0
  240. /package/{esm2020 → esm2022}/lib/pipes/models/internal/index.mjs +0 -0
  241. /package/{esm2020 → esm2022}/lib/provide-commons.mjs +0 -0
  242. /package/{esm2020 → esm2022}/lib/router/index.mjs +0 -0
  243. /package/{esm2020 → esm2022}/lib/router/models/index.mjs +0 -0
  244. /package/{esm2020 → esm2022}/lib/router/models/router.model.mjs +0 -0
  245. /package/{esm2020 → esm2022}/lib/router/tableview-route-builder.mjs +0 -0
  246. /package/{esm2020 → esm2022}/lib/security/authorization.util.mjs +0 -0
  247. /package/{esm2020 → esm2022}/lib/security/index.mjs +0 -0
  248. /package/{esm2020 → esm2022}/lib/security/model/authorization.type.mjs +0 -0
  249. /package/{esm2020 → esm2022}/lib/security/model/index.mjs +0 -0
  250. /package/{esm2020 → esm2022}/lib/security/model/permission-service.interface.mjs +0 -0
  251. /package/{esm2020 → esm2022}/lib/security/model/permissions.model.mjs +0 -0
  252. /package/{esm2020 → esm2022}/lib/services/error-mapper.service.mjs +0 -0
  253. /package/{esm2020 → esm2022}/lib/services/index.mjs +0 -0
  254. /package/{esm2020 → esm2022}/lib/services/internal/commons-init.provider.mjs +0 -0
  255. /package/{esm2020 → esm2022}/lib/services/internal/index.mjs +0 -0
  256. /package/{esm2020 → esm2022}/lib/services/providers/config-service.provider.mjs +0 -0
  257. /package/{esm2020 → esm2022}/lib/services/providers/formly-config.provider.mjs +0 -0
  258. /package/{esm2020 → esm2022}/lib/services/providers/index.mjs +0 -0
  259. /package/{esm2020 → esm2022}/lib/services/tokens/browser-storage.token.mjs +0 -0
  260. /package/{esm2020 → esm2022}/lib/services/tokens/commons-init.token.mjs +0 -0
  261. /package/{esm2020 → esm2022}/lib/services/tokens/default-setting.token.mjs +0 -0
  262. /package/{esm2020 → esm2022}/lib/services/tokens/index.mjs +0 -0
  263. /package/{esm2020 → esm2022}/lib/services/tokens/module-config.token.mjs +0 -0
  264. /package/{esm2020 → esm2022}/lib/styles/button-style.builder.mjs +0 -0
  265. /package/{esm2020 → esm2022}/lib/styles/index.mjs +0 -0
  266. /package/{esm2020 → esm2022}/lib/styles/models/index.mjs +0 -0
  267. /package/{esm2020 → esm2022}/lib/styles/models/style-level.enum.mjs +0 -0
  268. /package/{esm2020 → esm2022}/lib/styles/models/style-size.enum.mjs +0 -0
  269. /package/{esm2020 → esm2022}/lib/types/i18n.type.mjs +0 -0
  270. /package/{esm2020 → esm2022}/lib/types/index.mjs +0 -0
  271. /package/{esm2020 → esm2022}/lib/types/mng-localstorage-config-value.type.mjs +0 -0
  272. /package/{esm2020 → esm2022}/lib/types/type.decorator.mjs +0 -0
  273. /package/{esm2020 → esm2022}/lib/utils/action-data-provider.util.mjs +0 -0
  274. /package/{esm2020 → esm2022}/lib/utils/editor-formly.util.mjs +0 -0
  275. /package/{esm2020 → esm2022}/lib/utils/enum.util.mjs +0 -0
  276. /package/{esm2020 → esm2022}/lib/utils/export.util.mjs +0 -0
  277. /package/{esm2020 → esm2022}/lib/utils/file.util.mjs +0 -0
  278. /package/{esm2020 → esm2022}/lib/utils/i18n.util.mjs +0 -0
  279. /package/{esm2020 → esm2022}/lib/utils/index.mjs +0 -0
  280. /package/{esm2020 → esm2022}/lib/utils/model.util.mjs +0 -0
  281. /package/{esm2020 → esm2022}/lib/utils/notification.util.mjs +0 -0
  282. /package/{esm2020 → esm2022}/lib/utils/object.util.mjs +0 -0
  283. /package/{esm2020 → esm2022}/lib/utils/route.util.mjs +0 -0
  284. /package/{esm2020 → esm2022}/lib/utils/string.util.mjs +0 -0
  285. /package/{esm2020 → esm2022}/lib/validators/field.validator.mjs +0 -0
  286. /package/{esm2020 → esm2022}/lib/validators/index.mjs +0 -0
  287. /package/{esm2020 → esm2022}/mediusinc-mng-commons.mjs +0 -0
package/README.md CHANGED
@@ -1,16 +1,18 @@
1
- # Angular Commons
1
+ # Medius Commons
2
2
 
3
3
  Commons knjižnica za izgradnjo uporabniškega vmesnika na ogrodju Angular.
4
4
 
5
5
  ## Predhodne zahteve
6
6
 
7
- - Node.js (LTS v14) in npm
7
+ - Node.js (LTS v16) in npm
8
8
  - pnpm package manager (https://pnpm.io/), ki optimizira delovanje privzetega npm.
9
9
  - Zahtevane skupne odvisnosti (peer dependencies)
10
- - Angular (moduli `@angular/core`, `@angular/common`, `@angular/forms`, `@angular/router`) verzije `^13.1.0`
11
- - Ngx Formly (modul `@ngx-formly/core`) verzije `^6.0.0-next.6`
12
- - Ngx Translate (module `@ngx-translate/core`) verzije `^14.0.0`
13
- - PrimeNG (modul `primeng`) verzije `^13.0.0`
10
+ - Angular (moduli `@angular/*`)
11
+ - PrimeNG (moduli `primeng/*`)
12
+ - Ngx Formly (modul `@ngx-formly/core`)
13
+ - Ngx Translate (modul `@ngx-translate/core`)
14
+
15
+ Za verzije odvisnosti glej poglavlje kompatibilnosti.
14
16
 
15
17
  ## Namestitev
16
18
 
@@ -18,6 +20,15 @@ Commons knjižnica za izgradnjo uporabniškega vmesnika na ogrodju Angular.
18
20
  pnpm i @mediusinc/mng-commons
19
21
  ```
20
22
 
23
+ ## Kompatibilnost
24
+
25
+ V tabeli so navedene kompatibilne verzije za commons knjižnico in povezane odvisnosti.
26
+
27
+ | Commons | Angular | PrimeNG | Ngx-translate | Ngx-formly |
28
+ |---------|---------|---------|---------------|------------|
29
+ | 3.x.x | 16.x.x | 16.x.x | 14.x.x | 6.x.x |
30
+ | 2.x.x | 15.x.x | 15.x.x | 14.x.x | 6.x.x |
31
+
21
32
  ## Lokalizacija (i18n)
22
33
 
23
34
  Modul `ngx-translate` se konfigurira na končnem projektu in je na končnem projektu potrebno določiti način za load prevodov.
@@ -48,6 +48,7 @@ const distDirPath = resolve(...baseDir, 'dist');
48
48
 
49
49
  if (!existsSync(baseDirPath)) {
50
50
  console.warn(`Directory "${baseDirPath}" does not exist`);
51
+ // eslint-disable-next-line prettier/prettier
51
52
  return;
52
53
  }
53
54
 
@@ -0,0 +1,33 @@
1
+ export class MediusFilterParam {
2
+ static { this.attributeTypeMap = [
3
+ {
4
+ name: 'property',
5
+ baseName: 'property',
6
+ type: 'string'
7
+ },
8
+ {
9
+ name: 'filterValue',
10
+ baseName: 'filter_value',
11
+ type: 'object'
12
+ },
13
+ {
14
+ name: 'filterValueTo',
15
+ baseName: 'filter_value_to',
16
+ type: 'object'
17
+ },
18
+ {
19
+ name: 'filterMatchType',
20
+ baseName: 'filter_match_type',
21
+ type: 'FilterMatchType'
22
+ },
23
+ {
24
+ name: 'filterMatchCaseSensitive',
25
+ baseName: 'filter_match_case_sensitive',
26
+ type: 'boolean'
27
+ }
28
+ ]; }
29
+ static getAttributeTypeMap() {
30
+ return MediusFilterParam.attributeTypeMap;
31
+ }
32
+ }
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXBhcmFtLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9hcGkvbW9kZWxzL2ZpbHRlci1wYXJhbS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFjQSxNQUFNLE9BQU8saUJBQWlCO2FBU1oscUJBQWdCLEdBQXdCO1FBQ2xEO1lBQ0ksSUFBSSxFQUFFLFVBQVU7WUFDaEIsUUFBUSxFQUFFLFVBQVU7WUFDcEIsSUFBSSxFQUFFLFFBQVE7U0FDakI7UUFDRDtZQUNJLElBQUksRUFBRSxhQUFhO1lBQ25CLFFBQVEsRUFBRSxjQUFjO1lBQ3hCLElBQUksRUFBRSxRQUFRO1NBQ2pCO1FBQ0Q7WUFDSSxJQUFJLEVBQUUsZUFBZTtZQUNyQixRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLElBQUksRUFBRSxRQUFRO1NBQ2pCO1FBQ0Q7WUFDSSxJQUFJLEVBQUUsaUJBQWlCO1lBQ3ZCLFFBQVEsRUFBRSxtQkFBbUI7WUFDN0IsSUFBSSxFQUFFLGlCQUFpQjtTQUMxQjtRQUNEO1lBQ0ksSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxRQUFRLEVBQUUsNkJBQTZCO1lBQ3ZDLElBQUksRUFBRSxTQUFTO1NBQ2xCO0tBQ0osQ0FBQztJQUVLLE1BQU0sQ0FBQyxtQkFBbUI7UUFDN0IsT0FBTyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQztJQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgQVBJXG4gKiBObyBkZXNjcmlwdGlvbiBwcm92aWRlZCAoZ2VuZXJhdGVkIGJ5IE9wZW5hcGkgR2VuZXJhdG9yIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuYXBpdG9vbHMvb3BlbmFwaS1nZW5lcmF0b3IpXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDEuMFxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmltcG9ydCB7TWVkaXVzRmlsdGVyTWF0Y2hUeXBlfSBmcm9tICcuL2ZpbHRlci1tYXRjaC10eXBlLm1vZGVsJztcbmltcG9ydCB7QXR0cmlidXRlRGVmfSBmcm9tICcuL3NlcmlhbGl6YXRpb24ubW9kZWwnO1xuXG5leHBvcnQgY2xhc3MgTWVkaXVzRmlsdGVyUGFyYW0ge1xuICAgIHByb3BlcnR5Pzogc3RyaW5nO1xuICAgIGZpbHRlclZhbHVlPzogYW55O1xuICAgIGZpbHRlclZhbHVlVG8/OiBhbnk7XG4gICAgZmlsdGVyTWF0Y2hUeXBlPzogTWVkaXVzRmlsdGVyTWF0Y2hUeXBlO1xuICAgIGZpbHRlck1hdGNoQ2FzZVNlbnNpdGl2ZT86IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgc3RhdGljIGRpc2NyaW1pbmF0b3I/OiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgc3RhdGljIGF0dHJpYnV0ZVR5cGVNYXA6IEFycmF5PEF0dHJpYnV0ZURlZj4gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdwcm9wZXJ0eScsXG4gICAgICAgICAgICBiYXNlTmFtZTogJ3Byb3BlcnR5JyxcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdmaWx0ZXJWYWx1ZScsXG4gICAgICAgICAgICBiYXNlTmFtZTogJ2ZpbHRlcl92YWx1ZScsXG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0J1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnZmlsdGVyVmFsdWVUbycsXG4gICAgICAgICAgICBiYXNlTmFtZTogJ2ZpbHRlcl92YWx1ZV90bycsXG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0J1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnZmlsdGVyTWF0Y2hUeXBlJyxcbiAgICAgICAgICAgIGJhc2VOYW1lOiAnZmlsdGVyX21hdGNoX3R5cGUnLFxuICAgICAgICAgICAgdHlwZTogJ0ZpbHRlck1hdGNoVHlwZSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ2ZpbHRlck1hdGNoQ2FzZVNlbnNpdGl2ZScsXG4gICAgICAgICAgICBiYXNlTmFtZTogJ2ZpbHRlcl9tYXRjaF9jYXNlX3NlbnNpdGl2ZScsXG4gICAgICAgICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICAgICAgfVxuICAgIF07XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEF0dHJpYnV0ZVR5cGVNYXAoKSB7XG4gICAgICAgIHJldHVybiBNZWRpdXNGaWx0ZXJQYXJhbS5hdHRyaWJ1dGVUeXBlTWFwO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,68 @@
1
+ export class MediusQueryParam {
2
+ static { this.attributeTypeMap = [
3
+ {
4
+ name: 'sortProperty',
5
+ baseName: 'sort_property',
6
+ type: 'Array<string>'
7
+ },
8
+ {
9
+ name: 'sortAsc',
10
+ baseName: 'sort_asc',
11
+ type: 'Array<boolean>'
12
+ },
13
+ {
14
+ name: 'itemsOffset',
15
+ baseName: 'items_offset',
16
+ type: 'number'
17
+ },
18
+ {
19
+ name: 'itemsPerPage',
20
+ baseName: 'items_per_page',
21
+ type: 'number'
22
+ },
23
+ {
24
+ name: 'filterParams',
25
+ baseName: 'filter_params',
26
+ type: 'Array<FilterParam>'
27
+ },
28
+ {
29
+ name: 'filterAllParam',
30
+ baseName: 'filter_all_param',
31
+ type: 'string'
32
+ },
33
+ {
34
+ name: 'filterAllProperties',
35
+ baseName: 'filter_all_properties',
36
+ type: 'Array<string>'
37
+ },
38
+ {
39
+ name: 'validateProperties',
40
+ baseName: 'validate_properties',
41
+ type: 'Array<string>'
42
+ },
43
+ {
44
+ name: 'selectInTwoSteps',
45
+ baseName: 'select_in_two_steps',
46
+ type: 'boolean'
47
+ },
48
+ {
49
+ name: 'sortEnumByOrdinal',
50
+ baseName: 'sort_enum_by_ordinal',
51
+ type: 'boolean'
52
+ },
53
+ {
54
+ name: 'groupByProperties',
55
+ baseName: 'group_by_properties',
56
+ type: 'Array<string>'
57
+ },
58
+ {
59
+ name: 'queryMode',
60
+ baseName: 'query_mode',
61
+ type: 'QueryMode'
62
+ }
63
+ ]; }
64
+ static getAttributeTypeMap() {
65
+ return MediusQueryParam.attributeTypeMap;
66
+ }
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcGFyYW0ubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2FwaS9tb2RlbHMvcXVlcnktcGFyYW0ubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZUEsTUFBTSxPQUFPLGdCQUFnQjthQWdCWCxxQkFBZ0IsR0FBd0I7UUFDbEQ7WUFDSSxJQUFJLEVBQUUsY0FBYztZQUNwQixRQUFRLEVBQUUsZUFBZTtZQUN6QixJQUFJLEVBQUUsZUFBZTtTQUN4QjtRQUNEO1lBQ0ksSUFBSSxFQUFFLFNBQVM7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixJQUFJLEVBQUUsZ0JBQWdCO1NBQ3pCO1FBQ0Q7WUFDSSxJQUFJLEVBQUUsYUFBYTtZQUNuQixRQUFRLEVBQUUsY0FBYztZQUN4QixJQUFJLEVBQUUsUUFBUTtTQUNqQjtRQUNEO1lBQ0ksSUFBSSxFQUFFLGNBQWM7WUFDcEIsUUFBUSxFQUFFLGdCQUFnQjtZQUMxQixJQUFJLEVBQUUsUUFBUTtTQUNqQjtRQUNEO1lBQ0ksSUFBSSxFQUFFLGNBQWM7WUFDcEIsUUFBUSxFQUFFLGVBQWU7WUFDekIsSUFBSSxFQUFFLG9CQUFvQjtTQUM3QjtRQUNEO1lBQ0ksSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixRQUFRLEVBQUUsa0JBQWtCO1lBQzVCLElBQUksRUFBRSxRQUFRO1NBQ2pCO1FBQ0Q7WUFDSSxJQUFJLEVBQUUscUJBQXFCO1lBQzNCLFFBQVEsRUFBRSx1QkFBdUI7WUFDakMsSUFBSSxFQUFFLGVBQWU7U0FDeEI7UUFDRDtZQUNJLElBQUksRUFBRSxvQkFBb0I7WUFDMUIsUUFBUSxFQUFFLHFCQUFxQjtZQUMvQixJQUFJLEVBQUUsZUFBZTtTQUN4QjtRQUNEO1lBQ0ksSUFBSSxFQUFFLGtCQUFrQjtZQUN4QixRQUFRLEVBQUUscUJBQXFCO1lBQy9CLElBQUksRUFBRSxTQUFTO1NBQ2xCO1FBQ0Q7WUFDSSxJQUFJLEVBQUUsbUJBQW1CO1lBQ3pCLFFBQVEsRUFBRSxzQkFBc0I7WUFDaEMsSUFBSSxFQUFFLFNBQVM7U0FDbEI7UUFDRDtZQUNJLElBQUksRUFBRSxtQkFBbUI7WUFDekIsUUFBUSxFQUFFLHFCQUFxQjtZQUMvQixJQUFJLEVBQUUsZUFBZTtTQUN4QjtRQUNEO1lBQ0ksSUFBSSxFQUFFLFdBQVc7WUFDakIsUUFBUSxFQUFFLFlBQVk7WUFDdEIsSUFBSSxFQUFFLFdBQVc7U0FDcEI7S0FDSixDQUFDO0lBRUssTUFBTSxDQUFDLG1CQUFtQjtRQUM3QixPQUFPLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO0lBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBBUElcbiAqIE5vIGRlc2NyaXB0aW9uIHByb3ZpZGVkIChnZW5lcmF0ZWQgYnkgT3BlbmFwaSBHZW5lcmF0b3IgaHR0cHM6Ly9naXRodWIuY29tL29wZW5hcGl0b29scy9vcGVuYXBpLWdlbmVyYXRvcilcbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMS4wXG4gKlxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuaW1wb3J0IHtNZWRpdXNGaWx0ZXJQYXJhbX0gZnJvbSAnLi9maWx0ZXItcGFyYW0ubW9kZWwnO1xuaW1wb3J0IHtNZWRpdXNRdWVyeU1vZGV9IGZyb20gJy4vcXVlcnktbW9kZS5tb2RlbCc7XG5pbXBvcnQge0F0dHJpYnV0ZURlZn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIE1lZGl1c1F1ZXJ5UGFyYW0ge1xuICAgIHNvcnRQcm9wZXJ0eT86IEFycmF5PHN0cmluZz47XG4gICAgc29ydEFzYz86IEFycmF5PGJvb2xlYW4+O1xuICAgIGl0ZW1zT2Zmc2V0PzogbnVtYmVyO1xuICAgIGl0ZW1zUGVyUGFnZT86IG51bWJlcjtcbiAgICBmaWx0ZXJQYXJhbXM/OiBBcnJheTxNZWRpdXNGaWx0ZXJQYXJhbT47XG4gICAgZmlsdGVyQWxsUGFyYW0/OiBzdHJpbmc7XG4gICAgZmlsdGVyQWxsUHJvcGVydGllcz86IEFycmF5PHN0cmluZz47XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICBzZWxlY3RJblR3b1N0ZXBzPzogYm9vbGVhbjtcbiAgICBzb3J0RW51bUJ5T3JkaW5hbD86IGJvb2xlYW47XG4gICAgZ3JvdXBCeVByb3BlcnRpZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIHF1ZXJ5TW9kZT86IE1lZGl1c1F1ZXJ5TW9kZTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZGlzY3JpbWluYXRvcj86IHN0cmluZztcblxuICAgIHB1YmxpYyBzdGF0aWMgYXR0cmlidXRlVHlwZU1hcDogQXJyYXk8QXR0cmlidXRlRGVmPiA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ3NvcnRQcm9wZXJ0eScsXG4gICAgICAgICAgICBiYXNlTmFtZTogJ3NvcnRfcHJvcGVydHknLFxuICAgICAgICAgICAgdHlwZTogJ0FycmF5PHN0cmluZz4nXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdzb3J0QXNjJyxcbiAgICAgICAgICAgIGJhc2VOYW1lOiAnc29ydF9hc2MnLFxuICAgICAgICAgICAgdHlwZTogJ0FycmF5PGJvb2xlYW4+J1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnaXRlbXNPZmZzZXQnLFxuICAgICAgICAgICAgYmFzZU5hbWU6ICdpdGVtc19vZmZzZXQnLFxuICAgICAgICAgICAgdHlwZTogJ251bWJlcidcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ2l0ZW1zUGVyUGFnZScsXG4gICAgICAgICAgICBiYXNlTmFtZTogJ2l0ZW1zX3Blcl9wYWdlJyxcbiAgICAgICAgICAgIHR5cGU6ICdudW1iZXInXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdmaWx0ZXJQYXJhbXMnLFxuICAgICAgICAgICAgYmFzZU5hbWU6ICdmaWx0ZXJfcGFyYW1zJyxcbiAgICAgICAgICAgIHR5cGU6ICdBcnJheTxGaWx0ZXJQYXJhbT4nXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdmaWx0ZXJBbGxQYXJhbScsXG4gICAgICAgICAgICBiYXNlTmFtZTogJ2ZpbHRlcl9hbGxfcGFyYW0nLFxuICAgICAgICAgICAgdHlwZTogJ3N0cmluZydcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ2ZpbHRlckFsbFByb3BlcnRpZXMnLFxuICAgICAgICAgICAgYmFzZU5hbWU6ICdmaWx0ZXJfYWxsX3Byb3BlcnRpZXMnLFxuICAgICAgICAgICAgdHlwZTogJ0FycmF5PHN0cmluZz4nXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICd2YWxpZGF0ZVByb3BlcnRpZXMnLFxuICAgICAgICAgICAgYmFzZU5hbWU6ICd2YWxpZGF0ZV9wcm9wZXJ0aWVzJyxcbiAgICAgICAgICAgIHR5cGU6ICdBcnJheTxzdHJpbmc+J1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnc2VsZWN0SW5Ud29TdGVwcycsXG4gICAgICAgICAgICBiYXNlTmFtZTogJ3NlbGVjdF9pbl90d29fc3RlcHMnLFxuICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdzb3J0RW51bUJ5T3JkaW5hbCcsXG4gICAgICAgICAgICBiYXNlTmFtZTogJ3NvcnRfZW51bV9ieV9vcmRpbmFsJyxcbiAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnZ3JvdXBCeVByb3BlcnRpZXMnLFxuICAgICAgICAgICAgYmFzZU5hbWU6ICdncm91cF9ieV9wcm9wZXJ0aWVzJyxcbiAgICAgICAgICAgIHR5cGU6ICdBcnJheTxzdHJpbmc+J1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAncXVlcnlNb2RlJyxcbiAgICAgICAgICAgIGJhc2VOYW1lOiAncXVlcnlfbW9kZScsXG4gICAgICAgICAgICB0eXBlOiAnUXVlcnlNb2RlJ1xuICAgICAgICB9XG4gICAgXTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXR0cmlidXRlVHlwZU1hcCgpIHtcbiAgICAgICAgcmV0dXJuIE1lZGl1c1F1ZXJ5UGFyYW0uYXR0cmlidXRlVHlwZU1hcDtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,24 @@
1
+ export class MediusQueryResult {
2
+ static fromArray(pageData, allDataCount) {
3
+ const mqr = new MediusQueryResult();
4
+ mqr.allDataCount = allDataCount ?? pageData.length;
5
+ mqr.pageData = pageData;
6
+ return mqr;
7
+ }
8
+ static { this.attributeTypeMap = [
9
+ {
10
+ name: 'allDataCount',
11
+ baseName: 'all_data_count',
12
+ type: 'number'
13
+ },
14
+ {
15
+ name: 'pageData',
16
+ baseName: 'page_data',
17
+ type: 'Array<T>'
18
+ }
19
+ ]; }
20
+ static getAttributeTypeMap() {
21
+ return MediusQueryResult.attributeTypeMap;
22
+ }
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcmVzdWx0Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9hcGkvbW9kZWxzL3F1ZXJ5LXJlc3VsdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFhQSxNQUFNLE9BQU8saUJBQWlCO0lBTTFCLE1BQU0sQ0FBQyxTQUFTLENBQUksUUFBYSxFQUFFLFlBQXFCO1FBQ3BELE1BQU0sR0FBRyxHQUFHLElBQUksaUJBQWlCLEVBQUssQ0FBQztRQUN2QyxHQUFHLENBQUMsWUFBWSxHQUFHLFlBQVksSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ25ELEdBQUcsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3hCLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQzthQUVNLHFCQUFnQixHQUF3QjtRQUMzQztZQUNJLElBQUksRUFBRSxjQUFjO1lBQ3BCLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsSUFBSSxFQUFFLFFBQVE7U0FDakI7UUFDRDtZQUNJLElBQUksRUFBRSxVQUFVO1lBQ2hCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLElBQUksRUFBRSxVQUFVO1NBQ25CO0tBQ0osQ0FBQztJQUVGLE1BQU0sQ0FBQyxtQkFBbUI7UUFDdEIsT0FBTyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQztJQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgQVBJXG4gKiBObyBkZXNjcmlwdGlvbiBwcm92aWRlZCAoZ2VuZXJhdGVkIGJ5IE9wZW5hcGkgR2VuZXJhdG9yIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuYXBpdG9vbHMvb3BlbmFwaS1nZW5lcmF0b3IpXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDEuMFxuICpcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbmltcG9ydCB7QXR0cmlidXRlRGVmfSBmcm9tICcuL3NlcmlhbGl6YXRpb24ubW9kZWwnO1xuXG5leHBvcnQgY2xhc3MgTWVkaXVzUXVlcnlSZXN1bHQ8VD4gaW1wbGVtZW50cyBJTWVkaXVzUXVlcnlSZXN1bHQ8VD4ge1xuICAgIGFsbERhdGFDb3VudD86IG51bWJlcjtcbiAgICBwYWdlRGF0YT86IEFycmF5PFQ+O1xuXG4gICAgc3RhdGljIGRpc2NyaW1pbmF0b3I/OiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbUFycmF5PFQ+KHBhZ2VEYXRhOiBUW10sIGFsbERhdGFDb3VudD86IG51bWJlcikge1xuICAgICAgICBjb25zdCBtcXIgPSBuZXcgTWVkaXVzUXVlcnlSZXN1bHQ8VD4oKTtcbiAgICAgICAgbXFyLmFsbERhdGFDb3VudCA9IGFsbERhdGFDb3VudCA/PyBwYWdlRGF0YS5sZW5ndGg7XG4gICAgICAgIG1xci5wYWdlRGF0YSA9IHBhZ2VEYXRhO1xuICAgICAgICByZXR1cm4gbXFyO1xuICAgIH1cblxuICAgIHN0YXRpYyBhdHRyaWJ1dGVUeXBlTWFwOiBBcnJheTxBdHRyaWJ1dGVEZWY+ID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnYWxsRGF0YUNvdW50JyxcbiAgICAgICAgICAgIGJhc2VOYW1lOiAnYWxsX2RhdGFfY291bnQnLFxuICAgICAgICAgICAgdHlwZTogJ251bWJlcidcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ3BhZ2VEYXRhJyxcbiAgICAgICAgICAgIGJhc2VOYW1lOiAncGFnZV9kYXRhJyxcbiAgICAgICAgICAgIHR5cGU6ICdBcnJheTxUPidcbiAgICAgICAgfVxuICAgIF07XG5cbiAgICBzdGF0aWMgZ2V0QXR0cmlidXRlVHlwZU1hcCgpIHtcbiAgICAgICAgcmV0dXJuIE1lZGl1c1F1ZXJ5UmVzdWx0LmF0dHJpYnV0ZVR5cGVNYXA7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZWRpdXNRdWVyeVJlc3VsdDxUPiB7XG4gICAgYWxsRGF0YUNvdW50PzogbnVtYmVyO1xuICAgIHBhZ2VEYXRhPzogQXJyYXk8VD47XG59XG4iXX0=
@@ -0,0 +1,255 @@
1
+ import { FilterMatchMode } from 'primeng/api';
2
+ import { FilterTypeEnum } from '../../descriptors/types';
3
+ import { DateUtil } from '../../utils';
4
+ import { MediusFilterMatchType, MediusQueryParamBuilder } from '../models';
5
+ export class MediusRestUtil {
6
+ static { this._instance = new MediusRestUtil(); }
7
+ constructor() {
8
+ // first value is from primeNG, second is for use in query params
9
+ this.matchModeMapping = [
10
+ [FilterMatchMode.CONTAINS, 'c', MediusFilterMatchType.Contains, null],
11
+ [FilterMatchMode.ENDS_WITH, 'ew', MediusFilterMatchType.EndsWith, null],
12
+ [FilterMatchMode.EQUALS, 'eq', MediusFilterMatchType.Equals, null],
13
+ [FilterMatchMode.GREATER_THAN, 'gt', MediusFilterMatchType.GreaterThan, null],
14
+ [FilterMatchMode.LESS_THAN, 'lt', MediusFilterMatchType.SmallerThan, null],
15
+ [FilterMatchMode.STARTS_WITH, 'sw', MediusFilterMatchType.StartsWith, null],
16
+ [FilterMatchMode.IN, 'in', MediusFilterMatchType.In, null],
17
+ [FilterMatchMode.NOT_EQUALS, 'neq', MediusFilterMatchType.NotEquals, null],
18
+ [FilterMatchMode.BETWEEN, 'ft', MediusFilterMatchType.FromTo, FilterTypeEnum.Date],
19
+ [FilterMatchMode.DATE_IS, 'dteq', MediusFilterMatchType.Equals, FilterTypeEnum.Date],
20
+ [FilterMatchMode.DATE_BEFORE, 'lt', MediusFilterMatchType.SmallerThan, FilterTypeEnum.Date],
21
+ [FilterMatchMode.DATE_AFTER, 'gt', MediusFilterMatchType.GreaterThan, FilterTypeEnum.Date],
22
+ [FilterMatchMode.DATE_IS_NOT, 'neq', MediusFilterMatchType.NotEquals, FilterTypeEnum.Date]
23
+ ];
24
+ this.dateTimeInUtc = true;
25
+ this.dateTimeWithTimezone = true;
26
+ this.dateTimeWithMillis = true;
27
+ this.dateOnlyDisabled = false;
28
+ // empty
29
+ }
30
+ static get() {
31
+ return MediusRestUtil._instance;
32
+ }
33
+ configure(config) {
34
+ if (config.dateTimeInUtc !== undefined) {
35
+ this.dateTimeInUtc = config.dateTimeInUtc;
36
+ }
37
+ if (config.dateTimeWithTimezone !== undefined) {
38
+ this.dateTimeWithTimezone = config.dateTimeWithTimezone;
39
+ }
40
+ if (config.dateTimeWithMillis !== undefined) {
41
+ this.dateTimeWithMillis = config.dateTimeWithMillis;
42
+ }
43
+ if (config.dateOnlyDisabled !== undefined) {
44
+ this.dateOnlyDisabled = config.dateOnlyDisabled;
45
+ }
46
+ }
47
+ fromAngularQueryParamsToMediusQueryParams(params, filterDescriptors, defaultItemsPerPage = 10, defaultOffset = 0) {
48
+ const offset = params['first'] ? parseInt(params['first']) : defaultOffset;
49
+ const itemsPerPage = params['rows'] ? parseInt(params['rows']) : defaultItemsPerPage;
50
+ const mediusParamsBuilder = MediusQueryParamBuilder.create(itemsPerPage, offset);
51
+ if (params['sort']) {
52
+ for (const sort of params['sort'].split(',')) {
53
+ const qpSortSplit = sort.split(':');
54
+ const field = qpSortSplit[0];
55
+ const asc = qpSortSplit.length > 1 ? qpSortSplit[1] === 'asc' : true;
56
+ mediusParamsBuilder.withSort(field, asc);
57
+ }
58
+ }
59
+ if (params['filter']) {
60
+ const filterSplit = params['filter'].split(';');
61
+ for (const filterField of filterSplit) {
62
+ const filterFieldSplit = filterField.split(':');
63
+ const field = filterFieldSplit[0];
64
+ const operator = filterFieldSplit.length > 1 ? filterFieldSplit[1] : 'eq';
65
+ // prepare value
66
+ let value = filterFieldSplit.length > 2 ? filterFieldSplit.slice(2).join(':') : '';
67
+ let valueTo = undefined;
68
+ if (value.startsWith("'")) {
69
+ value = value.substring(1, value.length - 1);
70
+ }
71
+ if (value.startsWith('[') && value.endsWith(']')) {
72
+ value = value
73
+ .substring(1, value.length - 1)
74
+ .split(',')
75
+ .map((v) => (v.startsWith("'") ? v.substring(1, v.length - 1) : v));
76
+ }
77
+ if (operator === 'ft') {
78
+ valueTo = value[1];
79
+ value = value[0];
80
+ }
81
+ const filterDescriptor = filterDescriptors.find(f => f.property === field);
82
+ const matchMode = this.getMapping(operator, filterDescriptor?.filterType, 1);
83
+ if (matchMode && filterDescriptor) {
84
+ mediusParamsBuilder.withFilter(filterDescriptor.property, value, valueTo, this.getMediusFilterMatchTypeFromPrimeMatchMode(matchMode[0]));
85
+ }
86
+ }
87
+ }
88
+ return mediusParamsBuilder.build();
89
+ }
90
+ fromPrimeLazyLoadEventToAngularQueryParams(event) {
91
+ const params = {
92
+ first: null,
93
+ rows: null,
94
+ sort: null,
95
+ filter: null
96
+ };
97
+ if (event.first && event.first > 0) {
98
+ params['first'] = event.first;
99
+ }
100
+ if (event.rows && event.rows > 0) {
101
+ params['rows'] = event.rows;
102
+ }
103
+ if (event.multiSortMeta?.length) {
104
+ params['sort'] = event.multiSortMeta?.map(s => `${s.field}${s.order === 1 ? '' : ':desc'}`).join(',');
105
+ }
106
+ if (event.filters) {
107
+ const filters = [];
108
+ for (const field in event.filters) {
109
+ let fieldFilters = event.filters[field];
110
+ if (typeof fieldFilters === 'undefined') {
111
+ continue;
112
+ }
113
+ if (!Array.isArray(fieldFilters)) {
114
+ fieldFilters = [fieldFilters];
115
+ }
116
+ for (const fieldFilter of fieldFilters) {
117
+ const primeOperator = fieldFilter.matchMode;
118
+ let value = fieldFilter.value;
119
+ const operatorMapping = primeOperator ? this.getMapping(primeOperator, undefined, 0) : undefined;
120
+ if (operatorMapping && typeof value !== 'undefined' && value !== null) {
121
+ let doAddFilter = false;
122
+ if (typeof value === 'string' && value.length > 0) {
123
+ value = `'${value}'`;
124
+ doAddFilter = true;
125
+ }
126
+ else if (typeof value === 'number') {
127
+ doAddFilter = true;
128
+ }
129
+ else if (typeof value === 'boolean') {
130
+ doAddFilter = true;
131
+ }
132
+ else if (Array.isArray(value)) {
133
+ const joinedValue = value
134
+ .map(v => {
135
+ if (v instanceof Date) {
136
+ // for query params, always convert to iso string, correct transformation will be done later
137
+ return v.toISOString();
138
+ }
139
+ return v;
140
+ })
141
+ .join(',');
142
+ value = `[${joinedValue}]`;
143
+ doAddFilter = true;
144
+ }
145
+ else if (value instanceof Date) {
146
+ // for query params, always convert to iso string, correct transformation will be done later
147
+ value = value.toISOString();
148
+ doAddFilter = true;
149
+ }
150
+ if (doAddFilter) {
151
+ filters.push(`${field}:${operatorMapping[1]}:${value}`);
152
+ }
153
+ }
154
+ }
155
+ }
156
+ if (filters.length > 0) {
157
+ params['filter'] = filters.join(';');
158
+ }
159
+ }
160
+ return params;
161
+ }
162
+ modifySortProperties(mediusQueryParams, columnDescriptors) {
163
+ if (mediusQueryParams.sortProperty && columnDescriptors) {
164
+ for (const [i, sortProperty] of mediusQueryParams.sortProperty.entries()) {
165
+ mediusQueryParams.sortProperty[i] = columnDescriptors.find(el => el.property === sortProperty)?.sortProperty ?? sortProperty;
166
+ }
167
+ }
168
+ }
169
+ modifyFilterProperties(mediusQueryParams, filterDescriptors) {
170
+ for (const filterParam of mediusQueryParams.filterParams ?? []) {
171
+ const filterDescriptor = filterDescriptors.find(f => f.property === filterParam.property);
172
+ filterParam.property = filterDescriptor?.filterProperty ?? filterParam.property;
173
+ if (filterDescriptor?.filterType === FilterTypeEnum.Date) {
174
+ if (filterParam.filterMatchType === MediusFilterMatchType.Equals) {
175
+ // convert date equals filter to date range
176
+ const filterDate = filterParam.filterValue;
177
+ const startDate = new Date(filterDate);
178
+ const endDate = new Date(startDate);
179
+ if (filterDescriptor.datePickerShowTime) {
180
+ startDate.setHours(startDate.getHours(), startDate.getMinutes(), 0, 0);
181
+ endDate.setHours(endDate.getHours(), endDate.getMinutes() + 1, 0, 0);
182
+ }
183
+ else {
184
+ startDate.setHours(0, 0, 0, 0);
185
+ endDate.setHours(0, 0, 0, 0);
186
+ endDate.setDate(endDate.getDate() + 1);
187
+ }
188
+ filterParam.filterMatchType = MediusFilterMatchType.FromTo;
189
+ filterParam.filterValue = startDate;
190
+ filterParam.filterValueTo = endDate;
191
+ }
192
+ // transform dates to correct iso string
193
+ if (typeof filterParam.filterValue !== 'undefined') {
194
+ if (Array.isArray(filterParam.filterValue)) {
195
+ filterParam.filterValue = filterParam.filterValue.map(v => DateUtil.toIsoString(v, filterDescriptor.datePickerValueInUtc ?? this.dateTimeInUtc, filterDescriptor.datePickerValueWithTimezone ?? this.dateTimeWithTimezone, this.dateTimeWithMillis, filterDescriptor.datePickerValueDateOnly ?? (this.dateOnlyDisabled ? false : !filterDescriptor.datePickerShowTime)));
196
+ }
197
+ else {
198
+ filterDescriptor.datePickerValueInUtc;
199
+ filterParam.filterValue = DateUtil.toIsoString(filterParam.filterValue, filterDescriptor.datePickerValueInUtc ?? this.dateTimeInUtc, filterDescriptor.datePickerValueWithTimezone ?? this.dateTimeWithTimezone, this.dateTimeWithMillis, filterDescriptor.datePickerValueDateOnly ?? (this.dateOnlyDisabled ? false : !filterDescriptor.datePickerShowTime));
200
+ }
201
+ }
202
+ if (typeof filterParam.filterValueTo !== 'undefined') {
203
+ if (Array.isArray(filterParam.filterValueTo)) {
204
+ filterParam.filterValueTo = filterParam.filterValueTo.map(v => DateUtil.toIsoString(v, filterDescriptor.datePickerValueInUtc ?? this.dateTimeInUtc, filterDescriptor.datePickerValueWithTimezone ?? this.dateTimeWithTimezone, this.dateTimeWithMillis, filterDescriptor.datePickerValueDateOnly ?? (this.dateOnlyDisabled ? false : !filterDescriptor.datePickerShowTime)));
205
+ }
206
+ else {
207
+ filterParam.filterValueTo = DateUtil.toIsoString(filterParam.filterValueTo, filterDescriptor.datePickerValueInUtc ?? this.dateTimeInUtc, filterDescriptor.datePickerValueWithTimezone ?? this.dateTimeWithTimezone, this.dateTimeWithMillis, filterDescriptor.datePickerValueDateOnly ?? (this.dateOnlyDisabled ? false : !filterDescriptor.datePickerShowTime));
208
+ }
209
+ }
210
+ }
211
+ }
212
+ }
213
+ fromPrimeLazyLoadEventToMediusQueryParams(event) {
214
+ const queryParamBuilder = MediusQueryParamBuilder.create(event.rows ?? undefined, event.first);
215
+ // apply sorting
216
+ if (event.multiSortMeta) {
217
+ event.multiSortMeta.forEach(msm => queryParamBuilder.withSort(msm.field, msm.order === 1));
218
+ }
219
+ // apply filtering
220
+ if (event.filters) {
221
+ for (const key of Object.keys(event.filters)) {
222
+ const filterEvent = event.filters[key];
223
+ if (Array.isArray(filterEvent)) {
224
+ filterEvent.filter(e => e.value).forEach(e => this.addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, key, e));
225
+ }
226
+ else if (typeof filterEvent === 'object') {
227
+ if (filterEvent.value) {
228
+ this.addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, key, filterEvent);
229
+ }
230
+ }
231
+ }
232
+ }
233
+ return queryParamBuilder.build();
234
+ }
235
+ addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, property, filterMetadata) {
236
+ const matchType = this.getMediusFilterMatchTypeFromPrimeMatchMode(filterMetadata.matchMode ?? 'equals');
237
+ queryParamBuilder.withFilter(property, filterMetadata.value, undefined, matchType);
238
+ }
239
+ getMediusFilterMatchTypeFromPrimeMatchMode(matchMode, dataType) {
240
+ return this.getMapping(matchMode, dataType)?.[2] ?? MediusFilterMatchType.Equals;
241
+ }
242
+ getMapping(matchMode, dataType, idx = 0) {
243
+ const mappings = this.matchModeMapping.filter(m => m[idx] === matchMode && (!dataType || !m[3] || dataType === m[3]));
244
+ if (mappings.length === 0) {
245
+ return null;
246
+ }
247
+ else if (mappings.length === 1) {
248
+ return mappings[0];
249
+ }
250
+ else {
251
+ return mappings.sort((m1, m2) => (m2[3] ?? -1) - (m1[3] ?? -1))[0];
252
+ }
253
+ }
254
+ }
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkaXVzLXJlc3QudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYXBpL3V0aWxzL21lZGl1cy1yZXN0LnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGVBQWUsRUFBaUIsTUFBTSxhQUFhLENBQUM7QUFLNUQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFDLHFCQUFxQixFQUFvQix1QkFBdUIsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUUzRixNQUFNLE9BQU8sY0FBYzthQUNSLGNBQVMsR0FBbUIsSUFBSSxjQUFjLEVBQUUsQUFBdkMsQ0FBd0M7SUF1QmhFO1FBdEJBLGlFQUFpRTtRQUNoRCxxQkFBZ0IsR0FBNEI7WUFDekQsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDO1lBQ3JFLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUscUJBQXFCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQztZQUN2RSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7WUFDbEUsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDO1lBQzdFLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUscUJBQXFCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQztZQUMxRSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUM7WUFDM0UsQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFF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LENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1BhcmFtc30gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtGaWx0ZXJNYXRjaE1vZGUsIEZpbHRlck1ldGFkYXRhfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge1RhYmxlTGF6eUxvYWRFdmVudH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5cbmltcG9ydCB7RmlsdGVyRGVzY3JpcHRvcn0gZnJvbSAnLi4vLi4vZGVzY3JpcHRvcnMvZmlsdGVyJztcbmltcG9ydCB7Q29sdW1uRGVzY3JpcHRvcn0gZnJvbSAnLi4vLi4vZGVzY3JpcHRvcnMvdGFibGUnO1xuaW1wb3J0IHtGaWx0ZXJUeXBlRW51bX0gZnJvbSAnLi4vLi4vZGVzY3JpcHRvcnMvdHlwZXMnO1xuaW1wb3J0IHtNYXRjaE1vZGVNYXBUeXBlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge0RhdGVVdGlsfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQge01lZGl1c0ZpbHRlck1hdGNoVHlwZSwgTWVkaXVzUXVlcnlQYXJhbSwgTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXJ9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBjbGFzcyBNZWRpdXNSZXN0VXRpbCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBNZWRpdXNSZXN0VXRpbCA9IG5ldyBNZWRpdXNSZXN0VXRpbCgpO1xuICAgIC8vIGZpcnN0IHZhbHVlIGlzIGZyb20gcHJpbWVORywgc2Vjb25kIGlzIGZvciB1c2UgaW4gcXVlcnkgcGFyYW1zXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXRjaE1vZGVNYXBwaW5nOiBBcnJheTxNYXRjaE1vZGVNYXBUeXBlPiA9IFtcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5DT05UQUlOUywgJ2MnLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuQ29udGFpbnMsIG51bGxdLFxuICAgICAgICBbRmlsdGVyTWF0Y2hNb2RlLkVORFNfV0lUSCwgJ2V3JywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkVuZHNXaXRoLCBudWxsXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5FUVVBTFMsICdlcScsIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5FcXVhbHMsIG51bGxdLFxuICAgICAgICBbRmlsdGVyTWF0Y2hNb2RlLkdSRUFURVJfVEhBTiwgJ2d0JywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkdyZWF0ZXJUaGFuLCBudWxsXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5MRVNTX1RIQU4sICdsdCcsIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5TbWFsbGVyVGhhbiwgbnVsbF0sXG4gICAgICAgIFtGaWx0ZXJNYXRjaE1vZGUuU1RBUlRTX1dJVEgsICdzdycsIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5TdGFydHNXaXRoLCBudWxsXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5JTiwgJ2luJywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkluLCBudWxsXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5OT1RfRVFVQUxTLCAnbmVxJywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEVxdWFscywgbnVsbF0sXG4gICAgICAgIFtGaWx0ZXJNYXRjaE1vZGUuQkVUV0VFTiwgJ2Z0JywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkZyb21UbywgRmlsdGVyVHlwZUVudW0uRGF0ZV0sXG4gICAgICAgIFtGaWx0ZXJNYXRjaE1vZGUuREFURV9JUywgJ2R0ZXEnLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzLCBGaWx0ZXJUeXBlRW51bS5EYXRlXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5EQVRFX0JFRk9SRSwgJ2x0JywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLlNtYWxsZXJUaGFuLCBGaWx0ZXJUeXBlRW51bS5EYXRlXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5EQVRFX0FGVEVSLCAnZ3QnLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuR3JlYXRlclRoYW4sIEZpbHRlclR5cGVFbnVtLkRhdGVdLFxuICAgICAgICBbRmlsdGVyTWF0Y2hNb2RlLkRBVEVfSVNfTk9ULCAnbmVxJywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEVxdWFscywgRmlsdGVyVHlwZUVudW0uRGF0ZV1cbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBkYXRlVGltZUluVXRjID0gdHJ1ZTtcbiAgICBwcml2YXRlIGRhdGVUaW1lV2l0aFRpbWV6b25lID0gdHJ1ZTtcbiAgICBwcml2YXRlIGRhdGVUaW1lV2l0aE1pbGxpcyA9IHRydWU7XG4gICAgcHJpdmF0ZSBkYXRlT25seURpc2FibGVkID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBlbXB0eVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0KCk6IE1lZGl1c1Jlc3RVdGlsIHtcbiAgICAgICAgcmV0dXJuIE1lZGl1c1Jlc3RVdGlsLl9pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uZmlndXJlKGNvbmZpZzoge2RhdGVUaW1lSW5VdGM/OiBib29sZWFuOyBkYXRlVGltZVdpdGhUaW1lem9uZT86IGJvb2xlYW47IGRhdGVUaW1lV2l0aE1pbGxpcz86IGJvb2xlYW47IGRhdGVPbmx5RGlzYWJsZWQ/OiBib29sZWFufSk6IHZvaWQge1xuICAgICAgICBpZiAoY29uZmlnLmRhdGVUaW1lSW5VdGMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUluVXRjID0gY29uZmlnLmRhdGVUaW1lSW5VdGM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5kYXRlVGltZVdpdGhUaW1lem9uZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lV2l0aFRpbWV6b25lID0gY29uZmlnLmRhdGVUaW1lV2l0aFRpbWV6b25lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuZGF0ZVRpbWVXaXRoTWlsbGlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVXaXRoTWlsbGlzID0gY29uZmlnLmRhdGVUaW1lV2l0aE1pbGxpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmRhdGVPbmx5RGlzYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kYXRlT25seURpc2FibGVkID0gY29uZmlnLmRhdGVPbmx5RGlzYWJsZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZnJvbUFuZ3VsYXJRdWVyeVBhcmFtc1RvTWVkaXVzUXVlcnlQYXJhbXMoXG4gICAgICAgIHBhcmFtczogUGFyYW1zLFxuICAgICAgICBmaWx0ZXJEZXNjcmlwdG9yczogQXJyYXk8RmlsdGVyRGVzY3JpcHRvcjxhbnk+PixcbiAgICAgICAgZGVmYXVsdEl0ZW1zUGVyUGFnZSA9IDEwLFxuICAgICAgICBkZWZhdWx0T2Zmc2V0ID0gMFxuICAgICk6IE1lZGl1c1F1ZXJ5UGFyYW0ge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBwYXJhbXNbJ2ZpcnN0J10gPyBwYXJzZUludChwYXJhbXNbJ2ZpcnN0J10pIDogZGVmYXVsdE9mZnNldDtcbiAgICAgICAgY29uc3QgaXRlbXNQZXJQYWdlID0gcGFyYW1zWydyb3dzJ10gPyBwYXJzZUludChwYXJhbXNbJ3Jvd3MnXSkgOiBkZWZhdWx0SXRlbXNQZXJQYWdlO1xuXG4gICAgICAgIGNvbnN0IG1lZGl1c1BhcmFtc0J1aWxkZXIgPSBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlci5jcmVhdGUoaXRlbXNQZXJQYWdlLCBvZmZzZXQpO1xuXG4gICAgICAgIGlmIChwYXJhbXNbJ3NvcnQnXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzb3J0IG9mIHBhcmFtc1snc29ydCddLnNwbGl0KCcsJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxcFNvcnRTcGxpdCA9IHNvcnQuc3BsaXQoJzonKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHFwU29ydFNwbGl0WzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFzYyA9IHFwU29ydFNwbGl0Lmxlbmd0aCA+IDEgPyBxcFNvcnRTcGxpdFsxXSA9PT0gJ2FzYycgOiB0cnVlO1xuICAgICAgICAgICAgICAgIG1lZGl1c1BhcmFtc0J1aWxkZXIud2l0aFNvcnQoZmllbGQsIGFzYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtc1snZmlsdGVyJ10pIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlclNwbGl0ID0gcGFyYW1zWydmaWx0ZXInXS5zcGxpdCgnOycpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWx0ZXJGaWVsZCBvZiBmaWx0ZXJTcGxpdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckZpZWxkU3BsaXQgPSBmaWx0ZXJGaWVsZC5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZmlsdGVyRmllbGRTcGxpdFswXTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVyYXRvciA9IGZpbHRlckZpZWxkU3BsaXQubGVuZ3RoID4gMSA/IGZpbHRlckZpZWxkU3BsaXRbMV0gOiAnZXEnO1xuXG4gICAgICAgICAgICAgICAgLy8gcHJlcGFyZSB2YWx1ZVxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZTogYW55ID0gZmlsdGVyRmllbGRTcGxpdC5sZW5ndGggPiAyID8gZmlsdGVyRmllbGRTcGxpdC5zbGljZSgyKS5qb2luKCc6JykgOiAnJztcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVUbzogYW55ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ1snKSAmJiB2YWx1ZS5lbmRzV2l0aCgnXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKCh2OiBzdHJpbmcpID0+ICh2LnN0YXJ0c1dpdGgoXCInXCIpID8gdi5zdWJzdHJpbmcoMSwgdi5sZW5ndGggLSAxKSA6IHYpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3BlcmF0b3IgPT09ICdmdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVUbyA9IHZhbHVlWzFdO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzBdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckRlc2NyaXB0b3IgPSBmaWx0ZXJEZXNjcmlwdG9ycy5maW5kKGYgPT4gZi5wcm9wZXJ0eSA9PT0gZmllbGQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoTW9kZSA9IHRoaXMuZ2V0TWFwcGluZyhvcGVyYXRvciwgZmlsdGVyRGVzY3JpcHRvcj8uZmlsdGVyVHlwZSwgMSk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoTW9kZSAmJiBmaWx0ZXJEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lZGl1c1BhcmFtc0J1aWxkZXIud2l0aEZpbHRlcihmaWx0ZXJEZXNjcmlwdG9yLnByb3BlcnR5LCB2YWx1ZSwgdmFsdWVUbywgdGhpcy5nZXRNZWRpdXNGaWx0ZXJNYXRjaFR5cGVGcm9tUHJpbWVNYXRjaE1vZGUobWF0Y2hNb2RlWzBdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lZGl1c1BhcmFtc0J1aWxkZXIuYnVpbGQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvQW5ndWxhclF1ZXJ5UGFyYW1zKGV2ZW50OiBUYWJsZUxhenlMb2FkRXZlbnQpOiBQYXJhbXMge1xuICAgICAgICBjb25zdCBwYXJhbXM6IFBhcmFtcyA9IHtcbiAgICAgICAgICAgIGZpcnN0OiBudWxsLFxuICAgICAgICAgICAgcm93czogbnVsbCxcbiAgICAgICAgICAgIHNvcnQ6IG51bGwsXG4gICAgICAgICAgICBmaWx0ZXI6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZXZlbnQuZmlyc3QgJiYgZXZlbnQuZmlyc3QgPiAwKSB7XG4gICAgICAgICAgICBwYXJhbXNbJ2ZpcnN0J10gPSBldmVudC5maXJzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQucm93cyAmJiBldmVudC5yb3dzID4gMCkge1xuICAgICAgICAgICAgcGFyYW1zWydyb3dzJ10gPSBldmVudC5yb3dzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50Lm11bHRpU29ydE1ldGE/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcGFyYW1zWydzb3J0J10gPSBldmVudC5tdWx0aVNvcnRNZXRhPy5tYXAocyA9PiBgJHtzLmZpZWxkfSR7cy5vcmRlciA9PT0gMSA/ICcnIDogJzpkZXNjJ31gKS5qb2luKCcsJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZmlsdGVycykge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBldmVudC5maWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpZWxkRmlsdGVycyA9IGV2ZW50LmZpbHRlcnNbZmllbGRdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRGaWx0ZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkRmlsdGVycykpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRGaWx0ZXJzID0gW2ZpZWxkRmlsdGVyc107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZEZpbHRlciBvZiBmaWVsZEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJpbWVPcGVyYXRvciA9IGZpZWxkRmlsdGVyLm1hdGNoTW9kZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZmllbGRGaWx0ZXIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhdG9yTWFwcGluZyA9IHByaW1lT3BlcmF0b3IgPyB0aGlzLmdldE1hcHBpbmcocHJpbWVPcGVyYXRvciwgdW5kZWZpbmVkLCAwKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdG9yTWFwcGluZyAmJiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG9BZGRGaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0FkZEZpbHRlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0FkZEZpbHRlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9BZGRGaWx0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpvaW5lZFZhbHVlID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh2ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBxdWVyeSBwYXJhbXMsIGFsd2F5cyBjb252ZXJ0IHRvIGlzbyBzdHJpbmcsIGNvcnJlY3QgdHJhbnNmb3JtYXRpb24gd2lsbCBiZSBkb25lIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignLCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBgWyR7am9pbmVkVmFsdWV9XWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9BZGRGaWx0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcXVlcnkgcGFyYW1zLCBhbHdheXMgY29udmVydCB0byBpc28gc3RyaW5nLCBjb3JyZWN0IHRyYW5zZm9ybWF0aW9uIHdpbGwgYmUgZG9uZSBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0FkZEZpbHRlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb0FkZEZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaChgJHtmaWVsZH06JHtvcGVyYXRvck1hcHBpbmdbMV19OiR7dmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zWydmaWx0ZXInXSA9IGZpbHRlcnMuam9pbignOycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbiAgICBwdWJsaWMgbW9kaWZ5U29ydFByb3BlcnRpZXMobWVkaXVzUXVlcnlQYXJhbXM6IE1lZGl1c1F1ZXJ5UGFyYW0sIGNvbHVtbkRlc2NyaXB0b3JzOiBBcnJheTxDb2x1bW5EZXNjcmlwdG9yPGFueSwgYW55Pj4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG1lZGl1c1F1ZXJ5UGFyYW1zLnNvcnRQcm9wZXJ0eSAmJiBjb2x1bW5EZXNjcmlwdG9ycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaSwgc29ydFByb3BlcnR5XSBvZiBtZWRpdXNRdWVyeVBhcmFtcy5zb3J0UHJvcGVydHkuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgbWVkaXVzUXVlcnlQYXJhbXMuc29ydFByb3BlcnR5W2ldID0gY29sdW1uRGVzY3JpcHRvcnMuZmluZChlbCA9PiBlbC5wcm9wZXJ0eSA9PT0gc29ydFByb3BlcnR5KT8uc29ydFByb3BlcnR5ID8/IHNvcnRQcm9wZXJ0eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBtb2RpZnlGaWx0ZXJQcm9wZXJ0aWVzKG1lZGl1c1F1ZXJ5UGFyYW1zOiBNZWRpdXNRdWVyeVBhcmFtLCBmaWx0ZXJEZXNjcmlwdG9yczogQXJyYXk8RmlsdGVyRGVzY3JpcHRvcjxhbnk+Pikge1xuICAgICAgICBmb3IgKGNvbnN0IGZpbHRlclBhcmFtIG9mIG1lZGl1c1F1ZXJ5UGFyYW1zLmZpbHRlclBhcmFtcyA/PyBbXSkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyRGVzY3JpcHRvciA9IGZpbHRlckRlc2NyaXB0b3JzLmZpbmQoZiA9PiBmLnByb3BlcnR5ID09PSBmaWx0ZXJQYXJhbS5wcm9wZXJ0eSk7XG4gICAgICAgICAgICBmaWx0ZXJQYXJhbS5wcm9wZXJ0eSA9IGZpbHRlckRlc2NyaXB0b3I/LmZpbHRlclByb3BlcnR5ID8/IGZpbHRlclBhcmFtLnByb3BlcnR5O1xuICAgICAgICAgICAgaWYgKGZpbHRlckRlc2NyaXB0b3I/LmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkRhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyUGFyYW0uZmlsdGVyTWF0Y2hUeXBlID09PSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgZGF0ZSBlcXVhbHMgZmlsdGVyIHRvIGRhdGUgcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyRGF0ZSA9IGZpbHRlclBhcmFtLmZpbHRlclZhbHVlIGFzIERhdGU7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoZmlsdGVyRGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJEZXNjcmlwdG9yLmRhdGVQaWNrZXJTaG93VGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlLnNldEhvdXJzKHN0YXJ0RGF0ZS5nZXRIb3VycygpLCBzdGFydERhdGUuZ2V0TWludXRlcygpLCAwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZERhdGUuc2V0SG91cnMoZW5kRGF0ZS5nZXRIb3VycygpLCBlbmREYXRlLmdldE1pbnV0ZXMoKSArIDEsIDAsIDApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZERhdGUuc2V0RGF0ZShlbmREYXRlLmdldERhdGUoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW0uZmlsdGVyTWF0Y2hUeXBlID0gTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkZyb21UbztcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW0uZmlsdGVyVmFsdWUgPSBzdGFydERhdGU7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtLmZpbHRlclZhbHVlVG8gPSBlbmREYXRlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHRyYW5zZm9ybSBkYXRlcyB0byBjb3JyZWN0IGlzbyBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbHRlclBhcmFtLmZpbHRlclZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJQYXJhbS5maWx0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtLmZpbHRlclZhbHVlID0gZmlsdGVyUGFyYW0uZmlsdGVyVmFsdWUubWFwKHYgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlVXRpbC50b0lzb1N0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyRGVzY3JpcHRvci5kYXRlUGlja2VyVmFsdWVJblV0YyA/PyB0aGlzLmRhdGVUaW1lSW5VdGMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckRlc2NyaXB0b3IuZGF0ZVBpY2tlclZhbHVlV2l0aFRpbWV6b25lID8/IHRoaXMuZGF0ZVRpbWVXaXRoVGltZXpvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVXaXRoTWlsbGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJEZXNjcmlwdG9yLmRhdGVQaWNrZXJWYWx1ZURhdGVPbmx5ID8/ICh0aGlzLmRhdGVPbmx5RGlzYWJsZWQgPyBmYWxzZSA6ICFmaWx0ZXJEZXNjcmlwdG9yLmRhdGVQaWNrZXJTaG93VGltZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyRGVzY3JpcHRvci5kYXRlUGlja2VyVmFsdWVJblV0YztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtLmZpbHRlclZhbHVlID0gRGF0ZVV0aWwudG9Jc29TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW0uZmlsdGVyVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyRGVzY3JpcHRvci5kYXRlUGlja2VyVmFsdWVJblV0YyA/PyB0aGlzLmRhdGVUaW1lSW5VdGMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyRGVzY3JpcHRvci5kYXRlUGlja2VyVmFsdWVXaXRoVGltZXpvbmUgPz8gdGhpcy5kYXRlVGltZVdpdGhUaW1lem9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lV2l0aE1pbGxpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJEZXNjcmlwdG9yLmRhdGVQaWNrZXJWYWx1ZURhdGVPbmx5ID8/ICh0aGlzLmRhdGVPbmx5RGlzYWJsZWQgPyBmYWxzZSA6ICFmaWx0ZXJEZXNjcmlwdG9yLmRhdGVQaWNrZXJTaG93VGltZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWx0ZXJQYXJhbS5maWx0ZXJWYWx1ZVRvICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJQYXJhbS5maWx0ZXJWYWx1ZVRvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW0uZmlsdGVyVmFsdWVUbyA9IGZpbHRlclBhcmFtLmZpbHRlclZhbHVlVG8ubWFwKHYgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlVXRpbC50b0lzb1N0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyRGVzY3JpcHRvci5kYXRlUGlja2VyVmFsdWVJblV0YyA/PyB0aGlzLmRhdGVUaW1lSW5VdGMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckRlc2NyaXB0b3IuZGF0ZVBpY2tlclZhbHVlV2l0aFRpbWV6b25lID8/IHRoaXMuZGF0ZVRpbWVXaXRoVGltZXpvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVXaXRoTWlsbGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJEZXNjcmlwdG9yLmRhdGVQaWNrZXJWYWx1ZURhdGVPbmx5ID8/ICh0aGlzLmRhdGVPbmx5RGlzYWJsZWQgPyBmYWxzZSA6ICFmaWx0ZXJEZXNjcmlwdG9yLmRhdGVQaWNrZXJTaG93VGltZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFyYW0uZmlsdGVyVmFsdWVUbyA9IERhdGVVdGlsLnRvSXNvU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclBhcmFtLmZpbHRlclZhbHVlVG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyRGVzY3JpcHRvci5kYXRlUGlja2VyVmFsdWVJblV0YyA/PyB0aGlzLmRhdGVUaW1lSW5VdGMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyRGVzY3JpcHRvci5kYXRlUGlja2VyVmFsdWVXaXRoVGltZXpvbmUgPz8gdGhpcy5kYXRlVGltZVdpdGhUaW1lem9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lV2l0aE1pbGxpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJEZXNjcmlwdG9yLmRhdGVQaWNrZXJWYWx1ZURhdGVPbmx5ID8/ICh0aGlzLmRhdGVPbmx5RGlzYWJsZWQgPyBmYWxzZSA6ICFmaWx0ZXJEZXNjcmlwdG9yLmRhdGVQaWNrZXJTaG93VGltZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvTWVkaXVzUXVlcnlQYXJhbXMoZXZlbnQ6IFRhYmxlTGF6eUxvYWRFdmVudCk6IE1lZGl1c1F1ZXJ5UGFyYW0ge1xuICAgICAgICBjb25zdCBxdWVyeVBhcmFtQnVpbGRlciA9IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZShldmVudC5yb3dzID8/IHVuZGVmaW5lZCwgZXZlbnQuZmlyc3QpO1xuXG4gICAgICAgIC8vIGFwcGx5IHNvcnRpbmdcbiAgICAgICAgaWYgKGV2ZW50Lm11bHRpU29ydE1ldGEpIHtcbiAgICAgICAgICAgIGV2ZW50Lm11bHRpU29ydE1ldGEuZm9yRWFjaChtc20gPT4gcXVlcnlQYXJhbUJ1aWxkZXIud2l0aFNvcnQobXNtLmZpZWxkLCBtc20ub3JkZXIgPT09IDEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFwcGx5IGZpbHRlcmluZ1xuICAgICAgICBpZiAoZXZlbnQuZmlsdGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZXZlbnQuZmlsdGVycykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJFdmVudCA9IGV2ZW50LmZpbHRlcnNba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJFdmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgKGZpbHRlckV2ZW50IGFzIEZpbHRlck1ldGFkYXRhW10pLmZpbHRlcihlID0+IGUudmFsdWUpLmZvckVhY2goZSA9PiB0aGlzLmFkZE1lZGl1c0ZpbHRlckZyb21QcmltZUZpbHRlck1ldGFkYXRhKHF1ZXJ5UGFyYW1CdWlsZGVyLCBrZXksIGUpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWx0ZXJFdmVudCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlckV2ZW50LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1lZGl1c0ZpbHRlckZyb21QcmltZUZpbHRlck1ldGFkYXRhKHF1ZXJ5UGFyYW1CdWlsZGVyLCBrZXksIGZpbHRlckV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdWVyeVBhcmFtQnVpbGRlci5idWlsZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRNZWRpdXNGaWx0ZXJGcm9tUHJpbWVGaWx0ZXJNZXRhZGF0YShxdWVyeVBhcmFtQnVpbGRlcjogTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIsIHByb3BlcnR5OiBzdHJpbmcsIGZpbHRlck1ldGFkYXRhOiBGaWx0ZXJNZXRhZGF0YSkge1xuICAgICAgICBjb25zdCBtYXRjaFR5cGU6IE1lZGl1c0ZpbHRlck1hdGNoVHlwZSA9IHRoaXMuZ2V0TWVkaXVzRmlsdGVyTWF0Y2hUeXBlRnJvbVByaW1lTWF0Y2hNb2RlKGZpbHRlck1ldGFkYXRhLm1hdGNoTW9kZSA/PyAnZXF1YWxzJyk7XG4gICAgICAgIHF1ZXJ5UGFyYW1CdWlsZGVyLndpdGhGaWx0ZXIocHJvcGVydHksIGZpbHRlck1ldGFkYXRhLnZhbHVlLCB1bmRlZmluZWQsIG1hdGNoVHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1lZGl1c0ZpbHRlck1hdGNoVHlwZUZyb21QcmltZU1hdGNoTW9kZShtYXRjaE1vZGU6IHN0cmluZywgZGF0YVR5cGU/OiBGaWx0ZXJUeXBlRW51bSk6IE1lZGl1c0ZpbHRlck1hdGNoVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1hcHBpbmcobWF0Y2hNb2RlLCBkYXRhVHlwZSk/LlsyXSA/PyBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNYXBwaW5nKG1hdGNoTW9kZTogc3RyaW5nLCBkYXRhVHlwZT86IEZpbHRlclR5cGVFbnVtLCBpZHggPSAwKTogTWF0Y2hNb2RlTWFwVHlwZSB8IG51bGwge1xuICAgICAgICBjb25zdCBtYXBwaW5ncyA9IHRoaXMubWF0Y2hNb2RlTWFwcGluZy5maWx0ZXIobSA9PiBtW2lkeF0gPT09IG1hdGNoTW9kZSAmJiAoIWRhdGFUeXBlIHx8ICFtWzNdIHx8IGRhdGFUeXBlID09PSBtWzNdKSk7XG4gICAgICAgIGlmIChtYXBwaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKG1hcHBpbmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmdzWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmdzLnNvcnQoKG0xLCBtMikgPT4gKG0yWzNdID8/IC0xKSAtIChtMVszXSA/PyAtMSkpWzBdO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19