structra-ui 0.1.13 → 0.1.15

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 (293) hide show
  1. package/package.json +6 -4
  2. package/app/_utils/date-pt-br.utils.d.ts +0 -24
  3. package/app/_utils/decimal-br.utils.d.ts +0 -52
  4. package/app/_utils/estados-br.data.d.ts +0 -10
  5. package/app/_utils/integer-br.utils.d.ts +0 -17
  6. package/app/_utils/integer-value.utils.d.ts +0 -5
  7. package/app/_utils/scroll/body-scroll-lock.util.d.ts +0 -44
  8. package/app/app-shell/_models/breadcrumb-item.model.d.ts +0 -13
  9. package/app/app-shell/app-shell-sidebar-template.directive.d.ts +0 -19
  10. package/app/app-shell/app-shell.component.d.ts +0 -41
  11. package/app/app-shell/breadcrumb/breadcrumb.component.d.ts +0 -10
  12. package/app/app-shell/index.d.ts +0 -19
  13. package/app/app-shell/sidebar/app-sidebar-toolbar.directive.d.ts +0 -14
  14. package/app/app-shell/sidebar/shell-sidebar-toggle.component.d.ts +0 -19
  15. package/app/app-shell/sidebar/sidebar.component.d.ts +0 -36
  16. package/app/app-shell/sidebar-reveal.constants.d.ts +0 -8
  17. package/app/app-shell/topbar/topbar.component.d.ts +0 -8
  18. package/app/app-shell/user-menu/user-menu.component.d.ts +0 -25
  19. package/app/buttons/base-button/base-button.component.d.ts +0 -43
  20. package/app/buttons/index.d.ts +0 -1
  21. package/app/data-display/_models/card-item-view.model.d.ts +0 -8
  22. package/app/data-display/_models/data-display.models.d.ts +0 -11
  23. package/app/data-display/_models/data-grid-column.model.d.ts +0 -13
  24. package/app/data-display/_models/index.d.ts +0 -2
  25. package/app/data-display/adaptive-data-view/adaptive-data-view.component.d.ts +0 -53
  26. package/app/data-display/card-list/card-list.component.d.ts +0 -70
  27. package/app/data-display/dashboard-section/dashboard-section.component.d.ts +0 -12
  28. package/app/data-display/data-card/data-card.component.d.ts +0 -16
  29. package/app/data-display/data-grid/data-grid-actions-cell-renderer.component.d.ts +0 -21
  30. package/app/data-display/data-grid/data-grid.component.d.ts +0 -76
  31. package/app/data-display/data-list/data-list.component.d.ts +0 -18
  32. package/app/data-display/data-toolbar/data-toolbar.component.d.ts +0 -6
  33. package/app/data-display/details-field/details-field.component.d.ts +0 -10
  34. package/app/data-display/details-view/details-view.component.d.ts +0 -26
  35. package/app/data-display/empty-state/empty-state-overlay.util.d.ts +0 -5
  36. package/app/data-display/empty-state/empty-state.component.d.ts +0 -13
  37. package/app/data-display/index.d.ts +0 -20
  38. package/app/data-display/list-item/list-item.component.d.ts +0 -22
  39. package/app/data-display/stat-card/stat-card.component.d.ts +0 -23
  40. package/app/data-display/status-badge/status-badge.component.d.ts +0 -17
  41. package/app/data-display/table-empty-state/table-empty-state.component.d.ts +0 -14
  42. package/app/data-display/table-toolbar/table-toolbar.component.d.ts +0 -11
  43. package/app/dialogs/_models/lib-dialog-size.model.d.ts +0 -6
  44. package/app/dialogs/_utils/app-lib-light-block-scroll-strategy.d.ts +0 -12
  45. package/app/dialogs/_utils/lib-dialog-panel-classes.d.ts +0 -3
  46. package/app/dialogs/app-dialog/app-dialog.component.d.ts +0 -71
  47. package/app/dialogs/app-dialog/dialog-footer.directive.d.ts +0 -6
  48. package/app/dialogs/confirm-dialog/confirm-dialog-data.model.d.ts +0 -13
  49. package/app/dialogs/confirm-dialog/confirm-dialog.component.d.ts +0 -20
  50. package/app/dialogs/confirm-dialog/confirm-dialog.service.d.ts +0 -17
  51. package/app/dialogs/index.d.ts +0 -14
  52. package/app/dialogs/loading-dialog/loading-dialog-data.model.d.ts +0 -7
  53. package/app/dialogs/loading-dialog/loading-dialog.component.d.ts +0 -9
  54. package/app/dialogs/loading-dialog/loading-dialog.service.d.ts +0 -15
  55. package/app/dialogs/toast/toast-host.component.d.ts +0 -13
  56. package/app/dialogs/toast/toast.models.d.ts +0 -26
  57. package/app/dialogs/toast/toast.service.d.ts +0 -17
  58. package/app/fields/checkbox-fields/_base/boolean-field.directive.d.ts +0 -42
  59. package/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.d.ts +0 -8
  60. package/app/fields/checkbox-fields/index.d.ts +0 -3
  61. package/app/fields/checkbox-fields/switch-field/switch-field.component.d.ts +0 -8
  62. package/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.d.ts +0 -62
  63. package/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.d.ts +0 -40
  64. package/app/fields/dropdown-fields/_base/dropdown-option-field.base.d.ts +0 -47
  65. package/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.d.ts +0 -18
  66. package/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.d.ts +0 -13
  67. package/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.d.ts +0 -7
  68. package/app/fields/dropdown-fields/_models/index.d.ts +0 -4
  69. package/app/fields/dropdown-fields/_models/select-option.model.d.ts +0 -5
  70. package/app/fields/dropdown-fields/_models/select-pagination.model.d.ts +0 -6
  71. package/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.d.ts +0 -84
  72. package/app/fields/dropdown-fields/index.d.ts +0 -7
  73. package/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.d.ts +0 -49
  74. package/app/fields/dropdown-fields/select-field/select-field.component.d.ts +0 -54
  75. package/app/fields/input-fields/_base/base-field.component.d.ts +0 -60
  76. package/app/fields/input-fields/_base/base-field.directive.d.ts +0 -102
  77. package/app/fields/input-fields/_base/masked-text-field.base.d.ts +0 -34
  78. package/app/fields/input-fields/_base/ng-control-field.directive.d.ts +0 -43
  79. package/app/fields/input-fields/_models/field-common-inputs.model.d.ts +0 -49
  80. package/app/fields/input-fields/_models/index.d.ts +0 -1
  81. package/app/fields/input-fields/_utils/mask-complete.validators.d.ts +0 -18
  82. package/app/fields/input-fields/_utils/mask-format.utils.d.ts +0 -13
  83. package/app/fields/input-fields/cep-field/cep-field.component.d.ts +0 -12
  84. package/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.d.ts +0 -20
  85. package/app/fields/input-fields/date-field/date-field.component.d.ts +0 -30
  86. package/app/fields/input-fields/decimal-field/decimal-field.component.d.ts +0 -17
  87. package/app/fields/input-fields/index.d.ts +0 -22
  88. package/app/fields/input-fields/input-mask-field/input-mask-field.component.d.ts +0 -16
  89. package/app/fields/input-fields/integer-field/integer-field.component.d.ts +0 -17
  90. package/app/fields/input-fields/password-field/password-field.component.d.ts +0 -30
  91. package/app/fields/input-fields/phone-field/phone-field.component.d.ts +0 -22
  92. package/app/fields/input-fields/text-field/text-field.component.d.ts +0 -16
  93. package/app/fields/input-fields/textarea-field/textarea-field.component.d.ts +0 -31
  94. package/app/form-layout/_models/form-layout.model.d.ts +0 -41
  95. package/app/form-layout/_models/form-tabs.model.d.ts +0 -1
  96. package/app/form-layout/_models/index.d.ts +0 -3
  97. package/app/form-layout/_models/validation-summary.model.d.ts +0 -8
  98. package/app/form-layout/form-actions/form-actions.component.d.ts +0 -21
  99. package/app/form-layout/form-col/form-col.component.d.ts +0 -25
  100. package/app/form-layout/form-group/form-group.component.d.ts +0 -125
  101. package/app/form-layout/form-group/form-path.utils.d.ts +0 -16
  102. package/app/form-layout/form-group/form-root-invalid-ui-refresh.util.d.ts +0 -8
  103. package/app/form-layout/form-row/form-row.component.d.ts +0 -14
  104. package/app/form-layout/form-section/form-section.component.d.ts +0 -13
  105. package/app/form-layout/form-tab/form-tab.component.d.ts +0 -32
  106. package/app/form-layout/form-tabs/form-tabs.component.d.ts +0 -44
  107. package/app/form-layout/index.d.ts +0 -14
  108. package/app/form-layout/layout-stack/layout-stack.component.d.ts +0 -25
  109. package/app/form-layout/validation-summary/validation-summary.component.d.ts +0 -105
  110. package/app/loading/skeleton-loading/index.d.ts +0 -6
  111. package/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.d.ts +0 -15
  112. package/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.d.ts +0 -10
  113. package/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.d.ts +0 -21
  114. package/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.d.ts +0 -17
  115. package/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.d.ts +0 -16
  116. package/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.d.ts +0 -17
  117. package/app/menus/_models/drawer-side.model.d.ts +0 -6
  118. package/app/menus/_models/drawer-size.model.d.ts +0 -6
  119. package/app/menus/_models/menu-dropdown-placement.model.d.ts +0 -10
  120. package/app/menus/_models/menu-item.model.d.ts +0 -47
  121. package/app/menus/_utils/menu-connected-positions.util.d.ts +0 -4
  122. package/app/menus/_utils/menu-rows.util.d.ts +0 -22
  123. package/app/menus/_utils/submenu-connected-positions.util.d.ts +0 -5
  124. package/app/menus/action-menu/action-menu.component.d.ts +0 -24
  125. package/app/menus/context-menu/context-menu.component.d.ts +0 -32
  126. package/app/menus/drawer/drawer.component.d.ts +0 -38
  127. package/app/menus/dropdown-menu/dropdown-menu.component.d.ts +0 -33
  128. package/app/menus/index.d.ts +0 -11
  129. package/app/menus/menu-divider/menu-divider.component.d.ts +0 -8
  130. package/app/menus/menu-group/menu-group.component.d.ts +0 -13
  131. package/app/menus/menu-list/menu-list.component.d.ts +0 -77
  132. package/app/overlay/_models/overlay-placement.model.d.ts +0 -9
  133. package/app/overlay/_utils/anchored-overlay-positions.util.d.ts +0 -9
  134. package/app/overlay/anchored-overlay/anchored-overlay.component.d.ts +0 -51
  135. package/app/overlay/index.d.ts +0 -20
  136. package/app/overlay/popover/popover-body-template.directive.d.ts +0 -7
  137. package/app/overlay/popover/popover-footer-template.directive.d.ts +0 -7
  138. package/app/overlay/popover/popover-trigger.directive.d.ts +0 -6
  139. package/app/overlay/popover/popover.component.d.ts +0 -38
  140. package/app/overlay/tooltip/tooltip-panel-template.directive.d.ts +0 -10
  141. package/app/overlay/tooltip/tooltip.component.d.ts +0 -40
  142. package/app/theme/app-theme.service.d.ts +0 -25
  143. package/app/theme/index.d.ts +0 -1
  144. package/esm2022/app/_utils/date-pt-br.utils.mjs +0 -82
  145. package/esm2022/app/_utils/decimal-br.utils.mjs +0 -154
  146. package/esm2022/app/_utils/estados-br.data.mjs +0 -37
  147. package/esm2022/app/_utils/integer-br.utils.mjs +0 -48
  148. package/esm2022/app/_utils/integer-value.utils.mjs +0 -19
  149. package/esm2022/app/_utils/scroll/body-scroll-lock.util.mjs +0 -97
  150. package/esm2022/app/app-shell/_models/breadcrumb-item.model.mjs +0 -2
  151. package/esm2022/app/app-shell/app-shell-sidebar-template.directive.mjs +0 -29
  152. package/esm2022/app/app-shell/app-shell.component.mjs +0 -105
  153. package/esm2022/app/app-shell/breadcrumb/breadcrumb.component.mjs +0 -18
  154. package/esm2022/app/app-shell/index.mjs +0 -19
  155. package/esm2022/app/app-shell/sidebar/app-sidebar-toolbar.directive.mjs +0 -23
  156. package/esm2022/app/app-shell/sidebar/shell-sidebar-toggle.component.mjs +0 -36
  157. package/esm2022/app/app-shell/sidebar/sidebar.component.mjs +0 -84
  158. package/esm2022/app/app-shell/sidebar-reveal.constants.mjs +0 -9
  159. package/esm2022/app/app-shell/topbar/topbar.component.mjs +0 -14
  160. package/esm2022/app/app-shell/user-menu/user-menu.component.mjs +0 -52
  161. package/esm2022/app/buttons/base-button/base-button.component.mjs +0 -97
  162. package/esm2022/app/buttons/index.mjs +0 -2
  163. package/esm2022/app/data-display/_models/card-item-view.model.mjs +0 -2
  164. package/esm2022/app/data-display/_models/data-display.models.mjs +0 -2
  165. package/esm2022/app/data-display/_models/data-grid-column.model.mjs +0 -2
  166. package/esm2022/app/data-display/_models/index.mjs +0 -2
  167. package/esm2022/app/data-display/adaptive-data-view/adaptive-data-view.component.mjs +0 -124
  168. package/esm2022/app/data-display/card-list/card-list.component.mjs +0 -208
  169. package/esm2022/app/data-display/dashboard-section/dashboard-section.component.mjs +0 -25
  170. package/esm2022/app/data-display/data-card/data-card.component.mjs +0 -40
  171. package/esm2022/app/data-display/data-grid/data-grid-actions-cell-renderer.component.mjs +0 -41
  172. package/esm2022/app/data-display/data-grid/data-grid.component.mjs +0 -253
  173. package/esm2022/app/data-display/data-list/data-list.component.mjs +0 -40
  174. package/esm2022/app/data-display/data-toolbar/data-toolbar.component.mjs +0 -12
  175. package/esm2022/app/data-display/details-field/details-field.component.mjs +0 -21
  176. package/esm2022/app/data-display/details-view/details-view.component.mjs +0 -44
  177. package/esm2022/app/data-display/empty-state/empty-state-overlay.util.mjs +0 -19
  178. package/esm2022/app/data-display/empty-state/empty-state.component.mjs +0 -30
  179. package/esm2022/app/data-display/index.mjs +0 -19
  180. package/esm2022/app/data-display/list-item/list-item.component.mjs +0 -59
  181. package/esm2022/app/data-display/stat-card/stat-card.component.mjs +0 -59
  182. package/esm2022/app/data-display/status-badge/status-badge.component.mjs +0 -41
  183. package/esm2022/app/data-display/table-empty-state/table-empty-state.component.mjs +0 -31
  184. package/esm2022/app/data-display/table-toolbar/table-toolbar.component.mjs +0 -22
  185. package/esm2022/app/dialogs/_models/lib-dialog-size.model.mjs +0 -8
  186. package/esm2022/app/dialogs/_utils/app-lib-light-block-scroll-strategy.mjs +0 -22
  187. package/esm2022/app/dialogs/_utils/lib-dialog-panel-classes.mjs +0 -6
  188. package/esm2022/app/dialogs/app-dialog/app-dialog.component.mjs +0 -200
  189. package/esm2022/app/dialogs/app-dialog/dialog-footer.directive.mjs +0 -15
  190. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog-data.model.mjs +0 -2
  191. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.component.mjs +0 -36
  192. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.service.mjs +0 -47
  193. package/esm2022/app/dialogs/index.mjs +0 -12
  194. package/esm2022/app/dialogs/loading-dialog/loading-dialog-data.model.mjs +0 -2
  195. package/esm2022/app/dialogs/loading-dialog/loading-dialog.component.mjs +0 -19
  196. package/esm2022/app/dialogs/loading-dialog/loading-dialog.service.mjs +0 -38
  197. package/esm2022/app/dialogs/toast/toast-host.component.mjs +0 -65
  198. package/esm2022/app/dialogs/toast/toast.models.mjs +0 -2
  199. package/esm2022/app/dialogs/toast/toast.service.mjs +0 -76
  200. package/esm2022/app/fields/checkbox-fields/_base/boolean-field.directive.mjs +0 -158
  201. package/esm2022/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.mjs +0 -36
  202. package/esm2022/app/fields/checkbox-fields/index.mjs +0 -4
  203. package/esm2022/app/fields/checkbox-fields/switch-field/switch-field.component.mjs +0 -35
  204. package/esm2022/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.mjs +0 -117
  205. package/esm2022/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.mjs +0 -152
  206. package/esm2022/app/fields/dropdown-fields/_base/dropdown-option-field.base.mjs +0 -149
  207. package/esm2022/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.mjs +0 -32
  208. package/esm2022/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.mjs +0 -2
  209. package/esm2022/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.mjs +0 -2
  210. package/esm2022/app/fields/dropdown-fields/_models/index.mjs +0 -2
  211. package/esm2022/app/fields/dropdown-fields/_models/select-option.model.mjs +0 -2
  212. package/esm2022/app/fields/dropdown-fields/_models/select-pagination.model.mjs +0 -2
  213. package/esm2022/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.mjs +0 -520
  214. package/esm2022/app/fields/dropdown-fields/index.mjs +0 -7
  215. package/esm2022/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.mjs +0 -379
  216. package/esm2022/app/fields/dropdown-fields/select-field/select-field.component.mjs +0 -359
  217. package/esm2022/app/fields/input-fields/_base/base-field.component.mjs +0 -151
  218. package/esm2022/app/fields/input-fields/_base/base-field.directive.mjs +0 -224
  219. package/esm2022/app/fields/input-fields/_base/masked-text-field.base.mjs +0 -135
  220. package/esm2022/app/fields/input-fields/_base/ng-control-field.directive.mjs +0 -127
  221. package/esm2022/app/fields/input-fields/_models/field-common-inputs.model.mjs +0 -2
  222. package/esm2022/app/fields/input-fields/_models/index.mjs +0 -2
  223. package/esm2022/app/fields/input-fields/_utils/mask-complete.validators.mjs +0 -61
  224. package/esm2022/app/fields/input-fields/_utils/mask-format.utils.mjs +0 -40
  225. package/esm2022/app/fields/input-fields/cep-field/cep-field.component.mjs +0 -48
  226. package/esm2022/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.mjs +0 -61
  227. package/esm2022/app/fields/input-fields/date-field/date-field.component.mjs +0 -147
  228. package/esm2022/app/fields/input-fields/decimal-field/decimal-field.component.mjs +0 -166
  229. package/esm2022/app/fields/input-fields/index.mjs +0 -22
  230. package/esm2022/app/fields/input-fields/input-mask-field/input-mask-field.component.mjs +0 -52
  231. package/esm2022/app/fields/input-fields/integer-field/integer-field.component.mjs +0 -143
  232. package/esm2022/app/fields/input-fields/password-field/password-field.component.mjs +0 -130
  233. package/esm2022/app/fields/input-fields/phone-field/phone-field.component.mjs +0 -66
  234. package/esm2022/app/fields/input-fields/text-field/text-field.component.mjs +0 -90
  235. package/esm2022/app/fields/input-fields/textarea-field/textarea-field.component.mjs +0 -125
  236. package/esm2022/app/form-layout/_models/form-layout.model.mjs +0 -48
  237. package/esm2022/app/form-layout/_models/form-tabs.model.mjs +0 -2
  238. package/esm2022/app/form-layout/_models/index.mjs +0 -2
  239. package/esm2022/app/form-layout/_models/validation-summary.model.mjs +0 -2
  240. package/esm2022/app/form-layout/form-actions/form-actions.component.mjs +0 -55
  241. package/esm2022/app/form-layout/form-col/form-col.component.mjs +0 -76
  242. package/esm2022/app/form-layout/form-group/form-group.component.mjs +0 -358
  243. package/esm2022/app/form-layout/form-group/form-path.utils.mjs +0 -65
  244. package/esm2022/app/form-layout/form-group/form-root-invalid-ui-refresh.util.mjs +0 -54
  245. package/esm2022/app/form-layout/form-row/form-row.component.mjs +0 -49
  246. package/esm2022/app/form-layout/form-section/form-section.component.mjs +0 -43
  247. package/esm2022/app/form-layout/form-tab/form-tab.component.mjs +0 -67
  248. package/esm2022/app/form-layout/form-tabs/form-tabs.component.mjs +0 -126
  249. package/esm2022/app/form-layout/index.mjs +0 -14
  250. package/esm2022/app/form-layout/layout-stack/layout-stack.component.mjs +0 -56
  251. package/esm2022/app/form-layout/validation-summary/validation-summary.component.mjs +0 -343
  252. package/esm2022/app/loading/skeleton-loading/index.mjs +0 -7
  253. package/esm2022/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.mjs +0 -43
  254. package/esm2022/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.mjs +0 -23
  255. package/esm2022/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.mjs +0 -34
  256. package/esm2022/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.mjs +0 -38
  257. package/esm2022/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.mjs +0 -37
  258. package/esm2022/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.mjs +0 -45
  259. package/esm2022/app/menus/_models/drawer-side.model.mjs +0 -8
  260. package/esm2022/app/menus/_models/drawer-size.model.mjs +0 -8
  261. package/esm2022/app/menus/_models/menu-dropdown-placement.model.mjs +0 -12
  262. package/esm2022/app/menus/_models/menu-item.model.mjs +0 -6
  263. package/esm2022/app/menus/_utils/menu-connected-positions.util.mjs +0 -41
  264. package/esm2022/app/menus/_utils/menu-rows.util.mjs +0 -39
  265. package/esm2022/app/menus/_utils/submenu-connected-positions.util.mjs +0 -23
  266. package/esm2022/app/menus/action-menu/action-menu.component.mjs +0 -48
  267. package/esm2022/app/menus/context-menu/context-menu.component.mjs +0 -112
  268. package/esm2022/app/menus/drawer/drawer.component.mjs +0 -142
  269. package/esm2022/app/menus/dropdown-menu/dropdown-menu.component.mjs +0 -99
  270. package/esm2022/app/menus/index.mjs +0 -11
  271. package/esm2022/app/menus/menu-divider/menu-divider.component.mjs +0 -14
  272. package/esm2022/app/menus/menu-group/menu-group.component.mjs +0 -32
  273. package/esm2022/app/menus/menu-list/menu-list.component.mjs +0 -399
  274. package/esm2022/app/overlay/_models/overlay-placement.model.mjs +0 -11
  275. package/esm2022/app/overlay/_utils/anchored-overlay-positions.util.mjs +0 -84
  276. package/esm2022/app/overlay/anchored-overlay/anchored-overlay.component.mjs +0 -121
  277. package/esm2022/app/overlay/index.mjs +0 -21
  278. package/esm2022/app/overlay/popover/popover-body-template.directive.mjs +0 -17
  279. package/esm2022/app/overlay/popover/popover-footer-template.directive.mjs +0 -17
  280. package/esm2022/app/overlay/popover/popover-trigger.directive.mjs +0 -15
  281. package/esm2022/app/overlay/popover/popover.component.mjs +0 -93
  282. package/esm2022/app/overlay/tooltip/tooltip-panel-template.directive.mjs +0 -20
  283. package/esm2022/app/overlay/tooltip/tooltip.component.mjs +0 -118
  284. package/esm2022/app/theme/app-theme.service.mjs +0 -49
  285. package/esm2022/app/theme/index.mjs +0 -2
  286. package/esm2022/structra-public-api.mjs +0 -18
  287. package/esm2022/structra-ui.mjs +0 -5
  288. package/esm2022/structra-version.mjs +0 -3
  289. package/fesm2022/structra-ui.mjs +0 -8971
  290. package/fesm2022/structra-ui.mjs.map +0 -1
  291. package/index.d.ts +0 -5
  292. package/structra-public-api.d.ts +0 -17
  293. package/structra-version.d.ts +0 -2
