@igo2/common 18.0.0 → 18.0.1-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/entity/src/entity-table/entity-table.theming.scss +1 -1
  2. package/fesm2022/igo2-common-action.mjs +16 -16
  3. package/fesm2022/igo2-common-action.mjs.map +1 -1
  4. package/fesm2022/igo2-common-backdrop.mjs +8 -8
  5. package/fesm2022/igo2-common-backdrop.mjs.map +1 -1
  6. package/fesm2022/igo2-common-badge.mjs +7 -7
  7. package/fesm2022/igo2-common-badge.mjs.map +1 -1
  8. package/fesm2022/igo2-common-clickout.mjs +7 -7
  9. package/fesm2022/igo2-common-clickout.mjs.map +1 -1
  10. package/fesm2022/igo2-common-clone.mjs +7 -7
  11. package/fesm2022/igo2-common-clone.mjs.map +1 -1
  12. package/fesm2022/igo2-common-collapsible.mjs +11 -11
  13. package/fesm2022/igo2-common-collapsible.mjs.map +1 -1
  14. package/fesm2022/igo2-common-color.mjs +9 -9
  15. package/fesm2022/igo2-common-color.mjs.map +1 -1
  16. package/fesm2022/igo2-common-confirm-dialog.mjs +11 -11
  17. package/fesm2022/igo2-common-confirm-dialog.mjs.map +1 -1
  18. package/fesm2022/igo2-common-context-menu.mjs +10 -10
  19. package/fesm2022/igo2-common-context-menu.mjs.map +1 -1
  20. package/fesm2022/igo2-common-custom-html.mjs +11 -11
  21. package/fesm2022/igo2-common-custom-html.mjs.map +1 -1
  22. package/fesm2022/igo2-common-dom.mjs +7 -7
  23. package/fesm2022/igo2-common-dom.mjs.map +1 -1
  24. package/fesm2022/igo2-common-drag-drop.mjs +10 -10
  25. package/fesm2022/igo2-common-drag-drop.mjs.map +1 -1
  26. package/fesm2022/igo2-common-dynamic-component.mjs +14 -14
  27. package/fesm2022/igo2-common-dynamic-component.mjs.map +1 -1
  28. package/fesm2022/igo2-common-entity.mjs +33 -33
  29. package/fesm2022/igo2-common-entity.mjs.map +1 -1
  30. package/fesm2022/igo2-common-flexible.mjs +7 -7
  31. package/fesm2022/igo2-common-flexible.mjs.map +1 -1
  32. package/fesm2022/igo2-common-form.mjs +57 -57
  33. package/fesm2022/igo2-common-form.mjs.map +1 -1
  34. package/fesm2022/igo2-common-home-button.mjs +8 -8
  35. package/fesm2022/igo2-common-home-button.mjs.map +1 -1
  36. package/fesm2022/igo2-common-icon.mjs +13 -14
  37. package/fesm2022/igo2-common-icon.mjs.map +1 -1
  38. package/fesm2022/igo2-common-image.mjs +10 -10
  39. package/fesm2022/igo2-common-image.mjs.map +1 -1
  40. package/fesm2022/igo2-common-interactive-tour.mjs +14 -14
  41. package/fesm2022/igo2-common-interactive-tour.mjs.map +1 -1
  42. package/fesm2022/igo2-common-json-dialog.mjs +11 -11
  43. package/fesm2022/igo2-common-json-dialog.mjs.map +1 -1
  44. package/fesm2022/igo2-common-keyvalue.mjs +7 -7
  45. package/fesm2022/igo2-common-keyvalue.mjs.map +1 -1
  46. package/fesm2022/igo2-common-list.mjs +11 -11
  47. package/fesm2022/igo2-common-list.mjs.map +1 -1
  48. package/fesm2022/igo2-common-panel.mjs +8 -8
  49. package/fesm2022/igo2-common-panel.mjs.map +1 -1
  50. package/fesm2022/igo2-common-select-value-dialog.mjs +11 -11
  51. package/fesm2022/igo2-common-select-value-dialog.mjs.map +1 -1
  52. package/fesm2022/igo2-common-sidenav.mjs +7 -7
  53. package/fesm2022/igo2-common-sidenav.mjs.map +1 -1
  54. package/fesm2022/igo2-common-spinner.mjs +11 -11
  55. package/fesm2022/igo2-common-spinner.mjs.map +1 -1
  56. package/fesm2022/igo2-common-stop-propagation.mjs +10 -10
  57. package/fesm2022/igo2-common-stop-propagation.mjs.map +1 -1
  58. package/fesm2022/igo2-common-table.mjs +8 -8
  59. package/fesm2022/igo2-common-table.mjs.map +1 -1
  60. package/fesm2022/igo2-common-tool.mjs +15 -15
  61. package/fesm2022/igo2-common-tool.mjs.map +1 -1
  62. package/fesm2022/igo2-common-widget.mjs +15 -15
  63. package/fesm2022/igo2-common-widget.mjs.map +1 -1
  64. package/fesm2022/igo2-common-workspace.mjs +20 -20
  65. package/fesm2022/igo2-common-workspace.mjs.map +1 -1
  66. package/package.json +8 -76
  67. package/src/style/style.scss +1 -1
  68. package/style/style.css +4 -1
  69. package/esm2022/action/action.module.mjs +0 -19
  70. package/esm2022/action/actionbar/actionbar-item.component.mjs +0 -192
  71. package/esm2022/action/actionbar/actionbar.component.mjs +0 -277
  72. package/esm2022/action/actionbar/actionbar.module.mjs +0 -19
  73. package/esm2022/action/igo2-common-action.mjs +0 -5
  74. package/esm2022/action/public_api.mjs +0 -5
  75. package/esm2022/action/shared/action.enums.mjs +0 -7
  76. package/esm2022/action/shared/action.interfaces.mjs +0 -2
  77. package/esm2022/action/shared/index.mjs +0 -4
  78. package/esm2022/action/shared/store.mjs +0 -8
  79. package/esm2022/backdrop/backdrop.component.mjs +0 -21
  80. package/esm2022/backdrop/backdrop.module.mjs +0 -25
  81. package/esm2022/backdrop/igo2-common-backdrop.mjs +0 -5
  82. package/esm2022/backdrop/public_api.mjs +0 -3
  83. package/esm2022/badge/badge-icon.directive.mjs +0 -149
  84. package/esm2022/badge/badge-icon.module.mjs +0 -25
  85. package/esm2022/badge/igo2-common-badge.mjs +0 -5
  86. package/esm2022/badge/public_api.mjs +0 -3
  87. package/esm2022/clickout/clickout.directive.mjs +0 -32
  88. package/esm2022/clickout/clickout.module.mjs +0 -25
  89. package/esm2022/clickout/igo2-common-clickout.mjs +0 -5
  90. package/esm2022/clickout/public_api.mjs +0 -3
  91. package/esm2022/clone/clone.module.mjs +0 -25
  92. package/esm2022/clone/clone.pipe.mjs +0 -25
  93. package/esm2022/clone/igo2-common-clone.mjs +0 -5
  94. package/esm2022/clone/public_api.mjs +0 -3
  95. package/esm2022/collapsible/collapse.directive.mjs +0 -57
  96. package/esm2022/collapsible/collapsible.component.mjs +0 -38
  97. package/esm2022/collapsible/collapsible.module.mjs +0 -26
  98. package/esm2022/collapsible/igo2-common-collapsible.mjs +0 -5
  99. package/esm2022/collapsible/public_api.mjs +0 -10
  100. package/esm2022/color/color-picker-form-field/color-picker-form-field.component.mjs +0 -104
  101. package/esm2022/color/color-picker-form-field/color-picker-form-field.module.mjs +0 -19
  102. package/esm2022/color/color-picker-form-field/index.mjs +0 -3
  103. package/esm2022/color/igo2-common-color.mjs +0 -5
  104. package/esm2022/color/public_api.mjs +0 -2
  105. package/esm2022/confirm-dialog/confirm-dialog.component.mjs +0 -31
  106. package/esm2022/confirm-dialog/confirm-dialog.interface.mjs +0 -2
  107. package/esm2022/confirm-dialog/confirm-dialog.module.mjs +0 -27
  108. package/esm2022/confirm-dialog/confirm-dialog.service.mjs +0 -35
  109. package/esm2022/confirm-dialog/igo2-common-confirm-dialog.mjs +0 -5
  110. package/esm2022/confirm-dialog/public_api.mjs +0 -5
  111. package/esm2022/context-menu/context-menu.directive.mjs +0 -109
  112. package/esm2022/context-menu/context-menu.module.mjs +0 -26
  113. package/esm2022/context-menu/igo2-common-context-menu.mjs +0 -5
  114. package/esm2022/context-menu/long-press.directive.mjs +0 -65
  115. package/esm2022/context-menu/public_api.mjs +0 -10
  116. package/esm2022/custom-html/custom-html.component.mjs +0 -21
  117. package/esm2022/custom-html/custom-html.module.mjs +0 -25
  118. package/esm2022/custom-html/custom-html.pipe.mjs +0 -23
  119. package/esm2022/custom-html/igo2-common-custom-html.mjs +0 -5
  120. package/esm2022/custom-html/public_api.mjs +0 -10
  121. package/esm2022/dom/dom.interfaces.mjs +0 -2
  122. package/esm2022/dom/dom.module.mjs +0 -27
  123. package/esm2022/dom/dom.service.mjs +0 -35
  124. package/esm2022/dom/igo2-common-dom.mjs +0 -5
  125. package/esm2022/dom/public_api.mjs +0 -4
  126. package/esm2022/drag-drop/drag-drop.directive.mjs +0 -82
  127. package/esm2022/drag-drop/drag-drop.module.mjs +0 -26
  128. package/esm2022/drag-drop/igo2-common-drag-drop.mjs +0 -5
  129. package/esm2022/drag-drop/public_api.mjs +0 -4
  130. package/esm2022/drag-drop/tree-drag-drop/index.mjs +0 -3
  131. package/esm2022/drag-drop/tree-drag-drop/tree-drag-drop.directive.mjs +0 -391
  132. package/esm2022/drag-drop/tree-drag-drop/tree-drag-drop.interface.mjs +0 -2
  133. package/esm2022/dynamic-component/dynamic-component.module.mjs +0 -19
  134. package/esm2022/dynamic-component/dynamic-outlet/dynamic-outlet.component.mjs +0 -129
  135. package/esm2022/dynamic-component/dynamic-outlet/dynamic-outlet.module.mjs +0 -19
  136. package/esm2022/dynamic-component/igo2-common-dynamic-component.mjs +0 -5
  137. package/esm2022/dynamic-component/public_api.mjs +0 -5
  138. package/esm2022/dynamic-component/shared/dynamic-component.interfaces.mjs +0 -2
  139. package/esm2022/dynamic-component/shared/dynamic-component.mjs +0 -183
  140. package/esm2022/dynamic-component/shared/dynamic-component.service.mjs +0 -30
  141. package/esm2022/dynamic-component/shared/index.mjs +0 -4
  142. package/esm2022/entity/entity-selector/entity-selector.component.mjs +0 -174
  143. package/esm2022/entity/entity-selector/entity-selector.module.mjs +0 -19
  144. package/esm2022/entity/entity-selector/index.mjs +0 -3
  145. package/esm2022/entity/entity-table/entity-table-row.directive.mjs +0 -138
  146. package/esm2022/entity/entity-table/entity-table.component.mjs +0 -883
  147. package/esm2022/entity/entity-table/entity-table.module.mjs +0 -19
  148. package/esm2022/entity/entity-table/index.mjs +0 -3
  149. package/esm2022/entity/entity-table-paginator/entity-table-paginator.component.mjs +0 -158
  150. package/esm2022/entity/entity-table-paginator/entity-table-paginator.interface.mjs +0 -2
  151. package/esm2022/entity/entity-table-paginator/entity-table-paginator.module.mjs +0 -19
  152. package/esm2022/entity/entity-table-paginator/index.mjs +0 -4
  153. package/esm2022/entity/entity.module.mjs +0 -30
  154. package/esm2022/entity/igo2-common-entity.mjs +0 -5
  155. package/esm2022/entity/public_api.mjs +0 -6
  156. package/esm2022/entity/shared/entity.enums.mjs +0 -28
  157. package/esm2022/entity/shared/entity.interfaces.mjs +0 -2
  158. package/esm2022/entity/shared/entity.utils.mjs +0 -73
  159. package/esm2022/entity/shared/index.mjs +0 -10
  160. package/esm2022/entity/shared/state.mjs +0 -194
  161. package/esm2022/entity/shared/store.mjs +0 -322
  162. package/esm2022/entity/shared/strategies/filter-custom-function.mjs +0 -80
  163. package/esm2022/entity/shared/strategies/filter-selection.mjs +0 -81
  164. package/esm2022/entity/shared/strategies/index.mjs +0 -4
  165. package/esm2022/entity/shared/strategies/strategy.mjs +0 -82
  166. package/esm2022/entity/shared/transaction.mjs +0 -329
  167. package/esm2022/entity/shared/view.mjs +0 -330
  168. package/esm2022/entity/shared/watcher.mjs +0 -135
  169. package/esm2022/environment/environment.interface.mjs +0 -2
  170. package/esm2022/environment/igo2-common-environment.mjs +0 -5
  171. package/esm2022/environment/public_api.mjs +0 -2
  172. package/esm2022/flexible/flexible.component.mjs +0 -137
  173. package/esm2022/flexible/flexible.module.mjs +0 -25
  174. package/esm2022/flexible/flexible.type.mjs +0 -2
  175. package/esm2022/flexible/igo2-common-flexible.mjs +0 -5
  176. package/esm2022/flexible/public_api.mjs +0 -4
  177. package/esm2022/form/form/form.component.mjs +0 -105
  178. package/esm2022/form/form/form.module.mjs +0 -19
  179. package/esm2022/form/form/index.mjs +0 -3
  180. package/esm2022/form/form-dialog/form-dialog.component.mjs +0 -94
  181. package/esm2022/form/form-dialog/form-dialog.interface.mjs +0 -2
  182. package/esm2022/form/form-dialog/form-dialog.module.mjs +0 -31
  183. package/esm2022/form/form-dialog/form-dialog.service.mjs +0 -30
  184. package/esm2022/form/form-dialog/index.mjs +0 -5
  185. package/esm2022/form/form-field/form-field-select.component.mjs +0 -117
  186. package/esm2022/form/form-field/form-field-text.component.mjs +0 -126
  187. package/esm2022/form/form-field/form-field-textarea.component.mjs +0 -95
  188. package/esm2022/form/form-field/form-field.component.mjs +0 -65
  189. package/esm2022/form/form-field/form-field.directive.mjs +0 -11
  190. package/esm2022/form/form-field/form-field.module.mjs +0 -23
  191. package/esm2022/form/form-field/index.mjs +0 -7
  192. package/esm2022/form/form-group/form-group.component.mjs +0 -81
  193. package/esm2022/form/form-group/form-group.module.mjs +0 -19
  194. package/esm2022/form/form-group/index.mjs +0 -3
  195. package/esm2022/form/form.module.mjs +0 -32
  196. package/esm2022/form/igo2-common-form.mjs +0 -5
  197. package/esm2022/form/public_api.mjs +0 -7
  198. package/esm2022/form/shared/form-field-component.mjs +0 -7
  199. package/esm2022/form/shared/form-field.service.mjs +0 -28
  200. package/esm2022/form/shared/form.interfaces.mjs +0 -2
  201. package/esm2022/form/shared/form.service.mjs +0 -82
  202. package/esm2022/form/shared/form.utils.mjs +0 -41
  203. package/esm2022/form/shared/index.mjs +0 -6
  204. package/esm2022/home-button/home-button.component.mjs +0 -25
  205. package/esm2022/home-button/home-button.module.mjs +0 -19
  206. package/esm2022/home-button/igo2-common-home-button.mjs +0 -5
  207. package/esm2022/home-button/public_api.mjs +0 -3
  208. package/esm2022/icon/icon/icon.component.mjs +0 -38
  209. package/esm2022/icon/icon.provider.mjs +0 -14
  210. package/esm2022/icon/igo2-common-icon.mjs +0 -5
  211. package/esm2022/icon/public_api.mjs +0 -4
  212. package/esm2022/icon/shared/icon.interface.mjs +0 -2
  213. package/esm2022/icon/shared/icon.service.mjs +0 -26
  214. package/esm2022/icon/shared/icons.mjs +0 -40
  215. package/esm2022/icon/shared/index.mjs +0 -4
  216. package/esm2022/igo2-common.mjs +0 -5
  217. package/esm2022/image/igo2-common-image.mjs +0 -5
  218. package/esm2022/image/image-error.directive.mjs +0 -35
  219. package/esm2022/image/image.module.mjs +0 -26
  220. package/esm2022/image/public_api.mjs +0 -7
  221. package/esm2022/image/secure-image.pipe.mjs +0 -66
  222. package/esm2022/interactive-tour/igo2-common-interactive-tour.mjs +0 -5
  223. package/esm2022/interactive-tour/interactive-tour.component.mjs +0 -131
  224. package/esm2022/interactive-tour/interactive-tour.interface.mjs +0 -2
  225. package/esm2022/interactive-tour/interactive-tour.loader.mjs +0 -49
  226. package/esm2022/interactive-tour/interactive-tour.module.mjs +0 -19
  227. package/esm2022/interactive-tour/interactive-tour.service.mjs +0 -303
  228. package/esm2022/interactive-tour/public_api.mjs +0 -6
  229. package/esm2022/json-dialog/igo2-common-json-dialog.mjs +0 -5
  230. package/esm2022/json-dialog/json-dialog.component.mjs +0 -38
  231. package/esm2022/json-dialog/json-dialog.module.mjs +0 -26
  232. package/esm2022/json-dialog/json-dialog.service.mjs +0 -26
  233. package/esm2022/json-dialog/public_api.mjs +0 -4
  234. package/esm2022/keyvalue/igo2-common-keyvalue.mjs +0 -5
  235. package/esm2022/keyvalue/keyvalue.module.mjs +0 -25
  236. package/esm2022/keyvalue/keyvalue.pipe.mjs +0 -19
  237. package/esm2022/keyvalue/public_api.mjs +0 -3
  238. package/esm2022/list/igo2-common-list.mjs +0 -5
  239. package/esm2022/list/list-item.directive.mjs +0 -166
  240. package/esm2022/list/list.component.mjs +0 -252
  241. package/esm2022/list/list.module.mjs +0 -26
  242. package/esm2022/list/public_api.mjs +0 -7
  243. package/esm2022/panel/igo2-common-panel.mjs +0 -5
  244. package/esm2022/panel/panel.component.mjs +0 -30
  245. package/esm2022/panel/panel.module.mjs +0 -19
  246. package/esm2022/panel/public_api.mjs +0 -3
  247. package/esm2022/public_api.mjs +0 -20
  248. package/esm2022/select-value-dialog/igo2-common-select-value-dialog.mjs +0 -5
  249. package/esm2022/select-value-dialog/public_api.mjs +0 -6
  250. package/esm2022/select-value-dialog/select-value-check-radio-dialog.component.mjs +0 -103
  251. package/esm2022/select-value-dialog/select-value-dialog.enums.mjs +0 -6
  252. package/esm2022/select-value-dialog/select-value-dialog.interface.mjs +0 -2
  253. package/esm2022/select-value-dialog/select-value-dialog.module.mjs +0 -27
  254. package/esm2022/select-value-dialog/select-value-dialog.service.mjs +0 -29
  255. package/esm2022/sidenav/igo2-common-sidenav.mjs +0 -5
  256. package/esm2022/sidenav/public_api.mjs +0 -3
  257. package/esm2022/sidenav/sidenav-shim.directive.mjs +0 -58
  258. package/esm2022/sidenav/sidenav.module.mjs +0 -25
  259. package/esm2022/spinner/igo2-common-spinner.mjs +0 -5
  260. package/esm2022/spinner/public_api.mjs +0 -4
  261. package/esm2022/spinner/spinner-activity.directive.mjs +0 -56
  262. package/esm2022/spinner/spinner.component.mjs +0 -29
  263. package/esm2022/spinner/spinner.module.mjs +0 -26
  264. package/esm2022/stop-propagation/igo2-common-stop-propagation.mjs +0 -5
  265. package/esm2022/stop-propagation/public_api.mjs +0 -10
  266. package/esm2022/stop-propagation/stop-drop-propagation.directive.mjs +0 -21
  267. package/esm2022/stop-propagation/stop-propagation.directive.mjs +0 -20
  268. package/esm2022/stop-propagation/stop-propagation.module.mjs +0 -26
  269. package/esm2022/table/igo2-common-table.mjs +0 -5
  270. package/esm2022/table/public_api.mjs +0 -7
  271. package/esm2022/table/table-action-color.enum.mjs +0 -7
  272. package/esm2022/table/table-database.mjs +0 -28
  273. package/esm2022/table/table-datasource.mjs +0 -66
  274. package/esm2022/table/table-model.interface.mjs +0 -2
  275. package/esm2022/table/table.component.mjs +0 -143
  276. package/esm2022/table/table.module.mjs +0 -25
  277. package/esm2022/tool/igo2-common-tool.mjs +0 -5
  278. package/esm2022/tool/public_api.mjs +0 -4
  279. package/esm2022/tool/shared/index.mjs +0 -6
  280. package/esm2022/tool/shared/tool-component.mjs +0 -9
  281. package/esm2022/tool/shared/tool.interface.mjs +0 -2
  282. package/esm2022/tool/shared/tool.service.mjs +0 -43
  283. package/esm2022/tool/shared/toolbox.enums.mjs +0 -2
  284. package/esm2022/tool/shared/toolbox.mjs +0 -192
  285. package/esm2022/tool/tool.module.mjs +0 -28
  286. package/esm2022/tool/toolbox/index.mjs +0 -3
  287. package/esm2022/tool/toolbox/toolbox.animation.mjs +0 -10
  288. package/esm2022/tool/toolbox/toolbox.component.mjs +0 -241
  289. package/esm2022/tool/toolbox/toolbox.module.mjs +0 -19
  290. package/esm2022/widget/igo2-common-widget.mjs +0 -5
  291. package/esm2022/widget/public_api.mjs +0 -4
  292. package/esm2022/widget/shared/index.mjs +0 -4
  293. package/esm2022/widget/shared/widget.interfaces.mjs +0 -2
  294. package/esm2022/widget/shared/widget.mjs +0 -4
  295. package/esm2022/widget/shared/widget.service.mjs +0 -22
  296. package/esm2022/widget/widget-outlet/index.mjs +0 -3
  297. package/esm2022/widget/widget-outlet/widget-outlet.component.mjs +0 -112
  298. package/esm2022/widget/widget-outlet/widget-outlet.module.mjs +0 -19
  299. package/esm2022/widget/widget.module.mjs +0 -22
  300. package/esm2022/workspace/igo2-common-workspace.mjs +0 -5
  301. package/esm2022/workspace/public_api.mjs +0 -5
  302. package/esm2022/workspace/shared/index.mjs +0 -4
  303. package/esm2022/workspace/shared/store.mjs +0 -37
  304. package/esm2022/workspace/shared/workspace.interfaces.mjs +0 -2
  305. package/esm2022/workspace/shared/workspace.mjs +0 -143
  306. package/esm2022/workspace/workspace-selector/index.mjs +0 -3
  307. package/esm2022/workspace/workspace-selector/workspace-selector.component.mjs +0 -51
  308. package/esm2022/workspace/workspace-selector/workspace-selector.module.mjs +0 -19
  309. package/esm2022/workspace/workspace-widget-outlet/index.mjs +0 -3
  310. package/esm2022/workspace/workspace-widget-outlet/workspace-widget-outlet.component.mjs +0 -73
  311. package/esm2022/workspace/workspace-widget-outlet/workspace-widget-outlet.module.mjs +0 -19
  312. package/esm2022/workspace/workspace.module.mjs +0 -27
