ngx-tethys 18.2.7 → 19.0.0-next.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 (943) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/badge/badge.component.d.ts +21 -3
  3. package/cascader/cascader-search-option.component.d.ts +6 -3
  4. package/core/store/store.d.ts +1 -1
  5. package/date-picker/abstract-picker.component.d.ts +1 -1
  6. package/date-picker/abstract-picker.directive.d.ts +1 -1
  7. package/date-picker/lib/calendar/calendar-header.component.d.ts +1 -1
  8. package/date-picker/lib/calendar/calendar-table.component.d.ts +1 -1
  9. package/date-range/date-range.component.d.ts +12 -2
  10. package/divider/divider.component.d.ts +2 -8
  11. package/dropdown/dropdown-menu.component.d.ts +1 -1
  12. package/empty/empty.component.d.ts +1 -4
  13. package/fesm2022/ngx-tethys-action.mjs +12 -12
  14. package/fesm2022/ngx-tethys-action.mjs.map +1 -1
  15. package/fesm2022/ngx-tethys-affix.mjs +8 -8
  16. package/fesm2022/ngx-tethys-affix.mjs.map +1 -1
  17. package/fesm2022/ngx-tethys-alert.mjs +12 -12
  18. package/fesm2022/ngx-tethys-alert.mjs.map +1 -1
  19. package/fesm2022/ngx-tethys-anchor.mjs +11 -13
  20. package/fesm2022/ngx-tethys-anchor.mjs.map +1 -1
  21. package/fesm2022/ngx-tethys-arrow-switcher.mjs +9 -9
  22. package/fesm2022/ngx-tethys-arrow-switcher.mjs.map +1 -1
  23. package/fesm2022/ngx-tethys-autocomplete.mjs +20 -20
  24. package/fesm2022/ngx-tethys-autocomplete.mjs.map +1 -1
  25. package/fesm2022/ngx-tethys-avatar.mjs +26 -26
  26. package/fesm2022/ngx-tethys-avatar.mjs.map +1 -1
  27. package/fesm2022/ngx-tethys-back-top.mjs +10 -10
  28. package/fesm2022/ngx-tethys-back-top.mjs.map +1 -1
  29. package/fesm2022/ngx-tethys-badge.mjs +9 -9
  30. package/fesm2022/ngx-tethys-badge.mjs.map +1 -1
  31. package/fesm2022/ngx-tethys-breadcrumb.mjs +13 -15
  32. package/fesm2022/ngx-tethys-breadcrumb.mjs.map +1 -1
  33. package/fesm2022/ngx-tethys-button.mjs +16 -16
  34. package/fesm2022/ngx-tethys-button.mjs.map +1 -1
  35. package/fesm2022/ngx-tethys-calendar.mjs +20 -20
  36. package/fesm2022/ngx-tethys-calendar.mjs.map +1 -1
  37. package/fesm2022/ngx-tethys-card.mjs +15 -15
  38. package/fesm2022/ngx-tethys-card.mjs.map +1 -1
  39. package/fesm2022/ngx-tethys-carousel.mjs +15 -15
  40. package/fesm2022/ngx-tethys-carousel.mjs.map +1 -1
  41. package/fesm2022/ngx-tethys-cascader.mjs +23 -24
  42. package/fesm2022/ngx-tethys-cascader.mjs.map +1 -1
  43. package/fesm2022/ngx-tethys-checkbox.mjs +9 -9
  44. package/fesm2022/ngx-tethys-checkbox.mjs.map +1 -1
  45. package/fesm2022/ngx-tethys-collapse.mjs +12 -12
  46. package/fesm2022/ngx-tethys-collapse.mjs.map +1 -1
  47. package/fesm2022/ngx-tethys-color-picker.mjs +38 -38
  48. package/fesm2022/ngx-tethys-color-picker.mjs.map +1 -1
  49. package/fesm2022/ngx-tethys-comment.mjs +15 -15
  50. package/fesm2022/ngx-tethys-comment.mjs.map +1 -1
  51. package/fesm2022/ngx-tethys-copy.mjs +8 -8
  52. package/fesm2022/ngx-tethys-copy.mjs.map +1 -1
  53. package/fesm2022/ngx-tethys-core.mjs +21 -21
  54. package/fesm2022/ngx-tethys-core.mjs.map +1 -1
  55. package/fesm2022/ngx-tethys-date-picker.mjs +141 -141
  56. package/fesm2022/ngx-tethys-date-picker.mjs.map +1 -1
  57. package/fesm2022/ngx-tethys-date-range.mjs +14 -14
  58. package/fesm2022/ngx-tethys-date-range.mjs.map +1 -1
  59. package/fesm2022/ngx-tethys-dialog.mjs +27 -28
  60. package/fesm2022/ngx-tethys-dialog.mjs.map +1 -1
  61. package/fesm2022/ngx-tethys-divider.mjs +8 -9
  62. package/fesm2022/ngx-tethys-divider.mjs.map +1 -1
  63. package/fesm2022/ngx-tethys-dot.mjs +8 -8
  64. package/fesm2022/ngx-tethys-dot.mjs.map +1 -1
  65. package/fesm2022/ngx-tethys-drag-drop.mjs +20 -20
  66. package/fesm2022/ngx-tethys-drag-drop.mjs.map +1 -1
  67. package/fesm2022/ngx-tethys-dropdown.mjs +47 -48
  68. package/fesm2022/ngx-tethys-dropdown.mjs.map +1 -1
  69. package/fesm2022/ngx-tethys-empty.mjs +12 -12
  70. package/fesm2022/ngx-tethys-empty.mjs.map +1 -1
  71. package/fesm2022/ngx-tethys-flexible-text.mjs +8 -8
  72. package/fesm2022/ngx-tethys-flexible-text.mjs.map +1 -1
  73. package/fesm2022/ngx-tethys-form.mjs +44 -44
  74. package/fesm2022/ngx-tethys-form.mjs.map +1 -1
  75. package/fesm2022/ngx-tethys-fullscreen.mjs +14 -14
  76. package/fesm2022/ngx-tethys-fullscreen.mjs.map +1 -1
  77. package/fesm2022/ngx-tethys-grid.mjs +35 -38
  78. package/fesm2022/ngx-tethys-grid.mjs.map +1 -1
  79. package/fesm2022/ngx-tethys-guider.mjs +18 -18
  80. package/fesm2022/ngx-tethys-guider.mjs.map +1 -1
  81. package/fesm2022/ngx-tethys-i18n.mjs +3 -3
  82. package/fesm2022/ngx-tethys-i18n.mjs.map +1 -1
  83. package/fesm2022/ngx-tethys-icon.mjs +11 -11
  84. package/fesm2022/ngx-tethys-icon.mjs.map +1 -1
  85. package/fesm2022/ngx-tethys-image.mjs +19 -19
  86. package/fesm2022/ngx-tethys-image.mjs.map +1 -1
  87. package/fesm2022/ngx-tethys-input-number.mjs +11 -11
  88. package/fesm2022/ngx-tethys-input-number.mjs.map +1 -1
  89. package/fesm2022/ngx-tethys-input.mjs +23 -23
  90. package/fesm2022/ngx-tethys-input.mjs.map +1 -1
  91. package/fesm2022/ngx-tethys-layout.mjs +63 -64
  92. package/fesm2022/ngx-tethys-layout.mjs.map +1 -1
  93. package/fesm2022/ngx-tethys-list.mjs +19 -19
  94. package/fesm2022/ngx-tethys-list.mjs.map +1 -1
  95. package/fesm2022/ngx-tethys-loading.mjs +9 -9
  96. package/fesm2022/ngx-tethys-loading.mjs.map +1 -1
  97. package/fesm2022/ngx-tethys-mention.mjs +12 -12
  98. package/fesm2022/ngx-tethys-mention.mjs.map +1 -1
  99. package/fesm2022/ngx-tethys-menu.mjs +29 -29
  100. package/fesm2022/ngx-tethys-menu.mjs.map +1 -1
  101. package/fesm2022/ngx-tethys-message.mjs +25 -26
  102. package/fesm2022/ngx-tethys-message.mjs.map +1 -1
  103. package/fesm2022/ngx-tethys-nav.mjs +24 -25
  104. package/fesm2022/ngx-tethys-nav.mjs.map +1 -1
  105. package/fesm2022/ngx-tethys-notify.mjs +20 -20
  106. package/fesm2022/ngx-tethys-notify.mjs.map +1 -1
  107. package/fesm2022/ngx-tethys-pagination.mjs +15 -15
  108. package/fesm2022/ngx-tethys-pagination.mjs.map +1 -1
  109. package/fesm2022/ngx-tethys-popover.mjs +23 -23
  110. package/fesm2022/ngx-tethys-popover.mjs.map +1 -1
  111. package/fesm2022/ngx-tethys-progress.mjs +17 -17
  112. package/fesm2022/ngx-tethys-progress.mjs.map +1 -1
  113. package/fesm2022/ngx-tethys-property-operation.mjs +12 -12
  114. package/fesm2022/ngx-tethys-property-operation.mjs.map +1 -1
  115. package/fesm2022/ngx-tethys-property.mjs +12 -12
  116. package/fesm2022/ngx-tethys-property.mjs.map +1 -1
  117. package/fesm2022/ngx-tethys-radio.mjs +15 -15
  118. package/fesm2022/ngx-tethys-radio.mjs.map +1 -1
  119. package/fesm2022/ngx-tethys-rate.mjs +12 -13
  120. package/fesm2022/ngx-tethys-rate.mjs.map +1 -1
  121. package/fesm2022/ngx-tethys-resizable.mjs +17 -19
  122. package/fesm2022/ngx-tethys-resizable.mjs.map +1 -1
  123. package/fesm2022/ngx-tethys-result.mjs +9 -9
  124. package/fesm2022/ngx-tethys-result.mjs.map +1 -1
  125. package/fesm2022/ngx-tethys-segment.mjs +13 -13
  126. package/fesm2022/ngx-tethys-segment.mjs.map +1 -1
  127. package/fesm2022/ngx-tethys-select.mjs +16 -16
  128. package/fesm2022/ngx-tethys-select.mjs.map +1 -1
  129. package/fesm2022/ngx-tethys-shared.mjs +70 -70
  130. package/fesm2022/ngx-tethys-shared.mjs.map +1 -1
  131. package/fesm2022/ngx-tethys-skeleton.mjs +23 -28
  132. package/fesm2022/ngx-tethys-skeleton.mjs.map +1 -1
  133. package/fesm2022/ngx-tethys-slide.mjs +34 -35
  134. package/fesm2022/ngx-tethys-slide.mjs.map +1 -1
  135. package/fesm2022/ngx-tethys-slider.mjs +9 -9
  136. package/fesm2022/ngx-tethys-slider.mjs.map +1 -1
  137. package/fesm2022/ngx-tethys-space.mjs +12 -12
  138. package/fesm2022/ngx-tethys-space.mjs.map +1 -1
  139. package/fesm2022/ngx-tethys-statistic.mjs +9 -9
  140. package/fesm2022/ngx-tethys-statistic.mjs.map +1 -1
  141. package/fesm2022/ngx-tethys-stepper.mjs +22 -22
  142. package/fesm2022/ngx-tethys-stepper.mjs.map +1 -1
  143. package/fesm2022/ngx-tethys-strength.mjs +8 -8
  144. package/fesm2022/ngx-tethys-strength.mjs.map +1 -1
  145. package/fesm2022/ngx-tethys-switch.mjs +9 -9
  146. package/fesm2022/ngx-tethys-switch.mjs.map +1 -1
  147. package/fesm2022/ngx-tethys-table.mjs +23 -23
  148. package/fesm2022/ngx-tethys-table.mjs.map +1 -1
  149. package/fesm2022/ngx-tethys-tabs.mjs +15 -16
  150. package/fesm2022/ngx-tethys-tabs.mjs.map +1 -1
  151. package/fesm2022/ngx-tethys-tag.mjs +11 -11
  152. package/fesm2022/ngx-tethys-tag.mjs.map +1 -1
  153. package/fesm2022/ngx-tethys-testing.mjs.map +1 -1
  154. package/fesm2022/ngx-tethys-time-picker.mjs +24 -24
  155. package/fesm2022/ngx-tethys-time-picker.mjs.map +1 -1
  156. package/fesm2022/ngx-tethys-timeline.mjs +15 -16
  157. package/fesm2022/ngx-tethys-timeline.mjs.map +1 -1
  158. package/fesm2022/ngx-tethys-tooltip.mjs +16 -16
  159. package/fesm2022/ngx-tethys-tooltip.mjs.map +1 -1
  160. package/fesm2022/ngx-tethys-transfer.mjs +13 -13
  161. package/fesm2022/ngx-tethys-transfer.mjs.map +1 -1
  162. package/fesm2022/ngx-tethys-tree-select.mjs +13 -13
  163. package/fesm2022/ngx-tethys-tree-select.mjs.map +1 -1
  164. package/fesm2022/ngx-tethys-tree.mjs +19 -19
  165. package/fesm2022/ngx-tethys-tree.mjs.map +1 -1
  166. package/fesm2022/ngx-tethys-typography.mjs +15 -15
  167. package/fesm2022/ngx-tethys-typography.mjs.map +1 -1
  168. package/fesm2022/ngx-tethys-upload.mjs +17 -17
  169. package/fesm2022/ngx-tethys-upload.mjs.map +1 -1
  170. package/fesm2022/ngx-tethys-util.mjs +2 -18
  171. package/fesm2022/ngx-tethys-util.mjs.map +1 -1
  172. package/fesm2022/ngx-tethys-vote.mjs +9 -9
  173. package/fesm2022/ngx-tethys-vote.mjs.map +1 -1
  174. package/fesm2022/ngx-tethys-watermark.mjs +8 -8
  175. package/fesm2022/ngx-tethys-watermark.mjs.map +1 -1
  176. package/fesm2022/ngx-tethys.mjs +1 -1
  177. package/fesm2022/ngx-tethys.mjs.map +1 -1
  178. package/input/input.component.d.ts +1 -1
  179. package/layout/header.component.d.ts +21 -3
  180. package/menu/group/menu-group.component.d.ts +6 -30
  181. package/message/abstract/abstract-message-container.component.d.ts +1 -1
  182. package/message/abstract/abstract-message.component.d.ts +1 -1
  183. package/nav/nav.component.d.ts +2 -2
  184. package/package.json +1 -169
  185. package/pagination/pagination.component.d.ts +45 -5
  186. package/property/property-item.component.d.ts +4 -2
  187. package/schematics/dependencies.js +3 -3
  188. package/schematics/ng-add/index.js +7 -3
  189. package/schematics/ng-update/core/complete.js +1 -2
  190. package/schematics/ng-update/migration-collection.json +4 -4
  191. package/schematics/ng-update/{update-18 → update-19}/index.js +4 -5
  192. package/schematics/ng-update/{update-18 → update-19}/index.spec.js +4 -4
  193. package/schematics/testing/get-json-content.js +1 -2
  194. package/schematics/testing/test-app.js +1 -2
  195. package/schematics/testing/test-project.js +1 -2
  196. package/schematics/testing/test-workspace.d.ts +0 -2
  197. package/schematics/testing/test-workspace.js +2 -2
  198. package/schematics/utils/create-tree-compiler-host.js +1 -2
  199. package/schematics/utils/create-tree-ts-parse-config-host.js +2 -2
  200. package/schematics/utils/get-angular-json.js +1 -2
  201. package/schematics/utils/get-project.js +1 -2
  202. package/schematics/utils/get-workspace-tsconfig.js +1 -2
  203. package/schematics/utils/package-config.js +2 -3
  204. package/schematics/utils/update-file.service.js +2 -2
  205. package/schematics/version.d.ts +1 -1
  206. package/schematics/version.js +1 -1
  207. package/shared/base-form-check.component.d.ts +1 -1
  208. package/shared/option/list-option/list-option.component.d.ts +1 -4
  209. package/shared/select/styles/select.mixin.scss +2 -1
  210. package/skeleton/skeleton-rectangle.component.d.ts +1 -4
  211. package/skeleton/stylized/bullet-list.component.d.ts +1 -9
  212. package/styles/bootstrap/utilities/_background.scss +2 -1
  213. package/styles/bootstrap/utilities/_text.scss +1 -1
  214. package/table/table.component.d.ts +1 -1
  215. package/upload/file-select-base.d.ts +1 -1
  216. package/esm2022/action/action.component.mjs +0 -174
  217. package/esm2022/action/action.module.mjs +0 -19
  218. package/esm2022/action/actions.component.mjs +0 -57
  219. package/esm2022/action/index.mjs +0 -4
  220. package/esm2022/action/ngx-tethys-action.mjs +0 -5
  221. package/esm2022/affix/affix.component.mjs +0 -243
  222. package/esm2022/affix/affix.module.mjs +0 -18
  223. package/esm2022/affix/index.mjs +0 -3
  224. package/esm2022/affix/ngx-tethys-affix.mjs +0 -5
  225. package/esm2022/affix/respond-events.mjs +0 -11
  226. package/esm2022/alert/alert.component.mjs +0 -98
  227. package/esm2022/alert/alert.directive.mjs +0 -25
  228. package/esm2022/alert/alert.module.mjs +0 -19
  229. package/esm2022/alert/index.mjs +0 -4
  230. package/esm2022/alert/ngx-tethys-alert.mjs +0 -5
  231. package/esm2022/anchor/anchor-link.component.mjs +0 -106
  232. package/esm2022/anchor/anchor.component.mjs +0 -266
  233. package/esm2022/anchor/anchor.module.mjs +0 -20
  234. package/esm2022/anchor/index.mjs +0 -4
  235. package/esm2022/anchor/ngx-tethys-anchor.mjs +0 -5
  236. package/esm2022/arrow-switcher/arrow-switcher.component.mjs +0 -130
  237. package/esm2022/arrow-switcher/index.mjs +0 -3
  238. package/esm2022/arrow-switcher/module.mjs +0 -21
  239. package/esm2022/arrow-switcher/ngx-tethys-arrow-switcher.mjs +0 -5
  240. package/esm2022/autocomplete/autocomplete.component.mjs +0 -182
  241. package/esm2022/autocomplete/autocomplete.trigger.directive.mjs +0 -275
  242. package/esm2022/autocomplete/index.mjs +0 -8
  243. package/esm2022/autocomplete/module.mjs +0 -67
  244. package/esm2022/autocomplete/ngx-tethys-autocomplete.mjs +0 -5
  245. package/esm2022/autocomplete/overlay/autocomplete-animations.mjs +0 -10
  246. package/esm2022/autocomplete/overlay/autocomplete-container.component.mjs +0 -64
  247. package/esm2022/autocomplete/overlay/autocomplete-ref.mjs +0 -18
  248. package/esm2022/autocomplete/overlay/autocomplete.config.mjs +0 -18
  249. package/esm2022/autocomplete/overlay/autocomplete.options.mjs +0 -6
  250. package/esm2022/autocomplete/overlay/autocomplete.service.mjs +0 -127
  251. package/esm2022/avatar/avatar-list/avatar-list.component.mjs +0 -76
  252. package/esm2022/avatar/avatar.component.mjs +0 -179
  253. package/esm2022/avatar/avatar.module.mjs +0 -33
  254. package/esm2022/avatar/avatar.pipe.mjs +0 -91
  255. package/esm2022/avatar/avatar.service.mjs +0 -27
  256. package/esm2022/avatar/index.mjs +0 -6
  257. package/esm2022/avatar/ngx-tethys-avatar.mjs +0 -5
  258. package/esm2022/back-top/back-top.component.mjs +0 -126
  259. package/esm2022/back-top/back-top.module.mjs +0 -18
  260. package/esm2022/back-top/index.mjs +0 -3
  261. package/esm2022/back-top/ngx-tethys-back-top.mjs +0 -5
  262. package/esm2022/badge/badge.component.mjs +0 -238
  263. package/esm2022/badge/badge.module.mjs +0 -18
  264. package/esm2022/badge/index.mjs +0 -3
  265. package/esm2022/badge/ngx-tethys-badge.mjs +0 -5
  266. package/esm2022/breadcrumb/breadcrumb-item.component.mjs +0 -49
  267. package/esm2022/breadcrumb/breadcrumb.component.mjs +0 -115
  268. package/esm2022/breadcrumb/index.mjs +0 -4
  269. package/esm2022/breadcrumb/module.mjs +0 -21
  270. package/esm2022/breadcrumb/ngx-tethys-breadcrumb.mjs +0 -5
  271. package/esm2022/button/button-group.component.mjs +0 -90
  272. package/esm2022/button/button-icon.component.mjs +0 -166
  273. package/esm2022/button/button.component.mjs +0 -216
  274. package/esm2022/button/button.module.mjs +0 -20
  275. package/esm2022/button/index.mjs +0 -5
  276. package/esm2022/button/ngx-tethys-button.mjs +0 -5
  277. package/esm2022/calendar/calendar-cells.mjs +0 -35
  278. package/esm2022/calendar/calendar-header.component.mjs +0 -117
  279. package/esm2022/calendar/calendar.component.mjs +0 -122
  280. package/esm2022/calendar/index.mjs +0 -5
  281. package/esm2022/calendar/module.mjs +0 -63
  282. package/esm2022/calendar/ngx-tethys-calendar.mjs +0 -5
  283. package/esm2022/card/card.component.mjs +0 -48
  284. package/esm2022/card/card.module.mjs +0 -19
  285. package/esm2022/card/content.component.mjs +0 -58
  286. package/esm2022/card/header.component.mjs +0 -42
  287. package/esm2022/card/index.mjs +0 -5
  288. package/esm2022/card/ngx-tethys-card.mjs +0 -5
  289. package/esm2022/carousel/carousel-item.directive.mjs +0 -37
  290. package/esm2022/carousel/carousel.component.mjs +0 -290
  291. package/esm2022/carousel/carousel.service.mjs +0 -74
  292. package/esm2022/carousel/engine/carousel-base.mjs +0 -43
  293. package/esm2022/carousel/engine/carousel-fade.mjs +0 -46
  294. package/esm2022/carousel/engine/carousel-noop.mjs +0 -28
  295. package/esm2022/carousel/engine/carousel-slide.mjs +0 -62
  296. package/esm2022/carousel/engine/index.mjs +0 -5
  297. package/esm2022/carousel/index.mjs +0 -5
  298. package/esm2022/carousel/module.mjs +0 -21
  299. package/esm2022/carousel/ngx-tethys-carousel.mjs +0 -5
  300. package/esm2022/carousel/typings.mjs +0 -2
  301. package/esm2022/cascader/cascader-li.component.mjs +0 -81
  302. package/esm2022/cascader/cascader-search-option.component.mjs +0 -73
  303. package/esm2022/cascader/cascader.component.mjs +0 -768
  304. package/esm2022/cascader/cascader.service.mjs +0 -558
  305. package/esm2022/cascader/index.mjs +0 -5
  306. package/esm2022/cascader/module.mjs +0 -62
  307. package/esm2022/cascader/ngx-tethys-cascader.mjs +0 -5
  308. package/esm2022/cascader/types.mjs +0 -2
  309. package/esm2022/checkbox/checkbox.component.mjs +0 -51
  310. package/esm2022/checkbox/index.mjs +0 -4
  311. package/esm2022/checkbox/module.mjs +0 -18
  312. package/esm2022/checkbox/ngx-tethys-checkbox.mjs +0 -5
  313. package/esm2022/collapse/collapse-item.component.mjs +0 -88
  314. package/esm2022/collapse/collapse.component.mjs +0 -79
  315. package/esm2022/collapse/index.mjs +0 -4
  316. package/esm2022/collapse/module.mjs +0 -22
  317. package/esm2022/collapse/ngx-tethys-collapse.mjs +0 -5
  318. package/esm2022/color-picker/color-picker-custom-panel.component.mjs +0 -38
  319. package/esm2022/color-picker/color-picker-panel.component.mjs +0 -100
  320. package/esm2022/color-picker/color-picker.component.mjs +0 -289
  321. package/esm2022/color-picker/constant.mjs +0 -73
  322. package/esm2022/color-picker/coordinates.directive.mjs +0 -73
  323. package/esm2022/color-picker/helpers/color.class.mjs +0 -281
  324. package/esm2022/color-picker/helpers/colors-table.class.mjs +0 -155
  325. package/esm2022/color-picker/helpers/rgba.class.mjs +0 -34
  326. package/esm2022/color-picker/index.mjs +0 -14
  327. package/esm2022/color-picker/module.mjs +0 -72
  328. package/esm2022/color-picker/ngx-tethys-color-picker.mjs +0 -5
  329. package/esm2022/color-picker/parts/alpha/alpha.component.mjs +0 -64
  330. package/esm2022/color-picker/parts/hue/hue.component.mjs +0 -54
  331. package/esm2022/color-picker/parts/indicator/indicator.component.mjs +0 -26
  332. package/esm2022/color-picker/parts/inputs/inputs.component.mjs +0 -61
  333. package/esm2022/color-picker/parts/saturation/saturation.component.mjs +0 -68
  334. package/esm2022/comment/comment-actions.directive.mjs +0 -19
  335. package/esm2022/comment/comment-content.directive.mjs +0 -19
  336. package/esm2022/comment/comment.component.mjs +0 -30
  337. package/esm2022/comment/comment.module.mjs +0 -41
  338. package/esm2022/comment/index.mjs +0 -5
  339. package/esm2022/comment/ngx-tethys-comment.mjs +0 -5
  340. package/esm2022/copy/copy.directive.mjs +0 -101
  341. package/esm2022/copy/index.mjs +0 -3
  342. package/esm2022/copy/module.mjs +0 -18
  343. package/esm2022/copy/ngx-tethys-copy.mjs +0 -5
  344. package/esm2022/core/animation/animation-consts.mjs +0 -23
  345. package/esm2022/core/animation/collapse.mjs +0 -12
  346. package/esm2022/core/animation/fade.mjs +0 -7
  347. package/esm2022/core/animation/index.mjs +0 -2
  348. package/esm2022/core/animation/public-api.mjs +0 -6
  349. package/esm2022/core/animation/thumb.mjs +0 -12
  350. package/esm2022/core/animation/zoom.mjs +0 -66
  351. package/esm2022/core/behaviors/constructor.mjs +0 -5
  352. package/esm2022/core/behaviors/control-value-accessor.mjs +0 -17
  353. package/esm2022/core/behaviors/decorators.mjs +0 -47
  354. package/esm2022/core/behaviors/disabled.mjs +0 -17
  355. package/esm2022/core/behaviors/focus-control.mjs +0 -31
  356. package/esm2022/core/behaviors/index.mjs +0 -11
  357. package/esm2022/core/behaviors/initialized.mjs +0 -12
  358. package/esm2022/core/behaviors/loading-done.mjs +0 -12
  359. package/esm2022/core/behaviors/mixin.mjs +0 -5
  360. package/esm2022/core/behaviors/tabindex.mjs +0 -21
  361. package/esm2022/core/behaviors/unsubscribe.mjs +0 -23
  362. package/esm2022/core/click-positioner.mjs +0 -36
  363. package/esm2022/core/color/color.mjs +0 -13
  364. package/esm2022/core/color/index.mjs +0 -2
  365. package/esm2022/core/debounce-time.mjs +0 -11
  366. package/esm2022/core/event-dispatchers/index.mjs +0 -2
  367. package/esm2022/core/index.mjs +0 -16
  368. package/esm2022/core/ngx-tethys-core.mjs +0 -5
  369. package/esm2022/core/overlay/abstract-overlay-container.mjs +0 -53
  370. package/esm2022/core/overlay/abstract-overlay-ref.mjs +0 -160
  371. package/esm2022/core/overlay/abstract-overlay.config.mjs +0 -70
  372. package/esm2022/core/overlay/abstract-overlay.service.mjs +0 -158
  373. package/esm2022/core/overlay/index.mjs +0 -10
  374. package/esm2022/core/overlay/interface.mjs +0 -2
  375. package/esm2022/core/overlay/overlay-position-map.mjs +0 -88
  376. package/esm2022/core/overlay/overlay.directive.mjs +0 -175
  377. package/esm2022/core/overlay/portal-directives.mjs +0 -47
  378. package/esm2022/core/overlay/utils.mjs +0 -69
  379. package/esm2022/core/request-animation.mjs +0 -41
  380. package/esm2022/core/scroll-to.service.mjs +0 -33
  381. package/esm2022/core/scroll.mjs +0 -83
  382. package/esm2022/core/spacing/index.mjs +0 -2
  383. package/esm2022/core/spacing/spacing.mjs +0 -17
  384. package/esm2022/core/store/action-state.mjs +0 -11
  385. package/esm2022/core/store/action.mjs +0 -48
  386. package/esm2022/core/store/actions-stream.mjs +0 -2
  387. package/esm2022/core/store/index.mjs +0 -4
  388. package/esm2022/core/store/store.mjs +0 -125
  389. package/esm2022/core/store/types.mjs +0 -6
  390. package/esm2022/core/store/utils.mjs +0 -14
  391. package/esm2022/core/theme/index.mjs +0 -3
  392. package/esm2022/core/theme/store.mjs +0 -42
  393. package/esm2022/core/theme/theme.mjs +0 -9
  394. package/esm2022/core/translate.mjs +0 -22
  395. package/esm2022/core/update-host-class.service.mjs +0 -60
  396. package/esm2022/date-picker/abstract-picker.component.mjs +0 -318
  397. package/esm2022/date-picker/abstract-picker.directive.mjs +0 -218
  398. package/esm2022/date-picker/base-picker.component.mjs +0 -249
  399. package/esm2022/date-picker/date-helper.service.mjs +0 -37
  400. package/esm2022/date-picker/date-picker.component.mjs +0 -41
  401. package/esm2022/date-picker/date-picker.config.mjs +0 -103
  402. package/esm2022/date-picker/date-picker.directive.mjs +0 -39
  403. package/esm2022/date-picker/date-picker.module.mjs +0 -117
  404. package/esm2022/date-picker/date-picker.service.mjs +0 -31
  405. package/esm2022/date-picker/index.mjs +0 -37
  406. package/esm2022/date-picker/inner-types.mjs +0 -2
  407. package/esm2022/date-picker/lib/calendar/calendar-footer.component.mjs +0 -98
  408. package/esm2022/date-picker/lib/calendar/calendar-header.component.mjs +0 -92
  409. package/esm2022/date-picker/lib/calendar/calendar-table.component.mjs +0 -105
  410. package/esm2022/date-picker/lib/date/date-header.component.mjs +0 -35
  411. package/esm2022/date-picker/lib/date/date-table-cell.component.mjs +0 -24
  412. package/esm2022/date-picker/lib/date/date-table.component.mjs +0 -149
  413. package/esm2022/date-picker/lib/date/types.mjs +0 -2
  414. package/esm2022/date-picker/lib/date-carousel/date-carousel.component.mjs +0 -388
  415. package/esm2022/date-picker/lib/decade/decade-header.component.mjs +0 -42
  416. package/esm2022/date-picker/lib/decade/decade-table.component.mjs +0 -81
  417. package/esm2022/date-picker/lib/lib-packer.module.mjs +0 -123
  418. package/esm2022/date-picker/lib/month/month-header.component.mjs +0 -27
  419. package/esm2022/date-picker/lib/month/month-table.component.mjs +0 -97
  420. package/esm2022/date-picker/lib/popups/date-popup.component.mjs +0 -566
  421. package/esm2022/date-picker/lib/popups/inner-popup.component.mjs +0 -196
  422. package/esm2022/date-picker/lib/quarter/quarter-table.component.mjs +0 -98
  423. package/esm2022/date-picker/lib/year/year-header.component.mjs +0 -39
  424. package/esm2022/date-picker/lib/year/year-table.component.mjs +0 -100
  425. package/esm2022/date-picker/month-picker.component.mjs +0 -45
  426. package/esm2022/date-picker/ngx-tethys-date-picker.mjs +0 -5
  427. package/esm2022/date-picker/picker.component.mjs +0 -273
  428. package/esm2022/date-picker/picker.pipes.mjs +0 -112
  429. package/esm2022/date-picker/picker.util.mjs +0 -220
  430. package/esm2022/date-picker/picker.validators.mjs +0 -79
  431. package/esm2022/date-picker/quarter-picker.component.mjs +0 -48
  432. package/esm2022/date-picker/range-picker.component.mjs +0 -39
  433. package/esm2022/date-picker/range-picker.directive.mjs +0 -39
  434. package/esm2022/date-picker/standard-types.mjs +0 -2
  435. package/esm2022/date-picker/week-picker.component.mjs +0 -40
  436. package/esm2022/date-picker/year-picker.component.mjs +0 -48
  437. package/esm2022/date-range/date-range.class.mjs +0 -6
  438. package/esm2022/date-range/date-range.component.mjs +0 -255
  439. package/esm2022/date-range/index.mjs +0 -5
  440. package/esm2022/date-range/module.mjs +0 -50
  441. package/esm2022/date-range/ngx-tethys-date-range.mjs +0 -5
  442. package/esm2022/date-range/optional-dates/optional-dates.component.mjs +0 -50
  443. package/esm2022/dialog/body/dialog-body.component.mjs +0 -49
  444. package/esm2022/dialog/confirm/confirm.component.mjs +0 -77
  445. package/esm2022/dialog/confirm/token.mjs +0 -3
  446. package/esm2022/dialog/confirm.config.mjs +0 -29
  447. package/esm2022/dialog/dialog-animations.mjs +0 -19
  448. package/esm2022/dialog/dialog-container.component.mjs +0 -169
  449. package/esm2022/dialog/dialog-ref.mjs +0 -35
  450. package/esm2022/dialog/dialog.config.mjs +0 -62
  451. package/esm2022/dialog/dialog.module.mjs +0 -91
  452. package/esm2022/dialog/dialog.options.mjs +0 -6
  453. package/esm2022/dialog/dialog.service.mjs +0 -145
  454. package/esm2022/dialog/footer/dialog-footer.component.mjs +0 -51
  455. package/esm2022/dialog/header/dialog-header.component.mjs +0 -87
  456. package/esm2022/dialog/index.mjs +0 -12
  457. package/esm2022/dialog/ngx-tethys-dialog.mjs +0 -5
  458. package/esm2022/divider/divider.component.mjs +0 -117
  459. package/esm2022/divider/divider.module.mjs +0 -20
  460. package/esm2022/divider/index.mjs +0 -3
  461. package/esm2022/divider/ngx-tethys-divider.mjs +0 -5
  462. package/esm2022/dot/dot.component.mjs +0 -111
  463. package/esm2022/dot/dot.module.mjs +0 -17
  464. package/esm2022/dot/index.mjs +0 -3
  465. package/esm2022/dot/ngx-tethys-dot.mjs +0 -5
  466. package/esm2022/drag-drop/drag-content.directive.mjs +0 -32
  467. package/esm2022/drag-drop/drag-drop.class.mjs +0 -7
  468. package/esm2022/drag-drop/drag-drop.service.mjs +0 -23
  469. package/esm2022/drag-drop/drag-handle.directive.mjs +0 -43
  470. package/esm2022/drag-drop/drag-ref.mjs +0 -225
  471. package/esm2022/drag-drop/drag.directive.mjs +0 -71
  472. package/esm2022/drag-drop/drop-container.class.mjs +0 -6
  473. package/esm2022/drag-drop/drop-container.directive.mjs +0 -129
  474. package/esm2022/drag-drop/index.mjs +0 -10
  475. package/esm2022/drag-drop/module.mjs +0 -27
  476. package/esm2022/drag-drop/ngx-tethys-drag-drop.mjs +0 -5
  477. package/esm2022/dropdown/dropdown-active.directive.mjs +0 -66
  478. package/esm2022/dropdown/dropdown-menu-item.directive.mjs +0 -210
  479. package/esm2022/dropdown/dropdown-menu.component.mjs +0 -156
  480. package/esm2022/dropdown/dropdown-submenu.component.mjs +0 -83
  481. package/esm2022/dropdown/dropdown.directive.mjs +0 -189
  482. package/esm2022/dropdown/index.mjs +0 -7
  483. package/esm2022/dropdown/module.mjs +0 -79
  484. package/esm2022/dropdown/ngx-tethys-dropdown.mjs +0 -5
  485. package/esm2022/empty/empty.component.mjs +0 -183
  486. package/esm2022/empty/empty.config.mjs +0 -17
  487. package/esm2022/empty/empty.module.mjs +0 -21
  488. package/esm2022/empty/index.mjs +0 -4
  489. package/esm2022/empty/ngx-tethys-empty.mjs +0 -5
  490. package/esm2022/empty/svgs.mjs +0 -207
  491. package/esm2022/flexible-text/flexible-text.component.mjs +0 -157
  492. package/esm2022/flexible-text/flexible-text.module.mjs +0 -19
  493. package/esm2022/flexible-text/index.mjs +0 -3
  494. package/esm2022/flexible-text/ngx-tethys-flexible-text.mjs +0 -5
  495. package/esm2022/form/form-group-error/form-group-error.component.mjs +0 -53
  496. package/esm2022/form/form-group-label.directive.mjs +0 -49
  497. package/esm2022/form/form-group.component.mjs +0 -145
  498. package/esm2022/form/form-submit.directive.mjs +0 -40
  499. package/esm2022/form/form-validator-loader.mjs +0 -134
  500. package/esm2022/form/form-validator.service.mjs +0 -252
  501. package/esm2022/form/form.class.mjs +0 -8
  502. package/esm2022/form/form.directive.mjs +0 -158
  503. package/esm2022/form/from-group-footer/form-group-footer.component.mjs +0 -53
  504. package/esm2022/form/index.mjs +0 -12
  505. package/esm2022/form/module.mjs +0 -104
  506. package/esm2022/form/ngx-tethys-form.mjs +0 -5
  507. package/esm2022/form/validator/confirm-validator.directive.mjs +0 -33
  508. package/esm2022/form/validator/index.mjs +0 -5
  509. package/esm2022/form/validator/max-validator.directive.mjs +0 -41
  510. package/esm2022/form/validator/min-validator.directive.mjs +0 -41
  511. package/esm2022/form/validator/unique-validator.directive.mjs +0 -52
  512. package/esm2022/fullscreen/fullscreen-launch.directive.mjs +0 -18
  513. package/esm2022/fullscreen/fullscreen-ref.mjs +0 -151
  514. package/esm2022/fullscreen/fullscreen.component.mjs +0 -78
  515. package/esm2022/fullscreen/fullscreen.config.mjs +0 -6
  516. package/esm2022/fullscreen/fullscreen.module.mjs +0 -17
  517. package/esm2022/fullscreen/fullscreen.service.mjs +0 -47
  518. package/esm2022/fullscreen/index.mjs +0 -7
  519. package/esm2022/fullscreen/ngx-tethys-fullscreen.mjs +0 -5
  520. package/esm2022/grid/flex.mjs +0 -179
  521. package/esm2022/grid/grid.token.mjs +0 -5
  522. package/esm2022/grid/index.mjs +0 -7
  523. package/esm2022/grid/module.mjs +0 -56
  524. package/esm2022/grid/ngx-tethys-grid.mjs +0 -5
  525. package/esm2022/grid/thy-col.directive.mjs +0 -66
  526. package/esm2022/grid/thy-grid-item.component.mjs +0 -60
  527. package/esm2022/grid/thy-grid.component.mjs +0 -256
  528. package/esm2022/grid/thy-row.directive.mjs +0 -59
  529. package/esm2022/guider/guider-hint/guider-hint.component.mjs +0 -52
  530. package/esm2022/guider/guider-manager.mjs +0 -39
  531. package/esm2022/guider/guider-ref.mjs +0 -133
  532. package/esm2022/guider/guider-step-ref.mjs +0 -242
  533. package/esm2022/guider/guider.class.mjs +0 -15
  534. package/esm2022/guider/guider.directive.mjs +0 -50
  535. package/esm2022/guider/guider.module.mjs +0 -24
  536. package/esm2022/guider/guider.service.mjs +0 -76
  537. package/esm2022/guider/index.mjs +0 -9
  538. package/esm2022/guider/ngx-tethys-guider.mjs +0 -5
  539. package/esm2022/guider/utils.mjs +0 -10
  540. package/esm2022/i18n/i18n.mjs +0 -9
  541. package/esm2022/i18n/i18n.service.mjs +0 -45
  542. package/esm2022/i18n/i18n.token.mjs +0 -10
  543. package/esm2022/i18n/index.mjs +0 -10
  544. package/esm2022/i18n/locale.mjs +0 -13
  545. package/esm2022/i18n/locales/de-de.mjs +0 -134
  546. package/esm2022/i18n/locales/en-us.mjs +0 -155
  547. package/esm2022/i18n/locales/ja-jp.mjs +0 -134
  548. package/esm2022/i18n/locales/zh-hans.mjs +0 -134
  549. package/esm2022/i18n/locales/zh-hant.mjs +0 -134
  550. package/esm2022/i18n/ngx-tethys-i18n.mjs +0 -5
  551. package/esm2022/icon/config.mjs +0 -8
  552. package/esm2022/icon/icon-registry.mjs +0 -340
  553. package/esm2022/icon/icon.component.mjs +0 -198
  554. package/esm2022/icon/icon.module.mjs +0 -20
  555. package/esm2022/icon/index.mjs +0 -5
  556. package/esm2022/icon/ngx-tethys-icon.mjs +0 -5
  557. package/esm2022/image/image-group.component.mjs +0 -32
  558. package/esm2022/image/image.class.mjs +0 -2
  559. package/esm2022/image/image.config.mjs +0 -21
  560. package/esm2022/image/image.directive.mjs +0 -130
  561. package/esm2022/image/image.service.mjs +0 -58
  562. package/esm2022/image/index.mjs +0 -9
  563. package/esm2022/image/module.mjs +0 -67
  564. package/esm2022/image/ngx-tethys-image.mjs +0 -5
  565. package/esm2022/image/preview/image-preview-ref.mjs +0 -32
  566. package/esm2022/image/preview/image-preview.component.mjs +0 -413
  567. package/esm2022/image/utils.mjs +0 -13
  568. package/esm2022/input/index.mjs +0 -7
  569. package/esm2022/input/input-count.component.mjs +0 -68
  570. package/esm2022/input/input-group.component.mjs +0 -161
  571. package/esm2022/input/input-search.component.mjs +0 -152
  572. package/esm2022/input/input.component.mjs +0 -142
  573. package/esm2022/input/input.directive.mjs +0 -63
  574. package/esm2022/input/module.mjs +0 -51
  575. package/esm2022/input/ngx-tethys-input.mjs +0 -5
  576. package/esm2022/input-number/index.mjs +0 -3
  577. package/esm2022/input-number/input-number.component.mjs +0 -362
  578. package/esm2022/input-number/module.mjs +0 -22
  579. package/esm2022/input-number/ngx-tethys-input-number.mjs +0 -5
  580. package/esm2022/layout/content-main.component.mjs +0 -42
  581. package/esm2022/layout/content-section.component.mjs +0 -42
  582. package/esm2022/layout/content.component.mjs +0 -42
  583. package/esm2022/layout/header.component.mjs +0 -125
  584. package/esm2022/layout/index.mjs +0 -11
  585. package/esm2022/layout/layout.component.mjs +0 -47
  586. package/esm2022/layout/layout.module.mjs +0 -121
  587. package/esm2022/layout/ngx-tethys-layout.mjs +0 -5
  588. package/esm2022/layout/sidebar-content.component.mjs +0 -41
  589. package/esm2022/layout/sidebar-footer.component.mjs +0 -41
  590. package/esm2022/layout/sidebar-header.component.mjs +0 -54
  591. package/esm2022/layout/sidebar.component.mjs +0 -405
  592. package/esm2022/list/index.mjs +0 -7
  593. package/esm2022/list/list-item-meta.component.mjs +0 -38
  594. package/esm2022/list/list-item.component.mjs +0 -25
  595. package/esm2022/list/list.component.mjs +0 -41
  596. package/esm2022/list/list.module.mjs +0 -22
  597. package/esm2022/list/ngx-tethys-list.mjs +0 -5
  598. package/esm2022/list/selection/selection-list.mjs +0 -393
  599. package/esm2022/list/selection/selection.interface.mjs +0 -2
  600. package/esm2022/loading/index.mjs +0 -3
  601. package/esm2022/loading/loading.component.mjs +0 -54
  602. package/esm2022/loading/loading.module.mjs +0 -17
  603. package/esm2022/loading/ngx-tethys-loading.mjs +0 -5
  604. package/esm2022/mention/adapter/adapter.mjs +0 -20
  605. package/esm2022/mention/adapter/editable.adapter.mjs +0 -48
  606. package/esm2022/mention/adapter/index.mjs +0 -16
  607. package/esm2022/mention/adapter/textarea.adapter.mjs +0 -58
  608. package/esm2022/mention/caret-positioner.mjs +0 -194
  609. package/esm2022/mention/index.mjs +0 -5
  610. package/esm2022/mention/interfaces.mjs +0 -2
  611. package/esm2022/mention/mention.directive.mjs +0 -160
  612. package/esm2022/mention/mention.module.mjs +0 -23
  613. package/esm2022/mention/ngx-tethys-mention.mjs +0 -5
  614. package/esm2022/mention/suggestions/suggestions.component.mjs +0 -80
  615. package/esm2022/menu/divider/menu-divider.component.mjs +0 -21
  616. package/esm2022/menu/group/menu-group.component.mjs +0 -187
  617. package/esm2022/menu/index.mjs +0 -9
  618. package/esm2022/menu/item/action/menu-item-action.component.mjs +0 -75
  619. package/esm2022/menu/item/icon/menu-item-icon.component.mjs +0 -33
  620. package/esm2022/menu/item/menu-item.component.mjs +0 -42
  621. package/esm2022/menu/item/name/menu-item-name.component.mjs +0 -32
  622. package/esm2022/menu/menu.component.mjs +0 -39
  623. package/esm2022/menu/menu.module.mjs +0 -49
  624. package/esm2022/menu/ngx-tethys-menu.mjs +0 -5
  625. package/esm2022/message/abstract/abstract-message-container.component.mjs +0 -26
  626. package/esm2022/message/abstract/abstract-message-queue.service.mjs +0 -34
  627. package/esm2022/message/abstract/abstract-message-ref.mjs +0 -22
  628. package/esm2022/message/abstract/abstract-message.component.mjs +0 -76
  629. package/esm2022/message/abstract/abstract-message.service.mjs +0 -29
  630. package/esm2022/message/abstract/index.mjs +0 -6
  631. package/esm2022/message/index.mjs +0 -9
  632. package/esm2022/message/message-container.component.mjs +0 -45
  633. package/esm2022/message/message-queue.service.mjs +0 -25
  634. package/esm2022/message/message-ref.mjs +0 -4
  635. package/esm2022/message/message.component.mjs +0 -61
  636. package/esm2022/message/message.config.mjs +0 -14
  637. package/esm2022/message/message.service.mjs +0 -92
  638. package/esm2022/message/module.mjs +0 -24
  639. package/esm2022/message/ngx-tethys-message.mjs +0 -5
  640. package/esm2022/nav/icon-nav/icon-nav-link.directive.mjs +0 -43
  641. package/esm2022/nav/icon-nav/icon-nav.component.mjs +0 -45
  642. package/esm2022/nav/index.mjs +0 -7
  643. package/esm2022/nav/nav-ink-bar.directive.mjs +0 -79
  644. package/esm2022/nav/nav-item.directive.mjs +0 -98
  645. package/esm2022/nav/nav.component.mjs +0 -410
  646. package/esm2022/nav/nav.module.mjs +0 -54
  647. package/esm2022/nav/nav.pipe.mjs +0 -24
  648. package/esm2022/nav/ngx-tethys-nav.mjs +0 -5
  649. package/esm2022/ngx-tethys.mjs +0 -5
  650. package/esm2022/notify/index.mjs +0 -8
  651. package/esm2022/notify/module.mjs +0 -24
  652. package/esm2022/notify/ngx-tethys-notify.mjs +0 -5
  653. package/esm2022/notify/notify-container.component.mjs +0 -31
  654. package/esm2022/notify/notify-queue.service.mjs +0 -30
  655. package/esm2022/notify/notify-ref.mjs +0 -4
  656. package/esm2022/notify/notify.component.mjs +0 -99
  657. package/esm2022/notify/notify.config.mjs +0 -14
  658. package/esm2022/notify/notify.service.mjs +0 -97
  659. package/esm2022/pagination/index.mjs +0 -6
  660. package/esm2022/pagination/ngx-tethys-pagination.mjs +0 -5
  661. package/esm2022/pagination/pagination.class.mjs +0 -2
  662. package/esm2022/pagination/pagination.component.mjs +0 -366
  663. package/esm2022/pagination/pagination.config.mjs +0 -30
  664. package/esm2022/pagination/pagination.module.mjs +0 -43
  665. package/esm2022/pagination/pagination.pipe.mjs +0 -53
  666. package/esm2022/popover/body/popover-body.component.mjs +0 -25
  667. package/esm2022/popover/header/popover-header.component.mjs +0 -54
  668. package/esm2022/popover/index.mjs +0 -10
  669. package/esm2022/popover/module.mjs +0 -47
  670. package/esm2022/popover/ngx-tethys-popover.mjs +0 -5
  671. package/esm2022/popover/popover-animations.mjs +0 -22
  672. package/esm2022/popover/popover-container.component.mjs +0 -125
  673. package/esm2022/popover/popover-ref.mjs +0 -25
  674. package/esm2022/popover/popover.config.mjs +0 -38
  675. package/esm2022/popover/popover.directive.mjs +0 -157
  676. package/esm2022/popover/popover.options.mjs +0 -6
  677. package/esm2022/popover/popover.service.mjs +0 -201
  678. package/esm2022/progress/index.mjs +0 -6
  679. package/esm2022/progress/interfaces.mjs +0 -2
  680. package/esm2022/progress/ngx-tethys-progress.mjs +0 -5
  681. package/esm2022/progress/progress-circle.component.mjs +0 -136
  682. package/esm2022/progress/progress-strip.component.mjs +0 -54
  683. package/esm2022/progress/progress.component.mjs +0 -142
  684. package/esm2022/progress/progress.module.mjs +0 -20
  685. package/esm2022/property/index.mjs +0 -4
  686. package/esm2022/property/module.mjs +0 -20
  687. package/esm2022/property/ngx-tethys-property.mjs +0 -5
  688. package/esm2022/property/properties.component.mjs +0 -59
  689. package/esm2022/property/property-item.component.mjs +0 -175
  690. package/esm2022/property-operation/group/property-operation-group.component.mjs +0 -20
  691. package/esm2022/property-operation/index.mjs +0 -4
  692. package/esm2022/property-operation/module.mjs +0 -21
  693. package/esm2022/property-operation/ngx-tethys-property-operation.mjs +0 -5
  694. package/esm2022/property-operation/property-operation.component.mjs +0 -183
  695. package/esm2022/public-api.mjs +0 -2
  696. package/esm2022/radio/button/radio-button.component.mjs +0 -56
  697. package/esm2022/radio/group/radio-group.component.mjs +0 -138
  698. package/esm2022/radio/index.mjs +0 -5
  699. package/esm2022/radio/module.mjs +0 -20
  700. package/esm2022/radio/ngx-tethys-radio.mjs +0 -5
  701. package/esm2022/radio/radio.component.mjs +0 -58
  702. package/esm2022/rate/index.mjs +0 -4
  703. package/esm2022/rate/module.mjs +0 -23
  704. package/esm2022/rate/ngx-tethys-rate.mjs +0 -5
  705. package/esm2022/rate/rate-item.component.mjs +0 -76
  706. package/esm2022/rate/rate.component.mjs +0 -244
  707. package/esm2022/resizable/index.mjs +0 -8
  708. package/esm2022/resizable/interface.mjs +0 -2
  709. package/esm2022/resizable/module.mjs +0 -19
  710. package/esm2022/resizable/ngx-tethys-resizable.mjs +0 -5
  711. package/esm2022/resizable/resizable.directive.mjs +0 -363
  712. package/esm2022/resizable/resizable.service.mjs +0 -69
  713. package/esm2022/resizable/resize-handle.component.mjs +0 -104
  714. package/esm2022/resizable/resize-handles.component.mjs +0 -64
  715. package/esm2022/resizable/utils.mjs +0 -14
  716. package/esm2022/result/index.mjs +0 -3
  717. package/esm2022/result/ngx-tethys-result.mjs +0 -5
  718. package/esm2022/result/result.component.mjs +0 -43
  719. package/esm2022/result/result.module.mjs +0 -17
  720. package/esm2022/segment/index.mjs +0 -5
  721. package/esm2022/segment/ngx-tethys-segment.mjs +0 -5
  722. package/esm2022/segment/segment-item.component.mjs +0 -87
  723. package/esm2022/segment/segment.component.mjs +0 -143
  724. package/esm2022/segment/segment.module.mjs +0 -20
  725. package/esm2022/segment/segment.token.mjs +0 -3
  726. package/esm2022/segment/types.mjs +0 -2
  727. package/esm2022/select/custom-select/custom-select.component.mjs +0 -904
  728. package/esm2022/select/index.mjs +0 -5
  729. package/esm2022/select/module.mjs +0 -62
  730. package/esm2022/select/native-select/native-select.component.mjs +0 -98
  731. package/esm2022/select/ngx-tethys-select.mjs +0 -5
  732. package/esm2022/select/select.config.mjs +0 -21
  733. package/esm2022/shared/base-form-check.component.mjs +0 -120
  734. package/esm2022/shared/directives/string-or-template-outlet.directive.mjs +0 -57
  735. package/esm2022/shared/directives/thy-autofocus.directive.mjs +0 -60
  736. package/esm2022/shared/directives/thy-contextmenu.directive.mjs +0 -39
  737. package/esm2022/shared/directives/thy-ctrl-enter.directive.mjs +0 -43
  738. package/esm2022/shared/directives/thy-drag-drop.directive.mjs +0 -51
  739. package/esm2022/shared/directives/thy-enter.directive.mjs +0 -43
  740. package/esm2022/shared/directives/thy-scroll.directive.mjs +0 -84
  741. package/esm2022/shared/directives/thy-show.mjs +0 -59
  742. package/esm2022/shared/directives/thy-stop-propagation.directive.mjs +0 -57
  743. package/esm2022/shared/directives/view-outlet.directive.mjs +0 -85
  744. package/esm2022/shared/index.mjs +0 -16
  745. package/esm2022/shared/ng-transclude.directive.mjs +0 -32
  746. package/esm2022/shared/ngx-tethys-shared.mjs +0 -5
  747. package/esm2022/shared/option/group/option-group.component.mjs +0 -92
  748. package/esm2022/shared/option/index.mjs +0 -9
  749. package/esm2022/shared/option/list-option/list-option.component.mjs +0 -96
  750. package/esm2022/shared/option/module.mjs +0 -29
  751. package/esm2022/shared/option/option-group.component.mjs +0 -25
  752. package/esm2022/shared/option/option.component.mjs +0 -181
  753. package/esm2022/shared/option/option.token.mjs +0 -14
  754. package/esm2022/shared/option/options-container.component.mjs +0 -29
  755. package/esm2022/shared/option/select-option-base.mjs +0 -3
  756. package/esm2022/shared/select/index.mjs +0 -3
  757. package/esm2022/shared/select/module.mjs +0 -27
  758. package/esm2022/shared/select/select-control/select-control.component.mjs +0 -280
  759. package/esm2022/shared/shared.module.mjs +0 -71
  760. package/esm2022/skeleton/index.mjs +0 -9
  761. package/esm2022/skeleton/module.mjs +0 -27
  762. package/esm2022/skeleton/ngx-tethys-skeleton.mjs +0 -5
  763. package/esm2022/skeleton/skeleton-circle.component.mjs +0 -92
  764. package/esm2022/skeleton/skeleton-rectangle.component.mjs +0 -100
  765. package/esm2022/skeleton/skeleton.component.mjs +0 -32
  766. package/esm2022/skeleton/skeleton.config.mjs +0 -8
  767. package/esm2022/skeleton/stylized/bullet-list.component.mjs +0 -124
  768. package/esm2022/skeleton/stylized/list.component.mjs +0 -95
  769. package/esm2022/skeleton/stylized/paragraph.component.mjs +0 -107
  770. package/esm2022/slide/drawer/drawer-container.directive.mjs +0 -21
  771. package/esm2022/slide/index.mjs +0 -13
  772. package/esm2022/slide/ngx-tethys-slide.mjs +0 -5
  773. package/esm2022/slide/slide-animations.mjs +0 -24
  774. package/esm2022/slide/slide-body/slide-body-section.component.mjs +0 -41
  775. package/esm2022/slide/slide-body/slide-body.component.mjs +0 -25
  776. package/esm2022/slide/slide-container.component.mjs +0 -192
  777. package/esm2022/slide/slide-footer/slide-footer.component.mjs +0 -26
  778. package/esm2022/slide/slide-header/slide-header.component.mjs +0 -59
  779. package/esm2022/slide/slide-layout/slide-layout.component.mjs +0 -27
  780. package/esm2022/slide/slide-ref.service.mjs +0 -32
  781. package/esm2022/slide/slide.config.mjs +0 -38
  782. package/esm2022/slide/slide.module.mjs +0 -65
  783. package/esm2022/slide/slide.service.mjs +0 -104
  784. package/esm2022/slider/index.mjs +0 -3
  785. package/esm2022/slider/ngx-tethys-slider.mjs +0 -5
  786. package/esm2022/slider/slider.component.mjs +0 -346
  787. package/esm2022/slider/slider.module.mjs +0 -19
  788. package/esm2022/space/index.mjs +0 -3
  789. package/esm2022/space/ngx-tethys-space.mjs +0 -5
  790. package/esm2022/space/space.component.mjs +0 -88
  791. package/esm2022/space/space.module.mjs +0 -17
  792. package/esm2022/statistic/index.mjs +0 -3
  793. package/esm2022/statistic/ngx-tethys-statistic.mjs +0 -5
  794. package/esm2022/statistic/statistic.component.mjs +0 -184
  795. package/esm2022/statistic/statistic.module.mjs +0 -20
  796. package/esm2022/stepper/index.mjs +0 -6
  797. package/esm2022/stepper/ngx-tethys-stepper.mjs +0 -5
  798. package/esm2022/stepper/step-header.component.mjs +0 -40
  799. package/esm2022/stepper/step.component.mjs +0 -32
  800. package/esm2022/stepper/stepper-button.directive.mjs +0 -56
  801. package/esm2022/stepper/stepper.component.mjs +0 -105
  802. package/esm2022/stepper/stepper.module.mjs +0 -21
  803. package/esm2022/strength/index.mjs +0 -3
  804. package/esm2022/strength/ngx-tethys-strength.mjs +0 -5
  805. package/esm2022/strength/strength.component.mjs +0 -122
  806. package/esm2022/strength/strength.module.mjs +0 -17
  807. package/esm2022/switch/index.mjs +0 -3
  808. package/esm2022/switch/ngx-tethys-switch.mjs +0 -5
  809. package/esm2022/switch/switch.component.mjs +0 -181
  810. package/esm2022/switch/switch.module.mjs +0 -17
  811. package/esm2022/table/enums/column-skeleton-type.mjs +0 -8
  812. package/esm2022/table/enums/index.mjs +0 -2
  813. package/esm2022/table/index.mjs +0 -9
  814. package/esm2022/table/ngx-tethys-table.mjs +0 -5
  815. package/esm2022/table/pipes/drag.pipe.mjs +0 -20
  816. package/esm2022/table/pipes/table.pipe.mjs +0 -20
  817. package/esm2022/table/table-column.component.mjs +0 -200
  818. package/esm2022/table/table-skeleton.component.mjs +0 -165
  819. package/esm2022/table/table.component.mjs +0 -966
  820. package/esm2022/table/table.interface.mjs +0 -7
  821. package/esm2022/table/table.module.mjs +0 -75
  822. package/esm2022/tabs/index.mjs +0 -5
  823. package/esm2022/tabs/ngx-tethys-tabs.mjs +0 -5
  824. package/esm2022/tabs/tab-content.component.mjs +0 -52
  825. package/esm2022/tabs/tab.component.mjs +0 -36
  826. package/esm2022/tabs/tabs.component.mjs +0 -139
  827. package/esm2022/tabs/tabs.module.mjs +0 -21
  828. package/esm2022/tabs/types.mjs +0 -2
  829. package/esm2022/tag/index.mjs +0 -4
  830. package/esm2022/tag/ngx-tethys-tag.mjs +0 -5
  831. package/esm2022/tag/tag.component.mjs +0 -109
  832. package/esm2022/tag/tag.module.mjs +0 -19
  833. package/esm2022/tag/tags.component.mjs +0 -24
  834. package/esm2022/testing/data-transfer.mjs +0 -55
  835. package/esm2022/testing/dispatcher-events.mjs +0 -46
  836. package/esm2022/testing/element-focus.mjs +0 -18
  837. package/esm2022/testing/events.mjs +0 -145
  838. package/esm2022/testing/index.mjs +0 -8
  839. package/esm2022/testing/ngx-tethys-testing.mjs +0 -5
  840. package/esm2022/testing/thy-icon.mjs +0 -50
  841. package/esm2022/testing/type-in-element.mjs +0 -20
  842. package/esm2022/testing/xhr-mock.mjs +0 -100
  843. package/esm2022/time-picker/index.mjs +0 -8
  844. package/esm2022/time-picker/inner/inner-time-picker.class.mjs +0 -2
  845. package/esm2022/time-picker/inner/inner-time-picker.component.mjs +0 -239
  846. package/esm2022/time-picker/inner/inner-time-picker.config.mjs +0 -45
  847. package/esm2022/time-picker/inner/inner-time-picker.store.mjs +0 -134
  848. package/esm2022/time-picker/ngx-tethys-time-picker.mjs +0 -5
  849. package/esm2022/time-picker/time-picker-controls.util.mjs +0 -118
  850. package/esm2022/time-picker/time-picker-panel.component.mjs +0 -265
  851. package/esm2022/time-picker/time-picker.component.mjs +0 -363
  852. package/esm2022/time-picker/time-picker.module.mjs +0 -54
  853. package/esm2022/time-picker/time-picker.utils.mjs +0 -131
  854. package/esm2022/timeline/index.mjs +0 -5
  855. package/esm2022/timeline/ngx-tethys-timeline.mjs +0 -5
  856. package/esm2022/timeline/timeline-item.component.mjs +0 -59
  857. package/esm2022/timeline/timeline.component.mjs +0 -156
  858. package/esm2022/timeline/timeline.module.mjs +0 -21
  859. package/esm2022/timeline/timeline.service.mjs +0 -17
  860. package/esm2022/tooltip/index.mjs +0 -9
  861. package/esm2022/tooltip/interface.mjs +0 -2
  862. package/esm2022/tooltip/ngx-tethys-tooltip.mjs +0 -5
  863. package/esm2022/tooltip/tooltip-animations.mjs +0 -23
  864. package/esm2022/tooltip/tooltip-ref.mjs +0 -147
  865. package/esm2022/tooltip/tooltip.component.mjs +0 -103
  866. package/esm2022/tooltip/tooltip.config.mjs +0 -17
  867. package/esm2022/tooltip/tooltip.directive.mjs +0 -150
  868. package/esm2022/tooltip/tooltip.module.mjs +0 -22
  869. package/esm2022/tooltip/tooltip.service.mjs +0 -28
  870. package/esm2022/transfer/index.mjs +0 -5
  871. package/esm2022/transfer/ngx-tethys-transfer.mjs +0 -5
  872. package/esm2022/transfer/transfer-list.component.mjs +0 -154
  873. package/esm2022/transfer/transfer.component.mjs +0 -180
  874. package/esm2022/transfer/transfer.interface.mjs +0 -6
  875. package/esm2022/transfer/transfer.module.mjs +0 -50
  876. package/esm2022/tree/index.mjs +0 -7
  877. package/esm2022/tree/ngx-tethys-tree.mjs +0 -5
  878. package/esm2022/tree/tree-abstract.mjs +0 -3
  879. package/esm2022/tree/tree-node.class.mjs +0 -93
  880. package/esm2022/tree/tree-node.component.mjs +0 -212
  881. package/esm2022/tree/tree.class.mjs +0 -15
  882. package/esm2022/tree/tree.component.mjs +0 -648
  883. package/esm2022/tree/tree.module.mjs +0 -74
  884. package/esm2022/tree/tree.pipe.mjs +0 -26
  885. package/esm2022/tree/tree.service.mjs +0 -187
  886. package/esm2022/tree-select/index.mjs +0 -4
  887. package/esm2022/tree-select/module.mjs +0 -52
  888. package/esm2022/tree-select/ngx-tethys-tree-select.mjs +0 -5
  889. package/esm2022/tree-select/tree-select.class.mjs +0 -2
  890. package/esm2022/tree-select/tree-select.component.mjs +0 -653
  891. package/esm2022/types/common.mjs +0 -2
  892. package/esm2022/types/dictionary.mjs +0 -2
  893. package/esm2022/types/index.mjs +0 -4
  894. package/esm2022/types/ngx-tethys-types.mjs +0 -5
  895. package/esm2022/types/pagination.mjs +0 -2
  896. package/esm2022/typography/bg-color.directive.mjs +0 -51
  897. package/esm2022/typography/index.mjs +0 -5
  898. package/esm2022/typography/module.mjs +0 -21
  899. package/esm2022/typography/ngx-tethys-typography.mjs +0 -5
  900. package/esm2022/typography/text/text.component.mjs +0 -23
  901. package/esm2022/typography/text-color.directive.mjs +0 -52
  902. package/esm2022/upload/constant.mjs +0 -75
  903. package/esm2022/upload/file-drop.directive.mjs +0 -166
  904. package/esm2022/upload/file-select-base.mjs +0 -75
  905. package/esm2022/upload/file-select.component.mjs +0 -98
  906. package/esm2022/upload/index.mjs +0 -7
  907. package/esm2022/upload/module.mjs +0 -22
  908. package/esm2022/upload/ngx-tethys-upload.mjs +0 -5
  909. package/esm2022/upload/types.mjs +0 -2
  910. package/esm2022/upload/upload.config.mjs +0 -21
  911. package/esm2022/upload/upload.service.mjs +0 -169
  912. package/esm2022/upload/util.mjs +0 -27
  913. package/esm2022/util/date/functions.mjs +0 -84
  914. package/esm2022/util/date/tiny-date.mjs +0 -362
  915. package/esm2022/util/dom.mjs +0 -247
  916. package/esm2022/util/helpers/helpers.mjs +0 -293
  917. package/esm2022/util/helpers/index.mjs +0 -2
  918. package/esm2022/util/immutable.mjs +0 -108
  919. package/esm2022/util/index.mjs +0 -16
  920. package/esm2022/util/keycodes.mjs +0 -2
  921. package/esm2022/util/logger/index.mjs +0 -2
  922. package/esm2022/util/logger/logger.mjs +0 -42
  923. package/esm2022/util/ng.mjs +0 -7
  924. package/esm2022/util/ngx-tethys-util.mjs +0 -5
  925. package/esm2022/util/references.mjs +0 -84
  926. package/esm2022/version.mjs +0 -3
  927. package/esm2022/vote/index.mjs +0 -3
  928. package/esm2022/vote/ngx-tethys-vote.mjs +0 -5
  929. package/esm2022/vote/vote.component.mjs +0 -130
  930. package/esm2022/vote/vote.module.mjs +0 -20
  931. package/esm2022/watermark/config.mjs +0 -20
  932. package/esm2022/watermark/index.mjs +0 -3
  933. package/esm2022/watermark/ngx-tethys-watermark.mjs +0 -5
  934. package/esm2022/watermark/watermark.directive.mjs +0 -178
  935. package/esm2022/watermark/watermark.module.mjs +0 -19
  936. package/schematics/ng-update/update-18/complete.d.ts +0 -3
  937. package/schematics/ng-update/update-18/complete.js +0 -13
  938. /package/schematics/ng-update/{update-18 → update-19}/class-name-migration.d.ts +0 -0
  939. /package/schematics/ng-update/{update-18 → update-19}/class-name-migration.js +0 -0
  940. /package/schematics/ng-update/{update-18 → update-19}/index.d.ts +0 -0
  941. /package/schematics/ng-update/{update-18 → update-19}/index.spec.d.ts +0 -0
  942. /package/schematics/ng-update/{update-18 → update-19}/update-data.d.ts +0 -0
  943. /package/schematics/ng-update/{update-18 → update-19}/update-data.js +0 -0
