@energycap/components 0.42.4-esbuild.20250131-1105 → 0.42.4-esbuild.20250131-1219

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 (324) hide show
  1. package/package.json +5 -1
  2. package/esm2022/energycap-components.mjs +0 -5
  3. package/esm2022/lib/components.module.mjs +0 -423
  4. package/esm2022/lib/controls/banner/banner.component.mjs +0 -109
  5. package/esm2022/lib/controls/button/button.component.mjs +0 -106
  6. package/esm2022/lib/controls/button/copy-button-base.directive.mjs +0 -67
  7. package/esm2022/lib/controls/button/copy-button.directive.mjs +0 -28
  8. package/esm2022/lib/controls/button/copy-table-button.directive.mjs +0 -43
  9. package/esm2022/lib/controls/calendar/calendar-item.component.mjs +0 -91
  10. package/esm2022/lib/controls/calendar/calendar.component.mjs +0 -248
  11. package/esm2022/lib/controls/calendar/calendar.types.mjs +0 -2
  12. package/esm2022/lib/controls/checkbox/checkbox.component.mjs +0 -140
  13. package/esm2022/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +0 -38
  14. package/esm2022/lib/controls/combobox/combobox.component.mjs +0 -879
  15. package/esm2022/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.mjs +0 -57
  16. package/esm2022/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.mjs +0 -62
  17. package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.mjs +0 -100
  18. package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.mjs +0 -101
  19. package/esm2022/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.mjs +0 -76
  20. package/esm2022/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.mjs +0 -79
  21. package/esm2022/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.mjs +0 -210
  22. package/esm2022/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.mjs +0 -81
  23. package/esm2022/lib/controls/date-input/date-input.component.mjs +0 -464
  24. package/esm2022/lib/controls/date-input/date-input.types.mjs +0 -44
  25. package/esm2022/lib/controls/dropdown/dropdown.component.mjs +0 -243
  26. package/esm2022/lib/controls/file-upload/file-upload.component.mjs +0 -261
  27. package/esm2022/lib/controls/form-control/form-control.component.mjs +0 -98
  28. package/esm2022/lib/controls/form-control-base.mjs +0 -151
  29. package/esm2022/lib/controls/form-control-label/form-control-label.component.mjs +0 -136
  30. package/esm2022/lib/controls/form-group/form-group.component.mjs +0 -261
  31. package/esm2022/lib/controls/help-popover/help-popover.component.mjs +0 -31
  32. package/esm2022/lib/controls/item-picker/item-picker.component.mjs +0 -329
  33. package/esm2022/lib/controls/link-button/link-button.component.mjs +0 -11
  34. package/esm2022/lib/controls/menu/menu.component.mjs +0 -485
  35. package/esm2022/lib/controls/navigation/link-item.mjs +0 -2
  36. package/esm2022/lib/controls/navigation/nav-group.mjs +0 -39
  37. package/esm2022/lib/controls/navigation/nav-item-active.directive.mjs +0 -92
  38. package/esm2022/lib/controls/navigation/nav-item.mjs +0 -2
  39. package/esm2022/lib/controls/numericbox/numericbox.component.mjs +0 -372
  40. package/esm2022/lib/controls/popover/popover.component.mjs +0 -117
  41. package/esm2022/lib/controls/radio-button/radio-button-option.mjs +0 -3
  42. package/esm2022/lib/controls/radio-button/radio-button.component.mjs +0 -82
  43. package/esm2022/lib/controls/select/select.component.mjs +0 -88
  44. package/esm2022/lib/controls/tabs/tabs.component.mjs +0 -47
  45. package/esm2022/lib/controls/textbox/textbox.component.mjs +0 -155
  46. package/esm2022/lib/core/cache.service.mjs +0 -105
  47. package/esm2022/lib/core/custom-validators.mjs +0 -29
  48. package/esm2022/lib/core/date-time-helper.mjs +0 -228
  49. package/esm2022/lib/core/error.service.mjs +0 -61
  50. package/esm2022/lib/core/router-helper.service.mjs +0 -111
  51. package/esm2022/lib/core/scroll.service.mjs +0 -89
  52. package/esm2022/lib/core/telemetry-tracker.service.mjs +0 -16
  53. package/esm2022/lib/core/telemetry.service.mjs +0 -38
  54. package/esm2022/lib/core/validation-message.service.mjs +0 -185
  55. package/esm2022/lib/core/validation-patterns.mjs +0 -31
  56. package/esm2022/lib/core/window.service.mjs +0 -186
  57. package/esm2022/lib/display/app-bar/app-bar.component.mjs +0 -46
  58. package/esm2022/lib/display/avatar/avatar.component.mjs +0 -67
  59. package/esm2022/lib/display/avatar/avatar.service.mjs +0 -64
  60. package/esm2022/lib/display/confirm/confirm.component.mjs +0 -168
  61. package/esm2022/lib/display/dialog/dialog-content.mjs +0 -2
  62. package/esm2022/lib/display/dialog/dialog-group/dialog-group.component.mjs +0 -63
  63. package/esm2022/lib/display/dialog/dialog-types.mjs +0 -77
  64. package/esm2022/lib/display/dialog/dialog.component.mjs +0 -281
  65. package/esm2022/lib/display/dialog/dialog.service.mjs +0 -71
  66. package/esm2022/lib/display/help/help-types.mjs +0 -2
  67. package/esm2022/lib/display/hierarchy/hierarchy-base.mjs +0 -111
  68. package/esm2022/lib/display/hierarchy/hierarchy-mocks.spec.mjs +0 -54
  69. package/esm2022/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +0 -61
  70. package/esm2022/lib/display/item-display/item-display.component.mjs +0 -81
  71. package/esm2022/lib/display/json-display/json-display.component.mjs +0 -47
  72. package/esm2022/lib/display/resizable/resizable-base.mjs +0 -120
  73. package/esm2022/lib/display/resizable/resizable.component.mjs +0 -57
  74. package/esm2022/lib/display/spinner/spinner.component.mjs +0 -12
  75. package/esm2022/lib/display/splash/splash.component.mjs +0 -42
  76. package/esm2022/lib/display/splash/splash.service.mjs +0 -35
  77. package/esm2022/lib/display/table/resizable-column.component.mjs +0 -20
  78. package/esm2022/lib/display/table/resizable-table.directive.mjs +0 -227
  79. package/esm2022/lib/display/table/searchable-table.component.mjs +0 -342
  80. package/esm2022/lib/display/table/table-detail-row.component.mjs +0 -28
  81. package/esm2022/lib/display/table/table-locked-column.component.mjs +0 -58
  82. package/esm2022/lib/display/table/table-master-header-row.component.mjs +0 -14
  83. package/esm2022/lib/display/table/table-master-row.component.mjs +0 -163
  84. package/esm2022/lib/display/table/table-pagination.component.mjs +0 -155
  85. package/esm2022/lib/display/table/table-selectable-row.component.mjs +0 -235
  86. package/esm2022/lib/display/table/table.component.mjs +0 -249
  87. package/esm2022/lib/display/tags/tag.mjs +0 -18
  88. package/esm2022/lib/display/tags/tags.component.mjs +0 -77
  89. package/esm2022/lib/display/toast/toast/toast.component.mjs +0 -77
  90. package/esm2022/lib/display/toast/toast-types.mjs +0 -8
  91. package/esm2022/lib/display/toast/toast.service.mjs +0 -35
  92. package/esm2022/lib/display/toast/toaster/toaster.component.mjs +0 -114
  93. package/esm2022/lib/display/tooltip/tooltip.component.mjs +0 -28
  94. package/esm2022/lib/display/tooltip/tooltip.service.mjs +0 -78
  95. package/esm2022/lib/display/tooltip-directive/tooltip.directive.mjs +0 -173
  96. package/esm2022/lib/display/tour/tour-types.mjs +0 -34
  97. package/esm2022/lib/display/tour/tour.component.mjs +0 -398
  98. package/esm2022/lib/display/tour/tour.service.mjs +0 -75
  99. package/esm2022/lib/display/tree/tree.component.mjs +0 -135
  100. package/esm2022/lib/display/view-overlay/view-overlay.component.mjs +0 -58
  101. package/esm2022/lib/shared/directives/click-area-for/click-area-for.directive.mjs +0 -32
  102. package/esm2022/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +0 -111
  103. package/esm2022/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.mjs +0 -100
  104. package/esm2022/lib/shared/directives/popup/popup-container.directive.mjs +0 -166
  105. package/esm2022/lib/shared/display/pipes/date-display.pipe.mjs +0 -50
  106. package/esm2022/lib/shared/display/pipes/highlight-text.pipe.mjs +0 -30
  107. package/esm2022/lib/shared/display/pipes/relative-date.pipe.mjs +0 -62
  108. package/esm2022/lib/shared/display/pipes/row-count.pipe.mjs +0 -48
  109. package/esm2022/lib/shared/display/pipes/time-display.pipe.mjs +0 -41
  110. package/esm2022/lib/shared/display.mjs +0 -6
  111. package/esm2022/lib/shared/form-group.helper.mjs +0 -67
  112. package/esm2022/lib/shared/json-helper.mjs +0 -19
  113. package/esm2022/lib/shared/lodash-helper.mjs +0 -52
  114. package/esm2022/lib/shared/page/page-base/page-base.component.mjs +0 -387
  115. package/esm2022/lib/shared/page/page-statuses.mjs +0 -23
  116. package/esm2022/lib/shared/page/page-title/page-title.component.mjs +0 -23
  117. package/esm2022/lib/shared/page/page-view/page-view.component.mjs +0 -147
  118. package/esm2022/lib/shared/testing/copy-button-base-test-injector-factory.spec.mjs +0 -17
  119. package/esm2022/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs +0 -17
  120. package/esm2022/lib/shared/testing/page-base-component-test-helper.spec.mjs +0 -38
  121. package/esm2022/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +0 -98
  122. package/esm2022/lib/shared/testing/public-mocks.spec.mjs +0 -148
  123. package/esm2022/lib/shared/testing/spy-factory.spec.mjs +0 -40
  124. package/esm2022/lib/shared/testing/translation-mocks.spec.mjs +0 -57
  125. package/esm2022/lib/shared/user-preference.service.mjs +0 -17
  126. package/esm2022/lib/shared/wizard/wizard-base/wizard-base.component.mjs +0 -246
  127. package/esm2022/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +0 -68
  128. package/esm2022/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +0 -18
  129. package/esm2022/public-api.mjs +0 -117
  130. package/fesm2022/energycap-components.mjs +0 -13219
  131. package/fesm2022/energycap-components.mjs.map +0 -1
  132. package/index.d.ts +0 -5
  133. package/lib/components.module.d.ts +0 -92
  134. package/lib/controls/banner/banner.component.d.ts +0 -50
  135. package/lib/controls/button/button.component.d.ts +0 -78
  136. package/lib/controls/button/copy-button-base.directive.d.ts +0 -20
  137. package/lib/controls/button/copy-button.directive.d.ts +0 -14
  138. package/lib/controls/button/copy-table-button.directive.d.ts +0 -19
  139. package/lib/controls/calendar/calendar-item.component.d.ts +0 -22
  140. package/lib/controls/calendar/calendar.component.d.ts +0 -52
  141. package/lib/controls/calendar/calendar.types.d.ts +0 -11
  142. package/lib/controls/checkbox/checkbox.component.d.ts +0 -65
  143. package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +0 -25
  144. package/lib/controls/combobox/combobox.component.d.ts +0 -418
  145. package/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.d.ts +0 -42
  146. package/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.d.ts +0 -21
  147. package/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.d.ts +0 -21
  148. package/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.d.ts +0 -21
  149. package/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.d.ts +0 -18
  150. package/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.d.ts +0 -18
  151. package/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.d.ts +0 -21
  152. package/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.d.ts +0 -20
  153. package/lib/controls/date-input/date-input.component.d.ts +0 -115
  154. package/lib/controls/date-input/date-input.types.d.ts +0 -62
  155. package/lib/controls/dropdown/dropdown.component.d.ts +0 -161
  156. package/lib/controls/file-upload/file-upload.component.d.ts +0 -124
  157. package/lib/controls/form-control/form-control.component.d.ts +0 -28
  158. package/lib/controls/form-control-base.d.ts +0 -110
  159. package/lib/controls/form-control-label/form-control-label.component.d.ts +0 -73
  160. package/lib/controls/form-group/form-group.component.d.ts +0 -105
  161. package/lib/controls/help-popover/help-popover.component.d.ts +0 -11
  162. package/lib/controls/item-picker/item-picker.component.d.ts +0 -164
  163. package/lib/controls/link-button/link-button.component.d.ts +0 -5
  164. package/lib/controls/menu/menu.component.d.ts +0 -255
  165. package/lib/controls/navigation/link-item.d.ts +0 -32
  166. package/lib/controls/navigation/nav-group.d.ts +0 -18
  167. package/lib/controls/navigation/nav-item-active.directive.d.ts +0 -42
  168. package/lib/controls/navigation/nav-item.d.ts +0 -31
  169. package/lib/controls/numericbox/numericbox.component.d.ts +0 -148
  170. package/lib/controls/popover/popover.component.d.ts +0 -51
  171. package/lib/controls/radio-button/radio-button-option.d.ts +0 -19
  172. package/lib/controls/radio-button/radio-button.component.d.ts +0 -53
  173. package/lib/controls/select/select.component.d.ts +0 -44
  174. package/lib/controls/tabs/tabs.component.d.ts +0 -30
  175. package/lib/controls/textbox/textbox.component.d.ts +0 -107
  176. package/lib/core/cache.service.d.ts +0 -33
  177. package/lib/core/custom-validators.d.ts +0 -20
  178. package/lib/core/date-time-helper.d.ts +0 -101
  179. package/lib/core/error.service.d.ts +0 -20
  180. package/lib/core/router-helper.service.d.ts +0 -48
  181. package/lib/core/scroll.service.d.ts +0 -36
  182. package/lib/core/telemetry-tracker.service.d.ts +0 -13
  183. package/lib/core/telemetry.service.d.ts +0 -31
  184. package/lib/core/validation-message.service.d.ts +0 -26
  185. package/lib/core/validation-patterns.d.ts +0 -22
  186. package/lib/core/window.service.d.ts +0 -116
  187. package/lib/display/app-bar/app-bar.component.d.ts +0 -20
  188. package/lib/display/avatar/avatar.component.d.ts +0 -35
  189. package/lib/display/avatar/avatar.service.d.ts +0 -24
  190. package/lib/display/confirm/confirm.component.d.ts +0 -123
  191. package/lib/display/dialog/dialog-content.d.ts +0 -19
  192. package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +0 -32
  193. package/lib/display/dialog/dialog-types.d.ts +0 -130
  194. package/lib/display/dialog/dialog.component.d.ts +0 -120
  195. package/lib/display/dialog/dialog.service.d.ts +0 -48
  196. package/lib/display/help/help-types.d.ts +0 -33
  197. package/lib/display/hierarchy/hierarchy-base.d.ts +0 -97
  198. package/lib/display/hierarchy/hierarchy-mocks.spec.d.ts +0 -53
  199. package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +0 -34
  200. package/lib/display/item-display/item-display.component.d.ts +0 -43
  201. package/lib/display/json-display/json-display.component.d.ts +0 -16
  202. package/lib/display/resizable/resizable-base.d.ts +0 -67
  203. package/lib/display/resizable/resizable.component.d.ts +0 -31
  204. package/lib/display/spinner/spinner.component.d.ts +0 -5
  205. package/lib/display/splash/splash.component.d.ts +0 -16
  206. package/lib/display/splash/splash.service.d.ts +0 -22
  207. package/lib/display/table/resizable-column.component.d.ts +0 -10
  208. package/lib/display/table/resizable-table.directive.d.ts +0 -93
  209. package/lib/display/table/searchable-table.component.d.ts +0 -206
  210. package/lib/display/table/table-detail-row.component.d.ts +0 -8
  211. package/lib/display/table/table-locked-column.component.d.ts +0 -20
  212. package/lib/display/table/table-master-header-row.component.d.ts +0 -9
  213. package/lib/display/table/table-master-row.component.d.ts +0 -113
  214. package/lib/display/table/table-pagination.component.d.ts +0 -91
  215. package/lib/display/table/table-selectable-row.component.d.ts +0 -102
  216. package/lib/display/table/table.component.d.ts +0 -121
  217. package/lib/display/tags/tag.d.ts +0 -18
  218. package/lib/display/tags/tags.component.d.ts +0 -48
  219. package/lib/display/toast/toast/toast.component.d.ts +0 -23
  220. package/lib/display/toast/toast-types.d.ts +0 -24
  221. package/lib/display/toast/toast.service.d.ts +0 -20
  222. package/lib/display/toast/toaster/toaster.component.d.ts +0 -35
  223. package/lib/display/tooltip/tooltip.component.d.ts +0 -70
  224. package/lib/display/tooltip/tooltip.service.d.ts +0 -16
  225. package/lib/display/tooltip-directive/tooltip.directive.d.ts +0 -44
  226. package/lib/display/tour/tour-types.d.ts +0 -70
  227. package/lib/display/tour/tour.component.d.ts +0 -147
  228. package/lib/display/tour/tour.service.d.ts +0 -38
  229. package/lib/display/tree/tree.component.d.ts +0 -75
  230. package/lib/display/view-overlay/view-overlay.component.d.ts +0 -38
  231. package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +0 -14
  232. package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +0 -60
  233. package/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.d.ts +0 -23
  234. package/lib/shared/directives/popup/popup-container.directive.d.ts +0 -101
  235. package/lib/shared/display/pipes/date-display.pipe.d.ts +0 -21
  236. package/lib/shared/display/pipes/highlight-text.pipe.d.ts +0 -9
  237. package/lib/shared/display/pipes/relative-date.pipe.d.ts +0 -36
  238. package/lib/shared/display/pipes/row-count.pipe.d.ts +0 -23
  239. package/lib/shared/display/pipes/time-display.pipe.d.ts +0 -18
  240. package/lib/shared/display.d.ts +0 -42
  241. package/lib/shared/form-group.helper.d.ts +0 -31
  242. package/lib/shared/json-helper.d.ts +0 -7
  243. package/lib/shared/lodash-helper.d.ts +0 -18
  244. package/lib/shared/page/page-base/page-base.component.d.ts +0 -259
  245. package/lib/shared/page/page-statuses.d.ts +0 -13
  246. package/lib/shared/page/page-title/page-title.component.d.ts +0 -9
  247. package/lib/shared/page/page-view/page-view.component.d.ts +0 -102
  248. package/lib/shared/testing/copy-button-base-test-injector-factory.spec.d.ts +0 -4
  249. package/lib/shared/testing/hierarchy-base-test-injector-factory.spec.d.ts +0 -4
  250. package/lib/shared/testing/page-base-component-test-helper.spec.d.ts +0 -30
  251. package/lib/shared/testing/page-base-component-test-injector-factory.spec.d.ts +0 -28
  252. package/lib/shared/testing/public-mocks.spec.d.ts +0 -90
  253. package/lib/shared/testing/spy-factory.spec.d.ts +0 -27
  254. package/lib/shared/testing/translation-mocks.spec.d.ts +0 -30
  255. package/lib/shared/user-preference.service.d.ts +0 -13
  256. package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +0 -134
  257. package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +0 -27
  258. package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +0 -10
  259. package/public-api.d.ts +0 -113
  260. package/schematics/collection.json +0 -10
  261. package/schematics/rxjs-7-upgrade/index.d.ts +0 -3
  262. package/schematics/rxjs-7-upgrade/index.js +0 -68
  263. package/schematics/rxjs-7-upgrade/index.js.map +0 -1
  264. package/schematics/rxjs-7-upgrade/schema.d.ts +0 -4
  265. package/schematics/rxjs-7-upgrade/schema.js +0 -3
  266. package/schematics/rxjs-7-upgrade/schema.js.map +0 -1
  267. package/schematics/rxjs-7-upgrade/schema.json +0 -14
  268. package/schematics/utilities/typescript.d.ts +0 -7
  269. package/schematics/utilities/typescript.js +0 -42
  270. package/schematics/utilities/typescript.js.map +0 -1
  271. package/schematics/utilities/workspace.d.ts +0 -8
  272. package/schematics/utilities/workspace.js +0 -72
  273. package/schematics/utilities/workspace.js.map +0 -1
  274. package/src/assets/images/email-icon.png +0 -0
  275. package/src/assets/images/email-logo.png +0 -0
  276. package/src/assets/images/favicon-ech.svg +0 -7
  277. package/src/assets/images/favicon-esa.svg +0 -6
  278. package/src/assets/images/favicon-eum.svg +0 -6
  279. package/src/assets/images/favicon.svg +0 -5
  280. package/src/assets/images/icon-carbonhub.svg +0 -10
  281. package/src/assets/images/icon-eum.svg +0 -5
  282. package/src/assets/images/icon-ucp.svg +0 -5
  283. package/src/assets/images/icon-wattics.svg +0 -5
  284. package/src/assets/images/icon.svg +0 -4
  285. package/src/assets/images/logo.svg +0 -3
  286. package/src/assets/images/splash.gif +0 -0
  287. package/src/assets/locales/en_US.json +0 -59
  288. package/src/assets/scripts/unsupported-browser.js +0 -17
  289. package/src/styles/_base.scss +0 -38
  290. package/src/styles/_colors.scss +0 -96
  291. package/src/styles/_core.scss +0 -4
  292. package/src/styles/_functions.scss +0 -114
  293. package/src/styles/_global-variables.scss +0 -232
  294. package/src/styles/_icons.scss +0 -24
  295. package/src/styles/bootstrap/_grid.scss +0 -34
  296. package/src/styles/bootstrap/_reboot.scss +0 -323
  297. package/src/styles/components/_card.scss +0 -21
  298. package/src/styles/components/_link-icons.scss +0 -38
  299. package/src/styles/components/_splash.scss +0 -57
  300. package/src/styles/components/_unsupported-browsers.scss +0 -24
  301. package/src/styles/email/_email-base.scss +0 -228
  302. package/src/styles/email/email.scss +0 -43
  303. package/src/styles/index.scss +0 -27
  304. package/src/styles/mixins/_animations.scss +0 -18
  305. package/src/styles/mixins/_button-base.scss +0 -185
  306. package/src/styles/mixins/_card-base.scss +0 -40
  307. package/src/styles/mixins/_common.scss +0 -52
  308. package/src/styles/mixins/_dialog-base.scss +0 -96
  309. package/src/styles/mixins/_form-control-base.scss +0 -641
  310. package/src/styles/mixins/_login.scss +0 -74
  311. package/src/styles/mixins/_menu-base.scss +0 -153
  312. package/src/styles/mixins/_overlay-base.scss +0 -33
  313. package/src/styles/mixins/_resizable-base.scss +0 -57
  314. package/src/styles/mixins/_spinner-base.scss +0 -34
  315. package/src/styles/mixins/_table-base.scss +0 -298
  316. package/src/styles/mixins/_tabs-base.scss +0 -110
  317. package/src/styles/mixins/_tags-base.scss +0 -116
  318. package/src/styles/mixins/_text.scss +0 -89
  319. package/src/styles/mixins.scss +0 -15
  320. package/src/styles/utilities/_borders.scss +0 -30
  321. package/src/styles/utilities/_common.scss +0 -49
  322. package/src/styles/utilities/_layout.scss +0 -116
  323. package/src/styles/utilities/_spacing.scss +0 -65
  324. package/src/styles/utilities/_text.scss +0 -139
