@ethlete/cdk 4.19.6 → 4.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/esm2022/lib/components/accordion/components/accordion/accordion.component.mjs +3 -3
  3. package/esm2022/lib/components/accordion/components/accordion-group/accordion-group.component.mjs +3 -3
  4. package/esm2022/lib/components/accordion/partials/accordion-hint/accordion-hint.directive.mjs +3 -3
  5. package/esm2022/lib/components/accordion/partials/accordion-hint-wrapper/accordion-hint-wrapper.directive.mjs +3 -3
  6. package/esm2022/lib/components/accordion/partials/accordion-label/accordion-label.directive.mjs +3 -3
  7. package/esm2022/lib/components/accordion/partials/accordion-label-wrapper/accordion-label-wrapper.directive.mjs +3 -3
  8. package/esm2022/lib/components/bracket/components/bracket/bracket.component.mjs +3 -3
  9. package/esm2022/lib/components/bracket/directives/bracket-match/bracket-match.directive.mjs +3 -3
  10. package/esm2022/lib/components/bracket/directives/bracket-round/bracket-round.directive.mjs +3 -3
  11. package/esm2022/lib/components/bracket/partials/bracket-match/bracket-match.component.mjs +3 -3
  12. package/esm2022/lib/components/bracket/partials/bracket-round-header/bracket-round-header.component.mjs +3 -3
  13. package/esm2022/lib/components/button/components/button/button.component.mjs +3 -3
  14. package/esm2022/lib/components/button/components/query-button/query-button.component.mjs +3 -3
  15. package/esm2022/lib/components/button/directives/button/button.directive.mjs +3 -3
  16. package/esm2022/lib/components/button/directives/query-button/query-button.directive.mjs +3 -3
  17. package/esm2022/lib/components/carousel/carousel.component.mjs +3 -3
  18. package/esm2022/lib/components/carousel/carousel.directive.mjs +3 -3
  19. package/esm2022/lib/components/carousel/controls/carousel-item-nav.component.mjs +3 -3
  20. package/esm2022/lib/components/carousel/controls/carousel-item-nav.directive.mjs +3 -3
  21. package/esm2022/lib/components/carousel/controls/carousel-next-button.directive.mjs +3 -3
  22. package/esm2022/lib/components/carousel/controls/carousel-previous-button.directive.mjs +3 -3
  23. package/esm2022/lib/components/carousel/controls/carousel-toggle-auto-play-button.directive.mjs +3 -3
  24. package/esm2022/lib/components/carousel/et-carousel-item.component.mjs +3 -3
  25. package/esm2022/lib/components/carousel/et-carousel-item.directive.mjs +3 -3
  26. package/esm2022/lib/components/filter/rich-filter/components/rich-filter-host/rich-filter-host.component.mjs +3 -3
  27. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-button/rich-filter-button.directive.mjs +3 -3
  28. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-button-slot/rich-filter-button-slot.directive.mjs +3 -3
  29. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-content/rich-filter-content.directive.mjs +3 -3
  30. package/esm2022/lib/components/filter/rich-filter/directives/rich-filter-top/rich-filter-top.directive.mjs +3 -3
  31. package/esm2022/lib/components/forms/components/checkbox/components/checkbox/checkbox.component.mjs +3 -3
  32. package/esm2022/lib/components/forms/components/checkbox/components/checkbox-field/checkbox-field.component.mjs +3 -3
  33. package/esm2022/lib/components/forms/components/checkbox/components/checkbox-group/checkbox-group.component.mjs +3 -3
  34. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox/checkbox.directive.mjs +3 -3
  35. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-field/checkbox-field.directive.mjs +3 -3
  36. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group/checkbox-group.directive.mjs +3 -3
  37. package/esm2022/lib/components/forms/components/checkbox/directives/checkbox-group-control/checkbox-group-control.directive.mjs +3 -3
  38. package/esm2022/lib/components/forms/components/error/components/error/error.component.mjs +3 -3
  39. package/esm2022/lib/components/forms/components/input/components/date-input/date-input.component.mjs +3 -3
  40. package/esm2022/lib/components/forms/components/input/components/date-time-input/date-time-input.component.mjs +3 -3
  41. package/esm2022/lib/components/forms/components/input/components/email-input/email-input.component.mjs +3 -3
  42. package/esm2022/lib/components/forms/components/input/components/input-field/input-field.component.mjs +3 -3
  43. package/esm2022/lib/components/forms/components/input/components/number-input/number-input.component.mjs +3 -3
  44. package/esm2022/lib/components/forms/components/input/components/password-input/password-input.component.mjs +3 -3
  45. package/esm2022/lib/components/forms/components/input/components/search-input/search-input.component.mjs +3 -3
  46. package/esm2022/lib/components/forms/components/input/components/text-input/text-input.component.mjs +3 -3
  47. package/esm2022/lib/components/forms/components/input/components/textarea-input/textarea-input.component.mjs +3 -3
  48. package/esm2022/lib/components/forms/components/input/directives/autosize-textarea/autosize-textarea.directive.mjs +3 -3
  49. package/esm2022/lib/components/forms/components/input/directives/date-input/date-input.directive.mjs +3 -3
  50. package/esm2022/lib/components/forms/components/input/directives/date-time-input/date-time-input.directive.mjs +3 -3
  51. package/esm2022/lib/components/forms/components/input/directives/email-input/email-input.directive.mjs +3 -3
  52. package/esm2022/lib/components/forms/components/input/directives/if-supports-show-picker/if-supports-show-picker.directive.mjs +3 -3
  53. package/esm2022/lib/components/forms/components/input/directives/number-input/number-input.directive.mjs +3 -3
  54. package/esm2022/lib/components/forms/components/input/directives/password-input/password-input.directive.mjs +3 -3
  55. package/esm2022/lib/components/forms/components/input/directives/search-input/search-input.directive.mjs +3 -3
  56. package/esm2022/lib/components/forms/components/input/directives/show-picker-trigger/show-picker-trigger.directive.mjs +3 -3
  57. package/esm2022/lib/components/forms/components/input/directives/text-input/text-input.directive.mjs +3 -3
  58. package/esm2022/lib/components/forms/components/input/directives/textarea-input/textarea-input.directive.mjs +3 -3
  59. package/esm2022/lib/components/forms/components/input/partials/password-input-toggle/password-input-toggle.component.mjs +3 -3
  60. package/esm2022/lib/components/forms/components/input/partials/search-input-clear/search-input-clear.component.mjs +3 -3
  61. package/esm2022/lib/components/forms/components/label/components/label/label.component.mjs +3 -3
  62. package/esm2022/lib/components/forms/components/label/directives/label-suffix/label-suffix.directive.mjs +3 -3
  63. package/esm2022/lib/components/forms/components/radio/components/radio/radio.component.mjs +3 -3
  64. package/esm2022/lib/components/forms/components/radio/components/radio-field/radio-field.component.mjs +3 -3
  65. package/esm2022/lib/components/forms/components/radio/components/radio-group/radio-group.component.mjs +3 -3
  66. package/esm2022/lib/components/forms/components/radio/directives/radio/radio.directive.mjs +3 -3
  67. package/esm2022/lib/components/forms/components/radio/directives/radio-field/radio-field.directive.mjs +3 -3
  68. package/esm2022/lib/components/forms/components/radio/directives/radio-group/radio-group.directive.mjs +3 -3
  69. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button/segmented-button.component.mjs +3 -3
  70. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-field/segmented-button-field.component.mjs +3 -3
  71. package/esm2022/lib/components/forms/components/segmented-button/components/segmented-button-group/segmented-button-group.component.mjs +3 -3
  72. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button/segmented-button.directive.mjs +3 -3
  73. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-field/segmented-button-field.directive.mjs +3 -3
  74. package/esm2022/lib/components/forms/components/segmented-button/directives/segmented-button-group/segmented-button-group.directive.mjs +3 -3
  75. package/esm2022/lib/components/forms/components/select/components/combobox/components/combobox/combobox.component.mjs +3 -3
  76. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox/combobox.directive.mjs +3 -3
  77. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-empty-template/combobox-body-empty-template.directive.mjs +3 -3
  78. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-error-template/combobox-body-error-template.directive.mjs +3 -3
  79. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-loading-template/combobox-body-loading-template.directive.mjs +3 -3
  80. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-body-more-items-hint-template/combobox-body-more-items-hint-template.directive.mjs +3 -3
  81. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-option-template/combobox-option-template.directive.mjs +3 -3
  82. package/esm2022/lib/components/forms/components/select/components/combobox/directives/combobox-selected-option-template/combobox-selected-option-template.directive.mjs +3 -3
  83. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-body/combobox-body.component.mjs +3 -3
  84. package/esm2022/lib/components/forms/components/select/components/combobox/partials/combobox-option/combobox-option.component.mjs +3 -3
  85. package/esm2022/lib/components/forms/components/select/components/native-select/components/native-select/native-select.component.mjs +3 -3
  86. package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-input/native-select-input.directive.mjs +3 -3
  87. package/esm2022/lib/components/forms/components/select/components/native-select/directives/native-select-option/native-select-option.directive.mjs +3 -3
  88. package/esm2022/lib/components/forms/components/select/components/native-select/partials/native-select-option/native-select-option.component.mjs +3 -3
  89. package/esm2022/lib/components/forms/components/select/components/select/components/select/select.component.mjs +3 -3
  90. package/esm2022/lib/components/forms/components/select/components/select/directives/select/select.directive.mjs +3 -3
  91. package/esm2022/lib/components/forms/components/select/components/select/directives/select-body/select-body.directive.mjs +3 -3
  92. package/esm2022/lib/components/forms/components/select/components/select/directives/select-option/select-option.directive.mjs +3 -3
  93. package/esm2022/lib/components/forms/components/select/components/select/partials/select-body/select-body.component.mjs +3 -3
  94. package/esm2022/lib/components/forms/components/select/components/select/partials/select-option/select-option.component.mjs +3 -3
  95. package/esm2022/lib/components/forms/components/select/components/select-field/select-field.component.mjs +3 -3
  96. package/esm2022/lib/components/forms/components/select/directives/select-field/select-field.directive.mjs +3 -3
  97. package/esm2022/lib/components/forms/components/selection-list/components/selection-list-field/selection-list-field.component.mjs +3 -3
  98. package/esm2022/lib/components/forms/components/selection-list/components/selection-list-option/selection-list-option.component.mjs +3 -3
  99. package/esm2022/lib/components/forms/components/selection-list/directives/selection-list-field/selection-list-field.directive.mjs +3 -3
  100. package/esm2022/lib/components/forms/components/selection-list/directives/selection-list-option/selection-list-option.directive.mjs +3 -3
  101. package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle/slide-toggle.component.mjs +3 -3
  102. package/esm2022/lib/components/forms/components/slide-toggle/components/slide-toggle-field/slide-toggle-field.component.mjs +3 -3
  103. package/esm2022/lib/components/forms/components/slide-toggle/directives/slide-toggle/slide-toggle.directive.mjs +3 -3
  104. package/esm2022/lib/components/forms/components/slider/components/slider/slider.component.mjs +3 -3
  105. package/esm2022/lib/components/forms/components/slider/components/slider-field/slider-field.component.mjs +3 -3
  106. package/esm2022/lib/components/forms/directives/dynamic-form-field/dynamic-form-field.directive.mjs +3 -3
  107. package/esm2022/lib/components/forms/directives/dynamic-form-group/dynamic-form-group.directive.mjs +3 -3
  108. package/esm2022/lib/components/forms/directives/expose-input-vars/expose-input-vars.directive.mjs +3 -3
  109. package/esm2022/lib/components/forms/directives/if-input-empty/if-input-empty.directive.mjs +3 -3
  110. package/esm2022/lib/components/forms/directives/if-input-filled/if-input-filled.directive.mjs +3 -3
  111. package/esm2022/lib/components/forms/directives/input/input.directive.mjs +3 -3
  112. package/esm2022/lib/components/forms/directives/input-prefix/input-prefix.directive.mjs +3 -3
  113. package/esm2022/lib/components/forms/directives/input-suffix/input-suffix.directive.mjs +3 -3
  114. package/esm2022/lib/components/forms/directives/native-input-ref/native-input-ref.directive.mjs +3 -3
  115. package/esm2022/lib/components/forms/directives/static-form-field/static-form-field.directive.mjs +3 -3
  116. package/esm2022/lib/components/forms/directives/static-form-group/static-form-group.directive.mjs +3 -3
  117. package/esm2022/lib/components/forms/directives/writeable-input/writeable-input.directive.mjs +3 -3
  118. package/esm2022/lib/components/forms/services/default-validator-errors.service.mjs +3 -3
  119. package/esm2022/lib/components/forms/services/form-field-state.service.mjs +3 -3
  120. package/esm2022/lib/components/forms/services/form-group-state.service.mjs +3 -3
  121. package/esm2022/lib/components/forms/services/input-state.service.mjs +3 -3
  122. package/esm2022/lib/components/forms/utils/decorated-form-field.base.mjs +3 -3
  123. package/esm2022/lib/components/forms/utils/decorated-input.base.mjs +3 -3
  124. package/esm2022/lib/components/forms/utils/input.base.mjs +3 -3
  125. package/esm2022/lib/components/icons/chevron-icon/chevron-icon.component.mjs +3 -3
  126. package/esm2022/lib/components/masonry/components/masonry/masonry.component.mjs +3 -3
  127. package/esm2022/lib/components/masonry/partials/masonry-item/masonry-item.component.mjs +3 -3
  128. package/esm2022/lib/components/overlay/components/bottom-sheet/components/bottom-sheet-container/bottom-sheet-container.component.mjs +3 -3
  129. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-container-base/bottom-sheet-container-base.component.mjs +3 -3
  130. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-drag-handle/bottom-sheet-drag-handle.component.mjs +3 -3
  131. package/esm2022/lib/components/overlay/components/bottom-sheet/partials/bottom-sheet-title/bottom-sheet-title.directive.mjs +3 -3
  132. package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet-base.service.mjs +3 -3
  133. package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet-swipe-handler.service.mjs +3 -3
  134. package/esm2022/lib/components/overlay/components/bottom-sheet/services/bottom-sheet.service.mjs +3 -3
  135. package/esm2022/lib/components/overlay/components/dialog/components/dialog-container/dialog-container.component.mjs +3 -3
  136. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-close/dialog-close.directive.mjs +3 -3
  137. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-container-base/dialog-container-base.component.mjs +3 -3
  138. package/esm2022/lib/components/overlay/components/dialog/partials/dialog-title/dialog-title.directive.mjs +3 -3
  139. package/esm2022/lib/components/overlay/components/dialog/services/dialog-base.service.mjs +3 -3
  140. package/esm2022/lib/components/overlay/components/dialog/services/dialog.service.mjs +3 -3
  141. package/esm2022/lib/components/overlay/components/menu/components/menu/menu.component.mjs +4 -4
  142. package/esm2022/lib/components/overlay/components/menu/components/menu-checkbox-item/menu-checkbox-item.component.mjs +3 -3
  143. package/esm2022/lib/components/overlay/components/menu/components/menu-container/menu-container.component.mjs +3 -3
  144. package/esm2022/lib/components/overlay/components/menu/components/menu-radio-item/menu-radio-item.component.mjs +3 -3
  145. package/esm2022/lib/components/overlay/components/menu/directives/menu-checkbox-group/menu-checkbox-group.directive.mjs +3 -3
  146. package/esm2022/lib/components/overlay/components/menu/directives/menu-group/menu-group.directive.mjs +3 -3
  147. package/esm2022/lib/components/overlay/components/menu/directives/menu-group-title/menu-group-title.directive.mjs +3 -3
  148. package/esm2022/lib/components/overlay/components/menu/directives/menu-item/menu-item.directive.mjs +3 -3
  149. package/esm2022/lib/components/overlay/components/menu/directives/menu-radio-group/menu-radio-group.directive.mjs +3 -3
  150. package/esm2022/lib/components/overlay/components/menu/directives/menu-trigger/menu-trigger.directive.mjs +3 -3
  151. package/esm2022/lib/components/overlay/components/menu-deprecated/context-menu-trigger.mjs +6 -6
  152. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-aim.mjs +6 -6
  153. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-bar.mjs +3 -3
  154. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-base.mjs +3 -3
  155. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-group.mjs +3 -3
  156. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-item-checkbox.mjs +3 -3
  157. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-item-radio.mjs +3 -3
  158. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-item-selectable.mjs +3 -3
  159. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-item.mjs +3 -3
  160. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-module.mjs +4 -4
  161. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-stack.mjs +3 -3
  162. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-trigger-base.mjs +3 -3
  163. package/esm2022/lib/components/overlay/components/menu-deprecated/menu-trigger.mjs +3 -3
  164. package/esm2022/lib/components/overlay/components/menu-deprecated/menu.mjs +3 -3
  165. package/esm2022/lib/components/overlay/components/overlay/components/overlay-container/overlay-container.component.mjs +3 -3
  166. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-back-or-close/overlay-back-or-close.directive.mjs +3 -3
  167. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-body/overlay-body.component.mjs +3 -3
  168. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-close/overlay-close.directive.mjs +3 -3
  169. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-footer/overlay-footer.directive.mjs +3 -3
  170. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-header/overlay-header.directive.mjs +3 -3
  171. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-header-template/overlay-header-template.directive.mjs +3 -3
  172. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-main/overlay-main.directive.mjs +3 -3
  173. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-route-header-template-outlet/overlay-route-header-template-outlet.component.mjs +3 -3
  174. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-router-link/overlay-router-link.directive.mjs +3 -3
  175. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-router-outlet/overlay-router-outlet.component.mjs +3 -3
  176. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-router-outlet-disabled-template/overlay-router-outlet-disabled-template.directive.mjs +3 -3
  177. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-shared-route-template/overlay-shared-route-template.directive.mjs +3 -3
  178. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-shared-route-template-outlet/overlay-shared-route-template-outlet.component.mjs +3 -3
  179. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-sidebar/overlay-sidebar.component.mjs +3 -3
  180. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-sidebar-page/overlay-sidebar-page.component.mjs +3 -3
  181. package/esm2022/lib/components/overlay/components/overlay/partials/overlay-title/overlay-title.directive.mjs +3 -3
  182. package/esm2022/lib/components/overlay/components/overlay/services/overlay.service.mjs +3 -3
  183. package/esm2022/lib/components/overlay/components/overlay/utils/filter-overlay.mjs +3 -3
  184. package/esm2022/lib/components/overlay/components/toggletip/components/toggletip/toggletip.component.mjs +3 -3
  185. package/esm2022/lib/components/overlay/components/toggletip/directives/toggletip/toggletip.directive.mjs +3 -3
  186. package/esm2022/lib/components/overlay/components/toggletip/partials/toggletip-close/toggletip-close.directive.mjs +3 -3
  187. package/esm2022/lib/components/overlay/components/tooltip/components/tooltip/tooltip.component.mjs +3 -3
  188. package/esm2022/lib/components/overlay/components/tooltip/directives/tooltip/tooltip.directive.mjs +3 -3
  189. package/esm2022/lib/components/overlay/directives/dynamic-overlay-title/dynamic-overlay-title.directive.mjs +3 -3
  190. package/esm2022/lib/components/overlay/directives/overlay-close-auto-blocker/overlay-close-auto-blocker.directive.mjs +3 -3
  191. package/esm2022/lib/components/overlay/services/dynamic-overlay.service.mjs +3 -3
  192. package/esm2022/lib/components/pagination/components/pagination/pagination.component.mjs +3 -3
  193. package/esm2022/lib/components/pagination/partials/pagination-link/pagination-link.directive.mjs +3 -3
  194. package/esm2022/lib/components/pagination/services/pagination-head.service.mjs +3 -3
  195. package/esm2022/lib/components/picture/picture.component.mjs +3 -3
  196. package/esm2022/lib/components/progress-spinner/progress-spinner.component.mjs +3 -3
  197. package/esm2022/lib/components/query-error/components/query-error/query-error.component.mjs +3 -3
  198. package/esm2022/lib/components/query-error/directives/query-error/query-error.directive.mjs +3 -3
  199. package/esm2022/lib/components/scrollable/components/scrollable/scrollable.component.mjs +197 -265
  200. package/esm2022/lib/components/scrollable/directives/scrollable-ignore-child/scrollable-ignore-child.directive.mjs +3 -3
  201. package/esm2022/lib/components/scrollable/directives/scrollable-is-active-child/scrollable-is-active-child.directive.mjs +3 -3
  202. package/esm2022/lib/components/skeleton/components/skeleton/skeleton.component.mjs +3 -3
  203. package/esm2022/lib/components/skeleton/partials/skeleton-item/skeleton-item.component.mjs +3 -3
  204. package/esm2022/lib/components/sort/components/sort-header/sort-header.component.mjs +3 -3
  205. package/esm2022/lib/components/sort/partials/sort/sort.directive.mjs +3 -3
  206. package/esm2022/lib/components/sort/services/sort-header-intl.mjs +3 -3
  207. package/esm2022/lib/components/table/components/table/table.component.mjs +3 -3
  208. package/esm2022/lib/components/table/partials/cells/cell/cell.directive.mjs +3 -3
  209. package/esm2022/lib/components/table/partials/cells/cell-def/cell-def.directive.mjs +3 -3
  210. package/esm2022/lib/components/table/partials/cells/column-def/column-def.directive.mjs +3 -3
  211. package/esm2022/lib/components/table/partials/cells/footer-cell/footer-cell.directive.mjs +3 -3
  212. package/esm2022/lib/components/table/partials/cells/footer-cell-def/footer-cell-def.directive.mjs +3 -3
  213. package/esm2022/lib/components/table/partials/cells/header-cell/header-cell.directive.mjs +3 -3
  214. package/esm2022/lib/components/table/partials/cells/header-cell-def/header-cell-def.directive.mjs +3 -3
  215. package/esm2022/lib/components/table/partials/cells/text-column/text-column.component.mjs +3 -3
  216. package/esm2022/lib/components/table/partials/rows/footer-row/footer-row.component.mjs +3 -3
  217. package/esm2022/lib/components/table/partials/rows/footer-row-def/footer-row-def.directive.mjs +3 -3
  218. package/esm2022/lib/components/table/partials/rows/header-row/header-row.component.mjs +3 -3
  219. package/esm2022/lib/components/table/partials/rows/header-row-def/header-row-def.directive.mjs +3 -3
  220. package/esm2022/lib/components/table/partials/rows/no-data-row/no-data-row.directive.mjs +3 -3
  221. package/esm2022/lib/components/table/partials/rows/recycle-rows/recycle-rows.directive.mjs +3 -3
  222. package/esm2022/lib/components/table/partials/rows/row/row.component.mjs +3 -3
  223. package/esm2022/lib/components/table/partials/rows/row-def/row-def.directive.mjs +3 -3
  224. package/esm2022/lib/components/table/partials/table-busy/table-busy.directive.mjs +3 -3
  225. package/esm2022/lib/components/table/partials/table-busy-outlet/table-busy-outlet.directive.mjs +3 -3
  226. package/esm2022/lib/components/tabs/components/inline-tabs/inline-tabs.component.mjs +3 -3
  227. package/esm2022/lib/components/tabs/components/nav-tabs/nav-tabs.component.mjs +3 -3
  228. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab/inline-tab.component.mjs +3 -3
  229. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body/inline-tab-body.component.mjs +3 -3
  230. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-body-host/inline-tab-body-host.directive.mjs +3 -3
  231. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-content/inline-tab-content.directive.mjs +3 -3
  232. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-header/inline-tab-header.component.mjs +3 -3
  233. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label/inline-tab-label.directive.mjs +3 -3
  234. package/esm2022/lib/components/tabs/partials/inline-tabs/inline-tab-label-wrapper/inline-tab-label-wrapper.directive.mjs +3 -3
  235. package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tab-link/nav-tab-link.directive.mjs +3 -3
  236. package/esm2022/lib/components/tabs/partials/nav-tabs/nav-tabs-outlet/nav-tabs-outlet.component.mjs +3 -3
  237. package/esm2022/lib/components/tabs/utils/active-tab-underline.util.mjs +3 -3
  238. package/esm2022/lib/components/tabs/utils/paginated-tab-header.directive.mjs +3 -3
  239. package/esm2022/lib/services/swipe-handler.service.mjs +3 -3
  240. package/fesm2022/ethlete-cdk.mjs +913 -981
  241. package/fesm2022/ethlete-cdk.mjs.map +1 -1
  242. package/lib/components/button/directives/button/button.directive.d.ts +3 -3
  243. package/lib/components/carousel/carousel.directive.d.ts +3 -3
  244. package/lib/components/carousel/controls/carousel-toggle-auto-play-button.directive.d.ts +3 -3
  245. package/lib/components/carousel/et-carousel-item.directive.d.ts +3 -3
  246. package/lib/components/forms/components/checkbox/directives/checkbox/checkbox.directive.d.ts +3 -3
  247. package/lib/components/forms/components/checkbox/directives/checkbox-field/checkbox-field.directive.d.ts +3 -3
  248. package/lib/components/forms/components/error/components/error/error.component.d.ts +3 -3
  249. package/lib/components/forms/components/radio/directives/radio/radio.directive.d.ts +3 -3
  250. package/lib/components/forms/components/radio/directives/radio-field/radio-field.directive.d.ts +3 -3
  251. package/lib/components/forms/components/segmented-button/directives/segmented-button/segmented-button.directive.d.ts +3 -3
  252. package/lib/components/forms/components/segmented-button/directives/segmented-button-field/segmented-button-field.directive.d.ts +3 -3
  253. package/lib/components/forms/components/select/components/combobox/directives/combobox/combobox.directive.d.ts +6 -6
  254. package/lib/components/forms/components/select/components/combobox/partials/combobox-body/combobox-body.component.d.ts +3 -3
  255. package/lib/components/forms/components/select/components/combobox/partials/combobox-option/combobox-option.component.d.ts +3 -3
  256. package/lib/components/forms/components/select/components/select/directives/select/select.directive.d.ts +6 -6
  257. package/lib/components/forms/components/select/components/select/directives/select-option/select-option.directive.d.ts +3 -3
  258. package/lib/components/forms/components/slide-toggle/directives/slide-toggle/slide-toggle.directive.d.ts +3 -3
  259. package/lib/components/forms/components/slider/components/slider/slider.component.d.ts +3 -3
  260. package/lib/components/forms/directives/writeable-input/writeable-input.directive.d.ts +3 -3
  261. package/lib/components/forms/utils/decorated-form-field.base.d.ts +3 -3
  262. package/lib/components/forms/utils/decorated-input.base.d.ts +3 -3
  263. package/lib/components/masonry/components/masonry/masonry.component.d.ts +3 -3
  264. package/lib/components/overlay/components/menu/directives/menu-item/menu-item.directive.d.ts +3 -3
  265. package/lib/components/overlay/components/menu/directives/menu-trigger/menu-trigger.directive.d.ts +3 -3
  266. package/lib/components/overlay/components/overlay/partials/overlay-body/overlay-body.component.d.ts +3 -3
  267. package/lib/components/overlay/components/overlay/partials/overlay-main/overlay-main.directive.d.ts +3 -3
  268. package/lib/components/overlay/components/overlay/partials/overlay-route-header-template-outlet/overlay-route-header-template-outlet.component.d.ts +3 -3
  269. package/lib/components/overlay/components/overlay/partials/overlay-router-link/overlay-router-link.directive.d.ts +3 -3
  270. package/lib/components/overlay/components/overlay/partials/overlay-router-outlet/overlay-router-outlet.component.d.ts +3 -3
  271. package/lib/components/overlay/components/overlay/partials/overlay-sidebar/overlay-sidebar.component.d.ts +3 -3
  272. package/lib/components/scrollable/components/scrollable/scrollable.component.d.ts +85 -81
  273. package/package.json +8 -8
