@sbb-esta/lyne-elements 3.12.0 → 4.0.0-next

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 (758) hide show
  1. package/accordion/accordion.component.d.ts.map +1 -1
  2. package/accordion/accordion.component.js +18 -17
  3. package/action-group/action-group.component.d.ts.map +1 -1
  4. package/action-group/action-group.component.js +52 -51
  5. package/alert/alert/alert.component.d.ts +1 -6
  6. package/alert/alert/alert.component.d.ts.map +1 -1
  7. package/alert/alert/alert.component.js +44 -55
  8. package/alert/alert-group/alert-group.component.d.ts.map +1 -1
  9. package/alert/alert-group/alert-group.component.js +21 -20
  10. package/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  11. package/autocomplete/autocomplete-base-element.js +59 -58
  12. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.d.ts.map +1 -1
  13. package/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +26 -25
  14. package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.d.ts.map +1 -1
  15. package/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +13 -12
  16. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts.map +1 -1
  17. package/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +8 -7
  18. package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.d.ts.map +1 -1
  19. package/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +8 -7
  20. package/breadcrumb/breadcrumb/breadcrumb.component.d.ts.map +1 -1
  21. package/breadcrumb/breadcrumb/breadcrumb.component.js +8 -8
  22. package/breadcrumb/breadcrumb-group/breadcrumb-group.component.d.ts.map +1 -1
  23. package/breadcrumb/breadcrumb-group/breadcrumb-group.component.js +13 -12
  24. package/button/accent-button/accent-button.component.d.ts.map +1 -1
  25. package/button/accent-button/accent-button.component.js +12 -7
  26. package/button/accent-button-link/accent-button-link.component.d.ts.map +1 -1
  27. package/button/accent-button-link/accent-button-link.component.js +10 -5
  28. package/button/accent-button-static/accent-button-static.component.d.ts.map +1 -1
  29. package/button/accent-button-static/accent-button-static.component.js +13 -8
  30. package/button/button/button.component.d.ts.map +1 -1
  31. package/button/button/button.component.js +15 -10
  32. package/button/button-link/button-link.component.d.ts.map +1 -1
  33. package/button/button-link/button-link.component.js +14 -9
  34. package/button/button-static/button-static.component.d.ts.map +1 -1
  35. package/button/button-static/button-static.component.js +14 -9
  36. package/button/common/button-common.d.ts.map +1 -1
  37. package/button/common/button-common.js +12 -12
  38. package/button/common.d.ts.map +1 -1
  39. package/button/common.js +8 -7
  40. package/button/mini-button/mini-button.component.d.ts.map +1 -1
  41. package/button/mini-button/mini-button.component.js +19 -18
  42. package/button/mini-button-group/mini-button-group.component.d.ts.map +1 -1
  43. package/button/mini-button-group/mini-button-group.component.js +23 -22
  44. package/button/secondary-button/secondary-button.component.d.ts.map +1 -1
  45. package/button/secondary-button/secondary-button.component.js +12 -7
  46. package/button/secondary-button-link/secondary-button-link.component.d.ts.map +1 -1
  47. package/button/secondary-button-link/secondary-button-link.component.js +13 -8
  48. package/button/secondary-button-static/secondary-button-static.component.d.ts.map +1 -1
  49. package/button/secondary-button-static/secondary-button-static.component.js +14 -9
  50. package/button/transparent-button/transparent-button.component.d.ts.map +1 -1
  51. package/button/transparent-button/transparent-button.component.js +13 -8
  52. package/button/transparent-button-link/transparent-button-link.component.d.ts.map +1 -1
  53. package/button/transparent-button-link/transparent-button-link.component.js +13 -8
  54. package/button/transparent-button-static/transparent-button-static.component.d.ts.map +1 -1
  55. package/button/transparent-button-static/transparent-button-static.component.js +16 -11
  56. package/button.js +11 -10
  57. package/calendar/calendar.component.d.ts.map +1 -1
  58. package/calendar/calendar.component.js +150 -149
  59. package/card/card/card.component.d.ts.map +1 -1
  60. package/card/card/card.component.js +17 -16
  61. package/card/card-badge/card-badge.component.d.ts.map +1 -1
  62. package/card/card-badge/card-badge.component.js +17 -16
  63. package/card/common/card-action-common.d.ts.map +1 -1
  64. package/card/common/card-action-common.js +4 -3
  65. package/carousel/carousel/carousel.component.d.ts.map +1 -1
  66. package/carousel/carousel/carousel.component.js +33 -32
  67. package/carousel/carousel-item/carousel-item.component.js +8 -8
  68. package/carousel/carousel-list/carousel-list.component.js +4 -4
  69. package/checkbox/checkbox/checkbox.component.d.ts +1 -1
  70. package/checkbox/checkbox/checkbox.component.d.ts.map +1 -1
  71. package/checkbox/checkbox/checkbox.component.js +22 -17
  72. package/checkbox/checkbox-group/checkbox-group.component.d.ts +1 -1
  73. package/checkbox/checkbox-group/checkbox-group.component.d.ts.map +1 -1
  74. package/checkbox/checkbox-group/checkbox-group.component.js +37 -36
  75. package/checkbox/checkbox-panel/checkbox-panel.component.d.ts.map +1 -1
  76. package/checkbox/checkbox-panel/checkbox-panel.component.js +20 -15
  77. package/checkbox/common.js +1 -1
  78. package/checkbox-common-BGA_q9nc.js +5 -0
  79. package/checkbox.js +1 -1
  80. package/chip/chip/chip.component.d.ts.map +1 -1
  81. package/chip/chip/chip.component.js +20 -19
  82. package/chip/chip-group/chip-group.component.d.ts.map +1 -1
  83. package/chip/chip-group/chip-group.component.js +11 -10
  84. package/chip-label/chip-label.component.d.ts.map +1 -1
  85. package/chip-label/chip-label.component.js +5 -4
  86. package/clock/clock.component.d.ts.map +1 -1
  87. package/clock/clock.component.js +24 -23
  88. package/container/container/container.component.d.ts +3 -1
  89. package/container/container/container.component.d.ts.map +1 -1
  90. package/container/container/container.component.js +27 -25
  91. package/container/sticky-bar/sticky-bar.component.d.ts.map +1 -1
  92. package/container/sticky-bar/sticky-bar.component.js +25 -24
  93. package/core/controllers/media-matchers-controller.d.ts +2 -2
  94. package/core/controllers/media-matchers-controller.d.ts.map +1 -1
  95. package/core/controllers/media-matchers-controller.js +22 -22
  96. package/core/controllers/slot-state-controller.d.ts +26 -14
  97. package/core/controllers/slot-state-controller.d.ts.map +1 -1
  98. package/core/controllers/slot-state-controller.js +28 -22
  99. package/core/controllers.js +17 -16
  100. package/core/decorators.d.ts +0 -1
  101. package/core/decorators.d.ts.map +1 -1
  102. package/core/decorators.js +5 -7
  103. package/core/dom/breakpoint.d.ts +1 -1
  104. package/core/dom/breakpoint.d.ts.map +1 -1
  105. package/core/dom/breakpoint.js +4 -4
  106. package/core/i18n/i18n.js +6 -6
  107. package/core/interfaces/types.d.ts +1 -1
  108. package/core/interfaces/types.d.ts.map +1 -1
  109. package/core/mixins/element-internals-mixin.d.ts.map +1 -1
  110. package/core/mixins/element-internals-mixin.js +9 -8
  111. package/core/mixins/form-associated-input-mixin.d.ts.map +1 -1
  112. package/core/mixins/form-associated-input-mixin.js +55 -38
  113. package/core/mixins.js +5 -5
  114. package/core/styles/_index.scss +0 -1
  115. package/core/styles/box-sizing.scss +3 -0
  116. package/core/styles/core/mediaqueries.scss +6 -12
  117. package/core/styles/core.scss +85 -74
  118. package/core/styles/mixins/buttons.scss +0 -171
  119. package/core/styles/mixins/card.scss +1 -2
  120. package/core/styles/mixins/lists.scss +1 -1
  121. package/core/styles/mixins/panel.scss +1 -1
  122. package/core/styles/{node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables_css--mixin.scss → node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables-as-css.scss} +194 -460
  123. package/core/styles/node_modules_@sbb-esta_lyne-design-tokens_dist_scss_sbb-variables.scss +10 -217
  124. package/core/styles.d.ts +4 -0
  125. package/core/styles.d.ts.map +1 -0
  126. package/core/styles.js +5 -0
  127. package/core.css +163 -475
  128. package/custom-elements.json +2978 -2171
  129. package/date-input/date-input.component.js +1 -1
  130. package/datepicker/datepicker/datepicker.component.d.ts +1 -1
  131. package/datepicker/datepicker/datepicker.component.d.ts.map +1 -1
  132. package/datepicker/datepicker-next-day/datepicker-next-day.component.d.ts.map +1 -1
  133. package/datepicker/datepicker-next-day/datepicker-next-day.component.js +24 -22
  134. package/datepicker/datepicker-previous-day/datepicker-previous-day.component.d.ts.map +1 -1
  135. package/datepicker/datepicker-previous-day/datepicker-previous-day.component.js +25 -23
  136. package/datepicker/datepicker-toggle/datepicker-toggle.component.d.ts.map +1 -1
  137. package/datepicker/datepicker-toggle/datepicker-toggle.component.js +29 -27
  138. package/development/accordion/accordion.component.d.ts.map +1 -1
  139. package/development/accordion/accordion.component.js +4 -9
  140. package/development/action-group/action-group.component.d.ts.map +1 -1
  141. package/development/action-group/action-group.component.js +5 -88
  142. package/development/alert/alert/alert.component.d.ts +1 -6
  143. package/development/alert/alert/alert.component.d.ts.map +1 -1
  144. package/development/alert/alert/alert.component.js +12 -35
  145. package/development/alert/alert-group/alert-group.component.d.ts.map +1 -1
  146. package/development/alert/alert-group/alert-group.component.js +4 -9
  147. package/development/autocomplete/autocomplete-base-element.d.ts.map +1 -1
  148. package/development/autocomplete/autocomplete-base-element.js +8 -13
  149. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.d.ts.map +1 -1
  150. package/development/autocomplete-grid/autocomplete-grid-button/autocomplete-grid-button.component.js +7 -120
  151. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.d.ts.map +1 -1
  152. package/development/autocomplete-grid/autocomplete-grid-cell/autocomplete-grid-cell.component.js +4 -9
  153. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.d.ts.map +1 -1
  154. package/development/autocomplete-grid/autocomplete-grid-option/autocomplete-grid-option.component.js +5 -10
  155. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.d.ts.map +1 -1
  156. package/development/autocomplete-grid/autocomplete-grid-row/autocomplete-grid-row.component.js +6 -11
  157. package/development/breadcrumb/breadcrumb/breadcrumb.component.d.ts.map +1 -1
  158. package/development/breadcrumb/breadcrumb/breadcrumb.component.js +7 -13
  159. package/development/breadcrumb/breadcrumb-group/breadcrumb-group.component.d.ts.map +1 -1
  160. package/development/breadcrumb/breadcrumb-group/breadcrumb-group.component.js +5 -10
  161. package/development/button/accent-button/accent-button.component.d.ts.map +1 -1
  162. package/development/button/accent-button/accent-button.component.js +7 -2
  163. package/development/button/accent-button-link/accent-button-link.component.d.ts.map +1 -1
  164. package/development/button/accent-button-link/accent-button-link.component.js +7 -2
  165. package/development/button/accent-button-static/accent-button-static.component.d.ts.map +1 -1
  166. package/development/button/accent-button-static/accent-button-static.component.js +7 -2
  167. package/development/button/button/button.component.d.ts.map +1 -1
  168. package/development/button/button/button.component.js +7 -2
  169. package/development/button/button-link/button-link.component.d.ts.map +1 -1
  170. package/development/button/button-link/button-link.component.js +7 -2
  171. package/development/button/button-static/button-static.component.d.ts.map +1 -1
  172. package/development/button/button-static/button-static.component.js +7 -2
  173. package/development/button/common/button-common.d.ts.map +1 -1
  174. package/development/button/common/button-common.js +3 -3
  175. package/development/button/common.d.ts.map +1 -1
  176. package/development/button/common.js +3 -2
  177. package/development/button/mini-button/mini-button.component.d.ts.map +1 -1
  178. package/development/button/mini-button/mini-button.component.js +11 -126
  179. package/development/button/mini-button-group/mini-button-group.component.d.ts.map +1 -1
  180. package/development/button/mini-button-group/mini-button-group.component.js +4 -9
  181. package/development/button/secondary-button/secondary-button.component.d.ts.map +1 -1
  182. package/development/button/secondary-button/secondary-button.component.js +7 -2
  183. package/development/button/secondary-button-link/secondary-button-link.component.d.ts.map +1 -1
  184. package/development/button/secondary-button-link/secondary-button-link.component.js +7 -2
  185. package/development/button/secondary-button-static/secondary-button-static.component.d.ts.map +1 -1
  186. package/development/button/secondary-button-static/secondary-button-static.component.js +7 -2
  187. package/development/button/transparent-button/transparent-button.component.d.ts.map +1 -1
  188. package/development/button/transparent-button/transparent-button.component.js +7 -2
  189. package/development/button/transparent-button-link/transparent-button-link.component.d.ts.map +1 -1
  190. package/development/button/transparent-button-link/transparent-button-link.component.js +7 -2
  191. package/development/button/transparent-button-static/transparent-button-static.component.d.ts.map +1 -1
  192. package/development/button/transparent-button-static/transparent-button-static.component.js +7 -2
  193. package/development/button.js +3 -2
  194. package/development/calendar/calendar.component.d.ts.map +1 -1
  195. package/development/calendar/calendar.component.js +10 -15
  196. package/development/card/card/card.component.d.ts.map +1 -1
  197. package/development/card/card/card.component.js +5 -10
  198. package/development/card/card-badge/card-badge.component.d.ts.map +1 -1
  199. package/development/card/card-badge/card-badge.component.js +4 -9
  200. package/development/card/common/card-action-common.d.ts.map +1 -1
  201. package/development/card/common/card-action-common.js +5 -10
  202. package/development/carousel/carousel/carousel.component.d.ts.map +1 -1
  203. package/development/carousel/carousel/carousel.component.js +5 -10
  204. package/development/carousel/carousel-item/carousel-item.component.js +2 -8
  205. package/development/carousel/carousel-list/carousel-list.component.js +2 -8
  206. package/development/checkbox/checkbox/checkbox.component.d.ts +1 -1
  207. package/development/checkbox/checkbox/checkbox.component.d.ts.map +1 -1
  208. package/development/checkbox/checkbox/checkbox.component.js +13 -8
  209. package/development/checkbox/checkbox-group/checkbox-group.component.d.ts +1 -1
  210. package/development/checkbox/checkbox-group/checkbox-group.component.d.ts.map +1 -1
  211. package/development/checkbox/checkbox-group/checkbox-group.component.js +9 -50
  212. package/development/checkbox/checkbox-panel/checkbox-panel.component.d.ts.map +1 -1
  213. package/development/checkbox/checkbox-panel/checkbox-panel.component.js +9 -4
  214. package/development/checkbox/common.js +1 -1
  215. package/development/{checkbox-common-Dy_ofVhp.js → checkbox-common-BZFJgZd7.js} +3 -9
  216. package/development/checkbox.js +1 -1
  217. package/development/chip/chip/chip.component.d.ts.map +1 -1
  218. package/development/chip/chip/chip.component.js +9 -14
  219. package/development/chip/chip-group/chip-group.component.d.ts.map +1 -1
  220. package/development/chip/chip-group/chip-group.component.js +5 -10
  221. package/development/chip-label/chip-label.component.d.ts.map +1 -1
  222. package/development/chip-label/chip-label.component.js +4 -9
  223. package/development/clock/clock.component.d.ts.map +1 -1
  224. package/development/clock/clock.component.js +4 -9
  225. package/development/container/container/container.component.d.ts +3 -1
  226. package/development/container/container/container.component.d.ts.map +1 -1
  227. package/development/container/container/container.component.js +11 -15
  228. package/development/container/sticky-bar/sticky-bar.component.d.ts.map +1 -1
  229. package/development/container/sticky-bar/sticky-bar.component.js +5 -10
  230. package/development/core/controllers/media-matchers-controller.d.ts +2 -2
  231. package/development/core/controllers/media-matchers-controller.d.ts.map +1 -1
  232. package/development/core/controllers/media-matchers-controller.js +6 -6
  233. package/development/core/controllers/slot-state-controller.d.ts +26 -14
  234. package/development/core/controllers/slot-state-controller.d.ts.map +1 -1
  235. package/development/core/controllers/slot-state-controller.js +48 -41
  236. package/development/core/controllers.js +6 -5
  237. package/development/core/decorators.d.ts +0 -1
  238. package/development/core/decorators.d.ts.map +1 -1
  239. package/development/core/decorators.js +2 -4
  240. package/development/core/dom/breakpoint.d.ts +1 -1
  241. package/development/core/dom/breakpoint.d.ts.map +1 -1
  242. package/development/core/dom/breakpoint.js +2 -2
  243. package/development/core/i18n/i18n.js +7 -7
  244. package/development/core/interfaces/types.d.ts +1 -1
  245. package/development/core/interfaces/types.d.ts.map +1 -1
  246. package/development/core/mixins/element-internals-mixin.d.ts.map +1 -1
  247. package/development/core/mixins/element-internals-mixin.js +3 -1
  248. package/development/core/mixins/form-associated-input-mixin.d.ts.map +1 -1
  249. package/development/core/mixins/form-associated-input-mixin.js +47 -12
  250. package/development/core/mixins.js +3 -3
  251. package/development/core/styles.d.ts +4 -0
  252. package/development/core/styles.d.ts.map +1 -0
  253. package/development/core/styles.js +10 -0
  254. package/development/date-input/date-input.component.js +1 -1
  255. package/development/datepicker/datepicker/datepicker.component.d.ts +1 -1
  256. package/development/datepicker/datepicker/datepicker.component.d.ts.map +1 -1
  257. package/development/datepicker/datepicker/datepicker.component.js +1 -1
  258. package/development/datepicker/datepicker-next-day/datepicker-next-day.component.d.ts.map +1 -1
  259. package/development/datepicker/datepicker-next-day/datepicker-next-day.component.js +5 -113
  260. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.component.d.ts.map +1 -1
  261. package/development/datepicker/datepicker-previous-day/datepicker-previous-day.component.js +5 -113
  262. package/development/datepicker/datepicker-toggle/datepicker-toggle.component.d.ts.map +1 -1
  263. package/development/datepicker/datepicker-toggle/datepicker-toggle.component.js +5 -113
  264. package/development/dialog/dialog/dialog.component.d.ts.map +1 -1
  265. package/development/dialog/dialog/dialog.component.js +9 -19
  266. package/development/dialog/dialog-actions/dialog-actions.component.js +2 -8
  267. package/development/dialog/dialog-close-button/dialog-close-button.component.d.ts +1 -0
  268. package/development/dialog/dialog-close-button/dialog-close-button.component.d.ts.map +1 -1
  269. package/development/dialog/dialog-close-button/dialog-close-button.component.js +5 -9
  270. package/development/dialog/dialog-content/dialog-content.component.js +2 -8
  271. package/development/divider/divider.component.d.ts.map +1 -1
  272. package/development/divider/divider.component.js +4 -9
  273. package/development/expansion-panel/expansion-panel/expansion-panel.component.d.ts.map +1 -1
  274. package/development/expansion-panel/expansion-panel/expansion-panel.component.js +5 -10
  275. package/development/expansion-panel/expansion-panel-content/expansion-panel-content.component.d.ts.map +1 -1
  276. package/development/expansion-panel/expansion-panel-content/expansion-panel-content.component.js +6 -11
  277. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.d.ts +2 -3
  278. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.d.ts.map +1 -1
  279. package/development/expansion-panel/expansion-panel-header/expansion-panel-header.component.js +13 -18
  280. package/development/file-selector/common.js +1 -1
  281. package/development/file-selector/file-selector/file-selector.component.d.ts.map +1 -1
  282. package/development/file-selector/file-selector/file-selector.component.js +4 -4
  283. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.d.ts.map +1 -1
  284. package/development/file-selector/file-selector-dropzone/file-selector-dropzone.component.js +6 -11
  285. package/development/{file-selector-common-CRNAWFM_.js → file-selector-common-CsFa5XJ-.js} +3 -9
  286. package/development/file-selector.js +1 -1
  287. package/development/flip-card/flip-card/flip-card.component.d.ts.map +1 -1
  288. package/development/flip-card/flip-card/flip-card.component.js +9 -14
  289. package/development/flip-card/flip-card-details/flip-card-details.component.d.ts.map +1 -1
  290. package/development/flip-card/flip-card-details/flip-card-details.component.js +4 -9
  291. package/development/flip-card/flip-card-summary/flip-card-summary.component.d.ts.map +1 -1
  292. package/development/flip-card/flip-card-summary/flip-card-summary.component.js +7 -12
  293. package/development/footer/footer.component.d.ts.map +1 -1
  294. package/development/footer/footer.component.js +8 -13
  295. package/development/form-error/form-error.component.d.ts.map +1 -1
  296. package/development/form-error/form-error.component.js +4 -9
  297. package/development/form-field/form-field/form-field.component.d.ts.map +1 -1
  298. package/development/form-field/form-field/form-field.component.js +11 -16
  299. package/development/form-field/form-field-clear/form-field-clear.component.d.ts.map +1 -1
  300. package/development/form-field/form-field-clear/form-field-clear.component.js +6 -118
  301. package/development/header/common/header-action-common.d.ts.map +1 -1
  302. package/development/header/common/header-action-common.js +24 -109
  303. package/development/header/header/header.component.d.ts +1 -1
  304. package/development/header/header/header.component.d.ts.map +1 -1
  305. package/development/header/header/header.component.js +6 -11
  306. package/development/header/header-environment/header-environment.component.d.ts.map +1 -1
  307. package/development/header/header-environment/header-environment.component.js +4 -9
  308. package/development/icon/icon-base.d.ts.map +1 -1
  309. package/development/icon/icon-base.js +4 -9
  310. package/development/icon/icon-name-mixin.d.ts +3 -2
  311. package/development/icon/icon-name-mixin.d.ts.map +1 -1
  312. package/development/icon/icon-name-mixin.js +12 -3
  313. package/development/{icon-sidebar-button-common-BGrKtvyM.js → icon-sidebar-button-common-C6QChtaa.js} +5 -23
  314. package/development/image/image.component.d.ts +1 -1
  315. package/development/image/image.component.d.ts.map +1 -1
  316. package/development/image/image.component.js +7 -18
  317. package/development/journey-header/journey-header.component.d.ts.map +1 -1
  318. package/development/journey-header/journey-header.component.js +4 -9
  319. package/development/lead-container/lead-container.component.d.ts.map +1 -1
  320. package/development/lead-container/lead-container.component.js +6 -24
  321. package/development/link/common/block-link-common.d.ts.map +1 -1
  322. package/development/link/common/block-link-common.js +5 -4
  323. package/development/link/common/inline-link-common.d.ts.map +1 -1
  324. package/development/link/common/inline-link-common.js +4 -3
  325. package/development/link/common/link-common.d.ts.map +1 -1
  326. package/development/link/common/link-common.js +1 -1
  327. package/development/link/common.js +1 -1
  328. package/development/{link-common-BDFF9Oiz.js → link-common-DYZHRSSJ.js} +6 -12
  329. package/development/link-list/common/link-list-base.d.ts.map +1 -1
  330. package/development/link-list/common/link-list-base.js +7 -15
  331. package/development/link-list/common.js +1 -1
  332. package/development/link-list/link-list/link-list.component.d.ts.map +1 -1
  333. package/development/link-list/link-list/link-list.component.js +3 -50
  334. package/development/link-list/link-list-anchor/link-list-anchor.component.d.ts.map +1 -1
  335. package/development/link-list/link-list-anchor/link-list-anchor.component.js +3 -2
  336. package/development/{link-list-base-DC9sc7q5.js → link-list-base-CJJ3qdD7.js} +3 -9
  337. package/development/link-list.js +1 -1
  338. package/development/link.js +1 -1
  339. package/development/loading-indicator/loading-indicator.component.d.ts.map +1 -1
  340. package/development/loading-indicator/loading-indicator.component.js +3 -8
  341. package/development/loading-indicator-circle/loading-indicator-circle.component.d.ts.map +1 -1
  342. package/development/loading-indicator-circle/loading-indicator-circle.component.js +4 -9
  343. package/development/logo/logo.component.d.ts.map +1 -1
  344. package/development/logo/logo.component.js +4 -9
  345. package/development/map-container/map-container.component.d.ts +1 -1
  346. package/development/map-container/map-container.component.d.ts.map +1 -1
  347. package/development/map-container/map-container.component.js +10 -15
  348. package/development/menu/common/menu-action-common.d.ts.map +1 -1
  349. package/development/menu/common/menu-action-common.js +16 -35
  350. package/development/menu/menu/menu.component.d.ts +1 -12
  351. package/development/menu/menu/menu.component.d.ts.map +1 -1
  352. package/development/menu/menu/menu.component.js +17 -65
  353. package/development/message/message.component.d.ts.map +1 -1
  354. package/development/message/message.component.js +4 -9
  355. package/development/{transparent-button-DdSaBp_-.js → mini-button-common-Di32bSJj.js} +114 -17
  356. package/development/mini-calendar/mini-calendar/mini-calendar.component.js +2 -8
  357. package/development/mini-calendar/mini-calendar-day/mini-calendar-day.component.js +2 -8
  358. package/development/mini-calendar/mini-calendar-month/mini-calendar-month.component.d.ts.map +1 -1
  359. package/development/mini-calendar/mini-calendar-month/mini-calendar-month.component.js +4 -9
  360. package/development/navigation/common/navigation-action-common.d.ts.map +1 -1
  361. package/development/navigation/common/navigation-action-common.js +5 -10
  362. package/development/navigation/navigation/navigation.component.d.ts.map +1 -1
  363. package/development/navigation/navigation/navigation.component.js +5 -15
  364. package/development/navigation/navigation-list/navigation-list.component.d.ts.map +1 -1
  365. package/development/navigation/navigation-list/navigation-list.component.js +9 -14
  366. package/development/navigation/navigation-marker/navigation-marker.component.d.ts.map +1 -1
  367. package/development/navigation/navigation-marker/navigation-marker.component.js +4 -9
  368. package/development/navigation/navigation-section/navigation-section.component.d.ts.map +1 -1
  369. package/development/navigation/navigation-section/navigation-section.component.js +10 -20
  370. package/development/notification/notification.component.d.ts +4 -2
  371. package/development/notification/notification.component.d.ts.map +1 -1
  372. package/development/notification/notification.component.js +22 -18
  373. package/development/option/optgroup/optgroup-base-element.d.ts.map +1 -1
  374. package/development/option/optgroup/optgroup-base-element.js +5 -9
  375. package/development/option/option/option-base-element.d.ts.map +1 -1
  376. package/development/option/option/option-base-element.js +6 -14
  377. package/development/option/option/option.component.d.ts.map +1 -1
  378. package/development/option/option/option.component.js +7 -12
  379. package/development/option/option-hint/option-hint.component.d.ts.map +1 -1
  380. package/development/option/option-hint/option-hint.component.js +4 -9
  381. package/development/overlay/overlay.component.d.ts.map +1 -1
  382. package/development/overlay/overlay.component.js +5 -10
  383. package/development/paginator/compact-paginator/compact-paginator.component.d.ts.map +1 -1
  384. package/development/paginator/compact-paginator/compact-paginator.component.js +4 -9
  385. package/development/paginator/paginator/paginator.component.d.ts.map +1 -1
  386. package/development/paginator/paginator/paginator.component.js +6 -11
  387. package/development/popover/popover/popover.component.d.ts +2 -0
  388. package/development/popover/popover/popover.component.d.ts.map +1 -1
  389. package/development/popover/popover/popover.component.js +20 -11
  390. package/development/popover.d.ts +0 -1
  391. package/development/popover.d.ts.map +1 -1
  392. package/development/popover.js +2 -4
  393. package/development/radio-button/common.js +1 -1
  394. package/development/radio-button/radio-button/radio-button.component.d.ts.map +1 -1
  395. package/development/radio-button/radio-button/radio-button.component.js +10 -11
  396. package/development/radio-button/radio-button-group/radio-button-group.component.d.ts.map +1 -1
  397. package/development/radio-button/radio-button-group/radio-button-group.component.js +7 -45
  398. package/development/radio-button/radio-button-panel/radio-button-panel.component.d.ts.map +1 -1
  399. package/development/radio-button/radio-button-panel/radio-button-panel.component.js +9 -4
  400. package/development/{radio-button-common-CgM3kQSW.js → radio-button-common-5uawgCpB.js} +4 -10
  401. package/development/radio-button.js +1 -1
  402. package/development/sbb-tokens-DXgmy_b-.js +21 -0
  403. package/development/select/select.component.d.ts +12 -8
  404. package/development/select/select.component.d.ts.map +1 -1
  405. package/development/select/select.component.js +105 -98
  406. package/development/selection-action-panel/selection-action-panel.component.d.ts.map +1 -1
  407. package/development/selection-action-panel/selection-action-panel.component.js +4 -9
  408. package/development/selection-expansion-panel/selection-expansion-panel.component.d.ts.map +1 -1
  409. package/development/selection-expansion-panel/selection-expansion-panel.component.js +9 -14
  410. package/development/sidebar/common.js +1 -1
  411. package/development/sidebar/icon-sidebar/icon-sidebar.component.js +2 -8
  412. package/development/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts.map +1 -1
  413. package/development/sidebar/icon-sidebar-button/icon-sidebar-button.component.js +3 -2
  414. package/development/sidebar/icon-sidebar-link/icon-sidebar-link.component.d.ts.map +1 -1
  415. package/development/sidebar/icon-sidebar-link/icon-sidebar-link.component.js +3 -2
  416. package/development/sidebar/sidebar/sidebar.component.d.ts.map +1 -1
  417. package/development/sidebar/sidebar/sidebar.component.js +5 -10
  418. package/development/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts +1 -0
  419. package/development/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts.map +1 -1
  420. package/development/sidebar/sidebar-close-button/sidebar-close-button.component.js +5 -9
  421. package/development/sidebar/sidebar-container/sidebar-container.component.d.ts.map +1 -1
  422. package/development/sidebar/sidebar-container/sidebar-container.component.js +7 -2
  423. package/development/sidebar.js +1 -1
  424. package/development/signet/signet.component.d.ts.map +1 -1
  425. package/development/signet/signet.component.js +4 -9
  426. package/development/skiplink-list/skiplink-list.component.d.ts.map +1 -1
  427. package/development/skiplink-list/skiplink-list.component.js +5 -10
  428. package/development/slider/slider.component.d.ts.map +1 -1
  429. package/development/slider/slider.component.js +4 -9
  430. package/development/status/status.component.d.ts +2 -2
  431. package/development/status/status.component.d.ts.map +1 -1
  432. package/development/status/status.component.js +8 -16
  433. package/development/stepper/step/step.component.d.ts.map +1 -1
  434. package/development/stepper/step/step.component.js +4 -9
  435. package/development/stepper/step-label/step-label.component.d.ts.map +1 -1
  436. package/development/stepper/step-label/step-label.component.js +5 -10
  437. package/development/stepper/stepper/stepper.component.d.ts.map +1 -1
  438. package/development/stepper/stepper/stepper.component.js +4 -9
  439. package/development/table/table-wrapper/table-wrapper.component.js +2 -8
  440. package/development/tabs/tab/tab.component.js +1 -7
  441. package/development/tabs/tab-group/tab-group.component.d.ts.map +1 -1
  442. package/development/tabs/tab-group/tab-group.component.js +4 -9
  443. package/development/tabs/tab-label/tab-label.component.d.ts.map +1 -1
  444. package/development/tabs/tab-label/tab-label.component.js +10 -15
  445. package/development/tag/tag/tag.component.d.ts.map +1 -1
  446. package/development/tag/tag/tag.component.js +9 -14
  447. package/development/tag/tag-group/tag-group.component.d.ts.map +1 -1
  448. package/development/tag/tag-group/tag-group.component.js +4 -9
  449. package/development/teaser/teaser.component.d.ts.map +1 -1
  450. package/development/teaser/teaser.component.js +5 -10
  451. package/development/teaser-hero/teaser-hero.component.d.ts.map +1 -1
  452. package/development/teaser-hero/teaser-hero.component.js +8 -13
  453. package/development/teaser-product/common/teaser-product-common.d.ts.map +1 -1
  454. package/development/teaser-product/common/teaser-product-common.js +4 -13
  455. package/development/teaser-product/common.js +1 -1
  456. package/development/teaser-product/teaser-product/teaser-product.component.d.ts.map +1 -1
  457. package/development/teaser-product/teaser-product/teaser-product.component.js +7 -2
  458. package/development/teaser-product/teaser-product-static/teaser-product-static.component.d.ts.map +1 -1
  459. package/development/teaser-product/teaser-product-static/teaser-product-static.component.js +3 -2
  460. package/development/{teaser-product-common-DvlBRkE_.js → teaser-product-common-B1KK4iNu.js} +3 -9
  461. package/development/teaser-product.js +1 -1
  462. package/development/time-input/time-input.component.js +3 -9
  463. package/development/timetable-form/timetable-form/timetable-form.component.js +2 -8
  464. package/development/timetable-form/timetable-form-details/timetable-form-details.component.js +2 -8
  465. package/development/timetable-form/timetable-form-field/timetable-form-field.component.js +2 -8
  466. package/development/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.d.ts +1 -0
  467. package/development/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.d.ts.map +1 -1
  468. package/development/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.js +5 -9
  469. package/development/timetable-occupancy/timetable-occupancy.component.d.ts.map +1 -1
  470. package/development/timetable-occupancy/timetable-occupancy.component.js +5 -10
  471. package/development/timetable-occupancy-icon/timetable-occupancy-icon.component.js +1 -1
  472. package/development/title/title-base.js +2 -8
  473. package/development/toast/toast.component.d.ts.map +1 -1
  474. package/development/toast/toast.component.js +4 -9
  475. package/development/toggle/toggle/toggle.component.d.ts.map +1 -1
  476. package/development/toggle/toggle/toggle.component.js +4 -9
  477. package/development/toggle/toggle-option/toggle-option.component.d.ts.map +1 -1
  478. package/development/toggle/toggle-option/toggle-option.component.js +7 -12
  479. package/development/toggle-check/toggle-check.component.d.ts +2 -3
  480. package/development/toggle-check/toggle-check.component.d.ts.map +1 -1
  481. package/development/toggle-check/toggle-check.component.js +15 -33
  482. package/development/tooltip/tooltip.component.d.ts.map +1 -1
  483. package/development/tooltip/tooltip.component.js +5 -10
  484. package/development/train/train/train.component.d.ts.map +1 -1
  485. package/development/train/train/train.component.js +4 -9
  486. package/development/train/train-blocked-passage/train-blocked-passage.component.d.ts.map +1 -1
  487. package/development/train/train-blocked-passage/train-blocked-passage.component.js +4 -9
  488. package/development/train/train-formation/train-formation.component.d.ts.map +1 -1
  489. package/development/train/train-formation/train-formation.component.js +4 -9
  490. package/development/train/train-wagon/train-wagon.component.d.ts.map +1 -1
  491. package/development/train/train-wagon/train-wagon.component.js +4 -9
  492. package/development/visual-checkbox/visual-checkbox.component.d.ts.map +1 -1
  493. package/development/visual-checkbox/visual-checkbox.component.js +6 -11
  494. package/dialog/dialog/dialog.component.d.ts.map +1 -1
  495. package/dialog/dialog/dialog.component.js +39 -38
  496. package/dialog/dialog-actions/dialog-actions.component.js +9 -9
  497. package/dialog/dialog-close-button/dialog-close-button.component.d.ts +1 -0
  498. package/dialog/dialog-close-button/dialog-close-button.component.d.ts.map +1 -1
  499. package/dialog/dialog-close-button/dialog-close-button.component.js +14 -11
  500. package/dialog/dialog-content/dialog-content.component.js +9 -9
  501. package/divider/divider.component.d.ts.map +1 -1
  502. package/divider/divider.component.js +16 -15
  503. package/expansion-panel/expansion-panel/expansion-panel.component.d.ts.map +1 -1
  504. package/expansion-panel/expansion-panel/expansion-panel.component.js +18 -17
  505. package/expansion-panel/expansion-panel-content/expansion-panel-content.component.d.ts.map +1 -1
  506. package/expansion-panel/expansion-panel-content/expansion-panel-content.component.js +12 -11
  507. package/expansion-panel/expansion-panel-header/expansion-panel-header.component.d.ts +2 -3
  508. package/expansion-panel/expansion-panel-header/expansion-panel-header.component.d.ts.map +1 -1
  509. package/expansion-panel/expansion-panel-header/expansion-panel-header.component.js +18 -17
  510. package/file-selector/common.js +1 -1
  511. package/file-selector/file-selector/file-selector.component.d.ts.map +1 -1
  512. package/file-selector/file-selector/file-selector.component.js +12 -12
  513. package/file-selector/file-selector-dropzone/file-selector-dropzone.component.d.ts.map +1 -1
  514. package/file-selector/file-selector-dropzone/file-selector-dropzone.component.js +15 -14
  515. package/file-selector-common-CUp299VH.js +5 -0
  516. package/file-selector.js +1 -1
  517. package/flip-card/flip-card/flip-card.component.d.ts.map +1 -1
  518. package/flip-card/flip-card/flip-card.component.js +15 -14
  519. package/flip-card/flip-card-details/flip-card-details.component.d.ts.map +1 -1
  520. package/flip-card/flip-card-details/flip-card-details.component.js +13 -12
  521. package/flip-card/flip-card-summary/flip-card-summary.component.d.ts.map +1 -1
  522. package/flip-card/flip-card-summary/flip-card-summary.component.js +5 -4
  523. package/footer/footer.component.d.ts.map +1 -1
  524. package/footer/footer.component.js +5 -4
  525. package/form-error/form-error.component.d.ts.map +1 -1
  526. package/form-error/form-error.component.js +10 -9
  527. package/form-field/form-field/form-field.component.d.ts.map +1 -1
  528. package/form-field/form-field/form-field.component.js +17 -16
  529. package/form-field/form-field-clear/form-field-clear.component.d.ts.map +1 -1
  530. package/form-field/form-field-clear/form-field-clear.component.js +18 -17
  531. package/header/common/header-action-common.d.ts.map +1 -1
  532. package/header/common/header-action-common.js +27 -27
  533. package/header/header/header.component.d.ts +1 -1
  534. package/header/header/header.component.d.ts.map +1 -1
  535. package/header/header/header.component.js +39 -38
  536. package/header/header-environment/header-environment.component.d.ts.map +1 -1
  537. package/header/header-environment/header-environment.component.js +5 -4
  538. package/icon/icon-base.d.ts.map +1 -1
  539. package/icon/icon-base.js +22 -21
  540. package/icon/icon-name-mixin.d.ts +3 -2
  541. package/icon/icon-name-mixin.d.ts.map +1 -1
  542. package/icon/icon-name-mixin.js +30 -22
  543. package/icon-sidebar-button-common-W6GYJbVt.js +7 -0
  544. package/image/image.component.d.ts +1 -1
  545. package/image/image.component.d.ts.map +1 -1
  546. package/image/image.component.js +72 -77
  547. package/index.d.ts +0 -3
  548. package/index.js +0 -3
  549. package/journey-header/journey-header.component.d.ts.map +1 -1
  550. package/journey-header/journey-header.component.js +19 -18
  551. package/lead-container/lead-container.component.d.ts.map +1 -1
  552. package/lead-container/lead-container.component.js +8 -7
  553. package/link/common/block-link-common.d.ts.map +1 -1
  554. package/link/common/block-link-common.js +14 -13
  555. package/link/common/inline-link-common.d.ts.map +1 -1
  556. package/link/common/inline-link-common.js +7 -6
  557. package/link/common/link-common.d.ts.map +1 -1
  558. package/link/common/link-common.js +1 -1
  559. package/link/common.js +1 -1
  560. package/link-common-CdQBSga7.js +46 -0
  561. package/link-list/common/link-list-base.d.ts.map +1 -1
  562. package/link-list/common/link-list-base.js +34 -34
  563. package/link-list/common.js +1 -1
  564. package/link-list/link-list/link-list.component.d.ts.map +1 -1
  565. package/link-list/link-list/link-list.component.js +23 -22
  566. package/link-list/link-list-anchor/link-list-anchor.component.d.ts.map +1 -1
  567. package/link-list/link-list-anchor/link-list-anchor.component.js +11 -10
  568. package/link-list-base-3v7CHEei.js +5 -0
  569. package/link-list.js +1 -1
  570. package/link.js +1 -1
  571. package/lists.css +1 -1
  572. package/loading-indicator/loading-indicator.component.d.ts.map +1 -1
  573. package/loading-indicator/loading-indicator.component.js +9 -8
  574. package/loading-indicator-circle/loading-indicator-circle.component.d.ts.map +1 -1
  575. package/loading-indicator-circle/loading-indicator-circle.component.js +8 -7
  576. package/logo/logo.component.d.ts.map +1 -1
  577. package/logo/logo.component.js +10 -9
  578. package/map-container/map-container.component.d.ts +1 -1
  579. package/map-container/map-container.component.d.ts.map +1 -1
  580. package/map-container/map-container.component.js +21 -20
  581. package/menu/common/menu-action-common.d.ts.map +1 -1
  582. package/menu/common/menu-action-common.js +14 -17
  583. package/menu/menu/menu.component.d.ts +1 -12
  584. package/menu/menu/menu.component.d.ts.map +1 -1
  585. package/menu/menu/menu.component.js +62 -82
  586. package/message/message.component.d.ts.map +1 -1
  587. package/message/message.component.js +5 -4
  588. package/mini-button-common-DBnJfrBZ.js +10 -0
  589. package/mini-calendar/mini-calendar/mini-calendar.component.js +7 -7
  590. package/mini-calendar/mini-calendar-day/mini-calendar-day.component.js +10 -10
  591. package/mini-calendar/mini-calendar-month/mini-calendar-month.component.d.ts.map +1 -1
  592. package/mini-calendar/mini-calendar-month/mini-calendar-month.component.js +13 -12
  593. package/navigation/common/navigation-action-common.d.ts.map +1 -1
  594. package/navigation/common/navigation-action-common.js +4 -3
  595. package/navigation/navigation/navigation.component.d.ts.map +1 -1
  596. package/navigation/navigation/navigation.component.js +10 -9
  597. package/navigation/navigation-list/navigation-list.component.d.ts.map +1 -1
  598. package/navigation/navigation-list/navigation-list.component.js +17 -16
  599. package/navigation/navigation-marker/navigation-marker.component.d.ts.map +1 -1
  600. package/navigation/navigation-marker/navigation-marker.component.js +11 -10
  601. package/navigation/navigation-section/navigation-section.component.d.ts.map +1 -1
  602. package/navigation/navigation-section/navigation-section.component.js +7 -6
  603. package/notification/notification.component.d.ts +4 -2
  604. package/notification/notification.component.d.ts.map +1 -1
  605. package/notification/notification.component.js +37 -35
  606. package/off-brand-theme.css +164 -476
  607. package/option/optgroup/optgroup-base-element.d.ts.map +1 -1
  608. package/option/optgroup/optgroup-base-element.js +24 -23
  609. package/option/option/option-base-element.d.ts.map +1 -1
  610. package/option/option/option-base-element.js +59 -60
  611. package/option/option/option.component.d.ts.map +1 -1
  612. package/option/option/option.component.js +7 -6
  613. package/option/option-hint/option-hint.component.d.ts.map +1 -1
  614. package/option/option-hint/option-hint.component.js +5 -4
  615. package/overlay/overlay.component.d.ts.map +1 -1
  616. package/overlay/overlay.component.js +10 -9
  617. package/package.json +6 -6
  618. package/paginator/compact-paginator/compact-paginator.component.d.ts.map +1 -1
  619. package/paginator/compact-paginator/compact-paginator.component.js +9 -8
  620. package/paginator/paginator/paginator.component.d.ts.map +1 -1
  621. package/paginator/paginator/paginator.component.js +14 -13
  622. package/popover/popover/popover.component.d.ts +2 -0
  623. package/popover/popover/popover.component.d.ts.map +1 -1
  624. package/popover/popover/popover.component.js +79 -68
  625. package/popover.d.ts +0 -1
  626. package/popover.d.ts.map +1 -1
  627. package/popover.js +3 -5
  628. package/radio-button/common.js +1 -1
  629. package/radio-button/radio-button/radio-button.component.d.ts.map +1 -1
  630. package/radio-button/radio-button/radio-button.component.js +28 -23
  631. package/radio-button/radio-button-group/radio-button-group.component.d.ts.map +1 -1
  632. package/radio-button/radio-button-group/radio-button-group.component.js +47 -46
  633. package/radio-button/radio-button-panel/radio-button-panel.component.d.ts.map +1 -1
  634. package/radio-button/radio-button-panel/radio-button-panel.component.js +19 -14
  635. package/radio-button-common-BT3VkZLM.js +5 -0
  636. package/radio-button.js +1 -1
  637. package/safety-theme.css +164 -476
  638. package/sbb-tokens-CB1Hgctn.js +12 -0
  639. package/select/select.component.d.ts +12 -8
  640. package/select/select.component.d.ts.map +1 -1
  641. package/select/select.component.js +136 -127
  642. package/selection-action-panel/selection-action-panel.component.d.ts.map +1 -1
  643. package/selection-action-panel/selection-action-panel.component.js +5 -4
  644. package/selection-expansion-panel/selection-expansion-panel.component.d.ts.map +1 -1
  645. package/selection-expansion-panel/selection-expansion-panel.component.js +24 -23
  646. package/sidebar/common.js +1 -1
  647. package/sidebar/icon-sidebar/icon-sidebar.component.js +4 -4
  648. package/sidebar/icon-sidebar-button/icon-sidebar-button.component.d.ts.map +1 -1
  649. package/sidebar/icon-sidebar-button/icon-sidebar-button.component.js +11 -10
  650. package/sidebar/icon-sidebar-link/icon-sidebar-link.component.d.ts.map +1 -1
  651. package/sidebar/icon-sidebar-link/icon-sidebar-link.component.js +11 -10
  652. package/sidebar/sidebar/sidebar.component.d.ts.map +1 -1
  653. package/sidebar/sidebar/sidebar.component.js +20 -19
  654. package/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts +1 -0
  655. package/sidebar/sidebar-close-button/sidebar-close-button.component.d.ts.map +1 -1
  656. package/sidebar/sidebar-close-button/sidebar-close-button.component.js +14 -11
  657. package/sidebar/sidebar-container/sidebar-container.component.d.ts.map +1 -1
  658. package/sidebar/sidebar-container/sidebar-container.component.js +16 -11
  659. package/sidebar.js +1 -1
  660. package/signet/signet.component.d.ts.map +1 -1
  661. package/signet/signet.component.js +11 -10
  662. package/skiplink-list/skiplink-list.component.d.ts.map +1 -1
  663. package/skiplink-list/skiplink-list.component.js +36 -35
  664. package/slider/slider.component.d.ts.map +1 -1
  665. package/slider/slider.component.js +25 -24
  666. package/standard-theme.css +164 -476
  667. package/status/status.component.d.ts +2 -2
  668. package/status/status.component.d.ts.map +1 -1
  669. package/status/status.component.js +22 -24
  670. package/stepper/step/step.component.d.ts.map +1 -1
  671. package/stepper/step/step.component.js +10 -9
  672. package/stepper/step-label/step-label.component.d.ts.map +1 -1
  673. package/stepper/step-label/step-label.component.js +8 -7
  674. package/stepper/stepper/stepper.component.d.ts.map +1 -1
  675. package/stepper/stepper/stepper.component.js +11 -10
  676. package/table/table-wrapper/table-wrapper.component.js +5 -5
  677. package/tabs/tab/tab.component.js +1 -1
  678. package/tabs/tab-group/tab-group.component.d.ts.map +1 -1
  679. package/tabs/tab-group/tab-group.component.js +8 -7
  680. package/tabs/tab-label/tab-label.component.d.ts.map +1 -1
  681. package/tabs/tab-label/tab-label.component.js +13 -12
  682. package/tag/tag/tag.component.d.ts.map +1 -1
  683. package/tag/tag/tag.component.js +14 -13
  684. package/tag/tag-group/tag-group.component.d.ts.map +1 -1
  685. package/tag/tag-group/tag-group.component.js +27 -26
  686. package/teaser/teaser.component.d.ts.map +1 -1
  687. package/teaser/teaser.component.js +19 -18
  688. package/teaser-hero/teaser-hero.component.d.ts.map +1 -1
  689. package/teaser-hero/teaser-hero.component.js +12 -11
  690. package/teaser-product/common/teaser-product-common.d.ts.map +1 -1
  691. package/teaser-product/common/teaser-product-common.js +24 -25
  692. package/teaser-product/common.js +1 -1
  693. package/teaser-product/teaser-product/teaser-product.component.d.ts.map +1 -1
  694. package/teaser-product/teaser-product/teaser-product.component.js +12 -7
  695. package/teaser-product/teaser-product-static/teaser-product-static.component.d.ts.map +1 -1
  696. package/teaser-product/teaser-product-static/teaser-product-static.component.js +6 -5
  697. package/teaser-product-common-BwqWqRrK.js +5 -0
  698. package/teaser-product.js +1 -1
  699. package/time-input/time-input.component.js +5 -5
  700. package/timetable-form/timetable-form/timetable-form.component.js +6 -6
  701. package/timetable-form/timetable-form-details/timetable-form-details.component.js +4 -4
  702. package/timetable-form/timetable-form-field/timetable-form-field.component.js +7 -7
  703. package/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.d.ts +1 -0
  704. package/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.d.ts.map +1 -1
  705. package/timetable-form/timetable-form-swap-button/timetable-form-swap-button.component.js +12 -9
  706. package/timetable-occupancy/timetable-occupancy.component.d.ts.map +1 -1
  707. package/timetable-occupancy/timetable-occupancy.component.js +5 -4
  708. package/title/title-base.js +5 -5
  709. package/toast/toast.component.d.ts.map +1 -1
  710. package/toast/toast.component.js +10 -9
  711. package/toggle/toggle/toggle.component.d.ts.map +1 -1
  712. package/toggle/toggle/toggle.component.js +9 -8
  713. package/toggle/toggle-option/toggle-option.component.d.ts.map +1 -1
  714. package/toggle/toggle-option/toggle-option.component.js +24 -23
  715. package/toggle-check/toggle-check.component.d.ts +2 -3
  716. package/toggle-check/toggle-check.component.d.ts.map +1 -1
  717. package/toggle-check/toggle-check.component.js +46 -53
  718. package/tooltip/tooltip.component.d.ts.map +1 -1
  719. package/tooltip/tooltip.component.js +40 -39
  720. package/train/train/train.component.d.ts.map +1 -1
  721. package/train/train/train.component.js +22 -21
  722. package/train/train-blocked-passage/train-blocked-passage.component.d.ts.map +1 -1
  723. package/train/train-blocked-passage/train-blocked-passage.component.js +9 -8
  724. package/train/train-formation/train-formation.component.d.ts.map +1 -1
  725. package/train/train-formation/train-formation.component.js +10 -9
  726. package/train/train-wagon/train-wagon.component.d.ts.map +1 -1
  727. package/train/train-wagon/train-wagon.component.js +10 -9
  728. package/visual-checkbox/visual-checkbox.component.d.ts.map +1 -1
  729. package/visual-checkbox/visual-checkbox.component.js +14 -13
  730. package/checkbox-common-gjHkSAmN.js +0 -5
  731. package/core/decorators/slot-state.d.ts +0 -17
  732. package/core/decorators/slot-state.d.ts.map +0 -1
  733. package/core/decorators/slot-state.js +0 -8
  734. package/core/styles/mixins/shadows.scss +0 -191
  735. package/development/core/decorators/slot-state.d.ts +0 -17
  736. package/development/core/decorators/slot-state.d.ts.map +0 -1
  737. package/development/core/decorators/slot-state.js +0 -11
  738. package/development/popover/popover-trigger/popover-trigger.component.d.ts +0 -20
  739. package/development/popover/popover-trigger/popover-trigger.component.d.ts.map +0 -1
  740. package/development/popover/popover-trigger/popover-trigger.component.js +0 -216
  741. package/development/popover/popover-trigger.d.ts +0 -5
  742. package/development/popover/popover-trigger.d.ts.map +0 -1
  743. package/development/popover/popover-trigger.js +0 -5
  744. package/development/sbb-tokens-CVLcOi-S.js +0 -33
  745. package/file-selector-common-BEWjyy75.js +0 -5
  746. package/icon-sidebar-button-common-XcKoF2SP.js +0 -7
  747. package/link-common-nA3q92jp.js +0 -46
  748. package/link-list-base-BdOBGhxe.js +0 -5
  749. package/popover/popover-trigger/popover-trigger.component.d.ts +0 -20
  750. package/popover/popover-trigger/popover-trigger.component.d.ts.map +0 -1
  751. package/popover/popover-trigger/popover-trigger.component.js +0 -32
  752. package/popover/popover-trigger.d.ts +0 -5
  753. package/popover/popover-trigger.d.ts.map +0 -1
  754. package/popover/popover-trigger.js +0 -4
  755. package/radio-button-common-Bw2t3Sxz.js +0 -5
  756. package/sbb-tokens-B3Eka-Tz.js +0 -18
  757. package/teaser-product-common-Du28QCY3.js +0 -5
  758. package/transparent-button-DJIkG5hj.js +0 -9
