@koobiq/components 17.0.0-rc.1 → 17.0.0-rc.11

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 (669) hide show
  1. package/README.md +1 -2
  2. package/alert/_alert-theme.scss +48 -24
  3. package/alert/alert.component.d.ts +23 -3
  4. package/alert/alert.component.scss +91 -59
  5. package/alert/public-api.d.ts +1 -1
  6. package/autocomplete/_autocomplete-theme.scss +3 -3
  7. package/autocomplete/autocomplete.scss +8 -18
  8. package/autocomplete/public-api.d.ts +2 -2
  9. package/badge/_badge-theme.scss +30 -45
  10. package/badge/badge.component.scss +18 -39
  11. package/badge/public-api.d.ts +1 -1
  12. package/button/_button-base.scss +7 -14
  13. package/button/_button-theme.scss +30 -86
  14. package/button/button.component.d.ts +4 -3
  15. package/button/button.scss +7 -17
  16. package/button/public-api.d.ts +1 -1
  17. package/button-toggle/_button-toggle-theme.scss +19 -20
  18. package/button-toggle/button-toggle.scss +17 -44
  19. package/button-toggle/public-api.d.ts +1 -1
  20. package/card/_card-theme.scss +18 -17
  21. package/card/card.component.d.ts +1 -1
  22. package/card/card.component.scss +3 -6
  23. package/card/public-api.d.ts +1 -1
  24. package/checkbox/_checkbox-theme.scss +50 -50
  25. package/checkbox/checkbox.scss +31 -35
  26. package/code-block/README.md +18 -14
  27. package/code-block/_code-block-theme.scss +53 -23
  28. package/code-block/actionbar.component.scss +11 -25
  29. package/code-block/code-block.component.d.ts +12 -4
  30. package/code-block/code-block.scss +62 -77
  31. package/code-block/public-api.d.ts +1 -1
  32. package/core/animation/index.d.ts +1 -1
  33. package/core/common-behaviors/index.d.ts +3 -3
  34. package/core/datetime/index.d.ts +1 -1
  35. package/core/form-field/form-field-ref.d.ts +2 -0
  36. package/core/formatters/index.d.ts +1 -1
  37. package/core/forms/_forms-theme.scss +4 -8
  38. package/core/forms/_forms.scss +13 -43
  39. package/core/forms/index.d.ts +1 -1
  40. package/core/locales/formatters.d.ts +96 -0
  41. package/core/locales/index.d.ts +1 -1
  42. package/core/locales/locale-service.d.ts +97 -0
  43. package/core/option/_optgroup-theme.scss +4 -6
  44. package/core/option/_option-action-theme.scss +8 -11
  45. package/core/option/_option-theme.scss +15 -20
  46. package/core/option/index.d.ts +2 -2
  47. package/core/option/optgroup.scss +2 -3
  48. package/core/option/option.scss +0 -1
  49. package/core/pop-up/_pop-up.scss +0 -1
  50. package/core/pop-up/pop-up-trigger.d.ts +4 -2
  51. package/core/public-api.d.ts +3 -3
  52. package/core/select/common.d.ts +35 -0
  53. package/core/select/constants.d.ts +1 -1
  54. package/core/select/index.d.ts +3 -2
  55. package/core/selection/pseudo-checkbox/_pseudo-checkbox-theme.scss +15 -19
  56. package/core/selection/pseudo-checkbox/pseudo-checkbox.scss +9 -9
  57. package/core/services/theme.service.d.ts +3 -2
  58. package/core/styles/_core.scss +0 -1
  59. package/core/styles/_koobiq-theme.scss +5 -3
  60. package/core/styles/common/_animation.scss +9 -8
  61. package/core/styles/common/_button.scss +0 -2
  62. package/core/styles/common/_clearfix.scss +1 -1
  63. package/core/styles/common/_groups.scss +3 -9
  64. package/core/styles/common/_list.scss +24 -66
  65. package/core/styles/common/_overlay.scss +4 -3
  66. package/core/styles/common/_popup.scss +5 -5
  67. package/core/styles/common/_rtl.scss +4 -4
  68. package/core/styles/common/_select.scss +48 -42
  69. package/core/styles/common/_tokens.scss +47 -0
  70. package/core/styles/functions/_number.scss +14 -19
  71. package/core/styles/functions/_string.scss +18 -19
  72. package/core/styles/functions/_timing.scss +24 -24
  73. package/core/styles/theming/_components-theming.scss +1322 -1326
  74. package/core/styles/theming/_scrollbar-theme.scss +8 -5
  75. package/core/styles/theming/_theming.scss +26 -29
  76. package/core/styles/typography/_typography-utils.scss +1 -2
  77. package/core/styles/typography/_typography.scss +138 -85
  78. package/core/styles/visual/_body.scss +0 -2
  79. package/core/styles/visual/_layout.scss +44 -38
  80. package/core/utils/data-size/config.d.ts +20 -2
  81. package/core/utils/data-size/data-size.pipe.d.ts +10 -9
  82. package/core/utils/data-size/index.d.ts +1 -1
  83. package/core/utils/data-size/size.d.ts +3 -4
  84. package/core/utils/public-api.d.ts +1 -1
  85. package/datepicker/_datepicker-theme.scss +38 -40
  86. package/datepicker/calendar-body.scss +3 -11
  87. package/datepicker/calendar-header.scss +4 -10
  88. package/datepicker/calendar.scss +5 -17
  89. package/datepicker/datepicker-content.scss +5 -15
  90. package/datepicker/datepicker-input.directive.d.ts +1 -0
  91. package/datepicker/datepicker-input.scss +0 -5
  92. package/datepicker/datepicker-toggle.scss +3 -3
  93. package/datepicker/public-api.d.ts +4 -4
  94. package/divider/_divider-theme.scss +2 -1
  95. package/divider/divider.scss +9 -26
  96. package/dl/_dl-theme.scss +5 -8
  97. package/dl/dl.scss +5 -20
  98. package/dl/public-api.d.ts +1 -1
  99. package/dropdown/_dropdown-theme.scss +30 -22
  100. package/dropdown/dropdown-content.directive.d.ts +1 -1
  101. package/dropdown/dropdown-item.component.d.ts +1 -1
  102. package/dropdown/dropdown-item.scss +12 -16
  103. package/dropdown/dropdown-trigger.directive.d.ts +2 -2
  104. package/dropdown/dropdown.component.d.ts +1 -1
  105. package/dropdown/dropdown.scss +6 -15
  106. package/dropdown/public-api.d.ts +5 -5
  107. package/ellipsis-center/ellipsis-center.directive.d.ts +4 -3
  108. package/empty-state/README.md +0 -0
  109. package/empty-state/_empty-state-theme.scss +56 -0
  110. package/empty-state/empty-state.component.d.ts +31 -0
  111. package/empty-state/empty-state.module.d.ts +10 -0
  112. package/empty-state/empty-state.scss +81 -0
  113. package/empty-state/index.d.ts +1 -0
  114. package/empty-state/public-api.d.ts +2 -0
  115. package/esm2022/alert/alert.component.mjs +52 -5
  116. package/esm2022/alert/alert.module.mjs +1 -1
  117. package/esm2022/alert/public-api.mjs +2 -2
  118. package/esm2022/autocomplete/autocomplete-origin.directive.mjs +1 -1
  119. package/esm2022/autocomplete/autocomplete-trigger.directive.mjs +23 -31
  120. package/esm2022/autocomplete/autocomplete.component.mjs +14 -9
  121. package/esm2022/autocomplete/autocomplete.module.mjs +3 -3
  122. package/esm2022/autocomplete/public-api.mjs +3 -3
  123. package/esm2022/badge/badge.component.mjs +8 -6
  124. package/esm2022/badge/badge.module.mjs +1 -1
  125. package/esm2022/badge/public-api.mjs +2 -2
  126. package/esm2022/button/button.component.mjs +20 -10
  127. package/esm2022/button/button.module.mjs +1 -1
  128. package/esm2022/button/public-api.mjs +2 -2
  129. package/esm2022/button-toggle/button-toggle.component.mjs +24 -16
  130. package/esm2022/button-toggle/button-toggle.module.mjs +1 -1
  131. package/esm2022/button-toggle/public-api.mjs +2 -2
  132. package/esm2022/card/card.component.mjs +2 -2
  133. package/esm2022/card/card.module.mjs +1 -1
  134. package/esm2022/card/public-api.mjs +2 -2
  135. package/esm2022/checkbox/checkbox-config.mjs +1 -1
  136. package/esm2022/checkbox/checkbox-module.mjs +1 -1
  137. package/esm2022/checkbox/checkbox-required-validator.mjs +1 -1
  138. package/esm2022/checkbox/checkbox.mjs +6 -6
  139. package/esm2022/checkbox/public-api.mjs +1 -1
  140. package/esm2022/code-block/actionbar.component.mjs +4 -6
  141. package/esm2022/code-block/code-block.component.mjs +64 -17
  142. package/esm2022/code-block/code-block.module.mjs +9 -5
  143. package/esm2022/code-block/public-api.mjs +2 -2
  144. package/esm2022/core/animation/fade-animations.mjs +1 -1
  145. package/esm2022/core/animation/index.mjs +2 -2
  146. package/esm2022/core/animation/select-animations.mjs +5 -5
  147. package/esm2022/core/common-behaviors/color.mjs +4 -2
  148. package/esm2022/core/common-behaviors/common-module.mjs +2 -2
  149. package/esm2022/core/common-behaviors/constructor.mjs +1 -1
  150. package/esm2022/core/common-behaviors/disabled.mjs +1 -1
  151. package/esm2022/core/common-behaviors/error-state.mjs +1 -1
  152. package/esm2022/core/common-behaviors/index.mjs +4 -4
  153. package/esm2022/core/common-behaviors/tabindex.mjs +1 -1
  154. package/esm2022/core/datetime/date-adapter.mjs +1 -1
  155. package/esm2022/core/datetime/date-formats.mjs +1 -1
  156. package/esm2022/core/datetime/index.mjs +2 -2
  157. package/esm2022/core/error/error-options.mjs +1 -1
  158. package/esm2022/core/form-field/form-field-ref.mjs +1 -1
  159. package/esm2022/core/formatters/date/formatter.mjs +1 -1
  160. package/esm2022/core/formatters/date/formatter.pipe.mjs +1 -1
  161. package/esm2022/core/formatters/index.mjs +2 -2
  162. package/esm2022/core/formatters/number/formatter.mjs +19 -20
  163. package/esm2022/core/forms/forms-module.mjs +1 -1
  164. package/esm2022/core/forms/forms.directive.mjs +1 -1
  165. package/esm2022/core/forms/index.mjs +2 -2
  166. package/esm2022/core/highlight/highlight.pipe.mjs +1 -1
  167. package/esm2022/core/highlight/index.mjs +1 -1
  168. package/esm2022/core/label/label-options.mjs +1 -1
  169. package/esm2022/core/line/line.mjs +2 -2
  170. package/esm2022/core/locales/en-US.mjs +1 -1
  171. package/esm2022/core/locales/es-LA.mjs +1 -1
  172. package/esm2022/core/locales/fa-IR.mjs +1 -1
  173. package/esm2022/core/locales/formatters.mjs +97 -1
  174. package/esm2022/core/locales/index.mjs +2 -2
  175. package/esm2022/core/locales/locale-service.mjs +10 -4
  176. package/esm2022/core/locales/locale-service.module.mjs +1 -1
  177. package/esm2022/core/locales/pt-BR.mjs +1 -1
  178. package/esm2022/core/locales/ru-RU.mjs +3 -3
  179. package/esm2022/core/locales/zh-CN.mjs +1 -1
  180. package/esm2022/core/option/action.mjs +20 -12
  181. package/esm2022/core/option/index.mjs +3 -3
  182. package/esm2022/core/option/optgroup.mjs +4 -4
  183. package/esm2022/core/option/option-module.mjs +1 -1
  184. package/esm2022/core/option/option.mjs +13 -7
  185. package/esm2022/core/overlay/overlay-position-map.mjs +1 -1
  186. package/esm2022/core/pop-up/pop-up-trigger.mjs +29 -30
  187. package/esm2022/core/pop-up/pop-up.mjs +1 -1
  188. package/esm2022/core/public-api.mjs +4 -4
  189. package/esm2022/core/select/common.mjs +120 -0
  190. package/esm2022/core/select/constants.mjs +1 -1
  191. package/esm2022/core/select/index.mjs +4 -3
  192. package/esm2022/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +3 -3
  193. package/esm2022/core/selection/pseudo-checkbox/pseudo-checkbox.module.mjs +1 -1
  194. package/esm2022/core/services/measure-scrollbar.service.mjs +1 -1
  195. package/esm2022/core/services/theme.service.mjs +5 -4
  196. package/esm2022/core/title/title-text-ref.mjs +1 -1
  197. package/esm2022/core/utils/data-size/config.mjs +5 -17
  198. package/esm2022/core/utils/data-size/data-size.pipe.mjs +35 -22
  199. package/esm2022/core/utils/data-size/index.mjs +2 -2
  200. package/esm2022/core/utils/data-size/size.mjs +7 -14
  201. package/esm2022/core/utils/public-api.mjs +2 -2
  202. package/esm2022/core/utils/utils.mjs +4 -2
  203. package/esm2022/core/validation/validation.mjs +4 -2
  204. package/esm2022/core/version.mjs +2 -2
  205. package/esm2022/datepicker/calendar-body.component.mjs +3 -3
  206. package/esm2022/datepicker/calendar-header.component.mjs +8 -7
  207. package/esm2022/datepicker/calendar.component.mjs +6 -6
  208. package/esm2022/datepicker/datepicker-animations.mjs +2 -2
  209. package/esm2022/datepicker/datepicker-errors.mjs +1 -1
  210. package/esm2022/datepicker/datepicker-input.directive.mjs +42 -34
  211. package/esm2022/datepicker/datepicker-intl.mjs +1 -1
  212. package/esm2022/datepicker/datepicker-module.mjs +2 -2
  213. package/esm2022/datepicker/datepicker-toggle.component.mjs +11 -10
  214. package/esm2022/datepicker/datepicker.component.mjs +15 -15
  215. package/esm2022/datepicker/month-view.component.mjs +14 -13
  216. package/esm2022/datepicker/public-api.mjs +5 -5
  217. package/esm2022/divider/divider.component.mjs +1 -1
  218. package/esm2022/divider/divider.module.mjs +1 -1
  219. package/esm2022/dl/dl.component.mjs +1 -1
  220. package/esm2022/dl/dl.module.mjs +2 -2
  221. package/esm2022/dl/public-api.mjs +2 -2
  222. package/esm2022/dropdown/dropdown-animations.mjs +5 -5
  223. package/esm2022/dropdown/dropdown-content.directive.mjs +3 -3
  224. package/esm2022/dropdown/dropdown-item.component.mjs +5 -5
  225. package/esm2022/dropdown/dropdown-trigger.directive.mjs +25 -31
  226. package/esm2022/dropdown/dropdown.component.mjs +10 -18
  227. package/esm2022/dropdown/dropdown.module.mjs +1 -1
  228. package/esm2022/dropdown/dropdown.types.mjs +1 -1
  229. package/esm2022/dropdown/public-api.mjs +6 -6
  230. package/esm2022/ellipsis-center/ellipsis-center.directive.mjs +9 -7
  231. package/esm2022/empty-state/empty-state.component.mjs +104 -0
  232. package/esm2022/empty-state/empty-state.module.mjs +50 -0
  233. package/esm2022/empty-state/index.mjs +2 -0
  234. package/esm2022/empty-state/koobiq-components-empty-state.mjs +5 -0
  235. package/esm2022/empty-state/public-api.mjs +3 -0
  236. package/esm2022/file-upload/file-drop.mjs +2 -2
  237. package/esm2022/file-upload/file-upload.mjs +1 -1
  238. package/esm2022/file-upload/file-upload.module.mjs +12 -6
  239. package/esm2022/file-upload/index.mjs +1 -1
  240. package/esm2022/file-upload/multiple-file-upload.component.mjs +96 -29
  241. package/esm2022/file-upload/public-api.mjs +2 -2
  242. package/esm2022/file-upload/single-file-upload.component.mjs +100 -25
  243. package/esm2022/form-field/cleaner.mjs +13 -3
  244. package/esm2022/form-field/form-field-control.mjs +1 -1
  245. package/esm2022/form-field/form-field-errors.mjs +1 -1
  246. package/esm2022/form-field/form-field.mjs +8 -13
  247. package/esm2022/form-field/form-field.module.mjs +1 -1
  248. package/esm2022/form-field/hint.mjs +4 -4
  249. package/esm2022/form-field/password-hint.mjs +15 -15
  250. package/esm2022/form-field/password-toggle.mjs +14 -15
  251. package/esm2022/form-field/prefix.mjs +1 -1
  252. package/esm2022/form-field/public-api.mjs +4 -4
  253. package/esm2022/form-field/stepper.mjs +33 -29
  254. package/esm2022/form-field/suffix.mjs +1 -1
  255. package/esm2022/form-field/validate.directive.mjs +6 -5
  256. package/esm2022/icon/icon-button.component.mjs +2 -2
  257. package/esm2022/icon/icon-item.component.mjs +16 -6
  258. package/esm2022/icon/icon.component.mjs +3 -4
  259. package/esm2022/icon/icon.module.mjs +1 -1
  260. package/esm2022/icon/public-api.mjs +3 -3
  261. package/esm2022/input/input-number-validators.mjs +1 -1
  262. package/esm2022/input/input-number.mjs +35 -36
  263. package/esm2022/input/input-password.mjs +13 -7
  264. package/esm2022/input/input-value-accessor.mjs +1 -1
  265. package/esm2022/input/input.mjs +13 -7
  266. package/esm2022/input/input.module.mjs +1 -1
  267. package/esm2022/input/public-api.mjs +3 -3
  268. package/esm2022/link/link.component.mjs +2 -2
  269. package/esm2022/link/link.module.mjs +1 -1
  270. package/esm2022/link/public-api.mjs +2 -2
  271. package/esm2022/list/list-selection.component.mjs +34 -36
  272. package/esm2022/list/list.component.mjs +3 -3
  273. package/esm2022/list/list.module.mjs +2 -2
  274. package/esm2022/list/public-api.mjs +3 -3
  275. package/esm2022/loader-overlay/loader-overlay.component.mjs +4 -4
  276. package/esm2022/loader-overlay/loader-overlay.module.mjs +1 -1
  277. package/esm2022/loader-overlay/public-api.mjs +2 -2
  278. package/esm2022/markdown/markdown.component.mjs +22 -8
  279. package/esm2022/markdown/markdown.module.mjs +1 -1
  280. package/esm2022/markdown/markdown.service.mjs +1 -1
  281. package/esm2022/modal/css-unit.pipe.mjs +1 -1
  282. package/esm2022/modal/modal-control.service.mjs +3 -2
  283. package/esm2022/modal/modal-ref.class.mjs +1 -1
  284. package/esm2022/modal/modal-util.mjs +1 -1
  285. package/esm2022/modal/modal.component.mjs +54 -32
  286. package/esm2022/modal/modal.directive.mjs +27 -11
  287. package/esm2022/modal/modal.module.mjs +2 -2
  288. package/esm2022/modal/modal.service.mjs +3 -2
  289. package/esm2022/modal/modal.type.mjs +1 -1
  290. package/esm2022/modal/public-api.mjs +3 -3
  291. package/esm2022/navbar/index.mjs +1 -1
  292. package/esm2022/navbar/navbar-item.component.mjs +47 -38
  293. package/esm2022/navbar/navbar.component.mjs +19 -28
  294. package/esm2022/navbar/navbar.module.mjs +2 -2
  295. package/esm2022/navbar/public-api.mjs +3 -3
  296. package/esm2022/navbar/vertical-navbar.component.mjs +17 -18
  297. package/esm2022/popover/popover-animations.mjs +1 -1
  298. package/esm2022/popover/popover-confirm.component.mjs +3 -3
  299. package/esm2022/popover/popover.component.mjs +5 -5
  300. package/esm2022/popover/popover.module.mjs +1 -1
  301. package/esm2022/popover/public-api.mjs +3 -3
  302. package/esm2022/progress-bar/progress-bar.component.mjs +4 -4
  303. package/esm2022/progress-bar/progress-bar.module.mjs +2 -2
  304. package/esm2022/progress-bar/public-api.mjs +2 -2
  305. package/esm2022/progress-spinner/progress-spinner.component.mjs +4 -4
  306. package/esm2022/progress-spinner/progress-spinner.module.mjs +1 -1
  307. package/esm2022/progress-spinner/public-api.mjs +2 -2
  308. package/esm2022/radio/public-api.mjs +2 -2
  309. package/esm2022/radio/radio.component.mjs +9 -10
  310. package/esm2022/radio/radio.module.mjs +1 -1
  311. package/esm2022/risk-level/public-api.mjs +2 -2
  312. package/esm2022/risk-level/risk-level.component.mjs +1 -1
  313. package/esm2022/risk-level/risk-level.module.mjs +1 -1
  314. package/esm2022/scrollbar/public-api.mjs +2 -2
  315. package/esm2022/scrollbar/scrollbar.component.mjs +15 -13
  316. package/esm2022/scrollbar/scrollbar.directive.mjs +3 -3
  317. package/esm2022/scrollbar/scrollbar.module.mjs +2 -2
  318. package/esm2022/scrollbar/scrollbar.types.mjs +3 -2
  319. package/esm2022/select/public-api.mjs +3 -3
  320. package/esm2022/select/select-option.directive.mjs +14 -9
  321. package/esm2022/select/select.component.mjs +92 -172
  322. package/esm2022/select/select.module.mjs +28 -28
  323. package/esm2022/sidebar/public-api.mjs +2 -2
  324. package/esm2022/sidebar/sidebar-animations.mjs +1 -1
  325. package/esm2022/sidebar/sidebar.component.mjs +3 -3
  326. package/esm2022/sidebar/sidebar.module.mjs +1 -1
  327. package/esm2022/sidepanel/public-api.mjs +4 -4
  328. package/esm2022/sidepanel/sidepanel-animations.mjs +7 -3
  329. package/esm2022/sidepanel/sidepanel-config.mjs +1 -1
  330. package/esm2022/sidepanel/sidepanel-container.component.mjs +4 -4
  331. package/esm2022/sidepanel/sidepanel-directives.mjs +30 -16
  332. package/esm2022/sidepanel/sidepanel-ref.mjs +10 -4
  333. package/esm2022/sidepanel/sidepanel.module.mjs +1 -1
  334. package/esm2022/sidepanel/sidepanel.service.mjs +11 -14
  335. package/esm2022/splitter/public-api.mjs +2 -2
  336. package/esm2022/splitter/splitter.component.mjs +45 -35
  337. package/esm2022/splitter/splitter.module.mjs +1 -1
  338. package/esm2022/table/public-api.mjs +2 -2
  339. package/esm2022/table/table.component.mjs +29 -6
  340. package/esm2022/table/table.module.mjs +14 -6
  341. package/esm2022/tabs/paginated-tab-header.mjs +8 -11
  342. package/esm2022/tabs/public-api.mjs +6 -6
  343. package/esm2022/tabs/tab-body.component.mjs +9 -9
  344. package/esm2022/tabs/tab-content.directive.mjs +1 -1
  345. package/esm2022/tabs/tab-group.component.mjs +61 -21
  346. package/esm2022/tabs/tab-header.component.mjs +4 -4
  347. package/esm2022/tabs/tab-label-wrapper.directive.mjs +1 -1
  348. package/esm2022/tabs/tab-label.directive.mjs +1 -1
  349. package/esm2022/tabs/tab-nav-bar/index.mjs +1 -1
  350. package/esm2022/tabs/tab-nav-bar/tab-nav-bar.mjs +4 -4
  351. package/esm2022/tabs/tab.component.mjs +4 -6
  352. package/esm2022/tabs/tabs-animations.mjs +1 -1
  353. package/esm2022/tabs/tabs.module.mjs +2 -2
  354. package/esm2022/tags/public-api.mjs +5 -5
  355. package/esm2022/tags/tag-default-options.mjs +1 -1
  356. package/esm2022/tags/tag-input.mjs +26 -14
  357. package/esm2022/tags/tag-list.component.mjs +14 -20
  358. package/esm2022/tags/tag-text-control.mjs +1 -1
  359. package/esm2022/tags/tag.component.mjs +6 -8
  360. package/esm2022/tags/tag.module.mjs +9 -5
  361. package/esm2022/textarea/index.mjs +1 -1
  362. package/esm2022/textarea/textarea.component.mjs +15 -15
  363. package/esm2022/textarea/textarea.module.mjs +1 -1
  364. package/esm2022/timepicker/public-api.mjs +2 -2
  365. package/esm2022/timepicker/timepicker.constants.mjs +6 -1
  366. package/esm2022/timepicker/timepicker.directive.mjs +72 -28
  367. package/esm2022/timepicker/timepicker.module.mjs +1 -1
  368. package/esm2022/timezone/cities-by-filter.pipe.mjs +1 -1
  369. package/esm2022/timezone/timezone-option.component.mjs +12 -11
  370. package/esm2022/timezone/timezone-option.directive.mjs +9 -7
  371. package/esm2022/timezone/timezone-select.component.mjs +7 -7
  372. package/esm2022/timezone/timezone.module.mjs +1 -1
  373. package/esm2022/timezone/timezone.utils.mjs +5 -9
  374. package/esm2022/timezone/utc-offset.pipe.mjs +1 -1
  375. package/esm2022/title/public-api.mjs +2 -2
  376. package/esm2022/title/title.directive.mjs +11 -8
  377. package/esm2022/title/title.module.mjs +1 -1
  378. package/esm2022/toast/public-api.mjs +4 -4
  379. package/esm2022/toast/toast-animations.mjs +2 -2
  380. package/esm2022/toast/toast-container.component.mjs +5 -6
  381. package/esm2022/toast/toast.component.mjs +6 -6
  382. package/esm2022/toast/toast.module.mjs +1 -1
  383. package/esm2022/toast/toast.service.mjs +26 -37
  384. package/esm2022/toast/toast.type.mjs +3 -1
  385. package/esm2022/toggle/public-api.mjs +2 -2
  386. package/esm2022/toggle/toggle.component.mjs +17 -9
  387. package/esm2022/toggle/toggle.module.mjs +1 -1
  388. package/esm2022/tooltip/public-api.mjs +2 -2
  389. package/esm2022/tooltip/tooltip.animations.mjs +1 -1
  390. package/esm2022/tooltip/tooltip.component.mjs +32 -16
  391. package/esm2022/tooltip/tooltip.module.mjs +2 -2
  392. package/esm2022/tree/control/base-tree-control.mjs +1 -1
  393. package/esm2022/tree/control/flat-tree-control.filters.mjs +4 -7
  394. package/esm2022/tree/control/flat-tree-control.mjs +4 -7
  395. package/esm2022/tree/control/nested-tree-control.mjs +1 -1
  396. package/esm2022/tree/control/tree-control.mjs +1 -1
  397. package/esm2022/tree/data-source/flat-data-source.mjs +3 -8
  398. package/esm2022/tree/data-source/nested-data-source.mjs +2 -3
  399. package/esm2022/tree/node.mjs +1 -1
  400. package/esm2022/tree/outlet.mjs +1 -1
  401. package/esm2022/tree/padding.directive.mjs +5 -6
  402. package/esm2022/tree/public-api.mjs +11 -11
  403. package/esm2022/tree/toggle.mjs +8 -5
  404. package/esm2022/tree/tree-base.mjs +4 -4
  405. package/esm2022/tree/tree-errors.mjs +1 -1
  406. package/esm2022/tree/tree-option.component.mjs +9 -13
  407. package/esm2022/tree/tree-selection.component.mjs +19 -33
  408. package/esm2022/tree/tree.mjs +7 -3
  409. package/esm2022/tree/tree.module.mjs +4 -4
  410. package/esm2022/tree-select/public-api.mjs +2 -2
  411. package/esm2022/tree-select/tree-select.component.mjs +73 -98
  412. package/esm2022/tree-select/tree-select.module.mjs +31 -11
  413. package/fesm2022/koobiq-components-alert.mjs +55 -8
  414. package/fesm2022/koobiq-components-alert.mjs.map +1 -1
  415. package/fesm2022/koobiq-components-autocomplete.mjs +58 -61
  416. package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
  417. package/fesm2022/koobiq-components-badge.mjs +10 -8
  418. package/fesm2022/koobiq-components-badge.mjs.map +1 -1
  419. package/fesm2022/koobiq-components-button-toggle.mjs +28 -20
  420. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  421. package/fesm2022/koobiq-components-button.mjs +22 -12
  422. package/fesm2022/koobiq-components-button.mjs.map +1 -1
  423. package/fesm2022/koobiq-components-card.mjs +2 -2
  424. package/fesm2022/koobiq-components-card.mjs.map +1 -1
  425. package/fesm2022/koobiq-components-checkbox.mjs +3 -3
  426. package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
  427. package/fesm2022/koobiq-components-code-block.mjs +75 -27
  428. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  429. package/fesm2022/koobiq-components-core.mjs +623 -397
  430. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  431. package/fesm2022/koobiq-components-datepicker.mjs +101 -90
  432. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  433. package/fesm2022/koobiq-components-divider.mjs.map +1 -1
  434. package/fesm2022/koobiq-components-dl.mjs +3 -3
  435. package/fesm2022/koobiq-components-dl.mjs.map +1 -1
  436. package/fesm2022/koobiq-components-dropdown.mjs +127 -141
  437. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  438. package/fesm2022/koobiq-components-ellipsis-center.mjs +5 -4
  439. package/fesm2022/koobiq-components-ellipsis-center.mjs.map +1 -1
  440. package/fesm2022/koobiq-components-empty-state.mjs +157 -0
  441. package/fesm2022/koobiq-components-empty-state.mjs.map +1 -0
  442. package/fesm2022/koobiq-components-file-upload.mjs +207 -62
  443. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  444. package/fesm2022/koobiq-components-form-field.mjs +88 -81
  445. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  446. package/fesm2022/koobiq-components-icon.mjs +17 -8
  447. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  448. package/fesm2022/koobiq-components-input.mjs +62 -51
  449. package/fesm2022/koobiq-components-input.mjs.map +1 -1
  450. package/fesm2022/koobiq-components-link.mjs +1 -1
  451. package/fesm2022/koobiq-components-link.mjs.map +1 -1
  452. package/fesm2022/koobiq-components-list.mjs +39 -41
  453. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  454. package/fesm2022/koobiq-components-loader-overlay.mjs +7 -7
  455. package/fesm2022/koobiq-components-loader-overlay.mjs.map +1 -1
  456. package/fesm2022/koobiq-components-markdown.mjs +20 -6
  457. package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
  458. package/fesm2022/koobiq-components-modal.mjs +88 -49
  459. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  460. package/fesm2022/koobiq-components-navbar.mjs +84 -85
  461. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  462. package/fesm2022/koobiq-components-popover.mjs +12 -12
  463. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  464. package/fesm2022/koobiq-components-progress-bar.mjs +5 -5
  465. package/fesm2022/koobiq-components-progress-bar.mjs.map +1 -1
  466. package/fesm2022/koobiq-components-progress-spinner.mjs +5 -5
  467. package/fesm2022/koobiq-components-progress-spinner.mjs.map +1 -1
  468. package/fesm2022/koobiq-components-radio.mjs +11 -12
  469. package/fesm2022/koobiq-components-radio.mjs.map +1 -1
  470. package/fesm2022/koobiq-components-risk-level.mjs +2 -2
  471. package/fesm2022/koobiq-components-risk-level.mjs.map +1 -1
  472. package/fesm2022/koobiq-components-scrollbar.mjs +17 -14
  473. package/fesm2022/koobiq-components-scrollbar.mjs.map +1 -1
  474. package/fesm2022/koobiq-components-select.mjs +136 -212
  475. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  476. package/fesm2022/koobiq-components-sidebar.mjs +3 -3
  477. package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
  478. package/fesm2022/koobiq-components-sidepanel.mjs +108 -87
  479. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  480. package/fesm2022/koobiq-components-splitter.mjs +46 -36
  481. package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
  482. package/fesm2022/koobiq-components-table.mjs +42 -11
  483. package/fesm2022/koobiq-components-table.mjs.map +1 -1
  484. package/fesm2022/koobiq-components-tabs.mjs +87 -52
  485. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  486. package/fesm2022/koobiq-components-tags.mjs +53 -46
  487. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  488. package/fesm2022/koobiq-components-textarea.mjs +13 -13
  489. package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
  490. package/fesm2022/koobiq-components-timepicker.mjs +79 -30
  491. package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
  492. package/fesm2022/koobiq-components-timezone.mjs +23 -25
  493. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  494. package/fesm2022/koobiq-components-title.mjs +13 -10
  495. package/fesm2022/koobiq-components-title.mjs.map +1 -1
  496. package/fesm2022/koobiq-components-toast.mjs +86 -95
  497. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  498. package/fesm2022/koobiq-components-toggle.mjs +17 -9
  499. package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
  500. package/fesm2022/koobiq-components-tooltip.mjs +33 -18
  501. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  502. package/fesm2022/koobiq-components-tree-select.mjs +110 -114
  503. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  504. package/fesm2022/koobiq-components-tree.mjs +509 -533
  505. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  506. package/file-upload/_file-upload-theme.scss +124 -73
  507. package/file-upload/file-upload.module.d.ts +11 -10
  508. package/file-upload/file-upload.scss +0 -6
  509. package/file-upload/multiple-file-upload.component.d.ts +37 -7
  510. package/file-upload/multiple-file-upload.component.scss +50 -120
  511. package/file-upload/public-api.d.ts +1 -1
  512. package/file-upload/single-file-upload.component.d.ts +37 -7
  513. package/file-upload/single-file-upload.component.scss +12 -33
  514. package/form-field/_form-field-theme.scss +46 -36
  515. package/form-field/_hint-theme.scss +15 -20
  516. package/form-field/cleaner.scss +3 -9
  517. package/form-field/form-field.scss +23 -26
  518. package/form-field/hint.scss +5 -8
  519. package/form-field/password-toggle.d.ts +3 -2
  520. package/form-field/password-toggle.scss +3 -10
  521. package/form-field/public-api.d.ts +3 -3
  522. package/form-field/stepper.scss +4 -11
  523. package/icon/_icon-button-theme.scss +47 -36
  524. package/icon/_icon-item-theme.scss +47 -26
  525. package/icon/_icon-theme.scss +12 -14
  526. package/icon/icon-button.scss +5 -20
  527. package/icon/icon-item.component.d.ts +3 -1
  528. package/icon/icon-item.scss +10 -8
  529. package/icon/icon.scss +0 -6
  530. package/icon/public-api.d.ts +2 -2
  531. package/input/_input-theme.scss +6 -4
  532. package/input/input.scss +11 -10
  533. package/input/public-api.d.ts +2 -2
  534. package/link/_link-theme.scss +32 -49
  535. package/link/link.component.d.ts +1 -1
  536. package/link/public-api.d.ts +1 -1
  537. package/list/_list-theme.scss +21 -19
  538. package/list/list-selection.component.d.ts +2 -2
  539. package/list/list.scss +2 -6
  540. package/list/public-api.d.ts +2 -2
  541. package/loader-overlay/_loader-overlay-theme.scss +17 -18
  542. package/loader-overlay/loader-overlay.scss +9 -33
  543. package/loader-overlay/public-api.d.ts +1 -1
  544. package/markdown/_markdown-theme.scss +47 -47
  545. package/markdown/markdown.scss +41 -91
  546. package/modal/README.md +4 -3
  547. package/modal/_modal-animation.scss +0 -1
  548. package/modal/_modal-confirm.scss +2 -7
  549. package/modal/_modal-theme.scss +11 -13
  550. package/modal/modal.component.d.ts +1 -1
  551. package/modal/modal.directive.d.ts +3 -3
  552. package/modal/modal.scss +15 -31
  553. package/modal/modal.type.d.ts +2 -2
  554. package/modal/public-api.d.ts +2 -2
  555. package/navbar/README.md +21 -20
  556. package/navbar/_navbar-item_horizontal.scss +40 -33
  557. package/navbar/_navbar-item_vertical.scss +31 -33
  558. package/navbar/_navbar-theme.scss +20 -24
  559. package/navbar/navbar-brand.scss +24 -27
  560. package/navbar/navbar-divider.scss +4 -8
  561. package/navbar/navbar-item.component.d.ts +4 -4
  562. package/navbar/navbar-item.scss +20 -15
  563. package/navbar/navbar.scss +2 -6
  564. package/navbar/public-api.d.ts +2 -2
  565. package/navbar/vertical-navbar.scss +4 -6
  566. package/package.json +17 -10
  567. package/popover/README.md +18 -14
  568. package/popover/_popover-theme.scss +9 -17
  569. package/popover/popover.component.d.ts +1 -1
  570. package/popover/popover.scss +15 -29
  571. package/popover/public-api.d.ts +2 -2
  572. package/prebuilt-themes/dark-theme.css +1 -1
  573. package/prebuilt-themes/light-theme.css +1 -1
  574. package/progress-bar/_progress-bar-theme.scss +7 -11
  575. package/progress-bar/progress-bar.scss +6 -19
  576. package/progress-bar/public-api.d.ts +1 -1
  577. package/progress-spinner/_progress-spinner-theme.scss +6 -8
  578. package/progress-spinner/progress-spinner.scss +8 -18
  579. package/progress-spinner/public-api.d.ts +1 -1
  580. package/radio/_radio-theme.scss +37 -37
  581. package/radio/public-api.d.ts +1 -1
  582. package/radio/radio.scss +35 -40
  583. package/risk-level/_risk-level-theme.scss +25 -31
  584. package/risk-level/public-api.d.ts +1 -1
  585. package/risk-level/risk-level.component.scss +4 -10
  586. package/schematics/collection.json +11 -0
  587. package/schematics/ng-add/index.js +70 -0
  588. package/schematics/ng-add/schema.json +15 -0
  589. package/scrollbar/_scrollbar-component-theme.scss +15 -19
  590. package/scrollbar/public-api.d.ts +1 -1
  591. package/scrollbar/scrollbar.component.scss +68 -63
  592. package/scrollbar/scrollbar.directive.d.ts +1 -1
  593. package/scrollbar/scrollbar.types.d.ts +1 -1
  594. package/select/_select-theme.scss +14 -16
  595. package/select/public-api.d.ts +2 -2
  596. package/select/select-option.directive.d.ts +3 -2
  597. package/select/select.component.d.ts +12 -33
  598. package/select/select.module.d.ts +1 -1
  599. package/select/select.scss +3 -11
  600. package/sidebar/public-api.d.ts +1 -1
  601. package/sidepanel/_sidepanel-theme.scss +8 -10
  602. package/sidepanel/public-api.d.ts +3 -3
  603. package/sidepanel/sidepanel.scss +20 -37
  604. package/splitter/_splitter-theme.scss +5 -6
  605. package/splitter/public-api.d.ts +1 -1
  606. package/splitter/splitter.component.d.ts +10 -5
  607. package/splitter/splitter.scss +0 -1
  608. package/table/_table-theme.scss +16 -15
  609. package/table/public-api.d.ts +1 -1
  610. package/table/table.component.d.ts +8 -1
  611. package/table/table.module.d.ts +1 -1
  612. package/table/table.scss +41 -42
  613. package/tabs/_tabs-common.scss +13 -15
  614. package/tabs/_tabs-theme.scss +76 -44
  615. package/tabs/paginated-tab-header.d.ts +1 -1
  616. package/tabs/public-api.d.ts +5 -5
  617. package/tabs/tab-body.component.d.ts +4 -4
  618. package/tabs/tab-group.component.d.ts +10 -4
  619. package/tabs/tab-group.scss +2 -8
  620. package/tabs/tab-header.scss +0 -10
  621. package/tabs/tab-nav-bar/tab-nav-bar.scss +2 -9
  622. package/tags/_tag-theme.scss +22 -27
  623. package/tags/public-api.d.ts +4 -4
  624. package/tags/tag-default-options.d.ts +1 -0
  625. package/tags/tag-input.d.ts +8 -2
  626. package/tags/tag-list.scss +15 -12
  627. package/tags/tag.component.d.ts +1 -1
  628. package/tags/tag.scss +5 -11
  629. package/textarea/_textarea-theme.scss +2 -5
  630. package/textarea/textarea.component.d.ts +1 -1
  631. package/textarea/textarea.scss +5 -10
  632. package/timepicker/public-api.d.ts +1 -1
  633. package/timepicker/timepicker.constants.d.ts +2 -0
  634. package/timepicker/timepicker.directive.d.ts +11 -4
  635. package/timepicker/timepicker.scss +2 -8
  636. package/timezone/_timezone-option-theme.scss +8 -10
  637. package/timezone/timezone-option.component.scss +5 -8
  638. package/timezone/timezone-option.directive.d.ts +4 -3
  639. package/timezone/timezone-select.component.d.ts +2 -1
  640. package/timezone/timezone-select.component.scss +2 -4
  641. package/timezone/timezone.utils.d.ts +1 -1
  642. package/title/public-api.d.ts +1 -1
  643. package/title/title.directive.d.ts +0 -1
  644. package/toast/_toast-theme.scss +20 -16
  645. package/toast/public-api.d.ts +3 -3
  646. package/toast/toast-container.component.scss +5 -6
  647. package/toast/toast.component.scss +28 -29
  648. package/toast/toast.service.d.ts +9 -5
  649. package/toast/toast.type.d.ts +3 -1
  650. package/toggle/_toggle-theme.scss +49 -42
  651. package/toggle/public-api.d.ts +1 -1
  652. package/toggle/toggle.scss +9 -22
  653. package/tooltip/_tooltip-theme.scss +12 -16
  654. package/tooltip/public-api.d.ts +1 -1
  655. package/tooltip/tooltip.component.d.ts +14 -10
  656. package/tooltip/tooltip.scss +7 -13
  657. package/tree/_tree-theme.scss +20 -23
  658. package/tree/public-api.d.ts +10 -10
  659. package/tree/toggle.scss +3 -6
  660. package/tree/tree-base.d.ts +2 -2
  661. package/tree/tree-option.component.d.ts +1 -1
  662. package/tree/tree-option.scss +17 -14
  663. package/tree/tree-selection.component.d.ts +2 -1
  664. package/tree-select/_tree-select-theme.scss +12 -15
  665. package/tree-select/public-api.d.ts +1 -1
  666. package/tree-select/tree-select.component.d.ts +13 -20
  667. package/tree-select/tree-select.module.d.ts +1 -2
  668. package/tree-select/tree-select.scss +1 -6
  669. package/core/styles/_variables.scss +0 -1
