@igo2/common 17.0.0-next.6 → 17.0.0-next.8

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 (815) hide show
  1. package/action/index.d.ts +5 -0
  2. package/action/public_api.d.ts +4 -0
  3. package/action/shared/action.interfaces.d.ts +18 -0
  4. package/action/shared/store.d.ts +8 -0
  5. package/backdrop/index.d.ts +5 -0
  6. package/backdrop/public_api.d.ts +2 -0
  7. package/badge/index.d.ts +5 -0
  8. package/badge/public_api.d.ts +2 -0
  9. package/clickout/index.d.ts +5 -0
  10. package/clickout/public_api.d.ts +2 -0
  11. package/clone/index.d.ts +5 -0
  12. package/clone/public_api.d.ts +2 -0
  13. package/collapsible/index.d.ts +5 -0
  14. package/collapsible/public_api.d.ts +6 -0
  15. package/color/color-picker-form-field/index.d.ts +2 -0
  16. package/color/index.d.ts +5 -0
  17. package/color/public_api.d.ts +1 -0
  18. package/confirm-dialog/index.d.ts +5 -0
  19. package/confirm-dialog/public_api.d.ts +4 -0
  20. package/context-menu/index.d.ts +5 -0
  21. package/context-menu/public_api.d.ts +6 -0
  22. package/custom-html/index.d.ts +5 -0
  23. package/custom-html/public_api.d.ts +6 -0
  24. package/dom/index.d.ts +5 -0
  25. package/dom/public_api.d.ts +3 -0
  26. package/drag-drop/index.d.ts +5 -0
  27. package/drag-drop/public_api.d.ts +2 -0
  28. package/dynamic-component/index.d.ts +5 -0
  29. package/dynamic-component/public_api.d.ts +4 -0
  30. package/entity/entity-selector/index.d.ts +2 -0
  31. package/entity/entity-table/index.d.ts +2 -0
  32. package/entity/entity-table-paginator/index.d.ts +3 -0
  33. package/entity/entity.module.d.ts +16 -0
  34. package/entity/index.d.ts +5 -0
  35. package/entity/public_api.d.ts +5 -0
  36. package/environment/index.d.ts +5 -0
  37. package/esm2022/action/action.module.mjs +19 -0
  38. package/esm2022/action/actionbar/actionbar-item.component.mjs +192 -0
  39. package/esm2022/action/actionbar/actionbar.component.mjs +277 -0
  40. package/esm2022/action/actionbar/actionbar.module.mjs +19 -0
  41. package/esm2022/action/igo2-common-action.mjs +5 -0
  42. package/esm2022/action/public_api.mjs +5 -0
  43. package/esm2022/action/shared/action.enums.mjs +7 -0
  44. package/esm2022/action/shared/action.interfaces.mjs +2 -0
  45. package/esm2022/action/shared/index.mjs +4 -0
  46. package/esm2022/action/shared/store.mjs +8 -0
  47. package/esm2022/backdrop/backdrop.component.mjs +22 -0
  48. package/esm2022/backdrop/backdrop.module.mjs +25 -0
  49. package/esm2022/backdrop/igo2-common-backdrop.mjs +5 -0
  50. package/esm2022/backdrop/public_api.mjs +3 -0
  51. package/esm2022/badge/badge-icon.directive.mjs +149 -0
  52. package/esm2022/badge/badge-icon.module.mjs +25 -0
  53. package/esm2022/badge/igo2-common-badge.mjs +5 -0
  54. package/esm2022/badge/public_api.mjs +3 -0
  55. package/esm2022/clickout/clickout.directive.mjs +32 -0
  56. package/esm2022/clickout/clickout.module.mjs +25 -0
  57. package/esm2022/clickout/igo2-common-clickout.mjs +5 -0
  58. package/esm2022/clickout/public_api.mjs +3 -0
  59. package/esm2022/clone/clone.module.mjs +25 -0
  60. package/esm2022/clone/clone.pipe.mjs +25 -0
  61. package/esm2022/clone/igo2-common-clone.mjs +5 -0
  62. package/esm2022/clone/public_api.mjs +3 -0
  63. package/esm2022/collapsible/collapse.directive.mjs +57 -0
  64. package/esm2022/collapsible/collapsible.component.mjs +38 -0
  65. package/esm2022/collapsible/collapsible.module.mjs +26 -0
  66. package/esm2022/collapsible/igo2-common-collapsible.mjs +5 -0
  67. package/esm2022/collapsible/public_api.mjs +10 -0
  68. package/esm2022/color/color-picker-form-field/color-picker-form-field.component.mjs +104 -0
  69. package/esm2022/color/color-picker-form-field/color-picker-form-field.module.mjs +19 -0
  70. package/esm2022/color/color-picker-form-field/index.mjs +3 -0
  71. package/esm2022/color/igo2-common-color.mjs +5 -0
  72. package/esm2022/color/public_api.mjs +2 -0
  73. package/esm2022/confirm-dialog/confirm-dialog.component.mjs +31 -0
  74. package/esm2022/confirm-dialog/confirm-dialog.interface.mjs +2 -0
  75. package/esm2022/confirm-dialog/confirm-dialog.module.mjs +27 -0
  76. package/esm2022/confirm-dialog/confirm-dialog.service.mjs +35 -0
  77. package/esm2022/confirm-dialog/igo2-common-confirm-dialog.mjs +5 -0
  78. package/esm2022/confirm-dialog/public_api.mjs +5 -0
  79. package/esm2022/context-menu/context-menu.directive.mjs +109 -0
  80. package/esm2022/context-menu/context-menu.module.mjs +26 -0
  81. package/esm2022/context-menu/igo2-common-context-menu.mjs +5 -0
  82. package/esm2022/context-menu/long-press.directive.mjs +66 -0
  83. package/esm2022/context-menu/public_api.mjs +10 -0
  84. package/esm2022/custom-html/custom-html.component.mjs +22 -0
  85. package/esm2022/custom-html/custom-html.module.mjs +25 -0
  86. package/esm2022/custom-html/custom-html.pipe.mjs +23 -0
  87. package/esm2022/custom-html/igo2-common-custom-html.mjs +5 -0
  88. package/esm2022/custom-html/public_api.mjs +10 -0
  89. package/esm2022/dom/dom.interfaces.mjs +2 -0
  90. package/esm2022/dom/dom.module.mjs +27 -0
  91. package/esm2022/dom/dom.service.mjs +35 -0
  92. package/esm2022/dom/igo2-common-dom.mjs +5 -0
  93. package/esm2022/dom/public_api.mjs +4 -0
  94. package/esm2022/drag-drop/drag-drop.directive.mjs +82 -0
  95. package/esm2022/drag-drop/drag-drop.module.mjs +25 -0
  96. package/esm2022/drag-drop/igo2-common-drag-drop.mjs +5 -0
  97. package/esm2022/drag-drop/public_api.mjs +3 -0
  98. package/esm2022/dynamic-component/dynamic-component.module.mjs +19 -0
  99. package/esm2022/dynamic-component/dynamic-outlet/dynamic-outlet.component.mjs +129 -0
  100. package/esm2022/dynamic-component/dynamic-outlet/dynamic-outlet.module.mjs +19 -0
  101. package/esm2022/dynamic-component/igo2-common-dynamic-component.mjs +5 -0
  102. package/esm2022/dynamic-component/public_api.mjs +5 -0
  103. package/esm2022/dynamic-component/shared/dynamic-component.interfaces.mjs +2 -0
  104. package/esm2022/dynamic-component/shared/dynamic-component.mjs +183 -0
  105. package/esm2022/dynamic-component/shared/dynamic-component.service.mjs +30 -0
  106. package/esm2022/dynamic-component/shared/index.mjs +4 -0
  107. package/esm2022/entity/entity-selector/entity-selector.component.mjs +174 -0
  108. package/esm2022/entity/entity-selector/entity-selector.module.mjs +19 -0
  109. package/esm2022/entity/entity-selector/index.mjs +3 -0
  110. package/esm2022/entity/entity-table/entity-table-row.directive.mjs +138 -0
  111. package/esm2022/entity/entity-table/entity-table.component.mjs +883 -0
  112. package/esm2022/entity/entity-table/entity-table.module.mjs +19 -0
  113. package/esm2022/entity/entity-table/index.mjs +3 -0
  114. package/esm2022/entity/entity-table-paginator/entity-table-paginator.component.mjs +158 -0
  115. package/esm2022/entity/entity-table-paginator/entity-table-paginator.interface.mjs +2 -0
  116. package/esm2022/entity/entity-table-paginator/entity-table-paginator.module.mjs +19 -0
  117. package/esm2022/entity/entity-table-paginator/index.mjs +4 -0
  118. package/esm2022/entity/entity.module.mjs +30 -0
  119. package/esm2022/entity/igo2-common-entity.mjs +5 -0
  120. package/esm2022/entity/public_api.mjs +6 -0
  121. package/esm2022/entity/shared/entity.enums.mjs +28 -0
  122. package/esm2022/entity/shared/entity.interfaces.mjs +2 -0
  123. package/esm2022/entity/shared/entity.utils.mjs +73 -0
  124. package/esm2022/entity/shared/index.mjs +10 -0
  125. package/esm2022/entity/shared/state.mjs +194 -0
  126. package/esm2022/entity/shared/store.mjs +322 -0
  127. package/esm2022/entity/shared/strategies/filter-custom-function.mjs +80 -0
  128. package/esm2022/entity/shared/strategies/filter-selection.mjs +81 -0
  129. package/esm2022/entity/shared/strategies/index.mjs +4 -0
  130. package/esm2022/entity/shared/strategies/strategy.mjs +78 -0
  131. package/esm2022/entity/shared/transaction.mjs +329 -0
  132. package/esm2022/entity/shared/view.mjs +330 -0
  133. package/esm2022/entity/shared/watcher.mjs +135 -0
  134. package/esm2022/environment/environment.interface.mjs +2 -0
  135. package/esm2022/environment/igo2-common-environment.mjs +5 -0
  136. package/esm2022/environment/public_api.mjs +2 -0
  137. package/esm2022/flexible/flexible.component.mjs +135 -0
  138. package/esm2022/flexible/flexible.module.mjs +25 -0
  139. package/esm2022/flexible/flexible.type.mjs +2 -0
  140. package/esm2022/flexible/igo2-common-flexible.mjs +5 -0
  141. package/esm2022/flexible/public_api.mjs +4 -0
  142. package/esm2022/form/form/form.component.mjs +103 -0
  143. package/esm2022/form/form/form.module.mjs +19 -0
  144. package/esm2022/form/form/index.mjs +3 -0
  145. package/esm2022/form/form-dialog/form-dialog.component.mjs +94 -0
  146. package/esm2022/form/form-dialog/form-dialog.interface.mjs +2 -0
  147. package/esm2022/form/form-dialog/form-dialog.module.mjs +31 -0
  148. package/esm2022/form/form-dialog/form-dialog.service.mjs +30 -0
  149. package/esm2022/form/form-dialog/index.mjs +5 -0
  150. package/esm2022/form/form-field/form-field-select.component.mjs +117 -0
  151. package/esm2022/form/form-field/form-field-text.component.mjs +126 -0
  152. package/esm2022/form/form-field/form-field-textarea.component.mjs +95 -0
  153. package/esm2022/form/form-field/form-field.component.mjs +65 -0
  154. package/esm2022/form/form-field/form-field.directive.mjs +11 -0
  155. package/esm2022/form/form-field/form-field.module.mjs +23 -0
  156. package/esm2022/form/form-field/index.mjs +7 -0
  157. package/esm2022/form/form-group/form-group.component.mjs +82 -0
  158. package/esm2022/form/form-group/form-group.module.mjs +19 -0
  159. package/esm2022/form/form-group/index.mjs +3 -0
  160. package/esm2022/form/form.module.mjs +32 -0
  161. package/esm2022/form/igo2-common-form.mjs +5 -0
  162. package/esm2022/form/public_api.mjs +7 -0
  163. package/esm2022/form/shared/form-field-component.mjs +7 -0
  164. package/esm2022/form/shared/form-field.service.mjs +29 -0
  165. package/esm2022/form/shared/form.interfaces.mjs +2 -0
  166. package/esm2022/form/shared/form.service.mjs +82 -0
  167. package/esm2022/form/shared/form.utils.mjs +41 -0
  168. package/esm2022/form/shared/index.mjs +6 -0
  169. package/esm2022/home-button/home-button.component.mjs +26 -0
  170. package/esm2022/home-button/home-button.module.mjs +19 -0
  171. package/esm2022/home-button/igo2-common-home-button.mjs +5 -0
  172. package/esm2022/home-button/public_api.mjs +3 -0
  173. package/esm2022/icon/icon/icon.component.mjs +38 -0
  174. package/esm2022/icon/icon.provider.mjs +14 -0
  175. package/esm2022/icon/igo2-common-icon.mjs +5 -0
  176. package/esm2022/icon/public_api.mjs +4 -0
  177. package/esm2022/icon/shared/icon.interface.mjs +2 -0
  178. package/esm2022/icon/shared/icon.service.mjs +26 -0
  179. package/esm2022/icon/shared/icons.mjs +32 -0
  180. package/esm2022/icon/shared/index.mjs +4 -0
  181. package/esm2022/image/igo2-common-image.mjs +5 -0
  182. package/esm2022/image/image-error.directive.mjs +35 -0
  183. package/esm2022/image/image.module.mjs +26 -0
  184. package/esm2022/image/public_api.mjs +7 -0
  185. package/esm2022/image/secure-image.pipe.mjs +66 -0
  186. package/esm2022/interactive-tour/igo2-common-interactive-tour.mjs +5 -0
  187. package/esm2022/interactive-tour/interactive-tour.component.mjs +133 -0
  188. package/esm2022/interactive-tour/interactive-tour.interface.mjs +2 -0
  189. package/esm2022/interactive-tour/interactive-tour.loader.mjs +49 -0
  190. package/esm2022/interactive-tour/interactive-tour.module.mjs +19 -0
  191. package/esm2022/interactive-tour/interactive-tour.service.mjs +303 -0
  192. package/esm2022/interactive-tour/public_api.mjs +6 -0
  193. package/esm2022/json-dialog/igo2-common-json-dialog.mjs +5 -0
  194. package/esm2022/json-dialog/json-dialog.component.mjs +38 -0
  195. package/esm2022/json-dialog/json-dialog.module.mjs +26 -0
  196. package/esm2022/json-dialog/json-dialog.service.mjs +26 -0
  197. package/esm2022/json-dialog/public_api.mjs +4 -0
  198. package/esm2022/keyvalue/igo2-common-keyvalue.mjs +5 -0
  199. package/esm2022/keyvalue/keyvalue.module.mjs +25 -0
  200. package/esm2022/keyvalue/keyvalue.pipe.mjs +19 -0
  201. package/esm2022/keyvalue/public_api.mjs +3 -0
  202. package/esm2022/list/igo2-common-list.mjs +5 -0
  203. package/esm2022/list/list-item.directive.mjs +166 -0
  204. package/esm2022/list/list.component.mjs +252 -0
  205. package/esm2022/list/list.module.mjs +26 -0
  206. package/esm2022/list/public_api.mjs +7 -0
  207. package/esm2022/panel/igo2-common-panel.mjs +5 -0
  208. package/esm2022/panel/panel.component.mjs +30 -0
  209. package/esm2022/panel/panel.module.mjs +19 -0
  210. package/esm2022/panel/public_api.mjs +3 -0
  211. package/esm2022/public_api.mjs +17 -79
  212. package/esm2022/select-value-dialog/igo2-common-select-value-dialog.mjs +5 -0
  213. package/esm2022/select-value-dialog/public_api.mjs +6 -0
  214. package/esm2022/select-value-dialog/select-value-check-radio-dialog.component.mjs +103 -0
  215. package/esm2022/select-value-dialog/select-value-dialog.enums.mjs +6 -0
  216. package/esm2022/select-value-dialog/select-value-dialog.interface.mjs +2 -0
  217. package/esm2022/select-value-dialog/select-value-dialog.module.mjs +27 -0
  218. package/esm2022/select-value-dialog/select-value-dialog.service.mjs +29 -0
  219. package/esm2022/sidenav/igo2-common-sidenav.mjs +5 -0
  220. package/esm2022/sidenav/public_api.mjs +3 -0
  221. package/esm2022/sidenav/sidenav-shim.directive.mjs +58 -0
  222. package/esm2022/sidenav/sidenav.module.mjs +25 -0
  223. package/esm2022/spinner/igo2-common-spinner.mjs +5 -0
  224. package/esm2022/spinner/public_api.mjs +4 -0
  225. package/esm2022/spinner/spinner-activity.directive.mjs +56 -0
  226. package/esm2022/spinner/spinner.component.mjs +30 -0
  227. package/esm2022/spinner/spinner.module.mjs +26 -0
  228. package/esm2022/stop-propagation/igo2-common-stop-propagation.mjs +5 -0
  229. package/esm2022/stop-propagation/public_api.mjs +10 -0
  230. package/esm2022/stop-propagation/stop-drop-propagation.directive.mjs +21 -0
  231. package/esm2022/stop-propagation/stop-propagation.directive.mjs +20 -0
  232. package/esm2022/stop-propagation/stop-propagation.module.mjs +26 -0
  233. package/esm2022/table/igo2-common-table.mjs +5 -0
  234. package/esm2022/table/public_api.mjs +7 -0
  235. package/esm2022/table/table-action-color.enum.mjs +7 -0
  236. package/esm2022/table/table-database.mjs +28 -0
  237. package/esm2022/table/table-datasource.mjs +64 -0
  238. package/esm2022/table/table-model.interface.mjs +2 -0
  239. package/esm2022/table/table.component.mjs +143 -0
  240. package/esm2022/table/table.module.mjs +25 -0
  241. package/esm2022/tool/igo2-common-tool.mjs +5 -0
  242. package/esm2022/tool/public_api.mjs +4 -0
  243. package/esm2022/tool/shared/index.mjs +6 -0
  244. package/esm2022/tool/shared/tool-component.mjs +9 -0
  245. package/esm2022/tool/shared/tool.interface.mjs +2 -0
  246. package/esm2022/tool/shared/tool.service.mjs +43 -0
  247. package/esm2022/tool/shared/toolbox.enums.mjs +2 -0
  248. package/esm2022/tool/shared/toolbox.mjs +192 -0
  249. package/esm2022/tool/tool.module.mjs +28 -0
  250. package/esm2022/tool/toolbox/index.mjs +3 -0
  251. package/esm2022/tool/toolbox/toolbox.animation.mjs +10 -0
  252. package/esm2022/tool/toolbox/toolbox.component.mjs +241 -0
  253. package/esm2022/tool/toolbox/toolbox.module.mjs +19 -0
  254. package/esm2022/widget/igo2-common-widget.mjs +5 -0
  255. package/esm2022/widget/public_api.mjs +4 -0
  256. package/esm2022/widget/shared/index.mjs +4 -0
  257. package/esm2022/widget/shared/widget.interfaces.mjs +2 -0
  258. package/esm2022/widget/shared/widget.mjs +4 -0
  259. package/esm2022/widget/shared/widget.service.mjs +22 -0
  260. package/esm2022/widget/widget-outlet/index.mjs +3 -0
  261. package/esm2022/widget/widget-outlet/widget-outlet.component.mjs +113 -0
  262. package/esm2022/widget/widget-outlet/widget-outlet.module.mjs +19 -0
  263. package/esm2022/widget/widget.module.mjs +22 -0
  264. package/esm2022/workspace/igo2-common-workspace.mjs +5 -0
  265. package/esm2022/workspace/public_api.mjs +5 -0
  266. package/esm2022/workspace/shared/index.mjs +4 -0
  267. package/esm2022/workspace/shared/store.mjs +37 -0
  268. package/esm2022/workspace/shared/workspace.interfaces.mjs +2 -0
  269. package/esm2022/workspace/shared/workspace.mjs +143 -0
  270. package/esm2022/workspace/workspace-selector/index.mjs +3 -0
  271. package/esm2022/workspace/workspace-selector/workspace-selector.component.mjs +51 -0
  272. package/esm2022/workspace/workspace-selector/workspace-selector.module.mjs +19 -0
  273. package/esm2022/workspace/workspace-widget-outlet/index.mjs +3 -0
  274. package/esm2022/workspace/workspace-widget-outlet/workspace-widget-outlet.component.mjs +74 -0
  275. package/esm2022/workspace/workspace-widget-outlet/workspace-widget-outlet.module.mjs +19 -0
  276. package/esm2022/workspace/workspace.module.mjs +27 -0
  277. package/fesm2022/igo2-common-action.mjs +505 -0
  278. package/fesm2022/igo2-common-action.mjs.map +1 -0
  279. package/fesm2022/igo2-common-backdrop.mjs +51 -0
  280. package/fesm2022/igo2-common-backdrop.mjs.map +1 -0
  281. package/fesm2022/igo2-common-badge.mjs +178 -0
  282. package/fesm2022/igo2-common-badge.mjs.map +1 -0
  283. package/fesm2022/igo2-common-clickout.mjs +61 -0
  284. package/fesm2022/igo2-common-clickout.mjs.map +1 -0
  285. package/fesm2022/igo2-common-clone.mjs +54 -0
  286. package/fesm2022/igo2-common-clone.mjs.map +1 -0
  287. package/fesm2022/igo2-common-collapsible.mjs +126 -0
  288. package/fesm2022/igo2-common-collapsible.mjs.map +1 -0
  289. package/fesm2022/igo2-common-color.mjs +127 -0
  290. package/fesm2022/igo2-common-color.mjs.map +1 -0
  291. package/fesm2022/igo2-common-confirm-dialog.mjs +91 -0
  292. package/fesm2022/igo2-common-confirm-dialog.mjs.map +1 -0
  293. package/fesm2022/igo2-common-context-menu.mjs +206 -0
  294. package/fesm2022/igo2-common-context-menu.mjs.map +1 -0
  295. package/fesm2022/igo2-common-custom-html.mjs +74 -0
  296. package/fesm2022/igo2-common-custom-html.mjs.map +1 -0
  297. package/fesm2022/igo2-common-dom.mjs +65 -0
  298. package/fesm2022/igo2-common-dom.mjs.map +1 -0
  299. package/fesm2022/igo2-common-drag-drop.mjs +111 -0
  300. package/fesm2022/igo2-common-drag-drop.mjs.map +1 -0
  301. package/fesm2022/igo2-common-dynamic-component.mjs +375 -0
  302. package/fesm2022/igo2-common-dynamic-component.mjs.map +1 -0
  303. package/fesm2022/igo2-common-entity.mjs +3036 -0
  304. package/fesm2022/igo2-common-entity.mjs.map +1 -0
  305. package/fesm2022/igo2-common-environment.mjs +4 -0
  306. package/fesm2022/igo2-common-environment.mjs.map +1 -0
  307. package/fesm2022/igo2-common-flexible.mjs +163 -0
  308. package/fesm2022/igo2-common-flexible.mjs.map +1 -0
  309. package/fesm2022/igo2-common-form.mjs +898 -0
  310. package/fesm2022/igo2-common-form.mjs.map +1 -0
  311. package/fesm2022/igo2-common-home-button.mjs +49 -0
  312. package/fesm2022/igo2-common-home-button.mjs.map +1 -0
  313. package/fesm2022/igo2-common-icon.mjs +108 -0
  314. package/fesm2022/igo2-common-icon.mjs.map +1 -0
  315. package/fesm2022/igo2-common-image.mjs +129 -0
  316. package/fesm2022/igo2-common-image.mjs.map +1 -0
  317. package/fesm2022/igo2-common-interactive-tour.mjs +490 -0
  318. package/fesm2022/igo2-common-interactive-tour.mjs.map +1 -0
  319. package/fesm2022/igo2-common-json-dialog.mjs +88 -0
  320. package/fesm2022/igo2-common-json-dialog.mjs.map +1 -0
  321. package/fesm2022/igo2-common-keyvalue.mjs +48 -0
  322. package/fesm2022/igo2-common-keyvalue.mjs.map +1 -0
  323. package/fesm2022/igo2-common-list.mjs +446 -0
  324. package/fesm2022/igo2-common-list.mjs.map +1 -0
  325. package/fesm2022/igo2-common-panel.mjs +53 -0
  326. package/fesm2022/igo2-common-panel.mjs.map +1 -0
  327. package/fesm2022/igo2-common-select-value-dialog.mjs +161 -0
  328. package/fesm2022/igo2-common-select-value-dialog.mjs.map +1 -0
  329. package/fesm2022/igo2-common-sidenav.mjs +86 -0
  330. package/fesm2022/igo2-common-sidenav.mjs.map +1 -0
  331. package/fesm2022/igo2-common-spinner.mjs +110 -0
  332. package/fesm2022/igo2-common-spinner.mjs.map +1 -0
  333. package/fesm2022/igo2-common-stop-propagation.mjs +73 -0
  334. package/fesm2022/igo2-common-stop-propagation.mjs.map +1 -0
  335. package/fesm2022/igo2-common-table.mjs +264 -0
  336. package/fesm2022/igo2-common-table.mjs.map +1 -0
  337. package/fesm2022/igo2-common-tool.mjs +535 -0
  338. package/fesm2022/igo2-common-tool.mjs.map +1 -0
  339. package/fesm2022/igo2-common-widget.mjs +176 -0
  340. package/fesm2022/igo2-common-widget.mjs.map +1 -0
  341. package/fesm2022/igo2-common-workspace.mjs +361 -0
  342. package/fesm2022/igo2-common-workspace.mjs.map +1 -0
  343. package/fesm2022/igo2-common.mjs +16 -8817
  344. package/fesm2022/igo2-common.mjs.map +1 -1
  345. package/flexible/index.d.ts +5 -0
  346. package/flexible/public_api.d.ts +3 -0
  347. package/form/form/index.d.ts +2 -0
  348. package/form/form-dialog/form-dialog.component.d.ts +23 -0
  349. package/form/form-dialog/form-dialog.interface.d.ts +18 -0
  350. package/form/form-dialog/index.d.ts +4 -0
  351. package/form/form-field/form-field.directive.d.ts +5 -0
  352. package/form/form-field/index.d.ts +6 -0
  353. package/form/form-group/index.d.ts +2 -0
  354. package/form/form.module.d.ts +18 -0
  355. package/form/index.d.ts +5 -0
  356. package/form/public_api.d.ts +6 -0
  357. package/home-button/index.d.ts +5 -0
  358. package/home-button/public_api.d.ts +2 -0
  359. package/icon/icon/icon.component.d.ts +14 -0
  360. package/icon/index.d.ts +5 -0
  361. package/icon/shared/icon.service.d.ts +12 -0
  362. package/icon/shared/icons.d.ts +9 -0
  363. package/icon/shared/index.d.ts +3 -0
  364. package/image/index.d.ts +5 -0
  365. package/image/public_api.d.ts +6 -0
  366. package/interactive-tour/index.d.ts +5 -0
  367. package/interactive-tour/interactive-tour.component.d.ts +33 -0
  368. package/interactive-tour/public_api.d.ts +5 -0
  369. package/json-dialog/index.d.ts +5 -0
  370. package/json-dialog/public_api.d.ts +3 -0
  371. package/keyvalue/index.d.ts +5 -0
  372. package/keyvalue/public_api.d.ts +2 -0
  373. package/list/index.d.ts +5 -0
  374. package/list/public_api.d.ts +6 -0
  375. package/package.json +201 -3
  376. package/panel/index.d.ts +5 -0
  377. package/panel/public_api.d.ts +2 -0
  378. package/public_api.d.ts +16 -78
  379. package/select-value-dialog/index.d.ts +5 -0
  380. package/select-value-dialog/public_api.d.ts +5 -0
  381. package/sidenav/index.d.ts +5 -0
  382. package/sidenav/public_api.d.ts +2 -0
  383. package/spinner/index.d.ts +5 -0
  384. package/spinner/public_api.d.ts +3 -0
  385. package/spinner/spinner.module.d.ts +14 -0
  386. package/src/common-theme.scss +8 -8
  387. package/stop-propagation/index.d.ts +5 -0
  388. package/stop-propagation/public_api.d.ts +6 -0
  389. package/table/index.d.ts +5 -0
  390. package/table/public_api.d.ts +6 -0
  391. package/tool/index.d.ts +5 -0
  392. package/tool/public_api.d.ts +3 -0
  393. package/tool/shared/tool.interface.d.ts +18 -0
  394. package/tool/shared/toolbox.d.ts +98 -0
  395. package/tool/toolbox/index.d.ts +2 -0
  396. package/tool/toolbox/toolbox.component.d.ts +128 -0
  397. package/widget/index.d.ts +5 -0
  398. package/widget/public_api.d.ts +3 -0
  399. package/widget/shared/widget.d.ts +4 -0
  400. package/widget/shared/widget.service.d.ts +10 -0
  401. package/widget/widget-outlet/index.d.ts +2 -0
  402. package/widget/widget-outlet/widget-outlet.component.d.ts +71 -0
  403. package/workspace/index.d.ts +5 -0
  404. package/workspace/public_api.d.ts +4 -0
  405. package/workspace/shared/store.d.ts +20 -0
  406. package/workspace/shared/workspace.d.ts +108 -0
  407. package/workspace/shared/workspace.interfaces.d.ts +11 -0
  408. package/workspace/workspace-selector/index.d.ts +2 -0
  409. package/workspace/workspace-selector/workspace-selector.component.d.ts +38 -0
  410. package/workspace/workspace-widget-outlet/index.d.ts +2 -0
  411. package/workspace/workspace-widget-outlet/workspace-widget-outlet.component.d.ts +57 -0
  412. package/workspace/workspace.module.d.ts +14 -0
  413. package/esm2022/lib/action/action.module.mjs +0 -19
  414. package/esm2022/lib/action/actionbar/actionbar-item.component.mjs +0 -192
  415. package/esm2022/lib/action/actionbar/actionbar.component.mjs +0 -277
  416. package/esm2022/lib/action/actionbar/actionbar.module.mjs +0 -19
  417. package/esm2022/lib/action/index.mjs +0 -3
  418. package/esm2022/lib/action/shared/action.enums.mjs +0 -7
  419. package/esm2022/lib/action/shared/action.interfaces.mjs +0 -2
  420. package/esm2022/lib/action/shared/index.mjs +0 -4
  421. package/esm2022/lib/action/shared/store.mjs +0 -8
  422. package/esm2022/lib/backdrop/backdrop.component.mjs +0 -22
  423. package/esm2022/lib/backdrop/backdrop.module.mjs +0 -25
  424. package/esm2022/lib/backdrop/index.mjs +0 -2
  425. package/esm2022/lib/badge-icon/badge-icon.directive.mjs +0 -149
  426. package/esm2022/lib/badge-icon/badge-icon.module.mjs +0 -25
  427. package/esm2022/lib/badge-icon/index.mjs +0 -2
  428. package/esm2022/lib/clickout/clickout.directive.mjs +0 -32
  429. package/esm2022/lib/clickout/clickout.module.mjs +0 -25
  430. package/esm2022/lib/clickout/index.mjs +0 -2
  431. package/esm2022/lib/clone/clone.module.mjs +0 -25
  432. package/esm2022/lib/clone/clone.pipe.mjs +0 -25
  433. package/esm2022/lib/clone/index.mjs +0 -2
  434. package/esm2022/lib/collapsible/collapse.directive.mjs +0 -57
  435. package/esm2022/lib/collapsible/collapsible.component.mjs +0 -38
  436. package/esm2022/lib/collapsible/collapsible.module.mjs +0 -26
  437. package/esm2022/lib/collapsible/index.mjs +0 -9
  438. package/esm2022/lib/color-picker-form-field/color-picker-form-field.component.mjs +0 -104
  439. package/esm2022/lib/color-picker-form-field/color-picker-form-field.module.mjs +0 -19
  440. package/esm2022/lib/color-picker-form-field/index.mjs +0 -2
  441. package/esm2022/lib/confirm-dialog/confirm-dialog.component.mjs +0 -31
  442. package/esm2022/lib/confirm-dialog/confirm-dialog.interface.mjs +0 -2
  443. package/esm2022/lib/confirm-dialog/confirm-dialog.module.mjs +0 -27
  444. package/esm2022/lib/confirm-dialog/confirm-dialog.service.mjs +0 -35
  445. package/esm2022/lib/confirm-dialog/index.mjs +0 -4
  446. package/esm2022/lib/context-menu/context-menu.directive.mjs +0 -109
  447. package/esm2022/lib/context-menu/context-menu.module.mjs +0 -26
  448. package/esm2022/lib/context-menu/index.mjs +0 -9
  449. package/esm2022/lib/context-menu/long-press.directive.mjs +0 -66
  450. package/esm2022/lib/custom-html/custom-html.component.mjs +0 -22
  451. package/esm2022/lib/custom-html/custom-html.module.mjs +0 -25
  452. package/esm2022/lib/custom-html/custom-html.pipe.mjs +0 -23
  453. package/esm2022/lib/custom-html/index.mjs +0 -9
  454. package/esm2022/lib/dom/dom.interfaces.mjs +0 -2
  455. package/esm2022/lib/dom/dom.module.mjs +0 -27
  456. package/esm2022/lib/dom/dom.service.mjs +0 -35
  457. package/esm2022/lib/dom/index.mjs +0 -3
  458. package/esm2022/lib/drag-drop/drag-drop.directive.mjs +0 -82
  459. package/esm2022/lib/drag-drop/drag-drop.module.mjs +0 -25
  460. package/esm2022/lib/drag-drop/index.mjs +0 -2
  461. package/esm2022/lib/dynamic-component/dynamic-component.module.mjs +0 -19
  462. package/esm2022/lib/dynamic-component/dynamic-outlet/dynamic-outlet.component.mjs +0 -129
  463. package/esm2022/lib/dynamic-component/dynamic-outlet/dynamic-outlet.module.mjs +0 -19
  464. package/esm2022/lib/dynamic-component/index.mjs +0 -3
  465. package/esm2022/lib/dynamic-component/shared/dynamic-component.interfaces.mjs +0 -2
  466. package/esm2022/lib/dynamic-component/shared/dynamic-component.mjs +0 -183
  467. package/esm2022/lib/dynamic-component/shared/dynamic-component.service.mjs +0 -30
  468. package/esm2022/lib/dynamic-component/shared/index.mjs +0 -4
  469. package/esm2022/lib/entity/entity-selector/entity-selector.component.mjs +0 -174
  470. package/esm2022/lib/entity/entity-selector/entity-selector.module.mjs +0 -19
  471. package/esm2022/lib/entity/entity-table/entity-table-row.directive.mjs +0 -138
  472. package/esm2022/lib/entity/entity-table/entity-table.component.mjs +0 -884
  473. package/esm2022/lib/entity/entity-table/entity-table.module.mjs +0 -19
  474. package/esm2022/lib/entity/entity-table-paginator/entity-table-paginator.component.mjs +0 -158
  475. package/esm2022/lib/entity/entity-table-paginator/entity-table-paginator.interface.mjs +0 -2
  476. package/esm2022/lib/entity/entity-table-paginator/entity-table-paginator.module.mjs +0 -19
  477. package/esm2022/lib/entity/entity-table-paginator/index.mjs +0 -3
  478. package/esm2022/lib/entity/entity.module.mjs +0 -22
  479. package/esm2022/lib/entity/index.mjs +0 -14
  480. package/esm2022/lib/entity/shared/entity.enums.mjs +0 -28
  481. package/esm2022/lib/entity/shared/entity.interfaces.mjs +0 -2
  482. package/esm2022/lib/entity/shared/entity.utils.mjs +0 -73
  483. package/esm2022/lib/entity/shared/index.mjs +0 -10
  484. package/esm2022/lib/entity/shared/state.mjs +0 -194
  485. package/esm2022/lib/entity/shared/store.mjs +0 -322
  486. package/esm2022/lib/entity/shared/strategies/filter-custom-function.mjs +0 -80
  487. package/esm2022/lib/entity/shared/strategies/filter-selection.mjs +0 -81
  488. package/esm2022/lib/entity/shared/strategies/index.mjs +0 -4
  489. package/esm2022/lib/entity/shared/strategies/strategy.mjs +0 -78
  490. package/esm2022/lib/entity/shared/transaction.mjs +0 -329
  491. package/esm2022/lib/entity/shared/view.mjs +0 -330
  492. package/esm2022/lib/entity/shared/watcher.mjs +0 -135
  493. package/esm2022/lib/environment/environment.interface.mjs +0 -2
  494. package/esm2022/lib/environment/index.mjs +0 -2
  495. package/esm2022/lib/flexible/flexible.component.mjs +0 -135
  496. package/esm2022/lib/flexible/flexible.module.mjs +0 -25
  497. package/esm2022/lib/flexible/flexible.type.mjs +0 -2
  498. package/esm2022/lib/flexible/index.mjs +0 -3
  499. package/esm2022/lib/form/form/form.component.mjs +0 -103
  500. package/esm2022/lib/form/form/form.module.mjs +0 -19
  501. package/esm2022/lib/form/form-field/form-field-select.component.mjs +0 -117
  502. package/esm2022/lib/form/form-field/form-field-text.component.mjs +0 -126
  503. package/esm2022/lib/form/form-field/form-field-textarea.component.mjs +0 -95
  504. package/esm2022/lib/form/form-field/form-field.component.mjs +0 -65
  505. package/esm2022/lib/form/form-field/form-field.module.mjs +0 -23
  506. package/esm2022/lib/form/form-field/index.mjs +0 -15
  507. package/esm2022/lib/form/form-group/form-group.component.mjs +0 -82
  508. package/esm2022/lib/form/form-group/form-group.module.mjs +0 -19
  509. package/esm2022/lib/form/form.module.mjs +0 -25
  510. package/esm2022/lib/form/index.mjs +0 -13
  511. package/esm2022/lib/form/shared/form-field-component.mjs +0 -7
  512. package/esm2022/lib/form/shared/form-field.service.mjs +0 -29
  513. package/esm2022/lib/form/shared/form.interfaces.mjs +0 -2
  514. package/esm2022/lib/form/shared/form.service.mjs +0 -82
  515. package/esm2022/lib/form/shared/form.utils.mjs +0 -41
  516. package/esm2022/lib/form/shared/index.mjs +0 -6
  517. package/esm2022/lib/form-dialog/form-dialog.component.mjs +0 -94
  518. package/esm2022/lib/form-dialog/form-dialog.interface.mjs +0 -2
  519. package/esm2022/lib/form-dialog/form-dialog.module.mjs +0 -31
  520. package/esm2022/lib/form-dialog/form-dialog.service.mjs +0 -30
  521. package/esm2022/lib/form-dialog/index.mjs +0 -4
  522. package/esm2022/lib/home-button/home-button.component.mjs +0 -26
  523. package/esm2022/lib/home-button/home-button.module.mjs +0 -19
  524. package/esm2022/lib/home-button/index.mjs +0 -2
  525. package/esm2022/lib/icons/icon/icon.component.mjs +0 -40
  526. package/esm2022/lib/icons/icon.provider.mjs +0 -14
  527. package/esm2022/lib/icons/index.mjs +0 -4
  528. package/esm2022/lib/icons/shared/icon.interface.mjs +0 -2
  529. package/esm2022/lib/icons/shared/icons.mjs +0 -34
  530. package/esm2022/lib/icons/shared/index.mjs +0 -3
  531. package/esm2022/lib/image/image-error.directive.mjs +0 -35
  532. package/esm2022/lib/image/image.module.mjs +0 -26
  533. package/esm2022/lib/image/index.mjs +0 -6
  534. package/esm2022/lib/image/secure-image.pipe.mjs +0 -66
  535. package/esm2022/lib/interactive-tour/index.mjs +0 -5
  536. package/esm2022/lib/interactive-tour/interactive-tour.component.mjs +0 -126
  537. package/esm2022/lib/interactive-tour/interactive-tour.interface.mjs +0 -2
  538. package/esm2022/lib/interactive-tour/interactive-tour.loader.mjs +0 -49
  539. package/esm2022/lib/interactive-tour/interactive-tour.module.mjs +0 -19
  540. package/esm2022/lib/interactive-tour/interactive-tour.service.mjs +0 -303
  541. package/esm2022/lib/json-dialog/index.mjs +0 -3
  542. package/esm2022/lib/json-dialog/json-dialog.component.mjs +0 -38
  543. package/esm2022/lib/json-dialog/json-dialog.module.mjs +0 -26
  544. package/esm2022/lib/json-dialog/json-dialog.service.mjs +0 -26
  545. package/esm2022/lib/keyvalue/index.mjs +0 -2
  546. package/esm2022/lib/keyvalue/keyvalue.module.mjs +0 -25
  547. package/esm2022/lib/keyvalue/keyvalue.pipe.mjs +0 -19
  548. package/esm2022/lib/list/index.mjs +0 -6
  549. package/esm2022/lib/list/list-item.directive.mjs +0 -166
  550. package/esm2022/lib/list/list.component.mjs +0 -252
  551. package/esm2022/lib/list/list.module.mjs +0 -26
  552. package/esm2022/lib/panel/index.mjs +0 -2
  553. package/esm2022/lib/panel/panel.component.mjs +0 -30
  554. package/esm2022/lib/panel/panel.module.mjs +0 -19
  555. package/esm2022/lib/select-value-dialog/index.mjs +0 -5
  556. package/esm2022/lib/select-value-dialog/select-value-check-radio-dialog.component.mjs +0 -103
  557. package/esm2022/lib/select-value-dialog/select-value-dialog.enums.mjs +0 -6
  558. package/esm2022/lib/select-value-dialog/select-value-dialog.interface.mjs +0 -2
  559. package/esm2022/lib/select-value-dialog/select-value-dialog.module.mjs +0 -27
  560. package/esm2022/lib/select-value-dialog/select-value-dialog.service.mjs +0 -29
  561. package/esm2022/lib/sidenav/index.mjs +0 -2
  562. package/esm2022/lib/sidenav/sidenav-shim.directive.mjs +0 -58
  563. package/esm2022/lib/sidenav/sidenav.module.mjs +0 -25
  564. package/esm2022/lib/spinner/index.mjs +0 -9
  565. package/esm2022/lib/spinner/spinner-activity.directive.mjs +0 -56
  566. package/esm2022/lib/spinner/spinner.component.mjs +0 -30
  567. package/esm2022/lib/spinner/spinner.module.mjs +0 -21
  568. package/esm2022/lib/stop-propagation/index.mjs +0 -9
  569. package/esm2022/lib/stop-propagation/stop-drop-propagation.directive.mjs +0 -21
  570. package/esm2022/lib/stop-propagation/stop-propagation.directive.mjs +0 -20
  571. package/esm2022/lib/stop-propagation/stop-propagation.module.mjs +0 -26
  572. package/esm2022/lib/table/index.mjs +0 -6
  573. package/esm2022/lib/table/table-action-color.enum.mjs +0 -7
  574. package/esm2022/lib/table/table-database.mjs +0 -28
  575. package/esm2022/lib/table/table-datasource.mjs +0 -64
  576. package/esm2022/lib/table/table-model.interface.mjs +0 -2
  577. package/esm2022/lib/table/table.component.mjs +0 -143
  578. package/esm2022/lib/table/table.module.mjs +0 -25
  579. package/esm2022/lib/tool/index.mjs +0 -3
  580. package/esm2022/lib/tool/shared/index.mjs +0 -6
  581. package/esm2022/lib/tool/shared/tool-component.mjs +0 -9
  582. package/esm2022/lib/tool/shared/tool.interface.mjs +0 -2
  583. package/esm2022/lib/tool/shared/tool.service.mjs +0 -43
  584. package/esm2022/lib/tool/shared/toolbox.enums.mjs +0 -2
  585. package/esm2022/lib/tool/shared/toolbox.mjs +0 -184
  586. package/esm2022/lib/tool/tool.module.mjs +0 -28
  587. package/esm2022/lib/tool/toolbox/toolbox.animation.mjs +0 -10
  588. package/esm2022/lib/tool/toolbox/toolbox.component.mjs +0 -242
  589. package/esm2022/lib/tool/toolbox/toolbox.module.mjs +0 -19
  590. package/esm2022/lib/widget/index.mjs +0 -3
  591. package/esm2022/lib/widget/shared/index.mjs +0 -4
  592. package/esm2022/lib/widget/shared/widget.interfaces.mjs +0 -2
  593. package/esm2022/lib/widget/shared/widget.mjs +0 -4
  594. package/esm2022/lib/widget/shared/widget.service.mjs +0 -22
  595. package/esm2022/lib/widget/widget-outlet/widget-outlet.component.mjs +0 -114
  596. package/esm2022/lib/widget/widget-outlet/widget-outlet.module.mjs +0 -19
  597. package/esm2022/lib/widget/widget.module.mjs +0 -22
  598. package/esm2022/lib/workspace/index.mjs +0 -10
  599. package/esm2022/lib/workspace/shared/index.mjs +0 -4
  600. package/esm2022/lib/workspace/shared/store.mjs +0 -37
  601. package/esm2022/lib/workspace/shared/workspace.interfaces.mjs +0 -2
  602. package/esm2022/lib/workspace/shared/workspace.mjs +0 -143
  603. package/esm2022/lib/workspace/workspace-selector/workspace-selector.component.mjs +0 -52
  604. package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +0 -19
  605. package/esm2022/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.component.mjs +0 -74
  606. package/esm2022/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.module.mjs +0 -19
  607. package/esm2022/lib/workspace/workspace.module.mjs +0 -22
  608. package/lib/action/index.d.ts +0 -2
  609. package/lib/action/shared/action.interfaces.d.ts +0 -18
  610. package/lib/action/shared/store.d.ts +0 -8
  611. package/lib/backdrop/index.d.ts +0 -1
  612. package/lib/badge-icon/index.d.ts +0 -1
  613. package/lib/clickout/index.d.ts +0 -1
  614. package/lib/clone/index.d.ts +0 -1
  615. package/lib/collapsible/index.d.ts +0 -5
  616. package/lib/color-picker-form-field/index.d.ts +0 -1
  617. package/lib/confirm-dialog/index.d.ts +0 -3
  618. package/lib/context-menu/index.d.ts +0 -5
  619. package/lib/custom-html/index.d.ts +0 -5
  620. package/lib/dom/index.d.ts +0 -2
  621. package/lib/drag-drop/index.d.ts +0 -1
  622. package/lib/dynamic-component/index.d.ts +0 -2
  623. package/lib/entity/entity-table-paginator/index.d.ts +0 -2
  624. package/lib/entity/entity.module.d.ts +0 -12
  625. package/lib/entity/index.d.ts +0 -9
  626. package/lib/flexible/index.d.ts +0 -2
  627. package/lib/form/form-field/index.d.ts +0 -9
  628. package/lib/form/form.module.d.ts +0 -15
  629. package/lib/form/index.d.ts +0 -7
  630. package/lib/form-dialog/form-dialog.component.d.ts +0 -24
  631. package/lib/form-dialog/form-dialog.interface.d.ts +0 -18
  632. package/lib/form-dialog/index.d.ts +0 -3
  633. package/lib/home-button/index.d.ts +0 -1
  634. package/lib/icons/icon/icon.component.d.ts +0 -16
  635. package/lib/icons/shared/icons.d.ts +0 -21
  636. package/lib/icons/shared/index.d.ts +0 -2
  637. package/lib/image/index.d.ts +0 -5
  638. package/lib/interactive-tour/index.d.ts +0 -4
  639. package/lib/interactive-tour/interactive-tour.component.d.ts +0 -30
  640. package/lib/json-dialog/index.d.ts +0 -2
  641. package/lib/keyvalue/index.d.ts +0 -1
  642. package/lib/list/index.d.ts +0 -5
  643. package/lib/panel/index.d.ts +0 -1
  644. package/lib/select-value-dialog/index.d.ts +0 -4
  645. package/lib/sidenav/index.d.ts +0 -1
  646. package/lib/spinner/index.d.ts +0 -5
  647. package/lib/spinner/spinner.module.d.ts +0 -11
  648. package/lib/stop-propagation/index.d.ts +0 -5
  649. package/lib/table/index.d.ts +0 -5
  650. package/lib/tool/index.d.ts +0 -2
  651. package/lib/tool/shared/tool.interface.d.ts +0 -18
  652. package/lib/tool/shared/toolbox.d.ts +0 -95
  653. package/lib/tool/toolbox/toolbox.component.d.ts +0 -128
  654. package/lib/widget/index.d.ts +0 -2
  655. package/lib/widget/shared/widget.d.ts +0 -4
  656. package/lib/widget/shared/widget.service.d.ts +0 -10
  657. package/lib/widget/widget-outlet/widget-outlet.component.d.ts +0 -71
  658. package/lib/workspace/index.d.ts +0 -6
  659. package/lib/workspace/shared/store.d.ts +0 -20
  660. package/lib/workspace/shared/workspace.d.ts +0 -108
  661. package/lib/workspace/shared/workspace.interfaces.d.ts +0 -11
  662. package/lib/workspace/workspace-selector/workspace-selector.component.d.ts +0 -38
  663. package/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.component.d.ts +0 -57
  664. package/lib/workspace/workspace.module.d.ts +0 -11
  665. /package/{lib/action → action}/action.module.d.ts +0 -0
  666. /package/{lib/action → action}/actionbar/actionbar-item.component.d.ts +0 -0
  667. /package/{lib/action → action}/actionbar/actionbar.component.d.ts +0 -0
  668. /package/{lib/action → action}/actionbar/actionbar.module.d.ts +0 -0
  669. /package/{lib/action → action}/shared/action.enums.d.ts +0 -0
  670. /package/{lib/action → action}/shared/index.d.ts +0 -0
  671. /package/{src/lib/action → action/src}/action.theming.scss +0 -0
  672. /package/{src/lib/action → action/src}/actionbar/actionbar-item.theming.scss +0 -0
  673. /package/{src/lib/action → action/src}/actionbar/actionbar.theming.scss +0 -0
  674. /package/{lib/backdrop → backdrop}/backdrop.component.d.ts +0 -0
  675. /package/{lib/backdrop → backdrop}/backdrop.module.d.ts +0 -0
  676. /package/{lib/badge-icon → badge}/badge-icon.directive.d.ts +0 -0
  677. /package/{lib/badge-icon → badge}/badge-icon.module.d.ts +0 -0
  678. /package/{lib/clickout → clickout}/clickout.directive.d.ts +0 -0
  679. /package/{lib/clickout → clickout}/clickout.module.d.ts +0 -0
  680. /package/{lib/clone → clone}/clone.module.d.ts +0 -0
  681. /package/{lib/clone → clone}/clone.pipe.d.ts +0 -0
  682. /package/{lib/collapsible → collapsible}/collapse.directive.d.ts +0 -0
  683. /package/{lib/collapsible → collapsible}/collapsible.component.d.ts +0 -0
  684. /package/{lib/collapsible → collapsible}/collapsible.module.d.ts +0 -0
  685. /package/{src/lib/collapsible → collapsible/src}/collapsible.theming.scss +0 -0
  686. /package/{lib → color}/color-picker-form-field/color-picker-form-field.component.d.ts +0 -0
  687. /package/{lib → color}/color-picker-form-field/color-picker-form-field.module.d.ts +0 -0
  688. /package/{lib/confirm-dialog → confirm-dialog}/confirm-dialog.component.d.ts +0 -0
  689. /package/{lib/confirm-dialog → confirm-dialog}/confirm-dialog.interface.d.ts +0 -0
  690. /package/{lib/confirm-dialog → confirm-dialog}/confirm-dialog.module.d.ts +0 -0
  691. /package/{lib/confirm-dialog → confirm-dialog}/confirm-dialog.service.d.ts +0 -0
  692. /package/{lib/context-menu → context-menu}/context-menu.directive.d.ts +0 -0
  693. /package/{lib/context-menu → context-menu}/context-menu.module.d.ts +0 -0
  694. /package/{lib/context-menu → context-menu}/long-press.directive.d.ts +0 -0
  695. /package/{lib/custom-html → custom-html}/custom-html.component.d.ts +0 -0
  696. /package/{lib/custom-html → custom-html}/custom-html.module.d.ts +0 -0
  697. /package/{lib/custom-html → custom-html}/custom-html.pipe.d.ts +0 -0
  698. /package/{lib/dom → dom}/dom.interfaces.d.ts +0 -0
  699. /package/{lib/dom → dom}/dom.module.d.ts +0 -0
  700. /package/{lib/dom → dom}/dom.service.d.ts +0 -0
  701. /package/{lib/drag-drop → drag-drop}/drag-drop.directive.d.ts +0 -0
  702. /package/{lib/drag-drop → drag-drop}/drag-drop.module.d.ts +0 -0
  703. /package/{lib/dynamic-component → dynamic-component}/dynamic-component.module.d.ts +0 -0
  704. /package/{lib/dynamic-component → dynamic-component}/dynamic-outlet/dynamic-outlet.component.d.ts +0 -0
  705. /package/{lib/dynamic-component → dynamic-component}/dynamic-outlet/dynamic-outlet.module.d.ts +0 -0
  706. /package/{lib/dynamic-component → dynamic-component}/shared/dynamic-component.d.ts +0 -0
  707. /package/{lib/dynamic-component → dynamic-component}/shared/dynamic-component.interfaces.d.ts +0 -0
  708. /package/{lib/dynamic-component → dynamic-component}/shared/dynamic-component.service.d.ts +0 -0
  709. /package/{lib/dynamic-component → dynamic-component}/shared/index.d.ts +0 -0
  710. /package/{lib/entity → entity}/entity-selector/entity-selector.component.d.ts +0 -0
  711. /package/{lib/entity → entity}/entity-selector/entity-selector.module.d.ts +0 -0
  712. /package/{lib/entity → entity}/entity-table/entity-table-row.directive.d.ts +0 -0
  713. /package/{lib/entity → entity}/entity-table/entity-table.component.d.ts +0 -0
  714. /package/{lib/entity → entity}/entity-table/entity-table.module.d.ts +0 -0
  715. /package/{lib/entity → entity}/entity-table-paginator/entity-table-paginator.component.d.ts +0 -0
  716. /package/{lib/entity → entity}/entity-table-paginator/entity-table-paginator.interface.d.ts +0 -0
  717. /package/{lib/entity → entity}/entity-table-paginator/entity-table-paginator.module.d.ts +0 -0
  718. /package/{lib/entity → entity}/shared/entity.enums.d.ts +0 -0
  719. /package/{lib/entity → entity}/shared/entity.interfaces.d.ts +0 -0
  720. /package/{lib/entity → entity}/shared/entity.utils.d.ts +0 -0
  721. /package/{lib/entity → entity}/shared/index.d.ts +0 -0
  722. /package/{lib/entity → entity}/shared/state.d.ts +0 -0
  723. /package/{lib/entity → entity}/shared/store.d.ts +0 -0
  724. /package/{lib/entity → entity}/shared/strategies/filter-custom-function.d.ts +0 -0
  725. /package/{lib/entity → entity}/shared/strategies/filter-selection.d.ts +0 -0
  726. /package/{lib/entity → entity}/shared/strategies/index.d.ts +0 -0
  727. /package/{lib/entity → entity}/shared/strategies/strategy.d.ts +0 -0
  728. /package/{lib/entity → entity}/shared/transaction.d.ts +0 -0
  729. /package/{lib/entity → entity}/shared/view.d.ts +0 -0
  730. /package/{lib/entity → entity}/shared/watcher.d.ts +0 -0
  731. /package/{src/lib/entity → entity/src}/entity-selector/entity-selector.theming.scss +0 -0
  732. /package/{src/lib/entity → entity/src}/entity-table/entity-table.theming.scss +0 -0
  733. /package/{src/lib/entity → entity/src}/entity.theming.scss +0 -0
  734. /package/{lib/environment → environment}/environment.interface.d.ts +0 -0
  735. /package/{lib/environment/index.d.ts → environment/public_api.d.ts} +0 -0
  736. /package/{lib/flexible → flexible}/flexible.component.d.ts +0 -0
  737. /package/{lib/flexible → flexible}/flexible.module.d.ts +0 -0
  738. /package/{lib/flexible → flexible}/flexible.type.d.ts +0 -0
  739. /package/{lib/form → form}/form/form.component.d.ts +0 -0
  740. /package/{lib/form → form}/form/form.module.d.ts +0 -0
  741. /package/{lib → form}/form-dialog/form-dialog.module.d.ts +0 -0
  742. /package/{lib → form}/form-dialog/form-dialog.service.d.ts +0 -0
  743. /package/{lib/form → form}/form-field/form-field-select.component.d.ts +0 -0
  744. /package/{lib/form → form}/form-field/form-field-text.component.d.ts +0 -0
  745. /package/{lib/form → form}/form-field/form-field-textarea.component.d.ts +0 -0
  746. /package/{lib/form → form}/form-field/form-field.component.d.ts +0 -0
  747. /package/{lib/form → form}/form-field/form-field.module.d.ts +0 -0
  748. /package/{lib/form → form}/form-group/form-group.component.d.ts +0 -0
  749. /package/{lib/form → form}/form-group/form-group.module.d.ts +0 -0
  750. /package/{lib/form → form}/shared/form-field-component.d.ts +0 -0
  751. /package/{lib/form → form}/shared/form-field.service.d.ts +0 -0
  752. /package/{lib/form → form}/shared/form.interfaces.d.ts +0 -0
  753. /package/{lib/form → form}/shared/form.service.d.ts +0 -0
  754. /package/{lib/form → form}/shared/form.utils.d.ts +0 -0
  755. /package/{lib/form → form}/shared/index.d.ts +0 -0
  756. /package/{lib/home-button → home-button}/home-button.component.d.ts +0 -0
  757. /package/{lib/home-button → home-button}/home-button.module.d.ts +0 -0
  758. /package/{src/lib/home-button → home-button/src}/home-button.theming.scss +0 -0
  759. /package/{lib/icons → icon}/icon.provider.d.ts +0 -0
  760. /package/{lib/icons/index.d.ts → icon/public_api.d.ts} +0 -0
  761. /package/{lib/icons → icon}/shared/icon.interface.d.ts +0 -0
  762. /package/{lib/image → image}/image-error.directive.d.ts +0 -0
  763. /package/{lib/image → image}/image.module.d.ts +0 -0
  764. /package/{lib/image → image}/secure-image.pipe.d.ts +0 -0
  765. /package/{lib/interactive-tour → interactive-tour}/interactive-tour.interface.d.ts +0 -0
  766. /package/{lib/interactive-tour → interactive-tour}/interactive-tour.loader.d.ts +0 -0
  767. /package/{lib/interactive-tour → interactive-tour}/interactive-tour.module.d.ts +0 -0
  768. /package/{lib/interactive-tour → interactive-tour}/interactive-tour.service.d.ts +0 -0
  769. /package/{src/lib/interactive-tour → interactive-tour/src}/interactive-tour.theming.scss +0 -0
  770. /package/{lib/json-dialog → json-dialog}/json-dialog.component.d.ts +0 -0
  771. /package/{lib/json-dialog → json-dialog}/json-dialog.module.d.ts +0 -0
  772. /package/{lib/json-dialog → json-dialog}/json-dialog.service.d.ts +0 -0
  773. /package/{lib/keyvalue → keyvalue}/keyvalue.module.d.ts +0 -0
  774. /package/{lib/keyvalue → keyvalue}/keyvalue.pipe.d.ts +0 -0
  775. /package/{lib/list → list}/list-item.directive.d.ts +0 -0
  776. /package/{lib/list → list}/list.component.d.ts +0 -0
  777. /package/{lib/list → list}/list.module.d.ts +0 -0
  778. /package/{src/lib/list → list/src}/list.theming.scss +0 -0
  779. /package/{lib/panel → panel}/panel.component.d.ts +0 -0
  780. /package/{lib/panel → panel}/panel.module.d.ts +0 -0
  781. /package/{src/lib/panel → panel/src}/panel.theming.scss +0 -0
  782. /package/{lib/select-value-dialog → select-value-dialog}/select-value-check-radio-dialog.component.d.ts +0 -0
  783. /package/{lib/select-value-dialog → select-value-dialog}/select-value-dialog.enums.d.ts +0 -0
  784. /package/{lib/select-value-dialog → select-value-dialog}/select-value-dialog.interface.d.ts +0 -0
  785. /package/{lib/select-value-dialog → select-value-dialog}/select-value-dialog.module.d.ts +0 -0
  786. /package/{lib/select-value-dialog → select-value-dialog}/select-value-dialog.service.d.ts +0 -0
  787. /package/{lib/sidenav → sidenav}/sidenav-shim.directive.d.ts +0 -0
  788. /package/{lib/sidenav → sidenav}/sidenav.module.d.ts +0 -0
  789. /package/{lib/spinner → spinner}/spinner-activity.directive.d.ts +0 -0
  790. /package/{lib/spinner → spinner}/spinner.component.d.ts +0 -0
  791. /package/{lib/stop-propagation → stop-propagation}/stop-drop-propagation.directive.d.ts +0 -0
  792. /package/{lib/stop-propagation → stop-propagation}/stop-propagation.directive.d.ts +0 -0
  793. /package/{lib/stop-propagation → stop-propagation}/stop-propagation.module.d.ts +0 -0
  794. /package/{lib/table → table}/table-action-color.enum.d.ts +0 -0
  795. /package/{lib/table → table}/table-database.d.ts +0 -0
  796. /package/{lib/table → table}/table-datasource.d.ts +0 -0
  797. /package/{lib/table → table}/table-model.interface.d.ts +0 -0
  798. /package/{lib/table → table}/table.component.d.ts +0 -0
  799. /package/{lib/table → table}/table.module.d.ts +0 -0
  800. /package/{lib/tool → tool}/shared/index.d.ts +0 -0
  801. /package/{lib/tool → tool}/shared/tool-component.d.ts +0 -0
  802. /package/{lib/tool → tool}/shared/tool.service.d.ts +0 -0
  803. /package/{lib/tool → tool}/shared/toolbox.enums.d.ts +0 -0
  804. /package/{src/lib/tool → tool/src}/tool.theming.scss +0 -0
  805. /package/{src/lib/tool → tool/src}/toolbox/toolbox.theming.scss +0 -0
  806. /package/{lib/tool → tool}/tool.module.d.ts +0 -0
  807. /package/{lib/tool → tool}/toolbox/toolbox.animation.d.ts +0 -0
  808. /package/{lib/tool → tool}/toolbox/toolbox.module.d.ts +0 -0
  809. /package/{lib/widget → widget}/shared/index.d.ts +0 -0
  810. /package/{lib/widget → widget}/shared/widget.interfaces.d.ts +0 -0
  811. /package/{lib/widget → widget}/widget-outlet/widget-outlet.module.d.ts +0 -0
  812. /package/{lib/widget → widget}/widget.module.d.ts +0 -0
  813. /package/{lib/workspace → workspace}/shared/index.d.ts +0 -0
  814. /package/{lib/workspace → workspace}/workspace-selector/workspace-selector.module.d.ts +0 -0
  815. /package/{lib/workspace → workspace}/workspace-widget-outlet/workspace-widget-outlet.module.d.ts +0 -0
@@ -1,884 +0,0 @@
1
- import { FocusMonitor } from '@angular/cdk/a11y';
2
- import { AsyncPipe, NgClass, NgFor, NgIf, NgStyle } from '@angular/common';
3
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Optional, Output, Self } from '@angular/core';
4
- import { FormControlName, FormsModule, NgControl, NgForm, ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
5
- import { provideMomentDateAdapter } from '@angular/material-moment-adapter';
6
- import { MatAutocompleteModule } from '@angular/material/autocomplete';
7
- import { MatButtonModule } from '@angular/material/button';
8
- import { MatCheckboxModule } from '@angular/material/checkbox';
9
- import { DateAdapter, ErrorStateMatcher, MatNativeDateModule, MatOptionModule } from '@angular/material/core';
10
- import { MatDatepickerModule } from '@angular/material/datepicker';
11
- import { MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';
12
- import { MatIconModule } from '@angular/material/icon';
13
- import { MatInputModule } from '@angular/material/input';
14
- import { MatPaginator } from '@angular/material/paginator';
15
- import { MatSelectModule } from '@angular/material/select';
16
- import { MatSortModule } from '@angular/material/sort';
17
- import { MatTableDataSource, MatTableModule } from '@angular/material/table';
18
- import { MatTooltipModule } from '@angular/material/tooltip';
19
- import { StringUtils } from '@igo2/utils';
20
- import { TranslateModule } from '@ngx-translate/core';
21
- import { default as moment } from 'moment';
22
- import { BehaviorSubject, Observable } from 'rxjs';
23
- import { debounceTime, map } from 'rxjs/operators';
24
- import { SanitizeHtmlPipe } from '../../custom-html/custom-html.pipe';
25
- import { ImageErrorDirective } from '../../image/image-error.directive';
26
- import { SecureImagePipe } from '../../image/secure-image.pipe';
27
- import { StopPropagationDirective } from '../../stop-propagation/stop-propagation.directive';
28
- import { EntityTablePaginatorComponent } from '../entity-table-paginator/entity-table-paginator.component';
29
- import { EntityStore, EntityTableColumnRenderer, EntityTableScrollBehavior, EntityTableSelectionState } from '../shared';
30
- import { EntityTableRowDirective } from './entity-table-row.directive';
31
- import * as i0 from "@angular/core";
32
- import * as i1 from "@angular/forms";
33
- import * as i2 from "@angular/cdk/a11y";
34
- import * as i3 from "@angular/material/core";
35
- import * as i4 from "@angular/material/autocomplete";
36
- import * as i5 from "@angular/material/button";
37
- import * as i6 from "@angular/material/checkbox";
38
- import * as i7 from "@angular/material/datepicker";
39
- import * as i8 from "@angular/material/form-field";
40
- import * as i9 from "@angular/material/icon";
41
- import * as i10 from "@angular/material/input";
42
- import * as i11 from "@angular/material/select";
43
- import * as i12 from "@angular/material/sort";
44
- import * as i13 from "@angular/material/table";
45
- import * as i14 from "@angular/material/tooltip";
46
- import * as i15 from "@ngx-translate/core";
47
- export class EntityTableComponent {
48
- cdRef;
49
- formBuilder;
50
- _focusMonitor;
51
- _elementRef;
52
- ngControl;
53
- _parentForm;
54
- _controlName;
55
- _defaultErrorStateMatcher;
56
- dateAdapter;
57
- entitySortChange$ = new BehaviorSubject(false);
58
- formGroup = new UntypedFormGroup({});
59
- filteredOptions = {};
60
- /**
61
- * Reference to the column renderer types
62
- * @internal
63
- */
64
- entityTableColumnRenderer = EntityTableColumnRenderer;
65
- /**
66
- * Reference to the selection's state
67
- * @internal
68
- */
69
- entityTableSelectionState = EntityTableSelectionState;
70
- /**
71
- * Observable of the selection,s state
72
- * @internal
73
- */
74
- selectionState$ = new BehaviorSubject(undefined);
75
- /**
76
- * Subscription to the store's selection
77
- */
78
- selection$$;
79
- /**
80
- * Subscription to the dataSource
81
- */
82
- dataSource$$;
83
- /**
84
- * The last record checked. Useful for selecting
85
- * multiple records by holding the shift key and checking
86
- * checkboxes.
87
- */
88
- lastRecordCheckedKey;
89
- /**
90
- * Entity store
91
- */
92
- store;
93
- /**
94
- * Table paginator
95
- */
96
- set paginator(value) {
97
- this._paginator = value;
98
- this.dataSource.paginator = value;
99
- }
100
- get paginator() {
101
- return this._paginator;
102
- }
103
- _paginator;
104
- /**
105
- * Table template
106
- */
107
- template;
108
- /**
109
- * Scroll behavior on selection
110
- */
111
- scrollBehavior = EntityTableScrollBehavior.Auto;
112
- /**
113
- * Whether nulls should be first when sorting
114
- */
115
- sortNullsFirst = false;
116
- /**
117
- * Show the table paginator or not. False by default.
118
- */
119
- withPaginator = false;
120
- /**
121
- * Paginator options
122
- */
123
- paginatorOptions;
124
- /**
125
- * Event emitted when an entity (row) is clicked
126
- */
127
- entityClick = new EventEmitter();
128
- /**
129
- * Event emitted when an entity (row) is selected
130
- */
131
- entitySelectChange = new EventEmitter();
132
- /**
133
- * Event emitted when the table sort is changed.
134
- */
135
- entitySortChange = new EventEmitter(undefined);
136
- /**
137
- * Table headers
138
- * @internal
139
- */
140
- get headers() {
141
- let columns = this.template.columns
142
- .filter((column) => column.visible !== false)
143
- .map((column) => column.name);
144
- if (this.selectionCheckbox === true) {
145
- columns = ['selectionCheckbox'].concat(columns);
146
- }
147
- return columns;
148
- }
149
- /**
150
- * Data source consumable by the underlying material table
151
- * @internal
152
- */
153
- dataSource = new MatTableDataSource();
154
- /**
155
- * Whether selection is supported
156
- * @internal
157
- */
158
- get selection() {
159
- return this.template.selection || false;
160
- }
161
- /**
162
- * Whether a selection checkbox should be displayed
163
- * @internal
164
- */
165
- get selectionCheckbox() {
166
- return this.template.selectionCheckbox || false;
167
- }
168
- /**
169
- * Whether selection many entities should eb supported
170
- * @internal
171
- */
172
- get selectMany() {
173
- return this.template.selectMany || false;
174
- }
175
- /**
176
- * Whether selection many entities should eb supported
177
- * @internal
178
- */
179
- get fixedHeader() {
180
- return this.template.fixedHeader === undefined
181
- ? true
182
- : this.template.fixedHeader;
183
- }
184
- get tableHeight() {
185
- return this.template.tableHeight ? this.template.tableHeight : 'auto';
186
- }
187
- constructor(cdRef, formBuilder, _focusMonitor, _elementRef, ngControl, _parentForm, _controlName, _defaultErrorStateMatcher, dateAdapter) {
188
- this.cdRef = cdRef;
189
- this.formBuilder = formBuilder;
190
- this._focusMonitor = _focusMonitor;
191
- this._elementRef = _elementRef;
192
- this.ngControl = ngControl;
193
- this._parentForm = _parentForm;
194
- this._controlName = _controlName;
195
- this._defaultErrorStateMatcher = _defaultErrorStateMatcher;
196
- this.dateAdapter = dateAdapter;
197
- this.dateAdapter.setLocale('fr-CA');
198
- }
199
- /**
200
- * Track the selection state to properly display the selection checkboxes
201
- * @internal
202
- */
203
- ngOnInit() {
204
- this.handleDatasource();
205
- this.dataSource.paginator = this.paginator;
206
- this.store.state.change$.pipe(debounceTime(100)).subscribe(() => {
207
- this.handleDatasource();
208
- this.refresh();
209
- });
210
- }
211
- /**
212
- * @internal
213
- */
214
- ngOnChanges(changes) {
215
- const store = changes.store;
216
- if (store && store.currentValue !== store.previousValue) {
217
- this.handleDatasource();
218
- }
219
- }
220
- /**
221
- * Process text or number value change (edition)
222
- */
223
- onValueChange(column, record, event) {
224
- const key = this.getColumnKeyWithoutPropertiesTag(column);
225
- record.entity.properties[key] = event.target.value;
226
- }
227
- /**
228
- * Process boolean value change (edition)
229
- */
230
- onBooleanValueChange(column, record, event) {
231
- const key = this.getColumnKeyWithoutPropertiesTag(column);
232
- record.entity.properties[key] = event.checked;
233
- }
234
- /**
235
- * Process select value change (edition)
236
- */
237
- onSelectValueChange(column, record, event) {
238
- const key = this.getColumnKeyWithoutPropertiesTag(column);
239
- record.entity.properties[key] = event.value;
240
- }
241
- /**
242
- * Process autocomplete value change (edition)
243
- */
244
- onAutocompleteValueChange(column, record, event) {
245
- this.formGroup.controls[column.name].setValue(event.option.viewValue);
246
- const key = this.getColumnKeyWithoutPropertiesTag(column.name);
247
- record.entity.properties[key] = event.option.value;
248
- }
249
- /**
250
- * Process date value change (edition)
251
- */
252
- onDateChange(column, record, event) {
253
- const format = 'YYYY-MM-DD';
254
- const value = moment(event.value).format(format);
255
- const key = this.getColumnKeyWithoutPropertiesTag(column);
256
- record.entity.properties[key] = value;
257
- }
258
- /**
259
- * Enable edition mode for one row
260
- * More than one row can be edited at the same time
261
- */
262
- enableEdit(record) {
263
- const item = record.entity.properties || record.entity;
264
- this.template.columns.forEach((column) => {
265
- column.title =
266
- column.validation?.mandatory && !column.title.includes('*')
267
- ? column.title + ' *'
268
- : column.title;
269
- const key = this.getColumnKeyWithoutPropertiesTag(column.name);
270
- if (column.type === 'boolean') {
271
- if (!item[key] || item[key] === null) {
272
- item[key] = false;
273
- }
274
- else if (typeof item[key] === 'string') {
275
- item[key] = JSON.parse(item[key].toLowerCase());
276
- }
277
- this.formGroup.setControl(column.name, this.formBuilder.control(item[key]));
278
- }
279
- else if (column.type === 'list') {
280
- if (column.multiple) {
281
- this.formGroup.setControl(column.name, this.formBuilder.control([item[key]]));
282
- }
283
- else {
284
- this.formGroup.setControl(column.name, this.formBuilder.control(item[key]));
285
- typeof item[key] === 'string'
286
- ? this.formGroup.controls[column.name].setValue(parseInt(item[key]))
287
- : this.formGroup.controls[column.name].setValue(item[key]);
288
- }
289
- }
290
- else if (column.type === 'autocomplete') {
291
- this.formGroup.setControl(column.name, this.formBuilder.control(item[key]));
292
- this.filteredOptions[column.name] = new Observable();
293
- this.filteredOptions[column.name] = this.formGroup.controls[column.name].valueChanges.pipe(map((value) => {
294
- if (value?.length) {
295
- return column.domainValues?.filter((option) => {
296
- const filterNormalized = value
297
- ? value
298
- .toLowerCase()
299
- .normalize('NFD')
300
- .replace(/[\u0300-\u036f]/g, '')
301
- : '';
302
- const featureNameNormalized = option.value
303
- .toLowerCase()
304
- .normalize('NFD')
305
- .replace(/[\u0300-\u036f]/g, '');
306
- return featureNameNormalized.includes(filterNormalized);
307
- });
308
- }
309
- }));
310
- let formControlValue = item[key];
311
- column.domainValues.forEach((option) => {
312
- if (typeof formControlValue === 'string' &&
313
- StringUtils.isValidNumber(formControlValue) &&
314
- !StringUtils.isOctalNumber(formControlValue)) {
315
- formControlValue = parseInt(formControlValue);
316
- }
317
- if (option.value === formControlValue ||
318
- option.id === formControlValue) {
319
- formControlValue = option.value;
320
- }
321
- });
322
- this.formGroup.controls[column.name].setValue(formControlValue);
323
- if (this.isEdition(record) && column.linkColumnForce) {
324
- const entity = record.entity;
325
- this.formGroup.controls[column.name].setValue(entity?.properties[this.getColumnKeyWithoutPropertiesTag(column.linkColumnForce)]);
326
- }
327
- }
328
- else if (column.type === 'date') {
329
- if (column.visible !== false) {
330
- if (item[key]) {
331
- let date = moment(item[key]);
332
- item[key] = date.utc().format('YYYY-MM-DD');
333
- this.formGroup.setControl(column.name, this.formBuilder.control(item[key]));
334
- }
335
- else {
336
- const newKey = this.getColumnKeyWithoutPropertiesTag(column.name);
337
- record.entity.properties[newKey] = null;
338
- this.formGroup.setControl(column.name, this.formBuilder.control(null));
339
- }
340
- }
341
- }
342
- else {
343
- this.formGroup.setControl(column.name, this.formBuilder.control(item[key]));
344
- }
345
- if (this.formGroup.controls[column.name] &&
346
- this.getValidationAttributeValue(column, 'readonly')) {
347
- this.formGroup.controls[column.name].disable();
348
- }
349
- });
350
- }
351
- handleDatasource() {
352
- this.unsubscribeStore();
353
- this.selection$$ = this.store.stateView
354
- .manyBy$((record) => record.state.selected === true)
355
- .subscribe((records) => {
356
- const firstSelected = records[0];
357
- const firstSelectedStateviewPosition = this.store.stateView
358
- .all()
359
- .indexOf(firstSelected);
360
- const pageMax = this.paginator
361
- ? this.paginator.pageSize * (this.paginator.pageIndex + 1)
362
- : 0;
363
- const pageMin = this.paginator ? pageMax - this.paginator.pageSize : 0;
364
- if (this.paginator &&
365
- (firstSelectedStateviewPosition < pageMin ||
366
- firstSelectedStateviewPosition >= pageMax)) {
367
- const pageToReach = Math.floor(firstSelectedStateviewPosition / this.paginator.pageSize);
368
- this.dataSource.paginator.pageIndex = pageToReach;
369
- }
370
- this.selectionState$.next(this.computeSelectionState(records));
371
- });
372
- this.dataSource$$ = this.store.stateView.all$().subscribe((all) => {
373
- if (all[0]) {
374
- this.enableEdit(all[0]);
375
- }
376
- this.dataSource.data = all.map((record) => {
377
- return {
378
- record,
379
- cellData: this.template.columns.reduce((cellData, column) => {
380
- const value = this.getValue(record, column);
381
- cellData[column.name] = {
382
- class: this.getCellClass(record, column),
383
- value,
384
- isUrl: this.isUrl(value),
385
- isImg: this.isImg(value)
386
- };
387
- return cellData;
388
- }, {})
389
- };
390
- });
391
- });
392
- }
393
- /**
394
- * Unbind the store watcher
395
- * @internal
396
- */
397
- ngOnDestroy() {
398
- this.unsubscribeStore();
399
- }
400
- unsubscribeStore() {
401
- if (this.selection$$) {
402
- this.selection$$.unsubscribe();
403
- }
404
- if (this.dataSource$$) {
405
- this.dataSource$$.unsubscribe();
406
- }
407
- }
408
- /**
409
- * Trackby function
410
- * @param record Record
411
- * @param index Record index
412
- * @internal
413
- */
414
- getTrackByFunction() {
415
- return (_index, row) => row.record.ref;
416
- }
417
- /**
418
- * Trigger a refresh of the table. This can be useful when
419
- * the data source doesn't emit a new value but for some reason
420
- * the records need an update.
421
- * @internal
422
- */
423
- refresh() {
424
- this.cdRef.detectChanges();
425
- }
426
- paginatorChange(event) {
427
- this.paginator = event;
428
- }
429
- /**
430
- * On sort, sort the store
431
- * @param event Sort event
432
- * @internal
433
- */
434
- onSort(event) {
435
- const direction = event.direction;
436
- const column = this.template.columns.find((c) => c.name === event.active);
437
- if (direction === 'asc' || direction === 'desc') {
438
- this.store.stateView.sort({
439
- valueAccessor: (record) => this.getValue(record, column),
440
- direction,
441
- nullsFirst: this.sortNullsFirst
442
- });
443
- this.entitySortChange.emit({ column, direction });
444
- this.entitySortChange$.next(true);
445
- }
446
- else {
447
- this.store.stateView.sort(undefined);
448
- }
449
- }
450
- /**
451
- * When an entity is clicked, emit an event
452
- * @param record Record
453
- * @internal
454
- */
455
- onRowClick(record) {
456
- this.lastRecordCheckedKey = this.store.stateView.getKey(record);
457
- this.entityClick.emit(record.entity);
458
- }
459
- /**
460
- * When an entity is selected, select it in the store and emit an event. Even if
461
- * "many" is set to true, this method always select a single, exclusive row. Selecting
462
- * multiple rows should be achieved by using the checkboxes.
463
- * @param record Record
464
- * @internal
465
- */
466
- onRowSelect(record) {
467
- if (this.selection === false) {
468
- return;
469
- }
470
- const entity = record.entity;
471
- this.store.state.update(entity, { selected: true }, true);
472
- this.entitySelectChange.emit({ added: [entity] });
473
- }
474
- /**
475
- * Select or unselect all rows at once. On select, emit an event.
476
- * @param toggle Select or unselect
477
- * @internal
478
- */
479
- onToggleRows(toggle) {
480
- if (this.selection === false) {
481
- return;
482
- }
483
- const entities = this.store.view.all();
484
- this.entitySelectChange.emit({ added: [entities] });
485
- this.store.state.updateMany(entities, { selected: toggle });
486
- }
487
- /**
488
- * When an entity is toggled, select or unselect it in the store. On select,
489
- * emit an event.
490
- * @param toggle Select or unselect
491
- * @param record Record
492
- * @internal
493
- */
494
- onToggleRow(toggle, record) {
495
- if (this.selection === false) {
496
- return;
497
- }
498
- const entity = record.entity;
499
- const exclusive = toggle === true && !this.selectMany;
500
- this.store.state.update(entity, { selected: toggle }, exclusive);
501
- if (toggle === true) {
502
- this.entitySelectChange.emit({ added: [entity] });
503
- }
504
- this.lastRecordCheckedKey = this.store.stateView.getKey(record);
505
- }
506
- /**
507
- * When an entity is toggled, select or unselect it in the store. On select,
508
- * emit an event.
509
- * @param toggle Select or unselect
510
- * @param record Record
511
- * @internal
512
- */
513
- onShiftToggleRow(toggle, record, event) {
514
- if (this.selection === false) {
515
- return;
516
- }
517
- if (this.selectMany === false || this.lastRecordCheckedKey === undefined) {
518
- this.onToggleRow(toggle, record);
519
- return;
520
- }
521
- // This is a workaround mat checkbox wrong behavior
522
- // when the shift key is held.
523
- // See https://github.com/angular/components/issues/6232
524
- const range = window.document.createRange();
525
- range.selectNode(event.target);
526
- window.getSelection().removeAllRanges();
527
- window.getSelection().addRange(range);
528
- event.stopImmediatePropagation();
529
- const records = this.store.stateView.all();
530
- const recordIndex = records.indexOf(record);
531
- const lastRecordChecked = this.store.stateView.get(this.lastRecordCheckedKey);
532
- const lastRecordIndex = records.indexOf(lastRecordChecked);
533
- const indexes = [recordIndex, lastRecordIndex];
534
- const selectRecords = records.slice(Math.min(...indexes), Math.max(...indexes) + 1);
535
- const entities = selectRecords.map((_record) => _record.entity);
536
- this.store.state.updateMany(entities, { selected: toggle });
537
- if (toggle === true) {
538
- this.entitySelectChange.emit({ added: entities });
539
- }
540
- this.lastRecordCheckedKey = this.store.stateView.getKey(record);
541
- }
542
- /**
543
- * Compute the selection state
544
- * @returns Whether all, some or no rows are selected
545
- * @internal
546
- */
547
- computeSelectionState(selectedRecords) {
548
- const states = EntityTableSelectionState;
549
- const selectionCount = selectedRecords.length;
550
- return selectionCount === 0
551
- ? states.None
552
- : selectionCount === this.store.stateView.count
553
- ? states.All
554
- : states.Some;
555
- }
556
- /**
557
- * Whether a column is sortable
558
- * @param column Column
559
- * @returns True if a column is sortable
560
- * @internal
561
- */
562
- columnIsSortable(column) {
563
- let sortable = column.sort;
564
- if (sortable === undefined) {
565
- sortable = this.template.sort === undefined ? false : this.template.sort;
566
- }
567
- return sortable;
568
- }
569
- /**
570
- * Whether a row is should be selected based on the underlying entity state
571
- * @param record Record
572
- * @returns True if a row should be selected
573
- * @internal
574
- */
575
- rowIsSelected(record) {
576
- const state = record.state;
577
- return state.selected ? state.selected : false;
578
- }
579
- isImg(value) {
580
- if (this.isUrl(value)) {
581
- return (['jpg', 'png', 'gif'].indexOf(value.split('.').pop().toLowerCase()) !==
582
- -1);
583
- }
584
- else {
585
- return false;
586
- }
587
- }
588
- isUrl(value) {
589
- if (typeof value === 'string') {
590
- return (value.slice(0, 8) === 'https://' || value.slice(0, 7) === 'http://');
591
- }
592
- else {
593
- return false;
594
- }
595
- }
596
- /**
597
- * Method to access an entity's values
598
- * @param record Record
599
- * @param column Column
600
- * @returns Any value
601
- * @internal
602
- */
603
- getValue(record, column) {
604
- const entity = record.entity;
605
- let value;
606
- if (column.valueAccessor !== undefined) {
607
- return column.valueAccessor(entity, record);
608
- }
609
- if (this.template.valueAccessor !== undefined) {
610
- return this.template.valueAccessor(entity, column.name, record);
611
- }
612
- value = this.store.getProperty(entity, column.name);
613
- if (column.type === 'boolean') {
614
- if (value === undefined || value === null || value === '') {
615
- value = false;
616
- }
617
- else if (typeof value !== 'boolean' && value !== undefined) {
618
- if (typeof value === 'number') {
619
- value = Boolean(value);
620
- }
621
- else {
622
- value = JSON.parse(value.toLowerCase());
623
- }
624
- }
625
- if (!this.isEdition(record)) {
626
- value = value ? '&#10003;' : ''; // check mark
627
- }
628
- }
629
- else if (column.type === 'list' && value && column.domainValues) {
630
- const entity = record.entity;
631
- if (column.multiple) {
632
- let list_id;
633
- typeof value === 'string'
634
- ? (list_id = value.match(/[\w.-]+/g).map(Number))
635
- : (list_id = value);
636
- let list_option = [];
637
- column.domainValues.forEach((option) => {
638
- if (list_id.includes(option.id)) {
639
- if (record.edition) {
640
- list_option.push(option.id);
641
- }
642
- else {
643
- list_option.push(option.value);
644
- }
645
- }
646
- });
647
- this.isEdition(record) ? (value = list_id) : (value = list_option);
648
- }
649
- else {
650
- if (!this.isEdition(record) && column.linkColumnForce) {
651
- value =
652
- entity?.properties[this.getColumnKeyWithoutPropertiesTag(column.linkColumnForce)];
653
- }
654
- else {
655
- column.domainValues.forEach((option) => {
656
- if (typeof value === 'string' &&
657
- StringUtils.isValidNumber(value) &&
658
- !StringUtils.isOctalNumber(value)) {
659
- value = parseInt(value);
660
- }
661
- if (option.value === value || option.id === value) {
662
- this.isEdition(record)
663
- ? (value = option.id)
664
- : (value = option.value);
665
- }
666
- });
667
- }
668
- }
669
- }
670
- else if (column.type === 'autocomplete' && value && column.domainValues) {
671
- const entity = record.entity;
672
- if (!this.isEdition(record) && column.linkColumnForce) {
673
- value =
674
- entity?.properties[this.getColumnKeyWithoutPropertiesTag(column.linkColumnForce)];
675
- }
676
- else {
677
- column.domainValues.forEach((option) => {
678
- if (typeof value === 'string' &&
679
- StringUtils.isValidNumber(value) &&
680
- !StringUtils.isOctalNumber(value)) {
681
- value = parseInt(value);
682
- }
683
- if (option.value === value || option.id === value) {
684
- value = option.value;
685
- }
686
- });
687
- }
688
- }
689
- else if (column.type === 'date') {
690
- if (this.isEdition(record)) {
691
- if (value) {
692
- let date = moment(value);
693
- value = date.format();
694
- this.formGroup.controls[column.name].setValue(value);
695
- }
696
- }
697
- else if (!this.isEdition(record) && value === null) {
698
- value = '';
699
- }
700
- }
701
- if (value === undefined) {
702
- value = '';
703
- }
704
- return value;
705
- }
706
- /**
707
- * Method to access an entity's validation values
708
- * @param column Column
709
- * @param validationType string
710
- * @returns Any value (false if no validation or not the one concerned)
711
- * @internal
712
- */
713
- getValidationAttributeValue(column, validationType) {
714
- if (column.validation !== undefined &&
715
- column.validation[validationType] !== undefined) {
716
- return column.validation[validationType];
717
- }
718
- else {
719
- return false;
720
- }
721
- }
722
- isEdition(record) {
723
- return record.entity.edition ? true : false;
724
- }
725
- /**
726
- * Return the type of renderer of a column
727
- * @param column Column
728
- * @returns Renderer type
729
- * @internal
730
- */
731
- getColumnRenderer(column) {
732
- if (column.renderer !== undefined) {
733
- return column.renderer;
734
- }
735
- return EntityTableColumnRenderer.Default;
736
- }
737
- /**
738
- * Return the table ngClass
739
- * @returns ngClass
740
- * @internal
741
- */
742
- getTableClass() {
743
- return {
744
- 'igo-entity-table-with-selection': this.selection
745
- };
746
- }
747
- /**
748
- * Return a header ngClass
749
- * @returns ngClass
750
- * @internal
751
- */
752
- getHeaderClass() {
753
- const func = this.template.headerClassFunc;
754
- if (func instanceof Function) {
755
- return func();
756
- }
757
- return {};
758
- }
759
- /**
760
- * Return a row ngClass
761
- * @param record Record
762
- * @returns ngClass
763
- * @internal
764
- */
765
- getRowClass(record) {
766
- const entity = record.entity;
767
- const func = this.template.rowClassFunc;
768
- if (func instanceof Function) {
769
- return func(entity, record);
770
- }
771
- return {};
772
- }
773
- /**
774
- * Return a row ngClass
775
- * @param record Record
776
- * @param column Column
777
- * @returns ngClass
778
- * @internal
779
- */
780
- getCellClass(record, column) {
781
- const entity = record.entity;
782
- const cls = {};
783
- const tableFunc = this.template.cellClassFunc;
784
- if (tableFunc instanceof Function) {
785
- Object.assign(cls, tableFunc(entity, column, record));
786
- }
787
- const columnFunc = column.cellClassFunc;
788
- if (columnFunc instanceof Function) {
789
- Object.assign(cls, columnFunc(entity, record));
790
- }
791
- return cls;
792
- }
793
- /**
794
- * When a button is clicked
795
- * @param func Function
796
- * @param record Record
797
- * @internal
798
- */
799
- onButtonClick(clickFunc, record) {
800
- this.enableEdit(record);
801
- if (typeof clickFunc === 'function') {
802
- clickFunc(record.entity, record);
803
- }
804
- }
805
- /**
806
- * Retrieve column name without his "properties" tag (useful for edition workspace properties)
807
- */
808
- getColumnKeyWithoutPropertiesTag(column) {
809
- if (column.includes('properties.')) {
810
- return column.split('.')[1];
811
- }
812
- return column;
813
- }
814
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: EntityTableComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.UntypedFormBuilder }, { token: i2.FocusMonitor }, { token: i0.ElementRef }, { token: i1.NgControl, optional: true, self: true }, { token: i1.NgForm, optional: true }, { token: i1.FormControlName, optional: true }, { token: i3.ErrorStateMatcher }, { token: i3.DateAdapter }], target: i0.ɵɵFactoryTarget.Component });
815
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: EntityTableComponent, isStandalone: true, selector: "igo-entity-table", inputs: { store: "store", paginator: "paginator", template: "template", scrollBehavior: "scrollBehavior", sortNullsFirst: "sortNullsFirst", withPaginator: "withPaginator", paginatorOptions: "paginatorOptions" }, outputs: { entityClick: "entityClick", entitySelectChange: "entitySelectChange", entitySortChange: "entitySortChange" }, providers: [
816
- { provide: MatFormFieldControl, useExisting: EntityTableComponent },
817
- provideMomentDateAdapter()
818
- ], usesOnChanges: true, ngImport: i0, template: "<div class=\"table-container\" [ngStyle]=\"{ height: tableHeight }\">\n <table\n id=\"currentWorkspaceTable\"\n mat-table\n matSort\n [ngClass]=\"getTableClass()\"\n [dataSource]=\"dataSource\"\n [trackBy]=\"getTrackByFunction()\"\n (matSortChange)=\"onSort($event)\"\n >\n <ng-container matColumnDef=\"selectionCheckbox\" class=\"mat-cell-checkbox\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngIf=\"selectMany\">\n <ng-container *ngIf=\"selectionState$ | async as selectionState\">\n <mat-checkbox\n (change)=\"onToggleRows($event.checked)\"\n [checked]=\"selectionState === entityTableSelectionState.All\"\n [indeterminate]=\"\n selectionState === entityTableSelectionState.Some\n \"\n >\n </mat-checkbox>\n </ng-container>\n </ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox\n (mousedown)=\"$event.shiftKey ? $event.preventDefault() : null\"\n (click)=\"\n $event.shiftKey\n ? onShiftToggleRow(!rowIsSelected(row.record), row.record, $event)\n : $event.stopPropagation()\n \"\n (change)=\"onToggleRow($event.checked, row.record)\"\n [checked]=\"rowIsSelected(row.record)\"\n >\n </mat-checkbox>\n </td>\n </ng-container>\n\n <ng-container\n [matColumnDef]=\"column.name\"\n *ngFor=\"let column of template.columns\"\n >\n <ng-container *ngIf=\"columnIsSortable(column)\">\n <th\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n [matTooltip]=\"column.tooltip ? column.tooltip : undefined\"\n >\n {{ column.title }}\n </th>\n </ng-container>\n\n <ng-container *ngIf=\"!columnIsSortable(column)\">\n <th\n mat-header-cell\n *matHeaderCellDef\n [matTooltip]=\"column.tooltip ? column.tooltip : undefined\"\n >\n {{ column.title }}\n </th>\n </ng-container>\n\n <ng-container *ngIf=\"getColumnRenderer(column) as columnRenderer\">\n <ng-container\n *ngIf=\"columnRenderer === entityTableColumnRenderer.Default\"\n >\n <ng-container *matCellDef=\"let row\">\n <td\n mat-cell\n class=\"mat-cell-text\"\n *ngIf=\"!row.cellData[column.name].isUrl; else isAnUrlDefault\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n {{ row.cellData[column.name].value }}\n </td>\n <ng-template #isAnUrlDefault>\n <td\n mat-cell\n class=\"mat-cell-text\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n <a\n href=\"{{ row.cellData[column.name].value }}\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n >\n <img\n igoImageError\n *ngIf=\"row.cellData[column.name].isImg; else notImg\"\n src=\"{{\n row.cellData[column.name].value | secureImage | async\n }}\"\n width=\"50\"\n heigth=\"auto\"\n />\n <ng-template #notImg\n ><span\n >{{ 'igo.common.entity-table.targetHtmlUrl' | translate }}\n </span></ng-template\n >\n </a>\n </td>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"columnRenderer === entityTableColumnRenderer.HTML\">\n <ng-container *matCellDef=\"let row\">\n <td\n mat-cell\n class=\"mat-cell-text\"\n *ngIf=\"!row.cellData[column.name].isUrl; else isAnUrlHTML\"\n [ngClass]=\"row.cellData[column.name].class\"\n [innerHTML]=\"row.cellData[column.name].value\"\n ></td>\n <ng-template #isAnUrlHTML>\n <td\n mat-cell\n class=\"mat-cell-text\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n <a\n href=\"{{ row.cellData[column.name].value }}\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n >\n <img\n igoImageError\n *ngIf=\"row.cellData[column.name].isImg; else notImg\"\n src=\"{{\n row.cellData[column.name].value | secureImage | async\n }}\"\n width=\"50\"\n heigth=\"auto\"\n />\n <ng-template #notImg\n ><span\n >{{ 'igo.geo.targetHtmlUrl' | translate }}\n </span></ng-template\n >\n </a>\n </td>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"columnRenderer === entityTableColumnRenderer.UnsanitizedHTML\"\n >\n <ng-container *matCellDef=\"let row\">\n <td\n mat-cell\n class=\"mat-cell-text edition\"\n [formGroup]=\"formGroup\"\n *ngIf=\"isEdition(row.record); else isUnsanitizedHTML\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n <div class=\"date-picker\" *ngIf=\"column.type === 'date'\">\n <mat-datepicker-toggle\n matSuffix\n [for]=\"picker\"\n ></mat-datepicker-toggle>\n <input\n matInput\n [matDatepicker]=\"picker\"\n [formControlName]=\"column.name\"\n value=\"{{ row.cellData[column.name].value }}\"\n (dateChange)=\"onDateChange(column.name, row.record, $event)\"\n />\n <mat-datepicker #picker></mat-datepicker>\n </div>\n <input\n matInput\n type=\"time\"\n *ngIf=\"column.type === 'time'\"\n [formControlName]=\"column.name\"\n step=\"900\"\n (focus)=\"column.onFocus($event)\"\n (keypress)=\"column.onChange($event)\"\n (blur)=\"column.onBlur($event)\"\n />\n <input\n matInput\n type=\"number\"\n class=\"class_number_edition\"\n *ngIf=\"column.type === 'number'\"\n [formControlName]=\"column.name\"\n step=\"{{ column.step }}\"\n value=\"{{ row.cellData[column.name].value }}\"\n (input)=\"onValueChange(column.name, row.record, $event)\"\n readonly=\"{{ getValidationAttributeValue(column, 'readonly') }}\"\n required=\"{{\n getValidationAttributeValue(column, 'mandatory')\n }}\"\n min=\"{{ getValidationAttributeValue(column, 'minValue') }}\"\n max=\"{{ getValidationAttributeValue(column, 'maxValue') }}\"\n />\n <input\n matInput\n type=\"text\"\n *ngIf=\"!column.type || column.type === 'string'\"\n [formControlName]=\"column.name\"\n value=\"{{ row.cellData[column.name].value }}\"\n (input)=\"onValueChange(column.name, row.record, $event)\"\n readonly=\"{{ getValidationAttributeValue(column, 'readonly') }}\"\n required=\"{{\n getValidationAttributeValue(column, 'mandatory')\n }}\"\n />\n <mat-checkbox\n *ngIf=\"column.type === 'boolean'\"\n [formControlName]=\"column.name\"\n [checked]=\"row.cellData[column.name].value\"\n (change)=\"onBooleanValueChange(column.name, row.record, $event)\"\n ></mat-checkbox>\n <mat-select\n *ngIf=\"column.type === 'list'\"\n required=\"{{\n getValidationAttributeValue(column, 'mandatory')\n }}\"\n [formControlName]=\"column.name\"\n [multiple]=\"column.multiple\"\n (selectionChange)=\"\n onSelectValueChange(column.name, row.record, $event)\n \"\n [value]=\"row.cellData[column.name].value\"\n >\n <mat-option\n *ngFor=\"let option of column.domainValues\"\n [value]=\"option.id\"\n [disabled]=\"option.disabled\"\n >\n {{ option.value }}\n </mat-option>\n </mat-select>\n <input\n matInput\n type=\"text\"\n [formControlName]=\"column.name\"\n *ngIf=\"column.type === 'autocomplete'\"\n [matAutocomplete]=\"auto\"\n required=\"{{\n getValidationAttributeValue(column, 'mandatory')\n }}\"\n value=\"{{ row.cellData[column.name].value }}\"\n readonly=\"{{ getValidationAttributeValue(column, 'readonly') }}\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"\n onAutocompleteValueChange(column, row.record, $event)\n \"\n panelWidth=\"430px\"\n >\n <mat-option\n *ngFor=\"let option of filteredOptions[column.name] | async\"\n [value]=\"option.id\"\n >\n {{ option.value }}\n </mat-option>\n </mat-autocomplete>\n </td>\n <ng-template #isUnsanitizedHTML>\n <td\n mat-cell\n class=\"mat-cell-text\"\n *ngIf=\"\n !row.cellData[column.name].isUrl;\n else isAnUrlUnsanitizedHTML\n \"\n [ngClass]=\"row.cellData[column.name].class\"\n [innerHTML]=\"row.cellData[column.name].value | sanitizeHtml\"\n ></td>\n <ng-template #isAnUrlUnsanitizedHTML>\n <td\n mat-cell\n class=\"mat-cell-text\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n <a\n href=\"{{ row.cellData[column.name].value }}\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n >\n <img\n igoImageError\n *ngIf=\"row.cellData[column.name].isImg; else notImg\"\n src=\"{{\n row.cellData[column.name].value | secureImage | async\n }}\"\n width=\"50\"\n heigth=\"auto\"\n />\n <ng-template #notImg\n ><span\n >{{ 'igo.geo.targetHtmlUrl' | translate }}\n </span></ng-template\n >\n </a>\n </td>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"columnRenderer === entityTableColumnRenderer.Icon\">\n <td\n mat-cell\n *matCellDef=\"let row\"\n class=\"mat-cell-text\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n <mat-icon *ngIf=\"column.onClick\" (click)=\"column.onClick($event)\">{{\n row.cellData[column.name].value || column.icon\n }}</mat-icon>\n <mat-icon *ngIf=\"!column.onClick\">{{\n row.cellData[column.name].value || column.icon\n }}</mat-icon>\n </td>\n </ng-container>\n <ng-container\n *ngIf=\"columnRenderer === entityTableColumnRenderer.ButtonGroup\"\n >\n <ng-container *matCellDef=\"let row\">\n <td\n mat-cell\n class=\"mat-cell-text\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n <span *ngFor=\"let button of row.cellData[column.name].value\">\n <ng-container\n *ngIf=\"\n isEdition(row.record) === button.editMode ||\n button.editMode === undefined\n \"\n >\n <button\n *ngIf=\"button.style === 'mat-icon-button'\"\n igoStopPropagation\n mat-icon-button\n [color]=\"button.color\"\n (mousedown)=\"onButtonClick(button.click, row.record)\"\n [disabled]=\"button.disabled\"\n >\n <mat-icon>{{ button.icon }}</mat-icon>\n </button>\n <button\n *ngIf=\"button.style !== 'mat-icon-button'\"\n igoStopPropagation\n mat-mini-fab\n [color]=\"button.color\"\n (mousedown)=\"onButtonClick(button.click, row.record)\"\n [disabled]=\"button.disabled\"\n >\n <mat-icon>{{ button.icon }}</mat-icon>\n </button>\n </ng-container>\n </span>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <tr\n mat-header-row\n *matHeaderRowDef=\"headers; sticky: fixedHeader\"\n [ngClass]=\"getHeaderClass()\"\n ></tr>\n <tr\n mat-row\n igoEntityTableRow\n *matRowDef=\"let row; columns: headers\"\n [scrollBehavior]=\"scrollBehavior\"\n [ngClass]=\"getRowClass(row.record)\"\n [selection]=\"selection\"\n [selected]=\"rowIsSelected(row.record)\"\n (select)=\"onRowSelect(row.record)\"\n (click)=\"onRowClick(row.record)\"\n ></tr>\n </table>\n <igo-entity-table-paginator\n *ngIf=\"withPaginator\"\n [store]=\"store\"\n [paginatorOptions]=\"paginatorOptions\"\n [entitySortChange$]=\"entitySortChange$\"\n (paginatorChange)=\"paginatorChange($event)\"\n >\n </igo-entity-table-paginator>\n</div>\n", styles: [":host{width:100%;height:100%;display:block}:host.table-compact tr.mat-mdc-header-row,:host.table-compact ::ng-deep mat-checkbox .mat-ripple{height:36px}:host.table-compact tr.mat-mdc-row,:host.table-compact ::ng-deep mat-checkbox .mat-ripple{height:28px}:host .table-container{display:flex;flex-direction:column;height:100%;overflow:auto;flex:1 1 auto}:host .mat-cell-text{overflow:hidden;word-wrap:break-word}:host entity-table table.igo-entity-table-with-selection tr:hover{-moz-box-shadow:2px 0px 2px 0px #dddddd;-webkit-box-shadow:2px 0px 2px 0px #dddddd;-o-box-shadow:2px 0px 2px 0px #dddddd;box-shadow:2px 0 2px #ddd;cursor:pointer}:host table button{margin:7px}:host .class_hidden{visibility:hidden}:host .class_display_none{display:none}:host .class_boolean,:host .class_icon,:host .class_number{text-align:center;padding-right:35px!important}:host .class_string,:host .class_text,:host .class_number_edition{text-align:left}:host td.edition{background:#a6a6a633}:host input{border-bottom:1px solid darkgrey}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: EntityTablePaginatorComponent, selector: "igo-entity-table-paginator", inputs: ["entitySortChange$", "store", "paginatorOptions"], outputs: ["page", "paginatorChange"] }, { kind: "directive", type: EntityTableRowDirective, selector: "[igoEntityTableRow]", inputs: ["selection", "selectOnClick", "highlightSelection", "selected", "scrollBehavior"], outputs: ["select"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: ImageErrorDirective, selector: "[igoImageError]", inputs: ["errorImageUrl", "hideError"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i5.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i7.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i7.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i7.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: // For the DateAdapter provider
819
- MatOptionModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i12.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i12.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i13.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i13.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i13.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i13.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i13.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i13.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i13.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i13.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i13.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i13.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: SanitizeHtmlPipe, name: "sanitizeHtml" }, { kind: "pipe", type: SecureImagePipe, name: "secureImage" }, { kind: "directive", type: StopPropagationDirective, selector: "[igoStopPropagation]" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i15.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
820
- }
821
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: EntityTableComponent, decorators: [{
822
- type: Component,
823
- args: [{ selector: 'igo-entity-table', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
824
- { provide: MatFormFieldControl, useExisting: EntityTableComponent },
825
- provideMomentDateAdapter()
826
- ], standalone: true, imports: [
827
- AsyncPipe,
828
- EntityTablePaginatorComponent,
829
- EntityTableRowDirective,
830
- FormsModule,
831
- ImageErrorDirective,
832
- MatAutocompleteModule,
833
- MatButtonModule,
834
- MatCheckboxModule,
835
- MatDatepickerModule,
836
- MatFormFieldModule,
837
- MatIconModule,
838
- MatInputModule,
839
- MatNativeDateModule, // For the DateAdapter provider
840
- MatOptionModule,
841
- MatSelectModule,
842
- MatSortModule,
843
- MatTableModule,
844
- MatTooltipModule,
845
- NgClass,
846
- NgFor,
847
- NgIf,
848
- NgStyle,
849
- ReactiveFormsModule,
850
- SanitizeHtmlPipe,
851
- SecureImagePipe,
852
- StopPropagationDirective,
853
- TranslateModule
854
- ], template: "<div class=\"table-container\" [ngStyle]=\"{ height: tableHeight }\">\n <table\n id=\"currentWorkspaceTable\"\n mat-table\n matSort\n [ngClass]=\"getTableClass()\"\n [dataSource]=\"dataSource\"\n [trackBy]=\"getTrackByFunction()\"\n (matSortChange)=\"onSort($event)\"\n >\n <ng-container matColumnDef=\"selectionCheckbox\" class=\"mat-cell-checkbox\">\n <th mat-header-cell *matHeaderCellDef>\n <ng-container *ngIf=\"selectMany\">\n <ng-container *ngIf=\"selectionState$ | async as selectionState\">\n <mat-checkbox\n (change)=\"onToggleRows($event.checked)\"\n [checked]=\"selectionState === entityTableSelectionState.All\"\n [indeterminate]=\"\n selectionState === entityTableSelectionState.Some\n \"\n >\n </mat-checkbox>\n </ng-container>\n </ng-container>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox\n (mousedown)=\"$event.shiftKey ? $event.preventDefault() : null\"\n (click)=\"\n $event.shiftKey\n ? onShiftToggleRow(!rowIsSelected(row.record), row.record, $event)\n : $event.stopPropagation()\n \"\n (change)=\"onToggleRow($event.checked, row.record)\"\n [checked]=\"rowIsSelected(row.record)\"\n >\n </mat-checkbox>\n </td>\n </ng-container>\n\n <ng-container\n [matColumnDef]=\"column.name\"\n *ngFor=\"let column of template.columns\"\n >\n <ng-container *ngIf=\"columnIsSortable(column)\">\n <th\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n [matTooltip]=\"column.tooltip ? column.tooltip : undefined\"\n >\n {{ column.title }}\n </th>\n </ng-container>\n\n <ng-container *ngIf=\"!columnIsSortable(column)\">\n <th\n mat-header-cell\n *matHeaderCellDef\n [matTooltip]=\"column.tooltip ? column.tooltip : undefined\"\n >\n {{ column.title }}\n </th>\n </ng-container>\n\n <ng-container *ngIf=\"getColumnRenderer(column) as columnRenderer\">\n <ng-container\n *ngIf=\"columnRenderer === entityTableColumnRenderer.Default\"\n >\n <ng-container *matCellDef=\"let row\">\n <td\n mat-cell\n class=\"mat-cell-text\"\n *ngIf=\"!row.cellData[column.name].isUrl; else isAnUrlDefault\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n {{ row.cellData[column.name].value }}\n </td>\n <ng-template #isAnUrlDefault>\n <td\n mat-cell\n class=\"mat-cell-text\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n <a\n href=\"{{ row.cellData[column.name].value }}\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n >\n <img\n igoImageError\n *ngIf=\"row.cellData[column.name].isImg; else notImg\"\n src=\"{{\n row.cellData[column.name].value | secureImage | async\n }}\"\n width=\"50\"\n heigth=\"auto\"\n />\n <ng-template #notImg\n ><span\n >{{ 'igo.common.entity-table.targetHtmlUrl' | translate }}\n </span></ng-template\n >\n </a>\n </td>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"columnRenderer === entityTableColumnRenderer.HTML\">\n <ng-container *matCellDef=\"let row\">\n <td\n mat-cell\n class=\"mat-cell-text\"\n *ngIf=\"!row.cellData[column.name].isUrl; else isAnUrlHTML\"\n [ngClass]=\"row.cellData[column.name].class\"\n [innerHTML]=\"row.cellData[column.name].value\"\n ></td>\n <ng-template #isAnUrlHTML>\n <td\n mat-cell\n class=\"mat-cell-text\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n <a\n href=\"{{ row.cellData[column.name].value }}\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n >\n <img\n igoImageError\n *ngIf=\"row.cellData[column.name].isImg; else notImg\"\n src=\"{{\n row.cellData[column.name].value | secureImage | async\n }}\"\n width=\"50\"\n heigth=\"auto\"\n />\n <ng-template #notImg\n ><span\n >{{ 'igo.geo.targetHtmlUrl' | translate }}\n </span></ng-template\n >\n </a>\n </td>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"columnRenderer === entityTableColumnRenderer.UnsanitizedHTML\"\n >\n <ng-container *matCellDef=\"let row\">\n <td\n mat-cell\n class=\"mat-cell-text edition\"\n [formGroup]=\"formGroup\"\n *ngIf=\"isEdition(row.record); else isUnsanitizedHTML\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n <div class=\"date-picker\" *ngIf=\"column.type === 'date'\">\n <mat-datepicker-toggle\n matSuffix\n [for]=\"picker\"\n ></mat-datepicker-toggle>\n <input\n matInput\n [matDatepicker]=\"picker\"\n [formControlName]=\"column.name\"\n value=\"{{ row.cellData[column.name].value }}\"\n (dateChange)=\"onDateChange(column.name, row.record, $event)\"\n />\n <mat-datepicker #picker></mat-datepicker>\n </div>\n <input\n matInput\n type=\"time\"\n *ngIf=\"column.type === 'time'\"\n [formControlName]=\"column.name\"\n step=\"900\"\n (focus)=\"column.onFocus($event)\"\n (keypress)=\"column.onChange($event)\"\n (blur)=\"column.onBlur($event)\"\n />\n <input\n matInput\n type=\"number\"\n class=\"class_number_edition\"\n *ngIf=\"column.type === 'number'\"\n [formControlName]=\"column.name\"\n step=\"{{ column.step }}\"\n value=\"{{ row.cellData[column.name].value }}\"\n (input)=\"onValueChange(column.name, row.record, $event)\"\n readonly=\"{{ getValidationAttributeValue(column, 'readonly') }}\"\n required=\"{{\n getValidationAttributeValue(column, 'mandatory')\n }}\"\n min=\"{{ getValidationAttributeValue(column, 'minValue') }}\"\n max=\"{{ getValidationAttributeValue(column, 'maxValue') }}\"\n />\n <input\n matInput\n type=\"text\"\n *ngIf=\"!column.type || column.type === 'string'\"\n [formControlName]=\"column.name\"\n value=\"{{ row.cellData[column.name].value }}\"\n (input)=\"onValueChange(column.name, row.record, $event)\"\n readonly=\"{{ getValidationAttributeValue(column, 'readonly') }}\"\n required=\"{{\n getValidationAttributeValue(column, 'mandatory')\n }}\"\n />\n <mat-checkbox\n *ngIf=\"column.type === 'boolean'\"\n [formControlName]=\"column.name\"\n [checked]=\"row.cellData[column.name].value\"\n (change)=\"onBooleanValueChange(column.name, row.record, $event)\"\n ></mat-checkbox>\n <mat-select\n *ngIf=\"column.type === 'list'\"\n required=\"{{\n getValidationAttributeValue(column, 'mandatory')\n }}\"\n [formControlName]=\"column.name\"\n [multiple]=\"column.multiple\"\n (selectionChange)=\"\n onSelectValueChange(column.name, row.record, $event)\n \"\n [value]=\"row.cellData[column.name].value\"\n >\n <mat-option\n *ngFor=\"let option of column.domainValues\"\n [value]=\"option.id\"\n [disabled]=\"option.disabled\"\n >\n {{ option.value }}\n </mat-option>\n </mat-select>\n <input\n matInput\n type=\"text\"\n [formControlName]=\"column.name\"\n *ngIf=\"column.type === 'autocomplete'\"\n [matAutocomplete]=\"auto\"\n required=\"{{\n getValidationAttributeValue(column, 'mandatory')\n }}\"\n value=\"{{ row.cellData[column.name].value }}\"\n readonly=\"{{ getValidationAttributeValue(column, 'readonly') }}\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"\n onAutocompleteValueChange(column, row.record, $event)\n \"\n panelWidth=\"430px\"\n >\n <mat-option\n *ngFor=\"let option of filteredOptions[column.name] | async\"\n [value]=\"option.id\"\n >\n {{ option.value }}\n </mat-option>\n </mat-autocomplete>\n </td>\n <ng-template #isUnsanitizedHTML>\n <td\n mat-cell\n class=\"mat-cell-text\"\n *ngIf=\"\n !row.cellData[column.name].isUrl;\n else isAnUrlUnsanitizedHTML\n \"\n [ngClass]=\"row.cellData[column.name].class\"\n [innerHTML]=\"row.cellData[column.name].value | sanitizeHtml\"\n ></td>\n <ng-template #isAnUrlUnsanitizedHTML>\n <td\n mat-cell\n class=\"mat-cell-text\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n <a\n href=\"{{ row.cellData[column.name].value }}\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n >\n <img\n igoImageError\n *ngIf=\"row.cellData[column.name].isImg; else notImg\"\n src=\"{{\n row.cellData[column.name].value | secureImage | async\n }}\"\n width=\"50\"\n heigth=\"auto\"\n />\n <ng-template #notImg\n ><span\n >{{ 'igo.geo.targetHtmlUrl' | translate }}\n </span></ng-template\n >\n </a>\n </td>\n </ng-template>\n </ng-template>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"columnRenderer === entityTableColumnRenderer.Icon\">\n <td\n mat-cell\n *matCellDef=\"let row\"\n class=\"mat-cell-text\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n <mat-icon *ngIf=\"column.onClick\" (click)=\"column.onClick($event)\">{{\n row.cellData[column.name].value || column.icon\n }}</mat-icon>\n <mat-icon *ngIf=\"!column.onClick\">{{\n row.cellData[column.name].value || column.icon\n }}</mat-icon>\n </td>\n </ng-container>\n <ng-container\n *ngIf=\"columnRenderer === entityTableColumnRenderer.ButtonGroup\"\n >\n <ng-container *matCellDef=\"let row\">\n <td\n mat-cell\n class=\"mat-cell-text\"\n [ngClass]=\"row.cellData[column.name].class\"\n >\n <span *ngFor=\"let button of row.cellData[column.name].value\">\n <ng-container\n *ngIf=\"\n isEdition(row.record) === button.editMode ||\n button.editMode === undefined\n \"\n >\n <button\n *ngIf=\"button.style === 'mat-icon-button'\"\n igoStopPropagation\n mat-icon-button\n [color]=\"button.color\"\n (mousedown)=\"onButtonClick(button.click, row.record)\"\n [disabled]=\"button.disabled\"\n >\n <mat-icon>{{ button.icon }}</mat-icon>\n </button>\n <button\n *ngIf=\"button.style !== 'mat-icon-button'\"\n igoStopPropagation\n mat-mini-fab\n [color]=\"button.color\"\n (mousedown)=\"onButtonClick(button.click, row.record)\"\n [disabled]=\"button.disabled\"\n >\n <mat-icon>{{ button.icon }}</mat-icon>\n </button>\n </ng-container>\n </span>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <tr\n mat-header-row\n *matHeaderRowDef=\"headers; sticky: fixedHeader\"\n [ngClass]=\"getHeaderClass()\"\n ></tr>\n <tr\n mat-row\n igoEntityTableRow\n *matRowDef=\"let row; columns: headers\"\n [scrollBehavior]=\"scrollBehavior\"\n [ngClass]=\"getRowClass(row.record)\"\n [selection]=\"selection\"\n [selected]=\"rowIsSelected(row.record)\"\n (select)=\"onRowSelect(row.record)\"\n (click)=\"onRowClick(row.record)\"\n ></tr>\n </table>\n <igo-entity-table-paginator\n *ngIf=\"withPaginator\"\n [store]=\"store\"\n [paginatorOptions]=\"paginatorOptions\"\n [entitySortChange$]=\"entitySortChange$\"\n (paginatorChange)=\"paginatorChange($event)\"\n >\n </igo-entity-table-paginator>\n</div>\n", styles: [":host{width:100%;height:100%;display:block}:host.table-compact tr.mat-mdc-header-row,:host.table-compact ::ng-deep mat-checkbox .mat-ripple{height:36px}:host.table-compact tr.mat-mdc-row,:host.table-compact ::ng-deep mat-checkbox .mat-ripple{height:28px}:host .table-container{display:flex;flex-direction:column;height:100%;overflow:auto;flex:1 1 auto}:host .mat-cell-text{overflow:hidden;word-wrap:break-word}:host entity-table table.igo-entity-table-with-selection tr:hover{-moz-box-shadow:2px 0px 2px 0px #dddddd;-webkit-box-shadow:2px 0px 2px 0px #dddddd;-o-box-shadow:2px 0px 2px 0px #dddddd;box-shadow:2px 0 2px #ddd;cursor:pointer}:host table button{margin:7px}:host .class_hidden{visibility:hidden}:host .class_display_none{display:none}:host .class_boolean,:host .class_icon,:host .class_number{text-align:center;padding-right:35px!important}:host .class_string,:host .class_text,:host .class_number_edition{text-align:left}:host td.edition{background:#a6a6a633}:host input{border-bottom:1px solid darkgrey}\n"] }]
855
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.UntypedFormBuilder }, { type: i2.FocusMonitor }, { type: i0.ElementRef }, { type: i1.NgControl, decorators: [{
856
- type: Optional
857
- }, {
858
- type: Self
859
- }] }, { type: i1.NgForm, decorators: [{
860
- type: Optional
861
- }] }, { type: i1.FormControlName, decorators: [{
862
- type: Optional
863
- }] }, { type: i3.ErrorStateMatcher }, { type: i3.DateAdapter }], propDecorators: { store: [{
864
- type: Input
865
- }], paginator: [{
866
- type: Input
867
- }], template: [{
868
- type: Input
869
- }], scrollBehavior: [{
870
- type: Input
871
- }], sortNullsFirst: [{
872
- type: Input
873
- }], withPaginator: [{
874
- type: Input
875
- }], paginatorOptions: [{
876
- type: Input
877
- }], entityClick: [{
878
- type: Output
879
- }], entitySelectChange: [{
880
- type: Output
881
- }], entitySortChange: [{
882
- type: Output
883
- }] } });
884
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvbGliL2VudGl0eS9lbnRpdHktdGFibGUvZW50aXR5LXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvbGliL2VudGl0eS9lbnRpdHktdGFibGUvZW50aXR5LXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksRUFHTCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsZUFBZSxFQUNmLFdBQVcsRUFDWCxTQUFTLEVBQ1QsTUFBTSxFQUNOLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFDTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2hCLE1BQU0sd0JBQXdCLENB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O3NCQURiLEtBQUs7Z0JBT04sY0FBYztzQkFEYixLQUFLO2dCQU9OLGFBQWE7c0JBRFosS0FBSztnQkFPTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFNSSxXQUFXO3NCQUFwQixNQUFNO2dCQUtHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFPRyxnQkFBZ0I7c0JBQXpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb2N1c01vbml0b3IgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nRm9yLCBOZ0lmLCBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTZWxmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUcmFja0J5RnVuY3Rpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGb3JtQ29udHJvbE5hbWUsXG4gIEZvcm1zTW9kdWxlLFxuICBOZ0NvbnRyb2wsXG4gIE5nRm9ybSxcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgVW50eXBlZEZvcm1CdWlsZGVyLFxuICBVbnR5cGVkRm9ybUdyb3VwXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHByb3ZpZGVNb21lbnREYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQge1xuICBEYXRlQWRhcHRlcixcbiAgRXJyb3JTdGF0ZU1hdGNoZXIsXG4gIE1hdE5hdGl2ZURhdGVNb2R1bGUsXG4gIE1hdE9wdGlvbk1vZHVsZVxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7XG4gIE1hdEZvcm1GaWVsZENvbnRyb2wsXG4gIE1hdEZvcm1GaWVsZE1vZHVsZVxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRTb3J0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBTdHJpbmdVdGlscyB9IGZyb20gJ0BpZ28yL3V0aWxzJztcblxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIG1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNhbml0aXplSHRtbFBpcGUgfSBmcm9tICcuLi8uLi9jdXN0b20taHRtbC9jdXN0b20taHRtbC5waXBlJztcbmltcG9ydCB7IEltYWdlRXJyb3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9pbWFnZS9pbWFnZS1lcnJvci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2VjdXJlSW1hZ2VQaXBlIH0gZnJvbSAnLi4vLi4vaW1hZ2Uvc2VjdXJlLWltYWdlLnBpcGUnO1xuaW1wb3J0IHsgU3RvcFByb3BhZ2F0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vc3RvcC1wcm9wYWdhdGlvbi9zdG9wLXByb3BhZ2F0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBFbnRpdHlUYWJsZVBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4uL2VudGl0eS10YWJsZS1wYWdpbmF0b3IvZW50aXR5LXRhYmxlLXBhZ2luYXRvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW50aXR5VGFibGVQYWdpbmF0b3JPcHRpb25zIH0gZnJvbSAnLi4vZW50aXR5LXRhYmxlLXBhZ2luYXRvci9lbnRpdHktdGFibGUtcGFnaW5hdG9yLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBFbnRpdHlLZXksXG4gIEVudGl0eVJlY29yZCxcbiAgRW50aXR5U3RhdGUsXG4gIEVudGl0eVN0b3JlLFxuICBFbnRpdHlUYWJsZUNvbHVtbixcbiAgRW50aXR5VGFibGVDb2x1bW5SZW5kZXJlcixcbiAgRW50aXR5VGFibGVTY3JvbGxCZWhhdmlvcixcbiAgRW50aXR5VGFibGVTZWxlY3Rpb25TdGF0ZSxcbiAgRW50aXR5VGFibGVUZW1wbGF0ZVxufSBmcm9tICcuLi9zaGFyZWQnO1xuaW1wb3J0IHsgRW50aXR5VGFibGVSb3dEaXJlY3RpdmUgfSBmcm9tICcuL2VudGl0eS10YWJsZS1yb3cuZGlyZWN0aXZlJztcblxuaW50ZXJmYWNlIENlbGxEYXRhIHtcbiAgW2tleTogc3RyaW5nXToge1xuICAgIHZhbHVlOiBhbnk7XG4gICAgY2xhc3M6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9O1xuICAgIGlzVXJsOiBib29sZWFuO1xuICAgIGlzSW1nOiBib29sZWFuO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgUm93RGF0YSB7XG4gIHJlY29yZDogRW50aXR5UmVjb3JkPG9iamVjdCwgRW50aXR5U3RhdGU+O1xuICBjZWxsRGF0YTogQ2VsbERhdGE7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lnby1lbnRpdHktdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZW50aXR5LXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZW50aXR5LXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7IHByb3ZpZGU6IE1hdEZvcm1GaWVsZENvbnRyb2wsIHVzZUV4aXN0aW5nOiBFbnRpdHlUYWJsZUNvbXBvbmVudCB9LFxuICAgIHByb3ZpZGVNb21lbnREYXRlQWRhcHRlcigpXG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBBc3luY1BpcGUsXG4gICAgRW50aXR5VGFibGVQYWdpbmF0b3JDb21wb25lbnQsXG4gICAgRW50aXR5VGFibGVSb3dEaXJlY3RpdmUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgSW1hZ2VFcnJvckRpcmVjdGl2ZSxcbiAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdERhdGVwaWNrZXJNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0TmF0aXZlRGF0ZU1vZHVsZSwgLy8gRm9yIHRoZSBEYXRlQWRhcHRlciBwcm92aWRlclxuICAgIE1hdE9wdGlvbk1vZHVsZSxcbiAgICBNYXRTZWxlY3RNb2R1bGUsXG4gICAgTWF0U29ydE1vZHVsZSxcbiAgICBNYXRUYWJsZU1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIE5nQ2xhc3MsXG4gICAgTmdGb3IsXG4gICAgTmdJZixcbiAgICBOZ1N0eWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgU2FuaXRpemVIdG1sUGlwZSxcbiAgICBTZWN1cmVJbWFnZVBpcGUsXG4gICAgU3RvcFByb3BhZ2F0aW9uRGlyZWN0aXZlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEVudGl0eVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIGVudGl0eVNvcnRDaGFuZ2UkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICBwdWJsaWMgZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe30pO1xuXG4gIHB1YmxpYyBmaWx0ZXJlZE9wdGlvbnMgPSB7fTtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBjb2x1bW4gcmVuZGVyZXIgdHlwZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnRpdHlUYWJsZUNvbHVtblJlbmRlcmVyID0gRW50aXR5VGFibGVDb2x1bW5SZW5kZXJlcjtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBzZWxlY3Rpb24ncyBzdGF0ZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVudGl0eVRhYmxlU2VsZWN0aW9uU3RhdGUgPSBFbnRpdHlUYWJsZVNlbGVjdGlvblN0YXRlO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIG9mIHRoZSBzZWxlY3Rpb24scyBzdGF0ZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlYWRvbmx5IHNlbGVjdGlvblN0YXRlJDogQmVoYXZpb3JTdWJqZWN0PEVudGl0eVRhYmxlU2VsZWN0aW9uU3RhdGU+ID1cbiAgICBuZXcgQmVoYXZpb3JTdWJqZWN0KHVuZGVmaW5lZCk7XG5cbiAgLyoqXG4gICAqIFN1YnNjcmlwdGlvbiB0byB0aGUgc3RvcmUncyBzZWxlY3Rpb25cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0aW9uJCQ6IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSBkYXRhU291cmNlXG4gICAqL1xuICBwcml2YXRlIGRhdGFTb3VyY2UkJDogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCByZWNvcmQgY2hlY2tlZC4gVXNlZnVsIGZvciBzZWxlY3RpbmdcbiAgICogbXVsdGlwbGUgcmVjb3JkcyBieSBob2xkaW5nIHRoZSBzaGlmdCBrZXkgYW5kIGNoZWNraW5nXG4gICAqIGNoZWNrYm94ZXMuXG4gICAqL1xuICBwcml2YXRlIGxhc3RSZWNvcmRDaGVja2VkS2V5OiBFbnRpdHlLZXk7XG5cbiAgLyoqXG4gICAqIEVudGl0eSBzdG9yZVxuICAgKi9cbiAgQElucHV0KCkgc3RvcmU6IEVudGl0eVN0b3JlPG9iamVjdD47XG5cbiAgLyoqXG4gICAqIFRhYmxlIHBhZ2luYXRvclxuICAgKi9cbiAgQElucHV0KCkgc2V0IHBhZ2luYXRvcih2YWx1ZTogTWF0UGFnaW5hdG9yKSB7XG4gICAgdGhpcy5fcGFnaW5hdG9yID0gdmFsdWU7XG4gICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHBhZ2luYXRvcigpOiBNYXRQYWdpbmF0b3Ige1xuICAgIHJldHVybiB0aGlzLl9wYWdpbmF0b3I7XG4gIH1cbiAgcHJpdmF0ZSBfcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG5cbiAgLyoqXG4gICAqIFRhYmxlIHRlbXBsYXRlXG4gICAqL1xuICBASW5wdXQoKSB0ZW1wbGF0ZTogRW50aXR5VGFibGVUZW1wbGF0ZTtcblxuICAvKipcbiAgICogU2Nyb2xsIGJlaGF2aW9yIG9uIHNlbGVjdGlvblxuICAgKi9cbiAgQElucHV0KClcbiAgc2Nyb2xsQmVoYXZpb3I6IEVudGl0eVRhYmxlU2Nyb2xsQmVoYXZpb3IgPSBFbnRpdHlUYWJsZVNjcm9sbEJlaGF2aW9yLkF1dG87XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgbnVsbHMgc2hvdWxkIGJlIGZpcnN0IHdoZW4gc29ydGluZ1xuICAgKi9cbiAgQElucHV0KClcbiAgc29ydE51bGxzRmlyc3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2hvdyB0aGUgdGFibGUgcGFnaW5hdG9yIG9yIG5vdC4gRmFsc2UgYnkgZGVmYXVsdC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHdpdGhQYWdpbmF0b3I6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogUGFnaW5hdG9yIG9wdGlvbnNcbiAgICovXG4gIEBJbnB1dCgpXG4gIHBhZ2luYXRvck9wdGlvbnM6IEVudGl0eVRhYmxlUGFnaW5hdG9yT3B0aW9ucztcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGFuIGVudGl0eSAocm93KSBpcyBjbGlja2VkXG4gICAqL1xuICBAT3V0cHV0KCkgZW50aXR5Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGFuIGVudGl0eSAocm93KSBpcyBzZWxlY3RlZFxuICAgKi9cbiAgQE91dHB1dCgpIGVudGl0eVNlbGVjdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGFkZGVkOiBvYmplY3RbXTtcbiAgfT4oKTtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSB0YWJsZSBzb3J0IGlzIGNoYW5nZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgZW50aXR5U29ydENoYW5nZTogRXZlbnRFbWl0dGVyPHtcbiAgICBjb2x1bW46IEVudGl0eVRhYmxlQ29sdW1uO1xuICAgIGRpcmVjdGlvbjogc3RyaW5nO1xuICB9PiA9IG5ldyBFdmVudEVtaXR0ZXIodW5kZWZpbmVkKTtcblxuICAvKipcbiAgICogVGFibGUgaGVhZGVyc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldCBoZWFkZXJzKCk6IHN0cmluZ1tdIHtcbiAgICBsZXQgY29sdW1ucyA9IHRoaXMudGVtcGxhdGUuY29sdW1uc1xuICAgICAgLmZpbHRlcigoY29sdW1uOiBFbnRpdHlUYWJsZUNvbHVtbikgPT4gY29sdW1uLnZpc2libGUgIT09IGZhbHNlKVxuICAgICAgLm1hcCgoY29sdW1uOiBFbnRpdHlUYWJsZUNvbHVtbikgPT4gY29sdW1uLm5hbWUpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uQ2hlY2tib3ggPT09IHRydWUpIHtcbiAgICAgIGNvbHVtbnMgPSBbJ3NlbGVjdGlvbkNoZWNrYm94J10uY29uY2F0KGNvbHVtbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIERhdGEgc291cmNlIGNvbnN1bWFibGUgYnkgdGhlIHVuZGVybHlpbmcgbWF0ZXJpYWwgdGFibGVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBkYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxSb3dEYXRhPigpO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNlbGVjdGlvbiBpcyBzdXBwb3J0ZWRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXQgc2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLnNlbGVjdGlvbiB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgc2VsZWN0aW9uIGNoZWNrYm94IHNob3VsZCBiZSBkaXNwbGF5ZWRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXQgc2VsZWN0aW9uQ2hlY2tib3goKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUuc2VsZWN0aW9uQ2hlY2tib3ggfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBzZWxlY3Rpb24gbWFueSBlbnRpdGllcyBzaG91bGQgZWIgc3VwcG9ydGVkXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0IHNlbGVjdE1hbnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUuc2VsZWN0TWFueSB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNlbGVjdGlvbiBtYW55IGVudGl0aWVzIHNob3VsZCBlYiBzdXBwb3J0ZWRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXQgZml4ZWRIZWFkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUuZml4ZWRIZWFkZXIgPT09IHVuZGVmaW5lZFxuICAgICAgPyB0cnVlXG4gICAgICA6IHRoaXMudGVtcGxhdGUuZml4ZWRIZWFkZXI7XG4gIH1cblxuICBnZXQgdGFibGVIZWlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS50YWJsZUhlaWdodCA/IHRoaXMudGVtcGxhdGUudGFibGVIZWlnaHQgOiAnYXV0byc7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJvdGVjdGVkIF9mb2N1c01vbml0b3I6IEZvY3VzTW9uaXRvcixcbiAgICBwcm90ZWN0ZWQgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfcGFyZW50Rm9ybTogTmdGb3JtLFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfY29udHJvbE5hbWU6IEZvcm1Db250cm9sTmFtZSxcbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcjogRXJyb3JTdGF0ZU1hdGNoZXIsXG4gICAgcHJpdmF0ZSBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT5cbiAgKSB7XG4gICAgdGhpcy5kYXRlQWRhcHRlci5zZXRMb2NhbGUoJ2ZyLUNBJyk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgdGhlIHNlbGVjdGlvbiBzdGF0ZSB0byBwcm9wZXJseSBkaXNwbGF5IHRoZSBzZWxlY3Rpb24gY2hlY2tib3hlc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaGFuZGxlRGF0YXNvdXJjZSgpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICB0aGlzLnN0b3JlLnN0YXRlLmNoYW5nZSQucGlwZShkZWJvdW5jZVRpbWUoMTAwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlRGF0YXNvdXJjZSgpO1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBjaGFuZ2VzLnN0b3JlO1xuICAgIGlmIChzdG9yZSAmJiBzdG9yZS5jdXJyZW50VmFsdWUgIT09IHN0b3JlLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMuaGFuZGxlRGF0YXNvdXJjZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHRleHQgb3IgbnVtYmVyIHZhbHVlIGNoYW5nZSAoZWRpdGlvbilcbiAgICovXG4gIG9uVmFsdWVDaGFuZ2UoY29sdW1uOiBzdHJpbmcsIHJlY29yZDogRW50aXR5UmVjb3JkPGFueT4sIGV2ZW50KSB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4pO1xuICAgIHJlY29yZC5lbnRpdHkucHJvcGVydGllc1trZXldID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYm9vbGVhbiB2YWx1ZSBjaGFuZ2UgKGVkaXRpb24pXG4gICAqL1xuICBvbkJvb2xlYW5WYWx1ZUNoYW5nZShjb2x1bW46IHN0cmluZywgcmVjb3JkOiBFbnRpdHlSZWNvcmQ8YW55PiwgZXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldENvbHVtbktleVdpdGhvdXRQcm9wZXJ0aWVzVGFnKGNvbHVtbik7XG4gICAgcmVjb3JkLmVudGl0eS5wcm9wZXJ0aWVzW2tleV0gPSBldmVudC5jaGVja2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3Mgc2VsZWN0IHZhbHVlIGNoYW5nZSAoZWRpdGlvbilcbiAgICovXG4gIG9uU2VsZWN0VmFsdWVDaGFuZ2UoY29sdW1uOiBzdHJpbmcsIHJlY29yZDogRW50aXR5UmVjb3JkPGFueT4sIGV2ZW50KSB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4pO1xuICAgIHJlY29yZC5lbnRpdHkucHJvcGVydGllc1trZXldID0gZXZlbnQudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhdXRvY29tcGxldGUgdmFsdWUgY2hhbmdlIChlZGl0aW9uKVxuICAgKi9cbiAgb25BdXRvY29tcGxldGVWYWx1ZUNoYW5nZShcbiAgICBjb2x1bW46IEVudGl0eVRhYmxlQ29sdW1uLFxuICAgIHJlY29yZDogRW50aXR5UmVjb3JkPGFueT4sXG4gICAgZXZlbnRcbiAgKSB7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29sdW1uLm5hbWVdLnNldFZhbHVlKGV2ZW50Lm9wdGlvbi52aWV3VmFsdWUpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0Q29sdW1uS2V5V2l0aG91dFByb3BlcnRpZXNUYWcoY29sdW1uLm5hbWUpO1xuICAgIHJlY29yZC5lbnRpdHkucHJvcGVydGllc1trZXldID0gZXZlbnQub3B0aW9uLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgZGF0ZSB2YWx1ZSBjaGFuZ2UgKGVkaXRpb24pXG4gICAqL1xuICBvbkRhdGVDaGFuZ2UoY29sdW1uOiBzdHJpbmcsIHJlY29yZDogRW50aXR5UmVjb3JkPGFueT4sIGV2ZW50KSB7XG4gICAgY29uc3QgZm9ybWF0ID0gJ1lZWVktTU0tREQnO1xuICAgIGNvbnN0IHZhbHVlID0gbW9tZW50KGV2ZW50LnZhbHVlKS5mb3JtYXQoZm9ybWF0KTtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldENvbHVtbktleVdpdGhvdXRQcm9wZXJ0aWVzVGFnKGNvbHVtbik7XG4gICAgcmVjb3JkLmVudGl0eS5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgZWRpdGlvbiBtb2RlIGZvciBvbmUgcm93XG4gICAqIE1vcmUgdGhhbiBvbmUgcm93IGNhbiBiZSBlZGl0ZWQgYXQgdGhlIHNhbWUgdGltZVxuICAgKi9cbiAgcHJpdmF0ZSBlbmFibGVFZGl0KHJlY29yZDogRW50aXR5UmVjb3JkPGFueT4pIHtcbiAgICBjb25zdCBpdGVtID0gcmVjb3JkLmVudGl0eS5wcm9wZXJ0aWVzIHx8IHJlY29yZC5lbnRpdHk7XG4gICAgdGhpcy50ZW1wbGF0ZS5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgY29sdW1uLnRpdGxlID1cbiAgICAgICAgY29sdW1uLnZhbGlkYXRpb24/Lm1hbmRhdG9yeSAmJiAhY29sdW1uLnRpdGxlLmluY2x1ZGVzKCcqJylcbiAgICAgICAgICA/IGNvbHVtbi50aXRsZSArICcgKidcbiAgICAgICAgICA6IGNvbHVtbi50aXRsZTtcblxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4ubmFtZSk7XG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICBpZiAoIWl0ZW1ba2V5XSB8fCBpdGVtW2tleV0gPT09IG51bGwpIHtcbiAgICAgICAgICBpdGVtW2tleV0gPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaXRlbVtrZXldID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGl0ZW1ba2V5XSA9IEpTT04ucGFyc2UoaXRlbVtrZXldLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnNldENvbnRyb2woXG4gICAgICAgICAgY29sdW1uLm5hbWUsXG4gICAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKGl0ZW1ba2V5XSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdsaXN0Jykge1xuICAgICAgICBpZiAoY29sdW1uLm11bHRpcGxlKSB7XG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXAuc2V0Q29udHJvbChcbiAgICAgICAgICAgIGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFtpdGVtW2tleV1dKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXAuc2V0Q29udHJvbChcbiAgICAgICAgICAgIGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKGl0ZW1ba2V5XSlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdHlwZW9mIGl0ZW1ba2V5XSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29sdW1uLm5hbWVdLnNldFZhbHVlKHBhcnNlSW50KGl0ZW1ba2V5XSkpXG4gICAgICAgICAgICA6IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbHVtbi5uYW1lXS5zZXRWYWx1ZShpdGVtW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnYXV0b2NvbXBsZXRlJykge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5zZXRDb250cm9sKFxuICAgICAgICAgIGNvbHVtbi5uYW1lLFxuICAgICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChpdGVtW2tleV0pXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnNbY29sdW1uLm5hbWVdID0gbmV3IE9ic2VydmFibGU8YW55W10+KCk7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zW2NvbHVtbi5uYW1lXSA9IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW1xuICAgICAgICAgIGNvbHVtbi5uYW1lXG4gICAgICAgIF0udmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgbWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5kb21haW5WYWx1ZXM/LmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyTm9ybWFsaXplZCA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJylcbiAgICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZU5hbWVOb3JtYWxpemVkID0gb3B0aW9uLnZhbHVlXG4gICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVOYW1lTm9ybWFsaXplZC5pbmNsdWRlcyhmaWx0ZXJOb3JtYWxpemVkKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgZm9ybUNvbnRyb2xWYWx1ZSA9IGl0ZW1ba2V5XTtcbiAgICAgICAgY29sdW1uLmRvbWFpblZhbHVlcy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgZm9ybUNvbnRyb2xWYWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIFN0cmluZ1V0aWxzLmlzVmFsaWROdW1iZXIoZm9ybUNvbnRyb2xWYWx1ZSkgJiZcbiAgICAgICAgICAgICFTdHJpbmdVdGlscy5pc09jdGFsTnVtYmVyKGZvcm1Db250cm9sVmFsdWUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmb3JtQ29udHJvbFZhbHVlID0gcGFyc2VJbnQoZm9ybUNvbnRyb2xWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG9wdGlvbi52YWx1ZSA9PT0gZm9ybUNvbnRyb2xWYWx1ZSB8fFxuICAgICAgICAgICAgb3B0aW9uLmlkID09PSBmb3JtQ29udHJvbFZhbHVlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmb3JtQ29udHJvbFZhbHVlID0gb3B0aW9uLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29sdW1uLm5hbWVdLnNldFZhbHVlKGZvcm1Db250cm9sVmFsdWUpO1xuICAgICAgICBpZiAodGhpcy5pc0VkaXRpb24ocmVjb3JkKSAmJiBjb2x1bW4ubGlua0NvbHVtbkZvcmNlKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gcmVjb3JkLmVudGl0eSBhcyBhbnk7XG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29sdW1uLm5hbWVdLnNldFZhbHVlKFxuICAgICAgICAgICAgZW50aXR5Py5wcm9wZXJ0aWVzW1xuICAgICAgICAgICAgICB0aGlzLmdldENvbHVtbktleVdpdGhvdXRQcm9wZXJ0aWVzVGFnKGNvbHVtbi5saW5rQ29sdW1uRm9yY2UpXG4gICAgICAgICAgICBdXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgIGlmIChjb2x1bW4udmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBpZiAoaXRlbVtrZXldKSB7XG4gICAgICAgICAgICBsZXQgZGF0ZSA9IG1vbWVudChpdGVtW2tleV0pO1xuICAgICAgICAgICAgaXRlbVtrZXldID0gZGF0ZS51dGMoKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnNldENvbnRyb2woXG4gICAgICAgICAgICAgIGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woaXRlbVtrZXldKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3S2V5ID0gdGhpcy5nZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4ubmFtZSk7XG4gICAgICAgICAgICByZWNvcmQuZW50aXR5LnByb3BlcnRpZXNbbmV3S2V5XSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5zZXRDb250cm9sKFxuICAgICAgICAgICAgICBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG51bGwpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuc2V0Q29udHJvbChcbiAgICAgICAgICBjb2x1bW4ubmFtZSxcbiAgICAgICAgICB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woaXRlbVtrZXldKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbHVtbi5uYW1lXSAmJlxuICAgICAgICB0aGlzLmdldFZhbGlkYXRpb25BdHRyaWJ1dGVWYWx1ZShjb2x1bW4sICdyZWFkb25seScpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29sdW1uLm5hbWVdLmRpc2FibGUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGF0YXNvdXJjZSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlU3RvcmUoKTtcbiAgICB0aGlzLnNlbGVjdGlvbiQkID0gdGhpcy5zdG9yZS5zdGF0ZVZpZXdcbiAgICAgIC5tYW55QnkkKChyZWNvcmQ6IEVudGl0eVJlY29yZDxvYmplY3Q+KSA9PiByZWNvcmQuc3RhdGUuc2VsZWN0ZWQgPT09IHRydWUpXG4gICAgICAuc3Vic2NyaWJlKChyZWNvcmRzOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PltdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpcnN0U2VsZWN0ZWQgPSByZWNvcmRzWzBdO1xuICAgICAgICBjb25zdCBmaXJzdFNlbGVjdGVkU3RhdGV2aWV3UG9zaXRpb24gPSB0aGlzLnN0b3JlLnN0YXRlVmlld1xuICAgICAgICAgIC5hbGwoKVxuICAgICAgICAgIC5pbmRleE9mKGZpcnN0U2VsZWN0ZWQpO1xuICAgICAgICBjb25zdCBwYWdlTWF4ID0gdGhpcy5wYWdpbmF0b3JcbiAgICAgICAgICA/IHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplICogKHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCArIDEpXG4gICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBwYWdlTWluID0gdGhpcy5wYWdpbmF0b3IgPyBwYWdlTWF4IC0gdGhpcy5wYWdpbmF0b3IucGFnZVNpemUgOiAwO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnBhZ2luYXRvciAmJlxuICAgICAgICAgIChmaXJzdFNlbGVjdGVkU3RhdGV2aWV3UG9zaXRpb24gPCBwYWdlTWluIHx8XG4gICAgICAgICAgICBmaXJzdFNlbGVjdGVkU3RhdGV2aWV3UG9zaXRpb24gPj0gcGFnZU1heClcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcGFnZVRvUmVhY2ggPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgZmlyc3RTZWxlY3RlZFN0YXRldmlld1Bvc2l0aW9uIC8gdGhpcy5wYWdpbmF0b3IucGFnZVNpemVcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZUluZGV4ID0gcGFnZVRvUmVhY2g7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGF0ZSQubmV4dCh0aGlzLmNvbXB1dGVTZWxlY3Rpb25TdGF0ZShyZWNvcmRzKSk7XG4gICAgICB9KTtcbiAgICB0aGlzLmRhdGFTb3VyY2UkJCA9IHRoaXMuc3RvcmUuc3RhdGVWaWV3LmFsbCQoKS5zdWJzY3JpYmUoKGFsbCkgPT4ge1xuICAgICAgaWYgKGFsbFswXSkge1xuICAgICAgICB0aGlzLmVuYWJsZUVkaXQoYWxsWzBdKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gYWxsLm1hcCgocmVjb3JkKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgIGNlbGxEYXRhOiB0aGlzLnRlbXBsYXRlLmNvbHVtbnMucmVkdWNlKFxuICAgICAgICAgICAgKGNlbGxEYXRhOiBDZWxsRGF0YSwgY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZShyZWNvcmQsIGNvbHVtbik7XG4gICAgICAgICAgICAgIGNlbGxEYXRhW2NvbHVtbi5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgICBjbGFzczogdGhpcy5nZXRDZWxsQ2xhc3MocmVjb3JkLCBjb2x1bW4pLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIGlzVXJsOiB0aGlzLmlzVXJsKHZhbHVlKSxcbiAgICAgICAgICAgICAgICBpc0ltZzogdGhpcy5pc0ltZyh2YWx1ZSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIGNlbGxEYXRhO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICAgKVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5iaW5kIHRoZSBzdG9yZSB3YXRjaGVyXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZVN0b3JlKCk7XG4gIH1cblxuICBwcml2YXRlIHVuc3Vic2NyaWJlU3RvcmUoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uJCQpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uJCQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZSQkKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UkJC51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja2J5IGZ1bmN0aW9uXG4gICAqIEBwYXJhbSByZWNvcmQgUmVjb3JkXG4gICAqIEBwYXJhbSBpbmRleCBSZWNvcmQgaW5kZXhcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRUcmFja0J5RnVuY3Rpb24oKTogVHJhY2tCeUZ1bmN0aW9uPFJvd0RhdGE+IHtcbiAgICByZXR1cm4gKF9pbmRleCwgcm93KSA9PiByb3cucmVjb3JkLnJlZjtcbiAgfVxuICAvKipcbiAgICogVHJpZ2dlciBhIHJlZnJlc2ggb2YgdGhlIHRhYmxlLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlblxuICAgKiB0aGUgZGF0YSBzb3VyY2UgZG9lc24ndCBlbWl0IGEgbmV3IHZhbHVlIGJ1dCBmb3Igc29tZSByZWFzb25cbiAgICogdGhlIHJlY29yZHMgbmVlZCBhbiB1cGRhdGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHBhZ2luYXRvckNoYW5nZShldmVudDogTWF0UGFnaW5hdG9yKSB7XG4gICAgdGhpcy5wYWdpbmF0b3IgPSBldmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBzb3J0LCBzb3J0IHRoZSBzdG9yZVxuICAgKiBAcGFyYW0gZXZlbnQgU29ydCBldmVudFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uU29ydChldmVudDogeyBhY3RpdmU6IHN0cmluZzsgZGlyZWN0aW9uOiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGV2ZW50LmRpcmVjdGlvbjtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLnRlbXBsYXRlLmNvbHVtbnMuZmluZChcbiAgICAgIChjOiBFbnRpdHlUYWJsZUNvbHVtbikgPT4gYy5uYW1lID09PSBldmVudC5hY3RpdmVcbiAgICApO1xuXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2FzYycgfHwgZGlyZWN0aW9uID09PSAnZGVzYycpIHtcbiAgICAgIHRoaXMuc3RvcmUuc3RhdGVWaWV3LnNvcnQoe1xuICAgICAgICB2YWx1ZUFjY2Vzc29yOiAocmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PikgPT5cbiAgICAgICAgICB0aGlzLmdldFZhbHVlKHJlY29yZCwgY29sdW1uKSxcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBudWxsc0ZpcnN0OiB0aGlzLnNvcnROdWxsc0ZpcnN0XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZW50aXR5U29ydENoYW5nZS5lbWl0KHsgY29sdW1uLCBkaXJlY3Rpb24gfSk7XG4gICAgICB0aGlzLmVudGl0eVNvcnRDaGFuZ2UkLm5leHQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcmUuc3RhdGVWaWV3LnNvcnQodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBhbiBlbnRpdHkgaXMgY2xpY2tlZCwgZW1pdCBhbiBldmVudFxuICAgKiBAcGFyYW0gcmVjb3JkIFJlY29yZFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uUm93Q2xpY2socmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0Pikge1xuICAgIHRoaXMubGFzdFJlY29yZENoZWNrZWRLZXkgPSB0aGlzLnN0b3JlLnN0YXRlVmlldy5nZXRLZXkocmVjb3JkKTtcbiAgICB0aGlzLmVudGl0eUNsaWNrLmVtaXQocmVjb3JkLmVudGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBhbiBlbnRpdHkgaXMgc2VsZWN0ZWQsIHNlbGVjdCBpdCBpbiB0aGUgc3RvcmUgYW5kIGVtaXQgYW4gZXZlbnQuIEV2ZW4gaWZcbiAgICogXCJtYW55XCIgaXMgc2V0IHRvIHRydWUsIHRoaXMgbWV0aG9kIGFsd2F5cyBzZWxlY3QgYSBzaW5nbGUsIGV4Y2x1c2l2ZSByb3cuIFNlbGVjdGluZ1xuICAgKiBtdWx0aXBsZSByb3dzIHNob3VsZCBiZSBhY2hpZXZlZCBieSB1c2luZyB0aGUgY2hlY2tib3hlcy5cbiAgICogQHBhcmFtIHJlY29yZCBSZWNvcmRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvblJvd1NlbGVjdChyZWNvcmQ6IEVudGl0eVJlY29yZDxvYmplY3Q+KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IHJlY29yZC5lbnRpdHk7XG4gICAgdGhpcy5zdG9yZS5zdGF0ZS51cGRhdGUoZW50aXR5LCB7IHNlbGVjdGVkOiB0cnVlIH0sIHRydWUpO1xuICAgIHRoaXMuZW50aXR5U2VsZWN0Q2hhbmdlLmVtaXQoeyBhZGRlZDogW2VudGl0eV0gfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IG9yIHVuc2VsZWN0IGFsbCByb3dzIGF0IG9uY2UuIE9uIHNlbGVjdCwgZW1pdCBhbiBldmVudC5cbiAgICogQHBhcmFtIHRvZ2dsZSBTZWxlY3Qgb3IgdW5zZWxlY3RcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvblRvZ2dsZVJvd3ModG9nZ2xlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0aWVzID0gdGhpcy5zdG9yZS52aWV3LmFsbCgpO1xuICAgIHRoaXMuZW50aXR5U2VsZWN0Q2hhbmdlLmVtaXQoeyBhZGRlZDogW2VudGl0aWVzXSB9KTtcbiAgICB0aGlzLnN0b3JlLnN0YXRlLnVwZGF0ZU1hbnkoZW50aXRpZXMsIHsgc2VsZWN0ZWQ6IHRvZ2dsZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGFuIGVudGl0eSBpcyB0b2dnbGVkLCBzZWxlY3Qgb3IgdW5zZWxlY3QgaXQgaW4gdGhlIHN0b3JlLiBPbiBzZWxlY3QsXG4gICAqIGVtaXQgYW4gZXZlbnQuXG4gICAqIEBwYXJhbSB0b2dnbGUgU2VsZWN0IG9yIHVuc2VsZWN0XG4gICAqIEBwYXJhbSByZWNvcmQgUmVjb3JkXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb25Ub2dnbGVSb3codG9nZ2xlOiBib29sZWFuLCByZWNvcmQ6IEVudGl0eVJlY29yZDxvYmplY3Q+KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IHJlY29yZC5lbnRpdHk7XG4gICAgY29uc3QgZXhjbHVzaXZlID0gdG9nZ2xlID09PSB0cnVlICYmICF0aGlzLnNlbGVjdE1hbnk7XG4gICAgdGhpcy5zdG9yZS5zdGF0ZS51cGRhdGUoZW50aXR5LCB7IHNlbGVjdGVkOiB0b2dnbGUgfSwgZXhjbHVzaXZlKTtcbiAgICBpZiAodG9nZ2xlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmVudGl0eVNlbGVjdENoYW5nZS5lbWl0KHsgYWRkZWQ6IFtlbnRpdHldIH0pO1xuICAgIH1cbiAgICB0aGlzLmxhc3RSZWNvcmRDaGVja2VkS2V5ID0gdGhpcy5zdG9yZS5zdGF0ZVZpZXcuZ2V0S2V5KHJlY29yZCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBhbiBlbnRpdHkgaXMgdG9nZ2xlZCwgc2VsZWN0IG9yIHVuc2VsZWN0IGl0IGluIHRoZSBzdG9yZS4gT24gc2VsZWN0LFxuICAgKiBlbWl0IGFuIGV2ZW50LlxuICAgKiBAcGFyYW0gdG9nZ2xlIFNlbGVjdCBvciB1bnNlbGVjdFxuICAgKiBAcGFyYW0gcmVjb3JkIFJlY29yZFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uU2hpZnRUb2dnbGVSb3coXG4gICAgdG9nZ2xlOiBib29sZWFuLFxuICAgIHJlY29yZDogRW50aXR5UmVjb3JkPG9iamVjdD4sXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnRcbiAgKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdE1hbnkgPT09IGZhbHNlIHx8IHRoaXMubGFzdFJlY29yZENoZWNrZWRLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vblRvZ2dsZVJvdyh0b2dnbGUsIHJlY29yZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgbWF0IGNoZWNrYm94IHdyb25nIGJlaGF2aW9yXG4gICAgLy8gd2hlbiB0aGUgc2hpZnQga2V5IGlzIGhlbGQuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzYyMzJcbiAgICBjb25zdCByYW5nZSA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGUoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgd2luZG93LmdldFNlbGVjdGlvbigpLmFkZFJhbmdlKHJhbmdlKTtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IHJlY29yZHMgPSB0aGlzLnN0b3JlLnN0YXRlVmlldy5hbGwoKTtcbiAgICBjb25zdCByZWNvcmRJbmRleCA9IHJlY29yZHMuaW5kZXhPZihyZWNvcmQpO1xuICAgIGNvbnN0IGxhc3RSZWNvcmRDaGVja2VkID0gdGhpcy5zdG9yZS5zdGF0ZVZpZXcuZ2V0KFxuICAgICAgdGhpcy5sYXN0UmVjb3JkQ2hlY2tlZEtleVxuICAgICk7XG4gICAgY29uc3QgbGFzdFJlY29yZEluZGV4ID0gcmVjb3Jkcy5pbmRleE9mKGxhc3RSZWNvcmRDaGVja2VkKTtcbiAgICBjb25zdCBpbmRleGVzID0gW3JlY29yZEluZGV4LCBsYXN0UmVjb3JkSW5kZXhdO1xuICAgIGNvbnN0IHNlbGVjdFJlY29yZHMgPSByZWNvcmRzLnNsaWNlKFxuICAgICAgTWF0aC5taW4oLi4uaW5kZXhlcyksXG4gICAgICBNYXRoLm1heCguLi5pbmRleGVzKSArIDFcbiAgICApO1xuXG4gICAgY29uc3QgZW50aXRpZXMgPSBzZWxlY3RSZWNvcmRzLm1hcChcbiAgICAgIChfcmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PikgPT4gX3JlY29yZC5lbnRpdHlcbiAgICApO1xuICAgIHRoaXMuc3RvcmUuc3RhdGUudXBkYXRlTWFueShlbnRpdGllcywgeyBzZWxlY3RlZDogdG9nZ2xlIH0pO1xuICAgIGlmICh0b2dnbGUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuZW50aXR5U2VsZWN0Q2hhbmdlLmVtaXQoeyBhZGRlZDogZW50aXRpZXMgfSk7XG4gICAgfVxuICAgIHRoaXMubGFzdFJlY29yZENoZWNrZWRLZXkgPSB0aGlzLnN0b3JlLnN0YXRlVmlldy5nZXRLZXkocmVjb3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSBzZWxlY3Rpb24gc3RhdGVcbiAgICogQHJldHVybnMgV2hldGhlciBhbGwsIHNvbWUgb3Igbm8gcm93cyBhcmUgc2VsZWN0ZWRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVTZWxlY3Rpb25TdGF0ZShcbiAgICBzZWxlY3RlZFJlY29yZHM6IEVudGl0eVJlY29yZDxvYmplY3Q+W11cbiAgKTogRW50aXR5VGFibGVTZWxlY3Rpb25TdGF0ZSB7XG4gICAgY29uc3Qgc3RhdGVzID0gRW50aXR5VGFibGVTZWxlY3Rpb25TdGF0ZTtcbiAgICBjb25zdCBzZWxlY3Rpb25Db3VudCA9IHNlbGVjdGVkUmVjb3Jkcy5sZW5ndGg7XG4gICAgcmV0dXJuIHNlbGVjdGlvbkNvdW50ID09PSAwXG4gICAgICA/IHN0YXRlcy5Ob25lXG4gICAgICA6IHNlbGVjdGlvbkNvdW50ID09PSB0aGlzLnN0b3JlLnN0YXRlVmlldy5jb3VudFxuICAgICAgICA/IHN0YXRlcy5BbGxcbiAgICAgICAgOiBzdGF0ZXMuU29tZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgY29sdW1uIGlzIHNvcnRhYmxlXG4gICAqIEBwYXJhbSBjb2x1bW4gQ29sdW1uXG4gICAqIEByZXR1cm5zIFRydWUgaWYgYSBjb2x1bW4gaXMgc29ydGFibGVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBjb2x1bW5Jc1NvcnRhYmxlKGNvbHVtbjogRW50aXR5VGFibGVDb2x1bW4pOiBib29sZWFuIHtcbiAgICBsZXQgc29ydGFibGUgPSBjb2x1bW4uc29ydDtcbiAgICBpZiAoc29ydGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc29ydGFibGUgPSB0aGlzLnRlbXBsYXRlLnNvcnQgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdGhpcy50ZW1wbGF0ZS5zb3J0O1xuICAgIH1cbiAgICByZXR1cm4gc29ydGFibGU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIHJvdyBpcyBzaG91bGQgYmUgc2VsZWN0ZWQgYmFzZWQgb24gdGhlIHVuZGVybHlpbmcgZW50aXR5IHN0YXRlXG4gICAqIEBwYXJhbSByZWNvcmQgUmVjb3JkXG4gICAqIEByZXR1cm5zIFRydWUgaWYgYSByb3cgc2hvdWxkIGJlIHNlbGVjdGVkXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcm93SXNTZWxlY3RlZChyZWNvcmQ6IEVudGl0eVJlY29yZDxvYmplY3Q+KTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhdGUgPSByZWNvcmQuc3RhdGU7XG4gICAgcmV0dXJuIHN0YXRlLnNlbGVjdGVkID8gc3RhdGUuc2VsZWN0ZWQgOiBmYWxzZTtcbiAgfVxuXG4gIGlzSW1nKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuaXNVcmwodmFsdWUpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBbJ2pwZycsICdwbmcnLCAnZ2lmJ10uaW5kZXhPZih2YWx1ZS5zcGxpdCgnLicpLnBvcCgpLnRvTG93ZXJDYXNlKCkpICE9PVxuICAgICAgICAtMVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlzVXJsKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHZhbHVlLnNsaWNlKDAsIDgpID09PSAnaHR0cHM6Ly8nIHx8IHZhbHVlLnNsaWNlKDAsIDcpID09PSAnaHR0cDovLydcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGFjY2VzcyBhbiBlbnRpdHkncyB2YWx1ZXNcbiAgICogQHBhcmFtIHJlY29yZCBSZWNvcmRcbiAgICogQHBhcmFtIGNvbHVtbiBDb2x1bW5cbiAgICogQHJldHVybnMgQW55IHZhbHVlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0VmFsdWUocmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PiwgY29sdW1uOiBFbnRpdHlUYWJsZUNvbHVtbik6IGFueSB7XG4gICAgY29uc3QgZW50aXR5ID0gcmVjb3JkLmVudGl0eTtcbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKGNvbHVtbi52YWx1ZUFjY2Vzc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjb2x1bW4udmFsdWVBY2Nlc3NvcihlbnRpdHksIHJlY29yZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRlbXBsYXRlLnZhbHVlQWNjZXNzb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGUudmFsdWVBY2Nlc3NvcihlbnRpdHksIGNvbHVtbi5uYW1lLCByZWNvcmQpO1xuICAgIH1cbiAgICB2YWx1ZSA9IHRoaXMuc3RvcmUuZ2V0UHJvcGVydHkoZW50aXR5LCBjb2x1bW4ubmFtZSk7XG5cbiAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHZhbHVlID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICB2YWx1ZSA9IEJvb2xlYW4odmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gSlNPTi5wYXJzZSh2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzRWRpdGlvbihyZWNvcmQpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUgPyAnJiMxMDAwMzsnIDogJyc7IC8vIGNoZWNrIG1hcmtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnbGlzdCcgJiYgdmFsdWUgJiYgY29sdW1uLmRvbWFpblZhbHVlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gcmVjb3JkLmVudGl0eSBhcyBhbnk7XG4gICAgICBpZiAoY29sdW1uLm11bHRpcGxlKSB7XG4gICAgICAgIGxldCBsaXN0X2lkO1xuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyAobGlzdF9pZCA9IHZhbHVlLm1hdGNoKC9bXFx3Li1dKy9nKS5tYXAoTnVtYmVyKSlcbiAgICAgICAgICA6IChsaXN0X2lkID0gdmFsdWUpO1xuICAgICAgICBsZXQgbGlzdF9vcHRpb24gPSBbXTtcblxuICAgICAgICBjb2x1bW4uZG9tYWluVmFsdWVzLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICAgIGlmIChsaXN0X2lkLmluY2x1ZGVzKG9wdGlvbi5pZCkpIHtcbiAgICAgICAgICAgIGlmIChyZWNvcmQuZWRpdGlvbikge1xuICAgICAgICAgICAgICBsaXN0X29wdGlvbi5wdXNoKG9wdGlvbi5pZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsaXN0X29wdGlvbi5wdXNoKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmlzRWRpdGlvbihyZWNvcmQpID8gKHZhbHVlID0gbGlzdF9pZCkgOiAodmFsdWUgPSBsaXN0X29wdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMuaXNFZGl0aW9uKHJlY29yZCkgJiYgY29sdW1uLmxpbmtDb2x1bW5Gb3JjZSkge1xuICAgICAgICAgIHZhbHVlID1cbiAgICAgICAgICAgIGVudGl0eT8ucHJvcGVydGllc1tcbiAgICAgICAgICAgICAgdGhpcy5nZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4ubGlua0NvbHVtbkZvcmNlKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2x1bW4uZG9tYWluVmFsdWVzLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgIFN0cmluZ1V0aWxzLmlzVmFsaWROdW1iZXIodmFsdWUpICYmXG4gICAgICAgICAgICAgICFTdHJpbmdVdGlscy5pc09jdGFsTnVtYmVyKHZhbHVlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbi52YWx1ZSA9PT0gdmFsdWUgfHwgb3B0aW9uLmlkID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLmlzRWRpdGlvbihyZWNvcmQpXG4gICAgICAgICAgICAgICAgPyAodmFsdWUgPSBvcHRpb24uaWQpXG4gICAgICAgICAgICAgICAgOiAodmFsdWUgPSBvcHRpb24udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2F1dG9jb21wbGV0ZScgJiYgdmFsdWUgJiYgY29sdW1uLmRvbWFpblZhbHVlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gcmVjb3JkLmVudGl0eSBhcyBhbnk7XG4gICAgICBpZiAoIXRoaXMuaXNFZGl0aW9uKHJlY29yZCkgJiYgY29sdW1uLmxpbmtDb2x1bW5Gb3JjZSkge1xuICAgICAgICB2YWx1ZSA9XG4gICAgICAgICAgZW50aXR5Py5wcm9wZXJ0aWVzW1xuICAgICAgICAgICAgdGhpcy5nZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4ubGlua0NvbHVtbkZvcmNlKVxuICAgICAgICAgIF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2x1bW4uZG9tYWluVmFsdWVzLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIFN0cmluZ1V0aWxzLmlzVmFsaWROdW1iZXIodmFsdWUpICYmXG4gICAgICAgICAgICAhU3RyaW5nVXRpbHMuaXNPY3RhbE51bWJlcih2YWx1ZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3B0aW9uLnZhbHVlID09PSB2YWx1ZSB8fCBvcHRpb24uaWQgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09ICdkYXRlJykge1xuICAgICAgaWYgKHRoaXMuaXNFZGl0aW9uKHJlY29yZCkpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgbGV0IGRhdGUgPSBtb21lbnQodmFsdWUpO1xuICAgICAgICAgIHZhbHVlID0gZGF0ZS5mb3JtYXQoKTtcbiAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tjb2x1bW4ubmFtZV0uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzRWRpdGlvbihyZWNvcmQpICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBhY2Nlc3MgYW4gZW50aXR5J3MgdmFsaWRhdGlvbiB2YWx1ZXNcbiAgICogQHBhcmFtIGNvbHVtbiBDb2x1bW5cbiAgICogQHBhcmFtIHZhbGlkYXRpb25UeXBlIHN0cmluZ1xuICAgKiBAcmV0dXJucyBBbnkgdmFsdWUgKGZhbHNlIGlmIG5vIHZhbGlkYXRpb24gb3Igbm90IHRoZSBvbmUgY29uY2VybmVkKVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldFZhbGlkYXRpb25BdHRyaWJ1dGVWYWx1ZShcbiAgICBjb2x1bW46IEVudGl0eVRhYmxlQ29sdW1uLFxuICAgIHZhbGlkYXRpb25UeXBlOiBzdHJpbmdcbiAgKTogYW55IHtcbiAgICBpZiAoXG4gICAgICBjb2x1bW4udmFsaWRhdGlvbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBjb2x1bW4udmFsaWRhdGlvblt2YWxpZGF0aW9uVHlwZV0gIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbHVtbi52YWxpZGF0aW9uW3ZhbGlkYXRpb25UeXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0VkaXRpb24ocmVjb3JkKSB7XG4gICAgcmV0dXJuIHJlY29yZC5lbnRpdHkuZWRpdGlvbiA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHR5cGUgb2YgcmVuZGVyZXIgb2YgYSBjb2x1bW5cbiAgICogQHBhcmFtIGNvbHVtbiBDb2x1bW5cbiAgICogQHJldHVybnMgUmVuZGVyZXIgdHlwZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldENvbHVtblJlbmRlcmVyKGNvbHVtbjogRW50aXR5VGFibGVDb2x1bW4pOiBFbnRpdHlUYWJsZUNvbHVtblJlbmRlcmVyIHtcbiAgICBpZiAoY29sdW1uLnJlbmRlcmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjb2x1bW4ucmVuZGVyZXI7XG4gICAgfVxuICAgIHJldHVybiBFbnRpdHlUYWJsZUNvbHVtblJlbmRlcmVyLkRlZmF1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0YWJsZSBuZ0NsYXNzXG4gICAqIEByZXR1cm5zIG5nQ2xhc3NcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRUYWJsZUNsYXNzKCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2lnby1lbnRpdHktdGFibGUtd2l0aC1zZWxlY3Rpb24nOiB0aGlzLnNlbGVjdGlvblxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgaGVhZGVyIG5nQ2xhc3NcbiAgICogQHJldHVybnMgbmdDbGFzc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldEhlYWRlckNsYXNzKCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHtcbiAgICBjb25zdCBmdW5jID0gdGhpcy50ZW1wbGF0ZS5oZWFkZXJDbGFzc0Z1bmM7XG4gICAgaWYgKGZ1bmMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgcmV0dXJuIGZ1bmMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIHJvdyBuZ0NsYXNzXG4gICAqIEBwYXJhbSByZWNvcmQgUmVjb3JkXG4gICAqIEByZXR1cm5zIG5nQ2xhc3NcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRSb3dDbGFzcyhyZWNvcmQ6IEVudGl0eVJlY29yZDxvYmplY3Q+KTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0ge1xuICAgIGNvbnN0IGVudGl0eSA9IHJlY29yZC5lbnRpdHk7XG4gICAgY29uc3QgZnVuYyA9IHRoaXMudGVtcGxhdGUucm93Q2xhc3NGdW5jO1xuICAgIGlmIChmdW5jIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybiBmdW5jKGVudGl0eSwgcmVjb3JkKTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIHJvdyBuZ0NsYXNzXG4gICAqIEBwYXJhbSByZWNvcmQgUmVjb3JkXG4gICAqIEBwYXJhbSBjb2x1bW4gQ29sdW1uXG4gICAqIEByZXR1cm5zIG5nQ2xhc3NcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRDZWxsQ2xhc3MoXG4gICAgcmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PixcbiAgICBjb2x1bW46IEVudGl0eVRhYmxlQ29sdW1uXG4gICk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHtcbiAgICBjb25zdCBlbnRpdHkgPSByZWNvcmQuZW50aXR5O1xuICAgIGNvbnN0IGNscyA9IHt9O1xuXG4gICAgY29uc3QgdGFibGVGdW5jID0gdGhpcy50ZW1wbGF0ZS5jZWxsQ2xhc3NGdW5jO1xuICAgIGlmICh0YWJsZUZ1bmMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgT2JqZWN0LmFzc2lnbihjbHMsIHRhYmxlRnVuYyhlbnRpdHksIGNvbHVtbiwgcmVjb3JkKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uRnVuYyA9IGNvbHVtbi5jZWxsQ2xhc3NGdW5jO1xuICAgIGlmIChjb2x1bW5GdW5jIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2xzLCBjb2x1bW5GdW5jKGVudGl0eSwgcmVjb3JkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNscztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGEgYnV0dG9uIGlzIGNsaWNrZWRcbiAgICogQHBhcmFtIGZ1bmMgRnVuY3Rpb25cbiAgICogQHBhcmFtIHJlY29yZCBSZWNvcmRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvbkJ1dHRvbkNsaWNrKFxuICAgIGNsaWNrRnVuYzogKGVudGl0eTogb2JqZWN0LCByZWNvcmQ/OiBFbnRpdHlSZWNvcmQ8b2JqZWN0PikgPT4gdm9pZCxcbiAgICByZWNvcmQ6IEVudGl0eVJlY29yZDxvYmplY3Q+XG4gICkge1xuICAgIHRoaXMuZW5hYmxlRWRpdChyZWNvcmQpO1xuICAgIGlmICh0eXBlb2YgY2xpY2tGdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjbGlja0Z1bmMocmVjb3JkLmVudGl0eSwgcmVjb3JkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgY29sdW1uIG5hbWUgd2l0aG91dCBoaXMgXCJwcm9wZXJ0aWVzXCIgdGFnICh1c2VmdWwgZm9yIGVkaXRpb24gd29ya3NwYWNlIHByb3BlcnRpZXMpXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uS2V5V2l0aG91dFByb3BlcnRpZXNUYWcoY29sdW1uOiBzdHJpbmcpIHtcbiAgICBpZiAoY29sdW1uLmluY2x1ZGVzKCdwcm9wZXJ0aWVzLicpKSB7XG4gICAgICByZXR1cm4gY29sdW1uLnNwbGl0KCcuJylbMV07XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW47XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIiBbbmdTdHlsZV09XCJ7IGhlaWdodDogdGFibGVIZWlnaHQgfVwiPlxuICA8dGFibGVcbiAgICBpZD1cImN1cnJlbnRXb3Jrc3BhY2VUYWJsZVwiXG4gICAgbWF0LXRhYmxlXG4gICAgbWF0U29ydFxuICAgIFtuZ0NsYXNzXT1cImdldFRhYmxlQ2xhc3MoKVwiXG4gICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgW3RyYWNrQnldPVwiZ2V0VHJhY2tCeUZ1bmN0aW9uKClcIlxuICAgIChtYXRTb3J0Q2hhbmdlKT1cIm9uU29ydCgkZXZlbnQpXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0aW9uQ2hlY2tib3hcIiBjbGFzcz1cIm1hdC1jZWxsLWNoZWNrYm94XCI+XG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0TWFueVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb25TdGF0ZSQgfCBhc3luYyBhcyBzZWxlY3Rpb25TdGF0ZVwiPlxuICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlUm93cygkZXZlbnQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb25TdGF0ZSA9PT0gZW50aXR5VGFibGVTZWxlY3Rpb25TdGF0ZS5BbGxcIlxuICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGF0ZSA9PT0gZW50aXR5VGFibGVTZWxlY3Rpb25TdGF0ZS5Tb21lXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RoPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc2hpZnRLZXkgPyAkZXZlbnQucHJldmVudERlZmF1bHQoKSA6IG51bGxcIlxuICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICRldmVudC5zaGlmdEtleVxuICAgICAgICAgICAgICA/IG9uU2hpZnRUb2dnbGVSb3coIXJvd0lzU2VsZWN0ZWQocm93LnJlY29yZCksIHJvdy5yZWNvcmQsICRldmVudClcbiAgICAgICAgICAgICAgOiAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICBcIlxuICAgICAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVSb3coJGV2ZW50LmNoZWNrZWQsIHJvdy5yZWNvcmQpXCJcbiAgICAgICAgICBbY2hlY2tlZF09XCJyb3dJc1NlbGVjdGVkKHJvdy5yZWNvcmQpXCJcbiAgICAgICAgPlxuICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5uYW1lXCJcbiAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdGVtcGxhdGUuY29sdW1uc1wiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbklzU29ydGFibGUoY29sdW1uKVwiPlxuICAgICAgICA8dGhcbiAgICAgICAgICBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgIG1hdC1zb3J0LWhlYWRlclxuICAgICAgICAgIFttYXRUb29sdGlwXT1cImNvbHVtbi50b29sdGlwID8gY29sdW1uLnRvb2x0aXAgOiB1bmRlZmluZWRcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgY29sdW1uLnRpdGxlIH19XG4gICAgICAgIDwvdGg+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2x1bW5Jc1NvcnRhYmxlKGNvbHVtbilcIj5cbiAgICAgICAgPHRoXG4gICAgICAgICAgbWF0LWhlYWRlci1jZWxsXG4gICAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcbiAgICAgICAgICBbbWF0VG9vbHRpcF09XCJjb2x1bW4udG9vbHRpcCA/IGNvbHVtbi50b29sdGlwIDogdW5kZWZpbmVkXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGNvbHVtbi50aXRsZSB9fVxuICAgICAgICA8L3RoPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDb2x1bW5SZW5kZXJlcihjb2x1bW4pIGFzIGNvbHVtblJlbmRlcmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cImNvbHVtblJlbmRlcmVyID09PSBlbnRpdHlUYWJsZUNvbHVtblJlbmRlcmVyLkRlZmF1bHRcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICBtYXQtY2VsbFxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1jZWxsLXRleHRcIlxuICAgICAgICAgICAgICAqbmdJZj1cIiFyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLmlzVXJsOyBlbHNlIGlzQW5VcmxEZWZhdWx0XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS5jbGFzc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0udmFsdWUgfX1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2lzQW5VcmxEZWZhdWx0PlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICBtYXQtY2VsbFxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LWNlbGwtdGV4dFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS5jbGFzc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgaHJlZj1cInt7IHJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0udmFsdWUgfX1cIlxuICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICBpZ29JbWFnZUVycm9yXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS5pc0ltZzsgZWxzZSBub3RJbWdcIlxuICAgICAgICAgICAgICAgICAgICBzcmM9XCJ7e1xuICAgICAgICAgICAgICAgICAgICAgIHJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0udmFsdWUgfCBzZWN1cmVJbWFnZSB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCI1MFwiXG4gICAgICAgICAgICAgICAgICAgIGhlaWd0aD1cImF1dG9cIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm90SW1nXG4gICAgICAgICAgICAgICAgICAgID48c3BhblxuICAgICAgICAgICAgICAgICAgICAgID57eyAnaWdvLmNvbW1vbi5lbnRpdHktdGFibGUudGFyZ2V0SHRtbFVybCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvbmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtblJlbmRlcmVyID09PSBlbnRpdHlUYWJsZUNvbHVtblJlbmRlcmVyLkhUTUxcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgIG1hdC1jZWxsXG4gICAgICAgICAgICAgIGNsYXNzPVwibWF0LWNlbGwtdGV4dFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiIXJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0uaXNVcmw7IGVsc2UgaXNBblVybEhUTUxcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLmNsYXNzXCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLnZhbHVlXCJcbiAgICAgICAgICAgID48L3RkPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpc0FuVXJsSFRNTD5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgbWF0LWNlbGxcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1jZWxsLXRleHRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0uY2xhc3NcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgIGhyZWY9XCJ7eyByb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLnZhbHVlIH19XCJcbiAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgaWdvSW1hZ2VFcnJvclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0uaXNJbWc7IGVsc2Ugbm90SW1nXCJcbiAgICAgICAgICAgICAgICAgICAgc3JjPVwie3tcbiAgICAgICAgICAgICAgICAgICAgICByb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLnZhbHVlIHwgc2VjdXJlSW1hZ2UgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiNTBcIlxuICAgICAgICAgICAgICAgICAgICBoZWlndGg9XCJhdXRvXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vdEltZ1xuICAgICAgICAgICAgICAgICAgICA+PHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICA+e3sgJ2lnby5nZW8udGFyZ2V0SHRtbFVybCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvbmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiY29sdW1uUmVuZGVyZXIgPT09IGVudGl0eVRhYmxlQ29sdW1uUmVuZGVyZXIuVW5zYW5pdGl6ZWRIVE1MXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgbWF0LWNlbGxcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtY2VsbC10ZXh0IGVkaXRpb25cIlxuICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNFZGl0aW9uKHJvdy5yZWNvcmQpOyBlbHNlIGlzVW5zYW5pdGl6ZWRIVE1MXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS5jbGFzc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlclwiICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdkYXRlJ1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGVcbiAgICAgICAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgICAgICAgW2Zvcl09XCJwaWNrZXJcIlxuICAgICAgICAgICAgICAgID48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIlxuICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb2x1bW4ubmFtZVwiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT1cInt7IHJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0udmFsdWUgfX1cIlxuICAgICAgICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwib25EYXRlQ2hhbmdlKGNvbHVtbi5uYW1lLCByb3cucmVjb3JkLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0aW1lXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi50eXBlID09PSAndGltZSdcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29sdW1uLm5hbWVcIlxuICAgICAgICAgICAgICAgIHN0ZXA9XCI5MDBcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJjb2x1bW4ub25Gb2N1cygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwiY29sdW1uLm9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cImNvbHVtbi5vbkJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjbGFzc19udW1iZXJfZWRpdGlvblwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ251bWJlcidcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29sdW1uLm5hbWVcIlxuICAgICAgICAgICAgICAgIHN0ZXA9XCJ7eyBjb2x1bW4uc3RlcCB9fVwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJ7eyByb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLnZhbHVlIH19XCJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZShjb2x1bW4ubmFtZSwgcm93LnJlY29yZCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgcmVhZG9ubHk9XCJ7eyBnZXRWYWxpZGF0aW9uQXR0cmlidXRlVmFsdWUoY29sdW1uLCAncmVhZG9ubHknKSB9fVwiXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJ7e1xuICAgICAgICAgICAgICAgICAgZ2V0VmFsaWRhdGlvbkF0dHJpYnV0ZVZhbHVlKGNvbHVtbiwgJ21hbmRhdG9yeScpXG4gICAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICAgIG1pbj1cInt7IGdldFZhbGlkYXRpb25BdHRyaWJ1dGVWYWx1ZShjb2x1bW4sICdtaW5WYWx1ZScpIH19XCJcbiAgICAgICAgICAgICAgICBtYXg9XCJ7eyBnZXRWYWxpZGF0aW9uQXR0cmlidXRlVmFsdWUoY29sdW1uLCAnbWF4VmFsdWUnKSB9fVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNvbHVtbi50eXBlIHx8IGNvbHVtbi50eXBlID09PSAnc3RyaW5nJ1wiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb2x1bW4ubmFtZVwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJ7eyByb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLnZhbHVlIH19XCJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZShjb2x1bW4ubmFtZSwgcm93LnJlY29yZCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgcmVhZG9ubHk9XCJ7eyBnZXRWYWxpZGF0aW9uQXR0cmlidXRlVmFsdWUoY29sdW1uLCAncmVhZG9ubHknKSB9fVwiXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJ7e1xuICAgICAgICAgICAgICAgICAgZ2V0VmFsaWRhdGlvbkF0dHJpYnV0ZVZhbHVlKGNvbHVtbiwgJ21hbmRhdG9yeScpXG4gICAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2Jvb2xlYW4nXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbHVtbi5uYW1lXCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQm9vbGVhblZhbHVlQ2hhbmdlKGNvbHVtbi5uYW1lLCByb3cucmVjb3JkLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPjwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdsaXN0J1wiXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJ7e1xuICAgICAgICAgICAgICAgICAgZ2V0VmFsaWRhdGlvbkF0dHJpYnV0ZVZhbHVlKGNvbHVtbiwgJ21hbmRhdG9yeScpXG4gICAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29sdW1uLm5hbWVcIlxuICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJjb2x1bW4ubXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICBvblNlbGVjdFZhbHVlQ2hhbmdlKGNvbHVtbi5uYW1lLCByb3cucmVjb3JkLCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwicm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBjb2x1bW4uZG9tYWluVmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24uaWRcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLnZhbHVlIH19XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29sdW1uLm5hbWVcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdhdXRvY29tcGxldGUnXCJcbiAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwie3tcbiAgICAgICAgICAgICAgICAgIGdldFZhbGlkYXRpb25BdHRyaWJ1dGVWYWx1ZShjb2x1bW4sICdtYW5kYXRvcnknKVxuICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cInt7IHJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0udmFsdWUgfX1cIlxuICAgICAgICAgICAgICAgIHJlYWRvbmx5PVwie3sgZ2V0VmFsaWRhdGlvbkF0dHJpYnV0ZVZhbHVlKGNvbHVtbiwgJ3JlYWRvbmx5JykgfX1cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwiXG4gICAgICAgICAgICAgICAgICBvbkF1dG9jb21wbGV0ZVZhbHVlQ2hhbmdlKGNvbHVtbiwgcm93LnJlY29yZCwgJGV2ZW50KVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgcGFuZWxXaWR0aD1cIjQzMHB4XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9uc1tjb2x1bW4ubmFtZV0gfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBvcHRpb24udmFsdWUgfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2lzVW5zYW5pdGl6ZWRIVE1MPlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICBtYXQtY2VsbFxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LWNlbGwtdGV4dFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICFyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLmlzVXJsO1xuICAgICAgICAgICAgICAgICAgZWxzZSBpc0FuVXJsVW5zYW5pdGl6ZWRIVE1MXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLmNsYXNzXCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0udmFsdWUgfCBzYW5pdGl6ZUh0bWxcIlxuICAgICAgICAgICAgICA+PC90ZD5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpc0FuVXJsVW5zYW5pdGl6ZWRIVE1MPlxuICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgbWF0LWNlbGxcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LWNlbGwtdGV4dFwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLmNsYXNzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICBocmVmPVwie3sgcm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgIGlnb0ltYWdlRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0uaXNJbWc7IGVsc2Ugbm90SW1nXCJcbiAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJ7e1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZSB8IHNlY3VyZUltYWdlIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCI1MFwiXG4gICAgICAgICAgICAgICAgICAgICAgaGVpZ3RoPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm90SW1nXG4gICAgICAgICAgICAgICAgICAgICAgPjxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICA+e3sgJ2lnby5nZW8udGFyZ2V0SHRtbFVybCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+PC9uZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uUmVuZGVyZXIgPT09IGVudGl0eVRhYmxlQ29sdW1uUmVuZGVyZXIuSWNvblwiPlxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgbWF0LWNlbGxcbiAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICBjbGFzcz1cIm1hdC1jZWxsLXRleHRcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS5jbGFzc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLm9uQ2xpY2tcIiAoY2xpY2spPVwiY29sdW1uLm9uQ2xpY2soJGV2ZW50KVwiPnt7XG4gICAgICAgICAgICAgIHJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0udmFsdWUgfHwgY29sdW1uLmljb25cbiAgICAgICAgICAgIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFjb2x1bW4ub25DbGlja1wiPnt7XG4gICAgICAgICAgICAgIHJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0udmFsdWUgfHwgY29sdW1uLmljb25cbiAgICAgICAgICAgIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiY29sdW1uUmVuZGVyZXIgPT09IGVudGl0eVRhYmxlQ29sdW1uUmVuZGVyZXIuQnV0dG9uR3JvdXBcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICBtYXQtY2VsbFxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1jZWxsLXRleHRcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLmNsYXNzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiByb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgaXNFZGl0aW9uKHJvdy5yZWNvcmQpID09PSBidXR0b24uZWRpdE1vZGUgfHxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmVkaXRNb2RlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImJ1dHRvbi5zdHlsZSA9PT0gJ21hdC1pY29uLWJ1dHRvbidcIlxuICAgICAgICAgICAgICAgICAgICBpZ29TdG9wUHJvcGFnYXRpb25cbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJidXR0b24uY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQnV0dG9uQ2xpY2soYnV0dG9uLmNsaWNrLCByb3cucmVjb3JkKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b24uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+e3sgYnV0dG9uLmljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYnV0dG9uLnN0eWxlICE9PSAnbWF0LWljb24tYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIGlnb1N0b3BQcm9wYWdhdGlvblxuICAgICAgICAgICAgICAgICAgICBtYXQtbWluaS1mYWJcbiAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImJ1dHRvbi5jb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25CdXR0b25DbGljayhidXR0b24uY2xpY2ssIHJvdy5yZWNvcmQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1dHRvbi5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj57eyBidXR0b24uaWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDx0clxuICAgICAgbWF0LWhlYWRlci1yb3dcbiAgICAgICptYXRIZWFkZXJSb3dEZWY9XCJoZWFkZXJzOyBzdGlja3k6IGZpeGVkSGVhZGVyXCJcbiAgICAgIFtuZ0NsYXNzXT1cImdldEhlYWRlckNsYXNzKClcIlxuICAgID48L3RyPlxuICAgIDx0clxuICAgICAgbWF0LXJvd1xuICAgICAgaWdvRW50aXR5VGFibGVSb3dcbiAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBoZWFkZXJzXCJcbiAgICAgIFtzY3JvbGxCZWhhdmlvcl09XCJzY3JvbGxCZWhhdmlvclwiXG4gICAgICBbbmdDbGFzc109XCJnZXRSb3dDbGFzcyhyb3cucmVjb3JkKVwiXG4gICAgICBbc2VsZWN0aW9uXT1cInNlbGVjdGlvblwiXG4gICAgICBbc2VsZWN0ZWRdPVwicm93SXNTZWxlY3RlZChyb3cucmVjb3JkKVwiXG4gICAgICAoc2VsZWN0KT1cIm9uUm93U2VsZWN0KHJvdy5yZWNvcmQpXCJcbiAgICAgIChjbGljayk9XCJvblJvd0NsaWNrKHJvdy5yZWNvcmQpXCJcbiAgICA+PC90cj5cbiAgPC90YWJsZT5cbiAgPGlnby1lbnRpdHktdGFibGUtcGFnaW5hdG9yXG4gICAgKm5nSWY9XCJ3aXRoUGFnaW5hdG9yXCJcbiAgICBbc3RvcmVdPVwic3RvcmVcIlxuICAgIFtwYWdpbmF0b3JPcHRpb25zXT1cInBhZ2luYXRvck9wdGlvbnNcIlxuICAgIFtlbnRpdHlTb3J0Q2hhbmdlJF09XCJlbnRpdHlTb3J0Q2hhbmdlJFwiXG4gICAgKHBhZ2luYXRvckNoYW5nZSk9XCJwYWdpbmF0b3JDaGFuZ2UoJGV2ZW50KVwiXG4gID5cbiAgPC9pZ28tZW50aXR5LXRhYmxlLXBhZ2luYXRvcj5cbjwvZGl2PlxuIl19