@mediusinc/mng-commons 1.4.0 → 2.0.0-rc.0-08f92864

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 (416) hide show
  1. package/esm2020/lib/api/models/builders/query-param.builder.mjs +58 -58
  2. package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
  3. package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
  4. package/esm2020/lib/api/models/index.mjs +8 -8
  5. package/esm2020/lib/api/models/mappers.mjs +12 -12
  6. package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
  7. package/esm2020/lib/api/models/query-param.model.mjs +67 -67
  8. package/esm2020/lib/api/models/query-result.model.mjs +23 -23
  9. package/esm2020/lib/api/models/serialization.model.mjs +1 -1
  10. package/esm2020/lib/api/services/api.abstract.service.mjs +57 -57
  11. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +74 -74
  12. package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +29 -29
  13. package/esm2020/lib/api/services/index.mjs +3 -3
  14. package/esm2020/lib/api/utils/index.mjs +2 -2
  15. package/esm2020/lib/api/utils/medius-rest.util.mjs +213 -213
  16. package/esm2020/lib/api/utils/object-serializer.util.mjs +247 -247
  17. package/esm2020/lib/components/action/action.component.mjs +281 -275
  18. package/esm2020/lib/components/action/editor/action-editor.component.mjs +303 -303
  19. package/esm2020/lib/components/action/index.mjs +4 -4
  20. package/esm2020/lib/components/action/localization/data-language-dropdown.component.mjs +45 -45
  21. package/esm2020/lib/components/action/models/action-component.model.mjs +2 -2
  22. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +2 -2
  23. package/esm2020/lib/components/action/models/action-execution.model.mjs +249 -249
  24. package/esm2020/lib/components/action/models/index.mjs +4 -4
  25. package/esm2020/lib/components/action/models/tableview-action-default-categories.model.mjs +10 -10
  26. package/esm2020/lib/components/action/route/action-route.component.mjs +131 -130
  27. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +301 -300
  28. package/esm2020/lib/components/form/date-range/date-range.component.mjs +110 -109
  29. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +196 -194
  30. package/esm2020/lib/components/form/editor/form-editor.component.mjs +246 -243
  31. package/esm2020/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +43 -39
  32. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +51 -50
  33. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +46 -45
  34. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +28 -26
  35. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +180 -150
  36. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +24 -24
  37. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +191 -186
  38. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +198 -197
  39. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +158 -154
  40. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +19 -17
  41. package/esm2020/lib/components/form/formly/fields/index.mjs +10 -10
  42. package/esm2020/lib/components/form/formly/formly.config.mjs +211 -211
  43. package/esm2020/lib/components/form/formly/index.mjs +1 -1
  44. package/esm2020/lib/components/form/formly/models/formly-config.model.mjs +1 -1
  45. package/esm2020/lib/components/form/formly/models/formly-field.model.mjs +2 -2
  46. package/esm2020/lib/components/form/formly/models/index.mjs +2 -2
  47. package/esm2020/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +16 -15
  48. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +84 -83
  49. package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
  50. package/esm2020/lib/components/form/index.mjs +4 -4
  51. package/esm2020/lib/components/form/models/field-action-context.model.mjs +2 -2
  52. package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
  53. package/esm2020/lib/components/form/models/form-editor.interface.mjs +1 -1
  54. package/esm2020/lib/components/form/models/index.mjs +2 -2
  55. package/esm2020/lib/components/layout/breadcrumb.component.mjs +18 -17
  56. package/esm2020/lib/components/layout/footer.component.mjs +18 -17
  57. package/esm2020/lib/components/layout/index.mjs +7 -7
  58. package/esm2020/lib/components/layout/main-layout.component.mjs +52 -52
  59. package/esm2020/lib/components/layout/menu-item.component.mjs +292 -272
  60. package/esm2020/lib/components/layout/menu.component.mjs +32 -21
  61. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  62. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +194 -194
  63. package/esm2020/lib/components/layout/topbar.component.mjs +67 -65
  64. package/esm2020/lib/components/layout/version.component.mjs +58 -58
  65. package/esm2020/lib/components/tableview/index.mjs +6 -6
  66. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  67. package/esm2020/lib/components/tableview/models/table.event.mjs +16 -16
  68. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +150 -147
  69. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +52 -53
  70. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +121 -120
  71. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +101 -84
  72. package/esm2020/lib/components/tableview/table/table.component.mjs +611 -595
  73. package/esm2020/lib/components/tableview/tableview.component.mjs +115 -113
  74. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  75. package/esm2020/lib/data-providers/editor.data-provider.mjs +36 -36
  76. package/esm2020/lib/data-providers/index.mjs +6 -6
  77. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  78. package/esm2020/lib/data-providers/table.data-provider.mjs +37 -37
  79. package/esm2020/lib/data-providers/tableview-crud.data-provider.mjs +23 -23
  80. package/esm2020/lib/data-providers/tableview.data-provider.mjs +44 -44
  81. package/esm2020/lib/descriptors/action/action-button.descriptor.mjs +60 -0
  82. package/esm2020/lib/descriptors/action/action-confirmation.descriptor.mjs +77 -77
  83. package/esm2020/lib/descriptors/action/action.descriptor.mjs +579 -0
  84. package/esm2020/lib/descriptors/action/index.mjs +4 -0
  85. package/esm2020/lib/descriptors/editor/editor.descriptor.mjs +291 -0
  86. package/esm2020/lib/descriptors/editor/field-validation.descriptor.mjs +25 -0
  87. package/esm2020/lib/descriptors/editor/field.descriptor.mjs +990 -0
  88. package/esm2020/lib/descriptors/editor/index.mjs +4 -0
  89. package/esm2020/lib/descriptors/filter/filter.descriptor.mjs +370 -0
  90. package/esm2020/lib/descriptors/filter/index.mjs +2 -0
  91. package/esm2020/lib/descriptors/index.mjs +2 -12
  92. package/esm2020/lib/descriptors/interfaces/field-config.interface.mjs +1 -1
  93. package/esm2020/lib/descriptors/interfaces/index.mjs +2 -2
  94. package/esm2020/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
  95. package/esm2020/lib/descriptors/model.descriptor.mjs +44 -44
  96. package/esm2020/lib/descriptors/table/column.descriptor.mjs +406 -0
  97. package/esm2020/lib/descriptors/table/index.mjs +3 -0
  98. package/esm2020/lib/descriptors/table/table.descriptor.mjs +497 -0
  99. package/esm2020/lib/descriptors/tableview/index.mjs +2 -0
  100. package/esm2020/lib/descriptors/tableview/tableview.descriptor.mjs +346 -0
  101. package/esm2020/lib/descriptors/types/action.type.mjs +25 -25
  102. package/esm2020/lib/descriptors/types/column.type.mjs +20 -20
  103. package/esm2020/lib/descriptors/types/editor.type.mjs +7 -7
  104. package/esm2020/lib/descriptors/types/field.type.mjs +55 -55
  105. package/esm2020/lib/descriptors/types/filter.type.mjs +30 -30
  106. package/esm2020/lib/descriptors/types/index.mjs +6 -6
  107. package/esm2020/lib/descriptors/types/table.type.mjs +26 -26
  108. package/esm2020/lib/directives/component.directive.mjs +45 -44
  109. package/esm2020/lib/directives/index.mjs +2 -2
  110. package/esm2020/lib/directives/template.directive.mjs +29 -28
  111. package/esm2020/lib/mng-commons.module.mjs +445 -485
  112. package/esm2020/lib/models/column-value.model.mjs +2 -2
  113. package/esm2020/lib/models/config.model.mjs +2 -2
  114. package/esm2020/lib/models/enum.model.mjs +1 -1
  115. package/esm2020/lib/models/error.model.mjs +1 -1
  116. package/esm2020/lib/models/index.mjs +9 -9
  117. package/esm2020/lib/models/menu.model.mjs +2 -2
  118. package/esm2020/lib/models/tableview-attr.model.mjs +1 -1
  119. package/esm2020/lib/models/user.model.mjs +1 -1
  120. package/esm2020/lib/models/version.model.mjs +1 -1
  121. package/esm2020/lib/models/view-container.model.mjs +2 -2
  122. package/esm2020/lib/pipes/boolean.pipe.mjs +28 -27
  123. package/esm2020/lib/pipes/class-map.pipe.mjs +23 -22
  124. package/esm2020/lib/pipes/enum.pipe.mjs +26 -25
  125. package/esm2020/lib/pipes/enumerate-async.pipe.mjs +39 -38
  126. package/esm2020/lib/pipes/enumerate.pipe.mjs +56 -55
  127. package/esm2020/lib/pipes/getter.pipe.mjs +21 -20
  128. package/esm2020/lib/pipes/i18n-property.pipe.mjs +19 -18
  129. package/esm2020/lib/pipes/index.mjs +11 -11
  130. package/esm2020/lib/pipes/json-path.pipe.mjs +80 -79
  131. package/esm2020/lib/pipes/locale-default-row-class.pipe.mjs +27 -26
  132. package/esm2020/lib/pipes/models/internal/enumrate-pipe-i18n.model.mjs +1 -1
  133. package/esm2020/lib/pipes/models/internal/index.mjs +1 -1
  134. package/esm2020/lib/pipes/parametrize.pipe.mjs +86 -85
  135. package/esm2020/lib/pipes/template.pipe.mjs +25 -24
  136. package/esm2020/lib/provide-commons.mjs +73 -0
  137. package/esm2020/lib/router/index.mjs +4 -3
  138. package/esm2020/lib/router/models/index.mjs +1 -1
  139. package/esm2020/lib/router/models/router.model.mjs +2 -2
  140. package/esm2020/lib/router/route-builder.mjs +313 -426
  141. package/esm2020/lib/router/routes-builder.mjs +67 -0
  142. package/esm2020/lib/router/tableview-route-builder.mjs +187 -187
  143. package/esm2020/lib/security/authorization.guard.mjs +29 -26
  144. package/esm2020/lib/security/authorization.service.mjs +50 -47
  145. package/esm2020/lib/security/authorization.util.mjs +15 -15
  146. package/esm2020/lib/security/index.mjs +3 -3
  147. package/esm2020/lib/security/model/authorization.type.mjs +7 -7
  148. package/esm2020/lib/security/model/index.mjs +3 -3
  149. package/esm2020/lib/security/model/permission-service.interface.mjs +1 -1
  150. package/esm2020/lib/security/model/permissions.model.mjs +86 -86
  151. package/esm2020/lib/services/action-executor.service.mjs +558 -555
  152. package/esm2020/lib/services/commons.service.mjs +464 -461
  153. package/esm2020/lib/services/configuration.service.mjs +149 -142
  154. package/esm2020/lib/services/error-mapper.service.mjs +13 -13
  155. package/esm2020/lib/services/index.mjs +6 -6
  156. package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
  157. package/esm2020/lib/services/internal/commons-init.service.mjs +50 -44
  158. package/esm2020/lib/services/internal/index.mjs +2 -2
  159. package/esm2020/lib/services/navigation.service.mjs +51 -48
  160. package/esm2020/lib/services/providers/config-service.provider.mjs +31 -30
  161. package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
  162. package/esm2020/lib/services/providers/index.mjs +2 -2
  163. package/esm2020/lib/services/router.service.mjs +97 -0
  164. package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
  165. package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
  166. package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
  167. package/esm2020/lib/services/tokens/index.mjs +4 -4
  168. package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
  169. package/esm2020/lib/services/version.service.mjs +42 -39
  170. package/esm2020/lib/services/view-container.component.service.mjs +55 -55
  171. package/esm2020/lib/styles/button-style.builder.mjs +164 -164
  172. package/esm2020/lib/styles/index.mjs +2 -2
  173. package/esm2020/lib/styles/models/index.mjs +2 -2
  174. package/esm2020/lib/styles/models/style-level.enum.mjs +11 -11
  175. package/esm2020/lib/styles/models/style-size.enum.mjs +8 -8
  176. package/esm2020/lib/styles/styles.util.mjs +42 -42
  177. package/esm2020/lib/types/index.mjs +2 -2
  178. package/esm2020/lib/types/type.decorator.mjs +21 -21
  179. package/esm2020/lib/types/type.model.mjs +1 -1
  180. package/esm2020/lib/utils/action-data-provider.util.mjs +145 -145
  181. package/esm2020/lib/utils/date.util.mjs +117 -117
  182. package/esm2020/lib/utils/editor-formly.util.mjs +288 -288
  183. package/esm2020/lib/utils/enum.util.mjs +81 -81
  184. package/esm2020/lib/utils/export.util.mjs +20 -20
  185. package/esm2020/lib/utils/i18n.util.mjs +233 -233
  186. package/esm2020/lib/utils/index.mjs +10 -10
  187. package/esm2020/lib/utils/model.util.mjs +68 -68
  188. package/esm2020/lib/utils/notification.util.mjs +51 -51
  189. package/esm2020/lib/utils/route.util.mjs +36 -24
  190. package/esm2020/lib/utils/string.util.mjs +26 -26
  191. package/esm2020/lib/utils/tableview.util.mjs +160 -160
  192. package/esm2020/lib/utils/type.util.mjs +92 -92
  193. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  194. package/esm2020/public-api.mjs +61 -55
  195. package/fesm2015/mediusinc-mng-commons.mjs +14147 -13931
  196. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  197. package/fesm2020/mediusinc-mng-commons.mjs +13980 -13768
  198. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  199. package/index.d.ts +5 -5
  200. package/lib/api/models/builders/query-param.builder.d.ts +13 -13
  201. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  202. package/lib/api/models/filter-param.model.d.ts +23 -23
  203. package/lib/api/models/index.d.ts +8 -8
  204. package/lib/api/models/mappers.d.ts +6 -6
  205. package/lib/api/models/query-mode.model.d.ts +16 -16
  206. package/lib/api/models/query-param.model.d.ts +31 -31
  207. package/lib/api/models/query-result.model.d.ts +24 -24
  208. package/lib/api/models/serialization.model.d.ts +8 -8
  209. package/lib/api/services/api.abstract.service.d.ts +24 -24
  210. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  211. package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
  212. package/lib/api/services/index.d.ts +3 -3
  213. package/lib/api/utils/index.d.ts +2 -2
  214. package/lib/api/utils/medius-rest.util.d.ts +16 -16
  215. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  216. package/lib/components/action/action.component.d.ts +79 -79
  217. package/lib/components/action/editor/action-editor.component.d.ts +69 -69
  218. package/lib/components/action/index.d.ts +4 -4
  219. package/lib/components/action/localization/data-language-dropdown.component.d.ts +25 -25
  220. package/lib/components/action/models/action-component.model.d.ts +15 -15
  221. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  222. package/lib/components/action/models/action-execution.model.d.ts +135 -135
  223. package/lib/components/action/models/index.d.ts +4 -4
  224. package/lib/components/action/models/tableview-action-default-categories.model.d.ts +10 -10
  225. package/lib/components/action/route/action-route.component.d.ts +31 -31
  226. package/lib/components/form/autocomplete/autocomplete.component.d.ts +61 -61
  227. package/lib/components/form/date-range/date-range.component.d.ts +28 -28
  228. package/lib/components/form/dropdown/dropdown.component.d.ts +52 -52
  229. package/lib/components/form/editor/form-editor.component.d.ts +52 -52
  230. package/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.d.ts +13 -13
  231. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +16 -16
  232. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +15 -15
  233. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +14 -14
  234. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +29 -29
  235. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +11 -11
  236. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +46 -46
  237. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +25 -24
  238. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +37 -37
  239. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +7 -7
  240. package/lib/components/form/formly/fields/index.d.ts +10 -10
  241. package/lib/components/form/formly/formly.config.d.ts +14 -14
  242. package/lib/components/form/formly/index.d.ts +1 -1
  243. package/lib/components/form/formly/models/formly-config.model.d.ts +11 -11
  244. package/lib/components/form/formly/models/formly-field.model.d.ts +16 -16
  245. package/lib/components/form/formly/models/index.d.ts +2 -2
  246. package/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +6 -6
  247. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +11 -11
  248. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  249. package/lib/components/form/index.d.ts +4 -4
  250. package/lib/components/form/models/field-action-context.model.d.ts +17 -17
  251. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  252. package/lib/components/form/models/form-editor.interface.d.ts +10 -10
  253. package/lib/components/form/models/index.d.ts +2 -2
  254. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  255. package/lib/components/layout/footer.component.d.ts +9 -9
  256. package/lib/components/layout/index.d.ts +7 -7
  257. package/lib/components/layout/main-layout.component.d.ts +20 -20
  258. package/lib/components/layout/menu-item.component.d.ts +56 -52
  259. package/lib/components/layout/menu.component.d.ts +16 -10
  260. package/lib/components/layout/services/index.d.ts +1 -1
  261. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  262. package/lib/components/layout/topbar.component.d.ts +28 -28
  263. package/lib/components/layout/version.component.d.ts +19 -19
  264. package/lib/components/tableview/index.d.ts +6 -6
  265. package/lib/components/tableview/models/index.d.ts +1 -1
  266. package/lib/components/tableview/models/table.event.d.ts +17 -17
  267. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +36 -33
  268. package/lib/components/tableview/route/tableview-route.component.d.ts +19 -18
  269. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +38 -38
  270. package/lib/components/tableview/table/column-value/column-value.component.d.ts +35 -35
  271. package/lib/components/tableview/table/table.component.d.ts +117 -115
  272. package/lib/components/tableview/tableview.component.d.ts +49 -48
  273. package/lib/data-providers/base.data-provider.d.ts +14 -14
  274. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  275. package/lib/data-providers/index.d.ts +6 -6
  276. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  277. package/lib/data-providers/table.data-provider.d.ts +27 -27
  278. package/lib/data-providers/tableview-crud.data-provider.d.ts +8 -8
  279. package/lib/data-providers/tableview.data-provider.d.ts +33 -33
  280. package/lib/descriptors/{action-button.descriptor.d.ts → action/action-button.descriptor.d.ts} +22 -22
  281. package/lib/descriptors/action/action-confirmation.descriptor.d.ts +36 -36
  282. package/lib/descriptors/{action.descriptor.d.ts → action/action.descriptor.d.ts} +225 -223
  283. package/lib/descriptors/action/index.d.ts +3 -0
  284. package/lib/descriptors/{editor.descriptor.d.ts → editor/editor.descriptor.d.ts} +119 -116
  285. package/lib/descriptors/{field-validation.descriptor.d.ts → editor/field-validation.descriptor.d.ts} +19 -19
  286. package/lib/descriptors/{field.descriptor.d.ts → editor/field.descriptor.d.ts} +349 -345
  287. package/lib/descriptors/editor/index.d.ts +3 -0
  288. package/lib/descriptors/{filter.descriptor.d.ts → filter/filter.descriptor.d.ts} +120 -118
  289. package/lib/descriptors/filter/index.d.ts +1 -0
  290. package/lib/descriptors/index.d.ts +1 -11
  291. package/lib/descriptors/interfaces/field-config.interface.d.ts +9 -9
  292. package/lib/descriptors/interfaces/index.d.ts +2 -2
  293. package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +17 -17
  294. package/lib/descriptors/model.descriptor.d.ts +18 -18
  295. package/lib/descriptors/{column.descriptor.d.ts → table/column.descriptor.d.ts} +130 -130
  296. package/lib/descriptors/table/index.d.ts +2 -0
  297. package/lib/descriptors/{table.descriptor.d.ts → table/table.descriptor.d.ts} +193 -193
  298. package/lib/descriptors/tableview/index.d.ts +1 -0
  299. package/lib/descriptors/{tableview.descriptor.d.ts → tableview/tableview.descriptor.d.ts} +131 -129
  300. package/lib/descriptors/types/action.type.d.ts +21 -21
  301. package/lib/descriptors/types/column.type.d.ts +18 -18
  302. package/lib/descriptors/types/editor.type.d.ts +6 -6
  303. package/lib/descriptors/types/field.type.d.ts +47 -47
  304. package/lib/descriptors/types/filter.type.d.ts +27 -27
  305. package/lib/descriptors/types/index.d.ts +6 -6
  306. package/lib/descriptors/types/table.type.d.ts +22 -22
  307. package/lib/directives/component.directive.d.ts +16 -16
  308. package/lib/directives/index.d.ts +2 -2
  309. package/lib/directives/template.directive.d.ts +13 -13
  310. package/lib/mng-commons.module.d.ts +99 -99
  311. package/lib/models/column-value.model.d.ts +4 -4
  312. package/lib/models/config.model.d.ts +41 -40
  313. package/lib/models/enum.model.d.ts +6 -6
  314. package/lib/models/error.model.d.ts +14 -14
  315. package/lib/models/index.d.ts +9 -9
  316. package/lib/models/menu.model.d.ts +30 -30
  317. package/lib/models/tableview-attr.model.d.ts +10 -10
  318. package/lib/models/user.model.d.ts +8 -8
  319. package/lib/models/version.model.d.ts +18 -18
  320. package/lib/models/view-container.model.d.ts +43 -43
  321. package/lib/pipes/boolean.pipe.d.ts +7 -7
  322. package/lib/pipes/class-map.pipe.d.ts +7 -7
  323. package/lib/pipes/enum.pipe.d.ts +8 -8
  324. package/lib/pipes/enumerate-async.pipe.d.ts +14 -14
  325. package/lib/pipes/enumerate.pipe.d.ts +21 -21
  326. package/lib/pipes/getter.pipe.d.ts +7 -7
  327. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  328. package/lib/pipes/index.d.ts +11 -11
  329. package/lib/pipes/json-path.pipe.d.ts +13 -13
  330. package/lib/pipes/locale-default-row-class.pipe.d.ts +10 -10
  331. package/lib/pipes/models/internal/enumrate-pipe-i18n.model.d.ts +5 -5
  332. package/lib/pipes/models/internal/index.d.ts +1 -1
  333. package/lib/pipes/parametrize.pipe.d.ts +13 -13
  334. package/lib/pipes/template.pipe.d.ts +10 -10
  335. package/lib/provide-commons.d.ts +3 -0
  336. package/lib/router/index.d.ts +3 -2
  337. package/lib/router/models/index.d.ts +1 -1
  338. package/lib/router/models/router.model.d.ts +36 -33
  339. package/lib/router/route-builder.d.ts +62 -98
  340. package/lib/router/routes-builder.d.ts +29 -0
  341. package/lib/router/tableview-route-builder.d.ts +38 -37
  342. package/lib/security/authorization.guard.d.ts +11 -11
  343. package/lib/security/authorization.service.d.ts +19 -19
  344. package/lib/security/authorization.util.d.ts +5 -5
  345. package/lib/security/index.d.ts +3 -3
  346. package/lib/security/model/authorization.type.d.ts +6 -6
  347. package/lib/security/model/index.d.ts +3 -3
  348. package/lib/security/model/permission-service.interface.d.ts +6 -6
  349. package/lib/security/model/permissions.model.d.ts +37 -37
  350. package/lib/services/action-executor.service.d.ts +150 -149
  351. package/lib/services/commons.service.d.ts +93 -93
  352. package/lib/services/configuration.service.d.ts +60 -57
  353. package/lib/services/error-mapper.service.d.ts +7 -7
  354. package/lib/services/index.d.ts +6 -6
  355. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  356. package/lib/services/internal/commons-init.service.d.ts +18 -16
  357. package/lib/services/internal/index.d.ts +2 -2
  358. package/lib/services/navigation.service.d.ts +14 -14
  359. package/lib/services/providers/config-service.provider.d.ts +6 -6
  360. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  361. package/lib/services/providers/index.d.ts +2 -2
  362. package/lib/services/router.service.d.ts +22 -0
  363. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  364. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  365. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  366. package/lib/services/tokens/index.d.ts +4 -4
  367. package/lib/services/tokens/module-config.token.d.ts +3 -3
  368. package/lib/services/version.service.d.ts +13 -13
  369. package/lib/services/view-container.component.service.d.ts +31 -31
  370. package/lib/styles/button-style.builder.d.ts +67 -67
  371. package/lib/styles/index.d.ts +2 -2
  372. package/lib/styles/models/index.d.ts +2 -2
  373. package/lib/styles/models/style-level.enum.d.ts +10 -10
  374. package/lib/styles/models/style-size.enum.d.ts +7 -7
  375. package/lib/styles/styles.util.d.ts +15 -14
  376. package/lib/types/index.d.ts +2 -2
  377. package/lib/types/type.decorator.d.ts +4 -4
  378. package/lib/types/type.model.d.ts +23 -23
  379. package/lib/utils/action-data-provider.util.d.ts +20 -20
  380. package/lib/utils/date.util.d.ts +7 -7
  381. package/lib/utils/editor-formly.util.d.ts +12 -12
  382. package/lib/utils/enum.util.d.ts +50 -50
  383. package/lib/utils/export.util.d.ts +5 -5
  384. package/lib/utils/i18n.util.d.ts +57 -56
  385. package/lib/utils/index.d.ts +10 -10
  386. package/lib/utils/model.util.d.ts +8 -8
  387. package/lib/utils/notification.util.d.ts +13 -12
  388. package/lib/utils/route.util.d.ts +59 -4
  389. package/lib/utils/string.util.d.ts +4 -4
  390. package/lib/utils/tableview.util.d.ts +40 -40
  391. package/lib/utils/type.util.d.ts +57 -57
  392. package/package.json +6 -6
  393. package/public-api.d.ts +40 -34
  394. package/scss/common/layout/_breadcrumb.scss +12 -2
  395. package/scss/common/layout/_exception.scss +1 -1
  396. package/scss/common/layout/_inlinemenu.scss +13 -0
  397. package/scss/common/layout/_login.scss +1 -0
  398. package/scss/common/layout/_rightmenu.scss +5 -0
  399. package/scss/common/layout/menu/_menu_common.scss +1 -1
  400. package/scss/common/theme/designer/_mixins.scss +29 -0
  401. package/scss/common/theme/extensions/_datatable.scss +2 -2
  402. package/scss/common/variables/layout/_layout_dark.scss +0 -1
  403. package/scss/common/variables/layout/_layout_light.scss +0 -1
  404. package/scss/common/variables/theme/_theme_dark.scss +72 -46
  405. package/scss/common/variables/theme/_theme_light.scss +70 -33
  406. package/version-info.json +7 -7
  407. package/esm2020/lib/descriptors/action-button.descriptor.mjs +0 -60
  408. package/esm2020/lib/descriptors/action.descriptor.mjs +0 -577
  409. package/esm2020/lib/descriptors/column.descriptor.mjs +0 -405
  410. package/esm2020/lib/descriptors/editor.descriptor.mjs +0 -290
  411. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +0 -25
  412. package/esm2020/lib/descriptors/field.descriptor.mjs +0 -987
  413. package/esm2020/lib/descriptors/filter.descriptor.mjs +0 -368
  414. package/esm2020/lib/descriptors/table.descriptor.mjs +0 -497
  415. package/esm2020/lib/descriptors/tableview.descriptor.mjs +0 -344
  416. package/mediusinc-mng-commons-1.4.0.tgz +0 -0
