@coreui/angular-pro 5.2.25 → 5.3.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 (392) hide show
  1. package/README.md +5 -5
  2. package/fesm2022/coreui-angular-pro.mjs +1064 -1163
  3. package/fesm2022/coreui-angular-pro.mjs.map +1 -1
  4. package/lib/grid/col.directive.d.ts +26 -26
  5. package/lib/smart-table/smart-table-head/smart-table-head.component.d.ts +2 -2
  6. package/lib/tabs-2/tab/tab.directive.d.ts +4 -3
  7. package/lib/tabs-2/tabs-list/tabs-list.component.d.ts +1 -1
  8. package/package.json +9 -11
  9. package/esm2022/coreui-angular-pro.mjs +0 -5
  10. package/esm2022/lib/accordion/accordion/accordion.component.mjs +0 -34
  11. package/esm2022/lib/accordion/accordion-button/accordion-button.directive.mjs +0 -35
  12. package/esm2022/lib/accordion/accordion-item/accordion-item.component.mjs +0 -59
  13. package/esm2022/lib/accordion/accordion.module.mjs +0 -36
  14. package/esm2022/lib/accordion/accordion.service.mjs +0 -36
  15. package/esm2022/lib/accordion/index.mjs +0 -2
  16. package/esm2022/lib/accordion/public_api.mjs +0 -5
  17. package/esm2022/lib/alert/alert-heading.directive.mjs +0 -15
  18. package/esm2022/lib/alert/alert-link.directive.mjs +0 -15
  19. package/esm2022/lib/alert/alert.component.mjs +0 -173
  20. package/esm2022/lib/alert/alert.module.mjs +0 -30
  21. package/esm2022/lib/alert/index.mjs +0 -2
  22. package/esm2022/lib/alert/public_api.mjs +0 -5
  23. package/esm2022/lib/avatar/avatar.component.mjs +0 -71
  24. package/esm2022/lib/avatar/avatar.module.mjs +0 -20
  25. package/esm2022/lib/avatar/index.mjs +0 -2
  26. package/esm2022/lib/avatar/public_api.mjs +0 -3
  27. package/esm2022/lib/backdrop/backdrop.service.mjs +0 -82
  28. package/esm2022/lib/backdrop/index.mjs +0 -2
  29. package/esm2022/lib/backdrop/public_api.mjs +0 -2
  30. package/esm2022/lib/badge/badge.component.mjs +0 -77
  31. package/esm2022/lib/badge/badge.module.mjs +0 -20
  32. package/esm2022/lib/badge/index.mjs +0 -2
  33. package/esm2022/lib/badge/public_api.mjs +0 -3
  34. package/esm2022/lib/breadcrumb/breadcrumb/breadcrumb.component.mjs +0 -40
  35. package/esm2022/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.mjs +0 -39
  36. package/esm2022/lib/breadcrumb/breadcrumb-item/breadcrumb-item.mjs +0 -2
  37. package/esm2022/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.mjs +0 -41
  38. package/esm2022/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.mjs +0 -52
  39. package/esm2022/lib/breadcrumb/breadcrumb.module.mjs +0 -34
  40. package/esm2022/lib/breadcrumb/index.mjs +0 -2
  41. package/esm2022/lib/breadcrumb/public_api.mjs +0 -6
  42. package/esm2022/lib/button/button-close.directive.mjs +0 -46
  43. package/esm2022/lib/button/button.directive.mjs +0 -88
  44. package/esm2022/lib/button/button.module.mjs +0 -25
  45. package/esm2022/lib/button/index.mjs +0 -2
  46. package/esm2022/lib/button/public_api.mjs +0 -4
  47. package/esm2022/lib/button-group/button-group/button-group.component.mjs +0 -41
  48. package/esm2022/lib/button-group/button-group.module.mjs +0 -17
  49. package/esm2022/lib/button-group/button-toolbar/button-toolbar.component.mjs +0 -24
  50. package/esm2022/lib/button-group/index.mjs +0 -2
  51. package/esm2022/lib/button-group/public_api.mjs +0 -4
  52. package/esm2022/lib/calendar/calendar/calendar-class-view.pipe.mjs +0 -20
  53. package/esm2022/lib/calendar/calendar/calendar.component.mjs +0 -380
  54. package/esm2022/lib/calendar/calendar-month/calendar-class-day.pipe.mjs +0 -30
  55. package/esm2022/lib/calendar/calendar-month/calendar-class-month.pipe.mjs +0 -24
  56. package/esm2022/lib/calendar/calendar-month/calendar-class-row.pipe.mjs +0 -24
  57. package/esm2022/lib/calendar/calendar-month/calendar-class-year.pipe.mjs +0 -22
  58. package/esm2022/lib/calendar/calendar-month/calendar-day-title.pipe.mjs +0 -17
  59. package/esm2022/lib/calendar/calendar-month/calendar-day.directive.mjs +0 -138
  60. package/esm2022/lib/calendar/calendar-month/calendar-day.pipe.mjs +0 -19
  61. package/esm2022/lib/calendar/calendar-month/calendar-month.component.mjs +0 -448
  62. package/esm2022/lib/calendar/calendar-month/calendar-row.directive.mjs +0 -123
  63. package/esm2022/lib/calendar/calendar-month/calendar-weekday.pipe.mjs +0 -21
  64. package/esm2022/lib/calendar/calendar-navigation/calendar-navigation.component.mjs +0 -87
  65. package/esm2022/lib/calendar/calendar.module.mjs +0 -57
  66. package/esm2022/lib/calendar/calendar.service.mjs +0 -66
  67. package/esm2022/lib/calendar/calendar.utils.mjs +0 -393
  68. package/esm2022/lib/calendar/index.mjs +0 -2
  69. package/esm2022/lib/calendar/public_api.mjs +0 -5
  70. package/esm2022/lib/callout/callout.component.mjs +0 -25
  71. package/esm2022/lib/callout/callout.module.mjs +0 -16
  72. package/esm2022/lib/callout/index.mjs +0 -2
  73. package/esm2022/lib/callout/public_api.mjs +0 -3
  74. package/esm2022/lib/card/card-body.component.mjs +0 -16
  75. package/esm2022/lib/card/card-footer.component.mjs +0 -16
  76. package/esm2022/lib/card/card-group.component.mjs +0 -16
  77. package/esm2022/lib/card/card-header-actions.component.mjs +0 -16
  78. package/esm2022/lib/card/card-header.component.mjs +0 -16
  79. package/esm2022/lib/card/card-img-overlay/card-img-overlay.component.mjs +0 -11
  80. package/esm2022/lib/card/card-img.directive.mjs +0 -32
  81. package/esm2022/lib/card/card-link.directive.mjs +0 -15
  82. package/esm2022/lib/card/card-subtitle.directive.mjs +0 -15
  83. package/esm2022/lib/card/card-text.directive.mjs +0 -15
  84. package/esm2022/lib/card/card-title.directive.mjs +0 -15
  85. package/esm2022/lib/card/card.component.mjs +0 -50
  86. package/esm2022/lib/card/card.module.mjs +0 -75
  87. package/esm2022/lib/card/index.mjs +0 -2
  88. package/esm2022/lib/card/public_api.mjs +0 -14
  89. package/esm2022/lib/carousel/carousel/carousel.component.mjs +0 -212
  90. package/esm2022/lib/carousel/carousel-caption/carousel-caption.component.mjs +0 -17
  91. package/esm2022/lib/carousel/carousel-control/carousel-control.component.mjs +0 -82
  92. package/esm2022/lib/carousel/carousel-indicators/carousel-indicators.component.mjs +0 -44
  93. package/esm2022/lib/carousel/carousel-inner/carousel-inner.component.mjs +0 -47
  94. package/esm2022/lib/carousel/carousel-item/carousel-item.component.mjs +0 -67
  95. package/esm2022/lib/carousel/carousel-state.mjs +0 -77
  96. package/esm2022/lib/carousel/carousel-state.type.mjs +0 -2
  97. package/esm2022/lib/carousel/carousel.animation.mjs +0 -70
  98. package/esm2022/lib/carousel/carousel.config.mjs +0 -22
  99. package/esm2022/lib/carousel/carousel.module.mjs +0 -52
  100. package/esm2022/lib/carousel/carousel.service.mjs +0 -18
  101. package/esm2022/lib/carousel/index.mjs +0 -2
  102. package/esm2022/lib/carousel/public_api.mjs +0 -9
  103. package/esm2022/lib/collapse/collapse.animations.mjs +0 -9
  104. package/esm2022/lib/collapse/collapse.directive.mjs +0 -145
  105. package/esm2022/lib/collapse/collapse.module.mjs +0 -19
  106. package/esm2022/lib/collapse/index.mjs +0 -2
  107. package/esm2022/lib/collapse/public_api.mjs +0 -3
  108. package/esm2022/lib/coreui.types.mjs +0 -10
  109. package/esm2022/lib/date-picker/date-picker.component.mjs +0 -80
  110. package/esm2022/lib/date-picker/date-picker.module.mjs +0 -16
  111. package/esm2022/lib/date-picker/index.mjs +0 -2
  112. package/esm2022/lib/date-picker/public_api.mjs +0 -3
  113. package/esm2022/lib/date-range-picker/date-range-picker/custom-range-key.pipe.mjs +0 -17
  114. package/esm2022/lib/date-range-picker/date-range-picker/date-range-picker.component.mjs +0 -599
  115. package/esm2022/lib/date-range-picker/date-range-picker.module.mjs +0 -16
  116. package/esm2022/lib/date-range-picker/index.mjs +0 -2
  117. package/esm2022/lib/date-range-picker/public_api.mjs +0 -3
  118. package/esm2022/lib/dropdown/dropdown/dropdown.component.mjs +0 -371
  119. package/esm2022/lib/dropdown/dropdown-close/dropdown-close.directive.mjs +0 -73
  120. package/esm2022/lib/dropdown/dropdown-divider/dropdown-divider.directive.mjs +0 -15
  121. package/esm2022/lib/dropdown/dropdown-header/dropdown-header.directive.mjs +0 -15
  122. package/esm2022/lib/dropdown/dropdown-item/dropdown-item-plain.directive.mjs +0 -15
  123. package/esm2022/lib/dropdown/dropdown-item/dropdown-item.directive.mjs +0 -96
  124. package/esm2022/lib/dropdown/dropdown-menu/dropdown-menu.directive.mjs +0 -119
  125. package/esm2022/lib/dropdown/dropdown.module.mjs +0 -56
  126. package/esm2022/lib/dropdown/dropdown.service.mjs +0 -18
  127. package/esm2022/lib/dropdown/index.mjs +0 -2
  128. package/esm2022/lib/dropdown/public_api.mjs +0 -10
  129. package/esm2022/lib/element-cover/element-cover.component.mjs +0 -79
  130. package/esm2022/lib/element-cover/element-cover.module.mjs +0 -16
  131. package/esm2022/lib/element-cover/index.mjs +0 -2
  132. package/esm2022/lib/element-cover/public_api.mjs +0 -3
  133. package/esm2022/lib/footer/footer.component.mjs +0 -39
  134. package/esm2022/lib/footer/footer.module.mjs +0 -16
  135. package/esm2022/lib/footer/index.mjs +0 -2
  136. package/esm2022/lib/footer/public_api.mjs +0 -3
  137. package/esm2022/lib/form/form/form.directive.mjs +0 -33
  138. package/esm2022/lib/form/form-check/form-check-input.directive.mjs +0 -78
  139. package/esm2022/lib/form/form-check/form-check-label.directive.mjs +0 -15
  140. package/esm2022/lib/form/form-check/form-check.component.mjs +0 -77
  141. package/esm2022/lib/form/form-control/form-control.directive.mjs +0 -66
  142. package/esm2022/lib/form/form-feedback/form-feedback.component.mjs +0 -38
  143. package/esm2022/lib/form/form-floating/form-floating.directive.mjs +0 -32
  144. package/esm2022/lib/form/form-label/form-label.directive.mjs +0 -41
  145. package/esm2022/lib/form/form-select/form-select.directive.mjs +0 -36
  146. package/esm2022/lib/form/form-text/form-text.directive.mjs +0 -15
  147. package/esm2022/lib/form/form.module.mjs +0 -75
  148. package/esm2022/lib/form/index.mjs +0 -2
  149. package/esm2022/lib/form/input-group/input-group.component.mjs +0 -29
  150. package/esm2022/lib/form/input-group-text/input-group-text.directive.mjs +0 -15
  151. package/esm2022/lib/form/public_api.mjs +0 -14
  152. package/esm2022/lib/grid/col.component.mjs +0 -12
  153. package/esm2022/lib/grid/col.directive.mjs +0 -157
  154. package/esm2022/lib/grid/col.type.mjs +0 -2
  155. package/esm2022/lib/grid/container.component.mjs +0 -33
  156. package/esm2022/lib/grid/container.type.mjs +0 -2
  157. package/esm2022/lib/grid/grid.module.mjs +0 -45
  158. package/esm2022/lib/grid/gutter.directive.mjs +0 -57
  159. package/esm2022/lib/grid/gutter.type.mjs +0 -2
  160. package/esm2022/lib/grid/index.mjs +0 -2
  161. package/esm2022/lib/grid/public_api.mjs +0 -8
  162. package/esm2022/lib/grid/row.component.mjs +0 -16
  163. package/esm2022/lib/grid/row.directive.mjs +0 -47
  164. package/esm2022/lib/grid/row.type.mjs +0 -2
  165. package/esm2022/lib/header/header/header.component.mjs +0 -45
  166. package/esm2022/lib/header/header-brand/header-brand.component.mjs +0 -32
  167. package/esm2022/lib/header/header-divider/header-divider.component.mjs +0 -21
  168. package/esm2022/lib/header/header-nav/header-nav.component.mjs +0 -28
  169. package/esm2022/lib/header/header-text/header-text.component.mjs +0 -21
  170. package/esm2022/lib/header/header-toggler/header-toggler.directive.mjs +0 -55
  171. package/esm2022/lib/header/header.module.mjs +0 -45
  172. package/esm2022/lib/header/index.mjs +0 -2
  173. package/esm2022/lib/header/public_api.mjs +0 -8
  174. package/esm2022/lib/image/img.directive.mjs +0 -58
  175. package/esm2022/lib/image/img.module.mjs +0 -16
  176. package/esm2022/lib/image/index.mjs +0 -2
  177. package/esm2022/lib/image/public_api.mjs +0 -3
  178. package/esm2022/lib/list-group/index.mjs +0 -2
  179. package/esm2022/lib/list-group/list-group-item.directive.mjs +0 -63
  180. package/esm2022/lib/list-group/list-group.directive.mjs +0 -38
  181. package/esm2022/lib/list-group/list-group.module.mjs +0 -17
  182. package/esm2022/lib/list-group/public_api.mjs +0 -4
  183. package/esm2022/lib/loading-button/index.mjs +0 -2
  184. package/esm2022/lib/loading-button/loading-button.animations.mjs +0 -26
  185. package/esm2022/lib/loading-button/loading-button.component.mjs +0 -65
  186. package/esm2022/lib/loading-button/loading-button.module.mjs +0 -16
  187. package/esm2022/lib/loading-button/public_api.mjs +0 -3
  188. package/esm2022/lib/modal/index.mjs +0 -2
  189. package/esm2022/lib/modal/modal/modal.component.mjs +0 -334
  190. package/esm2022/lib/modal/modal-body/modal-body.component.mjs +0 -11
  191. package/esm2022/lib/modal/modal-content/modal-content.component.mjs +0 -16
  192. package/esm2022/lib/modal/modal-dialog/modal-dialog.component.mjs +0 -32
  193. package/esm2022/lib/modal/modal-dismiss/modal-toggle.directive.mjs +0 -28
  194. package/esm2022/lib/modal/modal-footer/modal-footer.component.mjs +0 -16
  195. package/esm2022/lib/modal/modal-header/modal-header.component.mjs +0 -16
  196. package/esm2022/lib/modal/modal-title/modal-title.directive.mjs +0 -15
  197. package/esm2022/lib/modal/modal.module.mjs +0 -57
  198. package/esm2022/lib/modal/modal.service.mjs +0 -21
  199. package/esm2022/lib/modal/public_api.mjs +0 -11
  200. package/esm2022/lib/multi-select/index.mjs +0 -2
  201. package/esm2022/lib/multi-select/multi-select/multi-select-search.directive.mjs +0 -65
  202. package/esm2022/lib/multi-select/multi-select/multi-select.component.mjs +0 -1296
  203. package/esm2022/lib/multi-select/multi-select-native-select/multi-select-native-select.component.mjs +0 -30
  204. package/esm2022/lib/multi-select/multi-select-optgroup/multi-select-optgroup-label.component.mjs +0 -11
  205. package/esm2022/lib/multi-select/multi-select-optgroup/multi-select-optgroup.component.mjs +0 -59
  206. package/esm2022/lib/multi-select/multi-select-option/multi-select-option.component.mjs +0 -302
  207. package/esm2022/lib/multi-select/multi-select-tag/multi-select-tag.component.mjs +0 -44
  208. package/esm2022/lib/multi-select/multi-select.module.mjs +0 -37
  209. package/esm2022/lib/multi-select/multi-select.service.mjs +0 -50
  210. package/esm2022/lib/multi-select/multi-select.type.mjs +0 -2
  211. package/esm2022/lib/multi-select/public_api.mjs +0 -6
  212. package/esm2022/lib/nav/index.mjs +0 -2
  213. package/esm2022/lib/nav/nav-item.component.mjs +0 -11
  214. package/esm2022/lib/nav/nav-link.directive.mjs +0 -76
  215. package/esm2022/lib/nav/nav.component.mjs +0 -25
  216. package/esm2022/lib/nav/nav.module.mjs +0 -30
  217. package/esm2022/lib/nav/public_api.mjs +0 -5
  218. package/esm2022/lib/navbar/index.mjs +0 -2
  219. package/esm2022/lib/navbar/navbar-brand/navbar-brand.directive.mjs +0 -18
  220. package/esm2022/lib/navbar/navbar-nav/navbar-nav.component.mjs +0 -29
  221. package/esm2022/lib/navbar/navbar-text/navbar-text.component.mjs +0 -16
  222. package/esm2022/lib/navbar/navbar-toggler/navbar-toggler.directive.mjs +0 -63
  223. package/esm2022/lib/navbar/navbar.component.mjs +0 -107
  224. package/esm2022/lib/navbar/navbar.module.mjs +0 -40
  225. package/esm2022/lib/navbar/public_api.mjs +0 -7
  226. package/esm2022/lib/offcanvas/index.mjs +0 -2
  227. package/esm2022/lib/offcanvas/offcanvas/offcanvas.component.mjs +0 -309
  228. package/esm2022/lib/offcanvas/offcanvas-body/offcanvas-body.component.mjs +0 -11
  229. package/esm2022/lib/offcanvas/offcanvas-header/offcanvas-header.component.mjs +0 -16
  230. package/esm2022/lib/offcanvas/offcanvas-title/offcanvas-title.directive.mjs +0 -15
  231. package/esm2022/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.mjs +0 -28
  232. package/esm2022/lib/offcanvas/offcanvas.module.mjs +0 -49
  233. package/esm2022/lib/offcanvas/offcanvas.service.mjs +0 -21
  234. package/esm2022/lib/offcanvas/public_api.mjs +0 -8
  235. package/esm2022/lib/pagination/index.mjs +0 -2
  236. package/esm2022/lib/pagination/page-item/page-item.component.mjs +0 -12
  237. package/esm2022/lib/pagination/page-item/page-item.directive.mjs +0 -64
  238. package/esm2022/lib/pagination/page-link/page-link.directive.mjs +0 -15
  239. package/esm2022/lib/pagination/pagination/pagination.component.mjs +0 -41
  240. package/esm2022/lib/pagination/pagination.module.mjs +0 -35
  241. package/esm2022/lib/pagination/public_api.mjs +0 -6
  242. package/esm2022/lib/placeholder/index.mjs +0 -2
  243. package/esm2022/lib/placeholder/placeholder-animation.directive.mjs +0 -34
  244. package/esm2022/lib/placeholder/placeholder.directive.mjs +0 -43
  245. package/esm2022/lib/placeholder/placeholder.module.mjs +0 -25
  246. package/esm2022/lib/placeholder/public_api.mjs +0 -4
  247. package/esm2022/lib/popover/index.mjs +0 -2
  248. package/esm2022/lib/popover/popover/popover.component.mjs +0 -70
  249. package/esm2022/lib/popover/popover.directive.mjs +0 -204
  250. package/esm2022/lib/popover/popover.module.mjs +0 -25
  251. package/esm2022/lib/popover/public_api.mjs +0 -4
  252. package/esm2022/lib/progress/index.mjs +0 -2
  253. package/esm2022/lib/progress/progress-bar.component.mjs +0 -40
  254. package/esm2022/lib/progress/progress-bar.directive.mjs +0 -113
  255. package/esm2022/lib/progress/progress-stacked.component.mjs +0 -19
  256. package/esm2022/lib/progress/progress.component.mjs +0 -74
  257. package/esm2022/lib/progress/progress.module.mjs +0 -35
  258. package/esm2022/lib/progress/progress.type.mjs +0 -2
  259. package/esm2022/lib/progress/public_api.mjs +0 -6
  260. package/esm2022/lib/rating/index.mjs +0 -2
  261. package/esm2022/lib/rating/public_api.mjs +0 -3
  262. package/esm2022/lib/rating/rating-item-label/rating-item-label.component.mjs +0 -40
  263. package/esm2022/lib/rating/rating.component.mjs +0 -355
  264. package/esm2022/lib/rating/rating.module.mjs +0 -16
  265. package/esm2022/lib/services/class-toggle.service.mjs +0 -30
  266. package/esm2022/lib/services/color-mode.service.mjs +0 -78
  267. package/esm2022/lib/services/in-memory-storage.service.mjs +0 -32
  268. package/esm2022/lib/services/index.mjs +0 -2
  269. package/esm2022/lib/services/intersection.service.mjs +0 -51
  270. package/esm2022/lib/services/listeners.service.mjs +0 -52
  271. package/esm2022/lib/services/local-storage.service.mjs +0 -45
  272. package/esm2022/lib/services/public_api.mjs +0 -7
  273. package/esm2022/lib/shared/element-ref.directive.mjs +0 -18
  274. package/esm2022/lib/shared/html-attr.directive.mjs +0 -56
  275. package/esm2022/lib/shared/index.mjs +0 -2
  276. package/esm2022/lib/shared/public_api.mjs +0 -6
  277. package/esm2022/lib/shared/shared.module.mjs +0 -24
  278. package/esm2022/lib/shared/template-id.directive.mjs +0 -20
  279. package/esm2022/lib/shared/theme.directive.mjs +0 -45
  280. package/esm2022/lib/sidebar/index.mjs +0 -2
  281. package/esm2022/lib/sidebar/public_api.mjs +0 -10
  282. package/esm2022/lib/sidebar/sidebar/sidebar.component.mjs +0 -241
  283. package/esm2022/lib/sidebar/sidebar-backdrop/sidebar-backdrop.service.mjs +0 -62
  284. package/esm2022/lib/sidebar/sidebar-brand/sidebar-brand.component.mjs +0 -30
  285. package/esm2022/lib/sidebar/sidebar-footer/sidebar-footer.component.mjs +0 -16
  286. package/esm2022/lib/sidebar/sidebar-header/sidebar-header.component.mjs +0 -16
  287. package/esm2022/lib/sidebar/sidebar-nav/index.mjs +0 -2
  288. package/esm2022/lib/sidebar/sidebar-nav/public_api.mjs +0 -14
  289. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-badge.pipe.mjs +0 -25
  290. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.mjs +0 -17
  291. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-group.service.mjs +0 -18
  292. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-icon.pipe.mjs +0 -21
  293. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.mjs +0 -34
  294. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-label.component.mjs +0 -43
  295. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-link.component.mjs +0 -111
  296. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-link.pipe.mjs +0 -23
  297. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-title.component.mjs +0 -71
  298. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.component.mjs +0 -230
  299. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.mjs +0 -2
  300. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.service.mjs +0 -54
  301. package/esm2022/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.mjs +0 -41
  302. package/esm2022/lib/sidebar/sidebar-toggler/sidebar-toggler.directive.mjs +0 -39
  303. package/esm2022/lib/sidebar/sidebar.module.mjs +0 -83
  304. package/esm2022/lib/sidebar/sidebar.service.mjs +0 -21
  305. package/esm2022/lib/smart-pagination/index.mjs +0 -2
  306. package/esm2022/lib/smart-pagination/public_api.mjs +0 -3
  307. package/esm2022/lib/smart-pagination/smart-pagination.component.mjs +0 -191
  308. package/esm2022/lib/smart-pagination/smart-pagination.module.mjs +0 -16
  309. package/esm2022/lib/smart-pagination/smart-pagination.type.mjs +0 -2
  310. package/esm2022/lib/smart-table/index.mjs +0 -2
  311. package/esm2022/lib/smart-table/public_api.mjs +0 -5
  312. package/esm2022/lib/smart-table/smart-table/smart-table.component.mjs +0 -526
  313. package/esm2022/lib/smart-table/smart-table-column-filter/smart-table-column-filter.component.mjs +0 -27
  314. package/esm2022/lib/smart-table/smart-table-filter/filter-input.directive.mjs +0 -69
  315. package/esm2022/lib/smart-table/smart-table-filter/smart-table-filter.component.mjs +0 -42
  316. package/esm2022/lib/smart-table/smart-table-head/smart-table-column-label.pipe.mjs +0 -18
  317. package/esm2022/lib/smart-table/smart-table-head/smart-table-head.component.mjs +0 -229
  318. package/esm2022/lib/smart-table/smart-table-items-per-page-selector/smart-table-items-per-page-selector.component.mjs +0 -46
  319. package/esm2022/lib/smart-table/smart-table.module.mjs +0 -17
  320. package/esm2022/lib/smart-table/smart-table.type.mjs +0 -2
  321. package/esm2022/lib/smart-table/smart-table.utils.mjs +0 -181
  322. package/esm2022/lib/spinner/index.mjs +0 -2
  323. package/esm2022/lib/spinner/public_api.mjs +0 -3
  324. package/esm2022/lib/spinner/spinner.component.mjs +0 -52
  325. package/esm2022/lib/spinner/spinner.module.mjs +0 -20
  326. package/esm2022/lib/table/index.mjs +0 -2
  327. package/esm2022/lib/table/public_api.mjs +0 -5
  328. package/esm2022/lib/table/table-active.directive.mjs +0 -32
  329. package/esm2022/lib/table/table-color.directive.mjs +0 -25
  330. package/esm2022/lib/table/table.directive.mjs +0 -112
  331. package/esm2022/lib/table/table.module.mjs +0 -30
  332. package/esm2022/lib/table/table.type.mjs +0 -2
  333. package/esm2022/lib/tabs/index.mjs +0 -2
  334. package/esm2022/lib/tabs/public_api.mjs +0 -6
  335. package/esm2022/lib/tabs/tab-content/tab-content.component.mjs +0 -83
  336. package/esm2022/lib/tabs/tab-content-ref.directive.mjs +0 -141
  337. package/esm2022/lib/tabs/tab-pane/tab-pane.component.mjs +0 -60
  338. package/esm2022/lib/tabs/tab.service.mjs +0 -21
  339. package/esm2022/lib/tabs/tabs.module.mjs +0 -36
  340. package/esm2022/lib/tabs-2/index.mjs +0 -2
  341. package/esm2022/lib/tabs-2/public_api.mjs +0 -8
  342. package/esm2022/lib/tabs-2/tab/tab.directive.mjs +0 -96
  343. package/esm2022/lib/tabs-2/tab-panel/tab-panel.component.mjs +0 -113
  344. package/esm2022/lib/tabs-2/tabs-content/tabs-content.component.mjs +0 -19
  345. package/esm2022/lib/tabs-2/tabs-list/tabs-list.component.mjs +0 -93
  346. package/esm2022/lib/tabs-2/tabs.component.mjs +0 -37
  347. package/esm2022/lib/tabs-2/tabs.service.mjs +0 -15
  348. package/esm2022/lib/tabs-2/tabs2.module.mjs +0 -22
  349. package/esm2022/lib/time-picker/index.mjs +0 -2
  350. package/esm2022/lib/time-picker/public_api.mjs +0 -3
  351. package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-am-pm.component.mjs +0 -110
  352. package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-col.component.mjs +0 -114
  353. package/esm2022/lib/time-picker/time-picker.component.mjs +0 -517
  354. package/esm2022/lib/time-picker/time-picker.module.mjs +0 -16
  355. package/esm2022/lib/time-picker/time.utils.mjs +0 -645
  356. package/esm2022/lib/toast/index.mjs +0 -2
  357. package/esm2022/lib/toast/public_api.mjs +0 -9
  358. package/esm2022/lib/toast/toast/toast.component.mjs +0 -204
  359. package/esm2022/lib/toast/toast-body/toast-body.component.mjs +0 -21
  360. package/esm2022/lib/toast/toast-close.directive.mjs +0 -29
  361. package/esm2022/lib/toast/toast-header/toast-header.component.mjs +0 -30
  362. package/esm2022/lib/toast/toast.module.mjs +0 -47
  363. package/esm2022/lib/toast/toaster/toaster-host.directive.mjs +0 -18
  364. package/esm2022/lib/toast/toaster/toaster.component.mjs +0 -123
  365. package/esm2022/lib/toast/toaster/toaster.service.mjs +0 -22
  366. package/esm2022/lib/tooltip/index.mjs +0 -2
  367. package/esm2022/lib/tooltip/public_api.mjs +0 -4
  368. package/esm2022/lib/tooltip/tooltip/tooltip.component.mjs +0 -66
  369. package/esm2022/lib/tooltip/tooltip.directive.mjs +0 -204
  370. package/esm2022/lib/tooltip/tooltip.module.mjs +0 -25
  371. package/esm2022/lib/utilities/align.directive.mjs +0 -25
  372. package/esm2022/lib/utilities/bg-color.directive.mjs +0 -34
  373. package/esm2022/lib/utilities/border.directive.mjs +0 -67
  374. package/esm2022/lib/utilities/border.type.mjs +0 -2
  375. package/esm2022/lib/utilities/index.mjs +0 -2
  376. package/esm2022/lib/utilities/public_api.mjs +0 -9
  377. package/esm2022/lib/utilities/rounded.directive.mjs +0 -66
  378. package/esm2022/lib/utilities/rounded.type.mjs +0 -2
  379. package/esm2022/lib/utilities/shadow-on-scroll.directive.mjs +0 -48
  380. package/esm2022/lib/utilities/text-bg-color.directive.mjs +0 -30
  381. package/esm2022/lib/utilities/text-color.directive.mjs +0 -30
  382. package/esm2022/lib/utilities/utilities.module.mjs +0 -16
  383. package/esm2022/lib/widget/index.mjs +0 -2
  384. package/esm2022/lib/widget/public_api.mjs +0 -8
  385. package/esm2022/lib/widget/widget-stat-a/widget-stat-a.component.mjs +0 -55
  386. package/esm2022/lib/widget/widget-stat-b/widget-stat-b.component.mjs +0 -57
  387. package/esm2022/lib/widget/widget-stat-c/widget-stat-c.component.mjs +0 -71
  388. package/esm2022/lib/widget/widget-stat-d/widget-stat-d.component.mjs +0 -36
  389. package/esm2022/lib/widget/widget-stat-e/widget-stat-e.component.mjs +0 -36
  390. package/esm2022/lib/widget/widget-stat-f/widget-stat-f.component.mjs +0 -96
  391. package/esm2022/lib/widget/widget.module.mjs +0 -45
  392. package/esm2022/public-api.mjs +0 -53
