@mintplayer/ng-bootstrap 15.16.2 → 15.17.1

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 (1121) hide show
  1. package/README.md +7 -7
  2. package/_bootstrap.scss +63 -63
  3. package/accordion/index.d.ts +1 -1
  4. package/accordion/src/accordion/accordion.component.d.ts +10 -10
  5. package/accordion/src/accordion-tab/accordion-tab.component.d.ts +17 -17
  6. package/accordion/src/accordion-tab-header/accordion-tab-header.component.d.ts +9 -9
  7. package/accordion/src/accordion.module.d.ts +10 -10
  8. package/accordion/src/index.d.ts +4 -4
  9. package/alert/index.d.ts +1 -1
  10. package/alert/src/alert/alert.component.d.ts +15 -15
  11. package/alert/src/alert-close/alert-close.component.d.ts +9 -9
  12. package/alert/src/alert.module.d.ts +9 -9
  13. package/alert/src/index.d.ts +3 -3
  14. package/badge/index.d.ts +1 -1
  15. package/badge/src/badge.component.d.ts +15 -15
  16. package/badge/src/badge.module.d.ts +8 -8
  17. package/badge/src/index.d.ts +2 -2
  18. package/breadcrumb/index.d.ts +1 -1
  19. package/breadcrumb/src/breadcrumb/breadcrumb.component.d.ts +8 -8
  20. package/breadcrumb/src/breadcrumb-item/breadcrumb-item.component.d.ts +9 -9
  21. package/breadcrumb/src/breadcrumb.module.d.ts +9 -9
  22. package/breadcrumb/src/index.d.ts +3 -3
  23. package/button-group/index.d.ts +1 -1
  24. package/button-group/src/button-group/button-group.component.d.ts +8 -8
  25. package/button-group/src/button-group.module.d.ts +8 -8
  26. package/button-group/src/index.d.ts +2 -2
  27. package/button-type/index.d.ts +1 -1
  28. package/button-type/src/button-type/button-type.directive.d.ts +9 -9
  29. package/button-type/src/button-type/button-type.module.d.ts +8 -8
  30. package/button-type/src/index.d.ts +2 -2
  31. package/calendar/index.d.ts +1 -1
  32. package/calendar/src/calendar.component.d.ts +26 -26
  33. package/calendar/src/calendar.module.d.ts +11 -11
  34. package/calendar/src/index.d.ts +2 -2
  35. package/calendar-month/index.d.ts +1 -1
  36. package/calendar-month/src/index.d.ts +3 -3
  37. package/calendar-month/src/interfaces/date-day-of-month.d.ts +5 -5
  38. package/calendar-month/src/interfaces/first-and-last-date.d.ts +4 -4
  39. package/calendar-month/src/interfaces/index.d.ts +4 -4
  40. package/calendar-month/src/interfaces/week.d.ts +5 -5
  41. package/calendar-month/src/interfaces/weekday.d.ts +4 -4
  42. package/calendar-month/src/pipes/index.d.ts +2 -2
  43. package/calendar-month/src/pipes/month-name/index.d.ts +2 -2
  44. package/calendar-month/src/pipes/month-name/month-name.module.d.ts +8 -8
  45. package/calendar-month/src/pipes/month-name/month-name.pipe.d.ts +7 -7
  46. package/calendar-month/src/pipes/weekday-name/index.d.ts +2 -2
  47. package/calendar-month/src/pipes/weekday-name/weekday-name.module.d.ts +8 -8
  48. package/calendar-month/src/pipes/weekday-name/weekday-name.pipe.d.ts +7 -7
  49. package/calendar-month/src/service/calendar-month.service.d.ts +18 -18
  50. package/card/index.d.ts +1 -1
  51. package/card/src/card/card.component.d.ts +5 -5
  52. package/card/src/card-header/card-header.component.d.ts +5 -5
  53. package/card/src/card.module.d.ts +9 -9
  54. package/card/src/index.d.ts +3 -3
  55. package/carousel/index.d.ts +1 -1
  56. package/carousel/src/carousel/carousel.component.d.ts +25 -26
  57. package/carousel/src/carousel-image/carousel-image.directive.d.ts +10 -9
  58. package/carousel/src/carousel.module.d.ts +11 -10
  59. package/carousel/src/index.d.ts +3 -3
  60. package/close/index.d.ts +1 -1
  61. package/close/src/close.component.d.ts +10 -10
  62. package/close/src/close.module.d.ts +8 -8
  63. package/close/src/index.d.ts +2 -2
  64. package/code-snippet/index.d.ts +1 -1
  65. package/code-snippet/src/code-snippet.component.d.ts +14 -14
  66. package/code-snippet/src/code-snippet.module.d.ts +11 -11
  67. package/code-snippet/src/index.d.ts +2 -2
  68. package/context-menu/index.d.ts +1 -1
  69. package/context-menu/src/context-menu.directive.d.ts +18 -18
  70. package/context-menu/src/context-menu.module.d.ts +10 -10
  71. package/context-menu/src/index.d.ts +2 -2
  72. package/copy/index.d.ts +1 -1
  73. package/copy/src/copy.directive.d.ts +11 -11
  74. package/copy/src/copy.module.d.ts +8 -8
  75. package/copy/src/index.d.ts +2 -2
  76. package/datatable/index.d.ts +1 -1
  77. package/datatable/src/datatable/datatable.component.d.ts +19 -19
  78. package/datatable/src/datatable-column/datatable-column-metadata.d.ts +4 -4
  79. package/datatable/src/datatable-column/datatable-column.directive.d.ts +10 -10
  80. package/datatable/src/datatable-column/index.d.ts +2 -2
  81. package/datatable/src/datatable-settings.d.ts +15 -15
  82. package/datatable/src/datatable.module.d.ts +13 -13
  83. package/datatable/src/index.d.ts +5 -5
  84. package/datatable/src/row-template/row-template.directive.d.ts +9 -9
  85. package/datepicker/index.d.ts +1 -1
  86. package/datepicker/src/datepicker.component.d.ts +16 -16
  87. package/datepicker/src/datepicker.module.d.ts +12 -12
  88. package/datepicker/src/index.d.ts +2 -2
  89. package/dropdown/index.d.ts +1 -1
  90. package/dropdown/src/dropdown/dropdown.directive.d.ts +23 -23
  91. package/dropdown/src/dropdown-menu/dropdown-menu.directive.d.ts +23 -23
  92. package/dropdown/src/dropdown-toggle/dropdown-toggle.directive.d.ts +11 -11
  93. package/dropdown/src/dropdown.module.d.ts +13 -13
  94. package/dropdown/src/index.d.ts +4 -4
  95. package/dropdown-divider/index.d.ts +1 -0
  96. package/dropdown-divider/src/dropdown-divider.directive.d.ts +6 -0
  97. package/dropdown-divider/src/dropdown-divider.module.d.ts +8 -0
  98. package/dropdown-divider/src/index.d.ts +2 -0
  99. package/dropdown-menu/index.d.ts +1 -1
  100. package/dropdown-menu/src/dropdown-item/dropdown-item.component.d.ts +7 -7
  101. package/dropdown-menu/src/dropdown-menu/dropdown-menu.component.d.ts +14 -14
  102. package/dropdown-menu/src/dropdown-menu.module.d.ts +10 -9
  103. package/dropdown-menu/src/index.d.ts +3 -3
  104. package/enhanced-paste/index.d.ts +1 -1
  105. package/enhanced-paste/src/directive/enhanced-paste.directive.d.ts +14 -14
  106. package/enhanced-paste/src/enhanced-paste.module.d.ts +8 -8
  107. package/enhanced-paste/src/index.d.ts +3 -3
  108. package/enhanced-paste/src/interfaces/number-overflow.d.ts +5 -5
  109. package/enum/index.d.ts +1 -1
  110. package/enum/src/index.d.ts +2 -2
  111. package/enum/src/interfaces/enum-item.d.ts +4 -4
  112. package/enum/src/interfaces/index.d.ts +1 -1
  113. package/enum/src/service/enum.service.d.ts +9 -9
  114. package/esm2020/accordion/index.mjs +1 -1
  115. package/esm2020/accordion/mintplayer-ng-bootstrap-accordion.mjs +4 -4
  116. package/esm2020/accordion/src/accordion/accordion.component.mjs +21 -21
  117. package/esm2020/accordion/src/accordion-tab/accordion-tab.component.mjs +63 -63
  118. package/esm2020/accordion/src/accordion-tab-header/accordion-tab-header.component.mjs +20 -20
  119. package/esm2020/accordion/src/accordion.module.mjs +34 -34
  120. package/esm2020/accordion/src/index.mjs +5 -5
  121. package/esm2020/alert/index.mjs +2 -2
  122. package/esm2020/alert/mintplayer-ng-bootstrap-alert.mjs +4 -4
  123. package/esm2020/alert/src/alert/alert.component.mjs +41 -41
  124. package/esm2020/alert/src/alert-close/alert-close.component.mjs +20 -20
  125. package/esm2020/alert/src/alert.module.mjs +27 -27
  126. package/esm2020/alert/src/index.mjs +4 -4
  127. package/esm2020/badge/index.mjs +2 -2
  128. package/esm2020/badge/mintplayer-ng-bootstrap-badge.mjs +4 -4
  129. package/esm2020/badge/src/badge.component.mjs +30 -30
  130. package/esm2020/badge/src/badge.module.mjs +18 -18
  131. package/esm2020/badge/src/index.mjs +3 -3
  132. package/esm2020/breadcrumb/index.mjs +2 -2
  133. package/esm2020/breadcrumb/mintplayer-ng-bootstrap-breadcrumb.mjs +4 -4
  134. package/esm2020/breadcrumb/src/breadcrumb/breadcrumb.component.mjs +13 -13
  135. package/esm2020/breadcrumb/src/breadcrumb-item/breadcrumb-item.component.mjs +18 -18
  136. package/esm2020/breadcrumb/src/breadcrumb.module.mjs +19 -19
  137. package/esm2020/breadcrumb/src/index.mjs +4 -4
  138. package/esm2020/button-group/index.mjs +2 -2
  139. package/esm2020/button-group/mintplayer-ng-bootstrap-button-group.mjs +4 -4
  140. package/esm2020/button-group/src/button-group/button-group.component.mjs +13 -13
  141. package/esm2020/button-group/src/button-group.module.mjs +18 -18
  142. package/esm2020/button-group/src/index.mjs +3 -3
  143. package/esm2020/button-type/index.mjs +2 -2
  144. package/esm2020/button-type/mintplayer-ng-bootstrap-button-type.mjs +4 -4
  145. package/esm2020/button-type/src/button-type/button-type.directive.mjs +30 -30
  146. package/esm2020/button-type/src/button-type/button-type.module.mjs +24 -24
  147. package/esm2020/button-type/src/index.mjs +3 -3
  148. package/esm2020/calendar/index.mjs +2 -2
  149. package/esm2020/calendar/mintplayer-ng-bootstrap-calendar.mjs +4 -4
  150. package/esm2020/calendar/src/calendar.component.mjs +105 -105
  151. package/esm2020/calendar/src/calendar.module.mjs +39 -39
  152. package/esm2020/calendar/src/index.mjs +3 -3
  153. package/esm2020/calendar-month/index.mjs +2 -2
  154. package/esm2020/calendar-month/mintplayer-ng-bootstrap-calendar-month.mjs +4 -4
  155. package/esm2020/calendar-month/src/index.mjs +4 -4
  156. package/esm2020/calendar-month/src/interfaces/date-day-of-month.mjs +2 -2
  157. package/esm2020/calendar-month/src/interfaces/first-and-last-date.mjs +2 -2
  158. package/esm2020/calendar-month/src/interfaces/index.mjs +5 -5
  159. package/esm2020/calendar-month/src/interfaces/week.mjs +2 -2
  160. package/esm2020/calendar-month/src/interfaces/weekday.mjs +2 -2
  161. package/esm2020/calendar-month/src/pipes/index.mjs +3 -3
  162. package/esm2020/calendar-month/src/pipes/month-name/index.mjs +3 -3
  163. package/esm2020/calendar-month/src/pipes/month-name/month-name.module.mjs +24 -24
  164. package/esm2020/calendar-month/src/pipes/month-name/month-name.pipe.mjs +21 -21
  165. package/esm2020/calendar-month/src/pipes/weekday-name/index.mjs +3 -3
  166. package/esm2020/calendar-month/src/pipes/weekday-name/weekday-name.module.mjs +24 -24
  167. package/esm2020/calendar-month/src/pipes/weekday-name/weekday-name.pipe.mjs +16 -16
  168. package/esm2020/calendar-month/src/service/calendar-month.service.mjs +94 -94
  169. package/esm2020/card/index.mjs +2 -2
  170. package/esm2020/card/mintplayer-ng-bootstrap-card.mjs +4 -4
  171. package/esm2020/card/src/card/card.component.mjs +11 -11
  172. package/esm2020/card/src/card-header/card-header.component.mjs +11 -11
  173. package/esm2020/card/src/card.module.mjs +27 -27
  174. package/esm2020/card/src/index.mjs +4 -4
  175. package/esm2020/carousel/index.mjs +2 -2
  176. package/esm2020/carousel/mintplayer-ng-bootstrap-carousel.mjs +4 -4
  177. package/esm2020/carousel/src/carousel/carousel.component.mjs +107 -109
  178. package/esm2020/carousel/src/carousel-image/carousel-image.directive.mjs +21 -17
  179. package/esm2020/carousel/src/carousel.module.mjs +37 -33
  180. package/esm2020/carousel/src/index.mjs +4 -4
  181. package/esm2020/close/index.mjs +2 -2
  182. package/esm2020/close/mintplayer-ng-bootstrap-close.mjs +4 -4
  183. package/esm2020/close/src/close.component.mjs +21 -21
  184. package/esm2020/close/src/close.module.mjs +18 -18
  185. package/esm2020/close/src/index.mjs +3 -3
  186. package/esm2020/code-snippet/index.mjs +2 -2
  187. package/esm2020/code-snippet/mintplayer-ng-bootstrap-code-snippet.mjs +4 -4
  188. package/esm2020/code-snippet/src/code-snippet.component.mjs +34 -34
  189. package/esm2020/code-snippet/src/code-snippet.module.mjs +36 -36
  190. package/esm2020/code-snippet/src/index.mjs +3 -3
  191. package/esm2020/context-menu/index.mjs +2 -2
  192. package/esm2020/context-menu/mintplayer-ng-bootstrap-context-menu.mjs +4 -4
  193. package/esm2020/context-menu/src/context-menu.directive.mjs +84 -84
  194. package/esm2020/context-menu/src/context-menu.module.mjs +34 -34
  195. package/esm2020/context-menu/src/index.mjs +3 -3
  196. package/esm2020/copy/index.mjs +2 -2
  197. package/esm2020/copy/mintplayer-ng-bootstrap-copy.mjs +4 -4
  198. package/esm2020/copy/src/copy.directive.mjs +45 -45
  199. package/esm2020/copy/src/copy.module.mjs +24 -24
  200. package/esm2020/copy/src/index.mjs +3 -3
  201. package/esm2020/datatable/index.mjs +2 -2
  202. package/esm2020/datatable/mintplayer-ng-bootstrap-datatable.mjs +4 -4
  203. package/esm2020/datatable/src/datatable/datatable.component.mjs +57 -57
  204. package/esm2020/datatable/src/datatable-column/datatable-column-metadata.mjs +2 -2
  205. package/esm2020/datatable/src/datatable-column/datatable-column.directive.mjs +19 -19
  206. package/esm2020/datatable/src/datatable-column/index.mjs +3 -3
  207. package/esm2020/datatable/src/datatable-settings.mjs +37 -37
  208. package/esm2020/datatable/src/datatable.module.mjs +46 -46
  209. package/esm2020/datatable/src/index.mjs +6 -6
  210. package/esm2020/datatable/src/row-template/row-template.directive.mjs +19 -19
  211. package/esm2020/datepicker/index.mjs +2 -2
  212. package/esm2020/datepicker/mintplayer-ng-bootstrap-datepicker.mjs +4 -4
  213. package/esm2020/datepicker/src/datepicker.component.mjs +49 -49
  214. package/esm2020/datepicker/src/datepicker.module.mjs +40 -40
  215. package/esm2020/datepicker/src/index.mjs +3 -3
  216. package/esm2020/dropdown/index.mjs +2 -2
  217. package/esm2020/dropdown/mintplayer-ng-bootstrap-dropdown.mjs +4 -4
  218. package/esm2020/dropdown/src/dropdown/dropdown.directive.mjs +68 -68
  219. package/esm2020/dropdown/src/dropdown-menu/dropdown-menu.directive.mjs +114 -114
  220. package/esm2020/dropdown/src/dropdown-toggle/dropdown-toggle.directive.mjs +31 -31
  221. package/esm2020/dropdown/src/dropdown.module.mjs +43 -43
  222. package/esm2020/dropdown/src/index.mjs +5 -5
  223. package/esm2020/dropdown-divider/index.mjs +2 -0
  224. package/esm2020/dropdown-divider/mintplayer-ng-bootstrap-dropdown-divider.mjs +5 -0
  225. package/esm2020/dropdown-divider/src/dropdown-divider.directive.mjs +19 -0
  226. package/esm2020/dropdown-divider/src/dropdown-divider.module.mjs +18 -0
  227. package/esm2020/dropdown-divider/src/index.mjs +3 -0
  228. package/esm2020/dropdown-menu/index.mjs +2 -2
  229. package/esm2020/dropdown-menu/mintplayer-ng-bootstrap-dropdown-menu.mjs +4 -4
  230. package/esm2020/dropdown-menu/src/dropdown-item/dropdown-item.component.mjs +19 -19
  231. package/esm2020/dropdown-menu/src/dropdown-menu/dropdown-menu.component.mjs +42 -42
  232. package/esm2020/dropdown-menu/src/dropdown-menu.module.mjs +26 -19
  233. package/esm2020/dropdown-menu/src/index.mjs +4 -4
  234. package/esm2020/enhanced-paste/index.mjs +2 -2
  235. package/esm2020/enhanced-paste/mintplayer-ng-bootstrap-enhanced-paste.mjs +4 -4
  236. package/esm2020/enhanced-paste/src/directive/enhanced-paste.directive.mjs +58 -58
  237. package/esm2020/enhanced-paste/src/enhanced-paste.module.mjs +24 -24
  238. package/esm2020/enhanced-paste/src/index.mjs +4 -4
  239. package/esm2020/enhanced-paste/src/interfaces/number-overflow.mjs +2 -2
  240. package/esm2020/enum/index.mjs +2 -2
  241. package/esm2020/enum/mintplayer-ng-bootstrap-enum.mjs +4 -4
  242. package/esm2020/enum/src/index.mjs +3 -3
  243. package/esm2020/enum/src/interfaces/enum-item.mjs +2 -2
  244. package/esm2020/enum/src/interfaces/index.mjs +1 -1
  245. package/esm2020/enum/src/service/enum.service.mjs +31 -31
  246. package/esm2020/file-upload/index.mjs +2 -2
  247. package/esm2020/file-upload/mintplayer-ng-bootstrap-file-upload.mjs +4 -4
  248. package/esm2020/file-upload/src/component/file-upload.component.mjs +86 -86
  249. package/esm2020/file-upload/src/directive/file-upload-template.directive.mjs +18 -18
  250. package/esm2020/file-upload/src/file-upload.mjs +2 -2
  251. package/esm2020/file-upload/src/file-upload.module.mjs +50 -50
  252. package/esm2020/file-upload/src/index.mjs +6 -6
  253. package/esm2020/file-upload/src/pipes/format-bytes/format-bytes.pipe.mjs +23 -23
  254. package/esm2020/file-upload/src/pipes/index.mjs +1 -1
  255. package/esm2020/floating-labels/index.mjs +2 -2
  256. package/esm2020/floating-labels/mintplayer-ng-bootstrap-floating-labels.mjs +4 -4
  257. package/esm2020/floating-labels/src/floating-labels/floating-label/floating-label.component.mjs +20 -20
  258. package/esm2020/floating-labels/src/floating-labels/floating-labels.module.mjs +18 -18
  259. package/esm2020/floating-labels/src/index.mjs +3 -3
  260. package/esm2020/for/index.mjs +2 -2
  261. package/esm2020/for/mintplayer-ng-bootstrap-for.mjs +4 -4
  262. package/esm2020/for/src/for.directive.mjs +38 -38
  263. package/esm2020/for/src/for.module.mjs +24 -24
  264. package/esm2020/for/src/index.mjs +3 -3
  265. package/esm2020/form/index.mjs +2 -2
  266. package/esm2020/form/mintplayer-ng-bootstrap-form.mjs +4 -4
  267. package/esm2020/form/src/form/form.component.mjs +20 -20
  268. package/esm2020/form/src/form-control/form-control.directive.mjs +19 -19
  269. package/esm2020/form/src/form-group/form-group.directive.mjs +19 -19
  270. package/esm2020/form/src/form.module.mjs +20 -20
  271. package/esm2020/form/src/index.mjs +5 -5
  272. package/esm2020/grid/index.mjs +2 -2
  273. package/esm2020/grid/mintplayer-ng-bootstrap-grid.mjs +4 -4
  274. package/esm2020/grid/src/component/grid.component.mjs +32 -32
  275. package/esm2020/grid/src/directives/col-form-label/col-form-label.directive.mjs +19 -19
  276. package/esm2020/grid/src/directives/column/column.directive.mjs +56 -56
  277. package/esm2020/grid/src/directives/index.mjs +4 -4
  278. package/esm2020/grid/src/directives/row/row.directive.mjs +19 -19
  279. package/esm2020/grid/src/grid.module.mjs +21 -21
  280. package/esm2020/grid/src/index.mjs +5 -5
  281. package/esm2020/grid/src/interfaces/column-definition.mjs +2 -2
  282. package/esm2020/grid/src/interfaces/index.mjs +1 -1
  283. package/esm2020/has-overlay/index.mjs +1 -1
  284. package/esm2020/has-overlay/mintplayer-ng-bootstrap-has-overlay.mjs +4 -4
  285. package/esm2020/has-overlay/src/has-overlay/has-overlay.component.mjs +11 -11
  286. package/esm2020/has-overlay/src/has-overlay/has-overlay.module.mjs +18 -18
  287. package/esm2020/has-overlay/src/index.mjs +3 -3
  288. package/esm2020/icon/index.mjs +3 -3
  289. package/esm2020/icon/mintplayer-ng-bootstrap-icon.mjs +4 -4
  290. package/esm2020/icon/src/icon.component.mjs +34 -34
  291. package/esm2020/icon/src/icon.module.mjs +18 -18
  292. package/esm2020/index.mjs +5 -5
  293. package/esm2020/input-group/index.mjs +1 -1
  294. package/esm2020/input-group/mintplayer-ng-bootstrap-input-group.mjs +4 -4
  295. package/esm2020/input-group/src/index.mjs +3 -3
  296. package/esm2020/input-group/src/input-group/input-group.component.mjs +11 -11
  297. package/esm2020/input-group/src/input-group.module.mjs +18 -18
  298. package/esm2020/lazy-loading/index.mjs +1 -1
  299. package/esm2020/lazy-loading/mintplayer-ng-bootstrap-lazy-loading.mjs +4 -4
  300. package/esm2020/lazy-loading/src/index.mjs +3 -3
  301. package/esm2020/lazy-loading/src/lazy-load/lazy-load.directive.mjs +32 -32
  302. package/esm2020/lazy-loading/src/lazy-loading.module.mjs +24 -24
  303. package/esm2020/lib/enums/color.enum.mjs +15 -15
  304. package/esm2020/lib/enums/index.mjs +1 -1
  305. package/esm2020/lib/pipes/font-color/font-color.module.mjs +24 -24
  306. package/esm2020/lib/pipes/font-color/font-color.pipe.mjs +26 -26
  307. package/esm2020/lib/pipes/font-color/index.mjs +3 -3
  308. package/esm2020/lib/pipes/in-list/in-list.module.mjs +24 -24
  309. package/esm2020/lib/pipes/in-list/in-list.pipe.mjs +16 -16
  310. package/esm2020/lib/pipes/in-list/index.mjs +3 -3
  311. package/esm2020/lib/pipes/index.mjs +4 -4
  312. package/esm2020/lib/pipes/uc-first/index.mjs +3 -3
  313. package/esm2020/lib/pipes/uc-first/uc-first.module.mjs +24 -24
  314. package/esm2020/lib/pipes/uc-first/uc-first.pipe.mjs +16 -16
  315. package/esm2020/lib/providers/development.provider.mjs +8 -8
  316. package/esm2020/lib/providers/index.mjs +1 -1
  317. package/esm2020/lib/types/breakpoint.mjs +1 -1
  318. package/esm2020/lib/types/index.mjs +5 -5
  319. package/esm2020/lib/types/position.mjs +1 -1
  320. package/esm2020/lib/types/size.mjs +1 -1
  321. package/esm2020/lib/types/view-state.type.mjs +1 -1
  322. package/esm2020/list-group/index.mjs +2 -2
  323. package/esm2020/list-group/mintplayer-ng-bootstrap-list-group.mjs +4 -4
  324. package/esm2020/list-group/src/index.mjs +4 -4
  325. package/esm2020/list-group/src/list-group/list-group.component.mjs +19 -19
  326. package/esm2020/list-group/src/list-group-item/list-group-item.component.mjs +15 -15
  327. package/esm2020/list-group/src/list-group.module.mjs +27 -27
  328. package/esm2020/markdown/index.mjs +6 -6
  329. package/esm2020/markdown/mintplayer-ng-bootstrap-markdown.mjs +4 -4
  330. package/esm2020/markdown/src/bold/bold.pipe.mjs +30 -30
  331. package/esm2020/markdown/src/italic/italic.pipe.mjs +30 -30
  332. package/esm2020/markdown/src/markdown.module.mjs +39 -39
  333. package/esm2020/markdown/src/strikethrough/strikethrough.pipe.mjs +30 -30
  334. package/esm2020/markdown/src/underline/underline.pipe.mjs +30 -30
  335. package/esm2020/mintplayer-ng-bootstrap.mjs +4 -4
  336. package/esm2020/modal/index.mjs +2 -2
  337. package/esm2020/modal/mintplayer-ng-bootstrap-modal.mjs +4 -4
  338. package/esm2020/modal/src/components/index.mjs +3 -3
  339. package/esm2020/modal/src/components/modal/modal.component.mjs +21 -21
  340. package/esm2020/modal/src/components/modal-host/modal-host.component.mjs +83 -83
  341. package/esm2020/modal/src/directives/index.mjs +6 -6
  342. package/esm2020/modal/src/directives/modal/modal.directive.mjs +18 -18
  343. package/esm2020/modal/src/directives/modal-body/modal-body.directive.mjs +19 -19
  344. package/esm2020/modal/src/directives/modal-close/modal-close.directive.mjs +24 -24
  345. package/esm2020/modal/src/directives/modal-footer/modal-footer.directive.mjs +19 -19
  346. package/esm2020/modal/src/directives/modal-header/modal-header.directive.mjs +19 -19
  347. package/esm2020/modal/src/index.mjs +4 -4
  348. package/esm2020/modal/src/modal.module.mjs +75 -75
  349. package/esm2020/modal/src/providers/modal-content.provider.mjs +3 -3
  350. package/esm2020/modal/src/providers/portal-factory.provider.mjs +3 -3
  351. package/esm2020/multiselect/index.mjs +2 -2
  352. package/esm2020/multiselect/mintplayer-ng-bootstrap-multiselect.mjs +4 -4
  353. package/esm2020/multiselect/src/component/multiselect.component.mjs +40 -40
  354. package/esm2020/multiselect/src/directives/button-template/button-template.directive.mjs +18 -18
  355. package/esm2020/multiselect/src/directives/footer-template/footer-template.directive.mjs +18 -18
  356. package/esm2020/multiselect/src/directives/header-template/header-template.directive.mjs +18 -18
  357. package/esm2020/multiselect/src/directives/index.mjs +4 -4
  358. package/esm2020/multiselect/src/index.mjs +4 -4
  359. package/esm2020/multiselect/src/multiselect.module.mjs +63 -63
  360. package/esm2020/navbar/index.mjs +2 -2
  361. package/esm2020/navbar/mintplayer-ng-bootstrap-navbar.mjs +4 -4
  362. package/esm2020/navbar/src/dropdown-toggle/dropdown-toggle.directive.mjs +38 -38
  363. package/esm2020/navbar/src/expand-button/expand-button.directive.mjs +18 -18
  364. package/esm2020/navbar/src/index.mjs +13 -13
  365. package/esm2020/navbar/src/nav-link/nav-link.directive.mjs +34 -34
  366. package/esm2020/navbar/src/navbar/navbar.component.mjs +141 -141
  367. package/esm2020/navbar/src/navbar-brand/navbar-brand.component.mjs +20 -20
  368. package/esm2020/navbar/src/navbar-content/navbar-content.directive.mjs +72 -72
  369. package/esm2020/navbar/src/navbar-dropdown/navbar-dropdown.component.mjs +143 -144
  370. package/esm2020/navbar/src/navbar-item/navbar-item.component.mjs +104 -104
  371. package/esm2020/navbar/src/navbar-nav/navbar-nav.component.mjs +69 -69
  372. package/esm2020/navbar/src/navbar-toggler/navbar-toggler.component.mjs +47 -47
  373. package/esm2020/navbar/src/navbar.module.mjs +91 -85
  374. package/esm2020/navigation-lock/index.mjs +2 -2
  375. package/esm2020/navigation-lock/mintplayer-ng-bootstrap-navigation-lock.mjs +4 -4
  376. package/esm2020/navigation-lock/src/directive/navigation-lock.directive.mjs +94 -94
  377. package/esm2020/navigation-lock/src/guard/navigation-lock.guard.mjs +22 -22
  378. package/esm2020/navigation-lock/src/index.mjs +5 -5
  379. package/esm2020/navigation-lock/src/interface/has-navigation-lock.mjs +2 -2
  380. package/esm2020/navigation-lock/src/navigation-lock.module.mjs +28 -28
  381. package/esm2020/no-noscript/index.mjs +2 -2
  382. package/esm2020/no-noscript/mintplayer-ng-bootstrap-no-noscript.mjs +4 -4
  383. package/esm2020/no-noscript/src/index.mjs +3 -3
  384. package/esm2020/no-noscript/src/no-noscript/no-noscript.directive.mjs +27 -27
  385. package/esm2020/no-noscript/src/no-noscript.module.mjs +18 -18
  386. package/esm2020/offcanvas/index.mjs +2 -2
  387. package/esm2020/offcanvas/mintplayer-ng-bootstrap-offcanvas.mjs +4 -4
  388. package/esm2020/offcanvas/src/components/index.mjs +5 -5
  389. package/esm2020/offcanvas/src/components/offcanvas/offcanvas.component.mjs +111 -111
  390. package/esm2020/offcanvas/src/components/offcanvas-body/offcanvas-body.component.mjs +18 -18
  391. package/esm2020/offcanvas/src/components/offcanvas-header/offcanvas-header.component.mjs +14 -14
  392. package/esm2020/offcanvas/src/components/offcanvas-host/offcanvas-host.component.mjs +143 -143
  393. package/esm2020/offcanvas/src/directives/index.mjs +4 -4
  394. package/esm2020/offcanvas/src/directives/offcanvas-close/offcanvas-close.directive.mjs +24 -24
  395. package/esm2020/offcanvas/src/directives/offcanvas-content/offcanvas-content.directive.mjs +18 -18
  396. package/esm2020/offcanvas/src/directives/offcanvas-push/offcanvas-push.directive.mjs +71 -71
  397. package/esm2020/offcanvas/src/index.mjs +4 -4
  398. package/esm2020/offcanvas/src/offcanvas.module.mjs +75 -75
  399. package/esm2020/offcanvas/src/providers/offcanvas-content.provider.mjs +3 -3
  400. package/esm2020/offcanvas/src/providers/portal-factory.provider.mjs +3 -3
  401. package/esm2020/ordinal-number/index.mjs +2 -2
  402. package/esm2020/ordinal-number/mintplayer-ng-bootstrap-ordinal-number.mjs +4 -4
  403. package/esm2020/ordinal-number/src/index.mjs +3 -3
  404. package/esm2020/ordinal-number/src/ordinal-number/ordinal-number.pipe.mjs +29 -29
  405. package/esm2020/ordinal-number/src/ordinal-number.module.mjs +24 -24
  406. package/esm2020/pagination/index.mjs +2 -2
  407. package/esm2020/pagination/mintplayer-ng-bootstrap-pagination.mjs +4 -4
  408. package/esm2020/pagination/src/component/index.mjs +1 -1
  409. package/esm2020/pagination/src/component/pagination/pagination.component.mjs +198 -198
  410. package/esm2020/pagination/src/index.mjs +5 -5
  411. package/esm2020/pagination/src/interfaces/index.mjs +1 -1
  412. package/esm2020/pagination/src/interfaces/page-with-selection.mjs +2 -2
  413. package/esm2020/pagination/src/pagination.module.mjs +24 -24
  414. package/esm2020/pagination/src/types/index.mjs +1 -1
  415. package/esm2020/pagination/src/types/page-number.type.mjs +1 -1
  416. package/esm2020/placeholder/index.mjs +2 -2
  417. package/esm2020/placeholder/mintplayer-ng-bootstrap-placeholder.mjs +4 -4
  418. package/esm2020/placeholder/src/index.mjs +4 -4
  419. package/esm2020/placeholder/src/placeholder/placeholder.component.mjs +26 -26
  420. package/esm2020/placeholder/src/placeholder-field/placeholder-field.directive.mjs +46 -46
  421. package/esm2020/placeholder/src/placeholder.module.mjs +19 -19
  422. package/esm2020/popover/index.mjs +2 -2
  423. package/esm2020/popover/mintplayer-ng-bootstrap-popover.mjs +4 -4
  424. package/esm2020/popover/src/component/popover.component.mjs +57 -57
  425. package/esm2020/popover/src/directives/index.mjs +4 -4
  426. package/esm2020/popover/src/directives/popover/popover.directive.mjs +132 -132
  427. package/esm2020/popover/src/directives/popover-body/popover-body.directive.mjs +19 -19
  428. package/esm2020/popover/src/directives/popover-header/popover-header.directive.mjs +19 -19
  429. package/esm2020/popover/src/index.mjs +4 -4
  430. package/esm2020/popover/src/popover.module.mjs +36 -36
  431. package/esm2020/popover/src/providers/popover-content.provider.mjs +3 -3
  432. package/esm2020/popover/src/providers/portal-factory.provider.mjs +3 -3
  433. package/esm2020/progress-bar/index.mjs +2 -2
  434. package/esm2020/progress-bar/mintplayer-ng-bootstrap-progress-bar.mjs +4 -4
  435. package/esm2020/progress-bar/src/index.mjs +4 -4
  436. package/esm2020/progress-bar/src/progress/progress.component.mjs +31 -31
  437. package/esm2020/progress-bar/src/progress-bar/progress-bar.component.mjs +121 -121
  438. package/esm2020/progress-bar/src/progress-bar.module.mjs +29 -29
  439. package/esm2020/range/index.mjs +2 -2
  440. package/esm2020/range/mintplayer-ng-bootstrap-range.mjs +4 -4
  441. package/esm2020/range/src/component/range.component.mjs +25 -25
  442. package/esm2020/range/src/index.mjs +4 -4
  443. package/esm2020/range/src/range.module.mjs +19 -19
  444. package/esm2020/range/src/value-accessor/range-value-accessor.mjs +62 -62
  445. package/esm2020/rating/index.mjs +2 -2
  446. package/esm2020/rating/mintplayer-ng-bootstrap-rating.mjs +4 -4
  447. package/esm2020/rating/src/component/rating.component.mjs +72 -72
  448. package/esm2020/rating/src/index.mjs +3 -3
  449. package/esm2020/rating/src/rating.module.mjs +24 -24
  450. package/esm2020/scheduler/index.mjs +2 -2
  451. package/esm2020/scheduler/mintplayer-ng-bootstrap-scheduler.mjs +4 -4
  452. package/esm2020/scheduler/src/components/index.mjs +3 -3
  453. package/esm2020/scheduler/src/components/resource-group-presenter/resource-group-presenter.component.mjs +85 -85
  454. package/esm2020/scheduler/src/components/scheduler/scheduler.component.mjs +538 -538
  455. package/esm2020/scheduler/src/constants/available-scales.mjs +12 -12
  456. package/esm2020/scheduler/src/constants/index.mjs +1 -1
  457. package/esm2020/scheduler/src/enums/drag-operation.mjs +8 -8
  458. package/esm2020/scheduler/src/enums/index.mjs +1 -1
  459. package/esm2020/scheduler/src/enums/scheduler-mode.mjs +6 -6
  460. package/esm2020/scheduler/src/index.mjs +6 -6
  461. package/esm2020/scheduler/src/interfaces/drag-operation.mjs +2 -2
  462. package/esm2020/scheduler/src/interfaces/index.mjs +6 -6
  463. package/esm2020/scheduler/src/interfaces/preview-event.mjs +2 -2
  464. package/esm2020/scheduler/src/interfaces/resource-group.mjs +2 -2
  465. package/esm2020/scheduler/src/interfaces/resource-or-group.mjs +2 -2
  466. package/esm2020/scheduler/src/interfaces/resource.mjs +2 -2
  467. package/esm2020/scheduler/src/interfaces/scheduler-event-part.mjs +2 -2
  468. package/esm2020/scheduler/src/interfaces/scheduler-event-with-parts.mjs +2 -2
  469. package/esm2020/scheduler/src/interfaces/scheduler-event.mjs +2 -2
  470. package/esm2020/scheduler/src/interfaces/scheduler-schale.mjs +2 -2
  471. package/esm2020/scheduler/src/interfaces/scheduler-stamp-with-slots.mjs +2 -2
  472. package/esm2020/scheduler/src/interfaces/time-slot.mjs +2 -2
  473. package/esm2020/scheduler/src/interfaces/timeline-options.mjs +2 -2
  474. package/esm2020/scheduler/src/interfaces/timeline-track.mjs +2 -2
  475. package/esm2020/scheduler/src/interfaces/week-options.mjs +2 -2
  476. package/esm2020/scheduler/src/pipes/bs-seconds-timespan.pipe/bs-seconds-timespan.pipe.mjs +16 -16
  477. package/esm2020/scheduler/src/pipes/bs-seconds-today-offset/bs-seconds-today-offset.pipe.mjs +20 -20
  478. package/esm2020/scheduler/src/pipes/date-offset/date-offset.pipe.mjs +20 -20
  479. package/esm2020/scheduler/src/pipes/day-of-week/day-of-week.pipe.mjs +22 -22
  480. package/esm2020/scheduler/src/scheduler.module.mjs +45 -45
  481. package/esm2020/scheduler/src/services/timeline/timeline.service.mjs +65 -65
  482. package/esm2020/scrollspy/index.mjs +2 -2
  483. package/esm2020/scrollspy/mintplayer-ng-bootstrap-scrollspy.mjs +4 -4
  484. package/esm2020/scrollspy/src/component/scrollspy.component.mjs +90 -90
  485. package/esm2020/scrollspy/src/directives/scrollspy.directive.mjs +16 -16
  486. package/esm2020/scrollspy/src/index.mjs +5 -5
  487. package/esm2020/scrollspy/src/scrollspy.module.mjs +29 -29
  488. package/esm2020/scrollspy/src/services/index.mjs +1 -1
  489. package/esm2020/scrollspy/src/services/scroll-offset/scroll-offset.service.mjs +31 -31
  490. package/esm2020/select/index.mjs +2 -2
  491. package/esm2020/select/mintplayer-ng-bootstrap-select.mjs +4 -4
  492. package/esm2020/select/src/component/select.component.mjs +85 -85
  493. package/esm2020/select/src/index.mjs +5 -5
  494. package/esm2020/select/src/select.module.mjs +31 -31
  495. package/esm2020/select/src/types/index.mjs +1 -1
  496. package/esm2020/select/src/types/select-size.mjs +1 -1
  497. package/esm2020/select/src/value-accessors/index.mjs +1 -1
  498. package/esm2020/select/src/value-accessors/select-value-accessor.mjs +167 -167
  499. package/esm2020/select2/index.mjs +2 -2
  500. package/esm2020/select2/mintplayer-ng-bootstrap-select2.mjs +4 -4
  501. package/esm2020/select2/src/component/select2.component.mjs +85 -85
  502. package/esm2020/select2/src/directive/item-template.directive.mjs +19 -19
  503. package/esm2020/select2/src/index.mjs +4 -4
  504. package/esm2020/select2/src/select2.module.mjs +49 -49
  505. package/esm2020/snackbar/index.mjs +2 -2
  506. package/esm2020/snackbar/mintplayer-ng-bootstrap-snackbar.mjs +4 -4
  507. package/esm2020/snackbar/src/component/snackbar.component.mjs +36 -36
  508. package/esm2020/snackbar/src/directives/index.mjs +1 -1
  509. package/esm2020/snackbar/src/directives/snackbar-close/snackbar-close.directive.mjs +27 -27
  510. package/esm2020/snackbar/src/index.mjs +6 -6
  511. package/esm2020/snackbar/src/interfaces/index.mjs +1 -1
  512. package/esm2020/snackbar/src/interfaces/snackbar-animation-meta.mjs +2 -2
  513. package/esm2020/snackbar/src/providers/snackbar-content.provider.mjs +3 -3
  514. package/esm2020/snackbar/src/service/snackbar.service.mjs +45 -45
  515. package/esm2020/snackbar/src/snackbar.module.mjs +43 -43
  516. package/esm2020/spinner/index.mjs +2 -2
  517. package/esm2020/spinner/mintplayer-ng-bootstrap-spinner.mjs +4 -4
  518. package/esm2020/spinner/src/index.mjs +3 -3
  519. package/esm2020/spinner/src/spinner.component.mjs +43 -43
  520. package/esm2020/spinner/src/spinner.module.mjs +18 -18
  521. package/esm2020/tab-control/index.mjs +2 -2
  522. package/esm2020/tab-control/mintplayer-ng-bootstrap-tab-control.mjs +4 -4
  523. package/esm2020/tab-control/src/index.mjs +4 -4
  524. package/esm2020/tab-control/src/tab-control/tab-control.component.mjs +36 -36
  525. package/esm2020/tab-control/src/tab-control.module.mjs +29 -29
  526. package/esm2020/tab-control/src/tab-page/tab-page.component.mjs +23 -23
  527. package/esm2020/table/index.mjs +2 -2
  528. package/esm2020/table/mintplayer-ng-bootstrap-table.mjs +4 -4
  529. package/esm2020/table/src/component/table.component.mjs +47 -47
  530. package/esm2020/table/src/index.mjs +3 -3
  531. package/esm2020/table/src/table.module.mjs +18 -18
  532. package/esm2020/timepicker/index.mjs +2 -2
  533. package/esm2020/timepicker/mintplayer-ng-bootstrap-timepicker.mjs +4 -4
  534. package/esm2020/timepicker/src/index.mjs +3 -3
  535. package/esm2020/timepicker/src/timepicker.component.mjs +117 -117
  536. package/esm2020/timepicker/src/timepicker.module.mjs +60 -60
  537. package/esm2020/toast/index.mjs +2 -2
  538. package/esm2020/toast/mintplayer-ng-bootstrap-toast.mjs +4 -4
  539. package/esm2020/toast/src/components/index.mjs +5 -5
  540. package/esm2020/toast/src/components/toast/toast.component.mjs +16 -16
  541. package/esm2020/toast/src/components/toast-body/toast-body.component.mjs +20 -20
  542. package/esm2020/toast/src/components/toast-container/toast-container.component.mjs +23 -23
  543. package/esm2020/toast/src/components/toast-header/toast-header.component.mjs +17 -17
  544. package/esm2020/toast/src/directives/index.mjs +1 -1
  545. package/esm2020/toast/src/directives/toast-close/toast-close.directive.mjs +32 -32
  546. package/esm2020/toast/src/index.mjs +6 -6
  547. package/esm2020/toast/src/pipes/add-properties.pipe.mjs +17 -17
  548. package/esm2020/toast/src/providers/portal-factory.provider.mjs +3 -3
  549. package/esm2020/toast/src/services/index.mjs +1 -1
  550. package/esm2020/toast/src/services/toast/toast.service.mjs +56 -56
  551. package/esm2020/toast/src/toast.module.mjs +77 -77
  552. package/esm2020/toggle-button/index.mjs +2 -2
  553. package/esm2020/toggle-button/mintplayer-ng-bootstrap-toggle-button.mjs +4 -4
  554. package/esm2020/toggle-button/src/component/toggle-button.component.mjs +158 -158
  555. package/esm2020/toggle-button/src/directives/index.mjs +1 -1
  556. package/esm2020/toggle-button/src/directives/toggle-button-group/toggle-button-group.directive.mjs +19 -19
  557. package/esm2020/toggle-button/src/index.mjs +6 -6
  558. package/esm2020/toggle-button/src/toggle-button.module.mjs +34 -34
  559. package/esm2020/toggle-button/src/types/check-style.mjs +2 -2
  560. package/esm2020/toggle-button/src/types/index.mjs +2 -2
  561. package/esm2020/toggle-button/src/value-accessor/toggle-button-value-accessor.mjs +108 -108
  562. package/esm2020/tooltip/index.mjs +2 -2
  563. package/esm2020/tooltip/mintplayer-ng-bootstrap-tooltip.mjs +4 -4
  564. package/esm2020/tooltip/src/component/tooltip.component.mjs +38 -38
  565. package/esm2020/tooltip/src/directive/tooltip.directive.mjs +109 -109
  566. package/esm2020/tooltip/src/index.mjs +4 -4
  567. package/esm2020/tooltip/src/providers/tooltip-content.provider.mjs +3 -3
  568. package/esm2020/tooltip/src/tooltip.module.mjs +35 -35
  569. package/esm2020/typeahead/index.mjs +2 -2
  570. package/esm2020/typeahead/mintplayer-ng-bootstrap-typeahead.mjs +4 -4
  571. package/esm2020/typeahead/src/index.mjs +3 -3
  572. package/esm2020/typeahead/src/typeahead.component.mjs +82 -82
  573. package/esm2020/typeahead/src/typeahead.module.mjs +48 -48
  574. package/esm2020/user-agent/index.mjs +2 -2
  575. package/esm2020/user-agent/mintplayer-ng-bootstrap-user-agent.mjs +4 -4
  576. package/esm2020/user-agent/src/index.mjs +4 -4
  577. package/esm2020/user-agent/src/user-agent/user-agent.directive.mjs +57 -57
  578. package/esm2020/user-agent/src/user-agent/user-agent.module.mjs +24 -24
  579. package/esm2020/user-agent/src/user-agent.type.mjs +1 -1
  580. package/fesm2015/mintplayer-ng-bootstrap-accordion.mjs +113 -113
  581. package/fesm2015/mintplayer-ng-bootstrap-accordion.mjs.map +1 -1
  582. package/fesm2015/mintplayer-ng-bootstrap-alert.mjs +70 -70
  583. package/fesm2015/mintplayer-ng-bootstrap-alert.mjs.map +1 -1
  584. package/fesm2015/mintplayer-ng-bootstrap-badge.mjs +37 -37
  585. package/fesm2015/mintplayer-ng-bootstrap-badge.mjs.map +1 -1
  586. package/fesm2015/mintplayer-ng-bootstrap-breadcrumb.mjs +37 -37
  587. package/fesm2015/mintplayer-ng-bootstrap-breadcrumb.mjs.map +1 -1
  588. package/fesm2015/mintplayer-ng-bootstrap-button-group.mjs +23 -23
  589. package/fesm2015/mintplayer-ng-bootstrap-button-group.mjs.map +1 -1
  590. package/fesm2015/mintplayer-ng-bootstrap-button-type.mjs +45 -45
  591. package/fesm2015/mintplayer-ng-bootstrap-button-type.mjs.map +1 -1
  592. package/fesm2015/mintplayer-ng-bootstrap-calendar-month.mjs +160 -160
  593. package/fesm2015/mintplayer-ng-bootstrap-calendar-month.mjs.map +1 -1
  594. package/fesm2015/mintplayer-ng-bootstrap-calendar.mjs +127 -127
  595. package/fesm2015/mintplayer-ng-bootstrap-calendar.mjs.map +1 -1
  596. package/fesm2015/mintplayer-ng-bootstrap-card.mjs +36 -36
  597. package/fesm2015/mintplayer-ng-bootstrap-card.mjs.map +1 -1
  598. package/fesm2015/mintplayer-ng-bootstrap-carousel.mjs +151 -146
  599. package/fesm2015/mintplayer-ng-bootstrap-carousel.mjs.map +1 -1
  600. package/fesm2015/mintplayer-ng-bootstrap-close.mjs +31 -31
  601. package/fesm2015/mintplayer-ng-bootstrap-close.mjs.map +1 -1
  602. package/fesm2015/mintplayer-ng-bootstrap-code-snippet.mjs +55 -55
  603. package/fesm2015/mintplayer-ng-bootstrap-code-snippet.mjs.map +1 -1
  604. package/fesm2015/mintplayer-ng-bootstrap-context-menu.mjs +107 -107
  605. package/fesm2015/mintplayer-ng-bootstrap-context-menu.mjs.map +1 -1
  606. package/fesm2015/mintplayer-ng-bootstrap-copy.mjs +63 -63
  607. package/fesm2015/mintplayer-ng-bootstrap-copy.mjs.map +1 -1
  608. package/fesm2015/mintplayer-ng-bootstrap-datatable.mjs +145 -145
  609. package/fesm2015/mintplayer-ng-bootstrap-datatable.mjs.map +1 -1
  610. package/fesm2015/mintplayer-ng-bootstrap-datepicker.mjs +71 -71
  611. package/fesm2015/mintplayer-ng-bootstrap-datepicker.mjs.map +1 -1
  612. package/fesm2015/mintplayer-ng-bootstrap-dropdown-divider.mjs +41 -0
  613. package/fesm2015/mintplayer-ng-bootstrap-dropdown-divider.mjs.map +1 -0
  614. package/fesm2015/mintplayer-ng-bootstrap-dropdown-menu.mjs +74 -67
  615. package/fesm2015/mintplayer-ng-bootstrap-dropdown-menu.mjs.map +1 -1
  616. package/fesm2015/mintplayer-ng-bootstrap-dropdown.mjs +225 -225
  617. package/fesm2015/mintplayer-ng-bootstrap-dropdown.mjs.map +1 -1
  618. package/fesm2015/mintplayer-ng-bootstrap-enhanced-paste.mjs +72 -72
  619. package/fesm2015/mintplayer-ng-bootstrap-enhanced-paste.mjs.map +1 -1
  620. package/fesm2015/mintplayer-ng-bootstrap-enum.mjs +29 -29
  621. package/fesm2015/mintplayer-ng-bootstrap-enum.mjs.map +1 -1
  622. package/fesm2015/mintplayer-ng-bootstrap-file-upload.mjs +147 -147
  623. package/fesm2015/mintplayer-ng-bootstrap-file-upload.mjs.map +1 -1
  624. package/fesm2015/mintplayer-ng-bootstrap-floating-labels.mjs +30 -30
  625. package/fesm2015/mintplayer-ng-bootstrap-floating-labels.mjs.map +1 -1
  626. package/fesm2015/mintplayer-ng-bootstrap-for.mjs +54 -54
  627. package/fesm2015/mintplayer-ng-bootstrap-for.mjs.map +1 -1
  628. package/fesm2015/mintplayer-ng-bootstrap-form.mjs +60 -60
  629. package/fesm2015/mintplayer-ng-bootstrap-form.mjs.map +1 -1
  630. package/fesm2015/mintplayer-ng-bootstrap-grid.mjs +121 -121
  631. package/fesm2015/mintplayer-ng-bootstrap-grid.mjs.map +1 -1
  632. package/fesm2015/mintplayer-ng-bootstrap-has-overlay.mjs +21 -21
  633. package/fesm2015/mintplayer-ng-bootstrap-has-overlay.mjs.map +1 -1
  634. package/fesm2015/mintplayer-ng-bootstrap-icon.mjs +41 -41
  635. package/fesm2015/mintplayer-ng-bootstrap-icon.mjs.map +1 -1
  636. package/fesm2015/mintplayer-ng-bootstrap-input-group.mjs +21 -21
  637. package/fesm2015/mintplayer-ng-bootstrap-input-group.mjs.map +1 -1
  638. package/fesm2015/mintplayer-ng-bootstrap-lazy-loading.mjs +48 -48
  639. package/fesm2015/mintplayer-ng-bootstrap-lazy-loading.mjs.map +1 -1
  640. package/fesm2015/mintplayer-ng-bootstrap-list-group.mjs +47 -47
  641. package/fesm2015/mintplayer-ng-bootstrap-list-group.mjs.map +1 -1
  642. package/fesm2015/mintplayer-ng-bootstrap-markdown.mjs +128 -128
  643. package/fesm2015/mintplayer-ng-bootstrap-markdown.mjs.map +1 -1
  644. package/fesm2015/mintplayer-ng-bootstrap-modal.mjs +227 -227
  645. package/fesm2015/mintplayer-ng-bootstrap-modal.mjs.map +1 -1
  646. package/fesm2015/mintplayer-ng-bootstrap-multiselect.mjs +115 -115
  647. package/fesm2015/mintplayer-ng-bootstrap-multiselect.mjs.map +1 -1
  648. package/fesm2015/mintplayer-ng-bootstrap-navbar.mjs +691 -686
  649. package/fesm2015/mintplayer-ng-bootstrap-navbar.mjs.map +1 -1
  650. package/fesm2015/mintplayer-ng-bootstrap-navigation-lock.mjs +130 -130
  651. package/fesm2015/mintplayer-ng-bootstrap-navigation-lock.mjs.map +1 -1
  652. package/fesm2015/mintplayer-ng-bootstrap-no-noscript.mjs +38 -38
  653. package/fesm2015/mintplayer-ng-bootstrap-no-noscript.mjs.map +1 -1
  654. package/fesm2015/mintplayer-ng-bootstrap-offcanvas.mjs +417 -417
  655. package/fesm2015/mintplayer-ng-bootstrap-offcanvas.mjs.map +1 -1
  656. package/fesm2015/mintplayer-ng-bootstrap-ordinal-number.mjs +43 -43
  657. package/fesm2015/mintplayer-ng-bootstrap-ordinal-number.mjs.map +1 -1
  658. package/fesm2015/mintplayer-ng-bootstrap-pagination.mjs +212 -212
  659. package/fesm2015/mintplayer-ng-bootstrap-pagination.mjs.map +1 -1
  660. package/fesm2015/mintplayer-ng-bootstrap-placeholder.mjs +74 -74
  661. package/fesm2015/mintplayer-ng-bootstrap-placeholder.mjs.map +1 -1
  662. package/fesm2015/mintplayer-ng-bootstrap-popover.mjs +231 -231
  663. package/fesm2015/mintplayer-ng-bootstrap-popover.mjs.map +1 -1
  664. package/fesm2015/mintplayer-ng-bootstrap-progress-bar.mjs +165 -165
  665. package/fesm2015/mintplayer-ng-bootstrap-progress-bar.mjs.map +1 -1
  666. package/fesm2015/mintplayer-ng-bootstrap-range.mjs +89 -89
  667. package/fesm2015/mintplayer-ng-bootstrap-range.mjs.map +1 -1
  668. package/fesm2015/mintplayer-ng-bootstrap-rating.mjs +86 -86
  669. package/fesm2015/mintplayer-ng-bootstrap-rating.mjs.map +1 -1
  670. package/fesm2015/mintplayer-ng-bootstrap-scheduler.mjs +777 -777
  671. package/fesm2015/mintplayer-ng-bootstrap-scheduler.mjs.map +1 -1
  672. package/fesm2015/mintplayer-ng-bootstrap-scrollspy.mjs +147 -147
  673. package/fesm2015/mintplayer-ng-bootstrap-scrollspy.mjs.map +1 -1
  674. package/fesm2015/mintplayer-ng-bootstrap-select.mjs +267 -267
  675. package/fesm2015/mintplayer-ng-bootstrap-select.mjs.map +1 -1
  676. package/fesm2015/mintplayer-ng-bootstrap-select2.mjs +126 -126
  677. package/fesm2015/mintplayer-ng-bootstrap-select2.mjs.map +1 -1
  678. package/fesm2015/mintplayer-ng-bootstrap-snackbar.mjs +121 -121
  679. package/fesm2015/mintplayer-ng-bootstrap-snackbar.mjs.map +1 -1
  680. package/fesm2015/mintplayer-ng-bootstrap-spinner.mjs +50 -50
  681. package/fesm2015/mintplayer-ng-bootstrap-spinner.mjs.map +1 -1
  682. package/fesm2015/mintplayer-ng-bootstrap-tab-control.mjs +70 -70
  683. package/fesm2015/mintplayer-ng-bootstrap-tab-control.mjs.map +1 -1
  684. package/fesm2015/mintplayer-ng-bootstrap-table.mjs +55 -55
  685. package/fesm2015/mintplayer-ng-bootstrap-table.mjs.map +1 -1
  686. package/fesm2015/mintplayer-ng-bootstrap-timepicker.mjs +149 -149
  687. package/fesm2015/mintplayer-ng-bootstrap-timepicker.mjs.map +1 -1
  688. package/fesm2015/mintplayer-ng-bootstrap-toast.mjs +205 -205
  689. package/fesm2015/mintplayer-ng-bootstrap-toast.mjs.map +1 -1
  690. package/fesm2015/mintplayer-ng-bootstrap-toggle-button.mjs +294 -294
  691. package/fesm2015/mintplayer-ng-bootstrap-toggle-button.mjs.map +1 -1
  692. package/fesm2015/mintplayer-ng-bootstrap-tooltip.mjs +161 -161
  693. package/fesm2015/mintplayer-ng-bootstrap-tooltip.mjs.map +1 -1
  694. package/fesm2015/mintplayer-ng-bootstrap-typeahead.mjs +108 -108
  695. package/fesm2015/mintplayer-ng-bootstrap-typeahead.mjs.map +1 -1
  696. package/fesm2015/mintplayer-ng-bootstrap-user-agent.mjs +74 -74
  697. package/fesm2015/mintplayer-ng-bootstrap-user-agent.mjs.map +1 -1
  698. package/fesm2015/mintplayer-ng-bootstrap.mjs +120 -120
  699. package/fesm2015/mintplayer-ng-bootstrap.mjs.map +1 -1
  700. package/fesm2020/mintplayer-ng-bootstrap-accordion.mjs +113 -113
  701. package/fesm2020/mintplayer-ng-bootstrap-accordion.mjs.map +1 -1
  702. package/fesm2020/mintplayer-ng-bootstrap-alert.mjs +70 -70
  703. package/fesm2020/mintplayer-ng-bootstrap-alert.mjs.map +1 -1
  704. package/fesm2020/mintplayer-ng-bootstrap-badge.mjs +37 -37
  705. package/fesm2020/mintplayer-ng-bootstrap-badge.mjs.map +1 -1
  706. package/fesm2020/mintplayer-ng-bootstrap-breadcrumb.mjs +37 -37
  707. package/fesm2020/mintplayer-ng-bootstrap-breadcrumb.mjs.map +1 -1
  708. package/fesm2020/mintplayer-ng-bootstrap-button-group.mjs +23 -23
  709. package/fesm2020/mintplayer-ng-bootstrap-button-group.mjs.map +1 -1
  710. package/fesm2020/mintplayer-ng-bootstrap-button-type.mjs +45 -45
  711. package/fesm2020/mintplayer-ng-bootstrap-button-type.mjs.map +1 -1
  712. package/fesm2020/mintplayer-ng-bootstrap-calendar-month.mjs +157 -157
  713. package/fesm2020/mintplayer-ng-bootstrap-calendar-month.mjs.map +1 -1
  714. package/fesm2020/mintplayer-ng-bootstrap-calendar.mjs +127 -127
  715. package/fesm2020/mintplayer-ng-bootstrap-calendar.mjs.map +1 -1
  716. package/fesm2020/mintplayer-ng-bootstrap-card.mjs +36 -36
  717. package/fesm2020/mintplayer-ng-bootstrap-card.mjs.map +1 -1
  718. package/fesm2020/mintplayer-ng-bootstrap-carousel.mjs +149 -144
  719. package/fesm2020/mintplayer-ng-bootstrap-carousel.mjs.map +1 -1
  720. package/fesm2020/mintplayer-ng-bootstrap-close.mjs +31 -31
  721. package/fesm2020/mintplayer-ng-bootstrap-close.mjs.map +1 -1
  722. package/fesm2020/mintplayer-ng-bootstrap-code-snippet.mjs +55 -55
  723. package/fesm2020/mintplayer-ng-bootstrap-code-snippet.mjs.map +1 -1
  724. package/fesm2020/mintplayer-ng-bootstrap-context-menu.mjs +105 -105
  725. package/fesm2020/mintplayer-ng-bootstrap-context-menu.mjs.map +1 -1
  726. package/fesm2020/mintplayer-ng-bootstrap-copy.mjs +60 -60
  727. package/fesm2020/mintplayer-ng-bootstrap-copy.mjs.map +1 -1
  728. package/fesm2020/mintplayer-ng-bootstrap-datatable.mjs +145 -145
  729. package/fesm2020/mintplayer-ng-bootstrap-datatable.mjs.map +1 -1
  730. package/fesm2020/mintplayer-ng-bootstrap-datepicker.mjs +71 -71
  731. package/fesm2020/mintplayer-ng-bootstrap-datepicker.mjs.map +1 -1
  732. package/fesm2020/mintplayer-ng-bootstrap-dropdown-divider.mjs +41 -0
  733. package/fesm2020/mintplayer-ng-bootstrap-dropdown-divider.mjs.map +1 -0
  734. package/fesm2020/mintplayer-ng-bootstrap-dropdown-menu.mjs +72 -65
  735. package/fesm2020/mintplayer-ng-bootstrap-dropdown-menu.mjs.map +1 -1
  736. package/fesm2020/mintplayer-ng-bootstrap-dropdown.mjs +220 -220
  737. package/fesm2020/mintplayer-ng-bootstrap-dropdown.mjs.map +1 -1
  738. package/fesm2020/mintplayer-ng-bootstrap-enhanced-paste.mjs +72 -72
  739. package/fesm2020/mintplayer-ng-bootstrap-enhanced-paste.mjs.map +1 -1
  740. package/fesm2020/mintplayer-ng-bootstrap-enum.mjs +29 -29
  741. package/fesm2020/mintplayer-ng-bootstrap-enum.mjs.map +1 -1
  742. package/fesm2020/mintplayer-ng-bootstrap-file-upload.mjs +147 -147
  743. package/fesm2020/mintplayer-ng-bootstrap-file-upload.mjs.map +1 -1
  744. package/fesm2020/mintplayer-ng-bootstrap-floating-labels.mjs +28 -28
  745. package/fesm2020/mintplayer-ng-bootstrap-floating-labels.mjs.map +1 -1
  746. package/fesm2020/mintplayer-ng-bootstrap-for.mjs +54 -54
  747. package/fesm2020/mintplayer-ng-bootstrap-for.mjs.map +1 -1
  748. package/fesm2020/mintplayer-ng-bootstrap-form.mjs +60 -60
  749. package/fesm2020/mintplayer-ng-bootstrap-form.mjs.map +1 -1
  750. package/fesm2020/mintplayer-ng-bootstrap-grid.mjs +121 -121
  751. package/fesm2020/mintplayer-ng-bootstrap-grid.mjs.map +1 -1
  752. package/fesm2020/mintplayer-ng-bootstrap-has-overlay.mjs +21 -21
  753. package/fesm2020/mintplayer-ng-bootstrap-has-overlay.mjs.map +1 -1
  754. package/fesm2020/mintplayer-ng-bootstrap-icon.mjs +41 -41
  755. package/fesm2020/mintplayer-ng-bootstrap-icon.mjs.map +1 -1
  756. package/fesm2020/mintplayer-ng-bootstrap-input-group.mjs +21 -21
  757. package/fesm2020/mintplayer-ng-bootstrap-input-group.mjs.map +1 -1
  758. package/fesm2020/mintplayer-ng-bootstrap-lazy-loading.mjs +48 -48
  759. package/fesm2020/mintplayer-ng-bootstrap-lazy-loading.mjs.map +1 -1
  760. package/fesm2020/mintplayer-ng-bootstrap-list-group.mjs +47 -47
  761. package/fesm2020/mintplayer-ng-bootstrap-list-group.mjs.map +1 -1
  762. package/fesm2020/mintplayer-ng-bootstrap-markdown.mjs +128 -128
  763. package/fesm2020/mintplayer-ng-bootstrap-markdown.mjs.map +1 -1
  764. package/fesm2020/mintplayer-ng-bootstrap-modal.mjs +223 -223
  765. package/fesm2020/mintplayer-ng-bootstrap-modal.mjs.map +1 -1
  766. package/fesm2020/mintplayer-ng-bootstrap-multiselect.mjs +115 -115
  767. package/fesm2020/mintplayer-ng-bootstrap-multiselect.mjs.map +1 -1
  768. package/fesm2020/mintplayer-ng-bootstrap-navbar.mjs +680 -675
  769. package/fesm2020/mintplayer-ng-bootstrap-navbar.mjs.map +1 -1
  770. package/fesm2020/mintplayer-ng-bootstrap-navigation-lock.mjs +128 -128
  771. package/fesm2020/mintplayer-ng-bootstrap-navigation-lock.mjs.map +1 -1
  772. package/fesm2020/mintplayer-ng-bootstrap-no-noscript.mjs +36 -36
  773. package/fesm2020/mintplayer-ng-bootstrap-no-noscript.mjs.map +1 -1
  774. package/fesm2020/mintplayer-ng-bootstrap-offcanvas.mjs +413 -413
  775. package/fesm2020/mintplayer-ng-bootstrap-offcanvas.mjs.map +1 -1
  776. package/fesm2020/mintplayer-ng-bootstrap-ordinal-number.mjs +43 -43
  777. package/fesm2020/mintplayer-ng-bootstrap-ordinal-number.mjs.map +1 -1
  778. package/fesm2020/mintplayer-ng-bootstrap-pagination.mjs +212 -212
  779. package/fesm2020/mintplayer-ng-bootstrap-pagination.mjs.map +1 -1
  780. package/fesm2020/mintplayer-ng-bootstrap-placeholder.mjs +74 -74
  781. package/fesm2020/mintplayer-ng-bootstrap-placeholder.mjs.map +1 -1
  782. package/fesm2020/mintplayer-ng-bootstrap-popover.mjs +226 -226
  783. package/fesm2020/mintplayer-ng-bootstrap-popover.mjs.map +1 -1
  784. package/fesm2020/mintplayer-ng-bootstrap-progress-bar.mjs +165 -165
  785. package/fesm2020/mintplayer-ng-bootstrap-progress-bar.mjs.map +1 -1
  786. package/fesm2020/mintplayer-ng-bootstrap-range.mjs +89 -89
  787. package/fesm2020/mintplayer-ng-bootstrap-range.mjs.map +1 -1
  788. package/fesm2020/mintplayer-ng-bootstrap-rating.mjs +86 -86
  789. package/fesm2020/mintplayer-ng-bootstrap-rating.mjs.map +1 -1
  790. package/fesm2020/mintplayer-ng-bootstrap-scheduler.mjs +777 -777
  791. package/fesm2020/mintplayer-ng-bootstrap-scheduler.mjs.map +1 -1
  792. package/fesm2020/mintplayer-ng-bootstrap-scrollspy.mjs +142 -142
  793. package/fesm2020/mintplayer-ng-bootstrap-scrollspy.mjs.map +1 -1
  794. package/fesm2020/mintplayer-ng-bootstrap-select.mjs +265 -265
  795. package/fesm2020/mintplayer-ng-bootstrap-select.mjs.map +1 -1
  796. package/fesm2020/mintplayer-ng-bootstrap-select2.mjs +126 -126
  797. package/fesm2020/mintplayer-ng-bootstrap-select2.mjs.map +1 -1
  798. package/fesm2020/mintplayer-ng-bootstrap-snackbar.mjs +118 -118
  799. package/fesm2020/mintplayer-ng-bootstrap-snackbar.mjs.map +1 -1
  800. package/fesm2020/mintplayer-ng-bootstrap-spinner.mjs +50 -50
  801. package/fesm2020/mintplayer-ng-bootstrap-spinner.mjs.map +1 -1
  802. package/fesm2020/mintplayer-ng-bootstrap-tab-control.mjs +70 -70
  803. package/fesm2020/mintplayer-ng-bootstrap-tab-control.mjs.map +1 -1
  804. package/fesm2020/mintplayer-ng-bootstrap-table.mjs +55 -55
  805. package/fesm2020/mintplayer-ng-bootstrap-table.mjs.map +1 -1
  806. package/fesm2020/mintplayer-ng-bootstrap-timepicker.mjs +149 -149
  807. package/fesm2020/mintplayer-ng-bootstrap-timepicker.mjs.map +1 -1
  808. package/fesm2020/mintplayer-ng-bootstrap-toast.mjs +203 -203
  809. package/fesm2020/mintplayer-ng-bootstrap-toast.mjs.map +1 -1
  810. package/fesm2020/mintplayer-ng-bootstrap-toggle-button.mjs +294 -294
  811. package/fesm2020/mintplayer-ng-bootstrap-toggle-button.mjs.map +1 -1
  812. package/fesm2020/mintplayer-ng-bootstrap-tooltip.mjs +157 -157
  813. package/fesm2020/mintplayer-ng-bootstrap-tooltip.mjs.map +1 -1
  814. package/fesm2020/mintplayer-ng-bootstrap-typeahead.mjs +108 -108
  815. package/fesm2020/mintplayer-ng-bootstrap-typeahead.mjs.map +1 -1
  816. package/fesm2020/mintplayer-ng-bootstrap-user-agent.mjs +72 -72
  817. package/fesm2020/mintplayer-ng-bootstrap-user-agent.mjs.map +1 -1
  818. package/fesm2020/mintplayer-ng-bootstrap.mjs +120 -120
  819. package/fesm2020/mintplayer-ng-bootstrap.mjs.map +1 -1
  820. package/file-upload/index.d.ts +1 -1
  821. package/file-upload/src/component/file-upload.component.d.ts +21 -21
  822. package/file-upload/src/directive/file-upload-template.directive.d.ts +8 -8
  823. package/file-upload/src/file-upload.d.ts +4 -4
  824. package/file-upload/src/file-upload.module.d.ts +14 -14
  825. package/file-upload/src/index.d.ts +5 -5
  826. package/file-upload/src/pipes/format-bytes/format-bytes.pipe.d.ts +7 -7
  827. package/file-upload/src/pipes/index.d.ts +1 -1
  828. package/floating-labels/index.d.ts +1 -1
  829. package/floating-labels/src/floating-labels/floating-label/floating-label.component.d.ts +7 -7
  830. package/floating-labels/src/floating-labels/floating-labels.module.d.ts +8 -8
  831. package/floating-labels/src/index.d.ts +2 -2
  832. package/for/index.d.ts +1 -1
  833. package/for/src/for.directive.d.ts +8 -8
  834. package/for/src/for.module.d.ts +8 -8
  835. package/for/src/index.d.ts +2 -2
  836. package/form/index.d.ts +1 -1
  837. package/form/src/form/form.component.d.ts +8 -8
  838. package/form/src/form-control/form-control.directive.d.ts +6 -6
  839. package/form/src/form-group/form-group.directive.d.ts +6 -6
  840. package/form/src/form.module.d.ts +10 -10
  841. package/form/src/index.d.ts +4 -4
  842. package/grid/index.d.ts +1 -1
  843. package/grid/src/component/grid.component.d.ts +12 -12
  844. package/grid/src/directives/col-form-label/col-form-label.directive.d.ts +6 -6
  845. package/grid/src/directives/column/column.directive.d.ts +13 -13
  846. package/grid/src/directives/index.d.ts +3 -3
  847. package/grid/src/directives/row/row.directive.d.ts +6 -6
  848. package/grid/src/grid.module.d.ts +11 -11
  849. package/grid/src/index.d.ts +4 -4
  850. package/grid/src/interfaces/column-definition.d.ts +9 -9
  851. package/grid/src/interfaces/index.d.ts +1 -1
  852. package/has-overlay/index.d.ts +1 -1
  853. package/has-overlay/src/has-overlay/has-overlay.component.d.ts +5 -5
  854. package/has-overlay/src/has-overlay/has-overlay.module.d.ts +8 -8
  855. package/has-overlay/src/index.d.ts +2 -2
  856. package/icon/index.d.ts +2 -2
  857. package/icon/src/icon.component.d.ts +12 -12
  858. package/icon/src/icon.module.d.ts +8 -8
  859. package/index.d.ts +4 -4
  860. package/input-group/index.d.ts +1 -1
  861. package/input-group/src/index.d.ts +2 -2
  862. package/input-group/src/input-group/input-group.component.d.ts +5 -5
  863. package/input-group/src/input-group.module.d.ts +8 -8
  864. package/lazy-loading/index.d.ts +1 -1
  865. package/lazy-loading/src/index.d.ts +2 -2
  866. package/lazy-loading/src/lazy-load/lazy-load.directive.d.ts +13 -13
  867. package/lazy-loading/src/lazy-loading.module.d.ts +8 -8
  868. package/lib/enums/color.enum.d.ts +13 -13
  869. package/lib/enums/index.d.ts +1 -1
  870. package/lib/pipes/font-color/font-color.module.d.ts +8 -8
  871. package/lib/pipes/font-color/font-color.pipe.d.ts +7 -7
  872. package/lib/pipes/font-color/index.d.ts +2 -2
  873. package/lib/pipes/in-list/in-list.module.d.ts +8 -8
  874. package/lib/pipes/in-list/in-list.pipe.d.ts +7 -7
  875. package/lib/pipes/in-list/index.d.ts +2 -2
  876. package/lib/pipes/index.d.ts +3 -3
  877. package/lib/pipes/uc-first/index.d.ts +2 -2
  878. package/lib/pipes/uc-first/uc-first.module.d.ts +8 -8
  879. package/lib/pipes/uc-first/uc-first.pipe.d.ts +7 -7
  880. package/lib/providers/development.provider.d.ts +7 -7
  881. package/lib/providers/index.d.ts +1 -1
  882. package/lib/types/breakpoint.d.ts +1 -1
  883. package/lib/types/index.d.ts +4 -4
  884. package/lib/types/position.d.ts +1 -1
  885. package/lib/types/size.d.ts +1 -1
  886. package/lib/types/view-state.type.d.ts +1 -1
  887. package/list-group/index.d.ts +1 -1
  888. package/list-group/src/index.d.ts +3 -3
  889. package/list-group/src/list-group/list-group.component.d.ts +10 -10
  890. package/list-group/src/list-group-item/list-group-item.component.d.ts +8 -8
  891. package/list-group/src/list-group.module.d.ts +9 -9
  892. package/markdown/index.d.ts +5 -5
  893. package/markdown/src/bold/bold.pipe.d.ts +10 -10
  894. package/markdown/src/italic/italic.pipe.d.ts +10 -10
  895. package/markdown/src/markdown.module.d.ts +11 -11
  896. package/markdown/src/strikethrough/strikethrough.pipe.d.ts +10 -10
  897. package/markdown/src/underline/underline.pipe.d.ts +10 -10
  898. package/modal/index.d.ts +1 -1
  899. package/modal/src/components/index.d.ts +2 -2
  900. package/modal/src/components/modal/modal.component.d.ts +9 -9
  901. package/modal/src/components/modal-host/modal-host.component.d.ts +27 -27
  902. package/modal/src/directives/index.d.ts +5 -5
  903. package/modal/src/directives/modal/modal.directive.d.ts +8 -8
  904. package/modal/src/directives/modal-body/modal-body.directive.d.ts +6 -6
  905. package/modal/src/directives/modal-close/modal-close.directive.d.ts +9 -9
  906. package/modal/src/directives/modal-footer/modal-footer.directive.d.ts +6 -6
  907. package/modal/src/directives/modal-header/modal-header.directive.d.ts +6 -6
  908. package/modal/src/index.d.ts +3 -3
  909. package/modal/src/modal.module.d.ts +16 -16
  910. package/modal/src/providers/modal-content.provider.d.ts +2 -2
  911. package/modal/src/providers/portal-factory.provider.d.ts +3 -3
  912. package/multiselect/index.d.ts +1 -1
  913. package/multiselect/src/component/multiselect.component.d.ts +15 -15
  914. package/multiselect/src/directives/button-template/button-template.directive.d.ts +8 -8
  915. package/multiselect/src/directives/footer-template/footer-template.directive.d.ts +8 -8
  916. package/multiselect/src/directives/header-template/header-template.directive.d.ts +8 -8
  917. package/multiselect/src/directives/index.d.ts +3 -3
  918. package/multiselect/src/index.d.ts +3 -3
  919. package/multiselect/src/multiselect.module.d.ts +17 -17
  920. package/navbar/index.d.ts +1 -1
  921. package/navbar/src/dropdown-toggle/dropdown-toggle.directive.d.ts +13 -13
  922. package/navbar/src/expand-button/expand-button.directive.d.ts +8 -8
  923. package/navbar/src/index.d.ts +11 -11
  924. package/navbar/src/nav-link/nav-link.directive.d.ts +10 -10
  925. package/navbar/src/navbar/navbar.component.d.ts +32 -32
  926. package/navbar/src/navbar-brand/navbar-brand.component.d.ts +7 -7
  927. package/navbar/src/navbar-content/navbar-content.directive.d.ts +18 -18
  928. package/navbar/src/navbar-dropdown/navbar-dropdown.component.d.ts +33 -33
  929. package/navbar/src/navbar-item/navbar-item.component.d.ts +19 -19
  930. package/navbar/src/navbar-nav/navbar-nav.component.d.ts +19 -19
  931. package/navbar/src/navbar-toggler/navbar-toggler.component.d.ts +13 -13
  932. package/navbar/src/navbar.module.d.ts +22 -21
  933. package/navigation-lock/index.d.ts +1 -1
  934. package/navigation-lock/src/directive/navigation-lock.directive.d.ts +34 -34
  935. package/navigation-lock/src/guard/navigation-lock.guard.d.ts +8 -8
  936. package/navigation-lock/src/index.d.ts +4 -4
  937. package/navigation-lock/src/interface/has-navigation-lock.d.ts +15 -15
  938. package/navigation-lock/src/navigation-lock.module.d.ts +9 -9
  939. package/no-noscript/index.d.ts +1 -1
  940. package/no-noscript/src/index.d.ts +2 -2
  941. package/no-noscript/src/no-noscript/no-noscript.directive.d.ts +8 -8
  942. package/no-noscript/src/no-noscript.module.d.ts +8 -8
  943. package/offcanvas/index.d.ts +1 -1
  944. package/offcanvas/src/components/index.d.ts +4 -4
  945. package/offcanvas/src/components/offcanvas/offcanvas.component.d.ts +33 -33
  946. package/offcanvas/src/components/offcanvas-body/offcanvas-body.component.d.ts +9 -9
  947. package/offcanvas/src/components/offcanvas-header/offcanvas-header.component.d.ts +8 -8
  948. package/offcanvas/src/components/offcanvas-host/offcanvas-host.component.d.ts +36 -36
  949. package/offcanvas/src/directives/index.d.ts +3 -3
  950. package/offcanvas/src/directives/offcanvas-close/offcanvas-close.directive.d.ts +9 -9
  951. package/offcanvas/src/directives/offcanvas-content/offcanvas-content.directive.d.ts +8 -8
  952. package/offcanvas/src/directives/offcanvas-push/offcanvas-push.directive.d.ts +16 -16
  953. package/offcanvas/src/index.d.ts +3 -3
  954. package/offcanvas/src/offcanvas.module.d.ts +16 -16
  955. package/offcanvas/src/providers/offcanvas-content.provider.d.ts +2 -2
  956. package/offcanvas/src/providers/portal-factory.provider.d.ts +3 -3
  957. package/ordinal-number/index.d.ts +1 -1
  958. package/ordinal-number/src/index.d.ts +2 -2
  959. package/ordinal-number/src/ordinal-number/ordinal-number.pipe.d.ts +10 -10
  960. package/ordinal-number/src/ordinal-number.module.d.ts +8 -8
  961. package/package.json +12 -3
  962. package/pagination/index.d.ts +1 -1
  963. package/pagination/src/component/index.d.ts +1 -1
  964. package/pagination/src/component/pagination/pagination.component.d.ts +49 -49
  965. package/pagination/src/index.d.ts +4 -4
  966. package/pagination/src/interfaces/index.d.ts +1 -1
  967. package/pagination/src/interfaces/page-with-selection.d.ts +5 -5
  968. package/pagination/src/pagination.module.d.ts +8 -8
  969. package/pagination/src/types/index.d.ts +1 -1
  970. package/pagination/src/types/page-number.type.d.ts +1 -1
  971. package/placeholder/index.d.ts +1 -1
  972. package/placeholder/src/index.d.ts +3 -3
  973. package/placeholder/src/placeholder/placeholder.component.d.ts +11 -11
  974. package/placeholder/src/placeholder-field/placeholder-field.directive.d.ts +16 -16
  975. package/placeholder/src/placeholder.module.d.ts +9 -9
  976. package/popover/index.d.ts +1 -1
  977. package/popover/src/component/popover.component.d.ts +19 -19
  978. package/popover/src/directives/index.d.ts +3 -3
  979. package/popover/src/directives/popover/popover.directive.d.ts +28 -28
  980. package/popover/src/directives/popover-body/popover-body.directive.d.ts +6 -6
  981. package/popover/src/directives/popover-header/popover-header.directive.d.ts +6 -6
  982. package/popover/src/index.d.ts +3 -3
  983. package/popover/src/popover.module.d.ts +13 -13
  984. package/popover/src/providers/popover-content.provider.d.ts +2 -2
  985. package/popover/src/providers/portal-factory.provider.d.ts +3 -3
  986. package/progress-bar/index.d.ts +1 -1
  987. package/progress-bar/src/index.d.ts +3 -3
  988. package/progress-bar/src/progress/progress.component.d.ts +8 -8
  989. package/progress-bar/src/progress-bar/progress-bar.component.d.ts +31 -31
  990. package/progress-bar/src/progress-bar.module.d.ts +9 -9
  991. package/range/index.d.ts +1 -1
  992. package/range/src/component/range.component.d.ts +11 -11
  993. package/range/src/index.d.ts +3 -3
  994. package/range/src/range.module.d.ts +9 -9
  995. package/range/src/value-accessor/range-value-accessor.d.ts +20 -20
  996. package/rating/index.d.ts +1 -1
  997. package/rating/src/component/rating.component.d.ts +22 -22
  998. package/rating/src/index.d.ts +2 -2
  999. package/rating/src/rating.module.d.ts +8 -8
  1000. package/scheduler/index.d.ts +1 -1
  1001. package/scheduler/src/components/index.d.ts +2 -2
  1002. package/scheduler/src/components/resource-group-presenter/resource-group-presenter.component.d.ts +26 -26
  1003. package/scheduler/src/components/scheduler/scheduler.component.d.ts +86 -86
  1004. package/scheduler/src/constants/available-scales.d.ts +2 -2
  1005. package/scheduler/src/constants/index.d.ts +1 -1
  1006. package/scheduler/src/enums/drag-operation.d.ts +6 -6
  1007. package/scheduler/src/enums/index.d.ts +1 -1
  1008. package/scheduler/src/enums/scheduler-mode.d.ts +4 -4
  1009. package/scheduler/src/index.d.ts +5 -5
  1010. package/scheduler/src/interfaces/drag-operation.d.ts +7 -7
  1011. package/scheduler/src/interfaces/index.d.ts +5 -5
  1012. package/scheduler/src/interfaces/preview-event.d.ts +4 -4
  1013. package/scheduler/src/interfaces/resource-group.d.ts +5 -5
  1014. package/scheduler/src/interfaces/resource-or-group.d.ts +6 -6
  1015. package/scheduler/src/interfaces/resource.d.ts +5 -5
  1016. package/scheduler/src/interfaces/scheduler-event-part.d.ts +6 -6
  1017. package/scheduler/src/interfaces/scheduler-event-with-parts.d.ts +6 -6
  1018. package/scheduler/src/interfaces/scheduler-event.d.ts +6 -6
  1019. package/scheduler/src/interfaces/scheduler-schale.d.ts +5 -5
  1020. package/scheduler/src/interfaces/scheduler-stamp-with-slots.d.ts +6 -6
  1021. package/scheduler/src/interfaces/time-slot.d.ts +4 -4
  1022. package/scheduler/src/interfaces/timeline-options.d.ts +3 -3
  1023. package/scheduler/src/interfaces/timeline-track.d.ts +5 -5
  1024. package/scheduler/src/interfaces/week-options.d.ts +3 -3
  1025. package/scheduler/src/pipes/bs-seconds-timespan.pipe/bs-seconds-timespan.pipe.d.ts +9 -9
  1026. package/scheduler/src/pipes/bs-seconds-today-offset/bs-seconds-today-offset.pipe.d.ts +9 -9
  1027. package/scheduler/src/pipes/date-offset/date-offset.pipe.d.ts +8 -8
  1028. package/scheduler/src/pipes/day-of-week/day-of-week.pipe.d.ts +9 -9
  1029. package/scheduler/src/scheduler.module.d.ts +14 -14
  1030. package/scheduler/src/services/timeline/timeline.service.d.ts +14 -14
  1031. package/scrollspy/index.d.ts +1 -1
  1032. package/scrollspy/src/component/scrollspy.component.d.ts +25 -25
  1033. package/scrollspy/src/directives/scrollspy.directive.d.ts +8 -8
  1034. package/scrollspy/src/index.d.ts +4 -4
  1035. package/scrollspy/src/scrollspy.module.d.ts +9 -9
  1036. package/scrollspy/src/services/index.d.ts +1 -1
  1037. package/scrollspy/src/services/scroll-offset/scroll-offset.service.d.ts +9 -9
  1038. package/select/index.d.ts +1 -1
  1039. package/select/src/component/select.component.d.ts +26 -26
  1040. package/select/src/index.d.ts +4 -4
  1041. package/select/src/select.module.d.ts +9 -9
  1042. package/select/src/types/index.d.ts +1 -1
  1043. package/select/src/types/select-size.d.ts +1 -1
  1044. package/select/src/value-accessors/index.d.ts +1 -1
  1045. package/select/src/value-accessors/select-value-accessor.d.ts +44 -44
  1046. package/select2/index.d.ts +1 -1
  1047. package/select2/src/component/select2.component.d.ts +25 -25
  1048. package/select2/src/directive/item-template.directive.d.ts +9 -9
  1049. package/select2/src/index.d.ts +3 -3
  1050. package/select2/src/select2.module.d.ts +14 -14
  1051. package/snackbar/index.d.ts +1 -1
  1052. package/snackbar/src/component/snackbar.component.d.ts +15 -15
  1053. package/snackbar/src/directives/index.d.ts +1 -1
  1054. package/snackbar/src/directives/snackbar-close/snackbar-close.directive.d.ts +11 -11
  1055. package/snackbar/src/index.d.ts +5 -5
  1056. package/snackbar/src/interfaces/index.d.ts +1 -1
  1057. package/snackbar/src/interfaces/snackbar-animation-meta.d.ts +7 -7
  1058. package/snackbar/src/providers/snackbar-content.provider.d.ts +2 -2
  1059. package/snackbar/src/service/snackbar.service.d.ts +13 -13
  1060. package/snackbar/src/snackbar.module.d.ts +11 -11
  1061. package/spinner/index.d.ts +1 -1
  1062. package/spinner/src/index.d.ts +2 -2
  1063. package/spinner/src/spinner.component.d.ts +19 -19
  1064. package/spinner/src/spinner.module.d.ts +8 -8
  1065. package/src/assets/ic-upload-file.svg +7 -7
  1066. package/src/styles/custom.scss +4 -4
  1067. package/src/styles/ngx-highlight-themes/solarized-dark.scss +89 -89
  1068. package/src/styles/utilities/cursor.scss +9 -9
  1069. package/src/styles/utilities/overflow.scss +9 -9
  1070. package/src/styles/utilities/white-space.scss +9 -9
  1071. package/tab-control/index.d.ts +1 -1
  1072. package/tab-control/src/index.d.ts +3 -3
  1073. package/tab-control/src/tab-control/tab-control.component.d.ts +12 -12
  1074. package/tab-control/src/tab-control.module.d.ts +9 -9
  1075. package/tab-control/src/tab-page/tab-page.component.d.ts +11 -11
  1076. package/table/index.d.ts +1 -1
  1077. package/table/src/component/table.component.d.ts +15 -15
  1078. package/table/src/index.d.ts +2 -2
  1079. package/table/src/table.module.d.ts +8 -8
  1080. package/timepicker/index.d.ts +1 -1
  1081. package/timepicker/src/index.d.ts +2 -2
  1082. package/timepicker/src/timepicker.component.d.ts +27 -27
  1083. package/timepicker/src/timepicker.module.d.ts +17 -17
  1084. package/toast/index.d.ts +1 -1
  1085. package/toast/src/components/index.d.ts +4 -4
  1086. package/toast/src/components/toast/toast.component.d.ts +6 -6
  1087. package/toast/src/components/toast-body/toast-body.component.d.ts +6 -6
  1088. package/toast/src/components/toast-container/toast-container.component.d.ts +9 -9
  1089. package/toast/src/components/toast-header/toast-header.component.d.ts +6 -6
  1090. package/toast/src/directives/index.d.ts +1 -1
  1091. package/toast/src/directives/toast-close/toast-close.directive.d.ts +12 -12
  1092. package/toast/src/index.d.ts +5 -5
  1093. package/toast/src/pipes/add-properties.pipe.d.ts +7 -7
  1094. package/toast/src/providers/portal-factory.provider.d.ts +3 -3
  1095. package/toast/src/services/index.d.ts +1 -1
  1096. package/toast/src/services/toast/toast.service.d.ts +22 -22
  1097. package/toast/src/toast.module.d.ts +15 -15
  1098. package/toggle-button/index.d.ts +1 -1
  1099. package/toggle-button/src/component/toggle-button.component.d.ts +37 -37
  1100. package/toggle-button/src/directives/index.d.ts +1 -1
  1101. package/toggle-button/src/directives/toggle-button-group/toggle-button-group.directive.d.ts +9 -9
  1102. package/toggle-button/src/index.d.ts +5 -5
  1103. package/toggle-button/src/toggle-button.module.d.ts +10 -10
  1104. package/toggle-button/src/types/check-style.d.ts +1 -1
  1105. package/toggle-button/src/types/index.d.ts +1 -1
  1106. package/toggle-button/src/value-accessor/toggle-button-value-accessor.d.ts +20 -20
  1107. package/tooltip/index.d.ts +1 -1
  1108. package/tooltip/src/component/tooltip.component.d.ts +15 -15
  1109. package/tooltip/src/directive/tooltip.directive.d.ts +20 -20
  1110. package/tooltip/src/index.d.ts +2 -2
  1111. package/tooltip/src/providers/tooltip-content.provider.d.ts +2 -2
  1112. package/tooltip/src/tooltip.module.d.ts +11 -11
  1113. package/typeahead/index.d.ts +1 -1
  1114. package/typeahead/src/index.d.ts +2 -2
  1115. package/typeahead/src/typeahead.component.d.ts +26 -26
  1116. package/typeahead/src/typeahead.module.d.ts +14 -14
  1117. package/user-agent/index.d.ts +1 -1
  1118. package/user-agent/src/index.d.ts +3 -3
  1119. package/user-agent/src/user-agent/user-agent.directive.d.ts +14 -14
  1120. package/user-agent/src/user-agent/user-agent.module.d.ts +8 -8
  1121. package/user-agent/src/user-agent.type.d.ts +1 -1
