@ardium-ui/ui 1.0.2 → 2.0.1

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 (390) hide show
  1. package/esm2022/lib/_internal/boolean-component.mjs +28 -42
  2. package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +5 -5
  3. package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +4 -4
  4. package/esm2022/lib/_internal/disablable-component.mjs +24 -22
  5. package/esm2022/lib/_internal/focusable-component.mjs +12 -25
  6. package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +172 -169
  7. package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +115 -120
  8. package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +56 -53
  9. package/esm2022/lib/_internal/models/pagination.model.mjs +72 -106
  10. package/esm2022/lib/_internal/ngmodel-component.mjs +5 -5
  11. package/esm2022/lib/_internal/queue.mjs +1 -1
  12. package/esm2022/lib/_internal/selectable-list-component.mjs +74 -98
  13. package/esm2022/lib/badge/badge.directive.mjs +70 -99
  14. package/esm2022/lib/badge/badge.module.mjs +4 -4
  15. package/esm2022/lib/badge/index.mjs +4 -0
  16. package/esm2022/lib/buttons/_button-base.mjs +13 -35
  17. package/esm2022/lib/buttons/button/button.component.mjs +22 -37
  18. package/esm2022/lib/buttons/button/button.module.mjs +4 -4
  19. package/esm2022/lib/buttons/button/index.mjs +3 -0
  20. package/esm2022/lib/buttons/fab/fab.component.mjs +16 -28
  21. package/esm2022/lib/buttons/fab/fab.module.mjs +4 -4
  22. package/esm2022/lib/buttons/fab/index.mjs +3 -0
  23. package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +17 -25
  24. package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +4 -4
  25. package/esm2022/lib/buttons/icon-button/index.mjs +3 -0
  26. package/esm2022/lib/card/card.children.mjs +32 -33
  27. package/esm2022/lib/card/card.component.mjs +14 -17
  28. package/esm2022/lib/card/card.module.mjs +4 -4
  29. package/esm2022/lib/card/index.mjs +5 -0
  30. package/esm2022/lib/checkbox/checkbox.component.mjs +33 -46
  31. package/esm2022/lib/checkbox/checkbox.module.mjs +4 -4
  32. package/esm2022/lib/checkbox/index.mjs +4 -0
  33. package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +31 -57
  34. package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +4 -4
  35. package/esm2022/lib/checkbox-list/index.mjs +4 -0
  36. package/esm2022/lib/chip/chip.component.mjs +22 -42
  37. package/esm2022/lib/chip/chip.module.mjs +4 -4
  38. package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +28 -53
  39. package/esm2022/lib/chip/index.mjs +5 -0
  40. package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +25 -49
  41. package/esm2022/lib/color/color-display/color-display.component.mjs +15 -32
  42. package/esm2022/lib/color/color-display/color-display.module.mjs +4 -4
  43. package/esm2022/lib/color/color-display/index.mjs +4 -0
  44. package/esm2022/lib/color/color-picker/color-picker.types.mjs +1 -1
  45. package/esm2022/lib/dialog/dialog.component.mjs +54 -130
  46. package/esm2022/lib/dialog/dialog.directives.mjs +3 -3
  47. package/esm2022/lib/dialog/dialog.module.mjs +4 -4
  48. package/esm2022/lib/dialog/dialog.types.mjs +1 -1
  49. package/esm2022/lib/dialog/index.mjs +5 -0
  50. package/esm2022/lib/divider/divider.component.mjs +9 -14
  51. package/esm2022/lib/divider/divider.module.mjs +4 -4
  52. package/esm2022/lib/divider/index.mjs +3 -0
  53. package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +40 -59
  54. package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +4 -4
  55. package/esm2022/lib/dropdown-panel/index.mjs +4 -0
  56. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +12 -17
  57. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +9 -9
  58. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +6 -6
  59. package/esm2022/lib/file-inputs/file-drop-area/index.mjs +4 -0
  60. package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +24 -50
  61. package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +18 -18
  62. package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +4 -4
  63. package/esm2022/lib/file-inputs/file-input/index.mjs +4 -0
  64. package/esm2022/lib/file-inputs/file-input-base.mjs +38 -72
  65. package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +20 -47
  66. package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +6 -6
  67. package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +4 -4
  68. package/esm2022/lib/form-field-frame/index.mjs +4 -0
  69. package/esm2022/lib/icon/icon.component.mjs +32 -67
  70. package/esm2022/lib/icon/icon.module.mjs +4 -4
  71. package/esm2022/lib/icon/icon.pipe.mjs +3 -3
  72. package/esm2022/lib/icon/index.mjs +4 -0
  73. package/esm2022/lib/inputs/color-input/color-input.directives.mjs +24 -24
  74. package/esm2022/lib/inputs/color-input/color-input.types.mjs +1 -1
  75. package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +65 -115
  76. package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +83 -92
  77. package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +4 -4
  78. package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +1 -1
  79. package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +1 -1
  80. package/esm2022/lib/inputs/digit-input/index.mjs +4 -0
  81. package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +59 -122
  82. package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +9 -9
  83. package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +24 -8
  84. package/esm2022/lib/inputs/hex-input/index.mjs +4 -0
  85. package/esm2022/lib/inputs/hex-input.model.mjs +24 -33
  86. package/esm2022/lib/inputs/input/index.mjs +4 -0
  87. package/esm2022/lib/inputs/input/input.component.mjs +95 -154
  88. package/esm2022/lib/inputs/input/input.directives.mjs +16 -16
  89. package/esm2022/lib/inputs/input/input.module.mjs +21 -7
  90. package/esm2022/lib/inputs/input-transformers.mjs +6 -6
  91. package/esm2022/lib/inputs/input-utils.mjs +75 -94
  92. package/esm2022/lib/inputs/number-input/index.mjs +4 -0
  93. package/esm2022/lib/inputs/number-input/number-input.component.mjs +106 -170
  94. package/esm2022/lib/inputs/number-input/number-input.directives.mjs +3 -3
  95. package/esm2022/lib/inputs/number-input/number-input.module.mjs +4 -4
  96. package/esm2022/lib/inputs/password-input/index.mjs +5 -0
  97. package/esm2022/lib/inputs/password-input/password-input.component.mjs +74 -144
  98. package/esm2022/lib/inputs/password-input/password-input.directives.mjs +12 -12
  99. package/esm2022/lib/inputs/password-input/password-input.module.mjs +4 -4
  100. package/esm2022/lib/inputs/password-input/password-input.types.mjs +1 -1
  101. package/esm2022/lib/inputs/simple-input/index.mjs +4 -0
  102. package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +57 -110
  103. package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +9 -9
  104. package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +4 -4
  105. package/esm2022/lib/kbd/index.mjs +4 -0
  106. package/esm2022/lib/kbd/kbd.component.mjs +15 -29
  107. package/esm2022/lib/kbd/kbd.module.mjs +4 -4
  108. package/esm2022/lib/kbd/kbd.pipe.mjs +3 -3
  109. package/esm2022/lib/kbd-shortcut/index.mjs +3 -0
  110. package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +23 -40
  111. package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +4 -4
  112. package/esm2022/lib/modal/index.mjs +3 -0
  113. package/esm2022/lib/modal/modal.component.mjs +42 -83
  114. package/esm2022/lib/modal/modal.module.mjs +4 -4
  115. package/esm2022/lib/option/index.mjs +3 -0
  116. package/esm2022/lib/option/option.component.mjs +24 -46
  117. package/esm2022/lib/option/option.module.mjs +4 -4
  118. package/esm2022/lib/progress-bar/index.mjs +5 -0
  119. package/esm2022/lib/progress-bar/progress-bar.component.mjs +43 -81
  120. package/esm2022/lib/progress-bar/progress-bar.directive.mjs +3 -3
  121. package/esm2022/lib/progress-bar/progress-bar.module.mjs +4 -4
  122. package/esm2022/lib/progress-bar/progress-bar.types.mjs +1 -1
  123. package/esm2022/lib/progress-circle/index.mjs +5 -0
  124. package/esm2022/lib/progress-circle/progress-circle.component.mjs +33 -78
  125. package/esm2022/lib/progress-circle/progress-circle.directive.mjs +3 -3
  126. package/esm2022/lib/progress-circle/progress-circle.module.mjs +4 -4
  127. package/esm2022/lib/progress-circle/progress-circle.types.mjs +1 -1
  128. package/esm2022/lib/radio/index.mjs +4 -0
  129. package/esm2022/lib/radio/radio/radio.component.mjs +16 -25
  130. package/esm2022/lib/radio/radio-group.component.mjs +71 -85
  131. package/esm2022/lib/radio/radio.module.mjs +4 -4
  132. package/esm2022/lib/search-functions.mjs +7 -7
  133. package/esm2022/lib/segment/index.mjs +5 -0
  134. package/esm2022/lib/segment/segment.component.mjs +70 -137
  135. package/esm2022/lib/segment/segment.directives.mjs +4 -4
  136. package/esm2022/lib/segment/segment.module.mjs +4 -4
  137. package/esm2022/lib/select/index.mjs +5 -0
  138. package/esm2022/lib/select/select.component.mjs +348 -655
  139. package/esm2022/lib/select/select.directive.mjs +46 -46
  140. package/esm2022/lib/select/select.module.mjs +4 -4
  141. package/esm2022/lib/select/select.types.mjs +1 -1
  142. package/esm2022/lib/slide-toggle/index.mjs +4 -0
  143. package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +19 -24
  144. package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +4 -4
  145. package/esm2022/lib/slide-toggle/slide-toggle.types.mjs +5 -0
  146. package/esm2022/lib/slider/abstract-slider.mjs +111 -200
  147. package/esm2022/lib/slider/index.mjs +7 -0
  148. package/esm2022/lib/slider/range-slider/range-slider.component.mjs +26 -23
  149. package/esm2022/lib/slider/range-slider/range-slider.module.mjs +4 -4
  150. package/esm2022/lib/slider/slider.component.mjs +13 -10
  151. package/esm2022/lib/slider/slider.directive.mjs +3 -3
  152. package/esm2022/lib/slider/slider.module.mjs +7 -7
  153. package/esm2022/lib/slider/slider.types.mjs +1 -1
  154. package/esm2022/lib/snackbar/snackbar-ref.mjs +1 -1
  155. package/esm2022/lib/snackbar/snackbar.component.mjs +8 -8
  156. package/esm2022/lib/snackbar/snackbar.service.mjs +13 -12
  157. package/esm2022/lib/snackbar/snackbar.types.mjs +1 -1
  158. package/esm2022/lib/spinner/index.mjs +3 -0
  159. package/esm2022/lib/spinner/spinner.component.mjs +9 -13
  160. package/esm2022/lib/spinner/spinner.module.mjs +4 -4
  161. package/esm2022/lib/star/index.mjs +4 -0
  162. package/esm2022/lib/star/star-button/index.mjs +3 -0
  163. package/esm2022/lib/star/star-button/star-button.component.mjs +17 -26
  164. package/esm2022/lib/star/star-button/star-button.module.mjs +4 -4
  165. package/esm2022/lib/star/star-display/index.mjs +3 -0
  166. package/esm2022/lib/star/star-display/star-display.component.mjs +48 -55
  167. package/esm2022/lib/star/star-display/star-display.module.mjs +4 -4
  168. package/esm2022/lib/star/star-input/index.mjs +3 -0
  169. package/esm2022/lib/star/star-input/star-input.component.mjs +70 -106
  170. package/esm2022/lib/star/star-input/star-input.module.mjs +4 -4
  171. package/esm2022/lib/star/star.component.mjs +12 -20
  172. package/esm2022/lib/star/star.module.mjs +4 -4
  173. package/esm2022/lib/statebox/index.mjs +3 -0
  174. package/esm2022/lib/statebox/statebox.component.mjs +64 -102
  175. package/esm2022/lib/statebox/statebox.module.mjs +4 -4
  176. package/esm2022/lib/statebox/statebox.types.mjs +1 -1
  177. package/esm2022/lib/tabber/index.mjs +4 -0
  178. package/esm2022/lib/tabber/tab/tab.component.mjs +42 -0
  179. package/esm2022/lib/tabber/tabber.component.mjs +83 -0
  180. package/esm2022/lib/tabber/tabber.module.mjs +19 -0
  181. package/esm2022/lib/table/index.mjs +5 -0
  182. package/esm2022/lib/table/table-item-storage.mjs +204 -200
  183. package/esm2022/lib/table/table.component.mjs +184 -304
  184. package/esm2022/lib/table/table.directives.mjs +19 -21
  185. package/esm2022/lib/table/table.module.mjs +4 -4
  186. package/esm2022/lib/table/utils.mjs +1 -1
  187. package/esm2022/lib/table-from-csv/index.mjs +3 -0
  188. package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +85 -29
  189. package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +4 -4
  190. package/esm2022/lib/table-pagination/index.mjs +4 -0
  191. package/esm2022/lib/table-pagination/table-pagination.component.mjs +46 -114
  192. package/esm2022/lib/table-pagination/table-pagination.module.mjs +4 -4
  193. package/esm2022/lib/types/item-storage.types.mjs +1 -1
  194. package/esm2022/lib/types/utility.types.mjs +2 -2
  195. package/esm2022/public-api.mjs +58 -182
  196. package/fesm2022/ardium-ui-ui.mjs +7847 -11692
  197. package/fesm2022/ardium-ui-ui.mjs.map +1 -1
  198. package/lib/_internal/boolean-component.d.ts +8 -9
  199. package/lib/_internal/clear-button/clear-button.component.d.ts +1 -1
  200. package/lib/_internal/disablable-component.d.ts +12 -7
  201. package/lib/_internal/focusable-component.d.ts +5 -7
  202. package/lib/_internal/item-storages/dropdown-item-storage.d.ts +43 -41
  203. package/lib/_internal/item-storages/simple-item-storage.d.ts +28 -25
  204. package/lib/_internal/item-storages/simplest-item-storage.d.ts +14 -9
  205. package/lib/_internal/models/pagination.model.d.ts +38 -42
  206. package/lib/_internal/ngmodel-component.d.ts +1 -1
  207. package/lib/_internal/selectable-list-component.d.ts +30 -30
  208. package/lib/badge/badge.directive.d.ts +15 -20
  209. package/lib/badge/index.d.ts +3 -0
  210. package/lib/buttons/_button-base.d.ts +9 -12
  211. package/lib/buttons/button/button.component.d.ts +6 -8
  212. package/lib/buttons/button/index.d.ts +2 -0
  213. package/lib/buttons/fab/fab.component.d.ts +4 -6
  214. package/lib/buttons/fab/index.d.ts +2 -0
  215. package/lib/buttons/icon-button/icon-button.component.d.ts +6 -7
  216. package/lib/buttons/icon-button/index.d.ts +2 -0
  217. package/lib/card/card.children.d.ts +4 -3
  218. package/lib/card/card.component.d.ts +5 -4
  219. package/lib/card/index.d.ts +4 -0
  220. package/lib/checkbox/checkbox.component.d.ts +8 -12
  221. package/lib/checkbox/index.d.ts +3 -0
  222. package/lib/checkbox-list/checkbox-list.component.d.ts +22 -21
  223. package/lib/checkbox-list/index.d.ts +3 -0
  224. package/lib/chip/chip.component.d.ts +8 -10
  225. package/lib/chip/deletable-chip/deletable-chip.component.d.ts +11 -14
  226. package/lib/chip/index.d.ts +4 -0
  227. package/lib/chip/selectable-chip/selectable-chip.component.d.ts +10 -12
  228. package/lib/color/color-display/color-display.component.d.ts +6 -9
  229. package/lib/color/color-display/index.d.ts +3 -0
  230. package/lib/color/color-picker/color-picker.types.d.ts +4 -4
  231. package/lib/dialog/dialog.component.d.ts +25 -35
  232. package/lib/dialog/dialog.types.d.ts +2 -2
  233. package/lib/dialog/index.d.ts +4 -0
  234. package/lib/divider/divider.component.d.ts +3 -4
  235. package/lib/divider/index.d.ts +2 -0
  236. package/lib/dropdown-panel/dropdown-panel.component.d.ts +17 -20
  237. package/lib/dropdown-panel/index.d.ts +3 -0
  238. package/lib/file-inputs/file-drop-area/file-drop-area.component.d.ts +5 -4
  239. package/lib/file-inputs/file-drop-area/index.d.ts +3 -0
  240. package/lib/file-inputs/file-input/file-input.component.d.ts +13 -17
  241. package/lib/file-inputs/file-input/index.d.ts +3 -0
  242. package/lib/file-inputs/file-input-base.d.ts +13 -18
  243. package/lib/form-field-frame/form-field-frame.component.d.ts +12 -16
  244. package/lib/form-field-frame/index.d.ts +3 -0
  245. package/lib/icon/icon.component.d.ts +10 -19
  246. package/lib/icon/index.d.ts +3 -0
  247. package/lib/inputs/color-input/color-input.types.d.ts +2 -2
  248. package/lib/inputs/digit-input/digit-input.component.d.ts +22 -30
  249. package/lib/inputs/digit-input/digit-input.model.d.ts +8 -12
  250. package/lib/inputs/digit-input/digit-input.types.d.ts +4 -4
  251. package/lib/inputs/digit-input/digit-input.utils.d.ts +4 -5
  252. package/lib/inputs/digit-input/index.d.ts +3 -0
  253. package/lib/inputs/hex-input/hex-input.component.d.ts +32 -38
  254. package/lib/inputs/hex-input/index.d.ts +3 -0
  255. package/lib/inputs/hex-input.model.d.ts +10 -11
  256. package/lib/inputs/input/index.d.ts +3 -0
  257. package/lib/inputs/input/input.component.d.ts +34 -40
  258. package/lib/inputs/input/input.directives.d.ts +3 -3
  259. package/lib/inputs/input-utils.d.ts +24 -27
  260. package/lib/inputs/number-input/index.d.ts +3 -0
  261. package/lib/inputs/number-input/number-input.component.d.ts +38 -48
  262. package/lib/inputs/password-input/index.d.ts +4 -0
  263. package/lib/inputs/password-input/password-input.component.d.ts +28 -40
  264. package/lib/inputs/password-input/password-input.types.d.ts +2 -2
  265. package/lib/inputs/simple-input/index.d.ts +3 -0
  266. package/lib/inputs/simple-input/simple-input.component.d.ts +30 -35
  267. package/lib/kbd/index.d.ts +3 -0
  268. package/lib/kbd/kbd.component.d.ts +6 -8
  269. package/lib/kbd-shortcut/index.d.ts +2 -0
  270. package/lib/kbd-shortcut/kbd-shortcut.component.d.ts +7 -10
  271. package/lib/modal/index.d.ts +2 -0
  272. package/lib/modal/modal.component.d.ts +22 -30
  273. package/lib/option/index.d.ts +2 -0
  274. package/lib/option/option.component.d.ts +11 -16
  275. package/lib/progress-bar/index.d.ts +4 -0
  276. package/lib/progress-bar/progress-bar.component.d.ts +14 -20
  277. package/lib/progress-bar/progress-bar.types.d.ts +2 -2
  278. package/lib/progress-circle/index.d.ts +4 -0
  279. package/lib/progress-circle/progress-circle.component.d.ts +12 -20
  280. package/lib/progress-circle/progress-circle.types.d.ts +2 -2
  281. package/lib/radio/index.d.ts +3 -0
  282. package/lib/radio/radio/radio.component.d.ts +7 -8
  283. package/lib/radio/radio-group.component.d.ts +13 -16
  284. package/lib/segment/index.d.ts +4 -0
  285. package/lib/segment/segment.component.d.ts +22 -34
  286. package/lib/segment/segment.directives.d.ts +2 -3
  287. package/lib/select/index.d.ts +4 -0
  288. package/lib/select/select.component.d.ts +114 -160
  289. package/lib/select/select.directive.d.ts +3 -3
  290. package/lib/select/select.types.d.ts +2 -76
  291. package/lib/slide-toggle/index.d.ts +3 -0
  292. package/lib/slide-toggle/slide-toggle.component.d.ts +9 -7
  293. package/lib/slide-toggle/slide-toggle.types.d.ts +5 -0
  294. package/lib/slider/abstract-slider.d.ts +38 -55
  295. package/lib/slider/index.d.ts +6 -0
  296. package/lib/slider/range-slider/range-slider.component.d.ts +3 -1
  297. package/lib/slider/slider.component.d.ts +2 -0
  298. package/lib/slider/slider.types.d.ts +8 -8
  299. package/lib/snackbar/snackbar-ref.d.ts +1 -2
  300. package/lib/snackbar/snackbar.component.d.ts +3 -3
  301. package/lib/snackbar/snackbar.service.d.ts +2 -2
  302. package/lib/snackbar/snackbar.types.d.ts +4 -4
  303. package/lib/spinner/index.d.ts +2 -0
  304. package/lib/spinner/spinner.component.d.ts +3 -3
  305. package/lib/star/index.d.ts +3 -0
  306. package/lib/star/star-button/index.d.ts +2 -0
  307. package/lib/star/star-button/star-button.component.d.ts +7 -7
  308. package/lib/star/star-display/index.d.ts +2 -0
  309. package/lib/star/star-display/star-display.component.d.ts +8 -12
  310. package/lib/star/star-input/index.d.ts +2 -0
  311. package/lib/star/star-input/star-input.component.d.ts +17 -22
  312. package/lib/star/star.component.d.ts +5 -5
  313. package/lib/statebox/index.d.ts +3 -0
  314. package/lib/statebox/statebox.component.d.ts +15 -21
  315. package/lib/statebox/statebox.types.d.ts +12 -8
  316. package/lib/tabber/index.d.ts +3 -0
  317. package/lib/tabber/tab/tab.component.d.ts +18 -0
  318. package/lib/tabber/tabber.component.d.ts +25 -0
  319. package/lib/tabber/tabber.module.d.ts +9 -0
  320. package/lib/table/index.d.ts +4 -0
  321. package/lib/table/table-item-storage.d.ts +70 -58
  322. package/lib/table/table.component.d.ts +59 -78
  323. package/lib/table/table.directives.d.ts +4 -3
  324. package/lib/table-from-csv/index.d.ts +2 -0
  325. package/lib/table-from-csv/table-from-csv.component.d.ts +46 -9
  326. package/lib/table-pagination/index.d.ts +3 -0
  327. package/lib/table-pagination/table-pagination.component.d.ts +21 -30
  328. package/lib/types/item-storage.types.d.ts +19 -18
  329. package/lib/types/utility.types.d.ts +2 -1
  330. package/package.json +8 -9
  331. package/prebuilt-themes/default/badge.css +5 -5
  332. package/prebuilt-themes/default/buttons/fab.css +4 -3
  333. package/prebuilt-themes/default/buttons/fab.css.map +1 -1
  334. package/prebuilt-themes/default/card.css +7 -7
  335. package/prebuilt-themes/default/chips.css +3 -8
  336. package/prebuilt-themes/default/chips.css.map +1 -1
  337. package/prebuilt-themes/default/core.css +6 -3
  338. package/prebuilt-themes/default/core.css.map +1 -1
  339. package/prebuilt-themes/default/inputs/color-input.css +1 -1
  340. package/prebuilt-themes/default/inputs/digit-input.css +1 -1
  341. package/prebuilt-themes/default/inputs/file-input.css +139 -2
  342. package/prebuilt-themes/default/inputs/file-input.css.map +1 -1
  343. package/prebuilt-themes/default/inputs/hex-input.css +2 -2
  344. package/prebuilt-themes/default/inputs/input.css +1 -1
  345. package/prebuilt-themes/default/inputs/search-bar.css +1 -1
  346. package/prebuilt-themes/default/inputs/simple-input.css +1 -1
  347. package/prebuilt-themes/default/modal.css +1 -1
  348. package/prebuilt-themes/default/segment.css +2 -2
  349. package/prebuilt-themes/default/segment.css.map +1 -1
  350. package/prebuilt-themes/default/select.css +5 -3
  351. package/prebuilt-themes/default/select.css.map +1 -1
  352. package/prebuilt-themes/default/snackbar.css +0 -1
  353. package/prebuilt-themes/default/snackbar.css.map +1 -1
  354. package/prebuilt-themes/default/tabber.css +207 -0
  355. package/prebuilt-themes/default/tabber.css.map +1 -0
  356. package/public-api.d.ts +43 -136
  357. package/themes/default/_clear-button.scss +1 -1
  358. package/themes/default/badge.scss +5 -5
  359. package/themes/default/buttons/fab.scss +5 -3
  360. package/themes/default/card.scss +7 -7
  361. package/themes/default/chips.scss +2 -8
  362. package/themes/default/core.scss +6 -3
  363. package/themes/default/inputs/digit-input.scss +1 -1
  364. package/themes/default/inputs/file-input.scss +8 -1
  365. package/themes/default/inputs/hex-input.scss +1 -1
  366. package/themes/default/modal.scss +1 -1
  367. package/themes/default/segment.scss +2 -1
  368. package/themes/default/select.scss +4 -2
  369. package/themes/default/snackbar.scss +0 -2
  370. package/themes/default/tabber.scss +86 -0
  371. package/esm2022/lib/calendar/calendar.component.mjs +0 -979
  372. package/esm2022/lib/calendar/calendar.directives.mjs +0 -107
  373. package/esm2022/lib/calendar/calendar.helpers.mjs +0 -47
  374. package/esm2022/lib/calendar/calendar.module.mjs +0 -21
  375. package/esm2022/lib/calendar/calendar.types.mjs +0 -11
  376. package/esm2022/lib/color/color-picker/color-picker.component.mjs +0 -484
  377. package/esm2022/lib/color/color-picker/color-picker.directives.mjs +0 -55
  378. package/esm2022/lib/color/color-picker/color-picker.module.mjs +0 -43
  379. package/esm2022/lib/inputs/color-input/color-input.component.mjs +0 -421
  380. package/esm2022/lib/inputs/color-input/color-input.module.mjs +0 -85
  381. package/lib/calendar/calendar.component.d.ts +0 -155
  382. package/lib/calendar/calendar.directives.d.ts +0 -51
  383. package/lib/calendar/calendar.helpers.d.ts +0 -15
  384. package/lib/calendar/calendar.module.d.ts +0 -11
  385. package/lib/calendar/calendar.types.d.ts +0 -80
  386. package/lib/color/color-picker/color-picker.component.d.ts +0 -125
  387. package/lib/color/color-picker/color-picker.directives.d.ts +0 -27
  388. package/lib/color/color-picker/color-picker.module.d.ts +0 -13
  389. package/lib/inputs/color-input/color-input.component.d.ts +0 -147
  390. package/lib/inputs/color-input/color-input.module.d.ts +0 -16