@@ -1,448 +0,0 @@
1
- import { Component, computed, DestroyRef, effect, inject, input, numberAttribute, signal, ViewChildren } from '@angular/core';
2
- import { AsyncPipe, NgClass } from '@angular/common';
3
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
- import { take } from 'rxjs/operators';
5
- import { convertToDateObject, createGroupsInArray, equalDates, getMonthDetails, getMonthsNames, getYears, isDateDisabled, isDateInRangeDisabled } from '../calendar.utils';
6
- import { CalendarService } from '../calendar.service';
7
- import { CalendarWeekdayPipe } from './calendar-weekday.pipe';
8
- import { CalendarClassYearPipe } from './calendar-class-year.pipe';
9
- import { CalendarClassMonthPipe } from './calendar-class-month.pipe';
10
- import { CalendarDayPipe } from './calendar-day.pipe';
11
- import { CalendarDayDirective } from './calendar-day.directive';
12
- import { CalendarDayTitlePipe } from './calendar-day-title.pipe';
13
- import { CalendarClassDayPipe } from './calendar-class-day.pipe';
14
- import { CalendarClassRowPipe } from './calendar-class-row.pipe';
15
- import { CalendarRowDirective } from './calendar-row.directive';
16
- import * as i0 from "@angular/core";
17
- export class CalendarMonthComponent {
18
- #destroyRef;
19
- #calendarService;
20
- constructor() {
21
- this.#destroyRef = inject(DestroyRef);
22
- this.#calendarService = inject(CalendarService);
23
- this.pageIndex = input(0, { transform: numberAttribute });
24
- this.addMonths = computed(() => {
25
- const view = this.view();
26
- const pageIndex = this.pageIndex();
27
- return pageIndex * (view === 'years' ? 144 : view === 'months' ? 12 : 1);
28
- });
29
- /**
30
- * Initial selected date.
31
- * @type (Date | null)
32
- */
33
- this.startDate = signal(null, { equal: equalDates });
34
- /**
35
- * Initial selected to date (range).
36
- * @type Date | null
37
- */
38
- this.endDate = signal(null, { equal: equalDates });
39
- this.datesEffect = effect(() => {
40
- const startDate = this.startDate();
41
- const endDate = startDate && this.range() ? this.endDate() : null;
42
- this.#calendarService.update({ startDate: startDate, endDate: endDate });
43
- }, { allowSignalWrites: true });
44
- /**
45
- * Specify the list of dates that cannot be selected.
46
- * @type Date[] | Date[][]
47
- */
48
- this.disabledDates = signal([]);
49
- /**
50
- * Sets the day of start week.
51
- * - 0 - Sunday,
52
- * - 1 - Monday,
53
- * - 2 - Tuesday,
54
- * - 3 - Wednesday,
55
- * - 4 - Thursday,
56
- * - 5 - Friday,
57
- * - 6 - Saturday,
58
- */
59
- this.firstDayOfWeek = signal(1);
60
- /**
61
- * Sets the default locale for components. If not set, it is inherited from the browser.
62
- * @default 'default'
63
- */
64
- this.locale = signal('default');
65
- /**
66
- * Allow range selection.
67
- * @type boolean
68
- * @default false
69
- */
70
- this.range = signal(false);
71
- /**
72
- * Set length or format of day name.
73
- * @type number | 'long' | 'narrow' | 'short'
74
- * @default 'short'
75
- */
76
- this.weekdayFormat = signal('short');
77
- /**
78
- * Set calendar view.
79
- * @type 'days' | 'months' | 'years'
80
- * @default 'days'
81
- */
82
- this.view = signal('days');
83
- /**
84
- * Max selectable date.
85
- */
86
- this.maxDate = signal(null, { equal: equalDates });
87
- /**
88
- * Min selectable date.
89
- */
90
- this.minDate = signal(null, { equal: equalDates });
91
- this.listOfMonths = computed(() => {
92
- return createGroupsInArray(getMonthsNames(this.locale(), this.date().getFullYear()), 4);
93
- });
94
- this.listOfYears = computed(() => createGroupsInArray(getYears(this.date().getFullYear()), 4));
95
- /**
96
- * Default date of the component
97
- * @type Date
98
- */
99
- this.calendarDate = signal(new Date(), { equal: equalDates });
100
- this.date = computed(() => {
101
- const date = this.calendarDate();
102
- return new Date(date.getFullYear(), date.getMonth() + this.addMonths(), 1, 0, 0, 0, 0);
103
- }, { equal: (a, b) => a.getTime() === b.getTime() });
104
- this.calendarDateEffect = effect(() => {
105
- this.#calendarService.update({ calendarDate: this.calendarDate() });
106
- }, { allowSignalWrites: true });
107
- this.dateFilter = signal(undefined);
108
- this.dayFormat = signal('numeric');
109
- this.selectAdjacentDays = signal(false);
110
- this.showAdjacentDays = signal(true);
111
- this.selectionType = signal('day');
112
- this.showWeekNumber = signal(false);
113
- this.weekNumbersLabel = signal('');
114
- this.monthDetails = computed(() => {
115
- const date = this.date();
116
- return getMonthDetails(date.getFullYear(), date.getMonth(), this.firstDayOfWeek());
117
- });
118
- this.weekDays = computed(() => {
119
- const monthDetails = this.monthDetails();
120
- return monthDetails[0].days;
121
- });
122
- this.calendarStateSubscribe();
123
- }
124
- yearNumber(year) {
125
- return new Date(year, 0).toLocaleDateString(this.locale(), { year: 'numeric' });
126
- }
127
- isDateDisabled(date) {
128
- const selectionType = this.selectionType();
129
- const disabledDates = this.disabledDates();
130
- const dateFilterFn = this.dateFilter();
131
- const maxDate = this.maxDate();
132
- const minDate = this.minDate();
133
- if (selectionType === 'year') {
134
- const min = minDate ? new Date(minDate.getFullYear(), 0, 1, 0, 0, 0, 0) : null;
135
- const max = maxDate ? new Date(maxDate.getFullYear(), 11, 31, 0, 0, 0, 0) : null;
136
- return isDateDisabled(date, min, max, disabledDates) || (dateFilterFn ? !dateFilterFn(date) : false);
137
- }
138
- if (selectionType === 'month') {
139
- const min = minDate ? new Date(minDate.getFullYear(), minDate.getMonth(), 1, 0, 0, 0, 0) : null;
140
- const max = maxDate ? new Date(maxDate.getFullYear(), maxDate.getMonth() + 1, 1, 0, 0, -1, 0) : null;
141
- return isDateDisabled(date, min, max, disabledDates) || (dateFilterFn ? !dateFilterFn(date) : false);
142
- }
143
- return isDateDisabled(date, minDate, maxDate, disabledDates) || (dateFilterFn ? !dateFilterFn(date) : false);
144
- }
145
- calendarCellTitle(date) {
146
- return date.toLocaleDateString(this.locale());
147
- }
148
- handleCellMouseEnter(hoverDate) {
149
- if (!hoverDate) {
150
- return;
151
- }
152
- const selectionType = this.selectionType();
153
- const updateHoverValue = (['day', 'week'].includes(selectionType) && this.view() === 'days') ||
154
- (['month'].includes(selectionType) && this.view() === 'months') ||
155
- (['year'].includes(selectionType) && this.view() === 'years');
156
- // if (updateHoverValue) {
157
- const hoverValue = this.isDateDisabled(hoverDate) || !updateHoverValue ? null : hoverDate;
158
- this.#calendarService.update({ hoverDate: hoverValue });
159
- // }
160
- }
161
- handleYearCellClick(year) {
162
- if (this.selectionType() === 'year') {
163
- let date = new Date(year, 0, 1, 0, 0, 0, 0);
164
- if (this.range() && this.startDate() && !this.endDate()) {
165
- date = new Date(date.getFullYear(), 12, 1, 0, 0, -1, 0);
166
- }
167
- this.handleDayCellClick(date);
168
- return;
169
- }
170
- const calendarDate = new Date(year, 0, 1, 0, 0, 0, 0);
171
- this.view.set('months');
172
- this.#calendarService.update({ view: this.view(), calendarDate: calendarDate });
173
- }
174
- handleYearCellKeyUp($event, date) {
175
- if (!date) {
176
- return;
177
- }
178
- if (['Space', 'Enter'].includes($event.code)) {
179
- this.handleYearCellClick(date.getFullYear());
180
- return;
181
- }
182
- if (['Tab', 'ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'].includes($event.code)) {
183
- this.handleCellMouseEnter(new Date(date));
184
- return;
185
- }
186
- }
187
- handleMonthCellKeyUp($event, date) {
188
- if (!date) {
189
- return;
190
- }
191
- if (['Space', 'Enter'].includes($event.code)) {
192
- this.handleMonthCellClick(date);
193
- return;
194
- }
195
- if (['Tab', 'ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'].includes($event.code)) {
196
- this.handleCellMouseEnter(date);
197
- return;
198
- }
199
- }
200
- handleMonthCellClick(value) {
201
- if (!value) {
202
- return;
203
- }
204
- if (this.selectionType() === 'month') {
205
- let date = new Date(value.getFullYear(), value.getMonth(), 1, 0, 0, 0, 0);
206
- if (this.range() && this.startDate() && !this.endDate()) {
207
- date = new Date(date.getFullYear(), date.getMonth() + 1, 1, 0, 0, -1, 0);
208
- }
209
- this.handleDayCellClick(date);
210
- return;
211
- }
212
- this.view.set('days');
213
- this.#calendarService.update({ view: this.view() });
214
- // this.setCalendarPage(0, 0, value.getMonth() - this.addMonths());
215
- const calendarDate = new Date(value.getFullYear(), value.getMonth() - this.addMonths(), 1, 0, 0, 0, 0);
216
- this.#calendarService.update({ calendarDate: calendarDate });
217
- }
218
- setCalendarPage(years, months = 0, setMonth) {
219
- const year = this.date().getFullYear();
220
- const month = this.date().getMonth();
221
- const d = new Date(year, month, 1, 0, 0, 0, 0);
222
- years && d.setFullYear(d.getFullYear() + years);
223
- months && d.setMonth(d.getMonth() + months);
224
- typeof setMonth === 'number' && d.setMonth(setMonth);
225
- this.#calendarService.update({ calendarDate: d });
226
- }
227
- handleDayCellKeyDown($event, date) {
228
- if (!date) {
229
- return;
230
- }
231
- if (!['Tab', 'ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'].includes($event.code)) {
232
- return;
233
- }
234
- $event.preventDefault();
235
- this.handleCellMouseEnter(date);
236
- const eventKey = $event.key === 'Tab' ? ($event.shiftKey ? 'ArrowLeft' : 'ArrowRight') : $event.key;
237
- const selectionType = this.selectionType();
238
- const view = this.view();
239
- const maxDate = this.maxDate();
240
- if (maxDate &&
241
- date >= convertToDateObject(maxDate, selectionType) &&
242
- ['ArrowRight', 'ArrowDown'].includes(eventKey)) {
243
- return;
244
- }
245
- const minDate = this.minDate();
246
- if (minDate && date <= convertToDateObject(minDate, selectionType) && ['ArrowLeft', 'ArrowUp'].includes(eventKey)) {
247
- return;
248
- }
249
- let element = $event.target;
250
- if (selectionType === 'week' && view === 'days' && element.tabIndex === -1) {
251
- element = element.closest('tr[tabindex="0"]');
252
- }
253
- const elements = ['week'].includes(selectionType) && view === 'days' ? this.calendarRows : this.calendarDays;
254
- const list = elements
255
- .toArray()
256
- .map((calendarCell) => calendarCell.elementRef.nativeElement)
257
- // .filter((element) => this.selectionType === 'week' ? element?.tabIndex === 0 : element?.classList.contains('current'))
258
- .filter((element) => element?.tabIndex === 0);
259
- const index = list.indexOf(element);
260
- const first = index === 0;
261
- const last = index === list.length - 1;
262
- const toBoundary = {
263
- start: index,
264
- end: list.length - (index + 1)
265
- };
266
- const gap = {
267
- ArrowRight: 1,
268
- ArrowLeft: -1,
269
- ArrowUp: selectionType === 'week' && view === 'days' ? -1 : view === 'days' ? -7 : -3,
270
- ArrowDown: selectionType === 'week' && view === 'days' ? 1 : view === 'days' ? 7 : 3
271
- };
272
- if ((eventKey === 'ArrowRight' && last) ||
273
- (eventKey === 'ArrowDown' && toBoundary.end < gap.ArrowDown) ||
274
- (eventKey === 'ArrowLeft' && first) ||
275
- (eventKey === 'ArrowUp' && toBoundary.start < Math.abs(gap.ArrowUp))) {
276
- elements.changes
277
- .pipe(take(1), takeUntilDestroyed(this.#destroyRef))
278
- .subscribe((change) => {
279
- const _list = change
280
- .toArray()
281
- // .filter(element => this.selectionType === 'week' ? element?.elementRef.nativeElement.tabIndex === 0 : element?.elementRef.nativeElement.classList.contains('current'));
282
- .filter((directive) => directive?.elementRef.nativeElement.tabIndex === 0);
283
- if (_list.length) {
284
- let dayToFocus;
285
- switch (eventKey) {
286
- case 'ArrowRight': {
287
- dayToFocus = _list[0];
288
- break;
289
- }
290
- case 'ArrowLeft': {
291
- dayToFocus = _list[_list.length - 1];
292
- break;
293
- }
294
- case 'ArrowDown': {
295
- dayToFocus = _list[gap.ArrowDown - (list.length - index)];
296
- break;
297
- }
298
- case 'ArrowUp': {
299
- dayToFocus = _list[_list.length - (Math.abs(gap.ArrowUp) + 1 - (index + 1))];
300
- break;
301
- }
302
- }
303
- if (!dayToFocus?.disabled) {
304
- // console.log('dayToFocus', dayToFocus?.date);
305
- dayToFocus?.focus('keyboard');
306
- }
307
- }
308
- });
309
- switch (view) {
310
- case 'days':
311
- this.setCalendarPage(0, ['ArrowRight', 'ArrowDown'].includes(eventKey) ? 1 : -1);
312
- break;
313
- case 'months':
314
- this.setCalendarPage(['ArrowRight', 'ArrowDown'].includes(eventKey) ? 1 : -1);
315
- break;
316
- case 'years':
317
- this.setCalendarPage(['ArrowRight', 'ArrowDown'].includes(eventKey) ? 12 : -12);
318
- break;
319
- }
320
- return;
321
- }
322
- // @ts-ignore
323
- const nextElement = list[index + gap[eventKey]];
324
- if (nextElement?.tabIndex === 0) {
325
- nextElement.focus();
326
- return;
327
- }
328
- for (let i = index; i < list.length; list.length && ['ArrowRight', 'ArrowDown'].includes(eventKey) ? i++ : i--) {
329
- // @ts-ignore
330
- const nextElement = list[i + gap[eventKey]];
331
- if (nextElement?.tabIndex === 0) {
332
- // @ts-ignore
333
- nextElement?.focus();
334
- break;
335
- }
336
- // @ts-ignore
337
- if (!nextElement) {
338
- break;
339
- }
340
- }
341
- }
342
- handleCellMouseLeave() {
343
- this.#calendarService.update({ hoverDate: null });
344
- }
345
- handleDayCellKeyUp($event, date) {
346
- if (['Space', 'Enter'].includes($event.code)) {
347
- this.handleDayCellClick(date);
348
- return;
349
- }
350
- if (['Tab', 'ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'].includes($event.code)) {
351
- this.handleCellMouseEnter(date);
352
- return;
353
- }
354
- }
355
- handleDayCellClick(date) {
356
- if (this.selectionType() === 'day' && this.isDateDisabled(date)) {
357
- return;
358
- }
359
- if (!this.range()) {
360
- this.endDate.set(null);
361
- this.startDate.set(date);
362
- return;
363
- }
364
- const startDate = this.startDate();
365
- const endDate = this.endDate();
366
- if (startDate && endDate) {
367
- this.startDate.set(null);
368
- this.endDate.set(null);
369
- return;
370
- }
371
- if (!!startDate && !endDate) {
372
- if (startDate && date < startDate) {
373
- this.endDate.set(null);
374
- this.startDate.set(date);
375
- }
376
- else {
377
- const addDays = this.selectionType() !== 'week' ? 1 : 7;
378
- this.endDate.set(new Date(date.getFullYear(), date.getMonth(), date.getDate() + addDays, 0, 0, -1, 0));
379
- }
380
- }
381
- else {
382
- this.endDate.set(null);
383
- this.startDate.set(date);
384
- }
385
- {
386
- const startDate = this.startDate();
387
- const endDate = this.endDate();
388
- if (startDate && endDate) {
389
- const dateFilterFn = this.dateFilter();
390
- if (isDateInRangeDisabled(startDate, endDate, this.disabledDates(), dateFilterFn)) {
391
- this.startDate.set(null);
392
- this.endDate.set(null);
393
- return;
394
- }
395
- }
396
- }
397
- }
398
- calendarStateSubscribe() {
399
- this.#calendarService.calendarState$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((state) => {
400
- const keys = Object.keys(state);
401
- for (const key of keys) {
402
- if (key in this) {
403
- // @ts-ignore
404
- const isWritableSignal = typeof this[key] === 'function' && typeof this[key].set === 'function';
405
- // @ts-ignore
406
- isWritableSignal ? this[key].set(state[key]) : (this[key] = state[key]);
407
- }
408
- }
409
- });
410
- }
411
- getMonthStart(index) {
412
- return new Date(this.calendarDate().getFullYear(), index + this.addMonths(), 1, 0, 0, 0, 0);
413
- }
414
- getMonthEnd(index) {
415
- return new Date(this.calendarDate().getFullYear(), index + 1 + this.addMonths(), 1, 0, 0, -1, 0);
416
- }
417
- getYearStart(year) {
418
- return new Date(year, 0, 1);
419
- }
420
- getYearEnd(year) {
421
- return new Date(year, 11, 1, 0, 0, -1, 0);
422
- }
423
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: CalendarMonthComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
424
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: CalendarMonthComponent, isStandalone: true, selector: "c-calendar-month", inputs: { pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "calendarDays", predicate: CalendarDayDirective, descendants: true }, { propertyName: "calendarRows", predicate: CalendarRowDirective, descendants: true }], exportAs: ["cCalendarMonth"], ngImport: i0, template: "<table>\n @if (view() === 'days') {\n <thead>\n <tr>\n @if (showWeekNumber()) {\n <th class=\"calendar-cell\">\n <div class=\"calendar-header-cell-inner\">{{ weekNumbersLabel() }}</div>\n </th>\n }\n @for (weekDay of weekDays(); track weekDay.date; let i = $index) {\n @let date = weekDay.date ;\n <th class=\"calendar-cell\" abbr=\"{{date | calendarWeekday:'long':locale()}}\">\n <div class=\"calendar-header-cell-inner\">\n {{ date | calendarWeekday:weekdayFormat():locale() }}\n </div>\n </th>\n }\n </tr>\n </thead>\n }\n <tbody (mouseleave)=\"handleCellMouseLeave()\">\n @switch (view()) {\n @case ('years') {\n @for (yearsRow of listOfYears(); track yearsRow[0]; let rowIdx = $index) {\n <tr>\n @for (year of yearsRow; track year; let idx = $index) {\n <td\n #calendarYear=\"cCalendarDay\"\n (click)=\"!calendarYear.disabled$() && handleYearCellClick(year)\"\n (keydown)=\"calendarYear.date() && handleDayCellKeyDown($event, calendarYear.date())\"\n (keyup)=\"handleYearCellKeyUp($event, calendarYear.date())\"\n (mouseenter)=\"calendarYear.date() && handleCellMouseEnter(calendarYear.date())\"\n [attr.aria-label]=\"calendarYear.date()?.getFullYear()\"\n [date]=\"getYearStart(year)\"\n [ngClass]=\"year | calendarClassYear\"\n [tabindex]=\"calendarYear.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ yearNumber(year) }}\n </div>\n </td>\n }\n </tr>\n }\n }\n @case ('months') {\n @for (monthsRow of listOfMonths(); track monthsRow[0]; let rowIdx = $index) {\n <tr>\n @for (month of monthsRow; track month; let idx = $index) {\n @let monthStart = getMonthStart(rowIdx*3+idx);\n <td\n #calendarMonth=\"cCalendarDay\"\n (click)=\"!calendarMonth.disabled$() && handleMonthCellClick(calendarMonth.date())\"\n (keydown)=\"calendarMonth.date() && handleDayCellKeyDown($event, calendarMonth.date())\"\n (keyup)=\"handleMonthCellKeyUp($event, calendarMonth.date())\"\n (mouseenter)=\"calendarMonth.date() && handleCellMouseEnter(calendarMonth.date())\"\n [attr.aria-label]=\"calendarMonth.date()?.getFullYear()+' '+month.month\"\n [date]=\"monthStart\"\n [ngClass]=\"monthStart | calendarClassMonth:(rowIdx*3+idx)\"\n [tabindex]=\"calendarMonth.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ month.month }}\n </div>\n </td>\n }\n </tr>\n }\n\n }\n @default {\n @let weekSelection = selectionType() === 'week';\n @let daySelection = selectionType() === 'day';\n @for (week of monthDetails(); track week.days[0]; let i = $index) {\n <tr #calendarRow=\"cCalendarRow\"\n (click)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellClick(calendarRow.date)\"\n (keydown)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellKeyDown($event, calendarRow.date)\"\n (keyup)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellKeyUp($event, calendarRow.date)\"\n (mouseenter)=\"weekSelection && calendarRow.date && handleCellMouseEnter(calendarRow.date)\"\n [cCalendarRow]=\"week\"\n >\n @if (showWeekNumber()) {\n <th class=\"calendar-cell-week-number\">\n {{ week.weekNumber === 0 ? 53 : week.weekNumber }}\n </th>\n }\n @for (dateObj of week.days; track dateObj.date; let idx = $index) {\n @let currentMonth = dateObj.month === 'current';\n @if (currentMonth || showAdjacentDays()) {\n @let selectable = daySelection && (currentMonth || selectAdjacentDays());\n <td #calendarCell=\"cCalendarDay\"\n (click)=\"selectable && handleDayCellClick(dateObj.date)\"\n (keydown)=\"selectable && handleDayCellKeyDown($event, dateObj.date)\"\n (keyup)=\"selectable && handleDayCellKeyUp($event, dateObj.date)\"\n (mouseenter)=\"selectable && handleCellMouseEnter(dateObj.date)\"\n [attr.aria-label]=\"dateObj.date | calendarDayTitle:locale()\"\n [date]=\"dateObj.date\"\n [month]=\"dateObj.month\"\n [ngClass]=\"dateObj | calendarClassDay:{minDate: minDate(), maxDate: maxDate(), disabledDates: disabledDates(), dateFilter: dateFilter()}\"\n [tabindex]=\"selectable && !isDateDisabled(dateObj.date) ? 0 : -1\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ dateObj.date | calendarDay:dayFormat():locale() }}\n </div>\n </td>\n } @else {\n <td class=\"calendar-cell\"></td>\n }\n }\n </tr>\n }\n }\n }\n </tbody>\n</table>\n\n", styles: [".btn-transparent:focus-visible{outline:-webkit-focus-ring-color auto 1px}.calendar-row:focus-visible{box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-row:focus-within:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-row:focus:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-cell:focus:not(:focus-visible):not([tabindex=\"-1\"]){box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-cell-inner{-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: CalendarDayDirective, selector: "[cCalendarDay]", inputs: ["date", "month"], exportAs: ["cCalendarDay"] }, { kind: "pipe", type: CalendarDayPipe, name: "calendarDay" }, { kind: "pipe", type: CalendarDayTitlePipe, name: "calendarDayTitle" }, { kind: "directive", type: CalendarRowDirective, selector: "[cCalendarRow]", inputs: ["cCalendarRow"], exportAs: ["cCalendarRow"] }, { kind: "pipe", type: CalendarClassDayPipe, name: "calendarClassDay" }, { kind: "pipe", type: CalendarClassMonthPipe, name: "calendarClassMonth" }, { kind: "pipe", type: CalendarClassYearPipe, name: "calendarClassYear" }, { kind: "pipe", type: CalendarWeekdayPipe, name: "calendarWeekday" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
425
- }
426
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: CalendarMonthComponent, decorators: [{
427
- type: Component,
428
- args: [{ selector: 'c-calendar-month', exportAs: 'cCalendarMonth', standalone: true, imports: [
429
- CalendarDayDirective,
430
- CalendarDayPipe,
431
- CalendarDayTitlePipe,
432
- CalendarRowDirective,
433
- CalendarClassDayPipe,
434
- CalendarClassMonthPipe,
435
- CalendarClassRowPipe,
436
- CalendarClassYearPipe,
437
- CalendarWeekdayPipe,
438
- NgClass,
439
- AsyncPipe
440
- ], template: "<table>\n @if (view() === 'days') {\n <thead>\n <tr>\n @if (showWeekNumber()) {\n <th class=\"calendar-cell\">\n <div class=\"calendar-header-cell-inner\">{{ weekNumbersLabel() }}</div>\n </th>\n }\n @for (weekDay of weekDays(); track weekDay.date; let i = $index) {\n @let date = weekDay.date ;\n <th class=\"calendar-cell\" abbr=\"{{date | calendarWeekday:'long':locale()}}\">\n <div class=\"calendar-header-cell-inner\">\n {{ date | calendarWeekday:weekdayFormat():locale() }}\n </div>\n </th>\n }\n </tr>\n </thead>\n }\n <tbody (mouseleave)=\"handleCellMouseLeave()\">\n @switch (view()) {\n @case ('years') {\n @for (yearsRow of listOfYears(); track yearsRow[0]; let rowIdx = $index) {\n <tr>\n @for (year of yearsRow; track year; let idx = $index) {\n <td\n #calendarYear=\"cCalendarDay\"\n (click)=\"!calendarYear.disabled$() && handleYearCellClick(year)\"\n (keydown)=\"calendarYear.date() && handleDayCellKeyDown($event, calendarYear.date())\"\n (keyup)=\"handleYearCellKeyUp($event, calendarYear.date())\"\n (mouseenter)=\"calendarYear.date() && handleCellMouseEnter(calendarYear.date())\"\n [attr.aria-label]=\"calendarYear.date()?.getFullYear()\"\n [date]=\"getYearStart(year)\"\n [ngClass]=\"year | calendarClassYear\"\n [tabindex]=\"calendarYear.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ yearNumber(year) }}\n </div>\n </td>\n }\n </tr>\n }\n }\n @case ('months') {\n @for (monthsRow of listOfMonths(); track monthsRow[0]; let rowIdx = $index) {\n <tr>\n @for (month of monthsRow; track month; let idx = $index) {\n @let monthStart = getMonthStart(rowIdx*3+idx);\n <td\n #calendarMonth=\"cCalendarDay\"\n (click)=\"!calendarMonth.disabled$() && handleMonthCellClick(calendarMonth.date())\"\n (keydown)=\"calendarMonth.date() && handleDayCellKeyDown($event, calendarMonth.date())\"\n (keyup)=\"handleMonthCellKeyUp($event, calendarMonth.date())\"\n (mouseenter)=\"calendarMonth.date() && handleCellMouseEnter(calendarMonth.date())\"\n [attr.aria-label]=\"calendarMonth.date()?.getFullYear()+' '+month.month\"\n [date]=\"monthStart\"\n [ngClass]=\"monthStart | calendarClassMonth:(rowIdx*3+idx)\"\n [tabindex]=\"calendarMonth.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ month.month }}\n </div>\n </td>\n }\n </tr>\n }\n\n }\n @default {\n @let weekSelection = selectionType() === 'week';\n @let daySelection = selectionType() === 'day';\n @for (week of monthDetails(); track week.days[0]; let i = $index) {\n <tr #calendarRow=\"cCalendarRow\"\n (click)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellClick(calendarRow.date)\"\n (keydown)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellKeyDown($event, calendarRow.date)\"\n (keyup)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellKeyUp($event, calendarRow.date)\"\n (mouseenter)=\"weekSelection && calendarRow.date && handleCellMouseEnter(calendarRow.date)\"\n [cCalendarRow]=\"week\"\n >\n @if (showWeekNumber()) {\n <th class=\"calendar-cell-week-number\">\n {{ week.weekNumber === 0 ? 53 : week.weekNumber }}\n </th>\n }\n @for (dateObj of week.days; track dateObj.date; let idx = $index) {\n @let currentMonth = dateObj.month === 'current';\n @if (currentMonth || showAdjacentDays()) {\n @let selectable = daySelection && (currentMonth || selectAdjacentDays());\n <td #calendarCell=\"cCalendarDay\"\n (click)=\"selectable && handleDayCellClick(dateObj.date)\"\n (keydown)=\"selectable && handleDayCellKeyDown($event, dateObj.date)\"\n (keyup)=\"selectable && handleDayCellKeyUp($event, dateObj.date)\"\n (mouseenter)=\"selectable && handleCellMouseEnter(dateObj.date)\"\n [attr.aria-label]=\"dateObj.date | calendarDayTitle:locale()\"\n [date]=\"dateObj.date\"\n [month]=\"dateObj.month\"\n [ngClass]=\"dateObj | calendarClassDay:{minDate: minDate(), maxDate: maxDate(), disabledDates: disabledDates(), dateFilter: dateFilter()}\"\n [tabindex]=\"selectable && !isDateDisabled(dateObj.date) ? 0 : -1\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ dateObj.date | calendarDay:dayFormat():locale() }}\n </div>\n </td>\n } @else {\n <td class=\"calendar-cell\"></td>\n }\n }\n </tr>\n }\n }\n }\n </tbody>\n</table>\n\n", styles: [".btn-transparent:focus-visible{outline:-webkit-focus-ring-color auto 1px}.calendar-row:focus-visible{box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-row:focus-within:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-row:focus:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-cell:focus:not(:focus-visible):not([tabindex=\"-1\"]){box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-cell-inner{-webkit-user-select:none;user-select:none}\n"] }]
441
- }], ctorParameters: () => [], propDecorators: { calendarDays: [{
442
- type: ViewChildren,
443
- args: [CalendarDayDirective]
444
- }], calendarRows: [{
445
- type: ViewChildren,
446
- args: [CalendarRowDirective]
447
- }] } });
448
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9jYWxlbmRhci9jYWxlbmRhci1tb250aC9jYWxlbmRhci1tb250aC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL2NhbGVuZGFyL2NhbGVuZGFyLW1vbnRoL2NhbGVuZGFyLW1vbnRoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxlQUFlLEVBRWYsTUFBTSxFQUNOLFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsZUFBZSxFQUNmLGNBQWMsRUFDZCxRQUFRLEVBQ1IsY0FBYyxFQUNkLHFCQUFxQixFQUN0QixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSxlQUFlLEVBQThELE1BQU0scUJBQXFCLENBQUM7QUFDbEgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxN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R0FDcEIsb0JBQW9CLG9EQUNwQixzQkFBc0Isc0RBRXRCLHFCQUFxQixxREFDckIsbUJBQW1CLHdEQUNuQixPQUFPOzs0RkFJRSxzQkFBc0I7a0JBcEJsQyxTQUFTOytCQUNFLGtCQUFrQixZQUdsQixnQkFBZ0IsY0FDZCxJQUFJLFdBQ1A7d0JBQ1Asb0JBQW9CO3dCQUNwQixlQUFlO3dCQUNmLG9CQUFvQjt3QkFDcEIsb0JBQW9CO3dCQUNwQixvQkFBb0I7d0JBQ3BCLHNCQUFzQjt3QkFDdEIsb0JBQW9CO3dCQUNwQixxQkFBcUI7d0JBQ3JCLG1CQUFtQjt3QkFDbkIsT0FBTzt3QkFDUCxTQUFTO3FCQUNWO3dEQWdJbUMsWUFBWTtzQkFBL0MsWUFBWTt1QkFBQyxvQkFBb0I7Z0JBQ0UsWUFBWTtzQkFBL0MsWUFBWTt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBEZXN0cm95UmVmLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG51bWJlckF0dHJpYnV0ZSxcbiAgUXVlcnlMaXN0LFxuICBzaWduYWwsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBjb252ZXJ0VG9EYXRlT2JqZWN0LFxuICBjcmVhdGVHcm91cHNJbkFycmF5LFxuICBlcXVhbERhdGVzLFxuICBnZXRNb250aERldGFpbHMsXG4gIGdldE1vbnRoc05hbWVzLFxuICBnZXRZZWFycyxcbiAgaXNEYXRlRGlzYWJsZWQsXG4gIGlzRGF0ZUluUmFuZ2VEaXNhYmxlZFxufSBmcm9tICcuLi9jYWxlbmRhci51dGlscyc7XG5cbmltcG9ydCB7IENhbGVuZGFyU2VydmljZSwgRGF0ZUZpbHRlclR5cGUsIERheUZvcm1hdFR5cGUsIE1vbnRoRGV0YWlscywgU2VsZWN0aW9uVHlwZSB9IGZyb20gJy4uL2NhbGVuZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJXZWVrZGF5UGlwZSB9IGZyb20gJy4vY2FsZW5kYXItd2Vla2RheS5waXBlJztcbmltcG9ydCB7IENhbGVuZGFyQ2xhc3NZZWFyUGlwZSB9IGZyb20gJy4vY2FsZW5kYXItY2xhc3MteWVhci5waXBlJztcbmltcG9ydCB7IENhbGVuZGFyQ2xhc3NNb250aFBpcGUgfSBmcm9tICcuL2NhbGVuZGFyLWNsYXNzLW1vbnRoLnBpcGUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJEYXlQaXBlIH0gZnJvbSAnLi9jYWxlbmRhci1kYXkucGlwZSc7XG5pbXBvcnQgeyBDYWxlbmRhckRheURpcmVjdGl2ZSB9IGZyb20gJy4vY2FsZW5kYXItZGF5LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDYWxlbmRhckRheVRpdGxlUGlwZSB9IGZyb20gJy4vY2FsZW5kYXItZGF5LXRpdGxlLnBpcGUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDbGFzc0RheVBpcGUgfSBmcm9tICcuL2NhbGVuZGFyLWNsYXNzLWRheS5waXBlJztcbmltcG9ydCB7IENhbGVuZGFyQ2xhc3NSb3dQaXBlIH0gZnJvbSAnLi9jYWxlbmRhci1jbGFzcy1yb3cucGlwZSc7XG5pbXBvcnQgeyBDYWxlbmRhclJvd0RpcmVjdGl2ZSB9IGZyb20gJy4vY2FsZW5kYXItcm93LmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2MtY2FsZW5kYXItbW9udGgnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItbW9udGguY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1tb250aC5jb21wb25lbnQuc2NzcyddLFxuICBleHBvcnRBczogJ2NDYWxlbmRhck1vbnRoJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENhbGVuZGFyRGF5RGlyZWN0aXZlLFxuICAgIENhbGVuZGFyRGF5UGlwZSxcbiAgICBDYWxlbmRhckRheVRpdGxlUGlwZSxcbiAgICBDYWxlbmRhclJvd0RpcmVjdGl2ZSxcbiAgICBDYWxlbmRhckNsYXNzRGF5UGlwZSxcbiAgICBDYWxlbmRhckNsYXNzTW9udGhQaXBlLFxuICAgIENhbGVuZGFyQ2xhc3NSb3dQaXBlLFxuICAgIENhbGVuZGFyQ2xhc3NZZWFyUGlwZSxcbiAgICBDYWxlbmRhcldlZWtkYXlQaXBlLFxuICAgIE5nQ2xhc3MsXG4gICAgQXN5bmNQaXBlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJNb250aENvbXBvbmVudCB7XG4gICNkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAjY2FsZW5kYXJTZXJ2aWNlID0gaW5qZWN0KENhbGVuZGFyU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jYWxlbmRhclN0YXRlU3Vic2NyaWJlKCk7XG4gIH1cblxuICByZWFkb25seSBwYWdlSW5kZXggPSBpbnB1dCgwLCB7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pO1xuXG4gIHJlYWRvbmx5IGFkZE1vbnRocyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3KCk7XG4gICAgY29uc3QgcGFnZUluZGV4ID0gdGhpcy5wYWdlSW5kZXgoKTtcbiAgICByZXR1cm4gcGFnZUluZGV4ICogKHZpZXcgPT09ICd5ZWFycycgPyAxNDQgOiB2aWV3ID09PSAnbW9udGhzJyA/IDEyIDogMSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIHNlbGVjdGVkIGRhdGUuXG4gICAqIEB0eXBlICAoRGF0ZSB8IG51bGwpXG4gICAqL1xuICByZWFkb25seSBzdGFydERhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwsIHsgZXF1YWw6IGVxdWFsRGF0ZXMgfSk7XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgc2VsZWN0ZWQgdG8gZGF0ZSAocmFuZ2UpLlxuICAgKiBAdHlwZSAgRGF0ZSB8IG51bGxcbiAgICovXG4gIHJlYWRvbmx5IGVuZERhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwsIHsgZXF1YWw6IGVxdWFsRGF0ZXMgfSk7XG5cbiAgcmVhZG9ubHkgZGF0ZXNFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGUoKTtcbiAgICAgIGNvbnN0IGVuZERhdGUgPSBzdGFydERhdGUgJiYgdGhpcy5yYW5nZSgpID8gdGhpcy5lbmREYXRlKCkgOiBudWxsO1xuICAgICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHN0YXJ0RGF0ZTogc3RhcnREYXRlLCBlbmREYXRlOiBlbmREYXRlIH0pO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgZGF0ZXMgdGhhdCBjYW5ub3QgYmUgc2VsZWN0ZWQuXG4gICAqIEB0eXBlICBEYXRlW10gfCBEYXRlW11bXVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZWREYXRlcyA9IHNpZ25hbDwoRGF0ZVtdIHwgRGF0ZSlbXT4oW10pO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkYXkgb2Ygc3RhcnQgd2Vlay5cbiAgICogLSAwIC0gU3VuZGF5LFxuICAgKiAtIDEgLSBNb25kYXksXG4gICAqIC0gMiAtIFR1ZXNkYXksXG4gICAqIC0gMyAtIFdlZG5lc2RheSxcbiAgICogLSA0IC0gVGh1cnNkYXksXG4gICAqIC0gNSAtIEZyaWRheSxcbiAgICogLSA2IC0gU2F0dXJkYXksXG4gICAqL1xuICByZWFkb25seSBmaXJzdERheU9mV2VlayA9IHNpZ25hbCgxKTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGVmYXVsdCBsb2NhbGUgZm9yIGNvbXBvbmVudHMuIElmIG5vdCBzZXQsIGl0IGlzIGluaGVyaXRlZCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAZGVmYXVsdCAnZGVmYXVsdCdcbiAgICovXG4gIHJlYWRvbmx5IGxvY2FsZSA9IHNpZ25hbCgnZGVmYXVsdCcpO1xuXG4gIC8qKlxuICAgKiBBbGxvdyByYW5nZSBzZWxlY3Rpb24uXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJhbmdlID0gc2lnbmFsKGZhbHNlKTtcblxuICAvKipcbiAgICogU2V0IGxlbmd0aCBvciBmb3JtYXQgb2YgZGF5IG5hbWUuXG4gICAqIEB0eXBlIG51bWJlciB8ICdsb25nJyB8ICduYXJyb3cnIHwgJ3Nob3J0J1xuICAgKiBAZGVmYXVsdCAnc2hvcnQnXG4gICAqL1xuICByZWFkb25seSB3ZWVrZGF5Rm9ybWF0ID0gc2lnbmFsPG51bWJlciB8ICdsb25nJyB8ICduYXJyb3cnIHwgJ3Nob3J0Jz4oJ3Nob3J0Jyk7XG5cbiAgLyoqXG4gICAqIFNldCBjYWxlbmRhciB2aWV3LlxuICAgKiBAdHlwZSAnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycydcbiAgICogQGRlZmF1bHQgJ2RheXMnXG4gICAqL1xuICByZWFkb25seSB2aWV3ID0gc2lnbmFsPCdkYXlzJyB8ICdtb250aHMnIHwgJ3llYXJzJz4oJ2RheXMnKTtcblxuICAvKipcbiAgICogTWF4IHNlbGVjdGFibGUgZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG1heERhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwsIHsgZXF1YWw6IGVxdWFsRGF0ZXMgfSk7XG5cbiAgLyoqXG4gICAqIE1pbiBzZWxlY3RhYmxlIGRhdGUuXG4gICAqL1xuICByZWFkb25seSBtaW5EYXRlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsLCB7IGVxdWFsOiBlcXVhbERhdGVzIH0pO1xuXG4gIHJlYWRvbmx5IGxpc3RPZk1vbnRocyA9IGNvbXB1dGVkPHsgeWVhcjogbnVtYmVyOyBtb250aDogc3RyaW5nIH1bXVtdPigoKSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZUdyb3Vwc0luQXJyYXkoZ2V0TW9udGhzTmFtZXModGhpcy5sb2NhbGUoKSwgdGhpcy5kYXRlKCkuZ2V0RnVsbFllYXIoKSksIDQpO1xuICB9KTtcblxuICByZWFkb25seSBsaXN0T2ZZZWFycyA9IGNvbXB1dGVkPG51bWJlcltdW10+KCgpID0+IGNyZWF0ZUdyb3Vwc0luQXJyYXkoZ2V0WWVhcnModGhpcy5kYXRlKCkuZ2V0RnVsbFllYXIoKSksIDQpKTtcblxuICAvKipcbiAgICogRGVmYXVsdCBkYXRlIG9mIHRoZSBjb21wb25lbnRcbiAgICogQHR5cGUgRGF0ZVxuICAgKi9cblxuICByZWFkb25seSBjYWxlbmRhckRhdGUgPSBzaWduYWw8RGF0ZT4obmV3IERhdGUoKSwgeyBlcXVhbDogZXF1YWxEYXRlcyB9KTtcblxuICByZWFkb25seSBkYXRlID0gY29tcHV0ZWQoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuY2FsZW5kYXJEYXRlKCk7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyB0aGlzLmFkZE1vbnRocygpLCAxLCAwLCAwLCAwLCAwKTtcbiAgICB9LFxuICAgIHsgZXF1YWw6IChhOiBEYXRlLCBiOiBEYXRlKSA9PiBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKCkgfVxuICApO1xuXG4gIHJlYWRvbmx5IGNhbGVuZGFyRGF0ZUVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgY2FsZW5kYXJEYXRlOiB0aGlzLmNhbGVuZGFyRGF0ZSgpIH0pO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgLy8gcmVhZG9ubHkgY2FsZW5kYXJEYXlzID0gdmlld0NoaWxkcmVuKENhbGVuZGFyRGF5RGlyZWN0aXZlKTtcbiAgLy8gcmVhZG9ubHkgY2FsZW5kYXJSb3dzID0gdmlld0NoaWxkcmVuKENhbGVuZGFyUm93RGlyZWN0aXZlKTtcbiAgLy9cbiAgLy8gcmVhZG9ubHkgY2FsZW5kYXJEYXlzJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmNhbGVuZGFyRGF5cyk7XG4gIC8vIHJlYWRvbmx5IGNhbGVuZGFyUm93cyQgPSB0b09ic2VydmFibGUodGhpcy5jYWxlbmRhclJvd3MpO1xuXG4gIEBWaWV3Q2hpbGRyZW4oQ2FsZW5kYXJEYXlEaXJlY3RpdmUpIGNhbGVuZGFyRGF5cyE6IFF1ZXJ5TGlzdDxDYWxlbmRhckRheURpcmVjdGl2ZT47XG4gIEBWaWV3Q2hpbGRyZW4oQ2FsZW5kYXJSb3dEaXJlY3RpdmUpIGNhbGVuZGFyUm93cyE6IFF1ZXJ5TGlzdDxDYWxlbmRhclJvd0RpcmVjdGl2ZT47XG5cbiAgcmVhZG9ubHkgZGF0ZUZpbHRlciA9IHNpZ25hbDxEYXRlRmlsdGVyVHlwZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZGF5Rm9ybWF0ID0gc2lnbmFsPERheUZvcm1hdFR5cGU+KCdudW1lcmljJyk7XG4gIHJlYWRvbmx5IHNlbGVjdEFkamFjZW50RGF5cyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNob3dBZGphY2VudERheXMgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IHNlbGVjdGlvblR5cGUgPSBzaWduYWw8U2VsZWN0aW9uVHlwZT4oJ2RheScpO1xuICByZWFkb25seSBzaG93V2Vla051bWJlciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IHdlZWtOdW1iZXJzTGFiZWwgPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgcmVhZG9ubHkgbW9udGhEZXRhaWxzID0gY29tcHV0ZWQ8TW9udGhEZXRhaWxzPigoKSA9PiB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZSgpO1xuICAgIHJldHVybiBnZXRNb250aERldGFpbHMoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIHRoaXMuZmlyc3REYXlPZldlZWsoKSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHdlZWtEYXlzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG1vbnRoRGV0YWlscyA9IHRoaXMubW9udGhEZXRhaWxzKCk7XG4gICAgcmV0dXJuIG1vbnRoRGV0YWlsc1swXS5kYXlzO1xuICB9KTtcblxuICB5ZWFyTnVtYmVyKHllYXI6IGFueSkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwKS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGUoKSwgeyB5ZWFyOiAnbnVtZXJpYycgfSk7XG4gIH1cblxuICBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uVHlwZSA9IHRoaXMuc2VsZWN0aW9uVHlwZSgpO1xuICAgIGNvbnN0IGRpc2FibGVkRGF0ZXMgPSB0aGlzLmRpc2FibGVkRGF0ZXMoKTtcbiAgICBjb25zdCBkYXRlRmlsdGVyRm4gPSB0aGlzLmRhdGVGaWx0ZXIoKTtcbiAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlKCk7XG4gICAgY29uc3QgbWluRGF0ZSA9IHRoaXMubWluRGF0ZSgpO1xuICAgIGlmIChzZWxlY3Rpb25UeXBlID09PSAneWVhcicpIHtcbiAgICAgIGNvbnN0IG1pbiA9IG1pbkRhdGUgPyBuZXcgRGF0ZShtaW5EYXRlLmdldEZ1bGxZZWFyKCksIDAsIDEsIDAsIDAsIDAsIDApIDogbnVsbDtcbiAgICAgIGNvbnN0IG1heCA9IG1heERhdGUgPyBuZXcgRGF0ZShtYXhEYXRlLmdldEZ1bGxZZWFyKCksIDExLCAzMSwgMCwgMCwgMCwgMCkgOiBudWxsO1xuICAgICAgcmV0dXJuIGlzRGF0ZURpc2FibGVkKGRhdGUsIG1pbiwgbWF4LCBkaXNhYmxlZERhdGVzKSB8fCAoZGF0ZUZpbHRlckZuID8gIWRhdGVGaWx0ZXJGbihkYXRlKSA6IGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvblR5cGUgPT09ICdtb250aCcpIHtcbiAgICAgIGNvbnN0IG1pbiA9IG1pbkRhdGUgPyBuZXcgRGF0ZShtaW5EYXRlLmdldEZ1bGxZZWFyKCksIG1pbkRhdGUuZ2V0TW9udGgoKSwgMSwgMCwgMCwgMCwgMCkgOiBudWxsO1xuICAgICAgY29uc3QgbWF4ID0gbWF4RGF0ZSA/IG5ldyBEYXRlKG1heERhdGUuZ2V0RnVsbFllYXIoKSwgbWF4RGF0ZS5nZXRNb250aCgpICsgMSwgMSwgMCwgMCwgLTEsIDApIDogbnVsbDtcbiAgICAgIHJldHVybiBpc0RhdGVEaXNhYmxlZChkYXRlLCBtaW4sIG1heCwgZGlzYWJsZWREYXRlcykgfHwgKGRhdGVGaWx0ZXJGbiA/ICFkYXRlRmlsdGVyRm4oZGF0ZSkgOiBmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiBpc0RhdGVEaXNhYmxlZChkYXRlLCBtaW5EYXRlLCBtYXhEYXRlLCBkaXNhYmxlZERhdGVzKSB8fCAoZGF0ZUZpbHRlckZuID8gIWRhdGVGaWx0ZXJGbihkYXRlKSA6IGZhbHNlKTtcbiAgfVxuXG4gIGNhbGVuZGFyQ2VsbFRpdGxlKGRhdGU6IERhdGUpIHtcbiAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGUoKSk7XG4gIH1cblxuICBoYW5kbGVDZWxsTW91c2VFbnRlcihob3ZlckRhdGU6IERhdGUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIWhvdmVyRGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlID0gdGhpcy5zZWxlY3Rpb25UeXBlKCk7XG4gICAgY29uc3QgdXBkYXRlSG92ZXJWYWx1ZSA9XG4gICAgICAoWydkYXknLCAnd2VlayddLmluY2x1ZGVzKHNlbGVjdGlvblR5cGUpICYmIHRoaXMudmlldygpID09PSAnZGF5cycpIHx8XG4gICAgICAoWydtb250aCddLmluY2x1ZGVzKHNlbGVjdGlvblR5cGUpICYmIHRoaXMudmlldygpID09PSAnbW9udGhzJykgfHxcbiAgICAgIChbJ3llYXInXS5pbmNsdWRlcyhzZWxlY3Rpb25UeXBlKSAmJiB0aGlzLnZpZXcoKSA9PT0gJ3llYXJzJyk7XG5cbiAgICAvLyBpZiAodXBkYXRlSG92ZXJWYWx1ZSkge1xuICAgIGNvbnN0IGhvdmVyVmFsdWUgPSB0aGlzLmlzRGF0ZURpc2FibGVkKGhvdmVyRGF0ZSkgfHwgIXVwZGF0ZUhvdmVyVmFsdWUgPyBudWxsIDogaG92ZXJEYXRlO1xuICAgIHRoaXMuI2NhbGVuZGFyU2VydmljZS51cGRhdGUoeyBob3ZlckRhdGU6IGhvdmVyVmFsdWUgfSk7XG4gICAgLy8gfVxuICB9XG5cbiAgaGFuZGxlWWVhckNlbGxDbGljayh5ZWFyOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25UeXBlKCkgPT09ICd5ZWFyJykge1xuICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCAwLCAxLCAwLCAwLCAwLCAwKTtcbiAgICAgIGlmICh0aGlzLnJhbmdlKCkgJiYgdGhpcy5zdGFydERhdGUoKSAmJiAhdGhpcy5lbmREYXRlKCkpIHtcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgMTIsIDEsIDAsIDAsIC0xLCAwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZGxlRGF5Q2VsbENsaWNrKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjYWxlbmRhckRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCAwLCAxLCAwLCAwLCAwLCAwKTtcbiAgICB0aGlzLnZpZXcuc2V0KCdtb250aHMnKTtcbiAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgdmlldzogdGhpcy52aWV3KCksIGNhbGVuZGFyRGF0ZTogY2FsZW5kYXJEYXRlIH0pO1xuICB9XG5cbiAgaGFuZGxlWWVhckNlbGxLZXlVcCgkZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGRhdGU6IERhdGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFsnU3BhY2UnLCAnRW50ZXInXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlWWVhckNlbGxDbGljayhkYXRlLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydUYWInLCAnQXJyb3dSaWdodCcsICdBcnJvd0xlZnQnLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2VsbE1vdXNlRW50ZXIobmV3IERhdGUoZGF0ZSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vbnRoQ2VsbEtleVVwKCRldmVudDogS2V5Ym9hcmRFdmVudCwgZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydTcGFjZScsICdFbnRlciddLmluY2x1ZGVzKCRldmVudC5jb2RlKSkge1xuICAgICAgdGhpcy5oYW5kbGVNb250aENlbGxDbGljayhkYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFsnVGFiJywgJ0Fycm93UmlnaHQnLCAnQXJyb3dMZWZ0JywgJ0Fycm93VXAnLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoJGV2ZW50LmNvZGUpKSB7XG4gICAgICB0aGlzLmhhbmRsZUNlbGxNb3VzZUVudGVyKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vbnRoQ2VsbENsaWNrKHZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25UeXBlKCkgPT09ICdtb250aCcpIHtcbiAgICAgIGxldCBkYXRlID0gbmV3IERhdGUodmFsdWUuZ2V0RnVsbFllYXIoKSwgdmFsdWUuZ2V0TW9udGgoKSwgMSwgMCwgMCwgMCwgMCk7XG4gICAgICBpZiAodGhpcy5yYW5nZSgpICYmIHRoaXMuc3RhcnREYXRlKCkgJiYgIXRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSArIDEsIDEsIDAsIDAsIC0xLCAwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZGxlRGF5Q2VsbENsaWNrKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZpZXcuc2V0KCdkYXlzJyk7XG4gICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHZpZXc6IHRoaXMudmlldygpIH0pO1xuICAgIC8vIHRoaXMuc2V0Q2FsZW5kYXJQYWdlKDAsIDAsIHZhbHVlLmdldE1vbnRoKCkgLSB0aGlzLmFkZE1vbnRocygpKTtcbiAgICBjb25zdCBjYWxlbmRhckRhdGUgPSBuZXcgRGF0ZSh2YWx1ZS5nZXRGdWxsWWVhcigpLCB2YWx1ZS5nZXRNb250aCgpIC0gdGhpcy5hZGRNb250aHMoKSwgMSwgMCwgMCwgMCwgMCk7XG4gICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IGNhbGVuZGFyRGF0ZTogY2FsZW5kYXJEYXRlIH0pO1xuICB9XG5cbiAgc2V0Q2FsZW5kYXJQYWdlKHllYXJzOiBudW1iZXIsIG1vbnRocyA9IDAsIHNldE1vbnRoPzogbnVtYmVyKSB7XG4gICAgY29uc3QgeWVhciA9IHRoaXMuZGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSB0aGlzLmRhdGUoKS5nZXRNb250aCgpO1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSwgMCwgMCwgMCwgMCk7XG5cbiAgICB5ZWFycyAmJiBkLnNldEZ1bGxZZWFyKGQuZ2V0RnVsbFllYXIoKSArIHllYXJzKTtcbiAgICBtb250aHMgJiYgZC5zZXRNb250aChkLmdldE1vbnRoKCkgKyBtb250aHMpO1xuICAgIHR5cGVvZiBzZXRNb250aCA9PT0gJ251bWJlcicgJiYgZC5zZXRNb250aChzZXRNb250aCk7XG5cbiAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgY2FsZW5kYXJEYXRlOiBkIH0pO1xuICB9XG5cbiAgaGFuZGxlRGF5Q2VsbEtleURvd24oJGV2ZW50OiBLZXlib2FyZEV2ZW50LCBkYXRlOiBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghWydUYWInLCAnQXJyb3dSaWdodCcsICdBcnJvd0xlZnQnLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5oYW5kbGVDZWxsTW91c2VFbnRlcihkYXRlKTtcblxuICAgIGNvbnN0IGV2ZW50S2V5ID0gJGV2ZW50LmtleSA9PT0gJ1RhYicgPyAoJGV2ZW50LnNoaWZ0S2V5ID8gJ0Fycm93TGVmdCcgOiAnQXJyb3dSaWdodCcpIDogJGV2ZW50LmtleTtcbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlID0gdGhpcy5zZWxlY3Rpb25UeXBlKCk7XG4gICAgY29uc3QgdmlldyA9IHRoaXMudmlldygpO1xuICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heERhdGUoKTtcbiAgICBpZiAoXG4gICAgICBtYXhEYXRlICYmXG4gICAgICBkYXRlID49IGNvbnZlcnRUb0RhdGVPYmplY3QobWF4RGF0ZSwgc2VsZWN0aW9uVHlwZSkgJiZcbiAgICAgIFsnQXJyb3dSaWdodCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcyhldmVudEtleSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWluRGF0ZSA9IHRoaXMubWluRGF0ZSgpO1xuICAgIGlmIChtaW5EYXRlICYmIGRhdGUgPD0gY29udmVydFRvRGF0ZU9iamVjdChtaW5EYXRlLCBzZWxlY3Rpb25UeXBlKSAmJiBbJ0Fycm93TGVmdCcsICdBcnJvd1VwJ10uaW5jbHVkZXMoZXZlbnRLZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGVsZW1lbnQgPSAkZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKHNlbGVjdGlvblR5cGUgPT09ICd3ZWVrJyAmJiB2aWV3ID09PSAnZGF5cycgJiYgZWxlbWVudC50YWJJbmRleCA9PT0gLTEpIHtcbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJ3RyW3RhYmluZGV4PVwiMFwiXScpIGFzIEhUTUxFbGVtZW50O1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gWyd3ZWVrJ10uaW5jbHVkZXMoc2VsZWN0aW9uVHlwZSkgJiYgdmlldyA9PT0gJ2RheXMnID8gdGhpcy5jYWxlbmRhclJvd3MgOiB0aGlzLmNhbGVuZGFyRGF5cztcblxuICAgIGNvbnN0IGxpc3QgPSBlbGVtZW50c1xuICAgICAgLnRvQXJyYXkoKVxuICAgICAgLm1hcCgoY2FsZW5kYXJDZWxsKSA9PiBjYWxlbmRhckNlbGwuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KVxuICAgICAgLy8gLmZpbHRlcigoZWxlbWVudCkgPT4gdGhpcy5zZWxlY3Rpb25UeXBlID09PSAnd2VlaycgPyBlbGVtZW50Py50YWJJbmRleCA9PT0gMCA6IGVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygnY3VycmVudCcpKVxuICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gZWxlbWVudD8udGFiSW5kZXggPT09IDApO1xuXG4gICAgY29uc3QgaW5kZXggPSBsaXN0LmluZGV4T2YoZWxlbWVudCk7XG4gICAgY29uc3QgZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICBjb25zdCBsYXN0ID0gaW5kZXggPT09IGxpc3QubGVuZ3RoIC0gMTtcblxuICAgIGNvbnN0IHRvQm91bmRhcnkgPSB7XG4gICAgICBzdGFydDogaW5kZXgsXG4gICAgICBlbmQ6IGxpc3QubGVuZ3RoIC0gKGluZGV4ICsgMSlcbiAgICB9O1xuXG4gICAgY29uc3QgZ2FwID0ge1xuICAgICAgQXJyb3dSaWdodDogMSxcbiAgICAgIEFycm93TGVmdDogLTEsXG4gICAgICBBcnJvd1VwOiBzZWxlY3Rpb25UeXBlID09PSAnd2VlaycgJiYgdmlldyA9PT0gJ2RheXMnID8gLTEgOiB2aWV3ID09PSAnZGF5cycgPyAtNyA6IC0zLFxuICAgICAgQXJyb3dEb3duOiBzZWxlY3Rpb25UeXBlID09PSAnd2VlaycgJiYgdmlldyA9PT0gJ2RheXMnID8gMSA6IHZpZXcgPT09ICdkYXlzJyA/IDcgOiAzXG4gICAgfTtcblxuICAgIGlmIChcbiAgICAgIChldmVudEtleSA9PT0gJ0Fycm93UmlnaHQnICYmIGxhc3QpIHx8XG4gICAgICAoZXZlbnRLZXkgPT09ICdBcnJvd0Rvd24nICYmIHRvQm91bmRhcnkuZW5kIDwgZ2FwLkFycm93RG93bikgfHxcbiAgICAgIChldmVudEtleSA9PT0gJ0Fycm93TGVmdCcgJiYgZmlyc3QpIHx8XG4gICAgICAoZXZlbnRLZXkgPT09ICdBcnJvd1VwJyAmJiB0b0JvdW5kYXJ5LnN0YXJ0IDwgTWF0aC5hYnMoZ2FwLkFycm93VXApKVxuICAgICkge1xuICAgICAgZWxlbWVudHMuY2hhbmdlc1xuICAgICAgICAucGlwZSh0YWtlKDEpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy4jZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZTogUXVlcnlMaXN0PENhbGVuZGFyUm93RGlyZWN0aXZlIHwgQ2FsZW5kYXJEYXlEaXJlY3RpdmU+KSA9PiB7XG4gICAgICAgICAgY29uc3QgX2xpc3QgPSBjaGFuZ2VcbiAgICAgICAgICAgIC50b0FycmF5KClcbiAgICAgICAgICAgIC8vIC5maWx0ZXIoZWxlbWVudCA9PiB0aGlzLnNlbGVjdGlvblR5cGUgPT09ICd3ZWVrJyA/IGVsZW1lbnQ/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50YWJJbmRleCA9PT0gMCA6IGVsZW1lbnQ/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2N1cnJlbnQnKSk7XG4gICAgICAgICAgICAuZmlsdGVyKChkaXJlY3RpdmUpID0+IGRpcmVjdGl2ZT8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRhYkluZGV4ID09PSAwKTtcblxuICAgICAgICAgIGlmIChfbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBkYXlUb0ZvY3VzOiBDYWxlbmRhckRheURpcmVjdGl2ZSB8IENhbGVuZGFyUm93RGlyZWN0aXZlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgc3dpdGNoIChldmVudEtleSkge1xuICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0Jzoge1xuICAgICAgICAgICAgICAgIGRheVRvRm9jdXMgPSBfbGlzdFswXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOiB7XG4gICAgICAgICAgICAgICAgZGF5VG9Gb2N1cyA9IF9saXN0W19saXN0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6IHtcbiAgICAgICAgICAgICAgICBkYXlUb0ZvY3VzID0gX2xpc3RbZ2FwLkFycm93RG93biAtIChsaXN0Lmxlbmd0aCAtIGluZGV4KV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6IHtcbiAgICAgICAgICAgICAgICBkYXlUb0ZvY3VzID0gX2xpc3RbX2xpc3QubGVuZ3RoIC0gKE1hdGguYWJzKGdhcC5BcnJvd1VwKSArIDEgLSAoaW5kZXggKyAxKSldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRheVRvRm9jdXM/LmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdkYXlUb0ZvY3VzJywgZGF5VG9Gb2N1cz8uZGF0ZSk7XG4gICAgICAgICAgICAgIGRheVRvRm9jdXM/LmZvY3VzKCdrZXlib2FyZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIHN3aXRjaCAodmlldykge1xuICAgICAgICBjYXNlICdkYXlzJzpcbiAgICAgICAgICB0aGlzLnNldENhbGVuZGFyUGFnZSgwLCBbJ0Fycm93UmlnaHQnLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoZXZlbnRLZXkpID8gMSA6IC0xKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbW9udGhzJzpcbiAgICAgICAgICB0aGlzLnNldENhbGVuZGFyUGFnZShbJ0Fycm93UmlnaHQnLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoZXZlbnRLZXkpID8gMSA6IC0xKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAneWVhcnMnOlxuICAgICAgICAgIHRoaXMuc2V0Q2FsZW5kYXJQYWdlKFsnQXJyb3dSaWdodCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcyhldmVudEtleSkgPyAxMiA6IC0xMik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSBsaXN0W2luZGV4ICsgZ2FwW2V2ZW50S2V5XV07XG4gICAgaWYgKG5leHRFbGVtZW50Py50YWJJbmRleCA9PT0gMCkge1xuICAgICAgbmV4dEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPCBsaXN0Lmxlbmd0aDsgbGlzdC5sZW5ndGggJiYgWydBcnJvd1JpZ2h0JywgJ0Fycm93RG93biddLmluY2x1ZGVzKGV2ZW50S2V5KSA/IGkrKyA6IGktLSkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBsaXN0W2kgKyBnYXBbZXZlbnRLZXldXTtcbiAgICAgIGlmIChuZXh0RWxlbWVudD8udGFiSW5kZXggPT09IDApIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBuZXh0RWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpZiAoIW5leHRFbGVtZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNlbGxNb3VzZUxlYXZlKCkge1xuICAgIHRoaXMuI2NhbGVuZGFyU2VydmljZS51cGRhdGUoeyBob3ZlckRhdGU6IG51bGwgfSk7XG4gIH1cblxuICBoYW5kbGVEYXlDZWxsS2V5VXAoJGV2ZW50OiBLZXlib2FyZEV2ZW50LCBkYXRlOiBEYXRlKSB7XG4gICAgaWYgKFsnU3BhY2UnLCAnRW50ZXInXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlRGF5Q2VsbENsaWNrKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydUYWInLCAnQXJyb3dSaWdodCcsICdBcnJvd0xlZnQnLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2VsbE1vdXNlRW50ZXIoZGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRGF5Q2VsbENsaWNrKGRhdGU6IERhdGUpIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25UeXBlKCkgPT09ICdkYXknICYmIHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucmFuZ2UoKSkge1xuICAgICAgdGhpcy5lbmREYXRlLnNldChudWxsKTtcbiAgICAgIHRoaXMuc3RhcnREYXRlLnNldChkYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZSgpO1xuICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLmVuZERhdGUoKTtcblxuICAgIGlmIChzdGFydERhdGUgJiYgZW5kRGF0ZSkge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KG51bGwpO1xuICAgICAgdGhpcy5lbmREYXRlLnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISFzdGFydERhdGUgJiYgIWVuZERhdGUpIHtcbiAgICAgIGlmIChzdGFydERhdGUgJiYgZGF0ZSA8IHN0YXJ0RGF0ZSkge1xuICAgICAgICB0aGlzLmVuZERhdGUuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhZGREYXlzID0gdGhpcy5zZWxlY3Rpb25UeXBlKCkgIT09ICd3ZWVrJyA/IDEgOiA3O1xuICAgICAgICB0aGlzLmVuZERhdGUuc2V0KG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSArIGFkZERheXMsIDAsIDAsIC0xLCAwKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5kRGF0ZS5zZXQobnVsbCk7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF0ZSk7XG4gICAgfVxuICAgIHtcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlKCk7XG4gICAgICBjb25zdCBlbmREYXRlID0gdGhpcy5lbmREYXRlKCk7XG4gICAgICBpZiAoc3RhcnREYXRlICYmIGVuZERhdGUpIHtcbiAgICAgICAgY29uc3QgZGF0ZUZpbHRlckZuID0gdGhpcy5kYXRlRmlsdGVyKCk7XG4gICAgICAgIGlmIChpc0RhdGVJblJhbmdlRGlzYWJsZWQoc3RhcnREYXRlLCBlbmREYXRlLCB0aGlzLmRpc2FibGVkRGF0ZXMoKSwgZGF0ZUZpbHRlckZuKSkge1xuICAgICAgICAgIHRoaXMuc3RhcnREYXRlLnNldChudWxsKTtcbiAgICAgICAgICB0aGlzLmVuZERhdGUuc2V0KG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbGVuZGFyU3RhdGVTdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLmNhbGVuZGFyU3RhdGUkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuI2Rlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc3RhdGUpO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGlmIChrZXkgaW4gdGhpcykge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdCBpc1dyaXRhYmxlU2lnbmFsID0gdHlwZW9mIHRoaXNba2V5XSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdGhpc1trZXldLnNldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgaXNXcml0YWJsZVNpZ25hbCA/IHRoaXNba2V5XS5zZXQoc3RhdGVba2V5XSkgOiAodGhpc1trZXldID0gc3RhdGVba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldE1vbnRoU3RhcnQoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLmNhbGVuZGFyRGF0ZSgpLmdldEZ1bGxZZWFyKCksIGluZGV4ICsgdGhpcy5hZGRNb250aHMoKSwgMSwgMCwgMCwgMCwgMCk7XG4gIH1cblxuICBnZXRNb250aEVuZChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuY2FsZW5kYXJEYXRlKCkuZ2V0RnVsbFllYXIoKSwgaW5kZXggKyAxICsgdGhpcy5hZGRNb250aHMoKSwgMSwgMCwgMCwgLTEsIDApO1xuICB9XG5cbiAgZ2V0WWVhclN0YXJ0KHllYXI6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwLCAxKTtcbiAgfVxuXG4gIGdldFllYXJFbmQoeWVhcjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIDExLCAxLCAwLCAwLCAtMSwgMCk7XG4gIH1cbn1cbiIsIjx0YWJsZT5cbiAgQGlmICh2aWV3KCkgPT09ICdkYXlzJykge1xuICAgIDx0aGVhZD5cbiAgICA8dHI+XG4gICAgICBAaWYgKHNob3dXZWVrTnVtYmVyKCkpIHtcbiAgICAgICAgPHRoIGNsYXNzPVwiY2FsZW5kYXItY2VsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXItY2VsbC1pbm5lclwiPnt7IHdlZWtOdW1iZXJzTGFiZWwoKSB9fTwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgfVxuICAgICAgQGZvciAod2Vla0RheSBvZiB3ZWVrRGF5cygpOyB0cmFjayB3ZWVrRGF5LmRhdGU7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIEBsZXQgZGF0ZSA9IHdlZWtEYXkuZGF0ZSA7XG4gICAgICAgIDx0aCBjbGFzcz1cImNhbGVuZGFyLWNlbGxcIiBhYmJyPVwie3tkYXRlIHwgY2FsZW5kYXJXZWVrZGF5Oidsb25nJzpsb2NhbGUoKX19XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWhlYWRlci1jZWxsLWlubmVyXCI+XG4gICAgICAgICAgICB7eyBkYXRlIHwgY2FsZW5kYXJXZWVrZGF5OndlZWtkYXlGb3JtYXQoKTpsb2NhbGUoKSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgfVxuICAgIDwvdHI+XG4gICAgPC90aGVhZD5cbiAgfVxuICA8dGJvZHkgKG1vdXNlbGVhdmUpPVwiaGFuZGxlQ2VsbE1vdXNlTGVhdmUoKVwiPlxuICAgIEBzd2l0Y2ggKHZpZXcoKSkge1xuICAgICAgQGNhc2UgKCd5ZWFycycpIHtcbiAgICAgICAgQGZvciAoeWVhcnNSb3cgb2YgbGlzdE9mWWVhcnMoKTsgdHJhY2sgeWVhcnNSb3dbMF07IGxldCByb3dJZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICBAZm9yICh5ZWFyIG9mIHllYXJzUm93OyB0cmFjayB5ZWFyOyBsZXQgaWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICNjYWxlbmRhclllYXI9XCJjQ2FsZW5kYXJEYXlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIhY2FsZW5kYXJZZWFyLmRpc2FibGVkJCgpICYmIGhhbmRsZVllYXJDZWxsQ2xpY2soeWVhcilcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImNhbGVuZGFyWWVhci5kYXRlKCkgJiYgaGFuZGxlRGF5Q2VsbEtleURvd24oJGV2ZW50LCBjYWxlbmRhclllYXIuZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKGtleXVwKT1cImhhbmRsZVllYXJDZWxsS2V5VXAoJGV2ZW50LCBjYWxlbmRhclllYXIuZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiY2FsZW5kYXJZZWFyLmRhdGUoKSAmJiBoYW5kbGVDZWxsTW91c2VFbnRlcihjYWxlbmRhclllYXIuZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjYWxlbmRhclllYXIuZGF0ZSgpPy5nZXRGdWxsWWVhcigpXCJcbiAgICAgICAgICAgICAgICBbZGF0ZV09XCJnZXRZZWFyU3RhcnQoeWVhcilcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInllYXIgfCBjYWxlbmRhckNsYXNzWWVhclwiXG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cImNhbGVuZGFyWWVhci5kaXNhYmxlZCQoKSA/IC0xIDogMFwiXG4gICAgICAgICAgICAgICAgY0NhbGVuZGFyRGF5XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY2VsbC1pbm5lclwiPlxuICAgICAgICAgICAgICAgICAge3sgeWVhck51bWJlcih5ZWFyKSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEBjYXNlICgnbW9udGhzJykge1xuICAgICAgICBAZm9yIChtb250aHNSb3cgb2YgbGlzdE9mTW9udGhzKCk7IHRyYWNrIG1vbnRoc1Jvd1swXTsgbGV0IHJvd0lkeCA9ICRpbmRleCkge1xuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIEBmb3IgKG1vbnRoIG9mIG1vbnRoc1JvdzsgdHJhY2sgbW9udGg7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgQGxldCBtb250aFN0YXJ0ID0gZ2V0TW9udGhTdGFydChyb3dJZHgqMytpZHgpO1xuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAjY2FsZW5kYXJNb250aD1cImNDYWxlbmRhckRheVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFjYWxlbmRhck1vbnRoLmRpc2FibGVkJCgpICYmIGhhbmRsZU1vbnRoQ2VsbENsaWNrKGNhbGVuZGFyTW9udGguZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiY2FsZW5kYXJNb250aC5kYXRlKCkgJiYgaGFuZGxlRGF5Q2VsbEtleURvd24oJGV2ZW50LCBjYWxlbmRhck1vbnRoLmRhdGUoKSlcIlxuICAgICAgICAgICAgICAgIChrZXl1cCk9XCJoYW5kbGVNb250aENlbGxLZXlVcCgkZXZlbnQsIGNhbGVuZGFyTW9udGguZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiY2FsZW5kYXJNb250aC5kYXRlKCkgJiYgaGFuZGxlQ2VsbE1vdXNlRW50ZXIoY2FsZW5kYXJNb250aC5kYXRlKCkpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNhbGVuZGFyTW9udGguZGF0ZSgpPy5nZXRGdWxsWWVhcigpKycgJyttb250aC5tb250aFwiXG4gICAgICAgICAgICAgICAgW2RhdGVdPVwibW9udGhTdGFydFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibW9udGhTdGFydCB8IGNhbGVuZGFyQ2xhc3NNb250aDoocm93SWR4KjMraWR4KVwiXG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cImNhbGVuZGFyTW9udGguZGlzYWJsZWQkKCkgPyAtMSA6IDBcIlxuICAgICAgICAgICAgICAgIGNDYWxlbmRhckRheVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNlbGwtaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgIHt7IG1vbnRoLm1vbnRoIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgICBAZGVmYXVsdCB7XG4gICAgICAgIEBsZXQgd2Vla1NlbGVjdGlvbiA9IHNlbGVjdGlvblR5cGUoKSA9PT0gJ3dlZWsnO1xuICAgICAgICBAbGV0IGRheVNlbGVjdGlvbiA9IHNlbGVjdGlvblR5cGUoKSA9PT0gJ2RheSc7XG4gICAgICAgIEBmb3IgKHdlZWsgb2YgbW9udGhEZXRhaWxzKCk7IHRyYWNrIHdlZWsuZGF5c1swXTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICA8dHIgI2NhbGVuZGFyUm93PVwiY0NhbGVuZGFyUm93XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIndlZWtTZWxlY3Rpb24gJiYgKGNhbGVuZGFyUm93LmN1cnJlbnQpICYmIGNhbGVuZGFyUm93LmRhdGUgJiYgaGFuZGxlRGF5Q2VsbENsaWNrKGNhbGVuZGFyUm93LmRhdGUpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24pPVwid2Vla1NlbGVjdGlvbiAmJiAoY2FsZW5kYXJSb3cuY3VycmVudCkgJiYgY2FsZW5kYXJSb3cuZGF0ZSAmJiBoYW5kbGVEYXlDZWxsS2V5RG93bigkZXZlbnQsIGNhbGVuZGFyUm93LmRhdGUpXCJcbiAgICAgICAgICAgICAgKGtleXVwKT1cIndlZWtTZWxlY3Rpb24gJiYgKGNhbGVuZGFyUm93LmN1cnJlbnQpICYmIGNhbGVuZGFyUm93LmRhdGUgJiYgaGFuZGxlRGF5Q2VsbEtleVVwKCRldmVudCwgY2FsZW5kYXJSb3cuZGF0ZSlcIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJ3ZWVrU2VsZWN0aW9uICYmIGNhbGVuZGFyUm93LmRhdGUgJiYgaGFuZGxlQ2VsbE1vdXNlRW50ZXIoY2FsZW5kYXJSb3cuZGF0ZSlcIlxuICAgICAgICAgICAgICBbY0NhbGVuZGFyUm93XT1cIndlZWtcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBpZiAoc2hvd1dlZWtOdW1iZXIoKSkge1xuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjYWxlbmRhci1jZWxsLXdlZWstbnVtYmVyXCI+XG4gICAgICAgICAgICAgICAge3sgd2Vlay53ZWVrTnVtYmVyID09PSAwID8gNTMgOiB3ZWVrLndlZWtOdW1iZXIgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBmb3IgKGRhdGVPYmogb2Ygd2Vlay5kYXlzOyB0cmFjayBkYXRlT2JqLmRhdGU7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgQGxldCBjdXJyZW50TW9udGggPSBkYXRlT2JqLm1vbnRoID09PSAnY3VycmVudCc7XG4gICAgICAgICAgICAgIEBpZiAoY3VycmVudE1vbnRoIHx8IHNob3dBZGphY2VudERheXMoKSkge1xuICAgICAgICAgICAgICAgIEBsZXQgc2VsZWN0YWJsZSA9IGRheVNlbGVjdGlvbiAmJiAoY3VycmVudE1vbnRoIHx8IHNlbGVjdEFkamFjZW50RGF5cygpKTtcbiAgICAgICAgICAgICAgICA8dGQgI2NhbGVuZGFyQ2VsbD1cImNDYWxlbmRhckRheVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RhYmxlICYmIGhhbmRsZURheUNlbGxDbGljayhkYXRlT2JqLmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwic2VsZWN0YWJsZSAmJiBoYW5kbGVEYXlDZWxsS2V5RG93bigkZXZlbnQsIGRhdGVPYmouZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwic2VsZWN0YWJsZSAmJiBoYW5kbGVEYXlDZWxsS2V5VXAoJGV2ZW50LCBkYXRlT2JqLmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2VsZWN0YWJsZSAmJiBoYW5kbGVDZWxsTW91c2VFbnRlcihkYXRlT2JqLmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkYXRlT2JqLmRhdGUgfCBjYWxlbmRhckRheVRpdGxlOmxvY2FsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGVdPVwiZGF0ZU9iai5kYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW21vbnRoXT1cImRhdGVPYmoubW9udGhcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJkYXRlT2JqIHwgY2FsZW5kYXJDbGFzc0RheTp7bWluRGF0ZTogbWluRGF0ZSgpLCBtYXhEYXRlOiBtYXhEYXRlKCksIGRpc2FibGVkRGF0ZXM6IGRpc2FibGVkRGF0ZXMoKSwgZGF0ZUZpbHRlcjogZGF0ZUZpbHRlcigpfVwiXG4gICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJzZWxlY3RhYmxlICYmICFpc0RhdGVEaXNhYmxlZChkYXRlT2JqLmRhdGUpID8gMCA6IC0xXCJcbiAgICAgICAgICAgICAgICAgICAgY0NhbGVuZGFyRGF5XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNlbGwtaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9iai5kYXRlIHwgY2FsZW5kYXJEYXk6ZGF5Rm9ybWF0KCk6bG9jYWxlKCkgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNhbGVuZGFyLWNlbGxcIj48L3RkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgPC90Ym9keT5cbjwvdGFibGU+XG5cbiJdfQ==