@@ -1,768 +0,0 @@
1
- import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
2
- import { isPlatformBrowser, NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
3
- import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, HostListener, Input, NgZone, numberAttribute, Output, PLATFORM_ID, QueryList, TemplateRef, ViewChild, ViewChildren, inject } from '@angular/core';
4
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
5
- import { useHostRenderer } from '@tethys/cdk/dom';
6
- import { EXPANDED_DROPDOWN_POSITIONS, DebounceTimeWrapper, ScrollToService, TabIndexDisabledControlValueAccessorMixin, ThyClickDispatcher, injectPanelEmptyIcon } from 'ngx-tethys/core';
7
- import { ThyEmpty } from 'ngx-tethys/empty';
8
- import { ThyIcon } from 'ngx-tethys/icon';
9
- import { ThySelectControl } from 'ngx-tethys/shared';
10
- import { coerceBooleanProperty, elementMatchClosest, isEmpty } from 'ngx-tethys/util';
11
- import { BehaviorSubject, Observable, Subject, timer } from 'rxjs';
12
- import { distinctUntilChanged, filter, take, takeUntil } from 'rxjs/operators';
13
- import { scaleYMotion } from 'ngx-tethys/core';
14
- import { ThyDivider } from 'ngx-tethys/divider';
15
- import { ThyCascaderOptionComponent } from './cascader-li.component';
16
- import { ThyCascaderSearchOptionComponent } from './cascader-search-option.component';
17
- import { ThyCascaderService } from './cascader.service';
18
- import { injectLocale } from 'ngx-tethys/i18n';
19
- import * as i0 from "@angular/core";
20
- /**
21
- * 级联选择菜单
22
- * @name thy-cascader
23
- */
24
- export class ThyCascader extends TabIndexDisabledControlValueAccessorMixin {
25
- /**
26
- * 数据项
27
- * @type ThyCascaderOption[]
28
- * @default []
29
- */
30
- set thyOptions(options) {
31
- const columns = options && options.length ? [options] : [];
32
- this.thyCascaderService.initColumns(columns);
33
- if (this.thyCascaderService.defaultValue && columns.length) {
34
- this.thyCascaderService.initOptions(0);
35
- }
36
- }
37
- /**
38
- * 自定义选项
39
- * @type ThyCascaderOption[]
40
- * @default []
41
- */
42
- set thyCustomOptions(options) {
43
- this.thyCascaderService.customOptions = (options || []).map(item => ({ ...item }));
44
- }
45
- get thyCustomOptions() {
46
- return this.thyCascaderService.customOptions;
47
- }
48
- /**
49
- * 用户自定义模板
50
- * @type TemplateRef
51
- */
52
- set thyLabelRender(value) {
53
- this.labelRenderTpl = value;
54
- this.isLabelRenderTemplate = value instanceof TemplateRef;
55
- this.thyCascaderService.setCascaderOptions({ isLabelRenderTemplate: this.isLabelRenderTemplate });
56
- }
57
- get thyLabelRender() {
58
- return this.labelRenderTpl;
59
- }
60
- /**
61
- * 用于动态加载选项
62
- */
63
- set thyLoadData(value) {
64
- this.thyCascaderService.setCascaderOptions({ loadData: value });
65
- }
66
- get thyLoadData() {
67
- return this.thyCascaderService?.cascaderOptions?.loadData;
68
- }
69
- /**
70
- * 自定义浮层类名
71
- * @type string
72
- */
73
- set thyMenuClassName(value) {
74
- this.menuClassName = value;
75
- this.setMenuClass();
76
- }
77
- get thyMenuClassName() {
78
- return this.menuClassName;
79
- }
80
- /**
81
- * 自定义浮层列类名
82
- * @type string
83
- */
84
- set thyColumnClassName(value) {
85
- this.columnClassName = value;
86
- this.setMenuClass();
87
- }
88
- get thyColumnClassName() {
89
- return this.columnClassName;
90
- }
91
- /**
92
- * 是否只读
93
- * @default false
94
- */
95
- set thyDisabled(value) {
96
- this.disabled = value;
97
- }
98
- get thyDisabled() {
99
- return this.disabled;
100
- }
101
- /**
102
- * 空状态下的展示文字
103
- * @default 暂无可选项
104
- */
105
- set thyEmptyStateText(value) {
106
- this.emptyStateText = value;
107
- }
108
- /**
109
- * 是否多选
110
- * @type boolean
111
- * @default false
112
- */
113
- set thyMultiple(value) {
114
- this.isMultiple = value;
115
- this.thyCascaderService.setCascaderOptions({ isMultiple: value });
116
- }
117
- get thyMultiple() {
118
- return this.isMultiple;
119
- }
120
- get selected() {
121
- return this.thyMultiple ? this.thyCascaderService.selectionModel.selected : this.thyCascaderService.selectionModel.selected[0];
122
- }
123
- get searchResultList() {
124
- return this.thyCascaderService.searchResultList;
125
- }
126
- get isLoading() {
127
- return this.thyCascaderService?.isLoading;
128
- }
129
- get columns() {
130
- return this.thyCascaderService.columns;
131
- }
132
- ngOnInit() {
133
- this.setClassMap();
134
- this.setMenuClass();
135
- this.setMenuColumnClass();
136
- this.setLabelClass();
137
- this.initPosition();
138
- this.initSearch();
139
- const options = {
140
- labelProperty: this.thyLabelProperty,
141
- valueProperty: this.thyValueProperty,
142
- isMultiple: this.isMultiple,
143
- isOnlySelectLeaf: this.thyIsOnlySelectLeaf,
144
- isLabelRenderTemplate: this.isLabelRenderTemplate,
145
- loadData: this.thyLoadData
146
- };
147
- this.thyCascaderService.setCascaderOptions(options);
148
- this.thyCascaderService.cascaderValueChange().subscribe(options => {
149
- if (!options.isValueEqual) {
150
- this.onChangeFn(options.value);
151
- if (options.isSelectionModelEmpty) {
152
- this.thyClear.emit();
153
- }
154
- this.thySelectionChange.emit(this.thyCascaderService.selectedOptions);
155
- this.thyChange.emit(options.value);
156
- if (this.afterChangeFn) {
157
- this.afterChangeFn();
158
- this.afterChangeFn = null;
159
- }
160
- }
161
- });
162
- if (isPlatformBrowser(this.platformId)) {
163
- this.thyClickDispatcher
164
- .clicked(0)
165
- .pipe(takeUntil(this.destroy$))
166
- .subscribe(event => {
167
- if (!this.elementRef.nativeElement.contains(event.target) &&
168
- !this.menu?.nativeElement.contains(event.target) &&
169
- this.menuVisible) {
170
- this.ngZone.run(() => {
171
- this.closeMenu();
172
- this.cdr.markForCheck();
173
- });
174
- }
175
- });
176
- }
177
- }
178
- ngAfterContentInit() {
179
- if (this.thyAutoExpand) {
180
- timer(0).subscribe(() => {
181
- this.cdr.markForCheck();
182
- this.setMenuVisible(true);
183
- });
184
- }
185
- }
186
- ngOnChanges(changes) {
187
- if (changes['thyIsOnlySelectLeaf']) {
188
- this.thyCascaderService.setCascaderOptions({ isOnlySelectLeaf: changes['thyIsOnlySelectLeaf'].currentValue });
189
- }
190
- }
191
- initPosition() {
192
- const cascaderPosition = EXPANDED_DROPDOWN_POSITIONS.map(item => {
193
- return { ...item };
194
- });
195
- this.positions = cascaderPosition;
196
- }
197
- writeValue(value) {
198
- this.thyCascaderService.writeCascaderValue(value);
199
- if (this.isMultiple) {
200
- this.cdr.detectChanges();
201
- }
202
- }
203
- setDisabledState(isDisabled) {
204
- this.disabled = isDisabled;
205
- }
206
- positionChange(position) {
207
- const newValue = position.connectionPair.originY === 'bottom' ? 'bottom' : 'top';
208
- if (this.dropDownPosition !== newValue) {
209
- this.dropDownPosition = newValue;
210
- this.cdr.detectChanges();
211
- }
212
- }
213
- isActivatedOption(option, index) {
214
- return this.thyCascaderService.isActivatedOption(option, index);
215
- }
216
- isHalfSelectedOption(option, index) {
217
- return this.thyCascaderService.isHalfSelectedOption(option, index);
218
- }
219
- isSelectedOption(option, index) {
220
- return this.thyCascaderService.isSelectedOption(option, index);
221
- }
222
- attached() {
223
- this.cdr.detectChanges();
224
- this.cdkConnectedOverlay.positionChange.pipe(take(1), takeUntil(this.destroy$)).subscribe(() => {
225
- this.scrollActiveElementIntoView();
226
- });
227
- }
228
- scrollActiveElementIntoView() {
229
- if (!isEmpty(this.thyCascaderService.selectedOptions)) {
230
- const activeOptions = this.cascaderOptions
231
- .filter(item => item.nativeElement.classList.contains('thy-cascader-menu-item-active'))
232
- // for multiple mode
233
- .slice(-this.cascaderOptionContainers.length);
234
- this.cascaderOptionContainers.forEach((item, index) => {
235
- if (index <= activeOptions.length - 1) {
236
- ScrollToService.scrollToElement(activeOptions[index].nativeElement, item.nativeElement);
237
- this.cdr.detectChanges();
238
- }
239
- });
240
- }
241
- }
242
- setMenuVisible(menuVisible) {
243
- if (this.menuVisible !== menuVisible) {
244
- this.menuVisible = menuVisible;
245
- this.thyCascaderService.initActivatedOptions(this.menuVisible);
246
- this.setClassMap();
247
- this.setMenuClass();
248
- if (this.menuVisible) {
249
- this.triggerRect = this.trigger.nativeElement.getBoundingClientRect();
250
- this.subscribeTriggerResize();
251
- }
252
- else {
253
- this.unsubscribeTriggerResize();
254
- }
255
- this.thyExpandStatusChange.emit(menuVisible);
256
- }
257
- }
258
- get menuCls() {
259
- return this._menuCls;
260
- }
261
- setMenuClass() {
262
- this._menuCls = {
263
- [`${this.prefixCls}-menus`]: true,
264
- [`${this.prefixCls}-menus-hidden`]: !this.menuVisible,
265
- [`${this.thyMenuClassName}`]: this.thyMenuClassName,
266
- [`w-100`]: this.columns.length === 0
267
- };
268
- }
269
- get menuColumnCls() {
270
- return this._menuColumnCls;
271
- }
272
- setMenuColumnClass() {
273
- this._menuColumnCls = {
274
- [`${this.prefixCls}-menu`]: true,
275
- [`${this.thyColumnClassName}`]: this.thyColumnClassName
276
- };
277
- }
278
- get labelCls() {
279
- return this._labelCls;
280
- }
281
- setLabelClass() {
282
- this._labelCls = {
283
- [`${this.prefixCls}-picker-label`]: true,
284
- [`${this.prefixCls}-show-search`]: false,
285
- [`${this.prefixCls}-focused`]: false,
286
- 'text-truncate': true
287
- };
288
- }
289
- setClassMap() {
290
- const classMap = {
291
- [`${this.prefixCls}`]: true,
292
- [`${this.prefixCls}-picker`]: true,
293
- [`${this.prefixCls}-${this.thySize}`]: true,
294
- [`${this.prefixCls}-picker-disabled`]: this.disabled,
295
- [`${this.prefixCls}-picker-open`]: this.menuVisible
296
- };
297
- this.hostRenderer.updateClassByMap(classMap);
298
- }
299
- isClickTriggerAction() {
300
- if (typeof this.thyTriggerAction === 'string') {
301
- return this.thyTriggerAction === 'click';
302
- }
303
- return this.thyTriggerAction.indexOf('click') !== -1;
304
- }
305
- isHoverTriggerAction() {
306
- if (typeof this.thyTriggerAction === 'string') {
307
- return this.thyTriggerAction === 'hover';
308
- }
309
- return this.thyTriggerAction.indexOf('hover') !== -1;
310
- }
311
- isHoverExpandTriggerAction() {
312
- if (typeof this.thyExpandTriggerAction === 'string') {
313
- return this.thyExpandTriggerAction === 'hover';
314
- }
315
- return this.thyExpandTriggerAction.indexOf('hover') !== -1;
316
- }
317
- toggleClick($event) {
318
- if (this.disabled) {
319
- return;
320
- }
321
- if (this.isClickTriggerAction()) {
322
- this.setMenuVisible(!this.menuVisible);
323
- }
324
- }
325
- toggleMouseEnter(event) {
326
- if (this.disabled || !this.isHoverTriggerAction() || this.menuVisible) {
327
- return;
328
- }
329
- this.setMenuVisible(true);
330
- }
331
- toggleMouseLeave(event) {
332
- if (this.disabled || !this.isHoverTriggerAction() || !this.menuVisible) {
333
- event.preventDefault();
334
- return;
335
- }
336
- const hostEl = this.elementRef.nativeElement;
337
- const mouseTarget = event.relatedTarget;
338
- if (hostEl.contains(mouseTarget) ||
339
- mouseTarget?.classList.contains('cdk-overlay-pane') ||
340
- mouseTarget?.classList.contains('cdk-overlay-backdrop')) {
341
- return;
342
- }
343
- this.setMenuVisible(false);
344
- }
345
- clickCustomOption(option, index, event) {
346
- if (event === true) {
347
- this.thyCascaderService.clearSelection();
348
- }
349
- this.thyCascaderService.clickOption(option, index, event, this.selectOption);
350
- }
351
- clickOption(option, index, event) {
352
- this.thyCascaderService.removeCustomOption();
353
- this.thyCascaderService.clickOption(option, index, event, this.selectOption);
354
- if (this.cdkConnectedOverlay && this.cdkConnectedOverlay.overlayRef) {
355
- // Make sure to calculate and update the position after the submenu is opened
356
- this.cdr.detectChanges();
357
- // Update the position to prevent the submenu from appearing off-screen
358
- this.cdkConnectedOverlay.overlayRef.updatePosition();
359
- this.cdr.markForCheck();
360
- }
361
- }
362
- mouseoverOption(option, index, event) {
363
- if (event) {
364
- event.preventDefault();
365
- }
366
- if (option && option.disabled && !this.isMultiple) {
367
- return;
368
- }
369
- if (!this.isHoverExpandTriggerAction() && !(option && option.disabled && this.isMultiple)) {
370
- return;
371
- }
372
- this.setActiveOption(option, index, false);
373
- }
374
- onBlur(event) {
375
- // Tab 聚焦后自动聚焦到 input 输入框,此分支下直接返回,无需触发 onTouchedFn
376
- if (elementMatchClosest(event?.relatedTarget, ['.thy-cascader-menus', 'thy-cascader'])) {
377
- return;
378
- }
379
- this.onTouchedFn();
380
- }
381
- onFocus(event) {
382
- if (!elementMatchClosest(event?.relatedTarget, ['.thy-cascader-menus', 'thy-cascader'])) {
383
- const inputElement = this.elementRef.nativeElement.querySelector('input');
384
- inputElement.focus();
385
- }
386
- }
387
- closeMenu() {
388
- if (this.menuVisible) {
389
- this.setMenuVisible(false);
390
- this.onTouchedFn();
391
- this.isShowSearchPanel = false;
392
- this.thyCascaderService.searchResultList = [];
393
- }
394
- }
395
- setActiveOption(option, index, select, loadChildren = true) {
396
- this.thyCascaderService.setActiveOption(option, index, select, loadChildren, this.selectOption);
397
- }
398
- removeSelectedItem(event) {
399
- event.$eventOrigin.stopPropagation();
400
- this.thyCascaderService.removeSelectedItem(event?.item);
401
- }
402
- shouldPerformSelection(option, level) {
403
- return typeof this.thyChangeOn === 'function' ? this.thyChangeOn(option, level) === true : false;
404
- }
405
- clearSelection($event) {
406
- if ($event) {
407
- $event.stopPropagation();
408
- $event.preventDefault();
409
- }
410
- this.afterChangeFn = () => {
411
- this.setMenuVisible(false);
412
- };
413
- this.thyCascaderService.clearSelection();
414
- }
415
- constructor() {
416
- super();
417
- this.platformId = inject(PLATFORM_ID);
418
- this.cdr = inject(ChangeDetectorRef);
419
- this.elementRef = inject(ElementRef);
420
- this.thyClickDispatcher = inject(ThyClickDispatcher);
421
- this.ngZone = inject(NgZone);
422
- this.thyCascaderService = inject(ThyCascaderService);
423
- this.locale = injectLocale('cascader');
424
- this.emptyIcon = injectPanelEmptyIcon();
425
- /**
426
- * 选项的实际值的属性名
427
- */
428
- this.thyValueProperty = 'value';
429
- /**
430
- * 选项的显示值的属性名
431
- */
432
- this.thyLabelProperty = 'label';
433
- /**
434
- * 描述输入字段预期值的简短的提示信息
435
- */
436
- this.thyPlaceholder = this.locale().placeholder;
437
- /**
438
- * 控制大小(5种)
439
- * @type 'xs' | 'sm' | 'md' | 'lg' | ''
440
- */
441
- this.thySize = '';
442
- /**
443
- * 点击项时,表单是否动态展示数据项
444
- * @type boolean
445
- */
446
- this.thyChangeOnSelect = false;
447
- /**
448
- * 显示输入框
449
- * @type boolean
450
- */
451
- this.thyShowInput = true;
452
- /**
453
- * 控制触发状态, 支持 `click` | `hover`
454
- * @type ThyCascaderTriggerType | ThyCascaderTriggerType[]
455
- */
456
- this.thyTriggerAction = ['click'];
457
- /**
458
- * 鼠标经过下方列表项时,是否自动展开列表,支持 `click` | `hover`
459
- * @type ThyCascaderExpandTrigger | ThyCascaderExpandTrigger[]
460
- */
461
- this.thyExpandTriggerAction = ['click'];
462
- this.disabled = false;
463
- /**
464
- * 设置多选时最大显示的标签数量,0 表示不限制
465
- * @type number
466
- */
467
- this.thyMaxTagCount = 0;
468
- /**
469
- * 是否仅允许选择叶子项
470
- * @default true
471
- */
472
- this.thyIsOnlySelectLeaf = true;
473
- /**
474
- * 是否支持搜索
475
- * @default false
476
- */
477
- this.thyShowSearch = false;
478
- /**
479
- * 多选选中项的展示方式,默认为空,渲染文字模板,传入tag,渲染展示模板,
480
- * @default ''|tag
481
- */
482
- this.thyPreset = '';
483
- /**
484
- * 是否有幕布
485
- */
486
- this.thyHasBackdrop = true;
487
- /**
488
- * 值发生变化时触发,返回选择项的值
489
- * @type EventEmitter<any[]>
490
- */
491
- this.thyChange = new EventEmitter();
492
- /**
493
- * 值发生变化时触发,返回选择项列表
494
- * @type EventEmitter<ThyCascaderOption[]>
495
- */
496
- this.thySelectionChange = new EventEmitter();
497
- /**
498
- * 选择选项时触发
499
- */
500
- this.thySelect = new EventEmitter();
501
- /**
502
- * @private 暂无实现
503
- */
504
- this.thyDeselect = new EventEmitter();
505
- /**
506
- * 清空选项时触发
507
- */
508
- this.thyClear = new EventEmitter();
509
- /**
510
- * 下拉选项展开和折叠状态事件
511
- */
512
- this.thyExpandStatusChange = new EventEmitter();
513
- this.dropDownPosition = 'bottom';
514
- this.menuVisible = false;
515
- this.isLabelRenderTemplate = false;
516
- this.emptyStateText = this.locale().empty;
517
- this.prefixCls = 'thy-cascader';
518
- this.destroy$ = new Subject();
519
- this.hostRenderer = useHostRenderer();
520
- this.isMultiple = false;
521
- this.menuMinWidth = 122;
522
- this.searchText$ = new BehaviorSubject('');
523
- this.isShowSearchPanel = false;
524
- /**
525
- * 解决搜索&多选的情况下,点击搜索项会导致 panel 闪烁
526
- * 由于点击后,thySelectedOptions变化,导致 thySelectControl
527
- * 又会触发 searchFilter 函数,即 resetSearch 会执行
528
- * 会导致恢复级联状态再变为搜索状态
529
- */
530
- this.isSelectingSearchState = false;
531
- this.selectOption = (option, index) => {
532
- if ((option.isLeaf || !this.thyIsOnlySelectLeaf) && !this.thyMultiple) {
533
- this.afterChangeFn = () => {
534
- this.setMenuVisible(false);
535
- this.onTouchedFn();
536
- };
537
- }
538
- this.thySelect.emit({ option, index });
539
- const isOptionCanSelect = this.thyChangeOnSelect && !this.isMultiple;
540
- if (option.isLeaf || !this.thyIsOnlySelectLeaf || isOptionCanSelect || this.shouldPerformSelection(option, index)) {
541
- this.thyCascaderService.selectOption(option, index);
542
- }
543
- };
544
- }
545
- trackByFn(index, item) {
546
- return item?.value || item?._id || index;
547
- }
548
- searchFilter(searchText) {
549
- if (!searchText && !this.isSelectingSearchState) {
550
- this.resetSearch();
551
- }
552
- this.searchText$.next(searchText);
553
- }
554
- initSearch() {
555
- this.searchText$
556
- .pipe(takeUntil(this.destroy$), DebounceTimeWrapper.debounceTime(200), distinctUntilChanged(), filter(text => text !== ''))
557
- .subscribe(searchText => {
558
- this.resetSearch();
559
- // local search
560
- this.searchInLocal(searchText);
561
- this.isShowSearchPanel = true;
562
- this.cdr.markForCheck();
563
- });
564
- }
565
- searchInLocal(searchText) {
566
- this.thyCascaderService.searchInLocal(searchText);
567
- }
568
- resetSearch() {
569
- this.isShowSearchPanel = false;
570
- this.thyCascaderService.resetSearch();
571
- this.scrollActiveElementIntoView();
572
- }
573
- selectSearchResult(selectOptionData) {
574
- const { thyRowValue: selectedOptions } = selectOptionData;
575
- if (selectOptionData.selected) {
576
- if (!this.isMultiple) {
577
- this.closeMenu();
578
- }
579
- return;
580
- }
581
- selectedOptions.forEach((item, index) => {
582
- this.setActiveOption(item, index, index === selectedOptions.length - 1);
583
- });
584
- if (this.isMultiple) {
585
- this.isSelectingSearchState = true;
586
- selectOptionData.selected = true;
587
- const originSearchResultList = this.searchResultList;
588
- // 保持搜索选项
589
- setTimeout(() => {
590
- this.isShowSearchPanel = true;
591
- this.thyCascaderService.searchResultList = originSearchResultList;
592
- this.isSelectingSearchState = false;
593
- });
594
- }
595
- else {
596
- this.resetSearch();
597
- }
598
- }
599
- subscribeTriggerResize() {
600
- this.unsubscribeTriggerResize();
601
- this.ngZone.runOutsideAngular(() => {
602
- this.resizeSubscription = new Observable(observer => {
603
- const resize = new ResizeObserver((entries) => {
604
- observer.next();
605
- });
606
- resize.observe(this.trigger.nativeElement);
607
- }).subscribe(() => {
608
- this.ngZone.run(() => {
609
- this.triggerRect = this.trigger.nativeElement.getBoundingClientRect();
610
- if (this.cdkConnectedOverlay && this.cdkConnectedOverlay.overlayRef) {
611
- this.cdkConnectedOverlay.overlayRef.updatePosition();
612
- }
613
- this.cdr.markForCheck();
614
- });
615
- });
616
- });
617
- }
618
- unsubscribeTriggerResize() {
619
- if (this.resizeSubscription) {
620
- this.resizeSubscription.unsubscribe();
621
- this.resizeSubscription = null;
622
- }
623
- }
624
- ngOnDestroy() {
625
- this.unsubscribeTriggerResize();
626
- this.destroy$.next();
627
- this.destroy$.complete();
628
- }
629
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ThyCascader, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
630
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ThyCascader, isStandalone: true, selector: "thy-cascader,[thy-cascader]", inputs: { thyValueProperty: "thyValueProperty", thyLabelProperty: "thyLabelProperty", thyPlaceholder: "thyPlaceholder", thySize: "thySize", thyOptions: "thyOptions", thyCustomOptions: "thyCustomOptions", thyChangeOn: "thyChangeOn", thyChangeOnSelect: ["thyChangeOnSelect", "thyChangeOnSelect", coerceBooleanProperty], thyShowInput: ["thyShowInput", "thyShowInput", coerceBooleanProperty], thyOptionRender: "thyOptionRender", thyLabelRender: "thyLabelRender", thyLoadData: "thyLoadData", thyTriggerAction: "thyTriggerAction", thyExpandTriggerAction: "thyExpandTriggerAction", thyMenuStyle: "thyMenuStyle", thySearchListStyle: "thySearchListStyle", thyMenuClassName: "thyMenuClassName", thyColumnClassName: "thyColumnClassName", thyDisabled: ["thyDisabled", "thyDisabled", coerceBooleanProperty], thyEmptyStateText: "thyEmptyStateText", thyMultiple: ["thyMultiple", "thyMultiple", coerceBooleanProperty], thyMaxTagCount: ["thyMaxTagCount", "thyMaxTagCount", numberAttribute], thyIsOnlySelectLeaf: ["thyIsOnlySelectLeaf", "thyIsOnlySelectLeaf", coerceBooleanProperty], thyAutoExpand: ["thyAutoExpand", "thyAutoExpand", coerceBooleanProperty], thyShowSearch: ["thyShowSearch", "thyShowSearch", coerceBooleanProperty], thyPreset: "thyPreset", thyHasBackdrop: ["thyHasBackdrop", "thyHasBackdrop", coerceBooleanProperty] }, outputs: { thyChange: "thyChange", thySelectionChange: "thySelectionChange", thySelect: "thySelect", thyDeselect: "thyDeselect", thyClear: "thyClear", thyExpandStatusChange: "thyExpandStatusChange" }, host: { listeners: { "focus": "onFocus($event)", "blur": "onBlur($event)", "click": "toggleClick($event)", "mouseenter": "toggleMouseEnter($event)", "mouseleave": "toggleMouseLeave($event)" }, properties: { "attr.tabindex": "tabIndex" } }, providers: [
631
- {
632
- provide: NG_VALUE_ACCESSOR,
633
- useExisting: forwardRef(() => ThyCascader),
634
- multi: true
635
- },
636
- ThyCascaderService
637
- ], viewQueries: [{ propertyName: "cdkConnectedOverlay", first: true, predicate: CdkConnectedOverlay, descendants: true, static: true }, { propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, read: ElementRef, static: true }, { propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "menu", first: true, predicate: ["menu"], descendants: true }, { propertyName: "cascaderOptions", predicate: ["cascaderOptions"], descendants: true, read: ElementRef }, { propertyName: "cascaderOptionContainers", predicate: ["cascaderOptionContainers"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div cdkOverlayOrigin #origin=\"cdkOverlayOrigin\" #trigger>\n @if (thyShowInput) {\n <div\n thySelectControl\n [thyShowSearch]=\"thyShowSearch\"\n [thySize]=\"thySize\"\n [thyAllowClear]=\"true\"\n [thySelectedOptions]=\"selected\"\n [thyMaxTagCount]=\"thyMaxTagCount\"\n (thyOnRemove)=\"removeSelectedItem($event)\"\n (thyOnClear)=\"clearSelection($event)\"\n (thyOnBlur)=\"onBlur($event)\"\n (thyOnSearch)=\"searchFilter($event)\"\n [thyDisabled]=\"disabled\"\n [thyIsMultiple]=\"thyMultiple\"\n [thyPanelOpened]=\"menuVisible\"\n [thyPlaceholder]=\"thyPlaceholder\"\n [customDisplayTemplate]=\"customDisplayTemplate\"\n [thyPreset]=\"thyPreset\">\n <ng-template #customDisplayTemplate let-value>\n @if (!isLabelRenderTemplate) {\n <span [ngClass]=\"labelCls\">{{ value.labelText }}</span>\n } @else {\n <span [ngClass]=\"labelCls\">\n <ng-template [ngTemplateOutlet]=\"thyLabelRender\" [ngTemplateOutletContext]=\"value.labelRenderContext\"></ng-template>\n </span>\n }\n </ng-template>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayHasBackdrop]=\"thyHasBackdrop\"\n cdkConnectedOverlayBackdropClass=\"thy-cascader-backdrop\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayMinWidth]=\"menuMinWidth\"\n cdkConnectedOverlayTransformOriginOn=\".thy-cascader-menus\"\n (backdropClick)=\"closeMenu()\"\n (detach)=\"closeMenu()\"\n (attach)=\"attached()\"\n (positionChange)=\"positionChange($event)\"\n [cdkConnectedOverlayOpen]=\"menuVisible\">\n <div\n [attr.tabindex]=\"-1\"\n #menu\n [ngClass]=\"menuCls\"\n [ngStyle]=\"thyMenuStyle\"\n (mouseleave)=\"toggleMouseLeave($event)\"\n [@scaleYMotion]=\"'enter'\">\n @if (!isShowSearchPanel) {\n @if (columns.length > 0) {\n @for (options of columns; track $index; let i = $index; let isFirst = $first) {\n <ul #cascaderOptionContainers [ngClass]=\"menuColumnCls\">\n @if (thyCustomOptions && thyCustomOptions.length > 0 && isFirst) {\n @for (customOpt of thyCustomOptions; track trackByFn($index, customOpt)) {\n <li\n #cascaderOptions\n thy-cascader-option\n [option]=\"customOpt\"\n [multiple]=\"thyMultiple\"\n [isOnlySelectLeaf]=\"thyIsOnlySelectLeaf\"\n [labelProperty]=\"thyLabelProperty\"\n [active]=\"isActivatedOption(customOpt, 0)\"\n [halfSelected]=\"isHalfSelectedOption(customOpt, 0)\"\n [selected]=\"isSelectedOption(customOpt, 0)\"\n (toggleSelectChange)=\"clickCustomOption(customOpt, 0, $event)\"\n (click)=\"clickCustomOption(customOpt, 0, $event)\"\n (mouseover)=\"mouseoverOption(customOpt, 0, $event)\"></li>\n }\n <thy-divider class=\"my-1 mx-4\"></thy-divider>\n }\n @for (option of options; track trackByFn($index, option)) {\n <li\n #cascaderOptions\n thy-cascader-option\n [option]=\"option\"\n [multiple]=\"thyMultiple\"\n [isOnlySelectLeaf]=\"thyIsOnlySelectLeaf\"\n [labelProperty]=\"thyLabelProperty\"\n [active]=\"isActivatedOption(option, i)\"\n [halfSelected]=\"isHalfSelectedOption(option, i)\"\n [selected]=\"isSelectedOption(option, i)\"\n [optionRender]=\"thyOptionRender\"\n (toggleSelectChange)=\"clickOption(option, i, $event)\"\n (click)=\"clickOption(option, i, $event)\"\n (mouseover)=\"mouseoverOption(option, i, $event)\"></li>\n }\n </ul>\n }\n } @else {\n <div class=\"thy-cascader-empty-container\" [ngStyle]=\"{ 'width.px': triggerRect?.width }\">\n <thy-empty class=\"thy-select-empty-content\" thySize=\"sm\" [thyMessage]=\"emptyStateText\" [thyIconName]=\"emptyIcon()\"></thy-empty>\n </div>\n }\n }\n @if (isShowSearchPanel) {\n @if (searchResultList.length) {\n <ul class=\"thy-cascader-search-list py-3\" [ngStyle]=\"thySearchListStyle\">\n @for (item of searchResultList; track $index) {\n <li\n thy-cascader-search-option\n [multiple]=\"thyMultiple\"\n [isOnlySelectLeaf]=\"thyIsOnlySelectLeaf\"\n [option]=\"item\"\n [active]=\"item.selected\"\n [optionRender]=\"thyOptionRender\"\n (toggleSelectChange)=\"selectSearchResult($event)\"></li>\n }\n </ul>\n } @else {\n <div class=\"thy-cascader-empty-container\" [ngStyle]=\"{ 'width.px': triggerRect?.width }\">\n <thy-empty class=\"thy-select-empty-content\" thySize=\"sm\" [thyMessage]=\"emptyStateText\" [thyIconName]=\"emptyIcon()\"></thy-empty>\n </div>\n }\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ThySelectControl, selector: "thy-select-control,[thySelectControl]", inputs: ["thyPanelOpened", "thyIsMultiple", "thyShowSearch", "thySelectedOptions", "thyDisabled", "customDisplayTemplate", "thyAllowClear", "thyPlaceholder", "thySize", "thyMaxTagCount", "thyBorderless", "thyPreset"], outputs: ["thyOnSearch", "thyOnRemove", "thyOnClear", "thyOnBlur"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: 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: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ThyCascaderOptionComponent, selector: "[thy-cascader-option]", inputs: ["option", "multiple", "isOnlySelectLeaf", "optionRender", "active", "halfSelected", "selected", "labelProperty"], outputs: ["toggleSelectChange"] }, { kind: "component", type: ThyCascaderSearchOptionComponent, selector: "[thy-cascader-search-option]", inputs: ["option", "multiple", "isOnlySelectLeaf", "active", "optionRender"], outputs: ["toggleSelectChange"] }, { kind: "component", type: ThyEmpty, selector: "thy-empty", inputs: ["thyMessage", "thyTranslationKey", "thyTranslationValues", "thyEntityName", "thyEntityNameTranslateKey", "thyIconName", "thySize", "thyMarginTop", "thyTopAuto", "thyContainer", "thyImageUrl", "thyImageLoading", "thyImageFetchPriority", "thyDescription"] }, { kind: "component", type: ThyDivider, selector: "thy-divider", inputs: ["thyVertical", "thyStyle", "thyColor", "thyText", "thyTextDirection", "thyDeeper"] }], animations: [scaleYMotion] }); }
638
- }
639
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ThyCascader, decorators: [{
640
- type: Component,
641
- args: [{ selector: 'thy-cascader,[thy-cascader]', providers: [
642
- {
643
- provide: NG_VALUE_ACCESSOR,
644
- useExisting: forwardRef(() => ThyCascader),
645
- multi: true
646
- },
647
- ThyCascaderService
648
- ], host: {
649
- '[attr.tabindex]': `tabIndex`,
650
- '(focus)': 'onFocus($event)',
651
- '(blur)': 'onBlur($event)'
652
- }, standalone: true, imports: [
653
- CdkOverlayOrigin,
654
- ThySelectControl,
655
- NgClass,
656
- NgTemplateOutlet,
657
- CdkConnectedOverlay,
658
- NgStyle,
659
- ThyCascaderOptionComponent,
660
- ThyCascaderSearchOptionComponent,
661
- ThyEmpty,
662
- ThyIcon,
663
- ThyDivider
664
- ], animations: [scaleYMotion], template: "<div cdkOverlayOrigin #origin=\"cdkOverlayOrigin\" #trigger>\n @if (thyShowInput) {\n <div\n thySelectControl\n [thyShowSearch]=\"thyShowSearch\"\n [thySize]=\"thySize\"\n [thyAllowClear]=\"true\"\n [thySelectedOptions]=\"selected\"\n [thyMaxTagCount]=\"thyMaxTagCount\"\n (thyOnRemove)=\"removeSelectedItem($event)\"\n (thyOnClear)=\"clearSelection($event)\"\n (thyOnBlur)=\"onBlur($event)\"\n (thyOnSearch)=\"searchFilter($event)\"\n [thyDisabled]=\"disabled\"\n [thyIsMultiple]=\"thyMultiple\"\n [thyPanelOpened]=\"menuVisible\"\n [thyPlaceholder]=\"thyPlaceholder\"\n [customDisplayTemplate]=\"customDisplayTemplate\"\n [thyPreset]=\"thyPreset\">\n <ng-template #customDisplayTemplate let-value>\n @if (!isLabelRenderTemplate) {\n <span [ngClass]=\"labelCls\">{{ value.labelText }}</span>\n } @else {\n <span [ngClass]=\"labelCls\">\n <ng-template [ngTemplateOutlet]=\"thyLabelRender\" [ngTemplateOutletContext]=\"value.labelRenderContext\"></ng-template>\n </span>\n }\n </ng-template>\n </div>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayHasBackdrop]=\"thyHasBackdrop\"\n cdkConnectedOverlayBackdropClass=\"thy-cascader-backdrop\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayMinWidth]=\"menuMinWidth\"\n cdkConnectedOverlayTransformOriginOn=\".thy-cascader-menus\"\n (backdropClick)=\"closeMenu()\"\n (detach)=\"closeMenu()\"\n (attach)=\"attached()\"\n (positionChange)=\"positionChange($event)\"\n [cdkConnectedOverlayOpen]=\"menuVisible\">\n <div\n [attr.tabindex]=\"-1\"\n #menu\n [ngClass]=\"menuCls\"\n [ngStyle]=\"thyMenuStyle\"\n (mouseleave)=\"toggleMouseLeave($event)\"\n [@scaleYMotion]=\"'enter'\">\n @if (!isShowSearchPanel) {\n @if (columns.length > 0) {\n @for (options of columns; track $index; let i = $index; let isFirst = $first) {\n <ul #cascaderOptionContainers [ngClass]=\"menuColumnCls\">\n @if (thyCustomOptions && thyCustomOptions.length > 0 && isFirst) {\n @for (customOpt of thyCustomOptions; track trackByFn($index, customOpt)) {\n <li\n #cascaderOptions\n thy-cascader-option\n [option]=\"customOpt\"\n [multiple]=\"thyMultiple\"\n [isOnlySelectLeaf]=\"thyIsOnlySelectLeaf\"\n [labelProperty]=\"thyLabelProperty\"\n [active]=\"isActivatedOption(customOpt, 0)\"\n [halfSelected]=\"isHalfSelectedOption(customOpt, 0)\"\n [selected]=\"isSelectedOption(customOpt, 0)\"\n (toggleSelectChange)=\"clickCustomOption(customOpt, 0, $event)\"\n (click)=\"clickCustomOption(customOpt, 0, $event)\"\n (mouseover)=\"mouseoverOption(customOpt, 0, $event)\"></li>\n }\n <thy-divider class=\"my-1 mx-4\"></thy-divider>\n }\n @for (option of options; track trackByFn($index, option)) {\n <li\n #cascaderOptions\n thy-cascader-option\n [option]=\"option\"\n [multiple]=\"thyMultiple\"\n [isOnlySelectLeaf]=\"thyIsOnlySelectLeaf\"\n [labelProperty]=\"thyLabelProperty\"\n [active]=\"isActivatedOption(option, i)\"\n [halfSelected]=\"isHalfSelectedOption(option, i)\"\n [selected]=\"isSelectedOption(option, i)\"\n [optionRender]=\"thyOptionRender\"\n (toggleSelectChange)=\"clickOption(option, i, $event)\"\n (click)=\"clickOption(option, i, $event)\"\n (mouseover)=\"mouseoverOption(option, i, $event)\"></li>\n }\n </ul>\n }\n } @else {\n <div class=\"thy-cascader-empty-container\" [ngStyle]=\"{ 'width.px': triggerRect?.width }\">\n <thy-empty class=\"thy-select-empty-content\" thySize=\"sm\" [thyMessage]=\"emptyStateText\" [thyIconName]=\"emptyIcon()\"></thy-empty>\n </div>\n }\n }\n @if (isShowSearchPanel) {\n @if (searchResultList.length) {\n <ul class=\"thy-cascader-search-list py-3\" [ngStyle]=\"thySearchListStyle\">\n @for (item of searchResultList; track $index) {\n <li\n thy-cascader-search-option\n [multiple]=\"thyMultiple\"\n [isOnlySelectLeaf]=\"thyIsOnlySelectLeaf\"\n [option]=\"item\"\n [active]=\"item.selected\"\n [optionRender]=\"thyOptionRender\"\n (toggleSelectChange)=\"selectSearchResult($event)\"></li>\n }\n </ul>\n } @else {\n <div class=\"thy-cascader-empty-container\" [ngStyle]=\"{ 'width.px': triggerRect?.width }\">\n <thy-empty class=\"thy-select-empty-content\" thySize=\"sm\" [thyMessage]=\"emptyStateText\" [thyIconName]=\"emptyIcon()\"></thy-empty>\n </div>\n }\n }\n </div>\n</ng-template>\n" }]
665
- }], ctorParameters: () => [], propDecorators: { thyValueProperty: [{
666
- type: Input
667
- }], thyLabelProperty: [{
668
- type: Input
669
- }], thyPlaceholder: [{
670
- type: Input
671
- }], thySize: [{
672
- type: Input
673
- }], thyOptions: [{
674
- type: Input
675
- }], thyCustomOptions: [{
676
- type: Input
677
- }], thyChangeOn: [{
678
- type: Input
679
- }], thyChangeOnSelect: [{
680
- type: Input,
681
- args: [{ transform: coerceBooleanProperty }]
682
- }], thyShowInput: [{
683
- type: Input,
684
- args: [{ transform: coerceBooleanProperty }]
685
- }], thyOptionRender: [{
686
- type: Input
687
- }], thyLabelRender: [{
688
- type: Input
689
- }], thyLoadData: [{
690
- type: Input
691
- }], thyTriggerAction: [{
692
- type: Input
693
- }], thyExpandTriggerAction: [{
694
- type: Input
695
- }], thyMenuStyle: [{
696
- type: Input
697
- }], thySearchListStyle: [{
698
- type: Input
699
- }], thyMenuClassName: [{
700
- type: Input
701
- }], thyColumnClassName: [{
702
- type: Input
703
- }], thyDisabled: [{
704
- type: Input,
705
- args: [{ transform: coerceBooleanProperty }]
706
- }], thyEmptyStateText: [{
707
- type: Input
708
- }], thyMultiple: [{
709
- type: Input,
710
- args: [{ transform: coerceBooleanProperty }]
711
- }], thyMaxTagCount: [{
712
- type: Input,
713
- args: [{ transform: numberAttribute }]
714
- }], thyIsOnlySelectLeaf: [{
715
- type: Input,
716
- args: [{ transform: coerceBooleanProperty }]
717
- }], thyAutoExpand: [{
718
- type: Input,
719
- args: [{ transform: coerceBooleanProperty }]
720
- }], thyShowSearch: [{
721
- type: Input,
722
- args: [{ transform: coerceBooleanProperty }]
723
- }], thyPreset: [{
724
- type: Input
725
- }], thyHasBackdrop: [{
726
- type: Input,
727
- args: [{ transform: coerceBooleanProperty }]
728
- }], thyChange: [{
729
- type: Output
730
- }], thySelectionChange: [{
731
- type: Output
732
- }], thySelect: [{
733
- type: Output
734
- }], thyDeselect: [{
735
- type: Output
736
- }], thyClear: [{
737
- type: Output
738
- }], thyExpandStatusChange: [{
739
- type: Output
740
- }], cascaderOptions: [{
741
- type: ViewChildren,
742
- args: ['cascaderOptions', { read: ElementRef }]
743
- }], cascaderOptionContainers: [{
744
- type: ViewChildren,
745
- args: ['cascaderOptionContainers', { read: ElementRef }]
746
- }], cdkConnectedOverlay: [{
747
- type: ViewChild,
748
- args: [CdkConnectedOverlay, { static: true }]
749
- }], trigger: [{
750
- type: ViewChild,
751
- args: ['trigger', { read: ElementRef, static: true }]
752
- }], input: [{
753
- type: ViewChild,
754
- args: ['input']
755
- }], menu: [{
756
- type: ViewChild,
757
- args: ['menu']
758
- }], toggleClick: [{
759
- type: HostListener,
760
- args: ['click', ['$event']]
761
- }], toggleMouseEnter: [{
762
- type: HostListener,
763
- args: ['mouseenter', ['$event']]
764
- }], toggleMouseLeave: [{
765
- type: HostListener,
766
- args: ['mouseleave', ['$event']]
767
- }] } });
768
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzY2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2Nhc2NhZGVyL2Nhc2NhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9jYXNjYWRlci9jYXNjYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQTBELE1BQU0sc0JBQXNCLENBQUM7QUFDckksT0FBTyxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RixPQUFPLEVBRUgsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixlQUFlLEVBSWYsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBRVQsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUNILDJCQUEyQixFQUMzQixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLHlDQUF5QyxFQUN6QyxrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3ZCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQXVDLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFMUYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFB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QUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVL0IsZ0JBQWdCO3NCQUR0QixZQUFZO3VCQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0Nvbm5lY3RlZE92ZXJsYXksIENka092ZXJsYXlPcmlnaW4sIENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSwgQ29ubmVjdGlvblBvc2l0aW9uUGFpciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyLCBOZ0NsYXNzLCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgTmdab25lLFxuICAgIG51bWJlckF0dHJpYnV0ZSxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUExBVEZPUk1fSUQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBpbmplY3QsXG4gICAgU2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgdXNlSG9zdFJlbmRlcmVyIH0gZnJvbSAnQHRldGh5cy9jZGsvZG9tJztcbmltcG9ydCB7XG4gICAgRVhQQU5ERURfRFJPUERPV05fUE9TSVRJT05TLFxuICAgIERlYm91bmNlVGltZVdyYXBwZXIsXG4gICAgU2Nyb2xsVG9TZXJ2aWNlLFxuICAgIFRhYkluZGV4RGlzYWJsZWRDb250cm9sVmFsdWVBY2Nlc3Nvck1peGluLFxuICAgIFRoeUNsaWNrRGlzcGF0Y2hlcixcbiAgICBpbmplY3RQYW5lbEVtcHR5SWNvblxufSBmcm9tICduZ3gtdGV0aHlzL2NvcmUnO1xuaW1wb3J0IHsgVGh5RW1wdHkgfSBmcm9tICduZ3gtdGV0aHlzL2VtcHR5JztcbmltcG9ydCB7IFRoeUljb24gfSBmcm9tICduZ3gtdGV0aHlzL2ljb24nO1xuaW1wb3J0IHsgU2VsZWN0Q29udHJvbFNpemUsIFNlbGVjdE9wdGlvbkJhc2UsIFRoeVNlbGVjdENvbnRyb2wgfSBmcm9tICduZ3gtdGV0aHlzL3NoYXJlZCc7XG5pbXBvcnQgeyBTYWZlQW55IH0gZnJvbSAnbmd4LXRldGh5cy90eXBlcyc7XG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHksIGVsZW1lbnRNYXRjaENsb3Nlc3QsIGlzRW1wdHkgfSBmcm9tICduZ3gtdGV0aHlzL3V0aWwnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgc2NhbGVZTW90aW9uIH0gZnJvbSAnbmd4LXRldGh5cy9jb3JlJztcbmltcG9ydCB7IFRoeURpdmlkZXIgfSBmcm9tICduZ3gtdGV0aHlzL2RpdmlkZXInO1xuaW1wb3J0IHsgVGh5Q2FzY2FkZXJPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2Nhc2NhZGVyLWxpLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaHlDYXNjYWRlclNlYXJjaE9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vY2FzY2FkZXItc2VhcmNoLW9wdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGh5Q2FzY2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi9jYXNjYWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFRoeUNhc2NhZGVyRXhwYW5kVHJpZ2dlciwgVGh5Q2FzY2FkZXJPcHRpb24sIFRoeUNhc2NhZGVyU2VhcmNoT3B0aW9uLCBUaHlDYXNjYWRlclRyaWdnZXJUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBpbmplY3RMb2NhbGUsIFRoeUNhc2NhZGVyTG9jYWxlIH0gZnJvbSAnbmd4LXRldGh5cy9pMThuJztcblxuLyoqXG4gKiDnuqfogZTpgInmi6noj5zljZVcbiAqIEBuYW1lIHRoeS1jYXNjYWRlclxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RoeS1jYXNjYWRlcixbdGh5LWNhc2NhZGVyXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Nhc2NhZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUaHlDYXNjYWRlciksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBUaHlDYXNjYWRlclNlcnZpY2VcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1thdHRyLnRhYmluZGV4XSc6IGB0YWJJbmRleGAsXG4gICAgICAgICcoZm9jdXMpJzogJ29uRm9jdXMoJGV2ZW50KScsXG4gICAgICAgICcoYmx1ciknOiAnb25CbHVyKCRldmVudCknXG4gICAgfSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ2RrT3ZlcmxheU9yaWdpbixcbiAgICAgICAgVGh5U2VsZWN0Q29udHJvbCxcbiAgICAgICAgTmdDbGFzcyxcbiAgICAgICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICAgICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICAgICAgTmdTdHlsZSxcbiAgICAgICAgVGh5Q2FzY2FkZXJPcHRpb25Db21wb25lbnQsXG4gICAgICAgIFRoeUNhc2NhZGVyU2VhcmNoT3B0aW9uQ29tcG9uZW50LFxuICAgICAgICBUaHlFbXB0eSxcbiAgICAgICAgVGh5SWNvbixcbiAgICAgICAgVGh5RGl2aWRlclxuICAgIF0sXG4gICAgYW5pbWF0aW9uczogW3NjYWxlWU1vdGlvbl1cbn0pXG5leHBvcnQgY2xhc3MgVGh5Q2FzY2FkZXJcbiAgICBleHRlbmRzIFRhYkluZGV4RGlzYWJsZWRDb250cm9sVmFsdWVBY2Nlc3Nvck1peGluXG4gICAgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdFxue1xuICAgIHByaXZhdGUgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG4gICAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gICAgcHJpdmF0ZSB0aHlDbGlja0Rpc3BhdGNoZXIgPSBpbmplY3QoVGh5Q2xpY2tEaXNwYXRjaGVyKTtcbiAgICBwcml2YXRlIG5nWm9uZSA9IGluamVjdChOZ1pvbmUpO1xuICAgIHRoeUNhc2NhZGVyU2VydmljZSA9IGluamVjdChUaHlDYXNjYWRlclNlcnZpY2UpO1xuICAgIHByaXZhdGUgbG9jYWxlOiBTaWduYWw8VGh5Q2FzY2FkZXJMb2NhbGU+ID0gaW5qZWN0TG9jYWxlKCdjYXNjYWRlcicpO1xuICAgIGVtcHR5SWNvbjogU2lnbmFsPHN0cmluZz4gPSBpbmplY3RQYW5lbEVtcHR5SWNvbigpO1xuXG4gICAgLyoqXG4gICAgICog6YCJ6aG555qE5a6e6ZmF5YC855qE5bGe5oCn5ZCNXG4gICAgICovXG4gICAgQElucHV0KCkgdGh5VmFsdWVQcm9wZXJ0eSA9ICd2YWx1ZSc7XG5cbiAgICAvKipcbiAgICAgKiDpgInpobnnmoTmmL7npLrlgLznmoTlsZ7mgKflkI1cbiAgICAgKi9cbiAgICBASW5wdXQoKSB0aHlMYWJlbFByb3BlcnR5ID0gJ2xhYmVsJztcblxuICAgIC8qKlxuICAgICAqIOaPj+i/sOi+k+WFpeWtl+autemihOacn+WAvOeahOeugOefreeahOaPkOekuuS/oeaBr1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeVBsYWNlaG9sZGVyID0gdGhpcy5sb2NhbGUoKS5wbGFjZWhvbGRlcjtcblxuICAgIC8qKlxuICAgICAqIOaOp+WItuWkp+Wwj++8iDXnp43vvIlcbiAgICAgKiBAdHlwZSAneHMnIO+9nCAnc20nIHwgJ21kJyB8ICdsZycgfCAnJ1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeVNpemU6IFNlbGVjdENvbnRyb2xTaXplID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiDmlbDmja7poblcbiAgICAgKiBAdHlwZSBUaHlDYXNjYWRlck9wdGlvbltdXG4gICAgICogQGRlZmF1bHQgW11cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCB0aHlPcHRpb25zKG9wdGlvbnM6IFRoeUNhc2NhZGVyT3B0aW9uW10gfCBudWxsKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBvcHRpb25zICYmIG9wdGlvbnMubGVuZ3RoID8gW29wdGlvbnNdIDogW107XG4gICAgICAgIHRoaXMudGh5Q2FzY2FkZXJTZXJ2aWNlLmluaXRDb2x1bW5zKGNvbHVtbnMpO1xuICAgICAgICBpZiAodGhpcy50aHlDYXNjYWRlclNlcnZpY2UuZGVmYXVsdFZhbHVlICYmIGNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5pbml0T3B0aW9ucygwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiHquWumuS5iemAiemhuVxuICAgICAqIEB0eXBlIFRoeUNhc2NhZGVyT3B0aW9uW11cbiAgICAgKiBAZGVmYXVsdCBbXVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNldCB0aHlDdXN0b21PcHRpb25zKG9wdGlvbnM6IFRoeUNhc2NhZGVyT3B0aW9uW10gfCBudWxsKSB7XG4gICAgICAgIHRoaXMudGh5Q2FzY2FkZXJTZXJ2aWNlLmN1c3RvbU9wdGlvbnMgPSAob3B0aW9ucyB8fCBbXSkubWFwKGl0ZW0gPT4gKHsgLi4uaXRlbSB9KSk7XG4gICAgfVxuXG4gICAgZ2V0IHRoeUN1c3RvbU9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5jdXN0b21PcHRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOeCueWHu+eItue6p+iPnOWNlemAiemhueaXtu+8jOWPr+mAmui/h+ivpeWHveaVsOWIpOaWreaYr+WQpuWFgeiuuOWAvOeahOWPmOWMllxuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeUNoYW5nZU9uOiAob3B0aW9uOiBUaHlDYXNjYWRlck9wdGlvbiwgbGV2ZWw6IG51bWJlcikgPT4gYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIOeCueWHu+mhueaXtu+8jOihqOWNleaYr+WQpuWKqOaAgeWxleekuuaVsOaNrumhuVxuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9KSB0aHlDaGFuZ2VPblNlbGVjdCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICog5pi+56S66L6T5YWl5qGGXG4gICAgICogQHR5cGUgYm9vbGVhblxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogY29lcmNlQm9vbGVhblByb3BlcnR5IH0pIHRoeVNob3dJbnB1dCA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiDnlKjmiLfoh6rlrprkuYnpgInpobnmqKHmnb9cbiAgICAgKiBAdHlwZSBUZW1wbGF0ZVJlZlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeU9wdGlvblJlbmRlcjogVGVtcGxhdGVSZWY8U2FmZUFueT47XG5cbiAgICAvKipcbiAgICAgKiDnlKjmiLfoh6rlrprkuYnmqKHmnb9cbiAgICAgKiBAdHlwZSBUZW1wbGF0ZVJlZlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHRoeUxhYmVsUmVuZGVyKHZhbHVlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIHRoaXMubGFiZWxSZW5kZXJUcGwgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5pc0xhYmVsUmVuZGVyVGVtcGxhdGUgPSB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuICAgICAgICB0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5zZXRDYXNjYWRlck9wdGlvbnMoeyBpc0xhYmVsUmVuZGVyVGVtcGxhdGU6IHRoaXMuaXNMYWJlbFJlbmRlclRlbXBsYXRlIH0pO1xuICAgIH1cblxuICAgIGdldCB0aHlMYWJlbFJlbmRlcigpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGFiZWxSZW5kZXJUcGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog55So5LqO5Yqo5oCB5Yqg6L296YCJ6aG5XG4gICAgICovXG4gICAgQElucHV0KCkgc2V0IHRoeUxvYWREYXRhKHZhbHVlOiAobm9kZTogVGh5Q2FzY2FkZXJPcHRpb24sIGluZGV4PzogbnVtYmVyKSA9PiBQcm9taXNlTGlrZTxhbnk+KSB7XG4gICAgICAgIHRoaXMudGh5Q2FzY2FkZXJTZXJ2aWNlLnNldENhc2NhZGVyT3B0aW9ucyh7IGxvYWREYXRhOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICBnZXQgdGh5TG9hZERhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoeUNhc2NhZGVyU2VydmljZT8uY2FzY2FkZXJPcHRpb25zPy5sb2FkRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmjqfliLbop6blj5HnirbmgIEsIOaUr+aMgSBgY2xpY2tgIHwgYGhvdmVyYFxuICAgICAqIEB0eXBlIFRoeUNhc2NhZGVyVHJpZ2dlclR5cGUgfCBUaHlDYXNjYWRlclRyaWdnZXJUeXBlW11cbiAgICAgKi9cbiAgICBASW5wdXQoKSB0aHlUcmlnZ2VyQWN0aW9uOiBUaHlDYXNjYWRlclRyaWdnZXJUeXBlIHwgVGh5Q2FzY2FkZXJUcmlnZ2VyVHlwZVtdID0gWydjbGljayddO1xuXG4gICAgLyoqXG4gICAgICog6byg5qCH57uP6L+H5LiL5pa55YiX6KGo6aG55pe277yM5piv5ZCm6Ieq5Yqo5bGV5byA5YiX6KGo77yM5pSv5oyBIGBjbGlja2AgfCBgaG92ZXJgXG4gICAgICogQHR5cGUgVGh5Q2FzY2FkZXJFeHBhbmRUcmlnZ2VyIHwgVGh5Q2FzY2FkZXJFeHBhbmRUcmlnZ2VyW11cbiAgICAgKi9cbiAgICBASW5wdXQoKSB0aHlFeHBhbmRUcmlnZ2VyQWN0aW9uOiBUaHlDYXNjYWRlckV4cGFuZFRyaWdnZXIgfCBUaHlDYXNjYWRlckV4cGFuZFRyaWdnZXJbXSA9IFsnY2xpY2snXTtcblxuICAgIC8qKlxuICAgICAqIOiHquWumuS5iea1ruWxguagt+W8j1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeU1lbnVTdHlsZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAgIC8qKlxuICAgICAqIOiHquWumuS5ieaQnOe0ouagt+W8j1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeVNlYXJjaExpc3RTdHlsZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAgIC8qKlxuICAgICAqIOiHquWumuS5iea1ruWxguexu+WQjVxuICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHRoeU1lbnVDbGFzc05hbWUodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLm1lbnVDbGFzc05hbWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zZXRNZW51Q2xhc3MoKTtcbiAgICB9XG5cbiAgICBnZXQgdGh5TWVudUNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5tZW51Q2xhc3NOYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiHquWumuS5iea1ruWxguWIl+exu+WQjVxuICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHRoeUNvbHVtbkNsYXNzTmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuY29sdW1uQ2xhc3NOYW1lID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc2V0TWVudUNsYXNzKCk7XG4gICAgfVxuXG4gICAgZ2V0IHRoeUNvbHVtbkNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5DbGFzc05hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5piv5ZCm5Y+q6K+7XG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9KVxuICAgIG92ZXJyaWRlIHNldCB0aHlEaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gdmFsdWU7XG4gICAgfVxuICAgIG92ZXJyaWRlIGdldCB0aHlEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIOepuueKtuaAgeS4i+eahOWxleekuuaWh+Wtl1xuICAgICAqIEBkZWZhdWx0IOaaguaXoOWPr+mAiemhuVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHRoeUVtcHR5U3RhdGVUZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5lbXB0eVN0YXRlVGV4dCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaYr+WQpuWkmumAiVxuICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogY29lcmNlQm9vbGVhblByb3BlcnR5IH0pXG4gICAgc2V0IHRoeU11bHRpcGxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuaXNNdWx0aXBsZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5zZXRDYXNjYWRlck9wdGlvbnMoeyBpc011bHRpcGxlOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICBnZXQgdGh5TXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTXVsdGlwbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6+572u5aSa6YCJ5pe25pyA5aSn5pi+56S655qE5qCH562+5pWw6YeP77yMMCDooajnpLrkuI3pmZDliLZcbiAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSB0aHlNYXhUYWdDb3VudCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiDmmK/lkKbku4XlhYHorrjpgInmi6nlj7blrZDpoblcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSlcbiAgICB0aHlJc09ubHlTZWxlY3RMZWFmID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIOWIneWni+WMluaXtu+8jOaYr+WQpuWxleW8gOmdouadv1xuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSkgdGh5QXV0b0V4cGFuZDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIOaYr+WQpuaUr+aMgeaQnOe0olxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSkgdGh5U2hvd1NlYXJjaDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICog5aSa6YCJ6YCJ5Lit6aG555qE5bGV56S65pa55byP77yM6buY6K6k5Li656m677yM5riy5p+T5paH5a2X5qih5p2/77yM5Lyg5YWldGFn77yM5riy5p+T5bGV56S65qih5p2/LFxuICAgICAqIEBkZWZhdWx0ICcn772cdGFnXG4gICAgICovXG4gICAgQElucHV0KCkgdGh5UHJlc2V0OiBzdHJpbmcgPSAnJztcblxuICAgIC8qKlxuICAgICAqIOaYr+WQpuacieW5leW4g1xuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogY29lcmNlQm9vbGVhblByb3BlcnR5IH0pIHRoeUhhc0JhY2tkcm9wID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIOWAvOWPkeeUn+WPmOWMluaXtuinpuWPke+8jOi/lOWbnumAieaLqemhueeahOWAvFxuICAgICAqIEB0eXBlIEV2ZW50RW1pdHRlcjxhbnlbXT5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgdGh5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAgIC8qKlxuICAgICAqIOWAvOWPkeeUn+WPmOWMluaXtuinpuWPke+8jOi/lOWbnumAieaLqemhueWIl+ihqFxuICAgICAqIEB0eXBlIEV2ZW50RW1pdHRlcjxUaHlDYXNjYWRlck9wdGlvbltdPlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0aHlTZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRoeUNhc2NhZGVyT3B0aW9uW10+KCk7XG5cbiAgICAvKipcbiAgICAgKiDpgInmi6npgInpobnml7bop6blj5FcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgdGh5U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgICAgIG9wdGlvbjogVGh5Q2FzY2FkZXJPcHRpb247XG4gICAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgfT4oKTtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlIOaaguaXoOWunueOsFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0aHlEZXNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgICAgICBvcHRpb246IFRoeUNhc2NhZGVyT3B0aW9uO1xuICAgICAgICBpbmRleDogbnVtYmVyO1xuICAgIH0+KCk7XG5cbiAgICAvKipcbiAgICAgKiDmuIXnqbrpgInpobnml7bop6blj5FcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgdGh5Q2xlYXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiDkuIvmi4npgInpobnlsZXlvIDlkozmipjlj6DnirbmgIHkuovku7ZcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgdGh5RXhwYW5kU3RhdHVzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBAVmlld0NoaWxkcmVuKCdjYXNjYWRlck9wdGlvbnMnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgY2FzY2FkZXJPcHRpb25zOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdjYXNjYWRlck9wdGlvbkNvbnRhaW5lcnMnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgY2FzY2FkZXJPcHRpb25Db250YWluZXJzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cbiAgICBAVmlld0NoaWxkKENka0Nvbm5lY3RlZE92ZXJsYXksIHsgc3RhdGljOiB0cnVlIH0pIGNka0Nvbm5lY3RlZE92ZXJsYXk6IENka0Nvbm5lY3RlZE92ZXJsYXk7XG5cbiAgICBAVmlld0NoaWxkKCd0cmlnZ2VyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSkgdHJpZ2dlcjogRWxlbWVudFJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnKSBpbnB1dDogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ21lbnUnKSBtZW51OiBFbGVtZW50UmVmO1xuXG4gICAgcHVibGljIGRyb3BEb3duUG9zaXRpb24gPSAnYm90dG9tJztcblxuICAgIHB1YmxpYyBtZW51VmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgcHVibGljIGlzTGFiZWxSZW5kZXJUZW1wbGF0ZSA9IGZhbHNlO1xuXG4gICAgcHVibGljIHRyaWdnZXJSZWN0OiBET01SZWN0O1xuXG4gICAgcHVibGljIGVtcHR5U3RhdGVUZXh0ID0gdGhpcy5sb2NhbGUoKS5lbXB0eTtcblxuICAgIHByaXZhdGUgcHJlZml4Q2xzID0gJ3RoeS1jYXNjYWRlcic7XG5cbiAgICBwcml2YXRlIG1lbnVDbGFzc05hbWU6IHN0cmluZztcblxuICAgIHByaXZhdGUgY29sdW1uQ2xhc3NOYW1lOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIF9tZW51Q29sdW1uQ2xzOiBhbnk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIHByaXZhdGUgX21lbnVDbHM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuXG4gICAgcHJpdmF0ZSBfbGFiZWxDbHM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuXG4gICAgcHJpdmF0ZSBsYWJlbFJlbmRlclRwbDogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIHByaXZhdGUgaG9zdFJlbmRlcmVyID0gdXNlSG9zdFJlbmRlcmVyKCk7XG5cbiAgICBwdWJsaWMgcG9zaXRpb25zOiBDb25uZWN0aW9uUG9zaXRpb25QYWlyW107XG5cbiAgICBnZXQgc2VsZWN0ZWQoKTogU2VsZWN0T3B0aW9uQmFzZSB8IFNlbGVjdE9wdGlvbkJhc2VbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoeU11bHRpcGxlID8gdGhpcy50aHlDYXNjYWRlclNlcnZpY2Uuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQgOiB0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXTtcbiAgICB9XG4gICAgcHJpdmF0ZSBpc011bHRpcGxlID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgbWVudU1pbldpZHRoID0gMTIyO1xuXG4gICAgcHJpdmF0ZSBzZWFyY2hUZXh0JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuXG4gICAgcHVibGljIGdldCBzZWFyY2hSZXN1bHRMaXN0KCk6IFRoeUNhc2NhZGVyU2VhcmNoT3B0aW9uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy50aHlDYXNjYWRlclNlcnZpY2Uuc2VhcmNoUmVzdWx0TGlzdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTaG93U2VhcmNoUGFuZWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIOino+WGs+aQnOe0oiblpJrpgInnmoTmg4XlhrXkuIvvvIzngrnlh7vmkJzntKLpobnkvJrlr7zoh7QgcGFuZWwg6Zeq54OBXG4gICAgICog55Sx5LqO54K55Ye75ZCO77yMdGh5U2VsZWN0ZWRPcHRpb25z5Y+Y5YyW77yM5a+86Ie0IHRoeVNlbGVjdENvbnRyb2xcbiAgICAgKiDlj4jkvJrop6blj5Egc2VhcmNoRmlsdGVyIOWHveaVsO+8jOWNsyByZXNldFNlYXJjaCDkvJrmiafooYxcbiAgICAgKiDkvJrlr7zoh7TmgaLlpI3nuqfogZTnirbmgIHlho3lj5jkuLrmkJzntKLnirbmgIFcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzU2VsZWN0aW5nU2VhcmNoU3RhdGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBnZXQgaXNMb2FkaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aHlDYXNjYWRlclNlcnZpY2U/LmlzTG9hZGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5jb2x1bW5zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWZ0ZXJDaGFuZ2VGbjogKCkgPT4gdm9pZDtcblxuICAgIHByaXZhdGUgcmVzaXplU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICAgICAgICB0aGlzLnNldE1lbnVDbGFzcygpO1xuICAgICAgICB0aGlzLnNldE1lbnVDb2x1bW5DbGFzcygpO1xuICAgICAgICB0aGlzLnNldExhYmVsQ2xhc3MoKTtcbiAgICAgICAgdGhpcy5pbml0UG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy5pbml0U2VhcmNoKCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBsYWJlbFByb3BlcnR5OiB0aGlzLnRoeUxhYmVsUHJvcGVydHksXG4gICAgICAgICAgICB2YWx1ZVByb3BlcnR5OiB0aGlzLnRoeVZhbHVlUHJvcGVydHksXG4gICAgICAgICAgICBpc011bHRpcGxlOiB0aGlzLmlzTXVsdGlwbGUsXG4gICAgICAgICAgICBpc09ubHlTZWxlY3RMZWFmOiB0aGlzLnRoeUlzT25seVNlbGVjdExlYWYsXG4gICAgICAgICAgICBpc0xhYmVsUmVuZGVyVGVtcGxhdGU6IHRoaXMuaXNMYWJlbFJlbmRlclRlbXBsYXRlLFxuICAgICAgICAgICAgbG9hZERhdGE6IHRoaXMudGh5TG9hZERhdGFcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50aHlDYXNjYWRlclNlcnZpY2Uuc2V0Q2FzY2FkZXJPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMudGh5Q2FzY2FkZXJTZXJ2aWNlLmNhc2NhZGVyVmFsdWVDaGFuZ2UoKS5zdWJzY3JpYmUob3B0aW9ucyA9PiB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuaXNWYWx1ZUVxdWFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZUZuKG9wdGlvbnMudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmlzU2VsZWN0aW9uTW9kZWxFbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRoeUNsZWFyLmVtaXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50aHlTZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5zZWxlY3RlZE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMudGh5Q2hhbmdlLmVtaXQob3B0aW9ucy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWZ0ZXJDaGFuZ2VGbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFmdGVyQ2hhbmdlRm4oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZnRlckNoYW5nZUZuID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgICAgICB0aGlzLnRoeUNsaWNrRGlzcGF0Y2hlclxuICAgICAgICAgICAgICAgIC5jbGlja2VkKDApXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMubWVudT8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVudVZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VNZW51KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICBpZiAodGhpcy50aHlBdXRvRXhwYW5kKSB7XG4gICAgICAgICAgICB0aW1lcigwKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0TWVudVZpc2libGUodHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3RoeUlzT25seVNlbGVjdExlYWYnXSkge1xuICAgICAgICAgICAgdGhpcy50aHlDYXNjYWRlclNlcnZpY2Uuc2V0Q2FzY2FkZXJPcHRpb25zKHsgaXNPbmx5U2VsZWN0TGVhZjogY2hhbmdlc1sndGh5SXNPbmx5U2VsZWN0TGVhZiddLmN1cnJlbnRWYWx1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFBvc2l0aW9uKCkge1xuICAgICAgICBjb25zdCBjYXNjYWRlclBvc2l0aW9uOiBDb25uZWN0aW9uUG9zaXRpb25QYWlyW10gPSBFWFBBTkRFRF9EUk9QRE9XTl9QT1NJVElPTlMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBjYXNjYWRlclBvc2l0aW9uO1xuICAgIH1cblxuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLnRoeUNhc2NhZGVyU2VydmljZS53cml0ZUNhc2NhZGVyVmFsdWUodmFsdWUpO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHBvc2l0aW9uQ2hhbmdlKHBvc2l0aW9uOiBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBwb3NpdGlvbi5jb25uZWN0aW9uUGFpci5vcmlnaW5ZID09PSAnYm90dG9tJyA/ICdib3R0b20nIDogJ3RvcCc7XG4gICAgICAgIGlmICh0aGlzLmRyb3BEb3duUG9zaXRpb24gIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmRyb3BEb3duUG9zaXRpb24gPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpc0FjdGl2YXRlZE9wdGlvbihvcHRpb246IFRoeUNhc2NhZGVyT3B0aW9uLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5pc0FjdGl2YXRlZE9wdGlvbihvcHRpb24sIGluZGV4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNIYWxmU2VsZWN0ZWRPcHRpb24ob3B0aW9uOiBUaHlDYXNjYWRlck9wdGlvbiwgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aHlDYXNjYWRlclNlcnZpY2UuaXNIYWxmU2VsZWN0ZWRPcHRpb24ob3B0aW9uLCBpbmRleCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU2VsZWN0ZWRPcHRpb24ob3B0aW9uOiBUaHlDYXNjYWRlck9wdGlvbiwgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50aHlDYXNjYWRlclNlcnZpY2UuaXNTZWxlY3RlZE9wdGlvbihvcHRpb24sIGluZGV4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXR0YWNoZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5jZGtDb25uZWN0ZWRPdmVybGF5LnBvc2l0aW9uQ2hhbmdlLnBpcGUodGFrZSgxKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBY3RpdmVFbGVtZW50SW50b1ZpZXcoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzY3JvbGxBY3RpdmVFbGVtZW50SW50b1ZpZXcoKSB7XG4gICAgICAgIGlmICghaXNFbXB0eSh0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5zZWxlY3RlZE9wdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmVPcHRpb25zID0gdGhpcy5jYXNjYWRlck9wdGlvbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygndGh5LWNhc2NhZGVyLW1lbnUtaXRlbS1hY3RpdmUnKSlcbiAgICAgICAgICAgICAgICAvLyBmb3IgbXVsdGlwbGUgbW9kZVxuICAgICAgICAgICAgICAgIC5zbGljZSgtdGhpcy5jYXNjYWRlck9wdGlvbkNvbnRhaW5lcnMubGVuZ3RoKTtcblxuICAgICAgICAgICAgdGhpcy5jYXNjYWRlck9wdGlvbkNvbnRhaW5lcnMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPD0gYWN0aXZlT3B0aW9ucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIFNjcm9sbFRvU2VydmljZS5zY3JvbGxUb0VsZW1lbnQoYWN0aXZlT3B0aW9uc1tpbmRleF0ubmF0aXZlRWxlbWVudCwgaXRlbS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldE1lbnVWaXNpYmxlKG1lbnVWaXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1lbnVWaXNpYmxlICE9PSBtZW51VmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5tZW51VmlzaWJsZSA9IG1lbnVWaXNpYmxlO1xuXG4gICAgICAgICAgICB0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5pbml0QWN0aXZhdGVkT3B0aW9ucyh0aGlzLm1lbnVWaXNpYmxlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2xhc3NNYXAoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0TWVudUNsYXNzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5tZW51VmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlY3QgPSB0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZVRyaWdnZXJSZXNpemUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZVRyaWdnZXJSZXNpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudGh5RXhwYW5kU3RhdHVzQ2hhbmdlLmVtaXQobWVudVZpc2libGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtZW51Q2xzKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZW51Q2xzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TWVudUNsYXNzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9tZW51Q2xzID0ge1xuICAgICAgICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1tZW51c2BdOiB0cnVlLFxuICAgICAgICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1tZW51cy1oaWRkZW5gXTogIXRoaXMubWVudVZpc2libGUsXG4gICAgICAgICAgICBbYCR7dGhpcy50aHlNZW51Q2xhc3NOYW1lfWBdOiB0aGlzLnRoeU1lbnVDbGFzc05hbWUsXG4gICAgICAgICAgICBbYHctMTAwYF06IHRoaXMuY29sdW1ucy5sZW5ndGggPT09IDBcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1lbnVDb2x1bW5DbHMoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lbnVDb2x1bW5DbHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRNZW51Q29sdW1uQ2xhc3MoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX21lbnVDb2x1bW5DbHMgPSB7XG4gICAgICAgICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LW1lbnVgXTogdHJ1ZSxcbiAgICAgICAgICAgIFtgJHt0aGlzLnRoeUNvbHVtbkNsYXNzTmFtZX1gXTogdGhpcy50aHlDb2x1bW5DbGFzc05hbWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxhYmVsQ2xzKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbENscztcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldExhYmVsQ2xhc3MoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2xhYmVsQ2xzID0ge1xuICAgICAgICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1waWNrZXItbGFiZWxgXTogdHJ1ZSxcbiAgICAgICAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tc2hvdy1zZWFyY2hgXTogZmFsc2UsXG4gICAgICAgICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWZvY3VzZWRgXTogZmFsc2UsXG4gICAgICAgICAgICAndGV4dC10cnVuY2F0ZSc6IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENsYXNzTWFwKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjbGFzc01hcCA9IHtcbiAgICAgICAgICAgIFtgJHt0aGlzLnByZWZpeENsc31gXTogdHJ1ZSxcbiAgICAgICAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tcGlja2VyYF06IHRydWUsXG4gICAgICAgICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LSR7dGhpcy50aHlTaXplfWBdOiB0cnVlLFxuICAgICAgICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1waWNrZXItZGlzYWJsZWRgXTogdGhpcy5kaXNhYmxlZCxcbiAgICAgICAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tcGlja2VyLW9wZW5gXTogdGhpcy5tZW51VmlzaWJsZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhvc3RSZW5kZXJlci51cGRhdGVDbGFzc0J5TWFwKGNsYXNzTWFwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQ2xpY2tUcmlnZ2VyQWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGh5VHJpZ2dlckFjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRoeVRyaWdnZXJBY3Rpb24gPT09ICdjbGljayc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGh5VHJpZ2dlckFjdGlvbi5pbmRleE9mKCdjbGljaycpICE9PSAtMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSG92ZXJUcmlnZ2VyQWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGh5VHJpZ2dlckFjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRoeVRyaWdnZXJBY3Rpb24gPT09ICdob3Zlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGh5VHJpZ2dlckFjdGlvbi5pbmRleE9mKCdob3ZlcicpICE9PSAtMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSG92ZXJFeHBhbmRUcmlnZ2VyQWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGh5RXhwYW5kVHJpZ2dlckFjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRoeUV4cGFuZFRyaWdnZXJBY3Rpb24gPT09ICdob3Zlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGh5RXhwYW5kVHJpZ2dlckFjdGlvbi5pbmRleE9mKCdob3ZlcicpICE9PSAtMTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIHRvZ2dsZUNsaWNrKCRldmVudDogRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0NsaWNrVHJpZ2dlckFjdGlvbigpKSB7XG4gICAgICAgICAgICB0aGlzLnNldE1lbnVWaXNpYmxlKCF0aGlzLm1lbnVWaXNpYmxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyB0b2dnbGVNb3VzZUVudGVyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICF0aGlzLmlzSG92ZXJUcmlnZ2VyQWN0aW9uKCkgfHwgdGhpcy5tZW51VmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRNZW51VmlzaWJsZSh0cnVlKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgdG9nZ2xlTW91c2VMZWF2ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5pc0hvdmVyVHJpZ2dlckFjdGlvbigpIHx8ICF0aGlzLm1lbnVWaXNpYmxlKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaG9zdEVsID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IG1vdXNlVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgaG9zdEVsLmNvbnRhaW5zKG1vdXNlVGFyZ2V0KSB8fFxuICAgICAgICAgICAgbW91c2VUYXJnZXQ/LmNsYXNzTGlzdC5jb250YWlucygnY2RrLW92ZXJsYXktcGFuZScpIHx8XG4gICAgICAgICAgICBtb3VzZVRhcmdldD8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjZGstb3ZlcmxheS1iYWNrZHJvcCcpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRNZW51VmlzaWJsZShmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrQ3VzdG9tT3B0aW9uKG9wdGlvbjogVGh5Q2FzY2FkZXJPcHRpb24sIGluZGV4OiBudW1iZXIsIGV2ZW50OiBFdmVudCB8IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGh5Q2FzY2FkZXJTZXJ2aWNlLmNsaWNrT3B0aW9uKG9wdGlvbiwgaW5kZXgsIGV2ZW50LCB0aGlzLnNlbGVjdE9wdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrT3B0aW9uKG9wdGlvbjogVGh5Q2FzY2FkZXJPcHRpb24sIGluZGV4OiBudW1iZXIsIGV2ZW50OiBFdmVudCB8IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy50aHlDYXNjYWRlclNlcnZpY2UucmVtb3ZlQ3VzdG9tT3B0aW9uKCk7XG4gICAgICAgIHRoaXMudGh5Q2FzY2FkZXJTZXJ2aWNlLmNsaWNrT3B0aW9uKG9wdGlvbiwgaW5kZXgsIGV2ZW50LCB0aGlzLnNlbGVjdE9wdGlvbik7XG5cbiAgICAgICAgaWYgKHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheSAmJiB0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXkub3ZlcmxheVJlZikge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIGNhbGN1bGF0ZSBhbmQgdXBkYXRlIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgc3VibWVudSBpcyBvcGVuZWRcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwb3NpdGlvbiB0byBwcmV2ZW50IHRoZSBzdWJtZW51IGZyb20gYXBwZWFyaW5nIG9mZi1zY3JlZW5cbiAgICAgICAgICAgIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheS5vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBtb3VzZW92ZXJPcHRpb24ob3B0aW9uOiBUaHlDYXNjYWRlck9wdGlvbiwgaW5kZXg6IG51bWJlciwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb24gJiYgb3B0aW9uLmRpc2FibGVkICYmICF0aGlzLmlzTXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pc0hvdmVyRXhwYW5kVHJpZ2dlckFjdGlvbigpICYmICEob3B0aW9uICYmIG9wdGlvbi5kaXNhYmxlZCAmJiB0aGlzLmlzTXVsdGlwbGUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRBY3RpdmVPcHRpb24ob3B0aW9uLCBpbmRleCwgZmFsc2UpO1xuICAgIH1cblxuICAgIG9uQmx1cihldmVudD86IEZvY3VzRXZlbnQpIHtcbiAgICAgICAgLy8gVGFiIOiBmueEpuWQjuiHquWKqOiBmueEpuWIsCBpbnB1dCDovpPlhaXmoYbvvIzmraTliIbmlK/kuIvnm7TmjqXov5Tlm57vvIzml6DpnIDop6blj5Egb25Ub3VjaGVkRm5cbiAgICAgICAgaWYgKGVsZW1lbnRNYXRjaENsb3Nlc3QoZXZlbnQ/LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQsIFsnLnRoeS1jYXNjYWRlci1tZW51cycsICd0aHktY2FzY2FkZXInXSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uVG91Y2hlZEZuKCk7XG4gICAgfVxuXG4gICAgb25Gb2N1cyhldmVudD86IEZvY3VzRXZlbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50TWF0Y2hDbG9zZXN0KGV2ZW50Py5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50LCBbJy50aHktY2FzY2FkZXItbWVudXMnLCAndGh5LWNhc2NhZGVyJ10pKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dEVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgICAgICAgICAgaW5wdXRFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2VNZW51KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tZW51VmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRNZW51VmlzaWJsZShmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLm9uVG91Y2hlZEZuKCk7XG4gICAgICAgICAgICB0aGlzLmlzU2hvd1NlYXJjaFBhbmVsID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5zZWFyY2hSZXN1bHRMaXN0ID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QWN0aXZlT3B0aW9uKG9wdGlvbjogVGh5Q2FzY2FkZXJPcHRpb24sIGluZGV4OiBudW1iZXIsIHNlbGVjdDogYm9vbGVhbiwgbG9hZENoaWxkcmVuOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5zZXRBY3RpdmVPcHRpb24ob3B0aW9uLCBpbmRleCwgc2VsZWN0LCBsb2FkQ2hpbGRyZW4sIHRoaXMuc2VsZWN0T3B0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdE9wdGlvbiA9IChvcHRpb246IFRoeUNhc2NhZGVyT3B0aW9uLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICgob3B0aW9uLmlzTGVhZiB8fCAhdGhpcy50aHlJc09ubHlTZWxlY3RMZWFmKSAmJiAhdGhpcy50aHlNdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5hZnRlckNoYW5nZUZuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0TWVudVZpc2libGUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkRm4oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aHlTZWxlY3QuZW1pdCh7IG9wdGlvbiwgaW5kZXggfSk7XG4gICAgICAgIGNvbnN0IGlzT3B0aW9uQ2FuU2VsZWN0ID0gdGhpcy50aHlDaGFuZ2VPblNlbGVjdCAmJiAhdGhpcy5pc011bHRpcGxlO1xuICAgICAgICBpZiAob3B0aW9uLmlzTGVhZiB8fCAhdGhpcy50aHlJc09ubHlTZWxlY3RMZWFmIHx8IGlzT3B0aW9uQ2FuU2VsZWN0IHx8IHRoaXMuc2hvdWxkUGVyZm9ybVNlbGVjdGlvbihvcHRpb24sIGluZGV4KSkge1xuICAgICAgICAgICAgdGhpcy50aHlDYXNjYWRlclNlcnZpY2Uuc2VsZWN0T3B0aW9uKG9wdGlvbiwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyByZW1vdmVTZWxlY3RlZEl0ZW0oZXZlbnQ6IHsgaXRlbTogU2VsZWN0T3B0aW9uQmFzZTsgJGV2ZW50T3JpZ2luOiBFdmVudCB9KSB7XG4gICAgICAgIGV2ZW50LiRldmVudE9yaWdpbi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy50aHlDYXNjYWRlclNlcnZpY2UucmVtb3ZlU2VsZWN0ZWRJdGVtKGV2ZW50Py5pdGVtKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3VsZFBlcmZvcm1TZWxlY3Rpb24ob3B0aW9uOiBUaHlDYXNjYWRlck9wdGlvbiwgbGV2ZWw6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudGh5Q2hhbmdlT24gPT09ICdmdW5jdGlvbicgPyB0aGlzLnRoeUNoYW5nZU9uKG9wdGlvbiwgbGV2ZWwpID09PSB0cnVlIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCRldmVudCkge1xuICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZnRlckNoYW5nZUZuID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRNZW51VmlzaWJsZShmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudGh5Q2FzY2FkZXJTZXJ2aWNlLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYWNrQnlGbihpbmRleDogbnVtYmVyLCBpdGVtOiBUaHlDYXNjYWRlck9wdGlvbikge1xuICAgICAgICByZXR1cm4gaXRlbT8udmFsdWUgfHwgaXRlbT8uX2lkIHx8IGluZGV4O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWFyY2hGaWx0ZXIoc2VhcmNoVGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghc2VhcmNoVGV4dCAmJiAhdGhpcy5pc1NlbGVjdGluZ1NlYXJjaFN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U2VhcmNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0JC5uZXh0KHNlYXJjaFRleHQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFNlYXJjaCgpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0JFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgIERlYm91bmNlVGltZVdyYXBwZXIuZGVib3VuY2VUaW1lKDIwMCksXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIodGV4dCA9PiB0ZXh0ICE9PSAnJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoc2VhcmNoVGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldFNlYXJjaCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gbG9jYWwgc2VhcmNoXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hJbkxvY2FsKHNlYXJjaFRleHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNTaG93U2VhcmNoUGFuZWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWFyY2hJbkxvY2FsKHNlYXJjaFRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnRoeUNhc2NhZGVyU2VydmljZS5zZWFyY2hJbkxvY2FsKHNlYXJjaFRleHQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRTZWFyY2goKSB7XG4gICAgICAgIHRoaXMuaXNTaG93U2VhcmNoUGFuZWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50aHlDYXNjYWRlclNlcnZpY2UucmVzZXRTZWFyY2goKTtcbiAgICAgICAgdGhpcy5zY3JvbGxBY3RpdmVFbGVtZW50SW50b1ZpZXcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0U2VhcmNoUmVzdWx0KHNlbGVjdE9wdGlvbkRhdGE6IFRoeUNhc2NhZGVyU2VhcmNoT3B0aW9uKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgdGh5Um93VmFsdWU6IHNlbGVjdGVkT3B0aW9ucyB9ID0gc2VsZWN0T3B0aW9uRGF0YTtcbiAgICAgICAgaWYgKHNlbGVjdE9wdGlvbkRhdGEuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc011bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZWxlY3RlZE9wdGlvbnMuZm9yRWFjaCgoaXRlbTogVGh5Q2FzY2FkZXJPcHRpb24sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlT3B0aW9uKGl0ZW0sIGluZGV4LCBpbmRleCA9PT0gc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCAtIDEpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5pc1NlbGVjdGluZ1NlYXJjaFN0YXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHNlbGVjdE9wdGlvbkRhdGEuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luU2VhcmNoUmVzdWx0TGlzdCA9IHRoaXMuc2VhcmNoUmVzdWx0TGlzdDtcbiAgICAgICAgICAgIC8vIOS/neaMgeaQnOe0oumAiemhuVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1Nob3dTZWFyY2hQYW5lbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy50aHlDYXNjYWRlclNlcnZpY2Uuc2VhcmNoUmVzdWx0TGlzdCA9IG9yaWdpblNlYXJjaFJlc3VsdExpc3Q7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NlbGVjdGluZ1NlYXJjaFN0YXRlID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRTZWFyY2goKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3Vic2NyaWJlVHJpZ2dlclJlc2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZVRyaWdnZXJSZXNpemUoKTtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVTdWJzY3JpcHRpb24gPSBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzaXplID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzOiBSZXNpemVPYnNlcnZlckVudHJ5W10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlc2l6ZS5vYnNlcnZlKHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIH0pLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyUmVjdCA9IHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jZGtDb25uZWN0ZWRPdmVybGF5ICYmIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheS5vdmVybGF5UmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXkub3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdW5zdWJzY3JpYmVUcmlnZ2VyUmVzaXplKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZXNpemVTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZVRyaWdnZXJSZXNpemUoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNka092ZXJsYXlPcmlnaW4gI29yaWdpbj1cImNka092ZXJsYXlPcmlnaW5cIiAjdHJpZ2dlcj5cbiAgQGlmICh0aHlTaG93SW5wdXQpIHtcbiAgICA8ZGl2XG4gICAgICB0aHlTZWxlY3RDb250cm9sXG4gICAgICBbdGh5U2hvd1NlYXJjaF09XCJ0aHlTaG93U2VhcmNoXCJcbiAgICAgIFt0aHlTaXplXT1cInRoeVNpemVcIlxuICAgICAgW3RoeUFsbG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICBbdGh5U2VsZWN0ZWRPcHRpb25zXT1cInNlbGVjdGVkXCJcbiAgICAgIFt0aHlNYXhUYWdDb3VudF09XCJ0aHlNYXhUYWdDb3VudFwiXG4gICAgICAodGh5T25SZW1vdmUpPVwicmVtb3ZlU2VsZWN0ZWRJdGVtKCRldmVudClcIlxuICAgICAgKHRoeU9uQ2xlYXIpPVwiY2xlYXJTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAodGh5T25CbHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcbiAgICAgICh0aHlPblNlYXJjaCk9XCJzZWFyY2hGaWx0ZXIoJGV2ZW50KVwiXG4gICAgICBbdGh5RGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW3RoeUlzTXVsdGlwbGVdPVwidGh5TXVsdGlwbGVcIlxuICAgICAgW3RoeVBhbmVsT3BlbmVkXT1cIm1lbnVWaXNpYmxlXCJcbiAgICAgIFt0aHlQbGFjZWhvbGRlcl09XCJ0aHlQbGFjZWhvbGRlclwiXG4gICAgICBbY3VzdG9tRGlzcGxheVRlbXBsYXRlXT1cImN1c3RvbURpc3BsYXlUZW1wbGF0ZVwiXG4gICAgICBbdGh5UHJlc2V0XT1cInRoeVByZXNldFwiPlxuICAgICAgPG5nLXRlbXBsYXRlICNjdXN0b21EaXNwbGF5VGVtcGxhdGUgbGV0LXZhbHVlPlxuICAgICAgICBAaWYgKCFpc0xhYmVsUmVuZGVyVGVtcGxhdGUpIHtcbiAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJsYWJlbENsc1wiPnt7IHZhbHVlLmxhYmVsVGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwibGFiZWxDbHNcIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aHlMYWJlbFJlbmRlclwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ2YWx1ZS5sYWJlbFJlbmRlckNvbnRleHRcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BdPVwidGh5SGFzQmFja2Ryb3BcIlxuICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cInRoeS1jYXNjYWRlci1iYWNrZHJvcFwiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cIm9yaWdpblwiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zXT1cInBvc2l0aW9uc1wiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGhdPVwibWVudU1pbldpZHRoXCJcbiAgY2RrQ29ubmVjdGVkT3ZlcmxheVRyYW5zZm9ybU9yaWdpbk9uPVwiLnRoeS1jYXNjYWRlci1tZW51c1wiXG4gIChiYWNrZHJvcENsaWNrKT1cImNsb3NlTWVudSgpXCJcbiAgKGRldGFjaCk9XCJjbG9zZU1lbnUoKVwiXG4gIChhdHRhY2gpPVwiYXR0YWNoZWQoKVwiXG4gIChwb3NpdGlvbkNoYW5nZSk9XCJwb3NpdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cIm1lbnVWaXNpYmxlXCI+XG4gIDxkaXZcbiAgICBbYXR0ci50YWJpbmRleF09XCItMVwiXG4gICAgI21lbnVcbiAgICBbbmdDbGFzc109XCJtZW51Q2xzXCJcbiAgICBbbmdTdHlsZV09XCJ0aHlNZW51U3R5bGVcIlxuICAgIChtb3VzZWxlYXZlKT1cInRvZ2dsZU1vdXNlTGVhdmUoJGV2ZW50KVwiXG4gICAgW0BzY2FsZVlNb3Rpb25dPVwiJ2VudGVyJ1wiPlxuICAgIEBpZiAoIWlzU2hvd1NlYXJjaFBhbmVsKSB7XG4gICAgICBAaWYgKGNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBAZm9yIChvcHRpb25zIG9mIGNvbHVtbnM7IHRyYWNrICRpbmRleDsgbGV0IGkgPSAkaW5kZXg7IGxldCBpc0ZpcnN0ID0gJGZpcnN0KSB7XG4gICAgICAgICAgPHVsICNjYXNjYWRlck9wdGlvbkNvbnRhaW5lcnMgW25nQ2xhc3NdPVwibWVudUNvbHVtbkNsc1wiPlxuICAgICAgICAgICAgQGlmICh0aHlDdXN0b21PcHRpb25zICYmIHRoeUN1c3RvbU9wdGlvbnMubGVuZ3RoID4gMCAmJiBpc0ZpcnN0KSB7XG4gICAgICAgICAgICAgIEBmb3IgKGN1c3RvbU9wdCBvZiB0aHlDdXN0b21PcHRpb25zOyB0cmFjayB0cmFja0J5Rm4oJGluZGV4LCBjdXN0b21PcHQpKSB7XG4gICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAjY2FzY2FkZXJPcHRpb25zXG4gICAgICAgICAgICAgICAgICB0aHktY2FzY2FkZXItb3B0aW9uXG4gICAgICAgICAgICAgICAgICBbb3B0aW9uXT1cImN1c3RvbU9wdFwiXG4gICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwidGh5TXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgICAgW2lzT25seVNlbGVjdExlYWZdPVwidGh5SXNPbmx5U2VsZWN0TGVhZlwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxQcm9wZXJ0eV09XCJ0aHlMYWJlbFByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiaXNBY3RpdmF0ZWRPcHRpb24oY3VzdG9tT3B0LCAwKVwiXG4gICAgICAgICAgICAgICAgICBbaGFsZlNlbGVjdGVkXT1cImlzSGFsZlNlbGVjdGVkT3B0aW9uKGN1c3RvbU9wdCwgMClcIlxuICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImlzU2VsZWN0ZWRPcHRpb24oY3VzdG9tT3B0LCAwKVwiXG4gICAgICAgICAgICAgICAgICAodG9nZ2xlU2VsZWN0Q2hhbmdlKT1cImNsaWNrQ3VzdG9tT3B0aW9uKGN1c3RvbU9wdCwgMCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tDdXN0b21PcHRpb24oY3VzdG9tT3B0LCAwLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwibW91c2VvdmVyT3B0aW9uKGN1c3RvbU9wdCwgMCwgJGV2ZW50KVwiPjwvbGk+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPHRoeS1kaXZpZGVyIGNsYXNzPVwibXktMSBteC00XCI+PC90aHktZGl2aWRlcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBvcHRpb25zOyB0cmFjayB0cmFja0J5Rm4oJGluZGV4LCBvcHRpb24pKSB7XG4gICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICNjYXNjYWRlck9wdGlvbnNcbiAgICAgICAgICAgICAgICB0aHktY2FzY2FkZXItb3B0aW9uXG4gICAgICAgICAgICAgICAgW29wdGlvbl09XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0aHlNdWx0aXBsZVwiXG4gICAgICAgICAgICAgICAgW2lzT25seVNlbGVjdExlYWZdPVwidGh5SXNPbmx5U2VsZWN0TGVhZlwiXG4gICAgICAgICAgICAgICAgW2xhYmVsUHJvcGVydHldPVwidGh5TGFiZWxQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJpc0FjdGl2YXRlZE9wdGlvbihvcHRpb24sIGkpXCJcbiAgICAgICAgICAgICAgICBbaGFsZlNlbGVjdGVkXT1cImlzSGFsZlNlbGVjdGVkT3B0aW9uKG9wdGlvbiwgaSlcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJpc1NlbGVjdGVkT3B0aW9uKG9wdGlvbiwgaSlcIlxuICAgICAgICAgICAgICAgIFtvcHRpb25SZW5kZXJdPVwidGh5T3B0aW9uUmVuZGVyXCJcbiAgICAgICAgICAgICAgICAodG9nZ2xlU2VsZWN0Q2hhbmdlKT1cImNsaWNrT3B0aW9uKG9wdGlvbiwgaSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrT3B0aW9uKG9wdGlvbiwgaSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJtb3VzZW92ZXJPcHRpb24ob3B0aW9uLCBpLCAkZXZlbnQpXCI+PC9saT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICB9XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInRoeS1jYXNjYWRlci1lbXB0eS1jb250YWluZXJcIiBbbmdTdHlsZV09XCJ7ICd3aWR0aC5weCc6IHRyaWdnZXJSZWN0Py53aWR0aCB9XCI+XG4gICAgICAgICAgPHRoeS1lbXB0eSBjbGFzcz1cInRoeS1zZWxlY3QtZW1wdHktY29udGVudFwiIHRoeVNpemU9XCJzbVwiIFt0aHlNZXNzYWdlXT1cImVtcHR5U3RhdGVUZXh0XCIgW3RoeUljb25OYW1lXT1cImVtcHR5SWNvbigpXCI+PC90aHktZW1wdHk+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgICBAaWYgKGlzU2hvd1NlYXJjaFBhbmVsKSB7XG4gICAgICBAaWYgKHNlYXJjaFJlc3VsdExpc3QubGVuZ3RoKSB7XG4gICAgICAgIDx1bCBjbGFzcz1cInRoeS1jYXNjYWRlci1zZWFyY2gtbGlzdCBweS0zXCIgW25nU3R5bGVdPVwidGh5U2VhcmNoTGlzdFN0eWxlXCI+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBzZWFyY2hSZXN1bHRMaXN0OyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICB0aHktY2FzY2FkZXItc2VhcmNoLW9wdGlvblxuICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwidGh5TXVsdGlwbGVcIlxuICAgICAgICAgICAgICBbaXNPbmx5U2VsZWN0TGVhZl09XCJ0aHlJc09ubHlTZWxlY3RMZWFmXCJcbiAgICAgICAgICAgICAgW29wdGlvbl09XCJpdGVtXCJcbiAgICAgICAgICAgICAgW2FjdGl2ZV09XCJpdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgW29wdGlvblJlbmRlcl09XCJ0aHlPcHRpb25SZW5kZXJcIlxuICAgICAgICAgICAgICAodG9nZ2xlU2VsZWN0Q2hhbmdlKT1cInNlbGVjdFNlYXJjaFJlc3VsdCgkZXZlbnQpXCI+PC9saT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdWw+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInRoeS1jYXNjYWRlci1lbXB0eS1jb250YWluZXJcIiBbbmdTdHlsZV09XCJ7ICd3aWR0aC5weCc6IHRyaWdnZXJSZWN0Py53aWR0aCB9XCI+XG4gICAgICAgICAgPHRoeS1lbXB0eSBjbGFzcz1cInRoeS1zZWxlY3QtZW1wdHktY29udGVudFwiIHRoeVNpemU9XCJzbVwiIFt0aHlNZXNzYWdlXT1cImVtcHR5U3RhdGVUZXh0XCIgW3RoeUljb25OYW1lXT1cImVtcHR5SWNvbigpXCI+PC90aHktZW1wdHk+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19