@@ -1,16 +1,16 @@
1
- import { NgClass } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, ContentChildren, ElementRef, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, booleanAttribute, computed, effect, inject, isDevMode, numberAttribute, signal, } from '@angular/core';
1
+ import { NgClass, NgTemplateOutlet } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, ElementRef, ViewEncapsulation, booleanAttribute, computed, contentChildren, effect, inject, input, isDevMode, numberAttribute, output, signal, viewChild, } from '@angular/core';
3
3
  import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
4
- import { CursorDragScrollDirective, LetDirective, ObserveScrollStateDirective, TypedQueryList, getFirstAndLastPartialIntersection, isElementVisible, nextFrame, scrollToElement, signalElementChildren, signalElementIntersection, signalElementScrollState, signalHostAttributes, signalHostClasses, signalHostElementDimensions, signalHostStyles, } from '@ethlete/core';
5
- import { BehaviorSubject, Subject, combineLatest, debounceTime, filter, fromEvent, map, take, takeUntil, tap, } from 'rxjs';
4
+ import { CursorDragScrollDirective, LetDirective, ObserveScrollStateDirective, createCanAnimateSignal, createIsRenderedSignal, getIntersectionInfo, scrollToElement, signalClasses, signalElementChildren, signalElementDimensions, signalElementIntersection, signalElementScrollState, signalHostAttributes, signalHostClasses, signalHostStyles, } from '@ethlete/core';
5
+ import { BehaviorSubject, Subject, combineLatest, debounceTime, filter, fromEvent, map, of, switchMap, takeUntil, tap, } from 'rxjs';
6
6
  import { ChevronIconComponent } from '../../../icons/chevron-icon';
7
7
  import { ScrollableIgnoreChildDirective, isScrollableChildIgnored } from '../../directives/scrollable-ignore-child';
8
8
  import { SCROLLABLE_IS_ACTIVE_CHILD_TOKEN, ScrollableIsActiveChildDirective, } from '../../directives/scrollable-is-active-child';
9
9
  import * as i0 from "@angular/core";
10
10
  // Thresholds for the intersection observer.
11
11
  const ELEMENT_INTERSECTION_THRESHOLD = [
12
- // We use 51 steps to get a 2% step size.
13
- ...Array.from({ length: 51 }, (_, i) => i / 50),
12
+ // 5% steps
13
+ ...Array.from({ length: 21 }, (_, i) => i * 0.05),
14
14
  // Additional steps needed since display scaling can cause the intersection ratio to be slightly off.
15
15
  0.01,
16
16
  0.005,
@@ -20,102 +20,78 @@ const ELEMENT_INTERSECTION_THRESHOLD = [
20
20
  0.999,
21
21
  ];
22
22
  export class ScrollableComponent {
23
- set _itemSize(v) {
24
- this.itemSize.set(v);
25
- }
26
- set _direction(v) {
27
- this.direction.set(v);
28
- }
29
- set _scrollableRole(v) {
30
- this.scrollableRole.set(v);
31
- }
32
- set _scrollableClass(v) {
33
- this.scrollableClass.set(v);
34
- }
35
- set _renderNavigation(v) {
36
- this.renderNavigation.set(v);
37
- }
38
- set _renderMasks(v) {
39
- this.renderMasks.set(v);
40
- }
41
- set _renderButtons(v) {
42
- this.renderButtons.set(v);
43
- }
44
- set _renderScrollbars(v) {
45
- this.renderScrollbars.set(v);
46
- }
47
- set _stickyButtons(v) {
48
- this.stickyButtons.set(v);
49
- }
50
- set _cursorDragScroll(v) {
51
- this.cursorDragScroll.set(v);
52
- }
53
- set _disableActiveElementScrolling(v) {
54
- this.disableActiveElementScrolling.set(v);
55
- }
56
- set _scrollMode(v) {
57
- this.scrollMode.set(v);
58
- }
59
- set _snap(v) {
60
- this.snap.set(v);
61
- }
62
- set _scrollMargin(v) {
63
- this.scrollMargin.set(v);
64
- }
65
- set _scrollable(e) {
66
- this.scrollable.set(e);
67
- }
68
- set _scrollableContainer(e) {
69
- this.scrollableContainer.set(e);
70
- }
71
- set _firstElement(e) {
72
- this.firstElement.set(e);
73
- }
74
- set _lastElement(e) {
75
- this.lastElement.set(e);
76
- }
77
- set _activeElementList(e) {
78
- this.activeElementList.set(e);
79
- }
80
23
  constructor() {
81
- this._elementRef = inject(ElementRef);
82
24
  this._isCursorDragging$ = new BehaviorSubject(false);
83
- this.itemSize = signal('auto');
84
- this.direction = signal('horizontal');
85
- this.scrollableRole = signal(null);
86
- this.scrollableClass = signal(null);
87
- this.renderNavigation = signal(false);
88
- this.renderMasks = signal(true);
89
- this.renderButtons = signal(true);
90
- this.renderScrollbars = signal(false);
91
- this.stickyButtons = signal(false);
92
- this.cursorDragScroll = signal(true);
93
- this.disableActiveElementScrolling = signal(false);
94
- this.scrollMode = signal('container');
95
- this.snap = signal(false);
96
- this.scrollMargin = signal(0);
97
- this.scrollStateChange = new EventEmitter();
98
- this.intersectionChange = new EventEmitter();
99
- this.scrollable = signal(null);
100
- this.scrollableContainer = signal(null);
101
- this.firstElement = signal(null);
102
- this.lastElement = signal(null);
103
- this.activeElementList = signal(null);
104
- this.containerScrollState = signalElementScrollState(this.scrollable);
105
- this.firstElementIntersection = signalElementIntersection(this.firstElement, { root: this.scrollable });
106
- this.firstElementVisibility = signal(null);
107
- this.lastElementIntersection = signalElementIntersection(this.lastElement, { root: this.scrollable });
108
- this.lastElementVisibility = signal(null);
109
- this.allScrollableChildren = signalElementChildren(this.scrollableContainer);
110
- this.scrollableDimensions = signalHostElementDimensions();
111
- this.scrollableChildren = computed(() => this.allScrollableChildren().filter((c) => !isScrollableChildIgnored(c)));
112
25
  this._disableSnapping$ = new Subject();
26
+ this._manualActiveNavigationIndex = signal(null);
27
+ this.elementRef = inject(ElementRef);
28
+ this.itemSize = input('auto');
29
+ this.direction = input('horizontal');
30
+ this.scrollableRole = input(null);
31
+ this.scrollableClass = input(null);
32
+ this.renderNavigation = input(false, { transform: booleanAttribute });
33
+ this.renderMasks = input(true, { transform: booleanAttribute });
34
+ this.renderButtons = input(true, { transform: booleanAttribute });
35
+ this.buttonPosition = input('inside');
36
+ this.renderScrollbars = input(false, { transform: booleanAttribute });
37
+ this.stickyButtons = input(false, { transform: booleanAttribute });
38
+ this.cursorDragScroll = input(true, { transform: booleanAttribute });
39
+ this.disableActiveElementScrolling = input(false, { transform: booleanAttribute });
40
+ this.scrollMode = input('container');
41
+ this.snap = input(false, { transform: booleanAttribute });
42
+ this.scrollMargin = input(0, { transform: numberAttribute });
43
+ this.scrollOrigin = input('auto');
44
+ this.scrollStateChange = output();
45
+ this.intersectionChange = output();
46
+ this.scrollable = viewChild('scrollable');
47
+ this.firstElement = viewChild('firstElement');
48
+ this.lastElement = viewChild('lastElement');
49
+ this.activeElementList = contentChildren(SCROLLABLE_IS_ACTIVE_CHILD_TOKEN, { descendants: true });
50
+ this.navigationDotsContainer = viewChild('navigationDotsContainer');
51
+ this.firstNavigationDot = viewChild('navigationDot');
52
+ this.navigationDotDimensions = signalElementDimensions(this.firstNavigationDot);
53
+ this.isRendered = createIsRenderedSignal();
54
+ this.canAnimate = createCanAnimateSignal();
55
+ this.renderButtonsInside = computed(() => this.buttonPosition() === 'inside' && this.renderButtons());
56
+ this.renderButtonsInFooter = computed(() => this.buttonPosition() === 'footer' && this.renderButtons());
57
+ this.containerScrollState = signalElementScrollState(this.scrollable, {
58
+ initialScrollPosition: computed(() => {
59
+ const scrollable = this.scrollable()?.nativeElement;
60
+ const activeElementList = this.activeElementList();
61
+ if (!scrollable || !activeElementList.length || !this.isRendered.state())
62
+ return null;
63
+ const firstActive = activeElementList.find((a) => a.isActiveChildEnabled());
64
+ if (firstActive && !this.disableActiveElementScrolling()) {
65
+ const offsetTop = firstActive.elementRef.nativeElement.offsetTop - scrollable.offsetTop;
66
+ const offsetLeft = firstActive.elementRef.nativeElement.offsetLeft - scrollable.offsetLeft;
67
+ return {
68
+ x: offsetLeft - this.scrollMargin(),
69
+ y: offsetTop - this.scrollMargin(),
70
+ };
71
+ }
72
+ return null;
73
+ }),
74
+ });
75
+ this.firstElementIntersection = signalElementIntersection(this.firstElement, {
76
+ root: this.scrollable,
77
+ enabled: this.isRendered.state,
78
+ });
79
+ this.lastElementIntersection = signalElementIntersection(this.lastElement, {
80
+ root: this.scrollable,
81
+ enabled: this.isRendered.state,
82
+ });
83
+ this.allScrollableChildren = signalElementChildren(this.scrollable);
84
+ this.scrollableChildren = computed(() => this.allScrollableChildren().filter((c) => !isScrollableChildIgnored(c)));
113
85
  this.scrollableContentIntersections = signalElementIntersection(this.scrollableChildren, {
114
86
  root: this.scrollable,
115
87
  threshold: ELEMENT_INTERSECTION_THRESHOLD,
88
+ enabled: this.isRendered.state,
116
89
  });
117
90
  this.scrollableContentIntersections$ = toObservable(this.scrollableContentIntersections);
118
- this.manualActiveNavigationIndex = signal(null);
91
+ this.nonScrollableIntersections = computed(() => {
92
+ const allIntersections = this.scrollableContentIntersections();
93
+ return allIntersections.filter((i) => i.intersectionRatio !== 1).map((i) => i.target);
94
+ }, { equal: (a, b) => a.length === b.length && a.every((v, i) => v === b[i]) });
119
95
  this.canScroll = computed(() => {
120
96
  const dir = this.direction();
121
97
  if (dir === 'horizontal') {
@@ -128,9 +104,8 @@ export class ScrollableComponent {
128
104
  return true;
129
105
  }
130
106
  const intersection = this.firstElementIntersection()[0];
131
- if (!intersection) {
132
- return this.firstElementVisibility()?.inline ?? true;
133
- }
107
+ if (!intersection)
108
+ return false;
134
109
  return intersection.isIntersecting;
135
110
  });
136
111
  this.isAtEnd = computed(() => {
@@ -138,31 +113,13 @@ export class ScrollableComponent {
138
113
  return true;
139
114
  }
140
115
  const intersection = this.lastElementIntersection()[0];
141
- if (!intersection) {
142
- return this.lastElementVisibility()?.inline ?? true;
143
- }
116
+ if (!intersection)
117
+ return false;
144
118
  return intersection.isIntersecting;
145
119
  });
146
- this._actualItemSize = computed(() => {
147
- if (this.itemSize() !== 'full')
148
- return null;
149
- const dimensions = this.scrollableDimensions();
150
- if (this.direction() === 'horizontal') {
151
- return dimensions.rect?.width ?? null;
152
- }
153
- else {
154
- return dimensions.rect?.height ?? null;
155
- }
156
- });
157
- this.enableOverlayAnimations = signal(false);
158
- this._initialScrollableNavigation = signal([]);
159
120
  this.scrollableNavigation = computed(() => {
160
121
  const allIntersections = this.scrollableContentIntersections();
161
- const manualActiveNavigationIndex = this.manualActiveNavigationIndex();
162
- const initialScrollableNavigation = this._initialScrollableNavigation();
163
- if (!allIntersections.length) {
164
- return initialScrollableNavigation;
165
- }
122
+ const manualActiveNavigationIndex = this._manualActiveNavigationIndex();
166
123
  const highestIntersection = allIntersections.reduce((prev, curr) => {
167
124
  if (prev && prev.intersectionRatio > curr.intersectionRatio) {
168
125
  return prev;
@@ -172,72 +129,50 @@ export class ScrollableComponent {
172
129
  if (!highestIntersection) {
173
130
  return [];
174
131
  }
132
+ const activeIndex = manualActiveNavigationIndex !== null
133
+ ? manualActiveNavigationIndex
134
+ : allIntersections.findIndex((i) => i === highestIntersection);
175
135
  return allIntersections.map((i, index) => ({
176
136
  isActive: manualActiveNavigationIndex !== null
177
137
  ? manualActiveNavigationIndex === index
178
138
  : i === highestIntersection && highestIntersection.intersectionRatio > 0,
139
+ activeOffset: index === activeIndex ? 0 : Math.abs(index - activeIndex),
179
140
  element: i.target,
180
141
  }));
181
142
  });
143
+ this.activeIndex = computed(() => {
144
+ const scrollableNavigation = this.scrollableNavigation();
145
+ const activeIndex = scrollableNavigation.findIndex((element) => element.isActive);
146
+ return activeIndex;
147
+ });
148
+ this.nonFullIntersectingElementClassBindings = signalClasses(this.nonScrollableIntersections, {
149
+ 'et-scrollable-item--not-intersecting': signal(true),
150
+ });
182
151
  this.hostAttributeBindings = signalHostAttributes({
183
152
  'item-size': this.itemSize,
184
- 'actual-item-size': this._actualItemSize,
185
153
  direction: this.direction,
186
154
  'render-scrollbars': this.renderScrollbars,
187
- 'sticky-buttons': this.stickyButtons,
155
+ 'sticky-buttons': computed(() => this.stickyButtons() && this.renderButtonsInside()),
188
156
  });
189
157
  this.hostClassBindings = signalHostClasses({
190
- 'et-scrollable--can-scroll': computed(() => this.canScroll() && !this.isAtStart() && !this.isAtEnd()),
158
+ 'et-scrollable--can-scroll': computed(() => this.canScroll() && (!this.isAtStart() || !this.isAtEnd())),
191
159
  'et-scrollable--is-at-start': this.isAtStart,
192
160
  'et-scrollable--is-at-end': this.isAtEnd,
193
- 'et-scrollable--enable-overlay-animations': this.enableOverlayAnimations,
161
+ 'et-scrollable--can-animate': this.canAnimate.state,
194
162
  });
195
163
  this.hostStyleBindings = signalHostStyles({
196
- '--actual-item-size': computed(() => (this._actualItemSize() !== null ? `${this._actualItemSize()}px` : undefined)),
164
+ '--item-count': computed(() => this.scrollableChildren().length),
197
165
  });
198
166
  effect(() => {
199
- const scrollable = this.scrollable()?.nativeElement;
200
- const firstElement = this.firstElement()?.nativeElement;
201
- const lastElement = this.lastElement()?.nativeElement;
202
- const activeElementList = this.activeElementList()?.toArray();
203
- if (!scrollable || !firstElement || !lastElement || !activeElementList) {
204
- return;
205
- }
206
- const firstActive = activeElementList.find((a) => a.isActiveChildEnabled());
207
- if (firstActive && !this.disableActiveElementScrolling()) {
208
- const offsetTop = firstActive.elementRef.nativeElement.offsetTop - scrollable.offsetTop;
209
- const offsetLeft = firstActive.elementRef.nativeElement.offsetLeft - scrollable.offsetLeft;
210
- scrollable.scrollLeft = offsetLeft - this.scrollMargin();
211
- scrollable.scrollTop = offsetTop - this.scrollMargin();
212
- }
213
- this.firstElementVisibility.set(isElementVisible({
214
- container: scrollable,
215
- element: firstElement,
216
- }));
217
- this.lastElementVisibility.set(isElementVisible({
218
- container: scrollable,
219
- element: lastElement,
220
- }));
221
- // We need to wait one frame before enabling animations to prevent a animation from playing during initial render.
222
- nextFrame(() => this.enableOverlayAnimations.set(true));
223
- }, { allowSignalWrites: true });
224
- effect(() => {
225
- const elementList = this.scrollableChildren();
226
- const scrollable = this.scrollable()?.nativeElement;
227
- const renderNavigation = this.renderNavigation();
228
- if (!elementList || !scrollable || !renderNavigation) {
229
- return;
230
- }
231
- const firstVisibleElement = elementList.find((e) => isElementVisible({ container: scrollable, element: e }));
232
- if (!firstVisibleElement) {
167
+ // Responsible for centering the active dot in navigation bar by using 'translate'
168
+ const scrollableDotsContainer = this.navigationDotsContainer();
169
+ const activeIndex = this.activeIndex();
170
+ const childCount = this.scrollableContentIntersections().length;
171
+ const offset = this.getNavigationDotsContainerTranslate(childCount, activeIndex);
172
+ if (!scrollableDotsContainer)
233
173
  return;
234
- }
235
- const initialNavigationItems = elementList.map((e) => ({
236
- isActive: e === firstVisibleElement,
237
- element: e,
238
- }));
239
- this._initialScrollableNavigation.set(initialNavigationItems);
240
- }, { allowSignalWrites: true });
174
+ scrollableDotsContainer.nativeElement.style.transform = `translateX(${offset})`;
175
+ });
241
176
  effect(() => {
242
177
  const isAtStart = this.isAtStart();
243
178
  const isAtEnd = this.isAtEnd();
@@ -267,19 +202,45 @@ export class ScrollableComponent {
267
202
  })));
268
203
  }))
269
204
  .subscribe();
205
+ toObservable(this._manualActiveNavigationIndex)
206
+ .pipe(filter((i) => i !== null), takeUntilDestroyed(), switchMap(() => {
207
+ const scrollable = this.scrollable()?.nativeElement;
208
+ if (!scrollable) {
209
+ return of(null);
210
+ }
211
+ return fromEvent(scrollable, 'scroll');
212
+ }), debounceTime(50), tap(() => this._manualActiveNavigationIndex.set(null)))
213
+ .subscribe();
214
+ this.isRendered.bind();
215
+ }
216
+ getNavigationDotsContainerTranslate(navigationDotCount, activeIndex) {
217
+ if (navigationDotCount <= 5) {
218
+ return '0px';
219
+ }
220
+ else {
221
+ const dotContainerWidth = this.navigationDotDimensions().rect?.width ?? 20;
222
+ let offset = -(activeIndex - 2);
223
+ if (activeIndex < 3) {
224
+ offset = 0;
225
+ }
226
+ else if (activeIndex >= navigationDotCount - 3) {
227
+ offset = 5 - navigationDotCount;
228
+ }
229
+ return `${offset * dotContainerWidth}px`;
230
+ }
270
231
  }
271
232
  scrollOneContainerSize(direction) {
272
233
  const scrollElement = this.scrollable()?.nativeElement;
273
234
  if (!scrollElement) {
274
235
  return;
275
236
  }
276
- const parent = this._elementRef.nativeElement;
237
+ const parent = this.elementRef.nativeElement;
277
238
  const isSnappingEnabled = this.snap();
278
239
  if (isSnappingEnabled) {
279
240
  // If snapping is enabled we want to scroll to a position where no further snapping will happen after the scroll.
280
241
  const allIntersections = this.scrollableContentIntersections();
281
- const intersections = getFirstAndLastPartialIntersection(allIntersections);
282
- const relevantIntersection = direction === 'start' ? intersections?.first : intersections?.last;
242
+ const intersections = getIntersectionInfo(allIntersections);
243
+ const relevantIntersection = direction === 'start' ? intersections?.partial.first : intersections?.partial.last;
283
244
  if (!relevantIntersection)
284
245
  return;
285
246
  const nextIndex = relevantIntersection.intersection.intersectionRatio !== 1
@@ -313,16 +274,16 @@ export class ScrollableComponent {
313
274
  }
314
275
  return;
315
276
  }
316
- const intersections = getFirstAndLastPartialIntersection(allIntersections);
277
+ const intersections = getIntersectionInfo(allIntersections);
317
278
  if (!intersections || !scrollElement)
318
279
  return;
319
280
  // Means the current element is bigger than the scrollable container.
320
281
  // In this case we should scroll to the start of the current element. If we are already there we should scroll to the end of the previous element.
321
282
  // This applies to the other direction as well.
322
- const isFirstAndLastIntersectionEqual = intersections.first.intersection === intersections.last.intersection;
283
+ const isFirstAndLastIntersectionEqual = intersections.partial.first.intersection === intersections.partial.last.intersection;
323
284
  const scrollableRect = scrollElement.getBoundingClientRect();
324
285
  if (isFirstAndLastIntersectionEqual) {
325
- const intersection = intersections.first.intersection.target.getBoundingClientRect();
286
+ const intersection = intersections.partial.first.intersection.target.getBoundingClientRect();
326
287
  const isStartOfElementVisible = this.direction() === 'horizontal'
327
288
  ? Math.round(intersection.left) >= Math.round(scrollableRect.left)
328
289
  : Math.round(intersection.top) >= Math.round(scrollableRect.top);
@@ -333,7 +294,7 @@ export class ScrollableComponent {
333
294
  if (direction === 'start') {
334
295
  if (isStartOfElementVisible) {
335
296
  // to the end of the previous element
336
- const previousIndex = intersections.first.index - 1;
297
+ const previousIndex = intersections.partial.first.index - 1;
337
298
  const elementToScrollTo = allIntersections[previousIndex]?.target;
338
299
  if (!elementToScrollTo)
339
300
  return;
@@ -341,19 +302,21 @@ export class ScrollableComponent {
341
302
  element: elementToScrollTo,
342
303
  origin: 'end',
343
304
  });
305
+ this._manualActiveNavigationIndex.set(previousIndex);
344
306
  }
345
307
  else {
346
308
  // to the start of the current element
347
309
  this.scrollToElement({
348
- element: intersections.first.intersection.target,
310
+ element: intersections.partial.first.intersection.target,
349
311
  origin: 'start',
350
312
  });
313
+ this._manualActiveNavigationIndex.set(intersections.partial.first.index);
351
314
  }
352
315
  }
353
316
  else {
354
317
  if (isEndOfElementVisible) {
355
318
  // to the start of the next element
356
- const nextIndex = intersections.last.index + 1;
319
+ const nextIndex = intersections.partial.last.index + 1;
357
320
  const elementToScrollTo = allIntersections[nextIndex]?.target;
358
321
  if (!elementToScrollTo)
359
322
  return;
@@ -361,20 +324,34 @@ export class ScrollableComponent {
361
324
  element: elementToScrollTo,
362
325
  origin: 'start',
363
326
  });
327
+ this._manualActiveNavigationIndex.set(nextIndex);
364
328
  }
365
329
  else {
366
330
  // to the end of the current element
367
331
  this.scrollToElement({
368
- element: intersections.last.intersection.target,
332
+ element: intersections.partial.last.intersection.target,
369
333
  origin: 'end',
370
334
  });
335
+ this._manualActiveNavigationIndex.set(intersections.partial.last.index);
371
336
  }
372
337
  }
373
338
  return;
374
339
  }
375
340
  }
376
- const data = direction === 'start' ? intersections.first : intersections.last;
341
+ else if (this.scrollOrigin() === 'center') {
342
+ // If the scroll origin is forced to be center we should always snap to the center of the next partial intersection in the scroll direction.
343
+ const nextPartialIntersection = direction === 'start' ? intersections.partial.first : intersections.partial.last;
344
+ const nextIndex = nextPartialIntersection.index;
345
+ this.scrollToElement({
346
+ element: nextPartialIntersection.intersection.target,
347
+ origin: 'center',
348
+ });
349
+ this._manualActiveNavigationIndex.set(nextIndex);
350
+ return;
351
+ }
352
+ const data = direction === 'start' ? intersections.partial.first : intersections.partial.last;
377
353
  let elementToScrollTo = data.intersection.target;
354
+ let nextIndex = data.index;
378
355
  if (Math.round(data.intersection.intersectionRatio) === 1) {
379
356
  if (direction === 'start' && data.index === 0) {
380
357
  return;
@@ -382,18 +359,21 @@ export class ScrollableComponent {
382
359
  if (direction === 'end' && data.index === allIntersections.length - 1) {
383
360
  return;
384
361
  }
385
- const nextIndex = direction === 'start' ? data.index - 1 : data.index + 1;
362
+ nextIndex = direction === 'start' ? data.index - 1 : data.index + 1;
386
363
  elementToScrollTo = allIntersections[nextIndex]?.target;
364
+ if (!elementToScrollTo)
365
+ return;
387
366
  }
388
- if (!elementToScrollTo)
389
- return;
390
367
  this.scrollToElement({
391
368
  element: elementToScrollTo,
392
369
  origin: direction,
393
370
  });
371
+ this._manualActiveNavigationIndex.set(nextIndex);
394
372
  }
395
373
  scrollToElement(options) {
396
374
  const scrollElement = this.scrollable()?.nativeElement;
375
+ const { origin } = options;
376
+ const forcedOrigin = this.scrollOrigin();
397
377
  scrollToElement({
398
378
  container: scrollElement,
399
379
  direction: this.direction() === 'horizontal' ? 'inline' : 'block',
@@ -401,13 +381,16 @@ export class ScrollableComponent {
401
381
  ? { scrollInlineMargin: this.scrollMargin() }
402
382
  : { scrollBlockMargin: this.scrollMargin() }),
403
383
  ...options,
384
+ ...(forcedOrigin === 'auto' || options.ignoreForcedOrigin ? { origin } : { origin: forcedOrigin }),
404
385
  });
405
386
  }
406
387
  scrollToElementByIndex(options) {
407
388
  const elements = this.scrollableChildren();
389
+ const { origin } = options;
390
+ const forcedOrigin = this.scrollOrigin();
408
391
  if (!elements.length) {
409
392
  if (isDevMode()) {
410
- console.warn('No elements found to scroll to. Make sure to apply the isElement directive to the elements you want to scroll to.');
393
+ console.warn('No elements found to scroll to.');
411
394
  }
412
395
  return;
413
396
  }
@@ -420,19 +403,15 @@ export class ScrollableComponent {
420
403
  ? { scrollInlineMargin: this.scrollMargin() }
421
404
  : { scrollBlockMargin: this.scrollMargin() }),
422
405
  ...options,
406
+ ...(forcedOrigin === 'auto' || options.ignoreForcedOrigin ? { origin } : { origin: forcedOrigin }),
423
407
  });