@@ -1,538 +1,538 @@
1
- import { Component, EventEmitter, HostListener, Input, Output, QueryList, ViewChildren } from '@angular/core';
2
- import { BehaviorSubject, combineLatest, filter, map, Subject, take, takeUntil } from 'rxjs';
3
- import { BsCalendarMonthService } from '@mintplayer/ng-bootstrap/calendar-month';
4
- import { ESchedulerMode } from '../../enums/scheduler-mode';
5
- import { EDragOperation } from '../../enums/drag-operation';
6
- import { BsTimelineService } from '../../services/timeline/timeline.service';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@mintplayer/ng-bootstrap/calendar-month";
9
- import * as i2 from "../../services/timeline/timeline.service";
10
- import * as i3 from "@angular/common";
11
- import * as i4 from "@mintplayer/ng-bootstrap/icon";
12
- import * as i5 from "../resource-group-presenter/resource-group-presenter.component";
13
- import * as i6 from "../../pipes/bs-seconds-timespan.pipe/bs-seconds-timespan.pipe";
14
- import * as i7 from "../../pipes/bs-seconds-today-offset/bs-seconds-today-offset.pipe";
15
- import * as i8 from "../../pipes/day-of-week/day-of-week.pipe";
16
- export class BsSchedulerComponent {
17
- constructor(calendarMonthService, timelineService) {
18
- this.calendarMonthService = calendarMonthService;
19
- this.timelineService = timelineService;
20
- this.resources$ = new BehaviorSubject([]);
21
- this.weekOptions$ = new BehaviorSubject({ unitHeight: 30 });
22
- this.timelineOptions$ = new BehaviorSubject({ unitWidth: 50 });
23
- this.previewEvent$ = new BehaviorSubject(null);
24
- this.timeSlotDuration$ = new BehaviorSubject(1800);
25
- this.timeSlots$ = new BehaviorSubject([]);
26
- this.mouseState$ = new BehaviorSubject(false);
27
- this.hoveredTimeSlot$ = new BehaviorSubject(null);
28
- this.hoveredEvent$ = new BehaviorSubject(null);
29
- this.destroyed$ = new Subject();
30
- //#region Mode
31
- this.modes = ESchedulerMode;
32
- this.mode$ = new BehaviorSubject(ESchedulerMode.week);
33
- this.modeChange = new EventEmitter();
34
- //#endregion
35
- // //#region Scale
36
- // scale$ = new BehaviorSubject<SchedulerScale>(availableScales[4]);
37
- // @Output() public scaleChange = new EventEmitter<SchedulerScale>();
38
- // public get scale() {
39
- // return this.scale$.value;
40
- // }
41
- // @Input() public set scale(value: SchedulerScale) {
42
- // this.scale$.next(value);
43
- // }
44
- // //#endregion
45
- //#region WeekOptions
46
- this.weekOptionsChange = new EventEmitter();
47
- //#endregion
48
- //#region TimelineOptions
49
- this.timelineOptionsChange = new EventEmitter();
50
- //#endregion
51
- //#region maxInnerHeight
52
- this.maxInnerHeight = null;
53
- this.operation = null;
54
- this.dragStartTimeslot = null;
55
- const monday = this.calendarMonthService.getMondayBefore(new Date());
56
- this.currentWeekOrMonth$ = new BehaviorSubject(monday);
57
- this.shownDays$ = combineLatest([this.currentWeekOrMonth$, this.mode$])
58
- .pipe(map(([currentDay, mode]) => {
59
- currentDay.setHours(0);
60
- currentDay.setMinutes(0);
61
- currentDay.setSeconds(0);
62
- currentDay.setMilliseconds(0);
63
- switch (mode) {
64
- case ESchedulerMode.week: {
65
- return Array.from(Array(7).keys()).map((x) => this.addDays(currentDay, x));
66
- }
67
- case ESchedulerMode.timeline: {
68
- const firstDay = new Date(currentDay.getFullYear(), currentDay.getMonth(), 1);
69
- const daysOfMonth = new Date(currentDay.getFullYear(), currentDay.getMonth() + 1, 0).getDate();
70
- return Array.from(Array(daysOfMonth).keys()).map((x) => this.addDays(firstDay, x));
71
- }
72
- }
73
- }));
74
- this.daysOfWeekWithTimestamps$ = this.shownDays$
75
- .pipe(map((shownDays) => ({ start: shownDays[0].getTime(), end: shownDays[shownDays.length - 1].getTime() + 24 * 60 * 60 * 1000 })));
76
- this.events$ = this.resources$
77
- .pipe(map((resourcesOrGroups) => resourcesOrGroups.map(resOrGroup => this.getResourcesForGroup(resOrGroup))))
78
- .pipe(map(jaggedResources => jaggedResources.reduce((flat, toFlatten) => flat.concat(toFlatten), [])))
79
- .pipe(map(resources => resources.map(res => res.events)))
80
- .pipe(map(jaggedEvents => jaggedEvents.reduce((flat, toFlatten) => flat.concat(toFlatten), [])));
81
- // groups.reduce((flat, toFlatten) => flat.concat(toFlatten.children), [])
82
- this.eventParts$ = this.events$.pipe(map((events) => events.map((ev) => this.timelineService.splitInParts(ev))));
83
- this.eventPartsForThisWeek$ = combineLatest([
84
- this.daysOfWeekWithTimestamps$,
85
- this.eventParts$
86
- .pipe(map(eventParts => eventParts.map(evp => evp.parts)))
87
- .pipe(map(jaggedParts => jaggedParts.reduce((flat, toFlatten) => flat.concat(toFlatten), [])))
88
- ])
89
- .pipe(map(([startAndEnd, eventParts]) => {
90
- return eventParts.filter(eventPart => {
91
- return !((eventPart.end.getTime() <= startAndEnd.start) || (eventPart.start.getTime() >= startAndEnd.end));
92
- });
93
- }));
94
- this.previewEventParts$ = this.previewEvent$.pipe(map((event) => {
95
- if (event) {
96
- return this.timelineService.splitInParts(event);
97
- }
98
- else {
99
- return null;
100
- }
101
- }));
102
- this.previewEventPartsForThisWeek$ = combineLatest([this.daysOfWeekWithTimestamps$, this.previewEventParts$])
103
- .pipe(map(([startAndEnd, previewEventParts]) => {
104
- if (previewEventParts) {
105
- return previewEventParts.parts.filter(eventPart => {
106
- return !((eventPart.end.getTime() <= startAndEnd.start) || (eventPart.start.getTime() >= startAndEnd.end));
107
- });
108
- }
109
- else {
110
- return [];
111
- }
112
- }));
113
- this.timelinedEventPartsForThisWeek$ = this.eventPartsForThisWeek$
114
- .pipe(map(eventParts => {
115
- // We'll only use the events for this week
116
- const events = eventParts.map(ep => ep.event)
117
- .filter((e, i, list) => list.indexOf(e) === i)
118
- .filter((e) => !!e)
119
- .map((e) => e);
120
- const timeline = this.timelineService.getTimeline(events);
121
- const result = timeline.map(track => track.events.map(ev => ({ event: ev, index: track.index })))
122
- .reduce((flat, toFlatten) => flat.concat(toFlatten), [])
123
- .map((evi) => eventParts.filter(p => p.event === evi.event).map(p => ({ part: p, index: evi.index })))
124
- .reduce((flat, toFlatten) => flat.concat(toFlatten), []);
125
- return {
126
- total: timeline.length,
127
- parts: result
128
- };
129
- }));
130
- combineLatest([this.mode$, this.shownDays$, this.timeSlotDuration$])
131
- .pipe(filter(([mode, shownDays, duration]) => mode !== null))
132
- .pipe(map(([mode, shownDays, duration]) => {
133
- switch (mode) {
134
- case ESchedulerMode.week: {
135
- const timeSlotsPerDay = Math.floor((60 * 60 * 24) / duration);
136
- return Array.from(Array(timeSlotsPerDay).keys()).map((index) => {
137
- const timeslotForMonday = this.createTimeslot(shownDays[0], index, duration);
138
- return {
139
- slots: shownDays.map((day) => {
140
- const start = new Date(day);
141
- start.setHours(timeslotForMonday.start.getHours());
142
- start.setMinutes(timeslotForMonday.start.getMinutes());
143
- start.setSeconds(timeslotForMonday.start.getSeconds());
144
- start.setMilliseconds(timeslotForMonday.start.getMilliseconds());
145
- const end = new Date(day);
146
- end.setHours(timeslotForMonday.end.getHours());
147
- end.setMinutes(timeslotForMonday.end.getMinutes());
148
- end.setSeconds(timeslotForMonday.end.getSeconds());
149
- end.setMilliseconds(timeslotForMonday.end.getMilliseconds());
150
- end.setDate(end.getDate() + timeslotForMonday.end.getDate() - timeslotForMonday.start.getDate());
151
- return { start, end };
152
- }),
153
- stamp: timeslotForMonday.start
154
- };
155
- });
156
- }
157
- case ESchedulerMode.timeline: {
158
- const totalTimeslots = (24 * 60 * 60) / duration;
159
- return shownDays.map((day) => {
160
- return {
161
- slots: Array.from(Array(totalTimeslots).keys())
162
- .map((index) => {
163
- return this.createTimeslot(day, index, duration);
164
- }),
165
- stamp: day
166
- };
167
- });
168
- }
169
- default: {
170
- throw 'Unknown value for Mode: ' + mode;
171
- }
172
- }
173
- }))
174
- .subscribe((timeslots) => {
175
- // For performance reasons, we're not using an observable here, but persist the timeslots in a BehaviorSubject.
176
- this.timeSlots$.next(timeslots);
177
- });
178
- this.weekOptions$
179
- .pipe(takeUntil(this.destroyed$))
180
- .subscribe((weekOptions) => {
181
- this.weekOptionsChange.emit(weekOptions);
182
- });
183
- this.timelineOptions$
184
- .pipe(takeUntil(this.destroyed$))
185
- .subscribe((timelineOptions) => {
186
- this.timelineOptionsChange.emit(timelineOptions);
187
- });
188
- // combineLatest([this.mode$, this.scale$])
189
- // .pipe(filter(([mode, scale]) => mode === ESchedulerMode.timeline))
190
- }
191
- createTimeslot(date, index, duration) {
192
- const timeSlotStart = new Date(date);
193
- timeSlotStart.setTime(+timeSlotStart.getTime() + index * duration * 1000);
194
- const timeSlotEnd = new Date(timeSlotStart);
195
- timeSlotEnd.setTime(+timeSlotEnd.getTime() + duration * 1000);
196
- return { start: timeSlotStart, end: timeSlotEnd };
197
- }
198
- getResourcesForGroup(resourceOrGroup) {
199
- if ('children' in resourceOrGroup) {
200
- return resourceOrGroup.children
201
- .map((child) => this.getResourcesForGroup(child))
202
- .reduce((flat, toFlatten) => flat.concat(toFlatten), []);
203
- }
204
- else {
205
- return [resourceOrGroup];
206
- }
207
- }
208
- get mode() {
209
- return this.mode$.value;
210
- }
211
- set mode(value) {
212
- this.mode$.next(value);
213
- }
214
- get weekOptions() {
215
- return this.weekOptions$.value;
216
- }
217
- set weekOptions(value) {
218
- this.weekOptions$.next(value);
219
- }
220
- get timelineOptions() {
221
- return this.timelineOptions$.value;
222
- }
223
- set timelineOptions(value) {
224
- this.timelineOptions$.next(value);
225
- }
226
- //#endregion
227
- //#region Resources
228
- get resources() {
229
- return this.resources$.value;
230
- }
231
- set resources(value) {
232
- this.resources$.next(value);
233
- }
234
- //#endregion
235
- addDays(date, days) {
236
- const result = new Date(date);
237
- result.setDate(result.getDate() + days);
238
- return result;
239
- }
240
- onPreviousWeekOrMonth() {
241
- this.onChangeWeekOrMonth(false);
242
- }
243
- onNextWeekOrMonth() {
244
- this.onChangeWeekOrMonth(true);
245
- }
246
- onChangeWeekOrMonth(next) {
247
- combineLatest([this.currentWeekOrMonth$, this.mode$])
248
- .pipe(map(([currentWeekOrMonth, mode]) => {
249
- switch (mode) {
250
- case ESchedulerMode.week: {
251
- return this.addDays(currentWeekOrMonth, (next ? 7 : -7));
252
- }
253
- case ESchedulerMode.timeline: {
254
- return new Date(currentWeekOrMonth.getFullYear(), currentWeekOrMonth.getMonth() + (next ? 1 : -1), 1);
255
- }
256
- }
257
- }), take(1))
258
- .subscribe((w) => this.currentWeekOrMonth$.next(w));
259
- }
260
- onHoverEvent(ev) {
261
- this.hoveredEvent$.next(ev);
262
- }
263
- onLeaveEvent(ev) {
264
- this.hoveredEvent$.next(null);
265
- }
266
- onCreateEvent(ev, slot) {
267
- ev.preventDefault();
268
- this.mouseState$.next(true);
269
- this.dragStartTimeslot = slot;
270
- this.operation = {
271
- operation: EDragOperation.createEvent,
272
- event: {
273
- start: slot.start,
274
- end: slot.end,
275
- color: '#F00',
276
- description: 'Test event',
277
- },
278
- meta: null,
279
- };
280
- this.previewEvent$.next({ start: slot.start, end: slot.end });
281
- }
282
- randomColor() {
283
- const brightness = 128;
284
- return '#' + this.randomChannel(brightness) + this.randomChannel(brightness) + this.randomChannel(brightness);
285
- }
286
- randomChannel(brightness) {
287
- const r = 255 - brightness;
288
- const n = 0 | ((Math.random() * r) + brightness);
289
- const s = n.toString(16);
290
- return (s.length == 1) ? '0' + s : s;
291
- }
292
- onStartDragEvent(eventPart, ev) {
293
- ev.preventDefault();
294
- this.hoveredTimeSlot$.pipe(take(1)).subscribe((hoveredTimeSlot) => {
295
- if (eventPart.event) {
296
- this.dragStartTimeslot = hoveredTimeSlot;
297
- this.operation = {
298
- operation: EDragOperation.moveEvent,
299
- event: eventPart.event,
300
- meta: null,
301
- };
302
- this.previewEvent$.next({ start: eventPart.event.start, end: eventPart.event.end });
303
- }
304
- });
305
- }
306
- onStartResizeEvent(event, position) {
307
- if (event) {
308
- switch (position) {
309
- case 'top':
310
- {
311
- this.operation = {
312
- operation: EDragOperation.resizeEvent,
313
- event: event,
314
- meta: { position },
315
- };
316
- this.previewEvent$.next({ start: event.start, end: event.end });
317
- }
318
- break;
319
- case 'bottom':
320
- {
321
- this.operation = {
322
- operation: EDragOperation.resizeEvent,
323
- event: event,
324
- meta: { position },
325
- };
326
- this.previewEvent$.next({ start: event.start, end: event.end });
327
- }
328
- break;
329
- }
330
- }
331
- }
332
- //#region hoveredTimeslot$
333
- getHoveredTimeslot(ev, timeSlots) {
334
- const hoveredSlots = this.timeSlotElements.filter((el) => {
335
- const rct = el.nativeElement.getBoundingClientRect();
336
- if (rct.left <= ev.x && ev.x <= rct.right && rct.top <= ev.y && ev.y <= rct.bottom) {
337
- return true;
338
- }
339
- else {
340
- return false;
341
- }
342
- });
343
- if (!hoveredSlots || hoveredSlots.length === 0) {
344
- return null;
345
- }
346
- const slotElement = hoveredSlots[0].nativeElement;
347
- const strRow = slotElement.getAttribute('data-row');
348
- if (!strRow) {
349
- return null;
350
- }
351
- const row = parseInt(strRow);
352
- const strColumn = slotElement.getAttribute('data-column');
353
- if (!strColumn) {
354
- return null;
355
- }
356
- const column = parseInt(strColumn);
357
- const slot = timeSlots[row].slots[column];
358
- return slot;
359
- }
360
- onMousemove(ev) {
361
- this.timeSlots$.pipe(take(1)).subscribe((timeSlots) => {
362
- const hovered = this.getHoveredTimeslot(ev, timeSlots);
363
- this.hoveredTimeSlot$.next(hovered);
364
- if (this.operation) {
365
- switch (this.operation.operation) {
366
- case EDragOperation.createEvent:
367
- {
368
- if (this.operation.event && this.dragStartTimeslot && hovered && (this.operation.event.end.getTime() != hovered.end.getTime())) {
369
- if (this.dragStartTimeslot.start.getTime() === hovered.start.getTime()) {
370
- // 1 slot
371
- }
372
- else if (this.dragStartTimeslot.start.getTime() < hovered.start.getTime()) {
373
- // Drag down
374
- this.previewEvent$
375
- .pipe(filter((ev) => !!ev && !!this.dragStartTimeslot))
376
- .pipe(map((ev) => {
377
- if (ev && this.dragStartTimeslot) {
378
- ev.start = this.dragStartTimeslot.start;
379
- ev.end = hovered.end;
380
- }
381
- return ev;
382
- }))
383
- .pipe(take(1))
384
- .subscribe((ev) => this.previewEvent$.next(ev));
385
- }
386
- else if (this.dragStartTimeslot.start.getTime() > hovered.start.getTime()) {
387
- // Drag up
388
- this.previewEvent$
389
- .pipe(filter((ev) => !!ev && !!this.dragStartTimeslot))
390
- .pipe(map((ev) => {
391
- if (ev && this.dragStartTimeslot) {
392
- ev.start = hovered.start;
393
- ev.end = this.dragStartTimeslot.end;
394
- }
395
- return ev;
396
- }))
397
- .pipe(take(1))
398
- .subscribe((ev) => this.previewEvent$.next(ev));
399
- }
400
- }
401
- }
402
- break;
403
- case EDragOperation.moveEvent:
404
- {
405
- if (hovered && this.dragStartTimeslot) {
406
- this.previewEvent$
407
- .pipe(filter((ev) => !!ev && !!this.dragStartTimeslot))
408
- .pipe(map((ev) => {
409
- if (ev && this.dragStartTimeslot) {
410
- const result = {
411
- start: new Date(ev.start.getTime() + hovered.start.getTime() - this.dragStartTimeslot.start.getTime()),
412
- end: new Date(ev.end.getTime() + hovered.start.getTime() - this.dragStartTimeslot.start.getTime())
413
- };
414
- this.dragStartTimeslot = hovered;
415
- return result;
416
- }
417
- else {
418
- return ev;
419
- }
420
- }))
421
- .pipe(take(1))
422
- .subscribe(ev => this.previewEvent$.next(ev));
423
- }
424
- }
425
- break;
426
- case EDragOperation.resizeEvent:
427
- {
428
- if (hovered) {
429
- this.previewEvent$
430
- .pipe(filter((ev) => !!ev))
431
- .pipe(map((ev) => {
432
- if (ev && this.operation && this.operation.event) {
433
- if (this.operation.meta.position === 'top') {
434
- ev.start = hovered.start;
435
- ev.end = this.operation.event.end;
436
- }
437
- else if (this.operation.meta.position === 'bottom') {
438
- ev.start = this.operation.event.start;
439
- ev.end = hovered.end;
440
- }
441
- }
442
- return ev;
443
- }))
444
- .pipe(take(1))
445
- .subscribe((ev) => this.previewEvent$.next(ev));
446
- }
447
- }
448
- break;
449
- }
450
- }
451
- });
452
- }
453
- //#endregion
454
- onMouseUp(ev) {
455
- if (this.operation) {
456
- switch (this.operation.operation) {
457
- case EDragOperation.createEvent:
458
- {
459
- combineLatest([this.previewEvent$])
460
- .pipe(take(1))
461
- .subscribe(([previewEvent]) => {
462
- if (previewEvent) {
463
- this.operation = null;
464
- this.dragStartTimeslot = null;
465
- this.resources$.next([
466
- ...this.resources$.value,
467
- {
468
- description: 'New resource group',
469
- events: [{
470
- start: previewEvent.start,
471
- end: previewEvent.end,
472
- color: this.randomColor(),
473
- description: 'New event'
474
- }]
475
- }
476
- ]);
477
- this.previewEvent$.next(null);
478
- }
479
- });
480
- }
481
- break;
482
- case EDragOperation.moveEvent:
483
- case EDragOperation.resizeEvent:
484
- {
485
- this.previewEvent$
486
- .pipe(filter((ev) => !!ev))
487
- .pipe(take(1))
488
- .subscribe((previewEvent) => {
489
- if (this.operation && this.operation.event && previewEvent) {
490
- this.operation.event.start = previewEvent.start;
491
- this.operation.event.end = previewEvent.end;
492
- this.operation = null;
493
- this.dragStartTimeslot = null;
494
- this.resources$.next(this.resources$.value);
495
- this.previewEvent$.next(null);
496
- }
497
- });
498
- }
499
- break;
500
- }
501
- }
502
- }
503
- ngOnDestroy() {
504
- this.destroyed$.next(true);
505
- }
506
- }
507
- BsSchedulerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: BsSchedulerComponent, deps: [{ token: i1.BsCalendarMonthService }, { token: i2.BsTimelineService }], target: i0.ɵɵFactoryTarget.Component });
508
- BsSchedulerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: BsSchedulerComponent, selector: "bs-scheduler", inputs: { mode: "mode", weekOptions: "weekOptions", timelineOptions: "timelineOptions", maxInnerHeight: "maxInnerHeight", resources: "resources" }, outputs: { modeChange: "modeChange", weekOptionsChange: "weekOptionsChange", timelineOptionsChange: "timelineOptionsChange" }, host: { listeners: { "document:mousemove": "onMousemove($event)", "document:mouseup": "onMouseUp($event)" } }, viewQueries: [{ propertyName: "timeSlotElements", predicate: ["slot"], descendants: true }], ngImport: i0, template: "<div class=\"d-flex flex-column w-100 overflow-y-auto mb-0 week-schedule\" [style.max-height.px]=\"null\"\n *ngIf=\"(mode$ | async) === modes.week\">\n <div class=\"calendar-head\">\n <div class=\"w-100 d-flex flex-row\">\n <div class=\"d-flex calendar-left justify-content-between\">\n <button class=\"btn btn-default flex-start\" (click)=\"onPreviousWeekOrMonth()\">\n <bs-icon [icon]=\"'chevron-left'\" class=\"px-0\"></bs-icon>\n </button>\n <button class=\"btn btn-default flex-end\" (click)=\"onNextWeekOrMonth()\">\n <bs-icon [icon]=\"'chevron-right'\" class=\"px-0\"></bs-icon>\n </button>\n </div>\n <div class=\"flex-grow-1 calendar-head-cell\" *ngFor=\"let day of (shownDays$ | async)\">\n <span class=\"d-block col-form-label text-center text-nowrap\">\n <span>{{ day | date: 'dd-MM' }}</span><span class=\"d-none d-lg-inline-block\">-{{ day | date: 'yyyy' }}</span>\n </span>\n </div>\n </div>\n </div>\n <div class=\"calendar-body\" [style.height.px]=\"maxInnerHeight\">\n <div class=\"position-relative\" *ngIf=\"(timeSlots$ | async) as row\">\n <ng-container *ngIf=\"(weekOptions$ | async) as weekOptions\">\n <!-- Timeslots -->\n <div *ngFor=\"let timeslots of row; let i = index\" class=\"d-flex flex-row p-0 timeslot\" [style.height.px]=\"weekOptions.unitHeight\">\n <div class=\"calendar-cell calendar-left align-top px-2 py-0\">{{ timeslots.slots[0].start | date: 'HH:mm:ss' }}</div>\n <div class=\"calendar-cell flex-grow-1\" *ngFor=\"let slot of timeslots.slots; let j = index\" #slot (mousedown)=\"onCreateEvent($event, slot)\" [attr.data-row]=\"i\" [attr.data-column]=\"j\"></div>\n </div>\n\n <!-- Events -->\n <ng-container *ngIf=\"(timeSlotDuration$ | async) as timeSlotDuration\">\n <ng-container *ngIf=\"(timelinedEventPartsForThisWeek$ | async) as partData\">\n <div *ngFor=\"let eventPart of partData.parts\" class=\"event p-0\"\n [style.top.px]=\"(eventPart.part | bsSecondsTodayOffset) / timeSlotDuration * weekOptions.unitHeight\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart.part | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner\" [class.hover]=\"(hoveredEvent$ | async) === eventPart.part.event\"\n [style.width]=\"'calc(100% / ' + partData.total + ')'\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\n [style.margin-left]=\"'calc(100% / ' + partData.total + ' * ' + eventPart.index + ')'\">\n\n <div class=\"event-resize top\"\n *ngIf=\"eventPart.part.start === eventPart.part.event?.start\"\n (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'top')\"></div>\n <div class=\"event-border\"></div>\n <div class=\"event-wrapper\" *ngIf=\"eventPart.part.event\"\n (mousedown)=\"onStartDragEvent(eventPart.part, $event)\"\n (mouseenter)=\"onHoverEvent(eventPart.part.event)\"\n (mouseleave)=\"onLeaveEvent(eventPart.part.event)\">\n <div class=\"event-bg\" [style.background-color]=\"eventPart.part.event.color\"></div>\n <div class=\"event-label\">{{ eventPart.part.event.description }}</div>\n </div>\n <div class=\"event-resize bottom\"\n *ngIf=\"eventPart.part.end === eventPart.part.event?.end\"\n (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'bottom')\"></div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"(previewEventPartsForThisWeek$ | async) as previewPartData\">\n <div *ngFor=\"let eventPart of previewPartData\" class=\"event preview p-0\"\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * weekOptions.unitHeight\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner w-100\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\">\n </div>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n<div class=\"d-flex flex-column-100 overflow-y-auto mb-0 bg-white timeline\" *ngIf=\"(mode$ | async) === modes.timeline\">\n <div class=\"calendar-head d-flex\">\n <button class=\"btn flex-start\" (click)=\"onPreviousWeekOrMonth()\">\n <bs-icon [icon]=\"'chevron-left'\" class=\"px-0\"></bs-icon>\n </button>\n <div class=\"flex-grow-1 h3 py-2 mb-0 text-center\">{{ currentWeekOrMonth$ | async | date: 'MMMM yyyy' }}</div>\n <button class=\"btn flex-start\" (click)=\"onNextWeekOrMonth()\">\n <bs-icon [icon]=\"'chevron-right'\" class=\"px-0\"></bs-icon>\n </button>\n </div>\n \n <div class=\"calendar-body table-responsive overflow-x-auto\">\n <table class=\"table mb-0\">\n <ng-container *ngIf=\"(timeSlots$ | async) as timeSlots\">\n <tr>\n <td></td>\n <td *ngFor=\"let day of timeSlots\" [attr.colspan]=\"day.slots.length\" class=\"text-center px-2\">\n <span class=\"position-sticky day-label\">{{ day.stamp | date: 'd EE' }}</span>\n </td>\n </tr>\n <tr>\n <td></td>\n <ng-container *ngIf=\"(timelineOptions$ | async) as timelineOptions\">\n <ng-container *ngFor=\"let day of timeSlots\">\n <td *ngFor=\"let slot of day.slots\">\n <span class=\"d-block p-0 text-center\" [style.width.px]=\"timelineOptions.unitWidth\">\n {{ slot.start | date: 'HH:mm' }}\n </span>\n </td>\n </ng-container>\n </ng-container>\n </tr>\n <bs-resource-group-presenter *ngFor=\"let group of (resources$ | async)\" [resourceGroup]=\"group\" [timeSlots]=\"timeSlots\"></bs-resource-group-presenter>\n </ng-container>\n </table>\n </div>\n</div>", styles: [":host{display:block;border:1px solid #333;border-top-right-radius:10px;border-top-left-radius:10px;overflow:hidden}.calendar-head{background:#F7F7F7;color:#007aff}.tabel .calendar-head{flex:0 0 auto}.tabel .calendar-body{display:block;flex:1 1 auto}.week-schedule .calendar-head>div{padding-right:18px}.week-schedule .calendar-body{overflow-y:scroll;overflow-x:hidden}.week-schedule .calendar-body .calendar-cell{border-right:1px solid #DEE2E6;border-bottom:1px solid #DEE2E6;cursor:default}.week-schedule .calendar-body .calendar-cell.hover{border-top-width:3px}.week-schedule .calendar-left{width:90px}.week-schedule .event{z-index:5;width:calc((100% - 90px) / 7);height:100px;overflow:hidden;position:absolute;-webkit-user-select:none;user-select:none;pointer-events:none}.week-schedule .event.preview{background:#666;opacity:.6}.week-schedule .event .event-border{background:black;top:0;left:0;bottom:3px;width:3px;position:absolute;z-index:10;opacity:.3}.week-schedule .event .event-inner{position:relative;inset:0 5px 5px 0;cursor:move;pointer-events:all;overflow:hidden}.week-schedule .event .event-inner .event-wrapper{width:calc(100% - 2px);margin:1px auto 1px 0;height:calc(100% - 3px)}.week-schedule .event .event-inner .event-wrapper .event-bg{opacity:.5;height:100%;transition:opacity .15s ease-in-out}.week-schedule .event .event-inner .event-wrapper .event-label{position:absolute;top:0;font-size:12px;font-weight:600;padding:4px}.week-schedule .event .event-inner .event-resize{position:absolute;cursor:ns-resize;height:4px;left:0;right:0;z-index:400}.week-schedule .event .event-inner .event-resize.top{top:0}.week-schedule .event .event-inner .event-resize.bottom{bottom:0}.week-schedule .event .event-inner .event-resize:hover{background:#DDD}.week-schedule .event .event-inner.hover .event-bg{opacity:.7!important}@media (max-width: 767px){.week-schedule.tabel .calendar-head .calendar-head-cell{text-orientation:sideways;writing-mode:vertical-rl}}.timeline.tabel{flex-flow:column}.timeline .calendar-body .tabel{background-color:#f7f7f7}.timeline .calendar-body .tabel tr:first-child td{background-color:#fff;border:1px solid #000}.timeline .calendar-body .tabel tr:first-child td:first-child{min-width:10rem}.timeline .calendar-body .tabel tr:first-child span.day-label{left:0;right:0}.timeline .calendar-body .tabel tr:nth-child(2) td{border-width:1px;border-color:inherit}.timeline .calendar-body .tabel>:not(:first-child){border-top:none!important}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.BsIconComponent, selector: "bs-icon", inputs: ["icon"] }, { kind: "component", type: i5.ResourceGroupPresenterComponent, selector: "bs-resource-group-presenter", inputs: ["level", "resourceGroup", "timeSlots", "isExpanded"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "pipe", type: i6.BsSecondsTimespanPipe, name: "bsSecondsTimespan" }, { kind: "pipe", type: i7.BsSecondsTodayOffsetPipe, name: "bsSecondsTodayOffset" }, { kind: "pipe", type: i8.DayOfWeekPipe, name: "dayOfWeek" }] });
509
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: BsSchedulerComponent, decorators: [{
510
- type: Component,
511
- args: [{ selector: 'bs-scheduler', template: "<div class=\"d-flex flex-column w-100 overflow-y-auto mb-0 week-schedule\" [style.max-height.px]=\"null\"\n *ngIf=\"(mode$ | async) === modes.week\">\n <div class=\"calendar-head\">\n <div class=\"w-100 d-flex flex-row\">\n <div class=\"d-flex calendar-left justify-content-between\">\n <button class=\"btn btn-default flex-start\" (click)=\"onPreviousWeekOrMonth()\">\n <bs-icon [icon]=\"'chevron-left'\" class=\"px-0\"></bs-icon>\n </button>\n <button class=\"btn btn-default flex-end\" (click)=\"onNextWeekOrMonth()\">\n <bs-icon [icon]=\"'chevron-right'\" class=\"px-0\"></bs-icon>\n </button>\n </div>\n <div class=\"flex-grow-1 calendar-head-cell\" *ngFor=\"let day of (shownDays$ | async)\">\n <span class=\"d-block col-form-label text-center text-nowrap\">\n <span>{{ day | date: 'dd-MM' }}</span><span class=\"d-none d-lg-inline-block\">-{{ day | date: 'yyyy' }}</span>\n </span>\n </div>\n </div>\n </div>\n <div class=\"calendar-body\" [style.height.px]=\"maxInnerHeight\">\n <div class=\"position-relative\" *ngIf=\"(timeSlots$ | async) as row\">\n <ng-container *ngIf=\"(weekOptions$ | async) as weekOptions\">\n <!-- Timeslots -->\n <div *ngFor=\"let timeslots of row; let i = index\" class=\"d-flex flex-row p-0 timeslot\" [style.height.px]=\"weekOptions.unitHeight\">\n <div class=\"calendar-cell calendar-left align-top px-2 py-0\">{{ timeslots.slots[0].start | date: 'HH:mm:ss' }}</div>\n <div class=\"calendar-cell flex-grow-1\" *ngFor=\"let slot of timeslots.slots; let j = index\" #slot (mousedown)=\"onCreateEvent($event, slot)\" [attr.data-row]=\"i\" [attr.data-column]=\"j\"></div>\n </div>\n\n <!-- Events -->\n <ng-container *ngIf=\"(timeSlotDuration$ | async) as timeSlotDuration\">\n <ng-container *ngIf=\"(timelinedEventPartsForThisWeek$ | async) as partData\">\n <div *ngFor=\"let eventPart of partData.parts\" class=\"event p-0\"\n [style.top.px]=\"(eventPart.part | bsSecondsTodayOffset) / timeSlotDuration * weekOptions.unitHeight\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart.part | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner\" [class.hover]=\"(hoveredEvent$ | async) === eventPart.part.event\"\n [style.width]=\"'calc(100% / ' + partData.total + ')'\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\n [style.margin-left]=\"'calc(100% / ' + partData.total + ' * ' + eventPart.index + ')'\">\n\n <div class=\"event-resize top\"\n *ngIf=\"eventPart.part.start === eventPart.part.event?.start\"\n (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'top')\"></div>\n <div class=\"event-border\"></div>\n <div class=\"event-wrapper\" *ngIf=\"eventPart.part.event\"\n (mousedown)=\"onStartDragEvent(eventPart.part, $event)\"\n (mouseenter)=\"onHoverEvent(eventPart.part.event)\"\n (mouseleave)=\"onLeaveEvent(eventPart.part.event)\">\n <div class=\"event-bg\" [style.background-color]=\"eventPart.part.event.color\"></div>\n <div class=\"event-label\">{{ eventPart.part.event.description }}</div>\n </div>\n <div class=\"event-resize bottom\"\n *ngIf=\"eventPart.part.end === eventPart.part.event?.end\"\n (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'bottom')\"></div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"(previewEventPartsForThisWeek$ | async) as previewPartData\">\n <div *ngFor=\"let eventPart of previewPartData\" class=\"event preview p-0\"\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * weekOptions.unitHeight\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner w-100\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\">\n </div>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n<div class=\"d-flex flex-column-100 overflow-y-auto mb-0 bg-white timeline\" *ngIf=\"(mode$ | async) === modes.timeline\">\n <div class=\"calendar-head d-flex\">\n <button class=\"btn flex-start\" (click)=\"onPreviousWeekOrMonth()\">\n <bs-icon [icon]=\"'chevron-left'\" class=\"px-0\"></bs-icon>\n </button>\n <div class=\"flex-grow-1 h3 py-2 mb-0 text-center\">{{ currentWeekOrMonth$ | async | date: 'MMMM yyyy' }}</div>\n <button class=\"btn flex-start\" (click)=\"onNextWeekOrMonth()\">\n <bs-icon [icon]=\"'chevron-right'\" class=\"px-0\"></bs-icon>\n </button>\n </div>\n \n <div class=\"calendar-body table-responsive overflow-x-auto\">\n <table class=\"table mb-0\">\n <ng-container *ngIf=\"(timeSlots$ | async) as timeSlots\">\n <tr>\n <td></td>\n <td *ngFor=\"let day of timeSlots\" [attr.colspan]=\"day.slots.length\" class=\"text-center px-2\">\n <span class=\"position-sticky day-label\">{{ day.stamp | date: 'd EE' }}</span>\n </td>\n </tr>\n <tr>\n <td></td>\n <ng-container *ngIf=\"(timelineOptions$ | async) as timelineOptions\">\n <ng-container *ngFor=\"let day of timeSlots\">\n <td *ngFor=\"let slot of day.slots\">\n <span class=\"d-block p-0 text-center\" [style.width.px]=\"timelineOptions.unitWidth\">\n {{ slot.start | date: 'HH:mm' }}\n </span>\n </td>\n </ng-container>\n </ng-container>\n </tr>\n <bs-resource-group-presenter *ngFor=\"let group of (resources$ | async)\" [resourceGroup]=\"group\" [timeSlots]=\"timeSlots\"></bs-resource-group-presenter>\n </ng-container>\n </table>\n </div>\n</div>", styles: [":host{display:block;border:1px solid #333;border-top-right-radius:10px;border-top-left-radius:10px;overflow:hidden}.calendar-head{background:#F7F7F7;color:#007aff}.tabel .calendar-head{flex:0 0 auto}.tabel .calendar-body{display:block;flex:1 1 auto}.week-schedule .calendar-head>div{padding-right:18px}.week-schedule .calendar-body{overflow-y:scroll;overflow-x:hidden}.week-schedule .calendar-body .calendar-cell{border-right:1px solid #DEE2E6;border-bottom:1px solid #DEE2E6;cursor:default}.week-schedule .calendar-body .calendar-cell.hover{border-top-width:3px}.week-schedule .calendar-left{width:90px}.week-schedule .event{z-index:5;width:calc((100% - 90px) / 7);height:100px;overflow:hidden;position:absolute;-webkit-user-select:none;user-select:none;pointer-events:none}.week-schedule .event.preview{background:#666;opacity:.6}.week-schedule .event .event-border{background:black;top:0;left:0;bottom:3px;width:3px;position:absolute;z-index:10;opacity:.3}.week-schedule .event .event-inner{position:relative;inset:0 5px 5px 0;cursor:move;pointer-events:all;overflow:hidden}.week-schedule .event .event-inner .event-wrapper{width:calc(100% - 2px);margin:1px auto 1px 0;height:calc(100% - 3px)}.week-schedule .event .event-inner .event-wrapper .event-bg{opacity:.5;height:100%;transition:opacity .15s ease-in-out}.week-schedule .event .event-inner .event-wrapper .event-label{position:absolute;top:0;font-size:12px;font-weight:600;padding:4px}.week-schedule .event .event-inner .event-resize{position:absolute;cursor:ns-resize;height:4px;left:0;right:0;z-index:400}.week-schedule .event .event-inner .event-resize.top{top:0}.week-schedule .event .event-inner .event-resize.bottom{bottom:0}.week-schedule .event .event-inner .event-resize:hover{background:#DDD}.week-schedule .event .event-inner.hover .event-bg{opacity:.7!important}@media (max-width: 767px){.week-schedule.tabel .calendar-head .calendar-head-cell{text-orientation:sideways;writing-mode:vertical-rl}}.timeline.tabel{flex-flow:column}.timeline .calendar-body .tabel{background-color:#f7f7f7}.timeline .calendar-body .tabel tr:first-child td{background-color:#fff;border:1px solid #000}.timeline .calendar-body .tabel tr:first-child td:first-child{min-width:10rem}.timeline .calendar-body .tabel tr:first-child span.day-label{left:0;right:0}.timeline .calendar-body .tabel tr:nth-child(2) td{border-width:1px;border-color:inherit}.timeline .calendar-body .tabel>:not(:first-child){border-top:none!important}\n"] }]
512
- }], ctorParameters: function () { return [{ type: i1.BsCalendarMonthService }, { type: i2.BsTimelineService }]; }, propDecorators: { timeSlotElements: [{
513
- type: ViewChildren,
514
- args: ['slot']
515
- }], modeChange: [{
516
- type: Output
517
- }], mode: [{
518
- type: Input
519
- }], weekOptionsChange: [{
520
- type: Output
521
- }], weekOptions: [{
522
- type: Input
523
- }], timelineOptionsChange: [{
524
- type: Output
525
- }], timelineOptions: [{
526
- type: Input
527
- }], maxInnerHeight: [{
528
- type: Input
529
- }], resources: [{
530
- type: Input
531
- }], onMousemove: [{
532
- type: HostListener,
533
- args: ['document:mousemove', ['$event']]
534
- }], onMouseUp: [{
535
- type: HostListener,
536
- args: ['document:mouseup', ['$event']]
537
- }] } });
538
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvc2NoZWR1bGVyL3NyYy9jb21wb25lbnRzL3NjaGVkdWxlci9zY2hlZHVsZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9taW50cGxheWVyLW5nLWJvb3RzdHJhcC9zY2hlZHVsZXIvc3JjL2NvbXBvbmVudHMvc2NoZWR1bGVyL3NjaGVkdWxlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JJLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU81RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7Ozs7Ozs7OztBQVk3RSxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CLFlBQW9CLG9CQUE0QyxFQUFVLGVBQWtDO1FBQXhGLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBd0I7UUFBVSxvQkFBZSxHQUFmLGVBQWUsQ0FBbUI7UUE2SjVHLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBK0IsRUFBRSxDQUFDLENBQUM7UUFLbkUsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBYyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFrQixFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRTNFLGtCQUFhLEdBQUcsSUFBSSxlQUFlLENBQXNCLElBQUksQ0FBQyxDQUFDO1FBTy9ELHNCQUFpQixHQUFHLElBQUksZUFBZSxDQUFTLElBQUksQ0FBQyxDQUFDO1FBQ3RELGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBNEIsRUFBRSxDQUFDLENBQUM7UUFDaEUsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNsRCxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBa0IsSUFBSSxDQUFDLENBQUM7UUFDOUQsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBd0IsSUFBSSxDQUFDLENBQUM7UUFDakUsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUF1QjNCLGNBQWM7UUFDZCxVQUFLLEdBQUcsY0FBYyxDQUFDO1FBQ3ZCLFVBQUssR0FBRyxJQUFJLGVBQWUsQ0FBaUIsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQU9qRSxZQUFZO1FBQ1osa0JBQWtCO1FBQ2xCLG9FQUFvRTtRQUNwRSxxRUFBcUU7UUFDckUsdUJBQXVCO1FBQ3ZCLDhCQUE4QjtRQUM5QixJQUFJO1FBQ0oscURBQXFEO1FBQ3JELDZCQUE2QjtRQUM3QixJQUFJO1FBQ0osZUFBZTtRQUNmLHFCQUFxQjtRQUNKLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFlLENBQUM7UUFPckUsWUFBWTtRQUNaLHlCQUF5QjtRQUNSLDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBTzdFLFlBQVk7UUFDWix3QkFBd0I7UUFDUixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFnRHJELGNBQVMsR0FBeUIsSUFBSSxDQUFDO1FBQ3ZDLHNCQUFpQixHQUFvQixJQUFJLENBQUM7UUFoU3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBTyxNQUFNLENBQUMsQ0FBQztRQUU3RCxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDcEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDL0IsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixRQUFRLElBQUksRUFBRTtnQkFDWixLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDeEIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUU7Z0JBQ0QsS0FBSyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzVCLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzlFLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUMvRixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwRjthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMsVUFBVTthQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkksSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVTthQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDNUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDckcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzthQUN4RCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpHLDBFQUEwRTtRQUM1RSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNsQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDNUUsQ0FBQztRQUVGLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxhQUFhLENBQUM7WUFDMUMsSUFBSSxDQUFDLHlCQUF5QjtZQUM5QixJQUFJLENBQUMsV0FBVztpQkFDYixJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUN6RCxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNoRyxDQUFDO2FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUNuQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3RyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQy9DLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1osSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUNoRDtpQkFBTTtnQkFDTCxPQUFPLElBQUksQ0FBQzthQUNiO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDMUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsRUFBRTtZQUM3QyxJQUFJLGlCQUFpQixFQUFFO2dCQUNyQixPQUFPLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ2hELE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM3RyxDQUFDLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLE9BQU8sRUFBRSxDQUFDO2FBQ1g7UUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSSxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQyxzQkFBc0I7YUFDL0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNyQiwwQ0FBMEM7WUFDMUMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7aUJBQzFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDN0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFpQixDQUFDLENBQUMsQ0FBQztZQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUUxRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDOUYsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUM7aUJBQ3ZELEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNyRyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRTNELE9BQU87Z0JBQ0wsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNO2dCQUN0QixLQUFLLEVBQUUsTUFBTTthQUNkLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRU4sYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQ2pFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQzthQUM1RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsUUFBUSxJQUFJLEVBQUU7Z0JBQ1osS0FBSyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3hCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO29CQUM5RCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7d0JBQzdELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dCQUU3RSxPQUFnQzs0QkFDOUIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQ0FDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0NBQzVCLEtBQUssQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0NBQ25ELEtBQUssQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0NBQ3ZELEtBQUssQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0NBQ3ZELEtBQUssQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7Z0NBRWpFLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dDQUMxQixHQUFHLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dDQUMvQyxHQUFHLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dDQUNuRCxHQUFHLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dDQUNuRCxHQUFHLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO2dDQUM3RCxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0NBRWpHLE9BQWlCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDOzRCQUNsQyxDQUFDLENBQUM7NEJBQ0YsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEtBQUs7eUJBQy9CLENBQUM7b0JBQ0osQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsS0FBSyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzVCLE1BQU0sY0FBYyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUM7b0JBQ2pELE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUMzQixPQUFnQzs0QkFDOUIsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lDQUM1QyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQ0FDYixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQzs0QkFDbkQsQ0FBQyxDQUFDOzRCQUNKLEtBQUssRUFBRSxHQUFHO3lCQUNYLENBQUE7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsT0FBTyxDQUFDLENBQUM7b0JBQ1AsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUM7aUJBQ3pDO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQzthQUNGLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3ZCLCtHQUErRztZQUMvRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZO2FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2hDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsZ0JBQWdCO2FBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2hDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFTCwyQ0FBMkM7UUFDM0MsdUVBQXVFO0lBRXpFLENBQUM7SUEwQkQsY0FBYyxDQUFDLElBQVUsRUFBRSxLQUFhLEVBQUUsUUFBZ0I7UUFDeEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxLQUFLLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzFFLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRTlELE9BQWlCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUVELG9CQUFvQixDQUFDLGVBQXlDO1FBQzVELElBQUksVUFBVSxJQUFJLGVBQWUsRUFBRTtZQUNqQyxPQUFPLGVBQWUsQ0FBQyxRQUFRO2lCQUM1QixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDaEQsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM1RDthQUFNO1lBQ0wsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQU1ELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQW9CLElBQUksQ0FBQyxLQUFxQjtRQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBY0QsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUNELElBQW9CLFdBQVcsQ0FBQyxLQUFrQjtRQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBSUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQztJQUNyQyxDQUFDO0lBQ0QsSUFBb0IsZUFBZSxDQUFDLEtBQXNCO1FBQ3hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUlELFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQW9CLFNBQVMsQ0FBQyxLQUFtQztRQUMvRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0QsWUFBWTtJQUVKLE9BQU8sQ0FBQyxJQUFVLEVBQUUsSUFBWTtRQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN4QyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxJQUFhO1FBQ3ZDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUN2QyxRQUFRLElBQUksRUFBRTtnQkFDWixLQUFLLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDMUQ7Z0JBQ0QsS0FBSyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzVCLE9BQU8sSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDdkc7YUFDRjtRQUNILENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNYLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxZQUFZLENBQUMsRUFBeUI7UUFDcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELFlBQVksQ0FBQyxFQUF5QjtRQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBSUQsYUFBYSxDQUFDLEVBQWMsRUFBRSxJQUFjO1FBQzFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDZixTQUFTLEVBQUUsY0FBYyxDQUFDLFdBQVc7WUFDckMsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLEtBQUssRUFBRSxNQUFNO2dCQUNiLFdBQVcsRUFBRSxZQUFZO2FBQzFCO1lBQ0QsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELFdBQVc7UUFDVCxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUM7UUFDdkIsT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUNELGFBQWEsQ0FBQyxVQUFrQjtRQUM5QixNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUMsVUFBVSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsU0FBNkIsRUFBRSxFQUFjO1FBQzVELEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFO1lBQ2hFLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRTtnQkFDbkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGVBQWUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRztvQkFDZixTQUFTLEVBQUUsY0FBYyxDQUFDLFNBQVM7b0JBQ25DLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSztvQkFDdEIsSUFBSSxFQUFFLElBQUk7aUJBQ1gsQ0FBQztnQkFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2FBQ3JGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBNEIsRUFBRSxRQUEwQjtRQUN6RSxJQUFJLEtBQUssRUFBRTtZQUNULFFBQVEsUUFBUSxFQUFFO2dCQUNoQixLQUFLLEtBQUs7b0JBQUU7d0JBQ1YsSUFBSSxDQUFDLFNBQVMsR0FBRzs0QkFDZixTQUFTLEVBQUUsY0FBYyxDQUFDLFdBQVc7NEJBQ3JDLEtBQUssRUFBRSxLQUFLOzRCQUNaLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRTt5QkFDbkIsQ0FBQTt3QkFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztxQkFDakU7b0JBQUMsTUFBTTtnQkFDUixLQUFLLFFBQVE7b0JBQUU7d0JBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRzs0QkFDZixTQUFTLEVBQUUsY0FBYyxDQUFDLFdBQVc7NEJBQ3JDLEtBQUssRUFBRSxLQUFLOzRCQUNaLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRTt5QkFDbkIsQ0FBQTt3QkFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztxQkFDakU7b0JBQUMsTUFBTTthQUNUO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsMEJBQTBCO0lBQ2xCLGtCQUFrQixDQUFDLEVBQWMsRUFBRSxTQUFvQztRQUM3RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDdkQsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3JELElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO2dCQUNsRixPQUFPLElBQUksQ0FBQzthQUNiO2lCQUFNO2dCQUNMLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDOUMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFFbEQsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QixNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRW5DLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBR0QsV0FBVyxDQUFDLEVBQWM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXBDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRTtvQkFDaEMsS0FBSyxjQUFjLENBQUMsV0FBVzt3QkFBRTs0QkFDL0IsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtnQ0FDOUgsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7b0NBQ3RFLFNBQVM7aUNBQ1Y7cUNBQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7b0NBQzNFLFlBQVk7b0NBQ1osSUFBSSxDQUFDLGFBQWE7eUNBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7eUNBQ3RELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTt3Q0FDZixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7NENBQ2hDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQzs0Q0FDeEMsRUFBRSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO3lDQUN0Qjt3Q0FDRCxPQUFPLEVBQUUsQ0FBQztvQ0FDWixDQUFDLENBQUMsQ0FBQzt5Q0FDRixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3lDQUNiLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQ0FDbkQ7cUNBQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7b0NBQzNFLFVBQVU7b0NBQ1YsSUFBSSxDQUFDLGFBQWE7eUNBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7eUNBQ3RELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTt3Q0FDZixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7NENBQ2hDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQzs0Q0FDekIsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDO3lDQUNyQzt3Q0FDRCxPQUFPLEVBQUUsQ0FBQztvQ0FDWixDQUFDLENBQUMsQ0FBQzt5Q0FDRixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3lDQUNiLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQ0FDbkQ7NkJBQ0Y7eUJBQ0Y7d0JBQUMsTUFBTTtvQkFDUixLQUFLLGNBQWMsQ0FBQyxTQUFTO3dCQUFFOzRCQUM3QixJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0NBQ3JDLElBQUksQ0FBQyxhQUFhO3FDQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3FDQUN0RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7b0NBQ2YsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO3dDQUNoQyxNQUFNLE1BQU0sR0FBa0I7NENBQzVCLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQzs0Q0FDdEcsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO3lDQUNuRyxDQUFDO3dDQUVGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUM7d0NBRWpDLE9BQU8sTUFBTSxDQUFDO3FDQUNmO3lDQUFNO3dDQUNMLE9BQU8sRUFBRSxDQUFDO3FDQUNYO2dDQUNILENBQUMsQ0FBQyxDQUFDO3FDQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7cUNBQ2IsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs2QkFDakQ7eUJBQ0Y7d0JBQUMsTUFBTTtvQkFDUixLQUFLLGNBQWMsQ0FBQyxXQUFXO3dCQUFFOzRCQUMvQixJQUFJLE9BQU8sRUFBRTtnQ0FDWCxJQUFJLENBQUMsYUFBYTtxQ0FDZixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7cUNBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtvQ0FDZixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO3dDQUNoRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7NENBQzFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQzs0Q0FDekIsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7eUNBQ25DOzZDQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTs0Q0FDcEQsRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7NENBQ3RDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQzt5Q0FDdEI7cUNBQ0Y7b0NBQ0QsT0FBTyxFQUFFLENBQUM7Z0NBQ1osQ0FBQyxDQUFDLENBQUM7cUNBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztxQ0FDYixTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NkJBQ25EO3lCQUNGO3dCQUFDLE1BQU07aUJBQ1Q7YUFDRjtRQUVILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELFlBQVk7SUFHWixTQUFTLENBQUMsRUFBYztRQUN0QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRTtnQkFDaEMsS0FBSyxjQUFjLENBQUMsV0FBVztvQkFBRTt3QkFDL0IsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDOzZCQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOzZCQUNiLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRTs0QkFDNUIsSUFBSSxZQUFZLEVBQUU7Z0NBQ2hCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dDQUN0QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2dDQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztvQ0FDbkIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUs7b0NBQ2Q7d0NBQ1IsV0FBVyxFQUFFLG9CQUFvQjt3Q0FDakMsTUFBTSxFQUFFLENBQUM7Z0RBQ1AsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLO2dEQUN6QixHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUc7Z0RBQ3JCLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFO2dEQUN6QixXQUFXLEVBQUUsV0FBVzs2Q0FDekIsQ0FBQztxQ0FDSDtpQ0FDRixDQUFDLENBQUM7Z0NBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7NkJBQy9CO3dCQUNILENBQUMsQ0FBQyxDQUFDO3FCQUNOO29CQUFDLE1BQU07Z0JBQ1IsS0FBSyxjQUFjLENBQUMsU0FBUyxDQUFDO2dCQUM5QixLQUFLLGNBQWMsQ0FBQyxXQUFXO29CQUFFO3dCQUMvQixJQUFJLENBQUMsYUFBYTs2QkFDZixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7NkJBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7NkJBQ2IsU0FBUyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7NEJBQzFCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxZQUFZLEVBQUU7Z0NBQzFELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO2dDQUNoRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQztnQ0FDNUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0NBQ3RCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7Z0NBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0NBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUMvQjt3QkFDSCxDQUFDLENBQUMsQ0FBQztxQkFDTjtvQkFBQyxNQUFNO2FBQ1Q7U0FDRjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQzs7aUhBamhCVSxvQkFBb0I7cUdBQXBCLG9CQUFvQixtaEJDdkJqQyw2ME9BNEdNOzJGRHJGTyxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0UsY0FBYzs2SUF3TEYsZ0JBQWdCO3NCQUFyQyxZQUFZO3VCQUFDLE1BQU07Z0JBd0JILFVBQVU7c0JBQTFCLE1BQU07Z0JBSWEsSUFBSTtzQkFBdkIsS0FBSztnQkFlVyxpQkFBaUI7c0JBQWpDLE1BQU07Z0JBSWEsV0FBVztzQkFBOUIsS0FBSztnQkFLVyxxQkFBcUI7c0JBQXJDLE1BQU07Z0JBSWEsZUFBZTtzQkFBbEMsS0FBSztnQkFLVSxjQUFjO3NCQUE3QixLQUFLO2dCQU1jLFNBQVM7c0JBQTVCLEtBQUs7Z0JBZ0pOLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkEyRjlDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIFN1YmplY3QsIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQnNDYWxlbmRhck1vbnRoU2VydmljZSB9IGZyb20gJ0BtaW50cGxheWVyL25nLWJvb3RzdHJhcC9jYWxlbmRhci1tb250aCc7XG5pbXBvcnQgeyBFU2NoZWR1bGVyTW9kZSB9IGZyb20gJy4uLy4uL2VudW1zL3NjaGVkdWxlci1tb2RlJztcbmltcG9ydCB7IEVEcmFnT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vZW51bXMvZHJhZy1vcGVyYXRpb24nO1xuaW1wb3J0IHsgRHJhZ09wZXJhdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZHJhZy1vcGVyYXRpb24nO1xuaW1wb3J0IHsgUHJldmlld0V2ZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wcmV2aWV3LWV2ZW50JztcbmltcG9ydCB7IFNjaGVkdWxlckV2ZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zY2hlZHVsZXItZXZlbnQnO1xuaW1wb3J0IHsgU2NoZWR1bGVyRXZlbnRQYXJ0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zY2hlZHVsZXItZXZlbnQtcGFydCc7XG5pbXBvcnQgeyBTY2hlZHVsZXJFdmVudFdpdGhQYXJ0cyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2NoZWR1bGVyLWV2ZW50LXdpdGgtcGFydHMnO1xuaW1wb3J0IHsgVGltZVNsb3QgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3RpbWUtc2xvdCc7XG5pbXBvcnQgeyBCc1RpbWVsaW5lU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RpbWVsaW5lL3RpbWVsaW5lLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVzb3VyY2VHcm91cCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVzb3VyY2UtZ3JvdXAnO1xuaW1wb3J0IHsgUmVzb3VyY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Jlc291cmNlJztcbmltcG9ydCB7IFNjaGVkdWxlclN0YW1wV2l0aFNsb3RzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zY2hlZHVsZXItc3RhbXAtd2l0aC1zbG90cyc7XG5pbXBvcnQgeyBXZWVrT3B0aW9ucyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvd2Vlay1vcHRpb25zJztcbmltcG9ydCB7IFRpbWVsaW5lT3B0aW9ucyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdGltZWxpbmUtb3B0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLXNjaGVkdWxlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zY2hlZHVsZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY2hlZHVsZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQnNTY2hlZHVsZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNhbGVuZGFyTW9udGhTZXJ2aWNlOiBCc0NhbGVuZGFyTW9udGhTZXJ2aWNlLCBwcml2YXRlIHRpbWVsaW5lU2VydmljZTogQnNUaW1lbGluZVNlcnZpY2UpIHtcbiAgICBjb25zdCBtb25kYXkgPSB0aGlzLmNhbGVuZGFyTW9udGhTZXJ2aWNlLmdldE1vbmRheUJlZm9yZShuZXcgRGF0ZSgpKTtcbiAgICB0aGlzLmN1cnJlbnRXZWVrT3JNb250aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGU+KG1vbmRheSk7XG5cbiAgICB0aGlzLnNob3duRGF5cyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmN1cnJlbnRXZWVrT3JNb250aCQsIHRoaXMubW9kZSRdKVxuICAgICAgLnBpcGUobWFwKChbY3VycmVudERheSwgbW9kZV0pID0+IHtcbiAgICAgICAgY3VycmVudERheS5zZXRIb3VycygwKTtcbiAgICAgICAgY3VycmVudERheS5zZXRNaW51dGVzKDApO1xuICAgICAgICBjdXJyZW50RGF5LnNldFNlY29uZHMoMCk7XG4gICAgICAgIGN1cnJlbnREYXkuc2V0TWlsbGlzZWNvbmRzKDApO1xuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICBjYXNlIEVTY2hlZHVsZXJNb2RlLndlZWs6IHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKEFycmF5KDcpLmtleXMoKSkubWFwKCh4KSA9PiB0aGlzLmFkZERheXMoY3VycmVudERheSwgeCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIEVTY2hlZHVsZXJNb2RlLnRpbWVsaW5lOiB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKGN1cnJlbnREYXkuZ2V0RnVsbFllYXIoKSwgY3VycmVudERheS5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgICAgIGNvbnN0IGRheXNPZk1vbnRoID0gbmV3IERhdGUoY3VycmVudERheS5nZXRGdWxsWWVhcigpLCBjdXJyZW50RGF5LmdldE1vbnRoKCkgKyAxLCAwKS5nZXREYXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShBcnJheShkYXlzT2ZNb250aCkua2V5cygpKS5tYXAoKHgpID0+IHRoaXMuYWRkRGF5cyhmaXJzdERheSwgeCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5kYXlzT2ZXZWVrV2l0aFRpbWVzdGFtcHMkID0gdGhpcy5zaG93bkRheXMkXG4gICAgICAucGlwZShtYXAoKHNob3duRGF5cykgPT4gKHsgc3RhcnQ6IHNob3duRGF5c1swXS5nZXRUaW1lKCksIGVuZDogc2hvd25EYXlzW3Nob3duRGF5cy5sZW5ndGggLSAxXS5nZXRUaW1lKCkgKyAyNCAqIDYwICogNjAgKiAxMDAwIH0pKSk7XG4gICAgXG4gICAgdGhpcy5ldmVudHMkID0gdGhpcy5yZXNvdXJjZXMkXG4gICAgICAucGlwZShtYXAoKHJlc291cmNlc09yR3JvdXBzKSA9PiByZXNvdXJjZXNPckdyb3Vwcy5tYXAocmVzT3JHcm91cCA9PiB0aGlzLmdldFJlc291cmNlc0Zvckdyb3VwKHJlc09yR3JvdXApKSkpXG4gICAgICAucGlwZShtYXAoamFnZ2VkUmVzb3VyY2VzID0+IGphZ2dlZFJlc291cmNlcy5yZWR1Y2UoKGZsYXQsIHRvRmxhdHRlbikgPT4gZmxhdC5jb25jYXQodG9GbGF0dGVuKSwgW10pKSlcbiAgICAgIC5waXBlKG1hcChyZXNvdXJjZXMgPT4gcmVzb3VyY2VzLm1hcChyZXMgPT4gcmVzLmV2ZW50cykpKVxuICAgICAgLnBpcGUobWFwKGphZ2dlZEV2ZW50cyA9PiBqYWdnZWRFdmVudHMucmVkdWNlKChmbGF0LCB0b0ZsYXR0ZW4pID0+IGZsYXQuY29uY2F0KHRvRmxhdHRlbiksIFtdKSkpO1xuXG4gICAgICAvLyBncm91cHMucmVkdWNlKChmbGF0LCB0b0ZsYXR0ZW4pID0+IGZsYXQuY29uY2F0KHRvRmxhdHRlbi5jaGlsZHJlbiksIFtdKVxuICAgIHRoaXMuZXZlbnRQYXJ0cyQgPSB0aGlzLmV2ZW50cyQucGlwZShcbiAgICAgIG1hcCgoZXZlbnRzKSA9PiAgZXZlbnRzLm1hcCgoZXYpID0+IHRoaXMudGltZWxpbmVTZXJ2aWNlLnNwbGl0SW5QYXJ0cyhldikpKVxuICAgICk7XG5cbiAgICB0aGlzLmV2ZW50UGFydHNGb3JUaGlzV2VlayQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuZGF5c09mV2Vla1dpdGhUaW1lc3RhbXBzJCxcbiAgICAgIHRoaXMuZXZlbnRQYXJ0cyRcbiAgICAgICAgLnBpcGUobWFwKGV2ZW50UGFydHMgPT4gZXZlbnRQYXJ0cy5tYXAoZXZwID0+IGV2cC5wYXJ0cykpKVxuICAgICAgICAucGlwZShtYXAoamFnZ2VkUGFydHMgPT4gIGphZ2dlZFBhcnRzLnJlZHVjZSgoZmxhdCwgdG9GbGF0dGVuKSA9PiBmbGF0LmNvbmNhdCh0b0ZsYXR0ZW4pLCBbXSkpKVxuICAgICAgXSlcbiAgICAgIC5waXBlKG1hcCgoW3N0YXJ0QW5kRW5kLCBldmVudFBhcnRzXSkgPT4ge1xuICAgICAgICByZXR1cm4gZXZlbnRQYXJ0cy5maWx0ZXIoZXZlbnRQYXJ0ID0+IHtcbiAgICAgICAgICByZXR1cm4gISgoZXZlbnRQYXJ0LmVuZC5nZXRUaW1lKCkgPD0gc3RhcnRBbmRFbmQuc3RhcnQpIHx8IChldmVudFBhcnQuc3RhcnQuZ2V0VGltZSgpID49IHN0YXJ0QW5kRW5kLmVuZCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pKTtcblxuICAgIHRoaXMucHJldmlld0V2ZW50UGFydHMkID0gdGhpcy5wcmV2aWV3RXZlbnQkLnBpcGUoXG4gICAgICBtYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRpbWVsaW5lU2VydmljZS5zcGxpdEluUGFydHMoZXZlbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnByZXZpZXdFdmVudFBhcnRzRm9yVGhpc1dlZWskID0gY29tYmluZUxhdGVzdChbdGhpcy5kYXlzT2ZXZWVrV2l0aFRpbWVzdGFtcHMkLCB0aGlzLnByZXZpZXdFdmVudFBhcnRzJF0pXG4gICAgICAucGlwZShtYXAoKFtzdGFydEFuZEVuZCwgcHJldmlld0V2ZW50UGFydHNdKSA9PiB7XG4gICAgICAgIGlmIChwcmV2aWV3RXZlbnRQYXJ0cykge1xuICAgICAgICAgIHJldHVybiBwcmV2aWV3RXZlbnRQYXJ0cy5wYXJ0cy5maWx0ZXIoZXZlbnRQYXJ0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhKChldmVudFBhcnQuZW5kLmdldFRpbWUoKSA8PSBzdGFydEFuZEVuZC5zdGFydCkgfHwgKGV2ZW50UGFydC5zdGFydC5nZXRUaW1lKCkgPj0gc3RhcnRBbmRFbmQuZW5kKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICB0aGlzLnRpbWVsaW5lZEV2ZW50UGFydHNGb3JUaGlzV2VlayQgPSB0aGlzLmV2ZW50UGFydHNGb3JUaGlzV2VlayRcbiAgICAgIC5waXBlKG1hcChldmVudFBhcnRzID0+IHtcbiAgICAgICAgLy8gV2UnbGwgb25seSB1c2UgdGhlIGV2ZW50cyBmb3IgdGhpcyB3ZWVrXG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50UGFydHMubWFwKGVwID0+IGVwLmV2ZW50KVxuICAgICAgICAgIC5maWx0ZXIoKGUsIGksIGxpc3QpID0+IGxpc3QuaW5kZXhPZihlKSA9PT0gaSlcbiAgICAgICAgICAuZmlsdGVyKChlKSA9PiAhIWUpXG4gICAgICAgICAgLm1hcCgoZSkgPT4gPFNjaGVkdWxlckV2ZW50PmUpO1xuICAgICAgICBjb25zdCB0aW1lbGluZSA9IHRoaXMudGltZWxpbmVTZXJ2aWNlLmdldFRpbWVsaW5lKGV2ZW50cyk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGltZWxpbmUubWFwKHRyYWNrID0+IHRyYWNrLmV2ZW50cy5tYXAoZXYgPT4gKHsgZXZlbnQ6IGV2LCBpbmRleDogdHJhY2suaW5kZXggfSkpKVxuICAgICAgICAgIC5yZWR1Y2UoKGZsYXQsIHRvRmxhdHRlbikgPT4gZmxhdC5jb25jYXQodG9GbGF0dGVuKSwgW10pXG4gICAgICAgICAgLm1hcCgoZXZpKSA9PiBldmVudFBhcnRzLmZpbHRlcihwID0+IHAuZXZlbnQgPT09IGV2aS5ldmVudCkubWFwKHAgPT4gKHsgcGFydDogcCwgaW5kZXg6IGV2aS5pbmRleCB9KSkpXG4gICAgICAgICAgLnJlZHVjZSgoZmxhdCwgdG9GbGF0dGVuKSA9PiBmbGF0LmNvbmNhdCh0b0ZsYXR0ZW4pLCBbXSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b3RhbDogdGltZWxpbmUubGVuZ3RoLFxuICAgICAgICAgIHBhcnRzOiByZXN1bHRcbiAgICAgICAgfTtcbiAgICAgIH0pKTtcblxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMubW9kZSQsIHRoaXMuc2hvd25EYXlzJCwgdGhpcy50aW1lU2xvdER1cmF0aW9uJF0pXG4gICAgICAucGlwZShmaWx0ZXIoKFttb2RlLCBzaG93bkRheXMsIGR1cmF0aW9uXSkgPT4gbW9kZSAhPT0gbnVsbCkpXG4gICAgICAucGlwZShtYXAoKFttb2RlLCBzaG93bkRheXMsIGR1cmF0aW9uXSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICBjYXNlIEVTY2hlZHVsZXJNb2RlLndlZWs6IHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVTbG90c1BlckRheSA9IE1hdGguZmxvb3IoKDYwICogNjAgKiAyNCkgLyBkdXJhdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShBcnJheSh0aW1lU2xvdHNQZXJEYXkpLmtleXMoKSkubWFwKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0aW1lc2xvdEZvck1vbmRheSA9IHRoaXMuY3JlYXRlVGltZXNsb3Qoc2hvd25EYXlzWzBdLCBpbmRleCwgZHVyYXRpb24pO1xuXG4gICAgICAgICAgICAgIHJldHVybiA8U2NoZWR1bGVyU3RhbXBXaXRoU2xvdHM+e1xuICAgICAgICAgICAgICAgIHNsb3RzOiBzaG93bkRheXMubWFwKChkYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoZGF5KTtcbiAgICAgICAgICAgICAgICAgIHN0YXJ0LnNldEhvdXJzKHRpbWVzbG90Rm9yTW9uZGF5LnN0YXJ0LmdldEhvdXJzKCkpO1xuICAgICAgICAgICAgICAgICAgc3RhcnQuc2V0TWludXRlcyh0aW1lc2xvdEZvck1vbmRheS5zdGFydC5nZXRNaW51dGVzKCkpO1xuICAgICAgICAgICAgICAgICAgc3RhcnQuc2V0U2Vjb25kcyh0aW1lc2xvdEZvck1vbmRheS5zdGFydC5nZXRTZWNvbmRzKCkpO1xuICAgICAgICAgICAgICAgICAgc3RhcnQuc2V0TWlsbGlzZWNvbmRzKHRpbWVzbG90Rm9yTW9uZGF5LnN0YXJ0LmdldE1pbGxpc2Vjb25kcygpKTtcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUoZGF5KTtcbiAgICAgICAgICAgICAgICAgIGVuZC5zZXRIb3Vycyh0aW1lc2xvdEZvck1vbmRheS5lbmQuZ2V0SG91cnMoKSk7XG4gICAgICAgICAgICAgICAgICBlbmQuc2V0TWludXRlcyh0aW1lc2xvdEZvck1vbmRheS5lbmQuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgICAgICAgIGVuZC5zZXRTZWNvbmRzKHRpbWVzbG90Rm9yTW9uZGF5LmVuZC5nZXRTZWNvbmRzKCkpO1xuICAgICAgICAgICAgICAgICAgZW5kLnNldE1pbGxpc2Vjb25kcyh0aW1lc2xvdEZvck1vbmRheS5lbmQuZ2V0TWlsbGlzZWNvbmRzKCkpO1xuICAgICAgICAgICAgICAgICAgZW5kLnNldERhdGUoZW5kLmdldERhdGUoKSArIHRpbWVzbG90Rm9yTW9uZGF5LmVuZC5nZXREYXRlKCkgLSB0aW1lc2xvdEZvck1vbmRheS5zdGFydC5nZXREYXRlKCkpO1xuICAgICAgXG4gICAgICAgICAgICAgICAgICByZXR1cm4gPFRpbWVTbG90Pnsgc3RhcnQsIGVuZCB9O1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHN0YW1wOiB0aW1lc2xvdEZvck1vbmRheS5zdGFydFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgRVNjaGVkdWxlck1vZGUudGltZWxpbmU6IHtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsVGltZXNsb3RzID0gKDI0ICogNjAgKiA2MCkgLyBkdXJhdGlvbjtcbiAgICAgICAgICAgIHJldHVybiBzaG93bkRheXMubWFwKChkYXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIDxTY2hlZHVsZXJTdGFtcFdpdGhTbG90cz57XG4gICAgICAgICAgICAgICAgc2xvdHM6IEFycmF5LmZyb20oQXJyYXkodG90YWxUaW1lc2xvdHMpLmtleXMoKSlcbiAgICAgICAgICAgICAgICAgIC5tYXAoKGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRpbWVzbG90KGRheSwgaW5kZXgsIGR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHN0YW1wOiBkYXlcbiAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICB0aHJvdyAnVW5rbm93biB2YWx1ZSBmb3IgTW9kZTogJyArIG1vZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSlcbiAgICAgIC5zdWJzY3JpYmUoKHRpbWVzbG90cykgPT4ge1xuICAgICAgICAvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgd2UncmUgbm90IHVzaW5nIGFuIG9ic2VydmFibGUgaGVyZSwgYnV0IHBlcnNpc3QgdGhlIHRpbWVzbG90cyBpbiBhIEJlaGF2aW9yU3ViamVjdC5cbiAgICAgICAgdGhpcy50aW1lU2xvdHMkLm5leHQodGltZXNsb3RzKTtcbiAgICAgIH0pO1xuICAgIFxuICAgICAgdGhpcy53ZWVrT3B0aW9ucyRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpKVxuICAgICAgLnN1YnNjcmliZSgod2Vla09wdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy53ZWVrT3B0aW9uc0NoYW5nZS5lbWl0KHdlZWtPcHRpb25zKTtcbiAgICAgIH0pO1xuICAgIHRoaXMudGltZWxpbmVPcHRpb25zJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKCh0aW1lbGluZU9wdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy50aW1lbGluZU9wdGlvbnNDaGFuZ2UuZW1pdCh0aW1lbGluZU9wdGlvbnMpO1xuICAgICAgfSk7XG5cbiAgICAvLyBjb21iaW5lTGF0ZXN0KFt0aGlzLm1vZGUkLCB0aGlzLnNjYWxlJF0pXG4gICAgLy8gICAucGlwZShmaWx0ZXIoKFttb2RlLCBzY2FsZV0pID0+IG1vZGUgPT09IEVTY2hlZHVsZXJNb2RlLnRpbWVsaW5lKSlcblxuICB9XG5cbiAgcmVzb3VyY2VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8KFJlc291cmNlIHwgUmVzb3VyY2VHcm91cClbXT4oW10pO1xuICBldmVudHMkOiBPYnNlcnZhYmxlPFNjaGVkdWxlckV2ZW50W10+O1xuICBldmVudFBhcnRzJDogT2JzZXJ2YWJsZTxTY2hlZHVsZXJFdmVudFdpdGhQYXJ0c1tdPjtcbiAgZXZlbnRQYXJ0c0ZvclRoaXNXZWVrJDogT2JzZXJ2YWJsZTxTY2hlZHVsZXJFdmVudFBhcnRbXT47XG4gIHRpbWVsaW5lZEV2ZW50UGFydHNGb3JUaGlzV2VlayQ6IE9ic2VydmFibGU8eyB0b3RhbDogbnVtYmVyLCBwYXJ0czogeyBwYXJ0OiBTY2hlZHVsZXJFdmVudFBhcnQsIGluZGV4OiBudW1iZXJ9W10gfT47XG4gIHdlZWtPcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8V2Vla09wdGlvbnM+KHsgdW5pdEhlaWdodDogMzAgfSk7XG4gIHRpbWVsaW5lT3B0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRpbWVsaW5lT3B0aW9ucz4oeyB1bml0V2lkdGg6IDUwIH0pO1xuICBcbiAgcHJldmlld0V2ZW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJldmlld0V2ZW50IHwgbnVsbD4obnVsbCk7XG4gIHByZXZpZXdFdmVudFBhcnRzJDogT2JzZXJ2YWJsZTxTY2hlZHVsZXJFdmVudFdpdGhQYXJ0cyB8IG51bGw+O1xuICBwcmV2aWV3RXZlbnRQYXJ0c0ZvclRoaXNXZWVrJDogT2JzZXJ2YWJsZTxTY2hlZHVsZXJFdmVudFBhcnRbXT47XG4gIFxuICBjdXJyZW50V2Vla09yTW9udGgkOiBCZWhhdmlvclN1YmplY3Q8RGF0ZT47XG4gIHNob3duRGF5cyQ6IE9ic2VydmFibGU8RGF0ZVtdPjtcbiAgZGF5c09mV2Vla1dpdGhUaW1lc3RhbXBzJDogT2JzZXJ2YWJsZTx7c3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXJ9PjtcbiAgdGltZVNsb3REdXJhdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMTgwMCk7XG4gIHRpbWVTbG90cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNjaGVkdWxlclN0YW1wV2l0aFNsb3RzW10+KFtdKTtcbiAgbW91c2VTdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgaG92ZXJlZFRpbWVTbG90JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGltZVNsb3QgfCBudWxsPihudWxsKTtcbiAgaG92ZXJlZEV2ZW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2NoZWR1bGVyRXZlbnQgfCBudWxsPihudWxsKTtcbiAgZGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgQFZpZXdDaGlsZHJlbignc2xvdCcpIHRpbWVTbG90RWxlbWVudHMhOiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+O1xuXG4gIGNyZWF0ZVRpbWVzbG90KGRhdGU6IERhdGUsIGluZGV4OiBudW1iZXIsIGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICBjb25zdCB0aW1lU2xvdFN0YXJ0ID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgdGltZVNsb3RTdGFydC5zZXRUaW1lKCt0aW1lU2xvdFN0YXJ0LmdldFRpbWUoKSArIGluZGV4ICogZHVyYXRpb24gKiAxMDAwKTtcbiAgICBjb25zdCB0aW1lU2xvdEVuZCA9IG5ldyBEYXRlKHRpbWVTbG90U3RhcnQpO1xuICAgIHRpbWVTbG90RW5kLnNldFRpbWUoK3RpbWVTbG90RW5kLmdldFRpbWUoKSArIGR1cmF0aW9uICogMTAwMCk7XG5cbiAgICByZXR1cm4gPFRpbWVTbG90Pnsgc3RhcnQ6IHRpbWVTbG90U3RhcnQsIGVuZDogdGltZVNsb3RFbmQgfTtcbiAgfVxuXG4gIGdldFJlc291cmNlc0Zvckdyb3VwKHJlc291cmNlT3JHcm91cDogUmVzb3VyY2UgfCBSZXNvdXJjZUdyb3VwKSA6IFJlc291cmNlW10ge1xuICAgIGlmICgnY2hpbGRyZW4nIGluIHJlc291cmNlT3JHcm91cCkge1xuICAgICAgcmV0dXJuIHJlc291cmNlT3JHcm91cC5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZCkgPT4gdGhpcy5nZXRSZXNvdXJjZXNGb3JHcm91cChjaGlsZCkpXG4gICAgICAgIC5yZWR1Y2UoKGZsYXQsIHRvRmxhdHRlbikgPT4gZmxhdC5jb25jYXQodG9GbGF0dGVuKSwgW10pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3Jlc291cmNlT3JHcm91cF07XG4gICAgfVxuICB9XG5cbiAgLy8jcmVnaW9uIE1vZGVcbiAgbW9kZXMgPSBFU2NoZWR1bGVyTW9kZTtcbiAgbW9kZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVTY2hlZHVsZXJNb2RlPihFU2NoZWR1bGVyTW9kZS53ZWVrKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBtb2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxFU2NoZWR1bGVyTW9kZT4oKTtcbiAgcHVibGljIGdldCBtb2RlKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGUkLnZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgbW9kZSh2YWx1ZTogRVNjaGVkdWxlck1vZGUpIHtcbiAgICB0aGlzLm1vZGUkLm5leHQodmFsdWUpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuICAvLyAvLyNyZWdpb24gU2NhbGVcbiAgLy8gc2NhbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTY2hlZHVsZXJTY2FsZT4oYXZhaWxhYmxlU2NhbGVzWzRdKTtcbiAgLy8gQE91dHB1dCgpIHB1YmxpYyBzY2FsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2NoZWR1bGVyU2NhbGU+KCk7XG4gIC8vIHB1YmxpYyBnZXQgc2NhbGUoKSB7XG4gIC8vICAgcmV0dXJuIHRoaXMuc2NhbGUkLnZhbHVlO1xuICAvLyB9XG4gIC8vIEBJbnB1dCgpIHB1YmxpYyBzZXQgc2NhbGUodmFsdWU6IFNjaGVkdWxlclNjYWxlKSB7XG4gIC8vICAgdGhpcy5zY2FsZSQubmV4dCh2YWx1ZSk7XG4gIC8vIH1cbiAgLy8gLy8jZW5kcmVnaW9uXG4gIC8vI3JlZ2lvbiBXZWVrT3B0aW9uc1xuICBAT3V0cHV0KCkgcHVibGljIHdlZWtPcHRpb25zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxXZWVrT3B0aW9ucz4oKTtcbiAgcHVibGljIGdldCB3ZWVrT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy53ZWVrT3B0aW9ucyQudmFsdWU7XG4gIH1cbiAgQElucHV0KCkgcHVibGljIHNldCB3ZWVrT3B0aW9ucyh2YWx1ZTogV2Vla09wdGlvbnMpIHtcbiAgICB0aGlzLndlZWtPcHRpb25zJC5uZXh0KHZhbHVlKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cbiAgLy8jcmVnaW9uIFRpbWVsaW5lT3B0aW9uc1xuICBAT3V0cHV0KCkgcHVibGljIHRpbWVsaW5lT3B0aW9uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGltZWxpbmVPcHRpb25zPigpO1xuICBwdWJsaWMgZ2V0IHRpbWVsaW5lT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50aW1lbGluZU9wdGlvbnMkLnZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgdGltZWxpbmVPcHRpb25zKHZhbHVlOiBUaW1lbGluZU9wdGlvbnMpIHtcbiAgICB0aGlzLnRpbWVsaW5lT3B0aW9ucyQubmV4dCh2YWx1ZSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG4gIC8vI3JlZ2lvbiBtYXhJbm5lckhlaWdodFxuICBASW5wdXQoKSBwdWJsaWMgbWF4SW5uZXJIZWlnaHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvLyNlbmRyZWdpb25cbiAgLy8jcmVnaW9uIFJlc291cmNlc1xuICBwdWJsaWMgZ2V0IHJlc291cmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXMkLnZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgcmVzb3VyY2VzKHZhbHVlOiAoUmVzb3VyY2UgfCBSZXNvdXJjZUdyb3VwKVtdKSB7XG4gICAgdGhpcy5yZXNvdXJjZXMkLm5leHQodmFsdWUpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIHByaXZhdGUgYWRkRGF5cyhkYXRlOiBEYXRlLCBkYXlzOiBudW1iZXIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICByZXN1bHQuc2V0RGF0ZShyZXN1bHQuZ2V0RGF0ZSgpICsgZGF5cyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG9uUHJldmlvdXNXZWVrT3JNb250aCgpIHtcbiAgICB0aGlzLm9uQ2hhbmdlV2Vla09yTW9udGgoZmFsc2UpO1xuICB9XG5cbiAgb25OZXh0V2Vla09yTW9udGgoKSB7XG4gICAgdGhpcy5vbkNoYW5nZVdlZWtPck1vbnRoKHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZVdlZWtPck1vbnRoKG5leHQ6IGJvb2xlYW4pIHtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmN1cnJlbnRXZWVrT3JNb250aCQsIHRoaXMubW9kZSRdKVxuICAgICAgLnBpcGUobWFwKChbY3VycmVudFdlZWtPck1vbnRoLCBtb2RlXSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICBjYXNlIEVTY2hlZHVsZXJNb2RlLndlZWs6IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZERheXMoY3VycmVudFdlZWtPck1vbnRoLCAobmV4dCA/IDcgOiAtNykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIEVTY2hlZHVsZXJNb2RlLnRpbWVsaW5lOiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoY3VycmVudFdlZWtPck1vbnRoLmdldEZ1bGxZZWFyKCksIGN1cnJlbnRXZWVrT3JNb250aC5nZXRNb250aCgpICsgKG5leHQgPyAxIDogLTEpLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLCB0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgodykgPT4gdGhpcy5jdXJyZW50V2Vla09yTW9udGgkLm5leHQodykpO1xuICB9XG5cbiAgb25Ib3ZlckV2ZW50KGV2OiBTY2hlZHVsZXJFdmVudCB8IG51bGwpIHtcbiAgICB0aGlzLmhvdmVyZWRFdmVudCQubmV4dChldik7XG4gIH1cblxuICBvbkxlYXZlRXZlbnQoZXY6IFNjaGVkdWxlckV2ZW50IHwgbnVsbCkge1xuICAgIHRoaXMuaG92ZXJlZEV2ZW50JC5uZXh0KG51bGwpO1xuICB9XG5cbiAgb3BlcmF0aW9uOiBEcmFnT3BlcmF0aW9uIHwgbnVsbCA9IG51bGw7XG4gIGRyYWdTdGFydFRpbWVzbG90OiBUaW1lU2xvdCB8IG51bGwgPSBudWxsO1xuICBvbkNyZWF0ZUV2ZW50KGV2OiBNb3VzZUV2ZW50LCBzbG90OiBUaW1lU2xvdCkge1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5tb3VzZVN0YXRlJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QgPSBzbG90O1xuICAgIHRoaXMub3BlcmF0aW9uID0ge1xuICAgICAgb3BlcmF0aW9uOiBFRHJhZ09wZXJhdGlvbi5jcmVhdGVFdmVudCxcbiAgICAgIGV2ZW50OiB7XG4gICAgICAgIHN0YXJ0OiBzbG90LnN0YXJ0LFxuICAgICAgICBlbmQ6IHNsb3QuZW5kLFxuICAgICAgICBjb2xvcjogJyNGMDAnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1Rlc3QgZXZlbnQnLFxuICAgICAgfSxcbiAgICAgIG1ldGE6IG51bGwsXG4gICAgfTtcbiAgICB0aGlzLnByZXZpZXdFdmVudCQubmV4dCh7IHN0YXJ0OiBzbG90LnN0YXJ0LCBlbmQ6IHNsb3QuZW5kIH0pO1xuICB9XG5cbiAgcmFuZG9tQ29sb3IoKSB7XG4gICAgY29uc3QgYnJpZ2h0bmVzcyA9IDEyODtcbiAgICByZXR1cm4gJyMnICsgdGhpcy5yYW5kb21DaGFubmVsKGJyaWdodG5lc3MpICsgdGhpcy5yYW5kb21DaGFubmVsKGJyaWdodG5lc3MpICsgdGhpcy5yYW5kb21DaGFubmVsKGJyaWdodG5lc3MpO1xuICB9XG4gIHJhbmRvbUNoYW5uZWwoYnJpZ2h0bmVzczogbnVtYmVyKXtcbiAgICBjb25zdCByID0gMjU1LWJyaWdodG5lc3M7XG4gICAgY29uc3QgbiA9IDB8KChNYXRoLnJhbmRvbSgpICogcikgKyBicmlnaHRuZXNzKTtcbiAgICBjb25zdCBzID0gbi50b1N0cmluZygxNik7XG4gICAgcmV0dXJuIChzLmxlbmd0aD09MSkgPyAnMCcrcyA6IHM7XG4gIH1cblxuICBvblN0YXJ0RHJhZ0V2ZW50KGV2ZW50UGFydDogU2NoZWR1bGVyRXZlbnRQYXJ0LCBldjogTW91c2VFdmVudCkge1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5ob3ZlcmVkVGltZVNsb3QkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKChob3ZlcmVkVGltZVNsb3QpID0+IHtcbiAgICAgIGlmIChldmVudFBhcnQuZXZlbnQpIHtcbiAgICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCA9IGhvdmVyZWRUaW1lU2xvdDtcbiAgICAgICAgdGhpcy5vcGVyYXRpb24gPSB7XG4gICAgICAgICAgb3BlcmF0aW9uOiBFRHJhZ09wZXJhdGlvbi5tb3ZlRXZlbnQsXG4gICAgICAgICAgZXZlbnQ6IGV2ZW50UGFydC5ldmVudCxcbiAgICAgICAgICBtZXRhOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnByZXZpZXdFdmVudCQubmV4dCh7IHN0YXJ0OiBldmVudFBhcnQuZXZlbnQuc3RhcnQsIGVuZDogZXZlbnRQYXJ0LmV2ZW50LmVuZCB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uU3RhcnRSZXNpemVFdmVudChldmVudDogU2NoZWR1bGVyRXZlbnQgfCBudWxsLCBwb3NpdGlvbjogJ3RvcCcgfCAnYm90dG9tJykge1xuICAgIGlmIChldmVudCkge1xuICAgICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgICBjYXNlICd0b3AnOiB7XG4gICAgICAgICAgdGhpcy5vcGVyYXRpb24gPSB7XG4gICAgICAgICAgICBvcGVyYXRpb246IEVEcmFnT3BlcmF0aW9uLnJlc2l6ZUV2ZW50LFxuICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgbWV0YTogeyBwb3NpdGlvbiB9LFxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCQubmV4dCh7IHN0YXJ0OiBldmVudC5zdGFydCwgZW5kOiBldmVudC5lbmQgfSk7XG4gICAgICAgIH0gYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6IHtcbiAgICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogRURyYWdPcGVyYXRpb24ucmVzaXplRXZlbnQsXG4gICAgICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgICAgICBtZXRhOiB7IHBvc2l0aW9uIH0sXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucHJldmlld0V2ZW50JC5uZXh0KHsgc3RhcnQ6IGV2ZW50LnN0YXJ0LCBlbmQ6IGV2ZW50LmVuZCB9KTtcbiAgICAgICAgfSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyNyZWdpb24gaG92ZXJlZFRpbWVzbG90JFxuICBwcml2YXRlIGdldEhvdmVyZWRUaW1lc2xvdChldjogTW91c2VFdmVudCwgdGltZVNsb3RzOiBTY2hlZHVsZXJTdGFtcFdpdGhTbG90c1tdKSB7XG4gICAgY29uc3QgaG92ZXJlZFNsb3RzID0gdGhpcy50aW1lU2xvdEVsZW1lbnRzLmZpbHRlcigoZWwpID0+IHtcbiAgICAgIGNvbnN0IHJjdCA9IGVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAocmN0LmxlZnQgPD0gZXYueCAmJiBldi54IDw9IHJjdC5yaWdodCAmJiByY3QudG9wIDw9IGV2LnkgJiYgZXYueSA8PSByY3QuYm90dG9tKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFob3ZlcmVkU2xvdHMgfHwgaG92ZXJlZFNsb3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc2xvdEVsZW1lbnQgPSBob3ZlcmVkU2xvdHNbMF0ubmF0aXZlRWxlbWVudDtcblxuICAgIGNvbnN0IHN0clJvdyA9IHNsb3RFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yb3cnKTtcbiAgICBpZiAoIXN0clJvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJvdyA9IHBhcnNlSW50KHN0clJvdyk7XG5cbiAgICBjb25zdCBzdHJDb2x1bW4gPSBzbG90RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29sdW1uJyk7XG4gICAgaWYgKCFzdHJDb2x1bW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW4gPSBwYXJzZUludChzdHJDb2x1bW4pO1xuXG4gICAgY29uc3Qgc2xvdCA9IHRpbWVTbG90c1tyb3ddLnNsb3RzW2NvbHVtbl07XG4gICAgcmV0dXJuIHNsb3Q7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZW1vdmUnLCBbJyRldmVudCddKVxuICBvbk1vdXNlbW92ZShldjogTW91c2VFdmVudCkge1xuICAgIHRoaXMudGltZVNsb3RzJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgodGltZVNsb3RzKSA9PiB7XG4gICAgICBjb25zdCBob3ZlcmVkID0gdGhpcy5nZXRIb3ZlcmVkVGltZXNsb3QoZXYsIHRpbWVTbG90cyk7XG4gICAgICB0aGlzLmhvdmVyZWRUaW1lU2xvdCQubmV4dChob3ZlcmVkKTtcblxuICAgICAgaWYgKHRoaXMub3BlcmF0aW9uKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5vcGVyYXRpb24ub3BlcmF0aW9uKSB7XG4gICAgICAgICAgY2FzZSBFRHJhZ09wZXJhdGlvbi5jcmVhdGVFdmVudDoge1xuICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uLmV2ZW50ICYmIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QgJiYgaG92ZXJlZCAmJiAodGhpcy5vcGVyYXRpb24uZXZlbnQuZW5kLmdldFRpbWUoKSAhPSBob3ZlcmVkLmVuZC5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmRyYWdTdGFydFRpbWVzbG90LnN0YXJ0LmdldFRpbWUoKSA9PT0gaG92ZXJlZC5zdGFydC5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgICAvLyAxIHNsb3RcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyYWdTdGFydFRpbWVzbG90LnN0YXJ0LmdldFRpbWUoKSA8IGhvdmVyZWQuc3RhcnQuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gRHJhZyBkb3duXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkXG4gICAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKGV2KSA9PiAhIWV2ICYmICEhdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCkpXG4gICAgICAgICAgICAgICAgICAucGlwZShtYXAoKGV2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldiAmJiB0aGlzLmRyYWdTdGFydFRpbWVzbG90KSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXYuc3RhcnQgPSB0aGlzLmRyYWdTdGFydFRpbWVzbG90LnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgIGV2LmVuZCA9IGhvdmVyZWQuZW5kO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldjtcbiAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2KSA9PiB0aGlzLnByZXZpZXdFdmVudCQubmV4dChldikpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpID4gaG92ZXJlZC5zdGFydC5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBEcmFnIHVwXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkXG4gICAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKGV2KSA9PiAhIWV2ICYmICEhdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCkpXG4gICAgICAgICAgICAgICAgICAucGlwZShtYXAoKGV2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldiAmJiB0aGlzLmRyYWdTdGFydFRpbWVzbG90KSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXYuc3RhcnQgPSBob3ZlcmVkLnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgIGV2LmVuZCA9IHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QuZW5kO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldjtcbiAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2KSA9PiB0aGlzLnByZXZpZXdFdmVudCQubmV4dChldikpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBicmVhaztcbiAgICAgICAgICBjYXNlIEVEcmFnT3BlcmF0aW9uLm1vdmVFdmVudDoge1xuICAgICAgICAgICAgaWYgKGhvdmVyZWQgJiYgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCkge1xuICAgICAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCRcbiAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKGV2KSA9PiAhIWV2ICYmICEhdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCkpXG4gICAgICAgICAgICAgICAgLnBpcGUobWFwKChldikgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGV2ICYmIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gIDxQcmV2aWV3RXZlbnQ+e1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBuZXcgRGF0ZShldi5zdGFydC5nZXRUaW1lKCkgKyBob3ZlcmVkLnN0YXJ0LmdldFRpbWUoKSAtIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG5ldyBEYXRlKGV2LmVuZC5nZXRUaW1lKCkgKyBob3ZlcmVkLnN0YXJ0LmdldFRpbWUoKSAtIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCA9IGhvdmVyZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZXYgPT4gdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQoZXYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGJyZWFrO1xuICAgICAgICAgIGNhc2UgRURyYWdPcGVyYXRpb24ucmVzaXplRXZlbnQ6IHtcbiAgICAgICAgICAgIGlmIChob3ZlcmVkKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJldmlld0V2ZW50JFxuICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoZXYpID0+ICEhZXYpKVxuICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoZXYpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChldiAmJiB0aGlzLm9wZXJhdGlvbiAmJiB0aGlzLm9wZXJhdGlvbi5ldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRpb24ubWV0YS5wb3NpdGlvbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBldi5zdGFydCA9IGhvdmVyZWQuc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgZXYuZW5kID0gdGhpcy5vcGVyYXRpb24uZXZlbnQuZW5kO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3BlcmF0aW9uLm1ldGEucG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXYuc3RhcnQgPSB0aGlzLm9wZXJhdGlvbi5ldmVudC5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICBldi5lbmQgPSBob3ZlcmVkLmVuZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2O1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXYpID0+IHRoaXMucHJldmlld0V2ZW50JC5uZXh0KGV2KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXG4gIG9uTW91c2VVcChldjogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLm9wZXJhdGlvbikge1xuICAgICAgc3dpdGNoICh0aGlzLm9wZXJhdGlvbi5vcGVyYXRpb24pIHtcbiAgICAgICAgY2FzZSBFRHJhZ09wZXJhdGlvbi5jcmVhdGVFdmVudDoge1xuICAgICAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMucHJldmlld0V2ZW50JF0pXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoW3ByZXZpZXdFdmVudF0pID0+IHtcbiAgICAgICAgICAgICAgaWYgKHByZXZpZXdFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlcmF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTdGFydFRpbWVzbG90ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlcyQubmV4dChbXG4gICAgICAgICAgICAgICAgICAuLi50aGlzLnJlc291cmNlcyQudmFsdWUsXG4gICAgICAgICAgICAgICAgICA8UmVzb3VyY2U+e1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ05ldyByZXNvdXJjZSBncm91cCcsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3tcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydDogcHJldmlld0V2ZW50LnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgIGVuZDogcHJldmlld0V2ZW50LmVuZCxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5yYW5kb21Db2xvcigpLFxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTmV3IGV2ZW50J1xuICAgICAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmlld0V2ZW50JC5uZXh0KG51bGwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBicmVhaztcbiAgICAgICAgY2FzZSBFRHJhZ09wZXJhdGlvbi5tb3ZlRXZlbnQ6XG4gICAgICAgIGNhc2UgRURyYWdPcGVyYXRpb24ucmVzaXplRXZlbnQ6IHtcbiAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCRcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcigoZXYpID0+ICEhZXYpKVxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHByZXZpZXdFdmVudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRpb24gJiYgdGhpcy5vcGVyYXRpb24uZXZlbnQgJiYgcHJldmlld0V2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRpb24uZXZlbnQuc3RhcnQgPSBwcmV2aWV3RXZlbnQuc3RhcnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRpb24uZXZlbnQuZW5kID0gcHJldmlld0V2ZW50LmVuZDtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXMkLm5leHQodGhpcy5yZXNvdXJjZXMkLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCQubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQodHJ1ZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gdy0xMDAgb3ZlcmZsb3cteS1hdXRvIG1iLTAgd2Vlay1zY2hlZHVsZVwiIFtzdHlsZS5tYXgtaGVpZ2h0LnB4XT1cIm51bGxcIlxuICAgICpuZ0lmPVwiKG1vZGUkIHwgYXN5bmMpID09PSBtb2Rlcy53ZWVrXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWhlYWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjYWxlbmRhci1sZWZ0IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBmbGV4LXN0YXJ0XCIgKGNsaWNrKT1cIm9uUHJldmlvdXNXZWVrT3JNb250aCgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxicy1pY29uIFtpY29uXT1cIidjaGV2cm9uLWxlZnQnXCIgY2xhc3M9XCJweC0wXCI+PC9icy1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgZmxleC1lbmRcIiAoY2xpY2spPVwib25OZXh0V2Vla09yTW9udGgoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnMtaWNvbiBbaWNvbl09XCInY2hldnJvbi1yaWdodCdcIiBjbGFzcz1cInB4LTBcIj48L2JzLWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSBjYWxlbmRhci1oZWFkLWNlbGxcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIChzaG93bkRheXMkIHwgYXN5bmMpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWJsb2NrIGNvbC1mb3JtLWxhYmVsIHRleHQtY2VudGVyIHRleHQtbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRheSB8IGRhdGU6ICdkZC1NTScgfX08L3NwYW4+PHNwYW4gY2xhc3M9XCJkLW5vbmUgZC1sZy1pbmxpbmUtYmxvY2tcIj4te3sgZGF5IHwgZGF0ZTogJ3l5eXknIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItYm9keVwiIFtzdHlsZS5oZWlnaHQucHhdPVwibWF4SW5uZXJIZWlnaHRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCIgKm5nSWY9XCIodGltZVNsb3RzJCB8IGFzeW5jKSBhcyByb3dcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIod2Vla09wdGlvbnMkIHwgYXN5bmMpIGFzIHdlZWtPcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBUaW1lc2xvdHMgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdGltZXNsb3RzIG9mIHJvdzsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IHAtMCB0aW1lc2xvdFwiIFtzdHlsZS5oZWlnaHQucHhdPVwid2Vla09wdGlvbnMudW5pdEhlaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY2VsbCBjYWxlbmRhci1sZWZ0IGFsaWduLXRvcCBweC0yIHB5LTBcIj57eyB0aW1lc2xvdHMuc2xvdHNbMF0uc3RhcnQgfCBkYXRlOiAnSEg6bW06c3MnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1jZWxsIGZsZXgtZ3Jvdy0xXCIgKm5nRm9yPVwibGV0IHNsb3Qgb2YgdGltZXNsb3RzLnNsb3RzOyBsZXQgaiA9IGluZGV4XCIgI3Nsb3QgKG1vdXNlZG93bik9XCJvbkNyZWF0ZUV2ZW50KCRldmVudCwgc2xvdClcIiBbYXR0ci5kYXRhLXJvd109XCJpXCIgW2F0dHIuZGF0YS1jb2x1bW5dPVwialwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBFdmVudHMgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIih0aW1lU2xvdER1cmF0aW9uJCB8IGFzeW5jKSBhcyB0aW1lU2xvdER1cmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIodGltZWxpbmVkRXZlbnRQYXJ0c0ZvclRoaXNXZWVrJCB8IGFzeW5jKSBhcyBwYXJ0RGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXZlbnRQYXJ0IG9mIHBhcnREYXRhLnBhcnRzXCIgY2xhc3M9XCJldmVudCBwLTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiKGV2ZW50UGFydC5wYXJ0IHwgYnNTZWNvbmRzVG9kYXlPZmZzZXQpIC8gdGltZVNsb3REdXJhdGlvbiAqIHdlZWtPcHRpb25zLnVuaXRIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiKGV2ZW50UGFydC5wYXJ0IHwgYnNTZWNvbmRzVGltZXNwYW4pIC8gdGltZVNsb3REdXJhdGlvbiAqIHdlZWtPcHRpb25zLnVuaXRIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5sZWZ0XT1cIidjYWxjKDkwcHggKyAoKDEwMCUgLSA5MHB4KSAvIDcgKiAnICsgKChldmVudFBhcnQucGFydCB8IGRheU9mV2VlaykgLSAxKSArICcpKSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtaW5uZXJcIiBbY2xhc3MuaG92ZXJdPVwiKGhvdmVyZWRFdmVudCQgfCBhc3luYykgPT09IGV2ZW50UGFydC5wYXJ0LmV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIidjYWxjKDEwMCUgLyAnICsgcGFydERhdGEudG90YWwgKyAnKSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIihldmVudFBhcnQucGFydCB8IGJzU2Vjb25kc1RpbWVzcGFuKSAvIHRpbWVTbG90RHVyYXRpb24gKiB3ZWVrT3B0aW9ucy51bml0SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1hcmdpbi1sZWZ0XT1cIidjYWxjKDEwMCUgLyAnICsgcGFydERhdGEudG90YWwgKyAnICogJyArIGV2ZW50UGFydC5pbmRleCArICcpJ1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1yZXNpemUgdG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZXZlbnRQYXJ0LnBhcnQuc3RhcnQgPT09IGV2ZW50UGFydC5wYXJ0LmV2ZW50Py5zdGFydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uU3RhcnRSZXNpemVFdmVudChldmVudFBhcnQucGFydC5ldmVudCwgJ3RvcCcpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1ib3JkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50LXdyYXBwZXJcIiAqbmdJZj1cImV2ZW50UGFydC5wYXJ0LmV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25TdGFydERyYWdFdmVudChldmVudFBhcnQucGFydCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkhvdmVyRXZlbnQoZXZlbnRQYXJ0LnBhcnQuZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uTGVhdmVFdmVudChldmVudFBhcnQucGFydC5ldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1iZ1wiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImV2ZW50UGFydC5wYXJ0LmV2ZW50LmNvbG9yXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtbGFiZWxcIj57eyBldmVudFBhcnQucGFydC5ldmVudC5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50LXJlc2l6ZSBib3R0b21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJldmVudFBhcnQucGFydC5lbmQgPT09IGV2ZW50UGFydC5wYXJ0LmV2ZW50Py5lbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblN0YXJ0UmVzaXplRXZlbnQoZXZlbnRQYXJ0LnBhcnQuZXZlbnQsICdib3R0b20nKVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHByZXZpZXdFdmVudFBhcnRzRm9yVGhpc1dlZWskIHwgYXN5bmMpIGFzIHByZXZpZXdQYXJ0RGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXZlbnRQYXJ0IG9mIHByZXZpZXdQYXJ0RGF0YVwiIGNsYXNzPVwiZXZlbnQgcHJldmlldyBwLTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiKGV2ZW50UGFydCB8IGJzU2Vjb25kc1RvZGF5T2Zmc2V0KSAvIHRpbWVTbG90RHVyYXRpb24gKiB3ZWVrT3B0aW9ucy51bml0SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIihldmVudFBhcnQgfCBic1NlY29uZHNUaW1lc3BhbikgLyB0aW1lU2xvdER1cmF0aW9uICogd2Vla09wdGlvbnMudW5pdEhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnRdPVwiJ2NhbGMoOTBweCArICgoMTAwJSAtIDkwcHgpIC8gNyAqICcgKyAoKGV2ZW50UGFydCB8IGRheU9mV2VlaykgLSAxKSArICcpKSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtaW5uZXIgdy0xMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIihldmVudFBhcnQgfCBic1NlY29uZHNUaW1lc3BhbikgLyB0aW1lU2xvdER1cmF0aW9uICogd2Vla09wdGlvbnMudW5pdEhlaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uLTEwMCBvdmVyZmxvdy15LWF1dG8gbWItMCBiZy13aGl0ZSB0aW1lbGluZVwiICpuZ0lmPVwiKG1vZGUkIHwgYXN5bmMpID09PSBtb2Rlcy50aW1lbGluZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkIGQtZmxleFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGZsZXgtc3RhcnRcIiAoY2xpY2spPVwib25QcmV2aW91c1dlZWtPck1vbnRoKClcIj5cbiAgICAgICAgICAgIDxicy1pY29uIFtpY29uXT1cIidjaGV2cm9uLWxlZnQnXCIgY2xhc3M9XCJweC0wXCI+PC9icy1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xIGgzIHB5LTIgbWItMCB0ZXh0LWNlbnRlclwiPnt7IGN1cnJlbnRXZWVrT3JNb250aCQgfCBhc3luYyB8IGRhdGU6ICdNTU1NIHl5eXknIH19PC9kaXY+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gZmxleC1zdGFydFwiIChjbGljayk9XCJvbk5leHRXZWVrT3JNb250aCgpXCI+XG4gICAgICAgICAgICA8YnMtaWNvbiBbaWNvbl09XCInY2hldnJvbi1yaWdodCdcIiBjbGFzcz1cInB4LTBcIj48L2JzLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1ib2R5IHRhYmxlLXJlc3BvbnNpdmUgb3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIG1iLTBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIodGltZVNsb3RzJCB8IGFzeW5jKSBhcyB0aW1lU2xvdHNcIj5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGRheSBvZiB0aW1lU2xvdHNcIiBbYXR0ci5jb2xzcGFuXT1cImRheS5zbG90cy5sZW5ndGhcIiBjbGFzcz1cInRleHQtY2VudGVyIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicG9zaXRpb24tc3RpY2t5IGRheS1sYWJlbFwiPnt7IGRheS5zdGFtcCB8IGRhdGU6ICdkIEVFJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIodGltZWxpbmVPcHRpb25zJCB8IGFzeW5jKSBhcyB0aW1lbGluZU9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRheSBvZiB0aW1lU2xvdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IHNsb3Qgb2YgZGF5LnNsb3RzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1ibG9jayBwLTAgdGV4dC1jZW50ZXJcIiBbc3R5bGUud2lkdGgucHhdPVwidGltZWxpbmVPcHRpb25zLnVuaXRXaWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2xvdC5zdGFydCB8IGRhdGU6ICdISDptbScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8YnMtcmVzb3VyY2UtZ3JvdXAtcHJlc2VudGVyICpuZ0Zvcj1cImxldCBncm91cCBvZiAocmVzb3VyY2VzJCB8IGFzeW5jKVwiIFtyZXNvdXJjZUdyb3VwXT1cImdyb3VwXCIgW3RpbWVTbG90c109XCJ0aW1lU2xvdHNcIj48L2JzLXJlc291cmNlLWdyb3VwLXByZXNlbnRlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
1
+ import { Component, EventEmitter, HostListener, Input, Output, QueryList, ViewChildren } from '@angular/core';
2
+ import { BehaviorSubject, combineLatest, filter, map, Subject, take, takeUntil } from 'rxjs';
3
+ import { BsCalendarMonthService } from '@mintplayer/ng-bootstrap/calendar-month';
4
+ import { ESchedulerMode } from '../../enums/scheduler-mode';
5
+ import { EDragOperation } from '../../enums/drag-operation';
6
+ import { BsTimelineService } from '../../services/timeline/timeline.service';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@mintplayer/ng-bootstrap/calendar-month";
9
+ import * as i2 from "../../services/timeline/timeline.service";
10
+ import * as i3 from "@angular/common";
11
+ import * as i4 from "@mintplayer/ng-bootstrap/icon";
12
+ import * as i5 from "../resource-group-presenter/resource-group-presenter.component";
13
+ import * as i6 from "../../pipes/bs-seconds-timespan.pipe/bs-seconds-timespan.pipe";
14
+ import * as i7 from "../../pipes/bs-seconds-today-offset/bs-seconds-today-offset.pipe";
15
+ import * as i8 from "../../pipes/day-of-week/day-of-week.pipe";
16
+ export class BsSchedulerComponent {
17
+ constructor(calendarMonthService, timelineService) {
18
+ this.calendarMonthService = calendarMonthService;
19
+ this.timelineService = timelineService;
20
+ this.resources$ = new BehaviorSubject([]);
21
+ this.weekOptions$ = new BehaviorSubject({ unitHeight: 30 });
22
+ this.timelineOptions$ = new BehaviorSubject({ unitWidth: 50 });
23
+ this.previewEvent$ = new BehaviorSubject(null);
24
+ this.timeSlotDuration$ = new BehaviorSubject(1800);
25
+ this.timeSlots$ = new BehaviorSubject([]);
26
+ this.mouseState$ = new BehaviorSubject(false);
27
+ this.hoveredTimeSlot$ = new BehaviorSubject(null);
28
+ this.hoveredEvent$ = new BehaviorSubject(null);
29
+ this.destroyed$ = new Subject();
30
+ //#region Mode
31
+ this.modes = ESchedulerMode;
32
+ this.mode$ = new BehaviorSubject(ESchedulerMode.week);
33
+ this.modeChange = new EventEmitter();
34
+ //#endregion
35
+ // //#region Scale
36
+ // scale$ = new BehaviorSubject<SchedulerScale>(availableScales[4]);
37
+ // @Output() public scaleChange = new EventEmitter<SchedulerScale>();
38
+ // public get scale() {
39
+ // return this.scale$.value;
40
+ // }
41
+ // @Input() public set scale(value: SchedulerScale) {
42
+ // this.scale$.next(value);
43
+ // }
44
+ // //#endregion
45
+ //#region WeekOptions
46
+ this.weekOptionsChange = new EventEmitter();
47
+ //#endregion
48
+ //#region TimelineOptions
49
+ this.timelineOptionsChange = new EventEmitter();
50
+ //#endregion
51
+ //#region maxInnerHeight
52
+ this.maxInnerHeight = null;
53
+ this.operation = null;
54
+ this.dragStartTimeslot = null;
55
+ const monday = this.calendarMonthService.getMondayBefore(new Date());
56
+ this.currentWeekOrMonth$ = new BehaviorSubject(monday);
57
+ this.shownDays$ = combineLatest([this.currentWeekOrMonth$, this.mode$])
58
+ .pipe(map(([currentDay, mode]) => {
59
+ currentDay.setHours(0);
60
+ currentDay.setMinutes(0);
61
+ currentDay.setSeconds(0);
62
+ currentDay.setMilliseconds(0);
63
+ switch (mode) {
64
+ case ESchedulerMode.week: {
65
+ return Array.from(Array(7).keys()).map((x) => this.addDays(currentDay, x));
66
+ }
67
+ case ESchedulerMode.timeline: {
68
+ const firstDay = new Date(currentDay.getFullYear(), currentDay.getMonth(), 1);
69
+ const daysOfMonth = new Date(currentDay.getFullYear(), currentDay.getMonth() + 1, 0).getDate();
70
+ return Array.from(Array(daysOfMonth).keys()).map((x) => this.addDays(firstDay, x));
71
+ }
72
+ }
73
+ }));
74
+ this.daysOfWeekWithTimestamps$ = this.shownDays$
75
+ .pipe(map((shownDays) => ({ start: shownDays[0].getTime(), end: shownDays[shownDays.length - 1].getTime() + 24 * 60 * 60 * 1000 })));
76
+ this.events$ = this.resources$
77
+ .pipe(map((resourcesOrGroups) => resourcesOrGroups.map(resOrGroup => this.getResourcesForGroup(resOrGroup))))
78
+ .pipe(map(jaggedResources => jaggedResources.reduce((flat, toFlatten) => flat.concat(toFlatten), [])))
79
+ .pipe(map(resources => resources.map(res => res.events)))
80
+ .pipe(map(jaggedEvents => jaggedEvents.reduce((flat, toFlatten) => flat.concat(toFlatten), [])));
81
+ // groups.reduce((flat, toFlatten) => flat.concat(toFlatten.children), [])
82
+ this.eventParts$ = this.events$.pipe(map((events) => events.map((ev) => this.timelineService.splitInParts(ev))));
83
+ this.eventPartsForThisWeek$ = combineLatest([
84
+ this.daysOfWeekWithTimestamps$,
85
+ this.eventParts$
86
+ .pipe(map(eventParts => eventParts.map(evp => evp.parts)))
87
+ .pipe(map(jaggedParts => jaggedParts.reduce((flat, toFlatten) => flat.concat(toFlatten), [])))
88
+ ])
89
+ .pipe(map(([startAndEnd, eventParts]) => {
90
+ return eventParts.filter(eventPart => {
91
+ return !((eventPart.end.getTime() <= startAndEnd.start) || (eventPart.start.getTime() >= startAndEnd.end));
92
+ });
93
+ }));
94
+ this.previewEventParts$ = this.previewEvent$.pipe(map((event) => {
95
+ if (event) {
96
+ return this.timelineService.splitInParts(event);
97
+ }
98
+ else {
99
+ return null;
100
+ }
101
+ }));
102
+ this.previewEventPartsForThisWeek$ = combineLatest([this.daysOfWeekWithTimestamps$, this.previewEventParts$])
103
+ .pipe(map(([startAndEnd, previewEventParts]) => {
104
+ if (previewEventParts) {
105
+ return previewEventParts.parts.filter(eventPart => {
106
+ return !((eventPart.end.getTime() <= startAndEnd.start) || (eventPart.start.getTime() >= startAndEnd.end));
107
+ });
108
+ }
109
+ else {
110
+ return [];
111
+ }
112
+ }));
113
+ this.timelinedEventPartsForThisWeek$ = this.eventPartsForThisWeek$
114
+ .pipe(map(eventParts => {
115
+ // We'll only use the events for this week
116
+ const events = eventParts.map(ep => ep.event)
117
+ .filter((e, i, list) => list.indexOf(e) === i)
118
+ .filter((e) => !!e)
119
+ .map((e) => e);
120
+ const timeline = this.timelineService.getTimeline(events);
121
+ const result = timeline.map(track => track.events.map(ev => ({ event: ev, index: track.index })))
122
+ .reduce((flat, toFlatten) => flat.concat(toFlatten), [])
123
+ .map((evi) => eventParts.filter(p => p.event === evi.event).map(p => ({ part: p, index: evi.index })))
124
+ .reduce((flat, toFlatten) => flat.concat(toFlatten), []);
125
+ return {
126
+ total: timeline.length,
127
+ parts: result
128
+ };
129
+ }));
130
+ combineLatest([this.mode$, this.shownDays$, this.timeSlotDuration$])
131
+ .pipe(filter(([mode, shownDays, duration]) => mode !== null))
132
+ .pipe(map(([mode, shownDays, duration]) => {
133
+ switch (mode) {
134
+ case ESchedulerMode.week: {
135
+ const timeSlotsPerDay = Math.floor((60 * 60 * 24) / duration);
136
+ return Array.from(Array(timeSlotsPerDay).keys()).map((index) => {
137
+ const timeslotForMonday = this.createTimeslot(shownDays[0], index, duration);
138
+ return {
139
+ slots: shownDays.map((day) => {
140
+ const start = new Date(day);
141
+ start.setHours(timeslotForMonday.start.getHours());
142
+ start.setMinutes(timeslotForMonday.start.getMinutes());
143
+ start.setSeconds(timeslotForMonday.start.getSeconds());
144
+ start.setMilliseconds(timeslotForMonday.start.getMilliseconds());
145
+ const end = new Date(day);
146
+ end.setHours(timeslotForMonday.end.getHours());
147
+ end.setMinutes(timeslotForMonday.end.getMinutes());
148
+ end.setSeconds(timeslotForMonday.end.getSeconds());
149
+ end.setMilliseconds(timeslotForMonday.end.getMilliseconds());
150
+ end.setDate(end.getDate() + timeslotForMonday.end.getDate() - timeslotForMonday.start.getDate());
151
+ return { start, end };
152
+ }),
153
+ stamp: timeslotForMonday.start
154
+ };
155
+ });
156
+ }
157
+ case ESchedulerMode.timeline: {
158
+ const totalTimeslots = (24 * 60 * 60) / duration;
159
+ return shownDays.map((day) => {
160
+ return {
161
+ slots: Array.from(Array(totalTimeslots).keys())
162
+ .map((index) => {
163
+ return this.createTimeslot(day, index, duration);
164
+ }),
165
+ stamp: day
166
+ };
167
+ });
168
+ }
169
+ default: {
170
+ throw 'Unknown value for Mode: ' + mode;
171
+ }
172
+ }
173
+ }))
174
+ .subscribe((timeslots) => {
175
+ // For performance reasons, we're not using an observable here, but persist the timeslots in a BehaviorSubject.
176
+ this.timeSlots$.next(timeslots);
177
+ });
178
+ this.weekOptions$
179
+ .pipe(takeUntil(this.destroyed$))
180
+ .subscribe((weekOptions) => {
181
+ this.weekOptionsChange.emit(weekOptions);
182
+ });
183
+ this.timelineOptions$
184
+ .pipe(takeUntil(this.destroyed$))
185
+ .subscribe((timelineOptions) => {
186
+ this.timelineOptionsChange.emit(timelineOptions);
187
+ });
188
+ // combineLatest([this.mode$, this.scale$])
189
+ // .pipe(filter(([mode, scale]) => mode === ESchedulerMode.timeline))
190
+ }
191
+ createTimeslot(date, index, duration) {
192
+ const timeSlotStart = new Date(date);
193
+ timeSlotStart.setTime(+timeSlotStart.getTime() + index * duration * 1000);
194
+ const timeSlotEnd = new Date(timeSlotStart);
195
+ timeSlotEnd.setTime(+timeSlotEnd.getTime() + duration * 1000);
196
+ return { start: timeSlotStart, end: timeSlotEnd };
197
+ }
198
+ getResourcesForGroup(resourceOrGroup) {
199
+ if ('children' in resourceOrGroup) {
200
+ return resourceOrGroup.children
201
+ .map((child) => this.getResourcesForGroup(child))
202
+ .reduce((flat, toFlatten) => flat.concat(toFlatten), []);
203
+ }
204
+ else {
205
+ return [resourceOrGroup];
206
+ }
207
+ }
208
+ get mode() {
209
+ return this.mode$.value;
210
+ }
211
+ set mode(value) {
212
+ this.mode$.next(value);
213
+ }
214
+ get weekOptions() {
215
+ return this.weekOptions$.value;
216
+ }
217
+ set weekOptions(value) {
218
+ this.weekOptions$.next(value);
219
+ }
220
+ get timelineOptions() {
221
+ return this.timelineOptions$.value;
222
+ }
223
+ set timelineOptions(value) {
224
+ this.timelineOptions$.next(value);
225
+ }
226
+ //#endregion
227
+ //#region Resources
228
+ get resources() {
229
+ return this.resources$.value;
230
+ }
231
+ set resources(value) {
232
+ this.resources$.next(value);
233
+ }
234
+ //#endregion
235
+ addDays(date, days) {
236
+ const result = new Date(date);
237
+ result.setDate(result.getDate() + days);
238
+ return result;
239
+ }
240
+ onPreviousWeekOrMonth() {
241
+ this.onChangeWeekOrMonth(false);
242
+ }
243
+ onNextWeekOrMonth() {
244
+ this.onChangeWeekOrMonth(true);
245
+ }
246
+ onChangeWeekOrMonth(next) {
247
+ combineLatest([this.currentWeekOrMonth$, this.mode$])
248
+ .pipe(map(([currentWeekOrMonth, mode]) => {
249
+ switch (mode) {
250
+ case ESchedulerMode.week: {
251
+ return this.addDays(currentWeekOrMonth, (next ? 7 : -7));
252
+ }
253
+ case ESchedulerMode.timeline: {
254
+ return new Date(currentWeekOrMonth.getFullYear(), currentWeekOrMonth.getMonth() + (next ? 1 : -1), 1);
255
+ }
256
+ }
257
+ }), take(1))
258
+ .subscribe((w) => this.currentWeekOrMonth$.next(w));
259
+ }
260
+ onHoverEvent(ev) {
261
+ this.hoveredEvent$.next(ev);
262
+ }
263
+ onLeaveEvent(ev) {
264
+ this.hoveredEvent$.next(null);
265
+ }
266
+ onCreateEvent(ev, slot) {
267
+ ev.preventDefault();
268
+ this.mouseState$.next(true);
269
+ this.dragStartTimeslot = slot;
270
+ this.operation = {
271
+ operation: EDragOperation.createEvent,
272
+ event: {
273
+ start: slot.start,
274
+ end: slot.end,
275
+ color: '#F00',
276
+ description: 'Test event',
277
+ },
278
+ meta: null,
279
+ };
280
+ this.previewEvent$.next({ start: slot.start, end: slot.end });
281
+ }
282
+ randomColor() {
283
+ const brightness = 128;
284
+ return '#' + this.randomChannel(brightness) + this.randomChannel(brightness) + this.randomChannel(brightness);
285
+ }
286
+ randomChannel(brightness) {
287
+ const r = 255 - brightness;
288
+ const n = 0 | ((Math.random() * r) + brightness);
289
+ const s = n.toString(16);
290
+ return (s.length == 1) ? '0' + s : s;
291
+ }
292
+ onStartDragEvent(eventPart, ev) {
293
+ ev.preventDefault();
294
+ this.hoveredTimeSlot$.pipe(take(1)).subscribe((hoveredTimeSlot) => {
295
+ if (eventPart.event) {
296
+ this.dragStartTimeslot = hoveredTimeSlot;
297
+ this.operation = {
298
+ operation: EDragOperation.moveEvent,
299
+ event: eventPart.event,
300
+ meta: null,
301
+ };
302
+ this.previewEvent$.next({ start: eventPart.event.start, end: eventPart.event.end });
303
+ }
304
+ });
305
+ }
306
+ onStartResizeEvent(event, position) {
307
+ if (event) {
308
+ switch (position) {
309
+ case 'top':
310
+ {
311
+ this.operation = {
312
+ operation: EDragOperation.resizeEvent,
313
+ event: event,
314
+ meta: { position },
315
+ };
316
+ this.previewEvent$.next({ start: event.start, end: event.end });
317
+ }
318
+ break;
319
+ case 'bottom':
320
+ {
321
+ this.operation = {
322
+ operation: EDragOperation.resizeEvent,
323
+ event: event,
324
+ meta: { position },
325
+ };
326
+ this.previewEvent$.next({ start: event.start, end: event.end });
327
+ }
328
+ break;
329
+ }
330
+ }
331
+ }
332
+ //#region hoveredTimeslot$
333
+ getHoveredTimeslot(ev, timeSlots) {
334
+ const hoveredSlots = this.timeSlotElements.filter((el) => {
335
+ const rct = el.nativeElement.getBoundingClientRect();
336
+ if (rct.left <= ev.x && ev.x <= rct.right && rct.top <= ev.y && ev.y <= rct.bottom) {
337
+ return true;
338
+ }
339
+ else {
340
+ return false;
341
+ }
342
+ });
343
+ if (!hoveredSlots || hoveredSlots.length === 0) {
344
+ return null;
345
+ }
346
+ const slotElement = hoveredSlots[0].nativeElement;
347
+ const strRow = slotElement.getAttribute('data-row');
348
+ if (!strRow) {
349
+ return null;
350
+ }
351
+ const row = parseInt(strRow);
352
+ const strColumn = slotElement.getAttribute('data-column');
353
+ if (!strColumn) {
354
+ return null;
355
+ }
356
+ const column = parseInt(strColumn);
357
+ const slot = timeSlots[row].slots[column];
358
+ return slot;
359
+ }
360
+ onMousemove(ev) {
361
+ this.timeSlots$.pipe(take(1)).subscribe((timeSlots) => {
362
+ const hovered = this.getHoveredTimeslot(ev, timeSlots);
363
+ this.hoveredTimeSlot$.next(hovered);
364
+ if (this.operation) {
365
+ switch (this.operation.operation) {
366
+ case EDragOperation.createEvent:
367
+ {
368
+ if (this.operation.event && this.dragStartTimeslot && hovered && (this.operation.event.end.getTime() != hovered.end.getTime())) {
369
+ if (this.dragStartTimeslot.start.getTime() === hovered.start.getTime()) {
370
+ // 1 slot
371
+ }
372
+ else if (this.dragStartTimeslot.start.getTime() < hovered.start.getTime()) {
373
+ // Drag down
374
+ this.previewEvent$
375
+ .pipe(filter((ev) => !!ev && !!this.dragStartTimeslot))
376
+ .pipe(map((ev) => {
377
+ if (ev && this.dragStartTimeslot) {
378
+ ev.start = this.dragStartTimeslot.start;
379
+ ev.end = hovered.end;
380
+ }
381
+ return ev;
382
+ }))
383
+ .pipe(take(1))
384
+ .subscribe((ev) => this.previewEvent$.next(ev));
385
+ }
386
+ else if (this.dragStartTimeslot.start.getTime() > hovered.start.getTime()) {
387
+ // Drag up
388
+ this.previewEvent$
389
+ .pipe(filter((ev) => !!ev && !!this.dragStartTimeslot))
390
+ .pipe(map((ev) => {
391
+ if (ev && this.dragStartTimeslot) {
392
+ ev.start = hovered.start;
393
+ ev.end = this.dragStartTimeslot.end;
394
+ }
395
+ return ev;
396
+ }))
397
+ .pipe(take(1))
398
+ .subscribe((ev) => this.previewEvent$.next(ev));
399
+ }
400
+ }
401
+ }
402
+ break;
403
+ case EDragOperation.moveEvent:
404
+ {
405
+ if (hovered && this.dragStartTimeslot) {
406
+ this.previewEvent$
407
+ .pipe(filter((ev) => !!ev && !!this.dragStartTimeslot))
408
+ .pipe(map((ev) => {
409
+ if (ev && this.dragStartTimeslot) {
410
+ const result = {
411
+ start: new Date(ev.start.getTime() + hovered.start.getTime() - this.dragStartTimeslot.start.getTime()),
412
+ end: new Date(ev.end.getTime() + hovered.start.getTime() - this.dragStartTimeslot.start.getTime())
413
+ };
414
+ this.dragStartTimeslot = hovered;
415
+ return result;
416
+ }
417
+ else {
418
+ return ev;
419
+ }
420
+ }))
421
+ .pipe(take(1))
422
+ .subscribe(ev => this.previewEvent$.next(ev));
423
+ }
424
+ }
425
+ break;
426
+ case EDragOperation.resizeEvent:
427
+ {
428
+ if (hovered) {
429
+ this.previewEvent$
430
+ .pipe(filter((ev) => !!ev))
431
+ .pipe(map((ev) => {
432
+ if (ev && this.operation && this.operation.event) {
433
+ if (this.operation.meta.position === 'top') {
434
+ ev.start = hovered.start;
435
+ ev.end = this.operation.event.end;
436
+ }
437
+ else if (this.operation.meta.position === 'bottom') {
438
+ ev.start = this.operation.event.start;
439
+ ev.end = hovered.end;
440
+ }
441
+ }
442
+ return ev;
443
+ }))
444
+ .pipe(take(1))
445
+ .subscribe((ev) => this.previewEvent$.next(ev));
446
+ }
447
+ }
448
+ break;
449
+ }
450
+ }
451
+ });
452
+ }
453
+ //#endregion
454
+ onMouseUp(ev) {
455
+ if (this.operation) {
456
+ switch (this.operation.operation) {
457
+ case EDragOperation.createEvent:
458
+ {
459
+ combineLatest([this.previewEvent$])
460
+ .pipe(take(1))
461
+ .subscribe(([previewEvent]) => {
462
+ if (previewEvent) {
463
+ this.operation = null;
464
+ this.dragStartTimeslot = null;
465
+ this.resources$.next([
466
+ ...this.resources$.value,
467
+ {
468
+ description: 'New resource group',
469
+ events: [{
470
+ start: previewEvent.start,
471
+ end: previewEvent.end,
472
+ color: this.randomColor(),
473
+ description: 'New event'
474
+ }]
475
+ }
476
+ ]);
477
+ this.previewEvent$.next(null);
478
+ }
479
+ });
480
+ }
481
+ break;
482
+ case EDragOperation.moveEvent:
483
+ case EDragOperation.resizeEvent:
484
+ {
485
+ this.previewEvent$
486
+ .pipe(filter((ev) => !!ev))
487
+ .pipe(take(1))
488
+ .subscribe((previewEvent) => {
489
+ if (this.operation && this.operation.event && previewEvent) {
490
+ this.operation.event.start = previewEvent.start;
491
+ this.operation.event.end = previewEvent.end;
492
+ this.operation = null;
493
+ this.dragStartTimeslot = null;
494
+ this.resources$.next(this.resources$.value);
495
+ this.previewEvent$.next(null);
496
+ }
497
+ });
498
+ }
499
+ break;
500
+ }
501
+ }
502
+ }
503
+ ngOnDestroy() {
504
+ this.destroyed$.next(true);
505
+ }
506
+ }
507
+ BsSchedulerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: BsSchedulerComponent, deps: [{ token: i1.BsCalendarMonthService }, { token: i2.BsTimelineService }], target: i0.ɵɵFactoryTarget.Component });
508
+ BsSchedulerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.5", type: BsSchedulerComponent, selector: "bs-scheduler", inputs: { mode: "mode", weekOptions: "weekOptions", timelineOptions: "timelineOptions", maxInnerHeight: "maxInnerHeight", resources: "resources" }, outputs: { modeChange: "modeChange", weekOptionsChange: "weekOptionsChange", timelineOptionsChange: "timelineOptionsChange" }, host: { listeners: { "document:mousemove": "onMousemove($event)", "document:mouseup": "onMouseUp($event)" } }, viewQueries: [{ propertyName: "timeSlotElements", predicate: ["slot"], descendants: true }], ngImport: i0, template: "<div class=\"d-flex flex-column w-100 overflow-y-auto mb-0 week-schedule\" [style.max-height.px]=\"null\"\r\n *ngIf=\"(mode$ | async) === modes.week\">\r\n <div class=\"calendar-head\">\r\n <div class=\"w-100 d-flex flex-row\">\r\n <div class=\"d-flex calendar-left justify-content-between\">\r\n <button class=\"btn btn-default flex-start\" (click)=\"onPreviousWeekOrMonth()\">\r\n <bs-icon [icon]=\"'chevron-left'\" class=\"px-0\"></bs-icon>\r\n </button>\r\n <button class=\"btn btn-default flex-end\" (click)=\"onNextWeekOrMonth()\">\r\n <bs-icon [icon]=\"'chevron-right'\" class=\"px-0\"></bs-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex-grow-1 calendar-head-cell\" *ngFor=\"let day of (shownDays$ | async)\">\r\n <span class=\"d-block col-form-label text-center text-nowrap\">\r\n <span>{{ day | date: 'dd-MM' }}</span><span class=\"d-none d-lg-inline-block\">-{{ day | date: 'yyyy' }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"calendar-body\" [style.height.px]=\"maxInnerHeight\">\r\n <div class=\"position-relative\" *ngIf=\"(timeSlots$ | async) as row\">\r\n <ng-container *ngIf=\"(weekOptions$ | async) as weekOptions\">\r\n <!-- Timeslots -->\r\n <div *ngFor=\"let timeslots of row; let i = index\" class=\"d-flex flex-row p-0 timeslot\" [style.height.px]=\"weekOptions.unitHeight\">\r\n <div class=\"calendar-cell calendar-left align-top px-2 py-0\">{{ timeslots.slots[0].start | date: 'HH:mm:ss' }}</div>\r\n <div class=\"calendar-cell flex-grow-1\" *ngFor=\"let slot of timeslots.slots; let j = index\" #slot (mousedown)=\"onCreateEvent($event, slot)\" [attr.data-row]=\"i\" [attr.data-column]=\"j\"></div>\r\n </div>\r\n\r\n <!-- Events -->\r\n <ng-container *ngIf=\"(timeSlotDuration$ | async) as timeSlotDuration\">\r\n <ng-container *ngIf=\"(timelinedEventPartsForThisWeek$ | async) as partData\">\r\n <div *ngFor=\"let eventPart of partData.parts\" class=\"event p-0\"\r\n [style.top.px]=\"(eventPart.part | bsSecondsTodayOffset) / timeSlotDuration * weekOptions.unitHeight\"\r\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\r\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart.part | dayOfWeek) - 1) + '))'\">\r\n <div class=\"event-inner\" [class.hover]=\"(hoveredEvent$ | async) === eventPart.part.event\"\r\n [style.width]=\"'calc(100% / ' + partData.total + ')'\"\r\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\r\n [style.margin-left]=\"'calc(100% / ' + partData.total + ' * ' + eventPart.index + ')'\">\r\n\r\n <div class=\"event-resize top\"\r\n *ngIf=\"eventPart.part.start === eventPart.part.event?.start\"\r\n (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'top')\"></div>\r\n <div class=\"event-border\"></div>\r\n <div class=\"event-wrapper\" *ngIf=\"eventPart.part.event\"\r\n (mousedown)=\"onStartDragEvent(eventPart.part, $event)\"\r\n (mouseenter)=\"onHoverEvent(eventPart.part.event)\"\r\n (mouseleave)=\"onLeaveEvent(eventPart.part.event)\">\r\n <div class=\"event-bg\" [style.background-color]=\"eventPart.part.event.color\"></div>\r\n <div class=\"event-label\">{{ eventPart.part.event.description }}</div>\r\n </div>\r\n <div class=\"event-resize bottom\"\r\n *ngIf=\"eventPart.part.end === eventPart.part.event?.end\"\r\n (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'bottom')\"></div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"(previewEventPartsForThisWeek$ | async) as previewPartData\">\r\n <div *ngFor=\"let eventPart of previewPartData\" class=\"event preview p-0\"\r\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * weekOptions.unitHeight\"\r\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\r\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\r\n <div class=\"event-inner w-100\"\r\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"d-flex flex-column-100 overflow-y-auto mb-0 bg-white timeline\" *ngIf=\"(mode$ | async) === modes.timeline\">\r\n <div class=\"calendar-head d-flex\">\r\n <button class=\"btn flex-start\" (click)=\"onPreviousWeekOrMonth()\">\r\n <bs-icon [icon]=\"'chevron-left'\" class=\"px-0\"></bs-icon>\r\n </button>\r\n <div class=\"flex-grow-1 h3 py-2 mb-0 text-center\">{{ currentWeekOrMonth$ | async | date: 'MMMM yyyy' }}</div>\r\n <button class=\"btn flex-start\" (click)=\"onNextWeekOrMonth()\">\r\n <bs-icon [icon]=\"'chevron-right'\" class=\"px-0\"></bs-icon>\r\n </button>\r\n </div>\r\n \r\n <div class=\"calendar-body table-responsive overflow-x-auto\">\r\n <table class=\"table mb-0\">\r\n <ng-container *ngIf=\"(timeSlots$ | async) as timeSlots\">\r\n <tr>\r\n <td></td>\r\n <td *ngFor=\"let day of timeSlots\" [attr.colspan]=\"day.slots.length\" class=\"text-center px-2\">\r\n <span class=\"position-sticky day-label\">{{ day.stamp | date: 'd EE' }}</span>\r\n </td>\r\n </tr>\r\n <tr>\r\n <td></td>\r\n <ng-container *ngIf=\"(timelineOptions$ | async) as timelineOptions\">\r\n <ng-container *ngFor=\"let day of timeSlots\">\r\n <td *ngFor=\"let slot of day.slots\">\r\n <span class=\"d-block p-0 text-center\" [style.width.px]=\"timelineOptions.unitWidth\">\r\n {{ slot.start | date: 'HH:mm' }}\r\n </span>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n <bs-resource-group-presenter *ngFor=\"let group of (resources$ | async)\" [resourceGroup]=\"group\" [timeSlots]=\"timeSlots\"></bs-resource-group-presenter>\r\n </ng-container>\r\n </table>\r\n </div>\r\n</div>", styles: [":host{display:block;border:1px solid #333;border-top-right-radius:10px;border-top-left-radius:10px;overflow:hidden}.calendar-head{background:#F7F7F7;color:#007aff}.tabel .calendar-head{flex:0 0 auto}.tabel .calendar-body{display:block;flex:1 1 auto}.week-schedule .calendar-head>div{padding-right:18px}.week-schedule .calendar-body{overflow-y:scroll;overflow-x:hidden}.week-schedule .calendar-body .calendar-cell{border-right:1px solid #DEE2E6;border-bottom:1px solid #DEE2E6;cursor:default}.week-schedule .calendar-body .calendar-cell.hover{border-top-width:3px}.week-schedule .calendar-left{width:90px}.week-schedule .event{z-index:5;width:calc((100% - 90px) / 7);height:100px;overflow:hidden;position:absolute;-webkit-user-select:none;user-select:none;pointer-events:none}.week-schedule .event.preview{background:#666;opacity:.6}.week-schedule .event .event-border{background:black;top:0;left:0;bottom:3px;width:3px;position:absolute;z-index:10;opacity:.3}.week-schedule .event .event-inner{position:relative;inset:0 5px 5px 0;cursor:move;pointer-events:all;overflow:hidden}.week-schedule .event .event-inner .event-wrapper{width:calc(100% - 2px);margin:1px auto 1px 0;height:calc(100% - 3px)}.week-schedule .event .event-inner .event-wrapper .event-bg{opacity:.5;height:100%;transition:opacity .15s ease-in-out}.week-schedule .event .event-inner .event-wrapper .event-label{position:absolute;top:0;font-size:12px;font-weight:600;padding:4px}.week-schedule .event .event-inner .event-resize{position:absolute;cursor:ns-resize;height:4px;left:0;right:0;z-index:400}.week-schedule .event .event-inner .event-resize.top{top:0}.week-schedule .event .event-inner .event-resize.bottom{bottom:0}.week-schedule .event .event-inner .event-resize:hover{background:#DDD}.week-schedule .event .event-inner.hover .event-bg{opacity:.7!important}@media (max-width: 767px){.week-schedule.tabel .calendar-head .calendar-head-cell{text-orientation:sideways;writing-mode:vertical-rl}}.timeline.tabel{flex-flow:column}.timeline .calendar-body .tabel{background-color:#f7f7f7}.timeline .calendar-body .tabel tr:first-child td{background-color:#fff;border:1px solid #000}.timeline .calendar-body .tabel tr:first-child td:first-child{min-width:10rem}.timeline .calendar-body .tabel tr:first-child span.day-label{left:0;right:0}.timeline .calendar-body .tabel tr:nth-child(2) td{border-width:1px;border-color:inherit}.timeline .calendar-body .tabel>:not(:first-child){border-top:none!important}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.BsIconComponent, selector: "bs-icon", inputs: ["icon"] }, { kind: "component", type: i5.ResourceGroupPresenterComponent, selector: "bs-resource-group-presenter", inputs: ["level", "resourceGroup", "timeSlots", "isExpanded"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "pipe", type: i6.BsSecondsTimespanPipe, name: "bsSecondsTimespan" }, { kind: "pipe", type: i7.BsSecondsTodayOffsetPipe, name: "bsSecondsTodayOffset" }, { kind: "pipe", type: i8.DayOfWeekPipe, name: "dayOfWeek" }] });
509
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.5", ngImport: i0, type: BsSchedulerComponent, decorators: [{
510
+ type: Component,
511
+ args: [{ selector: 'bs-scheduler', template: "<div class=\"d-flex flex-column w-100 overflow-y-auto mb-0 week-schedule\" [style.max-height.px]=\"null\"\r\n *ngIf=\"(mode$ | async) === modes.week\">\r\n <div class=\"calendar-head\">\r\n <div class=\"w-100 d-flex flex-row\">\r\n <div class=\"d-flex calendar-left justify-content-between\">\r\n <button class=\"btn btn-default flex-start\" (click)=\"onPreviousWeekOrMonth()\">\r\n <bs-icon [icon]=\"'chevron-left'\" class=\"px-0\"></bs-icon>\r\n </button>\r\n <button class=\"btn btn-default flex-end\" (click)=\"onNextWeekOrMonth()\">\r\n <bs-icon [icon]=\"'chevron-right'\" class=\"px-0\"></bs-icon>\r\n </button>\r\n </div>\r\n <div class=\"flex-grow-1 calendar-head-cell\" *ngFor=\"let day of (shownDays$ | async)\">\r\n <span class=\"d-block col-form-label text-center text-nowrap\">\r\n <span>{{ day | date: 'dd-MM' }}</span><span class=\"d-none d-lg-inline-block\">-{{ day | date: 'yyyy' }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"calendar-body\" [style.height.px]=\"maxInnerHeight\">\r\n <div class=\"position-relative\" *ngIf=\"(timeSlots$ | async) as row\">\r\n <ng-container *ngIf=\"(weekOptions$ | async) as weekOptions\">\r\n <!-- Timeslots -->\r\n <div *ngFor=\"let timeslots of row; let i = index\" class=\"d-flex flex-row p-0 timeslot\" [style.height.px]=\"weekOptions.unitHeight\">\r\n <div class=\"calendar-cell calendar-left align-top px-2 py-0\">{{ timeslots.slots[0].start | date: 'HH:mm:ss' }}</div>\r\n <div class=\"calendar-cell flex-grow-1\" *ngFor=\"let slot of timeslots.slots; let j = index\" #slot (mousedown)=\"onCreateEvent($event, slot)\" [attr.data-row]=\"i\" [attr.data-column]=\"j\"></div>\r\n </div>\r\n\r\n <!-- Events -->\r\n <ng-container *ngIf=\"(timeSlotDuration$ | async) as timeSlotDuration\">\r\n <ng-container *ngIf=\"(timelinedEventPartsForThisWeek$ | async) as partData\">\r\n <div *ngFor=\"let eventPart of partData.parts\" class=\"event p-0\"\r\n [style.top.px]=\"(eventPart.part | bsSecondsTodayOffset) / timeSlotDuration * weekOptions.unitHeight\"\r\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\r\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart.part | dayOfWeek) - 1) + '))'\">\r\n <div class=\"event-inner\" [class.hover]=\"(hoveredEvent$ | async) === eventPart.part.event\"\r\n [style.width]=\"'calc(100% / ' + partData.total + ')'\"\r\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\r\n [style.margin-left]=\"'calc(100% / ' + partData.total + ' * ' + eventPart.index + ')'\">\r\n\r\n <div class=\"event-resize top\"\r\n *ngIf=\"eventPart.part.start === eventPart.part.event?.start\"\r\n (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'top')\"></div>\r\n <div class=\"event-border\"></div>\r\n <div class=\"event-wrapper\" *ngIf=\"eventPart.part.event\"\r\n (mousedown)=\"onStartDragEvent(eventPart.part, $event)\"\r\n (mouseenter)=\"onHoverEvent(eventPart.part.event)\"\r\n (mouseleave)=\"onLeaveEvent(eventPart.part.event)\">\r\n <div class=\"event-bg\" [style.background-color]=\"eventPart.part.event.color\"></div>\r\n <div class=\"event-label\">{{ eventPart.part.event.description }}</div>\r\n </div>\r\n <div class=\"event-resize bottom\"\r\n *ngIf=\"eventPart.part.end === eventPart.part.event?.end\"\r\n (mousedown)=\"onStartResizeEvent(eventPart.part.event, 'bottom')\"></div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"(previewEventPartsForThisWeek$ | async) as previewPartData\">\r\n <div *ngFor=\"let eventPart of previewPartData\" class=\"event preview p-0\"\r\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * weekOptions.unitHeight\"\r\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\"\r\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\r\n <div class=\"event-inner w-100\"\r\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * weekOptions.unitHeight\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"d-flex flex-column-100 overflow-y-auto mb-0 bg-white timeline\" *ngIf=\"(mode$ | async) === modes.timeline\">\r\n <div class=\"calendar-head d-flex\">\r\n <button class=\"btn flex-start\" (click)=\"onPreviousWeekOrMonth()\">\r\n <bs-icon [icon]=\"'chevron-left'\" class=\"px-0\"></bs-icon>\r\n </button>\r\n <div class=\"flex-grow-1 h3 py-2 mb-0 text-center\">{{ currentWeekOrMonth$ | async | date: 'MMMM yyyy' }}</div>\r\n <button class=\"btn flex-start\" (click)=\"onNextWeekOrMonth()\">\r\n <bs-icon [icon]=\"'chevron-right'\" class=\"px-0\"></bs-icon>\r\n </button>\r\n </div>\r\n \r\n <div class=\"calendar-body table-responsive overflow-x-auto\">\r\n <table class=\"table mb-0\">\r\n <ng-container *ngIf=\"(timeSlots$ | async) as timeSlots\">\r\n <tr>\r\n <td></td>\r\n <td *ngFor=\"let day of timeSlots\" [attr.colspan]=\"day.slots.length\" class=\"text-center px-2\">\r\n <span class=\"position-sticky day-label\">{{ day.stamp | date: 'd EE' }}</span>\r\n </td>\r\n </tr>\r\n <tr>\r\n <td></td>\r\n <ng-container *ngIf=\"(timelineOptions$ | async) as timelineOptions\">\r\n <ng-container *ngFor=\"let day of timeSlots\">\r\n <td *ngFor=\"let slot of day.slots\">\r\n <span class=\"d-block p-0 text-center\" [style.width.px]=\"timelineOptions.unitWidth\">\r\n {{ slot.start | date: 'HH:mm' }}\r\n </span>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n <bs-resource-group-presenter *ngFor=\"let group of (resources$ | async)\" [resourceGroup]=\"group\" [timeSlots]=\"timeSlots\"></bs-resource-group-presenter>\r\n </ng-container>\r\n </table>\r\n </div>\r\n</div>", styles: [":host{display:block;border:1px solid #333;border-top-right-radius:10px;border-top-left-radius:10px;overflow:hidden}.calendar-head{background:#F7F7F7;color:#007aff}.tabel .calendar-head{flex:0 0 auto}.tabel .calendar-body{display:block;flex:1 1 auto}.week-schedule .calendar-head>div{padding-right:18px}.week-schedule .calendar-body{overflow-y:scroll;overflow-x:hidden}.week-schedule .calendar-body .calendar-cell{border-right:1px solid #DEE2E6;border-bottom:1px solid #DEE2E6;cursor:default}.week-schedule .calendar-body .calendar-cell.hover{border-top-width:3px}.week-schedule .calendar-left{width:90px}.week-schedule .event{z-index:5;width:calc((100% - 90px) / 7);height:100px;overflow:hidden;position:absolute;-webkit-user-select:none;user-select:none;pointer-events:none}.week-schedule .event.preview{background:#666;opacity:.6}.week-schedule .event .event-border{background:black;top:0;left:0;bottom:3px;width:3px;position:absolute;z-index:10;opacity:.3}.week-schedule .event .event-inner{position:relative;inset:0 5px 5px 0;cursor:move;pointer-events:all;overflow:hidden}.week-schedule .event .event-inner .event-wrapper{width:calc(100% - 2px);margin:1px auto 1px 0;height:calc(100% - 3px)}.week-schedule .event .event-inner .event-wrapper .event-bg{opacity:.5;height:100%;transition:opacity .15s ease-in-out}.week-schedule .event .event-inner .event-wrapper .event-label{position:absolute;top:0;font-size:12px;font-weight:600;padding:4px}.week-schedule .event .event-inner .event-resize{position:absolute;cursor:ns-resize;height:4px;left:0;right:0;z-index:400}.week-schedule .event .event-inner .event-resize.top{top:0}.week-schedule .event .event-inner .event-resize.bottom{bottom:0}.week-schedule .event .event-inner .event-resize:hover{background:#DDD}.week-schedule .event .event-inner.hover .event-bg{opacity:.7!important}@media (max-width: 767px){.week-schedule.tabel .calendar-head .calendar-head-cell{text-orientation:sideways;writing-mode:vertical-rl}}.timeline.tabel{flex-flow:column}.timeline .calendar-body .tabel{background-color:#f7f7f7}.timeline .calendar-body .tabel tr:first-child td{background-color:#fff;border:1px solid #000}.timeline .calendar-body .tabel tr:first-child td:first-child{min-width:10rem}.timeline .calendar-body .tabel tr:first-child span.day-label{left:0;right:0}.timeline .calendar-body .tabel tr:nth-child(2) td{border-width:1px;border-color:inherit}.timeline .calendar-body .tabel>:not(:first-child){border-top:none!important}\n"] }]
512
+ }], ctorParameters: function () { return [{ type: i1.BsCalendarMonthService }, { type: i2.BsTimelineService }]; }, propDecorators: { timeSlotElements: [{
513
+ type: ViewChildren,
514
+ args: ['slot']
515
+ }], modeChange: [{
516
+ type: Output
517
+ }], mode: [{
518
+ type: Input
519
+ }], weekOptionsChange: [{
520
+ type: Output
521
+ }], weekOptions: [{
522
+ type: Input
523
+ }], timelineOptionsChange: [{
524
+ type: Output
525
+ }], timelineOptions: [{
526
+ type: Input
527
+ }], maxInnerHeight: [{
528
+ type: Input
529
+ }], resources: [{
530
+ type: Input
531
+ }], onMousemove: [{
532
+ type: HostListener,
533
+ args: ['document:mousemove', ['$event']]
534
+ }], onMouseUp: [{
535
+ type: HostListener,
536
+ args: ['document:mouseup', ['$event']]
537
+ }] } });
538
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvc2NoZWR1bGVyL3NyYy9jb21wb25lbnRzL3NjaGVkdWxlci9zY2hlZHVsZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9taW50cGxheWVyLW5nLWJvb3RzdHJhcC9zY2hlZHVsZXIvc3JjL2NvbXBvbmVudHMvc2NoZWR1bGVyL3NjaGVkdWxlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JJLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU81RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7Ozs7Ozs7OztBQVk3RSxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CLFlBQW9CLG9CQUE0QyxFQUFVLGVBQWtDO1FBQXhGLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBd0I7UUFBVSxvQkFBZSxHQUFmLGVBQWUsQ0FBbUI7UUE2SjVHLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBK0IsRUFBRSxDQUFDLENBQUM7UUFLbkUsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FB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QztnQ0FDNUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0NBQ3RCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7Z0NBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0NBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUMvQjt3QkFDSCxDQUFDLENBQUMsQ0FBQztxQkFDTjtvQkFBQyxNQUFNO2FBQ1Q7U0FDRjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQzs7aUhBamhCVSxvQkFBb0I7cUdBQXBCLG9CQUFvQixtaEJDdkJqQyxxaVBBNEdNOzJGRHJGTyxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0UsY0FBYzs2SUF3TEYsZ0JBQWdCO3NCQUFyQyxZQUFZO3VCQUFDLE1BQU07Z0JBd0JILFVBQVU7c0JBQTFCLE1BQU07Z0JBSWEsSUFBSTtzQkFBdkIsS0FBSztnQkFlVyxpQkFBaUI7c0JBQWpDLE1BQU07Z0JBSWEsV0FBVztzQkFBOUIsS0FBSztnQkFLVyxxQkFBcUI7c0JBQXJDLE1BQU07Z0JBSWEsZUFBZTtzQkFBbEMsS0FBSztnQkFLVSxjQUFjO3NCQUE3QixLQUFLO2dCQU1jLFNBQVM7c0JBQTVCLEtBQUs7Z0JBZ0pOLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkEyRjlDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmaWx0ZXIsIG1hcCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEJzQ2FsZW5kYXJNb250aFNlcnZpY2UgfSBmcm9tICdAbWludHBsYXllci9uZy1ib290c3RyYXAvY2FsZW5kYXItbW9udGgnO1xyXG5pbXBvcnQgeyBFU2NoZWR1bGVyTW9kZSB9IGZyb20gJy4uLy4uL2VudW1zL3NjaGVkdWxlci1tb2RlJztcclxuaW1wb3J0IHsgRURyYWdPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9lbnVtcy9kcmFnLW9wZXJhdGlvbic7XHJcbmltcG9ydCB7IERyYWdPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RyYWctb3BlcmF0aW9uJztcclxuaW1wb3J0IHsgUHJldmlld0V2ZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wcmV2aWV3LWV2ZW50JztcclxuaW1wb3J0IHsgU2NoZWR1bGVyRXZlbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3NjaGVkdWxlci1ldmVudCc7XHJcbmltcG9ydCB7IFNjaGVkdWxlckV2ZW50UGFydCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2NoZWR1bGVyLWV2ZW50LXBhcnQnO1xyXG5pbXBvcnQgeyBTY2hlZHVsZXJFdmVudFdpdGhQYXJ0cyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2NoZWR1bGVyLWV2ZW50LXdpdGgtcGFydHMnO1xyXG5pbXBvcnQgeyBUaW1lU2xvdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdGltZS1zbG90JztcclxuaW1wb3J0IHsgQnNUaW1lbGluZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aW1lbGluZS90aW1lbGluZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVzb3VyY2VHcm91cCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVzb3VyY2UtZ3JvdXAnO1xyXG5pbXBvcnQgeyBSZXNvdXJjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVzb3VyY2UnO1xyXG5pbXBvcnQgeyBTY2hlZHVsZXJTdGFtcFdpdGhTbG90cyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2NoZWR1bGVyLXN0YW1wLXdpdGgtc2xvdHMnO1xyXG5pbXBvcnQgeyBXZWVrT3B0aW9ucyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvd2Vlay1vcHRpb25zJztcclxuaW1wb3J0IHsgVGltZWxpbmVPcHRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90aW1lbGluZS1vcHRpb25zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYnMtc2NoZWR1bGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2NoZWR1bGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zY2hlZHVsZXIuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEJzU2NoZWR1bGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNhbGVuZGFyTW9udGhTZXJ2aWNlOiBCc0NhbGVuZGFyTW9udGhTZXJ2aWNlLCBwcml2YXRlIHRpbWVsaW5lU2VydmljZTogQnNUaW1lbGluZVNlcnZpY2UpIHtcclxuICAgIGNvbnN0IG1vbmRheSA9IHRoaXMuY2FsZW5kYXJNb250aFNlcnZpY2UuZ2V0TW9uZGF5QmVmb3JlKG5ldyBEYXRlKCkpO1xyXG4gICAgdGhpcy5jdXJyZW50V2Vla09yTW9udGgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRlPihtb25kYXkpO1xyXG5cclxuICAgIHRoaXMuc2hvd25EYXlzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuY3VycmVudFdlZWtPck1vbnRoJCwgdGhpcy5tb2RlJF0pXHJcbiAgICAgIC5waXBlKG1hcCgoW2N1cnJlbnREYXksIG1vZGVdKSA9PiB7XHJcbiAgICAgICAgY3VycmVudERheS5zZXRIb3VycygwKTtcclxuICAgICAgICBjdXJyZW50RGF5LnNldE1pbnV0ZXMoMCk7XHJcbiAgICAgICAgY3VycmVudERheS5zZXRTZWNvbmRzKDApO1xyXG4gICAgICAgIGN1cnJlbnREYXkuc2V0TWlsbGlzZWNvbmRzKDApO1xyXG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xyXG4gICAgICAgICAgY2FzZSBFU2NoZWR1bGVyTW9kZS53ZWVrOiB7XHJcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKEFycmF5KDcpLmtleXMoKSkubWFwKCh4KSA9PiB0aGlzLmFkZERheXMoY3VycmVudERheSwgeCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSBFU2NoZWR1bGVyTW9kZS50aW1lbGluZToge1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKGN1cnJlbnREYXkuZ2V0RnVsbFllYXIoKSwgY3VycmVudERheS5nZXRNb250aCgpLCAxKTtcclxuICAgICAgICAgICAgY29uc3QgZGF5c09mTW9udGggPSBuZXcgRGF0ZShjdXJyZW50RGF5LmdldEZ1bGxZZWFyKCksIGN1cnJlbnREYXkuZ2V0TW9udGgoKSArIDEsIDApLmdldERhdGUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oQXJyYXkoZGF5c09mTW9udGgpLmtleXMoKSkubWFwKCh4KSA9PiB0aGlzLmFkZERheXMoZmlyc3REYXksIHgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZGF5c09mV2Vla1dpdGhUaW1lc3RhbXBzJCA9IHRoaXMuc2hvd25EYXlzJFxyXG4gICAgICAucGlwZShtYXAoKHNob3duRGF5cykgPT4gKHsgc3RhcnQ6IHNob3duRGF5c1swXS5nZXRUaW1lKCksIGVuZDogc2hvd25EYXlzW3Nob3duRGF5cy5sZW5ndGggLSAxXS5nZXRUaW1lKCkgKyAyNCAqIDYwICogNjAgKiAxMDAwIH0pKSk7XHJcbiAgICBcclxuICAgIHRoaXMuZXZlbnRzJCA9IHRoaXMucmVzb3VyY2VzJFxyXG4gICAgICAucGlwZShtYXAoKHJlc291cmNlc09yR3JvdXBzKSA9PiByZXNvdXJjZXNPckdyb3Vwcy5tYXAocmVzT3JHcm91cCA9PiB0aGlzLmdldFJlc291cmNlc0Zvckdyb3VwKHJlc09yR3JvdXApKSkpXHJcbiAgICAgIC5waXBlKG1hcChqYWdnZWRSZXNvdXJjZXMgPT4gamFnZ2VkUmVzb3VyY2VzLnJlZHVjZSgoZmxhdCwgdG9GbGF0dGVuKSA9PiBmbGF0LmNvbmNhdCh0b0ZsYXR0ZW4pLCBbXSkpKVxyXG4gICAgICAucGlwZShtYXAocmVzb3VyY2VzID0+IHJlc291cmNlcy5tYXAocmVzID0+IHJlcy5ldmVudHMpKSlcclxuICAgICAgLnBpcGUobWFwKGphZ2dlZEV2ZW50cyA9PiBqYWdnZWRFdmVudHMucmVkdWNlKChmbGF0LCB0b0ZsYXR0ZW4pID0+IGZsYXQuY29uY2F0KHRvRmxhdHRlbiksIFtdKSkpO1xyXG5cclxuICAgICAgLy8gZ3JvdXBzLnJlZHVjZSgoZmxhdCwgdG9GbGF0dGVuKSA9PiBmbGF0LmNvbmNhdCh0b0ZsYXR0ZW4uY2hpbGRyZW4pLCBbXSlcclxuICAgIHRoaXMuZXZlbnRQYXJ0cyQgPSB0aGlzLmV2ZW50cyQucGlwZShcclxuICAgICAgbWFwKChldmVudHMpID0+ICBldmVudHMubWFwKChldikgPT4gdGhpcy50aW1lbGluZVNlcnZpY2Uuc3BsaXRJblBhcnRzKGV2KSkpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZXZlbnRQYXJ0c0ZvclRoaXNXZWVrJCA9IGNvbWJpbmVMYXRlc3QoW1xyXG4gICAgICB0aGlzLmRheXNPZldlZWtXaXRoVGltZXN0YW1wcyQsXHJcbiAgICAgIHRoaXMuZXZlbnRQYXJ0cyRcclxuICAgICAgICAucGlwZShtYXAoZXZlbnRQYXJ0cyA9PiBldmVudFBhcnRzLm1hcChldnAgPT4gZXZwLnBhcnRzKSkpXHJcbiAgICAgICAgLnBpcGUobWFwKGphZ2dlZFBhcnRzID0+ICBqYWdnZWRQYXJ0cy5yZWR1Y2UoKGZsYXQsIHRvRmxhdHRlbikgPT4gZmxhdC5jb25jYXQodG9GbGF0dGVuKSwgW10pKSlcclxuICAgICAgXSlcclxuICAgICAgLnBpcGUobWFwKChbc3RhcnRBbmRFbmQsIGV2ZW50UGFydHNdKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGV2ZW50UGFydHMuZmlsdGVyKGV2ZW50UGFydCA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gISgoZXZlbnRQYXJ0LmVuZC5nZXRUaW1lKCkgPD0gc3RhcnRBbmRFbmQuc3RhcnQpIHx8IChldmVudFBhcnQuc3RhcnQuZ2V0VGltZSgpID49IHN0YXJ0QW5kRW5kLmVuZCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KSk7XHJcblxyXG4gICAgdGhpcy5wcmV2aWV3RXZlbnRQYXJ0cyQgPSB0aGlzLnByZXZpZXdFdmVudCQucGlwZShcclxuICAgICAgbWFwKChldmVudCkgPT4ge1xyXG4gICAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudGltZWxpbmVTZXJ2aWNlLnNwbGl0SW5QYXJ0cyhldmVudClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMucHJldmlld0V2ZW50UGFydHNGb3JUaGlzV2VlayQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRheXNPZldlZWtXaXRoVGltZXN0YW1wcyQsIHRoaXMucHJldmlld0V2ZW50UGFydHMkXSlcclxuICAgICAgLnBpcGUobWFwKChbc3RhcnRBbmRFbmQsIHByZXZpZXdFdmVudFBhcnRzXSkgPT4ge1xyXG4gICAgICAgIGlmIChwcmV2aWV3RXZlbnRQYXJ0cykge1xyXG4gICAgICAgICAgcmV0dXJuIHByZXZpZXdFdmVudFBhcnRzLnBhcnRzLmZpbHRlcihldmVudFBhcnQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gISgoZXZlbnRQYXJ0LmVuZC5nZXRUaW1lKCkgPD0gc3RhcnRBbmRFbmQuc3RhcnQpIHx8IChldmVudFBhcnQuc3RhcnQuZ2V0VGltZSgpID49IHN0YXJ0QW5kRW5kLmVuZCkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICB0aGlzLnRpbWVsaW5lZEV2ZW50UGFydHNGb3JUaGlzV2VlayQgPSB0aGlzLmV2ZW50UGFydHNGb3JUaGlzV2VlayRcclxuICAgICAgLnBpcGUobWFwKGV2ZW50UGFydHMgPT4ge1xyXG4gICAgICAgIC8vIFdlJ2xsIG9ubHkgdXNlIHRoZSBldmVudHMgZm9yIHRoaXMgd2Vla1xyXG4gICAgICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50UGFydHMubWFwKGVwID0+IGVwLmV2ZW50KVxyXG4gICAgICAgICAgLmZpbHRlcigoZSwgaSwgbGlzdCkgPT4gbGlzdC5pbmRleE9mKGUpID09PSBpKVxyXG4gICAgICAgICAgLmZpbHRlcigoZSkgPT4gISFlKVxyXG4gICAgICAgICAgLm1hcCgoZSkgPT4gPFNjaGVkdWxlckV2ZW50PmUpO1xyXG4gICAgICAgIGNvbnN0IHRpbWVsaW5lID0gdGhpcy50aW1lbGluZVNlcnZpY2UuZ2V0VGltZWxpbmUoZXZlbnRzKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGltZWxpbmUubWFwKHRyYWNrID0+IHRyYWNrLmV2ZW50cy5tYXAoZXYgPT4gKHsgZXZlbnQ6IGV2LCBpbmRleDogdHJhY2suaW5kZXggfSkpKVxyXG4gICAgICAgICAgLnJlZHVjZSgoZmxhdCwgdG9GbGF0dGVuKSA9PiBmbGF0LmNvbmNhdCh0b0ZsYXR0ZW4pLCBbXSlcclxuICAgICAgICAgIC5tYXAoKGV2aSkgPT4gZXZlbnRQYXJ0cy5maWx0ZXIocCA9PiBwLmV2ZW50ID09PSBldmkuZXZlbnQpLm1hcChwID0+ICh7IHBhcnQ6IHAsIGluZGV4OiBldmkuaW5kZXggfSkpKVxyXG4gICAgICAgICAgLnJlZHVjZSgoZmxhdCwgdG9GbGF0dGVuKSA9PiBmbGF0LmNvbmNhdCh0b0ZsYXR0ZW4pLCBbXSk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICB0b3RhbDogdGltZWxpbmUubGVuZ3RoLFxyXG4gICAgICAgICAgcGFydHM6IHJlc3VsdFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLm1vZGUkLCB0aGlzLnNob3duRGF5cyQsIHRoaXMudGltZVNsb3REdXJhdGlvbiRdKVxyXG4gICAgICAucGlwZShmaWx0ZXIoKFttb2RlLCBzaG93bkRheXMsIGR1cmF0aW9uXSkgPT4gbW9kZSAhPT0gbnVsbCkpXHJcbiAgICAgIC5waXBlKG1hcCgoW21vZGUsIHNob3duRGF5cywgZHVyYXRpb25dKSA9PiB7XHJcbiAgICAgICAgc3dpdGNoIChtb2RlKSB7XHJcbiAgICAgICAgICBjYXNlIEVTY2hlZHVsZXJNb2RlLndlZWs6IHtcclxuICAgICAgICAgICAgY29uc3QgdGltZVNsb3RzUGVyRGF5ID0gTWF0aC5mbG9vcigoNjAgKiA2MCAqIDI0KSAvIGR1cmF0aW9uKTtcclxuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oQXJyYXkodGltZVNsb3RzUGVyRGF5KS5rZXlzKCkpLm1hcCgoaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCB0aW1lc2xvdEZvck1vbmRheSA9IHRoaXMuY3JlYXRlVGltZXNsb3Qoc2hvd25EYXlzWzBdLCBpbmRleCwgZHVyYXRpb24pO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gPFNjaGVkdWxlclN0YW1wV2l0aFNsb3RzPntcclxuICAgICAgICAgICAgICAgIHNsb3RzOiBzaG93bkRheXMubWFwKChkYXkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShkYXkpO1xyXG4gICAgICAgICAgICAgICAgICBzdGFydC5zZXRIb3Vycyh0aW1lc2xvdEZvck1vbmRheS5zdGFydC5nZXRIb3VycygpKTtcclxuICAgICAgICAgICAgICAgICAgc3RhcnQuc2V0TWludXRlcyh0aW1lc2xvdEZvck1vbmRheS5zdGFydC5nZXRNaW51dGVzKCkpO1xyXG4gICAgICAgICAgICAgICAgICBzdGFydC5zZXRTZWNvbmRzKHRpbWVzbG90Rm9yTW9uZGF5LnN0YXJ0LmdldFNlY29uZHMoKSk7XHJcbiAgICAgICAgICAgICAgICAgIHN0YXJ0LnNldE1pbGxpc2Vjb25kcyh0aW1lc2xvdEZvck1vbmRheS5zdGFydC5nZXRNaWxsaXNlY29uZHMoKSk7XHJcbiAgICAgIFxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShkYXkpO1xyXG4gICAgICAgICAgICAgICAgICBlbmQuc2V0SG91cnModGltZXNsb3RGb3JNb25kYXkuZW5kLmdldEhvdXJzKCkpO1xyXG4gICAgICAgICAgICAgICAgICBlbmQuc2V0TWludXRlcyh0aW1lc2xvdEZvck1vbmRheS5lbmQuZ2V0TWludXRlcygpKTtcclxuICAgICAgICAgICAgICAgICAgZW5kLnNldFNlY29uZHModGltZXNsb3RGb3JNb25kYXkuZW5kLmdldFNlY29uZHMoKSk7XHJcbiAgICAgICAgICAgICAgICAgIGVuZC5zZXRNaWxsaXNlY29uZHModGltZXNsb3RGb3JNb25kYXkuZW5kLmdldE1pbGxpc2Vjb25kcygpKTtcclxuICAgICAgICAgICAgICAgICAgZW5kLnNldERhdGUoZW5kLmdldERhdGUoKSArIHRpbWVzbG90Rm9yTW9uZGF5LmVuZC5nZXREYXRlKCkgLSB0aW1lc2xvdEZvck1vbmRheS5zdGFydC5nZXREYXRlKCkpO1xyXG4gICAgICBcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIDxUaW1lU2xvdD57IHN0YXJ0LCBlbmQgfTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgc3RhbXA6IHRpbWVzbG90Rm9yTW9uZGF5LnN0YXJ0XHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlIEVTY2hlZHVsZXJNb2RlLnRpbWVsaW5lOiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsVGltZXNsb3RzID0gKDI0ICogNjAgKiA2MCkgLyBkdXJhdGlvbjtcclxuICAgICAgICAgICAgcmV0dXJuIHNob3duRGF5cy5tYXAoKGRheSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiA8U2NoZWR1bGVyU3RhbXBXaXRoU2xvdHM+e1xyXG4gICAgICAgICAgICAgICAgc2xvdHM6IEFycmF5LmZyb20oQXJyYXkodG90YWxUaW1lc2xvdHMpLmtleXMoKSlcclxuICAgICAgICAgICAgICAgICAgLm1hcCgoaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUaW1lc2xvdChkYXksIGluZGV4LCBkdXJhdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgc3RhbXA6IGRheVxyXG4gICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgICB0aHJvdyAnVW5rbm93biB2YWx1ZSBmb3IgTW9kZTogJyArIG1vZGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSlcclxuICAgICAgLnN1YnNjcmliZSgodGltZXNsb3RzKSA9PiB7XHJcbiAgICAgICAgLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHdlJ3JlIG5vdCB1c2luZyBhbiBvYnNlcnZhYmxlIGhlcmUsIGJ1dCBwZXJzaXN0IHRoZSB0aW1lc2xvdHMgaW4gYSBCZWhhdmlvclN1YmplY3QuXHJcbiAgICAgICAgdGhpcy50aW1lU2xvdHMkLm5leHQodGltZXNsb3RzKTtcclxuICAgICAgfSk7XHJcbiAgICBcclxuICAgICAgdGhpcy53ZWVrT3B0aW9ucyRcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHdlZWtPcHRpb25zKSA9PiB7XHJcbiAgICAgICAgdGhpcy53ZWVrT3B0aW9uc0NoYW5nZS5lbWl0KHdlZWtPcHRpb25zKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnRpbWVsaW5lT3B0aW9ucyRcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHRpbWVsaW5lT3B0aW9ucykgPT4ge1xyXG4gICAgICAgIHRoaXMudGltZWxpbmVPcHRpb25zQ2hhbmdlLmVtaXQodGltZWxpbmVPcHRpb25zKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8gY29tYmluZUxhdGVzdChbdGhpcy5tb2RlJCwgdGhpcy5zY2FsZSRdKVxyXG4gICAgLy8gICAucGlwZShmaWx0ZXIoKFttb2RlLCBzY2FsZV0pID0+IG1vZGUgPT09IEVTY2hlZHVsZXJNb2RlLnRpbWVsaW5lKSlcclxuXHJcbiAgfVxyXG5cclxuICByZXNvdXJjZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDwoUmVzb3VyY2UgfCBSZXNvdXJjZUdyb3VwKVtdPihbXSk7XHJcbiAgZXZlbnRzJDogT2JzZXJ2YWJsZTxTY2hlZHVsZXJFdmVudFtdPjtcclxuICBldmVudFBhcnRzJDogT2JzZXJ2YWJsZTxTY2hlZHVsZXJFdmVudFdpdGhQYXJ0c1tdPjtcclxuICBldmVudFBhcnRzRm9yVGhpc1dlZWskOiBPYnNlcnZhYmxlPFNjaGVkdWxlckV2ZW50UGFydFtdPjtcclxuICB0aW1lbGluZWRFdmVudFBhcnRzRm9yVGhpc1dlZWskOiBPYnNlcnZhYmxlPHsgdG90YWw6IG51bWJlciwgcGFydHM6IHsgcGFydDogU2NoZWR1bGVyRXZlbnRQYXJ0LCBpbmRleDogbnVtYmVyfVtdIH0+O1xyXG4gIHdlZWtPcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8V2Vla09wdGlvbnM+KHsgdW5pdEhlaWdodDogMzAgfSk7XHJcbiAgdGltZWxpbmVPcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGltZWxpbmVPcHRpb25zPih7IHVuaXRXaWR0aDogNTAgfSk7XHJcbiAgXHJcbiAgcHJldmlld0V2ZW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJldmlld0V2ZW50IHwgbnVsbD4obnVsbCk7XHJcbiAgcHJldmlld0V2ZW50UGFydHMkOiBPYnNlcnZhYmxlPFNjaGVkdWxlckV2ZW50V2l0aFBhcnRzIHwgbnVsbD47XHJcbiAgcHJldmlld0V2ZW50UGFydHNGb3JUaGlzV2VlayQ6IE9ic2VydmFibGU8U2NoZWR1bGVyRXZlbnRQYXJ0W10+O1xyXG4gIFxyXG4gIGN1cnJlbnRXZWVrT3JNb250aCQ6IEJlaGF2aW9yU3ViamVjdDxEYXRlPjtcclxuICBzaG93bkRheXMkOiBPYnNlcnZhYmxlPERhdGVbXT47XHJcbiAgZGF5c09mV2Vla1dpdGhUaW1lc3RhbXBzJDogT2JzZXJ2YWJsZTx7c3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXJ9PjtcclxuICB0aW1lU2xvdER1cmF0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigxODAwKTtcclxuICB0aW1lU2xvdHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTY2hlZHVsZXJTdGFtcFdpdGhTbG90c1tdPihbXSk7XHJcbiAgbW91c2VTdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBob3ZlcmVkVGltZVNsb3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUaW1lU2xvdCB8IG51bGw+KG51bGwpO1xyXG4gIGhvdmVyZWRFdmVudCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNjaGVkdWxlckV2ZW50IHwgbnVsbD4obnVsbCk7XHJcbiAgZGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ3Nsb3QnKSB0aW1lU2xvdEVsZW1lbnRzITogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PjtcclxuXHJcbiAgY3JlYXRlVGltZXNsb3QoZGF0ZTogRGF0ZSwgaW5kZXg6IG51bWJlciwgZHVyYXRpb246IG51bWJlcikge1xyXG4gICAgY29uc3QgdGltZVNsb3RTdGFydCA9IG5ldyBEYXRlKGRhdGUpO1xyXG4gICAgdGltZVNsb3RTdGFydC5zZXRUaW1lKCt0aW1lU2xvdFN0YXJ0LmdldFRpbWUoKSArIGluZGV4ICogZHVyYXRpb24gKiAxMDAwKTtcclxuICAgIGNvbnN0IHRpbWVTbG90RW5kID0gbmV3IERhdGUodGltZVNsb3RTdGFydCk7XHJcbiAgICB0aW1lU2xvdEVuZC5zZXRUaW1lKCt0aW1lU2xvdEVuZC5nZXRUaW1lKCkgKyBkdXJhdGlvbiAqIDEwMDApO1xyXG5cclxuICAgIHJldHVybiA8VGltZVNsb3Q+eyBzdGFydDogdGltZVNsb3RTdGFydCwgZW5kOiB0aW1lU2xvdEVuZCB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVzb3VyY2VzRm9yR3JvdXAocmVzb3VyY2VPckdyb3VwOiBSZXNvdXJjZSB8IFJlc291cmNlR3JvdXApIDogUmVzb3VyY2VbXSB7XHJcbiAgICBpZiAoJ2NoaWxkcmVuJyBpbiByZXNvdXJjZU9yR3JvdXApIHtcclxuICAgICAgcmV0dXJuIHJlc291cmNlT3JHcm91cC5jaGlsZHJlblxyXG4gICAgICAgIC5tYXAoKGNoaWxkKSA9PiB0aGlzLmdldFJlc291cmNlc0Zvckdyb3VwKGNoaWxkKSlcclxuICAgICAgICAucmVkdWNlKChmbGF0LCB0b0ZsYXR0ZW4pID0+IGZsYXQuY29uY2F0KHRvRmxhdHRlbiksIFtdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBbcmVzb3VyY2VPckdyb3VwXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBNb2RlXHJcbiAgbW9kZXMgPSBFU2NoZWR1bGVyTW9kZTtcclxuICBtb2RlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RVNjaGVkdWxlck1vZGU+KEVTY2hlZHVsZXJNb2RlLndlZWspO1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgbW9kZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RVNjaGVkdWxlck1vZGU+KCk7XHJcbiAgcHVibGljIGdldCBtb2RlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZSQudmFsdWU7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgbW9kZSh2YWx1ZTogRVNjaGVkdWxlck1vZGUpIHtcclxuICAgIHRoaXMubW9kZSQubmV4dCh2YWx1ZSk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIC8vIC8vI3JlZ2lvbiBTY2FsZVxyXG4gIC8vIHNjYWxlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2NoZWR1bGVyU2NhbGU+KGF2YWlsYWJsZVNjYWxlc1s0XSk7XHJcbiAgLy8gQE91dHB1dCgpIHB1YmxpYyBzY2FsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2NoZWR1bGVyU2NhbGU+KCk7XHJcbiAgLy8gcHVibGljIGdldCBzY2FsZSgpIHtcclxuICAvLyAgIHJldHVybiB0aGlzLnNjYWxlJC52YWx1ZTtcclxuICAvLyB9XHJcbiAgLy8gQElucHV0KCkgcHVibGljIHNldCBzY2FsZSh2YWx1ZTogU2NoZWR1bGVyU2NhbGUpIHtcclxuICAvLyAgIHRoaXMuc2NhbGUkLm5leHQodmFsdWUpO1xyXG4gIC8vIH1cclxuICAvLyAvLyNlbmRyZWdpb25cclxuICAvLyNyZWdpb24gV2Vla09wdGlvbnNcclxuICBAT3V0cHV0KCkgcHVibGljIHdlZWtPcHRpb25zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxXZWVrT3B0aW9ucz4oKTtcclxuICBwdWJsaWMgZ2V0IHdlZWtPcHRpb25zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMud2Vla09wdGlvbnMkLnZhbHVlO1xyXG4gIH1cclxuICBASW5wdXQoKSBwdWJsaWMgc2V0IHdlZWtPcHRpb25zKHZhbHVlOiBXZWVrT3B0aW9ucykge1xyXG4gICAgdGhpcy53ZWVrT3B0aW9ucyQubmV4dCh2YWx1ZSk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIC8vI3JlZ2lvbiBUaW1lbGluZU9wdGlvbnNcclxuICBAT3V0cHV0KCkgcHVibGljIHRpbWVsaW5lT3B0aW9uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGltZWxpbmVPcHRpb25zPigpO1xyXG4gIHB1YmxpYyBnZXQgdGltZWxpbmVPcHRpb25zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGltZWxpbmVPcHRpb25zJC52YWx1ZTtcclxuICB9XHJcbiAgQElucHV0KCkgcHVibGljIHNldCB0aW1lbGluZU9wdGlvbnModmFsdWU6IFRpbWVsaW5lT3B0aW9ucykge1xyXG4gICAgdGhpcy50aW1lbGluZU9wdGlvbnMkLm5leHQodmFsdWUpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuICAvLyNyZWdpb24gbWF4SW5uZXJIZWlnaHRcclxuICBASW5wdXQoKSBwdWJsaWMgbWF4SW5uZXJIZWlnaHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIC8vI3JlZ2lvbiBSZXNvdXJjZXNcclxuICBwdWJsaWMgZ2V0IHJlc291cmNlcygpIHtcclxuICAgIHJldHVybiB0aGlzLnJlc291cmNlcyQudmFsdWU7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgcmVzb3VyY2VzKHZhbHVlOiAoUmVzb3VyY2UgfCBSZXNvdXJjZUdyb3VwKVtdKSB7XHJcbiAgICB0aGlzLnJlc291cmNlcyQubmV4dCh2YWx1ZSk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwcml2YXRlIGFkZERheXMoZGF0ZTogRGF0ZSwgZGF5czogbnVtYmVyKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRGF0ZShkYXRlKTtcclxuICAgIHJlc3VsdC5zZXREYXRlKHJlc3VsdC5nZXREYXRlKCkgKyBkYXlzKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBvblByZXZpb3VzV2Vla09yTW9udGgoKSB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlV2Vla09yTW9udGgoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgb25OZXh0V2Vla09yTW9udGgoKSB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlV2Vla09yTW9udGgodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uQ2hhbmdlV2Vla09yTW9udGgobmV4dDogYm9vbGVhbikge1xyXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5jdXJyZW50V2Vla09yTW9udGgkLCB0aGlzLm1vZGUkXSlcclxuICAgICAgLnBpcGUobWFwKChbY3VycmVudFdlZWtPck1vbnRoLCBtb2RlXSkgPT4ge1xyXG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xyXG4gICAgICAgICAgY2FzZSBFU2NoZWR1bGVyTW9kZS53ZWVrOiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZERheXMoY3VycmVudFdlZWtPck1vbnRoLCAobmV4dCA/IDcgOiAtNykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSBFU2NoZWR1bGVyTW9kZS50aW1lbGluZToge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoY3VycmVudFdlZWtPck1vbnRoLmdldEZ1bGxZZWFyKCksIGN1cnJlbnRXZWVrT3JNb250aC5nZXRNb250aCgpICsgKG5leHQgPyAxIDogLTEpLCAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pLCB0YWtlKDEpKVxyXG4gICAgICAuc3Vic2NyaWJlKCh3KSA9PiB0aGlzLmN1cnJlbnRXZWVrT3JNb250aCQubmV4dCh3KSk7XHJcbiAgfVxyXG5cclxuICBvbkhvdmVyRXZlbnQoZXY6IFNjaGVkdWxlckV2ZW50IHwgbnVsbCkge1xyXG4gICAgdGhpcy5ob3ZlcmVkRXZlbnQkLm5leHQoZXYpO1xyXG4gIH1cclxuXHJcbiAgb25MZWF2ZUV2ZW50KGV2OiBTY2hlZHVsZXJFdmVudCB8IG51bGwpIHtcclxuICAgIHRoaXMuaG92ZXJlZEV2ZW50JC5uZXh0KG51bGwpO1xyXG4gIH1cclxuXHJcbiAgb3BlcmF0aW9uOiBEcmFnT3BlcmF0aW9uIHwgbnVsbCA9IG51bGw7XHJcbiAgZHJhZ1N0YXJ0VGltZXNsb3Q6IFRpbWVTbG90IHwgbnVsbCA9IG51bGw7XHJcbiAgb25DcmVhdGVFdmVudChldjogTW91c2VFdmVudCwgc2xvdDogVGltZVNsb3QpIHtcclxuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLm1vdXNlU3RhdGUkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRyYWdTdGFydFRpbWVzbG90ID0gc2xvdDtcclxuICAgIHRoaXMub3BlcmF0aW9uID0ge1xyXG4gICAgICBvcGVyYXRpb246IEVEcmFnT3BlcmF0aW9uLmNyZWF0ZUV2ZW50LFxyXG4gICAgICBldmVudDoge1xyXG4gICAgICAgIHN0YXJ0OiBzbG90LnN0YXJ0LFxyXG4gICAgICAgIGVuZDogc2xvdC5lbmQsXHJcbiAgICAgICAgY29sb3I6ICcjRjAwJyxcclxuICAgICAgICBkZXNjcmlwdGlvbjogJ1Rlc3QgZXZlbnQnLFxyXG4gICAgICB9LFxyXG4gICAgICBtZXRhOiBudWxsLFxyXG4gICAgfTtcclxuICAgIHRoaXMucHJldmlld0V2ZW50JC5uZXh0KHsgc3RhcnQ6IHNsb3Quc3RhcnQsIGVuZDogc2xvdC5lbmQgfSk7XHJcbiAgfVxyXG5cclxuICByYW5kb21Db2xvcigpIHtcclxuICAgIGNvbnN0IGJyaWdodG5lc3MgPSAxMjg7XHJcbiAgICByZXR1cm4gJyMnICsgdGhpcy5yYW5kb21DaGFubmVsKGJyaWdodG5lc3MpICsgdGhpcy5yYW5kb21DaGFubmVsKGJyaWdodG5lc3MpICsgdGhpcy5yYW5kb21DaGFubmVsKGJyaWdodG5lc3MpO1xyXG4gIH1cclxuICByYW5kb21DaGFubmVsKGJyaWdodG5lc3M6IG51bWJlcil7XHJcbiAgICBjb25zdCByID0gMjU1LWJyaWdodG5lc3M7XHJcbiAgICBjb25zdCBuID0gMHwoKE1hdGgucmFuZG9tKCkgKiByKSArIGJyaWdodG5lc3MpO1xyXG4gICAgY29uc3QgcyA9IG4udG9TdHJpbmcoMTYpO1xyXG4gICAgcmV0dXJuIChzLmxlbmd0aD09MSkgPyAnMCcrcyA6IHM7XHJcbiAgfVxyXG5cclxuICBvblN0YXJ0RHJhZ0V2ZW50KGV2ZW50UGFydDogU2NoZWR1bGVyRXZlbnRQYXJ0LCBldjogTW91c2VFdmVudCkge1xyXG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuaG92ZXJlZFRpbWVTbG90JC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoaG92ZXJlZFRpbWVTbG90KSA9PiB7XHJcbiAgICAgIGlmIChldmVudFBhcnQuZXZlbnQpIHtcclxuICAgICAgICB0aGlzLmRyYWdTdGFydFRpbWVzbG90ID0gaG92ZXJlZFRpbWVTbG90O1xyXG4gICAgICAgIHRoaXMub3BlcmF0aW9uID0ge1xyXG4gICAgICAgICAgb3BlcmF0aW9uOiBFRHJhZ09wZXJhdGlvbi5tb3ZlRXZlbnQsXHJcbiAgICAgICAgICBldmVudDogZXZlbnRQYXJ0LmV2ZW50LFxyXG4gICAgICAgICAgbWV0YTogbnVsbCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMucHJldmlld0V2ZW50JC5uZXh0KHsgc3RhcnQ6IGV2ZW50UGFydC5ldmVudC5zdGFydCwgZW5kOiBldmVudFBhcnQuZXZlbnQuZW5kIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uU3RhcnRSZXNpemVFdmVudChldmVudDogU2NoZWR1bGVyRXZlbnQgfCBudWxsLCBwb3NpdGlvbjogJ3RvcCcgfCAnYm90dG9tJykge1xyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIHN3aXRjaCAocG9zaXRpb24pIHtcclxuICAgICAgICBjYXNlICd0b3AnOiB7XHJcbiAgICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IHtcclxuICAgICAgICAgICAgb3BlcmF0aW9uOiBFRHJhZ09wZXJhdGlvbi5yZXNpemVFdmVudCxcclxuICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgICAgICBtZXRhOiB7IHBvc2l0aW9uIH0sXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCQubmV4dCh7IHN0YXJ0OiBldmVudC5zdGFydCwgZW5kOiBldmVudC5lbmQgfSk7XHJcbiAgICAgICAgfSBicmVhaztcclxuICAgICAgICBjYXNlICdib3R0b20nOiB7XHJcbiAgICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IHtcclxuICAgICAgICAgICAgb3BlcmF0aW9uOiBFRHJhZ09wZXJhdGlvbi5yZXNpemVFdmVudCxcclxuICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgICAgICBtZXRhOiB7IHBvc2l0aW9uIH0sXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCQubmV4dCh7IHN0YXJ0OiBldmVudC5zdGFydCwgZW5kOiBldmVudC5lbmQgfSk7XHJcbiAgICAgICAgfSBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIGhvdmVyZWRUaW1lc2xvdCRcclxuICBwcml2YXRlIGdldEhvdmVyZWRUaW1lc2xvdChldjogTW91c2VFdmVudCwgdGltZVNsb3RzOiBTY2hlZHVsZXJTdGFtcFdpdGhTbG90c1tdKSB7XHJcbiAgICBjb25zdCBob3ZlcmVkU2xvdHMgPSB0aGlzLnRpbWVTbG90RWxlbWVudHMuZmlsdGVyKChlbCkgPT4ge1xyXG4gICAgICBjb25zdCByY3QgPSBlbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBpZiAocmN0LmxlZnQgPD0gZXYueCAmJiBldi54IDw9IHJjdC5yaWdodCAmJiByY3QudG9wIDw9IGV2LnkgJiYgZXYueSA8PSByY3QuYm90dG9tKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIWhvdmVyZWRTbG90cyB8fCBob3ZlcmVkU2xvdHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNsb3RFbGVtZW50ID0gaG92ZXJlZFNsb3RzWzBdLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3Qgc3RyUm93ID0gc2xvdEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJvdycpO1xyXG4gICAgaWYgKCFzdHJSb3cpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCByb3cgPSBwYXJzZUludChzdHJSb3cpO1xyXG5cclxuICAgIGNvbnN0IHN0ckNvbHVtbiA9IHNsb3RFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1jb2x1bW4nKTtcclxuICAgIGlmICghc3RyQ29sdW1uKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29sdW1uID0gcGFyc2VJbnQoc3RyQ29sdW1uKTtcclxuXHJcbiAgICBjb25zdCBzbG90ID0gdGltZVNsb3RzW3Jvd10uc2xvdHNbY29sdW1uXTtcclxuICAgIHJldHVybiBzbG90O1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcclxuICBvbk1vdXNlbW92ZShldjogTW91c2VFdmVudCkge1xyXG4gICAgdGhpcy50aW1lU2xvdHMkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCh0aW1lU2xvdHMpID0+IHtcclxuICAgICAgY29uc3QgaG92ZXJlZCA9IHRoaXMuZ2V0SG92ZXJlZFRpbWVzbG90KGV2LCB0aW1lU2xvdHMpO1xyXG4gICAgICB0aGlzLmhvdmVyZWRUaW1lU2xvdCQubmV4dChob3ZlcmVkKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm9wZXJhdGlvbikge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5vcGVyYXRpb24ub3BlcmF0aW9uKSB7XHJcbiAgICAgICAgICBjYXNlIEVEcmFnT3BlcmF0aW9uLmNyZWF0ZUV2ZW50OiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbi5ldmVudCAmJiB0aGlzLmRyYWdTdGFydFRpbWVzbG90ICYmIGhvdmVyZWQgJiYgKHRoaXMub3BlcmF0aW9uLmV2ZW50LmVuZC5nZXRUaW1lKCkgIT0gaG92ZXJlZC5lbmQuZ2V0VGltZSgpKSkge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmRyYWdTdGFydFRpbWVzbG90LnN0YXJ0LmdldFRpbWUoKSA9PT0gaG92ZXJlZC5zdGFydC5nZXRUaW1lKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIDEgc2xvdFxyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5zdGFydC5nZXRUaW1lKCkgPCBob3ZlcmVkLnN0YXJ0LmdldFRpbWUoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gRHJhZyBkb3duXHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCRcclxuICAgICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKChldikgPT4gISFldiAmJiAhIXRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QpKVxyXG4gICAgICAgICAgICAgICAgICAucGlwZShtYXAoKGV2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ICYmIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGV2LnN0YXJ0ID0gdGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5zdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgIGV2LmVuZCA9IGhvdmVyZWQuZW5kO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXY7XHJcbiAgICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldikgPT4gdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQoZXYpKTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpID4gaG92ZXJlZC5zdGFydC5nZXRUaW1lKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIERyYWcgdXBcclxuICAgICAgICAgICAgICAgIHRoaXMucHJldmlld0V2ZW50JFxyXG4gICAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKGV2KSA9PiAhIWV2ICYmICEhdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCkpXHJcbiAgICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXYgJiYgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZXYuc3RhcnQgPSBob3ZlcmVkLnN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgZXYuZW5kID0gdGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5lbmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldjtcclxuICAgICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2KSA9PiB0aGlzLnByZXZpZXdFdmVudCQubmV4dChldikpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBicmVhaztcclxuICAgICAgICAgIGNhc2UgRURyYWdPcGVyYXRpb24ubW92ZUV2ZW50OiB7XHJcbiAgICAgICAgICAgIGlmIChob3ZlcmVkICYmIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QpIHtcclxuICAgICAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCRcclxuICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoZXYpID0+ICEhZXYgJiYgISF0aGlzLmRyYWdTdGFydFRpbWVzbG90KSlcclxuICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGV2ICYmIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSAgPFByZXZpZXdFdmVudD57XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydDogbmV3IERhdGUoZXYuc3RhcnQuZ2V0VGltZSgpICsgaG92ZXJlZC5zdGFydC5nZXRUaW1lKCkgLSB0aGlzLmRyYWdTdGFydFRpbWVzbG90LnN0YXJ0LmdldFRpbWUoKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG5ldyBEYXRlKGV2LmVuZC5nZXRUaW1lKCkgKyBob3ZlcmVkLnN0YXJ0LmdldFRpbWUoKSAtIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpKVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCA9IGhvdmVyZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2O1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGV2ID0+IHRoaXMucHJldmlld0V2ZW50JC5uZXh0KGV2KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEVEcmFnT3BlcmF0aW9uLnJlc2l6ZUV2ZW50OiB7XHJcbiAgICAgICAgICAgIGlmIChob3ZlcmVkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkXHJcbiAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKGV2KSA9PiAhIWV2KSlcclxuICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGV2ICYmIHRoaXMub3BlcmF0aW9uICYmIHRoaXMub3BlcmF0aW9uLmV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uLm1ldGEucG9zaXRpb24gPT09ICd0b3AnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBldi5zdGFydCA9IGhvdmVyZWQuc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICBldi5lbmQgPSB0aGlzLm9wZXJhdGlvbi5ldmVudC5lbmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wZXJhdGlvbi5tZXRhLnBvc2l0aW9uID09PSAnYm90dG9tJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZXYuc3RhcnQgPSB0aGlzLm9wZXJhdGlvbi5ldmVudC5zdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgIGV2LmVuZCA9IGhvdmVyZWQuZW5kO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gZXY7XHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldikgPT4gdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQoZXYpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNldXAnLCBbJyRldmVudCddKVxyXG4gIG9uTW91c2VVcChldjogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKHRoaXMub3BlcmF0aW9uKSB7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5vcGVyYXRpb24ub3BlcmF0aW9uKSB7XHJcbiAgICAgICAgY2FzZSBFRHJhZ09wZXJhdGlvbi5jcmVhdGVFdmVudDoge1xyXG4gICAgICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5wcmV2aWV3RXZlbnQkXSlcclxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoW3ByZXZpZXdFdmVudF0pID0+IHtcclxuICAgICAgICAgICAgICBpZiAocHJldmlld0V2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTdGFydFRpbWVzbG90ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzJC5uZXh0KFtcclxuICAgICAgICAgICAgICAgICAgLi4udGhpcy5yZXNvdXJjZXMkLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICA8UmVzb3VyY2U+e1xyXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTmV3IHJlc291cmNlIGdyb3VwJyxcclxuICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydDogcHJldmlld0V2ZW50LnN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgZW5kOiBwcmV2aWV3RXZlbnQuZW5kLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHRoaXMucmFuZG9tQ29sb3IoKSxcclxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTmV3IGV2ZW50J1xyXG4gICAgICAgICAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQobnVsbCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgRURyYWdPcGVyYXRpb24ubW92ZUV2ZW50OlxyXG4gICAgICAgIGNhc2UgRURyYWdPcGVyYXRpb24ucmVzaXplRXZlbnQ6IHtcclxuICAgICAgICAgIHRoaXMucHJldmlld0V2ZW50JFxyXG4gICAgICAgICAgICAucGlwZShmaWx0ZXIoKGV2KSA9PiAhIWV2KSlcclxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgocHJldmlld0V2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0aW9uICYmIHRoaXMub3BlcmF0aW9uLmV2ZW50ICYmIHByZXZpZXdFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRpb24uZXZlbnQuc3RhcnQgPSBwcmV2aWV3RXZlbnQuc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wZXJhdGlvbi5ldmVudC5lbmQgPSBwcmV2aWV3RXZlbnQuZW5kO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRpb24gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlcyQubmV4dCh0aGlzLnJlc291cmNlcyQudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQobnVsbCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KHRydWUpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIHctMTAwIG92ZXJmbG93LXktYXV0byBtYi0wIHdlZWstc2NoZWR1bGVcIiBbc3R5bGUubWF4LWhlaWdodC5weF09XCJudWxsXCJcclxuICAgICpuZ0lmPVwiKG1vZGUkIHwgYXN5bmMpID09PSBtb2Rlcy53ZWVrXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItaGVhZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBkLWZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjYWxlbmRhci1sZWZ0IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGZsZXgtc3RhcnRcIiAoY2xpY2spPVwib25QcmV2aW91c1dlZWtPck1vbnRoKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnMtaWNvbiBbaWNvbl09XCInY2hldnJvbi1sZWZ0J1wiIGNsYXNzPVwicHgtMFwiPjwvYnMtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBmbGV4LWVuZFwiIChjbGljayk9XCJvbk5leHRXZWVrT3JNb250aCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJzLWljb24gW2ljb25dPVwiJ2NoZXZyb24tcmlnaHQnXCIgY2xhc3M9XCJweC0wXCI+PC9icy1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgY2FsZW5kYXItaGVhZC1jZWxsXCIgKm5nRm9yPVwibGV0IGRheSBvZiAoc2hvd25EYXlzJCB8IGFzeW5jKVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWJsb2NrIGNvbC1mb3JtLWxhYmVsIHRleHQtY2VudGVyIHRleHQtbm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZGF5IHwgZGF0ZTogJ2RkLU1NJyB9fTwvc3Bhbj48c3BhbiBjbGFzcz1cImQtbm9uZSBkLWxnLWlubGluZS1ibG9ja1wiPi17eyBkYXkgfCBkYXRlOiAneXl5eScgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItYm9keVwiIFtzdHlsZS5oZWlnaHQucHhdPVwibWF4SW5uZXJIZWlnaHRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIiAqbmdJZj1cIih0aW1lU2xvdHMkIHwgYXN5bmMpIGFzIHJvd1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHdlZWtPcHRpb25zJCB8IGFzeW5jKSBhcyB3ZWVrT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBUaW1lc2xvdHMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB0aW1lc2xvdHMgb2Ygcm93OyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cgcC0wIHRpbWVzbG90XCIgW3N0eWxlLmhlaWdodC5weF09XCJ3ZWVrT3B0aW9ucy51bml0SGVpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNlbGwgY2FsZW5kYXItbGVmdCBhbGlnbi10b3AgcHgtMiBweS0wXCI+e3sgdGltZXNsb3RzLnNsb3RzWzBdLnN0YXJ0IHwgZGF0ZTogJ0hIOm1tOnNzJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1jZWxsIGZsZXgtZ3Jvdy0xXCIgKm5nRm9yPVwibGV0IHNsb3Qgb2YgdGltZXNsb3RzLnNsb3RzOyBsZXQgaiA9IGluZGV4XCIgI3Nsb3QgKG1vdXNlZG93bik9XCJvbkNyZWF0ZUV2ZW50KCRldmVudCwgc2xvdClcIiBbYXR0ci5kYXRhLXJvd109XCJpXCIgW2F0dHIuZGF0YS1jb2x1bW5dPVwialwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBFdmVudHMgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHRpbWVTbG90RHVyYXRpb24kIHwgYXN5bmMpIGFzIHRpbWVTbG90RHVyYXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHRpbWVsaW5lZEV2ZW50UGFydHNGb3JUaGlzV2VlayQgfCBhc3luYykgYXMgcGFydERhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXZlbnRQYXJ0IG9mIHBhcnREYXRhLnBhcnRzXCIgY2xhc3M9XCJldmVudCBwLTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRvcC5weF09XCIoZXZlbnRQYXJ0LnBhcnQgfCBic1NlY29uZHNUb2RheU9mZnNldCkgLyB0aW1lU2xvdER1cmF0aW9uICogd2Vla09wdGlvbnMudW5pdEhlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIihldmVudFBhcnQucGFydCB8IGJzU2Vjb25kc1RpbWVzcGFuKSAvIHRpbWVTbG90RHVyYXRpb24gKiB3ZWVrT3B0aW9ucy51bml0SGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5sZWZ0XT1cIidjYWxjKDkwcHggKyAoKDEwMCUgLSA5MHB4KSAvIDcgKiAnICsgKChldmVudFBhcnQucGFydCB8IGRheU9mV2VlaykgLSAxKSArICcpKSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1pbm5lclwiIFtjbGFzcy5ob3Zlcl09XCIoaG92ZXJlZEV2ZW50JCB8IGFzeW5jKSA9PT0gZXZlbnRQYXJ0LnBhcnQuZXZlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInY2FsYygxMDAlIC8gJyArIHBhcnREYXRhLnRvdGFsICsgJyknXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIihldmVudFBhcnQucGFydCB8IGJzU2Vjb25kc1RpbWVzcGFuKSAvIHRpbWVTbG90RHVyYXRpb24gKiB3ZWVrT3B0aW9ucy51bml0SGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luLWxlZnRdPVwiJ2NhbGMoMTAwJSAvICcgKyBwYXJ0RGF0YS50b3RhbCArICcgKiAnICsgZXZlbnRQYXJ0LmluZGV4ICsgJyknXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1yZXNpemUgdG9wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJldmVudFBhcnQucGFydC5zdGFydCA9PT0gZXZlbnRQYXJ0LnBhcnQuZXZlbnQ/LnN0YXJ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblN0YXJ0UmVzaXplRXZlbnQoZXZlbnRQYXJ0LnBhcnQuZXZlbnQsICd0b3AnKVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1ib3JkZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtd3JhcHBlclwiICpuZ0lmPVwiZXZlbnRQYXJ0LnBhcnQuZXZlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uU3RhcnREcmFnRXZlbnQoZXZlbnRQYXJ0LnBhcnQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkhvdmVyRXZlbnQoZXZlbnRQYXJ0LnBhcnQuZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25MZWF2ZUV2ZW50KGV2ZW50UGFydC5wYXJ0LmV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtYmdcIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJldmVudFBhcnQucGFydC5ldmVudC5jb2xvclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtbGFiZWxcIj57eyBldmVudFBhcnQucGFydC5ldmVudC5kZXNjcmlwdGlvbiB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1yZXNpemUgYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJldmVudFBhcnQucGFydC5lbmQgPT09IGV2ZW50UGFydC5wYXJ0LmV2ZW50Py5lbmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uU3RhcnRSZXNpemVFdmVudChldmVudFBhcnQucGFydC5ldmVudCwgJ2JvdHRvbScpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihwcmV2aWV3RXZlbnRQYXJ0c0ZvclRoaXNXZWVrJCB8IGFzeW5jKSBhcyBwcmV2aWV3UGFydERhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXZlbnRQYXJ0IG9mIHByZXZpZXdQYXJ0RGF0YVwiIGNsYXNzPVwiZXZlbnQgcHJldmlldyBwLTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRvcC5weF09XCIoZXZlbnRQYXJ0IHwgYnNTZWNvbmRzVG9kYXlPZmZzZXQpIC8gdGltZVNsb3REdXJhdGlvbiAqIHdlZWtPcHRpb25zLnVuaXRIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCIoZXZlbnRQYXJ0IHwgYnNTZWNvbmRzVGltZXNwYW4pIC8gdGltZVNsb3REdXJhdGlvbiAqIHdlZWtPcHRpb25zLnVuaXRIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnRdPVwiJ2NhbGMoOTBweCArICgoMTAwJSAtIDkwcHgpIC8gNyAqICcgKyAoKGV2ZW50UGFydCB8IGRheU9mV2VlaykgLSAxKSArICcpKSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1pbm5lciB3LTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCIoZXZlbnRQYXJ0IHwgYnNTZWNvbmRzVGltZXNwYW4pIC8gdGltZVNsb3REdXJhdGlvbiAqIHdlZWtPcHRpb25zLnVuaXRIZWlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbi0xMDAgb3ZlcmZsb3cteS1hdXRvIG1iLTAgYmctd2hpdGUgdGltZWxpbmVcIiAqbmdJZj1cIihtb2RlJCB8IGFzeW5jKSA9PT0gbW9kZXMudGltZWxpbmVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkIGQtZmxleFwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gZmxleC1zdGFydFwiIChjbGljayk9XCJvblByZXZpb3VzV2Vla09yTW9udGgoKVwiPlxyXG4gICAgICAgICAgICA8YnMtaWNvbiBbaWNvbl09XCInY2hldnJvbi1sZWZ0J1wiIGNsYXNzPVwicHgtMFwiPjwvYnMtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgaDMgcHktMiBtYi0wIHRleHQtY2VudGVyXCI+e3sgY3VycmVudFdlZWtPck1vbnRoJCB8IGFzeW5jIHwgZGF0ZTogJ01NTU0geXl5eScgfX08L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGZsZXgtc3RhcnRcIiAoY2xpY2spPVwib25OZXh0V2Vla09yTW9udGgoKVwiPlxyXG4gICAgICAgICAgICA8YnMtaWNvbiBbaWNvbl09XCInY2hldnJvbi1yaWdodCdcIiBjbGFzcz1cInB4LTBcIj48L2JzLWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIFxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWJvZHkgdGFibGUtcmVzcG9uc2l2ZSBvdmVyZmxvdy14LWF1dG9cIj5cclxuICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBtYi0wXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIodGltZVNsb3RzJCB8IGFzeW5jKSBhcyB0aW1lU2xvdHNcIj5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGRheSBvZiB0aW1lU2xvdHNcIiBbYXR0ci5jb2xzcGFuXT1cImRheS5zbG90cy5sZW5ndGhcIiBjbGFzcz1cInRleHQtY2VudGVyIHB4LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwb3NpdGlvbi1zdGlja3kgZGF5LWxhYmVsXCI+e3sgZGF5LnN0YW1wIHwgZGF0ZTogJ2QgRUUnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIodGltZWxpbmVPcHRpb25zJCB8IGFzeW5jKSBhcyB0aW1lbGluZU9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGF5IG9mIHRpbWVTbG90c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBzbG90IG9mIGRheS5zbG90c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1ibG9jayBwLTAgdGV4dC1jZW50ZXJcIiBbc3R5bGUud2lkdGgucHhdPVwidGltZWxpbmVPcHRpb25zLnVuaXRXaWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzbG90LnN0YXJ0IHwgZGF0ZTogJ0hIOm1tJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDxicy1yZXNvdXJjZS1ncm91cC1wcmVzZW50ZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIChyZXNvdXJjZXMkIHwgYXN5bmMpXCIgW3Jlc291cmNlR3JvdXBdPVwiZ3JvdXBcIiBbdGltZVNsb3RzXT1cInRpbWVTbG90c1wiPjwvYnMtcmVzb3VyY2UtZ3JvdXAtcHJlc2VudGVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==