@@ -1,979 +0,0 @@
1
- import { forwardRef } from '@angular/core';
2
- import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, HostListener, Input, Output, ViewEncapsulation, } from '@angular/core';
3
- import { coerceBooleanProperty, coerceNumberProperty } from '@ardium-ui/devkit';
4
- import { roundToMultiple } from 'more-rounding';
5
- import { isDefined, isNull } from 'simple-bool';
6
- import { ComponentColor } from '../types/colors.types';
7
- import { _NgModelComponentBase } from '../_internal/ngmodel-component';
8
- import { ArdDaysViewHeaderTemplateDirective, ArdDayTemplateDirective, ArdFloatingMonthTemplateDirective, ArdMonthsViewHeaderTemplateDirective, ArdMonthTemplateDirective, ArdWeekdayTemplateDirective, ArdYearsViewHeaderTemplateDirective, ArdYearTemplateDirective, } from './calendar.directives';
9
- import { getMonthLayout } from './calendar.helpers';
10
- import { CalendarView, } from './calendar.types';
11
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "@angular/common";
14
- import * as i2 from "../buttons/button/button.component";
15
- import * as i3 from "../buttons/icon-button/icon-button.component";
16
- import * as i4 from "../icon/icon.component";
17
- function isLeapYear(year) {
18
- return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
19
- }
20
- export class ArdiumCalendarComponent extends _NgModelComponentBase {
21
- constructor() {
22
- super(...arguments);
23
- this._wasSelectedChecked = false;
24
- //! determining today state
25
- this.todayDate = new Date();
26
- //! color & wrapper classes
27
- this.color = ComponentColor.Primary;
28
- //! open year & month setters
29
- //pick a year range start so that the today date is always in the 3rd row
30
- this.todayYearRangeStart = this.todayDate.getFullYear() - (this.todayDate.getFullYear() % 4) - 8;
31
- this.displayedYearRangeStart = this.todayYearRangeStart;
32
- this.yearRangeArrayCache = null;
33
- this._activeDate = new Date(this.todayDate.getFullYear(), this.todayDate.getMonth(), this.todayDate.getDate());
34
- //! selection functions
35
- this._selected = null;
36
- //! output events
37
- this.yearSelected = new EventEmitter();
38
- this.monthSelected = new EventEmitter();
39
- this.selectedChange = new EventEmitter();
40
- this.activeYearChange = new EventEmitter();
41
- this.activeMonthChange = new EventEmitter();
42
- this.viewChange = new EventEmitter();
43
- this.changeEvent = new EventEmitter();
44
- //! calendar entry hover & click
45
- this._highlightedDay = null;
46
- this._highlightedMonth = null;
47
- this._highlightedYear = null;
48
- this._isUsingKeyboard = false;
49
- //! settings
50
- this._firstWeekday = 1;
51
- this._nointeract = false;
52
- this._staticHeight = false;
53
- //months view array
54
- this.monthsArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
55
- //years view array
56
- this._yearsArrayCache = null;
57
- this._yearsArrayCacheStartYear = null;
58
- //! change view functions
59
- this.activeView = CalendarView.Days;
60
- }
61
- ngOnInit() {
62
- this._updateCalendarArray();
63
- this._updateWeekdayArray();
64
- this._updateDisplayedYearRangeStart();
65
- }
66
- ngOnChanges(changes) {
67
- if (this._wasSelectedChecked)
68
- return;
69
- this._wasSelectedChecked = true;
70
- if (changes['selected']) {
71
- const v = this.selected;
72
- if (isNull(v))
73
- return;
74
- this.activeDate = new Date(v.getFullYear(), v.getMonth(), 1);
75
- }
76
- }
77
- isDayToday(day) {
78
- return this.activeYear == this.todayDate.getFullYear() && this.activeMonth == this.todayDate.getMonth() && day == this.todayDate.getDate();
79
- }
80
- isMonthToday(month) {
81
- return this.activeYear == this.todayDate.getFullYear() && month == this.todayDate.getMonth();
82
- }
83
- isYearToday(year) {
84
- return year == this.todayDate.getFullYear();
85
- }
86
- //! determining if an entry is selected
87
- isDaySelected(day) {
88
- if (day instanceof Date)
89
- day = day.getDate();
90
- return (this.selected != null && this.activeYear == this.selected.getFullYear() && this.activeMonth == this.selected.getMonth() && day == this.selected.getDate());
91
- }
92
- isMonthSelected(month) {
93
- if (month instanceof Date)
94
- month = month.getMonth();
95
- return this.selected != null && this.activeYear == this.selected.getFullYear() && month == this.selected.getMonth();
96
- }
97
- isYearSelected(year) {
98
- if (year instanceof Date)
99
- year = year.getFullYear();
100
- return this.selected != null && year == this.selected.getFullYear();
101
- }
102
- get ngClasses() {
103
- return [`ard-color-${this.color}`, this.nointeract ? 'ard-calendar-nointeract' : '', this.staticHeight ? 'ard-calendar-static-height' : ''].join(' ');
104
- }
105
- _updateDisplayedYearRangeStart(forcedYear) {
106
- if (isDefined(forcedYear))
107
- this.displayedYearRangeStart = forcedYear;
108
- //add the difference between the active year and the start of the range for the current year
109
- //rounded to a multiple of 24, towards the number zero
110
- //the difference may be negative, if the active year is before todayYearRangeStart
111
- this.displayedYearRangeStart = this.todayYearRangeStart + roundToMultiple(this.activeYear - this.todayYearRangeStart, 24, 'to_zero');
112
- }
113
- get yearRangeArray() {
114
- if (!this.yearRangeArrayCache) {
115
- let yearRangeStart = this.displayedYearRangeStart;
116
- const newArray = new Array(24).map(() => yearRangeStart++);
117
- this.yearRangeArrayCache = newArray;
118
- }
119
- return this.yearRangeArrayCache;
120
- }
121
- set activeDate(v) {
122
- const newDate = new Date(v);
123
- if (this.activeYear != newDate.getFullYear())
124
- this.yearRangeArrayCache = null;
125
- this._activeDate = newDate;
126
- this._updateCalendarArray();
127
- }
128
- get activeDate() {
129
- return this._activeDate;
130
- }
131
- get activeYear() {
132
- return this._activeDate.getFullYear();
133
- }
134
- set activeYear(v) {
135
- const year = coerceNumberProperty(v, new Date().getFullYear());
136
- this._activeDate.setFullYear(year);
137
- this.activeDate = new Date(year, this.activeMonth, 1);
138
- this.yearRangeArrayCache = null;
139
- this._updateCalendarArray();
140
- }
141
- get activeMonth() {
142
- return this._activeDate.getMonth();
143
- }
144
- set activeMonth(v) {
145
- const month = coerceNumberProperty(v, new Date().getMonth());
146
- const oldDateYear = this.activeYear;
147
- this.activeDate = new Date(this.activeYear, month, 1);
148
- if (oldDateYear != this.activeYear)
149
- this.yearRangeArrayCache = null;
150
- this._updateCalendarArray();
151
- }
152
- set selected(v) {
153
- this.writeValue(v);
154
- }
155
- get selected() {
156
- return this._selected;
157
- }
158
- writeValue(v) {
159
- if (typeof v == 'string') {
160
- //try to see if it is an array of numbers separated by a comma
161
- const vAsArray1 = v.split(',').map(v => Number(v));
162
- if (vAsArray1.length >= 1 && vAsArray1.length <= 3 && vAsArray1.every(v => !isNaN(v))) {
163
- v = new Date(vAsArray1[0], vAsArray1[1] ?? 0, vAsArray1[2] ?? 1);
164
- }
165
- else {
166
- //try to see if it is an array of numbers separated by some whitespace
167
- const vAsArray2 = v.split(/\s/).map(v => Number(v));
168
- if (vAsArray2.length >= 1 && vAsArray2.length <= 3 && vAsArray2.every(v => !isNaN(v))) {
169
- v = new Date(vAsArray2[0], vAsArray2[1] ?? 0, vAsArray2[2] ?? 1);
170
- }
171
- else {
172
- v = new Date(v);
173
- }
174
- }
175
- }
176
- //is a Date object && does not contain an error
177
- if (v instanceof Date && !isNaN(v.valueOf())) {
178
- this._selected = v;
179
- return;
180
- }
181
- if (v == null) {
182
- this._selected = null;
183
- return;
184
- }
185
- console.warn(`Could not parse [selected] value on <ard-calendar>, as it is not a valid value. Provided value: "${v}"`);
186
- this._selected = null;
187
- }
188
- _emitChange() {
189
- const v = this.selected;
190
- this._onChangeRegistered?.(v);
191
- this.selectedChange.emit(v);
192
- this.changeEvent.emit(v);
193
- }
194
- get highlightedDay() {
195
- return this._highlightedDay;
196
- }
197
- set highlightedDay(v) {
198
- if (isNull(v)) {
199
- this._highlightedDay = v;
200
- return;
201
- }
202
- const date = new Date(this.activeYear, this.activeMonth, v);
203
- this._highlightedDay = date.getDate();
204
- }
205
- setHighlightedDayAdjustDate(day) {
206
- this.highlightedDay = day;
207
- const date = new Date(this.activeYear, this.activeMonth, day);
208
- if (this.activeYear != date.getFullYear())
209
- this.activeYear = date.getFullYear();
210
- if (this.activeMonth != date.getMonth())
211
- this.activeMonth = date.getMonth();
212
- }
213
- get highlightedMonth() {
214
- return this._highlightedMonth;
215
- }
216
- set highlightedMonth(v) {
217
- if (isNull(v)) {
218
- this._highlightedMonth = v;
219
- return;
220
- }
221
- const date = new Date(this.activeYear, v, 1);
222
- this._highlightedMonth = date.getMonth();
223
- }
224
- setHighlightedMonthAdjustDate(month) {
225
- this.highlightedMonth = month;
226
- const date = new Date(this.activeYear, month, 1);
227
- if (this.activeYear != date.getFullYear())
228
- this.activeYear = date.getFullYear();
229
- }
230
- get highlightedYear() {
231
- return this._highlightedYear;
232
- }
233
- set highlightedYear(v) {
234
- this._highlightedYear = v;
235
- }
236
- setHighlightedYearAdjustPage(year) {
237
- this.highlightedYear = year;
238
- if (year < this.displayedYearRangeStart || year >= this.displayedYearRangeStart + 24) {
239
- //add the difference between the highlighted year and the displayed range start year
240
- //rounded to a multiple of 24, away from the number zero
241
- //the difference may be negative, if the first if condition is met
242
- this.displayedYearRangeStart += roundToMultiple(year - this.displayedYearRangeStart, 24, 'from_zero');
243
- }
244
- }
245
- get currentAriaLabel() {
246
- return new Date(this.activeYear, this.activeMonth, this.highlightedDay ?? 1).toLocaleDateString(undefined, {
247
- weekday: 'long',
248
- year: 'numeric',
249
- month: 'long',
250
- day: 'numeric',
251
- });
252
- }
253
- onCalendarDayMouseover(day) {
254
- if (day == null)
255
- return;
256
- if (this._isUsingKeyboard)
257
- return;
258
- this.highlightedDay = day;
259
- }
260
- onCalendarMonthMouseover(month) {
261
- if (this._isUsingKeyboard)
262
- return;
263
- this.highlightedMonth = month;
264
- }
265
- onCalendarYearMouseover(year) {
266
- if (this._isUsingKeyboard)
267
- return;
268
- this.highlightedYear = year;
269
- }
270
- onDocumentMousemove() {
271
- if (!this._isUsingKeyboard)
272
- this.highlightedDay = null;
273
- this._isUsingKeyboard = false;
274
- }
275
- onDocumentKeydown() {
276
- this._isUsingKeyboard = true;
277
- }
278
- onCalendarDayClick(day) {
279
- if (day == null)
280
- return;
281
- this.selectDay(day);
282
- this.focus();
283
- this.highlightedDay = day;
284
- }
285
- onCalendarMonthClick(month) {
286
- this.selectMonth(month);
287
- }
288
- onCalendarYearClick(year) {
289
- this.selectYear(year);
290
- }
291
- onDayGridFocus() {
292
- this.highlightedDay = 1;
293
- }
294
- onDayGridBlur() {
295
- this.highlightedDay = null;
296
- }
297
- onDayGridClick() {
298
- this.highlightedDay ??= 1;
299
- }
300
- onMonthGridFocus() {
301
- this.highlightedMonth = 0;
302
- }
303
- onMonthGridBlur() {
304
- this.highlightedMonth = null;
305
- }
306
- onMonthGridClick() {
307
- this.highlightedMonth ??= 0;
308
- }
309
- onYearGridFocus() {
310
- this.highlightedYear = this.displayedYearRangeStart;
311
- }
312
- onYearGridBlur() {
313
- this.highlightedYear = null;
314
- }
315
- onYearGridClick() {
316
- this.highlightedYear ??= this.displayedYearRangeStart;
317
- }
318
- //! main grid keyboard controls
319
- onMainGridKeydown(event) {
320
- switch (event.code) {
321
- case 'Space':
322
- case 'Enter':
323
- this._onEnterPress(event);
324
- break;
325
- case 'ArrowUp':
326
- this._onArrowUpPress(event);
327
- break;
328
- case 'ArrowDown':
329
- this._onArrowDownPress(event);
330
- break;
331
- case 'ArrowLeft':
332
- this._onArrowLeftPress(event);
333
- break;
334
- case 'ArrowRight':
335
- this._onArrowRightPress(event);
336
- break;
337
- case 'Home':
338
- this._onHomePress(event);
339
- break;
340
- case 'End':
341
- this._onEndPress(event);
342
- break;
343
- case 'PageUp':
344
- this._onPageUpPress(event);
345
- break;
346
- case 'PageDown':
347
- this._onPageDownPress(event);
348
- break;
349
- default:
350
- return;
351
- }
352
- }
353
- //select currently selected entry
354
- _onEnterPress(event) {
355
- event.preventDefault();
356
- this.selectCurrentlyHighlighted();
357
- }
358
- //highlight the entry one line above
359
- _onArrowUpPress(event) {
360
- event.preventDefault();
361
- switch (this.activeView) {
362
- case CalendarView.Days:
363
- this.highlightPreviousDay(7);
364
- break;
365
- case CalendarView.Months:
366
- this.highlightPreviousMonth(3); //3 months per line
367
- break;
368
- case CalendarView.Years:
369
- this.highlightPreviousYear(4); //4 years per line
370
- break;
371
- }
372
- }
373
- //highlight the entry one line below
374
- _onArrowDownPress(event) {
375
- event.preventDefault();
376
- switch (this.activeView) {
377
- case CalendarView.Days:
378
- this.highlightNextDay(7);
379
- break;
380
- case CalendarView.Months:
381
- this.highlightNextMonth(3); //3 months per line
382
- break;
383
- case CalendarView.Years:
384
- this.highlightNextYear(4); //4 years per line
385
- break;
386
- }
387
- }
388
- //highlight previous entry
389
- _onArrowLeftPress(event) {
390
- event.preventDefault();
391
- switch (this.activeView) {
392
- case CalendarView.Days:
393
- this.highlightPreviousDay();
394
- break;
395
- case CalendarView.Months:
396
- this.highlightPreviousMonth();
397
- break;
398
- case CalendarView.Years:
399
- this.highlightPreviousYear();
400
- break;
401
- }
402
- }
403
- //highlight next entry
404
- _onArrowRightPress(event) {
405
- event.preventDefault();
406
- switch (this.activeView) {
407
- case CalendarView.Days:
408
- this.highlightNextDay();
409
- break;
410
- case CalendarView.Months:
411
- this.highlightNextMonth();
412
- break;
413
- case CalendarView.Years:
414
- this.highlightNextYear();
415
- break;
416
- }
417
- }
418
- //highlight first entry on the page
419
- _onHomePress(event) {
420
- event.preventDefault();
421
- switch (this.activeView) {
422
- case CalendarView.Days:
423
- this.highlightFirstDay();
424
- break;
425
- case CalendarView.Months:
426
- this.highlightFirstMonth();
427
- break;
428
- case CalendarView.Years:
429
- this.highlightFirstYear();
430
- break;
431
- }
432
- }
433
- //highlight last entry on the page
434
- _onEndPress(event) {
435
- event.preventDefault();
436
- switch (this.activeView) {
437
- case CalendarView.Days:
438
- this.highlightLastDay();
439
- break;
440
- case CalendarView.Months:
441
- this.highlightLastMonth();
442
- break;
443
- case CalendarView.Years:
444
- this.highlightLastYear();
445
- break;
446
- }
447
- }
448
- //alone: highlight same entry on the previous page
449
- //with alt: highlight same entry multiple pages before (days view: 12 pages, months view: 10 pages, years view: 5 pages)
450
- _onPageUpPress(event) {
451
- event.preventDefault();
452
- switch (this.activeView) {
453
- case CalendarView.Days:
454
- if (event.altKey)
455
- this.highlightSameDayPreviousYear();
456
- else
457
- this.highlightSameDayPreviousMonth();
458
- break;
459
- case CalendarView.Months:
460
- this.highlightSameMonthPreviousYear(event.altKey);
461
- break;
462
- case CalendarView.Years:
463
- this.highlightSameYearPreviousPage(event.altKey);
464
- break;
465
- }
466
- }
467
- //alone: highlight same entry on the next page
468
- //with alt: highlight same entry multiple pages after (days view: 12 pages, months view: 10 pages, years view: 5 pages)
469
- _onPageDownPress(event) {
470
- event.preventDefault();
471
- switch (this.activeView) {
472
- case CalendarView.Days:
473
- if (event.altKey)
474
- this.highlightSameDayNextYear();
475
- else
476
- this.highlightSameDayNextMonth();
477
- break;
478
- case CalendarView.Months:
479
- this.highlightSameMonthNextYear(event.altKey);
480
- break;
481
- case CalendarView.Years:
482
- this.highlightSameYearNextPage(event.altKey);
483
- break;
484
- }
485
- }
486
- //! manipulation methods
487
- //selecting
488
- selectDay(day) {
489
- if (this.isDaySelected(day))
490
- return;
491
- if (isNull(day)) {
492
- if (!isDefined(this.selected))
493
- return;
494
- this.selected = null;
495
- this._emitChange();
496
- return;
497
- }
498
- if (day instanceof Date)
499
- day = day.getDate();
500
- this.selected = new Date(this.activeYear, this.activeMonth, day);
501
- this._emitChange();
502
- }
503
- selectMonth(month) {
504
- if (isNull(month)) {
505
- this.activeMonth = null;
506
- return;
507
- }
508
- if (month instanceof Date)
509
- month = month.getMonth();
510
- this.activeMonth = month;
511
- this.activeMonthChange.emit(month);
512
- this.monthSelected.emit(month);
513
- this.openDaysView();
514
- }
515
- selectYear(year) {
516
- if (isNull(year)) {
517
- this.activeYear = null;
518
- return;
519
- }
520
- if (year instanceof Date)
521
- year = year.getFullYear();
522
- this.activeYear = year;
523
- this.activeYearChange.emit(year);
524
- this.yearSelected.emit(year);
525
- this.openMonthsView();
526
- }
527
- selectCurrentlyHighlighted() {
528
- if (!isDefined(this.highlightedDay))
529
- return;
530
- switch (this.activeView) {
531
- case CalendarView.Days:
532
- this.selectDay(this.highlightedDay);
533
- return;
534
- case CalendarView.Months:
535
- this.selectMonth(this.highlightedMonth);
536
- return;
537
- case CalendarView.Years:
538
- this.selectYear(this.highlightedYear);
539
- return;
540
- default:
541
- return;
542
- }
543
- }
544
- //active months/years
545
- changeMonth(offset) {
546
- const oldyear = this.activeYear;
547
- this.activeMonth += offset;
548
- if (this.activeYear != oldyear)
549
- this.activeYearChange.emit(this.activeYear);
550
- this.activeMonthChange.emit(this.activeMonth);
551
- }
552
- changeYear(offset) {
553
- this.activeYear += offset;
554
- this.activeYearChange.emit(this.activeYear);
555
- }
556
- //changing year page
557
- changeYearsViewPage(pages) {
558
- this.displayedYearRangeStart += 24 * pages;
559
- }
560
- //next/prev highlighting
561
- highlightNextDay(offset = 1) {
562
- const currentDay = this.highlightedDay;
563
- if (!isDefined(currentDay)) {
564
- this.highlightedDay = 1;
565
- return;
566
- }
567
- this.setHighlightedDayAdjustDate(currentDay + offset);
568
- }
569
- highlightPreviousDay(offset = 1) {
570
- this.highlightNextDay(offset * -1);
571
- }
572
- highlightNextMonth(offset = 1) {
573
- const currentMonth = this.highlightedMonth;
574
- if (!isDefined(currentMonth)) {
575
- this.highlightedMonth = 0;
576
- return;
577
- }
578
- this.setHighlightedMonthAdjustDate(currentMonth + offset);
579
- }
580
- highlightPreviousMonth(offset = 1) {
581
- this.highlightNextMonth(offset * -1);
582
- }
583
- highlightNextYear(offset = 1) {
584
- const currentYear = this.highlightedYear;
585
- if (!isDefined(currentYear)) {
586
- this.highlightedYear = 0;
587
- return;
588
- }
589
- this.setHighlightedYearAdjustPage(currentYear + offset);
590
- }
591
- highlightPreviousYear(offset = 1) {
592
- this.highlightNextYear(offset * -1);
593
- }
594
- //first/last highlighting
595
- highlightFirstDay() {
596
- this.highlightedDay = 1;
597
- }
598
- highlightLastDay() {
599
- switch (this.activeMonth + 1) {
600
- case 1:
601
- case 3:
602
- case 5:
603
- case 7:
604
- case 8:
605
- case 10:
606
- case 12:
607
- this.highlightedDay = 31;
608
- break;
609
- case 4:
610
- case 6:
611
- case 9:
612
- case 11:
613
- this.highlightedDay = 30;
614
- break;
615
- case 2:
616
- if (isLeapYear(this.activeYear))
617
- this.highlightedDay = 29;
618
- else
619
- this.highlightedDay = 28;
620
- }
621
- }
622
- highlightFirstMonth() {
623
- this.highlightedMonth = 0;
624
- }
625
- highlightLastMonth() {
626
- this.highlightedMonth = 11;
627
- }
628
- highlightFirstYear() {
629
- this.highlightedYear = this.displayedYearRangeStart;
630
- }
631
- highlightLastYear() {
632
- this.highlightedYear = this.displayedYearRangeStart + 23; //24 years per page
633
- }
634
- //same day next/prev month/year
635
- highlightSameDayNextMonth() {
636
- this.activeMonth++;
637
- this._fixDateAfterMonthChange();
638
- }
639
- highlightSameDayPreviousMonth() {
640
- this.activeMonth--;
641
- this._fixDateAfterMonthChange();
642
- }
643
- _fixDateAfterMonthChange() {
644
- switch (this.activeMonth + 1) {
645
- case 1:
646
- case 3:
647
- case 5:
648
- case 7:
649
- case 8:
650
- case 10:
651
- case 12:
652
- //do nothing
653
- break;
654
- case 4:
655
- case 6:
656
- case 9:
657
- case 11:
658
- //only do if day is 31
659
- if (this.highlightedDay == 31)
660
- this.highlightedDay = 30;
661
- break;
662
- case 2: {
663
- //skip if below 29 or null
664
- if (!this.highlightedDay || this.highlightedDay < 29)
665
- break;
666
- if (isLeapYear(this.activeYear))
667
- this.highlightedDay = 29;
668
- else
669
- this.highlightedDay = 28;
670
- }
671
- }
672
- }
673
- highlightSameDayNextYear() {
674
- this.activeYear++;
675
- this._fixDateAfterYearChange();
676
- }
677
- highlightSameDayPreviousYear() {
678
- this.activeYear--;
679
- this._fixDateAfterYearChange();
680
- }
681
- _fixDateAfterYearChange() {
682
- if (this.highlightedDay != 29)
683
- return; //skip if not 29th day is selected
684
- if (isLeapYear(this.activeYear))
685
- return; //skip if nea year is a leap year
686
- if (this.activeMonth != 1)
687
- return; //skip if not february
688
- this.highlightedDay = 28;
689
- }
690
- //same month next/prev year
691
- highlightSameMonthNextYear(multiple) {
692
- this.activeYear += multiple ? 10 : 1;
693
- }
694
- highlightSameMonthPreviousYear(multiple) {
695
- this.activeYear -= multiple ? 10 : 1;
696
- }
697
- //same year next/prev page(s)
698
- highlightSameYearNextPage(multiple) {
699
- if (!isDefined(this.highlightedYear)) {
700
- this.highlightedYear = this.displayedYearRangeStart;
701
- return;
702
- }
703
- this.setHighlightedYearAdjustPage(this.highlightedYear + (multiple ? 60 : 24));
704
- }
705
- highlightSameYearPreviousPage(multiple) {
706
- if (!isDefined(this.highlightedYear)) {
707
- this.highlightedYear = this.displayedYearRangeStart;
708
- return;
709
- }
710
- this.setHighlightedYearAdjustPage(this.highlightedYear - (multiple ? 60 : 24));
711
- }
712
- get firstWeekday() {
713
- return this._firstWeekday;
714
- }
715
- set firstWeekday(v) {
716
- this._firstWeekday = coerceNumberProperty(v, 1) % 7;
717
- this._updateCalendarArray();
718
- this._updateWeekdayArray();
719
- }
720
- get nointeract() {
721
- return this._nointeract || this.disabled;
722
- }
723
- set nointeract(v) {
724
- this._nointeract = coerceBooleanProperty(v);
725
- }
726
- get staticHeight() {
727
- return this._staticHeight;
728
- }
729
- set staticHeight(v) {
730
- this._staticHeight = coerceBooleanProperty(v);
731
- }
732
- _updateCalendarArray() {
733
- const resultObj = getMonthLayout(this._activeDate, this.firstWeekday);
734
- this.reserveTopRow = resultObj.leadingSpaces < 3;
735
- this.calendarArray = resultObj.array;
736
- }
737
- getYearsArray() {
738
- const year = this.displayedYearRangeStart;
739
- if (this._yearsArrayCacheStartYear == year && isDefined(this._yearsArrayCache))
740
- return this._yearsArrayCache;
741
- const newArray = [];
742
- for (let i = year; i < year + 24; i++) {
743
- newArray.push(i);
744
- }
745
- this._yearsArrayCache = newArray;
746
- this._yearsArrayCacheStartYear = year;
747
- return newArray;
748
- }
749
- _updateWeekdayArray() {
750
- this.weekdayArray = [0, 1, 2, 3, 4, 5, 6].map(v => (v + this.firstWeekday) % 7);
751
- }
752
- set startView(v) {
753
- this.activeView = v;
754
- }
755
- openYearsView() {
756
- this.activeView = CalendarView.Years;
757
- this._updateDisplayedYearRangeStart();
758
- this.viewChange.emit(this.activeView);
759
- }
760
- openMonthsView() {
761
- this.activeView = CalendarView.Months;
762
- //bring back old value
763
- const oldYear = this.activeYear;
764
- this.activeYear = this.activeYear ?? this.todayDate.getFullYear();
765
- //emit events
766
- this.viewChange.emit(this.activeView);
767
- if (oldYear != this.activeYear && this.activeYear == this.todayDate.getFullYear())
768
- this.activeYearChange.emit(this.activeYear);
769
- }
770
- openDaysView() {
771
- this.activeView = CalendarView.Days;
772
- //bring back old values
773
- const oldYear = this.activeYear;
774
- this.activeYear = this.activeYear ?? this.todayDate.getFullYear();
775
- const oldMonth = this.activeMonth;
776
- this.activeMonth = this.activeMonth ?? this.todayDate.getMonth();
777
- //emit events
778
- this.viewChange.emit(this.activeView);
779
- if (oldYear != this.activeYear && this.activeYear == this.todayDate.getFullYear())
780
- this.activeYearChange.emit(this.activeYear);
781
- if (oldMonth != this.activeMonth && this.activeMonth == this.todayDate.getMonth())
782
- this.activeMonthChange.emit(this.activeMonth);
783
- }
784
- //! context getters
785
- //headers
786
- getYearsViewHeaderContext() {
787
- const yearRangeStart = this.displayedYearRangeStart;
788
- const yearRangeEnd = yearRangeStart + 23;
789
- const dateRange = {
790
- low: new Date(yearRangeStart, 0, 1),
791
- high: new Date(yearRangeEnd, 0, 1),
792
- };
793
- return {
794
- nextPage: () => {
795
- this.changeYearsViewPage(+1);
796
- },
797
- prevPage: () => {
798
- this.changeYearsViewPage(-1);
799
- },
800
- openDaysView: () => {
801
- this.openDaysView();
802
- },
803
- yearRange: {
804
- low: yearRangeStart,
805
- high: yearRangeEnd,
806
- },
807
- dateRange,
808
- $implicit: dateRange,
809
- };
810
- }
811
- getMonthsViewHeaderContext() {
812
- return {
813
- openYearsView: () => {
814
- this.openYearsView();
815
- },
816
- openDaysView: () => {
817
- this.openDaysView();
818
- },
819
- year: this.activeYear,
820
- date: this.activeDate,
821
- $implicit: this.activeYear,
822
- };
823
- }
824
- getDaysViewHeaderContext() {
825
- return {
826
- nextMonth: () => {
827
- this.changeMonth(+1);
828
- },
829
- prevMonth: () => {
830
- this.changeMonth(-1);
831
- },
832
- nextYear: () => {
833
- this.changeYear(+1);
834
- },
835
- prevYear: () => {
836
- this.changeYear(-1);
837
- },
838
- openYearsView: () => {
839
- this.openYearsView();
840
- },
841
- openMonthsView: () => {
842
- this.openMonthsView();
843
- },
844
- year: this.activeYear,
845
- month: this.activeMonth,
846
- date: this.activeDate,
847
- $implicit: this.activeDate,
848
- };
849
- }
850
- //weekday
851
- getWeekdayContext(dayIndex) {
852
- const date = new Date(1970, 0, 4 + dayIndex);
853
- return {
854
- dayIndex,
855
- date,
856
- $implicit: date,
857
- };
858
- }
859
- //floating month
860
- getFloatingMonthContext() {
861
- return {
862
- month: this.activeMonth,
863
- date: this.activeDate,
864
- $implicit: this.activeDate,
865
- };
866
- }
867
- //grid elements (year, month, day)
868
- getYearContext(year) {
869
- return {
870
- value: year,
871
- date: new Date(this.activeYear, 0, 1),
872
- $implicit: year,
873
- select: (year) => {
874
- this.selectYear(year);
875
- },
876
- };
877
- }
878
- getMonthContext(month) {
879
- const date = new Date(this.activeYear, month, 1);
880
- return {
881
- month,
882
- date,
883
- $implicit: date,
884
- select: (month) => {
885
- this.selectMonth(month);
886
- },
887
- };
888
- }
889
- getDayContext(day) {
890
- return {
891
- value: day,
892
- date: new Date(this.activeYear, this.activeMonth, day),
893
- $implicit: day,
894
- select: (day) => {
895
- this.selectDay(day);
896
- },
897
- };
898
- }
899
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumCalendarComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
900
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: ArdiumCalendarComponent, selector: "ard-calendar", inputs: { color: "color", activeYear: "activeYear", activeMonth: "activeMonth", selected: "selected", firstWeekday: "firstWeekday", nointeract: "nointeract", staticHeight: "staticHeight", startView: "startView" }, outputs: { yearSelected: "yearSelected", monthSelected: "monthSelected", selectedChange: "selectedChange", activeYearChange: "activeYearChange", activeMonthChange: "activeMonthChange", viewChange: "viewChange", changeEvent: "change" }, host: { listeners: { "document:mousemove": "onDocumentMousemove()", "document:keydown": "onDocumentKeydown()" } }, providers: [
901
- {
902
- provide: NG_VALUE_ACCESSOR,
903
- useExisting: forwardRef(() => ArdiumCalendarComponent),
904
- multi: true,
905
- },
906
- ], queries: [{ propertyName: "yearsViewHeaderTemplate", first: true, predicate: ArdYearsViewHeaderTemplateDirective, descendants: true }, { propertyName: "monthsViewHeaderTemplate", first: true, predicate: ArdMonthsViewHeaderTemplateDirective, descendants: true }, { propertyName: "daysViewHeaderTemplate", first: true, predicate: ArdDaysViewHeaderTemplateDirective, descendants: true }, { propertyName: "weekdayTemplate", first: true, predicate: ArdWeekdayTemplateDirective, descendants: true }, { propertyName: "floatingMonthTemplate", first: true, predicate: ArdFloatingMonthTemplateDirective, descendants: true }, { propertyName: "yearTemplate", first: true, predicate: ArdYearTemplateDirective, descendants: true }, { propertyName: "monthTemplate", first: true, predicate: ArdMonthTemplateDirective, descendants: true }, { propertyName: "dayTemplate", first: true, predicate: ArdDayTemplateDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"ard-calendar\" [ngClass]=\"ngClasses\">\r\n <ng-template [ngTemplateOutlet]=\"activeView == 'days' ? daysView : activeView == 'months' ? monthsView : yearsView\"/>\r\n</div>\r\n\r\n<ng-template #yearsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultYearsViewHeaderTemplate let-currRange let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ currRange.low | date: 'YYYY' }}\r\n &mdash;\r\n {{ currRange.high | date: 'YYYY' }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearsViewHeaderTemplate || defaultYearsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getYearsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onYearGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onYearGridBlur()\"\r\n (click)=\"onYearGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let year of getYearsArray()\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedYear == year || activeYear == year\"\r\n [class.ard-calendar-entry-selected]=\"isYearSelected(year)\"\r\n [class.ard-calendar-today]=\"isYearToday(year)\"\r\n (click)=\"onCalendarYearClick(year)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarYearMouseover(year)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultYearTemplate let-year>\r\n {{ year }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearTemplate || defaultYearTemplate\"\r\n [ngTemplateOutletContext]=\"getYearContext(year)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #monthsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultMonthsViewHeaderTemplate let-year let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n [color]=\"color\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ year }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthsViewHeaderTemplate || defaultMonthsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onMonthGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onMonthGridBlur()\"\r\n (click)=\"onMonthGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let month of monthsArray\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedMonth == month || activeMonth == month\"\r\n [class.ard-calendar-entry-selected]=\"isMonthSelected(month)\"\r\n [class.ard-calendar-today]=\"isMonthToday(month)\"\r\n (click)=\"onCalendarMonthClick(month)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarMonthMouseover(month)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultMonthTemplate let-month>\r\n {{ month | date: \"MMM\" | uppercase }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthTemplate || defaultMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthContext(month)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #daysView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultDaysViewHeaderTemplate let-currDate let-nextMonth=\"nextMonth\" let-prevMonth=\"prevMonth\" let-openYearsView=\"openYearsView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openYearsView()\"\r\n >\r\n {{ currDate | date: 'MMM YYYY' | uppercase }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"daysViewHeaderTemplate || defaultDaysViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getDaysViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div class=\"ard-calendar-day-labels ard-calendar-grid\">\r\n <ng-template #defaultWeekdayTemplate let-date>\r\n <div class=\"ard-calendar-weekday\">{{ date | date: 'EEEEE' }}</div>\r\n </ng-template>\r\n <ng-container *ngFor=\"let weekdayIndex of weekdayArray\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"weekdayTemplate || defaultWeekdayTemplate\"\r\n [ngTemplateOutletContext]=\"getWeekdayContext(weekdayIndex)\"\r\n ></ng-template>\r\n </ng-container>\r\n </div>\r\n <div #focusableElement\r\n class=\"ard-calendar-main-grid ard-calendar-grid\"\r\n [class.ard-reserve-top-row]=\"reserveTopRow\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onDayGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onDayGridBlur()\"\r\n (click)=\"onDayGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <div class=\"ard-calendar-floating-month\">\r\n <ng-template #defaultFloatingMonthTemplate let-date>\r\n {{ date | date: 'LLL' | uppercase }}\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"floatingMonthTemplate || defaultFloatingMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getFloatingMonthContext()\"\r\n ></ng-template>\r\n </div>\r\n <ng-container *ngFor=\"let week of calendarArray\">\r\n <ng-container *ngFor=\"let day of week\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-empty]=\"day == null\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedDay == day\"\r\n [class.ard-calendar-entry-selected]=\"isDaySelected(day)\"\r\n [class.ard-calendar-today]=\"isDayToday(day)\"\r\n (click)=\"onCalendarDayClick(day)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarDayMouseover(day)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\"\r\n *ngIf=\"day != null\"\r\n tabindex=\"-1\"\r\n >\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultDayTemplate let-day>\r\n {{ day }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"dayTemplate || defaultDayTemplate\"\r\n [ngTemplateOutletContext]=\"getDayContext(day)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n</ng-container> -->", styles: [".ard-calendar{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ArdiumButtonComponent, selector: "ard-button", inputs: ["variant", "alignIcon", "vertical", "icon"] }, { kind: "component", type: i3.ArdiumIconButtonComponent, selector: "ard-icon-button", inputs: ["wrapperClasses", "color", "compact"] }, { kind: "component", type: i4.ArdiumIconComponent, selector: "ard-icon", inputs: ["ariaLabel", "icon", "filled", "weight", "grade", "opticalSize"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
907
- }
908
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumCalendarComponent, decorators: [{
909
- type: Component,
910
- args: [{ selector: 'ard-calendar', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
911
- {
912
- provide: NG_VALUE_ACCESSOR,
913
- useExisting: forwardRef(() => ArdiumCalendarComponent),
914
- multi: true,
915
- },
916
- ], template: "<div class=\"ard-calendar\" [ngClass]=\"ngClasses\">\r\n <ng-template [ngTemplateOutlet]=\"activeView == 'days' ? daysView : activeView == 'months' ? monthsView : yearsView\"/>\r\n</div>\r\n\r\n<ng-template #yearsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultYearsViewHeaderTemplate let-currRange let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ currRange.low | date: 'YYYY' }}\r\n &mdash;\r\n {{ currRange.high | date: 'YYYY' }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearsViewHeaderTemplate || defaultYearsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getYearsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onYearGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onYearGridBlur()\"\r\n (click)=\"onYearGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let year of getYearsArray()\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedYear == year || activeYear == year\"\r\n [class.ard-calendar-entry-selected]=\"isYearSelected(year)\"\r\n [class.ard-calendar-today]=\"isYearToday(year)\"\r\n (click)=\"onCalendarYearClick(year)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarYearMouseover(year)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultYearTemplate let-year>\r\n {{ year }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearTemplate || defaultYearTemplate\"\r\n [ngTemplateOutletContext]=\"getYearContext(year)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #monthsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultMonthsViewHeaderTemplate let-year let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n [color]=\"color\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ year }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthsViewHeaderTemplate || defaultMonthsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onMonthGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onMonthGridBlur()\"\r\n (click)=\"onMonthGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let month of monthsArray\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedMonth == month || activeMonth == month\"\r\n [class.ard-calendar-entry-selected]=\"isMonthSelected(month)\"\r\n [class.ard-calendar-today]=\"isMonthToday(month)\"\r\n (click)=\"onCalendarMonthClick(month)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarMonthMouseover(month)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultMonthTemplate let-month>\r\n {{ month | date: \"MMM\" | uppercase }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthTemplate || defaultMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthContext(month)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #daysView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultDaysViewHeaderTemplate let-currDate let-nextMonth=\"nextMonth\" let-prevMonth=\"prevMonth\" let-openYearsView=\"openYearsView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openYearsView()\"\r\n >\r\n {{ currDate | date: 'MMM YYYY' | uppercase }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"daysViewHeaderTemplate || defaultDaysViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getDaysViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div class=\"ard-calendar-day-labels ard-calendar-grid\">\r\n <ng-template #defaultWeekdayTemplate let-date>\r\n <div class=\"ard-calendar-weekday\">{{ date | date: 'EEEEE' }}</div>\r\n </ng-template>\r\n <ng-container *ngFor=\"let weekdayIndex of weekdayArray\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"weekdayTemplate || defaultWeekdayTemplate\"\r\n [ngTemplateOutletContext]=\"getWeekdayContext(weekdayIndex)\"\r\n ></ng-template>\r\n </ng-container>\r\n </div>\r\n <div #focusableElement\r\n class=\"ard-calendar-main-grid ard-calendar-grid\"\r\n [class.ard-reserve-top-row]=\"reserveTopRow\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onDayGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onDayGridBlur()\"\r\n (click)=\"onDayGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <div class=\"ard-calendar-floating-month\">\r\n <ng-template #defaultFloatingMonthTemplate let-date>\r\n {{ date | date: 'LLL' | uppercase }}\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"floatingMonthTemplate || defaultFloatingMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getFloatingMonthContext()\"\r\n ></ng-template>\r\n </div>\r\n <ng-container *ngFor=\"let week of calendarArray\">\r\n <ng-container *ngFor=\"let day of week\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-empty]=\"day == null\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedDay == day\"\r\n [class.ard-calendar-entry-selected]=\"isDaySelected(day)\"\r\n [class.ard-calendar-today]=\"isDayToday(day)\"\r\n (click)=\"onCalendarDayClick(day)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarDayMouseover(day)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\"\r\n *ngIf=\"day != null\"\r\n tabindex=\"-1\"\r\n >\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultDayTemplate let-day>\r\n {{ day }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"dayTemplate || defaultDayTemplate\"\r\n [ngTemplateOutletContext]=\"getDayContext(day)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n</ng-container> -->", styles: [".ard-calendar{display:flex;flex-direction:column}\n"] }]
917
- }], propDecorators: { color: [{
918
- type: Input
919
- }], activeYear: [{
920
- type: Input
921
- }], activeMonth: [{
922
- type: Input
923
- }], selected: [{
924
- type: Input
925
- }], yearSelected: [{
926
- type: Output
927
- }], monthSelected: [{
928
- type: Output
929
- }], selectedChange: [{
930
- type: Output
931
- }], activeYearChange: [{
932
- type: Output
933
- }], activeMonthChange: [{
934
- type: Output
935
- }], viewChange: [{
936
- type: Output
937
- }], changeEvent: [{
938
- type: Output,
939
- args: ['change']
940
- }], onDocumentMousemove: [{
941
- type: HostListener,
942
- args: ['document:mousemove']
943
- }], onDocumentKeydown: [{
944
- type: HostListener,
945
- args: ['document:keydown']
946
- }], firstWeekday: [{
947
- type: Input
948
- }], nointeract: [{
949
- type: Input
950
- }], staticHeight: [{
951
- type: Input
952
- }], startView: [{
953
- type: Input
954
- }], yearsViewHeaderTemplate: [{
955
- type: ContentChild,
956
- args: [ArdYearsViewHeaderTemplateDirective]
957
- }], monthsViewHeaderTemplate: [{
958
- type: ContentChild,
959
- args: [ArdMonthsViewHeaderTemplateDirective]
960
- }], daysViewHeaderTemplate: [{
961
- type: ContentChild,
962
- args: [ArdDaysViewHeaderTemplateDirective]
963
- }], weekdayTemplate: [{
964
- type: ContentChild,
965
- args: [ArdWeekdayTemplateDirective]
966
- }], floatingMonthTemplate: [{
967
- type: ContentChild,
968
- args: [ArdFloatingMonthTemplateDirective]
969
- }], yearTemplate: [{
970
- type: ContentChild,
971
- args: [ArdYearTemplateDirective]
972
- }], monthTemplate: [{
973
- type: ContentChild,
974
- args: [ArdMonthTemplateDirective]
975
- }], dayTemplate: [{
976
- type: ContentChild,
977
- args: [ArdDayTemplateDirective]
978
- }] } });
979
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBNEIsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxrQ0FBa0MsRUFDbEMsdUJBQXVCLEVBQ3ZCLGlDQUFpQyxFQUNqQyxvQ0FBb0MsRUFDcEMseUJBQXlCLEVBQ3pCLDJCQUEyQixFQUMzQixtQ0FBbUMsRUFDbkMsd0JBQXdCLEdBQ3pCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxZQUFZLEdBVWIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7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b0NBQW9DO2dCQUdsRCxzQkFBc0I7c0JBRHJCLFlBQVk7dUJBQUMsa0NBQWtDO2dCQUloRCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsMkJBQTJCO2dCQUl6QyxxQkFBcUI7c0JBRHBCLFlBQVk7dUJBQUMsaUNBQWlDO2dCQUkvQyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsd0JBQXdCO2dCQUd0QyxhQUFhO3NCQURaLFlBQVk7dUJBQUMseUJBQXlCO2dCQUd2QyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGhpc1JlY2VpdmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0IHsgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHksIGNvZXJjZU51bWJlclByb3BlcnR5IH0gZnJvbSAnQGFyZGl1bS11aS9kZXZraXQnO1xuaW1wb3J0IHsgcm91bmRUb011bHRpcGxlIH0gZnJvbSAnbW9yZS1yb3VuZGluZyc7XG5pbXBvcnQgeyBpc0RlZmluZWQsIGlzTnVsbCB9IGZyb20gJ3NpbXBsZS1ib29sJztcbmltcG9ydCB7IENvbXBvbmVudENvbG9yIH0gZnJvbSAnLi4vdHlwZXMvY29sb3JzLnR5cGVzJztcbmltcG9ydCB7IF9OZ01vZGVsQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uL19pbnRlcm5hbC9uZ21vZGVsLWNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBBcmREYXlzVmlld0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmREYXlUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkRmxvYXRpbmdNb250aFRlbXBsYXRlRGlyZWN0aXZlLFxuICBBcmRNb250aHNWaWV3SGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZE1vbnRoVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZFdlZWtkYXlUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgQXJkWWVhcnNWaWV3SGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gIEFyZFllYXJUZW1wbGF0ZURpcmVjdGl2ZSxcbn0gZnJvbSAnLi9jYWxlbmRhci5kaXJlY3RpdmVzJztcbmltcG9ydCB7IGdldE1vbnRoTGF5b3V0IH0gZnJvbSAnLi9jYWxlbmRhci5oZWxwZXJzJztcbmltcG9ydCB7XG4gIENhbGVuZGFyVmlldyxcbiAgQ2FsZW5kYXJEYXlDb250ZXh0LFxuICBDYWxlbmRhckRheXNWaWV3SGVhZGVyQ29udGV4dCxcbiAgQ2FsZW5kYXJGbG9hdGluZ01vbnRoQ29udGV4dCxcbiAgQ2FsZW5kYXJNb250aENvbnRleHQsXG4gIENhbGVuZGFyTW9udGhzVmlld0hlYWRlckNvbnRleHQsXG4gIENhbGVuZGFyV2Vla2RheUNvbnRleHQsXG4gIENhbGVuZGFyWWVhckNvbnRleHQsXG4gIENhbGVuZGFyWWVhcnNWaWV3SGVhZGVyQ29udGV4dCxcbiAgRGF0ZVJhbmdlLFxufSBmcm9tICcuL2NhbGVuZGFyLnR5cGVzJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5mdW5jdGlvbiBpc0xlYXBZZWFyKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gKHllYXIgJSA0ID09IDAgJiYgeWVhciAlIDEwMCAhPSAwKSB8fCB5ZWFyICUgNDAwID09IDA7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FyZC1jYWxlbmRhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFyZGl1bUNhbGVuZGFyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFyZGl1bUNhbGVuZGFyQ29tcG9uZW50IGV4dGVuZHMgX05nTW9kZWxDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVDYWxlbmRhckFycmF5KCk7XG4gICAgdGhpcy5fdXBkYXRlV2Vla2RheUFycmF5KCk7XG4gICAgdGhpcy5fdXBkYXRlRGlzcGxheWVkWWVhclJhbmdlU3RhcnQoKTtcbiAgfVxuICBwcml2YXRlIF93YXNTZWxlY3RlZENoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl93YXNTZWxlY3RlZENoZWNrZWQpIHJldHVybjtcbiAgICB0aGlzLl93YXNTZWxlY3RlZENoZWNrZWQgPSB0cnVlO1xuXG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkJ10pIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnNlbGVjdGVkO1xuICAgICAgaWYgKGlzTnVsbCh2KSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCksIHYuZ2V0TW9udGgoKSwgMSk7XG4gICAgfVxuICB9XG5cbiAgLy8hIGRldGVybWluaW5nIHRvZGF5IHN0YXRlXG4gIHRvZGF5RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgaXNEYXlUb2RheShkYXk6IG51bWJlciB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVZZWFyID09IHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCkgJiYgdGhpcy5hY3RpdmVNb250aCA9PSB0aGlzLnRvZGF5RGF0ZS5nZXRNb250aCgpICYmIGRheSA9PSB0aGlzLnRvZGF5RGF0ZS5nZXREYXRlKCk7XG4gIH1cbiAgaXNNb250aFRvZGF5KG1vbnRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVZZWFyID09IHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCkgJiYgbW9udGggPT0gdGhpcy50b2RheURhdGUuZ2V0TW9udGgoKTtcbiAgfVxuICBpc1llYXJUb2RheSh5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4geWVhciA9PSB0aGlzLnRvZGF5RGF0ZS5nZXRGdWxsWWVhcigpO1xuICB9XG5cbiAgLy8hIGRldGVybWluaW5nIGlmIGFuIGVudHJ5IGlzIHNlbGVjdGVkXG4gIGlzRGF5U2VsZWN0ZWQoZGF5OiBudW1iZXIgfCBEYXRlIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmIChkYXkgaW5zdGFuY2VvZiBEYXRlKSBkYXkgPSBkYXkuZ2V0RGF0ZSgpO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnNlbGVjdGVkICE9IG51bGwgJiYgdGhpcy5hY3RpdmVZZWFyID09IHRoaXMuc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSAmJiB0aGlzLmFjdGl2ZU1vbnRoID09IHRoaXMuc2VsZWN0ZWQuZ2V0TW9udGgoKSAmJiBkYXkgPT0gdGhpcy5zZWxlY3RlZC5nZXREYXRlKClcbiAgICApO1xuICB9XG4gIGlzTW9udGhTZWxlY3RlZChtb250aDogbnVtYmVyIHwgRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGlmIChtb250aCBpbnN0YW5jZW9mIERhdGUpIG1vbnRoID0gbW9udGguZ2V0TW9udGgoKTtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZCAhPSBudWxsICYmIHRoaXMuYWN0aXZlWWVhciA9PSB0aGlzLnNlbGVjdGVkLmdldEZ1bGxZZWFyKCkgJiYgbW9udGggPT0gdGhpcy5zZWxlY3RlZC5nZXRNb250aCgpO1xuICB9XG4gIGlzWWVhclNlbGVjdGVkKHllYXI6IG51bWJlciB8IERhdGUpOiBib29sZWFuIHtcbiAgICBpZiAoeWVhciBpbnN0YW5jZW9mIERhdGUpIHllYXIgPSB5ZWFyLmdldEZ1bGxZZWFyKCk7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQgIT0gbnVsbCAmJiB5ZWFyID09IHRoaXMuc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKTtcbiAgfVxuXG4gIC8vISBjb2xvciAmIHdyYXBwZXIgY2xhc3Nlc1xuICBASW5wdXQoKSBjb2xvcjogQ29tcG9uZW50Q29sb3IgPSBDb21wb25lbnRDb2xvci5QcmltYXJ5O1xuXG4gIGdldCBuZ0NsYXNzZXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW2BhcmQtY29sb3ItJHt0aGlzLmNvbG9yfWAsIHRoaXMubm9pbnRlcmFjdCA/ICdhcmQtY2FsZW5kYXItbm9pbnRlcmFjdCcgOiAnJywgdGhpcy5zdGF0aWNIZWlnaHQgPyAnYXJkLWNhbGVuZGFyLXN0YXRpYy1oZWlnaHQnIDogJyddLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8vISBvcGVuIHllYXIgJiBtb250aCBzZXR0ZXJzXG4gIC8vcGljayBhIHllYXIgcmFuZ2Ugc3RhcnQgc28gdGhhdCB0aGUgdG9kYXkgZGF0ZSBpcyBhbHdheXMgaW4gdGhlIDNyZCByb3dcbiAgcHJpdmF0ZSByZWFkb25seSB0b2RheVllYXJSYW5nZVN0YXJ0OiBudW1iZXIgPSB0aGlzLnRvZGF5RGF0ZS5nZXRGdWxsWWVhcigpIC0gKHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCkgJSA0KSAtIDg7XG5cbiAgZGlzcGxheWVkWWVhclJhbmdlU3RhcnQ6IG51bWJlciA9IHRoaXMudG9kYXlZZWFyUmFuZ2VTdGFydDtcblxuICBwcml2YXRlIF91cGRhdGVEaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydChmb3JjZWRZZWFyPzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGlzRGVmaW5lZChmb3JjZWRZZWFyKSkgdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCA9IGZvcmNlZFllYXI7XG5cbiAgICAvL2FkZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhY3RpdmUgeWVhciBhbmQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBmb3IgdGhlIGN1cnJlbnQgeWVhclxuICAgIC8vcm91bmRlZCB0byBhIG11bHRpcGxlIG9mIDI0LCB0b3dhcmRzIHRoZSBudW1iZXIgemVyb1xuICAgIC8vdGhlIGRpZmZlcmVuY2UgbWF5IGJlIG5lZ2F0aXZlLCBpZiB0aGUgYWN0aXZlIHllYXIgaXMgYmVmb3JlIHRvZGF5WWVhclJhbmdlU3RhcnRcbiAgICB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ID0gdGhpcy50b2RheVllYXJSYW5nZVN0YXJ0ICsgcm91bmRUb011bHRpcGxlKHRoaXMuYWN0aXZlWWVhciAtIHRoaXMudG9kYXlZZWFyUmFuZ2VTdGFydCwgMjQsICd0b196ZXJvJyk7XG4gIH1cblxuICB5ZWFyUmFuZ2VBcnJheUNhY2hlOiBudW1iZXJbXSB8IG51bGwgPSBudWxsO1xuICBnZXQgeWVhclJhbmdlQXJyYXkoKTogbnVtYmVyW10ge1xuICAgIGlmICghdGhpcy55ZWFyUmFuZ2VBcnJheUNhY2hlKSB7XG4gICAgICBsZXQgeWVhclJhbmdlU3RhcnQgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0O1xuICAgICAgY29uc3QgbmV3QXJyYXkgPSBuZXcgQXJyYXkoMjQpLm1hcCgoKSA9PiB5ZWFyUmFuZ2VTdGFydCsrKTtcbiAgICAgIHRoaXMueWVhclJhbmdlQXJyYXlDYWNoZSA9IG5ld0FycmF5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy55ZWFyUmFuZ2VBcnJheUNhY2hlO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hY3RpdmVEYXRlOiBEYXRlID0gbmV3IERhdGUodGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy50b2RheURhdGUuZ2V0TW9udGgoKSwgdGhpcy50b2RheURhdGUuZ2V0RGF0ZSgpKTtcbiAgc2V0IGFjdGl2ZURhdGUodjogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2KTtcbiAgICBpZiAodGhpcy5hY3RpdmVZZWFyICE9IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSkgdGhpcy55ZWFyUmFuZ2VBcnJheUNhY2hlID0gbnVsbDtcbiAgICB0aGlzLl9hY3RpdmVEYXRlID0gbmV3RGF0ZTtcblxuICAgIHRoaXMuX3VwZGF0ZUNhbGVuZGFyQXJyYXkoKTtcbiAgfVxuICBnZXQgYWN0aXZlRGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZTtcbiAgfVxuXG4gIGdldCBhY3RpdmVZZWFyKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgYWN0aXZlWWVhcih2OiBhbnkpIHtcbiAgICBjb25zdCB5ZWFyID0gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpKTtcbiAgICB0aGlzLl9hY3RpdmVEYXRlLnNldEZ1bGxZZWFyKHllYXIpO1xuICAgIHRoaXMuYWN0aXZlRGF0ZSA9IG5ldyBEYXRlKHllYXIsIHRoaXMuYWN0aXZlTW9udGgsIDEpO1xuICAgIHRoaXMueWVhclJhbmdlQXJyYXlDYWNoZSA9IG51bGw7XG5cbiAgICB0aGlzLl91cGRhdGVDYWxlbmRhckFycmF5KCk7XG4gIH1cblxuICBnZXQgYWN0aXZlTW9udGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZS5nZXRNb250aCgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBhY3RpdmVNb250aCh2OiBhbnkpIHtcbiAgICBjb25zdCBtb250aCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYsIG5ldyBEYXRlKCkuZ2V0TW9udGgoKSk7XG4gICAgY29uc3Qgb2xkRGF0ZVllYXIgPSB0aGlzLmFjdGl2ZVllYXI7XG4gICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCBtb250aCwgMSk7XG4gICAgaWYgKG9sZERhdGVZZWFyICE9IHRoaXMuYWN0aXZlWWVhcikgdGhpcy55ZWFyUmFuZ2VBcnJheUNhY2hlID0gbnVsbDtcblxuICAgIHRoaXMuX3VwZGF0ZUNhbGVuZGFyQXJyYXkoKTtcbiAgfVxuICAvLyEgc2VsZWN0aW9uIGZ1bmN0aW9uc1xuICBwcm90ZWN0ZWQgX3NlbGVjdGVkOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpXG4gIHNldCBzZWxlY3RlZCh2OiBhbnkpIHtcbiAgICB0aGlzLndyaXRlVmFsdWUodik7XG4gIH1cbiAgZ2V0IHNlbGVjdGVkKCk6IERhdGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7XG4gIH1cblxuICB3cml0ZVZhbHVlKHY6IGFueSk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgdiA9PSAnc3RyaW5nJykge1xuICAgICAgLy90cnkgdG8gc2VlIGlmIGl0IGlzIGFuIGFycmF5IG9mIG51bWJlcnMgc2VwYXJhdGVkIGJ5IGEgY29tbWFcbiAgICAgIGNvbnN0IHZBc0FycmF5MSA9IHYuc3BsaXQoJywnKS5tYXAodiA9PiBOdW1iZXIodikpO1xuICAgICAgaWYgKHZBc0FycmF5MS5sZW5ndGggPj0gMSAmJiB2QXNBcnJheTEubGVuZ3RoIDw9IDMgJiYgdkFzQXJyYXkxLmV2ZXJ5KHYgPT4gIWlzTmFOKHYpKSkge1xuICAgICAgICB2ID0gbmV3IERhdGUodkFzQXJyYXkxWzBdLCB2QXNBcnJheTFbMV0gPz8gMCwgdkFzQXJyYXkxWzJdID8/IDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy90cnkgdG8gc2VlIGlmIGl0IGlzIGFuIGFycmF5IG9mIG51bWJlcnMgc2VwYXJhdGVkIGJ5IHNvbWUgd2hpdGVzcGFjZVxuICAgICAgICBjb25zdCB2QXNBcnJheTIgPSB2LnNwbGl0KC9cXHMvKS5tYXAodiA9PiBOdW1iZXIodikpO1xuICAgICAgICBpZiAodkFzQXJyYXkyLmxlbmd0aCA+PSAxICYmIHZBc0FycmF5Mi5sZW5ndGggPD0gMyAmJiB2QXNBcnJheTIuZXZlcnkodiA9PiAhaXNOYU4odikpKSB7XG4gICAgICAgICAgdiA9IG5ldyBEYXRlKHZBc0FycmF5MlswXSwgdkFzQXJyYXkyWzFdID8/IDAsIHZBc0FycmF5MlsyXSA/PyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ID0gbmV3IERhdGUodik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy9pcyBhIERhdGUgb2JqZWN0ICYmIGRvZXMgbm90IGNvbnRhaW4gYW4gZXJyb3JcbiAgICBpZiAodiBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHYudmFsdWVPZigpKSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSB2O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodiA9PSBudWxsKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IHBhcnNlIFtzZWxlY3RlZF0gdmFsdWUgb24gPGFyZC1jYWxlbmRhcj4sIGFzIGl0IGlzIG5vdCBhIHZhbGlkIHZhbHVlLiBQcm92aWRlZCB2YWx1ZTogXCIke3Z9XCJgKTtcbiAgICB0aGlzLl9zZWxlY3RlZCA9IG51bGw7XG4gIH1cblxuICAvLyEgb3V0cHV0IGV2ZW50c1xuICBAT3V0cHV0KCkgeWVhclNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBtb250aFNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlIHwgbnVsbD4oKTtcbiAgQE91dHB1dCgpIGFjdGl2ZVllYXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGFjdGl2ZU1vbnRoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgQE91dHB1dCgpIHZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyVmlldz4oKTtcblxuICBAT3V0cHV0KCdjaGFuZ2UnKSBjaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+KCk7XG5cbiAgcHJvdGVjdGVkIF9lbWl0Q2hhbmdlKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLnNlbGVjdGVkO1xuICAgIHRoaXMuX29uQ2hhbmdlUmVnaXN0ZXJlZD8uKHYpO1xuICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdCh2KTtcbiAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodik7XG4gIH1cblxuICAvLyEgY2FsZW5kYXIgZW50cnkgaG92ZXIgJiBjbGlja1xuICBwcml2YXRlIF9oaWdobGlnaHRlZERheTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGdldCBoaWdobGlnaHRlZERheSgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faGlnaGxpZ2h0ZWREYXk7XG4gIH1cbiAgc2V0IGhpZ2hsaWdodGVkRGF5KHY6IG51bWJlciB8IG51bGwpIHtcbiAgICBpZiAoaXNOdWxsKHYpKSB7XG4gICAgICB0aGlzLl9oaWdobGlnaHRlZERheSA9IHY7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmFjdGl2ZVllYXIsIHRoaXMuYWN0aXZlTW9udGgsIHYpO1xuICAgIHRoaXMuX2hpZ2hsaWdodGVkRGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gIH1cblxuICBzZXRIaWdobGlnaHRlZERheUFkanVzdERhdGUoZGF5OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gZGF5O1xuXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlWWVhciwgdGhpcy5hY3RpdmVNb250aCwgZGF5KTtcblxuICAgIGlmICh0aGlzLmFjdGl2ZVllYXIgIT0gZGF0ZS5nZXRGdWxsWWVhcigpKSB0aGlzLmFjdGl2ZVllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICBpZiAodGhpcy5hY3RpdmVNb250aCAhPSBkYXRlLmdldE1vbnRoKCkpIHRoaXMuYWN0aXZlTW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gIH1cblxuICBwcml2YXRlIF9oaWdobGlnaHRlZE1vbnRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgZ2V0IGhpZ2hsaWdodGVkTW9udGgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZ2hsaWdodGVkTW9udGg7XG4gIH1cbiAgc2V0IGhpZ2hsaWdodGVkTW9udGgodjogbnVtYmVyIHwgbnVsbCkge1xuICAgIGlmIChpc051bGwodikpIHtcbiAgICAgIHRoaXMuX2hpZ2hsaWdodGVkTW9udGggPSB2O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB2LCAxKTtcbiAgICB0aGlzLl9oaWdobGlnaHRlZE1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICB9XG5cbiAgc2V0SGlnaGxpZ2h0ZWRNb250aEFkanVzdERhdGUobW9udGg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IG1vbnRoO1xuXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlWWVhciwgbW9udGgsIDEpO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlWWVhciAhPSBkYXRlLmdldEZ1bGxZZWFyKCkpIHRoaXMuYWN0aXZlWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hpZ2hsaWdodGVkWWVhcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGdldCBoaWdobGlnaHRlZFllYXIoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZ2hsaWdodGVkWWVhcjtcbiAgfVxuICBzZXQgaGlnaGxpZ2h0ZWRZZWFyKHY6IG51bWJlciB8IG51bGwpIHtcbiAgICB0aGlzLl9oaWdobGlnaHRlZFllYXIgPSB2O1xuICB9XG5cbiAgc2V0SGlnaGxpZ2h0ZWRZZWFyQWRqdXN0UGFnZSh5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHllYXI7XG5cbiAgICBpZiAoeWVhciA8IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQgfHwgeWVhciA+PSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ICsgMjQpIHtcbiAgICAgIC8vYWRkIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGhpZ2hsaWdodGVkIHllYXIgYW5kIHRoZSBkaXNwbGF5ZWQgcmFuZ2Ugc3RhcnQgeWVhclxuICAgICAgLy9yb3VuZGVkIHRvIGEgbXVsdGlwbGUgb2YgMjQsIGF3YXkgZnJvbSB0aGUgbnVtYmVyIHplcm9cbiAgICAgIC8vdGhlIGRpZmZlcmVuY2UgbWF5IGJlIG5lZ2F0aXZlLCBpZiB0aGUgZmlyc3QgaWYgY29uZGl0aW9uIGlzIG1ldFxuICAgICAgdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCArPSByb3VuZFRvTXVsdGlwbGUoeWVhciAtIHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQsIDI0LCAnZnJvbV96ZXJvJyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGN1cnJlbnRBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCB0aGlzLmhpZ2hsaWdodGVkRGF5ID8/IDEpLnRvTG9jYWxlRGF0ZVN0cmluZyh1bmRlZmluZWQsIHtcbiAgICAgIHdlZWtkYXk6ICdsb25nJyxcbiAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICBkYXk6ICdudW1lcmljJyxcbiAgICB9KTtcbiAgfVxuXG4gIG9uQ2FsZW5kYXJEYXlNb3VzZW92ZXIoZGF5OiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKGRheSA9PSBudWxsKSByZXR1cm47XG4gICAgaWYgKHRoaXMuX2lzVXNpbmdLZXlib2FyZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5oaWdobGlnaHRlZERheSA9IGRheTtcbiAgfVxuICBvbkNhbGVuZGFyTW9udGhNb3VzZW92ZXIobW9udGg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc1VzaW5nS2V5Ym9hcmQpIHJldHVybjtcblxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IG1vbnRoO1xuICB9XG4gIG9uQ2FsZW5kYXJZZWFyTW91c2VvdmVyKHllYXI6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc1VzaW5nS2V5Ym9hcmQpIHJldHVybjtcblxuICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0geWVhcjtcbiAgfVxuXG4gIHByaXZhdGUgX2lzVXNpbmdLZXlib2FyZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZW1vdmUnKVxuICBvbkRvY3VtZW50TW91c2Vtb3ZlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNVc2luZ0tleWJvYXJkKSB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gbnVsbDtcblxuICAgIHRoaXMuX2lzVXNpbmdLZXlib2FyZCA9IGZhbHNlO1xuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nKVxuICBvbkRvY3VtZW50S2V5ZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLl9pc1VzaW5nS2V5Ym9hcmQgPSB0cnVlO1xuICB9XG5cbiAgb25DYWxlbmRhckRheUNsaWNrKGRheTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChkYXkgPT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgdGhpcy5zZWxlY3REYXkoZGF5KTtcblxuICAgIHRoaXMuZm9jdXMoKTtcbiAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gZGF5O1xuICB9XG4gIG9uQ2FsZW5kYXJNb250aENsaWNrKG1vbnRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdE1vbnRoKG1vbnRoKTtcbiAgfVxuICBvbkNhbGVuZGFyWWVhckNsaWNrKHllYXI6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0WWVhcih5ZWFyKTtcbiAgfVxuXG4gIG9uRGF5R3JpZEZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAxO1xuICB9XG4gIG9uRGF5R3JpZEJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHRlZERheSA9IG51bGw7XG4gIH1cbiAgb25EYXlHcmlkQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHRlZERheSA/Pz0gMTtcbiAgfVxuXG4gIG9uTW9udGhHcmlkRm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHRlZE1vbnRoID0gMDtcbiAgfVxuICBvbk1vbnRoR3JpZEJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHRlZE1vbnRoID0gbnVsbDtcbiAgfVxuICBvbk1vbnRoR3JpZENsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA/Pz0gMDtcbiAgfVxuXG4gIG9uWWVhckdyaWRGb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQ7XG4gIH1cbiAgb25ZZWFyR3JpZEJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSBudWxsO1xuICB9XG4gIG9uWWVhckdyaWRDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA/Pz0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcbiAgfVxuXG4gIC8vISBtYWluIGdyaWQga2V5Ym9hcmQgY29udHJvbHNcbiAgb25NYWluR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmNvZGUpIHtcbiAgICAgIGNhc2UgJ1NwYWNlJzpcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgdGhpcy5fb25FbnRlclByZXNzKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgdGhpcy5fb25BcnJvd1VwUHJlc3MoZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIHRoaXMuX29uQXJyb3dEb3duUHJlc3MoZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHRoaXMuX29uQXJyb3dMZWZ0UHJlc3MoZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICB0aGlzLl9vbkFycm93UmlnaHRQcmVzcyhldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgIHRoaXMuX29uSG9tZVByZXNzKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICB0aGlzLl9vbkVuZFByZXNzKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgICB0aGlzLl9vblBhZ2VVcFByZXNzKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgIHRoaXMuX29uUGFnZURvd25QcmVzcyhldmVudCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIC8vc2VsZWN0IGN1cnJlbnRseSBzZWxlY3RlZCBlbnRyeVxuICBwcml2YXRlIF9vbkVudGVyUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5zZWxlY3RDdXJyZW50bHlIaWdobGlnaHRlZCgpO1xuICB9XG4gIC8vaGlnaGxpZ2h0IHRoZSBlbnRyeSBvbmUgbGluZSBhYm92ZVxuICBwcml2YXRlIF9vbkFycm93VXBQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0UHJldmlvdXNEYXkoNyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICB0aGlzLmhpZ2hsaWdodFByZXZpb3VzTW9udGgoMyk7IC8vMyBtb250aHMgcGVyIGxpbmVcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcbiAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c1llYXIoNCk7IC8vNCB5ZWFycyBwZXIgbGluZVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLy9oaWdobGlnaHQgdGhlIGVudHJ5IG9uZSBsaW5lIGJlbG93XG4gIHByaXZhdGUgX29uQXJyb3dEb3duUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5EYXlzOlxuICAgICAgICB0aGlzLmhpZ2hsaWdodE5leHREYXkoNyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICB0aGlzLmhpZ2hsaWdodE5leHRNb250aCgzKTsgLy8zIG1vbnRocyBwZXIgbGluZVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxuICAgICAgICB0aGlzLmhpZ2hsaWdodE5leHRZZWFyKDQpOyAvLzQgeWVhcnMgcGVyIGxpbmVcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8vaGlnaGxpZ2h0IHByZXZpb3VzIGVudHJ5XG4gIHByaXZhdGUgX29uQXJyb3dMZWZ0UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5EYXlzOlxuICAgICAgICB0aGlzLmhpZ2hsaWdodFByZXZpb3VzRGF5KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICB0aGlzLmhpZ2hsaWdodFByZXZpb3VzTW9udGgoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcbiAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c1llYXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8vaGlnaGxpZ2h0IG5leHQgZW50cnlcbiAgcHJpdmF0ZSBfb25BcnJvd1JpZ2h0UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5EYXlzOlxuICAgICAgICB0aGlzLmhpZ2hsaWdodE5leHREYXkoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0TmV4dE1vbnRoKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuWWVhcnM6XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0TmV4dFllYXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8vaGlnaGxpZ2h0IGZpcnN0IGVudHJ5IG9uIHRoZSBwYWdlXG4gIHByaXZhdGUgX29uSG9tZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBzd2l0Y2ggKHRoaXMuYWN0aXZlVmlldykge1xuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuRGF5czpcbiAgICAgICAgdGhpcy5oaWdobGlnaHRGaXJzdERheSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3Lk1vbnRoczpcbiAgICAgICAgdGhpcy5oaWdobGlnaHRGaXJzdE1vbnRoKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuWWVhcnM6XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0Rmlyc3RZZWFyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvL2hpZ2hsaWdodCBsYXN0IGVudHJ5IG9uIHRoZSBwYWdlXG4gIHByaXZhdGUgX29uRW5kUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5EYXlzOlxuICAgICAgICB0aGlzLmhpZ2hsaWdodExhc3REYXkoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0TGFzdE1vbnRoKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuWWVhcnM6XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0TGFzdFllYXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8vYWxvbmU6IGhpZ2hsaWdodCBzYW1lIGVudHJ5IG9uIHRoZSBwcmV2aW91cyBwYWdlXG4gIC8vd2l0aCBhbHQ6IGhpZ2hsaWdodCBzYW1lIGVudHJ5IG11bHRpcGxlIHBhZ2VzIGJlZm9yZSAoZGF5cyB2aWV3OiAxMiBwYWdlcywgbW9udGhzIHZpZXc6IDEwIHBhZ2VzLCB5ZWFycyB2aWV3OiA1IHBhZ2VzKVxuICBwcml2YXRlIF9vblBhZ2VVcFByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBzd2l0Y2ggKHRoaXMuYWN0aXZlVmlldykge1xuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuRGF5czpcbiAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkgdGhpcy5oaWdobGlnaHRTYW1lRGF5UHJldmlvdXNZZWFyKCk7XG4gICAgICAgIGVsc2UgdGhpcy5oaWdobGlnaHRTYW1lRGF5UHJldmlvdXNNb250aCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3Lk1vbnRoczpcbiAgICAgICAgdGhpcy5oaWdobGlnaHRTYW1lTW9udGhQcmV2aW91c1llYXIoZXZlbnQuYWx0S2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcbiAgICAgICAgdGhpcy5oaWdobGlnaHRTYW1lWWVhclByZXZpb3VzUGFnZShldmVudC5hbHRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLy9hbG9uZTogaGlnaGxpZ2h0IHNhbWUgZW50cnkgb24gdGhlIG5leHQgcGFnZVxuICAvL3dpdGggYWx0OiBoaWdobGlnaHQgc2FtZSBlbnRyeSBtdWx0aXBsZSBwYWdlcyBhZnRlciAoZGF5cyB2aWV3OiAxMiBwYWdlcywgbW9udGhzIHZpZXc6IDEwIHBhZ2VzLCB5ZWFycyB2aWV3OiA1IHBhZ2VzKVxuICBwcml2YXRlIF9vblBhZ2VEb3duUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5EYXlzOlxuICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB0aGlzLmhpZ2hsaWdodFNhbWVEYXlOZXh0WWVhcigpO1xuICAgICAgICBlbHNlIHRoaXMuaGlnaGxpZ2h0U2FtZURheU5leHRNb250aCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3Lk1vbnRoczpcbiAgICAgICAgdGhpcy5oaWdobGlnaHRTYW1lTW9udGhOZXh0WWVhcihldmVudC5hbHRLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxuICAgICAgICB0aGlzLmhpZ2hsaWdodFNhbWVZZWFyTmV4dFBhZ2UoZXZlbnQuYWx0S2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8vISBtYW5pcHVsYXRpb24gbWV0aG9kc1xuICAvL3NlbGVjdGluZ1xuICBzZWxlY3REYXkoZGF5OiBudW1iZXIgfCBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGF5U2VsZWN0ZWQoZGF5KSkgcmV0dXJuO1xuICAgIGlmIChpc051bGwoZGF5KSkge1xuICAgICAgaWYgKCFpc0RlZmluZWQodGhpcy5zZWxlY3RlZCkpIHJldHVybjtcblxuICAgICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7XG4gICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRheSBpbnN0YW5jZW9mIERhdGUpIGRheSA9IGRheS5nZXREYXRlKCk7XG5cbiAgICB0aGlzLnNlbGVjdGVkID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCBkYXkpO1xuICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgfVxuICBzZWxlY3RNb250aChtb250aDogbnVtYmVyIHwgRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoaXNOdWxsKG1vbnRoKSkge1xuICAgICAgdGhpcy5hY3RpdmVNb250aCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChtb250aCBpbnN0YW5jZW9mIERhdGUpIG1vbnRoID0gbW9udGguZ2V0TW9udGgoKTtcblxuICAgIHRoaXMuYWN0aXZlTW9udGggPSBtb250aDtcblxuICAgIHRoaXMuYWN0aXZlTW9udGhDaGFuZ2UuZW1pdChtb250aCk7XG4gICAgdGhpcy5tb250aFNlbGVjdGVkLmVtaXQobW9udGgpO1xuXG4gICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcbiAgfVxuICBzZWxlY3RZZWFyKHllYXI6IG51bWJlciB8IERhdGUgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKGlzTnVsbCh5ZWFyKSkge1xuICAgICAgdGhpcy5hY3RpdmVZZWFyID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHllYXIgaW5zdGFuY2VvZiBEYXRlKSB5ZWFyID0geWVhci5nZXRGdWxsWWVhcigpO1xuXG4gICAgdGhpcy5hY3RpdmVZZWFyID0geWVhcjtcblxuICAgIHRoaXMuYWN0aXZlWWVhckNoYW5nZS5lbWl0KHllYXIpO1xuICAgIHRoaXMueWVhclNlbGVjdGVkLmVtaXQoeWVhcik7XG5cbiAgICB0aGlzLm9wZW5Nb250aHNWaWV3KCk7XG4gIH1cbiAgc2VsZWN0Q3VycmVudGx5SGlnaGxpZ2h0ZWQoKTogdm9pZCB7XG4gICAgaWYgKCFpc0RlZmluZWQodGhpcy5oaWdobGlnaHRlZERheSkpIHJldHVybjtcblxuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XG4gICAgICBjYXNlIENhbGVuZGFyVmlldy5EYXlzOlxuICAgICAgICB0aGlzLnNlbGVjdERheSh0aGlzLmhpZ2hsaWdodGVkRGF5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICB0aGlzLnNlbGVjdE1vbnRoKHRoaXMuaGlnaGxpZ2h0ZWRNb250aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxuICAgICAgICB0aGlzLnNlbGVjdFllYXIodGhpcy5oaWdobGlnaHRlZFllYXIpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgLy9hY3RpdmUgbW9udGhzL3llYXJzXG4gIGNoYW5nZU1vbnRoKG9mZnNldDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgb2xkeWVhciA9IHRoaXMuYWN0aXZlWWVhcjtcbiAgICB0aGlzLmFjdGl2ZU1vbnRoICs9IG9mZnNldDtcblxuICAgIGlmICh0aGlzLmFjdGl2ZVllYXIgIT0gb2xkeWVhcikgdGhpcy5hY3RpdmVZZWFyQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVZZWFyKTtcbiAgICB0aGlzLmFjdGl2ZU1vbnRoQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVNb250aCk7XG4gIH1cbiAgY2hhbmdlWWVhcihvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlWWVhciArPSBvZmZzZXQ7XG5cbiAgICB0aGlzLmFjdGl2ZVllYXJDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZVllYXIpO1xuICB9XG4gIC8vY2hhbmdpbmcgeWVhciBwYWdlXG4gIGNoYW5nZVllYXJzVmlld1BhZ2UocGFnZXM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQgKz0gMjQgKiBwYWdlcztcbiAgfVxuICAvL25leHQvcHJldiBoaWdobGlnaHRpbmdcbiAgaGlnaGxpZ2h0TmV4dERheShvZmZzZXQ6IG51bWJlciA9IDEpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50RGF5ID0gdGhpcy5oaWdobGlnaHRlZERheTtcbiAgICBpZiAoIWlzRGVmaW5lZChjdXJyZW50RGF5KSkge1xuICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDE7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWREYXlBZGp1c3REYXRlKGN1cnJlbnREYXkgKyBvZmZzZXQpO1xuICB9XG4gIGhpZ2hsaWdodFByZXZpb3VzRGF5KG9mZnNldDogbnVtYmVyID0gMSk6IHZvaWQge1xuICAgIHRoaXMuaGlnaGxpZ2h0TmV4dERheShvZmZzZXQgKiAtMSk7XG4gIH1cbiAgaGlnaGxpZ2h0TmV4dE1vbnRoKG9mZnNldDogbnVtYmVyID0gMSk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IHRoaXMuaGlnaGxpZ2h0ZWRNb250aDtcbiAgICBpZiAoIWlzRGVmaW5lZChjdXJyZW50TW9udGgpKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPSAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldEhpZ2hsaWdodGVkTW9udGhBZGp1c3REYXRlKGN1cnJlbnRNb250aCArIG9mZnNldCk7XG4gIH1cbiAgaGlnaGxpZ2h0UHJldmlvdXNNb250aChvZmZzZXQ6IG51bWJlciA9IDEpOiB2b2lkIHtcbiAgICB0aGlzLmhpZ2hsaWdodE5leHRNb250aChvZmZzZXQgKiAtMSk7XG4gIH1cbiAgaGlnaGxpZ2h0TmV4dFllYXIob2Zmc2V0OiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLmhpZ2hsaWdodGVkWWVhcjtcbiAgICBpZiAoIWlzRGVmaW5lZChjdXJyZW50WWVhcikpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZFllYXJBZGp1c3RQYWdlKGN1cnJlbnRZZWFyICsgb2Zmc2V0KTtcbiAgfVxuICBoaWdobGlnaHRQcmV2aW91c1llYXIob2Zmc2V0OiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHROZXh0WWVhcihvZmZzZXQgKiAtMSk7XG4gIH1cbiAgLy9maXJzdC9sYXN0IGhpZ2hsaWdodGluZ1xuICBoaWdobGlnaHRGaXJzdERheSgpOiB2b2lkIHtcbiAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gMTtcbiAgfVxuICBoaWdobGlnaHRMYXN0RGF5KCk6IHZvaWQge1xuICAgIHN3aXRjaCAodGhpcy5hY3RpdmVNb250aCArIDEpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgIGNhc2UgMzpcbiAgICAgIGNhc2UgNTpcbiAgICAgIGNhc2UgNzpcbiAgICAgIGNhc2UgODpcbiAgICAgIGNhc2UgMTA6XG4gICAgICBjYXNlIDEyOlxuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gMzE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgY2FzZSA2OlxuICAgICAgY2FzZSA5OlxuICAgICAgY2FzZSAxMTpcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDMwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaWYgKGlzTGVhcFllYXIodGhpcy5hY3RpdmVZZWFyKSkgdGhpcy5oaWdobGlnaHRlZERheSA9IDI5O1xuICAgICAgICBlbHNlIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyODtcbiAgICB9XG4gIH1cbiAgaGlnaGxpZ2h0Rmlyc3RNb250aCgpOiB2b2lkIHtcbiAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPSAwO1xuICB9XG4gIGhpZ2hsaWdodExhc3RNb250aCgpOiB2b2lkIHtcbiAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPSAxMTtcbiAgfVxuICBoaWdobGlnaHRGaXJzdFllYXIoKTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0O1xuICB9XG4gIGhpZ2hsaWdodExhc3RZZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCArIDIzOyAvLzI0IHllYXJzIHBlciBwYWdlXG4gIH1cbiAgLy9zYW1lIGRheSBuZXh0L3ByZXYgbW9udGgveWVhclxuICBoaWdobGlnaHRTYW1lRGF5TmV4dE1vbnRoKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlTW9udGgrKztcblxuICAgIHRoaXMuX2ZpeERhdGVBZnRlck1vbnRoQ2hhbmdlKCk7XG4gIH1cbiAgaGlnaGxpZ2h0U2FtZURheVByZXZpb3VzTW9udGgoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVNb250aC0tO1xuXG4gICAgdGhpcy5fZml4RGF0ZUFmdGVyTW9udGhDaGFuZ2UoKTtcbiAgfVxuICBwcml2YXRlIF9maXhEYXRlQWZ0ZXJNb250aENoYW5nZSgpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHRoaXMuYWN0aXZlTW9udGggKyAxKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDM6XG4gICAgICBjYXNlIDU6XG4gICAgICBjYXNlIDc6XG4gICAgICBjYXNlIDg6XG4gICAgICBjYXNlIDEwOlxuICAgICAgY2FzZSAxMjpcbiAgICAgICAgLy9kbyBub3RoaW5nXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgY2FzZSA2OlxuICAgICAgY2FzZSA5OlxuICAgICAgY2FzZSAxMTpcbiAgICAgICAgLy9vbmx5IGRvIGlmIGRheSBpcyAzMVxuICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZERheSA9PSAzMSkgdGhpcy5oaWdobGlnaHRlZERheSA9IDMwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjoge1xuICAgICAgICAvL3NraXAgaWYgYmVsb3cgMjkgb3IgbnVsbFxuICAgICAgICBpZiAoIXRoaXMuaGlnaGxpZ2h0ZWREYXkgfHwgdGhpcy5oaWdobGlnaHRlZERheSA8IDI5KSBicmVhaztcblxuICAgICAgICBpZiAoaXNMZWFwWWVhcih0aGlzLmFjdGl2ZVllYXIpKSB0aGlzLmhpZ2hsaWdodGVkRGF5ID0gMjk7XG4gICAgICAgIGVsc2UgdGhpcy5oaWdobGlnaHRlZERheSA9IDI4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBoaWdobGlnaHRTYW1lRGF5TmV4dFllYXIoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVZZWFyKys7XG5cbiAgICB0aGlzLl9maXhEYXRlQWZ0ZXJZZWFyQ2hhbmdlKCk7XG4gIH1cbiAgaGlnaGxpZ2h0U2FtZURheVByZXZpb3VzWWVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVllYXItLTtcblxuICAgIHRoaXMuX2ZpeERhdGVBZnRlclllYXJDaGFuZ2UoKTtcbiAgfVxuICBwcml2YXRlIF9maXhEYXRlQWZ0ZXJZZWFyQ2hhbmdlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkRGF5ICE9IDI5KSByZXR1cm47IC8vc2tpcCBpZiBub3QgMjl0aCBkYXkgaXMgc2VsZWN0ZWRcbiAgICBpZiAoaXNMZWFwWWVhcih0aGlzLmFjdGl2ZVllYXIpKSByZXR1cm47IC8vc2tpcCBpZiBuZWEgeWVhciBpcyBhIGxlYXAgeWVhclxuICAgIGlmICh0aGlzLmFjdGl2ZU1vbnRoICE9IDEpIHJldHVybjsgLy9za2lwIGlmIG5vdCBmZWJydWFyeVxuXG4gICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDI4O1xuICB9XG4gIC8vc2FtZSBtb250aCBuZXh0L3ByZXYgeWVhclxuICBoaWdobGlnaHRTYW1lTW9udGhOZXh0WWVhcihtdWx0aXBsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlWWVhciArPSBtdWx0aXBsZSA/IDEwIDogMTtcbiAgfVxuICBoaWdobGlnaHRTYW1lTW9udGhQcmV2aW91c1llYXIobXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVllYXIgLT0gbXVsdGlwbGUgPyAxMCA6IDE7XG4gIH1cbiAgLy9zYW1lIHllYXIgbmV4dC9wcmV2IHBhZ2UocylcbiAgaGlnaGxpZ2h0U2FtZVllYXJOZXh0UGFnZShtdWx0aXBsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghaXNEZWZpbmVkKHRoaXMuaGlnaGxpZ2h0ZWRZZWFyKSkge1xuICAgICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRZZWFyQWRqdXN0UGFnZSh0aGlzLmhpZ2hsaWdodGVkWWVhciArIChtdWx0aXBsZSA/IDYwIDogMjQpKTtcbiAgfVxuICBoaWdobGlnaHRTYW1lWWVhclByZXZpb3VzUGFnZShtdWx0aXBsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghaXNEZWZpbmVkKHRoaXMuaGlnaGxpZ2h0ZWRZZWFyKSkge1xuICAgICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRZZWFyQWRqdXN0UGFnZSh0aGlzLmhpZ2hsaWdodGVkWWVhciAtIChtdWx0aXBsZSA/IDYwIDogMjQpKTtcbiAgfVxuXG4gIC8vISBzZXR0aW5nc1xuICBwcm90ZWN0ZWQgX2ZpcnN0V2Vla2RheTogbnVtYmVyID0gMTtcbiAgQElucHV0KClcbiAgZ2V0IGZpcnN0V2Vla2RheSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9maXJzdFdlZWtkYXk7XG4gIH1cbiAgc2V0IGZpcnN0V2Vla2RheSh2OiBhbnkpIHtcbiAgICB0aGlzLl9maXJzdFdlZWtkYXkgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCAxKSAlIDc7XG5cbiAgICB0aGlzLl91cGRhdGVDYWxlbmRhckFycmF5KCk7XG4gICAgdGhpcy5fdXBkYXRlV2Vla2RheUFycmF5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX25vaW50ZXJhY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZ2V0IG5vaW50ZXJhY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX25vaW50ZXJhY3QgfHwgdGhpcy5kaXNhYmxlZDtcbiAgfVxuICBzZXQgbm9pbnRlcmFjdCh2OiBhbnkpIHtcbiAgICB0aGlzLl9ub2ludGVyYWN0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9zdGF0aWNIZWlnaHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZ2V0IHN0YXRpY0hlaWdodCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljSGVpZ2h0O1xuICB9XG4gIHNldCBzdGF0aWNIZWlnaHQodjogYW55KSB7XG4gICAgdGhpcy5fc3RhdGljSGVpZ2h0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICB9XG5cbiAgLy8hIGNhbGVuZGFyIGFycmF5XG4gIC8vZGF5cyB2aWV3IGFycmF5XG4gIGNhbGVuZGFyQXJyYXkhOiAobnVtYmVyIHwgbnVsbClbXVtdO1xuXG4gIHJlc2VydmVUb3BSb3chOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBfdXBkYXRlQ2FsZW5kYXJBcnJheSgpOiB2b2lkIHtcbiAgICBjb25zdCByZXN1bHRPYmogPSBnZXRNb250aExheW91dCh0aGlzLl9hY3RpdmVEYXRlLCB0aGlzLmZpcnN0V2Vla2RheSk7XG5cbiAgICB0aGlzLnJlc2VydmVUb3BSb3cgPSByZXN1bHRPYmoubGVhZGluZ1NwYWNlcyA8IDM7XG4gICAgdGhpcy5jYWxlbmRhckFycmF5ID0gcmVzdWx0T2JqLmFycmF5O1xuICB9XG5cbiAgLy9tb250aHMgdmlldyBhcnJheVxuICByZWFkb25seSBtb250aHNBcnJheTogbnVtYmVyW10gPSBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExXTtcblxuICAvL3llYXJzIHZpZXcgYXJyYXlcbiAgcHJpdmF0ZSBfeWVhcnNBcnJheUNhY2hlOiBudW1iZXJbXSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF95ZWFyc0FycmF5Q2FjaGVTdGFydFllYXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBnZXRZZWFyc0FycmF5KCk6IG51bWJlcltdIHtcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcblxuICAgIGlmICh0aGlzLl95ZWFyc0FycmF5Q2FjaGVTdGFydFllYXIgPT0geWVhciAmJiBpc0RlZmluZWQodGhpcy5feWVhcnNBcnJheUNhY2hlKSkgcmV0dXJuIHRoaXMuX3llYXJzQXJyYXlDYWNoZTtcblxuICAgIGNvbnN0IG5ld0FycmF5OiBudW1iZXJbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IHllYXI7IGkgPCB5ZWFyICsgMjQ7IGkrKykge1xuICAgICAgbmV3QXJyYXkucHVzaChpKTtcbiAgICB9XG5cbiAgICB0aGlzLl95ZWFyc0FycmF5Q2FjaGUgPSBuZXdBcnJheTtcbiAgICB0aGlzLl95ZWFyc0FycmF5Q2FjaGVTdGFydFllYXIgPSB5ZWFyO1xuICAgIHJldHVybiBuZXdBcnJheTtcbiAgfVxuXG4gIC8vISB3ZWVrZGF5IGFycmF5XG4gIHdlZWtkYXlBcnJheSE6IG51bWJlcltdO1xuXG4gIHByb3RlY3RlZCBfdXBkYXRlV2Vla2RheUFycmF5KCk6IHZvaWQge1xuICAgIHRoaXMud2Vla2RheUFycmF5ID0gWzAsIDEsIDIsIDMsIDQsIDUsIDZdLm1hcCh2ID0+ICh2ICsgdGhpcy5maXJzdFdlZWtkYXkpICUgNyk7XG4gIH1cblxuICAvLyEgY2hhbmdlIHZpZXcgZnVuY3Rpb25zXG4gIGFjdGl2ZVZpZXc6IENhbGVuZGFyVmlldyA9IENhbGVuZGFyVmlldy5EYXlzO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBzdGFydFZpZXcodjogQ2FsZW5kYXJWaWV3KSB7XG4gICAgdGhpcy5hY3RpdmVWaWV3ID0gdjtcbiAgfVxuXG4gIG9wZW5ZZWFyc1ZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVWaWV3ID0gQ2FsZW5kYXJWaWV3LlllYXJzO1xuXG4gICAgdGhpcy5fdXBkYXRlRGlzcGxheWVkWWVhclJhbmdlU3RhcnQoKTtcblxuICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KHRoaXMuYWN0aXZlVmlldyk7XG4gIH1cbiAgb3Blbk1vbnRoc1ZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVWaWV3ID0gQ2FsZW5kYXJWaWV3Lk1vbnRocztcbiAgICAvL2JyaW5nIGJhY2sgb2xkIHZhbHVlXG4gICAgY29uc3Qgb2xkWWVhciA9IHRoaXMuYWN0aXZlWWVhcjtcbiAgICB0aGlzLmFjdGl2ZVllYXIgPSB0aGlzLmFjdGl2ZVllYXIgPz8gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKTtcblxuICAgIC8vZW1pdCBldmVudHNcbiAgICB0aGlzLnZpZXdDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZVZpZXcpO1xuICAgIGlmIChvbGRZZWFyICE9IHRoaXMuYWN0aXZlWWVhciAmJiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSkgdGhpcy5hY3RpdmVZZWFyQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVZZWFyKTtcbiAgfVxuICBvcGVuRGF5c1ZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVWaWV3ID0gQ2FsZW5kYXJWaWV3LkRheXM7XG4gICAgLy9icmluZyBiYWNrIG9sZCB2YWx1ZXNcbiAgICBjb25zdCBvbGRZZWFyID0gdGhpcy5hY3RpdmVZZWFyO1xuICAgIHRoaXMuYWN0aXZlWWVhciA9IHRoaXMuYWN0aXZlWWVhciA/PyB0aGlzLnRvZGF5RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IG9sZE1vbnRoID0gdGhpcy5hY3RpdmVNb250aDtcbiAgICB0aGlzLmFjdGl2ZU1vbnRoID0gdGhpcy5hY3RpdmVNb250aCA/PyB0aGlzLnRvZGF5RGF0ZS5nZXRNb250aCgpO1xuXG4gICAgLy9lbWl0IGV2ZW50c1xuICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KHRoaXMuYWN0aXZlVmlldyk7XG4gICAgaWYgKG9sZFllYXIgIT0gdGhpcy5hY3RpdmVZZWFyICYmIHRoaXMuYWN0aXZlWWVhciA9PSB0aGlzLnRvZGF5RGF0ZS5nZXRGdWxsWWVhcigpKSB0aGlzLmFjdGl2ZVllYXJDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZVllYXIpO1xuICAgIGlmIChvbGRNb250aCAhPSB0aGlzLmFjdGl2ZU1vbnRoICYmIHRoaXMuYWN0aXZlTW9udGggPT0gdGhpcy50b2RheURhdGUuZ2V0TW9udGgoKSkgdGhpcy5hY3RpdmVNb250aENoYW5nZS5lbWl0KHRoaXMuYWN0aXZlTW9udGgpO1xuICB9XG5cbiAgLy8hIHRlbXBsYXRlIGN1c3RvbWl6YXRpb25cbiAgLy9oZWFkZXJzXG4gIEBDb250ZW50Q2hpbGQoQXJkWWVhcnNWaWV3SGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUpXG4gIHllYXJzVmlld0hlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJZZWFyc1ZpZXdIZWFkZXJDb250ZXh0PjtcbiAgQENvbnRlbnRDaGlsZChBcmRNb250aHNWaWV3SGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUpXG4gIG1vbnRoc1ZpZXdIZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPENhbGVuZGFyTW9udGhzVmlld0hlYWRlckNvbnRleHQ+O1xuICBAQ29udGVudENoaWxkKEFyZERheXNWaWV3SGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUpXG4gIGRheXNWaWV3SGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhckRheXNWaWV3SGVhZGVyQ29udGV4dD47XG4gIC8vd2Vla2RheVxuICBAQ29udGVudENoaWxkKEFyZFdlZWtkYXlUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgd2Vla2RheVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJXZWVrZGF5Q29udGV4dD47XG4gIC8vZmxvYXRpbmcgbW9udGhcbiAgQENvbnRlbnRDaGlsZChBcmRGbG9hdGluZ01vbnRoVGVtcGxhdGVEaXJlY3RpdmUpXG4gIGZsb2F0aW5nTW9udGhUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPENhbGVuZGFyRmxvYXRpbmdNb250aENvbnRleHQ+O1xuICAvL2dyaWQgZWxlbWVudHMgKHllYXIsIG1vbnRoLCBkYXkpXG4gIEBDb250ZW50Q2hpbGQoQXJkWWVhclRlbXBsYXRlRGlyZWN0aXZlKVxuICB5ZWFyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhclllYXJDb250ZXh0PjtcbiAgQENvbnRlbnRDaGlsZChBcmRNb250aFRlbXBsYXRlRGlyZWN0aXZlKVxuICBtb250aFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJNb250aENvbnRleHQ+O1xuICBAQ29udGVudENoaWxkKEFyZERheVRlbXBsYXRlRGlyZWN0aXZlKVxuICBkYXlUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPENhbGVuZGFyRGF5Q29udGV4dD47XG5cbiAgLy8hIGNvbnRleHQgZ2V0dGVyc1xuICAvL2hlYWRlcnNcbiAgZ2V0WWVhcnNWaWV3SGVhZGVyQ29udGV4dCgpOiBDYWxlbmRhclllYXJzVmlld0hlYWRlckNvbnRleHQge1xuICAgIGNvbnN0IHllYXJSYW5nZVN0YXJ0ID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcbiAgICBjb25zdCB5ZWFyUmFuZ2VFbmQgPSB5ZWFyUmFuZ2VTdGFydCArIDIzO1xuICAgIGNvbnN0IGRhdGVSYW5nZTogRGF0ZVJhbmdlID0ge1xuICAgICAgbG93OiBuZXcgRGF0ZSh5ZWFyUmFuZ2VTdGFydCwgMCwgMSksXG4gICAgICBoaWdoOiBuZXcgRGF0ZSh5ZWFyUmFuZ2VFbmQsIDAsIDEpLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHRQYWdlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2hhbmdlWWVhcnNWaWV3UGFnZSgrMSk7XG4gICAgICB9LFxuICAgICAgcHJldlBhZ2U6ICgpID0+IHtcbiAgICAgICAgdGhpcy5jaGFuZ2VZZWFyc1ZpZXdQYWdlKC0xKTtcbiAgICAgIH0sXG4gICAgICBvcGVuRGF5c1ZpZXc6ICgpID0+IHtcbiAgICAgICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcbiAgICAgIH0sXG4gICAgICB5ZWFyUmFuZ2U6IHtcbiAgICAgICAgbG93OiB5ZWFyUmFuZ2VTdGFydCxcbiAgICAgICAgaGlnaDogeWVhclJhbmdlRW5kLFxuICAgICAgfSxcbiAgICAgIGRhdGVSYW5nZSxcbiAgICAgICRpbXBsaWNpdDogZGF0ZVJhbmdlLFxuICAgIH07XG4gIH1cbiAgZ2V0TW9udGhzVmlld0hlYWRlckNvbnRleHQoKTogQ2FsZW5kYXJNb250aHNWaWV3SGVhZGVyQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZW5ZZWFyc1ZpZXc6ICgpID0+IHtcbiAgICAgICAgdGhpcy5vcGVuWWVhcnNWaWV3KCk7XG4gICAgICB9LFxuICAgICAgb3BlbkRheXNWaWV3OiAoKSA9PiB7XG4gICAgICAgIHRoaXMub3BlbkRheXNWaWV3KCk7XG4gICAgICB9LFxuICAgICAgeWVhcjogdGhpcy5hY3RpdmVZZWFyLFxuICAgICAgZGF0ZTogdGhpcy5hY3RpdmVEYXRlLFxuICAgICAgJGltcGxpY2l0OiB0aGlzLmFjdGl2ZVllYXIsXG4gICAgfTtcbiAgfVxuICBnZXREYXlzVmlld0hlYWRlckNvbnRleHQoKTogQ2FsZW5kYXJEYXlzVmlld0hlYWRlckNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0TW9udGg6ICgpID0+IHtcbiAgICAgICAgdGhpcy5jaGFuZ2VNb250aCgrMSk7XG4gICAgICB9LFxuICAgICAgcHJldk1vbnRoOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2hhbmdlTW9udGgoLTEpO1xuICAgICAgfSxcbiAgICAgIG5leHRZZWFyOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2hhbmdlWWVhcigrMSk7XG4gICAgICB9LFxuICAgICAgcHJldlllYXI6ICgpID0+IHtcbiAgICAgICAgdGhpcy5jaGFuZ2VZZWFyKC0xKTtcbiAgICAgIH0sXG4gICAgICBvcGVuWWVhcnNWaWV3OiAoKSA9PiB7XG4gICAgICAgIHRoaXMub3BlblllYXJzVmlldygpO1xuICAgICAgfSxcbiAgICAgIG9wZW5Nb250aHNWaWV3OiAoKSA9PiB7XG4gICAgICAgIHRoaXMub3Blbk1vbnRoc1ZpZXcoKTtcbiAgICAgIH0sXG4gICAgICB5ZWFyOiB0aGlzLmFjdGl2ZVllYXIsXG4gICAgICBtb250aDogdGhpcy5hY3RpdmVNb250aCxcbiAgICAgIGRhdGU6IHRoaXMuYWN0aXZlRGF0ZSxcbiAgICAgICRpbXBsaWNpdDogdGhpcy5hY3RpdmVEYXRlLFxuICAgIH07XG4gIH1cbiAgLy93ZWVrZGF5XG4gIGdldFdlZWtkYXlDb250ZXh0KGRheUluZGV4OiBudW1iZXIpOiBDYWxlbmRhcldlZWtkYXlDb250ZXh0IHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMTk3MCwgMCwgNCArIGRheUluZGV4KTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF5SW5kZXgsXG4gICAgICBkYXRlLFxuICAgICAgJGltcGxpY2l0OiBkYXRlLFxuICAgIH07XG4gIH1cbiAgLy9mbG9hdGluZyBtb250aFxuICBnZXRGbG9hdGluZ01vbnRoQ29udGV4dCgpOiBDYWxlbmRhckZsb2F0aW5nTW9udGhDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9udGg6IHRoaXMuYWN0aXZlTW9udGgsXG4gICAgICBkYXRlOiB0aGlzLmFjdGl2ZURhdGUsXG4gICAgICAkaW1wbGljaXQ6IHRoaXMuYWN0aXZlRGF0ZSxcbiAgICB9O1xuICB9XG4gIC8vZ3JpZCBlbGVtZW50cyAoeWVhciwgbW9udGgsIGRheSlcbiAgZ2V0WWVhckNvbnRleHQoeWVhcjogbnVtYmVyKTogQ2FsZW5kYXJZZWFyQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB5ZWFyLFxuICAgICAgZGF0ZTogbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCAwLCAxKSxcbiAgICAgICRpbXBsaWNpdDogeWVhcixcbiAgICAgIHNlbGVjdDogKHllYXI6IG51bWJlcikgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdFllYXIoeWVhcik7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgZ2V0TW9udGhDb250ZXh0KG1vbnRoOiBudW1iZXIpOiBDYWxlbmRhck1vbnRoQ29udGV4dCB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlWWVhciwgbW9udGgsIDEpO1xuICAgIHJldHVybiB7XG4gICAgICBtb250aCxcbiAgICAgIGRhdGUsXG4gICAgICAkaW1wbGljaXQ6IGRhdGUsXG4gICAgICBzZWxlY3Q6IChtb250aDogbnVtYmVyIHwgRGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdE1vbnRoKG1vbnRoKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBnZXREYXlDb250ZXh0KGRheTogbnVtYmVyKTogQ2FsZW5kYXJEYXlDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGRheSxcbiAgICAgIGRhdGU6IG5ldyBEYXRlKHRoaXMuYWN0aXZlWWVhciwgdGhpcy5hY3RpdmVNb250aCwgZGF5KSxcbiAgICAgICRpbXBsaWNpdDogZGF5LFxuICAgICAgc2VsZWN0OiAoZGF5OiBudW1iZXIgfCBEYXRlKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0RGF5KGRheSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXJcIiBbbmdDbGFzc109XCJuZ0NsYXNzZXNcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJhY3RpdmVWaWV3ID09ICdkYXlzJyA/IGRheXNWaWV3IDogYWN0aXZlVmlldyA9PSAnbW9udGhzJyA/IG1vbnRoc1ZpZXcgOiB5ZWFyc1ZpZXdcIi8+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICN5ZWFyc1ZpZXc+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWhlYWRlci1jb250YWluZXJcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRZZWFyc1ZpZXdIZWFkZXJUZW1wbGF0ZSBsZXQtY3VyclJhbmdlIGxldC1uZXh0UGFnZT1cIm5leHRQYWdlXCIgbGV0LXByZXZQYWdlPVwicHJldlBhZ2VcIiBsZXQtb3BlbkRheXNWaWV3PVwib3BlbkRheXNWaWV3XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItZGF5cy12aWV3LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGFyZC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC1jYWxlbmRhci1oZWFkZXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkRheXNWaWV3KClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGN1cnJSYW5nZS5sb3cgfCBkYXRlOiAnWVlZWScgfX1cclxuICAgICAgICAgICAgICAgICAgICAmbWRhc2g7XHJcbiAgICAgICAgICAgICAgICAgICAge3sgY3VyclJhbmdlLmhpZ2ggfCBkYXRlOiAnWVlZWScgfX1cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWRyb3Bkb3duLWFycm93XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2FyZC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWFycm93c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCIgY29sb3I9XCJub25lXCIgKGNsaWNrKT1cInByZXZQYWdlKClcIiBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uPmNoZXZyb25fbGVmdDwvYXJkLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hcmQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIiBjb2xvcj1cIm5vbmVcIiAoY2xpY2spPVwibmV4dFBhZ2UoKVwiIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YXJkLWljb24+Y2hldnJvbl9yaWdodDwvYXJkLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hcmQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInllYXJzVmlld0hlYWRlclRlbXBsYXRlIHx8IGRlZmF1bHRZZWFyc1ZpZXdIZWFkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRZZWFyc1ZpZXdIZWFkZXJDb250ZXh0KClcIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItbWFpbi1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2ICNmb2N1c2FibGVFbGVtZW50XHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXJkLWNhbGVuZGFyLXNpbXBsZS1ncmlkXCJcclxuICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJjdXJyZW50QXJpYUxhYmVsXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvblllYXJHcmlkRm9jdXMoKVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25ZZWFyR3JpZEJsdXIoKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvblllYXJHcmlkQ2xpY2soKVwiXHJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uTWFpbkdyaWRLZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICByb2xlPVwiZ3JpZFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB5ZWFyIG9mIGdldFllYXJzQXJyYXkoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1lbnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci1lbnRyeS1oaWdobGlnaHRlZF09XCJoaWdobGlnaHRlZFllYXIgPT0geWVhciB8fCBhY3RpdmVZZWFyID09IHllYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktc2VsZWN0ZWRdPVwiaXNZZWFyU2VsZWN0ZWQoeWVhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItdG9kYXldPVwiaXNZZWFyVG9kYXkoeWVhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNhbGVuZGFyWWVhckNsaWNrKHllYXIpXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJvbkNhbGVuZGFyWWVhck1vdXNlb3Zlcih5ZWFyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYXJkLWNhbGVuZGFyLWVudHJ5LWJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1mb2N1cy1vdmVybGF5XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtYnV0dG9uLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFllYXJUZW1wbGF0ZSBsZXQteWVhcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB5ZWFyIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwieWVhclRlbXBsYXRlIHx8IGRlZmF1bHRZZWFyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRZZWFyQ29udGV4dCh5ZWFyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbW9udGhzVmlldz5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItaGVhZGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE1vbnRoc1ZpZXdIZWFkZXJUZW1wbGF0ZSBsZXQteWVhciBsZXQtbmV4dFBhZ2U9XCJuZXh0UGFnZVwiIGxldC1wcmV2UGFnZT1cInByZXZQYWdlXCIgbGV0LW9wZW5EYXlzVmlldz1cIm9wZW5EYXlzVmlld1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWRheXMtdmlldy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxhcmQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtY2FsZW5kYXItaGVhZGVyLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5EYXlzVmlldygpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7eyB5ZWFyIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1kcm9wZG93bi1hcnJvd1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9hcmQtYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9udGhzVmlld0hlYWRlclRlbXBsYXRlIHx8IGRlZmF1bHRNb250aHNWaWV3SGVhZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0TW9udGhzVmlld0hlYWRlckNvbnRleHQoKVwiXHJcbiAgICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1tYWluLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgI2ZvY3VzYWJsZUVsZW1lbnRcclxuICAgICAgICAgICAgY2xhc3M9XCJhcmQtY2FsZW5kYXItc2ltcGxlLWdyaWRcIlxyXG4gICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICBbYXJpYUxhYmVsXT1cImN1cnJlbnRBcmlhTGFiZWxcIlxyXG4gICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uTW9udGhHcmlkRm9jdXMoKVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25Nb250aEdyaWRCbHVyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25Nb250aEdyaWRDbGljaygpXCJcclxuICAgICAgICAgICAgKGtleWRvd24pPVwib25NYWluR3JpZEtleWRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIHJvbGU9XCJncmlkXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoc0FycmF5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWVudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLWVudHJ5LWhpZ2hsaWdodGVkXT1cImhpZ2hsaWdodGVkTW9udGggPT0gbW9udGggfHwgYWN0aXZlTW9udGggPT0gbW9udGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktc2VsZWN0ZWRdPVwiaXNNb250aFNlbGVjdGVkKG1vbnRoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci10b2RheV09XCJpc01vbnRoVG9kYXkobW9udGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DYWxlbmRhck1vbnRoQ2xpY2sobW9udGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJvbkNhbGVuZGFyTW9udGhNb3VzZW92ZXIobW9udGgpXCJcclxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhcmQtY2FsZW5kYXItZW50cnktYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWZvY3VzLW92ZXJsYXlcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1idXR0b24tY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TW9udGhUZW1wbGF0ZSBsZXQtbW9udGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbW9udGggfCBkYXRlOiBcIk1NTVwiIHwgdXBwZXJjYXNlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9udGhUZW1wbGF0ZSB8fCBkZWZhdWx0TW9udGhUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldE1vbnRoQ29udGV4dChtb250aClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RheXNWaWV3PlxyXG4gICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1oZWFkZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZSBsZXQtY3VyckRhdGUgbGV0LW5leHRNb250aD1cIm5leHRNb250aFwiIGxldC1wcmV2TW9udGg9XCJwcmV2TW9udGhcIiBsZXQtb3BlblllYXJzVmlldz1cIm9wZW5ZZWFyc1ZpZXdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1kYXlzLXZpZXctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YXJkLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLWNhbGVuZGFyLWhlYWRlci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJ0cmFuc3BhcmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuWWVhcnNWaWV3KClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGN1cnJEYXRlIHwgZGF0ZTogJ01NTSBZWVlZJyB8IHVwcGVyY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtZHJvcGRvd24tYXJyb3dcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYXJkLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItYXJyb3dzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIiBjb2xvcj1cIm5vbmVcIiAoY2xpY2spPVwicHJldk1vbnRoKClcIiBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uPmNoZXZyb25fbGVmdDwvYXJkLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hcmQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uLWJ1dHRvbiBzaXplPVwic21hbGxcIiBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIiBjb2xvcj1cIm5vbmVcIiAoY2xpY2spPVwibmV4dE1vbnRoKClcIiBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uPmNoZXZyb25fcmlnaHQ8L2FyZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXJkLWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJkYXlzVmlld0hlYWRlclRlbXBsYXRlIHx8IGRlZmF1bHREYXlzVmlld0hlYWRlclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldERheXNWaWV3SGVhZGVyQ29udGV4dCgpXCJcclxuICAgICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLW1haW4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1kYXktbGFiZWxzIGFyZC1jYWxlbmRhci1ncmlkXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFdlZWtkYXlUZW1wbGF0ZSBsZXQtZGF0ZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItd2Vla2RheVwiPnt7IGRhdGUgfCBkYXRlOiAnRUVFRUUnIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdlZWtkYXlJbmRleCBvZiB3ZWVrZGF5QXJyYXlcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIndlZWtkYXlUZW1wbGF0ZSB8fCBkZWZhdWx0V2Vla2RheVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0V2Vla2RheUNvbnRleHQod2Vla2RheUluZGV4KVwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAjZm9jdXNhYmxlRWxlbWVudFxyXG4gICAgICAgICAgICBjbGFzcz1cImFyZC1jYWxlbmRhci1tYWluLWdyaWQgYXJkLWNhbGVuZGFyLWdyaWRcIlxyXG4gICAgICAgICAgICBbY2xhc3MuYXJkLXJlc2VydmUtdG9wLXJvd109XCJyZXNlcnZlVG9wUm93XCJcclxuICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJjdXJyZW50QXJpYUxhYmVsXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbkRheUdyaWRGb2N1cygpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAoYmx1cik9XCJvbkRheUdyaWRCbHVyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25EYXlHcmlkQ2xpY2soKVwiXHJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uTWFpbkdyaWRLZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICByb2xlPVwiZ3JpZFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWZsb2F0aW5nLW1vbnRoXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRGbG9hdGluZ01vbnRoVGVtcGxhdGUgbGV0LWRhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZGF0ZSB8IGRhdGU6ICdMTEwnIHwgdXBwZXJjYXNlIH19XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZsb2F0aW5nTW9udGhUZW1wbGF0ZSB8fCBkZWZhdWx0RmxvYXRpbmdNb250aFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0RmxvYXRpbmdNb250aENvbnRleHQoKVwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdlZWsgb2YgY2FsZW5kYXJBcnJheVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWVudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci1lbnRyeS1lbXB0eV09XCJkYXkgPT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktaGlnaGxpZ2h0ZWRdPVwiaGlnaGxpZ2h0ZWREYXkgPT0gZGF5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci1lbnRyeS1zZWxlY3RlZF09XCJpc0RheVNlbGVjdGVkKGRheSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLXRvZGF5XT1cImlzRGF5VG9kYXkoZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNhbGVuZGFyRGF5Q2xpY2soZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJvbkNhbGVuZGFyRGF5TW91c2VvdmVyKGRheSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFyZC1jYWxlbmRhci1lbnRyeS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXkgIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1mb2N1cy1vdmVybGF5XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWJ1dHRvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RGF5VGVtcGxhdGUgbGV0LWRheT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF5VGVtcGxhdGUgfHwgZGVmYXVsdERheVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldERheUNvbnRleHQoZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG48IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmdTcGlubmVyVGVtcGxhdGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsb2FkaW5nU3Bpbm5lclRlbXBsYXRlIHx8IGRlZmF1bHRMb2FkaW5nU3Bpbm5lclRlbXBsYXRlXCI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L25nLWNvbnRhaW5lcj4gLS0+Il19