424
408
  }
425
- scrollToElementViaNavigation(elementIndex, element) {
426
- this.manualActiveNavigationIndex.set(elementIndex);
409
+ scrollToElementViaNavigation(elementIndex) {
410
+ const element = this.scrollableChildren()[elementIndex];
411
+ this._manualActiveNavigationIndex.set(elementIndex);
427
412
  this.scrollToElement({
428
413
  element,
429
414
  });
430
- const scrollElement = this.scrollable()?.nativeElement;
431
- if (!scrollElement)
432
- return;
433
- fromEvent(scrollElement, 'scroll')
434
- .pipe(debounceTime(50), take(1), tap(() => this.manualActiveNavigationIndex.set(null)))
435
- .subscribe();
436
415
  }
437
416
  setIsCursorDragging(isDragging) {
438
417
  this._isCursorDragging$.next(isDragging);
@@ -459,13 +438,25 @@ export class ScrollableComponent {
459
438
  const scrollElement = this.scrollable()?.nativeElement;
460
439
  if (!scrollElement)
461
440
  return;
462
- const intersections = getFirstAndLastPartialIntersection(allIntersections);
441
+ const intersections = getIntersectionInfo(allIntersections);
463
442
  if (!intersections)
464
443
  return;
465
- const isFirstAndLastIntersectionEqual = intersections.first.intersection === intersections.last.intersection;
444
+ const isFirstAndLastIntersectionEqual = intersections.partial.first.intersection === intersections.partial.last.intersection;
466
445
  const scrollableRect = scrollElement.getBoundingClientRect();
467
- if (isFirstAndLastIntersectionEqual) {
468
- const intersection = intersections.first.intersection.target.getBoundingClientRect();
446
+ if (this.scrollOrigin() === 'center' && intersections.full.hasMultiple) {
447
+ // If there is more than one fully visible element we should not snap at all.
448
+ return;
449
+ }
450
+ else if (this.scrollOrigin() === 'center' && intersections.full.first.intersection) {
451
+ // If there is already a fully visible element we should snap it to the center.
452
+ this.scrollToElement({
453
+ element: intersections.full.first.intersection.target,
454
+ origin: 'center',
455
+ });
456
+ return;
457
+ }
458
+ else if (isFirstAndLastIntersectionEqual) {
459
+ const intersection = intersections.partial.first.intersection.target.getBoundingClientRect();
469
460
  const isStartOfElementVisible = this.direction() === 'horizontal'
470
461
  ? intersection.left >= scrollableRect.left
471
462
  : intersection.top >= scrollableRect.top;
@@ -479,7 +470,7 @@ export class ScrollableComponent {
479
470
  // If the start of the element is visible we should snap to the start.
480
471
  if (isStartOfElementVisible) {
481
472
  this.scrollToElement({
482
- element: intersections.first.intersection.target,
473
+ element: intersections.partial.first.intersection.target,
483
474
  origin: 'start',
484
475
  });
485
476
  return;
@@ -487,28 +478,29 @@ export class ScrollableComponent {
487
478
  // If the end of the element is visible we should snap to the end.
488
479
  if (isEndOfElementVisible) {
489
480
  this.scrollToElement({
490
- element: intersections.last.intersection.target,
481
+ element: intersections.partial.last.intersection.target,
491
482
  origin: 'end',
492
483
  });
493
484
  return;
494
485
  }
495
486
  }
496
487
  else if ((this.direction() === 'horizontal' &&
497
- intersections.biggest.intersection.boundingClientRect.width > scrollableRect.width) ||
488
+ intersections.partial.biggest.intersection.boundingClientRect.width > scrollableRect.width) ||
498
489
  (this.direction() === 'vertical' &&
499
- intersections.biggest.intersection.boundingClientRect.height > scrollableRect.height)) {
490
+ intersections.partial.biggest.intersection.boundingClientRect.height > scrollableRect.height)) {
500
491
  // If the current element is bigger than the scrollable container we should snap to the start of the current element if the scroll direction is forward
501
492
  // and to the end of the current element if the scroll direction is backwards.
502
- const origin = intersections.biggest.index === intersections.first.index ? 'end' : 'start';
493
+ const origin = intersections.partial.biggest.index === intersections.partial.first.index ? 'end' : 'start';
503
494
  this.scrollToElement({
504
- element: intersections.biggest.intersection.target,
495
+ element: intersections.partial.biggest.intersection.target,
505
496
  origin,
497
+ ignoreForcedOrigin: true,
506
498
  });
507
499
  }
508
500
  else {
509
501
  // No special case. Just snap to the biggest intersection.
510
502
  this.scrollToElement({
511
- element: intersections.biggest.intersection.target,
503
+ element: intersections.partial.biggest.intersection.target,
512
504
  });
513
505
  }
514
506
  }), takeUntil(this._disableSnapping$))
@@ -517,10 +509,10 @@ export class ScrollableComponent {
517
509
  _disableSnapping() {
518
510
  this._disableSnapping$.next();
519
511
  }
520
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ScrollableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
521
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: ScrollableComponent, isStandalone: true, selector: "et-scrollable", inputs: { _itemSize: ["itemSize", "_itemSize"], _direction: ["direction", "_direction"], _scrollableRole: ["scrollableRole", "_scrollableRole"], _scrollableClass: ["scrollableClass", "_scrollableClass"], _renderNavigation: ["renderNavigation", "_renderNavigation", booleanAttribute], _renderMasks: ["renderMasks", "_renderMasks", booleanAttribute], _renderButtons: ["renderButtons", "_renderButtons", booleanAttribute], _renderScrollbars: ["renderScrollbars", "_renderScrollbars", booleanAttribute], _stickyButtons: ["stickyButtons", "_stickyButtons", booleanAttribute], _cursorDragScroll: ["cursorDragScroll", "_cursorDragScroll", booleanAttribute], _disableActiveElementScrolling: ["disableActiveElementScrolling", "_disableActiveElementScrolling", booleanAttribute], _scrollMode: ["scrollMode", "_scrollMode"], _snap: ["snap", "_snap", booleanAttribute], _scrollMargin: ["scrollMargin", "_scrollMargin", numberAttribute] }, outputs: { scrollStateChange: "scrollStateChange", intersectionChange: "intersectionChange" }, host: { classAttribute: "et-scrollable" }, queries: [{ propertyName: "_activeElementList", predicate: SCROLLABLE_IS_ACTIVE_CHILD_TOKEN, descendants: true }], viewQueries: [{ propertyName: "_scrollable", first: true, predicate: ["scrollable"], descendants: true, static: true }, { propertyName: "_scrollableContainer", first: true, predicate: ["scrollableContainer"], descendants: true, static: true }, { propertyName: "_firstElement", first: true, predicate: ["firstElement"], descendants: true, static: true }, { propertyName: "_lastElement", first: true, predicate: ["lastElement"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"et-scrollable-wrapper\">\n <div\n #scrollable\n [attr.role]=\"scrollableRole() ?? undefined\"\n [etCursorDragScroll]=\"cursorDragScroll() && (!isAtStart() || !isAtEnd())\"\n [allowedDirection]=\"direction()\"\n (cursorDragStart)=\"setIsCursorDragging(true)\"\n (cursorDragEnd)=\"setIsCursorDragging(false)\"\n class=\"et-scrollable-container-outer\"\n >\n <div #scrollableContainer [ngClass]=\"scrollableClass()\" class=\"et-scrollable-container\">\n <div #firstElement class=\"et-scroll-observer-first-element\" etScrollableIgnoreChild></div>\n <ng-content />\n <div #lastElement class=\"et-scroll-observer-last-element\" etScrollableIgnoreChild></div>\n </div>\n </div>\n\n @if (renderMasks()) {\n <div class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n </div>\n }\n\n @if (renderButtons()) {\n <div class=\"et-scrollable-buttons\">\n <button\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n <button\n (click)=\"scrollToEndDirection()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n </div>\n }\n</div>\n\n@if (renderNavigation() && scrollableNavigation().length > 1) {\n <div class=\"et-scrollable-navigation\" aria-hidden=\"true\">\n @for (item of scrollableNavigation(); track i; let i = $index) {\n <button\n [class.et-scrollable-navigation-item--active]=\"item.isActive\"\n (click)=\"scrollToElementViaNavigation(i, item.element)\"\n class=\"et-scrollable-navigation-item\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n ></button>\n }\n </div>\n}\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;--_flow: column;display:block}.et-scrollable .et-scrollable-wrapper{display:grid;position:relative}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=full]{--_auto-size: var(--actual-item-size)}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer::-webkit-scrollbar{display:none}.et-scrollable[direction=horizontal] .et-scrollable-container-outer{overflow-x:auto;overflow-y:hidden}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-auto-columns:var(--_auto-size)}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:rotate(90deg)}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element,.et-scrollable[direction=horizontal] .et-scroll-observer-last-element{block-size:100%;inline-size:1px}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element{inset-inline-start:1px}.et-scrollable[direction=horizontal] .et-scroll-observer-last-element{inset-inline-end:1px}.et-scrollable[direction=vertical]{--_flow: row}.et-scrollable[direction=vertical] .et-scrollable-container-outer{overflow-x:hidden;overflow-y:auto}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-rows:var(--_auto-size)}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:rotate(180deg)}.et-scrollable[direction=vertical] .et-scroll-observer-first-element,.et-scrollable[direction=vertical] .et-scroll-observer-last-element{inline-size:100%;block-size:1px}.et-scrollable[direction=vertical] .et-scroll-observer-first-element{inset-block-start:1px}.et-scrollable[direction=vertical] .et-scroll-observer-last-element{inset-block-end:1px}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{opacity:1}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{opacity:1}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scrollable-container-outer{overflow:auto;display:grid;position:relative;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{position:absolute;pointer-events:none}.et-scrollable .et-scrollable-container{display:grid;grid-auto-flow:var(--_flow);position:relative}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0}.et-scrollable.et-scrollable--can-scroll.et-scrollable--enable-overlay-animations .et-scrollable-mask,.et-scrollable.et-scrollable--can-scroll.et-scrollable--enable-overlay-animations .et-scrollable-button{transition:opacity .3s var(--ease-5)}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}.et-scrollable .et-scrollable-navigation{display:flex;justify-content:center;gap:10px;margin-block-start:10px}.et-scrollable .et-scrollable-navigation .et-scrollable-navigation-item{all:unset;inline-size:10px;block-size:10px;display:block;background-color:#4b4b4b;border-radius:50%;cursor:pointer}.et-scrollable .et-scrollable-navigation .et-scrollable-navigation-item.et-scrollable-navigation-item--active{background-color:#c6c6c6}\n"], dependencies: [{ kind: "directive", type: CursorDragScrollDirective, selector: "[etCursorDragScroll]", inputs: ["etCursorDragScroll", "allowedDirection"], outputs: ["cursorDragStart", "cursorDragMove", "cursorDragEnd"], exportAs: ["etCursorDragScroll"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }, { kind: "directive", type: ScrollableIgnoreChildDirective, selector: "[etScrollableIgnoreChild]", inputs: ["etScrollableIgnoreChild"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
512
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: ScrollableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
513
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.6", type: ScrollableComponent, isStandalone: true, selector: "et-scrollable", inputs: { itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, scrollableRole: { classPropertyName: "scrollableRole", publicName: "scrollableRole", isSignal: true, isRequired: false, transformFunction: null }, scrollableClass: { classPropertyName: "scrollableClass", publicName: "scrollableClass", isSignal: true, isRequired: false, transformFunction: null }, renderNavigation: { classPropertyName: "renderNavigation", publicName: "renderNavigation", isSignal: true, isRequired: false, transformFunction: null }, renderMasks: { classPropertyName: "renderMasks", publicName: "renderMasks", isSignal: true, isRequired: false, transformFunction: null }, renderButtons: { classPropertyName: "renderButtons", publicName: "renderButtons", isSignal: true, isRequired: false, transformFunction: null }, buttonPosition: { classPropertyName: "buttonPosition", publicName: "buttonPosition", isSignal: true, isRequired: false, transformFunction: null }, renderScrollbars: { classPropertyName: "renderScrollbars", publicName: "renderScrollbars", isSignal: true, isRequired: false, transformFunction: null }, stickyButtons: { classPropertyName: "stickyButtons", publicName: "stickyButtons", isSignal: true, isRequired: false, transformFunction: null }, cursorDragScroll: { classPropertyName: "cursorDragScroll", publicName: "cursorDragScroll", isSignal: true, isRequired: false, transformFunction: null }, disableActiveElementScrolling: { classPropertyName: "disableActiveElementScrolling", publicName: "disableActiveElementScrolling", isSignal: true, isRequired: false, transformFunction: null }, scrollMode: { classPropertyName: "scrollMode", publicName: "scrollMode", isSignal: true, isRequired: false, transformFunction: null }, snap: { classPropertyName: "snap", publicName: "snap", isSignal: true, isRequired: false, transformFunction: null }, scrollMargin: { classPropertyName: "scrollMargin", publicName: "scrollMargin", isSignal: true, isRequired: false, transformFunction: null }, scrollOrigin: { classPropertyName: "scrollOrigin", publicName: "scrollOrigin", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { scrollStateChange: "scrollStateChange", intersectionChange: "intersectionChange" }, host: { classAttribute: "et-scrollable" }, queries: [{ propertyName: "activeElementList", predicate: SCROLLABLE_IS_ACTIVE_CHILD_TOKEN, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "scrollable", first: true, predicate: ["scrollable"], descendants: true, isSignal: true }, { propertyName: "firstElement", first: true, predicate: ["firstElement"], descendants: true, isSignal: true }, { propertyName: "lastElement", first: true, predicate: ["lastElement"], descendants: true, isSignal: true }, { propertyName: "navigationDotsContainer", first: true, predicate: ["navigationDotsContainer"], descendants: true, isSignal: true }, { propertyName: "firstNavigationDot", first: true, predicate: ["navigationDot"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"et-scrollable-wrapper\">\n <div\n #scrollable\n [attr.role]=\"scrollableRole() ?? undefined\"\n [etCursorDragScroll]=\"cursorDragScroll() && (!isAtStart() || !isAtEnd())\"\n [allowedDirection]=\"direction()\"\n [ngClass]=\"scrollableClass()\"\n (cursorDragStart)=\"setIsCursorDragging(true)\"\n (cursorDragEnd)=\"setIsCursorDragging(false)\"\n class=\"et-scrollable-container\"\n >\n <div #firstElement class=\"et-scroll-observer-first-element\" etScrollableIgnoreChild></div>\n <ng-content />\n <div #lastElement class=\"et-scroll-observer-last-element\" etScrollableIgnoreChild></div>\n </div>\n\n @if (renderMasks()) {\n <div class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n </div>\n }\n\n @if (renderButtonsInside()) {\n <div class=\"et-scrollable-buttons\">\n <ng-container *ngTemplateOutlet=\"forwardButtonTpl\" />\n <ng-container *ngTemplateOutlet=\"backwardButtonTpl\" />\n </div>\n }\n</div>\n\n@if (renderButtonsInFooter() || (renderNavigation() && scrollableNavigation().length > 1)) {\n <div\n [ngClass]=\"{\n 'et-scrollable-footer--with-navigation': renderNavigation(),\n 'et-scrollable-footer--with-buttons': renderButtonsInFooter()\n }\"\n class=\"et-scrollable-footer\"\n aria-hidden=\"true\"\n >\n @if (renderButtonsInFooter()) {\n <ng-container *ngTemplateOutlet=\"forwardButtonTpl\" />\n }\n\n @if (renderNavigation()) {\n <div class=\"et-scrollable-progress-bar\">\n <div #navigationDotsContainer class=\"et-scrollable-dots-container\">\n @for (item of scrollableNavigation(); track i; let i = $index) {\n <button\n #navigationDot\n [class.et-scrollable-navigation-item--active]=\"item.isActive\"\n [class.et-scrollable-navigation-item--close]=\"\n scrollableNavigation()[i + 1]?.isActive || scrollableNavigation()[i - 1]?.isActive\n \"\n [class.et-scrollable-navigation-item--far]=\"\n !scrollableNavigation()[i + 1]?.isActive && !scrollableNavigation()[i - 1]?.isActive && !item.isActive\n \"\n [attr.active-offset]=\"item.activeOffset\"\n (click)=\"scrollToElementViaNavigation(i)\"\n class=\"et-scrollable-navigation-item\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n ></button>\n }\n </div>\n </div>\n }\n\n @if (renderButtonsInFooter()) {\n <ng-container *ngTemplateOutlet=\"backwardButtonTpl\" />\n }\n </div>\n}\n\n<ng-template #forwardButtonTpl>\n <button\n [disabled]=\"isAtStart()\"\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n</ng-template>\n\n<ng-template #backwardButtonTpl>\n <button\n [disabled]=\"isAtEnd()\"\n (click)=\"scrollToEndDirection()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n</ng-template>\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;display:block}.et-scrollable .et-scrollable-wrapper{display:grid;position:relative;block-size:100%;inline-size:100%}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=full]{--_auto-size: 100%}.et-scrollable[render-scrollbars=false] .et-scrollable-container{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container::-webkit-scrollbar{display:none}.et-scrollable .et-scrollable-button .et-chevron-icon{display:block}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-template-columns:repeat(var(--item-count),var(--_auto-size));overflow-x:auto;overflow-y:hidden}.et-scrollable[direction=horizontal] .et-scrollable-container :nth-child(2){grid-column:1/1;grid-row:1/1}.et-scrollable[direction=horizontal] .et-scrollable-container :nth-last-child(2){grid-column:var(--item-count)/var(--item-count);grid-row:1/1}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:translate(-10px)}.et-scrollable[direction=horizontal] .et-scrollable-button--start .et-chevron-icon{transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:translate(10px)}.et-scrollable[direction=horizontal] .et-scrollable-button--end .et-chevron-icon{transform:rotate(90deg)}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element,.et-scrollable[direction=horizontal] .et-scroll-observer-last-element{block-size:100%;inline-size:1px}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element{margin-inline-start:3px;grid-column:1/1;grid-row:1/1}.et-scrollable[direction=horizontal] .et-scroll-observer-last-element{margin-inline-end:3px;grid-column:var(--item-count)/var(--item-count);grid-row:1/1;justify-self:end}.et-scrollable[direction=vertical] .et-scrollable-container{grid-template-rows:repeat(var(--item-count),var(--_auto-size));overflow-x:hidden;overflow-y:auto}.et-scrollable[direction=vertical] .et-scrollable-container :nth-child(2){grid-row:1/1;grid-column:1/1}.et-scrollable[direction=vertical] .et-scrollable-container :nth-last-child(2){grid-row:var(--item-count)/var(--item-count);grid-column:1/1}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:translateY(-10px)}.et-scrollable[direction=vertical] .et-scrollable-button--start .et-chevron-icon{transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:translateY(10px)}.et-scrollable[direction=vertical] .et-scrollable-button--end .et-chevron-icon{transform:rotate(180deg)}.et-scrollable[direction=vertical] .et-scroll-observer-first-element,.et-scrollable[direction=vertical] .et-scroll-observer-last-element{inline-size:100%;block-size:1px}.et-scrollable[direction=vertical] .et-scroll-observer-first-element{margin-block-start:3px;grid-row:1/1;grid-column:1/1}.et-scrollable[direction=vertical] .et-scroll-observer-last-element{margin-block-end:3px;grid-row:var(--item-count)/var(--item-count);grid-column:1/1;align-self:end}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{opacity:1;transform:translate(0)}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{opacity:1;transform:translate(0)}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{pointer-events:none}.et-scrollable .et-scrollable-container{display:grid;position:relative;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0}.et-scrollable.et-scrollable--can-animate .et-scrollable-dots-container{transition:transform .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate .et-scrollable-navigation-item:after{transition:background-color .2s linear,transform .2s linear}.et-scrollable.et-scrollable--can-animate.et-scrollable--can-scroll .et-scrollable-mask{transition:opacity .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate.et-scrollable--can-scroll .et-scrollable-button{transition:opacity .3s var(--ease-5),transform .3s var(--ease-5)}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}.et-scrollable .et-scrollable-footer{display:flex;justify-content:center;gap:10px;margin-block-start:10px}.et-scrollable .et-scrollable-navigation-item{display:flex;justify-content:center;align-items:center;border:none;padding:0;inline-size:20px;block-size:20px;border-radius:50%;cursor:pointer;background-color:transparent}.et-scrollable .et-scrollable-navigation-item.et-scrollable-navigation-item--active:after{background-color:#c6c6c6}.et-scrollable .et-scrollable-navigation-item:after{content:\"\";display:block;inline-size:50%;block-size:50%;border-radius:50%;background-color:#4b4b4b;transform:scale(0)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"0\"]:after{transform:scale(1)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"1\"]:after{transform:scale(.75)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"2\"]:after{transform:scale(.6)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"3\"]:after{transform:scale(.5)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"4\"]:after{transform:scale(.4)}.et-scrollable .et-scrollable-progress-bar{overflow:hidden;max-inline-size:100px;display:flex;align-items:center}.et-scrollable .et-scrollable-progress-bar .et-scrollable-dots-container{display:flex;flex-wrap:nowrap}\n"], dependencies: [{ kind: "directive", type: CursorDragScrollDirective, selector: "[etCursorDragScroll]", inputs: ["etCursorDragScroll", "allowedDirection"], outputs: ["cursorDragStart", "cursorDragMove", "cursorDragEnd"], exportAs: ["etCursorDragScroll"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ChevronIconComponent, selector: "et-chevron-icon" }, { kind: "directive", type: ScrollableIgnoreChildDirective, selector: "[etScrollableIgnoreChild]", inputs: ["etScrollableIgnoreChild"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
522
514
  }
523
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ScrollableComponent, decorators: [{
515
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: ScrollableComponent, decorators: [{
524
516
  type: Component,
525
517
  args: [{ selector: 'et-scrollable', standalone: true, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
526
518
  CursorDragScrollDirective,
@@ -530,69 +522,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImpor
530
522
  ChevronIconComponent,
531
523
  ScrollableIsActiveChildDirective,
532
524
  ScrollableIgnoreChildDirective,
525
+ NgTemplateOutlet,
533
526
  ], host: {
534
527
  class: 'et-scrollable',
535
- }, template: "<div class=\"et-scrollable-wrapper\">\n <div\n #scrollable\n [attr.role]=\"scrollableRole() ?? undefined\"\n [etCursorDragScroll]=\"cursorDragScroll() && (!isAtStart() || !isAtEnd())\"\n [allowedDirection]=\"direction()\"\n (cursorDragStart)=\"setIsCursorDragging(true)\"\n (cursorDragEnd)=\"setIsCursorDragging(false)\"\n class=\"et-scrollable-container-outer\"\n >\n <div #scrollableContainer [ngClass]=\"scrollableClass()\" class=\"et-scrollable-container\">\n <div #firstElement class=\"et-scroll-observer-first-element\" etScrollableIgnoreChild></div>\n <ng-content />\n <div #lastElement class=\"et-scroll-observer-last-element\" etScrollableIgnoreChild></div>\n </div>\n </div>\n\n @if (renderMasks()) {\n <div class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n </div>\n }\n\n @if (renderButtons()) {\n <div class=\"et-scrollable-buttons\">\n <button\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n <button\n (click)=\"scrollToEndDirection()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n </div>\n }\n</div>\n\n@if (renderNavigation() && scrollableNavigation().length > 1) {\n <div class=\"et-scrollable-navigation\" aria-hidden=\"true\">\n @for (item of scrollableNavigation(); track i; let i = $index) {\n <button\n [class.et-scrollable-navigation-item--active]=\"item.isActive\"\n (click)=\"scrollToElementViaNavigation(i, item.element)\"\n class=\"et-scrollable-navigation-item\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n ></button>\n }\n </div>\n}\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;--_flow: column;display:block}.et-scrollable .et-scrollable-wrapper{display:grid;position:relative}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=full]{--_auto-size: var(--actual-item-size)}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container-outer::-webkit-scrollbar{display:none}.et-scrollable[direction=horizontal] .et-scrollable-container-outer{overflow-x:auto;overflow-y:hidden}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-auto-columns:var(--_auto-size)}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:rotate(90deg)}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element,.et-scrollable[direction=horizontal] .et-scroll-observer-last-element{block-size:100%;inline-size:1px}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element{inset-inline-start:1px}.et-scrollable[direction=horizontal] .et-scroll-observer-last-element{inset-inline-end:1px}.et-scrollable[direction=vertical]{--_flow: row}.et-scrollable[direction=vertical] .et-scrollable-container-outer{overflow-x:hidden;overflow-y:auto}.et-scrollable[direction=vertical] .et-scrollable-container{grid-auto-rows:var(--_auto-size)}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:rotate(180deg)}.et-scrollable[direction=vertical] .et-scroll-observer-first-element,.et-scrollable[direction=vertical] .et-scroll-observer-last-element{inline-size:100%;block-size:1px}.et-scrollable[direction=vertical] .et-scroll-observer-first-element{inset-block-start:1px}.et-scrollable[direction=vertical] .et-scroll-observer-last-element{inset-block-end:1px}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{opacity:1}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{opacity:1}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scrollable-container-outer{overflow:auto;display:grid;position:relative;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{position:absolute;pointer-events:none}.et-scrollable .et-scrollable-container{display:grid;grid-auto-flow:var(--_flow);position:relative}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0}.et-scrollable.et-scrollable--can-scroll.et-scrollable--enable-overlay-animations .et-scrollable-mask,.et-scrollable.et-scrollable--can-scroll.et-scrollable--enable-overlay-animations .et-scrollable-button{transition:opacity .3s var(--ease-5)}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}.et-scrollable .et-scrollable-navigation{display:flex;justify-content:center;gap:10px;margin-block-start:10px}.et-scrollable .et-scrollable-navigation .et-scrollable-navigation-item{all:unset;inline-size:10px;block-size:10px;display:block;background-color:#4b4b4b;border-radius:50%;cursor:pointer}.et-scrollable .et-scrollable-navigation .et-scrollable-navigation-item.et-scrollable-navigation-item--active{background-color:#c6c6c6}\n"] }]
536
- }], ctorParameters: () => [], propDecorators: { _itemSize: [{
537
- type: Input,
538
- args: [{ alias: 'itemSize' }]
539
- }], _direction: [{
540
- type: Input,
541
- args: [{ alias: 'direction' }]
542
- }], _scrollableRole: [{
543
- type: Input,
544
- args: [{ alias: 'scrollableRole' }]
545
- }], _scrollableClass: [{
546
- type: Input,
547
- args: [{ alias: 'scrollableClass' }]
548
- }], _renderNavigation: [{
549
- type: Input,
550
- args: [{ transform: booleanAttribute, alias: 'renderNavigation' }]
551
- }], _renderMasks: [{
552
- type: Input,
553
- args: [{ transform: booleanAttribute, alias: 'renderMasks' }]
554
- }], _renderButtons: [{
555
- type: Input,
556
- args: [{ transform: booleanAttribute, alias: 'renderButtons' }]
557
- }], _renderScrollbars: [{
558
- type: Input,
559
- args: [{ transform: booleanAttribute, alias: 'renderScrollbars' }]
560
- }], _stickyButtons: [{
561
- type: Input,
562
- args: [{ transform: booleanAttribute, alias: 'stickyButtons' }]
563
- }], _cursorDragScroll: [{
564
- type: Input,
565
- args: [{ transform: booleanAttribute, alias: 'cursorDragScroll' }]
566
- }], _disableActiveElementScrolling: [{
567
- type: Input,
568
- args: [{ transform: booleanAttribute, alias: 'disableActiveElementScrolling' }]
569
- }], _scrollMode: [{
570
- type: Input,
571
- args: [{ alias: 'scrollMode' }]
572
- }], _snap: [{
573
- type: Input,
574
- args: [{ transform: booleanAttribute, alias: 'snap' }]
575
- }], _scrollMargin: [{
576
- type: Input,
577
- args: [{ transform: numberAttribute, alias: 'scrollMargin' }]
578
- }], scrollStateChange: [{
579
- type: Output
580
- }], intersectionChange: [{
581
- type: Output
582
- }], _scrollable: [{
583
- type: ViewChild,
584
- args: ['scrollable', { static: true }]
585
- }], _scrollableContainer: [{
586
- type: ViewChild,
587
- args: ['scrollableContainer', { static: true }]
588
- }], _firstElement: [{
589
- type: ViewChild,
590
- args: ['firstElement', { static: true }]
591
- }], _lastElement: [{
592
- type: ViewChild,
593
- args: ['lastElement', { static: true }]
594
- }], _activeElementList: [{
595
- type: ContentChildren,
596
- args: [SCROLLABLE_IS_ACTIVE_CHILD_TOKEN, { descendants: true }]
597
- }] } });
598
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsZUFBZSxFQUNmLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUUsT0FBTyxFQUVMLHlCQUF5QixFQUN6QixZQUFZLEVBRVosMkJBQTJCLEVBRzNCLGNBQWMsRUFDZCxrQ0FBa0MsRUFDbEMsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQiwyQkFBMkIsRUFDM0IsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxlQUFlLEVBQ2YsT0FBTyxFQUNQLGFBQWEsRUFDYixZQUFZLEVBQ1osTUFBTSxF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LEtBQUssRUFBRSxjQUFjLEVBQUU7Z0JBT25ELGlCQUFpQjtzQkFEekIsTUFBTTtnQkFJRSxrQkFBa0I7c0JBRDFCLE1BQU07Z0JBSUssV0FBVztzQkFEdEIsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU83QixvQkFBb0I7c0JBRC9CLFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU90QyxhQUFhO3NCQUR4QixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBTy9CLFlBQVk7c0JBRHZCLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFPOUIsa0JBQWtCO3NCQUQ3QixlQUFlO3VCQUFDLGdDQUFnQyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaXNEZXZNb2RlLFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7XG4gIEN1cnJlbnRFbGVtZW50VmlzaWJpbGl0eSxcbiAgQ3Vyc29yRHJhZ1Njcm9sbERpcmVjdGl2ZSxcbiAgTGV0RGlyZWN0aXZlLFxuICBOZ0NsYXNzVHlwZSxcbiAgT2JzZXJ2ZVNjcm9sbFN0YXRlRGlyZWN0aXZlLFxuICBTY3JvbGxPYnNlcnZlclNjcm9sbFN0YXRlLFxuICBTY3JvbGxUb0VsZW1lbnRPcHRpb25zLFxuICBUeXBlZFF1ZXJ5TGlzdCxcbiAgZ2V0Rmlyc3RBbmRMYXN0UGFydGlhbEludGVyc2VjdGlvbixcbiAgaXNFbGVtZW50VmlzaWJsZSxcbiAgbmV4dEZyYW1lLFxuICBzY3JvbGxUb0VsZW1lbnQsXG4gIHNpZ25hbEVsZW1lbnRDaGlsZHJlbixcbiAgc2lnbmFsRWxlbWVudEludGVyc2VjdGlvbixcbiAgc2lnbmFsRWxlbWVudFNjcm9sbFN0YXRlLFxuICBzaWduYWxIb3N0QXR0cmlidXRlcyxcbiAgc2lnbmFsSG9zdENsYXNzZXMsXG4gIHNpZ25hbEhvc3RFbGVtZW50RGltZW5zaW9ucyxcbiAgc2lnbmFsSG9zdFN0eWxlcyxcbn0gZnJvbSAnQGV0aGxldGUvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIFN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZmlsdGVyLFxuICBmcm9tRXZlbnQsXG4gIG1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2hldnJvbkljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9pY29ucy9jaGV2cm9uLWljb24nO1xuaW1wb3J0IHsgU2Nyb2xsYWJsZUlnbm9yZUNoaWxkRGlyZWN0aXZlLCBpc1Njcm9sbGFibGVDaGlsZElnbm9yZWQgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3Njcm9sbGFibGUtaWdub3JlLWNoaWxkJztcbmltcG9ydCB7XG4gIFNDUk9MTEFCTEVfSVNfQUNUSVZFX0NISUxEX1RPS0VOLFxuICBTY3JvbGxhYmxlSXNBY3RpdmVDaGlsZERpcmVjdGl2ZSxcbn0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9zY3JvbGxhYmxlLWlzLWFjdGl2ZS1jaGlsZCc7XG5pbXBvcnQgeyBTY3JvbGxhYmxlSW50ZXJzZWN0aW9uQ2hhbmdlLCBTY3JvbGxhYmxlU2Nyb2xsTW9kZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuLy8gVGhyZXNob2xkcyBmb3IgdGhlIGludGVyc2VjdGlvbiBvYnNlcnZlci5cbmNvbnN0IEVMRU1FTlRfSU5URVJTRUNUSU9OX1RIUkVTSE9MRCA9IFtcbiAgLy8gV2UgdXNlIDUxIHN0ZXBzIHRvIGdldCBhIDIlIHN0ZXAgc2l6ZS5cbiAgLi4uQXJyYXkuZnJvbSh7IGxlbmd0aDogNTEgfSwgKF8sIGkpID0+IGkgLyA1MCksXG5cbiAgLy8gQWRkaXRpb25hbCBzdGVwcyBuZWVkZWQgc2luY2UgZGlzcGxheSBzY2FsaW5nIGNhbiBjYXVzZSB0aGUgaW50ZXJzZWN0aW9uIHJhdGlvIHRvIGJlIHNsaWdodGx5IG9mZi5cbiAgMC4wMSxcbiAgMC4wMDUsXG4gIDAuMDAxLFxuICAwLjk5LFxuICAwLjk5NSxcbiAgMC45OTksXG5dO1xuXG5pbnRlcmZhY2UgU2Nyb2xsYWJsZU5hdmlnYXRpb25JdGVtIHtcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1zY3JvbGxhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Njcm9sbGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY3JvbGxhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgQ3Vyc29yRHJhZ1Njcm9sbERpcmVjdGl2ZSxcbiAgICBPYnNlcnZlU2Nyb2xsU3RhdGVEaXJlY3RpdmUsXG4gICAgTmdDbGFzcyxcbiAgICBMZXREaXJlY3RpdmUsXG4gICAgQ2hldnJvbkljb25Db21wb25lbnQsXG4gICAgU2Nyb2xsYWJsZUlzQWN0aXZlQ2hpbGREaXJlY3RpdmUsXG4gICAgU2Nyb2xsYWJsZUlnbm9yZUNoaWxkRGlyZWN0aXZlLFxuICBdLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdldC1zY3JvbGxhYmxlJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgU2Nyb2xsYWJsZUNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9pc0N1cnNvckRyYWdnaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnaXRlbVNpemUnIH0pXG4gIHNldCBfaXRlbVNpemUodjogJ2F1dG8nIHwgJ3NhbWUnIHwgJ2Z1bGwnKSB7XG4gICAgdGhpcy5pdGVtU2l6ZS5zZXQodik7XG4gIH1cbiAgcmVhZG9ubHkgaXRlbVNpemUgPSBzaWduYWw8J2F1dG8nIHwgJ3NhbWUnIHwgJ2Z1bGwnPignYXV0bycpO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnZGlyZWN0aW9uJyB9KVxuICBzZXQgX2RpcmVjdGlvbih2OiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnKSB7XG4gICAgdGhpcy5kaXJlY3Rpb24uc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IGRpcmVjdGlvbiA9IHNpZ25hbDwnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnPignaG9yaXpvbnRhbCcpO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnc2Nyb2xsYWJsZVJvbGUnIH0pXG4gIHNldCBfc2Nyb2xsYWJsZVJvbGUodjogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuc2Nyb2xsYWJsZVJvbGUuc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IHNjcm9sbGFibGVSb2xlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnc2Nyb2xsYWJsZUNsYXNzJyB9KVxuICBzZXQgX3Njcm9sbGFibGVDbGFzcyh2OiBOZ0NsYXNzVHlwZSB8IG51bGwpIHtcbiAgICB0aGlzLnNjcm9sbGFibGVDbGFzcy5zZXQodik7XG4gIH1cbiAgcmVhZG9ubHkgc2Nyb2xsYWJsZUNsYXNzID0gc2lnbmFsPE5nQ2xhc3NUeXBlIHwgbnVsbD4obnVsbCk7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLCBhbGlhczogJ3JlbmRlck5hdmlnYXRpb24nIH0pXG4gIHNldCBfcmVuZGVyTmF2aWdhdGlvbih2OiBib29sZWFuKSB7XG4gICAgdGhpcy5yZW5kZXJOYXZpZ2F0aW9uLnNldCh2KTtcbiAgfVxuICByZWFkb25seSByZW5kZXJOYXZpZ2F0aW9uID0gc2lnbmFsKGZhbHNlKTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAncmVuZGVyTWFza3MnIH0pXG4gIHNldCBfcmVuZGVyTWFza3ModjogYm9vbGVhbikge1xuICAgIHRoaXMucmVuZGVyTWFza3Muc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IHJlbmRlck1hc2tzID0gc2lnbmFsKHRydWUpO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICdyZW5kZXJCdXR0b25zJyB9KVxuICBzZXQgX3JlbmRlckJ1dHRvbnModjogYm9vbGVhbikge1xuICAgIHRoaXMucmVuZGVyQnV0dG9ucy5zZXQodik7XG4gIH1cbiAgcmVhZG9ubHkgcmVuZGVyQnV0dG9ucyA9IHNpZ25hbCh0cnVlKTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAncmVuZGVyU2Nyb2xsYmFycycgfSlcbiAgc2V0IF9yZW5kZXJTY3JvbGxiYXJzKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJlbmRlclNjcm9sbGJhcnMuc2V0KHYpO1xuICB9XG4gIHJlYWRvbmx5IHJlbmRlclNjcm9sbGJhcnMgPSBzaWduYWwoZmFsc2UpO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICdzdGlja3lCdXR0b25zJyB9KVxuICBzZXQgX3N0aWNreUJ1dHRvbnModjogYm9vbGVhbikge1xuICAgIHRoaXMuc3RpY2t5QnV0dG9ucy5zZXQodik7XG4gIH1cbiAgcmVhZG9ubHkgc3RpY2t5QnV0dG9ucyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLCBhbGlhczogJ2N1cnNvckRyYWdTY3JvbGwnIH0pXG4gIHNldCBfY3Vyc29yRHJhZ1Njcm9sbCh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5jdXJzb3JEcmFnU2Nyb2xsLnNldCh2KTtcbiAgfVxuICByZWFkb25seSBjdXJzb3JEcmFnU2Nyb2xsID0gc2lnbmFsKHRydWUpO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICdkaXNhYmxlQWN0aXZlRWxlbWVudFNjcm9sbGluZycgfSlcbiAgc2V0IF9kaXNhYmxlQWN0aXZlRWxlbWVudFNjcm9sbGluZyh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlQWN0aXZlRWxlbWVudFNjcm9sbGluZy5zZXQodik7XG4gIH1cbiAgcmVhZG9ubHkgZGlzYWJsZUFjdGl2ZUVsZW1lbnRTY3JvbGxpbmcgPSBzaWduYWwoZmFsc2UpO1xuXG4gIEBJbnB1dCh7IGFsaWFzOiAnc2Nyb2xsTW9kZScgfSlcbiAgc2V0IF9zY3JvbGxNb2RlKHY6IFNjcm9sbGFibGVTY3JvbGxNb2RlKSB7XG4gICAgdGhpcy5zY3JvbGxNb2RlLnNldCh2KTtcbiAgfVxuICByZWFkb25seSBzY3JvbGxNb2RlID0gc2lnbmFsPFNjcm9sbGFibGVTY3JvbGxNb2RlPignY29udGFpbmVyJyk7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLCBhbGlhczogJ3NuYXAnIH0pXG4gIHNldCBfc25hcCh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5zbmFwLnNldCh2KTtcbiAgfVxuICByZWFkb25seSBzbmFwID0gc2lnbmFsKGZhbHNlKTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSwgYWxpYXM6ICdzY3JvbGxNYXJnaW4nIH0pXG4gIHNldCBfc2Nyb2xsTWFyZ2luKHY6IG51bWJlcikge1xuICAgIHRoaXMuc2Nyb2xsTWFyZ2luLnNldCh2KTtcbiAgfVxuICByZWFkb25seSBzY3JvbGxNYXJnaW4gPSBzaWduYWwoMCk7XG5cbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IHNjcm9sbFN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTY3JvbGxPYnNlcnZlclNjcm9sbFN0YXRlPigpO1xuXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBpbnRlcnNlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNjcm9sbGFibGVJbnRlcnNlY3Rpb25DaGFuZ2VbXT4oKTtcblxuICBAVmlld0NoaWxkKCdzY3JvbGxhYmxlJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBzZXQgX3Njcm9sbGFibGUoZTogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHtcbiAgICB0aGlzLnNjcm9sbGFibGUuc2V0KGUpO1xuICB9XG4gIHJlYWRvbmx5IHNjcm9sbGFibGUgPSBzaWduYWw8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBudWxsPihudWxsKTtcblxuICBAVmlld0NoaWxkKCdzY3JvbGxhYmxlQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBzZXQgX3Njcm9sbGFibGVDb250YWluZXIoZTogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHtcbiAgICB0aGlzLnNjcm9sbGFibGVDb250YWluZXIuc2V0KGUpO1xuICB9XG4gIHJlYWRvbmx5IHNjcm9sbGFibGVDb250YWluZXIgPSBzaWduYWw8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBudWxsPihudWxsKTtcblxuICBAVmlld0NoaWxkKCdmaXJzdEVsZW1lbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIHNldCBfZmlyc3RFbGVtZW50KGU6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7XG4gICAgdGhpcy5maXJzdEVsZW1lbnQuc2V0KGUpO1xuICB9XG4gIHJlYWRvbmx5IGZpcnN0RWxlbWVudCA9IHNpZ25hbDxFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IG51bGw+KG51bGwpO1xuXG4gIEBWaWV3Q2hpbGQoJ2xhc3RFbGVtZW50JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBzZXQgX2xhc3RFbGVtZW50KGU6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7XG4gICAgdGhpcy5sYXN0RWxlbWVudC5zZXQoZSk7XG4gIH1cbiAgcmVhZG9ubHkgbGFzdEVsZW1lbnQgPSBzaWduYWw8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBudWxsPihudWxsKTtcblxuICBAQ29udGVudENoaWxkcmVuKFNDUk9MTEFCTEVfSVNfQUNUSVZFX0NISUxEX1RPS0VOLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHByaXZhdGUgc2V0IF9hY3RpdmVFbGVtZW50TGlzdChlOiBUeXBlZFF1ZXJ5TGlzdDxTY3JvbGxhYmxlSXNBY3RpdmVDaGlsZERpcmVjdGl2ZT4pIHtcbiAgICB0aGlzLmFjdGl2ZUVsZW1lbnRMaXN0LnNldChlKTtcbiAgfVxuICByZWFkb25seSBhY3RpdmVFbGVtZW50TGlzdCA9IHNpZ25hbDxUeXBlZFF1ZXJ5TGlzdDxTY3JvbGxhYmxlSXNBY3RpdmVDaGlsZERpcmVjdGl2ZT4gfCBudWxsPihudWxsKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lclNjcm9sbFN0YXRlID0gc2lnbmFsRWxlbWVudFNjcm9sbFN0YXRlKHRoaXMuc2Nyb2xsYWJsZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlyc3RFbGVtZW50SW50ZXJzZWN0aW9uID0gc2lnbmFsRWxlbWVudEludGVyc2VjdGlvbih0aGlzLmZpcnN0RWxlbWVudCwgeyByb290OiB0aGlzLnNjcm9sbGFibGUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlyc3RFbGVtZW50VmlzaWJpbGl0eSA9IHNpZ25hbDxDdXJyZW50RWxlbWVudFZpc2liaWxpdHkgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsYXN0RWxlbWVudEludGVyc2VjdGlvbiA9IHNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb24odGhpcy5sYXN0RWxlbWVudCwgeyByb290OiB0aGlzLnNjcm9sbGFibGUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGFzdEVsZW1lbnRWaXNpYmlsaXR5ID0gc2lnbmFsPEN1cnJlbnRFbGVtZW50VmlzaWJpbGl0eSB8IG51bGw+KG51bGwpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsU2Nyb2xsYWJsZUNoaWxkcmVuID0gc2lnbmFsRWxlbWVudENoaWxkcmVuKHRoaXMuc2Nyb2xsYWJsZUNvbnRhaW5lcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Nyb2xsYWJsZURpbWVuc2lvbnMgPSBzaWduYWxIb3N0RWxlbWVudERpbWVuc2lvbnMoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JvbGxhYmxlQ2hpbGRyZW4gPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuYWxsU2Nyb2xsYWJsZUNoaWxkcmVuKCkuZmlsdGVyKChjKSA9PiAhaXNTY3JvbGxhYmxlQ2hpbGRJZ25vcmVkKGMpKSxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXNhYmxlU25hcHBpbmckID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNjcm9sbGFibGVDb250ZW50SW50ZXJzZWN0aW9ucyA9IHNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb24odGhpcy5zY3JvbGxhYmxlQ2hpbGRyZW4sIHtcbiAgICByb290OiB0aGlzLnNjcm9sbGFibGUsXG4gICAgdGhyZXNob2xkOiBFTEVNRU5UX0lOVEVSU0VDVElPTl9USFJFU0hPTEQsXG4gIH0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2Nyb2xsYWJsZUNvbnRlbnRJbnRlcnNlY3Rpb25zJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLnNjcm9sbGFibGVDb250ZW50SW50ZXJzZWN0aW9ucyk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYW51YWxBY3RpdmVOYXZpZ2F0aW9uSW5kZXggPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjYW5TY3JvbGwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZGlyID0gdGhpcy5kaXJlY3Rpb24oKTtcblxuICAgIGlmIChkaXIgPT09ICdob3Jpem9udGFsJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyU2Nyb2xsU3RhdGUoKS5jYW5TY3JvbGxIb3Jpem9udGFsbHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyU2Nyb2xsU3RhdGUoKS5jYW5TY3JvbGxWZXJ0aWNhbGx5O1xuICB9KTtcblxuICByZWFkb25seSBpc0F0U3RhcnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmNhblNjcm9sbCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcnNlY3Rpb24gPSB0aGlzLmZpcnN0RWxlbWVudEludGVyc2VjdGlvbigpWzBdO1xuXG4gICAgaWYgKCFpbnRlcnNlY3Rpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudFZpc2liaWxpdHkoKT8uaW5saW5lID8/IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyc2VjdGlvbi5pc0ludGVyc2VjdGluZztcbiAgfSk7XG4gIHJlYWRvbmx5IGlzQXRFbmQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmNhblNjcm9sbCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcnNlY3Rpb24gPSB0aGlzLmxhc3RFbGVtZW50SW50ZXJzZWN0aW9uKClbMF07XG5cbiAgICBpZiAoIWludGVyc2VjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMubGFzdEVsZW1lbnRWaXNpYmlsaXR5KCk/LmlubGluZSA/PyB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBpbnRlcnNlY3Rpb24uaXNJbnRlcnNlY3Rpbmc7XG4gIH0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FjdHVhbEl0ZW1TaXplID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICh0aGlzLml0ZW1TaXplKCkgIT09ICdmdWxsJykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBkaW1lbnNpb25zID0gdGhpcy5zY3JvbGxhYmxlRGltZW5zaW9ucygpO1xuXG4gICAgaWYgKHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJykge1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbnMucmVjdD8ud2lkdGggPz8gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbnMucmVjdD8uaGVpZ2h0ID8/IG51bGw7XG4gICAgfVxuICB9KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZU92ZXJsYXlBbmltYXRpb25zID0gc2lnbmFsKGZhbHNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9pbml0aWFsU2Nyb2xsYWJsZU5hdmlnYXRpb24gPSBzaWduYWw8U2Nyb2xsYWJsZU5hdmlnYXRpb25JdGVtW10+KFtdKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2Nyb2xsYWJsZU5hdmlnYXRpb24gPSBjb21wdXRlZDxTY3JvbGxhYmxlTmF2aWdhdGlvbkl0ZW1bXT4oKCkgPT4ge1xuICAgIGNvbnN0IGFsbEludGVyc2VjdGlvbnMgPSB0aGlzLnNjcm9sbGFibGVDb250ZW50SW50ZXJzZWN0aW9ucygpO1xuICAgIGNvbnN0IG1hbnVhbEFjdGl2ZU5hdmlnYXRpb25JbmRleCA9IHRoaXMubWFudWFsQWN0aXZlTmF2aWdhdGlvbkluZGV4KCk7XG4gICAgY29uc3QgaW5pdGlhbFNjcm9sbGFibGVOYXZpZ2F0aW9uID0gdGhpcy5faW5pdGlhbFNjcm9sbGFibGVOYXZpZ2F0aW9uKCk7XG5cbiAgICBpZiAoIWFsbEludGVyc2VjdGlvbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gaW5pdGlhbFNjcm9sbGFibGVOYXZpZ2F0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IGhpZ2hlc3RJbnRlcnNlY3Rpb24gPSBhbGxJbnRlcnNlY3Rpb25zLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgaWYgKHByZXYgJiYgcHJldi5pbnRlcnNlY3Rpb25SYXRpbyA+IGN1cnIuaW50ZXJzZWN0aW9uUmF0aW8pIHtcbiAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyO1xuICAgIH0sIGFsbEludGVyc2VjdGlvbnNbMF0pO1xuXG4gICAgaWYgKCFoaWdoZXN0SW50ZXJzZWN0aW9uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbEludGVyc2VjdGlvbnMubWFwKChpLCBpbmRleCkgPT4gKHtcbiAgICAgIGlzQWN0aXZlOlxuICAgICAgICBtYW51YWxBY3RpdmVOYXZpZ2F0aW9uSW5kZXggIT09IG51bGxcbiAgICAgICAgICA/IG1hbnVhbEFjdGl2ZU5hdmlnYXRpb25JbmRleCA9PT0gaW5kZXhcbiAgICAgICAgICA6IGkgPT09IGhpZ2hlc3RJbnRlcnNlY3Rpb24gJiYgaGlnaGVzdEludGVyc2VjdGlvbi5pbnRlcnNlY3Rpb25SYXRpbyA+IDAsXG4gICAgICBlbGVtZW50OiBpLnRhcmdldCBhcyBIVE1MRWxlbWVudCxcbiAgICB9KSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhvc3RBdHRyaWJ1dGVCaW5kaW5ncyA9IHNpZ25hbEhvc3RBdHRyaWJ1dGVzKHtcbiAgICAnaXRlbS1zaXplJzogdGhpcy5pdGVtU2l6ZSxcbiAgICAnYWN0dWFsLWl0ZW0tc2l6ZSc6IHRoaXMuX2FjdHVhbEl0ZW1TaXplLFxuICAgIGRpcmVjdGlvbjogdGhpcy5kaXJlY3Rpb24sXG4gICAgJ3JlbmRlci1zY3JvbGxiYXJzJzogdGhpcy5yZW5kZXJTY3JvbGxiYXJzLFxuICAgICdzdGlja3ktYnV0dG9ucyc6IHRoaXMuc3RpY2t5QnV0dG9ucyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaG9zdENsYXNzQmluZGluZ3MgPSBzaWduYWxIb3N0Q2xhc3Nlcyh7XG4gICAgJ2V0LXNjcm9sbGFibGUtLWNhbi1zY3JvbGwnOiBjb21wdXRlZCgoKSA9PiB0aGlzLmNhblNjcm9sbCgpICYmICF0aGlzLmlzQXRTdGFydCgpICYmICF0aGlzLmlzQXRFbmQoKSksXG4gICAgJ2V0LXNjcm9sbGFibGUtLWlzLWF0LXN0YXJ0JzogdGhpcy5pc0F0U3RhcnQsXG4gICAgJ2V0LXNjcm9sbGFibGUtLWlzLWF0LWVuZCc6IHRoaXMuaXNBdEVuZCxcbiAgICAnZXQtc2Nyb2xsYWJsZS0tZW5hYmxlLW92ZXJsYXktYW5pbWF0aW9ucyc6IHRoaXMuZW5hYmxlT3ZlcmxheUFuaW1hdGlvbnMsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhvc3RTdHlsZUJpbmRpbmdzID0gc2lnbmFsSG9zdFN0eWxlcyh7XG4gICAgJy0tYWN0dWFsLWl0ZW0tc2l6ZSc6IGNvbXB1dGVkKCgpID0+ICh0aGlzLl9hY3R1YWxJdGVtU2l6ZSgpICE9PSBudWxsID8gYCR7dGhpcy5fYWN0dWFsSXRlbVNpemUoKX1weGAgOiB1bmRlZmluZWQpKSxcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBzY3JvbGxhYmxlID0gdGhpcy5zY3JvbGxhYmxlKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRoaXMuZmlyc3RFbGVtZW50KCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gdGhpcy5sYXN0RWxlbWVudCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50TGlzdCA9IHRoaXMuYWN0aXZlRWxlbWVudExpc3QoKT8udG9BcnJheSgpO1xuXG4gICAgICAgIGlmICghc2Nyb2xsYWJsZSB8fCAhZmlyc3RFbGVtZW50IHx8ICFsYXN0RWxlbWVudCB8fCAhYWN0aXZlRWxlbWVudExpc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEFjdGl2ZSA9IGFjdGl2ZUVsZW1lbnRMaXN0LmZpbmQoKGEpID0+IGEuaXNBY3RpdmVDaGlsZEVuYWJsZWQoKSk7XG5cbiAgICAgICAgaWYgKGZpcnN0QWN0aXZlICYmICF0aGlzLmRpc2FibGVBY3RpdmVFbGVtZW50U2Nyb2xsaW5nKCkpIHtcbiAgICAgICAgICBjb25zdCBvZmZzZXRUb3AgPSBmaXJzdEFjdGl2ZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wIC0gc2Nyb2xsYWJsZS5vZmZzZXRUb3A7XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0TGVmdCA9IGZpcnN0QWN0aXZlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0IC0gc2Nyb2xsYWJsZS5vZmZzZXRMZWZ0O1xuICAgICAgICAgIHNjcm9sbGFibGUuc2Nyb2xsTGVmdCA9IG9mZnNldExlZnQgLSB0aGlzLnNjcm9sbE1hcmdpbigpO1xuICAgICAgICAgIHNjcm9sbGFibGUuc2Nyb2xsVG9wID0gb2Zmc2V0VG9wIC0gdGhpcy5zY3JvbGxNYXJnaW4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyc3RFbGVtZW50VmlzaWJpbGl0eS5zZXQoXG4gICAgICAgICAgaXNFbGVtZW50VmlzaWJsZSh7XG4gICAgICAgICAgICBjb250YWluZXI6IHNjcm9sbGFibGUsXG4gICAgICAgICAgICBlbGVtZW50OiBmaXJzdEVsZW1lbnQsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5sYXN0RWxlbWVudFZpc2liaWxpdHkuc2V0KFxuICAgICAgICAgIGlzRWxlbWVudFZpc2libGUoe1xuICAgICAgICAgICAgY29udGFpbmVyOiBzY3JvbGxhYmxlLFxuICAgICAgICAgICAgZWxlbWVudDogbGFzdEVsZW1lbnQsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB3YWl0IG9uZSBmcmFtZSBiZWZvcmUgZW5hYmxpbmcgYW5pbWF0aW9ucyB0byBwcmV2ZW50IGEgYW5pbWF0aW9uIGZyb20gcGxheWluZyBkdXJpbmcgaW5pdGlhbCByZW5kZXIuXG4gICAgICAgIG5leHRGcmFtZSgoKSA9PiB0aGlzLmVuYWJsZU92ZXJsYXlBbmltYXRpb25zLnNldCh0cnVlKSk7XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICAgICk7XG5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRMaXN0ID0gdGhpcy5zY3JvbGxhYmxlQ2hpbGRyZW4oKTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZSA9IHRoaXMuc2Nyb2xsYWJsZSgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCByZW5kZXJOYXZpZ2F0aW9uID0gdGhpcy5yZW5kZXJOYXZpZ2F0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFlbGVtZW50TGlzdCB8fCAhc2Nyb2xsYWJsZSB8fCAhcmVuZGVyTmF2aWdhdGlvbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUVsZW1lbnQgPSBlbGVtZW50TGlzdC5maW5kKChlKSA9PiBpc0VsZW1lbnRWaXNpYmxlKHsgY29udGFpbmVyOiBzY3JvbGxhYmxlLCBlbGVtZW50OiBlIH0pKTtcblxuICAgICAgICBpZiAoIWZpcnN0VmlzaWJsZUVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbml0aWFsTmF2aWdhdGlvbkl0ZW1zOiBTY3JvbGxhYmxlTmF2aWdhdGlvbkl0ZW1bXSA9IGVsZW1lbnRMaXN0Lm1hcCgoZSkgPT4gKHtcbiAgICAgICAgICBpc0FjdGl2ZTogZSA9PT0gZmlyc3RWaXNpYmxlRWxlbWVudCxcbiAgICAgICAgICBlbGVtZW50OiBlLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgdGhpcy5faW5pdGlhbFNjcm9sbGFibGVOYXZpZ2F0aW9uLnNldChpbml0aWFsTmF2aWdhdGlvbkl0ZW1zKTtcbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICAgKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBpc0F0U3RhcnQgPSB0aGlzLmlzQXRTdGFydCgpO1xuICAgICAgY29uc3QgaXNBdEVuZCA9IHRoaXMuaXNBdEVuZCgpO1xuICAgICAgY29uc3QgY2FuU2Nyb2xsID0gdGhpcy5jYW5TY3JvbGwoKTtcblxuICAgICAgdGhpcy5zY3JvbGxTdGF0ZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgY2FuU2Nyb2xsLFxuICAgICAgICBpc0F0RW5kOiAhIWlzQXRFbmQsXG4gICAgICAgIGlzQXRTdGFydDogISFpc0F0U3RhcnQsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBlbmFibGVTbmFwcGluZyA9IHRoaXMuc25hcCgpO1xuXG4gICAgICBpZiAoZW5hYmxlU25hcHBpbmcpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlU25hcHBpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVTbmFwcGluZygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zY3JvbGxhYmxlQ29udGVudEludGVyc2VjdGlvbnMkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICAgIGRlYm91bmNlVGltZSgxMCksXG4gICAgICAgIHRhcCgoZW50cmllcykgPT4ge1xuICAgICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uQ2hhbmdlLmVtaXQoXG4gICAgICAgICAgICBlbnRyaWVzLm1hcCgoaSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICBlbGVtZW50OiBpLnRhcmdldCBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uUmF0aW86IGkuaW50ZXJzZWN0aW9uUmF0aW8sXG4gICAgICAgICAgICAgIGlzSW50ZXJzZWN0aW5nOiBpLmlzSW50ZXJzZWN0aW5nLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgc2Nyb2xsT25lQ29udGFpbmVyU2l6ZShkaXJlY3Rpb246ICdzdGFydCcgfCAnZW5kJykge1xuICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSB0aGlzLnNjcm9sbGFibGUoKT8ubmF0aXZlRWxlbWVudDtcblxuICAgIGlmICghc2Nyb2xsRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgIGNvbnN0IGlzU25hcHBpbmdFbmFibGVkID0gdGhpcy5zbmFwKCk7XG5cbiAgICBpZiAoaXNTbmFwcGluZ0VuYWJsZWQpIHtcbiAgICAgIC8vIElmIHNuYXBwaW5nIGlzIGVuYWJsZWQgd2Ugd2FudCB0byBzY3JvbGwgdG8gYSBwb3NpdGlvbiB3aGVyZSBubyBmdXJ0aGVyIHNuYXBwaW5nIHdpbGwgaGFwcGVuIGFmdGVyIHRoZSBzY3JvbGwuXG4gICAgICBjb25zdCBhbGxJbnRlcnNlY3Rpb25zID0gdGhpcy5zY3JvbGxhYmxlQ29udGVudEludGVyc2VjdGlvbnMoKTtcbiAgICAgIGNvbnN0IGludGVyc2VjdGlvbnMgPSBnZXRGaXJzdEFuZExhc3RQYXJ0aWFsSW50ZXJzZWN0aW9uKGFsbEludGVyc2VjdGlvbnMpO1xuICAgICAgY29uc3QgcmVsZXZhbnRJbnRlcnNlY3Rpb24gPSBkaXJlY3Rpb24gPT09ICdzdGFydCcgPyBpbnRlcnNlY3Rpb25zPy5maXJzdCA6IGludGVyc2VjdGlvbnM/Lmxhc3Q7XG5cbiAgICAgIGlmICghcmVsZXZhbnRJbnRlcnNlY3Rpb24pIHJldHVybjtcblxuICAgICAgY29uc3QgbmV4dEluZGV4ID1cbiAgICAgICAgcmVsZXZhbnRJbnRlcnNlY3Rpb24uaW50ZXJzZWN0aW9uLmludGVyc2VjdGlvblJhdGlvICE9PSAxXG4gICAgICAgICAgPyByZWxldmFudEludGVyc2VjdGlvbi5pbmRleFxuICAgICAgICAgIDogZGlyZWN0aW9uID09PSAnc3RhcnQnXG4gICAgICAgICAgICA/IHJlbGV2YW50SW50ZXJzZWN0aW9uLmluZGV4IC0gMVxuICAgICAgICAgICAgOiByZWxldmFudEludGVyc2VjdGlvbi5pbmRleCArIDE7XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPVxuICAgICAgICAoYWxsSW50ZXJzZWN0aW9uc1tuZXh0SW5kZXhdPy50YXJnZXQgYXMgSFRNTEVsZW1lbnQpIHx8XG4gICAgICAgIChyZWxldmFudEludGVyc2VjdGlvbi5pbnRlcnNlY3Rpb24udGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcblxuICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBvcmlnaW46IGRpcmVjdGlvbiA9PT0gJ2VuZCcgPyAnc3RhcnQnIDogJ2VuZCcsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSnVzdCBzY3JvbGwgb25lIHNpemUgb2YgdGhlIHNjcm9sbGFibGUgY29udGFpbmVyLlxuICAgICAgY29uc3Qgc2Nyb2xsYWJsZVNpemUgPSB0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCcgPyBwYXJlbnQuY2xpZW50V2lkdGggOiBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgY3VycmVudFNjcm9sbCA9IHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyA/IHNjcm9sbEVsZW1lbnQuc2Nyb2xsTGVmdCA6IHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wO1xuXG4gICAgICBzY3JvbGxFbGVtZW50LnNjcm9sbFRvKHtcbiAgICAgICAgW3RoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyA/ICdsZWZ0JyA6ICd0b3AnXTpcbiAgICAgICAgICBjdXJyZW50U2Nyb2xsICsgKGRpcmVjdGlvbiA9PT0gJ3N0YXJ0JyA/IC1zY3JvbGxhYmxlU2l6ZSA6IHNjcm9sbGFibGVTaXplKSxcbiAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsT25lSXRlbVNpemUoZGlyZWN0aW9uOiAnc3RhcnQnIHwgJ2VuZCcpIHtcbiAgICBjb25zdCBhbGxJbnRlcnNlY3Rpb25zID0gdGhpcy5zY3JvbGxhYmxlQ29udGVudEludGVyc2VjdGlvbnMoKTtcbiAgICBjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5zY3JvbGxhYmxlKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoIWFsbEludGVyc2VjdGlvbnMubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdObyBlbGVtZW50cyBmb3VuZCB0byBzY3JvbGwgdG8uIE1ha2Ugc3VyZSB0byBhcHBseSB0aGUgaXNFbGVtZW50IGRpcmVjdGl2ZSB0byB0aGUgZWxlbWVudHMgeW91IHdhbnQgdG8gc2Nyb2xsIHRvLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW50ZXJzZWN0aW9ucyA9IGdldEZpcnN0QW5kTGFzdFBhcnRpYWxJbnRlcnNlY3Rpb24oYWxsSW50ZXJzZWN0aW9ucyk7XG5cbiAgICBpZiAoIWludGVyc2VjdGlvbnMgfHwgIXNjcm9sbEVsZW1lbnQpIHJldHVybjtcblxuICAgIC8vIE1lYW5zIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgYmlnZ2VyIHRoYW4gdGhlIHNjcm9sbGFibGUgY29udGFpbmVyLlxuICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBzaG91bGQgc2Nyb2xsIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBlbGVtZW50LiBJZiB3ZSBhcmUgYWxyZWFkeSB0aGVyZSB3ZSBzaG91bGQgc2Nyb2xsIHRvIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIGVsZW1lbnQuXG4gICAgLy8gVGhpcyBhcHBsaWVzIHRvIHRoZSBvdGhlciBkaXJlY3Rpb24gYXMgd2VsbC5cbiAgICBjb25zdCBpc0ZpcnN0QW5kTGFzdEludGVyc2VjdGlvbkVxdWFsID0gaW50ZXJzZWN0aW9ucy5maXJzdC5pbnRlcnNlY3Rpb24gPT09IGludGVyc2VjdGlvbnMubGFzdC5pbnRlcnNlY3Rpb247XG4gICAgY29uc3Qgc2Nyb2xsYWJsZVJlY3QgPSBzY3JvbGxFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgaWYgKGlzRmlyc3RBbmRMYXN0SW50ZXJzZWN0aW9uRXF1YWwpIHtcbiAgICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IGludGVyc2VjdGlvbnMuZmlyc3QuaW50ZXJzZWN0aW9uLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGlzU3RhcnRPZkVsZW1lbnRWaXNpYmxlID1cbiAgICAgICAgdGhpcy5kaXJlY3Rpb24oKSA9PT0gJ2hvcml6b250YWwnXG4gICAgICAgICAgPyBNYXRoLnJvdW5kKGludGVyc2VjdGlvbi5sZWZ0KSA+PSBNYXRoLnJvdW5kKHNjcm9sbGFibGVSZWN0LmxlZnQpXG4gICAgICAgICAgOiBNYXRoLnJvdW5kKGludGVyc2VjdGlvbi50b3ApID49IE1hdGgucm91bmQoc2Nyb2xsYWJsZVJlY3QudG9wKTtcblxuICAgICAgY29uc3QgaXNFbmRPZkVsZW1lbnRWaXNpYmxlID1cbiAgICAgICAgdGhpcy5kaXJlY3Rpb24oKSA9PT0gJ2hvcml6b250YWwnXG4gICAgICAgICAgPyBNYXRoLnJvdW5kKGludGVyc2VjdGlvbi5yaWdodCkgPD0gTWF0aC5yb3VuZChzY3JvbGxhYmxlUmVjdC5yaWdodClcbiAgICAgICAgICA6IE1hdGgucm91bmQoaW50ZXJzZWN0aW9uLmJvdHRvbSkgPD0gTWF0aC5yb3VuZChzY3JvbGxhYmxlUmVjdC5ib3R0b20pO1xuXG4gICAgICBpZiAoIWlzU3RhcnRPZkVsZW1lbnRWaXNpYmxlIHx8ICFpc0VuZE9mRWxlbWVudFZpc2libGUpIHtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICAgIGlmIChpc1N0YXJ0T2ZFbGVtZW50VmlzaWJsZSkge1xuICAgICAgICAgICAgLy8gdG8gdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJbmRleCA9IGludGVyc2VjdGlvbnMuZmlyc3QuaW5kZXggLSAxO1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudFRvU2Nyb2xsVG8gPSBhbGxJbnRlcnNlY3Rpb25zW3ByZXZpb3VzSW5kZXhdPy50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmICghZWxlbWVudFRvU2Nyb2xsVG8pIHJldHVybjtcblxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50VG9TY3JvbGxUbyxcbiAgICAgICAgICAgICAgb3JpZ2luOiAnZW5kJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZWxlbWVudFxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgICAgICAgICBlbGVtZW50OiBpbnRlcnNlY3Rpb25zLmZpcnN0LmludGVyc2VjdGlvbi50YXJnZXQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgIG9yaWdpbjogJ3N0YXJ0JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXNFbmRPZkVsZW1lbnRWaXNpYmxlKSB7XG4gICAgICAgICAgICAvLyB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gaW50ZXJzZWN0aW9ucy5sYXN0LmluZGV4ICsgMTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRUb1Njcm9sbFRvID0gYWxsSW50ZXJzZWN0aW9uc1tuZXh0SW5kZXhdPy50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmICghZWxlbWVudFRvU2Nyb2xsVG8pIHJldHVybjtcblxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50VG9TY3JvbGxUbyxcbiAgICAgICAgICAgICAgb3JpZ2luOiAnc3RhcnQnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZWxlbWVudFxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgICAgICAgICBlbGVtZW50OiBpbnRlcnNlY3Rpb25zLmxhc3QuaW50ZXJzZWN0aW9uLnRhcmdldCBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgb3JpZ2luOiAnZW5kJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gZGlyZWN0aW9uID09PSAnc3RhcnQnID8gaW50ZXJzZWN0aW9ucy5maXJzdCA6IGludGVyc2VjdGlvbnMubGFzdDtcbiAgICBsZXQgZWxlbWVudFRvU2Nyb2xsVG8gPSBkYXRhLmludGVyc2VjdGlvbi50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoTWF0aC5yb3VuZChkYXRhLmludGVyc2VjdGlvbi5pbnRlcnNlY3Rpb25SYXRpbykgPT09IDEpIHtcbiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdzdGFydCcgJiYgZGF0YS5pbmRleCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdlbmQnICYmIGRhdGEuaW5kZXggPT09IGFsbEludGVyc2VjdGlvbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRJbmRleCA9IGRpcmVjdGlvbiA9PT0gJ3N0YXJ0JyA/IGRhdGEuaW5kZXggLSAxIDogZGF0YS5pbmRleCArIDE7XG5cbiAgICAgIGVsZW1lbnRUb1Njcm9sbFRvID0gYWxsSW50ZXJzZWN0aW9uc1tuZXh0SW5kZXhdPy50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50VG9TY3JvbGxUbykgcmV0dXJuO1xuXG4gICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgZWxlbWVudDogZWxlbWVudFRvU2Nyb2xsVG8sXG4gICAgICBvcmlnaW46IGRpcmVjdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIHNjcm9sbFRvRWxlbWVudChvcHRpb25zOiBPbWl0PFNjcm9sbFRvRWxlbWVudE9wdGlvbnMsICdjb250YWluZXInPikge1xuICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSB0aGlzLnNjcm9sbGFibGUoKT8ubmF0aXZlRWxlbWVudDtcblxuICAgIHNjcm9sbFRvRWxlbWVudCh7XG4gICAgICBjb250YWluZXI6IHNjcm9sbEVsZW1lbnQsXG4gICAgICBkaXJlY3Rpb246IHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyA/ICdpbmxpbmUnIDogJ2Jsb2NrJyxcbiAgICAgIC4uLih0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgPyB7IHNjcm9sbElubGluZU1hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4oKSB9XG4gICAgICAgIDogeyBzY3JvbGxCbG9ja01hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4oKSB9KSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBzY3JvbGxUb0VsZW1lbnRCeUluZGV4KG9wdGlvbnM6IE9taXQ8U2Nyb2xsVG9FbGVtZW50T3B0aW9ucywgJ2NvbnRhaW5lcic+ICYgeyBpbmRleDogbnVtYmVyIH0pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2Nyb2xsYWJsZUNoaWxkcmVuKCk7XG5cbiAgICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnTm8gZWxlbWVudHMgZm91bmQgdG8gc2Nyb2xsIHRvLiBNYWtlIHN1cmUgdG8gYXBwbHkgdGhlIGlzRWxlbWVudCBkaXJlY3RpdmUgdG8gdGhlIGVsZW1lbnRzIHlvdSB3YW50IHRvIHNjcm9sbCB0by4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSB0aGlzLnNjcm9sbGFibGUoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbb3B0aW9ucy5pbmRleF07XG5cbiAgICBzY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgY29udGFpbmVyOiBzY3JvbGxFbGVtZW50LFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLih0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgPyB7IHNjcm9sbElubGluZU1hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4oKSB9XG4gICAgICAgIDogeyBzY3JvbGxCbG9ja01hcmdpbjogdGhpcy5zY3JvbGxNYXJnaW4oKSB9KSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9FbGVtZW50VmlhTmF2aWdhdGlvbihlbGVtZW50SW5kZXg6IG51bWJlciwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLm1hbnVhbEFjdGl2ZU5hdmlnYXRpb25JbmRleC5zZXQoZWxlbWVudEluZGV4KTtcblxuICAgIHRoaXMuc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgIGVsZW1lbnQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5zY3JvbGxhYmxlKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoIXNjcm9sbEVsZW1lbnQpIHJldHVybjtcblxuICAgIGZyb21FdmVudChzY3JvbGxFbGVtZW50LCAnc2Nyb2xsJylcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoNTApLFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5tYW51YWxBY3RpdmVOYXZpZ2F0aW9uSW5kZXguc2V0KG51bGwpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRJc0N1cnNvckRyYWdnaW5nKGlzRHJhZ2dpbmc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0N1cnNvckRyYWdnaW5nJC5uZXh0KGlzRHJhZ2dpbmcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNjcm9sbFRvU3RhcnREaXJlY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsTW9kZSgpID09PSAnY29udGFpbmVyJykge1xuICAgICAgdGhpcy5zY3JvbGxPbmVDb250YWluZXJTaXplKCdzdGFydCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbE9uZUl0ZW1TaXplKCdzdGFydCcpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxUb0VuZERpcmVjdGlvbigpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxNb2RlKCkgPT09ICdjb250YWluZXInKSB7XG4gICAgICB0aGlzLnNjcm9sbE9uZUNvbnRhaW5lclNpemUoJ2VuZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbE9uZUl0ZW1TaXplKCdlbmQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9lbmFibGVTbmFwcGluZygpIHtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnNjcm9sbGFibGVDb250ZW50SW50ZXJzZWN0aW9ucyQsIHRoaXMuX2lzQ3Vyc29yRHJhZ2dpbmckXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKFssIGlzRHJhZ2dpbmddKSA9PiAhaXNEcmFnZ2luZyksXG4gICAgICAgIG1hcCgoW2ludGVyc2VjdGlvbnNdKSA9PiBpbnRlcnNlY3Rpb25zKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDE1MCksXG4gICAgICAgIHRhcCgoYWxsSW50ZXJzZWN0aW9ucykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSB0aGlzLnNjcm9sbGFibGUoKT8ubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAgIGlmICghc2Nyb2xsRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgaW50ZXJzZWN0aW9ucyA9IGdldEZpcnN0QW5kTGFzdFBhcnRpYWxJbnRlcnNlY3Rpb24oYWxsSW50ZXJzZWN0aW9ucyk7XG5cbiAgICAgICAgICBpZiAoIWludGVyc2VjdGlvbnMpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGlzRmlyc3RBbmRMYXN0SW50ZXJzZWN0aW9uRXF1YWwgPSBpbnRlcnNlY3Rpb25zLmZpcnN0LmludGVyc2VjdGlvbiA9PT0gaW50ZXJzZWN0aW9ucy5sYXN0LmludGVyc2VjdGlvbjtcbiAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlUmVjdCA9IHNjcm9sbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICBpZiAoaXNGaXJzdEFuZExhc3RJbnRlcnNlY3Rpb25FcXVhbCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0aW9ucy5maXJzdC5pbnRlcnNlY3Rpb24udGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgaXNTdGFydE9mRWxlbWVudFZpc2libGUgPVxuICAgICAgICAgICAgICB0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgICAgICAgICA/IGludGVyc2VjdGlvbi5sZWZ0ID49IHNjcm9sbGFibGVSZWN0LmxlZnRcbiAgICAgICAgICAgICAgICA6IGludGVyc2VjdGlvbi50b3AgPj0gc2Nyb2xsYWJsZVJlY3QudG9wO1xuXG4gICAgICAgICAgICBjb25zdCBpc0VuZE9mRWxlbWVudFZpc2libGUgPVxuICAgICAgICAgICAgICB0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgICAgICAgICA/IGludGVyc2VjdGlvbi5yaWdodCA8PSBzY3JvbGxhYmxlUmVjdC5yaWdodFxuICAgICAgICAgICAgICAgIDogaW50ZXJzZWN0aW9uLmJvdHRvbSA8PSBzY3JvbGxhYmxlUmVjdC5ib3R0b207XG5cbiAgICAgICAgICAgIC8vIERvbid0IHNuYXAgaWYgbmVpdGhlciB0aGUgc3RhcnQgbm9yIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyB2aXNpYmxlLlxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRoaXMgd291bGQgcmVzdWx0IGluIHBhcnRzIG9mIHRoZSBlbGVtZW50IGJlaW5nIGluYWNjZXNzaWJsZS5cbiAgICAgICAgICAgIGlmICghaXNTdGFydE9mRWxlbWVudFZpc2libGUgJiYgIWlzRW5kT2ZFbGVtZW50VmlzaWJsZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgc3RhcnQgb2YgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSB3ZSBzaG91bGQgc25hcCB0byB0aGUgc3RhcnQuXG4gICAgICAgICAgICBpZiAoaXNTdGFydE9mRWxlbWVudFZpc2libGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGludGVyc2VjdGlvbnMuZmlyc3QuaW50ZXJzZWN0aW9uLnRhcmdldCBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICBvcmlnaW46ICdzdGFydCcsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSB3ZSBzaG91bGQgc25hcCB0byB0aGUgZW5kLlxuICAgICAgICAgICAgaWYgKGlzRW5kT2ZFbGVtZW50VmlzaWJsZSkge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvRWxlbWVudCh7XG4gICAgICAgICAgICAgICAgZWxlbWVudDogaW50ZXJzZWN0aW9ucy5sYXN0LmludGVyc2VjdGlvbi50YXJnZXQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgb3JpZ2luOiAnZW5kJyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgKHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyAmJlxuICAgICAgICAgICAgICBpbnRlcnNlY3Rpb25zLmJpZ2dlc3QuaW50ZXJzZWN0aW9uLmJvdW5kaW5nQ2xpZW50UmVjdC53aWR0aCA+IHNjcm9sbGFibGVSZWN0LndpZHRoKSB8fFxuICAgICAgICAgICAgKHRoaXMuZGlyZWN0aW9uKCkgPT09ICd2ZXJ0aWNhbCcgJiZcbiAgICAgICAgICAgICAgaW50ZXJzZWN0aW9ucy5iaWdnZXN0LmludGVyc2VjdGlvbi5ib3VuZGluZ0NsaWVudFJlY3QuaGVpZ2h0ID4gc2Nyb2xsYWJsZVJlY3QuaGVpZ2h0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBiaWdnZXIgdGhhbiB0aGUgc2Nyb2xsYWJsZSBjb250YWluZXIgd2Ugc2hvdWxkIHNuYXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgaWYgdGhlIHNjcm9sbCBkaXJlY3Rpb24gaXMgZm9yd2FyZFxuICAgICAgICAgICAgLy8gYW5kIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCBpZiB0aGUgc2Nyb2xsIGRpcmVjdGlvbiBpcyBiYWNrd2FyZHMuXG4gICAgICAgICAgICBjb25zdCBvcmlnaW4gPSBpbnRlcnNlY3Rpb25zLmJpZ2dlc3QuaW5kZXggPT09IGludGVyc2VjdGlvbnMuZmlyc3QuaW5kZXggPyAnZW5kJyA6ICdzdGFydCc7XG5cbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgICAgICAgICAgZWxlbWVudDogaW50ZXJzZWN0aW9ucy5iaWdnZXN0LmludGVyc2VjdGlvbi50YXJnZXQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBObyBzcGVjaWFsIGNhc2UuIEp1c3Qgc25hcCB0byB0aGUgYmlnZ2VzdCBpbnRlcnNlY3Rpb24uXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvRWxlbWVudCh7XG4gICAgICAgICAgICAgIGVsZW1lbnQ6IGludGVyc2VjdGlvbnMuYmlnZ2VzdC5pbnRlcnNlY3Rpb24udGFyZ2V0IGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rpc2FibGVTbmFwcGluZyQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZVNuYXBwaW5nKCkge1xuICAgIHRoaXMuX2Rpc2FibGVTbmFwcGluZyQubmV4dCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS13cmFwcGVyXCI+XG4gIDxkaXZcbiAgICAjc2Nyb2xsYWJsZVxuICAgIFthdHRyLnJvbGVdPVwic2Nyb2xsYWJsZVJvbGUoKSA/PyB1bmRlZmluZWRcIlxuICAgIFtldEN1cnNvckRyYWdTY3JvbGxdPVwiY3Vyc29yRHJhZ1Njcm9sbCgpICYmICghaXNBdFN0YXJ0KCkgfHwgIWlzQXRFbmQoKSlcIlxuICAgIFthbGxvd2VkRGlyZWN0aW9uXT1cImRpcmVjdGlvbigpXCJcbiAgICAoY3Vyc29yRHJhZ1N0YXJ0KT1cInNldElzQ3Vyc29yRHJhZ2dpbmcodHJ1ZSlcIlxuICAgIChjdXJzb3JEcmFnRW5kKT1cInNldElzQ3Vyc29yRHJhZ2dpbmcoZmFsc2UpXCJcbiAgICBjbGFzcz1cImV0LXNjcm9sbGFibGUtY29udGFpbmVyLW91dGVyXCJcbiAgPlxuICAgIDxkaXYgI3Njcm9sbGFibGVDb250YWluZXIgW25nQ2xhc3NdPVwic2Nyb2xsYWJsZUNsYXNzKClcIiBjbGFzcz1cImV0LXNjcm9sbGFibGUtY29udGFpbmVyXCI+XG4gICAgICA8ZGl2ICNmaXJzdEVsZW1lbnQgY2xhc3M9XCJldC1zY3JvbGwtb2JzZXJ2ZXItZmlyc3QtZWxlbWVudFwiIGV0U2Nyb2xsYWJsZUlnbm9yZUNoaWxkPjwvZGl2PlxuICAgICAgPG5nLWNvbnRlbnQgLz5cbiAgICAgIDxkaXYgI2xhc3RFbGVtZW50IGNsYXNzPVwiZXQtc2Nyb2xsLW9ic2VydmVyLWxhc3QtZWxlbWVudFwiIGV0U2Nyb2xsYWJsZUlnbm9yZUNoaWxkPjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICBAaWYgKHJlbmRlck1hc2tzKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1tYXNrc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImV0LXNjcm9sbGFibGUtbWFzayBldC1zY3JvbGxhYmxlLW1hc2stLXN0YXJ0XCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1tYXNrIGV0LXNjcm9sbGFibGUtbWFzay0tZW5kXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cblxuICBAaWYgKHJlbmRlckJ1dHRvbnMoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJldC1zY3JvbGxhYmxlLWJ1dHRvbnNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKGNsaWNrKT1cInNjcm9sbFRvU3RhcnREaXJlY3Rpb24oKVwiXG4gICAgICAgIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1idXR0b24gZXQtc2Nyb2xsYWJsZS1idXR0b24tLXN0YXJ0XCJcbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgPlxuICAgICAgICA8ZXQtY2hldnJvbi1pY29uIC8+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKGNsaWNrKT1cInNjcm9sbFRvRW5kRGlyZWN0aW9uKClcIlxuICAgICAgICBjbGFzcz1cImV0LXNjcm9sbGFibGUtYnV0dG9uIGV0LXNjcm9sbGFibGUtYnV0dG9uLS1lbmRcIlxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICA+XG4gICAgICAgIDxldC1jaGV2cm9uLWljb24gLz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cblxuQGlmIChyZW5kZXJOYXZpZ2F0aW9uKCkgJiYgc2Nyb2xsYWJsZU5hdmlnYXRpb24oKS5sZW5ndGggPiAxKSB7XG4gIDxkaXYgY2xhc3M9XCJldC1zY3JvbGxhYmxlLW5hdmlnYXRpb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICBAZm9yIChpdGVtIG9mIHNjcm9sbGFibGVOYXZpZ2F0aW9uKCk7IHRyYWNrIGk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICA8YnV0dG9uXG4gICAgICAgIFtjbGFzcy5ldC1zY3JvbGxhYmxlLW5hdmlnYXRpb24taXRlbS0tYWN0aXZlXT1cIml0ZW0uaXNBY3RpdmVcIlxuICAgICAgICAoY2xpY2spPVwic2Nyb2xsVG9FbGVtZW50VmlhTmF2aWdhdGlvbihpLCBpdGVtLmVsZW1lbnQpXCJcbiAgICAgICAgY2xhc3M9XCJldC1zY3JvbGxhYmxlLW5hdmlnYXRpb24taXRlbVwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgPjwvYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG59XG4iXX0=
528
+ }, template: "<div class=\"et-scrollable-wrapper\">\n <div\n #scrollable\n [attr.role]=\"scrollableRole() ?? undefined\"\n [etCursorDragScroll]=\"cursorDragScroll() && (!isAtStart() || !isAtEnd())\"\n [allowedDirection]=\"direction()\"\n [ngClass]=\"scrollableClass()\"\n (cursorDragStart)=\"setIsCursorDragging(true)\"\n (cursorDragEnd)=\"setIsCursorDragging(false)\"\n class=\"et-scrollable-container\"\n >\n <div #firstElement class=\"et-scroll-observer-first-element\" etScrollableIgnoreChild></div>\n <ng-content />\n <div #lastElement class=\"et-scroll-observer-last-element\" etScrollableIgnoreChild></div>\n </div>\n\n @if (renderMasks()) {\n <div class=\"et-scrollable-masks\">\n <div class=\"et-scrollable-mask et-scrollable-mask--start\"></div>\n <div class=\"et-scrollable-mask et-scrollable-mask--end\"></div>\n </div>\n }\n\n @if (renderButtonsInside()) {\n <div class=\"et-scrollable-buttons\">\n <ng-container *ngTemplateOutlet=\"forwardButtonTpl\" />\n <ng-container *ngTemplateOutlet=\"backwardButtonTpl\" />\n </div>\n }\n</div>\n\n@if (renderButtonsInFooter() || (renderNavigation() && scrollableNavigation().length > 1)) {\n <div\n [ngClass]=\"{\n 'et-scrollable-footer--with-navigation': renderNavigation(),\n 'et-scrollable-footer--with-buttons': renderButtonsInFooter()\n }\"\n class=\"et-scrollable-footer\"\n aria-hidden=\"true\"\n >\n @if (renderButtonsInFooter()) {\n <ng-container *ngTemplateOutlet=\"forwardButtonTpl\" />\n }\n\n @if (renderNavigation()) {\n <div class=\"et-scrollable-progress-bar\">\n <div #navigationDotsContainer class=\"et-scrollable-dots-container\">\n @for (item of scrollableNavigation(); track i; let i = $index) {\n <button\n #navigationDot\n [class.et-scrollable-navigation-item--active]=\"item.isActive\"\n [class.et-scrollable-navigation-item--close]=\"\n scrollableNavigation()[i + 1]?.isActive || scrollableNavigation()[i - 1]?.isActive\n \"\n [class.et-scrollable-navigation-item--far]=\"\n !scrollableNavigation()[i + 1]?.isActive && !scrollableNavigation()[i - 1]?.isActive && !item.isActive\n \"\n [attr.active-offset]=\"item.activeOffset\"\n (click)=\"scrollToElementViaNavigation(i)\"\n class=\"et-scrollable-navigation-item\"\n type=\"button\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n ></button>\n }\n </div>\n </div>\n }\n\n @if (renderButtonsInFooter()) {\n <ng-container *ngTemplateOutlet=\"backwardButtonTpl\" />\n }\n </div>\n}\n\n<ng-template #forwardButtonTpl>\n <button\n [disabled]=\"isAtStart()\"\n (click)=\"scrollToStartDirection()\"\n class=\"et-scrollable-button et-scrollable-button--start\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n</ng-template>\n\n<ng-template #backwardButtonTpl>\n <button\n [disabled]=\"isAtEnd()\"\n (click)=\"scrollToEndDirection()\"\n class=\"et-scrollable-button et-scrollable-button--end\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n >\n <et-chevron-icon />\n </button>\n</ng-template>\n", styles: [".et-scrollable{--mask: #121212 0, transparent 100%;--mask-size: 25px;--_auto-size: min-content;display:block}.et-scrollable .et-scrollable-wrapper{display:grid;position:relative;block-size:100%;inline-size:100%}.et-scrollable[item-size=same]{--_auto-size: 1fr}.et-scrollable[item-size=full]{--_auto-size: 100%}.et-scrollable[render-scrollbars=false] .et-scrollable-container{scrollbar-width:none}.et-scrollable[render-scrollbars=false] .et-scrollable-container::-webkit-scrollbar{display:none}.et-scrollable .et-scrollable-button .et-chevron-icon{display:block}.et-scrollable[direction=horizontal] .et-scrollable-container{grid-template-columns:repeat(var(--item-count),var(--_auto-size));overflow-x:auto;overflow-y:hidden}.et-scrollable[direction=horizontal] .et-scrollable-container :nth-child(2){grid-column:1/1;grid-row:1/1}.et-scrollable[direction=horizontal] .et-scrollable-container :nth-last-child(2){grid-column:var(--item-count)/var(--item-count);grid-row:1/1}.et-scrollable[direction=horizontal] .et-scrollable-mask,.et-scrollable[direction=horizontal] .et-scrollable-button{inline-size:var(--mask-size);block-size:100%}.et-scrollable[direction=horizontal] .et-scrollable-mask--start,.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:0;inset-inline:0 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--end,.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:0;inset-inline:calc(100% - 40px) 0}.et-scrollable[direction=horizontal] .et-scrollable-mask--start{background:linear-gradient(to right,var(--mask))}.et-scrollable[direction=horizontal] .et-scrollable-mask--end{background:linear-gradient(to left,var(--mask));inset-inline:calc(100% - var(--mask-size)) 100%}.et-scrollable[direction=horizontal] .et-scrollable-button--start{inset-block-start:calc(50% - 20px);transform:translate(-10px)}.et-scrollable[direction=horizontal] .et-scrollable-button--start .et-chevron-icon{transform:rotate(-90deg)}.et-scrollable[direction=horizontal] .et-scrollable-button--end{inset-block-start:calc(50% - 20px);transform:translate(10px)}.et-scrollable[direction=horizontal] .et-scrollable-button--end .et-chevron-icon{transform:rotate(90deg)}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element,.et-scrollable[direction=horizontal] .et-scroll-observer-last-element{block-size:100%;inline-size:1px}.et-scrollable[direction=horizontal] .et-scroll-observer-first-element{margin-inline-start:3px;grid-column:1/1;grid-row:1/1}.et-scrollable[direction=horizontal] .et-scroll-observer-last-element{margin-inline-end:3px;grid-column:var(--item-count)/var(--item-count);grid-row:1/1;justify-self:end}.et-scrollable[direction=vertical] .et-scrollable-container{grid-template-rows:repeat(var(--item-count),var(--_auto-size));overflow-x:hidden;overflow-y:auto}.et-scrollable[direction=vertical] .et-scrollable-container :nth-child(2){grid-row:1/1;grid-column:1/1}.et-scrollable[direction=vertical] .et-scrollable-container :nth-last-child(2){grid-row:var(--item-count)/var(--item-count);grid-column:1/1}.et-scrollable[direction=vertical] .et-scrollable-mask,.et-scrollable[direction=vertical] .et-scrollable-button{block-size:var(--mask-size);inline-size:100%}.et-scrollable[direction=vertical] .et-scrollable-mask--start,.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-block-start:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--end,.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-block-end:0;inset-inline-start:0}.et-scrollable[direction=vertical] .et-scrollable-mask--start{background:linear-gradient(to bottom,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-mask--end{background:linear-gradient(to top,var(--mask))}.et-scrollable[direction=vertical] .et-scrollable-button--start{inset-inline-start:calc(50% - 20px);transform:translateY(-10px)}.et-scrollable[direction=vertical] .et-scrollable-button--start .et-chevron-icon{transform:rotate(0)}.et-scrollable[direction=vertical] .et-scrollable-button--end{inset-inline-start:calc(50% - 20px);transform:translateY(10px)}.et-scrollable[direction=vertical] .et-scrollable-button--end .et-chevron-icon{transform:rotate(180deg)}.et-scrollable[direction=vertical] .et-scroll-observer-first-element,.et-scrollable[direction=vertical] .et-scroll-observer-last-element{inline-size:100%;block-size:1px}.et-scrollable[direction=vertical] .et-scroll-observer-first-element{margin-block-start:3px;grid-row:1/1;grid-column:1/1}.et-scrollable[direction=vertical] .et-scroll-observer-last-element{margin-block-end:3px;grid-row:var(--item-count)/var(--item-count);grid-column:1/1;align-self:end}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-masks .et-scrollable-mask--start,.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{opacity:1;transform:translate(0)}.et-scrollable:not(.et-scrollable--is-at-start) .et-scrollable-buttons .et-scrollable-button--start{pointer-events:all}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-masks .et-scrollable-mask--end,.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{opacity:1;transform:translate(0)}.et-scrollable:not(.et-scrollable--is-at-end) .et-scrollable-buttons .et-scrollable-button--end{pointer-events:all}.et-scrollable .et-scroll-observer-first-element,.et-scrollable .et-scroll-observer-last-element{pointer-events:none}.et-scrollable .et-scrollable-container{display:grid;position:relative;grid-row:1/1;grid-column:1/1}.et-scrollable .et-scrollable-masks,.et-scrollable .et-scrollable-buttons{grid-row:1/1;grid-column:1/1;pointer-events:none}.et-scrollable .et-scrollable-masks .et-scrollable-mask,.et-scrollable .et-scrollable-masks .et-scrollable-button,.et-scrollable .et-scrollable-buttons .et-scrollable-mask,.et-scrollable .et-scrollable-buttons .et-scrollable-button{position:absolute;opacity:0}.et-scrollable.et-scrollable--can-animate .et-scrollable-dots-container{transition:transform .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate .et-scrollable-navigation-item:after{transition:background-color .2s linear,transform .2s linear}.et-scrollable.et-scrollable--can-animate.et-scrollable--can-scroll .et-scrollable-mask{transition:opacity .3s var(--ease-5)}.et-scrollable.et-scrollable--can-animate.et-scrollable--can-scroll .et-scrollable-button{transition:opacity .3s var(--ease-5),transform .3s var(--ease-5)}.et-scrollable .et-scrollable-buttons .et-scrollable-button{background:transparent;border:none;padding:12px;inline-size:40px;block-size:40px;border-radius:4px;cursor:pointer}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-chevron-icon{pointer-events:none}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--start{inset-inline:0 0}.et-scrollable .et-scrollable-buttons .et-scrollable-button .et-scrollable-button--end{inset-inline:calc(100% - 40px) 0}.et-scrollable[sticky-buttons=true]{--_sticky-margin: 10%}.et-scrollable[sticky-buttons=true] .et-scrollable-button{position:sticky}.et-scrollable[sticky-buttons=true][direction=horizontal] .et-scrollable-buttons{margin-block:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons{margin-inline:var(--_sticky-margin)}.et-scrollable[sticky-buttons=true][direction=vertical] .et-scrollable-buttons .et-scrollable-button--end{inset-block-start:100%}.et-scrollable .et-scrollable-footer{display:flex;justify-content:center;gap:10px;margin-block-start:10px}.et-scrollable .et-scrollable-navigation-item{display:flex;justify-content:center;align-items:center;border:none;padding:0;inline-size:20px;block-size:20px;border-radius:50%;cursor:pointer;background-color:transparent}.et-scrollable .et-scrollable-navigation-item.et-scrollable-navigation-item--active:after{background-color:#c6c6c6}.et-scrollable .et-scrollable-navigation-item:after{content:\"\";display:block;inline-size:50%;block-size:50%;border-radius:50%;background-color:#4b4b4b;transform:scale(0)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"0\"]:after{transform:scale(1)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"1\"]:after{transform:scale(.75)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"2\"]:after{transform:scale(.6)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"3\"]:after{transform:scale(.5)}.et-scrollable .et-scrollable-navigation-item[active-offset=\"4\"]:after{transform:scale(.4)}.et-scrollable .et-scrollable-progress-bar{overflow:hidden;max-inline-size:100px;display:flex;align-items:center}.et-scrollable .et-scrollable-progress-bar .et-scrollable-dots-container{display:flex;flex-wrap:nowrap}\n"] }]
529
+ }], ctorParameters: () => [] });
530
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nkay9zcmMvbGliL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsYWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsUUFBUSxFQUNSLGVBQWUsRUFDZixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RSxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLFlBQVksRUFFWiwyQkFBMkIsRUFHM0Isc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLGFBQWEsRUFDYixxQkFBcUIsRUFDckIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGVBQWUsRUFDZixPQUFPLEVBQ1AsYUFBYSxFQUNiLFlBQVksRUFDWixN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aUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLHlCQUF5Qjt3QkFDekIsMkJBQTJCO3dCQUMzQixPQUFPO3dCQUNQLFlBQVk7d0JBQ1osb0JBQW9CO3dCQUNwQixnQ0FBZ0M7d0JBQ2hDLDhCQUE4Qjt3QkFDOUIsZ0JBQWdCO3FCQUNqQixRQUNLO3dCQUNKLEtBQUssRUFBRSxlQUFlO3FCQUN2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIGNvbXB1dGVkLFxuICBjb250ZW50Q2hpbGRyZW4sXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgaXNEZXZNb2RlLFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICBDdXJzb3JEcmFnU2Nyb2xsRGlyZWN0aXZlLFxuICBMZXREaXJlY3RpdmUsXG4gIE5nQ2xhc3NUeXBlLFxuICBPYnNlcnZlU2Nyb2xsU3RhdGVEaXJlY3RpdmUsXG4gIFNjcm9sbE9ic2VydmVyU2Nyb2xsU3RhdGUsXG4gIFNjcm9sbFRvRWxlbWVudE9wdGlvbnMsXG4gIGNyZWF0ZUNhbkFuaW1hdGVTaWduYWwsXG4gIGNyZWF0ZUlzUmVuZGVyZWRTaWduYWwsXG4gIGdldEludGVyc2VjdGlvbkluZm8sXG4gIHNjcm9sbFRvRWxlbWVudCxcbiAgc2lnbmFsQ2xhc3NlcyxcbiAgc2lnbmFsRWxlbWVudENoaWxkcmVuLFxuICBzaWduYWxFbGVtZW50RGltZW5zaW9ucyxcbiAgc2lnbmFsRWxlbWVudEludGVyc2VjdGlvbixcbiAgc2lnbmFsRWxlbWVudFNjcm9sbFN0YXRlLFxuICBzaWduYWxIb3N0QXR0cmlidXRlcyxcbiAgc2lnbmFsSG9zdENsYXNzZXMsXG4gIHNpZ25hbEhvc3RTdHlsZXMsXG59IGZyb20gJ0BldGhsZXRlL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkZWJvdW5jZVRpbWUsXG4gIGZpbHRlcixcbiAgZnJvbUV2ZW50LFxuICBtYXAsXG4gIG9mLFxuICBzd2l0Y2hNYXAsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENoZXZyb25JY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vaWNvbnMvY2hldnJvbi1pY29uJztcbmltcG9ydCB7IFNjcm9sbGFibGVJZ25vcmVDaGlsZERpcmVjdGl2ZSwgaXNTY3JvbGxhYmxlQ2hpbGRJZ25vcmVkIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9zY3JvbGxhYmxlLWlnbm9yZS1jaGlsZCc7XG5pbXBvcnQge1xuICBTQ1JPTExBQkxFX0lTX0FDVElWRV9DSElMRF9UT0tFTixcbiAgU2Nyb2xsYWJsZUlzQWN0aXZlQ2hpbGREaXJlY3RpdmUsXG59IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc2Nyb2xsYWJsZS1pcy1hY3RpdmUtY2hpbGQnO1xuaW1wb3J0IHsgU2Nyb2xsYWJsZUludGVyc2VjdGlvbkNoYW5nZSwgU2Nyb2xsYWJsZVNjcm9sbE1vZGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbi8vIFRocmVzaG9sZHMgZm9yIHRoZSBpbnRlcnNlY3Rpb24gb2JzZXJ2ZXIuXG5jb25zdCBFTEVNRU5UX0lOVEVSU0VDVElPTl9USFJFU0hPTEQgPSBbXG4gIC8vIDUlIHN0ZXBzXG4gIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDIxIH0sIChfLCBpKSA9PiBpICogMC4wNSksXG5cbiAgLy8gQWRkaXRpb25hbCBzdGVwcyBuZWVkZWQgc2luY2UgZGlzcGxheSBzY2FsaW5nIGNhbiBjYXVzZSB0aGUgaW50ZXJzZWN0aW9uIHJhdGlvIHRvIGJlIHNsaWdodGx5IG9mZi5cbiAgMC4wMSxcbiAgMC4wMDUsXG4gIDAuMDAxLFxuICAwLjk5LFxuICAwLjk5NSxcbiAgMC45OTksXG5dO1xuXG5pbnRlcmZhY2UgU2Nyb2xsYWJsZU5hdmlnYXRpb25JdGVtIHtcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG4gIGFjdGl2ZU9mZnNldDogbnVtYmVyO1xuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbn1cblxuZXhwb3J0IHR5cGUgU2Nyb2xsYWJsZUJ1dHRvblBvc2l0aW9uID0gJ2luc2lkZScgfCAnZm9vdGVyJztcbmV4cG9ydCB0eXBlIFNjcm9sbGFibGVTY3JvbGxPcmlnaW4gPSAnYXV0bycgfCAnY2VudGVyJyB8ICdzdGFydCcgfCAnZW5kJztcbmV4cG9ydCB0eXBlIFNjcm9sbGFibGVEaXJlY3Rpb24gPSAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuZXhwb3J0IHR5cGUgU2Nyb2xsYWJsZUl0ZW1TaXplID0gJ2F1dG8nIHwgJ3NhbWUnIHwgJ2Z1bGwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdldC1zY3JvbGxhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Njcm9sbGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY3JvbGxhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgQ3Vyc29yRHJhZ1Njcm9sbERpcmVjdGl2ZSxcbiAgICBPYnNlcnZlU2Nyb2xsU3RhdGVEaXJlY3RpdmUsXG4gICAgTmdDbGFzcyxcbiAgICBMZXREaXJlY3RpdmUsXG4gICAgQ2hldnJvbkljb25Db21wb25lbnQsXG4gICAgU2Nyb2xsYWJsZUlzQWN0aXZlQ2hpbGREaXJlY3RpdmUsXG4gICAgU2Nyb2xsYWJsZUlnbm9yZUNoaWxkRGlyZWN0aXZlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gIF0sXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2V0LXNjcm9sbGFibGUnLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBTY3JvbGxhYmxlQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBfaXNDdXJzb3JEcmFnZ2luZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBfZGlzYWJsZVNuYXBwaW5nJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX21hbnVhbEFjdGl2ZU5hdmlnYXRpb25JbmRleCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICBlbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcblxuICBpdGVtU2l6ZSA9IGlucHV0PFNjcm9sbGFibGVJdGVtU2l6ZT4oJ2F1dG8nKTtcbiAgZGlyZWN0aW9uID0gaW5wdXQ8U2Nyb2xsYWJsZURpcmVjdGlvbj4oJ2hvcml6b250YWwnKTtcbiAgc2Nyb2xsYWJsZVJvbGUgPSBpbnB1dDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgc2Nyb2xsYWJsZUNsYXNzID0gaW5wdXQ8TmdDbGFzc1R5cGUgfCBudWxsPihudWxsKTtcbiAgcmVuZGVyTmF2aWdhdGlvbiA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcbiAgcmVuZGVyTWFza3MgPSBpbnB1dCh0cnVlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcbiAgcmVuZGVyQnV0dG9ucyA9IGlucHV0KHRydWUsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuICBidXR0b25Qb3NpdGlvbiA9IGlucHV0PFNjcm9sbGFibGVCdXR0b25Qb3NpdGlvbj4oJ2luc2lkZScpO1xuICByZW5kZXJTY3JvbGxiYXJzID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuICBzdGlja3lCdXR0b25zID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuICBjdXJzb3JEcmFnU2Nyb2xsID0gaW5wdXQodHJ1ZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG4gIGRpc2FibGVBY3RpdmVFbGVtZW50U2Nyb2xsaW5nID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuICBzY3JvbGxNb2RlID0gaW5wdXQ8U2Nyb2xsYWJsZVNjcm9sbE1vZGU+KCdjb250YWluZXInKTtcbiAgc25hcCA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KTtcbiAgc2Nyb2xsTWFyZ2luID0gaW5wdXQoMCwgeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KTtcbiAgc2Nyb2xsT3JpZ2luID0gaW5wdXQ8U2Nyb2xsYWJsZVNjcm9sbE9yaWdpbj4oJ2F1dG8nKTtcblxuICBzY3JvbGxTdGF0ZUNoYW5nZSA9IG91dHB1dDxTY3JvbGxPYnNlcnZlclNjcm9sbFN0YXRlPigpO1xuICBpbnRlcnNlY3Rpb25DaGFuZ2UgPSBvdXRwdXQ8U2Nyb2xsYWJsZUludGVyc2VjdGlvbkNoYW5nZVtdPigpO1xuXG4gIHNjcm9sbGFibGUgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KCdzY3JvbGxhYmxlJyk7XG4gIGZpcnN0RWxlbWVudCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oJ2ZpcnN0RWxlbWVudCcpO1xuICBsYXN0RWxlbWVudCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oJ2xhc3RFbGVtZW50Jyk7XG4gIGFjdGl2ZUVsZW1lbnRMaXN0ID0gY29udGVudENoaWxkcmVuKFNDUk9MTEFCTEVfSVNfQUNUSVZFX0NISUxEX1RPS0VOLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pO1xuICBuYXZpZ2F0aW9uRG90c0NvbnRhaW5lciA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oJ25hdmlnYXRpb25Eb3RzQ29udGFpbmVyJyk7XG4gIGZpcnN0TmF2aWdhdGlvbkRvdCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50Pj4oJ25hdmlnYXRpb25Eb3QnKTtcbiAgbmF2aWdhdGlvbkRvdERpbWVuc2lvbnMgPSBzaWduYWxFbGVtZW50RGltZW5zaW9ucyh0aGlzLmZpcnN0TmF2aWdhdGlvbkRvdCk7XG5cbiAgaXNSZW5kZXJlZCA9IGNyZWF0ZUlzUmVuZGVyZWRTaWduYWwoKTtcbiAgY2FuQW5pbWF0ZSA9IGNyZWF0ZUNhbkFuaW1hdGVTaWduYWwoKTtcblxuICByZW5kZXJCdXR0b25zSW5zaWRlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5idXR0b25Qb3NpdGlvbigpID09PSAnaW5zaWRlJyAmJiB0aGlzLnJlbmRlckJ1dHRvbnMoKSk7XG4gIHJlbmRlckJ1dHRvbnNJbkZvb3RlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuYnV0dG9uUG9zaXRpb24oKSA9PT0gJ2Zvb3RlcicgJiYgdGhpcy5yZW5kZXJCdXR0b25zKCkpO1xuXG4gIGNvbnRhaW5lclNjcm9sbFN0YXRlID0gc2lnbmFsRWxlbWVudFNjcm9sbFN0YXRlKHRoaXMuc2Nyb2xsYWJsZSwge1xuICAgIGluaXRpYWxTY3JvbGxQb3NpdGlvbjogY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3Qgc2Nyb2xsYWJsZSA9IHRoaXMuc2Nyb2xsYWJsZSgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3QgYWN0aXZlRWxlbWVudExpc3QgPSB0aGlzLmFjdGl2ZUVsZW1lbnRMaXN0KCk7XG5cbiAgICAgIGlmICghc2Nyb2xsYWJsZSB8fCAhYWN0aXZlRWxlbWVudExpc3QubGVuZ3RoIHx8ICF0aGlzLmlzUmVuZGVyZWQuc3RhdGUoKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IGZpcnN0QWN0aXZlID0gYWN0aXZlRWxlbWVudExpc3QuZmluZCgoYSkgPT4gYS5pc0FjdGl2ZUNoaWxkRW5hYmxlZCgpKTtcblxuICAgICAgaWYgKGZpcnN0QWN0aXZlICYmICF0aGlzLmRpc2FibGVBY3RpdmVFbGVtZW50U2Nyb2xsaW5nKCkpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0VG9wID0gZmlyc3RBY3RpdmUuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCAtIHNjcm9sbGFibGUub2Zmc2V0VG9wO1xuICAgICAgICBjb25zdCBvZmZzZXRMZWZ0ID0gZmlyc3RBY3RpdmUuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQgLSBzY3JvbGxhYmxlLm9mZnNldExlZnQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiBvZmZzZXRMZWZ0IC0gdGhpcy5zY3JvbGxNYXJnaW4oKSxcbiAgICAgICAgICB5OiBvZmZzZXRUb3AgLSB0aGlzLnNjcm9sbE1hcmdpbigpLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KSxcbiAgfSk7XG4gIGZpcnN0RWxlbWVudEludGVyc2VjdGlvbiA9IHNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb24odGhpcy5maXJzdEVsZW1lbnQsIHtcbiAgICByb290OiB0aGlzLnNjcm9sbGFibGUsXG4gICAgZW5hYmxlZDogdGhpcy5pc1JlbmRlcmVkLnN0YXRlLFxuICB9KTtcbiAgbGFzdEVsZW1lbnRJbnRlcnNlY3Rpb24gPSBzaWduYWxFbGVtZW50SW50ZXJzZWN0aW9uKHRoaXMubGFzdEVsZW1lbnQsIHtcbiAgICByb290OiB0aGlzLnNjcm9sbGFibGUsXG4gICAgZW5hYmxlZDogdGhpcy5pc1JlbmRlcmVkLnN0YXRlLFxuICB9KTtcbiAgYWxsU2Nyb2xsYWJsZUNoaWxkcmVuID0gc2lnbmFsRWxlbWVudENoaWxkcmVuKHRoaXMuc2Nyb2xsYWJsZSk7XG4gIHNjcm9sbGFibGVDaGlsZHJlbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuYWxsU2Nyb2xsYWJsZUNoaWxkcmVuKCkuZmlsdGVyKChjKSA9PiAhaXNTY3JvbGxhYmxlQ2hpbGRJZ25vcmVkKGMpKSk7XG5cbiAgc2Nyb2xsYWJsZUNvbnRlbnRJbnRlcnNlY3Rpb25zID0gc2lnbmFsRWxlbWVudEludGVyc2VjdGlvbih0aGlzLnNjcm9sbGFibGVDaGlsZHJlbiwge1xuICAgIHJvb3Q6IHRoaXMuc2Nyb2xsYWJsZSxcbiAgICB0aHJlc2hvbGQ6IEVMRU1FTlRfSU5URVJTRUNUSU9OX1RIUkVTSE9MRCxcbiAgICBlbmFibGVkOiB0aGlzLmlzUmVuZGVyZWQuc3RhdGUsXG4gIH0pO1xuICBzY3JvbGxhYmxlQ29udGVudEludGVyc2VjdGlvbnMkID0gdG9PYnNlcnZhYmxlKHRoaXMuc2Nyb2xsYWJsZUNvbnRlbnRJbnRlcnNlY3Rpb25zKTtcblxuICBub25TY3JvbGxhYmxlSW50ZXJzZWN0aW9ucyA9IGNvbXB1dGVkKFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGFsbEludGVyc2VjdGlvbnMgPSB0aGlzLnNjcm9sbGFibGVDb250ZW50SW50ZXJzZWN0aW9ucygpO1xuICAgICAgcmV0dXJuIGFsbEludGVyc2VjdGlvbnMuZmlsdGVyKChpKSA9PiBpLmludGVyc2VjdGlvblJhdGlvICE9PSAxKS5tYXAoKGkpID0+IGkudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICB9LFxuICAgIHsgZXF1YWw6IChhLCBiKSA9PiBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgYS5ldmVyeSgodiwgaSkgPT4gdiA9PT0gYltpXSkgfSxcbiAgKTtcblxuICBjYW5TY3JvbGwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZGlyID0gdGhpcy5kaXJlY3Rpb24oKTtcblxuICAgIGlmIChkaXIgPT09ICdob3Jpem9udGFsJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyU2Nyb2xsU3RhdGUoKS5jYW5TY3JvbGxIb3Jpem9udGFsbHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyU2Nyb2xsU3RhdGUoKS5jYW5TY3JvbGxWZXJ0aWNhbGx5O1xuICB9KTtcblxuICBpc0F0U3RhcnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmNhblNjcm9sbCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcnNlY3Rpb24gPSB0aGlzLmZpcnN0RWxlbWVudEludGVyc2VjdGlvbigpWzBdO1xuXG4gICAgaWYgKCFpbnRlcnNlY3Rpb24pIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBpbnRlcnNlY3Rpb24uaXNJbnRlcnNlY3Rpbmc7XG4gIH0pO1xuXG4gIGlzQXRFbmQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmNhblNjcm9sbCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcnNlY3Rpb24gPSB0aGlzLmxhc3RFbGVtZW50SW50ZXJzZWN0aW9uKClbMF07XG5cbiAgICBpZiAoIWludGVyc2VjdGlvbikgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIGludGVyc2VjdGlvbi5pc0ludGVyc2VjdGluZztcbiAgfSk7XG5cbiAgc2Nyb2xsYWJsZU5hdmlnYXRpb24gPSBjb21wdXRlZDxTY3JvbGxhYmxlTmF2aWdhdGlvbkl0ZW1bXT4oKCkgPT4ge1xuICAgIGNvbnN0IGFsbEludGVyc2VjdGlvbnMgPSB0aGlzLnNjcm9sbGFibGVDb250ZW50SW50ZXJzZWN0aW9ucygpO1xuICAgIGNvbnN0IG1hbnVhbEFjdGl2ZU5hdmlnYXRpb25JbmRleCA9IHRoaXMuX21hbnVhbEFjdGl2ZU5hdmlnYXRpb25JbmRleCgpO1xuXG4gICAgY29uc3QgaGlnaGVzdEludGVyc2VjdGlvbiA9IGFsbEludGVyc2VjdGlvbnMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICBpZiAocHJldiAmJiBwcmV2LmludGVyc2VjdGlvblJhdGlvID4gY3Vyci5pbnRlcnNlY3Rpb25SYXRpbykge1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGN1cnI7XG4gICAgfSwgYWxsSW50ZXJzZWN0aW9uc1swXSk7XG5cbiAgICBpZiAoIWhpZ2hlc3RJbnRlcnNlY3Rpb24pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVJbmRleCA9XG4gICAgICBtYW51YWxBY3RpdmVOYXZpZ2F0aW9uSW5kZXggIT09IG51bGxcbiAgICAgICAgPyBtYW51YWxBY3RpdmVOYXZpZ2F0aW9uSW5kZXhcbiAgICAgICAgOiBhbGxJbnRlcnNlY3Rpb25zLmZpbmRJbmRleCgoaSkgPT4gaSA9PT0gaGlnaGVzdEludGVyc2VjdGlvbik7XG5cbiAgICByZXR1cm4gYWxsSW50ZXJzZWN0aW9ucy5tYXAoKGksIGluZGV4KSA9PiAoe1xuICAgICAgaXNBY3RpdmU6XG4gICAgICAgIG1hbnVhbEFjdGl2ZU5hdmlnYXRpb25JbmRleCAhPT0gbnVsbFxuICAgICAgICAgID8gbWFudWFsQWN0aXZlTmF2aWdhdGlvbkluZGV4ID09PSBpbmRleFxuICAgICAgICAgIDogaSA9PT0gaGlnaGVzdEludGVyc2VjdGlvbiAmJiBoaWdoZXN0SW50ZXJzZWN0aW9uLmludGVyc2VjdGlvblJhdGlvID4gMCxcbiAgICAgIGFjdGl2ZU9mZnNldDogaW5kZXggPT09IGFjdGl2ZUluZGV4ID8gMCA6IE1hdGguYWJzKGluZGV4IC0gYWN0aXZlSW5kZXgpLFxuICAgICAgZWxlbWVudDogaS50YXJnZXQgYXMgSFRNTEVsZW1lbnQsXG4gICAgfSkpO1xuICB9KTtcblxuICBhY3RpdmVJbmRleCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzY3JvbGxhYmxlTmF2aWdhdGlvbiA9IHRoaXMuc2Nyb2xsYWJsZU5hdmlnYXRpb24oKTtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHNjcm9sbGFibGVOYXZpZ2F0aW9uLmZpbmRJbmRleCgoZWxlbWVudCkgPT4gZWxlbWVudC5pc0FjdGl2ZSk7XG5cbiAgICByZXR1cm4gYWN0aXZlSW5kZXg7XG4gIH0pO1xuXG4gIG5vbkZ1bGxJbnRlcnNlY3RpbmdFbGVtZW50Q2xhc3NCaW5kaW5ncyA9IHNpZ25hbENsYXNzZXModGhpcy5ub25TY3JvbGxhYmxlSW50ZXJzZWN0aW9ucywge1xuICAgICdldC1zY3JvbGxhYmxlLWl0ZW0tLW5vdC1pbnRlcnNlY3RpbmcnOiBzaWduYWwodHJ1ZSksXG4gIH0pO1xuXG4gIGhvc3RBdHRyaWJ1dGVCaW5kaW5ncyA9IHNpZ25hbEhvc3RBdHRyaWJ1dGVzKHtcbiAgICAnaXRlbS1zaXplJzogdGhpcy5pdGVtU2l6ZSxcbiAgICBkaXJlY3Rpb246IHRoaXMuZGlyZWN0aW9uLFxuICAgICdyZW5kZXItc2Nyb2xsYmFycyc6IHRoaXMucmVuZGVyU2Nyb2xsYmFycyxcbiAgICAnc3RpY2t5LWJ1dHRvbnMnOiBjb21wdXRlZCgoKSA9PiB0aGlzLnN0aWNreUJ1dHRvbnMoKSAmJiB0aGlzLnJlbmRlckJ1dHRvbnNJbnNpZGUoKSksXG4gIH0pO1xuXG4gIGhvc3RDbGFzc0JpbmRpbmdzID0gc2lnbmFsSG9zdENsYXNzZXMoe1xuICAgICdldC1zY3JvbGxhYmxlLS1jYW4tc2Nyb2xsJzogY29tcHV0ZWQoKCkgPT4gdGhpcy5jYW5TY3JvbGwoKSAmJiAoIXRoaXMuaXNBdFN0YXJ0KCkgfHwgIXRoaXMuaXNBdEVuZCgpKSksXG4gICAgJ2V0LXNjcm9sbGFibGUtLWlzLWF0LXN0YXJ0JzogdGhpcy5pc0F0U3RhcnQsXG4gICAgJ2V0LXNjcm9sbGFibGUtLWlzLWF0LWVuZCc6IHRoaXMuaXNBdEVuZCxcbiAgICAnZXQtc2Nyb2xsYWJsZS0tY2FuLWFuaW1hdGUnOiB0aGlzLmNhbkFuaW1hdGUuc3RhdGUsXG4gIH0pO1xuXG4gIGhvc3RTdHlsZUJpbmRpbmdzID0gc2lnbmFsSG9zdFN0eWxlcyh7XG4gICAgJy0taXRlbS1jb3VudCc6IGNvbXB1dGVkKCgpID0+IHRoaXMuc2Nyb2xsYWJsZUNoaWxkcmVuKCkubGVuZ3RoKSxcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIC8vIFJlc3BvbnNpYmxlIGZvciBjZW50ZXJpbmcgdGhlIGFjdGl2ZSBkb3QgaW4gbmF2aWdhdGlvbiBiYXIgYnkgdXNpbmcgJ3RyYW5zbGF0ZSdcbiAgICAgIGNvbnN0IHNjcm9sbGFibGVEb3RzQ29udGFpbmVyID0gdGhpcy5uYXZpZ2F0aW9uRG90c0NvbnRhaW5lcigpO1xuICAgICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLmFjdGl2ZUluZGV4KCk7XG4gICAgICBjb25zdCBjaGlsZENvdW50ID0gdGhpcy5zY3JvbGxhYmxlQ29udGVudEludGVyc2VjdGlvbnMoKS5sZW5ndGg7XG5cbiAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuZ2V0TmF2aWdhdGlvbkRvdHNDb250YWluZXJUcmFuc2xhdGUoY2hpbGRDb3VudCwgYWN0aXZlSW5kZXgpO1xuXG4gICAgICBpZiAoIXNjcm9sbGFibGVEb3RzQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgIHNjcm9sbGFibGVEb3RzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHtvZmZzZXR9KWA7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgaXNBdFN0YXJ0ID0gdGhpcy5pc0F0U3RhcnQoKTtcbiAgICAgIGNvbnN0IGlzQXRFbmQgPSB0aGlzLmlzQXRFbmQoKTtcbiAgICAgIGNvbnN0IGNhblNjcm9sbCA9IHRoaXMuY2FuU2Nyb2xsKCk7XG5cbiAgICAgIHRoaXMuc2Nyb2xsU3RhdGVDaGFuZ2UuZW1pdCh7XG4gICAgICAgIGNhblNjcm9sbCxcbiAgICAgICAgaXNBdEVuZDogISFpc0F0RW5kLFxuICAgICAgICBpc0F0U3RhcnQ6ICEhaXNBdFN0YXJ0LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgZW5hYmxlU25hcHBpbmcgPSB0aGlzLnNuYXAoKTtcblxuICAgICAgaWYgKGVuYWJsZVNuYXBwaW5nKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZVNuYXBwaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9kaXNhYmxlU25hcHBpbmcoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2Nyb2xsYWJsZUNvbnRlbnRJbnRlcnNlY3Rpb25zJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgICBkZWJvdW5jZVRpbWUoMTApLFxuICAgICAgICB0YXAoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbkNoYW5nZS5lbWl0KFxuICAgICAgICAgICAgZW50cmllcy5tYXAoKGksIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgZWxlbWVudDogaS50YXJnZXQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgIGludGVyc2VjdGlvblJhdGlvOiBpLmludGVyc2VjdGlvblJhdGlvLFxuICAgICAgICAgICAgICBpc0ludGVyc2VjdGluZzogaS5pc0ludGVyc2VjdGluZyxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHRvT2JzZXJ2YWJsZSh0aGlzLl9tYW51YWxBY3RpdmVOYXZpZ2F0aW9uSW5kZXgpXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKChpKSA9PiBpICE9PSBudWxsKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZSA9IHRoaXMuc2Nyb2xsYWJsZSgpPy5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgICAgaWYgKCFzY3JvbGxhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZyb21FdmVudChzY3JvbGxhYmxlLCAnc2Nyb2xsJyk7XG4gICAgICAgIH0pLFxuICAgICAgICBkZWJvdW5jZVRpbWUoNTApLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fbWFudWFsQWN0aXZlTmF2aWdhdGlvbkluZGV4LnNldChudWxsKSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLmlzUmVuZGVyZWQuYmluZCgpO1xuICB9XG5cbiAgZ2V0TmF2aWdhdGlvbkRvdHNDb250YWluZXJUcmFuc2xhdGUobmF2aWdhdGlvbkRvdENvdW50OiBudW1iZXIsIGFjdGl2ZUluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAobmF2aWdhdGlvbkRvdENvdW50IDw9IDUpIHtcbiAgICAgIHJldHVybiAnMHB4JztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZG90Q29udGFpbmVyV2lkdGggPSB0aGlzLm5hdmlnYXRpb25Eb3REaW1lbnNpb25zKCkucmVjdD8ud2lkdGggPz8gMjA7XG4gICAgICBsZXQgb2Zmc2V0ID0gLShhY3RpdmVJbmRleCAtIDIpO1xuICAgICAgaWYgKGFjdGl2ZUluZGV4IDwgMykge1xuICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgfSBlbHNlIGlmIChhY3RpdmVJbmRleCA+PSBuYXZpZ2F0aW9uRG90Q291bnQgLSAzKSB7XG4gICAgICAgIG9mZnNldCA9IDUgLSBuYXZpZ2F0aW9uRG90Q291bnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7b2Zmc2V0ICogZG90Q29udGFpbmVyV2lkdGh9cHhgO1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbE9uZUNvbnRhaW5lclNpemUoZGlyZWN0aW9uOiAnc3RhcnQnIHwgJ2VuZCcpIHtcbiAgICBjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5zY3JvbGxhYmxlKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoIXNjcm9sbEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgIGNvbnN0IGlzU25hcHBpbmdFbmFibGVkID0gdGhpcy5zbmFwKCk7XG5cbiAgICBpZiAoaXNTbmFwcGluZ0VuYWJsZWQpIHtcbiAgICAgIC8vIElmIHNuYXBwaW5nIGlzIGVuYWJsZWQgd2Ugd2FudCB0byBzY3JvbGwgdG8gYSBwb3NpdGlvbiB3aGVyZSBubyBmdXJ0aGVyIHNuYXBwaW5nIHdpbGwgaGFwcGVuIGFmdGVyIHRoZSBzY3JvbGwuXG4gICAgICBjb25zdCBhbGxJbnRlcnNlY3Rpb25zID0gdGhpcy5zY3JvbGxhYmxlQ29udGVudEludGVyc2VjdGlvbnMoKTtcbiAgICAgIGNvbnN0IGludGVyc2VjdGlvbnMgPSBnZXRJbnRlcnNlY3Rpb25JbmZvKGFsbEludGVyc2VjdGlvbnMpO1xuICAgICAgY29uc3QgcmVsZXZhbnRJbnRlcnNlY3Rpb24gPSBkaXJlY3Rpb24gPT09ICdzdGFydCcgPyBpbnRlcnNlY3Rpb25zPy5wYXJ0aWFsLmZpcnN0IDogaW50ZXJzZWN0aW9ucz8ucGFydGlhbC5sYXN0O1xuXG4gICAgICBpZiAoIXJlbGV2YW50SW50ZXJzZWN0aW9uKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG5leHRJbmRleCA9XG4gICAgICAgIHJlbGV2YW50SW50ZXJzZWN0aW9uLmludGVyc2VjdGlvbi5pbnRlcnNlY3Rpb25SYXRpbyAhPT0gMVxuICAgICAgICAgID8gcmVsZXZhbnRJbnRlcnNlY3Rpb24uaW5kZXhcbiAgICAgICAgICA6IGRpcmVjdGlvbiA9PT0gJ3N0YXJ0J1xuICAgICAgICAgICAgPyByZWxldmFudEludGVyc2VjdGlvbi5pbmRleCAtIDFcbiAgICAgICAgICAgIDogcmVsZXZhbnRJbnRlcnNlY3Rpb24uaW5kZXggKyAxO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID1cbiAgICAgICAgKGFsbEludGVyc2VjdGlvbnNbbmV4dEluZGV4XT8udGFyZ2V0IGFzIEhUTUxFbGVtZW50KSB8fFxuICAgICAgICAocmVsZXZhbnRJbnRlcnNlY3Rpb24uaW50ZXJzZWN0aW9uLnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG5cbiAgICAgIHRoaXMuc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgb3JpZ2luOiBkaXJlY3Rpb24gPT09ICdlbmQnID8gJ3N0YXJ0JyA6ICdlbmQnLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEp1c3Qgc2Nyb2xsIG9uZSBzaXplIG9mIHRoZSBzY3JvbGxhYmxlIGNvbnRhaW5lci5cbiAgICAgIGNvbnN0IHNjcm9sbGFibGVTaXplID0gdGhpcy5kaXJlY3Rpb24oKSA9PT0gJ2hvcml6b250YWwnID8gcGFyZW50LmNsaWVudFdpZHRoIDogcGFyZW50LmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IGN1cnJlbnRTY3JvbGwgPSB0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCcgPyBzY3JvbGxFbGVtZW50LnNjcm9sbExlZnQgOiBzY3JvbGxFbGVtZW50LnNjcm9sbFRvcDtcblxuICAgICAgc2Nyb2xsRWxlbWVudC5zY3JvbGxUbyh7XG4gICAgICAgIFt0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCcgPyAnbGVmdCcgOiAndG9wJ106XG4gICAgICAgICAgY3VycmVudFNjcm9sbCArIChkaXJlY3Rpb24gPT09ICdzdGFydCcgPyAtc2Nyb2xsYWJsZVNpemUgOiBzY3JvbGxhYmxlU2l6ZSksXG4gICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbE9uZUl0ZW1TaXplKGRpcmVjdGlvbjogJ3N0YXJ0JyB8ICdlbmQnKSB7XG4gICAgY29uc3QgYWxsSW50ZXJzZWN0aW9ucyA9IHRoaXMuc2Nyb2xsYWJsZUNvbnRlbnRJbnRlcnNlY3Rpb25zKCk7XG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZSgpPy5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKCFhbGxJbnRlcnNlY3Rpb25zLmxlbmd0aCkge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnTm8gZWxlbWVudHMgZm91bmQgdG8gc2Nyb2xsIHRvLiBNYWtlIHN1cmUgdG8gYXBwbHkgdGhlIGlzRWxlbWVudCBkaXJlY3RpdmUgdG8gdGhlIGVsZW1lbnRzIHlvdSB3YW50IHRvIHNjcm9sbCB0by4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVyc2VjdGlvbnMgPSBnZXRJbnRlcnNlY3Rpb25JbmZvKGFsbEludGVyc2VjdGlvbnMpO1xuXG4gICAgaWYgKCFpbnRlcnNlY3Rpb25zIHx8ICFzY3JvbGxFbGVtZW50KSByZXR1cm47XG5cbiAgICAvLyBNZWFucyB0aGUgY3VycmVudCBlbGVtZW50IGlzIGJpZ2dlciB0aGFuIHRoZSBzY3JvbGxhYmxlIGNvbnRhaW5lci5cbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIHNjcm9sbCB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZWxlbWVudC4gSWYgd2UgYXJlIGFscmVhZHkgdGhlcmUgd2Ugc2hvdWxkIHNjcm9sbCB0byB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBlbGVtZW50LlxuICAgIC8vIFRoaXMgYXBwbGllcyB0byB0aGUgb3RoZXIgZGlyZWN0aW9uIGFzIHdlbGwuXG4gICAgY29uc3QgaXNGaXJzdEFuZExhc3RJbnRlcnNlY3Rpb25FcXVhbCA9XG4gICAgICBpbnRlcnNlY3Rpb25zLnBhcnRpYWwuZmlyc3QuaW50ZXJzZWN0aW9uID09PSBpbnRlcnNlY3Rpb25zLnBhcnRpYWwubGFzdC5pbnRlcnNlY3Rpb247XG4gICAgY29uc3Qgc2Nyb2xsYWJsZVJlY3QgPSBzY3JvbGxFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgaWYgKGlzRmlyc3RBbmRMYXN0SW50ZXJzZWN0aW9uRXF1YWwpIHtcbiAgICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IGludGVyc2VjdGlvbnMucGFydGlhbC5maXJzdC5pbnRlcnNlY3Rpb24udGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgaXNTdGFydE9mRWxlbWVudFZpc2libGUgPVxuICAgICAgICB0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgICA/IE1hdGgucm91bmQoaW50ZXJzZWN0aW9uLmxlZnQpID49IE1hdGgucm91bmQoc2Nyb2xsYWJsZVJlY3QubGVmdClcbiAgICAgICAgICA6IE1hdGgucm91bmQoaW50ZXJzZWN0aW9uLnRvcCkgPj0gTWF0aC5yb3VuZChzY3JvbGxhYmxlUmVjdC50b3ApO1xuXG4gICAgICBjb25zdCBpc0VuZE9mRWxlbWVudFZpc2libGUgPVxuICAgICAgICB0aGlzLmRpcmVjdGlvbigpID09PSAnaG9yaXpvbnRhbCdcbiAgICAgICAgICA/IE1hdGgucm91bmQoaW50ZXJzZWN0aW9uLnJpZ2h0KSA8PSBNYXRoLnJvdW5kKHNjcm9sbGFibGVSZWN0LnJpZ2h0KVxuICAgICAgICAgIDogTWF0aC5yb3VuZChpbnRlcnNlY3Rpb24uYm90dG9tKSA8PSBNYXRoLnJvdW5kKHNjcm9sbGFibGVSZWN0LmJvdHRvbSk7XG5cbiAgICAgIGlmICghaXNTdGFydE9mRWxlbWVudFZpc2libGUgfHwgIWlzRW5kT2ZFbGVtZW50VmlzaWJsZSkge1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnc3RhcnQnKSB7XG4gICAgICAgICAgaWYgKGlzU3RhcnRPZkVsZW1lbnRWaXNpYmxlKSB7XG4gICAgICAgICAgICAvLyB0byB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBlbGVtZW50XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gaW50ZXJzZWN0aW9ucy5wYXJ0aWFsLmZpcnN0LmluZGV4IC0gMTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRUb1Njcm9sbFRvID0gYWxsSW50ZXJzZWN0aW9uc1twcmV2aW91c0luZGV4XT8udGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAoIWVsZW1lbnRUb1Njcm9sbFRvKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvRWxlbWVudCh7XG4gICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnRUb1Njcm9sbFRvLFxuICAgICAgICAgICAgICBvcmlnaW46ICdlbmQnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9tYW51YWxBY3RpdmVOYXZpZ2F0aW9uSW5kZXguc2V0KHByZXZpb3VzSW5kZXgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZWxlbWVudFxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgICAgICAgICBlbGVtZW50OiBpbnRlcnNlY3Rpb25zLnBhcnRpYWwuZmlyc3QuaW50ZXJzZWN0aW9uLnRhcmdldCBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgb3JpZ2luOiAnc3RhcnQnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9tYW51YWxBY3RpdmVOYXZpZ2F0aW9uSW5kZXguc2V0KGludGVyc2VjdGlvbnMucGFydGlhbC5maXJzdC5pbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpc0VuZE9mRWxlbWVudFZpc2libGUpIHtcbiAgICAgICAgICAgIC8vIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBlbGVtZW50XG4gICAgICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBpbnRlcnNlY3Rpb25zLnBhcnRpYWwubGFzdC5pbmRleCArIDE7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50VG9TY3JvbGxUbyA9IGFsbEludGVyc2VjdGlvbnNbbmV4dEluZGV4XT8udGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAoIWVsZW1lbnRUb1Njcm9sbFRvKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvRWxlbWVudCh7XG4gICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnRUb1Njcm9sbFRvLFxuICAgICAgICAgICAgICBvcmlnaW46ICdzdGFydCcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX21hbnVhbEFjdGl2ZU5hdmlnYXRpb25JbmRleC5zZXQobmV4dEluZGV4KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBlbGVtZW50XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvRWxlbWVudCh7XG4gICAgICAgICAgICAgIGVsZW1lbnQ6IGludGVyc2VjdGlvbnMucGFydGlhbC5sYXN0LmludGVyc2VjdGlvbi50YXJnZXQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgIG9yaWdpbjogJ2VuZCcsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5fbWFudWFsQWN0aXZlTmF2aWdhdGlvbkluZGV4LnNldChpbnRlcnNlY3Rpb25zLnBhcnRpYWwubGFzdC5pbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5zY3JvbGxPcmlnaW4oKSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIC8vIElmIHRoZSBzY3JvbGwgb3JpZ2luIGlzIGZvcmNlZCB0byBiZSBjZW50ZXIgd2Ugc2hvdWxkIGFsd2F5cyBzbmFwIHRvIHRoZSBjZW50ZXIgb2YgdGhlIG5leHQgcGFydGlhbCBpbnRlcnNlY3Rpb24gaW4gdGhlIHNjcm9sbCBkaXJlY3Rpb24uXG4gICAgICBjb25zdCBuZXh0UGFydGlhbEludGVyc2VjdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3N0YXJ0JyA/IGludGVyc2VjdGlvbnMucGFydGlhbC5maXJzdCA6IGludGVyc2VjdGlvbnMucGFydGlhbC5sYXN0O1xuICAgICAgY29uc3QgbmV4dEluZGV4ID0gbmV4dFBhcnRpYWxJbnRlcnNlY3Rpb24uaW5kZXg7XG5cbiAgICAgIHRoaXMuc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgICAgZWxlbWVudDogbmV4dFBhcnRpYWxJbnRlcnNlY3Rpb24uaW50ZXJzZWN0aW9uLnRhcmdldCBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgb3JpZ2luOiAnY2VudGVyJyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fbWFudWFsQWN0aXZlTmF2aWdhdGlvbkluZGV4LnNldChuZXh0SW5kZXgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGRpcmVjdGlvbiA9PT0gJ3N0YXJ0JyA/IGludGVyc2VjdGlvbnMucGFydGlhbC5maXJzdCA6IGludGVyc2VjdGlvbnMucGFydGlhbC5sYXN0O1xuICAgIGxldCBlbGVtZW50VG9TY3JvbGxUbyA9IGRhdGEuaW50ZXJzZWN0aW9uLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBsZXQgbmV4dEluZGV4ID0gZGF0YS5pbmRleDtcblxuICAgIGlmIChNYXRoLnJvdW5kKGRhdGEuaW50ZXJzZWN0aW9uLmludGVyc2VjdGlvblJhdGlvKSA9PT0gMSkge1xuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3N0YXJ0JyAmJiBkYXRhLmluZGV4ID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2VuZCcgJiYgZGF0YS5pbmRleCA9PT0gYWxsSW50ZXJzZWN0aW9ucy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dEluZGV4ID0gZGlyZWN0aW9uID09PSAnc3RhcnQnID8gZGF0YS5pbmRleCAtIDEgOiBkYXRhLmluZGV4ICsgMTtcblxuICAgICAgZWxlbWVudFRvU2Nyb2xsVG8gPSBhbGxJbnRlcnNlY3Rpb25zW25leHRJbmRleF0/LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKCFlbGVtZW50VG9TY3JvbGxUbykgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgIGVsZW1lbnQ6IGVsZW1lbnRUb1Njcm9sbFRvLFxuICAgICAgb3JpZ2luOiBkaXJlY3Rpb24sXG4gICAgfSk7XG5cbiAgICB0aGlzLl9tYW51YWxBY3RpdmVOYXZpZ2F0aW9uSW5kZXguc2V0KG5leHRJbmRleCk7XG4gIH1cblxuICBzY3JvbGxUb0VsZW1lbnQob3B0aW9uczogT21pdDxTY3JvbGxUb0VsZW1lbnRPcHRpb25zLCAnY29udGFpbmVyJz4gJiB7IGlnbm9yZUZvcmNlZE9yaWdpbj86IGJvb2xlYW4gfSkge1xuICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSB0aGlzLnNjcm9sbGFibGUoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCB7IG9yaWdpbiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBmb3JjZWRPcmlnaW4gPSB0aGlzLnNjcm9sbE9yaWdpbigpO1xuXG4gICAgc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgIGNvbnRhaW5lcjogc2Nyb2xsRWxlbWVudCxcbiAgICAgIGRpcmVjdGlvbjogdGhpcy5kaXJlY3Rpb24oKSA9PT0gJ2hvcml6b250YWwnID8gJ2lubGluZScgOiAnYmxvY2snLFxuICAgICAgLi4uKHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJ1xuICAgICAgICA/IHsgc2Nyb2xsSW5saW5lTWFyZ2luOiB0aGlzLnNjcm9sbE1hcmdpbigpIH1cbiAgICAgICAgOiB7IHNjcm9sbEJsb2NrTWFyZ2luOiB0aGlzLnNjcm9sbE1hcmdpbigpIH0pLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIC4uLihmb3JjZWRPcmlnaW4gPT09ICdhdXRvJyB8fCBvcHRpb25zLmlnbm9yZUZvcmNlZE9yaWdpbiA/IHsgb3JpZ2luIH0gOiB7IG9yaWdpbjogZm9yY2VkT3JpZ2luIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgc2Nyb2xsVG9FbGVtZW50QnlJbmRleChcbiAgICBvcHRpb25zOiBPbWl0PFNjcm9sbFRvRWxlbWVudE9wdGlvbnMsICdjb250YWluZXInPiAmIHsgaW5kZXg6IG51bWJlcjsgaWdub3JlRm9yY2VkT3JpZ2luPzogYm9vbGVhbiB9LFxuICApIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2Nyb2xsYWJsZUNoaWxkcmVuKCk7XG4gICAgY29uc3QgeyBvcmlnaW4gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgZm9yY2VkT3JpZ2luID0gdGhpcy5zY3JvbGxPcmlnaW4oKTtcblxuICAgIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdObyBlbGVtZW50cyBmb3VuZCB0byBzY3JvbGwgdG8uJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHRoaXMuc2Nyb2xsYWJsZSgpPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tvcHRpb25zLmluZGV4XTtcblxuICAgIHNjcm9sbFRvRWxlbWVudCh7XG4gICAgICBjb250YWluZXI6IHNjcm9sbEVsZW1lbnQsXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4uKHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJ1xuICAgICAgICA/IHsgc2Nyb2xsSW5saW5lTWFyZ2luOiB0aGlzLnNjcm9sbE1hcmdpbigpIH1cbiAgICAgICAgOiB7IHNjcm9sbEJsb2NrTWFyZ2luOiB0aGlzLnNjcm9sbE1hcmdpbigpIH0pLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIC4uLihmb3JjZWRPcmlnaW4gPT09ICdhdXRvJyB8fCBvcHRpb25zLmlnbm9yZUZvcmNlZE9yaWdpbiA/IHsgb3JpZ2luIH0gOiB7IG9yaWdpbjogZm9yY2VkT3JpZ2luIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNjcm9sbFRvRWxlbWVudFZpYU5hdmlnYXRpb24oZWxlbWVudEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5zY3JvbGxhYmxlQ2hpbGRyZW4oKVtlbGVtZW50SW5kZXhdO1xuICAgIHRoaXMuX21hbnVhbEFjdGl2ZU5hdmlnYXRpb25JbmRleC5zZXQoZWxlbWVudEluZGV4KTtcblxuICAgIHRoaXMuc2Nyb2xsVG9FbGVtZW50KHtcbiAgICAgIGVsZW1lbnQsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0SXNDdXJzb3JEcmFnZ2luZyhpc0RyYWdnaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNDdXJzb3JEcmFnZ2luZyQubmV4dChpc0RyYWdnaW5nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxUb1N0YXJ0RGlyZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnNjcm9sbE1vZGUoKSA9PT0gJ2NvbnRhaW5lcicpIHtcbiAgICAgIHRoaXMuc2Nyb2xsT25lQ29udGFpbmVyU2l6ZSgnc3RhcnQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxPbmVJdGVtU2l6ZSgnc3RhcnQnKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9FbmREaXJlY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsTW9kZSgpID09PSAnY29udGFpbmVyJykge1xuICAgICAgdGhpcy5zY3JvbGxPbmVDb250YWluZXJTaXplKCdlbmQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxPbmVJdGVtU2l6ZSgnZW5kJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZW5hYmxlU25hcHBpbmcoKSB7XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5zY3JvbGxhYmxlQ29udGVudEludGVyc2VjdGlvbnMkLCB0aGlzLl9pc0N1cnNvckRyYWdnaW5nJF0pXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKChbLCBpc0RyYWdnaW5nXSkgPT4gIWlzRHJhZ2dpbmcpLFxuICAgICAgICBtYXAoKFtpbnRlcnNlY3Rpb25zXSkgPT4gaW50ZXJzZWN0aW9ucyksXG4gICAgICAgIGRlYm91bmNlVGltZSgxNTApLFxuICAgICAgICB0YXAoKGFsbEludGVyc2VjdGlvbnMpID0+IHtcbiAgICAgICAgICBjb25zdCBzY3JvbGxFbGVtZW50ID0gdGhpcy5zY3JvbGxhYmxlKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICBpZiAoIXNjcm9sbEVsZW1lbnQpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGludGVyc2VjdGlvbnMgPSBnZXRJbnRlcnNlY3Rpb25JbmZvKGFsbEludGVyc2VjdGlvbnMpO1xuXG4gICAgICAgICAgaWYgKCFpbnRlcnNlY3Rpb25zKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBpc0ZpcnN0QW5kTGFzdEludGVyc2VjdGlvbkVxdWFsID1cbiAgICAgICAgICAgIGludGVyc2VjdGlvbnMucGFydGlhbC5maXJzdC5pbnRlcnNlY3Rpb24gPT09IGludGVyc2VjdGlvbnMucGFydGlhbC5sYXN0LmludGVyc2VjdGlvbjtcbiAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlUmVjdCA9IHNjcm9sbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICBpZiAodGhpcy5zY3JvbGxPcmlnaW4oKSA9PT0gJ2NlbnRlcicgJiYgaW50ZXJzZWN0aW9ucy5mdWxsLmhhc011bHRpcGxlKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGZ1bGx5IHZpc2libGUgZWxlbWVudCB3ZSBzaG91bGQgbm90IHNuYXAgYXQgYWxsLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zY3JvbGxPcmlnaW4oKSA9PT0gJ2NlbnRlcicgJiYgaW50ZXJzZWN0aW9ucy5mdWxsLmZpcnN0LmludGVyc2VjdGlvbikge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGZ1bGx5IHZpc2libGUgZWxlbWVudCB3ZSBzaG91bGQgc25hcCBpdCB0byB0aGUgY2VudGVyLlxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgICAgICAgICBlbGVtZW50OiBpbnRlcnNlY3Rpb25zLmZ1bGwuZmlyc3QuaW50ZXJzZWN0aW9uLnRhcmdldCBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgb3JpZ2luOiAnY2VudGVyJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNGaXJzdEFuZExhc3RJbnRlcnNlY3Rpb25FcXVhbCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0aW9ucy5wYXJ0aWFsLmZpcnN0LmludGVyc2VjdGlvbi50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBpc1N0YXJ0T2ZFbGVtZW50VmlzaWJsZSA9XG4gICAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJ1xuICAgICAgICAgICAgICAgID8gaW50ZXJzZWN0aW9uLmxlZnQgPj0gc2Nyb2xsYWJsZVJlY3QubGVmdFxuICAgICAgICAgICAgICAgIDogaW50ZXJzZWN0aW9uLnRvcCA+PSBzY3JvbGxhYmxlUmVjdC50b3A7XG5cbiAgICAgICAgICAgIGNvbnN0IGlzRW5kT2ZFbGVtZW50VmlzaWJsZSA9XG4gICAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJ1xuICAgICAgICAgICAgICAgID8gaW50ZXJzZWN0aW9uLnJpZ2h0IDw9IHNjcm9sbGFibGVSZWN0LnJpZ2h0XG4gICAgICAgICAgICAgICAgOiBpbnRlcnNlY3Rpb24uYm90dG9tIDw9IHNjcm9sbGFibGVSZWN0LmJvdHRvbTtcblxuICAgICAgICAgICAgLy8gRG9uJ3Qgc25hcCBpZiBuZWl0aGVyIHRoZSBzdGFydCBub3IgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBlbGVtZW50IGlzIHZpc2libGUuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgdGhpcyB3b3VsZCByZXN1bHQgaW4gcGFydHMgb2YgdGhlIGVsZW1lbnQgYmVpbmcgaW5hY2Nlc3NpYmxlLlxuICAgICAgICAgICAgaWYgKCFpc1N0YXJ0T2ZFbGVtZW50VmlzaWJsZSAmJiAhaXNFbmRPZkVsZW1lbnRWaXNpYmxlKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBzdGFydCBvZiB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIHdlIHNob3VsZCBzbmFwIHRvIHRoZSBzdGFydC5cbiAgICAgICAgICAgIGlmIChpc1N0YXJ0T2ZFbGVtZW50VmlzaWJsZSkge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvRWxlbWVudCh7XG4gICAgICAgICAgICAgICAgZWxlbWVudDogaW50ZXJzZWN0aW9ucy5wYXJ0aWFsLmZpcnN0LmludGVyc2VjdGlvbi50YXJnZXQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgb3JpZ2luOiAnc3RhcnQnLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZW5kIG9mIHRoZSBlbGVtZW50IGlzIHZpc2libGUgd2Ugc2hvdWxkIHNuYXAgdG8gdGhlIGVuZC5cbiAgICAgICAgICAgIGlmIChpc0VuZE9mRWxlbWVudFZpc2libGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGludGVyc2VjdGlvbnMucGFydGlhbC5sYXN0LmludGVyc2VjdGlvbi50YXJnZXQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgb3JpZ2luOiAnZW5kJyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgKHRoaXMuZGlyZWN0aW9uKCkgPT09ICdob3Jpem9udGFsJyAmJlxuICAgICAgICAgICAgICBpbnRlcnNlY3Rpb25zLnBhcnRpYWwuYmlnZ2VzdC5pbnRlcnNlY3Rpb24uYm91bmRpbmdDbGllbnRSZWN0LndpZHRoID4gc2Nyb2xsYWJsZVJlY3Qud2lkdGgpIHx8XG4gICAgICAgICAgICAodGhpcy5kaXJlY3Rpb24oKSA9PT0gJ3ZlcnRpY2FsJyAmJlxuICAgICAgICAgICAgICBpbnRlcnNlY3Rpb25zLnBhcnRpYWwuYmlnZ2VzdC5pbnRlcnNlY3Rpb24uYm91bmRpbmdDbGllbnRSZWN0LmhlaWdodCA+IHNjcm9sbGFibGVSZWN0LmhlaWdodClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgYmlnZ2VyIHRoYW4gdGhlIHNjcm9sbGFibGUgY29udGFpbmVyIHdlIHNob3VsZCBzbmFwIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBlbGVtZW50IGlmIHRoZSBzY3JvbGwgZGlyZWN0aW9uIGlzIGZvcndhcmRcbiAgICAgICAgICAgIC8vIGFuZCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgaWYgdGhlIHNjcm9sbCBkaXJlY3Rpb24gaXMgYmFja3dhcmRzLlxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luID0gaW50ZXJzZWN0aW9ucy5wYXJ0aWFsLmJpZ2dlc3QuaW5kZXggPT09IGludGVyc2VjdGlvbnMucGFydGlhbC5maXJzdC5pbmRleCA/ICdlbmQnIDogJ3N0YXJ0JztcblxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoe1xuICAgICAgICAgICAgICBlbGVtZW50OiBpbnRlcnNlY3Rpb25zLnBhcnRpYWwuYmlnZ2VzdC5pbnRlcnNlY3Rpb24udGFyZ2V0IGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICAgIGlnbm9yZUZvcmNlZE9yaWdpbjogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBObyBzcGVjaWFsIGNhc2UuIEp1c3Qgc25hcCB0byB0aGUgYmlnZ2VzdCBpbnRlcnNlY3Rpb24uXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvRWxlbWVudCh7XG4gICAgICAgICAgICAgIGVsZW1lbnQ6IGludGVyc2VjdGlvbnMucGFydGlhbC5iaWdnZXN0LmludGVyc2VjdGlvbi50YXJnZXQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGlzYWJsZVNuYXBwaW5nJCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlU25hcHBpbmcoKSB7XG4gICAgdGhpcy5fZGlzYWJsZVNuYXBwaW5nJC5uZXh0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJldC1zY3JvbGxhYmxlLXdyYXBwZXJcIj5cbiAgPGRpdlxuICAgICNzY3JvbGxhYmxlXG4gICAgW2F0dHIucm9sZV09XCJzY3JvbGxhYmxlUm9sZSgpID8/IHVuZGVmaW5lZFwiXG4gICAgW2V0Q3Vyc29yRHJhZ1Njcm9sbF09XCJjdXJzb3JEcmFnU2Nyb2xsKCkgJiYgKCFpc0F0U3RhcnQoKSB8fCAhaXNBdEVuZCgpKVwiXG4gICAgW2FsbG93ZWREaXJlY3Rpb25dPVwiZGlyZWN0aW9uKClcIlxuICAgIFtuZ0NsYXNzXT1cInNjcm9sbGFibGVDbGFzcygpXCJcbiAgICAoY3Vyc29yRHJhZ1N0YXJ0KT1cInNldElzQ3Vyc29yRHJhZ2dpbmcodHJ1ZSlcIlxuICAgIChjdXJzb3JEcmFnRW5kKT1cInNldElzQ3Vyc29yRHJhZ2dpbmcoZmFsc2UpXCJcbiAgICBjbGFzcz1cImV0LXNjcm9sbGFibGUtY29udGFpbmVyXCJcbiAgPlxuICAgIDxkaXYgI2ZpcnN0RWxlbWVudCBjbGFzcz1cImV0LXNjcm9sbC1vYnNlcnZlci1maXJzdC1lbGVtZW50XCIgZXRTY3JvbGxhYmxlSWdub3JlQ2hpbGQ+PC9kaXY+XG4gICAgPG5nLWNvbnRlbnQgLz5cbiAgICA8ZGl2ICNsYXN0RWxlbWVudCBjbGFzcz1cImV0LXNjcm9sbC1vYnNlcnZlci1sYXN0LWVsZW1lbnRcIiBldFNjcm9sbGFibGVJZ25vcmVDaGlsZD48L2Rpdj5cbiAgPC9kaXY+XG5cbiAgQGlmIChyZW5kZXJNYXNrcygpKSB7XG4gICAgPGRpdiBjbGFzcz1cImV0LXNjcm9sbGFibGUtbWFza3NcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJldC1zY3JvbGxhYmxlLW1hc2sgZXQtc2Nyb2xsYWJsZS1tYXNrLS1zdGFydFwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImV0LXNjcm9sbGFibGUtbWFzayBldC1zY3JvbGxhYmxlLW1hc2stLWVuZFwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG5cbiAgQGlmIChyZW5kZXJCdXR0b25zSW5zaWRlKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1idXR0b25zXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9yd2FyZEJ1dHRvblRwbFwiIC8+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmFja3dhcmRCdXR0b25UcGxcIiAvPlxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cblxuQGlmIChyZW5kZXJCdXR0b25zSW5Gb290ZXIoKSB8fCAocmVuZGVyTmF2aWdhdGlvbigpICYmIHNjcm9sbGFibGVOYXZpZ2F0aW9uKCkubGVuZ3RoID4gMSkpIHtcbiAgPGRpdlxuICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICdldC1zY3JvbGxhYmxlLWZvb3Rlci0td2l0aC1uYXZpZ2F0aW9uJzogcmVuZGVyTmF2aWdhdGlvbigpLFxuICAgICAgJ2V0LXNjcm9sbGFibGUtZm9vdGVyLS13aXRoLWJ1dHRvbnMnOiByZW5kZXJCdXR0b25zSW5Gb290ZXIoKVxuICAgIH1cIlxuICAgIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1mb290ZXJcIlxuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gID5cbiAgICBAaWYgKHJlbmRlckJ1dHRvbnNJbkZvb3RlcigpKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9yd2FyZEJ1dHRvblRwbFwiIC8+XG4gICAgfVxuXG4gICAgQGlmIChyZW5kZXJOYXZpZ2F0aW9uKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJldC1zY3JvbGxhYmxlLXByb2dyZXNzLWJhclwiPlxuICAgICAgICA8ZGl2ICNuYXZpZ2F0aW9uRG90c0NvbnRhaW5lciBjbGFzcz1cImV0LXNjcm9sbGFibGUtZG90cy1jb250YWluZXJcIj5cbiAgICAgICAgICBAZm9yIChpdGVtIG9mIHNjcm9sbGFibGVOYXZpZ2F0aW9uKCk7IHRyYWNrIGk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICNuYXZpZ2F0aW9uRG90XG4gICAgICAgICAgICAgIFtjbGFzcy5ldC1zY3JvbGxhYmxlLW5hdmlnYXRpb24taXRlbS0tYWN0aXZlXT1cIml0ZW0uaXNBY3RpdmVcIlxuICAgICAgICAgICAgICBbY2xhc3MuZXQtc2Nyb2xsYWJsZS1uYXZpZ2F0aW9uLWl0ZW0tLWNsb3NlXT1cIlxuICAgICAgICAgICAgICAgIHNjcm9sbGFibGVOYXZpZ2F0aW9uKClbaSArIDFdPy5pc0FjdGl2ZSB8fCBzY3JvbGxhYmxlTmF2aWdhdGlvbigpW2kgLSAxXT8uaXNBY3RpdmVcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmV0LXNjcm9sbGFibGUtbmF2aWdhdGlvbi1pdGVtLS1mYXJdPVwiXG4gICAgICAgICAgICAgICAgIXNjcm9sbGFibGVOYXZpZ2F0aW9uKClbaSArIDFdPy5pc0FjdGl2ZSAmJiAhc2Nyb2xsYWJsZU5hdmlnYXRpb24oKVtpIC0gMV0/LmlzQWN0aXZlICYmICFpdGVtLmlzQWN0aXZlXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFthdHRyLmFjdGl2ZS1vZmZzZXRdPVwiaXRlbS5hY3RpdmVPZmZzZXRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2Nyb2xsVG9FbGVtZW50VmlhTmF2aWdhdGlvbihpKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1uYXZpZ2F0aW9uLWl0ZW1cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAocmVuZGVyQnV0dG9uc0luRm9vdGVyKCkpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJiYWNrd2FyZEJ1dHRvblRwbFwiIC8+XG4gICAgfVxuICA8L2Rpdj5cbn1cblxuPG5nLXRlbXBsYXRlICNmb3J3YXJkQnV0dG9uVHBsPlxuICA8YnV0dG9uXG4gICAgW2Rpc2FibGVkXT1cImlzQXRTdGFydCgpXCJcbiAgICAoY2xpY2spPVwic2Nyb2xsVG9TdGFydERpcmVjdGlvbigpXCJcbiAgICBjbGFzcz1cImV0LXNjcm9sbGFibGUtYnV0dG9uIGV0LXNjcm9sbGFibGUtYnV0dG9uLS1zdGFydFwiXG4gICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0YWJpbmRleD1cIi0xXCJcbiAgPlxuICAgIDxldC1jaGV2cm9uLWljb24gLz5cbiAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2JhY2t3YXJkQnV0dG9uVHBsPlxuICA8YnV0dG9uXG4gICAgW2Rpc2FibGVkXT1cImlzQXRFbmQoKVwiXG4gICAgKGNsaWNrKT1cInNjcm9sbFRvRW5kRGlyZWN0aW9uKClcIlxuICAgIGNsYXNzPVwiZXQtc2Nyb2xsYWJsZS1idXR0b24gZXQtc2Nyb2xsYWJsZS1idXR0b24tLWVuZFwiXG4gICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0YWJpbmRleD1cIi0xXCJcbiAgPlxuICAgIDxldC1jaGV2cm9uLWljb24gLz5cbiAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuIl19