@seniorsistemas/data-seniorx-core 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/core/constants/autocomplete.const.d.ts +4 -0
  2. package/core/constants/context-selector.const.d.ts +1 -0
  3. package/core/constants/gantt.const.d.ts +7 -0
  4. package/core/constants/hyperlink.const.d.ts +1 -0
  5. package/core/constants/inline-edit.const.d.ts +4 -0
  6. package/core/constants/kanban.const.d.ts +2 -0
  7. package/core/constants/pin-code-field.const.d.ts +5 -0
  8. package/core/constants/rating-scale.const.d.ts +1 -0
  9. package/core/constants/spotlight.const.d.ts +8 -0
  10. package/core/constants/star-rating.const.d.ts +4 -0
  11. package/core/constants/stepper.const.d.ts +1 -0
  12. package/core/constants/tiered-menu.const.d.ts +3 -0
  13. package/core/types/autocomplete.type.d.ts +9 -0
  14. package/core/types/chat.type.d.ts +12 -0
  15. package/core/types/checkbox-list.type.d.ts +12 -0
  16. package/core/types/gantt.type.d.ts +22 -0
  17. package/core/types/grid-menu.type.d.ts +13 -0
  18. package/core/types/hyperlink.type.d.ts +1 -0
  19. package/core/types/image-cropper.type.d.ts +20 -0
  20. package/core/types/inline-edit.type.d.ts +26 -0
  21. package/core/types/kanban.type.d.ts +36 -0
  22. package/core/types/panel.type.d.ts +16 -0
  23. package/core/types/profile-picture-picker.type.d.ts +9 -0
  24. package/core/types/rating-scale.type.d.ts +5 -0
  25. package/core/types/select-button.type.d.ts +1 -0
  26. package/core/types/spotlight.type.d.ts +34 -0
  27. package/core/types/star-rating.type.d.ts +1 -0
  28. package/core/types/stepper.type.d.ts +20 -0
  29. package/core/types/table-column.type.d.ts +3 -1
  30. package/core/types/table-options.type.d.ts +8 -2
  31. package/core/types/table.type.d.ts +1 -1
  32. package/core/types/tiered-menu.type.d.ts +16 -0
  33. package/core/types/tree.type.d.ts +25 -0
  34. package/core/types/workspace-switch.type.d.ts +6 -0
  35. package/core/utils/body-scroll.util.d.ts +2 -0
  36. package/core/utils/roving-focus.util.d.ts +2 -0
  37. package/core/utils/selection.util.d.ts +3 -0
  38. package/core/utils/tree.util.d.ts +4 -0
  39. package/esm2022/core/constants/autocomplete.const.mjs +5 -0
  40. package/esm2022/core/constants/context-selector.const.mjs +2 -0
  41. package/esm2022/core/constants/gantt.const.mjs +7 -0
  42. package/esm2022/core/constants/hyperlink.const.mjs +2 -1
  43. package/esm2022/core/constants/inline-edit.const.mjs +5 -0
  44. package/esm2022/core/constants/kanban.const.mjs +3 -0
  45. package/esm2022/core/constants/pin-code-field.const.mjs +6 -0
  46. package/esm2022/core/constants/rating-scale.const.mjs +2 -0
  47. package/esm2022/core/constants/spotlight.const.mjs +9 -0
  48. package/esm2022/core/constants/star-rating.const.mjs +5 -0
  49. package/esm2022/core/constants/stepper.const.mjs +2 -0
  50. package/esm2022/core/constants/table.const.mjs +2 -2
  51. package/esm2022/core/constants/tiered-menu.const.mjs +4 -0
  52. package/esm2022/core/types/autocomplete.type.mjs +2 -0
  53. package/esm2022/core/types/chat.type.mjs +2 -0
  54. package/esm2022/core/types/checkbox-list.type.mjs +2 -0
  55. package/esm2022/core/types/gantt.type.mjs +2 -0
  56. package/esm2022/core/types/grid-menu.type.mjs +2 -0
  57. package/esm2022/core/types/hyperlink.type.mjs +1 -1
  58. package/esm2022/core/types/image-cropper.type.mjs +2 -0
  59. package/esm2022/core/types/inline-edit.type.mjs +2 -0
  60. package/esm2022/core/types/kanban.type.mjs +2 -0
  61. package/esm2022/core/types/panel.type.mjs +9 -0
  62. package/esm2022/core/types/profile-picture-picker.type.mjs +2 -0
  63. package/esm2022/core/types/rating-scale.type.mjs +2 -0
  64. package/esm2022/core/types/select-button.type.mjs +1 -1
  65. package/esm2022/core/types/spotlight.type.mjs +2 -0
  66. package/esm2022/core/types/star-rating.type.mjs +2 -0
  67. package/esm2022/core/types/stepper.type.mjs +7 -0
  68. package/esm2022/core/types/table-column.type.mjs +1 -1
  69. package/esm2022/core/types/table-options.type.mjs +1 -1
  70. package/esm2022/core/types/table.type.mjs +1 -1
  71. package/esm2022/core/types/tiered-menu.type.mjs +2 -0
  72. package/esm2022/core/types/tree.type.mjs +2 -0
  73. package/esm2022/core/types/workspace-switch.type.mjs +2 -0
  74. package/esm2022/core/utils/body-scroll.util.mjs +19 -0
  75. package/esm2022/core/utils/combobox.util.mjs +3 -2
  76. package/esm2022/core/utils/roving-focus.util.mjs +20 -0
  77. package/esm2022/core/utils/selection.util.mjs +13 -0
  78. package/esm2022/core/utils/string.util.mjs +8 -3
  79. package/esm2022/core/utils/tree.util.mjs +23 -0
  80. package/esm2022/features/accordion/accordion.component.mjs +2 -2
  81. package/esm2022/features/accordion/{accordion-item.component.mjs → components/accordion-item/accordion-item.component.mjs} +7 -7
  82. package/esm2022/features/autocomplete/autocomplete.component.mjs +501 -0
  83. package/esm2022/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +30 -0
  84. package/esm2022/features/breadcrumb/breadcrumb.component.mjs +2 -2
  85. package/esm2022/features/card-list/card/card.component.mjs +63 -99
  86. package/esm2022/features/chat/chat.component.mjs +126 -0
  87. package/esm2022/features/checkbox-list/checkbox-list.component.mjs +125 -0
  88. package/esm2022/features/combobox/combobox.component.mjs +20 -8
  89. package/esm2022/features/context-selector/context-selector.component.mjs +198 -0
  90. package/esm2022/features/filters/filters.component.mjs +1 -1
  91. package/esm2022/features/gantt/components/gantt-side-table/gantt-side-table.component.mjs +17 -0
  92. package/esm2022/features/gantt/gantt-date.utils.mjs +97 -0
  93. package/esm2022/features/gantt/gantt.component.mjs +89 -0
  94. package/esm2022/features/gantt/gantt.engine.mjs +662 -0
  95. package/esm2022/features/grid-menu/grid-menu.component.mjs +104 -0
  96. package/esm2022/features/hyperlink/hyperlink.component.mjs +7 -4
  97. package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
  98. package/esm2022/features/image-cropper/image-cropper.component.mjs +218 -0
  99. package/esm2022/features/image-cropper/services/image-cropper.service.mjs +50 -0
  100. package/esm2022/features/infinite-scroll/infinite-scroll.directive.mjs +89 -0
  101. package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
  102. package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +38 -0
  103. package/esm2022/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +29 -0
  104. package/esm2022/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.mjs +29 -0
  105. package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +131 -0
  106. package/esm2022/features/inline-edit/fields/inline-edit-field.mjs +17 -0
  107. package/esm2022/features/inline-edit/fields/inline-edit-number-field.mjs +15 -0
  108. package/esm2022/features/inline-edit/fields/inline-edit-text-field.mjs +11 -0
  109. package/esm2022/features/inline-edit/fields/inline-edit-textarea-field.mjs +15 -0
  110. package/esm2022/features/inline-edit/inline-edit.component.mjs +27 -0
  111. package/esm2022/features/interactive-content/interactive-content.directive.mjs +140 -0
  112. package/esm2022/features/kanban/components/kanban-column/kanban-column.component.mjs +88 -0
  113. package/esm2022/features/kanban/components/kanban-item/kanban-item.component.mjs +72 -0
  114. package/esm2022/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +19 -0
  115. package/esm2022/features/kanban/directives/kanban-template.directive.mjs +22 -0
  116. package/esm2022/features/kanban/kanban.component.mjs +198 -0
  117. package/esm2022/features/kanban/services/kanban-event.service.mjs +27 -0
  118. package/esm2022/features/loading-state/loading-state.component.mjs +3 -62
  119. package/esm2022/features/mouse-events/directives/double-click.directive.mjs +34 -0
  120. package/esm2022/features/mouse-events/directives/long-press.directive.mjs +61 -0
  121. package/esm2022/features/paginator/paginator.component.mjs +8 -3
  122. package/esm2022/features/panel/panel.component.mjs +43 -11
  123. package/esm2022/features/pin-code-field/pin-code-field.component.mjs +234 -0
  124. package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +330 -0
  125. package/esm2022/features/rating-scale/rating-scale.component.mjs +86 -0
  126. package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
  127. package/esm2022/features/scaffold/scaffold.component.mjs +4 -6
  128. package/esm2022/features/select-button/select-button.component.mjs +7 -4
  129. package/esm2022/features/speech-recognition/services/speech-recognition.service.mjs +148 -0
  130. package/esm2022/features/speech-recognition/services/text-to-speech.service.mjs +88 -0
  131. package/esm2022/features/speech-recognition/speech-recognition.component.mjs +243 -0
  132. package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +521 -0
  133. package/esm2022/features/spotlight/directives/spotlight-step.directive.mjs +38 -0
  134. package/esm2022/features/spotlight/services/spotlight-tour.service.mjs +179 -0
  135. package/esm2022/features/spotlight/spotlight.component.mjs +160 -0
  136. package/esm2022/features/star-rating/star-rating.component.mjs +95 -0
  137. package/esm2022/features/stepper/stepper.component.mjs +86 -0
  138. package/esm2022/features/switch/switch.component.mjs +12 -8
  139. package/esm2022/features/tab/{tab-item.component.mjs → components/tab-item/tab-item.component.mjs} +1 -1
  140. package/esm2022/features/tab/tab.component.mjs +4 -4
  141. package/esm2022/features/table/components/table-cell-content.component.mjs +14 -5
  142. package/esm2022/features/table/table.component.mjs +220 -29
  143. package/esm2022/features/table/utils/table-data.util.mjs +71 -8
  144. package/esm2022/features/table/utils/table-layout.util.mjs +21 -1
  145. package/esm2022/features/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +367 -0
  146. package/esm2022/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +11 -0
  147. package/esm2022/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +97 -0
  148. package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +181 -0
  149. package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +246 -0
  150. package/esm2022/features/tiered-menu/services/tiered-menu.event.service.mjs +16 -0
  151. package/esm2022/features/tiered-menu/services/tiered-menu.global.service.mjs +12 -0
  152. package/esm2022/features/tiered-menu/services/tiered-menu.service.mjs +49 -0
  153. package/esm2022/features/tree/components/tree-node-item/tree-node-item.component.mjs +169 -0
  154. package/esm2022/features/tree/tree.component.mjs +211 -0
  155. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.mjs +41 -0
  156. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.mjs +38 -0
  157. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.mjs +29 -0
  158. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.mjs +29 -0
  159. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.mjs +35 -0
  160. package/esm2022/features/visual-sql-editor/services/visual-sql-editor-flow.service.mjs +106 -0
  161. package/esm2022/features/visual-sql-editor/services/visual-sql-editor-state.service.mjs +230 -0
  162. package/esm2022/features/visual-sql-editor/types/visual-sql-editor.types.mjs +2 -0
  163. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.mjs +72 -0
  164. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sql.util.mjs +281 -0
  165. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-text.util.mjs +37 -0
  166. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor.constants.mjs +89 -0
  167. package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +172 -630
  168. package/esm2022/locales/en.json +351 -3
  169. package/esm2022/locales/es-CO.json +351 -3
  170. package/esm2022/locales/pt.json +351 -3
  171. package/esm2022/providers/features.provider.mjs +40 -4
  172. package/esm2022/public-api.mjs +56 -3
  173. package/features/accordion/accordion.component.d.ts +1 -1
  174. package/features/accordion/{accordion-item.component.d.ts → components/accordion-item/accordion-item.component.d.ts} +1 -1
  175. package/features/autocomplete/autocomplete.component.d.ts +102 -0
  176. package/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +11 -0
  177. package/features/card-list/card/card.component.d.ts +14 -34
  178. package/features/chat/chat.component.d.ts +31 -0
  179. package/features/checkbox-list/checkbox-list.component.d.ts +26 -0
  180. package/features/combobox/combobox.component.d.ts +2 -1
  181. package/features/context-selector/context-selector.component.d.ts +37 -0
  182. package/features/gantt/components/gantt-side-table/gantt-side-table.component.d.ts +8 -0
  183. package/features/gantt/gantt-date.utils.d.ts +36 -0
  184. package/features/gantt/gantt.component.d.ts +24 -0
  185. package/features/gantt/gantt.engine.d.ts +52 -0
  186. package/features/grid-menu/grid-menu.component.d.ts +29 -0
  187. package/features/hyperlink/hyperlink.component.d.ts +2 -1
  188. package/features/image-cropper/image-cropper.component.d.ts +43 -0
  189. package/features/image-cropper/services/image-cropper.service.d.ts +13 -0
  190. package/features/infinite-scroll/infinite-scroll.directive.d.ts +25 -0
  191. package/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +13 -0
  192. package/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +13 -0
  193. package/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.d.ts +13 -0
  194. package/features/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +37 -0
  195. package/features/inline-edit/fields/inline-edit-field.d.ts +12 -0
  196. package/features/inline-edit/fields/inline-edit-number-field.d.ts +9 -0
  197. package/features/inline-edit/fields/inline-edit-text-field.d.ts +7 -0
  198. package/features/inline-edit/fields/inline-edit-textarea-field.d.ts +9 -0
  199. package/features/inline-edit/inline-edit.component.d.ts +13 -0
  200. package/features/interactive-content/interactive-content.directive.d.ts +31 -0
  201. package/features/kanban/components/kanban-column/kanban-column.component.d.ts +22 -0
  202. package/features/kanban/components/kanban-item/kanban-item.component.d.ts +23 -0
  203. package/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +8 -0
  204. package/features/kanban/directives/kanban-template.directive.d.ts +10 -0
  205. package/features/kanban/kanban.component.d.ts +32 -0
  206. package/features/kanban/services/kanban-event.service.d.ts +15 -0
  207. package/features/loading-state/loading-state.component.d.ts +0 -2
  208. package/features/mouse-events/directives/double-click.directive.d.ts +11 -0
  209. package/features/mouse-events/directives/long-press.directive.d.ts +14 -0
  210. package/features/panel/panel.component.d.ts +12 -3
  211. package/features/pin-code-field/pin-code-field.component.d.ts +44 -0
  212. package/features/profile-picture-picker/profile-picture-picker.component.d.ts +77 -0
  213. package/features/rating-scale/rating-scale.component.d.ts +24 -0
  214. package/features/select-button/select-button.component.d.ts +2 -1
  215. package/features/speech-recognition/services/speech-recognition.service.d.ts +29 -0
  216. package/features/speech-recognition/services/text-to-speech.service.d.ts +24 -0
  217. package/features/speech-recognition/speech-recognition.component.d.ts +50 -0
  218. package/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.d.ts +59 -0
  219. package/features/spotlight/directives/spotlight-step.directive.d.ts +13 -0
  220. package/features/spotlight/services/spotlight-tour.service.d.ts +46 -0
  221. package/features/spotlight/spotlight.component.d.ts +59 -0
  222. package/features/star-rating/star-rating.component.d.ts +26 -0
  223. package/features/stepper/stepper.component.d.ts +23 -0
  224. package/features/switch/switch.component.d.ts +2 -1
  225. package/features/tab/tab.component.d.ts +1 -1
  226. package/features/table/components/table-cell-content.component.d.ts +4 -3
  227. package/features/table/table.component.d.ts +40 -5
  228. package/features/table/utils/table-data.util.d.ts +1 -0
  229. package/features/table/utils/table-layout.util.d.ts +1 -0
  230. package/features/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +49 -0
  231. package/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +5 -0
  232. package/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +19 -0
  233. package/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +26 -0
  234. package/features/tiered-menu/directives/tiered-menu.directive.d.ts +44 -0
  235. package/features/tiered-menu/services/tiered-menu.event.service.d.ts +13 -0
  236. package/features/tiered-menu/services/tiered-menu.global.service.d.ts +7 -0
  237. package/features/tiered-menu/services/tiered-menu.service.d.ts +14 -0
  238. package/features/tree/components/tree-node-item/tree-node-item.component.d.ts +37 -0
  239. package/features/tree/tree.component.d.ts +37 -0
  240. package/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.d.ts +18 -0
  241. package/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.d.ts +17 -0
  242. package/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.d.ts +13 -0
  243. package/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.d.ts +13 -0
  244. package/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.d.ts +15 -0
  245. package/features/visual-sql-editor/services/visual-sql-editor-flow.service.d.ts +26 -0
  246. package/features/visual-sql-editor/services/visual-sql-editor-state.service.d.ts +72 -0
  247. package/features/visual-sql-editor/types/visual-sql-editor.types.d.ts +182 -0
  248. package/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.d.ts +14 -0
  249. package/features/visual-sql-editor/utils/visual-sql-editor-sql.util.d.ts +81 -0
  250. package/features/visual-sql-editor/utils/visual-sql-editor-text.util.d.ts +15 -0
  251. package/features/visual-sql-editor/utils/visual-sql-editor.constants.d.ts +36 -0
  252. package/features/visual-sql-editor/visual-sql-editor.component.d.ts +37 -199
  253. package/fesm2022/seniorsistemas-data-seniorx-core.mjs +14883 -6353
  254. package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
  255. package/package.json +8 -8
  256. package/public-api.d.ts +72 -2
  257. package/src/locales/en.json +353 -15
  258. package/src/locales/es-CO.json +352 -14
  259. package/src/locales/pt.json +352 -14
  260. package/styles/sdc-global-variables.scss +1 -1
  261. package/styles.css +1 -1
  262. /package/features/tab/{tab-item.component.d.ts → components/tab-item/tab-item.component.d.ts} +0 -0
@@ -0,0 +1,501 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, forwardRef, inject } from '@angular/core';
3
+ import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { ScrollingModule } from '@angular/cdk/scrolling';
5
+ import { Overlay, OverlayModule } from '@angular/cdk/overlay';
6
+ import { TranslateModule } from '@ngx-translate/core';
7
+ import { Subject, Subscription, debounceTime, distinctUntilChanged } from 'rxjs';
8
+ import { AUTOCOMPLETE_DEFAULT_DELAY, AUTOCOMPLETE_DEFAULT_EMPTY_MESSAGE_KEY, AUTOCOMPLETE_DEFAULT_MIN_LENGTH, AUTOCOMPLETE_DEFAULT_PLACEHOLDER_KEY } from '../../core/constants/autocomplete.const';
9
+ import { AutocompleteChipComponent } from './components/autocomplete-chip/autocomplete-chip.component';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/common";
12
+ import * as i2 from "@angular/forms";
13
+ import * as i3 from "@angular/cdk/overlay";
14
+ import * as i4 from "@angular/cdk/scrolling";
15
+ import * as i5 from "@ngx-translate/core";
16
+ export class AutocompleteComponent {
17
+ static nextId = 0;
18
+ static allocateComponentId() {
19
+ const nextId = AutocompleteComponent.nextId;
20
+ AutocompleteComponent.nextId += 1;
21
+ return `sdc-autocomplete-${nextId}`;
22
+ }
23
+ cdr = inject(ChangeDetectorRef);
24
+ overlay = inject(Overlay);
25
+ inputSubject = new Subject();
26
+ lazyLoadSubject = new Subject();
27
+ subscriptions = new Subscription();
28
+ suggestions = [];
29
+ placeholder = AUTOCOMPLETE_DEFAULT_PLACEHOLDER_KEY;
30
+ suggestionValue;
31
+ suggestionLabel;
32
+ readonly = false;
33
+ emptyMessage = AUTOCOMPLETE_DEFAULT_EMPTY_MESSAGE_KEY;
34
+ delay = AUTOCOMPLETE_DEFAULT_DELAY;
35
+ invalid = false;
36
+ virtualScroll = false;
37
+ virtualScrollItemSize = 37;
38
+ lazy = false;
39
+ dropdown = false;
40
+ forceSelection = false;
41
+ checkmark = false;
42
+ multiple = false;
43
+ minLengthToSearch = AUTOCOMPLETE_DEFAULT_MIN_LENGTH;
44
+ inputClass = '';
45
+ dataKey;
46
+ disabled = false;
47
+ lazyLoad = new EventEmitter();
48
+ selected = new EventEmitter();
49
+ unselected = new EventEmitter();
50
+ blurred = new EventEmitter();
51
+ cleared = new EventEmitter();
52
+ keyUp = new EventEmitter();
53
+ focused = new EventEmitter();
54
+ completeMethod = new EventEmitter();
55
+ containerDiv;
56
+ inputEl;
57
+ componentId = AutocompleteComponent.allocateComponentId();
58
+ scrollStrategy = this.overlay.scrollStrategies.close();
59
+ overlayPositions = [
60
+ { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },
61
+ { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },
62
+ ];
63
+ inputValue = '';
64
+ isOpen = false;
65
+ loading = false;
66
+ showEmptyMessage = false;
67
+ focusedIndex = -1;
68
+ filteredSuggestions = [];
69
+ value = null;
70
+ values = [];
71
+ onChange = () => { };
72
+ onTouched = () => { };
73
+ lazyRequestId = 0;
74
+ constructor() {
75
+ this.subscriptions.add(this.inputSubject.pipe(debounceTime(this.delay), distinctUntilChanged()).subscribe((query) => {
76
+ if (query.length < this.minLengthToSearch && query.length > 0) {
77
+ this.filteredSuggestions = [];
78
+ this.showEmptyMessage = false;
79
+ this.focusedIndex = -1;
80
+ this.cdr.markForCheck();
81
+ return;
82
+ }
83
+ this.refreshFilteredSuggestions(query);
84
+ if (!this.forceSelection && !this.multiple) {
85
+ this.onChange(query);
86
+ }
87
+ }));
88
+ this.subscriptions.add(this.lazyLoadSubject.pipe(debounceTime(this.delay), distinctUntilChanged()).subscribe((query) => {
89
+ this.loading = true;
90
+ this.lazyRequestId += 1;
91
+ const requestId = this.lazyRequestId;
92
+ this.isOpen = true;
93
+ this.cdr.markForCheck();
94
+ this.lazyLoad.emit({
95
+ query,
96
+ response: (data) => {
97
+ if (requestId !== this.lazyRequestId) {
98
+ return;
99
+ }
100
+ this.loading = false;
101
+ this.suggestions = data;
102
+ this.refreshFilteredSuggestions(query);
103
+ }
104
+ });
105
+ }));
106
+ }
107
+ ngOnChanges(changes) {
108
+ if (changes['suggestions'] && !this.lazy) {
109
+ this.refreshFilteredSuggestions(this.inputValue);
110
+ }
111
+ }
112
+ ngOnDestroy() {
113
+ this.subscriptions.unsubscribe();
114
+ }
115
+ writeValue(value) {
116
+ if (this.multiple) {
117
+ this.values = this.normalizeMultipleValue(value);
118
+ this.inputValue = '';
119
+ this.value = null;
120
+ this.refreshFilteredSuggestions(this.inputValue);
121
+ this.cdr.markForCheck();
122
+ return;
123
+ }
124
+ if (Array.isArray(value)) {
125
+ throw new Error('Autocomplete value must not be an array when multiple is false.');
126
+ }
127
+ this.value = value ?? null;
128
+ this.inputValue = this.toDisplayValue(value ?? null);
129
+ this.refreshFilteredSuggestions(this.inputValue);
130
+ this.cdr.markForCheck();
131
+ }
132
+ registerOnChange(onChange) {
133
+ this.onChange = onChange;
134
+ }
135
+ registerOnTouched(onTouched) {
136
+ this.onTouched = onTouched;
137
+ }
138
+ setDisabledState(isDisabled) {
139
+ this.disabled = isDisabled;
140
+ this.cdr.markForCheck();
141
+ }
142
+ onInput(event) {
143
+ if (this.disabled || this.readonly) {
144
+ return;
145
+ }
146
+ const query = event.target.value ?? '';
147
+ this.inputValue = query;
148
+ this.onTouched();
149
+ if (this.lazy) {
150
+ this.lazyLoadSubject.next(query);
151
+ }
152
+ else {
153
+ this.completeMethod.emit({ query });
154
+ this.inputSubject.next(query);
155
+ this.isOpen = true;
156
+ this.cdr.markForCheck();
157
+ }
158
+ }
159
+ onInputBlur(event) {
160
+ this.blurred.emit(event);
161
+ this.onTouched();
162
+ if (!this.forceSelection || this.multiple) {
163
+ return;
164
+ }
165
+ const match = this.findExactMatch(this.inputValue);
166
+ if (!match) {
167
+ this.inputValue = this.toDisplayValue(this.value);
168
+ this.cdr.markForCheck();
169
+ return;
170
+ }
171
+ this.selectSuggestion(match.data);
172
+ }
173
+ onInputFocus(event) {
174
+ this.focused.emit(event);
175
+ }
176
+ onKeyDown(event) {
177
+ if (this.handleClosedPanelKeyDown(event)) {
178
+ return;
179
+ }
180
+ switch (event.key) {
181
+ case 'ArrowDown':
182
+ this.moveFocusBy(1, event);
183
+ return;
184
+ case 'ArrowUp':
185
+ this.moveFocusBy(-1, event);
186
+ return;
187
+ case 'Enter':
188
+ case 'Tab':
189
+ this.selectFocusedSuggestion(event);
190
+ return;
191
+ case 'Escape':
192
+ this.closeDropdownPanel();
193
+ return;
194
+ default:
195
+ return;
196
+ }
197
+ }
198
+ onKeyUp(event) {
199
+ this.keyUp.emit(event);
200
+ }
201
+ onWindowResize() {
202
+ this.closeDropdownPanel();
203
+ }
204
+ selectSuggestion(suggestion) {
205
+ if (this.multiple) {
206
+ if (!this.values.some((value) => this.areSuggestionsEqual(value, suggestion))) {
207
+ this.values = [...this.values, suggestion];
208
+ this.onChange(this.values);
209
+ }
210
+ this.inputValue = '';
211
+ }
212
+ else {
213
+ this.value = suggestion;
214
+ this.inputValue = this.toDisplayValue(suggestion);
215
+ this.onChange(this.getSuggestionResultValue(suggestion));
216
+ }
217
+ this.selected.emit(suggestion);
218
+ this.refreshFilteredSuggestions(this.inputValue);
219
+ this.closeDropdownPanel();
220
+ this.cdr.markForCheck();
221
+ }
222
+ clear() {
223
+ this.value = null;
224
+ this.values = [];
225
+ this.inputValue = '';
226
+ this.filteredSuggestions = [];
227
+ this.showEmptyMessage = false;
228
+ this.closeDropdownPanel();
229
+ this.onChange(this.multiple ? [] : null);
230
+ this.cleared.emit();
231
+ this.cdr.markForCheck();
232
+ }
233
+ toggleDropdown() {
234
+ if (this.disabled || this.readonly) {
235
+ return;
236
+ }
237
+ if (this.isOpen) {
238
+ this.closeDropdownPanel();
239
+ return;
240
+ }
241
+ this.openDropdownPanel();
242
+ }
243
+ removeSuggestion(suggestion) {
244
+ this.values = this.values.filter((value) => !this.areSuggestionsEqual(value, suggestion));
245
+ this.onChange(this.values);
246
+ this.unselected.emit(suggestion);
247
+ this.refreshFilteredSuggestions(this.inputValue);
248
+ this.cdr.markForCheck();
249
+ }
250
+ trackBySuggestionId(_, item) {
251
+ return item.id;
252
+ }
253
+ isSuggestionSelected(suggestion) {
254
+ return suggestion.isSelected === true;
255
+ }
256
+ get activeDescendantId() {
257
+ if (this.focusedIndex < 0) {
258
+ return null;
259
+ }
260
+ return this.filteredSuggestions[this.focusedIndex]?.id ?? null;
261
+ }
262
+ openDropdownPanel() {
263
+ if (this.lazy) {
264
+ this.lazyLoadSubject.next(this.inputValue);
265
+ }
266
+ else {
267
+ this.refreshFilteredSuggestions(this.inputValue);
268
+ }
269
+ this.isOpen = true;
270
+ this.cdr.markForCheck();
271
+ }
272
+ closeDropdownPanel() {
273
+ this.isOpen = false;
274
+ this.focusedIndex = -1;
275
+ this.cdr.markForCheck();
276
+ }
277
+ refreshFilteredSuggestions(query) {
278
+ const normalizedQuery = query.trim().toLowerCase();
279
+ const allSuggestions = this.suggestions.map((suggestion) => this.wrapSuggestion(suggestion));
280
+ const filtered = this.filterSuggestionsByQuery(normalizedQuery, allSuggestions);
281
+ const selectedIds = new Set(this.values.map((value) => this.getSuggestionIdentity(value)));
282
+ this.filteredSuggestions = this.markSelectedSuggestions(filtered, selectedIds);
283
+ this.showEmptyMessage = this.filteredSuggestions.length === 0 && normalizedQuery.length >= 0;
284
+ this.focusedIndex = this.filteredSuggestions.length ? 0 : -1;
285
+ this.cdr.markForCheck();
286
+ }
287
+ filterSuggestionsByQuery(query, suggestions) {
288
+ return query
289
+ ? suggestions.filter((suggestion) => this.toDisplayValue(suggestion.data).toLowerCase().includes(query))
290
+ : suggestions;
291
+ }
292
+ markSelectedSuggestions(suggestions, selectedIds) {
293
+ return suggestions.map((suggestion) => ({
294
+ ...suggestion,
295
+ isSelected: selectedIds.has(suggestion.id)
296
+ }));
297
+ }
298
+ wrapSuggestion(suggestion) {
299
+ return {
300
+ data: suggestion,
301
+ id: this.getSuggestionIdentity(suggestion)
302
+ };
303
+ }
304
+ getSuggestionIdentity(suggestion) {
305
+ if (!suggestion || typeof suggestion !== 'object') {
306
+ return String(suggestion ?? '');
307
+ }
308
+ const objectSuggestion = suggestion;
309
+ const selectedKey = this.dataKey ?? this.suggestionValue;
310
+ if (selectedKey) {
311
+ const selectedValue = objectSuggestion[selectedKey];
312
+ return this.stringifyIdentityValue(selectedValue);
313
+ }
314
+ return JSON.stringify(suggestion);
315
+ }
316
+ stringifyIdentityValue(value) {
317
+ if (value == null) {
318
+ return '';
319
+ }
320
+ if (typeof value === 'object') {
321
+ return JSON.stringify(value);
322
+ }
323
+ if (typeof value === 'symbol') {
324
+ return value.description ?? '';
325
+ }
326
+ if (typeof value === 'function') {
327
+ return '';
328
+ }
329
+ if (typeof value === 'string') {
330
+ return value;
331
+ }
332
+ if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {
333
+ return String(value);
334
+ }
335
+ return '';
336
+ }
337
+ handleClosedPanelKeyDown(event) {
338
+ if (this.isOpen && this.filteredSuggestions.length) {
339
+ return false;
340
+ }
341
+ if (event.key === 'ArrowDown' && !this.isOpen) {
342
+ this.openDropdownPanel();
343
+ }
344
+ return true;
345
+ }
346
+ moveFocusBy(step, event) {
347
+ event.preventDefault();
348
+ if (step > 0) {
349
+ this.focusedIndex = Math.min(this.focusedIndex + 1, this.filteredSuggestions.length - 1);
350
+ }
351
+ else {
352
+ this.focusedIndex = Math.max(this.focusedIndex - 1, 0);
353
+ }
354
+ this.scrollFocusedSuggestionIntoView();
355
+ this.cdr.markForCheck();
356
+ }
357
+ selectFocusedSuggestion(event) {
358
+ const activeSuggestion = this.filteredSuggestions[this.focusedIndex];
359
+ if (activeSuggestion) {
360
+ event.preventDefault();
361
+ this.selectSuggestion(activeSuggestion.data);
362
+ }
363
+ this.closeDropdownPanel();
364
+ }
365
+ getSuggestionResultValue(suggestion) {
366
+ if (!this.suggestionValue || !suggestion || typeof suggestion !== 'object') {
367
+ return suggestion;
368
+ }
369
+ return suggestion[this.suggestionValue];
370
+ }
371
+ toDisplayValue(value) {
372
+ if (value === null || value === undefined) {
373
+ return '';
374
+ }
375
+ if (typeof value === 'string') {
376
+ return value;
377
+ }
378
+ if (this.suggestionLabel && typeof value === 'object') {
379
+ return String(value[this.suggestionLabel] ?? '');
380
+ }
381
+ return String(value);
382
+ }
383
+ normalizeMultipleValue(value) {
384
+ if (Array.isArray(value)) {
385
+ return value.filter((entry) => typeof entry !== 'string');
386
+ }
387
+ if (value && typeof value !== 'string') {
388
+ return [value];
389
+ }
390
+ return [];
391
+ }
392
+ areSuggestionsEqual(left, right) {
393
+ return this.getSuggestionIdentity(left) === this.getSuggestionIdentity(right);
394
+ }
395
+ findExactMatch(query) {
396
+ const normalizedQuery = query.trim().toLowerCase();
397
+ return this.suggestions
398
+ .map((suggestion) => this.wrapSuggestion(suggestion))
399
+ .find((suggestion) => this.toDisplayValue(suggestion.data).toLowerCase() === normalizedQuery);
400
+ }
401
+ scrollFocusedSuggestionIntoView() {
402
+ queueMicrotask(() => {
403
+ const activeId = this.filteredSuggestions[this.focusedIndex]?.id;
404
+ if (!activeId) {
405
+ return;
406
+ }
407
+ document.getElementById(activeId)?.scrollIntoView({ block: 'nearest' });
408
+ });
409
+ }
410
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
411
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AutocompleteComponent, isStandalone: true, selector: "sdc-autocomplete", inputs: { suggestions: "suggestions", placeholder: "placeholder", suggestionValue: "suggestionValue", suggestionLabel: "suggestionLabel", readonly: "readonly", emptyMessage: "emptyMessage", delay: "delay", invalid: "invalid", virtualScroll: "virtualScroll", virtualScrollItemSize: "virtualScrollItemSize", lazy: "lazy", dropdown: "dropdown", forceSelection: "forceSelection", checkmark: "checkmark", multiple: "multiple", minLengthToSearch: "minLengthToSearch", inputClass: "inputClass", dataKey: "dataKey", disabled: "disabled" }, outputs: { lazyLoad: "lazyLoad", selected: "selected", unselected: "unselected", blurred: "blurred", cleared: "cleared", keyUp: "keyUp", focused: "focused", completeMethod: "completeMethod" }, host: { attributes: { "role": "combobox" }, listeners: { "window:resize": "onWindowResize()" }, properties: { "attr.aria-expanded": "isOpen", "attr.aria-haspopup": "\"listbox\"" } }, providers: [
412
+ {
413
+ provide: NG_VALUE_ACCESSOR,
414
+ useExisting: forwardRef(() => AutocompleteComponent),
415
+ multi: true
416
+ }
417
+ ], viewQueries: [{ propertyName: "containerDiv", first: true, predicate: ["containerDiv"], descendants: true }, { propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"sdc-autocomplete\"\n [class.sdc-autocomplete--disabled]=\"disabled\"\n [class.sdc-autocomplete--invalid]=\"invalid\"\n [class.sdc-autocomplete--multiple]=\"multiple\"\n [ngClass]=\"inputClass\"\n>\n <div class=\"sdc-autocomplete__control\">\n @if (multiple && values.length > 0) {\n <div class=\"sdc-autocomplete__chips\">\n @for (suggestion of values; track suggestion) {\n <sdc-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></sdc-autocomplete-chip>\n }\n </div>\n }\n\n <input\n #inputEl\n [id]=\"componentId\"\n class=\"sdc-autocomplete__input\"\n type=\"text\"\n [attr.aria-label]=\"placeholder | translate\"\n [placeholder]=\"placeholder | translate\"\n [readOnly]=\"readonly\"\n [(ngModel)]=\"inputValue\"\n [disabled]=\"disabled\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"activeDescendantId\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyup)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading) {\n <span class=\"sdc-autocomplete__loader\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n </span>\n } @else if ((value || values.length > 0 || inputValue) && !disabled) {\n <button\n type=\"button\"\n class=\"sdc-autocomplete__clear\"\n tabindex=\"-1\"\n (click)=\"clear()\"\n >\n <i class=\"far fa-times\"></i>\n </button>\n }\n </div>\n\n @if (dropdown) {\n <button\n type=\"button\"\n class=\"sdc-autocomplete__toggle\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas\"\n [class.fa-caret-down]=\"!isOpen\"\n [class.fa-caret-up]=\"isOpen\"\n ></i>\n </button>\n }\n</div>\n\n@if ((showEmptyMessage || filteredSuggestions.length > 0) && !readonly) {\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"closeDropdownPanel()\"\n (detach)=\"closeDropdownPanel()\"\n>\n <div\n class=\"sdc-autocomplete__panel\"\n [id]=\"'dropdown-container-' + componentId\"\n [style.width.px]=\"containerDiv?.offsetWidth ?? null\"\n >\n <ul\n class=\"sdc-autocomplete__list\"\n >\n @if (virtualScroll && filteredSuggestions.length > 10) {\n <cdk-virtual-scroll-viewport\n class=\"sdc-autocomplete__viewport\"\n [itemSize]=\"virtualScrollItemSize\"\n >\n <ng-container\n *cdkVirtualFor=\"let suggestion of filteredSuggestions; let i = index; trackBy: trackBySuggestionId\"\n >\n <li\n [id]=\"suggestion.id\"\n class=\"sdc-autocomplete__option\"\n [class.sdc-autocomplete__option--focused]=\"i === focusedIndex\"\n [class.sdc-autocomplete__option--selected]=\"isSuggestionSelected(suggestion)\"\n (click)=\"selectSuggestion(suggestion.data)\"\n (keydown.enter)=\"selectSuggestion(suggestion.data)\"\n (keydown.space)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark && multiple && isSuggestionSelected(suggestion)) {\n <i class=\"far fa-check\"></i>\n }\n {{ toDisplayValue(suggestion.data) }}\n </li>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n } @else {\n @for (suggestion of filteredSuggestions; track suggestion.id; let i = $index) {\n <li\n [id]=\"suggestion.id\"\n class=\"sdc-autocomplete__option\"\n [class.sdc-autocomplete__option--focused]=\"i === focusedIndex\"\n [class.sdc-autocomplete__option--selected]=\"isSuggestionSelected(suggestion)\"\n (click)=\"selectSuggestion(suggestion.data)\"\n (keydown.enter)=\"selectSuggestion(suggestion.data)\"\n (keydown.space)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark && multiple && isSuggestionSelected(suggestion)) {\n <i class=\"far fa-check\"></i>\n }\n {{ toDisplayValue(suggestion.data) }}\n </li>\n }\n }\n\n @if (showEmptyMessage) {\n <li class=\"sdc-autocomplete__empty\">{{ emptyMessage | translate }}</li>\n }\n </ul>\n </div>\n</ng-template>\n}\n", styles: [":host{display:block}.sdc-autocomplete{display:flex;align-items:stretch;width:100%;min-height:2.25rem;overflow:hidden;border:1px solid #c1c1cc;border-radius:.25rem;background:#fff}.sdc-autocomplete--invalid{border-color:#d9534f}.sdc-autocomplete--disabled{background:#f7f7f8;color:#999}.sdc-autocomplete__control{display:flex;flex:1 1 auto;flex-wrap:wrap;align-items:center;gap:.375rem;padding:.25rem .5rem}.sdc-autocomplete__chips{display:flex;flex-wrap:wrap;gap:.375rem}.sdc-autocomplete__input{flex:1 1 7rem;min-width:0;border:0;outline:none;background:transparent}.sdc-autocomplete__clear,.sdc-autocomplete__toggle{display:inline-flex;align-items:center;justify-content:center;width:2.25rem;border:0;background:transparent;cursor:pointer;color:#666}.sdc-autocomplete__toggle{border-left:1px solid #e2e2e4}.sdc-autocomplete__loader{color:#428bca}.sdc-autocomplete__panel{margin-top:.25rem;overflow:hidden;border-radius:.25rem;background:#fff;box-shadow:0 .5rem 1.5rem #0000001f}.sdc-autocomplete__list{max-height:13rem;margin:0;padding:.25rem 0;overflow:auto;list-style:none}.sdc-autocomplete__viewport{height:13rem}.sdc-autocomplete__option,.sdc-autocomplete__empty{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;color:#444}.sdc-autocomplete__option{cursor:pointer}.sdc-autocomplete__option--focused{background:#f3f7fa}.sdc-autocomplete__option--selected{background:#e9f2f8}.sdc-autocomplete__empty{color:#777}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i4.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i4.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "component", type: AutocompleteChipComponent, selector: "sdc-autocomplete-chip", inputs: ["suggestion", "suggestionLabel"], outputs: ["suggestionRemoved"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
418
+ }
419
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AutocompleteComponent, decorators: [{
420
+ type: Component,
421
+ args: [{ selector: 'sdc-autocomplete', standalone: true, imports: [
422
+ CommonModule,
423
+ FormsModule,
424
+ OverlayModule,
425
+ ScrollingModule,
426
+ TranslateModule,
427
+ AutocompleteChipComponent
428
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, providers: [
429
+ {
430
+ provide: NG_VALUE_ACCESSOR,
431
+ useExisting: forwardRef(() => AutocompleteComponent),
432
+ multi: true
433
+ }
434
+ ], host: {
435
+ role: 'combobox',
436
+ '[attr.aria-expanded]': 'isOpen',
437
+ '[attr.aria-haspopup]': '"listbox"',
438
+ '(window:resize)': 'onWindowResize()'
439
+ }, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"sdc-autocomplete\"\n [class.sdc-autocomplete--disabled]=\"disabled\"\n [class.sdc-autocomplete--invalid]=\"invalid\"\n [class.sdc-autocomplete--multiple]=\"multiple\"\n [ngClass]=\"inputClass\"\n>\n <div class=\"sdc-autocomplete__control\">\n @if (multiple && values.length > 0) {\n <div class=\"sdc-autocomplete__chips\">\n @for (suggestion of values; track suggestion) {\n <sdc-autocomplete-chip\n [suggestion]=\"suggestion\"\n [suggestionLabel]=\"suggestionLabel\"\n (suggestionRemoved)=\"removeSuggestion($event)\"\n ></sdc-autocomplete-chip>\n }\n </div>\n }\n\n <input\n #inputEl\n [id]=\"componentId\"\n class=\"sdc-autocomplete__input\"\n type=\"text\"\n [attr.aria-label]=\"placeholder | translate\"\n [placeholder]=\"placeholder | translate\"\n [readOnly]=\"readonly\"\n [(ngModel)]=\"inputValue\"\n [disabled]=\"disabled\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : 'both'\"\n [attr.aria-activedescendant]=\"activeDescendantId\"\n role=\"searchbox\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeyDown($event)\"\n (keyup)=\"onKeyUp($event)\"\n (blur)=\"onInputBlur($event)\"\n (focus)=\"onInputFocus($event)\"\n />\n\n @if (loading) {\n <span class=\"sdc-autocomplete__loader\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n </span>\n } @else if ((value || values.length > 0 || inputValue) && !disabled) {\n <button\n type=\"button\"\n class=\"sdc-autocomplete__clear\"\n tabindex=\"-1\"\n (click)=\"clear()\"\n >\n <i class=\"far fa-times\"></i>\n </button>\n }\n </div>\n\n @if (dropdown) {\n <button\n type=\"button\"\n class=\"sdc-autocomplete__toggle\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n >\n <i\n class=\"fas\"\n [class.fa-caret-down]=\"!isOpen\"\n [class.fa-caret-up]=\"isOpen\"\n ></i>\n </button>\n }\n</div>\n\n@if ((showEmptyMessage || filteredSuggestions.length > 0) && !readonly) {\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"closeDropdownPanel()\"\n (detach)=\"closeDropdownPanel()\"\n>\n <div\n class=\"sdc-autocomplete__panel\"\n [id]=\"'dropdown-container-' + componentId\"\n [style.width.px]=\"containerDiv?.offsetWidth ?? null\"\n >\n <ul\n class=\"sdc-autocomplete__list\"\n >\n @if (virtualScroll && filteredSuggestions.length > 10) {\n <cdk-virtual-scroll-viewport\n class=\"sdc-autocomplete__viewport\"\n [itemSize]=\"virtualScrollItemSize\"\n >\n <ng-container\n *cdkVirtualFor=\"let suggestion of filteredSuggestions; let i = index; trackBy: trackBySuggestionId\"\n >\n <li\n [id]=\"suggestion.id\"\n class=\"sdc-autocomplete__option\"\n [class.sdc-autocomplete__option--focused]=\"i === focusedIndex\"\n [class.sdc-autocomplete__option--selected]=\"isSuggestionSelected(suggestion)\"\n (click)=\"selectSuggestion(suggestion.data)\"\n (keydown.enter)=\"selectSuggestion(suggestion.data)\"\n (keydown.space)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark && multiple && isSuggestionSelected(suggestion)) {\n <i class=\"far fa-check\"></i>\n }\n {{ toDisplayValue(suggestion.data) }}\n </li>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n } @else {\n @for (suggestion of filteredSuggestions; track suggestion.id; let i = $index) {\n <li\n [id]=\"suggestion.id\"\n class=\"sdc-autocomplete__option\"\n [class.sdc-autocomplete__option--focused]=\"i === focusedIndex\"\n [class.sdc-autocomplete__option--selected]=\"isSuggestionSelected(suggestion)\"\n (click)=\"selectSuggestion(suggestion.data)\"\n (keydown.enter)=\"selectSuggestion(suggestion.data)\"\n (keydown.space)=\"selectSuggestion(suggestion.data)\"\n >\n @if (checkmark && multiple && isSuggestionSelected(suggestion)) {\n <i class=\"far fa-check\"></i>\n }\n {{ toDisplayValue(suggestion.data) }}\n </li>\n }\n }\n\n @if (showEmptyMessage) {\n <li class=\"sdc-autocomplete__empty\">{{ emptyMessage | translate }}</li>\n }\n </ul>\n </div>\n</ng-template>\n}\n", styles: [":host{display:block}.sdc-autocomplete{display:flex;align-items:stretch;width:100%;min-height:2.25rem;overflow:hidden;border:1px solid #c1c1cc;border-radius:.25rem;background:#fff}.sdc-autocomplete--invalid{border-color:#d9534f}.sdc-autocomplete--disabled{background:#f7f7f8;color:#999}.sdc-autocomplete__control{display:flex;flex:1 1 auto;flex-wrap:wrap;align-items:center;gap:.375rem;padding:.25rem .5rem}.sdc-autocomplete__chips{display:flex;flex-wrap:wrap;gap:.375rem}.sdc-autocomplete__input{flex:1 1 7rem;min-width:0;border:0;outline:none;background:transparent}.sdc-autocomplete__clear,.sdc-autocomplete__toggle{display:inline-flex;align-items:center;justify-content:center;width:2.25rem;border:0;background:transparent;cursor:pointer;color:#666}.sdc-autocomplete__toggle{border-left:1px solid #e2e2e4}.sdc-autocomplete__loader{color:#428bca}.sdc-autocomplete__panel{margin-top:.25rem;overflow:hidden;border-radius:.25rem;background:#fff;box-shadow:0 .5rem 1.5rem #0000001f}.sdc-autocomplete__list{max-height:13rem;margin:0;padding:.25rem 0;overflow:auto;list-style:none}.sdc-autocomplete__viewport{height:13rem}.sdc-autocomplete__option,.sdc-autocomplete__empty{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;color:#444}.sdc-autocomplete__option{cursor:pointer}.sdc-autocomplete__option--focused{background:#f3f7fa}.sdc-autocomplete__option--selected{background:#e9f2f8}.sdc-autocomplete__empty{color:#777}\n"] }]
440
+ }], ctorParameters: () => [], propDecorators: { suggestions: [{
441
+ type: Input
442
+ }], placeholder: [{
443
+ type: Input
444
+ }], suggestionValue: [{
445
+ type: Input
446
+ }], suggestionLabel: [{
447
+ type: Input
448
+ }], readonly: [{
449
+ type: Input
450
+ }], emptyMessage: [{
451
+ type: Input
452
+ }], delay: [{
453
+ type: Input
454
+ }], invalid: [{
455
+ type: Input
456
+ }], virtualScroll: [{
457
+ type: Input
458
+ }], virtualScrollItemSize: [{
459
+ type: Input
460
+ }], lazy: [{
461
+ type: Input
462
+ }], dropdown: [{
463
+ type: Input
464
+ }], forceSelection: [{
465
+ type: Input
466
+ }], checkmark: [{
467
+ type: Input
468
+ }], multiple: [{
469
+ type: Input
470
+ }], minLengthToSearch: [{
471
+ type: Input
472
+ }], inputClass: [{
473
+ type: Input
474
+ }], dataKey: [{
475
+ type: Input
476
+ }], disabled: [{
477
+ type: Input
478
+ }], lazyLoad: [{
479
+ type: Output
480
+ }], selected: [{
481
+ type: Output
482
+ }], unselected: [{
483
+ type: Output
484
+ }], blurred: [{
485
+ type: Output
486
+ }], cleared: [{
487
+ type: Output
488
+ }], keyUp: [{
489
+ type: Output
490
+ }], focused: [{
491
+ type: Output
492
+ }], completeMethod: [{
493
+ type: Output
494
+ }], containerDiv: [{
495
+ type: ViewChild,
496
+ args: ['containerDiv']
497
+ }], inputEl: [{
498
+ type: ViewChild,
499
+ args: ['inputEl']
500
+ }] } });
501
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpGLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsc0NBQXNDLEVBQ3RDLCtCQUErQixFQUMvQixvQ0FBb0MsRUFDckMsTUFBTSx5Q0FBeUMsQ0FBQztBQU1qRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQzs7Ozs7OztBQXFDdkcsTUFBTSxPQUFPLHFCQUFxQjtJQUN4QixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVsQixN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SztzQkFBZCxNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFFOEIsWUFBWTtzQkFBaEQsU0FBUzt1QkFBQyxjQUFjO2dCQUNPLE9BQU87c0JBQXRDLFNBQVM7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB0eXBlIHsgQ29ubmVjdGVkUG9zaXRpb24sIFNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgQVVUT0NPTVBMRVRFX0RFRkFVTFRfREVMQVksXG4gIEFVVE9DT01QTEVURV9ERUZBVUxUX0VNUFRZX01FU1NBR0VfS0VZLFxuICBBVVRPQ09NUExFVEVfREVGQVVMVF9NSU5fTEVOR1RILFxuICBBVVRPQ09NUExFVEVfREVGQVVMVF9QTEFDRUhPTERFUl9LRVlcbn0gZnJvbSAnLi4vLi4vY29yZS9jb25zdGFudHMvYXV0b2NvbXBsZXRlLmNvbnN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXV0b2NvbXBsZXRlQ29tcGxldGVFdmVudCxcbiAgQXV0b2NvbXBsZXRlTGF6eUxvYWRFdmVudCxcbiAgQXV0b2NvbXBsZXRlV3JpdGVWYWx1ZVxufSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2F1dG9jb21wbGV0ZS50eXBlJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZUNoaXBDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYXV0b2NvbXBsZXRlLWNoaXAvYXV0b2NvbXBsZXRlLWNoaXAuY29tcG9uZW50JztcblxudHlwZSBTdWdnZXN0aW9uV3JhcHBlcjxUPiA9IHtcbiAgZGF0YTogVDtcbiAgaWQ6IHN0cmluZztcbiAgaXNTZWxlY3RlZD86IGJvb2xlYW47XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZGMtYXV0b2NvbXBsZXRlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBPdmVybGF5TW9kdWxlLFxuICAgIFNjcm9sbGluZ01vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgQXV0b2NvbXBsZXRlQ2hpcENvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBdXRvY29tcGxldGVDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIGhvc3Q6IHtcbiAgICByb2xlOiAnY29tYm9ib3gnLFxuICAgICdbYXR0ci5hcmlhLWV4cGFuZGVkXSc6ICdpc09wZW4nLFxuICAgICdbYXR0ci5hcmlhLWhhc3BvcHVwXSc6ICdcImxpc3Rib3hcIicsXG4gICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvbldpbmRvd1Jlc2l6ZSgpJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIEF1dG9jb21wbGV0ZUNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYWxsb2NhdGVDb21wb25lbnRJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5leHRJZCA9IEF1dG9jb21wbGV0ZUNvbXBvbmVudC5uZXh0SWQ7XG4gICAgQXV0b2NvbXBsZXRlQ29tcG9uZW50Lm5leHRJZCArPSAxO1xuICAgIHJldHVybiBgc2RjLWF1dG9jb21wbGV0ZS0ke25leHRJZH1gO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5wdXRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhenlMb2FkU3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIEBJbnB1dCgpIHN1Z2dlc3Rpb25zOiBUW10gPSBbXTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSBBVVRPQ09NUExFVEVfREVGQVVMVF9QTEFDRUhPTERFUl9LRVk7XG4gIEBJbnB1dCgpIHN1Z2dlc3Rpb25WYWx1ZT86IGtleW9mIFQ7XG4gIEBJbnB1dCgpIHN1Z2dlc3Rpb25MYWJlbD86IGtleW9mIFQ7XG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGVtcHR5TWVzc2FnZSA9IEFVVE9DT01QTEVURV9ERUZBVUxUX0VNUFRZX01FU1NBR0VfS0VZO1xuICBASW5wdXQoKSBkZWxheSA9IEFVVE9DT01QTEVURV9ERUZBVUxUX0RFTEFZO1xuICBASW5wdXQoKSBpbnZhbGlkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHZpcnR1YWxTY3JvbGwgPSBmYWxzZTtcbiAgQElucHV0KCkgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gMzc7XG4gIEBJbnB1dCgpIGxhenkgPSBmYWxzZTtcbiAgQElucHV0KCkgZHJvcGRvd24gPSBmYWxzZTtcbiAgQElucHV0KCkgZm9yY2VTZWxlY3Rpb24gPSBmYWxzZTtcbiAgQElucHV0KCkgY2hlY2ttYXJrID0gZmFsc2U7XG4gIEBJbnB1dCgpIG11bHRpcGxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1pbkxlbmd0aFRvU2VhcmNoID0gQVVUT0NPTVBMRVRFX0RFRkFVTFRfTUlOX0xFTkdUSDtcbiAgQElucHV0KCkgaW5wdXRDbGFzcyA9ICcnO1xuICBASW5wdXQoKSBkYXRhS2V5Pzoga2V5b2YgVDtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgbGF6eUxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPEF1dG9jb21wbGV0ZUxhenlMb2FkRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIHVuc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSBibHVycmVkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNsZWFyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBrZXlVcCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBmb2N1c2VkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNvbXBsZXRlTWV0aG9kID0gbmV3IEV2ZW50RW1pdHRlcjxBdXRvY29tcGxldGVDb21wbGV0ZUV2ZW50PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lckRpdicpIHByb3RlY3RlZCBjb250YWluZXJEaXY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnaW5wdXRFbCcpIHByb3RlY3RlZCBpbnB1dEVsPzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29tcG9uZW50SWQgPSBBdXRvY29tcGxldGVDb21wb25lbnQuYWxsb2NhdGVDb21wb25lbnRJZCgpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2Nyb2xsU3RyYXRlZ3k6IFNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuY2xvc2UoKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG92ZXJsYXlQb3NpdGlvbnM6IENvbm5lY3RlZFBvc2l0aW9uW10gPSBbXG4gICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJyB9LFxuICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2JvdHRvbScgfSxcbiAgXTtcblxuICBwcm90ZWN0ZWQgaW5wdXRWYWx1ZSA9ICcnO1xuICBwcm90ZWN0ZWQgaXNPcGVuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBsb2FkaW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzaG93RW1wdHlNZXNzYWdlID0gZmFsc2U7XG4gIHByb3RlY3RlZCBmb2N1c2VkSW5kZXggPSAtMTtcbiAgcHJvdGVjdGVkIGZpbHRlcmVkU3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+W10gPSBbXTtcbiAgcHJvdGVjdGVkIHZhbHVlOiBUIHwgc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCB2YWx1ZXM6IFRbXSA9IFtdO1xuXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHsgfTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XG4gIHByaXZhdGUgbGF6eVJlcXVlc3RJZCA9IDA7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuaW5wdXRTdWJqZWN0LnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVsYXkpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoKHF1ZXJ5KSA9PiB7XG4gICAgICAgIGlmIChxdWVyeS5sZW5ndGggPCB0aGlzLm1pbkxlbmd0aFRvU2VhcmNoICYmIHF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBbXTtcbiAgICAgICAgICB0aGlzLnNob3dFbXB0eU1lc3NhZ2UgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleCA9IC0xO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkU3VnZ2VzdGlvbnMocXVlcnkpO1xuXG4gICAgICAgIGlmICghdGhpcy5mb3JjZVNlbGVjdGlvbiAmJiAhdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIHRoaXMub25DaGFuZ2UocXVlcnkpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5sYXp5TG9hZFN1YmplY3QucGlwZShkZWJvdW5jZVRpbWUodGhpcy5kZWxheSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnN1YnNjcmliZSgocXVlcnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sYXp5UmVxdWVzdElkICs9IDE7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMubGF6eVJlcXVlc3RJZDtcbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICB0aGlzLmxhenlMb2FkLmVtaXQoe1xuICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgIHJlc3BvbnNlOiAoZGF0YTogVFtdKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdElkICE9PSB0aGlzLmxhenlSZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3VnZ2VzdGlvbnMgPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRTdWdnZXN0aW9ucyhxdWVyeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc3VnZ2VzdGlvbnMnXSAmJiAhdGhpcy5sYXp5KSB7XG4gICAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZFN1Z2dlc3Rpb25zKHRoaXMuaW5wdXRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBBdXRvY29tcGxldGVXcml0ZVZhbHVlPFQ+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMudmFsdWVzID0gdGhpcy5ub3JtYWxpemVNdWx0aXBsZVZhbHVlKHZhbHVlKTtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcnO1xuICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZFN1Z2dlc3Rpb25zKHRoaXMuaW5wdXRWYWx1ZSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXV0b2NvbXBsZXRlIHZhbHVlIG11c3Qgbm90IGJlIGFuIGFycmF5IHdoZW4gbXVsdGlwbGUgaXMgZmFsc2UuJyk7XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlID8/IG51bGw7XG4gICAgdGhpcy5pbnB1dFZhbHVlID0gdGhpcy50b0Rpc3BsYXlWYWx1ZSh2YWx1ZSA/PyBudWxsKTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZFN1Z2dlc3Rpb25zKHRoaXMuaW5wdXRWYWx1ZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2U7XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA/PyAnJztcbiAgICB0aGlzLmlucHV0VmFsdWUgPSBxdWVyeTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuXG4gICAgaWYgKHRoaXMubGF6eSkge1xuICAgICAgdGhpcy5sYXp5TG9hZFN1YmplY3QubmV4dChxdWVyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29tcGxldGVNZXRob2QuZW1pdCh7IHF1ZXJ5IH0pO1xuICAgICAgdGhpcy5pbnB1dFN1YmplY3QubmV4dChxdWVyeSk7XG4gICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnB1dEJsdXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG5cbiAgICBpZiAoIXRoaXMuZm9yY2VTZWxlY3Rpb24gfHwgdGhpcy5tdWx0aXBsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5maW5kRXhhY3RNYXRjaCh0aGlzLmlucHV0VmFsdWUpO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlID0gdGhpcy50b0Rpc3BsYXlWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0U3VnZ2VzdGlvbihtYXRjaC5kYXRhKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbklucHV0Rm9jdXMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRsZUNsb3NlZFBhbmVsS2V5RG93bihldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgdGhpcy5tb3ZlRm9jdXNCeSgxLCBldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICB0aGlzLm1vdmVGb2N1c0J5KC0xLCBldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgIHRoaXMuc2VsZWN0Rm9jdXNlZFN1Z2dlc3Rpb24oZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd25QYW5lbCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uS2V5VXAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5rZXlVcC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbldpbmRvd1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlRHJvcGRvd25QYW5lbCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogVCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICBpZiAoIXRoaXMudmFsdWVzLnNvbWUoKHZhbHVlKSA9PiB0aGlzLmFyZVN1Z2dlc3Rpb25zRXF1YWwodmFsdWUsIHN1Z2dlc3Rpb24pKSkge1xuICAgICAgICB0aGlzLnZhbHVlcyA9IFsuLi50aGlzLnZhbHVlcywgc3VnZ2VzdGlvbl07XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlucHV0VmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHN1Z2dlc3Rpb247XG4gICAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLnRvRGlzcGxheVZhbHVlKHN1Z2dlc3Rpb24pO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmdldFN1Z2dlc3Rpb25SZXN1bHRWYWx1ZShzdWdnZXN0aW9uKSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZC5lbWl0KHN1Z2dlc3Rpb24pO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkU3VnZ2VzdGlvbnModGhpcy5pbnB1dFZhbHVlKTtcbiAgICB0aGlzLmNsb3NlRHJvcGRvd25QYW5lbCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIHRoaXMudmFsdWVzID0gW107XG4gICAgdGhpcy5pbnB1dFZhbHVlID0gJyc7XG4gICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zID0gW107XG4gICAgdGhpcy5zaG93RW1wdHlNZXNzYWdlID0gZmFsc2U7XG4gICAgdGhpcy5jbG9zZURyb3Bkb3duUGFuZWwoKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMubXVsdGlwbGUgPyBbXSA6IG51bGwpO1xuICAgIHRoaXMuY2xlYXJlZC5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgdGhpcy5jbG9zZURyb3Bkb3duUGFuZWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW5Ecm9wZG93blBhbmVsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVtb3ZlU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBUKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXMgPSB0aGlzLnZhbHVlcy5maWx0ZXIoKHZhbHVlKSA9PiAhdGhpcy5hcmVTdWdnZXN0aW9uc0VxdWFsKHZhbHVlLCBzdWdnZXN0aW9uKSk7XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlcyk7XG4gICAgdGhpcy51bnNlbGVjdGVkLmVtaXQoc3VnZ2VzdGlvbik7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRTdWdnZXN0aW9ucyh0aGlzLmlucHV0VmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrQnlTdWdnZXN0aW9uSWQoXzogbnVtYmVyLCBpdGVtOiBTdWdnZXN0aW9uV3JhcHBlcjxUPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0uaWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTdWdnZXN0aW9uU2VsZWN0ZWQoc3VnZ2VzdGlvbjogU3VnZ2VzdGlvbldyYXBwZXI8VD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VnZ2VzdGlvbi5pc1NlbGVjdGVkID09PSB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhY3RpdmVEZXNjZW5kYW50SWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9uc1t0aGlzLmZvY3VzZWRJbmRleF0/LmlkID8/IG51bGw7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3BlbkRyb3Bkb3duUGFuZWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGF6eSkge1xuICAgICAgdGhpcy5sYXp5TG9hZFN1YmplY3QubmV4dCh0aGlzLmlucHV0VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZFN1Z2dlc3Rpb25zKHRoaXMuaW5wdXRWYWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsb3NlRHJvcGRvd25QYW5lbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuZm9jdXNlZEluZGV4ID0gLTE7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hGaWx0ZXJlZFN1Z2dlc3Rpb25zKHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBxdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBhbGxTdWdnZXN0aW9ucyA9IHRoaXMuc3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiB0aGlzLndyYXBTdWdnZXN0aW9uKHN1Z2dlc3Rpb24pKTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVyU3VnZ2VzdGlvbnNCeVF1ZXJ5KG5vcm1hbGl6ZWRRdWVyeSwgYWxsU3VnZ2VzdGlvbnMpO1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gbmV3IFNldCh0aGlzLnZhbHVlcy5tYXAoKHZhbHVlKSA9PiB0aGlzLmdldFN1Z2dlc3Rpb25JZGVudGl0eSh2YWx1ZSkpKTtcblxuICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucyA9IHRoaXMubWFya1NlbGVjdGVkU3VnZ2VzdGlvbnMoZmlsdGVyZWQsIHNlbGVjdGVkSWRzKTtcbiAgICB0aGlzLnNob3dFbXB0eU1lc3NhZ2UgPSB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMubGVuZ3RoID09PSAwICYmIG5vcm1hbGl6ZWRRdWVyeS5sZW5ndGggPj0gMDtcbiAgICB0aGlzLmZvY3VzZWRJbmRleCA9IHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5sZW5ndGggPyAwIDogLTE7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlclN1Z2dlc3Rpb25zQnlRdWVyeShxdWVyeTogc3RyaW5nLCBzdWdnZXN0aW9uczogU3VnZ2VzdGlvbldyYXBwZXI8VD5bXSk6IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+W10ge1xuICAgIHJldHVybiBxdWVyeVxuICAgICAgPyBzdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+XG4gICAgICAgIHRoaXMudG9EaXNwbGF5VmFsdWUoc3VnZ2VzdGlvbi5kYXRhKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KVxuICAgICAgKVxuICAgICAgOiBzdWdnZXN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgbWFya1NlbGVjdGVkU3VnZ2VzdGlvbnMoXG4gICAgc3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+W10sXG4gICAgc2VsZWN0ZWRJZHM6IFNldDxzdHJpbmc+XG4gICk6IFN1Z2dlc3Rpb25XcmFwcGVyPFQ+W10ge1xuICAgIHJldHVybiBzdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+ICh7XG4gICAgICAuLi5zdWdnZXN0aW9uLFxuICAgICAgaXNTZWxlY3RlZDogc2VsZWN0ZWRJZHMuaGFzKHN1Z2dlc3Rpb24uaWQpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBUKTogU3VnZ2VzdGlvbldyYXBwZXI8VD4ge1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBzdWdnZXN0aW9uLFxuICAgICAgaWQ6IHRoaXMuZ2V0U3VnZ2VzdGlvbklkZW50aXR5KHN1Z2dlc3Rpb24pXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3VnZ2VzdGlvbklkZW50aXR5KHN1Z2dlc3Rpb246IFQpOiBzdHJpbmcge1xuICAgIGlmICghc3VnZ2VzdGlvbiB8fCB0eXBlb2Ygc3VnZ2VzdGlvbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcoc3VnZ2VzdGlvbiA/PyAnJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb2JqZWN0U3VnZ2VzdGlvbiA9IHN1Z2dlc3Rpb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qgc2VsZWN0ZWRLZXkgPSB0aGlzLmRhdGFLZXkgPz8gdGhpcy5zdWdnZXN0aW9uVmFsdWU7XG5cbiAgICBpZiAoc2VsZWN0ZWRLZXkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSBvYmplY3RTdWdnZXN0aW9uW3NlbGVjdGVkS2V5IGFzIHN0cmluZ107XG4gICAgICByZXR1cm4gdGhpcy5zdHJpbmdpZnlJZGVudGl0eVZhbHVlKHNlbGVjdGVkVmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdWdnZXN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RyaW5naWZ5SWRlbnRpdHlWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJykge1xuICAgICAgcmV0dXJuIHZhbHVlLmRlc2NyaXB0aW9uID8/ICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2xvc2VkUGFuZWxLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNPcGVuICYmIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyAmJiAhdGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMub3BlbkRyb3Bkb3duUGFuZWwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbW92ZUZvY3VzQnkoc3RlcDogMSB8IC0xLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoc3RlcCA+IDApIHtcbiAgICAgIHRoaXMuZm9jdXNlZEluZGV4ID0gTWF0aC5taW4odGhpcy5mb2N1c2VkSW5kZXggKyAxLCB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMubGVuZ3RoIC0gMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNlZEluZGV4ID0gTWF0aC5tYXgodGhpcy5mb2N1c2VkSW5kZXggLSAxLCAwKTtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbEZvY3VzZWRTdWdnZXN0aW9uSW50b1ZpZXcoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0Rm9jdXNlZFN1Z2dlc3Rpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVTdWdnZXN0aW9uID0gdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zW3RoaXMuZm9jdXNlZEluZGV4XTtcblxuICAgIGlmIChhY3RpdmVTdWdnZXN0aW9uKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZWxlY3RTdWdnZXN0aW9uKGFjdGl2ZVN1Z2dlc3Rpb24uZGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZURyb3Bkb3duUGFuZWwoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3VnZ2VzdGlvblJlc3VsdFZhbHVlKHN1Z2dlc3Rpb246IFQpOiB1bmtub3duIHtcbiAgICBpZiAoIXRoaXMuc3VnZ2VzdGlvblZhbHVlIHx8ICFzdWdnZXN0aW9uIHx8IHR5cGVvZiBzdWdnZXN0aW9uICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHN1Z2dlc3Rpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1Z2dlc3Rpb25bdGhpcy5zdWdnZXN0aW9uVmFsdWVdO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvRGlzcGxheVZhbHVlKHZhbHVlOiBUIHwgc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25MYWJlbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlW3RoaXMuc3VnZ2VzdGlvbkxhYmVsXSA/PyAnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZU11bHRpcGxlVmFsdWUodmFsdWU6IEF1dG9jb21wbGV0ZVdyaXRlVmFsdWU8VD4pOiBUW10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBUID0+IHR5cGVvZiBlbnRyeSAhPT0gJ3N0cmluZycpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHByaXZhdGUgYXJlU3VnZ2VzdGlvbnNFcXVhbChsZWZ0OiBULCByaWdodDogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFN1Z2dlc3Rpb25JZGVudGl0eShsZWZ0KSA9PT0gdGhpcy5nZXRTdWdnZXN0aW9uSWRlbnRpdHkocmlnaHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRXhhY3RNYXRjaChxdWVyeTogc3RyaW5nKTogU3VnZ2VzdGlvbldyYXBwZXI8VD4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRRdWVyeSA9IHF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgcmV0dXJuIHRoaXMuc3VnZ2VzdGlvbnNcbiAgICAgIC5tYXAoKHN1Z2dlc3Rpb24pID0+IHRoaXMud3JhcFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbikpXG4gICAgICAuZmluZCgoc3VnZ2VzdGlvbikgPT4gdGhpcy50b0Rpc3BsYXlWYWx1ZShzdWdnZXN0aW9uLmRhdGEpLnRvTG93ZXJDYXNlKCkgPT09IG5vcm1hbGl6ZWRRdWVyeSk7XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbEZvY3VzZWRTdWdnZXN0aW9uSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aXZlSWQgPSB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnNbdGhpcy5mb2N1c2VkSW5kZXhdPy5pZDtcblxuICAgICAgaWYgKCFhY3RpdmVJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjdGl2ZUlkKT8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2XG4gICNjb250YWluZXJEaXZcbiAgY2RrT3ZlcmxheU9yaWdpblxuICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICBjbGFzcz1cInNkYy1hdXRvY29tcGxldGVcIlxuICBbY2xhc3Muc2RjLWF1dG9jb21wbGV0ZS0tZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbY2xhc3Muc2RjLWF1dG9jb21wbGV0ZS0taW52YWxpZF09XCJpbnZhbGlkXCJcbiAgW2NsYXNzLnNkYy1hdXRvY29tcGxldGUtLW11bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgW25nQ2xhc3NdPVwiaW5wdXRDbGFzc1wiXG4+XG4gIDxkaXYgY2xhc3M9XCJzZGMtYXV0b2NvbXBsZXRlX19jb250cm9sXCI+XG4gICAgQGlmIChtdWx0aXBsZSAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJzZGMtYXV0b2NvbXBsZXRlX19jaGlwc1wiPlxuICAgICAgQGZvciAoc3VnZ2VzdGlvbiBvZiB2YWx1ZXM7IHRyYWNrIHN1Z2dlc3Rpb24pIHtcbiAgICAgIDxzZGMtYXV0b2NvbXBsZXRlLWNoaXBcbiAgICAgICAgW3N1Z2dlc3Rpb25dPVwic3VnZ2VzdGlvblwiXG4gICAgICAgIFtzdWdnZXN0aW9uTGFiZWxdPVwic3VnZ2VzdGlvbkxhYmVsXCJcbiAgICAgICAgKHN1Z2dlc3Rpb25SZW1vdmVkKT1cInJlbW92ZVN1Z2dlc3Rpb24oJGV2ZW50KVwiXG4gICAgICA+PC9zZGMtYXV0b2NvbXBsZXRlLWNoaXA+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPGlucHV0XG4gICAgICAjaW5wdXRFbFxuICAgICAgW2lkXT1cImNvbXBvbmVudElkXCJcbiAgICAgIGNsYXNzPVwic2RjLWF1dG9jb21wbGV0ZV9faW5wdXRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJwbGFjZWhvbGRlciB8IHRyYW5zbGF0ZVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgW3JlYWRPbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgIFsobmdNb2RlbCldPVwiaW5wdXRWYWx1ZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwibXVsdGlwbGUgPyAnbGlzdCcgOiAnYm90aCdcIlxuICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImFjdGl2ZURlc2NlbmRhbnRJZFwiXG4gICAgICByb2xlPVwic2VhcmNoYm94XCJcbiAgICAgIChpbnB1dCk9XCJvbklucHV0KCRldmVudClcIlxuICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgKGtleXVwKT1cIm9uS2V5VXAoJGV2ZW50KVwiXG4gICAgICAoYmx1cik9XCJvbklucHV0Qmx1cigkZXZlbnQpXCJcbiAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoJGV2ZW50KVwiXG4gICAgLz5cblxuICAgIEBpZiAobG9hZGluZykge1xuICAgIDxzcGFuIGNsYXNzPVwic2RjLWF1dG9jb21wbGV0ZV9fbG9hZGVyXCI+XG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1zcGlubmVyIGZhLXNwaW5cIj48L2k+XG4gICAgPC9zcGFuPlxuICAgIH0gQGVsc2UgaWYgKCh2YWx1ZSB8fCB2YWx1ZXMubGVuZ3RoID4gMCB8fCBpbnB1dFZhbHVlKSAmJiAhZGlzYWJsZWQpIHtcbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwic2RjLWF1dG9jb21wbGV0ZV9fY2xlYXJcIlxuICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAoY2xpY2spPVwiY2xlYXIoKVwiXG4gICAgPlxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtdGltZXNcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cblxuICBAaWYgKGRyb3Bkb3duKSB7XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cInNkYy1hdXRvY29tcGxldGVfX3RvZ2dsZVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiXG4gID5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJmYXNcIlxuICAgICAgW2NsYXNzLmZhLWNhcmV0LWRvd25dPVwiIWlzT3BlblwiXG4gICAgICBbY2xhc3MuZmEtY2FyZXQtdXBdPVwiaXNPcGVuXCJcbiAgICA+PC9pPlxuICA8L2J1dHRvbj5cbiAgfVxuPC9kaXY+XG5cbkBpZiAoKHNob3dFbXB0eU1lc3NhZ2UgfHwgZmlsdGVyZWRTdWdnZXN0aW9ucy5sZW5ndGggPiAwKSAmJiAhcmVhZG9ubHkpIHtcbjxuZy10ZW1wbGF0ZVxuICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuXCJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnNdPVwib3ZlcmxheVBvc2l0aW9uc1wiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3ldPVwic2Nyb2xsU3RyYXRlZ3lcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheVZpZXdwb3J0TWFyZ2luXT1cIjhcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wXCJcbiAgKGJhY2tkcm9wQ2xpY2spPVwiY2xvc2VEcm9wZG93blBhbmVsKClcIlxuICAoZGV0YWNoKT1cImNsb3NlRHJvcGRvd25QYW5lbCgpXCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2RjLWF1dG9jb21wbGV0ZV9fcGFuZWxcIlxuICAgIFtpZF09XCInZHJvcGRvd24tY29udGFpbmVyLScgKyBjb21wb25lbnRJZFwiXG4gICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbnRhaW5lckRpdj8ub2Zmc2V0V2lkdGggPz8gbnVsbFwiXG4gID5cbiAgICA8dWxcbiAgICAgIGNsYXNzPVwic2RjLWF1dG9jb21wbGV0ZV9fbGlzdFwiXG4gICAgPlxuICAgICAgQGlmICh2aXJ0dWFsU2Nyb2xsICYmIGZpbHRlcmVkU3VnZ2VzdGlvbnMubGVuZ3RoID4gMTApIHtcbiAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgY2xhc3M9XCJzZGMtYXV0b2NvbXBsZXRlX192aWV3cG9ydFwiXG4gICAgICAgIFtpdGVtU2l6ZV09XCJ2aXJ0dWFsU2Nyb2xsSXRlbVNpemVcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKmNka1ZpcnR1YWxGb3I9XCJsZXQgc3VnZ2VzdGlvbiBvZiBmaWx0ZXJlZFN1Z2dlc3Rpb25zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5U3VnZ2VzdGlvbklkXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsaVxuICAgICAgICAgICAgW2lkXT1cInN1Z2dlc3Rpb24uaWRcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtYXV0b2NvbXBsZXRlX19vcHRpb25cIlxuICAgICAgICAgICAgW2NsYXNzLnNkYy1hdXRvY29tcGxldGVfX29wdGlvbi0tZm9jdXNlZF09XCJpID09PSBmb2N1c2VkSW5kZXhcIlxuICAgICAgICAgICAgW2NsYXNzLnNkYy1hdXRvY29tcGxldGVfX29wdGlvbi0tc2VsZWN0ZWRdPVwiaXNTdWdnZXN0aW9uU2VsZWN0ZWQoc3VnZ2VzdGlvbilcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbi5kYXRhKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb24uZGF0YSlcIlxuICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwic2VsZWN0U3VnZ2VzdGlvbihzdWdnZXN0aW9uLmRhdGEpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKGNoZWNrbWFyayAmJiBtdWx0aXBsZSAmJiBpc1N1Z2dlc3Rpb25TZWxlY3RlZChzdWdnZXN0aW9uKSkge1xuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtY2hlY2tcIj48L2k+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB7eyB0b0Rpc3BsYXlWYWx1ZShzdWdnZXN0aW9uLmRhdGEpIH19XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgQGZvciAoc3VnZ2VzdGlvbiBvZiBmaWx0ZXJlZFN1Z2dlc3Rpb25zOyB0cmFjayBzdWdnZXN0aW9uLmlkOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgPGxpXG4gICAgICAgIFtpZF09XCJzdWdnZXN0aW9uLmlkXCJcbiAgICAgICAgY2xhc3M9XCJzZGMtYXV0b2NvbXBsZXRlX19vcHRpb25cIlxuICAgICAgICBbY2xhc3Muc2RjLWF1dG9jb21wbGV0ZV9fb3B0aW9uLS1mb2N1c2VkXT1cImkgPT09IGZvY3VzZWRJbmRleFwiXG4gICAgICAgIFtjbGFzcy5zZGMtYXV0b2NvbXBsZXRlX19vcHRpb24tLXNlbGVjdGVkXT1cImlzU3VnZ2VzdGlvblNlbGVjdGVkKHN1Z2dlc3Rpb24pXCJcbiAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbi5kYXRhKVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cInNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbi5kYXRhKVwiXG4gICAgICAgIChrZXlkb3duLnNwYWNlKT1cInNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbi5kYXRhKVwiXG4gICAgICA+XG4gICAgICAgIEBpZiAoY2hlY2ttYXJrICYmIG11bHRpcGxlICYmIGlzU3VnZ2VzdGlvblNlbGVjdGVkKHN1Z2dlc3Rpb24pKSB7XG4gICAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLWNoZWNrXCI+PC9pPlxuICAgICAgICB9XG4gICAgICAgIHt7IHRvRGlzcGxheVZhbHVlKHN1Z2dlc3Rpb24uZGF0YSkgfX1cbiAgICAgIDwvbGk+XG4gICAgICB9XG4gICAgICB9XG5cbiAgICAgIEBpZiAoc2hvd0VtcHR5TWVzc2FnZSkge1xuICAgICAgPGxpIGNsYXNzPVwic2RjLWF1dG9jb21wbGV0ZV9fZW1wdHlcIj57eyBlbXB0eU1lc3NhZ2UgfCB0cmFuc2xhdGUgfX08L2xpPlxuICAgICAgfVxuICAgIDwvdWw+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbn1cbiJdfQ==