@ardium-ui/ui 4.4.1 → 5.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/fesm2022/ardium-ui-ui.mjs +2525 -2413
  2. package/fesm2022/ardium-ui-ui.mjs.map +1 -1
  3. package/lib/_internal/boolean-component.d.ts +1 -1
  4. package/lib/_internal/disablable-component.d.ts +1 -1
  5. package/lib/_internal/focusable-component.d.ts +1 -1
  6. package/lib/_internal/form-field-component.d.ts +1 -1
  7. package/lib/_internal/ngmodel-component.d.ts +2 -2
  8. package/lib/_internal/selectable-list-component.d.ts +1 -1
  9. package/lib/_internal/utils/date.utils.d.ts +3 -0
  10. package/lib/buttons/_button-base.d.ts +1 -1
  11. package/lib/calendar/calendar.component.d.ts +8 -2
  12. package/lib/file-inputs/file-input-base.d.ts +7 -3
  13. package/lib/form-field/form-field-base.d.ts +1 -1
  14. package/lib/inputs/_simple-input-base.d.ts +3 -3
  15. package/lib/inputs/autocomplete-input/autocomplete-input.component.d.ts +66 -0
  16. package/lib/inputs/autocomplete-input/autocomplete-input.defaults.d.ts +15 -0
  17. package/lib/inputs/autocomplete-input/autocomplete-input.directives.d.ts +33 -0
  18. package/lib/inputs/autocomplete-input/autocomplete-input.module.d.ts +13 -0
  19. package/lib/inputs/autocomplete-input/index.d.ts +3 -0
  20. package/lib/inputs/date-input/date-input.component.d.ts +5 -2
  21. package/lib/inputs/input/index.d.ts +2 -1
  22. package/lib/inputs/input/input.component.d.ts +3 -56
  23. package/lib/inputs/input/input.defaults.d.ts +1 -10
  24. package/lib/inputs/input/input.directives.d.ts +0 -13
  25. package/lib/inputs/input/input.module.d.ts +3 -5
  26. package/lib/inputs/input-utils.d.ts +8 -8
  27. package/lib/inputs/number-input/number-input.component.d.ts +1 -0
  28. package/lib/option/option.component.d.ts +1 -1
  29. package/lib/slider/abstract-slider.d.ts +1 -1
  30. package/package.json +1 -3
  31. package/prebuilt-themes/default/inputs/{simple-input.css → autocomplete-input.css} +40 -15
  32. package/prebuilt-themes/default/inputs/autocomplete-input.css.map +1 -0
  33. package/prebuilt-themes/default/inputs/file-input.css +9 -4
  34. package/prebuilt-themes/default/inputs/file-input.css.map +1 -1
  35. package/prebuilt-themes/default/inputs/input.css +0 -25
  36. package/prebuilt-themes/default/inputs/input.css.map +1 -1
  37. package/public-api.d.ts +1 -1
  38. package/themes/default/inputs/autocomplete-input.scss +46 -0
  39. package/themes/default/inputs/file-input.scss +10 -2
  40. package/themes/default/inputs/input.scss +0 -34
  41. package/esm2022/ardium-ui-ui.mjs +0 -5
  42. package/esm2022/lib/_internal/boolean-component.mjs +0 -95
  43. package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +0 -15
  44. package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +0 -18
  45. package/esm2022/lib/_internal/disablable-component.mjs +0 -51
  46. package/esm2022/lib/_internal/focusable-component.mjs +0 -85
  47. package/esm2022/lib/_internal/form-field-component.mjs +0 -33
  48. package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +0 -453
  49. package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +0 -370
  50. package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +0 -157
  51. package/esm2022/lib/_internal/models/pagination.model.mjs +0 -90
  52. package/esm2022/lib/_internal/models/queue.mjs +0 -59
  53. package/esm2022/lib/_internal/ngmodel-component.mjs +0 -99
  54. package/esm2022/lib/_internal/public-api.mjs +0 -2
  55. package/esm2022/lib/_internal/selectable-list-component.mjs +0 -271
  56. package/esm2022/lib/badge/badge.defaults.mjs +0 -20
  57. package/esm2022/lib/badge/badge.directive.mjs +0 -97
  58. package/esm2022/lib/badge/badge.module.mjs +0 -18
  59. package/esm2022/lib/badge/badge.types.mjs +0 -16
  60. package/esm2022/lib/badge/index.mjs +0 -5
  61. package/esm2022/lib/buttons/_button-base.defaults.mjs +0 -17
  62. package/esm2022/lib/buttons/_button-base.mjs +0 -26
  63. package/esm2022/lib/buttons/button/button.component.mjs +0 -38
  64. package/esm2022/lib/buttons/button/button.defaults.mjs +0 -17
  65. package/esm2022/lib/buttons/button/button.module.mjs +0 -18
  66. package/esm2022/lib/buttons/button/index.mjs +0 -4
  67. package/esm2022/lib/buttons/fab/fab.component.mjs +0 -33
  68. package/esm2022/lib/buttons/fab/fab.defaults.mjs +0 -17
  69. package/esm2022/lib/buttons/fab/fab.module.mjs +0 -18
  70. package/esm2022/lib/buttons/fab/index.mjs +0 -4
  71. package/esm2022/lib/buttons/general-button.types.mjs +0 -55
  72. package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +0 -39
  73. package/esm2022/lib/buttons/icon-button/icon-button.defaults.mjs +0 -9
  74. package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +0 -18
  75. package/esm2022/lib/buttons/icon-button/index.mjs +0 -4
  76. package/esm2022/lib/calendar/calendar.component.mjs +0 -466
  77. package/esm2022/lib/calendar/calendar.defaults.mjs +0 -26
  78. package/esm2022/lib/calendar/calendar.directives.mjs +0 -107
  79. package/esm2022/lib/calendar/calendar.internal-directives.mjs +0 -22
  80. package/esm2022/lib/calendar/calendar.internal-types.mjs +0 -2
  81. package/esm2022/lib/calendar/calendar.module.mjs +0 -71
  82. package/esm2022/lib/calendar/calendar.types.mjs +0 -6
  83. package/esm2022/lib/calendar/index.mjs +0 -6
  84. package/esm2022/lib/calendar/views/days-view/days-view.component.mjs +0 -282
  85. package/esm2022/lib/calendar/views/days-view/days-view.helpers.mjs +0 -65
  86. package/esm2022/lib/calendar/views/months-view/months-view.component.mjs +0 -245
  87. package/esm2022/lib/calendar/views/months-view/months-view.helpers.mjs +0 -22
  88. package/esm2022/lib/calendar/views/years-view/years-view.component.mjs +0 -244
  89. package/esm2022/lib/calendar/views/years-view/years-view.helpers.mjs +0 -14
  90. package/esm2022/lib/card/card.children.mjs +0 -96
  91. package/esm2022/lib/card/card.component.mjs +0 -38
  92. package/esm2022/lib/card/card.defaults.mjs +0 -17
  93. package/esm2022/lib/card/card.module.mjs +0 -59
  94. package/esm2022/lib/card/card.types.mjs +0 -9
  95. package/esm2022/lib/card/index.mjs +0 -6
  96. package/esm2022/lib/checkbox/checkbox.component.mjs +0 -68
  97. package/esm2022/lib/checkbox/checkbox.defaults.mjs +0 -17
  98. package/esm2022/lib/checkbox/checkbox.directives.mjs +0 -14
  99. package/esm2022/lib/checkbox/checkbox.internal-directives.mjs +0 -15
  100. package/esm2022/lib/checkbox/checkbox.module.mjs +0 -20
  101. package/esm2022/lib/checkbox/checkbox.types.mjs +0 -6
  102. package/esm2022/lib/checkbox/index.mjs +0 -6
  103. package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +0 -116
  104. package/esm2022/lib/checkbox-list/checkbox-list.defaults.mjs +0 -25
  105. package/esm2022/lib/checkbox-list/checkbox-list.directives.mjs +0 -14
  106. package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +0 -21
  107. package/esm2022/lib/checkbox-list/checkbox-list.types.mjs +0 -7
  108. package/esm2022/lib/checkbox-list/index.mjs +0 -6
  109. package/esm2022/lib/chip/chip.component.mjs +0 -36
  110. package/esm2022/lib/chip/chip.defaults.mjs +0 -20
  111. package/esm2022/lib/chip/chip.module.mjs +0 -21
  112. package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +0 -53
  113. package/esm2022/lib/chip/deletable-chip/deletable-chip.defaults.mjs +0 -17
  114. package/esm2022/lib/chip/index.mjs +0 -8
  115. package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +0 -53
  116. package/esm2022/lib/chip/selectable-chip/selectable-chip.defaults.mjs +0 -18
  117. package/esm2022/lib/dialog/dialog.component.mjs +0 -109
  118. package/esm2022/lib/dialog/dialog.defaults.mjs +0 -26
  119. package/esm2022/lib/dialog/dialog.directives.mjs +0 -25
  120. package/esm2022/lib/dialog/dialog.module.mjs +0 -21
  121. package/esm2022/lib/dialog/dialog.types.mjs +0 -10
  122. package/esm2022/lib/dialog/index.mjs +0 -6
  123. package/esm2022/lib/divider/divider.component.mjs +0 -19
  124. package/esm2022/lib/divider/divider.defaults.mjs +0 -13
  125. package/esm2022/lib/divider/divider.module.mjs +0 -18
  126. package/esm2022/lib/divider/index.mjs +0 -4
  127. package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +0 -112
  128. package/esm2022/lib/dropdown-panel/dropdown-panel.defaults.mjs +0 -17
  129. package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +0 -18
  130. package/esm2022/lib/dropdown-panel/dropdown-panel.types.mjs +0 -10
  131. package/esm2022/lib/dropdown-panel/index.mjs +0 -5
  132. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +0 -70
  133. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.defaults.mjs +0 -18
  134. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +0 -42
  135. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +0 -52
  136. package/esm2022/lib/file-inputs/file-drop-area/index.mjs +0 -5
  137. package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +0 -120
  138. package/esm2022/lib/file-inputs/file-input/file-input.defaults.mjs +0 -23
  139. package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +0 -86
  140. package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +0 -55
  141. package/esm2022/lib/file-inputs/file-input/index.mjs +0 -5
  142. package/esm2022/lib/file-inputs/file-input-base.defaults.mjs +0 -8
  143. package/esm2022/lib/file-inputs/file-input-base.mjs +0 -333
  144. package/esm2022/lib/file-inputs/file-input-types.mjs +0 -8
  145. package/esm2022/lib/form-field/error/error.component.mjs +0 -17
  146. package/esm2022/lib/form-field/error/error.directive.mjs +0 -17
  147. package/esm2022/lib/form-field/form-field-base.mjs +0 -53
  148. package/esm2022/lib/form-field/form-field-child.token.mjs +0 -3
  149. package/esm2022/lib/form-field/form-field-native-inputs.mjs +0 -80
  150. package/esm2022/lib/form-field/form-field.component.mjs +0 -12
  151. package/esm2022/lib/form-field/form-field.defaults.mjs +0 -17
  152. package/esm2022/lib/form-field/form-field.module.mjs +0 -49
  153. package/esm2022/lib/form-field/hint/hint.component.mjs +0 -17
  154. package/esm2022/lib/form-field/hint/hint.directive.mjs +0 -30
  155. package/esm2022/lib/form-field/horizontal-form-field.component.mjs +0 -12
  156. package/esm2022/lib/form-field/index.mjs +0 -10
  157. package/esm2022/lib/form-field/label/label.component.mjs +0 -27
  158. package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +0 -58
  159. package/esm2022/lib/form-field-frame/form-field-frame.defaults.mjs +0 -18
  160. package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +0 -25
  161. package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +0 -19
  162. package/esm2022/lib/form-field-frame/index.mjs +0 -5
  163. package/esm2022/lib/icon/icon.component.mjs +0 -52
  164. package/esm2022/lib/icon/icon.defaults.mjs +0 -17
  165. package/esm2022/lib/icon/icon.module.mjs +0 -19
  166. package/esm2022/lib/icon/icon.pipe.mjs +0 -18
  167. package/esm2022/lib/icon/index.mjs +0 -5
  168. package/esm2022/lib/inputs/_simple-input-base.mjs +0 -153
  169. package/esm2022/lib/inputs/date-input/date-input.component.mjs +0 -375
  170. package/esm2022/lib/inputs/date-input/date-input.defaults.mjs +0 -38
  171. package/esm2022/lib/inputs/date-input/date-input.directive.mjs +0 -163
  172. package/esm2022/lib/inputs/date-input/date-input.module.mjs +0 -108
  173. package/esm2022/lib/inputs/date-input/date-input.serializers.mjs +0 -49
  174. package/esm2022/lib/inputs/date-input/date-input.types.mjs +0 -5
  175. package/esm2022/lib/inputs/date-input/index.mjs +0 -6
  176. package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +0 -265
  177. package/esm2022/lib/inputs/digit-input/digit-input.defaults.mjs +0 -24
  178. package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +0 -267
  179. package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +0 -19
  180. package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +0 -15
  181. package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +0 -8
  182. package/esm2022/lib/inputs/digit-input/index.mjs +0 -5
  183. package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +0 -180
  184. package/esm2022/lib/inputs/hex-input/hex-input.defaults.mjs +0 -26
  185. package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +0 -36
  186. package/esm2022/lib/inputs/hex-input/hex-input.model.mjs +0 -97
  187. package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +0 -37
  188. package/esm2022/lib/inputs/hex-input/index.mjs +0 -5
  189. package/esm2022/lib/inputs/input/index.mjs +0 -4
  190. package/esm2022/lib/inputs/input/input.component.mjs +0 -278
  191. package/esm2022/lib/inputs/input/input.defaults.mjs +0 -21
  192. package/esm2022/lib/inputs/input/input.directives.mjs +0 -58
  193. package/esm2022/lib/inputs/input/input.module.mjs +0 -61
  194. package/esm2022/lib/inputs/input-transformers.mjs +0 -66
  195. package/esm2022/lib/inputs/input-types.mjs +0 -6
  196. package/esm2022/lib/inputs/input-utils.mjs +0 -186
  197. package/esm2022/lib/inputs/number-input/index.mjs +0 -5
  198. package/esm2022/lib/inputs/number-input/number-input.component.mjs +0 -245
  199. package/esm2022/lib/inputs/number-input/number-input.defaults.mjs +0 -27
  200. package/esm2022/lib/inputs/number-input/number-input.directives.mjs +0 -14
  201. package/esm2022/lib/inputs/number-input/number-input.module.mjs +0 -21
  202. package/esm2022/lib/inputs/password-input/index.mjs +0 -6
  203. package/esm2022/lib/inputs/password-input/password-input.component.mjs +0 -167
  204. package/esm2022/lib/inputs/password-input/password-input.defaults.mjs +0 -24
  205. package/esm2022/lib/inputs/password-input/password-input.directives.mjs +0 -49
  206. package/esm2022/lib/inputs/password-input/password-input.module.mjs +0 -41
  207. package/esm2022/lib/inputs/password-input/password-input.types.mjs +0 -2
  208. package/esm2022/lib/inputs/simple-input/index.mjs +0 -5
  209. package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +0 -50
  210. package/esm2022/lib/inputs/simple-input/simple-input.defaults.mjs +0 -25
  211. package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +0 -36
  212. package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +0 -37
  213. package/esm2022/lib/kbd/index.mjs +0 -6
  214. package/esm2022/lib/kbd/kbd.component.mjs +0 -30
  215. package/esm2022/lib/kbd/kbd.defaults.mjs +0 -15
  216. package/esm2022/lib/kbd/kbd.directive.mjs +0 -33
  217. package/esm2022/lib/kbd/kbd.module.mjs +0 -20
  218. package/esm2022/lib/kbd/kbd.pipe.mjs +0 -21
  219. package/esm2022/lib/kbd-shortcut/index.mjs +0 -4
  220. package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +0 -36
  221. package/esm2022/lib/kbd-shortcut/kbd-shortcut.defaults.mjs +0 -8
  222. package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +0 -19
  223. package/esm2022/lib/modal/index.mjs +0 -5
  224. package/esm2022/lib/modal/modal.component.mjs +0 -95
  225. package/esm2022/lib/modal/modal.defaults.mjs +0 -20
  226. package/esm2022/lib/modal/modal.directives.mjs +0 -14
  227. package/esm2022/lib/modal/modal.module.mjs +0 -22
  228. package/esm2022/lib/option/index.mjs +0 -3
  229. package/esm2022/lib/option/option.component.mjs +0 -55
  230. package/esm2022/lib/option/option.module.mjs +0 -18
  231. package/esm2022/lib/progress-bar/index.mjs +0 -6
  232. package/esm2022/lib/progress-bar/progress-bar.component.mjs +0 -58
  233. package/esm2022/lib/progress-bar/progress-bar.defaults.mjs +0 -21
  234. package/esm2022/lib/progress-bar/progress-bar.directive.mjs +0 -14
  235. package/esm2022/lib/progress-bar/progress-bar.module.mjs +0 -19
  236. package/esm2022/lib/progress-bar/progress-bar.types.mjs +0 -19
  237. package/esm2022/lib/progress-circle/index.mjs +0 -6
  238. package/esm2022/lib/progress-circle/progress-circle.component.mjs +0 -45
  239. package/esm2022/lib/progress-circle/progress-circle.defaults.mjs +0 -21
  240. package/esm2022/lib/progress-circle/progress-circle.directive.mjs +0 -14
  241. package/esm2022/lib/progress-circle/progress-circle.module.mjs +0 -19
  242. package/esm2022/lib/progress-circle/progress-circle.types.mjs +0 -10
  243. package/esm2022/lib/radio/index.mjs +0 -5
  244. package/esm2022/lib/radio/radio/radio.component.mjs +0 -119
  245. package/esm2022/lib/radio/radio/radio.defaults.mjs +0 -16
  246. package/esm2022/lib/radio/radio-group.component.mjs +0 -203
  247. package/esm2022/lib/radio/radio.module.mjs +0 -19
  248. package/esm2022/lib/search-functions.mjs +0 -64
  249. package/esm2022/lib/segment/index.mjs +0 -6
  250. package/esm2022/lib/segment/segment.component.mjs +0 -125
  251. package/esm2022/lib/segment/segment.defaults.mjs +0 -26
  252. package/esm2022/lib/segment/segment.directives.mjs +0 -14
  253. package/esm2022/lib/segment/segment.module.mjs +0 -19
  254. package/esm2022/lib/segment/segment.types.mjs +0 -13
  255. package/esm2022/lib/select/index.mjs +0 -6
  256. package/esm2022/lib/select/select.component.mjs +0 -836
  257. package/esm2022/lib/select/select.defaults.mjs +0 -53
  258. package/esm2022/lib/select/select.directive.mjs +0 -171
  259. package/esm2022/lib/select/select.module.mjs +0 -112
  260. package/esm2022/lib/select/select.types.mjs +0 -2
  261. package/esm2022/lib/slide-toggle/index.mjs +0 -5
  262. package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +0 -43
  263. package/esm2022/lib/slide-toggle/slide-toggle.defaults.mjs +0 -21
  264. package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +0 -18
  265. package/esm2022/lib/slide-toggle/slide-toggle.types.mjs +0 -5
  266. package/esm2022/lib/slider/abstract-slider.mjs +0 -251
  267. package/esm2022/lib/slider/index.mjs +0 -8
  268. package/esm2022/lib/slider/range-slider/range-slider.component.mjs +0 -151
  269. package/esm2022/lib/slider/range-slider/range-slider.module.mjs +0 -18
  270. package/esm2022/lib/slider/slider.component.mjs +0 -100
  271. package/esm2022/lib/slider/slider.defaults.mjs +0 -14
  272. package/esm2022/lib/slider/slider.directive.mjs +0 -16
  273. package/esm2022/lib/slider/slider.module.mjs +0 -20
  274. package/esm2022/lib/slider/slider.types.mjs +0 -10
  275. package/esm2022/lib/snackbar/index.mjs +0 -5
  276. package/esm2022/lib/snackbar/snackbar-ref.mjs +0 -51
  277. package/esm2022/lib/snackbar/snackbar.component.mjs +0 -48
  278. package/esm2022/lib/snackbar/snackbar.service.mjs +0 -224
  279. package/esm2022/lib/snackbar/snackbar.token.mjs +0 -26
  280. package/esm2022/lib/snackbar/snackbar.types.mjs +0 -25
  281. package/esm2022/lib/spinner/index.mjs +0 -4
  282. package/esm2022/lib/spinner/spinner.component.mjs +0 -19
  283. package/esm2022/lib/spinner/spinner.defaults.mjs +0 -14
  284. package/esm2022/lib/spinner/spinner.module.mjs +0 -18
  285. package/esm2022/lib/star/index.mjs +0 -6
  286. package/esm2022/lib/star/rating-display/index.mjs +0 -6
  287. package/esm2022/lib/star/rating-display/rating-display.component.mjs +0 -71
  288. package/esm2022/lib/star/rating-display/rating-display.defaults.mjs +0 -16
  289. package/esm2022/lib/star/rating-display/rating-display.directives.mjs +0 -16
  290. package/esm2022/lib/star/rating-display/rating-display.module.mjs +0 -20
  291. package/esm2022/lib/star/rating-display/rating-display.types.mjs +0 -2
  292. package/esm2022/lib/star/rating-input/index.mjs +0 -6
  293. package/esm2022/lib/star/rating-input/rating-input.component.mjs +0 -191
  294. package/esm2022/lib/star/rating-input/rating-input.defaults.mjs +0 -17
  295. package/esm2022/lib/star/rating-input/rating-input.directives.mjs +0 -16
  296. package/esm2022/lib/star/rating-input/rating-input.module.mjs +0 -20
  297. package/esm2022/lib/star/rating-input/rating-input.types.mjs +0 -2
  298. package/esm2022/lib/star/star-button/index.mjs +0 -6
  299. package/esm2022/lib/star/star-button/star-button.component.mjs +0 -55
  300. package/esm2022/lib/star/star-button/star-button.defaults.mjs +0 -18
  301. package/esm2022/lib/star/star-button/star-button.directives.mjs +0 -16
  302. package/esm2022/lib/star/star-button/star-button.module.mjs +0 -20
  303. package/esm2022/lib/star/star-button/star-button.types.mjs +0 -2
  304. package/esm2022/lib/star/star.component.mjs +0 -36
  305. package/esm2022/lib/star/star.defaults.mjs +0 -15
  306. package/esm2022/lib/star/star.directives.mjs +0 -16
  307. package/esm2022/lib/star/star.module.mjs +0 -20
  308. package/esm2022/lib/star/star.types.mjs +0 -23
  309. package/esm2022/lib/statebox/index.mjs +0 -4
  310. package/esm2022/lib/statebox/statebox.component.mjs +0 -114
  311. package/esm2022/lib/statebox/statebox.defaults.mjs +0 -20
  312. package/esm2022/lib/statebox/statebox.module.mjs +0 -18
  313. package/esm2022/lib/statebox/statebox.types.mjs +0 -2
  314. package/esm2022/lib/tabber/index.mjs +0 -6
  315. package/esm2022/lib/tabber/tab/tab.component.mjs +0 -44
  316. package/esm2022/lib/tabber/tab/tab.defaults.mjs +0 -13
  317. package/esm2022/lib/tabber/tabber.component.mjs +0 -90
  318. package/esm2022/lib/tabber/tabber.defaults.mjs +0 -19
  319. package/esm2022/lib/tabber/tabber.module.mjs +0 -19
  320. package/esm2022/lib/table/index.mjs +0 -6
  321. package/esm2022/lib/table/table-item-storage.mjs +0 -564
  322. package/esm2022/lib/table/table.component.mjs +0 -367
  323. package/esm2022/lib/table/table.defaults.mjs +0 -53
  324. package/esm2022/lib/table/table.directives.mjs +0 -62
  325. package/esm2022/lib/table/table.module.mjs +0 -47
  326. package/esm2022/lib/table/table.types.mjs +0 -30
  327. package/esm2022/lib/table/utils.mjs +0 -18
  328. package/esm2022/lib/table-from-csv/index.mjs +0 -4
  329. package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +0 -120
  330. package/esm2022/lib/table-from-csv/table-from-csv.defaults.mjs +0 -15
  331. package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +0 -19
  332. package/esm2022/lib/table-pagination/index.mjs +0 -5
  333. package/esm2022/lib/table-pagination/table-pagination.component.mjs +0 -108
  334. package/esm2022/lib/table-pagination/table-pagination.defaults.mjs +0 -25
  335. package/esm2022/lib/table-pagination/table-pagination.module.mjs +0 -21
  336. package/esm2022/lib/table-pagination/table-pagination.types.mjs +0 -7
  337. package/esm2022/lib/text-list/index.mjs +0 -4
  338. package/esm2022/lib/text-list/text-list.component.mjs +0 -18
  339. package/esm2022/lib/text-list/text-list.module.mjs +0 -19
  340. package/esm2022/lib/text-list/text-list.pipe.mjs +0 -16
  341. package/esm2022/lib/types/alignment.types.mjs +0 -10
  342. package/esm2022/lib/types/button.types.mjs +0 -6
  343. package/esm2022/lib/types/colors.types.mjs +0 -43
  344. package/esm2022/lib/types/item-storage.types.mjs +0 -6
  345. package/esm2022/lib/types/theming.types.mjs +0 -48
  346. package/esm2022/lib/types/utility.types.mjs +0 -5
  347. package/esm2022/public-api.mjs +0 -74
  348. package/lib/inputs/simple-input/index.d.ts +0 -4
  349. package/lib/inputs/simple-input/simple-input.component.d.ts +0 -13
  350. package/lib/inputs/simple-input/simple-input.defaults.d.ts +0 -6
  351. package/lib/inputs/simple-input/simple-input.directives.d.ts +0 -20
  352. package/lib/inputs/simple-input/simple-input.module.d.ts +0 -11
  353. package/prebuilt-themes/default/inputs/simple-input.css.map +0 -1
  354. package/themes/default/inputs/simple-input.scss +0 -12
@@ -1,453 +0,0 @@
1
- import { computed, signal } from '@angular/core';
2
- import { resolvePath } from 'resolve-object-path';
3
- import { any, evaluate, isArray, isDefined, isObject, isPrimitive, isPromise } from 'simple-bool';
4
- export class ItemStorage {
5
- constructor(_ardParentComp) {
6
- this._ardParentComp = _ardParentComp;
7
- this._groups = signal(this._createEmptyGroupMap());
8
- this._items = signal([]);
9
- this._filteredItems = signal([]);
10
- this._highlightedItems = signal([]);
11
- this._highlightedGroups = signal([]);
12
- this._recentlyHighlightedItem = signal(undefined);
13
- this._selectedItems = signal([]);
14
- this.groups = computed(() => Array.from(this._groups().entries())
15
- .map(([, group]) => group)
16
- .filter(group => group.children().length));
17
- this.items = this._items.asReadonly();
18
- this.filteredItems = this._filteredItems.asReadonly();
19
- this.highlightedItems = this._highlightedItems.asReadonly();
20
- this.selectedItems = computed(() => {
21
- if (this._ardParentComp.sortMultipleValues()) {
22
- return this._selectedItems().sort((a, b) => {
23
- return a.index - b.index;
24
- });
25
- }
26
- return this._selectedItems();
27
- });
28
- this.lastSelectedItem = computed(() => this._filteredItems().last(1, item => !item.disabled()));
29
- this.value = computed(() => this._itemsToValue(this.selectedItems()));
30
- this.isNoItemsToSelect = computed(() => this._items().length === this._selectedItems().length);
31
- this.isNoItemsFound = computed(() => this._filteredItems().length === 0);
32
- this.isAnyItemSelected = computed(() => this._selectedItems().length > 0);
33
- this.isAnyItemHighlighted = computed(() => this._highlightedItems().length > 0);
34
- this.isItemLimitReached = computed(() => this._ardParentComp.multiselectable() &&
35
- isDefined(this._ardParentComp.maxSelectedItems()) &&
36
- this._ardParentComp.maxSelectedItems() <= this.selectedItems().length);
37
- this._valueToWriteAfterItemsLoad = signal(undefined);
38
- this._wasValueWriteDeferred = signal(false);
39
- }
40
- _itemsToValue(items) {
41
- return items.map(item => item.value());
42
- }
43
- setItems(items) {
44
- let areItemsPrimitive = false;
45
- if (this._ardParentComp.groupLabelFrom() && this._ardParentComp.itemsAlreadyGrouped()) {
46
- const newItems = [];
47
- for (const group of items) {
48
- let children;
49
- [children, areItemsPrimitive] = this._ungroupAlreadyGroupedItems(group);
50
- newItems.push(...children);
51
- }
52
- items = newItems;
53
- }
54
- if (any(items, isPrimitive)) {
55
- items = items.map(this._primitiveItemsMapFn);
56
- areItemsPrimitive = true;
57
- }
58
- this._items.set(items.map((item, index) => {
59
- return this._setItemsMapFn(item, index, areItemsPrimitive);
60
- }));
61
- //add all items to filter array
62
- this._filteredItems.set(this._items());
63
- //add items to groups
64
- this._populateGroups();
65
- //write value if it was
66
- const toWrite = this._valueToWriteAfterItemsLoad();
67
- if (toWrite !== undefined) {
68
- this.handleWriteValue(toWrite);
69
- }
70
- }
71
- _addSingleItem(item) {
72
- const isItemPrimitive = isPrimitive(item);
73
- //map a primitive item to a usable object
74
- if (isItemPrimitive) {
75
- item = this._primitiveItemsMapFn(item);
76
- }
77
- //map the item to create data bindings
78
- const ardOption = this._setItemsMapFn(item, (this._items().last()?.index ?? 0) + 1, isItemPrimitive);
79
- //push the item into all items
80
- this._items.update(v => [...v, ardOption]);
81
- //add all items to filter array
82
- this._filteredItems.set(this._items());
83
- //add item to groups
84
- this._populateGroups();
85
- return ardOption;
86
- }
87
- _primitiveItemsMapFn(item) {
88
- return { value: item };
89
- }
90
- _ungroupAlreadyGroupedItems(group) {
91
- //determine groupBy (groupLabel) path
92
- const groupBy = this._ardParentComp.groupLabelFrom();
93
- //get group label from object
94
- let groupName;
95
- if (typeof groupBy === 'string') {
96
- groupName = resolvePath(group, groupBy);
97
- }
98
- else {
99
- groupName = groupBy(group);
100
- }
101
- //determine group children path
102
- const childrenPath = this._ardParentComp.childrenFrom();
103
- //get group children
104
- let groupItems = resolvePath(group, childrenPath);
105
- //return empty array if groupItems is not an array or is empty
106
- if (!isArray(groupItems) || groupItems.length === 0)
107
- return [[], false];
108
- //check if the array is an array of primitives, and map it if needed
109
- const areItemsPrimitive = false;
110
- if (any(groupItems, isPrimitive)) {
111
- groupItems = groupItems.map(this._primitiveItemsMapFn);
112
- }
113
- //add group name to every child
114
- groupItems = groupItems.map((item) => {
115
- item.$ardgroup = groupName;
116
- return item;
117
- });
118
- return [groupItems, areItemsPrimitive];
119
- }
120
- _setItemsMapFn(rawItemData, index, areItemsPrimitive) {
121
- if (areItemsPrimitive) {
122
- return {
123
- itemData: signal(rawItemData),
124
- index: index,
125
- value: signal(rawItemData.value),
126
- label: signal(rawItemData.value?.toString?.() ?? String(rawItemData.value)),
127
- disabled: signal(false),
128
- selected: signal(false),
129
- highlighted: signal(false),
130
- group: undefined,
131
- highlighted_recently: signal(false),
132
- };
133
- }
134
- //get value
135
- const valuePath = this._ardParentComp.valueFrom() ?? this._ardParentComp.labelFrom();
136
- const value = resolvePath(rawItemData, valuePath);
137
- //get label
138
- const labelPath = this._ardParentComp.labelFrom() ?? this._ardParentComp.valueFrom();
139
- const label = resolvePath(rawItemData, labelPath) ?? value;
140
- //get disabled
141
- const disabledPath = this._ardParentComp.disabledFrom();
142
- let disabled = evaluate(resolvePath(rawItemData, disabledPath));
143
- if (this._ardParentComp.invertDisabled()) {
144
- disabled = !disabled;
145
- }
146
- //get groups
147
- let group = undefined;
148
- const groupBy = this._ardParentComp.groupLabelFrom();
149
- if (groupBy) {
150
- if (rawItemData.$ardgroup) {
151
- group = rawItemData.$ardgroup;
152
- }
153
- else {
154
- if (typeof groupBy === 'string') {
155
- group = resolvePath(rawItemData, groupBy);
156
- }
157
- else {
158
- group = groupBy(rawItemData);
159
- }
160
- }
161
- }
162
- return {
163
- itemData: signal(rawItemData),
164
- index: index,
165
- value: signal(value),
166
- label: signal(label?.toString?.() ?? String(label)),
167
- disabled: signal(disabled),
168
- group: group,
169
- selected: signal(false),
170
- highlighted: signal(false),
171
- highlighted_recently: signal(false),
172
- };
173
- }
174
- _populateGroups() {
175
- this._groups.set(this._createEmptyGroupMap());
176
- for (const item of this._filteredItems()) {
177
- if (this._ardParentComp.hideSelected() && item.selected())
178
- continue;
179
- this._addToGroup(item);
180
- }
181
- }
182
- _addToGroup(item) {
183
- const groupKey = item.group;
184
- const targetGroup = this._groups().get(groupKey);
185
- //create new group if no such group exists
186
- if (!targetGroup) {
187
- this._groups.update(v => {
188
- const map = new Map(v);
189
- map.set(groupKey, {
190
- label: signal(String(groupKey ?? '')),
191
- children: signal([item]),
192
- disabled: signal(false),
193
- selected: signal(false),
194
- highlighted: signal(false),
195
- });
196
- return map;
197
- });
198
- return;
199
- }
200
- targetGroup.children.update(v => [...v, item]);
201
- }
202
- _createEmptyGroupMap() {
203
- return new Map([
204
- [
205
- undefined,
206
- {
207
- label: signal(''),
208
- children: signal([]),
209
- disabled: signal(false),
210
- selected: signal(false),
211
- highlighted: signal(false),
212
- },
213
- ],
214
- ]);
215
- }
216
- _isWriteValueValid(ngModel) {
217
- return ngModel.every(item => {
218
- if (!isDefined(this._ardParentComp.compareWith) && isObject(item) && this._ardParentComp.valueFrom()) {
219
- console.warn(`ARD-WA${this._ardParentComp._componentId}0: [valueFrom] can only point to a property of a primitive type. Define [compareWith] if using objects as a value is needed.`);
220
- return false;
221
- }
222
- return true;
223
- });
224
- }
225
- handleWriteValue(ngModel) {
226
- if (!isArray(ngModel)) {
227
- ngModel = [ngModel];
228
- }
229
- //defer writing the value if no options are yet loaded
230
- if (!this._wasValueWriteDeferred() && this._items().length === 0) {
231
- this._valueToWriteAfterItemsLoad.set(ngModel);
232
- return;
233
- }
234
- this.clearAllSelected();
235
- if (!this._isWriteValueValid(ngModel)) {
236
- return;
237
- }
238
- const selectItemByValue = (value) => {
239
- if (value === null || value === undefined) {
240
- this.unselectItem(...this._selectedItems());
241
- return;
242
- }
243
- const item = this.findItemByValue(value);
244
- if (item) {
245
- this.selectItem(item);
246
- return;
247
- }
248
- console.warn(`ARD-WA${this._ardParentComp._componentId}1: Couldn't find an item with value ${value?.toString?.() || String(value)} when trying to select it.`);
249
- };
250
- for (const modelValue of ngModel) {
251
- selectItemByValue(modelValue);
252
- }
253
- }
254
- findItemByValue(valueToFind) {
255
- let findBy;
256
- if (this._ardParentComp.compareWith()) {
257
- findBy = item => this._ardParentComp.compareWith()(valueToFind, item.value());
258
- }
259
- else {
260
- findBy = item => item.value() === valueToFind;
261
- }
262
- return this._items().find(item => findBy(item));
263
- }
264
- async addCustomOption(value, fn) {
265
- const fnResult = fn(value);
266
- let optionValue = fnResult;
267
- if (isPromise(optionValue)) {
268
- try {
269
- optionValue = await optionValue;
270
- }
271
- catch (error) {
272
- console.error(`ARD-NF${this._ardParentComp._componentId}2: Failed to add a custom option. The promise was rejected with the following error:`, error);
273
- return null;
274
- }
275
- }
276
- const newOptionObj = this._addSingleItem(optionValue);
277
- return newOptionObj;
278
- }
279
- clearAllSelected(repopulateGroups = false) {
280
- for (const item of this._selectedItems()) {
281
- item.selected.set(false);
282
- }
283
- const removedItemValues = this._itemsToValue(this._selectedItems());
284
- this._selectedItems.set([]);
285
- if (repopulateGroups && this._ardParentComp.hideSelected())
286
- this._populateGroups();
287
- return removedItemValues;
288
- }
289
- clearLastSelected() {
290
- const item = this._selectedItems().last();
291
- if (!item)
292
- return item;
293
- this.unselectItem(item);
294
- return item;
295
- }
296
- selectItem(...items) {
297
- if (this.isItemLimitReached()) {
298
- return [[], [], this._itemsToValue(items)];
299
- }
300
- let unselected = [];
301
- if (!this._ardParentComp.multiselectable()) {
302
- unselected = this.clearAllSelected(false);
303
- }
304
- let itemsSelectedCount = 0;
305
- const itemsSelected = [];
306
- for (const item of items) {
307
- itemsSelectedCount++;
308
- if (item.selected())
309
- continue;
310
- if (this.isItemLimitReached()) {
311
- break;
312
- }
313
- item.selected.set(true);
314
- this._selectedItems.update(v => [...v, item]);
315
- itemsSelected.push(item);
316
- }
317
- if (this._ardParentComp.hideSelected()) {
318
- this._populateGroups();
319
- }
320
- const itemsFailedToSelect = items.slice(itemsSelectedCount - 1);
321
- return [this._itemsToValue(itemsSelected), unselected, this._itemsToValue(itemsFailedToSelect)];
322
- }
323
- unselectItem(...items) {
324
- for (const item of items) {
325
- if (!item.selected())
326
- continue;
327
- item.selected.set(false);
328
- }
329
- this._selectedItems.update(v => v.filter(v => v.selected()));
330
- if (this._ardParentComp.hideSelected()) {
331
- this._populateGroups();
332
- }
333
- return this._itemsToValue(items);
334
- }
335
- clearAllHighlights() {
336
- for (const item of this._highlightedItems()) {
337
- item.highlighted.set(false);
338
- }
339
- for (const group of this._highlightedGroups()) {
340
- group.highlighted.set(false);
341
- }
342
- this._highlightedItems.set([]);
343
- this._highlightedGroups.set([]);
344
- }
345
- highlightGroup(group) {
346
- this.clearAllHighlights();
347
- group.highlighted.set(true);
348
- this.highlightItem(...group.children());
349
- return group.children().first();
350
- }
351
- highlightSingleItem(item) {
352
- if (!item || item.disabled())
353
- return null;
354
- this.clearAllHighlights();
355
- return this.highlightItem(item);
356
- }
357
- highlightItem(...items) {
358
- for (const item of items) {
359
- item.highlighted.set(true);
360
- }
361
- this._highlightedItems.update(v => [...v, ...items]);
362
- return items.last();
363
- }
364
- unhighlightItem(...items) {
365
- for (const item of items) {
366
- if (!item || !item.highlighted)
367
- return;
368
- item.highlighted.set(false);
369
- }
370
- this._highlightedItems.update(v => v.filter(v => v.highlighted()));
371
- }
372
- highlightFirstItem() {
373
- this.clearAllHighlights();
374
- const itemsToHighlight = this._getHiglightableItems();
375
- return this.highlightSingleItem(itemsToHighlight.first());
376
- }
377
- highlightLastItem() {
378
- this.clearAllHighlights();
379
- const itemsToHighlight = this._getHiglightableItems();
380
- return this.highlightSingleItem(itemsToHighlight.last());
381
- }
382
- _getHiglightableItems() {
383
- let itemsToHighlight = this._filteredItems().filter(item => !item.disabled());
384
- if (this._ardParentComp.hideSelected()) {
385
- itemsToHighlight = itemsToHighlight.filter(item => !item.selected());
386
- }
387
- return itemsToHighlight;
388
- }
389
- highlightAllItems() {
390
- this.highlightItem(...this._getHiglightableItems());
391
- }
392
- _clearRecentlyHighlighted() {
393
- if (this._recentlyHighlightedItem()) {
394
- this._recentlyHighlightedItem().highlighted_recently.set(false);
395
- }
396
- }
397
- setRecentlyHighlighted(item) {
398
- this._clearRecentlyHighlighted();
399
- item.highlighted_recently.set(true);
400
- this._recentlyHighlightedItem.set(item);
401
- }
402
- highlightNextItem(offset, hasShift) {
403
- if (!this.isAnyItemHighlighted()) {
404
- return this.highlightFirstItem();
405
- }
406
- const currentItem = this.highlightedItems().last();
407
- const highlightableItems = this._getHiglightableItems();
408
- const currentIndexInFiltered = highlightableItems.findIndex(item => item.index === currentItem.index);
409
- let nextItemIndex = currentIndexInFiltered + offset;
410
- if (nextItemIndex >= highlightableItems.length) {
411
- nextItemIndex -= highlightableItems.length;
412
- }
413
- if (nextItemIndex < 0) {
414
- nextItemIndex += highlightableItems.length;
415
- }
416
- const itemToHighlight = highlightableItems[nextItemIndex];
417
- if (hasShift && this._ardParentComp.multiselectable()) {
418
- if (itemToHighlight.highlighted()) {
419
- this.unhighlightItem(currentItem);
420
- }
421
- return this.highlightItem(itemToHighlight);
422
- }
423
- return this.highlightSingleItem(itemToHighlight);
424
- }
425
- filter(filterTerm) {
426
- if (!filterTerm) {
427
- return this._itemsToValue(this.resetFiltered());
428
- }
429
- if (!this._ardParentComp.searchCaseSensitive()) {
430
- filterTerm = filterTerm.toLocaleLowerCase();
431
- }
432
- const searchFn = this._ardParentComp.searchFn();
433
- const newFilteredItems = this._items().filter(item => searchFn(filterTerm, item));
434
- this._filteredItems.set(newFilteredItems);
435
- this._populateGroups();
436
- if (!this.isNoItemsFound)
437
- this.highlightFirstItem();
438
- else
439
- this.clearAllHighlights();
440
- return this._itemsToValue(newFilteredItems);
441
- }
442
- resetFiltered() {
443
- if (this._filteredItems().length === this._items().length)
444
- return this._items();
445
- let newFilteredItems = this._items();
446
- if (this._ardParentComp.hideSelected() && this.isAnyItemSelected()) {
447
- newFilteredItems = newFilteredItems.filter(item => !item.selected());
448
- }
449
- this._populateGroups();
450
- return newFilteredItems;
451
- }
452
- }
453
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24taXRlbS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9faW50ZXJuYWwvaXRlbS1zdG9yYWdlcy9kcm9wZG93bi1pdGVtLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUF5QmxHLE1BQU0sT0FBTyxXQUFXO0lBU3RCLFlBQTZCLGNBQStCO1FBQS9CLG1CQUFjLEdBQWQsY0FBYyxDQUFpQjtRQVIzQyxZQUFPLEdBQUcsTUFBTSxDQUFrQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELFdBQU0sR0FBRyxNQUFNLENBQWMsRUFBRSxDQUFDLENBQUM7UUFDakMsbUJBQWMsR0FBRyxNQUFNLENBQWMsRUFBRSxDQUFDLENBQUM7UUFDekMsc0JBQWlCLEdBQUcsTUFBTSxDQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLHVCQUFrQixHQUFHLE1BQU0sQ0FBbUIsRUFBRSxDQUFDLENBQUM7UUFDbEQsNkJBQXdCLEdBQUcsTUFBTSxDQUFzQixTQUFTLENBQUMsQ0FBQztRQUNsRSxtQkFBYyxHQUFHLE1BQU0sQ0FBYyxFQUFFLENBQUMsQ0FBQztRQUlqRCxXQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FB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bEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUxQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O1lBQy9DLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRS9CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxhQUFhO1FBQ1gsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFaEYsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7WUFDbkUsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2lnbmFsLCBjb21wdXRlZCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHJlc29sdmVQYXRoIH0gZnJvbSAncmVzb2x2ZS1vYmplY3QtcGF0aCc7XHJcbmltcG9ydCB7IGFueSwgZXZhbHVhdGUsIGlzQXJyYXksIGlzRGVmaW5lZCwgaXNPYmplY3QsIGlzUHJpbWl0aXZlLCBpc1Byb21pc2UgfSBmcm9tICdzaW1wbGUtYm9vbCc7XHJcbmltcG9ydCB7IEFkZEN1c3RvbUZuIH0gZnJvbSAnLi4vLi4vc2VsZWN0L3NlbGVjdC50eXBlcyc7XHJcbmltcG9ydCB7IEFyZEl0ZW1Hcm91cE1hcCwgQXJkT3B0aW9uLCBBcmRPcHRpb25Hcm91cCwgQ29tcGFyZVdpdGhGbiwgR3JvdXBCeUZuLCBTZWFyY2hGbiB9IGZyb20gJy4uLy4uL3R5cGVzL2l0ZW0tc3RvcmFnZS50eXBlcyc7XHJcbmltcG9ydCB7IE51bGxhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMvdXRpbGl0eS50eXBlcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdG9yYWdlSG9zdCB7XHJcbiAgcmVhZG9ubHkgdmFsdWVGcm9tOiBTaWduYWw8c3RyaW5nPjtcclxuICByZWFkb25seSBsYWJlbEZyb206IFNpZ25hbDxzdHJpbmc+O1xyXG4gIHJlYWRvbmx5IGRpc2FibGVkRnJvbTogU2lnbmFsPHN0cmluZz47XHJcbiAgcmVhZG9ubHkgaW52ZXJ0RGlzYWJsZWQ6IFNpZ25hbDxib29sZWFuPjtcclxuICByZWFkb25seSBncm91cExhYmVsRnJvbTogU2lnbmFsPHN0cmluZyB8IEdyb3VwQnlGbj47XHJcbiAgcmVhZG9ubHkgZ3JvdXBEaXNhYmxlZEZyb206IFNpZ25hbDxzdHJpbmc+O1xyXG4gIHJlYWRvbmx5IGNoaWxkcmVuRnJvbTogU2lnbmFsPHN0cmluZz47XHJcbiAgcmVhZG9ubHkgaXRlbXNBbHJlYWR5R3JvdXBlZDogU2lnbmFsPE51bGxhYmxlPGJvb2xlYW4+PjtcclxuICByZWFkb25seSBoaWRlU2VsZWN0ZWQ6IFNpZ25hbDxib29sZWFuPjtcclxuICByZWFkb25seSBzZWFyY2hDYXNlU2Vuc2l0aXZlOiBTaWduYWw8Ym9vbGVhbj47XHJcbiAgcmVhZG9ubHkgc2VhcmNoRm46IFNpZ25hbDxTZWFyY2hGbj47XHJcbiAgcmVhZG9ubHkgY29tcGFyZVdpdGg6IFNpZ25hbDxOdWxsYWJsZTxDb21wYXJlV2l0aEZuPj47XHJcbiAgcmVhZG9ubHkgbXVsdGlzZWxlY3RhYmxlOiBTaWduYWw8Ym9vbGVhbj47XHJcbiAgcmVhZG9ubHkgc29ydE11bHRpcGxlVmFsdWVzOiBTaWduYWw8Ym9vbGVhbj47XHJcbiAgcmVhZG9ubHkgbWF4U2VsZWN0ZWRJdGVtczogU2lnbmFsPE51bGxhYmxlPG51bWJlcj4+O1xyXG4gIHJlYWRvbmx5IGFkZEN1c3RvbTogU2lnbmFsPGJvb2xlYW4gfCBBZGRDdXN0b21Gbjxhbnk+IHwgQWRkQ3VzdG9tRm48UHJvbWlzZTxhbnk+Pj47XHJcbiAgcmVhZG9ubHkgX2NvbXBvbmVudElkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBJdGVtU3RvcmFnZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfZ3JvdXBzID0gc2lnbmFsPEFyZEl0ZW1Hcm91cE1hcD4odGhpcy5fY3JlYXRlRW1wdHlHcm91cE1hcCgpKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9pdGVtcyA9IHNpZ25hbDxBcmRPcHRpb25bXT4oW10pO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlcmVkSXRlbXMgPSBzaWduYWw8QXJkT3B0aW9uW10+KFtdKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9oaWdobGlnaHRlZEl0ZW1zID0gc2lnbmFsPEFyZE9wdGlvbltdPihbXSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfaGlnaGxpZ2h0ZWRHcm91cHMgPSBzaWduYWw8QXJkT3B0aW9uR3JvdXBbXT4oW10pO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlY2VudGx5SGlnaGxpZ2h0ZWRJdGVtID0gc2lnbmFsPE51bGxhYmxlPEFyZE9wdGlvbj4+KHVuZGVmaW5lZCk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0ZWRJdGVtcyA9IHNpZ25hbDxBcmRPcHRpb25bXT4oW10pO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9hcmRQYXJlbnRDb21wOiBJdGVtU3RvcmFnZUhvc3QpIHt9XHJcblxyXG4gIHJlYWRvbmx5IGdyb3VwcyA9IGNvbXB1dGVkKCgpID0+XHJcbiAgICBBcnJheS5mcm9tKHRoaXMuX2dyb3VwcygpLmVudHJpZXMoKSlcclxuICAgICAgLm1hcCgoWywgZ3JvdXBdKSA9PiBncm91cClcclxuICAgICAgLmZpbHRlcihncm91cCA9PiBncm91cC5jaGlsZHJlbigpLmxlbmd0aClcclxuICApO1xyXG4gIHJlYWRvbmx5IGl0ZW1zID0gdGhpcy5faXRlbXMuYXNSZWFkb25seSgpO1xyXG4gIHJlYWRvbmx5IGZpbHRlcmVkSXRlbXMgPSB0aGlzLl9maWx0ZXJlZEl0ZW1zLmFzUmVhZG9ubHkoKTtcclxuICByZWFkb25seSBoaWdobGlnaHRlZEl0ZW1zID0gdGhpcy5faGlnaGxpZ2h0ZWRJdGVtcy5hc1JlYWRvbmx5KCk7XHJcblxyXG4gIHJlYWRvbmx5IHNlbGVjdGVkSXRlbXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBpZiAodGhpcy5fYXJkUGFyZW50Q29tcC5zb3J0TXVsdGlwbGVWYWx1ZXMoKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRJdGVtcygpLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXg7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSXRlbXMoKTtcclxuICB9KTtcclxuICByZWFkb25seSBsYXN0U2VsZWN0ZWRJdGVtID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fZmlsdGVyZWRJdGVtcygpLmxhc3QoMSwgaXRlbSA9PiAhaXRlbS5kaXNhYmxlZCgpKSk7XHJcblxyXG4gIHJlYWRvbmx5IHZhbHVlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5faXRlbXNUb1ZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcygpKSk7XHJcbiAgcHJpdmF0ZSBfaXRlbXNUb1ZhbHVlKGl0ZW1zOiBBcmRPcHRpb25bXSk6IGFueVtdIHtcclxuICAgIHJldHVybiBpdGVtcy5tYXAoaXRlbSA9PiBpdGVtLnZhbHVlKCkpO1xyXG4gIH1cclxuXHJcbiAgcmVhZG9ubHkgaXNOb0l0ZW1zVG9TZWxlY3QgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9pdGVtcygpLmxlbmd0aCA9PT0gdGhpcy5fc2VsZWN0ZWRJdGVtcygpLmxlbmd0aCk7XHJcbiAgcmVhZG9ubHkgaXNOb0l0ZW1zRm91bmQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9maWx0ZXJlZEl0ZW1zKCkubGVuZ3RoID09PSAwKTtcclxuICByZWFkb25seSBpc0FueUl0ZW1TZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3NlbGVjdGVkSXRlbXMoKS5sZW5ndGggPiAwKTtcclxuICByZWFkb25seSBpc0FueUl0ZW1IaWdobGlnaHRlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMoKS5sZW5ndGggPiAwKTtcclxuICByZWFkb25seSBpc0l0ZW1MaW1pdFJlYWNoZWQgPSBjb21wdXRlZChcclxuICAgICgpID0+XHJcbiAgICAgIHRoaXMuX2FyZFBhcmVudENvbXAubXVsdGlzZWxlY3RhYmxlKCkgJiZcclxuICAgICAgaXNEZWZpbmVkKHRoaXMuX2FyZFBhcmVudENvbXAubWF4U2VsZWN0ZWRJdGVtcygpKSAmJlxyXG4gICAgICB0aGlzLl9hcmRQYXJlbnRDb21wLm1heFNlbGVjdGVkSXRlbXMoKSEgPD0gdGhpcy5zZWxlY3RlZEl0ZW1zKCkubGVuZ3RoXHJcbiAgKTtcclxuXHJcbiAgc2V0SXRlbXMoaXRlbXM6IGFueVtdKTogdm9pZCB7XHJcbiAgICBsZXQgYXJlSXRlbXNQcmltaXRpdmUgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLmdyb3VwTGFiZWxGcm9tKCkgJiYgdGhpcy5fYXJkUGFyZW50Q29tcC5pdGVtc0FscmVhZHlHcm91cGVkKCkpIHtcclxuICAgICAgY29uc3QgbmV3SXRlbXMgPSBbXTtcclxuICAgICAgZm9yIChjb25zdCBncm91cCBvZiBpdGVtcykge1xyXG4gICAgICAgIGxldCBjaGlsZHJlbjogYW55W107XHJcbiAgICAgICAgW2NoaWxkcmVuLCBhcmVJdGVtc1ByaW1pdGl2ZV0gPSB0aGlzLl91bmdyb3VwQWxyZWFkeUdyb3VwZWRJdGVtcyhncm91cCk7XHJcbiAgICAgICAgbmV3SXRlbXMucHVzaCguLi5jaGlsZHJlbik7XHJcbiAgICAgIH1cclxuICAgICAgaXRlbXMgPSBuZXdJdGVtcztcclxuICAgIH1cclxuICAgIGlmIChhbnkoaXRlbXMsIGlzUHJpbWl0aXZlKSkge1xyXG4gICAgICBpdGVtcyA9IGl0ZW1zLm1hcCh0aGlzLl9wcmltaXRpdmVJdGVtc01hcEZuKTtcclxuICAgICAgYXJlSXRlbXNQcmltaXRpdmUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2l0ZW1zLnNldChcclxuICAgICAgaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZXRJdGVtc01hcEZuKGl0ZW0sIGluZGV4LCBhcmVJdGVtc1ByaW1pdGl2ZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vYWRkIGFsbCBpdGVtcyB0byBmaWx0ZXIgYXJyYXlcclxuICAgIHRoaXMuX2ZpbHRlcmVkSXRlbXMuc2V0KHRoaXMuX2l0ZW1zKCkpO1xyXG5cclxuICAgIC8vYWRkIGl0ZW1zIHRvIGdyb3Vwc1xyXG4gICAgdGhpcy5fcG9wdWxhdGVHcm91cHMoKTtcclxuXHJcbiAgICAvL3dyaXRlIHZhbHVlIGlmIGl0IHdhc1xyXG4gICAgY29uc3QgdG9Xcml0ZSA9IHRoaXMuX3ZhbHVlVG9Xcml0ZUFmdGVySXRlbXNMb2FkKCk7XHJcbiAgICBpZiAodG9Xcml0ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlV3JpdGVWYWx1ZSh0b1dyaXRlKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBfYWRkU2luZ2xlSXRlbShpdGVtOiBhbnkpOiBBcmRPcHRpb24ge1xyXG4gICAgY29uc3QgaXNJdGVtUHJpbWl0aXZlID0gaXNQcmltaXRpdmUoaXRlbSk7XHJcbiAgICAvL21hcCBhIHByaW1pdGl2ZSBpdGVtIHRvIGEgdXNhYmxlIG9iamVjdFxyXG4gICAgaWYgKGlzSXRlbVByaW1pdGl2ZSkge1xyXG4gICAgICBpdGVtID0gdGhpcy5fcHJpbWl0aXZlSXRlbXNNYXBGbihpdGVtKTtcclxuICAgIH1cclxuICAgIC8vbWFwIHRoZSBpdGVtIHRvIGNyZWF0ZSBkYXRhIGJpbmRpbmdzXHJcbiAgICBjb25zdCBhcmRPcHRpb24gPSB0aGlzLl9zZXRJdGVtc01hcEZuKGl0ZW0sICh0aGlzLl9pdGVtcygpLmxhc3QoKT8uaW5kZXggPz8gMCkgKyAxLCBpc0l0ZW1QcmltaXRpdmUpO1xyXG5cclxuICAgIC8vcHVzaCB0aGUgaXRlbSBpbnRvIGFsbCBpdGVtc1xyXG4gICAgdGhpcy5faXRlbXMudXBkYXRlKHYgPT4gWy4uLnYsIGFyZE9wdGlvbl0pO1xyXG5cclxuICAgIC8vYWRkIGFsbCBpdGVtcyB0byBmaWx0ZXIgYXJyYXlcclxuICAgIHRoaXMuX2ZpbHRlcmVkSXRlbXMuc2V0KHRoaXMuX2l0ZW1zKCkpO1xyXG5cclxuICAgIC8vYWRkIGl0ZW0gdG8gZ3JvdXBzXHJcbiAgICB0aGlzLl9wb3B1bGF0ZUdyb3VwcygpO1xyXG5cclxuICAgIHJldHVybiBhcmRPcHRpb247XHJcbiAgfVxyXG4gIHByaXZhdGUgX3ByaW1pdGl2ZUl0ZW1zTWFwRm48VD4oaXRlbTogVCk6IHsgdmFsdWU6IFQgfSB7XHJcbiAgICByZXR1cm4geyB2YWx1ZTogaXRlbSB9O1xyXG4gIH1cclxuICBwcml2YXRlIF91bmdyb3VwQWxyZWFkeUdyb3VwZWRJdGVtczxUIGV4dGVuZHMgb2JqZWN0Pihncm91cDogVCk6IFthbnlbXSwgYm9vbGVhbl0ge1xyXG4gICAgLy9kZXRlcm1pbmUgZ3JvdXBCeSAoZ3JvdXBMYWJlbCkgcGF0aFxyXG4gICAgY29uc3QgZ3JvdXBCeSA9IHRoaXMuX2FyZFBhcmVudENvbXAuZ3JvdXBMYWJlbEZyb20oKTtcclxuXHJcbiAgICAvL2dldCBncm91cCBsYWJlbCBmcm9tIG9iamVjdFxyXG4gICAgbGV0IGdyb3VwTmFtZTogYW55O1xyXG4gICAgaWYgKHR5cGVvZiBncm91cEJ5ID09PSAnc3RyaW5nJykge1xyXG4gICAgICBncm91cE5hbWUgPSByZXNvbHZlUGF0aChncm91cCwgZ3JvdXBCeSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncm91cE5hbWUgPSBncm91cEJ5KGdyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICAvL2RldGVybWluZSBncm91cCBjaGlsZHJlbiBwYXRoXHJcbiAgICBjb25zdCBjaGlsZHJlblBhdGggPSB0aGlzLl9hcmRQYXJlbnRDb21wLmNoaWxkcmVuRnJvbSgpO1xyXG5cclxuICAgIC8vZ2V0IGdyb3VwIGNoaWxkcmVuXHJcbiAgICBsZXQgZ3JvdXBJdGVtczogYW55ID0gcmVzb2x2ZVBhdGgoZ3JvdXAsIGNoaWxkcmVuUGF0aCk7XHJcblxyXG4gICAgLy9yZXR1cm4gZW1wdHkgYXJyYXkgaWYgZ3JvdXBJdGVtcyBpcyBub3QgYW4gYXJyYXkgb3IgaXMgZW1wdHlcclxuICAgIGlmICghaXNBcnJheShncm91cEl0ZW1zKSB8fCBncm91cEl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtbXSwgZmFsc2VdO1xyXG5cclxuICAgIC8vY2hlY2sgaWYgdGhlIGFycmF5IGlzIGFuIGFycmF5IG9mIHByaW1pdGl2ZXMsIGFuZCBtYXAgaXQgaWYgbmVlZGVkXHJcbiAgICBjb25zdCBhcmVJdGVtc1ByaW1pdGl2ZSA9IGZhbHNlO1xyXG4gICAgaWYgKGFueShncm91cEl0ZW1zLCBpc1ByaW1pdGl2ZSkpIHtcclxuICAgICAgZ3JvdXBJdGVtcyA9IGdyb3VwSXRlbXMubWFwKHRoaXMuX3ByaW1pdGl2ZUl0ZW1zTWFwRm4pO1xyXG4gICAgfVxyXG4gICAgLy9hZGQgZ3JvdXAgbmFtZSB0byBldmVyeSBjaGlsZFxyXG4gICAgZ3JvdXBJdGVtcyA9IGdyb3VwSXRlbXMubWFwKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgaXRlbS4kYXJkZ3JvdXAgPSBncm91cE5hbWU7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIFtncm91cEl0ZW1zLCBhcmVJdGVtc1ByaW1pdGl2ZV07XHJcbiAgfVxyXG4gIHByaXZhdGUgX3NldEl0ZW1zTWFwRm4ocmF3SXRlbURhdGE6IGFueSwgaW5kZXg6IG51bWJlciwgYXJlSXRlbXNQcmltaXRpdmU6IGJvb2xlYW4pOiBBcmRPcHRpb24ge1xyXG4gICAgaWYgKGFyZUl0ZW1zUHJpbWl0aXZlKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgaXRlbURhdGE6IHNpZ25hbChyYXdJdGVtRGF0YSksXHJcbiAgICAgICAgaW5kZXg6IGluZGV4LFxyXG4gICAgICAgIHZhbHVlOiBzaWduYWwocmF3SXRlbURhdGEudmFsdWUpLFxyXG4gICAgICAgIGxhYmVsOiBzaWduYWwocmF3SXRlbURhdGEudmFsdWU/LnRvU3RyaW5nPy4oKSA/PyBTdHJpbmcocmF3SXRlbURhdGEudmFsdWUpKSxcclxuICAgICAgICBkaXNhYmxlZDogc2lnbmFsKGZhbHNlKSxcclxuICAgICAgICBzZWxlY3RlZDogc2lnbmFsKGZhbHNlKSxcclxuICAgICAgICBoaWdobGlnaHRlZDogc2lnbmFsKGZhbHNlKSxcclxuICAgICAgICBncm91cDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGhpZ2hsaWdodGVkX3JlY2VudGx5OiBzaWduYWwoZmFsc2UpLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgLy9nZXQgdmFsdWVcclxuICAgIGNvbnN0IHZhbHVlUGF0aCA9IHRoaXMuX2FyZFBhcmVudENvbXAudmFsdWVGcm9tKCkgPz8gdGhpcy5fYXJkUGFyZW50Q29tcC5sYWJlbEZyb20oKTtcclxuICAgIGNvbnN0IHZhbHVlID0gcmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIHZhbHVlUGF0aCk7XHJcblxyXG4gICAgLy9nZXQgbGFiZWxcclxuICAgIGNvbnN0IGxhYmVsUGF0aCA9IHRoaXMuX2FyZFBhcmVudENvbXAubGFiZWxGcm9tKCkgPz8gdGhpcy5fYXJkUGFyZW50Q29tcC52YWx1ZUZyb20oKTtcclxuICAgIGNvbnN0IGxhYmVsID0gcmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIGxhYmVsUGF0aCkgPz8gdmFsdWU7XHJcblxyXG4gICAgLy9nZXQgZGlzYWJsZWRcclxuICAgIGNvbnN0IGRpc2FibGVkUGF0aCA9IHRoaXMuX2FyZFBhcmVudENvbXAuZGlzYWJsZWRGcm9tKCk7XHJcbiAgICBsZXQgZGlzYWJsZWQgPSBldmFsdWF0ZShyZXNvbHZlUGF0aChyYXdJdGVtRGF0YSwgZGlzYWJsZWRQYXRoKSk7XHJcbiAgICBpZiAodGhpcy5fYXJkUGFyZW50Q29tcC5pbnZlcnREaXNhYmxlZCgpKSB7XHJcbiAgICAgIGRpc2FibGVkID0gIWRpc2FibGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8vZ2V0IGdyb3Vwc1xyXG4gICAgbGV0IGdyb3VwOiBhbnkgPSB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBncm91cEJ5ID0gdGhpcy5fYXJkUGFyZW50Q29tcC5ncm91cExhYmVsRnJvbSgpO1xyXG4gICAgaWYgKGdyb3VwQnkpIHtcclxuICAgICAgaWYgKHJhd0l0ZW1EYXRhLiRhcmRncm91cCkge1xyXG4gICAgICAgIGdyb3VwID0gcmF3SXRlbURhdGEuJGFyZGdyb3VwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZ3JvdXBCeSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGdyb3VwID0gcmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIGdyb3VwQnkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBncm91cCA9IGdyb3VwQnkocmF3SXRlbURhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGl0ZW1EYXRhOiBzaWduYWwocmF3SXRlbURhdGEpLFxyXG4gICAgICBpbmRleDogaW5kZXgsXHJcbiAgICAgIHZhbHVlOiBzaWduYWwodmFsdWUpLFxyXG4gICAgICBsYWJlbDogc2lnbmFsKGxhYmVsPy50b1N0cmluZz8uKCkgPz8gU3RyaW5nKGxhYmVsKSksXHJcbiAgICAgIGRpc2FibGVkOiBzaWduYWwoZGlzYWJsZWQpLFxyXG4gICAgICBncm91cDogZ3JvdXAsXHJcbiAgICAgIHNlbGVjdGVkOiBzaWduYWwoZmFsc2UpLFxyXG4gICAgICBoaWdobGlnaHRlZDogc2lnbmFsKGZhbHNlKSxcclxuICAgICAgaGlnaGxpZ2h0ZWRfcmVjZW50bHk6IHNpZ25hbChmYWxzZSksXHJcbiAgICB9O1xyXG4gIH1cclxuICBwcml2YXRlIF9wb3B1bGF0ZUdyb3VwcygpOiB2b2lkIHtcclxuICAgIHRoaXMuX2dyb3Vwcy5zZXQodGhpcy5fY3JlYXRlRW1wdHlHcm91cE1hcCgpKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5fZmlsdGVyZWRJdGVtcygpKSB7XHJcbiAgICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLmhpZGVTZWxlY3RlZCgpICYmIGl0ZW0uc2VsZWN0ZWQoKSkgY29udGludWU7XHJcblxyXG4gICAgICB0aGlzLl9hZGRUb0dyb3VwKGl0ZW0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIF9hZGRUb0dyb3VwKGl0ZW06IEFyZE9wdGlvbik6IHZvaWQge1xyXG4gICAgY29uc3QgZ3JvdXBLZXkgPSBpdGVtLmdyb3VwO1xyXG4gICAgY29uc3QgdGFyZ2V0R3JvdXAgPSB0aGlzLl9ncm91cHMoKS5nZXQoZ3JvdXBLZXkpO1xyXG4gICAgLy9jcmVhdGUgbmV3IGdyb3VwIGlmIG5vIHN1Y2ggZ3JvdXAgZXhpc3RzXHJcbiAgICBpZiAoIXRhcmdldEdyb3VwKSB7XHJcbiAgICAgIHRoaXMuX2dyb3Vwcy51cGRhdGUodiA9PiB7XHJcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCh2KTtcclxuICAgICAgICBtYXAuc2V0KGdyb3VwS2V5LCB7XHJcbiAgICAgICAgICBsYWJlbDogc2lnbmFsKFN0cmluZyhncm91cEtleSA/PyAnJykpLFxyXG4gICAgICAgICAgY2hpbGRyZW46IHNpZ25hbChbaXRlbV0pLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IHNpZ25hbChmYWxzZSksXHJcbiAgICAgICAgICBzZWxlY3RlZDogc2lnbmFsKGZhbHNlKSxcclxuICAgICAgICAgIGhpZ2hsaWdodGVkOiBzaWduYWwoZmFsc2UpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBtYXA7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0YXJnZXRHcm91cC5jaGlsZHJlbi51cGRhdGUodiA9PiBbLi4udiwgaXRlbV0pO1xyXG4gIH1cclxuICBwcml2YXRlIF9jcmVhdGVFbXB0eUdyb3VwTWFwKCk6IEFyZEl0ZW1Hcm91cE1hcCB7XHJcbiAgICByZXR1cm4gbmV3IE1hcChbXHJcbiAgICAgIFtcclxuICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGFiZWw6IHNpZ25hbCgnJyksXHJcbiAgICAgICAgICBjaGlsZHJlbjogc2lnbmFsKFtdKSxcclxuICAgICAgICAgIGRpc2FibGVkOiBzaWduYWwoZmFsc2UpLFxyXG4gICAgICAgICAgc2VsZWN0ZWQ6IHNpZ25hbChmYWxzZSksXHJcbiAgICAgICAgICBoaWdobGlnaHRlZDogc2lnbmFsKGZhbHNlKSxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgXSkgYXMgQXJkSXRlbUdyb3VwTWFwO1xyXG4gIH1cclxuICBwcml2YXRlIF9pc1dyaXRlVmFsdWVWYWxpZChuZ01vZGVsOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG5nTW9kZWwuZXZlcnkoaXRlbSA9PiB7XHJcbiAgICAgIGlmICghaXNEZWZpbmVkKHRoaXMuX2FyZFBhcmVudENvbXAuY29tcGFyZVdpdGgpICYmIGlzT2JqZWN0KGl0ZW0pICYmIHRoaXMuX2FyZFBhcmVudENvbXAudmFsdWVGcm9tKCkpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICBgQVJELVdBJHt0aGlzLl9hcmRQYXJlbnRDb21wLl9jb21wb25lbnRJZH0wOiBbdmFsdWVGcm9tXSBjYW4gb25seSBwb2ludCB0byBhIHByb3BlcnR5IG9mIGEgcHJpbWl0aXZlIHR5cGUuIERlZmluZSBbY29tcGFyZVdpdGhdIGlmIHVzaW5nIG9iamVjdHMgYXMgYSB2YWx1ZSBpcyBuZWVkZWQuYFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZhbHVlVG9Xcml0ZUFmdGVySXRlbXNMb2FkID0gc2lnbmFsPGFueT4odW5kZWZpbmVkKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF93YXNWYWx1ZVdyaXRlRGVmZXJyZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIGhhbmRsZVdyaXRlVmFsdWUobmdNb2RlbDogYW55W10pOiB2b2lkIHtcclxuICAgIGlmICghaXNBcnJheShuZ01vZGVsKSkge1xyXG4gICAgICBuZ01vZGVsID0gW25nTW9kZWxdO1xyXG4gICAgfVxyXG4gICAgLy9kZWZlciB3cml0aW5nIHRoZSB2YWx1ZSBpZiBubyBvcHRpb25zIGFyZSB5ZXQgbG9hZGVkXHJcbiAgICBpZiAoIXRoaXMuX3dhc1ZhbHVlV3JpdGVEZWZlcnJlZCgpICYmIHRoaXMuX2l0ZW1zKCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuX3ZhbHVlVG9Xcml0ZUFmdGVySXRlbXNMb2FkLnNldChuZ01vZGVsKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJBbGxTZWxlY3RlZCgpO1xyXG5cclxuICAgIGlmICghdGhpcy5faXNXcml0ZVZhbHVlVmFsaWQobmdNb2RlbCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlbGVjdEl0ZW1CeVZhbHVlID0gKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLnVuc2VsZWN0SXRlbSguLi50aGlzLl9zZWxlY3RlZEl0ZW1zKCkpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5maW5kSXRlbUJ5VmFsdWUodmFsdWUpO1xyXG5cclxuICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oaXRlbSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgQVJELVdBJHt0aGlzLl9hcmRQYXJlbnRDb21wLl9jb21wb25lbnRJZH0xOiBDb3VsZG4ndCBmaW5kIGFuIGl0ZW0gd2l0aCB2YWx1ZSAke1xyXG4gICAgICAgICAgdmFsdWU/LnRvU3RyaW5nPy4oKSB8fCBTdHJpbmcodmFsdWUpXHJcbiAgICAgICAgfSB3aGVuIHRyeWluZyB0byBzZWxlY3QgaXQuYFxyXG4gICAgICApO1xyXG4gICAgfTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IG1vZGVsVmFsdWUgb2YgbmdNb2RlbCkge1xyXG4gICAgICBzZWxlY3RJdGVtQnlWYWx1ZShtb2RlbFZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcbiAgZmluZEl0ZW1CeVZhbHVlKHZhbHVlVG9GaW5kOiBhbnkpOiBBcmRPcHRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgbGV0IGZpbmRCeTogKGl0ZW06IEFyZE9wdGlvbikgPT4gYm9vbGVhbjtcclxuICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLmNvbXBhcmVXaXRoKCkpIHtcclxuICAgICAgZmluZEJ5ID0gaXRlbSA9PiB0aGlzLl9hcmRQYXJlbnRDb21wLmNvbXBhcmVXaXRoKCkhKHZhbHVlVG9GaW5kLCBpdGVtLnZhbHVlKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZmluZEJ5ID0gaXRlbSA9PiBpdGVtLnZhbHVlKCkgPT09IHZhbHVlVG9GaW5kO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zKCkuZmluZChpdGVtID0+IGZpbmRCeShpdGVtKSk7XHJcbiAgfVxyXG4gIGFzeW5jIGFkZEN1c3RvbU9wdGlvbih2YWx1ZTogc3RyaW5nLCBmbjogQWRkQ3VzdG9tRm48YW55PiB8IEFkZEN1c3RvbUZuPFByb21pc2U8YW55Pj4pOiBQcm9taXNlPEFyZE9wdGlvbiB8IG51bGw+IHtcclxuICAgIGNvbnN0IGZuUmVzdWx0ID0gZm4odmFsdWUpO1xyXG5cclxuICAgIGxldCBvcHRpb25WYWx1ZSA9IGZuUmVzdWx0O1xyXG4gICAgaWYgKGlzUHJvbWlzZShvcHRpb25WYWx1ZSkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBvcHRpb25WYWx1ZSA9IGF3YWl0IG9wdGlvblZhbHVlO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICBgQVJELU5GJHt0aGlzLl9hcmRQYXJlbnRDb21wLl9jb21wb25lbnRJZH0yOiBGYWlsZWQgdG8gYWRkIGEgY3VzdG9tIG9wdGlvbi4gVGhlIHByb21pc2Ugd2FzIHJlamVjdGVkIHdpdGggdGhlIGZvbGxvd2luZyBlcnJvcjpgLFxyXG4gICAgICAgICAgZXJyb3JcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3T3B0aW9uT2JqID0gdGhpcy5fYWRkU2luZ2xlSXRlbShvcHRpb25WYWx1ZSk7XHJcbiAgICByZXR1cm4gbmV3T3B0aW9uT2JqO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJBbGxTZWxlY3RlZChyZXBvcHVsYXRlR3JvdXBzID0gZmFsc2UpOiBhbnlbXSB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5fc2VsZWN0ZWRJdGVtcygpKSB7XHJcbiAgICAgIGl0ZW0uc2VsZWN0ZWQuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlbW92ZWRJdGVtVmFsdWVzID0gdGhpcy5faXRlbXNUb1ZhbHVlKHRoaXMuX3NlbGVjdGVkSXRlbXMoKSk7XHJcbiAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zLnNldChbXSk7XHJcblxyXG4gICAgaWYgKHJlcG9wdWxhdGVHcm91cHMgJiYgdGhpcy5fYXJkUGFyZW50Q29tcC5oaWRlU2VsZWN0ZWQoKSkgdGhpcy5fcG9wdWxhdGVHcm91cHMoKTtcclxuXHJcbiAgICByZXR1cm4gcmVtb3ZlZEl0ZW1WYWx1ZXM7XHJcbiAgfVxyXG4gIGNsZWFyTGFzdFNlbGVjdGVkKCk6IEFyZE9wdGlvbiB7XHJcbiAgICBjb25zdCBpdGVtID0gdGhpcy5fc2VsZWN0ZWRJdGVtcygpLmxhc3QoKTtcclxuICAgIGlmICghaXRlbSkgcmV0dXJuIGl0ZW07XHJcbiAgICB0aGlzLnVuc2VsZWN0SXRlbShpdGVtKTtcclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuICBzZWxlY3RJdGVtKC4uLml0ZW1zOiBBcmRPcHRpb25bXSk6IFthbnlbXSwgYW55W10sIGFueVtdXSB7XHJcbiAgICBpZiAodGhpcy5pc0l0ZW1MaW1pdFJlYWNoZWQoKSkge1xyXG4gICAgICByZXR1cm4gW1tdLCBbXSwgdGhpcy5faXRlbXNUb1ZhbHVlKGl0ZW1zKV07XHJcbiAgICB9XHJcbiAgICBsZXQgdW5zZWxlY3RlZCA9IFtdO1xyXG4gICAgaWYgKCF0aGlzLl9hcmRQYXJlbnRDb21wLm11bHRpc2VsZWN0YWJsZSgpKSB7XHJcbiAgICAgIHVuc2VsZWN0ZWQgPSB0aGlzLmNsZWFyQWxsU2VsZWN0ZWQoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpdGVtc1NlbGVjdGVkQ291bnQgPSAwO1xyXG4gICAgY29uc3QgaXRlbXNTZWxlY3RlZCA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgIGl0ZW1zU2VsZWN0ZWRDb3VudCsrO1xyXG4gICAgICBpZiAoaXRlbS5zZWxlY3RlZCgpKSBjb250aW51ZTtcclxuICAgICAgaWYgKHRoaXMuaXNJdGVtTGltaXRSZWFjaGVkKCkpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBpdGVtLnNlbGVjdGVkLnNldCh0cnVlKTtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRJdGVtcy51cGRhdGUodiA9PiBbLi4udiwgaXRlbV0pO1xyXG4gICAgICBpdGVtc1NlbGVjdGVkLnB1c2goaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuaGlkZVNlbGVjdGVkKCkpIHtcclxuICAgICAgdGhpcy5fcG9wdWxhdGVHcm91cHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpdGVtc0ZhaWxlZFRvU2VsZWN0ID0gaXRlbXMuc2xpY2UoaXRlbXNTZWxlY3RlZENvdW50IC0gMSk7XHJcbiAgICByZXR1cm4gW3RoaXMuX2l0ZW1zVG9WYWx1ZShpdGVtc1NlbGVjdGVkKSwgdW5zZWxlY3RlZCwgdGhpcy5faXRlbXNUb1ZhbHVlKGl0ZW1zRmFpbGVkVG9TZWxlY3QpXTtcclxuICB9XHJcbiAgdW5zZWxlY3RJdGVtKC4uLml0ZW1zOiBBcmRPcHRpb25bXSk6IGFueVtdIHtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBpZiAoIWl0ZW0uc2VsZWN0ZWQoKSkgY29udGludWU7XHJcbiAgICAgIGl0ZW0uc2VsZWN0ZWQuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NlbGVjdGVkSXRlbXMudXBkYXRlKHYgPT4gdi5maWx0ZXIodiA9PiB2LnNlbGVjdGVkKCkpKTtcclxuXHJcbiAgICBpZiAodGhpcy5fYXJkUGFyZW50Q29tcC5oaWRlU2VsZWN0ZWQoKSkge1xyXG4gICAgICB0aGlzLl9wb3B1bGF0ZUdyb3VwcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9pdGVtc1RvVmFsdWUoaXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJBbGxIaWdobGlnaHRzKCk6IHZvaWQge1xyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMoKSkge1xyXG4gICAgICBpdGVtLmhpZ2hsaWdodGVkLnNldChmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuX2hpZ2hsaWdodGVkR3JvdXBzKCkpIHtcclxuICAgICAgZ3JvdXAuaGlnaGxpZ2h0ZWQuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMuc2V0KFtdKTtcclxuICAgIHRoaXMuX2hpZ2hsaWdodGVkR3JvdXBzLnNldChbXSk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodEdyb3VwKGdyb3VwOiBBcmRPcHRpb25Hcm91cCk6IEFyZE9wdGlvbiB7XHJcbiAgICB0aGlzLmNsZWFyQWxsSGlnaGxpZ2h0cygpO1xyXG4gICAgZ3JvdXAuaGlnaGxpZ2h0ZWQuc2V0KHRydWUpO1xyXG4gICAgdGhpcy5oaWdobGlnaHRJdGVtKC4uLmdyb3VwLmNoaWxkcmVuKCkpO1xyXG4gICAgcmV0dXJuIGdyb3VwLmNoaWxkcmVuKCkuZmlyc3QoKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0U2luZ2xlSXRlbShpdGVtOiBBcmRPcHRpb24pOiBBcmRPcHRpb24gfCBudWxsIHtcclxuICAgIGlmICghaXRlbSB8fCBpdGVtLmRpc2FibGVkKCkpIHJldHVybiBudWxsO1xyXG4gICAgdGhpcy5jbGVhckFsbEhpZ2hsaWdodHMoKTtcclxuICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodEl0ZW0oaXRlbSk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvbltdKTogQXJkT3B0aW9uIHtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBpdGVtLmhpZ2hsaWdodGVkLnNldCh0cnVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMudXBkYXRlKHYgPT4gWy4uLnYsIC4uLml0ZW1zXSk7XHJcbiAgICByZXR1cm4gaXRlbXMubGFzdCgpO1xyXG4gIH1cclxuICB1bmhpZ2hsaWdodEl0ZW0oLi4uaXRlbXM6IEFyZE9wdGlvbltdKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaWYgKCFpdGVtIHx8ICFpdGVtLmhpZ2hsaWdodGVkKSByZXR1cm47XHJcblxyXG4gICAgICBpdGVtLmhpZ2hsaWdodGVkLnNldChmYWxzZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9oaWdobGlnaHRlZEl0ZW1zLnVwZGF0ZSh2ID0+IHYuZmlsdGVyKHYgPT4gdi5oaWdobGlnaHRlZCgpKSk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodEZpcnN0SXRlbSgpOiBBcmRPcHRpb24gfCBudWxsIHtcclxuICAgIHRoaXMuY2xlYXJBbGxIaWdobGlnaHRzKCk7XHJcbiAgICBjb25zdCBpdGVtc1RvSGlnaGxpZ2h0ID0gdGhpcy5fZ2V0SGlnbGlnaHRhYmxlSXRlbXMoKTtcclxuICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodFNpbmdsZUl0ZW0oaXRlbXNUb0hpZ2hsaWdodC5maXJzdCgpKTtcclxuICB9XHJcbiAgaGlnaGxpZ2h0TGFzdEl0ZW0oKTogQXJkT3B0aW9uIHwgbnVsbCB7XHJcbiAgICB0aGlzLmNsZWFyQWxsSGlnaGxpZ2h0cygpO1xyXG4gICAgY29uc3QgaXRlbXNUb0hpZ2hsaWdodCA9IHRoaXMuX2dldEhpZ2xpZ2h0YWJsZUl0ZW1zKCk7XHJcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRTaW5nbGVJdGVtKGl0ZW1zVG9IaWdobGlnaHQubGFzdCgpKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfZ2V0SGlnbGlnaHRhYmxlSXRlbXMoKTogQXJkT3B0aW9uW10ge1xyXG4gICAgbGV0IGl0ZW1zVG9IaWdobGlnaHQgPSB0aGlzLl9maWx0ZXJlZEl0ZW1zKCkuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQoKSk7XHJcbiAgICBpZiAodGhpcy5fYXJkUGFyZW50Q29tcC5oaWRlU2VsZWN0ZWQoKSkge1xyXG4gICAgICBpdGVtc1RvSGlnaGxpZ2h0ID0gaXRlbXNUb0hpZ2hsaWdodC5maWx0ZXIoaXRlbSA9PiAhaXRlbS5zZWxlY3RlZCgpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpdGVtc1RvSGlnaGxpZ2h0O1xyXG4gIH1cclxuICBoaWdobGlnaHRBbGxJdGVtcygpOiB2b2lkIHtcclxuICAgIHRoaXMuaGlnaGxpZ2h0SXRlbSguLi50aGlzLl9nZXRIaWdsaWdodGFibGVJdGVtcygpKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfY2xlYXJSZWNlbnRseUhpZ2hsaWdodGVkKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3JlY2VudGx5SGlnaGxpZ2h0ZWRJdGVtKCkpIHtcclxuICAgICAgdGhpcy5fcmVjZW50bHlIaWdobGlnaHRlZEl0ZW0oKSEuaGlnaGxpZ2h0ZWRfcmVjZW50bHkuc2V0KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcbiAgc2V0UmVjZW50bHlIaWdobGlnaHRlZChpdGVtOiBBcmRPcHRpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NsZWFyUmVjZW50bHlIaWdobGlnaHRlZCgpO1xyXG4gICAgaXRlbS5oaWdobGlnaHRlZF9yZWNlbnRseS5zZXQodHJ1ZSk7XHJcbiAgICB0aGlzLl9yZWNlbnRseUhpZ2hsaWdodGVkSXRlbS5zZXQoaXRlbSk7XHJcbiAgfVxyXG4gIGhpZ2hsaWdodE5leHRJdGVtKG9mZnNldDogbnVtYmVyLCBoYXNTaGlmdD86IGJvb2xlYW4pOiBBcmRPcHRpb24gfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5pc0FueUl0ZW1IaWdobGlnaHRlZCgpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodEZpcnN0SXRlbSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY3VycmVudEl0ZW0gPSB0aGlzLmhpZ2hsaWdodGVkSXRlbXMoKS5sYXN0KCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRhYmxlSXRlbXMgPSB0aGlzLl9nZXRIaWdsaWdodGFibGVJdGVtcygpO1xyXG4gICAgY29uc3QgY3VycmVudEluZGV4SW5GaWx0ZXJlZCA9IGhpZ2hsaWdodGFibGVJdGVtcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmluZGV4ID09PSBjdXJyZW50SXRlbS5pbmRleCk7XHJcblxyXG4gICAgbGV0IG5leHRJdGVtSW5kZXggPSBjdXJyZW50SW5kZXhJbkZpbHRlcmVkICsgb2Zmc2V0O1xyXG4gICAgaWYgKG5leHRJdGVtSW5kZXggPj0gaGlnaGxpZ2h0YWJsZUl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICBuZXh0SXRlbUluZGV4IC09IGhpZ2hsaWdodGFibGVJdGVtcy5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBpZiAobmV4dEl0ZW1JbmRleCA8IDApIHtcclxuICAgICAgbmV4dEl0ZW1JbmRleCArPSBoaWdobGlnaHRhYmxlSXRlbXMubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaXRlbVRvSGlnaGxpZ2h0ID0gaGlnaGxpZ2h0YWJsZUl0ZW1zW25leHRJdGVtSW5kZXhdO1xyXG5cclxuICAgIGlmIChoYXNTaGlmdCAmJiB0aGlzLl9hcmRQYXJlbnRDb21wLm11bHRpc2VsZWN0YWJsZSgpKSB7XHJcbiAgICAgIGlmIChpdGVtVG9IaWdobGlnaHQuaGlnaGxpZ2h0ZWQoKSkge1xyXG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRJdGVtKGN1cnJlbnRJdGVtKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRJdGVtKGl0ZW1Ub0hpZ2hsaWdodCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRTaW5nbGVJdGVtKGl0ZW1Ub0hpZ2hsaWdodCk7XHJcbiAgfVxyXG4gIGZpbHRlcihmaWx0ZXJUZXJtOiBzdHJpbmcpOiBhbnlbXSB7XHJcbiAgICBpZiAoIWZpbHRlclRlcm0pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zVG9WYWx1ZSh0aGlzLnJlc2V0RmlsdGVyZWQoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuX2FyZFBhcmVudENvbXAuc2VhcmNoQ2FzZVNlbnNpdGl2ZSgpKSB7XHJcbiAgICAgIGZpbHRlclRlcm0gPSBmaWx0ZXJUZXJtLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VhcmNoRm4gPSB0aGlzLl9hcmRQYXJlbnRDb21wLnNlYXJjaEZuKCk7XHJcbiAgICBjb25zdCBuZXdGaWx0ZXJlZEl0ZW1zID0gdGhpcy5faXRlbXMoKS5maWx0ZXIoaXRlbSA9PiBzZWFyY2hGbihmaWx0ZXJUZXJtLCBpdGVtKSk7XHJcbiAgICB0aGlzLl9maWx0ZXJlZEl0ZW1zLnNldChuZXdGaWx0ZXJlZEl0ZW1zKTtcclxuXHJcbiAgICB0aGlzLl9wb3B1bGF0ZUdyb3VwcygpO1xyXG5cclxuICAgIGlmICghdGhpcy5pc05vSXRlbXNGb3VuZCkgdGhpcy5oaWdobGlnaHRGaXJzdEl0ZW0oKTtcclxuICAgIGVsc2UgdGhpcy5jbGVhckFsbEhpZ2hsaWdodHMoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5faXRlbXNUb1ZhbHVlKG5ld0ZpbHRlcmVkSXRlbXMpO1xyXG4gIH1cclxuICByZXNldEZpbHRlcmVkKCk6IEFyZE9wdGlvbltdIHtcclxuICAgIGlmICh0aGlzLl9maWx0ZXJlZEl0ZW1zKCkubGVuZ3RoID09PSB0aGlzLl9pdGVtcygpLmxlbmd0aCkgcmV0dXJuIHRoaXMuX2l0ZW1zKCk7XHJcblxyXG4gICAgbGV0IG5ld0ZpbHRlcmVkSXRlbXMgPSB0aGlzLl9pdGVtcygpO1xyXG4gICAgaWYgKHRoaXMuX2FyZFBhcmVudENvbXAuaGlkZVNlbGVjdGVkKCkgJiYgdGhpcy5pc0FueUl0ZW1TZWxlY3RlZCgpKSB7XHJcbiAgICAgIG5ld0ZpbHRlcmVkSXRlbXMgPSBuZXdGaWx0ZXJlZEl0ZW1zLmZpbHRlcihpdGVtID0+ICFpdGVtLnNlbGVjdGVkKCkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcG9wdWxhdGVHcm91cHMoKTtcclxuICAgIHJldHVybiBuZXdGaWx0ZXJlZEl0ZW1zO1xyXG4gIH1cclxufVxyXG4iXX0=