@@ -2,7 +2,7 @@
2
2
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
3
3
  import { Directive, ElementRef, EventEmitter, forwardRef, Inject, Input, Optional, Output, Renderer2 } from '@angular/core';
4
4
  import { NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
5
- import { UP_ARROW, RIGHT_ARROW, DOWN_ARROW, LEFT_ARROW, END, PAGE_DOWN, HOME, PAGE_UP, SPACE, TAB, ESCAPE, DELETE, BACKSPACE, hasModifierKey, isHorizontalMovement, isLetterKey, isVerticalMovement } from '@koobiq/cdk/keycodes';
5
+ import { BACKSPACE, DELETE, DOWN_ARROW, END, ESCAPE, hasModifierKey, HOME, isHorizontalMovement, isLetterKey, isVerticalMovement, LEFT_ARROW, PAGE_DOWN, PAGE_UP, RIGHT_ARROW, SPACE, TAB, UP_ARROW } from '@koobiq/cdk/keycodes';
6
6
  import { DateAdapter, KBQ_DATE_FORMATS, KBQ_LOCALE_SERVICE, KbqLocaleService, validationTooltipHideDelay, validationTooltipShowDelay } from '@koobiq/components/core';
7
7
  import { KbqFormFieldControl } from '@koobiq/components/form-field';
8
8
  import { KbqWarningTooltipTrigger } from '@koobiq/components/tooltip';
@@ -144,8 +144,7 @@ export class KbqDatepickerInput {
144
144
  this.datepicker = value;
145
145
  this.datepicker.registerInput(this);
146
146
  this.datepickerSubscription.unsubscribe();
147
- this.datepickerSubscription = this.datepicker.selectedChanged
148
- .subscribe((selected) => {
147
+ this.datepickerSubscription = this.datepicker.selectedChanged.subscribe((selected) => {
149
148
  const newValue = this.saveTimePart(selected);
150
149
  this.value = newValue;
151
150
  this.cvaOnChange(newValue);
@@ -328,8 +327,7 @@ export class KbqDatepickerInput {
328
327
  date[this.firstDigit.fullName] = this.firstDigit.parse(firsViewDigit);
329
328
  date[this.secondDigit.fullName] = this.secondDigit.parse(secondViewDigit);
330
329
  date[this.thirdDigit.fullName] = this.thirdDigit.parse(thirdViewDigit);
331
- const [digitWithYear, viewDigitWithYear] = [this.firstDigit, this.secondDigit, this.thirdDigit]
332
- .reduce((acc, digit, index) => digit.value === DateParts.year ? [digit, viewDigits[index]] : acc, []);
330
+ const [digitWithYear, viewDigitWithYear] = [this.firstDigit, this.secondDigit, this.thirdDigit].reduce((acc, digit, index) => (digit.value === DateParts.year ? [digit, viewDigits[index]] : acc), []);
333
331
  // tslint:disable-next-line:no-magic-numbers
334
332
  if (viewDigitWithYear.length < 3) {
335
333
  // tslint:disable-next-line:no-magic-numbers
@@ -368,29 +366,30 @@ export class KbqDatepickerInput {
368
366
  this.validatorOnChange = () => { };
369
367
  /** The form control validator for whether the input parses. */
370
368
  this.parseValidator = () => {
371
- return this.focused ||
372
- this.empty ||
373
- this.lastValueValid ? null : { kbqDatepickerParse: { text: this.elementRef.nativeElement.value } };
369
+ return this.focused || this.empty || this.lastValueValid
370
+ ? null
371
+ : { kbqDatepickerParse: { text: this.elementRef.nativeElement.value } };
374
372
  };
375
373
  /** The form control validator for the min date. */
376
374
  this.minValidator = (control) => {
377
375
  const controlValue = this.adapter.deserialize(control.value);
378
- return !this.min || !controlValue || this.adapter.compareDateTime(this.min, controlValue) <= 0 ?
379
- null :
380
- { kbqDatepickerMin: { min: this.min, actual: controlValue } };
376
+ return !this.min || !controlValue || this.adapter.compareDateTime(this.min, controlValue) <= 0
377
+ ? null
378
+ : { kbqDatepickerMin: { min: this.min, actual: controlValue } };
381
379
  };
382
380
  /** The form control validator for the max date. */
383
381
  this.maxValidator = (control) => {
384
382
  const controlValue = this.adapter.deserialize(control.value);
385
- return !this.max || !controlValue || this.adapter.compareDateTime(this.max, controlValue) >= 0 ?
386
- null :
387
- { kbqDatepickerMax: { max: this.max, actual: controlValue } };
383
+ return !this.max || !controlValue || this.adapter.compareDateTime(this.max, controlValue) >= 0
384
+ ? null
385
+ : { kbqDatepickerMax: { max: this.max, actual: controlValue } };
388
386
  };
389
387
  /** The form control validator for the date filter. */
390
388
  this.filterValidator = (control) => {
391
389
  const controlValue = this.adapter.deserialize(control.value);
392
- return !this.dateFilter || !controlValue || this.dateFilter(controlValue) ?
393
- null : { kbqDatepickerFilter: true };
390
+ return !this.dateFilter || !controlValue || this.dateFilter(controlValue)
391
+ ? null
392
+ : { kbqDatepickerFilter: true };
394
393
  };
395
394
  this.validator = Validators.compose([
396
395
  this.parseValidator,
@@ -402,8 +401,7 @@ export class KbqDatepickerInput {
402
401
  throw createMissingDateImplError('DateAdapter');
403
402
  }
404
403
  this.setFormat(this.dateInputFormat);
405
- this.localeSubscription = adapter.localeChanges
406
- .subscribe(this.updateLocaleParams);
404
+ this.localeSubscription = adapter.localeChanges.subscribe(this.updateLocaleParams);
407
405
  }
408
406
  onContainerClick() {
409
407
  this.focus();
@@ -556,7 +554,7 @@ export class KbqDatepickerInput {
556
554
  this.separator = format.match(/[aA-zZ]+(?<separator>\W|\D)[aA-zZ]+/).groups.separator;
557
555
  this.separatorPositions = format
558
556
  .split('')
559
- .reduce((acc, item, index) => this.separator === item ? [...acc, index + 1] : acc, []);
557
+ .reduce((acc, item, index) => (this.separator === item ? [...acc, index + 1] : acc), []);
560
558
  this.getDigitPositions(format);
561
559
  }
562
560
  updateValue(newValue) {
@@ -578,9 +576,10 @@ export class KbqDatepickerInput {
578
576
  return isLetterKey(event) && !event.ctrlKey && !event.metaKey;
579
577
  }
580
578
  isKeyForByPass(event) {
581
- return (hasModifierKey(event) && (isVerticalMovement(event) || isHorizontalMovement(event))) ||
582
- event.ctrlKey || event.metaKey ||
583
- [DELETE, BACKSPACE, TAB].includes(event.keyCode);
579
+ return ((hasModifierKey(event) && (isVerticalMovement(event) || isHorizontalMovement(event))) ||
580
+ event.ctrlKey ||
581
+ event.metaKey ||
582
+ [DELETE, BACKSPACE, TAB].includes(event.keyCode));
584
583
  }
585
584
  spaceKeyHandler(event) {
586
585
  event.preventDefault();
@@ -619,9 +618,7 @@ export class KbqDatepickerInput {
619
618
  return null;
620
619
  }
621
620
  const date = this.getDefaultValue();
622
- const viewDigits = timeString
623
- .split(this.separator)
624
- .map((value) => value);
621
+ const viewDigits = timeString.split(this.separator).map((value) => value);
625
622
  const [firsViewDigit, secondViewDigit, thirdViewDigit] = viewDigits;
626
623
  if (viewDigits.length === 1) {
627
624
  if (/\D/.test(firsViewDigit) || firsViewDigit.length < this.firstDigit.length) {
@@ -653,7 +650,7 @@ export class KbqDatepickerInput {
653
650
  digitViewValue[dateDigit.fullName] = parseInt(viewDigits[index]);
654
651
  }
655
652
  if (this.value && digitViewValue.month && digitViewValue.month <= this.firstDigit.maxMonth) {
656
- dateDigits.forEach((digit) => digit.maxDays = this.getLastDayFor(digitViewValue.year, digitViewValue.month - 1));
653
+ dateDigits.forEach((digit) => (digit.maxDays = this.getLastDayFor(digitViewValue.year, digitViewValue.month - 1)));
657
654
  }
658
655
  date[this.firstDigit.fullName] = this.firstDigit.parse(firsViewDigit);
659
656
  date[this.secondDigit.fullName] = this.secondDigit.parse(secondViewDigit);
@@ -788,14 +785,28 @@ export class KbqDatepickerInput {
788
785
  cursorPos = this.viewValue.length;
789
786
  }
790
787
  else if (keyCode === LEFT_ARROW) {
788
+ this.fixEmptyDigit();
791
789
  cursorPos = cursorPos === 0 ? this.viewValue.length : cursorPos - 1;
792
790
  }
793
791
  else if (keyCode === RIGHT_ARROW) {
792
+ this.fixEmptyDigit();
794
793
  const nextSeparatorPos = this.viewValue.indexOf(this.separator, cursorPos);
795
794
  cursorPos = nextSeparatorPos ? nextSeparatorPos + 1 : 0;
796
795
  }
797
796
  this.selectDigitByCursor(cursorPos);
798
797
  }
798
+ fixEmptyDigit() {
799
+ const hasEmptyDigit = this.viewValue
800
+ .split(this.separator)
801
+ .map((part) => part.length)
802
+ .some((item) => !item);
803
+ if (hasEmptyDigit && this.value) {
804
+ const year = this.adapter.getYear(this.value);
805
+ const month = this.adapter.getMonth(this.value);
806
+ const day = this.adapter.getDate(this.value);
807
+ this.value = this.createDate(year, month, day);
808
+ }
809
+ }
799
810
  selectDigitByCursor(cursorPos) {
800
811
  setTimeout(() => {
801
812
  const [, selectionStart, selectionEnd] = this.getDateEditMetrics(cursorPos);
@@ -836,23 +847,20 @@ export class KbqDatepickerInput {
836
847
  return;
837
848
  }
838
849
  this.control = control;
839
- this.control.valueChanges
840
- .subscribe((value) => this._value = value);
850
+ this.control.valueChanges.subscribe((value) => (this._value = value));
841
851
  }
842
852
  /**
843
853
  * @param obj The object to check.
844
854
  * @returns The given object if it is both a date instance and valid, otherwise null.
845
855
  */
846
856
  getValidDateOrNull(obj) {
847
- return (this.adapter.isDateInstance(obj) && this.adapter.isValid(obj)) ? obj : null;
857
+ return this.adapter.isDateInstance(obj) && this.adapter.isValid(obj) ? obj : null;
848
858
  }
849
859
  getDigitPositions(format) {
850
860
  this.firstDigit = this.secondDigit = this.thirdDigit = null;
851
861
  const formatInLowerCase = format.toLowerCase();
852
- formatInLowerCase
853
- .split('')
854
- .reduce(({ prev, length, start }, value, index, arr) => {
855
- if (value === this.separator || (arr.length - 1) === index) {
862
+ formatInLowerCase.split('').reduce(({ prev, length, start }, value, index, arr) => {
863
+ if (value === this.separator || arr.length - 1 === index) {
856
864
  if (!this.firstDigit) {
857
865
  this.firstDigit = new DateDigit(prev, start, length);
858
866
  }
@@ -960,4 +968,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.0", ngImpor
960
968
  }], dateInput: [{
961
969
  type: Output
962
970
  }] } });
963
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21wb25lbnRzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUNBQXVDO0FBQ3ZDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0gsYUFBYSxFQUNiLGlCQUFpQixFQUlqQixVQUFVLEVBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0gsUUFBUSxFQUNSLFdBQVcsRUFDWCxVQUFVLEVBQ1YsVUFBVSxFQUNWLEdBQUcsRUFDSCxTQUFTLEVBQ1QsSUFBSSxFQUNKLE9BQU8sRUFDUCxLQUFLLEVBQ0wsR0FBRyxFQUNILE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsV0FBVyxFQUNYLGtCQUFrQixFQUNyQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDSCxXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUVsQixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUM3QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTdDLE9BQU8sRUFBRSwwQkFB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RUFBRSxhQUFhO3dCQUNuQyxpQkFBaUIsRUFBRSxVQUFVO3dCQUM3QixpQkFBaUIsRUFBRSxrQkFBa0I7d0JBQ3JDLFlBQVksRUFBRSw2QkFBNkI7d0JBQzNDLFlBQVksRUFBRSw2QkFBNkI7d0JBQzNDLHFCQUFxQixFQUFFLE9BQU87d0JBRTlCLFNBQVMsRUFBRSxpQkFBaUI7d0JBQzVCLFVBQVUsRUFBRSxZQUFZO3dCQUV4QixTQUFTLEVBQUUsb0JBQW9CO3dCQUMvQixRQUFRLEVBQUUsVUFBVTt3QkFFcEIsV0FBVyxFQUFFLG1CQUFtQjtxQkFDbkM7aUJBQ0o7OzBCQXlQUSxRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQjs7MEJBQ25DLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsa0JBQWtCO3lDQXRPdEMsV0FBVztzQkFEZCxLQUFLO2dCQWFGLFFBQVE7c0JBRFgsS0FBSztnQkFhRixhQUFhO3NCQURoQixLQUFLO2dCQXFCRixtQkFBbUI7c0JBRHRCLEtBQUs7Z0JBUUYsS0FBSztzQkFEUixLQUFLO2dCQXlCRixHQUFHO3NCQUROLEtBQUs7Z0JBY0YsR0FBRztzQkFETixLQUFLO2dCQWNGLFFBQVE7c0JBRFgsS0FBSztnQkEwQkYsRUFBRTtzQkFETCxLQUFLO2dCQVlGLG9CQUFvQjtzQkFEdkIsS0FBSztnQkFrQkksY0FBYztzQkFBdkIsTUFBTTtnQkFHWSxVQUFVO3NCQUE1QixNQUFNO2dCQUdZLFNBQVM7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZTpuby1lbXB0eSwgZGVwcmVjYXRpb25cbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIE5HX1ZBTElEQVRPUlMsXG4gICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgVmFsaWRhdGlvbkVycm9ycyxcbiAgICBWYWxpZGF0b3IsXG4gICAgVmFsaWRhdG9yRm4sXG4gICAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICAgIFVQX0FSUk9XLFxuICAgIFJJR0hUX0FSUk9XLFxuICAgIERPV05fQVJST1csXG4gICAgTEVGVF9BUlJPVyxcbiAgICBFTkQsXG4gICAgUEFHRV9ET1dOLFxuICAgIEhPTUUsXG4gICAgUEFHRV9VUCxcbiAgICBTUEFDRSxcbiAgICBUQUIsXG4gICAgRVNDQVBFLFxuICAgIERFTEVURSxcbiAgICBCQUNLU1BBQ0UsXG4gICAgaGFzTW9kaWZpZXJLZXksXG4gICAgaXNIb3Jpem9udGFsTW92ZW1lbnQsXG4gICAgaXNMZXR0ZXJLZXksXG4gICAgaXNWZXJ0aWNhbE1vdmVtZW50XG59IGZyb20gJ0Brb29iaXEvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7XG4gICAgRGF0ZUFkYXB0ZXIsXG4gICAgS0JRX0RBVEVfRk9STUFUUyxcbiAgICBLQlFfTE9DQUxFX1NFUlZJQ0UsXG4gICAgS2JxRGF0ZUZvcm1hdHMsXG4gICAgS2JxTG9jYWxlU2VydmljZSxcbiAgICB2YWxpZGF0aW9uVG9vbHRpcEhpZGVEZWxheSxcbiAgICB2YWxpZGF0aW9uVG9vbHRpcFNob3dEZWxheVxufSBmcm9tICdAa29vYmlxL2NvbXBvbmVudHMvY29yZSc7XG5pbXBvcnQgeyBLYnFGb3JtRmllbGRDb250cm9sIH0gZnJvbSAnQGtvb2JpcS9jb21wb25lbnRzL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgS2JxV2FybmluZ1Rvb2x0aXBUcmlnZ2VyIH0gZnJvbSAnQGtvb2JpcS9jb21wb25lbnRzL3Rvb2x0aXAnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGNyZWF0ZU1pc3NpbmdEYXRlSW1wbEVycm9yIH0gZnJvbSAnLi9kYXRlcGlja2VyLWVycm9ycyc7XG5pbXBvcnQgeyBLYnFEYXRlcGlja2VyIH0gZnJvbSAnLi9kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5cblxuLy8gdHNsaW50OmRpc2FibGU6bmFtaW5nLWNvbnZlbnRpb25cbmVudW0gRGF0ZVBhcnRzIHtcbiAgICB5ZWFyID0gJ3knLFxuICAgIG1vbnRoID0gJ20nLFxuICAgIGRheSA9ICdkJ1xufVxuXG5leHBvcnQgY29uc3QgTUFYX1lFQVIgPSA5OTk5O1xuY29uc3QgWUVBUl9MRU5HVEggPSA0O1xuXG5jbGFzcyBEYXRlRGlnaXQge1xuICAgIG1heERheXMgPSAzMTtcbiAgICBtYXhNb250aCA9IDEyO1xuXG4gICAgcGFyc2U6ICh2YWx1ZTogc3RyaW5nKSA9PiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsdWU6IERhdGVQYXJ0cywgcHVibGljIHN0YXJ0OiBudW1iZXIsIHB1YmxpYyBsZW5ndGg6IG51bWJlcikge1xuICAgICAgICBpZiAodmFsdWUgPT09IERhdGVQYXJ0cy5kYXkpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2UgPSB0aGlzLnBhcnNlRGF5O1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBEYXRlUGFydHMubW9udGgpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2UgPSB0aGlzLnBhcnNlTW9udGg7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IERhdGVQYXJ0cy55ZWFyKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5wYXJzZVllYXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZW5kKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0ICsgdGhpcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0IGlzRGF5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gRGF0ZVBhcnRzLmRheTtcbiAgICB9XG5cbiAgICBnZXQgaXNNb250aCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IERhdGVQYXJ0cy5tb250aDtcbiAgICB9XG5cbiAgICBnZXQgaXNZZWFyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gRGF0ZVBhcnRzLnllYXI7XG4gICAgfVxuXG4gICAgZ2V0IGZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmlzRGF5KSB7IHJldHVybiAnZGF0ZSc7IH1cblxuICAgICAgICBpZiAodGhpcy5pc01vbnRoKSB7IHJldHVybiAnbW9udGgnOyB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNZZWFyKSB7IHJldHVybiAneWVhcic7IH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZURheSh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWU6IG51bWJlciA9IHBhcnNlSW50KHZhbHVlKTtcblxuICAgICAgICBpZiAocGFyc2VkVmFsdWUgPT09IDApIHsgcmV0dXJuIDE7IH1cblxuICAgICAgICBpZiAocGFyc2VkVmFsdWUgPiB0aGlzLm1heERheXMpIHsgcmV0dXJuIHRoaXMubWF4RGF5czsgfVxuXG4gICAgICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlTW9udGgodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlOiBudW1iZXIgPSBwYXJzZUludCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHBhcnNlZFZhbHVlID09PSAwKSB7IHJldHVybiAxOyB9XG5cbiAgICAgICAgaWYgKHBhcnNlZFZhbHVlID4gdGhpcy5tYXhNb250aCkgeyByZXR1cm4gdGhpcy5tYXhNb250aDsgfVxuXG4gICAgICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlWWVhcih2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWU6IG51bWJlciA9IHBhcnNlSW50KHZhbHVlKTtcblxuICAgICAgICBpZiAocGFyc2VkVmFsdWUgPT09IDApIHsgcmV0dXJuIDE7IH1cblxuICAgICAgICBpZiAocGFyc2VkVmFsdWUgPiBNQVhfWUVBUikgeyByZXR1cm4gcGFyc2VJbnQodmFsdWUuc3Vic3RyaW5nKDAsIFlFQVJfTEVOR1RIKSk7IH1cblxuICAgICAgICByZXR1cm4gcGFyc2VkVmFsdWU7XG4gICAgfVxufVxuXG4vKiogQGRvY3MtcHJpdmF0ZSAqL1xuZXhwb3J0IGNvbnN0IEtCUV9EQVRFUElDS0VSX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gS2JxRGF0ZXBpY2tlcklucHV0KSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBjb25zdCBLQlFfREFURVBJQ0tFUl9WQUxJREFUT1JTOiBhbnkgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBLYnFEYXRlcGlja2VySW5wdXQpLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG5cbi8qKlxuICogQW4gZXZlbnQgdXNlZCBmb3IgZGF0ZXBpY2tlciBpbnB1dCBhbmQgY2hhbmdlIGV2ZW50cy4gV2UgZG9uJ3QgYWx3YXlzIGhhdmUgYWNjZXNzIHRvIGEgbmF0aXZlXG4gKiBpbnB1dCBvciBjaGFuZ2UgZXZlbnQgYmVjYXVzZSB0aGUgZXZlbnQgbWF5IGhhdmUgYmVlbiB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIgY2xpY2tpbmcgb24gdGhlXG4gKiBjYWxlbmRhciBwb3B1cC4gRm9yIGNvbnNpc3RlbmN5LCB3ZSBhbHdheXMgdXNlIEticURhdGVwaWNrZXJJbnB1dEV2ZW50IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBLYnFEYXRlcGlja2VySW5wdXRFdmVudDxEPiB7XG4gICAgLyoqIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB0YXJnZXQgZGF0ZXBpY2tlciBpbnB1dC4gKi9cbiAgICB2YWx1ZTogRCB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgLyoqIFJlZmVyZW5jZSB0byB0aGUgZGF0ZXBpY2tlciBpbnB1dCBjb21wb25lbnQgdGhhdCBlbWl0dGVkIHRoZSBldmVudC4gKi9cbiAgICAgICAgcHVibGljIHRhcmdldDogS2JxRGF0ZXBpY2tlcklucHV0PEQ+LFxuICAgICAgICAvKiogUmVmZXJlbmNlIHRvIHRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGVwaWNrZXIgaW5wdXQuICovXG4gICAgICAgIHB1YmxpYyB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudFxuICAgICkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy50YXJnZXQudmFsdWU7XG4gICAgfVxufVxuXG5sZXQgdW5pcXVlQ29tcG9uZW50SWRTdWZmaXggPSAwO1xuXG5pbnRlcmZhY2UgRGF0ZVRpbWVPYmplY3Qge1xuICAgIHllYXI6IG51bWJlcjtcbiAgICBtb250aDogbnVtYmVyO1xuICAgIGRhdGU6IG51bWJlcjtcbiAgICBob3VyczogbnVtYmVyO1xuICAgIG1pbnV0ZXM6IG51bWJlcjtcbiAgICBzZWNvbmRzOiBudW1iZXI7XG4gICAgbWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cblxuLyoqIERpcmVjdGl2ZSB1c2VkIHRvIGNvbm5lY3QgYW4gaW5wdXQgdG8gYSBLYnFEYXRlcGlja2VyLiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdpbnB1dFtrYnFEYXRlcGlja2VyXScsXG4gICAgZXhwb3J0QXM6ICdrYnFEYXRlcGlja2VySW5wdXQnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBLQlFfREFURVBJQ0tFUl9WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgS0JRX0RBVEVQSUNLRVJfVkFMSURBVE9SUyxcbiAgICAgICAgeyBwcm92aWRlOiBLYnFGb3JtRmllbGRDb250cm9sLCB1c2VFeGlzdGluZzogS2JxRGF0ZXBpY2tlcklucHV0IH1cbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdrYnEtaW5wdXQga2JxLWRhdGVwaWNrZXInLFxuICAgICAgICAnW2F0dHIucGxhY2Vob2xkZXJdJzogJ3BsYWNlaG9sZGVyJyxcbiAgICAgICAgJ1thdHRyLnJlcXVpcmVkXSc6ICdyZXF1aXJlZCcsXG4gICAgICAgICdbYXR0ci5kaXNhYmxlZF0nOiAnZGlzYWJsZWQgfHwgbnVsbCcsXG4gICAgICAgICdbYXR0ci5taW5dJzogJ21pbiA/IHRvSVNPODYwMShtaW4pIDogbnVsbCcsXG4gICAgICAgICdbYXR0ci5tYXhdJzogJ21heCA/IHRvSVNPODYwMShtYXgpIDogbnVsbCcsXG4gICAgICAgICdbYXR0ci5hdXRvY29tcGxldGVdJzogJ1wib2ZmXCInLFxuXG4gICAgICAgICcocGFzdGUpJzogJ29uUGFzdGUoJGV2ZW50KScsXG4gICAgICAgICcoY2hhbmdlKSc6ICdvbkNoYW5nZSgpJyxcblxuICAgICAgICAnKGZvY3VzKSc6ICdmb2N1c0NoYW5nZWQodHJ1ZSknLFxuICAgICAgICAnKGJsdXIpJzogJ29uQmx1cigpJyxcblxuICAgICAgICAnKGtleWRvd24pJzogJ29uS2V5RG93bigkZXZlbnQpJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgS2JxRGF0ZXBpY2tlcklucHV0PEQ+IGltcGxlbWVudHMgS2JxRm9ybUZpZWxkQ29udHJvbDxEPiwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25EZXN0cm95IHtcbiAgICByZWFkb25seSBzdGF0ZUNoYW5nZXM6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgcmVhZG9ubHkgZXJyb3JTdGF0ZTogYm9vbGVhbjtcblxuICAgIGNvbnRyb2xUeXBlOiBzdHJpbmcgPSAnZGF0ZXBpY2tlcic7XG5cbiAgICBmb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBkYXRlcGlja2VyOiBLYnFEYXRlcGlja2VyPEQ+O1xuXG4gICAgZGF0ZUZpbHRlcjogKGRhdGU6IEQgfCBudWxsKSA9PiBib29sZWFuO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMgKGVpdGhlciBkdWUgdG8gdXNlciBpbnB1dCBvciBwcm9ncmFtbWF0aWMgY2hhbmdlKS4gKi9cbiAgICB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RCB8IG51bGw+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgZGlzYWJsZWQgc3RhdGUgaGFzIGNoYW5nZWQgKi9cbiAgICBkaXNhYmxlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVzZVBsYWNlaG9sZGVyRnJvbUlucHV0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgICBASW5wdXQoKVxuICAgIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICAgIH1cblxuICAgIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgICAvKiogVGhlIGRhdGVwaWNrZXIgdGhhdCB0aGlzIGlucHV0IGlzIGFzc29jaWF0ZWQgd2l0aC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBrYnFEYXRlcGlja2VyKHZhbHVlOiBLYnFEYXRlcGlja2VyPEQ+KSB7XG4gICAgICAgIGlmICghdmFsdWUpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdGhpcy5kYXRlcGlja2VyID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlci5yZWdpc3RlcklucHV0KHRoaXMpO1xuICAgICAgICB0aGlzLmRhdGVwaWNrZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcblxuICAgICAgICB0aGlzLmRhdGVwaWNrZXJTdWJzY3JpcHRpb24gPSB0aGlzLmRhdGVwaWNrZXIuc2VsZWN0ZWRDaGFuZ2VkXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChzZWxlY3RlZDogRCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5zYXZlVGltZVBhcnQoc2VsZWN0ZWQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY3ZhT25DaGFuZ2UobmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQobmV3IEticURhdGVwaWNrZXJJbnB1dEV2ZW50KHRoaXMsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogRnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgb3V0IGRhdGVzIHdpdGhpbiB0aGUgZGF0ZXBpY2tlci4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBrYnFEYXRlcGlja2VyRmlsdGVyKHZhbHVlOiAoZGF0ZTogRCB8IG51bGwpID0+IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kYXRlRmlsdGVyID0gdmFsdWU7XG4gICAgICAgIHRoaXMudmFsaWRhdG9yT25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIHZhbHVlIG9mIHRoZSBpbnB1dC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCB2YWx1ZSgpOiBEIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgdmFsdWUodmFsdWU6IEQgfCBudWxsKSB7XG4gICAgICAgIGxldCBuZXdWYWx1ZSA9IHRoaXMuYWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA9ICFuZXdWYWx1ZSB8fCB0aGlzLmFkYXB0ZXIuaXNWYWxpZChuZXdWYWx1ZSk7XG5cbiAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmdldFZhbGlkRGF0ZU9yTnVsbChuZXdWYWx1ZSk7XG5cbiAgICAgICAgY29uc3Qgb2xkRGF0ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMuZm9ybWF0VmFsdWUobmV3VmFsdWUpO1xuXG4gICAgICAgIGlmICghdGhpcy5hZGFwdGVyLnNhbWVEYXRlKG9sZERhdGUsIG5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3ZhbHVlOiBEIHwgbnVsbDtcblxuICAgIC8qKiBUaGUgbWluaW11bSB2YWxpZCBkYXRlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IG1pbigpOiBEIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW47XG4gICAgfVxuXG4gICAgc2V0IG1pbih2YWx1ZTogRCB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbWluID0gdGhpcy5hZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKTtcbiAgICAgICAgdGhpcy52YWxpZGF0b3JPbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX21pbjogRCB8IG51bGw7XG5cbiAgICAvKiogVGhlIG1heGltdW0gdmFsaWQgZGF0ZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBtYXgoKTogRCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4O1xuICAgIH1cblxuICAgIHNldCBtYXgodmFsdWU6IEQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX21heCA9IHRoaXMuYWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMudmFsaWRhdG9yT25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9tYXg6IEQgfCBudWxsO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGRhdGVwaWNrZXItaW5wdXQgaXMgZGlzYWJsZWQuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX2Rpc2FibGVkICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRDaGFuZ2UuZW1pdChuZXdWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBuZWVkIHRvIG51bGwgY2hlY2sgdGhlIGBibHVyYCBtZXRob2QsIGJlY2F1c2UgaXQncyB1bmRlZmluZWQgZHVyaW5nIFNTUi5cbiAgICAgICAgaWYgKG5ld1ZhbHVlICYmIGVsZW1lbnQuYmx1cikge1xuICAgICAgICAgICAgLy8gTm9ybWFsbHksIG5hdGl2ZSBpbnB1dCBlbGVtZW50cyBhdXRvbWF0aWNhbGx5IGJsdXIgaWYgdGhleSB0dXJuIGRpc2FibGVkLiBUaGlzIGJlaGF2aW9yXG4gICAgICAgICAgICAvLyBpcyBwcm9ibGVtYXRpYywgYmVjYXVzZSBpdCB3b3VsZCBtZWFuIHRoYXQgaXQgdHJpZ2dlcnMgYW5vdGhlciBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLFxuICAgICAgICAgICAgLy8gd2hpY2ggdGhlbiBjYXVzZXMgYSBjaGFuZ2VkIGFmdGVyIGNoZWNrZWQgZXJyb3IgaWYgdGhlIGlucHV0IGVsZW1lbnQgd2FzIGZvY3VzZWQgYmVmb3JlLlxuICAgICAgICAgICAgZWxlbWVudC5ibHVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkO1xuICAgIH1cblxuICAgIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2lkID0gdmFsdWUgfHwgdGhpcy51aWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IGticVZhbGlkYXRpb25Ub29sdGlwKHRvb2x0aXA6IEticVdhcm5pbmdUb29sdGlwVHJpZ2dlcikge1xuICAgICAgICBpZiAoIXRvb2x0aXApIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdG9vbHRpcC5lbnRlckRlbGF5ID0gdmFsaWRhdGlvblRvb2x0aXBTaG93RGVsYXk7XG4gICAgICAgIHRvb2x0aXAudHJpZ2dlciA9ICdtYW51YWwnO1xuXG4gICAgICAgIHRvb2x0aXAuaW5pdExpc3RlbmVycygpO1xuXG4gICAgICAgIHRoaXMuaW5jb3JyZWN0SW5wdXQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0b29sdGlwLmlzT3BlbikgeyByZXR1cm47IH1cblxuICAgICAgICAgICAgdG9vbHRpcC5zaG93KCk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdG9vbHRpcC5oaWRlKCksIHZhbGlkYXRpb25Ub29sdGlwSGlkZURlbGF5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQE91dHB1dCgpIGluY29ycmVjdElucHV0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gYSBgY2hhbmdlYCBldmVudCBpcyBmaXJlZCBvbiB0aGlzIGA8aW5wdXQ+YC4gKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgZGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8S2JxRGF0ZXBpY2tlcklucHV0RXZlbnQ8RD4+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiBhbiBgaW5wdXRgIGV2ZW50IGlzIGZpcmVkIG9uIHRoaXMgYDxpbnB1dD5gLiAqL1xuICAgIEBPdXRwdXQoKSByZWFkb25seSBkYXRlSW5wdXQgPSBuZXcgRXZlbnRFbWl0dGVyPEticURhdGVwaWNrZXJJbnB1dEV2ZW50PEQ+PigpO1xuXG4gICAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMudmlld1ZhbHVlICYmICF0aGlzLmlzQmFkSW5wdXQoKTtcbiAgICB9XG5cbiAgICBnZXQgdmlld1ZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgbmdDb250cm9sKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2w7XG4gICAgfVxuXG4gICAgZ2V0IGlzUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZWFkT25seTtcbiAgICB9XG5cbiAgICBnZXQgZGF0ZUlucHV0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVGb3JtYXRzPy5kYXRlSW5wdXQgfHwgdGhpcy5hZGFwdGVyLmNvbmZpZy5kYXRlSW5wdXQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgcmVhZHlGb3JQYXJzZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuZmlyc3REaWdpdCAmJiB0aGlzLnNlY29uZERpZ2l0ICYmIHRoaXMudGhpcmREaWdpdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgc2VsZWN0aW9uU3RhcnQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldCBzZWxlY3Rpb25TdGFydCh2YWx1ZTogbnVtYmVyIHwgbnVsbCkge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IHNlbGVjdGlvbkVuZCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldCBzZWxlY3Rpb25FbmQodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w7XG4gICAgcHJpdmF0ZSByZWFkb25seSB1aWQgPSBga2JxLWRhdGVwaWNrZXItJHt1bmlxdWVDb21wb25lbnRJZFN1ZmZpeCsrfWA7XG5cbiAgICBwcml2YXRlIGRhdGVwaWNrZXJTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgICBwcml2YXRlIGxvY2FsZVN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBsYXN0IHZhbHVlIHNldCBvbiB0aGUgaW5wdXQgd2FzIHZhbGlkLiAqL1xuICAgIHByaXZhdGUgbGFzdFZhbHVlVmFsaWQgPSBmYWxzZTtcblxuICAgIC8qKiBUaGUgY29tYmluZWQgZm9ybSBjb250cm9sIHZhbGlkYXRvciBmb3IgdGhpcyBpbnB1dC4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcjogVmFsaWRhdG9yRm4gfCBudWxsO1xuXG4gICAgcHJpdmF0ZSBzZXBhcmF0b3I6IHN0cmluZztcblxuICAgIHByaXZhdGUgZmlyc3REaWdpdDogRGF0ZURpZ2l0IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBzZWNvbmREaWdpdDogRGF0ZURpZ2l0IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSB0aGlyZERpZ2l0OiBEYXRlRGlnaXQgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgc2VwYXJhdG9yUG9zaXRpb25zOiBudW1iZXJbXTtcblxuICAgIHByaXZhdGUgdXNlUGxhY2Vob2xkZXJGcm9tSW5wdXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBAT3B0aW9uYWwoKSByZWFkb25seSBhZGFwdGVyOiBEYXRlQWRhcHRlcjxEPixcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChLQlFfREFURV9GT1JNQVRTKSBwcml2YXRlIHJlYWRvbmx5IGRhdGVGb3JtYXRzOiBLYnFEYXRlRm9ybWF0cyxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChLQlFfTE9DQUxFX1NFUlZJQ0UpIHByaXZhdGUgbG9jYWxlU2VydmljZTogS2JxTG9jYWxlU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLnZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICB0aGlzLnBhcnNlVmFsaWRhdG9yLFxuICAgICAgICAgICAgdGhpcy5taW5WYWxpZGF0b3IsXG4gICAgICAgICAgICB0aGlzLm1heFZhbGlkYXRvcixcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyVmFsaWRhdG9yXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVNaXNzaW5nRGF0ZUltcGxFcnJvcignRGF0ZUFkYXB0ZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Rm9ybWF0KHRoaXMuZGF0ZUlucHV0Rm9ybWF0KTtcblxuICAgICAgICB0aGlzLmxvY2FsZVN1YnNjcmlwdGlvbiA9IGFkYXB0ZXIubG9jYWxlQ2hhbmdlc1xuICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLnVwZGF0ZUxvY2FsZVBhcmFtcyk7XG4gICAgfVxuXG4gICAgb25Db250YWluZXJDbGljaygpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cblxuICAgIGZvY3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIGZvY3VzQ2hhbmdlZChpc0ZvY3VzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzRm9jdXNlZCAhPT0gdGhpcy5mb2N1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBpc0ZvY3VzZWQ7XG4gICAgICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWVtcHR5XG4gICAgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kYXRlcGlja2VyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMubG9jYWxlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlZENoYW5nZS5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbGlkYXRvck9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIHRoaXMuc2V0Q29udHJvbChjb250cm9sKTtcblxuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0b3IgPyB0aGlzLnZhbGlkYXRvcihjb250cm9sKSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBEKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3ZhT25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvLyBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgLy8gSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVhZE9ubHkpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgY29uc3Qga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNMZXR0ZXJLZXkoZXZlbnQpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICB0aGlzLmluY29ycmVjdElucHV0LmVtaXQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzS2V5Rm9yT3BlbihldmVudCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIHRoaXMuZGF0ZXBpY2tlcj8ub3BlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNLZXlGb3JDbG9zZShldmVudCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIHRoaXMuZGF0ZXBpY2tlci5jbG9zZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IFRBQikge1xuICAgICAgICAgICAgdGhpcy5kYXRlcGlja2VyLmNsb3NlKGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzS2V5Rm9yQnlQYXNzKGV2ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IFNQQUNFKSB7XG4gICAgICAgICAgICB0aGlzLnNwYWNlS2V5SGFuZGxlcihldmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoW1VQX0FSUk9XLCBET1dOX0FSUk9XXS5pbmNsdWRlcyhrZXlDb2RlKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbEFycm93S2V5SGFuZGxlcihrZXlDb2RlKTtcbiAgICAgICAgfSBlbHNlIGlmIChbTEVGVF9BUlJPVywgUklHSFRfQVJST1csIEhPTUUsIFBBR0VfVVAsIEVORCwgUEFHRV9ET1dOXS5pbmNsdWRlcyhrZXlDb2RlKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VDYXJldFBvc2l0aW9uKGtleUNvZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKC9eXFxEJC8udGVzdChldmVudC5rZXkpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuZ2V0TmV3VmFsdWUoZXZlbnQua2V5LCB0aGlzLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcik7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMucmVwbGFjZVN5bWJvbHMobmV3VmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IGZvcm1hdHRlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWaWV3VmFsdWUoZm9ybWF0dGVkVmFsdWUsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCh0aGlzLm9uSW5wdXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdElucHV0LmVtaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQodGhpcy5vbklucHV0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uSW5wdXQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ycmVjdEN1cnNvclBvc2l0aW9uKCk7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5yZXBsYWNlU3ltYm9scyh0aGlzLnZpZXdWYWx1ZSk7XG5cbiAgICAgICAgY29uc3QgbmV3VGltZU9iaiA9IHRoaXMuZ2V0RGF0ZUZyb21TdHJpbmcoZm9ybWF0dGVkVmFsdWUpO1xuICAgICAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID0gISFuZXdUaW1lT2JqO1xuXG4gICAgICAgIGlmICghbmV3VGltZU9iaikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKG5ld1RpbWVPYmogYXMgRCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKHRoaXMuZ2V0VGltZVN0cmluZ0Zyb21EYXRlKG5ld1RpbWVPYmosIHRoaXMuZGF0ZUlucHV0Rm9ybWF0KSwgdHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3ROZXh0RGlnaXRCeUN1cnNvcigodGhpcy5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKG5ld1RpbWVPYmopO1xuICAgIH1cblxuICAgIHBhcnNlT25CbHVyID0gKCk6IGFueSA9PiB7XG4gICAgICAgIGlmICghdGhpcy52aWV3VmFsdWUgfHwgIXRoaXMucmVhZHlGb3JQYXJzZSkgeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgICAgIGNvbnN0IGRhdGU6IERhdGVUaW1lT2JqZWN0ID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoKTtcblxuICAgICAgICBjb25zdCB2aWV3RGlnaXRzOiBzdHJpbmdbXSA9IHRoaXMudmlld1ZhbHVlXG4gICAgICAgICAgICAuc3BsaXQodGhpcy5zZXBhcmF0b3IpXG4gICAgICAgICAgICAubWFwKCh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZSlcbiAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSk7XG5cbiAgICAgICAgY29uc3QgW2ZpcnNWaWV3RGlnaXQsIHNlY29uZFZpZXdEaWdpdCwgdGhpcmRWaWV3RGlnaXRdID0gdmlld0RpZ2l0cztcblxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbWFnaWMtbnVtYmVyc1xuICAgICAgICBpZiAodmlld0RpZ2l0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRlW3RoaXMuZmlyc3REaWdpdCEuZnVsbE5hbWVdID0gdGhpcy5maXJzdERpZ2l0IS5wYXJzZShmaXJzVmlld0RpZ2l0KTtcbiAgICAgICAgZGF0ZVt0aGlzLnNlY29uZERpZ2l0IS5mdWxsTmFtZV0gPSB0aGlzLnNlY29uZERpZ2l0IS5wYXJzZShzZWNvbmRWaWV3RGlnaXQpO1xuICAgICAgICBkYXRlW3RoaXMudGhpcmREaWdpdCEuZnVsbE5hbWVdID0gdGhpcy50aGlyZERpZ2l0IS5wYXJzZSh0aGlyZFZpZXdEaWdpdCk7XG5cbiAgICAgICAgY29uc3QgW2RpZ2l0V2l0aFllYXIsIHZpZXdEaWdpdFdpdGhZZWFyXSA9IFt0aGlzLmZpcnN0RGlnaXQsIHRoaXMuc2Vjb25kRGlnaXQsIHRoaXMudGhpcmREaWdpdF1cbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYzogYW55LCBkaWdpdCwgaW5kZXgpID0+IGRpZ2l0IS52YWx1ZSA9PT0gRGF0ZVBhcnRzLnllYXIgPyBbZGlnaXQsIHZpZXdEaWdpdHNbaW5kZXhdXSA6IGFjYywgW10pO1xuXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1tYWdpYy1udW1iZXJzXG4gICAgICAgIGlmICh2aWV3RGlnaXRXaXRoWWVhci5sZW5ndGggPCAzKSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbWFnaWMtbnVtYmVyc1xuICAgICAgICAgICAgZGF0ZS55ZWFyICs9IGRhdGUueWVhciA8IDMwID8gMjAwMCA6IDE5MDA7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld0RpZ2l0V2l0aFllYXIubGVuZ3RoIDwgZGlnaXRXaXRoWWVhci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdUaW1lT2JqID0gdGhpcy5jcmVhdGVEYXRlVGltZShkYXRlKTtcblxuICAgICAgICBpZiAoIW5ld1RpbWVPYmopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY3ZhT25DaGFuZ2UobnVsbCk7XG5cbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBkYXlzIGVudGVyZWQgZG9lcyBub3QgbWF0Y2ggdGhlIGVudGVyZWQgbW9udGggKi9cbiAgICAgICAgaWYgKCF0aGlzLmdldFZhbGlkRGF0ZU9yTnVsbChuZXdUaW1lT2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID0gISFuZXdUaW1lT2JqO1xuXG4gICAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKHRoaXMuZ2V0VGltZVN0cmluZ0Zyb21EYXRlKG5ld1RpbWVPYmosIHRoaXMuZGF0ZUlucHV0Rm9ybWF0KSwgdHJ1ZSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShuZXdUaW1lT2JqKTtcbiAgICB9XG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdChuZXcgS2JxRGF0ZXBpY2tlcklucHV0RXZlbnQodGhpcywgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEhhbmRsZXMgYmx1ciBldmVudHMgb24gdGhlIGlucHV0LiAqL1xuICAgIG9uQmx1cigpIHtcbiAgICAgICAgLy8gUmVmb3JtYXQgdGhlIGlucHV0IG9ubHkgaWYgd2UgaGF2ZSBhIHZhbGlkIHZhbHVlLlxuICAgICAgICB0aGlzLnBhcnNlT25CbHVyKCk7XG5cbiAgICAgICAgdGhpcy5mb2N1c0NoYW5nZWQoZmFsc2UpO1xuXG4gICAgICAgIHRoaXMub25JbnB1dCgpO1xuICAgIH1cblxuICAgIG9uUGFzdGUoJGV2ZW50KSB7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGxldCByYXdWYWx1ZSA9ICRldmVudC5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcblxuICAgICAgICBpZiAocmF3VmFsdWUubWF0Y2goL15cXGRcXEQvKSkge1xuICAgICAgICAgICAgcmF3VmFsdWUgPSBgMCR7cmF3VmFsdWV9YDtcbiAgICAgICAgfVxuICAgICAgICByYXdWYWx1ZS5yZXBsYWNlKC9bXkEtWmEtejAtOV0rL2csIHRoaXMuc2VwYXJhdG9yKTtcblxuICAgICAgICBpZiAoL1thLXpdL2dpLnRlc3QocmF3VmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLmluY29ycmVjdElucHV0LmVtaXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbCA9IHJhd1ZhbHVlLm1hdGNoKC9eKD88Zmlyc3Q+XFxkKylcXFcoPzxzZWNvbmQ+XFxkKylcXFcoPzx0aGlyZD5cXGQrKSQvKTtcblxuICAgICAgICBpZiAoIW1hdGNoPy5ncm91cHM/LmZpcnN0IHx8ICFtYXRjaD8uZ3JvdXBzPy5zZWNvbmQgfHwgIW1hdGNoPy5ncm91cHM/LnRoaXJkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZpZXdWYWx1ZShyYXdWYWx1ZSk7XG5cbiAgICAgICAgICAgIHJldHVybiByYXdWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gW21hdGNoLmdyb3Vwcy5maXJzdCwgbWF0Y2guZ3JvdXBzLnNlY29uZCwgbWF0Y2guZ3JvdXBzLnRoaXJkXS5qb2luKHRoaXMuc2VwYXJhdG9yKTtcblxuICAgICAgICBjb25zdCBuZXdUaW1lT2JqID0gdGhpcy5nZXREYXRlRnJvbVN0cmluZyh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKCFuZXdUaW1lT2JqKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZpZXdWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKHRoaXMuZ2V0VGltZVN0cmluZ0Zyb21EYXRlKG5ld1RpbWVPYmosIHRoaXMuZGF0ZUlucHV0Rm9ybWF0KSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShuZXdUaW1lT2JqKTtcbiAgICB9XG5cbiAgICB0b0lTTzg2MDEodmFsdWU6IEQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnRvSXNvODYwMSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYXZlVGltZVBhcnQoc2VsZWN0ZWQ6IEQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7IHJldHVybiBzZWxlY3RlZDsgfVxuXG4gICAgICAgIGNvbnN0IHllYXJzID0gdGhpcy5hZGFwdGVyLmdldFllYXIoc2VsZWN0ZWQpO1xuICAgICAgICBjb25zdCBtb250aCA9IHRoaXMuYWRhcHRlci5nZXRNb250aChzZWxlY3RlZCk7XG4gICAgICAgIGNvbnN0IGRheSA9IHRoaXMuYWRhcHRlci5nZXREYXRlKHNlbGVjdGVkKTtcblxuICAgICAgICBjb25zdCBob3VycyA9IHRoaXMuYWRhcHRlci5nZXRIb3Vycyh0aGlzLnZhbHVlKTtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IHRoaXMuYWRhcHRlci5nZXRNaW51dGVzKHRoaXMudmFsdWUpO1xuICAgICAgICBjb25zdCBzZWNvbmRzID0gdGhpcy5hZGFwdGVyLmdldFNlY29uZHModGhpcy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kcyA9IHRoaXMuYWRhcHRlci5nZXRNaWxsaXNlY29uZHModGhpcy52YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5jcmVhdGVEYXRlVGltZSh5ZWFycywgbW9udGgsIGRheSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVMb2NhbGVQYXJhbXMgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0Rm9ybWF0KHRoaXMuZGF0ZUlucHV0Rm9ybWF0KTtcblxuICAgICAgICBpZiAoIXRoaXMudXNlUGxhY2Vob2xkZXJGcm9tSW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdGhpcy5sb2NhbGVTZXJ2aWNlLmdldFBhcmFtcygnZGF0ZXBpY2tlcicpLnBsYWNlaG9sZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlcGFyYXRvciA9IGZvcm1hdC5tYXRjaCgvW2FBLXpaXSsoPzxzZXBhcmF0b3I+XFxXfFxcRClbYUEtelpdKy8pLmdyb3Vwcy5zZXBhcmF0b3I7XG5cbiAgICAgICAgdGhpcy5zZXBhcmF0b3JQb3NpdGlvbnMgPSBmb3JtYXRcbiAgICAgICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYzogYW55LCBpdGVtLCBpbmRleDogbnVtYmVyKSA9PiB0aGlzLnNlcGFyYXRvciA9PT0gaXRlbSA/IFsuLi5hY2MsIGluZGV4ICsgMV0gOiBhY2MsIFtdKTtcblxuICAgICAgICB0aGlzLmdldERpZ2l0UG9zaXRpb25zKGZvcm1hdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWx1ZShuZXdWYWx1ZTogRCkge1xuICAgICAgICBpZiAoIXRoaXMuYWRhcHRlci5zYW1lRGF0ZShuZXdWYWx1ZSwgdGhpcy52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB0aGlzLmN2YU9uQ2hhbmdlKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChuZXdWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmRhdGVJbnB1dC5lbWl0KG5ldyBLYnFEYXRlcGlja2VySW5wdXRFdmVudCh0aGlzLCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzS2V5Rm9yQ2xvc2UoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChldmVudC5hbHRLZXkgJiYgZXZlbnQua2V5Q29kZSA9PT0gVVBfQVJST1cpIHx8IGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzS2V5Rm9yT3BlbihldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZXZlbnQuYWx0S2V5ICYmIGV2ZW50LmtleUNvZGUgPT09IERPV05fQVJST1c7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0xldHRlcktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNMZXR0ZXJLZXkoZXZlbnQpICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNLZXlGb3JCeVBhc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChoYXNNb2RpZmllcktleShldmVudCkgJiYgKGlzVmVydGljYWxNb3ZlbWVudChldmVudCkgfHwgaXNIb3Jpem9udGFsTW92ZW1lbnQoZXZlbnQpKSkgfHxcbiAgICAgICAgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8XG4gICAgICAgIFtERUxFVEUsIEJBQ0tTUEFDRSwgVEFCXS5pbmNsdWRlcyhldmVudC5rZXlDb2RlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNwYWNlS2V5SGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0ID09PSB0aGlzLnNlbGVjdGlvbkVuZCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE5ld1ZhbHVlKGV2ZW50LmtleSwgdGhpcy5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpO1xuICAgICAgICAgICAgdGhpcy5zZXRWaWV3VmFsdWUodmFsdWUpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMub25JbnB1dCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25TdGFydCAhPT0gdGhpcy5zZWxlY3Rpb25FbmQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0TmV4dERpZ2l0KHRoaXMuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmV3VmFsdWUoa2V5OiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLnZpZXdWYWx1ZS5zbGljZSgwLCBwb3NpdGlvbiksIGtleSwgdGhpcy52aWV3VmFsdWUuc2xpY2UocG9zaXRpb24pXS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFZpZXdWYWx1ZSh2YWx1ZTogc3RyaW5nLCBzYXZlUG9zaXRpb246IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBpZiAoc2F2ZVBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25TdGFydCA9IHRoaXMuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25FbmQgPSB0aGlzLnNlbGVjdGlvbkVuZDtcblxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQ7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvbkVuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVwbGFjZVN5bWJvbHModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgLnNwbGl0KHRoaXMuc2VwYXJhdG9yKVxuICAgICAgICAgICAgLm1hcCgocGFydDogc3RyaW5nKSA9PiBwYXJ0LnJlcGxhY2UoL14oWzAtOV0rKVxcVyQvLCAnMCQxJykpXG4gICAgICAgICAgICAuam9pbih0aGlzLnNlcGFyYXRvcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREYXRlRnJvbVN0cmluZyh0aW1lU3RyaW5nOiBzdHJpbmcpOiBEIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGltZVN0cmluZyB8fCB0aW1lU3RyaW5nLmxlbmd0aCA8IHRoaXMuZmlyc3REaWdpdCEubGVuZ3RoKSB7IHJldHVybiBudWxsOyB9XG5cbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCk7XG5cbiAgICAgICAgY29uc3Qgdmlld0RpZ2l0czogc3RyaW5nW10gPSB0aW1lU3RyaW5nXG4gICAgICAgICAgICAuc3BsaXQodGhpcy5zZXBhcmF0b3IpXG4gICAgICAgICAgICAubWFwKCh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZSk7XG5cbiAgICAgICAgY29uc3QgW2ZpcnNWaWV3RGlnaXQsIHNlY29uZFZpZXdEaWdpdCwgdGhpcmRWaWV3RGlnaXRdID0gdmlld0RpZ2l0cztcblxuXG4gICAgICAgIGlmICh2aWV3RGlnaXRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKC9cXEQvLnRlc3QoZmlyc1ZpZXdEaWdpdCkgfHwgZmlyc1ZpZXdEaWdpdC5sZW5ndGggPCB0aGlzLmZpcnN0RGlnaXQhLmxlbmd0aCkgeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgICAgICAgICBkYXRlW3RoaXMuZmlyc3REaWdpdCEuZnVsbE5hbWVdID0gdGhpcy5maXJzdERpZ2l0IS5wYXJzZShmaXJzVmlld0RpZ2l0KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3REaWdpdCEuaXNEYXkpIHtcbiAgICAgICAgICAgICAgICBkYXRlLm1vbnRoID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3RGlnaXRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgaWYgKGZpcnNWaWV3RGlnaXQubGVuZ3RoIDwgdGhpcy5maXJzdERpZ2l0IS5sZW5ndGggfHwgc2Vjb25kVmlld0RpZ2l0Lmxlbmd0aCA8IHRoaXMuc2Vjb25kRGlnaXQhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlW3RoaXMuZmlyc3REaWdpdCEuZnVsbE5hbWVdID0gdGhpcy5maXJzdERpZ2l0IS5wYXJzZShmaXJzVmlld0RpZ2l0KTtcbiAgICAgICAgICAgIGRhdGVbdGhpcy5zZWNvbmREaWdpdCEuZnVsbE5hbWVdID0gdGhpcy5zZWNvbmREaWdpdCEucGFyc2Uoc2Vjb25kVmlld0RpZ2l0KTtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3RGlnaXRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGZpcnNWaWV3RGlnaXQubGVuZ3RoIDwgdGhpcy5maXJzdERpZ2l0IS5sZW5ndGggfHxcbiAgICAgICAgICAgICAgICBzZWNvbmRWaWV3RGlnaXQubGVuZ3RoIDwgdGhpcy5zZWNvbmREaWdpdCEubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgdGhpcmRWaWV3RGlnaXQubGVuZ3RoIDwgdGhpcy50aGlyZERpZ2l0IS5sZW5ndGhcbiAgICAgICAgICAgICkgeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgICAgICAgICBjb25zdCBkaWdpdFZpZXdWYWx1ZTogeyBkYXRlPzogbnVtYmVyOyBtb250aD86IG51bWJlcjsgeWVhcj86IG51bWJlciB9ID0ge307XG4gICAgICAgICAgICBjb25zdCBkYXRlRGlnaXRzID0gW3RoaXMuZmlyc3REaWdpdCwgdGhpcy5zZWNvbmREaWdpdCwgdGhpcy50aGlyZERpZ2l0XTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBkYXRlRGlnaXRdIG9mIGRhdGVEaWdpdHMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgZGlnaXRWaWV3VmFsdWVbZGF0ZURpZ2l0IS5mdWxsTmFtZV0gPSBwYXJzZUludCh2aWV3RGlnaXRzW2luZGV4XSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICYmIGRpZ2l0Vmlld1ZhbHVlLm1vbnRoICYmIGRpZ2l0Vmlld1ZhbHVlLm1vbnRoIDw9IHRoaXMuZmlyc3REaWdpdCEubWF4TW9udGgpIHtcbiAgICAgICAgICAgICAgICBkYXRlRGlnaXRzLmZvckVhY2goKGRpZ2l0KSA9PiBkaWdpdCEubWF4RGF5cyA9IHRoaXMuZ2V0TGFzdERheUZvcihcbiAgICAgICAgICAgICAgICAgICAgZGlnaXRWaWV3VmFsdWUueWVhciBhcyBudW1iZXIsIGRpZ2l0Vmlld1ZhbHVlLm1vbnRoIGFzIG51bWJlciAtIDEpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0ZVt0aGlzLmZpcnN0RGlnaXQhLmZ1bGxOYW1lXSA9IHRoaXMuZmlyc3REaWdpdCEucGFyc2UoZmlyc1ZpZXdEaWdpdCk7XG4gICAgICAgICAgICBkYXRlW3RoaXMuc2Vjb25kRGlnaXQhLmZ1bGxOYW1lXSA9IHRoaXMuc2Vjb25kRGlnaXQhLnBhcnNlKHNlY29uZFZpZXdEaWdpdCk7XG4gICAgICAgICAgICBkYXRlW3RoaXMudGhpcmREaWdpdCEuZnVsbE5hbWVdID0gdGhpcy50aGlyZERpZ2l0IS5wYXJzZSh0aGlyZFZpZXdEaWdpdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLmNyZWF0ZURhdGVUaW1lKGRhdGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlZmF1bHRWYWx1ZSgpOiBEYXRlVGltZU9iamVjdCB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMudmFsdWUgfHwgdGhpcy5hZGFwdGVyLnRvZGF5KCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXI6IHRoaXMuYWRhcHRlci5nZXRZZWFyKGRlZmF1bHRWYWx1ZSksXG4gICAgICAgICAgICBtb250aDogdGhpcy5hZGFwdGVyLmdldE1vbnRoKGRlZmF1bHRWYWx1ZSksXG4gICAgICAgICAgICBkYXRlOiB0aGlzLmFkYXB0ZXIuZ2V0RGF0ZShkZWZhdWx0VmFsdWUpLFxuICAgICAgICAgICAgaG91cnM6IHRoaXMuYWRhcHRlci5nZXRIb3VycyhkZWZhdWx0VmFsdWUpLFxuICAgICAgICAgICAgbWludXRlczogdGhpcy5hZGFwdGVyLmdldE1pbnV0ZXMoZGVmYXVsdFZhbHVlKSxcbiAgICAgICAgICAgIHNlY29uZHM6IHRoaXMuYWRhcHRlci5nZXRTZWNvbmRzKGRlZmF1bHRWYWx1ZSksXG4gICAgICAgICAgICBtaWxsaXNlY29uZHM6IHRoaXMuYWRhcHRlci5nZXRNaWxsaXNlY29uZHMoZGVmYXVsdFZhbHVlKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VGltZVN0cmluZ0Zyb21EYXRlKHZhbHVlOiBEIHwgbnVsbCwgdGltZUZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCAhdGhpcy5hZGFwdGVyLmlzVmFsaWQodmFsdWUpKSB7IHJldHVybiAnJzsgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aW1lRm9ybWF0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERhdGVFZGl0TWV0cmljcyhjdXJzb3JQb3NpdGlvbjogbnVtYmVyKTogW1xuICAgICAgICBtb2RpZmllZFRpbWVQYXJ0OiBEYXRlUGFydHMsXG4gICAgICAgIGN1cnNvclN0YXJ0UG9zaXRpb246IG51bWJlcixcbiAgICAgICAgY3Vyc29yRW5kUG9zaXRpb246IG51bWJlclxuICAgIF0ge1xuICAgICAgICBmb3IgKGNvbnN0IGRpZ2l0IG9mIFt0aGlzLmZpcnN0RGlnaXQsIHRoaXMuc2Vjb25kRGlnaXQsIHRoaXMudGhpcmREaWdpdF0pIHtcbiAgICAgICAgICAgIGlmIChjdXJzb3JQb3NpdGlvbiA+PSBkaWdpdCEuc3RhcnQgJiYgY3Vyc29yUG9zaXRpb24gPD0gZGlnaXQhLmVuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbZGlnaXQhLnZhbHVlLCBkaWdpdCEuc3RhcnQsIGRpZ2l0IS5lbmRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFt0aGlzLnRoaXJkRGlnaXQhLnZhbHVlLCB0aGlzLnRoaXJkRGlnaXQhLnN0YXJ0LCB0aGlzLnRoaXJkRGlnaXQhLmVuZF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNyZW1lbnREYXRlKGRhdGVWYWw6IEQsIHdoYXRUb0luY3JlbWVudDogRGF0ZVBhcnRzKTogRCB7XG4gICAgICAgIGxldCB5ZWFyID0gdGhpcy5hZGFwdGVyLmdldFllYXIoZGF0ZVZhbCk7XG4gICAgICAgIGxldCBtb250aCA9IHRoaXMuYWRhcHRlci5nZXRNb250aChkYXRlVmFsKTtcbiAgICAgICAgbGV0IGRheSA9IHRoaXMuYWRhcHRlci5nZXREYXRlKGRhdGVWYWwpO1xuXG4gICAgICAgIHN3aXRjaCAod2hhdFRvSW5jcmVtZW50KSB7XG4gICAgICAgICAgICBjYXNlIERhdGVQYXJ0cy5kYXk6XG4gICAgICAgICAgICAgICAgZGF5Kys7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF5ID4gdGhpcy5hZGFwdGVyLmdldE51bURheXNJbk1vbnRoKGRhdGVWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRheSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERhdGVQYXJ0cy5tb250aDpcbiAgICAgICAgICAgICAgICBtb250aCsrO1xuXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgICAgICAgICBpZiAobW9udGggPiAxMSkge1xuICAgICAgICAgICAgICAgICAgICBtb250aCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdERheSA9IHRoaXMuZ2V0TGFzdERheUZvcih5ZWFyLCBtb250aCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF5ID4gbGFzdERheSkge1xuICAgICAgICAgICAgICAgICAgICBkYXkgPSBsYXN0RGF5O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEYXRlUGFydHMueWVhcjpcbiAgICAgICAgICAgICAgICB5ZWFyKys7XG5cbiAgICAgICAgICAgICAgICBpZiAoeWVhciA+IE1BWF9ZRUFSKSB7XG4gICAgICAgICAgICAgICAgICAgIHllYXIgPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIGRheSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRMYXN0RGF5Rm9yKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgodGhpcy5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCAxKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWNyZW1lbnREYXRlKGRhdGVWYWw6IEQsIHdoYXRUb0RlY3JlbWVudDogRGF0ZVBhcnRzKTogRCB7XG4gICAgICAgIGxldCB5ZWFyID0gdGhpcy5hZGFwdGVyLmdldFllYXIoZGF0ZVZhbCk7XG4gICAgICAgIGxldCBtb250aCA9IHRoaXMuYWRhcHRlci5nZXRNb250aChkYXRlVmFsKTtcbiAgICAgICAgbGV0IGRheSA9IHRoaXMuYWRhcHRlci5nZXREYXRlKGRhdGVWYWwpO1xuXG4gICAgICAgIHN3aXRjaCAod2hhdFRvRGVjcmVtZW50KSB7XG4gICAgICAgICAgICBjYXNlIERhdGVQYXJ0cy5kYXk6XG4gICAgICAgICAgICAgICAgZGF5LS07XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF5IDwgMSkge1xuICAgICAgICAgICAgICAgICAgICBkYXkgPSB0aGlzLmFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgoZGF0ZVZhbCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERhdGVQYXJ0cy5tb250aDpcbiAgICAgICAgICAgICAgICBtb250aC0tO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1vbnRoIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbWFnaWMtbnVtYmVyc1xuICAgICAgICAgICAgICAgICAgICBtb250aCA9IDExO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3REYXkgPSB0aGlzLmdldExhc3REYXlGb3IoeWVhciwgbW9udGgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRheSA+IGxhc3REYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF5ID0gbGFzdERheTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGF0ZVBhcnRzLnllYXI6XG4gICAgICAgICAgICAgICAgeWVhci0tO1xuXG4gICAgICAgICAgICAgICAgaWYgKHllYXIgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHllYXIgPSBNQVhfWUVBUjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBkYXkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmVydGljYWxBcnJvd0tleUhhbmRsZXIoa2V5Q29kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52YWx1ZSkgeyByZXR1cm47IH1cblxuICAgICAgICBsZXQgY2hhbmdlZFRpbWU7XG5cbiAgICAgICAgY29uc3QgW21vZGlmaWVkVGltZVBhcnQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmRdID0gdGhpcy5nZXREYXRlRWRpdE1ldHJpY3ModGhpcy5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpO1xuXG4gICAgICAgIGlmIChrZXlDb2RlID09PSBVUF9BUlJPVykge1xuICAgICAgICAgICAgY2hhbmdlZFRpbWUgPSB0aGlzLmluY3JlbWVudERhdGUodGhpcy52YWx1ZSwgbW9kaWZpZWRUaW1lUGFydCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5Q29kZSA9PT0gRE9XTl9BUlJPVykge1xuICAgICAgICAgICAgY2hhbmdlZFRpbWUgPSB0aGlzLmRlY3JlbWVudERhdGUodGhpcy52YWx1ZSwgbW9kaWZpZWRUaW1lUGFydCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhbHVlID0gY2hhbmdlZFRpbWU7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvbkVuZDtcblxuICAgICAgICB0aGlzLmN2YU9uQ2hhbmdlKGNoYW5nZWRUaW1lKTtcblxuICAgICAgICB0aGlzLm9uQ2hhbmdlKCk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYW5nZUNhcmV0UG9zaXRpb24oa2V5Q29kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52YWx1ZSkgeyByZXR1cm47IH1cblxuICAgICAgICBsZXQgY3Vyc29yUG9zID0gdGhpcy5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXI7XG5cbiAgICAgICAgaWYgKFtIT01FLCBQQUdFX1VQXS5pbmNsdWRlcyhrZXlDb2RlKSkge1xuICAgICAgICAgICAgY3Vyc29yUG9zID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChbRU5ELCBQQUdFX0RPV05dLmluY2x1ZGVzKGtleUNvZGUpKSB7XG4gICAgICAgICAgICBjdXJzb3JQb3MgPSB0aGlzLnZpZXdWYWx1ZS5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gTEVGVF9BUlJPVykge1xuICAgICAgICAgICAgY3Vyc29yUG9zID0gY3Vyc29yUG9zID09PSAwID8gdGhpcy52aWV3VmFsdWUubGVuZ3RoIDogY3Vyc29yUG9zIC0gMTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBSSUdIVF9BUlJPVykge1xuICAgICAgICAgICAgY29uc3QgbmV4dFNlcGFyYXRvclBvczogbnVtYmVyID0gdGhpcy52aWV3VmFsdWUuaW5kZXhPZih0aGlzLnNlcGFyYXRvciwgY3Vyc29yUG9zKTtcblxuICAgICAgICAgICAgY3Vyc29yUG9zID0gbmV4dFNlcGFyYXRvclBvcyA/IG5leHRTZXBhcmF0b3JQb3MgKyAxIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0RGlnaXRCeUN1cnNvcihjdXJzb3JQb3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0RGlnaXRCeUN1cnNvcihjdXJzb3JQb3M6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFssIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmRdID0gdGhpcy5nZXREYXRlRWRpdE1ldHJpY3MoY3Vyc29yUG9zKTtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0TmV4dERpZ2l0QnlDdXJzb3IoY3Vyc29yUG9zOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbLCAsIGVuZFBvc2l0aW9uT2ZDdXJyZW50RGlnaXRdID0gdGhpcy5nZXREYXRlRWRpdE1ldHJpY3MoY3Vyc29yUG9zKTtcbiAgICAgICAgICAgIGNvbnN0IFssIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmRdID0gdGhpcy5nZXREYXRlRWRpdE1ldHJpY3MoZW5kUG9zaXRpb25PZkN1cnJlbnREaWdpdCArIDEpO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQ7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvbkVuZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3ROZXh0RGlnaXQoY3Vyc29yUG9zOiBudW1iZXIsIGN5Y2xlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYXN0VmFsdWUgPSBjeWNsZSA/IDAgOiBjdXJzb3JQb3M7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2VwYXJhdG9yUG9zOiBudW1iZXIgPSB0aGlzLnZpZXdWYWx1ZS5pbmRleE9mKHRoaXMuc2VwYXJhdG9yLCBjdXJzb3JQb3MpO1xuXG4gICAgICAgICAgICBjb25zdCBuZXdDdXJzb3JQb3MgPSBuZXh0U2VwYXJhdG9yUG9zID4gMCA/IG5leHRTZXBhcmF0b3JQb3MgKyAxIDogbGFzdFZhbHVlO1xuXG4gICAgICAgICAgICBjb25zdCBbLCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kXSA9IHRoaXMuZ2V0RGF0ZUVkaXRNZXRyaWNzKG5ld0N1cnNvclBvcyk7XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydDtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGlucHV0IGlzIGludmFsaWQgYmFzZWQgb24gdGhlIG5hdGl2ZSB2YWxpZGF0aW9uLiAqL1xuICAgIHByaXZhdGUgaXNCYWRJbnB1dCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdmFsaWRpdHkgPSAoPEhUTUxJbnB1dEVsZW1lbnQ+IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS52YWxpZGl0eTtcblxuICAgICAgICByZXR1cm4gdmFsaWRpdHkgJiYgdmFsaWRpdHkuYmFkSW5wdXQ7XG4gICAgfVxuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWVtcHR5XG4gICAgcHJpdmF0ZSBjdmFPbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1lbXB0eVxuICAgIHByaXZhdGUgdmFsaWRhdG9yT25DaGFuZ2UgPSAoKSA9PiB7fTtcblxuICAgIC8qKiBUaGUgZm9ybSBjb250cm9sIHZhbGlkYXRvciBmb3Igd2hldGhlciB0aGUgaW5wdXQgcGFyc2VzLiAqL1xuICAgIHByaXZhdGUgcGFyc2VWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9jdXNlZCB8fFxuICAgICAgICAgICAgdGhpcy5lbXB0eSB8fFxuICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA/IG51bGwgOiB7IGticURhdGVwaWNrZXJQYXJzZTogeyB0ZXh0OiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSB9IH07XG4gICAgfVxuXG4gICAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB0aGUgbWluIGRhdGUuICovXG4gICAgcHJpdmF0ZSBtaW5WYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5hZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWUpO1xuXG4gICAgICAgIHJldHVybiAhdGhpcy5taW4gfHwgIWNvbnRyb2xWYWx1ZSB8fCB0aGlzLmFkYXB0ZXIuY29tcGFyZURhdGVUaW1lKHRoaXMubWluLCBjb250cm9sVmFsdWUpIDw9IDAgP1xuICAgICAgICAgICAgbnVsbCA6XG4gICAgICAgICAgICB7IGticURhdGVwaWNrZXJNaW46IHsgbWluOiB0aGlzLm1pbiwgYWN0dWFsOiBjb250cm9sVmFsdWUgfSB9O1xuICAgIH1cblxuICAgIC8qKiBUaGUgZm9ybSBjb250cm9sIHZhbGlkYXRvciBmb3IgdGhlIG1heCBkYXRlLiAqL1xuICAgIHByaXZhdGUgbWF4VmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuYWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlKTtcblxuICAgICAgICByZXR1cm4gIXRoaXMubWF4IHx8ICFjb250cm9sVmFsdWUgfHwgdGhpcy5hZGFwdGVyLmNvbXBhcmVEYXRlVGltZSh0aGlzLm1heCwgY29udHJvbFZhbHVlKSA+PSAwID9cbiAgICAgICAgICAgIG51bGwgOlxuICAgICAgICAgICAgeyBrYnFEYXRlcGlja2VyTWF4OiB7IG1heDogdGhpcy5tYXgsIGFjdHVhbDogY29udHJvbFZhbHVlIH0gfTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGZvcm0gY29udHJvbCB2YWxpZGF0b3IgZm9yIHRoZSBkYXRlIGZpbHRlci4gKi9cbiAgICBwcml2YXRlIGZpbHRlclZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmFkYXB0ZXIuZGVzZXJpYWxpemUoY29udHJvbC52YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuICF0aGlzLmRhdGVGaWx0ZXIgfHwgIWNvbnRyb2xWYWx1ZSB8fCB0aGlzLmRhdGVGaWx0ZXIoY29udHJvbFZhbHVlKSA/XG4gICAgICAgICAgICBudWxsIDogeyBrYnFEYXRlcGlja2VyRmlsdGVyOiB0cnVlIH07XG4gICAgfVxuXG4gICAgLyoqIEZvcm1hdHMgYSB2YWx1ZSBhbmQgc2V0cyBpdCBvbiB0aGUgaW5wdXQgZWxlbWVudC4gKi9cbiAgICBwcml2YXRlIGZvcm1hdFZhbHVlKHZhbHVlOiBEIHwgbnVsbCkge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZWRWYWx1ZSA9IHZhbHVlID8gdGhpcy5hZGFwdGVyLmZvcm1hdCh2YWx1ZSwgdGhpcy5kYXRlSW5wdXRGb3JtYXQpIDogJyc7XG5cbiAgICAgICAgdGhpcy5zZXRWaWV3VmFsdWUoZm9ybWF0dGVkVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Q29udHJvbChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbCkgeyByZXR1cm47IH1cblxuICAgICAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sO1xuXG4gICAgICAgIHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB0aGlzLl92YWx1ZSA9IHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMgVGhlIGdpdmVuIG9iamVjdCBpZiBpdCBpcyBib3RoIGEgZGF0ZSBpbnN0YW5jZSBhbmQgdmFsaWQsIG90aGVyd2lzZSBudWxsLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0VmFsaWREYXRlT3JOdWxsKG9iajogYW55KTogRCB8IG51bGwge1xuICAgICAgICByZXR1cm4gKHRoaXMuYWRhcHRlci5pc0RhdGVJbnN0YW5jZShvYmopICYmIHRoaXMuYWRhcHRlci5pc1ZhbGlkKG9iaikpID8gb2JqIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERpZ2l0UG9zaXRpb25zKGZvcm1hdDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZmlyc3REaWdpdCA9IHRoaXMuc2Vjb25kRGlnaXQgPSB0aGlzLnRoaXJkRGlnaXQgPSBudWxsO1xuXG4gICAgICAgIGNvbnN0IGZvcm1hdEluTG93ZXJDYXNlID0gZm9ybWF0LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgZm9ybWF0SW5Mb3dlckNhc2VcbiAgICAgICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKHsgcHJldiwgbGVuZ3RoLCBzdGFydCB9OiBhbnksIHZhbHVlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIGFycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHRoaXMuc2VwYXJhdG9yIHx8IChhcnIubGVuZ3RoIC0gMSkgPT09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZmlyc3REaWdpdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3REaWdpdCA9IG5ldyBEYXRlRGlnaXQocHJldiwgc3RhcnQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnNlY29uZERpZ2l0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWNvbmREaWdpdCA9IG5ldyBEYXRlRGlnaXQocHJldiwgc3RhcnQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnRoaXJkRGlnaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoaXJkRGlnaXQgPSBuZXcgRGF0ZURpZ2l0KHByZXYsIHN0YXJ0LCBhcnIubGVuZ3RoIC0gc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1wYXJhbWV0ZXItcmVhc3NpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpbmRleCArIDE7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHByZXY6IHZhbHVlLCBsZW5ndGgsIHN0YXJ0IH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IGxlbmd0aDogMCwgc3RhcnQ6IDAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXRoaXMuZmlyc3REaWdpdCB8fCAhdGhpcy5zZWNvbmREaWdpdCB8fCAhdGhpcy50aGlyZERpZ2l0KSB7XG4gICAgICAgICAgICBFcnJvcihgQ2FuJyB0IHVzZSB0aGlzIGZvcm1hdDogJHtmb3JtYXR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZURhdGUoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlcik6IEQge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmNyZWF0ZURhdGVUaW1lKFxuICAgICAgICAgICAgeWVhcixcbiAgICAgICAgICAgIG1vbnRoLFxuICAgICAgICAgICAgZGF5LFxuICAgICAgICAgICAgdGhpcy5hZGFwdGVyLmdldEhvdXJzKHRoaXMudmFsdWUgYXMgRCksXG4gICAgICAgICAgICB0aGlzLmFkYXB0ZXIuZ2V0TWludXRlcyh0aGlzLnZhbHVlIGFzIEQpLFxuICAgICAgICAgICAgdGhpcy5hZGFwdGVyLmdldFNlY29uZHModGhpcy52YWx1ZSBhcyBEKSxcbiAgICAgICAgICAgIHRoaXMuYWRhcHRlci5nZXRNaWxsaXNlY29uZHModGhpcy52YWx1ZSBhcyBEKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGF0ZVRpbWUodmFsdWU6IERhdGVUaW1lT2JqZWN0KTogRCB8IG51bGwge1xuICAgICAgICBpZiAoT2JqZWN0LnZhbHVlcyh2YWx1ZSkuc29tZShpc05hTikpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmNyZWF0ZURhdGVUaW1lKFxuICAgICAgICAgICAgdmFsdWUueWVhcixcbiAgICAgICAgICAgIHZhbHVlLm1vbnRoIC0gMSxcbiAgICAgICAgICAgIHZhbHVlLmRhdGUsXG4gICAgICAgICAgICB2YWx1ZS5ob3VycyxcbiAgICAgICAgICAgIHZhbHVlLm1pbnV0ZXMsXG4gICAgICAgICAgICB2YWx1ZS5zZWNvbmRzLFxuICAgICAgICAgICAgdmFsdWUubWlsbGlzZWNvbmRzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb3JyZWN0Q3Vyc29yUG9zaXRpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0ICYmIHRoaXMuc2VwYXJhdG9yUG9zaXRpb25zLmluY2x1ZGVzKHRoaXMuc2VsZWN0aW9uU3RhcnQpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ID0gdGhpcy5zZWxlY3Rpb25TdGFydCAtIDE7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
971
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21wb25lbnRzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUNBQXVDO0FBQ3ZDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0gsYUFBYSxFQUNiLGlCQUFpQixFQUlqQixVQUFVLEVBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0gsU0FBUyxFQUNULE1BQU0sRUFDTixVQUFVLEVBQ1YsR0FBRyxFQUNILE1BQU0sRUFDTixjQUFjLEVBQ2QsSUFBSSxFQUNKLG9CQUFvQixFQUNwQixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLFdBQVcsRUFDWCxLQUFLLEVBQ0wsR0FBRyxFQUNILFFBQVEsRUFDWCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDSCxXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUVsQixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUM3QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSwwQkFB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RXBCLFdBQVcsRUFBRSxtQkFBbUI7cUJBQ25DO2lCQUNKOzswQkE4UFEsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQUNuQyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGtCQUFrQjt5Q0EzT3RDLFdBQVc7c0JBRGQsS0FBSztnQkFhRixRQUFRO3NCQURYLEtBQUs7Z0JBYUYsYUFBYTtzQkFEaEIsS0FBSztnQkFzQkYsbUJBQW1CO3NCQUR0QixLQUFLO2dCQVFGLEtBQUs7c0JBRFIsS0FBSztnQkF5QkYsR0FBRztzQkFETixLQUFLO2dCQWNGLEdBQUc7c0JBRE4sS0FBSztnQkFjRixRQUFRO3NCQURYLEtBQUs7Z0JBMEJGLEVBQUU7c0JBREwsS0FBSztnQkFZRixvQkFBb0I7c0JBRHZCLEtBQUs7Z0JBc0JJLGNBQWM7c0JBQXZCLE1BQU07Z0JBR1ksVUFBVTtzQkFBNUIsTUFBTTtnQkFHWSxTQUFTO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGU6bm8tZW1wdHksIGRlcHJlY2F0aW9uXG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBSZW5kZXJlcjJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEFic3RyYWN0Q29udHJvbCxcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBOR19WQUxJREFUT1JTLFxuICAgIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIFZhbGlkYXRpb25FcnJvcnMsXG4gICAgVmFsaWRhdG9yLFxuICAgIFZhbGlkYXRvckZuLFxuICAgIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBCQUNLU1BBQ0UsXG4gICAgREVMRVRFLFxuICAgIERPV05fQVJST1csXG4gICAgRU5ELFxuICAgIEVTQ0FQRSxcbiAgICBoYXNNb2RpZmllcktleSxcbiAgICBIT01FLFxuICAgIGlzSG9yaXpvbnRhbE1vdmVtZW50LFxuICAgIGlzTGV0dGVyS2V5LFxuICAgIGlzVmVydGljYWxNb3ZlbWVudCxcbiAgICBMRUZUX0FSUk9XLFxuICAgIFBBR0VfRE9XTixcbiAgICBQQUdFX1VQLFxuICAgIFJJR0hUX0FSUk9XLFxuICAgIFNQQUNFLFxuICAgIFRBQixcbiAgICBVUF9BUlJPV1xufSBmcm9tICdAa29vYmlxL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQge1xuICAgIERhdGVBZGFwdGVyLFxuICAgIEtCUV9EQVRFX0ZPUk1BVFMsXG4gICAgS0JRX0xPQ0FMRV9TRVJWSUNFLFxuICAgIEticURhdGVGb3JtYXRzLFxuICAgIEticUxvY2FsZVNlcnZpY2UsXG4gICAgdmFsaWRhdGlvblRvb2x0aXBIaWRlRGVsYXksXG4gICAgdmFsaWRhdGlvblRvb2x0aXBTaG93RGVsYXlcbn0gZnJvbSAnQGtvb2JpcS9jb21wb25lbnRzL2NvcmUnO1xuaW1wb3J0IHsgS2JxRm9ybUZpZWxkQ29udHJvbCB9IGZyb20gJ0Brb29iaXEvY29tcG9uZW50cy9mb3JtLWZpZWxkJztcbmltcG9ydCB7IEticVdhcm5pbmdUb29sdGlwVHJpZ2dlciB9IGZyb20gJ0Brb29iaXEvY29tcG9uZW50cy90b29sdGlwJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY3JlYXRlTWlzc2luZ0RhdGVJbXBsRXJyb3IgfSBmcm9tICcuL2RhdGVwaWNrZXItZXJyb3JzJztcbmltcG9ydCB7IEticURhdGVwaWNrZXIgfSBmcm9tICcuL2RhdGVwaWNrZXIuY29tcG9uZW50JztcblxuLy8gdHNsaW50OmRpc2FibGU6bmFtaW5nLWNvbnZlbnRpb25cbmVudW0gRGF0ZVBhcnRzIHtcbiAgICB5ZWFyID0gJ3knLFxuICAgIG1vbnRoID0gJ20nLFxuICAgIGRheSA9ICdkJ1xufVxuXG5leHBvcnQgY29uc3QgTUFYX1lFQVIgPSA5OTk5O1xuY29uc3QgWUVBUl9MRU5HVEggPSA0O1xuXG5jbGFzcyBEYXRlRGlnaXQge1xuICAgIG1heERheXMgPSAzMTtcbiAgICBtYXhNb250aCA9IDEyO1xuXG4gICAgcGFyc2U6ICh2YWx1ZTogc3RyaW5nKSA9PiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHZhbHVlOiBEYXRlUGFydHMsXG4gICAgICAgIHB1YmxpYyBzdGFydDogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgbGVuZ3RoOiBudW1iZXJcbiAgICApIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBEYXRlUGFydHMuZGF5KSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5wYXJzZURheTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gRGF0ZVBhcnRzLm1vbnRoKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5wYXJzZU1vbnRoO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBEYXRlUGFydHMueWVhcikge1xuICAgICAgICAgICAgdGhpcy5wYXJzZSA9IHRoaXMucGFyc2VZZWFyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGVuZCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydCArIHRoaXMubGVuZ3RoO1xuICAgIH1cblxuICAgIGdldCBpc0RheSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IERhdGVQYXJ0cy5kYXk7XG4gICAgfVxuXG4gICAgZ2V0IGlzTW9udGgoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlID09PSBEYXRlUGFydHMubW9udGg7XG4gICAgfVxuXG4gICAgZ2V0IGlzWWVhcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IERhdGVQYXJ0cy55ZWFyO1xuICAgIH1cblxuICAgIGdldCBmdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5pc0RheSkge1xuICAgICAgICAgICAgcmV0dXJuICdkYXRlJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzTW9udGgpIHtcbiAgICAgICAgICAgIHJldHVybiAnbW9udGgnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNZZWFyKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3llYXInO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VEYXkodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlOiBudW1iZXIgPSBwYXJzZUludCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHBhcnNlZFZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJzZWRWYWx1ZSA+IHRoaXMubWF4RGF5cykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF4RGF5cztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlTW9udGgodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlOiBudW1iZXIgPSBwYXJzZUludCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHBhcnNlZFZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJzZWRWYWx1ZSA+IHRoaXMubWF4TW9udGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1heE1vbnRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcnNlZFZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VZZWFyKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBwYXJzZWRWYWx1ZTogbnVtYmVyID0gcGFyc2VJbnQodmFsdWUpO1xuXG4gICAgICAgIGlmIChwYXJzZWRWYWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyc2VkVmFsdWUgPiBNQVhfWUVBUikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLnN1YnN0cmluZygwLCBZRUFSX0xFTkdUSCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcnNlZFZhbHVlO1xuICAgIH1cbn1cblxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmV4cG9ydCBjb25zdCBLQlFfREFURVBJQ0tFUl9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEticURhdGVwaWNrZXJJbnB1dCksXG4gICAgbXVsdGk6IHRydWVcbn07XG5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgY29uc3QgS0JRX0RBVEVQSUNLRVJfVkFMSURBVE9SUzogYW55ID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gS2JxRGF0ZXBpY2tlcklucHV0KSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBBbiBldmVudCB1c2VkIGZvciBkYXRlcGlja2VyIGlucHV0IGFuZCBjaGFuZ2UgZXZlbnRzLiBXZSBkb24ndCBhbHdheXMgaGF2ZSBhY2Nlc3MgdG8gYSBuYXRpdmVcbiAqIGlucHV0IG9yIGNoYW5nZSBldmVudCBiZWNhdXNlIHRoZSBldmVudCBtYXkgaGF2ZSBiZWVuIHRyaWdnZXJlZCBieSB0aGUgdXNlciBjbGlja2luZyBvbiB0aGVcbiAqIGNhbGVuZGFyIHBvcHVwLiBGb3IgY29uc2lzdGVuY3ksIHdlIGFsd2F5cyB1c2UgS2JxRGF0ZXBpY2tlcklucHV0RXZlbnQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEticURhdGVwaWNrZXJJbnB1dEV2ZW50PEQ+IHtcbiAgICAvKiogVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHRhcmdldCBkYXRlcGlja2VyIGlucHV0LiAqL1xuICAgIHZhbHVlOiBEIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAvKiogUmVmZXJlbmNlIHRvIHRoZSBkYXRlcGlja2VyIGlucHV0IGNvbXBvbmVudCB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LiAqL1xuICAgICAgICBwdWJsaWMgdGFyZ2V0OiBLYnFEYXRlcGlja2VySW5wdXQ8RD4sXG4gICAgICAgIC8qKiBSZWZlcmVuY2UgdG8gdGhlIG5hdGl2ZSBpbnB1dCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0ZXBpY2tlciBpbnB1dC4gKi9cbiAgICAgICAgcHVibGljIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50XG4gICAgKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnRhcmdldC52YWx1ZTtcbiAgICB9XG59XG5cbmxldCB1bmlxdWVDb21wb25lbnRJZFN1ZmZpeCA9IDA7XG5cbmludGVyZmFjZSBEYXRlVGltZU9iamVjdCB7XG4gICAgeWVhcjogbnVtYmVyO1xuICAgIG1vbnRoOiBudW1iZXI7XG4gICAgZGF0ZTogbnVtYmVyO1xuICAgIGhvdXJzOiBudW1iZXI7XG4gICAgbWludXRlczogbnVtYmVyO1xuICAgIHNlY29uZHM6IG51bWJlcjtcbiAgICBtaWxsaXNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqIERpcmVjdGl2ZSB1c2VkIHRvIGNvbm5lY3QgYW4gaW5wdXQgdG8gYSBLYnFEYXRlcGlja2VyLiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdpbnB1dFtrYnFEYXRlcGlja2VyXScsXG4gICAgZXhwb3J0QXM6ICdrYnFEYXRlcGlja2VySW5wdXQnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBLQlFfREFURVBJQ0tFUl9WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgS0JRX0RBVEVQSUNLRVJfVkFMSURBVE9SUyxcbiAgICAgICAgeyBwcm92aWRlOiBLYnFGb3JtRmllbGRDb250cm9sLCB1c2VFeGlzdGluZzogS2JxRGF0ZXBpY2tlcklucHV0IH1dLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdrYnEtaW5wdXQga2JxLWRhdGVwaWNrZXInLFxuICAgICAgICAnW2F0dHIucGxhY2Vob2xkZXJdJzogJ3BsYWNlaG9sZGVyJyxcbiAgICAgICAgJ1thdHRyLnJlcXVpcmVkXSc6ICdyZXF1aXJlZCcsXG4gICAgICAgICdbYXR0ci5kaXNhYmxlZF0nOiAnZGlzYWJsZWQgfHwgbnVsbCcsXG4gICAgICAgICdbYXR0ci5taW5dJzogJ21pbiA/IHRvSVNPODYwMShtaW4pIDogbnVsbCcsXG4gICAgICAgICdbYXR0ci5tYXhdJzogJ21heCA/IHRvSVNPODYwMShtYXgpIDogbnVsbCcsXG4gICAgICAgICdbYXR0ci5hdXRvY29tcGxldGVdJzogJ1wib2ZmXCInLFxuXG4gICAgICAgICcocGFzdGUpJzogJ29uUGFzdGUoJGV2ZW50KScsXG4gICAgICAgICcoY2hhbmdlKSc6ICdvbkNoYW5nZSgpJyxcblxuICAgICAgICAnKGZvY3VzKSc6ICdmb2N1c0NoYW5nZWQodHJ1ZSknLFxuICAgICAgICAnKGJsdXIpJzogJ29uQmx1cigpJyxcblxuICAgICAgICAnKGtleWRvd24pJzogJ29uS2V5RG93bigkZXZlbnQpJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgS2JxRGF0ZXBpY2tlcklucHV0PEQ+IGltcGxlbWVudHMgS2JxRm9ybUZpZWxkQ29udHJvbDxEPiwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25EZXN0cm95IHtcbiAgICByZWFkb25seSBzdGF0ZUNoYW5nZXM6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgcmVhZG9ubHkgZXJyb3JTdGF0ZTogYm9vbGVhbjtcblxuICAgIGNvbnRyb2xUeXBlOiBzdHJpbmcgPSAnZGF0ZXBpY2tlcic7XG5cbiAgICBmb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBkYXRlcGlja2VyOiBLYnFEYXRlcGlja2VyPEQ+O1xuXG4gICAgZGF0ZUZpbHRlcjogKGRhdGU6IEQgfCBudWxsKSA9PiBib29sZWFuO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMgKGVpdGhlciBkdWUgdG8gdXNlciBpbnB1dCBvciBwcm9ncmFtbWF0aWMgY2hhbmdlKS4gKi9cbiAgICB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RCB8IG51bGw+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgZGlzYWJsZWQgc3RhdGUgaGFzIGNoYW5nZWQgKi9cbiAgICBkaXNhYmxlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVzZVBsYWNlaG9sZGVyRnJvbUlucHV0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgICBASW5wdXQoKVxuICAgIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICAgIH1cblxuICAgIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgICAvKiogVGhlIGRhdGVwaWNrZXIgdGhhdCB0aGlzIGlucHV0IGlzIGFzc29jaWF0ZWQgd2l0aC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBrYnFEYXRlcGlja2VyKHZhbHVlOiBLYnFEYXRlcGlja2VyPEQ+KSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlciA9IHZhbHVlO1xuICAgICAgICB0aGlzLmRhdGVwaWNrZXIucmVnaXN0ZXJJbnB1dCh0aGlzKTtcbiAgICAgICAgdGhpcy5kYXRlcGlja2VyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgdGhpcy5kYXRlcGlja2VyU3Vic2NyaXB0aW9uID0gdGhpcy5kYXRlcGlja2VyLnNlbGVjdGVkQ2hhbmdlZC5zdWJzY3JpYmUoKHNlbGVjdGVkOiBEKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuc2F2ZVRpbWVQYXJ0KHNlbGVjdGVkKTtcblxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgdGhpcy5jdmFPbkNoYW5nZShuZXdWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQobmV3IEticURhdGVwaWNrZXJJbnB1dEV2ZW50KHRoaXMsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBvdXQgZGF0ZXMgd2l0aGluIHRoZSBkYXRlcGlja2VyLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGticURhdGVwaWNrZXJGaWx0ZXIodmFsdWU6IChkYXRlOiBEIHwgbnVsbCkgPT4gYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRhdGVGaWx0ZXIgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy52YWxpZGF0b3JPbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgdmFsdWUgb2YgdGhlIGlucHV0LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHZhbHVlKCk6IEQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIHNldCB2YWx1ZSh2YWx1ZTogRCB8IG51bGwpIHtcbiAgICAgICAgbGV0IG5ld1ZhbHVlID0gdGhpcy5hZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKTtcblxuICAgICAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID0gIW5ld1ZhbHVlIHx8IHRoaXMuYWRhcHRlci5pc1ZhbGlkKG5ld1ZhbHVlKTtcblxuICAgICAgICBuZXdWYWx1ZSA9IHRoaXMuZ2V0VmFsaWREYXRlT3JOdWxsKG5ld1ZhbHVlKTtcblxuICAgICAgICBjb25zdCBvbGREYXRlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy5mb3JtYXRWYWx1ZShuZXdWYWx1ZSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIuc2FtZURhdGUob2xkRGF0ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdmFsdWU6IEQgfCBudWxsO1xuXG4gICAgLyoqIFRoZSBtaW5pbXVtIHZhbGlkIGRhdGUuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgbWluKCk6IEQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgICB9XG5cbiAgICBzZXQgbWluKHZhbHVlOiBEIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9taW4gPSB0aGlzLmFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpO1xuICAgICAgICB0aGlzLnZhbGlkYXRvck9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbWluOiBEIHwgbnVsbDtcblxuICAgIC8qKiBUaGUgbWF4aW11bSB2YWxpZCBkYXRlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IG1heCgpOiBEIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXg7XG4gICAgfVxuXG4gICAgc2V0IG1heCh2YWx1ZTogRCB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbWF4ID0gdGhpcy5hZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKTtcbiAgICAgICAgdGhpcy52YWxpZGF0b3JPbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX21heDogRCB8IG51bGw7XG5cbiAgICAvKiogV2hldGhlciB0aGUgZGF0ZXBpY2tlci1pbnB1dCBpcyBkaXNhYmxlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cblxuICAgIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5fZGlzYWJsZWQgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZENoYW5nZS5lbWl0KG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbnVsbCBjaGVjayB0aGUgYGJsdXJgIG1ldGhvZCwgYmVjYXVzZSBpdCdzIHVuZGVmaW5lZCBkdXJpbmcgU1NSLlxuICAgICAgICBpZiAobmV3VmFsdWUgJiYgZWxlbWVudC5ibHVyKSB7XG4gICAgICAgICAgICAvLyBOb3JtYWxseSwgbmF0aXZlIGlucHV0IGVsZW1lbnRzIGF1dG9tYXRpY2FsbHkgYmx1ciBpZiB0aGV5IHR1cm4gZGlzYWJsZWQuIFRoaXMgYmVoYXZpb3JcbiAgICAgICAgICAgIC8vIGlzIHByb2JsZW1hdGljLCBiZWNhdXNlIGl0IHdvdWxkIG1lYW4gdGhhdCBpdCB0cmlnZ2VycyBhbm90aGVyIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUsXG4gICAgICAgICAgICAvLyB3aGljaCB0aGVuIGNhdXNlcyBhIGNoYW5nZWQgYWZ0ZXIgY2hlY2tlZCBlcnJvciBpZiB0aGUgaW5wdXQgZWxlbWVudCB3YXMgZm9jdXNlZCBiZWZvcmUuXG4gICAgICAgICAgICBlbGVtZW50LmJsdXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIGdldCBpZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgfVxuXG4gICAgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5faWQgPSB2YWx1ZSB8fCB0aGlzLnVpZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pZDogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBzZXQga2JxVmFsaWRhdGlvblRvb2x0aXAodG9vbHRpcDogS2JxV2FybmluZ1Rvb2x0aXBUcmlnZ2VyKSB7XG4gICAgICAgIGlmICghdG9vbHRpcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9vbHRpcC5lbnRlckRlbGF5ID0gdmFsaWRhdGlvblRvb2x0aXBTaG93RGVsYXk7XG4gICAgICAgIHRvb2x0aXAudHJpZ2dlciA9ICdtYW51YWwnO1xuXG4gICAgICAgIHRvb2x0aXAuaW5pdExpc3RlbmVycygpO1xuXG4gICAgICAgIHRoaXMuaW5jb3JyZWN0SW5wdXQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0b29sdGlwLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG9vbHRpcC5zaG93KCk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdG9vbHRpcC5oaWRlKCksIHZhbGlkYXRpb25Ub29sdGlwSGlkZURlbGF5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQE91dHB1dCgpIGluY29ycmVjdElucHV0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gYSBgY2hhbmdlYCBldmVudCBpcyBmaXJlZCBvbiB0aGlzIGA8aW5wdXQ+YC4gKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgZGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8S2JxRGF0ZXBpY2tlcklucHV0RXZlbnQ8RD4+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiBhbiBgaW5wdXRgIGV2ZW50IGlzIGZpcmVkIG9uIHRoaXMgYDxpbnB1dD5gLiAqL1xuICAgIEBPdXRwdXQoKSByZWFkb25seSBkYXRlSW5wdXQgPSBuZXcgRXZlbnRFbWl0dGVyPEticURhdGVwaWNrZXJJbnB1dEV2ZW50PEQ+PigpO1xuXG4gICAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMudmlld1ZhbHVlICYmICF0aGlzLmlzQmFkSW5wdXQoKTtcbiAgICB9XG5cbiAgICBnZXQgdmlld1ZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgbmdDb250cm9sKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2w7XG4gICAgfVxuXG4gICAgZ2V0IGlzUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZWFkT25seTtcbiAgICB9XG5cbiAgICBnZXQgZGF0ZUlucHV0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVGb3JtYXRzPy5kYXRlSW5wdXQgfHwgdGhpcy5hZGFwdGVyLmNvbmZpZy5kYXRlSW5wdXQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgcmVhZHlGb3JQYXJzZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuZmlyc3REaWdpdCAmJiB0aGlzLnNlY29uZERpZ2l0ICYmIHRoaXMudGhpcmREaWdpdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgc2VsZWN0aW9uU3RhcnQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldCBzZWxlY3Rpb25TdGFydCh2YWx1ZTogbnVtYmVyIHwgbnVsbCkge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IHNlbGVjdGlvbkVuZCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldCBzZWxlY3Rpb25FbmQodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w7XG4gICAgcHJpdmF0ZSByZWFkb25seSB1aWQgPSBga2JxLWRhdGVwaWNrZXItJHt1bmlxdWVDb21wb25lbnRJZFN1ZmZpeCsrfWA7XG5cbiAgICBwcml2YXRlIGRhdGVwaWNrZXJTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgICBwcml2YXRlIGxvY2FsZVN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBsYXN0IHZhbHVlIHNldCBvbiB0aGUgaW5wdXQgd2FzIHZhbGlkLiAqL1xuICAgIHByaXZhdGUgbGFzdFZhbHVlVmFsaWQgPSBmYWxzZTtcblxuICAgIC8qKiBUaGUgY29tYmluZWQgZm9ybSBjb250cm9sIHZhbGlkYXRvciBmb3IgdGhpcyBpbnB1dC4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcjogVmFsaWRhdG9yRm4gfCBudWxsO1xuXG4gICAgcHJpdmF0ZSBzZXBhcmF0b3I6IHN0cmluZztcblxuICAgIHByaXZhdGUgZmlyc3REaWdpdDogRGF0ZURpZ2l0IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBzZWNvbmREaWdpdDogRGF0ZURpZ2l0IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSB0aGlyZERpZ2l0OiBEYXRlRGlnaXQgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgc2VwYXJhdG9yUG9zaXRpb25zOiBudW1iZXJbXTtcblxuICAgIHByaXZhdGUgdXNlUGxhY2Vob2xkZXJGcm9tSW5wdXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBAT3B0aW9uYWwoKSByZWFkb25seSBhZGFwdGVyOiBEYXRlQWRhcHRlcjxEPixcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChLQlFfREFURV9GT1JNQVRTKSBwcml2YXRlIHJlYWRvbmx5IGRhdGVGb3JtYXRzOiBLYnFEYXRlRm9ybWF0cyxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChLQlFfTE9DQUxFX1NFUlZJQ0UpIHByaXZhdGUgbG9jYWxlU2VydmljZTogS2JxTG9jYWxlU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLnZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICB0aGlzLnBhcnNlVmFsaWRhdG9yLFxuICAgICAgICAgICAgdGhpcy5taW5WYWxpZGF0b3IsXG4gICAgICAgICAgICB0aGlzLm1heFZhbGlkYXRvcixcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyVmFsaWRhdG9yXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVNaXNzaW5nRGF0ZUltcGxFcnJvcignRGF0ZUFkYXB0ZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Rm9ybWF0KHRoaXMuZGF0ZUlucHV0Rm9ybWF0KTtcblxuICAgICAgICB0aGlzLmxvY2FsZVN1YnNjcmlwdGlvbiA9IGFkYXB0ZXIubG9jYWxlQ2hhbmdlcy5zdWJzY3JpYmUodGhpcy51cGRhdGVMb2NhbGVQYXJhbXMpO1xuICAgIH1cblxuICAgIG9uQ29udGFpbmVyQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBmb2N1c0NoYW5nZWQoaXNGb2N1c2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmIChpc0ZvY3VzZWQgIT09IHRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gaXNGb2N1c2VkO1xuICAgICAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1lbXB0eVxuICAgIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmxvY2FsZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZWRDaGFuZ2UuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWxpZGF0b3JPbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgICAgICB0aGlzLnNldENvbnRyb2woY29udHJvbCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yID8gdGhpcy52YWxpZGF0b3IoY29udHJvbCkgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogRCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN2YU9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgLy8gSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1JlYWRPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcblxuICAgICAgICBpZiAodGhpcy5pc0xldHRlcktleShldmVudCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0SW5wdXQuZW1pdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNLZXlGb3JPcGVuKGV2ZW50KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdGhpcy5kYXRlcGlja2VyPy5vcGVuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0tleUZvckNsb3NlKGV2ZW50KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdGhpcy5kYXRlcGlja2VyLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gVEFCKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVwaWNrZXIuY2xvc2UoZmFsc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNLZXlGb3JCeVBhc3MoZXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gU1BBQ0UpIHtcbiAgICAgICAgICAgIHRoaXMuc3BhY2VLZXlIYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChbVVBfQVJST1csIERPV05fQVJST1ddLmluY2x1ZGVzKGtleUNvZGUpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsQXJyb3dLZXlIYW5kbGVyKGtleUNvZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKFtMRUZUX0FSUk9XLCBSSUdIVF9BUlJPVywgSE9NRSwgUEFHRV9VUCwgRU5ELCBQQUdFX0RPV05dLmluY2x1ZGVzKGtleUNvZGUpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICB0aGlzLmNoYW5nZUNhcmV0UG9zaXRpb24oa2V5Q29kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoL15cXEQkLy50ZXN0KGV2ZW50LmtleSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5nZXROZXdWYWx1ZShldmVudC5rZXksIHRoaXMuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5yZXBsYWNlU3ltYm9scyhuZXdWYWx1ZSk7XG5cbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gZm9ybWF0dGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZpZXdWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMub25JbnB1dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0SW5wdXQuZW1pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCh0aGlzLm9uSW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25JbnB1dCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5jb3JyZWN0Q3Vyc29yUG9zaXRpb24oKTtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLnJlcGxhY2VTeW1ib2xzKHRoaXMudmlld1ZhbHVlKTtcblxuICAgICAgICBjb25zdCBuZXdUaW1lT2JqID0gdGhpcy5nZXREYXRlRnJvbVN0cmluZyhmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSAhIW5ld1RpbWVPYmo7XG5cbiAgICAgICAgaWYgKCFuZXdUaW1lT2JqKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmlld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWUobmV3VGltZU9iaiBhcyBEKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRWaWV3VmFsdWUodGhpcy5nZXRUaW1lU3RyaW5nRnJvbURhdGUobmV3VGltZU9iaiwgdGhpcy5kYXRlSW5wdXRGb3JtYXQpLCB0cnVlKTtcblxuICAgICAgICB0aGlzLnNlbGVjdE5leHREaWdpdEJ5Q3Vyc29yKHRoaXMuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKG5ld1RpbWVPYmopO1xuICAgIH07XG5cbiAgICBwYXJzZU9uQmx1ciA9ICgpOiBhbnkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudmlld1ZhbHVlIHx8ICF0aGlzLnJlYWR5Rm9yUGFyc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0ZTogRGF0ZVRpbWVPYmplY3QgPSB0aGlzLmdldERlZmF1bHRWYWx1ZSgpO1xuXG4gICAgICAgIGNvbnN0IHZpZXdEaWdpdHM6IHN0cmluZ1tdID0gdGhpcy52aWV3VmFsdWVcbiAgICAgICAgICAgIC5zcGxpdCh0aGlzLnNlcGFyYXRvcilcbiAgICAgICAgICAgIC5tYXAoKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlKVxuICAgICAgICAgICAgLmZpbHRlcigodmFsdWUpID0+IHZhbHVlKTtcblxuICAgICAgICBjb25zdCBbZmlyc1ZpZXdEaWdpdCwgc2Vjb25kVmlld0RpZ2l0LCB0aGlyZFZpZXdEaWdpdF0gPSB2aWV3RGlnaXRzO1xuXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1tYWdpYy1udW1iZXJzXG4gICAgICAgIGlmICh2aWV3RGlnaXRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dCgoKSA9PiB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGVbdGhpcy5maXJzdERpZ2l0IS5mdWxsTmFtZV0gPSB0aGlzLmZpcnN0RGlnaXQhLnBhcnNlKGZpcnNWaWV3RGlnaXQpO1xuICAgICAgICBkYXRlW3RoaXMuc2Vjb25kRGlnaXQhLmZ1bGxOYW1lXSA9IHRoaXMuc2Vjb25kRGlnaXQhLnBhcnNlKHNlY29uZFZpZXdEaWdpdCk7XG4gICAgICAgIGRhdGVbdGhpcy50aGlyZERpZ2l0IS5mdWxsTmFtZV0gPSB0aGlzLnRoaXJkRGlnaXQhLnBhcnNlKHRoaXJkVmlld0RpZ2l0KTtcblxuICAgICAgICBjb25zdCBbZGlnaXRXaXRoWWVhciwgdmlld0RpZ2l0V2l0aFllYXJdID0gW3RoaXMuZmlyc3REaWdpdCwgdGhpcy5zZWNvbmREaWdpdCwgdGhpcy50aGlyZERpZ2l0XS5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjOiBhbnksIGRpZ2l0LCBpbmRleCkgPT4gKGRpZ2l0IS52YWx1ZSA9PT0gRGF0ZVBhcnRzLnllYXIgPyBbZGlnaXQsIHZpZXdEaWdpdHNbaW5kZXhdXSA6IGFjYyksXG4gICAgICAgICAgICBbXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1tYWdpYy1udW1iZXJzXG4gICAgICAgIGlmICh2aWV3RGlnaXRXaXRoWWVhci5sZW5ndGggPCAzKSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbWFnaWMtbnVtYmVyc1xuICAgICAgICAgICAgZGF0ZS55ZWFyICs9IGRhdGUueWVhciA8IDMwID8gMjAwMCA6IDE5MDA7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld0RpZ2l0V2l0aFllYXIubGVuZ3RoIDwgZGlnaXRXaXRoWWVhci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdUaW1lT2JqID0gdGhpcy5jcmVhdGVEYXRlVGltZShkYXRlKTtcblxuICAgICAgICBpZiAoIW5ld1RpbWVPYmopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY3ZhT25DaGFuZ2UobnVsbCk7XG5cbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBkYXlzIGVudGVyZWQgZG9lcyBub3QgbWF0Y2ggdGhlIGVudGVyZWQgbW9udGggKi9cbiAgICAgICAgaWYgKCF0aGlzLmdldFZhbGlkRGF0ZU9yTnVsbChuZXdUaW1lT2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID0gISFuZXdUaW1lT2JqO1xuXG4gICAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKHRoaXMuZ2V0VGltZVN0cmluZ0Zyb21EYXRlKG5ld1RpbWVPYmosIHRoaXMuZGF0ZUlucHV0Rm9ybWF0KSwgdHJ1ZSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShuZXdUaW1lT2JqKTtcbiAgICB9O1xuXG4gICAgb25DaGFuZ2UoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQobmV3IEticURhdGVwaWNrZXJJbnB1dEV2ZW50KHRoaXMsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBIYW5kbGVzIGJsdXIgZXZlbnRzIG9uIHRoZSBpbnB1dC4gKi9cbiAgICBvbkJsdXIoKSB7XG4gICAgICAgIC8vIFJlZm9ybWF0IHRoZSBpbnB1dCBvbmx5IGlmIHdlIGhhdmUgYSB2YWxpZCB2YWx1ZS5cbiAgICAgICAgdGhpcy5wYXJzZU9uQmx1cigpO1xuXG4gICAgICAgIHRoaXMuZm9jdXNDaGFuZ2VkKGZhbHNlKTtcblxuICAgICAgICB0aGlzLm9uSW5wdXQoKTtcbiAgICB9XG5cbiAgICBvblBhc3RlKCRldmVudCkge1xuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBsZXQgcmF3VmFsdWUgPSAkZXZlbnQuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XG5cbiAgICAgICAgaWYgKHJhd1ZhbHVlLm1hdGNoKC9eXFxkXFxELykpIHtcbiAgICAgICAgICAgIHJhd1ZhbHVlID0gYDAke3Jhd1ZhbHVlfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmF3VmFsdWUucmVwbGFjZSgvW15BLVphLXowLTldKy9nLCB0aGlzLnNlcGFyYXRvcik7XG5cbiAgICAgICAgaWYgKC9bYS16XS9naS50ZXN0KHJhd1ZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3RJbnB1dC5lbWl0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSB8IG51bGwgPSByYXdWYWx1ZS5tYXRjaCgvXig/PGZpcnN0PlxcZCspXFxXKD88c2Vjb25kPlxcZCspXFxXKD88dGhpcmQ+XFxkKykkLyk7XG5cbiAgICAgICAgaWYgKCFtYXRjaD8uZ3JvdXBzPy5maXJzdCB8fCAhbWF0Y2g/Lmdyb3Vwcz8uc2Vjb25kIHx8ICFtYXRjaD8uZ3JvdXBzPy50aGlyZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRWaWV3VmFsdWUocmF3VmFsdWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gcmF3VmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IFttYXRjaC5ncm91cHMuZmlyc3QsIG1hdGNoLmdyb3Vwcy5zZWNvbmQsIG1hdGNoLmdyb3Vwcy50aGlyZF0uam9pbih0aGlzLnNlcGFyYXRvcik7XG5cbiAgICAgICAgY29uc3QgbmV3VGltZU9iaiA9IHRoaXMuZ2V0RGF0ZUZyb21TdHJpbmcodmFsdWUpO1xuXG4gICAgICAgIGlmICghbmV3VGltZU9iaikge1xuICAgICAgICAgICAgdGhpcy5zZXRWaWV3VmFsdWUodmFsdWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFZpZXdWYWx1ZSh0aGlzLmdldFRpbWVTdHJpbmdGcm9tRGF0ZShuZXdUaW1lT2JqLCB0aGlzLmRhdGVJbnB1dEZvcm1hdCkpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUobmV3VGltZU9iaik7XG4gICAgfVxuXG4gICAgdG9JU084NjAxKHZhbHVlOiBEKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci50b0lzbzg2MDEodmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZVRpbWVQYXJ0KHNlbGVjdGVkOiBEKSB7XG4gICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeWVhcnMgPSB0aGlzLmFkYXB0ZXIuZ2V0WWVhcihzZWxlY3RlZCk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5hZGFwdGVyLmdldE1vbnRoKHNlbGVjdGVkKTtcbiAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5hZGFwdGVyLmdldERhdGUoc2VsZWN0ZWQpO1xuXG4gICAgICAgIGNvbnN0IGhvdXJzID0gdGhpcy5hZGFwdGVyLmdldEhvdXJzKHRoaXMudmFsdWUpO1xuICAgICAgICBjb25zdCBtaW51dGVzID0gdGhpcy5hZGFwdGVyLmdldE1pbnV0ZXModGhpcy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNlY29uZHMgPSB0aGlzLmFkYXB0ZXIuZ2V0U2Vjb25kcyh0aGlzLnZhbHVlKTtcbiAgICAgICAgY29uc3QgbWlsbGlzZWNvbmRzID0gdGhpcy5hZGFwdGVyLmdldE1pbGxpc2Vjb25kcyh0aGlzLnZhbHVlKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmNyZWF0ZURhdGVUaW1lKHllYXJzLCBtb250aCwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUxvY2FsZVBhcmFtcyA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRGb3JtYXQodGhpcy5kYXRlSW5wdXRGb3JtYXQpO1xuXG4gICAgICAgIGlmICghdGhpcy51c2VQbGFjZWhvbGRlckZyb21JbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB0aGlzLmxvY2FsZVNlcnZpY2UuZ2V0UGFyYW1zKCdkYXRlcGlja2VyJykucGxhY2Vob2xkZXI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzZXRGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlcGFyYXRvciA9IGZvcm1hdC5tYXRjaCgvW2FBLXpaXSsoPzxzZXBhcmF0b3I+XFxXfFxcRClbYUEtelpdKy8pLmdyb3Vwcy5zZXBhcmF0b3I7XG5cbiAgICAgICAgdGhpcy5zZXBhcmF0b3JQb3NpdGlvbnMgPSBmb3JtYXRcbiAgICAgICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYzogYW55LCBpdGVtLCBpbmRleDogbnVtYmVyKSA9PiAodGhpcy5zZXBhcmF0b3IgPT09IGl0ZW0gPyBbLi4uYWNjLCBpbmRleCArIDFdIDogYWNjKSwgW10pO1xuXG4gICAgICAgIHRoaXMuZ2V0RGlnaXRQb3NpdGlvbnMoZm9ybWF0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVZhbHVlKG5ld1ZhbHVlOiBEKSB7XG4gICAgICAgIGlmICghdGhpcy5hZGFwdGVyLnNhbWVEYXRlKG5ld1ZhbHVlLCB0aGlzLnZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuY3ZhT25DaGFuZ2UobmV3VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuZGF0ZUlucHV0LmVtaXQobmV3IEticURhdGVwaWNrZXJJbnB1dEV2ZW50KHRoaXMsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNLZXlGb3JDbG9zZShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKGV2ZW50LmFsdEtleSAmJiBldmVudC5rZXlDb2RlID09PSBVUF9BUlJPVykgfHwgZXZlbnQua2V5Q29kZSA9PT0gRVNDQVBFO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNLZXlGb3JPcGVuKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBldmVudC5hbHRLZXkgJiYgZXZlbnQua2V5Q29kZSA9PT0gRE9XTl9BUlJPVztcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTGV0dGVyS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc0xldHRlcktleShldmVudCkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50Lm1ldGFLZXk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0tleUZvckJ5UGFzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGhhc01vZGlmaWVyS2V5KGV2ZW50KSAmJiAoaXNWZXJ0aWNhbE1vdmVtZW50KGV2ZW50KSB8fCBpc0hvcml6b250YWxNb3ZlbWVudChldmVudCkpKSB8fFxuICAgICAgICAgICAgZXZlbnQuY3RybEtleSB8fFxuICAgICAgICAgICAgZXZlbnQubWV0YUtleSB8fFxuICAgICAgICAgICAgW0RFTEVURSwgQkFDS1NQQUNFLCBUQUJdLmluY2x1ZGVzKGV2ZW50LmtleUNvZGUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzcGFjZUtleUhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TdGFydCA9PT0gdGhpcy5zZWxlY3Rpb25FbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXROZXdWYWx1ZShldmVudC5rZXksIHRoaXMuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKHZhbHVlKTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCh0aGlzLm9uSW5wdXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uU3RhcnQgIT09IHRoaXMuc2VsZWN0aW9uRW5kKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE5leHREaWdpdCh0aGlzLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlciwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5ld1ZhbHVlKGtleTogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy52aWV3VmFsdWUuc2xpY2UoMCwgcG9zaXRpb24pLCBrZXksIHRoaXMudmlld1ZhbHVlLnNsaWNlKHBvc2l0aW9uKV0uam9pbignJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRWaWV3VmFsdWUodmFsdWU6IHN0cmluZywgc2F2ZVBvc2l0aW9uOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHNhdmVQb3NpdGlvbikge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhcnQgPSB0aGlzLnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uRW5kID0gdGhpcy5zZWxlY3Rpb25FbmQ7XG5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlcGxhY2VTeW1ib2xzKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgIC5zcGxpdCh0aGlzLnNlcGFyYXRvcilcbiAgICAgICAgICAgIC5tYXAoKHBhcnQ6IHN0cmluZykgPT4gcGFydC5yZXBsYWNlKC9eKFswLTldKylcXFckLywgJzAkMScpKVxuICAgICAgICAgICAgLmpvaW4odGhpcy5zZXBhcmF0b3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGF0ZUZyb21TdHJpbmcodGltZVN0cmluZzogc3RyaW5nKTogRCB8IG51bGwge1xuICAgICAgICBpZiAoIXRpbWVTdHJpbmcgfHwgdGltZVN0cmluZy5sZW5ndGggPCB0aGlzLmZpcnN0RGlnaXQhLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoKTtcblxuICAgICAgICBjb25zdCB2aWV3RGlnaXRzOiBzdHJpbmdbXSA9IHRpbWVTdHJpbmcuc3BsaXQodGhpcy5zZXBhcmF0b3IpLm1hcCgodmFsdWU6IHN0cmluZykgPT4gdmFsdWUpO1xuXG4gICAgICAgIGNvbnN0IFtmaXJzVmlld0RpZ2l0LCBzZWNvbmRWaWV3RGlnaXQsIHRoaXJkVmlld0RpZ2l0XSA9IHZpZXdEaWdpdHM7XG5cbiAgICAgICAgaWYgKHZpZXdEaWdpdHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoL1xcRC8udGVzdChmaXJzVmlld0RpZ2l0KSB8fCBmaXJzVmlld0RpZ2l0Lmxlbmd0aCA8IHRoaXMuZmlyc3REaWdpdCEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGVbdGhpcy5maXJzdERpZ2l0IS5mdWxsTmFtZV0gPSB0aGlzLmZpcnN0RGlnaXQhLnBhcnNlKGZpcnNWaWV3RGlnaXQpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5maXJzdERpZ2l0IS5pc0RheSkge1xuICAgICAgICAgICAgICAgIGRhdGUubW9udGggPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3RGlnaXRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgaWYgKGZpcnNWaWV3RGlnaXQubGVuZ3RoIDwgdGhpcy5maXJzdERpZ2l0IS5sZW5ndGggfHwgc2Vjb25kVmlld0RpZ2l0Lmxlbmd0aCA8IHRoaXMuc2Vjb25kRGlnaXQhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlW3RoaXMuZmlyc3REaWdpdCEuZnVsbE5hbWVdID0gdGhpcy5maXJzdERpZ2l0IS5wYXJzZShmaXJzVmlld0RpZ2l0KTtcbiAgICAgICAgICAgIGRhdGVbdGhpcy5zZWNvbmREaWdpdCEuZnVsbE5hbWVdID0gdGhpcy5zZWNvbmREaWdpdCEucGFyc2Uoc2Vjb25kVmlld0RpZ2l0KTtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1tYWdpYy1udW1iZXJzXG4gICAgICAgIH0gZWxzZSBpZiAodmlld0RpZ2l0cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBmaXJzVmlld0RpZ2l0Lmxlbmd0aCA8IHRoaXMuZmlyc3REaWdpdCEubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgc2Vjb25kVmlld0RpZ2l0Lmxlbmd0aCA8IHRoaXMuc2Vjb25kRGlnaXQhLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIHRoaXJkVmlld0RpZ2l0Lmxlbmd0aCA8IHRoaXMudGhpcmREaWdpdCEubGVuZ3RoXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGlnaXRWaWV3VmFsdWU6IHsgZGF0ZT86IG51bWJlcjsgbW9udGg/OiBudW1iZXI7IHllYXI/OiBudW1iZXIgfSA9IHt9O1xuICAgICAgICAgICAgY29uc3QgZGF0ZURpZ2l0cyA9IFt0aGlzLmZpcnN0RGlnaXQsIHRoaXMuc2Vjb25kRGlnaXQsIHRoaXMudGhpcmREaWdpdF07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgZGF0ZURpZ2l0XSBvZiBkYXRlRGlnaXRzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGRpZ2l0Vmlld1ZhbHVlW2RhdGVEaWdpdCEuZnVsbE5hbWVdID0gcGFyc2VJbnQodmlld0RpZ2l0c1tpbmRleF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAmJiBkaWdpdFZpZXdWYWx1ZS5tb250aCAmJiBkaWdpdFZpZXdWYWx1ZS5tb250aCA8PSB0aGlzLmZpcnN0RGlnaXQhLm1heE1vbnRoKSB7XG4gICAgICAgICAgICAgICAgZGF0ZURpZ2l0cy5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAoZGlnaXQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAoZGlnaXQhLm1heERheXMgPSB0aGlzLmdldExhc3REYXlGb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRWaWV3VmFsdWUueWVhciBhcyBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpZ2l0Vmlld1ZhbHVlLm1vbnRoIGFzIG51bWJlcikgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGVbdGhpcy5maXJzdERpZ2l0IS5mdWxsTmFtZV0gPSB0aGlzLmZpcnN0RGlnaXQhLnBhcnNlKGZpcnNWaWV3RGlnaXQpO1xuICAgICAgICAgICAgZGF0ZVt0aGlzLnNlY29uZERpZ2l0IS5mdWxsTmFtZV0gPSB0aGlzLnNlY29uZERpZ2l0IS5wYXJzZShzZWNvbmRWaWV3RGlnaXQpO1xuICAgICAgICAgICAgZGF0ZVt0aGlzLnRoaXJkRGlnaXQhLmZ1bGxOYW1lXSA9IHRoaXMudGhpcmREaWdpdCEucGFyc2UodGhpcmRWaWV3RGlnaXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWxpZERhdGVPck51bGwodGhpcy5jcmVhdGVEYXRlVGltZShkYXRlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREZWZhdWx0VmFsdWUoKTogRGF0ZVRpbWVPYmplY3Qge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLnZhbHVlIHx8IHRoaXMuYWRhcHRlci50b2RheSgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyOiB0aGlzLmFkYXB0ZXIuZ2V0WWVhcihkZWZhdWx0VmFsdWUpLFxuICAgICAgICAgICAgbW9udGg6IHRoaXMuYWRhcHRlci5nZXRNb250aChkZWZhdWx0VmFsdWUpLFxuICAgICAgICAgICAgZGF0ZTogdGhpcy5hZGFwdGVyLmdldERhdGUoZGVmYXVsdFZhbHVlKSxcbiAgICAgICAgICAgIGhvdXJzOiB0aGlzLmFkYXB0ZXIuZ2V0SG91cnMoZGVmYXVsdFZhbHVlKSxcbiAgICAgICAgICAgIG1pbnV0ZXM6IHRoaXMuYWRhcHRlci5nZXRNaW51dGVzKGRlZmF1bHRWYWx1ZSksXG4gICAgICAgICAgICBzZWNvbmRzOiB0aGlzLmFkYXB0ZXIuZ2V0U2Vjb25kcyhkZWZhdWx0VmFsdWUpLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzOiB0aGlzLmFkYXB0ZXIuZ2V0TWlsbGlzZWNvbmRzKGRlZmF1bHRWYWx1ZSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFRpbWVTdHJpbmdGcm9tRGF0ZSh2YWx1ZTogRCB8IG51bGwsIHRpbWVGb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdmFsdWUgfHwgIXRoaXMuYWRhcHRlci5pc1ZhbGlkKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5mb3JtYXQodmFsdWUsIHRpbWVGb3JtYXQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGF0ZUVkaXRNZXRyaWNzKFxuICAgICAgICBjdXJzb3JQb3NpdGlvbjogbnVtYmVyXG4gICAgKTogW21vZGlmaWVkVGltZVBhcnQ6IERhdGVQYXJ0cywgY3Vyc29yU3RhcnRQb3NpdGlvbjogbnVtYmVyLCBjdXJzb3JFbmRQb3NpdGlvbjogbnVtYmVyXSB7XG4gICAgICAgIGZvciAoY29uc3QgZGlnaXQgb2YgW3RoaXMuZmlyc3REaWdpdCwgdGhpcy5zZWNvbmREaWdpdCwgdGhpcy50aGlyZERpZ2l0XSkge1xuICAgICAgICAgICAgaWYgKGN1cnNvclBvc2l0aW9uID49IGRpZ2l0IS5zdGFydCAmJiBjdXJzb3JQb3NpdGlvbiA8PSBkaWdpdCEuZW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtkaWdpdCEudmFsdWUsIGRpZ2l0IS5zdGFydCwgZGlnaXQhLmVuZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3RoaXMudGhpcmREaWdpdCEudmFsdWUsIHRoaXMudGhpcmREaWdpdCEuc3RhcnQsIHRoaXMudGhpcmREaWdpdCEuZW5kXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluY3JlbWVudERhdGUoZGF0ZVZhbDogRCwgd2hhdFRvSW5jcmVtZW50OiBEYXRlUGFydHMpOiBEIHtcbiAgICAgICAgbGV0IHllYXIgPSB0aGlzLmFkYXB0ZXIuZ2V0WWVhcihkYXRlVmFsKTtcbiAgICAgICAgbGV0IG1vbnRoID0gdGhpcy5hZGFwdGVyLmdldE1vbnRoKGRhdGVWYWwpO1xuICAgICAgICBsZXQgZGF5ID0gdGhpcy5hZGFwdGVyLmdldERhdGUoZGF0ZVZhbCk7XG5cbiAgICAgICAgc3dpdGNoICh3aGF0VG9JbmNyZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgRGF0ZVBhcnRzLmRheTpcbiAgICAgICAgICAgICAgICBkYXkrKztcblxuICAgICAgICAgICAgICAgIGlmIChkYXkgPiB0aGlzLmFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgoZGF0ZVZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGF0ZVBhcnRzLm1vbnRoOlxuICAgICAgICAgICAgICAgIG1vbnRoKys7XG5cbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbWFnaWMtbnVtYmVyc1xuICAgICAgICAgICAgICAgIGlmIChtb250aCA+IDExKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vbnRoID0gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RGF5ID0gdGhpcy5nZXRMYXN0RGF5Rm9yKHllYXIsIG1vbnRoKTtcblxuICAgICAgICAgICAgICAgIGlmIChkYXkgPiBsYXN0RGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRheSA9IGxhc3REYXk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERhdGVQYXJ0cy55ZWFyOlxuICAgICAgICAgICAgICAgIHllYXIrKztcblxuICAgICAgICAgICAgICAgIGlmICh5ZWFyID4gTUFYX1lFQVIpIHtcbiAgICAgICAgICAgICAgICAgICAgeWVhciA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExhc3REYXlGb3IoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5nZXROdW1EYXlzSW5Nb250aCh0aGlzLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIDEpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlY3JlbWVudERhdGUoZGF0ZVZhbDogRCwgd2hhdFRvRGVjcmVtZW50OiBEYXRlUGFydHMpOiBEIHtcbiAgICAgICAgbGV0IHllYXIgPSB0aGlzLmFkYXB0ZXIuZ2V0WWVhcihkYXRlVmFsKTtcbiAgICAgICAgbGV0IG1vbnRoID0gdGhpcy5hZGFwdGVyLmdldE1vbnRoKGRhdGVWYWwpO1xuICAgICAgICBsZXQgZGF5ID0gdGhpcy5hZGFwdGVyLmdldERhdGUoZGF0ZVZhbCk7XG5cbiAgICAgICAgc3dpdGNoICh3aGF0VG9EZWNyZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgRGF0ZVBhcnRzLmRheTpcbiAgICAgICAgICAgICAgICBkYXktLTtcblxuICAgICAgICAgICAgICAgIGlmIChkYXkgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGRheSA9IHRoaXMuYWRhcHRlci5nZXROdW1EYXlzSW5Nb250aChkYXRlVmFsKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGF0ZVBhcnRzLm1vbnRoOlxuICAgICAgICAgICAgICAgIG1vbnRoLS07XG5cbiAgICAgICAgICAgICAgICBpZiAobW9udGggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1tYWdpYy1udW1iZXJzXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoID0gMTE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdERheSA9IHRoaXMuZ2V0TGFzdERheUZvcih5ZWFyLCBtb250aCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF5ID4gbGFzdERheSkge1xuICAgICAgICAgICAgICAgICAgICBkYXkgPSBsYXN0RGF5O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEYXRlUGFydHMueWVhcjpcbiAgICAgICAgICAgICAgICB5ZWFyLS07XG5cbiAgICAgICAgICAgICAgICBpZiAoeWVhciA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgeWVhciA9IE1BWF9ZRUFSO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIGRheSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2ZXJ0aWNhbEFycm93S2V5SGFuZGxlcihrZXlDb2RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2hhbmdlZFRpbWU7XG5cbiAgICAgICAgY29uc3QgW21vZGlmaWVkVGltZVBhcnQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmRdID0gdGhpcy5nZXREYXRlRWRpdE1ldHJpY3ModGhpcy5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpO1xuXG4gICAgICAgIGlmIChrZXlDb2RlID09PSBVUF9BUlJPVykge1xuICAgICAgICAgICAgY2hhbmdlZFRpbWUgPSB0aGlzLmluY3JlbWVudERhdGUodGhpcy52YWx1ZSwgbW9kaWZpZWRUaW1lUGFydCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5Q29kZSA9PT0gRE9XTl9BUlJPVykge1xuICAgICAgICAgICAgY2hhbmdlZFRpbWUgPSB0aGlzLmRlY3JlbWVudERhdGUodGhpcy52YWx1ZSwgbW9kaWZpZWRUaW1lUGFydCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhbHVlID0gY2hhbmdlZFRpbWU7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvbkVuZDtcblxuICAgICAgICB0aGlzLmN2YU9uQ2hhbmdlKGNoYW5nZWRUaW1lKTtcblxuICAgICAgICB0aGlzLm9uQ2hhbmdlKCk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYW5nZUNhcmV0UG9zaXRpb24oa2V5Q29kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1cnNvclBvcyA9IHRoaXMuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyO1xuXG4gICAgICAgIGlmIChbSE9NRSwgUEFHRV9VUF0uaW5jbHVkZXMoa2V5Q29kZSkpIHtcbiAgICAgICAgICAgIGN1cnNvclBvcyA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoW0VORCwgUEFHRV9ET1dOXS5pbmNsdWRlcyhrZXlDb2RlKSkge1xuICAgICAgICAgICAgY3Vyc29yUG9zID0gdGhpcy52aWV3VmFsdWUubGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IExFRlRfQVJST1cpIHtcbiAgICAgICAgICAgIHRoaXMuZml4RW1wdHlEaWdpdCgpO1xuXG4gICAgICAgICAgICBjdXJzb3JQb3MgPSBjdXJzb3JQb3MgPT09IDAgPyB0aGlzLnZpZXdWYWx1ZS5sZW5ndGggOiBjdXJzb3JQb3MgLSAxO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IFJJR0hUX0FSUk9XKSB7XG4gICAgICAgICAgICB0aGlzLmZpeEVtcHR5RGlnaXQoKTtcblxuICAgICAgICAgICAgY29uc3QgbmV4dFNlcGFyYXRvclBvczogbnVtYmVyID0gdGhpcy52aWV3VmFsdWUuaW5kZXhPZih0aGlzLnNlcGFyYXRvciwgY3Vyc29yUG9zKTtcblxuICAgICAgICAgICAgY3Vyc29yUG9zID0gbmV4dFNlcGFyYXRvclBvcyA/IG5leHRTZXBhcmF0b3JQb3MgKyAxIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0RGlnaXRCeUN1cnNvcihjdXJzb3JQb3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZml4RW1wdHlEaWdpdCgpIHtcbiAgICAgICAgY29uc3QgaGFzRW1wdHlEaWdpdCA9IHRoaXMudmlld1ZhbHVlXG4gICAgICAgICAgICAuc3BsaXQodGhpcy5zZXBhcmF0b3IpXG4gICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBwYXJ0Lmxlbmd0aClcbiAgICAgICAgICAgIC5zb21lKChpdGVtKSA9PiAhaXRlbSk7XG5cbiAgICAgICAgaWYgKGhhc0VtcHR5RGlnaXQgJiYgdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgeWVhciA9IHRoaXMuYWRhcHRlci5nZXRZZWFyKHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgbW9udGggPSB0aGlzLmFkYXB0ZXIuZ2V0TW9udGgodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBkYXkgPSB0aGlzLmFkYXB0ZXIuZ2V0RGF0ZSh0aGlzLnZhbHVlKTtcblxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0RGlnaXRCeUN1cnNvcihjdXJzb3JQb3M6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFssIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmRdID0gdGhpcy5nZXREYXRlRWRpdE1ldHJpY3MoY3Vyc29yUG9zKTtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0TmV4dERpZ2l0QnlDdXJzb3IoY3Vyc29yUG9zOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbLCAsIGVuZFBvc2l0aW9uT2ZDdXJyZW50RGlnaXRdID0gdGhpcy5nZXREYXRlRWRpdE1ldHJpY3MoY3Vyc29yUG9zKTtcbiAgICAgICAgICAgIGNvbnN0IFssIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmRdID0gdGhpcy5nZXREYXRlRWRpdE1ldHJpY3MoZW5kUG9zaXRpb25PZkN1cnJlbnREaWdpdCArIDEpO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQ7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvbkVuZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3ROZXh0RGlnaXQoY3Vyc29yUG9zOiBudW1iZXIsIGN5Y2xlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYXN0VmFsdWUgPSBjeWNsZSA/IDAgOiBjdXJzb3JQb3M7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2VwYXJhdG9yUG9zOiBudW1iZXIgPSB0aGlzLnZpZXdWYWx1ZS5pbmRleE9mKHRoaXMuc2VwYXJhdG9yLCBjdXJzb3JQb3MpO1xuXG4gICAgICAgICAgICBjb25zdCBuZXdDdXJzb3JQb3MgPSBuZXh0U2VwYXJhdG9yUG9zID4gMCA/IG5leHRTZXBhcmF0b3JQb3MgKyAxIDogbGFzdFZhbHVlO1xuXG4gICAgICAgICAgICBjb25zdCBbLCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kXSA9IHRoaXMuZ2V0RGF0ZUVkaXRNZXRyaWNzKG5ld0N1cnNvclBvcyk7XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydDtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGlucHV0IGlzIGludmFsaWQgYmFzZWQgb24gdGhlIG5hdGl2ZSB2YWxpZGF0aW9uLiAqL1xuICAgIHByaXZhdGUgaXNCYWRJbnB1dCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdmFsaWRpdHkgPSAoPEhUTUxJbnB1dEVsZW1lbnQ+dGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnZhbGlkaXR5O1xuXG4gICAgICAgIHJldHVybiB2YWxpZGl0eSAmJiB2YWxpZGl0eS5iYWRJbnB1dDtcbiAgICB9XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZW1wdHlcbiAgICBwcml2YXRlIGN2YU9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWVtcHR5XG4gICAgcHJpdmF0ZSB2YWxpZGF0b3JPbkNoYW5nZSA9ICgpID0+IHt9O1xuXG4gICAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB3aGV0aGVyIHRoZSBpbnB1dCBwYXJzZXMuICovXG4gICAgcHJpdmF0ZSBwYXJzZVZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8IHRoaXMuZW1wdHkgfHwgdGhpcy5sYXN0VmFsdWVWYWxpZFxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHsga2JxRGF0ZXBpY2tlclBhcnNlOiB7IHRleHQ6IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlIH0gfTtcbiAgICB9O1xuXG4gICAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB0aGUgbWluIGRhdGUuICovXG4gICAgcHJpdmF0ZSBtaW5WYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5hZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWUpO1xuXG4gICAgICAgIHJldHVybiAhdGhpcy5taW4gfHwgIWNvbnRyb2xWYWx1ZSB8fCB0aGlzLmFkYXB0ZXIuY29tcGFyZURhdGVUaW1lKHRoaXMubWluLCBjb250cm9sVmFsdWUpIDw9IDBcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiB7IGticURhdGVwaWNrZXJNaW46IHsgbWluOiB0aGlzLm1pbiwgYWN0dWFsOiBjb250cm9sVmFsdWUgfSB9O1xuICAgIH07XG5cbiAgICAvKiogVGhlIGZvcm0gY29udHJvbCB2YWxpZGF0b3IgZm9yIHRoZSBtYXggZGF0ZS4gKi9cbiAgICBwcml2YXRlIG1heFZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmFkYXB0ZXIuZGVzZXJpYWxpemUoY29udHJvbC52YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuICF0aGlzLm1heCB8fCAhY29udHJvbFZhbHVlIHx8IHRoaXMuYWRhcHRlci5jb21wYXJlRGF0ZVRpbWUodGhpcy5tYXgsIGNvbnRyb2xWYWx1ZSkgPj0gMFxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHsga2JxRGF0ZXBpY2tlck1heDogeyBtYXg6IHRoaXMubWF4LCBhY3R1YWw6IGNvbnRyb2xWYWx1ZSB9IH07XG4gICAgfTtcblxuICAgIC8qKiBUaGUgZm9ybSBjb250cm9sIHZhbGlkYXRvciBmb3IgdGhlIGRhdGUgZmlsdGVyLiAqL1xuICAgIHByaXZhdGUgZmlsdGVyVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuYWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlKTtcblxuICAgICAgICByZXR1cm4gIXRoaXMuZGF0ZUZpbHRlciB8fCAhY29udHJvbFZhbHVlIHx8IHRoaXMuZGF0ZUZpbHRlcihjb250cm9sVmFsdWUpXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogeyBrYnFEYXRlcGlja2VyRmlsdGVyOiB0cnVlIH07XG4gICAgfTtcblxuICAgIC8qKiBGb3JtYXRzIGEgdmFsdWUgYW5kIHNldHMgaXQgb24gdGhlIGlucHV0IGVsZW1lbnQuICovXG4gICAgcHJpdmF0ZSBmb3JtYXRWYWx1ZSh2YWx1ZTogRCB8IG51bGwpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB2YWx1ZSA/IHRoaXMuYWRhcHRlci5mb3JtYXQodmFsdWUsIHRoaXMuZGF0ZUlucHV0Rm9ybWF0KSA6ICcnO1xuXG4gICAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKGZvcm1hdHRlZFZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udHJvbCA9IGNvbnRyb2w7XG5cbiAgICAgICAgdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiAodGhpcy5fdmFsdWUgPSB2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBUaGUgZ2l2ZW4gb2JqZWN0IGlmIGl0IGlzIGJvdGggYSBkYXRlIGluc3RhbmNlIGFuZCB2YWxpZCwgb3RoZXJ3aXNlIG51bGwuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRWYWxpZERhdGVPck51bGwob2JqOiBhbnkpOiBEIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuaXNEYXRlSW5zdGFuY2Uob2JqKSAmJiB0aGlzLmFkYXB0ZXIuaXNWYWxpZChvYmopID8gb2JqIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERpZ2l0UG9zaXRpb25zKGZvcm1hdDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZmlyc3REaWdpdCA9IHRoaXMuc2Vjb25kRGlnaXQgPSB0aGlzLnRoaXJkRGlnaXQgPSBudWxsO1xuXG4gICAgICAgIGNvbnN0IGZvcm1hdEluTG93ZXJDYXNlID0gZm9ybWF0LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgZm9ybWF0SW5Mb3dlckNhc2Uuc3BsaXQoJycpLnJlZHVjZShcbiAgICAgICAgICAgICh7IHByZXYsIGxlbmd0aCwgc3RhcnQgfTogYW55LCB2YWx1ZTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBhcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHRoaXMuc2VwYXJhdG9yIHx8IGFyci5sZW5ndGggLSAxID09PSBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZmlyc3REaWdpdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJzdERpZ2l0ID0gbmV3IERhdGVEaWdpdChwcmV2LCBzdGFydCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5zZWNvbmREaWdpdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWNvbmREaWdpdCA9IG5ldyBEYXRlRGlnaXQocHJldiwgc3RhcnQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMudGhpcmREaWdpdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGlyZERpZ2l0ID0gbmV3IERhdGVEaWdpdChwcmV2LCBzdGFydCwgYXJyLmxlbmd0aCAtIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLXBhcmFtZXRlci1yZWFzc2lnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpbmRleCArIDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKys7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcHJldjogdmFsdWUsIGxlbmd0aCwgc3RhcnQgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGxlbmd0aDogMCwgc3RhcnQ6IDAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghdGhpcy5maXJzdERpZ2l0IHx8ICF0aGlzLnNlY29uZERpZ2l0IHx8ICF0aGlzLnRoaXJkRGlnaXQpIHtcbiAgICAgICAgICAgIEVycm9yKGBDYW4nIHQgdXNlIHRoaXMgZm9ybWF0OiAke2Zvcm1hdH1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGF0ZSh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRheTogbnVtYmVyKTogRCB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuY3JlYXRlRGF0ZVRpbWUoXG4gICAgICAgICAgICB5ZWFyLFxuICAgICAgICAgICAgbW9udGgsXG4gICAgICAgICAgICBkYXksXG4gICAgICAgICAgICB0aGlzLmFkYXB0ZXIuZ2V0SG91cnModGhpcy52YWx1ZSBhcyBEKSxcbiAgICAgICAgICAgIHRoaXMuYWRhcHRlci5nZXRNaW51dGVzKHRoaXMudmFsdWUgYXMgRCksXG4gICAgICAgICAgICB0aGlzLmFkYXB0ZXIuZ2V0U2Vjb25kcyh0aGlzLnZhbHVlIGFzIEQpLFxuICAgICAgICAgICAgdGhpcy5hZGFwdGVyLmdldE1pbGxpc2Vjb25kcyh0aGlzLnZhbHVlIGFzIEQpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVEYXRlVGltZSh2YWx1ZTogRGF0ZVRpbWVPYmplY3QpOiBEIHwgbnVsbCB7XG4gICAgICAgIGlmIChPYmplY3QudmFsdWVzKHZhbHVlKS5zb21lKGlzTmFOKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmNyZWF0ZURhdGVUaW1lKFxuICAgICAgICAgICAgdmFsdWUueWVhcixcbiAgICAgICAgICAgIHZhbHVlLm1vbnRoIC0gMSxcbiAgICAgICAgICAgIHZhbHVlLmRhdGUsXG4gICAgICAgICAgICB2YWx1ZS5ob3VycyxcbiAgICAgICAgICAgIHZhbHVlLm1pbnV0ZXMsXG4gICAgICAgICAgICB2YWx1ZS5zZWNvbmRzLFxuICAgICAgICAgICAgdmFsdWUubWlsbGlzZWNvbmRzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb3JyZWN0Q3Vyc29yUG9zaXRpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0ICYmIHRoaXMuc2VwYXJhdG9yUG9zaXRpb25zLmluY2x1ZGVzKHRoaXMuc2VsZWN0aW9uU3RhcnQpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ID0gdGhpcy5zZWxlY3Rpb25TdGFydCAtIDE7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=