@@ -20,13 +20,8 @@ import { isLean, setOrRemoveAttribute, isZeroAnimationDuration, isNextjs, isSafa
20
20
  import { i18nSelectionRequired } from "../core/i18n.js";
21
21
  import { SbbUpdateSchedulerMixin, SbbDisabledMixin, SbbNegativeMixin, SbbHydrationMixin, SbbRequiredMixin, SbbReadonlyMixin, SbbFormAssociatedMixin } from "../core/mixins.js";
22
22
  import { isEventOnElement, setOverlayPosition, overlayGapFixCorners } from "../core/overlay.js";
23
- const style = css`*,
24
- ::before,
25
- ::after {
26
- box-sizing: border-box;
27
- }
28
-
29
- .sbb-gap-fix-wrapper {
23
+ import { boxSizingStyles } from "../core/styles.js";
24
+ const style = css`.sbb-gap-fix-wrapper {
30
25
  position: relative;
31
26
  overflow: hidden;
32
27
  width: var(--sbb-options-panel-border-radius);
@@ -172,7 +167,7 @@ const style = css`*,
172
167
  overflow: hidden;
173
168
  white-space: nowrap;
174
169
  text-overflow: ellipsis;
175
- cursor: default;
170
+ cursor: var(--sbb-cursor-default);
176
171
  height: calc(1em * var(--sbb-typo-line-height-body-text));
177
172
  }
178
173
 
@@ -240,10 +235,10 @@ const style = css`*,
240
235
  inset-block-start: calc(var(--sbb-options-panel-position-y) - var(--sbb-options-panel-origin-height));
241
236
  }
242
237
  :host(:is([data-state=opened], [data-state=opening])) .sbb-select__panel {
243
- box-shadow: var(--sbb-shadow-elevation-level-5-shadow-2-offset-x) var(--sbb-shadow-elevation-level-5-shadow-2-offset-y) var(--sbb-shadow-elevation-level-5-shadow-2-blur) var(--sbb-shadow-elevation-level-5-shadow-2-spread) var(--sbb-shadow-color-hard-2), var(--sbb-shadow-elevation-level-5-shadow-1-offset-x) var(--sbb-shadow-elevation-level-5-shadow-1-offset-y) var(--sbb-shadow-elevation-level-5-shadow-1-blur) var(--sbb-shadow-elevation-level-5-shadow-1-spread) var(--sbb-shadow-color-hard-1);
238
+ box-shadow: var(--sbb-box-shadow-level-5-hard);
244
239
  }
245
240
  :host(:is([data-state=opened], [data-state=opening])[negative]) .sbb-select__panel {
246
- box-shadow: var(--sbb-shadow-elevation-level-5-shadow-2-offset-x) var(--sbb-shadow-elevation-level-5-shadow-2-offset-y) var(--sbb-shadow-elevation-level-5-shadow-2-blur) var(--sbb-shadow-elevation-level-5-shadow-2-spread) var(--sbb-shadow-color-hard-2-negative), var(--sbb-shadow-elevation-level-5-shadow-1-offset-x) var(--sbb-shadow-elevation-level-5-shadow-1-offset-y) var(--sbb-shadow-elevation-level-5-shadow-1-blur) var(--sbb-shadow-elevation-level-5-shadow-1-spread) var(--sbb-shadow-color-hard-1-negative);
241
+ box-shadow: var(--sbb-box-shadow-level-5-hard-negative);
247
242
  }
248
243
  :host([data-options-panel-position=below]) .sbb-select__panel::before {
249
244
  display: block;
@@ -252,12 +247,12 @@ const style = css`*,
252
247
  display: block;
253
248
  }
254
249
  :host(:is([data-state=opened], [data-state=opening])[data-option-panel-origin-borderless]) .sbb-select__panel::before, :host(:is([data-state=opened], [data-state=opening])[data-option-panel-origin-borderless]) .sbb-select__panel::after {
255
- box-shadow: var(--sbb-shadow-elevation-level-5-shadow-2-offset-x) var(--sbb-shadow-elevation-level-5-shadow-2-offset-y) var(--sbb-shadow-elevation-level-5-shadow-2-blur) var(--sbb-shadow-elevation-level-5-shadow-2-spread) var(--sbb-shadow-color-hard-2), var(--sbb-shadow-elevation-level-5-shadow-1-offset-x) var(--sbb-shadow-elevation-level-5-shadow-1-offset-y) var(--sbb-shadow-elevation-level-5-shadow-1-blur) var(--sbb-shadow-elevation-level-5-shadow-1-spread) var(--sbb-shadow-color-hard-1);
250
+ box-shadow: var(--sbb-box-shadow-level-5-hard);
256
251
  }
257
252
  :host(:is([data-state=opened],
258
253
  [data-state=opening])[data-option-panel-origin-borderless][negative]) .sbb-select__panel::before, :host(:is([data-state=opened],
259
254
  [data-state=opening])[data-option-panel-origin-borderless][negative]) .sbb-select__panel::after {
260
- box-shadow: var(--sbb-shadow-elevation-level-5-shadow-2-offset-x) var(--sbb-shadow-elevation-level-5-shadow-2-offset-y) var(--sbb-shadow-elevation-level-5-shadow-2-blur) var(--sbb-shadow-elevation-level-5-shadow-2-spread) var(--sbb-shadow-color-hard-2-negative), var(--sbb-shadow-elevation-level-5-shadow-1-offset-x) var(--sbb-shadow-elevation-level-5-shadow-1-offset-y) var(--sbb-shadow-elevation-level-5-shadow-1-blur) var(--sbb-shadow-elevation-level-5-shadow-1-spread) var(--sbb-shadow-color-hard-1-negative);
255
+ box-shadow: var(--sbb-box-shadow-level-5-hard-negative);
261
256
  }
262
257
 
263
258
  .sbb-select__wrapper {
@@ -335,12 +330,13 @@ const style = css`*,
335
330
  const ariaRoleOnHost = isSafari;
336
331
  let nextId = 0;
337
332
  let SbbSelectElement = (() => {
338
- var _placeholder_accessor_storage, _multiple_accessor_storage, _disabled_accessor_storage, _value_accessor_storage, _size_accessor_storage, __displayValue_accessor_storage, _a;
333
+ var _placeholder_accessor_storage, _multiple_accessor_storage, _disabled_accessor_storage, _size_accessor_storage, __displayValue_accessor_storage, _a;
339
334
  let _classDecorators = [customElement("sbb-select")];
340
335
  let _classDescriptor;
341
336
  let _classExtraInitializers = [];
342
337
  let _classThis;
343
338
  let _classSuper = SbbUpdateSchedulerMixin(SbbDisabledMixin(SbbNegativeMixin(SbbHydrationMixin(SbbRequiredMixin(SbbReadonlyMixin(SbbFormAssociatedMixin(SbbOpenCloseBaseElement)))))));
339
+ let _instanceExtraInitializers = [];
344
340
  let _placeholder_decorators;
345
341
  let _placeholder_initializers = [];
346
342
  let _placeholder_extraInitializers = [];
@@ -350,9 +346,7 @@ let SbbSelectElement = (() => {
350
346
  let _disabled_decorators;
351
347
  let _disabled_initializers = [];
352
348
  let _disabled_extraInitializers = [];
353
- let _value_decorators;
354
- let _value_initializers = [];
355
- let _value_extraInitializers = [];
349
+ let _set_value_decorators;
356
350
  let _size_decorators;
357
351
  let _size_initializers = [];
358
352
  let _size_extraInitializers = [];
@@ -365,14 +359,13 @@ let SbbSelectElement = (() => {
365
359
  __privateAdd(this, _placeholder_accessor_storage);
366
360
  __privateAdd(this, _multiple_accessor_storage);
367
361
  __privateAdd(this, _disabled_accessor_storage);
368
- __privateAdd(this, _value_accessor_storage);
369
362
  __privateAdd(this, _size_accessor_storage);
370
363
  __privateAdd(this, __displayValue_accessor_storage);
371
- __privateSet(this, _placeholder_accessor_storage, __runInitializers(this, _placeholder_initializers, ""));
364
+ __privateSet(this, _placeholder_accessor_storage, (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _placeholder_initializers, "")));
372
365
  __privateSet(this, _multiple_accessor_storage, (__runInitializers(this, _placeholder_extraInitializers), __runInitializers(this, _multiple_initializers, false)));
373
366
  __privateSet(this, _disabled_accessor_storage, (__runInitializers(this, _multiple_extraInitializers), __runInitializers(this, _disabled_initializers, false)));
374
- __privateSet(this, _value_accessor_storage, (__runInitializers(this, _disabled_extraInitializers), __runInitializers(this, _value_initializers, null)));
375
- __privateSet(this, _size_accessor_storage, (__runInitializers(this, _value_extraInitializers), __runInitializers(this, _size_initializers, isLean() ? "s" : "m")));
367
+ this._value = (__runInitializers(this, _disabled_extraInitializers), null);
368
+ __privateSet(this, _size_accessor_storage, __runInitializers(this, _size_initializers, isLean() ? "s" : "m"));
376
369
  __privateSet(this, __displayValue_accessor_storage, (__runInitializers(this, _size_extraInitializers), __runInitializers(this, __displayValue_initializers, null)));
377
370
  this._originResizeObserver = (__runInitializers(this, __displayValue_extraInitializers), new ResizeController(this, {
378
371
  target: null,
@@ -390,6 +383,7 @@ let SbbSelectElement = (() => {
390
383
  this._didLoad = false;
391
384
  this._isPointerDownEventOnMenu = false;
392
385
  this._languageController = new SbbLanguageController(this);
386
+ this._isValueManuallyAssigned = false;
393
387
  this._pointerDownListener = (event) => {
394
388
  this._isPointerDownEventOnMenu = isEventOnElement(this._overlay, event);
395
389
  };
@@ -400,6 +394,7 @@ let SbbSelectElement = (() => {
400
394
  };
401
395
  this.addEventListener?.("optionselectionchange", (e) => this._onOptionChanged(e));
402
396
  this.addEventListener?.("optionLabelChanged", (e) => this._onOptionLabelChanged(e));
397
+ this.addEventListener?.("ɵoptgroupslotchange", () => this._onSlotChange(), { capture: true });
403
398
  this.addEventListener?.("click", (e) => {
404
399
  const target = e.target;
405
400
  if (target.localName === "sbb-option") {
@@ -437,11 +432,13 @@ let SbbSelectElement = (() => {
437
432
  __privateSet(this, _disabled_accessor_storage, value);
438
433
  }
439
434
  /** Value of the form element. */
440
- get value() {
441
- return __privateGet(this, _value_accessor_storage);
442
- }
443
435
  set value(value) {
444
- __privateSet(this, _value_accessor_storage, value);
436
+ this._value = value;
437
+ this._updateOptionsFromValue();
438
+ this._isValueManuallyAssigned = true;
439
+ }
440
+ get value() {
441
+ return this._value;
445
442
  }
446
443
  /**
447
444
  * Size variant, either m or s.
@@ -474,12 +471,14 @@ let SbbSelectElement = (() => {
474
471
  get inputElement() {
475
472
  return this._triggerElement;
476
473
  }
477
- /** Gets all the SbbOptionElement projected in the select. */
478
- get _options() {
479
- return Array.from(this.querySelectorAll?.("sbb-option") ?? []);
480
- }
481
- get _filteredOptions() {
482
- return this._options.filter((opt) => !opt.disabled && !opt.hasAttribute("data-group-disabled"));
474
+ /** Returns all SbbOptionElements from this sbb-select instance. */
475
+ get options() {
476
+ const options = [];
477
+ this.querySelectorAll?.("sbb-option").forEach((option) => {
478
+ customElements.upgrade(option);
479
+ options.push(option);
480
+ });
481
+ return options;
483
482
  }
484
483
  _syncAriaLabels() {
485
484
  if (!this._triggerElement || isServer) {
@@ -494,7 +493,7 @@ let SbbSelectElement = (() => {
494
493
  }
495
494
  /** Opens the selection panel. */
496
495
  open() {
497
- if (this.state !== "closed" || !this._overlay || this._options.length === 0 || this.disabled || this.formDisabled || !this.dispatchBeforeOpenEvent()) {
496
+ if (this.state !== "closed" || !this._overlay || this.options.length === 0 || this.disabled || this.formDisabled || !this.dispatchBeforeOpenEvent()) {
498
497
  return;
499
498
  }
500
499
  this.shadowRoot?.querySelector(".sbb-select__container")?.showPopover?.();
@@ -527,6 +526,9 @@ let SbbSelectElement = (() => {
527
526
  getDisplayValue() {
528
527
  return this._displayValue ?? "";
529
528
  }
529
+ _selectableOptions() {
530
+ return this.options.filter((opt) => !opt.disabled && !opt.hasAttribute("data-group-disabled"));
531
+ }
530
532
  /** Listens to option changes. */
531
533
  _onOptionChanged(event) {
532
534
  const target = event.target;
@@ -543,11 +545,12 @@ let SbbSelectElement = (() => {
543
545
  if (!Array.isArray(selected) && target !== selected || Array.isArray(selected) && !selected.includes(target)) {
544
546
  return;
545
547
  }
546
- this._updateDisplayValue(selected);
548
+ this._updateDisplayValue();
547
549
  }
548
- _updateDisplayValue(selected) {
550
+ _updateDisplayValue() {
551
+ const selected = this._getSelected();
549
552
  if (Array.isArray(selected)) {
550
- this._displayValue = selected.map((o) => o.textContent).join(", ") || null;
553
+ this._displayValue = selected.map((o) => o.textContent?.trim()).join(", ") || null;
551
554
  } else if (selected) {
552
555
  this._displayValue = selected?.textContent?.trim() || null;
553
556
  } else {
@@ -562,10 +565,11 @@ let SbbSelectElement = (() => {
562
565
  */
563
566
  _onMultipleChanged(isChangingToMultiple) {
564
567
  if (isChangingToMultiple) {
565
- this.value = this.value !== null && this.value !== void 0 ? [this.value] : [];
568
+ this._value = this._isValueManuallyAssigned || this.value != null ? [this.value] : [];
566
569
  } else if (Array.isArray(this.value)) {
567
- this.value = this.value.length ? this.value[0] : null;
570
+ this._value = this.value.length ? this.value[0] : null;
568
571
  }
572
+ this._updateDisplayValue();
569
573
  }
570
574
  /**
571
575
  * If the `disabled` or the `readonly` properties are set, and the panel is open, close it.
@@ -575,23 +579,6 @@ let SbbSelectElement = (() => {
575
579
  this.close();
576
580
  }
577
581
  }
578
- /** Sets the _displayValue by checking the internal sbb-options and setting the correct `selected` value on them. */
579
- _onValueChanged(newValue) {
580
- const options = this._filteredOptions;
581
- if (!Array.isArray(newValue)) {
582
- const optionElement = options.find((o) => o.value === newValue) ?? null;
583
- if (optionElement) {
584
- optionElement.selected = true;
585
- }
586
- options.filter((o) => (o.value ?? o.getAttribute("value")) !== newValue).forEach((o) => o.selected = false);
587
- this._updateDisplayValue(optionElement);
588
- } else {
589
- options.filter((o) => !newValue.includes(o.value)).forEach((e) => e.selected = false);
590
- const selectedElements = options.filter((o) => newValue.includes(o.value));
591
- selectedElements.forEach((o) => o.selected = true);
592
- this._updateDisplayValue(selectedElements);
593
- }
594
- }
595
582
  firstUpdated(changedProperties) {
596
583
  super.firstUpdated(changedProperties);
597
584
  if (!isNextjs()) {
@@ -643,9 +630,6 @@ let SbbSelectElement = (() => {
643
630
  }
644
631
  willUpdate(changedProperties) {
645
632
  super.willUpdate(changedProperties);
646
- if (changedProperties.has("value") && (this._didLoad || this.value)) {
647
- this._onValueChanged(this.value);
648
- }
649
633
  if (changedProperties.has("negative") || changedProperties.has("multiple")) {
650
634
  this._syncProperties();
651
635
  }
@@ -669,16 +653,22 @@ let SbbSelectElement = (() => {
669
653
  * @internal
670
654
  */
671
655
  formStateRestoreCallback(state2, _reason) {
672
- if (typeof state2 === "string" || state2 == null) {
673
- this.value = state2 ?? null;
674
- } else if (state2 instanceof FormData) {
675
- this._readFormData(state2).then((array) => {
676
- this.value = this.multiple ? array : array[0];
677
- });
656
+ try {
657
+ const { value, manuallyAssigned } = JSON.parse(state2);
658
+ const values = Array.isArray(value) ? value : [value];
659
+ if (values.some((v) => v !== null && typeof v === "object")) {
660
+ console.warn(`Restoring complex objects is not supported for sbb-select with state ${state2}`);
661
+ return;
662
+ }
663
+ this._isValueManuallyAssigned = manuallyAssigned;
664
+ this._value = value;
665
+ this._updateOptionsFromValue();
666
+ } catch {
667
+ console.warn(`Failed to restore sbb-select with state ${state2}`);
678
668
  }
679
669
  }
680
- async _readFormData(formData) {
681
- return Promise.all(formData.getAll(this.name).map(async (entry) => entry instanceof Blob ? JSON.parse(await entry.text()) : entry));
670
+ formState() {
671
+ return JSON.stringify({ value: this.value, manuallyAssigned: this._isValueManuallyAssigned });
682
672
  }
683
673
  _syncProperties() {
684
674
  this.querySelectorAll?.("sbb-divider, sbb-option-hint").forEach((el) => el.negative = this.negative);
@@ -693,7 +683,7 @@ let SbbSelectElement = (() => {
693
683
  }
694
684
  validate() {
695
685
  super.validate();
696
- if (this.required && this._options.every((o) => o.value !== this.value)) {
686
+ if (this.required && (this.options.every((o) => o.value !== this.value) || !this._isValueManuallyAssigned && this.value == null)) {
697
687
  this.setValidityFlag("valueMissing", i18nSelectionRequired[this._languageController.current]);
698
688
  } else {
699
689
  this.removeValidityFlag("valueMissing");
@@ -758,23 +748,22 @@ let SbbSelectElement = (() => {
758
748
  this.dispatchCloseEvent();
759
749
  }
760
750
  /** When an option is selected, updates the displayValue; it also closes the select if not `multiple`. */
761
- _onOptionSelected(optionSelectionChange) {
751
+ _onOptionSelected(option) {
762
752
  if (!this.multiple) {
763
- this._filteredOptions.filter((option) => option.id !== optionSelectionChange.id).forEach((option) => option.selected = false);
764
- this.value = optionSelectionChange.value;
765
- } else {
766
- if (!this.value) {
767
- this.value = [optionSelectionChange.value];
768
- } else if (Array.isArray(this.value) && !this.value.includes(optionSelectionChange.value)) {
769
- this.value = [...this.value, optionSelectionChange.value];
770
- }
753
+ this._value = option.value;
754
+ } else if (!this.value) {
755
+ this._value = [option.value];
756
+ } else if (Array.isArray(this.value) && !this.value.includes(option.value)) {
757
+ this._value = [...this.value, option.value];
771
758
  }
759
+ this._updateOptionsFromValue();
772
760
  this._dispatchInputEvents();
773
761
  }
774
762
  /** When an option is unselected in `multiple`, removes it from value and updates displayValue. */
775
763
  _onOptionDeselected(optionSelectionChange) {
776
764
  if (this.multiple && Array.isArray(this.value)) {
777
- this.value = this.value.filter((el) => el !== optionSelectionChange.value);
765
+ this._value = this.value.filter((el) => el !== optionSelectionChange.value);
766
+ this._updateOptionsFromValue();
778
767
  this._dispatchInputEvents();
779
768
  }
780
769
  }
@@ -858,7 +847,7 @@ let SbbSelectElement = (() => {
858
847
  case "End":
859
848
  case "PageDown":
860
849
  event.preventDefault();
861
- this._setNextActiveOption(event, this._filteredOptions.length - 1);
850
+ this._setNextActiveOption(event, this._selectableOptions().length - 1);
862
851
  break;
863
852
  }
864
853
  }
@@ -872,17 +861,18 @@ let SbbSelectElement = (() => {
872
861
  this._searchTimeout = setTimeout(() => this._searchString = "", 1e3);
873
862
  this._searchString += event.key;
874
863
  const indexForSlice = this._activeItemIndex + 1;
864
+ const selectableOptions = this._selectableOptions();
875
865
  const filteredOptionsSorted = [
876
- ...this._filteredOptions.slice(indexForSlice),
877
- ...this._filteredOptions.slice(0, indexForSlice)
866
+ ...selectableOptions.slice(indexForSlice),
867
+ ...selectableOptions.slice(0, indexForSlice)
878
868
  ];
879
869
  const match = filteredOptionsSorted.find((option) => option.textContent?.toLowerCase().indexOf(this._searchString.toLowerCase()) === 0);
880
870
  if (match) {
881
- this._setNextActiveOption(event, this._filteredOptions.indexOf(match));
871
+ this._setNextActiveOption(event, selectableOptions.indexOf(match));
882
872
  } else if (this._searchString.length > 1 && new RegExp(`^${this._searchString.charAt(0)}*$`).test(this._searchString)) {
883
873
  const firstMatch = filteredOptionsSorted.find((option) => option.textContent?.toLowerCase().indexOf(this._searchString[0].toLowerCase()) === 0);
884
874
  if (firstMatch) {
885
- this._setNextActiveOption(event, this._filteredOptions.indexOf(firstMatch));
875
+ this._setNextActiveOption(event, selectableOptions.indexOf(firstMatch));
886
876
  }
887
877
  } else {
888
878
  clearTimeout(this._searchTimeout);
@@ -890,7 +880,7 @@ let SbbSelectElement = (() => {
890
880
  }
891
881
  }
892
882
  _selectByKeyboard() {
893
- const activeOption = this._filteredOptions[this._activeItemIndex];
883
+ const activeOption = this._selectableOptions()[this._activeItemIndex];
894
884
  if (this.multiple) {
895
885
  activeOption?.["selectViaUserInteraction"](!activeOption.selected);
896
886
  } else {
@@ -898,7 +888,7 @@ let SbbSelectElement = (() => {
898
888
  }
899
889
  }
900
890
  _setNextActiveOption(event, index) {
901
- const filteredOptions = this._filteredOptions;
891
+ const filteredOptions = this._selectableOptions();
902
892
  if (filteredOptions.length === 0) {
903
893
  return;
904
894
  }
@@ -930,14 +920,25 @@ let SbbSelectElement = (() => {
930
920
  }
931
921
  }
932
922
  _resetActiveElement() {
933
- const activeElement = this._filteredOptions[this._activeItemIndex];
923
+ const activeElement = this._selectableOptions()[this._activeItemIndex];
934
924
  if (activeElement) {
935
925
  activeElement.setActive(false);
936
926
  }
937
927
  this._activeItemIndex = -1;
938
928
  this._triggerElement.removeAttribute("aria-activedescendant");
939
929
  }
940
- _setValueFromSelected() {
930
+ _updateOptionsFromValue() {
931
+ const value = Array.isArray(this.value) ? this.value : [this.value];
932
+ for (const option of this.options) {
933
+ option.selected = value.includes(option.value);
934
+ if (option.selected) ;
935
+ }
936
+ this._updateDisplayValue();
937
+ if (!Array.isArray(this.value)) {
938
+ this._activeItemIndex = this._selectableOptions().findIndex((option) => option.value === this.value);
939
+ }
940
+ }
941
+ _updateValueFromOptions() {
941
942
  const selected = this._getSelected();
942
943
  if (Array.isArray(selected)) {
943
944
  if (selected && selected.length > 0) {
@@ -945,20 +946,26 @@ let SbbSelectElement = (() => {
945
946
  for (const option of selected) {
946
947
  value.push(option.value);
947
948
  }
948
- this.value = value;
949
+ this._value = value;
949
950
  }
950
951
  } else if (selected) {
951
- this._activeItemIndex = this._filteredOptions.findIndex((option) => option === selected);
952
- this.value = selected.value;
953
- } else if (this.value) {
954
- this._onValueChanged(this.value);
952
+ this._activeItemIndex = this._selectableOptions().findIndex((option) => option === selected);
953
+ this._value = selected.value;
954
+ }
955
+ this._updateDisplayValue();
956
+ }
957
+ _onSlotChange() {
958
+ if (this._isValueManuallyAssigned) {
959
+ this._updateOptionsFromValue();
960
+ } else {
961
+ this._updateValueFromOptions();
955
962
  }
956
963
  }
957
964
  _getSelected() {
958
965
  if (this.multiple) {
959
- return this._filteredOptions.filter((option) => option.selected);
966
+ return this.options.filter((option) => option.selected);
960
967
  } else {
961
- return this._filteredOptions.find((option) => option.selected) ?? null;
968
+ return this.options.find((option) => option.selected) ?? null;
962
969
  }
963
970
  }
964
971
  _toggleOpening() {
@@ -1027,19 +1034,19 @@ let SbbSelectElement = (() => {
1027
1034
  ?aria-multiselectable=${this.multiple}
1028
1035
  ${ref((containerRef) => this._optionContainer = containerRef)}
1029
1036
  >
1030
- <slot @slotchange=${this._setValueFromSelected}></slot>
1037
+ <slot @slotchange=${this._onSlotChange}></slot>
1031
1038
  </div>
1032
1039
  </div>
1033
1040
  </div>
1034
1041
  </div>
1035
1042
  `;
1036
1043
  }
1037
- }, _placeholder_accessor_storage = new WeakMap(), _multiple_accessor_storage = new WeakMap(), _disabled_accessor_storage = new WeakMap(), _value_accessor_storage = new WeakMap(), _size_accessor_storage = new WeakMap(), __displayValue_accessor_storage = new WeakMap(), _classThis = _a, (() => {
1044
+ }, _placeholder_accessor_storage = new WeakMap(), _multiple_accessor_storage = new WeakMap(), _disabled_accessor_storage = new WeakMap(), _size_accessor_storage = new WeakMap(), __displayValue_accessor_storage = new WeakMap(), _classThis = _a, (() => {
1038
1045
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
1039
1046
  _placeholder_decorators = [forceType(), property()];
1040
1047
  _multiple_decorators = [forceType(), handleDistinctChange((e, newValue) => e._onMultipleChanged(newValue)), property({ reflect: true, type: Boolean })];
1041
1048
  _disabled_decorators = [forceType(), handleDistinctChange((e, newValue) => e._closeOnDisabledReadonlyChanged(newValue)), property({ reflect: true, type: Boolean }), getOverride((e, v) => v || e.isDisabledExternally())];
1042
- _value_decorators = [property()];
1049
+ _set_value_decorators = [property()];
1043
1050
  _size_decorators = [property({ reflect: true })];
1044
1051
  __displayValue_decorators = [state()];
1045
1052
  __esDecorate(_a, null, _placeholder_decorators, { kind: "accessor", name: "placeholder", static: false, private: false, access: { has: (obj) => "placeholder" in obj, get: (obj) => obj.placeholder, set: (obj, value) => {
@@ -1051,9 +1058,9 @@ let SbbSelectElement = (() => {
1051
1058
  __esDecorate(_a, null, _disabled_decorators, { kind: "accessor", name: "disabled", static: false, private: false, access: { has: (obj) => "disabled" in obj, get: (obj) => obj.disabled, set: (obj, value) => {
1052
1059
  obj.disabled = value;
1053
1060
  } }, metadata: _metadata }, _disabled_initializers, _disabled_extraInitializers);
1054
- __esDecorate(_a, null, _value_decorators, { kind: "accessor", name: "value", static: false, private: false, access: { has: (obj) => "value" in obj, get: (obj) => obj.value, set: (obj, value) => {
1061
+ __esDecorate(_a, null, _set_value_decorators, { kind: "setter", name: "value", static: false, private: false, access: { has: (obj) => "value" in obj, set: (obj, value) => {
1055
1062
  obj.value = value;
1056
- } }, metadata: _metadata }, _value_initializers, _value_extraInitializers);
1063
+ } }, metadata: _metadata }, null, _instanceExtraInitializers);
1057
1064
  __esDecorate(_a, null, _size_decorators, { kind: "accessor", name: "size", static: false, private: false, access: { has: (obj) => "size" in obj, get: (obj) => obj.size, set: (obj, value) => {
1058
1065
  obj.size = value;
1059
1066
  } }, metadata: _metadata }, _size_initializers, _size_extraInitializers);
@@ -1063,7 +1070,7 @@ let SbbSelectElement = (() => {
1063
1070
  __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
1064
1071
  _classThis = _classDescriptor.value;
1065
1072
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
1066
- })(), _a.role = ariaRoleOnHost ? "listbox" : null, _a.styles = style, _a.events = {
1073
+ })(), _a.role = ariaRoleOnHost ? "listbox" : null, _a.styles = [boxSizingStyles, style], _a.events = {
1067
1074
  change: "change",
1068
1075
  input: "input",
1069
1076
  displayvaluechange: "displayvaluechange",
@@ -1077,4 +1084,4 @@ let SbbSelectElement = (() => {
1077
1084
  export {
1078
1085
  SbbSelectElement
1079
1086
  };
1080
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE11dGF0aW9uQ29udHJvbGxlciB9IGZyb20gJ0BsaXQtbGFicy9vYnNlcnZlcnMvbXV0YXRpb24tY29udHJvbGxlci5qcyc7XG5pbXBvcnQgeyBSZXNpemVDb250cm9sbGVyIH0gZnJvbSAnQGxpdC1sYWJzL29ic2VydmVycy9yZXNpemUtY29udHJvbGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwLCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBQcm9wZXJ0eVZhbHVlcywgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgaXNTZXJ2ZXIsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHVudGlsIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW50aWwuanMnO1xuXG5pbXBvcnQgeyBnZXROZXh0RWxlbWVudEluZGV4IH0gZnJvbSAnLi4vY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50IH0gZnJvbSAnLi4vY29yZS9iYXNlLWVsZW1lbnRzLmpzJztcbmltcG9ydCB7IFNiYkVzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLCBTYmJMYW5ndWFnZUNvbnRyb2xsZXIgfSBmcm9tICcuLi9jb3JlL2NvbnRyb2xsZXJzLmpzJztcbmltcG9ydCB7IGZvcmNlVHlwZSwgZ2V0T3ZlcnJpZGUsIGhhbmRsZURpc3RpbmN0Q2hhbmdlIH0gZnJvbSAnLi4vY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7XG4gIGlzTGVhbixcbiAgaXNOZXh0anMsXG4gIGlzU2FmYXJpLFxuICBpc1plcm9BbmltYXRpb25EdXJhdGlvbixcbiAgc2V0T3JSZW1vdmVBdHRyaWJ1dGUsXG59IGZyb20gJy4uL2NvcmUvZG9tLmpzJztcbmltcG9ydCB7IGkxOG5TZWxlY3Rpb25SZXF1aXJlZCB9IGZyb20gJy4uL2NvcmUvaTE4bi5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEZvcm1SZXN0b3JlUmVhc29uLFxuICB0eXBlIEZvcm1SZXN0b3JlU3RhdGUsXG4gIFNiYkRpc2FibGVkTWl4aW4sXG4gIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4sXG4gIFNiYkh5ZHJhdGlvbk1peGluLFxuICBTYmJOZWdhdGl2ZU1peGluLFxuICBTYmJSZWFkb25seU1peGluLFxuICBTYmJSZXF1aXJlZE1peGluLFxuICBTYmJVcGRhdGVTY2hlZHVsZXJNaXhpbixcbn0gZnJvbSAnLi4vY29yZS9taXhpbnMuanMnO1xuaW1wb3J0IHsgaXNFdmVudE9uRWxlbWVudCwgb3ZlcmxheUdhcEZpeENvcm5lcnMsIHNldE92ZXJsYXlQb3NpdGlvbiB9IGZyb20gJy4uL2NvcmUvb3ZlcmxheS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYkRpdmlkZXJFbGVtZW50IH0gZnJvbSAnLi4vZGl2aWRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYk9wdEdyb3VwRWxlbWVudCwgU2JiT3B0aW9uRWxlbWVudCwgU2JiT3B0aW9uSGludEVsZW1lbnQgfSBmcm9tICcuLi9vcHRpb24uanMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9zZWxlY3Quc2Nzcz9saXQmaW5saW5lJztcblxuLyoqXG4gKiBPbiBTYWZhcmksIHRoZSBhcmlhIHJvbGUgJ2xpc3Rib3gnIG11c3QgYmUgb24gdGhlIGhvc3QgZWxlbWVudCwgb3IgZWxzZSBWb2ljZU92ZXIgd29uJ3Qgd29yayBhdCBhbGwuXG4gKiBPbiB0aGUgb3RoZXIgaGFuZCwgSkFXUyBhbmQgTlZEQSBuZWVkIHRoZSByb2xlIHRvIGJlIGFuIFwiaW1tZWRpYXRlIHBhcmVudFwiIHRvIHRoZSBvcHRpb25zLCBvciBlbHNlIG9wdGdyb3VwcyB3b24ndCB3b3JrLlxuICovXG5jb25zdCBhcmlhUm9sZU9uSG9zdCA9IGlzU2FmYXJpO1xuXG5sZXQgbmV4dElkID0gMDtcblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBhIHBhbmVsIHdpdGggc2VsZWN0YWJsZSBvcHRpb25zLlxuICpcbiAqIEBzbG90IC0gVXNlIHRoZSB1bm5hbWVkIHNsb3QgdG8gYWRkIG9wdGlvbnMuXG4gKiBAY3NzcHJvcCBbLS1zYmItc2VsZWN0LXotaW5kZXg9dmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KV0gLSBUbyBzcGVjaWZ5IGEgY3VzdG9tIHN0YWNrIG9yZGVyLFxuICogdGhlIGB6LWluZGV4YCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyB0aGlzIENTUyB2YXJpYWJsZS4gVGhlIGRlZmF1bHQgYHotaW5kZXhgIG9mIHRoZVxuICogY29tcG9uZW50IGlzIHNldCB0byBgdmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KWAgd2l0aCBhIHZhbHVlIG9mIGAxMDAwYC5cbiAqIEBvdmVycmlkZVR5cGUgdmFsdWUgLSAoVCA9IHN0cmluZyB8IHN0cmluZ1tdKSB8IG51bGxcbiAqL1xuZXhwb3J0XG5AY3VzdG9tRWxlbWVudCgnc2JiLXNlbGVjdCcpXG5jbGFzcyBTYmJTZWxlY3RFbGVtZW50PFQgPSBzdHJpbmc+IGV4dGVuZHMgU2JiVXBkYXRlU2NoZWR1bGVyTWl4aW4oXG4gIFNiYkRpc2FibGVkTWl4aW4oXG4gICAgU2JiTmVnYXRpdmVNaXhpbihcbiAgICAgIFNiYkh5ZHJhdGlvbk1peGluKFxuICAgICAgICBTYmJSZXF1aXJlZE1peGluKFxuICAgICAgICAgIFNiYlJlYWRvbmx5TWl4aW4oXG4gICAgICAgICAgICBTYmJGb3JtQXNzb2NpYXRlZE1peGluPHR5cGVvZiBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudD4oU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQpLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICksXG4gICksXG4pIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSByb2xlID0gYXJpYVJvbGVPbkhvc3QgPyAnbGlzdGJveCcgOiBudWxsO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZTtcblxuICAvLyBUT0RPOiBmaXggdXNpbmcgLi4uc3VwZXIuZXZlbnRzIHJlcXVpcmVzOiBodHRwczovL2dpdGh1Yi5jb20vc2JiLWRlc2lnbi1zeXN0ZW1zL2x5bmUtY29tcG9uZW50cy9pc3N1ZXMvMjYwMFxuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHJlYWRvbmx5IGV2ZW50cyA9IHtcbiAgICBjaGFuZ2U6ICdjaGFuZ2UnLFxuICAgIGlucHV0OiAnaW5wdXQnLFxuICAgIGRpc3BsYXl2YWx1ZWNoYW5nZTogJ2Rpc3BsYXl2YWx1ZWNoYW5nZScsXG4gICAgYmVmb3Jlb3BlbjogJ2JlZm9yZW9wZW4nLFxuICAgIG9wZW46ICdvcGVuJyxcbiAgICBiZWZvcmVjbG9zZTogJ2JlZm9yZWNsb3NlJyxcbiAgICBjbG9zZTogJ2Nsb3NlJyxcbiAgfSBhcyBjb25zdDtcblxuICAvKiogVGhlIHBsYWNlaG9sZGVyIHVzZWQgaWYgbm8gdmFsdWUgaGFzIGJlZW4gc2VsZWN0ZWQuICovXG4gIEBmb3JjZVR5cGUoKVxuICBAcHJvcGVydHkoKVxuICBwdWJsaWMgYWNjZXNzb3IgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBzZWxlY3QgYWxsb3dzIGZvciBtdWx0aXBsZSBzZWxlY3Rpb24uICovXG4gIEBmb3JjZVR5cGUoKVxuICBAaGFuZGxlRGlzdGluY3RDaGFuZ2UoKGU6IFNiYlNlbGVjdEVsZW1lbnQ8VD4sIG5ld1ZhbHVlOiBib29sZWFuKSA9PlxuICAgIGUuX29uTXVsdGlwbGVDaGFuZ2VkKG5ld1ZhbHVlKSxcbiAgKVxuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pXG4gIHB1YmxpYyBhY2Nlc3NvciBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBmb3JjZVR5cGUoKVxuICBAaGFuZGxlRGlzdGluY3RDaGFuZ2UoKGU6IFNiYlNlbGVjdEVsZW1lbnQ8VD4sIG5ld1ZhbHVlOiBib29sZWFuKSA9PlxuICAgIGUuX2Nsb3NlT25EaXNhYmxlZFJlYWRvbmx5Q2hhbmdlZChuZXdWYWx1ZSksXG4gIClcbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KVxuICBAZ2V0T3ZlcnJpZGUoKGU6IFNiYlNlbGVjdEVsZW1lbnQ8VD4sIHY6IGJvb2xlYW4pOiBib29sZWFuID0+IHYgfHwgZS5pc0Rpc2FibGVkRXh0ZXJuYWxseSgpKVxuICBwdWJsaWMgb3ZlcnJpZGUgYWNjZXNzb3IgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogVmFsdWUgb2YgdGhlIGZvcm0gZWxlbWVudC4gKi9cbiAgQHByb3BlcnR5KClcbiAgcHVibGljIGFjY2Vzc29yIHZhbHVlOiBUIHwgVFtdIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFNpemUgdmFyaWFudCwgZWl0aGVyIG0gb3Igcy5cbiAgICogQGRlZmF1bHQgJ20nIC8gJ3MnIChsZWFuKVxuICAgKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSB9KSBwdWJsaWMgYWNjZXNzb3Igc2l6ZTogJ20nIHwgJ3MnID0gaXNMZWFuKCkgPyAncycgOiAnbSc7XG5cbiAgLyoqXG4gICAqIEZvcm0gdHlwZSBvZiBlbGVtZW50LlxuICAgKiBAZGVmYXVsdCAnc2VsZWN0LW9uZSAvIHNlbGVjdC1tdWx0aXBsZSdcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm11bHRpcGxlID8gJ3NlbGVjdC1tdWx0aXBsZScgOiAnc2VsZWN0LW9uZSc7XG4gIH1cblxuICAvKiogVGhlIHZhbHVlIGRpc3BsYXllZCBieSB0aGUgY29tcG9uZW50LiAqL1xuICBAc3RhdGUoKSBwcml2YXRlIGFjY2Vzc29yIF9kaXNwbGF5VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX29yaWdpblJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZUNvbnRyb2xsZXIodGhpcywge1xuICAgIHRhcmdldDogbnVsbCxcbiAgICBza2lwSW5pdGlhbDogdHJ1ZSxcbiAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgIHRoaXMuX3NldE92ZXJsYXlQb3NpdGlvbigpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuXG4gIHByaXZhdGUgX292ZXJsYXkhOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfb3B0aW9uQ29udGFpbmVyITogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX29yaWdpbkVsZW1lbnQhOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfdHJpZ2dlckVsZW1lbnQhOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlciE6IEFib3J0Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSBfZXNjYXBhYmxlT3ZlcmxheUNvbnRyb2xsZXIgPSBuZXcgU2JiRXNjYXBhYmxlT3ZlcmxheUNvbnRyb2xsZXIodGhpcyk7XG4gIHByaXZhdGUgX292ZXJsYXlJZCA9IGBzYmItc2VsZWN0LSR7KytuZXh0SWR9YDtcbiAgcHJpdmF0ZSBfYWN0aXZlSXRlbUluZGV4ID0gLTE7XG4gIHByaXZhdGUgX3NlYXJjaFRpbWVvdXQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBfc2VhcmNoU3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2RpZExvYWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNQb2ludGVyRG93bkV2ZW50T25NZW51OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2xhbmd1YWdlQ29udHJvbGxlciA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcyk7XG5cbiAgLyoqXG4gICAqIFRoZSAnY29tYm9ib3gnIGlucHV0IGVsZW1lbnRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlucHV0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyaWdnZXJFbGVtZW50O1xuICB9XG5cbiAgLyoqIEdldHMgYWxsIHRoZSBTYmJPcHRpb25FbGVtZW50IHByb2plY3RlZCBpbiB0aGUgc2VsZWN0LiAqL1xuICBwcml2YXRlIGdldCBfb3B0aW9ucygpOiBTYmJPcHRpb25FbGVtZW50PFQ+W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbD8uPFNiYk9wdGlvbkVsZW1lbnQ8VD4+KCdzYmItb3B0aW9uJykgPz8gW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2ZpbHRlcmVkT3B0aW9ucygpOiBTYmJPcHRpb25FbGVtZW50PFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zLmZpbHRlcigob3B0KSA9PiAhb3B0LmRpc2FibGVkICYmICFvcHQuaGFzQXR0cmlidXRlKCdkYXRhLWdyb3VwLWRpc2FibGVkJykpO1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ29wdGlvbnNlbGVjdGlvbmNoYW5nZScsIChlOiBFdmVudCkgPT4gdGhpcy5fb25PcHRpb25DaGFuZ2VkKGUpKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Lignb3B0aW9uTGFiZWxDaGFuZ2VkJywgKGU6IEV2ZW50KSA9PiB0aGlzLl9vbk9wdGlvbkxhYmVsQ2hhbmdlZChlKSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyPy4oJ2NsaWNrJywgKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIFNiYlNlbGVjdEVsZW1lbnQ8VD4gfCBTYmJPcHRpb25FbGVtZW50PFQ+O1xuICAgICAgaWYgKHRhcmdldC5sb2NhbE5hbWUgPT09ICdzYmItb3B0aW9uJykge1xuICAgICAgICAvLyBPcHRpb24gY2xpY2tcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlICYmICF0YXJnZXQuZGlzYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl90b2dnbGVPcGVuaW5nKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZENvbnRyb2xsZXIoXG4gICAgICBuZXcgTXV0YXRpb25Db250cm9sbGVyKHRoaXMsIHtcbiAgICAgICAgY29uZmlnOiB7IGF0dHJpYnV0ZUZpbHRlcjogWydhcmlhLWxhYmVsbGVkYnknLCAnYXJpYS1sYWJlbCcsICdhcmlhLWRlc2NyaWJlZGJ5J10gfSxcbiAgICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMuX3N5bmNBcmlhTGFiZWxzKCksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY0FyaWFMYWJlbHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl90cmlnZ2VyRWxlbWVudCB8fCBpc1NlcnZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldE9yUmVtb3ZlQXR0cmlidXRlKFxuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQsXG4gICAgICAnYXJpYS1sYWJlbGxlZGJ5JyxcbiAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknKSxcbiAgICApO1xuICAgIHNldE9yUmVtb3ZlQXR0cmlidXRlKHRoaXMuX3RyaWdnZXJFbGVtZW50LCAnYXJpYS1sYWJlbCcsIHRoaXMuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykpO1xuICAgIHNldE9yUmVtb3ZlQXR0cmlidXRlKFxuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQsXG4gICAgICAnYXJpYS1kZXNjcmliZWRieScsXG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpLFxuICAgICk7XG5cbiAgICAvLyBVc2luZyB0aGUgYXNzb2NpYXRlZCBsYWJlbHMgaXMgb25seSBhIGZhbGxiYWNrLlxuICAgIC8vIFRoZSBkcmF3YmFjayBpcywgdGhhdCBpdCBkb2Vzbid0IGdldCB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgbGlzdCBvZiBsYWJlbCBjaGFuZ2VzLlxuICAgIGlmIChcbiAgICAgICF0aGlzLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpICYmXG4gICAgICAhdGhpcy5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpICYmXG4gICAgICB0aGlzLmludGVybmFscy5sYWJlbHMubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudD8uc2V0QXR0cmlidXRlKFxuICAgICAgICAnYXJpYS1sYWJlbCcsXG4gICAgICAgIEFycmF5LmZyb20odGhpcy5pbnRlcm5hbHMubGFiZWxzKVxuICAgICAgICAgIC5tYXAoKGxhYmVsKSA9PiBsYWJlbC50ZXh0Q29udGVudClcbiAgICAgICAgICAuam9pbignLCAnKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqIE9wZW5zIHRoZSBzZWxlY3Rpb24gcGFuZWwuICovXG4gIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUgIT09ICdjbG9zZWQnIHx8XG4gICAgICAhdGhpcy5fb3ZlcmxheSB8fFxuICAgICAgdGhpcy5fb3B0aW9ucy5sZW5ndGggPT09IDAgfHxcbiAgICAgIHRoaXMuZGlzYWJsZWQgfHxcbiAgICAgIHRoaXMuZm9ybURpc2FibGVkIHx8XG4gICAgICAhdGhpcy5kaXNwYXRjaEJlZm9yZU9wZW5FdmVudCgpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PignLnNiYi1zZWxlY3RfX2NvbnRhaW5lcicpPy5zaG93UG9wb3Zlcj8uKCk7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuaW5nJztcbiAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1leHBhbmRlZCcsIHRydWUpO1xuICAgIHRoaXMuX3NldE92ZXJsYXlQb3NpdGlvbigpO1xuXG4gICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpcyB6ZXJvLCB0aGUgYW5pbWF0aW9uZW5kIGV2ZW50IGlzIG5vdCBhbHdheXMgZmlyZWQgcmVsaWFibHkuXG4gICAgLy8gSW4gdGhpcyBjYXNlIHdlIGRpcmVjdGx5IHNldCB0aGUgYG9wZW5lZGAgc3RhdGUuXG4gICAgaWYgKHRoaXMuX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuX2hhbmRsZU9wZW5pbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2xvc2VzIHRoZSBzZWxlY3Rpb24gcGFuZWwuICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29wZW5lZCcgfHwgIXRoaXMuZGlzcGF0Y2hCZWZvcmVDbG9zZUV2ZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NpbmcnO1xuICAgIHRoaXMudG9nZ2xlQXR0cmlidXRlKCdkYXRhLWV4cGFuZGVkJywgZmFsc2UpO1xuICAgIHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBpZiAodGhpcy5fb3JpZ2luRWxlbWVudCkge1xuICAgICAgdGhpcy5fb3JpZ2luUmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKHRoaXMuX29yaWdpbkVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaXMgemVybywgdGhlIGFuaW1hdGlvbmVuZCBldmVudCBpcyBub3QgYWx3YXlzIGZpcmVkIHJlbGlhYmx5LlxuICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBkaXJlY3RseSBzZXQgdGhlIGBjbG9zZWRgIHN0YXRlLlxuICAgIGlmICh0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKHRoaXMsICctLXNiYi1vcHRpb25zLXBhbmVsLWFuaW1hdGlvbi1kdXJhdGlvbicpO1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIGN1cnJlbnQgZGlzcGxheWVkIHZhbHVlLiAqL1xuICBwdWJsaWMgZ2V0RGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlWYWx1ZSA/PyAnJztcbiAgfVxuXG4gIC8qKiBMaXN0ZW5zIHRvIG9wdGlvbiBjaGFuZ2VzLiAqL1xuICBwcml2YXRlIF9vbk9wdGlvbkNoYW5nZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIFNiYk9wdGlvbkVsZW1lbnQ8VD47XG4gICAgaWYgKHRhcmdldC5zZWxlY3RlZCkge1xuICAgICAgdGhpcy5fb25PcHRpb25TZWxlY3RlZCh0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vbk9wdGlvbkRlc2VsZWN0ZWQodGFyZ2V0KTtcbiAgICB9XG4gIH1cblxuICAvKiogTGlzdGVucyB0byBvcHRpb24gY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBfb25PcHRpb25MYWJlbENoYW5nZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIFNiYk9wdGlvbkVsZW1lbnQ8VD47XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLl9nZXRTZWxlY3RlZCgpO1xuXG4gICAgaWYgKFxuICAgICAgKCFBcnJheS5pc0FycmF5KHNlbGVjdGVkKSAmJiB0YXJnZXQgIT09IHNlbGVjdGVkKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpICYmICFzZWxlY3RlZC5pbmNsdWRlcyh0YXJnZXQpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZURpc3BsYXlWYWx1ZShzZWxlY3RlZCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVEaXNwbGF5VmFsdWUoc2VsZWN0ZWQ6IFNiYk9wdGlvbkVsZW1lbnQ8VD4gfCBTYmJPcHRpb25FbGVtZW50PFQ+W10gfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpKSB7XG4gICAgICB0aGlzLl9kaXNwbGF5VmFsdWUgPSBzZWxlY3RlZC5tYXAoKG8pID0+IG8udGV4dENvbnRlbnQpLmpvaW4oJywgJykgfHwgbnVsbDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkKSB7XG4gICAgICB0aGlzLl9kaXNwbGF5VmFsdWUgPSBzZWxlY3RlZD8udGV4dENvbnRlbnQ/LnRyaW0oKSB8fCBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kaXNwbGF5VmFsdWUgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdkaXNwbGF5dmFsdWVjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUsIGNvbXBvc2VkOiB0cnVlIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYHZhbHVlYCBwcm9wZXJ0eSBzaG91bGQgYmUgYWRhcHRlZCB3aGVuIHRoZSBgbXVsdGlwbGVgIHByb3BlcnR5IGNoYW5nZXM6XG4gICAqICAgLSBpZiBpdCBjaGFuZ2VzIHRvIHRydWUsIHRoZSAndmFsdWUnIGlzIHNldCB0byBhbiBhcnJheTtcbiAgICogICAtIGlmIGl0IGNoYW5nZXMgdG8gZmFsc2UsIHRoZSBmaXJzdCBhdmFpbGFibGUgb3B0aW9uIGlzIHNldCBhcyAndmFsdWUnIG90aGVyd2lzZSBpdCdzIHNldCB0byBudWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBfb25NdWx0aXBsZUNoYW5nZWQoaXNDaGFuZ2luZ1RvTXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoaXNDaGFuZ2luZ1RvTXVsdGlwbGUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlICE9PSBudWxsICYmIHRoaXMudmFsdWUgIT09IHVuZGVmaW5lZCA/IFt0aGlzLnZhbHVlIGFzIFRdIDogW107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5sZW5ndGggPyB0aGlzLnZhbHVlWzBdIDogbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGBkaXNhYmxlZGAgb3IgdGhlIGByZWFkb25seWAgcHJvcGVydGllcyBhcmUgc2V0LCBhbmQgdGhlIHBhbmVsIGlzIG9wZW4sIGNsb3NlIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBfY2xvc2VPbkRpc2FibGVkUmVhZG9ubHlDaGFuZ2VkKG5ld1ZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuICYmIG5ld1ZhbHVlKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgdGhlIF9kaXNwbGF5VmFsdWUgYnkgY2hlY2tpbmcgdGhlIGludGVybmFsIHNiYi1vcHRpb25zIGFuZCBzZXR0aW5nIHRoZSBjb3JyZWN0IGBzZWxlY3RlZGAgdmFsdWUgb24gdGhlbS4gKi9cbiAgcHJpdmF0ZSBfb25WYWx1ZUNoYW5nZWQobmV3VmFsdWU6IFQgfCBUW10pOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbkVsZW1lbnQgPSBvcHRpb25zLmZpbmQoKG8pID0+IG8udmFsdWUgPT09IG5ld1ZhbHVlKSA/PyBudWxsO1xuICAgICAgaWYgKG9wdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgb3B0aW9uRWxlbWVudC5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBvcHRpb25zXG4gICAgICAgIC5maWx0ZXIoKG8pID0+IChvLnZhbHVlID8/IG8uZ2V0QXR0cmlidXRlKCd2YWx1ZScpKSAhPT0gbmV3VmFsdWUpXG4gICAgICAgIC5mb3JFYWNoKChvKSA9PiAoby5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICB0aGlzLl91cGRhdGVEaXNwbGF5VmFsdWUob3B0aW9uRWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMuZmlsdGVyKChvKSA9PiAhbmV3VmFsdWUuaW5jbHVkZXMoby52YWx1ZSkpLmZvckVhY2goKGUpID0+IChlLnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBvcHRpb25zLmZpbHRlcigobykgPT4gbmV3VmFsdWUuaW5jbHVkZXMoby52YWx1ZSkpO1xuICAgICAgc2VsZWN0ZWRFbGVtZW50cy5mb3JFYWNoKChvKSA9PiAoby5zZWxlY3RlZCA9IHRydWUpKTtcbiAgICAgIHRoaXMuX3VwZGF0ZURpc3BsYXlWYWx1ZShzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlczx0aGlzPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICAvLyBXYWl0IGZvciBzc3IgaHlkcmF0aW9uXG4gICAgaWYgKCFpc05leHRqcygpKSB7XG4gICAgICB0aGlzLnN0YXJ0VXBkYXRlKCk7XG4gICAgICB0aGlzLl9zZXR1cFNlbGVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIG92ZXJyaWRlIGZvY3VzKCk6IHZvaWQge1xuICAgIC8vIEZvcndhcmQgZm9jdXMgdG8gdGhlIHRyaWdnZXIgZWxlbWVudC5cbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudD8uZm9jdXMoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIG92ZXJyaWRlIGJsdXIoKTogdm9pZCB7XG4gICAgLy8gRm9yd2FyZCBibHVyIHRvIHRoZSB0cmlnZ2VyIGVsZW1lbnQuXG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LmJsdXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGVsZW1lbnQncyBmaXJzdCBhdHRyaWJ1dGUgd2hvc2UgcXVhbGlmaWVkIG5hbWUgaXMgcXVhbGlmaWVkTmFtZS5cbiAgICpcbiAgICogW01ETiBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9FbGVtZW50L3JlbW92ZUF0dHJpYnV0ZSlcbiAgICogQGludGVybmFsIFdlIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBkdWUgdG8gYSBoeWRyYXRpb24gaXNzdWUgd2l0aCBOZXh0LmpzLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHJlbW92ZUF0dHJpYnV0ZShxdWFsaWZpZWROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBJbiBOZXh0LmpzIHRoZSBoeWRyYXRpb24gbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB3ZSBjYW4gbWFuaXB1bGF0ZSB0aGUgbGlnaHQgRE9NLlxuICAgIC8vIEBsaXQvcmVhY3QgY2FsbHMgcmVtb3ZlQXR0cmlidXRlKCdkZWZlci1oeWRyYXRpb24nKSBpbiBhIHVzZUxheW91dEVmZmVjdCxcbiAgICAvLyB3aGljaCBpcyBkb25lIGFmdGVyIGh5ZHJhdGlvbiBpcyBmaW5pc2hlZC4gRHVlIHRvIHRoaXMgd2UgaW50ZXJjZXB0IHRoaXMgY2FsbFxuICAgIC8vIGluIG92ZXJyaWRpbmcgcmVtb3ZlQXR0cmlidXRlIHRvIGZpbmlzaCBpbml0aWFsaXphdGlvbiBvZiB0aGUgc2JiLXNlbGVjdC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbGl0L2xpdC9ibG9iL21haW4vcGFja2FnZXMvcmVhY3Qvc3JjL2NyZWF0ZS1jb21wb25lbnQudHMjTDI5My1MMjk2XG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIHdhaXQgZm9yIHVwZGF0ZSBjb21wbGV0ZSBpbiBvcmRlciB0byBiZSBzdXJlIHRoYXQgdGhlIHNoYWRvdyBET00gaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAgaWYgKGlzTmV4dGpzKCkgJiYgcXVhbGlmaWVkTmFtZSA9PT0gJ2RlZmVyLWh5ZHJhdGlvbicgJiYgIXRoaXMuX2RpZExvYWQpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB0aGlzLl9zZXR1cFNlbGVjdCgpKTtcbiAgICB9XG4gICAgc3VwZXIucmVtb3ZlQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBpZiAoYXJpYVJvbGVPbkhvc3QpIHtcbiAgICAgIHRoaXMuaWQgfHw9IHRoaXMuX292ZXJsYXlJZDtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtRmllbGQgPSB0aGlzLmNsb3Nlc3Q/Lignc2JiLWZvcm0tZmllbGQnKSA/PyB0aGlzLmNsb3Nlc3Q/LignW2RhdGEtZm9ybS1maWVsZF0nKTtcblxuICAgIGlmIChmb3JtRmllbGQpIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSBmb3JtRmllbGQuaGFzQXR0cmlidXRlKCduZWdhdGl2ZScpO1xuICAgIH1cbiAgICB0aGlzLl9zeW5jUHJvcGVydGllcygpO1xuICAgIHRoaXMuX3N5bmNBcmlhTGFiZWxzKCk7XG5cbiAgICBpZiAodGhpcy5fZGlkTG9hZCkge1xuICAgICAgdGhpcy5fc2V0dXBPcmlnaW4oKTtcbiAgICAgIHRoaXMuX3NldHVwVHJpZ2dlcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSByZXF1ZXN0VXBkYXRlKFxuICAgIG5hbWU/OiBQcm9wZXJ0eUtleSxcbiAgICBvbGRWYWx1ZT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFByb3BlcnR5RGVjbGFyYXRpb24sXG4gICk6IHZvaWQge1xuICAgIHN1cGVyLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgIGlmICghbmFtZSAmJiB0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fc3luY0FyaWFMYWJlbHMoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCd2YWx1ZScpICYmICh0aGlzLl9kaWRMb2FkIHx8IHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLl9vblZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlISk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ25lZ2F0aXZlJykgfHwgY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdtdWx0aXBsZScpKSB7XG4gICAgICB0aGlzLl9zeW5jUHJvcGVydGllcygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdyZWFkT25seScpKSB7XG4gICAgICB0aGlzLl9jbG9zZU9uRGlzYWJsZWRSZWFkb25seUNoYW5nZWQodGhpcy5yZWFkT25seSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5wcmVwZW5kKHRoaXMuX3RyaWdnZXJFbGVtZW50KTsgLy8gVGFrZSBiYWNrIHRoZSB0cmlnZ2VyIGVsZW1lbnQgcHJldmlvdXNseSBtb3ZlZCB0byB0aGUgbGlnaHQgRE9NXG4gICAgdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlcj8uYWJvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVzZXQgdmFsdWUgaXMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAodGhlIHNldHVwIHZhbHVlKSwgbnVsbCBvdGhlcndpc2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAodGhpcy5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykgPyB0aGlzLmdldEF0dHJpYnV0ZSgndmFsdWUnKSA6IG51bGwpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKFxuICAgIHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCxcbiAgICBfcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycgfHwgc3RhdGUgPT0gbnVsbCkge1xuICAgICAgdGhpcy52YWx1ZSA9IChzdGF0ZSBhcyBUKSA/PyBudWxsO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgdGhpcy5fcmVhZEZvcm1EYXRhKHN0YXRlKS50aGVuKChhcnJheSkgPT4ge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5tdWx0aXBsZSA/IGFycmF5IDogYXJyYXlbMF07XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZWFkRm9ybURhdGEoZm9ybURhdGE6IEZvcm1EYXRhKTogUHJvbWlzZTxUW10+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBmb3JtRGF0YVxuICAgICAgICAuZ2V0QWxsKHRoaXMubmFtZSlcbiAgICAgICAgLm1hcChhc3luYyAoZW50cnkpID0+XG4gICAgICAgICAgZW50cnkgaW5zdGFuY2VvZiBCbG9iID8gSlNPTi5wYXJzZShhd2FpdCBlbnRyeS50ZXh0KCkpIDogKGVudHJ5IGFzIFQpLFxuICAgICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jUHJvcGVydGllcygpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw/LjxTYmJEaXZpZGVyRWxlbWVudCB8IFNiYk9wdGlvbkhpbnRFbGVtZW50PihcbiAgICAgICdzYmItZGl2aWRlciwgc2JiLW9wdGlvbi1oaW50JyxcbiAgICApLmZvckVhY2goKGVsKSA9PiAoZWwubmVnYXRpdmUgPSB0aGlzLm5lZ2F0aXZlKSk7XG5cbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw/LjxTYmJPcHRpb25FbGVtZW50PFQ+IHwgU2JiT3B0R3JvdXBFbGVtZW50PihcbiAgICAgICdzYmItb3B0aW9uLCBzYmItb3B0Z3JvdXAnLFxuICAgICkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgZWxlbWVudC50b2dnbGVBdHRyaWJ1dGUoJ2RhdGEtbmVnYXRpdmUnLCB0aGlzLm5lZ2F0aXZlKTtcbiAgICAgIGVsZW1lbnQudG9nZ2xlQXR0cmlidXRlKCdkYXRhLW11bHRpcGxlJywgdGhpcy5tdWx0aXBsZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw/LjxTYmJPcHRpb25FbGVtZW50PFQ+IHwgU2JiT3B0R3JvdXBFbGVtZW50PihcbiAgICAgICdzYmItb3B0aW9uLCBzYmItb3B0Z3JvdXAnLFxuICAgICkuZm9yRWFjaCgoZSkgPT4gZS5yZXF1ZXN0VXBkYXRlPy4oKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2hvdWxkVmFsaWRhdGUobmFtZTogUHJvcGVydHlLZXkgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIuc2hvdWxkVmFsaWRhdGUobmFtZSkgfHwgbmFtZSA9PT0gJ3ZhbHVlJyB8fCBuYW1lID09PSAncmVxdWlyZWQnO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHZhbGlkYXRlKCk6IHZvaWQge1xuICAgIHN1cGVyLnZhbGlkYXRlKCk7XG4gICAgaWYgKHRoaXMucmVxdWlyZWQgJiYgdGhpcy5fb3B0aW9ucy5ldmVyeSgobykgPT4gby52YWx1ZSAhPT0gdGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMuc2V0VmFsaWRpdHlGbGFnKCd2YWx1ZU1pc3NpbmcnLCBpMThuU2VsZWN0aW9uUmVxdWlyZWRbdGhpcy5fbGFuZ3VhZ2VDb250cm9sbGVyLmN1cnJlbnRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVWYWxpZGl0eUZsYWcoJ3ZhbHVlTWlzc2luZycpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwU2VsZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuX3NldHVwT3JpZ2luKCk7XG4gICAgdGhpcy5fc2V0dXBUcmlnZ2VyKCk7XG4gICAgdGhpcy5fZGlkTG9hZCA9IHRydWU7XG4gICAgdGhpcy5jb21wbGV0ZVVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqIFNldHMgdGhlIG9yaWdpbkVsZW1lbnQ7IGlmIHRoZSBjb21wb25lbnQgaXMgdXNlZCBpbiBhIHNiYi1mb3JtLWZpZWxkIHVzZXMgaXQsIG90aGVyd2lzZSB1c2VzIHRoZSBwYXJlbnRFbGVtZW50LiAqL1xuICBwcml2YXRlIF9zZXR1cE9yaWdpbigpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtRmllbGQgPSB0aGlzLmNsb3Nlc3Q/Lignc2JiLWZvcm0tZmllbGQnKTtcbiAgICBpZiAodGhpcy5fb3JpZ2luRWxlbWVudCkge1xuICAgICAgdGhpcy5fb3JpZ2luUmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKHRoaXMuX29yaWdpbkVsZW1lbnQpO1xuICAgIH1cbiAgICB0aGlzLl9vcmlnaW5FbGVtZW50ID1cbiAgICAgIGZvcm1GaWVsZD8uc2hhZG93Um9vdD8ucXVlcnlTZWxlY3Rvcj8uKCcjb3ZlcmxheS1hbmNob3InKSA/PyB0aGlzLnBhcmVudEVsZW1lbnQhO1xuICAgIGlmICh0aGlzLl9vcmlnaW5FbGVtZW50KSB7XG4gICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZShcbiAgICAgICAgJ2RhdGEtb3B0aW9uLXBhbmVsLW9yaWdpbi1ib3JkZXJsZXNzJyxcbiAgICAgICAgISFmb3JtRmllbGQ/Lmhhc0F0dHJpYnV0ZT8uKCdib3JkZXJsZXNzJyksXG4gICAgICApO1xuXG4gICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgdGhpcy5fb3JpZ2luUmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9vcmlnaW5FbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG8gYXNzZXNzIHNjcmVlbi1yZWFkZXJzIHByb2JsZW1zIGNhdXNlZCBieSB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBhcmlhIHBhdHRlcm5zIGFuZCBzaGFkb3cgRE9NLFxuICAgKiB3ZSBhcmUgZm9yY2VkIHRvIG1vdmUgdGhlICdjb21ib2JveCcgdHJpZ2dlciBlbGVtZW50IHRvIHRoZSBsaWdodCBET01cbiAgICovXG4gIHByaXZhdGUgX3NldHVwVHJpZ2dlcigpOiB2b2lkIHtcbiAgICAvLyBNb3ZlIHRoZSB0cmlnZ2VyIGJlZm9yZSB0aGUgc2JiLXNlbGVjdFxuICAgIHRoaXMucGFyZW50RWxlbWVudCEuaW5zZXJ0QmVmb3JlPy4odGhpcy5fdHJpZ2dlckVsZW1lbnQsIHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0T3ZlcmxheVBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHNldE92ZXJsYXlQb3NpdGlvbihcbiAgICAgIHRoaXMuX292ZXJsYXksXG4gICAgICB0aGlzLl9vcmlnaW5FbGVtZW50LFxuICAgICAgdGhpcy5fb3B0aW9uQ29udGFpbmVyLFxuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLXNlbGVjdF9fY29udGFpbmVyJykhLFxuICAgICAgdGhpcyxcbiAgICApO1xuICB9XG5cbiAgLy8gSW4gcmFyZSBjYXNlcyBpdCBjYW4gYmUgdGhhdCB0aGUgYW5pbWF0aW9uRW5kIGV2ZW50IGlzIHRyaWdnZXJlZCB0d2ljZS5cbiAgLy8gVG8gYXZvaWQgZW50ZXJpbmcgYSBjb3JydXB0IHN0YXRlLCBleGl0IHdoZW4gc3RhdGUgaXMgbm90IGV4cGVjdGVkLlxuICBwcml2YXRlIF9vbkFuaW1hdGlvbkVuZChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ29wZW4nICYmIHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJykge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ2Nsb3NlJyAmJiB0aGlzLnN0YXRlID09PSAnY2xvc2luZycpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVPcGVuaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmVkJztcbiAgICB0aGlzLl9hdHRhY2hPcGVuUGFuZWxFdmVudHMoKTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpO1xuICAgIHRoaXMuX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLmNvbm5lY3QoKTtcbiAgICBpZiAodGhpcy5fb3JpZ2luRWxlbWVudCkge1xuICAgICAgdGhpcy5fb3JpZ2luUmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9vcmlnaW5FbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5kaXNwYXRjaE9wZW5FdmVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQ2xvc2luZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PignLnNiYi1zZWxlY3RfX2NvbnRhaW5lcicpPy5oaWRlUG9wb3Zlcj8uKCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgdGhpcy5fcmVzZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgdGhpcy5fb3B0aW9uQ29udGFpbmVyLnNjcm9sbFRvcCA9IDA7XG4gICAgdGhpcy5fZXNjYXBhYmxlT3ZlcmxheUNvbnRyb2xsZXIuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuZGlzcGF0Y2hDbG9zZUV2ZW50KCk7XG4gIH1cblxuICAvKiogV2hlbiBhbiBvcHRpb24gaXMgc2VsZWN0ZWQsIHVwZGF0ZXMgdGhlIGRpc3BsYXlWYWx1ZTsgaXQgYWxzbyBjbG9zZXMgdGhlIHNlbGVjdCBpZiBub3QgYG11bHRpcGxlYC4gKi9cbiAgcHJpdmF0ZSBfb25PcHRpb25TZWxlY3RlZChvcHRpb25TZWxlY3Rpb25DaGFuZ2U6IFNiYk9wdGlvbkVsZW1lbnQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuX2ZpbHRlcmVkT3B0aW9uc1xuICAgICAgICAuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5pZCAhPT0gb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLmlkKVxuICAgICAgICAuZm9yRWFjaCgob3B0aW9uKSA9PiAob3B0aW9uLnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICAgIHRoaXMudmFsdWUgPSBvcHRpb25TZWxlY3Rpb25DaGFuZ2UudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gW29wdGlvblNlbGVjdGlvbkNoYW5nZS52YWx1ZSFdO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpICYmICF0aGlzLnZhbHVlLmluY2x1ZGVzKG9wdGlvblNlbGVjdGlvbkNoYW5nZS52YWx1ZSEpKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgb3B0aW9uU2VsZWN0aW9uQ2hhbmdlLnZhbHVlIV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZGlzcGF0Y2hJbnB1dEV2ZW50cygpO1xuICB9XG5cbiAgLyoqIFdoZW4gYW4gb3B0aW9uIGlzIHVuc2VsZWN0ZWQgaW4gYG11bHRpcGxlYCwgcmVtb3ZlcyBpdCBmcm9tIHZhbHVlIGFuZCB1cGRhdGVzIGRpc3BsYXlWYWx1ZS4gKi9cbiAgcHJpdmF0ZSBfb25PcHRpb25EZXNlbGVjdGVkKG9wdGlvblNlbGVjdGlvbkNoYW5nZTogU2JiT3B0aW9uRWxlbWVudDxUPik6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcigoZWwpID0+IGVsICE9PSBvcHRpb25TZWxlY3Rpb25DaGFuZ2UudmFsdWUpO1xuICAgICAgdGhpcy5fZGlzcGF0Y2hJbnB1dEV2ZW50cygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Rpc3BhdGNoSW5wdXRFdmVudHMoKTogdm9pZCB7XG4gICAgLyoqIFRoZSBpbnB1dCBldmVudCBmaXJlcyB3aGVuIHRoZSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIGFzIGEgZGlyZWN0IHJlc3VsdCBvZiBhIHVzZXIgYWN0aW9uLiAqL1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBJbnB1dEV2ZW50KCdpbnB1dCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNoYW5nZSBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSB1c2VyIG1vZGlmaWVzIHRoZSBlbGVtZW50J3MgdmFsdWUuXG4gICAgICogVW5saWtlIHRoZSBpbnB1dCBldmVudCwgdGhlIGNoYW5nZSBldmVudCBpcyBub3QgbmVjZXNzYXJpbHkgZmlyZWRcbiAgICAgKiBmb3IgZWFjaCBhbHRlcmF0aW9uIHRvIGFuIGVsZW1lbnQncyB2YWx1ZS5cbiAgICAgKi9cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXR0YWNoT3BlblBhbmVsRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgb3ZlcmxheSBwb3NpdGlvbiBvbiBzY3JvbGwgYW5kIHdpbmRvdyByZXNpemVcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB0aGlzLl9zZXRPdmVybGF5UG9zaXRpb24oKSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgICAvLyBXaXRob3V0IGNhcHR1cmUsIG90aGVyIHNjcm9sbCBjb250ZXh0cyB3b3VsZCBub3QgYnViYmxlIHRvIHRoaXMgZXZlbnQgbGlzdGVuZXIuXG4gICAgICAvLyBDYXB0dXJlIGFsbG93cyB1cyB0byByZWFjdCB0byBhbGwgc2Nyb2xsIGNvbnRleHRzIGluIHRoaXMgRE9NLlxuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdGhpcy5fc2V0T3ZlcmxheVBvc2l0aW9uKCksIHtcbiAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICBzaWduYWw6IHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuXG4gICAgLy8gQ2xvc2UgbWVudSBvbiBiYWNrZHJvcCBjbGlja1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIChldikgPT4gdGhpcy5fcG9pbnRlckRvd25MaXN0ZW5lcihldiksIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIChldikgPT4gdGhpcy5fY2xvc2VPbkJhY2tkcm9wQ2xpY2soZXYpLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW5lZCcpIHtcbiAgICAgIHRoaXMuX29wZW5lZFBhbmVsS2V5Ym9hcmRJbnRlcmFjdGlvbihldmVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnY2xvc2VkJykge1xuICAgICAgdGhpcy5fY2xvc2VkUGFuZWxLZXlib2FyZEludGVyYWN0aW9uKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbG9zZWRQYW5lbEtleWJvYXJkSW50ZXJhY3Rpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2hlY2tGb3JMZXR0ZXJTZWxlY3Rpb24oZXZlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbkJ5VGV4dChldmVudCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb3BlbmVkUGFuZWxLZXlib2FyZEludGVyYWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkgfHwgdGhpcy5zdGF0ZSAhPT0gJ29wZW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY2hlY2tGb3JMZXR0ZXJTZWxlY3Rpb24oZXZlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbkJ5VGV4dChldmVudCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9zZWxlY3RCeUtleWJvYXJkKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uKGV2ZW50LCAwKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VuZCc6XG4gICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQsIHRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5sZW5ndGggLSAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tGb3JMZXR0ZXJTZWxlY3Rpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyB8fFxuICAgICAgZXZlbnQua2V5ID09PSAnQ2xlYXInIHx8XG4gICAgICAoZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBldmVudC5rZXkgIT09ICcgJyAmJlxuICAgICAgICAhZXZlbnQuYWx0S2V5ICYmXG4gICAgICAgICFldmVudC5jdHJsS2V5ICYmXG4gICAgICAgICFldmVudC5tZXRhS2V5KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9zZXROZXh0QWN0aXZlT3B0aW9uQnlUZXh0KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgLy8gU2V0IHRpbWVvdXQgYW5kIHRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICAgIGlmICh0eXBlb2YgdGhpcy5fc2VhcmNoVGltZW91dCA9PT0gdHlwZW9mIHNldFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zZWFyY2hUaW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5fc2VhcmNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuX3NlYXJjaFN0cmluZyA9ICcnKSwgMTAwMCk7XG4gICAgdGhpcy5fc2VhcmNoU3RyaW5nICs9IGV2ZW50LmtleTtcblxuICAgIC8vIFJlb3JkZXIgdGhlIF9maWx0ZXJlZE9wdGlvbiBhcnJheSB0byBoYXZlIHRoZSBsYXN0IHNlbGVjdGVkIGVsZW1lbnQgYXQgdGhlIGJvdHRvbS5cbiAgICBjb25zdCBpbmRleEZvclNsaWNlOiBudW1iZXIgPSB0aGlzLl9hY3RpdmVJdGVtSW5kZXggKyAxO1xuICAgIGNvbnN0IGZpbHRlcmVkT3B0aW9uc1NvcnRlZCA9IFtcbiAgICAgIC4uLnRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5zbGljZShpbmRleEZvclNsaWNlKSxcbiAgICAgIC4uLnRoaXMuX2ZpbHRlcmVkT3B0aW9ucy5zbGljZSgwLCBpbmRleEZvclNsaWNlKSxcbiAgICBdO1xuXG4gICAgY29uc3QgbWF0Y2ggPSBmaWx0ZXJlZE9wdGlvbnNTb3J0ZWQuZmluZChcbiAgICAgIChvcHRpb24pID0+IG9wdGlvbi50ZXh0Q29udGVudD8udG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMuX3NlYXJjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSA9PT0gMCxcbiAgICApO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgLy8gSWYgYW4gZXhhY3QgbWF0Y2ggaGFzIGJlZW4gZm91bmQsIGdvIHRvIHRoYXQgb3B0aW9uLlxuICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCwgdGhpcy5fZmlsdGVyZWRPcHRpb25zLmluZGV4T2YobWF0Y2gpKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5fc2VhcmNoU3RyaW5nLmxlbmd0aCA+IDEgJiZcbiAgICAgIG5ldyBSZWdFeHAoYF4ke3RoaXMuX3NlYXJjaFN0cmluZy5jaGFyQXQoMCl9KiRgKS50ZXN0KHRoaXMuX3NlYXJjaFN0cmluZylcbiAgICApIHtcbiAgICAgIC8vIElmIG5vIGV4YWN0IG1hdGNoIGhhcyBiZWVuIGZvdW5kIGJ1dCB0aGUgc3RyaW5nIHRvIHNlYXJjaCBpcyBtYWRlIGJ5IHRoZSBzYW1lIHJlcGVhdGVkIGxldHRlcixcbiAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBlbGVtZW50LCBpZiBleGlzdHMsIHRoYXQgbWF0Y2hlcyB0aGUgbGV0dGVyLlxuICAgICAgY29uc3QgZmlyc3RNYXRjaCA9IGZpbHRlcmVkT3B0aW9uc1NvcnRlZC5maW5kKFxuICAgICAgICAob3B0aW9uKSA9PlxuICAgICAgICAgIG9wdGlvbi50ZXh0Q29udGVudD8udG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMuX3NlYXJjaFN0cmluZ1swXS50b0xvd2VyQ2FzZSgpKSA9PT0gMCxcbiAgICAgICk7XG4gICAgICBpZiAoZmlyc3RNYXRjaCkge1xuICAgICAgICB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uKGV2ZW50LCB0aGlzLl9maWx0ZXJlZE9wdGlvbnMuaW5kZXhPZihmaXJzdE1hdGNoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIG1hdGNoIGZvdW5kLCBjbGVhciB0aGUgdGltZW91dCBhbmQgdGhlIHNlYXJjaCB0ZXJtLlxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NlYXJjaFRpbWVvdXQpO1xuICAgICAgdGhpcy5fc2VhcmNoU3RyaW5nID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0QnlLZXlib2FyZCgpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVPcHRpb24gPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnNbdGhpcy5fYWN0aXZlSXRlbUluZGV4XTtcblxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICBhY3RpdmVPcHRpb24/Llsnc2VsZWN0VmlhVXNlckludGVyYWN0aW9uJ10oIWFjdGl2ZU9wdGlvbi5zZWxlY3RlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXROZXh0QWN0aXZlT3B0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZpbHRlcmVkT3B0aW9ucyA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9ucztcblxuICAgIC8vIFByZXZlbnQga2V5Ym9hcmQgbmF2aWdhdGlvbiBpZiBhbGwgb3B0aW9ucyBhcmUgZGlzYWJsZWRcbiAgICBpZiAoZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRJbmRleCA9XG4gICAgICBpbmRleCA/PyBnZXROZXh0RWxlbWVudEluZGV4KGV2ZW50LCB0aGlzLl9hY3RpdmVJdGVtSW5kZXgsIGZpbHRlcmVkT3B0aW9ucy5sZW5ndGgpO1xuICAgIGNvbnN0IG5leHRPcHRpb24gPSBmaWx0ZXJlZE9wdGlvbnNbbmV4dEluZGV4XTtcbiAgICBjb25zdCBhY3RpdmVPcHRpb24gPSBmaWx0ZXJlZE9wdGlvbnNbdGhpcy5fYWN0aXZlSXRlbUluZGV4XTtcblxuICAgIHRoaXMuX3NldEFjdGl2ZUVsZW1lbnQobmV4dE9wdGlvbiwgYWN0aXZlT3B0aW9uKTtcblxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5fc2V0U2VsZWN0ZWRFbGVtZW50KG5leHRPcHRpb24sIGFjdGl2ZU9wdGlvbik7XG4gICAgfSBlbHNlIGlmIChldmVudD8uc2hpZnRLZXkpIHtcbiAgICAgIG5leHRPcHRpb25bJ3NlbGVjdFZpYVVzZXJJbnRlcmFjdGlvbiddKCFuZXh0T3B0aW9uLnNlbGVjdGVkKTtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlSXRlbUluZGV4ID0gbmV4dEluZGV4O1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0QWN0aXZlRWxlbWVudChcbiAgICBuZXh0QWN0aXZlT3B0aW9uOiBTYmJPcHRpb25FbGVtZW50PFQ+LFxuICAgIGxhc3RBY3RpdmVPcHRpb246IFNiYk9wdGlvbkVsZW1lbnQ8VD4gfCBudWxsID0gbnVsbCxcbiAgICBzZXRBY3RpdmVEZXNjZW5kYW50ID0gdHJ1ZSxcbiAgKTogdm9pZCB7XG4gICAgbmV4dEFjdGl2ZU9wdGlvbi5zZXRBY3RpdmUodHJ1ZSk7XG4gICAgbmV4dEFjdGl2ZU9wdGlvbi5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG5cbiAgICBpZiAoc2V0QWN0aXZlRGVzY2VuZGFudCkge1xuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLCBuZXh0QWN0aXZlT3B0aW9uLmlkKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCB0aGUgcHJldmlvdXNcbiAgICBpZiAobGFzdEFjdGl2ZU9wdGlvbiAmJiBsYXN0QWN0aXZlT3B0aW9uICE9PSBuZXh0QWN0aXZlT3B0aW9uKSB7XG4gICAgICBsYXN0QWN0aXZlT3B0aW9uLnNldEFjdGl2ZShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U2VsZWN0ZWRFbGVtZW50KFxuICAgIG5leHRBY3RpdmVPcHRpb246IFNiYk9wdGlvbkVsZW1lbnQ8VD4sXG4gICAgbGFzdEFjdGl2ZU9wdGlvbjogU2JiT3B0aW9uRWxlbWVudDxUPixcbiAgKTogdm9pZCB7XG4gICAgbmV4dEFjdGl2ZU9wdGlvblsnc2VsZWN0VmlhVXNlckludGVyYWN0aW9uJ10odHJ1ZSk7XG5cbiAgICBpZiAobGFzdEFjdGl2ZU9wdGlvbiAmJiBsYXN0QWN0aXZlT3B0aW9uICE9PSBuZXh0QWN0aXZlT3B0aW9uKSB7XG4gICAgICBsYXN0QWN0aXZlT3B0aW9uWydzZWxlY3RWaWFVc2VySW50ZXJhY3Rpb24nXShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVzZXRBY3RpdmVFbGVtZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnNbdGhpcy5fYWN0aXZlSXRlbUluZGV4XTtcblxuICAgIGlmIChhY3RpdmVFbGVtZW50KSB7XG4gICAgICBhY3RpdmVFbGVtZW50LnNldEFjdGl2ZShmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IC0xO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1hY3RpdmVkZXNjZW5kYW50Jyk7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgcG9pbnRlcmRvd24gZXZlbnQgdGFyZ2V0IGlzIHRyaWdnZXJlZCBvbiB0aGUgbWVudS5cbiAgcHJpdmF0ZSBfcG9pbnRlckRvd25MaXN0ZW5lciA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgdGhpcy5faXNQb2ludGVyRG93bkV2ZW50T25NZW51ID0gaXNFdmVudE9uRWxlbWVudCh0aGlzLl9vdmVybGF5LCBldmVudCk7XG4gIH07XG5cbiAgLy8gQ2xvc2UgbWVudSBvbiBiYWNrZHJvcCBjbGljay5cbiAgcHJpdmF0ZSBfY2xvc2VPbkJhY2tkcm9wQ2xpY2sgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGhpcy5faXNQb2ludGVyRG93bkV2ZW50T25NZW51ICYmICFpc0V2ZW50T25FbGVtZW50KHRoaXMuX292ZXJsYXksIGV2ZW50KSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIF9zZXRWYWx1ZUZyb21TZWxlY3RlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuX2dldFNlbGVjdGVkKCk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RlZCkpIHtcbiAgICAgIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlOiBUW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygc2VsZWN0ZWQpIHtcbiAgICAgICAgICB2YWx1ZS5wdXNoKG9wdGlvbi52YWx1ZSEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkKSB7XG4gICAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSB0aGlzLl9maWx0ZXJlZE9wdGlvbnMuZmluZEluZGV4KChvcHRpb24pID0+IG9wdGlvbiA9PT0gc2VsZWN0ZWQpO1xuICAgICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkLnZhbHVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgLy8gSWYgd2UgYXJyaXZlIGhlcmUgd2l0aG91dCBhbnkgb3B0aW9ucyBiZWluZyBzZWxlY3RlZCxcbiAgICAgIC8vIHdlIHNob3VsZCB0cnkgdG8gY2hlY2sgdGhlIGN1cnJlbnQgdmFsdWUgYWdhaW5zdCB0aGUgYXZhaWxhYmxlIG9wdGlvbnNcbiAgICAgIC8vIChhbmQgc2VsZWN0IGl0IGlmIGFueSBtYXRjaCBpcyBmb3VuZCkuXG4gICAgICB0aGlzLl9vblZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRTZWxlY3RlZCgpOiBTYmJPcHRpb25FbGVtZW50PFQ+IHwgU2JiT3B0aW9uRWxlbWVudDxUPltdIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJlZE9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJlZE9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24uc2VsZWN0ZWQpID8/IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdG9nZ2xlT3BlbmluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmZvcm1EaXNhYmxlZCB8fCB0aGlzLnJlYWRPbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5mb2N1cygpO1xuXG4gICAgc3dpdGNoICh0aGlzLnN0YXRlKSB7XG4gICAgICBjYXNlICdvcGVuZWQnOiB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjbG9zZWQnOiB7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NwcmVhZERlZmVycmVkRGlzcGxheVZhbHVlKFxuICAgIHBsYWNlaG9sZGVyOiBUZW1wbGF0ZVJlc3VsdCxcbiAgKTogKFRlbXBsYXRlUmVzdWx0IHwgUHJvbWlzZTxUZW1wbGF0ZVJlc3VsdD4pW10ge1xuICAgIHJldHVybiBbdGhpcy5fZGVmZXJyZWREaXNwbGF5VmFsdWUocGxhY2Vob2xkZXIpLCBwbGFjZWhvbGRlcl07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9kZWZlcnJlZERpc3BsYXlWYWx1ZShwbGFjZWhvbGRlcjogVGVtcGxhdGVSZXN1bHQpOiBQcm9taXNlPFRlbXBsYXRlUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuaHlkcmF0aW9uUmVxdWlyZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuaHlkcmF0aW9uQ29tcGxldGU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5VmFsdWUgPyBodG1sYCR7dGhpcy5fZGlzcGxheVZhbHVlfWAgOiBwbGFjZWhvbGRlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZW5kZXIoKTogVGVtcGxhdGVSZXN1bHQge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPCEtLSBUaGlzIGVsZW1lbnQgaXMgdmlzdWFsbHkgaGlkZGVuIGFuZCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBsaWdodCBET00gdG8gYWxsb3cgc2NyZWVuXG4gICAgICByZWFkZXJzIHRvIHdvcmsgcHJvcGVybHkgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwic2JiLXNjcmVlbi1yZWFkZXItb25seSBzYmItc2VsZWN0LXRyaWdnZXJcIlxuICAgICAgICB0YWJpbmRleD0ke3RoaXMuZGlzYWJsZWQgfHwgdGhpcy5mb3JtRGlzYWJsZWQgPyBub3RoaW5nIDogJzAnfVxuICAgICAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXG4gICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICAgIGFyaWEtcmVxdWlyZWQ9JHt0aGlzLnJlcXVpcmVkLnRvU3RyaW5nKCl9XG4gICAgICAgIGFyaWEtY29udHJvbHM9JHt0aGlzLl9vdmVybGF5SWR9XG4gICAgICAgIGFyaWEtb3ducz0ke3RoaXMuX292ZXJsYXlJZH1cbiAgICAgICAgQGtleWRvd249JHt0aGlzLl9vbktleURvd259XG4gICAgICAgIEBjbGljaz0ke3RoaXMuX3RvZ2dsZU9wZW5pbmd9XG4gICAgICAgICR7cmVmKChyZWYpID0+ICh0aGlzLl90cmlnZ2VyRWxlbWVudCA9IHJlZiBhcyBIVE1MRWxlbWVudCkpfVxuICAgICAgPlxuICAgICAgICAke3VudGlsKC4uLnRoaXMuX3NwcmVhZERlZmVycmVkRGlzcGxheVZhbHVlKGh0bWxgPHNwYW4+JHt0aGlzLnBsYWNlaG9sZGVyfTwvc3Bhbj5gKSl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBWaXN1YWxseSBkaXNwbGF5IHRoZSB2YWx1ZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X190cmlnZ2VyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICR7dW50aWwoXG4gICAgICAgICAgLi4udGhpcy5fc3ByZWFkRGVmZXJyZWREaXNwbGF5VmFsdWUoXG4gICAgICAgICAgICBodG1sYDxzcGFuIGNsYXNzPVwic2JiLXNlbGVjdF9fdHJpZ2dlci0tcGxhY2Vob2xkZXJcIj4ke3RoaXMucGxhY2Vob2xkZXJ9PC9zcGFuPmAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNlbGVjdF9fZ2FwLWZpeFwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zZWxlY3RfX2NvbnRhaW5lclwiIHBvcG92ZXI9XCJtYW51YWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiYi1zZWxlY3RfX2dhcC1maXhcIj4ke292ZXJsYXlHYXBGaXhDb3JuZXJzKCl9PC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBAYW5pbWF0aW9uZW5kPSR7dGhpcy5fb25BbmltYXRpb25FbmR9XG4gICAgICAgICAgY2xhc3M9XCJzYmItc2VsZWN0X19wYW5lbFwiXG4gICAgICAgICAgJHtyZWYoKGRpYWxvZ1JlZikgPT4gKHRoaXMuX292ZXJsYXkgPSBkaWFsb2dSZWYgYXMgSFRNTEVsZW1lbnQpKX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X193cmFwcGVyXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGlkPSR7IWFyaWFSb2xlT25Ib3N0ID8gdGhpcy5fb3ZlcmxheUlkIDogbm90aGluZ31cbiAgICAgICAgICAgICAgY2xhc3M9XCJzYmItc2VsZWN0X19vcHRpb25zXCJcbiAgICAgICAgICAgICAgcm9sZT0keyFhcmlhUm9sZU9uSG9zdCA/ICdsaXN0Ym94JyA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgID9hcmlhLW11bHRpc2VsZWN0YWJsZT0ke3RoaXMubXVsdGlwbGV9XG4gICAgICAgICAgICAgICR7cmVmKChjb250YWluZXJSZWYpID0+ICh0aGlzLl9vcHRpb25Db250YWluZXIgPSBjb250YWluZXJSZWYgYXMgSFRNTEVsZW1lbnQpKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNsb3QgQHNsb3RjaGFuZ2U9JHt0aGlzLl9zZXRWYWx1ZUZyb21TZWxlY3RlZH0+PC9zbG90PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAnc2JiLXNlbGVjdCc6IFNiYlNlbGVjdEVsZW1lbnQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJzdGF0ZSIsInJlZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlDQSxNQUFNLGlCQUFpQjtBQUV2QixJQUFJLFNBQVM7SUFhUCxvQkFBZ0IsTUFBQTs7MEJBRHJCLGNBQWMsWUFBWSxDQUFDOzs7O29CQUNlLHdCQUN6QyxpQkFDRSxpQkFDRSxrQkFDRSxpQkFDRSxpQkFDRSx1QkFBdUQsdUJBQXVCLENBQUMsQ0FDaEYsQ0FDRixDQUNGLENBQ0YsQ0FDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVhnQyxFQUFBLG1CQUFRLFlBWTFDO0FBQUEsSUFrR0MsY0FBQTtBQUNFLFlBQUE7QUFqRkY7QUFRQTtBQVFBO0FBSUE7QUFNNkI7QUFXcEI7QUFyQ08seUJBQUEsK0JBQUEsa0JBQUEsTUFBQSwy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
1087
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE11dGF0aW9uQ29udHJvbGxlciB9IGZyb20gJ0BsaXQtbGFicy9vYnNlcnZlcnMvbXV0YXRpb24tY29udHJvbGxlci5qcyc7XG5pbXBvcnQgeyBSZXNpemVDb250cm9sbGVyIH0gZnJvbSAnQGxpdC1sYWJzL29ic2VydmVycy9yZXNpemUtY29udHJvbGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwLCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBQcm9wZXJ0eVZhbHVlcywgVGVtcGxhdGVSZXN1bHQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgaXNTZXJ2ZXIsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHVudGlsIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW50aWwuanMnO1xuXG5pbXBvcnQgeyBnZXROZXh0RWxlbWVudEluZGV4IH0gZnJvbSAnLi4vY29yZS9hMTF5LmpzJztcbmltcG9ydCB7IFNiYk9wZW5DbG9zZUJhc2VFbGVtZW50IH0gZnJvbSAnLi4vY29yZS9iYXNlLWVsZW1lbnRzLmpzJztcbmltcG9ydCB7IFNiYkVzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLCBTYmJMYW5ndWFnZUNvbnRyb2xsZXIgfSBmcm9tICcuLi9jb3JlL2NvbnRyb2xsZXJzLmpzJztcbmltcG9ydCB7IGZvcmNlVHlwZSwgZ2V0T3ZlcnJpZGUsIGhhbmRsZURpc3RpbmN0Q2hhbmdlIH0gZnJvbSAnLi4vY29yZS9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7XG4gIGlzTGVhbixcbiAgaXNOZXh0anMsXG4gIGlzU2FmYXJpLFxuICBpc1plcm9BbmltYXRpb25EdXJhdGlvbixcbiAgc2V0T3JSZW1vdmVBdHRyaWJ1dGUsXG59IGZyb20gJy4uL2NvcmUvZG9tLmpzJztcbmltcG9ydCB7IGkxOG5TZWxlY3Rpb25SZXF1aXJlZCB9IGZyb20gJy4uL2NvcmUvaTE4bi5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEZvcm1SZXN0b3JlUmVhc29uLFxuICB0eXBlIEZvcm1SZXN0b3JlU3RhdGUsXG4gIFNiYkRpc2FibGVkTWl4aW4sXG4gIFNiYkZvcm1Bc3NvY2lhdGVkTWl4aW4sXG4gIFNiYkh5ZHJhdGlvbk1peGluLFxuICBTYmJOZWdhdGl2ZU1peGluLFxuICBTYmJSZWFkb25seU1peGluLFxuICBTYmJSZXF1aXJlZE1peGluLFxuICBTYmJVcGRhdGVTY2hlZHVsZXJNaXhpbixcbn0gZnJvbSAnLi4vY29yZS9taXhpbnMuanMnO1xuaW1wb3J0IHsgaXNFdmVudE9uRWxlbWVudCwgb3ZlcmxheUdhcEZpeENvcm5lcnMsIHNldE92ZXJsYXlQb3NpdGlvbiB9IGZyb20gJy4uL2NvcmUvb3ZlcmxheS5qcyc7XG5pbXBvcnQgeyBib3hTaXppbmdTdHlsZXMgfSBmcm9tICcuLi9jb3JlL3N0eWxlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYkRpdmlkZXJFbGVtZW50IH0gZnJvbSAnLi4vZGl2aWRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNiYk9wdEdyb3VwRWxlbWVudCwgU2JiT3B0aW9uRWxlbWVudCwgU2JiT3B0aW9uSGludEVsZW1lbnQgfSBmcm9tICcuLi9vcHRpb24uanMnO1xuXG5pbXBvcnQgc3R5bGUgZnJvbSAnLi9zZWxlY3Quc2Nzcz9saXQmaW5saW5lJztcblxuLyoqXG4gKiBPbiBTYWZhcmksIHRoZSBhcmlhIHJvbGUgJ2xpc3Rib3gnIG11c3QgYmUgb24gdGhlIGhvc3QgZWxlbWVudCwgb3IgZWxzZSBWb2ljZU92ZXIgd29uJ3Qgd29yayBhdCBhbGwuXG4gKiBPbiB0aGUgb3RoZXIgaGFuZCwgSkFXUyBhbmQgTlZEQSBuZWVkIHRoZSByb2xlIHRvIGJlIGFuIFwiaW1tZWRpYXRlIHBhcmVudFwiIHRvIHRoZSBvcHRpb25zLCBvciBlbHNlIG9wdGdyb3VwcyB3b24ndCB3b3JrLlxuICovXG5jb25zdCBhcmlhUm9sZU9uSG9zdCA9IGlzU2FmYXJpO1xuXG5sZXQgbmV4dElkID0gMDtcblxuLyoqXG4gKiBJdCBkaXNwbGF5cyBhIHBhbmVsIHdpdGggc2VsZWN0YWJsZSBvcHRpb25zLlxuICpcbiAqIEBzbG90IC0gVXNlIHRoZSB1bm5hbWVkIHNsb3QgdG8gYWRkIG9wdGlvbnMuXG4gKiBAY3NzcHJvcCBbLS1zYmItc2VsZWN0LXotaW5kZXg9dmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KV0gLSBUbyBzcGVjaWZ5IGEgY3VzdG9tIHN0YWNrIG9yZGVyLFxuICogdGhlIGB6LWluZGV4YCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyB0aGlzIENTUyB2YXJpYWJsZS4gVGhlIGRlZmF1bHQgYHotaW5kZXhgIG9mIHRoZVxuICogY29tcG9uZW50IGlzIHNldCB0byBgdmFyKC0tc2JiLW92ZXJsYXktZGVmYXVsdC16LWluZGV4KWAgd2l0aCBhIHZhbHVlIG9mIGAxMDAwYC5cbiAqIEBvdmVycmlkZVR5cGUgdmFsdWUgLSAoVCA9IHN0cmluZyB8IHN0cmluZ1tdKSB8IG51bGxcbiAqL1xuZXhwb3J0XG5AY3VzdG9tRWxlbWVudCgnc2JiLXNlbGVjdCcpXG5jbGFzcyBTYmJTZWxlY3RFbGVtZW50PFQgPSBzdHJpbmc+IGV4dGVuZHMgU2JiVXBkYXRlU2NoZWR1bGVyTWl4aW4oXG4gIFNiYkRpc2FibGVkTWl4aW4oXG4gICAgU2JiTmVnYXRpdmVNaXhpbihcbiAgICAgIFNiYkh5ZHJhdGlvbk1peGluKFxuICAgICAgICBTYmJSZXF1aXJlZE1peGluKFxuICAgICAgICAgIFNiYlJlYWRvbmx5TWl4aW4oXG4gICAgICAgICAgICBTYmJGb3JtQXNzb2NpYXRlZE1peGluPHR5cGVvZiBTYmJPcGVuQ2xvc2VCYXNlRWxlbWVudD4oU2JiT3BlbkNsb3NlQmFzZUVsZW1lbnQpLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICksXG4gICksXG4pIHtcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSByb2xlID0gYXJpYVJvbGVPbkhvc3QgPyAnbGlzdGJveCcgOiBudWxsO1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBbYm94U2l6aW5nU3R5bGVzLCBzdHlsZV07XG5cbiAgLy8gVE9ETzogZml4IHVzaW5nIC4uLnN1cGVyLmV2ZW50cyByZXF1aXJlczogaHR0cHM6Ly9naXRodWIuY29tL3NiYi1kZXNpZ24tc3lzdGVtcy9seW5lLWNvbXBvbmVudHMvaXNzdWVzLzI2MDBcbiAgcHVibGljIHN0YXRpYyBvdmVycmlkZSByZWFkb25seSBldmVudHMgPSB7XG4gICAgY2hhbmdlOiAnY2hhbmdlJyxcbiAgICBpbnB1dDogJ2lucHV0JyxcbiAgICBkaXNwbGF5dmFsdWVjaGFuZ2U6ICdkaXNwbGF5dmFsdWVjaGFuZ2UnLFxuICAgIGJlZm9yZW9wZW46ICdiZWZvcmVvcGVuJyxcbiAgICBvcGVuOiAnb3BlbicsXG4gICAgYmVmb3JlY2xvc2U6ICdiZWZvcmVjbG9zZScsXG4gICAgY2xvc2U6ICdjbG9zZScsXG4gIH0gYXMgY29uc3Q7XG5cbiAgLyoqIFRoZSBwbGFjZWhvbGRlciB1c2VkIGlmIG5vIHZhbHVlIGhhcyBiZWVuIHNlbGVjdGVkLiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQHByb3BlcnR5KClcbiAgcHVibGljIGFjY2Vzc29yIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcblxuICAvKiogV2hldGhlciB0aGUgc2VsZWN0IGFsbG93cyBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uLiAqL1xuICBAZm9yY2VUeXBlKClcbiAgQGhhbmRsZURpc3RpbmN0Q2hhbmdlKChlOiBTYmJTZWxlY3RFbGVtZW50PFQ+LCBuZXdWYWx1ZTogYm9vbGVhbikgPT5cbiAgICBlLl9vbk11bHRpcGxlQ2hhbmdlZChuZXdWYWx1ZSksXG4gIClcbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KVxuICBwdWJsaWMgYWNjZXNzb3IgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAZm9yY2VUeXBlKClcbiAgQGhhbmRsZURpc3RpbmN0Q2hhbmdlKChlOiBTYmJTZWxlY3RFbGVtZW50PFQ+LCBuZXdWYWx1ZTogYm9vbGVhbikgPT5cbiAgICBlLl9jbG9zZU9uRGlzYWJsZWRSZWFkb25seUNoYW5nZWQobmV3VmFsdWUpLFxuICApXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSlcbiAgQGdldE92ZXJyaWRlKChlOiBTYmJTZWxlY3RFbGVtZW50PFQ+LCB2OiBib29sZWFuKTogYm9vbGVhbiA9PiB2IHx8IGUuaXNEaXNhYmxlZEV4dGVybmFsbHkoKSlcbiAgcHVibGljIG92ZXJyaWRlIGFjY2Vzc29yIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFZhbHVlIG9mIHRoZSBmb3JtIGVsZW1lbnQuICovXG4gIEBwcm9wZXJ0eSgpXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IFRbXSB8IFQpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuX3VwZGF0ZU9wdGlvbnNGcm9tVmFsdWUoKTtcbiAgICB0aGlzLl9pc1ZhbHVlTWFudWFsbHlBc3NpZ25lZCA9IHRydWU7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBUW10gfCBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHByaXZhdGUgX3ZhbHVlOiBUIHwgVFtdIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFNpemUgdmFyaWFudCwgZWl0aGVyIG0gb3Igcy5cbiAgICogQGRlZmF1bHQgJ20nIC8gJ3MnIChsZWFuKVxuICAgKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSB9KSBwdWJsaWMgYWNjZXNzb3Igc2l6ZTogJ20nIHwgJ3MnID0gaXNMZWFuKCkgPyAncycgOiAnbSc7XG5cbiAgLyoqXG4gICAqIEZvcm0gdHlwZSBvZiBlbGVtZW50LlxuICAgKiBAZGVmYXVsdCAnc2VsZWN0LW9uZSAvIHNlbGVjdC1tdWx0aXBsZSdcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm11bHRpcGxlID8gJ3NlbGVjdC1tdWx0aXBsZScgOiAnc2VsZWN0LW9uZSc7XG4gIH1cblxuICAvKiogVGhlIHZhbHVlIGRpc3BsYXllZCBieSB0aGUgY29tcG9uZW50LiAqL1xuICBAc3RhdGUoKSBwcml2YXRlIGFjY2Vzc29yIF9kaXNwbGF5VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX29yaWdpblJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZUNvbnRyb2xsZXIodGhpcywge1xuICAgIHRhcmdldDogbnVsbCxcbiAgICBza2lwSW5pdGlhbDogdHJ1ZSxcbiAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgIHRoaXMuX3NldE92ZXJsYXlQb3NpdGlvbigpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuXG4gIHByaXZhdGUgX292ZXJsYXkhOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfb3B0aW9uQ29udGFpbmVyITogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX29yaWdpbkVsZW1lbnQhOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfdHJpZ2dlckVsZW1lbnQhOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlciE6IEFib3J0Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSBfZXNjYXBhYmxlT3ZlcmxheUNvbnRyb2xsZXIgPSBuZXcgU2JiRXNjYXBhYmxlT3ZlcmxheUNvbnRyb2xsZXIodGhpcyk7XG4gIHByaXZhdGUgX292ZXJsYXlJZCA9IGBzYmItc2VsZWN0LSR7KytuZXh0SWR9YDtcbiAgcHJpdmF0ZSBfYWN0aXZlSXRlbUluZGV4ID0gLTE7XG4gIHByaXZhdGUgX3NlYXJjaFRpbWVvdXQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBfc2VhcmNoU3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2RpZExvYWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNQb2ludGVyRG93bkV2ZW50T25NZW51OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2xhbmd1YWdlQ29udHJvbGxlciA9IG5ldyBTYmJMYW5ndWFnZUNvbnRyb2xsZXIodGhpcyk7XG4gIHByaXZhdGUgX2lzVmFsdWVNYW51YWxseUFzc2lnbmVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSAnY29tYm9ib3gnIGlucHV0IGVsZW1lbnRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlucHV0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyaWdnZXJFbGVtZW50O1xuICB9XG5cbiAgLyoqIFJldHVybnMgYWxsIFNiYk9wdGlvbkVsZW1lbnRzIGZyb20gdGhpcyBzYmItc2VsZWN0IGluc3RhbmNlLiAqL1xuICBwdWJsaWMgZ2V0IG9wdGlvbnMoKTogU2JiT3B0aW9uRWxlbWVudDxUPltdIHtcbiAgICBjb25zdCBvcHRpb25zOiBTYmJPcHRpb25FbGVtZW50PFQ+W10gPSBbXTtcbiAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw/LjxTYmJPcHRpb25FbGVtZW50PFQ+Pignc2JiLW9wdGlvbicpLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgY3VzdG9tRWxlbWVudHMudXBncmFkZShvcHRpb24pO1xuICAgICAgb3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/Lignb3B0aW9uc2VsZWN0aW9uY2hhbmdlJywgKGU6IEV2ZW50KSA9PiB0aGlzLl9vbk9wdGlvbkNoYW5nZWQoZSkpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdvcHRpb25MYWJlbENoYW5nZWQnLCAoZTogRXZlbnQpID0+IHRoaXMuX29uT3B0aW9uTGFiZWxDaGFuZ2VkKGUpKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXI/LignybVvcHRncm91cHNsb3RjaGFuZ2UnLCAoKSA9PiB0aGlzLl9vblNsb3RDaGFuZ2UoKSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj8uKCdjbGljaycsIChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBTYmJTZWxlY3RFbGVtZW50PFQ+IHwgU2JiT3B0aW9uRWxlbWVudDxUPjtcbiAgICAgIGlmICh0YXJnZXQubG9jYWxOYW1lID09PSAnc2JiLW9wdGlvbicpIHtcbiAgICAgICAgLy8gT3B0aW9uIGNsaWNrXG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiAhdGFyZ2V0LmRpc2FibGVkKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdG9nZ2xlT3BlbmluZygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRDb250cm9sbGVyKFxuICAgICAgbmV3IE11dGF0aW9uQ29udHJvbGxlcih0aGlzLCB7XG4gICAgICAgIGNvbmZpZzogeyBhdHRyaWJ1dGVGaWx0ZXI6IFsnYXJpYS1sYWJlbGxlZGJ5JywgJ2FyaWEtbGFiZWwnLCAnYXJpYS1kZXNjcmliZWRieSddIH0sXG4gICAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLl9zeW5jQXJpYUxhYmVscygpLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNBcmlhTGFiZWxzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fdHJpZ2dlckVsZW1lbnQgfHwgaXNTZXJ2ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRPclJlbW92ZUF0dHJpYnV0ZShcbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LFxuICAgICAgJ2FyaWEtbGFiZWxsZWRieScsXG4gICAgICB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JyksXG4gICAgKTtcbiAgICBzZXRPclJlbW92ZUF0dHJpYnV0ZSh0aGlzLl90cmlnZ2VyRWxlbWVudCwgJ2FyaWEtbGFiZWwnLCB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpKTtcbiAgICBzZXRPclJlbW92ZUF0dHJpYnV0ZShcbiAgICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LFxuICAgICAgJ2FyaWEtZGVzY3JpYmVkYnknLFxuICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKSxcbiAgICApO1xuXG4gICAgLy8gVXNpbmcgdGhlIGFzc29jaWF0ZWQgbGFiZWxzIGlzIG9ubHkgYSBmYWxsYmFjay5cbiAgICAvLyBUaGUgZHJhd2JhY2sgaXMsIHRoYXQgaXQgZG9lc24ndCBnZXQgdXBkYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGxpc3Qgb2YgbGFiZWwgY2hhbmdlcy5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSAmJlxuICAgICAgIXRoaXMuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknKSAmJlxuICAgICAgdGhpcy5pbnRlcm5hbHMubGFiZWxzLmxlbmd0aFxuICAgICkge1xuICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQ/LnNldEF0dHJpYnV0ZShcbiAgICAgICAgJ2FyaWEtbGFiZWwnLFxuICAgICAgICBBcnJheS5mcm9tKHRoaXMuaW50ZXJuYWxzLmxhYmVscylcbiAgICAgICAgICAubWFwKChsYWJlbCkgPT4gbGFiZWwudGV4dENvbnRlbnQpXG4gICAgICAgICAgLmpvaW4oJywgJyksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBPcGVucyB0aGUgc2VsZWN0aW9uIHBhbmVsLiAqL1xuICBwdWJsaWMgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlICE9PSAnY2xvc2VkJyB8fFxuICAgICAgIXRoaXMuX292ZXJsYXkgfHxcbiAgICAgIHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDAgfHxcbiAgICAgIHRoaXMuZGlzYWJsZWQgfHxcbiAgICAgIHRoaXMuZm9ybURpc2FibGVkIHx8XG4gICAgICAhdGhpcy5kaXNwYXRjaEJlZm9yZU9wZW5FdmVudCgpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PignLnNiYi1zZWxlY3RfX2NvbnRhaW5lcicpPy5zaG93UG9wb3Zlcj8uKCk7XG4gICAgdGhpcy5zdGF0ZSA9ICdvcGVuaW5nJztcbiAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1leHBhbmRlZCcsIHRydWUpO1xuICAgIHRoaXMuX3NldE92ZXJsYXlQb3NpdGlvbigpO1xuXG4gICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpcyB6ZXJvLCB0aGUgYW5pbWF0aW9uZW5kIGV2ZW50IGlzIG5vdCBhbHdheXMgZmlyZWQgcmVsaWFibHkuXG4gICAgLy8gSW4gdGhpcyBjYXNlIHdlIGRpcmVjdGx5IHNldCB0aGUgYG9wZW5lZGAgc3RhdGUuXG4gICAgaWYgKHRoaXMuX2lzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuX2hhbmRsZU9wZW5pbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2xvc2VzIHRoZSBzZWxlY3Rpb24gcGFuZWwuICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29wZW5lZCcgfHwgIXRoaXMuZGlzcGF0Y2hCZWZvcmVDbG9zZUV2ZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NpbmcnO1xuICAgIHRoaXMudG9nZ2xlQXR0cmlidXRlKCdkYXRhLWV4cGFuZGVkJywgZmFsc2UpO1xuICAgIHRoaXMuX29wZW5QYW5lbEV2ZW50c0NvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICBpZiAodGhpcy5fb3JpZ2luRWxlbWVudCkge1xuICAgICAgdGhpcy5fb3JpZ2luUmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKHRoaXMuX29yaWdpbkVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaXMgemVybywgdGhlIGFuaW1hdGlvbmVuZCBldmVudCBpcyBub3QgYWx3YXlzIGZpcmVkIHJlbGlhYmx5LlxuICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBkaXJlY3RseSBzZXQgdGhlIGBjbG9zZWRgIHN0YXRlLlxuICAgIGlmICh0aGlzLl9pc1plcm9BbmltYXRpb25EdXJhdGlvbigpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDbG9zaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNaZXJvQW5pbWF0aW9uRHVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzWmVyb0FuaW1hdGlvbkR1cmF0aW9uKHRoaXMsICctLXNiYi1vcHRpb25zLXBhbmVsLWFuaW1hdGlvbi1kdXJhdGlvbicpO1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIGN1cnJlbnQgZGlzcGxheWVkIHZhbHVlLiAqL1xuICBwdWJsaWMgZ2V0RGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlWYWx1ZSA/PyAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdGFibGVPcHRpb25zKCk6IFNiYk9wdGlvbkVsZW1lbnQ8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maWx0ZXIoKG9wdCkgPT4gIW9wdC5kaXNhYmxlZCAmJiAhb3B0Lmhhc0F0dHJpYnV0ZSgnZGF0YS1ncm91cC1kaXNhYmxlZCcpKTtcbiAgfVxuXG4gIC8qKiBMaXN0ZW5zIHRvIG9wdGlvbiBjaGFuZ2VzLiAqL1xuICBwcml2YXRlIF9vbk9wdGlvbkNoYW5nZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIFNiYk9wdGlvbkVsZW1lbnQ8VD47XG4gICAgaWYgKHRhcmdldC5zZWxlY3RlZCkge1xuICAgICAgdGhpcy5fb25PcHRpb25TZWxlY3RlZCh0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vbk9wdGlvbkRlc2VsZWN0ZWQodGFyZ2V0KTtcbiAgICB9XG4gIH1cblxuICAvKiogTGlzdGVucyB0byBvcHRpb24gY2hhbmdlcy4gKi9cbiAgcHJpdmF0ZSBfb25PcHRpb25MYWJlbENoYW5nZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIFNiYk9wdGlvbkVsZW1lbnQ8VD47XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLl9nZXRTZWxlY3RlZCgpO1xuXG4gICAgaWYgKFxuICAgICAgKCFBcnJheS5pc0FycmF5KHNlbGVjdGVkKSAmJiB0YXJnZXQgIT09IHNlbGVjdGVkKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpICYmICFzZWxlY3RlZC5pbmNsdWRlcyh0YXJnZXQpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlRGlzcGxheVZhbHVlKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5fZ2V0U2VsZWN0ZWQoKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RlZCkpIHtcbiAgICAgIHRoaXMuX2Rpc3BsYXlWYWx1ZSA9IHNlbGVjdGVkLm1hcCgobykgPT4gby50ZXh0Q29udGVudD8udHJpbSgpKS5qb2luKCcsICcpIHx8IG51bGw7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZCkge1xuICAgICAgdGhpcy5fZGlzcGxheVZhbHVlID0gc2VsZWN0ZWQ/LnRleHRDb250ZW50Py50cmltKCkgfHwgbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGlzcGxheVZhbHVlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZGlzcGxheXZhbHVlY2hhbmdlJywgeyBidWJibGVzOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSB9KSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGB2YWx1ZWAgcHJvcGVydHkgc2hvdWxkIGJlIGFkYXB0ZWQgd2hlbiB0aGUgYG11bHRpcGxlYCBwcm9wZXJ0eSBjaGFuZ2VzOlxuICAgKiAgIC0gaWYgaXQgY2hhbmdlcyB0byB0cnVlLCB0aGUgJ3ZhbHVlJyBpcyBzZXQgdG8gYW4gYXJyYXk7XG4gICAqICAgLSBpZiBpdCBjaGFuZ2VzIHRvIGZhbHNlLCB0aGUgZmlyc3QgYXZhaWxhYmxlIG9wdGlvbiBpcyBzZXQgYXMgJ3ZhbHVlJyBvdGhlcndpc2UgaXQncyBzZXQgdG8gbnVsbC5cbiAgICovXG4gIHByaXZhdGUgX29uTXVsdGlwbGVDaGFuZ2VkKGlzQ2hhbmdpbmdUb011bHRpcGxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGlzQ2hhbmdpbmdUb011bHRpcGxlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX2lzVmFsdWVNYW51YWxseUFzc2lnbmVkIHx8IHRoaXMudmFsdWUgIT0gbnVsbCA/IFt0aGlzLnZhbHVlIGFzIFRdIDogW107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMudmFsdWUubGVuZ3RoID8gdGhpcy52YWx1ZVswXSA6IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBgZGlzYWJsZWRgIG9yIHRoZSBgcmVhZG9ubHlgIHByb3BlcnRpZXMgYXJlIHNldCwgYW5kIHRoZSBwYW5lbCBpcyBvcGVuLCBjbG9zZSBpdC5cbiAgICovXG4gIHByaXZhdGUgX2Nsb3NlT25EaXNhYmxlZFJlYWRvbmx5Q2hhbmdlZChuZXdWYWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzT3BlbiAmJiBuZXdWYWx1ZSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzPHRoaXM+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIC8vIFdhaXQgZm9yIHNzciBoeWRyYXRpb25cbiAgICBpZiAoIWlzTmV4dGpzKCkpIHtcbiAgICAgIHRoaXMuc3RhcnRVcGRhdGUoKTtcbiAgICAgIHRoaXMuX3NldHVwU2VsZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZm9jdXMoKTogdm9pZCB7XG4gICAgLy8gRm9yd2FyZCBmb2N1cyB0byB0aGUgdHJpZ2dlciBlbGVtZW50LlxuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50Py5mb2N1cygpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYmx1cigpOiB2b2lkIHtcbiAgICAvLyBGb3J3YXJkIGJsdXIgdG8gdGhlIHRyaWdnZXIgZWxlbWVudC5cbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudD8uYmx1cigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgZWxlbWVudCdzIGZpcnN0IGF0dHJpYnV0ZSB3aG9zZSBxdWFsaWZpZWQgbmFtZSBpcyBxdWFsaWZpZWROYW1lLlxuICAgKlxuICAgKiBbTUROIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0VsZW1lbnQvcmVtb3ZlQXR0cmlidXRlKVxuICAgKiBAaW50ZXJuYWwgV2UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGR1ZSB0byBhIGh5ZHJhdGlvbiBpc3N1ZSB3aXRoIE5leHQuanMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVtb3ZlQXR0cmlidXRlKHF1YWxpZmllZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEluIE5leHQuanMgdGhlIGh5ZHJhdGlvbiBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHdlIGNhbiBtYW5pcHVsYXRlIHRoZSBsaWdodCBET00uXG4gICAgLy8gQGxpdC9yZWFjdCBjYWxscyByZW1vdmVBdHRyaWJ1dGUoJ2RlZmVyLWh5ZHJhdGlvbicpIGluIGEgdXNlTGF5b3V0RWZmZWN0LFxuICAgIC8vIHdoaWNoIGlzIGRvbmUgYWZ0ZXIgaHlkcmF0aW9uIGlzIGZpbmlzaGVkLiBEdWUgdG8gdGhpcyB3ZSBpbnRlcmNlcHQgdGhpcyBjYWxsXG4gICAgLy8gaW4gb3ZlcnJpZGluZyByZW1vdmVBdHRyaWJ1dGUgdG8gZmluaXNoIGluaXRpYWxpemF0aW9uIG9mIHRoZSBzYmItc2VsZWN0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9saXQvbGl0L2Jsb2IvbWFpbi9wYWNrYWdlcy9yZWFjdC9zcmMvY3JlYXRlLWNvbXBvbmVudC50cyNMMjkzLUwyOTZcbiAgICAvLyBXZSBhbHNvIG5lZWQgdG8gd2FpdCBmb3IgdXBkYXRlIGNvbXBsZXRlIGluIG9yZGVyIHRvIGJlIHN1cmUgdGhhdCB0aGUgc2hhZG93IERPTSBoYXMgYmVlbiByZW5kZXJlZC5cbiAgICBpZiAoaXNOZXh0anMoKSAmJiBxdWFsaWZpZWROYW1lID09PSAnZGVmZXItaHlkcmF0aW9uJyAmJiAhdGhpcy5fZGlkTG9hZCkge1xuICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHRoaXMuX3NldHVwU2VsZWN0KCkpO1xuICAgIH1cbiAgICBzdXBlci5yZW1vdmVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGlmIChhcmlhUm9sZU9uSG9zdCkge1xuICAgICAgdGhpcy5pZCB8fD0gdGhpcy5fb3ZlcmxheUlkO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1GaWVsZCA9IHRoaXMuY2xvc2VzdD8uKCdzYmItZm9ybS1maWVsZCcpID8/IHRoaXMuY2xvc2VzdD8uKCdbZGF0YS1mb3JtLWZpZWxkXScpO1xuXG4gICAgaWYgKGZvcm1GaWVsZCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IGZvcm1GaWVsZC5oYXNBdHRyaWJ1dGUoJ25lZ2F0aXZlJyk7XG4gICAgfVxuICAgIHRoaXMuX3N5bmNQcm9wZXJ0aWVzKCk7XG4gICAgdGhpcy5fc3luY0FyaWFMYWJlbHMoKTtcblxuICAgIGlmICh0aGlzLl9kaWRMb2FkKSB7XG4gICAgICB0aGlzLl9zZXR1cE9yaWdpbigpO1xuICAgICAgdGhpcy5fc2V0dXBUcmlnZ2VyKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHJlcXVlc3RVcGRhdGUoXG4gICAgbmFtZT86IFByb3BlcnR5S2V5LFxuICAgIG9sZFZhbHVlPzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgKTogdm9pZCB7XG4gICAgc3VwZXIucmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgaWYgKCFuYW1lICYmIHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9zeW5jQXJpYUxhYmVscygpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXM8dGhpcz4pOiB2b2lkIHtcbiAgICBzdXBlci53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ25lZ2F0aXZlJykgfHwgY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdtdWx0aXBsZScpKSB7XG4gICAgICB0aGlzLl9zeW5jUHJvcGVydGllcygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdyZWFkT25seScpKSB7XG4gICAgICB0aGlzLl9jbG9zZU9uRGlzYWJsZWRSZWFkb25seUNoYW5nZWQodGhpcy5yZWFkT25seSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5wcmVwZW5kKHRoaXMuX3RyaWdnZXJFbGVtZW50KTsgLy8gVGFrZSBiYWNrIHRoZSB0cmlnZ2VyIGVsZW1lbnQgcHJldmlvdXNseSBtb3ZlZCB0byB0aGUgbGlnaHQgRE9NXG4gICAgdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlcj8uYWJvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVzZXQgdmFsdWUgaXMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAodGhlIHNldHVwIHZhbHVlKSwgbnVsbCBvdGhlcndpc2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGZvcm1SZXNldENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAodGhpcy5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykgPyB0aGlzLmdldEF0dHJpYnV0ZSgndmFsdWUnKSA6IG51bGwpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrKFxuICAgIHN0YXRlOiBGb3JtUmVzdG9yZVN0YXRlIHwgbnVsbCxcbiAgICBfcmVhc29uOiBGb3JtUmVzdG9yZVJlYXNvbixcbiAgKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdmFsdWUsIG1hbnVhbGx5QXNzaWduZWQgfSA9IEpTT04ucGFyc2Uoc3RhdGUgYXMgc3RyaW5nKSBhcyB7XG4gICAgICAgIHZhbHVlOiBUIHwgVFtdO1xuICAgICAgICBtYW51YWxseUFzc2lnbmVkOiBib29sZWFuO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICAgIGlmICh2YWx1ZXMuc29tZSgodikgPT4gdiAhPT0gbnVsbCAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgUmVzdG9yaW5nIGNvbXBsZXggb2JqZWN0cyBpcyBub3Qgc3VwcG9ydGVkIGZvciBzYmItc2VsZWN0IHdpdGggc3RhdGUgJHtzdGF0ZX1gLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzVmFsdWVNYW51YWxseUFzc2lnbmVkID0gbWFudWFsbHlBc3NpZ25lZDtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLl91cGRhdGVPcHRpb25zRnJvbVZhbHVlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byByZXN0b3JlIHNiYi1zZWxlY3Qgd2l0aCBzdGF0ZSAke3N0YXRlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBmb3JtU3RhdGUoKTogRm9ybVJlc3RvcmVTdGF0ZSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHRoaXMudmFsdWUsIG1hbnVhbGx5QXNzaWduZWQ6IHRoaXMuX2lzVmFsdWVNYW51YWxseUFzc2lnbmVkIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY1Byb3BlcnRpZXMoKTogdm9pZCB7XG4gICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsPy48U2JiRGl2aWRlckVsZW1lbnQgfCBTYmJPcHRpb25IaW50RWxlbWVudD4oXG4gICAgICAnc2JiLWRpdmlkZXIsIHNiYi1vcHRpb24taGludCcsXG4gICAgKS5mb3JFYWNoKChlbCkgPT4gKGVsLm5lZ2F0aXZlID0gdGhpcy5uZWdhdGl2ZSkpO1xuXG4gICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsPy48U2JiT3B0aW9uRWxlbWVudDxUPiB8IFNiYk9wdEdyb3VwRWxlbWVudD4oXG4gICAgICAnc2JiLW9wdGlvbiwgc2JiLW9wdGdyb3VwJyxcbiAgICApLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGVsZW1lbnQudG9nZ2xlQXR0cmlidXRlKCdkYXRhLW5lZ2F0aXZlJywgdGhpcy5uZWdhdGl2ZSk7XG4gICAgICBlbGVtZW50LnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1tdWx0aXBsZScsIHRoaXMubXVsdGlwbGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsPy48U2JiT3B0aW9uRWxlbWVudDxUPiB8IFNiYk9wdEdyb3VwRWxlbWVudD4oXG4gICAgICAnc2JiLW9wdGlvbiwgc2JiLW9wdGdyb3VwJyxcbiAgICApLmZvckVhY2goKGUpID0+IGUucmVxdWVzdFVwZGF0ZT8uKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNob3VsZFZhbGlkYXRlKG5hbWU6IFByb3BlcnR5S2V5IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1cGVyLnNob3VsZFZhbGlkYXRlKG5hbWUpIHx8IG5hbWUgPT09ICd2YWx1ZScgfHwgbmFtZSA9PT0gJ3JlcXVpcmVkJztcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB2YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICBzdXBlci52YWxpZGF0ZSgpO1xuICAgIGlmIChcbiAgICAgIHRoaXMucmVxdWlyZWQgJiZcbiAgICAgICh0aGlzLm9wdGlvbnMuZXZlcnkoKG8pID0+IG8udmFsdWUgIT09IHRoaXMudmFsdWUpIHx8XG4gICAgICAgICghdGhpcy5faXNWYWx1ZU1hbnVhbGx5QXNzaWduZWQgJiYgdGhpcy52YWx1ZSA9PSBudWxsKSlcbiAgICApIHtcbiAgICAgIHRoaXMuc2V0VmFsaWRpdHlGbGFnKCd2YWx1ZU1pc3NpbmcnLCBpMThuU2VsZWN0aW9uUmVxdWlyZWRbdGhpcy5fbGFuZ3VhZ2VDb250cm9sbGVyLmN1cnJlbnRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVWYWxpZGl0eUZsYWcoJ3ZhbHVlTWlzc2luZycpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwU2VsZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuX3NldHVwT3JpZ2luKCk7XG4gICAgdGhpcy5fc2V0dXBUcmlnZ2VyKCk7XG4gICAgdGhpcy5fZGlkTG9hZCA9IHRydWU7XG4gICAgdGhpcy5jb21wbGV0ZVVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqIFNldHMgdGhlIG9yaWdpbkVsZW1lbnQ7IGlmIHRoZSBjb21wb25lbnQgaXMgdXNlZCBpbiBhIHNiYi1mb3JtLWZpZWxkIHVzZXMgaXQsIG90aGVyd2lzZSB1c2VzIHRoZSBwYXJlbnRFbGVtZW50LiAqL1xuICBwcml2YXRlIF9zZXR1cE9yaWdpbigpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtRmllbGQgPSB0aGlzLmNsb3Nlc3Q/Lignc2JiLWZvcm0tZmllbGQnKTtcbiAgICBpZiAodGhpcy5fb3JpZ2luRWxlbWVudCkge1xuICAgICAgdGhpcy5fb3JpZ2luUmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKHRoaXMuX29yaWdpbkVsZW1lbnQpO1xuICAgIH1cbiAgICB0aGlzLl9vcmlnaW5FbGVtZW50ID1cbiAgICAgIGZvcm1GaWVsZD8uc2hhZG93Um9vdD8ucXVlcnlTZWxlY3Rvcj8uKCcjb3ZlcmxheS1hbmNob3InKSA/PyB0aGlzLnBhcmVudEVsZW1lbnQhO1xuICAgIGlmICh0aGlzLl9vcmlnaW5FbGVtZW50KSB7XG4gICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZShcbiAgICAgICAgJ2RhdGEtb3B0aW9uLXBhbmVsLW9yaWdpbi1ib3JkZXJsZXNzJyxcbiAgICAgICAgISFmb3JtRmllbGQ/Lmhhc0F0dHJpYnV0ZT8uKCdib3JkZXJsZXNzJyksXG4gICAgICApO1xuXG4gICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgdGhpcy5fb3JpZ2luUmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9vcmlnaW5FbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG8gYXNzZXNzIHNjcmVlbi1yZWFkZXJzIHByb2JsZW1zIGNhdXNlZCBieSB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBhcmlhIHBhdHRlcm5zIGFuZCBzaGFkb3cgRE9NLFxuICAgKiB3ZSBhcmUgZm9yY2VkIHRvIG1vdmUgdGhlICdjb21ib2JveCcgdHJpZ2dlciBlbGVtZW50IHRvIHRoZSBsaWdodCBET01cbiAgICovXG4gIHByaXZhdGUgX3NldHVwVHJpZ2dlcigpOiB2b2lkIHtcbiAgICAvLyBNb3ZlIHRoZSB0cmlnZ2VyIGJlZm9yZSB0aGUgc2JiLXNlbGVjdFxuICAgIHRoaXMucGFyZW50RWxlbWVudCEuaW5zZXJ0QmVmb3JlPy4odGhpcy5fdHJpZ2dlckVsZW1lbnQsIHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0T3ZlcmxheVBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHNldE92ZXJsYXlQb3NpdGlvbihcbiAgICAgIHRoaXMuX292ZXJsYXksXG4gICAgICB0aGlzLl9vcmlnaW5FbGVtZW50LFxuICAgICAgdGhpcy5fb3B0aW9uQ29udGFpbmVyLFxuICAgICAgdGhpcy5zaGFkb3dSb290IS5xdWVyeVNlbGVjdG9yKCcuc2JiLXNlbGVjdF9fY29udGFpbmVyJykhLFxuICAgICAgdGhpcyxcbiAgICApO1xuICB9XG5cbiAgLy8gSW4gcmFyZSBjYXNlcyBpdCBjYW4gYmUgdGhhdCB0aGUgYW5pbWF0aW9uRW5kIGV2ZW50IGlzIHRyaWdnZXJlZCB0d2ljZS5cbiAgLy8gVG8gYXZvaWQgZW50ZXJpbmcgYSBjb3JydXB0IHN0YXRlLCBleGl0IHdoZW4gc3RhdGUgaXMgbm90IGV4cGVjdGVkLlxuICBwcml2YXRlIF9vbkFuaW1hdGlvbkVuZChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ29wZW4nICYmIHRoaXMuc3RhdGUgPT09ICdvcGVuaW5nJykge1xuICAgICAgdGhpcy5faGFuZGxlT3BlbmluZygpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ2Nsb3NlJyAmJiB0aGlzLnN0YXRlID09PSAnY2xvc2luZycpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNsb3NpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVPcGVuaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUgPSAnb3BlbmVkJztcbiAgICB0aGlzLl9hdHRhY2hPcGVuUGFuZWxFdmVudHMoKTtcbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpO1xuICAgIHRoaXMuX2VzY2FwYWJsZU92ZXJsYXlDb250cm9sbGVyLmNvbm5lY3QoKTtcbiAgICBpZiAodGhpcy5fb3JpZ2luRWxlbWVudCkge1xuICAgICAgdGhpcy5fb3JpZ2luUmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9vcmlnaW5FbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5kaXNwYXRjaE9wZW5FdmVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQ2xvc2luZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgdGhpcy5zaGFkb3dSb290Py5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PignLnNiYi1zZWxlY3RfX2NvbnRhaW5lcicpPy5oaWRlUG9wb3Zlcj8uKCk7XG4gICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgdGhpcy5fcmVzZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgdGhpcy5fb3B0aW9uQ29udGFpbmVyLnNjcm9sbFRvcCA9IDA7XG4gICAgdGhpcy5fZXNjYXBhYmxlT3ZlcmxheUNvbnRyb2xsZXIuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuZGlzcGF0Y2hDbG9zZUV2ZW50KCk7XG4gIH1cblxuICAvKiogV2hlbiBhbiBvcHRpb24gaXMgc2VsZWN0ZWQsIHVwZGF0ZXMgdGhlIGRpc3BsYXlWYWx1ZTsgaXQgYWxzbyBjbG9zZXMgdGhlIHNlbGVjdCBpZiBub3QgYG11bHRpcGxlYC4gKi9cbiAgcHJpdmF0ZSBfb25PcHRpb25TZWxlY3RlZChvcHRpb246IFNiYk9wdGlvbkVsZW1lbnQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gb3B0aW9uLnZhbHVlO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gW29wdGlvbi52YWx1ZSFdO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiAhdGhpcy52YWx1ZS5pbmNsdWRlcyhvcHRpb24udmFsdWUhKSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgb3B0aW9uLnZhbHVlIV07XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlT3B0aW9uc0Zyb21WYWx1ZSgpO1xuICAgIHRoaXMuX2Rpc3BhdGNoSW5wdXRFdmVudHMoKTtcbiAgfVxuXG4gIC8qKiBXaGVuIGFuIG9wdGlvbiBpcyB1bnNlbGVjdGVkIGluIGBtdWx0aXBsZWAsIHJlbW92ZXMgaXQgZnJvbSB2YWx1ZSBhbmQgdXBkYXRlcyBkaXNwbGF5VmFsdWUuICovXG4gIHByaXZhdGUgX29uT3B0aW9uRGVzZWxlY3RlZChvcHRpb25TZWxlY3Rpb25DaGFuZ2U6IFNiYk9wdGlvbkVsZW1lbnQ8VD4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMudmFsdWUuZmlsdGVyKChlbCkgPT4gZWwgIT09IG9wdGlvblNlbGVjdGlvbkNoYW5nZS52YWx1ZSk7XG4gICAgICB0aGlzLl91cGRhdGVPcHRpb25zRnJvbVZhbHVlKCk7XG4gICAgICB0aGlzLl9kaXNwYXRjaElucHV0RXZlbnRzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGlzcGF0Y2hJbnB1dEV2ZW50cygpOiB2b2lkIHtcbiAgICAvKiogVGhlIGlucHV0IGV2ZW50IGZpcmVzIHdoZW4gdGhlIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgYXMgYSBkaXJlY3QgcmVzdWx0IG9mIGEgdXNlciBhY3Rpb24uICovXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IElucHV0RXZlbnQoJ2lucHV0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2hhbmdlIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIHVzZXIgbW9kaWZpZXMgdGhlIGVsZW1lbnQncyB2YWx1ZS5cbiAgICAgKiBVbmxpa2UgdGhlIGlucHV0IGV2ZW50LCB0aGUgY2hhbmdlIGV2ZW50IGlzIG5vdCBuZWNlc3NhcmlseSBmaXJlZFxuICAgICAqIGZvciBlYWNoIGFsdGVyYXRpb24gdG8gYW4gZWxlbWVudCdzIHZhbHVlLlxuICAgICAqL1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gIH1cblxuICBwcml2YXRlIF9hdHRhY2hPcGVuUGFuZWxFdmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBvdmVybGF5IHBvc2l0aW9uIG9uIHNjcm9sbCBhbmQgd2luZG93IHJlc2l6ZVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHRoaXMuX3NldE92ZXJsYXlQb3NpdGlvbigpLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIC8vIFdpdGhvdXQgY2FwdHVyZSwgb3RoZXIgc2Nyb2xsIGNvbnRleHRzIHdvdWxkIG5vdCBidWJibGUgdG8gdGhpcyBldmVudCBsaXN0ZW5lci5cbiAgICAgIC8vIENhcHR1cmUgYWxsb3dzIHVzIHRvIHJlYWN0IHRvIGFsbCBzY3JvbGwgY29udGV4dHMgaW4gdGhpcyBET00uXG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLl9zZXRPdmVybGF5UG9zaXRpb24oKSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG5cbiAgICAvLyBDbG9zZSBtZW51IG9uIGJhY2tkcm9wIGNsaWNrXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgKGV2KSA9PiB0aGlzLl9wb2ludGVyRG93bkxpc3RlbmVyKGV2KSwge1xuICAgICAgc2lnbmFsOiB0aGlzLl9vcGVuUGFuZWxFdmVudHNDb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgKGV2KSA9PiB0aGlzLl9jbG9zZU9uQmFja2Ryb3BDbGljayhldiksIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fb3BlblBhbmVsRXZlbnRzQ29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlID09PSAnb3BlbmVkJykge1xuICAgICAgdGhpcy5fb3BlbmVkUGFuZWxLZXlib2FyZEludGVyYWN0aW9uKGV2ZW50KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdjbG9zZWQnKSB7XG4gICAgICB0aGlzLl9jbG9zZWRQYW5lbEtleWJvYXJkSW50ZXJhY3Rpb24oZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Nsb3NlZFBhbmVsS2V5Ym9hcmRJbnRlcmFjdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jaGVja0ZvckxldHRlclNlbGVjdGlvbihldmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uQnlUZXh0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgY2FzZSAnICc6XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9vcGVuZWRQYW5lbEtleWJvYXJkSW50ZXJhY3Rpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSB8fCB0aGlzLnN0YXRlICE9PSAnb3BlbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9jaGVja0ZvckxldHRlclNlbGVjdGlvbihldmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uQnlUZXh0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgY2FzZSAnICc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3NlbGVjdEJ5S2V5Ym9hcmQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgIGNhc2UgJ1BhZ2VVcCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3NldE5leHRBY3RpdmVPcHRpb24oZXZlbnQsIDApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCwgdGhpcy5fc2VsZWN0YWJsZU9wdGlvbnMoKS5sZW5ndGggLSAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tGb3JMZXR0ZXJTZWxlY3Rpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyB8fFxuICAgICAgZXZlbnQua2V5ID09PSAnQ2xlYXInIHx8XG4gICAgICAoZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBldmVudC5rZXkgIT09ICcgJyAmJlxuICAgICAgICAhZXZlbnQuYWx0S2V5ICYmXG4gICAgICAgICFldmVudC5jdHJsS2V5ICYmXG4gICAgICAgICFldmVudC5tZXRhS2V5KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9zZXROZXh0QWN0aXZlT3B0aW9uQnlUZXh0KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgLy8gU2V0IHRpbWVvdXQgYW5kIHRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICAgIGlmICh0eXBlb2YgdGhpcy5fc2VhcmNoVGltZW91dCA9PT0gdHlwZW9mIHNldFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zZWFyY2hUaW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5fc2VhcmNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuX3NlYXJjaFN0cmluZyA9ICcnKSwgMTAwMCk7XG4gICAgdGhpcy5fc2VhcmNoU3RyaW5nICs9IGV2ZW50LmtleTtcblxuICAgIC8vIFJlb3JkZXIgdGhlIF9maWx0ZXJlZE9wdGlvbiBhcnJheSB0byBoYXZlIHRoZSBsYXN0IHNlbGVjdGVkIGVsZW1lbnQgYXQgdGhlIGJvdHRvbS5cbiAgICBjb25zdCBpbmRleEZvclNsaWNlOiBudW1iZXIgPSB0aGlzLl9hY3RpdmVJdGVtSW5kZXggKyAxO1xuICAgIGNvbnN0IHNlbGVjdGFibGVPcHRpb25zID0gdGhpcy5fc2VsZWN0YWJsZU9wdGlvbnMoKTtcbiAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnNTb3J0ZWQgPSBbXG4gICAgICAuLi5zZWxlY3RhYmxlT3B0aW9ucy5zbGljZShpbmRleEZvclNsaWNlKSxcbiAgICAgIC4uLnNlbGVjdGFibGVPcHRpb25zLnNsaWNlKDAsIGluZGV4Rm9yU2xpY2UpLFxuICAgIF07XG5cbiAgICBjb25zdCBtYXRjaCA9IGZpbHRlcmVkT3B0aW9uc1NvcnRlZC5maW5kKFxuICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLnRleHRDb250ZW50Py50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGhpcy5fc2VhcmNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpID09PSAwLFxuICAgICk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAvLyBJZiBhbiBleGFjdCBtYXRjaCBoYXMgYmVlbiBmb3VuZCwgZ28gdG8gdGhhdCBvcHRpb24uXG4gICAgICB0aGlzLl9zZXROZXh0QWN0aXZlT3B0aW9uKGV2ZW50LCBzZWxlY3RhYmxlT3B0aW9ucy5pbmRleE9mKG1hdGNoKSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuX3NlYXJjaFN0cmluZy5sZW5ndGggPiAxICYmXG4gICAgICBuZXcgUmVnRXhwKGBeJHt0aGlzLl9zZWFyY2hTdHJpbmcuY2hhckF0KDApfSokYCkudGVzdCh0aGlzLl9zZWFyY2hTdHJpbmcpXG4gICAgKSB7XG4gICAgICAvLyBJZiBubyBleGFjdCBtYXRjaCBoYXMgYmVlbiBmb3VuZCBidXQgdGhlIHN0cmluZyB0byBzZWFyY2ggaXMgbWFkZSBieSB0aGUgc2FtZSByZXBlYXRlZCBsZXR0ZXIsXG4gICAgICAvLyBnbyB0byB0aGUgZmlyc3QgZWxlbWVudCwgaWYgZXhpc3RzLCB0aGF0IG1hdGNoZXMgdGhlIGxldHRlci5cbiAgICAgIGNvbnN0IGZpcnN0TWF0Y2ggPSBmaWx0ZXJlZE9wdGlvbnNTb3J0ZWQuZmluZChcbiAgICAgICAgKG9wdGlvbikgPT5cbiAgICAgICAgICBvcHRpb24udGV4dENvbnRlbnQ/LnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0aGlzLl9zZWFyY2hTdHJpbmdbMF0udG9Mb3dlckNhc2UoKSkgPT09IDAsXG4gICAgICApO1xuICAgICAgaWYgKGZpcnN0TWF0Y2gpIHtcbiAgICAgICAgdGhpcy5fc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudCwgc2VsZWN0YWJsZU9wdGlvbnMuaW5kZXhPZihmaXJzdE1hdGNoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIG1hdGNoIGZvdW5kLCBjbGVhciB0aGUgdGltZW91dCBhbmQgdGhlIHNlYXJjaCB0ZXJtLlxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NlYXJjaFRpbWVvdXQpO1xuICAgICAgdGhpcy5fc2VhcmNoU3RyaW5nID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0QnlLZXlib2FyZCgpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVPcHRpb24gPSB0aGlzLl9zZWxlY3RhYmxlT3B0aW9ucygpW3RoaXMuX2FjdGl2ZUl0ZW1JbmRleF07XG5cbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgYWN0aXZlT3B0aW9uPy5bJ3NlbGVjdFZpYVVzZXJJbnRlcmFjdGlvbiddKCFhY3RpdmVPcHRpb24uc2VsZWN0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0TmV4dEFjdGl2ZU9wdGlvbihldmVudDogS2V5Ym9hcmRFdmVudCwgaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSB0aGlzLl9zZWxlY3RhYmxlT3B0aW9ucygpO1xuXG4gICAgLy8gUHJldmVudCBrZXlib2FyZCBuYXZpZ2F0aW9uIGlmIGFsbCBvcHRpb25zIGFyZSBkaXNhYmxlZFxuICAgIGlmIChmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEluZGV4ID1cbiAgICAgIGluZGV4ID8/IGdldE5leHRFbGVtZW50SW5kZXgoZXZlbnQsIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCwgZmlsdGVyZWRPcHRpb25zLmxlbmd0aCk7XG4gICAgY29uc3QgbmV4dE9wdGlvbiA9IGZpbHRlcmVkT3B0aW9uc1tuZXh0SW5kZXhdO1xuICAgIGNvbnN0IGFjdGl2ZU9wdGlvbiA9IGZpbHRlcmVkT3B0aW9uc1t0aGlzLl9hY3RpdmVJdGVtSW5kZXhdO1xuXG4gICAgdGhpcy5fc2V0QWN0aXZlRWxlbWVudChuZXh0T3B0aW9uLCBhY3RpdmVPcHRpb24pO1xuXG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLl9zZXRTZWxlY3RlZEVsZW1lbnQobmV4dE9wdGlvbiwgYWN0aXZlT3B0aW9uKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50Py5zaGlmdEtleSkge1xuICAgICAgbmV4dE9wdGlvblsnc2VsZWN0VmlhVXNlckludGVyYWN0aW9uJ10oIW5leHRPcHRpb24uc2VsZWN0ZWQpO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSBuZXh0SW5kZXg7XG4gIH1cblxuICBwcml2YXRlIF9zZXRBY3RpdmVFbGVtZW50KFxuICAgIG5leHRBY3RpdmVPcHRpb246IFNiYk9wdGlvbkVsZW1lbnQ8VD4sXG4gICAgbGFzdEFjdGl2ZU9wdGlvbjogU2JiT3B0aW9uRWxlbWVudDxUPiB8IG51bGwgPSBudWxsLFxuICAgIHNldEFjdGl2ZURlc2NlbmRhbnQgPSB0cnVlLFxuICApOiB2b2lkIHtcbiAgICBuZXh0QWN0aXZlT3B0aW9uLnNldEFjdGl2ZSh0cnVlKTtcbiAgICBuZXh0QWN0aXZlT3B0aW9uLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcblxuICAgIGlmIChzZXRBY3RpdmVEZXNjZW5kYW50KSB7XG4gICAgICB0aGlzLl90cmlnZ2VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcsIG5leHRBY3RpdmVPcHRpb24uaWQpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHRoZSBwcmV2aW91c1xuICAgIGlmIChsYXN0QWN0aXZlT3B0aW9uICYmIGxhc3RBY3RpdmVPcHRpb24gIT09IG5leHRBY3RpdmVPcHRpb24pIHtcbiAgICAgIGxhc3RBY3RpdmVPcHRpb24uc2V0QWN0aXZlKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRTZWxlY3RlZEVsZW1lbnQoXG4gICAgbmV4dEFjdGl2ZU9wdGlvbjogU2JiT3B0aW9uRWxlbWVudDxUPixcbiAgICBsYXN0QWN0aXZlT3B0aW9uOiBTYmJPcHRpb25FbGVtZW50PFQ+LFxuICApOiB2b2lkIHtcbiAgICBuZXh0QWN0aXZlT3B0aW9uWydzZWxlY3RWaWFVc2VySW50ZXJhY3Rpb24nXSh0cnVlKTtcblxuICAgIGlmIChsYXN0QWN0aXZlT3B0aW9uICYmIGxhc3RBY3RpdmVPcHRpb24gIT09IG5leHRBY3RpdmVPcHRpb24pIHtcbiAgICAgIGxhc3RBY3RpdmVPcHRpb25bJ3NlbGVjdFZpYVVzZXJJbnRlcmFjdGlvbiddKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZXNldEFjdGl2ZUVsZW1lbnQoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuX3NlbGVjdGFibGVPcHRpb25zKClbdGhpcy5fYWN0aXZlSXRlbUluZGV4XTtcblxuICAgIGlmIChhY3RpdmVFbGVtZW50KSB7XG4gICAgICBhY3RpdmVFbGVtZW50LnNldEFjdGl2ZShmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IC0xO1xuICAgIHRoaXMuX3RyaWdnZXJFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1hY3RpdmVkZXNjZW5kYW50Jyk7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgcG9pbnRlcmRvd24gZXZlbnQgdGFyZ2V0IGlzIHRyaWdnZXJlZCBvbiB0aGUgbWVudS5cbiAgcHJpdmF0ZSBfcG9pbnRlckRvd25MaXN0ZW5lciA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgdGhpcy5faXNQb2ludGVyRG93bkV2ZW50T25NZW51ID0gaXNFdmVudE9uRWxlbWVudCh0aGlzLl9vdmVybGF5LCBldmVudCk7XG4gIH07XG5cbiAgLy8gQ2xvc2UgbWVudSBvbiBiYWNrZHJvcCBjbGljay5cbiAgcHJpdmF0ZSBfY2xvc2VPbkJhY2tkcm9wQ2xpY2sgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGhpcy5faXNQb2ludGVyRG93bkV2ZW50T25NZW51ICYmICFpc0V2ZW50T25FbGVtZW50KHRoaXMuX292ZXJsYXksIGV2ZW50KSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIF91cGRhdGVPcHRpb25zRnJvbVZhbHVlKCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWUgOiBbdGhpcy52YWx1ZV07XG5cbiAgICBjb25zdCBkaXNwbGF5VmFsdWVzID0gW107XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5vcHRpb25zKSB7XG4gICAgICBvcHRpb24uc2VsZWN0ZWQgPSB2YWx1ZS5pbmNsdWRlcyhvcHRpb24udmFsdWUpO1xuICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCkge1xuICAgICAgICBkaXNwbGF5VmFsdWVzLnB1c2gob3B0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVEaXNwbGF5VmFsdWUoKTtcblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgICAgdGhpcy5fYWN0aXZlSXRlbUluZGV4ID0gdGhpcy5fc2VsZWN0YWJsZU9wdGlvbnMoKS5maW5kSW5kZXgoXG4gICAgICAgIChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PT0gdGhpcy52YWx1ZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlVmFsdWVGcm9tT3B0aW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuX2dldFNlbGVjdGVkKCk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RlZCkpIHtcbiAgICAgIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlOiBUW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygc2VsZWN0ZWQpIHtcbiAgICAgICAgICB2YWx1ZS5wdXNoKG9wdGlvbi52YWx1ZSEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZCkge1xuICAgICAgdGhpcy5fYWN0aXZlSXRlbUluZGV4ID0gdGhpcy5fc2VsZWN0YWJsZU9wdGlvbnMoKS5maW5kSW5kZXgoKG9wdGlvbikgPT4gb3B0aW9uID09PSBzZWxlY3RlZCk7XG4gICAgICB0aGlzLl92YWx1ZSA9IHNlbGVjdGVkLnZhbHVlO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25TbG90Q2hhbmdlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc1ZhbHVlTWFudWFsbHlBc3NpZ25lZCkge1xuICAgICAgdGhpcy5fdXBkYXRlT3B0aW9uc0Zyb21WYWx1ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91cGRhdGVWYWx1ZUZyb21PcHRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2VsZWN0ZWQoKTogU2JiT3B0aW9uRWxlbWVudDxUPiB8IFNiYk9wdGlvbkVsZW1lbnQ8VD5bXSB8IG51bGwge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uc2VsZWN0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnNlbGVjdGVkKSA/PyBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3RvZ2dsZU9wZW5pbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5mb3JtRGlzYWJsZWQgfHwgdGhpcy5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl90cmlnZ2VyRWxlbWVudD8uZm9jdXMoKTtcblxuICAgIHN3aXRjaCAodGhpcy5zdGF0ZSkge1xuICAgICAgY2FzZSAnb3BlbmVkJzoge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY2xvc2VkJzoge1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zcHJlYWREZWZlcnJlZERpc3BsYXlWYWx1ZShcbiAgICBwbGFjZWhvbGRlcjogVGVtcGxhdGVSZXN1bHQsXG4gICk6IChUZW1wbGF0ZVJlc3VsdCB8IFByb21pc2U8VGVtcGxhdGVSZXN1bHQ+KVtdIHtcbiAgICByZXR1cm4gW3RoaXMuX2RlZmVycmVkRGlzcGxheVZhbHVlKHBsYWNlaG9sZGVyKSwgcGxhY2Vob2xkZXJdO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZGVmZXJyZWREaXNwbGF5VmFsdWUocGxhY2Vob2xkZXI6IFRlbXBsYXRlUmVzdWx0KTogUHJvbWlzZTxUZW1wbGF0ZVJlc3VsdD4ge1xuICAgIGlmICh0aGlzLmh5ZHJhdGlvblJlcXVpcmVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmh5ZHJhdGlvbkNvbXBsZXRlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheVZhbHVlID8gaHRtbGAke3RoaXMuX2Rpc3BsYXlWYWx1ZX1gIDogcGxhY2Vob2xkZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVuZGVyKCk6IFRlbXBsYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDwhLS0gVGhpcyBlbGVtZW50IGlzIHZpc3VhbGx5IGhpZGRlbiBhbmQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgbGlnaHQgRE9NIHRvIGFsbG93IHNjcmVlblxuICAgICAgcmVhZGVycyB0byB3b3JrIHByb3Blcmx5IC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInNiYi1zY3JlZW4tcmVhZGVyLW9ubHkgc2JiLXNlbGVjdC10cmlnZ2VyXCJcbiAgICAgICAgdGFiaW5kZXg9JHt0aGlzLmRpc2FibGVkIHx8IHRoaXMuZm9ybURpc2FibGVkID8gbm90aGluZyA6ICcwJ31cbiAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICBhcmlhLXJlcXVpcmVkPSR7dGhpcy5yZXF1aXJlZC50b1N0cmluZygpfVxuICAgICAgICBhcmlhLWNvbnRyb2xzPSR7dGhpcy5fb3ZlcmxheUlkfVxuICAgICAgICBhcmlhLW93bnM9JHt0aGlzLl9vdmVybGF5SWR9XG4gICAgICAgIEBrZXlkb3duPSR7dGhpcy5fb25LZXlEb3dufVxuICAgICAgICBAY2xpY2s9JHt0aGlzLl90b2dnbGVPcGVuaW5nfVxuICAgICAgICAke3JlZigocmVmKSA9PiAodGhpcy5fdHJpZ2dlckVsZW1lbnQgPSByZWYgYXMgSFRNTEVsZW1lbnQpKX1cbiAgICAgID5cbiAgICAgICAgJHt1bnRpbCguLi50aGlzLl9zcHJlYWREZWZlcnJlZERpc3BsYXlWYWx1ZShodG1sYDxzcGFuPiR7dGhpcy5wbGFjZWhvbGRlcn08L3NwYW4+YCkpfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVmlzdWFsbHkgZGlzcGxheSB0aGUgdmFsdWUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JiLXNlbGVjdF9fdHJpZ2dlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAke3VudGlsKFxuICAgICAgICAgIC4uLnRoaXMuX3NwcmVhZERlZmVycmVkRGlzcGxheVZhbHVlKFxuICAgICAgICAgICAgaHRtbGA8c3BhbiBjbGFzcz1cInNiYi1zZWxlY3RfX3RyaWdnZXItLXBsYWNlaG9sZGVyXCI+JHt0aGlzLnBsYWNlaG9sZGVyfTwvc3Bhbj5gLFxuICAgICAgICAgICksXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInNiYi1zZWxlY3RfX2dhcC1maXhcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X19jb250YWluZXJcIiBwb3BvdmVyPVwibWFudWFsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmItc2VsZWN0X19nYXAtZml4XCI+JHtvdmVybGF5R2FwRml4Q29ybmVycygpfTwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgQGFuaW1hdGlvbmVuZD0ke3RoaXMuX29uQW5pbWF0aW9uRW5kfVxuICAgICAgICAgIGNsYXNzPVwic2JiLXNlbGVjdF9fcGFuZWxcIlxuICAgICAgICAgICR7cmVmKChkaWFsb2dSZWYpID0+ICh0aGlzLl9vdmVybGF5ID0gZGlhbG9nUmVmIGFzIEhUTUxFbGVtZW50KSl9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JiLXNlbGVjdF9fd3JhcHBlclwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBpZD0keyFhcmlhUm9sZU9uSG9zdCA/IHRoaXMuX292ZXJsYXlJZCA6IG5vdGhpbmd9XG4gICAgICAgICAgICAgIGNsYXNzPVwic2JiLXNlbGVjdF9fb3B0aW9uc1wiXG4gICAgICAgICAgICAgIHJvbGU9JHshYXJpYVJvbGVPbkhvc3QgPyAnbGlzdGJveCcgOiBub3RoaW5nfVxuICAgICAgICAgICAgICA/YXJpYS1tdWx0aXNlbGVjdGFibGU9JHt0aGlzLm11bHRpcGxlfVxuICAgICAgICAgICAgICAke3JlZigoY29udGFpbmVyUmVmKSA9PiAodGhpcy5fb3B0aW9uQ29udGFpbmVyID0gY29udGFpbmVyUmVmIGFzIEhUTUxFbGVtZW50KSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5fb25TbG90Q2hhbmdlfT48L3Nsb3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICdzYmItc2VsZWN0JzogU2JiU2VsZWN0RWxlbWVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInN0YXRlIiwicmVmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBD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