@energycap/components 0.31.5 → 0.32.0

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 (292) hide show
  1. package/energycap-components.min.css +2 -2
  2. package/energycap-email.min.css +1 -1
  3. package/esm2020/energycap-components.mjs +5 -0
  4. package/esm2020/lib/components.module.mjs +386 -0
  5. package/esm2020/lib/controls/banner/banner.component.mjs +106 -0
  6. package/esm2020/lib/controls/button/button.component.mjs +106 -0
  7. package/esm2020/lib/controls/button/copy-button.directive.mjs +65 -0
  8. package/esm2020/lib/controls/checkbox/checkbox.component.mjs +139 -0
  9. package/esm2020/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -0
  10. package/esm2020/lib/controls/combobox/combobox.component.mjs +841 -0
  11. package/esm2020/lib/controls/dropdown/dropdown.component.mjs +237 -0
  12. package/esm2020/lib/controls/file-upload/file-upload.component.mjs +169 -0
  13. package/esm2020/lib/controls/form-control/form-control.component.mjs +86 -0
  14. package/esm2020/lib/controls/form-control-base.mjs +143 -0
  15. package/esm2020/lib/controls/form-control-label/form-control-label.component.mjs +136 -0
  16. package/esm2020/lib/controls/form-group/form-group.component.mjs +252 -0
  17. package/esm2020/lib/controls/help-popover/help-popover.component.mjs +28 -0
  18. package/esm2020/lib/controls/item-picker/item-picker.component.mjs +233 -0
  19. package/esm2020/lib/controls/link-button/link-button.component.mjs +11 -0
  20. package/esm2020/lib/controls/menu/menu.component.mjs +443 -0
  21. package/{esm2015/lib/controls/navigation/link-item.js → esm2020/lib/controls/navigation/link-item.mjs} +0 -0
  22. package/{esm2015/lib/controls/navigation/nav-group.js → esm2020/lib/controls/navigation/nav-group.mjs} +0 -0
  23. package/esm2020/lib/controls/navigation/nav-item-active.directive.mjs +92 -0
  24. package/{esm2015/lib/controls/navigation/nav-item.js → esm2020/lib/controls/navigation/nav-item.mjs} +0 -0
  25. package/esm2020/lib/controls/numericbox/numericbox.component.mjs +371 -0
  26. package/esm2020/lib/controls/popover/popover.component.mjs +84 -0
  27. package/{esm2015/lib/controls/radio-button/radio-button-option.js → esm2020/lib/controls/radio-button/radio-button-option.mjs} +0 -0
  28. package/esm2020/lib/controls/radio-button/radio-button.component.mjs +81 -0
  29. package/esm2020/lib/controls/select/select.component.mjs +87 -0
  30. package/esm2020/lib/controls/tabs/tabs.component.mjs +47 -0
  31. package/esm2020/lib/controls/textbox/textbox.component.mjs +154 -0
  32. package/{esm2015/lib/core/cache.service.js → esm2020/lib/core/cache.service.mjs} +9 -8
  33. package/{esm2015/lib/core/custom-validators.js → esm2020/lib/core/custom-validators.mjs} +0 -0
  34. package/{esm2015/lib/core/date-time-helper.js → esm2020/lib/core/date-time-helper.mjs} +0 -0
  35. package/esm2020/lib/core/error.service.mjs +57 -0
  36. package/esm2020/lib/core/scroll.service.mjs +89 -0
  37. package/esm2020/lib/core/telemetry-tracker.service.mjs +16 -0
  38. package/esm2020/lib/core/telemetry.service.mjs +38 -0
  39. package/esm2020/lib/core/validation-message.service.mjs +181 -0
  40. package/{esm2015/lib/core/validation-patterns.js → esm2020/lib/core/validation-patterns.mjs} +0 -0
  41. package/esm2020/lib/core/window.service.mjs +182 -0
  42. package/esm2020/lib/display/app-bar/app-bar.component.mjs +46 -0
  43. package/esm2020/lib/display/avatar/avatar.component.mjs +67 -0
  44. package/{esm2015/lib/display/avatar/avatar.service.js → esm2020/lib/display/avatar/avatar.service.mjs} +9 -7
  45. package/esm2020/lib/display/confirm/confirm.component.mjs +131 -0
  46. package/{esm2015/lib/display/dialog/dialog-content.js → esm2020/lib/display/dialog/dialog-content.mjs} +0 -0
  47. package/esm2020/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -0
  48. package/{esm2015/lib/display/dialog/dialog-types.js → esm2020/lib/display/dialog/dialog-types.mjs} +0 -0
  49. package/esm2020/lib/display/dialog/dialog.component.mjs +242 -0
  50. package/esm2020/lib/display/dialog/dialog.service.mjs +71 -0
  51. package/{esm2015/lib/display/help/help-types.js → esm2020/lib/display/help/help-types.mjs} +0 -0
  52. package/esm2020/lib/display/hierarchy/hierarchy-base.mjs +106 -0
  53. package/{esm2015/lib/display/hierarchy/hierarchy-mocks.spec.js → esm2020/lib/display/hierarchy/hierarchy-mocks.spec.mjs} +5 -9
  54. package/esm2020/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +59 -0
  55. package/esm2020/lib/display/item-display/item-display.component.mjs +67 -0
  56. package/esm2020/lib/display/json-display/json-display.component.mjs +47 -0
  57. package/esm2020/lib/display/resizable/resizable-base.mjs +120 -0
  58. package/esm2020/lib/display/resizable/resizable.component.mjs +57 -0
  59. package/esm2020/lib/display/spinner/spinner.component.mjs +12 -0
  60. package/esm2020/lib/display/splash/splash.component.mjs +42 -0
  61. package/esm2020/lib/display/splash/splash.service.mjs +35 -0
  62. package/esm2020/lib/display/table/resizable-column.component.mjs +20 -0
  63. package/esm2020/lib/display/table/resizable-table.directive.mjs +227 -0
  64. package/esm2020/lib/display/table/searchable-table.component.mjs +338 -0
  65. package/esm2020/lib/display/table/table-detail-row.component.mjs +27 -0
  66. package/esm2020/lib/display/table/table-locked-column.component.mjs +58 -0
  67. package/esm2020/lib/display/table/table-master-header-row.component.mjs +11 -0
  68. package/esm2020/lib/display/table/table-master-row.component.mjs +150 -0
  69. package/esm2020/lib/display/table/table-pagination.component.mjs +150 -0
  70. package/esm2020/lib/display/table/table-selectable-row.component.mjs +235 -0
  71. package/esm2020/lib/display/table/table.component.mjs +244 -0
  72. package/esm2020/lib/display/tags/tag.mjs +15 -0
  73. package/esm2020/lib/display/tags/tags.component.mjs +77 -0
  74. package/esm2020/lib/display/toast/toast/toast.component.mjs +77 -0
  75. package/{esm2015/lib/display/toast/toast-types.js → esm2020/lib/display/toast/toast-types.mjs} +0 -0
  76. package/esm2020/lib/display/toast/toast.service.mjs +35 -0
  77. package/esm2020/lib/display/toast/toaster/toaster.component.mjs +114 -0
  78. package/esm2020/lib/display/tooltip/tooltip.component.mjs +25 -0
  79. package/esm2020/lib/display/tooltip/tooltip.service.mjs +63 -0
  80. package/esm2020/lib/display/tree/tree.component.mjs +125 -0
  81. package/esm2020/lib/display/view-overlay/view-overlay.component.mjs +58 -0
  82. package/esm2020/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -0
  83. package/esm2020/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -0
  84. package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +163 -0
  85. package/esm2020/lib/shared/display/pipes/date-display.pipe.mjs +50 -0
  86. package/esm2020/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -0
  87. package/esm2020/lib/shared/display/pipes/relative-date.pipe.mjs +48 -0
  88. package/esm2020/lib/shared/display/pipes/row-count.pipe.mjs +48 -0
  89. package/esm2020/lib/shared/display/pipes/time-display.pipe.mjs +41 -0
  90. package/{esm2015/lib/shared/display.js → esm2020/lib/shared/display.mjs} +0 -0
  91. package/esm2020/lib/shared/form-group.helper.mjs +67 -0
  92. package/{esm2015/lib/shared/json-helper.js → esm2020/lib/shared/json-helper.mjs} +0 -0
  93. package/{esm2015/lib/shared/lodash-helper.js → esm2020/lib/shared/lodash-helper.mjs} +0 -0
  94. package/esm2020/lib/shared/page/page-base/page-base.component.mjs +339 -0
  95. package/{esm2015/lib/shared/page/page-statuses.js → esm2020/lib/shared/page/page-statuses.mjs} +0 -0
  96. package/esm2020/lib/shared/page/page-title/page-title.component.mjs +23 -0
  97. package/esm2020/lib/shared/page/page-view/page-view.component.mjs +121 -0
  98. package/{esm2015/lib/shared/testing/hierarchy-base-test-injector-factory.spec.js → esm2020/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs} +0 -0
  99. package/esm2020/lib/shared/testing/page-base-component-test-helper.spec.mjs +30 -0
  100. package/{esm2015/lib/shared/testing/page-base-component-test-injector-factory.spec.js → esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs} +0 -0
  101. package/esm2020/lib/shared/testing/public-mocks.spec.mjs +132 -0
  102. package/{esm2015/lib/shared/testing/spy-factory.spec.js → esm2020/lib/shared/testing/spy-factory.spec.mjs} +0 -0
  103. package/{esm2015/lib/shared/testing/translation-mocks.spec.js → esm2020/lib/shared/testing/translation-mocks.spec.mjs} +0 -0
  104. package/esm2020/lib/shared/user-preference.service.mjs +17 -0
  105. package/esm2020/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -0
  106. package/esm2020/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -0
  107. package/esm2020/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -0
  108. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  109. package/fesm2015/energycap-components.mjs +10090 -0
  110. package/fesm2015/energycap-components.mjs.map +1 -0
  111. package/fesm2020/energycap-components.mjs +9999 -0
  112. package/fesm2020/energycap-components.mjs.map +1 -0
  113. package/index.d.ts +5 -0
  114. package/lib/components.module.d.ts +72 -0
  115. package/lib/controls/banner/banner.component.d.ts +3 -0
  116. package/lib/controls/button/button.component.d.ts +3 -0
  117. package/lib/controls/button/copy-button.directive.d.ts +3 -0
  118. package/lib/controls/checkbox/checkbox.component.d.ts +3 -0
  119. package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +3 -0
  120. package/lib/controls/combobox/combobox.component.d.ts +5 -2
  121. package/lib/controls/dropdown/dropdown.component.d.ts +3 -0
  122. package/lib/controls/file-upload/file-upload.component.d.ts +5 -2
  123. package/lib/controls/form-control/form-control.component.d.ts +3 -0
  124. package/lib/controls/form-control-base.d.ts +3 -0
  125. package/lib/controls/form-control-label/form-control-label.component.d.ts +3 -0
  126. package/lib/controls/form-group/form-group.component.d.ts +6 -3
  127. package/lib/controls/help-popover/help-popover.component.d.ts +3 -0
  128. package/lib/controls/item-picker/item-picker.component.d.ts +5 -2
  129. package/lib/controls/link-button/link-button.component.d.ts +3 -0
  130. package/lib/controls/menu/menu.component.d.ts +3 -0
  131. package/lib/controls/navigation/nav-item-active.directive.d.ts +3 -0
  132. package/lib/controls/numericbox/numericbox.component.d.ts +5 -2
  133. package/lib/controls/popover/popover.component.d.ts +3 -0
  134. package/lib/controls/radio-button/radio-button.component.d.ts +3 -0
  135. package/lib/controls/select/select.component.d.ts +3 -0
  136. package/lib/controls/tabs/tabs.component.d.ts +3 -0
  137. package/lib/controls/textbox/textbox.component.d.ts +3 -0
  138. package/lib/core/cache.service.d.ts +3 -0
  139. package/lib/core/error.service.d.ts +3 -0
  140. package/lib/core/scroll.service.d.ts +3 -0
  141. package/lib/core/telemetry-tracker.service.d.ts +3 -0
  142. package/lib/core/telemetry.service.d.ts +3 -0
  143. package/lib/core/validation-message.service.d.ts +3 -0
  144. package/lib/core/window.service.d.ts +3 -0
  145. package/lib/display/app-bar/app-bar.component.d.ts +3 -0
  146. package/lib/display/avatar/avatar.component.d.ts +3 -0
  147. package/lib/display/avatar/avatar.service.d.ts +3 -0
  148. package/lib/display/confirm/confirm.component.d.ts +5 -2
  149. package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +3 -0
  150. package/lib/display/dialog/dialog.component.d.ts +3 -0
  151. package/lib/display/dialog/dialog.service.d.ts +3 -0
  152. package/lib/display/hierarchy/hierarchy-base.d.ts +3 -0
  153. package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +3 -0
  154. package/lib/display/item-display/item-display.component.d.ts +3 -0
  155. package/lib/display/json-display/json-display.component.d.ts +5 -2
  156. package/lib/display/resizable/resizable-base.d.ts +3 -0
  157. package/lib/display/resizable/resizable.component.d.ts +3 -0
  158. package/lib/display/spinner/spinner.component.d.ts +3 -0
  159. package/lib/display/splash/splash.component.d.ts +3 -0
  160. package/lib/display/splash/splash.service.d.ts +3 -0
  161. package/lib/display/table/resizable-column.component.d.ts +3 -0
  162. package/lib/display/table/resizable-table.directive.d.ts +3 -0
  163. package/lib/display/table/searchable-table.component.d.ts +6 -3
  164. package/lib/display/table/table-detail-row.component.d.ts +3 -0
  165. package/lib/display/table/table-locked-column.component.d.ts +3 -0
  166. package/lib/display/table/table-master-header-row.component.d.ts +3 -0
  167. package/lib/display/table/table-master-row.component.d.ts +3 -0
  168. package/lib/display/table/table-pagination.component.d.ts +3 -0
  169. package/lib/display/table/table-selectable-row.component.d.ts +5 -2
  170. package/lib/display/table/table.component.d.ts +3 -0
  171. package/lib/display/tags/tags.component.d.ts +3 -0
  172. package/lib/display/toast/toast/toast.component.d.ts +3 -0
  173. package/lib/display/toast/toast.service.d.ts +3 -0
  174. package/lib/display/toast/toaster/toaster.component.d.ts +3 -0
  175. package/lib/display/tooltip/tooltip.component.d.ts +3 -0
  176. package/lib/display/tooltip/tooltip.service.d.ts +3 -0
  177. package/lib/display/tree/tree.component.d.ts +3 -0
  178. package/lib/display/view-overlay/view-overlay.component.d.ts +3 -0
  179. package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +3 -0
  180. package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +3 -0
  181. package/lib/shared/directives/popup/popup-container.directive.d.ts +3 -0
  182. package/lib/shared/display/pipes/date-display.pipe.d.ts +3 -0
  183. package/lib/shared/display/pipes/highlight-text.pipe.d.ts +3 -0
  184. package/lib/shared/display/pipes/relative-date.pipe.d.ts +3 -0
  185. package/lib/shared/display/pipes/row-count.pipe.d.ts +3 -0
  186. package/lib/shared/display/pipes/time-display.pipe.d.ts +3 -0
  187. package/lib/shared/form-group.helper.d.ts +5 -2
  188. package/lib/shared/page/page-base/page-base.component.d.ts +5 -2
  189. package/lib/shared/page/page-title/page-title.component.d.ts +3 -0
  190. package/lib/shared/page/page-view/page-view.component.d.ts +3 -0
  191. package/lib/shared/testing/public-mocks.spec.d.ts +7 -0
  192. package/lib/shared/user-preference.service.d.ts +3 -0
  193. package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +3 -0
  194. package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +3 -0
  195. package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +3 -0
  196. package/package.json +27 -15
  197. package/src/styles/_functions.scss +6 -4
  198. package/src/styles/_icons.scss +1 -1
  199. package/src/styles/mixins/_control-base.scss +2 -2
  200. package/src/styles/mixins/_form-control-base.scss +3 -1
  201. package/src/styles/mixins/_spinner-base.scss +3 -1
  202. package/bundles/energycap-components.umd.js +0 -10646
  203. package/bundles/energycap-components.umd.js.map +0 -1
  204. package/bundles/energycap-components.umd.min.js +0 -17
  205. package/bundles/energycap-components.umd.min.js.map +0 -1
  206. package/energycap-components.d.ts +0 -7
  207. package/energycap-components.metadata.json +0 -1
  208. package/esm2015/energycap-components.js +0 -8
  209. package/esm2015/lib/components.module.js +0 -238
  210. package/esm2015/lib/controls/banner/banner.component.js +0 -94
  211. package/esm2015/lib/controls/button/button.component.js +0 -89
  212. package/esm2015/lib/controls/button/copy-button.directive.js +0 -63
  213. package/esm2015/lib/controls/checkbox/checkbox.component.js +0 -137
  214. package/esm2015/lib/controls/collapsible-toggle/collapsible-toggle.component.js +0 -35
  215. package/esm2015/lib/controls/combobox/combobox.component.js +0 -819
  216. package/esm2015/lib/controls/dropdown/dropdown.component.js +0 -207
  217. package/esm2015/lib/controls/file-upload/file-upload.component.js +0 -172
  218. package/esm2015/lib/controls/form-control/form-control.component.js +0 -65
  219. package/esm2015/lib/controls/form-control-base.js +0 -140
  220. package/esm2015/lib/controls/form-control-label/form-control-label.component.js +0 -139
  221. package/esm2015/lib/controls/form-group/form-group.component.js +0 -254
  222. package/esm2015/lib/controls/help-popover/help-popover.component.js +0 -22
  223. package/esm2015/lib/controls/item-picker/item-picker.component.js +0 -216
  224. package/esm2015/lib/controls/link-button/link-button.component.js +0 -12
  225. package/esm2015/lib/controls/menu/menu.component.js +0 -424
  226. package/esm2015/lib/controls/navigation/nav-item-active.directive.js +0 -86
  227. package/esm2015/lib/controls/numericbox/numericbox.component.js +0 -362
  228. package/esm2015/lib/controls/popover/popover.component.js +0 -85
  229. package/esm2015/lib/controls/radio-button/radio-button.component.js +0 -78
  230. package/esm2015/lib/controls/select/select.component.js +0 -89
  231. package/esm2015/lib/controls/tabs/tabs.component.js +0 -42
  232. package/esm2015/lib/controls/textbox/textbox.component.js +0 -149
  233. package/esm2015/lib/core/error.service.js +0 -56
  234. package/esm2015/lib/core/scroll.service.js +0 -88
  235. package/esm2015/lib/core/telemetry-tracker.service.js +0 -14
  236. package/esm2015/lib/core/telemetry.service.js +0 -40
  237. package/esm2015/lib/core/validation-message.service.js +0 -185
  238. package/esm2015/lib/core/window.service.js +0 -191
  239. package/esm2015/lib/display/app-bar/app-bar.component.js +0 -42
  240. package/esm2015/lib/display/avatar/avatar.component.js +0 -73
  241. package/esm2015/lib/display/confirm/confirm.component.js +0 -127
  242. package/esm2015/lib/display/dialog/dialog-group/dialog-group.component.js +0 -65
  243. package/esm2015/lib/display/dialog/dialog.component.js +0 -229
  244. package/esm2015/lib/display/dialog/dialog.service.js +0 -69
  245. package/esm2015/lib/display/hierarchy/hierarchy-base.js +0 -106
  246. package/esm2015/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.js +0 -58
  247. package/esm2015/lib/display/item-display/item-display.component.js +0 -57
  248. package/esm2015/lib/display/json-display/json-display.component.js +0 -44
  249. package/esm2015/lib/display/resizable/resizable-base.js +0 -119
  250. package/esm2015/lib/display/resizable/resizable.component.js +0 -57
  251. package/esm2015/lib/display/spinner/spinner.component.js +0 -12
  252. package/esm2015/lib/display/splash/splash.component.js +0 -45
  253. package/esm2015/lib/display/splash/splash.service.js +0 -34
  254. package/esm2015/lib/display/table/resizable-column.component.js +0 -23
  255. package/esm2015/lib/display/table/resizable-table.directive.js +0 -223
  256. package/esm2015/lib/display/table/searchable-table.component.js +0 -303
  257. package/esm2015/lib/display/table/table-detail-row.component.js +0 -21
  258. package/esm2015/lib/display/table/table-locked-column.component.js +0 -53
  259. package/esm2015/lib/display/table/table-master-header-row.component.js +0 -11
  260. package/esm2015/lib/display/table/table-master-row.component.js +0 -141
  261. package/esm2015/lib/display/table/table-pagination.component.js +0 -146
  262. package/esm2015/lib/display/table/table-selectable-row.component.js +0 -216
  263. package/esm2015/lib/display/table/table.component.js +0 -210
  264. package/esm2015/lib/display/tags/tag.js +0 -15
  265. package/esm2015/lib/display/tags/tags.component.js +0 -73
  266. package/esm2015/lib/display/toast/toast/toast.component.js +0 -70
  267. package/esm2015/lib/display/toast/toast.service.js +0 -34
  268. package/esm2015/lib/display/toast/toaster/toaster.component.js +0 -117
  269. package/esm2015/lib/display/tooltip/tooltip.component.js +0 -24
  270. package/esm2015/lib/display/tooltip/tooltip.service.js +0 -64
  271. package/esm2015/lib/display/tree/tree.component.js +0 -100
  272. package/esm2015/lib/display/view-overlay/view-overlay.component.js +0 -50
  273. package/esm2015/lib/shared/directives/click-area-for/click-area-for.directive.js +0 -25
  274. package/esm2015/lib/shared/directives/if-viewport-width/if-viewport-width.directive.js +0 -112
  275. package/esm2015/lib/shared/directives/popup/popup-container.directive.js +0 -160
  276. package/esm2015/lib/shared/display/pipes/date-display.pipe.js +0 -49
  277. package/esm2015/lib/shared/display/pipes/highlight-text.pipe.js +0 -26
  278. package/esm2015/lib/shared/display/pipes/relative-date.pipe.js +0 -49
  279. package/esm2015/lib/shared/display/pipes/row-count.pipe.js +0 -47
  280. package/esm2015/lib/shared/display/pipes/time-display.pipe.js +0 -40
  281. package/esm2015/lib/shared/form-group.helper.js +0 -65
  282. package/esm2015/lib/shared/page/page-base/page-base.component.js +0 -356
  283. package/esm2015/lib/shared/page/page-title/page-title.component.js +0 -19
  284. package/esm2015/lib/shared/page/page-view/page-view.component.js +0 -94
  285. package/esm2015/lib/shared/testing/page-base-component-test-helper.spec.js +0 -35
  286. package/esm2015/lib/shared/testing/public-mocks.spec.js +0 -126
  287. package/esm2015/lib/shared/user-preference.service.js +0 -15
  288. package/esm2015/lib/shared/wizard/wizard-base/wizard-base.component.js +0 -260
  289. package/esm2015/lib/shared/wizard/wizard-buttons/wizard-buttons.component.js +0 -54
  290. package/esm2015/lib/shared/wizard/wizard-progress/wizard-progress.component.js +0 -18
  291. package/fesm2015/energycap-components.js +0 -9638
  292. package/fesm2015/energycap-components.js.map +0 -1
