@koobiq/components 18.39.0 → 19.0.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 (887) hide show
  1. package/accordion/accordion-content.d.ts +2 -2
  2. package/accordion/accordion-content.directive.d.ts +11 -0
  3. package/accordion/accordion-header.d.ts +2 -2
  4. package/accordion/accordion-header.directive.d.ts +7 -0
  5. package/accordion/accordion-item.d.ts +2 -2
  6. package/accordion/accordion-item.directive.d.ts +72 -0
  7. package/accordion/accordion-root.directive.d.ts +64 -0
  8. package/accordion/accordion-trigger.component.d.ts +2 -2
  9. package/accordion/accordion-trigger.directive.d.ts +13 -0
  10. package/accordion/accordion.component.d.ts +2 -4
  11. package/accordion/accordion.module.d.ts +7 -7
  12. package/accordion/public-api.d.ts +5 -0
  13. package/alert/_alert-theme.scss +4 -16
  14. package/alert/alert-tokens.scss +6 -12
  15. package/alert/alert.component.d.ts +5 -12
  16. package/alert/alert.module.d.ts +4 -4
  17. package/app-switcher/app-switcher.d.ts +4 -4
  18. package/autocomplete/autocomplete-origin.directive.d.ts +1 -1
  19. package/autocomplete/autocomplete-trigger.directive.d.ts +1 -1
  20. package/autocomplete/autocomplete.component.d.ts +1 -1
  21. package/autocomplete/autocomplete.module.d.ts +7 -7
  22. package/badge/badge.component.d.ts +3 -3
  23. package/badge/badge.module.d.ts +4 -4
  24. package/breadcrumbs/breadcrumbs.d.ts +3 -2
  25. package/breadcrumbs/public-api.d.ts +2 -0
  26. package/breadcrumbs/roving-focus-group.directive.d.ts +50 -0
  27. package/breadcrumbs/roving-focus-item.directive.d.ts +50 -0
  28. package/breadcrumbs/utils.d.ts +19 -0
  29. package/button/button.component.d.ts +2 -2
  30. package/button/button.module.d.ts +6 -6
  31. package/button-toggle/_button-toggle-theme.scss +30 -27
  32. package/button-toggle/button-toggle.component.d.ts +2 -2
  33. package/button-toggle/button-toggle.module.d.ts +4 -4
  34. package/button-toggle/button-toggle.scss +2 -2
  35. package/checkbox/checkbox-module.d.ts +4 -4
  36. package/checkbox/checkbox-required-validator.d.ts +1 -1
  37. package/checkbox/checkbox.d.ts +1 -1
  38. package/code-block/code-block.scss +2 -2
  39. package/core/common-behaviors/index.d.ts +0 -1
  40. package/core/formatters/date/formatter.pipe.d.ts +13 -0
  41. package/core/formatters/index.d.ts +4 -4
  42. package/core/formatters/number/formatter.d.ts +3 -3
  43. package/core/forms/forms-module.d.ts +1 -1
  44. package/core/forms/forms.directive.d.ts +2 -2
  45. package/core/highlight/highlight.pipe.d.ts +1 -1
  46. package/core/highlight/index.d.ts +3 -3
  47. package/core/line/line.d.ts +1 -6
  48. package/core/option/_option-theme.scss +5 -2
  49. package/core/option/action.d.ts +1 -1
  50. package/core/option/optgroup.d.ts +1 -1
  51. package/core/option/option-module.d.ts +5 -5
  52. package/core/option/option.d.ts +4 -1
  53. package/core/pop-up/constants.d.ts +4 -0
  54. package/core/pop-up/pop-up-trigger.d.ts +5 -5
  55. package/core/pop-up/pop-up.d.ts +1 -1
  56. package/core/select/common.d.ts +1 -1
  57. package/core/selection/pseudo-checkbox/pseudo-checkbox.d.ts +1 -1
  58. package/core/selection/pseudo-checkbox/pseudo-checkbox.module.d.ts +3 -3
  59. package/core/styles/common/_select.scss +1 -1
  60. package/core/styles/theming/_scrollbar-theme.scss +18 -12
  61. package/core/utils/utils.d.ts +3 -0
  62. package/datepicker/calendar-body.component.d.ts +1 -1
  63. package/datepicker/calendar-header.component.d.ts +1 -1
  64. package/datepicker/calendar.component.d.ts +1 -1
  65. package/datepicker/datepicker-input.directive.d.ts +1 -1
  66. package/datepicker/datepicker-module.d.ts +15 -15
  67. package/datepicker/datepicker-toggle.component.d.ts +2 -2
  68. package/datepicker/datepicker.component.d.ts +2 -2
  69. package/datepicker/month-view.component.d.ts +1 -1
  70. package/divider/divider.component.d.ts +5 -1
  71. package/divider/divider.module.d.ts +3 -3
  72. package/dl/dl.component.d.ts +3 -3
  73. package/dl/dl.module.d.ts +4 -4
  74. package/dropdown/dropdown-content.directive.d.ts +1 -1
  75. package/dropdown/dropdown-item.component.d.ts +1 -1
  76. package/dropdown/dropdown-trigger.directive.d.ts +1 -1
  77. package/dropdown/dropdown.component.d.ts +1 -1
  78. package/dropdown/dropdown.module.d.ts +8 -8
  79. package/dropdown/dropdown.scss +1 -0
  80. package/ellipsis-center/ellipsis-center.directive.d.ts +2 -2
  81. package/empty-state/empty-state.component.d.ts +5 -5
  82. package/empty-state/empty-state.module.d.ts +4 -4
  83. package/fesm2022/koobiq-components-accordion.mjs +459 -40
  84. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  85. package/fesm2022/koobiq-components-actions-panel.mjs +18 -18
  86. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  87. package/fesm2022/koobiq-components-alert.mjs +28 -36
  88. package/fesm2022/koobiq-components-alert.mjs.map +1 -1
  89. package/fesm2022/koobiq-components-app-switcher.mjs +49 -52
  90. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  91. package/fesm2022/koobiq-components-autocomplete.mjs +31 -25
  92. package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
  93. package/fesm2022/koobiq-components-badge.mjs +20 -21
  94. package/fesm2022/koobiq-components-badge.mjs.map +1 -1
  95. package/fesm2022/koobiq-components-breadcrumbs.mjs +339 -36
  96. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  97. package/fesm2022/koobiq-components-button-toggle.mjs +25 -22
  98. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  99. package/fesm2022/koobiq-components-button.mjs +25 -26
  100. package/fesm2022/koobiq-components-button.mjs.map +1 -1
  101. package/fesm2022/koobiq-components-checkbox.mjs +18 -16
  102. package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
  103. package/fesm2022/koobiq-components-clamped-text.mjs +9 -9
  104. package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
  105. package/fesm2022/koobiq-components-code-block.mjs +15 -16
  106. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  107. package/fesm2022/koobiq-components-content-panel.mjs +55 -57
  108. package/fesm2022/koobiq-components-content-panel.mjs.map +1 -1
  109. package/fesm2022/koobiq-components-core.mjs +326 -356
  110. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  111. package/fesm2022/koobiq-components-datepicker.mjs +107 -90
  112. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  113. package/fesm2022/koobiq-components-divider.mjs +16 -14
  114. package/fesm2022/koobiq-components-divider.mjs.map +1 -1
  115. package/fesm2022/koobiq-components-dl.mjs +19 -20
  116. package/fesm2022/koobiq-components-dl.mjs.map +1 -1
  117. package/fesm2022/koobiq-components-dropdown.mjs +47 -48
  118. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  119. package/fesm2022/koobiq-components-dynamic-translation.mjs +16 -19
  120. package/fesm2022/koobiq-components-dynamic-translation.mjs.map +1 -1
  121. package/fesm2022/koobiq-components-ellipsis-center.mjs +10 -10
  122. package/fesm2022/koobiq-components-ellipsis-center.mjs.map +1 -1
  123. package/fesm2022/koobiq-components-empty-state.mjs +26 -27
  124. package/fesm2022/koobiq-components-empty-state.mjs.map +1 -1
  125. package/fesm2022/koobiq-components-file-upload.mjs +306 -98
  126. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  127. package/fesm2022/koobiq-components-filter-bar.mjs +220 -222
  128. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  129. package/fesm2022/koobiq-components-form-field.mjs +84 -92
  130. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  131. package/fesm2022/koobiq-components-icon.mjs +18 -18
  132. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  133. package/fesm2022/koobiq-components-inline-edit.mjs +33 -37
  134. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  135. package/fesm2022/koobiq-components-input.mjs +31 -30
  136. package/fesm2022/koobiq-components-input.mjs.map +1 -1
  137. package/fesm2022/koobiq-components-link.mjs +11 -10
  138. package/fesm2022/koobiq-components-link.mjs.map +1 -1
  139. package/fesm2022/koobiq-components-list.mjs +47 -45
  140. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  141. package/fesm2022/koobiq-components-loader-overlay.mjs +27 -28
  142. package/fesm2022/koobiq-components-loader-overlay.mjs.map +1 -1
  143. package/fesm2022/koobiq-components-markdown.mjs +14 -14
  144. package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
  145. package/fesm2022/koobiq-components-modal.mjs +76 -64
  146. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  147. package/fesm2022/koobiq-components-navbar-ic.mjs +76 -54
  148. package/fesm2022/koobiq-components-navbar-ic.mjs.map +1 -1
  149. package/fesm2022/koobiq-components-navbar.mjs +77 -66
  150. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  151. package/fesm2022/koobiq-components-notification-center.mjs +31 -32
  152. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  153. package/fesm2022/koobiq-components-overflow-items.mjs +16 -19
  154. package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
  155. package/fesm2022/koobiq-components-popover.mjs +55 -46
  156. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  157. package/fesm2022/koobiq-components-progress-bar.mjs +18 -19
  158. package/fesm2022/koobiq-components-progress-bar.mjs.map +1 -1
  159. package/fesm2022/koobiq-components-progress-spinner.mjs +21 -23
  160. package/fesm2022/koobiq-components-progress-spinner.mjs.map +1 -1
  161. package/fesm2022/koobiq-components-radio.mjs +20 -16
  162. package/fesm2022/koobiq-components-radio.mjs.map +1 -1
  163. package/fesm2022/koobiq-components-resizer.mjs +10 -12
  164. package/fesm2022/koobiq-components-resizer.mjs.map +1 -1
  165. package/fesm2022/koobiq-components-risk-level.mjs +13 -12
  166. package/fesm2022/koobiq-components-risk-level.mjs.map +1 -1
  167. package/fesm2022/koobiq-components-scrollbar.mjs +17 -18
  168. package/fesm2022/koobiq-components-scrollbar.mjs.map +1 -1
  169. package/fesm2022/koobiq-components-search-expandable.mjs +19 -19
  170. package/fesm2022/koobiq-components-search-expandable.mjs.map +1 -1
  171. package/fesm2022/koobiq-components-select.mjs +110 -73
  172. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  173. package/fesm2022/koobiq-components-sidebar.mjs +16 -23
  174. package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
  175. package/fesm2022/koobiq-components-sidepanel.mjs +61 -55
  176. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  177. package/fesm2022/koobiq-components-split-button.mjs +12 -12
  178. package/fesm2022/koobiq-components-split-button.mjs.map +1 -1
  179. package/fesm2022/koobiq-components-splitter.mjs +24 -25
  180. package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
  181. package/fesm2022/koobiq-components-table.mjs +17 -18
  182. package/fesm2022/koobiq-components-table.mjs.map +1 -1
  183. package/fesm2022/koobiq-components-tabs.mjs +85 -89
  184. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  185. package/fesm2022/koobiq-components-tags.mjs +43 -47
  186. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  187. package/fesm2022/koobiq-components-textarea.mjs +10 -11
  188. package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
  189. package/fesm2022/koobiq-components-time-range.mjs +38 -40
  190. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  191. package/fesm2022/koobiq-components-timepicker.mjs +65 -14
  192. package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
  193. package/fesm2022/koobiq-components-timezone.mjs +68 -59
  194. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  195. package/fesm2022/koobiq-components-title.mjs +9 -10
  196. package/fesm2022/koobiq-components-title.mjs.map +1 -1
  197. package/fesm2022/koobiq-components-toast.mjs +23 -24
  198. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  199. package/fesm2022/koobiq-components-toggle.mjs +16 -14
  200. package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
  201. package/fesm2022/koobiq-components-tooltip.mjs +20 -23
  202. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  203. package/fesm2022/koobiq-components-top-bar.mjs +18 -20
  204. package/fesm2022/koobiq-components-top-bar.mjs.map +1 -1
  205. package/fesm2022/koobiq-components-tree-select.mjs +81 -70
  206. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  207. package/fesm2022/koobiq-components-tree.mjs +77 -66
  208. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  209. package/fesm2022/koobiq-components-username.mjs +31 -37
  210. package/fesm2022/koobiq-components-username.mjs.map +1 -1
  211. package/file-upload/file-upload.d.ts +11 -0
  212. package/file-upload/file-upload.module.d.ts +15 -15
  213. package/file-upload/multiple-file-upload.component.d.ts +12 -9
  214. package/file-upload/{file-drop.d.ts → primitives/file-drop.d.ts} +3 -3
  215. package/file-upload/primitives/file-picker.d.ts +82 -0
  216. package/file-upload/primitives/index.d.ts +2 -0
  217. package/file-upload/public-api.d.ts +2 -1
  218. package/file-upload/single-file-upload.component.d.ts +11 -8
  219. package/icon/_icon-button-theme.scss +2 -1
  220. package/inline-edit/inline-edit.d.ts +2 -3
  221. package/input/_input-theme.scss +2 -1
  222. package/input/input-number-validators.d.ts +2 -2
  223. package/input/input-number.d.ts +1 -1
  224. package/input/input-password.d.ts +1 -1
  225. package/input/input.d.ts +2 -2
  226. package/input/input.module.d.ts +8 -8
  227. package/link/_link-theme.scss +3 -0
  228. package/link/link.component.d.ts +1 -1
  229. package/link/link.module.d.ts +3 -3
  230. package/list/_list-theme.scss +6 -0
  231. package/list/list-selection.component.d.ts +3 -3
  232. package/list/list.component.d.ts +2 -2
  233. package/list/list.module.d.ts +6 -6
  234. package/list/list.scss +1 -0
  235. package/loader-overlay/loader-overlay.component.d.ts +4 -4
  236. package/loader-overlay/loader-overlay.module.d.ts +5 -5
  237. package/modal/css-unit.pipe.d.ts +1 -1
  238. package/modal/modal.component.d.ts +1 -1
  239. package/modal/modal.directive.d.ts +4 -4
  240. package/modal/modal.module.d.ts +10 -10
  241. package/modal/modal.service.d.ts +1 -1
  242. package/navbar/_navbar-theme.scss +1 -0
  243. package/navbar/navbar-brand.component.d.ts +1 -1
  244. package/navbar/navbar-item.component.d.ts +7 -7
  245. package/navbar/navbar-toggle.component.d.ts +1 -1
  246. package/navbar/navbar-toggle.scss +1 -1
  247. package/navbar/navbar.component.d.ts +4 -4
  248. package/navbar/navbar.module.d.ts +10 -10
  249. package/navbar/vertical-navbar.component.d.ts +1 -1
  250. package/navbar/vertical-navbar.scss +5 -2
  251. package/navbar-ic/navbar-ic-header.d.ts +3 -0
  252. package/navbar-ic/navbar-ic-item.d.ts +18 -0
  253. package/navbar-ic/navbar-ic.d.ts +13 -7
  254. package/notification-center/notification-center.d.ts +5 -5
  255. package/overflow-items/overflow-items.d.ts +1 -1
  256. package/package.json +9 -140
  257. package/popover/popover-confirm.component.d.ts +2 -2
  258. package/popover/popover.component.d.ts +9 -9
  259. package/popover/popover.module.d.ts +9 -9
  260. package/prebuilt-themes/dark-theme.css +1 -1
  261. package/prebuilt-themes/light-theme.css +1 -1
  262. package/prebuilt-themes/theme.css +1 -1
  263. package/progress-bar/progress-bar.component.d.ts +3 -3
  264. package/progress-bar/progress-bar.module.d.ts +3 -3
  265. package/progress-spinner/progress-spinner.component.d.ts +3 -3
  266. package/progress-spinner/progress-spinner.module.d.ts +4 -4
  267. package/progress-spinner/progress-spinner.scss +1 -0
  268. package/radio/_radio-theme.scss +2 -1
  269. package/radio/radio-tokens.scss +1 -0
  270. package/radio/radio.component.d.ts +10 -5
  271. package/radio/radio.module.d.ts +3 -3
  272. package/risk-level/risk-level.component.d.ts +1 -1
  273. package/risk-level/risk-level.module.d.ts +4 -4
  274. package/schematics/migrations/icons-replacement/README.md +5 -1
  275. package/schematics/migrations/icons-replacement/index.js +1 -1
  276. package/schematics/ng-add/index.js +4 -5
  277. package/scrollbar/_scrollbar-component-theme.scss +16 -14
  278. package/select/select-option.directive.d.ts +1 -1
  279. package/select/select.component.d.ts +6 -5
  280. package/select/select.module.d.ts +10 -10
  281. package/sidebar/sidebar.component.d.ts +3 -3
  282. package/sidebar/sidebar.module.d.ts +3 -3
  283. package/sidepanel/sidepanel-container.component.d.ts +1 -1
  284. package/sidepanel/sidepanel-directives.d.ts +5 -5
  285. package/sidepanel/sidepanel.module.d.ts +9 -9
  286. package/splitter/splitter.component.d.ts +4 -4
  287. package/splitter/splitter.module.d.ts +3 -3
  288. package/table/_table-theme.scss +1 -0
  289. package/table/table.component.d.ts +2 -2
  290. package/table/table.module.d.ts +4 -4
  291. package/tabs/paginated-tab-header.d.ts +1 -1
  292. package/tabs/tab-body.component.d.ts +2 -2
  293. package/tabs/tab-content.directive.d.ts +1 -1
  294. package/tabs/tab-group.component.d.ts +5 -5
  295. package/tabs/tab-header.component.d.ts +1 -1
  296. package/tabs/tab-label-wrapper.directive.d.ts +1 -1
  297. package/tabs/tab-label.directive.d.ts +1 -1
  298. package/tabs/tab.component.d.ts +3 -3
  299. package/tabs/tabs.module.d.ts +15 -15
  300. package/tags/tag-input.d.ts +1 -1
  301. package/tags/tag-list.component.d.ts +1 -1
  302. package/tags/tag.component.d.ts +4 -4
  303. package/tags/tag.module.d.ts +4 -4
  304. package/textarea/textarea.component.d.ts +1 -1
  305. package/textarea/textarea.module.d.ts +4 -4
  306. package/timepicker/timepicker.directive.d.ts +15 -5
  307. package/timepicker/timepicker.module.d.ts +5 -5
  308. package/timezone/cities-by-filter.pipe.d.ts +1 -1
  309. package/timezone/timezone-option.component.d.ts +1 -1
  310. package/timezone/timezone-option.directive.d.ts +1 -1
  311. package/timezone/timezone-select.component.d.ts +2 -2
  312. package/timezone/timezone.module.d.ts +15 -15
  313. package/timezone/utc-offset.pipe.d.ts +1 -1
  314. package/title/title.directive.d.ts +1 -1
  315. package/title/title.module.d.ts +3 -3
  316. package/toggle/toggle.component.d.ts +1 -1
  317. package/toggle/toggle.module.d.ts +3 -3
  318. package/tooltip/tooltip.component.d.ts +3 -3
  319. package/top-bar/top-bar.d.ts +1 -1
  320. package/tree/node.d.ts +1 -1
  321. package/tree/outlet.d.ts +1 -1
  322. package/tree/padding.directive.d.ts +1 -1
  323. package/tree/toggle.d.ts +3 -3
  324. package/tree/tree-base.d.ts +2 -2
  325. package/tree/tree-option.component.d.ts +1 -1
  326. package/tree/tree-selection.component.d.ts +1 -1
  327. package/tree/tree.d.ts +1 -1
  328. package/tree/tree.module.d.ts +11 -11
  329. package/tree-select/tree-select.component.d.ts +2 -2
  330. package/tree-select/tree-select.module.d.ts +9 -9
  331. package/core/common-behaviors/focus-monitor.d.ts +0 -19
  332. package/esm2022/accordion/accordion-content.mjs +0 -19
  333. package/esm2022/accordion/accordion-header.mjs +0 -19
  334. package/esm2022/accordion/accordion-item.mjs +0 -25
  335. package/esm2022/accordion/accordion-trigger.component.mjs +0 -48
  336. package/esm2022/accordion/accordion.component.mjs +0 -41
  337. package/esm2022/accordion/accordion.module.mjs +0 -44
  338. package/esm2022/accordion/index.mjs +0 -2
  339. package/esm2022/accordion/koobiq-components-accordion.mjs +0 -5
  340. package/esm2022/accordion/public-api.mjs +0 -7
  341. package/esm2022/actions-panel/actions-panel-config.mjs +0 -55
  342. package/esm2022/actions-panel/actions-panel-container.mjs +0 -217
  343. package/esm2022/actions-panel/actions-panel-ref.mjs +0 -78
  344. package/esm2022/actions-panel/actions-panel.mjs +0 -133
  345. package/esm2022/actions-panel/index.mjs +0 -6
  346. package/esm2022/actions-panel/koobiq-components-actions-panel.mjs +0 -5
  347. package/esm2022/actions-panel/module.mjs +0 -21
  348. package/esm2022/alert/alert.component.mjs +0 -124
  349. package/esm2022/alert/alert.module.mjs +0 -40
  350. package/esm2022/alert/index.mjs +0 -2
  351. package/esm2022/alert/koobiq-components-alert.mjs +0 -5
  352. package/esm2022/alert/public-api.mjs +0 -3
  353. package/esm2022/app-switcher/app-switcher-animations.mjs +0 -18
  354. package/esm2022/app-switcher/app-switcher-dropdown-app.mjs +0 -75
  355. package/esm2022/app-switcher/app-switcher-dropdown-site.mjs +0 -60
  356. package/esm2022/app-switcher/app-switcher.mjs +0 -446
  357. package/esm2022/app-switcher/app-switcher.module.mjs +0 -45
  358. package/esm2022/app-switcher/index.mjs +0 -2
  359. package/esm2022/app-switcher/kbq-app-switcher-list-item.mjs +0 -84
  360. package/esm2022/app-switcher/koobiq-components-app-switcher.mjs +0 -5
  361. package/esm2022/app-switcher/public-api.mjs +0 -7
  362. package/esm2022/autocomplete/autocomplete-origin.directive.mjs +0 -21
  363. package/esm2022/autocomplete/autocomplete-trigger.directive.mjs +0 -540
  364. package/esm2022/autocomplete/autocomplete.component.mjs +0 -178
  365. package/esm2022/autocomplete/autocomplete.module.mjs +0 -38
  366. package/esm2022/autocomplete/index.mjs +0 -2
  367. package/esm2022/autocomplete/koobiq-components-autocomplete.mjs +0 -5
  368. package/esm2022/autocomplete/public-api.mjs +0 -5
  369. package/esm2022/badge/badge.component.mjs +0 -124
  370. package/esm2022/badge/badge.module.mjs +0 -36
  371. package/esm2022/badge/index.mjs +0 -2
  372. package/esm2022/badge/koobiq-components-badge.mjs +0 -5
  373. package/esm2022/badge/public-api.mjs +0 -3
  374. package/esm2022/breadcrumbs/breadcrumbs.mjs +0 -268
  375. package/esm2022/breadcrumbs/breadcrumbs.module.mjs +0 -31
  376. package/esm2022/breadcrumbs/breadcrumbs.types.mjs +0 -2
  377. package/esm2022/breadcrumbs/index.mjs +0 -2
  378. package/esm2022/breadcrumbs/koobiq-components-breadcrumbs.mjs +0 -5
  379. package/esm2022/breadcrumbs/public-api.mjs +0 -4
  380. package/esm2022/button/button.component.mjs +0 -180
  381. package/esm2022/button/button.dropdown-trigger.directive.mjs +0 -28
  382. package/esm2022/button/button.module.mjs +0 -41
  383. package/esm2022/button/index.mjs +0 -2
  384. package/esm2022/button/koobiq-components-button.mjs +0 -5
  385. package/esm2022/button/public-api.mjs +0 -4
  386. package/esm2022/button-toggle/button-toggle.component.mjs +0 -384
  387. package/esm2022/button-toggle/button-toggle.module.mjs +0 -19
  388. package/esm2022/button-toggle/index.mjs +0 -2
  389. package/esm2022/button-toggle/koobiq-components-button-toggle.mjs +0 -5
  390. package/esm2022/button-toggle/public-api.mjs +0 -3
  391. package/esm2022/checkbox/checkbox-config.mjs +0 -6
  392. package/esm2022/checkbox/checkbox-module.mjs +0 -19
  393. package/esm2022/checkbox/checkbox-required-validator.mjs +0 -27
  394. package/esm2022/checkbox/checkbox.mjs +0 -295
  395. package/esm2022/checkbox/index.mjs +0 -2
  396. package/esm2022/checkbox/koobiq-components-checkbox.mjs +0 -5
  397. package/esm2022/checkbox/public-api.mjs +0 -5
  398. package/esm2022/clamped-text/clamped-text.mjs +0 -202
  399. package/esm2022/clamped-text/constants.mjs +0 -20
  400. package/esm2022/clamped-text/index.mjs +0 -4
  401. package/esm2022/clamped-text/koobiq-components-clamped-text.mjs +0 -5
  402. package/esm2022/clamped-text/module.mjs +0 -19
  403. package/esm2022/code-block/code-block-highlight.mjs +0 -418
  404. package/esm2022/code-block/code-block.mjs +0 -440
  405. package/esm2022/code-block/code-block.module.mjs +0 -19
  406. package/esm2022/code-block/index.mjs +0 -2
  407. package/esm2022/code-block/koobiq-components-code-block.mjs +0 -5
  408. package/esm2022/code-block/public-api.mjs +0 -5
  409. package/esm2022/code-block/types.mjs +0 -2
  410. package/esm2022/content-panel/content-panel.mjs +0 -432
  411. package/esm2022/content-panel/index.mjs +0 -3
  412. package/esm2022/content-panel/koobiq-components-content-panel.mjs +0 -5
  413. package/esm2022/content-panel/module.mjs +0 -42
  414. package/esm2022/core/animation/animation.mjs +0 -39
  415. package/esm2022/core/animation/fade-animations.mjs +0 -9
  416. package/esm2022/core/animation/index.mjs +0 -4
  417. package/esm2022/core/animation/select-animations.mjs +0 -45
  418. package/esm2022/core/common-behaviors/checkbox.mjs +0 -2
  419. package/esm2022/core/common-behaviors/clipboard.mjs +0 -31
  420. package/esm2022/core/common-behaviors/color.mjs +0 -89
  421. package/esm2022/core/common-behaviors/common-module.mjs +0 -76
  422. package/esm2022/core/common-behaviors/constructor.mjs +0 -2
  423. package/esm2022/core/common-behaviors/disabled.mjs +0 -19
  424. package/esm2022/core/common-behaviors/error-state.mjs +0 -50
  425. package/esm2022/core/common-behaviors/focus-monitor.mjs +0 -37
  426. package/esm2022/core/common-behaviors/hover.mjs +0 -34
  427. package/esm2022/core/common-behaviors/index.mjs +0 -14
  428. package/esm2022/core/common-behaviors/orientation.mjs +0 -2
  429. package/esm2022/core/common-behaviors/read-state.mjs +0 -33
  430. package/esm2022/core/common-behaviors/size.mjs +0 -2
  431. package/esm2022/core/common-behaviors/tabindex.mjs +0 -20
  432. package/esm2022/core/datetime/date-adapter.mjs +0 -14
  433. package/esm2022/core/datetime/date-formats.mjs +0 -3
  434. package/esm2022/core/datetime/index.mjs +0 -3
  435. package/esm2022/core/error/error-state-matcher.mjs +0 -56
  436. package/esm2022/core/form-field/field-sizing-content.mjs +0 -117
  437. package/esm2022/core/form-field/form-field-ref.mjs +0 -10
  438. package/esm2022/core/form-field/index.mjs +0 -3
  439. package/esm2022/core/formatters/date/formatter.mjs +0 -25
  440. package/esm2022/core/formatters/date/formatter.pipe.mjs +0 -380
  441. package/esm2022/core/formatters/filesize/config.mjs +0 -32
  442. package/esm2022/core/formatters/filesize/formatter.mjs +0 -43
  443. package/esm2022/core/formatters/filesize/index.mjs +0 -4
  444. package/esm2022/core/formatters/filesize/size.mjs +0 -65
  445. package/esm2022/core/formatters/index.mjs +0 -146
  446. package/esm2022/core/formatters/number/formatter.mjs +0 -347
  447. package/esm2022/core/forms/forms-module.mjs +0 -24
  448. package/esm2022/core/forms/forms.directive.mjs +0 -66
  449. package/esm2022/core/forms/index.mjs +0 -4
  450. package/esm2022/core/forms/validators.mjs +0 -184
  451. package/esm2022/core/highlight/highlight.pipe.mjs +0 -23
  452. package/esm2022/core/highlight/index.mjs +0 -19
  453. package/esm2022/core/index.mjs +0 -2
  454. package/esm2022/core/koobiq-components-core.mjs +0 -5
  455. package/esm2022/core/line/line.mjs +0 -70
  456. package/esm2022/core/locales/en-US.mjs +0 -210
  457. package/esm2022/core/locales/es-LA.mjs +0 -209
  458. package/esm2022/core/locales/formatters.mjs +0 -193
  459. package/esm2022/core/locales/index.mjs +0 -10
  460. package/esm2022/core/locales/locale-service.mjs +0 -173
  461. package/esm2022/core/locales/locale-service.module.mjs +0 -19
  462. package/esm2022/core/locales/pt-BR.mjs +0 -209
  463. package/esm2022/core/locales/ru-RU.mjs +0 -224
  464. package/esm2022/core/locales/tk-TM.mjs +0 -210
  465. package/esm2022/core/locales/types.mjs +0 -2
  466. package/esm2022/core/navbar/index.mjs +0 -2
  467. package/esm2022/core/navbar/rectangle-item.mjs +0 -40
  468. package/esm2022/core/option/action-container.mjs +0 -23
  469. package/esm2022/core/option/action.mjs +0 -107
  470. package/esm2022/core/option/index.mjs +0 -6
  471. package/esm2022/core/option/optgroup.mjs +0 -37
  472. package/esm2022/core/option/option-module.mjs +0 -20
  473. package/esm2022/core/option/option.mjs +0 -322
  474. package/esm2022/core/overlay/overlay-position-map.mjs +0 -251
  475. package/esm2022/core/pop-up/constants.mjs +0 -55
  476. package/esm2022/core/pop-up/focus-trap-strategy.mjs +0 -6
  477. package/esm2022/core/pop-up/index.mjs +0 -6
  478. package/esm2022/core/pop-up/pop-up-styles.mjs +0 -24
  479. package/esm2022/core/pop-up/pop-up-trigger.mjs +0 -343
  480. package/esm2022/core/pop-up/pop-up.mjs +0 -152
  481. package/esm2022/core/public-api.mjs +0 -24
  482. package/esm2022/core/select/common.mjs +0 -203
  483. package/esm2022/core/select/constants.mjs +0 -25
  484. package/esm2022/core/select/errors.mjs +0 -26
  485. package/esm2022/core/select/events.mjs +0 -2
  486. package/esm2022/core/select/index.mjs +0 -5
  487. package/esm2022/core/selection/constants.mjs +0 -6
  488. package/esm2022/core/selection/index.mjs +0 -4
  489. package/esm2022/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +0 -43
  490. package/esm2022/core/selection/pseudo-checkbox/pseudo-checkbox.module.mjs +0 -18
  491. package/esm2022/core/services/measure-scrollbar.service.mjs +0 -42
  492. package/esm2022/core/services/theme.service.mjs +0 -80
  493. package/esm2022/core/title/index.mjs +0 -2
  494. package/esm2022/core/title/title-text-ref.mjs +0 -3
  495. package/esm2022/core/tokens/index.mjs +0 -2
  496. package/esm2022/core/tokens/window.mjs +0 -19
  497. package/esm2022/core/utils/dom.mjs +0 -8
  498. package/esm2022/core/utils/index.mjs +0 -3
  499. package/esm2022/core/utils/public-api.mjs +0 -2
  500. package/esm2022/core/utils/utils.mjs +0 -31
  501. package/esm2022/core/validation/index.mjs +0 -2
  502. package/esm2022/core/validation/validation.mjs +0 -27
  503. package/esm2022/core/version.mjs +0 -3
  504. package/esm2022/datepicker/calendar-body.component.mjs +0 -87
  505. package/esm2022/datepicker/calendar-header.component.mjs +0 -164
  506. package/esm2022/datepicker/calendar.component.mjs +0 -185
  507. package/esm2022/datepicker/datepicker-animations.mjs +0 -32
  508. package/esm2022/datepicker/datepicker-errors.mjs +0 -6
  509. package/esm2022/datepicker/datepicker-input.directive.mjs +0 -1119
  510. package/esm2022/datepicker/datepicker-intl.mjs +0 -40
  511. package/esm2022/datepicker/datepicker-module.mjs +0 -103
  512. package/esm2022/datepicker/datepicker-toggle.component.mjs +0 -170
  513. package/esm2022/datepicker/datepicker.component.mjs +0 -388
  514. package/esm2022/datepicker/index.mjs +0 -2
  515. package/esm2022/datepicker/koobiq-components-datepicker.mjs +0 -5
  516. package/esm2022/datepicker/month-view.component.mjs +0 -148
  517. package/esm2022/datepicker/public-api.mjs +0 -11
  518. package/esm2022/divider/divider.component.mjs +0 -49
  519. package/esm2022/divider/divider.module.mjs +0 -18
  520. package/esm2022/divider/index.mjs +0 -2
  521. package/esm2022/divider/koobiq-components-divider.mjs +0 -5
  522. package/esm2022/divider/public-api.mjs +0 -3
  523. package/esm2022/dl/dl.component.mjs +0 -81
  524. package/esm2022/dl/dl.module.mjs +0 -36
  525. package/esm2022/dl/index.mjs +0 -2
  526. package/esm2022/dl/koobiq-components-dl.mjs +0 -5
  527. package/esm2022/dl/public-api.mjs +0 -3
  528. package/esm2022/dropdown/dropdown-animations.mjs +0 -41
  529. package/esm2022/dropdown/dropdown-content.directive.mjs +0 -61
  530. package/esm2022/dropdown/dropdown-errors.mjs +0 -29
  531. package/esm2022/dropdown/dropdown-item.component.mjs +0 -150
  532. package/esm2022/dropdown/dropdown-trigger.directive.mjs +0 -513
  533. package/esm2022/dropdown/dropdown.component.mjs +0 -293
  534. package/esm2022/dropdown/dropdown.module.mjs +0 -51
  535. package/esm2022/dropdown/dropdown.types.mjs +0 -23
  536. package/esm2022/dropdown/index.mjs +0 -2
  537. package/esm2022/dropdown/koobiq-components-dropdown.mjs +0 -5
  538. package/esm2022/dropdown/public-api.mjs +0 -9
  539. package/esm2022/dynamic-translation/dynamic-translation.mjs +0 -175
  540. package/esm2022/dynamic-translation/index.mjs +0 -3
  541. package/esm2022/dynamic-translation/koobiq-components-dynamic-translation.mjs +0 -5
  542. package/esm2022/dynamic-translation/module.mjs +0 -25
  543. package/esm2022/ellipsis-center/ellipsis-center.directive.mjs +0 -120
  544. package/esm2022/ellipsis-center/index.mjs +0 -2
  545. package/esm2022/ellipsis-center/koobiq-components-ellipsis-center.mjs +0 -5
  546. package/esm2022/ellipsis-center/public-api.mjs +0 -2
  547. package/esm2022/empty-state/empty-state.component.mjs +0 -109
  548. package/esm2022/empty-state/empty-state.module.mjs +0 -44
  549. package/esm2022/empty-state/index.mjs +0 -2
  550. package/esm2022/empty-state/koobiq-components-empty-state.mjs +0 -5
  551. package/esm2022/empty-state/public-api.mjs +0 -3
  552. package/esm2022/file-upload/file-drop.mjs +0 -87
  553. package/esm2022/file-upload/file-upload.mjs +0 -71
  554. package/esm2022/file-upload/file-upload.module.mjs +0 -79
  555. package/esm2022/file-upload/index.mjs +0 -2
  556. package/esm2022/file-upload/koobiq-components-file-upload.mjs +0 -5
  557. package/esm2022/file-upload/multiple-file-upload.component.mjs +0 -306
  558. package/esm2022/file-upload/public-api.mjs +0 -6
  559. package/esm2022/file-upload/single-file-upload.component.mjs +0 -257
  560. package/esm2022/filter-bar/filter-bar-button.mjs +0 -31
  561. package/esm2022/filter-bar/filter-bar.mjs +0 -213
  562. package/esm2022/filter-bar/filter-bar.module.mjs +0 -67
  563. package/esm2022/filter-bar/filter-bar.types.mjs +0 -72
  564. package/esm2022/filter-bar/filter-refresher.mjs +0 -34
  565. package/esm2022/filter-bar/filter-reset.mjs +0 -49
  566. package/esm2022/filter-bar/filter-search.mjs +0 -173
  567. package/esm2022/filter-bar/filters.mjs +0 -266
  568. package/esm2022/filter-bar/index.mjs +0 -2
  569. package/esm2022/filter-bar/koobiq-components-filter-bar.mjs +0 -5
  570. package/esm2022/filter-bar/pipe-add.mjs +0 -140
  571. package/esm2022/filter-bar/pipe.directive.mjs +0 -37
  572. package/esm2022/filter-bar/pipes/base-pipe.mjs +0 -146
  573. package/esm2022/filter-bar/pipes/pipe-button.mjs +0 -72
  574. package/esm2022/filter-bar/pipes/pipe-date.mjs +0 -206
  575. package/esm2022/filter-bar/pipes/pipe-datetime.mjs +0 -208
  576. package/esm2022/filter-bar/pipes/pipe-multi-select.mjs +0 -188
  577. package/esm2022/filter-bar/pipes/pipe-multi-tree-select.mjs +0 -260
  578. package/esm2022/filter-bar/pipes/pipe-readonly.mjs +0 -68
  579. package/esm2022/filter-bar/pipes/pipe-select.mjs +0 -101
  580. package/esm2022/filter-bar/pipes/pipe-state.mjs +0 -53
  581. package/esm2022/filter-bar/pipes/pipe-text.mjs +0 -104
  582. package/esm2022/filter-bar/pipes/pipe-title.mjs +0 -102
  583. package/esm2022/filter-bar/pipes/pipe-tree-select.mjs +0 -142
  584. package/esm2022/filter-bar/public-api.mjs +0 -22
  585. package/esm2022/form-field/cleaner.mjs +0 -28
  586. package/esm2022/form-field/error.mjs +0 -20
  587. package/esm2022/form-field/fieldset.mjs +0 -84
  588. package/esm2022/form-field/form-field-control.mjs +0 -4
  589. package/esm2022/form-field/form-field.mjs +0 -447
  590. package/esm2022/form-field/form-field.module.mjs +0 -87
  591. package/esm2022/form-field/hint.mjs +0 -36
  592. package/esm2022/form-field/index.mjs +0 -2
  593. package/esm2022/form-field/koobiq-components-form-field.mjs +0 -5
  594. package/esm2022/form-field/label.mjs +0 -19
  595. package/esm2022/form-field/password-hint.mjs +0 -165
  596. package/esm2022/form-field/password-toggle.mjs +0 -129
  597. package/esm2022/form-field/prefix.mjs +0 -19
  598. package/esm2022/form-field/public-api.mjs +0 -16
  599. package/esm2022/form-field/reactive-password-hint.mjs +0 -66
  600. package/esm2022/form-field/stepper.mjs +0 -144
  601. package/esm2022/form-field/suffix.mjs +0 -18
  602. package/esm2022/form-field/validate.directive.mjs +0 -190
  603. package/esm2022/icon/icon-button.component.mjs +0 -64
  604. package/esm2022/icon/icon-item.component.mjs +0 -31
  605. package/esm2022/icon/icon.component.mjs +0 -56
  606. package/esm2022/icon/icon.module.mjs +0 -27
  607. package/esm2022/icon/index.mjs +0 -2
  608. package/esm2022/icon/koobiq-components-icon.mjs +0 -5
  609. package/esm2022/icon/public-api.mjs +0 -5
  610. package/esm2022/index.mjs +0 -2
  611. package/esm2022/inline-edit/index.mjs +0 -3
  612. package/esm2022/inline-edit/inline-edit.mjs +0 -382
  613. package/esm2022/inline-edit/koobiq-components-inline-edit.mjs +0 -5
  614. package/esm2022/inline-edit/module.mjs +0 -25
  615. package/esm2022/input/index.mjs +0 -2
  616. package/esm2022/input/input-errors.mjs +0 -4
  617. package/esm2022/input/input-number-validators.mjs +0 -88
  618. package/esm2022/input/input-number.mjs +0 -386
  619. package/esm2022/input/input-password.mjs +0 -253
  620. package/esm2022/input/input-value-accessor.mjs +0 -3
  621. package/esm2022/input/input.mjs +0 -299
  622. package/esm2022/input/input.module.mjs +0 -58
  623. package/esm2022/input/koobiq-components-input.mjs +0 -5
  624. package/esm2022/input/public-api.mjs +0 -7
  625. package/esm2022/koobiq-components.mjs +0 -5
  626. package/esm2022/link/index.mjs +0 -2
  627. package/esm2022/link/koobiq-components-link.mjs +0 -5
  628. package/esm2022/link/link.component.mjs +0 -143
  629. package/esm2022/link/link.module.mjs +0 -20
  630. package/esm2022/link/public-api.mjs +0 -3
  631. package/esm2022/list/index.mjs +0 -2
  632. package/esm2022/list/koobiq-components-list.mjs +0 -5
  633. package/esm2022/list/list-selection.component.mjs +0 -745
  634. package/esm2022/list/list.component.mjs +0 -43
  635. package/esm2022/list/list.module.mjs +0 -60
  636. package/esm2022/list/public-api.mjs +0 -4
  637. package/esm2022/loader-overlay/index.mjs +0 -2
  638. package/esm2022/loader-overlay/koobiq-components-loader-overlay.mjs +0 -5
  639. package/esm2022/loader-overlay/loader-overlay.component.mjs +0 -110
  640. package/esm2022/loader-overlay/loader-overlay.module.mjs +0 -44
  641. package/esm2022/loader-overlay/public-api.mjs +0 -3
  642. package/esm2022/markdown/index.mjs +0 -2
  643. package/esm2022/markdown/koobiq-components-markdown.mjs +0 -5
  644. package/esm2022/markdown/markdown.component.mjs +0 -67
  645. package/esm2022/markdown/markdown.module.mjs +0 -21
  646. package/esm2022/markdown/markdown.service.mjs +0 -36
  647. package/esm2022/markdown/markdown.values.mjs +0 -35
  648. package/esm2022/markdown/public-api.mjs +0 -5
  649. package/esm2022/modal/css-unit.pipe.mjs +0 -17
  650. package/esm2022/modal/index.mjs +0 -2
  651. package/esm2022/modal/koobiq-components-modal.mjs +0 -5
  652. package/esm2022/modal/modal-control.service.mjs +0 -89
  653. package/esm2022/modal/modal-ref.class.mjs +0 -7
  654. package/esm2022/modal/modal-util.mjs +0 -22
  655. package/esm2022/modal/modal.component.mjs +0 -540
  656. package/esm2022/modal/modal.directive.mjs +0 -94
  657. package/esm2022/modal/modal.module.mjs +0 -78
  658. package/esm2022/modal/modal.service.mjs +0 -135
  659. package/esm2022/modal/modal.type.mjs +0 -7
  660. package/esm2022/modal/public-api.mjs +0 -7
  661. package/esm2022/navbar/index.mjs +0 -2
  662. package/esm2022/navbar/koobiq-components-navbar.mjs +0 -5
  663. package/esm2022/navbar/navbar-brand.component.mjs +0 -105
  664. package/esm2022/navbar/navbar-item.component.mjs +0 -428
  665. package/esm2022/navbar/navbar-toggle.component.mjs +0 -88
  666. package/esm2022/navbar/navbar.component.mjs +0 -251
  667. package/esm2022/navbar/navbar.module.mjs +0 -84
  668. package/esm2022/navbar/public-api.mjs +0 -7
  669. package/esm2022/navbar/vertical-navbar.component.mjs +0 -128
  670. package/esm2022/navbar-ic/index.mjs +0 -2
  671. package/esm2022/navbar-ic/koobiq-components-navbar-ic.mjs +0 -5
  672. package/esm2022/navbar-ic/navbar-ic-header.mjs +0 -74
  673. package/esm2022/navbar-ic/navbar-ic-item.mjs +0 -390
  674. package/esm2022/navbar-ic/navbar-ic.animation.mjs +0 -17
  675. package/esm2022/navbar-ic/navbar-ic.mjs +0 -310
  676. package/esm2022/navbar-ic/navbar-ic.module.mjs +0 -74
  677. package/esm2022/navbar-ic/public-api.mjs +0 -5
  678. package/esm2022/notification-center/index.mjs +0 -2
  679. package/esm2022/notification-center/koobiq-components-notification-center.mjs +0 -5
  680. package/esm2022/notification-center/notification-center-animations.mjs +0 -18
  681. package/esm2022/notification-center/notification-center.mjs +0 -329
  682. package/esm2022/notification-center/notification-center.module.mjs +0 -38
  683. package/esm2022/notification-center/notification-center.service.mjs +0 -127
  684. package/esm2022/notification-center/notification-item.mjs +0 -70
  685. package/esm2022/notification-center/public-api.mjs +0 -5
  686. package/esm2022/overflow-items/index.mjs +0 -3
  687. package/esm2022/overflow-items/koobiq-components-overflow-items.mjs +0 -5
  688. package/esm2022/overflow-items/module.mjs +0 -25
  689. package/esm2022/overflow-items/overflow-items.mjs +0 -290
  690. package/esm2022/popover/index.mjs +0 -2
  691. package/esm2022/popover/koobiq-components-popover.mjs +0 -5
  692. package/esm2022/popover/popover-animations.mjs +0 -16
  693. package/esm2022/popover/popover-confirm.component.mjs +0 -97
  694. package/esm2022/popover/popover.component.mjs +0 -410
  695. package/esm2022/popover/popover.module.mjs +0 -67
  696. package/esm2022/popover/public-api.mjs +0 -5
  697. package/esm2022/progress-bar/index.mjs +0 -2
  698. package/esm2022/progress-bar/koobiq-components-progress-bar.mjs +0 -5
  699. package/esm2022/progress-bar/progress-bar.component.mjs +0 -62
  700. package/esm2022/progress-bar/progress-bar.module.mjs +0 -32
  701. package/esm2022/progress-bar/public-api.mjs +0 -3
  702. package/esm2022/progress-spinner/index.mjs +0 -2
  703. package/esm2022/progress-spinner/koobiq-components-progress-spinner.mjs +0 -5
  704. package/esm2022/progress-spinner/progress-spinner.component.mjs +0 -78
  705. package/esm2022/progress-spinner/progress-spinner.module.mjs +0 -35
  706. package/esm2022/progress-spinner/public-api.mjs +0 -3
  707. package/esm2022/public-api.mjs +0 -2
  708. package/esm2022/radio/index.mjs +0 -2
  709. package/esm2022/radio/koobiq-components-radio.mjs +0 -5
  710. package/esm2022/radio/public-api.mjs +0 -3
  711. package/esm2022/radio/radio.component.mjs +0 -451
  712. package/esm2022/radio/radio.module.mjs +0 -18
  713. package/esm2022/resizer/index.mjs +0 -3
  714. package/esm2022/resizer/koobiq-components-resizer.mjs +0 -5
  715. package/esm2022/resizer/module.mjs +0 -17
  716. package/esm2022/resizer/resizer.mjs +0 -135
  717. package/esm2022/risk-level/index.mjs +0 -2
  718. package/esm2022/risk-level/koobiq-components-risk-level.mjs +0 -5
  719. package/esm2022/risk-level/public-api.mjs +0 -3
  720. package/esm2022/risk-level/risk-level.component.mjs +0 -40
  721. package/esm2022/risk-level/risk-level.module.mjs +0 -24
  722. package/esm2022/scrollbar/index.mjs +0 -2
  723. package/esm2022/scrollbar/koobiq-components-scrollbar.mjs +0 -5
  724. package/esm2022/scrollbar/public-api.mjs +0 -5
  725. package/esm2022/scrollbar/scrollbar.component.mjs +0 -133
  726. package/esm2022/scrollbar/scrollbar.directive.mjs +0 -105
  727. package/esm2022/scrollbar/scrollbar.module.mjs +0 -25
  728. package/esm2022/scrollbar/scrollbar.types.mjs +0 -14
  729. package/esm2022/search-expandable/index.mjs +0 -2
  730. package/esm2022/search-expandable/koobiq-components-search-expandable.mjs +0 -5
  731. package/esm2022/search-expandable/public-api.mjs +0 -3
  732. package/esm2022/search-expandable/search-expandable.mjs +0 -177
  733. package/esm2022/search-expandable/search-expandable.module.mjs +0 -18
  734. package/esm2022/select/index.mjs +0 -2
  735. package/esm2022/select/koobiq-components-select.mjs +0 -5
  736. package/esm2022/select/public-api.mjs +0 -4
  737. package/esm2022/select/select-option.directive.mjs +0 -69
  738. package/esm2022/select/select.component.mjs +0 -1154
  739. package/esm2022/select/select.module.mjs +0 -81
  740. package/esm2022/sidebar/index.mjs +0 -2
  741. package/esm2022/sidebar/koobiq-components-sidebar.mjs +0 -5
  742. package/esm2022/sidebar/public-api.mjs +0 -3
  743. package/esm2022/sidebar/sidebar-animations.mjs +0 -23
  744. package/esm2022/sidebar/sidebar.component.mjs +0 -169
  745. package/esm2022/sidebar/sidebar.module.mjs +0 -30
  746. package/esm2022/sidepanel/index.mjs +0 -2
  747. package/esm2022/sidepanel/koobiq-components-sidepanel.mjs +0 -5
  748. package/esm2022/sidepanel/public-api.mjs +0 -7
  749. package/esm2022/sidepanel/sidepanel-animations.mjs +0 -29
  750. package/esm2022/sidepanel/sidepanel-config.mjs +0 -33
  751. package/esm2022/sidepanel/sidepanel-container.component.mjs +0 -126
  752. package/esm2022/sidepanel/sidepanel-directives.mjs +0 -168
  753. package/esm2022/sidepanel/sidepanel-ref.mjs +0 -60
  754. package/esm2022/sidepanel/sidepanel.module.mjs +0 -73
  755. package/esm2022/sidepanel/sidepanel.service.mjs +0 -167
  756. package/esm2022/split-button/index.mjs +0 -2
  757. package/esm2022/split-button/koobiq-components-split-button.mjs +0 -5
  758. package/esm2022/split-button/public-api.mjs +0 -3
  759. package/esm2022/split-button/split-button.mjs +0 -133
  760. package/esm2022/split-button/split-button.module.mjs +0 -18
  761. package/esm2022/splitter/index.mjs +0 -2
  762. package/esm2022/splitter/koobiq-components-splitter.mjs +0 -5
  763. package/esm2022/splitter/public-api.mjs +0 -3
  764. package/esm2022/splitter/splitter.component.mjs +0 -492
  765. package/esm2022/splitter/splitter.module.mjs +0 -34
  766. package/esm2022/table/index.mjs +0 -2
  767. package/esm2022/table/koobiq-components-table.mjs +0 -5
  768. package/esm2022/table/public-api.mjs +0 -3
  769. package/esm2022/table/table.component.mjs +0 -36
  770. package/esm2022/table/table.module.mjs +0 -32
  771. package/esm2022/tabs/index.mjs +0 -2
  772. package/esm2022/tabs/koobiq-components-tabs.mjs +0 -5
  773. package/esm2022/tabs/paginated-tab-header.mjs +0 -490
  774. package/esm2022/tabs/public-api.mjs +0 -11
  775. package/esm2022/tabs/tab-body.component.mjs +0 -178
  776. package/esm2022/tabs/tab-content.directive.mjs +0 -15
  777. package/esm2022/tabs/tab-group.component.mjs +0 -384
  778. package/esm2022/tabs/tab-header.component.mjs +0 -60
  779. package/esm2022/tabs/tab-label-wrapper.directive.mjs +0 -86
  780. package/esm2022/tabs/tab-label.directive.mjs +0 -17
  781. package/esm2022/tabs/tab-nav-bar.mjs +0 -292
  782. package/esm2022/tabs/tab.component.mjs +0 -145
  783. package/esm2022/tabs/tabs-animations.mjs +0 -24
  784. package/esm2022/tabs/tabs.module.mjs +0 -95
  785. package/esm2022/tags/index.mjs +0 -2
  786. package/esm2022/tags/koobiq-components-tags.mjs +0 -5
  787. package/esm2022/tags/public-api.mjs +0 -6
  788. package/esm2022/tags/tag-default-options.mjs +0 -4
  789. package/esm2022/tags/tag-input.mjs +0 -281
  790. package/esm2022/tags/tag-list.component.mjs +0 -765
  791. package/esm2022/tags/tag-text-control.mjs +0 -2
  792. package/esm2022/tags/tag.component.mjs +0 -647
  793. package/esm2022/tags/tag.module.mjs +0 -67
  794. package/esm2022/textarea/index.mjs +0 -2
  795. package/esm2022/textarea/koobiq-components-textarea.mjs +0 -5
  796. package/esm2022/textarea/public-api.mjs +0 -3
  797. package/esm2022/textarea/textarea.component.mjs +0 -300
  798. package/esm2022/textarea/textarea.module.mjs +0 -20
  799. package/esm2022/time-range/constants.mjs +0 -42
  800. package/esm2022/time-range/index.mjs +0 -8
  801. package/esm2022/time-range/koobiq-components-time-range.mjs +0 -5
  802. package/esm2022/time-range/module.mjs +0 -36
  803. package/esm2022/time-range/time-range-editor.mjs +0 -224
  804. package/esm2022/time-range/time-range-title-as-form-field.mjs +0 -60
  805. package/esm2022/time-range/time-range-title.mjs +0 -112
  806. package/esm2022/time-range/time-range.mjs +0 -234
  807. package/esm2022/time-range/time-range.service.mjs +0 -126
  808. package/esm2022/time-range/types.mjs +0 -2
  809. package/esm2022/timepicker/index.mjs +0 -2
  810. package/esm2022/timepicker/koobiq-components-timepicker.mjs +0 -5
  811. package/esm2022/timepicker/public-api.mjs +0 -4
  812. package/esm2022/timepicker/timepicker.constants.mjs +0 -29
  813. package/esm2022/timepicker/timepicker.directive.mjs +0 -686
  814. package/esm2022/timepicker/timepicker.module.mjs +0 -29
  815. package/esm2022/timezone/cities-by-filter.pipe.mjs +0 -17
  816. package/esm2022/timezone/index.mjs +0 -2
  817. package/esm2022/timezone/koobiq-components-timezone.mjs +0 -5
  818. package/esm2022/timezone/public-api.mjs +0 -7
  819. package/esm2022/timezone/timezone-option.component.mjs +0 -50
  820. package/esm2022/timezone/timezone-option.directive.mjs +0 -54
  821. package/esm2022/timezone/timezone-select.component.mjs +0 -55
  822. package/esm2022/timezone/timezone.models.mjs +0 -2
  823. package/esm2022/timezone/timezone.module.mjs +0 -82
  824. package/esm2022/timezone/timezone.utils.mjs +0 -80
  825. package/esm2022/timezone/utc-offset.pipe.mjs +0 -17
  826. package/esm2022/title/index.mjs +0 -2
  827. package/esm2022/title/koobiq-components-title.mjs +0 -5
  828. package/esm2022/title/public-api.mjs +0 -3
  829. package/esm2022/title/title.directive.mjs +0 -108
  830. package/esm2022/title/title.module.mjs +0 -18
  831. package/esm2022/toast/index.mjs +0 -2
  832. package/esm2022/toast/koobiq-components-toast.mjs +0 -5
  833. package/esm2022/toast/public-api.mjs +0 -6
  834. package/esm2022/toast/toast-animations.mjs +0 -10
  835. package/esm2022/toast/toast-container.component.mjs +0 -57
  836. package/esm2022/toast/toast.component.mjs +0 -125
  837. package/esm2022/toast/toast.module.mjs +0 -26
  838. package/esm2022/toast/toast.service.mjs +0 -197
  839. package/esm2022/toast/toast.type.mjs +0 -39
  840. package/esm2022/toggle/index.mjs +0 -2
  841. package/esm2022/toggle/koobiq-components-toggle.mjs +0 -5
  842. package/esm2022/toggle/public-api.mjs +0 -3
  843. package/esm2022/toggle/toggle.component.mjs +0 -254
  844. package/esm2022/toggle/toggle.module.mjs +0 -18
  845. package/esm2022/tooltip/index.mjs +0 -2
  846. package/esm2022/tooltip/koobiq-components-tooltip.mjs +0 -5
  847. package/esm2022/tooltip/public-api.mjs +0 -3
  848. package/esm2022/tooltip/tooltip.animations.mjs +0 -19
  849. package/esm2022/tooltip/tooltip.component.mjs +0 -400
  850. package/esm2022/tooltip/tooltip.module.mjs +0 -35
  851. package/esm2022/top-bar/index.mjs +0 -2
  852. package/esm2022/top-bar/koobiq-components-top-bar.mjs +0 -5
  853. package/esm2022/top-bar/module.mjs +0 -25
  854. package/esm2022/top-bar/public-api.mjs +0 -3
  855. package/esm2022/top-bar/top-bar.mjs +0 -74
  856. package/esm2022/tree/control/base-tree-control.mjs +0 -59
  857. package/esm2022/tree/control/flat-tree-control.filters.mjs +0 -52
  858. package/esm2022/tree/control/flat-tree-control.mjs +0 -109
  859. package/esm2022/tree/control/nested-tree-control.mjs +0 -40
  860. package/esm2022/tree/control/tree-control.mjs +0 -2
  861. package/esm2022/tree/data-source/flat-data-source.mjs +0 -157
  862. package/esm2022/tree/data-source/nested-data-source.mjs +0 -28
  863. package/esm2022/tree/index.mjs +0 -2
  864. package/esm2022/tree/koobiq-components-tree.mjs +0 -5
  865. package/esm2022/tree/node.mjs +0 -31
  866. package/esm2022/tree/outlet.mjs +0 -15
  867. package/esm2022/tree/padding.directive.mjs +0 -108
  868. package/esm2022/tree/public-api.mjs +0 -17
  869. package/esm2022/tree/toggle.mjs +0 -93
  870. package/esm2022/tree/tree-base.mjs +0 -236
  871. package/esm2022/tree/tree-errors.mjs +0 -36
  872. package/esm2022/tree/tree-option.component.mjs +0 -303
  873. package/esm2022/tree/tree-selection.component.mjs +0 -568
  874. package/esm2022/tree/tree.mjs +0 -19
  875. package/esm2022/tree/tree.module.mjs +0 -64
  876. package/esm2022/tree-select/index.mjs +0 -2
  877. package/esm2022/tree-select/koobiq-components-tree-select.mjs +0 -5
  878. package/esm2022/tree-select/public-api.mjs +0 -3
  879. package/esm2022/tree-select/tree-select.component.mjs +0 -1034
  880. package/esm2022/tree-select/tree-select.module.mjs +0 -71
  881. package/esm2022/username/constants.mjs +0 -25
  882. package/esm2022/username/index.mjs +0 -6
  883. package/esm2022/username/koobiq-components-username.mjs +0 -5
  884. package/esm2022/username/module.mjs +0 -35
  885. package/esm2022/username/types.mjs +0 -32
  886. package/esm2022/username/username.mjs +0 -129
  887. package/esm2022/username/username.pipe.mjs +0 -92