@@ -1,426 +1,313 @@
1
- import { MngActionRouteComponent } from '../components/action';
2
- import { MngMainLayoutComponent } from '../components/layout';
3
- import { MngTableviewRouteComponent } from '../components/tableview';
4
- import { MngAuthorizationGuard } from '../security';
5
- import { RouteUtil } from '../utils/route.util';
6
- export class RoutesBuilder {
7
- constructor(layoutRoute) {
8
- this.routes = [];
9
- this.layoutRoute = layoutRoute?.withRoot(this);
10
- this.currentRoute = layoutRoute;
11
- }
12
- static create() {
13
- return new RoutesBuilder();
14
- }
15
- static createWithLayout(layoutComponent = MngMainLayoutComponent, topbarComponent, breadcrumbComponent, menuComponent, footerComponent) {
16
- const layoutRoute = RouteBuilder.createLayoutRoute('', layoutComponent, topbarComponent, breadcrumbComponent, menuComponent, footerComponent);
17
- return new RoutesBuilder(layoutRoute);
18
- }
19
- addAngularRoute(route) {
20
- return this.addRouteBuilder(RouteBuilder.createFromRoute(route));
21
- }
22
- addRouteRedirect(path, redirectTo, pathMatch = 'prefix') {
23
- return this.addRouteBuilder(RouteBuilder.createRedirect(path, redirectTo, pathMatch));
24
- }
25
- addLazyRoute(path, loadChildren, canLoad) {
26
- return this.addRouteBuilder(RouteBuilder.createLazyRoute(path, loadChildren, canLoad));
27
- }
28
- addRoute(path, component) {
29
- return this.addRouteBuilder(RouteBuilder.create(path, component));
30
- }
31
- addTableview(builder) {
32
- return this.addTableview(builder);
33
- }
34
- /**
35
- * @deprecated Use TableviewRouteBuilder with addTableview
36
- */
37
- addTableviewRoutes(path, descriptor, tableviewDataProvider, actions, hasDetails = true, hasEdit = true, hasAdd = true) {
38
- return this.addRouteBuilder(RouteBuilder.createTableviewRoutes(path, descriptor, tableviewDataProvider, actions, hasDetails, hasEdit, hasAdd));
39
- }
40
- /**
41
- * @deprecated Use TableviewRouteBuilder with addTableview
42
- */
43
- addTableviewRoutesFromComponent(path, component, hasDetails = true, hasEdit = true, hasAdd = true) {
44
- return this.addRouteBuilder(RouteBuilder.createTableviewRoutesFromComponent(path, component, hasDetails, hasEdit, hasAdd));
45
- }
46
- addRouteBuilder(routeBuilder) {
47
- this.currentRoute = routeBuilder.withRoot(this);
48
- this.routes.push(routeBuilder);
49
- return this;
50
- }
51
- toRoute() {
52
- if (!this.currentRoute) {
53
- throw new Error('No routes were added!');
54
- }
55
- return this.currentRoute;
56
- }
57
- buildRoutes() {
58
- let angularRoutes = [];
59
- for (const route of this.routes) {
60
- angularRoutes.push(route.buildRoute());
61
- }
62
- if (this.layoutRoute) {
63
- const layoutAngularRoute = this.layoutRoute.buildRoute();
64
- if (angularRoutes.length > 0) {
65
- layoutAngularRoute.children = angularRoutes;
66
- }
67
- angularRoutes = [layoutAngularRoute];
68
- }
69
- return angularRoutes;
70
- }
71
- buildMenu() {
72
- const menuItems = [];
73
- for (const route of this.routes) {
74
- menuItems.push(...route.buildMenu());
75
- }
76
- return menuItems.flat();
77
- }
78
- }
79
- export class RouteBuilder {
80
- constructor(route) {
81
- this.routePath = [];
82
- this.routeData = { breadcrumb: null };
83
- this.children = [];
84
- this.menuItemChildren = [];
85
- this.route = route;
86
- if (this.route.path && this.route.path.length > 0) {
87
- this.routePath = [this.route.path];
88
- }
89
- }
90
- static create(path, component) {
91
- return new RouteBuilder({
92
- path: path,
93
- component: component
94
- });
95
- }
96
- static createRedirect(path, redirectTo, pathMatch = 'prefix') {
97
- return new RouteBuilder({
98
- path: path,
99
- redirectTo: redirectTo,
100
- pathMatch: pathMatch
101
- });
102
- }
103
- static createLazyRoute(path, loadChildren, canLoad) {
104
- const route = { path: path, loadChildren: loadChildren };
105
- if (canLoad?.length) {
106
- route.canLoad = canLoad;
107
- }
108
- return new RouteBuilder(route);
109
- }
110
- static createFromRoute(route) {
111
- return new RouteBuilder(route);
112
- }
113
- static createLayoutRoute(path, layoutComponent = MngMainLayoutComponent, topbarComponent, breadcrumbComponent, menuComponent, footerComponent) {
114
- const layoutRoute = RouteBuilder.create(path, layoutComponent);
115
- if (topbarComponent || breadcrumbComponent || menuComponent || footerComponent) {
116
- const routeData = {};
117
- if (topbarComponent) {
118
- routeData.topbarComponent = topbarComponent;
119
- }
120
- if (breadcrumbComponent) {
121
- routeData.breadcrumbComponent = breadcrumbComponent;
122
- }
123
- if (menuComponent) {
124
- routeData.menuComponent = menuComponent;
125
- }
126
- if (footerComponent) {
127
- routeData.footerComponent = footerComponent;
128
- }
129
- layoutRoute.withData(routeData);
130
- }
131
- return layoutRoute;
132
- }
133
- static createTableview(builder) {
134
- return builder.toRouteBuilder();
135
- }
136
- /**
137
- * @deprecated Use TableviewRouteBuilder
138
- */
139
- static createTableviewRoutes(path, descriptor, dataProvider, actions, hasDetails = true, hasEdit = true, hasAdd = true) {
140
- const tableviewRoute = RouteBuilder.createFromRoute({
141
- data: {
142
- tableview: {
143
- descriptor,
144
- dataProvider,
145
- actions
146
- }
147
- },
148
- path: path,
149
- component: MngTableviewRouteComponent
150
- });
151
- RouteBuilder.addActionsSubroutesToTableviewParent(tableviewRoute, hasDetails, hasEdit, hasAdd);
152
- return tableviewRoute;
153
- }
154
- /**
155
- * @deprecated Use TableviewRouteBuilder
156
- */
157
- static createTableviewRoutesFromComponent(path, component, hasDetails = true, hasEdit = true, hasAdd = true) {
158
- const actionCrudRoute = RouteBuilder.create(path, component);
159
- RouteBuilder.addActionsSubroutesToTableviewParent(actionCrudRoute, hasDetails, hasEdit, hasAdd);
160
- return actionCrudRoute;
161
- }
162
- static addActionsSubroutesToTableviewParent(parentRoute, hasDetails, hasEdit, hasAdd) {
163
- parentRoute.addChild('', MngActionRouteComponent);
164
- if (hasAdd) {
165
- parentRoute.addChild('add', MngActionRouteComponent);
166
- }
167
- if (hasDetails) {
168
- parentRoute.addChild(':itemId', MngActionRouteComponent);
169
- }
170
- if (hasEdit) {
171
- parentRoute.addChild(':itemId/edit', MngActionRouteComponent);
172
- }
173
- }
174
- withRoot(routesBuilder) {
175
- this.root = routesBuilder;
176
- return this;
177
- }
178
- withParent(parent) {
179
- this.parent = parent;
180
- this.routePath = RouteUtil.removeEmptyPathSegments([...this.parent.routePath, this.route.path ?? '']);
181
- return this;
182
- }
183
- withBreadcrumb(breadcrumb) {
184
- this.breadcrumb = breadcrumb;
185
- this.routeData.breadcrumb = breadcrumb;
186
- return this;
187
- }
188
- withPageTitle(pageTitle) {
189
- this.pageTitle = pageTitle;
190
- this.routeData.pageTitle = pageTitle;
191
- return this;
192
- }
193
- withRedirectTo(redirectTo) {
194
- this.route.redirectTo = redirectTo;
195
- return this;
196
- }
197
- withPathMatch(pathMatch) {
198
- this.route.pathMatch = pathMatch;
199
- return this;
200
- }
201
- withTitle(title) {
202
- this.withPageTitle(title);
203
- this.withBreadcrumb(title);
204
- return this;
205
- }
206
- withCanActivate(diToken) {
207
- if (!this.route.canActivate) {
208
- this.route.canActivate = [];
209
- }
210
- this.route.canActivate.push(diToken);
211
- return this;
212
- }
213
- withCanDeactivate(diToken) {
214
- if (!this.route.canDeactivate) {
215
- this.route.canDeactivate = [];
216
- }
217
- this.route.canDeactivate.push(diToken);
218
- return this;
219
- }
220
- withResolver(diToken, name) {
221
- if (!this.route.resolve) {
222
- this.route.resolve = {};
223
- }
224
- this.route.resolve[name] = diToken;
225
- return this;
226
- }
227
- withData(data) {
228
- if (!data.breadcrumb) {
229
- data.breadcrumb = null;
230
- }
231
- this.routeData = data;
232
- return this;
233
- }
234
- withMngMenuItem(menuItem) {
235
- this.menuItem = menuItem;
236
- return this;
237
- }
238
- withMenuItem(icon, label, routerLink) {
239
- this.menuItem = this.createMenuItem(icon, label, routerLink);
240
- return this;
241
- }
242
- withMenuItemChild(label, icon, routerLink) {
243
- this.menuItemChildren.push(this.createMenuItem(icon, label, routerLink));
244
- return this;
245
- }
246
- withMenuItemChildren(routesBuilder) {
247
- const menu = routesBuilder.buildMenu();
248
- this.adjustMenuRouterLinksFromBuilder(menu);
249
- this.menuItemChildren.push(...menu);
250
- return this;
251
- }
252
- withPermissions(permissions) {
253
- this.routeData.permissions = permissions;
254
- this.withCanActivate(MngAuthorizationGuard);
255
- return this;
256
- }
257
- addChild(path, component) {
258
- const childRouteBuilder = RouteBuilder.create(path, component);
259
- this.addChildBuilder(childRouteBuilder);
260
- return childRouteBuilder;
261
- }
262
- addChildBuilder(routeBuilder) {
263
- routeBuilder.withParent(this);
264
- if (this.root) {
265
- routeBuilder.withRoot(this.root);
266
- }
267
- this.children.push(routeBuilder);
268
- return this;
269
- }
270
- /**
271
- * @deprecated
272
- */
273
- addTableviewRoutes(path, descriptor, tableviewDataProvider, actions, hasDetails = true, hasEdit = true, hasAdd = true) {
274
- const routeBuilder = RouteBuilder.createTableviewRoutes(path, descriptor, tableviewDataProvider, actions, hasDetails, hasEdit, hasAdd);
275
- this.addChildBuilder(routeBuilder);
276
- return routeBuilder;
277
- }
278
- /**
279
- * @deprecated
280
- */
281
- addTableviewRoutesFromComponent(path, component, hasDetails = true, hasEdit = true, hasAdd = true) {
282
- const routeBuilder = RouteBuilder.createTableviewRoutesFromComponent(path, component, hasDetails, hasEdit, hasAdd);
283
- this.addChildBuilder(routeBuilder);
284
- return routeBuilder;
285
- }
286
- toParent() {
287
- if (!this.parent) {
288
- throw new Error('Parent was not provided.');
289
- }
290
- return this.parent;
291
- }
292
- toRoot() {
293
- if (!this.root) {
294
- throw new Error('Root was not provided.');
295
- }
296
- return this.root;
297
- }
298
- finish() {
299
- return this.toRoot();
300
- }
301
- buildRoute() {
302
- const angularRoute = {
303
- ...this.route
304
- };
305
- if (angularRoute.data) {
306
- angularRoute.data = {
307
- ...angularRoute.data,
308
- ...this.routeData
309
- };
310
- }
311
- else {
312
- angularRoute.data = { ...this.routeData };
313
- }
314
- if ((this.route.children?.length ?? 0) > 0 || this.children.length > 0) {
315
- // route has children
316
- angularRoute.children = [];
317
- if (this.route.children?.length) {
318
- angularRoute.children.push(...this.route.children);
319
- }
320
- if (this.children.length) {
321
- for (const childRoute of this.children) {
322
- angularRoute.children.push(childRoute.buildRoute());
323
- }
324
- }
325
- }
326
- if (this.route.canActivate) {
327
- angularRoute.canActivate = [...this.route.canActivate];
328
- }
329
- if (this.route.canActivateChild) {
330
- angularRoute.canActivateChild = [...this.route.canActivateChild];
331
- }
332
- if (this.route.canLoad) {
333
- angularRoute.canLoad = [...this.route.canLoad];
334
- }
335
- if (this.route.canDeactivate) {
336
- angularRoute.canDeactivate = [...this.route.canDeactivate];
337
- }
338
- if (this.route.resolve) {
339
- angularRoute.resolve = { ...this.route.resolve };
340
- }
341
- return angularRoute;
342
- }
343
- buildMenu() {
344
- const menuItemBuild = this.menuItem ? { ...this.menuItem } : null;
345
- const routeChildrenMenuItems = this.children.flatMap(child => child.buildMenu());
346
- const menuItemChildren = [];
347
- const menuItemChildrenBuild = [];
348
- if (menuItemBuild?.items) {
349
- menuItemChildrenBuild.push(...menuItemBuild.items);
350
- }
351
- for (const menuItemChild of this.menuItemChildren) {
352
- const finalMenuItemChild = { ...menuItemChild };
353
- if (!finalMenuItemChild.routerLink) {
354
- finalMenuItemChild.routerLink = this.routePath;
355
- }
356
- if (typeof finalMenuItemChild.routerLink === 'string') {
357
- finalMenuItemChild.routerLink = [finalMenuItemChild.routerLink];
358
- }
359
- finalMenuItemChild.routerLink = RouteUtil.removeEmptyPathSegments(finalMenuItemChild.routerLink);
360
- menuItemChildren.push(finalMenuItemChild);
361
- }
362
- menuItemChildrenBuild.push(...menuItemChildren, ...routeChildrenMenuItems);
363
- if (!menuItemBuild) {
364
- return menuItemChildrenBuild;
365
- }
366
- menuItemBuild.label = menuItemBuild.label ?? this.pageTitle;
367
- if (typeof menuItemBuild.routerLink === 'string') {
368
- menuItemBuild.routerLink = [menuItemBuild.routerLink];
369
- }
370
- menuItemBuild.routerLink = RouteUtil.removeEmptyPathSegments(menuItemBuild.routerLink ?? this.routePath);
371
- if (menuItemChildrenBuild.length > 0) {
372
- menuItemBuild.items = menuItemChildrenBuild;
373
- }
374
- if (!menuItemBuild.guards) {
375
- const guards = this.findMenuItemGuards();
376
- if (guards.length > 0) {
377
- menuItemBuild.guards = guards;
378
- }
379
- }
380
- if (!menuItemBuild.permissions && this.routeData.permissions) {
381
- menuItemBuild.permissions = this.routeData.permissions;
382
- }
383
- return [menuItemBuild];
384
- }
385
- createMenuItem(icon, label, routerLink) {
386
- const menuItem = {};
387
- if (icon) {
388
- menuItem.icon = icon;
389
- }
390
- if (label) {
391
- menuItem.label = label;
392
- }
393
- if (routerLink) {
394
- menuItem.routerLink = routerLink;
395
- }
396
- return menuItem;
397
- }
398
- adjustMenuRouterLinksFromBuilder(menuItems) {
399
- for (const menuItem of menuItems) {
400
- if (menuItem.routerLink) {
401
- menuItem.routerLink = RouteUtil.appendPathToBasePath(this.routePath, typeof menuItem.routerLink === 'string' ? [menuItem.routerLink] : menuItem.routerLink);
402
- }
403
- if (Array.isArray(menuItem.items)) {
404
- this.adjustMenuRouterLinksFromBuilder(menuItem.items);
405
- }
406
- }
407
- }
408
- findMenuItemGuards() {
409
- const guards = [];
410
- if (this.route.canActivate?.length) {
411
- guards.push(...this.route.canActivate);
412
- }
413
- if (this.parent) {
414
- // Check for parent guards that should be included in decision to hide menu item!
415
- // Some parent routes might have guards, but no menu items, so this guards must be taken into account here,
416
- // because there is no parent menu item to hide.
417
- this.parent.findMenuItemGuards().forEach(g => {
418
- if (guards.indexOf(g) < 0) {
419
- guards.push(g);
420
- }
421
- });
422
- }
423
- return guards;
424
- }
425
- }
426
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcm91dGVyL3JvdXRlLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUE4QiwwQkFBMEIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBSWhHLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVsRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFJOUMsTUFBTSxPQUFPLGFBQWE7SUFLdEIsWUFBb0IsV0FBMEI7UUFIdEMsV0FBTSxHQUF3QixFQUFFLENBQUM7UUFJckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ3BDLENBQUM7SUFFTSxNQUFNLENBQUMsTUFBTTtRQUNoQixPQUFPLElBQUksYUFBYSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDMUIsZUFBZSxHQUFHLHNCQUFzQixFQUN4QyxlQUEyQixFQUMzQixtQkFBK0IsRUFDL0IsYUFBeUIsRUFDekIsZUFBMkI7UUFFM0IsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM5SSxPQUFPLElBQUksYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTSxlQUFlLENBQUMsS0FBWTtRQUMvQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMs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QUNsQjtZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ047UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1R5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtMb2FkQ2hpbGRyZW4sIFJvdXRlLCBSb3V0ZXN9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7TW5nQWN0aW9uUm91dGVDb21wb25lbnR9IGZyb20gJy4uL2NvbXBvbmVudHMvYWN0aW9uJztcbmltcG9ydCB7TW5nTWFpbkxheW91dENvbXBvbmVudH0gZnJvbSAnLi4vY29tcG9uZW50cy9sYXlvdXQnO1xuaW1wb3J0IHtBTW5nVGFibGV2aWV3Um91dGVDb21wb25lbnQsIE1uZ1RhYmxldmlld1JvdXRlQ29tcG9uZW50fSBmcm9tICcuLi9jb21wb25lbnRzL3RhYmxldmlldyc7XG5pbXBvcnQge0lUYWJsZXZpZXdEYXRhUHJvdmlkZXJ9IGZyb20gJy4uL2RhdGEtcHJvdmlkZXJzJztcbmltcG9ydCB7QWN0aW9uRGVzY3JpcHRvciwgVGFibGV2aWV3RGVzY3JpcHRvcn0gZnJvbSAnLi4vZGVzY3JpcHRvcnMnO1xuaW1wb3J0IHtNbmdNZW51SXRlbX0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7TW5nQXV0aG9yaXphdGlvbkd1YXJkfSBmcm9tICcuLi9zZWN1cml0eSc7XG5pbXBvcnQge0FQZXJtaXNzaW9uc30gZnJvbSAnLi4vc2VjdXJpdHkvbW9kZWwnO1xuaW1wb3J0IHtSb3V0ZVV0aWx9IGZyb20gJy4uL3V0aWxzL3JvdXRlLnV0aWwnO1xuaW1wb3J0IHtCcmVhZGNydW1iVHlwZSwgTW5nUm91dGVyRGF0YX0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHtUYWJsZXZpZXdSb3V0ZUJ1aWxkZXJ9IGZyb20gJy4vdGFibGV2aWV3LXJvdXRlLWJ1aWxkZXInO1xuXG5leHBvcnQgY2xhc3MgUm91dGVzQnVpbGRlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsYXlvdXRSb3V0ZT86IFJvdXRlQnVpbGRlcjtcbiAgICBwcml2YXRlIHJvdXRlczogQXJyYXk8Um91dGVCdWlsZGVyPiA9IFtdO1xuICAgIHByaXZhdGUgY3VycmVudFJvdXRlPzogUm91dGVCdWlsZGVyO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihsYXlvdXRSb3V0ZT86IFJvdXRlQnVpbGRlcikge1xuICAgICAgICB0aGlzLmxheW91dFJvdXRlID0gbGF5b3V0Um91dGU/LndpdGhSb290KHRoaXMpO1xuICAgICAgICB0aGlzLmN1cnJlbnRSb3V0ZSA9IGxheW91dFJvdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKCk6IFJvdXRlc0J1aWxkZXIge1xuICAgICAgICByZXR1cm4gbmV3IFJvdXRlc0J1aWxkZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVdpdGhMYXlvdXQoXG4gICAgICAgIGxheW91dENvbXBvbmVudCA9IE1uZ01haW5MYXlvdXRDb21wb25lbnQsXG4gICAgICAgIHRvcGJhckNvbXBvbmVudD86IFR5cGU8YW55PixcbiAgICAgICAgYnJlYWRjcnVtYkNvbXBvbmVudD86IFR5cGU8YW55PixcbiAgICAgICAgbWVudUNvbXBvbmVudD86IFR5cGU8YW55PixcbiAgICAgICAgZm9vdGVyQ29tcG9uZW50PzogVHlwZTxhbnk+XG4gICAgKTogUm91dGVzQnVpbGRlciB7XG4gICAgICAgIGNvbnN0IGxheW91dFJvdXRlID0gUm91dGVCdWlsZGVyLmNyZWF0ZUxheW91dFJvdXRlKCcnLCBsYXlvdXRDb21wb25lbnQsIHRvcGJhckNvbXBvbmVudCwgYnJlYWRjcnVtYkNvbXBvbmVudCwgbWVudUNvbXBvbmVudCwgZm9vdGVyQ29tcG9uZW50KTtcbiAgICAgICAgcmV0dXJuIG5ldyBSb3V0ZXNCdWlsZGVyKGxheW91dFJvdXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQW5ndWxhclJvdXRlKHJvdXRlOiBSb3V0ZSk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSb3V0ZUJ1aWxkZXIoUm91dGVCdWlsZGVyLmNyZWF0ZUZyb21Sb3V0ZShyb3V0ZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRSb3V0ZVJlZGlyZWN0KHBhdGg6IHN0cmluZywgcmVkaXJlY3RUbzogc3RyaW5nLCBwYXRoTWF0Y2g6ICdmdWxsJyB8ICdwcmVmaXgnID0gJ3ByZWZpeCcpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUm91dGVCdWlsZGVyKFJvdXRlQnVpbGRlci5jcmVhdGVSZWRpcmVjdChwYXRoLCByZWRpcmVjdFRvLCBwYXRoTWF0Y2gpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTGF6eVJvdXRlKHBhdGg6IHN0cmluZywgbG9hZENoaWxkcmVuOiBMb2FkQ2hpbGRyZW4sIGNhbkxvYWQ/OiBBcnJheTxhbnk+KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJvdXRlQnVpbGRlcihSb3V0ZUJ1aWxkZXIuY3JlYXRlTGF6eVJvdXRlKHBhdGgsIGxvYWRDaGlsZHJlbiwgY2FuTG9hZCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRSb3V0ZShwYXRoOiBzdHJpbmcsIGNvbXBvbmVudDogVHlwZTxhbnk+KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJvdXRlQnVpbGRlcihSb3V0ZUJ1aWxkZXIuY3JlYXRlKHBhdGgsIGNvbXBvbmVudCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRUYWJsZXZpZXc8QyBleHRlbmRzIEFNbmdUYWJsZXZpZXdSb3V0ZUNvbXBvbmVudDxhbnksIGFueT4+KGJ1aWxkZXI6IFRhYmxldmlld1JvdXRlQnVpbGRlcjxDPik6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRUYWJsZXZpZXcoYnVpbGRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIFRhYmxldmlld1JvdXRlQnVpbGRlciB3aXRoIGFkZFRhYmxldmlld1xuICAgICAqL1xuICAgIHB1YmxpYyBhZGRUYWJsZXZpZXdSb3V0ZXM8VCwgUz4oXG4gICAgICAgIHBhdGg6IHN0cmluZyxcbiAgICAgICAgZGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvcjxUPixcbiAgICAgICAgdGFibGV2aWV3RGF0YVByb3ZpZGVyOiBJVGFibGV2aWV3RGF0YVByb3ZpZGVyPFQsIFM+LFxuICAgICAgICBhY3Rpb25zPzogQXJyYXk8QWN0aW9uRGVzY3JpcHRvcjxUPj4sXG4gICAgICAgIGhhc0RldGFpbHMgPSB0cnVlLFxuICAgICAgICBoYXNFZGl0ID0gdHJ1ZSxcbiAgICAgICAgaGFzQWRkID0gdHJ1ZVxuICAgICk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSb3V0ZUJ1aWxkZXIoUm91dGVCdWlsZGVyLmNyZWF0ZVRhYmxldmlld1JvdXRlcyhwYXRoLCBkZXNjcmlwdG9yLCB0YWJsZXZpZXdEYXRhUHJvdmlkZXIsIGFjdGlvbnMsIGhhc0RldGFpbHMsIGhhc0VkaXQsIGhhc0FkZCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBUYWJsZXZpZXdSb3V0ZUJ1aWxkZXIgd2l0aCBhZGRUYWJsZXZpZXdcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkVGFibGV2aWV3Um91dGVzRnJvbUNvbXBvbmVudChwYXRoOiBzdHJpbmcsIGNvbXBvbmVudDogVHlwZTxhbnk+LCBoYXNEZXRhaWxzID0gdHJ1ZSwgaGFzRWRpdCA9IHRydWUsIGhhc0FkZCA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUm91dGVCdWlsZGVyKFJvdXRlQnVpbGRlci5jcmVhdGVUYWJsZXZpZXdSb3V0ZXNGcm9tQ29tcG9uZW50KHBhdGgsIGNvbXBvbmVudCwgaGFzRGV0YWlscywgaGFzRWRpdCwgaGFzQWRkKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFJvdXRlQnVpbGRlcihyb3V0ZUJ1aWxkZXI6IFJvdXRlQnVpbGRlcik6IHRoaXMge1xuICAgICAgICB0aGlzLmN1cnJlbnRSb3V0ZSA9IHJvdXRlQnVpbGRlci53aXRoUm9vdCh0aGlzKTtcbiAgICAgICAgdGhpcy5yb3V0ZXMucHVzaChyb3V0ZUJ1aWxkZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9Sb3V0ZSgpOiBSb3V0ZUJ1aWxkZXIge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFJvdXRlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJvdXRlcyB3ZXJlIGFkZGVkIScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRSb3V0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYnVpbGRSb3V0ZXMoKTogUm91dGVzIHtcbiAgICAgICAgbGV0IGFuZ3VsYXJSb3V0ZXM6IFJvdXRlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHRoaXMucm91dGVzKSB7XG4gICAgICAgICAgICBhbmd1bGFyUm91dGVzLnB1c2gocm91dGUuYnVpbGRSb3V0ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxheW91dFJvdXRlKSB7XG4gICAgICAgICAgICBjb25zdCBsYXlvdXRBbmd1bGFyUm91dGUgPSB0aGlzLmxheW91dFJvdXRlLmJ1aWxkUm91dGUoKTtcbiAgICAgICAgICAgIGlmIChhbmd1bGFyUm91dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsYXlvdXRBbmd1bGFyUm91dGUuY2hpbGRyZW4gPSBhbmd1bGFyUm91dGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYW5ndWxhclJvdXRlcyA9IFtsYXlvdXRBbmd1bGFyUm91dGVdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFuZ3VsYXJSb3V0ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGJ1aWxkTWVudSgpOiBBcnJheTxNbmdNZW51SXRlbT4ge1xuICAgICAgICBjb25zdCBtZW51SXRlbXM6IEFycmF5PE1uZ01lbnVJdGVtPiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHRoaXMucm91dGVzKSB7XG4gICAgICAgICAgICBtZW51SXRlbXMucHVzaCguLi5yb3V0ZS5idWlsZE1lbnUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lbnVJdGVtcy5mbGF0KCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUm91dGVCdWlsZGVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBSb3V0ZTtcbiAgICBwcml2YXRlIHJvdXRlUGF0aDogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHByaXZhdGUgcm91dGVEYXRhOiBNbmdSb3V0ZXJEYXRhID0ge2JyZWFkY3J1bWI6IG51bGx9O1xuICAgIHByaXZhdGUgcm9vdD86IFJvdXRlc0J1aWxkZXI7XG4gICAgcHJpdmF0ZSBwYXJlbnQ/OiBSb3V0ZUJ1aWxkZXI7XG4gICAgcHJpdmF0ZSBjaGlsZHJlbjogQXJyYXk8Um91dGVCdWlsZGVyPiA9IFtdO1xuXG4gICAgcHJpdmF0ZSBtZW51SXRlbT86IE1uZ01lbnVJdGVtO1xuICAgIHByaXZhdGUgbWVudUl0ZW1DaGlsZHJlbjogQXJyYXk8TW5nTWVudUl0ZW0+ID0gW107XG5cbiAgICBwcml2YXRlIGJyZWFkY3J1bWI/OiBCcmVhZGNydW1iVHlwZTtcbiAgICBwcml2YXRlIHBhZ2VUaXRsZT86IHN0cmluZztcblxuICAgIHByaXZhdGUgcGVybWlzc2lvbnM/OiBBUGVybWlzc2lvbnM7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKHJvdXRlOiBSb3V0ZSkge1xuICAgICAgICB0aGlzLnJvdXRlID0gcm91dGU7XG4gICAgICAgIGlmICh0aGlzLnJvdXRlLnBhdGggJiYgdGhpcy5yb3V0ZS5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVQYXRoID0gW3RoaXMucm91dGUucGF0aF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShwYXRoOiBzdHJpbmcsIGNvbXBvbmVudDogVHlwZTxhbnk+KTogUm91dGVCdWlsZGVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSb3V0ZUJ1aWxkZXIoe1xuICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUmVkaXJlY3QocGF0aDogc3RyaW5nLCByZWRpcmVjdFRvOiBzdHJpbmcsIHBhdGhNYXRjaDogJ2Z1bGwnIHwgJ3ByZWZpeCcgPSAncHJlZml4Jyk6IFJvdXRlQnVpbGRlciB7XG4gICAgICAgIHJldHVybiBuZXcgUm91dGVCdWlsZGVyKHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICByZWRpcmVjdFRvOiByZWRpcmVjdFRvLFxuICAgICAgICAgICAgcGF0aE1hdGNoOiBwYXRoTWF0Y2hcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVMYXp5Um91dGUocGF0aDogc3RyaW5nLCBsb2FkQ2hpbGRyZW46IExvYWRDaGlsZHJlbiwgY2FuTG9hZD86IEFycmF5PGFueT4pOiBSb3V0ZUJ1aWxkZXIge1xuICAgICAgICBjb25zdCByb3V0ZTogUm91dGUgPSB7cGF0aDogcGF0aCwgbG9hZENoaWxkcmVuOiBsb2FkQ2hpbGRyZW59O1xuICAgICAgICBpZiAoY2FuTG9hZD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByb3V0ZS5jYW5Mb2FkID0gY2FuTG9hZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJvdXRlQnVpbGRlcihyb3V0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGcm9tUm91dGUocm91dGU6IFJvdXRlKTogUm91dGVCdWlsZGVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSb3V0ZUJ1aWxkZXIocm91dGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlTGF5b3V0Um91dGUoXG4gICAgICAgIHBhdGg6IHN0cmluZyxcbiAgICAgICAgbGF5b3V0Q29tcG9uZW50ID0gTW5nTWFpbkxheW91dENvbXBvbmVudCxcbiAgICAgICAgdG9wYmFyQ29tcG9uZW50PzogVHlwZTxhbnk+LFxuICAgICAgICBicmVhZGNydW1iQ29tcG9uZW50PzogVHlwZTxhbnk+LFxuICAgICAgICBtZW51Q29tcG9uZW50PzogVHlwZTxhbnk+LFxuICAgICAgICBmb290ZXJDb21wb25lbnQ/OiBUeXBlPGFueT5cbiAgICApOiBSb3V0ZUJ1aWxkZXIge1xuICAgICAgICBjb25zdCBsYXlvdXRSb3V0ZSA9IFJvdXRlQnVpbGRlci5jcmVhdGUocGF0aCwgbGF5b3V0Q29tcG9uZW50KTtcbiAgICAgICAgaWYgKHRvcGJhckNvbXBvbmVudCB8fCBicmVhZGNydW1iQ29tcG9uZW50IHx8IG1lbnVDb21wb25lbnQgfHwgZm9vdGVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCByb3V0ZURhdGE6IE1uZ1JvdXRlckRhdGEgPSB7fTtcbiAgICAgICAgICAgIGlmICh0b3BiYXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICByb3V0ZURhdGEudG9wYmFyQ29tcG9uZW50ID0gdG9wYmFyQ29tcG9uZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJyZWFkY3J1bWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICByb3V0ZURhdGEuYnJlYWRjcnVtYkNvbXBvbmVudCA9IGJyZWFkY3J1bWJDb21wb25lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVudUNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIHJvdXRlRGF0YS5tZW51Q29tcG9uZW50ID0gbWVudUNvbXBvbmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmb290ZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICByb3V0ZURhdGEuZm9vdGVyQ29tcG9uZW50ID0gZm9vdGVyQ29tcG9uZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGF5b3V0Um91dGUud2l0aERhdGEocm91dGVEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5b3V0Um91dGU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVUYWJsZXZpZXc8QyBleHRlbmRzIEFNbmdUYWJsZXZpZXdSb3V0ZUNvbXBvbmVudDxhbnksIGFueT4+KGJ1aWxkZXI6IFRhYmxldmlld1JvdXRlQnVpbGRlcjxDPik6IFJvdXRlQnVpbGRlciB7XG4gICAgICAgIHJldHVybiBidWlsZGVyLnRvUm91dGVCdWlsZGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIFRhYmxldmlld1JvdXRlQnVpbGRlclxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlVGFibGV2aWV3Um91dGVzPFQsIFM+KFxuICAgICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICAgIGRlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3I8VD4sXG4gICAgICAgIGRhdGFQcm92aWRlcjogSVRhYmxldmlld0RhdGFQcm92aWRlcjxULCBTPixcbiAgICAgICAgYWN0aW9ucz86IEFycmF5PEFjdGlvbkRlc2NyaXB0b3I8VD4+LFxuICAgICAgICBoYXNEZXRhaWxzID0gdHJ1ZSxcbiAgICAgICAgaGFzRWRpdCA9IHRydWUsXG4gICAgICAgIGhhc0FkZCA9IHRydWVcbiAgICApOiBSb3V0ZUJ1aWxkZXIge1xuICAgICAgICBjb25zdCB0YWJsZXZpZXdSb3V0ZSA9IFJvdXRlQnVpbGRlci5jcmVhdGVGcm9tUm91dGUoe1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHRhYmxldmlldzoge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLFxuICAgICAgICAgICAgICAgICAgICBkYXRhUHJvdmlkZXIsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIE1uZ1JvdXRlckRhdGEsXG4gICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgY29tcG9uZW50OiBNbmdUYWJsZXZpZXdSb3V0ZUNvbXBvbmVudFxuICAgICAgICB9KTtcbiAgICAgICAgUm91dGVCdWlsZGVyLmFkZEFjdGlvbnNTdWJyb3V0ZXNUb1RhYmxldmlld1BhcmVudCh0YWJsZXZpZXdSb3V0ZSwgaGFzRGV0YWlscywgaGFzRWRpdCwgaGFzQWRkKTtcbiAgICAgICAgcmV0dXJuIHRhYmxldmlld1JvdXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBUYWJsZXZpZXdSb3V0ZUJ1aWxkZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVRhYmxldmlld1JvdXRlc0Zyb21Db21wb25lbnQocGF0aDogc3RyaW5nLCBjb21wb25lbnQ6IFR5cGU8YW55PiwgaGFzRGV0YWlscyA9IHRydWUsIGhhc0VkaXQgPSB0cnVlLCBoYXNBZGQgPSB0cnVlKTogUm91dGVCdWlsZGVyIHtcbiAgICAgICAgY29uc3QgYWN0aW9uQ3J1ZFJvdXRlID0gUm91dGVCdWlsZGVyLmNyZWF0ZShwYXRoLCBjb21wb25lbnQpO1xuICAgICAgICBSb3V0ZUJ1aWxkZXIuYWRkQWN0aW9uc1N1YnJvdXRlc1RvVGFibGV2aWV3UGFyZW50KGFjdGlvbkNydWRSb3V0ZSwgaGFzRGV0YWlscywgaGFzRWRpdCwgaGFzQWRkKTtcbiAgICAgICAgcmV0dXJuIGFjdGlvbkNydWRSb3V0ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhZGRBY3Rpb25zU3Vicm91dGVzVG9UYWJsZXZpZXdQYXJlbnQocGFyZW50Um91dGU6IFJvdXRlQnVpbGRlciwgaGFzRGV0YWlsczogYm9vbGVhbiwgaGFzRWRpdDogYm9vbGVhbiwgaGFzQWRkOiBib29sZWFuKSB7XG4gICAgICAgIHBhcmVudFJvdXRlLmFkZENoaWxkKCcnLCBNbmdBY3Rpb25Sb3V0ZUNvbXBvbmVudCk7XG5cbiAgICAgICAgaWYgKGhhc0FkZCkge1xuICAgICAgICAgICAgcGFyZW50Um91dGUuYWRkQ2hpbGQoJ2FkZCcsIE1uZ0FjdGlvblJvdXRlQ29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzRGV0YWlscykge1xuICAgICAgICAgICAgcGFyZW50Um91dGUuYWRkQ2hpbGQoJzppdGVtSWQnLCBNbmdBY3Rpb25Sb3V0ZUNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0VkaXQpIHtcbiAgICAgICAgICAgIHBhcmVudFJvdXRlLmFkZENoaWxkKCc6aXRlbUlkL2VkaXQnLCBNbmdBY3Rpb25Sb3V0ZUNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJvb3Qocm91dGVzQnVpbGRlcjogUm91dGVzQnVpbGRlcik6IHRoaXMge1xuICAgICAgICB0aGlzLnJvb3QgPSByb3V0ZXNCdWlsZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBhcmVudChwYXJlbnQ6IFJvdXRlQnVpbGRlcik6IHRoaXMge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5yb3V0ZVBhdGggPSBSb3V0ZVV0aWwucmVtb3ZlRW1wdHlQYXRoU2VnbWVudHMoWy4uLnRoaXMucGFyZW50LnJvdXRlUGF0aCwgdGhpcy5yb3V0ZS5wYXRoID8/ICcnXSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQnJlYWRjcnVtYihicmVhZGNydW1iOiBCcmVhZGNydW1iVHlwZSk6IHRoaXMge1xuICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSBicmVhZGNydW1iO1xuICAgICAgICB0aGlzLnJvdXRlRGF0YS5icmVhZGNydW1iID0gYnJlYWRjcnVtYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhQYWdlVGl0bGUocGFnZVRpdGxlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgIHRoaXMucm91dGVEYXRhLnBhZ2VUaXRsZSA9IHBhZ2VUaXRsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSZWRpcmVjdFRvKHJlZGlyZWN0VG86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLnJvdXRlLnJlZGlyZWN0VG8gPSByZWRpcmVjdFRvO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBhdGhNYXRjaChwYXRoTWF0Y2g6ICdmdWxsJyB8ICdwcmVmaXgnKTogdGhpcyB7XG4gICAgICAgIHRoaXMucm91dGUucGF0aE1hdGNoID0gcGF0aE1hdGNoO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy53aXRoUGFnZVRpdGxlKHRpdGxlKTtcbiAgICAgICAgdGhpcy53aXRoQnJlYWRjcnVtYih0aXRsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ2FuQWN0aXZhdGUoZGlUb2tlbjogYW55KTogdGhpcyB7XG4gICAgICAgIGlmICghdGhpcy5yb3V0ZS5jYW5BY3RpdmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZS5jYW5BY3RpdmF0ZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm91dGUuY2FuQWN0aXZhdGUucHVzaChkaVRva2VuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDYW5EZWFjdGl2YXRlKGRpVG9rZW46IGFueSk6IHRoaXMge1xuICAgICAgICBpZiAoIXRoaXMucm91dGUuY2FuRGVhY3RpdmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZS5jYW5EZWFjdGl2YXRlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3V0ZS5jYW5EZWFjdGl2YXRlLnB1c2goZGlUb2tlbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUmVzb2x2ZXIoZGlUb2tlbjogYW55LCBuYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvdXRlLnJlc29sdmUpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGUucmVzb2x2ZSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm91dGUucmVzb2x2ZVtuYW1lXSA9IGRpVG9rZW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGF0YShkYXRhOiBNbmdSb3V0ZXJEYXRhKTogdGhpcyB7XG4gICAgICAgIGlmICghZGF0YS5icmVhZGNydW1iKSB7XG4gICAgICAgICAgICBkYXRhLmJyZWFkY3J1bWIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm91dGVEYXRhID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhNbmdNZW51SXRlbShtZW51SXRlbTogTW5nTWVudUl0ZW0pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5tZW51SXRlbSA9IG1lbnVJdGVtO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aE1lbnVJdGVtKGljb24/OiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nLCByb3V0ZXJMaW5rPzogQXJyYXk8c3RyaW5nPik6IHRoaXMge1xuICAgICAgICB0aGlzLm1lbnVJdGVtID0gdGhpcy5jcmVhdGVNZW51SXRlbShpY29uLCBsYWJlbCwgcm91dGVyTGluayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTWVudUl0ZW1DaGlsZChsYWJlbDogc3RyaW5nLCBpY29uPzogc3RyaW5nLCByb3V0ZXJMaW5rPzogQXJyYXk8c3RyaW5nPik6IHRoaXMge1xuICAgICAgICB0aGlzLm1lbnVJdGVtQ2hpbGRyZW4ucHVzaCh0aGlzLmNyZWF0ZU1lbnVJdGVtKGljb24sIGxhYmVsLCByb3V0ZXJMaW5rKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTWVudUl0ZW1DaGlsZHJlbihyb3V0ZXNCdWlsZGVyOiBSb3V0ZXNCdWlsZGVyKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IG1lbnUgPSByb3V0ZXNCdWlsZGVyLmJ1aWxkTWVudSgpO1xuICAgICAgICB0aGlzLmFkanVzdE1lbnVSb3V0ZXJMaW5rc0Zyb21CdWlsZGVyKG1lbnUpO1xuICAgICAgICB0aGlzLm1lbnVJdGVtQ2hpbGRyZW4ucHVzaCguLi5tZW51KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aFBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBBUGVybWlzc2lvbnMpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5yb3V0ZURhdGEucGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICAgICAgdGhpcy53aXRoQ2FuQWN0aXZhdGUoTW5nQXV0aG9yaXphdGlvbkd1YXJkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENoaWxkKHBhdGg6IHN0cmluZywgY29tcG9uZW50OiBUeXBlPGFueT4pOiBSb3V0ZUJ1aWxkZXIge1xuICAgICAgICBjb25zdCBjaGlsZFJvdXRlQnVpbGRlciA9IFJvdXRlQnVpbGRlci5jcmVhdGUocGF0aCwgY29tcG9uZW50KTtcbiAgICAgICAgdGhpcy5hZGRDaGlsZEJ1aWxkZXIoY2hpbGRSb3V0ZUJ1aWxkZXIpO1xuICAgICAgICByZXR1cm4gY2hpbGRSb3V0ZUJ1aWxkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENoaWxkQnVpbGRlcihyb3V0ZUJ1aWxkZXI6IFJvdXRlQnVpbGRlcik6IHRoaXMge1xuICAgICAgICByb3V0ZUJ1aWxkZXIud2l0aFBhcmVudCh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgcm91dGVCdWlsZGVyLndpdGhSb290KHRoaXMucm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKHJvdXRlQnVpbGRlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHVibGljIGFkZFRhYmxldmlld1JvdXRlczxULCBTPihcbiAgICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgICBkZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9yPFQ+LFxuICAgICAgICB0YWJsZXZpZXdEYXRhUHJvdmlkZXI6IElUYWJsZXZpZXdEYXRhUHJvdmlkZXI8VCwgUz4sXG4gICAgICAgIGFjdGlvbnM/OiBBcnJheTxBY3Rpb25EZXNjcmlwdG9yPFQ+PixcbiAgICAgICAgaGFzRGV0YWlscyA9IHRydWUsXG4gICAgICAgIGhhc0VkaXQgPSB0cnVlLFxuICAgICAgICBoYXNBZGQgPSB0cnVlXG4gICAgKTogUm91dGVCdWlsZGVyIHtcbiAgICAgICAgY29uc3Qgcm91dGVCdWlsZGVyID0gUm91dGVCdWlsZGVyLmNyZWF0ZVRhYmxldmlld1JvdXRlcyhwYXRoLCBkZXNjcmlwdG9yLCB0YWJsZXZpZXdEYXRhUHJvdmlkZXIsIGFjdGlvbnMsIGhhc0RldGFpbHMsIGhhc0VkaXQsIGhhc0FkZCk7XG4gICAgICAgIHRoaXMuYWRkQ2hpbGRCdWlsZGVyKHJvdXRlQnVpbGRlcik7XG4gICAgICAgIHJldHVybiByb3V0ZUJ1aWxkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkVGFibGV2aWV3Um91dGVzRnJvbUNvbXBvbmVudChwYXRoOiBzdHJpbmcsIGNvbXBvbmVudDogVHlwZTxhbnk+LCBoYXNEZXRhaWxzID0gdHJ1ZSwgaGFzRWRpdCA9IHRydWUsIGhhc0FkZCA9IHRydWUpOiBSb3V0ZUJ1aWxkZXIge1xuICAgICAgICBjb25zdCByb3V0ZUJ1aWxkZXIgPSBSb3V0ZUJ1aWxkZXIuY3JlYXRlVGFibGV2aWV3Um91dGVzRnJvbUNvbXBvbmVudChwYXRoLCBjb21wb25lbnQsIGhhc0RldGFpbHMsIGhhc0VkaXQsIGhhc0FkZCk7XG4gICAgICAgIHRoaXMuYWRkQ2hpbGRCdWlsZGVyKHJvdXRlQnVpbGRlcik7XG4gICAgICAgIHJldHVybiByb3V0ZUJ1aWxkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHRvUGFyZW50KCk6IFJvdXRlQnVpbGRlciB7XG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyZW50IHdhcyBub3QgcHJvdmlkZWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1Jvb3QoKTogUm91dGVzQnVpbGRlciB7XG4gICAgICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3Qgd2FzIG5vdCBwcm92aWRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogUm91dGVzQnVpbGRlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvUm9vdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBidWlsZFJvdXRlKCk6IFJvdXRlIHtcbiAgICAgICAgY29uc3QgYW5ndWxhclJvdXRlOiBSb3V0ZSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMucm91dGVcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoYW5ndWxhclJvdXRlLmRhdGEpIHtcbiAgICAgICAgICAgIGFuZ3VsYXJSb3V0ZS5kYXRhID0ge1xuICAgICAgICAgICAgICAgIC4uLmFuZ3VsYXJSb3V0ZS5kYXRhLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMucm91dGVEYXRhXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5ndWxhclJvdXRlLmRhdGEgPSB7Li4udGhpcy5yb3V0ZURhdGF9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCh0aGlzLnJvdXRlLmNoaWxkcmVuPy5sZW5ndGggPz8gMCkgPiAwIHx8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gcm91dGUgaGFzIGNoaWxkcmVuXG4gICAgICAgICAgICBhbmd1bGFyUm91dGUuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdXRlLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhbmd1bGFyUm91dGUuY2hpbGRyZW4ucHVzaCguLi50aGlzLnJvdXRlLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGRSb3V0ZSBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXJSb3V0ZS5jaGlsZHJlbi5wdXNoKGNoaWxkUm91dGUuYnVpbGRSb3V0ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yb3V0ZS5jYW5BY3RpdmF0ZSkge1xuICAgICAgICAgICAgYW5ndWxhclJvdXRlLmNhbkFjdGl2YXRlID0gWy4uLnRoaXMucm91dGUuY2FuQWN0aXZhdGVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJvdXRlLmNhbkFjdGl2YXRlQ2hpbGQpIHtcbiAgICAgICAgICAgIGFuZ3VsYXJSb3V0ZS5jYW5BY3RpdmF0ZUNoaWxkID0gWy4uLnRoaXMucm91dGUuY2FuQWN0aXZhdGVDaGlsZF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucm91dGUuY2FuTG9hZCkge1xuICAgICAgICAgICAgYW5ndWxhclJvdXRlLmNhbkxvYWQgPSBbLi4udGhpcy5yb3V0ZS5jYW5Mb2FkXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yb3V0ZS5jYW5EZWFjdGl2YXRlKSB7XG4gICAgICAgICAgICBhbmd1bGFyUm91dGUuY2FuRGVhY3RpdmF0ZSA9IFsuLi50aGlzLnJvdXRlLmNhbkRlYWN0aXZhdGVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJvdXRlLnJlc29sdmUpIHtcbiAgICAgICAgICAgIGFuZ3VsYXJSb3V0ZS5yZXNvbHZlID0gey4uLnRoaXMucm91dGUucmVzb2x2ZX07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYW5ndWxhclJvdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBidWlsZE1lbnUoKTogQXJyYXk8TW5nTWVudUl0ZW0+IHtcbiAgICAgICAgY29uc3QgbWVudUl0ZW1CdWlsZDogTW5nTWVudUl0ZW0gfCBudWxsID0gdGhpcy5tZW51SXRlbSA/IHsuLi50aGlzLm1lbnVJdGVtfSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJvdXRlQ2hpbGRyZW5NZW51SXRlbXM6IEFycmF5PE1uZ01lbnVJdGVtPiA9IHRoaXMuY2hpbGRyZW4uZmxhdE1hcChjaGlsZCA9PiBjaGlsZC5idWlsZE1lbnUoKSk7XG4gICAgICAgIGNvbnN0IG1lbnVJdGVtQ2hpbGRyZW46IEFycmF5PE1uZ01lbnVJdGVtPiA9IFtdO1xuICAgICAgICBjb25zdCBtZW51SXRlbUNoaWxkcmVuQnVpbGQ6IEFycmF5PE1uZ01lbnVJdGVtPiA9IFtdO1xuXG4gICAgICAgIGlmIChtZW51SXRlbUJ1aWxkPy5pdGVtcykge1xuICAgICAgICAgICAgbWVudUl0ZW1DaGlsZHJlbkJ1aWxkLnB1c2goLi4ubWVudUl0ZW1CdWlsZC5pdGVtcyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IG1lbnVJdGVtQ2hpbGQgb2YgdGhpcy5tZW51SXRlbUNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCBmaW5hbE1lbnVJdGVtQ2hpbGQ6IE1uZ01lbnVJdGVtID0gey4uLm1lbnVJdGVtQ2hpbGR9O1xuICAgICAgICAgICAgaWYgKCFmaW5hbE1lbnVJdGVtQ2hpbGQucm91dGVyTGluaykge1xuICAgICAgICAgICAgICAgIGZpbmFsTWVudUl0ZW1DaGlsZC5yb3V0ZXJMaW5rID0gdGhpcy5yb3V0ZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZpbmFsTWVudUl0ZW1DaGlsZC5yb3V0ZXJMaW5rID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGZpbmFsTWVudUl0ZW1DaGlsZC5yb3V0ZXJMaW5rID0gW2ZpbmFsTWVudUl0ZW1DaGlsZC5yb3V0ZXJMaW5rXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsTWVudUl0ZW1DaGlsZC5yb3V0ZXJMaW5rID0gUm91dGVVdGlsLnJlbW92ZUVtcHR5UGF0aFNlZ21lbnRzKGZpbmFsTWVudUl0ZW1DaGlsZC5yb3V0ZXJMaW5rKTtcbiAgICAgICAgICAgIG1lbnVJdGVtQ2hpbGRyZW4ucHVzaChmaW5hbE1lbnVJdGVtQ2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVudUl0ZW1DaGlsZHJlbkJ1aWxkLnB1c2goLi4ubWVudUl0ZW1DaGlsZHJlbiwgLi4ucm91dGVDaGlsZHJlbk1lbnVJdGVtcyk7XG5cbiAgICAgICAgaWYgKCFtZW51SXRlbUJ1aWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVudUl0ZW1DaGlsZHJlbkJ1aWxkO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVudUl0ZW1CdWlsZC5sYWJlbCA9IG1lbnVJdGVtQnVpbGQubGFiZWwgPz8gdGhpcy5wYWdlVGl0bGU7XG4gICAgICAgIGlmICh0eXBlb2YgbWVudUl0ZW1CdWlsZC5yb3V0ZXJMaW5rID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbWVudUl0ZW1CdWlsZC5yb3V0ZXJMaW5rID0gW21lbnVJdGVtQnVpbGQucm91dGVyTGlua107XG4gICAgICAgIH1cbiAgICAgICAgbWVudUl0ZW1CdWlsZC5yb3V0ZXJMaW5rID0gUm91dGVVdGlsLnJlbW92ZUVtcHR5UGF0aFNlZ21lbnRzKG1lbnVJdGVtQnVpbGQucm91dGVyTGluayA/PyB0aGlzLnJvdXRlUGF0aCk7XG4gICAgICAgIGlmIChtZW51SXRlbUNoaWxkcmVuQnVpbGQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbWVudUl0ZW1CdWlsZC5pdGVtcyA9IG1lbnVJdGVtQ2hpbGRyZW5CdWlsZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWVudUl0ZW1CdWlsZC5ndWFyZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGd1YXJkcyA9IHRoaXMuZmluZE1lbnVJdGVtR3VhcmRzKCk7XG4gICAgICAgICAgICBpZiAoZ3VhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBtZW51SXRlbUJ1aWxkLmd1YXJkcyA9IGd1YXJkcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWVudUl0ZW1CdWlsZC5wZXJtaXNzaW9ucyAmJiB0aGlzLnJvdXRlRGF0YS5wZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgbWVudUl0ZW1CdWlsZC5wZXJtaXNzaW9ucyA9IHRoaXMucm91dGVEYXRhLnBlcm1pc3Npb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFttZW51SXRlbUJ1aWxkXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU1lbnVJdGVtKGljb24/OiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nLCByb3V0ZXJMaW5rPzogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBjb25zdCBtZW51SXRlbTogTW5nTWVudUl0ZW0gPSB7fTtcbiAgICAgICAgaWYgKGljb24pIHtcbiAgICAgICAgICAgIG1lbnVJdGVtLmljb24gPSBpY29uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgICAgbWVudUl0ZW0ubGFiZWwgPSBsYWJlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm91dGVyTGluaykge1xuICAgICAgICAgICAgbWVudUl0ZW0ucm91dGVyTGluayA9IHJvdXRlckxpbms7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lbnVJdGVtO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRqdXN0TWVudVJvdXRlckxpbmtzRnJvbUJ1aWxkZXIobWVudUl0ZW1zOiBBcnJheTxNbmdNZW51SXRlbT4pIHtcbiAgICAgICAgZm9yIChjb25zdCBtZW51SXRlbSBvZiBtZW51SXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChtZW51SXRlbS5yb3V0ZXJMaW5rKSB7XG4gICAgICAgICAgICAgICAgbWVudUl0ZW0ucm91dGVyTGluayA9IFJvdXRlVXRpbC5hcHBlbmRQYXRoVG9CYXNlUGF0aCh0aGlzLnJvdXRlUGF0aCwgdHlwZW9mIG1lbnVJdGVtLnJvdXRlckxpbmsgPT09ICdzdHJpbmcnID8gW21lbnVJdGVtLnJvdXRlckxpbmtdIDogbWVudUl0ZW0ucm91dGVyTGluayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtZW51SXRlbS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkanVzdE1lbnVSb3V0ZXJMaW5rc0Zyb21CdWlsZGVyKG1lbnVJdGVtLml0ZW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZmluZE1lbnVJdGVtR3VhcmRzKCk6IEFycmF5PGFueT4ge1xuICAgICAgICBjb25zdCBndWFyZHM6IEFycmF5PGFueT4gPSBbXTtcbiAgICAgICAgaWYgKHRoaXMucm91dGUuY2FuQWN0aXZhdGU/Lmxlbmd0aCkge1xuICAgICAgICAgICAgZ3VhcmRzLnB1c2goLi4udGhpcy5yb3V0ZS5jYW5BY3RpdmF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgcGFyZW50IGd1YXJkcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBkZWNpc2lvbiB0byBoaWRlIG1lbnUgaXRlbSFcbiAgICAgICAgICAgIC8vIFNvbWUgcGFyZW50IHJvdXRlcyBtaWdodCBoYXZlIGd1YXJkcywgYnV0IG5vIG1lbnUgaXRlbXMsIHNvIHRoaXMgZ3VhcmRzIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50IGhlcmUsXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHBhcmVudCBtZW51IGl0ZW0gdG8gaGlkZS5cbiAgICAgICAgICAgIHRoaXMucGFyZW50LmZpbmRNZW51SXRlbUd1YXJkcygpLmZvckVhY2goZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGd1YXJkcy5pbmRleE9mKGcpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBndWFyZHMucHVzaChnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ3VhcmRzO1xuICAgIH1cbn1cbiJdfQ==
1
+ import { MngMainLayoutComponent } from '../components/layout';
2
+ import { MngAuthorizationGuard } from '../security';
3
+ import { RouteUtil } from '../utils/route.util';
4
+ export class RouteBuilder {
5
+ constructor(route) {
6
+ this.routePath = [];
7
+ this.routeData = { breadcrumb: null };
8
+ this.children = [];
9
+ this.menuItemChildren = [];
10
+ this.route = route;
11
+ if (this.route.path && this.route.path.length > 0) {
12
+ this.routePath = [this.route.path];
13
+ }
14
+ }
15
+ static create(path, component) {
16
+ return new RouteBuilder({
17
+ path: path,
18
+ component: component
19
+ });
20
+ }
21
+ static createRedirect(path, redirectTo, pathMatch = 'prefix') {
22
+ return new RouteBuilder({
23
+ path: path,
24
+ redirectTo: redirectTo,
25
+ pathMatch: pathMatch
26
+ });
27
+ }
28
+ /**
29
+ * @deprecated This method is deprecated and should not be used.
30
+ * Use method {@link createLazyRouteComponent} or {@link createLazyRouteModule} instead.
31
+ */
32
+ static createLazyRoute(path, loadChildren, canLoad) {
33
+ const route = { path: path, loadChildren: loadChildren };
34
+ if (canLoad?.length) {
35
+ route.canLoad = canLoad;
36
+ }
37
+ return new RouteBuilder(route);
38
+ }
39
+ static createLazyRouteModule(path, loadChildren, canMatch) {
40
+ const route = { path: path, loadChildren: loadChildren };
41
+ if (canMatch?.length) {
42
+ route.canMatch = canMatch;
43
+ }
44
+ return new RouteBuilder(route);
45
+ }
46
+ static createLazyRouteComponent(path, loadComponent, canMatch) {
47
+ const route = { path: path, loadComponent: loadComponent };
48
+ if (canMatch?.length) {
49
+ route.canMatch = canMatch;
50
+ }
51
+ return new RouteBuilder(route);
52
+ }
53
+ static createFromRoute(route) {
54
+ return new RouteBuilder(route);
55
+ }
56
+ static createLayoutRoute(path, layoutComponent = MngMainLayoutComponent, topbarComponent, breadcrumbComponent, menuComponent, footerComponent) {
57
+ const layoutRoute = RouteBuilder.create(path, layoutComponent);
58
+ if (topbarComponent || breadcrumbComponent || menuComponent || footerComponent) {
59
+ const routeData = {};
60
+ if (topbarComponent) {
61
+ routeData.topbarComponent = topbarComponent;
62
+ }
63
+ if (breadcrumbComponent) {
64
+ routeData.breadcrumbComponent = breadcrumbComponent;
65
+ }
66
+ if (menuComponent) {
67
+ routeData.menuComponent = menuComponent;
68
+ }
69
+ if (footerComponent) {
70
+ routeData.footerComponent = footerComponent;
71
+ }
72
+ layoutRoute.withData(routeData);
73
+ }
74
+ return layoutRoute;
75
+ }
76
+ static createTableview(builder) {
77
+ return builder.toRouteBuilder();
78
+ }
79
+ withRoot(routesBuilder) {
80
+ this.root = routesBuilder;
81
+ return this;
82
+ }
83
+ withParent(parent) {
84
+ this.parent = parent;
85
+ this.routePath = RouteUtil.removeEmptyPathSegments([...this.parent.routePath, this.route.path ?? '']);
86
+ return this;
87
+ }
88
+ withBreadcrumb(breadcrumb) {
89
+ this.breadcrumb = breadcrumb;
90
+ this.routeData.breadcrumb = breadcrumb;
91
+ return this;
92
+ }
93
+ withPageTitle(pageTitle) {
94
+ this.pageTitle = pageTitle;
95
+ this.routeData.pageTitle = pageTitle;
96
+ return this;
97
+ }
98
+ withRedirectTo(redirectTo) {
99
+ this.route.redirectTo = redirectTo;
100
+ return this;
101
+ }
102
+ withPathMatch(pathMatch) {
103
+ this.route.pathMatch = pathMatch;
104
+ return this;
105
+ }
106
+ withTitle(title) {
107
+ this.withPageTitle(title);
108
+ this.withBreadcrumb(title);
109
+ return this;
110
+ }
111
+ withCanActivate(diToken) {
112
+ if (!this.route.canActivate) {
113
+ this.route.canActivate = [];
114
+ }
115
+ this.route.canActivate.push(diToken);
116
+ return this;
117
+ }
118
+ withCanDeactivate(diToken) {
119
+ if (!this.route.canDeactivate) {
120
+ this.route.canDeactivate = [];
121
+ }
122
+ this.route.canDeactivate.push(diToken);
123
+ return this;
124
+ }
125
+ withResolver(diToken, name) {
126
+ if (!this.route.resolve) {
127
+ this.route.resolve = {};
128
+ }
129
+ this.route.resolve[name] = diToken;
130
+ return this;
131
+ }
132
+ withData(data) {
133
+ if (!data.breadcrumb) {
134
+ data.breadcrumb = null;
135
+ }
136
+ this.routeData = data;
137
+ return this;
138
+ }
139
+ withMngMenuItem(menuItem) {
140
+ this.menuItem = menuItem;
141
+ return this;
142
+ }
143
+ withMenuItem(icon, label, routerLink) {
144
+ this.menuItem = this.createMenuItem(icon, label, routerLink);
145
+ return this;
146
+ }
147
+ withMenuItemChild(label, icon, routerLink) {
148
+ this.menuItemChildren.push(this.createMenuItem(icon, label, routerLink));
149
+ return this;
150
+ }
151
+ withMngMenuItemChild(menuItem) {
152
+ this.menuItemChildren.push(menuItem);
153
+ return this;
154
+ }
155
+ withMenuItemLazyChildren() {
156
+ if (this.menuItem) {
157
+ this.menuItem.lazyChildren = true;
158
+ }
159
+ return this;
160
+ }
161
+ withPermissions(permissions) {
162
+ this.routeData.permissions = permissions;
163
+ this.withCanActivate(MngAuthorizationGuard);
164
+ return this;
165
+ }
166
+ addChild(path, component) {
167
+ const childRouteBuilder = RouteBuilder.create(path, component);
168
+ this.addChildBuilder(childRouteBuilder);
169
+ return childRouteBuilder;
170
+ }
171
+ addChildBuilder(routeBuilder) {
172
+ routeBuilder.withParent(this);
173
+ if (this.root) {
174
+ routeBuilder.withRoot(this.root);
175
+ }
176
+ this.children.push(routeBuilder);
177
+ return this;
178
+ }
179
+ toParent() {
180
+ if (!this.parent) {
181
+ throw new Error('Parent was not provided.');
182
+ }
183
+ return this.parent;
184
+ }
185
+ toRoot() {
186
+ if (!this.root) {
187
+ throw new Error('Root was not provided.');
188
+ }
189
+ return this.root;
190
+ }
191
+ finish() {
192
+ return this.toRoot();
193
+ }
194
+ buildRoute() {
195
+ const angularRoute = {
196
+ ...this.route
197
+ };
198
+ if (angularRoute.data) {
199
+ angularRoute.data = {
200
+ ...angularRoute.data,
201
+ ...this.routeData
202
+ };
203
+ }
204
+ else {
205
+ angularRoute.data = { ...this.routeData };
206
+ }
207
+ const menu = this.buildMenu();
208
+ if (menu.length > 0) {
209
+ angularRoute.data.menuItems = menu;
210
+ }
211
+ if ((this.route.children?.length ?? 0) > 0 || this.children.length > 0) {
212
+ // route has children
213
+ angularRoute.children = [];
214
+ if (this.route.children?.length) {
215
+ angularRoute.children.push(...this.route.children);
216
+ }
217
+ if (this.children.length) {
218
+ for (const childRoute of this.children) {
219
+ angularRoute.children.push(childRoute.buildRoute());
220
+ }
221
+ }
222
+ }
223
+ if (this.route.canActivate) {
224
+ angularRoute.canActivate = [...this.route.canActivate];
225
+ }
226
+ if (this.route.canActivateChild) {
227
+ angularRoute.canActivateChild = [...this.route.canActivateChild];
228
+ }
229
+ if (this.route.canLoad) {
230
+ angularRoute.canLoad = [...this.route.canLoad];
231
+ }
232
+ if (this.route.canDeactivate) {
233
+ angularRoute.canDeactivate = [...this.route.canDeactivate];
234
+ }
235
+ if (this.route.resolve) {
236
+ angularRoute.resolve = { ...this.route.resolve };
237
+ }
238
+ return angularRoute;
239
+ }
240
+ buildMenu() {
241
+ const menuItemBuild = this.menuItem ? { ...this.menuItem } : null;
242
+ const routeChildrenMenuItems = this.children.flatMap(child => child.buildMenu());
243
+ const menuItemChildren = [];
244
+ const menuItemChildrenBuild = [];
245
+ if (menuItemBuild?.items) {
246
+ menuItemChildrenBuild.push(...menuItemBuild.items);
247
+ }
248
+ for (const menuItemChild of this.menuItemChildren) {
249
+ const finalMenuItemChild = { ...menuItemChild };
250
+ if (!finalMenuItemChild.routerLink) {
251
+ finalMenuItemChild.routerLink = this.routePath;
252
+ }
253
+ if (typeof finalMenuItemChild.routerLink === 'string') {
254
+ finalMenuItemChild.routerLink = [finalMenuItemChild.routerLink];
255
+ }
256
+ finalMenuItemChild.routerLink = RouteUtil.removeEmptyPathSegments(finalMenuItemChild.routerLink);
257
+ menuItemChildren.push(finalMenuItemChild);
258
+ }
259
+ menuItemChildrenBuild.push(...menuItemChildren, ...routeChildrenMenuItems);
260
+ if (!menuItemBuild) {
261
+ return menuItemChildrenBuild;
262
+ }
263
+ menuItemBuild.label = menuItemBuild.label ?? this.pageTitle;
264
+ if (typeof menuItemBuild.routerLink === 'string') {
265
+ menuItemBuild.routerLink = [menuItemBuild.routerLink];
266
+ }
267
+ menuItemBuild.routerLink = RouteUtil.removeEmptyPathSegments(menuItemBuild.routerLink ?? this.routePath);
268
+ if (menuItemChildrenBuild.length > 0) {
269
+ menuItemBuild.items = menuItemChildrenBuild;
270
+ }
271
+ if (!menuItemBuild.guards) {
272
+ const guards = this.findMenuItemGuards();
273
+ if (guards.length > 0) {
274
+ menuItemBuild.guards = guards;
275
+ }
276
+ }
277
+ if (!menuItemBuild.permissions && this.routeData.permissions) {
278
+ menuItemBuild.permissions = this.routeData.permissions;
279
+ }
280
+ return [menuItemBuild];
281
+ }
282
+ createMenuItem(icon, label, routerLink) {
283
+ const menuItem = {};
284
+ if (icon) {
285
+ menuItem.icon = icon;
286
+ }
287
+ if (label) {
288
+ menuItem.label = label;
289
+ }
290
+ if (routerLink) {
291
+ menuItem.routerLink = routerLink;
292
+ }
293
+ return menuItem;
294
+ }
295
+ findMenuItemGuards() {
296
+ const guards = [];
297
+ if (this.route.canActivate?.length) {
298
+ guards.push(...this.route.canActivate);
299
+ }
300
+ if (this.parent) {
301
+ // Check for parent guards that should be included in decision to hide menu item!
302
+ // Some parent routes might have guards, but no menu items, so this guards must be taken into account here,
303
+ // because there is no parent menu item to hide.
304
+ this.parent.findMenuItemGuards().forEach(g => {
305
+ if (guards.indexOf(g) < 0) {
306
+ guards.push(g);
307
+ }
308
+ });
309
+ }
310
+ return guards;
311
+ }
312
+ }
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcm91dGVyL3JvdXRlLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHNUQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRWxELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUs5QyxNQUFNLE9BQU8sWUFBWTtJQWdCckIsWUFBb0IsS0FBWTtRQWR4QixjQUFTLEdBQWtCLEVBQUUsQ0FBQztRQUM5QixjQUFTLEdBQWtCLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBQyxDQUFDO1FBRzlDLGFBQVEsR0FBd0IsRUFBRSxDQUFDO1FBR25DLHFCQUFnQixHQUF1QixFQUFFLENBQUM7UUFROUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9DLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RDO0lBQ0wsQ0FBQztJQUVNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBWSxFQUFFLFNBQW9CO1FBQ25ELE9BQU8sSUFBSSxZQUFZLENBQUM7WUFDcEIsSUFBSSxFQUFFLElBQUk7WUFDVixTQUFTLEVBQUUsU0FBUztTQUN2QixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFZLEVBQUUsVUFBa0IsRUFBRSxZQUErQixRQUFRO1FBQ2xHLE9BQU8sSUFBSSxZQUFZLENBQUM7WUFDcEIsSUFBSSxFQUFFLElBQUk7WUFDVixVQUFVLEVBQUUsVUFB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QyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxVQUFVLEVBQUU7WUFDWixRQUFRLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztTQUNwQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxrQkFBa0I7UUFDdEIsTUFBTSxNQUFNLEdBQWUsRUFBRSxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFO1lBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2IsaUZBQWlGO1lBQ2pGLDJHQUEyRztZQUMzRyxnREFBZ0Q7WUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDekMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbEI7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtUeXBlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RGVmYXVsdEV4cG9ydCwgTG9hZENoaWxkcmVuLCBSb3V0ZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtNbmdNYWluTGF5b3V0Q29tcG9uZW50fSBmcm9tICcuLi9jb21wb25lbnRzL2xheW91dCc7XG5pbXBvcnQge0FNbmdUYWJsZXZpZXdSb3V0ZUNvbXBvbmVudH0gZnJvbSAnLi4vY29tcG9uZW50cy90YWJsZXZpZXcnO1xuaW1wb3J0IHtNbmdNZW51SXRlbX0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7TW5nQXV0aG9yaXphdGlvbkd1YXJkfSBmcm9tICcuLi9zZWN1cml0eSc7XG5pbXBvcnQge0FQZXJtaXNzaW9uc30gZnJvbSAnLi4vc2VjdXJpdHkvbW9kZWwnO1xuaW1wb3J0IHtSb3V0ZVV0aWx9IGZyb20gJy4uL3V0aWxzL3JvdXRlLnV0aWwnO1xuaW1wb3J0IHtCcmVhZGNydW1iVHlwZSwgTW5nUm91dGVyRGF0YX0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHtSb3V0ZXNCdWlsZGVyfSBmcm9tICcuL3JvdXRlcy1idWlsZGVyJztcbmltcG9ydCB7VGFibGV2aWV3Um91dGVCdWlsZGVyfSBmcm9tICcuL3RhYmxldmlldy1yb3V0ZS1idWlsZGVyJztcblxuZXhwb3J0IGNsYXNzIFJvdXRlQnVpbGRlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZTogUm91dGU7XG4gICAgcHJpdmF0ZSByb3V0ZVBhdGg6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBwcml2YXRlIHJvdXRlRGF0YTogTW5nUm91dGVyRGF0YSA9IHticmVhZGNydW1iOiBudWxsfTtcbiAgICBwcml2YXRlIHJvb3Q/OiBSb3V0ZXNCdWlsZGVyO1xuICAgIHByaXZhdGUgcGFyZW50PzogUm91dGVCdWlsZGVyO1xuICAgIHByaXZhdGUgY2hpbGRyZW46IEFycmF5PFJvdXRlQnVpbGRlcj4gPSBbXTtcblxuICAgIHByaXZhdGUgbWVudUl0ZW0/OiBNbmdNZW51SXRlbTtcbiAgICBwcml2YXRlIG1lbnVJdGVtQ2hpbGRyZW46IEFycmF5PE1uZ01lbnVJdGVtPiA9IFtdO1xuXG4gICAgcHJpdmF0ZSBicmVhZGNydW1iPzogQnJlYWRjcnVtYlR5cGU7XG4gICAgcHJpdmF0ZSBwYWdlVGl0bGU/OiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIHBlcm1pc3Npb25zPzogQVBlcm1pc3Npb25zO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihyb3V0ZTogUm91dGUpIHtcbiAgICAgICAgdGhpcy5yb3V0ZSA9IHJvdXRlO1xuICAgICAgICBpZiAodGhpcy5yb3V0ZS5wYXRoICYmIHRoaXMucm91dGUucGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlUGF0aCA9IFt0aGlzLnJvdXRlLnBhdGhdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUocGF0aDogc3RyaW5nLCBjb21wb25lbnQ6IFR5cGU8YW55Pik6IFJvdXRlQnVpbGRlciB7XG4gICAgICAgIHJldHVybiBuZXcgUm91dGVCdWlsZGVyKHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJlZGlyZWN0KHBhdGg6IHN0cmluZywgcmVkaXJlY3RUbzogc3RyaW5nLCBwYXRoTWF0Y2g6ICdmdWxsJyB8ICdwcmVmaXgnID0gJ3ByZWZpeCcpOiBSb3V0ZUJ1aWxkZXIge1xuICAgICAgICByZXR1cm4gbmV3IFJvdXRlQnVpbGRlcih7XG4gICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgcmVkaXJlY3RUbzogcmVkaXJlY3RUbyxcbiAgICAgICAgICAgIHBhdGhNYXRjaDogcGF0aE1hdGNoXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC5cbiAgICAgKiBVc2UgbWV0aG9kIHtAbGluayBjcmVhdGVMYXp5Um91dGVDb21wb25lbnR9IG9yIHtAbGluayBjcmVhdGVMYXp5Um91dGVNb2R1bGV9IGluc3RlYWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVMYXp5Um91dGUocGF0aDogc3RyaW5nLCBsb2FkQ2hpbGRyZW46IExvYWRDaGlsZHJlbiwgY2FuTG9hZD86IEFycmF5PGFueT4pOiBSb3V0ZUJ1aWxkZXIge1xuICAgICAgICBjb25zdCByb3V0ZTogUm91dGUgPSB7cGF0aDogcGF0aCwgbG9hZENoaWxkcmVuOiBsb2FkQ2hpbGRyZW59O1xuICAgICAgICBpZiAoY2FuTG9hZD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByb3V0ZS5jYW5Mb2FkID0gY2FuTG9hZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJvdXRlQnVpbGRlcihyb3V0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVMYXp5Um91dGVNb2R1bGUocGF0aDogc3RyaW5nLCBsb2FkQ2hpbGRyZW46IExvYWRDaGlsZHJlbiwgY2FuTWF0Y2g/OiBBcnJheTxhbnk+KTogUm91dGVCdWlsZGVyIHtcbiAgICAgICAgY29uc3Qgcm91dGU6IFJvdXRlID0ge3BhdGg6IHBhdGgsIGxvYWRDaGlsZHJlbjogbG9hZENoaWxkcmVufTtcbiAgICAgICAgaWYgKGNhbk1hdGNoPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJvdXRlLmNhbk1hdGNoID0gY2FuTWF0Y2g7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSb3V0ZUJ1aWxkZXIocm91dGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlTGF6eVJvdXRlQ29tcG9uZW50KFxuICAgICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICAgIGxvYWRDb21wb25lbnQ6ICgpID0+IFR5cGU8dW5rbm93bj4gfCBPYnNlcnZhYmxlPFR5cGU8dW5rbm93bj4gfCBEZWZhdWx0RXhwb3J0PFR5cGU8dW5rbm93bj4+PiB8IFByb21pc2U8VHlwZTx1bmtub3duPiB8IERlZmF1bHRFeHBvcnQ8VHlwZTx1bmtub3duPj4+LFxuICAgICAgICBjYW5NYXRjaD86IEFycmF5PGFueT5cbiAgICApOiBSb3V0ZUJ1aWxkZXIge1xuICAgICAgICBjb25zdCByb3V0ZTogUm91dGUgPSB7cGF0aDogcGF0aCwgbG9hZENvbXBvbmVudDogbG9hZENvbXBvbmVudH07XG4gICAgICAgIGlmIChjYW5NYXRjaD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByb3V0ZS5jYW5NYXRjaCA9IGNhbk1hdGNoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUm91dGVCdWlsZGVyKHJvdXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUZyb21Sb3V0ZShyb3V0ZTogUm91dGUpOiBSb3V0ZUJ1aWxkZXIge1xuICAgICAgICByZXR1cm4gbmV3IFJvdXRlQnVpbGRlcihyb3V0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVMYXlvdXRSb3V0ZShcbiAgICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgICBsYXlvdXRDb21wb25lbnQgPSBNbmdNYWluTGF5b3V0Q29tcG9uZW50LFxuICAgICAgICB0b3BiYXJDb21wb25lbnQ/OiBUeXBlPGFueT4sXG4gICAgICAgIGJyZWFkY3J1bWJDb21wb25lbnQ/OiBUeXBlPGFueT4sXG4gICAgICAgIG1lbnVDb21wb25lbnQ/OiBUeXBlPGFueT4sXG4gICAgICAgIGZvb3RlckNvbXBvbmVudD86IFR5cGU8YW55PlxuICAgICk6IFJvdXRlQnVpbGRlciB7XG4gICAgICAgIGNvbnN0IGxheW91dFJvdXRlID0gUm91dGVCdWlsZGVyLmNyZWF0ZShwYXRoLCBsYXlvdXRDb21wb25lbnQpO1xuICAgICAgICBpZiAodG9wYmFyQ29tcG9uZW50IHx8IGJyZWFkY3J1bWJDb21wb25lbnQgfHwgbWVudUNvbXBvbmVudCB8fCBmb290ZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlRGF0YTogTW5nUm91dGVyRGF0YSA9IHt9O1xuICAgICAgICAgICAgaWYgKHRvcGJhckNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIHJvdXRlRGF0YS50b3BiYXJDb21wb25lbnQgPSB0b3BiYXJDb21wb25lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYnJlYWRjcnVtYkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIHJvdXRlRGF0YS5icmVhZGNydW1iQ29tcG9uZW50ID0gYnJlYWRjcnVtYkNvbXBvbmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZW51Q29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgcm91dGVEYXRhLm1lbnVDb21wb25lbnQgPSBtZW51Q29tcG9uZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvb3RlckNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIHJvdXRlRGF0YS5mb290ZXJDb21wb25lbnQgPSBmb290ZXJDb21wb25lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXlvdXRSb3V0ZS53aXRoRGF0YShyb3V0ZURhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXlvdXRSb3V0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVRhYmxldmlldzxDIGV4dGVuZHMgQU1uZ1RhYmxldmlld1JvdXRlQ29tcG9uZW50PGFueSwgYW55Pj4oYnVpbGRlcjogVGFibGV2aWV3Um91dGVCdWlsZGVyPEM+KTogUm91dGVCdWlsZGVyIHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9Sb3V0ZUJ1aWxkZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJvb3Qocm91dGVzQnVpbGRlcjogUm91dGVzQnVpbGRlcik6IHRoaXMge1xuICAgICAgICB0aGlzLnJvb3QgPSByb3V0ZXNCdWlsZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBhcmVudChwYXJlbnQ6IFJvdXRlQnVpbGRlcik6IHRoaXMge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5yb3V0ZVBhdGggPSBSb3V0ZVV0aWwucmVtb3ZlRW1wdHlQYXRoU2VnbWVudHMoWy4uLnRoaXMucGFyZW50LnJvdXRlUGF0aCwgdGhpcy5yb3V0ZS5wYXRoID8/ICcnXSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQnJlYWRjcnVtYihicmVhZGNydW1iOiBCcmVhZGNydW1iVHlwZSk6IHRoaXMge1xuICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSBicmVhZGNydW1iO1xuICAgICAgICB0aGlzLnJvdXRlRGF0YS5icmVhZGNydW1iID0gYnJlYWRjcnVtYjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhQYWdlVGl0bGUocGFnZVRpdGxlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgIHRoaXMucm91dGVEYXRhLnBhZ2VUaXRsZSA9IHBhZ2VUaXRsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSZWRpcmVjdFRvKHJlZGlyZWN0VG86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLnJvdXRlLnJlZGlyZWN0VG8gPSByZWRpcmVjdFRvO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBhdGhNYXRjaChwYXRoTWF0Y2g6ICdmdWxsJyB8ICdwcmVmaXgnKTogdGhpcyB7XG4gICAgICAgIHRoaXMucm91dGUucGF0aE1hdGNoID0gcGF0aE1hdGNoO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy53aXRoUGFnZVRpdGxlKHRpdGxlKTtcbiAgICAgICAgdGhpcy53aXRoQnJlYWRjcnVtYih0aXRsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ2FuQWN0aXZhdGUoZGlUb2tlbjogYW55KTogdGhpcyB7XG4gICAgICAgIGlmICghdGhpcy5yb3V0ZS5jYW5BY3RpdmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZS5jYW5BY3RpdmF0ZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm91dGUuY2FuQWN0aXZhdGUucHVzaChkaVRva2VuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDYW5EZWFjdGl2YXRlKGRpVG9rZW46IGFueSk6IHRoaXMge1xuICAgICAgICBpZiAoIXRoaXMucm91dGUuY2FuRGVhY3RpdmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZS5jYW5EZWFjdGl2YXRlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3V0ZS5jYW5EZWFjdGl2YXRlLnB1c2goZGlUb2tlbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUmVzb2x2ZXIoZGlUb2tlbjogYW55LCBuYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvdXRlLnJlc29sdmUpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGUucmVzb2x2ZSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm91dGUucmVzb2x2ZVtuYW1lXSA9IGRpVG9rZW47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGF0YShkYXRhOiBNbmdSb3V0ZXJEYXRhKTogdGhpcyB7XG4gICAgICAgIGlmICghZGF0YS5icmVhZGNydW1iKSB7XG4gICAgICAgICAgICBkYXRhLmJyZWFkY3J1bWIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm91dGVEYXRhID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhNbmdNZW51SXRlbShtZW51SXRlbTogTW5nTWVudUl0ZW0pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5tZW51SXRlbSA9IG1lbnVJdGVtO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aE1lbnVJdGVtKGljb24/OiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nLCByb3V0ZXJMaW5rPzogQXJyYXk8c3RyaW5nPik6IHRoaXMge1xuICAgICAgICB0aGlzLm1lbnVJdGVtID0gdGhpcy5jcmVhdGVNZW51SXRlbShpY29uLCBsYWJlbCwgcm91dGVyTGluayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTWVudUl0ZW1DaGlsZChsYWJlbDogc3RyaW5nLCBpY29uPzogc3RyaW5nLCByb3V0ZXJMaW5rPzogQXJyYXk8c3RyaW5nPik6IHRoaXMge1xuICAgICAgICB0aGlzLm1lbnVJdGVtQ2hpbGRyZW4ucHVzaCh0aGlzLmNyZWF0ZU1lbnVJdGVtKGljb24sIGxhYmVsLCByb3V0ZXJMaW5rKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTW5nTWVudUl0ZW1DaGlsZChtZW51SXRlbTogTW5nTWVudUl0ZW0pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5tZW51SXRlbUNoaWxkcmVuLnB1c2gobWVudUl0ZW0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aE1lbnVJdGVtTGF6eUNoaWxkcmVuKCk6IHRoaXMge1xuICAgICAgICBpZiAodGhpcy5tZW51SXRlbSkge1xuICAgICAgICAgICAgdGhpcy5tZW51SXRlbS5sYXp5Q2hpbGRyZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUGVybWlzc2lvbnMocGVybWlzc2lvbnM6IEFQZXJtaXNzaW9ucyk6IHRoaXMge1xuICAgICAgICB0aGlzLnJvdXRlRGF0YS5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xuICAgICAgICB0aGlzLndpdGhDYW5BY3RpdmF0ZShNbmdBdXRob3JpemF0aW9uR3VhcmQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ2hpbGQocGF0aDogc3RyaW5nLCBjb21wb25lbnQ6IFR5cGU8YW55Pik6IFJvdXRlQnVpbGRlciB7XG4gICAgICAgIGNvbnN0IGNoaWxkUm91dGVCdWlsZGVyID0gUm91dGVCdWlsZGVyLmNyZWF0ZShwYXRoLCBjb21wb25lbnQpO1xuICAgICAgICB0aGlzLmFkZENoaWxkQnVpbGRlcihjaGlsZFJvdXRlQnVpbGRlcik7XG4gICAgICAgIHJldHVybiBjaGlsZFJvdXRlQnVpbGRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ2hpbGRCdWlsZGVyKHJvdXRlQnVpbGRlcjogUm91dGVCdWlsZGVyKTogdGhpcyB7XG4gICAgICAgIHJvdXRlQnVpbGRlci53aXRoUGFyZW50KHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICByb3V0ZUJ1aWxkZXIud2l0aFJvb3QodGhpcy5yb290KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2gocm91dGVCdWlsZGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHRvUGFyZW50KCk6IFJvdXRlQnVpbGRlciB7XG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyZW50IHdhcyBub3QgcHJvdmlkZWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1Jvb3QoKTogUm91dGVzQnVpbGRlciB7XG4gICAgICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3Qgd2FzIG5vdCBwcm92aWRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb290O1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogUm91dGVzQnVpbGRlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvUm9vdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBidWlsZFJvdXRlKCk6IFJvdXRlIHtcbiAgICAgICAgY29uc3QgYW5ndWxhclJvdXRlOiBSb3V0ZSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMucm91dGVcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoYW5ndWxhclJvdXRlLmRhdGEpIHtcbiAgICAgICAgICAgIGFuZ3VsYXJSb3V0ZS5kYXRhID0ge1xuICAgICAgICAgICAgICAgIC4uLmFuZ3VsYXJSb3V0ZS5kYXRhLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMucm91dGVEYXRhXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5ndWxhclJvdXRlLmRhdGEgPSB7Li4udGhpcy5yb3V0ZURhdGF9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVudSA9IHRoaXMuYnVpbGRNZW51KCk7XG4gICAgICAgIGlmIChtZW51Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIChhbmd1bGFyUm91dGUuZGF0YSBhcyBNbmdSb3V0ZXJEYXRhKS5tZW51SXRlbXMgPSBtZW51O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCh0aGlzLnJvdXRlLmNoaWxkcmVuPy5sZW5ndGggPz8gMCkgPiAwIHx8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gcm91dGUgaGFzIGNoaWxkcmVuXG4gICAgICAgICAgICBhbmd1bGFyUm91dGUuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdXRlLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhbmd1bGFyUm91dGUuY2hpbGRyZW4ucHVzaCguLi50aGlzLnJvdXRlLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGRSb3V0ZSBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXJSb3V0ZS5jaGlsZHJlbi5wdXNoKGNoaWxkUm91dGUuYnVpbGRSb3V0ZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yb3V0ZS5jYW5BY3RpdmF0ZSkge1xuICAgICAgICAgICAgYW5ndWxhclJvdXRlLmNhbkFjdGl2YXRlID0gWy4uLnRoaXMucm91dGUuY2FuQWN0aXZhdGVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJvdXRlLmNhbkFjdGl2YXRlQ2hpbGQpIHtcbiAgICAgICAgICAgIGFuZ3VsYXJSb3V0ZS5jYW5BY3RpdmF0ZUNoaWxkID0gWy4uLnRoaXMucm91dGUuY2FuQWN0aXZhdGVDaGlsZF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucm91dGUuY2FuTG9hZCkge1xuICAgICAgICAgICAgYW5ndWxhclJvdXRlLmNhbkxvYWQgPSBbLi4udGhpcy5yb3V0ZS5jYW5Mb2FkXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yb3V0ZS5jYW5EZWFjdGl2YXRlKSB7XG4gICAgICAgICAgICBhbmd1bGFyUm91dGUuY2FuRGVhY3RpdmF0ZSA9IFsuLi50aGlzLnJvdXRlLmNhbkRlYWN0aXZhdGVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJvdXRlLnJlc29sdmUpIHtcbiAgICAgICAgICAgIGFuZ3VsYXJSb3V0ZS5yZXNvbHZlID0gey4uLnRoaXMucm91dGUucmVzb2x2ZX07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYW5ndWxhclJvdXRlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRNZW51KCk6IEFycmF5PE1uZ01lbnVJdGVtPiB7XG4gICAgICAgIGNvbnN0IG1lbnVJdGVtQnVpbGQ6IE1uZ01lbnVJdGVtIHwgbnVsbCA9IHRoaXMubWVudUl0ZW0gPyB7Li4udGhpcy5tZW51SXRlbX0gOiBudWxsO1xuICAgICAgICBjb25zdCByb3V0ZUNoaWxkcmVuTWVudUl0ZW1zOiBBcnJheTxNbmdNZW51SXRlbT4gPSB0aGlzLmNoaWxkcmVuLmZsYXRNYXAoY2hpbGQgPT4gY2hpbGQuYnVpbGRNZW51KCkpO1xuICAgICAgICBjb25zdCBtZW51SXRlbUNoaWxkcmVuOiBBcnJheTxNbmdNZW51SXRlbT4gPSBbXTtcbiAgICAgICAgY29uc3QgbWVudUl0ZW1DaGlsZHJlbkJ1aWxkOiBBcnJheTxNbmdNZW51SXRlbT4gPSBbXTtcblxuICAgICAgICBpZiAobWVudUl0ZW1CdWlsZD8uaXRlbXMpIHtcbiAgICAgICAgICAgIG1lbnVJdGVtQ2hpbGRyZW5CdWlsZC5wdXNoKC4uLm1lbnVJdGVtQnVpbGQuaXRlbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBtZW51SXRlbUNoaWxkIG9mIHRoaXMubWVudUl0ZW1DaGlsZHJlbikge1xuICAgICAgICAgICAgY29uc3QgZmluYWxNZW51SXRlbUNoaWxkOiBNbmdNZW51SXRlbSA9IHsuLi5tZW51SXRlbUNoaWxkfTtcbiAgICAgICAgICAgIGlmICghZmluYWxNZW51SXRlbUNoaWxkLnJvdXRlckxpbmspIHtcbiAgICAgICAgICAgICAgICBmaW5hbE1lbnVJdGVtQ2hpbGQucm91dGVyTGluayA9IHRoaXMucm91dGVQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmaW5hbE1lbnVJdGVtQ2hpbGQucm91dGVyTGluayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBmaW5hbE1lbnVJdGVtQ2hpbGQucm91dGVyTGluayA9IFtmaW5hbE1lbnVJdGVtQ2hpbGQucm91dGVyTGlua107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbE1lbnVJdGVtQ2hpbGQucm91dGVyTGluayA9IFJvdXRlVXRpbC5yZW1vdmVFbXB0eVBhdGhTZWdtZW50cyhmaW5hbE1lbnVJdGVtQ2hpbGQucm91dGVyTGluayk7XG4gICAgICAgICAgICBtZW51SXRlbUNoaWxkcmVuLnB1c2goZmluYWxNZW51SXRlbUNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lbnVJdGVtQ2hpbGRyZW5CdWlsZC5wdXNoKC4uLm1lbnVJdGVtQ2hpbGRyZW4sIC4uLnJvdXRlQ2hpbGRyZW5NZW51SXRlbXMpO1xuXG4gICAgICAgIGlmICghbWVudUl0ZW1CdWlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIG1lbnVJdGVtQ2hpbGRyZW5CdWlsZDtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lbnVJdGVtQnVpbGQubGFiZWwgPSBtZW51SXRlbUJ1aWxkLmxhYmVsID8/IHRoaXMucGFnZVRpdGxlO1xuICAgICAgICBpZiAodHlwZW9mIG1lbnVJdGVtQnVpbGQucm91dGVyTGluayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG1lbnVJdGVtQnVpbGQucm91dGVyTGluayA9IFttZW51SXRlbUJ1aWxkLnJvdXRlckxpbmtdO1xuICAgICAgICB9XG4gICAgICAgIG1lbnVJdGVtQnVpbGQucm91dGVyTGluayA9IFJvdXRlVXRpbC5yZW1vdmVFbXB0eVBhdGhTZWdtZW50cyhtZW51SXRlbUJ1aWxkLnJvdXRlckxpbmsgPz8gdGhpcy5yb3V0ZVBhdGgpO1xuICAgICAgICBpZiAobWVudUl0ZW1DaGlsZHJlbkJ1aWxkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1lbnVJdGVtQnVpbGQuaXRlbXMgPSBtZW51SXRlbUNoaWxkcmVuQnVpbGQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW1lbnVJdGVtQnVpbGQuZ3VhcmRzKSB7XG4gICAgICAgICAgICBjb25zdCBndWFyZHMgPSB0aGlzLmZpbmRNZW51SXRlbUd1YXJkcygpO1xuICAgICAgICAgICAgaWYgKGd1YXJkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbWVudUl0ZW1CdWlsZC5ndWFyZHMgPSBndWFyZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW1lbnVJdGVtQnVpbGQucGVybWlzc2lvbnMgJiYgdGhpcy5yb3V0ZURhdGEucGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgIG1lbnVJdGVtQnVpbGQucGVybWlzc2lvbnMgPSB0aGlzLnJvdXRlRGF0YS5wZXJtaXNzaW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbWVudUl0ZW1CdWlsZF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVNZW51SXRlbShpY29uPzogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgcm91dGVyTGluaz86IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgY29uc3QgbWVudUl0ZW06IE1uZ01lbnVJdGVtID0ge307XG4gICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICBtZW51SXRlbS5pY29uID0gaWNvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgIG1lbnVJdGVtLmxhYmVsID0gbGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlckxpbmspIHtcbiAgICAgICAgICAgIG1lbnVJdGVtLnJvdXRlckxpbmsgPSByb3V0ZXJMaW5rO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZW51SXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRNZW51SXRlbUd1YXJkcygpOiBBcnJheTxhbnk+IHtcbiAgICAgICAgY29uc3QgZ3VhcmRzOiBBcnJheTxhbnk+ID0gW107XG4gICAgICAgIGlmICh0aGlzLnJvdXRlLmNhbkFjdGl2YXRlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGd1YXJkcy5wdXNoKC4uLnRoaXMucm91dGUuY2FuQWN0aXZhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHBhcmVudCBndWFyZHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gZGVjaXNpb24gdG8gaGlkZSBtZW51IGl0ZW0hXG4gICAgICAgICAgICAvLyBTb21lIHBhcmVudCByb3V0ZXMgbWlnaHQgaGF2ZSBndWFyZHMsIGJ1dCBubyBtZW51IGl0ZW1zLCBzbyB0aGlzIGd1YXJkcyBtdXN0IGJlIHRha2VuIGludG8gYWNjb3VudCBoZXJlLFxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyBwYXJlbnQgbWVudSBpdGVtIHRvIGhpZGUuXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5maW5kTWVudUl0ZW1HdWFyZHMoKS5mb3JFYWNoKGcgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChndWFyZHMuaW5kZXhPZihnKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ3VhcmRzLnB1c2goZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGd1YXJkcztcbiAgICB9XG59XG4iXX0=