@@ -0,0 +1,131 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
3
+ import { Overlay } from '../view-overlay/view-overlay.component';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "@angular/forms";
7
+ import * as i3 from "../../controls/button/button.component";
8
+ import * as i4 from "../../controls/textbox/textbox.component";
9
+ import * as i5 from "../view-overlay/view-overlay.component";
10
+ import * as i6 from "../../controls/banner/banner.component";
11
+ import * as i7 from "@ngx-translate/core";
12
+ export class ConfirmDialogContext {
13
+ constructor() {
14
+ /** Id to distinguish between confirm component contexts emitted by the dialog service */
15
+ this.id = '';
16
+ /**
17
+ * Optional required flag for the textbox, will set
18
+ * a validator on the input if true
19
+ */
20
+ this.textboxRequired = false;
21
+ /** Sets the textbox's uppercase parameter */
22
+ this.textboxUppercase = false;
23
+ /**
24
+ * Optional textbox height (in rows).
25
+ * Only applies to multi-line type.
26
+ * Default 3.
27
+ */
28
+ this.textareaRows = 3;
29
+ /** Optional save button label */
30
+ this.saveLabel = 'Save'; // LOCO
31
+ /** Optional save button type */
32
+ this.saveButtonType = 'primary';
33
+ /** Optional cancel button label */
34
+ this.cancelLabel = 'Cancel'; // LOCO
35
+ /** When true, adds the submit tag to the save button so hitting enter triggers the save */
36
+ this.saveOnEnter = false;
37
+ /** Optional alternate save button label */
38
+ this.alternateSaveLabel = undefined;
39
+ /** Optional alternate save button type */
40
+ this.alternateSaveButtonType = undefined;
41
+ /**
42
+ * Used to know which save button was selected in case the calling component
43
+ * is utilizing the alternate save button
44
+ */
45
+ this.saveSource = 'primary';
46
+ /** The message to be displayed while inlineConfirmAction is pending. */
47
+ this.inlineConfirmPendingMessage = '';
48
+ }
49
+ }
50
+ export class ConfirmComponent {
51
+ constructor() {
52
+ this.dialogId = 'Confirm';
53
+ /** Form Group to hold any form controls needed */
54
+ this.formGroup = new UntypedFormGroup({});
55
+ this.status = new Overlay('hasData');
56
+ this.onDialogSave = new EventEmitter();
57
+ this.onDialogCancel = new EventEmitter();
58
+ }
59
+ onOpen(openContext) {
60
+ this.context = openContext;
61
+ this.dialogId = openContext.id;
62
+ if (this.context.alternateSaveLabel) {
63
+ this.context.saveOnEnter = false;
64
+ }
65
+ }
66
+ ngOnInit() {
67
+ this.addFormControls();
68
+ }
69
+ onSave(source) {
70
+ this.formGroup.markAllAsTouched();
71
+ if (this.formGroup.valid) {
72
+ let formValues = this.formGroup.getRawValue();
73
+ if (formValues.textbox) {
74
+ this.context.textboxValue = formValues.textbox;
75
+ }
76
+ this.context.saveSource = source;
77
+ if (this.context.inlineConfirmAction) {
78
+ this.doInlineConfirmAction();
79
+ }
80
+ else {
81
+ this.onDialogSave.emit(this.context);
82
+ }
83
+ }
84
+ else if (this.context.validationErrorMessage) {
85
+ this.error = this.context.validationErrorMessage;
86
+ }
87
+ }
88
+ onCancel() {
89
+ this.onDialogCancel.emit();
90
+ }
91
+ /**
92
+ * Adds the textbox form control to our form group if its configured to be visible
93
+ * Will also add the required validator if requested
94
+ */
95
+ addFormControls() {
96
+ if (this.context.textboxType) {
97
+ let validators = [];
98
+ if (this.context.textboxRequired) {
99
+ validators.push(Validators.required);
100
+ }
101
+ if (this.context.textboxValidators) {
102
+ validators.push(...this.context.textboxValidators);
103
+ }
104
+ this.formGroup.addControl('textbox', new UntypedFormControl('', validators));
105
+ }
106
+ }
107
+ async doInlineConfirmAction() {
108
+ this.status.setStatus('pending', this.context.inlineConfirmPendingMessage);
109
+ let result = await this.context.inlineConfirmAction();
110
+ this.status.setStatus('noData', result.message, {
111
+ id: 'inlineConfirmClose',
112
+ label: 'Close',
113
+ icon: result.isSuccess ? 'icon-check-circle' : 'icon-error',
114
+ classlist: result.isSuccess ? 'font-color-success' : 'font-color-error',
115
+ onClick: () => { result.isSuccess ? this.onDialogSave.emit(this.context) : this.onDialogCancel.emit(); }
116
+ });
117
+ }
118
+ }
119
+ ConfirmComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ConfirmComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
120
+ ConfirmComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: ConfirmComponent, selector: "ec-confirm", inputs: { context: "context" }, outputs: { onDialogSave: "onDialogSave", onDialogCancel: "onDialogCancel" }, ngImport: i0, template: "<section ecOverlay\r\n [status]=\"status?.status\"\r\n [message]=\"status?.message\"\r\n [action]=\"status?.action\"\r\n [noDataTemplate]=\"inlineConfirmResult\"\r\n overlayClassList=\"p-0\"\r\n class=\"bg-body flex-grow d-flex\">\r\n <form [formGroup]=\"formGroup\" class=\"flex-grow flex-column confirm-content text-body-1\">\r\n <section class=\"flex-grow\">\r\n <h2 class=\"font-weight-bold mb-3\" *ngIf=\"context?.title\">{{context?.title}}</h2>\r\n <ec-banner *ngIf=\"error\" [text]=\"error | translate\" bannerStyle=\"normal\" class=\"mb-3\"></ec-banner>\r\n <div *ngIf=\"context?.message\" [innerHtml]=\"context?.message | translate\" class=\"mb-3\"></div>\r\n <ec-textbox id=\"confirmTextbox\"\r\n *ngIf=\"context?.textboxType\"\r\n [autofocus]=\"true\"\r\n [formModel]=\"formGroup.get('textbox')\"\r\n [required]=\"context?.textboxRequired\"\r\n [label]=\"context?.textboxLabel\"\r\n [type]=\"context?.textboxType\"\r\n [rows]=\"context?.textareaRows\"\r\n [placeholder]=\"context?.textboxPlaceholder\"\r\n [upperCase]=\"context?.textboxUppercase\">\r\n </ec-textbox>\r\n </section>\r\n <footer class=\"mt-auto flex-shrink d-flex py-2 flex-row-reverse\">\r\n <ec-button id=\"saveConfirmButton\"\r\n class=\"ml-2\"\r\n [type]=\"context?.saveButtonType ? context?.saveButtonType : 'primary'\"\r\n [label]=\"context?.saveLabel ? context?.saveLabel : 'Save'\"\r\n [autofocus]=\"!context?.textboxType\"\r\n [isSubmit]=\"context?.saveOnEnter\"\r\n (clicked)=\"onSave('primary')\">\r\n </ec-button>\r\n <ec-button id=\"alternateSaveConfirmButton\"\r\n *ngIf=\"context?.alternateSaveLabel\"\r\n class=\"ml-2\"\r\n [type]=\"context?.alternateSaveButtonType ? context?.alternateSaveButtonType : 'primary'\"\r\n [label]=\"context?.alternateSaveLabel\"\r\n (clicked)=\"onSave('alternate')\">\r\n </ec-button>\r\n <ec-button id=\"cancelConfirmButton\"\r\n class=\"ml-auto\"\r\n type=\"secondary\"\r\n [label]=\"context?.cancelLabel ? context?.cancelLabel : 'Cancel'\"\r\n (clicked)=\"onCancel()\">\r\n </ec-button>\r\n </footer>\r\n </form>\r\n</section>\r\n\r\n<ng-template #inlineConfirmResult>\r\n <section class=\"flex-grow align-self-stretch confirm-content text-body-1\">\r\n <div class=\"d-flex\">\r\n <i class=\"ec-icon {{status?.action?.icon}} {{status?.action?.classlist}} inline-confirm-result-icon\"></i>\r\n <div [innerHTML]=\"status?.message | translate\"></div>\r\n </div>\r\n <div class=\"d-flex pt-2 mt-auto\">\r\n <ec-button id=\"inlineConfirmClose\"\r\n label=\"Close\"\r\n type=\"secondary\"\r\n class=\"ml-auto\"\r\n (clicked)=\"status?.action?.onClick!()\"\r\n [autofocus]=\"true\">\r\n </ec-button>\r\n </div>\r\n </section>\r\n</ng-template>", styles: [":host{width:100%;display:flex}.confirm-content{padding:1.5rem;display:flex;flex-direction:column}.inline-confirm-result-icon{margin:.0625rem .25rem .0625rem 0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i4.TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "component", type: i5.ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: i6.BannerComponent, selector: "ec-banner", inputs: ["hidden", "id", "type", "bannerStyle", "title", "text", "list", "showCloseBtn", "autoHideOnClose", "customIcon", "rememberClosed"], outputs: ["closed"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }] });
121
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ConfirmComponent, decorators: [{
122
+ type: Component,
123
+ args: [{ selector: 'ec-confirm', template: "<section ecOverlay\r\n [status]=\"status?.status\"\r\n [message]=\"status?.message\"\r\n [action]=\"status?.action\"\r\n [noDataTemplate]=\"inlineConfirmResult\"\r\n overlayClassList=\"p-0\"\r\n class=\"bg-body flex-grow d-flex\">\r\n <form [formGroup]=\"formGroup\" class=\"flex-grow flex-column confirm-content text-body-1\">\r\n <section class=\"flex-grow\">\r\n <h2 class=\"font-weight-bold mb-3\" *ngIf=\"context?.title\">{{context?.title}}</h2>\r\n <ec-banner *ngIf=\"error\" [text]=\"error | translate\" bannerStyle=\"normal\" class=\"mb-3\"></ec-banner>\r\n <div *ngIf=\"context?.message\" [innerHtml]=\"context?.message | translate\" class=\"mb-3\"></div>\r\n <ec-textbox id=\"confirmTextbox\"\r\n *ngIf=\"context?.textboxType\"\r\n [autofocus]=\"true\"\r\n [formModel]=\"formGroup.get('textbox')\"\r\n [required]=\"context?.textboxRequired\"\r\n [label]=\"context?.textboxLabel\"\r\n [type]=\"context?.textboxType\"\r\n [rows]=\"context?.textareaRows\"\r\n [placeholder]=\"context?.textboxPlaceholder\"\r\n [upperCase]=\"context?.textboxUppercase\">\r\n </ec-textbox>\r\n </section>\r\n <footer class=\"mt-auto flex-shrink d-flex py-2 flex-row-reverse\">\r\n <ec-button id=\"saveConfirmButton\"\r\n class=\"ml-2\"\r\n [type]=\"context?.saveButtonType ? context?.saveButtonType : 'primary'\"\r\n [label]=\"context?.saveLabel ? context?.saveLabel : 'Save'\"\r\n [autofocus]=\"!context?.textboxType\"\r\n [isSubmit]=\"context?.saveOnEnter\"\r\n (clicked)=\"onSave('primary')\">\r\n </ec-button>\r\n <ec-button id=\"alternateSaveConfirmButton\"\r\n *ngIf=\"context?.alternateSaveLabel\"\r\n class=\"ml-2\"\r\n [type]=\"context?.alternateSaveButtonType ? context?.alternateSaveButtonType : 'primary'\"\r\n [label]=\"context?.alternateSaveLabel\"\r\n (clicked)=\"onSave('alternate')\">\r\n </ec-button>\r\n <ec-button id=\"cancelConfirmButton\"\r\n class=\"ml-auto\"\r\n type=\"secondary\"\r\n [label]=\"context?.cancelLabel ? context?.cancelLabel : 'Cancel'\"\r\n (clicked)=\"onCancel()\">\r\n </ec-button>\r\n </footer>\r\n </form>\r\n</section>\r\n\r\n<ng-template #inlineConfirmResult>\r\n <section class=\"flex-grow align-self-stretch confirm-content text-body-1\">\r\n <div class=\"d-flex\">\r\n <i class=\"ec-icon {{status?.action?.icon}} {{status?.action?.classlist}} inline-confirm-result-icon\"></i>\r\n <div [innerHTML]=\"status?.message | translate\"></div>\r\n </div>\r\n <div class=\"d-flex pt-2 mt-auto\">\r\n <ec-button id=\"inlineConfirmClose\"\r\n label=\"Close\"\r\n type=\"secondary\"\r\n class=\"ml-auto\"\r\n (clicked)=\"status?.action?.onClick!()\"\r\n [autofocus]=\"true\">\r\n </ec-button>\r\n </div>\r\n </section>\r\n</ng-template>", styles: [":host{width:100%;display:flex}.confirm-content{padding:1.5rem;display:flex;flex-direction:column}.inline-confirm-result-icon{margin:.0625rem .25rem .0625rem 0}\n"] }]
124
+ }], ctorParameters: function () { return []; }, propDecorators: { context: [{
125
+ type: Input
126
+ }], onDialogSave: [{
127
+ type: Output
128
+ }], onDialogCancel: [{
129
+ type: Output
130
+ }] } });
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvZGlzcGxheS9jb25maXJtL2NvbmZpcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvY29uZmlybS9jb25maXJtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSy9GLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7Ozs7Ozs7O0FBU2pFLE1BQU0sT0FBTyxvQkFBb0I7SUFBakM7UUFDRSx5RkFBeUY7UUFDbEYsT0FBRSxHQUFXLEVBQUUsQ0FBQztRQWlCdkI7OztXQUdHO1FBQ0ksb0JBQWUsR0FBYSxLQUFLLENBQUM7UUFLekMsNkNBQTZDO1FBQ3RDLHFCQUFnQixHQUFhLEtBQUssQ0FBQztRQUUxQzs7OztXQUlHO1FBQ0ksaUJBQVksR0FBWSxDQUFDLENBQUM7UUFXakMsaUNBQWlDO1FBQzFCLGNBQVMsR0FBWSxNQUFNLENBQUMsQ0FBQyxPQUFPO1FBRTNDLGdDQUFnQztRQUN6QixtQkFBYyxHQUFnQixTQUFTLENBQUM7UUFFL0MsbUNBQW1DO1FBQzVCLGdCQUFXLEdBQVksUUFBUSxDQUFDLENBQUMsT0FBTztRQUUvQywyRkFBMkY7UUFDcEYsZ0JBQVcsR0FBYSxLQUFLLENBQUM7UUFFckMsMkNBQTJDO1FBQ3BDLHVCQUFrQixHQUFZLFNBQVMsQ0FBQztRQUUvQywwQ0FBMEM7UUFDbkMsNEJBQXVCLEdBQWdCLFNBQVMs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QUFJLENBQUMsT0FBTyxDQUFDLG1CQUFvQixFQUFFLENBQUM7UUFFdkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDOUMsRUFBRSxFQUFFLG9CQUFvQjtZQUN4QixLQUFLLEVBQUUsT0FBTztZQUNkLElBQUksRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsWUFBWTtZQUMzRCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLGtCQUFrQjtZQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFBLENBQUMsQ0FBQztTQUN4RyxDQUFDLENBQUM7SUFDTCxDQUFDOzs2R0ExRlUsZ0JBQWdCO2lHQUFoQixnQkFBZ0IsK0pDdkc3Qix1dUdBa0VjOzJGRHFDRCxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsWUFBWTswRUFpQk4sT0FBTztzQkFBdEIsS0FBSztnQkFFVyxZQUFZO3NCQUE1QixNQUFNO2dCQUNVLGNBQWM7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBCdXR0b25UeXBlIH0gZnJvbSAnLi4vLi4vY29udHJvbHMvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUZXh0Ym94VHlwZSB9IGZyb20gJy4uLy4uL2NvbnRyb2xzL3RleHRib3gvdGV4dGJveC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEaWFsb2dDb250ZW50IH0gZnJvbSAnLi4vZGlhbG9nL2RpYWxvZy1jb250ZW50JztcclxuaW1wb3J0IHsgT3ZlcmxheSB9IGZyb20gJy4uL3ZpZXctb3ZlcmxheS92aWV3LW92ZXJsYXkuY29tcG9uZW50JztcclxuXHJcbnR5cGUgU2F2ZVNvdXJjZSA9ICdwcmltYXJ5J3wnYWx0ZXJuYXRlJztcclxuXHJcbmV4cG9ydCB0eXBlIEN1c3RvbUFjdGlvblJlc3VsdCA9IHtcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgaXNTdWNjZXNzOiBib29sZWFuO1xyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbmZpcm1EaWFsb2dDb250ZXh0IHtcclxuICAvKiogSWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBjb25maXJtIGNvbXBvbmVudCBjb250ZXh0cyBlbWl0dGVkIGJ5IHRoZSBkaWFsb2cgc2VydmljZSAqL1xyXG4gIHB1YmxpYyBpZDogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKiBPcHRpb25hbCB0aXRsZSBvZiB0aGUgY29uZmlybSAqL1xyXG4gIHB1YmxpYyB0aXRsZT86IHN0cmluZztcclxuXHJcbiAgLyoqIE9wdGlvbmFsIG1lc3NhZ2UgKi9cclxuICBwdWJsaWMgbWVzc2FnZT86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgdGV4dGJveCB0eXBlLCB0aGlzIHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXJcclxuICAgKiBhbiBpbnB1dCBpcyB2aXNpYmxlIG9yIG5vdFxyXG4gICAqL1xyXG4gIHB1YmxpYyB0ZXh0Ym94VHlwZT86IFRleHRib3hUeXBlO1xyXG5cclxuICAvKiogT3B0aW9uYWwgdGV4dGJveCBsYWJlbCAqL1xyXG4gIHB1YmxpYyB0ZXh0Ym94TGFiZWw/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIHJlcXVpcmVkIGZsYWcgZm9yIHRoZSB0ZXh0Ym94LCB3aWxsIHNldFxyXG4gICAqIGEgdmFsaWRhdG9yIG9uIHRoZSBpbnB1dCBpZiB0cnVlXHJcbiAgICovXHJcbiAgcHVibGljIHRleHRib3hSZXF1aXJlZD86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIE9wdGlvbmFsIGFycmF5IG9mIHZhbGlkYXRvcnMgdG8gYWRkIHRvIHRoZSB0ZXh0Ym94IGZvcm0gY29udHJvbC4gKi9cclxuICBwdWJsaWMgdGV4dGJveFZhbGlkYXRvcnM/OiBWYWxpZGF0b3JGbltdO1xyXG5cclxuICAvKiogU2V0cyB0aGUgdGV4dGJveCdzIHVwcGVyY2FzZSBwYXJhbWV0ZXIgKi9cclxuICBwdWJsaWMgdGV4dGJveFVwcGVyY2FzZT86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgdGV4dGJveCBoZWlnaHQgKGluIHJvd3MpLlxyXG4gICAqIE9ubHkgYXBwbGllcyB0byBtdWx0aS1saW5lIHR5cGUuXHJcbiAgICogRGVmYXVsdCAzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyB0ZXh0YXJlYVJvd3M/OiBudW1iZXIgPSAzO1xyXG5cclxuICAvKiogT3B0aW9uYWwgdGV4dGJveCBwbGFjZWhvbGRlciB0ZXh0ICovXHJcbiAgcHVibGljIHRleHRib3hQbGFjZWhvbGRlcj86IHN0cmluZztcclxuXHJcbiAgLyoqIE9wdGlvbmFsIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHRleHRib3ggKi9cclxuICBwdWJsaWMgdmFsaWRhdGlvbkVycm9yTWVzc2FnZT86IHN0cmluZztcclxuXHJcbiAgLyoqIFZhbHVlIHJldHVybmVkIGZyb20gdGhlIGlucHV0IGlmIGVuYWJsZWQgKi9cclxuICBwdWJsaWMgdGV4dGJveFZhbHVlPzogc3RyaW5nO1xyXG5cclxuICAvKiogT3B0aW9uYWwgc2F2ZSBidXR0b24gbGFiZWwgKi9cclxuICBwdWJsaWMgc2F2ZUxhYmVsPzogc3RyaW5nID0gJ1NhdmUnOyAvLyBMT0NPXHJcblxyXG4gIC8qKiBPcHRpb25hbCBzYXZlIGJ1dHRvbiB0eXBlICovXHJcbiAgcHVibGljIHNhdmVCdXR0b25UeXBlPzogQnV0dG9uVHlwZSA9ICdwcmltYXJ5JztcclxuXHJcbiAgLyoqIE9wdGlvbmFsIGNhbmNlbCBidXR0b24gbGFiZWwgKi9cclxuICBwdWJsaWMgY2FuY2VsTGFiZWw/OiBzdHJpbmcgPSAnQ2FuY2VsJzsgLy8gTE9DT1xyXG5cclxuICAvKiogV2hlbiB0cnVlLCBhZGRzIHRoZSBzdWJtaXQgdGFnIHRvIHRoZSBzYXZlIGJ1dHRvbiBzbyBoaXR0aW5nIGVudGVyIHRyaWdnZXJzIHRoZSBzYXZlICovXHJcbiAgcHVibGljIHNhdmVPbkVudGVyPzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogT3B0aW9uYWwgYWx0ZXJuYXRlIHNhdmUgYnV0dG9uIGxhYmVsICovXHJcbiAgcHVibGljIGFsdGVybmF0ZVNhdmVMYWJlbD86IHN0cmluZyA9IHVuZGVmaW5lZDtcclxuXHJcbiAgLyoqIE9wdGlvbmFsIGFsdGVybmF0ZSBzYXZlIGJ1dHRvbiB0eXBlICovXHJcbiAgcHVibGljIGFsdGVybmF0ZVNhdmVCdXR0b25UeXBlPzogQnV0dG9uVHlwZSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgLyoqXHJcbiAgICogVXNlZCB0byBrbm93IHdoaWNoIHNhdmUgYnV0dG9uIHdhcyBzZWxlY3RlZCBpbiBjYXNlIHRoZSBjYWxsaW5nIGNvbXBvbmVudFxyXG4gICAqIGlzIHV0aWxpemluZyB0aGUgYWx0ZXJuYXRlIHNhdmUgYnV0dG9uXHJcbiAgICovXHJcbiAgcHVibGljIHNhdmVTb3VyY2U/OiBTYXZlU291cmNlID0gJ3ByaW1hcnknO1xyXG5cclxuICAvKipcclxuICAgKiBXaGVuIHByb3ZpZGVkLCB0aGUgY29uZmlybSB3aWxsIHNob3cgYSBwZW5kaW5nIHN0YXRlIGFuZCBjYWxsIHRoaXMsIHRoZW4gdXBvblxyXG4gICAqIGNvbXBsZXRpb24gZGlzcGxheSB0aGUgcmVzdWx0IG1lc3NhZ2UgYW5kIGEgY2xvc2UgYnV0dG9uLiBJZiB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZFxyXG4gICAqIHN1Y2Nlc3NmdWxseSwgdGhlIGNsb3NlIGJ1dHRvbiB3aWxsIGVtaXQgb25EaWFsb2dTYXZlLiBJZiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCxcclxuICAgKiB0aGUgY2xvc2UgYnV0dG9uIHdpbGwgZW1pdCBvbkRpYWxvZ0NhbmNlbC5cclxuICAgKi9cclxuICBwdWJsaWMgaW5saW5lQ29uZmlybUFjdGlvbj86ICgpID0+IFByb21pc2U8Q3VzdG9tQWN0aW9uUmVzdWx0PjtcclxuXHJcbiAgLyoqIFRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCB3aGlsZSBpbmxpbmVDb25maXJtQWN0aW9uIGlzIHBlbmRpbmcuICovXHJcbiAgcHVibGljIGlubGluZUNvbmZpcm1QZW5kaW5nTWVzc2FnZT86IHN0cmluZyA9ICcnO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VjLWNvbmZpcm0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb25maXJtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jb25maXJtLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbmZpcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIERpYWxvZ0NvbnRlbnQ8Q29uZmlybURpYWxvZ0NvbnRleHQ+e1xyXG5cclxuICBwdWJsaWMgZGlhbG9nSWQ6IHN0cmluZyA9ICdDb25maXJtJztcclxuXHJcbiAgLyoqIEZvcm0gR3JvdXAgdG8gaG9sZCBhbnkgZm9ybSBjb250cm9scyBuZWVkZWQgKi9cclxuICBwdWJsaWMgZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe30pO1xyXG5cclxuICBwdWJsaWMgc3RhdHVzID0gbmV3IE92ZXJsYXkoJ2hhc0RhdGEnKTtcclxuXHJcbiAgLyoqXHJcbiAgICogUHJvdmlkZWQgYnkgdGhlIGNhbGxpbmcgY29tcG9uZW50IHRvIHRlbGwgdGhlIGNvbmZpcm0gd2hhdCB0byBzaG93XHJcbiAgICogYW5kIGlzIHVzZWQgb24gc2F2ZSB0byBzZW5kIGJhY2sgYW55IGVudGVyZWQgdmFsdWVzIGZyb20gdGhlIHVzZXJcclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgY29udGV4dCE6IENvbmZpcm1EaWFsb2dDb250ZXh0O1xyXG5cclxuICBAT3V0cHV0KCkgcHVibGljIG9uRGlhbG9nU2F2ZTogRXZlbnRFbWl0dGVyPENvbmZpcm1EaWFsb2dDb250ZXh0PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29uZmlybURpYWxvZ0NvbnRleHQ+KCk7XHJcbiAgQE91dHB1dCgpIHB1YmxpYyBvbkRpYWxvZ0NhbmNlbDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBwdWJsaWMgb25PcGVuKG9wZW5Db250ZXh0PzogQ29uZmlybURpYWxvZ0NvbnRleHQpOiB2b2lkIHtcclxuICAgIHRoaXMuY29udGV4dCA9IG9wZW5Db250ZXh0ITtcclxuICAgIHRoaXMuZGlhbG9nSWQgPSBvcGVuQ29udGV4dCEuaWQ7XHJcblxyXG4gICAgaWYgKHRoaXMuY29udGV4dC5hbHRlcm5hdGVTYXZlTGFiZWwpIHtcclxuICAgICAgdGhpcy5jb250ZXh0LnNhdmVPbkVudGVyID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogRXJyb3IgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBlcnJvciBiYW5uZXIgKi9cclxuICBwdWJsaWMgZXJyb3I/OiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRkRm9ybUNvbnRyb2xzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TYXZlKHNvdXJjZTogU2F2ZVNvdXJjZSk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtR3JvdXAubWFya0FsbEFzVG91Y2hlZCgpO1xyXG5cclxuICAgIGlmICh0aGlzLmZvcm1Hcm91cC52YWxpZCkge1xyXG4gICAgICBsZXQgZm9ybVZhbHVlcyA9IHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XHJcbiAgICAgIGlmIChmb3JtVmFsdWVzLnRleHRib3gpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHQudGV4dGJveFZhbHVlID0gZm9ybVZhbHVlcy50ZXh0Ym94O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNvbnRleHQuc2F2ZVNvdXJjZSA9IHNvdXJjZTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmNvbnRleHQuaW5saW5lQ29uZmlybUFjdGlvbikge1xyXG4gICAgICAgIHRoaXMuZG9JbmxpbmVDb25maXJtQWN0aW9uKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vbkRpYWxvZ1NhdmUuZW1pdCh0aGlzLmNvbnRleHQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29udGV4dC52YWxpZGF0aW9uRXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgIHRoaXMuZXJyb3IgPSB0aGlzLmNvbnRleHQudmFsaWRhdGlvbkVycm9yTWVzc2FnZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNhbmNlbCgpOiB2b2lkIHtcclxuICAgIHRoaXMub25EaWFsb2dDYW5jZWwuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyB0aGUgdGV4dGJveCBmb3JtIGNvbnRyb2wgdG8gb3VyIGZvcm0gZ3JvdXAgaWYgaXRzIGNvbmZpZ3VyZWQgdG8gYmUgdmlzaWJsZVxyXG4gICAqIFdpbGwgYWxzbyBhZGQgdGhlIHJlcXVpcmVkIHZhbGlkYXRvciBpZiByZXF1ZXN0ZWRcclxuICAgKi9cclxuICBwcml2YXRlIGFkZEZvcm1Db250cm9scygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbnRleHQudGV4dGJveFR5cGUpIHtcclxuICAgICAgbGV0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcclxuICAgICAgaWYgKHRoaXMuY29udGV4dC50ZXh0Ym94UmVxdWlyZWQpIHtcclxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuY29udGV4dC50ZXh0Ym94VmFsaWRhdG9ycykge1xyXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaCguLi50aGlzLmNvbnRleHQudGV4dGJveFZhbGlkYXRvcnMpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmFkZENvbnRyb2woJ3RleHRib3gnLCBuZXcgVW50eXBlZEZvcm1Db250cm9sKCcnLCB2YWxpZGF0b3JzKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRvSW5saW5lQ29uZmlybUFjdGlvbigpIHtcclxuICAgIHRoaXMuc3RhdHVzLnNldFN0YXR1cygncGVuZGluZycsIHRoaXMuY29udGV4dC5pbmxpbmVDb25maXJtUGVuZGluZ01lc3NhZ2UpO1xyXG5cclxuICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbnRleHQuaW5saW5lQ29uZmlybUFjdGlvbiEoKTtcclxuXHJcbiAgICB0aGlzLnN0YXR1cy5zZXRTdGF0dXMoJ25vRGF0YScsIHJlc3VsdC5tZXNzYWdlLCB7XHJcbiAgICAgIGlkOiAnaW5saW5lQ29uZmlybUNsb3NlJyxcclxuICAgICAgbGFiZWw6ICdDbG9zZScsXHJcbiAgICAgIGljb246IHJlc3VsdC5pc1N1Y2Nlc3MgPyAnaWNvbi1jaGVjay1jaXJjbGUnIDogJ2ljb24tZXJyb3InLFxyXG4gICAgICBjbGFzc2xpc3Q6IHJlc3VsdC5pc1N1Y2Nlc3MgPyAnZm9udC1jb2xvci1zdWNjZXNzJyA6ICdmb250LWNvbG9yLWVycm9yJyxcclxuICAgICAgb25DbGljazogKCkgPT4geyByZXN1bHQuaXNTdWNjZXNzID8gdGhpcy5vbkRpYWxvZ1NhdmUuZW1pdCh0aGlzLmNvbnRleHQpIDogdGhpcy5vbkRpYWxvZ0NhbmNlbC5lbWl0KCkgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxzZWN0aW9uIGVjT3ZlcmxheVxyXG4gICAgICAgICBbc3RhdHVzXT1cInN0YXR1cz8uc3RhdHVzXCJcclxuICAgICAgICAgW21lc3NhZ2VdPVwic3RhdHVzPy5tZXNzYWdlXCJcclxuICAgICAgICAgW2FjdGlvbl09XCJzdGF0dXM/LmFjdGlvblwiXHJcbiAgICAgICAgIFtub0RhdGFUZW1wbGF0ZV09XCJpbmxpbmVDb25maXJtUmVzdWx0XCJcclxuICAgICAgICAgb3ZlcmxheUNsYXNzTGlzdD1cInAtMFwiXHJcbiAgICAgICAgIGNsYXNzPVwiYmctYm9keSBmbGV4LWdyb3cgZC1mbGV4XCI+XHJcbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIiBjbGFzcz1cImZsZXgtZ3JvdyBmbGV4LWNvbHVtbiBjb25maXJtLWNvbnRlbnQgdGV4dC1ib2R5LTFcIj5cclxuICAgIDxzZWN0aW9uIGNsYXNzPVwiZmxleC1ncm93XCI+XHJcbiAgICAgIDxoMiBjbGFzcz1cImZvbnQtd2VpZ2h0LWJvbGQgbWItM1wiICpuZ0lmPVwiY29udGV4dD8udGl0bGVcIj57e2NvbnRleHQ/LnRpdGxlfX08L2gyPlxyXG4gICAgICA8ZWMtYmFubmVyICpuZ0lmPVwiZXJyb3JcIiBbdGV4dF09XCJlcnJvciB8IHRyYW5zbGF0ZVwiIGJhbm5lclN0eWxlPVwibm9ybWFsXCIgY2xhc3M9XCJtYi0zXCI+PC9lYy1iYW5uZXI+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJjb250ZXh0Py5tZXNzYWdlXCIgW2lubmVySHRtbF09XCJjb250ZXh0Py5tZXNzYWdlIHwgdHJhbnNsYXRlXCIgY2xhc3M9XCJtYi0zXCI+PC9kaXY+XHJcbiAgICAgIDxlYy10ZXh0Ym94IGlkPVwiY29uZmlybVRleHRib3hcIlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRleHQ/LnRleHRib3hUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgW2F1dG9mb2N1c109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgW2Zvcm1Nb2RlbF09XCJmb3JtR3JvdXAuZ2V0KCd0ZXh0Ym94JylcIlxyXG4gICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29udGV4dD8udGV4dGJveFJlcXVpcmVkXCJcclxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbnRleHQ/LnRleHRib3hMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImNvbnRleHQ/LnRleHRib3hUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiY29udGV4dD8udGV4dGFyZWFSb3dzXCJcclxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbnRleHQ/LnRleHRib3hQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgIFt1cHBlckNhc2VdPVwiY29udGV4dD8udGV4dGJveFVwcGVyY2FzZVwiPlxyXG4gICAgICA8L2VjLXRleHRib3g+XHJcbiAgICA8L3NlY3Rpb24+XHJcbiAgICA8Zm9vdGVyIGNsYXNzPVwibXQtYXV0byBmbGV4LXNocmluayBkLWZsZXggcHktMiBmbGV4LXJvdy1yZXZlcnNlXCI+XHJcbiAgICAgIDxlYy1idXR0b24gaWQ9XCJzYXZlQ29uZmlybUJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtMlwiXHJcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImNvbnRleHQ/LnNhdmVCdXR0b25UeXBlID8gY29udGV4dD8uc2F2ZUJ1dHRvblR5cGUgOiAncHJpbWFyeSdcIlxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29udGV4dD8uc2F2ZUxhYmVsID8gY29udGV4dD8uc2F2ZUxhYmVsIDogJ1NhdmUnXCJcclxuICAgICAgICAgICAgICAgICAgW2F1dG9mb2N1c109XCIhY29udGV4dD8udGV4dGJveFR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICBbaXNTdWJtaXRdPVwiY29udGV4dD8uc2F2ZU9uRW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvblNhdmUoJ3ByaW1hcnknKVwiPlxyXG4gICAgICA8L2VjLWJ1dHRvbj5cclxuICAgICAgPGVjLWJ1dHRvbiBpZD1cImFsdGVybmF0ZVNhdmVDb25maXJtQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZXh0Py5hbHRlcm5hdGVTYXZlTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTJcIlxyXG4gICAgICAgICAgICAgICAgICBbdHlwZV09XCJjb250ZXh0Py5hbHRlcm5hdGVTYXZlQnV0dG9uVHlwZSA/IGNvbnRleHQ/LmFsdGVybmF0ZVNhdmVCdXR0b25UeXBlIDogJ3ByaW1hcnknXCJcclxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbnRleHQ/LmFsdGVybmF0ZVNhdmVMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uU2F2ZSgnYWx0ZXJuYXRlJylcIj5cclxuICAgICAgPC9lYy1idXR0b24+XHJcbiAgICAgIDxlYy1idXR0b24gaWQ9XCJjYW5jZWxDb25maXJtQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtbC1hdXRvXCJcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb250ZXh0Py5jYW5jZWxMYWJlbCA/IGNvbnRleHQ/LmNhbmNlbExhYmVsIDogJ0NhbmNlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XHJcbiAgICAgIDwvZWMtYnV0dG9uPlxyXG4gICAgPC9mb290ZXI+XHJcbiAgPC9mb3JtPlxyXG48L3NlY3Rpb24+XHJcblxyXG48bmctdGVtcGxhdGUgI2lubGluZUNvbmZpcm1SZXN1bHQ+XHJcbiAgPHNlY3Rpb24gY2xhc3M9XCJmbGV4LWdyb3cgYWxpZ24tc2VsZi1zdHJldGNoIGNvbmZpcm0tY29udGVudCB0ZXh0LWJvZHktMVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICA8aSBjbGFzcz1cImVjLWljb24ge3tzdGF0dXM/LmFjdGlvbj8uaWNvbn19IHt7c3RhdHVzPy5hY3Rpb24/LmNsYXNzbGlzdH19IGlubGluZS1jb25maXJtLXJlc3VsdC1pY29uXCI+PC9pPlxyXG4gICAgICA8ZGl2IFtpbm5lckhUTUxdPVwic3RhdHVzPy5tZXNzYWdlIHwgdHJhbnNsYXRlXCI+PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggcHQtMiBtdC1hdXRvXCI+XHJcbiAgICAgIDxlYy1idXR0b24gaWQ9XCJpbmxpbmVDb25maXJtQ2xvc2VcIlxyXG4gICAgICAgICAgICAgICAgIGxhYmVsPVwiQ2xvc2VcIlxyXG4gICAgICAgICAgICAgICAgIHR5cGU9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtYXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwic3RhdHVzPy5hY3Rpb24/Lm9uQ2xpY2shKClcIlxyXG4gICAgICAgICAgICAgICAgIFthdXRvZm9jdXNdPVwidHJ1ZVwiPlxyXG4gICAgICA8L2VjLWJ1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvc2VjdGlvbj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
@@ -0,0 +1,63 @@
1
+ import { Component } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { filter, takeUntil } from 'rxjs/operators';
4
+ import { DialogCloseEvent, DialogCloseLatestEvent, DialogOpenStartEvent } from '../dialog-types';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../dialog.service";
7
+ import * as i2 from "@angular/common";
8
+ import * as i3 from "../dialog.component";
9
+ export class DialogGroupComponent {
10
+ constructor(dialogService) {
11
+ this.dialogService = dialogService;
12
+ this.activeDialogEvents = [];
13
+ this.destroyed = new Subject();
14
+ }
15
+ /**When the group component is created, start watching for any DialogOpenStart events
16
+ * so that the group can react and make the matching dialog. New dialogs get assigned unique
17
+ * eventIds so that when they close we know exactly which one is done and we can take it
18
+ * out of the list of active dialogs
19
+ */
20
+ ngOnInit() {
21
+ this.dialogService.events.pipe(filter(event => event instanceof DialogOpenStartEvent || event instanceof DialogCloseLatestEvent), takeUntil(this.destroyed)).subscribe(event => {
22
+ if (event instanceof DialogOpenStartEvent) {
23
+ this.activeDialogEvents.push(event);
24
+ }
25
+ else if (event instanceof DialogCloseLatestEvent && this.activeDialogEvents.length > 0) {
26
+ let sourceEvent = this.activeDialogEvents[this.activeDialogEvents.length - 1];
27
+ this.dialogService.triggerEvent(new DialogCloseEvent(sourceEvent.eventId, sourceEvent.dialogId, event.dialogResult?.save, event.dialogResult?.context));
28
+ this.dialogClosed(sourceEvent);
29
+ }
30
+ });
31
+ }
32
+ /** When the dialog group is destroyed we no longer want to listen for any open events. */
33
+ ngOnDestroy() {
34
+ this.destroyed.next();
35
+ this.destroyed.unsubscribe();
36
+ }
37
+ /**The dialog component completed opening (including animation delay) and
38
+ * emits an event that tells us it is ready. The group can then pump out a dialog
39
+ * openEnd event (kinda NavigationEnd in the router) to tell anybody who cares that
40
+ * the dialog is now ready.
41
+ */
42
+ dialogOpened(dialogOpenEvent, dialogId) {
43
+ dialogOpenEvent.dialogId = dialogId;
44
+ }
45
+ /** The dialog has closed (after animation delay) and emitted an event to tell the hosting component.
46
+ * We handle the event and pump a matching DialogCloseEvent so that anybody who cares can know that the
47
+ * dialog instance referenced by dialogOpenEvent.eventId is gone now. We remove it from our list of
48
+ * active dialogs which pulls it out of the DOM too
49
+ */
50
+ dialogClosed(dialogOpenEvent) {
51
+ const index = this.activeDialogEvents.findIndex(d => d === dialogOpenEvent);
52
+ if (index >= 0) {
53
+ this.activeDialogEvents.splice(index, 1);
54
+ }
55
+ }
56
+ }
57
+ DialogGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: DialogGroupComponent, deps: [{ token: i1.DialogService }], target: i0.ɵɵFactoryTarget.Component });
58
+ DialogGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: DialogGroupComponent, selector: "ec-dialog-group", ngImport: i0, template: "<ec-dialog *ngFor=\"let dialog of activeDialogEvents\"\r\n [dialogOpenStartEventId]=\"dialog.eventId\"\r\n [size]=\"dialog.options?.size\"\r\n [content]=\"dialog.content\"\r\n [context]=\"dialog.context\"\r\n [options]=\"dialog.options\"\r\n (opened)=\"dialogOpened(dialog, $event)\"\r\n (closed)=\"dialogClosed(dialog)\">\r\n</ec-dialog>", styles: [":root{--ec-font-size-icon: 1rem;--ec-color-icon: rgba(26, 26, 35, .66)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}ec-dialog:not(:only-child){--ec-dialog-background-color: transparent}ec-dialog:not(:only-child):last-child,ec-dialog:not(:only-child):nth-last-child(2){--ec-dialog-background-color: var(--ec-background-color-dialog-stacked)}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.DialogComponent, selector: "ec-dialog", inputs: ["size", "content", "context", "options", "dialogOpenStartEventId"], outputs: ["opened", "closed"] }] });
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: DialogGroupComponent, decorators: [{
60
+ type: Component,
61
+ args: [{ selector: 'ec-dialog-group', template: "<ec-dialog *ngFor=\"let dialog of activeDialogEvents\"\r\n [dialogOpenStartEventId]=\"dialog.eventId\"\r\n [size]=\"dialog.options?.size\"\r\n [content]=\"dialog.content\"\r\n [context]=\"dialog.context\"\r\n [options]=\"dialog.options\"\r\n (opened)=\"dialogOpened(dialog, $event)\"\r\n (closed)=\"dialogClosed(dialog)\">\r\n</ec-dialog>", styles: [":root{--ec-font-size-icon: 1rem;--ec-color-icon: rgba(26, 26, 35, .66)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}ec-dialog:not(:only-child){--ec-dialog-background-color: transparent}ec-dialog:not(:only-child):last-child,ec-dialog:not(:only-child):nth-last-child(2){--ec-dialog-background-color: var(--ec-background-color-dialog-stacked)}\n"] }]
62
+ }], ctorParameters: function () { return [{ type: i1.DialogService }]; } });
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9kaXNwbGF5L2RpYWxvZy9kaWFsb2ctZ3JvdXAvZGlhbG9nLWdyb3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9kaXNwbGF5L2RpYWxvZy9kaWFsb2ctZ3JvdXAvZGlhbG9nLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7QUFRakcsTUFBTSxPQUFPLG9CQUFvQjtJQUsvQixZQUFvQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUhoRCx1QkFBa0IsR0FBZ0MsRUFBRSxDQUFDO1FBQzdDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRVksQ0FBQztJQUVyRDs7OztPQUlHO0lBQ0gsUUFBUTtRQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDNUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxZQUFZLG9CQUFvQixJQUFJLEtBQUssWUFBWSxzQkFBc0IsQ0FBQyxFQUNqRyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQixJQUFHLEtBQUssWUFBWSxvQkFBb0IsRUFBQztnQkFDdkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFrQyxDQUFDLENBQUM7YUFDbEU7aUJBQU0sSUFBRyxLQUFLLFlBQVksc0JBQXNCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZGLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM5RSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3hKLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDaEM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCwwRkFBMEY7SUFDMUYsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQVksQ0FBQyxlQUEwQyxFQUFFLFFBQWdCO1FBQ3ZFLGVBQWUsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLGVBQTBDO1FBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssZUFBZSxDQUFDLENBQUM7UUFFNUUsSUFBRyxLQUFLLElBQUcsQ0FBQyxFQUFDO1lBQ1gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDMUM7SUFDSCxDQUFDOztpSEFyRFUsb0JBQW9CO3FHQUFwQixvQkFBb0IsdURDWGpDLDBaQVFZOzJGREdDLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IERpYWxvZ0Nsb3NlRXZlbnQsIERpYWxvZ0Nsb3NlTGF0ZXN0RXZlbnQsIERpYWxvZ09wZW5TdGFydEV2ZW50IH0gZnJvbSAnLi4vZGlhbG9nLXR5cGVzJztcclxuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uL2RpYWxvZy5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZWMtZGlhbG9nLWdyb3VwJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGlhbG9nLWdyb3VwLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kaWFsb2ctZ3JvdXAuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGlhbG9nR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIGFjdGl2ZURpYWxvZ0V2ZW50czogRGlhbG9nT3BlblN0YXJ0RXZlbnQ8YW55PltdID0gW107XHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UpIHsgfVxyXG5cclxuICAvKipXaGVuIHRoZSBncm91cCBjb21wb25lbnQgaXMgY3JlYXRlZCwgc3RhcnQgd2F0Y2hpbmcgZm9yIGFueSBEaWFsb2dPcGVuU3RhcnQgZXZlbnRzXHJcbiAgICogc28gdGhhdCB0aGUgZ3JvdXAgY2FuIHJlYWN0IGFuZCBtYWtlIHRoZSBtYXRjaGluZyBkaWFsb2cuIE5ldyBkaWFsb2dzIGdldCBhc3NpZ25lZCB1bmlxdWVcclxuICAgKiBldmVudElkcyBzbyB0aGF0IHdoZW4gdGhleSBjbG9zZSB3ZSBrbm93IGV4YWN0bHkgd2hpY2ggb25lIGlzIGRvbmUgYW5kIHdlIGNhbiB0YWtlIGl0XHJcbiAgICogb3V0IG9mIHRoZSBsaXN0IG9mIGFjdGl2ZSBkaWFsb2dzXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuZXZlbnRzLnBpcGUoXHJcbiAgICAgIGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIERpYWxvZ09wZW5TdGFydEV2ZW50IHx8IGV2ZW50IGluc3RhbmNlb2YgRGlhbG9nQ2xvc2VMYXRlc3RFdmVudCksXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZClcclxuICAgICkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgaWYoZXZlbnQgaW5zdGFuY2VvZiBEaWFsb2dPcGVuU3RhcnRFdmVudCl7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVEaWFsb2dFdmVudHMucHVzaChldmVudCBhcyBEaWFsb2dPcGVuU3RhcnRFdmVudDxhbnk+KTtcclxuICAgICAgfSBlbHNlIGlmKGV2ZW50IGluc3RhbmNlb2YgRGlhbG9nQ2xvc2VMYXRlc3RFdmVudCAmJiB0aGlzLmFjdGl2ZURpYWxvZ0V2ZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHNvdXJjZUV2ZW50ID0gdGhpcy5hY3RpdmVEaWFsb2dFdmVudHNbdGhpcy5hY3RpdmVEaWFsb2dFdmVudHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnRyaWdnZXJFdmVudChuZXcgRGlhbG9nQ2xvc2VFdmVudChzb3VyY2VFdmVudC5ldmVudElkLCBzb3VyY2VFdmVudC5kaWFsb2dJZCwgZXZlbnQuZGlhbG9nUmVzdWx0Py5zYXZlLCBldmVudC5kaWFsb2dSZXN1bHQ/LmNvbnRleHQpKTtcclxuICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlZChzb3VyY2VFdmVudCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoZW4gdGhlIGRpYWxvZyBncm91cCBpcyBkZXN0cm95ZWQgd2Ugbm8gbG9uZ2VyIHdhbnQgdG8gbGlzdGVuIGZvciBhbnkgb3BlbiBldmVudHMuICovXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3llZC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3llZC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqVGhlIGRpYWxvZyBjb21wb25lbnQgY29tcGxldGVkIG9wZW5pbmcgKGluY2x1ZGluZyBhbmltYXRpb24gZGVsYXkpIGFuZFxyXG4gICAqIGVtaXRzIGFuIGV2ZW50IHRoYXQgdGVsbHMgdXMgaXQgaXMgcmVhZHkuIFRoZSBncm91cCBjYW4gdGhlbiBwdW1wIG91dCBhIGRpYWxvZ1xyXG4gICAqIG9wZW5FbmQgZXZlbnQgKGtpbmRhIE5hdmlnYXRpb25FbmQgaW4gdGhlIHJvdXRlcikgdG8gdGVsbCBhbnlib2R5IHdobyBjYXJlcyB0aGF0XHJcbiAgICogdGhlIGRpYWxvZyBpcyBub3cgcmVhZHkuXHJcbiAgICovXHJcbiAgZGlhbG9nT3BlbmVkKGRpYWxvZ09wZW5FdmVudDogRGlhbG9nT3BlblN0YXJ0RXZlbnQ8YW55PiwgZGlhbG9nSWQ6IHN0cmluZykge1xyXG4gICAgZGlhbG9nT3BlbkV2ZW50LmRpYWxvZ0lkID0gZGlhbG9nSWQ7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGRpYWxvZyBoYXMgY2xvc2VkIChhZnRlciBhbmltYXRpb24gZGVsYXkpIGFuZCBlbWl0dGVkIGFuIGV2ZW50IHRvIHRlbGwgdGhlIGhvc3RpbmcgY29tcG9uZW50LlxyXG4gICAqIFdlIGhhbmRsZSB0aGUgZXZlbnQgYW5kIHB1bXAgYSBtYXRjaGluZyBEaWFsb2dDbG9zZUV2ZW50IHNvIHRoYXQgYW55Ym9keSB3aG8gY2FyZXMgY2FuIGtub3cgdGhhdCB0aGVcclxuICAgKiBkaWFsb2cgaW5zdGFuY2UgcmVmZXJlbmNlZCBieSBkaWFsb2dPcGVuRXZlbnQuZXZlbnRJZCBpcyBnb25lIG5vdy4gV2UgcmVtb3ZlIGl0IGZyb20gb3VyIGxpc3Qgb2ZcclxuICAgKiBhY3RpdmUgZGlhbG9ncyB3aGljaCBwdWxscyBpdCBvdXQgb2YgdGhlIERPTSB0b29cclxuICAgKi9cclxuICBkaWFsb2dDbG9zZWQoZGlhbG9nT3BlbkV2ZW50OiBEaWFsb2dPcGVuU3RhcnRFdmVudDxhbnk+KSB7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuYWN0aXZlRGlhbG9nRXZlbnRzLmZpbmRJbmRleChkID0+IGQgPT09IGRpYWxvZ09wZW5FdmVudCk7XHJcbiAgICBcclxuICAgIGlmKGluZGV4ID49MCl7XHJcbiAgICAgIHRoaXMuYWN0aXZlRGlhbG9nRXZlbnRzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxlYy1kaWFsb2cgKm5nRm9yPVwibGV0IGRpYWxvZyBvZiBhY3RpdmVEaWFsb2dFdmVudHNcIlxyXG4gICAgICAgICAgIFtkaWFsb2dPcGVuU3RhcnRFdmVudElkXT1cImRpYWxvZy5ldmVudElkXCJcclxuICAgICAgICAgICBbc2l6ZV09XCJkaWFsb2cub3B0aW9ucz8uc2l6ZVwiXHJcbiAgICAgICAgICAgW2NvbnRlbnRdPVwiZGlhbG9nLmNvbnRlbnRcIlxyXG4gICAgICAgICAgIFtjb250ZXh0XT1cImRpYWxvZy5jb250ZXh0XCJcclxuICAgICAgICAgICBbb3B0aW9uc109XCJkaWFsb2cub3B0aW9uc1wiXHJcbiAgICAgICAgICAgKG9wZW5lZCk9XCJkaWFsb2dPcGVuZWQoZGlhbG9nLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAoY2xvc2VkKT1cImRpYWxvZ0Nsb3NlZChkaWFsb2cpXCI+XHJcbjwvZWMtZGlhbG9nPiJdfQ==
@@ -0,0 +1,242 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { Component, EventEmitter, HostBinding, HostListener, Input, Output, ViewChild, ViewContainerRef, TemplateRef, Inject } from '@angular/core';
3
+ import { timer } from 'rxjs';
4
+ import { take, takeUntil, tap } from 'rxjs/operators';
5
+ import { DialogOpenEndEvent, DialogCloseEvent, DialogResult } from './dialog-types';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../core/window.service";
8
+ import * as i2 from "./dialog.service";
9
+ import * as i3 from "@angular/cdk/a11y";
10
+ /** These values need to be kept in sync with dialog-base.scss */
11
+ export const DialogOpenDuration = 125;
12
+ export const DialogCloseDuration = 100;
13
+ export const PanelOpenDuration = 250;
14
+ export const PanelCloseDuration = 225;
15
+ export class DialogComponent {
16
+ constructor(componentFactoryResolver, windowService, dialogService, documentRef) {
17
+ this.componentFactoryResolver = componentFactoryResolver;
18
+ this.windowService = windowService;
19
+ this.dialogService = dialogService;
20
+ this.documentRef = documentRef;
21
+ /**
22
+ * Add/remove the is-open css class to the host element when the dialog is opened/closed.
23
+ * Styles use the is-open class to show/hide the dialog.
24
+ */
25
+ this.isOpen = false;
26
+ /**
27
+ * Add the fade-in css class to the host element when the dialog is opening. Remove when transition is complete.
28
+ * Styles use the fade-in class to apply a fade-in transition while the dialog is opening.
29
+ */
30
+ this.fadeIn = false;
31
+ /**
32
+ * Add the fade-out css class to the host element when the dialog is closing. Remove when transition is complete.
33
+ * Styles use the fade-out class to apply a fade-out transition while the dialog is closing.
34
+ */
35
+ this.fadeOut = false;
36
+ this.displayAsPanel = false;
37
+ this.alignToTop = false;
38
+ this.transparentMask = false;
39
+ /**
40
+ * Defines the width of the dialog (height is auto). Can be a number that will be converted to pixels, or xsmall(320px), small(480px), medium(640px), or large(1024px)
41
+ */
42
+ this.size = "small";
43
+ /**
44
+ * Emits an event when the dialog is opened
45
+ */
46
+ this.opened = new EventEmitter();
47
+ /**
48
+ * Emits an event when the dialog is closed
49
+ */
50
+ this.closed = new EventEmitter();
51
+ this.previouslyFocusedElement = null;
52
+ }
53
+ onOverlayClick(event) {
54
+ if (event.target.tagName === 'EC-DIALOG' && this.displayAsPanel) {
55
+ this.close(new DialogResult(false));
56
+ }
57
+ }
58
+ ngOnInit() {
59
+ if (this.content) {
60
+ this.open(this.content, this.context, this.options);
61
+ }
62
+ }
63
+ ngOnDestroy() {
64
+ // Restore focus to the previously focused element when the dialog is destroyed.
65
+ // Need to do this here and not in close() because cdkTrapFocusAutoCapture's re-focus happens in ngOnDestroy.
66
+ // This doesn't work for dialog implementations outside of the dialog service because ngOnDestroy isn't called when
67
+ // the dialog is closed in those cases.
68
+ if (this.previouslyFocusedElement) {
69
+ this.previouslyFocusedElement.focus();
70
+ }
71
+ }
72
+ /**
73
+ * Clear and previously loaded content
74
+ * Load the component
75
+ * Save a reference of the loaded component
76
+ * Show the dialog and fade in
77
+ */
78
+ async open(component, context, options) {
79
+ if (!this.isOpen) {
80
+ // Capture the currently focused element, also looking in the shadow dom. Focus is restored to this element once the dialog is
81
+ // destroyed. See ngOnDestroy(). We need to do this here in addition to the cdkTrapFocusAutoCapture because sometimes the dialog's
82
+ // content is drawn and grabs focus before the cdkTrapFocusAutoCapture is able to read the previously focused element.
83
+ const activeElement = this.documentRef?.activeElement;
84
+ this.previouslyFocusedElement = activeElement?.shadowRoot?.activeElement || activeElement;
85
+ if (options) {
86
+ if (options.alignToTop) {
87
+ this.alignToTop = true;
88
+ }
89
+ if (options.displayAsPanel) {
90
+ this.displayAsPanel = true;
91
+ this.transparentMask = true;
92
+ }
93
+ if (options.transparentMask !== undefined) {
94
+ this.transparentMask = options.transparentMask;
95
+ }
96
+ if (options.canOpenDialog !== undefined) {
97
+ const canOpen = await options.canOpenDialog();
98
+ if (!canOpen) {
99
+ this.close(new DialogResult(false));
100
+ return;
101
+ }
102
+ }
103
+ }
104
+ // set the size before opening
105
+ if (typeof this.size === 'number') {
106
+ this.width = this.size;
107
+ }
108
+ else {
109
+ // Reset the width if the size is not a number. This is to prevent the width property conflicting with the size.
110
+ this.width = undefined;
111
+ }
112
+ this.minWidth = options?.minWidth;
113
+ this.fadeIn = true;
114
+ if (component instanceof TemplateRef) {
115
+ this.contentContainer.createEmbeddedView(component);
116
+ }
117
+ else {
118
+ let componentFactory = this.componentFactoryResolver.resolveComponentFactory(component);
119
+ this.componentRef = this.contentContainer.createComponent(componentFactory);
120
+ }
121
+ this.isOpen = true;
122
+ this.openDialogComponent(context);
123
+ // Once the animation is complete we can remove the animation class and
124
+ // emit the opened event, both to the hosting component and via DialogService
125
+ await timer(this.displayAsPanel ? PanelOpenDuration : DialogOpenDuration).pipe(take(1), tap(() => {
126
+ const dialogId = this.getDialogId();
127
+ this.fadeIn = false;
128
+ this.opened.emit(dialogId);
129
+ this.dialogService.triggerEvent(new DialogOpenEndEvent(this.dialogOpenStartEventId, dialogId));
130
+ })).toPromise();
131
+ this.handleCloseOnResize();
132
+ }
133
+ }
134
+ /**
135
+ * Fade the dialog out and hide
136
+ */
137
+ close(result) {
138
+ this.fadeOut = true;
139
+ const dialogId = this.getDialogId(); //call before wiping out the content
140
+ // When the fade out animation is complete we will hide the dialog
141
+ // and remove the animation class as well as let the world know that
142
+ // we're closed so they can complete any other cleanup
143
+ setTimeout(() => {
144
+ this.isOpen = false;
145
+ this.fadeOut = false;
146
+ this.contentContainer?.clear();
147
+ this.componentRef = undefined;
148
+ this.closed.emit(result);
149
+ this.dialogService.triggerEvent(new DialogCloseEvent(this.dialogOpenStartEventId, dialogId, result?.save, result?.context));
150
+ this.resetOptions();
151
+ }, this.displayAsPanel ? PanelCloseDuration : DialogCloseDuration);
152
+ }
153
+ /**Open the dialog and attach handlers to the cancel and save events to close it and notify the hosting page */
154
+ openDialogComponent(context) {
155
+ if (this.componentRef && this.componentRef.instance) {
156
+ const dialogContent = this.componentRef.instance;
157
+ // OnOpen is optional - create dialogs don't necessarily define it
158
+ if (dialogContent.onOpen) {
159
+ dialogContent.onOpen(context);
160
+ }
161
+ dialogContent.onDialogCancel.pipe(takeUntil(this.closed)).subscribe(() => {
162
+ this.close(new DialogResult(false));
163
+ });
164
+ dialogContent.onDialogSave.pipe(takeUntil(this.closed)).subscribe(val => {
165
+ this.close(new DialogResult(true, val));
166
+ });
167
+ }
168
+ }
169
+ /**
170
+ * Reset options so they don't persist next time the
171
+ * root dialog is opened
172
+ * @deprecated
173
+ */
174
+ resetOptions() {
175
+ this.alignToTop = false;
176
+ this.displayAsPanel = false;
177
+ }
178
+ /** If they turned on closeOnResize, automatically close the dialog any time somebody resizes the window.
179
+ * This is useful for responsive layouts to prevent having the dialogContent on the screen twice */
180
+ handleCloseOnResize() {
181
+ if (this.options && this.options.closeOnResize) {
182
+ this.windowService.resized.pipe(takeUntil(this.closed), take(1)).subscribe(() => {
183
+ this.close(new DialogResult(false));
184
+ });
185
+ }
186
+ }
187
+ /**Extract the dialogId from the dialog content, if it has one. Template-based dialogs generally don't.
188
+ * We fall back to empty string to allow anybody listening for dialogEvents to still record the open/close even if
189
+ * the dialog itself does not say what the name is.
190
+ */
191
+ getDialogId() {
192
+ return this.componentRef?.instance.dialogId || '';
193
+ }
194
+ }
195
+ DialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: DialogComponent, deps: [{ token: i0.ComponentFactoryResolver }, { token: i1.WindowService }, { token: i2.DialogService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
196
+ DialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: DialogComponent, selector: "ec-dialog", inputs: { size: "size", content: "content", context: "context", options: "options", dialogOpenStartEventId: "dialogOpenStartEventId" }, outputs: { opened: "opened", closed: "closed" }, host: { listeners: { "click": "onOverlayClick($event)" }, properties: { "class.is-open": "this.isOpen", "class.fade-in": "this.fadeIn", "class.fade-out": "this.fadeOut", "class.is-panel": "this.displayAsPanel", "class.is-top-aligned": "this.alignToTop", "class.is-transparent": "this.transparentMask" } }, viewQueries: [{ propertyName: "contentContainer", first: true, predicate: ["content"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: '<article [style.width.px]="width" [style.min-width]="minWidth" class="dialog-{{size}}" cdkTrapFocus cdkTrapFocusAutoCapture><ng-template #content></ng-template></article>', isInline: true, styles: [":root{--ec-font-size-icon: 1rem;--ec-color-icon: rgba(26, 26, 35, .66)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideIn{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes panelMaskFadeIn{0%{background-color:transparent}to{background-color:var(--ec-dialog-background-color)}}:host{--ec-dialog-background-color: var(--ec-background-color-dialog);align-items:center;background-color:var(--ec-dialog-background-color);justify-content:center;position:fixed;z-index:var(--ec-z-index-dialog);top:0;left:0;right:0;bottom:0;display:none}:host.is-open{display:flex}:host.fade-in{animation-name:fadeIn;animation-duration:125ms;animation-fill-mode:forwards;animation-timing-function:ease-in-out}:host.fade-out{animation-name:fadeIn;animation-duration:.1s;animation-direction:reverse;animation-fill-mode:forwards;animation-timing-function:ease-in-out}:host.is-panel article{position:absolute;top:0;bottom:0;right:0;max-height:none;border-right:0;border-top:0;border-bottom:0;border-radius:0;box-shadow:0 0 .5rem var(--ec-color-shadow)}:host.is-panel.fade-in{animation-name:panelMaskFadeIn;animation-duration:.25s;animation-fill-mode:forwards}:host.is-panel.fade-in article{animation-name:slideIn;animation-duration:.25s;animation-fill-mode:forwards;animation-timing-function:ease-out}:host.is-panel.fade-out{animation-name:panelMaskFadeIn;animation-direction:reverse;animation-fill-mode:forwards}:host.is-panel.fade-out article{animation-name:slideIn;animation-duration:225ms;animation-direction:reverse;animation-fill-mode:forwards;animation-timing-function:ease-in}:host.is-top-aligned{align-items:flex-start}:host.is-top-aligned article{min-height:auto;margin-top:20vh}:host.is-transparent{--ec-dialog-background-color: transparent}article{background-color:var(--ec-background-color-body);background-clip:padding-box;box-shadow:0 0 .625rem #1a1a2333;border-radius:var(--ec-border-radius-dialog);overflow:hidden;display:flex;flex:none;min-height:9rem;max-height:90vh;max-width:90vw}.dialog-xsmall{width:20rem}.dialog-small{width:30rem}.dialog-medium{width:40rem}.dialog-large{width:50rem}.dialog-xlarge{width:60rem}.dialog-full{width:90vw}\n"], dependencies: [{ kind: "directive", type: i3.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }] });
197
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: DialogComponent, decorators: [{
198
+ type: Component,
199
+ args: [{ selector: 'ec-dialog', template: '<article [style.width.px]="width" [style.min-width]="minWidth" class="dialog-{{size}}" cdkTrapFocus cdkTrapFocusAutoCapture><ng-template #content></ng-template></article>', styles: [":root{--ec-font-size-icon: 1rem;--ec-color-icon: rgba(26, 26, 35, .66)}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideIn{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes panelMaskFadeIn{0%{background-color:transparent}to{background-color:var(--ec-dialog-background-color)}}:host{--ec-dialog-background-color: var(--ec-background-color-dialog);align-items:center;background-color:var(--ec-dialog-background-color);justify-content:center;position:fixed;z-index:var(--ec-z-index-dialog);top:0;left:0;right:0;bottom:0;display:none}:host.is-open{display:flex}:host.fade-in{animation-name:fadeIn;animation-duration:125ms;animation-fill-mode:forwards;animation-timing-function:ease-in-out}:host.fade-out{animation-name:fadeIn;animation-duration:.1s;animation-direction:reverse;animation-fill-mode:forwards;animation-timing-function:ease-in-out}:host.is-panel article{position:absolute;top:0;bottom:0;right:0;max-height:none;border-right:0;border-top:0;border-bottom:0;border-radius:0;box-shadow:0 0 .5rem var(--ec-color-shadow)}:host.is-panel.fade-in{animation-name:panelMaskFadeIn;animation-duration:.25s;animation-fill-mode:forwards}:host.is-panel.fade-in article{animation-name:slideIn;animation-duration:.25s;animation-fill-mode:forwards;animation-timing-function:ease-out}:host.is-panel.fade-out{animation-name:panelMaskFadeIn;animation-direction:reverse;animation-fill-mode:forwards}:host.is-panel.fade-out article{animation-name:slideIn;animation-duration:225ms;animation-direction:reverse;animation-fill-mode:forwards;animation-timing-function:ease-in}:host.is-top-aligned{align-items:flex-start}:host.is-top-aligned article{min-height:auto;margin-top:20vh}:host.is-transparent{--ec-dialog-background-color: transparent}article{background-color:var(--ec-background-color-body);background-clip:padding-box;box-shadow:0 0 .625rem #1a1a2333;border-radius:var(--ec-border-radius-dialog);overflow:hidden;display:flex;flex:none;min-height:9rem;max-height:90vh;max-width:90vw}.dialog-xsmall{width:20rem}.dialog-small{width:30rem}.dialog-medium{width:40rem}.dialog-large{width:50rem}.dialog-xlarge{width:60rem}.dialog-full{width:90vw}\n"] }]
200
+ }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i1.WindowService }, { type: i2.DialogService }, { type: Document, decorators: [{
201
+ type: Inject,
202
+ args: [DOCUMENT]
203
+ }] }]; }, propDecorators: { isOpen: [{
204
+ type: HostBinding,
205
+ args: ['class.is-open']
206
+ }], fadeIn: [{
207
+ type: HostBinding,
208
+ args: ['class.fade-in']
209
+ }], fadeOut: [{
210
+ type: HostBinding,
211
+ args: ['class.fade-out']
212
+ }], displayAsPanel: [{
213
+ type: HostBinding,
214
+ args: ['class.is-panel']
215
+ }], alignToTop: [{
216
+ type: HostBinding,
217
+ args: ['class.is-top-aligned']
218
+ }], transparentMask: [{
219
+ type: HostBinding,
220
+ args: ['class.is-transparent']
221
+ }], onOverlayClick: [{
222
+ type: HostListener,
223
+ args: ['click', ['$event']]
224
+ }], size: [{
225
+ type: Input
226
+ }], content: [{
227
+ type: Input
228
+ }], context: [{
229
+ type: Input
230
+ }], options: [{
231
+ type: Input
232
+ }], dialogOpenStartEventId: [{
233
+ type: Input
234
+ }], opened: [{
235
+ type: Output
236
+ }], closed: [{
237
+ type: Output
238
+ }], contentContainer: [{
239
+ type: ViewChild,
240
+ args: ['content', { read: ViewContainerRef, static: true }]
241
+ }] } });
242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9kaXNwbGF5L2RpYWxvZy9kaWFsb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUEwQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFRLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xNLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUE2QixZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFHL0csaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFXLEdBQUcsQ0FBQztBQUM5QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBVyxHQUFHLENBQUM7QUFDL0MsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQVcsR0FBRyxDQUFDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFXLEdBQUcsQ0FBQztBQU85QyxNQUFNLE9BQU8sZUFBZTtJQWlGMUIsWUFDVSx3QkFBa0QsRUFDbEQsYUFBNEIsRUFDNUIsYUFBNEIsRUFDVixXQUFxQjtRQUh2Qyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ1YsZ0JBQVcsR0FBWCxXQUFXLENBQVU7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ZUFBZSxvSEFxRmhCLFFBQVE7Z0dBckZQLGVBQWUsb25CQTRESSxnQkFBZ0IsMkNBL0RwQyw0S0FBNEs7MkZBRzNLLGVBQWU7a0JBTDNCLFNBQVM7K0JBQ0UsV0FBVyxZQUNYLDRLQUE0Szt5SkF3RjdJLFFBQVE7MEJBQTlDLE1BQU07MkJBQUMsUUFBUTs0Q0FoRm1CLE1BQU07c0JBQTFDLFdBQVc7dUJBQUMsZUFBZTtnQkFNUyxNQUFNO3NCQUExQyxXQUFXO3VCQUFDLGVBQWU7Z0JBTVUsT0FBTztzQkFBNUMsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBRVMsY0FBYztzQkFBbkQsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBRWUsVUFBVTtzQkFBckQsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBRVMsZUFBZTtzQkFBMUQsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBRU8sY0FBYztzQkFBdkQsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBU2pCLElBQUk7c0JBQW5CLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBT0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUtXLE1BQU07c0JBQXRCLE1BQU07Z0JBS1UsTUFBTTtzQkFBdEIsTUFBTTtnQkFLZ0UsZ0JBQWdCO3NCQUF0RixTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgQ29tcG9uZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQsIFR5cGUsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgVGVtcGxhdGVSZWYsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0aW1lciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgV2luZG93U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvd2luZG93LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFsb2dDb250ZW50IH0gZnJvbSAnLi9kaWFsb2ctY29udGVudCc7XHJcbmltcG9ydCB7IERpYWxvZ09wZW5FbmRFdmVudCwgRGlhbG9nQ2xvc2VFdmVudCwgRGlhbG9nU2l6ZSwgRGlhbG9nT3B0aW9ucywgRGlhbG9nUmVzdWx0IH0gZnJvbSAnLi9kaWFsb2ctdHlwZXMnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi9kaWFsb2cuc2VydmljZSc7XHJcblxyXG4vKiogVGhlc2UgdmFsdWVzIG5lZWQgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggZGlhbG9nLWJhc2Uuc2NzcyAqL1xyXG5leHBvcnQgY29uc3QgRGlhbG9nT3BlbkR1cmF0aW9uOiBudW1iZXIgPSAxMjU7XHJcbmV4cG9ydCBjb25zdCBEaWFsb2dDbG9zZUR1cmF0aW9uOiBudW1iZXIgPSAxMDA7XHJcbmV4cG9ydCBjb25zdCBQYW5lbE9wZW5EdXJhdGlvbjogbnVtYmVyID0gMjUwO1xyXG5leHBvcnQgY29uc3QgUGFuZWxDbG9zZUR1cmF0aW9uOiBudW1iZXIgPSAyMjU7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VjLWRpYWxvZycsXHJcbiAgdGVtcGxhdGU6ICc8YXJ0aWNsZSBbc3R5bGUud2lkdGgucHhdPVwid2lkdGhcIiBbc3R5bGUubWluLXdpZHRoXT1cIm1pbldpZHRoXCIgY2xhc3M9XCJkaWFsb2cte3tzaXplfX1cIiBjZGtUcmFwRm9jdXMgY2RrVHJhcEZvY3VzQXV0b0NhcHR1cmU+PG5nLXRlbXBsYXRlICNjb250ZW50PjwvbmctdGVtcGxhdGU+PC9hcnRpY2xlPicsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGlhbG9nLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIERpYWxvZ0NvbXBvbmVudCB7XHJcbiAgLyoqXHJcbiAgICogQWRkL3JlbW92ZSB0aGUgaXMtb3BlbiBjc3MgY2xhc3MgdG8gdGhlIGhvc3QgZWxlbWVudCB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbmVkL2Nsb3NlZC5cclxuICAgKiBTdHlsZXMgdXNlIHRoZSBpcy1vcGVuIGNsYXNzIHRvIHNob3cvaGlkZSB0aGUgZGlhbG9nLlxyXG4gICAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaXMtb3BlbicpIHB1YmxpYyBpc09wZW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIHRoZSBmYWRlLWluIGNzcyBjbGFzcyB0byB0aGUgaG9zdCBlbGVtZW50IHdoZW4gdGhlIGRpYWxvZyBpcyBvcGVuaW5nLiBSZW1vdmUgd2hlbiB0cmFuc2l0aW9uIGlzIGNvbXBsZXRlLlxyXG4gICAqIFN0eWxlcyB1c2UgdGhlIGZhZGUtaW4gY2xhc3MgdG8gYXBwbHkgYSBmYWRlLWluIHRyYW5zaXRpb24gd2hpbGUgdGhlIGRpYWxvZyBpcyBvcGVuaW5nLlxyXG4gICAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmFkZS1pbicpIHB1YmxpYyBmYWRlSW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIHRoZSBmYWRlLW91dCBjc3MgY2xhc3MgdG8gdGhlIGhvc3QgZWxlbWVudCB3aGVuIHRoZSBkaWFsb2cgaXMgY2xvc2luZy4gUmVtb3ZlIHdoZW4gdHJhbnNpdGlvbiBpcyBjb21wbGV0ZS5cclxuICAgKiBTdHlsZXMgdXNlIHRoZSBmYWRlLW91dCBjbGFzcyB0byBhcHBseSBhIGZhZGUtb3V0IHRyYW5zaXRpb24gd2hpbGUgdGhlIGRpYWxvZyBpcyBjbG9zaW5nLlxyXG4gICAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmFkZS1vdXQnKSBwdWJsaWMgZmFkZU91dCA9IGZhbHNlO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlzLXBhbmVsJykgcHVibGljIGRpc3BsYXlBc1BhbmVsID0gZmFsc2U7XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaXMtdG9wLWFsaWduZWQnKSBwdWJsaWMgYWxpZ25Ub1RvcCA9IGZhbHNlO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlzLXRyYW5zcGFyZW50JykgcHVibGljIHRyYW5zcGFyZW50TWFzayA9IGZhbHNlO1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pIHB1YmxpYyBvbk92ZXJsYXlDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCg8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS50YWdOYW1lID09PSAnRUMtRElBTE9HJyAmJiB0aGlzLmRpc3BsYXlBc1BhbmVsKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UobmV3IERpYWxvZ1Jlc3VsdChmYWxzZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyB0aGUgd2lkdGggb2YgdGhlIGRpYWxvZyAoaGVpZ2h0IGlzIGF1dG8pLiBDYW4gYmUgYSBudW1iZXIgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBwaXhlbHMsIG9yIHhzbWFsbCgzMjBweCksIHNtYWxsKDQ4MHB4KSwgbWVkaXVtKDY0MHB4KSwgb3IgbGFyZ2UoMTAyNHB4KVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzaXplOiBEaWFsb2dTaXplID0gXCJzbWFsbFwiO1xyXG5cclxuICBASW5wdXQoKSBjb250ZW50PzogVHlwZTxEaWFsb2dDb250ZW50PGFueT4+IHwgVGVtcGxhdGVSZWY8YW55PjtcclxuICBASW5wdXQoKSBjb250ZXh0PzogYW55O1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM/OiBEaWFsb2dPcHRpb25zO1xyXG5cclxuICAvKipPbmx5IHNldCBpZiB0aGlzIHBhcnRpY3VsYXIgaW5zdGFuY2Ugb2YgYSBkaWFsb2cgc2hvdWxkIGJlIGlkZW50aWZpZWQgc2VwYXJhdGVseSBmcm9tIG90aGVycy5cclxuICAgKiBJZiBwcm92aWRlZCwgdGhpcyBpcyBlbWl0dGVkIHRvIHRoZSBkaWFsb2cgc2VydmljZSB3aXRoIE9wZW5FbmQgYW5kIENsb3NlIGV2ZW50cy4gRGlyZWN0IHVzYWdlXHJcbiAgICogb2YgdGhlIERpYWxvZ0NvbXBvbmVudCBmcm9tIG91dHNpZGUgYSBEaWFsb2dHcm91cCBkb2VzIG5vdCB1c3VhbGx5IHJlcXVpcmUgdXNpbmcgdGhpcyBwYXJhbWV0ZXIgYXNcclxuICAgKiB0aGUgZGlhbG9nIHJlZmVyZW5jZSBpdHNlbGYgZnVuY3Rpb25zIGFzIHRoZSBpZGVudGlmaWVyXHJcbiAgICovXHJcbiAgQElucHV0KCkgZGlhbG9nT3BlblN0YXJ0RXZlbnRJZD86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgZGlhbG9nIGlzIG9wZW5lZFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgb3BlbmVkOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgZGlhbG9nIGlzIGNsb3NlZFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgY2xvc2VkOiBFdmVudEVtaXR0ZXI8RGlhbG9nUmVzdWx0PGFueT4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgY29udGFpbmVyIHdoZXJlIHRoZSBjb21wb25lbnQgd2lsbCBiZSBsb2FkZWRcclxuICAgKi9cclxuICBAVmlld0NoaWxkKCdjb250ZW50JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSkgcHVibGljIGNvbnRlbnRDb250YWluZXIhOiBWaWV3Q29udGFpbmVyUmVmO1xyXG5cclxuICAvKipcclxuICAgKiBDdXN0b20gd2lkdGggb2YgdGhlIGRpYWxvZyBpbiBwaXhlbHMuIFNldCBieSBkZWZpbmluZyB0aGUgc2l6ZSBwcm9wZXJ0eVxyXG4gICAqIGFzIGEgbnVtYmVyIHZhbHVlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyB3aWR0aD86IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3VzdG9tIG1pbi13aWR0aCBvZiB0aGUgZGlhbG9nLiBPbmx5IHRha2VzIGVmZmVjdCBpZiBzaXplIGlzIHNldCB0byBkeW5hbWljLlxyXG4gICAqIE11c3QgaW5jbHVkZSB1bml0cywgaS5lLiBcIjMycmVtXCIgb3IgXCI2NDBweFwiXHJcbiAgICovXHJcbiAgcHVibGljIG1pbldpZHRoPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBBIHJlZmVyZW5jZSBvZiB0aGUgY29tcG9uZW50IG9uY2UgaXQgaGFzIGJlZW4gbG9hZGVkXHJcbiAgICovXHJcbiAgcHVibGljIGNvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxhbnk+O1xyXG5cclxuICBwcml2YXRlIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgcHJpdmF0ZSB3aW5kb3dTZXJ2aWNlOiBXaW5kb3dTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudFJlZjogRG9jdW1lbnRcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgdGhpcy5vcGVuKHRoaXMuY29udGVudCwgdGhpcy5jb250ZXh0LCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAvLyBSZXN0b3JlIGZvY3VzIHRvIHRoZSBwcmV2aW91c2x5IGZvY3VzZWQgZWxlbWVudCB3aGVuIHRoZSBkaWFsb2cgaXMgZGVzdHJveWVkLlxyXG4gICAgLy8gTmVlZCB0byBkbyB0aGlzIGhlcmUgYW5kIG5vdCBpbiBjbG9zZSgpIGJlY2F1c2UgY2RrVHJhcEZvY3VzQXV0b0NhcHR1cmUncyByZS1mb2N1cyBoYXBwZW5zIGluIG5nT25EZXN0cm95LlxyXG4gICAgLy8gVGhpcyBkb2Vzbid0IHdvcmsgZm9yIGRpYWxvZyBpbXBsZW1lbnRhdGlvbnMgb3V0c2lkZSBvZiB0aGUgZGlhbG9nIHNlcnZpY2UgYmVjYXVzZSBuZ09uRGVzdHJveSBpc24ndCBjYWxsZWQgd2hlblxyXG4gICAgLy8gdGhlIGRpYWxvZyBpcyBjbG9zZWQgaW4gdGhvc2UgY2FzZXMuXHJcbiAgICBpZiAodGhpcy5wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIGFuZCBwcmV2aW91c2x5IGxvYWRlZCBjb250ZW50XHJcbiAgICogTG9hZCB0aGUgY29tcG9uZW50XHJcbiAgICogU2F2ZSBhIHJlZmVyZW5jZSBvZiB0aGUgbG9hZGVkIGNvbXBvbmVudFxyXG4gICAqIFNob3cgdGhlIGRpYWxvZyBhbmQgZmFkZSBpblxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBvcGVuPFQ+KGNvbXBvbmVudDogVHlwZTxEaWFsb2dDb250ZW50PFQ+PiB8IFRlbXBsYXRlUmVmPGFueT4sIGNvbnRleHQ/OiBULCBvcHRpb25zPzogRGlhbG9nT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLmlzT3Blbikge1xyXG4gICAgICBcclxuICAgICAgLy8gQ2FwdHVyZSB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCwgYWxzbyBsb29raW5nIGluIHRoZSBzaGFkb3cgZG9tLiBGb2N1cyBpcyByZXN0b3JlZCB0byB0aGlzIGVsZW1lbnQgb25jZSB0aGUgZGlhbG9nIGlzXHJcbiAgICAgIC8vIGRlc3Ryb3llZC4gU2VlIG5nT25EZXN0cm95KCkuIFdlIG5lZWQgdG8gZG8gdGhpcyBoZXJlIGluIGFkZGl0aW9uIHRvIHRoZSBjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZSBiZWNhdXNlIHNvbWV0aW1lcyB0aGUgZGlhbG9nJ3NcclxuICAgICAgLy8gY29udGVudCBpcyBkcmF3biBhbmQgZ3JhYnMgZm9jdXMgYmVmb3JlIHRoZSBjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZSBpcyBhYmxlIHRvIHJlYWQgdGhlIHByZXZpb3VzbHkgZm9jdXNlZCBlbGVtZW50LlxyXG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gPEhUTUxFbGVtZW50IHwgbnVsbD50aGlzLmRvY3VtZW50UmVmPy5hY3RpdmVFbGVtZW50O1xyXG4gICAgICB0aGlzLnByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IDxIVE1MRWxlbWVudD5hY3RpdmVFbGVtZW50Py5zaGFkb3dSb290Py5hY3RpdmVFbGVtZW50IHx8IGFjdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICAgIGlmIChvcHRpb25zLmFsaWduVG9Ub3ApIHtcclxuICAgICAgICAgIHRoaXMuYWxpZ25Ub1RvcCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5kaXNwbGF5QXNQYW5lbCkge1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5QXNQYW5lbCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnRyYW5zcGFyZW50TWFzayA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy50cmFuc3BhcmVudE1hc2sgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgdGhpcy50cmFuc3BhcmVudE1hc2sgPSBvcHRpb25zLnRyYW5zcGFyZW50TWFzaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zLmNhbk9wZW5EaWFsb2cgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgY29uc3QgY2FuT3BlbiA9IGF3YWl0IG9wdGlvbnMuY2FuT3BlbkRpYWxvZygpO1xyXG4gICAgICAgICAgaWYgKCFjYW5PcGVuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UobmV3IERpYWxvZ1Jlc3VsdChmYWxzZSkpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzZXQgdGhlIHNpemUgYmVmb3JlIG9wZW5pbmdcclxuICAgICAgaWYgKHR5cGVvZiB0aGlzLnNpemUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuc2l6ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBSZXNldCB0aGUgd2lkdGggaWYgdGhlIHNpemUgaXMgbm90IGEgbnVtYmVyLiBUaGlzIGlzIHRvIHByZXZlbnQgdGhlIHdpZHRoIHByb3BlcnR5IGNvbmZsaWN0aW5nIHdpdGggdGhlIHNpemUuXHJcbiAgICAgICAgdGhpcy53aWR0aCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5taW5XaWR0aCA9IG9wdGlvbnM/Lm1pbldpZHRoO1xyXG5cclxuICAgICAgdGhpcy5mYWRlSW4gPSB0cnVlO1xyXG4gICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcclxuICAgICAgICB0aGlzLmNvbnRlbnRDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KGNvbXBvbmVudCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmID0gdGhpcy5jb250ZW50Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xyXG5cclxuICAgICAgdGhpcy5vcGVuRGlhbG9nQ29tcG9uZW50PFQ+KGNvbnRleHQpO1xyXG5cclxuICAgICAgLy8gT25jZSB0aGUgYW5pbWF0aW9uIGlzIGNvbXBsZXRlIHdlIGNhbiByZW1vdmUgdGhlIGFuaW1hdGlvbiBjbGFzcyBhbmRcclxuICAgICAgLy8gZW1pdCB0aGUgb3BlbmVkIGV2ZW50LCBib3RoIHRvIHRoZSBob3N0aW5nIGNvbXBvbmVudCBhbmQgdmlhIERpYWxvZ1NlcnZpY2VcclxuICAgICAgYXdhaXQgdGltZXIodGhpcy5kaXNwbGF5QXNQYW5lbCA/IFBhbmVsT3BlbkR1cmF0aW9uIDogRGlhbG9nT3BlbkR1cmF0aW9uKS5waXBlKFxyXG4gICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGRpYWxvZ0lkID0gdGhpcy5nZXREaWFsb2dJZCgpO1xyXG4gICAgICAgICAgdGhpcy5mYWRlSW4gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMub3BlbmVkLmVtaXQoZGlhbG9nSWQpO1xyXG4gICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnRyaWdnZXJFdmVudChuZXcgRGlhbG9nT3BlbkVuZEV2ZW50KHRoaXMuZGlhbG9nT3BlblN0YXJ0RXZlbnRJZCwgZGlhbG9nSWQpKTtcclxuICAgICAgICB9KVxyXG4gICAgICApLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgICAgdGhpcy5oYW5kbGVDbG9zZU9uUmVzaXplKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGYWRlIHRoZSBkaWFsb2cgb3V0IGFuZCBoaWRlXHJcbiAgICovXHJcbiAgcHVibGljIGNsb3NlPFQ+KHJlc3VsdD86IERpYWxvZ1Jlc3VsdDxUPik6IHZvaWQge1xyXG4gICAgdGhpcy5mYWRlT3V0ID0gdHJ1ZTtcclxuICAgIGNvbnN0IGRpYWxvZ0lkID0gdGhpcy5nZXREaWFsb2dJZCgpOyAgLy9jYWxsIGJlZm9yZSB3aXBpbmcgb3V0IHRoZSBjb250ZW50XHJcblxyXG4gICAgLy8gV2hlbiB0aGUgZmFkZSBvdXQgYW5pbWF0aW9uIGlzIGNvbXBsZXRlIHdlIHdpbGwgaGlkZSB0aGUgZGlhbG9nXHJcbiAgICAvLyBhbmQgcmVtb3ZlIHRoZSBhbmltYXRpb24gY2xhc3MgYXMgd2VsbCBhcyBsZXQgdGhlIHdvcmxkIGtub3cgdGhhdFxyXG4gICAgLy8gd2UncmUgY2xvc2VkIHNvIHRoZXkgY2FuIGNvbXBsZXRlIGFueSBvdGhlciBjbGVhbnVwXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5mYWRlT3V0ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY29udGVudENvbnRhaW5lcj8uY2xlYXIoKTtcclxuICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuY2xvc2VkLmVtaXQocmVzdWx0KTtcclxuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnRyaWdnZXJFdmVudChuZXcgRGlhbG9nQ2xvc2VFdmVudCh0aGlzLmRpYWxvZ09wZW5TdGFydEV2ZW50SWQsIGRpYWxvZ0lkLCByZXN1bHQ/LnNhdmUsIHJlc3VsdD8uY29udGV4dCkpO1xyXG4gICAgICB0aGlzLnJlc2V0T3B0aW9ucygpO1xyXG4gICAgfSwgdGhpcy5kaXNwbGF5QXNQYW5lbCA/IFBhbmVsQ2xvc2VEdXJhdGlvbiA6IERpYWxvZ0Nsb3NlRHVyYXRpb24pXHJcbiAgfVxyXG5cclxuICAvKipPcGVuIHRoZSBkaWFsb2cgYW5kIGF0dGFjaCBoYW5kbGVycyB0byB0aGUgY2FuY2VsIGFuZCBzYXZlIGV2ZW50cyB0byBjbG9zZSBpdCBhbmQgbm90aWZ5IHRoZSBob3N0aW5nIHBhZ2UgKi9cclxuICBwcml2YXRlIG9wZW5EaWFsb2dDb21wb25lbnQ8VD4oY29udGV4dD86IFQpIHtcclxuICAgIGlmICh0aGlzLmNvbXBvbmVudFJlZiAmJiB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZSkge1xyXG4gICAgICBjb25zdCBkaWFsb2dDb250ZW50ID0gdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgRGlhbG9nQ29udGVudDxUPjtcclxuXHJcbiAgICAgIC8vIE9uT3BlbiBpcyBvcHRpb25hbCAtIGNyZWF0ZSBkaWFsb2dzIGRvbid0IG5lY2Vzc2FyaWx5IGRlZmluZSBpdFxyXG4gICAgICBpZiAoZGlhbG9nQ29udGVudC5vbk9wZW4pIHtcclxuICAgICAgICBkaWFsb2dDb250ZW50Lm9uT3Blbihjb250ZXh0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZGlhbG9nQ29udGVudC5vbkRpYWxvZ0NhbmNlbC5waXBlKHRha2VVbnRpbCh0aGlzLmNsb3NlZCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jbG9zZTxUPihuZXcgRGlhbG9nUmVzdWx0PFQ+KGZhbHNlKSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZGlhbG9nQ29udGVudC5vbkRpYWxvZ1NhdmUucGlwZSh0YWtlVW50aWwodGhpcy5jbG9zZWQpKS5zdWJzY3JpYmUodmFsID0+IHtcclxuICAgICAgICB0aGlzLmNsb3NlPFQ+KG5ldyBEaWFsb2dSZXN1bHQ8VD4odHJ1ZSwgdmFsKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgb3B0aW9ucyBzbyB0aGV5IGRvbid0IHBlcnNpc3QgbmV4dCB0aW1lIHRoZVxyXG4gICAqIHJvb3QgZGlhbG9nIGlzIG9wZW5lZFxyXG4gICAqIEBkZXByZWNhdGVkXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZXNldE9wdGlvbnMoKSB7XHJcbiAgICB0aGlzLmFsaWduVG9Ub3AgPSBmYWxzZTtcclxuICAgIHRoaXMuZGlzcGxheUFzUGFuZWwgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBJZiB0aGV5IHR1cm5lZCBvbiBjbG9zZU9uUmVzaXplLCBhdXRvbWF0aWNhbGx5IGNsb3NlIHRoZSBkaWFsb2cgYW55IHRpbWUgc29tZWJvZHkgcmVzaXplcyB0aGUgd2luZG93LlxyXG4gICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVzcG9uc2l2ZSBsYXlvdXRzIHRvIHByZXZlbnQgaGF2aW5nIHRoZSBkaWFsb2dDb250ZW50IG9uIHRoZSBzY3JlZW4gdHdpY2UgKi9cclxuICBwcml2YXRlIGhhbmRsZUNsb3NlT25SZXNpemUoKSB7XHJcbiAgICBpZih0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmNsb3NlT25SZXNpemUpe1xyXG4gICAgICB0aGlzLndpbmRvd1NlcnZpY2UucmVzaXplZCEucGlwZSh0YWtlVW50aWwodGhpcy5jbG9zZWQpLCB0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2xvc2UobmV3IERpYWxvZ1Jlc3VsdChmYWxzZSkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKkV4dHJhY3QgdGhlIGRpYWxvZ0lkIGZyb20gdGhlIGRpYWxvZyBjb250ZW50LCBpZiBpdCBoYXMgb25lLiBUZW1wbGF0ZS1iYXNlZCBkaWFsb2dzIGdlbmVyYWxseSBkb24ndC5cclxuICAgKiBXZSBmYWxsIGJhY2sgdG8gZW1wdHkgc3RyaW5nIHRvIGFsbG93IGFueWJvZHkgbGlzdGVuaW5nIGZvciBkaWFsb2dFdmVudHMgdG8gc3RpbGwgcmVjb3JkIHRoZSBvcGVuL2Nsb3NlIGV2ZW4gaWZcclxuICAgKiB0aGUgZGlhbG9nIGl0c2VsZiBkb2VzIG5vdCBzYXkgd2hhdCB0aGUgbmFtZSBpcy4gXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXREaWFsb2dJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFJlZj8uaW5zdGFuY2UuZGlhbG9nSWQgfHwgJyc7XHJcbiAgfVxyXG59XHJcbiJdfQ==