@@ -1,686 +0,0 @@
1
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
- import { Directive, ElementRef, EventEmitter, forwardRef, Inject, Input, Optional, Output, Renderer2 } from '@angular/core';
3
- import { NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
4
- import { BACKSPACE, DELETE, DOWN_ARROW, END, hasModifierKey, HOME, isHorizontalMovement, isLetterKey, isVerticalMovement, LEFT_ARROW, PAGE_DOWN, PAGE_UP, RIGHT_ARROW, SPACE, TAB, UP_ARROW } from '@koobiq/cdk/keycodes';
5
- import { DateAdapter, KBQ_LOCALE_SERVICE, KbqLocaleService, validationTooltipHideDelay, validationTooltipShowDelay } from '@koobiq/components/core';
6
- import { KbqFormFieldControl } from '@koobiq/components/form-field';
7
- import { KbqWarningTooltipTrigger } from '@koobiq/components/tooltip';
8
- import { noop, Subject, Subscription } from 'rxjs';
9
- import { AM_PM_FORMAT_REGEXP, DEFAULT_TIME_FORMAT, HOURS_MINUTES_REGEXP, HOURS_MINUTES_SECONDS_REGEXP, HOURS_ONLY_REGEXP, HOURS_PER_DAY, MINUTES_PER_HOUR, SECONDS_PER_MINUTE, TIMEFORMAT_PLACEHOLDERS, TimeFormats, TimeFormatToLocaleKeys, TimeParts } from './timepicker.constants';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@koobiq/components/core";
12
- /** @docs-private */
13
- export const KBQ_TIMEPICKER_VALUE_ACCESSOR = {
14
- provide: NG_VALUE_ACCESSOR,
15
- useExisting: forwardRef(() => KbqTimepicker),
16
- multi: true
17
- };
18
- /** @docs-private */
19
- export const KBQ_TIMEPICKER_VALIDATORS = {
20
- provide: NG_VALIDATORS,
21
- useExisting: forwardRef(() => KbqTimepicker),
22
- multi: true
23
- };
24
- let uniqueComponentIdSuffix = 0;
25
- const shortFormatSize = 5;
26
- const fullFormatSize = 8;
27
- export class KbqTimepicker {
28
- /**
29
- * Implemented as part of KbqFormFieldControl.
30
- * @docs-private
31
- */
32
- get placeholder() {
33
- return this._placeholder;
34
- }
35
- set placeholder(value) {
36
- this._placeholder = value;
37
- this.defaultPlaceholder = false;
38
- }
39
- get disabled() {
40
- return this._disabled;
41
- }
42
- set disabled(value) {
43
- this._disabled = coerceBooleanProperty(value);
44
- // Browsers may not fire the blur event if the input is disabled too quickly.
45
- // Reset from here to ensure that the element doesn't become stuck.
46
- if (this.focused) {
47
- this.focused = false;
48
- }
49
- this.stateChanges.next();
50
- }
51
- get id() {
52
- return this._id;
53
- }
54
- set id(value) {
55
- this._id = value || this.uid;
56
- }
57
- /**
58
- * Implemented as part of KbqFormFieldControl.
59
- * @docs-private
60
- */
61
- get required() {
62
- return this._required;
63
- }
64
- set required(value) {
65
- this._required = coerceBooleanProperty(value);
66
- }
67
- get format() {
68
- return this._format;
69
- }
70
- set format(formatValue) {
71
- this._format =
72
- Object.keys(TimeFormats)
73
- .map((timeFormatKey) => TimeFormats[timeFormatKey])
74
- .indexOf(formatValue) > -1
75
- ? formatValue
76
- : DEFAULT_TIME_FORMAT;
77
- if (this.defaultPlaceholder) {
78
- this._placeholder = this.timeFormatPlaceholder;
79
- }
80
- if (this.value) {
81
- this.updateView();
82
- }
83
- }
84
- get min() {
85
- return this._min;
86
- }
87
- set min(value) {
88
- this._min = this.getValidDateOrNull(this.dateAdapter.deserialize(value));
89
- this.validatorOnChange();
90
- }
91
- get max() {
92
- return this._max;
93
- }
94
- set max(value) {
95
- this._max = this.getValidDateOrNull(this.dateAdapter.deserialize(value));
96
- this.validatorOnChange();
97
- }
98
- get value() {
99
- return this._value;
100
- }
101
- set value(value) {
102
- const newValue = this.dateAdapter.deserialize(value);
103
- this.lastValueValid = !newValue || this.dateAdapter.isValid(newValue);
104
- this._value = this.getValidDateOrNull(newValue);
105
- this.updateView();
106
- }
107
- set kbqValidationTooltip(tooltip) {
108
- if (!tooltip) {
109
- return;
110
- }
111
- tooltip.enterDelay = validationTooltipShowDelay;
112
- tooltip.trigger = 'manual';
113
- tooltip.initListeners();
114
- this.incorrectInput.subscribe(() => {
115
- if (tooltip.isOpen) {
116
- return;
117
- }
118
- tooltip.show();
119
- setTimeout(() => tooltip.hide(), validationTooltipHideDelay);
120
- });
121
- }
122
- get hasSelection() {
123
- return this.selectionStart !== this.selectionEnd;
124
- }
125
- get isFullFormat() {
126
- return this.format === TimeFormats.HHmmss;
127
- }
128
- get isShortFormat() {
129
- return this.format === TimeFormats.HHmm;
130
- }
131
- get viewValue() {
132
- return this.elementRef.nativeElement.value;
133
- }
134
- get ngControl() {
135
- return this.control;
136
- }
137
- /**
138
- * Implemented as part of KbqFormFieldControl.
139
- * @docs-private
140
- */
141
- get empty() {
142
- return !this.viewValue && !this.isBadInput();
143
- }
144
- get selectionStart() {
145
- return this.elementRef.nativeElement.selectionStart;
146
- }
147
- set selectionStart(value) {
148
- this.elementRef.nativeElement.selectionStart = value;
149
- }
150
- get selectionEnd() {
151
- return this.elementRef.nativeElement.selectionEnd;
152
- }
153
- set selectionEnd(value) {
154
- this.elementRef.nativeElement.selectionEnd = value;
155
- }
156
- /** Localized placeholder */
157
- get timeFormatPlaceholder() {
158
- return (this.localeService?.getParams('timepicker')?.placeholder[TimeFormatToLocaleKeys[this.format]] ||
159
- TIMEFORMAT_PLACEHOLDERS[this.format]);
160
- }
161
- constructor(elementRef, renderer, dateAdapter, localeService) {
162
- this.elementRef = elementRef;
163
- this.renderer = renderer;
164
- this.dateAdapter = dateAdapter;
165
- this.localeService = localeService;
166
- /**
167
- * Implemented as part of KbqFormFieldControl.
168
- * @docs-private
169
- */
170
- this.stateChanges = new Subject();
171
- /**
172
- * Implemented as part of KbqFormFieldControl.
173
- * @docs-private
174
- */
175
- this.focused = false;
176
- /**
177
- * Implemented as part of KbqFormFieldControl.
178
- * @docs-private
179
- */
180
- this.controlType = 'timepicker';
181
- this._placeholder = TIMEFORMAT_PLACEHOLDERS[DEFAULT_TIME_FORMAT];
182
- this._format = DEFAULT_TIME_FORMAT;
183
- this._min = null;
184
- this._max = null;
185
- this.incorrectInput = new EventEmitter();
186
- this.uid = `kbq-timepicker-${uniqueComponentIdSuffix++}`;
187
- this.lastValueValid = false;
188
- this.defaultPlaceholder = true;
189
- this.separator = ':';
190
- this.localeSubscription = Subscription.EMPTY;
191
- this.onInput = () => {
192
- const formattedValue = this.formatUserInput(this.viewValue);
193
- const newTimeObj = this.getDateFromTimeString(formattedValue);
194
- this.lastValueValid = !!newTimeObj;
195
- if (!newTimeObj) {
196
- if (!this.viewValue) {
197
- this.onChange(null);
198
- }
199
- else {
200
- this.control.updateValueAndValidity();
201
- }
202
- return;
203
- }
204
- const selectionStart = this.selectionStart;
205
- const selectionEnd = this.selectionEnd;
206
- this.setViewValue(this.getTimeStringFromDate(newTimeObj, this.format));
207
- this.selectionStart = selectionStart;
208
- this.selectionEnd = selectionEnd;
209
- this.createSelectionOfTimeComponentInInput(selectionStart + 1);
210
- this.value = newTimeObj;
211
- this.onChange(newTimeObj);
212
- this.stateChanges.next();
213
- };
214
- this.parseValidator = () => {
215
- return this.focused || this.empty || this.lastValueValid
216
- ? null
217
- : { kbqTimepickerParse: { text: this.viewValue } };
218
- };
219
- this.minValidator = (control) => {
220
- const controlValue = this.getValidDateOrNull(this.dateAdapter.deserialize(control.value));
221
- return !this.min || !controlValue || this.dateAdapter.compareDateTime(this.min, controlValue) <= 0
222
- ? null
223
- : { kbqTimepickerLowerThenMin: { min: this.min, actual: controlValue } };
224
- };
225
- this.maxValidator = (control) => {
226
- const controlValue = this.getValidDateOrNull(this.dateAdapter.deserialize(control.value));
227
- return !this.max || !controlValue || this.dateAdapter.compareDateTime(this.max, controlValue) >= 0
228
- ? null
229
- : { kbqTimepickerHigherThenMax: { max: this.max, actual: controlValue } };
230
- };
231
- this.validatorOnChange = () => { };
232
- this.updateLocaleParams = () => {
233
- if (!this.defaultPlaceholder)
234
- return;
235
- // update via private property instead of setter to save it as default placeholder
236
- this._placeholder = this.timeFormatPlaceholder;
237
- // update value so view value will be also updated
238
- this.value = this._value;
239
- };
240
- if (!this.dateAdapter) {
241
- throw Error(`KbqTimepicker: No provider found for DateAdapter. You must import one of the existing ` +
242
- `modules at your application root or provide a custom implementation or use exists ones.`);
243
- }
244
- this.validator = Validators.compose([this.parseValidator, this.minValidator, this.maxValidator]);
245
- this.onChange = noop;
246
- // Force setter to be called in case id was not specified.
247
- this.id = this.id;
248
- this.localeSubscription = dateAdapter.localeChanges.subscribe(this.updateLocaleParams);
249
- }
250
- ngOnDestroy() {
251
- this.stateChanges.complete();
252
- this.localeSubscription.unsubscribe();
253
- }
254
- getSize() {
255
- return this.isFullFormat ? fullFormatSize : shortFormatSize;
256
- }
257
- focus() {
258
- this.elementRef.nativeElement.focus();
259
- }
260
- focusChanged(isFocused) {
261
- if (isFocused !== this.focused) {
262
- this.focused = isFocused;
263
- this.onTouched();
264
- this.stateChanges.next();
265
- }
266
- }
267
- onBlur() {
268
- this.focusChanged(false);
269
- if (this.viewValue === this.getTimeStringFromDate(this.value, this.format)) {
270
- return;
271
- }
272
- this.setViewValue(this.formatUserPaste(this.viewValue));
273
- this.onInput();
274
- }
275
- onPaste($event) {
276
- $event.preventDefault();
277
- const value = this.formatUserPaste($event.clipboardData.getData('text'));
278
- const newTimeObj = this.getDateFromTimeString(value);
279
- if (!newTimeObj) {
280
- return;
281
- }
282
- this.setViewValue(this.getTimeStringFromDate(newTimeObj, this.format));
283
- this.value = newTimeObj;
284
- this.onChange(newTimeObj);
285
- this.stateChanges.next();
286
- }
287
- /**
288
- * Implemented as part of KbqFormFieldControl.
289
- * @docs-private
290
- */
291
- onContainerClick() {
292
- this.focus();
293
- }
294
- onKeyDown(event) {
295
- const keyCode = event.keyCode;
296
- if (isLetterKey(event) && !event.ctrlKey && !event.metaKey) {
297
- event.preventDefault();
298
- this.incorrectInput.emit();
299
- }
300
- else if ((hasModifierKey(event) && (isVerticalMovement(event) || isHorizontalMovement(event))) ||
301
- event.ctrlKey ||
302
- event.metaKey ||
303
- [DELETE, BACKSPACE, TAB].includes(keyCode)) {
304
- noop();
305
- }
306
- else if (keyCode === SPACE) {
307
- this.spaceKeyHandler(event);
308
- }
309
- else if ([HOME, PAGE_UP].includes(keyCode)) {
310
- this.createSelectionOfTimeComponentInInput(0);
311
- }
312
- else if ([END, PAGE_DOWN].includes(keyCode)) {
313
- this.createSelectionOfTimeComponentInInput(this.viewValue.length);
314
- }
315
- else if ([UP_ARROW, DOWN_ARROW].includes(keyCode)) {
316
- event.preventDefault();
317
- this.verticalArrowKeyHandler(keyCode);
318
- }
319
- else if ([LEFT_ARROW, RIGHT_ARROW].includes(keyCode)) {
320
- this.horizontalArrowKeyHandler(keyCode);
321
- }
322
- else if (/^\D$/.test(event.key)) {
323
- event.preventDefault();
324
- const newValue = this.getNewValue(event.key, this.selectionStart);
325
- const formattedValue = this.replaceSymbols(newValue);
326
- if (newValue !== formattedValue) {
327
- this.setViewValue(formattedValue);
328
- setTimeout(this.onInput);
329
- }
330
- else {
331
- this.incorrectInput.emit();
332
- }
333
- }
334
- else {
335
- setTimeout(this.onInput);
336
- }
337
- }
338
- validate(control) {
339
- this.setControl(control);
340
- return this.validator ? this.validator(control) : null;
341
- }
342
- registerOnValidatorChange(fn) {
343
- this.validatorOnChange = fn;
344
- }
345
- writeValue(value) {
346
- this.value = value;
347
- }
348
- registerOnChange(fn) {
349
- this.onChange = fn;
350
- }
351
- registerOnTouched(fn) {
352
- this.onTouched = fn;
353
- }
354
- setDisabledState(isDisabled) {
355
- this.disabled = isDisabled;
356
- }
357
- formatUserPaste(value) {
358
- if (value.match(AM_PM_FORMAT_REGEXP)) {
359
- return value;
360
- }
361
- const match = value.match(/^(\D+)?(?<hours>\d+)?(\D+)?(\D+)?(?<minutes>\d+)?(\D+)?(\D+)?(?<seconds>\d+)?(\D+)?$/);
362
- if (!match?.groups?.hours) {
363
- this.setViewValue(value);
364
- return value;
365
- }
366
- return this.replaceNumbers(Object.values(match.groups)
367
- .map((group) => (group || '').padStart(2, '0'))
368
- .join(':'));
369
- }
370
- formatUserInput(value) {
371
- return this.replaceNumbers(this.replaceSymbols(value));
372
- }
373
- replaceSymbols(value) {
374
- let formattedValue = value;
375
- const match = value.match(/^(\d\d:){0,2}(?<number>[0-9])(?<symbol>\W)(:\d\d){0,2}$/);
376
- if (match?.groups) {
377
- const { number, symbol } = match.groups;
378
- formattedValue = value.replace(number + symbol, `0${number}`);
379
- }
380
- return formattedValue;
381
- }
382
- replaceNumbers(value) {
383
- let formattedValue = value;
384
- const match = value.match(/^(?<hours>\d{0,4}):?(?<minutes>\d{0,4}):?(?<seconds>\d{0,4})$/);
385
- if (match?.groups) {
386
- const { hours, minutes, seconds } = match.groups;
387
- if (hours.length && parseInt(hours) > HOURS_PER_DAY) {
388
- formattedValue = formattedValue.replace(hours, HOURS_PER_DAY.toString());
389
- }
390
- if (minutes.length && parseInt(minutes) > MINUTES_PER_HOUR) {
391
- formattedValue = formattedValue.replace(minutes, MINUTES_PER_HOUR.toString());
392
- }
393
- if (seconds.length && parseInt(seconds) > SECONDS_PER_MINUTE) {
394
- formattedValue = formattedValue.replace(seconds, SECONDS_PER_MINUTE.toString());
395
- }
396
- }
397
- return formattedValue;
398
- }
399
- /** Checks whether the input is invalid based on the native validation. */
400
- isBadInput() {
401
- const validity = this.elementRef.nativeElement.validity;
402
- return validity && validity.badInput;
403
- }
404
- spaceKeyHandler(event) {
405
- event.preventDefault();
406
- if (this.selectionStart === this.selectionEnd) {
407
- const value = this.getNewValue(event.key, this.selectionStart);
408
- const formattedValue = this.replaceSymbols(value);
409
- if (value !== formattedValue) {
410
- this.setViewValue(formattedValue);
411
- setTimeout(this.onInput);
412
- }
413
- }
414
- else if (this.selectionStart !== this.selectionEnd) {
415
- let cursorPos = this.selectionStart;
416
- const nextDividerPos = this.viewValue.indexOf(':', cursorPos);
417
- cursorPos = nextDividerPos ? nextDividerPos + 1 : 0;
418
- this.createSelectionOfTimeComponentInInput(cursorPos);
419
- }
420
- }
421
- getNewValue(key, position) {
422
- return [this.viewValue.slice(0, position), key, this.viewValue.slice(position)].join('');
423
- }
424
- verticalArrowKeyHandler(keyCode) {
425
- if (!this.value) {
426
- return;
427
- }
428
- let changedTime;
429
- const newEditParams = this.getTimeEditMetrics(this.selectionStart);
430
- if (keyCode === UP_ARROW) {
431
- changedTime = this.incrementTime(this.value, newEditParams.modifiedTimePart);
432
- }
433
- if (keyCode === DOWN_ARROW) {
434
- changedTime = this.decrementTime(this.value, newEditParams.modifiedTimePart);
435
- }
436
- this.value = changedTime;
437
- this.selectionStart = newEditParams.cursorStartPosition;
438
- this.selectionEnd = newEditParams.cursorEndPosition;
439
- this.onChange(changedTime);
440
- this.stateChanges.next();
441
- }
442
- fixEmptyDigit() {
443
- const hasEmptyDigit = this.viewValue
444
- .split(this.separator)
445
- .map((part) => part.length)
446
- .some((item) => !item);
447
- if (hasEmptyDigit && this.value) {
448
- this.value = this.dateAdapter.clone(this.value);
449
- }
450
- }
451
- horizontalArrowKeyHandler(keyCode) {
452
- if (!this.value) {
453
- return;
454
- }
455
- let cursorPos = this.selectionStart;
456
- if (keyCode === LEFT_ARROW) {
457
- this.fixEmptyDigit();
458
- cursorPos = cursorPos === 0 ? this.viewValue.length : cursorPos - 1;
459
- }
460
- else if (keyCode === RIGHT_ARROW) {
461
- this.fixEmptyDigit();
462
- const nextDividerPos = this.viewValue.indexOf(':', cursorPos);
463
- cursorPos = nextDividerPos ? nextDividerPos + 1 : 0;
464
- }
465
- this.createSelectionOfTimeComponentInInput(cursorPos);
466
- }
467
- createSelectionOfTimeComponentInInput(cursorPos) {
468
- setTimeout(() => {
469
- const newEditParams = this.getTimeEditMetrics(cursorPos);
470
- this.selectionStart = newEditParams.cursorStartPosition;
471
- this.selectionEnd = newEditParams.cursorEndPosition;
472
- });
473
- }
474
- incrementTime(dateVal, whatToIncrement = TimeParts.seconds) {
475
- let hours = this.dateAdapter.getHours(dateVal);
476
- let minutes = this.dateAdapter.getMinutes(dateVal);
477
- let seconds = this.dateAdapter.getSeconds(dateVal);
478
- switch (whatToIncrement) {
479
- case TimeParts.hours:
480
- hours++;
481
- break;
482
- case TimeParts.minutes:
483
- minutes++;
484
- break;
485
- case TimeParts.seconds:
486
- seconds++;
487
- break;
488
- default:
489
- }
490
- if (seconds > SECONDS_PER_MINUTE) {
491
- seconds = 0;
492
- }
493
- if (minutes > MINUTES_PER_HOUR) {
494
- minutes = 0;
495
- }
496
- if (hours > HOURS_PER_DAY) {
497
- hours = 0;
498
- }
499
- return this.dateAdapter.createDateTime(this.dateAdapter.getYear(this.value), this.dateAdapter.getMonth(this.value), this.dateAdapter.getDate(this.value), hours, minutes, seconds, this.dateAdapter.getMilliseconds(this.value));
500
- }
501
- decrementTime(dateVal, whatToDecrement = TimeParts.seconds) {
502
- let hours = this.dateAdapter.getHours(dateVal);
503
- let minutes = this.dateAdapter.getMinutes(dateVal);
504
- let seconds = this.dateAdapter.getSeconds(dateVal);
505
- switch (whatToDecrement) {
506
- case TimeParts.hours:
507
- hours--;
508
- break;
509
- case TimeParts.minutes:
510
- minutes--;
511
- break;
512
- case TimeParts.seconds:
513
- seconds--;
514
- break;
515
- default:
516
- }
517
- if (seconds < 0) {
518
- seconds = SECONDS_PER_MINUTE;
519
- }
520
- if (minutes < 0) {
521
- minutes = MINUTES_PER_HOUR;
522
- }
523
- if (hours < 0) {
524
- hours = HOURS_PER_DAY;
525
- }
526
- return this.dateAdapter.createDateTime(this.dateAdapter.getYear(this.value), this.dateAdapter.getMonth(this.value), this.dateAdapter.getDate(this.value), hours, minutes, seconds, this.dateAdapter.getMilliseconds(this.value));
527
- }
528
- /**
529
- * @description Get params for arrow-keys (up/down) time value edit.
530
- * @param cursorPosition Current cursor position in timeString
531
- */
532
- getTimeEditMetrics(cursorPosition) {
533
- const timeString = this.viewValue;
534
- let modifiedTimePart;
535
- let cursorStartPosition;
536
- let cursorEndPosition;
537
- const hoursIndex = 0;
538
- const minutesIndex = timeString.indexOf(':', hoursIndex + 1);
539
- const secondsIndex = minutesIndex !== -1 ? timeString.indexOf(':', minutesIndex + 1) : -1;
540
- if (secondsIndex !== -1 && cursorPosition > secondsIndex) {
541
- modifiedTimePart = TimeParts.seconds;
542
- cursorStartPosition = secondsIndex + 1;
543
- cursorEndPosition = timeString.length;
544
- }
545
- else if (minutesIndex !== -1 && cursorPosition > minutesIndex) {
546
- modifiedTimePart = TimeParts.minutes;
547
- cursorStartPosition = minutesIndex + 1;
548
- cursorEndPosition = secondsIndex > -1 ? secondsIndex : timeString.length;
549
- }
550
- else {
551
- modifiedTimePart = TimeParts.hours;
552
- cursorStartPosition = hoursIndex;
553
- cursorEndPosition = minutesIndex !== -1 ? minutesIndex : timeString.length;
554
- }
555
- return { modifiedTimePart, cursorStartPosition, cursorEndPosition };
556
- }
557
- /**
558
- * @description Create time string for displaying inside input element of UI
559
- */
560
- getTimeStringFromDate(value, timeFormat) {
561
- if (!value || !this.dateAdapter.isValid(value)) {
562
- return '';
563
- }
564
- return this.dateAdapter.format(value, timeFormat);
565
- }
566
- getDateFromTimeString(timeString) {
567
- if (!timeString) {
568
- return null;
569
- }
570
- const date = this.value || this.dateAdapter.today();
571
- const HMS = timeString.match(HOURS_MINUTES_SECONDS_REGEXP);
572
- const HM = timeString.match(HOURS_MINUTES_REGEXP);
573
- const H = timeString.match(HOURS_ONLY_REGEXP);
574
- const amPm = timeString.match(AM_PM_FORMAT_REGEXP);
575
- let hours = 0;
576
- let minutes = 0;
577
- let seconds = 0;
578
- if (amPm) {
579
- hours = Number(amPm[1]);
580
- minutes = Number(amPm[2]);
581
- if (/[p]/i.test(amPm[3]) || (/[a]/i.test(amPm[3]) && hours === 12)) {
582
- hours += 12;
583
- }
584
- }
585
- else if (HMS && this.isShortFormat) {
586
- hours = Number(HMS[1]);
587
- minutes = Number(HMS[2]);
588
- seconds = this.dateAdapter.getSeconds(date);
589
- }
590
- else if (HMS) {
591
- hours = Number(HMS[1]);
592
- minutes = Number(HMS[2]);
593
- seconds = Number(HMS[3]);
594
- }
595
- else if (HM) {
596
- hours = Number(HM[1]);
597
- minutes = Number(HM[2]);
598
- }
599
- else if (H) {
600
- hours = Number(H[1]);
601
- }
602
- else {
603
- return null;
604
- }
605
- const resultDate = this.dateAdapter.createDateTime(this.dateAdapter.getYear(date), this.dateAdapter.getMonth(date), this.dateAdapter.getDate(date), hours, minutes || 0, seconds || 0, this.dateAdapter.getMilliseconds(date));
606
- return this.getValidDateOrNull(resultDate);
607
- }
608
- getValidDateOrNull(obj) {
609
- return this.dateAdapter.isDateInstance(obj) && this.dateAdapter.isValid(obj) ? obj : null;
610
- }
611
- setViewValue(value) {
612
- this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);
613
- }
614
- updateView() {
615
- const formattedValue = this.getTimeStringFromDate(this.value, this.format);
616
- this.setViewValue(formattedValue);
617
- }
618
- setControl(control) {
619
- if (this.control) {
620
- return;
621
- }
622
- this.control = control;
623
- this.control.valueChanges.subscribe((value) => (this._value = value));
624
- }
625
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbqTimepicker, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.DateAdapter, optional: true }, { token: KBQ_LOCALE_SERVICE, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
626
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: KbqTimepicker, selector: "input[kbqTimepicker]", inputs: { placeholder: "placeholder", disabled: "disabled", id: "id", required: "required", format: "format", min: "min", max: "max", value: "value", kbqValidationTooltip: "kbqValidationTooltip" }, outputs: { incorrectInput: "incorrectInput" }, host: { listeners: { "blur": "onBlur()", "focus": "focusChanged(true)", "paste": "onPaste($event)", "keydown": "onKeyDown($event)" }, properties: { "attr.id": "id", "attr.placeholder": "placeholder", "attr.disabled": "disabled || null", "attr.required": "required", "attr.size": "getSize()", "attr.autocomplete": "\"off\"" }, classAttribute: "kbq-input kbq-timepicker" }, providers: [
627
- KBQ_TIMEPICKER_VALIDATORS,
628
- KBQ_TIMEPICKER_VALUE_ACCESSOR,
629
- { provide: KbqFormFieldControl, useExisting: KbqTimepicker }
630
- ], exportAs: ["kbqTimepicker"], ngImport: i0 }); }
631
- }
632
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KbqTimepicker, decorators: [{
633
- type: Directive,
634
- args: [{
635
- selector: 'input[kbqTimepicker]',
636
- exportAs: 'kbqTimepicker',
637
- host: {
638
- class: 'kbq-input kbq-timepicker',
639
- // Native input properties that are overwritten by Angular inputs need to be synced with
640
- // the native input element. Otherwise property bindings for those don't work.
641
- '[attr.id]': 'id',
642
- '[attr.placeholder]': 'placeholder',
643
- '[attr.disabled]': 'disabled || null',
644
- '[attr.required]': 'required',
645
- '[attr.size]': 'getSize()',
646
- '[attr.autocomplete]': '"off"',
647
- '(blur)': 'onBlur()',
648
- '(focus)': 'focusChanged(true)',
649
- '(paste)': 'onPaste($event)',
650
- '(keydown)': 'onKeyDown($event)'
651
- },
652
- providers: [
653
- KBQ_TIMEPICKER_VALIDATORS,
654
- KBQ_TIMEPICKER_VALUE_ACCESSOR,
655
- { provide: KbqFormFieldControl, useExisting: KbqTimepicker }
656
- ]
657
- }]
658
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.DateAdapter, decorators: [{
659
- type: Optional
660
- }] }, { type: i1.KbqLocaleService, decorators: [{
661
- type: Optional
662
- }, {
663
- type: Inject,
664
- args: [KBQ_LOCALE_SERVICE]
665
- }] }], propDecorators: { placeholder: [{
666
- type: Input
667
- }], disabled: [{
668
- type: Input
669
- }], id: [{
670
- type: Input
671
- }], required: [{
672
- type: Input
673
- }], format: [{
674
- type: Input
675
- }], min: [{
676
- type: Input
677
- }], max: [{
678
- type: Input
679
- }], value: [{
680
- type: Input
681
- }], kbqValidationTooltip: [{
682
- type: Input
683
- }], incorrectInput: [{
684
- type: Output
685
- }] } });
686
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21wb25lbnRzL3RpbWVwaWNrZXIvdGltZXBpY2tlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHSCxhQUFhLEVBQ2IsaUJBQWlCLEVBSWpCLFVBQVUsRUFDYixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDSCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFVBQVUsRUFDVixHQUFHLEVBQ0gsY0FBYyxFQUNkLElBQUksRUFDSixvQkFBb0IsRUFDcEIsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxXQUFXLEVBQ1gsS0FBSyxFQUNMLEdBQUcsRUFDSCxRQUFRLEVBQ1gsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0gsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUM3QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVuRCxPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsNEJB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QUFROzswQkFBSSxNQUFNOzJCQUFDLGtCQUFrQjt5Q0ExTnRDLFdBQVc7c0JBRGQsS0FBSztnQkFjRixRQUFRO3NCQURYLEtBQUs7Z0JBb0JGLEVBQUU7c0JBREwsS0FBSztnQkFnQkYsUUFBUTtzQkFEWCxLQUFLO2dCQVlGLE1BQU07c0JBRFQsS0FBSztnQkF5QkYsR0FBRztzQkFETixLQUFLO2dCQWFGLEdBQUc7c0JBRE4sS0FBSztnQkFhRixLQUFLO3NCQURSLEtBQUs7Z0JBa0JGLG9CQUFvQjtzQkFEdkIsS0FBSztnQkFzQmEsY0FBYztzQkFBaEMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIE5HX1ZBTElEQVRPUlMsXG4gICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgVmFsaWRhdGlvbkVycm9ycyxcbiAgICBWYWxpZGF0b3IsXG4gICAgVmFsaWRhdG9yRm4sXG4gICAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICAgIEJBQ0tTUEFDRSxcbiAgICBERUxFVEUsXG4gICAgRE9XTl9BUlJPVyxcbiAgICBFTkQsXG4gICAgaGFzTW9kaWZpZXJLZXksXG4gICAgSE9NRSxcbiAgICBpc0hvcml6b250YWxNb3ZlbWVudCxcbiAgICBpc0xldHRlcktleSxcbiAgICBpc1ZlcnRpY2FsTW92ZW1lbnQsXG4gICAgTEVGVF9BUlJPVyxcbiAgICBQQUdFX0RPV04sXG4gICAgUEFHRV9VUCxcbiAgICBSSUdIVF9BUlJPVyxcbiAgICBTUEFDRSxcbiAgICBUQUIsXG4gICAgVVBfQVJST1dcbn0gZnJvbSAnQGtvb2JpcS9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHtcbiAgICBEYXRlQWRhcHRlcixcbiAgICBLQlFfTE9DQUxFX1NFUlZJQ0UsXG4gICAgS2JxTG9jYWxlU2VydmljZSxcbiAgICB2YWxpZGF0aW9uVG9vbHRpcEhpZGVEZWxheSxcbiAgICB2YWxpZGF0aW9uVG9vbHRpcFNob3dEZWxheVxufSBmcm9tICdAa29vYmlxL2NvbXBvbmVudHMvY29yZSc7XG5pbXBvcnQgeyBLYnFGb3JtRmllbGRDb250cm9sIH0gZnJvbSAnQGtvb2JpcS9jb21wb25lbnRzL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgS2JxV2FybmluZ1Rvb2x0aXBUcmlnZ2VyIH0gZnJvbSAnQGtvb2JpcS9jb21wb25lbnRzL3Rvb2x0aXAnO1xuaW1wb3J0IHsgbm9vcCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gICAgQU1fUE1fRk9STUFUX1JFR0VYUCxcbiAgICBERUZBVUxUX1RJTUVfRk9STUFULFxuICAgIEhPVVJTX01JTlVURVNfUkVHRVhQLFxuICAgIEhPVVJTX01JTlVURVNfU0VDT05EU19SRUdFWFAsXG4gICAgSE9VUlNfT05MWV9SRUdFWFAsXG4gICAgSE9VUlNfUEVSX0RBWSxcbiAgICBNSU5VVEVTX1BFUl9IT1VSLFxuICAgIFNFQ09ORFNfUEVSX01JTlVURSxcbiAgICBUSU1FRk9STUFUX1BMQUNFSE9MREVSUyxcbiAgICBUaW1lRm9ybWF0cyxcbiAgICBUaW1lRm9ybWF0VG9Mb2NhbGVLZXlzLFxuICAgIFRpbWVQYXJ0c1xufSBmcm9tICcuL3RpbWVwaWNrZXIuY29uc3RhbnRzJztcblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBjb25zdCBLQlFfVElNRVBJQ0tFUl9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEticVRpbWVwaWNrZXIpLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG4vKiogQGRvY3MtcHJpdmF0ZSAqL1xuZXhwb3J0IGNvbnN0IEtCUV9USU1FUElDS0VSX1ZBTElEQVRPUlM6IGFueSA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEticVRpbWVwaWNrZXIpLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG5sZXQgdW5pcXVlQ29tcG9uZW50SWRTdWZmaXg6IG51bWJlciA9IDA7XG5cbmNvbnN0IHNob3J0Rm9ybWF0U2l6ZTogbnVtYmVyID0gNTtcbmNvbnN0IGZ1bGxGb3JtYXRTaXplOiBudW1iZXIgPSA4O1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ2lucHV0W2ticVRpbWVwaWNrZXJdJyxcbiAgICBleHBvcnRBczogJ2ticVRpbWVwaWNrZXInLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdrYnEtaW5wdXQga2JxLXRpbWVwaWNrZXInLFxuICAgICAgICAvLyBOYXRpdmUgaW5wdXQgcHJvcGVydGllcyB0aGF0IGFyZSBvdmVyd3JpdHRlbiBieSBBbmd1bGFyIGlucHV0cyBuZWVkIHRvIGJlIHN5bmNlZCB3aXRoXG4gICAgICAgIC8vIHRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudC4gT3RoZXJ3aXNlIHByb3BlcnR5IGJpbmRpbmdzIGZvciB0aG9zZSBkb24ndCB3b3JrLlxuICAgICAgICAnW2F0dHIuaWRdJzogJ2lkJyxcbiAgICAgICAgJ1thdHRyLnBsYWNlaG9sZGVyXSc6ICdwbGFjZWhvbGRlcicsXG4gICAgICAgICdbYXR0ci5kaXNhYmxlZF0nOiAnZGlzYWJsZWQgfHwgbnVsbCcsXG4gICAgICAgICdbYXR0ci5yZXF1aXJlZF0nOiAncmVxdWlyZWQnLFxuICAgICAgICAnW2F0dHIuc2l6ZV0nOiAnZ2V0U2l6ZSgpJyxcbiAgICAgICAgJ1thdHRyLmF1dG9jb21wbGV0ZV0nOiAnXCJvZmZcIicsXG5cbiAgICAgICAgJyhibHVyKSc6ICdvbkJsdXIoKScsXG4gICAgICAgICcoZm9jdXMpJzogJ2ZvY3VzQ2hhbmdlZCh0cnVlKScsXG5cbiAgICAgICAgJyhwYXN0ZSknOiAnb25QYXN0ZSgkZXZlbnQpJyxcblxuICAgICAgICAnKGtleWRvd24pJzogJ29uS2V5RG93bigkZXZlbnQpJ1xuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIEtCUV9USU1FUElDS0VSX1ZBTElEQVRPUlMsXG4gICAgICAgIEtCUV9USU1FUElDS0VSX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICB7IHByb3ZpZGU6IEticUZvcm1GaWVsZENvbnRyb2wsIHVzZUV4aXN0aW5nOiBLYnFUaW1lcGlja2VyIH1dXG59KVxuZXhwb3J0IGNsYXNzIEticVRpbWVwaWNrZXI8RD4gaW1wbGVtZW50cyBLYnFGb3JtRmllbGRDb250cm9sPEQ+LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yLCBPbkRlc3Ryb3kge1xuICAgIC8qKlxuICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgS2JxRm9ybUZpZWxkQ29udHJvbC5cbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgc3RhdGVDaGFuZ2VzOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIGVycm9yU3RhdGU6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIEticUZvcm1GaWVsZENvbnRyb2wuXG4gICAgICogQGRvY3MtcHJpdmF0ZVxuICAgICAqL1xuICAgIGZvY3VzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgS2JxRm9ybUZpZWxkQ29udHJvbC5cbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgY29udHJvbFR5cGU6IHN0cmluZyA9ICd0aW1lcGlja2VyJztcblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgS2JxRm9ybUZpZWxkQ29udHJvbC5cbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XG5cbiAgICAgICAgdGhpcy5kZWZhdWx0UGxhY2Vob2xkZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wbGFjZWhvbGRlciA9IFRJTUVGT1JNQVRfUExBQ0VIT0xERVJTW0RFRkFVTFRfVElNRV9GT1JNQVRdO1xuXG4gICAgQElucHV0KClcbiAgICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuXG4gICAgICAgIC8vIEJyb3dzZXJzIG1heSBub3QgZmlyZSB0aGUgYmx1ciBldmVudCBpZiB0aGUgaW5wdXQgaXMgZGlzYWJsZWQgdG9vIHF1aWNrbHkuXG4gICAgICAgIC8vIFJlc2V0IGZyb20gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgZWxlbWVudCBkb2Vzbid0IGJlY29tZSBzdHVjay5cbiAgICAgICAgaWYgKHRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKVxuICAgIGdldCBpZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgfVxuXG4gICAgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5faWQgPSB2YWx1ZSB8fCB0aGlzLnVpZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBLYnFGb3JtRmllbGRDb250cm9sLlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICAgIH1cblxuICAgIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKVxuICAgIGdldCBmb3JtYXQoKTogVGltZUZvcm1hdHMge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0O1xuICAgIH1cblxuICAgIHNldCBmb3JtYXQoZm9ybWF0VmFsdWU6IFRpbWVGb3JtYXRzKSB7XG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhUaW1lRm9ybWF0cylcbiAgICAgICAgICAgICAgICAubWFwKCh0aW1lRm9ybWF0S2V5KSA9PiBUaW1lRm9ybWF0c1t0aW1lRm9ybWF0S2V5XSlcbiAgICAgICAgICAgICAgICAuaW5kZXhPZihmb3JtYXRWYWx1ZSkgPiAtMVxuICAgICAgICAgICAgICAgID8gZm9ybWF0VmFsdWVcbiAgICAgICAgICAgICAgICA6IERFRkFVTFRfVElNRV9GT1JNQVQ7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHRoaXMudGltZUZvcm1hdFBsYWNlaG9sZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZm9ybWF0OiBUaW1lRm9ybWF0cyA9IERFRkFVTFRfVElNRV9GT1JNQVQ7XG5cbiAgICBASW5wdXQoKVxuICAgIGdldCBtaW4oKTogRCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluO1xuICAgIH1cblxuICAgIHNldCBtaW4odmFsdWU6IEQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX21pbiA9IHRoaXMuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgICAgICAgdGhpcy52YWxpZGF0b3JPbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX21pbjogRCB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KClcbiAgICBnZXQgbWF4KCk6IEQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21heDtcbiAgICB9XG5cbiAgICBzZXQgbWF4KHZhbHVlOiBEIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9tYXggPSB0aGlzLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLmRhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgICAgIHRoaXMudmFsaWRhdG9yT25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9tYXg6IEQgfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHZhbHVlKCk6IEQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIHNldCB2YWx1ZSh2YWx1ZTogRCB8IG51bGwpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmRhdGVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKTtcblxuICAgICAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID0gIW5ld1ZhbHVlIHx8IHRoaXMuZGF0ZUFkYXB0ZXIuaXNWYWxpZChuZXdWYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLmdldFZhbGlkRGF0ZU9yTnVsbChuZXdWYWx1ZSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdmFsdWU6IEQgfCBudWxsO1xuXG4gICAgQElucHV0KClcbiAgICBzZXQga2JxVmFsaWRhdGlvblRvb2x0aXAodG9vbHRpcDogS2JxV2FybmluZ1Rvb2x0aXBUcmlnZ2VyKSB7XG4gICAgICAgIGlmICghdG9vbHRpcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9vbHRpcC5lbnRlckRlbGF5ID0gdmFsaWRhdGlvblRvb2x0aXBTaG93RGVsYXk7XG4gICAgICAgIHRvb2x0aXAudHJpZ2dlciA9ICdtYW51YWwnO1xuXG4gICAgICAgIHRvb2x0aXAuaW5pdExpc3RlbmVycygpO1xuXG4gICAgICAgIHRoaXMuaW5jb3JyZWN0SW5wdXQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0b29sdGlwLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG9vbHRpcC5zaG93KCk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdG9vbHRpcC5oaWRlKCksIHZhbGlkYXRpb25Ub29sdGlwSGlkZURlbGF5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGluY29ycmVjdElucHV0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgZ2V0IGhhc1NlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU3RhcnQgIT09IHRoaXMuc2VsZWN0aW9uRW5kO1xuICAgIH1cblxuICAgIGdldCBpc0Z1bGxGb3JtYXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdCA9PT0gVGltZUZvcm1hdHMuSEhtbXNzO1xuICAgIH1cblxuICAgIGdldCBpc1Nob3J0Rm9ybWF0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQgPT09IFRpbWVGb3JtYXRzLkhIbW07XG4gICAgfVxuXG4gICAgZ2V0IHZpZXdWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IG5nQ29udHJvbCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgS2JxRm9ybUZpZWxkQ29udHJvbC5cbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMudmlld1ZhbHVlICYmICF0aGlzLmlzQmFkSW5wdXQoKTtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0aW9uU3RhcnQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcbiAgICB9XG5cbiAgICBzZXQgc2VsZWN0aW9uU3RhcnQodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0aW9uRW5kKCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kO1xuICAgIH1cblxuICAgIHNldCBzZWxlY3Rpb25FbmQodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIExvY2FsaXplZCBwbGFjZWhvbGRlciAqL1xuICAgIGdldCB0aW1lRm9ybWF0UGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMubG9jYWxlU2VydmljZT8uZ2V0UGFyYW1zKCd0aW1lcGlja2VyJyk/LnBsYWNlaG9sZGVyW1RpbWVGb3JtYXRUb0xvY2FsZUtleXNbdGhpcy5mb3JtYXRdXSB8fFxuICAgICAgICAgICAgVElNRUZPUk1BVF9QTEFDRUhPTERFUlNbdGhpcy5mb3JtYXRdXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkb25seSB1aWQgPSBga2JxLXRpbWVwaWNrZXItJHt1bmlxdWVDb21wb25lbnRJZFN1ZmZpeCsrfWA7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcjogVmFsaWRhdG9yRm4gfCBudWxsO1xuXG4gICAgcHJpdmF0ZSBsYXN0VmFsdWVWYWxpZCA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w7XG5cbiAgICBwcml2YXRlIGRlZmF1bHRQbGFjZWhvbGRlciA9IHRydWU7XG4gICAgcHJpdmF0ZSBzZXBhcmF0b3IgPSAnOic7XG5cbiAgICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZDtcbiAgICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZDtcblxuICAgIHByaXZhdGUgbG9jYWxlU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxhbnk+LFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEtCUV9MT0NBTEVfU0VSVklDRSkgcHJpdmF0ZSBsb2NhbGVTZXJ2aWNlPzogS2JxTG9jYWxlU2VydmljZVxuICAgICkge1xuICAgICAgICBpZiAoIXRoaXMuZGF0ZUFkYXB0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgIGBLYnFUaW1lcGlja2VyOiBObyBwcm92aWRlciBmb3VuZCBmb3IgRGF0ZUFkYXB0ZXIuIFlvdSBtdXN0IGltcG9ydCBvbmUgb2YgdGhlIGV4aXN0aW5nIGAgK1xuICAgICAgICAgICAgICAgICAgICBgbW9kdWxlcyBhdCB5b3VyIGFwcGxpY2F0aW9uIHJvb3Qgb3IgcHJvdmlkZSBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvciB1c2UgZXhpc3RzIG9uZXMuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlKFt0aGlzLnBhcnNlVmFsaWRhdG9yLCB0aGlzLm1pblZhbGlkYXRvciwgdGhpcy5tYXhWYWxpZGF0b3JdKTtcblxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gbm9vcDtcblxuICAgICAgICAvLyBGb3JjZSBzZXR0ZXIgdG8gYmUgY2FsbGVkIGluIGNhc2UgaWQgd2FzIG5vdCBzcGVjaWZpZWQuXG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLmlkO1xuXG4gICAgICAgIHRoaXMubG9jYWxlU3Vic2NyaXB0aW9uID0gZGF0ZUFkYXB0ZXIubG9jYWxlQ2hhbmdlcy5zdWJzY3JpYmUodGhpcy51cGRhdGVMb2NhbGVQYXJhbXMpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmxvY2FsZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGdldFNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNGdWxsRm9ybWF0ID8gZnVsbEZvcm1hdFNpemUgOiBzaG9ydEZvcm1hdFNpemU7XG4gICAgfVxuXG4gICAgZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZm9jdXNDaGFuZ2VkKGlzRm9jdXNlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoaXNGb2N1c2VkICE9PSB0aGlzLmZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IGlzRm9jdXNlZDtcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNDaGFuZ2VkKGZhbHNlKTtcblxuICAgICAgICBpZiAodGhpcy52aWV3VmFsdWUgPT09IHRoaXMuZ2V0VGltZVN0cmluZ0Zyb21EYXRlKHRoaXMudmFsdWUsIHRoaXMuZm9ybWF0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRWaWV3VmFsdWUodGhpcy5mb3JtYXRVc2VyUGFzdGUodGhpcy52aWV3VmFsdWUpKTtcblxuICAgICAgICB0aGlzLm9uSW5wdXQoKTtcbiAgICB9XG5cbiAgICBvblBhc3RlKCRldmVudCkge1xuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZm9ybWF0VXNlclBhc3RlKCRldmVudC5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKSk7XG5cbiAgICAgICAgY29uc3QgbmV3VGltZU9iaiA9IHRoaXMuZ2V0RGF0ZUZyb21UaW1lU3RyaW5nKHZhbHVlKTtcblxuICAgICAgICBpZiAoIW5ld1RpbWVPYmopIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKHRoaXMuZ2V0VGltZVN0cmluZ0Zyb21EYXRlKG5ld1RpbWVPYmosIHRoaXMuZm9ybWF0KSk7XG5cbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1RpbWVPYmo7XG4gICAgICAgIHRoaXMub25DaGFuZ2UobmV3VGltZU9iaik7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG5cbiAgICBvbklucHV0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMuZm9ybWF0VXNlcklucHV0KHRoaXMudmlld1ZhbHVlKTtcblxuICAgICAgICBjb25zdCBuZXdUaW1lT2JqID0gdGhpcy5nZXREYXRlRnJvbVRpbWVTdHJpbmcoZm9ybWF0dGVkVmFsdWUpO1xuXG4gICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSAhIW5ld1RpbWVPYmo7XG5cbiAgICAgICAgaWYgKCFuZXdUaW1lT2JqKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmlld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhcnQgPSB0aGlzLnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25FbmQgPSB0aGlzLnNlbGVjdGlvbkVuZDtcblxuICAgICAgICB0aGlzLnNldFZpZXdWYWx1ZSh0aGlzLmdldFRpbWVTdHJpbmdGcm9tRGF0ZShuZXdUaW1lT2JqLCB0aGlzLmZvcm1hdCkpO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydDtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQ7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVTZWxlY3Rpb25PZlRpbWVDb21wb25lbnRJbklucHV0KChzZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpICsgMSk7XG5cbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1RpbWVPYmo7XG4gICAgICAgIHRoaXMub25DaGFuZ2UobmV3VGltZU9iaik7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBLYnFGb3JtRmllbGRDb250cm9sLlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICBvbkNvbnRhaW5lckNsaWNrKCkge1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuXG4gICAgICAgIGlmIChpc0xldHRlcktleShldmVudCkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0SW5wdXQuZW1pdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgKGhhc01vZGlmaWVyS2V5KGV2ZW50KSAmJiAoaXNWZXJ0aWNhbE1vdmVtZW50KGV2ZW50KSB8fCBpc0hvcml6b250YWxNb3ZlbWVudChldmVudCkpKSB8fFxuICAgICAgICAgICAgZXZlbnQuY3RybEtleSB8fFxuICAgICAgICAgICAgZXZlbnQubWV0YUtleSB8fFxuICAgICAgICAgICAgW0RFTEVURSwgQkFDS1NQQUNFLCBUQUJdLmluY2x1ZGVzKGtleUNvZGUpXG4gICAgICAgICkge1xuICAgICAgICAgICAgbm9vcCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IFNQQUNFKSB7XG4gICAgICAgICAgICB0aGlzLnNwYWNlS2V5SGFuZGxlcihldmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoW0hPTUUsIFBBR0VfVVBdLmluY2x1ZGVzKGtleUNvZGUpKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVNlbGVjdGlvbk9mVGltZUNvbXBvbmVudEluSW5wdXQoMCk7XG4gICAgICAgIH0gZWxzZSBpZiAoW0VORCwgUEFHRV9ET1dOXS5pbmNsdWRlcyhrZXlDb2RlKSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVTZWxlY3Rpb25PZlRpbWVDb21wb25lbnRJbklucHV0KHRoaXMudmlld1ZhbHVlLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoW1VQX0FSUk9XLCBET1dOX0FSUk9XXS5pbmNsdWRlcyhrZXlDb2RlKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbEFycm93S2V5SGFuZGxlcihrZXlDb2RlKTtcbiAgICAgICAgfSBlbHNlIGlmIChbTEVGVF9BUlJPVywgUklHSFRfQVJST1ddLmluY2x1ZGVzKGtleUNvZGUpKSB7XG4gICAgICAgICAgICB0aGlzLmhvcml6b250YWxBcnJvd0tleUhhbmRsZXIoa2V5Q29kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoL15cXEQkLy50ZXN0KGV2ZW50LmtleSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5nZXROZXdWYWx1ZShldmVudC5rZXksIHRoaXMuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5yZXBsYWNlU3ltYm9scyhuZXdWYWx1ZSk7XG5cbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gZm9ybWF0dGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZpZXdWYWx1ZShmb3JtYXR0ZWRWYWx1ZSk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMub25JbnB1dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0SW5wdXQuZW1pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCh0aGlzLm9uSW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgICAgICB0aGlzLnNldENvbnRyb2woY29udHJvbCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yID8gdGhpcy52YWxpZGF0b3IoY29udHJvbCkgOiBudWxsO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWxpZGF0b3JPbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHdyaXRlVmFsdWUodmFsdWU6IEQgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IEQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0VXNlclBhc3RlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHZhbHVlLm1hdGNoKEFNX1BNX0ZPUk1BVF9SRUdFWFApKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSB8IG51bGwgPSB2YWx1ZS5tYXRjaChcbiAgICAgICAgICAgIC9eKFxcRCspPyg/PGhvdXJzPlxcZCspPyhcXEQrKT8oXFxEKyk/KD88bWludXRlcz5cXGQrKT8oXFxEKyk/KFxcRCspPyg/PHNlY29uZHM+XFxkKyk/KFxcRCspPyQvXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFtYXRjaD8uZ3JvdXBzPy5ob3Vycykge1xuICAgICAgICAgICAgdGhpcy5zZXRWaWV3VmFsdWUodmFsdWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTnVtYmVycyhcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMobWF0Y2guZ3JvdXBzKVxuICAgICAgICAgICAgICAgIC5tYXAoKGdyb3VwKSA9PiAoZ3JvdXAgfHwgJycpLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAgICAgICAgICAgLmpvaW4oJzonKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0VXNlcklucHV0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTnVtYmVycyh0aGlzLnJlcGxhY2VTeW1ib2xzKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXBsYWNlU3ltYm9scyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGZvcm1hdHRlZFZhbHVlOiBzdHJpbmcgPSB2YWx1ZTtcblxuICAgICAgICBjb25zdCBtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSB8IG51bGwgPSB2YWx1ZS5tYXRjaCgvXihcXGRcXGQ6KXswLDJ9KD88bnVtYmVyPlswLTldKSg/PHN5bWJvbD5cXFcpKDpcXGRcXGQpezAsMn0kLyk7XG5cbiAgICAgICAgaWYgKG1hdGNoPy5ncm91cHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbnVtYmVyLCBzeW1ib2wgfSA9IG1hdGNoLmdyb3VwcztcblxuICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG51bWJlciArIHN5bWJvbCwgYDAke251bWJlcn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXR0ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlcGxhY2VOdW1iZXJzKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgZm9ybWF0dGVkVmFsdWU6IHN0cmluZyA9IHZhbHVlO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbCA9IHZhbHVlLm1hdGNoKFxuICAgICAgICAgICAgL14oPzxob3Vycz5cXGR7MCw0fSk6Pyg/PG1pbnV0ZXM+XFxkezAsNH0pOj8oPzxzZWNvbmRzPlxcZHswLDR9KSQvXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKG1hdGNoPy5ncm91cHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgfSA9IG1hdGNoLmdyb3VwcztcblxuICAgICAgICAgICAgaWYgKGhvdXJzLmxlbmd0aCAmJiBwYXJzZUludChob3VycykgPiBIT1VSU19QRVJfREFZKSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZS5yZXBsYWNlKGhvdXJzLCBIT1VSU19QRVJfREFZLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWludXRlcy5sZW5ndGggJiYgcGFyc2VJbnQobWludXRlcykgPiBNSU5VVEVTX1BFUl9IT1VSKSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZS5yZXBsYWNlKG1pbnV0ZXMsIE1JTlVURVNfUEVSX0hPVVIudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWNvbmRzLmxlbmd0aCAmJiBwYXJzZUludChzZWNvbmRzKSA+IFNFQ09ORFNfUEVSX01JTlVURSkge1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlID0gZm9ybWF0dGVkVmFsdWUucmVwbGFjZShzZWNvbmRzLCBTRUNPTkRTX1BFUl9NSU5VVEUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0dGVkVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBpbnB1dCBpcyBpbnZhbGlkIGJhc2VkIG9uIHRoZSBuYXRpdmUgdmFsaWRhdGlvbi4gKi9cbiAgICBwcml2YXRlIGlzQmFkSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHZhbGlkaXR5ID0gKDxIVE1MSW5wdXRFbGVtZW50PnRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS52YWxpZGl0eTtcblxuICAgICAgICByZXR1cm4gdmFsaWRpdHkgJiYgdmFsaWRpdHkuYmFkSW5wdXQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzcGFjZUtleUhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TdGFydCA9PT0gdGhpcy5zZWxlY3Rpb25FbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXROZXdWYWx1ZShldmVudC5rZXksIHRoaXMuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5yZXBsYWNlU3ltYm9scyh2YWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gZm9ybWF0dGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZpZXdWYWx1ZShmb3JtYXR0ZWRWYWx1ZSk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMub25JbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25TdGFydCAhPT0gdGhpcy5zZWxlY3Rpb25FbmQpIHtcbiAgICAgICAgICAgIGxldCBjdXJzb3JQb3MgPSB0aGlzLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcjtcblxuICAgICAgICAgICAgY29uc3QgbmV4dERpdmlkZXJQb3M6IG51bWJlciA9IHRoaXMudmlld1ZhbHVlLmluZGV4T2YoJzonLCBjdXJzb3JQb3MpO1xuXG4gICAgICAgICAgICBjdXJzb3JQb3MgPSBuZXh0RGl2aWRlclBvcyA/IG5leHREaXZpZGVyUG9zICsgMSA6IDA7XG5cbiAgICAgICAgICAgIHRoaXMuY3JlYXRlU2VsZWN0aW9uT2ZUaW1lQ29tcG9uZW50SW5JbnB1dChjdXJzb3JQb3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROZXdWYWx1ZShrZXk6IHN0cmluZywgcG9zaXRpb246IG51bWJlcikge1xuICAgICAgICByZXR1cm4gW3RoaXMudmlld1ZhbHVlLnNsaWNlKDAsIHBvc2l0aW9uKSwga2V5LCB0aGlzLnZpZXdWYWx1ZS5zbGljZShwb3NpdGlvbildLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmVydGljYWxBcnJvd0tleUhhbmRsZXIoa2V5Q29kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNoYW5nZWRUaW1lO1xuXG4gICAgICAgIGNvbnN0IG5ld0VkaXRQYXJhbXMgPSB0aGlzLmdldFRpbWVFZGl0TWV0cmljcyh0aGlzLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcik7XG5cbiAgICAgICAgaWYgKGtleUNvZGUgPT09IFVQX0FSUk9XKSB7XG4gICAgICAgICAgICBjaGFuZ2VkVGltZSA9IHRoaXMuaW5jcmVtZW50VGltZSh0aGlzLnZhbHVlLCBuZXdFZGl0UGFyYW1zLm1vZGlmaWVkVGltZVBhcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleUNvZGUgPT09IERPV05fQVJST1cpIHtcbiAgICAgICAgICAgIGNoYW5nZWRUaW1lID0gdGhpcy5kZWNyZW1lbnRUaW1lKHRoaXMudmFsdWUsIG5ld0VkaXRQYXJhbXMubW9kaWZpZWRUaW1lUGFydCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhbHVlID0gY2hhbmdlZFRpbWU7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IG5ld0VkaXRQYXJhbXMuY3Vyc29yU3RhcnRQb3NpdGlvbjtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBuZXdFZGl0UGFyYW1zLmN1cnNvckVuZFBvc2l0aW9uO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2UoY2hhbmdlZFRpbWUpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaXhFbXB0eURpZ2l0KCkge1xuICAgICAgICBjb25zdCBoYXNFbXB0eURpZ2l0ID0gdGhpcy52aWV3VmFsdWVcbiAgICAgICAgICAgIC5zcGxpdCh0aGlzLnNlcGFyYXRvcilcbiAgICAgICAgICAgIC5tYXAoKHBhcnQpID0+IHBhcnQubGVuZ3RoKVxuICAgICAgICAgICAgLnNvbWUoKGl0ZW0pID0+ICFpdGVtKTtcblxuICAgICAgICBpZiAoaGFzRW1wdHlEaWdpdCAmJiB0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5kYXRlQWRhcHRlci5jbG9uZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaG9yaXpvbnRhbEFycm93S2V5SGFuZGxlcihrZXlDb2RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3Vyc29yUG9zID0gdGhpcy5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXI7XG5cbiAgICAgICAgaWYgKGtleUNvZGUgPT09IExFRlRfQVJST1cpIHtcbiAgICAgICAgICAgIHRoaXMuZml4RW1wdHlEaWdpdCgpO1xuXG4gICAgICAgICAgICBjdXJzb3JQb3MgPSBjdXJzb3JQb3MgPT09IDAgPyB0aGlzLnZpZXdWYWx1ZS5sZW5ndGggOiBjdXJzb3JQb3MgLSAxO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IFJJR0hUX0FSUk9XKSB7XG4gICAgICAgICAgICB0aGlzLmZpeEVtcHR5RGlnaXQoKTtcblxuICAgICAgICAgICAgY29uc3QgbmV4dERpdmlkZXJQb3M6IG51bWJlciA9IHRoaXMudmlld1ZhbHVlLmluZGV4T2YoJzonLCBjdXJzb3JQb3MpO1xuXG4gICAgICAgICAgICBjdXJzb3JQb3MgPSBuZXh0RGl2aWRlclBvcyA/IG5leHREaXZpZGVyUG9zICsgMSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNyZWF0ZVNlbGVjdGlvbk9mVGltZUNvbXBvbmVudEluSW5wdXQoY3Vyc29yUG9zKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVNlbGVjdGlvbk9mVGltZUNvbXBvbmVudEluSW5wdXQoY3Vyc29yUG9zOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdFZGl0UGFyYW1zID0gdGhpcy5nZXRUaW1lRWRpdE1ldHJpY3MoY3Vyc29yUG9zKTtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IG5ld0VkaXRQYXJhbXMuY3Vyc29yU3RhcnRQb3NpdGlvbjtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uRW5kID0gbmV3RWRpdFBhcmFtcy5jdXJzb3JFbmRQb3NpdGlvbjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNyZW1lbnRUaW1lKGRhdGVWYWw6IEQsIHdoYXRUb0luY3JlbWVudDogVGltZVBhcnRzID0gVGltZVBhcnRzLnNlY29uZHMpOiBEIHtcbiAgICAgICAgbGV0IGhvdXJzID0gdGhpcy5kYXRlQWRhcHRlci5nZXRIb3VycyhkYXRlVmFsKTtcbiAgICAgICAgbGV0IG1pbnV0ZXMgPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1pbnV0ZXMoZGF0ZVZhbCk7XG4gICAgICAgIGxldCBzZWNvbmRzID0gdGhpcy5kYXRlQWRhcHRlci5nZXRTZWNvbmRzKGRhdGVWYWwpO1xuXG4gICAgICAgIHN3aXRjaCAod2hhdFRvSW5jcmVtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFRpbWVQYXJ0cy5ob3VyczpcbiAgICAgICAgICAgICAgICBob3VycysrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBUaW1lUGFydHMubWludXRlczpcbiAgICAgICAgICAgICAgICBtaW51dGVzKys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRpbWVQYXJ0cy5zZWNvbmRzOlxuICAgICAgICAgICAgICAgIHNlY29uZHMrKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2Vjb25kcyA+IFNFQ09ORFNfUEVSX01JTlVURSkge1xuICAgICAgICAgICAgc2Vjb25kcyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWludXRlcyA+IE1JTlVURVNfUEVSX0hPVVIpIHtcbiAgICAgICAgICAgIG1pbnV0ZXMgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhvdXJzID4gSE9VUlNfUEVSX0RBWSkge1xuICAgICAgICAgICAgaG91cnMgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZVRpbWUoXG4gICAgICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIodGhpcy52YWx1ZSksXG4gICAgICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMudmFsdWUpLFxuICAgICAgICAgICAgdGhpcy5kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMudmFsdWUpLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgc2Vjb25kcyxcbiAgICAgICAgICAgIHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TWlsbGlzZWNvbmRzKHRoaXMudmFsdWUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWNyZW1lbnRUaW1lKGRhdGVWYWw6IEQsIHdoYXRUb0RlY3JlbWVudDogVGltZVBhcnRzID0gVGltZVBhcnRzLnNlY29uZHMpOiBEIHtcbiAgICAgICAgbGV0IGhvdXJzID0gdGhpcy5kYXRlQWRhcHRlci5nZXRIb3VycyhkYXRlVmFsKTtcbiAgICAgICAgbGV0IG1pbnV0ZXMgPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1pbnV0ZXMoZGF0ZVZhbCk7XG4gICAgICAgIGxldCBzZWNvbmRzID0gdGhpcy5kYXRlQWRhcHRlci5nZXRTZWNvbmRzKGRhdGVWYWwpO1xuXG4gICAgICAgIHN3aXRjaCAod2hhdFRvRGVjcmVtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFRpbWVQYXJ0cy5ob3VyczpcbiAgICAgICAgICAgICAgICBob3Vycy0tO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBUaW1lUGFydHMubWludXRlczpcbiAgICAgICAgICAgICAgICBtaW51dGVzLS07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRpbWVQYXJ0cy5zZWNvbmRzOlxuICAgICAgICAgICAgICAgIHNlY29uZHMtLTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2Vjb25kcyA8IDApIHtcbiAgICAgICAgICAgIHNlY29uZHMgPSBTRUNPTkRTX1BFUl9NSU5VVEU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWludXRlcyA8IDApIHtcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBNSU5VVEVTX1BFUl9IT1VSO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhvdXJzIDwgMCkge1xuICAgICAgICAgICAgaG91cnMgPSBIT1VSU19QRVJfREFZO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZVRpbWUoXG4gICAgICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIodGhpcy52YWx1ZSksXG4gICAgICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMudmFsdWUpLFxuICAgICAgICAgICAgdGhpcy5kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMudmFsdWUpLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgc2Vjb25kcyxcbiAgICAgICAgICAgIHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TWlsbGlzZWNvbmRzKHRoaXMudmFsdWUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEdldCBwYXJhbXMgZm9yIGFycm93LWtleXMgKHVwL2Rvd24pIHRpbWUgdmFsdWUgZWRpdC5cbiAgICAgKiBAcGFyYW0gY3Vyc29yUG9zaXRpb24gQ3VycmVudCBjdXJzb3IgcG9zaXRpb24gaW4gdGltZVN0cmluZ1xuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0VGltZUVkaXRNZXRyaWNzKGN1cnNvclBvc2l0aW9uOiBudW1iZXIpOiB7XG4gICAgICAgIG1vZGlmaWVkVGltZVBhcnQ6IFRpbWVQYXJ0cztcbiAgICAgICAgY3Vyc29yU3RhcnRQb3NpdGlvbjogbnVtYmVyO1xuICAgICAgICBjdXJzb3JFbmRQb3NpdGlvbjogbnVtYmVyO1xuICAgIH0ge1xuICAgICAgICBjb25zdCB0aW1lU3RyaW5nOiBzdHJpbmcgPSB0aGlzLnZpZXdWYWx1ZTtcbiAgICAgICAgbGV0IG1vZGlmaWVkVGltZVBhcnQ6IFRpbWVQYXJ0cztcbiAgICAgICAgbGV0IGN1cnNvclN0YXJ0UG9zaXRpb246IG51bWJlcjtcbiAgICAgICAgbGV0IGN1cnNvckVuZFBvc2l0aW9uOiBudW1iZXI7XG5cbiAgICAgICAgY29uc3QgaG91cnNJbmRleCA9IDA7XG4gICAgICAgIGNvbnN0IG1pbnV0ZXNJbmRleCA9IHRpbWVTdHJpbmcuaW5kZXhPZignOicsIGhvdXJzSW5kZXggKyAxKTtcbiAgICAgICAgY29uc3Qgc2Vjb25kc0luZGV4ID0gbWludXRlc0luZGV4ICE9PSAtMSA/IHRpbWVTdHJpbmcuaW5kZXhPZignOicsIG1pbnV0ZXNJbmRleCArIDEpIDogLTE7XG5cbiAgICAgICAgaWYgKHNlY29uZHNJbmRleCAhPT0gLTEgJiYgY3Vyc29yUG9zaXRpb24gPiBzZWNvbmRzSW5kZXgpIHtcbiAgICAgICAgICAgIG1vZGlmaWVkVGltZVBhcnQgPSBUaW1lUGFydHMuc2Vjb25kcztcbiAgICAgICAgICAgIGN1cnNvclN0YXJ0UG9zaXRpb24gPSBzZWNvbmRzSW5kZXggKyAxO1xuICAgICAgICAgICAgY3Vyc29yRW5kUG9zaXRpb24gPSB0aW1lU3RyaW5nLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGVzSW5kZXggIT09IC0xICYmIGN1cnNvclBvc2l0aW9uID4gbWludXRlc0luZGV4KSB7XG4gICAgICAgICAgICBtb2RpZmllZFRpbWVQYXJ0ID0gVGltZVBhcnRzLm1pbnV0ZXM7XG4gICAgICAgICAgICBjdXJzb3JTdGFydFBvc2l0aW9uID0gbWludXRlc0luZGV4ICsgMTtcbiAgICAgICAgICAgIGN1cnNvckVuZFBvc2l0aW9uID0gc2Vjb25kc0luZGV4ID4gLTEgPyBzZWNvbmRzSW5kZXggOiB0aW1lU3RyaW5nLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vZGlmaWVkVGltZVBhcnQgPSBUaW1lUGFydHMuaG91cnM7XG4gICAgICAgICAgICBjdXJzb3JTdGFydFBvc2l0aW9uID0gaG91cnNJbmRleDtcbiAgICAgICAgICAgIGN1cnNvckVuZFBvc2l0aW9uID0gbWludXRlc0luZGV4ICE9PSAtMSA/IG1pbnV0ZXNJbmRleCA6IHRpbWVTdHJpbmcubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgbW9kaWZpZWRUaW1lUGFydCwgY3Vyc29yU3RhcnRQb3NpdGlvbiwgY3Vyc29yRW5kUG9zaXRpb24gfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIHRpbWUgc3RyaW5nIGZvciBkaXNwbGF5aW5nIGluc2lkZSBpbnB1dCBlbGVtZW50IG9mIFVJXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRUaW1lU3RyaW5nRnJvbURhdGUodmFsdWU6IEQgfCBudWxsLCB0aW1lRm9ybWF0OiBUaW1lRm9ybWF0cyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdmFsdWUgfHwgIXRoaXMuZGF0ZUFkYXB0ZXIuaXNWYWxpZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVBZGFwdGVyLmZvcm1hdCh2YWx1ZSwgdGltZUZvcm1hdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREYXRlRnJvbVRpbWVTdHJpbmcodGltZVN0cmluZzogc3RyaW5nKTogRCB8IG51bGwge1xuICAgICAgICBpZiAoIXRpbWVTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMudmFsdWUgfHwgdGhpcy5kYXRlQWRhcHRlci50b2RheSgpO1xuXG4gICAgICAgIGNvbnN0IEhNUyA9IHRpbWVTdHJpbmcubWF0Y2goSE9VUlNfTUlOVVRFU19TRUNPTkRTX1JFR0VYUCk7XG4gICAgICAgIGNvbnN0IEhNID0gdGltZVN0cmluZy5tYXRjaChIT1VSU19NSU5VVEVTX1JFR0VYUCk7XG4gICAgICAgIGNvbnN0IEggPSB0aW1lU3RyaW5nLm1hdGNoKEhPVVJTX09OTFlfUkVHRVhQKTtcbiAgICAgICAgY29uc3QgYW1QbSA9IHRpbWVTdHJpbmcubWF0Y2goQU1fUE1fRk9STUFUX1JFR0VYUCk7XG5cbiAgICAgICAgbGV0IGhvdXJzOiBudW1iZXIgPSAwO1xuICAgICAgICBsZXQgbWludXRlczogbnVtYmVyID0gMDtcbiAgICAgICAgbGV0IHNlY29uZHM6IG51bWJlciA9IDA7XG5cbiAgICAgICAgaWYgKGFtUG0pIHtcbiAgICAgICAgICAgIGhvdXJzID0gTnVtYmVyKGFtUG1bMV0pO1xuICAgICAgICAgICAgbWludXRlcyA9IE51bWJlcihhbVBtWzJdKTtcblxuICAgICAgICAgICAgaWYgKC9bcF0vaS50ZXN0KGFtUG1bM10pIHx8ICgvW2FdL2kudGVzdChhbVBtWzNdKSAmJiBob3VycyA9PT0gMTIpKSB7XG4gICAgICAgICAgICAgICAgaG91cnMgKz0gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoSE1TICYmIHRoaXMuaXNTaG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgaG91cnMgPSBOdW1iZXIoSE1TWzFdKTtcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBOdW1iZXIoSE1TWzJdKTtcbiAgICAgICAgICAgIHNlY29uZHMgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFNlY29uZHMoZGF0ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoSE1TKSB7XG4gICAgICAgICAgICBob3VycyA9IE51bWJlcihITVNbMV0pO1xuICAgICAgICAgICAgbWludXRlcyA9IE51bWJlcihITVNbMl0pO1xuICAgICAgICAgICAgc2Vjb25kcyA9IE51bWJlcihITVNbM10pO1xuICAgICAgICB9IGVsc2UgaWYgKEhNKSB7XG4gICAgICAgICAgICBob3VycyA9IE51bWJlcihITVsxXSk7XG4gICAgICAgICAgICBtaW51dGVzID0gTnVtYmVyKEhNWzJdKTtcbiAgICAgICAgfSBlbHNlIGlmIChIKSB7XG4gICAgICAgICAgICBob3VycyA9IE51bWJlcihIWzFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0RGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZVRpbWUoXG4gICAgICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoZGF0ZSksXG4gICAgICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpLFxuICAgICAgICAgICAgdGhpcy5kYXRlQWRhcHRlci5nZXREYXRlKGRhdGUpLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICBtaW51dGVzIHx8IDAsXG4gICAgICAgICAgICBzZWNvbmRzIHx8IDAsXG4gICAgICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLmdldE1pbGxpc2Vjb25kcyhkYXRlKVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbGlkRGF0ZU9yTnVsbChyZXN1bHREYXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9ICgpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvY3VzZWQgfHwgdGhpcy5lbXB0eSB8fCB0aGlzLmxhc3RWYWx1ZVZhbGlkXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogeyBrYnFUaW1lcGlja2VyUGFyc2U6IHsgdGV4dDogdGhpcy52aWV3VmFsdWUgfSB9O1xuICAgIH07XG5cbiAgICBwcml2YXRlIG1pblZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLmRhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWUpKTtcblxuICAgICAgICByZXR1cm4gIXRoaXMubWluIHx8ICFjb250cm9sVmFsdWUgfHwgdGhpcy5kYXRlQWRhcHRlci5jb21wYXJlRGF0ZVRpbWUodGhpcy5taW4sIGNvbnRyb2xWYWx1ZSkgPD0gMFxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHsga2JxVGltZXBpY2tlckxvd2VyVGhlbk1pbjogeyBtaW46IHRoaXMubWluLCBhY3R1YWw6IGNvbnRyb2xWYWx1ZSB9IH07XG4gICAgfTtcblxuICAgIHByaXZhdGUgbWF4VmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoY29udHJvbC52YWx1ZSkpO1xuXG4gICAgICAgIHJldHVybiAhdGhpcy5tYXggfHwgIWNvbnRyb2xWYWx1ZSB8fCB0aGlzLmRhdGVBZGFwdGVyLmNvbXBhcmVEYXRlVGltZSh0aGlzLm1heCwgY29udHJvbFZhbHVlKSA+PSAwXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogeyBrYnFUaW1lcGlja2VySGlnaGVyVGhlbk1heDogeyBtYXg6IHRoaXMubWF4LCBhY3R1YWw6IGNvbnRyb2xWYWx1ZSB9IH07XG4gICAgfTtcblxuICAgIHByaXZhdGUgZ2V0VmFsaWREYXRlT3JOdWxsKG9iajogYW55KTogRCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlQWRhcHRlci5pc0RhdGVJbnN0YW5jZShvYmopICYmIHRoaXMuZGF0ZUFkYXB0ZXIuaXNWYWxpZChvYmopID8gb2JqIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFZpZXdWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVZpZXcoKSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5nZXRUaW1lU3RyaW5nRnJvbURhdGUodGhpcy52YWx1ZSwgdGhpcy5mb3JtYXQpO1xuXG4gICAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKGZvcm1hdHRlZFZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udHJvbCA9IGNvbnRyb2w7XG5cbiAgICAgICAgdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiAodGhpcy5fdmFsdWUgPSB2YWx1ZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdG9yT25DaGFuZ2UgPSAoKSA9PiB7fTtcblxuICAgIHByaXZhdGUgdXBkYXRlTG9jYWxlUGFyYW1zID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdFBsYWNlaG9sZGVyKSByZXR1cm47XG5cbiAgICAgICAgLy8gdXBkYXRlIHZpYSBwcml2YXRlIHByb3BlcnR5IGluc3RlYWQgb2Ygc2V0dGVyIHRvIHNhdmUgaXQgYXMgZGVmYXVsdCBwbGFjZWhvbGRlclxuICAgICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHRoaXMudGltZUZvcm1hdFBsYWNlaG9sZGVyO1xuICAgICAgICAvLyB1cGRhdGUgdmFsdWUgc28gdmlldyB2YWx1ZSB3aWxsIGJlIGFsc28gdXBkYXRlZFxuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgfTtcbn1cbiJdfQ==