@@ -1,398 +0,0 @@
1
- import { DOCUMENT } from '@angular/common';
2
- import { Component, Inject, ViewChild } from '@angular/core';
3
- import { Subject, lastValueFrom } from 'rxjs';
4
- import { takeUntil } from 'rxjs/operators';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./tour.service";
7
- import * as i2 from "./../tooltip/tooltip.service";
8
- import * as i3 from "../../core/telemetry.service";
9
- import * as i4 from "../../core/cache.service";
10
- import * as i5 from "../dialog/dialog.service";
11
- import * as i6 from "@ngx-translate/core";
12
- import * as i7 from "@angular/common";
13
- import * as i8 from "../../controls/link-button/link-button.component";
14
- export class TourComponent {
15
- constructor(tourService, tooltipService, telemetryService, cacheService, dialogService, translateService, document) {
16
- this.tourService = tourService;
17
- this.tooltipService = tooltipService;
18
- this.telemetryService = telemetryService;
19
- this.cacheService = cacheService;
20
- this.dialogService = dialogService;
21
- this.translateService = translateService;
22
- this.document = document;
23
- /** Used to tell the UI that the step being shown is an exit step. This will change the
24
- * link text and the action when clicked
25
- */
26
- this.showDoneButton = false;
27
- /** Array of tours provided when the start tour event was detected */
28
- this.tours = [];
29
- // Couple indexes for the current tour/step stored for easier reference when knowing if we are at the end of the steps/tours
30
- this.currentStepIndex = -1;
31
- this.currentTourIndex = -1;
32
- /** Used to know if the restore step should be triggered when the tour is dismissed */
33
- this.isAutoStart = false;
34
- this.destroyed = new Subject();
35
- }
36
- ngOnInit() {
37
- this.tourService.events.pipe(takeUntil(this.destroyed)).subscribe(async (event) => {
38
- if (event.tourAction === 'start') {
39
- await this.setupTourComponent(event);
40
- }
41
- else if (event.tourAction === 'end') {
42
- if (this.currentTour) {
43
- this.writeCompletionKeyForAllTours();
44
- await this.endTour();
45
- }
46
- }
47
- else if (event.tourAction === 'append') {
48
- let visibleTours = event.tours;
49
- // If this was triggered via auto start then we need to remove any tours that have been completed
50
- if (event.isAutoStart) {
51
- visibleTours = this.removeCompletedTours(visibleTours);
52
- }
53
- // If there is already a current tour, then we need to append the new tours to the current tour
54
- if (this.currentTour) {
55
- this.tours = this.tours.concat(visibleTours);
56
- }
57
- else {
58
- // There is not a current tour, so treat this as a start event
59
- await this.setupTourComponent(event);
60
- }
61
- }
62
- });
63
- }
64
- ngOnDestroy() {
65
- this.destroyed.next();
66
- this.destroyed.unsubscribe();
67
- }
68
- /**
69
- * Called when a restore step has been completed
70
- */
71
- async done() {
72
- this.writeCompletionKey(this.currentTour);
73
- await this.endTour();
74
- }
75
- /**
76
- * Called when a tour begins and when the user clicks next on the current tour step. It will handle any after click actions and then
77
- * find the next step and present it to the user and transition to a restore step or new tour if needed.
78
- */
79
- async showNextStep() {
80
- // Before moving to the next step, make sure the current step does not have a click after defined. This could be hiding a menu
81
- // that was opened for the soon to be previous step.
82
- await this.waitForTimeout(this.handleClickAfter.bind(this));
83
- // Remove any previous tooltips
84
- this.removeTooltip();
85
- // Get our next step index to display to the user
86
- this.currentStepIndex = this.getNextAvailableStepIndex();
87
- if (this.currentStepIndex === -1) {
88
- // No more steps found, we either need to check for the exit step if this is the last tour
89
- // in the tours array or advance to the next tour
90
- if (this.currentTourIndex === this.tours.length - 1) {
91
- await this.handleExitStep();
92
- }
93
- else {
94
- // Write the completion key for the current tour before we move to the next
95
- this.writeCompletionKey(this.currentTour);
96
- this.currentTourIndex++;
97
- await this.showNextTour();
98
- }
99
- }
100
- else {
101
- this.currentTourStep = this.currentTour?.steps[this.currentStepIndex];
102
- // Now that we have our current step index, take care of any click before elements before showing the
103
- // tooltip. This could be opening a menu to get the tooltip element visible.
104
- await this.waitForTimeout(this.handleClickBefore.bind(this));
105
- // Click befores are done, now let's show the tooltip defined in the tour step
106
- await this.waitForTimeout(this.showStepTooltip.bind(this));
107
- }
108
- }
109
- async setupTourComponent(event) {
110
- // End any tours that may have been in progress if the user kicks off a new one
111
- if (this.currentTour) {
112
- this.writeCompletionKeyForAllTours();
113
- await this.endTour();
114
- }
115
- this.isAutoStart = event.isAutoStart;
116
- if (event.isAutoStart) {
117
- this.tours = this.removeCompletedTours(event.tours);
118
- }
119
- else {
120
- this.tours = event.tours;
121
- }
122
- if (this.tours.length) {
123
- this.showDoneButton = false;
124
- this.currentTourStep = undefined;
125
- this.currentStepIndex = -1;
126
- // Prime the index for the first tour
127
- this.currentTourIndex = 0;
128
- await this.showNextTour();
129
- }
130
- }
131
- /**
132
- * Shows a tour and emits an event that it was started
133
- * @param tour
134
- */
135
- async showNextTour() {
136
- // Track a tour started event if the consumer of the library has telemetry configured
137
- this.telemetryService.trackEvent('TourStarted', { tourId: this.currentTour.id });
138
- let continueTour = true;
139
- if (this.isAutoStart && this.currentTourIndex === 0 && this.currentTour?.introDialog) {
140
- let result = await lastValueFrom(this.dialogService.openDialog(this.currentTour.introDialog.content, this.currentTour.introDialog.size ?? 'small', this.currentTour.introDialog.context ?? undefined, this.currentTour.introDialog.options ?? undefined));
141
- if (!result.save) {
142
- continueTour = false;
143
- this.writeCompletionKeyForAllTours();
144
- // Advance to the last tour if there are multiple for its exit step
145
- this.currentTourIndex = this.tours.length - 1;
146
- await this.handleExitStep();
147
- }
148
- }
149
- if (continueTour) {
150
- this.showNextStep();
151
- }
152
- }
153
- async endTour() {
154
- // Handle any click afters for the active step shown before shutting it down
155
- await this.waitForTimeout(this.handleClickAfter.bind(this));
156
- this.currentTourStep = undefined;
157
- this.tours = [];
158
- this.removeTooltip();
159
- }
160
- /**
161
- * Displays a tooltip for the current tour step
162
- */
163
- async showStepTooltip() {
164
- // Track an event if the consumer of the library has telemetry configured
165
- this.telemetryService.trackEvent('TourStepChange', { tourId: this.currentTour.id, tourStepId: this.currentTourStep.id });
166
- const tooltipElement = this.document.querySelector(this.currentTourStep.anchor.selector);
167
- if (tooltipElement) {
168
- // Default width if none provided
169
- let stepWidth = 432;
170
- // Check the current tour step width and decide if it needs to change from the default value
171
- // based on whether the step defined it or not
172
- if (this.currentTourStep?.width !== undefined) {
173
- if (typeof this.currentTourStep.width === 'number') {
174
- stepWidth = this.currentTourStep.width;
175
- }
176
- else if (this.currentTourStep.width === 'auto') {
177
- stepWidth = undefined;
178
- }
179
- }
180
- const options = {
181
- id: `${this.currentTour?.id}_${this.currentTourStep.id}`,
182
- text: this.translateService.instant(this.currentTourStep.text),
183
- title: this.currentTourStep.title ? this.translateService.instant(this.currentTourStep.title) : undefined,
184
- customContent: this.custom,
185
- dismissible: true,
186
- maxWidth: this.currentTourStep?.maxWidth,
187
- width: stepWidth,
188
- backgroundColor: 'var(--ec-background-color-tour)',
189
- titleColor: 'var(--ec-color-tour-title)'
190
- };
191
- this.tooltip = this.tooltipService.show(tooltipElement, this.currentTourStep.anchor?.position, options);
192
- await this.waitForTimeout(this.focusOnNextOrDoneButton.bind(this));
193
- this.subscribeToTooltipOnHide();
194
- }
195
- }
196
- /**
197
- * Subscribes to the tooltips onHide event emitter and reacts if the user dismisses the tooltip
198
- */
199
- async subscribeToTooltipOnHide() {
200
- let tooltipSubscription = this.tooltip?.onHide.pipe(takeUntil(this.destroyed)).subscribe(async () => {
201
- tooltipSubscription?.unsubscribe();
202
- this.writeCompletionKeyForAllTours();
203
- // If this is dismissed during an auto start tour then handle the exit step
204
- // Check that the done button is shown as well, if the done is shown then we're in the exit step
205
- // and dismissing should just end the tour
206
- if (this.isAutoStart && !this.showDoneButton) {
207
- // Advance to the last tour if there are multiple for its exit step
208
- this.currentTourIndex = this.tours.length - 1;
209
- await this.handleExitStep();
210
- }
211
- else {
212
- await this.endTour();
213
- }
214
- });
215
- }
216
- /**
217
- * Loops through the current tour steps starting after the current step index. It will try to find a visible
218
- * selector and if so return the index.
219
- * @returns
220
- */
221
- getNextAvailableStepIndex() {
222
- let nextStepIndex = -1;
223
- // Look through the steps starting with the current index and find the next that is avaiable
224
- // for the user.
225
- for (let i = this.currentStepIndex + 1; i < this.currentTour.steps.length; i++) {
226
- if (this.currentTour?.steps[i].anchor && this.stepElementFound(this.currentTour.steps[i].anchor)) {
227
- return i;
228
- }
229
- }
230
- return nextStepIndex;
231
- }
232
- /**
233
- * Try to find the tour step element to know if it is visible for the user. Check for the clickBefore first if defined
234
- * @param anchor
235
- * @returns
236
- */
237
- stepElementFound(anchor) {
238
- if (anchor.clickBefore) {
239
- return this.document.querySelector(anchor.clickBefore) !== null;
240
- }
241
- else {
242
- return this.document.querySelector(anchor.selector) !== null;
243
- }
244
- }
245
- /**
246
- * Some tour steps may have a click after defined. If so call the click method on the html element
247
- */
248
- handleClickAfter() {
249
- let selector = this.currentTourStep?.anchor?.clickAfter;
250
- if (selector) {
251
- this.clickElementIfFound(selector);
252
- }
253
- }
254
- /**
255
- * Some tour steps may have a click before defined. If so call the click method on the html element
256
- */
257
- handleClickBefore() {
258
- if (this.currentTourStep?.anchor?.clickBefore) {
259
- this.clickElementIfFound(this.currentTourStep.anchor?.clickBefore);
260
- }
261
- }
262
- /**
263
- * Checks for an exit step on the current tour and if found displays the step
264
- */
265
- async handleExitStep() {
266
- if (this.currentTour?.exitStep) {
267
- this.removeTooltip();
268
- this.showDoneButton = true;
269
- this.currentTourStep = this.currentTour?.exitStep;
270
- await this.waitForTimeout(this.handleClickBefore.bind(this));
271
- await this.waitForTimeout(this.showStepTooltip.bind(this));
272
- }
273
- }
274
- /**
275
- * Try to find the element with the selector provided and if so click it. This is how tour steps will open/close menus to
276
- * give a tour to the user
277
- * @param selector
278
- */
279
- clickElementIfFound(selector) {
280
- if (selector !== undefined) {
281
- const element = this.document.querySelector(selector);
282
- if (element) {
283
- element.click();
284
- }
285
- }
286
- }
287
- /**
288
- * When auto starting tours we will want to remove any that have the local storage key written as completed so
289
- * they are not presented to the user again.
290
- * @param tours
291
- * @returns
292
- */
293
- removeCompletedTours(tours) {
294
- return tours.filter(tour => {
295
- let cacheValue = this.cacheService.getItem(this.makeCacheKey(tour));
296
- if (cacheValue) {
297
- return !cacheValue.completed;
298
- }
299
- else {
300
- return true;
301
- }
302
- });
303
- }
304
- /**
305
- * Writes a key to local storage so the tour will not be shown again automatically
306
- */
307
- writeCompletionKey(tour) {
308
- if (tour) {
309
- this.cacheService.setItem(this.makeCacheKey(tour), { completed: true });
310
- }
311
- }
312
- /**
313
- * When dismissing a tour or one being dismissed via a navigation event, etc we will want to mark
314
- * every tour in the array as completed so it doesn't resurface unless the user requests the tour.
315
- * This function will loop over all and write the local storage key
316
- */
317
- writeCompletionKeyForAllTours() {
318
- this.tours.forEach(tour => {
319
- this.writeCompletionKey(tour);
320
- });
321
- }
322
- /**
323
- * Cache key used to set/get the completion status of a tour
324
- * @param tour
325
- * @returns
326
- */
327
- makeCacheKey(tour) {
328
- return this.tourService.getCacheKey(tour);
329
- }
330
- /**
331
- * Removes a tooltip from the view, used when switching tour steps and closing a tour
332
- */
333
- removeTooltip() {
334
- this.tooltip?.overlayRef?.dispose();
335
- }
336
- /**
337
- * Returns the tour based on the current index
338
- */
339
- get currentTour() {
340
- if (this.currentTourIndex > -1 && this.currentTourIndex < this.tours.length) {
341
- return this.tours[this.currentTourIndex];
342
- }
343
- else {
344
- return undefined;
345
- }
346
- }
347
- /**
348
- * The click before/after and show tooltip functions need to be wrapped in setTimeout for the UI
349
- * to operate correctly but setTimeout is an action we cannot await so we're wrapping it in a promise to return
350
- * so the function calls can await the action
351
- * @param fn
352
- * @returns
353
- */
354
- waitForTimeout(fn) {
355
- return new Promise(resolve => {
356
- setTimeout(() => {
357
- fn();
358
- resolve();
359
- });
360
- });
361
- }
362
- /**
363
- * Find the "next" or "done" button and focus on it.
364
- *
365
- * They are mutually exclusive, so if we cannot find the next button
366
- * we look for the done button.
367
- */
368
- focusOnNextOrDoneButton() {
369
- if (!this.focusOnElement(`#${this.currentTourStep.id}_nextButton`)) {
370
- this.focusOnElement(`#${this.currentTourStep.id}_doneButton`);
371
- }
372
- }
373
- /**
374
- * Find an element with given selector and focus on it.
375
- * Return false if element not found.
376
- */
377
- focusOnElement(selector) {
378
- const element = this.document.querySelector(selector);
379
- if (element) {
380
- element.focus();
381
- return true;
382
- }
383
- return false;
384
- }
385
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TourComponent, deps: [{ token: i1.TourService }, { token: i2.TooltipService }, { token: i3.TelemetryService }, { token: i4.CacheService }, { token: i5.DialogService }, { token: i6.TranslateService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
386
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TourComponent, selector: "ec-tour", viewQueries: [{ propertyName: "custom", first: true, predicate: ["tourTooltip"], descendants: true }], ngImport: i0, template: "<ng-template #tourTooltip>\r\n <div *ngIf=\"currentTourStep?.media\"\r\n class=\"mb-3\">\r\n <img id=\"{{currentTourStep?.id + '_media'}}\"\r\n style=\"max-width: 100%;\"\r\n src=\"{{currentTourStep?.media}}\">\r\n </div>\r\n <div class=\"font-color-primary-light px-3 mb-3\"\r\n [innerHtml]=\"currentTourStep?.text | translate\">\r\n </div>\r\n <a *ngIf=\"currentTourStep?.helpLink\" id=\"{{currentTourStep?.id + '_helpLink'}}\" class=\"d-block mb-3 px-3\" target=\"_blank\" href=\"{{currentTourStep?.helpLink}}\" translate>LearnMore_SC</a>\r\n <footer class=\"px-3 mt-3 d-flex\">\r\n <button id=\"{{currentTourStep?.id + '_nextButton'}}\" *ngIf=\"!showDoneButton\" class=\"ml-auto tourAction\" ecLinkButton (click)=\"showNextStep()\" translate>Next_TC</button>\r\n <button id=\"{{currentTourStep?.id + '_doneButton'}}\" *ngIf=\"showDoneButton\" class=\"ml-auto tourAction\" ecLinkButton (click)=\"done()\" translate>Done_TC</button>\r\n </footer>\r\n</ng-template>", styles: [".tourAction{color:var(--ec-tour-action-color, var(--ec-color-brand-green))!important}\n"], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i8.LinkButtonComponent, selector: "button[ecLinkButton]" }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] }); }
387
- }
388
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TourComponent, decorators: [{
389
- type: Component,
390
- args: [{ selector: 'ec-tour', template: "<ng-template #tourTooltip>\r\n <div *ngIf=\"currentTourStep?.media\"\r\n class=\"mb-3\">\r\n <img id=\"{{currentTourStep?.id + '_media'}}\"\r\n style=\"max-width: 100%;\"\r\n src=\"{{currentTourStep?.media}}\">\r\n </div>\r\n <div class=\"font-color-primary-light px-3 mb-3\"\r\n [innerHtml]=\"currentTourStep?.text | translate\">\r\n </div>\r\n <a *ngIf=\"currentTourStep?.helpLink\" id=\"{{currentTourStep?.id + '_helpLink'}}\" class=\"d-block mb-3 px-3\" target=\"_blank\" href=\"{{currentTourStep?.helpLink}}\" translate>LearnMore_SC</a>\r\n <footer class=\"px-3 mt-3 d-flex\">\r\n <button id=\"{{currentTourStep?.id + '_nextButton'}}\" *ngIf=\"!showDoneButton\" class=\"ml-auto tourAction\" ecLinkButton (click)=\"showNextStep()\" translate>Next_TC</button>\r\n <button id=\"{{currentTourStep?.id + '_doneButton'}}\" *ngIf=\"showDoneButton\" class=\"ml-auto tourAction\" ecLinkButton (click)=\"done()\" translate>Done_TC</button>\r\n </footer>\r\n</ng-template>", styles: [".tourAction{color:var(--ec-tour-action-color, var(--ec-color-brand-green))!important}\n"] }]
391
- }], ctorParameters: () => [{ type: i1.TourService }, { type: i2.TooltipService }, { type: i3.TelemetryService }, { type: i4.CacheService }, { type: i5.DialogService }, { type: i6.TranslateService }, { type: Document, decorators: [{
392
- type: Inject,
393
- args: [DOCUMENT]
394
- }] }], propDecorators: { custom: [{
395
- type: ViewChild,
396
- args: ['tourTooltip']
397
- }] } });
398
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG91ci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvZGlzcGxheS90b3VyL3RvdXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvdG91ci90b3VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBdUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxGLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQWUzQyxNQUFNLE9BQU8sYUFBYTtJQTRCeEIsWUFDVSxXQUF3QixFQUN4QixjQUE4QixFQUM5QixnQkFBa0MsRUFDbEMsWUFBMEIsRUFDMUIsYUFBNEIsRUFDNUIsZ0JBQWtDLEVBQ2hCLFFBQWtCO1FBTnBDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDaEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQTdCOUM7O1dBRUc7UUFDSSxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUt2QyxxRUFBcUU7UUFDN0QsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUUzQiw0SEFBNEg7UUFDcEgscUJBQWdCLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDOUIs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QUFnQixDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxjQUFjLENBQUMsUUFBZ0I7UUFDckMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNYLE9BQXVCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOytHQWpiVSxhQUFhLG9NQW1DZCxRQUFRO21HQW5DUCxhQUFhLHNKQ25CMUIsMGhDQWVjOzs0RkRJRCxhQUFhO2tCQUx6QixTQUFTOytCQUNFLFNBQVM7OzBCQXVDaEIsTUFBTTsyQkFBQyxRQUFRO3lDQVRlLE1BQU07c0JBQXRDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9jYWNoZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVGVsZW1ldHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvdGVsZW1ldHJ5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vZGlhbG9nL2RpYWxvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCwgVG9vbHRpcE9wdGlvbnMgfSBmcm9tICcuLy4uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUb29sdGlwU2VydmljZSB9IGZyb20gJy4vLi4vdG9vbHRpcC90b29sdGlwLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb3VyLCBUb3VyQW5jaG9yLCBUb3VyQ2FjaGVFbnRyeSwgVG91ckV2ZW50LCBUb3VyU3RlcCB9IGZyb20gJy4vdG91ci10eXBlcyc7XHJcbmltcG9ydCB7IFRvdXJTZXJ2aWNlIH0gZnJvbSAnLi90b3VyLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdlYy10b3VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdG91ci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdG91ci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUb3VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAvKiogQ3VycmVudCB0b3VyIHN0ZXAgYmVpbmcgc2hvd24gdG8gdGhlIHVzZXIuIFRoZSBjdXN0b20gY29udGVudCBpbiB0aGUgdGVtcGxhdGUgaXMgYm91bmQgdG8gcHJvcGVydGllcyBvbiB0aGlzIGFuZCB0aGVyZWZvciBuZWVkcyB0byBiZVxyXG4gICogIGl0cyBvd24gcHJvcGVydHkuIFRoZSBleGl0U3RlcCBpcyBhIHRvdXIgc3RlcCBhbmQgdGhpcyB3aWxsIGhvbGQgdGhhdCBzdGVwIGF0IHRoZSBlbmQgb2YgdGhlIHRvdXIuXHJcbiAgKi9cclxuICBwdWJsaWMgY3VycmVudFRvdXJTdGVwPzogVG91clN0ZXA7XHJcblxyXG4gIC8qKiBVc2VkIHRvIHRlbGwgdGhlIFVJIHRoYXQgdGhlIHN0ZXAgYmVpbmcgc2hvd24gaXMgYW4gZXhpdCBzdGVwLiBUaGlzIHdpbGwgY2hhbmdlIHRoZVxyXG4gICAqICBsaW5rIHRleHQgYW5kIHRoZSBhY3Rpb24gd2hlbiBjbGlja2VkXHJcbiAgICovXHJcbiAgcHVibGljIHNob3dEb25lQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHRvb2x0aXAgdXNlZCBmb3IgdGhlIHRvdXIgc3RlcHMgKi9cclxuICBwdWJsaWMgdG9vbHRpcD86IFRvb2x0aXBDb21wb25lbnQ7XHJcblxyXG4gIC8qKiBBcnJheSBvZiB0b3VycyBwcm92aWRlZCB3aGVuIHRoZSBzdGFydCB0b3VyIGV2ZW50IHdhcyBkZXRlY3RlZCAqL1xyXG4gIHByaXZhdGUgdG91cnM6IFRvdXJbXSA9IFtdO1xyXG5cclxuICAvLyBDb3VwbGUgaW5kZXhlcyBmb3IgdGhlIGN1cnJlbnQgdG91ci9zdGVwIHN0b3JlZCBmb3IgZWFzaWVyIHJlZmVyZW5jZSB3aGVuIGtub3dpbmcgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0ZXBzL3RvdXJzXHJcbiAgcHJpdmF0ZSBjdXJyZW50U3RlcEluZGV4OiBudW1iZXIgPSAtMTtcclxuICBwcml2YXRlIGN1cnJlbnRUb3VySW5kZXg6IG51bWJlciA9IC0xO1xyXG5cclxuICAvKiogVXNlZCB0byBrbm93IGlmIHRoZSByZXN0b3JlIHN0ZXAgc2hvdWxkIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSB0b3VyIGlzIGRpc21pc3NlZCAqL1xyXG4gIHByaXZhdGUgaXNBdXRvU3RhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBAVmlld0NoaWxkKCd0b3VyVG9vbHRpcCcpIHB1YmxpYyBjdXN0b20hOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdG91clNlcnZpY2U6IFRvdXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b29sdGlwU2VydmljZTogVG9vbHRpcFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRlbGVtZXRyeVNlcnZpY2U6IFRlbGVtZXRyeVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRvdXJTZXJ2aWNlLmV2ZW50cy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZShhc3luYyBldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudC50b3VyQWN0aW9uID09PSAnc3RhcnQnKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXR1cFRvdXJDb21wb25lbnQoZXZlbnQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LnRvdXJBY3Rpb24gPT09ICdlbmQnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFRvdXIpIHtcclxuICAgICAgICAgIHRoaXMud3JpdGVDb21wbGV0aW9uS2V5Rm9yQWxsVG91cnMoKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZW5kVG91cigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChldmVudC50b3VyQWN0aW9uID09PSAnYXBwZW5kJykge1xyXG4gICAgICAgIGxldCB2aXNpYmxlVG91cnM6IFRvdXJbXSA9IGV2ZW50LnRvdXJzO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIElmIHRoaXMgd2FzIHRyaWdnZXJlZCB2aWEgYXV0byBzdGFydCB0aGVuIHdlIG5lZWQgdG8gcmVtb3ZlIGFueSB0b3VycyB0aGF0IGhhdmUgYmVlbiBjb21wbGV0ZWRcclxuICAgICAgICBpZiAoZXZlbnQuaXNBdXRvU3RhcnQpIHtcclxuICAgICAgICAgIHZpc2libGVUb3VycyA9IHRoaXMucmVtb3ZlQ29tcGxldGVkVG91cnModmlzaWJsZVRvdXJzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSBjdXJyZW50IHRvdXIsIHRoZW4gd2UgbmVlZCB0byBhcHBlbmQgdGhlIG5ldyB0b3VycyB0byB0aGUgY3VycmVudCB0b3VyXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFRvdXIpIHtcclxuICAgICAgICAgIHRoaXMudG91cnMgPSB0aGlzLnRvdXJzLmNvbmNhdCh2aXNpYmxlVG91cnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBUaGVyZSBpcyBub3QgYSBjdXJyZW50IHRvdXIsIHNvIHRyZWF0IHRoaXMgYXMgYSBzdGFydCBldmVudFxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXR1cFRvdXJDb21wb25lbnQoZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveWVkLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiBhIHJlc3RvcmUgc3RlcCBoYXMgYmVlbiBjb21wbGV0ZWRcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZG9uZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMud3JpdGVDb21wbGV0aW9uS2V5KHRoaXMuY3VycmVudFRvdXIpO1xyXG4gICAgYXdhaXQgdGhpcy5lbmRUb3VyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiBhIHRvdXIgYmVnaW5zIGFuZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBuZXh0IG9uIHRoZSBjdXJyZW50IHRvdXIgc3RlcC4gSXQgd2lsbCBoYW5kbGUgYW55IGFmdGVyIGNsaWNrIGFjdGlvbnMgYW5kIHRoZW5cclxuICAgKiBmaW5kIHRoZSBuZXh0IHN0ZXAgYW5kIHByZXNlbnQgaXQgdG8gdGhlIHVzZXIgYW5kIHRyYW5zaXRpb24gdG8gYSByZXN0b3JlIHN0ZXAgb3IgbmV3IHRvdXIgaWYgbmVlZGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBzaG93TmV4dFN0ZXAoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBCZWZvcmUgbW92aW5nIHRvIHRoZSBuZXh0IHN0ZXAsIG1ha2Ugc3VyZSB0aGUgY3VycmVudCBzdGVwIGRvZXMgbm90IGhhdmUgYSBjbGljayBhZnRlciBkZWZpbmVkLiBUaGlzIGNvdWxkIGJlIGhpZGluZyBhIG1lbnVcclxuICAgIC8vIHRoYXQgd2FzIG9wZW5lZCBmb3IgdGhlIHNvb24gdG8gYmUgcHJldmlvdXMgc3RlcC5cclxuICAgIGF3YWl0IHRoaXMud2FpdEZvclRpbWVvdXQodGhpcy5oYW5kbGVDbGlja0FmdGVyLmJpbmQodGhpcykpO1xyXG5cclxuICAgIC8vIFJlbW92ZSBhbnkgcHJldmlvdXMgdG9vbHRpcHNcclxuICAgIHRoaXMucmVtb3ZlVG9vbHRpcCgpO1xyXG5cclxuICAgIC8vIEdldCBvdXIgbmV4dCBzdGVwIGluZGV4IHRvIGRpc3BsYXkgdG8gdGhlIHVzZXJcclxuICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCA9IHRoaXMuZ2V0TmV4dEF2YWlsYWJsZVN0ZXBJbmRleCgpO1xyXG5cclxuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwSW5kZXggPT09IC0xKSB7XHJcbiAgICAgIC8vIE5vIG1vcmUgc3RlcHMgZm91bmQsIHdlIGVpdGhlciBuZWVkIHRvIGNoZWNrIGZvciB0aGUgZXhpdCBzdGVwIGlmIHRoaXMgaXMgdGhlIGxhc3QgdG91clxyXG4gICAgICAvLyBpbiB0aGUgdG91cnMgYXJyYXkgb3IgYWR2YW5jZSB0byB0aGUgbmV4dCB0b3VyXHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRUb3VySW5kZXggPT09IHRoaXMudG91cnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXhpdFN0ZXAoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBXcml0ZSB0aGUgY29tcGxldGlvbiBrZXkgZm9yIHRoZSBjdXJyZW50IHRvdXIgYmVmb3JlIHdlIG1vdmUgdG8gdGhlIG5leHRcclxuICAgICAgICB0aGlzLndyaXRlQ29tcGxldGlvbktleSh0aGlzLmN1cnJlbnRUb3VyKTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG91ckluZGV4Kys7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zaG93TmV4dFRvdXIoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50VG91clN0ZXAgPSB0aGlzLmN1cnJlbnRUb3VyPy5zdGVwc1t0aGlzLmN1cnJlbnRTdGVwSW5kZXhdO1xyXG5cclxuICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBvdXIgY3VycmVudCBzdGVwIGluZGV4LCB0YWtlIGNhcmUgb2YgYW55IGNsaWNrIGJlZm9yZSBlbGVtZW50cyBiZWZvcmUgc2hvd2luZyB0aGVcclxuICAgICAgLy8gdG9vbHRpcC4gVGhpcyBjb3VsZCBiZSBvcGVuaW5nIGEgbWVudSB0byBnZXQgdGhlIHRvb2x0aXAgZWxlbWVudCB2aXNpYmxlLlxyXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JUaW1lb3V0KHRoaXMuaGFuZGxlQ2xpY2tCZWZvcmUuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgICAvLyBDbGljayBiZWZvcmVzIGFyZSBkb25lLCBub3cgbGV0J3Mgc2hvdyB0aGUgdG9vbHRpcCBkZWZpbmVkIGluIHRoZSB0b3VyIHN0ZXBcclxuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yVGltZW91dCh0aGlzLnNob3dTdGVwVG9vbHRpcC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2V0dXBUb3VyQ29tcG9uZW50KGV2ZW50OiBUb3VyRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIEVuZCBhbnkgdG91cnMgdGhhdCBtYXkgaGF2ZSBiZWVuIGluIHByb2dyZXNzIGlmIHRoZSB1c2VyIGtpY2tzIG9mZiBhIG5ldyBvbmVcclxuICAgIGlmICh0aGlzLmN1cnJlbnRUb3VyKSB7XHJcbiAgICAgIHRoaXMud3JpdGVDb21wbGV0aW9uS2V5Rm9yQWxsVG91cnMoKTtcclxuICAgICAgYXdhaXQgdGhpcy5lbmRUb3VyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc0F1dG9TdGFydCA9IGV2ZW50LmlzQXV0b1N0YXJ0O1xyXG5cclxuICAgIGlmIChldmVudC5pc0F1dG9TdGFydCkge1xyXG4gICAgICB0aGlzLnRvdXJzID0gdGhpcy5yZW1vdmVDb21wbGV0ZWRUb3VycyhldmVudC50b3Vycyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRvdXJzID0gZXZlbnQudG91cnM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudG91cnMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2hvd0RvbmVCdXR0b24gPSBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMuY3VycmVudFRvdXJTdGVwID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXggPSAtMTtcclxuXHJcbiAgICAgIC8vIFByaW1lIHRoZSBpbmRleCBmb3IgdGhlIGZpcnN0IHRvdXJcclxuICAgICAgdGhpcy5jdXJyZW50VG91ckluZGV4ID0gMDtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuc2hvd05leHRUb3VyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93cyBhIHRvdXIgYW5kIGVtaXRzIGFuIGV2ZW50IHRoYXQgaXQgd2FzIHN0YXJ0ZWRcclxuICAgKiBAcGFyYW0gdG91clxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgc2hvd05leHRUb3VyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gVHJhY2sgYSB0b3VyIHN0YXJ0ZWQgZXZlbnQgaWYgdGhlIGNvbnN1bWVyIG9mIHRoZSBsaWJyYXJ5IGhhcyB0ZWxlbWV0cnkgY29uZmlndXJlZFxyXG4gICAgdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLnRyYWNrRXZlbnQoJ1RvdXJTdGFydGVkJywgeyB0b3VySWQ6IHRoaXMuY3VycmVudFRvdXIhLmlkIH0pO1xyXG5cclxuICAgIGxldCBjb250aW51ZVRvdXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLmlzQXV0b1N0YXJ0ICYmIHRoaXMuY3VycmVudFRvdXJJbmRleCA9PT0gMCAmJiB0aGlzLmN1cnJlbnRUb3VyPy5pbnRyb0RpYWxvZykge1xyXG4gICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgbGFzdFZhbHVlRnJvbSh0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbkRpYWxvZyh0aGlzLmN1cnJlbnRUb3VyLmludHJvRGlhbG9nLmNvbnRlbnQhLCB0aGlzLmN1cnJlbnRUb3VyLmludHJvRGlhbG9nLnNpemUgPz8gJ3NtYWxsJywgdGhpcy5jdXJyZW50VG91ci5pbnRyb0RpYWxvZy5jb250ZXh0ID8/IHVuZGVmaW5lZCwgdGhpcy5jdXJyZW50VG91ci5pbnRyb0RpYWxvZy5vcHRpb25zID8/IHVuZGVmaW5lZCkpO1xyXG4gICAgICBpZiAoIXJlc3VsdC5zYXZlKSB7XHJcbiAgICAgICAgY29udGludWVUb3VyID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMud3JpdGVDb21wbGV0aW9uS2V5Rm9yQWxsVG91cnMoKTtcclxuICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBsYXN0IHRvdXIgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGZvciBpdHMgZXhpdCBzdGVwXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG91ckluZGV4ID0gdGhpcy50b3Vycy5sZW5ndGggLSAxO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRXhpdFN0ZXAoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb250aW51ZVRvdXIpIHtcclxuICAgICAgdGhpcy5zaG93TmV4dFN0ZXAoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZW5kVG91cigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIEhhbmRsZSBhbnkgY2xpY2sgYWZ0ZXJzIGZvciB0aGUgYWN0aXZlIHN0ZXAgc2hvd24gYmVmb3JlIHNodXR0aW5nIGl0IGRvd25cclxuICAgIGF3YWl0IHRoaXMud2FpdEZvclRpbWVvdXQodGhpcy5oYW5kbGVDbGlja0FmdGVyLmJpbmQodGhpcykpO1xyXG5cclxuICAgIHRoaXMuY3VycmVudFRvdXJTdGVwID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50b3VycyA9IFtdO1xyXG5cclxuICAgIHRoaXMucmVtb3ZlVG9vbHRpcCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlzcGxheXMgYSB0b29sdGlwIGZvciB0aGUgY3VycmVudCB0b3VyIHN0ZXBcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIHNob3dTdGVwVG9vbHRpcCgpIHtcclxuICAgIC8vIFRyYWNrIGFuIGV2ZW50IGlmIHRoZSBjb25zdW1lciBvZiB0aGUgbGlicmFyeSBoYXMgdGVsZW1ldHJ5IGNvbmZpZ3VyZWRcclxuICAgIHRoaXMudGVsZW1ldHJ5U2VydmljZS50cmFja0V2ZW50KCdUb3VyU3RlcENoYW5nZScsIHsgdG91cklkOiB0aGlzLmN1cnJlbnRUb3VyIS5pZCwgdG91clN0ZXBJZDogdGhpcy5jdXJyZW50VG91clN0ZXAhLmlkIH0pO1xyXG5cclxuICAgIGNvbnN0IHRvb2x0aXBFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY3VycmVudFRvdXJTdGVwIS5hbmNob3IhLnNlbGVjdG9yKTtcclxuXHJcbiAgICBpZiAodG9vbHRpcEVsZW1lbnQpIHtcclxuICAgICAgLy8gRGVmYXVsdCB3aWR0aCBpZiBub25lIHByb3ZpZGVkXHJcbiAgICAgIGxldCBzdGVwV2lkdGg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDQzMjtcclxuXHJcbiAgICAgIC8vIENoZWNrIHRoZSBjdXJyZW50IHRvdXIgc3RlcCB3aWR0aCBhbmQgZGVjaWRlIGlmIGl0IG5lZWRzIHRvIGNoYW5nZSBmcm9tIHRoZSBkZWZhdWx0IHZhbHVlXHJcbiAgICAgIC8vIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHN0ZXAgZGVmaW5lZCBpdCBvciBub3RcclxuICAgICAgaWYgKHRoaXMuY3VycmVudFRvdXJTdGVwPy53aWR0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmN1cnJlbnRUb3VyU3RlcC53aWR0aCA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIHN0ZXBXaWR0aCA9IHRoaXMuY3VycmVudFRvdXJTdGVwLndpZHRoO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VG91clN0ZXAud2lkdGggPT09ICdhdXRvJykge1xyXG4gICAgICAgICAgc3RlcFdpZHRoID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgb3B0aW9uczogVG9vbHRpcE9wdGlvbnMgPSB7XHJcbiAgICAgICAgaWQ6IGAke3RoaXMuY3VycmVudFRvdXI/LmlkfV8ke3RoaXMuY3VycmVudFRvdXJTdGVwIS5pZH1gLFxyXG4gICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuY3VycmVudFRvdXJTdGVwIS50ZXh0KSxcclxuICAgICAgICB0aXRsZTogdGhpcy5jdXJyZW50VG91clN0ZXAhLnRpdGxlID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5jdXJyZW50VG91clN0ZXAhLnRpdGxlKSA6IHVuZGVmaW5lZCxcclxuICAgICAgICBjdXN0b21Db250ZW50OiB0aGlzLmN1c3RvbSxcclxuICAgICAgICBkaXNtaXNzaWJsZTogdHJ1ZSxcclxuICAgICAgICBtYXhXaWR0aDogdGhpcy5jdXJyZW50VG91clN0ZXA/Lm1heFdpZHRoLFxyXG4gICAgICAgIHdpZHRoOiBzdGVwV2lkdGgsXHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tZWMtYmFja2dyb3VuZC1jb2xvci10b3VyKScsXHJcbiAgICAgICAgdGl0bGVDb2xvcjogJ3ZhcigtLWVjLWNvbG9yLXRvdXItdGl0bGUpJ1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy50b29sdGlwID0gdGhpcy50b29sdGlwU2VydmljZS5zaG93KHRvb2x0aXBFbGVtZW50IGFzIEhUTUxFbGVtZW50LCB0aGlzLmN1cnJlbnRUb3VyU3RlcCEuYW5jaG9yPy5wb3NpdGlvbiwgb3B0aW9ucyk7XHJcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvclRpbWVvdXQodGhpcy5mb2N1c09uTmV4dE9yRG9uZUJ1dHRvbi5iaW5kKHRoaXMpKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVUb1Rvb2x0aXBPbkhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIHRvb2x0aXBzIG9uSGlkZSBldmVudCBlbWl0dGVyIGFuZCByZWFjdHMgaWYgdGhlIHVzZXIgZGlzbWlzc2VzIHRoZSB0b29sdGlwXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBzdWJzY3JpYmVUb1Rvb2x0aXBPbkhpZGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdG9vbHRpcFN1YnNjcmlwdGlvbiA9IHRoaXMudG9vbHRpcD8ub25IaWRlLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZClcclxuICAgICkuc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcclxuICAgICAgdG9vbHRpcFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgIHRoaXMud3JpdGVDb21wbGV0aW9uS2V5Rm9yQWxsVG91cnMoKTtcclxuICAgICAgLy8gSWYgdGhpcyBpcyBkaXNtaXNzZWQgZHVyaW5nIGFuIGF1dG8gc3RhcnQgdG91ciB0aGVuIGhhbmRsZSB0aGUgZXhpdCBzdGVwXHJcbiAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGRvbmUgYnV0dG9uIGlzIHNob3duIGFzIHdlbGwsIGlmIHRoZSBkb25lIGlzIHNob3duIHRoZW4gd2UncmUgaW4gdGhlIGV4aXQgc3RlcFxyXG4gICAgICAvLyBhbmQgZGlzbWlzc2luZyBzaG91bGQganVzdCBlbmQgdGhlIHRvdXJcclxuICAgICAgaWYgKHRoaXMuaXNBdXRvU3RhcnQgJiYgIXRoaXMuc2hvd0RvbmVCdXR0b24pIHtcclxuICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBsYXN0IHRvdXIgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGZvciBpdHMgZXhpdCBzdGVwXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG91ckluZGV4ID0gdGhpcy50b3Vycy5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUV4aXRTdGVwKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbmRUb3VyKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9vcHMgdGhyb3VnaCB0aGUgY3VycmVudCB0b3VyIHN0ZXBzIHN0YXJ0aW5nIGFmdGVyIHRoZSBjdXJyZW50IHN0ZXAgaW5kZXguIEl0IHdpbGwgdHJ5IHRvIGZpbmQgYSB2aXNpYmxlXHJcbiAgICogc2VsZWN0b3IgYW5kIGlmIHNvIHJldHVybiB0aGUgaW5kZXguXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwcml2YXRlIGdldE5leHRBdmFpbGFibGVTdGVwSW5kZXgoKTogbnVtYmVyIHtcclxuICAgIGxldCBuZXh0U3RlcEluZGV4OiBudW1iZXIgPSAtMTtcclxuXHJcbiAgICAvLyBMb29rIHRocm91Z2ggdGhlIHN0ZXBzIHN0YXJ0aW5nIHdpdGggdGhlIGN1cnJlbnQgaW5kZXggYW5kIGZpbmQgdGhlIG5leHQgdGhhdCBpcyBhdmFpYWJsZVxyXG4gICAgLy8gZm9yIHRoZSB1c2VyLlxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gdGhpcy5jdXJyZW50U3RlcEluZGV4ICsgMTsgaSA8IHRoaXMuY3VycmVudFRvdXIhLnN0ZXBzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRUb3VyPy5zdGVwc1tpXS5hbmNob3IgJiYgdGhpcy5zdGVwRWxlbWVudEZvdW5kKHRoaXMuY3VycmVudFRvdXIhLnN0ZXBzW2ldLmFuY2hvciEpKSB7XHJcbiAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV4dFN0ZXBJbmRleDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyeSB0byBmaW5kIHRoZSB0b3VyIHN0ZXAgZWxlbWVudCB0byBrbm93IGlmIGl0IGlzIHZpc2libGUgZm9yIHRoZSB1c2VyLiBDaGVjayBmb3IgdGhlIGNsaWNrQmVmb3JlIGZpcnN0IGlmIGRlZmluZWRcclxuICAgKiBAcGFyYW0gYW5jaG9yXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwcml2YXRlIHN0ZXBFbGVtZW50Rm91bmQoYW5jaG9yOiBUb3VyQW5jaG9yKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYW5jaG9yLmNsaWNrQmVmb3JlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYW5jaG9yLmNsaWNrQmVmb3JlKSAhPT0gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYW5jaG9yLnNlbGVjdG9yKSAhPT0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvbWUgdG91ciBzdGVwcyBtYXkgaGF2ZSBhIGNsaWNrIGFmdGVyIGRlZmluZWQuIElmIHNvIGNhbGwgdGhlIGNsaWNrIG1ldGhvZCBvbiB0aGUgaHRtbCBlbGVtZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVDbGlja0FmdGVyKCk6IHZvaWQge1xyXG4gICAgbGV0IHNlbGVjdG9yID0gdGhpcy5jdXJyZW50VG91clN0ZXA/LmFuY2hvcj8uY2xpY2tBZnRlcjtcclxuICAgIGlmIChzZWxlY3Rvcikge1xyXG4gICAgICB0aGlzLmNsaWNrRWxlbWVudElmRm91bmQoc2VsZWN0b3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29tZSB0b3VyIHN0ZXBzIG1heSBoYXZlIGEgY2xpY2sgYmVmb3JlIGRlZmluZWQuIElmIHNvIGNhbGwgdGhlIGNsaWNrIG1ldGhvZCBvbiB0aGUgaHRtbCBlbGVtZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVDbGlja0JlZm9yZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRUb3VyU3RlcD8uYW5jaG9yPy5jbGlja0JlZm9yZSkge1xyXG4gICAgICB0aGlzLmNsaWNrRWxlbWVudElmRm91bmQodGhpcy5jdXJyZW50VG91clN0ZXAuYW5jaG9yPy5jbGlja0JlZm9yZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIENoZWNrcyBmb3IgYW4gZXhpdCBzdGVwIG9uIHRoZSBjdXJyZW50IHRvdXIgYW5kIGlmIGZvdW5kIGRpc3BsYXlzIHRoZSBzdGVwXHJcbiAgKi9cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUV4aXRTdGVwKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFRvdXI/LmV4aXRTdGVwKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlVG9vbHRpcCgpO1xyXG5cclxuICAgICAgdGhpcy5zaG93RG9uZUJ1dHRvbiA9IHRydWU7XHJcbiAgICAgIHRoaXMuY3VycmVudFRvdXJTdGVwID0gdGhpcy5jdXJyZW50VG91cj8uZXhpdFN0ZXA7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JUaW1lb3V0KHRoaXMuaGFuZGxlQ2xpY2tCZWZvcmUuYmluZCh0aGlzKSk7XHJcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvclRpbWVvdXQodGhpcy5zaG93U3RlcFRvb2x0aXAuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcnkgdG8gZmluZCB0aGUgZWxlbWVudCB3aXRoIHRoZSBzZWxlY3RvciBwcm92aWRlZCBhbmQgaWYgc28gY2xpY2sgaXQuIFRoaXMgaXMgaG93IHRvdXIgc3RlcHMgd2lsbCBvcGVuL2Nsb3NlIG1lbnVzIHRvXHJcbiAgICogZ2l2ZSBhIHRvdXIgdG8gdGhlIHVzZXJcclxuICAgKiBAcGFyYW0gc2VsZWN0b3JcclxuICAgKi9cclxuICBwcml2YXRlIGNsaWNrRWxlbWVudElmRm91bmQoc2VsZWN0b3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgaWYgKHNlbGVjdG9yICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsaWNrKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gYXV0byBzdGFydGluZyB0b3VycyB3ZSB3aWxsIHdhbnQgdG8gcmVtb3ZlIGFueSB0aGF0IGhhdmUgdGhlIGxvY2FsIHN0b3JhZ2Uga2V5IHdyaXR0ZW4gYXMgY29tcGxldGVkIHNvXHJcbiAgICogdGhleSBhcmUgbm90IHByZXNlbnRlZCB0byB0aGUgdXNlciBhZ2Fpbi5cclxuICAgKiBAcGFyYW0gdG91cnNcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVtb3ZlQ29tcGxldGVkVG91cnModG91cnM6IFRvdXJbXSk6IFRvdXJbXSB7XHJcbiAgICByZXR1cm4gdG91cnMuZmlsdGVyKHRvdXIgPT4ge1xyXG4gICAgICBsZXQgY2FjaGVWYWx1ZSA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldEl0ZW08VG91ckNhY2hlRW50cnk+KHRoaXMubWFrZUNhY2hlS2V5KHRvdXIpKTtcclxuICAgICAgaWYgKGNhY2hlVmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gIWNhY2hlVmFsdWUuY29tcGxldGVkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdyaXRlcyBhIGtleSB0byBsb2NhbCBzdG9yYWdlIHNvIHRoZSB0b3VyIHdpbGwgbm90IGJlIHNob3duIGFnYWluIGF1dG9tYXRpY2FsbHlcclxuICAgKi9cclxuICBwcml2YXRlIHdyaXRlQ29tcGxldGlvbktleSh0b3VyOiBUb3VyIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICBpZiAodG91cikge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5zZXRJdGVtKHRoaXMubWFrZUNhY2hlS2V5KHRvdXIpLCA8VG91ckNhY2hlRW50cnk+eyBjb21wbGV0ZWQ6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIGRpc21pc3NpbmcgYSB0b3VyIG9yIG9uZSBiZWluZyBkaXNtaXNzZWQgdmlhIGEgbmF2aWdhdGlvbiBldmVudCwgZXRjIHdlIHdpbGwgd2FudCB0byBtYXJrXHJcbiAgICogZXZlcnkgdG91ciBpbiB0aGUgYXJyYXkgYXMgY29tcGxldGVkIHNvIGl0IGRvZXNuJ3QgcmVzdXJmYWNlIHVubGVzcyB0aGUgdXNlciByZXF1ZXN0cyB0aGUgdG91ci5cclxuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbG9vcCBvdmVyIGFsbCBhbmQgd3JpdGUgdGhlIGxvY2FsIHN0b3JhZ2Uga2V5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSB3cml0ZUNvbXBsZXRpb25LZXlGb3JBbGxUb3VycygpOiB2b2lkIHtcclxuICAgIHRoaXMudG91cnMuZm9yRWFjaCh0b3VyID0+IHtcclxuICAgICAgdGhpcy53cml0ZUNvbXBsZXRpb25LZXkodG91cik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhY2hlIGtleSB1c2VkIHRvIHNldC9nZXQgdGhlIGNvbXBsZXRpb24gc3RhdHVzIG9mIGEgdG91clxyXG4gICAqIEBwYXJhbSB0b3VyXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwcml2YXRlIG1ha2VDYWNoZUtleSh0b3VyOiBUb3VyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRvdXJTZXJ2aWNlLmdldENhY2hlS2V5KHRvdXIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyBhIHRvb2x0aXAgZnJvbSB0aGUgdmlldywgdXNlZCB3aGVuIHN3aXRjaGluZyB0b3VyIHN0ZXBzIGFuZCBjbG9zaW5nIGEgdG91clxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVtb3ZlVG9vbHRpcCgpOiB2b2lkIHtcclxuICAgIHRoaXMudG9vbHRpcD8ub3ZlcmxheVJlZj8uZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdG91ciBiYXNlZCBvbiB0aGUgY3VycmVudCBpbmRleFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0IGN1cnJlbnRUb3VyKCk6IFRvdXIgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFRvdXJJbmRleCA+IC0xICYmIHRoaXMuY3VycmVudFRvdXJJbmRleCA8IHRoaXMudG91cnMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRvdXJzW3RoaXMuY3VycmVudFRvdXJJbmRleF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGNsaWNrIGJlZm9yZS9hZnRlciBhbmQgc2hvdyB0b29sdGlwIGZ1bmN0aW9ucyBuZWVkIHRvIGJlIHdyYXBwZWQgaW4gc2V0VGltZW91dCBmb3IgdGhlIFVJXHJcbiAgICogdG8gb3BlcmF0ZSBjb3JyZWN0bHkgYnV0IHNldFRpbWVvdXQgaXMgYW4gYWN0aW9uIHdlIGNhbm5vdCBhd2FpdCBzbyB3ZSdyZSB3cmFwcGluZyBpdCBpbiBhIHByb21pc2UgdG8gcmV0dXJuXHJcbiAgICogc28gdGhlIGZ1bmN0aW9uIGNhbGxzIGNhbiBhd2FpdCB0aGUgYWN0aW9uXHJcbiAgICogQHBhcmFtIGZuXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwcml2YXRlIHdhaXRGb3JUaW1lb3V0KGZuOiAoKSA9PiB2b2lkKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGZuKCk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmluZCB0aGUgXCJuZXh0XCIgb3IgXCJkb25lXCIgYnV0dG9uIGFuZCBmb2N1cyBvbiBpdC5cclxuICAgKlxyXG4gICAqIFRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgc28gaWYgd2UgY2Fubm90IGZpbmQgdGhlIG5leHQgYnV0dG9uXHJcbiAgICogd2UgbG9vayBmb3IgdGhlIGRvbmUgYnV0dG9uLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZm9jdXNPbk5leHRPckRvbmVCdXR0b24oKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZm9jdXNPbkVsZW1lbnQoYCMke3RoaXMuY3VycmVudFRvdXJTdGVwIS5pZH1fbmV4dEJ1dHRvbmApKSB7XHJcbiAgICAgIHRoaXMuZm9jdXNPbkVsZW1lbnQoYCMke3RoaXMuY3VycmVudFRvdXJTdGVwIS5pZH1fZG9uZUJ1dHRvbmApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5kIGFuIGVsZW1lbnQgd2l0aCBnaXZlbiBzZWxlY3RvciBhbmQgZm9jdXMgb24gaXQuXHJcbiAgICogUmV0dXJuIGZhbHNlIGlmIGVsZW1lbnQgbm90IGZvdW5kLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZm9jdXNPbkVsZW1lbnQoc2VsZWN0b3I6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy10ZW1wbGF0ZSAjdG91clRvb2x0aXA+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFRvdXJTdGVwPy5tZWRpYVwiXHJcbiAgICAgICAgIGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgIDxpbWcgaWQ9XCJ7e2N1cnJlbnRUb3VyU3RlcD8uaWQgKyAnX21lZGlhJ319XCJcclxuICAgICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiAxMDAlO1wiXHJcbiAgICAgICAgICAgICBzcmM9XCJ7e2N1cnJlbnRUb3VyU3RlcD8ubWVkaWF9fVwiPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm9udC1jb2xvci1wcmltYXJ5LWxpZ2h0IHB4LTMgbWItM1wiXHJcbiAgICAgICAgIFtpbm5lckh0bWxdPVwiY3VycmVudFRvdXJTdGVwPy50ZXh0IHwgdHJhbnNsYXRlXCI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxhICpuZ0lmPVwiY3VycmVudFRvdXJTdGVwPy5oZWxwTGlua1wiIGlkPVwie3tjdXJyZW50VG91clN0ZXA/LmlkICsgJ19oZWxwTGluayd9fVwiIGNsYXNzPVwiZC1ibG9jayBtYi0zIHB4LTNcIiB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwie3tjdXJyZW50VG91clN0ZXA/LmhlbHBMaW5rfX1cIiB0cmFuc2xhdGU+TGVhcm5Nb3JlX1NDPC9hPlxyXG4gICAgPGZvb3RlciBjbGFzcz1cInB4LTMgbXQtMyBkLWZsZXhcIj5cclxuICAgICAgICA8YnV0dG9uIGlkPVwie3tjdXJyZW50VG91clN0ZXA/LmlkICsgJ19uZXh0QnV0dG9uJ319XCIgKm5nSWY9XCIhc2hvd0RvbmVCdXR0b25cIiBjbGFzcz1cIm1sLWF1dG8gdG91ckFjdGlvblwiIGVjTGlua0J1dHRvbiAoY2xpY2spPVwic2hvd05leHRTdGVwKClcIiB0cmFuc2xhdGU+TmV4dF9UQzwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gaWQ9XCJ7e2N1cnJlbnRUb3VyU3RlcD8uaWQgKyAnX2RvbmVCdXR0b24nfX1cIiAqbmdJZj1cInNob3dEb25lQnV0dG9uXCIgY2xhc3M9XCJtbC1hdXRvIHRvdXJBY3Rpb25cIiBlY0xpbmtCdXR0b24gKGNsaWNrKT1cImRvbmUoKVwiIHRyYW5zbGF0ZT5Eb25lX1RDPC9idXR0b24+XHJcbiAgICA8L2Zvb3Rlcj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
@@ -1,75 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import { TourEvent } from './tour-types';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../../core/cache.service";
6
- export class TourService {
7
- constructor(cacheService) {
8
- this.cacheService = cacheService;
9
- this.events = new Subject();
10
- }
11
- /**
12
- * Start a tour of the application. Allows one or many tours to be sent in, each will
13
- * follow the next. If multiple tours have exit steps defined only the final tour will
14
- * execute the exit step.
15
- * @param tours
16
- */
17
- start(tours, isAutoStart = false) {
18
- let tourEvent = new TourEvent(tours, 'start', isAutoStart);
19
- this.events.next(tourEvent);
20
- }
21
- end() {
22
- let tourEvent = new TourEvent([], 'end');
23
- this.events.next(tourEvent);
24
- }
25
- append(tours, isAutoStart = false) {
26
- let tourEvent = new TourEvent(tours, 'append', isAutoStart);
27
- this.events.next(tourEvent);
28
- }
29
- /**
30
- * Returns a formatted cache key for tours
31
- * @param tour
32
- * @returns
33
- */
34
- getCacheKey(tour) {
35
- return `TourCompleted_${tour.id}`;
36
- }
37
- /**
38
- * Given a tour, check to see if it's been completed
39
- * @param tour
40
- * @returns
41
- */
42
- hasTourBeenViewed(tour) {
43
- let cacheValue = this.cacheService.getItem(this.getCacheKey(tour));
44
- if (cacheValue) {
45
- return cacheValue.completed;
46
- }
47
- else {
48
- // If no cache value then we never ran through it and wrote a key
49
- return false;
50
- }
51
- }
52
- /**
53
- * Given a list of tours, check to see if any will show to the user
54
- * @param tours
55
- * @returns
56
- */
57
- haveAllToursBeenViewed(tours) {
58
- let viewedCount = 0;
59
- tours.forEach(tour => {
60
- if (this.hasTourBeenViewed(tour)) {
61
- viewedCount++;
62
- }
63
- });
64
- return viewedCount === tours.length;
65
- }
66
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TourService, deps: [{ token: i1.CacheService }], target: i0.ɵɵFactoryTarget.Injectable }); }
67
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TourService, providedIn: 'root' }); }
68
- }
69
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TourService, decorators: [{
70
- type: Injectable,
71
- args: [{
72
- providedIn: 'root'
73
- }]
74
- }], ctorParameters: () => [{ type: i1.CacheService }] });
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG91ci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvdG91ci90b3VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBd0IsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7QUFLL0QsTUFBTSxPQUFPLFdBQVc7SUFJdEIsWUFDVSxZQUEwQjtRQUExQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUg3QixXQUFNLEdBQTBCLElBQUksT0FBTyxFQUFFLENBQUM7SUFJakQsQ0FBQztJQUVMOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLEtBQWEsRUFBRSxjQUF1QixLQUFLO1FBQ3RELElBQUksU0FBUyxHQUFjLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLE1BQTZCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTSxHQUFHO1FBQ1IsSUFBSSxTQUFTLEdBQWMsSUFBSSxTQUFTLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxNQUE2QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQWEsRUFBRSxjQUF1QixLQUFLO1FBQ3ZELElBQUksU0FBUyxHQUFjLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLE1BQTZCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksV0FBVyxDQUFDLElBQVU7UUFDM0IsT0FBTyxpQkFBaUIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksaUJBQWlCLENBQUMsSUFBVTtRQUNqQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBaUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25GLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDOUIsQ0FBQzthQUFNLENBQUM7WUFDTixpRUFBaUU7WUFDakUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxzQkFBc0IsQ0FBQyxLQUFhO1FBQ3pDLElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQztRQUU1QixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ25CLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sV0FBVyxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDdEMsQ0FBQzsrR0FwRVUsV0FBVzttSEFBWCxXQUFXLGNBRlYsTUFBTTs7NEZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9jYWNoZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG91ciwgVG91ckNhY2hlRW50cnksIFRvdXJFdmVudCB9IGZyb20gJy4vdG91ci10eXBlcyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUb3VyU2VydmljZSB7XHJcblxyXG4gIHB1YmxpYyBldmVudHM6IE9ic2VydmFibGU8VG91ckV2ZW50PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjYWNoZVNlcnZpY2U6IENhY2hlU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXJ0IGEgdG91ciBvZiB0aGUgYXBwbGljYXRpb24uIEFsbG93cyBvbmUgb3IgbWFueSB0b3VycyB0byBiZSBzZW50IGluLCBlYWNoIHdpbGxcclxuICAgKiBmb2xsb3cgdGhlIG5leHQuIElmIG11bHRpcGxlIHRvdXJzIGhhdmUgZXhpdCBzdGVwcyBkZWZpbmVkIG9ubHkgdGhlIGZpbmFsIHRvdXIgd2lsbFxyXG4gICAqIGV4ZWN1dGUgdGhlIGV4aXQgc3RlcC5cclxuICAgKiBAcGFyYW0gdG91cnMgXHJcbiAgICovXHJcbiAgcHVibGljIHN0YXJ0KHRvdXJzOiBUb3VyW10sIGlzQXV0b1N0YXJ0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGxldCB0b3VyRXZlbnQ6IFRvdXJFdmVudCA9IG5ldyBUb3VyRXZlbnQodG91cnMsICdzdGFydCcsIGlzQXV0b1N0YXJ0KTtcclxuICAgICh0aGlzLmV2ZW50cyBhcyBTdWJqZWN0PFRvdXJFdmVudD4pLm5leHQodG91ckV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlbmQoKTogdm9pZCB7XHJcbiAgICBsZXQgdG91ckV2ZW50OiBUb3VyRXZlbnQgPSBuZXcgVG91ckV2ZW50KFtdLCAnZW5kJyk7XHJcbiAgICAodGhpcy5ldmVudHMgYXMgU3ViamVjdDxUb3VyRXZlbnQ+KS5uZXh0KHRvdXJFdmVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwZW5kKHRvdXJzOiBUb3VyW10sIGlzQXV0b1N0YXJ0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGxldCB0b3VyRXZlbnQ6IFRvdXJFdmVudCA9IG5ldyBUb3VyRXZlbnQodG91cnMsICdhcHBlbmQnLCBpc0F1dG9TdGFydCk7XHJcbiAgICAodGhpcy5ldmVudHMgYXMgU3ViamVjdDxUb3VyRXZlbnQ+KS5uZXh0KHRvdXJFdmVudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgZm9ybWF0dGVkIGNhY2hlIGtleSBmb3IgdG91cnNcclxuICAgKiBAcGFyYW0gdG91ciBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Q2FjaGVLZXkodG91cjogVG91cik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYFRvdXJDb21wbGV0ZWRfJHt0b3VyLmlkfWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHaXZlbiBhIHRvdXIsIGNoZWNrIHRvIHNlZSBpZiBpdCdzIGJlZW4gY29tcGxldGVkXHJcbiAgICogQHBhcmFtIHRvdXIgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgcHVibGljIGhhc1RvdXJCZWVuVmlld2VkKHRvdXI6IFRvdXIpOiBib29sZWFuIHtcclxuICAgIGxldCBjYWNoZVZhbHVlID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0SXRlbTxUb3VyQ2FjaGVFbnRyeT4odGhpcy5nZXRDYWNoZUtleSh0b3VyKSk7XHJcbiAgICBpZiAoY2FjaGVWYWx1ZSkge1xyXG4gICAgICByZXR1cm4gY2FjaGVWYWx1ZS5jb21wbGV0ZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBJZiBubyBjYWNoZSB2YWx1ZSB0aGVuIHdlIG5ldmVyIHJhbiB0aHJvdWdoIGl0IGFuZCB3cm90ZSBhIGtleVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHaXZlbiBhIGxpc3Qgb2YgdG91cnMsIGNoZWNrIHRvIHNlZSBpZiBhbnkgd2lsbCBzaG93IHRvIHRoZSB1c2VyXHJcbiAgICogQHBhcmFtIHRvdXJzIFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYXZlQWxsVG91cnNCZWVuVmlld2VkKHRvdXJzOiBUb3VyW10pOiBib29sZWFuIHtcclxuICAgIGxldCB2aWV3ZWRDb3VudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICB0b3Vycy5mb3JFYWNoKHRvdXIgPT4ge1xyXG4gICAgICBpZiAodGhpcy5oYXNUb3VyQmVlblZpZXdlZCh0b3VyKSkge1xyXG4gICAgICAgIHZpZXdlZENvdW50Kys7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB2aWV3ZWRDb3VudCA9PT0gdG91cnMubGVuZ3RoO1xyXG4gIH1cclxufVxyXG4iXX0=