@@ -1,520 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, ViewChild, forwardRef, inject, numberAttribute, } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { BaseFieldComponent } from '../../input-fields/_base/base-field.component';
4
- import { DropdownOptionFieldBase } from '../_base/dropdown-option-field.base';
5
- import { DropdownBaseComponent } from '../_base/dropdown-base/dropdown-base.component';
6
- import { scheduleCloseDropdownPanelOnTriggerBlur } from '../_base/dropdown-trigger-blur.util';
7
- import { SkeletonListComponent } from '../../../loading/skeleton-loading';
8
- import * as i0 from "@angular/core";
9
- var DropdownSearchOpenMode;
10
- (function (DropdownSearchOpenMode) {
11
- DropdownSearchOpenMode["Default"] = "default";
12
- DropdownSearchOpenMode["KeepInput"] = "keepInput";
13
- })(DropdownSearchOpenMode || (DropdownSearchOpenMode = {}));
14
- export class DropdownSearchFieldComponent extends DropdownOptionFieldBase {
15
- constructor() {
16
- super(...arguments);
17
- this.hostRef = inject((ElementRef));
18
- this.pageSize = 5;
19
- this.hasMore = false;
20
- this.loadingMore = false;
21
- /**
22
- * Após parar de digitar, dispara a mesma pesquisa que Enter (`pageRequested` com `query`).
23
- * `0` desativa (só Enter pesquisa).
24
- */
25
- this.searchDebounceMs = 350;
26
- this.pageRequested = new EventEmitter();
27
- this.searchQuery = '';
28
- this.committedQuery = '';
29
- this.panelOpen = false;
30
- this.panelOverlayWidth = 0;
31
- this.scrollLoadTimer = null;
32
- this.searchDebounceTimer = null;
33
- }
34
- get hostInvalidClass() {
35
- return this.uiInvalid;
36
- }
37
- afterWriteValue(value) {
38
- this.searchQuery =
39
- value == null ? '' : (this.findOptionByValue(value)?.label ?? '');
40
- this.committedQuery = '';
41
- this.syncActiveIndexFromValue(value);
42
- this.cdr.markForCheck();
43
- }
44
- get displayValue() {
45
- const opt = this.findOptionByValue(this.internalValue);
46
- return opt?.label ?? '';
47
- }
48
- get optionsListId() {
49
- return `${this.controlId}-search-list`;
50
- }
51
- /**
52
- * Com valor selecionado e painel fechado, o texto é só exibição do rótulo;
53
- * edição só com o painel aberto (pesquisa).
54
- */
55
- get isLockedSelectionDisplay() {
56
- return (!this.disabled &&
57
- !this.readonly &&
58
- this.filledUi &&
59
- !this.panelOpen);
60
- }
61
- /** `readonly` nativo: prop do campo ou bloqueio de exibição da seleção. */
62
- get isNativeInputReadonly() {
63
- if (this.disabled) {
64
- return false;
65
- }
66
- return this.readonly || this.isLockedSelectionDisplay;
67
- }
68
- ngOnChanges(changes) {
69
- super.ngOnChanges(changes);
70
- if (!this.panelOpen || this.loadingMore) {
71
- return;
72
- }
73
- if (changes['loadingMore'] || changes['options']) {
74
- setTimeout(() => this.tryEmitIfShortList(), 0);
75
- }
76
- }
77
- ngOnDestroy() {
78
- if (this.scrollLoadTimer != null) {
79
- clearTimeout(this.scrollLoadTimer);
80
- }
81
- this.clearSearchDebounce();
82
- }
83
- onDropdownOpenChange(next, openMode = DropdownSearchOpenMode.Default) {
84
- if (!next) {
85
- if (!this.panelOpen) {
86
- return;
87
- }
88
- this.panelOpen = false;
89
- this.clearSearchDebounce();
90
- if (this.scrollLoadTimer != null) {
91
- clearTimeout(this.scrollLoadTimer);
92
- this.scrollLoadTimer = null;
93
- }
94
- setTimeout(() => this.focusMainInputIfFocusLost(), 0);
95
- this.cdr.markForCheck();
96
- return;
97
- }
98
- if (openMode === DropdownSearchOpenMode.Default) {
99
- // Não limpar o texto quando já há seleção (comportamento alinhado ao select).
100
- this.committedQuery = '';
101
- if (this.filledUi) {
102
- const opt = this.findOptionByValue(this.internalValue);
103
- this.searchQuery = opt?.label ?? '';
104
- }
105
- else {
106
- this.searchQuery = '';
107
- }
108
- }
109
- else {
110
- this.committedQuery = this.searchQuery.trim();
111
- }
112
- this.panelOpen = true;
113
- this.syncActiveIndexFromValue(this.internalValue);
114
- const w = this.hostRef.nativeElement.getBoundingClientRect().width;
115
- this.panelOverlayWidth = Math.max(0, Math.ceil(w));
116
- if (!this.loadingMore) {
117
- this.pageRequested.emit({
118
- page: 0,
119
- pageSize: this.pageSize,
120
- query: this.committedQuery,
121
- });
122
- }
123
- setTimeout(() => this.tryEmitIfShortList(), 0);
124
- setTimeout(() => this.tryEmitIfShortList(), 80);
125
- setTimeout(() => {
126
- document.getElementById(this.controlId)?.focus();
127
- }, 0);
128
- this.cdr.markForCheck();
129
- }
130
- onMainInput(ev) {
131
- if (this.isNativeInputReadonly) {
132
- return;
133
- }
134
- const el = ev.target;
135
- this.searchQuery = el.value;
136
- this.scheduleDebouncedSearch();
137
- this.cdr.markForCheck();
138
- }
139
- onMainKeydown(ev) {
140
- if (this.disabled || this.readonly) {
141
- return;
142
- }
143
- if (ev.key === 'Delete' || ev.key === 'Backspace') {
144
- if (this.panelOpen) {
145
- return;
146
- }
147
- if (this.filledUi) {
148
- ev.preventDefault();
149
- ev.stopPropagation();
150
- this.onClear();
151
- }
152
- return;
153
- }
154
- if (ev.key === 'Escape' && this.panelOpen) {
155
- ev.preventDefault();
156
- this.onDropdownOpenChange(false);
157
- return;
158
- }
159
- if (this.panelOpen && this.listOptions.length > 0) {
160
- switch (ev.key) {
161
- case 'ArrowDown':
162
- ev.preventDefault();
163
- this.activeIndex = this.stepActive(1);
164
- this.cdr.markForCheck();
165
- return;
166
- case 'ArrowUp':
167
- ev.preventDefault();
168
- this.activeIndex = this.stepActive(-1);
169
- this.cdr.markForCheck();
170
- return;
171
- case 'Home':
172
- ev.preventDefault();
173
- this.activeIndex = this.firstEnabledIndex();
174
- this.cdr.markForCheck();
175
- return;
176
- case 'End':
177
- ev.preventDefault();
178
- this.activeIndex = this.lastEnabledIndex();
179
- this.cdr.markForCheck();
180
- return;
181
- default:
182
- break;
183
- }
184
- }
185
- if (ev.key === 'Enter') {
186
- ev.preventDefault();
187
- ev.stopPropagation();
188
- if (!this.panelOpen) {
189
- if (this.searchQuery.trim() === '' ||
190
- this.isLockedSelectionDisplay) {
191
- this.onDropdownOpenChange(true, DropdownSearchOpenMode.Default);
192
- }
193
- else {
194
- this.runSearch();
195
- }
196
- return;
197
- }
198
- const q = this.searchQuery.trim();
199
- const dirty = q !== this.committedQuery;
200
- if (dirty) {
201
- // Lista pedida com query vazia mas o input mostra o rótulo da seleção — não é pesquisa nova.
202
- if (this.isDisplayingSelectedLabelWithUnfilteredList()) {
203
- if (this.listOptions.length > 0) {
204
- this.commitActiveOption();
205
- }
206
- return;
207
- }
208
- this.runSearch();
209
- return;
210
- }
211
- if (this.listOptions.length > 0) {
212
- this.commitActiveOption();
213
- }
214
- return;
215
- }
216
- }
217
- /**
218
- * Ao reabrir, `committedQuery` é '' (lista sem filtro) e o texto do input é o rótulo do valor —
219
- * `q !== committedQuery` seria true sem o usuário ter pesquisado; Enter deve confirmar opção.
220
- */
221
- isDisplayingSelectedLabelWithUnfilteredList() {
222
- if (!this.filledUi || this.committedQuery !== '') {
223
- return false;
224
- }
225
- const label = this.findOptionByValue(this.internalValue)?.label?.trim();
226
- if (label == null || label.length === 0) {
227
- return false;
228
- }
229
- return this.searchQuery.trim() === label;
230
- }
231
- onMainBlur(ev) {
232
- const triggerRoot = this.dropdownTriggerRootRef?.nativeElement ?? this.hostRef.nativeElement;
233
- scheduleCloseDropdownPanelOnTriggerBlur({
234
- triggerRoot,
235
- isPanelOpen: () => this.panelOpen,
236
- closePanel: () => this.onDropdownOpenChange(false),
237
- notifyTouched: () => this.notifyTouched(),
238
- blurRelatedTarget: ev?.relatedTarget ?? null,
239
- afterBlur: () => this.clearOrphanSearchTextAfterBlur(),
240
- });
241
- }
242
- /**
243
- * Sem valor no modelo: remove texto livre deixado no input (ex.: pesquisa sem escolha válida).
244
- * Não altera o `FormControl` — mantém-se `null`/vazio e o estado inválido (ex.: obrigatório) continua visível.
245
- */
246
- clearOrphanSearchTextAfterBlur() {
247
- if (this.disabled || this.readonly) {
248
- return;
249
- }
250
- const v = this.internalValue;
251
- if (v != null && v !== '') {
252
- return;
253
- }
254
- if (this.searchQuery.trim() === '') {
255
- return;
256
- }
257
- this.searchQuery = '';
258
- this.committedQuery = '';
259
- this.cdr.markForCheck();
260
- }
261
- /** Escape com foco no limpar/prefixo do `base-field` (fora do input da origem). */
262
- onDropdownHostEscape(ev) {
263
- if (!this.panelOpen || ev.key !== 'Escape') {
264
- return;
265
- }
266
- ev.preventDefault();
267
- this.onDropdownOpenChange(false);
268
- }
269
- onTriggerKeydown(ev) {
270
- if (this.disabled || this.readonly) {
271
- return;
272
- }
273
- if ((ev.key === 'Delete' || ev.key === 'Backspace') &&
274
- this.filledUi &&
275
- !this.panelOpen) {
276
- ev.preventDefault();
277
- this.onClear();
278
- return;
279
- }
280
- if (this.panelOpen) {
281
- return;
282
- }
283
- if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {
284
- ev.preventDefault();
285
- this.onDropdownOpenChange(true, DropdownSearchOpenMode.Default);
286
- }
287
- }
288
- /** Enter/Espaço com foco na linha da opção (tabindex). */
289
- onOptionRowKeydown(ev, opt) {
290
- if (opt.disabled || this.disabled || this.readonly) {
291
- return;
292
- }
293
- if (ev.key !== 'Enter' && ev.key !== ' ') {
294
- return;
295
- }
296
- ev.preventDefault();
297
- ev.stopPropagation();
298
- this.selectOption(opt);
299
- }
300
- /** Foco na lista (ex.: Tab): Delete/Backspace limpam a seleção. */
301
- onSearchListKeydown(ev) {
302
- if (ev.key === 'Escape') {
303
- ev.preventDefault();
304
- this.onDropdownOpenChange(false);
305
- return;
306
- }
307
- if (ev.key !== 'Delete' && ev.key !== 'Backspace') {
308
- return;
309
- }
310
- if (this.disabled || this.readonly || !this.filledUi) {
311
- return;
312
- }
313
- ev.preventDefault();
314
- ev.stopPropagation();
315
- this.onClear();
316
- }
317
- focusMainInputIfFocusLost() {
318
- const a = document.activeElement;
319
- if (a === document.body || a === document.documentElement || a == null) {
320
- document.getElementById(this.controlId)?.focus({ preventScroll: true });
321
- }
322
- }
323
- scheduleDebouncedSearch() {
324
- if (this.searchDebounceMs <= 0) {
325
- return;
326
- }
327
- if (this.searchDebounceTimer != null) {
328
- clearTimeout(this.searchDebounceTimer);
329
- }
330
- this.searchDebounceTimer = setTimeout(() => {
331
- this.searchDebounceTimer = null;
332
- this.applyDebouncedSearch();
333
- }, this.searchDebounceMs);
334
- }
335
- clearSearchDebounce() {
336
- if (this.searchDebounceTimer != null) {
337
- clearTimeout(this.searchDebounceTimer);
338
- this.searchDebounceTimer = null;
339
- }
340
- }
341
- /**
342
- * Alinha-se ao Enter: só dispara se `query` mudou em relação a `committedQuery`;
343
- * com painel fechado, só se houver texto pesquisável (como Enter sem abrir vazio).
344
- */
345
- applyDebouncedSearch() {
346
- if (this.disabled || this.readonly || this.isNativeInputReadonly) {
347
- return;
348
- }
349
- const q = this.searchQuery.trim();
350
- if (q === this.committedQuery) {
351
- return;
352
- }
353
- if (!this.panelOpen) {
354
- if (q === '' || this.isLockedSelectionDisplay) {
355
- return;
356
- }
357
- this.runSearch();
358
- return;
359
- }
360
- if (this.isDisplayingSelectedLabelWithUnfilteredList()) {
361
- return;
362
- }
363
- this.runSearch();
364
- }
365
- runSearch() {
366
- this.clearSearchDebounce();
367
- if (this.disabled || this.readonly) {
368
- return;
369
- }
370
- if (!this.panelOpen) {
371
- this.onDropdownOpenChange(true, DropdownSearchOpenMode.KeepInput);
372
- return;
373
- }
374
- const q = this.searchQuery.trim();
375
- this.committedQuery = q;
376
- this.pageRequested.emit({
377
- page: 0,
378
- pageSize: this.pageSize,
379
- query: q,
380
- });
381
- this.cdr.markForCheck();
382
- }
383
- onOptionsListScroll(ev) {
384
- if (this.loadingMore || !this.hasMore) {
385
- return;
386
- }
387
- const el = ev.target;
388
- if (this.options.length === 0) {
389
- return;
390
- }
391
- if (this.scrollLoadTimer != null) {
392
- clearTimeout(this.scrollLoadTimer);
393
- }
394
- this.scrollLoadTimer = setTimeout(() => {
395
- this.scrollLoadTimer = null;
396
- if (el.scrollHeight <= el.clientHeight + 8) {
397
- if (this.hasMore && !this.loadingMore && this.options.length > 0) {
398
- this.emitNextPageRequest();
399
- }
400
- return;
401
- }
402
- const nearBottom = el.scrollHeight - el.scrollTop - el.clientHeight <= 64;
403
- if (!nearBottom) {
404
- return;
405
- }
406
- this.emitNextPageRequest();
407
- }, 120);
408
- }
409
- emitNextPageRequest() {
410
- if (this.loadingMore || !this.hasMore) {
411
- return;
412
- }
413
- if (this.options.length === 0) {
414
- return;
415
- }
416
- const nextPage = Math.floor(this.options.length / this.pageSize);
417
- this.pageRequested.emit({
418
- page: nextPage,
419
- pageSize: this.pageSize,
420
- query: this.committedQuery,
421
- });
422
- }
423
- tryEmitIfShortList() {
424
- if (!this.panelOpen || this.loadingMore || !this.hasMore) {
425
- return;
426
- }
427
- if (this.options.length === 0) {
428
- return;
429
- }
430
- const el = document.getElementById(this.optionsListId);
431
- if (!el) {
432
- return;
433
- }
434
- if (el.scrollHeight <= el.clientHeight + 8) {
435
- this.emitNextPageRequest();
436
- }
437
- }
438
- openToggle() {
439
- if (this.disabled || this.readonly || this.loading) {
440
- return;
441
- }
442
- if (this.panelOpen) {
443
- this.onDropdownOpenChange(false);
444
- }
445
- else {
446
- this.onDropdownOpenChange(true, DropdownSearchOpenMode.Default);
447
- }
448
- }
449
- commitActiveOption() {
450
- const opt = this.listOptions[this.activeIndex];
451
- if (opt && !opt.disabled) {
452
- this.selectOption(opt);
453
- }
454
- }
455
- selectOption(opt) {
456
- if (this.disabled || this.readonly || opt.disabled) {
457
- return;
458
- }
459
- this.emitModelValue(opt.value);
460
- this.searchQuery = opt.label;
461
- this.committedQuery = '';
462
- this.onDropdownOpenChange(false);
463
- this.finishSelectionTouch();
464
- }
465
- onClear() {
466
- if (this.disabled || this.readonly) {
467
- return;
468
- }
469
- this.clearSearchDebounce();
470
- this.emitModelValue(null);
471
- this.searchQuery = '';
472
- this.committedQuery = '';
473
- this.onDropdownOpenChange(false);
474
- this.notifyTouched();
475
- this.cdr.markForCheck();
476
- }
477
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DropdownSearchFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
478
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DropdownSearchFieldComponent, isStandalone: true, selector: "app-dropdown-search-field", inputs: { pageSize: ["pageSize", "pageSize", numberAttribute], hasMore: "hasMore", loadingMore: "loadingMore", searchDebounceMs: ["searchDebounceMs", "searchDebounceMs", numberAttribute] }, outputs: { pageRequested: "pageRequested" }, host: { listeners: { "keydown": "onDropdownHostEscape($event)" }, properties: { "class.dropdown-search-field--invalid": "this.hostInvalidClass" } }, providers: [
479
- {
480
- provide: NG_VALUE_ACCESSOR,
481
- useExisting: forwardRef(() => DropdownSearchFieldComponent),
482
- multi: true,
483
- },
484
- ], viewQueries: [{ propertyName: "optionsPanelTpl", first: true, predicate: ["optionsPanelTpl"], descendants: true, static: true }, { propertyName: "dropdownTriggerRootRef", first: true, predicate: ["dropdownFieldTriggerRoot"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\"\n [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\"\n [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"dropdown-search-field__wrap\">\n <app-dropdown-base [open]=\"panelOpen\" [panelTemplate]=\"optionsPanelTpl\" [panelWidthPx]=\"panelOverlayWidth\"\n (openChange)=\"onDropdownOpenChange($event)\">\n <div #dropdownFieldTriggerRoot class=\"dropdown-search-field__origin\" appDropdownTrigger\n (keydown)=\"onTriggerKeydown($event)\">\n <input type=\"text\" class=\"dropdown-search-field__input\"\n [class.dropdown-search-field__input--locked]=\"isLockedSelectionDisplay\" [id]=\"controlId\"\n [attr.name]=\"name || null\" [disabled]=\"disabled\" [readonly]=\"isNativeInputReadonly\" [attr.placeholder]=\"''\"\n autocomplete=\"off\" spellcheck=\"false\"\n [attr.aria-expanded]=\"panelOpen\" aria-autocomplete=\"list\" role=\"combobox\"\n [attr.aria-controls]=\"panelOpen ? optionsListId : null\" [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\" [attr.aria-label]=\"floatLabelCaption || placeholder || 'Buscar e selecionar'\"\n [value]=\"searchQuery\" (input)=\"onMainInput($event)\" (keydown)=\"onMainKeydown($event)\"\n (blur)=\"onMainBlur($event)\" />\n <button type=\"button\" class=\"dropdown-search-field__chevron-btn\" tabindex=\"-1\" [disabled]=\"disabled || readonly\"\n [attr.aria-expanded]=\"panelOpen\" aria-haspopup=\"listbox\" aria-label=\"Abrir lista\" (click)=\"openToggle()\">\n <i class=\"fa-solid fa-chevron-down dropdown-search-field__chevron-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </app-dropdown-base>\n </div>\n</app-base-field>\n\n<ng-template #optionsPanelTpl>\n <div class=\"dropdown-search-field__panel-inner\" (mousedown)=\"$event.preventDefault()\">\n <div class=\"dropdown-search-field__list\" [id]=\"optionsListId\" role=\"listbox\" tabindex=\"-1\"\n [attr.aria-label]=\"floatLabelCaption || 'Op\u00E7\u00F5es'\" (blur)=\"onMainBlur($event)\"\n (keydown)=\"onSearchListKeydown($event)\" (scroll)=\"onOptionsListScroll($event)\">\n @if (listOptions.length === 0 && (optionsLoading || loadingMore)) {\n <app-skeleton-list [rows]=\"8\" />\n }\n @for (opt of listOptions; track trackOption($index, opt)) {\n <div role=\"option\" class=\"dropdown-search-field__option\"\n [class.dropdown-search-field__option--disabled]=\"opt.disabled\"\n [class.dropdown-search-field__option--selected]=\"isSelected(opt)\"\n [class.dropdown-search-field__option--active]=\"!opt.disabled && activeIndex === $index\"\n [attr.tabindex]=\"opt.disabled ? null : -1\" [attr.aria-selected]=\"isSelected(opt)\" (click)=\"selectOption(opt)\"\n (keydown)=\"onOptionRowKeydown($event, opt)\">\n {{ opt.label }}\n </div>\n }\n @if (options.length > 0 && loadingMore) {\n <app-skeleton-list [rows]=\"1\" [leading]=\"false\" />\n }\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;box-sizing:border-box}:host ::ng-deep .base-field:not(.base-field--invalid):not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-float-border-focus);box-shadow:0 0 0 3px var(--ui-field-float-focus-ring)}:host ::ng-deep .base-field--invalid:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}:host ::ng-deep .base-field.base-field--readonly:not(.base-field--invalid):not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-readonly-border-focus);box-shadow:0 0 0 3px var(--ui-field-readonly-focus-ring)}:host ::ng-deep .base-field.base-field--invalid.base-field--readonly:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}.dropdown-search-field__wrap{display:flex;flex:1;align-items:stretch;min-width:0;width:100%;box-sizing:border-box}.dropdown-search-field__origin{display:flex;align-items:center;min-width:0;width:100%;min-height:calc(1.8rem + 1.35em);box-sizing:border-box}.dropdown-search-field__input{flex:1;margin:0;box-sizing:border-box;min-height:calc(1.8rem + 1.35em);padding:1.35rem .35rem .45rem .75rem;font-size:1rem;line-height:1.35;font-family:inherit;text-align:left;color:var(--ui-field-float-input-text);background:transparent;border:0;border-radius:0;box-shadow:none;cursor:text;display:block;width:100%;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-search-field__input:focus,.dropdown-search-field__input:focus-visible{outline:none;box-shadow:none}.dropdown-search-field__input:disabled{cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity)}.dropdown-search-field__input--locked:read-only:not(:disabled){cursor:default;opacity:1}.dropdown-search-field__input:read-only:not(:disabled):not(.dropdown-search-field__input--locked){cursor:default;opacity:1;color:var(--ui-field-readonly-input-text)}.dropdown-search-field__chevron-btn{display:flex;flex-shrink:0;align-items:center;justify-content:center;box-sizing:border-box;width:2rem;height:2rem;margin:0 .1rem;padding:0;border:0;border-radius:8px;background:transparent;color:var(--ui-field-float-prefix-color);cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,color .15s ease}.dropdown-search-field__chevron-btn:hover:not(:disabled){background:#5a7fa31f;color:var(--ui-field-float-label-top-color)}.dropdown-search-field__chevron-btn:focus,.dropdown-search-field__chevron-btn:focus-visible{outline:none;box-shadow:none}.dropdown-search-field__chevron-btn:disabled{cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity)}:host ::ng-deep .base-field--readonly:not(.base-field--disabled) .dropdown-search-field__chevron-btn:disabled{opacity:1;cursor:default;color:var(--ui-field-readonly-prefix-color)}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn{color:var(--ui-field-float-label-invalid-color)}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn .dropdown-search-field__chevron-icon{color:inherit}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn:hover:not(:disabled){background:#b91c1c1f}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn:focus,:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn:focus-visible{outline:none;box-shadow:none}.dropdown-search-field__chevron-icon{display:inline-flex;align-items:center;justify-content:center;padding-top:2px;font-size:.8rem;line-height:1}.dropdown-search-field__panel-inner{display:flex;flex-direction:column;max-height:min(280px,55vh);width:100%;box-sizing:border-box;background:var(--app-color-nav-surface, var(--app-color-surface, #fff))}.dropdown-search-field__list{margin:0;padding:.25rem 0;flex:1;min-height:0;width:100%;max-height:min(260px,52vh);box-sizing:border-box;outline:none;overflow-x:hidden;overflow-y:auto}.dropdown-search-field__loading{padding:.65rem .75rem;font-size:.85rem;line-height:1.35;color:var(--ui-field-float-label-color);text-align:center}.dropdown-search-field__option{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:.45rem .75rem;font-size:.95rem;line-height:1.35;cursor:pointer;color:var(--ui-field-float-input-text)}.dropdown-search-field__option--selected:not(.dropdown-search-field__option--disabled){background:var(--app-color-dropdown-option-selected-bg)}.dropdown-search-field__option--active:not(.dropdown-search-field__option--disabled):not(.dropdown-search-field__option--selected){background:var(--app-color-dropdown-option-highlight-bg)}.dropdown-search-field__option.dropdown-search-field__option--active.dropdown-search-field__option--selected:not(.dropdown-search-field__option--disabled){background:var(--app-color-dropdown-option-selected-bg-active)}.dropdown-search-field__option--disabled{opacity:.45;cursor:not-allowed}.dropdown-search-field__option:hover:not(.dropdown-search-field__option--disabled):not(.dropdown-search-field__option--selected){background:var(--app-color-dropdown-option-hover-bg)}.dropdown-search-field__option.dropdown-search-field__option--selected:hover:not(.dropdown-search-field__option--disabled){background:var(--app-color-dropdown-option-selected-hover-bg)}\n"], dependencies: [{ kind: "component", type: BaseFieldComponent, selector: "app-base-field", inputs: ["label", "errorMessage", "required", "showRequiredMark", "invalid", "filled", "disabled", "readonly", "inputId", "errorId", "showPrefixIcon", "prefixIcon", "clearable", "clearAriaLabel", "showSuffixSlot", "valueAlignEnd", "loading", "skeletonVariant", "mostrarMenuContexto", "contextMenuItems", "contextMenuId"], outputs: ["clear", "contextMenuSelect"] }, { kind: "component", type: DropdownBaseComponent, selector: "app-dropdown-base", inputs: ["open", "panelTemplate", "panelWidthPx", "closeOnEscape", "hasBackdrop", "connectedPositions", "pushConnectedOverlay", "bareOverlayPanel"], outputs: ["openChange"] }, { kind: "component", type: SkeletonListComponent, selector: "app-skeleton-list", inputs: ["rows", "leading", "rowGap", "lineHeight", "animate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
485
- }
486
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DropdownSearchFieldComponent, decorators: [{
487
- type: Component,
488
- args: [{ selector: 'app-dropdown-search-field', standalone: true, imports: [BaseFieldComponent, DropdownBaseComponent, SkeletonListComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
489
- {
490
- provide: NG_VALUE_ACCESSOR,
491
- useExisting: forwardRef(() => DropdownSearchFieldComponent),
492
- multi: true,
493
- },
494
- ], template: "<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\"\n [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\"\n [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"dropdown-search-field__wrap\">\n <app-dropdown-base [open]=\"panelOpen\" [panelTemplate]=\"optionsPanelTpl\" [panelWidthPx]=\"panelOverlayWidth\"\n (openChange)=\"onDropdownOpenChange($event)\">\n <div #dropdownFieldTriggerRoot class=\"dropdown-search-field__origin\" appDropdownTrigger\n (keydown)=\"onTriggerKeydown($event)\">\n <input type=\"text\" class=\"dropdown-search-field__input\"\n [class.dropdown-search-field__input--locked]=\"isLockedSelectionDisplay\" [id]=\"controlId\"\n [attr.name]=\"name || null\" [disabled]=\"disabled\" [readonly]=\"isNativeInputReadonly\" [attr.placeholder]=\"''\"\n autocomplete=\"off\" spellcheck=\"false\"\n [attr.aria-expanded]=\"panelOpen\" aria-autocomplete=\"list\" role=\"combobox\"\n [attr.aria-controls]=\"panelOpen ? optionsListId : null\" [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\" [attr.aria-label]=\"floatLabelCaption || placeholder || 'Buscar e selecionar'\"\n [value]=\"searchQuery\" (input)=\"onMainInput($event)\" (keydown)=\"onMainKeydown($event)\"\n (blur)=\"onMainBlur($event)\" />\n <button type=\"button\" class=\"dropdown-search-field__chevron-btn\" tabindex=\"-1\" [disabled]=\"disabled || readonly\"\n [attr.aria-expanded]=\"panelOpen\" aria-haspopup=\"listbox\" aria-label=\"Abrir lista\" (click)=\"openToggle()\">\n <i class=\"fa-solid fa-chevron-down dropdown-search-field__chevron-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </app-dropdown-base>\n </div>\n</app-base-field>\n\n<ng-template #optionsPanelTpl>\n <div class=\"dropdown-search-field__panel-inner\" (mousedown)=\"$event.preventDefault()\">\n <div class=\"dropdown-search-field__list\" [id]=\"optionsListId\" role=\"listbox\" tabindex=\"-1\"\n [attr.aria-label]=\"floatLabelCaption || 'Op\u00E7\u00F5es'\" (blur)=\"onMainBlur($event)\"\n (keydown)=\"onSearchListKeydown($event)\" (scroll)=\"onOptionsListScroll($event)\">\n @if (listOptions.length === 0 && (optionsLoading || loadingMore)) {\n <app-skeleton-list [rows]=\"8\" />\n }\n @for (opt of listOptions; track trackOption($index, opt)) {\n <div role=\"option\" class=\"dropdown-search-field__option\"\n [class.dropdown-search-field__option--disabled]=\"opt.disabled\"\n [class.dropdown-search-field__option--selected]=\"isSelected(opt)\"\n [class.dropdown-search-field__option--active]=\"!opt.disabled && activeIndex === $index\"\n [attr.tabindex]=\"opt.disabled ? null : -1\" [attr.aria-selected]=\"isSelected(opt)\" (click)=\"selectOption(opt)\"\n (keydown)=\"onOptionRowKeydown($event, opt)\">\n {{ opt.label }}\n </div>\n }\n @if (options.length > 0 && loadingMore) {\n <app-skeleton-list [rows]=\"1\" [leading]=\"false\" />\n }\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;box-sizing:border-box}:host ::ng-deep .base-field:not(.base-field--invalid):not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-float-border-focus);box-shadow:0 0 0 3px var(--ui-field-float-focus-ring)}:host ::ng-deep .base-field--invalid:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}:host ::ng-deep .base-field.base-field--readonly:not(.base-field--invalid):not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-readonly-border-focus);box-shadow:0 0 0 3px var(--ui-field-readonly-focus-ring)}:host ::ng-deep .base-field.base-field--invalid.base-field--readonly:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}.dropdown-search-field__wrap{display:flex;flex:1;align-items:stretch;min-width:0;width:100%;box-sizing:border-box}.dropdown-search-field__origin{display:flex;align-items:center;min-width:0;width:100%;min-height:calc(1.8rem + 1.35em);box-sizing:border-box}.dropdown-search-field__input{flex:1;margin:0;box-sizing:border-box;min-height:calc(1.8rem + 1.35em);padding:1.35rem .35rem .45rem .75rem;font-size:1rem;line-height:1.35;font-family:inherit;text-align:left;color:var(--ui-field-float-input-text);background:transparent;border:0;border-radius:0;box-shadow:none;cursor:text;display:block;width:100%;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dropdown-search-field__input:focus,.dropdown-search-field__input:focus-visible{outline:none;box-shadow:none}.dropdown-search-field__input:disabled{cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity)}.dropdown-search-field__input--locked:read-only:not(:disabled){cursor:default;opacity:1}.dropdown-search-field__input:read-only:not(:disabled):not(.dropdown-search-field__input--locked){cursor:default;opacity:1;color:var(--ui-field-readonly-input-text)}.dropdown-search-field__chevron-btn{display:flex;flex-shrink:0;align-items:center;justify-content:center;box-sizing:border-box;width:2rem;height:2rem;margin:0 .1rem;padding:0;border:0;border-radius:8px;background:transparent;color:var(--ui-field-float-prefix-color);cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,color .15s ease}.dropdown-search-field__chevron-btn:hover:not(:disabled){background:#5a7fa31f;color:var(--ui-field-float-label-top-color)}.dropdown-search-field__chevron-btn:focus,.dropdown-search-field__chevron-btn:focus-visible{outline:none;box-shadow:none}.dropdown-search-field__chevron-btn:disabled{cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity)}:host ::ng-deep .base-field--readonly:not(.base-field--disabled) .dropdown-search-field__chevron-btn:disabled{opacity:1;cursor:default;color:var(--ui-field-readonly-prefix-color)}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn{color:var(--ui-field-float-label-invalid-color)}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn .dropdown-search-field__chevron-icon{color:inherit}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn:hover:not(:disabled){background:#b91c1c1f}:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn:focus,:host.dropdown-search-field--invalid .dropdown-search-field__chevron-btn:focus-visible{outline:none;box-shadow:none}.dropdown-search-field__chevron-icon{display:inline-flex;align-items:center;justify-content:center;padding-top:2px;font-size:.8rem;line-height:1}.dropdown-search-field__panel-inner{display:flex;flex-direction:column;max-height:min(280px,55vh);width:100%;box-sizing:border-box;background:var(--app-color-nav-surface, var(--app-color-surface, #fff))}.dropdown-search-field__list{margin:0;padding:.25rem 0;flex:1;min-height:0;width:100%;max-height:min(260px,52vh);box-sizing:border-box;outline:none;overflow-x:hidden;overflow-y:auto}.dropdown-search-field__loading{padding:.65rem .75rem;font-size:.85rem;line-height:1.35;color:var(--ui-field-float-label-color);text-align:center}.dropdown-search-field__option{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:.45rem .75rem;font-size:.95rem;line-height:1.35;cursor:pointer;color:var(--ui-field-float-input-text)}.dropdown-search-field__option--selected:not(.dropdown-search-field__option--disabled){background:var(--app-color-dropdown-option-selected-bg)}.dropdown-search-field__option--active:not(.dropdown-search-field__option--disabled):not(.dropdown-search-field__option--selected){background:var(--app-color-dropdown-option-highlight-bg)}.dropdown-search-field__option.dropdown-search-field__option--active.dropdown-search-field__option--selected:not(.dropdown-search-field__option--disabled){background:var(--app-color-dropdown-option-selected-bg-active)}.dropdown-search-field__option--disabled{opacity:.45;cursor:not-allowed}.dropdown-search-field__option:hover:not(.dropdown-search-field__option--disabled):not(.dropdown-search-field__option--selected){background:var(--app-color-dropdown-option-hover-bg)}.dropdown-search-field__option.dropdown-search-field__option--selected:hover:not(.dropdown-search-field__option--disabled){background:var(--app-color-dropdown-option-selected-hover-bg)}\n"] }]
495
- }], propDecorators: { hostInvalidClass: [{
496
- type: HostBinding,
497
- args: ['class.dropdown-search-field--invalid']
498
- }], pageSize: [{
499
- type: Input,
500
- args: [{ transform: numberAttribute }]
501
- }], hasMore: [{
502
- type: Input
503
- }], loadingMore: [{
504
- type: Input
505
- }], searchDebounceMs: [{
506
- type: Input,
507
- args: [{ transform: numberAttribute }]
508
- }], pageRequested: [{
509
- type: Output
510
- }], optionsPanelTpl: [{
511
- type: ViewChild,
512
- args: ['optionsPanelTpl', { static: true }]
513
- }], dropdownTriggerRootRef: [{
514
- type: ViewChild,
515
- args: ['dropdownFieldTriggerRoot', { read: ElementRef }]
516
- }], onDropdownHostEscape: [{
517
- type: HostListener,
518
- args: ['keydown', ['$event']]
519
- }] } });
520
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tc2VhcmNoLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZmllbGRzL2Ryb3Bkb3duLWZpZWxkcy9kcm9wZG93bi1zZWFyY2gtZmllbGQvZHJvcGRvd24tc2VhcmNoLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZmllbGRzL2Ryb3Bkb3duLWZpZWxkcy9kcm9wZG93bi1zZWFyY2gtZmllbGQvZHJvcGRvd24tc2VhcmNoLWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUdOLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLGVBQWUsR0FDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDbkYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFHOUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdkYsT0FBTyxFQUFFLHVDQUF1QyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBRTFFLElBQUssc0JBR0o7QUFIRCxXQUFLLHNCQUFzQjtJQUN6Qiw2Q0FBbUIsQ0FBQTtJQUNuQixpREFBdUIsQ0FBQTtBQUN6QixDQUFDLEVBSEksc0JBQXNCLEtBQXRCLHNCQUFzQixRQUcxQjtBQWlCRCxNQUFNLE9BQU8sNEJBQ1gsU0FBUSx1QkFBdUI7SUFoQmpDOztRQW1CbUIsWUFBTyxHQUFHLE1BQU0sQ0FBQyxDQUFBLFVBQXVCLENBQUEsQ0FBQyxDQUFDO1FBT3BCLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDM0MsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUM3Qjs7O1dBR0c7UUFDb0MscUJBQWdCLEdBQUcsR0FBRyxDQUFDO1FBRTNDLGtCQUFhLEdBQzlCLElBQUksWUFBWSxFQUErQixDQUFDO1FBUWxELGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBRXBCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsc0JBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQ2Qsb0JBQWUsR0FBeUMsSUFBSSxDQUFDO1FBQzdELHdCQUFtQixHQUF5QyxJQUFJLENBQUM7S0FtZTFFO0lBaGdCQyxJQUNJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQTRCa0IsZUFBZSxDQUFDLEtBQXFCO1FBQ3RELElBQUksQ0FBQyxXQUFXO1lBQ2QsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkQsT0FBTyxHQUFHLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLGNBQWMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSx3QkFBd0I7UUFDMUIsT0FBTyxDQUNMLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDZCxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQ2QsSUFBSSxDQUFDLFFBQVE7WUFDYixDQUFDLElBQUksQ0FBQyxTQUFTLENBQ2hCLENBQUM7SUFDSixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLElBQUkscUJBQXFCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDeEQsQ0FBQztJQUVRLFdBQVcsQ0FBQyxPQUFzQjtRQUN6QyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN4QyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ2pELFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7WUFDakMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELG9CQUFvQixDQUNsQixJQUFhLEVBQ2IsV0FBbUMsc0JBQXNCLENBQUMsT0FBTztRQUVqRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNwQixPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDakMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDOUIsQ0FBQztZQUNELFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxRQUFRLEtBQUssc0JBQXNCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEQsOEVBQThFO1lBQzlFLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3RDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN4QixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEQsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDbkUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO2dCQUN0QixJQUFJLEVBQUUsQ0FBQztnQkFDUCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYzthQUMzQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9DLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbkQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ04sSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQVM7UUFDbkIsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUEwQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxhQUFhLENBQUMsRUFBaUI7UUFDN0IsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksRUFBRSxDQUFDLEdBQUcsS0FBSyxRQUFRLElBQUksRUFBRSxDQUFDLEdBQUcsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNsRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbEIsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQixFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNmLEtBQUssV0FBVztvQkFDZCxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDeEIsT0FBTztnQkFDVCxLQUFLLFNBQVM7b0JBQ1osRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDeEIsT0FBTztnQkFDVCxLQUFLLE1BQU07b0JBQ1QsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN4QixPQUFPO2dCQUNULEtBQUssS0FBSztvQkFDUixFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7b0JBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3hCLE9BQU87Z0JBQ1Q7b0JBQ0UsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxFQUFFLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDcEIsSUFDRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7b0JBQzlCLElBQUksQ0FBQyx3QkFBd0IsRUFDN0IsQ0FBQztvQkFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNsRSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNuQixDQUFDO2dCQUNELE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUN4QyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLDZGQUE2RjtnQkFDN0YsSUFBSSxJQUFJLENBQUMsMkNBQTJDLEVBQUUsRUFBRSxDQUFDO29CQUN2RCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUNoQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDNUIsQ0FBQztvQkFDRCxPQUFPO2dCQUNULENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNqQixPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSywyQ0FBMkM7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNqRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN4RSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFRCxVQUFVLENBQUMsRUFBZTtRQUN4QixNQUFNLFdBQVcsR0FDZixJQUFJLENBQUMsc0JBQXNCLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQzNFLHVDQUF1QyxDQUFDO1lBQ3RDLFdBQVc7WUFDWCxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFDakMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7WUFDbEQsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDekMsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLGFBQWEsSUFBSSxJQUFJO1lBQzVDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUU7U0FDdkQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLDhCQUE4QjtRQUNwQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQzFCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsbUZBQW1GO0lBRW5GLG9CQUFvQixDQUFDLEVBQWlCO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDM0MsT0FBTztRQUNULENBQUM7UUFDRCxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFpQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFDRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssV0FBVyxDQUFDO1lBQy9DLElBQUksQ0FBQyxRQUFRO1lBQ2IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUNmLENBQUM7WUFDRCxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksRUFBRSxDQUFDLEdBQUcsS0FBSyxXQUFXLElBQUksRUFBRSxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNuRCxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxrQkFBa0IsQ0FBQyxFQUFpQixFQUFFLEdBQTRCO1FBQ2hFLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuRCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksRUFBRSxDQUFDLEdBQUcsS0FBSyxPQUFPLElBQUksRUFBRSxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUN6QyxPQUFPO1FBQ1QsQ0FBQztRQUNELEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLG1CQUFtQixDQUFDLEVBQWlCO1FBQ25DLElBQUksRUFBRSxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4QixFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxFQUFFLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxFQUFFLENBQUMsR0FBRyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2xELE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckQsT0FBTztRQUNULENBQUM7UUFDRCxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU8seUJBQXlCO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDakMsSUFBSSxDQUFDLEtBQUssUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssUUFBUSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNILENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNyQyxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7WUFDaEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckMsWUFBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxvQkFBb0I7UUFDMUIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDakUsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM5QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2dCQUM5QyxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLDJDQUEyQyxFQUFFLEVBQUUsQ0FBQztZQUN2RCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEUsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ3RCLElBQUksRUFBRSxDQUFDO1lBQ1AsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLEtBQUssRUFBRSxDQUFDO1NBQ1QsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsbUJBQW1CLENBQUMsRUFBUztRQUMzQixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEMsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBcUIsQ0FBQztRQUNwQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pDLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLEVBQUUsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDakUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzdCLENBQUM7Z0JBQ0QsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLFVBQVUsR0FDZCxFQUFFLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQixPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5QixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ3RCLElBQUksRUFBRSxRQUFRO1lBQ2QsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYztTQUMzQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekQsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUF1QixDQUFDO1FBQzdFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNSLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxFQUFFLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25ELE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLEdBQTRCO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuRCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQzsrR0FyZ0JVLDRCQUE0QjttR0FBNUIsNEJBQTRCLDBHQVduQixlQUFlLDhHQU9mLGVBQWUsa05BMUJ4QjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsNEJBQTRCLENBQUM7Z0JBQzNELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRiw0UEE0QjhDLFVBQVUseUVDekUzRCxxbUhBdURBLDYzS0RwQlksa0JBQWtCLHNhQUFFLHFCQUFxQiw0T0FBRSxxQkFBcUI7OzRGQVkvRCw0QkFBNEI7a0JBZnhDLFNBQVM7K0JBQ0UsMkJBQTJCLGNBQ3pCLElBQUksV0FDUCxDQUFDLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDLG1CQUcxRCx1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDZCQUE2QixDQUFDOzRCQUMzRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjs4QkFTRyxnQkFBZ0I7c0JBRG5CLFdBQVc7dUJBQUMsc0NBQXNDO2dCQUtaLFFBQVE7c0JBQTlDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUM1QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFLaUMsZ0JBQWdCO3NCQUF0RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFFbEIsYUFBYTtzQkFBL0IsTUFBTTtnQkFJUCxlQUFlO3NCQURkLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk3QixzQkFBc0I7c0JBRHRDLFNBQVM7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQW9RM0Qsb0JBQW9CO3NCQURuQixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxuICBmb3J3YXJkUmVmLFxyXG4gIGluamVjdCxcclxuICBudW1iZXJBdHRyaWJ1dGUsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBCYXNlRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9pbnB1dC1maWVsZHMvX2Jhc2UvYmFzZS1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEcm9wZG93bk9wdGlvbkZpZWxkQmFzZSB9IGZyb20gJy4uL19iYXNlL2Ryb3Bkb3duLW9wdGlvbi1maWVsZC5iYXNlJztcclxuaW1wb3J0IHR5cGUgeyBEcm9wZG93blNlYXJjaFBhZ2VSZXF1ZXN0ZWQgfSBmcm9tICcuLi9fbW9kZWxzL2Ryb3Bkb3duLXNlYXJjaC1wYWdlLXJlcXVlc3RlZC5tb2RlbCc7XHJcbmltcG9ydCB7IFVpU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vX21vZGVscy9zZWxlY3Qtb3B0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgRHJvcGRvd25CYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vX2Jhc2UvZHJvcGRvd24tYmFzZS9kcm9wZG93bi1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IHNjaGVkdWxlQ2xvc2VEcm9wZG93blBhbmVsT25UcmlnZ2VyQmx1ciB9IGZyb20gJy4uL19iYXNlL2Ryb3Bkb3duLXRyaWdnZXItYmx1ci51dGlsJztcclxuaW1wb3J0IHsgU2tlbGV0b25MaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vbG9hZGluZy9za2VsZXRvbi1sb2FkaW5nJztcclxuXHJcbmVudW0gRHJvcGRvd25TZWFyY2hPcGVuTW9kZSB7XHJcbiAgRGVmYXVsdCA9ICdkZWZhdWx0JyxcclxuICBLZWVwSW5wdXQgPSAna2VlcElucHV0JyxcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZHJvcGRvd24tc2VhcmNoLWZpZWxkJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtCYXNlRmllbGRDb21wb25lbnQsIERyb3Bkb3duQmFzZUNvbXBvbmVudCwgU2tlbGV0b25MaXN0Q29tcG9uZW50XSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24tc2VhcmNoLWZpZWxkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZHJvcGRvd24tc2VhcmNoLWZpZWxkLmNvbXBvbmVudC5zY3NzJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERyb3Bkb3duU2VhcmNoRmllbGRDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duU2VhcmNoRmllbGRDb21wb25lbnRcclxuICBleHRlbmRzIERyb3Bkb3duT3B0aW9uRmllbGRCYXNlXHJcbiAgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlc1xyXG57XHJcbiAgcHJpdmF0ZSByZWFkb25seSBob3N0UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kcm9wZG93bi1zZWFyY2gtZmllbGQtLWludmFsaWQnKVxyXG4gIGdldCBob3N0SW52YWxpZENsYXNzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudWlJbnZhbGlkO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgcGFnZVNpemUgPSA1O1xyXG4gIEBJbnB1dCgpIGhhc01vcmUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBsb2FkaW5nTW9yZSA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIEFww7NzIHBhcmFyIGRlIGRpZ2l0YXIsIGRpc3BhcmEgYSBtZXNtYSBwZXNxdWlzYSBxdWUgRW50ZXIgKGBwYWdlUmVxdWVzdGVkYCBjb20gYHF1ZXJ5YCkuXHJcbiAgICogYDBgIGRlc2F0aXZhIChzw7MgRW50ZXIgcGVzcXVpc2EpLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIHNlYXJjaERlYm91bmNlTXMgPSAzNTA7XHJcblxyXG4gIEBPdXRwdXQoKSByZWFkb25seSBwYWdlUmVxdWVzdGVkID1cclxuICAgIG5ldyBFdmVudEVtaXR0ZXI8RHJvcGRvd25TZWFyY2hQYWdlUmVxdWVzdGVkPigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdvcHRpb25zUGFuZWxUcGwnLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIG9wdGlvbnNQYW5lbFRwbCE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xyXG5cclxuICBAVmlld0NoaWxkKCdkcm9wZG93bkZpZWxkVHJpZ2dlclJvb3QnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcclxuICBwcml2YXRlIHJlYWRvbmx5IGRyb3Bkb3duVHJpZ2dlclJvb3RSZWYhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcbiAgc2VhcmNoUXVlcnkgPSAnJztcclxuICBjb21taXR0ZWRRdWVyeSA9ICcnO1xyXG5cclxuICBwYW5lbE9wZW4gPSBmYWxzZTtcclxuICBwYW5lbE92ZXJsYXlXaWR0aCA9IDA7XHJcbiAgcHJpdmF0ZSBzY3JvbGxMb2FkVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzZWFyY2hEZWJvdW5jZVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWZ0ZXJXcml0ZVZhbHVlKHZhbHVlOiB1bmtub3duIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWFyY2hRdWVyeSA9XHJcbiAgICAgIHZhbHVlID09IG51bGwgPyAnJyA6ICh0aGlzLmZpbmRPcHRpb25CeVZhbHVlKHZhbHVlKT8ubGFiZWwgPz8gJycpO1xyXG4gICAgdGhpcy5jb21taXR0ZWRRdWVyeSA9ICcnO1xyXG4gICAgdGhpcy5zeW5jQWN0aXZlSW5kZXhGcm9tVmFsdWUodmFsdWUpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBvcHQgPSB0aGlzLmZpbmRPcHRpb25CeVZhbHVlKHRoaXMuaW50ZXJuYWxWYWx1ZSk7XHJcbiAgICByZXR1cm4gb3B0Py5sYWJlbCA/PyAnJztcclxuICB9XHJcblxyXG4gIGdldCBvcHRpb25zTGlzdElkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5jb250cm9sSWR9LXNlYXJjaC1saXN0YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbSB2YWxvciBzZWxlY2lvbmFkbyBlIHBhaW5lbCBmZWNoYWRvLCBvIHRleHRvIMOpIHPDsyBleGliacOnw6NvIGRvIHLDs3R1bG87XHJcbiAgICogZWRpw6fDo28gc8OzIGNvbSBvIHBhaW5lbCBhYmVydG8gKHBlc3F1aXNhKS5cclxuICAgKi9cclxuICBnZXQgaXNMb2NrZWRTZWxlY3Rpb25EaXNwbGF5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgIXRoaXMuZGlzYWJsZWQgJiZcclxuICAgICAgIXRoaXMucmVhZG9ubHkgJiZcclxuICAgICAgdGhpcy5maWxsZWRVaSAmJlxyXG4gICAgICAhdGhpcy5wYW5lbE9wZW5cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKiogYHJlYWRvbmx5YCBuYXRpdm86IHByb3AgZG8gY2FtcG8gb3UgYmxvcXVlaW8gZGUgZXhpYmnDp8OjbyBkYSBzZWxlw6fDo28uICovXHJcbiAgZ2V0IGlzTmF0aXZlSW5wdXRSZWFkb25seSgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnJlYWRvbmx5IHx8IHRoaXMuaXNMb2NrZWRTZWxlY3Rpb25EaXNwbGF5O1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICBpZiAoIXRoaXMucGFuZWxPcGVuIHx8IHRoaXMubG9hZGluZ01vcmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ2xvYWRpbmdNb3JlJ10gfHwgY2hhbmdlc1snb3B0aW9ucyddKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50cnlFbWl0SWZTaG9ydExpc3QoKSwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNjcm9sbExvYWRUaW1lciAhPSBudWxsKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbExvYWRUaW1lcik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsZWFyU2VhcmNoRGVib3VuY2UoKTtcclxuICB9XHJcblxyXG4gIG9uRHJvcGRvd25PcGVuQ2hhbmdlKFxyXG4gICAgbmV4dDogYm9vbGVhbixcclxuICAgIG9wZW5Nb2RlOiBEcm9wZG93blNlYXJjaE9wZW5Nb2RlID0gRHJvcGRvd25TZWFyY2hPcGVuTW9kZS5EZWZhdWx0LFxyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKCFuZXh0KSB7XHJcbiAgICAgIGlmICghdGhpcy5wYW5lbE9wZW4pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wYW5lbE9wZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5jbGVhclNlYXJjaERlYm91bmNlKCk7XHJcbiAgICAgIGlmICh0aGlzLnNjcm9sbExvYWRUaW1lciAhPSBudWxsKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsTG9hZFRpbWVyKTtcclxuICAgICAgICB0aGlzLnNjcm9sbExvYWRUaW1lciA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzTWFpbklucHV0SWZGb2N1c0xvc3QoKSwgMCk7XHJcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wZW5Nb2RlID09PSBEcm9wZG93blNlYXJjaE9wZW5Nb2RlLkRlZmF1bHQpIHtcclxuICAgICAgLy8gTsOjbyBsaW1wYXIgbyB0ZXh0byBxdWFuZG8gasOhIGjDoSBzZWxlw6fDo28gKGNvbXBvcnRhbWVudG8gYWxpbmhhZG8gYW8gc2VsZWN0KS5cclxuICAgICAgdGhpcy5jb21taXR0ZWRRdWVyeSA9ICcnO1xyXG4gICAgICBpZiAodGhpcy5maWxsZWRVaSkge1xyXG4gICAgICAgIGNvbnN0IG9wdCA9IHRoaXMuZmluZE9wdGlvbkJ5VmFsdWUodGhpcy5pbnRlcm5hbFZhbHVlKTtcclxuICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gb3B0Py5sYWJlbCA/PyAnJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gJyc7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29tbWl0dGVkUXVlcnkgPSB0aGlzLnNlYXJjaFF1ZXJ5LnRyaW0oKTtcclxuICAgIH1cclxuICAgIHRoaXMucGFuZWxPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuc3luY0FjdGl2ZUluZGV4RnJvbVZhbHVlKHRoaXMuaW50ZXJuYWxWYWx1ZSk7XHJcbiAgICBjb25zdCB3ID0gdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XHJcbiAgICB0aGlzLnBhbmVsT3ZlcmxheVdpZHRoID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHcpKTtcclxuICAgIGlmICghdGhpcy5sb2FkaW5nTW9yZSkge1xyXG4gICAgICB0aGlzLnBhZ2VSZXF1ZXN0ZWQuZW1pdCh7XHJcbiAgICAgICAgcGFnZTogMCxcclxuICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgICBxdWVyeTogdGhpcy5jb21taXR0ZWRRdWVyeSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudHJ5RW1pdElmU2hvcnRMaXN0KCksIDApO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRyeUVtaXRJZlNob3J0TGlzdCgpLCA4MCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5jb250cm9sSWQpPy5mb2N1cygpO1xyXG4gICAgfSwgMCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG9uTWFpbklucHV0KGV2OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNOYXRpdmVJbnB1dFJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGVsID0gZXYudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gZWwudmFsdWU7XHJcbiAgICB0aGlzLnNjaGVkdWxlRGVib3VuY2VkU2VhcmNoKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG9uTWFpbktleWRvd24oZXY6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChldi5rZXkgPT09ICdEZWxldGUnIHx8IGV2LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcclxuICAgICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmZpbGxlZFVpKSB7XHJcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICB0aGlzLm9uQ2xlYXIoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2LmtleSA9PT0gJ0VzY2FwZScgJiYgdGhpcy5wYW5lbE9wZW4pIHtcclxuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZShmYWxzZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wYW5lbE9wZW4gJiYgdGhpcy5saXN0T3B0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHN3aXRjaCAoZXYua2V5KSB7XHJcbiAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gdGhpcy5zdGVwQWN0aXZlKDEpO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IHRoaXMuc3RlcEFjdGl2ZSgtMSk7XHJcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjYXNlICdIb21lJzpcclxuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gdGhpcy5maXJzdEVuYWJsZWRJbmRleCgpO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY2FzZSAnRW5kJzpcclxuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gdGhpcy5sYXN0RW5hYmxlZEluZGV4KCk7XHJcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXYua2V5ID09PSAnRW50ZXInKSB7XHJcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICBpZiAoIXRoaXMucGFuZWxPcGVuKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5zZWFyY2hRdWVyeS50cmltKCkgPT09ICcnIHx8XHJcbiAgICAgICAgICB0aGlzLmlzTG9ja2VkU2VsZWN0aW9uRGlzcGxheVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZSh0cnVlLCBEcm9wZG93blNlYXJjaE9wZW5Nb2RlLkRlZmF1bHQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnJ1blNlYXJjaCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcSA9IHRoaXMuc2VhcmNoUXVlcnkudHJpbSgpO1xyXG4gICAgICBjb25zdCBkaXJ0eSA9IHEgIT09IHRoaXMuY29tbWl0dGVkUXVlcnk7XHJcbiAgICAgIGlmIChkaXJ0eSkge1xyXG4gICAgICAgIC8vIExpc3RhIHBlZGlkYSBjb20gcXVlcnkgdmF6aWEgbWFzIG8gaW5wdXQgbW9zdHJhIG8gcsOzdHVsbyBkYSBzZWxlw6fDo28g4oCUIG7Do28gw6kgcGVzcXVpc2Egbm92YS5cclxuICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlpbmdTZWxlY3RlZExhYmVsV2l0aFVuZmlsdGVyZWRMaXN0KCkpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmxpc3RPcHRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5jb21taXRBY3RpdmVPcHRpb24oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ydW5TZWFyY2goKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMubGlzdE9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuY29tbWl0QWN0aXZlT3B0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW8gcmVhYnJpciwgYGNvbW1pdHRlZFF1ZXJ5YCDDqSAnJyAobGlzdGEgc2VtIGZpbHRybykgZSBvIHRleHRvIGRvIGlucHV0IMOpIG8gcsOzdHVsbyBkbyB2YWxvciDigJRcclxuICAgKiBgcSAhPT0gY29tbWl0dGVkUXVlcnlgIHNlcmlhIHRydWUgc2VtIG8gdXN1w6FyaW8gdGVyIHBlc3F1aXNhZG87IEVudGVyIGRldmUgY29uZmlybWFyIG9ww6fDo28uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0Rpc3BsYXlpbmdTZWxlY3RlZExhYmVsV2l0aFVuZmlsdGVyZWRMaXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLmZpbGxlZFVpIHx8IHRoaXMuY29tbWl0dGVkUXVlcnkgIT09ICcnKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5maW5kT3B0aW9uQnlWYWx1ZSh0aGlzLmludGVybmFsVmFsdWUpPy5sYWJlbD8udHJpbSgpO1xyXG4gICAgaWYgKGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnNlYXJjaFF1ZXJ5LnRyaW0oKSA9PT0gbGFiZWw7XHJcbiAgfVxyXG5cclxuICBvbk1haW5CbHVyKGV2PzogRm9jdXNFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgdHJpZ2dlclJvb3QgPVxyXG4gICAgICB0aGlzLmRyb3Bkb3duVHJpZ2dlclJvb3RSZWY/Lm5hdGl2ZUVsZW1lbnQgPz8gdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBzY2hlZHVsZUNsb3NlRHJvcGRvd25QYW5lbE9uVHJpZ2dlckJsdXIoe1xyXG4gICAgICB0cmlnZ2VyUm9vdCxcclxuICAgICAgaXNQYW5lbE9wZW46ICgpID0+IHRoaXMucGFuZWxPcGVuLFxyXG4gICAgICBjbG9zZVBhbmVsOiAoKSA9PiB0aGlzLm9uRHJvcGRvd25PcGVuQ2hhbmdlKGZhbHNlKSxcclxuICAgICAgbm90aWZ5VG91Y2hlZDogKCkgPT4gdGhpcy5ub3RpZnlUb3VjaGVkKCksXHJcbiAgICAgIGJsdXJSZWxhdGVkVGFyZ2V0OiBldj8ucmVsYXRlZFRhcmdldCA/PyBudWxsLFxyXG4gICAgICBhZnRlckJsdXI6ICgpID0+IHRoaXMuY2xlYXJPcnBoYW5TZWFyY2hUZXh0QWZ0ZXJCbHVyKCksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbSB2YWxvciBubyBtb2RlbG86IHJlbW92ZSB0ZXh0byBsaXZyZSBkZWl4YWRvIG5vIGlucHV0IChleC46IHBlc3F1aXNhIHNlbSBlc2NvbGhhIHbDoWxpZGEpLlxyXG4gICAqIE7Do28gYWx0ZXJhIG8gYEZvcm1Db250cm9sYCDigJQgbWFudMOpbS1zZSBgbnVsbGAvdmF6aW8gZSBvIGVzdGFkbyBpbnbDoWxpZG8gKGV4Ljogb2JyaWdhdMOzcmlvKSBjb250aW51YSB2aXPDrXZlbC5cclxuICAgKi9cclxuICBwcml2YXRlIGNsZWFyT3JwaGFuU2VhcmNoVGV4dEFmdGVyQmx1cigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdiA9IHRoaXMuaW50ZXJuYWxWYWx1ZTtcclxuICAgIGlmICh2ICE9IG51bGwgJiYgdiAhPT0gJycpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkudHJpbSgpID09PSAnJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gJyc7XHJcbiAgICB0aGlzLmNvbW1pdHRlZFF1ZXJ5ID0gJyc7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8qKiBFc2NhcGUgY29tIGZvY28gbm8gbGltcGFyL3ByZWZpeG8gZG8gYGJhc2UtZmllbGRgIChmb3JhIGRvIGlucHV0IGRhIG9yaWdlbSkuICovXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25Ecm9wZG93bkhvc3RFc2NhcGUoZXY6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5wYW5lbE9wZW4gfHwgZXYua2V5ICE9PSAnRXNjYXBlJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBvblRyaWdnZXJLZXlkb3duKGV2OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgKGV2LmtleSA9PT0gJ0RlbGV0ZScgfHwgZXYua2V5ID09PSAnQmFja3NwYWNlJykgJiZcclxuICAgICAgdGhpcy5maWxsZWRVaSAmJlxyXG4gICAgICAhdGhpcy5wYW5lbE9wZW5cclxuICAgICkge1xyXG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLm9uQ2xlYXIoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChldi5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IGV2LmtleSA9PT0gJ0Fycm93VXAnKSB7XHJcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMub25Ecm9wZG93bk9wZW5DaGFuZ2UodHJ1ZSwgRHJvcGRvd25TZWFyY2hPcGVuTW9kZS5EZWZhdWx0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBFbnRlci9Fc3Bhw6dvIGNvbSBmb2NvIG5hIGxpbmhhIGRhIG9ww6fDo28gKHRhYmluZGV4KS4gKi9cclxuICBvbk9wdGlvblJvd0tleWRvd24oZXY6IEtleWJvYXJkRXZlbnQsIG9wdDogVWlTZWxlY3RPcHRpb248dW5rbm93bj4pOiB2b2lkIHtcclxuICAgIGlmIChvcHQuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChldi5rZXkgIT09ICdFbnRlcicgJiYgZXYua2V5ICE9PSAnICcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5zZWxlY3RPcHRpb24ob3B0KTtcclxuICB9XHJcblxyXG4gIC8qKiBGb2NvIG5hIGxpc3RhIChleC46IFRhYik6IERlbGV0ZS9CYWNrc3BhY2UgbGltcGFtIGEgc2VsZcOnw6NvLiAqL1xyXG4gIG9uU2VhcmNoTGlzdEtleWRvd24oZXY6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldi5rZXkgPT09ICdFc2NhcGUnKSB7XHJcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMub25Ecm9wZG93bk9wZW5DaGFuZ2UoZmFsc2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoZXYua2V5ICE9PSAnRGVsZXRlJyAmJiBldi5rZXkgIT09ICdCYWNrc3BhY2UnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkgfHwgIXRoaXMuZmlsbGVkVWkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5vbkNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvY3VzTWFpbklucHV0SWZGb2N1c0xvc3QoKTogdm9pZCB7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuICAgIGlmIChhID09PSBkb2N1bWVudC5ib2R5IHx8IGEgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBhID09IG51bGwpIHtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5jb250cm9sSWQpPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNjaGVkdWxlRGVib3VuY2VkU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoRGVib3VuY2VNcyA8PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlYXJjaERlYm91bmNlVGltZXIgIT0gbnVsbCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hEZWJvdW5jZVRpbWVyKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VhcmNoRGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNlYXJjaERlYm91bmNlVGltZXIgPSBudWxsO1xyXG4gICAgICB0aGlzLmFwcGx5RGVib3VuY2VkU2VhcmNoKCk7XHJcbiAgICB9LCB0aGlzLnNlYXJjaERlYm91bmNlTXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhclNlYXJjaERlYm91bmNlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoRGVib3VuY2VUaW1lciAhPSBudWxsKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNlYXJjaERlYm91bmNlVGltZXIpO1xyXG4gICAgICB0aGlzLnNlYXJjaERlYm91bmNlVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWxpbmhhLXNlIGFvIEVudGVyOiBzw7MgZGlzcGFyYSBzZSBgcXVlcnlgIG11ZG91IGVtIHJlbGHDp8OjbyBhIGBjb21taXR0ZWRRdWVyeWA7XHJcbiAgICogY29tIHBhaW5lbCBmZWNoYWRvLCBzw7Mgc2UgaG91dmVyIHRleHRvIHBlc3F1aXPDoXZlbCAoY29tbyBFbnRlciBzZW0gYWJyaXIgdmF6aW8pLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXBwbHlEZWJvdW5jZWRTZWFyY2goKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5IHx8IHRoaXMuaXNOYXRpdmVJbnB1dFJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaFF1ZXJ5LnRyaW0oKTtcclxuICAgIGlmIChxID09PSB0aGlzLmNvbW1pdHRlZFF1ZXJ5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5wYW5lbE9wZW4pIHtcclxuICAgICAgaWYgKHEgPT09ICcnIHx8IHRoaXMuaXNMb2NrZWRTZWxlY3Rpb25EaXNwbGF5KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucnVuU2VhcmNoKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzRGlzcGxheWluZ1NlbGVjdGVkTGFiZWxXaXRoVW5maWx0ZXJlZExpc3QoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJ1blNlYXJjaCgpO1xyXG4gIH1cclxuXHJcbiAgcnVuU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhclNlYXJjaERlYm91bmNlKCk7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5wYW5lbE9wZW4pIHtcclxuICAgICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZSh0cnVlLCBEcm9wZG93blNlYXJjaE9wZW5Nb2RlLktlZXBJbnB1dCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaFF1ZXJ5LnRyaW0oKTtcclxuICAgIHRoaXMuY29tbWl0dGVkUXVlcnkgPSBxO1xyXG4gICAgdGhpcy5wYWdlUmVxdWVzdGVkLmVtaXQoe1xyXG4gICAgICBwYWdlOiAwLFxyXG4gICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgcXVlcnk6IHEsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgb25PcHRpb25zTGlzdFNjcm9sbChldjogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmxvYWRpbmdNb3JlIHx8ICF0aGlzLmhhc01vcmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZWwgPSBldi50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zY3JvbGxMb2FkVGltZXIgIT0gbnVsbCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxMb2FkVGltZXIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zY3JvbGxMb2FkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zY3JvbGxMb2FkVGltZXIgPSBudWxsO1xyXG4gICAgICBpZiAoZWwuc2Nyb2xsSGVpZ2h0IDw9IGVsLmNsaWVudEhlaWdodCArIDgpIHtcclxuICAgICAgICBpZiAodGhpcy5oYXNNb3JlICYmICF0aGlzLmxvYWRpbmdNb3JlICYmIHRoaXMub3B0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmVtaXROZXh0UGFnZVJlcXVlc3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG5lYXJCb3R0b20gPVxyXG4gICAgICAgIGVsLnNjcm9sbEhlaWdodCAtIGVsLnNjcm9sbFRvcCAtIGVsLmNsaWVudEhlaWdodCA8PSA2NDtcclxuICAgICAgaWYgKCFuZWFyQm90dG9tKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZW1pdE5leHRQYWdlUmVxdWVzdCgpO1xyXG4gICAgfSwgMTIwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdE5leHRQYWdlUmVxdWVzdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmxvYWRpbmdNb3JlIHx8ICF0aGlzLmhhc01vcmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmV4dFBhZ2UgPSBNYXRoLmZsb29yKHRoaXMub3B0aW9ucy5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKTtcclxuICAgIHRoaXMucGFnZVJlcXVlc3RlZC5lbWl0KHtcclxuICAgICAgcGFnZTogbmV4dFBhZ2UsXHJcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLFxyXG4gICAgICBxdWVyeTogdGhpcy5jb21taXR0ZWRRdWVyeSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlFbWl0SWZTaG9ydExpc3QoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMucGFuZWxPcGVuIHx8IHRoaXMubG9hZGluZ01vcmUgfHwgIXRoaXMuaGFzTW9yZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9uc0xpc3RJZCkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xyXG4gICAgaWYgKCFlbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoZWwuc2Nyb2xsSGVpZ2h0IDw9IGVsLmNsaWVudEhlaWdodCArIDgpIHtcclxuICAgICAgdGhpcy5lbWl0TmV4dFBhZ2VSZXF1ZXN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuVG9nZ2xlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSB8fCB0aGlzLmxvYWRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XHJcbiAgICAgIHRoaXMub25Ecm9wZG93bk9wZW5DaGFuZ2UoZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZSh0cnVlLCBEcm9wZG93blNlYXJjaE9wZW5Nb2RlLkRlZmF1bHQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21taXRBY3RpdmVPcHRpb24oKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcHQgPSB0aGlzLmxpc3RPcHRpb25zW3RoaXMuYWN0aXZlSW5kZXhdO1xyXG4gICAgaWYgKG9wdCAmJiAhb3B0LmRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0T3B0aW9uKG9wdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RPcHRpb24ob3B0OiBVaVNlbGVjdE9wdGlvbjx1bmtub3duPik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSB8fCBvcHQuZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbWl0TW9kZWxWYWx1ZShvcHQudmFsdWUpO1xyXG4gICAgdGhpcy5zZWFyY2hRdWVyeSA9IG9wdC5sYWJlbDtcclxuICAgIHRoaXMuY29tbWl0dGVkUXVlcnkgPSAnJztcclxuICAgIHRoaXMub25Ecm9wZG93bk9wZW5DaGFuZ2UoZmFsc2UpO1xyXG4gICAgdGhpcy5maW5pc2hTZWxlY3Rpb25Ub3VjaCgpO1xyXG4gIH1cclxuXHJcbiAgb25DbGVhcigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jbGVhclNlYXJjaERlYm91bmNlKCk7XHJcbiAgICB0aGlzLmVtaXRNb2RlbFZhbHVlKG51bGwpO1xyXG4gICAgdGhpcy5zZWFyY2hRdWVyeSA9ICcnO1xyXG4gICAgdGhpcy5jb21taXR0ZWRRdWVyeSA9ICcnO1xyXG4gICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZShmYWxzZSk7XHJcbiAgICB0aGlzLm5vdGlmeVRvdWNoZWQoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxufVxyXG4iLCI8YXBwLWJhc2UtZmllbGQgW2xhYmVsXT1cImZsb2F0TGFiZWxDYXB0aW9uXCIgW2ZpbGxlZF09XCJmaWxsZWRVaVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICBbZXJyb3JNZXNzYWdlXT1cInVpRXJyb3JNZXNzYWdlXCIgW3JlcXVpcmVkXT1cInVpUmVxdWlyZWRFZmZlY3RpdmVcIiBbc2hvd1JlcXVpcmVkTWFya109XCJzaG93UmVxdWlyZWRNYXJrXCIgW2ludmFsaWRdPVwidWlJbnZhbGlkXCJcbiAgW2lucHV0SWRdPVwiY29udHJvbElkXCIgW2Vycm9ySWRdPVwiZXJyb3JFbGVtZW50SWRcIiBbc2hvd1ByZWZpeEljb25dPVwic2hvd1ByZWZpeEljb25cIiBbcHJlZml4SWNvbl09XCJwcmVmaXhJY29uXCJcbiAgW2NsZWFyYWJsZV09XCJjbGVhcmFibGVcIiBbY2xlYXJBcmlhTGFiZWxdPVwiY2xlYXJBcmlhTGFiZWxcIlxuICBbbW9zdHJhck1lbnVDb250ZXh0b109XCJtb3N0cmFyTWVudUNvbnRleHRvXCIgW2NvbnRleHRNZW51SXRlbXNdPVwiY29udGV4dE1lbnVJdGVtc1wiIFtjb250ZXh0TWVudUlkXT1cImNvbnRleHRNZW51SWRcIlxuICAoY2xlYXIpPVwib25DbGVhcigpXCIgKGNvbnRleHRNZW51U2VsZWN0KT1cImNvbnRleHRNZW51U2VsZWN0LmVtaXQoJGV2ZW50KVwiPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXBwRmllbGRQcmVmaXhdXCIgLz5cbiAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXNlYXJjaC1maWVsZF9fd3JhcFwiPlxuICAgIDxhcHAtZHJvcGRvd24tYmFzZSBbb3Blbl09XCJwYW5lbE9wZW5cIiBbcGFuZWxUZW1wbGF0ZV09XCJvcHRpb25zUGFuZWxUcGxcIiBbcGFuZWxXaWR0aFB4XT1cInBhbmVsT3ZlcmxheVdpZHRoXCJcbiAgICAgIChvcGVuQ2hhbmdlKT1cIm9uRHJvcGRvd25PcGVuQ2hhbmdlKCRldmVudClcIj5cbiAgICAgIDxkaXYgI2Ryb3Bkb3duRmllbGRUcmlnZ2VyUm9vdCBjbGFzcz1cImRyb3Bkb3duLXNlYXJjaC1maWVsZF9fb3JpZ2luXCIgYXBwRHJvcGRvd25UcmlnZ2VyXG4gICAgICAgIChrZXlkb3duKT1cIm9uVHJpZ2dlcktleWRvd24oJGV2ZW50KVwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImRyb3Bkb3duLXNlYXJjaC1maWVsZF9faW5wdXRcIlxuICAgICAgICAgIFtjbGFzcy5kcm9wZG93bi1zZWFyY2gtZmllbGRfX2lucHV0LS1sb2NrZWRdPVwiaXNMb2NrZWRTZWxlY3Rpb25EaXNwbGF5XCIgW2lkXT1cImNvbnRyb2xJZFwiXG4gICAgICAgICAgW2F0dHIubmFtZV09XCJuYW1lIHx8IG51bGxcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbcmVhZG9ubHldPVwiaXNOYXRpdmVJbnB1dFJlYWRvbmx5XCIgW2F0dHIucGxhY2Vob2xkZXJdPVwiJydcIlxuICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJwYW5lbE9wZW5cIiBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIiByb2xlPVwiY29tYm9ib3hcIlxuICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwicGFuZWxPcGVuID8gb3B0aW9uc0xpc3RJZCA6IG51bGxcIiBbYXR0ci5hcmlhLWludmFsaWRdPVwidWlJbnZhbGlkXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInVpQXJpYURlc2NyaWJlZEJ5XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJmbG9hdExhYmVsQ2FwdGlvbiB8fCBwbGFjZWhvbGRlciB8fCAnQnVzY2FyIGUgc2VsZWNpb25hcidcIlxuICAgICAgICAgIFt2YWx1ZV09XCJzZWFyY2hRdWVyeVwiIChpbnB1dCk9XCJvbk1haW5JbnB1dCgkZXZlbnQpXCIgKGtleWRvd24pPVwib25NYWluS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAoYmx1cik9XCJvbk1haW5CbHVyKCRldmVudClcIiAvPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRyb3Bkb3duLXNlYXJjaC1maWVsZF9fY2hldnJvbi1idG5cIiB0YWJpbmRleD1cIi0xXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInBhbmVsT3BlblwiIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCIgYXJpYS1sYWJlbD1cIkFicmlyIGxpc3RhXCIgKGNsaWNrKT1cIm9wZW5Ub2dnbGUoKVwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtY2hldnJvbi1kb3duIGRyb3Bkb3duLXNlYXJjaC1maWVsZF9fY2hldnJvbi1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvYXBwLWRyb3Bkb3duLWJhc2U+XG4gIDwvZGl2PlxuPC9hcHAtYmFzZS1maWVsZD5cblxuPG5nLXRlbXBsYXRlICNvcHRpb25zUGFuZWxUcGw+XG4gIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1zZWFyY2gtZmllbGRfX3BhbmVsLWlubmVyXCIgKG1vdXNlZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1zZWFyY2gtZmllbGRfX2xpc3RcIiBbaWRdPVwib3B0aW9uc0xpc3RJZFwiIHJvbGU9XCJsaXN0Ym94XCIgdGFiaW5kZXg9XCItMVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZsb2F0TGFiZWxDYXB0aW9uIHx8ICdPcMOnw7VlcydcIiAoYmx1cik9XCJvbk1haW5CbHVyKCRldmVudClcIlxuICAgICAgKGtleWRvd24pPVwib25TZWFyY2hMaXN0S2V5ZG93bigkZXZlbnQpXCIgKHNjcm9sbCk9XCJvbk9wdGlvbnNMaXN0U2Nyb2xsKCRldmVudClcIj5cbiAgICAgIEBpZiAobGlzdE9wdGlvbnMubGVuZ3RoID09PSAwICYmIChvcHRpb25zTG9hZGluZyB8fCBsb2FkaW5nTW9yZSkpIHtcbiAgICAgIDxhcHAtc2tlbGV0b24tbGlzdCBbcm93c109XCI4XCIgLz5cbiAgICAgIH1cbiAgICAgIEBmb3IgKG9wdCBvZiBsaXN0T3B0aW9uczsgdHJhY2sgdHJhY2tPcHRpb24oJGluZGV4LCBvcHQpKSB7XG4gICAgICA8ZGl2IHJvbGU9XCJvcHRpb25cIiBjbGFzcz1cImRyb3Bkb3duLXNlYXJjaC1maWVsZF9fb3B0aW9uXCJcbiAgICAgICAgW2NsYXNzLmRyb3Bkb3duLXNlYXJjaC1maWVsZF9fb3B0aW9uLS1kaXNhYmxlZF09XCJvcHQuZGlzYWJsZWRcIlxuICAgICAgICBbY2xhc3MuZHJvcGRvd24tc2VhcmNoLWZpZWxkX19vcHRpb24tLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0KVwiXG4gICAgICAgIFtjbGFzcy5kcm9wZG93bi1zZWFyY2gtZmllbGRfX29wdGlvbi0tYWN0aXZlXT1cIiFvcHQuZGlzYWJsZWQgJiYgYWN0aXZlSW5kZXggPT09ICRpbmRleFwiXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cIm9wdC5kaXNhYmxlZCA/IG51bGwgOiAtMVwiIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChvcHQpXCIgKGNsaWNrKT1cInNlbGVjdE9wdGlvbihvcHQpXCJcbiAgICAgICAgKGtleWRvd24pPVwib25PcHRpb25Sb3dLZXlkb3duKCRldmVudCwgb3B0KVwiPlxuICAgICAgICB7eyBvcHQubGFiZWwgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChvcHRpb25zLmxlbmd0aCA+IDAgJiYgbG9hZGluZ01vcmUpIHtcbiAgICAgIDxhcHAtc2tlbGV0b24tbGlzdCBbcm93c109XCIxXCIgW2xlYWRpbmddPVwiZmFsc2VcIiAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=