@@ -1,81 +0,0 @@
1
- import { EntityStoreStrategy } from './strategy';
2
- /**
3
- * When active, this strategy filters a store's stateView to return
4
- * selected entities only.
5
- */
6
- export class EntityStoreFilterSelectionStrategy extends EntityStoreStrategy {
7
- /**
8
- * Store / filter ids map
9
- */
10
- filters = new Map();
11
- /**
12
- * Bind this strategy to a store and start filtering it
13
- * @param store Entity store
14
- */
15
- bindStore(store) {
16
- super.bindStore(store);
17
- if (this.active === true) {
18
- this.filterStore(store);
19
- }
20
- }
21
- /**
22
- * Unbind this strategy from a store and stop filtering it
23
- * @param store Entity store
24
- */
25
- unbindStore(store) {
26
- super.unbindStore(store);
27
- if (this.active === true) {
28
- this.unfilterStore(store);
29
- }
30
- }
31
- /**
32
- * Start filtering all stores
33
- * @internal
34
- */
35
- doActivate() {
36
- this.filterAll();
37
- }
38
- /**
39
- * Stop filtering all stores
40
- * @internal
41
- */
42
- doDeactivate() {
43
- this.unfilterAll();
44
- }
45
- /**
46
- * Filter all stores
47
- */
48
- filterAll() {
49
- this.stores.forEach((store) => this.filterStore(store));
50
- }
51
- /**
52
- * Unfilter all stores
53
- */
54
- unfilterAll() {
55
- this.stores.forEach((store) => this.unfilterStore(store));
56
- }
57
- /**
58
- * Filter a store and add it to the filters map
59
- */
60
- filterStore(store) {
61
- if (this.filters.has(store)) {
62
- return;
63
- }
64
- const filter = (record) => {
65
- return record.state.selected === true;
66
- };
67
- this.filters.set(store, store.stateView.addFilter(filter));
68
- }
69
- /**
70
- * Unfilter a store and delete it from the filters map
71
- */
72
- unfilterStore(store) {
73
- const filterId = this.filters.get(store);
74
- if (filterId === undefined) {
75
- return;
76
- }
77
- store.stateView.removeFilter(filterId);
78
- this.filters.delete(store);
79
- }
80
- }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXNlbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9lbnRpdHkvc3JjL3NoYXJlZC9zdHJhdGVnaWVzL2ZpbHRlci1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxrQ0FBbUMsU0FBUSxtQkFBbUI7SUFDekU7O09BRUc7SUFDSyxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFFakQ7OztPQUdHO0lBQ0gsU0FBUyxDQUFDLEtBQWtCO1FBQzFCLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsS0FBa0I7UUFDNUIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNPLFVBQVU7UUFDbEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDTyxZQUFZO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxTQUFTO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVztRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQWtCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXLENBQUMsS0FBa0I7UUFDcEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUE0QixFQUFFLEVBQUU7WUFDOUMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7UUFDeEMsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYSxDQUFDLEtBQWtCO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5UmVjb3JkIH0gZnJvbSAnLi4vZW50aXR5LmludGVyZmFjZXMnO1xuaW1wb3J0IHsgRW50aXR5U3RvcmUgfSBmcm9tICcuLi9zdG9yZSc7XG5pbXBvcnQgeyBFbnRpdHlTdG9yZVN0cmF0ZWd5IH0gZnJvbSAnLi9zdHJhdGVneSc7XG5cbi8qKlxuICogV2hlbiBhY3RpdmUsIHRoaXMgc3RyYXRlZ3kgZmlsdGVycyBhIHN0b3JlJ3Mgc3RhdGVWaWV3IHRvIHJldHVyblxuICogc2VsZWN0ZWQgZW50aXRpZXMgb25seS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudGl0eVN0b3JlRmlsdGVyU2VsZWN0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBFbnRpdHlTdG9yZVN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqIFN0b3JlIC8gZmlsdGVyIGlkcyBtYXBcbiAgICovXG4gIHByaXZhdGUgZmlsdGVycyA9IG5ldyBNYXA8RW50aXR5U3RvcmUsIHN0cmluZz4oKTtcblxuICAvKipcbiAgICogQmluZCB0aGlzIHN0cmF0ZWd5IHRvIGEgc3RvcmUgYW5kIHN0YXJ0IGZpbHRlcmluZyBpdFxuICAgKiBAcGFyYW0gc3RvcmUgRW50aXR5IHN0b3JlXG4gICAqL1xuICBiaW5kU3RvcmUoc3RvcmU6IEVudGl0eVN0b3JlKSB7XG4gICAgc3VwZXIuYmluZFN0b3JlKHN0b3JlKTtcbiAgICBpZiAodGhpcy5hY3RpdmUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuZmlsdGVyU3RvcmUoc3RvcmUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmJpbmQgdGhpcyBzdHJhdGVneSBmcm9tIGEgc3RvcmUgYW5kIHN0b3AgZmlsdGVyaW5nIGl0XG4gICAqIEBwYXJhbSBzdG9yZSBFbnRpdHkgc3RvcmVcbiAgICovXG4gIHVuYmluZFN0b3JlKHN0b3JlOiBFbnRpdHlTdG9yZSkge1xuICAgIHN1cGVyLnVuYmluZFN0b3JlKHN0b3JlKTtcbiAgICBpZiAodGhpcy5hY3RpdmUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMudW5maWx0ZXJTdG9yZShzdG9yZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGZpbHRlcmluZyBhbGwgc3RvcmVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGRvQWN0aXZhdGUoKSB7XG4gICAgdGhpcy5maWx0ZXJBbGwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGZpbHRlcmluZyBhbGwgc3RvcmVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGRvRGVhY3RpdmF0ZSgpIHtcbiAgICB0aGlzLnVuZmlsdGVyQWxsKCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGFsbCBzdG9yZXNcbiAgICovXG4gIHByaXZhdGUgZmlsdGVyQWxsKCkge1xuICAgIHRoaXMuc3RvcmVzLmZvckVhY2goKHN0b3JlOiBFbnRpdHlTdG9yZSkgPT4gdGhpcy5maWx0ZXJTdG9yZShzdG9yZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZmlsdGVyIGFsbCBzdG9yZXNcbiAgICovXG4gIHByaXZhdGUgdW5maWx0ZXJBbGwoKSB7XG4gICAgdGhpcy5zdG9yZXMuZm9yRWFjaCgoc3RvcmU6IEVudGl0eVN0b3JlKSA9PiB0aGlzLnVuZmlsdGVyU3RvcmUoc3RvcmUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYSBzdG9yZSBhbmQgYWRkIGl0IHRvIHRoZSBmaWx0ZXJzIG1hcFxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJTdG9yZShzdG9yZTogRW50aXR5U3RvcmUpIHtcbiAgICBpZiAodGhpcy5maWx0ZXJzLmhhcyhzdG9yZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXIgPSAocmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PikgPT4ge1xuICAgICAgcmV0dXJuIHJlY29yZC5zdGF0ZS5zZWxlY3RlZCA9PT0gdHJ1ZTtcbiAgICB9O1xuICAgIHRoaXMuZmlsdGVycy5zZXQoc3RvcmUsIHN0b3JlLnN0YXRlVmlldy5hZGRGaWx0ZXIoZmlsdGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogVW5maWx0ZXIgYSBzdG9yZSBhbmQgZGVsZXRlIGl0IGZyb20gdGhlIGZpbHRlcnMgbWFwXG4gICAqL1xuICBwcml2YXRlIHVuZmlsdGVyU3RvcmUoc3RvcmU6IEVudGl0eVN0b3JlKSB7XG4gICAgY29uc3QgZmlsdGVySWQgPSB0aGlzLmZpbHRlcnMuZ2V0KHN0b3JlKTtcbiAgICBpZiAoZmlsdGVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN0b3JlLnN0YXRlVmlldy5yZW1vdmVGaWx0ZXIoZmlsdGVySWQpO1xuICAgIHRoaXMuZmlsdGVycy5kZWxldGUoc3RvcmUpO1xuICB9XG59XG4iXX0=
@@ -1,4 +0,0 @@
1
- export * from './strategy';
2
- export * from './filter-custom-function';
3
- export * from './filter-selection';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vZW50aXR5L3NyYy9zaGFyZWQvc3RyYXRlZ2llcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3N0cmF0ZWd5JztcbmV4cG9ydCAqIGZyb20gJy4vZmlsdGVyLWN1c3RvbS1mdW5jdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2ZpbHRlci1zZWxlY3Rpb24nO1xuIl19
@@ -1,82 +0,0 @@
1
- import { BehaviorSubject } from 'rxjs';
2
- /**
3
- * Entity store strategies. They can do pretty much anything during a store's
4
- * lifetime. For example, they may act as triggers when something happens.
5
- * Sharing a strategy is a good idea when multiple strategies would have
6
- * on cancelling effect on each other.
7
- *
8
- * At creation, strategy is inactive and needs to be manually activated.
9
- */
10
- export class EntityStoreStrategy {
11
- options;
12
- /**
13
- * Feature store
14
- * @internal
15
- */
16
- stores = [];
17
- /**
18
- * Whether this strategy is active
19
- * @internal
20
- */
21
- get active() {
22
- return this.active$.value;
23
- }
24
- active$ = new BehaviorSubject(false);
25
- constructor(options = {}) {
26
- this.options = options;
27
- this.options = options;
28
- }
29
- /**
30
- * Activate the strategy. If it's already active, it'll be deactivated
31
- * and activated again.
32
- */
33
- activate() {
34
- if (this.active === true) {
35
- this.doDeactivate();
36
- }
37
- this.active$.next(true);
38
- this.doActivate();
39
- }
40
- /**
41
- * Activate the strategy. If it's already active, it'll be deactivated
42
- * and activated again.
43
- */
44
- deactivate() {
45
- this.active$.next(false);
46
- this.doDeactivate();
47
- }
48
- /**
49
- * Bind this strategy to a store
50
- * @param store Feature store
51
- */
52
- bindStore(store) {
53
- if (this.stores.indexOf(store) < 0) {
54
- this.stores.push(store);
55
- }
56
- }
57
- /**
58
- * Unbind this strategy from store
59
- * @param store Feature store
60
- */
61
- unbindStore(store) {
62
- const index = this.stores.indexOf(store);
63
- if (index >= 0) {
64
- this.stores.splice(index, 1);
65
- }
66
- }
67
- /**
68
- * Do the stataegy activation
69
- * @internal
70
- */
71
- doActivate() {
72
- // empty
73
- }
74
- /**
75
- * Do the strategy deactivation
76
- * @internal
77
- */
78
- doDeactivate() {
79
- // empty
80
- }
81
- }
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vZW50aXR5L3NyYy9zaGFyZWQvc3RyYXRlZ2llcy9zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBS3ZDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8sbUJBQW1CO0lBZ0JSO0lBZnRCOzs7T0FHRztJQUNPLE1BQU0sR0FBa0IsRUFBRSxDQUFDO0lBRXJDOzs7T0FHRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUNRLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUV2RCxZQUFzQixVQUFzQyxFQUFFO1FBQXhDLFlBQU8sR0FBUCxPQUFPLENBQWlDO1FBQzVELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVO1FBQ1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsS0FBa0I7UUFDMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVcsQ0FBQyxLQUFrQjtRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNPLFVBQVU7UUFDbEIsUUFBUTtJQUNWLENBQUM7SUFFRDs7O09BR0c7SUFDTyxZQUFZO1FBQ3BCLFFBQVE7SUFDVixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRW50aXR5U3RvcmVTdHJhdGVneU9wdGlvbnMgfSBmcm9tICcuLi9lbnRpdHkuaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVN0b3JlIH0gZnJvbSAnLi4vc3RvcmUnO1xuXG4vKipcbiAqIEVudGl0eSBzdG9yZSBzdHJhdGVnaWVzLiBUaGV5IGNhbiBkbyBwcmV0dHkgbXVjaCBhbnl0aGluZyBkdXJpbmcgYSBzdG9yZSdzXG4gKiBsaWZldGltZS4gRm9yIGV4YW1wbGUsIHRoZXkgbWF5IGFjdCBhcyB0cmlnZ2VycyB3aGVuIHNvbWV0aGluZyBoYXBwZW5zLlxuICogU2hhcmluZyBhIHN0cmF0ZWd5IGlzIGEgZ29vZCBpZGVhIHdoZW4gbXVsdGlwbGUgc3RyYXRlZ2llcyB3b3VsZCBoYXZlXG4gKiBvbiBjYW5jZWxsaW5nIGVmZmVjdCBvbiBlYWNoIG90aGVyLlxuICpcbiAqIEF0IGNyZWF0aW9uLCBzdHJhdGVneSBpcyBpbmFjdGl2ZSBhbmQgbmVlZHMgdG8gYmUgbWFudWFsbHkgYWN0aXZhdGVkLlxuICovXG5leHBvcnQgY2xhc3MgRW50aXR5U3RvcmVTdHJhdGVneSB7XG4gIC8qKlxuICAgKiBGZWF0dXJlIHN0b3JlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIHN0b3JlczogRW50aXR5U3RvcmVbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgc3RyYXRlZ3kgaXMgYWN0aXZlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmUkLnZhbHVlO1xuICB9XG4gIHJlYWRvbmx5IGFjdGl2ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgb3B0aW9uczogRW50aXR5U3RvcmVTdHJhdGVneU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIHN0cmF0ZWd5LiBJZiBpdCdzIGFscmVhZHkgYWN0aXZlLCBpdCdsbCBiZSBkZWFjdGl2YXRlZFxuICAgKiBhbmQgYWN0aXZhdGVkIGFnYWluLlxuICAgKi9cbiAgYWN0aXZhdGUoKSB7XG4gICAgaWYgKHRoaXMuYWN0aXZlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmRvRGVhY3RpdmF0ZSgpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRvQWN0aXZhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgc3RyYXRlZ3kuIElmIGl0J3MgYWxyZWFkeSBhY3RpdmUsIGl0J2xsIGJlIGRlYWN0aXZhdGVkXG4gICAqIGFuZCBhY3RpdmF0ZWQgYWdhaW4uXG4gICAqL1xuICBkZWFjdGl2YXRlKCkge1xuICAgIHRoaXMuYWN0aXZlJC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLmRvRGVhY3RpdmF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmQgdGhpcyBzdHJhdGVneSB0byBhIHN0b3JlXG4gICAqIEBwYXJhbSBzdG9yZSBGZWF0dXJlIHN0b3JlXG4gICAqL1xuICBiaW5kU3RvcmUoc3RvcmU6IEVudGl0eVN0b3JlKSB7XG4gICAgaWYgKHRoaXMuc3RvcmVzLmluZGV4T2Yoc3RvcmUpIDwgMCkge1xuICAgICAgdGhpcy5zdG9yZXMucHVzaChzdG9yZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuYmluZCB0aGlzIHN0cmF0ZWd5IGZyb20gc3RvcmVcbiAgICogQHBhcmFtIHN0b3JlIEZlYXR1cmUgc3RvcmVcbiAgICovXG4gIHVuYmluZFN0b3JlKHN0b3JlOiBFbnRpdHlTdG9yZSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zdG9yZXMuaW5kZXhPZihzdG9yZSk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRoaXMuc3RvcmVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERvIHRoZSBzdGF0YWVneSBhY3RpdmF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGRvQWN0aXZhdGUoKSB7XG4gICAgLy8gZW1wdHlcbiAgfVxuXG4gIC8qKlxuICAgKiBEbyB0aGUgc3RyYXRlZ3kgZGVhY3RpdmF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGRvRGVhY3RpdmF0ZSgpIHtcbiAgICAvLyBlbXB0eVxuICB9XG59XG4iXX0=
@@ -1,329 +0,0 @@
1
- import { of } from 'rxjs';
2
- import { BehaviorSubject } from 'rxjs';
3
- import { catchError, tap } from 'rxjs/operators';
4
- import { EntityOperationType } from './entity.enums';
5
- import { getEntityId } from './entity.utils';
6
- import { EntityStore } from './store';
7
- /**
8
- * This class holds a reference to the insert, update and delete
9
- * operations performed on a store. This is useful to commit
10
- * these operations in a single pass or to cancel them.
11
- */
12
- export class EntityTransaction {
13
- /**
14
- * Store holding the operations on another store
15
- */
16
- operations;
17
- /**
18
- * Method to get an entity's id
19
- */
20
- getKey;
21
- /**
22
- * Whether there are pending operations
23
- */
24
- get empty$() {
25
- return this.operations.empty$;
26
- }
27
- /**
28
- * Whether there are pending operations
29
- */
30
- get empty() {
31
- return this.empty$.value;
32
- }
33
- /**
34
- * Whether thise store is in commit phase
35
- */
36
- get inCommitPhase() {
37
- return this.inCommitPhase$.value;
38
- }
39
- inCommitPhase$ = new BehaviorSubject(false);
40
- constructor(options = {}) {
41
- this.getKey = options.getKey ? options.getKey : getEntityId;
42
- this.operations = new EntityStore([], {
43
- getKey: (operation) => operation.key
44
- });
45
- }
46
- destroy() {
47
- this.operations.destroy();
48
- }
49
- /**
50
- * Insert an entity into a store. If no store is specified, an insert
51
- * operation is still created but the transaction won't add the new
52
- * entity to the store.
53
- * @param current The entity to insert
54
- * @param store Optional: The store to insert the entity into
55
- * @param meta Optional: Any metadata on the operation
56
- */
57
- insert(current, store, meta) {
58
- const existingOperation = this.getOperationByEntity(current);
59
- if (existingOperation !== undefined) {
60
- this.removeOperation(existingOperation);
61
- }
62
- this.doInsert(current, store, meta);
63
- }
64
- /**
65
- * Update an entity in a store. If no store is specified, an update
66
- * operation is still created but the transaction won't update the
67
- * entity into the store.
68
- * @param previous The entity before update
69
- * @param current The entity after update
70
- * @param store Optional: The store to update the entity into
71
- * @param meta Optional: Any metadata on the operation
72
- */
73
- update(previous, current, store, meta) {
74
- const existingOperation = this.getOperationByEntity(current);
75
- if (existingOperation !== undefined) {
76
- this.removeOperation(existingOperation);
77
- if (existingOperation.type === EntityOperationType.Insert) {
78
- this.doInsert(current, store, meta);
79
- return;
80
- }
81
- else if (existingOperation.type === EntityOperationType.Update) {
82
- previous = existingOperation.previous;
83
- }
84
- }
85
- this.doUpdate(previous, current, store, meta);
86
- }
87
- /**
88
- * Delete an entity from a store. If no store is specified, a delete
89
- * operation is still created but the transaction won't remove the
90
- * entity from the store.
91
- * @param previous The entity before delete
92
- * @param store Optional: The store to delete the entity from
93
- * @param meta Optional: Any metadata on the operation
94
- */
95
- delete(previous, store, meta) {
96
- const existingOperation = this.getOperationByEntity(previous);
97
- if (existingOperation !== undefined) {
98
- this.removeOperation(existingOperation);
99
- if (existingOperation.type === EntityOperationType.Insert) {
100
- if (store !== undefined) {
101
- store.delete(previous);
102
- }
103
- return;
104
- }
105
- }
106
- this.doDelete(previous, store, meta);
107
- }
108
- /**
109
- * Commit operations the transaction. This method doesn't do much
110
- * in itself. The handler it receives does the hard work and it's
111
- * implementation is left to the caller. This method simply wraps
112
- * the handler into an error catching mechanism to update
113
- * the transaction afterward. The caller needs to subscribe to this
114
- * method's output (observable) for the commit to be performed.
115
- * @param operations Operations to commit
116
- * @param handler Function that handles the commit operation
117
- * @returns The handler output (observable)
118
- */
119
- commit(operations, handler) {
120
- this.inCommitPhase$.next(true);
121
- return handler(this, operations).pipe(catchError(() => of(new Error())), tap((result) => {
122
- if (result instanceof Error) {
123
- this.onCommitError();
124
- }
125
- else {
126
- this.onCommitSuccess(operations);
127
- }
128
- }));
129
- }
130
- /**
131
- * Commit all the operations of the transaction.
132
- * @param handler Function that handles the commit operation
133
- * @returns The handler output (observable)
134
- */
135
- commitAll(handler) {
136
- const operations = this.getOperationsInCommit();
137
- return this.commit(operations, handler);
138
- }
139
- /**
140
- * Rollback this transaction
141
- */
142
- rollback() {
143
- this.rollbackOperations(this.operations.all());
144
- }
145
- /**
146
- * Rollback specific operations
147
- */
148
- rollbackOperations(operations) {
149
- this.checkInCommitPhase();
150
- const operationsFactory = () => new Map([
151
- [EntityOperationType.Delete, []],
152
- [EntityOperationType.Update, []],
153
- [EntityOperationType.Insert, []]
154
- ]);
155
- const storesOperations = new Map();
156
- // Group operations by store and by operation type.
157
- // Grouping operations allows us to revert them in bacth, thus, triggering
158
- // observables only one per operation type.
159
- for (const operation of operations) {
160
- const store = operation.store;
161
- if (operation.store === undefined) {
162
- continue;
163
- }
164
- let storeOperations = storesOperations.get(store);
165
- if (storeOperations === undefined) {
166
- storeOperations = operationsFactory();
167
- storesOperations.set(store, storeOperations);
168
- }
169
- storeOperations.get(operation.type).push(operation);
170
- }
171
- Array.from(storesOperations.keys()).forEach((store) => {
172
- const storeOperations = storesOperations.get(store);
173
- const deletes = storeOperations.get(EntityOperationType.Delete);
174
- store.insertMany(deletes.map((_delete) => _delete.previous));
175
- const updates = storeOperations.get(EntityOperationType.Update);
176
- store.updateMany(updates.map((_update) => _update.previous));
177
- const inserts = storeOperations.get(EntityOperationType.Insert);
178
- store.deleteMany(inserts.map((_insert) => _insert.current));
179
- });
180
- this.operations.deleteMany(operations);
181
- this.inCommitPhase$.next(false);
182
- }
183
- /**
184
- * Clear this transaction
185
- * @todo Raise event and synchronize stores?
186
- */
187
- clear() {
188
- this.operations.clear();
189
- this.inCommitPhase$.next(false);
190
- }
191
- /**
192
- * Get any existing operation on an entity
193
- * @param entity Entity
194
- * @returns Either an insert, update or delete operation
195
- */
196
- getOperationByEntity(entity) {
197
- return this.operations.get(this.getKey(entity));
198
- }
199
- /**
200
- * Merge another transaction in this one
201
- * @param transaction Another transaction
202
- */
203
- mergeTransaction(transaction) {
204
- this.checkInCommitPhase();
205
- const operations = transaction.operations.all();
206
- operations.forEach((operation) => {
207
- this.addOperation(operation);
208
- });
209
- }
210
- /**
211
- * Create an insert operation and add an entity to the store
212
- * @param current The entity to insert
213
- * @param store Optional: The store to insert the entity into
214
- * @param meta Optional: Any metadata on the operation
215
- */
216
- doInsert(current, store, meta) {
217
- this.addOperation({
218
- key: this.getKey(current),
219
- type: EntityOperationType.Insert,
220
- previous: undefined,
221
- current,
222
- store,
223
- meta
224
- });
225
- if (store !== undefined) {
226
- store.insert(current);
227
- }
228
- }
229
- /**
230
- * Create an update operation and update an entity into the store
231
- * @param previous The entity before update
232
- * @param current The entity after update
233
- * @param store Optional: The store to update the entity into
234
- * @param meta Optional: Any metadata on the operation
235
- */
236
- doUpdate(previous, current, store, meta) {
237
- this.addOperation({
238
- key: this.getKey(current),
239
- type: EntityOperationType.Update,
240
- previous,
241
- current,
242
- store,
243
- meta
244
- });
245
- if (store !== undefined) {
246
- store.update(current);
247
- }
248
- }
249
- /**
250
- * Create a delete operation and delete an entity from the store
251
- * @param previous The entity before delete
252
- * @param store Optional: The store to delete the entity from
253
- * @param meta Optional: Any metadata on the operation
254
- */
255
- doDelete(previous, store, meta) {
256
- this.addOperation({
257
- key: this.getKey(previous),
258
- type: EntityOperationType.Delete,
259
- previous,
260
- current: undefined,
261
- store,
262
- meta
263
- });
264
- if (store !== undefined) {
265
- store.delete(previous);
266
- }
267
- }
268
- /**
269
- * Remove committed operations from store
270
- * @param operations Commited operations
271
- * @todo Raise event and synchronize stores?
272
- */
273
- resolveOperations(operations) {
274
- this.operations.deleteMany(operations);
275
- }
276
- /**
277
- * On commit success, resolve commited operations and exit commit phase
278
- * @param operations Commited operations
279
- */
280
- onCommitSuccess(operations) {
281
- this.resolveOperations(operations);
282
- this.inCommitPhase$.next(false);
283
- }
284
- /**
285
- * On commit error, abort transaction
286
- * @param operations Commited operations
287
- */
288
- onCommitError() {
289
- this.inCommitPhase$.next(false);
290
- }
291
- /**
292
- * Add an operation to the operations store
293
- * @param operation Operation to add
294
- */
295
- addOperation(operation) {
296
- this.checkInCommitPhase();
297
- this.operations.insert(operation);
298
- this.operations.state.update(operation, { added: true });
299
- }
300
- /**
301
- * Remove an operation from the operations store
302
- * @param operation Operation to remove
303
- */
304
- removeOperation(operation) {
305
- this.checkInCommitPhase();
306
- this.operations.delete(operation);
307
- this.operations.state.update(operation, { added: false });
308
- }
309
- /**
310
- * Get all the operations to commit
311
- * @returns Operations to commit
312
- */
313
- getOperationsInCommit() {
314
- return this.operations.stateView
315
- .manyBy((value) => {
316
- return value.state.added === true;
317
- })
318
- .map((value) => value.entity);
319
- }
320
- /**
321
- * Check if the transaction is in the commit phase and throw an error if it is
322
- */
323
- checkInCommitPhase() {
324
- if (this.inCommitPhase === true) {
325
- throw new Error('This transaction is in the commit phase. Cannot complete this operation.');
326
- }
327
- }
328
- }
329
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vZW50aXR5L3NyYy9zaGFyZWQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFNckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFnQnRDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQzVCOztPQUVHO0lBQ00sVUFBVSxDQUFxRDtJQUV4RTs7T0FFRztJQUNNLE1BQU0sQ0FBbUI7SUFFbEM7O09BRUc7SUFDSCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztJQUNuQyxDQUFDO0lBQ1EsY0FBYyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRTlELFlBQVksVUFBb0MsRUFBRTtRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcs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S0FBSyxDQUNiLDBFQUEwRSxDQUMzRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRW50aXR5T3BlcmF0aW9uVHlwZSB9IGZyb20gJy4vZW50aXR5LmVudW1zJztcbmltcG9ydCB7XG4gIEVudGl0eUtleSxcbiAgRW50aXR5T3BlcmF0aW9uU3RhdGUsXG4gIEVudGl0eVRyYW5zYWN0aW9uT3B0aW9uc1xufSBmcm9tICcuL2VudGl0eS5pbnRlcmZhY2VzJztcbmltcG9ydCB7IGdldEVudGl0eUlkIH0gZnJvbSAnLi9lbnRpdHkudXRpbHMnO1xuaW1wb3J0IHsgRW50aXR5U3RvcmUgfSBmcm9tICcuL3N0b3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlPcGVyYXRpb248RSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICBrZXk6IEVudGl0eUtleTtcbiAgdHlwZTogRW50aXR5T3BlcmF0aW9uVHlwZTtcbiAgcHJldmlvdXM6IEUgfCB1bmRlZmluZWQ7XG4gIGN1cnJlbnQ6IEUgfCB1bmRlZmluZWQ7XG4gIHN0b3JlPzogRW50aXR5U3RvcmU8RT47XG4gIG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgdHlwZSBFbnRpdHlUcmFuc2FjdGlvbkNvbW1pdEhhbmRsZXIgPSAoXG4gIHRyYW5zYWN0aW9uOiBFbnRpdHlUcmFuc2FjdGlvbixcbiAgb3BlcmF0aW9uczogRW50aXR5T3BlcmF0aW9uW11cbikgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIGluc2VydCwgdXBkYXRlIGFuZCBkZWxldGVcbiAqIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIGEgc3RvcmUuIFRoaXMgaXMgdXNlZnVsIHRvIGNvbW1pdFxuICogdGhlc2Ugb3BlcmF0aW9ucyBpbiBhIHNpbmdsZSBwYXNzIG9yIHRvIGNhbmNlbCB0aGVtLlxuICovXG5leHBvcnQgY2xhc3MgRW50aXR5VHJhbnNhY3Rpb24ge1xuICAvKipcbiAgICogU3RvcmUgaG9sZGluZyB0aGUgb3BlcmF0aW9ucyBvbiBhbm90aGVyIHN0b3JlXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25zOiBFbnRpdHlTdG9yZTxFbnRpdHlPcGVyYXRpb24sIEVudGl0eU9wZXJhdGlvblN0YXRlPjtcblxuICAvKipcbiAgICogTWV0aG9kIHRvIGdldCBhbiBlbnRpdHkncyBpZFxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0S2V5OiAoRSkgPT4gRW50aXR5S2V5O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZXJlIGFyZSBwZW5kaW5nIG9wZXJhdGlvbnNcbiAgICovXG4gIGdldCBlbXB0eSQoKTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25zLmVtcHR5JDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZXJlIGFyZSBwZW5kaW5nIG9wZXJhdGlvbnNcbiAgICovXG4gIGdldCBlbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lbXB0eSQudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzZSBzdG9yZSBpcyBpbiBjb21taXQgcGhhc2VcbiAgICovXG4gIGdldCBpbkNvbW1pdFBoYXNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluQ29tbWl0UGhhc2UkLnZhbHVlO1xuICB9XG4gIHJlYWRvbmx5IGluQ29tbWl0UGhhc2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRW50aXR5VHJhbnNhY3Rpb25PcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmdldEtleSA9IG9wdGlvbnMuZ2V0S2V5ID8gb3B0aW9ucy5nZXRLZXkgOiBnZXRFbnRpdHlJZDtcbiAgICB0aGlzLm9wZXJhdGlvbnMgPSBuZXcgRW50aXR5U3RvcmU8RW50aXR5T3BlcmF0aW9uLCBFbnRpdHlPcGVyYXRpb25TdGF0ZT4oXG4gICAgICBbXSxcbiAgICAgIHtcbiAgICAgICAgZ2V0S2V5OiAob3BlcmF0aW9uOiBFbnRpdHlPcGVyYXRpb24pID0+IG9wZXJhdGlvbi5rZXlcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLm9wZXJhdGlvbnMuZGVzdHJveSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhbiBlbnRpdHkgaW50byBhIHN0b3JlLiBJZiBubyBzdG9yZSBpcyBzcGVjaWZpZWQsIGFuIGluc2VydFxuICAgKiBvcGVyYXRpb24gaXMgc3RpbGwgY3JlYXRlZCBidXQgdGhlIHRyYW5zYWN0aW9uIHdvbid0IGFkZCB0aGUgbmV3XG4gICAqIGVudGl0eSB0byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBjdXJyZW50IFRoZSBlbnRpdHkgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBzdG9yZSBPcHRpb25hbDogVGhlIHN0b3JlIHRvIGluc2VydCB0aGUgZW50aXR5IGludG9cbiAgICogQHBhcmFtIG1ldGEgT3B0aW9uYWw6IEFueSBtZXRhZGF0YSBvbiB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBpbnNlcnQoXG4gICAgY3VycmVudDogb2JqZWN0LFxuICAgIHN0b3JlPzogRW50aXR5U3RvcmU8b2JqZWN0PixcbiAgICBtZXRhPzogUmVjb3JkPHN0cmluZywgYW55PlxuICApIHtcbiAgICBjb25zdCBleGlzdGluZ09wZXJhdGlvbiA9IHRoaXMuZ2V0T3BlcmF0aW9uQnlFbnRpdHkoY3VycmVudCk7XG4gICAgaWYgKGV4aXN0aW5nT3BlcmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVtb3ZlT3BlcmF0aW9uKGV4aXN0aW5nT3BlcmF0aW9uKTtcbiAgICB9XG5cbiAgICB0aGlzLmRvSW5zZXJ0KGN1cnJlbnQsIHN0b3JlLCBtZXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYW4gZW50aXR5IGluIGEgc3RvcmUuIElmIG5vIHN0b3JlIGlzIHNwZWNpZmllZCwgYW4gdXBkYXRlXG4gICAqIG9wZXJhdGlvbiBpcyBzdGlsbCBjcmVhdGVkIGJ1dCB0aGUgdHJhbnNhY3Rpb24gd29uJ3QgdXBkYXRlIHRoZVxuICAgKiBlbnRpdHkgaW50byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBwcmV2aW91cyBUaGUgZW50aXR5IGJlZm9yZSB1cGRhdGVcbiAgICogQHBhcmFtIGN1cnJlbnQgVGhlIGVudGl0eSBhZnRlciB1cGRhdGVcbiAgICogQHBhcmFtIHN0b3JlIE9wdGlvbmFsOiBUaGUgc3RvcmUgdG8gdXBkYXRlIHRoZSBlbnRpdHkgaW50b1xuICAgKiBAcGFyYW0gbWV0YSBPcHRpb25hbDogQW55IG1ldGFkYXRhIG9uIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIHVwZGF0ZShcbiAgICBwcmV2aW91czogb2JqZWN0LFxuICAgIGN1cnJlbnQ6IG9iamVjdCxcbiAgICBzdG9yZT86IEVudGl0eVN0b3JlPG9iamVjdD4sXG4gICAgbWV0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKSB7XG4gICAgY29uc3QgZXhpc3RpbmdPcGVyYXRpb24gPSB0aGlzLmdldE9wZXJhdGlvbkJ5RW50aXR5KGN1cnJlbnQpO1xuICAgIGlmIChleGlzdGluZ09wZXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlbW92ZU9wZXJhdGlvbihleGlzdGluZ09wZXJhdGlvbik7XG4gICAgICBpZiAoZXhpc3RpbmdPcGVyYXRpb24udHlwZSA9PT0gRW50aXR5T3BlcmF0aW9uVHlwZS5JbnNlcnQpIHtcbiAgICAgICAgdGhpcy5kb0luc2VydChjdXJyZW50LCBzdG9yZSwgbWV0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmdPcGVyYXRpb24udHlwZSA9PT0gRW50aXR5T3BlcmF0aW9uVHlwZS5VcGRhdGUpIHtcbiAgICAgICAgcHJldmlvdXMgPSBleGlzdGluZ09wZXJhdGlvbi5wcmV2aW91cztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRvVXBkYXRlKHByZXZpb3VzLCBjdXJyZW50LCBzdG9yZSwgbWV0YSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVudGl0eSBmcm9tIGEgc3RvcmUuIElmIG5vIHN0b3JlIGlzIHNwZWNpZmllZCwgYSBkZWxldGVcbiAgICogb3BlcmF0aW9uIGlzIHN0aWxsIGNyZWF0ZWQgYnV0IHRoZSB0cmFuc2FjdGlvbiB3b24ndCByZW1vdmUgdGhlXG4gICAqIGVudGl0eSBmcm9tIHRoZSBzdG9yZS5cbiAgICogQHBhcmFtIHByZXZpb3VzIFRoZSBlbnRpdHkgYmVmb3JlIGRlbGV0ZVxuICAgKiBAcGFyYW0gc3RvcmUgT3B0aW9uYWw6IFRoZSBzdG9yZSB0byBkZWxldGUgdGhlIGVudGl0eSBmcm9tXG4gICAqIEBwYXJhbSBtZXRhIE9wdGlvbmFsOiBBbnkgbWV0YWRhdGEgb24gdGhlIG9wZXJhdGlvblxuICAgKi9cbiAgZGVsZXRlKFxuICAgIHByZXZpb3VzOiBvYmplY3QsXG4gICAgc3RvcmU/OiBFbnRpdHlTdG9yZTxvYmplY3Q+LFxuICAgIG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICkge1xuICAgIGNvbnN0IGV4aXN0aW5nT3BlcmF0aW9uID0gdGhpcy5nZXRPcGVyYXRpb25CeUVudGl0eShwcmV2aW91cyk7XG4gICAgaWYgKGV4aXN0aW5nT3BlcmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVtb3ZlT3BlcmF0aW9uKGV4aXN0aW5nT3BlcmF0aW9uKTtcbiAgICAgIGlmIChleGlzdGluZ09wZXJhdGlvbi50eXBlID09PSBFbnRpdHlPcGVyYXRpb25UeXBlLkluc2VydCkge1xuICAgICAgICBpZiAoc3RvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHN0b3JlLmRlbGV0ZShwcmV2aW91cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZG9EZWxldGUocHJldmlvdXMsIHN0b3JlLCBtZXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21taXQgb3BlcmF0aW9ucyB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZG8gbXVjaFxuICAgKiBpbiBpdHNlbGYuIFRoZSBoYW5kbGVyIGl0IHJlY2VpdmVzIGRvZXMgdGhlIGhhcmQgd29yayBhbmQgaXQnc1xuICAgKiBpbXBsZW1lbnRhdGlvbiBpcyBsZWZ0IHRvIHRoZSBjYWxsZXIuIFRoaXMgbWV0aG9kIHNpbXBseSB3cmFwc1xuICAgKiB0aGUgaGFuZGxlciBpbnRvIGFuIGVycm9yIGNhdGNoaW5nIG1lY2hhbmlzbSB0byB1cGRhdGVcbiAgICogdGhlIHRyYW5zYWN0aW9uIGFmdGVyd2FyZC4gVGhlIGNhbGxlciBuZWVkcyB0byBzdWJzY3JpYmUgdG8gdGhpc1xuICAgKiBtZXRob2QncyBvdXRwdXQgKG9ic2VydmFibGUpIGZvciB0aGUgY29tbWl0IHRvIGJlIHBlcmZvcm1lZC5cbiAgICogQHBhcmFtIG9wZXJhdGlvbnMgT3BlcmF0aW9ucyB0byBjb21taXRcbiAgICogQHBhcmFtIGhhbmRsZXIgRnVuY3Rpb24gdGhhdCBoYW5kbGVzIHRoZSBjb21taXQgb3BlcmF0aW9uXG4gICAqIEByZXR1cm5zIFRoZSBoYW5kbGVyIG91dHB1dCAob2JzZXJ2YWJsZSlcbiAgICovXG4gIGNvbW1pdChcbiAgICBvcGVyYXRpb25zOiBFbnRpdHlPcGVyYXRpb25bXSxcbiAgICBoYW5kbGVyOiBFbnRpdHlUcmFuc2FjdGlvbkNvbW1pdEhhbmRsZXJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICB0aGlzLmluQ29tbWl0UGhhc2UkLm5leHQodHJ1ZSk7XG5cbiAgICByZXR1cm4gaGFuZGxlcih0aGlzLCBvcGVyYXRpb25zKS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihuZXcgRXJyb3IoKSkpLFxuICAgICAgdGFwKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICB0aGlzLm9uQ29tbWl0RXJyb3IoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uQ29tbWl0U3VjY2VzcyhvcGVyYXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdCBhbGwgdGhlIG9wZXJhdGlvbnMgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gaGFuZGxlciBGdW5jdGlvbiB0aGF0IGhhbmRsZXMgdGhlIGNvbW1pdCBvcGVyYXRpb25cbiAgICogQHJldHVybnMgVGhlIGhhbmRsZXIgb3V0cHV0IChvYnNlcnZhYmxlKVxuICAgKi9cbiAgY29tbWl0QWxsKGhhbmRsZXI6IEVudGl0eVRyYW5zYWN0aW9uQ29tbWl0SGFuZGxlcik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IHRoaXMuZ2V0T3BlcmF0aW9uc0luQ29tbWl0KCk7XG4gICAgcmV0dXJuIHRoaXMuY29tbWl0KG9wZXJhdGlvbnMsIGhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIHRoaXMgdHJhbnNhY3Rpb25cbiAgICovXG4gIHJvbGxiYWNrKCkge1xuICAgIHRoaXMucm9sbGJhY2tPcGVyYXRpb25zKHRoaXMub3BlcmF0aW9ucy5hbGwoKSk7XG4gIH1cblxuICAvKipcbiAgICogUm9sbGJhY2sgc3BlY2lmaWMgb3BlcmF0aW9uc1xuICAgKi9cbiAgcm9sbGJhY2tPcGVyYXRpb25zKG9wZXJhdGlvbnM6IEVudGl0eU9wZXJhdGlvbltdKSB7XG4gICAgdGhpcy5jaGVja0luQ29tbWl0UGhhc2UoKTtcblxuICAgIGNvbnN0IG9wZXJhdGlvbnNGYWN0b3J5ID0gKCkgPT5cbiAgICAgIG5ldyBNYXAoW1xuICAgICAgICBbRW50aXR5T3BlcmF0aW9uVHlwZS5EZWxldGUsIFtdXSxcbiAgICAgICAgW0VudGl0eU9wZXJhdGlvblR5cGUuVXBkYXRlLCBbXV0sXG4gICAgICAgIFtFbnRpdHlPcGVyYXRpb25UeXBlLkluc2VydCwgW11dXG4gICAgICBdKTtcbiAgICBjb25zdCBzdG9yZXNPcGVyYXRpb25zID0gbmV3IE1hcCgpO1xuXG4gICAgLy8gR3JvdXAgb3BlcmF0aW9ucyBieSBzdG9yZSBhbmQgYnkgb3BlcmF0aW9uIHR5cGUuXG4gICAgLy8gR3JvdXBpbmcgb3BlcmF0aW9ucyBhbGxvd3MgdXMgdG8gcmV2ZXJ0IHRoZW0gaW4gYmFjdGgsIHRodXMsIHRyaWdnZXJpbmdcbiAgICAvLyBvYnNlcnZhYmxlcyBvbmx5IG9uZSBwZXIgb3BlcmF0aW9uIHR5cGUuXG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgY29uc3Qgc3RvcmUgPSBvcGVyYXRpb24uc3RvcmU7XG4gICAgICBpZiAob3BlcmF0aW9uLnN0b3JlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBzdG9yZU9wZXJhdGlvbnMgPSBzdG9yZXNPcGVyYXRpb25zLmdldChzdG9yZSk7XG4gICAgICBpZiAoc3RvcmVPcGVyYXRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3RvcmVPcGVyYXRpb25zID0gb3BlcmF0aW9uc0ZhY3RvcnkoKTtcbiAgICAgICAgc3RvcmVzT3BlcmF0aW9ucy5zZXQoc3RvcmUsIHN0b3JlT3BlcmF0aW9ucyk7XG4gICAgICB9XG4gICAgICBzdG9yZU9wZXJhdGlvbnMuZ2V0KG9wZXJhdGlvbi50eXBlKS5wdXNoKG9wZXJhdGlvbik7XG4gICAgfVxuXG4gICAgQXJyYXkuZnJvbShzdG9yZXNPcGVyYXRpb25zLmtleXMoKSkuZm9yRWFjaChcbiAgICAgIChzdG9yZTogRW50aXR5U3RvcmU8b2JqZWN0PikgPT4ge1xuICAgICAgICBjb25zdCBzdG9yZU9wZXJhdGlvbnMgPSBzdG9yZXNPcGVyYXRpb25zLmdldChzdG9yZSk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlcyA9IHN0b3JlT3BlcmF0aW9ucy5nZXQoRW50aXR5T3BlcmF0aW9uVHlwZS5EZWxldGUpO1xuICAgICAgICBzdG9yZS5pbnNlcnRNYW55KFxuICAgICAgICAgIGRlbGV0ZXMubWFwKChfZGVsZXRlOiBFbnRpdHlPcGVyYXRpb24pID0+IF9kZWxldGUucHJldmlvdXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlcyA9IHN0b3JlT3BlcmF0aW9ucy5nZXQoRW50aXR5T3BlcmF0aW9uVHlwZS5VcGRhdGUpO1xuICAgICAgICBzdG9yZS51cGRhdGVNYW55KFxuICAgICAgICAgIHVwZGF0ZXMubWFwKChfdXBkYXRlOiBFbnRpdHlPcGVyYXRpb24pID0+IF91cGRhdGUucHJldmlvdXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaW5zZXJ0cyA9IHN0b3JlT3BlcmF0aW9ucy5nZXQoRW50aXR5T3BlcmF0aW9uVHlwZS5JbnNlcnQpO1xuICAgICAgICBzdG9yZS5kZWxldGVNYW55KFxuICAgICAgICAgIGluc2VydHMubWFwKChfaW5zZXJ0OiBFbnRpdHlPcGVyYXRpb24pID0+IF9pbnNlcnQuY3VycmVudClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5vcGVyYXRpb25zLmRlbGV0ZU1hbnkob3BlcmF0aW9ucyk7XG4gICAgdGhpcy5pbkNvbW1pdFBoYXNlJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGlzIHRyYW5zYWN0aW9uXG4gICAqIEB0b2RvIFJhaXNlIGV2ZW50IGFuZCBzeW5jaHJvbml6ZSBzdG9yZXM/XG4gICAqL1xuICBjbGVhcigpIHtcbiAgICB0aGlzLm9wZXJhdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLmluQ29tbWl0UGhhc2UkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbnkgZXhpc3Rpbmcgb3BlcmF0aW9uIG9uIGFuIGVudGl0eVxuICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eVxuICAgKiBAcmV0dXJucyBFaXRoZXIgYW4gaW5zZXJ0LCB1cGRhdGUgb3IgZGVsZXRlIG9wZXJhdGlvblxuICAgKi9cbiAgZ2V0T3BlcmF0aW9uQnlFbnRpdHkoZW50aXR5OiBvYmplY3QpOiBFbnRpdHlPcGVyYXRpb24ge1xuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbnMuZ2V0KHRoaXMuZ2V0S2V5KGVudGl0eSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIGFub3RoZXIgdHJhbnNhY3Rpb24gaW4gdGhpcyBvbmVcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIEFub3RoZXIgdHJhbnNhY3Rpb25cbiAgICovXG4gIG1lcmdlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IEVudGl0eVRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5jaGVja0luQ29tbWl0UGhhc2UoKTtcblxuICAgIGNvbnN0IG9wZXJhdGlvbnMgPSB0cmFuc2FjdGlvbi5vcGVyYXRpb25zLmFsbCgpO1xuICAgIG9wZXJhdGlvbnMuZm9yRWFjaCgob3BlcmF0aW9uOiBFbnRpdHlPcGVyYXRpb24pID0+IHtcbiAgICAgIHRoaXMuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGluc2VydCBvcGVyYXRpb24gYW5kIGFkZCBhbiBlbnRpdHkgdG8gdGhlIHN0b3JlXG4gICAqIEBwYXJhbSBjdXJyZW50IFRoZSBlbnRpdHkgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBzdG9yZSBPcHRpb25hbDogVGhlIHN0b3JlIHRvIGluc2VydCB0aGUgZW50aXR5IGludG9cbiAgICogQHBhcmFtIG1ldGEgT3B0aW9uYWw6IEFueSBtZXRhZGF0YSBvbiB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBwcml2YXRlIGRvSW5zZXJ0KFxuICAgIGN1cnJlbnQ6IG9iamVjdCxcbiAgICBzdG9yZT86IEVudGl0eVN0b3JlPG9iamVjdD4sXG4gICAgbWV0YT86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKSB7XG4gICAgdGhpcy5hZGRPcGVyYXRpb24oe1xuICAgICAga2V5OiB0aGlzLmdldEtleShjdXJyZW50KSxcbiAgICAgIHR5cGU6IEVudGl0eU9wZXJhdGlvblR5cGUuSW5zZXJ0LFxuICAgICAgcHJldmlvdXM6IHVuZGVmaW5lZCxcbiAgICAgIGN1cnJlbnQsXG4gICAgICBzdG9yZSxcbiAgICAgIG1ldGFcbiAgICB9KTtcblxuICAgIGlmIChzdG9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdG9yZS5pbnNlcnQoY3VycmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiB1cGRhdGUgb3BlcmF0aW9uIGFuZCB1cGRhdGUgYW4gZW50aXR5IGludG8gdGhlIHN0b3JlXG4gICAqIEBwYXJhbSBwcmV2aW91cyBUaGUgZW50aXR5IGJlZm9yZSB1cGRhdGVcbiAgICogQHBhcmFtIGN1cnJlbnQgVGhlIGVudGl0eSBhZnRlciB1cGRhdGVcbiAgICogQHBhcmFtIHN0b3JlIE9wdGlvbmFsOiBUaGUgc3RvcmUgdG8gdXBkYXRlIHRoZSBlbnRpdHkgaW50b1xuICAgKiBAcGFyYW0gbWV0YSBPcHRpb25hbDogQW55IG1ldGFkYXRhIG9uIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIHByaXZhdGUgZG9VcGRhdGUoXG4gICAgcHJldmlvdXM6IG9iamVjdCxcbiAgICBjdXJyZW50OiBvYmplY3QsXG4gICAgc3RvcmU/OiBFbnRpdHlTdG9yZTxvYmplY3Q+LFxuICAgIG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICkge1xuICAgIHRoaXMuYWRkT3BlcmF0aW9uKHtcbiAgICAgIGtleTogdGhpcy5nZXRLZXkoY3VycmVudCksXG4gICAgICB0eXBlOiBFbnRpdHlPcGVyYXRpb25UeXBlLlVwZGF0ZSxcbiAgICAgIHByZXZpb3VzLFxuICAgICAgY3VycmVudCxcbiAgICAgIHN0b3JlLFxuICAgICAgbWV0YVxuICAgIH0pO1xuXG4gICAgaWYgKHN0b3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0b3JlLnVwZGF0ZShjdXJyZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZGVsZXRlIG9wZXJhdGlvbiBhbmQgZGVsZXRlIGFuIGVudGl0eSBmcm9tIHRoZSBzdG9yZVxuICAgKiBAcGFyYW0gcHJldmlvdXMgVGhlIGVudGl0eSBiZWZvcmUgZGVsZXRlXG4gICAqIEBwYXJhbSBzdG9yZSBPcHRpb25hbDogVGhlIHN0b3JlIHRvIGRlbGV0ZSB0aGUgZW50aXR5IGZyb21cbiAgICogQHBhcmFtIG1ldGEgT3B0aW9uYWw6IEFueSBtZXRhZGF0YSBvbiB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBwcml2YXRlIGRvRGVsZXRlKFxuICAgIHByZXZpb3VzOiBvYmplY3QsXG4gICAgc3RvcmU/OiBFbnRpdHlTdG9yZTxvYmplY3Q+LFxuICAgIG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICkge1xuICAgIHRoaXMuYWRkT3BlcmF0aW9uKHtcbiAgICAgIGtleTogdGhpcy5nZXRLZXkocHJldmlvdXMpLFxuICAgICAgdHlwZTogRW50aXR5T3BlcmF0aW9uVHlwZS5EZWxldGUsXG4gICAgICBwcmV2aW91cyxcbiAgICAgIGN1cnJlbnQ6IHVuZGVmaW5lZCxcbiAgICAgIHN0b3JlLFxuICAgICAgbWV0YVxuICAgIH0pO1xuXG4gICAgaWYgKHN0b3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0b3JlLmRlbGV0ZShwcmV2aW91cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBjb21taXR0ZWQgb3BlcmF0aW9ucyBmcm9tIHN0b3JlXG4gICAqIEBwYXJhbSBvcGVyYXRpb25zIENvbW1pdGVkIG9wZXJhdGlvbnNcbiAgICogQHRvZG8gUmFpc2UgZXZlbnQgYW5kIHN5bmNocm9uaXplIHN0b3Jlcz9cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZU9wZXJhdGlvbnMob3BlcmF0aW9uczogRW50aXR5T3BlcmF0aW9uW10pIHtcbiAgICB0aGlzLm9wZXJhdGlvbnMuZGVsZXRlTWFueShvcGVyYXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBjb21taXQgc3VjY2VzcywgcmVzb2x2ZSBjb21taXRlZCBvcGVyYXRpb25zIGFuZCBleGl0IGNvbW1pdCBwaGFzZVxuICAgKiBAcGFyYW0gb3BlcmF0aW9ucyBDb21taXRlZCBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIG9uQ29tbWl0U3VjY2VzcyhvcGVyYXRpb25zOiBFbnRpdHlPcGVyYXRpb25bXSkge1xuICAgIHRoaXMucmVzb2x2ZU9wZXJhdGlvbnMob3BlcmF0aW9ucyk7XG4gICAgdGhpcy5pbkNvbW1pdFBoYXNlJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBjb21taXQgZXJyb3IsIGFib3J0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBvcGVyYXRpb25zIENvbW1pdGVkIG9wZXJhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgb25Db21taXRFcnJvcigpIHtcbiAgICB0aGlzLmluQ29tbWl0UGhhc2UkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBvcGVyYXRpb24gdG8gdGhlIG9wZXJhdGlvbnMgc3RvcmVcbiAgICogQHBhcmFtIG9wZXJhdGlvbiBPcGVyYXRpb24gdG8gYWRkXG4gICAqL1xuICBwcml2YXRlIGFkZE9wZXJhdGlvbihvcGVyYXRpb246IEVudGl0eU9wZXJhdGlvbikge1xuICAgIHRoaXMuY2hlY2tJbkNvbW1pdFBoYXNlKCk7XG5cbiAgICB0aGlzLm9wZXJhdGlvbnMuaW5zZXJ0KG9wZXJhdGlvbik7XG4gICAgdGhpcy5vcGVyYXRpb25zLnN0YXRlLnVwZGF0ZShvcGVyYXRpb24sIHsgYWRkZWQ6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIG9wZXJhdGlvbiBmcm9tIHRoZSBvcGVyYXRpb25zIHN0b3JlXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gT3BlcmF0aW9uIHRvIHJlbW92ZVxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVPcGVyYXRpb24ob3BlcmF0aW9uOiBFbnRpdHlPcGVyYXRpb24pIHtcbiAgICB0aGlzLmNoZWNrSW5Db21taXRQaGFzZSgpO1xuXG4gICAgdGhpcy5vcGVyYXRpb25zLmRlbGV0ZShvcGVyYXRpb24pO1xuICAgIHRoaXMub3BlcmF0aW9ucy5zdGF0ZS51cGRhdGUob3BlcmF0aW9uLCB7IGFkZGVkOiBmYWxzZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSBvcGVyYXRpb25zIHRvIGNvbW1pdFxuICAgKiBAcmV0dXJucyBPcGVyYXRpb25zIHRvIGNvbW1pdFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRPcGVyYXRpb25zSW5Db21taXQoKTogRW50aXR5T3BlcmF0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbnMuc3RhdGVWaWV3XG4gICAgICAubWFueUJ5KFxuICAgICAgICAodmFsdWU6IHsgZW50aXR5OiBFbnRpdHlPcGVyYXRpb247IHN0YXRlOiBFbnRpdHlPcGVyYXRpb25TdGF0ZSB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnN0YXRlLmFkZGVkID09PSB0cnVlO1xuICAgICAgICB9XG4gICAgICApXG4gICAgICAubWFwKFxuICAgICAgICAodmFsdWU6IHsgZW50aXR5OiBFbnRpdHlPcGVyYXRpb247IHN0YXRlOiBFbnRpdHlPcGVyYXRpb25TdGF0ZSB9KSA9PlxuICAgICAgICAgIHZhbHVlLmVudGl0eVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgaW4gdGhlIGNvbW1pdCBwaGFzZSBhbmQgdGhyb3cgYW4gZXJyb3IgaWYgaXQgaXNcbiAgICovXG4gIHByaXZhdGUgY2hlY2tJbkNvbW1pdFBoYXNlKCkge1xuICAgIGlmICh0aGlzLmluQ29tbWl0UGhhc2UgPT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoaXMgdHJhbnNhY3Rpb24gaXMgaW4gdGhlIGNvbW1pdCBwaGFzZS4gQ2Fubm90IGNvbXBsZXRlIHRoaXMgb3BlcmF0aW9uLidcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=